/**
* @license
* Video.js 5.10.2-27
* Copyright Brightcove, Inc.
* Available under Apache License Version 2.0
*
*
* Includes vtt.js
* Available under Apache License Version 2.0
*
*/
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.videojs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 2 ? arguments[2] : {};
var props = keys(map);
if (hasSymbols) {
props = props.concat(Object.getOwnPropertySymbols(map));
}
foreach(props, function (name) {
defineProperty(object, name, map[name], predicates[name]);
});
};
defineProperties.supportsDescriptors = !!supportsDescriptors;
module.exports = defineProperties;
},{"foreach":4,"object-keys":49}],3:[function(_dereq_,module,exports){
var isFunction = _dereq_('is-function')
module.exports = forEach
var toString = Object.prototype.toString
var hasOwnProperty = Object.prototype.hasOwnProperty
function forEach(list, iterator, context) {
if (!isFunction(iterator)) {
throw new TypeError('iterator must be a function')
}
if (arguments.length < 3) {
context = this
}
if (toString.call(list) === '[object Array]')
forEachArray(list, iterator, context)
else if (typeof list === 'string')
forEachString(list, iterator, context)
else
forEachObject(list, iterator, context)
}
function forEachArray(array, iterator, context) {
for (var i = 0, len = array.length; i < len; i++) {
if (hasOwnProperty.call(array, i)) {
iterator.call(context, array[i], i, array)
}
}
}
function forEachString(string, iterator, context) {
for (var i = 0, len = string.length; i < len; i++) {
// no such thing as a sparse string.
iterator.call(context, string.charAt(i), i, string)
}
}
function forEachObject(object, iterator, context) {
for (var k in object) {
if (hasOwnProperty.call(object, k)) {
iterator.call(context, object[k], k, object)
}
}
}
},{"is-function":9}],4:[function(_dereq_,module,exports){
var hasOwn = Object.prototype.hasOwnProperty;
var toString = Object.prototype.toString;
module.exports = function forEach (obj, fn, ctx) {
if (toString.call(fn) !== '[object Function]') {
throw new TypeError('iterator must be a function');
}
var l = obj.length;
if (l === +l) {
for (var i = 0; i < l; i++) {
fn.call(ctx, obj[i], i, obj);
}
} else {
for (var k in obj) {
if (hasOwn.call(obj, k)) {
fn.call(ctx, obj[k], k, obj);
}
}
}
};
},{}],5:[function(_dereq_,module,exports){
'use strict';
/* eslint no-invalid-this: 1 */
var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';
var slice = Array.prototype.slice;
var toStr = Object.prototype.toString;
var funcType = '[object Function]';
module.exports = function bind(that) {
var target = this;
if (typeof target !== 'function' || toStr.call(target) !== funcType) {
throw new TypeError(ERROR_MESSAGE + target);
}
var args = slice.call(arguments, 1);
var bound;
var binder = function () {
if (this instanceof bound) {
var result = target.apply(
this,
args.concat(slice.call(arguments))
);
if (Object(result) === result) {
return result;
}
return this;
} else {
return target.apply(
that,
args.concat(slice.call(arguments))
);
}
};
var boundLength = Math.max(0, target.length - args.length);
var boundArgs = [];
for (var i = 0; i < boundLength; i++) {
boundArgs.push('$' + i);
}
bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);
if (target.prototype) {
var Empty = function Empty() {};
Empty.prototype = target.prototype;
bound.prototype = new Empty();
Empty.prototype = null;
}
return bound;
};
},{}],6:[function(_dereq_,module,exports){
'use strict';
var implementation = _dereq_('./implementation');
module.exports = Function.prototype.bind || implementation;
},{"./implementation":5}],7:[function(_dereq_,module,exports){
(function (global){
var topLevel = typeof global !== 'undefined' ? global :
typeof window !== 'undefined' ? window : {}
var minDoc = _dereq_('min-document');
var doccy;
if (typeof document !== 'undefined') {
doccy = document;
} else {
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
if (!doccy) {
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
}
}
module.exports = doccy;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvZG9jdW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsidmFyIHRvcExldmVsID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOlxuICAgIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDoge31cbnZhciBtaW5Eb2MgPSByZXF1aXJlKCdtaW4tZG9jdW1lbnQnKTtcblxudmFyIGRvY2N5O1xuXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIGRvY2N5ID0gZG9jdW1lbnQ7XG59IGVsc2Uge1xuICAgIGRvY2N5ID0gdG9wTGV2ZWxbJ19fR0xPQkFMX0RPQ1VNRU5UX0NBQ0hFQDQnXTtcblxuICAgIGlmICghZG9jY3kpIHtcbiAgICAgICAgZG9jY3kgPSB0b3BMZXZlbFsnX19HTE9CQUxfRE9DVU1FTlRfQ0FDSEVANCddID0gbWluRG9jO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBkb2NjeTtcbiJdfQ==
},{"min-document":1}],8:[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 = {};
}
module.exports = win;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9nbG9iYWwvd2luZG93LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgd2luO1xuXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IHdpbmRvdztcbn0gZWxzZSBpZiAodHlwZW9mIGdsb2JhbCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHdpbiA9IGdsb2JhbDtcbn0gZWxzZSBpZiAodHlwZW9mIHNlbGYgIT09IFwidW5kZWZpbmVkXCIpe1xuICAgIHdpbiA9IHNlbGY7XG59IGVsc2Uge1xuICAgIHdpbiA9IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHdpbjtcbiJdfQ==
},{}],9:[function(_dereq_,module,exports){
module.exports = isFunction
var toString = Object.prototype.toString
function isFunction (fn) {
var string = toString.call(fn)
return string === '[object Function]' ||
(typeof fn === 'function' && string !== '[object RegExp]') ||
(typeof window !== 'undefined' &&
// IE8 and below
(fn === window.setTimeout ||
fn === window.alert ||
fn === window.confirm ||
fn === window.prompt))
};
},{}],10:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative');
/* Native method references for those with the same name as other `lodash` methods. */
var nativeNow = getNative(Date, 'now');
/**
* Gets the number of milliseconds that have elapsed since the Unix epoch
* (1 January 1970 00:00:00 UTC).
*
* @static
* @memberOf _
* @category Date
* @example
*
* _.defer(function(stamp) {
* console.log(_.now() - stamp);
* }, _.now());
* // => logs the number of milliseconds it took for the deferred function to be invoked
*/
var now = nativeNow || function() {
return new Date().getTime();
};
module.exports = now;
},{"../internal/getNative":26}],11:[function(_dereq_,module,exports){
var isObject = _dereq_('../lang/isObject'),
now = _dereq_('../date/now');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Creates a debounced function that delays invoking `func` until after `wait`
* milliseconds have elapsed since the last time the debounced function was
* invoked. The debounced function comes with a `cancel` method to cancel
* delayed invocations. Provide an options object to indicate that `func`
* should be invoked on the leading and/or trailing edge of the `wait` timeout.
* Subsequent calls to the debounced function return the result of the last
* `func` invocation.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
* on the trailing edge of the timeout only if the the debounced function is
* invoked more than once during the `wait` timeout.
*
* See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
* for details over the differences between `_.debounce` and `_.throttle`.
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to debounce.
* @param {number} [wait=0] The number of milliseconds to delay.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=false] Specify invoking on the leading
* edge of the timeout.
* @param {number} [options.maxWait] The maximum time `func` is allowed to be
* delayed before it's invoked.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout.
* @returns {Function} Returns the new debounced function.
* @example
*
* // avoid costly calculations while the window size is in flux
* jQuery(window).on('resize', _.debounce(calculateLayout, 150));
*
* // invoke `sendMail` when the click event is fired, debouncing subsequent calls
* jQuery('#postbox').on('click', _.debounce(sendMail, 300, {
* 'leading': true,
* 'trailing': false
* }));
*
* // ensure `batchLog` is invoked once after 1 second of debounced calls
* var source = new EventSource('/stream');
* jQuery(source).on('message', _.debounce(batchLog, 250, {
* 'maxWait': 1000
* }));
*
* // cancel a debounced call
* var todoChanges = _.debounce(batchLog, 1000);
* Object.observe(models.todo, todoChanges);
*
* Object.observe(models, function(changes) {
* if (_.find(changes, { 'user': 'todo', 'type': 'delete'})) {
* todoChanges.cancel();
* }
* }, ['delete']);
*
* // ...at some point `models.todo` is changed
* models.todo.completed = true;
*
* // ...before 1 second has passed `models.todo` is deleted
* // which cancels the debounced `todoChanges` call
* delete models.todo;
*/
function debounce(func, wait, options) {
var args,
maxTimeoutId,
result,
stamp,
thisArg,
timeoutId,
trailingCall,
lastCalled = 0,
maxWait = false,
trailing = true;
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
wait = wait < 0 ? 0 : (+wait || 0);
if (options === true) {
var leading = true;
trailing = false;
} else if (isObject(options)) {
leading = !!options.leading;
maxWait = 'maxWait' in options && nativeMax(+options.maxWait || 0, wait);
trailing = 'trailing' in options ? !!options.trailing : trailing;
}
function cancel() {
if (timeoutId) {
clearTimeout(timeoutId);
}
if (maxTimeoutId) {
clearTimeout(maxTimeoutId);
}
lastCalled = 0;
maxTimeoutId = timeoutId = trailingCall = undefined;
}
function complete(isCalled, id) {
if (id) {
clearTimeout(id);
}
maxTimeoutId = timeoutId = trailingCall = undefined;
if (isCalled) {
lastCalled = now();
result = func.apply(thisArg, args);
if (!timeoutId && !maxTimeoutId) {
args = thisArg = undefined;
}
}
}
function delayed() {
var remaining = wait - (now() - stamp);
if (remaining <= 0 || remaining > wait) {
complete(trailingCall, maxTimeoutId);
} else {
timeoutId = setTimeout(delayed, remaining);
}
}
function maxDelayed() {
complete(trailing, timeoutId);
}
function debounced() {
args = arguments;
stamp = now();
thisArg = this;
trailingCall = trailing && (timeoutId || !leading);
if (maxWait === false) {
var leadingCall = leading && !timeoutId;
} else {
if (!maxTimeoutId && !leading) {
lastCalled = stamp;
}
var remaining = maxWait - (stamp - lastCalled),
isCalled = remaining <= 0 || remaining > maxWait;
if (isCalled) {
if (maxTimeoutId) {
maxTimeoutId = clearTimeout(maxTimeoutId);
}
lastCalled = stamp;
result = func.apply(thisArg, args);
}
else if (!maxTimeoutId) {
maxTimeoutId = setTimeout(maxDelayed, remaining);
}
}
if (isCalled && timeoutId) {
timeoutId = clearTimeout(timeoutId);
}
else if (!timeoutId && wait !== maxWait) {
timeoutId = setTimeout(delayed, wait);
}
if (leadingCall) {
isCalled = true;
result = func.apply(thisArg, args);
}
if (isCalled && !timeoutId && !maxTimeoutId) {
args = thisArg = undefined;
}
return result;
}
debounced.cancel = cancel;
return debounced;
}
module.exports = debounce;
},{"../date/now":10,"../lang/isObject":39}],12:[function(_dereq_,module,exports){
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/* Native method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* Creates a function that invokes `func` with the `this` binding of the
* created function and arguments from `start` and beyond provided as an array.
*
* **Note:** This method is based on the [rest parameter](https://developer.mozilla.org/Web/JavaScript/Reference/Functions/rest_parameters).
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to apply a rest parameter to.
* @param {number} [start=func.length-1] The start position of the rest parameter.
* @returns {Function} Returns the new function.
* @example
*
* var say = _.restParam(function(what, names) {
* return what + ' ' + _.initial(names).join(', ') +
* (_.size(names) > 1 ? ', & ' : '') + _.last(names);
* });
*
* say('hello', 'fred', 'barney', 'pebbles');
* // => 'hello fred, barney, & pebbles'
*/
function restParam(func, start) {
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
start = nativeMax(start === undefined ? (func.length - 1) : (+start || 0), 0);
return function() {
var args = arguments,
index = -1,
length = nativeMax(args.length - start, 0),
rest = Array(length);
while (++index < length) {
rest[index] = args[start + index];
}
switch (start) {
case 0: return func.call(this, rest);
case 1: return func.call(this, args[0], rest);
case 2: return func.call(this, args[0], args[1], rest);
}
var otherArgs = Array(start + 1);
index = -1;
while (++index < start) {
otherArgs[index] = args[index];
}
otherArgs[start] = rest;
return func.apply(this, otherArgs);
};
}
module.exports = restParam;
},{}],13:[function(_dereq_,module,exports){
var debounce = _dereq_('./debounce'),
isObject = _dereq_('../lang/isObject');
/** Used as the `TypeError` message for "Functions" methods. */
var FUNC_ERROR_TEXT = 'Expected a function';
/**
* Creates a throttled function that only invokes `func` at most once per
* every `wait` milliseconds. The throttled function comes with a `cancel`
* method to cancel delayed invocations. Provide an options object to indicate
* that `func` should be invoked on the leading and/or trailing edge of the
* `wait` timeout. Subsequent calls to the throttled function return the
* result of the last `func` call.
*
* **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
* on the trailing edge of the timeout only if the the throttled function is
* invoked more than once during the `wait` timeout.
*
* See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
* for details over the differences between `_.throttle` and `_.debounce`.
*
* @static
* @memberOf _
* @category Function
* @param {Function} func The function to throttle.
* @param {number} [wait=0] The number of milliseconds to throttle invocations to.
* @param {Object} [options] The options object.
* @param {boolean} [options.leading=true] Specify invoking on the leading
* edge of the timeout.
* @param {boolean} [options.trailing=true] Specify invoking on the trailing
* edge of the timeout.
* @returns {Function} Returns the new throttled function.
* @example
*
* // avoid excessively updating the position while scrolling
* jQuery(window).on('scroll', _.throttle(updatePosition, 100));
*
* // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
* jQuery('.interactive').on('click', _.throttle(renewToken, 300000, {
* 'trailing': false
* }));
*
* // cancel a trailing throttled call
* jQuery(window).on('popstate', throttled.cancel);
*/
function throttle(func, wait, options) {
var leading = true,
trailing = true;
if (typeof func != 'function') {
throw new TypeError(FUNC_ERROR_TEXT);
}
if (options === false) {
leading = false;
} else if (isObject(options)) {
leading = 'leading' in options ? !!options.leading : leading;
trailing = 'trailing' in options ? !!options.trailing : trailing;
}
return debounce(func, wait, { 'leading': leading, 'maxWait': +wait, 'trailing': trailing });
}
module.exports = throttle;
},{"../lang/isObject":39,"./debounce":11}],14:[function(_dereq_,module,exports){
/**
* Copies the values of `source` to `array`.
*
* @private
* @param {Array} source The array to copy values from.
* @param {Array} [array=[]] The array to copy values to.
* @returns {Array} Returns `array`.
*/
function arrayCopy(source, array) {
var index = -1,
length = source.length;
array || (array = Array(length));
while (++index < length) {
array[index] = source[index];
}
return array;
}
module.exports = arrayCopy;
},{}],15:[function(_dereq_,module,exports){
/**
* A specialized version of `_.forEach` for arrays without support for callback
* shorthands and `this` binding.
*
* @private
* @param {Array} array The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns `array`.
*/
function arrayEach(array, iteratee) {
var index = -1,
length = array.length;
while (++index < length) {
if (iteratee(array[index], index, array) === false) {
break;
}
}
return array;
}
module.exports = arrayEach;
},{}],16:[function(_dereq_,module,exports){
/**
* Copies properties of `source` to `object`.
*
* @private
* @param {Object} source The object to copy properties from.
* @param {Array} props The property names to copy.
* @param {Object} [object={}] The object to copy properties to.
* @returns {Object} Returns `object`.
*/
function baseCopy(source, props, object) {
object || (object = {});
var index = -1,
length = props.length;
while (++index < length) {
var key = props[index];
object[key] = source[key];
}
return object;
}
module.exports = baseCopy;
},{}],17:[function(_dereq_,module,exports){
var createBaseFor = _dereq_('./createBaseFor');
/**
* The base implementation of `baseForIn` and `baseForOwn` which iterates
* over `object` properties returned by `keysFunc` invoking `iteratee` for
* each property. Iteratee functions may exit iteration early by explicitly
* returning `false`.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @param {Function} keysFunc The function to get the keys of `object`.
* @returns {Object} Returns `object`.
*/
var baseFor = createBaseFor();
module.exports = baseFor;
},{"./createBaseFor":24}],18:[function(_dereq_,module,exports){
var baseFor = _dereq_('./baseFor'),
keysIn = _dereq_('../object/keysIn');
/**
* The base implementation of `_.forIn` without support for callback
* shorthands and `this` binding.
*
* @private
* @param {Object} object The object to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Object} Returns `object`.
*/
function baseForIn(object, iteratee) {
return baseFor(object, iteratee, keysIn);
}
module.exports = baseForIn;
},{"../object/keysIn":45,"./baseFor":17}],19:[function(_dereq_,module,exports){
var arrayEach = _dereq_('./arrayEach'),
baseMergeDeep = _dereq_('./baseMergeDeep'),
isArray = _dereq_('../lang/isArray'),
isArrayLike = _dereq_('./isArrayLike'),
isObject = _dereq_('../lang/isObject'),
isObjectLike = _dereq_('./isObjectLike'),
isTypedArray = _dereq_('../lang/isTypedArray'),
keys = _dereq_('../object/keys');
/**
* The base implementation of `_.merge` without support for argument juggling,
* multiple sources, and `this` binding `customizer` functions.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {Function} [customizer] The function to customize merged values.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
* @returns {Object} Returns `object`.
*/
function baseMerge(object, source, customizer, stackA, stackB) {
if (!isObject(object)) {
return object;
}
var isSrcArr = isArrayLike(source) && (isArray(source) || isTypedArray(source)),
props = isSrcArr ? undefined : keys(source);
arrayEach(props || source, function(srcValue, key) {
if (props) {
key = srcValue;
srcValue = source[key];
}
if (isObjectLike(srcValue)) {
stackA || (stackA = []);
stackB || (stackB = []);
baseMergeDeep(object, source, key, baseMerge, customizer, stackA, stackB);
}
else {
var value = object[key],
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
isCommon = result === undefined;
if (isCommon) {
result = srcValue;
}
if ((result !== undefined || (isSrcArr && !(key in object))) &&
(isCommon || (result === result ? (result !== value) : (value === value)))) {
object[key] = result;
}
}
});
return object;
}
module.exports = baseMerge;
},{"../lang/isArray":36,"../lang/isObject":39,"../lang/isTypedArray":42,"../object/keys":44,"./arrayEach":15,"./baseMergeDeep":20,"./isArrayLike":27,"./isObjectLike":32}],20:[function(_dereq_,module,exports){
var arrayCopy = _dereq_('./arrayCopy'),
isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isArrayLike = _dereq_('./isArrayLike'),
isPlainObject = _dereq_('../lang/isPlainObject'),
isTypedArray = _dereq_('../lang/isTypedArray'),
toPlainObject = _dereq_('../lang/toPlainObject');
/**
* A specialized version of `baseMerge` for arrays and objects which performs
* deep merges and tracks traversed objects enabling objects with circular
* references to be merged.
*
* @private
* @param {Object} object The destination object.
* @param {Object} source The source object.
* @param {string} key The key of the value to merge.
* @param {Function} mergeFunc The function to merge values.
* @param {Function} [customizer] The function to customize merged values.
* @param {Array} [stackA=[]] Tracks traversed source objects.
* @param {Array} [stackB=[]] Associates values with source counterparts.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseMergeDeep(object, source, key, mergeFunc, customizer, stackA, stackB) {
var length = stackA.length,
srcValue = source[key];
while (length--) {
if (stackA[length] == srcValue) {
object[key] = stackB[length];
return;
}
}
var value = object[key],
result = customizer ? customizer(value, srcValue, key, object, source) : undefined,
isCommon = result === undefined;
if (isCommon) {
result = srcValue;
if (isArrayLike(srcValue) && (isArray(srcValue) || isTypedArray(srcValue))) {
result = isArray(value)
? value
: (isArrayLike(value) ? arrayCopy(value) : []);
}
else if (isPlainObject(srcValue) || isArguments(srcValue)) {
result = isArguments(value)
? toPlainObject(value)
: (isPlainObject(value) ? value : {});
}
else {
isCommon = false;
}
}
// Add the source value to the stack of traversed objects and associate
// it with its merged value.
stackA.push(srcValue);
stackB.push(result);
if (isCommon) {
// Recursively merge objects and arrays (susceptible to call stack limits).
object[key] = mergeFunc(result, srcValue, customizer, stackA, stackB);
} else if (result === result ? (result !== value) : (value === value)) {
object[key] = result;
}
}
module.exports = baseMergeDeep;
},{"../lang/isArguments":35,"../lang/isArray":36,"../lang/isPlainObject":40,"../lang/isTypedArray":42,"../lang/toPlainObject":43,"./arrayCopy":14,"./isArrayLike":27}],21:[function(_dereq_,module,exports){
var toObject = _dereq_('./toObject');
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : toObject(object)[key];
};
}
module.exports = baseProperty;
},{"./toObject":34}],22:[function(_dereq_,module,exports){
var identity = _dereq_('../utility/identity');
/**
* A specialized version of `baseCallback` which only supports `this` binding
* and specifying the number of arguments to provide to `func`.
*
* @private
* @param {Function} func The function to bind.
* @param {*} thisArg The `this` binding of `func`.
* @param {number} [argCount] The number of arguments to provide to `func`.
* @returns {Function} Returns the callback.
*/
function bindCallback(func, thisArg, argCount) {
if (typeof func != 'function') {
return identity;
}
if (thisArg === undefined) {
return func;
}
switch (argCount) {
case 1: return function(value) {
return func.call(thisArg, value);
};
case 3: return function(value, index, collection) {
return func.call(thisArg, value, index, collection);
};
case 4: return function(accumulator, value, index, collection) {
return func.call(thisArg, accumulator, value, index, collection);
};
case 5: return function(value, other, key, object, source) {
return func.call(thisArg, value, other, key, object, source);
};
}
return function() {
return func.apply(thisArg, arguments);
};
}
module.exports = bindCallback;
},{"../utility/identity":48}],23:[function(_dereq_,module,exports){
var bindCallback = _dereq_('./bindCallback'),
isIterateeCall = _dereq_('./isIterateeCall'),
restParam = _dereq_('../function/restParam');
/**
* Creates a `_.assign`, `_.defaults`, or `_.merge` function.
*
* @private
* @param {Function} assigner The function to assign values.
* @returns {Function} Returns the new assigner function.
*/
function createAssigner(assigner) {
return restParam(function(object, sources) {
var index = -1,
length = object == null ? 0 : sources.length,
customizer = length > 2 ? sources[length - 2] : undefined,
guard = length > 2 ? sources[2] : undefined,
thisArg = length > 1 ? sources[length - 1] : undefined;
if (typeof customizer == 'function') {
customizer = bindCallback(customizer, thisArg, 5);
length -= 2;
} else {
customizer = typeof thisArg == 'function' ? thisArg : undefined;
length -= (customizer ? 1 : 0);
}
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
customizer = length < 3 ? undefined : customizer;
length = 1;
}
while (++index < length) {
var source = sources[index];
if (source) {
assigner(object, source, customizer);
}
}
return object;
});
}
module.exports = createAssigner;
},{"../function/restParam":12,"./bindCallback":22,"./isIterateeCall":30}],24:[function(_dereq_,module,exports){
var toObject = _dereq_('./toObject');
/**
* Creates a base function for `_.forIn` or `_.forInRight`.
*
* @private
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {Function} Returns the new base function.
*/
function createBaseFor(fromRight) {
return function(object, iteratee, keysFunc) {
var iterable = toObject(object),
props = keysFunc(object),
length = props.length,
index = fromRight ? length : -1;
while ((fromRight ? index-- : ++index < length)) {
var key = props[index];
if (iteratee(iterable[key], key, iterable) === false) {
break;
}
}
return object;
};
}
module.exports = createBaseFor;
},{"./toObject":34}],25:[function(_dereq_,module,exports){
var baseProperty = _dereq_('./baseProperty');
/**
* Gets the "length" property value of `object`.
*
* **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
* that affects Safari on at least iOS 8.1-8.3 ARM64.
*
* @private
* @param {Object} object The object to query.
* @returns {*} Returns the "length" value.
*/
var getLength = baseProperty('length');
module.exports = getLength;
},{"./baseProperty":21}],26:[function(_dereq_,module,exports){
var isNative = _dereq_('../lang/isNative');
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = object == null ? undefined : object[key];
return isNative(value) ? value : undefined;
}
module.exports = getNative;
},{"../lang/isNative":38}],27:[function(_dereq_,module,exports){
var getLength = _dereq_('./getLength'),
isLength = _dereq_('./isLength');
/**
* Checks if `value` is array-like.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
*/
function isArrayLike(value) {
return value != null && isLength(getLength(value));
}
module.exports = isArrayLike;
},{"./getLength":25,"./isLength":31}],28:[function(_dereq_,module,exports){
/**
* Checks if `value` is a host object in IE < 9.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a host object, else `false`.
*/
var isHostObject = (function() {
try {
Object({ 'toString': 0 } + '');
} catch(e) {
return function() { return false; };
}
return function(value) {
// IE < 9 presents many host objects as `Object` objects that can coerce
// to strings despite having improperly defined `toString` methods.
return typeof value.toString != 'function' && typeof (value + '') == 'string';
};
}());
module.exports = isHostObject;
},{}],29:[function(_dereq_,module,exports){
/** Used to detect unsigned integer values. */
var reIsUint = /^\d+$/;
/**
* Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array-like value.
*/
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
length = length == null ? MAX_SAFE_INTEGER : length;
return value > -1 && value % 1 == 0 && value < length;
}
module.exports = isIndex;
},{}],30:[function(_dereq_,module,exports){
var isArrayLike = _dereq_('./isArrayLike'),
isIndex = _dereq_('./isIndex'),
isObject = _dereq_('../lang/isObject');
/**
* Checks if the provided arguments are from an iteratee call.
*
* @private
* @param {*} value The potential iteratee value argument.
* @param {*} index The potential iteratee index or key argument.
* @param {*} object The potential iteratee object argument.
* @returns {boolean} Returns `true` if the arguments are from an iteratee call, else `false`.
*/
function isIterateeCall(value, index, object) {
if (!isObject(object)) {
return false;
}
var type = typeof index;
if (type == 'number'
? (isArrayLike(object) && isIndex(index, object.length))
: (type == 'string' && index in object)) {
var other = object[index];
return value === value ? (value === other) : (other !== other);
}
return false;
}
module.exports = isIterateeCall;
},{"../lang/isObject":39,"./isArrayLike":27,"./isIndex":29}],31:[function(_dereq_,module,exports){
/**
* Used as the [maximum length](http://ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer)
* of an array-like value.
*/
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This function is based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
*/
function isLength(value) {
return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;
},{}],32:[function(_dereq_,module,exports){
/**
* Checks if `value` is object-like.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
*/
function isObjectLike(value) {
return !!value && typeof value == 'object';
}
module.exports = isObjectLike;
},{}],33:[function(_dereq_,module,exports){
var isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isIndex = _dereq_('./isIndex'),
isLength = _dereq_('./isLength'),
isString = _dereq_('../lang/isString'),
keysIn = _dereq_('../object/keysIn');
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A fallback implementation of `Object.keys` which creates an array of the
* own enumerable property names of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function shimKeys(object) {
var props = keysIn(object),
propsLength = props.length,
length = propsLength && object.length;
var allowIndexes = !!length && isLength(length) &&
(isArray(object) || isArguments(object) || isString(object));
var index = -1,
result = [];
while (++index < propsLength) {
var key = props[index];
if ((allowIndexes && isIndex(key, length)) || hasOwnProperty.call(object, key)) {
result.push(key);
}
}
return result;
}
module.exports = shimKeys;
},{"../lang/isArguments":35,"../lang/isArray":36,"../lang/isString":41,"../object/keysIn":45,"./isIndex":29,"./isLength":31}],34:[function(_dereq_,module,exports){
var isObject = _dereq_('../lang/isObject'),
isString = _dereq_('../lang/isString'),
support = _dereq_('../support');
/**
* Converts `value` to an object if it's not one.
*
* @private
* @param {*} value The value to process.
* @returns {Object} Returns the object.
*/
function toObject(value) {
if (support.unindexedChars && isString(value)) {
var index = -1,
length = value.length,
result = Object(value);
while (++index < length) {
result[index] = value.charAt(index);
}
return result;
}
return isObject(value) ? value : Object(value);
}
module.exports = toObject;
},{"../lang/isObject":39,"../lang/isString":41,"../support":47}],35:[function(_dereq_,module,exports){
var isArrayLike = _dereq_('../internal/isArrayLike'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Native method references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* Checks if `value` is classified as an `arguments` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
function isArguments(value) {
return isObjectLike(value) && isArrayLike(value) &&
hasOwnProperty.call(value, 'callee') && !propertyIsEnumerable.call(value, 'callee');
}
module.exports = isArguments;
},{"../internal/isArrayLike":27,"../internal/isObjectLike":32}],36:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative'),
isLength = _dereq_('../internal/isLength'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var arrayTag = '[object Array]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/* Native method references for those with the same name as other `lodash` methods. */
var nativeIsArray = getNative(Array, 'isArray');
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(function() { return arguments; }());
* // => false
*/
var isArray = nativeIsArray || function(value) {
return isObjectLike(value) && isLength(value.length) && objToString.call(value) == arrayTag;
};
module.exports = isArray;
},{"../internal/getNative":26,"../internal/isLength":31,"../internal/isObjectLike":32}],37:[function(_dereq_,module,exports){
var isObject = _dereq_('./isObject');
/** `Object#toString` result references. */
var funcTag = '[object Function]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
// The use of `Object#toString` avoids issues with the `typeof` operator
// in older versions of Chrome and Safari which return 'function' for regexes
// and Safari 8 which returns 'object' for typed array constructors.
return isObject(value) && objToString.call(value) == funcTag;
}
module.exports = isFunction;
},{"./isObject":39}],38:[function(_dereq_,module,exports){
var isFunction = _dereq_('./isFunction'),
isHostObject = _dereq_('../internal/isHostObject'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** Used to detect host constructors (Safari > 5). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var fnToString = Function.prototype.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
fnToString.call(hasOwnProperty).replace(/[\\^$.*+?()[\]{}|]/g, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* Checks if `value` is a native function.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function, else `false`.
* @example
*
* _.isNative(Array.prototype.push);
* // => true
*
* _.isNative(_);
* // => false
*/
function isNative(value) {
if (value == null) {
return false;
}
if (isFunction(value)) {
return reIsNative.test(fnToString.call(value));
}
return isObjectLike(value) && (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
}
module.exports = isNative;
},{"../internal/isHostObject":28,"../internal/isObjectLike":32,"./isFunction":37}],39:[function(_dereq_,module,exports){
/**
* Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
* (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(1);
* // => false
*/
function isObject(value) {
// Avoid a V8 JIT bug in Chrome 19-20.
// See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
var type = typeof value;
return !!value && (type == 'object' || type == 'function');
}
module.exports = isObject;
},{}],40:[function(_dereq_,module,exports){
var baseForIn = _dereq_('../internal/baseForIn'),
isArguments = _dereq_('./isArguments'),
isHostObject = _dereq_('../internal/isHostObject'),
isObjectLike = _dereq_('../internal/isObjectLike'),
support = _dereq_('../support');
/** `Object#toString` result references. */
var objectTag = '[object Object]';
/** Used for native method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is a plain object, that is, an object created by the
* `Object` constructor or one with a `[[Prototype]]` of `null`.
*
* **Note:** This method assumes objects created by the `Object` constructor
* have no inherited enumerable properties.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
* @example
*
* function Foo() {
* this.a = 1;
* }
*
* _.isPlainObject(new Foo);
* // => false
*
* _.isPlainObject([1, 2, 3]);
* // => false
*
* _.isPlainObject({ 'x': 0, 'y': 0 });
* // => true
*
* _.isPlainObject(Object.create(null));
* // => true
*/
function isPlainObject(value) {
var Ctor;
// Exit early for non `Object` objects.
if (!(isObjectLike(value) && objToString.call(value) == objectTag && !isHostObject(value) && !isArguments(value)) ||
(!hasOwnProperty.call(value, 'constructor') && (Ctor = value.constructor, typeof Ctor == 'function' && !(Ctor instanceof Ctor)))) {
return false;
}
// IE < 9 iterates inherited properties before own properties. If the first
// iterated property is an object's own property then there are no inherited
// enumerable properties.
var result;
if (support.ownLast) {
baseForIn(value, function(subValue, key, object) {
result = hasOwnProperty.call(object, key);
return false;
});
return result !== false;
}
// In most environments an object's own properties are iterated before
// its inherited properties. If the last iterated property is an object's
// own property then there are no inherited enumerable properties.
baseForIn(value, function(subValue, key) {
result = key;
});
return result === undefined || hasOwnProperty.call(value, result);
}
module.exports = isPlainObject;
},{"../internal/baseForIn":18,"../internal/isHostObject":28,"../internal/isObjectLike":32,"../support":47,"./isArguments":35}],41:[function(_dereq_,module,exports){
var isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var stringTag = '[object String]';
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a `String` primitive or object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isString('abc');
* // => true
*
* _.isString(1);
* // => false
*/
function isString(value) {
return typeof value == 'string' || (isObjectLike(value) && objToString.call(value) == stringTag);
}
module.exports = isString;
},{"../internal/isObjectLike":32}],42:[function(_dereq_,module,exports){
var isLength = _dereq_('../internal/isLength'),
isObjectLike = _dereq_('../internal/isObjectLike');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dateTag] = typedArrayTags[errorTag] =
typedArrayTags[funcTag] = typedArrayTags[mapTag] =
typedArrayTags[numberTag] = typedArrayTags[objectTag] =
typedArrayTags[regexpTag] = typedArrayTags[setTag] =
typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
/** Used for native method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
function isTypedArray(value) {
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[objToString.call(value)];
}
module.exports = isTypedArray;
},{"../internal/isLength":31,"../internal/isObjectLike":32}],43:[function(_dereq_,module,exports){
var baseCopy = _dereq_('../internal/baseCopy'),
keysIn = _dereq_('../object/keysIn');
/**
* Converts `value` to a plain object flattening inherited enumerable
* properties of `value` to own properties of the plain object.
*
* @static
* @memberOf _
* @category Lang
* @param {*} value The value to convert.
* @returns {Object} Returns the converted plain object.
* @example
*
* function Foo() {
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.assign({ 'a': 1 }, new Foo);
* // => { 'a': 1, 'b': 2 }
*
* _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
* // => { 'a': 1, 'b': 2, 'c': 3 }
*/
function toPlainObject(value) {
return baseCopy(value, keysIn(value));
}
module.exports = toPlainObject;
},{"../internal/baseCopy":16,"../object/keysIn":45}],44:[function(_dereq_,module,exports){
var getNative = _dereq_('../internal/getNative'),
isArrayLike = _dereq_('../internal/isArrayLike'),
isObject = _dereq_('../lang/isObject'),
shimKeys = _dereq_('../internal/shimKeys'),
support = _dereq_('../support');
/* Native method references for those with the same name as other `lodash` methods. */
var nativeKeys = getNative(Object, 'keys');
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
* for more details.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
var keys = !nativeKeys ? shimKeys : function(object) {
var Ctor = object == null ? undefined : object.constructor;
if ((typeof Ctor == 'function' && Ctor.prototype === object) ||
(typeof object == 'function' ? support.enumPrototypes : isArrayLike(object))) {
return shimKeys(object);
}
return isObject(object) ? nativeKeys(object) : [];
};
module.exports = keys;
},{"../internal/getNative":26,"../internal/isArrayLike":27,"../internal/shimKeys":33,"../lang/isObject":39,"../support":47}],45:[function(_dereq_,module,exports){
var arrayEach = _dereq_('../internal/arrayEach'),
isArguments = _dereq_('../lang/isArguments'),
isArray = _dereq_('../lang/isArray'),
isFunction = _dereq_('../lang/isFunction'),
isIndex = _dereq_('../internal/isIndex'),
isLength = _dereq_('../internal/isLength'),
isObject = _dereq_('../lang/isObject'),
isString = _dereq_('../lang/isString'),
support = _dereq_('../support');
/** `Object#toString` result references. */
var arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
stringTag = '[object String]';
/** Used to fix the JScript `[[DontEnum]]` bug. */
var shadowProps = [
'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',
'toLocaleString', 'toString', 'valueOf'
];
/** Used for native method references. */
var errorProto = Error.prototype,
objectProto = Object.prototype,
stringProto = String.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
* of values.
*/
var objToString = objectProto.toString;
/** Used to avoid iterating over non-enumerable properties in IE < 9. */
var nonEnumProps = {};
nonEnumProps[arrayTag] = nonEnumProps[dateTag] = nonEnumProps[numberTag] = { 'constructor': true, 'toLocaleString': true, 'toString': true, 'valueOf': true };
nonEnumProps[boolTag] = nonEnumProps[stringTag] = { 'constructor': true, 'toString': true, 'valueOf': true };
nonEnumProps[errorTag] = nonEnumProps[funcTag] = nonEnumProps[regexpTag] = { 'constructor': true, 'toString': true };
nonEnumProps[objectTag] = { 'constructor': true };
arrayEach(shadowProps, function(key) {
for (var tag in nonEnumProps) {
if (hasOwnProperty.call(nonEnumProps, tag)) {
var props = nonEnumProps[tag];
props[key] = hasOwnProperty.call(props, key);
}
}
});
/**
* Creates an array of the own and inherited enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects.
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keysIn(new Foo);
* // => ['a', 'b', 'c'] (iteration order is not guaranteed)
*/
function keysIn(object) {
if (object == null) {
return [];
}
if (!isObject(object)) {
object = Object(object);
}
var length = object.length;
length = (length && isLength(length) &&
(isArray(object) || isArguments(object) || isString(object)) && length) || 0;
var Ctor = object.constructor,
index = -1,
proto = (isFunction(Ctor) && Ctor.prototype) || objectProto,
isProto = proto === object,
result = Array(length),
skipIndexes = length > 0,
skipErrorProps = support.enumErrorProps && (object === errorProto || object instanceof Error),
skipProto = support.enumPrototypes && isFunction(object);
while (++index < length) {
result[index] = (index + '');
}
// lodash skips the `constructor` property when it infers it's iterating
// over a `prototype` object because IE < 9 can't set the `[[Enumerable]]`
// attribute of an existing property and the `constructor` property of a
// prototype defaults to non-enumerable.
for (var key in object) {
if (!(skipProto && key == 'prototype') &&
!(skipErrorProps && (key == 'message' || key == 'name')) &&
!(skipIndexes && isIndex(key, length)) &&
!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
result.push(key);
}
}
if (support.nonEnumShadows && object !== objectProto) {
var tag = object === stringProto ? stringTag : (object === errorProto ? errorTag : objToString.call(object)),
nonEnums = nonEnumProps[tag] || nonEnumProps[objectTag];
if (tag == objectTag) {
proto = objectProto;
}
length = shadowProps.length;
while (length--) {
key = shadowProps[length];
var nonEnum = nonEnums[key];
if (!(isProto && nonEnum) &&
(nonEnum ? hasOwnProperty.call(object, key) : object[key] !== proto[key])) {
result.push(key);
}
}
}
return result;
}
module.exports = keysIn;
},{"../internal/arrayEach":15,"../internal/isIndex":29,"../internal/isLength":31,"../lang/isArguments":35,"../lang/isArray":36,"../lang/isFunction":37,"../lang/isObject":39,"../lang/isString":41,"../support":47}],46:[function(_dereq_,module,exports){
var baseMerge = _dereq_('../internal/baseMerge'),
createAssigner = _dereq_('../internal/createAssigner');
/**
* Recursively merges own enumerable properties of the source object(s), that
* don't resolve to `undefined` into the destination object. Subsequent sources
* overwrite property assignments of previous sources. If `customizer` is
* provided it's invoked to produce the merged values of the destination and
* source properties. If `customizer` returns `undefined` merging is handled
* by the method instead. The `customizer` is bound to `thisArg` and invoked
* with five arguments: (objectValue, sourceValue, key, object, source).
*
* @static
* @memberOf _
* @category Object
* @param {Object} object The destination object.
* @param {...Object} [sources] The source objects.
* @param {Function} [customizer] The function to customize assigned values.
* @param {*} [thisArg] The `this` binding of `customizer`.
* @returns {Object} Returns `object`.
* @example
*
* var users = {
* 'data': [{ 'user': 'barney' }, { 'user': 'fred' }]
* };
*
* var ages = {
* 'data': [{ 'age': 36 }, { 'age': 40 }]
* };
*
* _.merge(users, ages);
* // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
*
* // using a customizer callback
* var object = {
* 'fruits': ['apple'],
* 'vegetables': ['beet']
* };
*
* var other = {
* 'fruits': ['banana'],
* 'vegetables': ['carrot']
* };
*
* _.merge(object, other, function(a, b) {
* if (_.isArray(a)) {
* return a.concat(b);
* }
* });
* // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
*/
var merge = createAssigner(baseMerge);
module.exports = merge;
},{"../internal/baseMerge":19,"../internal/createAssigner":23}],47:[function(_dereq_,module,exports){
/** Used for native method references. */
var arrayProto = Array.prototype,
errorProto = Error.prototype,
objectProto = Object.prototype;
/** Native method references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable,
splice = arrayProto.splice;
/**
* An object environment feature flags.
*
* @static
* @memberOf _
* @type Object
*/
var support = {};
(function(x) {
var Ctor = function() { this.x = x; },
object = { '0': x, 'length': x },
props = [];
Ctor.prototype = { 'valueOf': x, 'y': x };
for (var key in new Ctor) { props.push(key); }
/**
* Detect if `name` or `message` properties of `Error.prototype` are
* enumerable by default (IE < 9, Safari < 5.1).
*
* @memberOf _.support
* @type boolean
*/
support.enumErrorProps = propertyIsEnumerable.call(errorProto, 'message') ||
propertyIsEnumerable.call(errorProto, 'name');
/**
* Detect if `prototype` properties are enumerable by default.
*
* Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
* (if the prototype or a property on the prototype has been set)
* incorrectly set the `[[Enumerable]]` value of a function's `prototype`
* property to `true`.
*
* @memberOf _.support
* @type boolean
*/
support.enumPrototypes = propertyIsEnumerable.call(Ctor, 'prototype');
/**
* Detect if properties shadowing those on `Object.prototype` are non-enumerable.
*
* In IE < 9 an object's own properties, shadowing non-enumerable ones,
* are made non-enumerable as well (a.k.a the JScript `[[DontEnum]]` bug).
*
* @memberOf _.support
* @type boolean
*/
support.nonEnumShadows = !/valueOf/.test(props);
/**
* Detect if own properties are iterated after inherited properties (IE < 9).
*
* @memberOf _.support
* @type boolean
*/
support.ownLast = props[0] != 'x';
/**
* Detect if `Array#shift` and `Array#splice` augment array-like objects
* correctly.
*
* Firefox < 10, compatibility modes of IE 8, and IE < 9 have buggy Array
* `shift()` and `splice()` functions that fail to remove the last element,
* `value[0]`, of array-like objects even though the "length" property is
* set to `0`. The `shift()` method is buggy in compatibility modes of IE 8,
* while `splice()` is buggy regardless of mode in IE < 9.
*
* @memberOf _.support
* @type boolean
*/
support.spliceObjects = (splice.call(object, 0, 1), !object[0]);
/**
* Detect lack of support for accessing string characters by index.
*
* IE < 8 can't access characters by index. IE 8 can only access characters
* by index on string literals, not string objects.
*
* @memberOf _.support
* @type boolean
*/
support.unindexedChars = ('x'[0] + Object('x')[0]) != 'xx';
}(1, 0));
module.exports = support;
},{}],48:[function(_dereq_,module,exports){
/**
* This method returns the first argument provided to it.
*
* @static
* @memberOf _
* @category Utility
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'user': 'fred' };
*
* _.identity(object) === object;
* // => true
*/
function identity(value) {
return value;
}
module.exports = identity;
},{}],49:[function(_dereq_,module,exports){
'use strict';
// modified from https://github.com/es-shims/es5-shim
var has = Object.prototype.hasOwnProperty;
var toStr = Object.prototype.toString;
var slice = Array.prototype.slice;
var isArgs = _dereq_('./isArguments');
var isEnumerable = Object.prototype.propertyIsEnumerable;
var hasDontEnumBug = !isEnumerable.call({ toString: null }, 'toString');
var hasProtoEnumBug = isEnumerable.call(function () {}, 'prototype');
var dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
var equalsConstructorPrototype = function (o) {
var ctor = o.constructor;
return ctor && ctor.prototype === o;
};
var excludedKeys = {
$console: true,
$external: true,
$frame: true,
$frameElement: true,
$frames: true,
$innerHeight: true,
$innerWidth: true,
$outerHeight: true,
$outerWidth: true,
$pageXOffset: true,
$pageYOffset: true,
$parent: true,
$scrollLeft: true,
$scrollTop: true,
$scrollX: true,
$scrollY: true,
$self: true,
$webkitIndexedDB: true,
$webkitStorageInfo: true,
$window: true
};
var hasAutomationEqualityBug = (function () {
/* global window */
if (typeof window === 'undefined') { return false; }
for (var k in window) {
try {
if (!excludedKeys['$' + k] && has.call(window, k) && window[k] !== null && typeof window[k] === 'object') {
try {
equalsConstructorPrototype(window[k]);
} catch (e) {
return true;
}
}
} catch (e) {
return true;
}
}
return false;
}());
var equalsConstructorPrototypeIfNotBuggy = function (o) {
/* global window */
if (typeof window === 'undefined' || !hasAutomationEqualityBug) {
return equalsConstructorPrototype(o);
}
try {
return equalsConstructorPrototype(o);
} catch (e) {
return false;
}
};
var keysShim = function keys(object) {
var isObject = object !== null && typeof object === 'object';
var isFunction = toStr.call(object) === '[object Function]';
var isArguments = isArgs(object);
var isString = isObject && toStr.call(object) === '[object String]';
var theKeys = [];
if (!isObject && !isFunction && !isArguments) {
throw new TypeError('Object.keys called on a non-object');
}
var skipProto = hasProtoEnumBug && isFunction;
if (isString && object.length > 0 && !has.call(object, 0)) {
for (var i = 0; i < object.length; ++i) {
theKeys.push(String(i));
}
}
if (isArguments && object.length > 0) {
for (var j = 0; j < object.length; ++j) {
theKeys.push(String(j));
}
} else {
for (var name in object) {
if (!(skipProto && name === 'prototype') && has.call(object, name)) {
theKeys.push(String(name));
}
}
}
if (hasDontEnumBug) {
var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);
for (var k = 0; k < dontEnums.length; ++k) {
if (!(skipConstructor && dontEnums[k] === 'constructor') && has.call(object, dontEnums[k])) {
theKeys.push(dontEnums[k]);
}
}
}
return theKeys;
};
keysShim.shim = function shimObjectKeys() {
if (Object.keys) {
var keysWorksWithArguments = (function () {
// Safari 5.0 bug
return (Object.keys(arguments) || '').length === 2;
}(1, 2));
if (!keysWorksWithArguments) {
var originalKeys = Object.keys;
Object.keys = function keys(object) {
if (isArgs(object)) {
return originalKeys(slice.call(object));
} else {
return originalKeys(object);
}
};
}
} else {
Object.keys = keysShim;
}
return Object.keys || keysShim;
};
module.exports = keysShim;
},{"./isArguments":50}],50:[function(_dereq_,module,exports){
'use strict';
var toStr = Object.prototype.toString;
module.exports = function isArguments(value) {
var str = toStr.call(value);
var isArgs = str === '[object Arguments]';
if (!isArgs) {
isArgs = str !== '[object Array]' &&
value !== null &&
typeof value === 'object' &&
typeof value.length === 'number' &&
value.length >= 0 &&
toStr.call(value.callee) === '[object Function]';
}
return isArgs;
};
},{}],51:[function(_dereq_,module,exports){
'use strict';
var keys = _dereq_('object-keys');
module.exports = function hasSymbols() {
if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }
if (typeof Symbol.iterator === 'symbol') { return true; }
var obj = {};
var sym = Symbol('test');
var symObj = Object(sym);
if (typeof sym === 'string') { return false; }
if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }
if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }
// temp disabled per https://github.com/ljharb/object.assign/issues/17
// if (sym instanceof Symbol) { return false; }
// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4
// if (!(symObj instanceof Symbol)) { return false; }
var symVal = 42;
obj[sym] = symVal;
for (sym in obj) { return false; }
if (keys(obj).length !== 0) { return false; }
if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }
if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }
var syms = Object.getOwnPropertySymbols(obj);
if (syms.length !== 1 || syms[0] !== sym) { return false; }
if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }
if (typeof Object.getOwnPropertyDescriptor === 'function') {
var descriptor = Object.getOwnPropertyDescriptor(obj, sym);
if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }
}
return true;
};
},{"object-keys":49}],52:[function(_dereq_,module,exports){
'use strict';
// modified from https://github.com/es-shims/es6-shim
var keys = _dereq_('object-keys');
var bind = _dereq_('function-bind');
var canBeObject = function (obj) {
return typeof obj !== 'undefined' && obj !== null;
};
var hasSymbols = _dereq_('./hasSymbols')();
var toObject = Object;
var push = bind.call(Function.call, Array.prototype.push);
var propIsEnumerable = bind.call(Function.call, Object.prototype.propertyIsEnumerable);
var originalGetSymbols = hasSymbols ? Object.getOwnPropertySymbols : null;
module.exports = function assign(target, source1) {
if (!canBeObject(target)) { throw new TypeError('target must be an object'); }
var objTarget = toObject(target);
var s, source, i, props, syms, value, key;
for (s = 1; s < arguments.length; ++s) {
source = toObject(arguments[s]);
props = keys(source);
var getSymbols = hasSymbols && (Object.getOwnPropertySymbols || originalGetSymbols);
if (getSymbols) {
syms = getSymbols(source);
for (i = 0; i < syms.length; ++i) {
key = syms[i];
if (propIsEnumerable(source, key)) {
push(props, key);
}
}
}
for (i = 0; i < props.length; ++i) {
key = props[i];
value = source[key];
if (propIsEnumerable(source, key)) {
objTarget[key] = value;
}
}
}
return objTarget;
};
},{"./hasSymbols":51,"function-bind":6,"object-keys":49}],53:[function(_dereq_,module,exports){
'use strict';
var defineProperties = _dereq_('define-properties');
var implementation = _dereq_('./implementation');
var getPolyfill = _dereq_('./polyfill');
var shim = _dereq_('./shim');
var polyfill = getPolyfill();
defineProperties(polyfill, {
implementation: implementation,
getPolyfill: getPolyfill,
shim: shim
});
module.exports = polyfill;
},{"./implementation":52,"./polyfill":54,"./shim":55,"define-properties":2}],54:[function(_dereq_,module,exports){
'use strict';
var implementation = _dereq_('./implementation');
var lacksProperEnumerationOrder = function () {
if (!Object.assign) {
return false;
}
// v8, specifically in node 4.x, has a bug with incorrect property enumeration order
// note: this does not detect the bug unless there's 20 characters
var str = 'abcdefghijklmnopqrst';
var letters = str.split('');
var map = {};
for (var i = 0; i < letters.length; ++i) {
map[letters[i]] = letters[i];
}
var obj = Object.assign({}, map);
var actual = '';
for (var k in obj) {
actual += k;
}
return str !== actual;
};
var assignHasPendingExceptions = function () {
if (!Object.assign || !Object.preventExtensions) {
return false;
}
// Firefox 37 still has "pending exception" logic in its Object.assign implementation,
// which is 72% slower than our shim, and Firefox 40's native implementation.
var thrower = Object.preventExtensions({ 1: 2 });
try {
Object.assign(thrower, 'xy');
} catch (e) {
return thrower[1] === 'y';
}
return false;
};
module.exports = function getPolyfill() {
if (!Object.assign) {
return implementation;
}
if (lacksProperEnumerationOrder()) {
return implementation;
}
if (assignHasPendingExceptions()) {
return implementation;
}
return Object.assign;
};
},{"./implementation":52}],55:[function(_dereq_,module,exports){
'use strict';
var define = _dereq_('define-properties');
var getPolyfill = _dereq_('./polyfill');
module.exports = function shimAssign() {
var polyfill = getPolyfill();
define(
Object,
{ assign: polyfill },
{ assign: function () { return Object.assign !== polyfill; } }
);
return polyfill;
};
},{"./polyfill":54,"define-properties":2}],56:[function(_dereq_,module,exports){
var trim = _dereq_('trim')
, forEach = _dereq_('for-each')
, isArray = function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
}
module.exports = function (headers) {
if (!headers)
return {}
var result = {}
forEach(
trim(headers).split('\n')
, function (row) {
var index = row.indexOf(':')
, key = trim(row.slice(0, index)).toLowerCase()
, value = trim(row.slice(index + 1))
if (typeof(result[key]) === 'undefined') {
result[key] = value
} else if (isArray(result[key])) {
result[key].push(value)
} else {
result[key] = [ result[key], value ]
}
}
)
return result
}
},{"for-each":3,"trim":58}],57:[function(_dereq_,module,exports){
module.exports = SafeParseTuple
function SafeParseTuple(obj, reviver) {
var json
var error = null
try {
json = JSON.parse(obj, reviver)
} catch (err) {
error = err
}
return [error, json]
}
},{}],58:[function(_dereq_,module,exports){
exports = module.exports = trim;
function trim(str){
return str.replace(/^\s*|\s*$/g, '');
}
exports.left = function(str){
return str.replace(/^\s*/, '');
};
exports.right = function(str){
return str.replace(/\s*$/, '');
};
},{}],59:[function(_dereq_,module,exports){
function clean (s) {
return s.replace(/\n\r?\s*/g, '')
}
module.exports = function tsml (sa) {
var s = ''
, i = 0
for (; i < arguments.length; i++)
s += clean(sa[i]) + (arguments[i + 1] || '')
return s
}
},{}],60:[function(_dereq_,module,exports){
"use strict";
var window = _dereq_("global/window")
var isFunction = _dereq_("is-function")
var parseHeaders = _dereq_("parse-headers")
var xtend = _dereq_("xtend")
module.exports = createXHR
createXHR.XMLHttpRequest = window.XMLHttpRequest || noop
createXHR.XDomainRequest = "withCredentials" in (new createXHR.XMLHttpRequest()) ? createXHR.XMLHttpRequest : window.XDomainRequest
forEachArray(["get", "put", "post", "patch", "head", "delete"], function(method) {
createXHR[method === "delete" ? "del" : method] = function(uri, options, callback) {
options = initParams(uri, options, callback)
options.method = method.toUpperCase()
return _createXHR(options)
}
})
function forEachArray(array, iterator) {
for (var i = 0; i < array.length; i++) {
iterator(array[i])
}
}
function isEmpty(obj){
for(var i in obj){
if(obj.hasOwnProperty(i)) return false
}
return true
}
function initParams(uri, options, callback) {
var params = uri
if (isFunction(options)) {
callback = options
if (typeof uri === "string") {
params = {uri:uri}
}
} else {
params = xtend(options, {uri: uri})
}
params.callback = callback
return params
}
function createXHR(uri, options, callback) {
options = initParams(uri, options, callback)
return _createXHR(options)
}
function _createXHR(options) {
if(typeof options.callback === "undefined"){
throw new Error("callback argument missing")
}
var called = false
var callback = function cbOnce(err, response, body){
if(!called){
called = true
options.callback(err, response, body)
}
}
function readystatechange() {
if (xhr.readyState === 4) {
loadFunc()
}
}
function getBody() {
// Chrome with requestType=blob throws errors arround when even testing access to responseText
var body = undefined
if (xhr.response) {
body = xhr.response
} else {
body = xhr.responseText || getXml(xhr)
}
if (isJson) {
try {
body = JSON.parse(body)
} catch (e) {}
}
return body
}
var failureResponse = {
body: undefined,
headers: {},
statusCode: 0,
method: method,
url: uri,
rawRequest: xhr
}
function errorFunc(evt) {
clearTimeout(timeoutTimer)
if(!(evt instanceof Error)){
evt = new Error("" + (evt || "Unknown XMLHttpRequest Error") )
}
evt.statusCode = 0
return callback(evt, failureResponse)
}
// will load the data & process the response in a special response object
function loadFunc() {
if (aborted) return
var status
clearTimeout(timeoutTimer)
if(options.useXDR && xhr.status===undefined) {
//IE8 CORS GET successful response doesn't have a status field, but body is fine
status = 200
} else {
status = (xhr.status === 1223 ? 204 : xhr.status)
}
var response = failureResponse
var err = null
if (status !== 0){
response = {
body: getBody(),
statusCode: status,
method: method,
headers: {},
url: uri,
rawRequest: xhr
}
if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE
response.headers = parseHeaders(xhr.getAllResponseHeaders())
}
} else {
err = new Error("Internal XMLHttpRequest Error")
}
return callback(err, response, response.body)
}
var xhr = options.xhr || null
if (!xhr) {
if (options.cors || options.useXDR) {
xhr = new createXHR.XDomainRequest()
}else{
xhr = new createXHR.XMLHttpRequest()
}
}
var key
var aborted
var uri = xhr.url = options.uri || options.url
var method = xhr.method = options.method || "GET"
var body = options.body || options.data || null
var headers = xhr.headers = options.headers || {}
var sync = !!options.sync
var isJson = false
var timeoutTimer
if ("json" in options) {
isJson = true
headers["accept"] || headers["Accept"] || (headers["Accept"] = "application/json") //Don't override existing accept header declared by user
if (method !== "GET" && method !== "HEAD") {
headers["content-type"] || headers["Content-Type"] || (headers["Content-Type"] = "application/json") //Don't override existing accept header declared by user
body = JSON.stringify(options.json)
}
}
xhr.onreadystatechange = readystatechange
xhr.onload = loadFunc
xhr.onerror = errorFunc
// IE9 must have onprogress be set to a unique function.
xhr.onprogress = function () {
// IE must die
}
xhr.ontimeout = errorFunc
xhr.open(method, uri, !sync, options.username, options.password)
//has to be after open
if(!sync) {
xhr.withCredentials = !!options.withCredentials
}
// Cannot set timeout with sync request
// not setting timeout on the xhr object, because of old webkits etc. not handling that correctly
// both npm's request and jquery 1.x use this kind of timeout, so this is being consistent
if (!sync && options.timeout > 0 ) {
timeoutTimer = setTimeout(function(){
aborted=true//IE9 may still call readystatechange
xhr.abort("timeout")
var e = new Error("XMLHttpRequest timeout")
e.code = "ETIMEDOUT"
errorFunc(e)
}, options.timeout )
}
if (xhr.setRequestHeader) {
for(key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key])
}
}
} else if (options.headers && !isEmpty(options.headers)) {
throw new Error("Headers cannot be set on an XDomainRequest object")
}
if ("responseType" in options) {
xhr.responseType = options.responseType
}
if ("beforeSend" in options &&
typeof options.beforeSend === "function"
) {
options.beforeSend(xhr)
}
xhr.send(body)
return xhr
}
function getXml(xhr) {
if (xhr.responseType === "document") {
return xhr.responseXML
}
var firefoxBugTakenEffect = xhr.status === 204 && xhr.responseXML && xhr.responseXML.documentElement.nodeName === "parsererror"
if (xhr.responseType === "" && !firefoxBugTakenEffect) {
return xhr.responseXML
}
return null
}
function noop() {}
},{"global/window":8,"is-function":9,"parse-headers":56,"xtend":61}],61:[function(_dereq_,module,exports){
module.exports = extend
var hasOwnProperty = Object.prototype.hasOwnProperty;
function extend() {
var target = {}
for (var i = 0; i < arguments.length; i++) {
var source = arguments[i]
for (var key in source) {
if (hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
},{}],62:[function(_dereq_,module,exports){
/**
* @file big-play-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('./button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Initial play button. Shows before the video has played. The hiding of the
* big play button is done via CSS and player states.
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Button
* @class BigPlayButton
*/
var BigPlayButton = (function (_Button) {
_inherits(BigPlayButton, _Button);
function BigPlayButton(player, options) {
_classCallCheck(this, BigPlayButton);
_Button.call(this, player, options);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
BigPlayButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-big-play-button';
};
/**
* Handles click for play
*
* @method handleClick
*/
BigPlayButton.prototype.handleClick = function handleClick() {
this.player_.play();
};
/**
* Return handler for the tooltip
*
* @return {Object} Dom element to serve as a handler for the tooltip
* @method tooltipHandler
*/
BigPlayButton.prototype.tooltipHandler = function tooltipHandler() {
if (this.options_.tooltip !== undefined) {
return _Button.prototype.tooltipHandler.call(this);
}
};
return BigPlayButton;
})(_buttonJs2['default']);
BigPlayButton.prototype.controlText_ = 'Play Video';
_componentJs2['default'].registerComponent('BigPlayButton', BigPlayButton);
exports['default'] = BigPlayButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9iaWctcGxheS1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozt3QkFHbUIsYUFBYTs7OzsyQkFDVixnQkFBZ0I7Ozs7Ozs7Ozs7Ozs7O0lBV2hDLGFBQWE7WUFBYixhQUFhOztBQUVOLFdBRlAsYUFBYSxDQUVMLE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBRnpCLGFBQWE7O0FBR2YsdUJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ3hCOzs7Ozs7Ozs7QUFKRyxlQUFhLFdBWWpCLGFBQWEsR0FBQSx5QkFBRztBQUNkLFdBQU8scUJBQXFCLENBQUM7R0FDOUI7Ozs7Ozs7O0FBZEcsZUFBYSxXQXFCakIsV0FBVyxHQUFBLHVCQUFHO0FBQ1osUUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztHQUNyQjs7Ozs7Ozs7O0FBdkJHLGVBQWEsV0ErQmpCLGNBQWMsR0FBQSwwQkFBRztBQUNmLFFBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO0FBQ3ZDLGFBQU8sa0JBQU0sY0FBYyxLQUFBLE1BQUUsQ0FBQztLQUMvQjtHQUNGOztTQW5DRyxhQUFhOzs7QUF1Q25CLGFBQWEsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQzs7QUFFcEQseUJBQVUsaUJBQWlCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUM3QyxhQUFhIiwiZmlsZSI6InNyYy9qcy9iaWctcGxheS1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGJpZy1wbGF5LWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgQnV0dG9uIGZyb20gJy4vYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi9jb21wb25lbnQuanMnO1xuXG4vKipcbiAqIEluaXRpYWwgcGxheSBidXR0b24uIFNob3dzIGJlZm9yZSB0aGUgdmlkZW8gaGFzIHBsYXllZC4gVGhlIGhpZGluZyBvZiB0aGVcbiAqIGJpZyBwbGF5IGJ1dHRvbiBpcyBkb25lIHZpYSBDU1MgYW5kIHBsYXllciBzdGF0ZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsYXllciAgTWFpbiBQbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAqIEBleHRlbmRzIEJ1dHRvblxuICogQGNsYXNzIEJpZ1BsYXlCdXR0b25cbiAqL1xuY2xhc3MgQmlnUGxheUJ1dHRvbiBleHRlbmRzIEJ1dHRvbiB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKSB7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuICd2anMtYmlnLXBsYXktYnV0dG9uJztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGNsaWNrIGZvciBwbGF5XG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlQ2xpY2tcbiAgICovXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIHRoaXMucGxheWVyXy5wbGF5KCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGhhbmRsZXIgZm9yIHRoZSB0b29sdGlwXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRG9tIGVsZW1lbnQgdG8gc2VydmUgYXMgYSBoYW5kbGVyIGZvciB0aGUgdG9vbHRpcFxuICAgKiBAbWV0aG9kIHRvb2x0aXBIYW5kbGVyXG4gICAqL1xuICB0b29sdGlwSGFuZGxlcigpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zXy50b29sdGlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBzdXBlci50b29sdGlwSGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG59XG5cbkJpZ1BsYXlCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdQbGF5IFZpZGVvJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdCaWdQbGF5QnV0dG9uJywgQmlnUGxheUJ1dHRvbik7XG5leHBvcnQgZGVmYXVsdCBCaWdQbGF5QnV0dG9uO1xuIl19
},{"./button.js":63,"./component.js":66}],63:[function(_dereq_,module,exports){
/**
* @file button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _clickableComponentJs = _dereq_('./clickable-component.js');
var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* Base class for all buttons
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends ClickableComponent
* @class Button
*/
var Button = (function (_ClickableComponent) {
_inherits(Button, _ClickableComponent);
function Button(player, options) {
_classCallCheck(this, Button);
_ClickableComponent.call(this, player, options);
}
/**
* Create the component's DOM element
*
* @param {String=} type Element's node type. e.g. 'div'
* @param {Object=} props An object of properties that should be set on the element
* @param {Object=} attributes An object of attributes that should be set on the element
* @return {Element}
* @method createEl
*/
Button.prototype.createEl = function createEl() {
var tag = arguments.length <= 0 || arguments[0] === undefined ? 'button' : arguments[0];
var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
props = _objectAssign2['default']({
className: this.buildCSSClass()
}, props);
if (tag !== 'button') {
_utilsLogJs2['default'].warn('Creating a Button with an HTML element of ' + tag + ' is deprecated; use ClickableComponent instead.');
// Add properties for clickable element which is not a native HTML button
props = _objectAssign2['default']({
tabIndex: 0
}, props);
// Add ARIA attributes for clickable element which is not a native HTML button
attributes = _objectAssign2['default']({
role: 'button'
}, attributes);
}
// Add attributes for button element
attributes = _objectAssign2['default']({
type: 'button', // Necessary since the default button type is "submit"
'aria-live': 'polite' // let the screen reader user know that the text of the button may change
}, attributes);
var el = _component2['default'].prototype.createEl.call(this, tag, props, attributes);
this.createControlTextEl(el);
return el;
};
/**
* Adds a child component inside this button
*
* @param {String|Component} child The class name or instance of a child to add
* @param {Object=} options Options, including options to be passed to children of the child.
* @return {Component} The child component (created by this process if a string was used)
* @deprecated
* @method addChild
*/
Button.prototype.addChild = function addChild(child) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var className = this.constructor.name;
_utilsLogJs2['default'].warn('Adding an actionable (user controllable) child to a Button (' + className + ') is not supported; use a ClickableComponent instead.');
// Avoid the error message generated by ClickableComponent's addChild method
return _component2['default'].prototype.addChild.call(this, child, options);
};
/**
* Handle KeyPress (document level) - Extend with specific functionality for button
*
* @method handleKeyPress
*/
Button.prototype.handleKeyPress = function handleKeyPress(event) {
// Ignore Space (32) or Enter (13) key operation, which is handled by the browser for a button.
if (event.which === 32 || event.which === 13) {} else {
_ClickableComponent.prototype.handleKeyPress.call(this, event); // Pass keypress handling up for unsupported keys
}
};
return Button;
})(_clickableComponentJs2['default']);
_component2['default'].registerComponent('Button', Button);
exports['default'] = Button;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O29DQUcrQiwwQkFBMEI7Ozs7eUJBQ25DLGFBQWE7Ozs7NkJBQ1gsbUJBQW1COztJQUEvQixNQUFNOzt5QkFDRSxlQUFlOztJQUF2QixFQUFFOzswQkFDRSxnQkFBZ0I7Ozs7OEJBQ1gsaUJBQWlCOzs7OzRCQUNuQixlQUFlOzs7Ozs7Ozs7Ozs7O0lBVTVCLE1BQU07WUFBTixNQUFNOztBQUVDLFdBRlAsTUFBTSxDQUVFLE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBRnpCLE1BQU07O0FBR1IsbUNBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0dBQ3hCOzs7Ozs7Ozs7Ozs7QUFKRyxRQUFNLFdBZVYsUUFBUSxHQUFBLG9CQUF3QztRQUF2QyxHQUFHLHlEQUFDLFFBQVE7UUFBRSxLQUFLLHlEQUFDLEVBQUU7UUFBRSxVQUFVLHlEQUFDLEVBQUU7O0FBQzVDLFNBQUssR0FBRywwQkFBTztBQUNiLGVBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO0tBQ2hDLEVBQUUsS0FBSyxDQUFDLENBQUM7O0FBRVYsUUFBSSxHQUFHLEtBQUssUUFBUSxFQUFFO0FBQ3BCLDhCQUFJLElBQUksZ0RBQThDLEdBQUcscURBQWtELENBQUM7OztBQUc1RyxXQUFLLEdBQUcsMEJBQU87QUFDYixnQkFBUSxFQUFFLENBQUM7T0FDWixFQUFFLEtBQUssQ0FBQyxDQUFDOzs7QUFHVixnQkFBVSxHQUFHLDBCQUFPO0FBQ2xCLFlBQUksRUFBRSxRQUFRO09BQ2YsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUNoQjs7O0FBR0QsY0FBVSxHQUFHLDBCQUFPO0FBQ2xCLFVBQUksRUFBRSxRQUFRO0FBQ2QsaUJBQVcsRUFBRSxRQUFRO0tBQ3RCLEVBQUUsVUFBVSxDQUFDLENBQUM7O0FBRWYsUUFBSSxFQUFFLEdBQUcsdUJBQVUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7O0FBRXpFLFFBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQzs7QUFFN0IsV0FBTyxFQUFFLENBQUM7R0FDWDs7Ozs7Ozs7Ozs7O0FBN0NHLFFBQU0sV0F3RFYsUUFBUSxHQUFBLGtCQUFDLEtBQUssRUFBYztRQUFaLE9BQU8seURBQUMsRUFBRTs7QUFDeEIsUUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFDdEMsNEJBQUksSUFBSSxrRUFBZ0UsU0FBUywyREFBd0QsQ0FBQzs7O0FBRzFJLFdBQU8sdUJBQVUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztHQUNoRTs7Ozs7Ozs7QUE5REcsUUFBTSxXQXFFVixjQUFjLEdBQUEsd0JBQUMsS0FBSyxFQUFFOztBQUVwQixRQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFLEVBQzdDLE1BQU07QUFDTCxvQ0FBTSxjQUFjLEtBQUEsT0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtHQUNGOztTQTNFRyxNQUFNOzs7QUErRVosdUJBQVUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FCQUMvQixNQUFNIiwiZmlsZSI6InNyYy9qcy9idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGJ1dHRvbi5qc1xuICovXG5pbXBvcnQgQ2xpY2thYmxlQ29tcG9uZW50IGZyb20gJy4vY2xpY2thYmxlLWNvbXBvbmVudC5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuL3V0aWxzL2ZuLmpzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgYXNzaWduIGZyb20gJ29iamVjdC5hc3NpZ24nO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBidXR0b25zXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsYXllciAgTWFpbiBQbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAqIEBleHRlbmRzIENsaWNrYWJsZUNvbXBvbmVudFxuICogQGNsYXNzIEJ1dHRvblxuICovXG5jbGFzcyBCdXR0b24gZXh0ZW5kcyBDbGlja2FibGVDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZz19IHR5cGUgRWxlbWVudCdzIG5vZGUgdHlwZS4gZS5nLiAnZGl2J1xuICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdD19IGF0dHJpYnV0ZXMgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKHRhZz0nYnV0dG9uJywgcHJvcHM9e30sIGF0dHJpYnV0ZXM9e30pIHtcbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpXG4gICAgfSwgcHJvcHMpO1xuXG4gICAgaWYgKHRhZyAhPT0gJ2J1dHRvbicpIHtcbiAgICAgIGxvZy53YXJuKGBDcmVhdGluZyBhIEJ1dHRvbiB3aXRoIGFuIEhUTUwgZWxlbWVudCBvZiAke3RhZ30gaXMgZGVwcmVjYXRlZDsgdXNlIENsaWNrYWJsZUNvbXBvbmVudCBpbnN0ZWFkLmApO1xuXG4gICAgICAvLyBBZGQgcHJvcGVydGllcyBmb3IgY2xpY2thYmxlIGVsZW1lbnQgd2hpY2ggaXMgbm90IGEgbmF0aXZlIEhUTUwgYnV0dG9uXG4gICAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICAgIHRhYkluZGV4OiAwXG4gICAgICB9LCBwcm9wcyk7XG5cbiAgICAgIC8vIEFkZCBBUklBIGF0dHJpYnV0ZXMgZm9yIGNsaWNrYWJsZSBlbGVtZW50IHdoaWNoIGlzIG5vdCBhIG5hdGl2ZSBIVE1MIGJ1dHRvblxuICAgICAgYXR0cmlidXRlcyA9IGFzc2lnbih7XG4gICAgICAgIHJvbGU6ICdidXR0b24nXG4gICAgICB9LCBhdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgYXR0cmlidXRlcyBmb3IgYnV0dG9uIGVsZW1lbnRcbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHtcbiAgICAgIHR5cGU6ICdidXR0b24nLCAvLyBOZWNlc3Nhcnkgc2luY2UgdGhlIGRlZmF1bHQgYnV0dG9uIHR5cGUgaXMgXCJzdWJtaXRcIlxuICAgICAgJ2FyaWEtbGl2ZSc6ICdwb2xpdGUnIC8vIGxldCB0aGUgc2NyZWVuIHJlYWRlciB1c2VyIGtub3cgdGhhdCB0aGUgdGV4dCBvZiB0aGUgYnV0dG9uIG1heSBjaGFuZ2VcbiAgICB9LCBhdHRyaWJ1dGVzKTtcblxuICAgIGxldCBlbCA9IENvbXBvbmVudC5wcm90b3R5cGUuY3JlYXRlRWwuY2FsbCh0aGlzLCB0YWcsIHByb3BzLCBhdHRyaWJ1dGVzKTtcblxuICAgIHRoaXMuY3JlYXRlQ29udHJvbFRleHRFbChlbCk7XG5cbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNoaWxkIGNvbXBvbmVudCBpbnNpZGUgdGhpcyBidXR0b25cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd8Q29tcG9uZW50fSBjaGlsZCBUaGUgY2xhc3MgbmFtZSBvciBpbnN0YW5jZSBvZiBhIGNoaWxkIHRvIGFkZFxuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucywgaW5jbHVkaW5nIG9wdGlvbnMgdG8gYmUgcGFzc2VkIHRvIGNoaWxkcmVuIG9mIHRoZSBjaGlsZC5cbiAgICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgY2hpbGQgY29tcG9uZW50IChjcmVhdGVkIGJ5IHRoaXMgcHJvY2VzcyBpZiBhIHN0cmluZyB3YXMgdXNlZClcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQG1ldGhvZCBhZGRDaGlsZFxuICAgKi9cbiAgYWRkQ2hpbGQoY2hpbGQsIG9wdGlvbnM9e30pIHtcbiAgICBsZXQgY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIGxvZy53YXJuKGBBZGRpbmcgYW4gYWN0aW9uYWJsZSAodXNlciBjb250cm9sbGFibGUpIGNoaWxkIHRvIGEgQnV0dG9uICgke2NsYXNzTmFtZX0pIGlzIG5vdCBzdXBwb3J0ZWQ7IHVzZSBhIENsaWNrYWJsZUNvbXBvbmVudCBpbnN0ZWFkLmApO1xuXG4gICAgLy8gQXZvaWQgdGhlIGVycm9yIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IENsaWNrYWJsZUNvbXBvbmVudCdzIGFkZENoaWxkIG1ldGhvZFxuICAgIHJldHVybiBDb21wb25lbnQucHJvdG90eXBlLmFkZENoaWxkLmNhbGwodGhpcywgY2hpbGQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBLZXlQcmVzcyAoZG9jdW1lbnQgbGV2ZWwpIC0gRXh0ZW5kIHdpdGggc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBmb3IgYnV0dG9uXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlS2V5UHJlc3NcbiAgICovXG4gIGhhbmRsZUtleVByZXNzKGV2ZW50KSB7XG4gICAgLy8gSWdub3JlIFNwYWNlICgzMikgb3IgRW50ZXIgKDEzKSBrZXkgb3BlcmF0aW9uLCB3aGljaCBpcyBoYW5kbGVkIGJ5IHRoZSBicm93c2VyIGZvciBhIGJ1dHRvbi5cbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDMyIHx8IGV2ZW50LndoaWNoID09PSAxMykge1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5oYW5kbGVLZXlQcmVzcyhldmVudCk7IC8vIFBhc3Mga2V5cHJlc3MgaGFuZGxpbmcgdXAgZm9yIHVuc3VwcG9ydGVkIGtleXNcbiAgICB9XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0J1dHRvbicsIEJ1dHRvbik7XG5leHBvcnQgZGVmYXVsdCBCdXR0b247XG4iXX0=
},{"./clickable-component.js":64,"./component":66,"./utils/events.js":145,"./utils/fn.js":146,"./utils/log.js":149,"global/document":7,"object.assign":53}],64:[function(_dereq_,module,exports){
/**
* @file button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _tooltip = _dereq_('./tooltip');
var _tooltip2 = _interopRequireDefault(_tooltip);
/**
* Clickable Component which is clickable or keyboard actionable, but is not a native HTML button
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Component
* @class ClickableComponent
*/
var ClickableComponent = (function (_Component) {
_inherits(ClickableComponent, _Component);
function ClickableComponent(player, options) {
_classCallCheck(this, ClickableComponent);
_Component.call(this, player, options);
this.appendTooltip();
this.emitTapEvents();
this.on('tap', this.handleClick);
this.on('click', this.handleClick);
this.on('focus', this.handleFocus);
this.on('blur', this.handleBlur);
}
/**
* Create the component's DOM element
*
* @param {String=} type Element's node type. e.g. 'div'
* @param {Object=} props An object of properties that should be set on the element
* @param {Object=} attributes An object of attributes that should be set on the element
* @return {Element}
* @method createEl
*/
ClickableComponent.prototype.createEl = function createEl() {
var tag = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0];
var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
props = _objectAssign2['default']({
className: this.buildCSSClass(),
tabIndex: 0
}, props);
if (tag === 'button') {
_utilsLogJs2['default'].error('Creating a ClickableComponent with an HTML element of ' + tag + ' is not supported; use a Button instead.');
}
// Add ARIA attributes for clickable element which is not a native HTML button
attributes = _objectAssign2['default']({
role: 'button',
'aria-live': 'polite' // let the screen reader user know that the text of the element may change
}, attributes);
var el = _Component.prototype.createEl.call(this, tag, props, attributes);
this.createControlTextEl(el);
return el;
};
/**
* create control text
*
* @param {Element} el Parent element for the control text
* @return {Element}
* @method controlText
*/
ClickableComponent.prototype.createControlTextEl = function createControlTextEl(el) {
this.controlTextEl_ = Dom.createEl('span', {
className: 'vjs-control-text'
});
if (el) {
el.appendChild(this.controlTextEl_);
}
this.controlText(this.controlText_);
return this.controlTextEl_;
};
/**
* Controls text - both request and localize
*
* @param {String} text Text for element
* @return {String}
* @method controlText
*/
ClickableComponent.prototype.controlText = function controlText(text) {
if (!text) return this.controlText_ || 'Need Text';
this.controlText_ = text;
this.controlTextEl_.innerHTML = this.localize(this.controlText_);
if (this.tooltip) {
this.tooltip.text(this.controlText_);
} else {
this.appendTooltip();
}
return this;
};
/**
* Allows sub components to stack CSS class names
*
* @return {String}
* @method buildCSSClass
*/
ClickableComponent.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-control vjs-button ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Adds a child component inside this clickable-component
*
* @param {String|Component} child The class name or instance of a child to add
* @param {Object=} options Options, including options to be passed to children of the child.
* @return {Component} The child component (created by this process if a string was used)
* @method addChild
*/
ClickableComponent.prototype.addChild = function addChild(child) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
// TODO: Fix adding an actionable child to a ClickableComponent; currently
// it will cause issues with assistive technology (e.g. screen readers)
// which support ARIA, since an element with role="button" cannot have
// actionable child elements.
//let className = this.constructor.name;
//log.warn(`Adding a child to a ClickableComponent (${className}) can cause issues with assistive technology which supports ARIA, since an element with role="button" cannot have actionable child elements.`);
return _Component.prototype.addChild.call(this, child, options);
};
/**
* Enable the component element
*
* @return {Component}
* @method enable
*/
ClickableComponent.prototype.enable = function enable() {
this.removeClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'false');
return this;
};
/**
* Disable the component element
*
* @return {Component}
* @method disable
*/
ClickableComponent.prototype.disable = function disable() {
this.addClass('vjs-disabled');
this.el_.setAttribute('aria-disabled', 'true');
return this;
};
/**
* Handle Click - Override with specific functionality for component
*
* @method handleClick
*/
ClickableComponent.prototype.handleClick = function handleClick() {};
/**
* Handle Focus - Add keyboard functionality to element
*
* @method handleFocus
*/
ClickableComponent.prototype.handleFocus = function handleFocus() {
Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
};
/**
* Handle KeyPress (document level) - Trigger click when Space or Enter key is pressed
*
* @method handleKeyPress
*/
ClickableComponent.prototype.handleKeyPress = function handleKeyPress(event) {
// Support Space (32) or Enter (13) key operation to fire a click event
if (event.which === 32 || event.which === 13) {
event.preventDefault();
this.handleClick(event);
} else if (_Component.prototype.handleKeyPress) {
_Component.prototype.handleKeyPress.call(this, event); // Pass keypress handling up for unsupported keys
}
};
/**
* Handle Blur - Remove keyboard triggers
*
* @method handleBlur
*/
ClickableComponent.prototype.handleBlur = function handleBlur() {
Events.off(_globalDocument2['default'], 'keydown', Fn.bind(this, this.handleKeyPress));
};
/**
* Append a tooltip to the component
*
* @method appendTooltip
*/
ClickableComponent.prototype.appendTooltip = function appendTooltip() {
if (this.tooltip || !this.controlText_ || !this.el()) {
return;
}
var tooltipHandler = this.tooltipHandler();
if (tooltipHandler) {
this.tooltip = new _tooltip2['default'](this.player_);
this.el().appendChild(this.tooltip.el());
this.tooltip.text(this.controlText_);
this.tooltip.handler(tooltipHandler);
}
};
/**
* Return handler for the tooltip
*
* @return {Object} Dom element to serve as a handler for the tooltip
* @method tooltipHandler
*/
ClickableComponent.prototype.tooltipHandler = function tooltipHandler() {
var handler = this.options_.tooltip;
if (handler === false) {
return;
}
if (handler === true || this.player_.options_ && this.player_.options_.tooltips) {
return this.el();
}
if (typeof handler === 'string') {
return Dom.getEl(handler);
}
if (handler && typeof handler.el === 'function') {
return handler.el();
}
return handler;
};
return ClickableComponent;
})(_component2['default']);
_component2['default'].registerComponent('ClickableComponent', ClickableComponent);
exports['default'] = ClickableComponent;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jbGlja2FibGUtY29tcG9uZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozt5QkFHc0IsYUFBYTs7OzswQkFDZCxnQkFBZ0I7O0lBQXpCLEdBQUc7OzZCQUNTLG1CQUFtQjs7SUFBL0IsTUFBTTs7eUJBQ0UsZUFBZTs7SUFBdkIsRUFBRTs7MEJBQ0UsZ0JBQWdCOzs7OzhCQUNYLGlCQUFpQjs7Ozs0QkFDbkIsZUFBZTs7Ozt1QkFDZCxXQUFXOzs7Ozs7Ozs7Ozs7O0lBVXpCLGtCQUFrQjtZQUFsQixrQkFBa0I7O0FBRVgsV0FGUCxrQkFBa0IsQ0FFVixNQUFNLEVBQUUsT0FBTyxFQUFFOzBCQUZ6QixrQkFBa0I7O0FBR3BCLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDOztBQUVyQixRQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7O0FBRXJCLFFBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqQyxRQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDbkMsUUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25DLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztHQUNsQzs7Ozs7Ozs7Ozs7O0FBYkcsb0JBQWtCLFdBd0J0QixRQUFRLEdBQUEsb0JBQXFDO1FBQXBDLEdBQUcseURBQUMsS0FBSztRQUFFLEtBQUsseURBQUMsRUFBRTtRQUFFLFVBQVUseURBQUMsRUFBRTs7QUFDekMsU0FBSyxHQUFHLDBCQUFPO0FBQ2IsZUFBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7QUFDL0IsY0FBUSxFQUFFLENBQUM7S0FDWixFQUFFLEtBQUssQ0FB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QUM7S0FDdEM7R0FDRjs7Ozs7Ozs7O0FBMU1HLG9CQUFrQixXQWtOdEIsY0FBYyxHQUFBLDBCQUFHO0FBQ2YsUUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7O0FBRXBDLFFBQUksT0FBTyxLQUFLLEtBQUssRUFBRTtBQUNyQixhQUFPO0tBQ1I7O0FBRUQsUUFBSSxPQUFPLEtBQUssSUFBSSxJQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQUFBQyxFQUFFO0FBQ2pGLGFBQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ2xCOztBQUVELFFBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFO0FBQy9CLGFBQU8sR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUMzQjs7QUFFRCxRQUFJLE9BQU8sSUFBSSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEtBQUssVUFBVSxFQUFFO0FBQy9DLGFBQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ3JCOztBQUVELFdBQU8sT0FBTyxDQUFDO0dBQ2hCOztTQXRPRyxrQkFBa0I7OztBQXlPeEIsdUJBQVUsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztxQkFDdkQsa0JBQWtCIiwiZmlsZSI6InNyYy9qcy9jbGlja2FibGUtY29tcG9uZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBidXR0b24uanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi91dGlscy9kb20uanMnO1xuaW1wb3J0ICogYXMgRXZlbnRzIGZyb20gJy4vdXRpbHMvZXZlbnRzLmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LmFzc2lnbic7XG5pbXBvcnQgVG9vbHRpcCBmcm9tICcuL3Rvb2x0aXAnO1xuXG4vKipcbiAqIENsaWNrYWJsZSBDb21wb25lbnQgd2hpY2ggaXMgY2xpY2thYmxlIG9yIGtleWJvYXJkIGFjdGlvbmFibGUsIGJ1dCBpcyBub3QgYSBuYXRpdmUgSFRNTCBidXR0b25cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGxheWVyICBNYWluIFBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgQ2xpY2thYmxlQ29tcG9uZW50XG4gKi9cbmNsYXNzIENsaWNrYWJsZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKSB7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMuYXBwZW5kVG9vbHRpcCgpO1xuXG4gICAgdGhpcy5lbWl0VGFwRXZlbnRzKCk7XG5cbiAgICB0aGlzLm9uKCd0YXAnLCB0aGlzLmhhbmRsZUNsaWNrKTtcbiAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuICAgIHRoaXMub24oJ2ZvY3VzJywgdGhpcy5oYW5kbGVGb2N1cyk7XG4gICAgdGhpcy5vbignYmx1cicsIHRoaXMuaGFuZGxlQmx1cik7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZz19IHR5cGUgRWxlbWVudCdzIG5vZGUgdHlwZS4gZS5nLiAnZGl2J1xuICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHRoYXQgc2hvdWxkIGJlIHNldCBvbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0ge09iamVjdD19IGF0dHJpYnV0ZXMgQW4gb2JqZWN0IG9mIGF0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBlbGVtZW50XG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKHRhZz0nZGl2JywgcHJvcHM9e30sIGF0dHJpYnV0ZXM9e30pIHtcbiAgICBwcm9wcyA9IGFzc2lnbih7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpLFxuICAgICAgdGFiSW5kZXg6IDBcbiAgICB9LCBwcm9wcyk7XG5cbiAgICBpZiAodGFnID09PSAnYnV0dG9uJykge1xuICAgICAgbG9nLmVycm9yKGBDcmVhdGluZyBhIENsaWNrYWJsZUNvbXBvbmVudCB3aXRoIGFuIEhUTUwgZWxlbWVudCBvZiAke3RhZ30gaXMgbm90IHN1cHBvcnRlZDsgdXNlIGEgQnV0dG9uIGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgLy8gQWRkIEFSSUEgYXR0cmlidXRlcyBmb3IgY2xpY2thYmxlIGVsZW1lbnQgd2hpY2ggaXMgbm90IGEgbmF0aXZlIEhUTUwgYnV0dG9uXG4gICAgYXR0cmlidXRlcyA9IGFzc2lnbih7XG4gICAgICByb2xlOiAnYnV0dG9uJyxcbiAgICAgICdhcmlhLWxpdmUnOiAncG9saXRlJyAvLyBsZXQgdGhlIHNjcmVlbiByZWFkZXIgdXNlciBrbm93IHRoYXQgdGhlIHRleHQgb2YgdGhlIGVsZW1lbnQgbWF5IGNoYW5nZVxuICAgIH0sIGF0dHJpYnV0ZXMpO1xuXG4gICAgbGV0IGVsID0gc3VwZXIuY3JlYXRlRWwodGFnLCBwcm9wcywgYXR0cmlidXRlcyk7XG5cbiAgICB0aGlzLmNyZWF0ZUNvbnRyb2xUZXh0RWwoZWwpO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIGNyZWF0ZSBjb250cm9sIHRleHRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbCBQYXJlbnQgZWxlbWVudCBmb3IgdGhlIGNvbnRyb2wgdGV4dFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNvbnRyb2xUZXh0XG4gICAqL1xuICBjcmVhdGVDb250cm9sVGV4dEVsKGVsKSB7XG4gICAgdGhpcy5jb250cm9sVGV4dEVsXyA9IERvbS5jcmVhdGVFbCgnc3BhbicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1jb250cm9sLXRleHQnXG4gICAgfSk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udHJvbFRleHRFbF8pO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbFRleHQodGhpcy5jb250cm9sVGV4dF8pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29udHJvbFRleHRFbF87XG4gIH1cblxuICAvKipcbiAgICogQ29udHJvbHMgdGV4dCAtIGJvdGggcmVxdWVzdCBhbmQgbG9jYWxpemVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgVGV4dCBmb3IgZWxlbWVudFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBtZXRob2QgY29udHJvbFRleHRcbiAgICovXG4gIGNvbnRyb2xUZXh0KHRleHQpIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0aGlzLmNvbnRyb2xUZXh0XyB8fCAnTmVlZCBUZXh0JztcblxuICAgIHRoaXMuY29udHJvbFRleHRfID0gdGV4dDtcbiAgICB0aGlzLmNvbnRyb2xUZXh0RWxfLmlubmVySFRNTCA9IHRoaXMubG9jYWxpemUodGhpcy5jb250cm9sVGV4dF8pO1xuXG4gICAgaWYgKHRoaXMudG9vbHRpcCkge1xuICAgICAgdGhpcy50b29sdGlwLnRleHQodGhpcy5jb250cm9sVGV4dF8pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFwcGVuZFRvb2x0aXAoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3Mgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBgdmpzLWNvbnRyb2wgdmpzLWJ1dHRvbiAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQgaW5zaWRlIHRoaXMgY2xpY2thYmxlLWNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xDb21wb25lbnR9IGNoaWxkIFRoZSBjbGFzcyBuYW1lIG9yIGluc3RhbmNlIG9mIGEgY2hpbGQgdG8gYWRkXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zLCBpbmNsdWRpbmcgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gY2hpbGRyZW4gb2YgdGhlIGNoaWxkLlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjaGlsZCBjb21wb25lbnQgKGNyZWF0ZWQgYnkgdGhpcyBwcm9jZXNzIGlmIGEgc3RyaW5nIHdhcyB1c2VkKVxuICAgKiBAbWV0aG9kIGFkZENoaWxkXG4gICAqL1xuICBhZGRDaGlsZChjaGlsZCwgb3B0aW9ucz17fSkge1xuICAgIC8vIFRPRE86IEZpeCBhZGRpbmcgYW4gYWN0aW9uYWJsZSBjaGlsZCB0byBhIENsaWNrYWJsZUNvbXBvbmVudDsgY3VycmVudGx5XG4gICAgLy8gaXQgd2lsbCBjYXVzZSBpc3N1ZXMgd2l0aCBhc3Npc3RpdmUgdGVjaG5vbG9neSAoZS5nLiBzY3JlZW4gcmVhZGVycylcbiAgICAvLyB3aGljaCBzdXBwb3J0IEFSSUEsIHNpbmNlIGFuIGVsZW1lbnQgd2l0aCByb2xlPVwiYnV0dG9uXCIgY2Fubm90IGhhdmVcbiAgICAvLyBhY3Rpb25hYmxlIGNoaWxkIGVsZW1lbnRzLlxuXG4gICAgLy9sZXQgY2xhc3NOYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgIC8vbG9nLndhcm4oYEFkZGluZyBhIGNoaWxkIHRvIGEgQ2xpY2thYmxlQ29tcG9uZW50ICgke2NsYXNzTmFtZX0pIGNhbiBjYXVzZSBpc3N1ZXMgd2l0aCBhc3Npc3RpdmUgdGVjaG5vbG9neSB3aGljaCBzdXBwb3J0cyBBUklBLCBzaW5jZSBhbiBlbGVtZW50IHdpdGggcm9sZT1cImJ1dHRvblwiIGNhbm5vdCBoYXZlIGFjdGlvbmFibGUgY2hpbGQgZWxlbWVudHMuYCk7XG5cbiAgICByZXR1cm4gc3VwZXIuYWRkQ2hpbGQoY2hpbGQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgY29tcG9uZW50IGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIGVuYWJsZVxuICAgKi9cbiAgZW5hYmxlKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1kaXNhYmxlZCcpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICdmYWxzZScpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGUgdGhlIGNvbXBvbmVudCBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQG1ldGhvZCBkaXNhYmxlXG4gICAqL1xuICBkaXNhYmxlKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1kaXNhYmxlZCcpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsICd0cnVlJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIENsaWNrIC0gT3ZlcnJpZGUgd2l0aCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGZvciBjb21wb25lbnRcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7fVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgRm9jdXMgLSBBZGQga2V5Ym9hcmQgZnVuY3Rpb25hbGl0eSB0byBlbGVtZW50XG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlRm9jdXNcbiAgICovXG4gIGhhbmRsZUZvY3VzKCkge1xuICAgIEV2ZW50cy5vbihkb2N1bWVudCwgJ2tleWRvd24nLCBGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlS2V5UHJlc3MpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgS2V5UHJlc3MgKGRvY3VtZW50IGxldmVsKSAtIFRyaWdnZXIgY2xpY2sgd2hlbiBTcGFjZSBvciBFbnRlciBrZXkgaXMgcHJlc3NlZFxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZUtleVByZXNzXG4gICAqL1xuICBoYW5kbGVLZXlQcmVzcyhldmVudCkge1xuICAgIC8vIFN1cHBvcnQgU3BhY2UgKDMyKSBvciBFbnRlciAoMTMpIGtleSBvcGVyYXRpb24gdG8gZmlyZSBhIGNsaWNrIGV2ZW50XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAzMiB8fCBldmVudC53aGljaCA9PT0gMTMpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLmhhbmRsZUNsaWNrKGV2ZW50KTtcbiAgICB9IGVsc2UgaWYgKHN1cGVyLmhhbmRsZUtleVByZXNzKSB7XG4gICAgICBzdXBlci5oYW5kbGVLZXlQcmVzcyhldmVudCk7IC8vIFBhc3Mga2V5cHJlc3MgaGFuZGxpbmcgdXAgZm9yIHVuc3VwcG9ydGVkIGtleXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEJsdXIgLSBSZW1vdmUga2V5Ym9hcmQgdHJpZ2dlcnNcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVCbHVyXG4gICAqL1xuICBoYW5kbGVCbHVyKCkge1xuICAgIEV2ZW50cy5vZmYoZG9jdW1lbnQsICdrZXlkb3duJywgRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIGEgdG9vbHRpcCB0byB0aGUgY29tcG9uZW50XG4gICAqXG4gICAqIEBtZXRob2QgYXBwZW5kVG9vbHRpcFxuICAgKi9cbiAgYXBwZW5kVG9vbHRpcCgpIHtcbiAgICBpZiAodGhpcy50b29sdGlwIHx8ICF0aGlzLmNvbnRyb2xUZXh0XyB8fCAhdGhpcy5lbCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHRvb2x0aXBIYW5kbGVyID0gdGhpcy50b29sdGlwSGFuZGxlcigpO1xuXG4gICAgaWYgKHRvb2x0aXBIYW5kbGVyKSB7XG4gICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLnBsYXllcl8pO1xuICAgICAgdGhpcy5lbCgpLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcC5lbCgpKTtcbiAgICAgIHRoaXMudG9vbHRpcC50ZXh0KHRoaXMuY29udHJvbFRleHRfKTtcbiAgICAgIHRoaXMudG9vbHRpcC5oYW5kbGVyKHRvb2x0aXBIYW5kbGVyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGhhbmRsZXIgZm9yIHRoZSB0b29sdGlwXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRG9tIGVsZW1lbnQgdG8gc2VydmUgYXMgYSBoYW5kbGVyIGZvciB0aGUgdG9vbHRpcFxuICAgKiBAbWV0aG9kIHRvb2x0aXBIYW5kbGVyXG4gICAqL1xuICB0b29sdGlwSGFuZGxlcigpIHtcbiAgICBsZXQgaGFuZGxlciA9IHRoaXMub3B0aW9uc18udG9vbHRpcDtcblxuICAgIGlmIChoYW5kbGVyID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVyID09PSB0cnVlIHx8ICh0aGlzLnBsYXllcl8ub3B0aW9uc18gJiYgdGhpcy5wbGF5ZXJfLm9wdGlvbnNfLnRvb2x0aXBzKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZWwoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gRG9tLmdldEVsKGhhbmRsZXIpO1xuICAgIH1cblxuICAgIGlmIChoYW5kbGVyICYmIHR5cGVvZiBoYW5kbGVyLmVsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gaGFuZGxlci5lbCgpO1xuICAgIH1cblxuICAgIHJldHVybiBoYW5kbGVyO1xuICB9XG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2xpY2thYmxlQ29tcG9uZW50JywgQ2xpY2thYmxlQ29tcG9uZW50KTtcbmV4cG9ydCBkZWZhdWx0IENsaWNrYWJsZUNvbXBvbmVudDtcbiJdfQ==
},{"./component":66,"./tooltip":125,"./utils/dom.js":144,"./utils/events.js":145,"./utils/fn.js":146,"./utils/log.js":149,"global/document":7,"object.assign":53}],65:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _button = _dereq_('./button');
var _button2 = _interopRequireDefault(_button);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
/**
* The `CloseButton` component is a button which fires a "close" event
* when it is activated.
*
* @extends Button
* @class CloseButton
*/
var CloseButton = (function (_Button) {
_inherits(CloseButton, _Button);
function CloseButton(player, options) {
_classCallCheck(this, CloseButton);
_Button.call(this, player, options);
this.controlText(options && options.controlText || this.localize('Close'));
}
CloseButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-close-button ' + _Button.prototype.buildCSSClass.call(this);
};
CloseButton.prototype.handleClick = function handleClick() {
this.trigger({ type: 'close', bubbles: false });
};
return CloseButton;
})(_button2['default']);
_component2['default'].registerComponent('CloseButton', CloseButton);
exports['default'] = CloseButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jbG9zZS1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztzQkFBbUIsVUFBVTs7Ozt5QkFDUCxhQUFhOzs7Ozs7Ozs7Ozs7SUFTN0IsV0FBVztZQUFYLFdBQVc7O0FBRUosV0FGUCxXQUFXLENBRUgsTUFBTSxFQUFFLE9BQU8sRUFBRTswQkFGekIsV0FBVzs7QUFHYix1QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkIsUUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7R0FDNUU7O0FBTEcsYUFBVyxXQU9mLGFBQWEsR0FBQSx5QkFBRztBQUNkLGlDQUEyQixrQkFBTSxhQUFhLEtBQUEsTUFBRSxDQUFHO0dBQ3BEOztBQVRHLGFBQVcsV0FXZixXQUFXLEdBQUEsdUJBQUc7QUFDWixRQUFJLENBQUMsT0FBTyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztHQUMvQzs7U0FiRyxXQUFXOzs7QUFnQmpCLHVCQUFVLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDekMsV0FBVyIsImZpbGUiOiJzcmMvanMvY2xvc2UtYnV0dG9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ1dHRvbiBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcblxuLyoqXG4gKiBUaGUgYENsb3NlQnV0dG9uYCBjb21wb25lbnQgaXMgYSBidXR0b24gd2hpY2ggZmlyZXMgYSBcImNsb3NlXCIgZXZlbnRcbiAqIHdoZW4gaXQgaXMgYWN0aXZhdGVkLlxuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICogQGNsYXNzIENsb3NlQnV0dG9uXG4gKi9cbmNsYXNzIENsb3NlQnV0dG9uIGV4dGVuZHMgQnV0dG9uIHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMuY29udHJvbFRleHQob3B0aW9ucyAmJiBvcHRpb25zLmNvbnRyb2xUZXh0IHx8IHRoaXMubG9jYWxpemUoJ0Nsb3NlJykpO1xuICB9XG5cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYHZqcy1jbG9zZS1idXR0b24gJHtzdXBlci5idWlsZENTU0NsYXNzKCl9YDtcbiAgfVxuXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIHRoaXMudHJpZ2dlcih7dHlwZTogJ2Nsb3NlJywgYnViYmxlczogZmFsc2V9KTtcbiAgfVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0Nsb3NlQnV0dG9uJywgQ2xvc2VCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgQ2xvc2VCdXR0b247XG4iXX0=
},{"./button":63,"./component":66}],66:[function(_dereq_,module,exports){
/**
* @file component.js
*
* Player Component - Base class for all UI objects
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsGuidJs = _dereq_('./utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
/**
* Base UI Component class
* Components are embeddable UI objects that are represented by both a
* javascript object and an element in the DOM. They can be children of other
* components, and can have many children themselves.
* ```js
* // adding a button to the player
* var button = player.addChild('button');
* button.el(); // -> button element
* ```
* ```html
*
*
Button
*
* ```
* Components are also event targets.
* ```js
* button.on('click', function(){
* console.log('Button Clicked!');
* });
* button.trigger('customevent');
* ```
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @class Component
*/
var Component = (function () {
function Component(player, options, ready) {
_classCallCheck(this, Component);
// The component might be the player itself and we can't pass `this` to super
if (!player && this.play) {
this.player_ = player = this; // eslint-disable-line
} else {
this.player_ = player;
}
// Make a copy of prototype.options_ to protect against overriding defaults
this.options_ = _utilsMergeOptionsJs2['default']({}, this.options_);
// Updated options with supplied options
options = this.options_ = _utilsMergeOptionsJs2['default'](this.options_, options);
// Get ID from options or options element if one is supplied
this.id_ = options.id || options.el && options.el.id;
// If there was no ID from the options, generate one
if (!this.id_) {
// Don't require the player ID function in the case of mock players
var id = player && player.id && player.id() || 'no_player';
this.id_ = id + '_component_' + Guid.newGUID();
}
this.name_ = options.name || null;
// Create element if one wasn't provided in options
if (options.el) {
this.el_ = options.el;
} else if (options.createEl !== false) {
this.el_ = this.createEl();
}
this.children_ = [];
this.childIndex_ = {};
this.childNameIndex_ = {};
// Add any child components in options
if (options.initChildren !== false) {
this.initChildren();
}
this.ready(ready);
// Don't want to trigger ready here or it will before init is actually
// finished for all children that run this constructor
if (options.reportTouchActivity !== false) {
this.enableTouchActivity();
}
}
/**
* Dispose of the component and all child components
*
* @method dispose
*/
Component.prototype.dispose = function dispose() {
this.trigger({ type: 'dispose', bubbles: false });
// Dispose all children.
if (this.children_) {
for (var i = this.children_.length - 1; i >= 0; i--) {
if (this.children_[i].dispose) {
this.children_[i].dispose();
}
}
}
// Delete child references
this.children_ = null;
this.childIndex_ = null;
this.childNameIndex_ = null;
// Remove all event listeners.
this.off();
// Remove element from DOM
if (this.el_.parentNode) {
this.el_.parentNode.removeChild(this.el_);
}
Dom.removeElData(this.el_);
this.el_ = null;
};
/**
* Return the component's player
*
* @return {Player}
* @method player
*/
Component.prototype.player = function player() {
return this.player_;
};
/**
* Deep merge of options objects
* Whenever a property is an object on both options objects
* the two properties will be merged using mergeOptions.
*
* ```js
* Parent.prototype.options_ = {
* optionSet: {
* 'childOne': { 'foo': 'bar', 'asdf': 'fdsa' },
* 'childTwo': {},
* 'childThree': {}
* }
* }
* newOptions = {
* optionSet: {
* 'childOne': { 'foo': 'baz', 'abc': '123' }
* 'childTwo': null,
* 'childFour': {}
* }
* }
*
* this.options(newOptions);
* ```
* RESULT
* ```js
* {
* optionSet: {
* 'childOne': { 'foo': 'baz', 'asdf': 'fdsa', 'abc': '123' },
* 'childTwo': null, // Disabled. Won't be initialized.
* 'childThree': {},
* 'childFour': {}
* }
* }
* ```
*
* @param {Object} obj Object of new option values
* @return {Object} A NEW object of this.options_ and obj merged
* @method options
*/
Component.prototype.options = function options(obj) {
_utilsLogJs2['default'].warn('this.options() has been deprecated and will be moved to the constructor in 6.0');
if (!obj) {
return this.options_;
}
this.options_ = _utilsMergeOptionsJs2['default'](this.options_, obj);
return this.options_;
};
/**
* Get the component's DOM element
* ```js
* var domEl = myComponent.el();
* ```
*
* @return {Element}
* @method el
*/
Component.prototype.el = function el() {
return this.el_;
};
/**
* Create the component's DOM element
*
* @param {String=} tagName Element's node type. e.g. 'div'
* @param {Object=} properties An object of properties that should be set
* @param {Object=} attributes An object of attributes that should be set
* @return {Element}
* @method createEl
*/
Component.prototype.createEl = function createEl(tagName, properties, attributes) {
return Dom.createEl(tagName, properties, attributes);
};
Component.prototype.localize = function localize(string) {
var code = this.player_.language && this.player_.language();
var languages = this.player_.languages && this.player_.languages();
if (!code || !languages) {
return string;
}
var language = languages[code];
if (language && language[string]) {
return language[string];
}
var primaryCode = code.split('-')[0];
var primaryLang = languages[primaryCode];
if (primaryLang && primaryLang[string]) {
return primaryLang[string];
}
return string;
};
/**
* Return the component's DOM element where children are inserted.
* Will either be the same as el() or a new element defined in createEl().
*
* @return {Element}
* @method contentEl
*/
Component.prototype.contentEl = function contentEl() {
return this.contentEl_ || this.el_;
};
/**
* Get the component's ID
* ```js
* var id = myComponent.id();
* ```
*
* @return {String}
* @method id
*/
Component.prototype.id = function id() {
return this.id_;
};
/**
* Get the component's name. The name is often used to reference the component.
* ```js
* var name = myComponent.name();
* ```
*
* @return {String}
* @method name
*/
Component.prototype.name = function name() {
return this.name_;
};
/**
* Get an array of all child components
* ```js
* var kids = myComponent.children();
* ```
*
* @return {Array} The children
* @method children
*/
Component.prototype.children = function children() {
return this.children_;
};
/**
* Returns a child component with the provided ID
*
* @return {Component}
* @method getChildById
*/
Component.prototype.getChildById = function getChildById(id) {
return this.childIndex_[id];
};
/**
* Returns a child component with the provided name
*
* @return {Component}
* @method getChild
*/
Component.prototype.getChild = function getChild(name) {
return this.childNameIndex_[name];
};
/**
* Adds a child component inside this component
* ```js
* myComponent.el();
* // ->
* myComponent.children();
* // [empty array]
*
* var myButton = myComponent.addChild('MyButton');
* // ->
myButton
* // -> myButton === myComponent.children()[0];
* ```
* Pass in options for child constructors and options for children of the child
* ```js
* var myButton = myComponent.addChild('MyButton', {
* text: 'Press Me',
* buttonChildExample: {
* buttonChildOption: true
* }
* });
* ```
*
* @param {String|Component} child The class name or instance of a child to add
* @param {Object=} options Options, including options to be passed to children of the child.
* @param {Number} index into our children array to attempt to add the child
* @return {Component} The child component (created by this process if a string was used)
* @method addChild
*/
Component.prototype.addChild = function addChild(child) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var index = arguments.length <= 2 || arguments[2] === undefined ? this.children_.length : arguments[2];
var component = undefined;
var componentName = undefined;
// If child is a string, create nt with options
if (typeof child === 'string') {
componentName = child;
// Options can also be specified as a boolean, so convert to an empty object if false.
if (!options) {
options = {};
}
// Same as above, but true is deprecated so show a warning.
if (options === true) {
_utilsLogJs2['default'].warn('Initializing a child component with `true` is deprecated. Children should be defined in an array when possible, but if necessary use an object instead of `true`.');
options = {};
}
// If no componentClass in options, assume componentClass is the name lowercased
// (e.g. playButton)
var componentClassName = options.componentClass || _utilsToTitleCaseJs2['default'](componentName);
// Set name through options
options.name = componentName;
// Create a new object & element for this controls set
// If there's no .player_, this is a player
var ComponentClass = Component.getComponent(componentClassName);
if (!ComponentClass) {
throw new Error('Component ' + componentClassName + ' does not exist');
}
// data stored directly on the videojs object may be
// misidentified as a component to retain
// backwards-compatibility with 4.x. check to make sure the
// component class can be instantiated.
if (typeof ComponentClass !== 'function') {
return null;
}
component = new ComponentClass(this.player_ || this, options);
// child is a component instance
} else {
component = child;
}
this.children_.splice(index, 0, component);
if (typeof component.id === 'function') {
this.childIndex_[component.id()] = component;
}
// If a name wasn't used to create the component, check if we can use the
// name function of the component
componentName = componentName || component.name && component.name();
if (componentName) {
this.childNameIndex_[componentName] = component;
}
// Add the UI object's element to the container div (box)
// Having an element is not required
if (typeof component.el === 'function' && component.el()) {
var childNodes = this.contentEl().children;
var refNode = childNodes[index] || null;
this.contentEl().insertBefore(component.el(), refNode);
}
// Return so it can stored on parent object if desired.
return component;
};
/**
* Remove a child component from this component's list of children, and the
* child component's element from this component's element
*
* @param {Component} component Component to remove
* @method removeChild
*/
Component.prototype.removeChild = function removeChild(component) {
if (typeof component === 'string') {
component = this.getChild(component);
}
if (!component || !this.children_) {
return;
}
var childFound = false;
for (var i = this.children_.length - 1; i >= 0; i--) {
if (this.children_[i] === component) {
childFound = true;
this.children_.splice(i, 1);
break;
}
}
if (!childFound) {
return;
}
this.childIndex_[component.id()] = null;
this.childNameIndex_[component.name()] = null;
var compEl = component.el();
if (compEl && compEl.parentNode === this.contentEl()) {
this.contentEl().removeChild(component.el());
}
};
/**
* Add and initialize default child components from options
* ```js
* // when an instance of MyComponent is created, all children in options
* // will be added to the instance by their name strings and options
* MyComponent.prototype.options_ = {
* children: [
* 'myChildComponent'
* ],
* myChildComponent: {
* myChildOption: true
* }
* };
*
* // Or when creating the component
* var myComp = new MyComponent(player, {
* children: [
* 'myChildComponent'
* ],
* myChildComponent: {
* myChildOption: true
* }
* });
* ```
* The children option can also be an array of
* child options objects (that also include a 'name' key).
* This can be used if you have two child components of the
* same type that need different options.
* ```js
* var myComp = new MyComponent(player, {
* children: [
* 'button',
* {
* name: 'button',
* someOtherOption: true
* },
* {
* name: 'button',
* someOtherOption: false
* }
* ]
* });
* ```
*
* @method initChildren
*/
Component.prototype.initChildren = function initChildren() {
var _this = this;
var children = this.options_.children;
if (children) {
(function () {
// `this` is `parent`
var parentOptions = _this.options_;
var handleAdd = function handleAdd(child) {
var name = child.name;
var opts = child.opts;
// Allow options for children to be set at the parent options
// e.g. videojs(id, { controlBar: false });
// instead of videojs(id, { children: { controlBar: false });
if (parentOptions[name] !== undefined) {
opts = parentOptions[name];
}
// Allow for disabling default components
// e.g. options['children']['posterImage'] = false
if (opts === false) {
return;
}
// Allow options to be passed as a simple boolean if no configuration
// is necessary.
if (opts === true) {
opts = {};
}
// We also want to pass the original player options to each component as well so they don't need to
// reach back into the player for options later.
opts.playerOptions = _this.options_.playerOptions;
// Create and add the child component.
// Add a direct reference to the child by name on the parent instance.
// If two of the same component are used, different names should be supplied
// for each
var newChild = _this.addChild(name, opts);
if (newChild) {
_this[name] = newChild;
}
};
// Allow for an array of children details to passed in the options
var workingChildren = undefined;
var Tech = Component.getComponent('Tech');
if (Array.isArray(children)) {
workingChildren = children;
} else {
workingChildren = Object.keys(children);
}
workingChildren
// children that are in this.options_ but also in workingChildren would
// give us extra children we do not want. So, we want to filter them out.
.concat(Object.keys(_this.options_).filter(function (child) {
return !workingChildren.some(function (wchild) {
if (typeof wchild === 'string') {
return child === wchild;
} else {
return child === wchild.name;
}
});
})).map(function (child) {
var name = undefined,
opts = undefined;
if (typeof child === 'string') {
name = child;
opts = children[name] || _this.options_[name] || {};
} else {
name = child.name;
opts = child;
}
return { name: name, opts: opts };
}).filter(function (child) {
// we have to make sure that child.name isn't in the techOrder since
// techs are registerd as Components but can't aren't compatible
// See https://github.com/videojs/video.js/issues/2772
var c = Component.getComponent(child.opts.componentClass || _utilsToTitleCaseJs2['default'](child.name));
return c && !Tech.isTech(c);
}).forEach(handleAdd);
})();
}
};
/**
* Allows sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
Component.prototype.buildCSSClass = function buildCSSClass() {
// Child classes can include a function that does:
// return 'CLASS NAME' + this._super();
return '';
};
/**
* Add an event listener to this component's element
* ```js
* var myFunc = function(){
* var myComponent = this;
* // Do something when the event is fired
* };
*
* myComponent.on('eventType', myFunc);
* ```
* The context of myFunc will be myComponent unless previously bound.
* Alternatively, you can add a listener to another element or component.
* ```js
* myComponent.on(otherElement, 'eventName', myFunc);
* myComponent.on(otherComponent, 'eventName', myFunc);
* ```
* The benefit of using this over `VjsEvents.on(otherElement, 'eventName', myFunc)`
* and `otherComponent.on('eventName', myFunc)` is that this way the listeners
* will be automatically cleaned up when either component is disposed.
* It will also bind myComponent as the context of myFunc.
* **NOTE**: When using this on elements in the page other than window
* and document (both permanent), if you remove the element from the DOM
* you need to call `myComponent.trigger(el, 'dispose')` on it to clean up
* references to it and allow the browser to garbage collect it.
*
* @param {String|Component} first The event type or other component
* @param {Function|String} second The event handler or event type
* @param {Function} third The event handler
* @return {Component}
* @method on
*/
Component.prototype.on = function on(first, second, third) {
var _this2 = this;
if (typeof first === 'string' || Array.isArray(first)) {
Events.on(this.el_, first, Fn.bind(this, second));
// Targeting another component or element
} else {
(function () {
var target = first;
var type = second;
var fn = Fn.bind(_this2, third);
// When this component is disposed, remove the listener from the other component
var removeOnDispose = function removeOnDispose() {
return _this2.off(target, type, fn);
};
// Use the same function ID so we can remove it later it using the ID
// of the original listener
removeOnDispose.guid = fn.guid;
_this2.on('dispose', removeOnDispose);
// If the other component is disposed first we need to clean the reference
// to the other component in this component's removeOnDispose listener
// Otherwise we create a memory leak.
var cleanRemover = function cleanRemover() {
return _this2.off('dispose', removeOnDispose);
};
// Add the same function ID so we can easily remove it later
cleanRemover.guid = fn.guid;
// Check if this is a DOM node
if (first.nodeName) {
// Add the listener to the other element
Events.on(target, type, fn);
Events.on(target, 'dispose', cleanRemover);
// Should be a component
// Not using `instanceof Component` because it makes mock players difficult
} else if (typeof first.on === 'function') {
// Add the listener to the other component
target.on(type, fn);
target.on('dispose', cleanRemover);
}
})();
}
return this;
};
/**
* Remove an event listener from this component's element
* ```js
* myComponent.off('eventType', myFunc);
* ```
* If myFunc is excluded, ALL listeners for the event type will be removed.
* If eventType is excluded, ALL listeners will be removed from the component.
* Alternatively you can use `off` to remove listeners that were added to other
* elements or components using `myComponent.on(otherComponent...`.
* In this case both the event type and listener function are REQUIRED.
* ```js
* myComponent.off(otherElement, 'eventType', myFunc);
* myComponent.off(otherComponent, 'eventType', myFunc);
* ```
*
* @param {String=|Component} first The event type or other component
* @param {Function=|String} second The listener function or event type
* @param {Function=} third The listener for other component
* @return {Component}
* @method off
*/
Component.prototype.off = function off(first, second, third) {
if (!first || typeof first === 'string' || Array.isArray(first)) {
Events.off(this.el_, first, second);
} else {
var target = first;
var type = second;
// Ensure there's at least a guid, even if the function hasn't been used
var fn = Fn.bind(this, third);
// Remove the dispose listener on this component,
// which was given the same guid as the event listener
this.off('dispose', fn);
if (first.nodeName) {
// Remove the listener
Events.off(target, type, fn);
// Remove the listener for cleaning the dispose listener
Events.off(target, 'dispose', fn);
} else {
target.off(type, fn);
target.off('dispose', fn);
}
}
return this;
};
/**
* Add an event listener to be triggered only once and then removed
* ```js
* myComponent.one('eventName', myFunc);
* ```
* Alternatively you can add a listener to another element or component
* that will be triggered only once.
* ```js
* myComponent.one(otherElement, 'eventName', myFunc);
* myComponent.one(otherComponent, 'eventName', myFunc);
* ```
*
* @param {String|Component} first The event type or other component
* @param {Function|String} second The listener function or event type
* @param {Function=} third The listener function for other component
* @return {Component}
* @method one
*/
Component.prototype.one = function one(first, second, third) {
var _this3 = this,
_arguments = arguments;
if (typeof first === 'string' || Array.isArray(first)) {
Events.one(this.el_, first, Fn.bind(this, second));
} else {
(function () {
var target = first;
var type = second;
var fn = Fn.bind(_this3, third);
var newFunc = function newFunc() {
_this3.off(target, type, newFunc);
fn.apply(null, _arguments);
};
// Keep the same function ID so we can remove it later
newFunc.guid = fn.guid;
_this3.on(target, type, newFunc);
})();
}
return this;
};
/**
* Trigger an event on an element
* ```js
* myComponent.trigger('eventName');
* myComponent.trigger({'type':'eventName'});
* myComponent.trigger('eventName', {data: 'some data'});
* myComponent.trigger({'type':'eventName'}, {data: 'some data'});
* ```
*
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Component} self
* @method trigger
*/
Component.prototype.trigger = function trigger(event, hash) {
Events.trigger(this.el_, event, hash);
return this;
};
/**
* Bind a listener to the component's ready state.
* Different from event listeners in that if the ready event has already happened
* it will trigger the function immediately.
*
* @param {Function} fn Ready listener
* @param {Boolean} sync Exec the listener synchronously if component is ready
* @return {Component}
* @method ready
*/
Component.prototype.ready = function ready(fn) {
var sync = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
if (fn) {
if (this.isReady_) {
if (sync) {
fn.call(this);
} else {
// Call the function asynchronously by default for consistency
this.setTimeout(fn, 1);
}
} else {
this.readyQueue_ = this.readyQueue_ || [];
this.readyQueue_.push(fn);
}
}
return this;
};
/**
* Trigger the ready listeners
*
* @return {Component}
* @method triggerReady
*/
Component.prototype.triggerReady = function triggerReady() {
this.isReady_ = true;
// Ensure ready is triggerd asynchronously
this.setTimeout(function () {
var readyQueue = this.readyQueue_;
// Reset Ready Queue
this.readyQueue_ = [];
if (readyQueue && readyQueue.length > 0) {
readyQueue.forEach(function (fn) {
fn.call(this);
}, this);
}
// Allow for using event listeners also
this.trigger('ready');
}, 1);
};
/**
* Finds a single DOM element matching `selector` within the component's
* `contentEl` or another custom context.
*
* @method $
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelector`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {Element|null}
*/
Component.prototype.$ = function $(selector, context) {
return Dom.$(selector, context || this.contentEl());
};
/**
* Finds a all DOM elements matching `selector` within the component's
* `contentEl` or another custom context.
*
* @method $$
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelectorAll`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {NodeList}
*/
Component.prototype.$$ = function $$(selector, context) {
return Dom.$$(selector, context || this.contentEl());
};
/**
* Check if a component's element has a CSS class name
*
* @param {String} classToCheck Classname to check
* @return {Component}
* @method hasClass
*/
Component.prototype.hasClass = function hasClass(classToCheck) {
return Dom.hasElClass(this.el_, classToCheck);
};
/**
* Add a CSS class name to the component's element
*
* @param {String} classToAdd Classname to add
* @return {Component}
* @method addClass
*/
Component.prototype.addClass = function addClass(classToAdd) {
Dom.addElClass(this.el_, classToAdd);
return this;
};
/**
* Remove a CSS class name from the component's element
*
* @param {String} classToRemove Classname to remove
* @return {Component}
* @method removeClass
*/
Component.prototype.removeClass = function removeClass(classToRemove) {
Dom.removeElClass(this.el_, classToRemove);
return this;
};
/**
* Add or remove a CSS class name from the component's element
*
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*
* @return {Component}
* @method toggleClass
*/
Component.prototype.toggleClass = function toggleClass(classToToggle, predicate) {
Dom.toggleElClass(this.el_, classToToggle, predicate);
return this;
};
/**
* Show the component element if hidden
*
* @return {Component}
* @method show
*/
Component.prototype.show = function show() {
this.removeClass('vjs-hidden');
return this;
};
/**
* Hide the component element if currently showing
*
* @return {Component}
* @method hide
*/
Component.prototype.hide = function hide() {
this.addClass('vjs-hidden');
return this;
};
/**
* Lock an item in its visible state
* To be used with fadeIn/fadeOut.
*
* @return {Component}
* @private
* @method lockShowing
*/
Component.prototype.lockShowing = function lockShowing() {
this.addClass('vjs-lock-showing');
return this;
};
/**
* Unlock an item to be hidden
* To be used with fadeIn/fadeOut.
*
* @return {Component}
* @private
* @method unlockShowing
*/
Component.prototype.unlockShowing = function unlockShowing() {
this.removeClass('vjs-lock-showing');
return this;
};
/**
* Set or get the width of the component (CSS values)
* Setting the video tag dimension values only works with values in pixels.
* Percent values will not work.
* Some percents can be used, but width()/height() will return the number + %,
* not the actual computed width/height.
*
* @param {Number|String=} num Optional width number
* @param {Boolean} skipListeners Skip the 'resize' event trigger
* @return {Component} This component, when setting the width
* @return {Number|String} The width, when getting
* @method width
*/
Component.prototype.width = function width(num, skipListeners) {
return this.dimension('width', num, skipListeners);
};
/**
* Get or set the height of the component (CSS values)
* Setting the video tag dimension values only works with values in pixels.
* Percent values will not work.
* Some percents can be used, but width()/height() will return the number + %,
* not the actual computed width/height.
*
* @param {Number|String=} num New component height
* @param {Boolean=} skipListeners Skip the resize event trigger
* @return {Component} This component, when setting the height
* @return {Number|String} The height, when getting
* @method height
*/
Component.prototype.height = function height(num, skipListeners) {
return this.dimension('height', num, skipListeners);
};
/**
* Set both width and height at the same time
*
* @param {Number|String} width Width of player
* @param {Number|String} height Height of player
* @return {Component} The component
* @method dimensions
*/
Component.prototype.dimensions = function dimensions(width, height) {
// Skip resize listeners on width for optimization
return this.width(width, true).height(height);
};
/**
* Get or set width or height
* This is the shared code for the width() and height() methods.
* All for an integer, integer + 'px' or integer + '%';
* Known issue: Hidden elements officially have a width of 0. We're defaulting
* to the style.width value and falling back to computedStyle which has the
* hidden element issue. Info, but probably not an efficient fix:
* http://www.foliotek.com/devblog/getting-the-width-of-a-hidden-element-with-jquery-using-width/
*
* @param {String} widthOrHeight 'width' or 'height'
* @param {Number|String=} num New dimension
* @param {Boolean=} skipListeners Skip resize event trigger
* @return {Component} The component if a dimension was set
* @return {Number|String} The dimension if nothing was set
* @private
* @method dimension
*/
Component.prototype.dimension = function dimension(widthOrHeight, num, skipListeners) {
if (num !== undefined) {
// Set to zero if null or literally NaN (NaN !== NaN)
if (num === null || num !== num) {
num = 0;
}
// Check if using css width/height (% or px) and adjust
if (('' + num).indexOf('%') !== -1 || ('' + num).indexOf('px') !== -1) {
this.el_.style[widthOrHeight] = num;
} else if (num === 'auto') {
this.el_.style[widthOrHeight] = '';
} else {
this.el_.style[widthOrHeight] = num + 'px';
}
// skipListeners allows us to avoid triggering the resize event when setting both width and height
if (!skipListeners) {
this.trigger('resize');
}
// Return component
return this;
}
// Not setting a value, so getting it
// Make sure element exists
if (!this.el_) {
return 0;
}
// Get dimension value from style
var val = this.el_.style[widthOrHeight];
var pxIndex = val.indexOf('px');
if (pxIndex !== -1) {
// Return the pixel value with no 'px'
return parseInt(val.slice(0, pxIndex), 10);
}
// No px so using % or no style was set, so falling back to offsetWidth/height
// If component has display:none, offset will return 0
// TODO: handle display:none and no dimension style using px
return parseInt(this.el_['offset' + _utilsToTitleCaseJs2['default'](widthOrHeight)], 10);
};
/**
* Get width or height of computed style
* @param {String} widthOrHeight 'width' or 'height'
* @return {Number|Boolean} The bolean false if nothing was set
* @method currentDimension
*/
Component.prototype.currentDimension = function currentDimension(widthOrHeight) {
var computedWidthOrHeight = 0;
if (widthOrHeight !== 'width' && widthOrHeight !== 'height') {
throw new Error('currentDimension only accepts width or height value');
}
if (typeof _globalWindow2['default'].getComputedStyle === 'function') {
var computedStyle = _globalWindow2['default'].getComputedStyle(this.el_);
computedWidthOrHeight = computedStyle.getPropertyValue(widthOrHeight) || computedStyle[widthOrHeight];
} else if (this.el_.currentStyle) {
// ie 8 doesn't support computed style, shim it
// return clientWidth or clientHeight instead for better accuracy
var rule = 'offset' + _utilsToTitleCaseJs2['default'](widthOrHeight);
computedWidthOrHeight = this.el_[rule];
}
// remove 'px' from variable and parse as integer
computedWidthOrHeight = parseFloat(computedWidthOrHeight);
return computedWidthOrHeight;
};
/**
* Get an object which contains width and height values of computed style
* @return {Object} The dimensions of element
* @method currentDimensions
*/
Component.prototype.currentDimensions = function currentDimensions() {
return {
width: this.currentDimension('width'),
height: this.currentDimension('height')
};
};
/**
* Get width of computed style
* @return {Integer}
* @method currentWidth
*/
Component.prototype.currentWidth = function currentWidth() {
return this.currentDimension('width');
};
/**
* Get height of computed style
* @return {Integer}
* @method currentHeight
*/
Component.prototype.currentHeight = function currentHeight() {
return this.currentDimension('height');
};
/**
* Emit 'tap' events when touch events are supported
* This is used to support toggling the controls through a tap on the video.
* We're requiring them to be enabled because otherwise every component would
* have this extra overhead unnecessarily, on mobile devices where extra
* overhead is especially bad.
*
* @private
* @method emitTapEvents
*/
Component.prototype.emitTapEvents = function emitTapEvents() {
// Track the start time so we can determine how long the touch lasted
var touchStart = 0;
var firstTouch = null;
// Maximum movement allowed during a touch event to still be considered a tap
// Other popular libs use anywhere from 2 (hammer.js) to 15, so 10 seems like a nice, round number.
var tapMovementThreshold = 10;
// The maximum length a touch can be while still being considered a tap
var touchTimeThreshold = 200;
var couldBeTap = undefined;
this.on('touchstart', function (event) {
// If more than one finger, don't consider treating this as a click
if (event.touches.length === 1) {
// Copy the touches object to prevent modifying the original
firstTouch = _objectAssign2['default']({}, event.touches[0]);
// Record start time so we can detect a tap vs. "touch and hold"
touchStart = new Date().getTime();
// Reset couldBeTap tracking
couldBeTap = true;
}
});
this.on('touchmove', function (event) {
// If more than one finger, don't consider treating this as a click
if (event.touches.length > 1) {
couldBeTap = false;
} else if (firstTouch) {
// Some devices will throw touchmoves for all but the slightest of taps.
// So, if we moved only a small distance, this could still be a tap
var xdiff = event.touches[0].pageX - firstTouch.pageX;
var ydiff = event.touches[0].pageY - firstTouch.pageY;
var touchDistance = Math.sqrt(xdiff * xdiff + ydiff * ydiff);
if (touchDistance > tapMovementThreshold) {
couldBeTap = false;
}
}
});
var noTap = function noTap() {
couldBeTap = false;
};
// TODO: Listen to the original target. http://youtu.be/DujfpXOKUp8?t=13m8s
this.on('touchleave', noTap);
this.on('touchcancel', noTap);
// When the touch ends, measure how long it took and trigger the appropriate
// event
this.on('touchend', function (event) {
firstTouch = null;
// Proceed only if the touchmove/leave/cancel event didn't happen
if (couldBeTap === true) {
// Measure how long the touch lasted
var touchTime = new Date().getTime() - touchStart;
// Make sure the touch was less than the threshold to be considered a tap
if (touchTime < touchTimeThreshold) {
// Don't let browser turn this into a click
event.preventDefault();
this.trigger('tap');
// It may be good to copy the touchend event object and change the
// type to tap, if the other event properties aren't exact after
// Events.fixEvent runs (e.g. event.target)
}
}
});
};
/**
* Report user touch activity when touch events occur
* User activity is used to determine when controls should show/hide. It's
* relatively simple when it comes to mouse events, because any mouse event
* should show the controls. So we capture mouse events that bubble up to the
* player and report activity when that happens.
* With touch events it isn't as easy. We can't rely on touch events at the
* player level, because a tap (touchstart + touchend) on the video itself on
* mobile devices is meant to turn controls off (and on). User activity is
* checked asynchronously, so what could happen is a tap event on the video
* turns the controls off, then the touchend event bubbles up to the player,
* which if it reported user activity, would turn the controls right back on.
* (We also don't want to completely block touch events from bubbling up)
* Also a touchmove, touch+hold, and anything other than a tap is not supposed
* to turn the controls back on on a mobile device.
* Here we're setting the default component behavior to report user activity
* whenever touch events happen, and this can be turned off by components that
* want touch events to act differently.
*
* @method enableTouchActivity
*/
Component.prototype.enableTouchActivity = function enableTouchActivity() {
// Don't continue if the root player doesn't support reporting user activity
if (!this.player() || !this.player().reportUserActivity) {
return;
}
// listener for reporting that the user is active
var report = Fn.bind(this.player(), this.player().reportUserActivity);
var touchHolding = undefined;
this.on('touchstart', function () {
report();
// For as long as the they are touching the device or have their mouse down,
// we consider them active even if they're not moving their finger or mouse.
// So we want to continue to update that they are active
this.clearInterval(touchHolding);
// report at the same interval as activityCheck
touchHolding = this.setInterval(report, 250);
});
var touchEnd = function touchEnd(event) {
report();
// stop the interval that maintains activity if the touch is holding
this.clearInterval(touchHolding);
};
this.on('touchmove', report);
this.on('touchend', touchEnd);
this.on('touchcancel', touchEnd);
};
/**
* Creates timeout and sets up disposal automatically.
*
* @param {Function} fn The function to run after the timeout.
* @param {Number} timeout Number of ms to delay before executing specified function.
* @return {Number} Returns the timeout ID
* @method setTimeout
*/
Component.prototype.setTimeout = function setTimeout(fn, timeout) {
fn = Fn.bind(this, fn);
// window.setTimeout would be preferable here, but due to some bizarre issue with Sinon and/or Phantomjs, we can't.
var timeoutId = _globalWindow2['default'].setTimeout(fn, timeout);
var disposeFn = function disposeFn() {
this.clearTimeout(timeoutId);
};
disposeFn.guid = 'vjs-timeout-' + timeoutId;
this.on('dispose', disposeFn);
return timeoutId;
};
/**
* Clears a timeout and removes the associated dispose listener
*
* @param {Number} timeoutId The id of the timeout to clear
* @return {Number} Returns the timeout ID
* @method clearTimeout
*/
Component.prototype.clearTimeout = function clearTimeout(timeoutId) {
_globalWindow2['default'].clearTimeout(timeoutId);
var disposeFn = function disposeFn() {};
disposeFn.guid = 'vjs-timeout-' + timeoutId;
this.off('dispose', disposeFn);
return timeoutId;
};
/**
* Creates an interval and sets up disposal automatically.
*
* @param {Function} fn The function to run every N seconds.
* @param {Number} interval Number of ms to delay before executing specified function.
* @return {Number} Returns the interval ID
* @method setInterval
*/
Component.prototype.setInterval = function setInterval(fn, interval) {
fn = Fn.bind(this, fn);
var intervalId = _globalWindow2['default'].setInterval(fn, interval);
var disposeFn = function disposeFn() {
this.clearInterval(intervalId);
};
disposeFn.guid = 'vjs-interval-' + intervalId;
this.on('dispose', disposeFn);
return intervalId;
};
/**
* Clears an interval and removes the associated dispose listener
*
* @param {Number} intervalId The id of the interval to clear
* @return {Number} Returns the interval ID
* @method clearInterval
*/
Component.prototype.clearInterval = function clearInterval(intervalId) {
_globalWindow2['default'].clearInterval(intervalId);
var disposeFn = function disposeFn() {};
disposeFn.guid = 'vjs-interval-' + intervalId;
this.off('dispose', disposeFn);
return intervalId;
};
/**
* Registers a component
*
* @param {String} name Name of the component to register
* @param {Object} comp The component to register
* @static
* @method registerComponent
*/
Component.registerComponent = function registerComponent(name, comp) {
if (!Component.components_) {
Component.components_ = {};
}
Component.components_[name] = comp;
return comp;
};
/**
* Gets a component by name
*
* @param {String} name Name of the component to get
* @return {Component}
* @static
* @method getComponent
*/
Component.getComponent = function getComponent(name) {
if (Component.components_ && Component.components_[name]) {
return Component.components_[name];
}
if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
_utilsLogJs2['default'].warn('The ' + name + ' component was added to the videojs object when it should be registered using videojs.registerComponent(name, component)');
return _globalWindow2['default'].videojs[name];
}
};
/**
* Sets up the constructor using the supplied init method
* or uses the init of the parent object
*
* @param {Object} props An object of properties
* @static
* @deprecated
* @method extend
*/
Component.extend = function extend(props) {
props = props || {};
_utilsLogJs2['default'].warn('Component.extend({}) has been deprecated, use videojs.extend(Component, {}) instead');
// Set up the constructor using the supplied init method
// or using the init of the parent object
// Make sure to check the unobfuscated version for external libs
var init = props.init || props.init || this.prototype.init || this.prototype.init || function () {};
// In Resig's simple class inheritance (previously used) the constructor
// is a function that calls `this.init.apply(arguments)`
// However that would prevent us from using `ParentObject.call(this);`
// in a Child constructor because the `this` in `this.init`
// would still refer to the Child and cause an infinite loop.
// We would instead have to do
// `ParentObject.prototype.init.apply(this, arguments);`
// Bleh. We're not creating a _super() function, so it's good to keep
// the parent constructor reference simple.
var subObj = function subObj() {
init.apply(this, arguments);
};
// Inherit from this object's prototype
subObj.prototype = Object.create(this.prototype);
// Reset the constructor property for subObj otherwise
// instances of subObj would have the constructor of the parent Object
subObj.prototype.constructor = subObj;
// Make the class extendable
subObj.extend = Component.extend;
// Extend subObj's prototype with functions and other properties from props
for (var _name in props) {
if (props.hasOwnProperty(_name)) {
subObj.prototype[_name] = props[_name];
}
}
return subObj;
};
return Component;
})();
Component.registerComponent('Component', Component);
exports['default'] = Component;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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KlxuICogQGZpbGUgY29tcG9uZW50LmpzXG4gKlxuICogUGxheWVyIENvbXBvbmVudCAtIEJhc2UgY2xhc3MgZm9yIGFsbCBVSSBvYmplY3RzXG4gKi9cblxuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCAqIGFzIERvbSBmcm9tICcuL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuL3V0aWxzL2ZuLmpzJztcbmltcG9ydCAqIGFzIEd1aWQgZnJvbSAnLi91dGlscy9ndWlkLmpzJztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB0b1RpdGxlQ2FzZSBmcm9tICcuL3V0aWxzL3RvLXRpdGxlLWNhc2UuanMnO1xuaW1wb3J0IGFzc2lnbiBmcm9tICdvYmplY3QuYXNzaWduJztcbmltcG9ydCBtZXJnZU9wdGlvbnMgZnJvbSAnLi91dGlscy9tZXJnZS1vcHRpb25zLmpzJztcblxuXG4vKipcbiAqIEJhc2UgVUkgQ29tcG9uZW50IGNsYXNzXG4gKiBDb21wb25lbnRzIGFyZSBlbWJlZGRhYmxlIFVJIG9iamVjdHMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgYm90aCBhXG4gKiBqYXZhc2NyaXB0IG9iamVjdCBhbmQgYW4gZWxlbWVudCBpbiB0aGUgRE9NLiBUaGV5IGNhbiBiZSBjaGlsZHJlbiBvZiBvdGhlclxuICogY29tcG9uZW50cywgYW5kIGNhbiBoYXZlIG1hbnkgY2hpbGRyZW4gdGhlbXNlbHZlcy5cbiAqIGBgYGpzXG4gKiAgICAgLy8gYWRkaW5nIGEgYnV0dG9uIHRvIHRoZSBwbGF5ZXJcbiAqICAgICB2YXIgYnV0dG9uID0gcGxheWVyLmFkZENoaWxkKCdidXR0b24nKTtcbiAqICAgICBidXR0b24uZWwoKTsgLy8gLT4gYnV0dG9uIGVsZW1lbnRcbiAqIGBgYFxuICogYGBgaHRtbFxuICogICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1qc1wiPlxuICogICAgICAgPGRpdiBjbGFzcz1cInZqcy1idXR0b25cIj5CdXR0b248L2Rpdj5cbiAqICAgICA8L2Rpdj5cbiAqIGBgYFxuICogQ29tcG9uZW50cyBhcmUgYWxzbyBldmVudCB0YXJnZXRzLlxuICogYGBganNcbiAqICAgICBidXR0b24ub24oJ2NsaWNrJywgZnVuY3Rpb24oKXtcbiAqICAgICAgIGNvbnNvbGUubG9nKCdCdXR0b24gQ2xpY2tlZCEnKTtcbiAqICAgICB9KTtcbiAqICAgICBidXR0b24udHJpZ2dlcignY3VzdG9tZXZlbnQnKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwbGF5ZXIgIE1haW4gUGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBjbGFzcyBDb21wb25lbnRcbiAqL1xuY2xhc3MgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KSB7XG5cbiAgICAvLyBUaGUgY29tcG9uZW50IG1pZ2h0IGJlIHRoZSBwbGF5ZXIgaXRzZWxmIGFuZCB3ZSBjYW4ndCBwYXNzIGB0aGlzYCB0byBzdXBlclxuICAgIGlmICghcGxheWVyICYmIHRoaXMucGxheSkge1xuICAgICAgdGhpcy5wbGF5ZXJfID0gcGxheWVyID0gdGhpczsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8gPSBwbGF5ZXI7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBhIGNvcHkgb2YgcHJvdG90eXBlLm9wdGlvbnNfIHRvIHByb3RlY3QgYWdhaW5zdCBvdmVycmlkaW5nIGRlZmF1bHRzXG4gICAgdGhpcy5vcHRpb25zXyA9IG1lcmdlT3B0aW9ucyh7fSwgdGhpcy5vcHRpb25zXyk7XG5cbiAgICAvLyBVcGRhdGVkIG9wdGlvbnMgd2l0aCBzdXBwbGllZCBvcHRpb25zXG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9uc18gPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXywgb3B0aW9ucyk7XG5cbiAgICAvLyBHZXQgSUQgZnJvbSBvcHRpb25zIG9yIG9wdGlvbnMgZWxlbWVudCBpZiBvbmUgaXMgc3VwcGxpZWRcbiAgICB0aGlzLmlkXyA9IG9wdGlvbnMuaWQgfHwgKG9wdGlvbnMuZWwgJiYgb3B0aW9ucy5lbC5pZCk7XG5cbiAgICAvLyBJZiB0aGVyZSB3YXMgbm8gSUQgZnJvbSB0aGUgb3B0aW9ucywgZ2VuZXJhdGUgb25lXG4gICAgaWYgKCF0aGlzLmlkXykge1xuICAgICAgLy8gRG9uJ3QgcmVxdWlyZSB0aGUgcGxheWVyIElEIGZ1bmN0aW9uIGluIHRoZSBjYXNlIG9mIG1vY2sgcGxheWVyc1xuICAgICAgbGV0IGlkID0gcGxheWVyICYmIHBsYXllci5pZCAmJiBwbGF5ZXIuaWQoKSB8fCAnbm9fcGxheWVyJztcblxuICAgICAgdGhpcy5pZF8gPSBgJHtpZH1fY29tcG9uZW50XyR7R3VpZC5uZXdHVUlEKCl9YDtcbiAgICB9XG5cbiAgICB0aGlzLm5hbWVfID0gb3B0aW9ucy5uYW1lIHx8IG51bGw7XG5cbiAgICAvLyBDcmVhdGUgZWxlbWVudCBpZiBvbmUgd2Fzbid0IHByb3ZpZGVkIGluIG9wdGlvbnNcbiAgICBpZiAob3B0aW9ucy5lbCkge1xuICAgICAgdGhpcy5lbF8gPSBvcHRpb25zLmVsO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5jcmVhdGVFbCAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZWxfID0gdGhpcy5jcmVhdGVFbCgpO1xuICAgIH1cblxuICAgIHRoaXMuY2hpbGRyZW5fID0gW107XG4gICAgdGhpcy5jaGlsZEluZGV4XyA9IHt9O1xuICAgIHRoaXMuY2hpbGROYW1lSW5kZXhfID0ge307XG5cbiAgICAvLyBBZGQgYW55IGNoaWxkIGNvbXBvbmVudHMgaW4gb3B0aW9uc1xuICAgIGlmIChvcHRpb25zLmluaXRDaGlsZHJlbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuaW5pdENoaWxkcmVuKCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZWFkeShyZWFkeSk7XG4gICAgLy8gRG9uJ3Qgd2FudCB0byB0cmlnZ2VyIHJlYWR5IGhlcmUgb3IgaXQgd2lsbCBiZWZvcmUgaW5pdCBpcyBhY3R1YWxseVxuICAgIC8vIGZpbmlzaGVkIGZvciBhbGwgY2hpbGRyZW4gdGhhdCBydW4gdGhpcyBjb25zdHJ1Y3RvclxuXG4gICAgaWYgKG9wdGlvbnMucmVwb3J0VG91Y2hBY3Rpdml0eSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZW5hYmxlVG91Y2hBY3Rpdml0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIG9mIHRoZSBjb21wb25lbnQgYW5kIGFsbCBjaGlsZCBjb21wb25lbnRzXG4gICAqXG4gICAqIEBtZXRob2QgZGlzcG9zZVxuICAgKi9cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLnRyaWdnZXIoeyB0eXBlOiAnZGlzcG9zZScsIGJ1YmJsZXM6IGZhbHNlIH0pO1xuXG4gICAgLy8gRGlzcG9zZSBhbGwgY2hpbGRyZW4uXG4gICAgaWYgKHRoaXMuY2hpbGRyZW5fKSB7XG4gICAgICBmb3IgKGxldCBpID0gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5fW2ldLmRpc3Bvc2UpIHtcbiAgICAgICAgICB0aGlzLmNoaWxkcmVuX1tpXS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWxldGUgY2hpbGQgcmVmZXJlbmNlc1xuICAgIHRoaXMuY2hpbGRyZW5fID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkSW5kZXhfID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4XyA9IG51bGw7XG5cbiAgICAvLyBSZW1vdmUgYWxsIGV2ZW50IGxpc3RlbmVycy5cbiAgICB0aGlzLm9mZigpO1xuXG4gICAgLy8gUmVtb3ZlIGVsZW1lbnQgZnJvbSBET01cbiAgICBpZiAodGhpcy5lbF8ucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy5lbF8ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsXyk7XG4gICAgfVxuXG4gICAgRG9tLnJlbW92ZUVsRGF0YSh0aGlzLmVsXyk7XG4gICAgdGhpcy5lbF8gPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY29tcG9uZW50J3MgcGxheWVyXG4gICAqXG4gICAqIEByZXR1cm4ge1BsYXllcn1cbiAgICogQG1ldGhvZCBwbGF5ZXJcbiAgICovXG4gIHBsYXllcigpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5ZXJfO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZXAgbWVyZ2Ugb2Ygb3B0aW9ucyBvYmplY3RzXG4gICAqIFdoZW5ldmVyIGEgcHJvcGVydHkgaXMgYW4gb2JqZWN0IG9uIGJvdGggb3B0aW9ucyBvYmplY3RzXG4gICAqIHRoZSB0d28gcHJvcGVydGllcyB3aWxsIGJlIG1lcmdlZCB1c2luZyBtZXJnZU9wdGlvbnMuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqICAgICBQYXJlbnQucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICAgKiAgICAgICBvcHRpb25TZXQ6IHtcbiAgICogICAgICAgICAnY2hpbGRPbmUnOiB7ICdmb28nOiAnYmFyJywgJ2FzZGYnOiAnZmRzYScgfSxcbiAgICogICAgICAgICAnY2hpbGRUd28nOiB7fSxcbiAgICogICAgICAgICAnY2hpbGRUaHJlZSc6IHt9XG4gICAqICAgICAgIH1cbiAgICogICAgIH1cbiAgICogICAgIG5ld09wdGlvbnMgPSB7XG4gICAqICAgICAgIG9wdGlvblNldDoge1xuICAgKiAgICAgICAgICdjaGlsZE9uZSc6IHsgJ2Zvbyc6ICdiYXonLCAnYWJjJzogJzEyMycgfVxuICAgKiAgICAgICAgICdjaGlsZFR3byc6IG51bGwsXG4gICAqICAgICAgICAgJ2NoaWxkRm91cic6IHt9XG4gICAqICAgICAgIH1cbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIHRoaXMub3B0aW9ucyhuZXdPcHRpb25zKTtcbiAgICogYGBgXG4gICAqIFJFU1VMVFxuICAgKiBgYGBqc1xuICAgKiAgICAge1xuICAgKiAgICAgICBvcHRpb25TZXQ6IHtcbiAgICogICAgICAgICAnY2hpbGRPbmUnOiB7ICdmb28nOiAnYmF6JywgJ2FzZGYnOiAnZmRzYScsICdhYmMnOiAnMTIzJyB9LFxuICAgKiAgICAgICAgICdjaGlsZFR3byc6IG51bGwsIC8vIERpc2FibGVkLiBXb24ndCBiZSBpbml0aWFsaXplZC5cbiAgICogICAgICAgICAnY2hpbGRUaHJlZSc6IHt9LFxuICAgKiAgICAgICAgICdjaGlsZEZvdXInOiB7fVxuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9iaiBPYmplY3Qgb2YgbmV3IG9wdGlvbiB2YWx1ZXNcbiAgICogQHJldHVybiB7T2JqZWN0fSAgICAgQSBORVcgb2JqZWN0IG9mIHRoaXMub3B0aW9uc18gYW5kIG9iaiBtZXJnZWRcbiAgICogQG1ldGhvZCBvcHRpb25zXG4gICAqL1xuICBvcHRpb25zKG9iaikge1xuICAgIGxvZy53YXJuKCd0aGlzLm9wdGlvbnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjb25zdHJ1Y3RvciBpbiA2LjAnKTtcblxuICAgIGlmICghb2JqKSB7XG4gICAgICByZXR1cm4gdGhpcy5vcHRpb25zXztcbiAgICB9XG5cbiAgICB0aGlzLm9wdGlvbnNfID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9uc18sIG9iaik7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc187XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKiBgYGBqc1xuICAgKiAgICAgdmFyIGRvbUVsID0gbXlDb21wb25lbnQuZWwoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgZWxcbiAgICovXG4gIGVsKCkge1xuICAgIHJldHVybiB0aGlzLmVsXztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZz19IHRhZ05hbWUgIEVsZW1lbnQncyBub2RlIHR5cGUuIGUuZy4gJ2RpdidcbiAgICogQHBhcmFtICB7T2JqZWN0PX0gcHJvcGVydGllcyBBbiBvYmplY3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBzZXRcbiAgICogQHBhcmFtICB7T2JqZWN0PX0gYXR0cmlidXRlcyBBbiBvYmplY3Qgb2YgYXR0cmlidXRlcyB0aGF0IHNob3VsZCBiZSBzZXRcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwodGFnTmFtZSwgcHJvcGVydGllcywgYXR0cmlidXRlcykge1xuICAgIHJldHVybiBEb20uY3JlYXRlRWwodGFnTmFtZSwgcHJvcGVydGllcywgYXR0cmlidXRlcyk7XG4gIH1cblxuICBsb2NhbGl6ZShzdHJpbmcpIHtcbiAgICBsZXQgY29kZSA9IHRoaXMucGxheWVyXy5sYW5ndWFnZSAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2UoKTtcbiAgICBsZXQgbGFuZ3VhZ2VzID0gdGhpcy5wbGF5ZXJfLmxhbmd1YWdlcyAmJiB0aGlzLnBsYXllcl8ubGFuZ3VhZ2VzKCk7XG5cbiAgICBpZiAoIWNvZGUgfHwgIWxhbmd1YWdlcykge1xuICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBsZXQgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbY29kZV07XG5cbiAgICBpZiAobGFuZ3VhZ2UgJiYgbGFuZ3VhZ2Vbc3RyaW5nXSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlW3N0cmluZ107XG4gICAgfVxuXG4gICAgbGV0IHByaW1hcnlDb2RlID0gY29kZS5zcGxpdCgnLScpWzBdO1xuICAgIGxldCBwcmltYXJ5TGFuZyA9IGxhbmd1YWdlc1twcmltYXJ5Q29kZV07XG5cbiAgICBpZiAocHJpbWFyeUxhbmcgJiYgcHJpbWFyeUxhbmdbc3RyaW5nXSkge1xuICAgICAgcmV0dXJuIHByaW1hcnlMYW5nW3N0cmluZ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50IHdoZXJlIGNoaWxkcmVuIGFyZSBpbnNlcnRlZC5cbiAgICogV2lsbCBlaXRoZXIgYmUgdGhlIHNhbWUgYXMgZWwoKSBvciBhIG5ldyBlbGVtZW50IGRlZmluZWQgaW4gY3JlYXRlRWwoKS5cbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjb250ZW50RWxcbiAgICovXG4gIGNvbnRlbnRFbCgpIHtcbiAgICByZXR1cm4gdGhpcy5jb250ZW50RWxfIHx8IHRoaXMuZWxfO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgY29tcG9uZW50J3MgSURcbiAgICogYGBganNcbiAgICogICAgIHZhciBpZCA9IG15Q29tcG9uZW50LmlkKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBtZXRob2QgaWRcbiAgICovXG4gIGlkKCkge1xuICAgIHJldHVybiB0aGlzLmlkXztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBvbmVudCdzIG5hbWUuIFRoZSBuYW1lIGlzIG9mdGVuIHVzZWQgdG8gcmVmZXJlbmNlIHRoZSBjb21wb25lbnQuXG4gICAqIGBgYGpzXG4gICAqICAgICB2YXIgbmFtZSA9IG15Q29tcG9uZW50Lm5hbWUoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICogQG1ldGhvZCBuYW1lXG4gICAqL1xuICBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLm5hbWVfO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBhbGwgY2hpbGQgY29tcG9uZW50c1xuICAgKiBgYGBqc1xuICAgKiAgICAgdmFyIGtpZHMgPSBteUNvbXBvbmVudC5jaGlsZHJlbigpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7QXJyYXl9IFRoZSBjaGlsZHJlblxuICAgKiBAbWV0aG9kIGNoaWxkcmVuXG4gICAqL1xuICBjaGlsZHJlbigpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZHJlbl87XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNoaWxkIGNvbXBvbmVudCB3aXRoIHRoZSBwcm92aWRlZCBJRFxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2QgZ2V0Q2hpbGRCeUlkXG4gICAqL1xuICBnZXRDaGlsZEJ5SWQoaWQpIHtcbiAgICByZXR1cm4gdGhpcy5jaGlsZEluZGV4X1tpZF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNoaWxkIGNvbXBvbmVudCB3aXRoIHRoZSBwcm92aWRlZCBuYW1lXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQG1ldGhvZCBnZXRDaGlsZFxuICAgKi9cbiAgZ2V0Q2hpbGQobmFtZSkge1xuICAgIHJldHVybiB0aGlzLmNoaWxkTmFtZUluZGV4X1tuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgY2hpbGQgY29tcG9uZW50IGluc2lkZSB0aGlzIGNvbXBvbmVudFxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlDb21wb25lbnQuZWwoKTtcbiAgICogICAgIC8vIC0+IDxkaXYgY2xhc3M9J215LWNvbXBvbmVudCc+PC9kaXY+XG4gICAqICAgICBteUNvbXBvbmVudC5jaGlsZHJlbigpO1xuICAgKiAgICAgLy8gW2VtcHR5IGFycmF5XVxuICAgKlxuICAgKiAgICAgdmFyIG15QnV0dG9uID0gbXlDb21wb25lbnQuYWRkQ2hpbGQoJ015QnV0dG9uJyk7XG4gICAqICAgICAvLyAtPiA8ZGl2IGNsYXNzPSdteS1jb21wb25lbnQnPjxkaXYgY2xhc3M9XCJteS1idXR0b25cIj5teUJ1dHRvbjxkaXY+PC9kaXY+XG4gICAqICAgICAvLyAtPiBteUJ1dHRvbiA9PT0gbXlDb21wb25lbnQuY2hpbGRyZW4oKVswXTtcbiAgICogYGBgXG4gICAqIFBhc3MgaW4gb3B0aW9ucyBmb3IgY2hpbGQgY29uc3RydWN0b3JzIGFuZCBvcHRpb25zIGZvciBjaGlsZHJlbiBvZiB0aGUgY2hpbGRcbiAgICogYGBganNcbiAgICogICAgIHZhciBteUJ1dHRvbiA9IG15Q29tcG9uZW50LmFkZENoaWxkKCdNeUJ1dHRvbicsIHtcbiAgICogICAgICAgdGV4dDogJ1ByZXNzIE1lJyxcbiAgICogICAgICAgYnV0dG9uQ2hpbGRFeGFtcGxlOiB7XG4gICAqICAgICAgICAgYnV0dG9uQ2hpbGRPcHRpb246IHRydWVcbiAgICogICAgICAgfVxuICAgKiAgICAgfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xDb21wb25lbnR9IGNoaWxkIFRoZSBjbGFzcyBuYW1lIG9yIGluc3RhbmNlIG9mIGEgY2hpbGQgdG8gYWRkXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zLCBpbmNsdWRpbmcgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gY2hpbGRyZW4gb2YgdGhlIGNoaWxkLlxuICAgKiBAcGFyYW0ge051bWJlcn0gaW5kZXggaW50byBvdXIgY2hpbGRyZW4gYXJyYXkgdG8gYXR0ZW1wdCB0byBhZGQgdGhlIGNoaWxkXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGNoaWxkIGNvbXBvbmVudCAoY3JlYXRlZCBieSB0aGlzIHByb2Nlc3MgaWYgYSBzdHJpbmcgd2FzIHVzZWQpXG4gICAqIEBtZXRob2QgYWRkQ2hpbGRcbiAgICovXG4gIGFkZENoaWxkKGNoaWxkLCBvcHRpb25zPXt9LCBpbmRleD10aGlzLmNoaWxkcmVuXy5sZW5ndGgpIHtcbiAgICBsZXQgY29tcG9uZW50O1xuICAgIGxldCBjb21wb25lbnROYW1lO1xuXG4gICAgLy8gSWYgY2hpbGQgaXMgYSBzdHJpbmcsIGNyZWF0ZSBudCB3aXRoIG9wdGlvbnNcbiAgICBpZiAodHlwZW9mIGNoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgY29tcG9uZW50TmFtZSA9IGNoaWxkO1xuXG4gICAgICAvLyBPcHRpb25zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIGJvb2xlYW4sIHNvIGNvbnZlcnQgdG8gYW4gZW1wdHkgb2JqZWN0IGlmIGZhbHNlLlxuICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRydWUgaXMgZGVwcmVjYXRlZCBzbyBzaG93IGEgd2FybmluZy5cbiAgICAgIGlmIChvcHRpb25zID09PSB0cnVlKSB7XG4gICAgICAgIGxvZy53YXJuKCdJbml0aWFsaXppbmcgYSBjaGlsZCBjb21wb25lbnQgd2l0aCBgdHJ1ZWAgaXMgZGVwcmVjYXRlZC4gQ2hpbGRyZW4gc2hvdWxkIGJlIGRlZmluZWQgaW4gYW4gYXJyYXkgd2hlbiBwb3NzaWJsZSwgYnV0IGlmIG5lY2Vzc2FyeSB1c2UgYW4gb2JqZWN0IGluc3RlYWQgb2YgYHRydWVgLicpO1xuICAgICAgICBvcHRpb25zID0ge307XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGNvbXBvbmVudENsYXNzIGluIG9wdGlvbnMsIGFzc3VtZSBjb21wb25lbnRDbGFzcyBpcyB0aGUgbmFtZSBsb3dlcmNhc2VkXG4gICAgICAvLyAoZS5nLiBwbGF5QnV0dG9uKVxuICAgICAgbGV0IGNvbXBvbmVudENsYXNzTmFtZSA9IG9wdGlvbnMuY29tcG9uZW50Q2xhc3MgfHwgdG9UaXRsZUNhc2UoY29tcG9uZW50TmFtZSk7XG5cbiAgICAgIC8vIFNldCBuYW1lIHRocm91Z2ggb3B0aW9uc1xuICAgICAgb3B0aW9ucy5uYW1lID0gY29tcG9uZW50TmFtZTtcblxuICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCAmIGVsZW1lbnQgZm9yIHRoaXMgY29udHJvbHMgc2V0XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIC5wbGF5ZXJfLCB0aGlzIGlzIGEgcGxheWVyXG4gICAgICBsZXQgQ29tcG9uZW50Q2xhc3MgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KGNvbXBvbmVudENsYXNzTmFtZSk7XG5cbiAgICAgIGlmICghQ29tcG9uZW50Q2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb21wb25lbnQgJHtjb21wb25lbnRDbGFzc05hbWV9IGRvZXMgbm90IGV4aXN0YCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGRhdGEgc3RvcmVkIGRpcmVjdGx5IG9uIHRoZSB2aWRlb2pzIG9iamVjdCBtYXkgYmVcbiAgICAgIC8vIG1pc2lkZW50aWZpZWQgYXMgYSBjb21wb25lbnQgdG8gcmV0YWluXG4gICAgICAvLyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIDQueC4gY2hlY2sgdG8gbWFrZSBzdXJlIHRoZVxuICAgICAgLy8gY29tcG9uZW50IGNsYXNzIGNhbiBiZSBpbnN0YW50aWF0ZWQuXG4gICAgICBpZiAodHlwZW9mIENvbXBvbmVudENsYXNzICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50Q2xhc3ModGhpcy5wbGF5ZXJfIHx8IHRoaXMsIG9wdGlvbnMpO1xuXG4gICAgLy8gY2hpbGQgaXMgYSBjb21wb25lbnQgaW5zdGFuY2VcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50ID0gY2hpbGQ7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZHJlbl8uc3BsaWNlKGluZGV4LCAwLCBjb21wb25lbnQpO1xuXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaWQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY2hpbGRJbmRleF9bY29tcG9uZW50LmlkKCldID0gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIElmIGEgbmFtZSB3YXNuJ3QgdXNlZCB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCwgY2hlY2sgaWYgd2UgY2FuIHVzZSB0aGVcbiAgICAvLyBuYW1lIGZ1bmN0aW9uIG9mIHRoZSBjb21wb25lbnRcbiAgICBjb21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZSB8fCAoY29tcG9uZW50Lm5hbWUgJiYgY29tcG9uZW50Lm5hbWUoKSk7XG5cbiAgICBpZiAoY29tcG9uZW50TmFtZSkge1xuICAgICAgdGhpcy5jaGlsZE5hbWVJbmRleF9bY29tcG9uZW50TmFtZV0gPSBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBVSSBvYmplY3QncyBlbGVtZW50IHRvIHRoZSBjb250YWluZXIgZGl2IChib3gpXG4gICAgLy8gSGF2aW5nIGFuIGVsZW1lbnQgaXMgbm90IHJlcXVpcmVkXG4gICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZWwgPT09ICdmdW5jdGlvbicgJiYgY29tcG9uZW50LmVsKCkpIHtcbiAgICAgIGxldCBjaGlsZE5vZGVzID0gdGhpcy5jb250ZW50RWwoKS5jaGlsZHJlbjtcbiAgICAgIGxldCByZWZOb2RlID0gY2hpbGROb2Rlc1tpbmRleF0gfHwgbnVsbDtcbiAgICAgIHRoaXMuY29udGVudEVsKCkuaW5zZXJ0QmVmb3JlKGNvbXBvbmVudC5lbCgpLCByZWZOb2RlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gc28gaXQgY2FuIHN0b3JlZCBvbiBwYXJlbnQgb2JqZWN0IGlmIGRlc2lyZWQuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBjaGlsZCBjb21wb25lbnQgZnJvbSB0aGlzIGNvbXBvbmVudCdzIGxpc3Qgb2YgY2hpbGRyZW4sIGFuZCB0aGVcbiAgICogY2hpbGQgY29tcG9uZW50J3MgZWxlbWVudCBmcm9tIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0gIHtDb21wb25lbnR9IGNvbXBvbmVudCBDb21wb25lbnQgdG8gcmVtb3ZlXG4gICAqIEBtZXRob2QgcmVtb3ZlQ2hpbGRcbiAgICovXG4gIHJlbW92ZUNoaWxkKGNvbXBvbmVudCkge1xuICAgIGlmICh0eXBlb2YgY29tcG9uZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgY29tcG9uZW50ID0gdGhpcy5nZXRDaGlsZChjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGlmICghY29tcG9uZW50IHx8ICF0aGlzLmNoaWxkcmVuXykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBjaGlsZEZvdW5kID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5jaGlsZHJlbl8ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuX1tpXSA9PT0gY29tcG9uZW50KSB7XG4gICAgICAgIGNoaWxkRm91bmQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoaWxkcmVuXy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghY2hpbGRGb3VuZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuY2hpbGRJbmRleF9bY29tcG9uZW50LmlkKCldID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkTmFtZUluZGV4X1tjb21wb25lbnQubmFtZSgpXSA9IG51bGw7XG5cbiAgICBsZXQgY29tcEVsID0gY29tcG9uZW50LmVsKCk7XG5cbiAgICBpZiAoY29tcEVsICYmIGNvbXBFbC5wYXJlbnROb2RlID09PSB0aGlzLmNvbnRlbnRFbCgpKSB7XG4gICAgICB0aGlzLmNvbnRlbnRFbCgpLnJlbW92ZUNoaWxkKGNvbXBvbmVudC5lbCgpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuZCBpbml0aWFsaXplIGRlZmF1bHQgY2hpbGQgY29tcG9uZW50cyBmcm9tIG9wdGlvbnNcbiAgICogYGBganNcbiAgICogICAgIC8vIHdoZW4gYW4gaW5zdGFuY2Ugb2YgTXlDb21wb25lbnQgaXMgY3JlYXRlZCwgYWxsIGNoaWxkcmVuIGluIG9wdGlvbnNcbiAgICogICAgIC8vIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGluc3RhbmNlIGJ5IHRoZWlyIG5hbWUgc3RyaW5ncyBhbmQgb3B0aW9uc1xuICAgKiAgICAgTXlDb21wb25lbnQucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICAgKiAgICAgICBjaGlsZHJlbjogW1xuICAgKiAgICAgICAgICdteUNoaWxkQ29tcG9uZW50J1xuICAgKiAgICAgICBdLFxuICAgKiAgICAgICBteUNoaWxkQ29tcG9uZW50OiB7XG4gICAqICAgICAgICAgbXlDaGlsZE9wdGlvbjogdHJ1ZVxuICAgKiAgICAgICB9XG4gICAqICAgICB9O1xuICAgKlxuICAgKiAgICAgLy8gT3Igd2hlbiBjcmVhdGluZyB0aGUgY29tcG9uZW50XG4gICAqICAgICB2YXIgbXlDb21wID0gbmV3IE15Q29tcG9uZW50KHBsYXllciwge1xuICAgKiAgICAgICBjaGlsZHJlbjogW1xuICAgKiAgICAgICAgICdteUNoaWxkQ29tcG9uZW50J1xuICAgKiAgICAgICBdLFxuICAgKiAgICAgICBteUNoaWxkQ29tcG9uZW50OiB7XG4gICAqICAgICAgICAgbXlDaGlsZE9wdGlvbjogdHJ1ZVxuICAgKiAgICAgICB9XG4gICAqICAgICB9KTtcbiAgICogYGBgXG4gICAqIFRoZSBjaGlsZHJlbiBvcHRpb24gY2FuIGFsc28gYmUgYW4gYXJyYXkgb2ZcbiAgICogY2hpbGQgb3B0aW9ucyBvYmplY3RzICh0aGF0IGFsc28gaW5jbHVkZSBhICduYW1lJyBrZXkpLlxuICAgKiBUaGlzIGNhbiBiZSB1c2VkIGlmIHlvdSBoYXZlIHR3byBjaGlsZCBjb21wb25lbnRzIG9mIHRoZVxuICAgKiBzYW1lIHR5cGUgdGhhdCBuZWVkIGRpZmZlcmVudCBvcHRpb25zLlxuICAgKiBgYGBqc1xuICAgKiAgICAgdmFyIG15Q29tcCA9IG5ldyBNeUNvbXBvbmVudChwbGF5ZXIsIHtcbiAgICogICAgICAgY2hpbGRyZW46IFtcbiAgICogICAgICAgICAnYnV0dG9uJyxcbiAgICogICAgICAgICB7XG4gICAqICAgICAgICAgICBuYW1lOiAnYnV0dG9uJyxcbiAgICogICAgICAgICAgIHNvbWVPdGhlck9wdGlvbjogdHJ1ZVxuICAgKiAgICAgICAgIH0sXG4gICAqICAgICAgICAge1xuICAgKiAgICAgICAgICAgbmFtZTogJ2J1dHRvbicsXG4gICAqICAgICAgICAgICBzb21lT3RoZXJPcHRpb246IGZhbHNlXG4gICAqICAgICAgICAgfVxuICAgKiAgICAgICBdXG4gICAqICAgICB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBtZXRob2QgaW5pdENoaWxkcmVuXG4gICAqL1xuICBpbml0Q2hpbGRyZW4oKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gdGhpcy5vcHRpb25zXy5jaGlsZHJlbjtcblxuICAgIGlmIChjaGlsZHJlbikge1xuICAgICAgLy8gYHRoaXNgIGlzIGBwYXJlbnRgXG4gICAgICBsZXQgcGFyZW50T3B0aW9ucyA9IHRoaXMub3B0aW9uc187XG5cbiAgICAgIGxldCBoYW5kbGVBZGQgPSAoY2hpbGQpID0+IHtcbiAgICAgICAgbGV0IG5hbWUgPSBjaGlsZC5uYW1lO1xuICAgICAgICBsZXQgb3B0cyA9IGNoaWxkLm9wdHM7XG5cbiAgICAgICAgLy8gQWxsb3cgb3B0aW9ucyBmb3IgY2hpbGRyZW4gdG8gYmUgc2V0IGF0IHRoZSBwYXJlbnQgb3B0aW9uc1xuICAgICAgICAvLyBlLmcuIHZpZGVvanMoaWQsIHsgY29udHJvbEJhcjogZmFsc2UgfSk7XG4gICAgICAgIC8vIGluc3RlYWQgb2YgdmlkZW9qcyhpZCwgeyBjaGlsZHJlbjogeyBjb250cm9sQmFyOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKHBhcmVudE9wdGlvbnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9wdHMgPSBwYXJlbnRPcHRpb25zW25hbWVdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgZm9yIGRpc2FibGluZyBkZWZhdWx0IGNvbXBvbmVudHNcbiAgICAgICAgLy8gZS5nLiBvcHRpb25zWydjaGlsZHJlbiddWydwb3N0ZXJJbWFnZSddID0gZmFsc2VcbiAgICAgICAgaWYgKG9wdHMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxsb3cgb3B0aW9ucyB0byBiZSBwYXNzZWQgYXMgYSBzaW1wbGUgYm9vbGVhbiBpZiBubyBjb25maWd1cmF0aW9uXG4gICAgICAgIC8vIGlzIG5lY2Vzc2FyeS5cbiAgICAgICAgaWYgKG9wdHMgPT09IHRydWUpIHtcbiAgICAgICAgICBvcHRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBhbHNvIHdhbnQgdG8gcGFzcyB0aGUgb3JpZ2luYWwgcGxheWVyIG9wdGlvbnMgdG8gZWFjaCBjb21wb25lbnQgYXMgd2VsbCBzbyB0aGV5IGRvbid0IG5lZWQgdG9cbiAgICAgICAgLy8gcmVhY2ggYmFjayBpbnRvIHRoZSBwbGF5ZXIgZm9yIG9wdGlvbnMgbGF0ZXIuXG4gICAgICAgIG9wdHMucGxheWVyT3B0aW9ucyA9IHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucztcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIGFkZCB0aGUgY2hpbGQgY29tcG9uZW50LlxuICAgICAgICAvLyBBZGQgYSBkaXJlY3QgcmVmZXJlbmNlIHRvIHRoZSBjaGlsZCBieSBuYW1lIG9uIHRoZSBwYXJlbnQgaW5zdGFuY2UuXG4gICAgICAgIC8vIElmIHR3byBvZiB0aGUgc2FtZSBjb21wb25lbnQgYXJlIHVzZWQsIGRpZmZlcmVudCBuYW1lcyBzaG91bGQgYmUgc3VwcGxpZWRcbiAgICAgICAgLy8gZm9yIGVhY2hcbiAgICAgICAgbGV0IG5ld0NoaWxkID0gdGhpcy5hZGRDaGlsZChuYW1lLCBvcHRzKTtcbiAgICAgICAgaWYgKG5ld0NoaWxkKSB7XG4gICAgICAgICAgdGhpc1tuYW1lXSA9IG5ld0NoaWxkO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBBbGxvdyBmb3IgYW4gYXJyYXkgb2YgY2hpbGRyZW4gZGV0YWlscyB0byBwYXNzZWQgaW4gdGhlIG9wdGlvbnNcbiAgICAgIGxldCB3b3JraW5nQ2hpbGRyZW47XG4gICAgICBsZXQgVGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoJ1RlY2gnKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSB7XG4gICAgICAgIHdvcmtpbmdDaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd29ya2luZ0NoaWxkcmVuID0gT2JqZWN0LmtleXMoY2hpbGRyZW4pO1xuICAgICAgfVxuXG4gICAgICB3b3JraW5nQ2hpbGRyZW5cbiAgICAgIC8vIGNoaWxkcmVuIHRoYXQgYXJlIGluIHRoaXMub3B0aW9uc18gYnV0IGFsc28gaW4gd29ya2luZ0NoaWxkcmVuICB3b3VsZFxuICAgICAgLy8gZ2l2ZSB1cyBleHRyYSBjaGlsZHJlbiB3ZSBkbyBub3Qgd2FudC4gU28sIHdlIHdhbnQgdG8gZmlsdGVyIHRoZW0gb3V0LlxuICAgICAgLmNvbmNhdChPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnNfKVxuICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICF3b3JraW5nQ2hpbGRyZW4uc29tZShmdW5jdGlvbih3Y2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2NoaWxkID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQgPT09IHdjaGlsZDtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGlsZCA9PT0gd2NoaWxkLm5hbWU7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pKVxuICAgICAgLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgICAgbGV0IG5hbWUsIG9wdHM7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBuYW1lID0gY2hpbGQ7XG4gICAgICAgICAgb3B0cyA9IGNoaWxkcmVuW25hbWVdIHx8IHRoaXMub3B0aW9uc19bbmFtZV0gfHwge307XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmFtZSA9IGNoaWxkLm5hbWU7XG4gICAgICAgICAgb3B0cyA9IGNoaWxkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtuYW1lLCBvcHRzfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChjaGlsZCkgPT4ge1xuICAgICAgICAvLyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IGNoaWxkLm5hbWUgaXNuJ3QgaW4gdGhlIHRlY2hPcmRlciBzaW5jZVxuICAgICAgICAvLyB0ZWNocyBhcmUgcmVnaXN0ZXJkIGFzIENvbXBvbmVudHMgYnV0IGNhbid0IGFyZW4ndCBjb21wYXRpYmxlXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMjc3MlxuICAgICAgICBsZXQgYyA9IENvbXBvbmVudC5nZXRDb21wb25lbnQoY2hpbGQub3B0cy5jb21wb25lbnRDbGFzcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9UaXRsZUNhc2UoY2hpbGQubmFtZSkpO1xuICAgICAgICByZXR1cm4gYyAmJiAhVGVjaC5pc1RlY2goYyk7XG4gICAgICB9KVxuICAgICAgLmZvckVhY2goaGFuZGxlQWRkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lc1xuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb25zdHJ1Y3RlZCBjbGFzcyBuYW1lXG4gICAqIEBtZXRob2QgYnVpbGRDU1NDbGFzc1xuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICAvLyBDaGlsZCBjbGFzc2VzIGNhbiBpbmNsdWRlIGEgZnVuY3Rpb24gdGhhdCBkb2VzOlxuICAgIC8vIHJldHVybiAnQ0xBU1MgTkFNRScgKyB0aGlzLl9zdXBlcigpO1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gdGhpcyBjb21wb25lbnQncyBlbGVtZW50XG4gICAqIGBgYGpzXG4gICAqICAgICB2YXIgbXlGdW5jID0gZnVuY3Rpb24oKXtcbiAgICogICAgICAgdmFyIG15Q29tcG9uZW50ID0gdGhpcztcbiAgICogICAgICAgLy8gRG8gc29tZXRoaW5nIHdoZW4gdGhlIGV2ZW50IGlzIGZpcmVkXG4gICAqICAgICB9O1xuICAgKlxuICAgKiAgICAgbXlDb21wb25lbnQub24oJ2V2ZW50VHlwZScsIG15RnVuYyk7XG4gICAqIGBgYFxuICAgKiBUaGUgY29udGV4dCBvZiBteUZ1bmMgd2lsbCBiZSBteUNvbXBvbmVudCB1bmxlc3MgcHJldmlvdXNseSBib3VuZC5cbiAgICogQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBhZGQgYSBsaXN0ZW5lciB0byBhbm90aGVyIGVsZW1lbnQgb3IgY29tcG9uZW50LlxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlDb21wb25lbnQub24ob3RoZXJFbGVtZW50LCAnZXZlbnROYW1lJywgbXlGdW5jKTtcbiAgICogICAgIG15Q29tcG9uZW50Lm9uKG90aGVyQ29tcG9uZW50LCAnZXZlbnROYW1lJywgbXlGdW5jKTtcbiAgICogYGBgXG4gICAqIFRoZSBiZW5lZml0IG9mIHVzaW5nIHRoaXMgb3ZlciBgVmpzRXZlbnRzLm9uKG90aGVyRWxlbWVudCwgJ2V2ZW50TmFtZScsIG15RnVuYylgXG4gICAqIGFuZCBgb3RoZXJDb21wb25lbnQub24oJ2V2ZW50TmFtZScsIG15RnVuYylgIGlzIHRoYXQgdGhpcyB3YXkgdGhlIGxpc3RlbmVyc1xuICAgKiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cCB3aGVuIGVpdGhlciBjb21wb25lbnQgaXMgZGlzcG9zZWQuXG4gICAqIEl0IHdpbGwgYWxzbyBiaW5kIG15Q29tcG9uZW50IGFzIHRoZSBjb250ZXh0IG9mIG15RnVuYy5cbiAgICogKipOT1RFKio6IFdoZW4gdXNpbmcgdGhpcyBvbiBlbGVtZW50cyBpbiB0aGUgcGFnZSBvdGhlciB0aGFuIHdpbmRvd1xuICAgKiBhbmQgZG9jdW1lbnQgKGJvdGggcGVybWFuZW50KSwgaWYgeW91IHJlbW92ZSB0aGUgZWxlbWVudCBmcm9tIHRoZSBET01cbiAgICogeW91IG5lZWQgdG8gY2FsbCBgbXlDb21wb25lbnQudHJpZ2dlcihlbCwgJ2Rpc3Bvc2UnKWAgb24gaXQgdG8gY2xlYW4gdXBcbiAgICogcmVmZXJlbmNlcyB0byBpdCBhbmQgYWxsb3cgdGhlIGJyb3dzZXIgdG8gZ2FyYmFnZSBjb2xsZWN0IGl0LlxuICAgKlxuICAgKiBAcGFyYW0gIHtTdHJpbmd8Q29tcG9uZW50fSBmaXJzdCAgIFRoZSBldmVudCB0eXBlIG9yIG90aGVyIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbnxTdHJpbmd9ICAgICAgc2Vjb25kICBUaGUgZXZlbnQgaGFuZGxlciBvciBldmVudCB0eXBlXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9ufSAgICAgICAgICAgICB0aGlyZCAgIFRoZSBldmVudCBoYW5kbGVyXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQG1ldGhvZCBvblxuICAgKi9cbiAgb24oZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICBpZiAodHlwZW9mIGZpcnN0ID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpcnN0KSkge1xuICAgICAgRXZlbnRzLm9uKHRoaXMuZWxfLCBmaXJzdCwgRm4uYmluZCh0aGlzLCBzZWNvbmQpKTtcblxuICAgIC8vIFRhcmdldGluZyBhbm90aGVyIGNvbXBvbmVudCBvciBlbGVtZW50XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGZpcnN0O1xuICAgICAgY29uc3QgdHlwZSA9IHNlY29uZDtcbiAgICAgIGNvbnN0IGZuID0gRm4uYmluZCh0aGlzLCB0aGlyZCk7XG5cbiAgICAgIC8vIFdoZW4gdGhpcyBjb21wb25lbnQgaXMgZGlzcG9zZWQsIHJlbW92ZSB0aGUgbGlzdGVuZXIgZnJvbSB0aGUgb3RoZXIgY29tcG9uZW50XG4gICAgICBjb25zdCByZW1vdmVPbkRpc3Bvc2UgPSAoKSA9PiB0aGlzLm9mZih0YXJnZXQsIHR5cGUsIGZuKTtcblxuICAgICAgLy8gVXNlIHRoZSBzYW1lIGZ1bmN0aW9uIElEIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIgaXQgdXNpbmcgdGhlIElEXG4gICAgICAvLyBvZiB0aGUgb3JpZ2luYWwgbGlzdGVuZXJcbiAgICAgIHJlbW92ZU9uRGlzcG9zZS5ndWlkID0gZm4uZ3VpZDtcbiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCByZW1vdmVPbkRpc3Bvc2UpO1xuXG4gICAgICAvLyBJZiB0aGUgb3RoZXIgY29tcG9uZW50IGlzIGRpc3Bvc2VkIGZpcnN0IHdlIG5lZWQgdG8gY2xlYW4gdGhlIHJlZmVyZW5jZVxuICAgICAgLy8gdG8gdGhlIG90aGVyIGNvbXBvbmVudCBpbiB0aGlzIGNvbXBvbmVudCdzIHJlbW92ZU9uRGlzcG9zZSBsaXN0ZW5lclxuICAgICAgLy8gT3RoZXJ3aXNlIHdlIGNyZWF0ZSBhIG1lbW9yeSBsZWFrLlxuICAgICAgY29uc3QgY2xlYW5SZW1vdmVyID0gKCkgPT4gdGhpcy5vZmYoJ2Rpc3Bvc2UnLCByZW1vdmVPbkRpc3Bvc2UpO1xuXG4gICAgICAvLyBBZGQgdGhlIHNhbWUgZnVuY3Rpb24gSUQgc28gd2UgY2FuIGVhc2lseSByZW1vdmUgaXQgbGF0ZXJcbiAgICAgIGNsZWFuUmVtb3Zlci5ndWlkID0gZm4uZ3VpZDtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIERPTSBub2RlXG4gICAgICBpZiAoZmlyc3Qubm9kZU5hbWUpIHtcbiAgICAgICAgLy8gQWRkIHRoZSBsaXN0ZW5lciB0byB0aGUgb3RoZXIgZWxlbWVudFxuICAgICAgICBFdmVudHMub24odGFyZ2V0LCB0eXBlLCBmbik7XG4gICAgICAgIEV2ZW50cy5vbih0YXJnZXQsICdkaXNwb3NlJywgY2xlYW5SZW1vdmVyKTtcblxuICAgICAgLy8gU2hvdWxkIGJlIGEgY29tcG9uZW50XG4gICAgICAvLyBOb3QgdXNpbmcgYGluc3RhbmNlb2YgQ29tcG9uZW50YCBiZWNhdXNlIGl0IG1ha2VzIG1vY2sgcGxheWVycyBkaWZmaWN1bHRcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGZpcnN0Lm9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIEFkZCB0aGUgbGlzdGVuZXIgdG8gdGhlIG90aGVyIGNvbXBvbmVudFxuICAgICAgICB0YXJnZXQub24odHlwZSwgZm4pO1xuICAgICAgICB0YXJnZXQub24oJ2Rpc3Bvc2UnLCBjbGVhblJlbW92ZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBmcm9tIHRoaXMgY29tcG9uZW50J3MgZWxlbWVudFxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlDb21wb25lbnQub2ZmKCdldmVudFR5cGUnLCBteUZ1bmMpO1xuICAgKiBgYGBcbiAgICogSWYgbXlGdW5jIGlzIGV4Y2x1ZGVkLCBBTEwgbGlzdGVuZXJzIGZvciB0aGUgZXZlbnQgdHlwZSB3aWxsIGJlIHJlbW92ZWQuXG4gICAqIElmIGV2ZW50VHlwZSBpcyBleGNsdWRlZCwgQUxMIGxpc3RlbmVycyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgY29tcG9uZW50LlxuICAgKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gdXNlIGBvZmZgIHRvIHJlbW92ZSBsaXN0ZW5lcnMgdGhhdCB3ZXJlIGFkZGVkIHRvIG90aGVyXG4gICAqIGVsZW1lbnRzIG9yIGNvbXBvbmVudHMgdXNpbmcgYG15Q29tcG9uZW50Lm9uKG90aGVyQ29tcG9uZW50Li4uYC5cbiAgICogSW4gdGhpcyBjYXNlIGJvdGggdGhlIGV2ZW50IHR5cGUgYW5kIGxpc3RlbmVyIGZ1bmN0aW9uIGFyZSBSRVFVSVJFRC5cbiAgICogYGBganNcbiAgICogICAgIG15Q29tcG9uZW50Lm9mZihvdGhlckVsZW1lbnQsICdldmVudFR5cGUnLCBteUZ1bmMpO1xuICAgKiAgICAgbXlDb21wb25lbnQub2ZmKG90aGVyQ29tcG9uZW50LCAnZXZlbnRUeXBlJywgbXlGdW5jKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZz18Q29tcG9uZW50fSAgZmlyc3QgIFRoZSBldmVudCB0eXBlIG9yIG90aGVyIGNvbXBvbmVudFxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbj18U3RyaW5nfSAgICAgICBzZWNvbmQgVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIG9yIGV2ZW50IHR5cGVcbiAgICogQHBhcmFtICB7RnVuY3Rpb249fSAgICAgICAgICAgICAgdGhpcmQgIFRoZSBsaXN0ZW5lciBmb3Igb3RoZXIgY29tcG9uZW50XG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQG1ldGhvZCBvZmZcbiAgICovXG4gIG9mZihmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgIGlmICghZmlyc3QgfHwgdHlwZW9mIGZpcnN0ID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpcnN0KSkge1xuICAgICAgRXZlbnRzLm9mZih0aGlzLmVsXywgZmlyc3QsIHNlY29uZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGZpcnN0O1xuICAgICAgY29uc3QgdHlwZSA9IHNlY29uZDtcbiAgICAgIC8vIEVuc3VyZSB0aGVyZSdzIGF0IGxlYXN0IGEgZ3VpZCwgZXZlbiBpZiB0aGUgZnVuY3Rpb24gaGFzbid0IGJlZW4gdXNlZFxuICAgICAgY29uc3QgZm4gPSBGbi5iaW5kKHRoaXMsIHRoaXJkKTtcblxuICAgICAgLy8gUmVtb3ZlIHRoZSBkaXNwb3NlIGxpc3RlbmVyIG9uIHRoaXMgY29tcG9uZW50LFxuICAgICAgLy8gd2hpY2ggd2FzIGdpdmVuIHRoZSBzYW1lIGd1aWQgYXMgdGhlIGV2ZW50IGxpc3RlbmVyXG4gICAgICB0aGlzLm9mZignZGlzcG9zZScsIGZuKTtcblxuICAgICAgaWYgKGZpcnN0Lm5vZGVOYW1lKSB7XG4gICAgICAgIC8vIFJlbW92ZSB0aGUgbGlzdGVuZXJcbiAgICAgICAgRXZlbnRzLm9mZih0YXJnZXQsIHR5cGUsIGZuKTtcbiAgICAgICAgLy8gUmVtb3ZlIHRoZSBsaXN0ZW5lciBmb3IgY2xlYW5pbmcgdGhlIGRpc3Bvc2UgbGlzdGVuZXJcbiAgICAgICAgRXZlbnRzLm9mZih0YXJnZXQsICdkaXNwb3NlJywgZm4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFyZ2V0Lm9mZih0eXBlLCBmbik7XG4gICAgICAgIHRhcmdldC5vZmYoJ2Rpc3Bvc2UnLCBmbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UgYW5kIHRoZW4gcmVtb3ZlZFxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlDb21wb25lbnQub25lKCdldmVudE5hbWUnLCBteUZ1bmMpO1xuICAgKiBgYGBcbiAgICogQWx0ZXJuYXRpdmVseSB5b3UgY2FuIGFkZCBhIGxpc3RlbmVyIHRvIGFub3RoZXIgZWxlbWVudCBvciBjb21wb25lbnRcbiAgICogdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqIGBgYGpzXG4gICAqICAgICBteUNvbXBvbmVudC5vbmUob3RoZXJFbGVtZW50LCAnZXZlbnROYW1lJywgbXlGdW5jKTtcbiAgICogICAgIG15Q29tcG9uZW50Lm9uZShvdGhlckNvbXBvbmVudCwgJ2V2ZW50TmFtZScsIG15RnVuYyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gIHtTdHJpbmd8Q29tcG9uZW50fSAgZmlyc3QgICBUaGUgZXZlbnQgdHlwZSBvciBvdGhlciBjb21wb25lbnRcbiAgICogQHBhcmFtICB7RnVuY3Rpb258U3RyaW5nfSAgICAgICBzZWNvbmQgIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiBvciBldmVudCB0eXBlXG4gICAqIEBwYXJhbSAge0Z1bmN0aW9uPX0gICAgICAgICAgICAgdGhpcmQgICBUaGUgbGlzdGVuZXIgZnVuY3Rpb24gZm9yIG90aGVyIGNvbXBvbmVudFxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2Qgb25lXG4gICAqL1xuICBvbmUoZmlyc3QsIHNlY29uZCwgdGhpcmQpIHtcbiAgICBpZiAodHlwZW9mIGZpcnN0ID09PSAnc3RyaW5nJyB8fCBBcnJheS5pc0FycmF5KGZpcnN0KSkge1xuICAgICAgRXZlbnRzLm9uZSh0aGlzLmVsXywgZmlyc3QsIEZuLmJpbmQodGhpcywgc2Vjb25kKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGZpcnN0O1xuICAgICAgY29uc3QgdHlwZSA9IHNlY29uZDtcbiAgICAgIGNvbnN0IGZuID0gRm4uYmluZCh0aGlzLCB0aGlyZCk7XG5cbiAgICAgIGNvbnN0IG5ld0Z1bmMgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMub2ZmKHRhcmdldCwgdHlwZSwgbmV3RnVuYyk7XG4gICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG4gICAgICB9O1xuXG4gICAgICAvLyBLZWVwIHRoZSBzYW1lIGZ1bmN0aW9uIElEIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXJcbiAgICAgIG5ld0Z1bmMuZ3VpZCA9IGZuLmd1aWQ7XG5cbiAgICAgIHRoaXMub24odGFyZ2V0LCB0eXBlLCBuZXdGdW5jKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICogYGBganNcbiAgICogICAgIG15Q29tcG9uZW50LnRyaWdnZXIoJ2V2ZW50TmFtZScpO1xuICAgKiAgICAgbXlDb21wb25lbnQudHJpZ2dlcih7J3R5cGUnOidldmVudE5hbWUnfSk7XG4gICAqICAgICBteUNvbXBvbmVudC50cmlnZ2VyKCdldmVudE5hbWUnLCB7ZGF0YTogJ3NvbWUgZGF0YSd9KTtcbiAgICogICAgIG15Q29tcG9uZW50LnRyaWdnZXIoeyd0eXBlJzonZXZlbnROYW1lJ30sIHtkYXRhOiAnc29tZSBkYXRhJ30pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtICB7RXZlbnR8T2JqZWN0fFN0cmluZ30gZXZlbnQgIEEgc3RyaW5nICh0aGUgdHlwZSkgb3IgYW4gZXZlbnQgb2JqZWN0IHdpdGggYSB0eXBlIGF0dHJpYnV0ZVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IFtoYXNoXSBkYXRhIGhhc2ggdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBldmVudFxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9ICAgICAgIHNlbGZcbiAgICogQG1ldGhvZCB0cmlnZ2VyXG4gICAqL1xuICB0cmlnZ2VyKGV2ZW50LCBoYXNoKSB7XG4gICAgRXZlbnRzLnRyaWdnZXIodGhpcy5lbF8sIGV2ZW50LCBoYXNoKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kIGEgbGlzdGVuZXIgdG8gdGhlIGNvbXBvbmVudCdzIHJlYWR5IHN0YXRlLlxuICAgKiBEaWZmZXJlbnQgZnJvbSBldmVudCBsaXN0ZW5lcnMgaW4gdGhhdCBpZiB0aGUgcmVhZHkgZXZlbnQgaGFzIGFscmVhZHkgaGFwcGVuZWRcbiAgICogaXQgd2lsbCB0cmlnZ2VyIHRoZSBmdW5jdGlvbiBpbW1lZGlhdGVseS5cbiAgICpcbiAgICogQHBhcmFtICB7RnVuY3Rpb259IGZuIFJlYWR5IGxpc3RlbmVyXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IHN5bmMgRXhlYyB0aGUgbGlzdGVuZXIgc3luY2hyb25vdXNseSBpZiBjb21wb25lbnQgaXMgcmVhZHlcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIHJlYWR5XG4gICAqL1xuICByZWFkeShmbiwgc3luYz1mYWxzZSkge1xuICAgIGlmIChmbikge1xuICAgICAgaWYgKHRoaXMuaXNSZWFkeV8pIHtcbiAgICAgICAgaWYgKHN5bmMpIHtcbiAgICAgICAgICBmbi5jYWxsKHRoaXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5IGJ5IGRlZmF1bHQgZm9yIGNvbnNpc3RlbmN5XG4gICAgICAgICAgdGhpcy5zZXRUaW1lb3V0KGZuLCAxKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZWFkeVF1ZXVlXyA9IHRoaXMucmVhZHlRdWV1ZV8gfHwgW107XG4gICAgICAgIHRoaXMucmVhZHlRdWV1ZV8ucHVzaChmbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgdGhlIHJlYWR5IGxpc3RlbmVyc1xuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2QgdHJpZ2dlclJlYWR5XG4gICAqL1xuICB0cmlnZ2VyUmVhZHkoKSB7XG4gICAgdGhpcy5pc1JlYWR5XyA9IHRydWU7XG5cbiAgICAvLyBFbnN1cmUgcmVhZHkgaXMgdHJpZ2dlcmQgYXN5bmNocm9ub3VzbHlcbiAgICB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgIGxldCByZWFkeVF1ZXVlID0gdGhpcy5yZWFkeVF1ZXVlXztcblxuICAgICAgLy8gUmVzZXQgUmVhZHkgUXVldWVcbiAgICAgIHRoaXMucmVhZHlRdWV1ZV8gPSBbXTtcblxuICAgICAgaWYgKHJlYWR5UXVldWUgJiYgcmVhZHlRdWV1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlYWR5UXVldWUuZm9yRWFjaChmdW5jdGlvbihmbil7XG4gICAgICAgICAgZm4uY2FsbCh0aGlzKTtcbiAgICAgICAgfSwgdGhpcyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFsbG93IGZvciB1c2luZyBldmVudCBsaXN0ZW5lcnMgYWxzb1xuICAgICAgdGhpcy50cmlnZ2VyKCdyZWFkeScpO1xuICAgIH0sIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgc2luZ2xlIERPTSBlbGVtZW50IG1hdGNoaW5nIGBzZWxlY3RvcmAgd2l0aGluIHRoZSBjb21wb25lbnQnc1xuICAgKiBgY29udGVudEVsYCBvciBhbm90aGVyIGN1c3RvbSBjb250ZXh0LlxuICAgKlxuICAgKiBAbWV0aG9kICRcbiAgICogQHBhcmFtICB7U3RyaW5nfSBzZWxlY3RvclxuICAgKiAgICAgICAgIEEgdmFsaWQgQ1NTIHNlbGVjdG9yLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBgcXVlcnlTZWxlY3RvcmAuXG4gICAqXG4gICAqIEBwYXJhbSAge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAgICogICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICAgKiAgICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICAgKiAgICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gICAqICAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICAkKHNlbGVjdG9yLCBjb250ZXh0KSB7XG4gICAgcmV0dXJuIERvbS4kKHNlbGVjdG9yLCBjb250ZXh0IHx8IHRoaXMuY29udGVudEVsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGEgYWxsIERPTSBlbGVtZW50cyBtYXRjaGluZyBgc2VsZWN0b3JgIHdpdGhpbiB0aGUgY29tcG9uZW50J3NcbiAgICogYGNvbnRlbnRFbGAgb3IgYW5vdGhlciBjdXN0b20gY29udGV4dC5cbiAgICpcbiAgICogQG1ldGhvZCAkJFxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHNlbGVjdG9yXG4gICAqICAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yQWxsYC5cbiAgICpcbiAgICogQHBhcmFtICB7RWxlbWVudHxTdHJpbmd9IFtjb250ZXh0PWRvY3VtZW50XVxuICAgKiAgICAgICAgIEEgRE9NIGVsZW1lbnQgd2l0aGluIHdoaWNoIHRvIHF1ZXJ5LiBDYW4gYWxzbyBiZSBhIHNlbGVjdG9yXG4gICAqICAgICAgICAgc3RyaW5nIGluIHdoaWNoIGNhc2UgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgd2lsbCBiZSB1c2VkXG4gICAqICAgICAgICAgYXMgY29udGV4dC4gSWYgbWlzc2luZyAob3Igbm8gZWxlbWVudCBtYXRjaGVzIHNlbGVjdG9yKSwgZmFsbHNcbiAgICogICAgICAgICBiYWNrIHRvIGBkb2N1bWVudGAuXG4gICAqXG4gICAqIEByZXR1cm4ge05vZGVMaXN0fVxuICAgKi9cbiAgJCQoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gRG9tLiQkKHNlbGVjdG9yLCBjb250ZXh0IHx8IHRoaXMuY29udGVudEVsKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgY29tcG9uZW50J3MgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3MgbmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NUb0NoZWNrIENsYXNzbmFtZSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2QgaGFzQ2xhc3NcbiAgICovXG4gIGhhc0NsYXNzKGNsYXNzVG9DaGVjaykge1xuICAgIHJldHVybiBEb20uaGFzRWxDbGFzcyh0aGlzLmVsXywgY2xhc3NUb0NoZWNrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBDU1MgY2xhc3MgbmFtZSB0byB0aGUgY29tcG9uZW50J3MgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY2xhc3NUb0FkZCBDbGFzc25hbWUgdG8gYWRkXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQG1ldGhvZCBhZGRDbGFzc1xuICAgKi9cbiAgYWRkQ2xhc3MoY2xhc3NUb0FkZCkge1xuICAgIERvbS5hZGRFbENsYXNzKHRoaXMuZWxfLCBjbGFzc1RvQWRkKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBDU1MgY2xhc3MgbmFtZSBmcm9tIHRoZSBjb21wb25lbnQncyBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBjbGFzc1RvUmVtb3ZlIENsYXNzbmFtZSB0byByZW1vdmVcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIHJlbW92ZUNsYXNzXG4gICAqL1xuICByZW1vdmVDbGFzcyhjbGFzc1RvUmVtb3ZlKSB7XG4gICAgRG9tLnJlbW92ZUVsQ2xhc3ModGhpcy5lbF8sIGNsYXNzVG9SZW1vdmUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBvciByZW1vdmUgYSBDU1MgY2xhc3MgbmFtZSBmcm9tIHRoZSBjb21wb25lbnQncyBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZ30gY2xhc3NUb1RvZ2dsZVxuICAgKiBAcGFyYW0gIHtCb29sZWFufEZ1bmN0aW9ufSBbcHJlZGljYXRlXVxuICAgKiAgICAgICAgIENhbiBiZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIEJvb2xlYW4uIElmIGB0cnVlYCwgdGhlIGNsYXNzXG4gICAqICAgICAgICAgd2lsbCBiZSBhZGRlZDsgaWYgYGZhbHNlYCwgdGhlIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC4gSWYgbm90XG4gICAqICAgICAgICAgZ2l2ZW4sIHRoZSBjbGFzcyB3aWxsIGJlIGFkZGVkIGlmIG5vdCBwcmVzZW50IGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2QgdG9nZ2xlQ2xhc3NcbiAgICovXG4gIHRvZ2dsZUNsYXNzKGNsYXNzVG9Ub2dnbGUsIHByZWRpY2F0ZSkge1xuICAgIERvbS50b2dnbGVFbENsYXNzKHRoaXMuZWxfLCBjbGFzc1RvVG9nZ2xlLCBwcmVkaWNhdGUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgdGhlIGNvbXBvbmVudCBlbGVtZW50IGlmIGhpZGRlblxuICAgKlxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2Qgc2hvd1xuICAgKi9cbiAgc2hvdygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogSGlkZSB0aGUgY29tcG9uZW50IGVsZW1lbnQgaWYgY3VycmVudGx5IHNob3dpbmdcbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIGhpZGVcbiAgICovXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIExvY2sgYW4gaXRlbSBpbiBpdHMgdmlzaWJsZSBzdGF0ZVxuICAgKiBUbyBiZSB1c2VkIHdpdGggZmFkZUluL2ZhZGVPdXQuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBsb2NrU2hvd2luZ1xuICAgKi9cbiAgbG9ja1Nob3dpbmcoKSB7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLWxvY2stc2hvd2luZycpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFVubG9jayBhbiBpdGVtIHRvIGJlIGhpZGRlblxuICAgKiBUbyBiZSB1c2VkIHdpdGggZmFkZUluL2ZhZGVPdXQuXG4gICAqXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH1cbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCB1bmxvY2tTaG93aW5nXG4gICAqL1xuICB1bmxvY2tTaG93aW5nKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1sb2NrLXNob3dpbmcnKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3IgZ2V0IHRoZSB3aWR0aCBvZiB0aGUgY29tcG9uZW50IChDU1MgdmFsdWVzKVxuICAgKiBTZXR0aW5nIHRoZSB2aWRlbyB0YWcgZGltZW5zaW9uIHZhbHVlcyBvbmx5IHdvcmtzIHdpdGggdmFsdWVzIGluIHBpeGVscy5cbiAgICogUGVyY2VudCB2YWx1ZXMgd2lsbCBub3Qgd29yay5cbiAgICogU29tZSBwZXJjZW50cyBjYW4gYmUgdXNlZCwgYnV0IHdpZHRoKCkvaGVpZ2h0KCkgd2lsbCByZXR1cm4gdGhlIG51bWJlciArICUsXG4gICAqIG5vdCB0aGUgYWN0dWFsIGNvbXB1dGVkIHdpZHRoL2hlaWdodC5cbiAgICpcbiAgICogQHBhcmFtICB7TnVtYmVyfFN0cmluZz19IG51bSAgIE9wdGlvbmFsIHdpZHRoIG51bWJlclxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBza2lwTGlzdGVuZXJzIFNraXAgdGhlICdyZXNpemUnIGV2ZW50IHRyaWdnZXJcbiAgICogQHJldHVybiB7Q29tcG9uZW50fSBUaGlzIGNvbXBvbmVudCwgd2hlbiBzZXR0aW5nIHRoZSB3aWR0aFxuICAgKiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBUaGUgd2lkdGgsIHdoZW4gZ2V0dGluZ1xuICAgKiBAbWV0aG9kIHdpZHRoXG4gICAqL1xuICB3aWR0aChudW0sIHNraXBMaXN0ZW5lcnMpIHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb24oJ3dpZHRoJywgbnVtLCBza2lwTGlzdGVuZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBoZWlnaHQgb2YgdGhlIGNvbXBvbmVudCAoQ1NTIHZhbHVlcylcbiAgICogU2V0dGluZyB0aGUgdmlkZW8gdGFnIGRpbWVuc2lvbiB2YWx1ZXMgb25seSB3b3JrcyB3aXRoIHZhbHVlcyBpbiBwaXhlbHMuXG4gICAqIFBlcmNlbnQgdmFsdWVzIHdpbGwgbm90IHdvcmsuXG4gICAqIFNvbWUgcGVyY2VudHMgY2FuIGJlIHVzZWQsIGJ1dCB3aWR0aCgpL2hlaWdodCgpIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgKyAlLFxuICAgKiBub3QgdGhlIGFjdHVhbCBjb21wdXRlZCB3aWR0aC9oZWlnaHQuXG4gICAqXG4gICAqIEBwYXJhbSAge051bWJlcnxTdHJpbmc9fSBudW0gICAgIE5ldyBjb21wb25lbnQgaGVpZ2h0XG4gICAqIEBwYXJhbSAge0Jvb2xlYW49fSBza2lwTGlzdGVuZXJzIFNraXAgdGhlIHJlc2l6ZSBldmVudCB0cmlnZ2VyXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhpcyBjb21wb25lbnQsIHdoZW4gc2V0dGluZyB0aGUgaGVpZ2h0XG4gICAqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IFRoZSBoZWlnaHQsIHdoZW4gZ2V0dGluZ1xuICAgKiBAbWV0aG9kIGhlaWdodFxuICAgKi9cbiAgaGVpZ2h0KG51bSwgc2tpcExpc3RlbmVycykge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignaGVpZ2h0JywgbnVtLCBza2lwTGlzdGVuZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYm90aCB3aWR0aCBhbmQgaGVpZ2h0IGF0IHRoZSBzYW1lIHRpbWVcbiAgICpcbiAgICogQHBhcmFtICB7TnVtYmVyfFN0cmluZ30gd2lkdGggV2lkdGggb2YgcGxheWVyXG4gICAqIEBwYXJhbSAge051bWJlcnxTdHJpbmd9IGhlaWdodCBIZWlnaHQgb2YgcGxheWVyXG4gICAqIEByZXR1cm4ge0NvbXBvbmVudH0gVGhlIGNvbXBvbmVudFxuICAgKiBAbWV0aG9kIGRpbWVuc2lvbnNcbiAgICovXG4gIGRpbWVuc2lvbnMod2lkdGgsIGhlaWdodCkge1xuICAgIC8vIFNraXAgcmVzaXplIGxpc3RlbmVycyBvbiB3aWR0aCBmb3Igb3B0aW1pemF0aW9uXG4gICAgcmV0dXJuIHRoaXMud2lkdGgod2lkdGgsIHRydWUpLmhlaWdodChoZWlnaHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0XG4gICAqIFRoaXMgaXMgdGhlIHNoYXJlZCBjb2RlIGZvciB0aGUgd2lkdGgoKSBhbmQgaGVpZ2h0KCkgbWV0aG9kcy5cbiAgICogQWxsIGZvciBhbiBpbnRlZ2VyLCBpbnRlZ2VyICsgJ3B4JyBvciBpbnRlZ2VyICsgJyUnO1xuICAgKiBLbm93biBpc3N1ZTogSGlkZGVuIGVsZW1lbnRzIG9mZmljaWFsbHkgaGF2ZSBhIHdpZHRoIG9mIDAuIFdlJ3JlIGRlZmF1bHRpbmdcbiAgICogdG8gdGhlIHN0eWxlLndpZHRoIHZhbHVlIGFuZCBmYWxsaW5nIGJhY2sgdG8gY29tcHV0ZWRTdHlsZSB3aGljaCBoYXMgdGhlXG4gICAqIGhpZGRlbiBlbGVtZW50IGlzc3VlLiBJbmZvLCBidXQgcHJvYmFibHkgbm90IGFuIGVmZmljaWVudCBmaXg6XG4gICAqIGh0dHA6Ly93d3cuZm9saW90ZWsuY29tL2RldmJsb2cvZ2V0dGluZy10aGUtd2lkdGgtb2YtYS1oaWRkZW4tZWxlbWVudC13aXRoLWpxdWVyeS11c2luZy13aWR0aC9cbiAgICpcbiAgICogQHBhcmFtICB7U3RyaW5nfSB3aWR0aE9ySGVpZ2h0ICAnd2lkdGgnIG9yICdoZWlnaHQnXG4gICAqIEBwYXJhbSAge051bWJlcnxTdHJpbmc9fSBudW0gICAgIE5ldyBkaW1lbnNpb25cbiAgICogQHBhcmFtICB7Qm9vbGVhbj19IHNraXBMaXN0ZW5lcnMgU2tpcCByZXNpemUgZXZlbnQgdHJpZ2dlclxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjb21wb25lbnQgaWYgYSBkaW1lbnNpb24gd2FzIHNldFxuICAgKiBAcmV0dXJuIHtOdW1iZXJ8U3RyaW5nfSBUaGUgZGltZW5zaW9uIGlmIG5vdGhpbmcgd2FzIHNldFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGRpbWVuc2lvblxuICAgKi9cbiAgZGltZW5zaW9uKHdpZHRoT3JIZWlnaHQsIG51bSwgc2tpcExpc3RlbmVycykge1xuICAgIGlmIChudW0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gU2V0IHRvIHplcm8gaWYgbnVsbCBvciBsaXRlcmFsbHkgTmFOIChOYU4gIT09IE5hTilcbiAgICAgIGlmIChudW0gPT09IG51bGwgfHwgbnVtICE9PSBudW0pIHtcbiAgICAgICAgbnVtID0gMDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdXNpbmcgY3NzIHdpZHRoL2hlaWdodCAoJSBvciBweCkgYW5kIGFkanVzdFxuICAgICAgaWYgKCgnJyArIG51bSkuaW5kZXhPZignJScpICE9PSAtMSB8fCAoJycgKyBudW0pLmluZGV4T2YoJ3B4JykgIT09IC0xKSB7XG4gICAgICAgIHRoaXMuZWxfLnN0eWxlW3dpZHRoT3JIZWlnaHRdID0gbnVtO1xuICAgICAgfSBlbHNlIGlmIChudW0gPT09ICdhdXRvJykge1xuICAgICAgICB0aGlzLmVsXy5zdHlsZVt3aWR0aE9ySGVpZ2h0XSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF0gPSBudW0gKyAncHgnO1xuICAgICAgfVxuXG4gICAgICAvLyBza2lwTGlzdGVuZXJzIGFsbG93cyB1cyB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSByZXNpemUgZXZlbnQgd2hlbiBzZXR0aW5nIGJvdGggd2lkdGggYW5kIGhlaWdodFxuICAgICAgaWYgKCFza2lwTGlzdGVuZXJzKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcigncmVzaXplJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJldHVybiBjb21wb25lbnRcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIE5vdCBzZXR0aW5nIGEgdmFsdWUsIHNvIGdldHRpbmcgaXRcbiAgICAvLyBNYWtlIHN1cmUgZWxlbWVudCBleGlzdHNcbiAgICBpZiAoIXRoaXMuZWxfKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvLyBHZXQgZGltZW5zaW9uIHZhbHVlIGZyb20gc3R5bGVcbiAgICBsZXQgdmFsID0gdGhpcy5lbF8uc3R5bGVbd2lkdGhPckhlaWdodF07XG4gICAgbGV0IHB4SW5kZXggPSB2YWwuaW5kZXhPZigncHgnKTtcblxuICAgIGlmIChweEluZGV4ICE9PSAtMSkge1xuICAgICAgLy8gUmV0dXJuIHRoZSBwaXhlbCB2YWx1ZSB3aXRoIG5vICdweCdcbiAgICAgIHJldHVybiBwYXJzZUludCh2YWwuc2xpY2UoMCwgcHhJbmRleCksIDEwKTtcbiAgICB9XG5cbiAgICAvLyBObyBweCBzbyB1c2luZyAlIG9yIG5vIHN0eWxlIHdhcyBzZXQsIHNvIGZhbGxpbmcgYmFjayB0byBvZmZzZXRXaWR0aC9oZWlnaHRcbiAgICAvLyBJZiBjb21wb25lbnQgaGFzIGRpc3BsYXk6bm9uZSwgb2Zmc2V0IHdpbGwgcmV0dXJuIDBcbiAgICAvLyBUT0RPOiBoYW5kbGUgZGlzcGxheTpub25lIGFuZCBubyBkaW1lbnNpb24gc3R5bGUgdXNpbmcgcHhcbiAgICByZXR1cm4gcGFyc2VJbnQodGhpcy5lbF9bJ29mZnNldCcgKyB0b1RpdGxlQ2FzZSh3aWR0aE9ySGVpZ2h0KV0sIDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2lkdGggb3IgaGVpZ2h0IG9mIGNvbXB1dGVkIHN0eWxlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gd2lkdGhPckhlaWdodCAgJ3dpZHRoJyBvciAnaGVpZ2h0J1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ8Qm9vbGVhbn0gVGhlIGJvbGVhbiBmYWxzZSBpZiBub3RoaW5nIHdhcyBzZXRcbiAgICogQG1ldGhvZCBjdXJyZW50RGltZW5zaW9uXG4gICAqL1xuICBjdXJyZW50RGltZW5zaW9uKHdpZHRoT3JIZWlnaHQpIHtcbiAgICBsZXQgY29tcHV0ZWRXaWR0aE9ySGVpZ2h0ID0gMDtcblxuICAgIGlmICh3aWR0aE9ySGVpZ2h0ICE9PSAnd2lkdGgnICYmIHdpZHRoT3JIZWlnaHQgIT09ICdoZWlnaHQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2N1cnJlbnREaW1lbnNpb24gb25seSBhY2NlcHRzIHdpZHRoIG9yIGhlaWdodCB2YWx1ZScpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygd2luZG93LmdldENvbXB1dGVkU3R5bGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmVsXyk7XG4gICAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUod2lkdGhPckhlaWdodCkgfHwgY29tcHV0ZWRTdHlsZVt3aWR0aE9ySGVpZ2h0XTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZWxfLmN1cnJlbnRTdHlsZSkge1xuICAgICAgLy8gaWUgOCBkb2Vzbid0IHN1cHBvcnQgY29tcHV0ZWQgc3R5bGUsIHNoaW0gaXRcbiAgICAgIC8vIHJldHVybiBjbGllbnRXaWR0aCBvciBjbGllbnRIZWlnaHQgaW5zdGVhZCBmb3IgYmV0dGVyIGFjY3VyYWN5XG4gICAgICBjb25zdCBydWxlID0gYG9mZnNldCR7dG9UaXRsZUNhc2Uod2lkdGhPckhlaWdodCl9YDtcbiAgICAgIGNvbXB1dGVkV2lkdGhPckhlaWdodCA9IHRoaXMuZWxfW3J1bGVdO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSAncHgnIGZyb20gdmFyaWFibGUgYW5kIHBhcnNlIGFzIGludGVnZXJcbiAgICBjb21wdXRlZFdpZHRoT3JIZWlnaHQgPSBwYXJzZUZsb2F0KGNvbXB1dGVkV2lkdGhPckhlaWdodCk7XG4gICAgcmV0dXJuIGNvbXB1dGVkV2lkdGhPckhlaWdodDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIHdpZHRoIGFuZCBoZWlnaHQgdmFsdWVzIG9mIGNvbXB1dGVkIHN0eWxlXG4gICAqIEByZXR1cm4ge09iamVjdH0gVGhlIGRpbWVuc2lvbnMgb2YgZWxlbWVudFxuICAgKiBAbWV0aG9kIGN1cnJlbnREaW1lbnNpb25zXG4gICAqL1xuICBjdXJyZW50RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKSxcbiAgICAgIGhlaWdodDogdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdpZHRoIG9mIGNvbXB1dGVkIHN0eWxlXG4gICAqIEByZXR1cm4ge0ludGVnZXJ9XG4gICAqIEBtZXRob2QgY3VycmVudFdpZHRoXG4gICAqL1xuICBjdXJyZW50V2lkdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudERpbWVuc2lvbignd2lkdGgnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaGVpZ2h0IG9mIGNvbXB1dGVkIHN0eWxlXG4gICAqIEByZXR1cm4ge0ludGVnZXJ9XG4gICAqIEBtZXRob2QgY3VycmVudEhlaWdodFxuICAgKi9cbiAgY3VycmVudEhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RGltZW5zaW9uKCdoZWlnaHQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0ICd0YXAnIGV2ZW50cyB3aGVuIHRvdWNoIGV2ZW50cyBhcmUgc3VwcG9ydGVkXG4gICAqIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IHRvZ2dsaW5nIHRoZSBjb250cm9scyB0aHJvdWdoIGEgdGFwIG9uIHRoZSB2aWRlby5cbiAgICogV2UncmUgcmVxdWlyaW5nIHRoZW0gdG8gYmUgZW5hYmxlZCBiZWNhdXNlIG90aGVyd2lzZSBldmVyeSBjb21wb25lbnQgd291bGRcbiAgICogaGF2ZSB0aGlzIGV4dHJhIG92ZXJoZWFkIHVubmVjZXNzYXJpbHksIG9uIG1vYmlsZSBkZXZpY2VzIHdoZXJlIGV4dHJhXG4gICAqIG92ZXJoZWFkIGlzIGVzcGVjaWFsbHkgYmFkLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGVtaXRUYXBFdmVudHNcbiAgICovXG4gIGVtaXRUYXBFdmVudHMoKSB7XG4gICAgLy8gVHJhY2sgdGhlIHN0YXJ0IHRpbWUgc28gd2UgY2FuIGRldGVybWluZSBob3cgbG9uZyB0aGUgdG91Y2ggbGFzdGVkXG4gICAgbGV0IHRvdWNoU3RhcnQgPSAwO1xuICAgIGxldCBmaXJzdFRvdWNoID0gbnVsbDtcblxuICAgIC8vIE1heGltdW0gbW92ZW1lbnQgYWxsb3dlZCBkdXJpbmcgYSB0b3VjaCBldmVudCB0byBzdGlsbCBiZSBjb25zaWRlcmVkIGEgdGFwXG4gICAgLy8gT3RoZXIgcG9wdWxhciBsaWJzIHVzZSBhbnl3aGVyZSBmcm9tIDIgKGhhbW1lci5qcykgdG8gMTUsIHNvIDEwIHNlZW1zIGxpa2UgYSBuaWNlLCByb3VuZCBudW1iZXIuXG4gICAgY29uc3QgdGFwTW92ZW1lbnRUaHJlc2hvbGQgPSAxMDtcblxuICAgIC8vIFRoZSBtYXhpbXVtIGxlbmd0aCBhIHRvdWNoIGNhbiBiZSB3aGlsZSBzdGlsbCBiZWluZyBjb25zaWRlcmVkIGEgdGFwXG4gICAgY29uc3QgdG91Y2hUaW1lVGhyZXNob2xkID0gMjAwO1xuXG4gICAgbGV0IGNvdWxkQmVUYXA7XG5cbiAgICB0aGlzLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgZmluZ2VyLCBkb24ndCBjb25zaWRlciB0cmVhdGluZyB0aGlzIGFzIGEgY2xpY2tcbiAgICAgIGlmIChldmVudC50b3VjaGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAvLyBDb3B5IHRoZSB0b3VjaGVzIG9iamVjdCB0byBwcmV2ZW50IG1vZGlmeWluZyB0aGUgb3JpZ2luYWxcbiAgICAgICAgZmlyc3RUb3VjaCA9IGFzc2lnbih7fSwgZXZlbnQudG91Y2hlc1swXSk7XG4gICAgICAgIC8vIFJlY29yZCBzdGFydCB0aW1lIHNvIHdlIGNhbiBkZXRlY3QgYSB0YXAgdnMuIFwidG91Y2ggYW5kIGhvbGRcIlxuICAgICAgICB0b3VjaFN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIC8vIFJlc2V0IGNvdWxkQmVUYXAgdHJhY2tpbmdcbiAgICAgICAgY291bGRCZVRhcCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSBmaW5nZXIsIGRvbid0IGNvbnNpZGVyIHRyZWF0aW5nIHRoaXMgYXMgYSBjbGlja1xuICAgICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID4gMSkge1xuICAgICAgICBjb3VsZEJlVGFwID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGZpcnN0VG91Y2gpIHtcbiAgICAgICAgLy8gU29tZSBkZXZpY2VzIHdpbGwgdGhyb3cgdG91Y2htb3ZlcyBmb3IgYWxsIGJ1dCB0aGUgc2xpZ2h0ZXN0IG9mIHRhcHMuXG4gICAgICAgIC8vIFNvLCBpZiB3ZSBtb3ZlZCBvbmx5IGEgc21hbGwgZGlzdGFuY2UsIHRoaXMgY291bGQgc3RpbGwgYmUgYSB0YXBcbiAgICAgICAgY29uc3QgeGRpZmYgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VYIC0gZmlyc3RUb3VjaC5wYWdlWDtcbiAgICAgICAgY29uc3QgeWRpZmYgPSBldmVudC50b3VjaGVzWzBdLnBhZ2VZIC0gZmlyc3RUb3VjaC5wYWdlWTtcbiAgICAgICAgY29uc3QgdG91Y2hEaXN0YW5jZSA9IE1hdGguc3FydCh4ZGlmZiAgKiB4ZGlmZiArIHlkaWZmICAqIHlkaWZmKTtcblxuICAgICAgICBpZiAodG91Y2hEaXN0YW5jZSA+IHRhcE1vdmVtZW50VGhyZXNob2xkKSB7XG4gICAgICAgICAgY291bGRCZVRhcCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBub1RhcCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY291bGRCZVRhcCA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBUT0RPOiBMaXN0ZW4gdG8gdGhlIG9yaWdpbmFsIHRhcmdldC4gaHR0cDovL3lvdXR1LmJlL0R1amZwWE9LVXA4P3Q9MTNtOHNcbiAgICB0aGlzLm9uKCd0b3VjaGxlYXZlJywgbm9UYXApO1xuICAgIHRoaXMub24oJ3RvdWNoY2FuY2VsJywgbm9UYXApO1xuXG4gICAgLy8gV2hlbiB0aGUgdG91Y2ggZW5kcywgbWVhc3VyZSBob3cgbG9uZyBpdCB0b29rIGFuZCB0cmlnZ2VyIHRoZSBhcHByb3ByaWF0ZVxuICAgIC8vIGV2ZW50XG4gICAgdGhpcy5vbigndG91Y2hlbmQnLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgZmlyc3RUb3VjaCA9IG51bGw7XG4gICAgICAvLyBQcm9jZWVkIG9ubHkgaWYgdGhlIHRvdWNobW92ZS9sZWF2ZS9jYW5jZWwgZXZlbnQgZGlkbid0IGhhcHBlblxuICAgICAgaWYgKGNvdWxkQmVUYXAgPT09IHRydWUpIHtcbiAgICAgICAgLy8gTWVhc3VyZSBob3cgbG9uZyB0aGUgdG91Y2ggbGFzdGVkXG4gICAgICAgIGNvbnN0IHRvdWNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdG91Y2hTdGFydDtcblxuICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHRvdWNoIHdhcyBsZXNzIHRoYW4gdGhlIHRocmVzaG9sZCB0byBiZSBjb25zaWRlcmVkIGEgdGFwXG4gICAgICAgIGlmICh0b3VjaFRpbWUgPCB0b3VjaFRpbWVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAvLyBEb24ndCBsZXQgYnJvd3NlciB0dXJuIHRoaXMgaW50byBhIGNsaWNrXG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3RhcCcpO1xuICAgICAgICAgIC8vIEl0IG1heSBiZSBnb29kIHRvIGNvcHkgdGhlIHRvdWNoZW5kIGV2ZW50IG9iamVjdCBhbmQgY2hhbmdlIHRoZVxuICAgICAgICAgIC8vIHR5cGUgdG8gdGFwLCBpZiB0aGUgb3RoZXIgZXZlbnQgcHJvcGVydGllcyBhcmVuJ3QgZXhhY3QgYWZ0ZXJcbiAgICAgICAgICAvLyBFdmVudHMuZml4RXZlbnQgcnVucyAoZS5nLiBldmVudC50YXJnZXQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBvcnQgdXNlciB0b3VjaCBhY3Rpdml0eSB3aGVuIHRvdWNoIGV2ZW50cyBvY2N1clxuICAgKiBVc2VyIGFjdGl2aXR5IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gY29udHJvbHMgc2hvdWxkIHNob3cvaGlkZS4gSXQnc1xuICAgKiByZWxhdGl2ZWx5IHNpbXBsZSB3aGVuIGl0IGNvbWVzIHRvIG1vdXNlIGV2ZW50cywgYmVjYXVzZSBhbnkgbW91c2UgZXZlbnRcbiAgICogc2hvdWxkIHNob3cgdGhlIGNvbnRyb2xzLiBTbyB3ZSBjYXB0dXJlIG1vdXNlIGV2ZW50cyB0aGF0IGJ1YmJsZSB1cCB0byB0aGVcbiAgICogcGxheWVyIGFuZCByZXBvcnQgYWN0aXZpdHkgd2hlbiB0aGF0IGhhcHBlbnMuXG4gICAqIFdpdGggdG91Y2ggZXZlbnRzIGl0IGlzbid0IGFzIGVhc3kuIFdlIGNhbid0IHJlbHkgb24gdG91Y2ggZXZlbnRzIGF0IHRoZVxuICAgKiBwbGF5ZXIgbGV2ZWwsIGJlY2F1c2UgYSB0YXAgKHRvdWNoc3RhcnQgKyB0b3VjaGVuZCkgb24gdGhlIHZpZGVvIGl0c2VsZiBvblxuICAgKiBtb2JpbGUgZGV2aWNlcyBpcyBtZWFudCB0byB0dXJuIGNvbnRyb2xzIG9mZiAoYW5kIG9uKS4gVXNlciBhY3Rpdml0eSBpc1xuICAgKiBjaGVja2VkIGFzeW5jaHJvbm91c2x5LCBzbyB3aGF0IGNvdWxkIGhhcHBlbiBpcyBhIHRhcCBldmVudCBvbiB0aGUgdmlkZW9cbiAgICogdHVybnMgdGhlIGNvbnRyb2xzIG9mZiwgdGhlbiB0aGUgdG91Y2hlbmQgZXZlbnQgYnViYmxlcyB1cCB0byB0aGUgcGxheWVyLFxuICAgKiB3aGljaCBpZiBpdCByZXBvcnRlZCB1c2VyIGFjdGl2aXR5LCB3b3VsZCB0dXJuIHRoZSBjb250cm9scyByaWdodCBiYWNrIG9uLlxuICAgKiAoV2UgYWxzbyBkb24ndCB3YW50IHRvIGNvbXBsZXRlbHkgYmxvY2sgdG91Y2ggZXZlbnRzIGZyb20gYnViYmxpbmcgdXApXG4gICAqIEFsc28gYSB0b3VjaG1vdmUsIHRvdWNoK2hvbGQsIGFuZCBhbnl0aGluZyBvdGhlciB0aGFuIGEgdGFwIGlzIG5vdCBzdXBwb3NlZFxuICAgKiB0byB0dXJuIHRoZSBjb250cm9scyBiYWNrIG9uIG9uIGEgbW9iaWxlIGRldmljZS5cbiAgICogSGVyZSB3ZSdyZSBzZXR0aW5nIHRoZSBkZWZhdWx0IGNvbXBvbmVudCBiZWhhdmlvciB0byByZXBvcnQgdXNlciBhY3Rpdml0eVxuICAgKiB3aGVuZXZlciB0b3VjaCBldmVudHMgaGFwcGVuLCBhbmQgdGhpcyBjYW4gYmUgdHVybmVkIG9mZiBieSBjb21wb25lbnRzIHRoYXRcbiAgICogd2FudCB0b3VjaCBldmVudHMgdG8gYWN0IGRpZmZlcmVudGx5LlxuICAgKlxuICAgKiBAbWV0aG9kIGVuYWJsZVRvdWNoQWN0aXZpdHlcbiAgICovXG4gIGVuYWJsZVRvdWNoQWN0aXZpdHkoKSB7XG4gICAgLy8gRG9uJ3QgY29udGludWUgaWYgdGhlIHJvb3QgcGxheWVyIGRvZXNuJ3Qgc3VwcG9ydCByZXBvcnRpbmcgdXNlciBhY3Rpdml0eVxuICAgIGlmICghdGhpcy5wbGF5ZXIoKSB8fCAhdGhpcy5wbGF5ZXIoKS5yZXBvcnRVc2VyQWN0aXZpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBmb3IgcmVwb3J0aW5nIHRoYXQgdGhlIHVzZXIgaXMgYWN0aXZlXG4gICAgY29uc3QgcmVwb3J0ID0gRm4uYmluZCh0aGlzLnBsYXllcigpLCB0aGlzLnBsYXllcigpLnJlcG9ydFVzZXJBY3Rpdml0eSk7XG5cbiAgICBsZXQgdG91Y2hIb2xkaW5nO1xuXG4gICAgdGhpcy5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAgcmVwb3J0KCk7XG4gICAgICAvLyBGb3IgYXMgbG9uZyBhcyB0aGUgdGhleSBhcmUgdG91Y2hpbmcgdGhlIGRldmljZSBvciBoYXZlIHRoZWlyIG1vdXNlIGRvd24sXG4gICAgICAvLyB3ZSBjb25zaWRlciB0aGVtIGFjdGl2ZSBldmVuIGlmIHRoZXkncmUgbm90IG1vdmluZyB0aGVpciBmaW5nZXIgb3IgbW91c2UuXG4gICAgICAvLyBTbyB3ZSB3YW50IHRvIGNvbnRpbnVlIHRvIHVwZGF0ZSB0aGF0IHRoZXkgYXJlIGFjdGl2ZVxuICAgICAgdGhpcy5jbGVhckludGVydmFsKHRvdWNoSG9sZGluZyk7XG4gICAgICAvLyByZXBvcnQgYXQgdGhlIHNhbWUgaW50ZXJ2YWwgYXMgYWN0aXZpdHlDaGVja1xuICAgICAgdG91Y2hIb2xkaW5nID0gdGhpcy5zZXRJbnRlcnZhbChyZXBvcnQsIDI1MCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b3VjaEVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICByZXBvcnQoKTtcbiAgICAgIC8vIHN0b3AgdGhlIGludGVydmFsIHRoYXQgbWFpbnRhaW5zIGFjdGl2aXR5IGlmIHRoZSB0b3VjaCBpcyBob2xkaW5nXG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwodG91Y2hIb2xkaW5nKTtcbiAgICB9O1xuXG4gICAgdGhpcy5vbigndG91Y2htb3ZlJywgcmVwb3J0KTtcbiAgICB0aGlzLm9uKCd0b3VjaGVuZCcsIHRvdWNoRW5kKTtcbiAgICB0aGlzLm9uKCd0b3VjaGNhbmNlbCcsIHRvdWNoRW5kKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRpbWVvdXQgYW5kIHNldHMgdXAgZGlzcG9zYWwgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIHJ1biBhZnRlciB0aGUgdGltZW91dC5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgTnVtYmVyIG9mIG1zIHRvIGRlbGF5IGJlZm9yZSBleGVjdXRpbmcgc3BlY2lmaWVkIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFJldHVybnMgdGhlIHRpbWVvdXQgSURcbiAgICogQG1ldGhvZCBzZXRUaW1lb3V0XG4gICAqL1xuICBzZXRUaW1lb3V0KGZuLCB0aW1lb3V0KSB7XG4gICAgZm4gPSBGbi5iaW5kKHRoaXMsIGZuKTtcblxuICAgIC8vIHdpbmRvdy5zZXRUaW1lb3V0IHdvdWxkIGJlIHByZWZlcmFibGUgaGVyZSwgYnV0IGR1ZSB0byBzb21lIGJpemFycmUgaXNzdWUgd2l0aCBTaW5vbiBhbmQvb3IgUGhhbnRvbWpzLCB3ZSBjYW4ndC5cbiAgICBsZXQgdGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQoZm4sIHRpbWVvdXQpO1xuXG4gICAgY29uc3QgZGlzcG9zZUZuID0gZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH07XG5cbiAgICBkaXNwb3NlRm4uZ3VpZCA9IGB2anMtdGltZW91dC0ke3RpbWVvdXRJZH1gO1xuXG4gICAgdGhpcy5vbignZGlzcG9zZScsIGRpc3Bvc2VGbik7XG5cbiAgICByZXR1cm4gdGltZW91dElkO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhIHRpbWVvdXQgYW5kIHJlbW92ZXMgdGhlIGFzc29jaWF0ZWQgZGlzcG9zZSBsaXN0ZW5lclxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gdGltZW91dElkIFRoZSBpZCBvZiB0aGUgdGltZW91dCB0byBjbGVhclxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFJldHVybnMgdGhlIHRpbWVvdXQgSURcbiAgICogQG1ldGhvZCBjbGVhclRpbWVvdXRcbiAgICovXG4gIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpIHtcbiAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG5cbiAgICBjb25zdCBkaXNwb3NlRm4gPSBmdW5jdGlvbigpIHt9O1xuXG4gICAgZGlzcG9zZUZuLmd1aWQgPSBgdmpzLXRpbWVvdXQtJHt0aW1lb3V0SWR9YDtcblxuICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgZGlzcG9zZUZuKTtcblxuICAgIHJldHVybiB0aW1lb3V0SWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnRlcnZhbCBhbmQgc2V0cyB1cCBkaXNwb3NhbCBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gcnVuIGV2ZXJ5IE4gc2Vjb25kcy5cbiAgICogQHBhcmFtIHtOdW1iZXJ9IGludGVydmFsIE51bWJlciBvZiBtcyB0byBkZWxheSBiZWZvcmUgZXhlY3V0aW5nIHNwZWNpZmllZCBmdW5jdGlvbi5cbiAgICogQHJldHVybiB7TnVtYmVyfSBSZXR1cm5zIHRoZSBpbnRlcnZhbCBJRFxuICAgKiBAbWV0aG9kIHNldEludGVydmFsXG4gICAqL1xuICBzZXRJbnRlcnZhbChmbiwgaW50ZXJ2YWwpIHtcbiAgICBmbiA9IEZuLmJpbmQodGhpcywgZm4pO1xuXG4gICAgbGV0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZm4sIGludGVydmFsKTtcblxuICAgIGNvbnN0IGRpc3Bvc2VGbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuICAgIH07XG5cbiAgICBkaXNwb3NlRm4uZ3VpZCA9IGB2anMtaW50ZXJ2YWwtJHtpbnRlcnZhbElkfWA7XG5cbiAgICB0aGlzLm9uKCdkaXNwb3NlJywgZGlzcG9zZUZuKTtcblxuICAgIHJldHVybiBpbnRlcnZhbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFycyBhbiBpbnRlcnZhbCBhbmQgcmVtb3ZlcyB0aGUgYXNzb2NpYXRlZCBkaXNwb3NlIGxpc3RlbmVyXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSBpbnRlcnZhbElkIFRoZSBpZCBvZiB0aGUgaW50ZXJ2YWwgdG8gY2xlYXJcbiAgICogQHJldHVybiB7TnVtYmVyfSBSZXR1cm5zIHRoZSBpbnRlcnZhbCBJRFxuICAgKiBAbWV0aG9kIGNsZWFySW50ZXJ2YWxcbiAgICovXG4gIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWxJZCkge1xuICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xuXG4gICAgY29uc3QgZGlzcG9zZUZuID0gZnVuY3Rpb24oKSB7fTtcblxuICAgIGRpc3Bvc2VGbi5ndWlkID0gYHZqcy1pbnRlcnZhbC0ke2ludGVydmFsSWR9YDtcblxuICAgIHRoaXMub2ZmKCdkaXNwb3NlJywgZGlzcG9zZUZuKTtcblxuICAgIHJldHVybiBpbnRlcnZhbElkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBjb21wb25lbnQgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IGNvbXAgVGhlIGNvbXBvbmVudCB0byByZWdpc3RlclxuICAgKiBAc3RhdGljXG4gICAqIEBtZXRob2QgcmVnaXN0ZXJDb21wb25lbnRcbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNvbXBvbmVudChuYW1lLCBjb21wKSB7XG4gICAgaWYgKCFDb21wb25lbnQuY29tcG9uZW50c18pIHtcbiAgICAgIENvbXBvbmVudC5jb21wb25lbnRzXyA9IHt9O1xuICAgIH1cblxuICAgIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXSA9IGNvbXA7XG4gICAgcmV0dXJuIGNvbXA7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIGNvbXBvbmVudCB0byBnZXRcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAc3RhdGljXG4gICAqIEBtZXRob2QgZ2V0Q29tcG9uZW50XG4gICAqL1xuICBzdGF0aWMgZ2V0Q29tcG9uZW50KG5hbWUpIHtcbiAgICBpZiAoQ29tcG9uZW50LmNvbXBvbmVudHNfICYmIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXSkge1xuICAgICAgcmV0dXJuIENvbXBvbmVudC5jb21wb25lbnRzX1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93ICYmIHdpbmRvdy52aWRlb2pzICYmIHdpbmRvdy52aWRlb2pzW25hbWVdKSB7XG4gICAgICBsb2cud2FybihgVGhlICR7bmFtZX0gY29tcG9uZW50IHdhcyBhZGRlZCB0byB0aGUgdmlkZW9qcyBvYmplY3Qgd2hlbiBpdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCB1c2luZyB2aWRlb2pzLnJlZ2lzdGVyQ29tcG9uZW50KG5hbWUsIGNvbXBvbmVudClgKTtcbiAgICAgIHJldHVybiB3aW5kb3cudmlkZW9qc1tuYW1lXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgY29uc3RydWN0b3IgdXNpbmcgdGhlIHN1cHBsaWVkIGluaXQgbWV0aG9kXG4gICAqIG9yIHVzZXMgdGhlIGluaXQgb2YgdGhlIHBhcmVudCBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG4gICAqIEBzdGF0aWNcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogQG1ldGhvZCBleHRlbmRcbiAgICovXG4gIHN0YXRpYyBleHRlbmQocHJvcHMpIHtcbiAgICBwcm9wcyA9IHByb3BzIHx8IHt9O1xuXG4gICAgbG9nLndhcm4oJ0NvbXBvbmVudC5leHRlbmQoe30pIGhhcyBiZWVuIGRlcHJlY2F0ZWQsIHVzZSB2aWRlb2pzLmV4dGVuZChDb21wb25lbnQsIHt9KSBpbnN0ZWFkJyk7XG5cbiAgICAvLyBTZXQgdXAgdGhlIGNvbnN0cnVjdG9yIHVzaW5nIHRoZSBzdXBwbGllZCBpbml0IG1ldGhvZFxuICAgIC8vIG9yIHVzaW5nIHRoZSBpbml0IG9mIHRoZSBwYXJlbnQgb2JqZWN0XG4gICAgLy8gTWFrZSBzdXJlIHRvIGNoZWNrIHRoZSB1bm9iZnVzY2F0ZWQgdmVyc2lvbiBmb3IgZXh0ZXJuYWwgbGlic1xuICAgIGxldCBpbml0ID0gcHJvcHMuaW5pdCB8fCBwcm9wcy5pbml0IHx8IHRoaXMucHJvdG90eXBlLmluaXQgfHwgdGhpcy5wcm90b3R5cGUuaW5pdCB8fCBmdW5jdGlvbigpIHt9O1xuICAgIC8vIEluIFJlc2lnJ3Mgc2ltcGxlIGNsYXNzIGluaGVyaXRhbmNlIChwcmV2aW91c2x5IHVzZWQpIHRoZSBjb25zdHJ1Y3RvclxuICAgIC8vICBpcyBhIGZ1bmN0aW9uIHRoYXQgY2FsbHMgYHRoaXMuaW5pdC5hcHBseShhcmd1bWVudHMpYFxuICAgIC8vIEhvd2V2ZXIgdGhhdCB3b3VsZCBwcmV2ZW50IHVzIGZyb20gdXNpbmcgYFBhcmVudE9iamVjdC5jYWxsKHRoaXMpO2BcbiAgICAvLyAgaW4gYSBDaGlsZCBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZSBgdGhpc2AgaW4gYHRoaXMuaW5pdGBcbiAgICAvLyAgd291bGQgc3RpbGwgcmVmZXIgdG8gdGhlIENoaWxkIGFuZCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLlxuICAgIC8vIFdlIHdvdWxkIGluc3RlYWQgaGF2ZSB0byBkb1xuICAgIC8vICAgIGBQYXJlbnRPYmplY3QucHJvdG90eXBlLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtgXG4gICAgLy8gIEJsZWguIFdlJ3JlIG5vdCBjcmVhdGluZyBhIF9zdXBlcigpIGZ1bmN0aW9uLCBzbyBpdCdzIGdvb2QgdG8ga2VlcFxuICAgIC8vICB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHJlZmVyZW5jZSBzaW1wbGUuXG4gICAgbGV0IHN1Yk9iaiA9IGZ1bmN0aW9uKCkge1xuICAgICAgaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICAvLyBJbmhlcml0IGZyb20gdGhpcyBvYmplY3QncyBwcm90b3R5cGVcbiAgICBzdWJPYmoucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSh0aGlzLnByb3RvdHlwZSk7XG4gICAgLy8gUmVzZXQgdGhlIGNvbnN0cnVjdG9yIHByb3BlcnR5IGZvciBzdWJPYmogb3RoZXJ3aXNlXG4gICAgLy8gaW5zdGFuY2VzIG9mIHN1Yk9iaiB3b3VsZCBoYXZlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgcGFyZW50IE9iamVjdFxuICAgIHN1Yk9iai5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBzdWJPYmo7XG5cbiAgICAvLyBNYWtlIHRoZSBjbGFzcyBleHRlbmRhYmxlXG4gICAgc3ViT2JqLmV4dGVuZCA9IENvbXBvbmVudC5leHRlbmQ7XG5cbiAgICAvLyBFeHRlbmQgc3ViT2JqJ3MgcHJvdG90eXBlIHdpdGggZnVuY3Rpb25zIGFuZCBvdGhlciBwcm9wZXJ0aWVzIGZyb20gcHJvcHNcbiAgICBmb3IgKGxldCBuYW1lIGluIHByb3BzKSB7XG4gICAgICBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgICAgc3ViT2JqLnByb3RvdHlwZVtuYW1lXSA9IHByb3BzW25hbWVdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdWJPYmo7XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDb21wb25lbnQnLCBDb21wb25lbnQpO1xuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50O1xuIl19
},{"./utils/dom.js":144,"./utils/events.js":145,"./utils/fn.js":146,"./utils/guid.js":148,"./utils/log.js":149,"./utils/merge-options.js":150,"./utils/to-title-case.js":153,"global/window":8,"object.assign":53}],67:[function(_dereq_,module,exports){
/**
* @file audio-track-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackButtonJs = _dereq_('../track-button.js');
var _trackButtonJs2 = _interopRequireDefault(_trackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _audioTrackMenuItemJs = _dereq_('./audio-track-menu-item.js');
var _audioTrackMenuItemJs2 = _interopRequireDefault(_audioTrackMenuItemJs);
/**
* The base class for buttons that toggle specific text track types (e.g. subtitles)
*
* @param {Player|Object} player
* @param {Object=} options
* @extends TrackButton
* @class AudioTrackButton
*/
var AudioTrackButton = (function (_TrackButton) {
_inherits(AudioTrackButton, _TrackButton);
function AudioTrackButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, AudioTrackButton);
options.tracks = player.audioTracks && player.audioTracks();
_TrackButton.call(this, player, options);
this.el_.setAttribute('aria-label', 'Audio Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
AudioTrackButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-audio-button ' + _TrackButton.prototype.buildCSSClass.call(this);
};
/**
* Create a menu item for each audio track
*
* @return {Array} Array of menu items
* @method createItems
*/
AudioTrackButton.prototype.createItems = function createItems() {
var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
var tracks = this.player_.audioTracks && this.player_.audioTracks();
if (!tracks) {
return items;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
items.push(new _audioTrackMenuItemJs2['default'](this.player_, {
// MenuItem is selectable
'selectable': true,
'track': track
}));
}
return items;
};
return AudioTrackButton;
})(_trackButtonJs2['default']);
_componentJs2['default'].registerComponent('AudioTrackButton', AudioTrackButton);
exports['default'] = AudioTrackButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9hdWRpby10cmFjay1jb250cm9scy9hdWRpby10cmFjay1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzZCQUd3QixvQkFBb0I7Ozs7MkJBQ3RCLG9CQUFvQjs7Ozt5QkFDdEIsbUJBQW1COztJQUEzQixFQUFFOztvQ0FDaUIsNEJBQTRCOzs7Ozs7Ozs7Ozs7O0lBVXJELGdCQUFnQjtZQUFoQixnQkFBZ0I7O0FBQ1QsV0FEUCxnQkFBZ0IsQ0FDUixNQUFNLEVBQWdCO1FBQWQsT0FBTyx5REFBRyxFQUFFOzswQkFENUIsZ0JBQWdCOztBQUVsQixXQUFPLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxXQUFXLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDOztBQUU1RCw0QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQztHQUNuRDs7Ozs7Ozs7O0FBUEcsa0JBQWdCLFdBZXBCLGFBQWEsR0FBQSx5QkFBRztBQUNkLGlDQUEyQix1QkFBTSxhQUFhLEtBQUEsTUFBRSxDQUFHO0dBQ3BEOzs7Ozs7Ozs7QUFqQkcsa0JBQWdCLFdBeUJwQixXQUFXLEdBQUEsdUJBQWE7UUFBWixLQUFLLHlEQUFHLEVBQUU7O0FBQ3BCLFFBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0FBRXBFLFFBQUksQ0FBQyxNQUFNLEVBQUU7QUFDWCxhQUFPLEtBQUssQ0FBQztLQUNkOztBQUVELFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFVBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEIsV0FBSyxDQUFDLElBQUksQ0FBQyxzQ0FBdUIsSUFBSSxDQUFDLE9BQU8sRUFBRTs7QUFFOUMsb0JBQVksRUFBRSxJQUFJO0FBQ2xCLGVBQU8sRUFBRSxLQUFLO09BQ2YsQ0FBQyxDQUFDLENBQUM7S0FDTDs7QUFFRCxXQUFPLEtBQUssQ0FBQztHQUNkOztTQTNDRyxnQkFBZ0I7OztBQThDdEIseUJBQVUsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztxQkFDbkQsZ0JBQWdCIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9hdWRpby10cmFjay1jb250cm9scy9hdWRpby10cmFjay1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGF1ZGlvLXRyYWNrLWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgVHJhY2tCdXR0b24gZnJvbSAnLi4vdHJhY2stYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uLy4uL3V0aWxzL2ZuLmpzJztcbmltcG9ydCBBdWRpb1RyYWNrTWVudUl0ZW0gZnJvbSAnLi9hdWRpby10cmFjay1tZW51LWl0ZW0uanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBidXR0b25zIHRoYXQgdG9nZ2xlIHNwZWNpZmljIHRleHQgdHJhY2sgdHlwZXMgKGUuZy4gc3VidGl0bGVzKVxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIFRyYWNrQnV0dG9uXG4gKiBAY2xhc3MgQXVkaW9UcmFja0J1dHRvblxuICovXG5jbGFzcyBBdWRpb1RyYWNrQnV0dG9uIGV4dGVuZHMgVHJhY2tCdXR0b24ge1xuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIG9wdGlvbnMudHJhY2tzID0gcGxheWVyLmF1ZGlvVHJhY2tzICYmIHBsYXllci5hdWRpb1RyYWNrcygpO1xuXG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdBdWRpbyBNZW51Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNvbnN0cnVjdGVkIGNsYXNzIG5hbWVcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBgdmpzLWF1ZGlvLWJ1dHRvbiAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG1lbnUgaXRlbSBmb3IgZWFjaCBhdWRpbyB0cmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgbWVudSBpdGVtc1xuICAgKiBAbWV0aG9kIGNyZWF0ZUl0ZW1zXG4gICAqL1xuICBjcmVhdGVJdGVtcyhpdGVtcyA9IFtdKSB7XG4gICAgbGV0IHRyYWNrcyA9IHRoaXMucGxheWVyXy5hdWRpb1RyYWNrcyAmJiB0aGlzLnBsYXllcl8uYXVkaW9UcmFja3MoKTtcblxuICAgIGlmICghdHJhY2tzKSB7XG4gICAgICByZXR1cm4gaXRlbXM7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0cmFjayA9IHRyYWNrc1tpXTtcblxuICAgICAgaXRlbXMucHVzaChuZXcgQXVkaW9UcmFja01lbnVJdGVtKHRoaXMucGxheWVyXywge1xuICAgICAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgICAgICdzZWxlY3RhYmxlJzogdHJ1ZSxcbiAgICAgICAgJ3RyYWNrJzogdHJhY2tcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXRlbXM7XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdBdWRpb1RyYWNrQnV0dG9uJywgQXVkaW9UcmFja0J1dHRvbik7XG5leHBvcnQgZGVmYXVsdCBBdWRpb1RyYWNrQnV0dG9uO1xuIl19
},{"../../component.js":66,"../../utils/fn.js":146,"../track-button.js":97,"./audio-track-menu-item.js":68}],68:[function(_dereq_,module,exports){
/**
* @file audio-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* The audio track menu item
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class AudioTrackMenuItem
*/
var AudioTrackMenuItem = (function (_MenuItem) {
_inherits(AudioTrackMenuItem, _MenuItem);
function AudioTrackMenuItem(player, options) {
var _this = this;
_classCallCheck(this, AudioTrackMenuItem);
var track = options.track;
var tracks = player.audioTracks();
// Modify options for parent MenuItem class's init.
options.label = track.label || track.language || 'Unknown';
options.selected = track.enabled;
_MenuItem.call(this, player, options);
this.track = track;
if (tracks) {
(function () {
var changeHandler = Fn.bind(_this, _this.handleTracksChange);
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function () {
tracks.removeEventListener('change', changeHandler);
});
})();
}
}
/**
* Handle click on audio track
*
* @method handleClick
*/
AudioTrackMenuItem.prototype.handleClick = function handleClick(event) {
var tracks = this.player_.audioTracks();
_MenuItem.prototype.handleClick.call(this, event);
if (!tracks) return;
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track === this.track) {
track.enabled = true;
}
}
};
/**
* Handle audio track change
*
* @method handleTracksChange
*/
AudioTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
this.selected(this.track.enabled);
};
return AudioTrackMenuItem;
})(_menuMenuItemJs2['default']);
_componentJs2['default'].registerComponent('AudioTrackMenuItem', AudioTrackMenuItem);
exports['default'] = AudioTrackMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9hdWRpby10cmFjay1jb250cm9scy9hdWRpby10cmFjay1tZW51LWl0ZW0uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzhCQUdxQix5QkFBeUI7Ozs7MkJBQ3hCLG9CQUFvQjs7Ozt5QkFDdEIsbUJBQW1COztJQUEzQixFQUFFOzs7Ozs7Ozs7OztJQVVSLGtCQUFrQjtZQUFsQixrQkFBa0I7O0FBQ1gsV0FEUCxrQkFBa0IsQ0FDVixNQUFNLEVBQUUsT0FBTyxFQUFFOzs7MEJBRHpCLGtCQUFrQjs7QUFFcEIsUUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQUMxQixRQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7OztBQUdsQyxXQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxTQUFTLENBQUM7QUFDM0QsV0FBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDOztBQUVqQyx5QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDOztBQUVuQixRQUFJLE1BQU0sRUFBRTs7QUFDVixZQUFJLGFBQWEsR0FBRyxFQUFFLENBQUMsSUFBSSxRQUFPLE1BQUssa0JBQWtCLENBQUMsQ0FBQzs7QUFFM0QsY0FBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNqRCxjQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBTTtBQUN2QixnQkFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNyRCxDQUFDLENBQUM7O0tBQ0o7R0FDRjs7Ozs7Ozs7QUFyQkcsb0JBQWtCLFdBNEJ0QixXQUFXLEdBQUEscUJBQUMsS0FBSyxFQUFFO0FBQ2pCLFFBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7O0FBRXhDLHdCQUFNLFdBQVcsS0FBQSxPQUFDLEtBQUssQ0FBQyxDQUFDOztBQUV6QixRQUFJLENBQUMsTUFBTSxFQUFFLE9BQU87O0FBRXBCLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3RDLFVBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdEIsVUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtBQUN4QixhQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztPQUN0QjtLQUNGO0dBQ0Y7Ozs7Ozs7O0FBMUNHLG9CQUFrQixXQWlEdEIsa0JBQWtCLEdBQUEsNEJBQUMsS0FBSyxFQUFFO0FBQ3hCLFFBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUNuQzs7U0FuREcsa0JBQWtCOzs7QUFzRHhCLHlCQUFVLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7cUJBQ3ZELGtCQUFrQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvYXVkaW8tdHJhY2stY29udHJvbHMvYXVkaW8tdHJhY2stbWVudS1pdGVtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBhdWRpby10cmFjay1tZW51LWl0ZW0uanNcbiAqL1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJy4uLy4uL21lbnUvbWVudS1pdGVtLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uLy4uL3V0aWxzL2ZuLmpzJztcblxuLyoqXG4gKiBUaGUgYXVkaW8gdHJhY2sgbWVudSBpdGVtXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgTWVudUl0ZW1cbiAqIEBjbGFzcyBBdWRpb1RyYWNrTWVudUl0ZW1cbiAqL1xuY2xhc3MgQXVkaW9UcmFja01lbnVJdGVtIGV4dGVuZHMgTWVudUl0ZW0ge1xuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBsZXQgdHJhY2sgPSBvcHRpb25zLnRyYWNrO1xuICAgIGxldCB0cmFja3MgPSBwbGF5ZXIuYXVkaW9UcmFja3MoKTtcblxuICAgIC8vIE1vZGlmeSBvcHRpb25zIGZvciBwYXJlbnQgTWVudUl0ZW0gY2xhc3MncyBpbml0LlxuICAgIG9wdGlvbnMubGFiZWwgPSB0cmFjay5sYWJlbCB8fCB0cmFjay5sYW5ndWFnZSB8fCAnVW5rbm93bic7XG4gICAgb3B0aW9ucy5zZWxlY3RlZCA9IHRyYWNrLmVuYWJsZWQ7XG5cbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy50cmFjayA9IHRyYWNrO1xuXG4gICAgaWYgKHRyYWNrcykge1xuICAgICAgbGV0IGNoYW5nZUhhbmRsZXIgPSBGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlVHJhY2tzQ2hhbmdlKTtcblxuICAgICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgdGhpcy5vbignZGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiBhdWRpbyB0cmFja1xuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZUNsaWNrXG4gICAqL1xuICBoYW5kbGVDbGljayhldmVudCkge1xuICAgIGxldCB0cmFja3MgPSB0aGlzLnBsYXllcl8uYXVkaW9UcmFja3MoKTtcblxuICAgIHN1cGVyLmhhbmRsZUNsaWNrKGV2ZW50KTtcblxuICAgIGlmICghdHJhY2tzKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICBpZiAodHJhY2sgPT09IHRoaXMudHJhY2spIHtcbiAgICAgICAgdHJhY2suZW5hYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhdWRpbyB0cmFjayBjaGFuZ2VcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVUcmFja3NDaGFuZ2VcbiAgICovXG4gIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCkge1xuICAgIHRoaXMuc2VsZWN0ZWQodGhpcy50cmFjay5lbmFibGVkKTtcbiAgfVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0F1ZGlvVHJhY2tNZW51SXRlbScsIEF1ZGlvVHJhY2tNZW51SXRlbSk7XG5leHBvcnQgZGVmYXVsdCBBdWRpb1RyYWNrTWVudUl0ZW07XG4iXX0=
},{"../../component.js":66,"../../menu/menu-item.js":110,"../../utils/fn.js":146}],69:[function(_dereq_,module,exports){
/**
* @file control-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
// Required children
var _playToggleJs = _dereq_('./play-toggle.js');
var _playToggleJs2 = _interopRequireDefault(_playToggleJs);
var _timeControlsCurrentTimeDisplayJs = _dereq_('./time-controls/current-time-display.js');
var _timeControlsCurrentTimeDisplayJs2 = _interopRequireDefault(_timeControlsCurrentTimeDisplayJs);
var _timeControlsDurationDisplayJs = _dereq_('./time-controls/duration-display.js');
var _timeControlsDurationDisplayJs2 = _interopRequireDefault(_timeControlsDurationDisplayJs);
var _timeControlsTimeDividerJs = _dereq_('./time-controls/time-divider.js');
var _timeControlsTimeDividerJs2 = _interopRequireDefault(_timeControlsTimeDividerJs);
var _timeControlsRemainingTimeDisplayJs = _dereq_('./time-controls/remaining-time-display.js');
var _timeControlsRemainingTimeDisplayJs2 = _interopRequireDefault(_timeControlsRemainingTimeDisplayJs);
var _liveDisplayJs = _dereq_('./live-display.js');
var _liveDisplayJs2 = _interopRequireDefault(_liveDisplayJs);
var _progressControlProgressControlJs = _dereq_('./progress-control/progress-control.js');
var _progressControlProgressControlJs2 = _interopRequireDefault(_progressControlProgressControlJs);
var _fullscreenToggleJs = _dereq_('./fullscreen-toggle.js');
var _fullscreenToggleJs2 = _interopRequireDefault(_fullscreenToggleJs);
var _volumeControlVolumeControlJs = _dereq_('./volume-control/volume-control.js');
var _volumeControlVolumeControlJs2 = _interopRequireDefault(_volumeControlVolumeControlJs);
var _volumeMenuButtonJs = _dereq_('./volume-menu-button.js');
var _volumeMenuButtonJs2 = _interopRequireDefault(_volumeMenuButtonJs);
var _muteToggleJs = _dereq_('./mute-toggle.js');
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
var _textTrackControlsChaptersButtonJs = _dereq_('./text-track-controls/chapters-button.js');
var _textTrackControlsChaptersButtonJs2 = _interopRequireDefault(_textTrackControlsChaptersButtonJs);
var _textTrackControlsDescriptionsButtonJs = _dereq_('./text-track-controls/descriptions-button.js');
var _textTrackControlsDescriptionsButtonJs2 = _interopRequireDefault(_textTrackControlsDescriptionsButtonJs);
var _textTrackControlsSubtitlesButtonJs = _dereq_('./text-track-controls/subtitles-button.js');
var _textTrackControlsSubtitlesButtonJs2 = _interopRequireDefault(_textTrackControlsSubtitlesButtonJs);
var _textTrackControlsCaptionsButtonJs = _dereq_('./text-track-controls/captions-button.js');
var _textTrackControlsCaptionsButtonJs2 = _interopRequireDefault(_textTrackControlsCaptionsButtonJs);
var _audioTrackControlsAudioTrackButtonJs = _dereq_('./audio-track-controls/audio-track-button.js');
var _audioTrackControlsAudioTrackButtonJs2 = _interopRequireDefault(_audioTrackControlsAudioTrackButtonJs);
var _playbackRateMenuPlaybackRateMenuButtonJs = _dereq_('./playback-rate-menu/playback-rate-menu-button.js');
var _playbackRateMenuPlaybackRateMenuButtonJs2 = _interopRequireDefault(_playbackRateMenuPlaybackRateMenuButtonJs);
var _spacerControlsCustomControlSpacerJs = _dereq_('./spacer-controls/custom-control-spacer.js');
var _spacerControlsCustomControlSpacerJs2 = _interopRequireDefault(_spacerControlsCustomControlSpacerJs);
/**
* Container of main controls
*
* @extends Component
* @class ControlBar
*/
var ControlBar = (function (_Component) {
_inherits(ControlBar, _Component);
function ControlBar() {
_classCallCheck(this, ControlBar);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
ControlBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-control-bar',
dir: 'ltr'
}, {
'role': 'group' // The control bar is a group, so it can contain menuitems
});
};
return ControlBar;
})(_componentJs2['default']);
ControlBar.prototype.options_ = {
loadEvent: 'play',
children: ['playToggle', 'volumeMenuButton', 'currentTimeDisplay', 'timeDivider', 'durationDisplay', 'progressControl', 'liveDisplay', 'remainingTimeDisplay', 'customControlSpacer', 'playbackRateMenuButton', 'chaptersButton', 'descriptionsButton', 'subtitlesButton', 'captionsButton', 'audioTrackButton', 'fullscreenToggle']
};
_componentJs2['default'].registerComponent('ControlBar', ControlBar);
exports['default'] = ControlBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9jb250cm9sLWJhci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OzJCQUdzQixpQkFBaUI7Ozs7Ozs0QkFHaEIsa0JBQWtCOzs7O2dEQUNWLHlDQUF5Qzs7Ozs2Q0FDNUMscUNBQXFDOzs7O3lDQUN6QyxpQ0FBaUM7Ozs7a0RBQ3hCLDJDQUEyQzs7Ozs2QkFDcEQsbUJBQW1COzs7O2dEQUNmLHdDQUF3Qzs7OztrQ0FDdkMsd0JBQXdCOzs7OzRDQUMzQixvQ0FBb0M7Ozs7a0NBQ2pDLHlCQUF5Qjs7Ozs0QkFDL0Isa0JBQWtCOzs7O2lEQUNkLDBDQUEwQzs7OztxREFDdEMsOENBQThDOzs7O2tEQUNqRCwyQ0FBMkM7Ozs7aURBQzVDLDBDQUEwQzs7OztvREFDeEMsOENBQThDOzs7O3dEQUN4QyxtREFBbUQ7Ozs7bURBQ3RELDRDQUE0Qzs7Ozs7Ozs7Ozs7SUFRdEUsVUFBVTtZQUFWLFVBQVU7O1dBQVYsVUFBVTswQkFBVixVQUFVOzs7Ozs7Ozs7Ozs7QUFBVixZQUFVLFdBUWQsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsV0FBTyxxQkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDM0IsZUFBUyxFQUFFLGlCQUFpQjtBQUM1QixTQUFHLEVBQUUsS0FBSztLQUNYLEVBQUU7QUFDRCxZQUFNLEVBQUUsT0FBTztLQUNoQixDQUFDLENBQUM7R0FDSjs7U0FmRyxVQUFVOzs7QUFrQmhCLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0FBQzlCLFdBQVMsRUFBRSxNQUFNO0FBQ2pCLFVBQVEsRUFBRSxDQUNSLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsb0JBQW9CLEVBQ3BCLGFBQWEsRUFDYixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGtCQUFrQixDQUNuQjtDQUNGLENBQUM7O0FBRUYseUJBQVUsaUJBQWlCLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDO3FCQUN2QyxVQUFVIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9jb250cm9sLWJhci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgY29udHJvbC1iYXIuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi9jb21wb25lbnQuanMnO1xuXG4vLyBSZXF1aXJlZCBjaGlsZHJlblxuaW1wb3J0IFBsYXlUb2dnbGUgZnJvbSAnLi9wbGF5LXRvZ2dsZS5qcyc7XG5pbXBvcnQgQ3VycmVudFRpbWVEaXNwbGF5IGZyb20gJy4vdGltZS1jb250cm9scy9jdXJyZW50LXRpbWUtZGlzcGxheS5qcyc7XG5pbXBvcnQgRHVyYXRpb25EaXNwbGF5IGZyb20gJy4vdGltZS1jb250cm9scy9kdXJhdGlvbi1kaXNwbGF5LmpzJztcbmltcG9ydCBUaW1lRGl2aWRlciBmcm9tICcuL3RpbWUtY29udHJvbHMvdGltZS1kaXZpZGVyLmpzJztcbmltcG9ydCBSZW1haW5pbmdUaW1lRGlzcGxheSBmcm9tICcuL3RpbWUtY29udHJvbHMvcmVtYWluaW5nLXRpbWUtZGlzcGxheS5qcyc7XG5pbXBvcnQgTGl2ZURpc3BsYXkgZnJvbSAnLi9saXZlLWRpc3BsYXkuanMnO1xuaW1wb3J0IFByb2dyZXNzQ29udHJvbCBmcm9tICcuL3Byb2dyZXNzLWNvbnRyb2wvcHJvZ3Jlc3MtY29udHJvbC5qcyc7XG5pbXBvcnQgRnVsbHNjcmVlblRvZ2dsZSBmcm9tICcuL2Z1bGxzY3JlZW4tdG9nZ2xlLmpzJztcbmltcG9ydCBWb2x1bWVDb250cm9sIGZyb20gJy4vdm9sdW1lLWNvbnRyb2wvdm9sdW1lLWNvbnRyb2wuanMnO1xuaW1wb3J0IFZvbHVtZU1lbnVCdXR0b24gZnJvbSAnLi92b2x1bWUtbWVudS1idXR0b24uanMnO1xuaW1wb3J0IE11dGVUb2dnbGUgZnJvbSAnLi9tdXRlLXRvZ2dsZS5qcyc7XG5pbXBvcnQgQ2hhcHRlcnNCdXR0b24gZnJvbSAnLi90ZXh0LXRyYWNrLWNvbnRyb2xzL2NoYXB0ZXJzLWJ1dHRvbi5qcyc7XG5pbXBvcnQgRGVzY3JpcHRpb25zQnV0dG9uIGZyb20gJy4vdGV4dC10cmFjay1jb250cm9scy9kZXNjcmlwdGlvbnMtYnV0dG9uLmpzJztcbmltcG9ydCBTdWJ0aXRsZXNCdXR0b24gZnJvbSAnLi90ZXh0LXRyYWNrLWNvbnRyb2xzL3N1YnRpdGxlcy1idXR0b24uanMnO1xuaW1wb3J0IENhcHRpb25zQnV0dG9uIGZyb20gJy4vdGV4dC10cmFjay1jb250cm9scy9jYXB0aW9ucy1idXR0b24uanMnO1xuaW1wb3J0IEF1ZGlvVHJhY2tCdXR0b24gZnJvbSAnLi9hdWRpby10cmFjay1jb250cm9scy9hdWRpby10cmFjay1idXR0b24uanMnO1xuaW1wb3J0IFBsYXliYWNrUmF0ZU1lbnVCdXR0b24gZnJvbSAnLi9wbGF5YmFjay1yYXRlLW1lbnUvcGxheWJhY2stcmF0ZS1tZW51LWJ1dHRvbi5qcyc7XG5pbXBvcnQgQ3VzdG9tQ29udHJvbFNwYWNlciBmcm9tICcuL3NwYWNlci1jb250cm9scy9jdXN0b20tY29udHJvbC1zcGFjZXIuanMnO1xuXG4vKipcbiAqIENvbnRhaW5lciBvZiBtYWluIGNvbnRyb2xzXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgQ29udHJvbEJhclxuICovXG5jbGFzcyBDb250cm9sQmFyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1jb250cm9sLWJhcicsXG4gICAgICBkaXI6ICdsdHInXG4gICAgfSwge1xuICAgICAgJ3JvbGUnOiAnZ3JvdXAnIC8vIFRoZSBjb250cm9sIGJhciBpcyBhIGdyb3VwLCBzbyBpdCBjYW4gY29udGFpbiBtZW51aXRlbXNcbiAgICB9KTtcbiAgfVxufVxuXG5Db250cm9sQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgbG9hZEV2ZW50OiAncGxheScsXG4gIGNoaWxkcmVuOiBbXG4gICAgJ3BsYXlUb2dnbGUnLFxuICAgICd2b2x1bWVNZW51QnV0dG9uJyxcbiAgICAnY3VycmVudFRpbWVEaXNwbGF5JyxcbiAgICAndGltZURpdmlkZXInLFxuICAgICdkdXJhdGlvbkRpc3BsYXknLFxuICAgICdwcm9ncmVzc0NvbnRyb2wnLFxuICAgICdsaXZlRGlzcGxheScsXG4gICAgJ3JlbWFpbmluZ1RpbWVEaXNwbGF5JyxcbiAgICAnY3VzdG9tQ29udHJvbFNwYWNlcicsXG4gICAgJ3BsYXliYWNrUmF0ZU1lbnVCdXR0b24nLFxuICAgICdjaGFwdGVyc0J1dHRvbicsXG4gICAgJ2Rlc2NyaXB0aW9uc0J1dHRvbicsXG4gICAgJ3N1YnRpdGxlc0J1dHRvbicsXG4gICAgJ2NhcHRpb25zQnV0dG9uJyxcbiAgICAnYXVkaW9UcmFja0J1dHRvbicsXG4gICAgJ2Z1bGxzY3JlZW5Ub2dnbGUnXG4gIF1cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ29udHJvbEJhcicsIENvbnRyb2xCYXIpO1xuZXhwb3J0IGRlZmF1bHQgQ29udHJvbEJhcjtcbiJdfQ==
},{"../component.js":66,"./audio-track-controls/audio-track-button.js":67,"./fullscreen-toggle.js":70,"./live-display.js":71,"./mute-toggle.js":72,"./play-toggle.js":73,"./playback-rate-menu/playback-rate-menu-button.js":74,"./progress-control/progress-control.js":79,"./spacer-controls/custom-control-spacer.js":82,"./text-track-controls/captions-button.js":85,"./text-track-controls/chapters-button.js":86,"./text-track-controls/descriptions-button.js":88,"./text-track-controls/subtitles-button.js":90,"./time-controls/current-time-display.js":93,"./time-controls/duration-display.js":94,"./time-controls/remaining-time-display.js":95,"./time-controls/time-divider.js":96,"./volume-control/volume-control.js":99,"./volume-menu-button.js":102}],70:[function(_dereq_,module,exports){
/**
* @file fullscreen-toggle.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* Toggle fullscreen video
*
* @extends Button
* @class FullscreenToggle
*/
var FullscreenToggle = (function (_Button) {
_inherits(FullscreenToggle, _Button);
function FullscreenToggle(player, options) {
var _this = this;
_classCallCheck(this, FullscreenToggle);
_Button.call(this, player, options);
player.on('ready', function () {
_this.player_.on('fullscreenchange', Fn.bind(_this, _this.updateHint));
});
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
FullscreenToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-fullscreen-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handles click for full screen
*
* @method handleClick
*/
FullscreenToggle.prototype.handleClick = function handleClick() {
if (!this.player_.isFullscreen()) {
this.player_.requestFullscreen();
} else {
this.player_.exitFullscreen();
}
this.updateHint();
};
/**
* Update button controlText
*
* @method update
*/
FullscreenToggle.prototype.updateHint = function updateHint() {
if (this.player_.isFullscreen()) {
this.controlText('Exit fullscreen');
} else {
this.controlText('Fullscreen');
}
};
return FullscreenToggle;
})(_buttonJs2['default']);
FullscreenToggle.prototype.controlText_ = 'Fullscreen';
_componentJs2['default'].registerComponent('FullscreenToggle', FullscreenToggle);
exports['default'] = FullscreenToggle;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9mdWxsc2NyZWVuLXRvZ2dsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7d0JBR21CLGNBQWM7Ozs7MkJBQ1gsaUJBQWlCOzs7O3lCQUNuQixnQkFBZ0I7O0lBQXhCLEVBQUU7Ozs7Ozs7OztJQVFSLGdCQUFnQjtZQUFoQixnQkFBZ0I7O0FBQ1QsV0FEUCxnQkFBZ0IsQ0FDUixNQUFNLEVBQUUsT0FBTyxFQUFFOzs7MEJBRHpCLGdCQUFnQjs7QUFFbEIsdUJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixVQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFNO0FBQ3ZCLFlBQUssT0FBTyxDQUFDLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsSUFBSSxRQUFPLE1BQUssVUFBVSxDQUFDLENBQUMsQ0FBQztLQUNyRSxDQUFDLENBQUM7R0FDSjs7Ozs7Ozs7O0FBUEcsa0JBQWdCLFdBZXBCLGFBQWEsR0FBQSx5QkFBRztBQUNkLHVDQUFpQyxrQkFBTSxhQUFhLEtBQUEsTUFBRSxDQUFHO0dBQzFEOzs7Ozs7OztBQWpCRyxrQkFBZ0IsV0F3QnBCLFdBQVcsR0FBQSx1QkFBRztBQUNaLFFBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO0FBQ2hDLFVBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztLQUNsQyxNQUFNO0FBQ0wsVUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztLQUMvQjs7QUFFRCxRQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7R0FDbkI7Ozs7Ozs7O0FBaENHLGtCQUFnQixXQXVDcEIsVUFBVSxHQUFBLHNCQUFHO0FBQ1gsUUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxFQUFFO0FBQy9CLFVBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUNyQyxNQUFNO0FBQ0wsVUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUNoQztHQUNGOztTQTdDRyxnQkFBZ0I7OztBQWlEdEIsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7O0FBRXZELHlCQUFVLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLGdCQUFnQixDQUFDLENBQUM7cUJBQ25ELGdCQUFnQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvZnVsbHNjcmVlbi10b2dnbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGZ1bGxzY3JlZW4tdG9nZ2xlLmpzXG4gKi9cbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uL3V0aWxzL2ZuLmpzJztcblxuLyoqXG4gKiBUb2dnbGUgZnVsbHNjcmVlbiB2aWRlb1xuICpcbiAqIEBleHRlbmRzIEJ1dHRvblxuICogQGNsYXNzIEZ1bGxzY3JlZW5Ub2dnbGVcbiAqL1xuY2xhc3MgRnVsbHNjcmVlblRvZ2dsZSBleHRlbmRzIEJ1dHRvbiB7XG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICBwbGF5ZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgdGhpcy5wbGF5ZXJfLm9uKCdmdWxsc2NyZWVuY2hhbmdlJywgRm4uYmluZCh0aGlzLCB0aGlzLnVwZGF0ZUhpbnQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGB2anMtZnVsbHNjcmVlbi1jb250cm9sICR7c3VwZXIuYnVpbGRDU1NDbGFzcygpfWA7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBjbGljayBmb3IgZnVsbCBzY3JlZW5cbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7XG4gICAgaWYgKCF0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgIHRoaXMucGxheWVyXy5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBsYXllcl8uZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUhpbnQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgYnV0dG9uIGNvbnRyb2xUZXh0XG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqL1xuICB1cGRhdGVIaW50KCkge1xuICAgIGlmICh0aGlzLnBsYXllcl8uaXNGdWxsc2NyZWVuKCkpIHtcbiAgICAgIHRoaXMuY29udHJvbFRleHQoJ0V4aXQgZnVsbHNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRyb2xUZXh0KCdGdWxsc2NyZWVuJyk7XG4gICAgfVxuICB9XG5cbn1cblxuRnVsbHNjcmVlblRvZ2dsZS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0Z1bGxzY3JlZW4nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0Z1bGxzY3JlZW5Ub2dnbGUnLCBGdWxsc2NyZWVuVG9nZ2xlKTtcbmV4cG9ydCBkZWZhdWx0IEZ1bGxzY3JlZW5Ub2dnbGU7XG4iXX0=
},{"../button.js":63,"../component.js":66,"../utils/fn.js":146}],71:[function(_dereq_,module,exports){
/**
* @file live-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* Displays the live indicator
* TODO - Future make it click to snap to live
*
* @extends Component
* @class LiveDisplay
*/
var LiveDisplay = (function (_Component) {
_inherits(LiveDisplay, _Component);
function LiveDisplay(player, options) {
_classCallCheck(this, LiveDisplay);
_Component.call(this, player, options);
this.updateShowing();
this.on(this.player(), 'durationchange', this.updateShowing);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
LiveDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-live-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-live-display',
innerHTML: '' + this.localize('Stream Type') + '' + this.localize('LIVE')
}, {
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
LiveDisplay.prototype.updateShowing = function updateShowing() {
if (this.player().duration() === Infinity) {
this.show();
} else {
this.hide();
}
};
return LiveDisplay;
})(_component2['default']);
_component2['default'].registerComponent('LiveDisplay', LiveDisplay);
exports['default'] = LiveDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9saXZlLWRpc3BsYXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O3lCQUdzQixjQUFjOzs7OzBCQUNmLGlCQUFpQjs7SUFBMUIsR0FBRzs7Ozs7Ozs7OztJQVNULFdBQVc7WUFBWCxXQUFXOztBQUVKLFdBRlAsV0FBVyxDQUVILE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBRnpCLFdBQVc7O0FBR2IsMEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7QUFDckIsUUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0dBQzlEOzs7Ozs7Ozs7QUFQRyxhQUFXLFdBZWYsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsUUFBSSxFQUFFLEdBQUcscUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzdCLGVBQVMsRUFBRSw4QkFBOEI7S0FDMUMsQ0FBQyxDQUFDOztBQUVILFFBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFDcEMsZUFBUyxFQUFFLGtCQUFrQjtBQUM3QixlQUFTLHNDQUFvQyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxlQUFVLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEFBQUU7S0FDM0csRUFBRTtBQUNELGlCQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEMsV0FBTyxFQUFFLENBQUM7R0FDWDs7QUE3QkcsYUFBVyxXQStCZixhQUFhLEdBQUEseUJBQUc7QUFDZCxRQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxRQUFRLEVBQUU7QUFDekMsVUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2IsTUFBTTtBQUNMLFVBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiO0dBQ0Y7O1NBckNHLFdBQVc7OztBQXlDakIsdUJBQVUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FCQUN6QyxXQUFXIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9saXZlLWRpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGxpdmUtZGlzcGxheS5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcblxuLyoqXG4gKiBEaXNwbGF5cyB0aGUgbGl2ZSBpbmRpY2F0b3JcbiAqIFRPRE8gLSBGdXR1cmUgbWFrZSBpdCBjbGljayB0byBzbmFwIHRvIGxpdmVcbiAqXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBMaXZlRGlzcGxheVxuICovXG5jbGFzcyBMaXZlRGlzcGxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKSB7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMudXBkYXRlU2hvd2luZygpO1xuICAgIHRoaXMub24odGhpcy5wbGF5ZXIoKSwgJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy51cGRhdGVTaG93aW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIHZhciBlbCA9IHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbGl2ZS1jb250cm9sIHZqcy1jb250cm9sJ1xuICAgIH0pO1xuXG4gICAgdGhpcy5jb250ZW50RWxfID0gRG9tLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbGl2ZS1kaXNwbGF5JyxcbiAgICAgIGlubmVySFRNTDogYDxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPiR7dGhpcy5sb2NhbGl6ZSgnU3RyZWFtIFR5cGUnKX08L3NwYW4+JHt0aGlzLmxvY2FsaXplKCdMSVZFJyl9YFxuICAgIH0sIHtcbiAgICAgICdhcmlhLWxpdmUnOiAnb2ZmJ1xuICAgIH0pO1xuXG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICB1cGRhdGVTaG93aW5nKCkge1xuICAgIGlmICh0aGlzLnBsYXllcigpLmR1cmF0aW9uKCkgPT09IEluZmluaXR5KSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdMaXZlRGlzcGxheScsIExpdmVEaXNwbGF5KTtcbmV4cG9ydCBkZWZhdWx0IExpdmVEaXNwbGF5O1xuIl19
},{"../component":66,"../utils/dom.js":144}],72:[function(_dereq_,module,exports){
/**
* @file mute-toggle.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _button = _dereq_('../button');
var _button2 = _interopRequireDefault(_button);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* A button component for muting the audio
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MuteToggle
*/
var MuteToggle = (function (_Button) {
_inherits(MuteToggle, _Button);
function MuteToggle(player, options) {
_classCallCheck(this, MuteToggle);
_Button.call(this, player, options);
this.on(player, 'volumechange', this.update);
// hide mute toggle if the current tech doesn't support volume control
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
}
this.on(player, 'loadstart', function () {
this.update(); // We need to update the button to account for a default muted state.
if (player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
});
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
MuteToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-mute-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handle click on mute
*
* @method handleClick
*/
MuteToggle.prototype.handleClick = function handleClick() {
this.player_.muted(this.player_.muted() ? false : true);
};
/**
* Update volume
*
* @method update
*/
MuteToggle.prototype.update = function update() {
var vol = this.player_.volume(),
level = 3;
if (vol === 0 || this.player_.muted()) {
level = 0;
} else if (vol < 0.33) {
level = 1;
} else if (vol < 0.67) {
level = 2;
}
// Don't rewrite the button text if the actual text doesn't change.
// This causes unnecessary and confusing information for screen reader users.
// This check is needed because this function gets called every time the volume level is changed.
var toMute = this.player_.muted() ? 'Unmute' : 'Mute';
if (this.controlText() !== toMute) {
this.controlText(toMute);
}
/* TODO improve muted icon classes */
for (var i = 0; i < 4; i++) {
Dom.removeElClass(this.el_, 'vjs-vol-' + i);
}
Dom.addElClass(this.el_, 'vjs-vol-' + level);
};
return MuteToggle;
})(_button2['default']);
MuteToggle.prototype.controlText_ = 'Mute';
_component2['default'].registerComponent('MuteToggle', MuteToggle);
exports['default'] = MuteToggle;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9tdXRlLXRvZ2dsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7c0JBR21CLFdBQVc7Ozs7eUJBQ1IsY0FBYzs7OzswQkFDZixpQkFBaUI7O0lBQTFCLEdBQUc7Ozs7Ozs7Ozs7O0lBVVQsVUFBVTtZQUFWLFVBQVU7O0FBRUgsV0FGUCxVQUFVLENBRUYsTUFBTSxFQUFFLE9BQU8sRUFBRTswQkFGekIsVUFBVTs7QUFHWix1QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7OztBQUc3QyxRQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEtBQUssRUFBRTtBQUNuRSxVQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQzdCOztBQUVELFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFXO0FBQ3RDLFVBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7QUFFZCxVQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDbkQsWUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztPQUM3QixNQUFNO0FBQ0wsWUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztPQUNoQztLQUNGLENBQUMsQ0FBQztHQUNKOzs7Ozs7Ozs7QUFyQkcsWUFBVSxXQTZCZCxhQUFhLEdBQUEseUJBQUc7QUFDZCxpQ0FBMkIsa0JBQU0sYUFBYSxLQUFBLE1BQUUsQ0FBRztHQUNwRDs7Ozs7Ozs7QUEvQkcsWUFBVSxXQXNDZCxXQUFXLEdBQUEsdUJBQUc7QUFDWixRQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUUsQ0FBQztHQUMzRDs7Ozs7Ozs7QUF4Q0csWUFBVSxXQStDZCxNQUFNLEdBQUEsa0JBQUc7QUFDUCxRQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUMzQixLQUFLLEdBQUcsQ0FBQyxDQUFDOztBQUVkLFFBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFO0FBQ3JDLFdBQUssR0FBRyxDQUFDLENBQUM7S0FDWCxNQUFNLElBQUksR0FBRyxHQUFHLElBQUksRUFBRTtBQUNyQixXQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1gsTUFBTSxJQUFJLEdBQUcsR0FBRyxJQUFJLEVBQUU7QUFDckIsV0FBSyxHQUFHLENBQUMsQ0FBQztLQUNYOzs7OztBQUtELFFBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztBQUN0RCxRQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxNQUFNLEVBQUU7QUFDakMsVUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQjs7O0FBR0QsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQixTQUFHLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWEsQ0FBQyxDQUFHLENBQUM7S0FDN0M7QUFDRCxPQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWEsS0FBSyxDQUFHLENBQUM7R0FDOUM7O1NBeEVHLFVBQVU7OztBQTRFaEIsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDOztBQUUzQyx1QkFBVSxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQ3ZDLFVBQVUiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL211dGUtdG9nZ2xlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBtdXRlLXRvZ2dsZS5qc1xuICovXG5pbXBvcnQgQnV0dG9uIGZyb20gJy4uL2J1dHRvbic7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcblxuLyoqXG4gKiBBIGJ1dHRvbiBjb21wb25lbnQgZm9yIG11dGluZyB0aGUgYXVkaW9cbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqIEBjbGFzcyBNdXRlVG9nZ2xlXG4gKi9cbmNsYXNzIE11dGVUb2dnbGUgZXh0ZW5kcyBCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLm9uKHBsYXllciwgJ3ZvbHVtZWNoYW5nZScsIHRoaXMudXBkYXRlKTtcblxuICAgIC8vIGhpZGUgbXV0ZSB0b2dnbGUgaWYgdGhlIGN1cnJlbnQgdGVjaCBkb2Vzbid0IHN1cHBvcnQgdm9sdW1lIGNvbnRyb2xcbiAgICBpZiAocGxheWVyLnRlY2hfICYmIHBsYXllci50ZWNoX1snZmVhdHVyZXNWb2x1bWVDb250cm9sJ10gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfVxuXG4gICAgdGhpcy5vbihwbGF5ZXIsICdsb2Fkc3RhcnQnLCBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7IC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBidXR0b24gdG8gYWNjb3VudCBmb3IgYSBkZWZhdWx0IG11dGVkIHN0YXRlLlxuXG4gICAgICBpZiAocGxheWVyLnRlY2hfWydmZWF0dXJlc1ZvbHVtZUNvbnRyb2wnXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lc1xuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb25zdHJ1Y3RlZCBjbGFzcyBuYW1lXG4gICAqIEBtZXRob2QgYnVpbGRDU1NDbGFzc1xuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYHZqcy1tdXRlLWNvbnRyb2wgJHtzdXBlci5idWlsZENTU0NsYXNzKCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gbXV0ZVxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZUNsaWNrXG4gICAqL1xuICBoYW5kbGVDbGljaygpIHtcbiAgICB0aGlzLnBsYXllcl8ubXV0ZWQoIHRoaXMucGxheWVyXy5tdXRlZCgpID8gZmFsc2UgOiB0cnVlICk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHZvbHVtZVxuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIHZhciB2b2wgPSB0aGlzLnBsYXllcl8udm9sdW1lKCksXG4gICAgICAgIGxldmVsID0gMztcblxuICAgIGlmICh2b2wgPT09IDAgfHwgdGhpcy5wbGF5ZXJfLm11dGVkKCkpIHtcbiAgICAgIGxldmVsID0gMDtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuMzMpIHtcbiAgICAgIGxldmVsID0gMTtcbiAgICB9IGVsc2UgaWYgKHZvbCA8IDAuNjcpIHtcbiAgICAgIGxldmVsID0gMjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCByZXdyaXRlIHRoZSBidXR0b24gdGV4dCBpZiB0aGUgYWN0dWFsIHRleHQgZG9lc24ndCBjaGFuZ2UuXG4gICAgLy8gVGhpcyBjYXVzZXMgdW5uZWNlc3NhcnkgYW5kIGNvbmZ1c2luZyBpbmZvcm1hdGlvbiBmb3Igc2NyZWVuIHJlYWRlciB1c2Vycy5cbiAgICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZXZlcnkgdGltZSB0aGUgdm9sdW1lIGxldmVsIGlzIGNoYW5nZWQuXG4gICAgbGV0IHRvTXV0ZSA9IHRoaXMucGxheWVyXy5tdXRlZCgpID8gJ1VubXV0ZScgOiAnTXV0ZSc7XG4gICAgaWYgKHRoaXMuY29udHJvbFRleHQoKSAhPT0gdG9NdXRlKSB7XG4gICAgICB0aGlzLmNvbnRyb2xUZXh0KHRvTXV0ZSk7XG4gICAgfVxuXG4gICAgLyogVE9ETyBpbXByb3ZlIG11dGVkIGljb24gY2xhc3NlcyAqL1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICBEb20ucmVtb3ZlRWxDbGFzcyh0aGlzLmVsXywgYHZqcy12b2wtJHtpfWApO1xuICAgIH1cbiAgICBEb20uYWRkRWxDbGFzcyh0aGlzLmVsXywgYHZqcy12b2wtJHtsZXZlbH1gKTtcbiAgfVxuXG59XG5cbk11dGVUb2dnbGUucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdNdXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNdXRlVG9nZ2xlJywgTXV0ZVRvZ2dsZSk7XG5leHBvcnQgZGVmYXVsdCBNdXRlVG9nZ2xlO1xuIl19
},{"../button":63,"../component":66,"../utils/dom.js":144}],73:[function(_dereq_,module,exports){
/**
* @file play-toggle.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _buttonJs = _dereq_('../button.js');
var _buttonJs2 = _interopRequireDefault(_buttonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Button to toggle between play and pause
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class PlayToggle
*/
var PlayToggle = (function (_Button) {
_inherits(PlayToggle, _Button);
function PlayToggle(player, options) {
_classCallCheck(this, PlayToggle);
_Button.call(this, player, options);
this.on(player, 'play', this.handlePlay);
this.on(player, 'pause', this.handlePause);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
PlayToggle.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-play-control ' + _Button.prototype.buildCSSClass.call(this);
};
/**
* Handle click to toggle between play and pause
*
* @method handleClick
*/
PlayToggle.prototype.handleClick = function handleClick() {
if (this.player_.paused()) {
this.player_.play();
} else {
this.player_.pause();
}
};
/**
* Add the vjs-playing class to the element so it can change appearance
*
* @method handlePlay
*/
PlayToggle.prototype.handlePlay = function handlePlay() {
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
this.controlText('Pause'); // change the button text to "Pause"
};
/**
* Add the vjs-paused class to the element so it can change appearance
*
* @method handlePause
*/
PlayToggle.prototype.handlePause = function handlePause() {
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.controlText('Play'); // change the button text to "Play"
};
return PlayToggle;
})(_buttonJs2['default']);
PlayToggle.prototype.controlText_ = 'Play';
_componentJs2['default'].registerComponent('PlayToggle', PlayToggle);
exports['default'] = PlayToggle;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wbGF5LXRvZ2dsZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O3dCQUdtQixjQUFjOzs7OzJCQUNYLGlCQUFpQjs7Ozs7Ozs7Ozs7OztJQVVqQyxVQUFVO1lBQVYsVUFBVTs7QUFFSCxXQUZQLFVBQVUsQ0FFRixNQUFNLEVBQUUsT0FBTyxFQUFDOzBCQUZ4QixVQUFVOztBQUdaLHVCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6QyxRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0dBQzVDOzs7Ozs7Ozs7QUFQRyxZQUFVLFdBZWQsYUFBYSxHQUFBLHlCQUFHO0FBQ2QsaUNBQTJCLGtCQUFNLGFBQWEsS0FBQSxNQUFFLENBQUc7R0FDcEQ7Ozs7Ozs7O0FBakJHLFlBQVUsV0F3QmQsV0FBVyxHQUFBLHVCQUFHO0FBQ1osUUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFO0FBQ3pCLFVBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDckIsTUFBTTtBQUNMLFVBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDdEI7R0FDRjs7Ozs7Ozs7QUE5QkcsWUFBVSxXQXFDZCxVQUFVLEdBQUEsc0JBQUc7QUFDWCxRQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQy9CLFFBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDN0IsUUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUMzQjs7Ozs7Ozs7QUF6Q0csWUFBVSxXQWdEZCxXQUFXLEdBQUEsdUJBQUc7QUFDWixRQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2hDLFFBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDNUIsUUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUMxQjs7U0FwREcsVUFBVTs7O0FBdURoQixVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUM7O0FBRTNDLHlCQUFVLGlCQUFpQixDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztxQkFDdkMsVUFBVSIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvcGxheS10b2dnbGUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHBsYXktdG9nZ2xlLmpzXG4gKi9cbmltcG9ydCBCdXR0b24gZnJvbSAnLi4vYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50LmpzJztcblxuLyoqXG4gKiBCdXR0b24gdG8gdG9nZ2xlIGJldHdlZW4gcGxheSBhbmQgcGF1c2VcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBCdXR0b25cbiAqIEBjbGFzcyBQbGF5VG9nZ2xlXG4gKi9cbmNsYXNzIFBsYXlUb2dnbGUgZXh0ZW5kcyBCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMub24ocGxheWVyLCAncGxheScsIHRoaXMuaGFuZGxlUGxheSk7XG4gICAgdGhpcy5vbihwbGF5ZXIsICdwYXVzZScsIHRoaXMuaGFuZGxlUGF1c2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lc1xuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb25zdHJ1Y3RlZCBjbGFzcyBuYW1lXG4gICAqIEBtZXRob2QgYnVpbGRDU1NDbGFzc1xuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYHZqcy1wbGF5LWNvbnRyb2wgJHtzdXBlci5idWlsZENTU0NsYXNzKCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgdG8gdG9nZ2xlIGJldHdlZW4gcGxheSBhbmQgcGF1c2VcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgdmpzLXBsYXlpbmcgY2xhc3MgdG8gdGhlIGVsZW1lbnQgc28gaXQgY2FuIGNoYW5nZSBhcHBlYXJhbmNlXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlUGxheVxuICAgKi9cbiAgaGFuZGxlUGxheSgpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBsYXlpbmcnKTtcbiAgICB0aGlzLmNvbnRyb2xUZXh0KCdQYXVzZScpOyAvLyBjaGFuZ2UgdGhlIGJ1dHRvbiB0ZXh0IHRvIFwiUGF1c2VcIlxuICB9XG5cbiAgLyoqXG4gICAqIEFkZCB0aGUgdmpzLXBhdXNlZCBjbGFzcyB0byB0aGUgZWxlbWVudCBzbyBpdCBjYW4gY2hhbmdlIGFwcGVhcmFuY2VcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVQYXVzZVxuICAgKi9cbiAgaGFuZGxlUGF1c2UoKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXBsYXlpbmcnKTtcbiAgICB0aGlzLmFkZENsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgdGhpcy5jb250cm9sVGV4dCgnUGxheScpOyAvLyBjaGFuZ2UgdGhlIGJ1dHRvbiB0ZXh0IHRvIFwiUGxheVwiXG4gIH1cbn1cblxuUGxheVRvZ2dsZS5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1BsYXknO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXlUb2dnbGUnLCBQbGF5VG9nZ2xlKTtcbmV4cG9ydCBkZWZhdWx0IFBsYXlUb2dnbGU7XG4iXX0=
},{"../button.js":63,"../component.js":66}],74:[function(_dereq_,module,exports){
/**
* @file playback-rate-menu-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuButtonJs = _dereq_('../../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _menuMenuJs = _dereq_('../../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _playbackRateMenuItemJs = _dereq_('./playback-rate-menu-item.js');
var _playbackRateMenuItemJs2 = _interopRequireDefault(_playbackRateMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* The component for controlling the playback rate
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class PlaybackRateMenuButton
*/
var PlaybackRateMenuButton = (function (_MenuButton) {
_inherits(PlaybackRateMenuButton, _MenuButton);
function PlaybackRateMenuButton(player, options) {
_classCallCheck(this, PlaybackRateMenuButton);
_MenuButton.call(this, player, options);
this.updateVisibility();
this.updateLabel();
this.on(player, 'loadstart', this.updateVisibility);
this.on(player, 'ratechange', this.updateLabel);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
PlaybackRateMenuButton.prototype.createEl = function createEl() {
var el = _MenuButton.prototype.createEl.call(this);
this.labelEl_ = Dom.createEl('div', {
className: 'vjs-playback-rate-value',
innerHTML: 1.0
});
el.appendChild(this.labelEl_);
return el;
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
PlaybackRateMenuButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-playback-rate ' + _MenuButton.prototype.buildCSSClass.call(this);
};
/**
* Create the playback rate menu
*
* @return {Menu} Menu object populated with items
* @method createMenu
*/
PlaybackRateMenuButton.prototype.createMenu = function createMenu() {
var menu = new _menuMenuJs2['default'](this.player());
var rates = this.playbackRates();
if (rates) {
for (var i = rates.length - 1; i >= 0; i--) {
menu.addChild(new _playbackRateMenuItemJs2['default'](this.player(), { 'rate': rates[i] + 'x' }));
}
}
return menu;
};
/**
* Updates ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
PlaybackRateMenuButton.prototype.updateARIAAttributes = function updateARIAAttributes() {
// Current playback rate
this.el().setAttribute('aria-valuenow', this.player().playbackRate());
};
/**
* Handle menu item click
*
* @method handleClick
*/
PlaybackRateMenuButton.prototype.handleClick = function handleClick() {
// select next rate option
var currentRate = this.player().playbackRate();
var rates = this.playbackRates();
// this will select first one if the last one currently selected
var newRate = rates[0];
for (var i = 0; i < rates.length; i++) {
if (rates[i] > currentRate) {
newRate = rates[i];
break;
}
}
this.player().playbackRate(newRate);
};
/**
* Get possible playback rates
*
* @return {Array} Possible playback rates
* @method playbackRates
*/
PlaybackRateMenuButton.prototype.playbackRates = function playbackRates() {
return this.options_['playbackRates'] || this.options_.playerOptions && this.options_.playerOptions['playbackRates'];
};
/**
* Get whether playback rates is supported by the tech
* and an array of playback rates exists
*
* @return {Boolean} Whether changing playback rate is supported
* @method playbackRateSupported
*/
PlaybackRateMenuButton.prototype.playbackRateSupported = function playbackRateSupported() {
return this.player().tech_ && this.player().tech_['featuresPlaybackRate'] && this.playbackRates() && this.playbackRates().length > 0;
};
/**
* Hide playback rate controls when they're no playback rate options to select
*
* @method updateVisibility
*/
PlaybackRateMenuButton.prototype.updateVisibility = function updateVisibility() {
if (this.playbackRateSupported()) {
this.removeClass('vjs-hidden');
} else {
this.addClass('vjs-hidden');
}
};
/**
* Update button label when rate changed
*
* @method updateLabel
*/
PlaybackRateMenuButton.prototype.updateLabel = function updateLabel() {
if (this.playbackRateSupported()) {
this.labelEl_.innerHTML = this.player().playbackRate() + 'x';
}
};
return PlaybackRateMenuButton;
})(_menuMenuButtonJs2['default']);
PlaybackRateMenuButton.prototype.controlText_ = 'Playback Rate';
_componentJs2['default'].registerComponent('PlaybackRateMenuButton', PlaybackRateMenuButton);
exports['default'] = PlaybackRateMenuButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wbGF5YmFjay1yYXRlLW1lbnUvcGxheWJhY2stcmF0ZS1tZW51LWJ1dHRvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Z0NBR3VCLDJCQUEyQjs7OzswQkFDakMsb0JBQW9COzs7O3NDQUNKLDhCQUE4Qjs7OzsyQkFDekMsb0JBQW9COzs7OzBCQUNyQixvQkFBb0I7O0lBQTdCLEdBQUc7Ozs7Ozs7Ozs7O0lBVVQsc0JBQXNCO1lBQXRCLHNCQUFzQjs7QUFFZixXQUZQLHNCQUFzQixDQUVkLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLHNCQUFzQjs7QUFHeEIsMkJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztBQUN4QixRQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7O0FBRW5CLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUNwRCxRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0dBQ2pEOzs7Ozs7Ozs7QUFWRyx3QkFBc0IsV0FrQjFCLFFBQVEsR0FBQSxvQkFBRztBQUNULFFBQUksRUFBRSxHQUFHLHNCQUFNLFFBQVEsS0FBQSxNQUFFLENBQUM7O0FBRTFCLFFBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFDbEMsZUFBUyxFQUFFLHlCQUF5QjtBQUNwQyxlQUFTLEVBQUUsR0FBRztLQUNmLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFOUIsV0FBTyxFQUFFLENBQUM7R0FDWDs7Ozs7Ozs7O0FBN0JHLHdCQUFzQixXQXFDMUIsYUFBYSxHQUFBLHlCQUFHO0FB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RyxDQUFDO0tBQzlEO0dBQ0Y7O1NBNUlHLHNCQUFzQjs7O0FBZ0o1QixzQkFBc0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQzs7QUFFaEUseUJBQVUsaUJBQWlCLENBQUMsd0JBQXdCLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztxQkFDL0Qsc0JBQXNCIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9wbGF5YmFjay1yYXRlLW1lbnUvcGxheWJhY2stcmF0ZS1tZW51LWJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgcGxheWJhY2stcmF0ZS1tZW51LWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgTWVudUJ1dHRvbiBmcm9tICcuLi8uLi9tZW51L21lbnUtYnV0dG9uLmpzJztcbmltcG9ydCBNZW51IGZyb20gJy4uLy4uL21lbnUvbWVudS5qcyc7XG5pbXBvcnQgUGxheWJhY2tSYXRlTWVudUl0ZW0gZnJvbSAnLi9wbGF5YmFjay1yYXRlLW1lbnUtaXRlbS5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vLi4vdXRpbHMvZG9tLmpzJztcblxuLyoqXG4gKiBUaGUgY29tcG9uZW50IGZvciBjb250cm9sbGluZyB0aGUgcGxheWJhY2sgcmF0ZVxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIE1lbnVCdXR0b25cbiAqIEBjbGFzcyBQbGF5YmFja1JhdGVNZW51QnV0dG9uXG4gKi9cbmNsYXNzIFBsYXliYWNrUmF0ZU1lbnVCdXR0b24gZXh0ZW5kcyBNZW51QnV0dG9uIHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnVwZGF0ZVZpc2liaWxpdHkoKTtcbiAgICB0aGlzLnVwZGF0ZUxhYmVsKCk7XG5cbiAgICB0aGlzLm9uKHBsYXllciwgJ2xvYWRzdGFydCcsIHRoaXMudXBkYXRlVmlzaWJpbGl0eSk7XG4gICAgdGhpcy5vbihwbGF5ZXIsICdyYXRlY2hhbmdlJywgdGhpcy51cGRhdGVMYWJlbCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICBsZXQgZWwgPSBzdXBlci5jcmVhdGVFbCgpO1xuXG4gICAgdGhpcy5sYWJlbEVsXyA9IERvbS5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXBsYXliYWNrLXJhdGUtdmFsdWUnLFxuICAgICAgaW5uZXJIVE1MOiAxLjBcbiAgICB9KTtcblxuICAgIGVsLmFwcGVuZENoaWxkKHRoaXMubGFiZWxFbF8pO1xuXG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lc1xuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb25zdHJ1Y3RlZCBjbGFzcyBuYW1lXG4gICAqIEBtZXRob2QgYnVpbGRDU1NDbGFzc1xuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYHZqcy1wbGF5YmFjay1yYXRlICR7c3VwZXIuYnVpbGRDU1NDbGFzcygpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBwbGF5YmFjayByYXRlIG1lbnVcbiAgICpcbiAgICogQHJldHVybiB7TWVudX0gTWVudSBvYmplY3QgcG9wdWxhdGVkIHdpdGggaXRlbXNcbiAgICogQG1ldGhvZCBjcmVhdGVNZW51XG4gICAqL1xuICBjcmVhdGVNZW51KCkge1xuICAgIGxldCBtZW51ID0gbmV3IE1lbnUodGhpcy5wbGF5ZXIoKSk7XG4gICAgbGV0IHJhdGVzID0gdGhpcy5wbGF5YmFja1JhdGVzKCk7XG5cbiAgICBpZiAocmF0ZXMpIHtcbiAgICAgIGZvciAobGV0IGkgPSByYXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBtZW51LmFkZENoaWxkKFxuICAgICAgICAgIG5ldyBQbGF5YmFja1JhdGVNZW51SXRlbSh0aGlzLnBsYXllcigpLCB7ICdyYXRlJzogcmF0ZXNbaV0gKyAneCd9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtZW51O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgQVJJQSBhY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXNcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVBUklBQXR0cmlidXRlc1xuICAgKi9cbiAgdXBkYXRlQVJJQUF0dHJpYnV0ZXMoKSB7XG4gICAgLy8gQ3VycmVudCBwbGF5YmFjayByYXRlXG4gICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW5vdycsIHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtZW51IGl0ZW0gY2xpY2tcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7XG4gICAgLy8gc2VsZWN0IG5leHQgcmF0ZSBvcHRpb25cbiAgICBsZXQgY3VycmVudFJhdGUgPSB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpO1xuICAgIGxldCByYXRlcyA9IHRoaXMucGxheWJhY2tSYXRlcygpO1xuXG4gICAgLy8gdGhpcyB3aWxsIHNlbGVjdCBmaXJzdCBvbmUgaWYgdGhlIGxhc3Qgb25lIGN1cnJlbnRseSBzZWxlY3RlZFxuICAgIGxldCBuZXdSYXRlID0gcmF0ZXNbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXRlcy5sZW5ndGggOyBpKyspIHtcbiAgICAgIGlmIChyYXRlc1tpXSA+IGN1cnJlbnRSYXRlKSB7XG4gICAgICAgIG5ld1JhdGUgPSByYXRlc1tpXTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKG5ld1JhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwb3NzaWJsZSBwbGF5YmFjayByYXRlc1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX0gUG9zc2libGUgcGxheWJhY2sgcmF0ZXNcbiAgICogQG1ldGhvZCBwbGF5YmFja1JhdGVzXG4gICAqL1xuICBwbGF5YmFja1JhdGVzKCkge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNfWydwbGF5YmFja1JhdGVzJ10gfHwgKHRoaXMub3B0aW9uc18ucGxheWVyT3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNfLnBsYXllck9wdGlvbnNbJ3BsYXliYWNrUmF0ZXMnXSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgcGxheWJhY2sgcmF0ZXMgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0ZWNoXG4gICAqIGFuZCBhbiBhcnJheSBvZiBwbGF5YmFjayByYXRlcyBleGlzdHNcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gV2hldGhlciBjaGFuZ2luZyBwbGF5YmFjayByYXRlIGlzIHN1cHBvcnRlZFxuICAgKiBAbWV0aG9kIHBsYXliYWNrUmF0ZVN1cHBvcnRlZFxuICAgKi9cbiAgcGxheWJhY2tSYXRlU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXllcigpLnRlY2hfXG4gICAgICAmJiB0aGlzLnBsYXllcigpLnRlY2hfWydmZWF0dXJlc1BsYXliYWNrUmF0ZSddXG4gICAgICAmJiB0aGlzLnBsYXliYWNrUmF0ZXMoKVxuICAgICAgJiYgdGhpcy5wbGF5YmFja1JhdGVzKCkubGVuZ3RoID4gMFxuICAgIDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHBsYXliYWNrIHJhdGUgY29udHJvbHMgd2hlbiB0aGV5J3JlIG5vIHBsYXliYWNrIHJhdGUgb3B0aW9ucyB0byBzZWxlY3RcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVWaXNpYmlsaXR5XG4gICAqL1xuICB1cGRhdGVWaXNpYmlsaXR5KCkge1xuICAgIGlmICh0aGlzLnBsYXliYWNrUmF0ZVN1cHBvcnRlZCgpKSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1oaWRkZW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGJ1dHRvbiBsYWJlbCB3aGVuIHJhdGUgY2hhbmdlZFxuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZUxhYmVsXG4gICAqL1xuICB1cGRhdGVMYWJlbCgpIHtcbiAgICBpZiAodGhpcy5wbGF5YmFja1JhdGVTdXBwb3J0ZWQoKSkge1xuICAgICAgdGhpcy5sYWJlbEVsXy5pbm5lckhUTUwgPSB0aGlzLnBsYXllcigpLnBsYXliYWNrUmF0ZSgpICsgJ3gnO1xuICAgIH1cbiAgfVxuXG59XG5cblBsYXliYWNrUmF0ZU1lbnVCdXR0b24ucHJvdG90eXBlLmNvbnRyb2xUZXh0XyA9ICdQbGF5YmFjayBSYXRlJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5YmFja1JhdGVNZW51QnV0dG9uJywgUGxheWJhY2tSYXRlTWVudUJ1dHRvbik7XG5leHBvcnQgZGVmYXVsdCBQbGF5YmFja1JhdGVNZW51QnV0dG9uO1xuIl19
},{"../../component.js":66,"../../menu/menu-button.js":109,"../../menu/menu.js":111,"../../utils/dom.js":144,"./playback-rate-menu-item.js":75}],75:[function(_dereq_,module,exports){
/**
* @file playback-rate-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The specific menu item type for selecting a playback rate
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class PlaybackRateMenuItem
*/
var PlaybackRateMenuItem = (function (_MenuItem) {
_inherits(PlaybackRateMenuItem, _MenuItem);
function PlaybackRateMenuItem(player, options) {
_classCallCheck(this, PlaybackRateMenuItem);
var label = options['rate'];
var rate = parseFloat(label, 10);
// Modify options for parent MenuItem class's init.
options['label'] = label;
options['selected'] = rate === 1;
_MenuItem.call(this, player, options);
this.label = label;
this.rate = rate;
this.on(player, 'ratechange', this.update);
}
/**
* Handle click on menu item
*
* @method handleClick
*/
PlaybackRateMenuItem.prototype.handleClick = function handleClick() {
_MenuItem.prototype.handleClick.call(this);
this.player().playbackRate(this.rate);
};
/**
* Update playback rate with selected rate
*
* @method update
*/
PlaybackRateMenuItem.prototype.update = function update() {
this.selected(this.player().playbackRate() === this.rate);
};
return PlaybackRateMenuItem;
})(_menuMenuItemJs2['default']);
PlaybackRateMenuItem.prototype.contentElType = 'button';
_componentJs2['default'].registerComponent('PlaybackRateMenuItem', PlaybackRateMenuItem);
exports['default'] = PlaybackRateMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wbGF5YmFjay1yYXRlLW1lbnUvcGxheWJhY2stcmF0ZS1tZW51LWl0ZW0uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs4QkFHcUIseUJBQXlCOzs7OzJCQUN4QixvQkFBb0I7Ozs7Ozs7Ozs7Ozs7SUFVcEMsb0JBQW9CO1lBQXBCLG9CQUFvQjs7QUFFYixXQUZQLG9CQUFvQixDQUVaLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLG9CQUFvQjs7QUFHdEIsUUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVCLFFBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7OztBQUdqQyxXQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLFdBQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLHlCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7QUFDbkIsUUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7O0FBRWpCLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDNUM7Ozs7Ozs7O0FBZkcsc0JBQW9CLFdBc0J4QixXQUFXLEdBQUEsdUJBQUc7QUFDWix3QkFBTSxXQUFXLEtBQUEsTUFBRSxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQ3ZDOzs7Ozs7OztBQXpCRyxzQkFBb0IsV0FnQ3hCLE1BQU0sR0FBQSxrQkFBRztBQUNQLFFBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztHQUMzRDs7U0FsQ0csb0JBQW9COzs7QUFzQzFCLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDOztBQUV4RCx5QkFBVSxpQkFBaUIsQ0FBQyxzQkFBc0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO3FCQUMzRCxvQkFBb0IiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3BsYXliYWNrLXJhdGUtbWVudS9wbGF5YmFjay1yYXRlLW1lbnUtaXRlbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgcGxheWJhY2stcmF0ZS1tZW51LWl0ZW0uanNcbiAqL1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJy4uLy4uL21lbnUvbWVudS1pdGVtLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcblxuLyoqXG4gKiBUaGUgc3BlY2lmaWMgbWVudSBpdGVtIHR5cGUgZm9yIHNlbGVjdGluZyBhIHBsYXliYWNrIHJhdGVcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBNZW51SXRlbVxuICogQGNsYXNzIFBsYXliYWNrUmF0ZU1lbnVJdGVtXG4gKi9cbmNsYXNzIFBsYXliYWNrUmF0ZU1lbnVJdGVtIGV4dGVuZHMgTWVudUl0ZW0ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgbGV0IGxhYmVsID0gb3B0aW9uc1sncmF0ZSddO1xuICAgIGxldCByYXRlID0gcGFyc2VGbG9hdChsYWJlbCwgMTApO1xuXG4gICAgLy8gTW9kaWZ5IG9wdGlvbnMgZm9yIHBhcmVudCBNZW51SXRlbSBjbGFzcydzIGluaXQuXG4gICAgb3B0aW9uc1snbGFiZWwnXSA9IGxhYmVsO1xuICAgIG9wdGlvbnNbJ3NlbGVjdGVkJ10gPSByYXRlID09PSAxO1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmxhYmVsID0gbGFiZWw7XG4gICAgdGhpcy5yYXRlID0gcmF0ZTtcblxuICAgIHRoaXMub24ocGxheWVyLCAncmF0ZWNoYW5nZScsIHRoaXMudXBkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgY2xpY2sgb24gbWVudSBpdGVtXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlQ2xpY2tcbiAgICovXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIHN1cGVyLmhhbmRsZUNsaWNrKCk7XG4gICAgdGhpcy5wbGF5ZXIoKS5wbGF5YmFja1JhdGUodGhpcy5yYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcGxheWJhY2sgcmF0ZSB3aXRoIHNlbGVjdGVkIHJhdGVcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLnNlbGVjdGVkKHRoaXMucGxheWVyKCkucGxheWJhY2tSYXRlKCkgPT09IHRoaXMucmF0ZSk7XG4gIH1cblxufVxuXG5QbGF5YmFja1JhdGVNZW51SXRlbS5wcm90b3R5cGUuY29udGVudEVsVHlwZSA9ICdidXR0b24nO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BsYXliYWNrUmF0ZU1lbnVJdGVtJywgUGxheWJhY2tSYXRlTWVudUl0ZW0pO1xuZXhwb3J0IGRlZmF1bHQgUGxheWJhY2tSYXRlTWVudUl0ZW07XG4iXX0=
},{"../../component.js":66,"../../menu/menu-item.js":110}],76:[function(_dereq_,module,exports){
/**
* @file load-progress-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
/**
* Shows load progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class LoadProgressBar
*/
var LoadProgressBar = (function (_Component) {
_inherits(LoadProgressBar, _Component);
function LoadProgressBar(player, options) {
_classCallCheck(this, LoadProgressBar);
_Component.call(this, player, options);
this.on(player, 'progress', this.update);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
LoadProgressBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-load-progress',
innerHTML: '' + this.localize('Loaded') + ': 0%'
});
};
/**
* Update progress bar
*
* @method update
*/
LoadProgressBar.prototype.update = function update() {
var buffered = this.player_.buffered();
var duration = this.player_.duration();
var bufferedEnd = this.player_.bufferedEnd();
var children = this.el_.children;
// get the percent width of a time compared to the total end
var percentify = function percentify(time, end) {
var percent = time / end || 0; // no NaN
return (percent >= 1 ? 1 : percent) * 100 + '%';
};
// update the width of the progress bar
this.el_.style.width = percentify(bufferedEnd, duration);
// add child elements to represent the individual buffered time ranges
for (var i = 0; i < buffered.length; i++) {
var start = buffered.start(i);
var end = buffered.end(i);
var part = children[i];
if (!part) {
part = this.el_.appendChild(Dom.createEl());
}
// set the percent based on the width of the progress bar (bufferedEnd)
part.style.left = percentify(start, bufferedEnd);
part.style.width = percentify(end - start, bufferedEnd);
}
// remove unused buffered range elements
for (var i = children.length; i > buffered.length; i--) {
this.el_.removeChild(children[i - 1]);
}
};
return LoadProgressBar;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('LoadProgressBar', LoadProgressBar);
exports['default'] = LoadProgressBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL2xvYWQtcHJvZ3Jlc3MtYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7OzBCQUNyQixvQkFBb0I7O0lBQTdCLEdBQUc7Ozs7Ozs7Ozs7O0lBVVQsZUFBZTtZQUFmLGVBQWU7O0FBRVIsV0FGUCxlQUFlLENBRVAsTUFBTSxFQUFFLE9BQU8sRUFBQzswQkFGeEIsZUFBZTs7QUFHakIsMEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7R0FDMUM7Ozs7Ozs7OztBQUxHLGlCQUFlLFdBYW5CLFFBQVEsR0FBQSxvQkFBRztBQUNULFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzNCLGVBQVMsRUFBRSxtQkFBbUI7QUFDOUIsZUFBUyw0Q0FBMEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsdUJBQW9CO0tBQy9GLENBQUMsQ0FBQztHQUNKOzs7Ozs7OztBQWxCRyxpQkFBZSxXQXlCbkIsTUFBTSxHQUFBLGtCQUFHO0FBQ1AsUUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN2QyxRQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3ZDLFFBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDN0MsUUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7OztBQUdqQyxRQUFJLFVBQVUsR0FBRyxTQUFiLFVBQVUsQ0FBYSxJQUFJLEVBQUUsR0FBRyxFQUFDO0FBQ25DLFVBQUksT0FBTyxHQUFHLEFBQUMsSUFBSSxHQUFHLEdBQUcsSUFBSyxDQUFDLENBQUM7QUFDaEMsYUFBTyxBQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFBLEdBQUksR0FBRyxHQUFJLEdBQUcsQ0FBQztLQUNuRCxDQUFDOzs7QUFHRixRQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQzs7O0FBR3pELFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3hDLFVBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsVUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMxQixVQUFJLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRXZCLFVBQUksQ0FBQyxJQUFJLEVBQUU7QUFDVCxZQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7T0FDN0M7OztBQUdELFVBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDakQsVUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDekQ7OztBQUdELFNBQUssSUFBSSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0RCxVQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDckM7R0FDRjs7U0EzREcsZUFBZTs7O0FBK0RyQix5QkFBVSxpQkFBaUIsQ0FBQyxpQkFBaUIsRUFBRSxlQUFlLENBQUMsQ0FBQztxQkFDakQsZUFBZSIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvcHJvZ3Jlc3MtY29udHJvbC9sb2FkLXByb2dyZXNzLWJhci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgbG9hZC1wcm9ncmVzcy1iYXIuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5cbi8qKlxuICogU2hvd3MgbG9hZCBwcm9ncmVzc1xuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIExvYWRQcm9ncmVzc0JhclxuICovXG5jbGFzcyBMb2FkUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgICB0aGlzLm9uKHBsYXllciwgJ3Byb2dyZXNzJywgdGhpcy51cGRhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtbG9hZC1wcm9ncmVzcycsXG4gICAgICBpbm5lckhUTUw6IGA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj48c3Bhbj4ke3RoaXMubG9jYWxpemUoJ0xvYWRlZCcpfTwvc3Bhbj46IDAlPC9zcGFuPmBcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgcHJvZ3Jlc3MgYmFyXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgbGV0IGJ1ZmZlcmVkID0gdGhpcy5wbGF5ZXJfLmJ1ZmZlcmVkKCk7XG4gICAgbGV0IGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgbGV0IGJ1ZmZlcmVkRW5kID0gdGhpcy5wbGF5ZXJfLmJ1ZmZlcmVkRW5kKCk7XG4gICAgbGV0IGNoaWxkcmVuID0gdGhpcy5lbF8uY2hpbGRyZW47XG5cbiAgICAvLyBnZXQgdGhlIHBlcmNlbnQgd2lkdGggb2YgYSB0aW1lIGNvbXBhcmVkIHRvIHRoZSB0b3RhbCBlbmRcbiAgICBsZXQgcGVyY2VudGlmeSA9IGZ1bmN0aW9uICh0aW1lLCBlbmQpe1xuICAgICAgbGV0IHBlcmNlbnQgPSAodGltZSAvIGVuZCkgfHwgMDsgLy8gbm8gTmFOXG4gICAgICByZXR1cm4gKChwZXJjZW50ID49IDEgPyAxIDogcGVyY2VudCkgKiAxMDApICsgJyUnO1xuICAgIH07XG5cbiAgICAvLyB1cGRhdGUgdGhlIHdpZHRoIG9mIHRoZSBwcm9ncmVzcyBiYXJcbiAgICB0aGlzLmVsXy5zdHlsZS53aWR0aCA9IHBlcmNlbnRpZnkoYnVmZmVyZWRFbmQsIGR1cmF0aW9uKTtcblxuICAgIC8vIGFkZCBjaGlsZCBlbGVtZW50cyB0byByZXByZXNlbnQgdGhlIGluZGl2aWR1YWwgYnVmZmVyZWQgdGltZSByYW5nZXNcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlcmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgc3RhcnQgPSBidWZmZXJlZC5zdGFydChpKTtcbiAgICAgIGxldCBlbmQgPSBidWZmZXJlZC5lbmQoaSk7XG4gICAgICBsZXQgcGFydCA9IGNoaWxkcmVuW2ldO1xuXG4gICAgICBpZiAoIXBhcnQpIHtcbiAgICAgICAgcGFydCA9IHRoaXMuZWxfLmFwcGVuZENoaWxkKERvbS5jcmVhdGVFbCgpKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHRoZSBwZXJjZW50IGJhc2VkIG9uIHRoZSB3aWR0aCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIChidWZmZXJlZEVuZClcbiAgICAgIHBhcnQuc3R5bGUubGVmdCA9IHBlcmNlbnRpZnkoc3RhcnQsIGJ1ZmZlcmVkRW5kKTtcbiAgICAgIHBhcnQuc3R5bGUud2lkdGggPSBwZXJjZW50aWZ5KGVuZCAtIHN0YXJ0LCBidWZmZXJlZEVuZCk7XG4gICAgfVxuXG4gICAgLy8gcmVtb3ZlIHVudXNlZCBidWZmZXJlZCByYW5nZSBlbGVtZW50c1xuICAgIGZvciAobGV0IGkgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPiBidWZmZXJlZC5sZW5ndGg7IGktLSkge1xuICAgICAgdGhpcy5lbF8ucmVtb3ZlQ2hpbGQoY2hpbGRyZW5baS0xXSk7XG4gICAgfVxuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdMb2FkUHJvZ3Jlc3NCYXInLCBMb2FkUHJvZ3Jlc3NCYXIpO1xuZXhwb3J0IGRlZmF1bHQgTG9hZFByb2dyZXNzQmFyO1xuIl19
},{"../../component.js":66,"../../utils/dom.js":144}],77:[function(_dereq_,module,exports){
/**
* @file mouse-time-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
/**
* The Mouse Time Display component shows the time you will seek to
* when hovering over the progress bar
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class MouseTimeDisplay
*/
var MouseTimeDisplay = (function (_Component) {
_inherits(MouseTimeDisplay, _Component);
function MouseTimeDisplay(player, options) {
var _this = this;
_classCallCheck(this, MouseTimeDisplay);
_Component.call(this, player, options);
if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) {
this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside;
}
if (this.keepTooltipsInside) {
this.tooltip = Dom.createEl('div', { className: 'vjs-time-tooltip' });
this.el().appendChild(this.tooltip);
this.addClass('vjs-keep-tooltips-inside');
}
this.update(0, 0, 0);
player.on('ready', function () {
var progressEl = _this.player_.controlBar.progressControl.el();
progressEl.appendChild(_this.tooltip);
_this.on(progressEl, 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25));
});
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
MouseTimeDisplay.prototype.createEl = function createEl() {
this.tooltip = Dom.createEl('div', {
className: 'vjs-mouse-display-tooltip'
});
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-mouse-display'
});
return el;
};
MouseTimeDisplay.prototype.dispose = function dispose() {
if (this.tooltip.parentNode) {
this.tooltip.parentNode.removeChild(this.tooltip);
}
Dom.removeElData(this.tooltip);
this.tooltip = null;
_Component.prototype.dispose.call(this);
};
MouseTimeDisplay.prototype.handleMouseMove = function handleMouseMove(event) {
var isPercent = false;
var duration = this.player_.duration();
if (!duration) {
isPercent = true;
duration = 100;
}
var newTime = this.calculateDistance(event) * duration;
var maxLeft = this.player().controlBar.progressControl.seekBar.width() - this.width();
var position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
position = Math.min(Math.max(0, position), maxLeft);
var tooltipWidth = this.tooltip.offsetWidth;
var maxTooltipLeft = this.tooltip.parentNode.offsetWidth - tooltipWidth;
var tooltipPosition = event.pageX - Dom.findElPosition(this.tooltip.parentNode).left - tooltipWidth / 2;
tooltipPosition = Math.min(Math.max(0, tooltipPosition), maxTooltipLeft);
this.update(newTime, position, tooltipPosition, isPercent);
};
MouseTimeDisplay.prototype.update = function update(newTime, position, tooltipPosition, isPercent) {
var time = isPercent ? Math.round(newTime) + '%' : _utilsFormatTimeJs2['default'](newTime, this.player_.duration());
this.el().style.left = position + 'px';
this.tooltip.innerHTML = time;
if (this.keepTooltipsInside) {
var clampedPosition = this.clampPosition_(position);
var difference = position - clampedPosition + 1;
var tooltipWidth = parseFloat(_globalWindow2['default'].getComputedStyle(this.tooltip).width);
var tooltipWidthHalf = tooltipWidth / 2;
this.tooltip.style.left = 'auto';
this.tooltip.style.right = '-' + (tooltipWidthHalf - difference) + 'px';
} else {
this.tooltip.style.right = 'auto';
this.tooltip.style.left = tooltipPosition + 'px';
}
};
MouseTimeDisplay.prototype.calculateDistance = function calculateDistance(event) {
return Dom.getPointerPosition(this.el().parentNode, event).x;
};
/**
* This takes in a horizontal position for the bar and returns a clamped position.
* Clamped position means that it will keep the position greater than half the width
* of the tooltip and smaller than the player width minus half the width o the tooltip.
* It will only clamp the position if `keepTooltipsInside` option is set.
*
* @param {Number} position the position the bar wants to be
* @return {Number} newPosition the (potentially) clamped position
* @method clampPosition_
*/
MouseTimeDisplay.prototype.clampPosition_ = function clampPosition_(position) {
if (!this.keepTooltipsInside) {
return position;
}
var playerWidth = parseFloat(_globalWindow2['default'].getComputedStyle(this.player().el()).width);
var tooltipWidth = parseFloat(_globalWindow2['default'].getComputedStyle(this.tooltip).width);
var tooltipWidthHalf = tooltipWidth / 2;
var actualPosition = position;
if (position < tooltipWidthHalf) {
actualPosition = Math.ceil(tooltipWidthHalf);
} else if (position > playerWidth - tooltipWidthHalf) {
actualPosition = Math.floor(playerWidth - tooltipWidthHalf);
}
return actualPosition;
};
return MouseTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('MouseTimeDisplay', MouseTimeDisplay);
exports['default'] = MouseTimeDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL21vdXNlLXRpbWUtZGlzcGxheS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7NEJBR21CLGVBQWU7Ozs7MkJBQ1osb0JBQW9COzs7OzBCQUNyQixvQkFBb0I7O0lBQTdCLEdBQUc7O3lCQUNLLG1CQUFtQjs7SUFBM0IsRUFBRTs7aUNBQ1MsNEJBQTRCOzs7OzRDQUM5QixpQ0FBaUM7Ozs7Ozs7Ozs7Ozs7O0lBV2hELGdCQUFnQjtZQUFoQixnQkFBZ0I7O0FBRVQsV0FGUCxnQkFBZ0IsQ0FFUixNQUFNLEVBQUUsT0FBTyxFQUFFOzs7MEJBRnpCLGdCQUFnQjs7QUFHbEIsMEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLE9BQU8sQ0FBQyxhQUFhLElBQ3JCLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxJQUNoQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxlQUFlLElBQ2hELE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRTtBQUN2RSxVQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQy9GOztBQUVELFFBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO0FBQzNCLFVBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDO0FBQ3BFLFVBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3BDLFVBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztLQUMzQzs7QUFFRCxRQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVB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cUJBQ25ELGdCQUFnQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvcHJvZ3Jlc3MtY29udHJvbC9tb3VzZS10aW1lLWRpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIG1vdXNlLXRpbWUtZGlzcGxheS5qc1xuICovXG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi8uLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgZm9ybWF0VGltZSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQtdGltZS5qcyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoLWNvbXBhdC9mdW5jdGlvbi90aHJvdHRsZSc7XG5cbi8qKlxuICogVGhlIE1vdXNlIFRpbWUgRGlzcGxheSBjb21wb25lbnQgc2hvd3MgdGhlIHRpbWUgeW91IHdpbGwgc2VlayB0b1xuICogd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwcm9ncmVzcyBiYXJcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBNb3VzZVRpbWVEaXNwbGF5XG4gKi9cbmNsYXNzIE1vdXNlVGltZURpc3BsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucy5wbGF5ZXJPcHRpb25zICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbCAmJlxuICAgICAgICBvcHRpb25zLnBsYXllck9wdGlvbnMuY29udHJvbEJhci5wcm9ncmVzc0NvbnRyb2wua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLmtlZXBUb29sdGlwc0luc2lkZSA9IG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbC5rZWVwVG9vbHRpcHNJbnNpZGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLnRvb2x0aXAgPSBEb20uY3JlYXRlRWwoJ2RpdicsIHtjbGFzc05hbWU6ICd2anMtdGltZS10b29sdGlwJ30pO1xuICAgICAgdGhpcy5lbCgpLmFwcGVuZENoaWxkKHRoaXMudG9vbHRpcCk7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMta2VlcC10b29sdGlwcy1pbnNpZGUnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZSgwLCAwLCAwKTtcblxuICAgIHBsYXllci5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICBsZXQgcHJvZ3Jlc3NFbCA9IHRoaXMucGxheWVyXy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbC5lbCgpO1xuICAgICAgcHJvZ3Jlc3NFbC5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXApO1xuICAgICAgdGhpcy5vbihwcm9ncmVzc0VsLCAnbW91c2Vtb3ZlJywgdGhyb3R0bGUoRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSksIDI1KSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICB0aGlzLnRvb2x0aXAgPSBEb20uY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tb3VzZS1kaXNwbGF5LXRvb2x0aXAnXG4gICAgfSk7XG4gICAgbGV0IGVsID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tb3VzZS1kaXNwbGF5J1xuICAgIH0pO1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIGRpc3Bvc2UoKXtcbiAgICBpZiAodGhpcy50b29sdGlwLnBhcmVudE5vZGUpIHtcbiAgICAgIHRoaXMudG9vbHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMudG9vbHRpcCk7XG4gICAgfVxuXG4gICAgRG9tLnJlbW92ZUVsRGF0YSh0aGlzLnRvb2x0aXApO1xuICAgIHRoaXMudG9vbHRpcCA9IG51bGw7XG5cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICBoYW5kbGVNb3VzZU1vdmUoZXZlbnQpIHtcbiAgICBsZXQgaXNQZXJjZW50ID0gZmFsc2U7XG4gICAgbGV0IGR1cmF0aW9uID0gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgaWYgKCFkdXJhdGlvbikge1xuICAgICAgaXNQZXJjZW50ID0gdHJ1ZTtcbiAgICAgIGR1cmF0aW9uID0gMTAwO1xuICAgIH1cbiAgICBsZXQgbmV3VGltZSA9IHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpICogZHVyYXRpb247XG5cbiAgICBsZXQgbWF4TGVmdCA9IHRoaXMucGxheWVyKCkuY29udHJvbEJhci5wcm9ncmVzc0NvbnRyb2wuc2Vla0Jhci53aWR0aCgpIC0gdGhpcy53aWR0aCgpO1xuICAgIGxldCBwb3NpdGlvbiA9IGV2ZW50LnBhZ2VYIC0gRG9tLmZpbmRFbFBvc2l0aW9uKHRoaXMuZWwoKS5wYXJlbnROb2RlKS5sZWZ0O1xuICAgIHBvc2l0aW9uID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcG9zaXRpb24pLCBtYXhMZWZ0KTtcblxuICAgIGxldCB0b29sdGlwV2lkdGggPSB0aGlzLnRvb2x0aXAub2Zmc2V0V2lkdGg7XG4gICAgbGV0IG1heFRvb2x0aXBMZWZ0ID0gdGhpcy50b29sdGlwLnBhcmVudE5vZGUub2Zmc2V0V2lkdGggLSB0b29sdGlwV2lkdGg7XG4gICAgbGV0IHRvb2x0aXBQb3NpdGlvbiA9IGV2ZW50LnBhZ2VYIC0gRG9tLmZpbmRFbFBvc2l0aW9uKHRoaXMudG9vbHRpcC5wYXJlbnROb2RlKS5sZWZ0IC0gdG9vbHRpcFdpZHRoLzI7XG4gICAgdG9vbHRpcFBvc2l0aW9uID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgdG9vbHRpcFBvc2l0aW9uKSwgbWF4VG9vbHRpcExlZnQpO1xuXG4gICAgdGhpcy51cGRhdGUobmV3VGltZSwgcG9zaXRpb24sIHRvb2x0aXBQb3NpdGlvbiwgaXNQZXJjZW50KTtcbiAgfVxuXG4gIHVwZGF0ZShuZXdUaW1lLCBwb3NpdGlvbiwgdG9vbHRpcFBvc2l0aW9uLCBpc1BlcmNlbnQpIHtcbiAgICBsZXQgdGltZSA9IGlzUGVyY2VudCA/IE1hdGgucm91bmQobmV3VGltZSkgKyAnJScgOiBmb3JtYXRUaW1lKG5ld1RpbWUsIHRoaXMucGxheWVyXy5kdXJhdGlvbigpKTtcblxuICAgIHRoaXMuZWwoKS5zdHlsZS5sZWZ0ID0gcG9zaXRpb24gKyAncHgnO1xuICAgIHRoaXMudG9vbHRpcC5pbm5lckhUTUwgPSB0aW1lO1xuXG4gICAgaWYgKHRoaXMua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICBsZXQgY2xhbXBlZFBvc2l0aW9uID0gdGhpcy5jbGFtcFBvc2l0aW9uXyhwb3NpdGlvbik7XG4gICAgICBsZXQgZGlmZmVyZW5jZSA9IHBvc2l0aW9uIC0gY2xhbXBlZFBvc2l0aW9uICsgMTtcbiAgICAgIGxldCB0b29sdGlwV2lkdGggPSBwYXJzZUZsb2F0KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMudG9vbHRpcCkud2lkdGgpO1xuICAgICAgbGV0IHRvb2x0aXBXaWR0aEhhbGYgPSB0b29sdGlwV2lkdGggLyAyO1xuXG4gICAgICB0aGlzLnRvb2x0aXAuc3R5bGUubGVmdCA9ICdhdXRvJztcbiAgICAgIHRoaXMudG9vbHRpcC5zdHlsZS5yaWdodCA9IGAtJHt0b29sdGlwV2lkdGhIYWxmIC0gZGlmZmVyZW5jZX1weGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9vbHRpcC5zdHlsZS5yaWdodCA9ICdhdXRvJztcbiAgICAgIHRoaXMudG9vbHRpcC5zdHlsZS5sZWZ0ID0gdG9vbHRpcFBvc2l0aW9uICsgJ3B4JztcbiAgICB9XG4gIH1cblxuICBjYWxjdWxhdGVEaXN0YW5jZShldmVudCkge1xuICAgIHJldHVybiBEb20uZ2V0UG9pbnRlclBvc2l0aW9uKHRoaXMuZWwoKS5wYXJlbnROb2RlLCBldmVudCkueDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIHRha2VzIGluIGEgaG9yaXpvbnRhbCBwb3NpdGlvbiBmb3IgdGhlIGJhciBhbmQgcmV0dXJucyBhIGNsYW1wZWQgcG9zaXRpb24uXG4gICAqIENsYW1wZWQgcG9zaXRpb24gbWVhbnMgdGhhdCBpdCB3aWxsIGtlZXAgdGhlIHBvc2l0aW9uIGdyZWF0ZXIgdGhhbiBoYWxmIHRoZSB3aWR0aFxuICAgKiBvZiB0aGUgdG9vbHRpcCBhbmQgc21hbGxlciB0aGFuIHRoZSBwbGF5ZXIgd2lkdGggbWludXMgaGFsZiB0aGUgd2lkdGggbyB0aGUgdG9vbHRpcC5cbiAgICogSXQgd2lsbCBvbmx5IGNsYW1wIHRoZSBwb3NpdGlvbiBpZiBga2VlcFRvb2x0aXBzSW5zaWRlYCBvcHRpb24gaXMgc2V0LlxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gdGhlIHBvc2l0aW9uIHRoZSBiYXIgd2FudHMgdG8gYmVcbiAgICogQHJldHVybiB7TnVtYmVyfSBuZXdQb3NpdGlvbiB0aGUgKHBvdGVudGlhbGx5KSBjbGFtcGVkIHBvc2l0aW9uXG4gICAqIEBtZXRob2QgY2xhbXBQb3NpdGlvbl9cbiAgICovXG4gIGNsYW1wUG9zaXRpb25fKHBvc2l0aW9uKSB7XG4gICAgaWYgKCF0aGlzLmtlZXBUb29sdGlwc0luc2lkZSkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIGxldCBwbGF5ZXJXaWR0aCA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wbGF5ZXIoKS5lbCgpKS53aWR0aCk7XG4gICAgbGV0IHRvb2x0aXBXaWR0aCA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy50b29sdGlwKS53aWR0aCk7XG4gICAgbGV0IHRvb2x0aXBXaWR0aEhhbGYgPSB0b29sdGlwV2lkdGggLyAyO1xuICAgIGxldCBhY3R1YWxQb3NpdGlvbiA9IHBvc2l0aW9uO1xuXG4gICAgaWYgKHBvc2l0aW9uIDwgdG9vbHRpcFdpZHRoSGFsZikge1xuICAgICAgYWN0dWFsUG9zaXRpb24gPSBNYXRoLmNlaWwodG9vbHRpcFdpZHRoSGFsZik7XG4gICAgfSBlbHNlIGlmIChwb3NpdGlvbiA+IChwbGF5ZXJXaWR0aCAtIHRvb2x0aXBXaWR0aEhhbGYpKSB7XG4gICAgICBhY3R1YWxQb3NpdGlvbiA9IE1hdGguZmxvb3IocGxheWVyV2lkdGggLSB0b29sdGlwV2lkdGhIYWxmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0dWFsUG9zaXRpb247XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNb3VzZVRpbWVEaXNwbGF5JywgTW91c2VUaW1lRGlzcGxheSk7XG5leHBvcnQgZGVmYXVsdCBNb3VzZVRpbWVEaXNwbGF5O1xuIl19
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/fn.js":146,"../../utils/format-time.js":147,"global/window":8,"lodash-compat/function/throttle":13}],78:[function(_dereq_,module,exports){
/**
* @file play-progress-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Shows play progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class PlayProgressBar
*/
var PlayProgressBar = (function (_Component) {
_inherits(PlayProgressBar, _Component);
function PlayProgressBar(player, options) {
_classCallCheck(this, PlayProgressBar);
_Component.call(this, player, options);
this.updateDataAttr();
this.on(player, 'timeupdate', this.updateDataAttr);
player.ready(Fn.bind(this, this.updateDataAttr));
if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) {
this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside;
}
if (this.keepTooltipsInside) {
this.addClass('vjs-keep-tooltips-inside');
}
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
PlayProgressBar.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-play-progress vjs-slider-bar',
innerHTML: '' + this.localize('Progress') + ': 0%'
});
};
PlayProgressBar.prototype.updateDataAttr = function updateDataAttr() {
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
this.el_.setAttribute('data-current-time', _utilsFormatTimeJs2['default'](time, this.player_.duration()));
};
return PlayProgressBar;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('PlayProgressBar', PlayProgressBar);
exports['default'] = PlayProgressBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3BsYXktcHJvZ3Jlc3MtYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7O3lCQUN0QixtQkFBbUI7O0lBQTNCLEVBQUU7OzBCQUNPLG9CQUFvQjs7SUFBN0IsR0FBRzs7aUNBQ1EsNEJBQTRCOzs7Ozs7Ozs7Ozs7O0lBVTdDLGVBQWU7WUFBZixlQUFlOztBQUVSLFdBRlAsZUFBZSxDQUVQLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLGVBQWU7O0FBR2pCLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDdEIsUUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNuRCxVQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDOztBQUVqRCxRQUFJLE9BQU8sQ0FBQyxhQUFhLElBQ3JCLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxJQUNoQyxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxlQUFlLElBQ2hELE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsRUFBRTtBQUN2RSxVQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO0tBQy9GOztBQUVELFFBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO0FBQzNCLFVBQUksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsQ0FBQztLQUMzQztHQUNGOzs7Ozs7Ozs7QUFsQkcsaUJBQWUsV0EwQm5CLFFBQVEsR0FBQSxvQkFBRztBQUNULFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzNCLGVBQVMsRUFBRSxrQ0FBa0M7QUFDN0MsZUFBUyw0Q0FBMEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsdUJBQW9CO0tBQ2pHLENBQUMsQ0FBQztHQUNKOztBQS9CRyxpQkFBZSxXQWlDbkIsY0FBYyxHQUFBLDBCQUFHO0FBQ2YsUUFBSSxJQUFJLEdBQUcsQUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDekcsUUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsK0JBQVcsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO0dBQ3ZGOztTQXBDRyxlQUFlOzs7QUF3Q3JCLHlCQUFVLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO3FCQUNqRCxlQUFlIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3BsYXktcHJvZ3Jlc3MtYmFyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBwbGF5LXByb2dyZXNzLWJhci5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi8uLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vLi4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCBmb3JtYXRUaW1lIGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC10aW1lLmpzJztcblxuLyoqXG4gKiBTaG93cyBwbGF5IHByb2dyZXNzXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgUGxheVByb2dyZXNzQmFyXG4gKi9cbmNsYXNzIFBsYXlQcm9ncmVzc0JhciBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlRGF0YUF0dHIoKTtcbiAgICB0aGlzLm9uKHBsYXllciwgJ3RpbWV1cGRhdGUnLCB0aGlzLnVwZGF0ZURhdGFBdHRyKTtcbiAgICBwbGF5ZXIucmVhZHkoRm4uYmluZCh0aGlzLCB0aGlzLnVwZGF0ZURhdGFBdHRyKSk7XG5cbiAgICBpZiAob3B0aW9ucy5wbGF5ZXJPcHRpb25zICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbCAmJlxuICAgICAgICBvcHRpb25zLnBsYXllck9wdGlvbnMuY29udHJvbEJhci5wcm9ncmVzc0NvbnRyb2wua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLmtlZXBUb29sdGlwc0luc2lkZSA9IG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbC5rZWVwVG9vbHRpcHNJbnNpZGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMta2VlcC10b29sdGlwcy1pbnNpZGUnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1wbGF5LXByb2dyZXNzIHZqcy1zbGlkZXItYmFyJyxcbiAgICAgIGlubmVySFRNTDogYDxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPjxzcGFuPiR7dGhpcy5sb2NhbGl6ZSgnUHJvZ3Jlc3MnKX08L3NwYW4+OiAwJTwvc3Bhbj5gXG4gICAgfSk7XG4gIH1cblxuICB1cGRhdGVEYXRhQXR0cigpIHtcbiAgICBsZXQgdGltZSA9ICh0aGlzLnBsYXllcl8uc2NydWJiaW5nKCkpID8gdGhpcy5wbGF5ZXJfLmdldENhY2hlKCkuY3VycmVudFRpbWUgOiB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUoKTtcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVudC10aW1lJywgZm9ybWF0VGltZSh0aW1lLCB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSkpO1xuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5UHJvZ3Jlc3NCYXInLCBQbGF5UHJvZ3Jlc3NCYXIpO1xuZXhwb3J0IGRlZmF1bHQgUGxheVByb2dyZXNzQmFyO1xuIl19
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/fn.js":146,"../../utils/format-time.js":147}],79:[function(_dereq_,module,exports){
/**
* @file progress-control.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _seekBarJs = _dereq_('./seek-bar.js');
var _seekBarJs2 = _interopRequireDefault(_seekBarJs);
var _mouseTimeDisplayJs = _dereq_('./mouse-time-display.js');
var _mouseTimeDisplayJs2 = _interopRequireDefault(_mouseTimeDisplayJs);
/**
* The Progress Control component contains the seek bar, load progress,
* and play progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class ProgressControl
*/
var ProgressControl = (function (_Component) {
_inherits(ProgressControl, _Component);
function ProgressControl() {
_classCallCheck(this, ProgressControl);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
ProgressControl.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-control vjs-control'
});
};
return ProgressControl;
})(_componentJs2['default']);
ProgressControl.prototype.options_ = {
children: ['seekBar']
};
_componentJs2['default'].registerComponent('ProgressControl', ProgressControl);
exports['default'] = ProgressControl;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3Byb2dyZXNzLWNvbnRyb2wuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7O3lCQUN0QixlQUFlOzs7O2tDQUNOLHlCQUF5Qjs7Ozs7Ozs7Ozs7Ozs7SUFXaEQsZUFBZTtZQUFmLGVBQWU7O1dBQWYsZUFBZTswQkFBZixlQUFlOzs7Ozs7Ozs7Ozs7QUFBZixpQkFBZSxXQVFuQixRQUFRLEdBQUEsb0JBQUc7QUFDVCxXQUFPLHFCQUFNLFFBQVEsS0FBQSxPQUFDLEtBQUssRUFBRTtBQUMzQixlQUFTLEVBQUUsa0NBQWtDO0tBQzlDLENBQUMsQ0FBQztHQUNKOztTQVpHLGVBQWU7OztBQWVyQixlQUFlLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRztBQUNuQyxVQUFRLEVBQUUsQ0FDUixTQUFTLENBQ1Y7Q0FDRixDQUFDOztBQUVGLHlCQUFVLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO3FCQUNqRCxlQUFlIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3Byb2dyZXNzLWNvbnRyb2wuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHByb2dyZXNzLWNvbnRyb2wuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0IFNlZWtCYXIgZnJvbSAnLi9zZWVrLWJhci5qcyc7XG5pbXBvcnQgTW91c2VUaW1lRGlzcGxheSBmcm9tICcuL21vdXNlLXRpbWUtZGlzcGxheS5qcyc7XG5cbi8qKlxuICogVGhlIFByb2dyZXNzIENvbnRyb2wgY29tcG9uZW50IGNvbnRhaW5zIHRoZSBzZWVrIGJhciwgbG9hZCBwcm9ncmVzcyxcbiAqIGFuZCBwbGF5IHByb2dyZXNzXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgUHJvZ3Jlc3NDb250cm9sXG4gKi9cbmNsYXNzIFByb2dyZXNzQ29udHJvbCBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtcHJvZ3Jlc3MtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcbiAgfVxufVxuXG5Qcm9ncmVzc0NvbnRyb2wucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogW1xuICAgICdzZWVrQmFyJ1xuICBdXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1Byb2dyZXNzQ29udHJvbCcsIFByb2dyZXNzQ29udHJvbCk7XG5leHBvcnQgZGVmYXVsdCBQcm9ncmVzc0NvbnRyb2w7XG4iXX0=
},{"../../component.js":66,"./mouse-time-display.js":77,"./seek-bar.js":80}],80:[function(_dereq_,module,exports){
/**
* @file seek-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _sliderSliderJs = _dereq_('../../slider/slider.js');
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _loadProgressBarJs = _dereq_('./load-progress-bar.js');
var _loadProgressBarJs2 = _interopRequireDefault(_loadProgressBarJs);
var _playProgressBarJs = _dereq_('./play-progress-bar.js');
var _playProgressBarJs2 = _interopRequireDefault(_playProgressBarJs);
var _tooltipProgressBarJs = _dereq_('./tooltip-progress-bar.js');
var _tooltipProgressBarJs2 = _interopRequireDefault(_tooltipProgressBarJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* Seek Bar and holder for the progress bars
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Slider
* @class SeekBar
*/
var SeekBar = (function (_Slider) {
_inherits(SeekBar, _Slider);
function SeekBar(player, options) {
_classCallCheck(this, SeekBar);
_Slider.call(this, player, options);
this.on(player, 'timeupdate', this.updateProgress);
this.on(player, 'ended', this.updateProgress);
player.ready(Fn.bind(this, this.updateProgress));
if (options.playerOptions && options.playerOptions.controlBar && options.playerOptions.controlBar.progressControl && options.playerOptions.controlBar.progressControl.keepTooltipsInside) {
this.keepTooltipsInside = options.playerOptions.controlBar.progressControl.keepTooltipsInside;
}
if (this.keepTooltipsInside) {
this.tooltipProgressBar = this.addChild('TooltipProgressBar');
}
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
SeekBar.prototype.createEl = function createEl() {
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-progress-holder'
}, {
'aria-label': 'progress bar'
});
};
/**
* Update ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
SeekBar.prototype.updateProgress = function updateProgress() {
this.updateAriaAttributes(this.el_);
if (this.keepTooltipsInside) {
this.updateAriaAttributes(this.tooltipProgressBar.el_);
this.tooltipProgressBar.el_.style.width = this.bar.el_.style.width;
var playerWidth = parseFloat(_globalWindow2['default'].getComputedStyle(this.player().el()).width);
var tooltipWidth = parseFloat(_globalWindow2['default'].getComputedStyle(this.tooltipProgressBar.tooltip).width);
var tooltipStyle = this.tooltipProgressBar.el().style;
tooltipStyle.maxWidth = Math.floor(playerWidth - tooltipWidth / 2) + 'px';
tooltipStyle.minWidth = Math.ceil(tooltipWidth / 2) + 'px';
tooltipStyle.right = '-' + tooltipWidth / 2 + 'px';
}
};
SeekBar.prototype.updateAriaAttributes = function updateAriaAttributes(el) {
// Allows for smooth scrubbing, when player can't keep up.
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
el.setAttribute('aria-valuenow', (this.getPercent() * 100).toFixed(2)); // machine readable value of progress bar (percentage complete)
el.setAttribute('aria-valuetext', _utilsFormatTimeJs2['default'](time, this.player_.duration())); // human readable value of progress bar (time complete)
};
/**
* Get percentage of video played
*
* @return {Number} Percentage played
* @method getPercent
*/
SeekBar.prototype.getPercent = function getPercent() {
var percent = this.player_.currentTime() / this.player_.duration();
return percent >= 1 ? 1 : percent;
};
/**
* Handle mouse down on seek bar
*
* @method handleMouseDown
*/
SeekBar.prototype.handleMouseDown = function handleMouseDown(event) {
this.player_.scrubbing(true);
this.videoWasPlaying = !this.player_.paused();
this.player_.pause();
_Slider.prototype.handleMouseDown.call(this, event);
};
/**
* Handle mouse move on seek bar
*
* @method handleMouseMove
*/
SeekBar.prototype.handleMouseMove = function handleMouseMove(event) {
var newTime = this.calculateDistance(event) * this.player_.duration();
// Don't let video end while scrubbing.
if (newTime === this.player_.duration()) {
newTime = newTime - 0.1;
}
// Set new time (tell player to seek to new time)
this.player_.currentTime(newTime);
};
/**
* Handle mouse up on seek bar
*
* @method handleMouseUp
*/
SeekBar.prototype.handleMouseUp = function handleMouseUp(event) {
_Slider.prototype.handleMouseUp.call(this, event);
this.player_.scrubbing(false);
if (this.videoWasPlaying) {
this.player_.play();
}
};
/**
* Move more quickly fast forward for keyboard-only users
*
* @method stepForward
*/
SeekBar.prototype.stepForward = function stepForward() {
this.player_.currentTime(this.player_.currentTime() + 5); // more quickly fast forward for keyboard-only users
};
/**
* Move more quickly rewind for keyboard-only users
*
* @method stepBack
*/
SeekBar.prototype.stepBack = function stepBack() {
this.player_.currentTime(this.player_.currentTime() - 5); // more quickly rewind for keyboard-only users
};
return SeekBar;
})(_sliderSliderJs2['default']);
SeekBar.prototype.options_ = {
children: ['loadProgressBar', 'mouseTimeDisplay', 'playProgressBar'],
'barName': 'playProgressBar'
};
SeekBar.prototype.playerEvent = 'timeupdate';
_componentJs2['default'].registerComponent('SeekBar', SeekBar);
exports['default'] = SeekBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3NlZWstYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs0QkFHbUIsZUFBZTs7Ozs4QkFDZix3QkFBd0I7Ozs7MkJBQ3JCLG9CQUFvQjs7OztpQ0FDZCx3QkFBd0I7Ozs7aUNBQ3hCLHdCQUF3Qjs7OztvQ0FDckIsMkJBQTJCOzs7O3lCQUN0QyxtQkFBbUI7O0lBQTNCLEVBQUU7O2lDQUNTLDRCQUE0Qjs7Ozs0QkFDaEMsZUFBZTs7Ozs7Ozs7Ozs7OztJQVU1QixPQUFPO1lBQVAsT0FBTzs7QUFFQSxXQUZQLE9BQU8sQ0FFQyxNQUFNLEVBQUUsT0FBTyxFQUFDOzBCQUZ4QixPQUFPOztBQUdULHVCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ25ELFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDOUMsVUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQzs7QUFFakQsUUFBSSxPQUFPLENBQUMsYUFBYSxJQUNyQixPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsSUFDaEMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsZUFBZSxJQUNoRCxPQUFPLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEVBQUU7QUFDdkUsVUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQztLQUMvRjs7QUFFRCxRQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtBQUMzQixV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QUF3SWIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7QUFDM0IsVUFBUSxFQUFFLENBQ1IsaUJBQWlCLEVBQ2pCLGtCQUFrQixFQUNsQixpQkFBaUIsQ0FDbEI7QUFDRCxXQUFTLEVBQUUsaUJBQWlCO0NBQzdCLENBQUM7O0FBRUYsT0FBTyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDOztBQUU3Qyx5QkFBVSxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ2pDLE9BQU8iLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3Byb2dyZXNzLWNvbnRyb2wvc2Vlay1iYXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHNlZWstYmFyLmpzXG4gKi9cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgU2xpZGVyIGZyb20gJy4uLy4uL3NsaWRlci9zbGlkZXIuanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0IExvYWRQcm9ncmVzc0JhciBmcm9tICcuL2xvYWQtcHJvZ3Jlc3MtYmFyLmpzJztcbmltcG9ydCBQbGF5UHJvZ3Jlc3NCYXIgZnJvbSAnLi9wbGF5LXByb2dyZXNzLWJhci5qcyc7XG5pbXBvcnQgVG9vbHRpcFByb2dyZXNzQmFyIGZyb20gJy4vdG9vbHRpcC1wcm9ncmVzcy1iYXIuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IGZvcm1hdFRpbWUgZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LXRpbWUuanMnO1xuaW1wb3J0IGFzc2lnbiBmcm9tICdvYmplY3QuYXNzaWduJztcblxuLyoqXG4gKiBTZWVrIEJhciBhbmQgaG9sZGVyIGZvciB0aGUgcHJvZ3Jlc3MgYmFyc1xuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIFNsaWRlclxuICogQGNsYXNzIFNlZWtCYXJcbiAqL1xuY2xhc3MgU2Vla0JhciBleHRlbmRzIFNsaWRlciB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIHRoaXMudXBkYXRlUHJvZ3Jlc3MpO1xuICAgIHRoaXMub24ocGxheWVyLCAnZW5kZWQnLCB0aGlzLnVwZGF0ZVByb2dyZXNzKTtcbiAgICBwbGF5ZXIucmVhZHkoRm4uYmluZCh0aGlzLCB0aGlzLnVwZGF0ZVByb2dyZXNzKSk7XG5cbiAgICBpZiAob3B0aW9ucy5wbGF5ZXJPcHRpb25zICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyICYmXG4gICAgICAgIG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbCAmJlxuICAgICAgICBvcHRpb25zLnBsYXllck9wdGlvbnMuY29udHJvbEJhci5wcm9ncmVzc0NvbnRyb2wua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLmtlZXBUb29sdGlwc0luc2lkZSA9IG9wdGlvbnMucGxheWVyT3B0aW9ucy5jb250cm9sQmFyLnByb2dyZXNzQ29udHJvbC5rZWVwVG9vbHRpcHNJbnNpZGU7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLnRvb2x0aXBQcm9ncmVzc0JhciA9IHRoaXMuYWRkQ2hpbGQoJ1Rvb2x0aXBQcm9ncmVzc0JhcicpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXByb2dyZXNzLWhvbGRlcidcbiAgICB9LCB7XG4gICAgICAnYXJpYS1sYWJlbCc6ICdwcm9ncmVzcyBiYXInXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIEFSSUEgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlQVJJQUF0dHJpYnV0ZXNcbiAgICovXG4gIHVwZGF0ZVByb2dyZXNzKCkge1xuICAgIHRoaXMudXBkYXRlQXJpYUF0dHJpYnV0ZXModGhpcy5lbF8pO1xuXG4gICAgaWYgKHRoaXMua2VlcFRvb2x0aXBzSW5zaWRlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUFyaWFBdHRyaWJ1dGVzKHRoaXMudG9vbHRpcFByb2dyZXNzQmFyLmVsXyk7XG4gICAgICB0aGlzLnRvb2x0aXBQcm9ncmVzc0Jhci5lbF8uc3R5bGUud2lkdGggPSB0aGlzLmJhci5lbF8uc3R5bGUud2lkdGg7XG5cbiAgICAgIGxldCBwbGF5ZXJXaWR0aCA9IHBhcnNlRmxvYXQod2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5wbGF5ZXIoKS5lbCgpKS53aWR0aCk7XG4gICAgICBsZXQgdG9vbHRpcFdpZHRoID0gcGFyc2VGbG9hdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnRvb2x0aXBQcm9ncmVzc0Jhci50b29sdGlwKS53aWR0aCk7XG4gICAgICBsZXQgdG9vbHRpcFN0eWxlID0gdGhpcy50b29sdGlwUHJvZ3Jlc3NCYXIuZWwoKS5zdHlsZTtcbiAgICAgIHRvb2x0aXBTdHlsZS5tYXhXaWR0aCA9IE1hdGguZmxvb3IocGxheWVyV2lkdGggLSAodG9vbHRpcFdpZHRoIC8gMikpICsgJ3B4JztcbiAgICAgIHRvb2x0aXBTdHlsZS5taW5XaWR0aCA9IE1hdGguY2VpbCh0b29sdGlwV2lkdGggLyAyKSArICdweCc7XG4gICAgICB0b29sdGlwU3R5bGUucmlnaHQgPSBgLSR7dG9vbHRpcFdpZHRoIC8gMn1weGA7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQXJpYUF0dHJpYnV0ZXMoZWwpIHtcbiAgICAvLyBBbGxvd3MgZm9yIHNtb290aCBzY3J1YmJpbmcsIHdoZW4gcGxheWVyIGNhbid0IGtlZXAgdXAuXG4gICAgbGV0IHRpbWUgPSAodGhpcy5wbGF5ZXJfLnNjcnViYmluZygpKSA/IHRoaXMucGxheWVyXy5nZXRDYWNoZSgpLmN1cnJlbnRUaW1lIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgKHRoaXMuZ2V0UGVyY2VudCgpICogMTAwKS50b0ZpeGVkKDIpKTsgLy8gbWFjaGluZSByZWFkYWJsZSB2YWx1ZSBvZiBwcm9ncmVzcyBiYXIgKHBlcmNlbnRhZ2UgY29tcGxldGUpXG4gICAgZWwuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVldGV4dCcsIGZvcm1hdFRpbWUodGltZSwgdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpKTsgLy8gaHVtYW4gcmVhZGFibGUgdmFsdWUgb2YgcHJvZ3Jlc3MgYmFyICh0aW1lIGNvbXBsZXRlKVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBwZXJjZW50YWdlIG9mIHZpZGVvIHBsYXllZFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFBlcmNlbnRhZ2UgcGxheWVkXG4gICAqIEBtZXRob2QgZ2V0UGVyY2VudFxuICAgKi9cbiAgZ2V0UGVyY2VudCgpIHtcbiAgICBsZXQgcGVyY2VudCA9IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpIC8gdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCk7XG4gICAgcmV0dXJuIHBlcmNlbnQgPj0gMSA/IDEgOiBwZXJjZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSBkb3duIG9uIHNlZWsgYmFyXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlTW91c2VEb3duXG4gICAqL1xuICBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB0aGlzLnBsYXllcl8uc2NydWJiaW5nKHRydWUpO1xuXG4gICAgdGhpcy52aWRlb1dhc1BsYXlpbmcgPSAhdGhpcy5wbGF5ZXJfLnBhdXNlZCgpO1xuICAgIHRoaXMucGxheWVyXy5wYXVzZSgpO1xuXG4gICAgc3VwZXIuaGFuZGxlTW91c2VEb3duKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgbW92ZSBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZU1vdXNlTW92ZVxuICAgKi9cbiAgaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgbGV0IG5ld1RpbWUgPSB0aGlzLmNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSAqIHRoaXMucGxheWVyXy5kdXJhdGlvbigpO1xuXG4gICAgLy8gRG9uJ3QgbGV0IHZpZGVvIGVuZCB3aGlsZSBzY3J1YmJpbmcuXG4gICAgaWYgKG5ld1RpbWUgPT09IHRoaXMucGxheWVyXy5kdXJhdGlvbigpKSB7IG5ld1RpbWUgPSBuZXdUaW1lIC0gMC4xOyB9XG5cbiAgICAvLyBTZXQgbmV3IHRpbWUgKHRlbGwgcGxheWVyIHRvIHNlZWsgdG8gbmV3IHRpbWUpXG4gICAgdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKG5ld1RpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSB1cCBvbiBzZWVrIGJhclxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZU1vdXNlVXBcbiAgICovXG4gIGhhbmRsZU1vdXNlVXAoZXZlbnQpIHtcbiAgICBzdXBlci5oYW5kbGVNb3VzZVVwKGV2ZW50KTtcblxuICAgIHRoaXMucGxheWVyXy5zY3J1YmJpbmcoZmFsc2UpO1xuICAgIGlmICh0aGlzLnZpZGVvV2FzUGxheWluZykge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTW92ZSBtb3JlIHF1aWNrbHkgZmFzdCBmb3J3YXJkIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gICAqXG4gICAqIEBtZXRob2Qgc3RlcEZvcndhcmRcbiAgICovXG4gIHN0ZXBGb3J3YXJkKCkge1xuICAgIHRoaXMucGxheWVyXy5jdXJyZW50VGltZSh0aGlzLnBsYXllcl8uY3VycmVudFRpbWUoKSArIDUpOyAvLyBtb3JlIHF1aWNrbHkgZmFzdCBmb3J3YXJkIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gIH1cblxuICAvKipcbiAgICogTW92ZSBtb3JlIHF1aWNrbHkgcmV3aW5kIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gICAqXG4gICAqIEBtZXRob2Qgc3RlcEJhY2tcbiAgICovXG4gIHN0ZXBCYWNrKCkge1xuICAgIHRoaXMucGxheWVyXy5jdXJyZW50VGltZSh0aGlzLnBsYXllcl8uY3VycmVudFRpbWUoKSAtIDUpOyAvLyBtb3JlIHF1aWNrbHkgcmV3aW5kIGZvciBrZXlib2FyZC1vbmx5IHVzZXJzXG4gIH1cblxufVxuXG5TZWVrQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFtcbiAgICAnbG9hZFByb2dyZXNzQmFyJyxcbiAgICAnbW91c2VUaW1lRGlzcGxheScsXG4gICAgJ3BsYXlQcm9ncmVzc0JhcidcbiAgXSxcbiAgJ2Jhck5hbWUnOiAncGxheVByb2dyZXNzQmFyJ1xufTtcblxuU2Vla0Jhci5wcm90b3R5cGUucGxheWVyRXZlbnQgPSAndGltZXVwZGF0ZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnU2Vla0JhcicsIFNlZWtCYXIpO1xuZXhwb3J0IGRlZmF1bHQgU2Vla0JhcjtcbiJdfQ==
},{"../../component.js":66,"../../slider/slider.js":119,"../../utils/fn.js":146,"../../utils/format-time.js":147,"./load-progress-bar.js":76,"./play-progress-bar.js":78,"./tooltip-progress-bar.js":81,"global/window":8,"object.assign":53}],81:[function(_dereq_,module,exports){
/**
* @file play-progress-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Shows play progress
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class PlayProgressBar
*/
var TooltipProgressBar = (function (_Component) {
_inherits(TooltipProgressBar, _Component);
function TooltipProgressBar(player, options) {
_classCallCheck(this, TooltipProgressBar);
_Component.call(this, player, options);
this.updateDataAttr();
this.on(player, 'timeupdate', this.updateDataAttr);
player.ready(Fn.bind(this, this.updateDataAttr));
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TooltipProgressBar.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-tooltip-progress-bar vjs-slider-bar',
innerHTML: '\n ' + this.localize('Progress') + ': 0%'
});
this.tooltip = el.querySelector('.vjs-time-tooltip');
return el;
};
TooltipProgressBar.prototype.updateDataAttr = function updateDataAttr() {
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration());
this.el_.setAttribute('data-current-time', formattedTime);
this.tooltip.innerHTML = formattedTime;
};
return TooltipProgressBar;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('TooltipProgressBar', TooltipProgressBar);
exports['default'] = TooltipProgressBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9wcm9ncmVzcy1jb250cm9sL3Rvb2x0aXAtcHJvZ3Jlc3MtYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7O3lCQUN0QixtQkFBbUI7O0lBQTNCLEVBQUU7OzBCQUNPLG9CQUFvQjs7SUFBN0IsR0FBRzs7aUNBQ1EsNEJBQTRCOzs7Ozs7Ozs7Ozs7O0lBVTdDLGtCQUFrQjtZQUFsQixrQkFBa0I7O0FBRVgsV0FGUCxrQkFBa0IsQ0FFVixNQUFNLEVBQUUsT0FBTyxFQUFDOzBCQUZ4QixrQkFBa0I7O0FBR3BCLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDdEIsUUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNuRCxVQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0dBQ2xEOzs7Ozs7Ozs7QUFQRyxvQkFBa0IsV0FldEIsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsUUFBSSxFQUFFLEdBQUcscUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzdCLGVBQVMsRUFBRSx5Q0FBeUM7QUFDcEQsZUFBUywwRkFDZ0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsdUJBQW9CO0tBQ3ZGLENBQUMsQ0FBQzs7QUFFSCxRQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQzs7QUFFckQsV0FBTyxFQUFFLENBQUM7R0FDWDs7QUF6Qkcsb0JBQWtCLFdBMkJ0QixjQUFjLEdBQUEsMEJBQUc7QUFDZixRQUFJLElBQUksR0FBRyxBQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztBQUN6RyxRQUFJLGFBQWEsR0FBRywrQkFBVyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzlELFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzFELFFBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQztHQUN4Qzs7U0FoQ0csa0JBQWtCOzs7QUFvQ3hCLHlCQUFVLGlCQUFpQixDQUFDLG9CQUFvQixFQUFFLGtCQUFrQixDQUFDLENBQUM7cUJBQ3ZELGtCQUFrQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvcHJvZ3Jlc3MtY29udHJvbC90b29sdGlwLXByb2dyZXNzLWJhci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgcGxheS1wcm9ncmVzcy1iYXIuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgZm9ybWF0VGltZSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQtdGltZS5qcyc7XG5cbi8qKlxuICogU2hvd3MgcGxheSBwcm9ncmVzc1xuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIFBsYXlQcm9ncmVzc0JhclxuICovXG5jbGFzcyBUb29sdGlwUHJvZ3Jlc3NCYXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgICB0aGlzLnVwZGF0ZURhdGFBdHRyKCk7XG4gICAgdGhpcy5vbihwbGF5ZXIsICd0aW1ldXBkYXRlJywgdGhpcy51cGRhdGVEYXRhQXR0cik7XG4gICAgcGxheWVyLnJlYWR5KEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEYXRhQXR0cikpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgbGV0IGVsID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10b29sdGlwLXByb2dyZXNzLWJhciB2anMtc2xpZGVyLWJhcicsXG4gICAgICBpbm5lckhUTUw6IGA8ZGl2IGNsYXNzPVwidmpzLXRpbWUtdG9vbHRpcFwiPjwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj48c3Bhbj4ke3RoaXMubG9jYWxpemUoJ1Byb2dyZXNzJyl9PC9zcGFuPjogMCU8L3NwYW4+YFxuICAgIH0pO1xuXG4gICAgdGhpcy50b29sdGlwID0gZWwucXVlcnlTZWxlY3RvcignLnZqcy10aW1lLXRvb2x0aXAnKTtcblxuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIHVwZGF0ZURhdGFBdHRyKCkge1xuICAgIGxldCB0aW1lID0gKHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSkgPyB0aGlzLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSA6IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpO1xuICAgIGxldCBmb3JtYXR0ZWRUaW1lID0gZm9ybWF0VGltZSh0aW1lLCB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSk7XG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdkYXRhLWN1cnJlbnQtdGltZScsIGZvcm1hdHRlZFRpbWUpO1xuICAgIHRoaXMudG9vbHRpcC5pbm5lckhUTUwgPSBmb3JtYXR0ZWRUaW1lO1xuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUb29sdGlwUHJvZ3Jlc3NCYXInLCBUb29sdGlwUHJvZ3Jlc3NCYXIpO1xuZXhwb3J0IGRlZmF1bHQgVG9vbHRpcFByb2dyZXNzQmFyO1xuIl19
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/fn.js":146,"../../utils/format-time.js":147}],82:[function(_dereq_,module,exports){
/**
* @file custom-control-spacer.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _spacerJs = _dereq_('./spacer.js');
var _spacerJs2 = _interopRequireDefault(_spacerJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Spacer specifically meant to be used as an insertion point for new plugins, etc.
*
* @extends Spacer
* @class CustomControlSpacer
*/
var CustomControlSpacer = (function (_Spacer) {
_inherits(CustomControlSpacer, _Spacer);
function CustomControlSpacer() {
_classCallCheck(this, CustomControlSpacer);
_Spacer.apply(this, arguments);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
CustomControlSpacer.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-custom-control-spacer ' + _Spacer.prototype.buildCSSClass.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
CustomControlSpacer.prototype.createEl = function createEl() {
var el = _Spacer.prototype.createEl.call(this, {
className: this.buildCSSClass()
});
// No-flex/table-cell mode requires there be some content
// in the cell to fill the remaining space of the table.
el.innerHTML = ' ';
return el;
};
return CustomControlSpacer;
})(_spacerJs2['default']);
_componentJs2['default'].registerComponent('CustomControlSpacer', CustomControlSpacer);
exports['default'] = CustomControlSpacer;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9zcGFjZXItY29udHJvbHMvY3VzdG9tLWNvbnRyb2wtc3BhY2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7d0JBR21CLGFBQWE7Ozs7MkJBQ1Ysb0JBQW9COzs7Ozs7Ozs7OztJQVFwQyxtQkFBbUI7WUFBbkIsbUJBQW1COztXQUFuQixtQkFBbUI7MEJBQW5CLG1CQUFtQjs7Ozs7Ozs7Ozs7O0FBQW5CLHFCQUFtQixXQVF2QixhQUFhLEdBQUEseUJBQUc7QUFDZCwwQ0FBb0Msa0JBQU0sYUFBYSxLQUFBLE1BQUUsQ0FBRztHQUM3RDs7Ozs7Ozs7O0FBVkcscUJBQW1CLFdBa0J2QixRQUFRLEdBQUEsb0JBQUc7QUFDVCxRQUFJLEVBQUUsR0FBRyxrQkFBTSxRQUFRLEtBQUEsT0FBQztBQUN0QixlQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRTtLQUNoQyxDQUFDLENBQUM7Ozs7QUFJSCxNQUFFLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUN4QixXQUFPLEVBQUUsQ0FBQztHQUNYOztTQTNCRyxtQkFBbUI7OztBQThCekIseUJBQVUsaUJBQWlCLENBQUMscUJBQXFCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztxQkFDekQsbUJBQW1CIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci9zcGFjZXItY29udHJvbHMvY3VzdG9tLWNvbnRyb2wtc3BhY2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBjdXN0b20tY29udHJvbC1zcGFjZXIuanNcbiAqL1xuaW1wb3J0IFNwYWNlciBmcm9tICcuL3NwYWNlci5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5cbi8qKlxuICogU3BhY2VyIHNwZWNpZmljYWxseSBtZWFudCB0byBiZSB1c2VkIGFzIGFuIGluc2VydGlvbiBwb2ludCBmb3IgbmV3IHBsdWdpbnMsIGV0Yy5cbiAqXG4gKiBAZXh0ZW5kcyBTcGFjZXJcbiAqIEBjbGFzcyBDdXN0b21Db250cm9sU3BhY2VyXG4gKi9cbmNsYXNzIEN1c3RvbUNvbnRyb2xTcGFjZXIgZXh0ZW5kcyBTcGFjZXIge1xuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGB2anMtY3VzdG9tLWNvbnRyb2wtc3BhY2VyICR7c3VwZXIuYnVpbGRDU1NDbGFzcygpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICBsZXQgZWwgPSBzdXBlci5jcmVhdGVFbCh7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpLFxuICAgIH0pO1xuXG4gICAgLy8gTm8tZmxleC90YWJsZS1jZWxsIG1vZGUgcmVxdWlyZXMgdGhlcmUgYmUgc29tZSBjb250ZW50XG4gICAgLy8gaW4gdGhlIGNlbGwgdG8gZmlsbCB0aGUgcmVtYWluaW5nIHNwYWNlIG9mIHRoZSB0YWJsZS5cbiAgICBlbC5pbm5lckhUTUwgPSAnJm5ic3A7JztcbiAgICByZXR1cm4gZWw7XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDdXN0b21Db250cm9sU3BhY2VyJywgQ3VzdG9tQ29udHJvbFNwYWNlcik7XG5leHBvcnQgZGVmYXVsdCBDdXN0b21Db250cm9sU3BhY2VyO1xuIl19
},{"../../component.js":66,"./spacer.js":83}],83:[function(_dereq_,module,exports){
/**
* @file spacer.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Just an empty spacer element that can be used as an append point for plugins, etc.
* Also can be used to create space between elements when necessary.
*
* @extends Component
* @class Spacer
*/
var Spacer = (function (_Component) {
_inherits(Spacer, _Component);
function Spacer() {
_classCallCheck(this, Spacer);
_Component.apply(this, arguments);
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
Spacer.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-spacer ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Spacer.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
return Spacer;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Spacer', Spacer);
exports['default'] = Spacer;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci9zcGFjZXItY29udHJvbHMvc3BhY2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7MkJBR3NCLG9CQUFvQjs7Ozs7Ozs7Ozs7O0lBU3BDLE1BQU07WUFBTixNQUFNOztXQUFOLE1BQU07MEJBQU4sTUFBTTs7Ozs7Ozs7Ozs7O0FBQU4sUUFBTSxXQVFWLGFBQWEsR0FBQSx5QkFBRztBQUNkLDJCQUFxQixxQkFBTSxhQUFhLEtBQUEsTUFBRSxDQUFHO0dBQzlDOzs7Ozs7Ozs7QUFWRyxRQUFNLFdBa0JWLFFBQVEsR0FBQSxvQkFBRztBQUNULFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzNCLGVBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFO0tBQ2hDLENBQUMsQ0FBQztHQUNKOztTQXRCRyxNQUFNOzs7QUF5QloseUJBQVUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDOztxQkFFL0IsTUFBTSIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvc3BhY2VyLWNvbnRyb2xzL3NwYWNlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgc3BhY2VyLmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcblxuLyoqXG4gKiBKdXN0IGFuIGVtcHR5IHNwYWNlciBlbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gYXBwZW5kIHBvaW50IGZvciBwbHVnaW5zLCBldGMuXG4gKiBBbHNvIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzcGFjZSBiZXR3ZWVuIGVsZW1lbnRzIHdoZW4gbmVjZXNzYXJ5LlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIFNwYWNlclxuICovXG5jbGFzcyBTcGFjZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGB2anMtc3BhY2VyICR7c3VwZXIuYnVpbGRDU1NDbGFzcygpfWA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogdGhpcy5idWlsZENTU0NsYXNzKClcbiAgICB9KTtcbiAgfVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1NwYWNlcicsIFNwYWNlcik7XG5cbmV4cG9ydCBkZWZhdWx0IFNwYWNlcjtcbiJdfQ==
},{"../../component.js":66}],84:[function(_dereq_,module,exports){
/**
* @file caption-settings-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The menu item for caption track settings menu
*
* @param {Player|Object} player
* @param {Object=} options
* @extends TextTrackMenuItem
* @class CaptionSettingsMenuItem
*/
var CaptionSettingsMenuItem = (function (_TextTrackMenuItem) {
_inherits(CaptionSettingsMenuItem, _TextTrackMenuItem);
function CaptionSettingsMenuItem(player, options) {
_classCallCheck(this, CaptionSettingsMenuItem);
options['track'] = {
'kind': options['kind'],
'player': player,
'label': options['kind'] + ' settings',
'selectable': false,
'default': false,
mode: 'disabled'
};
// CaptionSettingsMenuItem has no concept of 'selected'
options['selectable'] = false;
_TextTrackMenuItem.call(this, player, options);
this.addClass('vjs-texttrack-settings');
this.controlText(', opens ' + options['kind'] + ' settings dialog');
}
/**
* Handle click on menu item
*
* @method handleClick
*/
CaptionSettingsMenuItem.prototype.handleClick = function handleClick() {
this.player().getChild('textTrackSettings').show();
this.player().getChild('textTrackSettings').el_.focus();
};
return CaptionSettingsMenuItem;
})(_textTrackMenuItemJs2['default']);
_componentJs2['default'].registerComponent('CaptionSettingsMenuItem', CaptionSettingsMenuItem);
exports['default'] = CaptionSettingsMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2NhcHRpb24tc2V0dGluZ3MtbWVudS1pdGVtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7bUNBRzhCLDJCQUEyQjs7OzsyQkFDbkMsb0JBQW9COzs7Ozs7Ozs7Ozs7O0lBVW5DLHVCQUF1QjtZQUF2Qix1QkFBdUI7O0FBRWpCLFdBRk4sdUJBQXVCLENBRWhCLE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBRnhCLHVCQUF1Qjs7QUFHMUIsV0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHO0FBQ2pCLFlBQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDO0FBQ3ZCLGNBQVEsRUFBRSxNQUFNO0FBQ2hCLGFBQU8sRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsV0FBVztBQUN0QyxrQkFBWSxFQUFFLEtBQUs7QUFDbkIsZUFBUyxFQUFFLEtBQUs7QUFDaEIsVUFBSSxFQUFFLFVBQVU7S0FDakIsQ0FBQzs7O0FBR0YsV0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLEtBQUssQ0FBQzs7QUFFOUIsa0NBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FBQztBQUN4QyxRQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztHQUNyRTs7Ozs7Ozs7QUFsQkkseUJBQXVCLFdBeUI1QixXQUFXLEdBQUEsdUJBQUc7QUFDWixRQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkQsUUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUN6RDs7U0E1QkksdUJBQXVCOzs7QUFnQzlCLHlCQUFVLGlCQUFpQixDQUFDLHlCQUF5QixFQUFFLHVCQUF1QixDQUFDLENBQUM7cUJBQ2pFLHVCQUF1QiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdGV4dC10cmFjay1jb250cm9scy9jYXB0aW9uLXNldHRpbmdzLW1lbnUtaXRlbS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgY2FwdGlvbi1zZXR0aW5ncy1tZW51LWl0ZW0uanNcbiAqL1xuaW1wb3J0IFRleHRUcmFja01lbnVJdGVtIGZyb20gJy4vdGV4dC10cmFjay1tZW51LWl0ZW0uanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuXG4vKipcbiAqIFRoZSBtZW51IGl0ZW0gZm9yIGNhcHRpb24gdHJhY2sgc2V0dGluZ3MgbWVudVxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIFRleHRUcmFja01lbnVJdGVtXG4gKiBAY2xhc3MgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW1cbiAqL1xuIGNsYXNzIENhcHRpb25TZXR0aW5nc01lbnVJdGVtIGV4dGVuZHMgVGV4dFRyYWNrTWVudUl0ZW0ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIG9wdGlvbnNbJ3RyYWNrJ10gPSB7XG4gICAgICAna2luZCc6IG9wdGlvbnNbJ2tpbmQnXSxcbiAgICAgICdwbGF5ZXInOiBwbGF5ZXIsXG4gICAgICAnbGFiZWwnOiBvcHRpb25zWydraW5kJ10gKyAnIHNldHRpbmdzJyxcbiAgICAgICdzZWxlY3RhYmxlJzogZmFsc2UsXG4gICAgICAnZGVmYXVsdCc6IGZhbHNlLFxuICAgICAgbW9kZTogJ2Rpc2FibGVkJ1xuICAgIH07XG5cbiAgICAvLyBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSBoYXMgbm8gY29uY2VwdCBvZiAnc2VsZWN0ZWQnXG4gICAgb3B0aW9uc1snc2VsZWN0YWJsZSddID0gZmFsc2U7XG5cbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy10ZXh0dHJhY2stc2V0dGluZ3MnKTtcbiAgICB0aGlzLmNvbnRyb2xUZXh0KCcsIG9wZW5zICcgKyBvcHRpb25zWydraW5kJ10gKyAnIHNldHRpbmdzIGRpYWxvZycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiBtZW51IGl0ZW1cbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7XG4gICAgdGhpcy5wbGF5ZXIoKS5nZXRDaGlsZCgndGV4dFRyYWNrU2V0dGluZ3MnKS5zaG93KCk7XG4gICAgdGhpcy5wbGF5ZXIoKS5nZXRDaGlsZCgndGV4dFRyYWNrU2V0dGluZ3MnKS5lbF8uZm9jdXMoKTtcbiAgfVxuXG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0nLCBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbSk7XG5leHBvcnQgZGVmYXVsdCBDYXB0aW9uU2V0dGluZ3NNZW51SXRlbTtcbiJdfQ==
},{"../../component.js":66,"./text-track-menu-item.js":92}],85:[function(_dereq_,module,exports){
/**
* @file captions-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _captionSettingsMenuItemJs = _dereq_('./caption-settings-menu-item.js');
var _captionSettingsMenuItemJs2 = _interopRequireDefault(_captionSettingsMenuItemJs);
/**
* The button component for toggling and selecting captions
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class CaptionsButton
*/
var CaptionsButton = (function (_TextTrackButton) {
_inherits(CaptionsButton, _TextTrackButton);
function CaptionsButton(player, options, ready) {
_classCallCheck(this, CaptionsButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Captions Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
CaptionsButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-captions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
/**
* Update caption menu items
*
* @method update
*/
CaptionsButton.prototype.update = function update() {
var threshold = 2;
_TextTrackButton.prototype.update.call(this);
// if native, then threshold is 1 because no settings button
if (this.player().tech_ && this.player().tech_['featuresNativeTextTracks']) {
threshold = 1;
}
if (this.items && this.items.length > threshold) {
this.show();
} else {
this.hide();
}
};
/**
* Create caption menu items
*
* @return {Array} Array of menu items
* @method createItems
*/
CaptionsButton.prototype.createItems = function createItems() {
var items = [];
if (!(this.player().tech_ && this.player().tech_['featuresNativeTextTracks'])) {
items.push(new _captionSettingsMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
}
return _TextTrackButton.prototype.createItems.call(this, items);
};
return CaptionsButton;
})(_textTrackButtonJs2['default']);
CaptionsButton.prototype.kind_ = 'captions';
CaptionsButton.prototype.controlText_ = 'Captions';
_componentJs2['default'].registerComponent('CaptionsButton', CaptionsButton);
exports['default'] = CaptionsButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2NhcHRpb25zLWJ1dHRvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O2lDQUc0Qix3QkFBd0I7Ozs7MkJBQzlCLG9CQUFvQjs7Ozt5Q0FDTixpQ0FBaUM7Ozs7Ozs7Ozs7Ozs7O0lBVy9ELGNBQWM7WUFBZCxjQUFjOztBQUVQLFdBRlAsY0FBYyxDQUVOLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDOzBCQUYvQixjQUFjOztBQUdoQixnQ0FBTSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBQyxlQUFlLENBQUMsQ0FBQztHQUNyRDs7Ozs7Ozs7O0FBTEcsZ0JBQWMsV0FhbEIsYUFBYSxHQUFBLHlCQUFHO0FBQ2Qsb0NBQThCLDJCQUFNLGFBQWEsS0FBQSxNQUFFLENBQUc7R0FDdkQ7Ozs7Ozs7O0FBZkcsZ0JBQWMsV0FzQmxCLE1BQU0sR0FBQSxrQkFBRztBQUNQLFFBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztBQUNsQiwrQkFBTSxNQUFNLEtBQUEsTUFBRSxDQUFDOzs7QUFHZixRQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxFQUFFO0FBQzFFLGVBQVMsR0FBRyxDQUFDLENBQUM7S0FDZjs7QUFFRCxRQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsU0FBUyxFQUFFO0FBQy9DLFVBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiLE1BQU07QUFDTCxVQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDYjtHQUNGOzs7Ozs7Ozs7QUFwQ0csZ0JBQWMsV0E0Q2xCLFdBQVcsR0FBQSx1QkFBRztBQUNaLFFBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7QUFFZixRQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUEsQUFBQyxFQUFFO0FBQzdFLFdBQUssQ0FBQyxJQUFJLENBQUMsMkNBQTRCLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztLQUMvRTs7QUFFRCxXQUFPLDJCQUFNLFdBQVcsS0FBQSxPQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ2pDOztTQXBERyxjQUFjOzs7QUF3RHBCLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztBQUM1QyxjQUFjLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUM7O0FBRW5ELHlCQUFVLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLGNBQWMsQ0FBQyxDQUFDO3FCQUMvQyxjQUFjIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2NhcHRpb25zLWJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgY2FwdGlvbnMtYnV0dG9uLmpzXG4gKi9cbmltcG9ydCBUZXh0VHJhY2tCdXR0b24gZnJvbSAnLi90ZXh0LXRyYWNrLWJ1dHRvbi5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0gZnJvbSAnLi9jYXB0aW9uLXNldHRpbmdzLW1lbnUtaXRlbS5qcyc7XG5cbi8qKlxuICogVGhlIGJ1dHRvbiBjb21wb25lbnQgZm9yIHRvZ2dsaW5nIGFuZCBzZWxlY3RpbmcgY2FwdGlvbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGxheWVyICBQbGF5ZXIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBleHRlbmRzIFRleHRUcmFja0J1dHRvblxuICogQGNsYXNzIENhcHRpb25zQnV0dG9uXG4gKi9cbmNsYXNzIENhcHRpb25zQnV0dG9uIGV4dGVuZHMgVGV4dFRyYWNrQnV0dG9uIHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KTtcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCdDYXB0aW9ucyBNZW51Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNvbnN0cnVjdGVkIGNsYXNzIG5hbWVcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBgdmpzLWNhcHRpb25zLWJ1dHRvbiAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjYXB0aW9uIG1lbnUgaXRlbXNcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICBsZXQgdGhyZXNob2xkID0gMjtcbiAgICBzdXBlci51cGRhdGUoKTtcblxuICAgIC8vIGlmIG5hdGl2ZSwgdGhlbiB0aHJlc2hvbGQgaXMgMSBiZWNhdXNlIG5vIHNldHRpbmdzIGJ1dHRvblxuICAgIGlmICh0aGlzLnBsYXllcigpLnRlY2hfICYmIHRoaXMucGxheWVyKCkudGVjaF9bJ2ZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyddKSB7XG4gICAgICB0aHJlc2hvbGQgPSAxO1xuICAgIH1cblxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID4gdGhyZXNob2xkKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYXB0aW9uIG1lbnUgaXRlbXNcbiAgICpcbiAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IG9mIG1lbnUgaXRlbXNcbiAgICogQG1ldGhvZCBjcmVhdGVJdGVtc1xuICAgKi9cbiAgY3JlYXRlSXRlbXMoKSB7XG4gICAgbGV0IGl0ZW1zID0gW107XG5cbiAgICBpZiAoISh0aGlzLnBsYXllcigpLnRlY2hfICYmIHRoaXMucGxheWVyKCkudGVjaF9bJ2ZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyddKSkge1xuICAgICAgaXRlbXMucHVzaChuZXcgQ2FwdGlvblNldHRpbmdzTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7ICdraW5kJzogdGhpcy5raW5kXyB9KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUl0ZW1zKGl0ZW1zKTtcbiAgfVxuXG59XG5cbkNhcHRpb25zQnV0dG9uLnByb3RvdHlwZS5raW5kXyA9ICdjYXB0aW9ucyc7XG5DYXB0aW9uc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ0NhcHRpb25zJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDYXB0aW9uc0J1dHRvbicsIENhcHRpb25zQnV0dG9uKTtcbmV4cG9ydCBkZWZhdWx0IENhcHRpb25zQnV0dG9uO1xuIl19
},{"../../component.js":66,"./caption-settings-menu-item.js":84,"./text-track-button.js":91}],86:[function(_dereq_,module,exports){
/**
* @file chapters-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _chaptersTrackMenuItemJs = _dereq_('./chapters-track-menu-item.js');
var _chaptersTrackMenuItemJs2 = _interopRequireDefault(_chaptersTrackMenuItemJs);
var _menuMenuJs = _dereq_('../../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsToTitleCaseJs = _dereq_('../../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* The button component for toggling and selecting chapters
* Chapters act much differently than other text tracks
* Cues are navigation vs. other tracks of alternative languages
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class ChaptersButton
*/
var ChaptersButton = (function (_TextTrackButton) {
_inherits(ChaptersButton, _TextTrackButton);
function ChaptersButton(player, options, ready) {
_classCallCheck(this, ChaptersButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Chapters Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
ChaptersButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-chapters-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
/**
* Create a menu item for each text track
*
* @return {Array} Array of menu items
* @method createItems
*/
ChaptersButton.prototype.createItems = function createItems() {
var items = [];
var tracks = this.player_.textTracks();
if (!tracks) {
return items;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track['kind'] === this.kind_) {
items.push(new _textTrackMenuItemJs2['default'](this.player_, {
'track': track
}));
}
}
return items;
};
/**
* Create menu from chapter buttons
*
* @return {Menu} Menu of chapter buttons
* @method createMenu
*/
ChaptersButton.prototype.createMenu = function createMenu() {
var _this = this;
var tracks = this.player_.textTracks() || [];
var chaptersTrack = undefined;
var items = this.items = [];
for (var i = 0, _length = tracks.length; i < _length; i++) {
var track = tracks[i];
if (track['kind'] === this.kind_) {
chaptersTrack = track;
break;
}
}
var menu = this.menu;
if (menu === undefined) {
menu = new _menuMenuJs2['default'](this.player_);
var title = Dom.createEl('li', {
className: 'vjs-menu-title',
innerHTML: _utilsToTitleCaseJs2['default'](this.kind_),
tabIndex: -1
});
menu.children_.unshift(title);
Dom.insertElFirst(title, menu.contentEl());
}
if (chaptersTrack && chaptersTrack.cues == null) {
chaptersTrack['mode'] = 'hidden';
var remoteTextTrackEl = this.player_.remoteTextTrackEls().getTrackElementByTrack_(chaptersTrack);
if (remoteTextTrackEl) {
remoteTextTrackEl.addEventListener('load', function (event) {
return _this.update();
});
}
}
if (chaptersTrack && chaptersTrack.cues && chaptersTrack.cues.length > 0) {
var cues = chaptersTrack['cues'],
cue = undefined;
for (var i = 0, l = cues.length; i < l; i++) {
cue = cues[i];
var mi = new _chaptersTrackMenuItemJs2['default'](this.player_, {
'track': chaptersTrack,
'cue': cue
});
items.push(mi);
menu.addChild(mi);
}
this.addChild(menu);
}
if (this.items.length > 0) {
this.show();
}
return menu;
};
return ChaptersButton;
})(_textTrackButtonJs2['default']);
ChaptersButton.prototype.kind_ = 'chapters';
ChaptersButton.prototype.controlText_ = 'Chapters';
_componentJs2['default'].registerComponent('ChaptersButton', ChaptersButton);
exports['default'] = ChaptersButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2NoYXB0ZXJzLWJ1dHRvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7aUNBRzRCLHdCQUF3Qjs7OzsyQkFDOUIsb0JBQW9COzs7O21DQUNaLDJCQUEyQjs7Ozt1Q0FDdkIsK0JBQStCOzs7OzBCQUNoRCxvQkFBb0I7Ozs7MEJBQ2hCLG9CQUFvQjs7SUFBN0IsR0FBRzs7eUJBQ0ssbUJBQW1COztJQUEzQixFQUFFOztrQ0FDVSw4QkFBOEI7Ozs7NEJBQ25DLGVBQWU7Ozs7Ozs7Ozs7Ozs7Ozs7SUFhNUIsY0FBYztZQUFkLGNBQWM7O0FBRVAsV0FGUCxjQUFjLENBRU4sTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUM7MEJBRi9CLGNBQWM7O0FBR2hCLGdDQUFNLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsUUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFDLGVBQWUsQ0FBQyxDQUFDO0dBQ3JEOzs7Ozs7Ozs7QUFMRyxnQkFBYyxXQWFsQixhQUFhLEdBQUEseUJBQUc7QUFDZCxvQ0FBOEIsMkJBQU0sYUFBYSxLQUFBLE1BQUUsQ0FBRztHQUN2RDs7Ozs7Ozs7O0FBZkcsZ0JBQWMsV0F1QmxCLFdBQVcsR0FBQSx1QkFBRztBQUNaLFFBQUksS0FBSyxHQUFHLEVBQUUsQ0FBQzs7QUFFZixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDOztBQUV2QyxRQUFJLENBQUMsTUFBTSxFQUFFO0FBQ1gsYUFBTyxLQUFLLENBQUM7S0FDZDs7QUFFRCxTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxVQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIs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Q25COztBQUVELFVBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDckI7O0FBRUQsUUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDekIsVUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ2I7O0FBRUQsV0FBTyxJQUFJLENBQUM7R0FDYjs7U0EvR0csY0FBYzs7O0FBbUhwQixjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7QUFDNUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDOztBQUVuRCx5QkFBVSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztxQkFDL0MsY0FBYyIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdGV4dC10cmFjay1jb250cm9scy9jaGFwdGVycy1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGNoYXB0ZXJzLWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgVGV4dFRyYWNrQnV0dG9uIGZyb20gJy4vdGV4dC10cmFjay1idXR0b24uanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0IFRleHRUcmFja01lbnVJdGVtIGZyb20gJy4vdGV4dC10cmFjay1tZW51LWl0ZW0uanMnO1xuaW1wb3J0IENoYXB0ZXJzVHJhY2tNZW51SXRlbSBmcm9tICcuL2NoYXB0ZXJzLXRyYWNrLW1lbnUtaXRlbS5qcyc7XG5pbXBvcnQgTWVudSBmcm9tICcuLi8uLi9tZW51L21lbnUuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi8uLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgdG9UaXRsZUNhc2UgZnJvbSAnLi4vLi4vdXRpbHMvdG8tdGl0bGUtY2FzZS5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG4vKipcbiAqIFRoZSBidXR0b24gY29tcG9uZW50IGZvciB0b2dnbGluZyBhbmQgc2VsZWN0aW5nIGNoYXB0ZXJzXG4gKiBDaGFwdGVycyBhY3QgbXVjaCBkaWZmZXJlbnRseSB0aGFuIG90aGVyIHRleHQgdHJhY2tzXG4gKiBDdWVzIGFyZSBuYXZpZ2F0aW9uIHZzLiBvdGhlciB0cmFja3Mgb2YgYWx0ZXJuYXRpdmUgbGFuZ3VhZ2VzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsYXllciAgUGxheWVyIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICogQHBhcmFtIHtGdW5jdGlvbj19IHJlYWR5ICAgIFJlYWR5IGNhbGxiYWNrIGZ1bmN0aW9uXG4gKiBAZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b25cbiAqIEBjbGFzcyBDaGFwdGVyc0J1dHRvblxuICovXG5jbGFzcyBDaGFwdGVyc0J1dHRvbiBleHRlbmRzIFRleHRUcmFja0J1dHRvbiB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zLCByZWFkeSl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zLCByZWFkeSk7XG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJywnQ2hhcHRlcnMgTWVudScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93IHN1YiBjb21wb25lbnRzIHRvIHN0YWNrIENTUyBjbGFzcyBuYW1lc1xuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBjb25zdHJ1Y3RlZCBjbGFzcyBuYW1lXG4gICAqIEBtZXRob2QgYnVpbGRDU1NDbGFzc1xuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYHZqcy1jaGFwdGVycy1idXR0b24gJHtzdXBlci5idWlsZENTU0NsYXNzKCl9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgbWVudSBpdGVtc1xuICAgKiBAbWV0aG9kIGNyZWF0ZUl0ZW1zXG4gICAqL1xuICBjcmVhdGVJdGVtcygpIHtcbiAgICBsZXQgaXRlbXMgPSBbXTtcblxuICAgIGxldCB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCF0cmFja3MpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuICAgICAgaWYgKHRyYWNrWydraW5kJ10gPT09IHRoaXMua2luZF8pIHtcbiAgICAgICAgaXRlbXMucHVzaChuZXcgVGV4dFRyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7XG4gICAgICAgICAgJ3RyYWNrJzogdHJhY2tcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBpdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbWVudSBmcm9tIGNoYXB0ZXIgYnV0dG9uc1xuICAgKlxuICAgKiBAcmV0dXJuIHtNZW51fSBNZW51IG9mIGNoYXB0ZXIgYnV0dG9uc1xuICAgKiBAbWV0aG9kIGNyZWF0ZU1lbnVcbiAgICovXG4gIGNyZWF0ZU1lbnUoKSB7XG4gICAgbGV0IHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCkgfHwgW107XG4gICAgbGV0IGNoYXB0ZXJzVHJhY2s7XG4gICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHRyYWNrcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICBpZiAodHJhY2tbJ2tpbmQnXSA9PT0gdGhpcy5raW5kXykge1xuICAgICAgICBjaGFwdGVyc1RyYWNrID0gdHJhY2s7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1lbnUgPSB0aGlzLm1lbnU7XG4gICAgaWYgKG1lbnUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVudSA9IG5ldyBNZW51KHRoaXMucGxheWVyXyk7XG4gICAgICBsZXQgdGl0bGUgPSBEb20uY3JlYXRlRWwoJ2xpJywge1xuICAgICAgICBjbGFzc05hbWU6ICd2anMtbWVudS10aXRsZScsXG4gICAgICAgIGlubmVySFRNTDogdG9UaXRsZUNhc2UodGhpcy5raW5kXyksXG4gICAgICAgIHRhYkluZGV4OiAtMVxuICAgICAgfSk7XG4gICAgICBtZW51LmNoaWxkcmVuXy51bnNoaWZ0KHRpdGxlKTtcbiAgICAgIERvbS5pbnNlcnRFbEZpcnN0KHRpdGxlLCBtZW51LmNvbnRlbnRFbCgpKTtcbiAgICB9XG5cbiAgICBpZiAoY2hhcHRlcnNUcmFjayAmJiBjaGFwdGVyc1RyYWNrLmN1ZXMgPT0gbnVsbCkge1xuICAgICAgY2hhcHRlcnNUcmFja1snbW9kZSddID0gJ2hpZGRlbic7XG5cbiAgICAgIGxldCByZW1vdGVUZXh0VHJhY2tFbCA9IHRoaXMucGxheWVyXy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5nZXRUcmFja0VsZW1lbnRCeVRyYWNrXyhjaGFwdGVyc1RyYWNrKTtcblxuICAgICAgaWYgKHJlbW90ZVRleHRUcmFja0VsKSB7XG4gICAgICAgIHJlbW90ZVRleHRUcmFja0VsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCAoZXZlbnQpID0+IHRoaXMudXBkYXRlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjaGFwdGVyc1RyYWNrICYmIGNoYXB0ZXJzVHJhY2suY3VlcyAmJiBjaGFwdGVyc1RyYWNrLmN1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGN1ZXMgPSBjaGFwdGVyc1RyYWNrWydjdWVzJ10sIGN1ZTtcblxuICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSBjdWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICBjdWUgPSBjdWVzW2ldO1xuXG4gICAgICAgIGxldCBtaSA9IG5ldyBDaGFwdGVyc1RyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7XG4gICAgICAgICAgJ3RyYWNrJzogY2hhcHRlcnNUcmFjayxcbiAgICAgICAgICAnY3VlJzogY3VlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0ZW1zLnB1c2gobWkpO1xuXG4gICAgICAgIG1lbnUuYWRkQ2hpbGQobWkpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFkZENoaWxkKG1lbnUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH1cblxuICAgIHJldHVybiBtZW51O1xuICB9XG5cbn1cblxuQ2hhcHRlcnNCdXR0b24ucHJvdG90eXBlLmtpbmRfID0gJ2NoYXB0ZXJzJztcbkNoYXB0ZXJzQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnQ2hhcHRlcnMnO1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0NoYXB0ZXJzQnV0dG9uJywgQ2hhcHRlcnNCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgQ2hhcHRlcnNCdXR0b247XG4iXX0=
},{"../../component.js":66,"../../menu/menu.js":111,"../../utils/dom.js":144,"../../utils/fn.js":146,"../../utils/to-title-case.js":153,"./chapters-track-menu-item.js":87,"./text-track-button.js":91,"./text-track-menu-item.js":92,"global/window":8}],87:[function(_dereq_,module,exports){
/**
* @file chapters-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* The chapter track menu item
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class ChaptersTrackMenuItem
*/
var ChaptersTrackMenuItem = (function (_MenuItem) {
_inherits(ChaptersTrackMenuItem, _MenuItem);
function ChaptersTrackMenuItem(player, options) {
_classCallCheck(this, ChaptersTrackMenuItem);
var track = options['track'];
var cue = options['cue'];
var currentTime = player.currentTime();
// Modify options for parent MenuItem class's init.
options['label'] = cue.text;
options['selected'] = cue['startTime'] <= currentTime && currentTime < cue['endTime'];
_MenuItem.call(this, player, options);
this.track = track;
this.cue = cue;
track.addEventListener('cuechange', Fn.bind(this, this.update));
}
/**
* Handle click on menu item
*
* @method handleClick
*/
ChaptersTrackMenuItem.prototype.handleClick = function handleClick() {
_MenuItem.prototype.handleClick.call(this);
this.player_.currentTime(this.cue.startTime);
this.update(this.cue.startTime);
};
/**
* Update chapter menu item
*
* @method update
*/
ChaptersTrackMenuItem.prototype.update = function update() {
var cue = this.cue;
var currentTime = this.player_.currentTime();
// vjs.log(currentTime, cue.startTime);
this.selected(cue['startTime'] <= currentTime && currentTime < cue['endTime']);
};
return ChaptersTrackMenuItem;
})(_menuMenuItemJs2['default']);
_componentJs2['default'].registerComponent('ChaptersTrackMenuItem', ChaptersTrackMenuItem);
exports['default'] = ChaptersTrackMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2NoYXB0ZXJzLXRyYWNrLW1lbnUtaXRlbS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OEJBR3FCLHlCQUF5Qjs7OzsyQkFDeEIsb0JBQW9COzs7O3lCQUN0QixtQkFBbUI7O0lBQTNCLEVBQUU7Ozs7Ozs7Ozs7O0lBVVIscUJBQXFCO1lBQXJCLHFCQUFxQjs7QUFFZCxXQUZQLHFCQUFxQixDQUViLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLHFCQUFxQjs7QUFHdkIsUUFBSSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzdCLFFBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QixRQUFJLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUM7OztBQUd2QyxXQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztBQUM1QixXQUFPLENBQUMsVUFBVSxDQUFDLEdBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxBQUFDLENBQUM7QUFDeEYseUJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixRQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNmLFNBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7R0FDakU7Ozs7Ozs7O0FBZkcsdUJBQXFCLFdBc0J6QixXQUFXLEdBQUEsdUJBQUc7QUFDWix3QkFBTSxXQUFXLEtBQUEsTUFBRSxDQUFDO0FBQ3BCLFFBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDN0MsUUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0dBQ2pDOzs7Ozs7OztBQTFCRyx1QkFBcUIsV0FpQ3pCLE1BQU0sR0FBQSxrQkFBRztBQUNQLFFBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDbkIsUUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQzs7O0FBRzdDLFFBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsSUFBSSxXQUFXLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7R0FDaEY7O1NBdkNHLHFCQUFxQjs7O0FBMkMzQix5QkFBVSxpQkFBaUIsQ0FBQyx1QkFBdUIsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO3FCQUM3RCxxQkFBcUIiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3RleHQtdHJhY2stY29udHJvbHMvY2hhcHRlcnMtdHJhY2stbWVudS1pdGVtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBjaGFwdGVycy10cmFjay1tZW51LWl0ZW0uanNcbiAqL1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJy4uLy4uL21lbnUvbWVudS1pdGVtLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uLy4uL3V0aWxzL2ZuLmpzJztcblxuLyoqXG4gKiBUaGUgY2hhcHRlciB0cmFjayBtZW51IGl0ZW1cbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBNZW51SXRlbVxuICogQGNsYXNzIENoYXB0ZXJzVHJhY2tNZW51SXRlbVxuICovXG5jbGFzcyBDaGFwdGVyc1RyYWNrTWVudUl0ZW0gZXh0ZW5kcyBNZW51SXRlbSB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICBsZXQgdHJhY2sgPSBvcHRpb25zWyd0cmFjayddO1xuICAgIGxldCBjdWUgPSBvcHRpb25zWydjdWUnXTtcbiAgICBsZXQgY3VycmVudFRpbWUgPSBwbGF5ZXIuY3VycmVudFRpbWUoKTtcblxuICAgIC8vIE1vZGlmeSBvcHRpb25zIGZvciBwYXJlbnQgTWVudUl0ZW0gY2xhc3MncyBpbml0LlxuICAgIG9wdGlvbnNbJ2xhYmVsJ10gPSBjdWUudGV4dDtcbiAgICBvcHRpb25zWydzZWxlY3RlZCddID0gKGN1ZVsnc3RhcnRUaW1lJ10gPD0gY3VycmVudFRpbWUgJiYgY3VycmVudFRpbWUgPCBjdWVbJ2VuZFRpbWUnXSk7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMudHJhY2sgPSB0cmFjaztcbiAgICB0aGlzLmN1ZSA9IGN1ZTtcbiAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdjdWVjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXMudXBkYXRlKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNsaWNrIG9uIG1lbnUgaXRlbVxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZUNsaWNrXG4gICAqL1xuICBoYW5kbGVDbGljaygpIHtcbiAgICBzdXBlci5oYW5kbGVDbGljaygpO1xuICAgIHRoaXMucGxheWVyXy5jdXJyZW50VGltZSh0aGlzLmN1ZS5zdGFydFRpbWUpO1xuICAgIHRoaXMudXBkYXRlKHRoaXMuY3VlLnN0YXJ0VGltZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNoYXB0ZXIgbWVudSBpdGVtXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgbGV0IGN1ZSA9IHRoaXMuY3VlO1xuICAgIGxldCBjdXJyZW50VGltZSA9IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpO1xuXG4gICAgLy8gdmpzLmxvZyhjdXJyZW50VGltZSwgY3VlLnN0YXJ0VGltZSk7XG4gICAgdGhpcy5zZWxlY3RlZChjdWVbJ3N0YXJ0VGltZSddIDw9IGN1cnJlbnRUaW1lICYmIGN1cnJlbnRUaW1lIDwgY3VlWydlbmRUaW1lJ10pO1xuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdDaGFwdGVyc1RyYWNrTWVudUl0ZW0nLCBDaGFwdGVyc1RyYWNrTWVudUl0ZW0pO1xuZXhwb3J0IGRlZmF1bHQgQ2hhcHRlcnNUcmFja01lbnVJdGVtO1xuIl19
},{"../../component.js":66,"../../menu/menu-item.js":110,"../../utils/fn.js":146}],88:[function(_dereq_,module,exports){
/**
* @file descriptions-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* The button component for toggling and selecting descriptions
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class DescriptionsButton
*/
var DescriptionsButton = (function (_TextTrackButton) {
_inherits(DescriptionsButton, _TextTrackButton);
function DescriptionsButton(player, options, ready) {
var _this = this;
_classCallCheck(this, DescriptionsButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Descriptions Menu');
var tracks = player.textTracks();
if (tracks) {
(function () {
var changeHandler = Fn.bind(_this, _this.handleTracksChange);
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function () {
tracks.removeEventListener('change', changeHandler);
});
})();
}
}
/**
* Handle text track change
*
* @method handleTracksChange
*/
DescriptionsButton.prototype.handleTracksChange = function handleTracksChange(event) {
var tracks = this.player().textTracks();
var disabled = false;
// Check whether a track of a different kind is showing
for (var i = 0, l = tracks.length; i < l; i++) {
var track = tracks[i];
if (track['kind'] !== this.kind_ && track['mode'] === 'showing') {
disabled = true;
break;
}
}
// If another track is showing, disable this menu button
if (disabled) {
this.disable();
} else {
this.enable();
}
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
DescriptionsButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-descriptions-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
return DescriptionsButton;
})(_textTrackButtonJs2['default']);
DescriptionsButton.prototype.kind_ = 'descriptions';
DescriptionsButton.prototype.controlText_ = 'Descriptions';
_componentJs2['default'].registerComponent('DescriptionsButton', DescriptionsButton);
exports['default'] = DescriptionsButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2Rlc2NyaXB0aW9ucy1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O2lDQUc0Qix3QkFBd0I7Ozs7MkJBQzlCLG9CQUFvQjs7Ozt5QkFDdEIsbUJBQW1COztJQUEzQixFQUFFOzs7Ozs7Ozs7Ozs7SUFXUixrQkFBa0I7WUFBbEIsa0JBQWtCOztBQUVYLFdBRlAsa0JBQWtCLENBRVYsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUM7OzswQkFGL0Isa0JBQWtCOztBQUdwQixnQ0FBTSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDOztBQUV6RCxRQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7O0FBRWpDLFFBQUksTUFBTSxFQUFFOztBQUNWLFlBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLFFBQU8sTUFBSyxrQkFBa0IsQ0FBQyxDQUFDOztBQUUzRCxjQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ2pELGNBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFXO0FBQzVCLGdCQUFNLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ3JELENBQUMsQ0FBQzs7S0FDSjtHQUNGOzs7Ozs7OztBQWhCRyxvQkFBa0IsV0F1QnRCLGtCQUFrQixHQUFBLDRCQUFDLEtBQUssRUFBQztBQUN2QixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEMsUUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDOzs7QUFHckIsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QyxVQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEIsVUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxFQUFFO0FBQy9ELGdCQUFRLEdBQUcsSUFBSSxDQUFDO0FBQ2hCLGNBQU07T0FDUDtLQUNGOzs7QUFHRCxRQUFJLFFBQVEsRUFBRTtBQUNaLFVBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNoQixNQUFNO0FBQ0wsVUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ2Y7R0FDRjs7Ozs7Ozs7O0FBMUNHLG9CQUFrQixXQWtEdEIsYUFBYSxHQUFBLHlCQUFHO0FBQ2Qsd0NBQWtDLDJCQUFNLGFBQWEsS0FBQSxNQUFFLENBQUc7R0FDM0Q7O1NBcERHLGtCQUFrQjs7O0FBd0R4QixrQkFBa0IsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLGNBQWMsQ0FBQztBQUNwRCxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGNBQWMsQ0FBQzs7QUFFM0QseUJBQVUsaUJBQWlCLENBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztxQkFDdkQsa0JBQWtCIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL2Rlc2NyaXB0aW9ucy1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGRlc2NyaXB0aW9ucy1idXR0b24uanNcbiAqL1xuaW1wb3J0IFRleHRUcmFja0J1dHRvbiBmcm9tICcuL3RleHQtdHJhY2stYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uLy4uL3V0aWxzL2ZuLmpzJztcblxuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBkZXNjcmlwdGlvbnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGxheWVyICBQbGF5ZXIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBleHRlbmRzIFRleHRUcmFja0J1dHRvblxuICogQGNsYXNzIERlc2NyaXB0aW9uc0J1dHRvblxuICovXG5jbGFzcyBEZXNjcmlwdGlvbnNCdXR0b24gZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucywgcmVhZHkpe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucywgcmVhZHkpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICdEZXNjcmlwdGlvbnMgTWVudScpO1xuXG4gICAgbGV0IHRyYWNrcyA9IHBsYXllci50ZXh0VHJhY2tzKCk7XG5cbiAgICBpZiAodHJhY2tzKSB7XG4gICAgICBsZXQgY2hhbmdlSGFuZGxlciA9IEZuLmJpbmQodGhpcywgdGhpcy5oYW5kbGVUcmFja3NDaGFuZ2UpO1xuXG4gICAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgY2hhbmdlSGFuZGxlcik7XG4gICAgICB0aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGV4dCB0cmFjayBjaGFuZ2VcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVUcmFja3NDaGFuZ2VcbiAgICovXG4gIGhhbmRsZVRyYWNrc0NoYW5nZShldmVudCl7XG4gICAgbGV0IHRyYWNrcyA9IHRoaXMucGxheWVyKCkudGV4dFRyYWNrcygpO1xuICAgIGxldCBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLy8gQ2hlY2sgd2hldGhlciBhIHRyYWNrIG9mIGEgZGlmZmVyZW50IGtpbmQgaXMgc2hvd2luZ1xuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdHJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuICAgICAgaWYgKHRyYWNrWydraW5kJ10gIT09IHRoaXMua2luZF8gJiYgdHJhY2tbJ21vZGUnXSA9PT0gJ3Nob3dpbmcnKSB7XG4gICAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgYW5vdGhlciB0cmFjayBpcyBzaG93aW5nLCBkaXNhYmxlIHRoaXMgbWVudSBidXR0b25cbiAgICBpZiAoZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVuYWJsZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGB2anMtZGVzY3JpcHRpb25zLWJ1dHRvbiAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbn1cblxuRGVzY3JpcHRpb25zQnV0dG9uLnByb3RvdHlwZS5raW5kXyA9ICdkZXNjcmlwdGlvbnMnO1xuRGVzY3JpcHRpb25zQnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnRGVzY3JpcHRpb25zJztcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdEZXNjcmlwdGlvbnNCdXR0b24nLCBEZXNjcmlwdGlvbnNCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgRGVzY3JpcHRpb25zQnV0dG9uO1xuIl19
},{"../../component.js":66,"../../utils/fn.js":146,"./text-track-button.js":91}],89:[function(_dereq_,module,exports){
/**
* @file off-text-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* A special menu item for turning of a specific type of text track
*
* @param {Player|Object} player
* @param {Object=} options
* @extends TextTrackMenuItem
* @class OffTextTrackMenuItem
*/
var OffTextTrackMenuItem = (function (_TextTrackMenuItem) {
_inherits(OffTextTrackMenuItem, _TextTrackMenuItem);
function OffTextTrackMenuItem(player, options) {
_classCallCheck(this, OffTextTrackMenuItem);
// Create pseudo track info
// Requires options['kind']
options['track'] = {
'kind': options['kind'],
'player': player,
'label': options['kind'] + ' off',
'default': false,
'mode': 'disabled'
};
// MenuItem is selectable
options['selectable'] = true;
_TextTrackMenuItem.call(this, player, options);
this.selected(true);
}
/**
* Handle text track change
*
* @param {Object} event Event object
* @method handleTracksChange
*/
OffTextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
var tracks = this.player().textTracks();
var selected = true;
for (var i = 0, l = tracks.length; i < l; i++) {
var track = tracks[i];
if (track['kind'] === this.track['kind'] && track['mode'] === 'showing') {
selected = false;
break;
}
}
this.selected(selected);
};
return OffTextTrackMenuItem;
})(_textTrackMenuItemJs2['default']);
_componentJs2['default'].registerComponent('OffTextTrackMenuItem', OffTextTrackMenuItem);
exports['default'] = OffTextTrackMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL29mZi10ZXh0LXRyYWNrLW1lbnUtaXRlbS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O21DQUc4QiwyQkFBMkI7Ozs7MkJBQ25DLG9CQUFvQjs7Ozs7Ozs7Ozs7OztJQVVwQyxvQkFBb0I7WUFBcEIsb0JBQW9COztBQUViLFdBRlAsb0JBQW9CLENBRVosTUFBTSxFQUFFLE9BQU8sRUFBQzswQkFGeEIsb0JBQW9COzs7O0FBS3RCLFdBQU8sQ0FBQyxPQUFPLENBQUMsR0FBRztBQUNqQixZQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN2QixjQUFRLEVBQUUsTUFBTTtBQUNoQixhQUFPLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU07QUFDakMsZUFBUyxFQUFFLEtBQUs7QUFDaEIsWUFBTSxFQUFFLFVBQVU7S0FDbkIsQ0FBQzs7O0FBR0YsV0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQzs7QUFFN0Isa0NBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDckI7Ozs7Ozs7OztBQWxCRyxzQkFBb0IsV0EwQnhCLGtCQUFrQixHQUFBLDRCQUFDLEtBQUssRUFBQztBQUN2QixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDeEMsUUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDOztBQUVwQixTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzdDLFVBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN0QixVQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxTQUFTLEVBQUU7QUFDdkUsZ0JBQVEsR0FBRyxLQUFLLENBQUM7QUFDakIsY0FBTTtPQUNQO0tBQ0Y7O0FBRUQsUUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztHQUN6Qjs7U0F2Q0csb0JBQW9COzs7QUEyQzFCLHlCQUFVLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLG9CQUFvQixDQUFDLENBQUM7cUJBQzNELG9CQUFvQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdGV4dC10cmFjay1jb250cm9scy9vZmYtdGV4dC10cmFjay1tZW51LWl0ZW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIG9mZi10ZXh0LXRyYWNrLW1lbnUtaXRlbS5qc1xuICovXG5pbXBvcnQgVGV4dFRyYWNrTWVudUl0ZW0gZnJvbSAnLi90ZXh0LXRyYWNrLW1lbnUtaXRlbS5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5cbi8qKlxuICogQSBzcGVjaWFsIG1lbnUgaXRlbSBmb3IgdHVybmluZyBvZiBhIHNwZWNpZmljIHR5cGUgb2YgdGV4dCB0cmFja1xuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIFRleHRUcmFja01lbnVJdGVtXG4gKiBAY2xhc3MgT2ZmVGV4dFRyYWNrTWVudUl0ZW1cbiAqL1xuY2xhc3MgT2ZmVGV4dFRyYWNrTWVudUl0ZW0gZXh0ZW5kcyBUZXh0VHJhY2tNZW51SXRlbSB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICAvLyBDcmVhdGUgcHNldWRvIHRyYWNrIGluZm9cbiAgICAvLyBSZXF1aXJlcyBvcHRpb25zWydraW5kJ11cbiAgICBvcHRpb25zWyd0cmFjayddID0ge1xuICAgICAgJ2tpbmQnOiBvcHRpb25zWydraW5kJ10sXG4gICAgICAncGxheWVyJzogcGxheWVyLFxuICAgICAgJ2xhYmVsJzogb3B0aW9uc1sna2luZCddICsgJyBvZmYnLFxuICAgICAgJ2RlZmF1bHQnOiBmYWxzZSxcbiAgICAgICdtb2RlJzogJ2Rpc2FibGVkJ1xuICAgIH07XG5cbiAgICAvLyBNZW51SXRlbSBpcyBzZWxlY3RhYmxlXG4gICAgb3B0aW9uc1snc2VsZWN0YWJsZSddID0gdHJ1ZTtcblxuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG4gICAgdGhpcy5zZWxlY3RlZCh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdGV4dCB0cmFjayBjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgKiBAbWV0aG9kIGhhbmRsZVRyYWNrc0NoYW5nZVxuICAgKi9cbiAgaGFuZGxlVHJhY2tzQ2hhbmdlKGV2ZW50KXtcbiAgICBsZXQgdHJhY2tzID0gdGhpcy5wbGF5ZXIoKS50ZXh0VHJhY2tzKCk7XG4gICAgbGV0IHNlbGVjdGVkID0gdHJ1ZTtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdHJhY2tzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuICAgICAgaWYgKHRyYWNrWydraW5kJ10gPT09IHRoaXMudHJhY2tbJ2tpbmQnXSAmJiB0cmFja1snbW9kZSddID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5zZWxlY3RlZChzZWxlY3RlZCk7XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ09mZlRleHRUcmFja01lbnVJdGVtJywgT2ZmVGV4dFRyYWNrTWVudUl0ZW0pO1xuZXhwb3J0IGRlZmF1bHQgT2ZmVGV4dFRyYWNrTWVudUl0ZW07XG4iXX0=
},{"../../component.js":66,"./text-track-menu-item.js":92}],90:[function(_dereq_,module,exports){
/**
* @file subtitles-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackButtonJs = _dereq_('./text-track-button.js');
var _textTrackButtonJs2 = _interopRequireDefault(_textTrackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The button component for toggling and selecting subtitles
*
* @param {Object} player Player object
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends TextTrackButton
* @class SubtitlesButton
*/
var SubtitlesButton = (function (_TextTrackButton) {
_inherits(SubtitlesButton, _TextTrackButton);
function SubtitlesButton(player, options, ready) {
_classCallCheck(this, SubtitlesButton);
_TextTrackButton.call(this, player, options, ready);
this.el_.setAttribute('aria-label', 'Subtitles Menu');
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
SubtitlesButton.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-subtitles-button ' + _TextTrackButton.prototype.buildCSSClass.call(this);
};
return SubtitlesButton;
})(_textTrackButtonJs2['default']);
SubtitlesButton.prototype.kind_ = 'subtitles';
SubtitlesButton.prototype.controlText_ = 'Subtitles';
_componentJs2['default'].registerComponent('SubtitlesButton', SubtitlesButton);
exports['default'] = SubtitlesButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL3N1YnRpdGxlcy1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztpQ0FHNEIsd0JBQXdCOzs7OzJCQUM5QixvQkFBb0I7Ozs7Ozs7Ozs7Ozs7O0lBV3BDLGVBQWU7WUFBZixlQUFlOztBQUVSLFdBRlAsZUFBZSxDQUVQLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDOzBCQUYvQixlQUFlOztBQUdqQixnQ0FBTSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlCLFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO0dBQ3REOzs7Ozs7Ozs7QUFMRyxpQkFBZSxXQWFuQixhQUFhLEdBQUEseUJBQUc7QUFDZCxxQ0FBK0IsMkJBQU0sYUFBYSxLQUFBLE1BQUUsQ0FBRztHQUN4RDs7U0FmRyxlQUFlOzs7QUFtQnJCLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFdBQVcsQ0FBQztBQUM5QyxlQUFlLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUM7O0FBRXJELHlCQUFVLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO3FCQUNqRCxlQUFlIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL3N1YnRpdGxlcy1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHN1YnRpdGxlcy1idXR0b24uanNcbiAqL1xuaW1wb3J0IFRleHRUcmFja0J1dHRvbiBmcm9tICcuL3RleHQtdHJhY2stYnV0dG9uLmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcblxuLyoqXG4gKiBUaGUgYnV0dG9uIGNvbXBvbmVudCBmb3IgdG9nZ2xpbmcgYW5kIHNlbGVjdGluZyBzdWJ0aXRsZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGxheWVyICBQbGF5ZXIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBleHRlbmRzIFRleHRUcmFja0J1dHRvblxuICogQGNsYXNzIFN1YnRpdGxlc0J1dHRvblxuICovXG5jbGFzcyBTdWJ0aXRsZXNCdXR0b24gZXh0ZW5kcyBUZXh0VHJhY2tCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucywgcmVhZHkpe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucywgcmVhZHkpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsJ1N1YnRpdGxlcyBNZW51Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNvbnN0cnVjdGVkIGNsYXNzIG5hbWVcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHJldHVybiBgdmpzLXN1YnRpdGxlcy1idXR0b24gJHtzdXBlci5idWlsZENTU0NsYXNzKCl9YDtcbiAgfVxuXG59XG5cblN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUua2luZF8gPSAnc3VidGl0bGVzJztcblN1YnRpdGxlc0J1dHRvbi5wcm90b3R5cGUuY29udHJvbFRleHRfID0gJ1N1YnRpdGxlcyc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnU3VidGl0bGVzQnV0dG9uJywgU3VidGl0bGVzQnV0dG9uKTtcbmV4cG9ydCBkZWZhdWx0IFN1YnRpdGxlc0J1dHRvbjtcbiJdfQ==
},{"../../component.js":66,"./text-track-button.js":91}],91:[function(_dereq_,module,exports){
/**
* @file text-track-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackButtonJs = _dereq_('../track-button.js');
var _trackButtonJs2 = _interopRequireDefault(_trackButtonJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _textTrackMenuItemJs = _dereq_('./text-track-menu-item.js');
var _textTrackMenuItemJs2 = _interopRequireDefault(_textTrackMenuItemJs);
var _offTextTrackMenuItemJs = _dereq_('./off-text-track-menu-item.js');
var _offTextTrackMenuItemJs2 = _interopRequireDefault(_offTextTrackMenuItemJs);
/**
* The base class for buttons that toggle specific text track types (e.g. subtitles)
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class TextTrackButton
*/
var TextTrackButton = (function (_TrackButton) {
_inherits(TextTrackButton, _TrackButton);
function TextTrackButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, TextTrackButton);
options.tracks = player.textTracks();
_TrackButton.call(this, player, options);
}
/**
* Create a menu item for each text track
*
* @return {Array} Array of menu items
* @method createItems
*/
TextTrackButton.prototype.createItems = function createItems() {
var items = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
// Add an OFF menu item to turn all tracks off
items.push(new _offTextTrackMenuItemJs2['default'](this.player_, { 'kind': this.kind_ }));
var tracks = this.player_.textTracks();
if (!tracks) {
return items;
}
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
// only add tracks that are of the appropriate kind and have a label
if (track['kind'] === this.kind_) {
items.push(new _textTrackMenuItemJs2['default'](this.player_, {
// MenuItem is selectable
'selectable': true,
'track': track
}));
}
}
return items;
};
return TextTrackButton;
})(_trackButtonJs2['default']);
_componentJs2['default'].registerComponent('TextTrackButton', TextTrackButton);
exports['default'] = TextTrackButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL3RleHQtdHJhY2stYnV0dG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs2QkFHd0Isb0JBQW9COzs7OzJCQUN0QixvQkFBb0I7Ozs7eUJBQ3RCLG1CQUFtQjs7SUFBM0IsRUFBRTs7bUNBQ2dCLDJCQUEyQjs7OztzQ0FDeEIsK0JBQStCOzs7Ozs7Ozs7Ozs7O0lBVTFELGVBQWU7WUFBZixlQUFlOztBQUVSLFdBRlAsZUFBZSxDQUVQLE1BQU0sRUFBZTtRQUFiLE9BQU8seURBQUcsRUFBRTs7MEJBRjVCLGVBQWU7O0FBR2pCLFdBQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDOztBQUVyQyw0QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7R0FDeEI7Ozs7Ozs7OztBQU5HLGlCQUFlLFdBY25CLFdBQVcsR0FBQSx1QkFBVztRQUFWLEtBQUsseURBQUMsRUFBRTs7O0FBRWxCLFNBQUssQ0FBQyxJQUFJLENBQUMsd0NBQXlCLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQzs7QUFFM0UsUUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7QUFFdkMsUUFBSSxDQUFDLE1BQU0sRUFBRTtBQUNYLGFBQU8sS0FBSyxDQUFDO0tBQ2Q7O0FBRUQsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsVUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHdEIsVUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtBQUNoQyxhQUFLLENBQUMsSUFBSSxDQUFDLHFDQUFzQixJQUFJLENBQUMsT0FBTyxFQUFFOztBQUU3QyxzQkFBWSxFQUFFLElBQUk7QUFDbEIsaUJBQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQyxDQUFDLENBQUM7T0FDTDtLQUNGOztBQUVELFdBQU8sS0FBSyxDQUFDO0dBQ2Q7O1NBdENHLGVBQWU7OztBQTBDckIseUJBQVUsaUJBQWlCLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7cUJBQ2pELGVBQWUiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3RleHQtdHJhY2stY29udHJvbHMvdGV4dC10cmFjay1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRleHQtdHJhY2stYnV0dG9uLmpzXG4gKi9cbmltcG9ydCBUcmFja0J1dHRvbiBmcm9tICcuLi90cmFjay1idXR0b24uanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IFRleHRUcmFja01lbnVJdGVtIGZyb20gJy4vdGV4dC10cmFjay1tZW51LWl0ZW0uanMnO1xuaW1wb3J0IE9mZlRleHRUcmFja01lbnVJdGVtIGZyb20gJy4vb2ZmLXRleHQtdHJhY2stbWVudS1pdGVtLmpzJztcblxuLyoqXG4gKiBUaGUgYmFzZSBjbGFzcyBmb3IgYnV0dG9ucyB0aGF0IHRvZ2dsZSBzcGVjaWZpYyB0ZXh0IHRyYWNrIHR5cGVzIChlLmcuIHN1YnRpdGxlcylcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBNZW51QnV0dG9uXG4gKiBAY2xhc3MgVGV4dFRyYWNrQnV0dG9uXG4gKi9cbmNsYXNzIFRleHRUcmFja0J1dHRvbiBleHRlbmRzIFRyYWNrQnV0dG9uIHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMgPSB7fSl7XG4gICAgb3B0aW9ucy50cmFja3MgPSBwbGF5ZXIudGV4dFRyYWNrcygpO1xuXG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBtZW51IGl0ZW0gZm9yIGVhY2ggdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgbWVudSBpdGVtc1xuICAgKiBAbWV0aG9kIGNyZWF0ZUl0ZW1zXG4gICAqL1xuICBjcmVhdGVJdGVtcyhpdGVtcz1bXSkge1xuICAgIC8vIEFkZCBhbiBPRkYgbWVudSBpdGVtIHRvIHR1cm4gYWxsIHRyYWNrcyBvZmZcbiAgICBpdGVtcy5wdXNoKG5ldyBPZmZUZXh0VHJhY2tNZW51SXRlbSh0aGlzLnBsYXllcl8sIHsgJ2tpbmQnOiB0aGlzLmtpbmRfIH0pKTtcblxuICAgIGxldCB0cmFja3MgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCF0cmFja3MpIHtcbiAgICAgIHJldHVybiBpdGVtcztcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICAvLyBvbmx5IGFkZCB0cmFja3MgdGhhdCBhcmUgb2YgdGhlIGFwcHJvcHJpYXRlIGtpbmQgYW5kIGhhdmUgYSBsYWJlbFxuICAgICAgaWYgKHRyYWNrWydraW5kJ10gPT09IHRoaXMua2luZF8pIHtcbiAgICAgICAgaXRlbXMucHVzaChuZXcgVGV4dFRyYWNrTWVudUl0ZW0odGhpcy5wbGF5ZXJfLCB7XG4gICAgICAgICAgLy8gTWVudUl0ZW0gaXMgc2VsZWN0YWJsZVxuICAgICAgICAgICdzZWxlY3RhYmxlJzogdHJ1ZSxcbiAgICAgICAgICAndHJhY2snOiB0cmFja1xuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGl0ZW1zO1xuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZXh0VHJhY2tCdXR0b24nLCBUZXh0VHJhY2tCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgVGV4dFRyYWNrQnV0dG9uO1xuIl19
},{"../../component.js":66,"../../utils/fn.js":146,"../track-button.js":97,"./off-text-track-menu-item.js":89,"./text-track-menu-item.js":92}],92:[function(_dereq_,module,exports){
/**
* @file text-track-menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuItemJs = _dereq_('../../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* The specific menu item type for selecting a language within a text track kind
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuItem
* @class TextTrackMenuItem
*/
var TextTrackMenuItem = (function (_MenuItem) {
_inherits(TextTrackMenuItem, _MenuItem);
function TextTrackMenuItem(player, options) {
var _this = this;
_classCallCheck(this, TextTrackMenuItem);
var track = options['track'];
var tracks = player.textTracks();
// Modify options for parent MenuItem class's init.
options['label'] = track['label'] || track['language'] || 'Unknown';
options['selected'] = track['default'] || track['mode'] === 'showing';
_MenuItem.call(this, player, options);
this.track = track;
if (tracks) {
(function () {
var changeHandler = Fn.bind(_this, _this.handleTracksChange);
tracks.addEventListener('change', changeHandler);
_this.on('dispose', function () {
tracks.removeEventListener('change', changeHandler);
});
})();
}
// iOS7 doesn't dispatch change events to TextTrackLists when an
// associated track's mode changes. Without something like
// Object.observe() (also not present on iOS7), it's not
// possible to detect changes to the mode attribute and polyfill
// the change event. As a poor substitute, we manually dispatch
// change events whenever the controls modify the mode.
if (tracks && tracks.onchange === undefined) {
(function () {
var event = undefined;
_this.on(['tap', 'click'], function () {
if (typeof _globalWindow2['default'].Event !== 'object') {
// Android 2.3 throws an Illegal Constructor error for window.Event
try {
event = new _globalWindow2['default'].Event('change');
} catch (err) {}
}
if (!event) {
event = _globalDocument2['default'].createEvent('Event');
event.initEvent('change', true, true);
}
tracks.dispatchEvent(event);
});
})();
}
}
/**
* Handle click on text track
*
* @method handleClick
*/
TextTrackMenuItem.prototype.handleClick = function handleClick(event) {
var kind = this.track['kind'];
var tracks = this.player_.textTracks();
_MenuItem.prototype.handleClick.call(this, event);
if (!tracks) return;
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
if (track['kind'] !== kind) {
continue;
}
if (track === this.track) {
track['mode'] = 'showing';
} else {
track['mode'] = 'disabled';
}
}
};
/**
* Handle text track change
*
* @method handleTracksChange
*/
TextTrackMenuItem.prototype.handleTracksChange = function handleTracksChange(event) {
this.selected(this.track['mode'] === 'showing');
};
return TextTrackMenuItem;
})(_menuMenuItemJs2['default']);
_componentJs2['default'].registerComponent('TextTrackMenuItem', TextTrackMenuItem);
exports['default'] = TextTrackMenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90ZXh0LXRyYWNrLWNvbnRyb2xzL3RleHQtdHJhY2stbWVudS1pdGVtLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs4QkFHcUIseUJBQXlCOzs7OzJCQUN4QixvQkFBb0I7Ozs7eUJBQ3RCLG1CQUFtQjs7SUFBM0IsRUFBRTs7NEJBQ0ssZUFBZTs7Ozs4QkFDYixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7SUFVaEMsaUJBQWlCO1lBQWpCLGlCQUFpQjs7QUFFVixXQUZQLGlCQUFpQixDQUVULE1BQU0sRUFBRSxPQUFPLEVBQUM7OzswQkFGeEIsaUJBQWlCOztBQUduQixRQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDN0IsUUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDOzs7QUFHakMsV0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksU0FBUyxDQUFDO0FBQ3BFLFdBQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFNBQVMsQ0FBQzs7QUFFdEUseUJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQzs7QUFFbkIsUUFBSSxNQUFNLEVBQUU7O0FBQ1YsWUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDLElBQUksUUFBTyxNQUFLLGtCQUFrQixDQUFDLENBQUM7O0FBRTNELGNBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDakQsY0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFlBQVc7QUFDNUIsZ0JBQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7U0FDckQsQ0FBQyxDQUFDOztLQUNKOzs7Ozs7OztBQVFELFFBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFOztBQUMzQyxZQUFJLEtBQUssWUFBQSxDQUFDOztBQUVWLGNBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxFQUFFLFlBQVc7QUFDbkMsY0FBSSxPQUFPLDBCQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7O0FBRXBDLGdCQUFJO0FBQ0YsbUJBQUssR0FBRyxJQUFJLDBCQUFPLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNwQyxDQUFDLE9BQU0sR0FBRyxFQUFDLEVBQUU7V0FDZjs7QUFFRCxjQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1YsaUJBQUssR0FBRyw0QkFBUyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEMsaUJBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztXQUN2Qzs7QUFFRCxnQkFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM3QixDQUFDLENBQUM7O0tBQ0o7R0FDRjs7Ozs7Ozs7QUFoREcsbUJBQWlCLFdBdURyQixXQUFXLEdBQUEscUJBQUMsS0FBSyxFQUFFO0FBQ2pCLFFBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDOUIsUUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQzs7QUFFdkMsd0JBQU0sV0FBVyxLQUFBLE9BQUMsS0FBSyxDQUFDLENBQUM7O0FBRXpCLFFBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTzs7QUFFcEIsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsVUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV0QixVQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDMUIsaUJBQVM7T0FDVjs7QUFFRCxVQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxFQUFFO0FBQ3hCLGFBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUM7T0FDM0IsTUFBTTtBQUNMLGFBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUM7T0FDNUI7S0FDRjtHQUNGOzs7Ozs7OztBQTVFRyxtQkFBaUIsV0FtRnJCLGtCQUFrQixHQUFBLDRCQUFDLEtBQUssRUFBQztBQUN2QixRQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUM7R0FDakQ7O1NBckZHLGlCQUFpQjs7O0FBeUZ2Qix5QkFBVSxpQkFBaUIsQ0FBQyxtQkFBbUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO3FCQUNyRCxpQkFBaUIiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3RleHQtdHJhY2stY29udHJvbHMvdGV4dC10cmFjay1tZW51LWl0ZW0uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRleHQtdHJhY2stbWVudS1pdGVtLmpzXG4gKi9cbmltcG9ydCBNZW51SXRlbSBmcm9tICcuLi8uLi9tZW51L21lbnUtaXRlbS5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi8uLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogVGhlIHNwZWNpZmljIG1lbnUgaXRlbSB0eXBlIGZvciBzZWxlY3RpbmcgYSBsYW5ndWFnZSB3aXRoaW4gYSB0ZXh0IHRyYWNrIGtpbmRcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBNZW51SXRlbVxuICogQGNsYXNzIFRleHRUcmFja01lbnVJdGVtXG4gKi9cbmNsYXNzIFRleHRUcmFja01lbnVJdGVtIGV4dGVuZHMgTWVudUl0ZW0ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgbGV0IHRyYWNrID0gb3B0aW9uc1sndHJhY2snXTtcbiAgICBsZXQgdHJhY2tzID0gcGxheWVyLnRleHRUcmFja3MoKTtcblxuICAgIC8vIE1vZGlmeSBvcHRpb25zIGZvciBwYXJlbnQgTWVudUl0ZW0gY2xhc3MncyBpbml0LlxuICAgIG9wdGlvbnNbJ2xhYmVsJ10gPSB0cmFja1snbGFiZWwnXSB8fCB0cmFja1snbGFuZ3VhZ2UnXSB8fCAnVW5rbm93bic7XG4gICAgb3B0aW9uc1snc2VsZWN0ZWQnXSA9IHRyYWNrWydkZWZhdWx0J10gfHwgdHJhY2tbJ21vZGUnXSA9PT0gJ3Nob3dpbmcnO1xuXG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMudHJhY2sgPSB0cmFjaztcblxuICAgIGlmICh0cmFja3MpIHtcbiAgICAgIGxldCBjaGFuZ2VIYW5kbGVyID0gRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZVRyYWNrc0NoYW5nZSk7XG5cbiAgICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBjaGFuZ2VIYW5kbGVyKTtcbiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGNoYW5nZUhhbmRsZXIpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaU9TNyBkb2Vzbid0IGRpc3BhdGNoIGNoYW5nZSBldmVudHMgdG8gVGV4dFRyYWNrTGlzdHMgd2hlbiBhblxuICAgIC8vIGFzc29jaWF0ZWQgdHJhY2sncyBtb2RlIGNoYW5nZXMuIFdpdGhvdXQgc29tZXRoaW5nIGxpa2VcbiAgICAvLyBPYmplY3Qub2JzZXJ2ZSgpIChhbHNvIG5vdCBwcmVzZW50IG9uIGlPUzcpLCBpdCdzIG5vdFxuICAgIC8vIHBvc3NpYmxlIHRvIGRldGVjdCBjaGFuZ2VzIHRvIHRoZSBtb2RlIGF0dHJpYnV0ZSBhbmQgcG9seWZpbGxcbiAgICAvLyB0aGUgY2hhbmdlIGV2ZW50LiBBcyBhIHBvb3Igc3Vic3RpdHV0ZSwgd2UgbWFudWFsbHkgZGlzcGF0Y2hcbiAgICAvLyBjaGFuZ2UgZXZlbnRzIHdoZW5ldmVyIHRoZSBjb250cm9scyBtb2RpZnkgdGhlIG1vZGUuXG4gICAgaWYgKHRyYWNrcyAmJiB0cmFja3Mub25jaGFuZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgbGV0IGV2ZW50O1xuXG4gICAgICB0aGlzLm9uKFsndGFwJywgJ2NsaWNrJ10sIGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5FdmVudCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAvLyBBbmRyb2lkIDIuMyB0aHJvd3MgYW4gSWxsZWdhbCBDb25zdHJ1Y3RvciBlcnJvciBmb3Igd2luZG93LkV2ZW50XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGV2ZW50ID0gbmV3IHdpbmRvdy5FdmVudCgnY2hhbmdlJyk7XG4gICAgICAgICAgfSBjYXRjaChlcnIpe31cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXZlbnQpIHtcbiAgICAgICAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgICAgICAgIGV2ZW50LmluaXRFdmVudCgnY2hhbmdlJywgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0cmFja3MuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGNsaWNrIG9uIHRleHQgdHJhY2tcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICBsZXQga2luZCA9IHRoaXMudHJhY2tbJ2tpbmQnXTtcbiAgICBsZXQgdHJhY2tzID0gdGhpcy5wbGF5ZXJfLnRleHRUcmFja3MoKTtcblxuICAgIHN1cGVyLmhhbmRsZUNsaWNrKGV2ZW50KTtcblxuICAgIGlmICghdHJhY2tzKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICBpZiAodHJhY2tbJ2tpbmQnXSAhPT0ga2luZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRyYWNrID09PSB0aGlzLnRyYWNrKSB7XG4gICAgICAgIHRyYWNrWydtb2RlJ10gPSAnc2hvd2luZyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmFja1snbW9kZSddID0gJ2Rpc2FibGVkJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRleHQgdHJhY2sgY2hhbmdlXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlVHJhY2tzQ2hhbmdlXG4gICAqL1xuICBoYW5kbGVUcmFja3NDaGFuZ2UoZXZlbnQpe1xuICAgIHRoaXMuc2VsZWN0ZWQodGhpcy50cmFja1snbW9kZSddID09PSAnc2hvd2luZycpO1xuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZXh0VHJhY2tNZW51SXRlbScsIFRleHRUcmFja01lbnVJdGVtKTtcbmV4cG9ydCBkZWZhdWx0IFRleHRUcmFja01lbnVJdGVtO1xuIl19
},{"../../component.js":66,"../../menu/menu-item.js":110,"../../utils/fn.js":146,"global/document":7,"global/window":8}],93:[function(_dereq_,module,exports){
/**
* @file current-time-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the current time
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class CurrentTimeDisplay
*/
var CurrentTimeDisplay = (function (_Component) {
_inherits(CurrentTimeDisplay, _Component);
function CurrentTimeDisplay(player, options) {
_classCallCheck(this, CurrentTimeDisplay);
_Component.call(this, player, options);
this.on(player, 'timeupdate', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
CurrentTimeDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-current-time vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-current-time-display',
// label the current time for screen reader users
innerHTML: 'Current Time ' + '0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update current time display
*
* @method updateContent
*/
CurrentTimeDisplay.prototype.updateContent = function updateContent() {
// Allows for smooth scrubbing, when player can't keep up.
var time = this.player_.scrubbing() ? this.player_.getCache().currentTime : this.player_.currentTime();
var localizedText = this.localize('Current Time');
var formattedTime = _utilsFormatTimeJs2['default'](time, this.player_.duration());
if (formattedTime !== this.formattedTime_) {
this.formattedTime_ = formattedTime;
this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime;
}
};
return CurrentTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('CurrentTimeDisplay', CurrentTimeDisplay);
exports['default'] = CurrentTimeDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90aW1lLWNvbnRyb2xzL2N1cnJlbnQtdGltZS1kaXNwbGF5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7OzBCQUNyQixvQkFBb0I7O0lBQTdCLEdBQUc7O2lDQUNRLDRCQUE0Qjs7Ozs7Ozs7Ozs7OztJQVU3QyxrQkFBa0I7WUFBbEIsa0JBQWtCOztBQUVYLFdBRlAsa0JBQWtCLENBRVYsTUFBTSxFQUFFLE9BQU8sRUFBQzswQkFGeEIsa0JBQWtCOztBQUdwQiwwQkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7R0FDbkQ7Ozs7Ozs7OztBQU5HLG9CQUFrQixXQWN0QixRQUFRLEdBQUEsb0JBQUc7QUFDVCxRQUFJLEVBQUUsR0FBRyxxQkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDN0IsZUFBUyxFQUFFLCtDQUErQztLQUMzRCxDQUFDLENBQUM7O0FBRUgsUUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtBQUNwQyxlQUFTLEVBQUUsMEJBQTBCOztBQUVyQyxlQUFTLEVBQUUscURBQXFELEdBQUcsTUFBTTtLQUMxRSxFQUFFOztBQUVELGlCQUFXLEVBQUUsS0FBSztLQUNuQixDQUFDLENBQUM7O0FBRUgsTUFBRSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDaEMsV0FBTyxFQUFFLENBQUM7R0FDWDs7Ozs7Ozs7QUE5Qkcsb0JBQWtCLFdBcUN0QixhQUFhLEdBQUEseUJBQUc7O0FBRWQsUUFBSSxJQUFJLEdBQUcsQUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDekcsUUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNsRCxRQUFJLGFBQWEsR0FBRywrQkFBVyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0FBQzlELFFBQUksYUFBYSxLQUFLLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDekMsVUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUM7QUFDcEMsVUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLHVDQUFxQyxhQUFhLGdCQUFXLGFBQWEsQUFBRSxDQUFDO0tBQ3ZHO0dBQ0Y7O1NBOUNHLGtCQUFrQjs7O0FBa0R4Qix5QkFBVSxpQkFBaUIsQ0FBQyxvQkFBb0IsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO3FCQUN2RCxrQkFBa0IiLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3RpbWUtY29udHJvbHMvY3VycmVudC10aW1lLWRpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGN1cnJlbnQtdGltZS1kaXNwbGF5LmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIERvbSBmcm9tICcuLi8uLi91dGlscy9kb20uanMnO1xuaW1wb3J0IGZvcm1hdFRpbWUgZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LXRpbWUuanMnO1xuXG4vKipcbiAqIERpc3BsYXlzIHRoZSBjdXJyZW50IHRpbWVcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBDdXJyZW50VGltZURpc3BsYXlcbiAqL1xuY2xhc3MgQ3VycmVudFRpbWVEaXNwbGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLm9uKHBsYXllciwgJ3RpbWV1cGRhdGUnLCB0aGlzLnVwZGF0ZUNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgbGV0IGVsID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1jdXJyZW50LXRpbWUgdmpzLXRpbWUtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGVudEVsXyA9IERvbS5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWN1cnJlbnQtdGltZS1kaXNwbGF5JyxcbiAgICAgIC8vIGxhYmVsIHRoZSBjdXJyZW50IHRpbWUgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnNcbiAgICAgIGlubmVySFRNTDogJzxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPkN1cnJlbnQgVGltZSA8L3NwYW4+JyArICcwOjAwJyxcbiAgICB9LCB7XG4gICAgICAvLyB0ZWxsIHNjcmVlbiByZWFkZXJzIG5vdCB0byBhdXRvbWF0aWNhbGx5IHJlYWQgdGhlIHRpbWUgYXMgaXQgY2hhbmdlc1xuICAgICAgJ2FyaWEtbGl2ZSc6ICdvZmYnXG4gICAgfSk7XG5cbiAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRFbF8pO1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgY3VycmVudCB0aW1lIGRpc3BsYXlcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVDb250ZW50XG4gICAqL1xuICB1cGRhdGVDb250ZW50KCkge1xuICAgIC8vIEFsbG93cyBmb3Igc21vb3RoIHNjcnViYmluZywgd2hlbiBwbGF5ZXIgY2FuJ3Qga2VlcCB1cC5cbiAgICBsZXQgdGltZSA9ICh0aGlzLnBsYXllcl8uc2NydWJiaW5nKCkpID8gdGhpcy5wbGF5ZXJfLmdldENhY2hlKCkuY3VycmVudFRpbWUgOiB0aGlzLnBsYXllcl8uY3VycmVudFRpbWUoKTtcbiAgICBsZXQgbG9jYWxpemVkVGV4dCA9IHRoaXMubG9jYWxpemUoJ0N1cnJlbnQgVGltZScpO1xuICAgIGxldCBmb3JtYXR0ZWRUaW1lID0gZm9ybWF0VGltZSh0aW1lLCB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSk7XG4gICAgaWYgKGZvcm1hdHRlZFRpbWUgIT09IHRoaXMuZm9ybWF0dGVkVGltZV8pIHtcbiAgICAgIHRoaXMuZm9ybWF0dGVkVGltZV8gPSBmb3JtYXR0ZWRUaW1lO1xuICAgICAgdGhpcy5jb250ZW50RWxfLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4ke2xvY2FsaXplZFRleHR9PC9zcGFuPiAke2Zvcm1hdHRlZFRpbWV9YDtcbiAgICB9XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0N1cnJlbnRUaW1lRGlzcGxheScsIEN1cnJlbnRUaW1lRGlzcGxheSk7XG5leHBvcnQgZGVmYXVsdCBDdXJyZW50VGltZURpc3BsYXk7XG4iXX0=
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/format-time.js":147}],94:[function(_dereq_,module,exports){
/**
* @file duration-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the duration
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class DurationDisplay
*/
var DurationDisplay = (function (_Component) {
_inherits(DurationDisplay, _Component);
function DurationDisplay(player, options) {
_classCallCheck(this, DurationDisplay);
_Component.call(this, player, options);
// this might need to be changed to 'durationchange' instead of 'timeupdate' eventually,
// however the durationchange event fires before this.player_.duration() is set,
// so the value cannot be written out using this method.
// Once the order of durationchange and this.player_.duration() being set is figured out,
// this can be updated.
this.on(player, 'timeupdate', this.updateContent);
this.on(player, 'loadedmetadata', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
DurationDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-duration vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-duration-display',
// label the duration time for screen reader users
innerHTML: '' + this.localize('Duration Time') + ' 0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update duration time display
*
* @method updateContent
*/
DurationDisplay.prototype.updateContent = function updateContent() {
var duration = this.player_.duration();
if (duration && this.duration_ !== duration) {
this.duration_ = duration;
var localizedText = this.localize('Duration Time');
var formattedTime = _utilsFormatTimeJs2['default'](duration);
this.contentEl_.innerHTML = '' + localizedText + ' ' + formattedTime; // label the duration time for screen reader users
}
};
return DurationDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('DurationDisplay', DurationDisplay);
exports['default'] = DurationDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90aW1lLWNvbnRyb2xzL2R1cmF0aW9uLWRpc3BsYXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzJCQUdzQixvQkFBb0I7Ozs7MEJBQ3JCLG9CQUFvQjs7SUFBN0IsR0FBRzs7aUNBQ1EsNEJBQTRCOzs7Ozs7Ozs7Ozs7O0lBVTdDLGVBQWU7WUFBZixlQUFlOztBQUVSLFdBRlAsZUFBZSxDQUVQLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLGVBQWU7O0FBR2pCLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7Ozs7OztBQU92QixRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xELFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztHQUN2RDs7Ozs7Ozs7O0FBWkcsaUJBQWUsV0FvQm5CLFFBQVEsR0FBQSxvQkFBRztBQUNULFFBQUksRUFBRSxHQUFHLHFCQUFNLFFBQVEsS0FBQSxPQUFDLEtBQUssRUFBRTtBQUM3QixlQUFTLEVBQUUsMkNBQTJDO0tBQ3ZELENBQUMsQ0FBQzs7QUFFSCxRQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO0FBQ3BDLGVBQVMsRUFBRSxzQkFBc0I7O0FBRWpDLGVBQVMsc0NBQW9DLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLGlCQUFjO0tBQzFGLEVBQUU7O0FBRUQsaUJBQVcsRUFBRSxLQUFLO0tBQ25CLENBQUMsQ0FBQzs7QUFFSCxNQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNoQyxXQUFPLEVBQUUsQ0FBQztHQUNYOzs7Ozs7OztBQXBDRyxpQkFBZSxXQTJDbkIsYUFBYSxHQUFBLHlCQUFHO0FBQ2QsUUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN2QyxRQUFJLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRTtBQUMzQyxVQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQztBQUMxQixVQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ25ELFVBQUksYUFBYSxHQUFHLCtCQUFXLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLFVBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyx1Q0FBcUMsYUFBYSxnQkFBVyxhQUFhLEFBQUUsQ0FBQztLQUN2RztHQUNGOztTQW5ERyxlQUFlOzs7QUF1RHJCLHlCQUFVLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO3FCQUNqRCxlQUFlIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci90aW1lLWNvbnRyb2xzL2R1cmF0aW9uLWRpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGR1cmF0aW9uLWRpc3BsYXkuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgZm9ybWF0VGltZSBmcm9tICcuLi8uLi91dGlscy9mb3JtYXQtdGltZS5qcyc7XG5cbi8qKlxuICogRGlzcGxheXMgdGhlIGR1cmF0aW9uXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgRHVyYXRpb25EaXNwbGF5XG4gKi9cbmNsYXNzIER1cmF0aW9uRGlzcGxheSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgLy8gdGhpcyBtaWdodCBuZWVkIHRvIGJlIGNoYW5nZWQgdG8gJ2R1cmF0aW9uY2hhbmdlJyBpbnN0ZWFkIG9mICd0aW1ldXBkYXRlJyBldmVudHVhbGx5LFxuICAgIC8vIGhvd2V2ZXIgdGhlIGR1cmF0aW9uY2hhbmdlIGV2ZW50IGZpcmVzIGJlZm9yZSB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSBpcyBzZXQsXG4gICAgLy8gc28gdGhlIHZhbHVlIGNhbm5vdCBiZSB3cml0dGVuIG91dCB1c2luZyB0aGlzIG1ldGhvZC5cbiAgICAvLyBPbmNlIHRoZSBvcmRlciBvZiBkdXJhdGlvbmNoYW5nZSBhbmQgdGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkgYmVpbmcgc2V0IGlzIGZpZ3VyZWQgb3V0LFxuICAgIC8vIHRoaXMgY2FuIGJlIHVwZGF0ZWQuXG4gICAgdGhpcy5vbihwbGF5ZXIsICd0aW1ldXBkYXRlJywgdGhpcy51cGRhdGVDb250ZW50KTtcbiAgICB0aGlzLm9uKHBsYXllciwgJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy51cGRhdGVDb250ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIGxldCBlbCA9IHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtZHVyYXRpb24gdmpzLXRpbWUtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcblxuICAgIHRoaXMuY29udGVudEVsXyA9IERvbS5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLWR1cmF0aW9uLWRpc3BsYXknLFxuICAgICAgLy8gbGFiZWwgdGhlIGR1cmF0aW9uIHRpbWUgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnNcbiAgICAgIGlubmVySFRNTDogYDxzcGFuIGNsYXNzPVwidmpzLWNvbnRyb2wtdGV4dFwiPiR7dGhpcy5sb2NhbGl6ZSgnRHVyYXRpb24gVGltZScpfTwvc3Bhbj4gMDowMGBcbiAgICB9LCB7XG4gICAgICAvLyB0ZWxsIHNjcmVlbiByZWFkZXJzIG5vdCB0byBhdXRvbWF0aWNhbGx5IHJlYWQgdGhlIHRpbWUgYXMgaXQgY2hhbmdlc1xuICAgICAgJ2FyaWEtbGl2ZSc6ICdvZmYnXG4gICAgfSk7XG5cbiAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmNvbnRlbnRFbF8pO1xuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgZHVyYXRpb24gdGltZSBkaXNwbGF5XG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlQ29udGVudFxuICAgKi9cbiAgdXBkYXRlQ29udGVudCgpIHtcbiAgICBsZXQgZHVyYXRpb24gPSB0aGlzLnBsYXllcl8uZHVyYXRpb24oKTtcbiAgICBpZiAoZHVyYXRpb24gJiYgdGhpcy5kdXJhdGlvbl8gIT09IGR1cmF0aW9uKSB7XG4gICAgICB0aGlzLmR1cmF0aW9uXyA9IGR1cmF0aW9uO1xuICAgICAgbGV0IGxvY2FsaXplZFRleHQgPSB0aGlzLmxvY2FsaXplKCdEdXJhdGlvbiBUaW1lJyk7XG4gICAgICBsZXQgZm9ybWF0dGVkVGltZSA9IGZvcm1hdFRpbWUoZHVyYXRpb24pO1xuICAgICAgdGhpcy5jb250ZW50RWxfLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4ke2xvY2FsaXplZFRleHR9PC9zcGFuPiAke2Zvcm1hdHRlZFRpbWV9YDsgLy8gbGFiZWwgdGhlIGR1cmF0aW9uIHRpbWUgZm9yIHNjcmVlbiByZWFkZXIgdXNlcnNcbiAgICB9XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ0R1cmF0aW9uRGlzcGxheScsIER1cmF0aW9uRGlzcGxheSk7XG5leHBvcnQgZGVmYXVsdCBEdXJhdGlvbkRpc3BsYXk7XG4iXX0=
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/format-time.js":147}],95:[function(_dereq_,module,exports){
/**
* @file remaining-time-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFormatTimeJs = _dereq_('../../utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
/**
* Displays the time left in the video
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class RemainingTimeDisplay
*/
var RemainingTimeDisplay = (function (_Component) {
_inherits(RemainingTimeDisplay, _Component);
function RemainingTimeDisplay(player, options) {
_classCallCheck(this, RemainingTimeDisplay);
_Component.call(this, player, options);
this.on(player, 'timeupdate', this.updateContent);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
RemainingTimeDisplay.prototype.createEl = function createEl() {
var el = _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-remaining-time vjs-time-control vjs-control'
});
this.contentEl_ = Dom.createEl('div', {
className: 'vjs-remaining-time-display',
// label the remaining time for screen reader users
innerHTML: '' + this.localize('Remaining Time') + ' -0:00'
}, {
// tell screen readers not to automatically read the time as it changes
'aria-live': 'off'
});
el.appendChild(this.contentEl_);
return el;
};
/**
* Update remaining time display
*
* @method updateContent
*/
RemainingTimeDisplay.prototype.updateContent = function updateContent() {
if (this.player_.duration()) {
var localizedText = this.localize('Remaining Time');
var formattedTime = _utilsFormatTimeJs2['default'](this.player_.remainingTime());
if (formattedTime !== this.formattedTime_) {
this.formattedTime_ = formattedTime;
this.contentEl_.innerHTML = '' + localizedText + ' -' + formattedTime;
}
}
// Allows for smooth scrubbing, when player can't keep up.
// var time = (this.player_.scrubbing()) ? this.player_.getCache().currentTime : this.player_.currentTime();
// this.contentEl_.innerHTML = vjs.formatTime(time, this.player_.duration());
};
return RemainingTimeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('RemainingTimeDisplay', RemainingTimeDisplay);
exports['default'] = RemainingTimeDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90aW1lLWNvbnRyb2xzL3JlbWFpbmluZy10aW1lLWRpc3BsYXkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzJCQUdzQixvQkFBb0I7Ozs7MEJBQ3JCLG9CQUFvQjs7SUFBN0IsR0FBRzs7aUNBQ1EsNEJBQTRCOzs7Ozs7Ozs7Ozs7O0lBVTdDLG9CQUFvQjtZQUFwQixvQkFBb0I7O0FBRWIsV0FGUCxvQkFBb0IsQ0FFWixNQUFNLEVBQUUsT0FBTyxFQUFDOzBCQUZ4QixvQkFBb0I7O0FBR3RCLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztHQUNuRDs7Ozs7Ozs7O0FBTkcsc0JBQW9CLFdBY3hCLFFBQVEsR0FBQSxvQkFBRztBQUNULFFBQUksRUFBRSxHQUFHLHFCQUFNLFFBQVEsS0FBQSxPQUFDLEtBQUssRUFBRTtBQUM3QixlQUFTLEVBQUUsaURBQWlEO0tBQzdELENBQUMsQ0FBQzs7QUFFSCxRQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO0FBQ3BDLGVBQVMsRUFBRSw0QkFBNEI7O0FBRXZDLGVBQVMsc0NBQW9DLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsa0JBQWU7S0FDNUYsRUFBRTs7QUFFRCxpQkFBVyxFQUFFLEtBQUs7S0FDbkIsQ0FBQyxDQUFDOztBQUVILE1BQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2hDLFdBQU8sRUFBRSxDQUFDO0dBQ1g7Ozs7Ozs7O0FBOUJHLHNCQUFvQixXQXFDeEIsYUFBYSxHQUFBLHlCQUFHO0FBQ2QsUUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxFQUFFO0FBQzNCLFVBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN0RCxVQUFNLGFBQWEsR0FBRywrQkFBVyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFDL0QsVUFBSSxhQUFhLEtBQUssSUFBSSxDQUFDLGNBQWMsRUFBRTtBQUN6QyxZQUFJLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQztBQUNwQyxZQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsdUNBQXFDLGFBQWEsaUJBQVksYUFBYSxBQUFFLENBQUM7T0FDeEc7S0FDRjs7Ozs7R0FLRjs7U0FsREcsb0JBQW9COzs7QUFzRDFCLHlCQUFVLGlCQUFpQixDQUFDLHNCQUFzQixFQUFFLG9CQUFvQixDQUFDLENBQUM7cUJBQzNELG9CQUFvQiIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdGltZS1jb250cm9scy9yZW1haW5pbmctdGltZS1kaXNwbGF5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSByZW1haW5pbmctdGltZS1kaXNwbGF5LmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIERvbSBmcm9tICcuLi8uLi91dGlscy9kb20uanMnO1xuaW1wb3J0IGZvcm1hdFRpbWUgZnJvbSAnLi4vLi4vdXRpbHMvZm9ybWF0LXRpbWUuanMnO1xuXG4vKipcbiAqIERpc3BsYXlzIHRoZSB0aW1lIGxlZnQgaW4gdGhlIHZpZGVvXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgUmVtYWluaW5nVGltZURpc3BsYXlcbiAqL1xuY2xhc3MgUmVtYWluaW5nVGltZURpc3BsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMub24ocGxheWVyLCAndGltZXVwZGF0ZScsIHRoaXMudXBkYXRlQ29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICBsZXQgZWwgPSBzdXBlci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXJlbWFpbmluZy10aW1lIHZqcy10aW1lLWNvbnRyb2wgdmpzLWNvbnRyb2wnXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBEb20uY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1yZW1haW5pbmctdGltZS1kaXNwbGF5JyxcbiAgICAgIC8vIGxhYmVsIHRoZSByZW1haW5pbmcgdGltZSBmb3Igc2NyZWVuIHJlYWRlciB1c2Vyc1xuICAgICAgaW5uZXJIVE1MOiBgPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+JHt0aGlzLmxvY2FsaXplKCdSZW1haW5pbmcgVGltZScpfTwvc3Bhbj4gLTA6MDBgLFxuICAgIH0sIHtcbiAgICAgIC8vIHRlbGwgc2NyZWVuIHJlYWRlcnMgbm90IHRvIGF1dG9tYXRpY2FsbHkgcmVhZCB0aGUgdGltZSBhcyBpdCBjaGFuZ2VzXG4gICAgICAnYXJpYS1saXZlJzogJ29mZidcbiAgICB9KTtcblxuICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsXyk7XG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSByZW1haW5pbmcgdGltZSBkaXNwbGF5XG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlQ29udGVudFxuICAgKi9cbiAgdXBkYXRlQ29udGVudCgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLmR1cmF0aW9uKCkpIHtcbiAgICAgIGNvbnN0IGxvY2FsaXplZFRleHQgPSB0aGlzLmxvY2FsaXplKCdSZW1haW5pbmcgVGltZScpO1xuICAgICAgY29uc3QgZm9ybWF0dGVkVGltZSA9IGZvcm1hdFRpbWUodGhpcy5wbGF5ZXJfLnJlbWFpbmluZ1RpbWUoKSk7XG4gICAgICBpZiAoZm9ybWF0dGVkVGltZSAhPT0gdGhpcy5mb3JtYXR0ZWRUaW1lXykge1xuICAgICAgICB0aGlzLmZvcm1hdHRlZFRpbWVfID0gZm9ybWF0dGVkVGltZTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxfLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cInZqcy1jb250cm9sLXRleHRcIj4ke2xvY2FsaXplZFRleHR9PC9zcGFuPiAtJHtmb3JtYXR0ZWRUaW1lfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsb3dzIGZvciBzbW9vdGggc2NydWJiaW5nLCB3aGVuIHBsYXllciBjYW4ndCBrZWVwIHVwLlxuICAgIC8vIHZhciB0aW1lID0gKHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSkgPyB0aGlzLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSA6IHRoaXMucGxheWVyXy5jdXJyZW50VGltZSgpO1xuICAgIC8vIHRoaXMuY29udGVudEVsXy5pbm5lckhUTUwgPSB2anMuZm9ybWF0VGltZSh0aW1lLCB0aGlzLnBsYXllcl8uZHVyYXRpb24oKSk7XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1JlbWFpbmluZ1RpbWVEaXNwbGF5JywgUmVtYWluaW5nVGltZURpc3BsYXkpO1xuZXhwb3J0IGRlZmF1bHQgUmVtYWluaW5nVGltZURpc3BsYXk7XG4iXX0=
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/format-time.js":147}],96:[function(_dereq_,module,exports){
/**
* @file time-divider.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* The separator between the current time and duration.
* Can be hidden if it's not needed in the design.
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class TimeDivider
*/
var TimeDivider = (function (_Component) {
_inherits(TimeDivider, _Component);
function TimeDivider() {
_classCallCheck(this, TimeDivider);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TimeDivider.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-time-control vjs-time-divider',
innerHTML: '
/
'
});
};
return TimeDivider;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('TimeDivider', TimeDivider);
exports['default'] = TimeDivider;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90aW1lLWNvbnRyb2xzL3RpbWUtZGl2aWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OzJCQUdzQixvQkFBb0I7Ozs7Ozs7Ozs7Ozs7O0lBV3BDLFdBQVc7WUFBWCxXQUFXOztXQUFYLFdBQVc7MEJBQVgsV0FBVzs7Ozs7Ozs7Ozs7O0FBQVgsYUFBVyxXQVFmLFFBQVEsR0FBQSxvQkFBRztBQUNULFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzNCLGVBQVMsRUFBRSxtQ0FBbUM7QUFDOUMsZUFBUyxFQUFFLDJCQUEyQjtLQUN2QyxDQUFDLENBQUM7R0FDSjs7U0FiRyxXQUFXOzs7QUFpQmpCLHlCQUFVLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDekMsV0FBVyIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdGltZS1jb250cm9scy90aW1lLWRpdmlkZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRpbWUtZGl2aWRlci5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uLy4uL2NvbXBvbmVudC5qcyc7XG5cbi8qKlxuICogVGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSBjdXJyZW50IHRpbWUgYW5kIGR1cmF0aW9uLlxuICogQ2FuIGJlIGhpZGRlbiBpZiBpdCdzIG5vdCBuZWVkZWQgaW4gdGhlIGRlc2lnbi5cbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBUaW1lRGl2aWRlclxuICovXG5jbGFzcyBUaW1lRGl2aWRlciBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdGltZS1jb250cm9sIHZqcy10aW1lLWRpdmlkZXInLFxuICAgICAgaW5uZXJIVE1MOiAnPGRpdj48c3Bhbj4vPC9zcGFuPjwvZGl2PidcbiAgICB9KTtcbiAgfVxuXG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVGltZURpdmlkZXInLCBUaW1lRGl2aWRlcik7XG5leHBvcnQgZGVmYXVsdCBUaW1lRGl2aWRlcjtcbiJdfQ==
},{"../../component.js":66}],97:[function(_dereq_,module,exports){
/**
* @file track-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
/**
* The base class for buttons that toggle specific text track types (e.g. subtitles)
*
* @param {Player|Object} player
* @param {Object=} options
* @extends MenuButton
* @class TrackButton
*/
var TrackButton = (function (_MenuButton) {
_inherits(TrackButton, _MenuButton);
function TrackButton(player, options) {
_classCallCheck(this, TrackButton);
var tracks = options.tracks;
_MenuButton.call(this, player, options);
if (this.items.length <= 1) {
this.hide();
}
if (!tracks) {
return;
}
var updateHandler = Fn.bind(this, this.update);
tracks.addEventListener('removetrack', updateHandler);
tracks.addEventListener('addtrack', updateHandler);
this.player_.on('dispose', function () {
tracks.removeEventListener('removetrack', updateHandler);
tracks.removeEventListener('addtrack', updateHandler);
});
}
return TrackButton;
})(_menuMenuButtonJs2['default']);
_componentJs2['default'].registerComponent('TrackButton', TrackButton);
exports['default'] = TrackButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci90cmFjay1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O2dDQUd1Qix3QkFBd0I7Ozs7MkJBQ3pCLGlCQUFpQjs7Ozt5QkFDbkIsZ0JBQWdCOztJQUF4QixFQUFFOzs7Ozs7Ozs7OztJQVVSLFdBQVc7WUFBWCxXQUFXOztBQUVKLFdBRlAsV0FBVyxDQUVILE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLFdBQVc7O0FBR2IsUUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQzs7QUFFNUIsMkJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtBQUMxQixVQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDYjs7QUFFRCxRQUFJLENBQUMsTUFBTSxFQUFFO0FBQ1gsYUFBTztLQUNSOztBQUVELFFBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvQyxVQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3RELFVBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7O0FBRW5ELFFBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFXO0FBQ3BDLFlBQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDekQsWUFBTSxDQUFDLG1CQUFtQixDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztLQUN2RCxDQUFDLENBQUM7R0FDSjs7U0F2QkcsV0FBVzs7O0FBMkJqQix5QkFBVSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3pDLFdBQVciLCJmaWxlIjoic3JjL2pzL2NvbnRyb2wtYmFyL3RyYWNrLWJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdHJhY2stYnV0dG9uLmpzXG4gKi9cbmltcG9ydCBNZW51QnV0dG9uIGZyb20gJy4uL21lbnUvbWVudS1idXR0b24uanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vdXRpbHMvZm4uanMnO1xuXG4vKipcbiAqIFRoZSBiYXNlIGNsYXNzIGZvciBidXR0b25zIHRoYXQgdG9nZ2xlIHNwZWNpZmljIHRleHQgdHJhY2sgdHlwZXMgKGUuZy4gc3VidGl0bGVzKVxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIE1lbnVCdXR0b25cbiAqIEBjbGFzcyBUcmFja0J1dHRvblxuICovXG5jbGFzcyBUcmFja0J1dHRvbiBleHRlbmRzIE1lbnVCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgbGV0IHRyYWNrcyA9IG9wdGlvbnMudHJhY2tzO1xuXG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIGlmICh0aGlzLml0ZW1zLmxlbmd0aCA8PSAxKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRyYWNrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVIYW5kbGVyID0gRm4uYmluZCh0aGlzLCB0aGlzLnVwZGF0ZSk7XG4gICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdXBkYXRlSGFuZGxlcik7XG4gICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdXBkYXRlSGFuZGxlcik7XG5cbiAgICB0aGlzLnBsYXllcl8ub24oJ2Rpc3Bvc2UnLCBmdW5jdGlvbigpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHVwZGF0ZUhhbmRsZXIpO1xuICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdXBkYXRlSGFuZGxlcik7XG4gICAgfSk7XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RyYWNrQnV0dG9uJywgVHJhY2tCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgVHJhY2tCdXR0b247XG4iXX0=
},{"../component.js":66,"../menu/menu-button.js":109,"../utils/fn.js":146}],98:[function(_dereq_,module,exports){
/**
* @file volume-bar.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _sliderSliderJs = _dereq_('../../slider/slider.js');
var _sliderSliderJs2 = _interopRequireDefault(_sliderSliderJs);
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
// Required children
var _volumeLevelJs = _dereq_('./volume-level.js');
var _volumeLevelJs2 = _interopRequireDefault(_volumeLevelJs);
var _volumeDisplayJs = _dereq_('./volume-display.js');
var _volumeDisplayJs2 = _interopRequireDefault(_volumeDisplayJs);
/**
* The bar that contains the volume level and can be clicked on to adjust the level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Slider
* @class VolumeBar
*/
var VolumeBar = (function (_Slider) {
_inherits(VolumeBar, _Slider);
function VolumeBar(player, options) {
_classCallCheck(this, VolumeBar);
_Slider.call(this, player, options);
this.on(player, 'volumechange', this.updateARIAAttributes);
player.ready(Fn.bind(this, this.updateARIAAttributes));
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeBar.prototype.createEl = function createEl() {
return _Slider.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-bar vjs-slider-bar'
}, {
'aria-label': 'volume level'
});
};
/**
* Handle mouse move on volume bar
*
* @method handleMouseMove
*/
VolumeBar.prototype.handleMouseMove = function handleMouseMove(event) {
this.checkMuted();
this.player_.volume(this.calculateDistance(event));
};
VolumeBar.prototype.checkMuted = function checkMuted() {
if (this.player_.muted()) {
this.player_.muted(false);
}
};
/**
* Get percent of volume level
*
* @retun {Number} Volume level percent
* @method getPercent
*/
VolumeBar.prototype.getPercent = function getPercent() {
if (this.player_.muted()) {
return 0;
} else {
return this.player_.volume();
}
};
/**
* Increase volume level for keyboard users
*
* @method stepForward
*/
VolumeBar.prototype.stepForward = function stepForward() {
this.checkMuted();
this.player_.volume(this.player_.volume() + 0.1);
};
/**
* Decrease volume level for keyboard users
*
* @method stepBack
*/
VolumeBar.prototype.stepBack = function stepBack() {
this.checkMuted();
this.player_.volume(this.player_.volume() - 0.1);
};
/**
* Update ARIA accessibility attributes
*
* @method updateARIAAttributes
*/
VolumeBar.prototype.updateARIAAttributes = function updateARIAAttributes() {
// Current value of volume bar as a percentage
var volume = (this.player_.volume() * 100).toFixed(2);
this.el_.setAttribute('aria-valuenow', volume);
this.el_.setAttribute('aria-valuetext', volume + '%');
};
return VolumeBar;
})(_sliderSliderJs2['default']);
VolumeBar.prototype.options_ = {
children: ['volumeLevel', 'volumeDisplay'],
'barName': 'volumeLevel'
};
VolumeBar.prototype.playerEvent = 'volumechange';
_componentJs2['default'].registerComponent('VolumeBar', VolumeBar);
exports['default'] = VolumeBar;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtYmFyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs4QkFHbUIsd0JBQXdCOzs7OzJCQUNyQixvQkFBb0I7Ozs7eUJBQ3RCLG1CQUFtQjs7SUFBM0IsRUFBRTs7Ozs2QkFHVSxtQkFBbUI7Ozs7K0JBQ2pCLHFCQUFxQjs7Ozs7Ozs7Ozs7OztJQVV6QyxTQUFTO1lBQVQsU0FBUzs7QUFFRixXQUZQLFNBQVMsQ0FFRCxNQUFNLEVBQUUsT0FBTyxFQUFDOzBCQUZ4QixTQUFTOztBQUdYLHVCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFDM0QsVUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDO0dBQ3hEOzs7Ozs7Ozs7QUFORyxXQUFTLFdBY2IsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsV0FBTyxrQkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDM0IsZUFBUyxFQUFFLCtCQUErQjtLQUMzQyxFQUFFO0FBQ0Qsa0JBQVksRUFBRSxjQUFjO0tBQzdCLENBQUMsQ0FBQztHQUNKOzs7Ozs7OztBQXBCRyxXQUFTLFdBMkJiLGVBQWUsR0FBQSx5QkFBQyxLQUFLLEVBQUU7QUFDckIsUUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0dBQ3BEOztBQTlCRyxXQUFTLFdBZ0NiLFVBQVUsR0FBQSxzQkFBRztBQUNYLFFBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRTtBQUN4QixVQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtHQUNGOzs7Ozs7Ozs7QUFwQ0csV0FBUyxXQTRDYixVQUFVLEdBQUEsc0JBQUc7QUFDWCxRQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEVBQUU7QUFDeEIsYUFBTyxDQUFDLENBQUM7S0FDVixNQUFNO0FBQ0wsYUFBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQzlCO0dBQ0Y7Ozs7Ozs7O0FBbERHLFdBQVMsV0F5RGIsV0FBVyxHQUFBLHVCQUFHO0FBQ1osUUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7R0FDbEQ7Ozs7Ozs7O0FBNURHLFdBQVMsV0FtRWIsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsUUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7R0FDbEQ7Ozs7Ozs7O0FBdEVHLFdBQVMsV0E2RWIsb0JBQW9CLEdBQUEsZ0NBQUc7O0FBRXJCLFFBQUksTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUEsQ0FBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEQsUUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9DLFFBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQztHQUN2RDs7U0FsRkcsU0FBUzs7O0FBc0ZmLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0FBQzdCLFVBQVEsRUFBRSxDQUNSLGFBQWEsRUFDYixlQUFlLENBQ2hCO0FBQ0QsV0FBUyxFQUFFLGFBQWE7Q0FDekIsQ0FBQzs7QUFFRixTQUFTLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUM7O0FBRWpELHlCQUFVLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztxQkFDckMsU0FBUyIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdm9sdW1lLWNvbnRyb2wvdm9sdW1lLWJhci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdm9sdW1lLWJhci5qc1xuICovXG5pbXBvcnQgU2xpZGVyIGZyb20gJy4uLy4uL3NsaWRlci9zbGlkZXIuanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vLi4vdXRpbHMvZm4uanMnO1xuXG4vLyBSZXF1aXJlZCBjaGlsZHJlblxuaW1wb3J0IFZvbHVtZUxldmVsIGZyb20gJy4vdm9sdW1lLWxldmVsLmpzJztcbmltcG9ydCBWb2x1bWVEaXNwbGF5IGZyb20gJy4vdm9sdW1lLWRpc3BsYXkuanMnO1xuXG4vKipcbiAqIFRoZSBiYXIgdGhhdCBjb250YWlucyB0aGUgdm9sdW1lIGxldmVsIGFuZCBjYW4gYmUgY2xpY2tlZCBvbiB0byBhZGp1c3QgdGhlIGxldmVsXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgU2xpZGVyXG4gKiBAY2xhc3MgVm9sdW1lQmFyXG4gKi9cbmNsYXNzIFZvbHVtZUJhciBleHRlbmRzIFNsaWRlciB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMub24ocGxheWVyLCAndm9sdW1lY2hhbmdlJywgdGhpcy51cGRhdGVBUklBQXR0cmlidXRlcyk7XG4gICAgcGxheWVyLnJlYWR5KEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVBUklBQXR0cmlidXRlcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtdm9sdW1lLWJhciB2anMtc2xpZGVyLWJhcidcbiAgICB9LCB7XG4gICAgICAnYXJpYS1sYWJlbCc6ICd2b2x1bWUgbGV2ZWwnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNlIG1vdmUgb24gdm9sdW1lIGJhclxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZU1vdXNlTW92ZVxuICAgKi9cbiAgaGFuZGxlTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgdGhpcy5jaGVja011dGVkKCk7XG4gICAgdGhpcy5wbGF5ZXJfLnZvbHVtZSh0aGlzLmNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KSk7XG4gIH1cblxuICBjaGVja011dGVkKCkge1xuICAgIGlmICh0aGlzLnBsYXllcl8ubXV0ZWQoKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLm11dGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHBlcmNlbnQgb2Ygdm9sdW1lIGxldmVsXG4gICAqXG4gICAqIEByZXR1biB7TnVtYmVyfSBWb2x1bWUgbGV2ZWwgcGVyY2VudFxuICAgKiBAbWV0aG9kIGdldFBlcmNlbnRcbiAgICovXG4gIGdldFBlcmNlbnQoKSB7XG4gICAgaWYgKHRoaXMucGxheWVyXy5tdXRlZCgpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucGxheWVyXy52b2x1bWUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5jcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2Vyc1xuICAgKlxuICAgKiBAbWV0aG9kIHN0ZXBGb3J3YXJkXG4gICAqL1xuICBzdGVwRm9yd2FyZCgpIHtcbiAgICB0aGlzLmNoZWNrTXV0ZWQoKTtcbiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSArIDAuMSk7XG4gIH1cblxuICAvKipcbiAgICogRGVjcmVhc2Ugdm9sdW1lIGxldmVsIGZvciBrZXlib2FyZCB1c2Vyc1xuICAgKlxuICAgKiBAbWV0aG9kIHN0ZXBCYWNrXG4gICAqL1xuICBzdGVwQmFjaygpIHtcbiAgICB0aGlzLmNoZWNrTXV0ZWQoKTtcbiAgICB0aGlzLnBsYXllcl8udm9sdW1lKHRoaXMucGxheWVyXy52b2x1bWUoKSAtIDAuMSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIEFSSUEgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlQVJJQUF0dHJpYnV0ZXNcbiAgICovXG4gIHVwZGF0ZUFSSUFBdHRyaWJ1dGVzKCkge1xuICAgIC8vIEN1cnJlbnQgdmFsdWUgb2Ygdm9sdW1lIGJhciBhcyBhIHBlcmNlbnRhZ2VcbiAgICBsZXQgdm9sdW1lID0gKHRoaXMucGxheWVyXy52b2x1bWUoKSAqIDEwMCkudG9GaXhlZCgyKTtcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB2b2x1bWUpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZXRleHQnLCB2b2x1bWUgKyAnJScpO1xuICB9XG5cbn1cblxuVm9sdW1lQmFyLnByb3RvdHlwZS5vcHRpb25zXyA9IHtcbiAgY2hpbGRyZW46IFtcbiAgICAndm9sdW1lTGV2ZWwnLFxuICAgICd2b2x1bWVEaXNwbGF5JyxcbiAgXSxcbiAgJ2Jhck5hbWUnOiAndm9sdW1lTGV2ZWwnXG59O1xuXG5Wb2x1bWVCYXIucHJvdG90eXBlLnBsYXllckV2ZW50ID0gJ3ZvbHVtZWNoYW5nZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lQmFyJywgVm9sdW1lQmFyKTtcbmV4cG9ydCBkZWZhdWx0IFZvbHVtZUJhcjtcbiJdfQ==
},{"../../component.js":66,"../../slider/slider.js":119,"../../utils/fn.js":146,"./volume-display.js":100,"./volume-level.js":101}],99:[function(_dereq_,module,exports){
/**
* @file volume-control.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
// Required children
var _volumeBarJs = _dereq_('./volume-bar.js');
var _volumeBarJs2 = _interopRequireDefault(_volumeBarJs);
/**
* The component for controlling the volume level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class VolumeControl
*/
var VolumeControl = (function (_Component) {
_inherits(VolumeControl, _Component);
function VolumeControl(player, options) {
_classCallCheck(this, VolumeControl);
_Component.call(this, player, options);
// hide volume controls when they're not supported by the current tech
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
}
this.on(player, 'loadstart', function () {
if (player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
});
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeControl.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-control vjs-control'
});
};
return VolumeControl;
})(_componentJs2['default']);
VolumeControl.prototype.options_ = {
children: ['volumeBar']
};
_componentJs2['default'].registerComponent('VolumeControl', VolumeControl);
exports['default'] = VolumeControl;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtY29udHJvbC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OzJCQUdzQixvQkFBb0I7Ozs7OzsyQkFHcEIsaUJBQWlCOzs7Ozs7Ozs7Ozs7O0lBVWpDLGFBQWE7WUFBYixhQUFhOztBQUVOLFdBRlAsYUFBYSxDQUVMLE1BQU0sRUFBRSxPQUFPLEVBQUM7MEJBRnhCLGFBQWE7O0FBR2YsMEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOzs7QUFHdkIsUUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsdUJBQXVCLENBQUMsS0FBSyxLQUFLLEVBQUU7QUFDbkUsVUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUM3QjtBQUNELFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxZQUFVO0FBQ3JDLFVBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEtBQUssRUFBRTtBQUNuRCxZQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO09BQzdCLE1BQU07QUFDTCxZQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxDQUFDO09BQ2hDO0tBQ0YsQ0FBQyxDQUFDO0dBQ0o7Ozs7Ozs7OztBQWhCRyxlQUFhLFdBd0JqQixRQUFRLEdBQUEsb0JBQUc7QUFDVCxXQUFPLHFCQUFNLFFBQVEsS0FBQSxPQUFDLEtBQUssRUFBRTtBQUMzQixlQUFTLEVBQUUsZ0NBQWdDO0tBQzVDLENBQUMsQ0FBQztHQUNKOztTQTVCRyxhQUFhOzs7QUFnQ25CLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0FBQ2pDLFVBQVEsRUFBRSxDQUNSLFdBQVcsQ0FDWjtDQUNGLENBQUM7O0FBRUYseUJBQVUsaUJBQWlCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUM3QyxhQUFhIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtY29udHJvbC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdm9sdW1lLWNvbnRyb2wuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuXG4vLyBSZXF1aXJlZCBjaGlsZHJlblxuaW1wb3J0IFZvbHVtZUJhciBmcm9tICcuL3ZvbHVtZS1iYXIuanMnO1xuXG4vKipcbiAqIFRoZSBjb21wb25lbnQgZm9yIGNvbnRyb2xsaW5nIHRoZSB2b2x1bWUgbGV2ZWxcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBWb2x1bWVDb250cm9sXG4gKi9cbmNsYXNzIFZvbHVtZUNvbnRyb2wgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIC8vIGhpZGUgdm9sdW1lIGNvbnRyb2xzIHdoZW4gdGhleSdyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHRlY2hcbiAgICBpZiAocGxheWVyLnRlY2hfICYmIHBsYXllci50ZWNoX1snZmVhdHVyZXNWb2x1bWVDb250cm9sJ10gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgfVxuICAgIHRoaXMub24ocGxheWVyLCAnbG9hZHN0YXJ0JywgZnVuY3Rpb24oKXtcbiAgICAgIGlmIChwbGF5ZXIudGVjaF9bJ2ZlYXR1cmVzVm9sdW1lQ29udHJvbCddID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtaGlkZGVuJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtY29udHJvbCB2anMtY29udHJvbCdcbiAgICB9KTtcbiAgfVxuXG59XG5cblZvbHVtZUNvbnRyb2wucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICBjaGlsZHJlbjogW1xuICAgICd2b2x1bWVCYXInXG4gIF1cbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lQ29udHJvbCcsIFZvbHVtZUNvbnRyb2wpO1xuZXhwb3J0IGRlZmF1bHQgVm9sdW1lQ29udHJvbDtcbiJdfQ==
},{"../../component.js":66,"./volume-bar.js":98}],100:[function(_dereq_,module,exports){
/**
* @file volume-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
/**
* The Mouse Time Display component shows the time you will seek to
* when hovering over the progress bar
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class VolumeDisplay
*/
var VolumeDisplay = (function (_Component) {
_inherits(VolumeDisplay, _Component);
function VolumeDisplay(player, options) {
var _this = this;
_classCallCheck(this, VolumeDisplay);
_Component.call(this, player, options);
this.update(0, 0, 0);
player.on('ready', function () {
player.controlBar.progressControl.el().appendChild(_this.tooltip);
_this.parent = player.controlBar.volumeMenuButton.volumeBar;
_this.on(_this.parent.el(), 'mousemove', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleMouseMove), 25));
_this.on(_this.parent.el(), 'mouseover', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleHover), 25));
_this.on(_this.parent.el(), 'mouseout', _lodashCompatFunctionThrottle2['default'](Fn.bind(_this, _this.handleLeave), 25));
});
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeDisplay.prototype.createEl = function createEl() {
this.className = 'vjs-volume-display';
this.tooltipClassName = this.className + '-tooltip';
this.tooltip = Dom.createEl('div', {
className: this.tooltipClassName
});
return _Component.prototype.createEl.call(this, 'div', {
className: this.className
});
};
/**
* Dispose of the component and all child components
*
* @method dispose
*/
VolumeDisplay.prototype.dispose = function dispose() {
// Remove tooltipelement from DOM
if (this.tooltip.parentNode) {
this.tooltip.parentNode.removeChild(this.tooltip);
}
Dom.removeElData(this.tooltip);
this.tooltip = null;
_Component.prototype.dispose.call(this);
};
VolumeDisplay.prototype.handleMouseMove = function handleMouseMove(event) {
var newValue = this.calculateDistance(event) * 100;
var maxLeft = this.parent.width() - this.width();
var position = event.pageX - Dom.findElPosition(this.el().parentNode).left;
position = Math.min(Math.max(0, position), maxLeft);
var tooltipWidth = this.tooltip.offsetWidth;
var tooltipParentLeft = Dom.findElPosition(this.tooltip.parentNode).left;
var minTooltipLeft = Dom.findElPosition(this.parent.el()).left - tooltipParentLeft - tooltipWidth / 2;
var maxTooltipLeft = minTooltipLeft + this.parent.width();
var tooltipPosition = event.pageX - tooltipParentLeft - tooltipWidth / 2;
tooltipPosition = Math.min(Math.max(minTooltipLeft, tooltipPosition), maxTooltipLeft);
this.update(newValue, position, tooltipPosition);
};
VolumeDisplay.prototype.handleHover = function handleHover(event) {
this.player_.trigger('tooltipShown');
Dom.addElClass(this.tooltip, this.tooltipClassName + '-active');
};
VolumeDisplay.prototype.handleLeave = function handleLeave(event) {
Dom.removeElClass(this.tooltip, this.tooltipClassName + '-active');
};
VolumeDisplay.prototype.update = function update(newValue, position, tooltipPosition) {
var value = Math.round(newValue) + '%';
this.el().style.left = position + 'px';
this.tooltip.style.left = tooltipPosition + 'px';
this.tooltip.innerHTML = value;
};
VolumeDisplay.prototype.calculateDistance = function calculateDistance(event) {
return Dom.getPointerPosition(this.el().parentNode, event).x;
};
return VolumeDisplay;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('VolumeDisplay', VolumeDisplay);
exports['default'] = VolumeDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtZGlzcGxheS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7MkJBR3NCLG9CQUFvQjs7OzswQkFDckIsb0JBQW9COztJQUE3QixHQUFHOzt5QkFDSyxtQkFBbUI7O0lBQTNCLEVBQUU7OzRDQUNPLGlDQUFpQzs7Ozs7Ozs7Ozs7Ozs7SUFXaEQsYUFBYTtZQUFiLGFBQWE7O0FBRU4sV0FGUCxhQUFhLENBRUwsTUFBTSxFQUFFLE9BQU8sRUFBRTs7OzBCQUZ6QixhQUFhOztBQUdmLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQUVyQixVQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFNO0FBQ3ZCLFlBQU0sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFLLE9BQU8sQ0FBQyxDQUFDOztBQUVqRSxZQUFLLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQztBQUMzRCxZQUFLLEVBQUUsQ0FBQyxNQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsMENBQVMsRUFBRSxDQUFDLElBQUksUUFBTyxNQUFLLGVBQWUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUYsWUFBSyxFQUFFLENBQUMsTUFBSyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLDBDQUFTLEVBQUUsQ0FBQyxJQUFJLFFBQU8sTUFBSyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RGLFlBQUssRUFBRSxDQUFDLE1BQUssTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSwwQ0FBUyxFQUFF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QUFPLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQyxDQUFDO0dBQ2pFOztBQXpFRyxlQUFhLFdBMkVqQixXQUFXLEdBQUEscUJBQUMsS0FBSyxFQUFFO0FBQ2pCLE9BQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDLENBQUM7R0FDcEU7O0FBN0VHLGVBQWEsV0ErRWpCLE1BQU0sR0FBQSxnQkFBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRTtBQUMxQyxRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7QUFFdkMsUUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsUUFBUSxHQUFHLElBQUksQ0FBQzs7QUFFdkMsUUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLGVBQWUsR0FBRyxJQUFJLENBQUM7QUFDakQsUUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0dBQ2hDOztBQXRGRyxlQUFhLFdBd0ZqQixpQkFBaUIsR0FBQSwyQkFBQyxLQUFLLEVBQUU7QUFDdkIsV0FBTyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7R0FDOUQ7O1NBMUZHLGFBQWE7OztBQTZGbkIseUJBQVUsaUJBQWlCLENBQUMsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO3FCQUM3QyxhQUFhIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtZGlzcGxheS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdm9sdW1lLWRpc3BsYXkuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uLy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi8uLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgdGhyb3R0bGUgZnJvbSAnbG9kYXNoLWNvbXBhdC9mdW5jdGlvbi90aHJvdHRsZSc7XG5cbi8qKlxuICogVGhlIE1vdXNlIFRpbWUgRGlzcGxheSBjb21wb25lbnQgc2hvd3MgdGhlIHRpbWUgeW91IHdpbGwgc2VlayB0b1xuICogd2hlbiBob3ZlcmluZyBvdmVyIHRoZSBwcm9ncmVzcyBiYXJcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBWb2x1bWVEaXNwbGF5XG4gKi9cbmNsYXNzIFZvbHVtZURpc3BsYXkgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnVwZGF0ZSgwLCAwLCAwKTtcblxuICAgIHBsYXllci5vbigncmVhZHknLCAoKSA9PiB7XG4gICAgICBwbGF5ZXIuY29udHJvbEJhci5wcm9ncmVzc0NvbnRyb2wuZWwoKS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXApO1xuXG4gICAgICB0aGlzLnBhcmVudCA9IHBsYXllci5jb250cm9sQmFyLnZvbHVtZU1lbnVCdXR0b24udm9sdW1lQmFyO1xuICAgICAgdGhpcy5vbih0aGlzLnBhcmVudC5lbCgpLCAnbW91c2Vtb3ZlJywgdGhyb3R0bGUoRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSksIDI1KSk7XG4gICAgICB0aGlzLm9uKHRoaXMucGFyZW50LmVsKCksICdtb3VzZW92ZXInLCB0aHJvdHRsZShGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlSG92ZXIpLCAyNSkpO1xuICAgICAgdGhpcy5vbih0aGlzLnBhcmVudC5lbCgpLCAnbW91c2VvdXQnLCB0aHJvdHRsZShGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlTGVhdmUpLCAyNSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgdGhpcy5jbGFzc05hbWUgPSAndmpzLXZvbHVtZS1kaXNwbGF5JztcbiAgICB0aGlzLnRvb2x0aXBDbGFzc05hbWUgPSB0aGlzLmNsYXNzTmFtZSsnLXRvb2x0aXAnO1xuXG4gICAgdGhpcy50b29sdGlwID0gRG9tLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMudG9vbHRpcENsYXNzTmFtZVxuICAgIH0pO1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgdGhlIGNvbXBvbmVudCBhbmQgYWxsIGNoaWxkIGNvbXBvbmVudHNcbiAgICpcbiAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIC8vIFJlbW92ZSB0b29sdGlwZWxlbWVudCBmcm9tIERPTVxuICAgIGlmICh0aGlzLnRvb2x0aXAucGFyZW50Tm9kZSkge1xuICAgICAgdGhpcy50b29sdGlwLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy50b29sdGlwKTtcbiAgICB9XG5cbiAgICBEb20ucmVtb3ZlRWxEYXRhKHRoaXMudG9vbHRpcCk7XG4gICAgdGhpcy50b29sdGlwID0gbnVsbDtcblxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIGhhbmRsZU1vdXNlTW92ZShldmVudCkge1xuICAgIGxldCBuZXdWYWx1ZSA9IHRoaXMuY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpICogMTAwO1xuXG4gICAgbGV0IG1heExlZnQgPSB0aGlzLnBhcmVudC53aWR0aCgpIC0gdGhpcy53aWR0aCgpO1xuICAgIGxldCBwb3NpdGlvbiA9IGV2ZW50LnBhZ2VYIC0gRG9tLmZpbmRFbFBvc2l0aW9uKHRoaXMuZWwoKS5wYXJlbnROb2RlKS5sZWZ0O1xuICAgIHBvc2l0aW9uID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgcG9zaXRpb24pLCBtYXhMZWZ0KTtcblxuICAgIGxldCB0b29sdGlwV2lkdGggPSB0aGlzLnRvb2x0aXAub2Zmc2V0V2lkdGg7XG4gICAgbGV0IHRvb2x0aXBQYXJlbnRMZWZ0ID0gRG9tLmZpbmRFbFBvc2l0aW9uKHRoaXMudG9vbHRpcC5wYXJlbnROb2RlKS5sZWZ0O1xuICAgIGxldCBtaW5Ub29sdGlwTGVmdCA9IERvbS5maW5kRWxQb3NpdGlvbih0aGlzLnBhcmVudC5lbCgpKS5sZWZ0IC0gdG9vbHRpcFBhcmVudExlZnQgLSB0b29sdGlwV2lkdGgvMjtcbiAgICBsZXQgbWF4VG9vbHRpcExlZnQgPSBtaW5Ub29sdGlwTGVmdCArIHRoaXMucGFyZW50LndpZHRoKCk7XG5cbiAgICBsZXQgdG9vbHRpcFBvc2l0aW9uID0gZXZlbnQucGFnZVggLSB0b29sdGlwUGFyZW50TGVmdCAtIHRvb2x0aXBXaWR0aC8yO1xuICAgIHRvb2x0aXBQb3NpdGlvbiA9IE1hdGgubWluKE1hdGgubWF4KG1pblRvb2x0aXBMZWZ0LCB0b29sdGlwUG9zaXRpb24pLCBtYXhUb29sdGlwTGVmdCk7XG5cbiAgICB0aGlzLnVwZGF0ZShuZXdWYWx1ZSwgcG9zaXRpb24sIHRvb2x0aXBQb3NpdGlvbik7XG4gIH1cblxuICBoYW5kbGVIb3ZlcihldmVudCkge1xuICAgIHRoaXMucGxheWVyXy50cmlnZ2VyKCd0b29sdGlwU2hvd24nKTtcbiAgICBEb20uYWRkRWxDbGFzcyh0aGlzLnRvb2x0aXAsIHRoaXMudG9vbHRpcENsYXNzTmFtZSArICctYWN0aXZlJyk7XG4gIH1cblxuICBoYW5kbGVMZWF2ZShldmVudCkge1xuICAgIERvbS5yZW1vdmVFbENsYXNzKHRoaXMudG9vbHRpcCwgdGhpcy50b29sdGlwQ2xhc3NOYW1lICsgJy1hY3RpdmUnKTtcbiAgfVxuXG4gIHVwZGF0ZShuZXdWYWx1ZSwgcG9zaXRpb24sIHRvb2x0aXBQb3NpdGlvbikge1xuICAgIGxldCB2YWx1ZSA9IE1hdGgucm91bmQobmV3VmFsdWUpICsgJyUnO1xuXG4gICAgdGhpcy5lbCgpLnN0eWxlLmxlZnQgPSBwb3NpdGlvbiArICdweCc7XG5cbiAgICB0aGlzLnRvb2x0aXAuc3R5bGUubGVmdCA9IHRvb2x0aXBQb3NpdGlvbiArICdweCc7XG4gICAgdGhpcy50b29sdGlwLmlubmVySFRNTCA9IHZhbHVlO1xuICB9XG5cbiAgY2FsY3VsYXRlRGlzdGFuY2UoZXZlbnQpIHtcbiAgICByZXR1cm4gRG9tLmdldFBvaW50ZXJQb3NpdGlvbih0aGlzLmVsKCkucGFyZW50Tm9kZSwgZXZlbnQpLng7XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdWb2x1bWVEaXNwbGF5JywgVm9sdW1lRGlzcGxheSk7XG5leHBvcnQgZGVmYXVsdCBWb2x1bWVEaXNwbGF5O1xuIl19
},{"../../component.js":66,"../../utils/dom.js":144,"../../utils/fn.js":146,"lodash-compat/function/throttle":13}],101:[function(_dereq_,module,exports){
/**
* @file volume-level.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
/**
* Shows volume level
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class VolumeLevel
*/
var VolumeLevel = (function (_Component) {
_inherits(VolumeLevel, _Component);
function VolumeLevel() {
_classCallCheck(this, VolumeLevel);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
VolumeLevel.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-volume-level',
innerHTML: ''
});
};
return VolumeLevel;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('VolumeLevel', VolumeLevel);
exports['default'] = VolumeLevel;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtY29udHJvbC92b2x1bWUtbGV2ZWwuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzsyQkFHc0Isb0JBQW9COzs7Ozs7Ozs7Ozs7O0lBVXBDLFdBQVc7WUFBWCxXQUFXOztXQUFYLFdBQVc7MEJBQVgsV0FBVzs7Ozs7Ozs7Ozs7O0FBQVgsYUFBVyxXQVFmLFFBQVEsR0FBQSxvQkFBRztBQUNULFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsS0FBSyxFQUFFO0FBQzNCLGVBQVMsRUFBRSxrQkFBa0I7QUFDN0IsZUFBUyxFQUFFLHdDQUF3QztLQUNwRCxDQUFDLENBQUM7R0FDSjs7U0FiRyxXQUFXOzs7QUFpQmpCLHlCQUFVLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztxQkFDekMsV0FBVyIsImZpbGUiOiJzcmMvanMvY29udHJvbC1iYXIvdm9sdW1lLWNvbnRyb2wvdm9sdW1lLWxldmVsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB2b2x1bWUtbGV2ZWwuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi8uLi9jb21wb25lbnQuanMnO1xuXG4vKipcbiAqIFNob3dzIHZvbHVtZSBsZXZlbFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIFZvbHVtZUxldmVsXG4gKi9cbmNsYXNzIFZvbHVtZUxldmVsIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy12b2x1bWUtbGV2ZWwnLFxuICAgICAgaW5uZXJIVE1MOiAnPHNwYW4gY2xhc3M9XCJ2anMtY29udHJvbC10ZXh0XCI+PC9zcGFuPidcbiAgICB9KTtcbiAgfVxuXG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lTGV2ZWwnLCBWb2x1bWVMZXZlbCk7XG5leHBvcnQgZGVmYXVsdCBWb2x1bWVMZXZlbDtcbiJdfQ==
},{"../../component.js":66}],102:[function(_dereq_,module,exports){
/**
* @file volume-menu-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _popupPopupJs = _dereq_('../popup/popup.js');
var _popupPopupJs2 = _interopRequireDefault(_popupPopupJs);
var _popupPopupButtonJs = _dereq_('../popup/popup-button.js');
var _popupPopupButtonJs2 = _interopRequireDefault(_popupPopupButtonJs);
var _muteToggleJs = _dereq_('./mute-toggle.js');
var _muteToggleJs2 = _interopRequireDefault(_muteToggleJs);
var _volumeControlVolumeBarJs = _dereq_('./volume-control/volume-bar.js');
var _volumeControlVolumeBarJs2 = _interopRequireDefault(_volumeControlVolumeBarJs);
/**
* Button for volume popup
*
* @param {Player|Object} player
* @param {Object=} options
* @extends PopupButton
* @class VolumeMenuButton
*/
var VolumeMenuButton = (function (_PopupButton) {
_inherits(VolumeMenuButton, _PopupButton);
function VolumeMenuButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, VolumeMenuButton);
// Default to inline
if (options.inline === undefined) {
options.inline = true;
}
// If the vertical option isn't passed at all, default to true.
if (options.vertical === undefined) {
// If an inline volumeMenuButton is used, we should default to using
// a horizontal slider for obvious reasons.
if (options.inline) {
options.vertical = false;
} else {
options.vertical = true;
}
}
// The vertical option needs to be set on the volumeBar as well,
// since that will need to be passed along to the VolumeBar constructor
options.volumeBar = options.volumeBar || {};
options.volumeBar.vertical = !!options.vertical;
_PopupButton.call(this, player, options);
// Same listeners as MuteToggle
this.on(player, 'volumechange', this.volumeUpdate);
this.on(player, 'loadstart', this.volumeUpdate);
// hide mute toggle if the current tech doesn't support volume control
function updateVisibility() {
if (player.tech_ && player.tech_['featuresVolumeControl'] === false) {
this.addClass('vjs-hidden');
} else {
this.removeClass('vjs-hidden');
}
}
updateVisibility.call(this);
this.on(player, 'loadstart', updateVisibility);
this.on(this.volumeBar, ['slideractive', 'focus'], function () {
this.addClass('vjs-slider-active');
});
this.on(this.volumeBar, ['sliderinactive', 'blur'], function () {
this.removeClass('vjs-slider-active');
});
this.on(this.volumeBar, ['focus'], function () {
this.addClass('vjs-lock-showing');
});
this.on(this.volumeBar, ['blur'], function () {
this.removeClass('vjs-lock-showing');
});
}
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
VolumeMenuButton.prototype.buildCSSClass = function buildCSSClass() {
var orientationClass = '';
if (!!this.options_.vertical) {
orientationClass = 'vjs-volume-menu-button-vertical';
} else {
orientationClass = 'vjs-volume-menu-button-horizontal';
}
return 'vjs-volume-menu-button ' + _PopupButton.prototype.buildCSSClass.call(this) + ' ' + orientationClass;
};
/**
* Allow sub components to stack CSS class names
*
* @return {Popup} The volume popup button
* @method createPopup
*/
VolumeMenuButton.prototype.createPopup = function createPopup() {
var popup = new _popupPopupJs2['default'](this.player_, {
contentElType: 'div'
});
var vb = new _volumeControlVolumeBarJs2['default'](this.player_, this.options_.volumeBar);
popup.addChild(vb);
this.menuContent = popup;
this.volumeBar = vb;
this.attachVolumeBarEvents();
return popup;
};
/**
* Handle click on volume popup and calls super
*
* @method handleClick
*/
VolumeMenuButton.prototype.handleClick = function handleClick() {
_muteToggleJs2['default'].prototype.handleClick.call(this);
_PopupButton.prototype.handleClick.call(this);
};
VolumeMenuButton.prototype.attachVolumeBarEvents = function attachVolumeBarEvents() {
this.menuContent.on(['mousedown', 'touchdown'], Fn.bind(this, this.handleMouseDown));
};
VolumeMenuButton.prototype.handleMouseDown = function handleMouseDown(event) {
this.on(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove));
this.on(this.el_.ownerDocument, ['mouseup', 'touchend'], this.handleMouseUp);
};
VolumeMenuButton.prototype.handleMouseUp = function handleMouseUp(event) {
this.off(['mousemove', 'touchmove'], Fn.bind(this.volumeBar, this.volumeBar.handleMouseMove));
};
return VolumeMenuButton;
})(_popupPopupButtonJs2['default']);
VolumeMenuButton.prototype.volumeUpdate = _muteToggleJs2['default'].prototype.update;
VolumeMenuButton.prototype.controlText_ = 'Mute';
_componentJs2['default'].registerComponent('VolumeMenuButton', VolumeMenuButton);
exports['default'] = VolumeMenuButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtbWVudS1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O3lCQUdvQixnQkFBZ0I7O0lBQXhCLEVBQUU7OzJCQUNRLGlCQUFpQjs7Ozs0QkFDckIsbUJBQW1COzs7O2tDQUNiLDBCQUEwQjs7Ozs0QkFDM0Isa0JBQWtCOzs7O3dDQUNuQixnQ0FBZ0M7Ozs7Ozs7Ozs7Ozs7SUFVaEQsZ0JBQWdCO1lBQWhCLGdCQUFnQjs7QUFFVCxXQUZQLGdCQUFnQixDQUVSLE1BQU0sRUFBYTtRQUFYLE9BQU8seURBQUMsRUFBRTs7MEJBRjFCLGdCQUFnQjs7O0FBSWxCLFFBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxTQUFTLEVBQUU7QUFDaEMsYUFBTyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7S0FDdkI7OztBQUdELFFBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7OztBQUdsQyxVQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDbEIsZUFBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7T0FDMUIsTUFBTTtBQUNMLGVBQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO09BQ3pCO0tBQ0Y7Ozs7QUFJRCxXQUFPLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDO0FBQzVDLFdBQU8sQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDOztBQUVoRCw0QkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7OztBQUd2QixRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ25ELFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7OztBQUdoRCxhQUFTLGdCQUFnQixH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a0JBQWdCLFdBaUhwQixlQUFlLEdBQUEseUJBQUMsS0FBSyxFQUFFO0FBQ3JCLFFBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUM3RixRQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztHQUM5RTs7QUFwSEcsa0JBQWdCLFdBc0hwQixhQUFhLEdBQUEsdUJBQUMsS0FBSyxFQUFFO0FBQ25CLFFBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztHQUMvRjs7U0F4SEcsZ0JBQWdCOzs7QUEySHRCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsMEJBQVcsU0FBUyxDQUFDLE1BQU0sQ0FBQztBQUN0RSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQzs7QUFFakQseUJBQVUsaUJBQWlCLENBQUMsa0JBQWtCLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztxQkFDbkQsZ0JBQWdCIiwiZmlsZSI6InNyYy9qcy9jb250cm9sLWJhci92b2x1bWUtbWVudS1idXR0b24uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHZvbHVtZS1tZW51LWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi4vcG9wdXAvcG9wdXAuanMnO1xuaW1wb3J0IFBvcHVwQnV0dG9uIGZyb20gJy4uL3BvcHVwL3BvcHVwLWJ1dHRvbi5qcyc7XG5pbXBvcnQgTXV0ZVRvZ2dsZSBmcm9tICcuL211dGUtdG9nZ2xlLmpzJztcbmltcG9ydCBWb2x1bWVCYXIgZnJvbSAnLi92b2x1bWUtY29udHJvbC92b2x1bWUtYmFyLmpzJztcblxuLyoqXG4gKiBCdXR0b24gZm9yIHZvbHVtZSBwb3B1cFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIFBvcHVwQnV0dG9uXG4gKiBAY2xhc3MgVm9sdW1lTWVudUJ1dHRvblxuICovXG5jbGFzcyBWb2x1bWVNZW51QnV0dG9uIGV4dGVuZHMgUG9wdXBCdXR0b24ge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucz17fSl7XG4gICAgLy8gRGVmYXVsdCB0byBpbmxpbmVcbiAgICBpZiAob3B0aW9ucy5pbmxpbmUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgb3B0aW9ucy5pbmxpbmUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIElmIHRoZSB2ZXJ0aWNhbCBvcHRpb24gaXNuJ3QgcGFzc2VkIGF0IGFsbCwgZGVmYXVsdCB0byB0cnVlLlxuICAgIGlmIChvcHRpb25zLnZlcnRpY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIElmIGFuIGlubGluZSB2b2x1bWVNZW51QnV0dG9uIGlzIHVzZWQsIHdlIHNob3VsZCBkZWZhdWx0IHRvIHVzaW5nXG4gICAgICAvLyBhIGhvcml6b250YWwgc2xpZGVyIGZvciBvYnZpb3VzIHJlYXNvbnMuXG4gICAgICBpZiAob3B0aW9ucy5pbmxpbmUpIHtcbiAgICAgICAgb3B0aW9ucy52ZXJ0aWNhbCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3B0aW9ucy52ZXJ0aWNhbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHZlcnRpY2FsIG9wdGlvbiBuZWVkcyB0byBiZSBzZXQgb24gdGhlIHZvbHVtZUJhciBhcyB3ZWxsLFxuICAgIC8vIHNpbmNlIHRoYXQgd2lsbCBuZWVkIHRvIGJlIHBhc3NlZCBhbG9uZyB0byB0aGUgVm9sdW1lQmFyIGNvbnN0cnVjdG9yXG4gICAgb3B0aW9ucy52b2x1bWVCYXIgPSBvcHRpb25zLnZvbHVtZUJhciB8fCB7fTtcbiAgICBvcHRpb25zLnZvbHVtZUJhci52ZXJ0aWNhbCA9ICEhb3B0aW9ucy52ZXJ0aWNhbDtcblxuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICAvLyBTYW1lIGxpc3RlbmVycyBhcyBNdXRlVG9nZ2xlXG4gICAgdGhpcy5vbihwbGF5ZXIsICd2b2x1bWVjaGFuZ2UnLCB0aGlzLnZvbHVtZVVwZGF0ZSk7XG4gICAgdGhpcy5vbihwbGF5ZXIsICdsb2Fkc3RhcnQnLCB0aGlzLnZvbHVtZVVwZGF0ZSk7XG5cbiAgICAvLyBoaWRlIG11dGUgdG9nZ2xlIGlmIHRoZSBjdXJyZW50IHRlY2ggZG9lc24ndCBzdXBwb3J0IHZvbHVtZSBjb250cm9sXG4gICAgZnVuY3Rpb24gdXBkYXRlVmlzaWJpbGl0eSgpIHtcbiAgICAgIGlmIChwbGF5ZXIudGVjaF8gJiYgcGxheWVyLnRlY2hfWydmZWF0dXJlc1ZvbHVtZUNvbnRyb2wnXSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWhpZGRlbicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWhpZGRlbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVZpc2liaWxpdHkuY2FsbCh0aGlzKTtcbiAgICB0aGlzLm9uKHBsYXllciwgJ2xvYWRzdGFydCcsIHVwZGF0ZVZpc2liaWxpdHkpO1xuXG4gICAgdGhpcy5vbih0aGlzLnZvbHVtZUJhciwgWydzbGlkZXJhY3RpdmUnLCAnZm9jdXMnXSwgZnVuY3Rpb24oKXtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKHRoaXMudm9sdW1lQmFyLCBbJ3NsaWRlcmluYWN0aXZlJywgJ2JsdXInXSwgZnVuY3Rpb24oKXtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zbGlkZXItYWN0aXZlJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKHRoaXMudm9sdW1lQmFyLCBbJ2ZvY3VzJ10sIGZ1bmN0aW9uKCl7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtbG9jay1zaG93aW5nJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uKHRoaXMudm9sdW1lQmFyLCBbJ2JsdXInXSwgZnVuY3Rpb24oKXtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1sb2NrLXNob3dpbmcnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY29uc3RydWN0ZWQgY2xhc3MgbmFtZVxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgbGV0IG9yaWVudGF0aW9uQ2xhc3MgPSAnJztcbiAgICBpZiAoISF0aGlzLm9wdGlvbnNfLnZlcnRpY2FsKSB7XG4gICAgICBvcmllbnRhdGlvbkNsYXNzID0gJ3Zqcy12b2x1bWUtbWVudS1idXR0b24tdmVydGljYWwnO1xuICAgIH0gZWxzZSB7XG4gICAgICBvcmllbnRhdGlvbkNsYXNzID0gJ3Zqcy12b2x1bWUtbWVudS1idXR0b24taG9yaXpvbnRhbCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGB2anMtdm9sdW1lLW1lbnUtYnV0dG9uICR7c3VwZXIuYnVpbGRDU1NDbGFzcygpfSAke29yaWVudGF0aW9uQ2xhc3N9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQHJldHVybiB7UG9wdXB9IFRoZSB2b2x1bWUgcG9wdXAgYnV0dG9uXG4gICAqIEBtZXRob2QgY3JlYXRlUG9wdXBcbiAgICovXG4gIGNyZWF0ZVBvcHVwKCkge1xuICAgIGxldCBwb3B1cCA9IG5ldyBQb3B1cCh0aGlzLnBsYXllcl8sIHtcbiAgICAgIGNvbnRlbnRFbFR5cGU6ICdkaXYnXG4gICAgfSk7XG5cbiAgICBsZXQgdmIgPSBuZXcgVm9sdW1lQmFyKHRoaXMucGxheWVyXywgdGhpcy5vcHRpb25zXy52b2x1bWVCYXIpO1xuXG4gICAgcG9wdXAuYWRkQ2hpbGQodmIpO1xuXG4gICAgdGhpcy5tZW51Q29udGVudCA9IHBvcHVwO1xuICAgIHRoaXMudm9sdW1lQmFyID0gdmI7XG5cbiAgICB0aGlzLmF0dGFjaFZvbHVtZUJhckV2ZW50cygpO1xuXG4gICAgcmV0dXJuIHBvcHVwO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBjbGljayBvbiB2b2x1bWUgcG9wdXAgYW5kIGNhbGxzIHN1cGVyXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlQ2xpY2tcbiAgICovXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIE11dGVUb2dnbGUucHJvdG90eXBlLmhhbmRsZUNsaWNrLmNhbGwodGhpcyk7XG4gICAgc3VwZXIuaGFuZGxlQ2xpY2soKTtcbiAgfVxuXG4gIGF0dGFjaFZvbHVtZUJhckV2ZW50cygpIHtcbiAgICB0aGlzLm1lbnVDb250ZW50Lm9uKFsnbW91c2Vkb3duJywgJ3RvdWNoZG93biddLCBGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlTW91c2VEb3duKSk7XG4gIH1cblxuICBoYW5kbGVNb3VzZURvd24oZXZlbnQpIHtcbiAgICB0aGlzLm9uKFsnbW91c2Vtb3ZlJywgJ3RvdWNobW92ZSddLCBGbi5iaW5kKHRoaXMudm9sdW1lQmFyLCB0aGlzLnZvbHVtZUJhci5oYW5kbGVNb3VzZU1vdmUpKTtcbiAgICB0aGlzLm9uKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsIFsnbW91c2V1cCcsICd0b3VjaGVuZCddLCB0aGlzLmhhbmRsZU1vdXNlVXApO1xuICB9XG5cbiAgaGFuZGxlTW91c2VVcChldmVudCkge1xuICAgIHRoaXMub2ZmKFsnbW91c2Vtb3ZlJywgJ3RvdWNobW92ZSddLCBGbi5iaW5kKHRoaXMudm9sdW1lQmFyLCB0aGlzLnZvbHVtZUJhci5oYW5kbGVNb3VzZU1vdmUpKTtcbiAgfVxufVxuXG5Wb2x1bWVNZW51QnV0dG9uLnByb3RvdHlwZS52b2x1bWVVcGRhdGUgPSBNdXRlVG9nZ2xlLnByb3RvdHlwZS51cGRhdGU7XG5Wb2x1bWVNZW51QnV0dG9uLnByb3RvdHlwZS5jb250cm9sVGV4dF8gPSAnTXV0ZSc7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnVm9sdW1lTWVudUJ1dHRvbicsIFZvbHVtZU1lbnVCdXR0b24pO1xuZXhwb3J0IGRlZmF1bHQgVm9sdW1lTWVudUJ1dHRvbjtcbiJdfQ==
},{"../component.js":66,"../popup/popup-button.js":115,"../popup/popup.js":116,"../utils/fn.js":146,"./mute-toggle.js":72,"./volume-control/volume-bar.js":98}],103:[function(_dereq_,module,exports){
/**
* @file error-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _modalDialog = _dereq_('./modal-dialog');
var _modalDialog2 = _interopRequireDefault(_modalDialog);
var _utilsDom = _dereq_('./utils/dom');
var Dom = _interopRequireWildcard(_utilsDom);
var _utilsMergeOptions = _dereq_('./utils/merge-options');
var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions);
/**
* Display that an error has occurred making the video unplayable.
*
* @extends ModalDialog
* @class ErrorDisplay
*/
var ErrorDisplay = (function (_ModalDialog) {
_inherits(ErrorDisplay, _ModalDialog);
/**
* Constructor for error display modal.
*
* @param {Player} player
* @param {Object} [options]
*/
function ErrorDisplay(player, options) {
_classCallCheck(this, ErrorDisplay);
_ModalDialog.call(this, player, options);
this.on(player, 'error', this.open);
}
/**
* Include the old class for backward-compatibility.
*
* This can be removed in 6.0.
*
* @method buildCSSClass
* @deprecated
* @return {String}
*/
ErrorDisplay.prototype.buildCSSClass = function buildCSSClass() {
return 'vjs-error-display ' + _ModalDialog.prototype.buildCSSClass.call(this);
};
/**
* Opens modal dialog only for error codes not configured for ignore.
*/
ErrorDisplay.prototype.open = function open() {
var error = this.player().error(),
ignore = this.options_.ignoreErr;
if (error && (ignore === true || typeof ignore === 'number' && ignore === error.code || ignore instanceof Array && ignore.indexOf(error.code) >= 0)) {
return this;
}
return _ModalDialog.prototype.open.call(this);
};
/**
* Generates the modal content based on the player error.
*
* @return {String|Null}
*/
ErrorDisplay.prototype.content = function content() {
var error = this.player().error();
return error ? this.localize(error.message) : '';
};
return ErrorDisplay;
})(_modalDialog2['default']);
ErrorDisplay.prototype.options_ = _utilsMergeOptions2['default'](_modalDialog2['default'].prototype.options_, {
fillAlways: true,
temporary: false,
uncloseable: true,
ignoreErr: false
});
_component2['default'].registerComponent('ErrorDisplay', ErrorDisplay);
exports['default'] = ErrorDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9lcnJvci1kaXNwbGF5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozt5QkFHc0IsYUFBYTs7OzsyQkFDWCxnQkFBZ0I7Ozs7d0JBRW5CLGFBQWE7O0lBQXRCLEdBQUc7O2lDQUNVLHVCQUF1Qjs7Ozs7Ozs7Ozs7SUFRMUMsWUFBWTtZQUFaLFlBQVk7Ozs7Ozs7OztBQVFMLFdBUlAsWUFBWSxDQVFKLE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBUnpCLFlBQVk7O0FBU2QsNEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDckM7Ozs7Ozs7Ozs7OztBQVhHLGNBQVksV0FzQmhCLGFBQWEsR0FBQSx5QkFBRztBQUNkLGtDQUE0Qix1QkFBTSxhQUFhLEtBQUEsTUFBRSxDQUFHO0dBQ3JEOzs7Ozs7QUF4QkcsY0FBWSxXQTZCaEIsSUFBSSxHQUFBLGdCQUFHO0FBQ0wsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRTtRQUFFLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztBQUNwRSxRQUFJLEtBQUssS0FBSyxNQUFNLEtBQUcsSUFBSSxJQUN2QixPQUFPLE1BQU0sS0FBRyxRQUFRLElBQUksTUFBTSxLQUFHLEtBQUssQ0FBQyxJQUFJLElBQy9DLE1BQU0sWUFBWSxLQUFLLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUUsQ0FBQyxDQUFBLEFBQUMsRUFBRTtBQUMzRCxhQUFPLElBQUksQ0FBQztLQUNmO0FBQ0QsV0FBTyx1QkFBTSxJQUFJLEtBQUEsTUFBRSxDQUFDO0dBQ3JCOzs7Ozs7OztBQXJDRyxjQUFZLFdBNENoQixPQUFPLEdBQUEsbUJBQUc7QUFDUixRQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDbEMsV0FBTyxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO0dBQ2xEOztTQS9DRyxZQUFZOzs7QUFrRGxCLFlBQVksQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLCtCQUFhLHlCQUFZLFNBQVMsQ0FBQyxRQUFRLEVBQUU7QUFDN0UsWUFBVSxFQUFFLElBQUk7QUFDaEIsV0FBUyxFQUFFLEtBQUs7QUFDaEIsYUFBVyxFQUFFLElBQUk7QUFDakIsV0FBUyxFQUFFLEtBQUs7Q0FDakIsQ0FBQyxDQUFDOztBQUVILHVCQUFVLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDM0MsWUFBWSIsImZpbGUiOiJzcmMvanMvZXJyb3ItZGlzcGxheS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgZXJyb3ItZGlzcGxheS5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCBNb2RhbERpYWxvZyBmcm9tICcuL21vZGFsLWRpYWxvZyc7XG5cbmltcG9ydCAqIGFzIERvbSBmcm9tICcuL3V0aWxzL2RvbSc7XG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vdXRpbHMvbWVyZ2Utb3B0aW9ucyc7XG5cbi8qKlxuICogRGlzcGxheSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCBtYWtpbmcgdGhlIHZpZGVvIHVucGxheWFibGUuXG4gKlxuICogQGV4dGVuZHMgTW9kYWxEaWFsb2dcbiAqIEBjbGFzcyBFcnJvckRpc3BsYXlcbiAqL1xuY2xhc3MgRXJyb3JEaXNwbGF5IGV4dGVuZHMgTW9kYWxEaWFsb2cge1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBmb3IgZXJyb3IgZGlzcGxheSBtb2RhbC5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICovXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG4gICAgdGhpcy5vbihwbGF5ZXIsICdlcnJvcicsIHRoaXMub3Blbik7XG4gIH1cblxuICAvKipcbiAgICogSW5jbHVkZSB0aGUgb2xkIGNsYXNzIGZvciBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSByZW1vdmVkIGluIDYuMC5cbiAgICpcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICovXG4gIGJ1aWxkQ1NTQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGB2anMtZXJyb3ItZGlzcGxheSAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIG1vZGFsIGRpYWxvZyBvbmx5IGZvciBlcnJvciBjb2RlcyBub3QgY29uZmlndXJlZCBmb3IgaWdub3JlLlxuICAgKi9cbiAgb3BlbigpIHtcbiAgICBsZXQgZXJyb3IgPSB0aGlzLnBsYXllcigpLmVycm9yKCksIGlnbm9yZSA9IHRoaXMub3B0aW9uc18uaWdub3JlRXJyO1xuICAgIGlmIChlcnJvciAmJiAoaWdub3JlPT09dHJ1ZSB8fFxuICAgICAgICB0eXBlb2YgaWdub3JlPT09J251bWJlcicgJiYgaWdub3JlPT09ZXJyb3IuY29kZSB8fFxuICAgICAgICBpZ25vcmUgaW5zdGFuY2VvZiBBcnJheSAmJiBpZ25vcmUuaW5kZXhPZihlcnJvci5jb2RlKT49MCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiBzdXBlci5vcGVuKCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHRoZSBtb2RhbCBjb250ZW50IGJhc2VkIG9uIHRoZSBwbGF5ZXIgZXJyb3IuXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ3xOdWxsfVxuICAgKi9cbiAgY29udGVudCgpIHtcbiAgICBsZXQgZXJyb3IgPSB0aGlzLnBsYXllcigpLmVycm9yKCk7XG4gICAgcmV0dXJuIGVycm9yID8gdGhpcy5sb2NhbGl6ZShlcnJvci5tZXNzYWdlKSA6ICcnO1xuICB9XG59XG5cbkVycm9yRGlzcGxheS5wcm90b3R5cGUub3B0aW9uc18gPSBtZXJnZU9wdGlvbnMoTW9kYWxEaWFsb2cucHJvdG90eXBlLm9wdGlvbnNfLCB7XG4gIGZpbGxBbHdheXM6IHRydWUsXG4gIHRlbXBvcmFyeTogZmFsc2UsXG4gIHVuY2xvc2VhYmxlOiB0cnVlLFxuICBpZ25vcmVFcnI6IGZhbHNlXG59KTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdFcnJvckRpc3BsYXknLCBFcnJvckRpc3BsYXkpO1xuZXhwb3J0IGRlZmF1bHQgRXJyb3JEaXNwbGF5O1xuIl19
},{"./component":66,"./modal-dialog":112,"./utils/dom":144,"./utils/merge-options":150}],104:[function(_dereq_,module,exports){
/**
* @file event-target.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var EventTarget = function EventTarget() {};
EventTarget.prototype.allowedEvents_ = {};
EventTarget.prototype.on = function (type, fn) {
// Remove the addEventListener alias before calling Events.on
// so we don't get into an infinite type loop
var ael = this.addEventListener;
this.addEventListener = function () {};
Events.on(this, type, fn);
this.addEventListener = ael;
};
EventTarget.prototype.addEventListener = EventTarget.prototype.on;
EventTarget.prototype.off = function (type, fn) {
Events.off(this, type, fn);
};
EventTarget.prototype.removeEventListener = EventTarget.prototype.off;
EventTarget.prototype.one = function (type, fn) {
// Remove the addEventListener alias before calling Events.on
// so we don't get into an infinite type loop
var ael = this.addEventListener;
this.addEventListener = function () {};
Events.one(this, type, fn);
this.addEventListener = ael;
};
EventTarget.prototype.trigger = function (event) {
var type = event.type || event;
if (typeof event === 'string') {
event = {
type: type
};
}
event = Events.fixEvent(event);
if (this.allowedEvents_[type] && this['on' + type]) {
this['on' + type](event);
}
Events.trigger(this, event);
};
// The standard DOM EventTarget.dispatchEvent() is aliased to trigger()
EventTarget.prototype.dispatchEvent = EventTarget.prototype.trigger;
exports['default'] = EventTarget;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9ldmVudC10YXJnZXQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OzZCQUd3QixtQkFBbUI7O0lBQS9CLE1BQU07O0FBRWxCLElBQUksV0FBVyxHQUFHLFNBQWQsV0FBVyxHQUFjLEVBQUUsQ0FBQzs7QUFFaEMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDOztBQUUxQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxVQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7OztBQUc1QyxNQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7QUFDaEMsTUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQU0sRUFBRSxDQUFDO0FBQ2pDLFFBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQixNQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0NBQzdCLENBQUM7QUFDRixXQUFXLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDOztBQUVsRSxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7QUFDN0MsUUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0NBQzVCLENBQUM7QUFDRixXQUFXLENBQUMsU0FBUyxDQUFDLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDOztBQUV0RSxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUFTLElBQUksRUFBRSxFQUFFLEVBQUU7OztBQUc3QyxNQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7QUFDaEMsTUFBSSxDQUFDLGdCQUFnQixHQUFHLFlBQU0sRUFBRSxDQUFDO0FBQ2pDLFFBQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzQixNQUFJLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0NBQzdCLENBQUM7O0FBRUYsV0FBVyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBUyxLQUFLLEVBQUU7QUFDOUMsTUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7O0FBRS9CLE1BQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO0FBQzdCLFNBQUssR0FBRztBQUNOLFVBQUksRUFBRSxJQUFJO0tBQ1gsQ0FBQztHQUNIO0FBQ0QsT0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7O0FBRS9CLE1BQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFO0FBQ2xELFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7R0FDMUI7O0FBRUQsUUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Q0FDN0IsQ0FBQzs7QUFFRixXQUFXLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQzs7cUJBRXJELFdBQVciLCJmaWxlIjoic3JjL2pzL2V2ZW50LXRhcmdldC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgZXZlbnQtdGFyZ2V0LmpzXG4gKi9cbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5cbnZhciBFdmVudFRhcmdldCA9IGZ1bmN0aW9uKCkge307XG5cbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHt9O1xuXG5FdmVudFRhcmdldC5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBmbikge1xuICAvLyBSZW1vdmUgdGhlIGFkZEV2ZW50TGlzdGVuZXIgYWxpYXMgYmVmb3JlIGNhbGxpbmcgRXZlbnRzLm9uXG4gIC8vIHNvIHdlIGRvbid0IGdldCBpbnRvIGFuIGluZmluaXRlIHR5cGUgbG9vcFxuICBsZXQgYWVsID0gdGhpcy5hZGRFdmVudExpc3RlbmVyO1xuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSAoKSA9PiB7fTtcbiAgRXZlbnRzLm9uKHRoaXMsIHR5cGUsIGZuKTtcbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gYWVsO1xufTtcbkV2ZW50VGFyZ2V0LnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyID0gRXZlbnRUYXJnZXQucHJvdG90eXBlLm9uO1xuXG5FdmVudFRhcmdldC5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24odHlwZSwgZm4pIHtcbiAgRXZlbnRzLm9mZih0aGlzLCB0eXBlLCBmbik7XG59O1xuRXZlbnRUYXJnZXQucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBFdmVudFRhcmdldC5wcm90b3R5cGUub2ZmO1xuXG5FdmVudFRhcmdldC5wcm90b3R5cGUub25lID0gZnVuY3Rpb24odHlwZSwgZm4pIHtcbiAgLy8gUmVtb3ZlIHRoZSBhZGRFdmVudExpc3RlbmVyIGFsaWFzIGJlZm9yZSBjYWxsaW5nIEV2ZW50cy5vblxuICAvLyBzbyB3ZSBkb24ndCBnZXQgaW50byBhbiBpbmZpbml0ZSB0eXBlIGxvb3BcbiAgbGV0IGFlbCA9IHRoaXMuYWRkRXZlbnRMaXN0ZW5lcjtcbiAgdGhpcy5hZGRFdmVudExpc3RlbmVyID0gKCkgPT4ge307XG4gIEV2ZW50cy5vbmUodGhpcywgdHlwZSwgZm4pO1xuICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIgPSBhZWw7XG59O1xuXG5FdmVudFRhcmdldC5wcm90b3R5cGUudHJpZ2dlciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gIGxldCB0eXBlID0gZXZlbnQudHlwZSB8fCBldmVudDtcblxuICBpZiAodHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgIGV2ZW50ID0ge1xuICAgICAgdHlwZTogdHlwZVxuICAgIH07XG4gIH1cbiAgZXZlbnQgPSBFdmVudHMuZml4RXZlbnQoZXZlbnQpO1xuXG4gIGlmICh0aGlzLmFsbG93ZWRFdmVudHNfW3R5cGVdICYmIHRoaXNbJ29uJyArIHR5cGVdKSB7XG4gICAgdGhpc1snb24nICsgdHlwZV0oZXZlbnQpO1xuICB9XG5cbiAgRXZlbnRzLnRyaWdnZXIodGhpcywgZXZlbnQpO1xufTtcbi8vIFRoZSBzdGFuZGFyZCBET00gRXZlbnRUYXJnZXQuZGlzcGF0Y2hFdmVudCgpIGlzIGFsaWFzZWQgdG8gdHJpZ2dlcigpXG5FdmVudFRhcmdldC5wcm90b3R5cGUuZGlzcGF0Y2hFdmVudCA9IEV2ZW50VGFyZ2V0LnByb3RvdHlwZS50cmlnZ2VyO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudFRhcmdldDtcbiJdfQ==
},{"./utils/events.js":145}],105:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _utilsLog = _dereq_('./utils/log');
var _utilsLog2 = _interopRequireDefault(_utilsLog);
/*
* @file extend.js
*
* A combination of node inherits and babel's inherits (after transpile).
* Both work the same but node adds `super_` to the subClass
* and Bable adds the superClass as __proto__. Both seem useful.
*/
var _inherits = function _inherits(subClass, superClass) {
if (typeof superClass !== 'function' && superClass !== null) {
throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) {
// node
subClass.super_ = superClass;
}
};
/*
* Function for subclassing using the same inheritance that
* videojs uses internally
* ```js
* var Button = videojs.getComponent('Button');
* ```
* ```js
* var MyButton = videojs.extend(Button, {
* constructor: function(player, options) {
* Button.call(this, player, options);
* },
* onClick: function() {
* // doSomething
* }
* });
* ```
*/
var extendFn = function extendFn(superClass) {
var subClassMethods = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var subClass = function subClass() {
superClass.apply(this, arguments);
};
var methods = {};
if (typeof subClassMethods === 'object') {
if (typeof subClassMethods.init === 'function') {
_utilsLog2['default'].warn('Constructor logic via init() is deprecated; please use constructor() instead.');
subClassMethods.constructor = subClassMethods.init;
}
if (subClassMethods.constructor !== Object.prototype.constructor) {
subClass = subClassMethods.constructor;
}
methods = subClassMethods;
} else if (typeof subClassMethods === 'function') {
subClass = subClassMethods;
}
_inherits(subClass, superClass);
// Extend subObj's prototype with functions and other properties from props
for (var name in methods) {
if (methods.hasOwnProperty(name)) {
subClass.prototype[name] = methods[name];
}
}
return subClass;
};
exports['default'] = extendFn;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9leHRlbmQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O3dCQUFnQixhQUFhOzs7Ozs7Ozs7OztBQVM3QixJQUFNLFNBQVMsR0FBRyxTQUFaLFNBQVMsQ0FBYSxRQUFRLEVBQUUsVUFBVSxFQUFFO0FBQ2hELE1BQUksT0FBTyxVQUFVLEtBQUssVUFBVSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7QUFDM0QsVUFBTSxJQUFJLFNBQVMsQ0FBQywwREFBMEQsR0FBRyxPQUFPLFVBQVUsQ0FBQyxDQUFDO0dBQ3JHOztBQUVELFVBQVEsQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtBQUNyRSxlQUFXLEVBQUU7QUFDWCxXQUFLLEVBQUUsUUFBUTtBQUNmLGdCQUFVLEVBQUUsS0FBSztBQUNqQixjQUFRLEVBQUUsSUFBSTtBQUNkLGtCQUFZLEVBQUUsSUFBSTtLQUNuQjtHQUNGLENBQUMsQ0FBQzs7QUFFSCxNQUFJLFVBQVUsRUFBRTs7QUFFZCxZQUFRLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztHQUM5QjtDQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkYsSUFBTSxRQUFRLEdBQUcsU0FBWCxRQUFRLENBQVksVUFBVSxFQUFzQjtNQUFwQixlQUFlLHlEQUFDLEVBQUU7O0FBQ3RELE1BQUksUUFBUSxHQUFHLG9CQUFXO0FBQ3hCLGNBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0dBQ25DLENBQUM7QUFDRixNQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7O0FBRWpCLE1BQUksT0FBTyxlQUFlLEtBQUssUUFBUSxFQUFFO0FBQ3ZDLFFBQUksT0FBTyxlQUFlLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRTtBQUM5Qyw0QkFBSSxJQUFJLENBQUMsK0VBQStFLENBQUMsQ0FBQztBQUMxRixxQkFBZSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO0tBQ3BEO0FBQ0QsUUFBSSxlQUFlLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO0FBQ2hFLGNBQVEsR0FBRyxlQUFlLENBQUMsV0FBVyxDQUFDO0tBQ3hDO0FBQ0QsV0FBTyxHQUFHLGVBQWUsQ0FBQztHQUMzQixNQUFNLElBQUksT0FBTyxlQUFlLEtBQUssVUFBVSxFQUFFO0FBQ2hELFlBQVEsR0FBRyxlQUFlLENBQUM7R0FDNUI7O0FBRUQsV0FBUyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQzs7O0FBR2hDLE9BQUssSUFBSSxJQUFJLElBQUksT0FBTyxFQUFFO0FBQ3hCLFFBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNoQyxjQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxQztHQUNGOztBQUVELFNBQU8sUUFBUSxDQUFDO0NBQ2pCLENBQUM7O3FCQUVhLFFBQVEiLCJmaWxlIjoic3JjL2pzL2V4dGVuZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuXG4vKlxuICogQGZpbGUgZXh0ZW5kLmpzXG4gKlxuICogQSBjb21iaW5hdGlvbiBvZiBub2RlIGluaGVyaXRzIGFuZCBiYWJlbCdzIGluaGVyaXRzIChhZnRlciB0cmFuc3BpbGUpLlxuICogQm90aCB3b3JrIHRoZSBzYW1lIGJ1dCBub2RlIGFkZHMgYHN1cGVyX2AgdG8gdGhlIHN1YkNsYXNzXG4gKiBhbmQgQmFibGUgYWRkcyB0aGUgc3VwZXJDbGFzcyBhcyBfX3Byb3RvX18uIEJvdGggc2VlbSB1c2VmdWwuXG4gKi9cbmNvbnN0IF9pbmhlcml0cyA9IGZ1bmN0aW9uIChzdWJDbGFzcywgc3VwZXJDbGFzcykge1xuICBpZiAodHlwZW9mIHN1cGVyQ2xhc3MgIT09ICdmdW5jdGlvbicgJiYgc3VwZXJDbGFzcyAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1N1cGVyIGV4cHJlc3Npb24gbXVzdCBlaXRoZXIgYmUgbnVsbCBvciBhIGZ1bmN0aW9uLCBub3QgJyArIHR5cGVvZiBzdXBlckNsYXNzKTtcbiAgfVxuXG4gIHN1YkNsYXNzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDbGFzcyAmJiBzdXBlckNsYXNzLnByb3RvdHlwZSwge1xuICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICB2YWx1ZTogc3ViQ2xhc3MsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfVxuICB9KTtcblxuICBpZiAoc3VwZXJDbGFzcykge1xuICAgIC8vIG5vZGVcbiAgICBzdWJDbGFzcy5zdXBlcl8gPSBzdXBlckNsYXNzO1xuICB9XG59O1xuXG4vKlxuICogRnVuY3Rpb24gZm9yIHN1YmNsYXNzaW5nIHVzaW5nIHRoZSBzYW1lIGluaGVyaXRhbmNlIHRoYXRcbiAqIHZpZGVvanMgdXNlcyBpbnRlcm5hbGx5XG4gKiBgYGBqc1xuICogdmFyIEJ1dHRvbiA9IHZpZGVvanMuZ2V0Q29tcG9uZW50KCdCdXR0b24nKTtcbiAqIGBgYFxuICogYGBganNcbiAqIHZhciBNeUJ1dHRvbiA9IHZpZGVvanMuZXh0ZW5kKEJ1dHRvbiwge1xuICogICBjb25zdHJ1Y3RvcjogZnVuY3Rpb24ocGxheWVyLCBvcHRpb25zKSB7XG4gKiAgICAgQnV0dG9uLmNhbGwodGhpcywgcGxheWVyLCBvcHRpb25zKTtcbiAqICAgfSxcbiAqICAgb25DbGljazogZnVuY3Rpb24oKSB7XG4gKiAgICAgLy8gZG9Tb21ldGhpbmdcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuY29uc3QgZXh0ZW5kRm4gPSBmdW5jdGlvbihzdXBlckNsYXNzLCBzdWJDbGFzc01ldGhvZHM9e30pIHtcbiAgbGV0IHN1YkNsYXNzID0gZnVuY3Rpb24oKSB7XG4gICAgc3VwZXJDbGFzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9O1xuICBsZXQgbWV0aG9kcyA9IHt9O1xuXG4gIGlmICh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzID09PSAnb2JqZWN0Jykge1xuICAgIGlmICh0eXBlb2Ygc3ViQ2xhc3NNZXRob2RzLmluaXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxvZy53YXJuKCdDb25zdHJ1Y3RvciBsb2dpYyB2aWEgaW5pdCgpIGlzIGRlcHJlY2F0ZWQ7IHBsZWFzZSB1c2UgY29uc3RydWN0b3IoKSBpbnN0ZWFkLicpO1xuICAgICAgc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yID0gc3ViQ2xhc3NNZXRob2RzLmluaXQ7XG4gICAgfVxuICAgIGlmIChzdWJDbGFzc01ldGhvZHMuY29uc3RydWN0b3IgIT09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHtcbiAgICAgIHN1YkNsYXNzID0gc3ViQ2xhc3NNZXRob2RzLmNvbnN0cnVjdG9yO1xuICAgIH1cbiAgICBtZXRob2RzID0gc3ViQ2xhc3NNZXRob2RzO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBzdWJDbGFzc01ldGhvZHMgPT09ICdmdW5jdGlvbicpIHtcbiAgICBzdWJDbGFzcyA9IHN1YkNsYXNzTWV0aG9kcztcbiAgfVxuXG4gIF9pbmhlcml0cyhzdWJDbGFzcywgc3VwZXJDbGFzcyk7XG5cbiAgLy8gRXh0ZW5kIHN1Yk9iaidzIHByb3RvdHlwZSB3aXRoIGZ1bmN0aW9ucyBhbmQgb3RoZXIgcHJvcGVydGllcyBmcm9tIHByb3BzXG4gIGZvciAodmFyIG5hbWUgaW4gbWV0aG9kcykge1xuICAgIGlmIChtZXRob2RzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICBzdWJDbGFzcy5wcm90b3R5cGVbbmFtZV0gPSBtZXRob2RzW25hbWVdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzdWJDbGFzcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4dGVuZEZuO1xuIl19
},{"./utils/log":149}],106:[function(_dereq_,module,exports){
/**
* @file fullscreen-api.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/*
* Store the browser-specific methods for the fullscreen API
* @type {Object|undefined}
* @private
*/
var FullscreenApi = {};
// browser API methods
// map approach from Screenful.js - https://github.com/sindresorhus/screenfull.js
var apiMap = [
// Spec: https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
['requestFullscreen', 'exitFullscreen', 'fullscreenElement', 'fullscreenEnabled', 'fullscreenchange', 'fullscreenerror'],
// WebKit
['webkitRequestFullscreen', 'webkitExitFullscreen', 'webkitFullscreenElement', 'webkitFullscreenEnabled', 'webkitfullscreenchange', 'webkitfullscreenerror'],
// Old WebKit (Safari 5.1)
['webkitRequestFullScreen', 'webkitCancelFullScreen', 'webkitCurrentFullScreenElement', 'webkitCancelFullScreen', 'webkitfullscreenchange', 'webkitfullscreenerror'],
// Mozilla
['mozRequestFullScreen', 'mozCancelFullScreen', 'mozFullScreenElement', 'mozFullScreenEnabled', 'mozfullscreenchange', 'mozfullscreenerror'],
// Microsoft
['msRequestFullscreen', 'msExitFullscreen', 'msFullscreenElement', 'msFullscreenEnabled', 'MSFullscreenChange', 'MSFullscreenError']];
var specApi = apiMap[0];
var browserApi = undefined;
// determine the supported set of functions
for (var i = 0; i < apiMap.length; i++) {
// check for exitFullscreen function
if (apiMap[i][1] in _globalDocument2['default']) {
browserApi = apiMap[i];
break;
}
}
// map the browser API names to the spec API names
if (browserApi) {
for (var i = 0; i < browserApi.length; i++) {
FullscreenApi[specApi[i]] = browserApi[i];
}
}
exports['default'] = FullscreenApi;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9mdWxsc2NyZWVuLWFwaS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OEJBR3FCLGlCQUFpQjs7Ozs7Ozs7O0FBT3RDLElBQUksYUFBYSxHQUFHLEVBQUUsQ0FBQzs7OztBQUl2QixJQUFNLE1BQU0sR0FBRzs7QUFFYixDQUNFLG1CQUFtQixFQUNuQixnQkFBZ0IsRUFDaEIsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsaUJBQWlCLENBQ2xCOztBQUVELENBQ0UseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0Qix5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4Qix1QkFBdUIsQ0FDeEI7O0FBRUQsQ0FDRSx5QkFBeUIsRUFDekIsd0JBQXdCLEVBQ3hCLGdDQUFnQyxFQUNoQyx3QkFBd0IsRUFDeEIsd0JBQXdCLEVBQ3hCLHVCQUF1QixDQUN4Qjs7QUFFRCxDQUNFLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixxQkFBcUIsRUFDckIsb0JBQW9CLENBQ3JCOztBQUVELENBQ0UscUJBQXFCLEVBQ3JCLGtCQUFrQixFQUNsQixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixtQkFBbUIsQ0FDcEIsQ0FDRixDQUFDOztBQUVGLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN4QixJQUFJLFVBQVUsWUFBQSxDQUFDOzs7QUFHZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTs7QUFFdEMsTUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLCtCQUFZLEVBQUU7QUFDNUIsY0FBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QixVQUFNO0dBQ1A7Q0FDRjs7O0FBR0QsSUFBSSxVQUFVLEVBQUU7QUFDZCxPQUFLLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUN0QyxpQkFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUMzQztDQUNGOztxQkFFYyxhQUFhIiwiZmlsZSI6InNyYy9qcy9mdWxsc2NyZWVuLWFwaS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgZnVsbHNjcmVlbi1hcGkuanNcbiAqL1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qXG4gKiBTdG9yZSB0aGUgYnJvd3Nlci1zcGVjaWZpYyBtZXRob2RzIGZvciB0aGUgZnVsbHNjcmVlbiBBUElcbiAqIEB0eXBlIHtPYmplY3R8dW5kZWZpbmVkfVxuICogQHByaXZhdGVcbiAqL1xubGV0IEZ1bGxzY3JlZW5BcGkgPSB7fTtcblxuLy8gYnJvd3NlciBBUEkgbWV0aG9kc1xuLy8gbWFwIGFwcHJvYWNoIGZyb20gU2NyZWVuZnVsLmpzIC0gaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy9zY3JlZW5mdWxsLmpzXG5jb25zdCBhcGlNYXAgPSBbXG4gIC8vIFNwZWM6IGh0dHBzOi8vZHZjcy53My5vcmcvaGcvZnVsbHNjcmVlbi9yYXctZmlsZS90aXAvT3ZlcnZpZXcuaHRtbFxuICBbXG4gICAgJ3JlcXVlc3RGdWxsc2NyZWVuJyxcbiAgICAnZXhpdEZ1bGxzY3JlZW4nLFxuICAgICdmdWxsc2NyZWVuRWxlbWVudCcsXG4gICAgJ2Z1bGxzY3JlZW5FbmFibGVkJyxcbiAgICAnZnVsbHNjcmVlbmNoYW5nZScsXG4gICAgJ2Z1bGxzY3JlZW5lcnJvcidcbiAgXSxcbiAgLy8gV2ViS2l0XG4gIFtcbiAgICAnd2Via2l0UmVxdWVzdEZ1bGxzY3JlZW4nLFxuICAgICd3ZWJraXRFeGl0RnVsbHNjcmVlbicsXG4gICAgJ3dlYmtpdEZ1bGxzY3JlZW5FbGVtZW50JyxcbiAgICAnd2Via2l0RnVsbHNjcmVlbkVuYWJsZWQnLFxuICAgICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJyxcbiAgICAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ1xuICBdLFxuICAvLyBPbGQgV2ViS2l0IChTYWZhcmkgNS4xKVxuICBbXG4gICAgJ3dlYmtpdFJlcXVlc3RGdWxsU2NyZWVuJyxcbiAgICAnd2Via2l0Q2FuY2VsRnVsbFNjcmVlbicsXG4gICAgJ3dlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCcsXG4gICAgJ3dlYmtpdENhbmNlbEZ1bGxTY3JlZW4nLFxuICAgICd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlJyxcbiAgICAnd2Via2l0ZnVsbHNjcmVlbmVycm9yJ1xuICBdLFxuICAvLyBNb3ppbGxhXG4gIFtcbiAgICAnbW96UmVxdWVzdEZ1bGxTY3JlZW4nLFxuICAgICdtb3pDYW5jZWxGdWxsU2NyZWVuJyxcbiAgICAnbW96RnVsbFNjcmVlbkVsZW1lbnQnLFxuICAgICdtb3pGdWxsU2NyZWVuRW5hYmxlZCcsXG4gICAgJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLFxuICAgICdtb3pmdWxsc2NyZWVuZXJyb3InXG4gIF0sXG4gIC8vIE1pY3Jvc29mdFxuICBbXG4gICAgJ21zUmVxdWVzdEZ1bGxzY3JlZW4nLFxuICAgICdtc0V4aXRGdWxsc2NyZWVuJyxcbiAgICAnbXNGdWxsc2NyZWVuRWxlbWVudCcsXG4gICAgJ21zRnVsbHNjcmVlbkVuYWJsZWQnLFxuICAgICdNU0Z1bGxzY3JlZW5DaGFuZ2UnLFxuICAgICdNU0Z1bGxzY3JlZW5FcnJvcidcbiAgXVxuXTtcblxubGV0IHNwZWNBcGkgPSBhcGlNYXBbMF07XG5sZXQgYnJvd3NlckFwaTtcblxuLy8gZGV0ZXJtaW5lIHRoZSBzdXBwb3J0ZWQgc2V0IG9mIGZ1bmN0aW9uc1xuZm9yIChsZXQgaSA9IDA7IGkgPCBhcGlNYXAubGVuZ3RoOyBpKyspIHtcbiAgLy8gY2hlY2sgZm9yIGV4aXRGdWxsc2NyZWVuIGZ1bmN0aW9uXG4gIGlmIChhcGlNYXBbaV1bMV0gaW4gZG9jdW1lbnQpIHtcbiAgICBicm93c2VyQXBpID0gYXBpTWFwW2ldO1xuICAgIGJyZWFrO1xuICB9XG59XG5cbi8vIG1hcCB0aGUgYnJvd3NlciBBUEkgbmFtZXMgdG8gdGhlIHNwZWMgQVBJIG5hbWVzXG5pZiAoYnJvd3NlckFwaSkge1xuICBmb3IgKGxldCBpPTA7IGk8YnJvd3NlckFwaS5sZW5ndGg7IGkrKykge1xuICAgIEZ1bGxzY3JlZW5BcGlbc3BlY0FwaVtpXV0gPSBicm93c2VyQXBpW2ldO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZ1bGxzY3JlZW5BcGk7XG4iXX0=
},{"global/document":7}],107:[function(_dereq_,module,exports){
/**
* @file loading-spinner.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
/* Loading Spinner
================================================================================ */
/**
* Loading spinner for waiting events
*
* @extends Component
* @class LoadingSpinner
*/
var LoadingSpinner = (function (_Component) {
_inherits(LoadingSpinner, _Component);
function LoadingSpinner() {
_classCallCheck(this, LoadingSpinner);
_Component.apply(this, arguments);
}
/**
* Create the component's DOM element
*
* @method createEl
*/
LoadingSpinner.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-loading-spinner',
dir: 'ltr'
});
};
return LoadingSpinner;
})(_component2['default']);
_component2['default'].registerComponent('LoadingSpinner', LoadingSpinner);
exports['default'] = LoadingSpinner;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9sb2FkaW5nLXNwaW5uZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozt5QkFHc0IsYUFBYTs7Ozs7Ozs7Ozs7OztJQVU3QixjQUFjO1lBQWQsY0FBYzs7V0FBZCxjQUFjOzBCQUFkLGNBQWM7Ozs7Ozs7Ozs7O0FBQWQsZ0JBQWMsV0FPbEIsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsV0FBTyxxQkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDM0IsZUFBUyxFQUFFLHFCQUFxQjtBQUNoQyxTQUFHLEVBQUUsS0FBSztLQUNYLENBQUMsQ0FBQztHQUNKOztTQVpHLGNBQWM7OztBQWVwQix1QkFBVSxpQkFBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUMsQ0FBQztxQkFDL0MsY0FBYyIsImZpbGUiOiJzcmMvanMvbG9hZGluZy1zcGlubmVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBsb2FkaW5nLXNwaW5uZXIuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudCc7XG5cbi8qIExvYWRpbmcgU3Bpbm5lclxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi9cbi8qKlxuICogTG9hZGluZyBzcGlubmVyIGZvciB3YWl0aW5nIGV2ZW50c1xuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIExvYWRpbmdTcGlubmVyXG4gKi9cbmNsYXNzIExvYWRpbmdTcGlubmVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1sb2FkaW5nLXNwaW5uZXInLFxuICAgICAgZGlyOiAnbHRyJ1xuICAgIH0pO1xuICB9XG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTG9hZGluZ1NwaW5uZXInLCBMb2FkaW5nU3Bpbm5lcik7XG5leHBvcnQgZGVmYXVsdCBMb2FkaW5nU3Bpbm5lcjtcbiJdfQ==
},{"./component":66}],108:[function(_dereq_,module,exports){
/**
* @file media-error.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/*
* Custom MediaError to mimic the HTML5 MediaError
*
* @param {Number} code The media error code
*/
var MediaError = function MediaError(code) {
if (typeof code === 'number') {
this.code = code;
} else if (typeof code === 'string') {
// default code is zero, so this is a custom error
this.message = code;
} else if (typeof code === 'object') {
// object
_objectAssign2['default'](this, code);
}
if (!this.message) {
this.message = MediaError.defaultMessages[this.code] || '';
}
};
/*
* The error code that refers two one of the defined
* MediaError types
*
* @type {Number}
*/
MediaError.prototype.code = 0;
/*
* An optional message to be shown with the error.
* Message is not part of the HTML5 video spec
* but allows for more informative custom errors.
*
* @type {String}
*/
MediaError.prototype.message = '';
/*
* An optional status code that can be set by plugins
* to allow even more detail about the error.
* For example the HLS plugin might provide the specific
* HTTP status code that was returned when the error
* occurred, then allowing a custom error overlay
* to display more information.
*
* @type {Array}
*/
MediaError.prototype.status = null;
MediaError.errorTypes = ['MEDIA_ERR_CUSTOM', // = 0
'MEDIA_ERR_ABORTED', // = 1
'MEDIA_ERR_NETWORK', // = 2
'MEDIA_ERR_DECODE', // = 3
'MEDIA_ERR_SRC_NOT_SUPPORTED', // = 4
'MEDIA_ERR_ENCRYPTED' // = 5
];
MediaError.defaultMessages = {
1: 'You aborted the media playback',
2: 'A network error caused the media download to fail part-way.',
3: 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.',
4: 'The media could not be loaded, either because the server or network failed or because the format is not supported.',
5: 'The media is encrypted and we do not have the keys to decrypt it.'
};
// Add types as properties on MediaError
// e.g. MediaError.MEDIA_ERR_SRC_NOT_SUPPORTED = 4;
for (var errNum = 0; errNum < MediaError.errorTypes.length; errNum++) {
MediaError[MediaError.errorTypes[errNum]] = errNum;
// values should be accessible on both the class and instance
MediaError.prototype[MediaError.errorTypes[errNum]] = errNum;
}
exports['default'] = MediaError;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9tZWRpYS1lcnJvci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7NEJBR21CLGVBQWU7Ozs7Ozs7OztBQU9sQyxJQUFJLFVBQVUsR0FBRyxTQUFiLFVBQVUsQ0FBWSxJQUFJLEVBQUM7QUFDN0IsTUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7QUFDNUIsUUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7R0FDbEIsTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTs7QUFFbkMsUUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7R0FDckIsTUFBTSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTs7QUFDbkMsOEJBQU8sSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0dBQ3BCOztBQUVELE1BQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO0FBQ2pCLFFBQUksQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0dBQzVEO0NBQ0YsQ0FBQzs7Ozs7Ozs7QUFRRixVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Ozs7Ozs7OztBQVM5QixVQUFVLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Ozs7Ozs7Ozs7OztBQVlsQyxVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRW5DLFVBQVUsQ0FBQyxVQUFVLEdBQUcsQ0FDdEIsa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixtQkFBbUI7QUFDbkIsa0JBQWtCO0FBQ2xCLDZCQUE2QjtBQUM3QixxQkFBcUI7Q0FDdEIsQ0FBQzs7QUFFRixVQUFVLENBQUMsZUFBZSxHQUFHO0FBQzNCLEdBQUMsRUFBRSxnQ0FBZ0M7QUFDbkMsR0FBQyxFQUFFLDZEQUE2RDtBQUNoRSxHQUFDLEVBQUUsNkhBQTZIO0FBQ2hJLEdBQUMsRUFBRSxvSEFBb0g7QUFDdkgsR0FBQyxFQUFFLG1FQUFtRTtDQUN2RSxDQUFDOzs7O0FBSUYsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFO0FBQ3BFLFlBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDOztBQUVuRCxZQUFVLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7Q0FDOUQ7O3FCQUVjLFVBQVUiLCJmaWxlIjoic3JjL2pzL21lZGlhLWVycm9yLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBtZWRpYS1lcnJvci5qc1xuICovXG5pbXBvcnQgYXNzaWduIGZyb20gJ29iamVjdC5hc3NpZ24nO1xuXG4vKlxuICogQ3VzdG9tIE1lZGlhRXJyb3IgdG8gbWltaWMgdGhlIEhUTUw1IE1lZGlhRXJyb3JcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gY29kZSBUaGUgbWVkaWEgZXJyb3IgY29kZVxuICovXG5sZXQgTWVkaWFFcnJvciA9IGZ1bmN0aW9uKGNvZGUpe1xuICBpZiAodHlwZW9mIGNvZGUgPT09ICdudW1iZXInKSB7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgY29kZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBkZWZhdWx0IGNvZGUgaXMgemVybywgc28gdGhpcyBpcyBhIGN1c3RvbSBlcnJvclxuICAgIHRoaXMubWVzc2FnZSA9IGNvZGU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGNvZGUgPT09ICdvYmplY3QnKSB7IC8vIG9iamVjdFxuICAgIGFzc2lnbih0aGlzLCBjb2RlKTtcbiAgfVxuXG4gIGlmICghdGhpcy5tZXNzYWdlKSB7XG4gICAgdGhpcy5tZXNzYWdlID0gTWVkaWFFcnJvci5kZWZhdWx0TWVzc2FnZXNbdGhpcy5jb2RlXSB8fCAnJztcbiAgfVxufTtcblxuLypcbiAqIFRoZSBlcnJvciBjb2RlIHRoYXQgcmVmZXJzIHR3byBvbmUgb2YgdGhlIGRlZmluZWRcbiAqIE1lZGlhRXJyb3IgdHlwZXNcbiAqXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG5NZWRpYUVycm9yLnByb3RvdHlwZS5jb2RlID0gMDtcblxuLypcbiAqIEFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYmUgc2hvd24gd2l0aCB0aGUgZXJyb3IuXG4gKiBNZXNzYWdlIGlzIG5vdCBwYXJ0IG9mIHRoZSBIVE1MNSB2aWRlbyBzcGVjXG4gKiBidXQgYWxsb3dzIGZvciBtb3JlIGluZm9ybWF0aXZlIGN1c3RvbSBlcnJvcnMuXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqL1xuTWVkaWFFcnJvci5wcm90b3R5cGUubWVzc2FnZSA9ICcnO1xuXG4vKlxuICogQW4gb3B0aW9uYWwgc3RhdHVzIGNvZGUgdGhhdCBjYW4gYmUgc2V0IGJ5IHBsdWdpbnNcbiAqIHRvIGFsbG93IGV2ZW4gbW9yZSBkZXRhaWwgYWJvdXQgdGhlIGVycm9yLlxuICogRm9yIGV4YW1wbGUgdGhlIEhMUyBwbHVnaW4gbWlnaHQgcHJvdmlkZSB0aGUgc3BlY2lmaWNcbiAqIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgcmV0dXJuZWQgd2hlbiB0aGUgZXJyb3JcbiAqIG9jY3VycmVkLCB0aGVuIGFsbG93aW5nIGEgY3VzdG9tIGVycm9yIG92ZXJsYXlcbiAqIHRvIGRpc3BsYXkgbW9yZSBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAdHlwZSB7QXJyYXl9XG4gKi9cbk1lZGlhRXJyb3IucHJvdG90eXBlLnN0YXR1cyA9IG51bGw7XG5cbk1lZGlhRXJyb3IuZXJyb3JUeXBlcyA9IFtcbiAgJ01FRElBX0VSUl9DVVNUT00nLCAgICAgICAgICAgIC8vID0gMFxuICAnTUVESUFfRVJSX0FCT1JURUQnLCAgICAgICAgICAgLy8gPSAxXG4gICdNRURJQV9FUlJfTkVUV09SSycsICAgICAgICAgICAvLyA9IDJcbiAgJ01FRElBX0VSUl9ERUNPREUnLCAgICAgICAgICAgIC8vID0gM1xuICAnTUVESUFfRVJSX1NSQ19OT1RfU1VQUE9SVEVEJywgLy8gPSA0XG4gICdNRURJQV9FUlJfRU5DUllQVEVEJyAgICAgICAgICAvLyA9IDVcbl07XG5cbk1lZGlhRXJyb3IuZGVmYXVsdE1lc3NhZ2VzID0ge1xuICAxOiAnWW91IGFib3J0ZWQgdGhlIG1lZGlhIHBsYXliYWNrJyxcbiAgMjogJ0EgbmV0d29yayBlcnJvciBjYXVzZWQgdGhlIG1lZGlhIGRvd25sb2FkIHRvIGZhaWwgcGFydC13YXkuJyxcbiAgMzogJ1RoZSBtZWRpYSBwbGF5YmFjayB3YXMgYWJvcnRlZCBkdWUgdG8gYSBjb3JydXB0aW9uIHByb2JsZW0gb3IgYmVjYXVzZSB0aGUgbWVkaWEgdXNlZCBmZWF0dXJlcyB5b3VyIGJyb3dzZXIgZGlkIG5vdCBzdXBwb3J0LicsXG4gIDQ6ICdUaGUgbWVkaWEgY291bGQgbm90IGJlIGxvYWRlZCwgZWl0aGVyIGJlY2F1c2UgdGhlIHNlcnZlciBvciBuZXR3b3JrIGZhaWxlZCBvciBiZWNhdXNlIHRoZSBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4nLFxuICA1OiAnVGhlIG1lZGlhIGlzIGVuY3J5cHRlZCBhbmQgd2UgZG8gbm90IGhhdmUgdGhlIGtleXMgdG8gZGVjcnlwdCBpdC4nXG59O1xuXG4vLyBBZGQgdHlwZXMgYXMgcHJvcGVydGllcyBvbiBNZWRpYUVycm9yXG4vLyBlLmcuIE1lZGlhRXJyb3IuTUVESUFfRVJSX1NSQ19OT1RfU1VQUE9SVEVEID0gNDtcbmZvciAodmFyIGVyck51bSA9IDA7IGVyck51bSA8IE1lZGlhRXJyb3IuZXJyb3JUeXBlcy5sZW5ndGg7IGVyck51bSsrKSB7XG4gIE1lZGlhRXJyb3JbTWVkaWFFcnJvci5lcnJvclR5cGVzW2Vyck51bV1dID0gZXJyTnVtO1xuICAvLyB2YWx1ZXMgc2hvdWxkIGJlIGFjY2Vzc2libGUgb24gYm90aCB0aGUgY2xhc3MgYW5kIGluc3RhbmNlXG4gIE1lZGlhRXJyb3IucHJvdG90eXBlW01lZGlhRXJyb3IuZXJyb3JUeXBlc1tlcnJOdW1dXSA9IGVyck51bTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgTWVkaWFFcnJvcjtcbiJdfQ==
},{"object.assign":53}],109:[function(_dereq_,module,exports){
/**
* @file menu-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _clickableComponentJs = _dereq_('../clickable-component.js');
var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _menuJs = _dereq_('./menu.js');
var _menuJs2 = _interopRequireDefault(_menuJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* A button class with a popup menu
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MenuButton
*/
var MenuButton = (function (_ClickableComponent) {
_inherits(MenuButton, _ClickableComponent);
function MenuButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, MenuButton);
_ClickableComponent.call(this, player, options);
this.update();
this.enabled_ = true;
this.el_.setAttribute('aria-haspopup', 'true');
this.el_.setAttribute('role', 'menuitem');
this.on('keydown', this.handleSubmenuKeyPress);
}
/**
* Update menu
*
* @method update
*/
MenuButton.prototype.update = function update() {
var menu = this.createMenu();
if (this.menu) {
this.removeChild(this.menu);
}
this.menu = menu;
this.addChild(menu);
/**
* Track the state of the menu button
*
* @type {Boolean}
* @private
*/
this.buttonPressed_ = false;
this.el_.setAttribute('aria-expanded', 'false');
if (this.items && this.items.length === 0) {
this.hide();
} else if (this.items && this.items.length > 1) {
this.show();
}
};
/**
* Create menu
*
* @return {Menu} The constructed menu
* @method createMenu
*/
MenuButton.prototype.createMenu = function createMenu() {
var menu = new _menuJs2['default'](this.player_);
// Add a title list item to the top
if (this.options_.title) {
var title = Dom.createEl('li', {
className: 'vjs-menu-title',
innerHTML: _utilsToTitleCaseJs2['default'](this.options_.title),
tabIndex: -1
});
menu.children_.unshift(title);
Dom.insertElFirst(title, menu.contentEl());
}
this.items = this['createItems']();
if (this.items) {
// Add menu items to the menu
for (var i = 0; i < this.items.length; i++) {
menu.addItem(this.items[i]);
}
}
return menu;
};
/**
* Create the list of menu items. Specific to each subclass.
*
* @method createItems
*/
MenuButton.prototype.createItems = function createItems() {};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
MenuButton.prototype.createEl = function createEl() {
return _ClickableComponent.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
MenuButton.prototype.buildCSSClass = function buildCSSClass() {
var menuButtonClass = 'vjs-menu-button';
// If the inline option is passed, we want to use different styles altogether.
if (this.options_.inline === true) {
menuButtonClass += '-inline';
} else {
menuButtonClass += '-popup';
}
return 'vjs-menu-button ' + menuButtonClass + ' ' + _ClickableComponent.prototype.buildCSSClass.call(this);
};
/**
* When you click the button it adds focus, which
* will show the menu indefinitely.
* So we'll remove focus when the mouse leaves the button.
* Focus is needed for tab navigation.
* Allow sub components to stack CSS class names
*
* @method handleClick
*/
MenuButton.prototype.handleClick = function handleClick() {
this.one('mouseout', Fn.bind(this, function () {
this.menu.unlockShowing();
this.el_.blur();
}));
if (this.buttonPressed_) {
this.unpressButton();
} else {
this.pressButton();
}
};
/**
* Handle key press on menu
*
* @param {Object} event Key press event
* @method handleKeyPress
*/
MenuButton.prototype.handleKeyPress = function handleKeyPress(event) {
// Escape (27) key or Tab (9) key unpress the 'button'
if (event.which === 27 || event.which === 9) {
if (this.buttonPressed_) {
this.unpressButton();
}
// Don't preventDefault for Tab key - we still want to lose focus
if (event.which !== 9) {
event.preventDefault();
}
// Up (38) key or Down (40) key press the 'button'
} else if (event.which === 38 || event.which === 40) {
if (!this.buttonPressed_) {
this.pressButton();
event.preventDefault();
}
} else {
_ClickableComponent.prototype.handleKeyPress.call(this, event);
}
};
/**
* Handle key press on submenu
*
* @param {Object} event Key press event
* @method handleSubmenuKeyPress
*/
MenuButton.prototype.handleSubmenuKeyPress = function handleSubmenuKeyPress(event) {
// Escape (27) key or Tab (9) key unpress the 'button'
if (event.which === 27 || event.which === 9) {
if (this.buttonPressed_) {
this.unpressButton();
}
// Don't preventDefault for Tab key - we still want to lose focus
if (event.which !== 9) {
event.preventDefault();
}
}
};
/**
* Makes changes based on button pressed
*
* @method pressButton
*/
MenuButton.prototype.pressButton = function pressButton() {
if (this.enabled_) {
this.buttonPressed_ = true;
this.menu.lockShowing();
this.el_.setAttribute('aria-expanded', 'true');
this.menu.focus(); // set the focus into the submenu
}
};
/**
* Makes changes based on button unpressed
*
* @method unpressButton
*/
MenuButton.prototype.unpressButton = function unpressButton() {
if (this.enabled_) {
this.buttonPressed_ = false;
this.menu.unlockShowing();
this.el_.setAttribute('aria-expanded', 'false');
this.el_.focus(); // Set focus back to this menu button
}
};
/**
* Disable the menu button
*
* @return {Component}
* @method disable
*/
MenuButton.prototype.disable = function disable() {
// Unpress, but don't force focus on this button
this.buttonPressed_ = false;
this.menu.unlockShowing();
this.el_.setAttribute('aria-expanded', 'false');
this.enabled_ = false;
return _ClickableComponent.prototype.disable.call(this);
};
/**
* Enable the menu button
*
* @return {Component}
* @method disable
*/
MenuButton.prototype.enable = function enable() {
this.enabled_ = true;
return _ClickableComponent.prototype.enable.call(this);
};
/**
* Return handler for the tooltip
*
* @return {Object} Dom element to serve as a handler for the tooltip
* @method tooltipHandler
*/
MenuButton.prototype.tooltipHandler = function tooltipHandler() {
// TODO: Fix menu button to have a real icon element to make it as tooltip handler
return;
};
return MenuButton;
})(_clickableComponentJs2['default']);
_componentJs2['default'].registerComponent('MenuButton', MenuButton);
exports['default'] = MenuButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9tZW51L21lbnUtYnV0dG9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztvQ0FHK0IsMkJBQTJCOzs7OzJCQUNwQyxpQkFBaUI7Ozs7c0JBQ3RCLFdBQVc7Ozs7MEJBQ1AsaUJBQWlCOztJQUExQixHQUFHOzt5QkFDSyxnQkFBZ0I7O0lBQXhCLEVBQUU7O2tDQUNVLDJCQUEyQjs7Ozs7Ozs7Ozs7OztJQVU3QyxVQUFVO1lBQVYsVUFBVTs7QUFFSCxXQUZQLFVBQVUsQ0FFRixNQUFNLEVBQWE7UUFBWCxPQUFPLHlEQUFDLEVBQUU7OzBCQUYxQixVQUFVOztBQUdaLG1DQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDOztBQUVkLFFBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDOztBQUVyQixRQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0MsUUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzFDLFFBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0dBQ2hEOzs7Ozs7OztBQVpHLFlBQVUsV0FtQmQsTUFBTSxHQUFBLGtCQUFHO0FBQ1AsUUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDOztBQUU3QixRQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7QUFDYixVQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUM3Qjs7QUFFRCxRQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqQixRQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDOzs7Ozs7OztBQVFwQixRQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztBQUM1QixR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YnV0dG9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBtZW51LWJ1dHRvbi5qc1xuICovXG5pbXBvcnQgQ2xpY2thYmxlQ29tcG9uZW50IGZyb20gJy4uL2NsaWNrYWJsZS1jb21wb25lbnQuanMnO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi9jb21wb25lbnQuanMnO1xuaW1wb3J0IE1lbnUgZnJvbSAnLi9tZW51LmpzJztcbmltcG9ydCAqIGFzIERvbSBmcm9tICcuLi91dGlscy9kb20uanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IHRvVGl0bGVDYXNlIGZyb20gJy4uL3V0aWxzL3RvLXRpdGxlLWNhc2UuanMnO1xuXG4vKipcbiAqIEEgYnV0dG9uIGNsYXNzIHdpdGggYSBwb3B1cCBtZW51XG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQnV0dG9uXG4gKiBAY2xhc3MgTWVudUJ1dHRvblxuICovXG5jbGFzcyBNZW51QnV0dG9uIGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnM9e30pe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgdGhpcy5lbmFibGVkXyA9IHRydWU7XG5cbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGFzcG9wdXAnLCAndHJ1ZScpO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdtZW51aXRlbScpO1xuICAgIHRoaXMub24oJ2tleWRvd24nLCB0aGlzLmhhbmRsZVN1Ym1lbnVLZXlQcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIG1lbnVcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICBsZXQgbWVudSA9IHRoaXMuY3JlYXRlTWVudSgpO1xuXG4gICAgaWYgKHRoaXMubWVudSkge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLm1lbnUpO1xuICAgIH1cblxuICAgIHRoaXMubWVudSA9IG1lbnU7XG4gICAgdGhpcy5hZGRDaGlsZChtZW51KTtcblxuICAgIC8qKlxuICAgICAqIFRyYWNrIHRoZSBzdGF0ZSBvZiB0aGUgbWVudSBidXR0b25cbiAgICAgKlxuICAgICAqIEB0eXBlIHtCb29sZWFufVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5idXR0b25QcmVzc2VkXyA9IGZhbHNlO1xuICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuXG4gICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgbWVudVxuICAgKlxuICAgKiBAcmV0dXJuIHtNZW51fSBUaGUgY29uc3RydWN0ZWQgbWVudVxuICAgKiBAbWV0aG9kIGNyZWF0ZU1lbnVcbiAgICovXG4gIGNyZWF0ZU1lbnUoKSB7XG4gICAgdmFyIG1lbnUgPSBuZXcgTWVudSh0aGlzLnBsYXllcl8pO1xuXG4gICAgLy8gQWRkIGEgdGl0bGUgbGlzdCBpdGVtIHRvIHRoZSB0b3BcbiAgICBpZiAodGhpcy5vcHRpb25zXy50aXRsZSkge1xuICAgICAgbGV0IHRpdGxlID0gRG9tLmNyZWF0ZUVsKCdsaScsIHtcbiAgICAgICAgY2xhc3NOYW1lOiAndmpzLW1lbnUtdGl0bGUnLFxuICAgICAgICBpbm5lckhUTUw6IHRvVGl0bGVDYXNlKHRoaXMub3B0aW9uc18udGl0bGUpLFxuICAgICAgICB0YWJJbmRleDogLTFcbiAgICAgIH0pO1xuICAgICAgbWVudS5jaGlsZHJlbl8udW5zaGlmdCh0aXRsZSk7XG4gICAgICBEb20uaW5zZXJ0RWxGaXJzdCh0aXRsZSwgbWVudS5jb250ZW50RWwoKSk7XG4gICAgfVxuXG4gICAgdGhpcy5pdGVtcyA9IHRoaXNbJ2NyZWF0ZUl0ZW1zJ10oKTtcblxuICAgIGlmICh0aGlzLml0ZW1zKSB7XG4gICAgICAvLyBBZGQgbWVudSBpdGVtcyB0byB0aGUgbWVudVxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLml0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1lbnUuYWRkSXRlbSh0aGlzLml0ZW1zW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVudTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGxpc3Qgb2YgbWVudSBpdGVtcy4gU3BlY2lmaWMgdG8gZWFjaCBzdWJjbGFzcy5cbiAgICpcbiAgICogQG1ldGhvZCBjcmVhdGVJdGVtc1xuICAgKi9cbiAgY3JlYXRlSXRlbXMoKXt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNvbnN0cnVjdGVkIGNsYXNzIG5hbWVcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHZhciBtZW51QnV0dG9uQ2xhc3MgPSAndmpzLW1lbnUtYnV0dG9uJztcblxuICAgIC8vIElmIHRoZSBpbmxpbmUgb3B0aW9uIGlzIHBhc3NlZCwgd2Ugd2FudCB0byB1c2UgZGlmZmVyZW50IHN0eWxlcyBhbHRvZ2V0aGVyLlxuICAgIGlmICh0aGlzLm9wdGlvbnNfLmlubGluZSA9PT0gdHJ1ZSkge1xuICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctaW5saW5lJztcbiAgICB9IGVsc2Uge1xuICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctcG9wdXAnO1xuICAgIH1cblxuICAgIHJldHVybiBgdmpzLW1lbnUtYnV0dG9uICR7bWVudUJ1dHRvbkNsYXNzfSAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4geW91IGNsaWNrIHRoZSBidXR0b24gaXQgYWRkcyBmb2N1cywgd2hpY2hcbiAgICogd2lsbCBzaG93IHRoZSBtZW51IGluZGVmaW5pdGVseS5cbiAgICogU28gd2UnbGwgcmVtb3ZlIGZvY3VzIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgYnV0dG9uLlxuICAgKiBGb2N1cyBpcyBuZWVkZWQgZm9yIHRhYiBuYXZpZ2F0aW9uLlxuICAgKiBBbGxvdyBzdWIgY29tcG9uZW50cyB0byBzdGFjayBDU1MgY2xhc3MgbmFtZXNcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVDbGlja1xuICAgKi9cbiAgaGFuZGxlQ2xpY2soKSB7XG4gICAgdGhpcy5vbmUoJ21vdXNlb3V0JywgRm4uYmluZCh0aGlzLCBmdW5jdGlvbigpe1xuICAgICAgdGhpcy5tZW51LnVubG9ja1Nob3dpbmcoKTtcbiAgICAgIHRoaXMuZWxfLmJsdXIoKTtcbiAgICB9KSk7XG4gICAgaWYgKHRoaXMuYnV0dG9uUHJlc3NlZF8pe1xuICAgICAgdGhpcy51bnByZXNzQnV0dG9uKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJlc3NCdXR0b24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleSBwcmVzcyBvbiBtZW51XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBLZXkgcHJlc3MgZXZlbnRcbiAgICogQG1ldGhvZCBoYW5kbGVLZXlQcmVzc1xuICAgKi9cbiAgaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIEVzY2FwZSAoMjcpIGtleSBvciBUYWIgKDkpIGtleSB1bnByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMjcgfHwgZXZlbnQud2hpY2ggPT09IDkpIHtcbiAgICAgIGlmICh0aGlzLmJ1dHRvblByZXNzZWRfKSB7XG4gICAgICAgIHRoaXMudW5wcmVzc0J1dHRvbigpO1xuICAgICAgfVxuICAgICAgLy8gRG9uJ3QgcHJldmVudERlZmF1bHQgZm9yIFRhYiBrZXkgLSB3ZSBzdGlsbCB3YW50IHRvIGxvc2UgZm9jdXNcbiAgICAgIGlmIChldmVudC53aGljaCAhPT0gOSkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIC8vIFVwICgzOCkga2V5IG9yIERvd24gKDQwKSBrZXkgcHJlc3MgdGhlICdidXR0b24nXG4gICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PT0gMzggfHwgZXZlbnQud2hpY2ggPT09IDQwKSB7XG4gICAgICBpZiAoIXRoaXMuYnV0dG9uUHJlc3NlZF8pIHtcbiAgICAgICAgdGhpcy5wcmVzc0J1dHRvbigpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5oYW5kbGVLZXlQcmVzcyhldmVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXkgcHJlc3Mgb24gc3VibWVudVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgS2V5IHByZXNzIGV2ZW50XG4gICAqIEBtZXRob2QgaGFuZGxlU3VibWVudUtleVByZXNzXG4gICAqL1xuICBoYW5kbGVTdWJtZW51S2V5UHJlc3MoZXZlbnQpIHtcblxuICAgIC8vIEVzY2FwZSAoMjcpIGtleSBvciBUYWIgKDkpIGtleSB1bnByZXNzIHRoZSAnYnV0dG9uJ1xuICAgIGlmIChldmVudC53aGljaCA9PT0gMjcgfHwgZXZlbnQud2hpY2ggPT09IDkpe1xuICAgICAgaWYgKHRoaXMuYnV0dG9uUHJlc3NlZF8pe1xuICAgICAgICB0aGlzLnVucHJlc3NCdXR0b24oKTtcbiAgICAgIH1cbiAgICAgIC8vIERvbid0IHByZXZlbnREZWZhdWx0IGZvciBUYWIga2V5IC0gd2Ugc3RpbGwgd2FudCB0byBsb3NlIGZvY3VzXG4gICAgICBpZiAoZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZXMgY2hhbmdlcyBiYXNlZCBvbiBidXR0b24gcHJlc3NlZFxuICAgKlxuICAgKiBAbWV0aG9kIHByZXNzQnV0dG9uXG4gICAqL1xuICBwcmVzc0J1dHRvbigpIHtcbiAgICBpZiAodGhpcy5lbmFibGVkXykge1xuICAgICAgdGhpcy5idXR0b25QcmVzc2VkXyA9IHRydWU7XG4gICAgICB0aGlzLm1lbnUubG9ja1Nob3dpbmcoKTtcbiAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICB0aGlzLm1lbnUuZm9jdXMoKTsgLy8gc2V0IHRoZSBmb2N1cyBpbnRvIHRoZSBzdWJtZW51XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2VzIGNoYW5nZXMgYmFzZWQgb24gYnV0dG9uIHVucHJlc3NlZFxuICAgKlxuICAgKiBAbWV0aG9kIHVucHJlc3NCdXR0b25cbiAgICovXG4gIHVucHJlc3NCdXR0b24oKSB7XG4gICAgaWYgKHRoaXMuZW5hYmxlZF8pIHtcbiAgICAgIHRoaXMuYnV0dG9uUHJlc3NlZF8gPSBmYWxzZTtcbiAgICAgIHRoaXMubWVudS51bmxvY2tTaG93aW5nKCk7XG4gICAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgIHRoaXMuZWxfLmZvY3VzKCk7IC8vIFNldCBmb2N1cyBiYWNrIHRvIHRoaXMgbWVudSBidXR0b25cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzYWJsZSB0aGUgbWVudSBidXR0b25cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIGRpc2FibGVcbiAgICovXG4gIGRpc2FibGUoKSB7XG4gICAgLy8gVW5wcmVzcywgYnV0IGRvbid0IGZvcmNlIGZvY3VzIG9uIHRoaXMgYnV0dG9uXG4gICAgdGhpcy5idXR0b25QcmVzc2VkXyA9IGZhbHNlO1xuICAgIHRoaXMubWVudS51bmxvY2tTaG93aW5nKCk7XG4gICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG5cbiAgICB0aGlzLmVuYWJsZWRfID0gZmFsc2U7XG5cbiAgICByZXR1cm4gc3VwZXIuZGlzYWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZSB0aGUgbWVudSBidXR0b25cbiAgICpcbiAgICogQHJldHVybiB7Q29tcG9uZW50fVxuICAgKiBAbWV0aG9kIGRpc2FibGVcbiAgICovXG4gIGVuYWJsZSgpIHtcbiAgICB0aGlzLmVuYWJsZWRfID0gdHJ1ZTtcblxuICAgIHJldHVybiBzdXBlci5lbmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gaGFuZGxlciBmb3IgdGhlIHRvb2x0aXBcbiAgICpcbiAgICogQHJldHVybiB7T2JqZWN0fSBEb20gZWxlbWVudCB0byBzZXJ2ZSBhcyBhIGhhbmRsZXIgZm9yIHRoZSB0b29sdGlwXG4gICAqIEBtZXRob2QgdG9vbHRpcEhhbmRsZXJcbiAgICovXG4gIHRvb2x0aXBIYW5kbGVyKCkge1xuICAgIC8vIFRPRE86IEZpeCBtZW51IGJ1dHRvbiB0byBoYXZlIGEgcmVhbCBpY29uIGVsZW1lbnQgdG8gbWFrZSBpdCBhcyB0b29sdGlwIGhhbmRsZXJcbiAgICByZXR1cm47XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdNZW51QnV0dG9uJywgTWVudUJ1dHRvbik7XG5leHBvcnQgZGVmYXVsdCBNZW51QnV0dG9uO1xuIl19
},{"../clickable-component.js":64,"../component.js":66,"../utils/dom.js":144,"../utils/fn.js":146,"../utils/to-title-case.js":153,"./menu.js":111}],110:[function(_dereq_,module,exports){
/**
* @file menu-item.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _clickableComponentJs = _dereq_('../clickable-component.js');
var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* The component for a menu item. `
`
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class MenuItem
*/
var MenuItem = (function (_ClickableComponent) {
_inherits(MenuItem, _ClickableComponent);
function MenuItem(player, options) {
_classCallCheck(this, MenuItem);
_ClickableComponent.call(this, player, options);
this.selectable = options['selectable'];
this.selected(options['selected']);
if (this.selectable) {
// TODO: May need to be either menuitemcheckbox or menuitemradio,
// and may need logical grouping of menu items.
this.el_.setAttribute('role', 'menuitemcheckbox');
} else {
this.el_.setAttribute('role', 'menuitem');
}
}
/**
* Create the component's DOM element
*
* @param {String=} type Desc
* @param {Object=} props Desc
* @return {Element}
* @method createEl
*/
MenuItem.prototype.createEl = function createEl(type, props, attrs) {
return _ClickableComponent.prototype.createEl.call(this, 'li', _objectAssign2['default']({
className: 'vjs-menu-item',
innerHTML: this.localize(this.options_['label']),
tabIndex: -1
}, props), attrs);
};
/**
* Handle a click on the menu item, and set it to selected
*
* @method handleClick
*/
MenuItem.prototype.handleClick = function handleClick() {
this.selected(true);
};
/**
* Set this menu item as selected or not
*
* @param {Boolean} selected
* @method selected
*/
MenuItem.prototype.selected = function selected(_selected) {
if (this.selectable) {
if (_selected) {
this.addClass('vjs-selected');
this.el_.setAttribute('aria-checked', 'true');
// aria-checked isn't fully supported by browsers/screen readers,
// so indicate selected state to screen reader in the control text.
this.controlText(', selected');
} else {
this.removeClass('vjs-selected');
this.el_.setAttribute('aria-checked', 'false');
// Indicate un-selected state to screen reader
// Note that a space clears out the selected state text
this.controlText(' ');
}
}
};
/**
* Return handler for the tooltip
*
* @return {Object} Dom element to serve as a handler for the tooltip
* @method tooltipHandler
*/
MenuItem.prototype.tooltipHandler = function tooltipHandler() {
if (this.options_.tooltip !== undefined) {
return _ClickableComponent.prototype.tooltipHandler.call(this);
}
};
return MenuItem;
})(_clickableComponentJs2['default']);
_componentJs2['default'].registerComponent('MenuItem', MenuItem);
exports['default'] = MenuItem;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9tZW51L21lbnUtaXRlbS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O29DQUcrQiwyQkFBMkI7Ozs7MkJBQ3BDLGlCQUFpQjs7Ozs0QkFDcEIsZUFBZTs7Ozs7Ozs7Ozs7OztJQVU1QixRQUFRO1lBQVIsUUFBUTs7QUFFRCxXQUZQLFFBQVEsQ0FFQSxNQUFNLEVBQUUsT0FBTyxFQUFFOzBCQUZ6QixRQUFROztBQUdWLG1DQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7O0FBRXhDLFFBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7O0FBRW5DLFFBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTs7O0FBR25CLFVBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0tBQ25ELE1BQU07QUFDTCxVQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FDM0M7R0FDRjs7Ozs7Ozs7Ozs7QUFoQkcsVUFBUSxXQTBCWixRQUFRLEdBQUEsa0JBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUU7QUFDM0IsV0FBTyw4QkFBTSxRQUFRLEtBQUEsT0FBQyxJQUFJLEVBQUUsMEJBQU87QUFDakMsZUFBUyxFQUFFLGVBQWU7QUFDMUIsZUFBUyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNoRCxjQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ2IsRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztHQUNuQjs7Ozs7Ozs7QUFoQ0csVUFBUSxXQXVDWixXQUFXLEdBQUEsdUJBQUc7QUFDWixRQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQ3JCOzs7Ozs7Ozs7QUF6Q0csVUFBUSxXQWlEWixRQUFRLEdBQUEsa0JBQUMsU0FBUSxFQUFFO0FBQ2pCLFFBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNuQixVQUFJLFNBQVEsRUFBRTtBQUNaLFlBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDOUIsWUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFDLE1BQU0sQ0FBQyxDQUFDOzs7QUFHN0MsWUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztPQUNoQyxNQUFNO0FBQ0wsWUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqQyxZQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUMsT0FBTyxDQUFDLENBQUM7OztBQUc5QyxZQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO09BQ3ZCO0tBQ0Y7R0FDRjs7Ozs7Ozs7O0FBakVHLFVBQVEsV0F5RVosY0FBYyxHQUFBLDBCQUFHO0FBQ2YsUUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sS0FBSyxTQUFTLEVBQUU7QUFDdkMsYUFBTyw4QkFBTSxjQUFjLEtBQUEsTUFBRSxDQUFDO0tBQy9CO0dBQ0Y7O1NBN0VHLFFBQVE7OztBQWlGZCx5QkFBVSxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7cUJBQ25DLFFBQVEiLCJmaWxlIjoic3JjL2pzL21lbnUvbWVudS1pdGVtLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBtZW51LWl0ZW0uanNcbiAqL1xuaW1wb3J0IENsaWNrYWJsZUNvbXBvbmVudCBmcm9tICcuLi9jbGlja2FibGUtY29tcG9uZW50LmpzJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LmFzc2lnbic7XG5cbi8qKlxuICogVGhlIGNvbXBvbmVudCBmb3IgYSBtZW51IGl0ZW0uIGA8bGk+YFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIEJ1dHRvblxuICogQGNsYXNzIE1lbnVJdGVtXG4gKi9cbmNsYXNzIE1lbnVJdGVtIGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgdGhpcy5zZWxlY3RhYmxlID0gb3B0aW9uc1snc2VsZWN0YWJsZSddO1xuXG4gICAgdGhpcy5zZWxlY3RlZChvcHRpb25zWydzZWxlY3RlZCddKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIC8vIFRPRE86IE1heSBuZWVkIHRvIGJlIGVpdGhlciBtZW51aXRlbWNoZWNrYm94IG9yIG1lbnVpdGVtcmFkaW8sXG4gICAgICAvLyAgICAgICBhbmQgbWF5IG5lZWQgbG9naWNhbCBncm91cGluZyBvZiBtZW51IGl0ZW1zLlxuICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtY2hlY2tib3gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ21lbnVpdGVtJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmc9fSB0eXBlIERlc2NcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wcyBEZXNjXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKHR5cGUsIHByb3BzLCBhdHRycykge1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVFbCgnbGknLCBhc3NpZ24oe1xuICAgICAgY2xhc3NOYW1lOiAndmpzLW1lbnUtaXRlbScsXG4gICAgICBpbm5lckhUTUw6IHRoaXMubG9jYWxpemUodGhpcy5vcHRpb25zX1snbGFiZWwnXSksXG4gICAgICB0YWJJbmRleDogLTFcbiAgICB9LCBwcm9wcyksIGF0dHJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYSBjbGljayBvbiB0aGUgbWVudSBpdGVtLCBhbmQgc2V0IGl0IHRvIHNlbGVjdGVkXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlQ2xpY2tcbiAgICovXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIHRoaXMuc2VsZWN0ZWQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoaXMgbWVudSBpdGVtIGFzIHNlbGVjdGVkIG9yIG5vdFxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBzZWxlY3RlZFxuICAgKiBAbWV0aG9kIHNlbGVjdGVkXG4gICAqL1xuICBzZWxlY3RlZChzZWxlY3RlZCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtc2VsZWN0ZWQnKTtcbiAgICAgICAgdGhpcy5lbF8uc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCd0cnVlJyk7XG4gICAgICAgIC8vIGFyaWEtY2hlY2tlZCBpc24ndCBmdWxseSBzdXBwb3J0ZWQgYnkgYnJvd3NlcnMvc2NyZWVuIHJlYWRlcnMsXG4gICAgICAgIC8vIHNvIGluZGljYXRlIHNlbGVjdGVkIHN0YXRlIHRvIHNjcmVlbiByZWFkZXIgaW4gdGhlIGNvbnRyb2wgdGV4dC5cbiAgICAgICAgdGhpcy5jb250cm9sVGV4dCgnLCBzZWxlY3RlZCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNlbGVjdGVkJyk7XG4gICAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywnZmFsc2UnKTtcbiAgICAgICAgLy8gSW5kaWNhdGUgdW4tc2VsZWN0ZWQgc3RhdGUgdG8gc2NyZWVuIHJlYWRlclxuICAgICAgICAvLyBOb3RlIHRoYXQgYSBzcGFjZSBjbGVhcnMgb3V0IHRoZSBzZWxlY3RlZCBzdGF0ZSB0ZXh0XG4gICAgICAgIHRoaXMuY29udHJvbFRleHQoJyAnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGhhbmRsZXIgZm9yIHRoZSB0b29sdGlwXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gRG9tIGVsZW1lbnQgdG8gc2VydmUgYXMgYSBoYW5kbGVyIGZvciB0aGUgdG9vbHRpcFxuICAgKiBAbWV0aG9kIHRvb2x0aXBIYW5kbGVyXG4gICAqL1xuICB0b29sdGlwSGFuZGxlcigpIHtcbiAgICBpZiAodGhpcy5vcHRpb25zXy50b29sdGlwICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBzdXBlci50b29sdGlwSGFuZGxlcigpO1xuICAgIH1cbiAgfVxuXG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudUl0ZW0nLCBNZW51SXRlbSk7XG5leHBvcnQgZGVmYXVsdCBNZW51SXRlbTtcbiJdfQ==
},{"../clickable-component.js":64,"../component.js":66,"object.assign":53}],111:[function(_dereq_,module,exports){
/**
* @file menu.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsEventsJs = _dereq_('../utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
/**
* The Menu component is used to build pop up menus, including subtitle and
* captions selection menus.
*
* @extends Component
* @class Menu
*/
var Menu = (function (_Component) {
_inherits(Menu, _Component);
function Menu(player, options) {
_classCallCheck(this, Menu);
_Component.call(this, player, options);
this.focusedChild_ = -1;
this.on('keydown', this.handleKeyPress);
}
/**
* Add a menu item to the menu
*
* @param {Object|String} component Component or component type to add
* @method addItem
*/
Menu.prototype.addItem = function addItem(component) {
this.addChild(component);
component.on('click', Fn.bind(this, function () {
this.unlockShowing();
//TODO: Need to set keyboard focus back to the menuButton
}));
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Menu.prototype.createEl = function createEl() {
var contentElType = this.options_.contentElType || 'ul';
this.contentEl_ = Dom.createEl(contentElType, {
className: 'vjs-menu-content'
});
this.contentEl_.setAttribute('role', 'menu');
var el = _Component.prototype.createEl.call(this, 'div', {
append: this.contentEl_,
className: 'vjs-menu'
});
el.setAttribute('role', 'presentation');
el.appendChild(this.contentEl_);
// Prevent clicks from bubbling up. Needed for Menu Buttons,
// where a click on the parent is significant
Events.on(el, 'click', function (event) {
event.preventDefault();
event.stopImmediatePropagation();
});
return el;
};
/**
* Handle key press for menu
*
* @param {Object} event Event object
* @method handleKeyPress
*/
Menu.prototype.handleKeyPress = function handleKeyPress(event) {
if (event.which === 37 || event.which === 40) {
// Left and Down Arrows
event.preventDefault();
this.stepForward();
} else if (event.which === 38 || event.which === 39) {
// Up and Right Arrows
event.preventDefault();
this.stepBack();
}
};
/**
* Move to next (lower) menu item for keyboard users
*
* @method stepForward
*/
Menu.prototype.stepForward = function stepForward() {
var stepChild = 0;
if (this.focusedChild_ !== undefined) {
stepChild = this.focusedChild_ + 1;
}
this.focus(stepChild);
};
/**
* Move to previous (higher) menu item for keyboard users
*
* @method stepBack
*/
Menu.prototype.stepBack = function stepBack() {
var stepChild = 0;
if (this.focusedChild_ !== undefined) {
stepChild = this.focusedChild_ - 1;
}
this.focus(stepChild);
};
/**
* Set focus on a menu item in the menu
*
* @param {Object|String} item Index of child item set focus on
* @method focus
*/
Menu.prototype.focus = function focus() {
var item = arguments.length <= 0 || arguments[0] === undefined ? 0 : arguments[0];
var children = this.children().slice();
var haveTitle = children.length && children[0].className && /vjs-menu-title/.test(children[0].className);
if (haveTitle) {
children.shift();
}
if (children.length > 0) {
if (item < 0) {
item = 0;
} else if (item >= children.length) {
item = children.length - 1;
}
this.focusedChild_ = item;
children[item].el_.focus();
}
};
return Menu;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Menu', Menu);
exports['default'] = Menu;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SSxDQUFDLENBQUM7cUJBQzNCLElBQUkiLCJmaWxlIjoic3JjL2pzL21lbnUvbWVudS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgbWVudS5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uL3V0aWxzL2ZuLmpzJztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuLi91dGlscy9ldmVudHMuanMnO1xuXG4vKipcbiAqIFRoZSBNZW51IGNvbXBvbmVudCBpcyB1c2VkIHRvIGJ1aWxkIHBvcCB1cCBtZW51cywgaW5jbHVkaW5nIHN1YnRpdGxlIGFuZFxuICogY2FwdGlvbnMgc2VsZWN0aW9uIG1lbnVzLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIE1lbnVcbiAqL1xuY2xhc3MgTWVudSBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IgKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmZvY3VzZWRDaGlsZF8gPSAtMTtcblxuICAgIHRoaXMub24oJ2tleWRvd24nLCB0aGlzLmhhbmRsZUtleVByZXNzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBtZW51IGl0ZW0gdG8gdGhlIG1lbnVcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R8U3RyaW5nfSBjb21wb25lbnQgQ29tcG9uZW50IG9yIGNvbXBvbmVudCB0eXBlIHRvIGFkZFxuICAgKiBAbWV0aG9kIGFkZEl0ZW1cbiAgICovXG4gIGFkZEl0ZW0oY29tcG9uZW50KSB7XG4gICAgdGhpcy5hZGRDaGlsZChjb21wb25lbnQpO1xuICAgIGNvbXBvbmVudC5vbignY2xpY2snLCBGbi5iaW5kKHRoaXMsIGZ1bmN0aW9uKCl7XG4gICAgICB0aGlzLnVubG9ja1Nob3dpbmcoKTtcbiAgICAgIC8vVE9ETzogTmVlZCB0byBzZXQga2V5Ym9hcmQgZm9jdXMgYmFjayB0byB0aGUgbWVudUJ1dHRvblxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIGxldCBjb250ZW50RWxUeXBlID0gdGhpcy5vcHRpb25zXy5jb250ZW50RWxUeXBlIHx8ICd1bCc7XG4gICAgdGhpcy5jb250ZW50RWxfID0gRG9tLmNyZWF0ZUVsKGNvbnRlbnRFbFR5cGUsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tZW51LWNvbnRlbnQnXG4gICAgfSk7XG4gICAgdGhpcy5jb250ZW50RWxfLnNldEF0dHJpYnV0ZSgncm9sZScsICdtZW51Jyk7XG4gICAgdmFyIGVsID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGFwcGVuZDogdGhpcy5jb250ZW50RWxfLFxuICAgICAgY2xhc3NOYW1lOiAndmpzLW1lbnUnXG4gICAgfSk7XG4gICAgZWwuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3ByZXNlbnRhdGlvbicpO1xuICAgIGVsLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsXyk7XG5cbiAgICAvLyBQcmV2ZW50IGNsaWNrcyBmcm9tIGJ1YmJsaW5nIHVwLiBOZWVkZWQgZm9yIE1lbnUgQnV0dG9ucyxcbiAgICAvLyB3aGVyZSBhIGNsaWNrIG9uIHRoZSBwYXJlbnQgaXMgc2lnbmlmaWNhbnRcbiAgICBFdmVudHMub24oZWwsICdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUga2V5IHByZXNzIGZvciBtZW51XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICogQG1ldGhvZCBoYW5kbGVLZXlQcmVzc1xuICAgKi9cbiAgaGFuZGxlS2V5UHJlc3MgKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAzNyB8fCBldmVudC53aGljaCA9PT0gNDApIHsgLy8gTGVmdCBhbmQgRG93biBBcnJvd3NcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0ZXBGb3J3YXJkKCk7XG4gICAgfSBlbHNlIGlmIChldmVudC53aGljaCA9PT0gMzggfHwgZXZlbnQud2hpY2ggPT09IDM5KSB7IC8vIFVwIGFuZCBSaWdodCBBcnJvd3NcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLnN0ZXBCYWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdG8gbmV4dCAobG93ZXIpIG1lbnUgaXRlbSBmb3Iga2V5Ym9hcmQgdXNlcnNcbiAgICpcbiAgICogQG1ldGhvZCBzdGVwRm9yd2FyZFxuICAgKi9cbiAgIHN0ZXBGb3J3YXJkICgpIHtcbiAgICAgbGV0IHN0ZXBDaGlsZCA9IDA7XG5cbiAgICAgaWYgKHRoaXMuZm9jdXNlZENoaWxkXyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfICsgMTtcbiAgICAgfVxuICAgICB0aGlzLmZvY3VzKHN0ZXBDaGlsZCk7XG4gICB9XG5cbiAgIC8qKlxuICAgICogTW92ZSB0byBwcmV2aW91cyAoaGlnaGVyKSBtZW51IGl0ZW0gZm9yIGtleWJvYXJkIHVzZXJzXG4gICAgKlxuICAgICogQG1ldGhvZCBzdGVwQmFja1xuICAgICovXG4gIHN0ZXBCYWNrICgpIHtcbiAgICBsZXQgc3RlcENoaWxkID0gMDtcblxuICAgIGlmICh0aGlzLmZvY3VzZWRDaGlsZF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgc3RlcENoaWxkID0gdGhpcy5mb2N1c2VkQ2hpbGRfIC0gMTtcbiAgICB9XG4gICAgdGhpcy5mb2N1cyhzdGVwQ2hpbGQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBmb2N1cyBvbiBhIG1lbnUgaXRlbSBpbiB0aGUgbWVudVxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGl0ZW0gSW5kZXggb2YgY2hpbGQgaXRlbSBzZXQgZm9jdXMgb25cbiAgICogQG1ldGhvZCBmb2N1c1xuICAgKi9cbiAgZm9jdXMgKGl0ZW0gPSAwKSB7XG4gICAgbGV0IGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbigpLnNsaWNlKCk7XG4gICAgbGV0IGhhdmVUaXRsZSA9IGNoaWxkcmVuLmxlbmd0aCAmJiBjaGlsZHJlblswXS5jbGFzc05hbWUgJiZcbiAgICAgIC92anMtbWVudS10aXRsZS8udGVzdChjaGlsZHJlblswXS5jbGFzc05hbWUpO1xuXG4gICAgaWYgKGhhdmVUaXRsZSkge1xuICAgICAgY2hpbGRyZW4uc2hpZnQoKTtcbiAgICB9XG5cbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGl0ZW0gPCAwKSB7XG4gICAgICAgIGl0ZW0gPSAwO1xuICAgICAgfSBlbHNlIGlmIChpdGVtID49IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICBpdGVtID0gY2hpbGRyZW4ubGVuZ3RoIC0gMTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5mb2N1c2VkQ2hpbGRfID0gaXRlbTtcblxuICAgICAgY2hpbGRyZW5baXRlbV0uZWxfLmZvY3VzKCk7XG4gICAgfVxuICB9XG59XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTWVudScsIE1lbnUpO1xuZXhwb3J0IGRlZmF1bHQgTWVudTtcbiJdfQ==
},{"../component.js":66,"../utils/dom.js":144,"../utils/events.js":145,"../utils/fn.js":146}],112:[function(_dereq_,module,exports){
/**
* @file modal-dialog.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _utilsDom = _dereq_('./utils/dom');
var Dom = _interopRequireWildcard(_utilsDom);
var _utilsFn = _dereq_('./utils/fn');
var Fn = _interopRequireWildcard(_utilsFn);
var _utilsLog = _dereq_('./utils/log');
var _utilsLog2 = _interopRequireDefault(_utilsLog);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _closeButton = _dereq_('./close-button');
var _closeButton2 = _interopRequireDefault(_closeButton);
var MODAL_CLASS_NAME = 'vjs-modal-dialog';
var ESC = 27;
/**
* The `ModalDialog` displays over the video and its controls, which blocks
* interaction with the player until it is closed.
*
* Modal dialogs include a "Close" button and will close when that button
* is activated - or when ESC is pressed anywhere.
*
* @extends Component
* @class ModalDialog
*/
var ModalDialog = (function (_Component) {
_inherits(ModalDialog, _Component);
/**
* Constructor for modals.
*
* @param {Player} player
* @param {Object} [options]
* @param {Mixed} [options.content=undefined]
* Provide customized content for this modal.
*
* @param {String} [options.description]
* A text description for the modal, primarily for accessibility.
*
* @param {Boolean} [options.fillAlways=false]
* Normally, modals are automatically filled only the first time
* they open. This tells the modal to refresh its content
* every time it opens.
*
* @param {String} [options.label]
* A text label for the modal, primarily for accessibility.
*
* @param {Boolean} [options.temporary=true]
* If `true`, the modal can only be opened once; it will be
* disposed as soon as it's closed.
*
* @param {Boolean} [options.uncloseable=false]
* If `true`, the user will not be able to close the modal
* through the UI in the normal ways. Programmatic closing is
* still possible.
*
*/
function ModalDialog(player, options) {
_classCallCheck(this, ModalDialog);
_Component.call(this, player, options);
this.opened_ = this.hasBeenOpened_ = this.hasBeenFilled_ = false;
this.closeable(!this.options_.uncloseable);
this.content(this.options_.content);
// Make sure the contentEl is defined AFTER any children are initialized
// because we only want the contents of the modal in the contentEl
// (not the UI elements like the close button).
this.contentEl_ = Dom.createEl('div', {
className: MODAL_CLASS_NAME + '-content'
}, {
role: 'document'
});
this.descEl_ = Dom.createEl('p', {
className: MODAL_CLASS_NAME + '-description vjs-offscreen',
id: this.el().getAttribute('aria-describedby')
});
Dom.textContent(this.descEl_, this.description());
this.el_.appendChild(this.descEl_);
this.el_.appendChild(this.contentEl_);
}
/*
* Modal dialog default options.
*
* @type {Object}
* @private
*/
/**
* Create the modal's DOM element
*
* @method createEl
* @return {Element}
*/
ModalDialog.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass(),
tabIndex: -1
}, {
'aria-describedby': this.id() + '_description',
'aria-hidden': 'true',
'aria-label': this.label(),
role: 'dialog'
});
};
/**
* Build the modal's CSS class.
*
* @method buildCSSClass
* @return {String}
*/
ModalDialog.prototype.buildCSSClass = function buildCSSClass() {
return MODAL_CLASS_NAME + ' vjs-hidden ' + _Component.prototype.buildCSSClass.call(this);
};
/**
* Handles key presses on the document, looking for ESC, which closes
* the modal.
*
* @method handleKeyPress
* @param {Event} e
*/
ModalDialog.prototype.handleKeyPress = function handleKeyPress(e) {
if (e.which === ESC && this.closeable()) {
this.close();
}
};
/**
* Returns the label string for this modal. Primarily used for accessibility.
*
* @return {String}
*/
ModalDialog.prototype.label = function label() {
return this.options_.label || this.localize('Modal Window');
};
/**
* Returns the description string for this modal. Primarily used for
* accessibility.
*
* @return {String}
*/
ModalDialog.prototype.description = function description() {
var desc = this.options_.description || this.localize('This is a modal window.');
// Append a universal closeability message if the modal is closeable.
if (this.closeable()) {
desc += ' ' + this.localize('This modal can be closed by pressing the Escape key or activating the close button.');
}
return desc;
};
/**
* Opens the modal.
*
* @method open
* @return {ModalDialog}
*/
ModalDialog.prototype.open = function open() {
if (!this.opened_) {
var player = this.player();
this.trigger('beforemodalopen');
this.opened_ = true;
// Fill content if the modal has never opened before and
// never been filled.
if (this.options_.fillAlways || !this.hasBeenOpened_ && !this.hasBeenFilled_) {
this.fill();
}
// If the player was playing, pause it and take note of its previously
// playing state.
this.wasPlaying_ = !player.paused();
if (this.wasPlaying_) {
player.pause();
}
if (this.closeable()) {
this.on(this.el_.ownerDocument, 'keydown', Fn.bind(this, this.handleKeyPress));
}
player.controls(false);
this.show();
this.el().setAttribute('aria-hidden', 'false');
this.trigger('modalopen');
this.hasBeenOpened_ = true;
}
return this;
};
/**
* Whether or not the modal is opened currently.
*
* @method opened
* @param {Boolean} [value]
* If given, it will open (`true`) or close (`false`) the modal.
*
* @return {Boolean}
*/
ModalDialog.prototype.opened = function opened(value) {
if (typeof value === 'boolean') {
this[value ? 'open' : 'close']();
}
return this.opened_;
};
/**
* Closes the modal.
*
* @method close
* @return {ModalDialog}
*/
ModalDialog.prototype.close = function close() {
if (this.opened_) {
var player = this.player();
this.trigger('beforemodalclose');
this.opened_ = false;
if (this.wasPlaying_) {
player.play();
}
if (this.closeable()) {
this.off(this.el_.ownerDocument, 'keydown', Fn.bind(this, this.handleKeyPress));
}
player.controls(true);
this.hide();
this.el().setAttribute('aria-hidden', 'true');
this.trigger('modalclose');
if (this.options_.temporary) {
this.dispose();
}
}
return this;
};
/**
* Whether or not the modal is closeable via the UI.
*
* @method closeable
* @param {Boolean} [value]
* If given as a Boolean, it will set the `closeable` option.
*
* @return {Boolean}
*/
ModalDialog.prototype.closeable = function closeable(value) {
if (typeof value === 'boolean') {
var closeable = this.closeable_ = !!value;
var _close = this.getChild('closeButton');
// If this is being made closeable and has no close button, add one.
if (closeable && !_close) {
// The close button should be a child of the modal - not its
// content element, so temporarily change the content element.
var temp = this.contentEl_;
this.contentEl_ = this.el_;
_close = this.addChild('closeButton');
this.contentEl_ = temp;
this.on(_close, 'close', this.close);
}
// If this is being made uncloseable and has a close button, remove it.
if (!closeable && _close) {
this.off(_close, 'close', this.close);
this.removeChild(_close);
_close.dispose();
}
}
return this.closeable_;
};
/**
* Fill the modal's content element with the modal's "content" option.
*
* The content element will be emptied before this change takes place.
*
* @method fill
* @return {ModalDialog}
*/
ModalDialog.prototype.fill = function fill() {
return this.fillWith(this.content());
};
/**
* Fill the modal's content element with arbitrary content.
*
* The content element will be emptied before this change takes place.
*
* @method fillWith
* @param {Mixed} [content]
* The same rules apply to this as apply to the `content` option.
*
* @return {ModalDialog}
*/
ModalDialog.prototype.fillWith = function fillWith(content) {
var contentEl = this.contentEl();
var parentEl = contentEl.parentNode;
var nextSiblingEl = contentEl.nextSibling;
this.trigger('beforemodalfill');
this.hasBeenFilled_ = true;
// Detach the content element from the DOM before performing
// manipulation to avoid modifying the live DOM multiple times.
parentEl.removeChild(contentEl);
this.empty();
Dom.insertContent(contentEl, content);
this.trigger('modalfill');
// Re-inject the re-filled content element.
if (nextSiblingEl) {
parentEl.insertBefore(contentEl, nextSiblingEl);
} else {
parentEl.appendChild(contentEl);
}
return this;
};
/**
* Empties the content element.
*
* This happens automatically anytime the modal is filled.
*
* @method empty
* @return {ModalDialog}
*/
ModalDialog.prototype.empty = function empty() {
this.trigger('beforemodalempty');
Dom.emptyEl(this.contentEl());
this.trigger('modalempty');
return this;
};
/**
* Gets or sets the modal content, which gets normalized before being
* rendered into the DOM.
*
* This does not update the DOM or fill the modal, but it is called during
* that process.
*
* @method content
* @param {Mixed} [value]
* If defined, sets the internal content value to be used on the
* next call(s) to `fill`. This value is normalized before being
* inserted. To "clear" the internal content value, pass `null`.
*
* @return {Mixed}
*/
ModalDialog.prototype.content = function content(value) {
if (typeof value !== 'undefined') {
this.content_ = value;
}
return this.content_;
};
return ModalDialog;
})(_component2['default']);
ModalDialog.prototype.options_ = {
temporary: true
};
_component2['default'].registerComponent('ModalDialog', ModalDialog);
exports['default'] = ModalDialog;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9tb2RhbC1kaWFsb2cuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O3dCQUdxQixhQUFhOztJQUF0QixHQUFHOzt1QkFDSyxZQUFZOztJQUFwQixFQUFFOzt3QkFDRSxhQUFhOzs7O3lCQUVQLGFBQWE7Ozs7MkJBQ1gsZ0JBQWdCOzs7O0FBRXhDLElBQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLENBQUM7QUFDNUMsSUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDOzs7Ozs7Ozs7Ozs7O0lBWVQsV0FBVztZQUFYLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBK0JKLFdBL0JQLFdBQVcsQ0ErQkgsTUFBTSxFQUFFLE9BQU8sRUFBRTswQkEvQnpCLFdBQVc7O0FBZ0NiLDBCQUFNLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2QixRQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7O0FBRWpFLFFBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQzNDLFFBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7Ozs7QUFLcEMsUUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtBQUNwQyxlQUFTLEVBQUssZ0JBQWdCLGFBQVU7S0FDekMsRUFBRTtBQUNELFVBQUksRUFBRSxVQUFVO0tBQ2pCLENBQUMsQ0FBQzs7QUFFSCxRQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFO0FBQy9CLGVBQVMsRUFBSyxnQkFBZ0IsK0JBQTRCO0FBQzFELFFBQUUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDO0tBQy9DLENB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UUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMzQixXQUFPLElBQUksQ0FBQztHQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF0VEcsYUFBVyxXQXVVZixPQUFPLEdBQUEsaUJBQUMsS0FBSyxFQUFFO0FBQ2IsUUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLEVBQUU7QUFDaEMsVUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7S0FDdkI7QUFDRCxXQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7R0FDdEI7O1NBNVVHLFdBQVc7OztBQXFWakIsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7QUFDL0IsV0FBUyxFQUFFLElBQUk7Q0FDaEIsQ0FBQzs7QUFFRix1QkFBVSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3pDLFdBQVciLCJmaWxlIjoic3JjL2pzL21vZGFsLWRpYWxvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgbW9kYWwtZGlhbG9nLmpzXG4gKi9cbmltcG9ydCAqIGFzIERvbSBmcm9tICcuL3V0aWxzL2RvbSc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuL3V0aWxzL2ZuJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCBDbG9zZUJ1dHRvbiBmcm9tICcuL2Nsb3NlLWJ1dHRvbic7XG5cbmNvbnN0IE1PREFMX0NMQVNTX05BTUUgPSAndmpzLW1vZGFsLWRpYWxvZyc7XG5jb25zdCBFU0MgPSAyNztcblxuLyoqXG4gKiBUaGUgYE1vZGFsRGlhbG9nYCBkaXNwbGF5cyBvdmVyIHRoZSB2aWRlbyBhbmQgaXRzIGNvbnRyb2xzLCB3aGljaCBibG9ja3NcbiAqIGludGVyYWN0aW9uIHdpdGggdGhlIHBsYXllciB1bnRpbCBpdCBpcyBjbG9zZWQuXG4gKlxuICogTW9kYWwgZGlhbG9ncyBpbmNsdWRlIGEgXCJDbG9zZVwiIGJ1dHRvbiBhbmQgd2lsbCBjbG9zZSB3aGVuIHRoYXQgYnV0dG9uXG4gKiBpcyBhY3RpdmF0ZWQgLSBvciB3aGVuIEVTQyBpcyBwcmVzc2VkIGFueXdoZXJlLlxuICpcbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIE1vZGFsRGlhbG9nXG4gKi9cbmNsYXNzIE1vZGFsRGlhbG9nIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IgZm9yIG1vZGFscy5cbiAgICpcbiAgICogQHBhcmFtICB7UGxheWVyfSBwbGF5ZXJcbiAgICogQHBhcmFtICB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtICB7TWl4ZWR9IFtvcHRpb25zLmNvbnRlbnQ9dW5kZWZpbmVkXVxuICAgKiAgICAgICAgIFByb3ZpZGUgY3VzdG9taXplZCBjb250ZW50IGZvciB0aGlzIG1vZGFsLlxuICAgKlxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IFtvcHRpb25zLmRlc2NyaXB0aW9uXVxuICAgKiAgICAgICAgIEEgdGV4dCBkZXNjcmlwdGlvbiBmb3IgdGhlIG1vZGFsLCBwcmltYXJpbHkgZm9yIGFjY2Vzc2liaWxpdHkuXG4gICAqXG4gICAqIEBwYXJhbSAge0Jvb2xlYW59IFtvcHRpb25zLmZpbGxBbHdheXM9ZmFsc2VdXG4gICAqICAgICAgICAgTm9ybWFsbHksIG1vZGFscyBhcmUgYXV0b21hdGljYWxseSBmaWxsZWQgb25seSB0aGUgZmlyc3QgdGltZVxuICAgKiAgICAgICAgIHRoZXkgb3Blbi4gVGhpcyB0ZWxscyB0aGUgbW9kYWwgdG8gcmVmcmVzaCBpdHMgY29udGVudFxuICAgKiAgICAgICAgIGV2ZXJ5IHRpbWUgaXQgb3BlbnMuXG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZ30gW29wdGlvbnMubGFiZWxdXG4gICAqICAgICAgICAgQSB0ZXh0IGxhYmVsIGZvciB0aGUgbW9kYWwsIHByaW1hcmlseSBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gW29wdGlvbnMudGVtcG9yYXJ5PXRydWVdXG4gICAqICAgICAgICAgSWYgYHRydWVgLCB0aGUgbW9kYWwgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2U7IGl0IHdpbGwgYmVcbiAgICogICAgICAgICBkaXNwb3NlZCBhcyBzb29uIGFzIGl0J3MgY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBbb3B0aW9ucy51bmNsb3NlYWJsZT1mYWxzZV1cbiAgICogICAgICAgICBJZiBgdHJ1ZWAsIHRoZSB1c2VyIHdpbGwgbm90IGJlIGFibGUgdG8gY2xvc2UgdGhlIG1vZGFsXG4gICAqICAgICAgICAgdGhyb3VnaCB0aGUgVUkgaW4gdGhlIG5vcm1hbCB3YXlzLiBQcm9ncmFtbWF0aWMgY2xvc2luZyBpc1xuICAgKiAgICAgICAgIHN0aWxsIHBvc3NpYmxlLlxuICAgKlxuICAgKi9cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKSB7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgICB0aGlzLm9wZW5lZF8gPSB0aGlzLmhhc0JlZW5PcGVuZWRfID0gdGhpcy5oYXNCZWVuRmlsbGVkXyA9IGZhbHNlO1xuXG4gICAgdGhpcy5jbG9zZWFibGUoIXRoaXMub3B0aW9uc18udW5jbG9zZWFibGUpO1xuICAgIHRoaXMuY29udGVudCh0aGlzLm9wdGlvbnNfLmNvbnRlbnQpO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoZSBjb250ZW50RWwgaXMgZGVmaW5lZCBBRlRFUiBhbnkgY2hpbGRyZW4gYXJlIGluaXRpYWxpemVkXG4gICAgLy8gYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdGhlIGNvbnRlbnRzIG9mIHRoZSBtb2RhbCBpbiB0aGUgY29udGVudEVsXG4gICAgLy8gKG5vdCB0aGUgVUkgZWxlbWVudHMgbGlrZSB0aGUgY2xvc2UgYnV0dG9uKS5cbiAgICB0aGlzLmNvbnRlbnRFbF8gPSBEb20uY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogYCR7TU9EQUxfQ0xBU1NfTkFNRX0tY29udGVudGBcbiAgICB9LCB7XG4gICAgICByb2xlOiAnZG9jdW1lbnQnXG4gICAgfSk7XG5cbiAgICB0aGlzLmRlc2NFbF8gPSBEb20uY3JlYXRlRWwoJ3AnLCB7XG4gICAgICBjbGFzc05hbWU6IGAke01PREFMX0NMQVNTX05BTUV9LWRlc2NyaXB0aW9uIHZqcy1vZmZzY3JlZW5gLFxuICAgICAgaWQ6IHRoaXMuZWwoKS5nZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKVxuICAgIH0pO1xuXG4gICAgRG9tLnRleHRDb250ZW50KHRoaXMuZGVzY0VsXywgdGhpcy5kZXNjcmlwdGlvbigpKTtcbiAgICB0aGlzLmVsXy5hcHBlbmRDaGlsZCh0aGlzLmRlc2NFbF8pO1xuICAgIHRoaXMuZWxfLmFwcGVuZENoaWxkKHRoaXMuY29udGVudEVsXyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBtb2RhbCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiB0aGlzLmJ1aWxkQ1NTQ2xhc3MoKSxcbiAgICAgIHRhYkluZGV4OiAtMVxuICAgIH0sIHtcbiAgICAgICdhcmlhLWRlc2NyaWJlZGJ5JzogYCR7dGhpcy5pZCgpfV9kZXNjcmlwdGlvbmAsXG4gICAgICAnYXJpYS1oaWRkZW4nOiAndHJ1ZScsXG4gICAgICAnYXJpYS1sYWJlbCc6IHRoaXMubGFiZWwoKSxcbiAgICAgIHJvbGU6ICdkaWFsb2cnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgdGhlIG1vZGFsJ3MgQ1NTIGNsYXNzLlxuICAgKlxuICAgKiBAbWV0aG9kIGJ1aWxkQ1NTQ2xhc3NcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgYnVpbGRDU1NDbGFzcygpIHtcbiAgICByZXR1cm4gYCR7TU9EQUxfQ0xBU1NfTkFNRX0gdmpzLWhpZGRlbiAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMga2V5IHByZXNzZXMgb24gdGhlIGRvY3VtZW50LCBsb29raW5nIGZvciBFU0MsIHdoaWNoIGNsb3Nlc1xuICAgKiB0aGUgbW9kYWwuXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlS2V5UHJlc3NcbiAgICogQHBhcmFtICB7RXZlbnR9IGVcbiAgICovXG4gIGhhbmRsZUtleVByZXNzKGUpIHtcbiAgICBpZiAoZS53aGljaCA9PT0gRVNDICYmIHRoaXMuY2xvc2VhYmxlKCkpIHtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGFiZWwgc3RyaW5nIGZvciB0aGlzIG1vZGFsLiBQcmltYXJpbHkgdXNlZCBmb3IgYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgbGFiZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc18ubGFiZWwgfHwgdGhpcy5sb2NhbGl6ZSgnTW9kYWwgV2luZG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGlzIG1vZGFsLiBQcmltYXJpbHkgdXNlZCBmb3JcbiAgICogYWNjZXNzaWJpbGl0eS5cbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKi9cbiAgZGVzY3JpcHRpb24oKSB7XG4gICAgbGV0IGRlc2MgPSB0aGlzLm9wdGlvbnNfLmRlc2NyaXB0aW9uIHx8IHRoaXMubG9jYWxpemUoJ1RoaXMgaXMgYSBtb2RhbCB3aW5kb3cuJyk7XG5cbiAgICAvLyBBcHBlbmQgYSB1bml2ZXJzYWwgY2xvc2VhYmlsaXR5IG1lc3NhZ2UgaWYgdGhlIG1vZGFsIGlzIGNsb3NlYWJsZS5cbiAgICBpZiAodGhpcy5jbG9zZWFibGUoKSkge1xuICAgICAgZGVzYyArPSAnICcgKyB0aGlzLmxvY2FsaXplKCdUaGlzIG1vZGFsIGNhbiBiZSBjbG9zZWQgYnkgcHJlc3NpbmcgdGhlIEVzY2FwZSBrZXkgb3IgYWN0aXZhdGluZyB0aGUgY2xvc2UgYnV0dG9uLicpO1xuICAgIH1cblxuICAgIHJldHVybiBkZXNjO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW5zIHRoZSBtb2RhbC5cbiAgICpcbiAgICogQG1ldGhvZCBvcGVuXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKi9cbiAgb3BlbigpIHtcbiAgICBpZiAoIXRoaXMub3BlbmVkXykge1xuICAgICAgbGV0IHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlbW9kYWxvcGVuJyk7XG4gICAgICB0aGlzLm9wZW5lZF8gPSB0cnVlO1xuXG4gICAgICAvLyBGaWxsIGNvbnRlbnQgaWYgdGhlIG1vZGFsIGhhcyBuZXZlciBvcGVuZWQgYmVmb3JlIGFuZFxuICAgICAgLy8gbmV2ZXIgYmVlbiBmaWxsZWQuXG4gICAgICBpZiAodGhpcy5vcHRpb25zXy5maWxsQWx3YXlzIHx8ICF0aGlzLmhhc0JlZW5PcGVuZWRfICYmICF0aGlzLmhhc0JlZW5GaWxsZWRfKSB7XG4gICAgICAgIHRoaXMuZmlsbCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcGxheWVyIHdhcyBwbGF5aW5nLCBwYXVzZSBpdCBhbmQgdGFrZSBub3RlIG9mIGl0cyBwcmV2aW91c2x5XG4gICAgICAvLyBwbGF5aW5nIHN0YXRlLlxuICAgICAgdGhpcy53YXNQbGF5aW5nXyA9ICFwbGF5ZXIucGF1c2VkKCk7XG5cbiAgICAgIGlmICh0aGlzLndhc1BsYXlpbmdfKSB7XG4gICAgICAgIHBsYXllci5wYXVzZSgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5jbG9zZWFibGUoKSkge1xuICAgICAgICB0aGlzLm9uKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gICAgICB9XG5cbiAgICAgIHBsYXllci5jb250cm9scyhmYWxzZSk7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICAgIHRoaXMuZWwoKS5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICB0aGlzLnRyaWdnZXIoJ21vZGFsb3BlbicpO1xuICAgICAgdGhpcy5oYXNCZWVuT3BlbmVkXyA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBtb2RhbCBpcyBvcGVuZWQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAbWV0aG9kIG9wZW5lZFxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBbdmFsdWVdXG4gICAqICAgICAgICAgSWYgZ2l2ZW4sIGl0IHdpbGwgb3BlbiAoYHRydWVgKSBvciBjbG9zZSAoYGZhbHNlYCkgdGhlIG1vZGFsLlxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgb3BlbmVkKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICB0aGlzW3ZhbHVlID8gJ29wZW4nIDogJ2Nsb3NlJ10oKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub3BlbmVkXztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIG1vZGFsLlxuICAgKlxuICAgKiBAbWV0aG9kIGNsb3NlXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKi9cbiAgY2xvc2UoKSB7XG4gICAgaWYgKHRoaXMub3BlbmVkXykge1xuICAgICAgbGV0IHBsYXllciA9IHRoaXMucGxheWVyKCk7XG5cbiAgICAgIHRoaXMudHJpZ2dlcignYmVmb3JlbW9kYWxjbG9zZScpO1xuICAgICAgdGhpcy5vcGVuZWRfID0gZmFsc2U7XG5cbiAgICAgIGlmICh0aGlzLndhc1BsYXlpbmdfKSB7XG4gICAgICAgIHBsYXllci5wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNsb3NlYWJsZSgpKSB7XG4gICAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZUtleVByZXNzKSk7XG4gICAgICB9XG5cbiAgICAgIHBsYXllci5jb250cm9scyh0cnVlKTtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgdGhpcy5lbCgpLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdtb2RhbGNsb3NlJyk7XG5cbiAgICAgIGlmICh0aGlzLm9wdGlvbnNfLnRlbXBvcmFyeSkge1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIG1vZGFsIGlzIGNsb3NlYWJsZSB2aWEgdGhlIFVJLlxuICAgKlxuICAgKiBAbWV0aG9kIGNsb3NlYWJsZVxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBbdmFsdWVdXG4gICAqICAgICAgICAgSWYgZ2l2ZW4gYXMgYSBCb29sZWFuLCBpdCB3aWxsIHNldCB0aGUgYGNsb3NlYWJsZWAgb3B0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKi9cbiAgY2xvc2VhYmxlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBsZXQgY2xvc2VhYmxlID0gdGhpcy5jbG9zZWFibGVfID0gISF2YWx1ZTtcbiAgICAgIGxldCBjbG9zZSA9IHRoaXMuZ2V0Q2hpbGQoJ2Nsb3NlQnV0dG9uJyk7XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYmVpbmcgbWFkZSBjbG9zZWFibGUgYW5kIGhhcyBubyBjbG9zZSBidXR0b24sIGFkZCBvbmUuXG4gICAgICBpZiAoY2xvc2VhYmxlICYmICFjbG9zZSkge1xuXG4gICAgICAgIC8vIFRoZSBjbG9zZSBidXR0b24gc2hvdWxkIGJlIGEgY2hpbGQgb2YgdGhlIG1vZGFsIC0gbm90IGl0c1xuICAgICAgICAvLyBjb250ZW50IGVsZW1lbnQsIHNvIHRlbXBvcmFyaWx5IGNoYW5nZSB0aGUgY29udGVudCBlbGVtZW50LlxuICAgICAgICBsZXQgdGVtcCA9IHRoaXMuY29udGVudEVsXztcbiAgICAgICAgdGhpcy5jb250ZW50RWxfID0gdGhpcy5lbF87XG4gICAgICAgIGNsb3NlID0gdGhpcy5hZGRDaGlsZCgnY2xvc2VCdXR0b24nKTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxfID0gdGVtcDtcbiAgICAgICAgdGhpcy5vbihjbG9zZSwgJ2Nsb3NlJywgdGhpcy5jbG9zZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgYmVpbmcgbWFkZSB1bmNsb3NlYWJsZSBhbmQgaGFzIGEgY2xvc2UgYnV0dG9uLCByZW1vdmUgaXQuXG4gICAgICBpZiAoIWNsb3NlYWJsZSAmJiBjbG9zZSkge1xuICAgICAgICB0aGlzLm9mZihjbG9zZSwgJ2Nsb3NlJywgdGhpcy5jbG9zZSk7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoY2xvc2UpO1xuICAgICAgICBjbG9zZS5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb3NlYWJsZV87XG4gIH1cblxuICAvKipcbiAgICogRmlsbCB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQgd2l0aCB0aGUgbW9kYWwncyBcImNvbnRlbnRcIiBvcHRpb24uXG4gICAqXG4gICAqIFRoZSBjb250ZW50IGVsZW1lbnQgd2lsbCBiZSBlbXB0aWVkIGJlZm9yZSB0aGlzIGNoYW5nZSB0YWtlcyBwbGFjZS5cbiAgICpcbiAgICogQG1ldGhvZCBmaWxsXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKi9cbiAgZmlsbCgpIHtcbiAgICByZXR1cm4gdGhpcy5maWxsV2l0aCh0aGlzLmNvbnRlbnQoKSk7XG4gIH1cblxuICAvKipcbiAgICogRmlsbCB0aGUgbW9kYWwncyBjb250ZW50IGVsZW1lbnQgd2l0aCBhcmJpdHJhcnkgY29udGVudC5cbiAgICpcbiAgICogVGhlIGNvbnRlbnQgZWxlbWVudCB3aWxsIGJlIGVtcHRpZWQgYmVmb3JlIHRoaXMgY2hhbmdlIHRha2VzIHBsYWNlLlxuICAgKlxuICAgKiBAbWV0aG9kIGZpbGxXaXRoXG4gICAqIEBwYXJhbSAge01peGVkfSBbY29udGVudF1cbiAgICogICAgICAgICBUaGUgc2FtZSBydWxlcyBhcHBseSB0byB0aGlzIGFzIGFwcGx5IHRvIHRoZSBgY29udGVudGAgb3B0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJuIHtNb2RhbERpYWxvZ31cbiAgICovXG4gIGZpbGxXaXRoKGNvbnRlbnQpIHtcbiAgICBsZXQgY29udGVudEVsID0gdGhpcy5jb250ZW50RWwoKTtcbiAgICBsZXQgcGFyZW50RWwgPSBjb250ZW50RWwucGFyZW50Tm9kZTtcbiAgICBsZXQgbmV4dFNpYmxpbmdFbCA9IGNvbnRlbnRFbC5uZXh0U2libGluZztcblxuICAgIHRoaXMudHJpZ2dlcignYmVmb3JlbW9kYWxmaWxsJyk7XG4gICAgdGhpcy5oYXNCZWVuRmlsbGVkXyA9IHRydWU7XG5cbiAgICAvLyBEZXRhY2ggdGhlIGNvbnRlbnQgZWxlbWVudCBmcm9tIHRoZSBET00gYmVmb3JlIHBlcmZvcm1pbmdcbiAgICAvLyBtYW5pcHVsYXRpb24gdG8gYXZvaWQgbW9kaWZ5aW5nIHRoZSBsaXZlIERPTSBtdWx0aXBsZSB0aW1lcy5cbiAgICBwYXJlbnRFbC5yZW1vdmVDaGlsZChjb250ZW50RWwpO1xuICAgIHRoaXMuZW1wdHkoKTtcbiAgICBEb20uaW5zZXJ0Q29udGVudChjb250ZW50RWwsIGNvbnRlbnQpO1xuICAgIHRoaXMudHJpZ2dlcignbW9kYWxmaWxsJyk7XG5cbiAgICAvLyBSZS1pbmplY3QgdGhlIHJlLWZpbGxlZCBjb250ZW50IGVsZW1lbnQuXG4gICAgaWYgKG5leHRTaWJsaW5nRWwpIHtcbiAgICAgIHBhcmVudEVsLmluc2VydEJlZm9yZShjb250ZW50RWwsIG5leHRTaWJsaW5nRWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChjb250ZW50RWwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtcHRpZXMgdGhlIGNvbnRlbnQgZWxlbWVudC5cbiAgICpcbiAgICogVGhpcyBoYXBwZW5zIGF1dG9tYXRpY2FsbHkgYW55dGltZSB0aGUgbW9kYWwgaXMgZmlsbGVkLlxuICAgKlxuICAgKiBAbWV0aG9kIGVtcHR5XG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKi9cbiAgZW1wdHkoKSB7XG4gICAgdGhpcy50cmlnZ2VyKCdiZWZvcmVtb2RhbGVtcHR5Jyk7XG4gICAgRG9tLmVtcHR5RWwodGhpcy5jb250ZW50RWwoKSk7XG4gICAgdGhpcy50cmlnZ2VyKCdtb2RhbGVtcHR5Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRoZSBtb2RhbCBjb250ZW50LCB3aGljaCBnZXRzIG5vcm1hbGl6ZWQgYmVmb3JlIGJlaW5nXG4gICAqIHJlbmRlcmVkIGludG8gdGhlIERPTS5cbiAgICpcbiAgICogVGhpcyBkb2VzIG5vdCB1cGRhdGUgdGhlIERPTSBvciBmaWxsIHRoZSBtb2RhbCwgYnV0IGl0IGlzIGNhbGxlZCBkdXJpbmdcbiAgICogdGhhdCBwcm9jZXNzLlxuICAgKlxuICAgKiBAbWV0aG9kIGNvbnRlbnRcbiAgICogQHBhcmFtICB7TWl4ZWR9IFt2YWx1ZV1cbiAgICogICAgICAgICBJZiBkZWZpbmVkLCBzZXRzIHRoZSBpbnRlcm5hbCBjb250ZW50IHZhbHVlIHRvIGJlIHVzZWQgb24gdGhlXG4gICAqICAgICAgICAgbmV4dCBjYWxsKHMpIHRvIGBmaWxsYC4gVGhpcyB2YWx1ZSBpcyBub3JtYWxpemVkIGJlZm9yZSBiZWluZ1xuICAgKiAgICAgICAgIGluc2VydGVkLiBUbyBcImNsZWFyXCIgdGhlIGludGVybmFsIGNvbnRlbnQgdmFsdWUsIHBhc3MgYG51bGxgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtNaXhlZH1cbiAgICovXG4gIGNvbnRlbnQodmFsdWUpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZW50XyA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb250ZW50XztcbiAgfVxufVxuXG4vKlxuICogTW9kYWwgZGlhbG9nIGRlZmF1bHQgb3B0aW9ucy5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0fVxuICogQHByaXZhdGVcbiAqL1xuTW9kYWxEaWFsb2cucHJvdG90eXBlLm9wdGlvbnNfID0ge1xuICB0ZW1wb3Jhcnk6IHRydWVcbn07XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnTW9kYWxEaWFsb2cnLCBNb2RhbERpYWxvZyk7XG5leHBvcnQgZGVmYXVsdCBNb2RhbERpYWxvZztcbiJdfQ==
},{"./close-button":65,"./component":66,"./utils/dom":144,"./utils/fn":146,"./utils/log":149}],113:[function(_dereq_,module,exports){
/**
* @file player.js
*/
// Subclasses Component
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsGuidJs = _dereq_('./utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsToTitleCaseJs = _dereq_('./utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
var _utilsBufferJs = _dereq_('./utils/buffer.js');
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
var _fullscreenApiJs = _dereq_('./fullscreen-api.js');
var _fullscreenApiJs2 = _interopRequireDefault(_fullscreenApiJs);
var _mediaErrorJs = _dereq_('./media-error.js');
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('./utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
var _tracksTextTrackListConverterJs = _dereq_('./tracks/text-track-list-converter.js');
var _tracksTextTrackListConverterJs2 = _interopRequireDefault(_tracksTextTrackListConverterJs);
var _tracksAudioTrackListJs = _dereq_('./tracks/audio-track-list.js');
var _tracksAudioTrackListJs2 = _interopRequireDefault(_tracksAudioTrackListJs);
var _tracksVideoTrackListJs = _dereq_('./tracks/video-track-list.js');
var _tracksVideoTrackListJs2 = _interopRequireDefault(_tracksVideoTrackListJs);
// Include required child components (importing also registers them)
var _techLoaderJs = _dereq_('./tech/loader.js');
var _techLoaderJs2 = _interopRequireDefault(_techLoaderJs);
var _posterImageJs = _dereq_('./poster-image.js');
var _posterImageJs2 = _interopRequireDefault(_posterImageJs);
var _tracksTextTrackDisplayJs = _dereq_('./tracks/text-track-display.js');
var _tracksTextTrackDisplayJs2 = _interopRequireDefault(_tracksTextTrackDisplayJs);
var _loadingSpinnerJs = _dereq_('./loading-spinner.js');
var _loadingSpinnerJs2 = _interopRequireDefault(_loadingSpinnerJs);
var _bigPlayButtonJs = _dereq_('./big-play-button.js');
var _bigPlayButtonJs2 = _interopRequireDefault(_bigPlayButtonJs);
var _controlBarControlBarJs = _dereq_('./control-bar/control-bar.js');
var _controlBarControlBarJs2 = _interopRequireDefault(_controlBarControlBarJs);
var _errorDisplayJs = _dereq_('./error-display.js');
var _errorDisplayJs2 = _interopRequireDefault(_errorDisplayJs);
var _tracksTextTrackSettingsJs = _dereq_('./tracks/text-track-settings.js');
var _tracksTextTrackSettingsJs2 = _interopRequireDefault(_tracksTextTrackSettingsJs);
var _modalDialog = _dereq_('./modal-dialog');
var _modalDialog2 = _interopRequireDefault(_modalDialog);
// Require html5 tech, at least for disposing the original video tag
var _techTechJs = _dereq_('./tech/tech.js');
var _techTechJs2 = _interopRequireDefault(_techTechJs);
var _techHtml5Js = _dereq_('./tech/html5.js');
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
/**
* An instance of the `Player` class is created when any of the Video.js setup methods are used to initialize a video.
* ```js
* var myPlayer = videojs('example_video_1');
* ```
* In the following example, the `data-setup` attribute tells the Video.js library to create a player instance when the library is ready.
* ```html
*
* ```
* After an instance has been created it can be accessed globally using `Video('example_video_1')`.
*
* @param {Element} tag The original video tag used for configuring options
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class Player
*/
var Player = (function (_Component) {
_inherits(Player, _Component);
/**
* player's constructor function
*
* @constructs
* @method init
* @param {Element} tag The original video tag used for configuring options
* @param {Object=} options Player options
* @param {Function=} ready Ready callback function
*/
function Player(tag, options, ready) {
var _this = this;
_classCallCheck(this, Player);
// Make sure tag ID exists
tag.id = tag.id || 'vjs_video_' + Guid.newGUID();
// Set Options
// The options argument overrides options set in the video tag
// which overrides globally set options.
// This latter part coincides with the load order
// (tag must exist before Player)
options = _objectAssign2['default'](Player.getTagSettings(tag), options);
// Delay the initialization of children because we need to set up
// player properties first, and can't use `this` before `super()`
options.initChildren = false;
// Same with creating the element
options.createEl = false;
// we don't want the player to report touch activity on itself
// see enableTouchActivity in Component
options.reportTouchActivity = false;
// Run base component initializing with new options
_Component.call(this, null, options, ready);
// if the global option object was accidentally blown away by
// someone, bail early with an informative error
if (!this.options_ || !this.options_.techOrder || !this.options_.techOrder.length) {
throw new Error('No techOrder specified. Did you overwrite ' + 'videojs.options instead of just changing the ' + 'properties you want to override?');
}
this.tag = tag; // Store the original tag used to set options
// Store the tag attributes used to restore html5 element
this.tagAttributes = tag && Dom.getElAttributes(tag);
// Update current language
this.language(this.options_.language);
// Update Supported Languages
if (options.languages) {
(function () {
// Normalise player option languages to lowercase
var languagesToLower = {};
Object.getOwnPropertyNames(options.languages).forEach(function (name) {
languagesToLower[name.toLowerCase()] = options.languages[name];
});
_this.languages_ = languagesToLower;
})();
} else {
this.languages_ = Player.prototype.options_.languages;
}
// Cache for video property values.
this.cache_ = {};
// Set poster
this.poster_ = options.poster || '';
// Set controls
this.controls_ = !!options.controls;
// Original tag settings stored in options
// now remove immediately so native controls don't flash.
// May be turned back on by HTML5 tech if nativeControlsForTouch is true
tag.controls = false;
/*
* Store the internal state of scrubbing
*
* @private
* @return {Boolean} True if the user is scrubbing
*/
this.scrubbing_ = false;
this.el_ = this.createEl();
// We also want to pass the original player options to each component and plugin
// as well so they don't need to reach back into the player for options later.
// We also need to do another copy of this.options_ so we don't end up with
// an infinite loop.
var playerOptionsCopy = _utilsMergeOptionsJs2['default'](this.options_);
// Load plugins
if (options.plugins) {
(function () {
var plugins = options.plugins;
Object.getOwnPropertyNames(plugins).forEach(function (name) {
if (typeof this[name] === 'function') {
this[name](plugins[name]);
} else {
_utilsLogJs2['default'].error('Unable to find plugin:', name);
}
}, _this);
})();
}
this.options_.playerOptions = playerOptionsCopy;
this.initChildren();
// Set isAudio based on whether or not an audio tag was used
this.isAudio(tag.nodeName.toLowerCase() === 'audio');
// Update controls className. Can't do this when the controls are initially
// set because the element doesn't exist yet.
if (this.controls()) {
this.addClass('vjs-controls-enabled');
} else {
this.addClass('vjs-controls-disabled');
}
// Set ARIA label and region role depending on player type
this.el_.setAttribute('role', 'region');
if (this.isAudio()) {
this.el_.setAttribute('aria-label', 'audio player');
} else {
this.el_.setAttribute('aria-label', 'video player');
}
if (this.isAudio()) {
this.addClass('vjs-audio');
}
if (this.flexNotSupported_()) {
this.addClass('vjs-no-flex');
}
// TODO: Make this smarter. Toggle user state between touching/mousing
// using events, since devices can have both touch and mouse events.
// if (browser.TOUCH_ENABLED) {
// this.addClass('vjs-touch-enabled');
// }
// iOS Safari has broken hover handling
if (!browser.IS_IOS) {
this.addClass('vjs-workinghover');
}
// Make player easily findable by ID
Player.players[this.id_] = this;
// When the player is first initialized, trigger activity so components
// like the control bar show themselves if needed
this.userActive(true);
this.reportUserActivity();
this.listenForUserActivity_();
this.on('fullscreenchange', this.handleFullscreenChange_);
this.on('stageclick', this.handleStageClick_);
}
/*
* Global player list
*
* @type {Object}
*/
/**
* Destroys the video player and does any necessary cleanup
* ```js
* myPlayer.dispose();
* ```
* This is especially helpful if you are dynamically adding and removing videos
* to/from the DOM.
*
* @method dispose
*/
Player.prototype.dispose = function dispose() {
this.trigger('dispose');
// prevent dispose from being called twice
this.off('dispose');
if (this.styleEl_ && this.styleEl_.parentNode) {
this.styleEl_.parentNode.removeChild(this.styleEl_);
}
// Kill reference to this player
Player.players[this.id_] = null;
if (this.tag && this.tag.player) {
this.tag.player = null;
}
if (this.el_ && this.el_.player) {
this.el_.player = null;
}
if (this.tech_) {
this.tech_.dispose();
}
_Component.prototype.dispose.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Player.prototype.createEl = function createEl() {
var el = this.el_ = _Component.prototype.createEl.call(this, 'div');
var tag = this.tag;
// Remove width/height attrs from tag so CSS can make it 100% width/height
tag.removeAttribute('width');
tag.removeAttribute('height');
// Copy over all the attributes from the tag, including ID and class
// ID will now reference player box, not the video tag
var attrs = Dom.getElAttributes(tag);
Object.getOwnPropertyNames(attrs).forEach(function (attr) {
// workaround so we don't totally break IE7
// http://stackoverflow.com/questions/3653444/css-styles-not-applied-on-dynamic-elements-in-internet-explorer-7
if (attr === 'class') {
el.className = attrs[attr];
} else {
el.setAttribute(attr, attrs[attr]);
}
});
// Update tag id/class for use as HTML5 playback tech
// Might think we should do this after embedding in container so .vjs-tech class
// doesn't flash 100% width/height, but class only applies with .video-js parent
tag.playerId = tag.id;
tag.id += '_html5_api';
tag.className = 'vjs-tech';
// Make player findable on elements
tag.player = el.player = this;
// Default state of video is paused
this.addClass('vjs-paused');
// Add a style element in the player that we'll use to set the width/height
// of the player in a way that's still overrideable by CSS, just like the
// video element
if (_globalWindow2['default'].VIDEOJS_NO_DYNAMIC_STYLE !== true) {
this.styleEl_ = stylesheet.createStyleElement('vjs-styles-dimensions');
var defaultsStyleEl = Dom.$('.vjs-styles-defaults');
var head = Dom.$('head');
head.insertBefore(this.styleEl_, defaultsStyleEl ? defaultsStyleEl.nextSibling : head.firstChild);
}
// Pass in the width/height/aspectRatio options which will update the style el
this.width(this.options_.width);
this.height(this.options_.height);
this.fluid(this.options_.fluid);
this.aspectRatio(this.options_.aspectRatio);
// Hide any links within the video/audio tag, because IE doesn't hide them completely.
var links = tag.getElementsByTagName('a');
for (var i = 0; i < links.length; i++) {
var linkEl = links.item(i);
Dom.addElClass(linkEl, 'vjs-hidden');
linkEl.setAttribute('hidden', 'hidden');
}
// insertElFirst seems to cause the networkState to flicker from 3 to 2, so
// keep track of the original for later so we can know if the source originally failed
tag.initNetworkState_ = tag.networkState;
// Wrap video tag in div (el/box) container
if (tag.parentNode) {
tag.parentNode.insertBefore(el, tag);
}
// insert the tag as the first child of the player element
// then manually add it to the children array so that this.addChild
// will work properly for other components
Dom.insertElFirst(tag, el); // Breaks iPhone, fixed in HTML5 setup.
this.children_.unshift(tag);
this.el_ = el;
return el;
};
/**
* Get/set player width
*
* @param {Number=} value Value for width
* @return {Number} Width when getting
* @method width
*/
Player.prototype.width = function width(value) {
return this.dimension('width', value);
};
/**
* Get/set player height
*
* @param {Number=} value Value for height
* @return {Number} Height when getting
* @method height
*/
Player.prototype.height = function height(value) {
return this.dimension('height', value);
};
/**
* Get/set dimension for player
*
* @param {String} dimension Either width or height
* @param {Number=} value Value for dimension
* @return {Component}
* @method dimension
*/
Player.prototype.dimension = function dimension(_dimension, value) {
var privDimension = _dimension + '_';
if (value === undefined) {
return this[privDimension] || 0;
}
if (value === '') {
// If an empty string is given, reset the dimension to be automatic
this[privDimension] = undefined;
} else {
var parsedVal = parseFloat(value);
if (isNaN(parsedVal)) {
_utilsLogJs2['default'].error('Improper value "' + value + '" supplied for for ' + _dimension);
return this;
}
this[privDimension] = parsedVal;
}
this.updateStyleEl_();
return this;
};
/**
* Add/remove the vjs-fluid class
*
* @param {Boolean} bool Value of true adds the class, value of false removes the class
* @method fluid
*/
Player.prototype.fluid = function fluid(bool) {
if (bool === undefined) {
return !!this.fluid_;
}
this.fluid_ = !!bool;
if (bool) {
this.addClass('vjs-fluid');
} else {
this.removeClass('vjs-fluid');
}
};
/**
* Get/Set the aspect ratio
*
* @param {String=} ratio Aspect ratio for player
* @return aspectRatio
* @method aspectRatio
*/
Player.prototype.aspectRatio = function aspectRatio(ratio) {
if (ratio === undefined) {
return this.aspectRatio_;
}
// Check for width:height format
if (!/^\d+\:\d+$/.test(ratio)) {
throw new Error('Improper value supplied for aspect ratio. The format should be width:height, for example 16:9.');
}
this.aspectRatio_ = ratio;
// We're assuming if you set an aspect ratio you want fluid mode,
// because in fixed mode you could calculate width and height yourself.
this.fluid(true);
this.updateStyleEl_();
};
/**
* Update styles of the player element (height, width and aspect ratio)
*
* @method updateStyleEl_
*/
Player.prototype.updateStyleEl_ = function updateStyleEl_() {
if (_globalWindow2['default'].VIDEOJS_NO_DYNAMIC_STYLE === true) {
var _width = typeof this.width_ === 'number' ? this.width_ : this.options_.width;
var _height = typeof this.height_ === 'number' ? this.height_ : this.options_.height;
var techEl = this.tech_ && this.tech_.el();
if (techEl) {
if (_width >= 0) {
techEl.width = _width;
}
if (_height >= 0) {
techEl.height = _height;
}
}
return;
}
var width = undefined;
var height = undefined;
var aspectRatio = undefined;
var idClass = undefined;
// The aspect ratio is either used directly or to calculate width and height.
if (this.aspectRatio_ !== undefined && this.aspectRatio_ !== 'auto') {
// Use any aspectRatio that's been specifically set
aspectRatio = this.aspectRatio_;
} else if (this.videoWidth()) {
// Otherwise try to get the aspect ratio from the video metadata
aspectRatio = this.videoWidth() + ':' + this.videoHeight();
} else {
// Or use a default. The video element's is 2:1, but 16:9 is more common.
aspectRatio = '16:9';
}
// Get the ratio as a decimal we can use to calculate dimensions
var ratioParts = aspectRatio.split(':');
var ratioMultiplier = ratioParts[1] / ratioParts[0];
if (this.width_ !== undefined) {
// Use any width that's been specifically set
width = this.width_;
} else if (this.height_ !== undefined) {
// Or calulate the width from the aspect ratio if a height has been set
width = this.height_ / ratioMultiplier;
} else {
// Or use the video's metadata, or use the video el's default of 300
width = this.videoWidth() || 300;
}
if (this.height_ !== undefined) {
// Use any height that's been specifically set
height = this.height_;
} else {
// Otherwise calculate the height from the ratio and the width
height = width * ratioMultiplier;
}
// Ensure the CSS class is valid by starting with an alpha character
if (/^[^a-zA-Z]/.test(this.id())) {
idClass = 'dimensions-' + this.id();
} else {
idClass = this.id() + '-dimensions';
}
// Ensure the right class is still on the player for the style element
this.addClass(idClass);
stylesheet.setTextContent(this.styleEl_, '\n .' + idClass + ' {\n width: ' + width + 'px;\n height: ' + height + 'px;\n }\n\n .' + idClass + '.vjs-fluid {\n padding-top: ' + ratioMultiplier * 100 + '%;\n }\n ');
};
/**
* Load the Media Playback Technology (tech)
* Load/Create an instance of playback technology including element and API methods
* And append playback element in player div.
*
* @param {String} techName Name of the playback technology
* @param {String} source Video source
* @method loadTech_
* @private
*/
Player.prototype.loadTech_ = function loadTech_(techName, source) {
// Pause and remove current playback technology
if (this.tech_) {
this.unloadTech_();
}
// get rid of the HTML5 video tag as soon as we are using another tech
if (techName !== 'Html5' && this.tag) {
_techTechJs2['default'].getTech('Html5').disposeMediaElement(this.tag);
this.tag.player = null;
this.tag = null;
}
this.techName_ = techName;
// Turn off API access because we're loading a new tech that might load asynchronously
this.isReady_ = false;
// Grab tech-specific options from player options and add source and parent element to use.
var techOptions = _objectAssign2['default']({
'nativeControlsForTouch': this.options_.nativeControlsForTouch,
'source': source,
'playerId': this.id(),
'techId': this.id() + '_' + techName + '_api',
'videoTracks': this.videoTracks_,
'textTracks': this.textTracks_,
'audioTracks': this.audioTracks_,
'autoplay': this.options_.autoplay,
'controls': this.options_.controls,
'preload': this.options_.preload,
'loop': this.options_.loop,
'muted': this.options_.muted,
'poster': this.poster(),
'language': this.language(),
'vtt.js': this.options_['vtt.js']
}, this.options_[techName.toLowerCase()]);
if (this.tag) {
techOptions.tag = this.tag;
}
if (source) {
this.currentType_ = source.type;
if (source.src === this.cache_.src && this.cache_.currentTime > 0) {
techOptions.startTime = this.cache_.currentTime;
}
this.cache_.src = source.src;
}
// Initialize tech instance
var techComponent = _techTechJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!techComponent) {
techComponent = _componentJs2['default'].getComponent(techName);
}
this.tech_ = new techComponent(techOptions);
// player.triggerReady is always async, so don't need this to be async
this.tech_.ready(Fn.bind(this, this.handleTechReady_), true);
_tracksTextTrackListConverterJs2['default'].jsonToTextTracks(this.textTracksJson_ || [], this.tech_);
// Listen to all HTML5-defined events and trigger them on the player
this.on(this.tech_, 'loadstart', this.handleTechLoadStart_);
this.on(this.tech_, 'waiting', this.handleTechWaiting_);
this.on(this.tech_, 'canplay', this.handleTechCanPlay_);
this.on(this.tech_, 'canplaythrough', this.handleTechCanPlayThrough_);
this.on(this.tech_, 'playing', this.handleTechPlaying_);
this.on(this.tech_, 'ended', this.handleTechEnded_);
this.on(this.tech_, 'seeking', this.handleTechSeeking_);
this.on(this.tech_, 'seeked', this.handleTechSeeked_);
this.on(this.tech_, 'play', this.handleTechPlay_);
this.on(this.tech_, 'firstplay', this.handleTechFirstPlay_);
this.on(this.tech_, 'pause', this.handleTechPause_);
this.on(this.tech_, 'progress', this.handleTechProgress_);
this.on(this.tech_, 'durationchange', this.handleTechDurationChange_);
this.on(this.tech_, 'fullscreenchange', this.handleTechFullscreenChange_);
this.on(this.tech_, 'error', this.handleTechError_);
this.on(this.tech_, 'suspend', this.handleTechSuspend_);
this.on(this.tech_, 'abort', this.handleTechAbort_);
this.on(this.tech_, 'emptied', this.handleTechEmptied_);
this.on(this.tech_, 'stalled', this.handleTechStalled_);
this.on(this.tech_, 'loadedmetadata', this.handleTechLoadedMetaData_);
this.on(this.tech_, 'loadeddata', this.handleTechLoadedData_);
this.on(this.tech_, 'timeupdate', this.handleTechTimeUpdate_);
this.on(this.tech_, 'ratechange', this.handleTechRateChange_);
this.on(this.tech_, 'volumechange', this.handleTechVolumeChange_);
this.on(this.tech_, 'texttrackchange', this.handleTechTextTrackChange_);
this.on(this.tech_, 'loadedmetadata', this.updateStyleEl_);
this.on(this.tech_, 'posterchange', this.handleTechPosterChange_);
// Add the tech element in the DOM if it was not already there
// Make sure to not insert the original video element if using Html5
if (this.tech_.el().parentNode !== this.el() && (techName !== 'Html5' || !this.tag)) {
Dom.insertElFirst(this.tech_.el(), this.el());
}
// Get rid of the original video tag reference after the first tech is loaded
if (this.tag) {
this.tag.player = null;
this.tag = null;
}
};
/**
* Unload playback technology
*
* @method unloadTech_
* @private
*/
Player.prototype.unloadTech_ = function unloadTech_() {
// Save the current text tracks so that we can reuse the same text tracks with the next tech
this.videoTracks_ = this.videoTracks();
this.textTracks_ = this.textTracks();
this.audioTracks_ = this.audioTracks();
this.textTracksJson_ = _tracksTextTrackListConverterJs2['default'].textTracksToJson(this.tech_);
this.isReady_ = false;
this.tech_.dispose();
this.tech_ = false;
};
/**
* Return a reference to the current tech.
* It will only return a reference to the tech if given an object with the
* `IWillNotUseThisInPlugins` property on it. This is try and prevent misuse
* of techs by plugins.
*
* @param {Object}
* @return {Object} The Tech
* @method tech
*/
Player.prototype.tech = function tech(safety) {
if (safety && safety.IWillNotUseThisInPlugins) {
return this.tech_;
}
var errorText = '\n Please make sure that you are not using this inside of a plugin.\n To disable this alert and error, please pass in an object with\n `IWillNotUseThisInPlugins` to the `tech` method. See\n https://github.com/videojs/video.js/issues/2617 for more info.\n ';
_globalWindow2['default'].alert(errorText);
throw new Error(errorText);
};
/**
* Set up click and touch listeners for the playback element
*
* On desktops, a click on the video itself will toggle playback,
* on a mobile device a click on the video toggles controls.
* (toggling controls is done by toggling the user state between active and
* inactive)
* A tap can signal that a user has become active, or has become inactive
* e.g. a quick tap on an iPhone movie should reveal the controls. Another
* quick tap should hide them again (signaling the user is in an inactive
* viewing state)
* In addition to this, we still want the user to be considered inactive after
* a few seconds of inactivity.
* Note: the only part of iOS interaction we can't mimic with this setup
* is a touch and hold on the video element counting as activity in order to
* keep the controls showing, but that shouldn't be an issue. A touch and hold
* on any controls will still keep the user active
*
* @private
* @method addTechControlsListeners_
*/
Player.prototype.addTechControlsListeners_ = function addTechControlsListeners_() {
// Make sure to remove all the previous listeners in case we are called multiple times.
this.removeTechControlsListeners_();
// Some browsers (Chrome & IE) don't trigger a click on a flash swf, but do
// trigger mousedown/up.
// http://stackoverflow.com/questions/1444562/javascript-onclick-event-over-flash-object
// Any touch events are set to block the mousedown event from happening
this.on(this.tech_, 'mousedown', this.handleTechClick_);
// If the controls were hidden we don't want that to change without a tap event
// so we'll check if the controls were already showing before reporting user
// activity
this.on(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.on(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.on(this.tech_, 'touchend', this.handleTechTouchEnd_);
// The tap listener needs to come after the touchend listener because the tap
// listener cancels out any reportedUserActivity when setting userActive(false)
this.on(this.tech_, 'tap', this.handleTechTap_);
};
/**
* Remove the listeners used for click and tap controls. This is needed for
* toggling to controls disabled, where a tap/touch should do nothing.
*
* @method removeTechControlsListeners_
* @private
*/
Player.prototype.removeTechControlsListeners_ = function removeTechControlsListeners_() {
// We don't want to just use `this.off()` because there might be other needed
// listeners added by techs that extend this.
this.off(this.tech_, 'tap', this.handleTechTap_);
this.off(this.tech_, 'touchstart', this.handleTechTouchStart_);
this.off(this.tech_, 'touchmove', this.handleTechTouchMove_);
this.off(this.tech_, 'touchend', this.handleTechTouchEnd_);
this.off(this.tech_, 'mousedown', this.handleTechClick_);
};
/**
* Player waits for the tech to be ready
*
* @method handleTechReady_
* @private
*/
Player.prototype.handleTechReady_ = function handleTechReady_() {
this.usingNativeControls(this.techGet_('controls'));
if (this.controls() && !this.usingNativeControls()) {
this.addTechControlsListeners_();
}
this.triggerReady();
// Keep the same volume as before
if (this.cache_.volume) {
this.techCall_('setVolume', this.cache_.volume);
}
// Look if the tech found a higher resolution poster while loading
this.handleTechPosterChange_();
// Update the duration if available
this.handleTechDurationChange_();
// Chrome and Safari both have issues with autoplay.
// In Safari (5.1.1), when we move the video element into the container div, autoplay doesn't work.
// In Chrome (15), if you have autoplay + a poster + no controls, the video gets hidden (but audio plays)
// This fixes both issues. Need to wait for API, so it updates displays correctly
if (this.src() && this.tag && this.options_.autoplay && this.paused()) {
delete this.tag.poster; // Chrome Fix. Fixed in Chrome v16.
this.play();
}
};
/**
* Fired when the user agent begins looking for media data
*
* @private
* @method handleTechLoadStart_
*/
Player.prototype.handleTechLoadStart_ = function handleTechLoadStart_() {
// TODO: Update to use `emptied` event instead. See #1277.
this.removeClass('vjs-ended');
this.removeClass('vjs-seeking');
// reset the error state
this.error(null);
// If it's already playing we want to trigger a firstplay event now.
// The firstplay event relies on both the play and loadstart events
// which can happen in any order for a new source
if (!this.paused()) {
this.trigger('loadstart');
this.trigger('firstplay');
} else {
// reset the hasStarted state
this.hasStarted(false);
this.trigger('loadstart');
}
};
/**
* Add/remove the vjs-has-started class
*
* @param {Boolean} hasStarted The value of true adds the class the value of false remove the class
* @return {Boolean} Boolean value if has started
* @private
* @method hasStarted
*/
Player.prototype.hasStarted = function hasStarted(_hasStarted) {
if (_hasStarted !== undefined) {
// only update if this is a new value
if (this.hasStarted_ !== _hasStarted) {
this.hasStarted_ = _hasStarted;
if (_hasStarted) {
this.addClass('vjs-has-started');
// trigger the firstplay event if this newly has played
this.trigger('firstplay');
} else {
this.removeClass('vjs-has-started');
}
}
return this;
}
return !!this.hasStarted_;
};
/**
* Fired whenever the media begins or resumes playback
*
* @private
* @method handleTechPlay_
*/
Player.prototype.handleTechPlay_ = function handleTechPlay_() {
this.removeClass('vjs-ended');
this.removeClass('vjs-paused');
this.addClass('vjs-playing');
// hide the poster when the user hits play
// https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play
this.hasStarted(true);
this.trigger('play');
};
/**
* Fired whenever the media begins waiting
*
* @private
* @method handleTechWaiting_
*/
Player.prototype.handleTechWaiting_ = function handleTechWaiting_() {
var _this2 = this;
this.addClass('vjs-waiting');
this.trigger('waiting');
this.one('timeupdate', function () {
return _this2.removeClass('vjs-waiting');
});
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechCanPlay_
*/
Player.prototype.handleTechCanPlay_ = function handleTechCanPlay_() {
this.removeClass('vjs-waiting');
this.trigger('canplay');
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechCanPlayThrough_
*/
Player.prototype.handleTechCanPlayThrough_ = function handleTechCanPlayThrough_() {
this.removeClass('vjs-waiting');
this.trigger('canplaythrough');
};
/**
* A handler for events that signal that waiting has ended
* which is not consistent between browsers. See #1351
*
* @private
* @method handleTechPlaying_
*/
Player.prototype.handleTechPlaying_ = function handleTechPlaying_() {
this.removeClass('vjs-waiting');
this.trigger('playing');
};
/**
* Fired whenever the player is jumping to a new time
*
* @private
* @method handleTechSeeking_
*/
Player.prototype.handleTechSeeking_ = function handleTechSeeking_() {
this.addClass('vjs-seeking');
this.trigger('seeking');
};
/**
* Fired when the player has finished jumping to a new time
*
* @private
* @method handleTechSeeked_
*/
Player.prototype.handleTechSeeked_ = function handleTechSeeked_() {
this.removeClass('vjs-seeking');
this.trigger('seeked');
};
/**
* Fired the first time a video is played
* Not part of the HLS spec, and we're not sure if this is the best
* implementation yet, so use sparingly. If you don't have a reason to
* prevent playback, use `myPlayer.one('play');` instead.
*
* @private
* @method handleTechFirstPlay_
*/
Player.prototype.handleTechFirstPlay_ = function handleTechFirstPlay_() {
//If the first starttime attribute is specified
//then we will start at the given offset in seconds
if (this.options_.starttime) {
this.currentTime(this.options_.starttime);
}
this.addClass('vjs-has-started');
this.trigger('firstplay');
};
/**
* Fired whenever the media has been paused
*
* @private
* @method handleTechPause_
*/
Player.prototype.handleTechPause_ = function handleTechPause_() {
this.removeClass('vjs-playing');
this.addClass('vjs-paused');
this.trigger('pause');
};
/**
* Fired while the user agent is downloading media data
*
* @private
* @method handleTechProgress_
*/
Player.prototype.handleTechProgress_ = function handleTechProgress_() {
this.trigger('progress');
};
/**
* Fired when the end of the media resource is reached (currentTime == duration)
*
* @private
* @method handleTechEnded_
*/
Player.prototype.handleTechEnded_ = function handleTechEnded_() {
this.addClass('vjs-ended');
if (this.options_.loop) {
this.currentTime(0);
this.play();
} else if (!this.paused()) {
this.pause();
}
this.trigger('ended');
};
/**
* Fired when the duration of the media resource is first known or changed
*
* @private
* @method handleTechDurationChange_
*/
Player.prototype.handleTechDurationChange_ = function handleTechDurationChange_() {
this.duration(this.techGet_('duration'));
};
/**
* Handle a click on the media element to play/pause
*
* @param {Object=} event Event object
* @private
* @method handleTechClick_
*/
Player.prototype.handleTechClick_ = function handleTechClick_(event) {
// We're using mousedown to detect clicks thanks to Flash, but mousedown
// will also be triggered with right-clicks, so we need to prevent that
if (event.button !== 0) return;
// When controls are disabled a click should not toggle playback because
// the click is considered a control
if (this.controls()) {
if (this.paused()) {
this.play();
} else {
this.pause();
}
}
};
/**
* Handle a tap on the media element. It will toggle the user
* activity state, which hides and shows the controls.
*
* @private
* @method handleTechTap_
*/
Player.prototype.handleTechTap_ = function handleTechTap_() {
this.userActive(!this.userActive());
};
/**
* Handle touch to start
*
* @private
* @method handleTechTouchStart_
*/
Player.prototype.handleTechTouchStart_ = function handleTechTouchStart_() {
this.userWasActive = this.userActive();
};
/**
* Handle touch to move
*
* @private
* @method handleTechTouchMove_
*/
Player.prototype.handleTechTouchMove_ = function handleTechTouchMove_() {
if (this.userWasActive) {
this.reportUserActivity();
}
};
/**
* Handle touch to end
*
* @private
* @method handleTechTouchEnd_
*/
Player.prototype.handleTechTouchEnd_ = function handleTechTouchEnd_(event) {
// Stop the mouse events from also happening
event.preventDefault();
};
/**
* Fired when the player switches in or out of fullscreen mode
*
* @private
* @method handleFullscreenChange_
*/
Player.prototype.handleFullscreenChange_ = function handleFullscreenChange_() {
if (this.isFullscreen()) {
this.addClass('vjs-fullscreen');
} else {
this.removeClass('vjs-fullscreen');
}
};
/**
* native click events on the SWF aren't triggered on IE11, Win8.1RT
* use stageclick events triggered from inside the SWF instead
*
* @private
* @method handleStageClick_
*/
Player.prototype.handleStageClick_ = function handleStageClick_() {
this.reportUserActivity();
};
/**
* Handle Tech Fullscreen Change
*
* @private
* @method handleTechFullscreenChange_
*/
Player.prototype.handleTechFullscreenChange_ = function handleTechFullscreenChange_(event, data) {
if (data) {
this.isFullscreen(data.isFullscreen);
}
this.trigger('fullscreenchange');
};
/**
* Fires when an error occurred during the loading of an audio/video
*
* @private
* @method handleTechError_
*/
Player.prototype.handleTechError_ = function handleTechError_() {
var error = this.tech_.error();
this.error(error && error.code);
};
/**
* Fires when the browser is intentionally not getting media data
*
* @private
* @method handleTechSuspend_
*/
Player.prototype.handleTechSuspend_ = function handleTechSuspend_() {
this.trigger('suspend');
};
/**
* Fires when the loading of an audio/video is aborted
*
* @private
* @method handleTechAbort_
*/
Player.prototype.handleTechAbort_ = function handleTechAbort_() {
this.trigger('abort');
};
/**
* Fires when the current playlist is empty
*
* @private
* @method handleTechEmptied_
*/
Player.prototype.handleTechEmptied_ = function handleTechEmptied_() {
this.trigger('emptied');
};
/**
* Fires when the browser is trying to get media data, but data is not available
*
* @private
* @method handleTechStalled_
*/
Player.prototype.handleTechStalled_ = function handleTechStalled_() {
this.trigger('stalled');
};
/**
* Fires when the browser has loaded meta data for the audio/video
*
* @private
* @method handleTechLoadedMetaData_
*/
Player.prototype.handleTechLoadedMetaData_ = function handleTechLoadedMetaData_() {
this.trigger('loadedmetadata');
};
/**
* Fires when the browser has loaded the current frame of the audio/video
*
* @private
* @method handleTechLoadedData_
*/
Player.prototype.handleTechLoadedData_ = function handleTechLoadedData_() {
this.trigger('loadeddata');
};
/**
* Fires when the current playback position has changed
*
* @private
* @method handleTechTimeUpdate_
*/
Player.prototype.handleTechTimeUpdate_ = function handleTechTimeUpdate_() {
this.trigger('timeupdate');
};
/**
* Fires when the playing speed of the audio/video is changed
*
* @private
* @method handleTechRateChange_
*/
Player.prototype.handleTechRateChange_ = function handleTechRateChange_() {
this.trigger('ratechange');
};
/**
* Fires when the volume has been changed
*
* @private
* @method handleTechVolumeChange_
*/
Player.prototype.handleTechVolumeChange_ = function handleTechVolumeChange_() {
this.trigger('volumechange');
};
/**
* Fires when the text track has been changed
*
* @private
* @method handleTechTextTrackChange_
*/
Player.prototype.handleTechTextTrackChange_ = function handleTechTextTrackChange_() {
this.trigger('texttrackchange');
};
/**
* Get object for cached values.
*
* @return {Object}
* @method getCache
*/
Player.prototype.getCache = function getCache() {
return this.cache_;
};
/**
* Pass values to the playback tech
*
* @param {String=} method Method
* @param {Object=} arg Argument
* @private
* @method techCall_
*/
Player.prototype.techCall_ = function techCall_(method, arg) {
// If it's not ready yet, call method when it is
if (this.tech_ && !this.tech_.isReady_) {
this.tech_.ready(function () {
this[method](arg);
}, true);
// Otherwise call method now
} else {
try {
if (this.tech_) {
this.tech_[method](arg);
}
} catch (e) {
_utilsLogJs2['default'](e);
throw e;
}
}
};
/**
* Get calls can't wait for the tech, and sometimes don't need to.
*
* @param {String} method Tech method
* @return {Method}
* @private
* @method techGet_
*/
Player.prototype.techGet_ = function techGet_(method) {
if (this.tech_ && this.tech_.isReady_) {
// Flash likes to die and reload when you hide or reposition it.
// In these cases the object methods go away and we get errors.
// When that happens we'll catch the errors and inform tech that it's not ready any more.
try {
return this.tech_[method]();
} catch (e) {
// When building additional tech libs, an expected method may not be defined yet
if (this.tech_[method] === undefined) {
_utilsLogJs2['default']('Video.js: ' + method + ' method not defined for ' + this.techName_ + ' playback technology.', e);
} else {
// When a method isn't available on the object it throws a TypeError
if (e.name === 'TypeError') {
_utilsLogJs2['default']('Video.js: ' + method + ' unavailable on ' + this.techName_ + ' playback technology element.', e);
this.tech_.isReady_ = false;
} else {
_utilsLogJs2['default'](e);
}
}
throw e;
}
}
return;
};
/**
* start media playback
* ```js
* myPlayer.play();
* ```
*
* @return {Player} self
* @method play
*/
Player.prototype.play = function play() {
this.techCall_('play');
return this;
};
/**
* Pause the video playback
* ```js
* myPlayer.pause();
* ```
*
* @return {Player} self
* @method pause
*/
Player.prototype.pause = function pause() {
this.techCall_('pause');
return this;
};
/**
* Check if the player is paused
* ```js
* var isPaused = myPlayer.paused();
* var isPlaying = !myPlayer.paused();
* ```
*
* @return {Boolean} false if the media is currently playing, or true otherwise
* @method paused
*/
Player.prototype.paused = function paused() {
// The initial state of paused should be true (in Safari it's actually false)
return this.techGet_('paused') === false ? false : true;
};
/**
* Returns whether or not the user is "scrubbing". Scrubbing is when the user
* has clicked the progress bar handle and is dragging it along the progress bar.
*
* @param {Boolean} isScrubbing True/false the user is scrubbing
* @return {Boolean} The scrubbing status when getting
* @return {Object} The player when setting
* @method scrubbing
*/
Player.prototype.scrubbing = function scrubbing(isScrubbing) {
if (isScrubbing !== undefined) {
this.scrubbing_ = !!isScrubbing;
if (isScrubbing) {
this.addClass('vjs-scrubbing');
} else {
this.removeClass('vjs-scrubbing');
}
return this;
}
return this.scrubbing_;
};
/**
* Get or set the current time (in seconds)
* ```js
* // get
* var whereYouAt = myPlayer.currentTime();
* // set
* myPlayer.currentTime(120); // 2 minutes into the video
* ```
*
* @param {Number|String=} seconds The time to seek to
* @return {Number} The time in seconds, when not setting
* @return {Player} self, when the current time is set
* @method currentTime
*/
Player.prototype.currentTime = function currentTime(seconds) {
if (seconds !== undefined) {
this.techCall_('setCurrentTime', seconds);
return this;
}
// cache last currentTime and return. default to 0 seconds
//
// Caching the currentTime is meant to prevent a massive amount of reads on the tech's
// currentTime when scrubbing, but may not provide much performance benefit afterall.
// Should be tested. Also something has to read the actual current time or the cache will
// never get updated.
return this.cache_.currentTime = this.techGet_('currentTime') || 0;
};
/**
* Get the length in time of the video in seconds
* ```js
* var lengthOfVideo = myPlayer.duration();
* ```
* **NOTE**: The video must have started loading before the duration can be
* known, and in the case of Flash, may not be known until the video starts
* playing.
*
* @param {Number} seconds Duration when setting
* @return {Number} The duration of the video in seconds when getting
* @method duration
*/
Player.prototype.duration = function duration(seconds) {
if (seconds === undefined) {
return this.cache_.duration || 0;
}
seconds = parseFloat(seconds) || 0;
// Standardize on Inifity for signaling video is live
if (seconds < 0) {
seconds = Infinity;
}
if (seconds !== this.cache_.duration) {
// Cache the last set value for optimized scrubbing (esp. Flash)
this.cache_.duration = seconds;
if (seconds === Infinity) {
this.addClass('vjs-live');
} else {
this.removeClass('vjs-live');
}
this.trigger('durationchange');
}
return this;
};
/**
* Calculates how much time is left.
* ```js
* var timeLeft = myPlayer.remainingTime();
* ```
* Not a native video element function, but useful
*
* @return {Number} The time remaining in seconds
* @method remainingTime
*/
Player.prototype.remainingTime = function remainingTime() {
return this.duration() - this.currentTime();
};
// http://dev.w3.org/html5/spec/video.html#dom-media-buffered
// Buffered returns a timerange object.
// Kind of like an array of portions of the video that have been downloaded.
/**
* Get a TimeRange object with the times of the video that have been downloaded
* If you just want the percent of the video that's been downloaded,
* use bufferedPercent.
* ```js
* // Number of different ranges of time have been buffered. Usually 1.
* numberOfRanges = bufferedTimeRange.length,
* // Time in seconds when the first range starts. Usually 0.
* firstRangeStart = bufferedTimeRange.start(0),
* // Time in seconds when the first range ends
* firstRangeEnd = bufferedTimeRange.end(0),
* // Length in seconds of the first time range
* firstRangeLength = firstRangeEnd - firstRangeStart;
* ```
*
* @return {Object} A mock TimeRange object (following HTML spec)
* @method buffered
*/
Player.prototype.buffered = function buffered() {
var buffered = this.techGet_('buffered');
if (!buffered || !buffered.length) {
buffered = _utilsTimeRangesJs.createTimeRange(0, 0);
}
return buffered;
};
/**
* Get the percent (as a decimal) of the video that's been downloaded
* ```js
* var howMuchIsDownloaded = myPlayer.bufferedPercent();
* ```
* 0 means none, 1 means all.
* (This method isn't in the HTML5 spec, but it's very convenient)
*
* @return {Number} A decimal between 0 and 1 representing the percent
* @method bufferedPercent
*/
Player.prototype.bufferedPercent = function bufferedPercent() {
return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration());
};
/**
* Get the ending time of the last buffered time range
* This is used in the progress bar to encapsulate all time ranges.
*
* @return {Number} The end of the last buffered time range
* @method bufferedEnd
*/
Player.prototype.bufferedEnd = function bufferedEnd() {
var buffered = this.buffered(),
duration = this.duration(),
end = buffered.end(buffered.length - 1);
if (end > duration) {
end = duration;
}
return end;
};
/**
* Get or set the current volume of the media
* ```js
* // get
* var howLoudIsIt = myPlayer.volume();
* // set
* myPlayer.volume(0.5); // Set volume to half
* ```
* 0 is off (muted), 1.0 is all the way up, 0.5 is half way.
*
* @param {Number} percentAsDecimal The new volume as a decimal percent
* @return {Number} The current volume when getting
* @return {Player} self when setting
* @method volume
*/
Player.prototype.volume = function volume(percentAsDecimal) {
var vol = undefined;
if (percentAsDecimal !== undefined) {
vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal))); // Force value to between 0 and 1
this.cache_.volume = vol;
this.techCall_('setVolume', vol);
return this;
}
// Default to 1 when returning current volume.
vol = parseFloat(this.techGet_('volume'));
return isNaN(vol) ? 1 : vol;
};
/**
* Get the current muted state, or turn mute on or off
* ```js
* // get
* var isVolumeMuted = myPlayer.muted();
* // set
* myPlayer.muted(true); // mute the volume
* ```
*
* @param {Boolean=} muted True to mute, false to unmute
* @return {Boolean} True if mute is on, false if not when getting
* @return {Player} self when setting mute
* @method muted
*/
Player.prototype.muted = function muted(_muted) {
if (_muted !== undefined) {
this.techCall_('setMuted', _muted);
return this;
}
return this.techGet_('muted') || false; // Default to false
};
// Check if current tech can support native fullscreen
// (e.g. with built in controls like iOS, so not our flash swf)
/**
* Check to see if fullscreen is supported
*
* @return {Boolean}
* @method supportsFullScreen
*/
Player.prototype.supportsFullScreen = function supportsFullScreen() {
return this.techGet_('supportsFullScreen') || false;
};
/**
* Check if the player is in fullscreen mode
* ```js
* // get
* var fullscreenOrNot = myPlayer.isFullscreen();
* // set
* myPlayer.isFullscreen(true); // tell the player it's in fullscreen
* ```
* NOTE: As of the latest HTML5 spec, isFullscreen is no longer an official
* property and instead document.fullscreenElement is used. But isFullscreen is
* still a valuable property for internal player workings.
*
* @param {Boolean=} isFS Update the player's fullscreen state
* @return {Boolean} true if fullscreen false if not when getting
* @return {Player} self when setting
* @method isFullscreen
*/
Player.prototype.isFullscreen = function isFullscreen(isFS) {
if (isFS !== undefined) {
this.isFullscreen_ = !!isFS;
return this;
}
return !!this.isFullscreen_;
};
/**
* Increase the size of the video to full screen
* ```js
* myPlayer.requestFullscreen();
* ```
* In some browsers, full screen is not supported natively, so it enters
* "full window mode", where the video fills the browser window.
* In browsers and devices that support native full screen, sometimes the
* browser's default controls will be shown, and not the Video.js custom skin.
* This includes most mobile devices (iOS, Android) and older versions of
* Safari.
*
* @return {Player} self
* @method requestFullscreen
*/
Player.prototype.requestFullscreen = function requestFullscreen() {
var fsApi = _fullscreenApiJs2['default'];
this.isFullscreen(true);
if (fsApi.requestFullscreen) {
// the browser supports going fullscreen at the element level so we can
// take the controls fullscreen as well as the video
// Trigger fullscreenchange event after change
// We have to specifically add this each time, and remove
// when canceling fullscreen. Otherwise if there's multiple
// players on a page, they would all be reacting to the same fullscreen
// events
Events.on(_globalDocument2['default'], fsApi.fullscreenchange, Fn.bind(this, function documentFullscreenChange(e) {
this.isFullscreen(_globalDocument2['default'][fsApi.fullscreenElement]);
// If cancelling fullscreen, remove event listener.
if (this.isFullscreen() === false) {
Events.off(_globalDocument2['default'], fsApi.fullscreenchange, documentFullscreenChange);
}
this.trigger('fullscreenchange');
}));
this.el_[fsApi.requestFullscreen]();
} else if (this.tech_.supportsFullScreen()) {
// we can't take the video.js controls fullscreen but we can go fullscreen
// with native controls
this.techCall_('enterFullScreen');
} else {
// fullscreen isn't supported so we'll just stretch the video element to
// fill the viewport
this.enterFullWindow();
this.trigger('fullscreenchange');
}
return this;
};
/**
* Return the video to its normal size after having been in full screen mode
* ```js
* myPlayer.exitFullscreen();
* ```
*
* @return {Player} self
* @method exitFullscreen
*/
Player.prototype.exitFullscreen = function exitFullscreen() {
var fsApi = _fullscreenApiJs2['default'];
this.isFullscreen(false);
// Check for browser element fullscreen support
if (fsApi.requestFullscreen) {
_globalDocument2['default'][fsApi.exitFullscreen]();
} else if (this.tech_.supportsFullScreen()) {
this.techCall_('exitFullScreen');
} else {
this.exitFullWindow();
this.trigger('fullscreenchange');
}
return this;
};
/**
* When fullscreen isn't supported we can stretch the video container to as wide as the browser will let us.
*
* @method enterFullWindow
*/
Player.prototype.enterFullWindow = function enterFullWindow() {
this.isFullWindow = true;
// Storing original doc overflow value to return to when fullscreen is off
this.docOrigOverflow = _globalDocument2['default'].documentElement.style.overflow;
// Add listener for esc key to exit fullscreen
Events.on(_globalDocument2['default'], 'keydown', Fn.bind(this, this.fullWindowOnEscKey));
// Hide any scroll bars
_globalDocument2['default'].documentElement.style.overflow = 'hidden';
// Apply fullscreen styles
Dom.addElClass(_globalDocument2['default'].body, 'vjs-full-window');
this.trigger('enterFullWindow');
};
/**
* Check for call to either exit full window or full screen on ESC key
*
* @param {String} event Event to check for key press
* @method fullWindowOnEscKey
*/
Player.prototype.fullWindowOnEscKey = function fullWindowOnEscKey(event) {
if (event.keyCode === 27) {
if (this.isFullscreen() === true) {
this.exitFullscreen();
} else {
this.exitFullWindow();
}
}
};
/**
* Exit full window
*
* @method exitFullWindow
*/
Player.prototype.exitFullWindow = function exitFullWindow() {
this.isFullWindow = false;
Events.off(_globalDocument2['default'], 'keydown', this.fullWindowOnEscKey);
// Unhide scroll bars.
_globalDocument2['default'].documentElement.style.overflow = this.docOrigOverflow;
// Remove fullscreen styles
Dom.removeElClass(_globalDocument2['default'].body, 'vjs-full-window');
// Resize the box, controller, and poster to original sizes
// this.positionAll();
this.trigger('exitFullWindow');
};
/**
* Check whether the player can play a given mimetype
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
* @method canPlayType
*/
Player.prototype.canPlayType = function canPlayType(type) {
var can = undefined;
// Loop through each playback technology in the options order
for (var i = 0, j = this.options_.techOrder; i < j.length; i++) {
var techName = _utilsToTitleCaseJs2['default'](j[i]);
var tech = _techTechJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!tech) {
tech = _componentJs2['default'].getComponent(techName);
}
// Check if the current tech is defined before continuing
if (!tech) {
_utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
continue;
}
// Check if the browser supports this technology
if (tech.isSupported()) {
can = tech.canPlayType(type);
if (can) {
return can;
}
}
}
return '';
};
/**
* Select source based on tech-order or source-order
* Uses source-order selection if `options.sourceOrder` is truthy. Otherwise,
* defaults to tech-order selection
*
* @param {Array} sources The sources for a media asset
* @return {Object|Boolean} Object of source and tech order, otherwise false
* @method selectSource
*/
Player.prototype.selectSource = function selectSource(sources) {
// Get only the techs specified in `techOrder` that exist and are supported by the
// current platform
var techs = this.options_.techOrder.map(_utilsToTitleCaseJs2['default']).map(function (techName) {
// `Component.getComponent(...)` is for support of old behavior of techs
// being registered as components.
// Remove once that deprecated behavior is removed.
return [techName, _techTechJs2['default'].getTech(techName) || _componentJs2['default'].getComponent(techName)];
}).filter(function (_ref) {
var techName = _ref[0];
var tech = _ref[1];
// Check if the current tech is defined before continuing
if (tech) {
// Check if the browser supports this technology
return tech.isSupported();
}
_utilsLogJs2['default'].error('The "' + techName + '" tech is undefined. Skipped browser support check for that tech.');
return false;
});
// Iterate over each `innerArray` element once per `outerArray` element and execute
// `tester` with both. If `tester` returns a non-falsy value, exit early and return
// that value.
var findFirstPassingTechSourcePair = function findFirstPassingTechSourcePair(outerArray, innerArray, tester) {
var found = undefined;
outerArray.some(function (outerChoice) {
return innerArray.some(function (innerChoice) {
found = tester(outerChoice, innerChoice);
if (found) {
return true;
}
});
});
return found;
};
var foundSourceAndTech = undefined;
var flip = function flip(fn) {
return function (a, b) {
return fn(b, a);
};
};
var finder = function finder(_ref2, source) {
var techName = _ref2[0];
var tech = _ref2[1];
if (tech.canPlaySource(source)) {
return { source: source, tech: techName };
}
};
// Depending on the truthiness of `options.sourceOrder`, we swap the order of techs and sources
// to select from them based on their priority.
if (this.options_.sourceOrder) {
// Source-first ordering
foundSourceAndTech = findFirstPassingTechSourcePair(sources, techs, flip(finder));
} else {
// Tech-first ordering
foundSourceAndTech = findFirstPassingTechSourcePair(techs, sources, finder);
}
return foundSourceAndTech || false;
};
/**
* The source function updates the video source
* There are three types of variables you can pass as the argument.
* **URL String**: A URL to the the video file. Use this method if you are sure
* the current playback technology (HTML5/Flash) can support the source you
* provide. Currently only MP4 files can be used in both HTML5 and Flash.
* ```js
* myPlayer.src("http://www.example.com/path/to/video.mp4");
* ```
* **Source Object (or element):* * A javascript object containing information
* about the source file. Use this method if you want the player to determine if
* it can support the file using the type information.
* ```js
* myPlayer.src({ type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" });
* ```
* **Array of Source Objects:* * To provide multiple versions of the source so
* that it can be played using HTML5 across browsers you can use an array of
* source objects. Video.js will detect which version is supported and load that
* file.
* ```js
* myPlayer.src([
* { type: "video/mp4", src: "http://www.example.com/path/to/video.mp4" },
* { type: "video/webm", src: "http://www.example.com/path/to/video.webm" },
* { type: "video/ogg", src: "http://www.example.com/path/to/video.ogv" }
* ]);
* ```
*
* @param {String|Object|Array=} source The source URL, object, or array of sources
* @return {String} The current video source when getting
* @return {String} The player when setting
* @method src
*/
Player.prototype.src = function src(source) {
if (source === undefined) {
return this.techGet_('src');
}
var currentTech = _techTechJs2['default'].getTech(this.techName_);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!currentTech) {
currentTech = _componentJs2['default'].getComponent(this.techName_);
}
// case: Array of source objects to choose from and pick the best to play
if (Array.isArray(source)) {
this.sourceList_(source);
// case: URL String (http://myvideo...)
} else if (typeof source === 'string') {
// create a source object from the string
this.src({ src: source });
// case: Source object { src: '', type: '' ... }
} else if (source instanceof Object) {
// check if the source has a type and the loaded tech cannot play the source
// if there's no type we'll just try the current tech
if (source.type && !currentTech.canPlaySource(source)) {
// create a source list with the current source and send through
// the tech loop to check for a compatible technology
this.sourceList_([source]);
} else {
this.cache_.src = source.src;
this.currentType_ = source.type || '';
// wait until the tech is ready to set the source
this.ready(function () {
// The setSource tech method was added with source handlers
// so older techs won't support it
// We need to check the direct prototype for the case where subclasses
// of the tech do not support source handlers
if (currentTech.prototype.hasOwnProperty('setSource')) {
this.techCall_('setSource', source);
} else {
this.techCall_('src', source.src);
}
if (this.options_.preload === 'auto') {
this.load();
}
if (this.options_.autoplay) {
this.play();
}
// Set the source synchronously if possible (#2326)
}, true);
}
}
return this;
};
/**
* Handle an array of source objects
*
* @param {Array} sources Array of source objects
* @private
* @method sourceList_
*/
Player.prototype.sourceList_ = function sourceList_(sources) {
var sourceTech = this.selectSource(sources);
if (sourceTech) {
if (sourceTech.tech === this.techName_) {
// if this technology is already loaded, set the source
this.src(sourceTech.source);
} else {
// load this technology with the chosen source
this.loadTech_(sourceTech.tech, sourceTech.source);
}
} else {
// We need to wrap this in a timeout to give folks a chance to add error event handlers
this.setTimeout(function () {
this.error({ code: 4, message: this.localize(this.options_.notSupportedMessage) });
}, 0);
// we could not find an appropriate tech, but let's still notify the delegate that this is it
// this needs a better comment about why this is needed
this.triggerReady();
}
};
/**
* Begin loading the src data.
*
* @return {Player} Returns the player
* @method load
*/
Player.prototype.load = function load() {
this.techCall_('load');
return this;
};
/**
* Reset the player. Loads the first tech in the techOrder,
* and calls `reset` on the tech`.
*
* @return {Player} Returns the player
* @method reset
*/
Player.prototype.reset = function reset() {
this.loadTech_(_utilsToTitleCaseJs2['default'](this.options_.techOrder[0]), null);
this.techCall_('reset');
return this;
};
/**
* Returns the fully qualified URL of the current source value e.g. http://mysite.com/video.mp4
* Can be used in conjuction with `currentType` to assist in rebuilding the current source object.
*
* @return {String} The current source
* @method currentSrc
*/
Player.prototype.currentSrc = function currentSrc() {
return this.techGet_('currentSrc') || this.cache_.src || '';
};
/**
* Get the current source type e.g. video/mp4
* This can allow you rebuild the current source object so that you could load the same
* source and tech later
*
* @return {String} The source MIME type
* @method currentType
*/
Player.prototype.currentType = function currentType() {
return this.currentType_ || '';
};
/**
* Get or set the preload attribute
*
* @param {Boolean} value Boolean to determine if preload should be used
* @return {String} The preload attribute value when getting
* @return {Player} Returns the player when setting
* @method preload
*/
Player.prototype.preload = function preload(value) {
if (value !== undefined) {
this.techCall_('setPreload', value);
this.options_.preload = value;
return this;
}
return this.techGet_('preload');
};
/**
* Get or set the autoplay attribute.
*
* @param {Boolean} value Boolean to determine if video should autoplay
* @return {String} The autoplay attribute value when getting
* @return {Player} Returns the player when setting
* @method autoplay
*/
Player.prototype.autoplay = function autoplay(value) {
if (value !== undefined) {
this.techCall_('setAutoplay', value);
this.options_.autoplay = value;
return this;
}
return this.techGet_('autoplay', value);
};
/**
* Get or set the loop attribute on the video element.
*
* @param {Boolean} value Boolean to determine if video should loop
* @return {String} The loop attribute value when getting
* @return {Player} Returns the player when setting
* @method loop
*/
Player.prototype.loop = function loop(value) {
if (value !== undefined) {
this.techCall_('setLoop', value);
this.options_['loop'] = value;
return this;
}
return this.techGet_('loop');
};
/**
* Get or set the poster image source url
*
* ##### EXAMPLE:
* ```js
* // get
* var currentPoster = myPlayer.poster();
* // set
* myPlayer.poster('http://example.com/myImage.jpg');
* ```
*
* @param {String=} src Poster image source URL
* @return {String} poster URL when getting
* @return {Player} self when setting
* @method poster
*/
Player.prototype.poster = function poster(src) {
if (src === undefined) {
return this.poster_;
}
// The correct way to remove a poster is to set as an empty string
// other falsey values will throw errors
if (!src) {
src = '';
}
// update the internal poster variable
this.poster_ = src;
// update the tech's poster
this.techCall_('setPoster', src);
// alert components that the poster has been set
this.trigger('posterchange');
return this;
};
/**
* Some techs (e.g. YouTube) can provide a poster source in an
* asynchronous way. We want the poster component to use this
* poster source so that it covers up the tech's controls.
* (YouTube's play button). However we only want to use this
* soruce if the player user hasn't set a poster through
* the normal APIs.
*
* @private
* @method handleTechPosterChange_
*/
Player.prototype.handleTechPosterChange_ = function handleTechPosterChange_() {
if (!this.poster_ && this.tech_ && this.tech_.poster) {
this.poster_ = this.tech_.poster() || '';
// Let components know the poster has changed
this.trigger('posterchange');
}
};
/**
* Get or set whether or not the controls are showing.
*
* @param {Boolean} bool Set controls to showing or not
* @return {Boolean} Controls are showing
* @method controls
*/
Player.prototype.controls = function controls(bool) {
if (bool !== undefined) {
bool = !!bool; // force boolean
// Don't trigger a change event unless it actually changed
if (this.controls_ !== bool) {
this.controls_ = bool;
if (this.usingNativeControls()) {
this.techCall_('setControls', bool);
}
if (bool) {
this.removeClass('vjs-controls-disabled');
this.addClass('vjs-controls-enabled');
this.trigger('controlsenabled');
if (!this.usingNativeControls()) {
this.addTechControlsListeners_();
}
} else {
this.removeClass('vjs-controls-enabled');
this.addClass('vjs-controls-disabled');
this.trigger('controlsdisabled');
if (!this.usingNativeControls()) {
this.removeTechControlsListeners_();
}
}
}
return this;
}
return !!this.controls_;
};
/**
* Toggle native controls on/off. Native controls are the controls built into
* devices (e.g. default iPhone controls), Flash, or other techs
* (e.g. Vimeo Controls)
* **This should only be set by the current tech, because only the tech knows
* if it can support native controls**
*
* @param {Boolean} bool True signals that native controls are on
* @return {Player} Returns the player
* @private
* @method usingNativeControls
*/
Player.prototype.usingNativeControls = function usingNativeControls(bool) {
if (bool !== undefined) {
bool = !!bool; // force boolean
// Don't trigger a change event unless it actually changed
if (this.usingNativeControls_ !== bool) {
this.usingNativeControls_ = bool;
if (bool) {
this.addClass('vjs-using-native-controls');
/**
* player is using the native device controls
*
* @event usingnativecontrols
* @memberof Player
* @instance
* @private
*/
this.trigger('usingnativecontrols');
} else {
this.removeClass('vjs-using-native-controls');
/**
* player is using the custom HTML controls
*
* @event usingcustomcontrols
* @memberof Player
* @instance
* @private
*/
this.trigger('usingcustomcontrols');
}
}
return this;
}
return !!this.usingNativeControls_;
};
/**
* Set or get the current MediaError
*
* @param {*} err A MediaError or a String/Number to be turned into a MediaError
* @return {MediaError|null} when getting
* @return {Player} when setting
* @method error
*/
Player.prototype.error = function error(err) {
if (err === undefined) {
return this.error_ || null;
}
// restoring to default
if (err === null) {
this.error_ = err;
this.removeClass('vjs-error');
this.errorDisplay.close();
return this;
}
// error instance
if (err instanceof _mediaErrorJs2['default']) {
this.error_ = err;
} else {
this.error_ = new _mediaErrorJs2['default'](err);
}
// add the vjs-error classname to the player
this.addClass('vjs-error');
// log the name of the error type and any message
// ie8 just logs "[object object]" if you just log the error object
_utilsLogJs2['default'].error('(CODE:' + this.error_.code + ' ' + _mediaErrorJs2['default'].errorTypes[this.error_.code] + ')', this.error_.message, this.error_);
// fire an error event on the player
this.trigger('error');
return this;
};
/**
* Returns whether or not the player is in the "ended" state.
*
* @return {Boolean} True if the player is in the ended state, false if not.
* @method ended
*/
Player.prototype.ended = function ended() {
return this.techGet_('ended');
};
/**
* Returns whether or not the player is in the "seeking" state.
*
* @return {Boolean} True if the player is in the seeking state, false if not.
* @method seeking
*/
Player.prototype.seeking = function seeking() {
return this.techGet_('seeking');
};
/**
* Returns the TimeRanges of the media that are currently available
* for seeking to.
*
* @return {TimeRanges} the seekable intervals of the media timeline
* @method seekable
*/
Player.prototype.seekable = function seekable() {
return this.techGet_('seekable');
};
/**
* Report user activity
*
* @param {Object} event Event object
* @method reportUserActivity
*/
Player.prototype.reportUserActivity = function reportUserActivity(event) {
this.userActivity_ = true;
};
/**
* Get/set if user is active
*
* @param {Boolean} bool Value when setting
* @return {Boolean} Value if user is active user when getting
* @method userActive
*/
Player.prototype.userActive = function userActive(bool) {
if (bool !== undefined) {
bool = !!bool;
if (bool !== this.userActive_) {
this.userActive_ = bool;
if (bool) {
// If the user was inactive and is now active we want to reset the
// inactivity timer
this.userActivity_ = true;
this.removeClass('vjs-user-inactive');
this.addClass('vjs-user-active');
this.trigger('useractive');
} else {
// We're switching the state to inactive manually, so erase any other
// activity
this.userActivity_ = false;
// Chrome/Safari/IE have bugs where when you change the cursor it can
// trigger a mousemove event. This causes an issue when you're hiding
// the cursor when the user is inactive, and a mousemove signals user
// activity. Making it impossible to go into inactive mode. Specifically
// this happens in fullscreen when we really need to hide the cursor.
//
// When this gets resolved in ALL browsers it can be removed
// https://code.google.com/p/chromium/issues/detail?id=103041
if (this.tech_) {
this.tech_.one('mousemove', function (e) {
e.stopPropagation();
e.preventDefault();
});
}
this.removeClass('vjs-user-active');
this.addClass('vjs-user-inactive');
this.trigger('userinactive');
}
}
return this;
}
return this.userActive_;
};
/**
* Listen for user activity based on timeout value
*
* @private
* @method listenForUserActivity_
*/
Player.prototype.listenForUserActivity_ = function listenForUserActivity_() {
var mouseInProgress = undefined,
lastMoveX = undefined,
lastMoveY = undefined;
var handleActivity = Fn.bind(this, this.reportUserActivity);
var handleMouseMove = function handleMouseMove(e) {
// #1068 - Prevent mousemove spamming
// Chrome Bug: https://code.google.com/p/chromium/issues/detail?id=366970
if (e.screenX !== lastMoveX || e.screenY !== lastMoveY) {
lastMoveX = e.screenX;
lastMoveY = e.screenY;
handleActivity();
}
};
var handleMouseDown = function handleMouseDown() {
handleActivity();
// For as long as the they are touching the device or have their mouse down,
// we consider them active even if they're not moving their finger or mouse.
// So we want to continue to update that they are active
this.clearInterval(mouseInProgress);
// Setting userActivity=true now and setting the interval to the same time
// as the activityCheck interval (250) should ensure we never miss the
// next activityCheck
mouseInProgress = this.setInterval(handleActivity, 250);
};
var handleMouseUp = function handleMouseUp(event) {
handleActivity();
// Stop the interval that maintains activity if the mouse/touch is down
this.clearInterval(mouseInProgress);
};
// Any mouse movement will be considered user activity
this.on('mousedown', handleMouseDown);
this.on('mousemove', handleMouseMove);
this.on('mouseup', handleMouseUp);
// Listen for keyboard navigation
// Shouldn't need to use inProgress interval because of key repeat
this.on('keydown', handleActivity);
this.on('keyup', handleActivity);
// Run an interval every 250 milliseconds instead of stuffing everything into
// the mousemove/touchmove function itself, to prevent performance degradation.
// `this.reportUserActivity` simply sets this.userActivity_ to true, which
// then gets picked up by this loop
// http://ejohn.org/blog/learning-from-twitter/
var inactivityTimeout = undefined;
var activityCheck = this.setInterval(function () {
// Check to see if mouse/touch activity has happened
if (this.userActivity_) {
// Reset the activity tracker
this.userActivity_ = false;
// If the user state was inactive, set the state to active
this.userActive(true);
// Clear any existing inactivity timeout to start the timer over
this.clearTimeout(inactivityTimeout);
var timeout = this.options_['inactivityTimeout'];
if (timeout > 0) {
// In milliseconds, if no more activity has occurred the
// user will be considered inactive
inactivityTimeout = this.setTimeout(function () {
// Protect against the case where the inactivityTimeout can trigger just
// before the next user activity is picked up by the activityCheck loop
// causing a flicker
if (!this.userActivity_) {
this.userActive(false);
}
}, timeout);
}
}
}, 250);
};
/**
* Gets or sets the current playback rate. A playback rate of
* 1.0 represents normal speed and 0.5 would indicate half-speed
* playback, for instance.
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-playbackrate
*
* @param {Number} rate New playback rate to set.
* @return {Number} Returns the new playback rate when setting
* @return {Number} Returns the current playback rate when getting
* @method playbackRate
*/
Player.prototype.playbackRate = function playbackRate(rate) {
if (rate !== undefined) {
this.techCall_('setPlaybackRate', rate);
return this;
}
if (this.tech_ && this.tech_['featuresPlaybackRate']) {
return this.techGet_('playbackRate');
} else {
return 1.0;
}
};
/**
* Gets or sets the audio flag
*
* @param {Boolean} bool True signals that this is an audio player.
* @return {Boolean} Returns true if player is audio, false if not when getting
* @return {Player} Returns the player if setting
* @private
* @method isAudio
*/
Player.prototype.isAudio = function isAudio(bool) {
if (bool !== undefined) {
this.isAudio_ = !!bool;
return this;
}
return !!this.isAudio_;
};
/**
* Returns the current state of network activity for the element, from
* the codes in the list below.
* - NETWORK_EMPTY (numeric value 0)
* The element has not yet been initialised. All attributes are in
* their initial states.
* - NETWORK_IDLE (numeric value 1)
* The element's resource selection algorithm is active and has
* selected a resource, but it is not actually using the network at
* this time.
* - NETWORK_LOADING (numeric value 2)
* The user agent is actively trying to download data.
* - NETWORK_NO_SOURCE (numeric value 3)
* The element's resource selection algorithm is active, but it has
* not yet found a resource to use.
*
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#network-states
* @return {Number} the current network activity state
* @method networkState
*/
Player.prototype.networkState = function networkState() {
return this.techGet_('networkState');
};
/**
* Returns a value that expresses the current state of the element
* with respect to rendering the current playback position, from the
* codes in the list below.
* - HAVE_NOTHING (numeric value 0)
* No information regarding the media resource is available.
* - HAVE_METADATA (numeric value 1)
* Enough of the resource has been obtained that the duration of the
* resource is available.
* - HAVE_CURRENT_DATA (numeric value 2)
* Data for the immediate current playback position is available.
* - HAVE_FUTURE_DATA (numeric value 3)
* Data for the immediate current playback position is available, as
* well as enough data for the user agent to advance the current
* playback position in the direction of playback.
* - HAVE_ENOUGH_DATA (numeric value 4)
* The user agent estimates that enough data is available for
* playback to proceed uninterrupted.
*
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate
* @return {Number} the current playback rendering state
* @method readyState
*/
Player.prototype.readyState = function readyState() {
return this.techGet_('readyState');
};
/**
* Get a video track list
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist
*
* @return {VideoTrackList} thes current video track list
* @method videoTracks
*/
Player.prototype.videoTracks = function videoTracks() {
// if we have not yet loadTech_, we create videoTracks_
// these will be passed to the tech during loading
if (!this.tech_) {
this.videoTracks_ = this.videoTracks_ || new _tracksVideoTrackListJs2['default']();
return this.videoTracks_;
}
return this.tech_.videoTracks();
};
/**
* Get an audio track list
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist
*
* @return {AudioTrackList} thes current audio track list
* @method audioTracks
*/
Player.prototype.audioTracks = function audioTracks() {
// if we have not yet loadTech_, we create videoTracks_
// these will be passed to the tech during loading
if (!this.tech_) {
this.audioTracks_ = this.audioTracks_ || new _tracksAudioTrackListJs2['default']();
return this.audioTracks_;
}
return this.tech_.audioTracks();
};
/*
* Text tracks are tracks of timed text events.
* Captions - text displayed over the video for the hearing impaired
* Subtitles - text displayed over the video for those who don't understand language in the video
* Chapters - text displayed in a menu allowing the user to jump to particular points (chapters) in the video
* Descriptions (not supported yet) - audio descriptions that are read back to the user by a screen reading device
*/
/**
* Get an array of associated text tracks. captions, subtitles, chapters, descriptions
* http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-texttracks
*
* @return {Array} Array of track objects
* @method textTracks
*/
Player.prototype.textTracks = function textTracks() {
// cannot use techGet_ directly because it checks to see whether the tech is ready.
// Flash is unlikely to be ready in time but textTracks should still work.
return this.tech_ && this.tech_['textTracks']();
};
/**
* Get an array of remote text tracks
*
* @return {Array}
* @method remoteTextTracks
*/
Player.prototype.remoteTextTracks = function remoteTextTracks() {
return this.tech_ && this.tech_['remoteTextTracks']();
};
/**
* Get an array of remote html track elements
*
* @return {HTMLTrackElement[]}
* @method remoteTextTrackEls
*/
Player.prototype.remoteTextTrackEls = function remoteTextTrackEls() {
return this.tech_ && this.tech_['remoteTextTrackEls']();
};
/**
* Add a text track
* In addition to the W3C settings we allow adding additional info through options.
* http://www.w3.org/html/wg/drafts/html/master/embedded-content-0.html#dom-media-addtexttrack
*
* @param {String} kind Captions, subtitles, chapters, descriptions, or metadata
* @param {String=} label Optional label
* @param {String=} language Optional language
* @method addTextTrack
*/
Player.prototype.addTextTrack = function addTextTrack(kind, label, language) {
return this.tech_ && this.tech_['addTextTrack'](kind, label, language);
};
/**
* Add a remote text track
*
* @param {Object} options Options for remote text track
* @method addRemoteTextTrack
*/
Player.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
return this.tech_ && this.tech_['addRemoteTextTrack'](options);
};
/**
* Remove a remote text track
*
* @param {Object} track Remote text track to remove
* @method removeRemoteTextTrack
*/
// destructure the input into an object with a track argument, defaulting to arguments[0]
// default the whole argument to an empty object if nothing was passed in
Player.prototype.removeRemoteTextTrack = function removeRemoteTextTrack() {
var _ref3 = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var _ref3$track = _ref3.track;
var track = _ref3$track === undefined ? arguments[0] : _ref3$track;
// jshint ignore:line
this.tech_ && this.tech_['removeRemoteTextTrack'](track);
};
/**
* Get video width
*
* @return {Number} Video width
* @method videoWidth
*/
Player.prototype.videoWidth = function videoWidth() {
return this.tech_ && this.tech_.videoWidth && this.tech_.videoWidth() || 0;
};
/**
* Get video height
*
* @return {Number} Video height
* @method videoHeight
*/
Player.prototype.videoHeight = function videoHeight() {
return this.tech_ && this.tech_.videoHeight && this.tech_.videoHeight() || 0;
};
// Methods to add support for
// initialTime: function(){ return this.techCall_('initialTime'); },
// startOffsetTime: function(){ return this.techCall_('startOffsetTime'); },
// played: function(){ return this.techCall_('played'); },
// defaultPlaybackRate: function(){ return this.techCall_('defaultPlaybackRate'); },
// defaultMuted: function(){ return this.techCall_('defaultMuted'); }
/**
* The player's language code
* NOTE: The language should be set in the player options if you want the
* the controls to be built with a specific language. Changing the lanugage
* later will not update controls text.
*
* @param {String} code The locale string
* @return {String} The locale string when getting
* @return {Player} self when setting
* @method language
*/
Player.prototype.language = function language(code) {
if (code === undefined) {
return this.language_;
}
this.language_ = ('' + code).toLowerCase();
return this;
};
/**
* Get the player's language dictionary
* Merge every time, because a newly added plugin might call videojs.addLanguage() at any time
* Languages specified directly in the player options have precedence
*
* @return {Array} Array of languages
* @method languages
*/
Player.prototype.languages = function languages() {
return _utilsMergeOptionsJs2['default'](Player.prototype.options_.languages, this.languages_);
};
/**
* Converts track info to JSON
*
* @return {Object} JSON object of options
* @method toJSON
*/
Player.prototype.toJSON = function toJSON() {
var options = _utilsMergeOptionsJs2['default'](this.options_);
var tracks = options.tracks;
options.tracks = [];
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
// deep merge tracks and null out player so no circular references
track = _utilsMergeOptionsJs2['default'](track);
track.player = undefined;
options.tracks[i] = track;
}
return options;
};
/**
* Creates a simple modal dialog (an instance of the `ModalDialog`
* component) that immediately overlays the player with arbitrary
* content and removes itself when closed.
*
* @param {String|Function|Element|Array|Null} content
* Same as `ModalDialog#content`'s param of the same name.
*
* The most straight-forward usage is to provide a string or DOM
* element.
*
* @param {Object} [options]
* Extra options which will be passed on to the `ModalDialog`.
*
* @return {ModalDialog}
*/
Player.prototype.createModal = function createModal(content, options) {
var player = this;
options = options || {};
options.content = content || '';
var modal = new _modalDialog2['default'](player, options);
player.addChild(modal);
modal.on('dispose', function () {
player.removeChild(modal);
});
return modal.open();
};
/**
* Gets tag settings
*
* @param {Element} tag The player tag
* @return {Array} An array of sources and track objects
* @static
* @method getTagSettings
*/
Player.getTagSettings = function getTagSettings(tag) {
var baseOptions = {
'sources': [],
'tracks': []
};
var tagOptions = Dom.getElAttributes(tag);
var dataSetup = tagOptions['data-setup'];
// Check if data-setup attr exists.
if (dataSetup !== null) {
// Parse options JSON
var _safeParseTuple = _safeJsonParseTuple2['default'](dataSetup || '{}');
var err = _safeParseTuple[0];
var data = _safeParseTuple[1];
if (err) {
_utilsLogJs2['default'].error(err);
}
_objectAssign2['default'](tagOptions, data);
}
_objectAssign2['default'](baseOptions, tagOptions);
// Get tag children settings
if (tag.hasChildNodes()) {
var children = tag.childNodes;
for (var i = 0, j = children.length; i < j; i++) {
var child = children[i];
// Change case needed: http://ejohn.org/blog/nodename-case-sensitivity/
var childName = child.nodeName.toLowerCase();
if (childName === 'source') {
baseOptions.sources.push(Dom.getElAttributes(child));
} else if (childName === 'track') {
baseOptions.tracks.push(Dom.getElAttributes(child));
}
}
}
return baseOptions;
};
return Player;
})(_componentJs2['default']);
Player.players = {};
var navigator = _globalWindow2['default'].navigator;
/*
* Player instance options, surfaced using options
* options = Player.prototype.options_
* Make changes in options, not here.
*
* @type {Object}
* @private
*/
Player.prototype.options_ = {
// Default order of fallback technology
techOrder: ['html5', 'flash'],
// techOrder: ['flash','html5'],
html5: {},
flash: {},
// defaultVolume: 0.85,
defaultVolume: 0.00, // The freakin seaguls are driving me crazy!
// default inactivity timeout
inactivityTimeout: 2000,
// default playback rates
playbackRates: [],
// Add playback rate selection by adding rates
// 'playbackRates': [0.5, 1, 1.5, 2],
// Included control sets
children: ['mediaLoader', 'posterImage', 'textTrackDisplay', 'loadingSpinner', 'bigPlayButton', 'controlBar', 'errorDisplay', 'textTrackSettings'],
language: _globalDocument2['default'].getElementsByTagName('html')[0].getAttribute('lang') || navigator.languages && navigator.languages[0] || navigator.userLanguage || navigator.language || 'en',
// locales and their language translations
languages: {},
// Default message to show when a video cannot be played.
notSupportedMessage: 'No compatible source was found for this media.'
};
/**
* Fired when the player has initial duration and dimension information
*
* @event loadedmetadata
*/
Player.prototype.handleLoadedMetaData_;
/**
* Fired when the player has downloaded data at the current playback position
*
* @event loadeddata
*/
Player.prototype.handleLoadedData_;
/**
* Fired when the user is active, e.g. moves the mouse over the player
*
* @event useractive
*/
Player.prototype.handleUserActive_;
/**
* Fired when the user is inactive, e.g. a short delay after the last mouse move or control interaction
*
* @event userinactive
*/
Player.prototype.handleUserInactive_;
/**
* Fired when the current playback position has changed *
* During playback this is fired every 15-250 milliseconds, depending on the
* playback technology in use.
*
* @event timeupdate
*/
Player.prototype.handleTimeUpdate_;
/**
* Fired when video playback ends
*
* @event ended
*/
Player.prototype.handleTechEnded_;
/**
* Fired when the volume changes
*
* @event volumechange
*/
Player.prototype.handleVolumeChange_;
/**
* Fired when an error occurs
*
* @event error
*/
Player.prototype.handleError_;
Player.prototype.flexNotSupported_ = function () {
var elem = _globalDocument2['default'].createElement('i');
// Note: We don't actually use flexBasis (or flexOrder), but it's one of the more
// common flex features that we can rely on when checking for flex support.
return !('flexBasis' in elem.style || 'webkitFlexBasis' in elem.style || 'mozFlexBasis' in elem.style || 'msFlexBasis' in elem.style || 'msFlexOrder' in elem.style) /* IE10-specific (2012 flex spec) */;
};
_componentJs2['default'].registerComponent('Player', Player);
exports['default'] = Player;
module.exports = exports['default'];
// If empty string, make it a parsable json object.
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9wbGF5ZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzsyQkFJc0IsZ0JBQWdCOzs7OzhCQUVqQixpQkFBaUI7Ozs7NEJBQ25CLGVBQWU7Ozs7NkJBQ1YsbUJBQW1COztJQUEvQixNQUFNOzswQkFDRyxnQkFBZ0I7O0lBQXpCLEdBQUc7O3lCQUNLLGVBQWU7O0lBQXZCLEVBQUU7OzJCQUNRLGlCQUFpQjs7SUFBM0IsSUFBSTs7OEJBQ1Msb0JBQW9COztJQUFqQyxPQUFPOzswQkFDSCxnQkFBZ0I7Ozs7a0NBQ1IsMEJBQTBCOzs7O2lDQUNsQix3QkFBd0I7OzZCQUN4QixtQkFBbUI7O2lDQUN2Qix1QkFBdUI7O0lBQXZDLFVBQVU7OytCQUNJLHFCQUFxQjs7Ozs0QkFDeEIsa0JBQWtCOzs7O2tDQUNkLHVCQUF1Qjs7Ozs0QkFDL0IsZUFBZTs7OzttQ0FDVCwwQkFBMEI7Ozs7OENBQ3BCLHVDQUF1Qzs7OztzQ0FDM0MsOEJBQThCOzs7O3NDQUM5Qiw4QkFBOEI7Ozs7Ozs0QkFHakMsa0JBQWtCOzs7OzZCQUNsQixtQkFBbUI7Ozs7d0NBQ2QsZ0NBQWdDOzs7O2dDQUNsQyxzQkFBc0I7Ozs7K0JBQ3ZCLHNCQUFzQjs7OztzQ0FDekIsOEJBQThCOzs7OzhCQUM1QixvQkFBb0I7Ozs7eUNBQ2YsaUNBQWlDOzs7OzJCQUN2QyxnQkFBZ0I7Ozs7OzswQkFHdkIsZ0JBQWdCOzs7OzJCQUNmLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBcUI3QixNQUFNO1lBQU4sTUFBTTs7Ozs7Ozs7Ozs7O0FBV0MsV0FYUCxNQUFNLENBV0UsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUM7OzswQkFYNUIsTUFBTTs7O0FBYVIsT0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsRUFBRSxtQkFBaUIsSUFBSSxDQUFDLE9BQU8sRUFBRSxBQUFFLENBQUM7Ozs7Ozs7QUFPakQsV0FBTyxHQUFHLDBCQUFPLE1BQU0sQ0FB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Ozs7O0FBT3JDLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDOztBQUU5QixNQUFNLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLFlBQVc7QUFDOUMsTUFBSSxJQUFJLEdBQUcsNEJBQVMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzs7O0FBSXZDLFNBQU8sRUFBRSxXQUFXLElBQUksSUFBSSxDQUFDLEtBQUssSUFDMUIsaUJBQWlCLElBQUksSUFBSSxDQUFDLEtBQUssSUFDL0IsY0FBYyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQzVCLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUMzQixhQUFhLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQSxzQ0FBdUMsQ0FBQztDQUM1RSxDQUFDOztBQUVGLHlCQUFVLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztxQkFDL0IsTUFBTSIsImZpbGUiOiJzcmMvanMvcGxheWVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBwbGF5ZXIuanNcbiAqL1xuIC8vIFN1YmNsYXNzZXMgQ29tcG9uZW50XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50LmpzJztcblxuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0ICogYXMgRXZlbnRzIGZyb20gJy4vdXRpbHMvZXZlbnRzLmpzJztcbmltcG9ydCAqIGFzIERvbSBmcm9tICcuL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuL3V0aWxzL2ZuLmpzJztcbmltcG9ydCAqIGFzIEd1aWQgZnJvbSAnLi91dGlscy9ndWlkLmpzJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHRvVGl0bGVDYXNlIGZyb20gJy4vdXRpbHMvdG8tdGl0bGUtY2FzZS5qcyc7XG5pbXBvcnQgeyBjcmVhdGVUaW1lUmFuZ2UgfSBmcm9tICcuL3V0aWxzL3RpbWUtcmFuZ2VzLmpzJztcbmltcG9ydCB7IGJ1ZmZlcmVkUGVyY2VudCB9IGZyb20gJy4vdXRpbHMvYnVmZmVyLmpzJztcbmltcG9ydCAqIGFzIHN0eWxlc2hlZXQgZnJvbSAnLi91dGlscy9zdHlsZXNoZWV0LmpzJztcbmltcG9ydCBGdWxsc2NyZWVuQXBpIGZyb20gJy4vZnVsbHNjcmVlbi1hcGkuanMnO1xuaW1wb3J0IE1lZGlhRXJyb3IgZnJvbSAnLi9tZWRpYS1lcnJvci5qcyc7XG5pbXBvcnQgc2FmZVBhcnNlVHVwbGUgZnJvbSAnc2FmZS1qc29uLXBhcnNlL3R1cGxlJztcbmltcG9ydCBhc3NpZ24gZnJvbSAnb2JqZWN0LmFzc2lnbic7XG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4vdXRpbHMvbWVyZ2Utb3B0aW9ucy5qcyc7XG5pbXBvcnQgdGV4dFRyYWNrQ29udmVydGVyIGZyb20gJy4vdHJhY2tzL3RleHQtdHJhY2stbGlzdC1jb252ZXJ0ZXIuanMnO1xuaW1wb3J0IEF1ZGlvVHJhY2tMaXN0IGZyb20gJy4vdHJhY2tzL2F1ZGlvLXRyYWNrLWxpc3QuanMnO1xuaW1wb3J0IFZpZGVvVHJhY2tMaXN0IGZyb20gJy4vdHJhY2tzL3ZpZGVvLXRyYWNrLWxpc3QuanMnO1xuXG4vLyBJbmNsdWRlIHJlcXVpcmVkIGNoaWxkIGNvbXBvbmVudHMgKGltcG9ydGluZyBhbHNvIHJlZ2lzdGVycyB0aGVtKVxuaW1wb3J0IE1lZGlhTG9hZGVyIGZyb20gJy4vdGVjaC9sb2FkZXIuanMnO1xuaW1wb3J0IFBvc3RlckltYWdlIGZyb20gJy4vcG9zdGVyLWltYWdlLmpzJztcbmltcG9ydCBUZXh0VHJhY2tEaXNwbGF5IGZyb20gJy4vdHJhY2tzL3RleHQtdHJhY2stZGlzcGxheS5qcyc7XG5pbXBvcnQgTG9hZGluZ1NwaW5uZXIgZnJvbSAnLi9sb2FkaW5nLXNwaW5uZXIuanMnO1xuaW1wb3J0IEJpZ1BsYXlCdXR0b24gZnJvbSAnLi9iaWctcGxheS1idXR0b24uanMnO1xuaW1wb3J0IENvbnRyb2xCYXIgZnJvbSAnLi9jb250cm9sLWJhci9jb250cm9sLWJhci5qcyc7XG5pbXBvcnQgRXJyb3JEaXNwbGF5IGZyb20gJy4vZXJyb3ItZGlzcGxheS5qcyc7XG5pbXBvcnQgVGV4dFRyYWNrU2V0dGluZ3MgZnJvbSAnLi90cmFja3MvdGV4dC10cmFjay1zZXR0aW5ncy5qcyc7XG5pbXBvcnQgTW9kYWxEaWFsb2cgZnJvbSAnLi9tb2RhbC1kaWFsb2cnO1xuXG4vLyBSZXF1aXJlIGh0bWw1IHRlY2gsIGF0IGxlYXN0IGZvciBkaXNwb3NpbmcgdGhlIG9yaWdpbmFsIHZpZGVvIHRhZ1xuaW1wb3J0IFRlY2ggZnJvbSAnLi90ZWNoL3RlY2guanMnO1xuaW1wb3J0IEh0bWw1IGZyb20gJy4vdGVjaC9odG1sNS5qcyc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhlIGBQbGF5ZXJgIGNsYXNzIGlzIGNyZWF0ZWQgd2hlbiBhbnkgb2YgdGhlIFZpZGVvLmpzIHNldHVwIG1ldGhvZHMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIHZpZGVvLlxuICogYGBganNcbiAqIHZhciBteVBsYXllciA9IHZpZGVvanMoJ2V4YW1wbGVfdmlkZW9fMScpO1xuICogYGBgXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBgZGF0YS1zZXR1cGAgYXR0cmlidXRlIHRlbGxzIHRoZSBWaWRlby5qcyBsaWJyYXJ5IHRvIGNyZWF0ZSBhIHBsYXllciBpbnN0YW5jZSB3aGVuIHRoZSBsaWJyYXJ5IGlzIHJlYWR5LlxuICogYGBgaHRtbFxuICogPHZpZGVvIGlkPVwiZXhhbXBsZV92aWRlb18xXCIgZGF0YS1zZXR1cD0ne30nIGNvbnRyb2xzPlxuICogICA8c291cmNlIHNyYz1cIm15LXNvdXJjZS5tcDRcIiB0eXBlPVwidmlkZW8vbXA0XCI+XG4gKiA8L3ZpZGVvPlxuICogYGBgXG4gKiBBZnRlciBhbiBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIGl0IGNhbiBiZSBhY2Nlc3NlZCBnbG9iYWxseSB1c2luZyBgVmlkZW8oJ2V4YW1wbGVfdmlkZW9fMScpYC5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhZyAgICAgICAgVGhlIG9yaWdpbmFsIHZpZGVvIHRhZyB1c2VkIGZvciBjb25maWd1cmluZyBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgICAgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgICAgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBleHRlbmRzIENvbXBvbmVudFxuICogQGNsYXNzIFBsYXllclxuICovXG5jbGFzcyBQbGF5ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBwbGF5ZXIncyBjb25zdHJ1Y3RvciBmdW5jdGlvblxuICAgKlxuICAgKiBAY29uc3RydWN0c1xuICAgKiBAbWV0aG9kIGluaXRcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWcgICAgICAgIFRoZSBvcmlnaW5hbCB2aWRlbyB0YWcgdXNlZCBmb3IgY29uZmlndXJpbmcgb3B0aW9uc1xuICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgICAgUGxheWVyIG9wdGlvbnNcbiAgICogQHBhcmFtIHtGdW5jdGlvbj19IHJlYWR5ICAgIFJlYWR5IGNhbGxiYWNrIGZ1bmN0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWcsIG9wdGlvbnMsIHJlYWR5KXtcbiAgICAvLyBNYWtlIHN1cmUgdGFnIElEIGV4aXN0c1xuICAgIHRhZy5pZCA9IHRhZy5pZCB8fCBgdmpzX3ZpZGVvXyR7R3VpZC5uZXdHVUlEKCl9YDtcblxuICAgIC8vIFNldCBPcHRpb25zXG4gICAgLy8gVGhlIG9wdGlvbnMgYXJndW1lbnQgb3ZlcnJpZGVzIG9wdGlvbnMgc2V0IGluIHRoZSB2aWRlbyB0YWdcbiAgICAvLyB3aGljaCBvdmVycmlkZXMgZ2xvYmFsbHkgc2V0IG9wdGlvbnMuXG4gICAgLy8gVGhpcyBsYXR0ZXIgcGFydCBjb2luY2lkZXMgd2l0aCB0aGUgbG9hZCBvcmRlclxuICAgIC8vICh0YWcgbXVzdCBleGlzdCBiZWZvcmUgUGxheWVyKVxuICAgIG9wdGlvbnMgPSBhc3NpZ24oUGxheWVyLmdldFRhZ1NldHRpbmdzKHRhZyksIG9wdGlvbnMpO1xuXG4gICAgLy8gRGVsYXkgdGhlIGluaXRpYWxpemF0aW9uIG9mIGNoaWxkcmVuIGJlY2F1c2Ugd2UgbmVlZCB0byBzZXQgdXBcbiAgICAvLyBwbGF5ZXIgcHJvcGVydGllcyBmaXJzdCwgYW5kIGNhbid0IHVzZSBgdGhpc2AgYmVmb3JlIGBzdXBlcigpYFxuICAgIG9wdGlvbnMuaW5pdENoaWxkcmVuID0gZmFsc2U7XG5cbiAgICAvLyBTYW1lIHdpdGggY3JlYXRpbmcgdGhlIGVsZW1lbnRcbiAgICBvcHRpb25zLmNyZWF0ZUVsID0gZmFsc2U7XG5cbiAgICAvLyB3ZSBkb24ndCB3YW50IHRoZSBwbGF5ZXIgdG8gcmVwb3J0IHRvdWNoIGFjdGl2aXR5IG9uIGl0c2VsZlxuICAgIC8vIHNlZSBlbmFibGVUb3VjaEFjdGl2aXR5IGluIENvbXBvbmVudFxuICAgIG9wdGlvbnMucmVwb3J0VG91Y2hBY3Rpdml0eSA9IGZhbHNlO1xuXG4gICAgLy8gUnVuIGJhc2UgY29tcG9uZW50IGluaXRpYWxpemluZyB3aXRoIG5ldyBvcHRpb25zXG4gICAgc3VwZXIobnVsbCwgb3B0aW9ucywgcmVhZHkpO1xuXG4gICAgLy8gaWYgdGhlIGdsb2JhbCBvcHRpb24gb2JqZWN0IHdhcyBhY2NpZGVudGFsbHkgYmxvd24gYXdheSBieVxuICAgIC8vIHNvbWVvbmUsIGJhaWwgZWFybHkgd2l0aCBhbiBpbmZvcm1hdGl2ZSBlcnJvclxuICAgIGlmICghdGhpcy5vcHRpb25zXyB8fFxuICAgICAgICAhdGhpcy5vcHRpb25zXy50ZWNoT3JkZXIgfHxcbiAgICAgICAgIXRoaXMub3B0aW9uc18udGVjaE9yZGVyLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyB0ZWNoT3JkZXIgc3BlY2lmaWVkLiBEaWQgeW91IG92ZXJ3cml0ZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAndmlkZW9qcy5vcHRpb25zIGluc3RlYWQgb2YganVzdCBjaGFuZ2luZyB0aGUgJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ3Byb3BlcnRpZXMgeW91IHdhbnQgdG8gb3ZlcnJpZGU/Jyk7XG4gICAgfVxuXG4gICAgdGhpcy50YWcgPSB0YWc7IC8vIFN0b3JlIHRoZSBvcmlnaW5hbCB0YWcgdXNlZCB0byBzZXQgb3B0aW9uc1xuXG4gICAgLy8gU3RvcmUgdGhlIHRhZyBhdHRyaWJ1dGVzIHVzZWQgdG8gcmVzdG9yZSBodG1sNSBlbGVtZW50XG4gICAgdGhpcy50YWdBdHRyaWJ1dGVzID0gdGFnICYmIERvbS5nZXRFbEF0dHJpYnV0ZXModGFnKTtcblxuICAgIC8vIFVwZGF0ZSBjdXJyZW50IGxhbmd1YWdlXG4gICAgdGhpcy5sYW5ndWFnZSh0aGlzLm9wdGlvbnNfLmxhbmd1YWdlKTtcblxuICAgIC8vIFVwZGF0ZSBTdXBwb3J0ZWQgTGFuZ3VhZ2VzXG4gICAgaWYgKG9wdGlvbnMubGFuZ3VhZ2VzKSB7XG4gICAgICAvLyBOb3JtYWxpc2UgcGxheWVyIG9wdGlvbiBsYW5ndWFnZXMgdG8gbG93ZXJjYXNlXG4gICAgICBsZXQgbGFuZ3VhZ2VzVG9Mb3dlciA9IHt9O1xuXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvcHRpb25zLmxhbmd1YWdlcykuZm9yRWFjaChmdW5jdGlvbihuYW1lKSB7XG4gICAgICAgIGxhbmd1YWdlc1RvTG93ZXJbbmFtZS50b0xvd2VyQ2FzZSgpXSA9IG9wdGlvbnMubGFuZ3VhZ2VzW25hbWVdO1xuICAgICAgfSk7XG4gICAgICB0aGlzLmxhbmd1YWdlc18gPSBsYW5ndWFnZXNUb0xvd2VyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmxhbmd1YWdlc18gPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfLmxhbmd1YWdlcztcbiAgICB9XG5cbiAgICAvLyBDYWNoZSBmb3IgdmlkZW8gcHJvcGVydHkgdmFsdWVzLlxuICAgIHRoaXMuY2FjaGVfID0ge307XG5cbiAgICAvLyBTZXQgcG9zdGVyXG4gICAgdGhpcy5wb3N0ZXJfID0gb3B0aW9ucy5wb3N0ZXIgfHwgJyc7XG5cbiAgICAvLyBTZXQgY29udHJvbHNcbiAgICB0aGlzLmNvbnRyb2xzXyA9ICEhb3B0aW9ucy5jb250cm9scztcblxuICAgIC8vIE9yaWdpbmFsIHRhZyBzZXR0aW5ncyBzdG9yZWQgaW4gb3B0aW9uc1xuICAgIC8vIG5vdyByZW1vdmUgaW1tZWRpYXRlbHkgc28gbmF0aXZlIGNvbnRyb2xzIGRvbid0IGZsYXNoLlxuICAgIC8vIE1heSBiZSB0dXJuZWQgYmFjayBvbiBieSBIVE1MNSB0ZWNoIGlmIG5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggaXMgdHJ1ZVxuICAgIHRhZy5jb250cm9scyA9IGZhbHNlO1xuXG4gICAgLypcbiAgICAgKiBTdG9yZSB0aGUgaW50ZXJuYWwgc3RhdGUgb2Ygc2NydWJiaW5nXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHVzZXIgaXMgc2NydWJiaW5nXG4gICAgICovXG4gICAgdGhpcy5zY3J1YmJpbmdfID0gZmFsc2U7XG5cbiAgICB0aGlzLmVsXyA9IHRoaXMuY3JlYXRlRWwoKTtcblxuICAgIC8vIFdlIGFsc28gd2FudCB0byBwYXNzIHRoZSBvcmlnaW5hbCBwbGF5ZXIgb3B0aW9ucyB0byBlYWNoIGNvbXBvbmVudCBhbmQgcGx1Z2luXG4gICAgLy8gYXMgd2VsbCBzbyB0aGV5IGRvbid0IG5lZWQgdG8gcmVhY2ggYmFjayBpbnRvIHRoZSBwbGF5ZXIgZm9yIG9wdGlvbnMgbGF0ZXIuXG4gICAgLy8gV2UgYWxzbyBuZWVkIHRvIGRvIGFub3RoZXIgY29weSBvZiB0aGlzLm9wdGlvbnNfIHNvIHdlIGRvbid0IGVuZCB1cCB3aXRoXG4gICAgLy8gYW4gaW5maW5pdGUgbG9vcC5cbiAgICBsZXQgcGxheWVyT3B0aW9uc0NvcHkgPSBtZXJnZU9wdGlvbnModGhpcy5vcHRpb25zXyk7XG5cbiAgICAvLyBMb2FkIHBsdWdpbnNcbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBsZXQgcGx1Z2lucyA9IG9wdGlvbnMucGx1Z2lucztcblxuICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocGx1Z2lucykuZm9yRWFjaChmdW5jdGlvbihuYW1lKXtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhpc1tuYW1lXShwbHVnaW5zW25hbWVdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ1VuYWJsZSB0byBmaW5kIHBsdWdpbjonLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgfVxuXG4gICAgdGhpcy5vcHRpb25zXy5wbGF5ZXJPcHRpb25zID0gcGxheWVyT3B0aW9uc0NvcHk7XG5cbiAgICB0aGlzLmluaXRDaGlsZHJlbigpO1xuXG4gICAgLy8gU2V0IGlzQXVkaW8gYmFzZWQgb24gd2hldGhlciBvciBub3QgYW4gYXVkaW8gdGFnIHdhcyB1c2VkXG4gICAgdGhpcy5pc0F1ZGlvKHRhZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnYXVkaW8nKTtcblxuICAgIC8vIFVwZGF0ZSBjb250cm9scyBjbGFzc05hbWUuIENhbid0IGRvIHRoaXMgd2hlbiB0aGUgY29udHJvbHMgYXJlIGluaXRpYWxseVxuICAgIC8vIHNldCBiZWNhdXNlIHRoZSBlbGVtZW50IGRvZXNuJ3QgZXhpc3QgeWV0LlxuICAgIGlmICh0aGlzLmNvbnRyb2xzKCkpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1jb250cm9scy1kaXNhYmxlZCcpO1xuICAgIH1cblxuICAgIC8vIFNldCBBUklBIGxhYmVsIGFuZCByZWdpb24gcm9sZSBkZXBlbmRpbmcgb24gcGxheWVyIHR5cGVcbiAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncmVnaW9uJyk7XG4gICAgaWYgKHRoaXMuaXNBdWRpbygpKSB7XG4gICAgICB0aGlzLmVsXy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnYXVkaW8gcGxheWVyJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxfLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsICd2aWRlbyBwbGF5ZXInKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0F1ZGlvKCkpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1hdWRpbycpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmZsZXhOb3RTdXBwb3J0ZWRfKCkpIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1uby1mbGV4Jyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogTWFrZSB0aGlzIHNtYXJ0ZXIuIFRvZ2dsZSB1c2VyIHN0YXRlIGJldHdlZW4gdG91Y2hpbmcvbW91c2luZ1xuICAgIC8vIHVzaW5nIGV2ZW50cywgc2luY2UgZGV2aWNlcyBjYW4gaGF2ZSBib3RoIHRvdWNoIGFuZCBtb3VzZSBldmVudHMuXG4gICAgLy8gaWYgKGJyb3dzZXIuVE9VQ0hfRU5BQkxFRCkge1xuICAgIC8vICAgdGhpcy5hZGRDbGFzcygndmpzLXRvdWNoLWVuYWJsZWQnKTtcbiAgICAvLyB9XG5cbiAgICAvLyBpT1MgU2FmYXJpIGhhcyBicm9rZW4gaG92ZXIgaGFuZGxpbmdcbiAgICBpZiAoIWJyb3dzZXIuSVNfSU9TKSB7XG4gICAgICB0aGlzLmFkZENsYXNzKCd2anMtd29ya2luZ2hvdmVyJyk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBwbGF5ZXIgZWFzaWx5IGZpbmRhYmxlIGJ5IElEXG4gICAgUGxheWVyLnBsYXllcnNbdGhpcy5pZF9dID0gdGhpcztcblxuICAgIC8vIFdoZW4gdGhlIHBsYXllciBpcyBmaXJzdCBpbml0aWFsaXplZCwgdHJpZ2dlciBhY3Rpdml0eSBzbyBjb21wb25lbnRzXG4gICAgLy8gbGlrZSB0aGUgY29udHJvbCBiYXIgc2hvdyB0aGVtc2VsdmVzIGlmIG5lZWRlZFxuICAgIHRoaXMudXNlckFjdGl2ZSh0cnVlKTtcbiAgICB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSgpO1xuICAgIHRoaXMubGlzdGVuRm9yVXNlckFjdGl2aXR5XygpO1xuXG4gICAgdGhpcy5vbignZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMuaGFuZGxlRnVsbHNjcmVlbkNoYW5nZV8pO1xuICAgIHRoaXMub24oJ3N0YWdlY2xpY2snLCB0aGlzLmhhbmRsZVN0YWdlQ2xpY2tfKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgdmlkZW8gcGxheWVyIGFuZCBkb2VzIGFueSBuZWNlc3NhcnkgY2xlYW51cFxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlQbGF5ZXIuZGlzcG9zZSgpO1xuICAgKiBgYGBcbiAgICogVGhpcyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBkeW5hbWljYWxseSBhZGRpbmcgYW5kIHJlbW92aW5nIHZpZGVvc1xuICAgKiB0by9mcm9tIHRoZSBET00uXG4gICAqXG4gICAqIEBtZXRob2QgZGlzcG9zZVxuICAgKi9cbiAgZGlzcG9zZSgpIHtcbiAgICB0aGlzLnRyaWdnZXIoJ2Rpc3Bvc2UnKTtcbiAgICAvLyBwcmV2ZW50IGRpc3Bvc2UgZnJvbSBiZWluZyBjYWxsZWQgdHdpY2VcbiAgICB0aGlzLm9mZignZGlzcG9zZScpO1xuXG4gICAgaWYgKHRoaXMuc3R5bGVFbF8gJiYgdGhpcy5zdHlsZUVsXy5wYXJlbnROb2RlKSB7XG4gICAgICB0aGlzLnN0eWxlRWxfLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5zdHlsZUVsXyk7XG4gICAgfVxuXG4gICAgLy8gS2lsbCByZWZlcmVuY2UgdG8gdGhpcyBwbGF5ZXJcbiAgICBQbGF5ZXIucGxheWVyc1t0aGlzLmlkX10gPSBudWxsO1xuICAgIGlmICh0aGlzLnRhZyAmJiB0aGlzLnRhZy5wbGF5ZXIpIHsgdGhpcy50YWcucGxheWVyID0gbnVsbDsgfVxuICAgIGlmICh0aGlzLmVsXyAmJiB0aGlzLmVsXy5wbGF5ZXIpIHsgdGhpcy5lbF8ucGxheWVyID0gbnVsbDsgfVxuXG4gICAgaWYgKHRoaXMudGVjaF8pIHsgdGhpcy50ZWNoXy5kaXNwb3NlKCk7IH1cblxuICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIGxldCBlbCA9IHRoaXMuZWxfID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicpO1xuICAgIGxldCB0YWcgPSB0aGlzLnRhZztcblxuICAgIC8vIFJlbW92ZSB3aWR0aC9oZWlnaHQgYXR0cnMgZnJvbSB0YWcgc28gQ1NTIGNhbiBtYWtlIGl0IDEwMCUgd2lkdGgvaGVpZ2h0XG4gICAgdGFnLnJlbW92ZUF0dHJpYnV0ZSgnd2lkdGgnKTtcbiAgICB0YWcucmVtb3ZlQXR0cmlidXRlKCdoZWlnaHQnKTtcblxuICAgIC8vIENvcHkgb3ZlciBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgdGFnLCBpbmNsdWRpbmcgSUQgYW5kIGNsYXNzXG4gICAgLy8gSUQgd2lsbCBub3cgcmVmZXJlbmNlIHBsYXllciBib3gsIG5vdCB0aGUgdmlkZW8gdGFnXG4gICAgY29uc3QgYXR0cnMgPSBEb20uZ2V0RWxBdHRyaWJ1dGVzKHRhZyk7XG5cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhdHRycykuZm9yRWFjaChmdW5jdGlvbihhdHRyKXtcbiAgICAgIC8vIHdvcmthcm91bmQgc28gd2UgZG9uJ3QgdG90YWxseSBicmVhayBJRTdcbiAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzY1MzQ0NC9jc3Mtc3R5bGVzLW5vdC1hcHBsaWVkLW9uLWR5bmFtaWMtZWxlbWVudHMtaW4taW50ZXJuZXQtZXhwbG9yZXItN1xuICAgICAgaWYgKGF0dHIgPT09ICdjbGFzcycpIHtcbiAgICAgICAgZWwuY2xhc3NOYW1lID0gYXR0cnNbYXR0cl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoYXR0ciwgYXR0cnNbYXR0cl0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXBkYXRlIHRhZyBpZC9jbGFzcyBmb3IgdXNlIGFzIEhUTUw1IHBsYXliYWNrIHRlY2hcbiAgICAvLyBNaWdodCB0aGluayB3ZSBzaG91bGQgZG8gdGhpcyBhZnRlciBlbWJlZGRpbmcgaW4gY29udGFpbmVyIHNvIC52anMtdGVjaCBjbGFzc1xuICAgIC8vIGRvZXNuJ3QgZmxhc2ggMTAwJSB3aWR0aC9oZWlnaHQsIGJ1dCBjbGFzcyBvbmx5IGFwcGxpZXMgd2l0aCAudmlkZW8tanMgcGFyZW50XG4gICAgdGFnLnBsYXllcklkID0gdGFnLmlkO1xuICAgIHRhZy5pZCArPSAnX2h0bWw1X2FwaSc7XG4gICAgdGFnLmNsYXNzTmFtZSA9ICd2anMtdGVjaCc7XG5cbiAgICAvLyBNYWtlIHBsYXllciBmaW5kYWJsZSBvbiBlbGVtZW50c1xuICAgIHRhZy5wbGF5ZXIgPSBlbC5wbGF5ZXIgPSB0aGlzO1xuICAgIC8vIERlZmF1bHQgc3RhdGUgb2YgdmlkZW8gaXMgcGF1c2VkXG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBhdXNlZCcpO1xuXG4gICAgLy8gQWRkIGEgc3R5bGUgZWxlbWVudCBpbiB0aGUgcGxheWVyIHRoYXQgd2UnbGwgdXNlIHRvIHNldCB0aGUgd2lkdGgvaGVpZ2h0XG4gICAgLy8gb2YgdGhlIHBsYXllciBpbiBhIHdheSB0aGF0J3Mgc3RpbGwgb3ZlcnJpZGVhYmxlIGJ5IENTUywganVzdCBsaWtlIHRoZVxuICAgIC8vIHZpZGVvIGVsZW1lbnRcbiAgICBpZiAod2luZG93LlZJREVPSlNfTk9fRFlOQU1JQ19TVFlMRSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5zdHlsZUVsXyA9IHN0eWxlc2hlZXQuY3JlYXRlU3R5bGVFbGVtZW50KCd2anMtc3R5bGVzLWRpbWVuc2lvbnMnKTtcbiAgICAgIGxldCBkZWZhdWx0c1N0eWxlRWwgPSBEb20uJCgnLnZqcy1zdHlsZXMtZGVmYXVsdHMnKTtcbiAgICAgIGxldCBoZWFkID0gRG9tLiQoJ2hlYWQnKTtcbiAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHRoaXMuc3R5bGVFbF8sIGRlZmF1bHRzU3R5bGVFbCA/IGRlZmF1bHRzU3R5bGVFbC5uZXh0U2libGluZyA6IGhlYWQuZmlyc3RDaGlsZCk7XG4gICAgfVxuXG4gICAgLy8gUGFzcyBpbiB0aGUgd2lkdGgvaGVpZ2h0L2FzcGVjdFJhdGlvIG9wdGlvbnMgd2hpY2ggd2lsbCB1cGRhdGUgdGhlIHN0eWxlIGVsXG4gICAgdGhpcy53aWR0aCh0aGlzLm9wdGlvbnNfLndpZHRoKTtcbiAgICB0aGlzLmhlaWdodCh0aGlzLm9wdGlvbnNfLmhlaWdodCk7XG4gICAgdGhpcy5mbHVpZCh0aGlzLm9wdGlvbnNfLmZsdWlkKTtcbiAgICB0aGlzLmFzcGVjdFJhdGlvKHRoaXMub3B0aW9uc18uYXNwZWN0UmF0aW8pO1xuXG4gICAgLy8gSGlkZSBhbnkgbGlua3Mgd2l0aGluIHRoZSB2aWRlby9hdWRpbyB0YWcsIGJlY2F1c2UgSUUgZG9lc24ndCBoaWRlIHRoZW0gY29tcGxldGVseS5cbiAgICBsZXQgbGlua3MgPSB0YWcuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2EnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmtzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgbGlua0VsID0gbGlua3MuaXRlbShpKTtcbiAgICAgIERvbS5hZGRFbENsYXNzKGxpbmtFbCwgJ3Zqcy1oaWRkZW4nKTtcbiAgICAgIGxpbmtFbC5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvLyBpbnNlcnRFbEZpcnN0IHNlZW1zIHRvIGNhdXNlIHRoZSBuZXR3b3JrU3RhdGUgdG8gZmxpY2tlciBmcm9tIDMgdG8gMiwgc29cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBmb3IgbGF0ZXIgc28gd2UgY2FuIGtub3cgaWYgdGhlIHNvdXJjZSBvcmlnaW5hbGx5IGZhaWxlZFxuICAgIHRhZy5pbml0TmV0d29ya1N0YXRlXyA9IHRhZy5uZXR3b3JrU3RhdGU7XG5cbiAgICAvLyBXcmFwIHZpZGVvIHRhZyBpbiBkaXYgKGVsL2JveCkgY29udGFpbmVyXG4gICAgaWYgKHRhZy5wYXJlbnROb2RlKSB7XG4gICAgICB0YWcucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZWwsIHRhZyk7XG4gICAgfVxuXG4gICAgLy8gaW5zZXJ0IHRoZSB0YWcgYXMgdGhlIGZpcnN0IGNoaWxkIG9mIHRoZSBwbGF5ZXIgZWxlbWVudFxuICAgIC8vIHRoZW4gbWFudWFsbHkgYWRkIGl0IHRvIHRoZSBjaGlsZHJlbiBhcnJheSBzbyB0aGF0IHRoaXMuYWRkQ2hpbGRcbiAgICAvLyB3aWxsIHdvcmsgcHJvcGVybHkgZm9yIG90aGVyIGNvbXBvbmVudHNcbiAgICBEb20uaW5zZXJ0RWxGaXJzdCh0YWcsIGVsKTsgLy8gQnJlYWtzIGlQaG9uZSwgZml4ZWQgaW4gSFRNTDUgc2V0dXAuXG4gICAgdGhpcy5jaGlsZHJlbl8udW5zaGlmdCh0YWcpO1xuXG4gICAgdGhpcy5lbF8gPSBlbDtcblxuICAgIHJldHVybiBlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHBsYXllciB3aWR0aFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcj19IHZhbHVlIFZhbHVlIGZvciB3aWR0aFxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IFdpZHRoIHdoZW4gZ2V0dGluZ1xuICAgKiBAbWV0aG9kIHdpZHRoXG4gICAqL1xuICB3aWR0aCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignd2lkdGgnLCB2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0L3NldCBwbGF5ZXIgaGVpZ2h0XG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyPX0gdmFsdWUgVmFsdWUgZm9yIGhlaWdodFxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEhlaWdodCB3aGVuIGdldHRpbmdcbiAgICogQG1ldGhvZCBoZWlnaHRcbiAgICovXG4gIGhlaWdodCh2YWx1ZSkge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbignaGVpZ2h0JywgdmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldC9zZXQgZGltZW5zaW9uIGZvciBwbGF5ZXJcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGRpbWVuc2lvbiBFaXRoZXIgd2lkdGggb3IgaGVpZ2h0XG4gICAqIEBwYXJhbSB7TnVtYmVyPX0gdmFsdWUgVmFsdWUgZm9yIGRpbWVuc2lvblxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBtZXRob2QgZGltZW5zaW9uXG4gICAqL1xuICBkaW1lbnNpb24oZGltZW5zaW9uLCB2YWx1ZSkge1xuICAgIGxldCBwcml2RGltZW5zaW9uID0gZGltZW5zaW9uICsgJ18nO1xuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzW3ByaXZEaW1lbnNpb25dIHx8IDA7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlID09PSAnJykge1xuICAgICAgLy8gSWYgYW4gZW1wdHkgc3RyaW5nIGlzIGdpdmVuLCByZXNldCB0aGUgZGltZW5zaW9uIHRvIGJlIGF1dG9tYXRpY1xuICAgICAgdGhpc1twcml2RGltZW5zaW9uXSA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHBhcnNlZFZhbCA9IHBhcnNlRmxvYXQodmFsdWUpO1xuXG4gICAgICBpZiAoaXNOYU4ocGFyc2VkVmFsKSkge1xuICAgICAgICBsb2cuZXJyb3IoYEltcHJvcGVyIHZhbHVlIFwiJHt2YWx1ZX1cIiBzdXBwbGllZCBmb3IgZm9yICR7ZGltZW5zaW9ufWApO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH1cblxuICAgICAgdGhpc1twcml2RGltZW5zaW9uXSA9IHBhcnNlZFZhbDtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZVN0eWxlRWxfKCk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkL3JlbW92ZSB0aGUgdmpzLWZsdWlkIGNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gYm9vbCBWYWx1ZSBvZiB0cnVlIGFkZHMgdGhlIGNsYXNzLCB2YWx1ZSBvZiBmYWxzZSByZW1vdmVzIHRoZSBjbGFzc1xuICAgKiBAbWV0aG9kIGZsdWlkXG4gICAqL1xuICBmbHVpZChib29sKSB7XG4gICAgaWYgKGJvb2wgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuICEhdGhpcy5mbHVpZF87XG4gICAgfVxuXG4gICAgdGhpcy5mbHVpZF8gPSAhIWJvb2w7XG5cbiAgICBpZiAoYm9vbCkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWZsdWlkJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1mbHVpZCcpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvU2V0IHRoZSBhc3BlY3QgcmF0aW9cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmc9fSByYXRpbyBBc3BlY3QgcmF0aW8gZm9yIHBsYXllclxuICAgKiBAcmV0dXJuIGFzcGVjdFJhdGlvXG4gICAqIEBtZXRob2QgYXNwZWN0UmF0aW9cbiAgICovXG4gIGFzcGVjdFJhdGlvKHJhdGlvKSB7XG4gICAgaWYgKHJhdGlvID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFzcGVjdFJhdGlvXztcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igd2lkdGg6aGVpZ2h0IGZvcm1hdFxuICAgIGlmICghL15cXGQrXFw6XFxkKyQvLnRlc3QocmF0aW8pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltcHJvcGVyIHZhbHVlIHN1cHBsaWVkIGZvciBhc3BlY3QgcmF0aW8uIFRoZSBmb3JtYXQgc2hvdWxkIGJlIHdpZHRoOmhlaWdodCwgZm9yIGV4YW1wbGUgMTY6OS4nKTtcbiAgICB9XG4gICAgdGhpcy5hc3BlY3RSYXRpb18gPSByYXRpbztcblxuICAgIC8vIFdlJ3JlIGFzc3VtaW5nIGlmIHlvdSBzZXQgYW4gYXNwZWN0IHJhdGlvIHlvdSB3YW50IGZsdWlkIG1vZGUsXG4gICAgLy8gYmVjYXVzZSBpbiBmaXhlZCBtb2RlIHlvdSBjb3VsZCBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodCB5b3Vyc2VsZi5cbiAgICB0aGlzLmZsdWlkKHRydWUpO1xuXG4gICAgdGhpcy51cGRhdGVTdHlsZUVsXygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBzdHlsZXMgb2YgdGhlIHBsYXllciBlbGVtZW50IChoZWlnaHQsIHdpZHRoIGFuZCBhc3BlY3QgcmF0aW8pXG4gICAqXG4gICAqIEBtZXRob2QgdXBkYXRlU3R5bGVFbF9cbiAgICovXG4gIHVwZGF0ZVN0eWxlRWxfKCkge1xuICAgIGlmICh3aW5kb3cuVklERU9KU19OT19EWU5BTUlDX1NUWUxFID09PSB0cnVlKSB7XG4gICAgICBjb25zdCB3aWR0aCA9IHR5cGVvZiB0aGlzLndpZHRoXyA9PT0gJ251bWJlcicgPyB0aGlzLndpZHRoXyA6IHRoaXMub3B0aW9uc18ud2lkdGg7XG4gICAgICBjb25zdCBoZWlnaHQgPSB0eXBlb2YgdGhpcy5oZWlnaHRfID09PSAnbnVtYmVyJyA/IHRoaXMuaGVpZ2h0XyA6IHRoaXMub3B0aW9uc18uaGVpZ2h0O1xuICAgICAgbGV0IHRlY2hFbCA9IHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy5lbCgpO1xuXG4gICAgICBpZiAodGVjaEVsKSB7XG4gICAgICAgIGlmICh3aWR0aCA+PSAwKSB7XG4gICAgICAgICAgdGVjaEVsLndpZHRoID0gd2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlaWdodCA+PSAwKSB7XG4gICAgICAgICAgdGVjaEVsLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHdpZHRoO1xuICAgIGxldCBoZWlnaHQ7XG4gICAgbGV0IGFzcGVjdFJhdGlvO1xuICAgIGxldCBpZENsYXNzO1xuXG4gICAgLy8gVGhlIGFzcGVjdCByYXRpbyBpcyBlaXRoZXIgdXNlZCBkaXJlY3RseSBvciB0byBjYWxjdWxhdGUgd2lkdGggYW5kIGhlaWdodC5cbiAgICBpZiAodGhpcy5hc3BlY3RSYXRpb18gIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFzcGVjdFJhdGlvXyAhPT0gJ2F1dG8nKSB7XG4gICAgICAvLyBVc2UgYW55IGFzcGVjdFJhdGlvIHRoYXQncyBiZWVuIHNwZWNpZmljYWxseSBzZXRcbiAgICAgIGFzcGVjdFJhdGlvID0gdGhpcy5hc3BlY3RSYXRpb187XG4gICAgfSBlbHNlIGlmICh0aGlzLnZpZGVvV2lkdGgoKSkge1xuICAgICAgLy8gT3RoZXJ3aXNlIHRyeSB0byBnZXQgdGhlIGFzcGVjdCByYXRpbyBmcm9tIHRoZSB2aWRlbyBtZXRhZGF0YVxuICAgICAgYXNwZWN0UmF0aW8gPSB0aGlzLnZpZGVvV2lkdGgoKSArICc6JyArIHRoaXMudmlkZW9IZWlnaHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3IgdXNlIGEgZGVmYXVsdC4gVGhlIHZpZGVvIGVsZW1lbnQncyBpcyAyOjEsIGJ1dCAxNjo5IGlzIG1vcmUgY29tbW9uLlxuICAgICAgYXNwZWN0UmF0aW8gPSAnMTY6OSc7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSByYXRpbyBhcyBhIGRlY2ltYWwgd2UgY2FuIHVzZSB0byBjYWxjdWxhdGUgZGltZW5zaW9uc1xuICAgIGxldCByYXRpb1BhcnRzID0gYXNwZWN0UmF0aW8uc3BsaXQoJzonKTtcbiAgICBsZXQgcmF0aW9NdWx0aXBsaWVyID0gcmF0aW9QYXJ0c1sxXSAvIHJhdGlvUGFydHNbMF07XG5cbiAgICBpZiAodGhpcy53aWR0aF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIGFueSB3aWR0aCB0aGF0J3MgYmVlbiBzcGVjaWZpY2FsbHkgc2V0XG4gICAgICB3aWR0aCA9IHRoaXMud2lkdGhfO1xuICAgIH0gZWxzZSBpZiAodGhpcy5oZWlnaHRfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9yIGNhbHVsYXRlIHRoZSB3aWR0aCBmcm9tIHRoZSBhc3BlY3QgcmF0aW8gaWYgYSBoZWlnaHQgaGFzIGJlZW4gc2V0XG4gICAgICB3aWR0aCA9IHRoaXMuaGVpZ2h0XyAvIHJhdGlvTXVsdGlwbGllcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gT3IgdXNlIHRoZSB2aWRlbydzIG1ldGFkYXRhLCBvciB1c2UgdGhlIHZpZGVvIGVsJ3MgZGVmYXVsdCBvZiAzMDBcbiAgICAgIHdpZHRoID0gdGhpcy52aWRlb1dpZHRoKCkgfHwgMzAwO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhlaWdodF8gIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gVXNlIGFueSBoZWlnaHQgdGhhdCdzIGJlZW4gc3BlY2lmaWNhbGx5IHNldFxuICAgICAgaGVpZ2h0ID0gdGhpcy5oZWlnaHRfO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBPdGhlcndpc2UgY2FsY3VsYXRlIHRoZSBoZWlnaHQgZnJvbSB0aGUgcmF0aW8gYW5kIHRoZSB3aWR0aFxuICAgICAgaGVpZ2h0ID0gd2lkdGggICogcmF0aW9NdWx0aXBsaWVyO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgQ1NTIGNsYXNzIGlzIHZhbGlkIGJ5IHN0YXJ0aW5nIHdpdGggYW4gYWxwaGEgY2hhcmFjdGVyXG4gICAgaWYgKC9eW15hLXpBLVpdLy50ZXN0KHRoaXMuaWQoKSkpIHtcbiAgICAgIGlkQ2xhc3MgPSAnZGltZW5zaW9ucy0nK3RoaXMuaWQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRDbGFzcyA9IHRoaXMuaWQoKSsnLWRpbWVuc2lvbnMnO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0aGUgcmlnaHQgY2xhc3MgaXMgc3RpbGwgb24gdGhlIHBsYXllciBmb3IgdGhlIHN0eWxlIGVsZW1lbnRcbiAgICB0aGlzLmFkZENsYXNzKGlkQ2xhc3MpO1xuXG4gICAgc3R5bGVzaGVldC5zZXRUZXh0Q29udGVudCh0aGlzLnN0eWxlRWxfLCBgXG4gICAgICAuJHtpZENsYXNzfSB7XG4gICAgICAgIHdpZHRoOiAke3dpZHRofXB4O1xuICAgICAgICBoZWlnaHQ6ICR7aGVpZ2h0fXB4O1xuICAgICAgfVxuXG4gICAgICAuJHtpZENsYXNzfS52anMtZmx1aWQge1xuICAgICAgICBwYWRkaW5nLXRvcDogJHtyYXRpb011bHRpcGxpZXIgKiAxMDB9JTtcbiAgICAgIH1cbiAgICBgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIHRoZSBNZWRpYSBQbGF5YmFjayBUZWNobm9sb2d5ICh0ZWNoKVxuICAgKiBMb2FkL0NyZWF0ZSBhbiBpbnN0YW5jZSBvZiBwbGF5YmFjayB0ZWNobm9sb2d5IGluY2x1ZGluZyBlbGVtZW50IGFuZCBBUEkgbWV0aG9kc1xuICAgKiBBbmQgYXBwZW5kIHBsYXliYWNrIGVsZW1lbnQgaW4gcGxheWVyIGRpdi5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHRlY2hOYW1lIE5hbWUgb2YgdGhlIHBsYXliYWNrIHRlY2hub2xvZ3lcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNvdXJjZSBWaWRlbyBzb3VyY2VcbiAgICogQG1ldGhvZCBsb2FkVGVjaF9cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGxvYWRUZWNoXyh0ZWNoTmFtZSwgc291cmNlKSB7XG5cbiAgICAvLyBQYXVzZSBhbmQgcmVtb3ZlIGN1cnJlbnQgcGxheWJhY2sgdGVjaG5vbG9neVxuICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnVubG9hZFRlY2hfKCk7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHJpZCBvZiB0aGUgSFRNTDUgdmlkZW8gdGFnIGFzIHNvb24gYXMgd2UgYXJlIHVzaW5nIGFub3RoZXIgdGVjaFxuICAgIGlmICh0ZWNoTmFtZSAhPT0gJ0h0bWw1JyAmJiB0aGlzLnRhZykge1xuICAgICAgVGVjaC5nZXRUZWNoKCdIdG1sNScpLmRpc3Bvc2VNZWRpYUVsZW1lbnQodGhpcy50YWcpO1xuICAgICAgdGhpcy50YWcucGxheWVyID0gbnVsbDtcbiAgICAgIHRoaXMudGFnID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLnRlY2hOYW1lXyA9IHRlY2hOYW1lO1xuXG4gICAgLy8gVHVybiBvZmYgQVBJIGFjY2VzcyBiZWNhdXNlIHdlJ3JlIGxvYWRpbmcgYSBuZXcgdGVjaCB0aGF0IG1pZ2h0IGxvYWQgYXN5bmNocm9ub3VzbHlcbiAgICB0aGlzLmlzUmVhZHlfID0gZmFsc2U7XG5cbiAgICAvLyBHcmFiIHRlY2gtc3BlY2lmaWMgb3B0aW9ucyBmcm9tIHBsYXllciBvcHRpb25zIGFuZCBhZGQgc291cmNlIGFuZCBwYXJlbnQgZWxlbWVudCB0byB1c2UuXG4gICAgdmFyIHRlY2hPcHRpb25zID0gYXNzaWduKHtcbiAgICAgICduYXRpdmVDb250cm9sc0ZvclRvdWNoJzogdGhpcy5vcHRpb25zXy5uYXRpdmVDb250cm9sc0ZvclRvdWNoLFxuICAgICAgJ3NvdXJjZSc6IHNvdXJjZSxcbiAgICAgICdwbGF5ZXJJZCc6IHRoaXMuaWQoKSxcbiAgICAgICd0ZWNoSWQnOiBgJHt0aGlzLmlkKCl9XyR7dGVjaE5hbWV9X2FwaWAsXG4gICAgICAndmlkZW9UcmFja3MnOiB0aGlzLnZpZGVvVHJhY2tzXyxcbiAgICAgICd0ZXh0VHJhY2tzJzogdGhpcy50ZXh0VHJhY2tzXyxcbiAgICAgICdhdWRpb1RyYWNrcyc6IHRoaXMuYXVkaW9UcmFja3NfLFxuICAgICAgJ2F1dG9wbGF5JzogdGhpcy5vcHRpb25zXy5hdXRvcGxheSxcbiAgICAgICdjb250cm9scyc6IHRoaXMub3B0aW9uc18uY29udHJvbHMsXG4gICAgICAncHJlbG9hZCc6IHRoaXMub3B0aW9uc18ucHJlbG9hZCxcbiAgICAgICdsb29wJzogdGhpcy5vcHRpb25zXy5sb29wLFxuICAgICAgJ211dGVkJzogdGhpcy5vcHRpb25zXy5tdXRlZCxcbiAgICAgICdwb3N0ZXInOiB0aGlzLnBvc3RlcigpLFxuICAgICAgJ2xhbmd1YWdlJzogdGhpcy5sYW5ndWFnZSgpLFxuICAgICAgJ3Z0dC5qcyc6IHRoaXMub3B0aW9uc19bJ3Z0dC5qcyddXG4gICAgfSwgdGhpcy5vcHRpb25zX1t0ZWNoTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG5cbiAgICBpZiAodGhpcy50YWcpIHtcbiAgICAgIHRlY2hPcHRpb25zLnRhZyA9IHRoaXMudGFnO1xuICAgIH1cblxuICAgIGlmIChzb3VyY2UpIHtcbiAgICAgIHRoaXMuY3VycmVudFR5cGVfID0gc291cmNlLnR5cGU7XG4gICAgICBpZiAoc291cmNlLnNyYyA9PT0gdGhpcy5jYWNoZV8uc3JjICYmIHRoaXMuY2FjaGVfLmN1cnJlbnRUaW1lID4gMCkge1xuICAgICAgICB0ZWNoT3B0aW9ucy5zdGFydFRpbWUgPSB0aGlzLmNhY2hlXy5jdXJyZW50VGltZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jYWNoZV8uc3JjID0gc291cmNlLnNyYztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIHRlY2ggaW5zdGFuY2VcbiAgICBsZXQgdGVjaENvbXBvbmVudCA9IFRlY2guZ2V0VGVjaCh0ZWNoTmFtZSk7XG4gICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgIC8vIFJlbW92ZSBvbmNlIHRoYXQgZGVwcmVjYXRlZCBiZWhhdmlvciBpcyByZW1vdmVkLlxuICAgIGlmICghdGVjaENvbXBvbmVudCkge1xuICAgICAgdGVjaENvbXBvbmVudCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQodGVjaE5hbWUpO1xuICAgIH1cbiAgICB0aGlzLnRlY2hfID0gbmV3IHRlY2hDb21wb25lbnQodGVjaE9wdGlvbnMpO1xuXG4gICAgLy8gcGxheWVyLnRyaWdnZXJSZWFkeSBpcyBhbHdheXMgYXN5bmMsIHNvIGRvbid0IG5lZWQgdGhpcyB0byBiZSBhc3luY1xuICAgIHRoaXMudGVjaF8ucmVhZHkoRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZVRlY2hSZWFkeV8pLCB0cnVlKTtcblxuICAgIHRleHRUcmFja0NvbnZlcnRlci5qc29uVG9UZXh0VHJhY2tzKHRoaXMudGV4dFRyYWNrc0pzb25fIHx8IFtdLCB0aGlzLnRlY2hfKTtcblxuICAgIC8vIExpc3RlbiB0byBhbGwgSFRNTDUtZGVmaW5lZCBldmVudHMgYW5kIHRyaWdnZXIgdGhlbSBvbiB0aGUgcGxheWVyXG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnbG9hZHN0YXJ0JywgdGhpcy5oYW5kbGVUZWNoTG9hZFN0YXJ0Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnd2FpdGluZycsIHRoaXMuaGFuZGxlVGVjaFdhaXRpbmdfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdjYW5wbGF5JywgdGhpcy5oYW5kbGVUZWNoQ2FuUGxheV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2NhbnBsYXl0aHJvdWdoJywgdGhpcy5oYW5kbGVUZWNoQ2FuUGxheVRocm91Z2hfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdwbGF5aW5nJywgdGhpcy5oYW5kbGVUZWNoUGxheWluZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2VuZGVkJywgdGhpcy5oYW5kbGVUZWNoRW5kZWRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzZWVraW5nJywgdGhpcy5oYW5kbGVUZWNoU2Vla2luZ18pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3NlZWtlZCcsIHRoaXMuaGFuZGxlVGVjaFNlZWtlZF8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3BsYXknLCB0aGlzLmhhbmRsZVRlY2hQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnZmlyc3RwbGF5JywgdGhpcy5oYW5kbGVUZWNoRmlyc3RQbGF5Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncGF1c2UnLCB0aGlzLmhhbmRsZVRlY2hQYXVzZV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3Byb2dyZXNzJywgdGhpcy5oYW5kbGVUZWNoUHJvZ3Jlc3NfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdkdXJhdGlvbmNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlXyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnZnVsbHNjcmVlbmNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaEZ1bGxzY3JlZW5DaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdlcnJvcicsIHRoaXMuaGFuZGxlVGVjaEVycm9yXyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnc3VzcGVuZCcsIHRoaXMuaGFuZGxlVGVjaFN1c3BlbmRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdhYm9ydCcsIHRoaXMuaGFuZGxlVGVjaEFib3J0Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAnZW1wdGllZCcsIHRoaXMuaGFuZGxlVGVjaEVtcHRpZWRfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdzdGFsbGVkJywgdGhpcy5oYW5kbGVUZWNoU3RhbGxlZF8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ2xvYWRlZG1ldGFkYXRhJywgdGhpcy5oYW5kbGVUZWNoTG9hZGVkTWV0YURhdGFfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2FkZWRkYXRhJywgdGhpcy5oYW5kbGVUZWNoTG9hZGVkRGF0YV8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3RpbWV1cGRhdGUnLCB0aGlzLmhhbmRsZVRlY2hUaW1lVXBkYXRlXyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAncmF0ZWNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaFJhdGVDaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd2b2x1bWVjaGFuZ2UnLCB0aGlzLmhhbmRsZVRlY2hWb2x1bWVDaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICd0ZXh0dHJhY2tjaGFuZ2UnLCB0aGlzLmhhbmRsZVRlY2hUZXh0VHJhY2tDaGFuZ2VfKTtcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdsb2FkZWRtZXRhZGF0YScsIHRoaXMudXBkYXRlU3R5bGVFbF8pO1xuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3Bvc3RlcmNoYW5nZScsIHRoaXMuaGFuZGxlVGVjaFBvc3RlckNoYW5nZV8pO1xuXG4gICAgLy8gQWRkIHRoZSB0ZWNoIGVsZW1lbnQgaW4gdGhlIERPTSBpZiBpdCB3YXMgbm90IGFscmVhZHkgdGhlcmVcbiAgICAvLyBNYWtlIHN1cmUgdG8gbm90IGluc2VydCB0aGUgb3JpZ2luYWwgdmlkZW8gZWxlbWVudCBpZiB1c2luZyBIdG1sNVxuICAgIGlmICh0aGlzLnRlY2hfLmVsKCkucGFyZW50Tm9kZSAhPT0gdGhpcy5lbCgpICYmICh0ZWNoTmFtZSAhPT0gJ0h0bWw1JyB8fCAhdGhpcy50YWcpKSB7XG4gICAgICBEb20uaW5zZXJ0RWxGaXJzdCh0aGlzLnRlY2hfLmVsKCksIHRoaXMuZWwoKSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHJpZCBvZiB0aGUgb3JpZ2luYWwgdmlkZW8gdGFnIHJlZmVyZW5jZSBhZnRlciB0aGUgZmlyc3QgdGVjaCBpcyBsb2FkZWRcbiAgICBpZiAodGhpcy50YWcpIHtcbiAgICAgIHRoaXMudGFnLnBsYXllciA9IG51bGw7XG4gICAgICB0aGlzLnRhZyA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVubG9hZCBwbGF5YmFjayB0ZWNobm9sb2d5XG4gICAqXG4gICAqIEBtZXRob2QgdW5sb2FkVGVjaF9cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHVubG9hZFRlY2hfKCkge1xuICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgdGV4dCB0cmFja3Mgc28gdGhhdCB3ZSBjYW4gcmV1c2UgdGhlIHNhbWUgdGV4dCB0cmFja3Mgd2l0aCB0aGUgbmV4dCB0ZWNoXG4gICAgdGhpcy52aWRlb1RyYWNrc18gPSB0aGlzLnZpZGVvVHJhY2tzKCk7XG4gICAgdGhpcy50ZXh0VHJhY2tzXyA9IHRoaXMudGV4dFRyYWNrcygpO1xuICAgIHRoaXMuYXVkaW9UcmFja3NfID0gdGhpcy5hdWRpb1RyYWNrcygpO1xuICAgIHRoaXMudGV4dFRyYWNrc0pzb25fID0gdGV4dFRyYWNrQ29udmVydGVyLnRleHRUcmFja3NUb0pzb24odGhpcy50ZWNoXyk7XG5cbiAgICB0aGlzLmlzUmVhZHlfID0gZmFsc2U7XG5cbiAgICB0aGlzLnRlY2hfLmRpc3Bvc2UoKTtcblxuICAgIHRoaXMudGVjaF8gPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgdGVjaC5cbiAgICogSXQgd2lsbCBvbmx5IHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdGVjaCBpZiBnaXZlbiBhbiBvYmplY3Qgd2l0aCB0aGVcbiAgICogYElXaWxsTm90VXNlVGhpc0luUGx1Z2luc2AgcHJvcGVydHkgb24gaXQuIFRoaXMgaXMgdHJ5IGFuZCBwcmV2ZW50IG1pc3VzZVxuICAgKiBvZiB0ZWNocyBieSBwbHVnaW5zLlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH1cbiAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgVGVjaFxuICAgKiBAbWV0aG9kIHRlY2hcbiAgICovXG4gIHRlY2goc2FmZXR5KSB7XG4gICAgaWYgKHNhZmV0eSAmJiBzYWZldHkuSVdpbGxOb3RVc2VUaGlzSW5QbHVnaW5zKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoXztcbiAgICB9XG4gICAgbGV0IGVycm9yVGV4dCA9IGBcbiAgICAgIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCB5b3UgYXJlIG5vdCB1c2luZyB0aGlzIGluc2lkZSBvZiBhIHBsdWdpbi5cbiAgICAgIFRvIGRpc2FibGUgdGhpcyBhbGVydCBhbmQgZXJyb3IsIHBsZWFzZSBwYXNzIGluIGFuIG9iamVjdCB3aXRoXG4gICAgICBcXGBJV2lsbE5vdFVzZVRoaXNJblBsdWdpbnNcXGAgdG8gdGhlIFxcYHRlY2hcXGAgbWV0aG9kLiBTZWVcbiAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy8yNjE3IGZvciBtb3JlIGluZm8uXG4gICAgYDtcbiAgICB3aW5kb3cuYWxlcnQoZXJyb3JUZXh0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JUZXh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdXAgY2xpY2sgYW5kIHRvdWNoIGxpc3RlbmVycyBmb3IgdGhlIHBsYXliYWNrIGVsZW1lbnRcbiAgICpcbiAgICogT24gZGVza3RvcHMsIGEgY2xpY2sgb24gdGhlIHZpZGVvIGl0c2VsZiB3aWxsIHRvZ2dsZSBwbGF5YmFjayxcbiAgICogb24gYSBtb2JpbGUgZGV2aWNlIGEgY2xpY2sgb24gdGhlIHZpZGVvIHRvZ2dsZXMgY29udHJvbHMuXG4gICAqICh0b2dnbGluZyBjb250cm9scyBpcyBkb25lIGJ5IHRvZ2dsaW5nIHRoZSB1c2VyIHN0YXRlIGJldHdlZW4gYWN0aXZlIGFuZFxuICAgKiBpbmFjdGl2ZSlcbiAgICogQSB0YXAgY2FuIHNpZ25hbCB0aGF0IGEgdXNlciBoYXMgYmVjb21lIGFjdGl2ZSwgb3IgaGFzIGJlY29tZSBpbmFjdGl2ZVxuICAgKiBlLmcuIGEgcXVpY2sgdGFwIG9uIGFuIGlQaG9uZSBtb3ZpZSBzaG91bGQgcmV2ZWFsIHRoZSBjb250cm9scy4gQW5vdGhlclxuICAgKiBxdWljayB0YXAgc2hvdWxkIGhpZGUgdGhlbSBhZ2FpbiAoc2lnbmFsaW5nIHRoZSB1c2VyIGlzIGluIGFuIGluYWN0aXZlXG4gICAqIHZpZXdpbmcgc3RhdGUpXG4gICAqIEluIGFkZGl0aW9uIHRvIHRoaXMsIHdlIHN0aWxsIHdhbnQgdGhlIHVzZXIgdG8gYmUgY29uc2lkZXJlZCBpbmFjdGl2ZSBhZnRlclxuICAgKiBhIGZldyBzZWNvbmRzIG9mIGluYWN0aXZpdHkuXG4gICAqIE5vdGU6IHRoZSBvbmx5IHBhcnQgb2YgaU9TIGludGVyYWN0aW9uIHdlIGNhbid0IG1pbWljIHdpdGggdGhpcyBzZXR1cFxuICAgKiBpcyBhIHRvdWNoIGFuZCBob2xkIG9uIHRoZSB2aWRlbyBlbGVtZW50IGNvdW50aW5nIGFzIGFjdGl2aXR5IGluIG9yZGVyIHRvXG4gICAqIGtlZXAgdGhlIGNvbnRyb2xzIHNob3dpbmcsIGJ1dCB0aGF0IHNob3VsZG4ndCBiZSBhbiBpc3N1ZS4gQSB0b3VjaCBhbmQgaG9sZFxuICAgKiBvbiBhbnkgY29udHJvbHMgd2lsbCBzdGlsbCBrZWVwIHRoZSB1c2VyIGFjdGl2ZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGFkZFRlY2hDb250cm9sc0xpc3RlbmVyc19cbiAgICovXG4gIGFkZFRlY2hDb250cm9sc0xpc3RlbmVyc18oKSB7XG4gICAgLy8gTWFrZSBzdXJlIHRvIHJlbW92ZSBhbGwgdGhlIHByZXZpb3VzIGxpc3RlbmVycyBpbiBjYXNlIHdlIGFyZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuXG4gICAgdGhpcy5yZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCk7XG5cbiAgICAvLyBTb21lIGJyb3dzZXJzIChDaHJvbWUgJiBJRSkgZG9uJ3QgdHJpZ2dlciBhIGNsaWNrIG9uIGEgZmxhc2ggc3dmLCBidXQgZG9cbiAgICAvLyB0cmlnZ2VyIG1vdXNlZG93bi91cC5cbiAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE0NDQ1NjIvamF2YXNjcmlwdC1vbmNsaWNrLWV2ZW50LW92ZXItZmxhc2gtb2JqZWN0XG4gICAgLy8gQW55IHRvdWNoIGV2ZW50cyBhcmUgc2V0IHRvIGJsb2NrIHRoZSBtb3VzZWRvd24gZXZlbnQgZnJvbSBoYXBwZW5pbmdcbiAgICB0aGlzLm9uKHRoaXMudGVjaF8sICdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRlY2hDbGlja18pO1xuXG4gICAgLy8gSWYgdGhlIGNvbnRyb2xzIHdlcmUgaGlkZGVuIHdlIGRvbid0IHdhbnQgdGhhdCB0byBjaGFuZ2Ugd2l0aG91dCBhIHRhcCBldmVudFxuICAgIC8vIHNvIHdlJ2xsIGNoZWNrIGlmIHRoZSBjb250cm9scyB3ZXJlIGFscmVhZHkgc2hvd2luZyBiZWZvcmUgcmVwb3J0aW5nIHVzZXJcbiAgICAvLyBhY3Rpdml0eVxuICAgIHRoaXMub24odGhpcy50ZWNoXywgJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaFN0YXJ0Xyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVUZWNoVG91Y2hNb3ZlXyk7XG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaEVuZF8pO1xuXG4gICAgLy8gVGhlIHRhcCBsaXN0ZW5lciBuZWVkcyB0byBjb21lIGFmdGVyIHRoZSB0b3VjaGVuZCBsaXN0ZW5lciBiZWNhdXNlIHRoZSB0YXBcbiAgICAvLyBsaXN0ZW5lciBjYW5jZWxzIG91dCBhbnkgcmVwb3J0ZWRVc2VyQWN0aXZpdHkgd2hlbiBzZXR0aW5nIHVzZXJBY3RpdmUoZmFsc2UpXG4gICAgdGhpcy5vbih0aGlzLnRlY2hfLCAndGFwJywgdGhpcy5oYW5kbGVUZWNoVGFwXyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgdXNlZCBmb3IgY2xpY2sgYW5kIHRhcCBjb250cm9scy4gVGhpcyBpcyBuZWVkZWQgZm9yXG4gICAqIHRvZ2dsaW5nIHRvIGNvbnRyb2xzIGRpc2FibGVkLCB3aGVyZSBhIHRhcC90b3VjaCBzaG91bGQgZG8gbm90aGluZy5cbiAgICpcbiAgICogQG1ldGhvZCByZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW1vdmVUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCkge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ganVzdCB1c2UgYHRoaXMub2ZmKClgIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgb3RoZXIgbmVlZGVkXG4gICAgLy8gbGlzdGVuZXJzIGFkZGVkIGJ5IHRlY2hzIHRoYXQgZXh0ZW5kIHRoaXMuXG4gICAgdGhpcy5vZmYodGhpcy50ZWNoXywgJ3RhcCcsIHRoaXMuaGFuZGxlVGVjaFRhcF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaHN0YXJ0JywgdGhpcy5oYW5kbGVUZWNoVG91Y2hTdGFydF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICd0b3VjaG1vdmUnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaE1vdmVfKTtcbiAgICB0aGlzLm9mZih0aGlzLnRlY2hfLCAndG91Y2hlbmQnLCB0aGlzLmhhbmRsZVRlY2hUb3VjaEVuZF8pO1xuICAgIHRoaXMub2ZmKHRoaXMudGVjaF8sICdtb3VzZWRvd24nLCB0aGlzLmhhbmRsZVRlY2hDbGlja18pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXllciB3YWl0cyBmb3IgdGhlIHRlY2ggdG8gYmUgcmVhZHlcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoUmVhZHlfXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBoYW5kbGVUZWNoUmVhZHlfKCkge1xuICAgIHRoaXMudXNpbmdOYXRpdmVDb250cm9scyh0aGlzLnRlY2hHZXRfKCdjb250cm9scycpKTtcblxuICAgIGlmICh0aGlzLmNvbnRyb2xzKCkgJiYgIXRoaXMudXNpbmdOYXRpdmVDb250cm9scygpKSB7XG4gICAgICB0aGlzLmFkZFRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXJSZWFkeSgpO1xuXG4gICAgLy8gS2VlcCB0aGUgc2FtZSB2b2x1bWUgYXMgYmVmb3JlXG4gICAgaWYgKHRoaXMuY2FjaGVfLnZvbHVtZSkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFZvbHVtZScsIHRoaXMuY2FjaGVfLnZvbHVtZSk7XG4gICAgfVxuXG4gICAgLy8gTG9vayBpZiB0aGUgdGVjaCBmb3VuZCBhIGhpZ2hlciByZXNvbHV0aW9uIHBvc3RlciB3aGlsZSBsb2FkaW5nXG4gICAgdGhpcy5oYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBkdXJhdGlvbiBpZiBhdmFpbGFibGVcbiAgICB0aGlzLmhhbmRsZVRlY2hEdXJhdGlvbkNoYW5nZV8oKTtcblxuICAgIC8vIENocm9tZSBhbmQgU2FmYXJpIGJvdGggaGF2ZSBpc3N1ZXMgd2l0aCBhdXRvcGxheS5cbiAgICAvLyBJbiBTYWZhcmkgKDUuMS4xKSwgd2hlbiB3ZSBtb3ZlIHRoZSB2aWRlbyBlbGVtZW50IGludG8gdGhlIGNvbnRhaW5lciBkaXYsIGF1dG9wbGF5IGRvZXNuJ3Qgd29yay5cbiAgICAvLyBJbiBDaHJvbWUgKDE1KSwgaWYgeW91IGhhdmUgYXV0b3BsYXkgKyBhIHBvc3RlciArIG5vIGNvbnRyb2xzLCB0aGUgdmlkZW8gZ2V0cyBoaWRkZW4gKGJ1dCBhdWRpbyBwbGF5cylcbiAgICAvLyBUaGlzIGZpeGVzIGJvdGggaXNzdWVzLiBOZWVkIHRvIHdhaXQgZm9yIEFQSSwgc28gaXQgdXBkYXRlcyBkaXNwbGF5cyBjb3JyZWN0bHlcbiAgICBpZiAodGhpcy5zcmMoKSAmJiB0aGlzLnRhZyAmJiB0aGlzLm9wdGlvbnNfLmF1dG9wbGF5ICYmIHRoaXMucGF1c2VkKCkpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnRhZy5wb3N0ZXI7IC8vIENocm9tZSBGaXguIEZpeGVkIGluIENocm9tZSB2MTYuXG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgdXNlciBhZ2VudCBiZWdpbnMgbG9va2luZyBmb3IgbWVkaWEgZGF0YVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hMb2FkU3RhcnRfXG4gICAqL1xuICBoYW5kbGVUZWNoTG9hZFN0YXJ0XygpIHtcbiAgICAvLyBUT0RPOiBVcGRhdGUgdG8gdXNlIGBlbXB0aWVkYCBldmVudCBpbnN0ZWFkLiBTZWUgIzEyNzcuXG5cbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtc2Vla2luZycpO1xuXG4gICAgLy8gcmVzZXQgdGhlIGVycm9yIHN0YXRlXG4gICAgdGhpcy5lcnJvcihudWxsKTtcblxuICAgIC8vIElmIGl0J3MgYWxyZWFkeSBwbGF5aW5nIHdlIHdhbnQgdG8gdHJpZ2dlciBhIGZpcnN0cGxheSBldmVudCBub3cuXG4gICAgLy8gVGhlIGZpcnN0cGxheSBldmVudCByZWxpZXMgb24gYm90aCB0aGUgcGxheSBhbmQgbG9hZHN0YXJ0IGV2ZW50c1xuICAgIC8vIHdoaWNoIGNhbiBoYXBwZW4gaW4gYW55IG9yZGVyIGZvciBhIG5ldyBzb3VyY2VcbiAgICBpZiAoIXRoaXMucGF1c2VkKCkpIHtcbiAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0Jyk7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyByZXNldCB0aGUgaGFzU3RhcnRlZCBzdGF0ZVxuICAgICAgdGhpcy5oYXNTdGFydGVkKGZhbHNlKTtcbiAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0Jyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZC9yZW1vdmUgdGhlIHZqcy1oYXMtc3RhcnRlZCBjbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGhhc1N0YXJ0ZWQgVGhlIHZhbHVlIG9mIHRydWUgYWRkcyB0aGUgY2xhc3MgdGhlIHZhbHVlIG9mIGZhbHNlIHJlbW92ZSB0aGUgY2xhc3NcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gQm9vbGVhbiB2YWx1ZSBpZiBoYXMgc3RhcnRlZFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhc1N0YXJ0ZWRcbiAgICovXG4gIGhhc1N0YXJ0ZWQoaGFzU3RhcnRlZCkge1xuICAgIGlmIChoYXNTdGFydGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIG9ubHkgdXBkYXRlIGlmIHRoaXMgaXMgYSBuZXcgdmFsdWVcbiAgICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWRfICE9PSBoYXNTdGFydGVkKSB7XG4gICAgICAgIHRoaXMuaGFzU3RhcnRlZF8gPSBoYXNTdGFydGVkO1xuICAgICAgICBpZiAoaGFzU3RhcnRlZCkge1xuICAgICAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1oYXMtc3RhcnRlZCcpO1xuICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIGZpcnN0cGxheSBldmVudCBpZiB0aGlzIG5ld2x5IGhhcyBwbGF5ZWRcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1oYXMtc3RhcnRlZCcpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy5oYXNTdGFydGVkXztcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgbWVkaWEgYmVnaW5zIG9yIHJlc3VtZXMgcGxheWJhY2tcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoUGxheV9cbiAgICovXG4gIGhhbmRsZVRlY2hQbGF5XygpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtZW5kZWQnKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtcGF1c2VkJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBsYXlpbmcnKTtcblxuICAgIC8vIGhpZGUgdGhlIHBvc3RlciB3aGVuIHRoZSB1c2VyIGhpdHMgcGxheVxuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tbWVkaWEtcGxheVxuICAgIHRoaXMuaGFzU3RhcnRlZCh0cnVlKTtcblxuICAgIHRoaXMudHJpZ2dlcigncGxheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBiZWdpbnMgd2FpdGluZ1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hXYWl0aW5nX1xuICAgKi9cbiAgaGFuZGxlVGVjaFdhaXRpbmdfKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgdGhpcy50cmlnZ2VyKCd3YWl0aW5nJyk7XG4gICAgdGhpcy5vbmUoJ3RpbWV1cGRhdGUnLCAoKSA9PiB0aGlzLnJlbW92ZUNsYXNzKCd2anMtd2FpdGluZycpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGhhbmRsZXIgZm9yIGV2ZW50cyB0aGF0IHNpZ25hbCB0aGF0IHdhaXRpbmcgaGFzIGVuZGVkXG4gICAqIHdoaWNoIGlzIG5vdCBjb25zaXN0ZW50IGJldHdlZW4gYnJvd3NlcnMuIFNlZSAjMTM1MVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hDYW5QbGF5X1xuICAgKi9cbiAgaGFuZGxlVGVjaENhblBsYXlfKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgdGhpcy50cmlnZ2VyKCdjYW5wbGF5Jyk7XG4gIH1cblxuICAvKipcbiAgICogQSBoYW5kbGVyIGZvciBldmVudHMgdGhhdCBzaWduYWwgdGhhdCB3YWl0aW5nIGhhcyBlbmRlZFxuICAgKiB3aGljaCBpcyBub3QgY29uc2lzdGVudCBiZXR3ZWVuIGJyb3dzZXJzLiBTZWUgIzEzNTFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoQ2FuUGxheVRocm91Z2hfXG4gICAqL1xuICBoYW5kbGVUZWNoQ2FuUGxheVRocm91Z2hfKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy13YWl0aW5nJyk7XG4gICAgdGhpcy50cmlnZ2VyKCdjYW5wbGF5dGhyb3VnaCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgaGFuZGxlciBmb3IgZXZlbnRzIHRoYXQgc2lnbmFsIHRoYXQgd2FpdGluZyBoYXMgZW5kZWRcbiAgICogd2hpY2ggaXMgbm90IGNvbnNpc3RlbnQgYmV0d2VlbiBicm93c2Vycy4gU2VlICMxMzUxXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFBsYXlpbmdfXG4gICAqL1xuICBoYW5kbGVUZWNoUGxheWluZ18oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXdhaXRpbmcnKTtcbiAgICB0aGlzLnRyaWdnZXIoJ3BsYXlpbmcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuZXZlciB0aGUgcGxheWVyIGlzIGp1bXBpbmcgdG8gYSBuZXcgdGltZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hTZWVraW5nX1xuICAgKi9cbiAgaGFuZGxlVGVjaFNlZWtpbmdfKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zZWVraW5nJyk7XG4gICAgdGhpcy50cmlnZ2VyKCdzZWVraW5nJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgcGxheWVyIGhhcyBmaW5pc2hlZCBqdW1waW5nIHRvIGEgbmV3IHRpbWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoU2Vla2VkX1xuICAgKi9cbiAgaGFuZGxlVGVjaFNlZWtlZF8oKSB7XG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNlZWtpbmcnKTtcbiAgICB0aGlzLnRyaWdnZXIoJ3NlZWtlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHRoZSBmaXJzdCB0aW1lIGEgdmlkZW8gaXMgcGxheWVkXG4gICAqIE5vdCBwYXJ0IG9mIHRoZSBITFMgc3BlYywgYW5kIHdlJ3JlIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3RcbiAgICogaW1wbGVtZW50YXRpb24geWV0LCBzbyB1c2Ugc3BhcmluZ2x5LiBJZiB5b3UgZG9uJ3QgaGF2ZSBhIHJlYXNvbiB0b1xuICAgKiBwcmV2ZW50IHBsYXliYWNrLCB1c2UgYG15UGxheWVyLm9uZSgncGxheScpO2AgaW5zdGVhZC5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoRmlyc3RQbGF5X1xuICAgKi9cbiAgaGFuZGxlVGVjaEZpcnN0UGxheV8oKSB7XG4gICAgLy9JZiB0aGUgZmlyc3Qgc3RhcnR0aW1lIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWRcbiAgICAvL3RoZW4gd2Ugd2lsbCBzdGFydCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IGluIHNlY29uZHNcbiAgICBpZih0aGlzLm9wdGlvbnNfLnN0YXJ0dGltZSl7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lKHRoaXMub3B0aW9uc18uc3RhcnR0aW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmFkZENsYXNzKCd2anMtaGFzLXN0YXJ0ZWQnKTtcbiAgICB0aGlzLnRyaWdnZXIoJ2ZpcnN0cGxheScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW5ldmVyIHRoZSBtZWRpYSBoYXMgYmVlbiBwYXVzZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoUGF1c2VfXG4gICAqL1xuICBoYW5kbGVUZWNoUGF1c2VfKCkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1wbGF5aW5nJyk7XG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXBhdXNlZCcpO1xuICAgIHRoaXMudHJpZ2dlcigncGF1c2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGlsZSB0aGUgdXNlciBhZ2VudCBpcyBkb3dubG9hZGluZyBtZWRpYSBkYXRhXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFByb2dyZXNzX1xuICAgKi9cbiAgaGFuZGxlVGVjaFByb2dyZXNzXygpIHtcbiAgICB0aGlzLnRyaWdnZXIoJ3Byb2dyZXNzJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBtZWRpYSByZXNvdXJjZSBpcyByZWFjaGVkIChjdXJyZW50VGltZSA9PSBkdXJhdGlvbilcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoRW5kZWRfXG4gICAqL1xuICBoYW5kbGVUZWNoRW5kZWRfKCkge1xuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1lbmRlZCcpO1xuICAgIGlmICh0aGlzLm9wdGlvbnNfLmxvb3ApIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUoMCk7XG4gICAgICB0aGlzLnBsYXkoKTtcbiAgICB9IGVsc2UgaWYgKCF0aGlzLnBhdXNlZCgpKSB7XG4gICAgICB0aGlzLnBhdXNlKCk7XG4gICAgfVxuXG4gICAgdGhpcy50cmlnZ2VyKCdlbmRlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIGR1cmF0aW9uIG9mIHRoZSBtZWRpYSByZXNvdXJjZSBpcyBmaXJzdCBrbm93biBvciBjaGFuZ2VkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlX1xuICAgKi9cbiAgaGFuZGxlVGVjaER1cmF0aW9uQ2hhbmdlXygpIHtcbiAgICB0aGlzLmR1cmF0aW9uKHRoaXMudGVjaEdldF8oJ2R1cmF0aW9uJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBhIGNsaWNrIG9uIHRoZSBtZWRpYSBlbGVtZW50IHRvIHBsYXkvcGF1c2VcbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBldmVudCBFdmVudCBvYmplY3RcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoQ2xpY2tfXG4gICAqL1xuICBoYW5kbGVUZWNoQ2xpY2tfKGV2ZW50KSB7XG4gICAgLy8gV2UncmUgdXNpbmcgbW91c2Vkb3duIHRvIGRldGVjdCBjbGlja3MgdGhhbmtzIHRvIEZsYXNoLCBidXQgbW91c2Vkb3duXG4gICAgLy8gd2lsbCBhbHNvIGJlIHRyaWdnZXJlZCB3aXRoIHJpZ2h0LWNsaWNrcywgc28gd2UgbmVlZCB0byBwcmV2ZW50IHRoYXRcbiAgICBpZiAoZXZlbnQuYnV0dG9uICE9PSAwKSByZXR1cm47XG5cbiAgICAvLyBXaGVuIGNvbnRyb2xzIGFyZSBkaXNhYmxlZCBhIGNsaWNrIHNob3VsZCBub3QgdG9nZ2xlIHBsYXliYWNrIGJlY2F1c2VcbiAgICAvLyB0aGUgY2xpY2sgaXMgY29uc2lkZXJlZCBhIGNvbnRyb2xcbiAgICBpZiAodGhpcy5jb250cm9scygpKSB7XG4gICAgICBpZiAodGhpcy5wYXVzZWQoKSkge1xuICAgICAgICB0aGlzLnBsYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucGF1c2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGEgdGFwIG9uIHRoZSBtZWRpYSBlbGVtZW50LiBJdCB3aWxsIHRvZ2dsZSB0aGUgdXNlclxuICAgKiBhY3Rpdml0eSBzdGF0ZSwgd2hpY2ggaGlkZXMgYW5kIHNob3dzIHRoZSBjb250cm9scy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoVGFwX1xuICAgKi9cbiAgaGFuZGxlVGVjaFRhcF8oKSB7XG4gICAgdGhpcy51c2VyQWN0aXZlKCF0aGlzLnVzZXJBY3RpdmUoKSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoIHRvIHN0YXJ0XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFRvdWNoU3RhcnRfXG4gICAqL1xuICBoYW5kbGVUZWNoVG91Y2hTdGFydF8oKSB7XG4gICAgdGhpcy51c2VyV2FzQWN0aXZlID0gdGhpcy51c2VyQWN0aXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoIHRvIG1vdmVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoVG91Y2hNb3ZlX1xuICAgKi9cbiAgaGFuZGxlVGVjaFRvdWNoTW92ZV8oKSB7XG4gICAgaWYgKHRoaXMudXNlcldhc0FjdGl2ZSl7XG4gICAgICB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggdG8gZW5kXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFRvdWNoRW5kX1xuICAgKi9cbiAgaGFuZGxlVGVjaFRvdWNoRW5kXyhldmVudCkge1xuICAgIC8vIFN0b3AgdGhlIG1vdXNlIGV2ZW50cyBmcm9tIGFsc28gaGFwcGVuaW5nXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBwbGF5ZXIgc3dpdGNoZXMgaW4gb3Igb3V0IG9mIGZ1bGxzY3JlZW4gbW9kZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZUZ1bGxzY3JlZW5DaGFuZ2VfXG4gICAqL1xuICBoYW5kbGVGdWxsc2NyZWVuQ2hhbmdlXygpIHtcbiAgICBpZiAodGhpcy5pc0Z1bGxzY3JlZW4oKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWZ1bGxzY3JlZW4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWZ1bGxzY3JlZW4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogbmF0aXZlIGNsaWNrIGV2ZW50cyBvbiB0aGUgU1dGIGFyZW4ndCB0cmlnZ2VyZWQgb24gSUUxMSwgV2luOC4xUlRcbiAgICogdXNlIHN0YWdlY2xpY2sgZXZlbnRzIHRyaWdnZXJlZCBmcm9tIGluc2lkZSB0aGUgU1dGIGluc3RlYWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVTdGFnZUNsaWNrX1xuICAgKi9cbiAgaGFuZGxlU3RhZ2VDbGlja18oKSB7XG4gICAgdGhpcy5yZXBvcnRVc2VyQWN0aXZpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgVGVjaCBGdWxsc2NyZWVuIENoYW5nZVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hGdWxsc2NyZWVuQ2hhbmdlX1xuICAgKi9cbiAgaGFuZGxlVGVjaEZ1bGxzY3JlZW5DaGFuZ2VfKGV2ZW50LCBkYXRhKSB7XG4gICAgaWYgKGRhdGEpIHtcbiAgICAgIHRoaXMuaXNGdWxsc2NyZWVuKGRhdGEuaXNGdWxsc2NyZWVuKTtcbiAgICB9XG4gICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGxvYWRpbmcgb2YgYW4gYXVkaW8vdmlkZW9cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoRXJyb3JfXG4gICAqL1xuICBoYW5kbGVUZWNoRXJyb3JfKCkge1xuICAgIGxldCBlcnJvciA9IHRoaXMudGVjaF8uZXJyb3IoKTtcbiAgICB0aGlzLmVycm9yKGVycm9yICYmIGVycm9yLmNvZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGJyb3dzZXIgaXMgaW50ZW50aW9uYWxseSBub3QgZ2V0dGluZyBtZWRpYSBkYXRhXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFN1c3BlbmRfXG4gICAqL1xuICBoYW5kbGVUZWNoU3VzcGVuZF8oKSB7XG4gICAgdGhpcy50cmlnZ2VyKCdzdXNwZW5kJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgbG9hZGluZyBvZiBhbiBhdWRpby92aWRlbyBpcyBhYm9ydGVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaEFib3J0X1xuICAgKi9cbiAgaGFuZGxlVGVjaEFib3J0XygpIHtcbiAgICB0aGlzLnRyaWdnZXIoJ2Fib3J0Jyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgY3VycmVudCBwbGF5bGlzdCBpcyBlbXB0eVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hFbXB0aWVkX1xuICAgKi9cbiAgaGFuZGxlVGVjaEVtcHRpZWRfKCkge1xuICAgIHRoaXMudHJpZ2dlcignZW1wdGllZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGJyb3dzZXIgaXMgdHJ5aW5nIHRvIGdldCBtZWRpYSBkYXRhLCBidXQgZGF0YSBpcyBub3QgYXZhaWxhYmxlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFN0YWxsZWRfXG4gICAqL1xuICBoYW5kbGVUZWNoU3RhbGxlZF8oKSB7XG4gICAgdGhpcy50cmlnZ2VyKCdzdGFsbGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYnJvd3NlciBoYXMgbG9hZGVkIG1ldGEgZGF0YSBmb3IgdGhlIGF1ZGlvL3ZpZGVvXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaExvYWRlZE1ldGFEYXRhX1xuICAgKi9cbiAgaGFuZGxlVGVjaExvYWRlZE1ldGFEYXRhXygpIHtcbiAgICB0aGlzLnRyaWdnZXIoJ2xvYWRlZG1ldGFkYXRhJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgYnJvd3NlciBoYXMgbG9hZGVkIHRoZSBjdXJyZW50IGZyYW1lIG9mIHRoZSBhdWRpby92aWRlb1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hMb2FkZWREYXRhX1xuICAgKi9cbiAgaGFuZGxlVGVjaExvYWRlZERhdGFfKCkge1xuICAgIHRoaXMudHJpZ2dlcignbG9hZGVkZGF0YScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpcmVzIHdoZW4gdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaGFzIGNoYW5nZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoVGltZVVwZGF0ZV9cbiAgICovXG4gIGhhbmRsZVRlY2hUaW1lVXBkYXRlXygpIHtcbiAgICB0aGlzLnRyaWdnZXIoJ3RpbWV1cGRhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSBwbGF5aW5nIHNwZWVkIG9mIHRoZSBhdWRpby92aWRlbyBpcyBjaGFuZ2VkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaGFuZGxlVGVjaFJhdGVDaGFuZ2VfXG4gICAqL1xuICBoYW5kbGVUZWNoUmF0ZUNoYW5nZV8oKSB7XG4gICAgdGhpcy50cmlnZ2VyKCdyYXRlY2hhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogRmlyZXMgd2hlbiB0aGUgdm9sdW1lIGhhcyBiZWVuIGNoYW5nZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoVm9sdW1lQ2hhbmdlX1xuICAgKi9cbiAgaGFuZGxlVGVjaFZvbHVtZUNoYW5nZV8oKSB7XG4gICAgdGhpcy50cmlnZ2VyKCd2b2x1bWVjaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXJlcyB3aGVuIHRoZSB0ZXh0IHRyYWNrIGhhcyBiZWVuIGNoYW5nZWRcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBoYW5kbGVUZWNoVGV4dFRyYWNrQ2hhbmdlX1xuICAgKi9cbiAgaGFuZGxlVGVjaFRleHRUcmFja0NoYW5nZV8oKSB7XG4gICAgdGhpcy50cmlnZ2VyKCd0ZXh0dHJhY2tjaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb2JqZWN0IGZvciBjYWNoZWQgdmFsdWVzLlxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqIEBtZXRob2QgZ2V0Q2FjaGVcbiAgICovXG4gIGdldENhY2hlKCkge1xuICAgIHJldHVybiB0aGlzLmNhY2hlXztcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXNzIHZhbHVlcyB0byB0aGUgcGxheWJhY2sgdGVjaFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZz19IG1ldGhvZCBNZXRob2RcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBhcmcgQXJndW1lbnRcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCB0ZWNoQ2FsbF9cbiAgICovXG4gIHRlY2hDYWxsXyhtZXRob2QsIGFyZykge1xuICAgIC8vIElmIGl0J3Mgbm90IHJlYWR5IHlldCwgY2FsbCBtZXRob2Qgd2hlbiBpdCBpc1xuICAgIGlmICh0aGlzLnRlY2hfICYmICF0aGlzLnRlY2hfLmlzUmVhZHlfKSB7XG4gICAgICB0aGlzLnRlY2hfLnJlYWR5KGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXNbbWV0aG9kXShhcmcpO1xuICAgICAgfSwgdHJ1ZSk7XG5cbiAgICAvLyBPdGhlcndpc2UgY2FsbCBtZXRob2Qgbm93XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0aGlzLnRlY2hfKSB7XG4gICAgICAgICAgdGhpcy50ZWNoX1ttZXRob2RdKGFyZyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICBsb2coZSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjYWxscyBjYW4ndCB3YWl0IGZvciB0aGUgdGVjaCwgYW5kIHNvbWV0aW1lcyBkb24ndCBuZWVkIHRvLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIFRlY2ggbWV0aG9kXG4gICAqIEByZXR1cm4ge01ldGhvZH1cbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCB0ZWNoR2V0X1xuICAgKi9cbiAgdGVjaEdldF8obWV0aG9kKSB7XG4gICAgaWYgKHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy5pc1JlYWR5Xykge1xuXG4gICAgICAvLyBGbGFzaCBsaWtlcyB0byBkaWUgYW5kIHJlbG9hZCB3aGVuIHlvdSBoaWRlIG9yIHJlcG9zaXRpb24gaXQuXG4gICAgICAvLyBJbiB0aGVzZSBjYXNlcyB0aGUgb2JqZWN0IG1ldGhvZHMgZ28gYXdheSBhbmQgd2UgZ2V0IGVycm9ycy5cbiAgICAgIC8vIFdoZW4gdGhhdCBoYXBwZW5zIHdlJ2xsIGNhdGNoIHRoZSBlcnJvcnMgYW5kIGluZm9ybSB0ZWNoIHRoYXQgaXQncyBub3QgcmVhZHkgYW55IG1vcmUuXG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gdGhpcy50ZWNoX1ttZXRob2RdKCk7XG4gICAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgLy8gV2hlbiBidWlsZGluZyBhZGRpdGlvbmFsIHRlY2ggbGlicywgYW4gZXhwZWN0ZWQgbWV0aG9kIG1heSBub3QgYmUgZGVmaW5lZCB5ZXRcbiAgICAgICAgaWYgKHRoaXMudGVjaF9bbWV0aG9kXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbG9nKGBWaWRlby5qczogJHttZXRob2R9IG1ldGhvZCBub3QgZGVmaW5lZCBmb3IgJHt0aGlzLnRlY2hOYW1lX30gcGxheWJhY2sgdGVjaG5vbG9neS5gLCBlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXaGVuIGEgbWV0aG9kIGlzbid0IGF2YWlsYWJsZSBvbiB0aGUgb2JqZWN0IGl0IHRocm93cyBhIFR5cGVFcnJvclxuICAgICAgICAgIGlmIChlLm5hbWUgPT09ICdUeXBlRXJyb3InKSB7XG4gICAgICAgICAgICBsb2coYFZpZGVvLmpzOiAke21ldGhvZH0gdW5hdmFpbGFibGUgb24gJHt0aGlzLnRlY2hOYW1lX30gcGxheWJhY2sgdGVjaG5vbG9neSBlbGVtZW50LmAsIGUpO1xuICAgICAgICAgICAgdGhpcy50ZWNoXy5pc1JlYWR5XyA9IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2coZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIHN0YXJ0IG1lZGlhIHBsYXliYWNrXG4gICAqIGBgYGpzXG4gICAqICAgICBteVBsYXllci5wbGF5KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9IHNlbGZcbiAgICogQG1ldGhvZCBwbGF5XG4gICAqL1xuICBwbGF5KCkge1xuICAgIHRoaXMudGVjaENhbGxfKCdwbGF5Jyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgdGhlIHZpZGVvIHBsYXliYWNrXG4gICAqIGBgYGpzXG4gICAqICAgICBteVBsYXllci5wYXVzZSgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHJldHVybiB7UGxheWVyfSBzZWxmXG4gICAqIEBtZXRob2QgcGF1c2VcbiAgICovXG4gIHBhdXNlKCkge1xuICAgIHRoaXMudGVjaENhbGxfKCdwYXVzZScpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoZSBwbGF5ZXIgaXMgcGF1c2VkXG4gICAqIGBgYGpzXG4gICAqICAgICB2YXIgaXNQYXVzZWQgPSBteVBsYXllci5wYXVzZWQoKTtcbiAgICogICAgIHZhciBpc1BsYXlpbmcgPSAhbXlQbGF5ZXIucGF1c2VkKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufSBmYWxzZSBpZiB0aGUgbWVkaWEgaXMgY3VycmVudGx5IHBsYXlpbmcsIG9yIHRydWUgb3RoZXJ3aXNlXG4gICAqIEBtZXRob2QgcGF1c2VkXG4gICAqL1xuICBwYXVzZWQoKSB7XG4gICAgLy8gVGhlIGluaXRpYWwgc3RhdGUgb2YgcGF1c2VkIHNob3VsZCBiZSB0cnVlIChpbiBTYWZhcmkgaXQncyBhY3R1YWxseSBmYWxzZSlcbiAgICByZXR1cm4gKHRoaXMudGVjaEdldF8oJ3BhdXNlZCcpID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdXNlciBpcyBcInNjcnViYmluZ1wiLiBTY3J1YmJpbmcgaXMgd2hlbiB0aGUgdXNlclxuICAgKiBoYXMgY2xpY2tlZCB0aGUgcHJvZ3Jlc3MgYmFyIGhhbmRsZSBhbmQgaXMgZHJhZ2dpbmcgaXQgYWxvbmcgdGhlIHByb2dyZXNzIGJhci5cbiAgICpcbiAgICogQHBhcmFtICB7Qm9vbGVhbn0gaXNTY3J1YmJpbmcgICBUcnVlL2ZhbHNlIHRoZSB1c2VyIGlzIHNjcnViYmluZ1xuICAgKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgICAgICAgIFRoZSBzY3J1YmJpbmcgc3RhdHVzIHdoZW4gZ2V0dGluZ1xuICAgKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgIFRoZSBwbGF5ZXIgd2hlbiBzZXR0aW5nXG4gICAqIEBtZXRob2Qgc2NydWJiaW5nXG4gICAqL1xuICBzY3J1YmJpbmcoaXNTY3J1YmJpbmcpIHtcbiAgICBpZiAoaXNTY3J1YmJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zY3J1YmJpbmdfID0gISFpc1NjcnViYmluZztcblxuICAgICAgaWYgKGlzU2NydWJiaW5nKSB7XG4gICAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1zY3J1YmJpbmcnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2NydWJiaW5nXztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHRpbWUgKGluIHNlY29uZHMpXG4gICAqIGBgYGpzXG4gICAqICAgICAvLyBnZXRcbiAgICogICAgIHZhciB3aGVyZVlvdUF0ID0gbXlQbGF5ZXIuY3VycmVudFRpbWUoKTtcbiAgICogICAgIC8vIHNldFxuICAgKiAgICAgbXlQbGF5ZXIuY3VycmVudFRpbWUoMTIwKTsgLy8gMiBtaW51dGVzIGludG8gdGhlIHZpZGVvXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ8U3RyaW5nPX0gc2Vjb25kcyBUaGUgdGltZSB0byBzZWVrIHRvXG4gICAqIEByZXR1cm4ge051bWJlcn0gICAgICAgIFRoZSB0aW1lIGluIHNlY29uZHMsIHdoZW4gbm90IHNldHRpbmdcbiAgICogQHJldHVybiB7UGxheWVyfSAgICBzZWxmLCB3aGVuIHRoZSBjdXJyZW50IHRpbWUgaXMgc2V0XG4gICAqIEBtZXRob2QgY3VycmVudFRpbWVcbiAgICovXG4gIGN1cnJlbnRUaW1lKHNlY29uZHMpIHtcbiAgICBpZiAoc2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgIHRoaXMudGVjaENhbGxfKCdzZXRDdXJyZW50VGltZScsIHNlY29uZHMpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBjYWNoZSBsYXN0IGN1cnJlbnRUaW1lIGFuZCByZXR1cm4uIGRlZmF1bHQgdG8gMCBzZWNvbmRzXG4gICAgLy9cbiAgICAvLyBDYWNoaW5nIHRoZSBjdXJyZW50VGltZSBpcyBtZWFudCB0byBwcmV2ZW50IGEgbWFzc2l2ZSBhbW91bnQgb2YgcmVhZHMgb24gdGhlIHRlY2gnc1xuICAgIC8vIGN1cnJlbnRUaW1lIHdoZW4gc2NydWJiaW5nLCBidXQgbWF5IG5vdCBwcm92aWRlIG11Y2ggcGVyZm9ybWFuY2UgYmVuZWZpdCBhZnRlcmFsbC5cbiAgICAvLyBTaG91bGQgYmUgdGVzdGVkLiBBbHNvIHNvbWV0aGluZyBoYXMgdG8gcmVhZCB0aGUgYWN0dWFsIGN1cnJlbnQgdGltZSBvciB0aGUgY2FjaGUgd2lsbFxuICAgIC8vIG5ldmVyIGdldCB1cGRhdGVkLlxuICAgIHJldHVybiB0aGlzLmNhY2hlXy5jdXJyZW50VGltZSA9ICh0aGlzLnRlY2hHZXRfKCdjdXJyZW50VGltZScpIHx8IDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgbGVuZ3RoIGluIHRpbWUgb2YgdGhlIHZpZGVvIGluIHNlY29uZHNcbiAgICogYGBganNcbiAgICogICAgIHZhciBsZW5ndGhPZlZpZGVvID0gbXlQbGF5ZXIuZHVyYXRpb24oKTtcbiAgICogYGBgXG4gICAqICoqTk9URSoqOiBUaGUgdmlkZW8gbXVzdCBoYXZlIHN0YXJ0ZWQgbG9hZGluZyBiZWZvcmUgdGhlIGR1cmF0aW9uIGNhbiBiZVxuICAgKiBrbm93biwgYW5kIGluIHRoZSBjYXNlIG9mIEZsYXNoLCBtYXkgbm90IGJlIGtub3duIHVudGlsIHRoZSB2aWRlbyBzdGFydHNcbiAgICogcGxheWluZy5cbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHNlY29uZHMgRHVyYXRpb24gd2hlbiBzZXR0aW5nXG4gICAqIEByZXR1cm4ge051bWJlcn0gVGhlIGR1cmF0aW9uIG9mIHRoZSB2aWRlbyBpbiBzZWNvbmRzIHdoZW4gZ2V0dGluZ1xuICAgKiBAbWV0aG9kIGR1cmF0aW9uXG4gICAqL1xuICBkdXJhdGlvbihzZWNvbmRzKSB7XG4gICAgaWYgKHNlY29uZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVfLmR1cmF0aW9uIHx8IDA7XG4gICAgfVxuXG4gICAgc2Vjb25kcyA9IHBhcnNlRmxvYXQoc2Vjb25kcykgfHwgMDtcblxuICAgIC8vIFN0YW5kYXJkaXplIG9uIEluaWZpdHkgZm9yIHNpZ25hbGluZyB2aWRlbyBpcyBsaXZlXG4gICAgaWYgKHNlY29uZHMgPCAwKSB7XG4gICAgICBzZWNvbmRzID0gSW5maW5pdHk7XG4gICAgfVxuXG4gICAgaWYgKHNlY29uZHMgIT09IHRoaXMuY2FjaGVfLmR1cmF0aW9uKSB7XG4gICAgICAvLyBDYWNoZSB0aGUgbGFzdCBzZXQgdmFsdWUgZm9yIG9wdGltaXplZCBzY3J1YmJpbmcgKGVzcC4gRmxhc2gpXG4gICAgICB0aGlzLmNhY2hlXy5kdXJhdGlvbiA9IHNlY29uZHM7XG5cbiAgICAgIGlmIChzZWNvbmRzID09PSBJbmZpbml0eSkge1xuICAgICAgICB0aGlzLmFkZENsYXNzKCd2anMtbGl2ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWxpdmUnKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy50cmlnZ2VyKCdkdXJhdGlvbmNoYW5nZScpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZXMgaG93IG11Y2ggdGltZSBpcyBsZWZ0LlxuICAgKiBgYGBqc1xuICAgKiAgICAgdmFyIHRpbWVMZWZ0ID0gbXlQbGF5ZXIucmVtYWluaW5nVGltZSgpO1xuICAgKiBgYGBcbiAgICogTm90IGEgbmF0aXZlIHZpZGVvIGVsZW1lbnQgZnVuY3Rpb24sIGJ1dCB1c2VmdWxcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgdGltZSByZW1haW5pbmcgaW4gc2Vjb25kc1xuICAgKiBAbWV0aG9kIHJlbWFpbmluZ1RpbWVcbiAgICovXG4gIHJlbWFpbmluZ1RpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZHVyYXRpb24oKSAtIHRoaXMuY3VycmVudFRpbWUoKTtcbiAgfVxuXG4gIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvdmlkZW8uaHRtbCNkb20tbWVkaWEtYnVmZmVyZWRcbiAgLy8gQnVmZmVyZWQgcmV0dXJucyBhIHRpbWVyYW5nZSBvYmplY3QuXG4gIC8vIEtpbmQgb2YgbGlrZSBhbiBhcnJheSBvZiBwb3J0aW9ucyBvZiB0aGUgdmlkZW8gdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZC5cblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlIG9iamVjdCB3aXRoIHRoZSB0aW1lcyBvZiB0aGUgdmlkZW8gdGhhdCBoYXZlIGJlZW4gZG93bmxvYWRlZFxuICAgKiBJZiB5b3UganVzdCB3YW50IHRoZSBwZXJjZW50IG9mIHRoZSB2aWRlbyB0aGF0J3MgYmVlbiBkb3dubG9hZGVkLFxuICAgKiB1c2UgYnVmZmVyZWRQZXJjZW50LlxuICAgKiBgYGBqc1xuICAgKiAgICAgLy8gTnVtYmVyIG9mIGRpZmZlcmVudCByYW5nZXMgb2YgdGltZSBoYXZlIGJlZW4gYnVmZmVyZWQuIFVzdWFsbHkgMS5cbiAgICogICAgIG51bWJlck9mUmFuZ2VzID0gYnVmZmVyZWRUaW1lUmFuZ2UubGVuZ3RoLFxuICAgKiAgICAgLy8gVGltZSBpbiBzZWNvbmRzIHdoZW4gdGhlIGZpcnN0IHJhbmdlIHN0YXJ0cy4gVXN1YWxseSAwLlxuICAgKiAgICAgZmlyc3RSYW5nZVN0YXJ0ID0gYnVmZmVyZWRUaW1lUmFuZ2Uuc3RhcnQoMCksXG4gICAqICAgICAvLyBUaW1lIGluIHNlY29uZHMgd2hlbiB0aGUgZmlyc3QgcmFuZ2UgZW5kc1xuICAgKiAgICAgZmlyc3RSYW5nZUVuZCA9IGJ1ZmZlcmVkVGltZVJhbmdlLmVuZCgwKSxcbiAgICogICAgIC8vIExlbmd0aCBpbiBzZWNvbmRzIG9mIHRoZSBmaXJzdCB0aW1lIHJhbmdlXG4gICAqICAgICBmaXJzdFJhbmdlTGVuZ3RoID0gZmlyc3RSYW5nZUVuZCAtIGZpcnN0UmFuZ2VTdGFydDtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gQSBtb2NrIFRpbWVSYW5nZSBvYmplY3QgKGZvbGxvd2luZyBIVE1MIHNwZWMpXG4gICAqIEBtZXRob2QgYnVmZmVyZWRcbiAgICovXG4gIGJ1ZmZlcmVkKCkge1xuICAgIHZhciBidWZmZXJlZCA9IHRoaXMudGVjaEdldF8oJ2J1ZmZlcmVkJyk7XG5cbiAgICBpZiAoIWJ1ZmZlcmVkIHx8ICFidWZmZXJlZC5sZW5ndGgpIHtcbiAgICAgIGJ1ZmZlcmVkID0gY3JlYXRlVGltZVJhbmdlKDAsMCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZmZlcmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGVyY2VudCAoYXMgYSBkZWNpbWFsKSBvZiB0aGUgdmlkZW8gdGhhdCdzIGJlZW4gZG93bmxvYWRlZFxuICAgKiBgYGBqc1xuICAgKiAgICAgdmFyIGhvd011Y2hJc0Rvd25sb2FkZWQgPSBteVBsYXllci5idWZmZXJlZFBlcmNlbnQoKTtcbiAgICogYGBgXG4gICAqIDAgbWVhbnMgbm9uZSwgMSBtZWFucyBhbGwuXG4gICAqIChUaGlzIG1ldGhvZCBpc24ndCBpbiB0aGUgSFRNTDUgc3BlYywgYnV0IGl0J3MgdmVyeSBjb252ZW5pZW50KVxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEEgZGVjaW1hbCBiZXR3ZWVuIDAgYW5kIDEgcmVwcmVzZW50aW5nIHRoZSBwZXJjZW50XG4gICAqIEBtZXRob2QgYnVmZmVyZWRQZXJjZW50XG4gICAqL1xuICBidWZmZXJlZFBlcmNlbnQoKSB7XG4gICAgcmV0dXJuIGJ1ZmZlcmVkUGVyY2VudCh0aGlzLmJ1ZmZlcmVkKCksIHRoaXMuZHVyYXRpb24oKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbmRpbmcgdGltZSBvZiB0aGUgbGFzdCBidWZmZXJlZCB0aW1lIHJhbmdlXG4gICAqIFRoaXMgaXMgdXNlZCBpbiB0aGUgcHJvZ3Jlc3MgYmFyIHRvIGVuY2Fwc3VsYXRlIGFsbCB0aW1lIHJhbmdlcy5cbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBUaGUgZW5kIG9mIHRoZSBsYXN0IGJ1ZmZlcmVkIHRpbWUgcmFuZ2VcbiAgICogQG1ldGhvZCBidWZmZXJlZEVuZFxuICAgKi9cbiAgYnVmZmVyZWRFbmQoKSB7XG4gICAgdmFyIGJ1ZmZlcmVkID0gdGhpcy5idWZmZXJlZCgpLFxuICAgICAgICBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb24oKSxcbiAgICAgICAgZW5kID0gYnVmZmVyZWQuZW5kKGJ1ZmZlcmVkLmxlbmd0aC0xKTtcblxuICAgIGlmIChlbmQgPiBkdXJhdGlvbikge1xuICAgICAgZW5kID0gZHVyYXRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGVuZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBjdXJyZW50IHZvbHVtZSBvZiB0aGUgbWVkaWFcbiAgICogYGBganNcbiAgICogICAgIC8vIGdldFxuICAgKiAgICAgdmFyIGhvd0xvdWRJc0l0ID0gbXlQbGF5ZXIudm9sdW1lKCk7XG4gICAqICAgICAvLyBzZXRcbiAgICogICAgIG15UGxheWVyLnZvbHVtZSgwLjUpOyAvLyBTZXQgdm9sdW1lIHRvIGhhbGZcbiAgICogYGBgXG4gICAqIDAgaXMgb2ZmIChtdXRlZCksIDEuMCBpcyBhbGwgdGhlIHdheSB1cCwgMC41IGlzIGhhbGYgd2F5LlxuICAgKlxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHBlcmNlbnRBc0RlY2ltYWwgVGhlIG5ldyB2b2x1bWUgYXMgYSBkZWNpbWFsIHBlcmNlbnRcbiAgICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgICAgICAgVGhlIGN1cnJlbnQgdm9sdW1lIHdoZW4gZ2V0dGluZ1xuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9ICAgICAgICAgICAgICBzZWxmIHdoZW4gc2V0dGluZ1xuICAgKiBAbWV0aG9kIHZvbHVtZVxuICAgKi9cbiAgdm9sdW1lKHBlcmNlbnRBc0RlY2ltYWwpIHtcbiAgICBsZXQgdm9sO1xuXG4gICAgaWYgKHBlcmNlbnRBc0RlY2ltYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdm9sID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgcGFyc2VGbG9hdChwZXJjZW50QXNEZWNpbWFsKSkpOyAvLyBGb3JjZSB2YWx1ZSB0byBiZXR3ZWVuIDAgYW5kIDFcbiAgICAgIHRoaXMuY2FjaGVfLnZvbHVtZSA9IHZvbDtcbiAgICAgIHRoaXMudGVjaENhbGxfKCdzZXRWb2x1bWUnLCB2b2wpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIDEgd2hlbiByZXR1cm5pbmcgY3VycmVudCB2b2x1bWUuXG4gICAgdm9sID0gcGFyc2VGbG9hdCh0aGlzLnRlY2hHZXRfKCd2b2x1bWUnKSk7XG4gICAgcmV0dXJuIChpc05hTih2b2wpKSA/IDEgOiB2b2w7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgbXV0ZWQgc3RhdGUsIG9yIHR1cm4gbXV0ZSBvbiBvciBvZmZcbiAgICogYGBganNcbiAgICogICAgIC8vIGdldFxuICAgKiAgICAgdmFyIGlzVm9sdW1lTXV0ZWQgPSBteVBsYXllci5tdXRlZCgpO1xuICAgKiAgICAgLy8gc2V0XG4gICAqICAgICBteVBsYXllci5tdXRlZCh0cnVlKTsgLy8gbXV0ZSB0aGUgdm9sdW1lXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFuPX0gbXV0ZWQgVHJ1ZSB0byBtdXRlLCBmYWxzZSB0byB1bm11dGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gVHJ1ZSBpZiBtdXRlIGlzIG9uLCBmYWxzZSBpZiBub3Qgd2hlbiBnZXR0aW5nXG4gICAqIEByZXR1cm4ge1BsYXllcn0gc2VsZiB3aGVuIHNldHRpbmcgbXV0ZVxuICAgKiBAbWV0aG9kIG11dGVkXG4gICAqL1xuICBtdXRlZChtdXRlZCkge1xuICAgIGlmIChtdXRlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TXV0ZWQnLCBtdXRlZCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ211dGVkJykgfHwgZmFsc2U7IC8vIERlZmF1bHQgdG8gZmFsc2VcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGN1cnJlbnQgdGVjaCBjYW4gc3VwcG9ydCBuYXRpdmUgZnVsbHNjcmVlblxuICAvLyAoZS5nLiB3aXRoIGJ1aWx0IGluIGNvbnRyb2xzIGxpa2UgaU9TLCBzbyBub3Qgb3VyIGZsYXNoIHN3ZilcbiAgLyoqXG4gICAqIENoZWNrIHRvIHNlZSBpZiBmdWxsc2NyZWVuIGlzIHN1cHBvcnRlZFxuICAgKlxuICAgKiBAcmV0dXJuIHtCb29sZWFufVxuICAgKiBAbWV0aG9kIHN1cHBvcnRzRnVsbFNjcmVlblxuICAgKi9cbiAgc3VwcG9ydHNGdWxsU2NyZWVuKCkge1xuICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdzdXBwb3J0c0Z1bGxTY3JlZW4nKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcGxheWVyIGlzIGluIGZ1bGxzY3JlZW4gbW9kZVxuICAgKiBgYGBqc1xuICAgKiAgICAgLy8gZ2V0XG4gICAqICAgICB2YXIgZnVsbHNjcmVlbk9yTm90ID0gbXlQbGF5ZXIuaXNGdWxsc2NyZWVuKCk7XG4gICAqICAgICAvLyBzZXRcbiAgICogICAgIG15UGxheWVyLmlzRnVsbHNjcmVlbih0cnVlKTsgLy8gdGVsbCB0aGUgcGxheWVyIGl0J3MgaW4gZnVsbHNjcmVlblxuICAgKiBgYGBcbiAgICogTk9URTogQXMgb2YgdGhlIGxhdGVzdCBIVE1MNSBzcGVjLCBpc0Z1bGxzY3JlZW4gaXMgbm8gbG9uZ2VyIGFuIG9mZmljaWFsXG4gICAqIHByb3BlcnR5IGFuZCBpbnN0ZWFkIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IGlzIHVzZWQuIEJ1dCBpc0Z1bGxzY3JlZW4gaXNcbiAgICogc3RpbGwgYSB2YWx1YWJsZSBwcm9wZXJ0eSBmb3IgaW50ZXJuYWwgcGxheWVyIHdvcmtpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFuPX0gaXNGUyBVcGRhdGUgdGhlIHBsYXllcidzIGZ1bGxzY3JlZW4gc3RhdGVcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBmdWxsc2NyZWVuIGZhbHNlIGlmIG5vdCB3aGVuIGdldHRpbmdcbiAgICogQHJldHVybiB7UGxheWVyfSBzZWxmIHdoZW4gc2V0dGluZ1xuICAgKiBAbWV0aG9kIGlzRnVsbHNjcmVlblxuICAgKi9cbiAgaXNGdWxsc2NyZWVuKGlzRlMpIHtcbiAgICBpZiAoaXNGUyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmlzRnVsbHNjcmVlbl8gPSAhIWlzRlM7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy5pc0Z1bGxzY3JlZW5fO1xuICB9XG5cbiAgLyoqXG4gICAqIEluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSB2aWRlbyB0byBmdWxsIHNjcmVlblxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlQbGF5ZXIucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICogYGBgXG4gICAqIEluIHNvbWUgYnJvd3NlcnMsIGZ1bGwgc2NyZWVuIGlzIG5vdCBzdXBwb3J0ZWQgbmF0aXZlbHksIHNvIGl0IGVudGVyc1xuICAgKiBcImZ1bGwgd2luZG93IG1vZGVcIiwgd2hlcmUgdGhlIHZpZGVvIGZpbGxzIHRoZSBicm93c2VyIHdpbmRvdy5cbiAgICogSW4gYnJvd3NlcnMgYW5kIGRldmljZXMgdGhhdCBzdXBwb3J0IG5hdGl2ZSBmdWxsIHNjcmVlbiwgc29tZXRpbWVzIHRoZVxuICAgKiBicm93c2VyJ3MgZGVmYXVsdCBjb250cm9scyB3aWxsIGJlIHNob3duLCBhbmQgbm90IHRoZSBWaWRlby5qcyBjdXN0b20gc2tpbi5cbiAgICogVGhpcyBpbmNsdWRlcyBtb3N0IG1vYmlsZSBkZXZpY2VzIChpT1MsIEFuZHJvaWQpIGFuZCBvbGRlciB2ZXJzaW9ucyBvZlxuICAgKiBTYWZhcmkuXG4gICAqXG4gICAqIEByZXR1cm4ge1BsYXllcn0gc2VsZlxuICAgKiBAbWV0aG9kIHJlcXVlc3RGdWxsc2NyZWVuXG4gICAqL1xuICByZXF1ZXN0RnVsbHNjcmVlbigpIHtcbiAgICB2YXIgZnNBcGkgPSBGdWxsc2NyZWVuQXBpO1xuXG4gICAgdGhpcy5pc0Z1bGxzY3JlZW4odHJ1ZSk7XG5cbiAgICBpZiAoZnNBcGkucmVxdWVzdEZ1bGxzY3JlZW4pIHtcbiAgICAgIC8vIHRoZSBicm93c2VyIHN1cHBvcnRzIGdvaW5nIGZ1bGxzY3JlZW4gYXQgdGhlIGVsZW1lbnQgbGV2ZWwgc28gd2UgY2FuXG4gICAgICAvLyB0YWtlIHRoZSBjb250cm9scyBmdWxsc2NyZWVuIGFzIHdlbGwgYXMgdGhlIHZpZGVvXG5cbiAgICAgIC8vIFRyaWdnZXIgZnVsbHNjcmVlbmNoYW5nZSBldmVudCBhZnRlciBjaGFuZ2VcbiAgICAgIC8vIFdlIGhhdmUgdG8gc3BlY2lmaWNhbGx5IGFkZCB0aGlzIGVhY2ggdGltZSwgYW5kIHJlbW92ZVxuICAgICAgLy8gd2hlbiBjYW5jZWxpbmcgZnVsbHNjcmVlbi4gT3RoZXJ3aXNlIGlmIHRoZXJlJ3MgbXVsdGlwbGVcbiAgICAgIC8vIHBsYXllcnMgb24gYSBwYWdlLCB0aGV5IHdvdWxkIGFsbCBiZSByZWFjdGluZyB0byB0aGUgc2FtZSBmdWxsc2NyZWVuXG4gICAgICAvLyBldmVudHNcbiAgICAgIEV2ZW50cy5vbihkb2N1bWVudCwgZnNBcGkuZnVsbHNjcmVlbmNoYW5nZSwgRm4uYmluZCh0aGlzLCBmdW5jdGlvbiBkb2N1bWVudEZ1bGxzY3JlZW5DaGFuZ2UoZSl7XG4gICAgICAgIHRoaXMuaXNGdWxsc2NyZWVuKGRvY3VtZW50W2ZzQXBpLmZ1bGxzY3JlZW5FbGVtZW50XSk7XG5cbiAgICAgICAgLy8gSWYgY2FuY2VsbGluZyBmdWxsc2NyZWVuLCByZW1vdmUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgIGlmICh0aGlzLmlzRnVsbHNjcmVlbigpID09PSBmYWxzZSkge1xuICAgICAgICAgIEV2ZW50cy5vZmYoZG9jdW1lbnQsIGZzQXBpLmZ1bGxzY3JlZW5jaGFuZ2UsIGRvY3VtZW50RnVsbHNjcmVlbkNoYW5nZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICAgIH0pKTtcblxuICAgICAgdGhpcy5lbF9bZnNBcGkucmVxdWVzdEZ1bGxzY3JlZW5dKCk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMudGVjaF8uc3VwcG9ydHNGdWxsU2NyZWVuKCkpIHtcbiAgICAgIC8vIHdlIGNhbid0IHRha2UgdGhlIHZpZGVvLmpzIGNvbnRyb2xzIGZ1bGxzY3JlZW4gYnV0IHdlIGNhbiBnbyBmdWxsc2NyZWVuXG4gICAgICAvLyB3aXRoIG5hdGl2ZSBjb250cm9sc1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ2VudGVyRnVsbFNjcmVlbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmdWxsc2NyZWVuIGlzbid0IHN1cHBvcnRlZCBzbyB3ZSdsbCBqdXN0IHN0cmV0Y2ggdGhlIHZpZGVvIGVsZW1lbnQgdG9cbiAgICAgIC8vIGZpbGwgdGhlIHZpZXdwb3J0XG4gICAgICB0aGlzLmVudGVyRnVsbFdpbmRvdygpO1xuICAgICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSB2aWRlbyB0byBpdHMgbm9ybWFsIHNpemUgYWZ0ZXIgaGF2aW5nIGJlZW4gaW4gZnVsbCBzY3JlZW4gbW9kZVxuICAgKiBgYGBqc1xuICAgKiAgICAgbXlQbGF5ZXIuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEByZXR1cm4ge1BsYXllcn0gc2VsZlxuICAgKiBAbWV0aG9kIGV4aXRGdWxsc2NyZWVuXG4gICAqL1xuICBleGl0RnVsbHNjcmVlbigpIHtcbiAgICB2YXIgZnNBcGkgPSBGdWxsc2NyZWVuQXBpO1xuICAgIHRoaXMuaXNGdWxsc2NyZWVuKGZhbHNlKTtcblxuICAgIC8vIENoZWNrIGZvciBicm93c2VyIGVsZW1lbnQgZnVsbHNjcmVlbiBzdXBwb3J0XG4gICAgaWYgKGZzQXBpLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICBkb2N1bWVudFtmc0FwaS5leGl0RnVsbHNjcmVlbl0oKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGVjaF8uc3VwcG9ydHNGdWxsU2NyZWVuKCkpIHtcbiAgICAgdGhpcy50ZWNoQ2FsbF8oJ2V4aXRGdWxsU2NyZWVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgdGhpcy5leGl0RnVsbFdpbmRvdygpO1xuICAgICB0aGlzLnRyaWdnZXIoJ2Z1bGxzY3JlZW5jaGFuZ2UnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGZ1bGxzY3JlZW4gaXNuJ3Qgc3VwcG9ydGVkIHdlIGNhbiBzdHJldGNoIHRoZSB2aWRlbyBjb250YWluZXIgdG8gYXMgd2lkZSBhcyB0aGUgYnJvd3NlciB3aWxsIGxldCB1cy5cbiAgICpcbiAgICogQG1ldGhvZCBlbnRlckZ1bGxXaW5kb3dcbiAgICovXG4gIGVudGVyRnVsbFdpbmRvdygpIHtcbiAgICB0aGlzLmlzRnVsbFdpbmRvdyA9IHRydWU7XG5cbiAgICAvLyBTdG9yaW5nIG9yaWdpbmFsIGRvYyBvdmVyZmxvdyB2YWx1ZSB0byByZXR1cm4gdG8gd2hlbiBmdWxsc2NyZWVuIGlzIG9mZlxuICAgIHRoaXMuZG9jT3JpZ092ZXJmbG93ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93O1xuXG4gICAgLy8gQWRkIGxpc3RlbmVyIGZvciBlc2Mga2V5IHRvIGV4aXQgZnVsbHNjcmVlblxuICAgIEV2ZW50cy5vbihkb2N1bWVudCwgJ2tleWRvd24nLCBGbi5iaW5kKHRoaXMsIHRoaXMuZnVsbFdpbmRvd09uRXNjS2V5KSk7XG5cbiAgICAvLyBIaWRlIGFueSBzY3JvbGwgYmFyc1xuICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nO1xuXG4gICAgLy8gQXBwbHkgZnVsbHNjcmVlbiBzdHlsZXNcbiAgICBEb20uYWRkRWxDbGFzcyhkb2N1bWVudC5ib2R5LCAndmpzLWZ1bGwtd2luZG93Jyk7XG5cbiAgICB0aGlzLnRyaWdnZXIoJ2VudGVyRnVsbFdpbmRvdycpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGZvciBjYWxsIHRvIGVpdGhlciBleGl0IGZ1bGwgd2luZG93IG9yIGZ1bGwgc2NyZWVuIG9uIEVTQyBrZXlcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IEV2ZW50IHRvIGNoZWNrIGZvciBrZXkgcHJlc3NcbiAgICogQG1ldGhvZCBmdWxsV2luZG93T25Fc2NLZXlcbiAgICovXG4gIGZ1bGxXaW5kb3dPbkVzY0tleShldmVudCkge1xuICAgIGlmIChldmVudC5rZXlDb2RlID09PSAyNykge1xuICAgICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKCkgPT09IHRydWUpIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbHNjcmVlbigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5leGl0RnVsbFdpbmRvdygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGl0IGZ1bGwgd2luZG93XG4gICAqXG4gICAqIEBtZXRob2QgZXhpdEZ1bGxXaW5kb3dcbiAgICovXG4gIGV4aXRGdWxsV2luZG93KCkge1xuICAgIHRoaXMuaXNGdWxsV2luZG93ID0gZmFsc2U7XG4gICAgRXZlbnRzLm9mZihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLmZ1bGxXaW5kb3dPbkVzY0tleSk7XG5cbiAgICAvLyBVbmhpZGUgc2Nyb2xsIGJhcnMuXG4gICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gdGhpcy5kb2NPcmlnT3ZlcmZsb3c7XG5cbiAgICAvLyBSZW1vdmUgZnVsbHNjcmVlbiBzdHlsZXNcbiAgICBEb20ucmVtb3ZlRWxDbGFzcyhkb2N1bWVudC5ib2R5LCAndmpzLWZ1bGwtd2luZG93Jyk7XG5cbiAgICAvLyBSZXNpemUgdGhlIGJveCwgY29udHJvbGxlciwgYW5kIHBvc3RlciB0byBvcmlnaW5hbCBzaXplc1xuICAgIC8vIHRoaXMucG9zaXRpb25BbGwoKTtcbiAgICB0aGlzLnRyaWdnZXIoJ2V4aXRGdWxsV2luZG93Jyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGUgcGxheWVyIGNhbiBwbGF5IGEgZ2l2ZW4gbWltZXR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgVGhlIG1pbWV0eXBlIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge1N0cmluZ30gJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAgICogQG1ldGhvZCBjYW5QbGF5VHlwZVxuICAgKi9cbiAgY2FuUGxheVR5cGUodHlwZSkge1xuICAgIGxldCBjYW47XG5cbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBwbGF5YmFjayB0ZWNobm9sb2d5IGluIHRoZSBvcHRpb25zIG9yZGVyXG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSB0aGlzLm9wdGlvbnNfLnRlY2hPcmRlcjsgaSA8IGoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0ZWNoTmFtZSA9IHRvVGl0bGVDYXNlKGpbaV0pO1xuICAgICAgbGV0IHRlY2ggPSBUZWNoLmdldFRlY2godGVjaE5hbWUpO1xuXG4gICAgICAvLyBTdXBwb3J0IG9sZCBiZWhhdmlvciBvZiB0ZWNocyBiZWluZyByZWdpc3RlcmVkIGFzIGNvbXBvbmVudHMuXG4gICAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC5cbiAgICAgIGlmICghdGVjaCkge1xuICAgICAgICB0ZWNoID0gQ29tcG9uZW50LmdldENvbXBvbmVudCh0ZWNoTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRlY2ggaXMgZGVmaW5lZCBiZWZvcmUgY29udGludWluZ1xuICAgICAgaWYgKCF0ZWNoKSB7XG4gICAgICAgIGxvZy5lcnJvcihgVGhlIFwiJHt0ZWNoTmFtZX1cIiB0ZWNoIGlzIHVuZGVmaW5lZC4gU2tpcHBlZCBicm93c2VyIHN1cHBvcnQgY2hlY2sgZm9yIHRoYXQgdGVjaC5gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgaWYgKHRlY2guaXNTdXBwb3J0ZWQoKSkge1xuICAgICAgICBjYW4gPSB0ZWNoLmNhblBsYXlUeXBlKHR5cGUpO1xuXG4gICAgICAgIGlmIChjYW4pIHtcbiAgICAgICAgICByZXR1cm4gY2FuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbGVjdCBzb3VyY2UgYmFzZWQgb24gdGVjaC1vcmRlciBvciBzb3VyY2Utb3JkZXJcbiAgICogVXNlcyBzb3VyY2Utb3JkZXIgc2VsZWN0aW9uIGlmIGBvcHRpb25zLnNvdXJjZU9yZGVyYCBpcyB0cnV0aHkuIE90aGVyd2lzZSxcbiAgICogZGVmYXVsdHMgdG8gdGVjaC1vcmRlciBzZWxlY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gc291cmNlcyBUaGUgc291cmNlcyBmb3IgYSBtZWRpYSBhc3NldFxuICAgKiBAcmV0dXJuIHtPYmplY3R8Qm9vbGVhbn0gT2JqZWN0IG9mIHNvdXJjZSBhbmQgdGVjaCBvcmRlciwgb3RoZXJ3aXNlIGZhbHNlXG4gICAqIEBtZXRob2Qgc2VsZWN0U291cmNlXG4gICAqL1xuICBzZWxlY3RTb3VyY2Uoc291cmNlcykge1xuICAgIC8vIEdldCBvbmx5IHRoZSB0ZWNocyBzcGVjaWZpZWQgaW4gYHRlY2hPcmRlcmAgdGhhdCBleGlzdCBhbmQgYXJlIHN1cHBvcnRlZCBieSB0aGVcbiAgICAvLyBjdXJyZW50IHBsYXRmb3JtXG4gICAgbGV0IHRlY2hzID1cbiAgICAgIHRoaXMub3B0aW9uc18udGVjaE9yZGVyXG4gICAgICAgIC5tYXAodG9UaXRsZUNhc2UpXG4gICAgICAgIC5tYXAoKHRlY2hOYW1lKSA9PiB7XG4gICAgICAgICAgLy8gYENvbXBvbmVudC5nZXRDb21wb25lbnQoLi4uKWAgaXMgZm9yIHN1cHBvcnQgb2Ygb2xkIGJlaGF2aW9yIG9mIHRlY2hzXG4gICAgICAgICAgLy8gYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgICAgIC8vIFJlbW92ZSBvbmNlIHRoYXQgZGVwcmVjYXRlZCBiZWhhdmlvciBpcyByZW1vdmVkLlxuICAgICAgICAgIHJldHVybiBbdGVjaE5hbWUsIFRlY2guZ2V0VGVjaCh0ZWNoTmFtZSkgfHwgQ29tcG9uZW50LmdldENvbXBvbmVudCh0ZWNoTmFtZSldO1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChbdGVjaE5hbWUsIHRlY2hdKSA9PiB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdGVjaCBpcyBkZWZpbmVkIGJlZm9yZSBjb250aW51aW5nXG4gICAgICAgICAgaWYgKHRlY2gpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICAgICAgcmV0dXJuIHRlY2guaXNTdXBwb3J0ZWQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2cuZXJyb3IoYFRoZSBcIiR7dGVjaE5hbWV9XCIgdGVjaCBpcyB1bmRlZmluZWQuIFNraXBwZWQgYnJvd3NlciBzdXBwb3J0IGNoZWNrIGZvciB0aGF0IHRlY2guYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgIC8vIEl0ZXJhdGUgb3ZlciBlYWNoIGBpbm5lckFycmF5YCBlbGVtZW50IG9uY2UgcGVyIGBvdXRlckFycmF5YCBlbGVtZW50IGFuZCBleGVjdXRlXG4gICAgLy8gYHRlc3RlcmAgd2l0aCBib3RoLiBJZiBgdGVzdGVyYCByZXR1cm5zIGEgbm9uLWZhbHN5IHZhbHVlLCBleGl0IGVhcmx5IGFuZCByZXR1cm5cbiAgICAvLyB0aGF0IHZhbHVlLlxuICAgIGxldCBmaW5kRmlyc3RQYXNzaW5nVGVjaFNvdXJjZVBhaXIgPSBmdW5jdGlvbiAob3V0ZXJBcnJheSwgaW5uZXJBcnJheSwgdGVzdGVyKSB7XG4gICAgICBsZXQgZm91bmQ7XG5cbiAgICAgIG91dGVyQXJyYXkuc29tZSgob3V0ZXJDaG9pY2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGlubmVyQXJyYXkuc29tZSgoaW5uZXJDaG9pY2UpID0+IHtcbiAgICAgICAgICBmb3VuZCA9IHRlc3RlcihvdXRlckNob2ljZSwgaW5uZXJDaG9pY2UpO1xuXG4gICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBmb3VuZDtcbiAgICB9O1xuXG4gICAgbGV0IGZvdW5kU291cmNlQW5kVGVjaDtcbiAgICBsZXQgZmxpcCA9IChmbikgPT4gKGEsIGIpID0+IGZuKGIsIGEpO1xuICAgIGxldCBmaW5kZXIgPSAoW3RlY2hOYW1lLCB0ZWNoXSwgc291cmNlKSA9PiB7XG4gICAgICBpZiAodGVjaC5jYW5QbGF5U291cmNlKHNvdXJjZSkpIHtcbiAgICAgICAgcmV0dXJuIHtzb3VyY2U6IHNvdXJjZSwgdGVjaDogdGVjaE5hbWV9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBEZXBlbmRpbmcgb24gdGhlIHRydXRoaW5lc3Mgb2YgYG9wdGlvbnMuc291cmNlT3JkZXJgLCB3ZSBzd2FwIHRoZSBvcmRlciBvZiB0ZWNocyBhbmQgc291cmNlc1xuICAgIC8vIHRvIHNlbGVjdCBmcm9tIHRoZW0gYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuXG4gICAgaWYgKHRoaXMub3B0aW9uc18uc291cmNlT3JkZXIpIHtcbiAgICAgIC8vIFNvdXJjZS1maXJzdCBvcmRlcmluZ1xuICAgICAgZm91bmRTb3VyY2VBbmRUZWNoID0gZmluZEZpcnN0UGFzc2luZ1RlY2hTb3VyY2VQYWlyKHNvdXJjZXMsIHRlY2hzLCBmbGlwKGZpbmRlcikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUZWNoLWZpcnN0IG9yZGVyaW5nXG4gICAgICBmb3VuZFNvdXJjZUFuZFRlY2ggPSBmaW5kRmlyc3RQYXNzaW5nVGVjaFNvdXJjZVBhaXIodGVjaHMsIHNvdXJjZXMsIGZpbmRlcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvdW5kU291cmNlQW5kVGVjaCB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHZpZGVvIHNvdXJjZVxuICAgKiBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2YgdmFyaWFibGVzIHlvdSBjYW4gcGFzcyBhcyB0aGUgYXJndW1lbnQuXG4gICAqICoqVVJMIFN0cmluZyoqOiBBIFVSTCB0byB0aGUgdGhlIHZpZGVvIGZpbGUuIFVzZSB0aGlzIG1ldGhvZCBpZiB5b3UgYXJlIHN1cmVcbiAgICogdGhlIGN1cnJlbnQgcGxheWJhY2sgdGVjaG5vbG9neSAoSFRNTDUvRmxhc2gpIGNhbiBzdXBwb3J0IHRoZSBzb3VyY2UgeW91XG4gICAqIHByb3ZpZGUuIEN1cnJlbnRseSBvbmx5IE1QNCBmaWxlcyBjYW4gYmUgdXNlZCBpbiBib3RoIEhUTUw1IGFuZCBGbGFzaC5cbiAgICogYGBganNcbiAgICogICAgIG15UGxheWVyLnNyYyhcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcGF0aC90by92aWRlby5tcDRcIik7XG4gICAqIGBgYFxuICAgKiAqKlNvdXJjZSBPYmplY3QgKG9yIGVsZW1lbnQpOiogKiBBIGphdmFzY3JpcHQgb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb25cbiAgICogYWJvdXQgdGhlIHNvdXJjZSBmaWxlLiBVc2UgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdGhlIHBsYXllciB0byBkZXRlcm1pbmUgaWZcbiAgICogaXQgY2FuIHN1cHBvcnQgdGhlIGZpbGUgdXNpbmcgdGhlIHR5cGUgaW5mb3JtYXRpb24uXG4gICAqIGBgYGpzXG4gICAqICAgICBteVBsYXllci5zcmMoeyB0eXBlOiBcInZpZGVvL21wNFwiLCBzcmM6IFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYXRoL3RvL3ZpZGVvLm1wNFwiIH0pO1xuICAgKiBgYGBcbiAgICogKipBcnJheSBvZiBTb3VyY2UgT2JqZWN0czoqICogVG8gcHJvdmlkZSBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc291cmNlIHNvXG4gICAqIHRoYXQgaXQgY2FuIGJlIHBsYXllZCB1c2luZyBIVE1MNSBhY3Jvc3MgYnJvd3NlcnMgeW91IGNhbiB1c2UgYW4gYXJyYXkgb2ZcbiAgICogc291cmNlIG9iamVjdHMuIFZpZGVvLmpzIHdpbGwgZGV0ZWN0IHdoaWNoIHZlcnNpb24gaXMgc3VwcG9ydGVkIGFuZCBsb2FkIHRoYXRcbiAgICogZmlsZS5cbiAgICogYGBganNcbiAgICogICAgIG15UGxheWVyLnNyYyhbXG4gICAqICAgICAgIHsgdHlwZTogXCJ2aWRlby9tcDRcIiwgc3JjOiBcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vcGF0aC90by92aWRlby5tcDRcIiB9LFxuICAgKiAgICAgICB7IHR5cGU6IFwidmlkZW8vd2VibVwiLCBzcmM6IFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9wYXRoL3RvL3ZpZGVvLndlYm1cIiB9LFxuICAgKiAgICAgICB7IHR5cGU6IFwidmlkZW8vb2dnXCIsIHNyYzogXCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3BhdGgvdG8vdmlkZW8ub2d2XCIgfVxuICAgKiAgICAgXSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gIHtTdHJpbmd8T2JqZWN0fEFycmF5PX0gc291cmNlIFRoZSBzb3VyY2UgVVJMLCBvYmplY3QsIG9yIGFycmF5IG9mIHNvdXJjZXNcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgY3VycmVudCB2aWRlbyBzb3VyY2Ugd2hlbiBnZXR0aW5nXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIHBsYXllciB3aGVuIHNldHRpbmdcbiAgICogQG1ldGhvZCBzcmNcbiAgICovXG4gIHNyYyhzb3VyY2UpIHtcbiAgICBpZiAoc291cmNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdzcmMnKTtcbiAgICB9XG5cbiAgICBsZXQgY3VycmVudFRlY2ggPSBUZWNoLmdldFRlY2godGhpcy50ZWNoTmFtZV8pO1xuICAgIC8vIFN1cHBvcnQgb2xkIGJlaGF2aW9yIG9mIHRlY2hzIGJlaW5nIHJlZ2lzdGVyZWQgYXMgY29tcG9uZW50cy5cbiAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC5cbiAgICBpZiAoIWN1cnJlbnRUZWNoKSB7XG4gICAgICBjdXJyZW50VGVjaCA9IENvbXBvbmVudC5nZXRDb21wb25lbnQodGhpcy50ZWNoTmFtZV8pO1xuICAgIH1cblxuICAgIC8vIGNhc2U6IEFycmF5IG9mIHNvdXJjZSBvYmplY3RzIHRvIGNob29zZSBmcm9tIGFuZCBwaWNrIHRoZSBiZXN0IHRvIHBsYXlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpKSB7XG4gICAgICB0aGlzLnNvdXJjZUxpc3RfKHNvdXJjZSk7XG5cbiAgICAvLyBjYXNlOiBVUkwgU3RyaW5nIChodHRwOi8vbXl2aWRlby4uLilcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAvLyBjcmVhdGUgYSBzb3VyY2Ugb2JqZWN0IGZyb20gdGhlIHN0cmluZ1xuICAgICAgdGhpcy5zcmMoeyBzcmM6IHNvdXJjZSB9KTtcblxuICAgIC8vIGNhc2U6IFNvdXJjZSBvYmplY3QgeyBzcmM6ICcnLCB0eXBlOiAnJyAuLi4gfVxuICAgIH0gZWxzZSBpZiAoc291cmNlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGUgc291cmNlIGhhcyBhIHR5cGUgYW5kIHRoZSBsb2FkZWQgdGVjaCBjYW5ub3QgcGxheSB0aGUgc291cmNlXG4gICAgICAvLyBpZiB0aGVyZSdzIG5vIHR5cGUgd2UnbGwganVzdCB0cnkgdGhlIGN1cnJlbnQgdGVjaFxuICAgICAgaWYgKHNvdXJjZS50eXBlICYmICFjdXJyZW50VGVjaC5jYW5QbGF5U291cmNlKHNvdXJjZSkpIHtcbiAgICAgICAgLy8gY3JlYXRlIGEgc291cmNlIGxpc3Qgd2l0aCB0aGUgY3VycmVudCBzb3VyY2UgYW5kIHNlbmQgdGhyb3VnaFxuICAgICAgICAvLyB0aGUgdGVjaCBsb29wIHRvIGNoZWNrIGZvciBhIGNvbXBhdGlibGUgdGVjaG5vbG9neVxuICAgICAgICB0aGlzLnNvdXJjZUxpc3RfKFtzb3VyY2VdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY2FjaGVfLnNyYyA9IHNvdXJjZS5zcmM7XG4gICAgICAgIHRoaXMuY3VycmVudFR5cGVfID0gc291cmNlLnR5cGUgfHwgJyc7XG5cbiAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgdGVjaCBpcyByZWFkeSB0byBzZXQgdGhlIHNvdXJjZVxuICAgICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAvLyBUaGUgc2V0U291cmNlIHRlY2ggbWV0aG9kIHdhcyBhZGRlZCB3aXRoIHNvdXJjZSBoYW5kbGVyc1xuICAgICAgICAgIC8vIHNvIG9sZGVyIHRlY2hzIHdvbid0IHN1cHBvcnQgaXRcbiAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHRoZSBkaXJlY3QgcHJvdG90eXBlIGZvciB0aGUgY2FzZSB3aGVyZSBzdWJjbGFzc2VzXG4gICAgICAgICAgLy8gb2YgdGhlIHRlY2ggZG8gbm90IHN1cHBvcnQgc291cmNlIGhhbmRsZXJzXG4gICAgICAgICAgaWYgKGN1cnJlbnRUZWNoLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgnc2V0U291cmNlJykpIHtcbiAgICAgICAgICAgIHRoaXMudGVjaENhbGxfKCdzZXRTb3VyY2UnLCBzb3VyY2UpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRlY2hDYWxsXygnc3JjJywgc291cmNlLnNyYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHRoaXMub3B0aW9uc18ucHJlbG9hZCA9PT0gJ2F1dG8nKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zXy5hdXRvcGxheSkge1xuICAgICAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgc291cmNlIHN5bmNocm9ub3VzbHkgaWYgcG9zc2libGUgKCMyMzI2KVxuICAgICAgICB9LCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgYW4gYXJyYXkgb2Ygc291cmNlIG9iamVjdHNcbiAgICpcbiAgICogQHBhcmFtICB7QXJyYXl9IHNvdXJjZXMgQXJyYXkgb2Ygc291cmNlIG9iamVjdHNcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBzb3VyY2VMaXN0X1xuICAgKi9cbiAgc291cmNlTGlzdF8oc291cmNlcykge1xuICAgIHZhciBzb3VyY2VUZWNoID0gdGhpcy5zZWxlY3RTb3VyY2Uoc291cmNlcyk7XG5cbiAgICBpZiAoc291cmNlVGVjaCkge1xuICAgICAgaWYgKHNvdXJjZVRlY2gudGVjaCA9PT0gdGhpcy50ZWNoTmFtZV8pIHtcbiAgICAgICAgLy8gaWYgdGhpcyB0ZWNobm9sb2d5IGlzIGFscmVhZHkgbG9hZGVkLCBzZXQgdGhlIHNvdXJjZVxuICAgICAgICB0aGlzLnNyYyhzb3VyY2VUZWNoLnNvdXJjZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBsb2FkIHRoaXMgdGVjaG5vbG9neSB3aXRoIHRoZSBjaG9zZW4gc291cmNlXG4gICAgICAgIHRoaXMubG9hZFRlY2hfKHNvdXJjZVRlY2gudGVjaCwgc291cmNlVGVjaC5zb3VyY2UpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHdyYXAgdGhpcyBpbiBhIHRpbWVvdXQgdG8gZ2l2ZSBmb2xrcyBhIGNoYW5jZSB0byBhZGQgZXJyb3IgZXZlbnQgaGFuZGxlcnNcbiAgICAgIHRoaXMuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZXJyb3IoeyBjb2RlOiA0LCBtZXNzYWdlOiB0aGlzLmxvY2FsaXplKHRoaXMub3B0aW9uc18ubm90U3VwcG9ydGVkTWVzc2FnZSkgfSk7XG4gICAgICB9LCAwKTtcblxuICAgICAgLy8gd2UgY291bGQgbm90IGZpbmQgYW4gYXBwcm9wcmlhdGUgdGVjaCwgYnV0IGxldCdzIHN0aWxsIG5vdGlmeSB0aGUgZGVsZWdhdGUgdGhhdCB0aGlzIGlzIGl0XG4gICAgICAvLyB0aGlzIG5lZWRzIGEgYmV0dGVyIGNvbW1lbnQgYWJvdXQgd2h5IHRoaXMgaXMgbmVlZGVkXG4gICAgICB0aGlzLnRyaWdnZXJSZWFkeSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCZWdpbiBsb2FkaW5nIHRoZSBzcmMgZGF0YS5cbiAgICpcbiAgICogQHJldHVybiB7UGxheWVyfSBSZXR1cm5zIHRoZSBwbGF5ZXJcbiAgICogQG1ldGhvZCBsb2FkXG4gICAqL1xuICBsb2FkKCkge1xuICAgIHRoaXMudGVjaENhbGxfKCdsb2FkJyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHBsYXllci4gTG9hZHMgdGhlIGZpcnN0IHRlY2ggaW4gdGhlIHRlY2hPcmRlcixcbiAgICogYW5kIGNhbGxzIGByZXNldGAgb24gdGhlIHRlY2hgLlxuICAgKlxuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9IFJldHVybnMgdGhlIHBsYXllclxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqL1xuICByZXNldCgpIHtcbiAgICB0aGlzLmxvYWRUZWNoXyh0b1RpdGxlQ2FzZSh0aGlzLm9wdGlvbnNfLnRlY2hPcmRlclswXSksIG51bGwpO1xuICAgIHRoaXMudGVjaENhbGxfKCdyZXNldCcpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGx5IHF1YWxpZmllZCBVUkwgb2YgdGhlIGN1cnJlbnQgc291cmNlIHZhbHVlIGUuZy4gaHR0cDovL215c2l0ZS5jb20vdmlkZW8ubXA0XG4gICAqIENhbiBiZSB1c2VkIGluIGNvbmp1Y3Rpb24gd2l0aCBgY3VycmVudFR5cGVgIHRvIGFzc2lzdCBpbiByZWJ1aWxkaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBvYmplY3QuXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGN1cnJlbnQgc291cmNlXG4gICAqIEBtZXRob2QgY3VycmVudFNyY1xuICAgKi9cbiAgY3VycmVudFNyYygpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygnY3VycmVudFNyYycpIHx8IHRoaXMuY2FjaGVfLnNyYyB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnQgc291cmNlIHR5cGUgZS5nLiB2aWRlby9tcDRcbiAgICogVGhpcyBjYW4gYWxsb3cgeW91IHJlYnVpbGQgdGhlIGN1cnJlbnQgc291cmNlIG9iamVjdCBzbyB0aGF0IHlvdSBjb3VsZCBsb2FkIHRoZSBzYW1lXG4gICAqIHNvdXJjZSBhbmQgdGVjaCBsYXRlclxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBzb3VyY2UgTUlNRSB0eXBlXG4gICAqIEBtZXRob2QgY3VycmVudFR5cGVcbiAgICovXG4gIGN1cnJlbnRUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRUeXBlXyB8fCAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHZhbHVlIEJvb2xlYW4gdG8gZGV0ZXJtaW5lIGlmIHByZWxvYWQgc2hvdWxkIGJlIHVzZWRcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgcHJlbG9hZCBhdHRyaWJ1dGUgdmFsdWUgd2hlbiBnZXR0aW5nXG4gICAqIEByZXR1cm4ge1BsYXllcn0gUmV0dXJucyB0aGUgcGxheWVyIHdoZW4gc2V0dGluZ1xuICAgKiBAbWV0aG9kIHByZWxvYWRcbiAgICovXG4gIHByZWxvYWQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldFByZWxvYWQnLCB2YWx1ZSk7XG4gICAgICB0aGlzLm9wdGlvbnNfLnByZWxvYWQgPSB2YWx1ZTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncHJlbG9hZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgdGhlIGF1dG9wbGF5IGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZSBCb29sZWFuIHRvIGRldGVybWluZSBpZiB2aWRlbyBzaG91bGQgYXV0b3BsYXlcbiAgICogQHJldHVybiB7U3RyaW5nfSBUaGUgYXV0b3BsYXkgYXR0cmlidXRlIHZhbHVlIHdoZW4gZ2V0dGluZ1xuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9IFJldHVybnMgdGhlIHBsYXllciB3aGVuIHNldHRpbmdcbiAgICogQG1ldGhvZCBhdXRvcGxheVxuICAgKi9cbiAgYXV0b3BsYXkodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy50ZWNoQ2FsbF8oJ3NldEF1dG9wbGF5JywgdmFsdWUpO1xuICAgICAgdGhpcy5vcHRpb25zXy5hdXRvcGxheSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdhdXRvcGxheScsIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgb3Igc2V0IHRoZSBsb29wIGF0dHJpYnV0ZSBvbiB0aGUgdmlkZW8gZWxlbWVudC5cbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSB2YWx1ZSBCb29sZWFuIHRvIGRldGVybWluZSBpZiB2aWRlbyBzaG91bGQgbG9vcFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IFRoZSBsb29wIGF0dHJpYnV0ZSB2YWx1ZSB3aGVuIGdldHRpbmdcbiAgICogQHJldHVybiB7UGxheWVyfSBSZXR1cm5zIHRoZSBwbGF5ZXIgd2hlbiBzZXR0aW5nXG4gICAqIEBtZXRob2QgbG9vcFxuICAgKi9cbiAgbG9vcCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0TG9vcCcsIHZhbHVlKTtcbiAgICAgIHRoaXMub3B0aW9uc19bJ2xvb3AnXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRlY2hHZXRfKCdsb29wJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IG9yIHNldCB0aGUgcG9zdGVyIGltYWdlIHNvdXJjZSB1cmxcbiAgICpcbiAgICogIyMjIyMgRVhBTVBMRTpcbiAgICogYGBganNcbiAgICogICAgIC8vIGdldFxuICAgKiAgICAgdmFyIGN1cnJlbnRQb3N0ZXIgPSBteVBsYXllci5wb3N0ZXIoKTtcbiAgICogICAgIC8vIHNldFxuICAgKiAgICAgbXlQbGF5ZXIucG9zdGVyKCdodHRwOi8vZXhhbXBsZS5jb20vbXlJbWFnZS5qcGcnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZz19IHNyYyBQb3N0ZXIgaW1hZ2Ugc291cmNlIFVSTFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9IHBvc3RlciBVUkwgd2hlbiBnZXR0aW5nXG4gICAqIEByZXR1cm4ge1BsYXllcn0gc2VsZiB3aGVuIHNldHRpbmdcbiAgICogQG1ldGhvZCBwb3N0ZXJcbiAgICovXG4gIHBvc3RlcihzcmMpIHtcbiAgICBpZiAoc3JjID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnBvc3Rlcl87XG4gICAgfVxuXG4gICAgLy8gVGhlIGNvcnJlY3Qgd2F5IHRvIHJlbW92ZSBhIHBvc3RlciBpcyB0byBzZXQgYXMgYW4gZW1wdHkgc3RyaW5nXG4gICAgLy8gb3RoZXIgZmFsc2V5IHZhbHVlcyB3aWxsIHRocm93IGVycm9yc1xuICAgIGlmICghc3JjKSB7XG4gICAgICBzcmMgPSAnJztcbiAgICB9XG5cbiAgICAvLyB1cGRhdGUgdGhlIGludGVybmFsIHBvc3RlciB2YXJpYWJsZVxuICAgIHRoaXMucG9zdGVyXyA9IHNyYztcblxuICAgIC8vIHVwZGF0ZSB0aGUgdGVjaCdzIHBvc3RlclxuICAgIHRoaXMudGVjaENhbGxfKCdzZXRQb3N0ZXInLCBzcmMpO1xuXG4gICAgLy8gYWxlcnQgY29tcG9uZW50cyB0aGF0IHRoZSBwb3N0ZXIgaGFzIGJlZW4gc2V0XG4gICAgdGhpcy50cmlnZ2VyKCdwb3N0ZXJjaGFuZ2UnKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbWUgdGVjaHMgKGUuZy4gWW91VHViZSkgY2FuIHByb3ZpZGUgYSBwb3N0ZXIgc291cmNlIGluIGFuXG4gICAqIGFzeW5jaHJvbm91cyB3YXkuIFdlIHdhbnQgdGhlIHBvc3RlciBjb21wb25lbnQgdG8gdXNlIHRoaXNcbiAgICogcG9zdGVyIHNvdXJjZSBzbyB0aGF0IGl0IGNvdmVycyB1cCB0aGUgdGVjaCdzIGNvbnRyb2xzLlxuICAgKiAoWW91VHViZSdzIHBsYXkgYnV0dG9uKS4gSG93ZXZlciB3ZSBvbmx5IHdhbnQgdG8gdXNlIHRoaXNcbiAgICogc29ydWNlIGlmIHRoZSBwbGF5ZXIgdXNlciBoYXNuJ3Qgc2V0IGEgcG9zdGVyIHRocm91Z2hcbiAgICogdGhlIG5vcm1hbCBBUElzLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIGhhbmRsZVRlY2hQb3N0ZXJDaGFuZ2VfXG4gICAqL1xuICBoYW5kbGVUZWNoUG9zdGVyQ2hhbmdlXygpIHtcbiAgICBpZiAoIXRoaXMucG9zdGVyXyAmJiB0aGlzLnRlY2hfICYmIHRoaXMudGVjaF8ucG9zdGVyKSB7XG4gICAgICB0aGlzLnBvc3Rlcl8gPSB0aGlzLnRlY2hfLnBvc3RlcigpIHx8ICcnO1xuXG4gICAgICAvLyBMZXQgY29tcG9uZW50cyBrbm93IHRoZSBwb3N0ZXIgaGFzIGNoYW5nZWRcbiAgICAgIHRoaXMudHJpZ2dlcigncG9zdGVyY2hhbmdlJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBvciBzZXQgd2hldGhlciBvciBub3QgdGhlIGNvbnRyb2xzIGFyZSBzaG93aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBib29sIFNldCBjb250cm9scyB0byBzaG93aW5nIG9yIG5vdFxuICAgKiBAcmV0dXJuIHtCb29sZWFufSAgICBDb250cm9scyBhcmUgc2hvd2luZ1xuICAgKiBAbWV0aG9kIGNvbnRyb2xzXG4gICAqL1xuICBjb250cm9scyhib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYm9vbCA9ICEhYm9vbDsgLy8gZm9yY2UgYm9vbGVhblxuICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBhIGNoYW5nZSBldmVudCB1bmxlc3MgaXQgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgaWYgKHRoaXMuY29udHJvbHNfICE9PSBib29sKSB7XG4gICAgICAgIHRoaXMuY29udHJvbHNfID0gYm9vbDtcblxuICAgICAgICBpZiAodGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzKCkpIHtcbiAgICAgICAgICB0aGlzLnRlY2hDYWxsXygnc2V0Q29udHJvbHMnLCBib29sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib29sKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWNvbnRyb2xzLWRpc2FibGVkJyk7XG4gICAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWNvbnRyb2xzLWVuYWJsZWQnKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2NvbnRyb2xzZW5hYmxlZCcpO1xuXG4gICAgICAgICAgaWYgKCF0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHMoKSkge1xuICAgICAgICAgICAgdGhpcy5hZGRUZWNoQ29udHJvbHNMaXN0ZW5lcnNfKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy1jb250cm9scy1lbmFibGVkJyk7XG4gICAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLWNvbnRyb2xzLWRpc2FibGVkJyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyKCdjb250cm9sc2Rpc2FibGVkJyk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMudXNpbmdOYXRpdmVDb250cm9scygpKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRlY2hDb250cm9sc0xpc3RlbmVyc18oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICByZXR1cm4gISF0aGlzLmNvbnRyb2xzXztcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgbmF0aXZlIGNvbnRyb2xzIG9uL29mZi4gTmF0aXZlIGNvbnRyb2xzIGFyZSB0aGUgY29udHJvbHMgYnVpbHQgaW50b1xuICAgKiBkZXZpY2VzIChlLmcuIGRlZmF1bHQgaVBob25lIGNvbnRyb2xzKSwgRmxhc2gsIG9yIG90aGVyIHRlY2hzXG4gICAqIChlLmcuIFZpbWVvIENvbnRyb2xzKVxuICAgKiAqKlRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IGJ5IHRoZSBjdXJyZW50IHRlY2gsIGJlY2F1c2Ugb25seSB0aGUgdGVjaCBrbm93c1xuICAgKiBpZiBpdCBjYW4gc3VwcG9ydCBuYXRpdmUgY29udHJvbHMqKlxuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBib29sICAgIFRydWUgc2lnbmFscyB0aGF0IG5hdGl2ZSBjb250cm9scyBhcmUgb25cbiAgICogQHJldHVybiB7UGxheWVyfSAgICAgIFJldHVybnMgdGhlIHBsYXllclxuICAgKiBAcHJpdmF0ZVxuICAgKiBAbWV0aG9kIHVzaW5nTmF0aXZlQ29udHJvbHNcbiAgICovXG4gIHVzaW5nTmF0aXZlQ29udHJvbHMoYm9vbCkge1xuICAgIGlmIChib29sICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGJvb2wgPSAhIWJvb2w7IC8vIGZvcmNlIGJvb2xlYW5cbiAgICAgIC8vIERvbid0IHRyaWdnZXIgYSBjaGFuZ2UgZXZlbnQgdW5sZXNzIGl0IGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIGlmICh0aGlzLnVzaW5nTmF0aXZlQ29udHJvbHNfICE9PSBib29sKSB7XG4gICAgICAgIHRoaXMudXNpbmdOYXRpdmVDb250cm9sc18gPSBib29sO1xuICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy11c2luZy1uYXRpdmUtY29udHJvbHMnKTtcblxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAgKiBwbGF5ZXIgaXMgdXNpbmcgdGhlIG5hdGl2ZSBkZXZpY2UgY29udHJvbHNcbiAgICAgICAgICAgKlxuICAgICAgICAgICAgKiBAZXZlbnQgdXNpbmduYXRpdmVjb250cm9sc1xuICAgICAgICAgICAgKiBAbWVtYmVyb2YgUGxheWVyXG4gICAgICAgICAgICAqIEBpbnN0YW5jZVxuICAgICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgICAgKi9cbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3VzaW5nbmF0aXZlY29udHJvbHMnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdXNpbmctbmF0aXZlLWNvbnRyb2xzJyk7XG5cbiAgICAgICAgICAvKipcbiAgICAgICAgICAgICogcGxheWVyIGlzIHVzaW5nIHRoZSBjdXN0b20gSFRNTCBjb250cm9sc1xuICAgICAgICAgICAqXG4gICAgICAgICAgICAqIEBldmVudCB1c2luZ2N1c3RvbWNvbnRyb2xzXG4gICAgICAgICAgICAqIEBtZW1iZXJvZiBQbGF5ZXJcbiAgICAgICAgICAgICogQGluc3RhbmNlXG4gICAgICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAgICAqL1xuICAgICAgICAgIHRoaXMudHJpZ2dlcigndXNpbmdjdXN0b21jb250cm9scycpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuICEhdGhpcy51c2luZ05hdGl2ZUNvbnRyb2xzXztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgb3IgZ2V0IHRoZSBjdXJyZW50IE1lZGlhRXJyb3JcbiAgICpcbiAgICogQHBhcmFtICB7Kn0gZXJyIEEgTWVkaWFFcnJvciBvciBhIFN0cmluZy9OdW1iZXIgdG8gYmUgdHVybmVkIGludG8gYSBNZWRpYUVycm9yXG4gICAqIEByZXR1cm4ge01lZGlhRXJyb3J8bnVsbH0gICAgIHdoZW4gZ2V0dGluZ1xuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9ICAgICAgICAgICAgICB3aGVuIHNldHRpbmdcbiAgICogQG1ldGhvZCBlcnJvclxuICAgKi9cbiAgZXJyb3IoZXJyKSB7XG4gICAgaWYgKGVyciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcnJvcl8gfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvLyByZXN0b3JpbmcgdG8gZGVmYXVsdFxuICAgIGlmIChlcnIgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuZXJyb3JfID0gZXJyO1xuICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLWVycm9yJyk7XG4gICAgICB0aGlzLmVycm9yRGlzcGxheS5jbG9zZSgpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gZXJyb3IgaW5zdGFuY2VcbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgTWVkaWFFcnJvcikge1xuICAgICAgdGhpcy5lcnJvcl8gPSBlcnI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3JfID0gbmV3IE1lZGlhRXJyb3IoZXJyKTtcbiAgICB9XG5cbiAgICAvLyBhZGQgdGhlIHZqcy1lcnJvciBjbGFzc25hbWUgdG8gdGhlIHBsYXllclxuICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1lcnJvcicpO1xuXG4gICAgLy8gbG9nIHRoZSBuYW1lIG9mIHRoZSBlcnJvciB0eXBlIGFuZCBhbnkgbWVzc2FnZVxuICAgIC8vIGllOCBqdXN0IGxvZ3MgXCJbb2JqZWN0IG9iamVjdF1cIiBpZiB5b3UganVzdCBsb2cgdGhlIGVycm9yIG9iamVjdFxuICAgIGxvZy5lcnJvcihgKENPREU6JHt0aGlzLmVycm9yXy5jb2RlfSAke01lZGlhRXJyb3IuZXJyb3JUeXBlc1t0aGlzLmVycm9yXy5jb2RlXX0pYCwgdGhpcy5lcnJvcl8ubWVzc2FnZSwgdGhpcy5lcnJvcl8pO1xuXG4gICAgLy8gZmlyZSBhbiBlcnJvciBldmVudCBvbiB0aGUgcGxheWVyXG4gICAgdGhpcy50cmlnZ2VyKCdlcnJvcicpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcGxheWVyIGlzIGluIHRoZSBcImVuZGVkXCIgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBsYXllciBpcyBpbiB0aGUgZW5kZWQgc3RhdGUsIGZhbHNlIGlmIG5vdC5cbiAgICogQG1ldGhvZCBlbmRlZFxuICAgKi9cbiAgZW5kZWQoKSB7IHJldHVybiB0aGlzLnRlY2hHZXRfKCdlbmRlZCcpOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHBsYXllciBpcyBpbiB0aGUgXCJzZWVraW5nXCIgc3RhdGUuXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgdGhlIHBsYXllciBpcyBpbiB0aGUgc2Vla2luZyBzdGF0ZSwgZmFsc2UgaWYgbm90LlxuICAgKiBAbWV0aG9kIHNlZWtpbmdcbiAgICovXG4gIHNlZWtpbmcoKSB7IHJldHVybiB0aGlzLnRlY2hHZXRfKCdzZWVraW5nJyk7IH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgVGltZVJhbmdlcyBvZiB0aGUgbWVkaWEgdGhhdCBhcmUgY3VycmVudGx5IGF2YWlsYWJsZVxuICAgKiBmb3Igc2Vla2luZyB0by5cbiAgICpcbiAgICogQHJldHVybiB7VGltZVJhbmdlc30gdGhlIHNlZWthYmxlIGludGVydmFscyBvZiB0aGUgbWVkaWEgdGltZWxpbmVcbiAgICogQG1ldGhvZCBzZWVrYWJsZVxuICAgKi9cbiAgc2Vla2FibGUoKSB7IHJldHVybiB0aGlzLnRlY2hHZXRfKCdzZWVrYWJsZScpOyB9XG5cbiAgLyoqXG4gICAqIFJlcG9ydCB1c2VyIGFjdGl2aXR5XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICogQG1ldGhvZCByZXBvcnRVc2VyQWN0aXZpdHlcbiAgICovXG4gIHJlcG9ydFVzZXJBY3Rpdml0eShldmVudCkge1xuICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogR2V0L3NldCBpZiB1c2VyIGlzIGFjdGl2ZVxuICAgKlxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IGJvb2wgVmFsdWUgd2hlbiBzZXR0aW5nXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IFZhbHVlIGlmIHVzZXIgaXMgYWN0aXZlIHVzZXIgd2hlbiBnZXR0aW5nXG4gICAqIEBtZXRob2QgdXNlckFjdGl2ZVxuICAgKi9cbiAgdXNlckFjdGl2ZShib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYm9vbCA9ICEhYm9vbDtcbiAgICAgIGlmIChib29sICE9PSB0aGlzLnVzZXJBY3RpdmVfKSB7XG4gICAgICAgIHRoaXMudXNlckFjdGl2ZV8gPSBib29sO1xuICAgICAgICBpZiAoYm9vbCkge1xuICAgICAgICAgIC8vIElmIHRoZSB1c2VyIHdhcyBpbmFjdGl2ZSBhbmQgaXMgbm93IGFjdGl2ZSB3ZSB3YW50IHRvIHJlc2V0IHRoZVxuICAgICAgICAgIC8vIGluYWN0aXZpdHkgdGltZXJcbiAgICAgICAgICB0aGlzLnVzZXJBY3Rpdml0eV8gPSB0cnVlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ3Zqcy11c2VyLWluYWN0aXZlJyk7XG4gICAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzZXItYWN0aXZlJyk7XG4gICAgICAgICAgdGhpcy50cmlnZ2VyKCd1c2VyYWN0aXZlJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2UncmUgc3dpdGNoaW5nIHRoZSBzdGF0ZSB0byBpbmFjdGl2ZSBtYW51YWxseSwgc28gZXJhc2UgYW55IG90aGVyXG4gICAgICAgICAgLy8gYWN0aXZpdHlcbiAgICAgICAgICB0aGlzLnVzZXJBY3Rpdml0eV8gPSBmYWxzZTtcblxuICAgICAgICAgIC8vIENocm9tZS9TYWZhcmkvSUUgaGF2ZSBidWdzIHdoZXJlIHdoZW4geW91IGNoYW5nZSB0aGUgY3Vyc29yIGl0IGNhblxuICAgICAgICAgIC8vIHRyaWdnZXIgYSBtb3VzZW1vdmUgZXZlbnQuIFRoaXMgY2F1c2VzIGFuIGlzc3VlIHdoZW4geW91J3JlIGhpZGluZ1xuICAgICAgICAgIC8vIHRoZSBjdXJzb3Igd2hlbiB0aGUgdXNlciBpcyBpbmFjdGl2ZSwgYW5kIGEgbW91c2Vtb3ZlIHNpZ25hbHMgdXNlclxuICAgICAgICAgIC8vIGFjdGl2aXR5LiBNYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBnbyBpbnRvIGluYWN0aXZlIG1vZGUuIFNwZWNpZmljYWxseVxuICAgICAgICAgIC8vIHRoaXMgaGFwcGVucyBpbiBmdWxsc2NyZWVuIHdoZW4gd2UgcmVhbGx5IG5lZWQgdG8gaGlkZSB0aGUgY3Vyc29yLlxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy8gV2hlbiB0aGlzIGdldHMgcmVzb2x2ZWQgaW4gQUxMIGJyb3dzZXJzIGl0IGNhbiBiZSByZW1vdmVkXG4gICAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwMzA0MVxuICAgICAgICAgIGlmKHRoaXMudGVjaF8pIHtcbiAgICAgICAgICAgIHRoaXMudGVjaF8ub25lKCdtb3VzZW1vdmUnLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXVzZXItYWN0aXZlJyk7XG4gICAgICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXVzZXItaW5hY3RpdmUnKTtcbiAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3VzZXJpbmFjdGl2ZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXNlckFjdGl2ZV87XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIGZvciB1c2VyIGFjdGl2aXR5IGJhc2VkIG9uIHRpbWVvdXQgdmFsdWVcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQG1ldGhvZCBsaXN0ZW5Gb3JVc2VyQWN0aXZpdHlfXG4gICAqL1xuICBsaXN0ZW5Gb3JVc2VyQWN0aXZpdHlfKCkge1xuICAgIGxldCBtb3VzZUluUHJvZ3Jlc3MsIGxhc3RNb3ZlWCwgbGFzdE1vdmVZO1xuXG4gICAgbGV0IGhhbmRsZUFjdGl2aXR5ID0gRm4uYmluZCh0aGlzLCB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eSk7XG5cbiAgICBsZXQgaGFuZGxlTW91c2VNb3ZlID0gZnVuY3Rpb24oZSkge1xuICAgICAgLy8gIzEwNjggLSBQcmV2ZW50IG1vdXNlbW92ZSBzcGFtbWluZ1xuICAgICAgLy8gQ2hyb21lIEJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM2Njk3MFxuICAgICAgaWYoZS5zY3JlZW5YICE9PSBsYXN0TW92ZVggfHwgZS5zY3JlZW5ZICE9PSBsYXN0TW92ZVkpIHtcbiAgICAgICAgbGFzdE1vdmVYID0gZS5zY3JlZW5YO1xuICAgICAgICBsYXN0TW92ZVkgPSBlLnNjcmVlblk7XG4gICAgICAgIGhhbmRsZUFjdGl2aXR5KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGxldCBoYW5kbGVNb3VzZURvd24gPSBmdW5jdGlvbigpIHtcbiAgICAgIGhhbmRsZUFjdGl2aXR5KCk7XG4gICAgICAvLyBGb3IgYXMgbG9uZyBhcyB0aGUgdGhleSBhcmUgdG91Y2hpbmcgdGhlIGRldmljZSBvciBoYXZlIHRoZWlyIG1vdXNlIGRvd24sXG4gICAgICAvLyB3ZSBjb25zaWRlciB0aGVtIGFjdGl2ZSBldmVuIGlmIHRoZXkncmUgbm90IG1vdmluZyB0aGVpciBmaW5nZXIgb3IgbW91c2UuXG4gICAgICAvLyBTbyB3ZSB3YW50IHRvIGNvbnRpbnVlIHRvIHVwZGF0ZSB0aGF0IHRoZXkgYXJlIGFjdGl2ZVxuICAgICAgdGhpcy5jbGVhckludGVydmFsKG1vdXNlSW5Qcm9ncmVzcyk7XG4gICAgICAvLyBTZXR0aW5nIHVzZXJBY3Rpdml0eT10cnVlIG5vdyBhbmQgc2V0dGluZyB0aGUgaW50ZXJ2YWwgdG8gdGhlIHNhbWUgdGltZVxuICAgICAgLy8gYXMgdGhlIGFjdGl2aXR5Q2hlY2sgaW50ZXJ2YWwgKDI1MCkgc2hvdWxkIGVuc3VyZSB3ZSBuZXZlciBtaXNzIHRoZVxuICAgICAgLy8gbmV4dCBhY3Rpdml0eUNoZWNrXG4gICAgICBtb3VzZUluUHJvZ3Jlc3MgPSB0aGlzLnNldEludGVydmFsKGhhbmRsZUFjdGl2aXR5LCAyNTApO1xuICAgIH07XG5cbiAgICBsZXQgaGFuZGxlTW91c2VVcCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICBoYW5kbGVBY3Rpdml0eSgpO1xuICAgICAgLy8gU3RvcCB0aGUgaW50ZXJ2YWwgdGhhdCBtYWludGFpbnMgYWN0aXZpdHkgaWYgdGhlIG1vdXNlL3RvdWNoIGlzIGRvd25cbiAgICAgIHRoaXMuY2xlYXJJbnRlcnZhbChtb3VzZUluUHJvZ3Jlc3MpO1xuICAgIH07XG5cbiAgICAvLyBBbnkgbW91c2UgbW92ZW1lbnQgd2lsbCBiZSBjb25zaWRlcmVkIHVzZXIgYWN0aXZpdHlcbiAgICB0aGlzLm9uKCdtb3VzZWRvd24nLCBoYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ21vdXNlbW92ZScsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vbignbW91c2V1cCcsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgLy8gTGlzdGVuIGZvciBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgLy8gU2hvdWxkbid0IG5lZWQgdG8gdXNlIGluUHJvZ3Jlc3MgaW50ZXJ2YWwgYmVjYXVzZSBvZiBrZXkgcmVwZWF0XG4gICAgdGhpcy5vbigna2V5ZG93bicsIGhhbmRsZUFjdGl2aXR5KTtcbiAgICB0aGlzLm9uKCdrZXl1cCcsIGhhbmRsZUFjdGl2aXR5KTtcblxuICAgIC8vIFJ1biBhbiBpbnRlcnZhbCBldmVyeSAyNTAgbWlsbGlzZWNvbmRzIGluc3RlYWQgb2Ygc3R1ZmZpbmcgZXZlcnl0aGluZyBpbnRvXG4gICAgLy8gdGhlIG1vdXNlbW92ZS90b3VjaG1vdmUgZnVuY3Rpb24gaXRzZWxmLCB0byBwcmV2ZW50IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uLlxuICAgIC8vIGB0aGlzLnJlcG9ydFVzZXJBY3Rpdml0eWAgc2ltcGx5IHNldHMgdGhpcy51c2VyQWN0aXZpdHlfIHRvIHRydWUsIHdoaWNoXG4gICAgLy8gdGhlbiBnZXRzIHBpY2tlZCB1cCBieSB0aGlzIGxvb3BcbiAgICAvLyBodHRwOi8vZWpvaG4ub3JnL2Jsb2cvbGVhcm5pbmctZnJvbS10d2l0dGVyL1xuICAgIGxldCBpbmFjdGl2aXR5VGltZW91dDtcbiAgICBsZXQgYWN0aXZpdHlDaGVjayA9IHRoaXMuc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7XG4gICAgICAvLyBDaGVjayB0byBzZWUgaWYgbW91c2UvdG91Y2ggYWN0aXZpdHkgaGFzIGhhcHBlbmVkXG4gICAgICBpZiAodGhpcy51c2VyQWN0aXZpdHlfKSB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBhY3Rpdml0eSB0cmFja2VyXG4gICAgICAgIHRoaXMudXNlckFjdGl2aXR5XyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIElmIHRoZSB1c2VyIHN0YXRlIHdhcyBpbmFjdGl2ZSwgc2V0IHRoZSBzdGF0ZSB0byBhY3RpdmVcbiAgICAgICAgdGhpcy51c2VyQWN0aXZlKHRydWUpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSBleGlzdGluZyBpbmFjdGl2aXR5IHRpbWVvdXQgdG8gc3RhcnQgdGhlIHRpbWVyIG92ZXJcbiAgICAgICAgdGhpcy5jbGVhclRpbWVvdXQoaW5hY3Rpdml0eVRpbWVvdXQpO1xuXG4gICAgICAgIHZhciB0aW1lb3V0ID0gdGhpcy5vcHRpb25zX1snaW5hY3Rpdml0eVRpbWVvdXQnXTtcbiAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7XG4gICAgICAgICAgLy8gSW4gPHRpbWVvdXQ+IG1pbGxpc2Vjb25kcywgaWYgbm8gbW9yZSBhY3Rpdml0eSBoYXMgb2NjdXJyZWQgdGhlXG4gICAgICAgICAgLy8gdXNlciB3aWxsIGJlIGNvbnNpZGVyZWQgaW5hY3RpdmVcbiAgICAgICAgICBpbmFjdGl2aXR5VGltZW91dCA9IHRoaXMuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAvLyBQcm90ZWN0IGFnYWluc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIGluYWN0aXZpdHlUaW1lb3V0IGNhbiB0cmlnZ2VyIGp1c3RcbiAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCB1c2VyIGFjdGl2aXR5IGlzIHBpY2tlZCB1cCBieSB0aGUgYWN0aXZpdHlDaGVjayBsb29wXG4gICAgICAgICAgICAvLyBjYXVzaW5nIGEgZmxpY2tlclxuICAgICAgICAgICAgaWYgKCF0aGlzLnVzZXJBY3Rpdml0eV8pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJBY3RpdmUoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIHRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgMjUwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZS4gIEEgcGxheWJhY2sgcmF0ZSBvZlxuICAgKiAxLjAgcmVwcmVzZW50cyBub3JtYWwgc3BlZWQgYW5kIDAuNSB3b3VsZCBpbmRpY2F0ZSBoYWxmLXNwZWVkXG4gICAqIHBsYXliYWNrLCBmb3IgaW5zdGFuY2UuXG4gICAqIEBzZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1tZWRpYS1wbGF5YmFja3JhdGVcbiAgICpcbiAgICogQHBhcmFtICB7TnVtYmVyfSByYXRlICAgIE5ldyBwbGF5YmFjayByYXRlIHRvIHNldC5cbiAgICogQHJldHVybiB7TnVtYmVyfSAgICAgICAgIFJldHVybnMgdGhlIG5ldyBwbGF5YmFjayByYXRlIHdoZW4gc2V0dGluZ1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgUmV0dXJucyB0aGUgY3VycmVudCBwbGF5YmFjayByYXRlIHdoZW4gZ2V0dGluZ1xuICAgKiBAbWV0aG9kIHBsYXliYWNrUmF0ZVxuICAgKi9cbiAgcGxheWJhY2tSYXRlKHJhdGUpIHtcbiAgICBpZiAocmF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnRlY2hDYWxsXygnc2V0UGxheWJhY2tSYXRlJywgcmF0ZSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfWydmZWF0dXJlc1BsYXliYWNrUmF0ZSddKSB7XG4gICAgICByZXR1cm4gdGhpcy50ZWNoR2V0XygncGxheWJhY2tSYXRlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAxLjA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0aGUgYXVkaW8gZmxhZ1xuICAgKlxuICAgKiBAcGFyYW0gIHtCb29sZWFufSBib29sICAgIFRydWUgc2lnbmFscyB0aGF0IHRoaXMgaXMgYW4gYXVkaW8gcGxheWVyLlxuICAgKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIFJldHVybnMgdHJ1ZSBpZiBwbGF5ZXIgaXMgYXVkaW8sIGZhbHNlIGlmIG5vdCB3aGVuIGdldHRpbmdcbiAgICogQHJldHVybiB7UGxheWVyfSAgICAgIFJldHVybnMgdGhlIHBsYXllciBpZiBzZXR0aW5nXG4gICAqIEBwcml2YXRlXG4gICAqIEBtZXRob2QgaXNBdWRpb1xuICAgKi9cbiAgaXNBdWRpbyhib29sKSB7XG4gICAgaWYgKGJvb2wgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5pc0F1ZGlvXyA9ICEhYm9vbDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHJldHVybiAhIXRoaXMuaXNBdWRpb187XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBuZXR3b3JrIGFjdGl2aXR5IGZvciB0aGUgZWxlbWVudCwgZnJvbVxuICAgKiB0aGUgY29kZXMgaW4gdGhlIGxpc3QgYmVsb3cuXG4gICAqIC0gTkVUV09SS19FTVBUWSAobnVtZXJpYyB2YWx1ZSAwKVxuICAgKiAgIFRoZSBlbGVtZW50IGhhcyBub3QgeWV0IGJlZW4gaW5pdGlhbGlzZWQuIEFsbCBhdHRyaWJ1dGVzIGFyZSBpblxuICAgKiAgIHRoZWlyIGluaXRpYWwgc3RhdGVzLlxuICAgKiAtIE5FVFdPUktfSURMRSAobnVtZXJpYyB2YWx1ZSAxKVxuICAgKiAgIFRoZSBlbGVtZW50J3MgcmVzb3VyY2Ugc2VsZWN0aW9uIGFsZ29yaXRobSBpcyBhY3RpdmUgYW5kIGhhc1xuICAgKiAgIHNlbGVjdGVkIGEgcmVzb3VyY2UsIGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgdXNpbmcgdGhlIG5ldHdvcmsgYXRcbiAgICogICB0aGlzIHRpbWUuXG4gICAqIC0gTkVUV09SS19MT0FESU5HIChudW1lcmljIHZhbHVlIDIpXG4gICAqICAgVGhlIHVzZXIgYWdlbnQgaXMgYWN0aXZlbHkgdHJ5aW5nIHRvIGRvd25sb2FkIGRhdGEuXG4gICAqIC0gTkVUV09SS19OT19TT1VSQ0UgKG51bWVyaWMgdmFsdWUgMylcbiAgICogICBUaGUgZWxlbWVudCdzIHJlc291cmNlIHNlbGVjdGlvbiBhbGdvcml0aG0gaXMgYWN0aXZlLCBidXQgaXQgaGFzXG4gICAqICAgbm90IHlldCBmb3VuZCBhIHJlc291cmNlIHRvIHVzZS5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjbmV0d29yay1zdGF0ZXNcbiAgICogQHJldHVybiB7TnVtYmVyfSB0aGUgY3VycmVudCBuZXR3b3JrIGFjdGl2aXR5IHN0YXRlXG4gICAqIEBtZXRob2QgbmV0d29ya1N0YXRlXG4gICAqL1xuICBuZXR3b3JrU3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ25ldHdvcmtTdGF0ZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGV4cHJlc3NlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZWxlbWVudFxuICAgKiB3aXRoIHJlc3BlY3QgdG8gcmVuZGVyaW5nIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLCBmcm9tIHRoZVxuICAgKiBjb2RlcyBpbiB0aGUgbGlzdCBiZWxvdy5cbiAgICogLSBIQVZFX05PVEhJTkcgKG51bWVyaWMgdmFsdWUgMClcbiAgICogICBObyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG1lZGlhIHJlc291cmNlIGlzIGF2YWlsYWJsZS5cbiAgICogLSBIQVZFX01FVEFEQVRBIChudW1lcmljIHZhbHVlIDEpXG4gICAqICAgRW5vdWdoIG9mIHRoZSByZXNvdXJjZSBoYXMgYmVlbiBvYnRhaW5lZCB0aGF0IHRoZSBkdXJhdGlvbiBvZiB0aGVcbiAgICogICByZXNvdXJjZSBpcyBhdmFpbGFibGUuXG4gICAqIC0gSEFWRV9DVVJSRU5UX0RBVEEgKG51bWVyaWMgdmFsdWUgMilcbiAgICogICBEYXRhIGZvciB0aGUgaW1tZWRpYXRlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYXZhaWxhYmxlLlxuICAgKiAtIEhBVkVfRlVUVVJFX0RBVEEgKG51bWVyaWMgdmFsdWUgMylcbiAgICogICBEYXRhIGZvciB0aGUgaW1tZWRpYXRlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYXZhaWxhYmxlLCBhc1xuICAgKiAgIHdlbGwgYXMgZW5vdWdoIGRhdGEgZm9yIHRoZSB1c2VyIGFnZW50IHRvIGFkdmFuY2UgdGhlIGN1cnJlbnRcbiAgICogICBwbGF5YmFjayBwb3NpdGlvbiBpbiB0aGUgZGlyZWN0aW9uIG9mIHBsYXliYWNrLlxuICAgKiAtIEhBVkVfRU5PVUdIX0RBVEEgKG51bWVyaWMgdmFsdWUgNClcbiAgICogICBUaGUgdXNlciBhZ2VudCBlc3RpbWF0ZXMgdGhhdCBlbm91Z2ggZGF0YSBpcyBhdmFpbGFibGUgZm9yXG4gICAqICAgcGxheWJhY2sgdG8gcHJvY2VlZCB1bmludGVycnVwdGVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tbWVkaWEtcmVhZHlzdGF0ZVxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjdXJyZW50IHBsYXliYWNrIHJlbmRlcmluZyBzdGF0ZVxuICAgKiBAbWV0aG9kIHJlYWR5U3RhdGVcbiAgICovXG4gIHJlYWR5U3RhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaEdldF8oJ3JlYWR5U3RhdGUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSB2aWRlbyB0cmFjayBsaXN0XG4gICAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN2aWRlb3RyYWNrbGlzdFxuICAgKlxuICAgKiBAcmV0dXJuIHtWaWRlb1RyYWNrTGlzdH0gdGhlcyBjdXJyZW50IHZpZGVvIHRyYWNrIGxpc3RcbiAgICogQG1ldGhvZCB2aWRlb1RyYWNrc1xuICAgKi9cbiAgdmlkZW9UcmFja3MoKSB7XG4gICAgLy8gaWYgd2UgaGF2ZSBub3QgeWV0IGxvYWRUZWNoXywgd2UgY3JlYXRlIHZpZGVvVHJhY2tzX1xuICAgIC8vIHRoZXNlIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSB0ZWNoIGR1cmluZyBsb2FkaW5nXG4gICAgaWYgKCF0aGlzLnRlY2hfKSB7XG4gICAgICB0aGlzLnZpZGVvVHJhY2tzXyA9IHRoaXMudmlkZW9UcmFja3NfIHx8IG5ldyBWaWRlb1RyYWNrTGlzdCgpO1xuICAgICAgcmV0dXJuIHRoaXMudmlkZW9UcmFja3NfO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnRlY2hfLnZpZGVvVHJhY2tzKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGF1ZGlvIHRyYWNrIGxpc3RcbiAgICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0XG4gICAqXG4gICAqIEByZXR1cm4ge0F1ZGlvVHJhY2tMaXN0fSB0aGVzIGN1cnJlbnQgYXVkaW8gdHJhY2sgbGlzdFxuICAgKiBAbWV0aG9kIGF1ZGlvVHJhY2tzXG4gICAqL1xuICBhdWRpb1RyYWNrcygpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIG5vdCB5ZXQgbG9hZFRlY2hfLCB3ZSBjcmVhdGUgdmlkZW9UcmFja3NfXG4gICAgLy8gdGhlc2Ugd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHRlY2ggZHVyaW5nIGxvYWRpbmdcbiAgICBpZiAoIXRoaXMudGVjaF8pIHtcbiAgICAgIHRoaXMuYXVkaW9UcmFja3NfID0gdGhpcy5hdWRpb1RyYWNrc18gfHwgbmV3IEF1ZGlvVHJhY2tMaXN0KCk7XG4gICAgICByZXR1cm4gdGhpcy5hdWRpb1RyYWNrc187XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudGVjaF8uYXVkaW9UcmFja3MoKTtcbiAgfVxuXG4gIC8qXG4gICAgKiBUZXh0IHRyYWNrcyBhcmUgdHJhY2tzIG9mIHRpbWVkIHRleHQgZXZlbnRzLlxuICAgICogQ2FwdGlvbnMgLSB0ZXh0IGRpc3BsYXllZCBvdmVyIHRoZSB2aWRlbyBmb3IgdGhlIGhlYXJpbmcgaW1wYWlyZWRcbiAgICAqIFN1YnRpdGxlcyAtIHRleHQgZGlzcGxheWVkIG92ZXIgdGhlIHZpZGVvIGZvciB0aG9zZSB3aG8gZG9uJ3QgdW5kZXJzdGFuZCBsYW5ndWFnZSBpbiB0aGUgdmlkZW9cbiAgICAqIENoYXB0ZXJzIC0gdGV4dCBkaXNwbGF5ZWQgaW4gYSBtZW51IGFsbG93aW5nIHRoZSB1c2VyIHRvIGp1bXAgdG8gcGFydGljdWxhciBwb2ludHMgKGNoYXB0ZXJzKSBpbiB0aGUgdmlkZW9cbiAgICAqIERlc2NyaXB0aW9ucyAobm90IHN1cHBvcnRlZCB5ZXQpIC0gYXVkaW8gZGVzY3JpcHRpb25zIHRoYXQgYXJlIHJlYWQgYmFjayB0byB0aGUgdXNlciBieSBhIHNjcmVlbiByZWFkaW5nIGRldmljZVxuICAgICovXG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiBhc3NvY2lhdGVkIHRleHQgdHJhY2tzLiBjYXB0aW9ucywgc3VidGl0bGVzLCBjaGFwdGVycywgZGVzY3JpcHRpb25zXG4gICAqIGh0dHA6Ly93d3cudzMub3JnL2h0bWwvd2cvZHJhZnRzL2h0bWwvbWFzdGVyL2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI2RvbS1tZWRpYS10ZXh0dHJhY2tzXG4gICAqXG4gICAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgQXJyYXkgb2YgdHJhY2sgb2JqZWN0c1xuICAgKiBAbWV0aG9kIHRleHRUcmFja3NcbiAgICovXG4gIHRleHRUcmFja3MoKSB7XG4gICAgLy8gY2Fubm90IHVzZSB0ZWNoR2V0XyBkaXJlY3RseSBiZWNhdXNlIGl0IGNoZWNrcyB0byBzZWUgd2hldGhlciB0aGUgdGVjaCBpcyByZWFkeS5cbiAgICAvLyBGbGFzaCBpcyB1bmxpa2VseSB0byBiZSByZWFkeSBpbiB0aW1lIGJ1dCB0ZXh0VHJhY2tzIHNob3VsZCBzdGlsbCB3b3JrLlxuICAgIHJldHVybiB0aGlzLnRlY2hfICYmIHRoaXMudGVjaF9bJ3RleHRUcmFja3MnXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBhcnJheSBvZiByZW1vdGUgdGV4dCB0cmFja3NcbiAgICpcbiAgICogQHJldHVybiB7QXJyYXl9XG4gICAqIEBtZXRob2QgcmVtb3RlVGV4dFRyYWNrc1xuICAgKi9cbiAgcmVtb3RlVGV4dFRyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfWydyZW1vdGVUZXh0VHJhY2tzJ10oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYXJyYXkgb2YgcmVtb3RlIGh0bWwgdHJhY2sgZWxlbWVudHNcbiAgICpcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudFtdfVxuICAgKiBAbWV0aG9kIHJlbW90ZVRleHRUcmFja0Vsc1xuICAgKi9cbiAgcmVtb3RlVGV4dFRyYWNrRWxzKCkge1xuICAgIHJldHVybiB0aGlzLnRlY2hfICYmIHRoaXMudGVjaF9bJ3JlbW90ZVRleHRUcmFja0VscyddKCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgdGV4dCB0cmFja1xuICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgVzNDIHNldHRpbmdzIHdlIGFsbG93IGFkZGluZyBhZGRpdGlvbmFsIGluZm8gdGhyb3VnaCBvcHRpb25zLlxuICAgKiBodHRwOi8vd3d3LnczLm9yZy9odG1sL3dnL2RyYWZ0cy9odG1sL21hc3Rlci9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNkb20tbWVkaWEtYWRkdGV4dHRyYWNrXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSAga2luZCAgICAgICAgQ2FwdGlvbnMsIHN1YnRpdGxlcywgY2hhcHRlcnMsIGRlc2NyaXB0aW9ucywgb3IgbWV0YWRhdGFcbiAgICogQHBhcmFtIHtTdHJpbmc9fSBsYWJlbCAgICAgICBPcHRpb25hbCBsYWJlbFxuICAgKiBAcGFyYW0ge1N0cmluZz19IGxhbmd1YWdlICAgIE9wdGlvbmFsIGxhbmd1YWdlXG4gICAqIEBtZXRob2QgYWRkVGV4dFRyYWNrXG4gICAqL1xuICBhZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoX1snYWRkVGV4dFRyYWNrJ10oa2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZW1vdGUgdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAgICBPcHRpb25zIGZvciByZW1vdGUgdGV4dCB0cmFja1xuICAgKiBAbWV0aG9kIGFkZFJlbW90ZVRleHRUcmFja1xuICAgKi9cbiAgYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfWydhZGRSZW1vdGVUZXh0VHJhY2snXShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByZW1vdGUgdGV4dCB0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gdHJhY2sgICAgUmVtb3RlIHRleHQgdHJhY2sgdG8gcmVtb3ZlXG4gICAqIEBtZXRob2QgcmVtb3ZlUmVtb3RlVGV4dFRyYWNrXG4gICAqL1xuICAvLyBkZXN0cnVjdHVyZSB0aGUgaW5wdXQgaW50byBhbiBvYmplY3Qgd2l0aCBhIHRyYWNrIGFyZ3VtZW50LCBkZWZhdWx0aW5nIHRvIGFyZ3VtZW50c1swXVxuICAvLyBkZWZhdWx0IHRoZSB3aG9sZSBhcmd1bWVudCB0byBhbiBlbXB0eSBvYmplY3QgaWYgbm90aGluZyB3YXMgcGFzc2VkIGluXG4gIHJlbW92ZVJlbW90ZVRleHRUcmFjayh7dHJhY2sgPSBhcmd1bWVudHNbMF19ID0ge30pIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgdGhpcy50ZWNoXyAmJiB0aGlzLnRlY2hfWydyZW1vdmVSZW1vdGVUZXh0VHJhY2snXSh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHZpZGVvIHdpZHRoXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn0gVmlkZW8gd2lkdGhcbiAgICogQG1ldGhvZCB2aWRlb1dpZHRoXG4gICAqL1xuICB2aWRlb1dpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLnRlY2hfICYmIHRoaXMudGVjaF8udmlkZW9XaWR0aCAmJiB0aGlzLnRlY2hfLnZpZGVvV2lkdGgoKSB8fCAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aWRlbyBoZWlnaHRcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfSBWaWRlbyBoZWlnaHRcbiAgICogQG1ldGhvZCB2aWRlb0hlaWdodFxuICAgKi9cbiAgdmlkZW9IZWlnaHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGVjaF8gJiYgdGhpcy50ZWNoXy52aWRlb0hlaWdodCAmJiB0aGlzLnRlY2hfLnZpZGVvSGVpZ2h0KCkgfHwgMDtcbiAgfVxuXG4gIC8vIE1ldGhvZHMgdG8gYWRkIHN1cHBvcnQgZm9yXG4gIC8vIGluaXRpYWxUaW1lOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ2luaXRpYWxUaW1lJyk7IH0sXG4gIC8vIHN0YXJ0T2Zmc2V0VGltZTogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXMudGVjaENhbGxfKCdzdGFydE9mZnNldFRpbWUnKTsgfSxcbiAgLy8gcGxheWVkOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ3BsYXllZCcpOyB9LFxuICAvLyBkZWZhdWx0UGxheWJhY2tSYXRlOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ2RlZmF1bHRQbGF5YmFja1JhdGUnKTsgfSxcbiAgLy8gZGVmYXVsdE11dGVkOiBmdW5jdGlvbigpeyByZXR1cm4gdGhpcy50ZWNoQ2FsbF8oJ2RlZmF1bHRNdXRlZCcpOyB9XG5cbiAgLyoqXG4gICAqIFRoZSBwbGF5ZXIncyBsYW5ndWFnZSBjb2RlXG4gICAqIE5PVEU6IFRoZSBsYW5ndWFnZSBzaG91bGQgYmUgc2V0IGluIHRoZSBwbGF5ZXIgb3B0aW9ucyBpZiB5b3Ugd2FudCB0aGVcbiAgICogdGhlIGNvbnRyb2xzIHRvIGJlIGJ1aWx0IHdpdGggYSBzcGVjaWZpYyBsYW5ndWFnZS4gQ2hhbmdpbmcgdGhlIGxhbnVnYWdlXG4gICAqIGxhdGVyIHdpbGwgbm90IHVwZGF0ZSBjb250cm9scyB0ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gY29kZSAgVGhlIGxvY2FsZSBzdHJpbmdcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgIFRoZSBsb2NhbGUgc3RyaW5nIHdoZW4gZ2V0dGluZ1xuICAgKiBAcmV0dXJuIHtQbGF5ZXJ9ICAgICAgc2VsZiB3aGVuIHNldHRpbmdcbiAgICogQG1ldGhvZCBsYW5ndWFnZVxuICAgKi9cbiAgbGFuZ3VhZ2UoY29kZSkge1xuICAgIGlmIChjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd1YWdlXztcbiAgICB9XG5cbiAgICB0aGlzLmxhbmd1YWdlXyA9ICgnJytjb2RlKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGxheWVyJ3MgbGFuZ3VhZ2UgZGljdGlvbmFyeVxuICAgKiBNZXJnZSBldmVyeSB0aW1lLCBiZWNhdXNlIGEgbmV3bHkgYWRkZWQgcGx1Z2luIG1pZ2h0IGNhbGwgdmlkZW9qcy5hZGRMYW5ndWFnZSgpIGF0IGFueSB0aW1lXG4gICAqIExhbmd1YWdlcyBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlIHBsYXllciBvcHRpb25zIGhhdmUgcHJlY2VkZW5jZVxuICAgKlxuICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgbGFuZ3VhZ2VzXG4gICAqIEBtZXRob2QgbGFuZ3VhZ2VzXG4gICAqL1xuICBsYW5ndWFnZXMoKSB7XG4gICAgcmV0dXJuICBtZXJnZU9wdGlvbnMoUGxheWVyLnByb3RvdHlwZS5vcHRpb25zXy5sYW5ndWFnZXMsIHRoaXMubGFuZ3VhZ2VzXyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgdHJhY2sgaW5mbyB0byBKU09OXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH0gSlNPTiBvYmplY3Qgb2Ygb3B0aW9uc1xuICAgKiBAbWV0aG9kIHRvSlNPTlxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIGxldCBvcHRpb25zID0gbWVyZ2VPcHRpb25zKHRoaXMub3B0aW9uc18pO1xuICAgIGxldCB0cmFja3MgPSBvcHRpb25zLnRyYWNrcztcblxuICAgIG9wdGlvbnMudHJhY2tzID0gW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuXG4gICAgICAvLyBkZWVwIG1lcmdlIHRyYWNrcyBhbmQgbnVsbCBvdXQgcGxheWVyIHNvIG5vIGNpcmN1bGFyIHJlZmVyZW5jZXNcbiAgICAgIHRyYWNrID0gbWVyZ2VPcHRpb25zKHRyYWNrKTtcbiAgICAgIHRyYWNrLnBsYXllciA9IHVuZGVmaW5lZDtcbiAgICAgIG9wdGlvbnMudHJhY2tzW2ldID0gdHJhY2s7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHNpbXBsZSBtb2RhbCBkaWFsb2cgKGFuIGluc3RhbmNlIG9mIHRoZSBgTW9kYWxEaWFsb2dgXG4gICAqIGNvbXBvbmVudCkgdGhhdCBpbW1lZGlhdGVseSBvdmVybGF5cyB0aGUgcGxheWVyIHdpdGggYXJiaXRyYXJ5XG4gICAqIGNvbnRlbnQgYW5kIHJlbW92ZXMgaXRzZWxmIHdoZW4gY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbnxFbGVtZW50fEFycmF5fE51bGx9IGNvbnRlbnRcbiAgICogICAgICAgIFNhbWUgYXMgYE1vZGFsRGlhbG9nI2NvbnRlbnRgJ3MgcGFyYW0gb2YgdGhlIHNhbWUgbmFtZS5cbiAgICpcbiAgICogICAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0LWZvcndhcmQgdXNhZ2UgaXMgdG8gcHJvdmlkZSBhIHN0cmluZyBvciBET01cbiAgICogICAgICAgIGVsZW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogICAgICAgIEV4dHJhIG9wdGlvbnMgd2hpY2ggd2lsbCBiZSBwYXNzZWQgb24gdG8gdGhlIGBNb2RhbERpYWxvZ2AuXG4gICAqXG4gICAqIEByZXR1cm4ge01vZGFsRGlhbG9nfVxuICAgKi9cbiAgY3JlYXRlTW9kYWwoY29udGVudCwgb3B0aW9ucykge1xuICAgIGxldCBwbGF5ZXIgPSB0aGlzO1xuXG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgb3B0aW9ucy5jb250ZW50ID0gY29udGVudCB8fCAnJztcblxuICAgIGxldCBtb2RhbCA9IG5ldyBNb2RhbERpYWxvZyhwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgcGxheWVyLmFkZENoaWxkKG1vZGFsKTtcbiAgICBtb2RhbC5vbignZGlzcG9zZScsIGZ1bmN0aW9uKCkge1xuICAgICAgcGxheWVyLnJlbW92ZUNoaWxkKG1vZGFsKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBtb2RhbC5vcGVuKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0YWcgc2V0dGluZ3NcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSB0YWcgVGhlIHBsYXllciB0YWdcbiAgICogQHJldHVybiB7QXJyYXl9IEFuIGFycmF5IG9mIHNvdXJjZXMgYW5kIHRyYWNrIG9iamVjdHNcbiAgICogQHN0YXRpY1xuICAgKiBAbWV0aG9kIGdldFRhZ1NldHRpbmdzXG4gICAqL1xuICBzdGF0aWMgZ2V0VGFnU2V0dGluZ3ModGFnKSB7XG4gICAgbGV0IGJhc2VPcHRpb25zID0ge1xuICAgICAgJ3NvdXJjZXMnOiBbXSxcbiAgICAgICd0cmFja3MnOiBbXVxuICAgIH07XG5cbiAgICBjb25zdCB0YWdPcHRpb25zID0gRG9tLmdldEVsQXR0cmlidXRlcyh0YWcpO1xuICAgIGNvbnN0IGRhdGFTZXR1cCA9IHRhZ09wdGlvbnNbJ2RhdGEtc2V0dXAnXTtcblxuICAgIC8vIENoZWNrIGlmIGRhdGEtc2V0dXAgYXR0ciBleGlzdHMuXG4gICAgaWYgKGRhdGFTZXR1cCAhPT0gbnVsbCl7XG4gICAgICAvLyBQYXJzZSBvcHRpb25zIEpTT05cbiAgICAgIC8vIElmIGVtcHR5IHN0cmluZywgbWFrZSBpdCBhIHBhcnNhYmxlIGpzb24gb2JqZWN0LlxuICAgICAgY29uc3QgW2VyciwgZGF0YV0gPSBzYWZlUGFyc2VUdXBsZShkYXRhU2V0dXAgfHwgJ3t9Jyk7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGxvZy5lcnJvcihlcnIpO1xuICAgICAgfVxuICAgICAgYXNzaWduKHRhZ09wdGlvbnMsIGRhdGEpO1xuICAgIH1cblxuICAgIGFzc2lnbihiYXNlT3B0aW9ucywgdGFnT3B0aW9ucyk7XG5cbiAgICAvLyBHZXQgdGFnIGNoaWxkcmVuIHNldHRpbmdzXG4gICAgaWYgKHRhZy5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGFnLmNoaWxkTm9kZXM7XG5cbiAgICAgIGZvciAobGV0IGk9MCwgaj1jaGlsZHJlbi5sZW5ndGg7IGk8ajsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgICAgIC8vIENoYW5nZSBjYXNlIG5lZWRlZDogaHR0cDovL2Vqb2huLm9yZy9ibG9nL25vZGVuYW1lLWNhc2Utc2Vuc2l0aXZpdHkvXG4gICAgICAgIGNvbnN0IGNoaWxkTmFtZSA9IGNoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjaGlsZE5hbWUgPT09ICdzb3VyY2UnKSB7XG4gICAgICAgICAgYmFzZU9wdGlvbnMuc291cmNlcy5wdXNoKERvbS5nZXRFbEF0dHJpYnV0ZXMoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZE5hbWUgPT09ICd0cmFjaycpIHtcbiAgICAgICAgICBiYXNlT3B0aW9ucy50cmFja3MucHVzaChEb20uZ2V0RWxBdHRyaWJ1dGVzKGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFzZU9wdGlvbnM7XG4gIH1cblxufVxuXG4vKlxuICogR2xvYmFsIHBsYXllciBsaXN0XG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqL1xuUGxheWVyLnBsYXllcnMgPSB7fTtcblxubGV0IG5hdmlnYXRvciA9IHdpbmRvdy5uYXZpZ2F0b3I7XG4vKlxuICogUGxheWVyIGluc3RhbmNlIG9wdGlvbnMsIHN1cmZhY2VkIHVzaW5nIG9wdGlvbnNcbiAqIG9wdGlvbnMgPSBQbGF5ZXIucHJvdG90eXBlLm9wdGlvbnNfXG4gKiBNYWtlIGNoYW5nZXMgaW4gb3B0aW9ucywgbm90IGhlcmUuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cblBsYXllci5wcm90b3R5cGUub3B0aW9uc18gPSB7XG4gIC8vIERlZmF1bHQgb3JkZXIgb2YgZmFsbGJhY2sgdGVjaG5vbG9neVxuICB0ZWNoT3JkZXI6IFsnaHRtbDUnLCdmbGFzaCddLFxuICAvLyB0ZWNoT3JkZXI6IFsnZmxhc2gnLCdodG1sNSddLFxuXG4gIGh0bWw1OiB7fSxcbiAgZmxhc2g6IHt9LFxuXG4gIC8vIGRlZmF1bHRWb2x1bWU6IDAuODUsXG4gIGRlZmF1bHRWb2x1bWU6IDAuMDAsIC8vIFRoZSBmcmVha2luIHNlYWd1bHMgYXJlIGRyaXZpbmcgbWUgY3JhenkhXG5cbiAgLy8gZGVmYXVsdCBpbmFjdGl2aXR5IHRpbWVvdXRcbiAgaW5hY3Rpdml0eVRpbWVvdXQ6IDIwMDAsXG5cbiAgLy8gZGVmYXVsdCBwbGF5YmFjayByYXRlc1xuICBwbGF5YmFja1JhdGVzOiBbXSxcbiAgLy8gQWRkIHBsYXliYWNrIHJhdGUgc2VsZWN0aW9uIGJ5IGFkZGluZyByYXRlc1xuICAvLyAncGxheWJhY2tSYXRlcyc6IFswLjUsIDEsIDEuNSwgMl0sXG5cbiAgLy8gSW5jbHVkZWQgY29udHJvbCBzZXRzXG4gIGNoaWxkcmVuOiBbXG4gICAgJ21lZGlhTG9hZGVyJyxcbiAgICAncG9zdGVySW1hZ2UnLFxuICAgICd0ZXh0VHJhY2tEaXNwbGF5JyxcbiAgICAnbG9hZGluZ1NwaW5uZXInLFxuICAgICdiaWdQbGF5QnV0dG9uJyxcbiAgICAnY29udHJvbEJhcicsXG4gICAgJ2Vycm9yRGlzcGxheScsXG4gICAgJ3RleHRUcmFja1NldHRpbmdzJ1xuICBdLFxuXG4gIGxhbmd1YWdlOiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaHRtbCcpWzBdLmdldEF0dHJpYnV0ZSgnbGFuZycpIHx8IG5hdmlnYXRvci5sYW5ndWFnZXMgJiYgbmF2aWdhdG9yLmxhbmd1YWdlc1swXSB8fCBuYXZpZ2F0b3IudXNlckxhbmd1YWdlIHx8IG5hdmlnYXRvci5sYW5ndWFnZSB8fCAnZW4nLFxuXG4gIC8vIGxvY2FsZXMgYW5kIHRoZWlyIGxhbmd1YWdlIHRyYW5zbGF0aW9uc1xuICBsYW5ndWFnZXM6IHt9LFxuXG4gIC8vIERlZmF1bHQgbWVzc2FnZSB0byBzaG93IHdoZW4gYSB2aWRlbyBjYW5ub3QgYmUgcGxheWVkLlxuICBub3RTdXBwb3J0ZWRNZXNzYWdlOiAnTm8gY29tcGF0aWJsZSBzb3VyY2Ugd2FzIGZvdW5kIGZvciB0aGlzIG1lZGlhLidcbn07XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgcGxheWVyIGhhcyBpbml0aWFsIGR1cmF0aW9uIGFuZCBkaW1lbnNpb24gaW5mb3JtYXRpb25cbiAqXG4gKiBAZXZlbnQgbG9hZGVkbWV0YWRhdGFcbiAqL1xuUGxheWVyLnByb3RvdHlwZS5oYW5kbGVMb2FkZWRNZXRhRGF0YV87XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgcGxheWVyIGhhcyBkb3dubG9hZGVkIGRhdGEgYXQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb25cbiAqXG4gKiBAZXZlbnQgbG9hZGVkZGF0YVxuICovXG5QbGF5ZXIucHJvdG90eXBlLmhhbmRsZUxvYWRlZERhdGFfO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgaXMgYWN0aXZlLCBlLmcuIG1vdmVzIHRoZSBtb3VzZSBvdmVyIHRoZSBwbGF5ZXJcbiAqXG4gKiBAZXZlbnQgdXNlcmFjdGl2ZVxuICovXG5QbGF5ZXIucHJvdG90eXBlLmhhbmRsZVVzZXJBY3RpdmVfO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHVzZXIgaXMgaW5hY3RpdmUsIGUuZy4gYSBzaG9ydCBkZWxheSBhZnRlciB0aGUgbGFzdCBtb3VzZSBtb3ZlIG9yIGNvbnRyb2wgaW50ZXJhY3Rpb25cbiAqXG4gKiBAZXZlbnQgdXNlcmluYWN0aXZlXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFuZGxlVXNlckluYWN0aXZlXztcblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGhhcyBjaGFuZ2VkICpcbiAqIER1cmluZyBwbGF5YmFjayB0aGlzIGlzIGZpcmVkIGV2ZXJ5IDE1LTI1MCBtaWxsaXNlY29uZHMsIGRlcGVuZGluZyBvbiB0aGVcbiAqIHBsYXliYWNrIHRlY2hub2xvZ3kgaW4gdXNlLlxuICpcbiAqIEBldmVudCB0aW1ldXBkYXRlXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFuZGxlVGltZVVwZGF0ZV87XG5cbi8qKlxuICogRmlyZWQgd2hlbiB2aWRlbyBwbGF5YmFjayBlbmRzXG4gKlxuICogQGV2ZW50IGVuZGVkXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFuZGxlVGVjaEVuZGVkXztcblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSB2b2x1bWUgY2hhbmdlc1xuICpcbiAqIEBldmVudCB2b2x1bWVjaGFuZ2VcbiAqL1xuUGxheWVyLnByb3RvdHlwZS5oYW5kbGVWb2x1bWVDaGFuZ2VfO1xuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzXG4gKlxuICogQGV2ZW50IGVycm9yXG4gKi9cblBsYXllci5wcm90b3R5cGUuaGFuZGxlRXJyb3JfO1xuXG5QbGF5ZXIucHJvdG90eXBlLmZsZXhOb3RTdXBwb3J0ZWRfID0gZnVuY3Rpb24oKSB7XG4gIHZhciBlbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaScpO1xuXG4gIC8vIE5vdGU6IFdlIGRvbid0IGFjdHVhbGx5IHVzZSBmbGV4QmFzaXMgKG9yIGZsZXhPcmRlciksIGJ1dCBpdCdzIG9uZSBvZiB0aGUgbW9yZVxuICAvLyBjb21tb24gZmxleCBmZWF0dXJlcyB0aGF0IHdlIGNhbiByZWx5IG9uIHdoZW4gY2hlY2tpbmcgZm9yIGZsZXggc3VwcG9ydC5cbiAgcmV0dXJuICEoJ2ZsZXhCYXNpcycgaW4gZWxlbS5zdHlsZSB8fFxuICAgICAgICAgICd3ZWJraXRGbGV4QmFzaXMnIGluIGVsZW0uc3R5bGUgfHxcbiAgICAgICAgICAnbW96RmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8XG4gICAgICAgICAgJ21zRmxleEJhc2lzJyBpbiBlbGVtLnN0eWxlIHx8XG4gICAgICAgICAgJ21zRmxleE9yZGVyJyBpbiBlbGVtLnN0eWxlIC8qIElFMTAtc3BlY2lmaWMgKDIwMTIgZmxleCBzcGVjKSAgKi8pO1xufTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQbGF5ZXInLCBQbGF5ZXIpO1xuZXhwb3J0IGRlZmF1bHQgUGxheWVyO1xuIl19
},{"./big-play-button.js":62,"./component.js":66,"./control-bar/control-bar.js":69,"./error-display.js":103,"./fullscreen-api.js":106,"./loading-spinner.js":107,"./media-error.js":108,"./modal-dialog":112,"./poster-image.js":117,"./tech/html5.js":122,"./tech/loader.js":123,"./tech/tech.js":124,"./tracks/audio-track-list.js":126,"./tracks/text-track-display.js":131,"./tracks/text-track-list-converter.js":132,"./tracks/text-track-settings.js":134,"./tracks/video-track-list.js":139,"./utils/browser.js":141,"./utils/buffer.js":142,"./utils/dom.js":144,"./utils/events.js":145,"./utils/fn.js":146,"./utils/guid.js":148,"./utils/log.js":149,"./utils/merge-options.js":150,"./utils/stylesheet.js":151,"./utils/time-ranges.js":152,"./utils/to-title-case.js":153,"global/document":7,"global/window":8,"object.assign":53,"safe-json-parse/tuple":57}],114:[function(_dereq_,module,exports){
/**
* @file plugins.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _playerJs = _dereq_('./player.js');
var _playerJs2 = _interopRequireDefault(_playerJs);
/**
* The method for registering a video.js plugin
*
* @param {String} name The name of the plugin
* @param {Function} init The function that is run when the player inits
* @method plugin
*/
var plugin = function plugin(name, init) {
_playerJs2['default'].prototype[name] = init;
};
exports['default'] = plugin;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9wbHVnaW5zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozt3QkFHbUIsYUFBYTs7Ozs7Ozs7Ozs7QUFTaEMsSUFBSSxNQUFNLEdBQUcsU0FBVCxNQUFNLENBQVksSUFBSSxFQUFFLElBQUksRUFBQztBQUMvQix3QkFBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQy9CLENBQUM7O3FCQUVhLE1BQU0iLCJmaWxlIjoic3JjL2pzL3BsdWdpbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHBsdWdpbnMuanNcbiAqL1xuaW1wb3J0IFBsYXllciBmcm9tICcuL3BsYXllci5qcyc7XG5cbi8qKlxuICogVGhlIG1ldGhvZCBmb3IgcmVnaXN0ZXJpbmcgYSB2aWRlby5qcyBwbHVnaW5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHBsdWdpblxuICogQHBhcmFtICB7RnVuY3Rpb259IGluaXQgVGhlIGZ1bmN0aW9uIHRoYXQgaXMgcnVuIHdoZW4gdGhlIHBsYXllciBpbml0c1xuICogQG1ldGhvZCBwbHVnaW5cbiAqL1xudmFyIHBsdWdpbiA9IGZ1bmN0aW9uKG5hbWUsIGluaXQpe1xuICBQbGF5ZXIucHJvdG90eXBlW25hbWVdID0gaW5pdDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHBsdWdpbjtcbiJdfQ==
},{"./player.js":113}],115:[function(_dereq_,module,exports){
/**
* @file popup-button.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _clickableComponentJs = _dereq_('../clickable-component.js');
var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs);
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _popupJs = _dereq_('./popup.js');
var _popupJs2 = _interopRequireDefault(_popupJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* A button class with a popup control
*
* @param {Player|Object} player
* @param {Object=} options
* @extends ClickableComponent
* @class PopupButton
*/
var PopupButton = (function (_ClickableComponent) {
_inherits(PopupButton, _ClickableComponent);
function PopupButton(player) {
var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
_classCallCheck(this, PopupButton);
_ClickableComponent.call(this, player, options);
this.update();
}
/**
* Update popup
*
* @method update
*/
PopupButton.prototype.update = function update() {
var popup = this.createPopup();
if (this.popup) {
this.removeChild(this.popup);
}
this.popup = popup;
this.addChild(popup);
if (this.items && this.items.length === 0) {
this.hide();
} else if (this.items && this.items.length > 1) {
this.show();
}
};
/**
* Create popup - Override with specific functionality for component
*
* @return {Popup} The constructed popup
* @method createPopup
*/
PopupButton.prototype.createPopup = function createPopup() {};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
PopupButton.prototype.createEl = function createEl() {
return _ClickableComponent.prototype.createEl.call(this, 'div', {
className: this.buildCSSClass()
});
};
/**
* Allow sub components to stack CSS class names
*
* @return {String} The constructed class name
* @method buildCSSClass
*/
PopupButton.prototype.buildCSSClass = function buildCSSClass() {
var menuButtonClass = 'vjs-menu-button';
// If the inline option is passed, we want to use different styles altogether.
if (this.options_.inline === true) {
menuButtonClass += '-inline';
} else {
menuButtonClass += '-popup';
}
return 'vjs-menu-button ' + menuButtonClass + ' ' + _ClickableComponent.prototype.buildCSSClass.call(this);
};
/**
* Return handler for the tooltip
*
* @return {Object} Dom element to serve as a handler for the tooltip
* @method tooltipHandler
*/
PopupButton.prototype.tooltipHandler = function tooltipHandler() {
// TODO: Fix popup button to have a real icon element to make it as tooltip handler
return;
};
return PopupButton;
})(_clickableComponentJs2['default']);
_componentJs2['default'].registerComponent('PopupButton', PopupButton);
exports['default'] = PopupButton;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9wb3B1cC9wb3B1cC1idXR0b24uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O29DQUcrQiwyQkFBMkI7Ozs7MkJBQ3BDLGlCQUFpQjs7Ozt1QkFDckIsWUFBWTs7OzswQkFDVCxpQkFBaUI7O0lBQTFCLEdBQUc7O3lCQUNLLGdCQUFnQjs7SUFBeEIsRUFBRTs7a0NBQ1UsMkJBQTJCOzs7Ozs7Ozs7Ozs7O0lBVTdDLFdBQVc7WUFBWCxXQUFXOztBQUVKLFdBRlAsV0FBVyxDQUVILE1BQU0sRUFBYTtRQUFYLE9BQU8seURBQUMsRUFBRTs7MEJBRjFCLFdBQVc7O0FBR2IsbUNBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDOztBQUV2QixRQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7R0FDZjs7Ozs7Ozs7QUFORyxhQUFXLFdBYWYsTUFBTSxHQUFBLGtCQUFHO0FBQ1AsUUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDOztBQUUvQixRQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7QUFDZCxVQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM5Qjs7QUFFRCxRQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNuQixRQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDOztBQUVyQixRQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ3pDLFVBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUM5QyxVQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDYjtHQUNGOzs7Ozs7Ozs7QUE1QkcsYUFBVyxXQW9DZixXQUFXLEdBQUEsdUJBQUcsRUFBRTs7Ozs7Ozs7O0FBcENaLGFBQVcsV0E0Q2YsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsV0FBTyw4QkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDM0IsZUFBUyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUU7S0FDaEMsQ0FBQyxDQUFDO0dBQ0o7Ozs7Ozs7OztBQWhERyxhQUFXLFdBd0RmLGFBQWEsR0FBQSx5QkFBRztBQUNkLFFBQUksZUFBZSxHQUFHLGlCQUFpQixDQUFDOzs7QUFHeEMsUUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUU7QUFDakMscUJBQWUsSUFBSSxTQUFTLENBQUM7S0FDOUIsTUFBTTtBQUNMLHFCQUFlLElBQUksUUFBUSxDQUFDO0tBQzdCOztBQUVELGdDQUEwQixlQUFlLFNBQUksOEJBQU0sYUFBYSxLQUFBLE1BQUUsQ0FBRztHQUN0RTs7Ozs7Ozs7O0FBbkVHLGFBQVcsV0EyRWYsY0FBYyxHQUFBLDBCQUFHOztBQUVmLFdBQU87R0FDUjs7U0E5RUcsV0FBVzs7O0FBaUZqQix5QkFBVSxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7cUJBQ3pDLFdBQVciLCJmaWxlIjoic3JjL2pzL3BvcHVwL3BvcHVwLWJ1dHRvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgcG9wdXAtYnV0dG9uLmpzXG4gKi9cbmltcG9ydCBDbGlja2FibGVDb21wb25lbnQgZnJvbSAnLi4vY2xpY2thYmxlLWNvbXBvbmVudC5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgUG9wdXAgZnJvbSAnLi9wb3B1cC5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uL3V0aWxzL2ZuLmpzJztcbmltcG9ydCB0b1RpdGxlQ2FzZSBmcm9tICcuLi91dGlscy90by10aXRsZS1jYXNlLmpzJztcblxuLyoqXG4gKiBBIGJ1dHRvbiBjbGFzcyB3aXRoIGEgcG9wdXAgY29udHJvbFxuICpcbiAqIEBwYXJhbSB7UGxheWVyfE9iamVjdH0gcGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqIEBleHRlbmRzIENsaWNrYWJsZUNvbXBvbmVudFxuICogQGNsYXNzIFBvcHVwQnV0dG9uXG4gKi9cbmNsYXNzIFBvcHVwQnV0dG9uIGV4dGVuZHMgQ2xpY2thYmxlQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnM9e30pe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBwb3B1cFxuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIGxldCBwb3B1cCA9IHRoaXMuY3JlYXRlUG9wdXAoKTtcblxuICAgIGlmICh0aGlzLnBvcHVwKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMucG9wdXApO1xuICAgIH1cblxuICAgIHRoaXMucG9wdXAgPSBwb3B1cDtcbiAgICB0aGlzLmFkZENoaWxkKHBvcHVwKTtcblxuICAgIGlmICh0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHBvcHVwIC0gT3ZlcnJpZGUgd2l0aCBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IGZvciBjb21wb25lbnRcbiAgICpcbiAgICogQHJldHVybiB7UG9wdXB9IFRoZSBjb25zdHJ1Y3RlZCBwb3B1cFxuICAgKiBAbWV0aG9kIGNyZWF0ZVBvcHVwXG4gICAqL1xuICBjcmVhdGVQb3B1cCgpIHt9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6IHRoaXMuYnVpbGRDU1NDbGFzcygpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3cgc3ViIGNvbXBvbmVudHMgdG8gc3RhY2sgQ1NTIGNsYXNzIG5hbWVzXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ30gVGhlIGNvbnN0cnVjdGVkIGNsYXNzIG5hbWVcbiAgICogQG1ldGhvZCBidWlsZENTU0NsYXNzXG4gICAqL1xuICBidWlsZENTU0NsYXNzKCkge1xuICAgIHZhciBtZW51QnV0dG9uQ2xhc3MgPSAndmpzLW1lbnUtYnV0dG9uJztcblxuICAgIC8vIElmIHRoZSBpbmxpbmUgb3B0aW9uIGlzIHBhc3NlZCwgd2Ugd2FudCB0byB1c2UgZGlmZmVyZW50IHN0eWxlcyBhbHRvZ2V0aGVyLlxuICAgIGlmICh0aGlzLm9wdGlvbnNfLmlubGluZSA9PT0gdHJ1ZSkge1xuICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctaW5saW5lJztcbiAgICB9IGVsc2Uge1xuICAgICAgbWVudUJ1dHRvbkNsYXNzICs9ICctcG9wdXAnO1xuICAgIH1cblxuICAgIHJldHVybiBgdmpzLW1lbnUtYnV0dG9uICR7bWVudUJ1dHRvbkNsYXNzfSAke3N1cGVyLmJ1aWxkQ1NTQ2xhc3MoKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBoYW5kbGVyIGZvciB0aGUgdG9vbHRpcFxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9IERvbSBlbGVtZW50IHRvIHNlcnZlIGFzIGEgaGFuZGxlciBmb3IgdGhlIHRvb2x0aXBcbiAgICogQG1ldGhvZCB0b29sdGlwSGFuZGxlclxuICAgKi9cbiAgdG9vbHRpcEhhbmRsZXIoKSB7XG4gICAgLy8gVE9ETzogRml4IHBvcHVwIGJ1dHRvbiB0byBoYXZlIGEgcmVhbCBpY29uIGVsZW1lbnQgdG8gbWFrZSBpdCBhcyB0b29sdGlwIGhhbmRsZXJcbiAgICByZXR1cm47XG4gIH1cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQb3B1cEJ1dHRvbicsIFBvcHVwQnV0dG9uKTtcbmV4cG9ydCBkZWZhdWx0IFBvcHVwQnV0dG9uO1xuIl19
},{"../clickable-component.js":64,"../component.js":66,"../utils/dom.js":144,"../utils/fn.js":146,"../utils/to-title-case.js":153,"./popup.js":116}],116:[function(_dereq_,module,exports){
/**
* @file popup.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsEventsJs = _dereq_('../utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
/**
* The Popup component is used to build pop up controls.
*
* @extends Component
* @class Popup
*/
var Popup = (function (_Component) {
_inherits(Popup, _Component);
function Popup() {
_classCallCheck(this, Popup);
_Component.apply(this, arguments);
}
/**
* Add a popup item to the popup
*
* @param {Object|String} component Component or component type to add
* @method addItem
*/
Popup.prototype.addItem = function addItem(component) {
this.addChild(component);
component.on('click', Fn.bind(this, function () {
this.unlockShowing();
}));
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Popup.prototype.createEl = function createEl() {
var contentElType = this.options_.contentElType || 'ul';
this.contentEl_ = Dom.createEl(contentElType, {
className: 'vjs-menu-content'
});
var el = _Component.prototype.createEl.call(this, 'div', {
append: this.contentEl_,
className: 'vjs-menu'
});
el.appendChild(this.contentEl_);
// Prevent clicks from bubbling up. Needed for Popup Buttons,
// where a click on the parent is significant
Events.on(el, 'click', function (event) {
event.preventDefault();
event.stopImmediatePropagation();
});
return el;
};
return Popup;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Popup', Popup);
exports['default'] = Popup;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9wb3B1cC9wb3B1cC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7MkJBR3NCLGlCQUFpQjs7OzswQkFDbEIsaUJBQWlCOztJQUExQixHQUFHOzt5QkFDSyxnQkFBZ0I7O0lBQXhCLEVBQUU7OzZCQUNVLG9CQUFvQjs7SUFBaEMsTUFBTTs7Ozs7Ozs7O0lBUVosS0FBSztZQUFMLEtBQUs7O1dBQUwsS0FBSzswQkFBTCxLQUFLOzs7Ozs7Ozs7Ozs7QUFBTCxPQUFLLFdBUVQsT0FBTyxHQUFBLGlCQUFDLFNBQVMsRUFBRTtBQUNqQixRQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pCLGFBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVU7QUFDNUMsVUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0tBQ3RCLENBQUMsQ0FBQyxDQUFDO0dBQ0w7Ozs7Ozs7OztBQWJHLE9BQUssV0FxQlQsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsUUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDO0FBQ3hELFFBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQUU7QUFDNUMsZUFBUyxFQUFFLGtCQUFrQjtLQUM5QixDQUFDLENBQUM7QUFDSCxRQUFJLEVBQUUsR0FBRyxxQkFBTSxRQUFRLEtBQUEsT0FBQyxLQUFLLEVBQUU7QUFDN0IsWUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVO0FBQ3ZCLGVBQVMsRUFBRSxVQUFVO0tBQ3RCLENBQUMsQ0FBQztBQUNILE1BQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOzs7O0FBSWhDLFVBQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxVQUFTLEtBQUssRUFBQztBQUNwQyxXQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDdkIsV0FBSyxDQUFDLHdCQUF3QixFQUFFLENBQUM7S0FDbEMsQ0FBQyxDQUFDOztBQUVILFdBQU8sRUFBRSxDQUFDO0dBQ1g7O1NBeENHLEtBQUs7OztBQTJDWCx5QkFBVSxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzdCLEtBQUsiLCJmaWxlIjoic3JjL2pzL3BvcHVwL3BvcHVwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBwb3B1cC5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudC5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uL3V0aWxzL2ZuLmpzJztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuLi91dGlscy9ldmVudHMuanMnO1xuXG4vKipcbiAqIFRoZSBQb3B1cCBjb21wb25lbnQgaXMgdXNlZCB0byBidWlsZCBwb3AgdXAgY29udHJvbHMuXG4gKlxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgUG9wdXBcbiAqL1xuY2xhc3MgUG9wdXAgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwb3B1cCBpdGVtIHRvIHRoZSBwb3B1cFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGNvbXBvbmVudCBDb21wb25lbnQgb3IgY29tcG9uZW50IHR5cGUgdG8gYWRkXG4gICAqIEBtZXRob2QgYWRkSXRlbVxuICAgKi9cbiAgYWRkSXRlbShjb21wb25lbnQpIHtcbiAgICB0aGlzLmFkZENoaWxkKGNvbXBvbmVudCk7XG4gICAgY29tcG9uZW50Lm9uKCdjbGljaycsIEZuLmJpbmQodGhpcywgZnVuY3Rpb24oKXtcbiAgICAgIHRoaXMudW5sb2NrU2hvd2luZygpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIGxldCBjb250ZW50RWxUeXBlID0gdGhpcy5vcHRpb25zXy5jb250ZW50RWxUeXBlIHx8ICd1bCc7XG4gICAgdGhpcy5jb250ZW50RWxfID0gRG9tLmNyZWF0ZUVsKGNvbnRlbnRFbFR5cGUsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy1tZW51LWNvbnRlbnQnXG4gICAgfSk7XG4gICAgdmFyIGVsID0gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGFwcGVuZDogdGhpcy5jb250ZW50RWxfLFxuICAgICAgY2xhc3NOYW1lOiAndmpzLW1lbnUnXG4gICAgfSk7XG4gICAgZWwuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50RWxfKTtcblxuICAgIC8vIFByZXZlbnQgY2xpY2tzIGZyb20gYnViYmxpbmcgdXAuIE5lZWRlZCBmb3IgUG9wdXAgQnV0dG9ucyxcbiAgICAvLyB3aGVyZSBhIGNsaWNrIG9uIHRoZSBwYXJlbnQgaXMgc2lnbmlmaWNhbnRcbiAgICBFdmVudHMub24oZWwsICdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KXtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBlbDtcbiAgfVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1BvcHVwJywgUG9wdXApO1xuZXhwb3J0IGRlZmF1bHQgUG9wdXA7XG4iXX0=
},{"../component.js":66,"../utils/dom.js":144,"../utils/events.js":145,"../utils/fn.js":146}],117:[function(_dereq_,module,exports){
/**
* @file poster-image.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _clickableComponentJs = _dereq_('./clickable-component.js');
var _clickableComponentJs2 = _interopRequireDefault(_clickableComponentJs);
var _componentJs = _dereq_('./component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
/**
* The component that handles showing the poster image.
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Button
* @class PosterImage
*/
var PosterImage = (function (_ClickableComponent) {
_inherits(PosterImage, _ClickableComponent);
function PosterImage(player, options) {
_classCallCheck(this, PosterImage);
_ClickableComponent.call(this, player, options);
this.update();
player.on('posterchange', Fn.bind(this, this.update));
}
/**
* Clean up the poster image
*
* @method dispose
*/
PosterImage.prototype.dispose = function dispose() {
this.player().off('posterchange', this.update);
_ClickableComponent.prototype.dispose.call(this);
};
/**
* Create the poster's image element
*
* @return {Element}
* @method createEl
*/
PosterImage.prototype.createEl = function createEl() {
var el = Dom.createEl('div', {
className: 'vjs-poster',
// Don't want poster to be tabbable.
tabIndex: -1
});
// To ensure the poster image resizes while maintaining its original aspect
// ratio, use a div with `background-size` when available. For browsers that
// do not support `background-size` (e.g. IE8), fall back on using a regular
// img element.
if (!browser.BACKGROUND_SIZE_SUPPORTED) {
this.fallbackImg_ = Dom.createEl('img');
el.appendChild(this.fallbackImg_);
}
return el;
};
/**
* Event handler for updates to the player's poster source
*
* @method update
*/
PosterImage.prototype.update = function update() {
var url = this.player().poster();
this.setSrc(url);
// If there's no poster source we should display:none on this component
// so it's not still clickable or right-clickable
if (url) {
this.show();
} else {
this.hide();
}
};
/**
* Set the poster source depending on the display method
*
* @param {String} url The URL to the poster source
* @method setSrc
*/
PosterImage.prototype.setSrc = function setSrc(url) {
if (this.fallbackImg_) {
this.fallbackImg_.src = url;
} else {
var backgroundImage = '';
// Any falsey values should stay as an empty string, otherwise
// this will throw an extra error
if (url) {
backgroundImage = 'url("' + url + '")';
}
this.el_.style.backgroundImage = backgroundImage;
}
};
/**
* Event handler for clicks on the poster image
*
* @method handleClick
*/
PosterImage.prototype.handleClick = function handleClick() {
// We don't want a click to trigger playback when controls are disabled
// but CSS should be hiding the poster to prevent that from happening
if (this.player_.paused()) {
this.player_.play();
} else {
this.player_.pause();
}
};
return PosterImage;
})(_clickableComponentJs2['default']);
_componentJs2['default'].registerComponent('PosterImage', PosterImage);
exports['default'] = PosterImage;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9wb3N0ZXItaW1hZ2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O29DQUcrQiwwQkFBMEI7Ozs7MkJBQ25DLGdCQUFnQjs7Ozt5QkFDbEIsZUFBZTs7SUFBdkIsRUFBRTs7MEJBQ08sZ0JBQWdCOztJQUF6QixHQUFHOzs4QkFDVSxvQkFBb0I7O0lBQWpDLE9BQU87Ozs7Ozs7Ozs7O0lBVWIsV0FBVztZQUFYLFdBQVc7O0FBRUosV0FGUCxXQUFXLENBRUgsTUFBTSxFQUFFLE9BQU8sRUFBQzswQkFGeEIsV0FBVzs7QUFHYixtQ0FBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUNkLFVBQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0dBQ3ZEOzs7Ozs7OztBQVBHLGFBQVcsV0FjZixPQUFPLEdBQUEsbUJBQUc7QUFDUixRQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0Msa0NBQU0sT0FBTyxLQUFBLE1BQUUsQ0FBQztHQUNqQjs7Ozs7Ozs7O0FBakJHLGFBQVcsV0F5QmYsUUFBUSxHQUFBLG9CQUFHO0FBQ1QsUUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7QUFDM0IsZUFBUyxFQUFFLFlBQVk7OztBQUd2QixjQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQ2IsQ0FBQyxDQUFDOzs7Ozs7QUFNSCxRQUFJLENBQUMsT0FBTyxDQUFDLHlCQUF5QixFQUFFO0FBQ3RDLFVBQUksQ0FBQyxZQUFZLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxRQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUNuQzs7QUFFRCxXQUFPLEVBQUUsQ0FBQztHQUNYOzs7Ozs7OztBQTNDRyxhQUFXLFdBa0RmLE1BQU0sR0FBQSxrQkFBRztBQUNQLFFBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQzs7QUFFakMsUUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzs7OztBQUlqQixRQUFJLEdBQUcsRUFBRTtBQUNQLFVBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiLE1BQU07QUFDTCxVQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7S0FDYjtHQUNGOzs7Ozs7Ozs7QUE5REcsYUFBVyxXQXNFZixNQUFNLEdBQUEsZ0JBQUMsR0FBRyxFQUFFO0FBQ1YsUUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO0FBQ3JCLFVBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztLQUM3QixNQUFNO0FBQ0wsVUFBSSxlQUFlLEdBQUcsRUFBRSxDQUFDOzs7QUFHekIsVUFBSSxHQUFHLEVBQUU7QUFDUCx1QkFBZSxhQUFXLEdBQUcsT0FBSSxDQUFDO09BQ25DOztBQUVELFVBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGVBQWUsR0FBRyxlQUFlLENBQUM7S0FDbEQ7R0FDRjs7Ozs7Ozs7QUFuRkcsYUFBVyxXQTBGZixXQUFXLEdBQUEsdUJBQUc7OztBQUdaLFFBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRTtBQUN6QixVQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0tBQ3JCLE1BQU07QUFDTCxVQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3RCO0dBQ0Y7O1NBbEdHLFdBQVc7OztBQXNHakIseUJBQVUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FCQUN6QyxXQUFXIiwiZmlsZSI6InNyYy9qcy9wb3N0ZXItaW1hZ2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHBvc3Rlci1pbWFnZS5qc1xuICovXG5pbXBvcnQgQ2xpY2thYmxlQ29tcG9uZW50IGZyb20gJy4vY2xpY2thYmxlLWNvbXBvbmVudC5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50LmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4vdXRpbHMvZm4uanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi91dGlscy9icm93c2VyLmpzJztcblxuLyoqXG4gKiBUaGUgY29tcG9uZW50IHRoYXQgaGFuZGxlcyBzaG93aW5nIHRoZSBwb3N0ZXIgaW1hZ2UuXG4gKlxuICogQHBhcmFtIHtQbGF5ZXJ8T2JqZWN0fSBwbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICogQGV4dGVuZHMgQnV0dG9uXG4gKiBAY2xhc3MgUG9zdGVySW1hZ2VcbiAqL1xuY2xhc3MgUG9zdGVySW1hZ2UgZXh0ZW5kcyBDbGlja2FibGVDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucyl7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gICAgcGxheWVyLm9uKCdwb3N0ZXJjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXMudXBkYXRlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW4gdXAgdGhlIHBvc3RlciBpbWFnZVxuICAgKlxuICAgKiBAbWV0aG9kIGRpc3Bvc2VcbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5wbGF5ZXIoKS5vZmYoJ3Bvc3RlcmNoYW5nZScsIHRoaXMudXBkYXRlKTtcbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBwb3N0ZXIncyBpbWFnZSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0VsZW1lbnR9XG4gICAqIEBtZXRob2QgY3JlYXRlRWxcbiAgICovXG4gIGNyZWF0ZUVsKCkge1xuICAgIGxldCBlbCA9IERvbS5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXBvc3RlcicsXG5cbiAgICAgIC8vIERvbid0IHdhbnQgcG9zdGVyIHRvIGJlIHRhYmJhYmxlLlxuICAgICAgdGFiSW5kZXg6IC0xXG4gICAgfSk7XG5cbiAgICAvLyBUbyBlbnN1cmUgdGhlIHBvc3RlciBpbWFnZSByZXNpemVzIHdoaWxlIG1haW50YWluaW5nIGl0cyBvcmlnaW5hbCBhc3BlY3RcbiAgICAvLyByYXRpbywgdXNlIGEgZGl2IHdpdGggYGJhY2tncm91bmQtc2l6ZWAgd2hlbiBhdmFpbGFibGUuIEZvciBicm93c2VycyB0aGF0XG4gICAgLy8gZG8gbm90IHN1cHBvcnQgYGJhY2tncm91bmQtc2l6ZWAgKGUuZy4gSUU4KSwgZmFsbCBiYWNrIG9uIHVzaW5nIGEgcmVndWxhclxuICAgIC8vIGltZyBlbGVtZW50LlxuICAgIGlmICghYnJvd3Nlci5CQUNLR1JPVU5EX1NJWkVfU1VQUE9SVEVEKSB7XG4gICAgICB0aGlzLmZhbGxiYWNrSW1nXyA9IERvbS5jcmVhdGVFbCgnaW1nJyk7XG4gICAgICBlbC5hcHBlbmRDaGlsZCh0aGlzLmZhbGxiYWNrSW1nXyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgZm9yIHVwZGF0ZXMgdG8gdGhlIHBsYXllcidzIHBvc3RlciBzb3VyY2VcbiAgICpcbiAgICogQG1ldGhvZCB1cGRhdGVcbiAgICovXG4gIHVwZGF0ZSgpIHtcbiAgICBsZXQgdXJsID0gdGhpcy5wbGF5ZXIoKS5wb3N0ZXIoKTtcblxuICAgIHRoaXMuc2V0U3JjKHVybCk7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIHBvc3RlciBzb3VyY2Ugd2Ugc2hvdWxkIGRpc3BsYXk6bm9uZSBvbiB0aGlzIGNvbXBvbmVudFxuICAgIC8vIHNvIGl0J3Mgbm90IHN0aWxsIGNsaWNrYWJsZSBvciByaWdodC1jbGlja2FibGVcbiAgICBpZiAodXJsKSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgcG9zdGVyIHNvdXJjZSBkZXBlbmRpbmcgb24gdGhlIGRpc3BsYXkgbWV0aG9kXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIFVSTCB0byB0aGUgcG9zdGVyIHNvdXJjZVxuICAgKiBAbWV0aG9kIHNldFNyY1xuICAgKi9cbiAgc2V0U3JjKHVybCkge1xuICAgIGlmICh0aGlzLmZhbGxiYWNrSW1nXykge1xuICAgICAgdGhpcy5mYWxsYmFja0ltZ18uc3JjID0gdXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgYmFja2dyb3VuZEltYWdlID0gJyc7XG4gICAgICAvLyBBbnkgZmFsc2V5IHZhbHVlcyBzaG91bGQgc3RheSBhcyBhbiBlbXB0eSBzdHJpbmcsIG90aGVyd2lzZVxuICAgICAgLy8gdGhpcyB3aWxsIHRocm93IGFuIGV4dHJhIGVycm9yXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIGJhY2tncm91bmRJbWFnZSA9IGB1cmwoXCIke3VybH1cIilgO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVsXy5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBiYWNrZ3JvdW5kSW1hZ2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW50IGhhbmRsZXIgZm9yIGNsaWNrcyBvbiB0aGUgcG9zdGVyIGltYWdlXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlQ2xpY2tcbiAgICovXG4gIGhhbmRsZUNsaWNrKCkge1xuICAgIC8vIFdlIGRvbid0IHdhbnQgYSBjbGljayB0byB0cmlnZ2VyIHBsYXliYWNrIHdoZW4gY29udHJvbHMgYXJlIGRpc2FibGVkXG4gICAgLy8gYnV0IENTUyBzaG91bGQgYmUgaGlkaW5nIHRoZSBwb3N0ZXIgdG8gcHJldmVudCB0aGF0IGZyb20gaGFwcGVuaW5nXG4gICAgaWYgKHRoaXMucGxheWVyXy5wYXVzZWQoKSkge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wbGF5ZXJfLnBhdXNlKCk7XG4gICAgfVxuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdQb3N0ZXJJbWFnZScsIFBvc3RlckltYWdlKTtcbmV4cG9ydCBkZWZhdWx0IFBvc3RlckltYWdlO1xuIl19
},{"./clickable-component.js":64,"./component.js":66,"./utils/browser.js":141,"./utils/dom.js":144,"./utils/fn.js":146}],118:[function(_dereq_,module,exports){
/**
* @file setup.js
*
* Functions for automatically setting up a player
* based on the data-setup attribute of the video tag
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _windowLoaded = false;
var videojs = undefined;
// Automatically set up any tags that have a data-setup attribute
var autoSetup = function autoSetup() {
// One day, when we stop supporting IE8, go back to this, but in the meantime...*hack hack hack*
// var vids = Array.prototype.slice.call(document.getElementsByTagName('video'));
// var audios = Array.prototype.slice.call(document.getElementsByTagName('audio'));
// var mediaEls = vids.concat(audios);
// Because IE8 doesn't support calling slice on a node list, we need to loop through each list of elements
// to build up a new, combined list of elements.
var vids = _globalDocument2['default'].getElementsByTagName('video');
var audios = _globalDocument2['default'].getElementsByTagName('audio');
var mediaEls = [];
if (vids && vids.length > 0) {
for (var i = 0, e = vids.length; i < e; i++) {
mediaEls.push(vids[i]);
}
}
if (audios && audios.length > 0) {
for (var i = 0, e = audios.length; i < e; i++) {
mediaEls.push(audios[i]);
}
}
// Check if any media elements exist
if (mediaEls && mediaEls.length > 0) {
for (var i = 0, e = mediaEls.length; i < e; i++) {
var mediaEl = mediaEls[i];
// Check if element exists, has getAttribute func.
// IE seems to consider typeof el.getAttribute == 'object' instead of 'function' like expected, at least when loading the player immediately.
if (mediaEl && mediaEl.getAttribute) {
// Make sure this player hasn't already been set up.
if (mediaEl['player'] === undefined) {
var options = mediaEl.getAttribute('data-setup');
// Check if data-setup attr exists.
// We only auto-setup if they've added the data-setup attr.
if (options !== null) {
// Create new video.js instance.
var player = videojs(mediaEl);
}
}
// If getAttribute isn't defined, we need to wait for the DOM.
} else {
autoSetupTimeout(1);
break;
}
}
// No videos were found, so keep looping unless page is finished loading.
} else if (!_windowLoaded) {
autoSetupTimeout(1);
}
};
// Pause to let the DOM keep processing
var autoSetupTimeout = function autoSetupTimeout(wait, vjs) {
if (vjs) {
videojs = vjs;
}
setTimeout(autoSetup, wait);
};
if (_globalDocument2['default'].readyState === 'complete') {
_windowLoaded = true;
} else {
Events.one(_globalWindow2['default'], 'load', function () {
_windowLoaded = true;
});
}
var hasLoaded = function hasLoaded() {
return _windowLoaded;
};
exports.autoSetup = autoSetup;
exports.autoSetupTimeout = autoSetupTimeout;
exports.hasLoaded = hasLoaded;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UUFFTyxTQUFTLEdBQVQsU0FBUztRQUFFLGdCQUFnQixHQUFoQixnQkFBZ0I7UUFBRSxTQUFTLEdBQVQsU0FBUyIsImZpbGUiOiJzcmMvanMvc2V0dXAuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHNldHVwLmpzXG4gKlxuICogRnVuY3Rpb25zIGZvciBhdXRvbWF0aWNhbGx5IHNldHRpbmcgdXAgYSBwbGF5ZXJcbiAqIGJhc2VkIG9uIHRoZSBkYXRhLXNldHVwIGF0dHJpYnV0ZSBvZiB0aGUgdmlkZW8gdGFnXG4gKi9cbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmxldCBfd2luZG93TG9hZGVkID0gZmFsc2U7XG5sZXQgdmlkZW9qcztcblxuXG4vLyBBdXRvbWF0aWNhbGx5IHNldCB1cCBhbnkgdGFncyB0aGF0IGhhdmUgYSBkYXRhLXNldHVwIGF0dHJpYnV0ZVxudmFyIGF1dG9TZXR1cCA9IGZ1bmN0aW9uKCl7XG4gIC8vIE9uZSBkYXksIHdoZW4gd2Ugc3RvcCBzdXBwb3J0aW5nIElFOCwgZ28gYmFjayB0byB0aGlzLCBidXQgaW4gdGhlIG1lYW50aW1lLi4uKmhhY2sgaGFjayBoYWNrKlxuICAvLyB2YXIgdmlkcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpKTtcbiAgLy8gdmFyIGF1ZGlvcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdhdWRpbycpKTtcbiAgLy8gdmFyIG1lZGlhRWxzID0gdmlkcy5jb25jYXQoYXVkaW9zKTtcblxuICAvLyBCZWNhdXNlIElFOCBkb2Vzbid0IHN1cHBvcnQgY2FsbGluZyBzbGljZSBvbiBhIG5vZGUgbGlzdCwgd2UgbmVlZCB0byBsb29wIHRocm91Z2ggZWFjaCBsaXN0IG9mIGVsZW1lbnRzXG4gIC8vIHRvIGJ1aWxkIHVwIGEgbmV3LCBjb21iaW5lZCBsaXN0IG9mIGVsZW1lbnRzLlxuICB2YXIgdmlkcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpO1xuICB2YXIgYXVkaW9zID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2F1ZGlvJyk7XG4gIHZhciBtZWRpYUVscyA9IFtdO1xuICBpZiAodmlkcyAmJiB2aWRzLmxlbmd0aCA+IDApIHtcbiAgICBmb3IobGV0IGk9MCwgZT12aWRzLmxlbmd0aDsgaTxlOyBpKyspIHtcbiAgICAgIG1lZGlhRWxzLnB1c2godmlkc1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChhdWRpb3MgJiYgYXVkaW9zLmxlbmd0aCA+IDApIHtcbiAgICBmb3IobGV0IGk9MCwgZT1hdWRpb3MubGVuZ3RoOyBpPGU7IGkrKykge1xuICAgICAgbWVkaWFFbHMucHVzaChhdWRpb3NbaV0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFueSBtZWRpYSBlbGVtZW50cyBleGlzdFxuICBpZiAobWVkaWFFbHMgJiYgbWVkaWFFbHMubGVuZ3RoID4gMCkge1xuXG4gICAgZm9yIChsZXQgaT0wLCBlPW1lZGlhRWxzLmxlbmd0aDsgaTxlOyBpKyspIHtcbiAgICAgIGxldCBtZWRpYUVsID0gbWVkaWFFbHNbaV07XG5cbiAgICAgIC8vIENoZWNrIGlmIGVsZW1lbnQgZXhpc3RzLCBoYXMgZ2V0QXR0cmlidXRlIGZ1bmMuXG4gICAgICAvLyBJRSBzZWVtcyB0byBjb25zaWRlciB0eXBlb2YgZWwuZ2V0QXR0cmlidXRlID09ICdvYmplY3QnIGluc3RlYWQgb2YgJ2Z1bmN0aW9uJyBsaWtlIGV4cGVjdGVkLCBhdCBsZWFzdCB3aGVuIGxvYWRpbmcgdGhlIHBsYXllciBpbW1lZGlhdGVseS5cbiAgICAgIGlmIChtZWRpYUVsICYmIG1lZGlhRWwuZ2V0QXR0cmlidXRlKSB7XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoaXMgcGxheWVyIGhhc24ndCBhbHJlYWR5IGJlZW4gc2V0IHVwLlxuICAgICAgICBpZiAobWVkaWFFbFsncGxheWVyJ10gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGxldCBvcHRpb25zID0gbWVkaWFFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtc2V0dXAnKTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGRhdGEtc2V0dXAgYXR0ciBleGlzdHMuXG4gICAgICAgICAgLy8gV2Ugb25seSBhdXRvLXNldHVwIGlmIHRoZXkndmUgYWRkZWQgdGhlIGRhdGEtc2V0dXAgYXR0ci5cbiAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyB2aWRlby5qcyBpbnN0YW5jZS5cbiAgICAgICAgICAgIGxldCBwbGF5ZXIgPSB2aWRlb2pzKG1lZGlhRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAvLyBJZiBnZXRBdHRyaWJ1dGUgaXNuJ3QgZGVmaW5lZCwgd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgRE9NLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXV0b1NldHVwVGltZW91dCgxKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gIC8vIE5vIHZpZGVvcyB3ZXJlIGZvdW5kLCBzbyBrZWVwIGxvb3BpbmcgdW5sZXNzIHBhZ2UgaXMgZmluaXNoZWQgbG9hZGluZy5cbiAgfSBlbHNlIGlmICghX3dpbmRvd0xvYWRlZCkge1xuICAgIGF1dG9TZXR1cFRpbWVvdXQoMSk7XG4gIH1cbn07XG5cbi8vIFBhdXNlIHRvIGxldCB0aGUgRE9NIGtlZXAgcHJvY2Vzc2luZ1xudmFyIGF1dG9TZXR1cFRpbWVvdXQgPSBmdW5jdGlvbih3YWl0LCB2anMpe1xuICBpZiAodmpzKSB7XG4gICAgdmlkZW9qcyA9IHZqcztcbiAgfVxuXG4gIHNldFRpbWVvdXQoYXV0b1NldHVwLCB3YWl0KTtcbn07XG5cbmlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7XG4gIF93aW5kb3dMb2FkZWQgPSB0cnVlO1xufSBlbHNlIHtcbiAgRXZlbnRzLm9uZSh3aW5kb3csICdsb2FkJywgZnVuY3Rpb24oKXtcbiAgICBfd2luZG93TG9hZGVkID0gdHJ1ZTtcbiAgfSk7XG59XG5cbnZhciBoYXNMb2FkZWQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIF93aW5kb3dMb2FkZWQ7XG59O1xuXG5leHBvcnQgeyBhdXRvU2V0dXAsIGF1dG9TZXR1cFRpbWVvdXQsIGhhc0xvYWRlZCB9O1xuIl19
},{"./utils/events.js":145,"global/document":7,"global/window":8}],119:[function(_dereq_,module,exports){
/**
* @file slider.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
/**
* The base functionality for sliders like the volume bar and seek bar
*
* @param {Player|Object} player
* @param {Object=} options
* @extends Component
* @class Slider
*/
var Slider = (function (_Component) {
_inherits(Slider, _Component);
function Slider(player, options) {
_classCallCheck(this, Slider);
_Component.call(this, player, options);
// Set property names to bar to match with the child Slider class is looking for
this.bar = this.getChild(this.options_.barName);
// Set a horizontal or vertical class on the slider depending on the slider type
this.vertical(!!this.options_.vertical);
this.on('mousedown', this.handleMouseDown);
this.on('touchstart', this.handleMouseDown);
this.on('focus', this.handleFocus);
this.on('blur', this.handleBlur);
this.on('click', this.handleClick);
this.on(player, 'controlsvisible', this.update);
this.on(player, this.playerEvent, this.update);
}
/**
* Create the component's DOM element
*
* @param {String} type Type of element to create
* @param {Object=} props List of properties in Object form
* @return {Element}
* @method createEl
*/
Slider.prototype.createEl = function createEl(type) {
var props = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
// Add the slider element class to all sub classes
props.className = props.className + ' vjs-slider';
props = _objectAssign2['default']({
tabIndex: 0
}, props);
attributes = _objectAssign2['default']({
'role': 'slider',
'aria-valuenow': 0,
'aria-valuemin': 0,
'aria-valuemax': 100,
tabIndex: 0
}, attributes);
return _Component.prototype.createEl.call(this, type, props, attributes);
};
/**
* Handle mouse down on slider
*
* @param {Object} event Mouse down event object
* @method handleMouseDown
*/
Slider.prototype.handleMouseDown = function handleMouseDown(event) {
var doc = this.bar.el_.ownerDocument;
event.preventDefault();
Dom.blockTextSelection();
this.addClass('vjs-sliding');
this.trigger('slideractive');
this.on(doc, 'mousemove', this.handleMouseMove);
this.on(doc, 'mouseup', this.handleMouseUp);
this.on(doc, 'touchmove', this.handleMouseMove);
this.on(doc, 'touchend', this.handleMouseUp);
this.handleMouseMove(event);
};
/**
* To be overridden by a subclass
*
* @method handleMouseMove
*/
Slider.prototype.handleMouseMove = function handleMouseMove() {};
/**
* Handle mouse up on Slider
*
* @method handleMouseUp
*/
Slider.prototype.handleMouseUp = function handleMouseUp() {
var doc = this.bar.el_.ownerDocument;
Dom.unblockTextSelection();
this.removeClass('vjs-sliding');
this.trigger('sliderinactive');
this.off(doc, 'mousemove', this.handleMouseMove);
this.off(doc, 'mouseup', this.handleMouseUp);
this.off(doc, 'touchmove', this.handleMouseMove);
this.off(doc, 'touchend', this.handleMouseUp);
this.update();
};
/**
* Update slider
*
* @method update
*/
Slider.prototype.update = function update() {
// In VolumeBar init we have a setTimeout for update that pops and update to the end of the
// execution stack. The player is destroyed before then update will cause an error
if (!this.el_) return;
// If scrubbing, we could use a cached value to make the handle keep up with the user's mouse.
// On HTML5 browsers scrubbing is really smooth, but some flash players are slow, so we might want to utilize this later.
// var progress = (this.player_.scrubbing()) ? this.player_.getCache().currentTime / this.player_.duration() : this.player_.currentTime() / this.player_.duration();
var progress = this.getPercent();
var bar = this.bar;
// If there's no bar...
if (!bar) return;
// Protect against no duration and other division issues
if (typeof progress !== 'number' || progress !== progress || progress < 0 || progress === Infinity) {
progress = 0;
}
// Convert to a percentage for setting
var percentage = (progress * 100).toFixed(2) + '%';
// Set the new bar width or height
if (this.vertical()) {
bar.el().style.height = percentage;
} else {
bar.el().style.width = percentage;
}
};
/**
* Calculate distance for slider
*
* @param {Object} event Event object
* @method calculateDistance
*/
Slider.prototype.calculateDistance = function calculateDistance(event) {
var position = Dom.getPointerPosition(this.el_, event);
if (this.vertical()) {
return position.y;
}
return position.x;
};
/**
* Handle on focus for slider
*
* @method handleFocus
*/
Slider.prototype.handleFocus = function handleFocus() {
this.on(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);
};
/**
* Handle key press for slider
*
* @param {Object} event Event object
* @method handleKeyPress
*/
Slider.prototype.handleKeyPress = function handleKeyPress(event) {
if (event.which === 37 || event.which === 40) {
// Left and Down Arrows
event.preventDefault();
this.stepBack();
} else if (event.which === 38 || event.which === 39) {
// Up and Right Arrows
event.preventDefault();
this.stepForward();
}
};
/**
* Handle on blur for slider
*
* @method handleBlur
*/
Slider.prototype.handleBlur = function handleBlur() {
this.off(this.bar.el_.ownerDocument, 'keydown', this.handleKeyPress);
};
/**
* Listener for click events on slider, used to prevent clicks
* from bubbling up to parent elements like button menus.
*
* @param {Object} event Event object
* @method handleClick
*/
Slider.prototype.handleClick = function handleClick(event) {
event.stopImmediatePropagation();
event.preventDefault();
};
/**
* Get/set if slider is horizontal for vertical
*
* @param {Boolean} bool True if slider is vertical, false is horizontal
* @return {Boolean} True if slider is vertical, false is horizontal
* @method vertical
*/
Slider.prototype.vertical = function vertical(bool) {
if (bool === undefined) {
return this.vertical_ || false;
}
this.vertical_ = !!bool;
if (this.vertical_) {
this.addClass('vjs-slider-vertical');
} else {
this.addClass('vjs-slider-horizontal');
}
return this;
};
return Slider;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('Slider', Slider);
exports['default'] = Slider;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy9zbGlkZXIvc2xpZGVyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OzsyQkFHc0IsaUJBQWlCOzs7OzBCQUNsQixpQkFBaUI7O0lBQTFCLEdBQUc7OzRCQUNJLGVBQWU7Ozs7Ozs7Ozs7Ozs7SUFVNUIsTUFBTTtZQUFOLE1BQU07O0FBRUMsV0FGUCxNQUFNLENBRUUsTUFBTSxFQUFFLE9BQU8sRUFBRTswQkFGekIsTUFBTTs7QUFHUiwwQkFBTSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7OztBQUd2QixRQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzs7O0FBR2hELFFBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRXhDLFFBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUMzQyxRQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDNUMsUUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ25DLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNqQyxRQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7O0FBRW5DLFFBQUksQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNoRCxRQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUNoRDs7Ozs7Ozs7Ozs7QUFuQkcsUUFBTSxXQTZCVixRQUFRLEdBQUEsa0JBQUMsSUFBSSxFQUEyQjtRQUF6QixLQUFLLHlEQUFDLEVBQUU7UUFBRSxVQUFVLHlEQUFDLEVBQUU7OztBQUVwQyxTQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDO0FBQ2xELFNBQUssR0FBRywwQkFBTztBQUNiLGNBQVEsRUFBRSxDQUFDO0tBQ1osRUFBRSxLQUFLLENBQUMsQ0FBQzs7QUFFVixjQUFVLEdBQUcsMEJBQU87QUFDbEIsWUFBTSxFQUFFLFFBQVE7QUFDaEIscUJBQWUsRUFBRSxDQUFDO0FBQ2xCLHFCQUFlLEVBQUUsQ0FBQztBQUNsQixxQkFBZSxFQUFFLEdBQUc7QUFDcEIsY0FBUSxFQUFFLENBQUM7S0FDWixFQUFFLFVBQVUsQ0FBQyxDQUFDOztBQUVmLFdBQU8scUJBQU0sUUFBUSxLQUFBLE9BQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztHQUNoRDs7Ozs7Ozs7O0FBN0NHLFFBQU0sV0FxRFYsZUFBZSxHQUFBLHlCQUFDLEtBQUssRUFBRTtBQUNyQixRQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7O0FBRXJDLFNBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUN2QixPQUFHLENBQUMsa0JBQWtCLEVBQUUsQ0FBQzs7QUFFekIsUUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUM3QixRQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDOztBQUU3QixRQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2hELFFBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDNUMsUUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNoRCxRQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDOztBQUU3QyxRQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQzdCOzs7Ozs7OztBQXBFRyxRQUFNLFdBMkVWLGVBQWUsR0FBQSwyQkFBRyxFQUFFOzs7Ozs7OztBQTNFaEIsUUFBTSxXQWtGVixhQUFhLEdBQUEseUJBQUc7QUFDZCxRQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7O0FBRXJDLE9BQUcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDOztBQUUzQixRQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2hDLFFBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7QUFFL0IsUUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUNqRCxRQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzdDLFFBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDakQsUUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQzs7QUFFOUMsUUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0dBQ2Y7Ozs7Ozs7O0FBaEdHLFFBQU0sV0F1R1YsTUFBTSxHQUFBLGtCQUFHOzs7QUFHUCxRQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPOzs7OztBQUt0QixRQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7QUFDakMsUUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7O0FBR25CLFFBQUksQ0FBQyxHQUFHLEVBQUUsT0FBTzs7O0FBR2pCLFFBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxJQUM1QixRQUFRLEtBQUssUUFBUSxJQUNyQixRQUFRLEdBQUcsQ0FBQyxJQUNaLFFBQVEsS0FBSyxRQUFRLEVBQUU7QUFDckIsY0FBUSxHQUFHLENBQUMsQ0FBQztLQUNsQjs7O0FBR0QsUUFBSSxVQUFVLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFBLENBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs7O0FBR25ELFFBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFO0FBQ25CLFNBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQztLQUNwQyxNQUFNO0FBQ0wsU0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDO0tBQ25DO0dBQ0Y7Ozs7Ozs7OztBQXRJRyxRQUFNLFdBOElWLGlCQUFpQixHQUFBLDJCQUFDLEtBQUssRUFBQztBQUN0QixRQUFJLFFBQVEsR0FBRyxHQUFHLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RCxRQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsRUFBRTtBQUNuQixhQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUM7S0FDbkI7QUFDRCxXQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUM7R0FDbkI7Ozs7Ozs7O0FBcEpHLFFBQU0sV0EySlYsV0FBVyxHQUFBLHVCQUFHO0FBQ1osUUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztHQUNyRTs7Ozs7Ozs7O0FBN0pHLFFBQU0sV0FxS1YsY0FBYyxHQUFBLHdCQUFDLEtBQUssRUFBRTtBQUNwQixRQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFOztBQUM1QyxXQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7QUFDdkIsVUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLEVBQUUsRUFBRTs7QUFDbkQsV0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3ZCLFVBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztLQUNwQjtHQUNGOzs7Ozs7OztBQTdLRyxRQUFNLFdBb0xWLFVBQVUsR0FBQSxzQkFBRztBQUNYLFFBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7R0FDdEU7Ozs7Ozs7Ozs7QUF0TEcsUUFBTSxXQStMVixXQUFXLEdBQUEscUJBQUMsS0FBSyxFQUFFO0FBQ2pCLFNBQUssQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0FBQ2pDLFNBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztHQUN4Qjs7Ozs7Ozs7OztBQWxNRyxRQUFNLFdBMk1WLFFBQVEsR0FBQSxrQkFBQyxJQUFJLEVBQUU7QUFDYixRQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7QUFDdEIsYUFBTyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQztLQUNoQzs7QUFFRCxRQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7O0FBRXhCLFFBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUNsQixVQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUM7S0FDdEMsTUFBTTtBQUNMLFVBQUksQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztLQUN4Qzs7QUFFRCxXQUFPLElBQUksQ0FBQztHQUNiOztTQXpORyxNQUFNOzs7QUE2TloseUJBQVUsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO3FCQUMvQixNQUFNIiwiZmlsZSI6InNyYy9qcy9zbGlkZXIvc2xpZGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBzbGlkZXIuanNcbiAqL1xuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi9jb21wb25lbnQuanMnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgYXNzaWduIGZyb20gJ29iamVjdC5hc3NpZ24nO1xuXG4vKipcbiAqIFRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgZm9yIHNsaWRlcnMgbGlrZSB0aGUgdm9sdW1lIGJhciBhbmQgc2VlayBiYXJcbiAqXG4gKiBAcGFyYW0ge1BsYXllcnxPYmplY3R9IHBsYXllclxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBTbGlkZXJcbiAqL1xuY2xhc3MgU2xpZGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMpIHtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMpO1xuXG4gICAgLy8gU2V0IHByb3BlcnR5IG5hbWVzIHRvIGJhciB0byBtYXRjaCB3aXRoIHRoZSBjaGlsZCBTbGlkZXIgY2xhc3MgaXMgbG9va2luZyBmb3JcbiAgICB0aGlzLmJhciA9IHRoaXMuZ2V0Q2hpbGQodGhpcy5vcHRpb25zXy5iYXJOYW1lKTtcblxuICAgIC8vIFNldCBhIGhvcml6b250YWwgb3IgdmVydGljYWwgY2xhc3Mgb24gdGhlIHNsaWRlciBkZXBlbmRpbmcgb24gdGhlIHNsaWRlciB0eXBlXG4gICAgdGhpcy52ZXJ0aWNhbCghIXRoaXMub3B0aW9uc18udmVydGljYWwpO1xuXG4gICAgdGhpcy5vbignbW91c2Vkb3duJywgdGhpcy5oYW5kbGVNb3VzZURvd24pO1xuICAgIHRoaXMub24oJ3RvdWNoc3RhcnQnLCB0aGlzLmhhbmRsZU1vdXNlRG93bik7XG4gICAgdGhpcy5vbignZm9jdXMnLCB0aGlzLmhhbmRsZUZvY3VzKTtcbiAgICB0aGlzLm9uKCdibHVyJywgdGhpcy5oYW5kbGVCbHVyKTtcbiAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMuaGFuZGxlQ2xpY2spO1xuXG4gICAgdGhpcy5vbihwbGF5ZXIsICdjb250cm9sc3Zpc2libGUnLCB0aGlzLnVwZGF0ZSk7XG4gICAgdGhpcy5vbihwbGF5ZXIsIHRoaXMucGxheWVyRXZlbnQsIHRoaXMudXBkYXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgdGhlIGNvbXBvbmVudCdzIERPTSBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFR5cGUgb2YgZWxlbWVudCB0byBjcmVhdGVcbiAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wcyBMaXN0IG9mIHByb3BlcnRpZXMgaW4gT2JqZWN0IGZvcm1cbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwodHlwZSwgcHJvcHM9e30sIGF0dHJpYnV0ZXM9e30pIHtcbiAgICAvLyBBZGQgdGhlIHNsaWRlciBlbGVtZW50IGNsYXNzIHRvIGFsbCBzdWIgY2xhc3Nlc1xuICAgIHByb3BzLmNsYXNzTmFtZSA9IHByb3BzLmNsYXNzTmFtZSArICcgdmpzLXNsaWRlcic7XG4gICAgcHJvcHMgPSBhc3NpZ24oe1xuICAgICAgdGFiSW5kZXg6IDBcbiAgICB9LCBwcm9wcyk7XG5cbiAgICBhdHRyaWJ1dGVzID0gYXNzaWduKHtcbiAgICAgICdyb2xlJzogJ3NsaWRlcicsXG4gICAgICAnYXJpYS12YWx1ZW5vdyc6IDAsXG4gICAgICAnYXJpYS12YWx1ZW1pbic6IDAsXG4gICAgICAnYXJpYS12YWx1ZW1heCc6IDEwMCxcbiAgICAgIHRhYkluZGV4OiAwXG4gICAgfSwgYXR0cmlidXRlcyk7XG5cbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwodHlwZSwgcHJvcHMsIGF0dHJpYnV0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSBkb3duIG9uIHNsaWRlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgTW91c2UgZG93biBldmVudCBvYmplY3RcbiAgICogQG1ldGhvZCBoYW5kbGVNb3VzZURvd25cbiAgICovXG4gIGhhbmRsZU1vdXNlRG93bihldmVudCkge1xuICAgIGxldCBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgRG9tLmJsb2NrVGV4dFNlbGVjdGlvbigpO1xuXG4gICAgdGhpcy5hZGRDbGFzcygndmpzLXNsaWRpbmcnKTtcbiAgICB0aGlzLnRyaWdnZXIoJ3NsaWRlcmFjdGl2ZScpO1xuXG4gICAgdGhpcy5vbihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vbihkb2MsICdtb3VzZXVwJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcbiAgICB0aGlzLm9uKGRvYywgJ3RvdWNobW92ZScsIHRoaXMuaGFuZGxlTW91c2VNb3ZlKTtcbiAgICB0aGlzLm9uKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcblxuICAgIHRoaXMuaGFuZGxlTW91c2VNb3ZlKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUbyBiZSBvdmVycmlkZGVuIGJ5IGEgc3ViY2xhc3NcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVNb3VzZU1vdmVcbiAgICovXG4gIGhhbmRsZU1vdXNlTW92ZSgpIHt9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBtb3VzZSB1cCBvbiBTbGlkZXJcbiAgICpcbiAgICogQG1ldGhvZCBoYW5kbGVNb3VzZVVwXG4gICAqL1xuICBoYW5kbGVNb3VzZVVwKCkge1xuICAgIGxldCBkb2MgPSB0aGlzLmJhci5lbF8ub3duZXJEb2N1bWVudDtcblxuICAgIERvbS51bmJsb2NrVGV4dFNlbGVjdGlvbigpO1xuXG4gICAgdGhpcy5yZW1vdmVDbGFzcygndmpzLXNsaWRpbmcnKTtcbiAgICB0aGlzLnRyaWdnZXIoJ3NsaWRlcmluYWN0aXZlJyk7XG5cbiAgICB0aGlzLm9mZihkb2MsICdtb3VzZW1vdmUnLCB0aGlzLmhhbmRsZU1vdXNlTW92ZSk7XG4gICAgdGhpcy5vZmYoZG9jLCAnbW91c2V1cCcsIHRoaXMuaGFuZGxlTW91c2VVcCk7XG4gICAgdGhpcy5vZmYoZG9jLCAndG91Y2htb3ZlJywgdGhpcy5oYW5kbGVNb3VzZU1vdmUpO1xuICAgIHRoaXMub2ZmKGRvYywgJ3RvdWNoZW5kJywgdGhpcy5oYW5kbGVNb3VzZVVwKTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHNsaWRlclxuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZVxuICAgKi9cbiAgdXBkYXRlKCkge1xuICAgIC8vIEluIFZvbHVtZUJhciBpbml0IHdlIGhhdmUgYSBzZXRUaW1lb3V0IGZvciB1cGRhdGUgdGhhdCBwb3BzIGFuZCB1cGRhdGUgdG8gdGhlIGVuZCBvZiB0aGVcbiAgICAvLyBleGVjdXRpb24gc3RhY2suIFRoZSBwbGF5ZXIgaXMgZGVzdHJveWVkIGJlZm9yZSB0aGVuIHVwZGF0ZSB3aWxsIGNhdXNlIGFuIGVycm9yXG4gICAgaWYgKCF0aGlzLmVsXykgcmV0dXJuO1xuXG4gICAgLy8gSWYgc2NydWJiaW5nLCB3ZSBjb3VsZCB1c2UgYSBjYWNoZWQgdmFsdWUgdG8gbWFrZSB0aGUgaGFuZGxlIGtlZXAgdXAgd2l0aCB0aGUgdXNlcidzIG1vdXNlLlxuICAgIC8vIE9uIEhUTUw1IGJyb3dzZXJzIHNjcnViYmluZyBpcyByZWFsbHkgc21vb3RoLCBidXQgc29tZSBmbGFzaCBwbGF5ZXJzIGFyZSBzbG93LCBzbyB3ZSBtaWdodCB3YW50IHRvIHV0aWxpemUgdGhpcyBsYXRlci5cbiAgICAvLyB2YXIgcHJvZ3Jlc3MgPSAgKHRoaXMucGxheWVyXy5zY3J1YmJpbmcoKSkgPyB0aGlzLnBsYXllcl8uZ2V0Q2FjaGUoKS5jdXJyZW50VGltZSAvIHRoaXMucGxheWVyXy5kdXJhdGlvbigpIDogdGhpcy5wbGF5ZXJfLmN1cnJlbnRUaW1lKCkgLyB0aGlzLnBsYXllcl8uZHVyYXRpb24oKTtcbiAgICBsZXQgcHJvZ3Jlc3MgPSB0aGlzLmdldFBlcmNlbnQoKTtcbiAgICBsZXQgYmFyID0gdGhpcy5iYXI7XG5cbiAgICAvLyBJZiB0aGVyZSdzIG5vIGJhci4uLlxuICAgIGlmICghYmFyKSByZXR1cm47XG5cbiAgICAvLyBQcm90ZWN0IGFnYWluc3Qgbm8gZHVyYXRpb24gYW5kIG90aGVyIGRpdmlzaW9uIGlzc3Vlc1xuICAgIGlmICh0eXBlb2YgcHJvZ3Jlc3MgIT09ICdudW1iZXInIHx8XG4gICAgICAgIHByb2dyZXNzICE9PSBwcm9ncmVzcyB8fFxuICAgICAgICBwcm9ncmVzcyA8IDAgfHxcbiAgICAgICAgcHJvZ3Jlc3MgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcHJvZ3Jlc3MgPSAwO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgdG8gYSBwZXJjZW50YWdlIGZvciBzZXR0aW5nXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAocHJvZ3Jlc3MgKiAxMDApLnRvRml4ZWQoMikgKyAnJSc7XG5cbiAgICAvLyBTZXQgdGhlIG5ldyBiYXIgd2lkdGggb3IgaGVpZ2h0XG4gICAgaWYgKHRoaXMudmVydGljYWwoKSkge1xuICAgICAgYmFyLmVsKCkuc3R5bGUuaGVpZ2h0ID0gcGVyY2VudGFnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFyLmVsKCkuc3R5bGUud2lkdGggPSBwZXJjZW50YWdlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgZGlzdGFuY2UgZm9yIHNsaWRlclxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gZXZlbnQgRXZlbnQgb2JqZWN0XG4gICAqIEBtZXRob2QgY2FsY3VsYXRlRGlzdGFuY2VcbiAgICovXG4gIGNhbGN1bGF0ZURpc3RhbmNlKGV2ZW50KXtcbiAgICBsZXQgcG9zaXRpb24gPSBEb20uZ2V0UG9pbnRlclBvc2l0aW9uKHRoaXMuZWxfLCBldmVudCk7XG4gICAgaWYgKHRoaXMudmVydGljYWwoKSkge1xuICAgICAgcmV0dXJuIHBvc2l0aW9uLnk7XG4gICAgfVxuICAgIHJldHVybiBwb3NpdGlvbi54O1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBvbiBmb2N1cyBmb3Igc2xpZGVyXG4gICAqXG4gICAqIEBtZXRob2QgaGFuZGxlRm9jdXNcbiAgICovXG4gIGhhbmRsZUZvY3VzKCkge1xuICAgIHRoaXMub24odGhpcy5iYXIuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlQcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGtleSBwcmVzcyBmb3Igc2xpZGVyXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBldmVudCBFdmVudCBvYmplY3RcbiAgICogQG1ldGhvZCBoYW5kbGVLZXlQcmVzc1xuICAgKi9cbiAgaGFuZGxlS2V5UHJlc3MoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQud2hpY2ggPT09IDM3IHx8IGV2ZW50LndoaWNoID09PSA0MCkgeyAvLyBMZWZ0IGFuZCBEb3duIEFycm93c1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEJhY2soKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LndoaWNoID09PSAzOCB8fCBldmVudC53aGljaCA9PT0gMzkpIHsgLy8gVXAgYW5kIFJpZ2h0IEFycm93c1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RlcEZvcndhcmQoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG9uIGJsdXIgZm9yIHNsaWRlclxuICAgKlxuICAgKiBAbWV0aG9kIGhhbmRsZUJsdXJcbiAgICovXG4gIGhhbmRsZUJsdXIoKSB7XG4gICAgdGhpcy5vZmYodGhpcy5iYXIuZWxfLm93bmVyRG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5oYW5kbGVLZXlQcmVzcyk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuZXIgZm9yIGNsaWNrIGV2ZW50cyBvbiBzbGlkZXIsIHVzZWQgdG8gcHJldmVudCBjbGlja3NcbiAgICogICBmcm9tIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCBlbGVtZW50cyBsaWtlIGJ1dHRvbiBtZW51cy5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdFxuICAgKiBAbWV0aG9kIGhhbmRsZUNsaWNrXG4gICAqL1xuICBoYW5kbGVDbGljayhldmVudCkge1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0L3NldCBpZiBzbGlkZXIgaXMgaG9yaXpvbnRhbCBmb3IgdmVydGljYWxcbiAgICpcbiAgICogQHBhcmFtIHtCb29sZWFufSBib29sIFRydWUgaWYgc2xpZGVyIGlzIHZlcnRpY2FsLCBmYWxzZSBpcyBob3Jpem9udGFsXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IFRydWUgaWYgc2xpZGVyIGlzIHZlcnRpY2FsLCBmYWxzZSBpcyBob3Jpem9udGFsXG4gICAqIEBtZXRob2QgdmVydGljYWxcbiAgICovXG4gIHZlcnRpY2FsKGJvb2wpIHtcbiAgICBpZiAoYm9vbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbF8gfHwgZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy52ZXJ0aWNhbF8gPSAhIWJvb2w7XG5cbiAgICBpZiAodGhpcy52ZXJ0aWNhbF8pIHtcbiAgICAgIHRoaXMuYWRkQ2xhc3MoJ3Zqcy1zbGlkZXItdmVydGljYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hZGRDbGFzcygndmpzLXNsaWRlci1ob3Jpem9udGFsJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1NsaWRlcicsIFNsaWRlcik7XG5leHBvcnQgZGVmYXVsdCBTbGlkZXI7XG4iXX0=
},{"../component.js":66,"../utils/dom.js":144,"object.assign":53}],120:[function(_dereq_,module,exports){
/**
* @file flash-rtmp.js
*/
'use strict';
exports.__esModule = true;
function FlashRtmpDecorator(Flash) {
Flash.streamingFormats = {
'rtmp/mp4': 'MP4',
'rtmp/flv': 'FLV'
};
Flash.streamFromParts = function (connection, stream) {
return connection + '&' + stream;
};
Flash.streamToParts = function (src) {
var parts = {
connection: '',
stream: ''
};
if (!src) return parts;
// Look for the normal URL separator we expect, '&'.
// If found, we split the URL into two pieces around the
// first '&'.
var connEnd = src.search(/&(?!\w+=)/);
var streamBegin = undefined;
if (connEnd !== -1) {
streamBegin = connEnd + 1;
} else {
// If there's not a '&', we use the last '/' as the delimiter.
connEnd = streamBegin = src.lastIndexOf('/') + 1;
if (connEnd === 0) {
// really, there's not a '/'?
connEnd = streamBegin = src.length;
}
}
parts.connection = src.substring(0, connEnd);
parts.stream = src.substring(streamBegin, src.length);
return parts;
};
Flash.isStreamingType = function (srcType) {
return srcType in Flash.streamingFormats;
};
// RTMP has four variations, any string starting
// with one of these protocols should be valid
Flash.RTMP_RE = /^rtmp[set]?:\/\//i;
Flash.isStreamingSrc = function (src) {
return Flash.RTMP_RE.test(src);
};
/**
* A source handler for RTMP urls
* @type {Object}
*/
Flash.rtmpSourceHandler = {};
/**
* Check if Flash can play the given videotype
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.rtmpSourceHandler.canPlayType = function (type) {
if (Flash.isStreamingType(type)) {
return 'maybe';
}
return '';
};
/**
* Check if Flash can handle the source natively
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.rtmpSourceHandler.canHandleSource = function (source) {
var can = Flash.rtmpSourceHandler.canPlayType(source.type);
if (can) {
return can;
}
if (Flash.isStreamingSrc(source.src)) {
return 'maybe';
}
return '';
};
/**
* Pass the source to the flash object
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
* @param {Object} options The options to pass to the source
*/
Flash.rtmpSourceHandler.handleSource = function (source, tech, options) {
var srcParts = Flash.streamToParts(source.src);
tech['setRtmpConnection'](srcParts.connection);
tech['setRtmpStream'](srcParts.stream);
};
// Register the native source handler
Flash.registerSourceHandler(Flash.rtmpSourceHandler);
return Flash;
}
exports['default'] = FlashRtmpDecorator;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90ZWNoL2ZsYXNoLXJ0bXAuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBR0EsU0FBUyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUU7QUFDakMsT0FBSyxDQUFDLGdCQUFnQixHQUFHO0FBQ3ZCLGNBQVUsRUFBRSxLQUFLO0FBQ2pCLGNBQVUsRUFBRSxLQUFLO0dBQ2xCLENBQUM7O0FBRUYsT0FBSyxDQUFDLGVBQWUsR0FBRyxVQUFTLFVBQVUsRUFBRSxNQUFNLEVBQUU7QUFDbkQsV0FBTyxVQUFVLEdBQUcsR0FBRyxHQUFHLE1BQU0sQ0FBQztHQUNsQyxDQUFDOztBQUVGLE9BQUssQ0FBQyxhQUFhLEdBQUcsVUFBUyxHQUFHLEVBQUU7QUFDbEMsUUFBSSxLQUFLLEdBQUc7QUFDVixnQkFBVSxFQUFFLEVBQUU7QUFDZCxZQUFNLEVBQUUsRUFBRTtLQUNYLENBQUM7O0FBRUYsUUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEtBQUssQ0FBQzs7Ozs7QUFLdkIsUUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN0QyxRQUFJLFdBQVcsWUFBQSxDQUFDO0FBQ2hCLFFBQUksT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQ2xCLGlCQUFXLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztLQUMzQixNQUNJOztBQUVILGFBQU8sR0FBRyxXQUFXLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDakQsVUFBSSxPQUFPLEtBQUssQ0FBQyxFQUFFOztBQUVqQixlQUFPLEdBQUcsV0FBVyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7T0FDcEM7S0FDRjtBQUNELFNBQUssQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsU0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7O0FBRXRELFdBQU8sS0FBSyxDQUFDO0dBQ2QsQ0FBQzs7QUFFRixPQUFLLENBQUMsZUFBZSxHQUFHLFVBQVMsT0FBTyxFQUFFO0FBQ3hDLFdBQU8sT0FBTyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztHQUMxQyxDQUFDOzs7O0FBSUYsT0FBSyxDQUFDLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQzs7QUFFcEMsT0FBSyxDQUFDLGNBQWMsR0FBRyxVQUFTLEdBQUcsRUFBRTtBQUNuQyxXQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2hDLENBQUM7Ozs7OztBQU1GLE9BQUssQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7Ozs7Ozs7QUFPN0IsT0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxVQUFTLElBQUksRUFBQztBQUNsRCxRQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDL0IsYUFBTyxPQUFPLENBQUM7S0FDaEI7O0FBRUQsV0FBTyxFQUFFLENBQUM7R0FDWCxDQUFDOzs7Ozs7O0FBT0YsT0FBSyxDQUFDLGlCQUFpQixDQUFDLGVBQWUsR0FBRyxVQUFTLE1BQU0sRUFBQztBQUN4RCxRQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQzs7QUFFM0QsUUFBSSxHQUFHLEVBQUU7QUFDUCxhQUFPLEdBQUcsQ0FBQztLQUNaOztBQUVELFFBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUU7QUFDcEMsYUFBTyxPQUFPLENBQUM7S0FDaEI7O0FBRUQsV0FBTyxFQUFFLENBQUM7R0FDWCxDQUFDOzs7Ozs7Ozs7O0FBVUYsT0FBSyxDQUFDLGlCQUFpQixDQUFDLFlBQVksR0FBRyxVQUFTLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDO0FBQ3BFLFFBQUksUUFBUSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDOztBQUUvQyxRQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDL0MsUUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUN4QyxDQUFDOzs7QUFHRixPQUFLLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7O0FBRXJELFNBQU8sS0FBSyxDQUFDO0NBQ2Q7O3FCQUVjLGtCQUFrQiIsImZpbGUiOiJzcmMvanMvdGVjaC9mbGFzaC1ydG1wLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBmbGFzaC1ydG1wLmpzXG4gKi9cbmZ1bmN0aW9uIEZsYXNoUnRtcERlY29yYXRvcihGbGFzaCkge1xuICBGbGFzaC5zdHJlYW1pbmdGb3JtYXRzID0ge1xuICAgICdydG1wL21wNCc6ICdNUDQnLFxuICAgICdydG1wL2Zsdic6ICdGTFYnXG4gIH07XG5cbiAgRmxhc2guc3RyZWFtRnJvbVBhcnRzID0gZnVuY3Rpb24oY29ubmVjdGlvbiwgc3RyZWFtKSB7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb24gKyAnJicgKyBzdHJlYW07XG4gIH07XG5cbiAgRmxhc2guc3RyZWFtVG9QYXJ0cyA9IGZ1bmN0aW9uKHNyYykge1xuICAgIGxldCBwYXJ0cyA9IHtcbiAgICAgIGNvbm5lY3Rpb246ICcnLFxuICAgICAgc3RyZWFtOiAnJ1xuICAgIH07XG5cbiAgICBpZiAoIXNyYykgcmV0dXJuIHBhcnRzO1xuXG4gICAgLy8gTG9vayBmb3IgdGhlIG5vcm1hbCBVUkwgc2VwYXJhdG9yIHdlIGV4cGVjdCwgJyYnLlxuICAgIC8vIElmIGZvdW5kLCB3ZSBzcGxpdCB0aGUgVVJMIGludG8gdHdvIHBpZWNlcyBhcm91bmQgdGhlXG4gICAgLy8gZmlyc3QgJyYnLlxuICAgIGxldCBjb25uRW5kID0gc3JjLnNlYXJjaCgvJig/IVxcdys9KS8pO1xuICAgIGxldCBzdHJlYW1CZWdpbjtcbiAgICBpZiAoY29ubkVuZCAhPT0gLTEpIHtcbiAgICAgIHN0cmVhbUJlZ2luID0gY29ubkVuZCArIDE7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgLy8gSWYgdGhlcmUncyBub3QgYSAnJicsIHdlIHVzZSB0aGUgbGFzdCAnLycgYXMgdGhlIGRlbGltaXRlci5cbiAgICAgIGNvbm5FbmQgPSBzdHJlYW1CZWdpbiA9IHNyYy5sYXN0SW5kZXhPZignLycpICsgMTtcbiAgICAgIGlmIChjb25uRW5kID09PSAwKSB7XG4gICAgICAgIC8vIHJlYWxseSwgdGhlcmUncyBub3QgYSAnLyc/XG4gICAgICAgIGNvbm5FbmQgPSBzdHJlYW1CZWdpbiA9IHNyYy5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHBhcnRzLmNvbm5lY3Rpb24gPSBzcmMuc3Vic3RyaW5nKDAsIGNvbm5FbmQpO1xuICAgIHBhcnRzLnN0cmVhbSA9IHNyYy5zdWJzdHJpbmcoc3RyZWFtQmVnaW4sIHNyYy5sZW5ndGgpO1xuXG4gICAgcmV0dXJuIHBhcnRzO1xuICB9O1xuXG4gIEZsYXNoLmlzU3RyZWFtaW5nVHlwZSA9IGZ1bmN0aW9uKHNyY1R5cGUpIHtcbiAgICByZXR1cm4gc3JjVHlwZSBpbiBGbGFzaC5zdHJlYW1pbmdGb3JtYXRzO1xuICB9O1xuXG4gIC8vIFJUTVAgaGFzIGZvdXIgdmFyaWF0aW9ucywgYW55IHN0cmluZyBzdGFydGluZ1xuICAvLyB3aXRoIG9uZSBvZiB0aGVzZSBwcm90b2NvbHMgc2hvdWxkIGJlIHZhbGlkXG4gIEZsYXNoLlJUTVBfUkUgPSAvXnJ0bXBbc2V0XT86XFwvXFwvL2k7XG5cbiAgRmxhc2guaXNTdHJlYW1pbmdTcmMgPSBmdW5jdGlvbihzcmMpIHtcbiAgICByZXR1cm4gRmxhc2guUlRNUF9SRS50ZXN0KHNyYyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEEgc291cmNlIGhhbmRsZXIgZm9yIFJUTVAgdXJsc1xuICAgKiBAdHlwZSB7T2JqZWN0fVxuICAgKi9cbiAgRmxhc2gucnRtcFNvdXJjZUhhbmRsZXIgPSB7fTtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgRmxhc2ggY2FuIHBsYXkgdGhlIGdpdmVuIHZpZGVvdHlwZVxuICAgKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUgICAgVGhlIG1pbWV0eXBlIHRvIGNoZWNrXG4gICAqIEByZXR1cm4ge1N0cmluZ30gICAgICAgICAncHJvYmFibHknLCAnbWF5YmUnLCBvciAnJyAoZW1wdHkgc3RyaW5nKVxuICAgKi9cbiAgRmxhc2gucnRtcFNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUgPSBmdW5jdGlvbih0eXBlKXtcbiAgICBpZiAoRmxhc2guaXNTdHJlYW1pbmdUeXBlKHR5cGUpKSB7XG4gICAgICByZXR1cm4gJ21heWJlJztcbiAgICB9XG5cbiAgICByZXR1cm4gJyc7XG4gIH07XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIEZsYXNoIGNhbiBoYW5kbGUgdGhlIHNvdXJjZSBuYXRpdmVseVxuICAgKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZSAgVGhlIHNvdXJjZSBvYmplY3RcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuICBGbGFzaC5ydG1wU291cmNlSGFuZGxlci5jYW5IYW5kbGVTb3VyY2UgPSBmdW5jdGlvbihzb3VyY2Upe1xuICAgIGxldCBjYW4gPSBGbGFzaC5ydG1wU291cmNlSGFuZGxlci5jYW5QbGF5VHlwZShzb3VyY2UudHlwZSk7XG5cbiAgICBpZiAoY2FuKSB7XG4gICAgICByZXR1cm4gY2FuO1xuICAgIH1cblxuICAgIGlmIChGbGFzaC5pc1N0cmVhbWluZ1NyYyhzb3VyY2Uuc3JjKSkge1xuICAgICAgcmV0dXJuICdtYXliZSc7XG4gICAgfVxuXG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQYXNzIHRoZSBzb3VyY2UgdG8gdGhlIGZsYXNoIG9iamVjdFxuICAgKiBBZGFwdGl2ZSBzb3VyY2UgaGFuZGxlcnMgd2lsbCBoYXZlIG1vcmUgY29tcGxpY2F0ZWQgd29ya2Zsb3dzIGJlZm9yZSBwYXNzaW5nXG4gICAqIHZpZGVvIGRhdGEgdG8gdGhlIHZpZGVvIGVsZW1lbnRcbiAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2UgICBUaGUgc291cmNlIG9iamVjdFxuICAgKiBAcGFyYW0gIHtGbGFzaH0gIHRlY2ggICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgRmxhc2ggdGVjaFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgIFRoZSBvcHRpb25zIHRvIHBhc3MgdG8gdGhlIHNvdXJjZVxuICAgKi9cbiAgRmxhc2gucnRtcFNvdXJjZUhhbmRsZXIuaGFuZGxlU291cmNlID0gZnVuY3Rpb24oc291cmNlLCB0ZWNoLCBvcHRpb25zKXtcbiAgICBsZXQgc3JjUGFydHMgPSBGbGFzaC5zdHJlYW1Ub1BhcnRzKHNvdXJjZS5zcmMpO1xuXG4gICAgdGVjaFsnc2V0UnRtcENvbm5lY3Rpb24nXShzcmNQYXJ0cy5jb25uZWN0aW9uKTtcbiAgICB0ZWNoWydzZXRSdG1wU3RyZWFtJ10oc3JjUGFydHMuc3RyZWFtKTtcbiAgfTtcblxuICAvLyBSZWdpc3RlciB0aGUgbmF0aXZlIHNvdXJjZSBoYW5kbGVyXG4gIEZsYXNoLnJlZ2lzdGVyU291cmNlSGFuZGxlcihGbGFzaC5ydG1wU291cmNlSGFuZGxlcik7XG5cbiAgcmV0dXJuIEZsYXNoO1xufVxuXG5leHBvcnQgZGVmYXVsdCBGbGFzaFJ0bXBEZWNvcmF0b3I7XG4iXX0=
},{}],121:[function(_dereq_,module,exports){
/**
* @file flash.js
* VideoJS-SWF - Custom Flash Player with HTML5-ish API
* https://github.com/zencoder/video-js-swf
* Not using setupTriggers. Using global onEvent func to distribute events
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _tech = _dereq_('./tech');
var _tech2 = _interopRequireDefault(_tech);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsUrlJs = _dereq_('../utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
var _flashRtmp = _dereq_('./flash-rtmp');
var _flashRtmp2 = _interopRequireDefault(_flashRtmp);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var navigator = _globalWindow2['default'].navigator;
/**
* Flash Media Controller - Wrapper for fallback SWF API
*
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Tech
* @class Flash
*/
var Flash = (function (_Tech) {
_inherits(Flash, _Tech);
function Flash(options, ready) {
_classCallCheck(this, Flash);
_Tech.call(this, options, ready);
// Set the source when ready
if (options.source) {
this.ready(function () {
this.setSource(options.source);
}, true);
}
// Having issues with Flash reloading on certain page actions (hide/resize/fullscreen) in certain browsers
// This allows resetting the playhead when we catch the reload
if (options.startTime) {
this.ready(function () {
this.load();
this.play();
this.currentTime(options.startTime);
}, true);
}
// Add global window functions that the swf expects
// A 4.x workflow we weren't able to solve for in 5.0
// because of the need to hard code these functions
// into the swf for security reasons
_globalWindow2['default'].videojs = _globalWindow2['default'].videojs || {};
_globalWindow2['default'].videojs.Flash = _globalWindow2['default'].videojs.Flash || {};
_globalWindow2['default'].videojs.Flash.onReady = Flash.onReady;
_globalWindow2['default'].videojs.Flash.onEvent = Flash.onEvent;
_globalWindow2['default'].videojs.Flash.onError = Flash.onError;
this.on('seeked', function () {
this.lastSeekTarget_ = undefined;
});
}
// Create setters and getters for attributes
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Flash.prototype.createEl = function createEl() {
var options = this.options_;
// If video.js is hosted locally you should also set the location
// for the hosted swf, which should be relative to the page (not video.js)
// Otherwise this adds a CDN url.
// The CDN also auto-adds a swf URL for that specific version.
if (!options.swf) {
options.swf = '//cdn.rawgit.com/hola/video-js-swf-sv/v5.1.0-4/dist/video-js.swf';
}
// Generate ID for swf object
var objId = options.techId;
if (options.accelerated) {
// setup params needed for hardware acceleration
options.params = _objectAssign2['default'](options.params || {}, {
allowfullscreen: true,
wmode: 'direct'
});
}
// Merge default flashvars with ones passed in to init
var flashVars = _objectAssign2['default']({
// SWF Callback Functions
'readyFunction': 'videojs.Flash.onReady',
'eventProxyFunction': 'videojs.Flash.onEvent',
'errorEventProxyFunction': 'videojs.Flash.onError',
// Player Settings
'accelerated': options.accelerated,
'autoplay': options.autoplay,
'controls': options.controls,
'poster': options.poster,
'preload': options.preload,
'loop': options.loop,
'muted': options.muted
}, options.flashVars);
// Merge default parames with ones passed in
var params = _objectAssign2['default']({
'allowfullscreen': true,
'wmode': 'opaque', // Opaque is needed to overlay controls, but can affect playback performance
'bgcolor': '#000000' // Using bgcolor prevents a white flash when the object is loading
}, options.params);
// Merge default attributes with ones passed in
var attributes = _objectAssign2['default']({
'id': objId,
'name': objId, // Both ID and Name needed or swf to identify itself
'class': 'vjs-tech'
}, options.attributes);
this.el_ = Flash.embed(options.swf, flashVars, params, attributes);
this.el_.tech = this;
return this.el_;
};
/**
* Play for flash tech
*
* @method play
*/
Flash.prototype.play = function play() {
if (this.ended()) {
this.setCurrentTime(0);
}
this.el_.vjs_play();
};
/**
* Pause for flash tech
*
* @method pause
*/
Flash.prototype.pause = function pause() {
this.el_.vjs_pause();
};
/**
* Get/set video
*
* @param {Object=} src Source object
* @return {Object}
* @method src
*/
Flash.prototype.src = function src(_src) {
if (_src === undefined) {
return this.currentSrc();
}
// Setting src through `src` not `setSrc` will be deprecated
return this.setSrc(_src);
};
/**
* Set video
*
* @param {Object=} src Source object
* @deprecated
* @method setSrc
*/
Flash.prototype.setSrc = function setSrc(src) {
// Make sure source URL is absolute.
src = Url.getAbsoluteURL(src);
this.el_.vjs_src(src);
// Currently the SWF doesn't autoplay if you load a source later.
// e.g. Load player w/ no source, wait 2s, set src.
if (this.autoplay()) {
var tech = this;
this.setTimeout(function () {
tech.play();
}, 0);
}
};
/**
* Returns true if the tech is currently seeking.
* @return {boolean} true if seeking
*/
Flash.prototype.seeking = function seeking() {
return this.lastSeekTarget_ !== undefined;
};
/**
* Set current time
*
* @param {Number} time Current time of video
* @method setCurrentTime
*/
Flash.prototype.setCurrentTime = function setCurrentTime(time) {
var seekable = this.seekable();
if (seekable.length) {
// clamp to the current seekable range
time = time > seekable.start(0) ? time : seekable.start(0);
time = time < seekable.end(seekable.length - 1) ? time : seekable.end(seekable.length - 1);
this.lastSeekTarget_ = time;
this.trigger('seeking');
this.el_.vjs_setProperty('currentTime', time);
_Tech.prototype.setCurrentTime.call(this);
}
};
/**
* Get current time
*
* @param {Number=} time Current time of video
* @return {Number} Current time
* @method currentTime
*/
Flash.prototype.currentTime = function currentTime(time) {
// when seeking make the reported time keep up with the requested time
// by reading the time we're seeking to
if (this.seeking()) {
return this.lastSeekTarget_ || 0;
}
return this.el_.vjs_getProperty('currentTime');
};
/**
* Get current source
*
* @method currentSrc
*/
Flash.prototype.currentSrc = function currentSrc() {
if (this.currentSource_) {
return this.currentSource_.src;
} else {
return this.el_.vjs_getProperty('currentSrc');
}
};
/**
* Load media into player
*
* @method load
*/
Flash.prototype.load = function load() {
this.el_.vjs_load();
};
/**
* Determine if can seek in media
*
* @return {TimeRangeObject}
* @method seekable
*/
Flash.prototype.seekable = function seekable() {
var duration = this.duration();
if (duration === 0) {
return _utilsTimeRangesJs.createTimeRange();
}
return _utilsTimeRangesJs.createTimeRange(0, duration);
};
/**
* Get buffered time range
*
* @return {TimeRangeObject}
* @method buffered
*/
Flash.prototype.buffered = function buffered() {
var ranges = this.el_.vjs_getProperty('buffered');
if (ranges.length === 0) {
return _utilsTimeRangesJs.createTimeRange();
}
return _utilsTimeRangesJs.createTimeRange(ranges[0][0], ranges[0][1]);
};
/**
* Get fullscreen support -
* Flash does not allow fullscreen through javascript
* so always returns false
*
* @return {Boolean} false
* @method supportsFullScreen
*/
Flash.prototype.supportsFullScreen = function supportsFullScreen() {
return false; // Flash does not allow fullscreen through javascript
};
/**
* Request to enter fullscreen
* Flash does not allow fullscreen through javascript
* so always returns false
*
* @return {Boolean} false
* @method enterFullScreen
*/
Flash.prototype.enterFullScreen = function enterFullScreen() {
return false;
};
return Flash;
})(_tech2['default']);
var _api = Flash.prototype;
var _readWrite = 'rtmpConnection,rtmpStream,preload,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted,poster'.split(',');
var _readOnly = 'networkState,readyState,initialTime,duration,startOffsetTime,paused,ended,videoWidth,videoHeight'.split(',');
function _createSetter(attr) {
var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
_api['set' + attrUpper] = function (val) {
return this.el_.vjs_setProperty(attr, val);
};
}
function _createGetter(attr) {
_api[attr] = function () {
return this.el_.vjs_getProperty(attr);
};
}
// Create getter and setters for all read/write attributes
for (var i = 0; i < _readWrite.length; i++) {
_createGetter(_readWrite[i]);
_createSetter(_readWrite[i]);
}
// Create getters for read-only attributes
for (var i = 0; i < _readOnly.length; i++) {
_createGetter(_readOnly[i]);
}
/* Flash Support Testing -------------------------------------------------------- */
Flash.isSupported = function () {
return Flash.version()[0] >= 10;
// return swfobject.hasFlashPlayerVersion('10');
};
// Add Source Handler pattern functions to this tech
_tech2['default'].withSourceHandlers(Flash);
/*
* The default native source handler.
* This simply passes the source to the video element. Nothing fancy.
*
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
*/
Flash.nativeSourceHandler = {};
/**
* Check if Flash can play the given videotype
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.nativeSourceHandler.canPlayType = function (type) {
if (type in Flash.formats) {
return 'maybe';
}
return '';
};
/*
* Check Flash can handle the source natively
*
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Flash.nativeSourceHandler.canHandleSource = function (source) {
var type;
function guessMimeType(src) {
var ext = Url.getFileExtension(src);
if (ext) {
return 'video/' + ext;
}
return '';
}
if (!source.type) {
type = guessMimeType(source.src);
} else {
// Strip code information from the type because we don't get that specific
type = source.type.replace(/;.*/, '').toLowerCase();
}
return Flash.nativeSourceHandler.canPlayType(type);
};
/*
* Pass the source to the flash object
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
*
* @param {Object} source The source object
* @param {Flash} tech The instance of the Flash tech
* @param {Object} options The options to pass to the source
*/
Flash.nativeSourceHandler.handleSource = function (source, tech, options) {
tech.setSrc(source.src);
};
/*
* Clean up the source handler when disposing the player or switching sources..
* (no cleanup is needed when supporting the format natively)
*/
Flash.nativeSourceHandler.dispose = function () {};
// Register the native source handler
Flash.registerSourceHandler(Flash.nativeSourceHandler);
Flash.formats = {
'video/flv': 'FLV',
'video/x-flv': 'FLV',
'video/mp4': 'MP4',
'video/m4v': 'MP4'
};
Flash.onReady = function (currSwf) {
var el = Dom.getEl(currSwf);
var tech = el && el.tech;
// if there is no el then the tech has been disposed
// and the tech element was removed from the player div
if (tech && tech.el()) {
// check that the flash object is really ready
Flash.checkReady(tech);
}
};
// The SWF isn't always ready when it says it is. Sometimes the API functions still need to be added to the object.
// If it's not ready, we set a timeout to check again shortly.
Flash.checkReady = function (tech) {
// stop worrying if the tech has been disposed
if (!tech.el()) {
return;
}
// check if API property exists
if (tech.el().vjs_getProperty) {
// tell tech it's ready
tech.triggerReady();
} else {
// wait longer
this.setTimeout(function () {
Flash['checkReady'](tech);
}, 50);
}
};
// Trigger events from the swf on the player
Flash.onEvent = function (swfID, eventName) {
var tech = Dom.getEl(swfID).tech;
tech.trigger(eventName);
};
// Log errors from the swf
Flash.onError = function (swfID, err) {
var tech = Dom.getEl(swfID).tech;
// trigger MEDIA_ERR_SRC_NOT_SUPPORTED
if (err === 'srcnotfound') {
return tech.error(4);
}
// trigger a custom error
tech.error('FLASH: ' + err);
};
// Flash Version Check
Flash.version = function () {
var version = '0,0,0';
// IE
try {
version = new _globalWindow2['default'].ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
// other browsers
} catch (e) {
try {
if (navigator.mimeTypes['application/x-shockwave-flash'].enabledPlugin) {
version = (navigator.plugins['Shockwave Flash 2.0'] || navigator.plugins['Shockwave Flash']).description.replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
}
} catch (err) {}
}
return version.split(',');
};
// Flash embedding method. Only used in non-iframe mode
Flash.embed = function (swf, flashVars, params, attributes) {
var code = Flash.getEmbedCode(swf, flashVars, params, attributes);
// Get element by embedding code and retrieving created element
var obj = Dom.createEl('div', { innerHTML: code }).childNodes[0];
return obj;
};
Flash.getEmbedCode = function (swf, flashVars, params, attributes) {
var objTag = '';
});
attributes = _objectAssign2['default']({
// Add swf to attributes (need both for IE and Others to work)
'data': swf,
// Default to 100% width/height
'width': '100%',
'height': '100%'
}, attributes);
// Create Attributes string
Object.getOwnPropertyNames(attributes).forEach(function (key) {
attrsString += key + '="' + attributes[key] + '" ';
});
return '' + objTag + attrsString + '>' + paramsString + '';
};
// Run Flash through the RTMP decorator
_flashRtmp2['default'](Flash);
_component2['default'].registerComponent('Flash', Flash);
_tech2['default'].registerTech('Flash', Flash);
exports['default'] = Flash;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90ZWNoL2ZsYXNoLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7b0JBT2lCLFFBQVE7Ozs7MEJBQ0osaUJBQWlCOztJQUExQixHQUFHOzswQkFDTSxpQkFBaUI7O0lBQTFCLEdBQUc7O2lDQUNpQix5QkFBeUI7O3lCQUMxQixjQUFjOzs7O3lCQUN2QixjQUFjOzs7OzRCQUNqQixlQUFlOzs7OzRCQUNmLGVBQWU7Ozs7QUFFbEMsSUFBSSxTQUFTLEdBQUcsMEJBQU8sU0FBUyxDQUFDOzs7Ozs7Ozs7O0lBUzNCLEtBQUs7WUFBTCxLQUFLOztBQUVFLFdBRlAsS0FBSyxDQUVHLE9BQU8sRUFBRSxLQUFLLEVBQUM7MEJBRnZCLEtBQUs7O0FBR1AscUJBQU0sT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDOzs7QUFHdEIsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLFVBQUksQ0FBQyxLQUFLLENBQUMsWUFBVTtBQUNuQixZQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztPQUNoQyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ1Y7Ozs7QUFJRCxRQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7QUFDckIsVUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFVO0FBQ25CLFlBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNaLFlBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNaLFlBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO09BQ3JDLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDVjs7Ozs7O0FBTUQsOEJBQU8sT0FBTyxHQUFHLDBCQUFPLE9BQU8sSUFBSSxFQUFFLENBQUM7QUFDdEMsOEJBQU8sT0FBTyxDQUFDLEtBQUssR0FBRywwQkFBTyxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztBQUNsRCw4QkFBTyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FB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TyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNuQixLQUFLIiwiZmlsZSI6InNyYy9qcy90ZWNoL2ZsYXNoLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBmbGFzaC5qc1xuICogVmlkZW9KUy1TV0YgLSBDdXN0b20gRmxhc2ggUGxheWVyIHdpdGggSFRNTDUtaXNoIEFQSVxuICogaHR0cHM6Ly9naXRodWIuY29tL3plbmNvZGVyL3ZpZGVvLWpzLXN3ZlxuICogTm90IHVzaW5nIHNldHVwVHJpZ2dlcnMuIFVzaW5nIGdsb2JhbCBvbkV2ZW50IGZ1bmMgdG8gZGlzdHJpYnV0ZSBldmVudHNcbiAqL1xuXG5pbXBvcnQgVGVjaCBmcm9tICcuL3RlY2gnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4uL3V0aWxzL2RvbS5qcyc7XG5pbXBvcnQgKiBhcyBVcmwgZnJvbSAnLi4vdXRpbHMvdXJsLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVSYW5nZSB9IGZyb20gJy4uL3V0aWxzL3RpbWUtcmFuZ2VzLmpzJztcbmltcG9ydCBGbGFzaFJ0bXBEZWNvcmF0b3IgZnJvbSAnLi9mbGFzaC1ydG1wJztcbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgYXNzaWduIGZyb20gJ29iamVjdC5hc3NpZ24nO1xuXG5sZXQgbmF2aWdhdG9yID0gd2luZG93Lm5hdmlnYXRvcjtcbi8qKlxuICogRmxhc2ggTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIGZhbGxiYWNrIFNXRiBBUElcbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAcGFyYW0ge0Z1bmN0aW9uPX0gcmVhZHkgUmVhZHkgY2FsbGJhY2sgZnVuY3Rpb25cbiAqIEBleHRlbmRzIFRlY2hcbiAqIEBjbGFzcyBGbGFzaFxuICovXG5jbGFzcyBGbGFzaCBleHRlbmRzIFRlY2gge1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMsIHJlYWR5KXtcbiAgICBzdXBlcihvcHRpb25zLCByZWFkeSk7XG5cbiAgICAvLyBTZXQgdGhlIHNvdXJjZSB3aGVuIHJlYWR5XG4gICAgaWYgKG9wdGlvbnMuc291cmNlKSB7XG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMuc2V0U291cmNlKG9wdGlvbnMuc291cmNlKTtcbiAgICAgIH0sIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEhhdmluZyBpc3N1ZXMgd2l0aCBGbGFzaCByZWxvYWRpbmcgb24gY2VydGFpbiBwYWdlIGFjdGlvbnMgKGhpZGUvcmVzaXplL2Z1bGxzY3JlZW4pIGluIGNlcnRhaW4gYnJvd3NlcnNcbiAgICAvLyBUaGlzIGFsbG93cyByZXNldHRpbmcgdGhlIHBsYXloZWFkIHdoZW4gd2UgY2F0Y2ggdGhlIHJlbG9hZFxuICAgIGlmIChvcHRpb25zLnN0YXJ0VGltZSkge1xuICAgICAgdGhpcy5yZWFkeShmdW5jdGlvbigpe1xuICAgICAgICB0aGlzLmxvYWQoKTtcbiAgICAgICAgdGhpcy5wbGF5KCk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWUob3B0aW9ucy5zdGFydFRpbWUpO1xuICAgICAgfSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGdsb2JhbCB3aW5kb3cgZnVuY3Rpb25zIHRoYXQgdGhlIHN3ZiBleHBlY3RzXG4gICAgLy8gQSA0Lnggd29ya2Zsb3cgd2Ugd2VyZW4ndCBhYmxlIHRvIHNvbHZlIGZvciBpbiA1LjBcbiAgICAvLyBiZWNhdXNlIG9mIHRoZSBuZWVkIHRvIGhhcmQgY29kZSB0aGVzZSBmdW5jdGlvbnNcbiAgICAvLyBpbnRvIHRoZSBzd2YgZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICB3aW5kb3cudmlkZW9qcyA9IHdpbmRvdy52aWRlb2pzIHx8IHt9O1xuICAgIHdpbmRvdy52aWRlb2pzLkZsYXNoID0gd2luZG93LnZpZGVvanMuRmxhc2ggfHwge307XG4gICAgd2luZG93LnZpZGVvanMuRmxhc2gub25SZWFkeSA9IEZsYXNoLm9uUmVhZHk7XG4gICAgd2luZG93LnZpZGVvanMuRmxhc2gub25FdmVudCA9IEZsYXNoLm9uRXZlbnQ7XG4gICAgd2luZG93LnZpZGVvanMuRmxhc2gub25FcnJvciA9IEZsYXNoLm9uRXJyb3I7XG5cbiAgICB0aGlzLm9uKCdzZWVrZWQnLCBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMubGFzdFNlZWtUYXJnZXRfID0gdW5kZWZpbmVkO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgbGV0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnNfO1xuXG4gICAgLy8gSWYgdmlkZW8uanMgaXMgaG9zdGVkIGxvY2FsbHkgeW91IHNob3VsZCBhbHNvIHNldCB0aGUgbG9jYXRpb25cbiAgICAvLyBmb3IgdGhlIGhvc3RlZCBzd2YsIHdoaWNoIHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGFnZSAobm90IHZpZGVvLmpzKVxuICAgIC8vIE90aGVyd2lzZSB0aGlzIGFkZHMgYSBDRE4gdXJsLlxuICAgIC8vIFRoZSBDRE4gYWxzbyBhdXRvLWFkZHMgYSBzd2YgVVJMIGZvciB0aGF0IHNwZWNpZmljIHZlcnNpb24uXG4gICAgaWYgKCFvcHRpb25zLnN3Zikge1xuICAgICAgb3B0aW9ucy5zd2YgPSAnLy9jZG4ucmF3Z2l0LmNvbS9ob2xhL3ZpZGVvLWpzLXN3Zi1zdi92X19TV0ZfVkVSU0lPTl9fL2Rpc3QvdmlkZW8tanMuc3dmJztcbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBJRCBmb3Igc3dmIG9iamVjdFxuICAgIGxldCBvYmpJZCA9IG9wdGlvbnMudGVjaElkO1xuXG4gICAgaWYgKG9wdGlvbnMuYWNjZWxlcmF0ZWQpXG4gICAge1xuICAgICAgICAvLyBzZXR1cCBwYXJhbXMgbmVlZGVkIGZvciBoYXJkd2FyZSBhY2NlbGVyYXRpb25cbiAgICAgICAgb3B0aW9ucy5wYXJhbXMgPSBhc3NpZ24ob3B0aW9ucy5wYXJhbXN8fHt9LCB7XG4gICAgICAgICAgICBhbGxvd2Z1bGxzY3JlZW46IHRydWUsXG4gICAgICAgICAgICB3bW9kZTogJ2RpcmVjdCcsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE1lcmdlIGRlZmF1bHQgZmxhc2h2YXJzIHdpdGggb25lcyBwYXNzZWQgaW4gdG8gaW5pdFxuICAgIGxldCBmbGFzaFZhcnMgPSBhc3NpZ24oe1xuXG4gICAgICAvLyBTV0YgQ2FsbGJhY2sgRnVuY3Rpb25zXG4gICAgICAncmVhZHlGdW5jdGlvbic6ICd2aWRlb2pzLkZsYXNoLm9uUmVhZHknLFxuICAgICAgJ2V2ZW50UHJveHlGdW5jdGlvbic6ICd2aWRlb2pzLkZsYXNoLm9uRXZlbnQnLFxuICAgICAgJ2Vycm9yRXZlbnRQcm94eUZ1bmN0aW9uJzogJ3ZpZGVvanMuRmxhc2gub25FcnJvcicsXG5cbiAgICAgIC8vIFBsYXllciBTZXR0aW5nc1xuICAgICAgJ2FjY2VsZXJhdGVkJzogb3B0aW9ucy5hY2NlbGVyYXRlZCxcbiAgICAgICdhdXRvcGxheSc6IG9wdGlvbnMuYXV0b3BsYXksXG4gICAgICAnY29udHJvbHMnOiBvcHRpb25zLmNvbnRyb2xzLFxuICAgICAgJ3Bvc3Rlcic6IG9wdGlvbnMucG9zdGVyLFxuICAgICAgJ3ByZWxvYWQnOiBvcHRpb25zLnByZWxvYWQsXG4gICAgICAnbG9vcCc6IG9wdGlvbnMubG9vcCxcbiAgICAgICdtdXRlZCc6IG9wdGlvbnMubXV0ZWRcblxuICAgIH0sIG9wdGlvbnMuZmxhc2hWYXJzKTtcblxuICAgIC8vIE1lcmdlIGRlZmF1bHQgcGFyYW1lcyB3aXRoIG9uZXMgcGFzc2VkIGluXG4gICAgbGV0IHBhcmFtcyA9IGFzc2lnbih7XG4gICAgICAnYWxsb3dmdWxsc2NyZWVuJzogdHJ1ZSxcbiAgICAgICd3bW9kZSc6ICdvcGFxdWUnLCAvLyBPcGFxdWUgaXMgbmVlZGVkIHRvIG92ZXJsYXkgY29udHJvbHMsIGJ1dCBjYW4gYWZmZWN0IHBsYXliYWNrIHBlcmZvcm1hbmNlXG4gICAgICAnYmdjb2xvcic6ICcjMDAwMDAwJyAvLyBVc2luZyBiZ2NvbG9yIHByZXZlbnRzIGEgd2hpdGUgZmxhc2ggd2hlbiB0aGUgb2JqZWN0IGlzIGxvYWRpbmdcbiAgICB9LCBvcHRpb25zLnBhcmFtcyk7XG5cbiAgICAvLyBNZXJnZSBkZWZhdWx0IGF0dHJpYnV0ZXMgd2l0aCBvbmVzIHBhc3NlZCBpblxuICAgIGxldCBhdHRyaWJ1dGVzID0gYXNzaWduKHtcbiAgICAgICdpZCc6IG9iaklkLFxuICAgICAgJ25hbWUnOiBvYmpJZCwgLy8gQm90aCBJRCBhbmQgTmFtZSBuZWVkZWQgb3Igc3dmIHRvIGlkZW50aWZ5IGl0c2VsZlxuICAgICAgJ2NsYXNzJzogJ3Zqcy10ZWNoJ1xuICAgIH0sIG9wdGlvbnMuYXR0cmlidXRlcyk7XG5cbiAgICB0aGlzLmVsXyA9IEZsYXNoLmVtYmVkKG9wdGlvbnMuc3dmLCBmbGFzaFZhcnMsIHBhcmFtcywgYXR0cmlidXRlcyk7XG4gICAgdGhpcy5lbF8udGVjaCA9IHRoaXM7XG5cbiAgICByZXR1cm4gdGhpcy5lbF87XG4gIH1cblxuICAvKipcbiAgICogUGxheSBmb3IgZmxhc2ggdGVjaFxuICAgKlxuICAgKiBAbWV0aG9kIHBsYXlcbiAgICovXG4gIHBsYXkoKSB7XG4gICAgaWYgKHRoaXMuZW5kZWQoKSkge1xuICAgICAgdGhpcy5zZXRDdXJyZW50VGltZSgwKTtcbiAgICB9XG4gICAgdGhpcy5lbF8udmpzX3BsYXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXVzZSBmb3IgZmxhc2ggdGVjaFxuICAgKlxuICAgKiBAbWV0aG9kIHBhdXNlXG4gICAqL1xuICBwYXVzZSgpIHtcbiAgICB0aGlzLmVsXy52anNfcGF1c2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHZpZGVvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gc3JjIFNvdXJjZSBvYmplY3RcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAbWV0aG9kIHNyY1xuICAgKi9cbiAgc3JjKHNyYykge1xuICAgIGlmIChzcmMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNyYygpO1xuICAgIH1cblxuICAgIC8vIFNldHRpbmcgc3JjIHRocm91Z2ggYHNyY2Agbm90IGBzZXRTcmNgIHdpbGwgYmUgZGVwcmVjYXRlZFxuICAgIHJldHVybiB0aGlzLnNldFNyYyhzcmMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB2aWRlb1xuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdD19IHNyYyBTb3VyY2Ugb2JqZWN0XG4gICAqIEBkZXByZWNhdGVkXG4gICAqIEBtZXRob2Qgc2V0U3JjXG4gICAqL1xuICBzZXRTcmMoc3JjKSB7XG4gICAgLy8gTWFrZSBzdXJlIHNvdXJjZSBVUkwgaXMgYWJzb2x1dGUuXG4gICAgc3JjID0gVXJsLmdldEFic29sdXRlVVJMKHNyYyk7XG4gICAgdGhpcy5lbF8udmpzX3NyYyhzcmMpO1xuXG4gICAgLy8gQ3VycmVudGx5IHRoZSBTV0YgZG9lc24ndCBhdXRvcGxheSBpZiB5b3UgbG9hZCBhIHNvdXJjZSBsYXRlci5cbiAgICAvLyBlLmcuIExvYWQgcGxheWVyIHcvIG5vIHNvdXJjZSwgd2FpdCAycywgc2V0IHNyYy5cbiAgICBpZiAodGhpcy5hdXRvcGxheSgpKSB7XG4gICAgICB2YXIgdGVjaCA9IHRoaXM7XG4gICAgICB0aGlzLnNldFRpbWVvdXQoZnVuY3Rpb24oKXsgdGVjaC5wbGF5KCk7IH0sIDApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRlY2ggaXMgY3VycmVudGx5IHNlZWtpbmcuXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgc2Vla2luZ1xuICAgKi9cbiAgc2Vla2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0U2Vla1RhcmdldF8gIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY3VycmVudCB0aW1lXG4gICAqXG4gICAqIEBwYXJhbSB7TnVtYmVyfSB0aW1lIEN1cnJlbnQgdGltZSBvZiB2aWRlb1xuICAgKiBAbWV0aG9kIHNldEN1cnJlbnRUaW1lXG4gICAqL1xuICBzZXRDdXJyZW50VGltZSh0aW1lKSB7XG4gICAgbGV0IHNlZWthYmxlID0gdGhpcy5zZWVrYWJsZSgpO1xuICAgIGlmIChzZWVrYWJsZS5sZW5ndGgpIHtcbiAgICAgIC8vIGNsYW1wIHRvIHRoZSBjdXJyZW50IHNlZWthYmxlIHJhbmdlXG4gICAgICB0aW1lID0gdGltZSA+IHNlZWthYmxlLnN0YXJ0KDApID8gdGltZSA6IHNlZWthYmxlLnN0YXJ0KDApO1xuICAgICAgdGltZSA9IHRpbWUgPCBzZWVrYWJsZS5lbmQoc2Vla2FibGUubGVuZ3RoIC0gMSkgPyB0aW1lIDogc2Vla2FibGUuZW5kKHNlZWthYmxlLmxlbmd0aCAtIDEpO1xuXG4gICAgICB0aGlzLmxhc3RTZWVrVGFyZ2V0XyA9IHRpbWU7XG4gICAgICB0aGlzLnRyaWdnZXIoJ3NlZWtpbmcnKTtcbiAgICAgIHRoaXMuZWxfLnZqc19zZXRQcm9wZXJ0eSgnY3VycmVudFRpbWUnLCB0aW1lKTtcbiAgICAgIHN1cGVyLnNldEN1cnJlbnRUaW1lKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjdXJyZW50IHRpbWVcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lIEN1cnJlbnQgdGltZSBvZiB2aWRlb1xuICAgKiBAcmV0dXJuIHtOdW1iZXJ9IEN1cnJlbnQgdGltZVxuICAgKiBAbWV0aG9kIGN1cnJlbnRUaW1lXG4gICAqL1xuICBjdXJyZW50VGltZSh0aW1lKSB7XG4gICAgLy8gd2hlbiBzZWVraW5nIG1ha2UgdGhlIHJlcG9ydGVkIHRpbWUga2VlcCB1cCB3aXRoIHRoZSByZXF1ZXN0ZWQgdGltZVxuICAgIC8vIGJ5IHJlYWRpbmcgdGhlIHRpbWUgd2UncmUgc2Vla2luZyB0b1xuICAgIGlmICh0aGlzLnNlZWtpbmcoKSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFzdFNlZWtUYXJnZXRfIHx8IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVsXy52anNfZ2V0UHJvcGVydHkoJ2N1cnJlbnRUaW1lJyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc291cmNlXG4gICAqXG4gICAqIEBtZXRob2QgY3VycmVudFNyY1xuICAgKi9cbiAgY3VycmVudFNyYygpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50U291cmNlXykge1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFNvdXJjZV8uc3JjO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5lbF8udmpzX2dldFByb3BlcnR5KCdjdXJyZW50U3JjJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbWVkaWEgaW50byBwbGF5ZXJcbiAgICpcbiAgICogQG1ldGhvZCBsb2FkXG4gICAqL1xuICBsb2FkKCkge1xuICAgIHRoaXMuZWxfLnZqc19sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIGlmIGNhbiBzZWVrIGluIG1lZGlhXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZU9iamVjdH1cbiAgICogQG1ldGhvZCBzZWVrYWJsZVxuICAgKi9cbiAgc2Vla2FibGUoKSB7XG4gICAgY29uc3QgZHVyYXRpb24gPSB0aGlzLmR1cmF0aW9uKCk7XG4gICAgaWYgKGR1cmF0aW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlKCk7XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2UoMCwgZHVyYXRpb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBidWZmZXJlZCB0aW1lIHJhbmdlXG4gICAqXG4gICAqIEByZXR1cm4ge1RpbWVSYW5nZU9iamVjdH1cbiAgICogQG1ldGhvZCBidWZmZXJlZFxuICAgKi9cbiAgYnVmZmVyZWQoKSB7XG4gICAgbGV0IHJhbmdlcyA9IHRoaXMuZWxfLnZqc19nZXRQcm9wZXJ0eSgnYnVmZmVyZWQnKTtcbiAgICBpZiAocmFuZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZVRpbWVSYW5nZSgpO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlKHJhbmdlc1swXVswXSwgcmFuZ2VzWzBdWzFdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgZnVsbHNjcmVlbiBzdXBwb3J0IC1cbiAgICogRmxhc2ggZG9lcyBub3QgYWxsb3cgZnVsbHNjcmVlbiB0aHJvdWdoIGphdmFzY3JpcHRcbiAgICogc28gYWx3YXlzIHJldHVybnMgZmFsc2VcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn0gZmFsc2VcbiAgICogQG1ldGhvZCBzdXBwb3J0c0Z1bGxTY3JlZW5cbiAgICovXG4gIHN1cHBvcnRzRnVsbFNjcmVlbigpIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIEZsYXNoIGRvZXMgbm90IGFsbG93IGZ1bGxzY3JlZW4gdGhyb3VnaCBqYXZhc2NyaXB0XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0byBlbnRlciBmdWxsc2NyZWVuXG4gICAqIEZsYXNoIGRvZXMgbm90IGFsbG93IGZ1bGxzY3JlZW4gdGhyb3VnaCBqYXZhc2NyaXB0XG4gICAqIHNvIGFsd2F5cyByZXR1cm5zIGZhbHNlXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59IGZhbHNlXG4gICAqIEBtZXRob2QgZW50ZXJGdWxsU2NyZWVuXG4gICAqL1xuICBlbnRlckZ1bGxTY3JlZW4oKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbn1cblxuXG4vLyBDcmVhdGUgc2V0dGVycyBhbmQgZ2V0dGVycyBmb3IgYXR0cmlidXRlc1xuY29uc3QgX2FwaSA9IEZsYXNoLnByb3RvdHlwZTtcbmNvbnN0IF9yZWFkV3JpdGUgPSAncnRtcENvbm5lY3Rpb24scnRtcFN0cmVhbSxwcmVsb2FkLGRlZmF1bHRQbGF5YmFja1JhdGUscGxheWJhY2tSYXRlLGF1dG9wbGF5LGxvb3AsbWVkaWFHcm91cCxjb250cm9sbGVyLGNvbnRyb2xzLHZvbHVtZSxtdXRlZCxkZWZhdWx0TXV0ZWQscG9zdGVyJy5zcGxpdCgnLCcpO1xuY29uc3QgX3JlYWRPbmx5ID0gJ25ldHdvcmtTdGF0ZSxyZWFkeVN0YXRlLGluaXRpYWxUaW1lLGR1cmF0aW9uLHN0YXJ0T2Zmc2V0VGltZSxwYXVzZWQsZW5kZWQsdmlkZW9XaWR0aCx2aWRlb0hlaWdodCcuc3BsaXQoJywnKTtcblxuZnVuY3Rpb24gX2NyZWF0ZVNldHRlcihhdHRyKXtcbiAgdmFyIGF0dHJVcHBlciA9IGF0dHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhdHRyLnNsaWNlKDEpO1xuICBfYXBpWydzZXQnK2F0dHJVcHBlcl0gPSBmdW5jdGlvbih2YWwpeyByZXR1cm4gdGhpcy5lbF8udmpzX3NldFByb3BlcnR5KGF0dHIsIHZhbCk7IH07XG59XG5mdW5jdGlvbiBfY3JlYXRlR2V0dGVyKGF0dHIpIHtcbiAgX2FwaVthdHRyXSA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzLmVsXy52anNfZ2V0UHJvcGVydHkoYXR0cik7IH07XG59XG5cbi8vIENyZWF0ZSBnZXR0ZXIgYW5kIHNldHRlcnMgZm9yIGFsbCByZWFkL3dyaXRlIGF0dHJpYnV0ZXNcbmZvciAobGV0IGkgPSAwOyBpIDwgX3JlYWRXcml0ZS5sZW5ndGg7IGkrKykge1xuICBfY3JlYXRlR2V0dGVyKF9yZWFkV3JpdGVbaV0pO1xuICBfY3JlYXRlU2V0dGVyKF9yZWFkV3JpdGVbaV0pO1xufVxuXG4vLyBDcmVhdGUgZ2V0dGVycyBmb3IgcmVhZC1vbmx5IGF0dHJpYnV0ZXNcbmZvciAobGV0IGkgPSAwOyBpIDwgX3JlYWRPbmx5Lmxlbmd0aDsgaSsrKSB7XG4gIF9jcmVhdGVHZXR0ZXIoX3JlYWRPbmx5W2ldKTtcbn1cblxuLyogRmxhc2ggU3VwcG9ydCBUZXN0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbkZsYXNoLmlzU3VwcG9ydGVkID0gZnVuY3Rpb24oKXtcbiAgcmV0dXJuIEZsYXNoLnZlcnNpb24oKVswXSA+PSAxMDtcbiAgLy8gcmV0dXJuIHN3Zm9iamVjdC5oYXNGbGFzaFBsYXllclZlcnNpb24oJzEwJyk7XG59O1xuXG4vLyBBZGQgU291cmNlIEhhbmRsZXIgcGF0dGVybiBmdW5jdGlvbnMgdG8gdGhpcyB0ZWNoXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyhGbGFzaCk7XG5cbi8qXG4gKiBUaGUgZGVmYXVsdCBuYXRpdmUgc291cmNlIGhhbmRsZXIuXG4gKiBUaGlzIHNpbXBseSBwYXNzZXMgdGhlIHNvdXJjZSB0byB0aGUgdmlkZW8gZWxlbWVudC4gTm90aGluZyBmYW5jeS5cbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZSAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0gIHtGbGFzaH0gdGVjaCAgVGhlIGluc3RhbmNlIG9mIHRoZSBGbGFzaCB0ZWNoXG4gKi9cbkZsYXNoLm5hdGl2ZVNvdXJjZUhhbmRsZXIgPSB7fTtcblxuLyoqXG4gKiBDaGVjayBpZiBGbGFzaCBjYW4gcGxheSB0aGUgZ2l2ZW4gdmlkZW90eXBlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUgICAgVGhlIG1pbWV0eXBlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuRmxhc2gubmF0aXZlU291cmNlSGFuZGxlci5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICBpZiAodHlwZSBpbiBGbGFzaC5mb3JtYXRzKSB7XG4gICAgcmV0dXJuICdtYXliZSc7XG4gIH1cblxuICByZXR1cm4gJyc7XG59O1xuXG4vKlxuICogQ2hlY2sgRmxhc2ggY2FuIGhhbmRsZSB0aGUgc291cmNlIG5hdGl2ZWx5XG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2UgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAqL1xuRmxhc2gubmF0aXZlU291cmNlSGFuZGxlci5jYW5IYW5kbGVTb3VyY2UgPSBmdW5jdGlvbihzb3VyY2Upe1xuICB2YXIgdHlwZTtcblxuICBmdW5jdGlvbiBndWVzc01pbWVUeXBlKHNyYykge1xuICAgIHZhciBleHQgPSBVcmwuZ2V0RmlsZUV4dGVuc2lvbihzcmMpO1xuICAgIGlmIChleHQpIHtcbiAgICAgIHJldHVybiBgdmlkZW8vJHtleHR9YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgaWYgKCFzb3VyY2UudHlwZSkge1xuICAgIHR5cGUgPSBndWVzc01pbWVUeXBlKHNvdXJjZS5zcmMpO1xuICB9IGVsc2Uge1xuICAgIC8vIFN0cmlwIGNvZGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdHlwZSBiZWNhdXNlIHdlIGRvbid0IGdldCB0aGF0IHNwZWNpZmljXG4gICAgdHlwZSA9IHNvdXJjZS50eXBlLnJlcGxhY2UoLzsuKi8sICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgcmV0dXJuIEZsYXNoLm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUodHlwZSk7XG59O1xuXG4vKlxuICogUGFzcyB0aGUgc291cmNlIHRvIHRoZSBmbGFzaCBvYmplY3RcbiAqIEFkYXB0aXZlIHNvdXJjZSBoYW5kbGVycyB3aWxsIGhhdmUgbW9yZSBjb21wbGljYXRlZCB3b3JrZmxvd3MgYmVmb3JlIHBhc3NpbmdcbiAqIHZpZGVvIGRhdGEgdG8gdGhlIHZpZGVvIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZSAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0gIHtGbGFzaH0gIHRlY2ggICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgRmxhc2ggdGVjaFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzb3VyY2VcbiAqL1xuRmxhc2gubmF0aXZlU291cmNlSGFuZGxlci5oYW5kbGVTb3VyY2UgPSBmdW5jdGlvbihzb3VyY2UsIHRlY2gsIG9wdGlvbnMpe1xuICB0ZWNoLnNldFNyYyhzb3VyY2Uuc3JjKTtcbn07XG5cbi8qXG4gKiBDbGVhbiB1cCB0aGUgc291cmNlIGhhbmRsZXIgd2hlbiBkaXNwb3NpbmcgdGhlIHBsYXllciBvciBzd2l0Y2hpbmcgc291cmNlcy4uXG4gKiAobm8gY2xlYW51cCBpcyBuZWVkZWQgd2hlbiBzdXBwb3J0aW5nIHRoZSBmb3JtYXQgbmF0aXZlbHkpXG4gKi9cbkZsYXNoLm5hdGl2ZVNvdXJjZUhhbmRsZXIuZGlzcG9zZSA9IGZ1bmN0aW9uKCl7fTtcblxuLy8gUmVnaXN0ZXIgdGhlIG5hdGl2ZSBzb3VyY2UgaGFuZGxlclxuRmxhc2gucmVnaXN0ZXJTb3VyY2VIYW5kbGVyKEZsYXNoLm5hdGl2ZVNvdXJjZUhhbmRsZXIpO1xuXG5GbGFzaC5mb3JtYXRzID0ge1xuICAndmlkZW8vZmx2JzogJ0ZMVicsXG4gICd2aWRlby94LWZsdic6ICdGTFYnLFxuICAndmlkZW8vbXA0JzogJ01QNCcsXG4gICd2aWRlby9tNHYnOiAnTVA0J1xufTtcblxuRmxhc2gub25SZWFkeSA9IGZ1bmN0aW9uKGN1cnJTd2Ype1xuICBsZXQgZWwgPSBEb20uZ2V0RWwoY3VyclN3Zik7XG4gIGxldCB0ZWNoID0gZWwgJiYgZWwudGVjaDtcblxuICAvLyBpZiB0aGVyZSBpcyBubyBlbCB0aGVuIHRoZSB0ZWNoIGhhcyBiZWVuIGRpc3Bvc2VkXG4gIC8vIGFuZCB0aGUgdGVjaCBlbGVtZW50IHdhcyByZW1vdmVkIGZyb20gdGhlIHBsYXllciBkaXZcbiAgaWYgKHRlY2ggJiYgdGVjaC5lbCgpKSB7XG4gICAgLy8gY2hlY2sgdGhhdCB0aGUgZmxhc2ggb2JqZWN0IGlzIHJlYWxseSByZWFkeVxuICAgIEZsYXNoLmNoZWNrUmVhZHkodGVjaCk7XG4gIH1cbn07XG5cbi8vIFRoZSBTV0YgaXNuJ3QgYWx3YXlzIHJlYWR5IHdoZW4gaXQgc2F5cyBpdCBpcy4gU29tZXRpbWVzIHRoZSBBUEkgZnVuY3Rpb25zIHN0aWxsIG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIG9iamVjdC5cbi8vIElmIGl0J3Mgbm90IHJlYWR5LCB3ZSBzZXQgYSB0aW1lb3V0IHRvIGNoZWNrIGFnYWluIHNob3J0bHkuXG5GbGFzaC5jaGVja1JlYWR5ID0gZnVuY3Rpb24odGVjaCl7XG4gIC8vIHN0b3Agd29ycnlpbmcgaWYgdGhlIHRlY2ggaGFzIGJlZW4gZGlzcG9zZWRcbiAgaWYgKCF0ZWNoLmVsKCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBjaGVjayBpZiBBUEkgcHJvcGVydHkgZXhpc3RzXG4gIGlmICh0ZWNoLmVsKCkudmpzX2dldFByb3BlcnR5KSB7XG4gICAgLy8gdGVsbCB0ZWNoIGl0J3MgcmVhZHlcbiAgICB0ZWNoLnRyaWdnZXJSZWFkeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIHdhaXQgbG9uZ2VyXG4gICAgdGhpcy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICBGbGFzaFsnY2hlY2tSZWFkeSddKHRlY2gpO1xuICAgIH0sIDUwKTtcbiAgfVxufTtcblxuLy8gVHJpZ2dlciBldmVudHMgZnJvbSB0aGUgc3dmIG9uIHRoZSBwbGF5ZXJcbkZsYXNoLm9uRXZlbnQgPSBmdW5jdGlvbihzd2ZJRCwgZXZlbnROYW1lKXtcbiAgbGV0IHRlY2ggPSBEb20uZ2V0RWwoc3dmSUQpLnRlY2g7XG4gIHRlY2gudHJpZ2dlcihldmVudE5hbWUpO1xufTtcblxuLy8gTG9nIGVycm9ycyBmcm9tIHRoZSBzd2ZcbkZsYXNoLm9uRXJyb3IgPSBmdW5jdGlvbihzd2ZJRCwgZXJyKXtcbiAgY29uc3QgdGVjaCA9IERvbS5nZXRFbChzd2ZJRCkudGVjaDtcblxuICAvLyB0cmlnZ2VyIE1FRElBX0VSUl9TUkNfTk9UX1NVUFBPUlRFRFxuICBpZiAoZXJyID09PSAnc3Jjbm90Zm91bmQnKSB7XG4gICAgcmV0dXJuIHRlY2guZXJyb3IoNCk7XG4gIH1cblxuICAvLyB0cmlnZ2VyIGEgY3VzdG9tIGVycm9yXG4gIHRlY2guZXJyb3IoJ0ZMQVNIOiAnICsgZXJyKTtcbn07XG5cbi8vIEZsYXNoIFZlcnNpb24gQ2hlY2tcbkZsYXNoLnZlcnNpb24gPSBmdW5jdGlvbigpe1xuICBsZXQgdmVyc2lvbiA9ICcwLDAsMCc7XG5cbiAgLy8gSUVcbiAgdHJ5IHtcbiAgICB2ZXJzaW9uID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCdTaG9ja3dhdmVGbGFzaC5TaG9ja3dhdmVGbGFzaCcpLkdldFZhcmlhYmxlKCckdmVyc2lvbicpLnJlcGxhY2UoL1xcRCsvZywgJywnKS5tYXRjaCgvXiw/KC4rKSw/JC8pWzFdO1xuXG4gIC8vIG90aGVyIGJyb3dzZXJzXG4gIH0gY2F0Y2goZSkge1xuICAgIHRyeSB7XG4gICAgICBpZiAobmF2aWdhdG9yLm1pbWVUeXBlc1snYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnXS5lbmFibGVkUGx1Z2luKXtcbiAgICAgICAgdmVyc2lvbiA9IChuYXZpZ2F0b3IucGx1Z2luc1snU2hvY2t3YXZlIEZsYXNoIDIuMCddIHx8IG5hdmlnYXRvci5wbHVnaW5zWydTaG9ja3dhdmUgRmxhc2gnXSkuZGVzY3JpcHRpb24ucmVwbGFjZSgvXFxEKy9nLCAnLCcpLm1hdGNoKC9eLD8oLispLD8kLylbMV07XG4gICAgICB9XG4gICAgfSBjYXRjaChlcnIpIHt9XG4gIH1cbiAgcmV0dXJuIHZlcnNpb24uc3BsaXQoJywnKTtcbn07XG5cbi8vIEZsYXNoIGVtYmVkZGluZyBtZXRob2QuIE9ubHkgdXNlZCBpbiBub24taWZyYW1lIG1vZGVcbkZsYXNoLmVtYmVkID0gZnVuY3Rpb24oc3dmLCBmbGFzaFZhcnMsIHBhcmFtcywgYXR0cmlidXRlcyl7XG4gIGNvbnN0IGNvZGUgPSBGbGFzaC5nZXRFbWJlZENvZGUoc3dmLCBmbGFzaFZhcnMsIHBhcmFtcywgYXR0cmlidXRlcyk7XG5cbiAgLy8gR2V0IGVsZW1lbnQgYnkgZW1iZWRkaW5nIGNvZGUgYW5kIHJldHJpZXZpbmcgY3JlYXRlZCBlbGVtZW50XG4gIGNvbnN0IG9iaiA9IERvbS5jcmVhdGVFbCgnZGl2JywgeyBpbm5lckhUTUw6IGNvZGUgfSkuY2hpbGROb2Rlc1swXTtcblxuICByZXR1cm4gb2JqO1xufTtcblxuRmxhc2guZ2V0RW1iZWRDb2RlID0gZnVuY3Rpb24oc3dmLCBmbGFzaFZhcnMsIHBhcmFtcywgYXR0cmlidXRlcyl7XG4gIGNvbnN0IG9ialRhZyA9ICc8b2JqZWN0IHR5cGU9XCJhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaFwiICc7XG4gIGxldCBmbGFzaFZhcnNTdHJpbmcgPSAnJztcbiAgbGV0IHBhcmFtc1N0cmluZyA9ICcnO1xuICBsZXQgYXR0cnNTdHJpbmcgPSAnJztcblxuICAvLyBDb252ZXJ0IGZsYXNoIHZhcnMgdG8gc3RyaW5nXG4gIGlmIChmbGFzaFZhcnMpIHtcbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhmbGFzaFZhcnMpLmZvckVhY2goZnVuY3Rpb24oa2V5KXtcbiAgICAgIGZsYXNoVmFyc1N0cmluZyArPSBgJHtrZXl9PSR7Zmxhc2hWYXJzW2tleV19JmFtcDtgO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQWRkIHN3ZiwgZmxhc2hWYXJzLCBhbmQgb3RoZXIgZGVmYXVsdCBwYXJhbXNcbiAgcGFyYW1zID0gYXNzaWduKHtcbiAgICAnbW92aWUnOiBzd2YsXG4gICAgJ2ZsYXNodmFycyc6IGZsYXNoVmFyc1N0cmluZyxcbiAgICAnYWxsb3dTY3JpcHRBY2Nlc3MnOiAnYWx3YXlzJywgLy8gUmVxdWlyZWQgdG8gdGFsayB0byBzd2ZcbiAgICAnYWxsb3dOZXR3b3JraW5nJzogJ2FsbCcgLy8gQWxsIHNob3VsZCBiZSBkZWZhdWx0LCBidXQgaGF2aW5nIHNlY3VyaXR5IGlzc3Vlcy5cbiAgfSwgcGFyYW1zKTtcblxuICAvLyBDcmVhdGUgcGFyYW0gdGFncyBzdHJpbmdcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocGFyYW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSl7XG4gICAgcGFyYW1zU3RyaW5nICs9IGA8cGFyYW0gbmFtZT1cIiR7a2V5fVwiIHZhbHVlPVwiJHtwYXJhbXNba2V5XX1cIiAvPmA7XG4gIH0pO1xuXG4gIGF0dHJpYnV0ZXMgPSBhc3NpZ24oe1xuICAgIC8vIEFkZCBzd2YgdG8gYXR0cmlidXRlcyAobmVlZCBib3RoIGZvciBJRSBhbmQgT3RoZXJzIHRvIHdvcmspXG4gICAgJ2RhdGEnOiBzd2YsXG5cbiAgICAvLyBEZWZhdWx0IHRvIDEwMCUgd2lkdGgvaGVpZ2h0XG4gICAgJ3dpZHRoJzogJzEwMCUnLFxuICAgICdoZWlnaHQnOiAnMTAwJSdcblxuICB9LCBhdHRyaWJ1dGVzKTtcblxuICAvLyBDcmVhdGUgQXR0cmlidXRlcyBzdHJpbmdcbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbihrZXkpe1xuICAgIGF0dHJzU3RyaW5nICs9IGAke2tleX09XCIke2F0dHJpYnV0ZXNba2V5XX1cIiBgO1xuICB9KTtcblxuICByZXR1cm4gYCR7b2JqVGFnfSR7YXR0cnNTdHJpbmd9PiR7cGFyYW1zU3RyaW5nfTwvb2JqZWN0PmA7XG59O1xuXG4vLyBSdW4gRmxhc2ggdGhyb3VnaCB0aGUgUlRNUCBkZWNvcmF0b3JcbkZsYXNoUnRtcERlY29yYXRvcihGbGFzaCk7XG5cbkNvbXBvbmVudC5yZWdpc3RlckNvbXBvbmVudCgnRmxhc2gnLCBGbGFzaCk7XG5UZWNoLnJlZ2lzdGVyVGVjaCgnRmxhc2gnLCBGbGFzaCk7XG5leHBvcnQgZGVmYXVsdCBGbGFzaDtcbiJdfQ==
},{"../component":66,"../utils/dom.js":144,"../utils/time-ranges.js":152,"../utils/url.js":154,"./flash-rtmp":120,"./tech":124,"global/window":8,"object.assign":53}],122:[function(_dereq_,module,exports){
/**
* @file html5.js
* HTML5 Media Controller - Wrapper for HTML5 Media API
*/
'use strict';
exports.__esModule = true;
var _templateObject = _taggedTemplateLiteralLoose(['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used. \n This may prevent text tracks from loading.'], ['Text Tracks are being loaded from another origin but the crossorigin attribute isn\'t used. \n This may prevent text tracks from loading.']);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
var _techJs = _dereq_('./tech.js');
var _techJs2 = _interopRequireDefault(_techJs);
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('../utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsUrlJs = _dereq_('../utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _tsml = _dereq_('tsml');
var _tsml2 = _interopRequireDefault(_tsml);
var _srcJsTracksTextTrackJs = _dereq_('../../../src/js/tracks/text-track.js');
var _srcJsTracksTextTrackJs2 = _interopRequireDefault(_srcJsTracksTextTrackJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* HTML5 Media Controller - Wrapper for HTML5 Media API
*
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Tech
* @class Html5
*/
var Html5 = (function (_Tech) {
_inherits(Html5, _Tech);
function Html5(options, ready) {
var _this = this;
_classCallCheck(this, Html5);
_Tech.call(this, options, ready);
var source = options.source;
var crossoriginTracks = false;
// Set the source if one is provided
// 1) Check if the source is new (if not, we want to keep the original so playback isn't interrupted)
// 2) Check to see if the network state of the tag was failed at init, and if so, reset the source
// anyway so the error gets fired.
if (source && (this.el_.currentSrc !== source.src || options.tag && options.tag.initNetworkState_ === 3)) {
this.setSource(source);
} else {
this.handleLateInit_(this.el_);
}
if (this.el_.hasChildNodes()) {
var nodes = this.el_.childNodes;
var nodesLength = nodes.length;
var removeNodes = [];
while (nodesLength--) {
var node = nodes[nodesLength];
var nodeName = node.nodeName.toLowerCase();
if (nodeName === 'track') {
if (!this.featuresNativeTextTracks) {
// Empty video tag tracks so the built-in player doesn't use them also.
// This may not be fast enough to stop HTML5 browsers from reading the tags
// so we'll need to turn off any default tracks if we're manually doing
// captions and subtitles. videoElement.textTracks
removeNodes.push(node);
} else {
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(node);
this.remoteTextTracks().addTrack_(node.track);
if (!crossoriginTracks && !this.el_.hasAttribute('crossorigin') && Url.isCrossOrigin(node.src)) {
crossoriginTracks = true;
}
}
}
}
for (var i = 0; i < removeNodes.length; i++) {
this.el_.removeChild(removeNodes[i]);
}
}
var trackTypes = ['audio', 'video'];
// ProxyNativeTextTracks
trackTypes.forEach(function (type) {
var capitalType = _utilsToTitleCaseJs2['default'](type);
if (!_this['featuresNative' + capitalType + 'Tracks']) {
return;
}
var tl = _this.el()[type + 'Tracks'];
if (tl && tl.addEventListener) {
tl.addEventListener('change', Fn.bind(_this, _this['handle' + capitalType + 'TrackChange_']));
tl.addEventListener('addtrack', Fn.bind(_this, _this['handle' + capitalType + 'TrackAdd_']));
tl.addEventListener('removetrack', Fn.bind(_this, _this['handle' + capitalType + 'TrackRemove_']));
}
});
if (this.featuresNativeTextTracks) {
if (crossoriginTracks) {
_utilsLogJs2['default'].warn(_tsml2['default'](_templateObject));
}
this.handleTextTrackChange_ = Fn.bind(this, this.handleTextTrackChange);
this.handleTextTrackAdd_ = Fn.bind(this, this.handleTextTrackAdd);
this.handleTextTrackRemove_ = Fn.bind(this, this.handleTextTrackRemove);
this.proxyNativeTextTracks_();
}
// Determine if native controls should be used
// Our goal should be to get the custom controls on mobile solid everywhere
// so we can remove this all together. Right now this will block custom
// controls on touch enabled laptops like the Chrome Pixel
if (browser.TOUCH_ENABLED && options.nativeControlsForTouch === true || browser.IS_IPHONE || browser.IS_NATIVE_ANDROID) {
this.setControls(true);
}
this.triggerReady();
}
/* HTML5 Support Testing ---------------------------------------------------- */
/*
* Element for testing browser HTML5 video capabilities
*
* @type {Element}
* @constant
* @private
*/
/**
* Dispose of html5 media element
*
* @method dispose
*/
Html5.prototype.dispose = function dispose() {
var _this2 = this;
// Un-ProxyNativeTracks
['audio', 'video', 'text'].forEach(function (type) {
var capitalType = _utilsToTitleCaseJs2['default'](type);
var tl = _this2.el_[type + 'Tracks'];
if (tl && tl.removeEventListener) {
tl.removeEventListener('change', _this2['handle' + capitalType + 'TrackChange_']);
tl.removeEventListener('addtrack', _this2['handle' + capitalType + 'TrackAdd_']);
tl.removeEventListener('removetrack', _this2['handle' + capitalType + 'TrackRemove_']);
}
});
Html5.disposeMediaElement(this.el_);
// tech will handle clearing of the emulated track list
_Tech.prototype.dispose.call(this);
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
Html5.prototype.createEl = function createEl() {
var el = this.options_.tag;
// Check if this browser supports moving the element into the box.
// On the iPhone video will break if you move the element,
// So we have to create a brand new element.
if (!el || this['movingMediaElementInDOM'] === false) {
// If the original tag is still there, clone and remove it.
if (el) {
var clone = el.cloneNode(true);
el.parentNode.insertBefore(clone, el);
Html5.disposeMediaElement(el);
el = clone;
} else {
el = _globalDocument2['default'].createElement('video');
// determine if native controls should be used
var tagAttributes = this.options_.tag && Dom.getElAttributes(this.options_.tag);
var attributes = _utilsMergeOptionsJs2['default']({}, tagAttributes);
if (!browser.TOUCH_ENABLED || this.options_.nativeControlsForTouch !== true) {
delete attributes.controls;
}
Dom.setElAttributes(el, _objectAssign2['default'](attributes, {
id: this.options_.techId,
'class': 'vjs-tech'
}));
}
}
// Update specific tag settings, in case they were overridden
var settingsAttrs = ['autoplay', 'preload', 'loop', 'muted'];
for (var i = settingsAttrs.length - 1; i >= 0; i--) {
var attr = settingsAttrs[i];
var overwriteAttrs = {};
if (typeof this.options_[attr] !== 'undefined') {
overwriteAttrs[attr] = this.options_[attr];
}
Dom.setElAttributes(el, overwriteAttrs);
}
return el;
// jenniisawesome = true;
};
// If we're loading the playback object after it has started loading
// or playing the video (often with autoplay on) then the loadstart event
// has already fired and we need to fire it manually because many things
// rely on it.
Html5.prototype.handleLateInit_ = function handleLateInit_(el) {
var _this3 = this;
if (el.networkState === 0 || el.networkState === 3) {
// The video element hasn't started loading the source yet
// or didn't find a source
return;
}
if (el.readyState === 0) {
var _ret = (function () {
// NetworkState is set synchronously BUT loadstart is fired at the
// end of the current stack, usually before setInterval(fn, 0).
// So at this point we know loadstart may have already fired or is
// about to fire, and either way the player hasn't seen it yet.
// We don't want to fire loadstart prematurely here and cause a
// double loadstart so we'll wait and see if it happens between now
// and the next loop, and fire it if not.
// HOWEVER, we also want to make sure it fires before loadedmetadata
// which could also happen between now and the next loop, so we'll
// watch for that also.
var loadstartFired = false;
var setLoadstartFired = function setLoadstartFired() {
loadstartFired = true;
};
_this3.on('loadstart', setLoadstartFired);
var triggerLoadstart = function triggerLoadstart() {
// We did miss the original loadstart. Make sure the player
// sees loadstart before loadedmetadata
if (!loadstartFired) {
this.trigger('loadstart');
}
};
_this3.on('loadedmetadata', triggerLoadstart);
_this3.ready(function () {
this.off('loadstart', setLoadstartFired);
this.off('loadedmetadata', triggerLoadstart);
if (!loadstartFired) {
// We did miss the original native loadstart. Fire it now.
this.trigger('loadstart');
}
});
return {
v: undefined
};
})();
if (typeof _ret === 'object') return _ret.v;
}
// From here on we know that loadstart already fired and we missed it.
// The other readyState events aren't as much of a problem if we double
// them, so not going to go to as much trouble as loadstart to prevent
// that unless we find reason to.
var eventsToTrigger = ['loadstart'];
// loadedmetadata: newly equal to HAVE_METADATA (1) or greater
eventsToTrigger.push('loadedmetadata');
// loadeddata: newly increased to HAVE_CURRENT_DATA (2) or greater
if (el.readyState >= 2) {
eventsToTrigger.push('loadeddata');
}
// canplay: newly increased to HAVE_FUTURE_DATA (3) or greater
if (el.readyState >= 3) {
eventsToTrigger.push('canplay');
}
// canplaythrough: newly equal to HAVE_ENOUGH_DATA (4)
if (el.readyState >= 4) {
eventsToTrigger.push('canplaythrough');
}
// We still need to give the player time to add event listeners
this.ready(function () {
eventsToTrigger.forEach(function (type) {
this.trigger(type);
}, this);
});
};
Html5.prototype.proxyNativeTextTracks_ = function proxyNativeTextTracks_() {
var tt = this.el().textTracks;
if (tt) {
// Add tracks - if player is initialised after DOM loaded, textTracks
// will not trigger addtrack
for (var i = 0; i < tt.length; i++) {
this.textTracks().addTrack_(tt[i]);
}
if (tt.addEventListener) {
tt.addEventListener('change', this.handleTextTrackChange_);
tt.addEventListener('addtrack', this.handleTextTrackAdd_);
tt.addEventListener('removetrack', this.handleTextTrackRemove_);
}
}
};
Html5.prototype.handleTextTrackChange = function handleTextTrackChange(e) {
var tt = this.textTracks();
this.textTracks().trigger({
type: 'change',
target: tt,
currentTarget: tt,
srcElement: tt
});
};
Html5.prototype.handleTextTrackAdd = function handleTextTrackAdd(e) {
this.textTracks().addTrack_(e.track);
};
Html5.prototype.handleTextTrackRemove = function handleTextTrackRemove(e) {
this.textTracks().removeTrack_(e.track);
};
Html5.prototype.handleVideoTrackChange_ = function handleVideoTrackChange_(e) {
var vt = this.videoTracks();
this.videoTracks().trigger({
type: 'change',
target: vt,
currentTarget: vt,
srcElement: vt
});
};
Html5.prototype.handleVideoTrackAdd_ = function handleVideoTrackAdd_(e) {
this.videoTracks().addTrack_(e.track);
};
Html5.prototype.handleVideoTrackRemove_ = function handleVideoTrackRemove_(e) {
this.videoTracks().removeTrack_(e.track);
};
Html5.prototype.handleAudioTrackChange_ = function handleAudioTrackChange_(e) {
var audioTrackList = this.audioTracks();
this.audioTracks().trigger({
type: 'change',
target: audioTrackList,
currentTarget: audioTrackList,
srcElement: audioTrackList
});
};
Html5.prototype.handleAudioTrackAdd_ = function handleAudioTrackAdd_(e) {
this.audioTracks().addTrack_(e.track);
};
Html5.prototype.handleAudioTrackRemove_ = function handleAudioTrackRemove_(e) {
this.audioTracks().removeTrack_(e.track);
};
/**
* Play for html5 tech
*
* @method play
*/
Html5.prototype.play = function play() {
var promise = this.el_.play();
if (promise) // suppress uncaught DOMException
promise['catch'](function () {});
};
/**
* Pause for html5 tech
*
* @method pause
*/
Html5.prototype.pause = function pause() {
this.el_.pause();
};
/**
* Paused for html5 tech
*
* @return {Boolean}
* @method paused
*/
Html5.prototype.paused = function paused() {
return this.el_.paused;
};
/**
* Get current time
*
* @return {Number}
* @method currentTime
*/
Html5.prototype.currentTime = function currentTime() {
return this.el_.currentTime;
};
/**
* Set current time
*
* @param {Number} seconds Current time of video
* @method setCurrentTime
*/
Html5.prototype.setCurrentTime = function setCurrentTime(seconds) {
try {
this.el_.currentTime = seconds;
} catch (e) {
_utilsLogJs2['default'](e, 'Video is not ready. (Video.js)');
// this.warning(VideoJS.warnings.videoNotReady);
}
};
/**
* Get duration
*
* @return {Number}
* @method duration
*/
Html5.prototype.duration = function duration() {
return this.el_.duration || 0;
};
/**
* Get a TimeRange object that represents the intersection
* of the time ranges for which the user agent has all
* relevant media
*
* @return {TimeRangeObject}
* @method buffered
*/
Html5.prototype.buffered = function buffered() {
return this.el_.buffered;
};
/**
* Get volume level
*
* @return {Number}
* @method volume
*/
Html5.prototype.volume = function volume() {
return this.el_.volume;
};
/**
* Set volume level
*
* @param {Number} percentAsDecimal Volume percent as a decimal
* @method setVolume
*/
Html5.prototype.setVolume = function setVolume(percentAsDecimal) {
this.el_.volume = percentAsDecimal;
};
/**
* Get if muted
*
* @return {Boolean}
* @method muted
*/
Html5.prototype.muted = function muted() {
return this.el_.muted;
};
/**
* Set muted
*
* @param {Boolean} If player is to be muted or note
* @method setMuted
*/
Html5.prototype.setMuted = function setMuted(muted) {
this.el_.muted = muted;
};
/**
* Get player width
*
* @return {Number}
* @method width
*/
Html5.prototype.width = function width() {
return this.el_.offsetWidth;
};
/**
* Get player height
*
* @return {Number}
* @method height
*/
Html5.prototype.height = function height() {
return this.el_.offsetHeight;
};
/**
* Get if there is fullscreen support
*
* @return {Boolean}
* @method supportsFullScreen
*/
Html5.prototype.supportsFullScreen = function supportsFullScreen() {
if (typeof this.el_.webkitEnterFullScreen === 'function') {
var userAgent = _globalWindow2['default'].navigator.userAgent;
// Seems to be broken in Chromium/Chrome && Safari in Leopard
if (/Android/.test(userAgent) || !/Chrome|Mac OS X 10.5/.test(userAgent)) {
return true;
}
}
return false;
};
/**
* Request to enter fullscreen
*
* @method enterFullScreen
*/
Html5.prototype.enterFullScreen = function enterFullScreen() {
var video = this.el_;
if ('webkitDisplayingFullscreen' in video) {
this.one('webkitbeginfullscreen', function () {
this.one('webkitendfullscreen', function () {
this.trigger('fullscreenchange', { isFullscreen: false });
});
this.trigger('fullscreenchange', { isFullscreen: true });
});
}
if (video.paused && video.networkState <= video.HAVE_METADATA) {
// attempt to prime the video element for programmatic access
// this isn't necessary on the desktop but shouldn't hurt
this.play();
// playing and pausing synchronously during the transition to fullscreen
// can get iOS ~6.1 devices into a play/pause loop
this.setTimeout(function () {
video.pause();
video.webkitEnterFullScreen();
}, 0);
} else {
video.webkitEnterFullScreen();
}
};
/**
* Request to exit fullscreen
*
* @method exitFullScreen
*/
Html5.prototype.exitFullScreen = function exitFullScreen() {
this.el_.webkitExitFullScreen();
};
/**
* Get/set video
*
* @param {Object=} src Source object
* @return {Object}
* @method src
*/
Html5.prototype.src = function src(_src) {
if (_src === undefined) {
return this.el_.src;
} else {
// Setting src through `src` instead of `setSrc` will be deprecated
this.setSrc(_src);
}
};
/**
* Set video
*
* @param {Object} src Source object
* @deprecated
* @method setSrc
*/
Html5.prototype.setSrc = function setSrc(src) {
this.el_.src = src;
};
/**
* Load media into player
*
* @method load
*/
Html5.prototype.load = function load() {
this.el_.load();
};
/**
* Reset the tech. Removes all sources and calls `load`.
*
* @method reset
*/
Html5.prototype.reset = function reset() {
Html5.resetMediaElement(this.el_);
};
/**
* Get current source
*
* @return {Object}
* @method currentSrc
*/
Html5.prototype.currentSrc = function currentSrc() {
if (this.currentSource_) {
return this.currentSource_.src;
} else {
return this.el_.currentSrc;
}
};
/**
* Get poster
*
* @return {String}
* @method poster
*/
Html5.prototype.poster = function poster() {
return this.el_.poster;
};
/**
* Set poster
*
* @param {String} val URL to poster image
* @method
*/
Html5.prototype.setPoster = function setPoster(val) {
this.el_.poster = val;
};
/**
* Get preload attribute
*
* @return {String}
* @method preload
*/
Html5.prototype.preload = function preload() {
return this.el_.preload;
};
/**
* Set preload attribute
*
* @param {String} val Value for preload attribute
* @method setPreload
*/
Html5.prototype.setPreload = function setPreload(val) {
this.el_.preload = val;
};
/**
* Get autoplay attribute
*
* @return {String}
* @method autoplay
*/
Html5.prototype.autoplay = function autoplay() {
return this.el_.autoplay;
};
/**
* Set autoplay attribute
*
* @param {String} val Value for preload attribute
* @method setAutoplay
*/
Html5.prototype.setAutoplay = function setAutoplay(val) {
this.el_.autoplay = val;
};
/**
* Get controls attribute
*
* @return {String}
* @method controls
*/
Html5.prototype.controls = function controls() {
return this.el_.controls;
};
/**
* Set controls attribute
*
* @param {String} val Value for controls attribute
* @method setControls
*/
Html5.prototype.setControls = function setControls(val) {
this.el_.controls = !!val;
};
/**
* Get loop attribute
*
* @return {String}
* @method loop
*/
Html5.prototype.loop = function loop() {
return this.el_.loop;
};
/**
* Set loop attribute
*
* @param {String} val Value for loop attribute
* @method setLoop
*/
Html5.prototype.setLoop = function setLoop(val) {
this.el_.loop = val;
};
/**
* Get error value
*
* @return {String}
* @method error
*/
Html5.prototype.error = function error() {
return this.el_.error;
};
/**
* Get whether or not the player is in the "seeking" state
*
* @return {Boolean}
* @method seeking
*/
Html5.prototype.seeking = function seeking() {
return this.el_.seeking;
};
/**
* Get a TimeRanges object that represents the
* ranges of the media resource to which it is possible
* for the user agent to seek.
*
* @return {TimeRangeObject}
* @method seekable
*/
Html5.prototype.seekable = function seekable() {
return this.el_.seekable;
};
/**
* Get if video ended
*
* @return {Boolean}
* @method ended
*/
Html5.prototype.ended = function ended() {
return this.el_.ended;
};
/**
* Get the value of the muted content attribute
* This attribute has no dynamic effect, it only
* controls the default state of the element
*
* @return {Boolean}
* @method defaultMuted
*/
Html5.prototype.defaultMuted = function defaultMuted() {
return this.el_.defaultMuted;
};
/**
* Get desired speed at which the media resource is to play
*
* @return {Number}
* @method playbackRate
*/
Html5.prototype.playbackRate = function playbackRate() {
return this.el_.playbackRate;
};
/**
* Returns a TimeRanges object that represents the ranges of the
* media resource that the user agent has played.
* @return {TimeRangeObject} the range of points on the media
* timeline that has been reached through normal playback
* @see https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-played
*/
Html5.prototype.played = function played() {
return this.el_.played;
};
/**
* Set desired speed at which the media resource is to play
*
* @param {Number} val Speed at which the media resource is to play
* @method setPlaybackRate
*/
Html5.prototype.setPlaybackRate = function setPlaybackRate(val) {
this.el_.playbackRate = val;
};
/**
* Get the current state of network activity for the element, from
* the list below
* NETWORK_EMPTY (numeric value 0)
* NETWORK_IDLE (numeric value 1)
* NETWORK_LOADING (numeric value 2)
* NETWORK_NO_SOURCE (numeric value 3)
*
* @return {Number}
* @method networkState
*/
Html5.prototype.networkState = function networkState() {
return this.el_.networkState;
};
/**
* Get a value that expresses the current state of the element
* with respect to rendering the current playback position, from
* the codes in the list below
* HAVE_NOTHING (numeric value 0)
* HAVE_METADATA (numeric value 1)
* HAVE_CURRENT_DATA (numeric value 2)
* HAVE_FUTURE_DATA (numeric value 3)
* HAVE_ENOUGH_DATA (numeric value 4)
*
* @return {Number}
* @method readyState
*/
Html5.prototype.readyState = function readyState() {
return this.el_.readyState;
};
/**
* Get width of video
*
* @return {Number}
* @method videoWidth
*/
Html5.prototype.videoWidth = function videoWidth() {
return this.el_.videoWidth;
};
/**
* Get height of video
*
* @return {Number}
* @method videoHeight
*/
Html5.prototype.videoHeight = function videoHeight() {
return this.el_.videoHeight;
};
/**
* Get text tracks
*
* @return {TextTrackList}
* @method textTracks
*/
Html5.prototype.textTracks = function textTracks() {
return _Tech.prototype.textTracks.call(this);
};
/**
* Creates and returns a text track object
*
* @param {String} kind Text track kind (subtitles, captions, descriptions
* chapters and metadata)
* @param {String=} label Label to identify the text track
* @param {String=} language Two letter language abbreviation
* @return {TextTrackObject}
* @method addTextTrack
*/
Html5.prototype.addTextTrack = function addTextTrack(kind, label, language) {
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.addTextTrack.call(this, kind, label, language);
}
return this.el_.addTextTrack(kind, label, language);
};
/**
* Creates a remote text track object and returns a html track element
*
* @param {Object} options The object should contain values for
* kind, language, label and src (location of the WebVTT file)
* @return {HTMLTrackElement}
* @method addRemoteTextTrack
*/
Html5.prototype.addRemoteTextTrack = function addRemoteTextTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.addRemoteTextTrack.call(this, options);
}
var htmlTrackElement = _globalDocument2['default'].createElement('track');
if (options.kind) {
htmlTrackElement.kind = options.kind;
}
if (options.label) {
htmlTrackElement.label = options.label;
}
if (options.language || options.srclang) {
htmlTrackElement.srclang = options.language || options.srclang;
}
if (options['default']) {
htmlTrackElement['default'] = options['default'];
}
if (options.id) {
htmlTrackElement.id = options.id;
}
if (options.src) {
htmlTrackElement.src = options.src;
}
this.el().appendChild(htmlTrackElement);
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);
this.remoteTextTracks().addTrack_(htmlTrackElement.track);
return htmlTrackElement;
};
/**
* Remove remote text track from TextTrackList object
*
* @param {TextTrackObject} track Texttrack object to remove
* @method removeRemoteTextTrack
*/
Html5.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
if (!this['featuresNativeTextTracks']) {
return _Tech.prototype.removeRemoteTextTrack.call(this, track);
}
var tracks = undefined,
i = undefined;
var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);
// remove HTMLTrackElement and TextTrack from remote list
this.remoteTextTrackEls().removeTrackElement_(trackElement);
this.remoteTextTracks().removeTrack_(track);
tracks = this.$$('track');
i = tracks.length;
while (i--) {
if (track === tracks[i] || track === tracks[i].track) {
this.el().removeChild(tracks[i]);
}
}
};
return Html5;
})(_techJs2['default']);
Html5.TEST_VID = _globalDocument2['default'].createElement('video');
var track = _globalDocument2['default'].createElement('track');
track.kind = 'captions';
track.srclang = 'en';
track.label = 'English';
Html5.TEST_VID.appendChild(track);
/*
* Check if HTML5 video is supported by this browser/device
*
* @return {Boolean}
*/
Html5.isSupported = function () {
// IE9 with no Media Player is a LIAR! (#984)
try {
Html5.TEST_VID['volume'] = 0.5;
} catch (e) {
return false;
}
return !!Html5.TEST_VID.canPlayType;
};
// Add Source Handler pattern functions to this tech
_techJs2['default'].withSourceHandlers(Html5);
/*
* The default native source handler.
* This simply passes the source to the video element. Nothing fancy.
*
* @param {Object} source The source object
* @param {Html5} tech The instance of the HTML5 tech
*/
Html5.nativeSourceHandler = {};
/*
* Check if the video element can play the given videotype
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Html5.nativeSourceHandler.canPlayType = function (type) {
// IE9 on Windows 7 without MediaPlayer throws an error here
// https://github.com/videojs/video.js/issues/519
try {
return Html5.TEST_VID.canPlayType(type);
} catch (e) {
return '';
}
};
/*
* Check if the video element can handle the source natively
*
* @param {Object} source The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Html5.nativeSourceHandler.canHandleSource = function (source) {
var match, ext;
// If a type was provided we should rely on that
if (source.type) {
return Html5.nativeSourceHandler.canPlayType(source.type);
} else if (source.src) {
// If no type, fall back to checking 'video/[EXTENSION]'
ext = Url.getFileExtension(source.src);
return Html5.nativeSourceHandler.canPlayType('video/' + ext);
}
return '';
};
/*
* Pass the source to the video element
* Adaptive source handlers will have more complicated workflows before passing
* video data to the video element
*
* @param {Object} source The source object
* @param {Html5} tech The instance of the Html5 tech
* @param {Object} options The options to pass to the source
*/
Html5.nativeSourceHandler.handleSource = function (source, tech, options) {
tech.setSrc(source.src);
};
/*
* Clean up the source handler when disposing the player or switching sources..
* (no cleanup is needed when supporting the format natively)
*/
Html5.nativeSourceHandler.dispose = function () {};
// Register the native source handler
Html5.registerSourceHandler(Html5.nativeSourceHandler);
/*
* Check if the volume can be changed in this browser/device.
* Volume cannot be changed in a lot of mobile devices.
* Specifically, it can't be changed from 1 on iOS.
*
* @return {Boolean}
*/
Html5.canControlVolume = function () {
var volume = Html5.TEST_VID.volume;
Html5.TEST_VID.volume = volume / 2 + 0.1;
return volume !== Html5.TEST_VID.volume;
};
/*
* Check if playbackRate is supported in this browser/device.
*
* @return {Boolean}
*/
Html5.canControlPlaybackRate = function () {
// Playback rate API is implemented in Android Chrome, but doesn't do anything
// https://github.com/videojs/video.js/issues/3180
if (browser.IS_ANDROID && browser.IS_CHROME) {
return false;
}
var playbackRate = Html5.TEST_VID.playbackRate;
Html5.TEST_VID.playbackRate = playbackRate / 2 + 0.1;
return playbackRate !== Html5.TEST_VID.playbackRate;
};
/*
* Check to see if native text tracks are supported by this browser/device
*
* @return {Boolean}
*/
Html5.supportsNativeTextTracks = function () {
var supportsTextTracks;
// Figure out native text track support
// If mode is a number, we cannot change it because it'll disappear from view.
// Browsers with numeric modes include IE10 and older (<=2013) samsung android models.
// Firefox isn't playing nice either with modifying the mode
// TODO: Investigate firefox: https://github.com/videojs/video.js/issues/1862
supportsTextTracks = !!Html5.TEST_VID.textTracks;
if (supportsTextTracks && Html5.TEST_VID.textTracks.length > 0) {
supportsTextTracks = typeof Html5.TEST_VID.textTracks[0]['mode'] !== 'number';
}
if (supportsTextTracks && browser.IS_FIREFOX) {
supportsTextTracks = false;
}
if (supportsTextTracks && !('onremovetrack' in Html5.TEST_VID.textTracks)) {
supportsTextTracks = false;
}
return supportsTextTracks;
};
/*
* Check to see if native video tracks are supported by this browser/device
*
* @return {Boolean}
*/
Html5.supportsNativeVideoTracks = function () {
var supportsVideoTracks = !!Html5.TEST_VID.videoTracks;
return supportsVideoTracks;
};
/*
* Check to see if native audio tracks are supported by this browser/device
*
* @return {Boolean}
*/
Html5.supportsNativeAudioTracks = function () {
var supportsAudioTracks = !!Html5.TEST_VID.audioTracks;
return supportsAudioTracks;
};
/**
* An array of events available on the Html5 tech.
*
* @private
* @type {Array}
*/
Html5.Events = ['loadstart', 'suspend', 'abort', 'error', 'emptied', 'stalled', 'loadedmetadata', 'loadeddata', 'canplay', 'canplaythrough', 'playing', 'waiting', 'seeking', 'seeked', 'ended', 'durationchange', 'timeupdate', 'progress', 'play', 'pause', 'ratechange', 'volumechange'];
/*
* Set the tech's volume control support status
*
* @type {Boolean}
*/
Html5.prototype['featuresVolumeControl'] = Html5.canControlVolume();
/*
* Set the tech's playbackRate support status
*
* @type {Boolean}
*/
Html5.prototype['featuresPlaybackRate'] = Html5.canControlPlaybackRate();
/*
* Set the tech's status on moving the video element.
* In iOS, if you move a video element in the DOM, it breaks video playback.
*
* @type {Boolean}
*/
Html5.prototype['movingMediaElementInDOM'] = !browser.IS_IOS;
/*
* Set the the tech's fullscreen resize support status.
* HTML video is able to automatically resize when going to fullscreen.
* (No longer appears to be used. Can probably be removed.)
*/
Html5.prototype['featuresFullscreenResize'] = true;
/*
* Set the tech's progress event support status
* (this disables the manual progress events of the Tech)
*/
Html5.prototype['featuresProgressEvents'] = true;
/*
* Sets the tech's status on native text track support
*
* @type {Boolean}
*/
Html5.prototype['featuresNativeTextTracks'] = Html5.supportsNativeTextTracks();
/**
* Sets the tech's status on native text track support
*
* @type {Boolean}
*/
Html5.prototype['featuresNativeVideoTracks'] = Html5.supportsNativeVideoTracks();
/**
* Sets the tech's status on native audio track support
*
* @type {Boolean}
*/
Html5.prototype['featuresNativeAudioTracks'] = Html5.supportsNativeAudioTracks();
// HTML5 Feature detection and Device Fixes --------------------------------- //
var canPlayType = undefined;
var mpegurlRE = /^application\/(?:x-|vnd\.apple\.)mpegurl/i;
var mp4RE = /^video\/mp4/i;
Html5.patchCanPlayType = function () {
// Android 4.0 and above can play HLS to some extent but it reports being unable to do so
if (browser.ANDROID_VERSION >= 4.0) {
if (!canPlayType) {
canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
}
Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
if (type && mpegurlRE.test(type)) {
return 'maybe';
}
return canPlayType.call(this, type);
};
}
// Override Android 2.2 and less canPlayType method which is broken
if (browser.IS_OLD_ANDROID) {
if (!canPlayType) {
canPlayType = Html5.TEST_VID.constructor.prototype.canPlayType;
}
Html5.TEST_VID.constructor.prototype.canPlayType = function (type) {
if (type && mp4RE.test(type)) {
return 'maybe';
}
return canPlayType.call(this, type);
};
}
};
Html5.unpatchCanPlayType = function () {
var r = Html5.TEST_VID.constructor.prototype.canPlayType;
Html5.TEST_VID.constructor.prototype.canPlayType = canPlayType;
canPlayType = null;
return r;
};
// by default, patch the video element
Html5.patchCanPlayType();
Html5.disposeMediaElement = function (el) {
if (!el) {
return;
}
if (el.parentNode) {
el.parentNode.removeChild(el);
}
// remove any child track or source nodes to prevent their loading
while (el.hasChildNodes()) {
el.removeChild(el.firstChild);
}
// remove any src reference. not setting `src=''` because that causes a warning
// in firefox
el.removeAttribute('src');
// force the media element to update its loading state by calling load()
// however IE on Windows 7N has a bug that throws an error so need a try/catch (#793)
if (typeof el.load === 'function') {
// wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
(function () {
try {
el.load();
} catch (e) {
// not supported
}
})();
}
};
Html5.resetMediaElement = function (el) {
if (!el) {
return;
}
var sources = el.querySelectorAll('source');
var i = sources.length;
while (i--) {
el.removeChild(sources[i]);
}
// remove any src reference.
// not setting `src=''` because that throws an error
el.removeAttribute('src');
if (typeof el.load === 'function') {
// wrapping in an iife so it's not deoptimized (#1060#discussion_r10324473)
(function () {
try {
el.load();
} catch (e) {}
})();
}
};
_component2['default'].registerComponent('Html5', Html5);
_techJs2['default'].registerTech('Html5', Html5);
exports['default'] = Html5;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90ZWNoL2h0bWw1LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQkFLaUIsV0FBVzs7Ozt5QkFDTixjQUFjOzs7OzBCQUNmLGlCQUFpQjs7SUFBMUIsR0FBRzs7MEJBQ00saUJBQWlCOztJQUExQixHQUFHOzt5QkFDSyxnQkFBZ0I7O0lBQXhCLEVBQUU7OzBCQUNFLGlCQUFpQjs7OztvQkFDaEIsTUFBTTs7OztzQ0FDRCxzQ0FBc0M7Ozs7OEJBQ25DLHFCQUFxQjs7SUFBbEMsT0FBTzs7OEJBQ0UsaUJBQWlCOzs7OzRCQUNuQixlQUFlOzs7OzRCQUNmLGVBQWU7Ozs7bUNBQ1QsMkJBQTJCOzs7O2tDQUM1QiwyQkFBMkI7Ozs7Ozs7Ozs7Ozs7SUFVN0MsS0FBSztZQUFMLEtBQUs7O0FBRUUsV0FGUCxLQUFLLENBRUcsT0FBTyxFQUFFLEtBQUssRUFBQzs7OzBCQUZ2QixLQUFLOztBQUdQLHFCQUFNLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzs7QUFFdEIsUUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUM5QixRQUFJLGlCQUFpQixHQUFHLEtBQUssQ0FBQzs7Ozs7O0FBTTlCLFFBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxHQUFHLElBQUssT0FBTyxDQUFDLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixLQUFLLENBQUMsQ0FBQyxBQUFDLEVBQUU7QUFDMUcsVUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN4QixNQUFNO0FBQ0wsVUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDaEM7O0FBRUQsUUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFOztBQUU1QixVQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FB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QUNmLENBQUEsRUFBRyxDQUFDO0dBQ047Q0FDRixDQUFDOztBQUVGLHVCQUFVLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUM1QyxvQkFBSyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO3FCQUNuQixLQUFLIiwiZmlsZSI6InNyYy9qcy90ZWNoL2h0bWw1LmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBodG1sNS5qc1xuICogSFRNTDUgTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIEhUTUw1IE1lZGlhIEFQSVxuICovXG5cbmltcG9ydCBUZWNoIGZyb20gJy4vdGVjaC5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIFVybCBmcm9tICcuLi91dGlscy91cmwuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHRzbWwgZnJvbSAndHNtbCc7XG5pbXBvcnQgVGV4dFRyYWNrIGZyb20gJy4uLy4uLy4uL3NyYy9qcy90cmFja3MvdGV4dC10cmFjay5qcyc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGFzc2lnbiBmcm9tICdvYmplY3QuYXNzaWduJztcbmltcG9ydCBtZXJnZU9wdGlvbnMgZnJvbSAnLi4vdXRpbHMvbWVyZ2Utb3B0aW9ucy5qcyc7XG5pbXBvcnQgdG9UaXRsZUNhc2UgZnJvbSAnLi4vdXRpbHMvdG8tdGl0bGUtY2FzZS5qcyc7XG5cbi8qKlxuICogSFRNTDUgTWVkaWEgQ29udHJvbGxlciAtIFdyYXBwZXIgZm9yIEhUTUw1IE1lZGlhIEFQSVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb249fSByZWFkeSBSZWFkeSBjYWxsYmFjayBmdW5jdGlvblxuICogQGV4dGVuZHMgVGVjaFxuICogQGNsYXNzIEh0bWw1XG4gKi9cbmNsYXNzIEh0bWw1IGV4dGVuZHMgVGVjaCB7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9ucywgcmVhZHkpe1xuICAgIHN1cGVyKG9wdGlvbnMsIHJlYWR5KTtcblxuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIGxldCBjcm9zc29yaWdpblRyYWNrcyA9IGZhbHNlO1xuXG4gICAgLy8gU2V0IHRoZSBzb3VyY2UgaWYgb25lIGlzIHByb3ZpZGVkXG4gICAgLy8gMSkgQ2hlY2sgaWYgdGhlIHNvdXJjZSBpcyBuZXcgKGlmIG5vdCwgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBzbyBwbGF5YmFjayBpc24ndCBpbnRlcnJ1cHRlZClcbiAgICAvLyAyKSBDaGVjayB0byBzZWUgaWYgdGhlIG5ldHdvcmsgc3RhdGUgb2YgdGhlIHRhZyB3YXMgZmFpbGVkIGF0IGluaXQsIGFuZCBpZiBzbywgcmVzZXQgdGhlIHNvdXJjZVxuICAgIC8vIGFueXdheSBzbyB0aGUgZXJyb3IgZ2V0cyBmaXJlZC5cbiAgICBpZiAoc291cmNlICYmICh0aGlzLmVsXy5jdXJyZW50U3JjICE9PSBzb3VyY2Uuc3JjIHx8IChvcHRpb25zLnRhZyAmJiBvcHRpb25zLnRhZy5pbml0TmV0d29ya1N0YXRlXyA9PT0gMykpKSB7XG4gICAgICB0aGlzLnNldFNvdXJjZShzb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZUxhdGVJbml0Xyh0aGlzLmVsXyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZWxfLmhhc0NoaWxkTm9kZXMoKSkge1xuXG4gICAgICBsZXQgbm9kZXMgPSB0aGlzLmVsXy5jaGlsZE5vZGVzO1xuICAgICAgbGV0IG5vZGVzTGVuZ3RoID0gbm9kZXMubGVuZ3RoO1xuICAgICAgbGV0IHJlbW92ZU5vZGVzID0gW107XG5cbiAgICAgIHdoaWxlIChub2Rlc0xlbmd0aC0tKSB7XG4gICAgICAgIGxldCBub2RlID0gbm9kZXNbbm9kZXNMZW5ndGhdO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndHJhY2snKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgICAgICAgLy8gRW1wdHkgdmlkZW8gdGFnIHRyYWNrcyBzbyB0aGUgYnVpbHQtaW4gcGxheWVyIGRvZXNuJ3QgdXNlIHRoZW0gYWxzby5cbiAgICAgICAgICAgIC8vIFRoaXMgbWF5IG5vdCBiZSBmYXN0IGVub3VnaCB0byBzdG9wIEhUTUw1IGJyb3dzZXJzIGZyb20gcmVhZGluZyB0aGUgdGFnc1xuICAgICAgICAgICAgLy8gc28gd2UnbGwgbmVlZCB0byB0dXJuIG9mZiBhbnkgZGVmYXVsdCB0cmFja3MgaWYgd2UncmUgbWFudWFsbHkgZG9pbmdcbiAgICAgICAgICAgIC8vIGNhcHRpb25zIGFuZCBzdWJ0aXRsZXMuIHZpZGVvRWxlbWVudC50ZXh0VHJhY2tzXG4gICAgICAgICAgICByZW1vdmVOb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzdG9yZSBIVE1MVHJhY2tFbGVtZW50IGFuZCBUZXh0VHJhY2sgdG8gcmVtb3RlIGxpc3RcbiAgICAgICAgICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuYWRkVHJhY2tFbGVtZW50Xyhub2RlKTtcbiAgICAgICAgICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrcygpLmFkZFRyYWNrXyhub2RlLnRyYWNrKTtcbiAgICAgICAgICAgIGlmICghY3Jvc3NvcmlnaW5UcmFja3MgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5lbF8uaGFzQXR0cmlidXRlKCdjcm9zc29yaWdpbicpICYmXG4gICAgICAgICAgICAgICAgVXJsLmlzQ3Jvc3NPcmlnaW4obm9kZS5zcmMpKSB7XG4gICAgICAgICAgICAgIGNyb3Nzb3JpZ2luVHJhY2tzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChsZXQgaT0wOyBpPHJlbW92ZU5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMuZWxfLnJlbW92ZUNoaWxkKHJlbW92ZU5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgdHJhY2tUeXBlcyA9IFsnYXVkaW8nLCAndmlkZW8nXTtcblxuICAgIC8vIFByb3h5TmF0aXZlVGV4dFRyYWNrc1xuICAgIHRyYWNrVHlwZXMuZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgbGV0IGNhcGl0YWxUeXBlID0gdG9UaXRsZUNhc2UodHlwZSk7XG5cbiAgICAgIGlmICghdGhpc1tgZmVhdHVyZXNOYXRpdmUke2NhcGl0YWxUeXBlfVRyYWNrc2BdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCB0bCA9IHRoaXMuZWwoKVtgJHt0eXBlfVRyYWNrc2BdO1xuXG4gICAgICBpZiAodGwgJiYgdGwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICB0bC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXNbYGhhbmRsZSR7Y2FwaXRhbFR5cGV9VHJhY2tDaGFuZ2VfYF0pKTtcbiAgICAgICAgdGwuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCBGbi5iaW5kKHRoaXMsIHRoaXNbYGhhbmRsZSR7Y2FwaXRhbFR5cGV9VHJhY2tBZGRfYF0pKTtcbiAgICAgICAgdGwuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCBGbi5iaW5kKHRoaXMsIHRoaXNbYGhhbmRsZSR7Y2FwaXRhbFR5cGV9VHJhY2tSZW1vdmVfYF0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgaWYgKGNyb3Nzb3JpZ2luVHJhY2tzKSB7XG4gICAgICAgIGxvZy53YXJuKHRzbWxgVGV4dCBUcmFja3MgYXJlIGJlaW5nIGxvYWRlZCBmcm9tIGFub3RoZXIgb3JpZ2luIGJ1dCB0aGUgY3Jvc3NvcmlnaW4gYXR0cmlidXRlIGlzbid0IHVzZWQuIFxuICAgICAgICAgICAgVGhpcyBtYXkgcHJldmVudCB0ZXh0IHRyYWNrcyBmcm9tIGxvYWRpbmcuYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuaGFuZGxlVGV4dFRyYWNrQ2hhbmdlXyA9IEZuLmJpbmQodGhpcywgdGhpcy5oYW5kbGVUZXh0VHJhY2tDaGFuZ2UpO1xuICAgICAgdGhpcy5oYW5kbGVUZXh0VHJhY2tBZGRfID0gRm4uYmluZCh0aGlzLCB0aGlzLmhhbmRsZVRleHRUcmFja0FkZCk7XG4gICAgICB0aGlzLmhhbmRsZVRleHRUcmFja1JlbW92ZV8gPSBGbi5iaW5kKHRoaXMsIHRoaXMuaGFuZGxlVGV4dFRyYWNrUmVtb3ZlKTtcbiAgICAgIHRoaXMucHJveHlOYXRpdmVUZXh0VHJhY2tzXygpO1xuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAvLyBPdXIgZ29hbCBzaG91bGQgYmUgdG8gZ2V0IHRoZSBjdXN0b20gY29udHJvbHMgb24gbW9iaWxlIHNvbGlkIGV2ZXJ5d2hlcmVcbiAgICAvLyBzbyB3ZSBjYW4gcmVtb3ZlIHRoaXMgYWxsIHRvZ2V0aGVyLiBSaWdodCBub3cgdGhpcyB3aWxsIGJsb2NrIGN1c3RvbVxuICAgIC8vIGNvbnRyb2xzIG9uIHRvdWNoIGVuYWJsZWQgbGFwdG9wcyBsaWtlIHRoZSBDaHJvbWUgUGl4ZWxcbiAgICBpZiAoYnJvd3Nlci5UT1VDSF9FTkFCTEVEICYmIG9wdGlvbnMubmF0aXZlQ29udHJvbHNGb3JUb3VjaCA9PT0gdHJ1ZSB8fFxuICAgICAgICBicm93c2VyLklTX0lQSE9ORSB8fFxuICAgICAgICBicm93c2VyLklTX05BVElWRV9BTkRST0lEKSB7XG4gICAgICB0aGlzLnNldENvbnRyb2xzKHRydWUpO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlclJlYWR5KCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSBvZiBodG1sNSBtZWRpYSBlbGVtZW50XG4gICAqXG4gICAqIEBtZXRob2QgZGlzcG9zZVxuICAgKi9cbiAgZGlzcG9zZSgpIHtcbiAgICAvLyBVbi1Qcm94eU5hdGl2ZVRyYWNrc1xuICAgIFsnYXVkaW8nLCAndmlkZW8nLCAndGV4dCddLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgIGxldCBjYXBpdGFsVHlwZSA9IHRvVGl0bGVDYXNlKHR5cGUpO1xuICAgICAgbGV0IHRsID0gdGhpcy5lbF9bYCR7dHlwZX1UcmFja3NgXTtcblxuICAgICAgaWYgKHRsICYmIHRsLnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgdGwucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpc1tgaGFuZGxlJHtjYXBpdGFsVHlwZX1UcmFja0NoYW5nZV9gXSk7XG4gICAgICAgIHRsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdGhpc1tgaGFuZGxlJHtjYXBpdGFsVHlwZX1UcmFja0FkZF9gXSk7XG4gICAgICAgIHRsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdGhpc1tgaGFuZGxlJHtjYXBpdGFsVHlwZX1UcmFja1JlbW92ZV9gXSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBIdG1sNS5kaXNwb3NlTWVkaWFFbGVtZW50KHRoaXMuZWxfKTtcbiAgICAvLyB0ZWNoIHdpbGwgaGFuZGxlIGNsZWFyaW5nIG9mIHRoZSBlbXVsYXRlZCB0cmFjayBsaXN0XG4gICAgc3VwZXIuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgbGV0IGVsID0gdGhpcy5vcHRpb25zXy50YWc7XG5cbiAgICAvLyBDaGVjayBpZiB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgbW92aW5nIHRoZSBlbGVtZW50IGludG8gdGhlIGJveC5cbiAgICAvLyBPbiB0aGUgaVBob25lIHZpZGVvIHdpbGwgYnJlYWsgaWYgeW91IG1vdmUgdGhlIGVsZW1lbnQsXG4gICAgLy8gU28gd2UgaGF2ZSB0byBjcmVhdGUgYSBicmFuZCBuZXcgZWxlbWVudC5cbiAgICBpZiAoIWVsIHx8IHRoaXNbJ21vdmluZ01lZGlhRWxlbWVudEluRE9NJ10gPT09IGZhbHNlKSB7XG5cbiAgICAgIC8vIElmIHRoZSBvcmlnaW5hbCB0YWcgaXMgc3RpbGwgdGhlcmUsIGNsb25lIGFuZCByZW1vdmUgaXQuXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgY29uc3QgY2xvbmUgPSBlbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgIGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lLCBlbCk7XG4gICAgICAgIEh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQoZWwpO1xuICAgICAgICBlbCA9IGNsb25lO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xuXG4gICAgICAgIC8vIGRldGVybWluZSBpZiBuYXRpdmUgY29udHJvbHMgc2hvdWxkIGJlIHVzZWRcbiAgICAgICAgbGV0IHRhZ0F0dHJpYnV0ZXMgPSB0aGlzLm9wdGlvbnNfLnRhZyAmJiBEb20uZ2V0RWxBdHRyaWJ1dGVzKHRoaXMub3B0aW9uc18udGFnKTtcbiAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBtZXJnZU9wdGlvbnMoe30sIHRhZ0F0dHJpYnV0ZXMpO1xuICAgICAgICBpZiAoIWJyb3dzZXIuVE9VQ0hfRU5BQkxFRCB8fCB0aGlzLm9wdGlvbnNfLm5hdGl2ZUNvbnRyb2xzRm9yVG91Y2ggIT09IHRydWUpIHtcbiAgICAgICAgICBkZWxldGUgYXR0cmlidXRlcy5jb250cm9scztcbiAgICAgICAgfVxuXG4gICAgICAgIERvbS5zZXRFbEF0dHJpYnV0ZXMoZWwsXG4gICAgICAgICAgYXNzaWduKGF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGlkOiB0aGlzLm9wdGlvbnNfLnRlY2hJZCxcbiAgICAgICAgICAgIGNsYXNzOiAndmpzLXRlY2gnXG4gICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc3BlY2lmaWMgdGFnIHNldHRpbmdzLCBpbiBjYXNlIHRoZXkgd2VyZSBvdmVycmlkZGVuXG4gICAgbGV0IHNldHRpbmdzQXR0cnMgPSBbJ2F1dG9wbGF5JywncHJlbG9hZCcsJ2xvb3AnLCdtdXRlZCddO1xuICAgIGZvciAobGV0IGkgPSBzZXR0aW5nc0F0dHJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBhdHRyID0gc2V0dGluZ3NBdHRyc1tpXTtcbiAgICAgIGxldCBvdmVyd3JpdGVBdHRycyA9IHt9O1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnNfW2F0dHJdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvdmVyd3JpdGVBdHRyc1thdHRyXSA9IHRoaXMub3B0aW9uc19bYXR0cl07XG4gICAgICB9XG4gICAgICBEb20uc2V0RWxBdHRyaWJ1dGVzKGVsLCBvdmVyd3JpdGVBdHRycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGVsO1xuICAgIC8vIGplbm5paXNhd2Vzb21lID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIElmIHdlJ3JlIGxvYWRpbmcgdGhlIHBsYXliYWNrIG9iamVjdCBhZnRlciBpdCBoYXMgc3RhcnRlZCBsb2FkaW5nXG4gIC8vIG9yIHBsYXlpbmcgdGhlIHZpZGVvIChvZnRlbiB3aXRoIGF1dG9wbGF5IG9uKSB0aGVuIHRoZSBsb2Fkc3RhcnQgZXZlbnRcbiAgLy8gaGFzIGFscmVhZHkgZmlyZWQgYW5kIHdlIG5lZWQgdG8gZmlyZSBpdCBtYW51YWxseSBiZWNhdXNlIG1hbnkgdGhpbmdzXG4gIC8vIHJlbHkgb24gaXQuXG4gIGhhbmRsZUxhdGVJbml0XyhlbCkge1xuICAgIGlmIChlbC5uZXR3b3JrU3RhdGUgPT09IDAgfHwgZWwubmV0d29ya1N0YXRlID09PSAzKSB7XG4gICAgICAvLyBUaGUgdmlkZW8gZWxlbWVudCBoYXNuJ3Qgc3RhcnRlZCBsb2FkaW5nIHRoZSBzb3VyY2UgeWV0XG4gICAgICAvLyBvciBkaWRuJ3QgZmluZCBhIHNvdXJjZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChlbC5yZWFkeVN0YXRlID09PSAwKSB7XG4gICAgICAvLyBOZXR3b3JrU3RhdGUgaXMgc2V0IHN5bmNocm9ub3VzbHkgQlVUIGxvYWRzdGFydCBpcyBmaXJlZCBhdCB0aGVcbiAgICAgIC8vIGVuZCBvZiB0aGUgY3VycmVudCBzdGFjaywgdXN1YWxseSBiZWZvcmUgc2V0SW50ZXJ2YWwoZm4sIDApLlxuICAgICAgLy8gU28gYXQgdGhpcyBwb2ludCB3ZSBrbm93IGxvYWRzdGFydCBtYXkgaGF2ZSBhbHJlYWR5IGZpcmVkIG9yIGlzXG4gICAgICAvLyBhYm91dCB0byBmaXJlLCBhbmQgZWl0aGVyIHdheSB0aGUgcGxheWVyIGhhc24ndCBzZWVuIGl0IHlldC5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZmlyZSBsb2Fkc3RhcnQgcHJlbWF0dXJlbHkgaGVyZSBhbmQgY2F1c2UgYVxuICAgICAgLy8gZG91YmxlIGxvYWRzdGFydCBzbyB3ZSdsbCB3YWl0IGFuZCBzZWUgaWYgaXQgaGFwcGVucyBiZXR3ZWVuIG5vd1xuICAgICAgLy8gYW5kIHRoZSBuZXh0IGxvb3AsIGFuZCBmaXJlIGl0IGlmIG5vdC5cbiAgICAgIC8vIEhPV0VWRVIsIHdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgaXQgZmlyZXMgYmVmb3JlIGxvYWRlZG1ldGFkYXRhXG4gICAgICAvLyB3aGljaCBjb3VsZCBhbHNvIGhhcHBlbiBiZXR3ZWVuIG5vdyBhbmQgdGhlIG5leHQgbG9vcCwgc28gd2UnbGxcbiAgICAgIC8vIHdhdGNoIGZvciB0aGF0IGFsc28uXG4gICAgICBsZXQgbG9hZHN0YXJ0RmlyZWQgPSBmYWxzZTtcbiAgICAgIGxldCBzZXRMb2Fkc3RhcnRGaXJlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBsb2Fkc3RhcnRGaXJlZCA9IHRydWU7XG4gICAgICB9O1xuICAgICAgdGhpcy5vbignbG9hZHN0YXJ0Jywgc2V0TG9hZHN0YXJ0RmlyZWQpO1xuXG4gICAgICBsZXQgdHJpZ2dlckxvYWRzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBXZSBkaWQgbWlzcyB0aGUgb3JpZ2luYWwgbG9hZHN0YXJ0LiBNYWtlIHN1cmUgdGhlIHBsYXllclxuICAgICAgICAvLyBzZWVzIGxvYWRzdGFydCBiZWZvcmUgbG9hZGVkbWV0YWRhdGFcbiAgICAgICAgaWYgKCFsb2Fkc3RhcnRGaXJlZCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlcignbG9hZHN0YXJ0Jyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLm9uKCdsb2FkZWRtZXRhZGF0YScsIHRyaWdnZXJMb2Fkc3RhcnQpO1xuXG4gICAgICB0aGlzLnJlYWR5KGZ1bmN0aW9uKCl7XG4gICAgICAgIHRoaXMub2ZmKCdsb2Fkc3RhcnQnLCBzZXRMb2Fkc3RhcnRGaXJlZCk7XG4gICAgICAgIHRoaXMub2ZmKCdsb2FkZWRtZXRhZGF0YScsIHRyaWdnZXJMb2Fkc3RhcnQpO1xuXG4gICAgICAgIGlmICghbG9hZHN0YXJ0RmlyZWQpIHtcbiAgICAgICAgICAvLyBXZSBkaWQgbWlzcyB0aGUgb3JpZ2luYWwgbmF0aXZlIGxvYWRzdGFydC4gRmlyZSBpdCBub3cuXG4gICAgICAgICAgdGhpcy50cmlnZ2VyKCdsb2Fkc3RhcnQnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBGcm9tIGhlcmUgb24gd2Uga25vdyB0aGF0IGxvYWRzdGFydCBhbHJlYWR5IGZpcmVkIGFuZCB3ZSBtaXNzZWQgaXQuXG4gICAgLy8gVGhlIG90aGVyIHJlYWR5U3RhdGUgZXZlbnRzIGFyZW4ndCBhcyBtdWNoIG9mIGEgcHJvYmxlbSBpZiB3ZSBkb3VibGVcbiAgICAvLyB0aGVtLCBzbyBub3QgZ29pbmcgdG8gZ28gdG8gYXMgbXVjaCB0cm91YmxlIGFzIGxvYWRzdGFydCB0byBwcmV2ZW50XG4gICAgLy8gdGhhdCB1bmxlc3Mgd2UgZmluZCByZWFzb24gdG8uXG4gICAgbGV0IGV2ZW50c1RvVHJpZ2dlciA9IFsnbG9hZHN0YXJ0J107XG5cbiAgICAvLyBsb2FkZWRtZXRhZGF0YTogbmV3bHkgZXF1YWwgdG8gSEFWRV9NRVRBREFUQSAoMSkgb3IgZ3JlYXRlclxuICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKCdsb2FkZWRtZXRhZGF0YScpO1xuXG4gICAgLy8gbG9hZGVkZGF0YTogbmV3bHkgaW5jcmVhc2VkIHRvIEhBVkVfQ1VSUkVOVF9EQVRBICgyKSBvciBncmVhdGVyXG4gICAgaWYgKGVsLnJlYWR5U3RhdGUgPj0gMikge1xuICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2xvYWRlZGRhdGEnKTtcbiAgICB9XG5cbiAgICAvLyBjYW5wbGF5OiBuZXdseSBpbmNyZWFzZWQgdG8gSEFWRV9GVVRVUkVfREFUQSAoMykgb3IgZ3JlYXRlclxuICAgIGlmIChlbC5yZWFkeVN0YXRlID49IDMpIHtcbiAgICAgIGV2ZW50c1RvVHJpZ2dlci5wdXNoKCdjYW5wbGF5Jyk7XG4gICAgfVxuXG4gICAgLy8gY2FucGxheXRocm91Z2g6IG5ld2x5IGVxdWFsIHRvIEhBVkVfRU5PVUdIX0RBVEEgKDQpXG4gICAgaWYgKGVsLnJlYWR5U3RhdGUgPj0gNCkge1xuICAgICAgZXZlbnRzVG9UcmlnZ2VyLnB1c2goJ2NhbnBsYXl0aHJvdWdoJyk7XG4gICAgfVxuXG4gICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBnaXZlIHRoZSBwbGF5ZXIgdGltZSB0byBhZGQgZXZlbnQgbGlzdGVuZXJzXG4gICAgdGhpcy5yZWFkeShmdW5jdGlvbigpe1xuICAgICAgZXZlbnRzVG9UcmlnZ2VyLmZvckVhY2goZnVuY3Rpb24odHlwZSl7XG4gICAgICAgIHRoaXMudHJpZ2dlcih0eXBlKTtcbiAgICAgIH0sIHRoaXMpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJveHlOYXRpdmVUZXh0VHJhY2tzXygpIHtcbiAgICBsZXQgdHQgPSB0aGlzLmVsKCkudGV4dFRyYWNrcztcblxuICAgIGlmICh0dCkge1xuICAgICAgLy8gQWRkIHRyYWNrcyAtIGlmIHBsYXllciBpcyBpbml0aWFsaXNlZCBhZnRlciBET00gbG9hZGVkLCB0ZXh0VHJhY2tzXG4gICAgICAvLyB3aWxsIG5vdCB0cmlnZ2VyIGFkZHRyYWNrXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMudGV4dFRyYWNrcygpLmFkZFRyYWNrXyh0dFtpXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0dC5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIHR0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuaGFuZGxlVGV4dFRyYWNrQ2hhbmdlXyk7XG4gICAgICAgIHR0LmFkZEV2ZW50TGlzdGVuZXIoJ2FkZHRyYWNrJywgdGhpcy5oYW5kbGVUZXh0VHJhY2tBZGRfKTtcbiAgICAgICAgdHQuYWRkRXZlbnRMaXN0ZW5lcigncmVtb3ZldHJhY2snLCB0aGlzLmhhbmRsZVRleHRUcmFja1JlbW92ZV8pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRleHRUcmFja0NoYW5nZShlKSB7XG4gICAgbGV0IHR0ID0gdGhpcy50ZXh0VHJhY2tzKCk7XG4gICAgdGhpcy50ZXh0VHJhY2tzKCkudHJpZ2dlcih7XG4gICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgIHRhcmdldDogdHQsXG4gICAgICBjdXJyZW50VGFyZ2V0OiB0dCxcbiAgICAgIHNyY0VsZW1lbnQ6IHR0XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVUZXh0VHJhY2tBZGQoZSkge1xuICAgIHRoaXMudGV4dFRyYWNrcygpLmFkZFRyYWNrXyhlLnRyYWNrKTtcbiAgfVxuXG4gIGhhbmRsZVRleHRUcmFja1JlbW92ZShlKSB7XG4gICAgdGhpcy50ZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2tfKGUudHJhY2spO1xuICB9XG5cbiAgaGFuZGxlVmlkZW9UcmFja0NoYW5nZV8oZSkge1xuICAgIGxldCB2dCA9IHRoaXMudmlkZW9UcmFja3MoKTtcbiAgICB0aGlzLnZpZGVvVHJhY2tzKCkudHJpZ2dlcih7XG4gICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgIHRhcmdldDogdnQsXG4gICAgICBjdXJyZW50VGFyZ2V0OiB2dCxcbiAgICAgIHNyY0VsZW1lbnQ6IHZ0XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVWaWRlb1RyYWNrQWRkXyhlKSB7XG4gICAgdGhpcy52aWRlb1RyYWNrcygpLmFkZFRyYWNrXyhlLnRyYWNrKTtcbiAgfVxuXG4gIGhhbmRsZVZpZGVvVHJhY2tSZW1vdmVfKGUpIHtcbiAgICB0aGlzLnZpZGVvVHJhY2tzKCkucmVtb3ZlVHJhY2tfKGUudHJhY2spO1xuICB9XG5cbiAgaGFuZGxlQXVkaW9UcmFja0NoYW5nZV8oZSkge1xuICAgIGxldCBhdWRpb1RyYWNrTGlzdCA9IHRoaXMuYXVkaW9UcmFja3MoKTtcbiAgICB0aGlzLmF1ZGlvVHJhY2tzKCkudHJpZ2dlcih7XG4gICAgICB0eXBlOiAnY2hhbmdlJyxcbiAgICAgIHRhcmdldDogYXVkaW9UcmFja0xpc3QsXG4gICAgICBjdXJyZW50VGFyZ2V0OiBhdWRpb1RyYWNrTGlzdCxcbiAgICAgIHNyY0VsZW1lbnQ6IGF1ZGlvVHJhY2tMaXN0XG4gICAgfSk7XG4gIH1cblxuICBoYW5kbGVBdWRpb1RyYWNrQWRkXyhlKSB7XG4gICAgdGhpcy5hdWRpb1RyYWNrcygpLmFkZFRyYWNrXyhlLnRyYWNrKTtcbiAgfVxuXG4gIGhhbmRsZUF1ZGlvVHJhY2tSZW1vdmVfKGUpIHtcbiAgICB0aGlzLmF1ZGlvVHJhY2tzKCkucmVtb3ZlVHJhY2tfKGUudHJhY2spO1xuICB9XG5cblxuICAvKipcbiAgICogUGxheSBmb3IgaHRtbDUgdGVjaFxuICAgKlxuICAgKiBAbWV0aG9kIHBsYXlcbiAgICovXG4gIHBsYXkoKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IHRoaXMuZWxfLnBsYXkoKTtcbiAgICAgIGlmIChwcm9taXNlKSAvLyBzdXBwcmVzcyB1bmNhdWdodCBET01FeGNlcHRpb25cbiAgICAgICAgICBwcm9taXNlLmNhdGNoKGZ1bmN0aW9uKCl7fSk7XG4gIH1cblxuICAvKipcbiAgICogUGF1c2UgZm9yIGh0bWw1IHRlY2hcbiAgICpcbiAgICogQG1ldGhvZCBwYXVzZVxuICAgKi9cbiAgcGF1c2UoKSB7IHRoaXMuZWxfLnBhdXNlKCk7IH1cblxuICAvKipcbiAgICogUGF1c2VkIGZvciBodG1sNSB0ZWNoXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBtZXRob2QgcGF1c2VkXG4gICAqL1xuICBwYXVzZWQoKSB7IHJldHVybiB0aGlzLmVsXy5wYXVzZWQ7IH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgdGltZVxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqIEBtZXRob2QgY3VycmVudFRpbWVcbiAgICovXG4gIGN1cnJlbnRUaW1lKCkgeyByZXR1cm4gdGhpcy5lbF8uY3VycmVudFRpbWU7IH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgdGltZVxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gc2Vjb25kcyBDdXJyZW50IHRpbWUgb2YgdmlkZW9cbiAgICogQG1ldGhvZCBzZXRDdXJyZW50VGltZVxuICAgKi9cbiAgc2V0Q3VycmVudFRpbWUoc2Vjb25kcykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmVsXy5jdXJyZW50VGltZSA9IHNlY29uZHM7XG4gICAgfSBjYXRjaChlKSB7XG4gICAgICBsb2coZSwgJ1ZpZGVvIGlzIG5vdCByZWFkeS4gKFZpZGVvLmpzKScpO1xuICAgICAgLy8gdGhpcy53YXJuaW5nKFZpZGVvSlMud2FybmluZ3MudmlkZW9Ob3RSZWFkeSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBkdXJhdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqIEBtZXRob2QgZHVyYXRpb25cbiAgICovXG4gIGR1cmF0aW9uKCkgeyByZXR1cm4gdGhpcy5lbF8uZHVyYXRpb24gfHwgMDsgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBUaW1lUmFuZ2Ugb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgaW50ZXJzZWN0aW9uXG4gICAqIG9mIHRoZSB0aW1lIHJhbmdlcyBmb3Igd2hpY2ggdGhlIHVzZXIgYWdlbnQgaGFzIGFsbFxuICAgKiByZWxldmFudCBtZWRpYVxuICAgKlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2VPYmplY3R9XG4gICAqIEBtZXRob2QgYnVmZmVyZWRcbiAgICovXG4gIGJ1ZmZlcmVkKCkgeyByZXR1cm4gdGhpcy5lbF8uYnVmZmVyZWQ7IH1cblxuICAvKipcbiAgICogR2V0IHZvbHVtZSBsZXZlbFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqIEBtZXRob2Qgdm9sdW1lXG4gICAqL1xuICB2b2x1bWUoKSB7IHJldHVybiB0aGlzLmVsXy52b2x1bWU7IH1cblxuICAvKipcbiAgICogU2V0IHZvbHVtZSBsZXZlbFxuICAgKlxuICAgKiBAcGFyYW0ge051bWJlcn0gcGVyY2VudEFzRGVjaW1hbCBWb2x1bWUgcGVyY2VudCBhcyBhIGRlY2ltYWxcbiAgICogQG1ldGhvZCBzZXRWb2x1bWVcbiAgICovXG4gIHNldFZvbHVtZShwZXJjZW50QXNEZWNpbWFsKSB7IHRoaXMuZWxfLnZvbHVtZSA9IHBlcmNlbnRBc0RlY2ltYWw7IH1cblxuICAvKipcbiAgICogR2V0IGlmIG11dGVkXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBtZXRob2QgbXV0ZWRcbiAgICovXG4gIG11dGVkKCkgeyByZXR1cm4gdGhpcy5lbF8ubXV0ZWQ7IH1cblxuICAvKipcbiAgICogU2V0IG11dGVkXG4gICAqXG4gICAqIEBwYXJhbSB7Qm9vbGVhbn0gSWYgcGxheWVyIGlzIHRvIGJlIG11dGVkIG9yIG5vdGVcbiAgICogQG1ldGhvZCBzZXRNdXRlZFxuICAgKi9cbiAgc2V0TXV0ZWQobXV0ZWQpIHsgdGhpcy5lbF8ubXV0ZWQgPSBtdXRlZDsgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGxheWVyIHdpZHRoXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogQG1ldGhvZCB3aWR0aFxuICAgKi9cbiAgd2lkdGgoKSB7IHJldHVybiB0aGlzLmVsXy5vZmZzZXRXaWR0aDsgfVxuXG4gIC8qKlxuICAgKiBHZXQgcGxheWVyIGhlaWdodFxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqIEBtZXRob2QgaGVpZ2h0XG4gICAqL1xuICBoZWlnaHQoKSB7ICByZXR1cm4gdGhpcy5lbF8ub2Zmc2V0SGVpZ2h0OyB9XG5cbiAgLyoqXG4gICAqIEdldCBpZiB0aGVyZSBpcyBmdWxsc2NyZWVuIHN1cHBvcnRcbiAgICpcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICogQG1ldGhvZCBzdXBwb3J0c0Z1bGxTY3JlZW5cbiAgICovXG4gIHN1cHBvcnRzRnVsbFNjcmVlbigpIHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZWxfLndlYmtpdEVudGVyRnVsbFNjcmVlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IHVzZXJBZ2VudCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuICAgICAgLy8gU2VlbXMgdG8gYmUgYnJva2VuIGluIENocm9taXVtL0Nocm9tZSAmJiBTYWZhcmkgaW4gTGVvcGFyZFxuICAgICAgaWYgKC9BbmRyb2lkLy50ZXN0KHVzZXJBZ2VudCkgfHwgIS9DaHJvbWV8TWFjIE9TIFggMTAuNS8udGVzdCh1c2VyQWdlbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0byBlbnRlciBmdWxsc2NyZWVuXG4gICAqXG4gICAqIEBtZXRob2QgZW50ZXJGdWxsU2NyZWVuXG4gICAqL1xuICBlbnRlckZ1bGxTY3JlZW4oKSB7XG4gICAgdmFyIHZpZGVvID0gdGhpcy5lbF87XG5cbiAgICBpZiAoJ3dlYmtpdERpc3BsYXlpbmdGdWxsc2NyZWVuJyBpbiB2aWRlbykge1xuICAgICAgdGhpcy5vbmUoJ3dlYmtpdGJlZ2luZnVsbHNjcmVlbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLm9uZSgnd2Via2l0ZW5kZnVsbHNjcmVlbicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHRoaXMudHJpZ2dlcignZnVsbHNjcmVlbmNoYW5nZScsIHsgaXNGdWxsc2NyZWVuOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdmdWxsc2NyZWVuY2hhbmdlJywgeyBpc0Z1bGxzY3JlZW46IHRydWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodmlkZW8ucGF1c2VkICYmIHZpZGVvLm5ldHdvcmtTdGF0ZSA8PSB2aWRlby5IQVZFX01FVEFEQVRBKSB7XG4gICAgICAvLyBhdHRlbXB0IHRvIHByaW1lIHRoZSB2aWRlbyBlbGVtZW50IGZvciBwcm9ncmFtbWF0aWMgYWNjZXNzXG4gICAgICAvLyB0aGlzIGlzbid0IG5lY2Vzc2FyeSBvbiB0aGUgZGVza3RvcCBidXQgc2hvdWxkbid0IGh1cnRcbiAgICAgICAgdGhpcy5wbGF5KCk7XG5cbiAgICAgIC8vIHBsYXlpbmcgYW5kIHBhdXNpbmcgc3luY2hyb25vdXNseSBkdXJpbmcgdGhlIHRyYW5zaXRpb24gdG8gZnVsbHNjcmVlblxuICAgICAgLy8gY2FuIGdldCBpT1MgfjYuMSBkZXZpY2VzIGludG8gYSBwbGF5L3BhdXNlIGxvb3BcbiAgICAgIHRoaXMuc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICB2aWRlby5wYXVzZSgpO1xuICAgICAgICB2aWRlby53ZWJraXRFbnRlckZ1bGxTY3JlZW4oKTtcbiAgICAgIH0sIDApO1xuICAgIH0gZWxzZSB7XG4gICAgICB2aWRlby53ZWJraXRFbnRlckZ1bGxTY3JlZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCB0byBleGl0IGZ1bGxzY3JlZW5cbiAgICpcbiAgICogQG1ldGhvZCBleGl0RnVsbFNjcmVlblxuICAgKi9cbiAgZXhpdEZ1bGxTY3JlZW4oKSB7XG4gICAgdGhpcy5lbF8ud2Via2l0RXhpdEZ1bGxTY3JlZW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQvc2V0IHZpZGVvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gc3JjIFNvdXJjZSBvYmplY3RcbiAgICogQHJldHVybiB7T2JqZWN0fVxuICAgKiBAbWV0aG9kIHNyY1xuICAgKi9cbiAgc3JjKHNyYykge1xuICAgIGlmIChzcmMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZWxfLnNyYztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2V0dGluZyBzcmMgdGhyb3VnaCBgc3JjYCBpbnN0ZWFkIG9mIGBzZXRTcmNgIHdpbGwgYmUgZGVwcmVjYXRlZFxuICAgICAgdGhpcy5zZXRTcmMoc3JjKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IHZpZGVvXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgU291cmNlIG9iamVjdFxuICAgKiBAZGVwcmVjYXRlZFxuICAgKiBAbWV0aG9kIHNldFNyY1xuICAgKi9cbiAgc2V0U3JjKHNyYykge1xuICAgIHRoaXMuZWxfLnNyYyA9IHNyYztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIG1lZGlhIGludG8gcGxheWVyXG4gICAqXG4gICAqIEBtZXRob2QgbG9hZFxuICAgKi9cbiAgbG9hZCgpe1xuICAgIHRoaXMuZWxfLmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdGVjaC4gUmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgY2FsbHMgYGxvYWRgLlxuICAgKlxuICAgKiBAbWV0aG9kIHJlc2V0XG4gICAqL1xuICByZXNldCgpIHtcbiAgICBIdG1sNS5yZXNldE1lZGlhRWxlbWVudCh0aGlzLmVsXyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGN1cnJlbnQgc291cmNlXG4gICAqXG4gICAqIEByZXR1cm4ge09iamVjdH1cbiAgICogQG1ldGhvZCBjdXJyZW50U3JjXG4gICAqL1xuICBjdXJyZW50U3JjKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRTb3VyY2VfKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50U291cmNlXy5zcmM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmVsXy5jdXJyZW50U3JjO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcG9zdGVyXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICogQG1ldGhvZCBwb3N0ZXJcbiAgICovXG4gIHBvc3RlcigpIHsgcmV0dXJuIHRoaXMuZWxfLnBvc3RlcjsgfVxuXG4gIC8qKlxuICAgKiBTZXQgcG9zdGVyXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB2YWwgVVJMIHRvIHBvc3RlciBpbWFnZVxuICAgKiBAbWV0aG9kXG4gICAqL1xuICBzZXRQb3N0ZXIodmFsKSB7IHRoaXMuZWxfLnBvc3RlciA9IHZhbDsgfVxuXG4gIC8qKlxuICAgKiBHZXQgcHJlbG9hZCBhdHRyaWJ1dGVcbiAgICpcbiAgICogQHJldHVybiB7U3RyaW5nfVxuICAgKiBAbWV0aG9kIHByZWxvYWRcbiAgICovXG4gIHByZWxvYWQoKSB7IHJldHVybiB0aGlzLmVsXy5wcmVsb2FkOyB9XG5cbiAgLyoqXG4gICAqIFNldCBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsIFZhbHVlIGZvciBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKiBAbWV0aG9kIHNldFByZWxvYWRcbiAgICovXG4gIHNldFByZWxvYWQodmFsKSB7IHRoaXMuZWxfLnByZWxvYWQgPSB2YWw7IH1cblxuICAvKipcbiAgICogR2V0IGF1dG9wbGF5IGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBtZXRob2QgYXV0b3BsYXlcbiAgICovXG4gIGF1dG9wbGF5KCkgeyByZXR1cm4gdGhpcy5lbF8uYXV0b3BsYXk7IH1cblxuICAvKipcbiAgICogU2V0IGF1dG9wbGF5IGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsIFZhbHVlIGZvciBwcmVsb2FkIGF0dHJpYnV0ZVxuICAgKiBAbWV0aG9kIHNldEF1dG9wbGF5XG4gICAqL1xuICBzZXRBdXRvcGxheSh2YWwpIHsgdGhpcy5lbF8uYXV0b3BsYXkgPSB2YWw7IH1cblxuICAvKipcbiAgICogR2V0IGNvbnRyb2xzIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBtZXRob2QgY29udHJvbHNcbiAgICovXG4gIGNvbnRyb2xzKCkgeyByZXR1cm4gdGhpcy5lbF8uY29udHJvbHM7IH1cblxuICAvKipcbiAgICogU2V0IGNvbnRyb2xzIGF0dHJpYnV0ZVxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gdmFsIFZhbHVlIGZvciBjb250cm9scyBhdHRyaWJ1dGVcbiAgICogQG1ldGhvZCBzZXRDb250cm9sc1xuICAgKi9cbiAgc2V0Q29udHJvbHModmFsKSB7IHRoaXMuZWxfLmNvbnRyb2xzID0gISF2YWw7IH1cblxuICAvKipcbiAgICogR2V0IGxvb3AgYXR0cmlidXRlXG4gICAqXG4gICAqIEByZXR1cm4ge1N0cmluZ31cbiAgICogQG1ldGhvZCBsb29wXG4gICAqL1xuICBsb29wKCkgeyByZXR1cm4gdGhpcy5lbF8ubG9vcDsgfVxuXG4gIC8qKlxuICAgKiBTZXQgbG9vcCBhdHRyaWJ1dGVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IHZhbCBWYWx1ZSBmb3IgbG9vcCBhdHRyaWJ1dGVcbiAgICogQG1ldGhvZCBzZXRMb29wXG4gICAqL1xuICBzZXRMb29wKHZhbCkgeyB0aGlzLmVsXy5sb29wID0gdmFsOyB9XG5cbiAgLyoqXG4gICAqIEdldCBlcnJvciB2YWx1ZVxuICAgKlxuICAgKiBAcmV0dXJuIHtTdHJpbmd9XG4gICAqIEBtZXRob2QgZXJyb3JcbiAgICovXG4gIGVycm9yKCkgeyByZXR1cm4gdGhpcy5lbF8uZXJyb3I7IH1cblxuICAvKipcbiAgICogR2V0IHdoZXRoZXIgb3Igbm90IHRoZSBwbGF5ZXIgaXMgaW4gdGhlIFwic2Vla2luZ1wiIHN0YXRlXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBtZXRob2Qgc2Vla2luZ1xuICAgKi9cbiAgc2Vla2luZygpIHsgcmV0dXJuIHRoaXMuZWxfLnNlZWtpbmc7IH1cblxuICAvKipcbiAgICogR2V0IGEgVGltZVJhbmdlcyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZVxuICAgKiByYW5nZXMgb2YgdGhlIG1lZGlhIHJlc291cmNlIHRvIHdoaWNoIGl0IGlzIHBvc3NpYmxlXG4gICAqIGZvciB0aGUgdXNlciBhZ2VudCB0byBzZWVrLlxuICAgKlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2VPYmplY3R9XG4gICAqIEBtZXRob2Qgc2Vla2FibGVcbiAgICovXG4gIHNlZWthYmxlKCkgeyByZXR1cm4gdGhpcy5lbF8uc2Vla2FibGU7IH1cblxuICAvKipcbiAgICogR2V0IGlmIHZpZGVvIGVuZGVkXG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBtZXRob2QgZW5kZWRcbiAgICovXG4gIGVuZGVkKCkgeyByZXR1cm4gdGhpcy5lbF8uZW5kZWQ7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgbXV0ZWQgY29udGVudCBhdHRyaWJ1dGVcbiAgICogVGhpcyBhdHRyaWJ1dGUgaGFzIG5vIGR5bmFtaWMgZWZmZWN0LCBpdCBvbmx5XG4gICAqIGNvbnRyb2xzIHRoZSBkZWZhdWx0IHN0YXRlIG9mIHRoZSBlbGVtZW50XG4gICAqXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqIEBtZXRob2QgZGVmYXVsdE11dGVkXG4gICAqL1xuICBkZWZhdWx0TXV0ZWQoKSB7IHJldHVybiB0aGlzLmVsXy5kZWZhdWx0TXV0ZWQ7IH1cblxuICAvKipcbiAgICogR2V0IGRlc2lyZWQgc3BlZWQgYXQgd2hpY2ggdGhlIG1lZGlhIHJlc291cmNlIGlzIHRvIHBsYXlcbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKiBAbWV0aG9kIHBsYXliYWNrUmF0ZVxuICAgKi9cbiAgcGxheWJhY2tSYXRlKCkgeyByZXR1cm4gdGhpcy5lbF8ucGxheWJhY2tSYXRlOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBUaW1lUmFuZ2VzIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHJhbmdlcyBvZiB0aGVcbiAgICogbWVkaWEgcmVzb3VyY2UgdGhhdCB0aGUgdXNlciBhZ2VudCBoYXMgcGxheWVkLlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2VPYmplY3R9IHRoZSByYW5nZSBvZiBwb2ludHMgb24gdGhlIG1lZGlhXG4gICAqIHRpbWVsaW5lIHRoYXQgaGFzIGJlZW4gcmVhY2hlZCB0aHJvdWdoIG5vcm1hbCBwbGF5YmFja1xuICAgKiBAc2VlIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tbWVkaWEtcGxheWVkXG4gICAqL1xuICBwbGF5ZWQoKSB7IHJldHVybiB0aGlzLmVsXy5wbGF5ZWQ7IH1cblxuICAvKipcbiAgICogU2V0IGRlc2lyZWQgc3BlZWQgYXQgd2hpY2ggdGhlIG1lZGlhIHJlc291cmNlIGlzIHRvIHBsYXlcbiAgICpcbiAgICogQHBhcmFtIHtOdW1iZXJ9IHZhbCBTcGVlZCBhdCB3aGljaCB0aGUgbWVkaWEgcmVzb3VyY2UgaXMgdG8gcGxheVxuICAgKiBAbWV0aG9kIHNldFBsYXliYWNrUmF0ZVxuICAgKi9cbiAgc2V0UGxheWJhY2tSYXRlKHZhbCkgeyB0aGlzLmVsXy5wbGF5YmFja1JhdGUgPSB2YWw7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIG5ldHdvcmsgYWN0aXZpdHkgZm9yIHRoZSBlbGVtZW50LCBmcm9tXG4gICAqIHRoZSBsaXN0IGJlbG93XG4gICAqIE5FVFdPUktfRU1QVFkgKG51bWVyaWMgdmFsdWUgMClcbiAgICogTkVUV09SS19JRExFIChudW1lcmljIHZhbHVlIDEpXG4gICAqIE5FVFdPUktfTE9BRElORyAobnVtZXJpYyB2YWx1ZSAyKVxuICAgKiBORVRXT1JLX05PX1NPVVJDRSAobnVtZXJpYyB2YWx1ZSAzKVxuICAgKlxuICAgKiBAcmV0dXJuIHtOdW1iZXJ9XG4gICAqIEBtZXRob2QgbmV0d29ya1N0YXRlXG4gICAqL1xuICBuZXR3b3JrU3RhdGUoKSB7IHJldHVybiB0aGlzLmVsXy5uZXR3b3JrU3RhdGU7IH1cblxuICAvKipcbiAgICogR2V0IGEgdmFsdWUgdGhhdCBleHByZXNzZXMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVsZW1lbnRcbiAgICogd2l0aCByZXNwZWN0IHRvIHJlbmRlcmluZyB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiwgZnJvbVxuICAgKiB0aGUgY29kZXMgaW4gdGhlIGxpc3QgYmVsb3dcbiAgICogSEFWRV9OT1RISU5HIChudW1lcmljIHZhbHVlIDApXG4gICAqIEhBVkVfTUVUQURBVEEgKG51bWVyaWMgdmFsdWUgMSlcbiAgICogSEFWRV9DVVJSRU5UX0RBVEEgKG51bWVyaWMgdmFsdWUgMilcbiAgICogSEFWRV9GVVRVUkVfREFUQSAobnVtZXJpYyB2YWx1ZSAzKVxuICAgKiBIQVZFX0VOT1VHSF9EQVRBIChudW1lcmljIHZhbHVlIDQpXG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogQG1ldGhvZCByZWFkeVN0YXRlXG4gICAqL1xuICByZWFkeVN0YXRlKCkgeyByZXR1cm4gdGhpcy5lbF8ucmVhZHlTdGF0ZTsgfVxuXG4gIC8qKlxuICAgKiBHZXQgd2lkdGggb2YgdmlkZW9cbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKiBAbWV0aG9kIHZpZGVvV2lkdGhcbiAgICovXG4gIHZpZGVvV2lkdGgoKSB7IHJldHVybiB0aGlzLmVsXy52aWRlb1dpZHRoOyB9XG5cbiAgLyoqXG4gICAqIEdldCBoZWlnaHQgb2YgdmlkZW9cbiAgICpcbiAgICogQHJldHVybiB7TnVtYmVyfVxuICAgKiBAbWV0aG9kIHZpZGVvSGVpZ2h0XG4gICAqL1xuICB2aWRlb0hlaWdodCgpIHsgcmV0dXJuIHRoaXMuZWxfLnZpZGVvSGVpZ2h0OyB9XG5cbiAgLyoqXG4gICAqIEdldCB0ZXh0IHRyYWNrc1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tMaXN0fVxuICAgKiBAbWV0aG9kIHRleHRUcmFja3NcbiAgICovXG4gIHRleHRUcmFja3MoKSB7XG4gICAgcmV0dXJuIHN1cGVyLnRleHRUcmFja3MoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgdGV4dCB0cmFjayBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtpbmQgVGV4dCB0cmFjayBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFwdGVycyBhbmQgbWV0YWRhdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nPX0gbGFiZWwgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAgICogQHBhcmFtIHtTdHJpbmc9fSBsYW5ndWFnZSBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvblxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tPYmplY3R9XG4gICAqIEBtZXRob2QgYWRkVGV4dFRyYWNrXG4gICAqL1xuICBhZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7XG4gICAgaWYgKCF0aGlzWydmZWF0dXJlc05hdGl2ZVRleHRUcmFja3MnXSkge1xuICAgICAgcmV0dXJuIHN1cGVyLmFkZFRleHRUcmFjayhraW5kLCBsYWJlbCwgbGFuZ3VhZ2UpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmVsXy5hZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgcmVtb3RlIHRleHQgdHJhY2sgb2JqZWN0IGFuZCByZXR1cm5zIGEgaHRtbCB0cmFjayBlbGVtZW50XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRoZSBvYmplY3Qgc2hvdWxkIGNvbnRhaW4gdmFsdWVzIGZvclxuICAgKiBraW5kLCBsYW5ndWFnZSwgbGFiZWwgYW5kIHNyYyAobG9jYXRpb24gb2YgdGhlIFdlYlZUVCBmaWxlKVxuICAgKiBAcmV0dXJuIHtIVE1MVHJhY2tFbGVtZW50fVxuICAgKiBAbWV0aG9kIGFkZFJlbW90ZVRleHRUcmFja1xuICAgKi9cbiAgYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnM9e30pIHtcbiAgICBpZiAoIXRoaXNbJ2ZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyddKSB7XG4gICAgICByZXR1cm4gc3VwZXIuYWRkUmVtb3RlVGV4dFRyYWNrKG9wdGlvbnMpO1xuICAgIH1cblxuICAgIGxldCBodG1sVHJhY2tFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHJhY2snKTtcblxuICAgIGlmIChvcHRpb25zLmtpbmQpIHtcbiAgICAgIGh0bWxUcmFja0VsZW1lbnQua2luZCA9IG9wdGlvbnMua2luZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMubGFiZWwpIHtcbiAgICAgIGh0bWxUcmFja0VsZW1lbnQubGFiZWwgPSBvcHRpb25zLmxhYmVsO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLnNyY2xhbmcpIHtcbiAgICAgIGh0bWxUcmFja0VsZW1lbnQuc3JjbGFuZyA9IG9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5zcmNsYW5nO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0KSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmRlZmF1bHQgPSBvcHRpb25zLmRlZmF1bHQ7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmlkKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LmlkID0gb3B0aW9ucy5pZDtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc3JjKSB7XG4gICAgICBodG1sVHJhY2tFbGVtZW50LnNyYyA9IG9wdGlvbnMuc3JjO1xuICAgIH1cblxuICAgIHRoaXMuZWwoKS5hcHBlbmRDaGlsZChodG1sVHJhY2tFbGVtZW50KTtcblxuICAgIC8vIHN0b3JlIEhUTUxUcmFja0VsZW1lbnQgYW5kIFRleHRUcmFjayB0byByZW1vdGUgbGlzdFxuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkuYWRkVHJhY2tFbGVtZW50XyhodG1sVHJhY2tFbGVtZW50KTtcbiAgICB0aGlzLnJlbW90ZVRleHRUcmFja3MoKS5hZGRUcmFja18oaHRtbFRyYWNrRWxlbWVudC50cmFjayk7XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgcmVtb3RlIHRleHQgdHJhY2sgZnJvbSBUZXh0VHJhY2tMaXN0IG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja09iamVjdH0gdHJhY2sgVGV4dHRyYWNrIG9iamVjdCB0byByZW1vdmVcbiAgICogQG1ldGhvZCByZW1vdmVSZW1vdGVUZXh0VHJhY2tcbiAgICovXG4gIHJlbW92ZVJlbW90ZVRleHRUcmFjayh0cmFjaykge1xuICAgIGlmICghdGhpc1snZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzJ10pIHtcbiAgICAgIHJldHVybiBzdXBlci5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spO1xuICAgIH1cblxuICAgIGxldCB0cmFja3MsIGk7XG5cbiAgICBsZXQgdHJhY2tFbGVtZW50ID0gdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5nZXRUcmFja0VsZW1lbnRCeVRyYWNrXyh0cmFjayk7XG5cbiAgICAvLyByZW1vdmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIGZyb20gcmVtb3RlIGxpc3RcbiAgICB0aGlzLnJlbW90ZVRleHRUcmFja0VscygpLnJlbW92ZVRyYWNrRWxlbWVudF8odHJhY2tFbGVtZW50KTtcbiAgICB0aGlzLnJlbW90ZVRleHRUcmFja3MoKS5yZW1vdmVUcmFja18odHJhY2spO1xuXG4gICAgdHJhY2tzID0gdGhpcy4kJCgndHJhY2snKTtcblxuICAgIGkgPSB0cmFja3MubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGlmICh0cmFjayA9PT0gdHJhY2tzW2ldIHx8IHRyYWNrID09PSB0cmFja3NbaV0udHJhY2spIHtcbiAgICAgICAgdGhpcy5lbCgpLnJlbW92ZUNoaWxkKHRyYWNrc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cblxuXG4vKiBIVE1MNSBTdXBwb3J0IFRlc3RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKlxuKiBFbGVtZW50IGZvciB0ZXN0aW5nIGJyb3dzZXIgSFRNTDUgdmlkZW8gY2FwYWJpbGl0aWVzXG4qXG4qIEB0eXBlIHtFbGVtZW50fVxuKiBAY29uc3RhbnRcbiogQHByaXZhdGVcbiovXG5IdG1sNS5URVNUX1ZJRCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3ZpZGVvJyk7XG5sZXQgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cmFjaycpO1xudHJhY2sua2luZCA9ICdjYXB0aW9ucyc7XG50cmFjay5zcmNsYW5nID0gJ2VuJztcbnRyYWNrLmxhYmVsID0gJ0VuZ2xpc2gnO1xuSHRtbDUuVEVTVF9WSUQuYXBwZW5kQ2hpbGQodHJhY2spO1xuXG4vKlxuICogQ2hlY2sgaWYgSFRNTDUgdmlkZW8gaXMgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci9kZXZpY2VcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5IdG1sNS5pc1N1cHBvcnRlZCA9IGZ1bmN0aW9uKCl7XG4gIC8vIElFOSB3aXRoIG5vIE1lZGlhIFBsYXllciBpcyBhIExJQVIhICgjOTg0KVxuICB0cnkge1xuICAgIEh0bWw1LlRFU1RfVklEWyd2b2x1bWUnXSA9IDAuNTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAhIUh0bWw1LlRFU1RfVklELmNhblBsYXlUeXBlO1xufTtcblxuLy8gQWRkIFNvdXJjZSBIYW5kbGVyIHBhdHRlcm4gZnVuY3Rpb25zIHRvIHRoaXMgdGVjaFxuVGVjaC53aXRoU291cmNlSGFuZGxlcnMoSHRtbDUpO1xuXG4vKlxuICogVGhlIGRlZmF1bHQgbmF0aXZlIHNvdXJjZSBoYW5kbGVyLlxuICogVGhpcyBzaW1wbHkgcGFzc2VzIHRoZSBzb3VyY2UgdG8gdGhlIHZpZGVvIGVsZW1lbnQuIE5vdGhpbmcgZmFuY3kuXG4gKlxuICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2UgICBUaGUgc291cmNlIG9iamVjdFxuICogQHBhcmFtICB7SHRtbDV9IHRlY2ggIFRoZSBpbnN0YW5jZSBvZiB0aGUgSFRNTDUgdGVjaFxuICovXG5IdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyID0ge307XG5cbi8qXG4gKiBDaGVjayBpZiB0aGUgdmlkZW8gZWxlbWVudCBjYW4gcGxheSB0aGUgZ2l2ZW4gdmlkZW90eXBlXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB0eXBlICAgIFRoZSBtaW1ldHlwZSB0byBjaGVja1xuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gKi9cbkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuUGxheVR5cGUgPSBmdW5jdGlvbih0eXBlKXtcbiAgLy8gSUU5IG9uIFdpbmRvd3MgNyB3aXRob3V0IE1lZGlhUGxheWVyIHRocm93cyBhbiBlcnJvciBoZXJlXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlb2pzL3ZpZGVvLmpzL2lzc3Vlcy81MTlcbiAgdHJ5IHtcbiAgICByZXR1cm4gSHRtbDUuVEVTVF9WSUQuY2FuUGxheVR5cGUodHlwZSk7XG4gIH0gY2F0Y2goZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxufTtcblxuLypcbiAqIENoZWNrIGlmIHRoZSB2aWRlbyBlbGVtZW50IGNhbiBoYW5kbGUgdGhlIHNvdXJjZSBuYXRpdmVseVxuICpcbiAqIEBwYXJhbSAge09iamVjdH0gc291cmNlICBUaGUgc291cmNlIG9iamVjdFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gKi9cbkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuY2FuSGFuZGxlU291cmNlID0gZnVuY3Rpb24oc291cmNlKXtcbiAgdmFyIG1hdGNoLCBleHQ7XG5cbiAgLy8gSWYgYSB0eXBlIHdhcyBwcm92aWRlZCB3ZSBzaG91bGQgcmVseSBvbiB0aGF0XG4gIGlmIChzb3VyY2UudHlwZSkge1xuICAgIHJldHVybiBIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhblBsYXlUeXBlKHNvdXJjZS50eXBlKTtcbiAgfSBlbHNlIGlmIChzb3VyY2Uuc3JjKSB7XG4gICAgLy8gSWYgbm8gdHlwZSwgZmFsbCBiYWNrIHRvIGNoZWNraW5nICd2aWRlby9bRVhURU5TSU9OXSdcbiAgICBleHQgPSBVcmwuZ2V0RmlsZUV4dGVuc2lvbihzb3VyY2Uuc3JjKTtcblxuICAgIHJldHVybiBIdG1sNS5uYXRpdmVTb3VyY2VIYW5kbGVyLmNhblBsYXlUeXBlKGB2aWRlby8ke2V4dH1gKTtcbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbi8qXG4gKiBQYXNzIHRoZSBzb3VyY2UgdG8gdGhlIHZpZGVvIGVsZW1lbnRcbiAqIEFkYXB0aXZlIHNvdXJjZSBoYW5kbGVycyB3aWxsIGhhdmUgbW9yZSBjb21wbGljYXRlZCB3b3JrZmxvd3MgYmVmb3JlIHBhc3NpbmdcbiAqIHZpZGVvIGRhdGEgdG8gdGhlIHZpZGVvIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IHNvdXJjZSAgIFRoZSBzb3VyY2Ugb2JqZWN0XG4gKiBAcGFyYW0gIHtIdG1sNX0gIHRlY2ggICAgIFRoZSBpbnN0YW5jZSBvZiB0aGUgSHRtbDUgdGVjaFxuICogQHBhcmFtICB7T2JqZWN0fSBvcHRpb25zICBUaGUgb3B0aW9ucyB0byBwYXNzIHRvIHRoZSBzb3VyY2VcbiAqL1xuSHRtbDUubmF0aXZlU291cmNlSGFuZGxlci5oYW5kbGVTb3VyY2UgPSBmdW5jdGlvbihzb3VyY2UsIHRlY2gsIG9wdGlvbnMpe1xuICB0ZWNoLnNldFNyYyhzb3VyY2Uuc3JjKTtcbn07XG5cbi8qXG4qIENsZWFuIHVwIHRoZSBzb3VyY2UgaGFuZGxlciB3aGVuIGRpc3Bvc2luZyB0aGUgcGxheWVyIG9yIHN3aXRjaGluZyBzb3VyY2VzLi5cbiogKG5vIGNsZWFudXAgaXMgbmVlZGVkIHdoZW4gc3VwcG9ydGluZyB0aGUgZm9ybWF0IG5hdGl2ZWx5KVxuKi9cbkh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIuZGlzcG9zZSA9IGZ1bmN0aW9uKCl7fTtcblxuLy8gUmVnaXN0ZXIgdGhlIG5hdGl2ZSBzb3VyY2UgaGFuZGxlclxuSHRtbDUucmVnaXN0ZXJTb3VyY2VIYW5kbGVyKEh0bWw1Lm5hdGl2ZVNvdXJjZUhhbmRsZXIpO1xuXG4vKlxuICogQ2hlY2sgaWYgdGhlIHZvbHVtZSBjYW4gYmUgY2hhbmdlZCBpbiB0aGlzIGJyb3dzZXIvZGV2aWNlLlxuICogVm9sdW1lIGNhbm5vdCBiZSBjaGFuZ2VkIGluIGEgbG90IG9mIG1vYmlsZSBkZXZpY2VzLlxuICogU3BlY2lmaWNhbGx5LCBpdCBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gMSBvbiBpT1MuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUuY2FuQ29udHJvbFZvbHVtZSA9IGZ1bmN0aW9uKCl7XG4gIHZhciB2b2x1bWUgPSAgSHRtbDUuVEVTVF9WSUQudm9sdW1lO1xuICBIdG1sNS5URVNUX1ZJRC52b2x1bWUgPSAodm9sdW1lIC8gMikgKyAwLjE7XG4gIHJldHVybiB2b2x1bWUgIT09IEh0bWw1LlRFU1RfVklELnZvbHVtZTtcbn07XG5cbi8qXG4gKiBDaGVjayBpZiBwbGF5YmFja1JhdGUgaXMgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3Nlci9kZXZpY2UuXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSA9IGZ1bmN0aW9uKCl7XG4gIC8vIFBsYXliYWNrIHJhdGUgQVBJIGlzIGltcGxlbWVudGVkIGluIEFuZHJvaWQgQ2hyb21lLCBidXQgZG9lc24ndCBkbyBhbnl0aGluZ1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vdmlkZW9qcy92aWRlby5qcy9pc3N1ZXMvMzE4MFxuICBpZiAoYnJvd3Nlci5JU19BTkRST0lEICYmIGJyb3dzZXIuSVNfQ0hST01FKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHZhciBwbGF5YmFja1JhdGUgPSBIdG1sNS5URVNUX1ZJRC5wbGF5YmFja1JhdGU7XG4gIEh0bWw1LlRFU1RfVklELnBsYXliYWNrUmF0ZSA9IChwbGF5YmFja1JhdGUgLyAyKSArIDAuMTtcbiAgcmV0dXJuIHBsYXliYWNrUmF0ZSAhPT0gSHRtbDUuVEVTVF9WSUQucGxheWJhY2tSYXRlO1xufTtcblxuLypcbiAqIENoZWNrIHRvIHNlZSBpZiBuYXRpdmUgdGV4dCB0cmFja3MgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVUZXh0VHJhY2tzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdXBwb3J0c1RleHRUcmFja3M7XG5cbiAgLy8gRmlndXJlIG91dCBuYXRpdmUgdGV4dCB0cmFjayBzdXBwb3J0XG4gIC8vIElmIG1vZGUgaXMgYSBudW1iZXIsIHdlIGNhbm5vdCBjaGFuZ2UgaXQgYmVjYXVzZSBpdCdsbCBkaXNhcHBlYXIgZnJvbSB2aWV3LlxuICAvLyBCcm93c2VycyB3aXRoIG51bWVyaWMgbW9kZXMgaW5jbHVkZSBJRTEwIGFuZCBvbGRlciAoPD0yMDEzKSBzYW1zdW5nIGFuZHJvaWQgbW9kZWxzLlxuICAvLyBGaXJlZm94IGlzbid0IHBsYXlpbmcgbmljZSBlaXRoZXIgd2l0aCBtb2RpZnlpbmcgdGhlIG1vZGVcbiAgLy8gVE9ETzogSW52ZXN0aWdhdGUgZmlyZWZveDogaHR0cHM6Ly9naXRodWIuY29tL3ZpZGVvanMvdmlkZW8uanMvaXNzdWVzLzE4NjJcbiAgc3VwcG9ydHNUZXh0VHJhY2tzID0gISFIdG1sNS5URVNUX1ZJRC50ZXh0VHJhY2tzO1xuICBpZiAoc3VwcG9ydHNUZXh0VHJhY2tzICYmIEh0bWw1LlRFU1RfVklELnRleHRUcmFja3MubGVuZ3RoID4gMCkge1xuICAgIHN1cHBvcnRzVGV4dFRyYWNrcyA9IHR5cGVvZiBIdG1sNS5URVNUX1ZJRC50ZXh0VHJhY2tzWzBdWydtb2RlJ10gIT09ICdudW1iZXInO1xuICB9XG4gIGlmIChzdXBwb3J0c1RleHRUcmFja3MgJiYgYnJvd3Nlci5JU19GSVJFRk9YKSB7XG4gICAgc3VwcG9ydHNUZXh0VHJhY2tzID0gZmFsc2U7XG4gIH1cbiAgaWYgKHN1cHBvcnRzVGV4dFRyYWNrcyAmJiAhKCdvbnJlbW92ZXRyYWNrJyBpbiBIdG1sNS5URVNUX1ZJRC50ZXh0VHJhY2tzKSkge1xuICAgIHN1cHBvcnRzVGV4dFRyYWNrcyA9IGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHN1cHBvcnRzVGV4dFRyYWNrcztcbn07XG5cbi8qXG4gKiBDaGVjayB0byBzZWUgaWYgbmF0aXZlIHZpZGVvIHRyYWNrcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnJvd3Nlci9kZXZpY2VcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5IdG1sNS5zdXBwb3J0c05hdGl2ZVZpZGVvVHJhY2tzID0gZnVuY3Rpb24oKSB7XG4gIGxldCBzdXBwb3J0c1ZpZGVvVHJhY2tzID0gISFIdG1sNS5URVNUX1ZJRC52aWRlb1RyYWNrcztcbiAgcmV0dXJuIHN1cHBvcnRzVmlkZW9UcmFja3M7XG59O1xuXG4vKlxuICogQ2hlY2sgdG8gc2VlIGlmIG5hdGl2ZSBhdWRpbyB0cmFja3MgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGJyb3dzZXIvZGV2aWNlXG4gKlxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUuc3VwcG9ydHNOYXRpdmVBdWRpb1RyYWNrcyA9IGZ1bmN0aW9uKCkge1xuICBsZXQgc3VwcG9ydHNBdWRpb1RyYWNrcyA9ICEhSHRtbDUuVEVTVF9WSUQuYXVkaW9UcmFja3M7XG4gIHJldHVybiBzdXBwb3J0c0F1ZGlvVHJhY2tzO1xufTtcblxuXG4vKipcbiAqIEFuIGFycmF5IG9mIGV2ZW50cyBhdmFpbGFibGUgb24gdGhlIEh0bWw1IHRlY2guXG4gKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtBcnJheX1cbiAqL1xuSHRtbDUuRXZlbnRzID0gW1xuICAnbG9hZHN0YXJ0JyxcbiAgJ3N1c3BlbmQnLFxuICAnYWJvcnQnLFxuICAnZXJyb3InLFxuICAnZW1wdGllZCcsXG4gICdzdGFsbGVkJyxcbiAgJ2xvYWRlZG1ldGFkYXRhJyxcbiAgJ2xvYWRlZGRhdGEnLFxuICAnY2FucGxheScsXG4gICdjYW5wbGF5dGhyb3VnaCcsXG4gICdwbGF5aW5nJyxcbiAgJ3dhaXRpbmcnLFxuICAnc2Vla2luZycsXG4gICdzZWVrZWQnLFxuICAnZW5kZWQnLFxuICAnZHVyYXRpb25jaGFuZ2UnLFxuICAndGltZXVwZGF0ZScsXG4gICdwcm9ncmVzcycsXG4gICdwbGF5JyxcbiAgJ3BhdXNlJyxcbiAgJ3JhdGVjaGFuZ2UnLFxuICAndm9sdW1lY2hhbmdlJ1xuXTtcblxuLypcbiAqIFNldCB0aGUgdGVjaCdzIHZvbHVtZSBjb250cm9sIHN1cHBvcnQgc3RhdHVzXG4gKlxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkh0bWw1LnByb3RvdHlwZVsnZmVhdHVyZXNWb2x1bWVDb250cm9sJ10gPSBIdG1sNS5jYW5Db250cm9sVm9sdW1lKCk7XG5cbi8qXG4gKiBTZXQgdGhlIHRlY2gncyBwbGF5YmFja1JhdGUgc3VwcG9ydCBzdGF0dXNcbiAqXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUucHJvdG90eXBlWydmZWF0dXJlc1BsYXliYWNrUmF0ZSddID0gSHRtbDUuY2FuQ29udHJvbFBsYXliYWNrUmF0ZSgpO1xuXG4vKlxuICogU2V0IHRoZSB0ZWNoJ3Mgc3RhdHVzIG9uIG1vdmluZyB0aGUgdmlkZW8gZWxlbWVudC5cbiAqIEluIGlPUywgaWYgeW91IG1vdmUgYSB2aWRlbyBlbGVtZW50IGluIHRoZSBET00sIGl0IGJyZWFrcyB2aWRlbyBwbGF5YmFjay5cbiAqXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUucHJvdG90eXBlWydtb3ZpbmdNZWRpYUVsZW1lbnRJbkRPTSddID0gIWJyb3dzZXIuSVNfSU9TO1xuXG4vKlxuICogU2V0IHRoZSB0aGUgdGVjaCdzIGZ1bGxzY3JlZW4gcmVzaXplIHN1cHBvcnQgc3RhdHVzLlxuICogSFRNTCB2aWRlbyBpcyBhYmxlIHRvIGF1dG9tYXRpY2FsbHkgcmVzaXplIHdoZW4gZ29pbmcgdG8gZnVsbHNjcmVlbi5cbiAqIChObyBsb25nZXIgYXBwZWFycyB0byBiZSB1c2VkLiBDYW4gcHJvYmFibHkgYmUgcmVtb3ZlZC4pXG4gKi9cbkh0bWw1LnByb3RvdHlwZVsnZmVhdHVyZXNGdWxsc2NyZWVuUmVzaXplJ10gPSB0cnVlO1xuXG4vKlxuICogU2V0IHRoZSB0ZWNoJ3MgcHJvZ3Jlc3MgZXZlbnQgc3VwcG9ydCBzdGF0dXNcbiAqICh0aGlzIGRpc2FibGVzIHRoZSBtYW51YWwgcHJvZ3Jlc3MgZXZlbnRzIG9mIHRoZSBUZWNoKVxuICovXG5IdG1sNS5wcm90b3R5cGVbJ2ZlYXR1cmVzUHJvZ3Jlc3NFdmVudHMnXSA9IHRydWU7XG5cbi8qXG4gKiBTZXRzIHRoZSB0ZWNoJ3Mgc3RhdHVzIG9uIG5hdGl2ZSB0ZXh0IHRyYWNrIHN1cHBvcnRcbiAqXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xuSHRtbDUucHJvdG90eXBlWydmZWF0dXJlc05hdGl2ZVRleHRUcmFja3MnXSA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlVGV4dFRyYWNrcygpO1xuXG4vKipcbiAqIFNldHMgdGhlIHRlY2gncyBzdGF0dXMgb24gbmF0aXZlIHRleHQgdHJhY2sgc3VwcG9ydFxuICpcbiAqIEB0eXBlIHtCb29sZWFufVxuICovXG5IdG1sNS5wcm90b3R5cGVbJ2ZlYXR1cmVzTmF0aXZlVmlkZW9UcmFja3MnXSA9IEh0bWw1LnN1cHBvcnRzTmF0aXZlVmlkZW9UcmFja3MoKTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0ZWNoJ3Mgc3RhdHVzIG9uIG5hdGl2ZSBhdWRpbyB0cmFjayBzdXBwb3J0XG4gKlxuICogQHR5cGUge0Jvb2xlYW59XG4gKi9cbkh0bWw1LnByb3RvdHlwZVsnZmVhdHVyZXNOYXRpdmVBdWRpb1RyYWNrcyddID0gSHRtbDUuc3VwcG9ydHNOYXRpdmVBdWRpb1RyYWNrcygpO1xuXG4vLyBIVE1MNSBGZWF0dXJlIGRldGVjdGlvbiBhbmQgRGV2aWNlIEZpeGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xubGV0IGNhblBsYXlUeXBlO1xuY29uc3QgbXBlZ3VybFJFID0gL15hcHBsaWNhdGlvblxcLyg/OngtfHZuZFxcLmFwcGxlXFwuKW1wZWd1cmwvaTtcbmNvbnN0IG1wNFJFID0gL152aWRlb1xcL21wNC9pO1xuXG5IdG1sNS5wYXRjaENhblBsYXlUeXBlID0gZnVuY3Rpb24oKSB7XG4gIC8vIEFuZHJvaWQgNC4wIGFuZCBhYm92ZSBjYW4gcGxheSBITFMgdG8gc29tZSBleHRlbnQgYnV0IGl0IHJlcG9ydHMgYmVpbmcgdW5hYmxlIHRvIGRvIHNvXG4gIGlmIChicm93c2VyLkFORFJPSURfVkVSU0lPTiA+PSA0LjApIHtcbiAgICBpZiAoIWNhblBsYXlUeXBlKSB7XG4gICAgICBjYW5QbGF5VHlwZSA9IEh0bWw1LlRFU1RfVklELmNvbnN0cnVjdG9yLnByb3RvdHlwZS5jYW5QbGF5VHlwZTtcbiAgICB9XG5cbiAgICBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgICBpZiAodHlwZSAmJiBtcGVndXJsUkUudGVzdCh0eXBlKSkge1xuICAgICAgICByZXR1cm4gJ21heWJlJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBjYW5QbGF5VHlwZS5jYWxsKHRoaXMsIHR5cGUpO1xuICAgIH07XG4gIH1cblxuICAvLyBPdmVycmlkZSBBbmRyb2lkIDIuMiBhbmQgbGVzcyBjYW5QbGF5VHlwZSBtZXRob2Qgd2hpY2ggaXMgYnJva2VuXG4gIGlmIChicm93c2VyLklTX09MRF9BTkRST0lEKSB7XG4gICAgaWYgKCFjYW5QbGF5VHlwZSkge1xuICAgICAgY2FuUGxheVR5cGUgPSBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGU7XG4gICAgfVxuXG4gICAgSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlID0gZnVuY3Rpb24odHlwZSl7XG4gICAgICBpZiAodHlwZSAmJiBtcDRSRS50ZXN0KHR5cGUpKSB7XG4gICAgICAgIHJldHVybiAnbWF5YmUnO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhblBsYXlUeXBlLmNhbGwodGhpcywgdHlwZSk7XG4gICAgfTtcbiAgfVxufTtcblxuSHRtbDUudW5wYXRjaENhblBsYXlUeXBlID0gZnVuY3Rpb24oKSB7XG4gIHZhciByID0gSHRtbDUuVEVTVF9WSUQuY29uc3RydWN0b3IucHJvdG90eXBlLmNhblBsYXlUeXBlO1xuICBIdG1sNS5URVNUX1ZJRC5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY2FuUGxheVR5cGUgPSBjYW5QbGF5VHlwZTtcbiAgY2FuUGxheVR5cGUgPSBudWxsO1xuICByZXR1cm4gcjtcbn07XG5cbi8vIGJ5IGRlZmF1bHQsIHBhdGNoIHRoZSB2aWRlbyBlbGVtZW50XG5IdG1sNS5wYXRjaENhblBsYXlUeXBlKCk7XG5cbkh0bWw1LmRpc3Bvc2VNZWRpYUVsZW1lbnQgPSBmdW5jdGlvbihlbCl7XG4gIGlmICghZWwpIHsgcmV0dXJuOyB9XG5cbiAgaWYgKGVsLnBhcmVudE5vZGUpIHtcbiAgICBlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgY2hpbGQgdHJhY2sgb3Igc291cmNlIG5vZGVzIHRvIHByZXZlbnQgdGhlaXIgbG9hZGluZ1xuICB3aGlsZShlbC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICBlbC5yZW1vdmVDaGlsZChlbC5maXJzdENoaWxkKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgc3JjIHJlZmVyZW5jZS4gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IGNhdXNlcyBhIHdhcm5pbmdcbiAgLy8gaW4gZmlyZWZveFxuICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuXG4gIC8vIGZvcmNlIHRoZSBtZWRpYSBlbGVtZW50IHRvIHVwZGF0ZSBpdHMgbG9hZGluZyBzdGF0ZSBieSBjYWxsaW5nIGxvYWQoKVxuICAvLyBob3dldmVyIElFIG9uIFdpbmRvd3MgN04gaGFzIGEgYnVnIHRoYXQgdGhyb3dzIGFuIGVycm9yIHNvIG5lZWQgYSB0cnkvY2F0Y2ggKCM3OTMpXG4gIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHdyYXBwaW5nIGluIGFuIGlpZmUgc28gaXQncyBub3QgZGVvcHRpbWl6ZWQgKCMxMDYwI2Rpc2N1c3Npb25fcjEwMzI0NDczKVxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVsLmxvYWQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZFxuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cbn07XG5cbkh0bWw1LnJlc2V0TWVkaWFFbGVtZW50ID0gZnVuY3Rpb24oZWwpe1xuICBpZiAoIWVsKSB7IHJldHVybjsgfVxuXG4gIGxldCBzb3VyY2VzID0gZWwucXVlcnlTZWxlY3RvckFsbCgnc291cmNlJyk7XG4gIGxldCBpID0gc291cmNlcy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBlbC5yZW1vdmVDaGlsZChzb3VyY2VzW2ldKTtcbiAgfVxuXG4gIC8vIHJlbW92ZSBhbnkgc3JjIHJlZmVyZW5jZS5cbiAgLy8gbm90IHNldHRpbmcgYHNyYz0nJ2AgYmVjYXVzZSB0aGF0IHRocm93cyBhbiBlcnJvclxuICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3NyYycpO1xuXG4gIGlmICh0eXBlb2YgZWwubG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIC8vIHdyYXBwaW5nIGluIGFuIGlpZmUgc28gaXQncyBub3QgZGVvcHRpbWl6ZWQgKCMxMDYwI2Rpc2N1c3Npb25fcjEwMzI0NDczKVxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVsLmxvYWQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgfSkoKTtcbiAgfVxufTtcblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdIdG1sNScsIEh0bWw1KTtcblRlY2gucmVnaXN0ZXJUZWNoKCdIdG1sNScsIEh0bWw1KTtcbmV4cG9ydCBkZWZhdWx0IEh0bWw1O1xuIl19
},{"../../../src/js/tracks/text-track.js":135,"../component":66,"../utils/browser.js":141,"../utils/dom.js":144,"../utils/fn.js":146,"../utils/log.js":149,"../utils/merge-options.js":150,"../utils/to-title-case.js":153,"../utils/url.js":154,"./tech.js":124,"global/document":7,"global/window":8,"object.assign":53,"tsml":59}],123:[function(_dereq_,module,exports){
/**
* @file loader.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _componentJs = _dereq_('../component.js');
var _componentJs2 = _interopRequireDefault(_componentJs);
var _techJs = _dereq_('./tech.js');
var _techJs2 = _interopRequireDefault(_techJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _utilsToTitleCaseJs = _dereq_('../utils/to-title-case.js');
var _utilsToTitleCaseJs2 = _interopRequireDefault(_utilsToTitleCaseJs);
/**
* The Media Loader is the component that decides which playback technology to load
* when the player is initialized.
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class MediaLoader
*/
var MediaLoader = (function (_Component) {
_inherits(MediaLoader, _Component);
function MediaLoader(player, options, ready) {
_classCallCheck(this, MediaLoader);
_Component.call(this, player, options, ready);
// If there are no sources when the player is initialized,
// load the first supported playback technology.
if (!options.playerOptions['sources'] || options.playerOptions['sources'].length === 0) {
for (var i = 0, j = options.playerOptions['techOrder']; i < j.length; i++) {
var techName = _utilsToTitleCaseJs2['default'](j[i]);
var tech = _techJs2['default'].getTech(techName);
// Support old behavior of techs being registered as components.
// Remove once that deprecated behavior is removed.
if (!techName) {
tech = _componentJs2['default'].getComponent(techName);
}
// Check if the browser supports this technology
if (tech && tech.isSupported()) {
player.loadTech_(techName);
break;
}
}
} else {
// // Loop through playback technologies (HTML5, Flash) and check for support.
// // Then load the best source.
// // A few assumptions here:
// // All playback technologies respect preload false.
player.src(options.playerOptions['sources']);
}
}
return MediaLoader;
})(_componentJs2['default']);
_componentJs2['default'].registerComponent('MediaLoader', MediaLoader);
exports['default'] = MediaLoader;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90ZWNoL2xvYWRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OzJCQUdzQixpQkFBaUI7Ozs7c0JBQ3RCLFdBQVc7Ozs7NEJBQ1QsZUFBZTs7OztrQ0FDViwyQkFBMkI7Ozs7Ozs7Ozs7Ozs7OztJQVk3QyxXQUFXO1lBQVgsV0FBVzs7QUFFSixXQUZQLFdBQVcsQ0FFSCxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQzswQkFGL0IsV0FBVzs7QUFHYiwwQkFBTSxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDOzs7OztBQUs5QixRQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7QUFDdEYsV0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDbkUsWUFBSSxRQUFRLEdBQUcsZ0NBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakMsWUFBSSxJQUFJLEdBQUcsb0JBQUssT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDOzs7QUFHbEMsWUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNiLGNBQUksR0FBRyx5QkFBVSxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDekM7OztBQUdELFlBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRTtBQUM5QixnQkFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixnQkFBTTtTQUNQO09BQ0Y7S0FDRixNQUFNOzs7OztBQUtMLFlBQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0tBQzlDO0dBQ0Y7O1NBL0JHLFdBQVc7OztBQWtDakIseUJBQVUsaUJBQWlCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO3FCQUN6QyxXQUFXIiwiZmlsZSI6InNyYy9qcy90ZWNoL2xvYWRlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgbG9hZGVyLmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50LmpzJztcbmltcG9ydCBUZWNoIGZyb20gJy4vdGVjaC5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHRvVGl0bGVDYXNlIGZyb20gJy4uL3V0aWxzL3RvLXRpdGxlLWNhc2UuanMnO1xuXG4vKipcbiAqIFRoZSBNZWRpYSBMb2FkZXIgaXMgdGhlIGNvbXBvbmVudCB0aGF0IGRlY2lkZXMgd2hpY2ggcGxheWJhY2sgdGVjaG5vbG9neSB0byBsb2FkXG4gKiB3aGVuIHRoZSBwbGF5ZXIgaXMgaW5pdGlhbGl6ZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsYXllciAgTWFpbiBQbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb249fSByZWFkeSAgICBSZWFkeSBjYWxsYmFjayBmdW5jdGlvblxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgTWVkaWFMb2FkZXJcbiAqL1xuY2xhc3MgTWVkaWFMb2FkZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucywgcmVhZHkpe1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucywgcmVhZHkpO1xuXG4gICAgLy8gSWYgdGhlcmUgYXJlIG5vIHNvdXJjZXMgd2hlbiB0aGUgcGxheWVyIGlzIGluaXRpYWxpemVkLFxuICAgIC8vIGxvYWQgdGhlIGZpcnN0IHN1cHBvcnRlZCBwbGF5YmFjayB0ZWNobm9sb2d5LlxuXG4gICAgaWYgKCFvcHRpb25zLnBsYXllck9wdGlvbnNbJ3NvdXJjZXMnXSB8fCBvcHRpb25zLnBsYXllck9wdGlvbnNbJ3NvdXJjZXMnXS5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvciAobGV0IGk9MCwgaj1vcHRpb25zLnBsYXllck9wdGlvbnNbJ3RlY2hPcmRlciddOyBpPGoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHRlY2hOYW1lID0gdG9UaXRsZUNhc2UoaltpXSk7XG4gICAgICAgIGxldCB0ZWNoID0gVGVjaC5nZXRUZWNoKHRlY2hOYW1lKTtcbiAgICAgICAgLy8gU3VwcG9ydCBvbGQgYmVoYXZpb3Igb2YgdGVjaHMgYmVpbmcgcmVnaXN0ZXJlZCBhcyBjb21wb25lbnRzLlxuICAgICAgICAvLyBSZW1vdmUgb25jZSB0aGF0IGRlcHJlY2F0ZWQgYmVoYXZpb3IgaXMgcmVtb3ZlZC5cbiAgICAgICAgaWYgKCF0ZWNoTmFtZSkge1xuICAgICAgICAgIHRlY2ggPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50KHRlY2hOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoaXMgdGVjaG5vbG9neVxuICAgICAgICBpZiAodGVjaCAmJiB0ZWNoLmlzU3VwcG9ydGVkKCkpIHtcbiAgICAgICAgICBwbGF5ZXIubG9hZFRlY2hfKHRlY2hOYW1lKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAvLyBMb29wIHRocm91Z2ggcGxheWJhY2sgdGVjaG5vbG9naWVzIChIVE1MNSwgRmxhc2gpIGFuZCBjaGVjayBmb3Igc3VwcG9ydC5cbiAgICAgIC8vIC8vIFRoZW4gbG9hZCB0aGUgYmVzdCBzb3VyY2UuXG4gICAgICAvLyAvLyBBIGZldyBhc3N1bXB0aW9ucyBoZXJlOlxuICAgICAgLy8gLy8gICBBbGwgcGxheWJhY2sgdGVjaG5vbG9naWVzIHJlc3BlY3QgcHJlbG9hZCBmYWxzZS5cbiAgICAgIHBsYXllci5zcmMob3B0aW9ucy5wbGF5ZXJPcHRpb25zWydzb3VyY2VzJ10pO1xuICAgIH1cbiAgfVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ01lZGlhTG9hZGVyJywgTWVkaWFMb2FkZXIpO1xuZXhwb3J0IGRlZmF1bHQgTWVkaWFMb2FkZXI7XG4iXX0=
},{"../component.js":66,"../utils/to-title-case.js":153,"./tech.js":124,"global/window":8}],124:[function(_dereq_,module,exports){
/**
* @file tech.js
* Media Technology Controller - Base class for media playback
* technology controllers like Flash and HTML5
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _tracksHtmlTrackElement = _dereq_('../tracks/html-track-element');
var _tracksHtmlTrackElement2 = _interopRequireDefault(_tracksHtmlTrackElement);
var _tracksHtmlTrackElementList = _dereq_('../tracks/html-track-element-list');
var _tracksHtmlTrackElementList2 = _interopRequireDefault(_tracksHtmlTrackElementList);
var _utilsMergeOptionsJs = _dereq_('../utils/merge-options.js');
var _utilsMergeOptionsJs2 = _interopRequireDefault(_utilsMergeOptionsJs);
var _tracksTextTrack = _dereq_('../tracks/text-track');
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
var _tracksTextTrackList = _dereq_('../tracks/text-track-list');
var _tracksTextTrackList2 = _interopRequireDefault(_tracksTextTrackList);
var _tracksVideoTrack = _dereq_('../tracks/video-track');
var _tracksVideoTrack2 = _interopRequireDefault(_tracksVideoTrack);
var _tracksVideoTrackList = _dereq_('../tracks/video-track-list');
var _tracksVideoTrackList2 = _interopRequireDefault(_tracksVideoTrackList);
var _tracksAudioTrackList = _dereq_('../tracks/audio-track-list');
var _tracksAudioTrackList2 = _interopRequireDefault(_tracksAudioTrackList);
var _tracksAudioTrack = _dereq_('../tracks/audio-track');
var _tracksAudioTrack2 = _interopRequireDefault(_tracksAudioTrack);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsTimeRangesJs = _dereq_('../utils/time-ranges.js');
var _utilsBufferJs = _dereq_('../utils/buffer.js');
var _mediaErrorJs = _dereq_('../media-error.js');
var _mediaErrorJs2 = _interopRequireDefault(_mediaErrorJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* Base class for media (HTML5 Video, Flash) controllers
*
* @param {Object=} options Options object
* @param {Function=} ready Ready callback function
* @extends Component
* @class Tech
*/
var Tech = (function (_Component) {
_inherits(Tech, _Component);
function Tech() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
var ready = arguments.length <= 1 || arguments[1] === undefined ? function () {} : arguments[1];
_classCallCheck(this, Tech);
// we don't want the tech to report user activity automatically.
// This is done manually in addControlsListeners
options.reportTouchActivity = false;
_Component.call(this, null, options, ready);
// keep track of whether the current source has played at all to
// implement a very limited played()
this.hasStarted_ = false;
this.on('playing', function () {
this.hasStarted_ = true;
});
this.on('loadstart', function () {
this.hasStarted_ = false;
});
this.textTracks_ = options.textTracks;
this.videoTracks_ = options.videoTracks;
this.audioTracks_ = options.audioTracks;
// Manually track progress in cases where the browser/flash player doesn't report it.
if (!this.featuresProgressEvents) {
this.manualProgressOn();
}
// Manually track timeupdates in cases where the browser/flash player doesn't report it.
if (!this.featuresTimeupdateEvents) {
this.manualTimeUpdatesOn();
}
if (options.nativeCaptions === false || options.nativeTextTracks === false) {
this.featuresNativeTextTracks = false;
}
if (!this.featuresNativeTextTracks) {
this.on('ready', this.emulateTextTracks);
}
this.initTextTrackListeners();
this.initTrackListeners();
// Turn on component tap events
this.emitTapEvents();
}
/**
* List of associated text tracks
*
* @type {TextTrackList}
* @private
*/
/* Fallbacks for unsupported event types
================================================================================ */
// Manually trigger progress events based on changes to the buffered amount
// Many flash players and older HTML5 browsers don't send progress or progress-like events
/**
* Turn on progress events
*
* @method manualProgressOn
*/
Tech.prototype.manualProgressOn = function manualProgressOn() {
this.on('durationchange', this.onDurationChange);
this.manualProgress = true;
// Trigger progress watching when a source begins loading
this.one('ready', this.trackProgress);
};
/**
* Turn off progress events
*
* @method manualProgressOff
*/
Tech.prototype.manualProgressOff = function manualProgressOff() {
this.manualProgress = false;
this.stopTrackingProgress();
this.off('durationchange', this.onDurationChange);
};
/**
* Track progress
*
* @method trackProgress
*/
Tech.prototype.trackProgress = function trackProgress() {
this.stopTrackingProgress();
this.progressInterval = this.setInterval(Fn.bind(this, function () {
// Don't trigger unless buffered amount is greater than last time
var numBufferedPercent = this.bufferedPercent();
if (this.bufferedPercent_ !== numBufferedPercent) {
this.trigger('progress');
}
this.bufferedPercent_ = numBufferedPercent;
if (numBufferedPercent === 1) {
this.stopTrackingProgress();
}
}), 500);
};
/**
* Update duration
*
* @method onDurationChange
*/
Tech.prototype.onDurationChange = function onDurationChange() {
this.duration_ = this.duration();
};
/**
* Create and get TimeRange object for buffering
*
* @return {TimeRangeObject}
* @method buffered
*/
Tech.prototype.buffered = function buffered() {
return _utilsTimeRangesJs.createTimeRange(0, 0);
};
/**
* Get buffered percent
*
* @return {Number}
* @method bufferedPercent
*/
Tech.prototype.bufferedPercent = function bufferedPercent() {
return _utilsBufferJs.bufferedPercent(this.buffered(), this.duration_);
};
/**
* Stops tracking progress by clearing progress interval
*
* @method stopTrackingProgress
*/
Tech.prototype.stopTrackingProgress = function stopTrackingProgress() {
this.clearInterval(this.progressInterval);
};
/*! Time Tracking -------------------------------------------------------------- */
/**
* Set event listeners for on play and pause and tracking current time
*
* @method manualTimeUpdatesOn
*/
Tech.prototype.manualTimeUpdatesOn = function manualTimeUpdatesOn() {
this.manualTimeUpdates = true;
this.on('play', this.trackCurrentTime);
this.on('pause', this.stopTrackingCurrentTime);
};
/**
* Remove event listeners for on play and pause and tracking current time
*
* @method manualTimeUpdatesOff
*/
Tech.prototype.manualTimeUpdatesOff = function manualTimeUpdatesOff() {
this.manualTimeUpdates = false;
this.stopTrackingCurrentTime();
this.off('play', this.trackCurrentTime);
this.off('pause', this.stopTrackingCurrentTime);
};
/**
* Tracks current time
*
* @method trackCurrentTime
*/
Tech.prototype.trackCurrentTime = function trackCurrentTime() {
if (this.currentTimeInterval) {
this.stopTrackingCurrentTime();
}
this.currentTimeInterval = this.setInterval(function () {
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
}, 250); // 42 = 24 fps // 250 is what Webkit uses // FF uses 15
};
/**
* Turn off play progress tracking (when paused or dragging)
*
* @method stopTrackingCurrentTime
*/
Tech.prototype.stopTrackingCurrentTime = function stopTrackingCurrentTime() {
this.clearInterval(this.currentTimeInterval);
// #1002 - if the video ends right before the next timeupdate would happen,
// the progress bar won't make it all the way to the end
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
};
/**
* Turn off any manual progress or timeupdate tracking
*
* @method dispose
*/
Tech.prototype.dispose = function dispose() {
// clear out all tracks because we can't reuse them between techs
this.clearTracks(['audio', 'video', 'text']);
// Turn off any manual progress or timeupdate tracking
if (this.manualProgress) {
this.manualProgressOff();
}
if (this.manualTimeUpdates) {
this.manualTimeUpdatesOff();
}
_Component.prototype.dispose.call(this);
};
/**
* clear out a track list, or multiple track lists
*
* Note: Techs without source handlers should call this between
* sources for video & audio tracks, as usually you don't want
* to use them between tracks and we have no automatic way to do
* it for you
*
* @method clearTracks
* @param {Array|String} types type(s) of track lists to empty
*/
Tech.prototype.clearTracks = function clearTracks(types) {
var _this = this;
types = [].concat(types);
// clear out all tracks because we can't reuse them between techs
types.forEach(function (type) {
var list = _this[type + 'Tracks']() || [];
var i = list.length;
while (i--) {
var track = list[i];
if (type === 'text') {
_this.removeRemoteTextTrack(track);
}
list.removeTrack_(track);
}
});
};
/**
* Reset the tech. Removes all sources and resets readyState.
*
* @method reset
*/
Tech.prototype.reset = function reset() {};
/**
* When invoked without an argument, returns a MediaError object
* representing the current error state of the player or null if
* there is no error. When invoked with an argument, set the current
* error state of the player.
* @param {MediaError=} err Optional an error object
* @return {MediaError} the current error object or null
* @method error
*/
Tech.prototype.error = function error(err) {
if (err !== undefined) {
if (err instanceof _mediaErrorJs2['default']) {
this.error_ = err;
} else {
this.error_ = new _mediaErrorJs2['default'](err);
}
this.trigger('error');
}
return this.error_;
};
/**
* Return the time ranges that have been played through for the
* current source. This implementation is incomplete. It does not
* track the played time ranges, only whether the source has played
* at all or not.
* @return {TimeRangeObject} a single time range if this video has
* played or an empty set of ranges if not.
* @method played
*/
Tech.prototype.played = function played() {
if (this.hasStarted_) {
return _utilsTimeRangesJs.createTimeRange(0, 0);
}
return _utilsTimeRangesJs.createTimeRange();
};
/**
* Set current time
*
* @method setCurrentTime
*/
Tech.prototype.setCurrentTime = function setCurrentTime() {
// improve the accuracy of manual timeupdates
if (this.manualTimeUpdates) {
this.trigger({ type: 'timeupdate', target: this, manuallyTriggered: true });
}
};
/**
* Initialize texttrack listeners
*
* @method initTextTrackListeners
*/
Tech.prototype.initTextTrackListeners = function initTextTrackListeners() {
var textTrackListChanges = Fn.bind(this, function () {
this.trigger('texttrackchange');
});
var tracks = this.textTracks();
if (!tracks) return;
tracks.addEventListener('removetrack', textTrackListChanges);
tracks.addEventListener('addtrack', textTrackListChanges);
this.on('dispose', Fn.bind(this, function () {
tracks.removeEventListener('removetrack', textTrackListChanges);
tracks.removeEventListener('addtrack', textTrackListChanges);
}));
};
/**
* Initialize audio and video track listeners
*
* @method initTrackListeners
*/
Tech.prototype.initTrackListeners = function initTrackListeners() {
var _this2 = this;
var trackTypes = ['video', 'audio'];
trackTypes.forEach(function (type) {
var trackListChanges = function trackListChanges() {
_this2.trigger(type + 'trackchange');
};
var tracks = _this2[type + 'Tracks']();
tracks.addEventListener('removetrack', trackListChanges);
tracks.addEventListener('addtrack', trackListChanges);
_this2.on('dispose', function () {
tracks.removeEventListener('removetrack', trackListChanges);
tracks.removeEventListener('addtrack', trackListChanges);
});
});
};
/**
* Emulate texttracks
*
* @method emulateTextTracks
*/
Tech.prototype.emulateTextTracks = function emulateTextTracks() {
var _this3 = this;
var tracks = this.textTracks();
if (!tracks) {
return;
}
if (!_globalWindow2['default']['WebVTT'] && this.el().parentNode != null) {
(function () {
var script = _globalDocument2['default'].createElement('script');
script.src = _this3.options_['vtt.js'] || 'https://cdn.rawgit.com/gkatsev/vtt.js/vjs-v0.12.1/dist/vtt.min.js';
script.onload = function () {
_this3.trigger('vttjsloaded');
};
script.onerror = function () {
_this3.trigger('vttjserror');
};
_this3.on('dispose', function () {
script.onload = null;
script.onerror = null;
});
// but have not loaded yet and we set it to true before the inject so that
// we don't overwrite the injected window.WebVTT if it loads right away
_globalWindow2['default']['WebVTT'] = true;
_this3.el().parentNode.appendChild(script);
})();
}
var updateDisplay = function updateDisplay() {
return _this3.trigger('texttrackchange');
};
var textTracksChanges = function textTracksChanges() {
updateDisplay();
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
track.removeEventListener('cuechange', updateDisplay);
if (track.mode === 'showing') {
track.addEventListener('cuechange', updateDisplay);
}
}
};
textTracksChanges();
tracks.addEventListener('change', textTracksChanges);
this.on('dispose', function () {
tracks.removeEventListener('change', textTracksChanges);
});
};
/**
* Get videotracks
*
* @returns {VideoTrackList}
* @method videoTracks
*/
Tech.prototype.videoTracks = function videoTracks() {
this.videoTracks_ = this.videoTracks_ || new _tracksVideoTrackList2['default']();
return this.videoTracks_;
};
/**
* Get audiotracklist
*
* @returns {AudioTrackList}
* @method audioTracks
*/
Tech.prototype.audioTracks = function audioTracks() {
this.audioTracks_ = this.audioTracks_ || new _tracksAudioTrackList2['default']();
return this.audioTracks_;
};
/*
* Provide default methods for text tracks.
*
* Html5 tech overrides these.
*/
/**
* Get texttracks
*
* @returns {TextTrackList}
* @method textTracks
*/
Tech.prototype.textTracks = function textTracks() {
this.textTracks_ = this.textTracks_ || new _tracksTextTrackList2['default']();
return this.textTracks_;
};
/**
* Get remote texttracks
*
* @returns {TextTrackList}
* @method remoteTextTracks
*/
Tech.prototype.remoteTextTracks = function remoteTextTracks() {
this.remoteTextTracks_ = this.remoteTextTracks_ || new _tracksTextTrackList2['default']();
return this.remoteTextTracks_;
};
/**
* Get remote htmltrackelements
*
* @returns {HTMLTrackElementList}
* @method remoteTextTrackEls
*/
Tech.prototype.remoteTextTrackEls = function remoteTextTrackEls() {
this.remoteTextTrackEls_ = this.remoteTextTrackEls_ || new _tracksHtmlTrackElementList2['default']();
return this.remoteTextTrackEls_;
};
/**
* Creates and returns a remote text track object
*
* @param {String} kind Text track kind (subtitles, captions, descriptions
* chapters and metadata)
* @param {String=} label Label to identify the text track
* @param {String=} language Two letter language abbreviation
* @return {TextTrackObject}
* @method addTextTrack
*/
Tech.prototype.addTextTrack = function addTextTrack(kind, label, language) {
if (!kind) {
throw new Error('TextTrack kind is required but was not provided');
}
return createTrackHelper(this, kind, label, language);
};
/**
* Creates a remote text track object and returns a emulated html track element
*
* @param {Object} options The object should contain values for
* kind, language, label and src (location of the WebVTT file)
* @return {HTMLTrackElement}
* @method addRemoteTextTrack
*/
Tech.prototype.addRemoteTextTrack = function addRemoteTextTrack(options) {
var track = _utilsMergeOptionsJs2['default'](options, {
tech: this
});
var htmlTrackElement = new _tracksHtmlTrackElement2['default'](track);
// store HTMLTrackElement and TextTrack to remote list
this.remoteTextTrackEls().addTrackElement_(htmlTrackElement);
this.remoteTextTracks().addTrack_(htmlTrackElement.track);
// must come after remoteTextTracks()
this.textTracks().addTrack_(htmlTrackElement.track);
return htmlTrackElement;
};
/**
* Remove remote texttrack
*
* @param {TextTrackObject} track Texttrack to remove
* @method removeRemoteTextTrack
*/
Tech.prototype.removeRemoteTextTrack = function removeRemoteTextTrack(track) {
this.textTracks().removeTrack_(track);
var trackElement = this.remoteTextTrackEls().getTrackElementByTrack_(track);
// remove HTMLTrackElement and TextTrack from remote list
this.remoteTextTrackEls().removeTrackElement_(trackElement);
this.remoteTextTracks().removeTrack_(track);
};
/**
* Provide a default setPoster method for techs
* Poster support for techs should be optional, so we don't want techs to
* break if they don't have a way to set a poster.
*
* @method setPoster
*/
Tech.prototype.setPoster = function setPoster() {};
/*
* Check if the tech can support the given type
*
* The base tech does not support any type, but source handlers might
* overwrite this.
*
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
Tech.prototype.canPlayType = function canPlayType() {
return '';
};
/*
* Return whether the argument is a Tech or not.
* Can be passed either a Class like `Html5` or a instance like `player.tech_`
*
* @param {Object} component An item to check
* @return {Boolean} Whether it is a tech or not
*/
Tech.isTech = function isTech(component) {
return component.prototype instanceof Tech || component instanceof Tech || component === Tech;
};
/**
* Registers a Tech
*
* @param {String} name Name of the Tech to register
* @param {Object} tech The tech to register
* @static
* @method registerComponent
*/
Tech.registerTech = function registerTech(name, tech) {
if (!Tech.techs_) {
Tech.techs_ = {};
}
if (!Tech.isTech(tech)) {
throw new Error('Tech ' + name + ' must be a Tech');
}
Tech.techs_[name] = tech;
return tech;
};
/**
* Gets a component by name
*
* @param {String} name Name of the component to get
* @return {Component}
* @static
* @method getComponent
*/
Tech.getTech = function getTech(name) {
if (Tech.techs_ && Tech.techs_[name]) {
return Tech.techs_[name];
}
if (_globalWindow2['default'] && _globalWindow2['default'].videojs && _globalWindow2['default'].videojs[name]) {
_utilsLogJs2['default'].warn('The ' + name + ' tech was added to the videojs object when it should be registered using videojs.registerTech(name, tech)');
return _globalWindow2['default'].videojs[name];
}
};
return Tech;
})(_component2['default']);
Tech.prototype.textTracks_;
/**
* List of associated audio tracks
*
* @type {AudioTrackList}
* @private
*/
Tech.prototype.audioTracks_;
/**
* List of associated video tracks
*
* @type {VideoTrackList}
* @private
*/
Tech.prototype.videoTracks_;
var createTrackHelper = function createTrackHelper(self, kind, label, language) {
var options = arguments.length <= 4 || arguments[4] === undefined ? {} : arguments[4];
var tracks = self.textTracks();
options.kind = kind;
if (label) {
options.label = label;
}
if (language) {
options.language = language;
}
options.tech = self;
var track = new _tracksTextTrack2['default'](options);
tracks.addTrack_(track);
return track;
};
Tech.prototype.featuresVolumeControl = true;
// Resizing plugins using request fullscreen reloads the plugin
Tech.prototype.featuresFullscreenResize = false;
Tech.prototype.featuresPlaybackRate = false;
// Optional events that we can manually mimic with timers
// currently not triggered by video-js-swf
Tech.prototype.featuresProgressEvents = false;
Tech.prototype.featuresTimeupdateEvents = false;
Tech.prototype.featuresNativeTextTracks = false;
/*
* A functional mixin for techs that want to use the Source Handler pattern.
*
* ##### EXAMPLE:
*
* Tech.withSourceHandlers.call(MyTech);
*
*/
Tech.withSourceHandlers = function (_Tech) {
/*
* Register a source handler
* Source handlers are scripts for handling specific formats.
* The source handler pattern is used for adaptive formats (HLS, DASH) that
* manually load video data and feed it into a Source Buffer (Media Source Extensions)
* @param {Function} handler The source handler
* @param {Boolean} first Register it before any existing handlers
*/
_Tech.registerSourceHandler = function (handler, index) {
var handlers = _Tech.sourceHandlers;
if (!handlers) {
handlers = _Tech.sourceHandlers = [];
}
if (index === undefined) {
// add to the end of the list
index = handlers.length;
}
handlers.splice(index, 0, handler);
};
/*
* Check if the tech can support the given type
* @param {String} type The mimetype to check
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
_Tech.canPlayType = function (type) {
var handlers = _Tech.sourceHandlers || [];
var can = undefined;
for (var i = 0; i < handlers.length; i++) {
can = handlers[i].canPlayType(type);
if (can) {
return can;
}
}
return '';
};
/*
* Return the first source handler that supports the source
* TODO: Answer question: should 'probably' be prioritized over 'maybe'
* @param {Object} source The source object
* @returns {Object} The first source handler that supports the source
* @returns {null} Null if no source handler is found
*/
_Tech.selectSourceHandler = function (source) {
var handlers = _Tech.sourceHandlers || [];
var can = undefined;
for (var i = 0; i < handlers.length; i++) {
can = handlers[i].canHandleSource(source);
if (can) {
return handlers[i];
}
}
return null;
};
/*
* Check if the tech can support the given source
* @param {Object} srcObj The source object
* @return {String} 'probably', 'maybe', or '' (empty string)
*/
_Tech.canPlaySource = function (srcObj) {
var sh = _Tech.selectSourceHandler(srcObj);
if (sh) {
return sh.canHandleSource(srcObj);
}
return '';
};
/*
* When using a source handler, prefer its implementation of
* any function normally provided by the tech.
*/
var deferrable = ['seekable', 'duration'];
deferrable.forEach(function (fnName) {
var originalFn = this[fnName];
if (typeof originalFn !== 'function') {
return;
}
this[fnName] = function () {
if (this.sourceHandler_ && this.sourceHandler_[fnName]) {
return this.sourceHandler_[fnName].apply(this.sourceHandler_, arguments);
}
return originalFn.apply(this, arguments);
};
}, _Tech.prototype);
/*
* Create a function for setting the source using a source object
* and source handlers.
* Should never be called unless a source handler was found.
* @param {Object} source A source object with src and type keys
* @return {Tech} self
*/
_Tech.prototype.setSource = function (source) {
var sh = _Tech.selectSourceHandler(source);
if (!sh) {
// Fall back to a native source hander when unsupported sources are
// deliberately set
if (_Tech.nativeSourceHandler) {
sh = _Tech.nativeSourceHandler;
} else {
_utilsLogJs2['default'].error('No source hander found for the current source.');
}
}
// Dispose any existing source handler
this.disposeSourceHandler();
this.off('dispose', this.disposeSourceHandler);
// if we have a source and get another one
// then we are loading something new
// than clear all of our current tracks
if (this.currentSource_) {
this.clearTracks(['audio', 'video']);
this.currentSource_ = null;
}
if (sh !== _Tech.nativeSourceHandler) {
this.currentSource_ = source;
// Catch if someone replaced the src without calling setSource.
// If they do, set currentSource_ to null and dispose our source handler.
this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
this.one(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
}
this.sourceHandler_ = sh.handleSource(source, this, this.options_);
this.on('dispose', this.disposeSourceHandler);
return this;
};
// On the first loadstart after setSource
_Tech.prototype.firstLoadStartListener_ = function () {
this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
};
// On successive loadstarts when setSource has not been called again
_Tech.prototype.successiveLoadStartListener_ = function () {
this.currentSource_ = null;
this.disposeSourceHandler();
this.one(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
};
/*
* Clean up any existing source handler
*/
_Tech.prototype.disposeSourceHandler = function () {
if (this.sourceHandler_ && this.sourceHandler_.dispose) {
this.off(this.el_, 'loadstart', _Tech.prototype.firstLoadStartListener_);
this.off(this.el_, 'loadstart', _Tech.prototype.successiveLoadStartListener_);
this.sourceHandler_.dispose();
}
};
};
_component2['default'].registerComponent('Tech', Tech);
// Old name for Tech
_component2['default'].registerComponent('MediaTechController', Tech);
Tech.registerTech('Tech', Tech);
exports['default'] = Tech;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90ZWNoL3RlY2guanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O3lCQU1zQixjQUFjOzs7O3NDQUNQLDhCQUE4Qjs7OzswQ0FDMUIsbUNBQW1DOzs7O21DQUMzQywyQkFBMkI7Ozs7K0JBQzlCLHNCQUFzQjs7OzttQ0FDbEIsMkJBQTJCOzs7O2dDQUM5Qix1QkFBdUI7Ozs7b0NBQ25CLDRCQUE0Qjs7OztvQ0FDNUIsNEJBQTRCOzs7O2dDQUNoQyx1QkFBdUI7Ozs7eUJBQzFCLGdCQUFnQjs7SUFBeEIsRUFBRTs7MEJBQ0UsaUJBQWlCOzs7O2lDQUNELHlCQUF5Qjs7NkJBQ3pCLG9CQUFvQjs7NEJBQzdCLG1CQUFtQjs7Ozs0QkFDdkIsZUFBZTs7Ozs4QkFDYixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7SUFVaEMsSUFBSTtZQUFKLElBQUk7O0FBRUcsV0FGUCxJQUFJLEdBRW1DO1FBQS9CLE9BQU8seURBQUMsRUFBRTtRQUFFLEtBQUsseURBQUMsWUFBVSxFQUFFOzswQkFGdEMsSUFBSTs7OztBQUtOLFdBQU8sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7QUFDcEMsMEJBQU0sSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzs7OztBQUk1QixRQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztBQUN6QixRQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxZQUFXO0FBQzVCLFVBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO0tBQ3pCLENBQUMsQ0FBQztBQUNILFFBQUksQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLFlBQVc7QUFDOUIsVUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7S0FDMUIsQ0FBQyxDQUFDOztBQUVILFFBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQztBQUN0QyxRQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUM7QUFDeEMsUUFB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LFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3pFLFVBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0FBQzlFLFVBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDL0I7R0FDRixDQUFDO0NBRUgsQ0FBQzs7QUFFRix1QkFBVSxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7O0FBRTFDLHVCQUFVLGlCQUFpQixDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO3FCQUNqQixJQUFJIiwiZmlsZSI6InNyYy9qcy90ZWNoL3RlY2guanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRlY2guanNcbiAqIE1lZGlhIFRlY2hub2xvZ3kgQ29udHJvbGxlciAtIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHBsYXliYWNrXG4gKiB0ZWNobm9sb2d5IGNvbnRyb2xsZXJzIGxpa2UgRmxhc2ggYW5kIEhUTUw1XG4gKi9cblxuaW1wb3J0IENvbXBvbmVudCBmcm9tICcuLi9jb21wb25lbnQnO1xuaW1wb3J0IEhUTUxUcmFja0VsZW1lbnQgZnJvbSAnLi4vdHJhY2tzL2h0bWwtdHJhY2stZWxlbWVudCc7XG5pbXBvcnQgSFRNTFRyYWNrRWxlbWVudExpc3QgZnJvbSAnLi4vdHJhY2tzL2h0bWwtdHJhY2stZWxlbWVudC1saXN0JztcbmltcG9ydCBtZXJnZU9wdGlvbnMgZnJvbSAnLi4vdXRpbHMvbWVyZ2Utb3B0aW9ucy5qcyc7XG5pbXBvcnQgVGV4dFRyYWNrIGZyb20gJy4uL3RyYWNrcy90ZXh0LXRyYWNrJztcbmltcG9ydCBUZXh0VHJhY2tMaXN0IGZyb20gJy4uL3RyYWNrcy90ZXh0LXRyYWNrLWxpc3QnO1xuaW1wb3J0IFZpZGVvVHJhY2sgZnJvbSAnLi4vdHJhY2tzL3ZpZGVvLXRyYWNrJztcbmltcG9ydCBWaWRlb1RyYWNrTGlzdCBmcm9tICcuLi90cmFja3MvdmlkZW8tdHJhY2stbGlzdCc7XG5pbXBvcnQgQXVkaW9UcmFja0xpc3QgZnJvbSAnLi4vdHJhY2tzL2F1ZGlvLXRyYWNrLWxpc3QnO1xuaW1wb3J0IEF1ZGlvVHJhY2sgZnJvbSAnLi4vdHJhY2tzL2F1ZGlvLXRyYWNrJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4uL3V0aWxzL2ZuLmpzJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVSYW5nZSB9IGZyb20gJy4uL3V0aWxzL3RpbWUtcmFuZ2VzLmpzJztcbmltcG9ydCB7IGJ1ZmZlcmVkUGVyY2VudCB9IGZyb20gJy4uL3V0aWxzL2J1ZmZlci5qcyc7XG5pbXBvcnQgTWVkaWFFcnJvciBmcm9tICcuLi9tZWRpYS1lcnJvci5qcyc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgKEhUTUw1IFZpZGVvLCBGbGFzaCkgY29udHJvbGxlcnNcbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBvYmplY3RcbiAqIEBwYXJhbSB7RnVuY3Rpb249fSByZWFkeSBSZWFkeSBjYWxsYmFjayBmdW5jdGlvblxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgVGVjaFxuICovXG5jbGFzcyBUZWNoIGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zPXt9LCByZWFkeT1mdW5jdGlvbigpe30pe1xuICAgIC8vIHdlIGRvbid0IHdhbnQgdGhlIHRlY2ggdG8gcmVwb3J0IHVzZXIgYWN0aXZpdHkgYXV0b21hdGljYWxseS5cbiAgICAvLyBUaGlzIGlzIGRvbmUgbWFudWFsbHkgaW4gYWRkQ29udHJvbHNMaXN0ZW5lcnNcbiAgICBvcHRpb25zLnJlcG9ydFRvdWNoQWN0aXZpdHkgPSBmYWxzZTtcbiAgICBzdXBlcihudWxsLCBvcHRpb25zLCByZWFkeSk7XG5cbiAgICAvLyBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGN1cnJlbnQgc291cmNlIGhhcyBwbGF5ZWQgYXQgYWxsIHRvXG4gICAgLy8gaW1wbGVtZW50IGEgdmVyeSBsaW1pdGVkIHBsYXllZCgpXG4gICAgdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuICAgIHRoaXMub24oJ3BsYXlpbmcnLCBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaGFzU3RhcnRlZF8gPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMub24oJ2xvYWRzdGFydCcsIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5oYXNTdGFydGVkXyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy50ZXh0VHJhY2tzXyA9IG9wdGlvbnMudGV4dFRyYWNrcztcbiAgICB0aGlzLnZpZGVvVHJhY2tzXyA9IG9wdGlvbnMudmlkZW9UcmFja3M7XG4gICAgdGhpcy5hdWRpb1RyYWNrc18gPSBvcHRpb25zLmF1ZGlvVHJhY2tzO1xuXG4gICAgLy8gTWFudWFsbHkgdHJhY2sgcHJvZ3Jlc3MgaW4gY2FzZXMgd2hlcmUgdGhlIGJyb3dzZXIvZmxhc2ggcGxheWVyIGRvZXNuJ3QgcmVwb3J0IGl0LlxuICAgIGlmICghdGhpcy5mZWF0dXJlc1Byb2dyZXNzRXZlbnRzKSB7XG4gICAgICB0aGlzLm1hbnVhbFByb2dyZXNzT24oKTtcbiAgICB9XG5cbiAgICAvLyBNYW51YWxseSB0cmFjayB0aW1ldXBkYXRlcyBpbiBjYXNlcyB3aGVyZSB0aGUgYnJvd3Nlci9mbGFzaCBwbGF5ZXIgZG9lc24ndCByZXBvcnQgaXQuXG4gICAgaWYgKCF0aGlzLmZlYXR1cmVzVGltZXVwZGF0ZUV2ZW50cykge1xuICAgICAgdGhpcy5tYW51YWxUaW1lVXBkYXRlc09uKCk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMubmF0aXZlQ2FwdGlvbnMgPT09IGZhbHNlIHx8IG9wdGlvbnMubmF0aXZlVGV4dFRyYWNrcyA9PT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcykge1xuICAgICAgdGhpcy5vbigncmVhZHknLCB0aGlzLmVtdWxhdGVUZXh0VHJhY2tzKTtcbiAgICB9XG5cbiAgICB0aGlzLmluaXRUZXh0VHJhY2tMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLmluaXRUcmFja0xpc3RlbmVycygpO1xuXG4gICAgLy8gVHVybiBvbiBjb21wb25lbnQgdGFwIGV2ZW50c1xuICAgIHRoaXMuZW1pdFRhcEV2ZW50cygpO1xuICB9XG5cbiAgLyogRmFsbGJhY2tzIGZvciB1bnN1cHBvcnRlZCBldmVudCB0eXBlc1xuICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuICAvLyBNYW51YWxseSB0cmlnZ2VyIHByb2dyZXNzIGV2ZW50cyBiYXNlZCBvbiBjaGFuZ2VzIHRvIHRoZSBidWZmZXJlZCBhbW91bnRcbiAgLy8gTWFueSBmbGFzaCBwbGF5ZXJzIGFuZCBvbGRlciBIVE1MNSBicm93c2VycyBkb24ndCBzZW5kIHByb2dyZXNzIG9yIHByb2dyZXNzLWxpa2UgZXZlbnRzXG4gIC8qKlxuICAgKiBUdXJuIG9uIHByb2dyZXNzIGV2ZW50c1xuICAgKlxuICAgKiBAbWV0aG9kIG1hbnVhbFByb2dyZXNzT25cbiAgICovXG4gIG1hbnVhbFByb2dyZXNzT24oKSB7XG4gICAgdGhpcy5vbignZHVyYXRpb25jaGFuZ2UnLCB0aGlzLm9uRHVyYXRpb25DaGFuZ2UpO1xuXG4gICAgdGhpcy5tYW51YWxQcm9ncmVzcyA9IHRydWU7XG5cbiAgICAvLyBUcmlnZ2VyIHByb2dyZXNzIHdhdGNoaW5nIHdoZW4gYSBzb3VyY2UgYmVnaW5zIGxvYWRpbmdcbiAgICB0aGlzLm9uZSgncmVhZHknLCB0aGlzLnRyYWNrUHJvZ3Jlc3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFR1cm4gb2ZmIHByb2dyZXNzIGV2ZW50c1xuICAgKlxuICAgKiBAbWV0aG9kIG1hbnVhbFByb2dyZXNzT2ZmXG4gICAqL1xuICBtYW51YWxQcm9ncmVzc09mZigpIHtcbiAgICB0aGlzLm1hbnVhbFByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdQcm9ncmVzcygpO1xuXG4gICAgdGhpcy5vZmYoJ2R1cmF0aW9uY2hhbmdlJywgdGhpcy5vbkR1cmF0aW9uQ2hhbmdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBwcm9ncmVzc1xuICAgKlxuICAgKiBAbWV0aG9kIHRyYWNrUHJvZ3Jlc3NcbiAgICovXG4gIHRyYWNrUHJvZ3Jlc3MoKSB7XG4gICAgdGhpcy5zdG9wVHJhY2tpbmdQcm9ncmVzcygpO1xuICAgIHRoaXMucHJvZ3Jlc3NJbnRlcnZhbCA9IHRoaXMuc2V0SW50ZXJ2YWwoRm4uYmluZCh0aGlzLCBmdW5jdGlvbigpe1xuICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB1bmxlc3MgYnVmZmVyZWQgYW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBsYXN0IHRpbWVcblxuICAgICAgbGV0IG51bUJ1ZmZlcmVkUGVyY2VudCA9IHRoaXMuYnVmZmVyZWRQZXJjZW50KCk7XG5cbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkUGVyY2VudF8gIT09IG51bUJ1ZmZlcmVkUGVyY2VudCkge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ3Byb2dyZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYnVmZmVyZWRQZXJjZW50XyA9IG51bUJ1ZmZlcmVkUGVyY2VudDtcblxuICAgICAgaWYgKG51bUJ1ZmZlcmVkUGVyY2VudCA9PT0gMSkge1xuICAgICAgICB0aGlzLnN0b3BUcmFja2luZ1Byb2dyZXNzKCk7XG4gICAgICB9XG4gICAgfSksIDUwMCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGR1cmF0aW9uXG4gICAqXG4gICAqIEBtZXRob2Qgb25EdXJhdGlvbkNoYW5nZVxuICAgKi9cbiAgb25EdXJhdGlvbkNoYW5nZSgpIHtcbiAgICB0aGlzLmR1cmF0aW9uXyA9IHRoaXMuZHVyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGdldCBUaW1lUmFuZ2Ugb2JqZWN0IGZvciBidWZmZXJpbmdcbiAgICpcbiAgICogQHJldHVybiB7VGltZVJhbmdlT2JqZWN0fVxuICAgKiBAbWV0aG9kIGJ1ZmZlcmVkXG4gICAqL1xuICBidWZmZXJlZCgpIHtcbiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlKDAsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBidWZmZXJlZCBwZXJjZW50XG4gICAqXG4gICAqIEByZXR1cm4ge051bWJlcn1cbiAgICogQG1ldGhvZCBidWZmZXJlZFBlcmNlbnRcbiAgICovXG4gIGJ1ZmZlcmVkUGVyY2VudCgpIHtcbiAgICByZXR1cm4gYnVmZmVyZWRQZXJjZW50KHRoaXMuYnVmZmVyZWQoKSwgdGhpcy5kdXJhdGlvbl8pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRyYWNraW5nIHByb2dyZXNzIGJ5IGNsZWFyaW5nIHByb2dyZXNzIGludGVydmFsXG4gICAqXG4gICAqIEBtZXRob2Qgc3RvcFRyYWNraW5nUHJvZ3Jlc3NcbiAgICovXG4gIHN0b3BUcmFja2luZ1Byb2dyZXNzKCkge1xuICAgIHRoaXMuY2xlYXJJbnRlcnZhbCh0aGlzLnByb2dyZXNzSW50ZXJ2YWwpO1xuICB9XG5cbiAgLyohIFRpbWUgVHJhY2tpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbiAgLyoqXG4gICAqIFNldCBldmVudCBsaXN0ZW5lcnMgZm9yIG9uIHBsYXkgYW5kIHBhdXNlIGFuZCB0cmFja2luZyBjdXJyZW50IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCBtYW51YWxUaW1lVXBkYXRlc09uXG4gICAqL1xuICBtYW51YWxUaW1lVXBkYXRlc09uKCkge1xuICAgIHRoaXMubWFudWFsVGltZVVwZGF0ZXMgPSB0cnVlO1xuXG4gICAgdGhpcy5vbigncGxheScsIHRoaXMudHJhY2tDdXJyZW50VGltZSk7XG4gICAgdGhpcy5vbigncGF1c2UnLCB0aGlzLnN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZvciBvbiBwbGF5IGFuZCBwYXVzZSBhbmQgdHJhY2tpbmcgY3VycmVudCB0aW1lXG4gICAqXG4gICAqIEBtZXRob2QgbWFudWFsVGltZVVwZGF0ZXNPZmZcbiAgICovXG4gIG1hbnVhbFRpbWVVcGRhdGVzT2ZmKCkge1xuICAgIHRoaXMubWFudWFsVGltZVVwZGF0ZXMgPSBmYWxzZTtcbiAgICB0aGlzLnN0b3BUcmFja2luZ0N1cnJlbnRUaW1lKCk7XG4gICAgdGhpcy5vZmYoJ3BsYXknLCB0aGlzLnRyYWNrQ3VycmVudFRpbWUpO1xuICAgIHRoaXMub2ZmKCdwYXVzZScsIHRoaXMuc3RvcFRyYWNraW5nQ3VycmVudFRpbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBjdXJyZW50IHRpbWVcbiAgICpcbiAgICogQG1ldGhvZCB0cmFja0N1cnJlbnRUaW1lXG4gICAqL1xuICB0cmFja0N1cnJlbnRUaW1lKCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRUaW1lSW50ZXJ2YWwpIHsgdGhpcy5zdG9wVHJhY2tpbmdDdXJyZW50VGltZSgpOyB9XG4gICAgdGhpcy5jdXJyZW50VGltZUludGVydmFsID0gdGhpcy5zZXRJbnRlcnZhbChmdW5jdGlvbigpe1xuICAgICAgdGhpcy50cmlnZ2VyKHsgdHlwZTogJ3RpbWV1cGRhdGUnLCB0YXJnZXQ6IHRoaXMsIG1hbnVhbGx5VHJpZ2dlcmVkOiB0cnVlIH0pO1xuICAgIH0sIDI1MCk7IC8vIDQyID0gMjQgZnBzIC8vIDI1MCBpcyB3aGF0IFdlYmtpdCB1c2VzIC8vIEZGIHVzZXMgMTVcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIG9mZiBwbGF5IHByb2dyZXNzIHRyYWNraW5nICh3aGVuIHBhdXNlZCBvciBkcmFnZ2luZylcbiAgICpcbiAgICogQG1ldGhvZCBzdG9wVHJhY2tpbmdDdXJyZW50VGltZVxuICAgKi9cbiAgc3RvcFRyYWNraW5nQ3VycmVudFRpbWUoKSB7XG4gICAgdGhpcy5jbGVhckludGVydmFsKHRoaXMuY3VycmVudFRpbWVJbnRlcnZhbCk7XG5cbiAgICAvLyAjMTAwMiAtIGlmIHRoZSB2aWRlbyBlbmRzIHJpZ2h0IGJlZm9yZSB0aGUgbmV4dCB0aW1ldXBkYXRlIHdvdWxkIGhhcHBlbixcbiAgICAvLyB0aGUgcHJvZ3Jlc3MgYmFyIHdvbid0IG1ha2UgaXQgYWxsIHRoZSB3YXkgdG8gdGhlIGVuZFxuICAgIHRoaXMudHJpZ2dlcih7IHR5cGU6ICd0aW1ldXBkYXRlJywgdGFyZ2V0OiB0aGlzLCBtYW51YWxseVRyaWdnZXJlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUdXJuIG9mZiBhbnkgbWFudWFsIHByb2dyZXNzIG9yIHRpbWV1cGRhdGUgdHJhY2tpbmdcbiAgICpcbiAgICogQG1ldGhvZCBkaXNwb3NlXG4gICAqL1xuICBkaXNwb3NlKCkge1xuXG4gICAgLy8gY2xlYXIgb3V0IGFsbCB0cmFja3MgYmVjYXVzZSB3ZSBjYW4ndCByZXVzZSB0aGVtIGJldHdlZW4gdGVjaHNcbiAgICB0aGlzLmNsZWFyVHJhY2tzKFsnYXVkaW8nLCAndmlkZW8nLCAndGV4dCddKTtcblxuICAgIC8vIFR1cm4gb2ZmIGFueSBtYW51YWwgcHJvZ3Jlc3Mgb3IgdGltZXVwZGF0ZSB0cmFja2luZ1xuICAgIGlmICh0aGlzLm1hbnVhbFByb2dyZXNzKSB7IHRoaXMubWFudWFsUHJvZ3Jlc3NPZmYoKTsgfVxuXG4gICAgaWYgKHRoaXMubWFudWFsVGltZVVwZGF0ZXMpIHsgdGhpcy5tYW51YWxUaW1lVXBkYXRlc09mZigpOyB9XG5cbiAgICBzdXBlci5kaXNwb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogY2xlYXIgb3V0IGEgdHJhY2sgbGlzdCwgb3IgbXVsdGlwbGUgdHJhY2sgbGlzdHNcbiAgICpcbiAgICogTm90ZTogVGVjaHMgd2l0aG91dCBzb3VyY2UgaGFuZGxlcnMgc2hvdWxkIGNhbGwgdGhpcyBiZXR3ZWVuXG4gICAqIHNvdXJjZXMgZm9yIHZpZGVvICYgYXVkaW8gdHJhY2tzLCBhcyB1c3VhbGx5IHlvdSBkb24ndCB3YW50XG4gICAqIHRvIHVzZSB0aGVtIGJldHdlZW4gdHJhY2tzIGFuZCB3ZSBoYXZlIG5vIGF1dG9tYXRpYyB3YXkgdG8gZG9cbiAgICogaXQgZm9yIHlvdVxuICAgKlxuICAgKiBAbWV0aG9kIGNsZWFyVHJhY2tzXG4gICAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSB0eXBlcyB0eXBlKHMpIG9mIHRyYWNrIGxpc3RzIHRvIGVtcHR5XG4gICAqL1xuICBjbGVhclRyYWNrcyh0eXBlcykge1xuICAgIHR5cGVzID0gW10uY29uY2F0KHR5cGVzKTtcbiAgICAvLyBjbGVhciBvdXQgYWxsIHRyYWNrcyBiZWNhdXNlIHdlIGNhbid0IHJldXNlIHRoZW0gYmV0d2VlbiB0ZWNoc1xuICAgIHR5cGVzLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgIGxldCBsaXN0ID0gdGhpc1tgJHt0eXBlfVRyYWNrc2BdKCkgfHwgW107XG4gICAgICBsZXQgaSA9IGxpc3QubGVuZ3RoO1xuICAgICAgd2hpbGUgKGktLSkge1xuICAgICAgICBsZXQgdHJhY2sgPSBsaXN0W2ldO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVSZW1vdGVUZXh0VHJhY2sodHJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucmVtb3ZlVHJhY2tfKHRyYWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgdGVjaC4gUmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgcmVzZXRzIHJlYWR5U3RhdGUuXG4gICAqXG4gICAqIEBtZXRob2QgcmVzZXRcbiAgICovXG4gIHJlc2V0KCkge31cblxuICAvKipcbiAgICogV2hlbiBpbnZva2VkIHdpdGhvdXQgYW4gYXJndW1lbnQsIHJldHVybnMgYSBNZWRpYUVycm9yIG9iamVjdFxuICAgKiByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgZXJyb3Igc3RhdGUgb2YgdGhlIHBsYXllciBvciBudWxsIGlmXG4gICAqIHRoZXJlIGlzIG5vIGVycm9yLiBXaGVuIGludm9rZWQgd2l0aCBhbiBhcmd1bWVudCwgc2V0IHRoZSBjdXJyZW50XG4gICAqIGVycm9yIHN0YXRlIG9mIHRoZSBwbGF5ZXIuXG4gICAqIEBwYXJhbSB7TWVkaWFFcnJvcj19IGVyciAgICBPcHRpb25hbCBhbiBlcnJvciBvYmplY3RcbiAgICogQHJldHVybiB7TWVkaWFFcnJvcn0gICAgICAgIHRoZSBjdXJyZW50IGVycm9yIG9iamVjdCBvciBudWxsXG4gICAqIEBtZXRob2QgZXJyb3JcbiAgICovXG4gIGVycm9yKGVycikge1xuICAgIGlmIChlcnIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE1lZGlhRXJyb3IpIHtcbiAgICAgICAgdGhpcy5lcnJvcl8gPSBlcnI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVycm9yXyA9IG5ldyBNZWRpYUVycm9yKGVycik7XG4gICAgICB9XG4gICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmVycm9yXztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIHRpbWUgcmFuZ2VzIHRoYXQgaGF2ZSBiZWVuIHBsYXllZCB0aHJvdWdoIGZvciB0aGVcbiAgICogY3VycmVudCBzb3VyY2UuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW5jb21wbGV0ZS4gSXQgZG9lcyBub3RcbiAgICogdHJhY2sgdGhlIHBsYXllZCB0aW1lIHJhbmdlcywgb25seSB3aGV0aGVyIHRoZSBzb3VyY2UgaGFzIHBsYXllZFxuICAgKiBhdCBhbGwgb3Igbm90LlxuICAgKiBAcmV0dXJuIHtUaW1lUmFuZ2VPYmplY3R9IGEgc2luZ2xlIHRpbWUgcmFuZ2UgaWYgdGhpcyB2aWRlbyBoYXNcbiAgICogcGxheWVkIG9yIGFuIGVtcHR5IHNldCBvZiByYW5nZXMgaWYgbm90LlxuICAgKiBAbWV0aG9kIHBsYXllZFxuICAgKi9cbiAgcGxheWVkKCkge1xuICAgIGlmICh0aGlzLmhhc1N0YXJ0ZWRfKSB7XG4gICAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlKDAsIDApO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlVGltZVJhbmdlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGN1cnJlbnQgdGltZVxuICAgKlxuICAgKiBAbWV0aG9kIHNldEN1cnJlbnRUaW1lXG4gICAqL1xuICBzZXRDdXJyZW50VGltZSgpIHtcbiAgICAvLyBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiBtYW51YWwgdGltZXVwZGF0ZXNcbiAgICBpZiAodGhpcy5tYW51YWxUaW1lVXBkYXRlcykgeyB0aGlzLnRyaWdnZXIoeyB0eXBlOiAndGltZXVwZGF0ZScsIHRhcmdldDogdGhpcywgbWFudWFsbHlUcmlnZ2VyZWQ6IHRydWUgfSk7IH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHRleHR0cmFjayBsaXN0ZW5lcnNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0VGV4dFRyYWNrTGlzdGVuZXJzXG4gICAqL1xuICBpbml0VGV4dFRyYWNrTGlzdGVuZXJzKCkge1xuICAgIGxldCB0ZXh0VHJhY2tMaXN0Q2hhbmdlcyA9IEZuLmJpbmQodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnRyaWdnZXIoJ3RleHR0cmFja2NoYW5nZScpO1xuICAgIH0pO1xuXG4gICAgbGV0IHRyYWNrcyA9IHRoaXMudGV4dFRyYWNrcygpO1xuXG4gICAgaWYgKCF0cmFja3MpIHJldHVybjtcblxuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRleHRUcmFja0xpc3RDaGFuZ2VzKTtcbiAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0ZXh0VHJhY2tMaXN0Q2hhbmdlcyk7XG5cbiAgICB0aGlzLm9uKCdkaXNwb3NlJywgRm4uYmluZCh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZW1vdmV0cmFjaycsIHRleHRUcmFja0xpc3RDaGFuZ2VzKTtcbiAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRleHRUcmFja0xpc3RDaGFuZ2VzKTtcbiAgICB9KSk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIGF1ZGlvIGFuZCB2aWRlbyB0cmFjayBsaXN0ZW5lcnNcbiAgICpcbiAgICogQG1ldGhvZCBpbml0VHJhY2tMaXN0ZW5lcnNcbiAgICovXG4gIGluaXRUcmFja0xpc3RlbmVycygpIHtcbiAgICBjb25zdCB0cmFja1R5cGVzID0gWyd2aWRlbycsICdhdWRpbyddO1xuXG4gICAgdHJhY2tUeXBlcy5mb3JFYWNoKCh0eXBlKSA9PiB7XG4gICAgICBsZXQgdHJhY2tMaXN0Q2hhbmdlcyA9ICgpID0+IHtcbiAgICAgICAgdGhpcy50cmlnZ2VyKGAke3R5cGV9dHJhY2tjaGFuZ2VgKTtcbiAgICAgIH07XG5cbiAgICAgIGxldCB0cmFja3MgPSB0aGlzW2Ake3R5cGV9VHJhY2tzYF0oKTtcblxuICAgICAgdHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG4gICAgICB0cmFja3MuYWRkRXZlbnRMaXN0ZW5lcignYWRkdHJhY2snLCB0cmFja0xpc3RDaGFuZ2VzKTtcblxuICAgICAgdGhpcy5vbignZGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgdHJhY2tzLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlbW92ZXRyYWNrJywgdHJhY2tMaXN0Q2hhbmdlcyk7XG4gICAgICAgIHRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKCdhZGR0cmFjaycsIHRyYWNrTGlzdENoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW11bGF0ZSB0ZXh0dHJhY2tzXG4gICAqXG4gICAqIEBtZXRob2QgZW11bGF0ZVRleHRUcmFja3NcbiAgICovXG4gIGVtdWxhdGVUZXh0VHJhY2tzKCkge1xuICAgIGxldCB0cmFja3MgPSB0aGlzLnRleHRUcmFja3MoKTtcbiAgICBpZiAoIXRyYWNrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghd2luZG93WydXZWJWVFQnXSAmJiB0aGlzLmVsKCkucGFyZW50Tm9kZSAhPSBudWxsKSB7XG4gICAgICBsZXQgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICBzY3JpcHQuc3JjID0gdGhpcy5vcHRpb25zX1sndnR0LmpzJ10gfHwgJy4uL25vZGVfbW9kdWxlcy92aWRlb2pzLXZ0dC5qcy9kaXN0L3Z0dC5qcyc7XG4gICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ3Z0dGpzbG9hZGVkJyk7XG4gICAgICB9O1xuICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMudHJpZ2dlcigndnR0anNlcnJvcicpO1xuICAgICAgfTtcbiAgICAgIHRoaXMub24oJ2Rpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgIHNjcmlwdC5vbmxvYWQgPSBudWxsO1xuICAgICAgICBzY3JpcHQub25lcnJvciA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIC8vIGJ1dCBoYXZlIG5vdCBsb2FkZWQgeWV0IGFuZCB3ZSBzZXQgaXQgdG8gdHJ1ZSBiZWZvcmUgdGhlIGluamVjdCBzbyB0aGF0XG4gICAgICAvLyB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlIGluamVjdGVkIHdpbmRvdy5XZWJWVFQgaWYgaXQgbG9hZHMgcmlnaHQgYXdheVxuICAgICAgd2luZG93WydXZWJWVFQnXSA9IHRydWU7XG4gICAgICB0aGlzLmVsKCkucGFyZW50Tm9kZS5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgIH1cblxuICAgIGxldCB1cGRhdGVEaXNwbGF5ID0gKCkgPT4gdGhpcy50cmlnZ2VyKCd0ZXh0dHJhY2tjaGFuZ2UnKTtcbiAgICBsZXQgdGV4dFRyYWNrc0NoYW5nZXMgPSAoKSA9PiB7XG4gICAgICB1cGRhdGVEaXNwbGF5KCk7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGxldCB0cmFjayA9IHRyYWNrc1tpXTtcbiAgICAgICAgdHJhY2sucmVtb3ZlRXZlbnRMaXN0ZW5lcignY3VlY2hhbmdlJywgdXBkYXRlRGlzcGxheSk7XG4gICAgICAgIGlmICh0cmFjay5tb2RlID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdjdWVjaGFuZ2UnLCB1cGRhdGVEaXNwbGF5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0ZXh0VHJhY2tzQ2hhbmdlcygpO1xuICAgIHRyYWNrcy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0ZXh0VHJhY2tzQ2hhbmdlcyk7XG5cbiAgICB0aGlzLm9uKCdkaXNwb3NlJywgZnVuY3Rpb24oKSB7XG4gICAgICB0cmFja3MucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGV4dFRyYWNrc0NoYW5nZXMpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB2aWRlb3RyYWNrc1xuICAgKlxuICAgKiBAcmV0dXJucyB7VmlkZW9UcmFja0xpc3R9XG4gICAqIEBtZXRob2QgdmlkZW9UcmFja3NcbiAgICovXG4gIHZpZGVvVHJhY2tzKCkge1xuICAgIHRoaXMudmlkZW9UcmFja3NfID0gdGhpcy52aWRlb1RyYWNrc18gfHwgbmV3IFZpZGVvVHJhY2tMaXN0KCk7XG4gICAgcmV0dXJuIHRoaXMudmlkZW9UcmFja3NfO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhdWRpb3RyYWNrbGlzdFxuICAgKlxuICAgKiBAcmV0dXJucyB7QXVkaW9UcmFja0xpc3R9XG4gICAqIEBtZXRob2QgYXVkaW9UcmFja3NcbiAgICovXG4gIGF1ZGlvVHJhY2tzKCkge1xuICAgIHRoaXMuYXVkaW9UcmFja3NfID0gdGhpcy5hdWRpb1RyYWNrc18gfHwgbmV3IEF1ZGlvVHJhY2tMaXN0KCk7XG4gICAgcmV0dXJuIHRoaXMuYXVkaW9UcmFja3NfO1xuICB9XG5cbiAgLypcbiAgICogUHJvdmlkZSBkZWZhdWx0IG1ldGhvZHMgZm9yIHRleHQgdHJhY2tzLlxuICAgKlxuICAgKiBIdG1sNSB0ZWNoIG92ZXJyaWRlcyB0aGVzZS5cbiAgICovXG5cbiAgLyoqXG4gICAqIEdldCB0ZXh0dHJhY2tzXG4gICAqXG4gICAqIEByZXR1cm5zIHtUZXh0VHJhY2tMaXN0fVxuICAgKiBAbWV0aG9kIHRleHRUcmFja3NcbiAgICovXG4gIHRleHRUcmFja3MoKSB7XG4gICAgdGhpcy50ZXh0VHJhY2tzXyA9IHRoaXMudGV4dFRyYWNrc18gfHwgbmV3IFRleHRUcmFja0xpc3QoKTtcbiAgICByZXR1cm4gdGhpcy50ZXh0VHJhY2tzXztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgcmVtb3RlIHRleHR0cmFja3NcbiAgICpcbiAgICogQHJldHVybnMge1RleHRUcmFja0xpc3R9XG4gICAqIEBtZXRob2QgcmVtb3RlVGV4dFRyYWNrc1xuICAgKi9cbiAgcmVtb3RlVGV4dFRyYWNrcygpIHtcbiAgICB0aGlzLnJlbW90ZVRleHRUcmFja3NfID0gdGhpcy5yZW1vdGVUZXh0VHJhY2tzXyB8fCBuZXcgVGV4dFRyYWNrTGlzdCgpO1xuICAgIHJldHVybiB0aGlzLnJlbW90ZVRleHRUcmFja3NfO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZW1vdGUgaHRtbHRyYWNrZWxlbWVudHNcbiAgICpcbiAgICogQHJldHVybnMge0hUTUxUcmFja0VsZW1lbnRMaXN0fVxuICAgKiBAbWV0aG9kIHJlbW90ZVRleHRUcmFja0Vsc1xuICAgKi9cbiAgcmVtb3RlVGV4dFRyYWNrRWxzKCkge1xuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzXyA9IHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzXyB8fCBuZXcgSFRNTFRyYWNrRWxlbWVudExpc3QoKTtcbiAgICByZXR1cm4gdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHNfO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZW1vdGUgdGV4dCB0cmFjayBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGtpbmQgVGV4dCB0cmFjayBraW5kIChzdWJ0aXRsZXMsIGNhcHRpb25zLCBkZXNjcmlwdGlvbnNcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFwdGVycyBhbmQgbWV0YWRhdGEpXG4gICAqIEBwYXJhbSB7U3RyaW5nPX0gbGFiZWwgTGFiZWwgdG8gaWRlbnRpZnkgdGhlIHRleHQgdHJhY2tcbiAgICogQHBhcmFtIHtTdHJpbmc9fSBsYW5ndWFnZSBUd28gbGV0dGVyIGxhbmd1YWdlIGFiYnJldmlhdGlvblxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2tPYmplY3R9XG4gICAqIEBtZXRob2QgYWRkVGV4dFRyYWNrXG4gICAqL1xuICBhZGRUZXh0VHJhY2soa2luZCwgbGFiZWwsIGxhbmd1YWdlKSB7XG4gICAgaWYgKCFraW5kKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RleHRUcmFjayBraW5kIGlzIHJlcXVpcmVkIGJ1dCB3YXMgbm90IHByb3ZpZGVkJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZVRyYWNrSGVscGVyKHRoaXMsIGtpbmQsIGxhYmVsLCBsYW5ndWFnZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlbW90ZSB0ZXh0IHRyYWNrIG9iamVjdCBhbmQgcmV0dXJucyBhIGVtdWxhdGVkIGh0bWwgdHJhY2sgZWxlbWVudFxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyBUaGUgb2JqZWN0IHNob3VsZCBjb250YWluIHZhbHVlcyBmb3JcbiAgICoga2luZCwgbGFuZ3VhZ2UsIGxhYmVsIGFuZCBzcmMgKGxvY2F0aW9uIG9mIHRoZSBXZWJWVFQgZmlsZSlcbiAgICogQHJldHVybiB7SFRNTFRyYWNrRWxlbWVudH1cbiAgICogQG1ldGhvZCBhZGRSZW1vdGVUZXh0VHJhY2tcbiAgICovXG4gIGFkZFJlbW90ZVRleHRUcmFjayhvcHRpb25zKSB7XG4gICAgbGV0IHRyYWNrID0gbWVyZ2VPcHRpb25zKG9wdGlvbnMsIHtcbiAgICAgIHRlY2g6IHRoaXNcbiAgICB9KTtcblxuICAgIGxldCBodG1sVHJhY2tFbGVtZW50ID0gbmV3IEhUTUxUcmFja0VsZW1lbnQodHJhY2spO1xuXG4gICAgLy8gc3RvcmUgSFRNTFRyYWNrRWxlbWVudCBhbmQgVGV4dFRyYWNrIHRvIHJlbW90ZSBsaXN0XG4gICAgdGhpcy5yZW1vdGVUZXh0VHJhY2tFbHMoKS5hZGRUcmFja0VsZW1lbnRfKGh0bWxUcmFja0VsZW1lbnQpO1xuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrcygpLmFkZFRyYWNrXyhodG1sVHJhY2tFbGVtZW50LnRyYWNrKTtcblxuICAgIC8vIG11c3QgY29tZSBhZnRlciByZW1vdGVUZXh0VHJhY2tzKClcbiAgICB0aGlzLnRleHRUcmFja3MoKS5hZGRUcmFja18oaHRtbFRyYWNrRWxlbWVudC50cmFjayk7XG5cbiAgICByZXR1cm4gaHRtbFRyYWNrRWxlbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgcmVtb3RlIHRleHR0cmFja1xuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja09iamVjdH0gdHJhY2sgVGV4dHRyYWNrIHRvIHJlbW92ZVxuICAgKiBAbWV0aG9kIHJlbW92ZVJlbW90ZVRleHRUcmFja1xuICAgKi9cbiAgcmVtb3ZlUmVtb3RlVGV4dFRyYWNrKHRyYWNrKSB7XG4gICAgdGhpcy50ZXh0VHJhY2tzKCkucmVtb3ZlVHJhY2tfKHRyYWNrKTtcblxuICAgIGxldCB0cmFja0VsZW1lbnQgPSB0aGlzLnJlbW90ZVRleHRUcmFja0VscygpLmdldFRyYWNrRWxlbWVudEJ5VHJhY2tfKHRyYWNrKTtcblxuICAgIC8vIHJlbW92ZSBIVE1MVHJhY2tFbGVtZW50IGFuZCBUZXh0VHJhY2sgZnJvbSByZW1vdGUgbGlzdFxuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrRWxzKCkucmVtb3ZlVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnQpO1xuICAgIHRoaXMucmVtb3RlVGV4dFRyYWNrcygpLnJlbW92ZVRyYWNrXyh0cmFjayk7XG4gIH1cblxuICAvKipcbiAgICogUHJvdmlkZSBhIGRlZmF1bHQgc2V0UG9zdGVyIG1ldGhvZCBmb3IgdGVjaHNcbiAgICogUG9zdGVyIHN1cHBvcnQgZm9yIHRlY2hzIHNob3VsZCBiZSBvcHRpb25hbCwgc28gd2UgZG9uJ3Qgd2FudCB0ZWNocyB0b1xuICAgKiBicmVhayBpZiB0aGV5IGRvbid0IGhhdmUgYSB3YXkgdG8gc2V0IGEgcG9zdGVyLlxuICAgKlxuICAgKiBAbWV0aG9kIHNldFBvc3RlclxuICAgKi9cbiAgc2V0UG9zdGVyKCkge31cblxuICAvKlxuICAgKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gdHlwZVxuICAgKlxuICAgKiBUaGUgYmFzZSB0ZWNoIGRvZXMgbm90IHN1cHBvcnQgYW55IHR5cGUsIGJ1dCBzb3VyY2UgaGFuZGxlcnMgbWlnaHRcbiAgICogb3ZlcndyaXRlIHRoaXMuXG4gICAqXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuICBjYW5QbGF5VHlwZSgpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKlxuICAgKiBSZXR1cm4gd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBUZWNoIG9yIG5vdC5cbiAgICogQ2FuIGJlIHBhc3NlZCBlaXRoZXIgYSBDbGFzcyBsaWtlIGBIdG1sNWAgb3IgYSBpbnN0YW5jZSBsaWtlIGBwbGF5ZXIudGVjaF9gXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wb25lbnQgQW4gaXRlbSB0byBjaGVja1xuICAgKiBAcmV0dXJuIHtCb29sZWFufSAgICAgICAgIFdoZXRoZXIgaXQgaXMgYSB0ZWNoIG9yIG5vdFxuICAgKi9cbiAgc3RhdGljIGlzVGVjaChjb21wb25lbnQpIHtcbiAgICByZXR1cm4gY29tcG9uZW50LnByb3RvdHlwZSBpbnN0YW5jZW9mIFRlY2ggfHxcbiAgICAgICAgICAgY29tcG9uZW50IGluc3RhbmNlb2YgVGVjaCB8fFxuICAgICAgICAgICBjb21wb25lbnQgPT09IFRlY2g7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgVGVjaFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBUZWNoIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB0ZWNoIFRoZSB0ZWNoIHRvIHJlZ2lzdGVyXG4gICAqIEBzdGF0aWNcbiAgICogQG1ldGhvZCByZWdpc3RlckNvbXBvbmVudFxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyVGVjaChuYW1lLCB0ZWNoKSB7XG4gICAgaWYgKCFUZWNoLnRlY2hzXykge1xuICAgICAgVGVjaC50ZWNoc18gPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoIVRlY2guaXNUZWNoKHRlY2gpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlY2ggJHtuYW1lfSBtdXN0IGJlIGEgVGVjaGApO1xuICAgIH1cblxuICAgIFRlY2gudGVjaHNfW25hbWVdID0gdGVjaDtcbiAgICByZXR1cm4gdGVjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgY29tcG9uZW50IGJ5IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGdldFxuICAgKiBAcmV0dXJuIHtDb21wb25lbnR9XG4gICAqIEBzdGF0aWNcbiAgICogQG1ldGhvZCBnZXRDb21wb25lbnRcbiAgICovXG4gIHN0YXRpYyBnZXRUZWNoKG5hbWUpIHtcbiAgICBpZiAoVGVjaC50ZWNoc18gJiYgVGVjaC50ZWNoc19bbmFtZV0pIHtcbiAgICAgIHJldHVybiBUZWNoLnRlY2hzX1tuYW1lXTtcbiAgICB9XG5cbiAgICBpZiAod2luZG93ICYmIHdpbmRvdy52aWRlb2pzICYmIHdpbmRvdy52aWRlb2pzW25hbWVdKSB7XG4gICAgICBsb2cud2FybihgVGhlICR7bmFtZX0gdGVjaCB3YXMgYWRkZWQgdG8gdGhlIHZpZGVvanMgb2JqZWN0IHdoZW4gaXQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcgdmlkZW9qcy5yZWdpc3RlclRlY2gobmFtZSwgdGVjaClgKTtcbiAgICAgIHJldHVybiB3aW5kb3cudmlkZW9qc1tuYW1lXTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBMaXN0IG9mIGFzc29jaWF0ZWQgdGV4dCB0cmFja3NcbiAqXG4gKiBAdHlwZSB7VGV4dFRyYWNrTGlzdH1cbiAqIEBwcml2YXRlXG4gKi9cblRlY2gucHJvdG90eXBlLnRleHRUcmFja3NfO1xuXG4vKipcbiAqIExpc3Qgb2YgYXNzb2NpYXRlZCBhdWRpbyB0cmFja3NcbiAqXG4gKiBAdHlwZSB7QXVkaW9UcmFja0xpc3R9XG4gKiBAcHJpdmF0ZVxuICovXG5UZWNoLnByb3RvdHlwZS5hdWRpb1RyYWNrc187XG5cbi8qKlxuICogTGlzdCBvZiBhc3NvY2lhdGVkIHZpZGVvIHRyYWNrc1xuICpcbiAqIEB0eXBlIHtWaWRlb1RyYWNrTGlzdH1cbiAqIEBwcml2YXRlXG4gKi9cblRlY2gucHJvdG90eXBlLnZpZGVvVHJhY2tzXztcblxuXG52YXIgY3JlYXRlVHJhY2tIZWxwZXIgPSBmdW5jdGlvbihzZWxmLCBraW5kLCBsYWJlbCwgbGFuZ3VhZ2UsIG9wdGlvbnM9e30pIHtcbiAgbGV0IHRyYWNrcyA9IHNlbGYudGV4dFRyYWNrcygpO1xuXG4gIG9wdGlvbnMua2luZCA9IGtpbmQ7XG5cbiAgaWYgKGxhYmVsKSB7XG4gICAgb3B0aW9ucy5sYWJlbCA9IGxhYmVsO1xuICB9XG4gIGlmIChsYW5ndWFnZSkge1xuICAgIG9wdGlvbnMubGFuZ3VhZ2UgPSBsYW5ndWFnZTtcbiAgfVxuICBvcHRpb25zLnRlY2ggPSBzZWxmO1xuXG4gIGxldCB0cmFjayA9IG5ldyBUZXh0VHJhY2sob3B0aW9ucyk7XG4gIHRyYWNrcy5hZGRUcmFja18odHJhY2spO1xuXG4gIHJldHVybiB0cmFjaztcbn07XG5cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzVm9sdW1lQ29udHJvbCA9IHRydWU7XG5cbi8vIFJlc2l6aW5nIHBsdWdpbnMgdXNpbmcgcmVxdWVzdCBmdWxsc2NyZWVuIHJlbG9hZHMgdGhlIHBsdWdpblxuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNGdWxsc2NyZWVuUmVzaXplID0gZmFsc2U7XG5UZWNoLnByb3RvdHlwZS5mZWF0dXJlc1BsYXliYWNrUmF0ZSA9IGZhbHNlO1xuXG4vLyBPcHRpb25hbCBldmVudHMgdGhhdCB3ZSBjYW4gbWFudWFsbHkgbWltaWMgd2l0aCB0aW1lcnNcbi8vIGN1cnJlbnRseSBub3QgdHJpZ2dlcmVkIGJ5IHZpZGVvLWpzLXN3ZlxuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNQcm9ncmVzc0V2ZW50cyA9IGZhbHNlO1xuVGVjaC5wcm90b3R5cGUuZmVhdHVyZXNUaW1ldXBkYXRlRXZlbnRzID0gZmFsc2U7XG5cblRlY2gucHJvdG90eXBlLmZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyA9IGZhbHNlO1xuXG4vKlxuICogQSBmdW5jdGlvbmFsIG1peGluIGZvciB0ZWNocyB0aGF0IHdhbnQgdG8gdXNlIHRoZSBTb3VyY2UgSGFuZGxlciBwYXR0ZXJuLlxuICpcbiAqICMjIyMjIEVYQU1QTEU6XG4gKlxuICogICBUZWNoLndpdGhTb3VyY2VIYW5kbGVycy5jYWxsKE15VGVjaCk7XG4gKlxuICovXG5UZWNoLndpdGhTb3VyY2VIYW5kbGVycyA9IGZ1bmN0aW9uKF9UZWNoKXtcbiAgIC8qXG4gICAgKiBSZWdpc3RlciBhIHNvdXJjZSBoYW5kbGVyXG4gICAgKiBTb3VyY2UgaGFuZGxlcnMgYXJlIHNjcmlwdHMgZm9yIGhhbmRsaW5nIHNwZWNpZmljIGZvcm1hdHMuXG4gICAgKiBUaGUgc291cmNlIGhhbmRsZXIgcGF0dGVybiBpcyB1c2VkIGZvciBhZGFwdGl2ZSBmb3JtYXRzIChITFMsIERBU0gpIHRoYXRcbiAgICAqIG1hbnVhbGx5IGxvYWQgdmlkZW8gZGF0YSBhbmQgZmVlZCBpdCBpbnRvIGEgU291cmNlIEJ1ZmZlciAoTWVkaWEgU291cmNlIEV4dGVuc2lvbnMpXG4gICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gaGFuZGxlciAgVGhlIHNvdXJjZSBoYW5kbGVyXG4gICAgKiBAcGFyYW0gIHtCb29sZWFufSAgZmlyc3QgICAgUmVnaXN0ZXIgaXQgYmVmb3JlIGFueSBleGlzdGluZyBoYW5kbGVyc1xuICAgICovXG4gICBfVGVjaC5yZWdpc3RlclNvdXJjZUhhbmRsZXIgPSBmdW5jdGlvbihoYW5kbGVyLCBpbmRleCl7XG4gICAgbGV0IGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnM7XG5cbiAgICBpZiAoIWhhbmRsZXJzKSB7XG4gICAgICBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzID0gW107XG4gICAgfVxuXG4gICAgaWYgKGluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIGFkZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gICAgICBpbmRleCA9IGhhbmRsZXJzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBoYW5kbGVycy5zcGxpY2UoaW5kZXgsIDAsIGhhbmRsZXIpO1xuICB9O1xuXG4gIC8qXG4gICAqIENoZWNrIGlmIHRoZSB0ZWNoIGNhbiBzdXBwb3J0IHRoZSBnaXZlbiB0eXBlXG4gICAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSAgICBUaGUgbWltZXR5cGUgdG8gY2hlY2tcbiAgICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgICdwcm9iYWJseScsICdtYXliZScsIG9yICcnIChlbXB0eSBzdHJpbmcpXG4gICAqL1xuICBfVGVjaC5jYW5QbGF5VHlwZSA9IGZ1bmN0aW9uKHR5cGUpe1xuICAgIGxldCBoYW5kbGVycyA9IF9UZWNoLnNvdXJjZUhhbmRsZXJzIHx8IFtdO1xuICAgIGxldCBjYW47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjYW4gPSBoYW5kbGVyc1tpXS5jYW5QbGF5VHlwZSh0eXBlKTtcblxuICAgICAgaWYgKGNhbikge1xuICAgICAgICByZXR1cm4gY2FuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAgLypcbiAgICAqIFJldHVybiB0aGUgZmlyc3Qgc291cmNlIGhhbmRsZXIgdGhhdCBzdXBwb3J0cyB0aGUgc291cmNlXG4gICAgKiBUT0RPOiBBbnN3ZXIgcXVlc3Rpb246IHNob3VsZCAncHJvYmFibHknIGJlIHByaW9yaXRpemVkIG92ZXIgJ21heWJlJ1xuICAgICogQHBhcmFtICB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3RcbiAgICAqIEByZXR1cm5zIHtPYmplY3R9ICAgICAgIFRoZSBmaXJzdCBzb3VyY2UgaGFuZGxlciB0aGF0IHN1cHBvcnRzIHRoZSBzb3VyY2VcbiAgICAqIEByZXR1cm5zIHtudWxsfSAgICAgICAgIE51bGwgaWYgbm8gc291cmNlIGhhbmRsZXIgaXMgZm91bmRcbiAgICAqL1xuICAgX1RlY2guc2VsZWN0U291cmNlSGFuZGxlciA9IGZ1bmN0aW9uKHNvdXJjZSl7XG4gICAgbGV0IGhhbmRsZXJzID0gX1RlY2guc291cmNlSGFuZGxlcnMgfHwgW107XG4gICAgbGV0IGNhbjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbiA9IGhhbmRsZXJzW2ldLmNhbkhhbmRsZVNvdXJjZShzb3VyY2UpO1xuXG4gICAgICBpZiAoY2FuKSB7XG4gICAgICAgIHJldHVybiBoYW5kbGVyc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICAvKlxuICAgKiBDaGVjayBpZiB0aGUgdGVjaCBjYW4gc3VwcG9ydCB0aGUgZ2l2ZW4gc291cmNlXG4gICAqIEBwYXJhbSAge09iamVjdH0gc3JjT2JqICBUaGUgc291cmNlIG9iamVjdFxuICAgKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgICAgJ3Byb2JhYmx5JywgJ21heWJlJywgb3IgJycgKGVtcHR5IHN0cmluZylcbiAgICovXG4gIF9UZWNoLmNhblBsYXlTb3VyY2UgPSBmdW5jdGlvbihzcmNPYmope1xuICAgIGxldCBzaCA9IF9UZWNoLnNlbGVjdFNvdXJjZUhhbmRsZXIoc3JjT2JqKTtcblxuICAgIGlmIChzaCkge1xuICAgICAgcmV0dXJuIHNoLmNhbkhhbmRsZVNvdXJjZShzcmNPYmopO1xuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfTtcblxuICAvKlxuICAgKiBXaGVuIHVzaW5nIGEgc291cmNlIGhhbmRsZXIsIHByZWZlciBpdHMgaW1wbGVtZW50YXRpb24gb2ZcbiAgICogYW55IGZ1bmN0aW9uIG5vcm1hbGx5IHByb3ZpZGVkIGJ5IHRoZSB0ZWNoLlxuICAgKi9cbiAgbGV0IGRlZmVycmFibGUgPSBbXG4gICAgICAnc2Vla2FibGUnLFxuICAgICAgJ2R1cmF0aW9uJ1xuICAgIF07XG5cbiAgZGVmZXJyYWJsZS5mb3JFYWNoKGZ1bmN0aW9uIChmbk5hbWUpIHtcbiAgICBsZXQgb3JpZ2luYWxGbiA9IHRoaXNbZm5OYW1lXTtcblxuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXNbZm5OYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuc291cmNlSGFuZGxlcl8gJiYgdGhpcy5zb3VyY2VIYW5kbGVyX1tmbk5hbWVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZUhhbmRsZXJfW2ZuTmFtZV0uYXBwbHkodGhpcy5zb3VyY2VIYW5kbGVyXywgYXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcmlnaW5hbEZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfSwgX1RlY2gucHJvdG90eXBlKTtcblxuICAgLypcbiAgICAqIENyZWF0ZSBhIGZ1bmN0aW9uIGZvciBzZXR0aW5nIHRoZSBzb3VyY2UgdXNpbmcgYSBzb3VyY2Ugb2JqZWN0XG4gICAgKiBhbmQgc291cmNlIGhhbmRsZXJzLlxuICAgICogU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCB1bmxlc3MgYSBzb3VyY2UgaGFuZGxlciB3YXMgZm91bmQuXG4gICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlICBBIHNvdXJjZSBvYmplY3Qgd2l0aCBzcmMgYW5kIHR5cGUga2V5c1xuICAgICogQHJldHVybiB7VGVjaH0gc2VsZlxuICAgICovXG4gICBfVGVjaC5wcm90b3R5cGUuc2V0U291cmNlID0gZnVuY3Rpb24oc291cmNlKXtcbiAgICBsZXQgc2ggPSBfVGVjaC5zZWxlY3RTb3VyY2VIYW5kbGVyKHNvdXJjZSk7XG5cbiAgICBpZiAoIXNoKSB7XG4gICAgICAvLyBGYWxsIGJhY2sgdG8gYSBuYXRpdmUgc291cmNlIGhhbmRlciB3aGVuIHVuc3VwcG9ydGVkIHNvdXJjZXMgYXJlXG4gICAgICAvLyBkZWxpYmVyYXRlbHkgc2V0XG4gICAgICBpZiAoX1RlY2gubmF0aXZlU291cmNlSGFuZGxlcikge1xuICAgICAgICBzaCA9IF9UZWNoLm5hdGl2ZVNvdXJjZUhhbmRsZXI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuZXJyb3IoJ05vIHNvdXJjZSBoYW5kZXIgZm91bmQgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEaXNwb3NlIGFueSBleGlzdGluZyBzb3VyY2UgaGFuZGxlclxuICAgIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIoKTtcbiAgICB0aGlzLm9mZignZGlzcG9zZScsIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIpO1xuXG4gICAgLy8gaWYgd2UgaGF2ZSBhIHNvdXJjZSBhbmQgZ2V0IGFub3RoZXIgb25lXG4gICAgLy8gdGhlbiB3ZSBhcmUgbG9hZGluZyBzb21ldGhpbmcgbmV3XG4gICAgLy8gdGhhbiBjbGVhciBhbGwgb2Ygb3VyIGN1cnJlbnQgdHJhY2tzXG4gICAgaWYgKHRoaXMuY3VycmVudFNvdXJjZV8pIHtcbiAgICAgIHRoaXMuY2xlYXJUcmFja3MoWydhdWRpbycsICd2aWRlbyddKTtcblxuICAgICAgdGhpcy5jdXJyZW50U291cmNlXyA9IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNoICE9PSBfVGVjaC5uYXRpdmVTb3VyY2VIYW5kbGVyKSB7XG5cbiAgICAgIHRoaXMuY3VycmVudFNvdXJjZV8gPSBzb3VyY2U7XG5cbiAgICAgIC8vIENhdGNoIGlmIHNvbWVvbmUgcmVwbGFjZWQgdGhlIHNyYyB3aXRob3V0IGNhbGxpbmcgc2V0U291cmNlLlxuICAgICAgLy8gSWYgdGhleSBkbywgc2V0IGN1cnJlbnRTb3VyY2VfIHRvIG51bGwgYW5kIGRpc3Bvc2Ugb3VyIHNvdXJjZSBoYW5kbGVyLlxuICAgICAgdGhpcy5vZmYodGhpcy5lbF8sICdsb2Fkc3RhcnQnLCBfVGVjaC5wcm90b3R5cGUuZmlyc3RMb2FkU3RhcnRMaXN0ZW5lcl8pO1xuICAgICAgdGhpcy5vZmYodGhpcy5lbF8sICdsb2Fkc3RhcnQnLCBfVGVjaC5wcm90b3R5cGUuc3VjY2Vzc2l2ZUxvYWRTdGFydExpc3RlbmVyXyk7XG4gICAgICB0aGlzLm9uZSh0aGlzLmVsXywgJ2xvYWRzdGFydCcsIF9UZWNoLnByb3RvdHlwZS5maXJzdExvYWRTdGFydExpc3RlbmVyXyk7XG5cbiAgICB9XG5cbiAgICB0aGlzLnNvdXJjZUhhbmRsZXJfID0gc2guaGFuZGxlU291cmNlKHNvdXJjZSwgdGhpcywgdGhpcy5vcHRpb25zXyk7XG4gICAgdGhpcy5vbignZGlzcG9zZScsIHRoaXMuZGlzcG9zZVNvdXJjZUhhbmRsZXIpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgLy8gT24gdGhlIGZpcnN0IGxvYWRzdGFydCBhZnRlciBzZXRTb3VyY2VcbiAgX1RlY2gucHJvdG90eXBlLmZpcnN0TG9hZFN0YXJ0TGlzdGVuZXJfID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5vbmUodGhpcy5lbF8sICdsb2Fkc3RhcnQnLCBfVGVjaC5wcm90b3R5cGUuc3VjY2Vzc2l2ZUxvYWRTdGFydExpc3RlbmVyXyk7XG4gIH07XG5cbiAgLy8gT24gc3VjY2Vzc2l2ZSBsb2Fkc3RhcnRzIHdoZW4gc2V0U291cmNlIGhhcyBub3QgYmVlbiBjYWxsZWQgYWdhaW5cbiAgX1RlY2gucHJvdG90eXBlLnN1Y2Nlc3NpdmVMb2FkU3RhcnRMaXN0ZW5lcl8gPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLmN1cnJlbnRTb3VyY2VfID0gbnVsbDtcbiAgICB0aGlzLmRpc3Bvc2VTb3VyY2VIYW5kbGVyKCk7XG4gICAgdGhpcy5vbmUodGhpcy5lbF8sICdsb2Fkc3RhcnQnLCBfVGVjaC5wcm90b3R5cGUuc3VjY2Vzc2l2ZUxvYWRTdGFydExpc3RlbmVyXyk7XG4gIH07XG5cbiAgLypcbiAgICogQ2xlYW4gdXAgYW55IGV4aXN0aW5nIHNvdXJjZSBoYW5kbGVyXG4gICAqL1xuICBfVGVjaC5wcm90b3R5cGUuZGlzcG9zZVNvdXJjZUhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICBpZiAodGhpcy5zb3VyY2VIYW5kbGVyXyAmJiB0aGlzLnNvdXJjZUhhbmRsZXJfLmRpc3Bvc2UpIHtcbiAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLCAnbG9hZHN0YXJ0JywgX1RlY2gucHJvdG90eXBlLmZpcnN0TG9hZFN0YXJ0TGlzdGVuZXJfKTtcbiAgICAgIHRoaXMub2ZmKHRoaXMuZWxfLCAnbG9hZHN0YXJ0JywgX1RlY2gucHJvdG90eXBlLnN1Y2Nlc3NpdmVMb2FkU3RhcnRMaXN0ZW5lcl8pO1xuICAgICAgdGhpcy5zb3VyY2VIYW5kbGVyXy5kaXNwb3NlKCk7XG4gICAgfVxuICB9O1xuXG59O1xuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RlY2gnLCBUZWNoKTtcbi8vIE9sZCBuYW1lIGZvciBUZWNoXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ01lZGlhVGVjaENvbnRyb2xsZXInLCBUZWNoKTtcblRlY2gucmVnaXN0ZXJUZWNoKCdUZWNoJywgVGVjaCk7XG5leHBvcnQgZGVmYXVsdCBUZWNoO1xuIl19
},{"../component":66,"../media-error.js":108,"../tracks/audio-track":127,"../tracks/audio-track-list":126,"../tracks/html-track-element":129,"../tracks/html-track-element-list":128,"../tracks/text-track":135,"../tracks/text-track-list":133,"../tracks/video-track":140,"../tracks/video-track-list":139,"../utils/buffer.js":142,"../utils/fn.js":146,"../utils/log.js":149,"../utils/merge-options.js":150,"../utils/time-ranges.js":152,"global/document":7,"global/window":8}],125:[function(_dereq_,module,exports){
/**
* @file tooltip.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _lodashCompatFunctionThrottle = _dereq_('lodash-compat/function/throttle');
var _lodashCompatFunctionThrottle2 = _interopRequireDefault(_lodashCompatFunctionThrottle);
/**
* Base class for all tooltips
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Component
* @class Tooltip
*/
var Tooltip = (function (_Component) {
_inherits(Tooltip, _Component);
function Tooltip(player, options) {
_classCallCheck(this, Tooltip);
_Component.call(this, player, options);
this.handleHover_ = _lodashCompatFunctionThrottle2['default'](Fn.bind(this, this.handleHover), 25);
this.handleLeave_ = _lodashCompatFunctionThrottle2['default'](Fn.bind(this, this.handleLeave), 25);
}
Tooltip.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-tooltip'
});
};
Tooltip.prototype.text = function text(_text) {
if (!_text) return this.text_ || '';
this.text_ = _text;
this.el_.innerHTML = this.localize(this.text_);
this.update();
return this;
};
Tooltip.prototype.handler = function handler(_handler) {
if (!_handler) return this.handler;
if (this.handler_) {
this.off(this.handler_, 'mouseover', this.handleHover_);
this.off(this.handler_, 'mouseout', this.handleLeave_);
}
this.handler_ = _handler;
this.on(this.handler_, 'mouseover', this.handleHover_);
this.on(this.handler_, 'mouseout', this.handleLeave_);
return this;
};
Tooltip.prototype.handleHover = function handleHover() {
var _this = this;
if (this.timeout) {
this.clearTimeout(this.timeout);
this.timeout = 0;
}
this.timeout = this.setTimeout(function () {
return _this.hide();
}, 1000);
this.show();
};
Tooltip.prototype.handleLeave = function handleLeave(event) {
var _this2 = this;
if (this.timeout) {
this.clearTimeout(this.timeout);
this.timeout = 0;
}
this.timeout = this.setTimeout(function () {
return _this2.hide();
}, 50);
};
Tooltip.prototype.show = function show() {
var _this3 = this;
this.player_.trigger('tooltipShown');
this.player_.on('tooltipShown', function () {
return _this3.hide();
});
this.addClass('vjs-tooltip-active');
this.update();
};
Tooltip.prototype.hide = function hide() {
this.removeClass('vjs-tooltip-active');
this.player_.off('tooltipShown');
};
Tooltip.prototype.update = function update() {
var width = this.width();
if (!width) {
return this;
}
var parent_ = this.handler_;
var parentWidth = parent_ ? parent_.offsetWidth : 0;
var parentLeft = Dom.findElPosition(parent_).left - Dom.findElPosition(this.player_.el()).left;
var skew = parentWidth / 2 - width / 2;
var minSkew = -parentLeft;
// TODO: player_.width() is not working properly after switch to fullscreen
var maxSkew = this.player_.el().offsetWidth - parentLeft - width;
skew = Math.min(Math.max(minSkew, skew), maxSkew);
this.el_.style.left = skew + 'px';
return this;
};
return Tooltip;
})(_component2['default']);
_component2['default'].registerComponent('Tooltip', Tooltip);
exports['default'] = Tooltip;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7QUFDL0YsUUFBSSxJQUFJLEdBQUcsV0FBVyxHQUFDLENBQUMsR0FBRyxLQUFLLEdBQUMsQ0FBQyxDQUFDOztBQUVuQyxRQUFJLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQzs7QUFFMUIsUUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQzs7QUFFakUsUUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7O0FBRWxELFFBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDOztBQUVsQyxXQUFPLElBQUksQ0FBQztHQUNiOztTQS9GRyxPQUFPOzs7QUFtR2IsdUJBQVUsaUJBQWlCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNqQyxPQUFPIiwiZmlsZSI6InNyYy9qcy90b29sdGlwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB0b29sdGlwLmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi9jb21wb25lbnQnO1xuaW1wb3J0ICogYXMgRG9tIGZyb20gJy4vdXRpbHMvZG9tLmpzJztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuL3V0aWxzL2ZuLmpzJztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuaW1wb3J0IHRocm90dGxlIGZyb20gJ2xvZGFzaC1jb21wYXQvZnVuY3Rpb24vdGhyb3R0bGUnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCB0b29sdGlwc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwbGF5ZXIgIE1haW4gUGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBUb29sdGlwXG4gKi9cbmNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBDb21wb25lbnQge1xuXG4gIGNvbnN0cnVjdG9yKHBsYXllciwgb3B0aW9ucykge1xuICAgIHN1cGVyKHBsYXllciwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLmhhbmRsZUhvdmVyXyA9IHRocm90dGxlKEZuLmJpbmQodGhpcywgdGhpcy5oYW5kbGVIb3ZlciksIDI1KTtcbiAgICB0aGlzLmhhbmRsZUxlYXZlXyA9IHRocm90dGxlKEZuLmJpbmQodGhpcywgdGhpcy5oYW5kbGVMZWF2ZSksIDI1KTtcbiAgfVxuXG4gIGNyZWF0ZUVsKCkge1xuICAgIHJldHVybiBzdXBlci5jcmVhdGVFbCgnZGl2Jywge1xuICAgICAgY2xhc3NOYW1lOiAndmpzLXRvb2x0aXAnXG4gICAgfSk7XG4gIH1cblxuICB0ZXh0KHRleHQpIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiB0aGlzLnRleHRfIHx8ICcnO1xuXG4gICAgdGhpcy50ZXh0XyA9IHRleHQ7XG4gICAgdGhpcy5lbF8uaW5uZXJIVE1MID0gdGhpcy5sb2NhbGl6ZSh0aGlzLnRleHRfKTtcblxuICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGhhbmRsZXIoaGFuZGxlcikge1xuICAgIGlmICghaGFuZGxlcikgcmV0dXJuIHRoaXMuaGFuZGxlcjtcblxuICAgIGlmICh0aGlzLmhhbmRsZXJfKSB7XG4gICAgICB0aGlzLm9mZih0aGlzLmhhbmRsZXJfLCAnbW91c2VvdmVyJywgdGhpcy5oYW5kbGVIb3Zlcl8pO1xuICAgICAgdGhpcy5vZmYodGhpcy5oYW5kbGVyXywgJ21vdXNlb3V0JywgdGhpcy5oYW5kbGVMZWF2ZV8pO1xuXG4gICAgfVxuXG4gICAgdGhpcy5oYW5kbGVyXyA9IGhhbmRsZXI7XG4gICAgdGhpcy5vbih0aGlzLmhhbmRsZXJfLCAnbW91c2VvdmVyJywgdGhpcy5oYW5kbGVIb3Zlcl8pO1xuICAgIHRoaXMub24odGhpcy5oYW5kbGVyXywgJ21vdXNlb3V0JywgdGhpcy5oYW5kbGVMZWF2ZV8pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBoYW5kbGVIb3ZlcigpIHtcbiAgICBpZiAodGhpcy50aW1lb3V0KSB7XG4gICAgICB0aGlzLmNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgICAgdGhpcy50aW1lb3V0ID0gMDtcbiAgICB9XG4gICAgdGhpcy50aW1lb3V0ID0gdGhpcy5zZXRUaW1lb3V0KCgpPT50aGlzLmhpZGUoKSwgMTAwMCk7XG4gICAgdGhpcy5zaG93KCk7XG4gIH1cblxuICBoYW5kbGVMZWF2ZShldmVudCkge1xuICAgIGlmICh0aGlzLnRpbWVvdXQpIHtcbiAgICAgIHRoaXMuY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICB0aGlzLnRpbWVvdXQgPSAwO1xuICAgIH1cbiAgICB0aGlzLnRpbWVvdXQgPSB0aGlzLnNldFRpbWVvdXQoKCk9PnRoaXMuaGlkZSgpLCA1MCk7XG4gIH1cblxuICBzaG93KCkge1xuICAgIHRoaXMucGxheWVyXy50cmlnZ2VyKCd0b29sdGlwU2hvd24nKTtcbiAgICB0aGlzLnBsYXllcl8ub24oJ3Rvb2x0aXBTaG93bicsICgpPT50aGlzLmhpZGUoKSk7XG5cbiAgICB0aGlzLmFkZENsYXNzKCd2anMtdG9vbHRpcC1hY3RpdmUnKTtcbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgaGlkZSgpIHtcbiAgICB0aGlzLnJlbW92ZUNsYXNzKCd2anMtdG9vbHRpcC1hY3RpdmUnKTtcblxuICAgIHRoaXMucGxheWVyXy5vZmYoJ3Rvb2x0aXBTaG93bicpO1xuICB9XG5cbiAgdXBkYXRlKCkge1xuICAgIGxldCB3aWR0aCA9IHRoaXMud2lkdGgoKTtcblxuICAgIGlmICghd2lkdGgpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGxldCBwYXJlbnRfID0gdGhpcy5oYW5kbGVyXztcbiAgICBsZXQgcGFyZW50V2lkdGggPSBwYXJlbnRfID8gcGFyZW50Xy5vZmZzZXRXaWR0aCA6IDA7XG5cbiAgICBsZXQgcGFyZW50TGVmdCA9IERvbS5maW5kRWxQb3NpdGlvbihwYXJlbnRfKS5sZWZ0IC0gRG9tLmZpbmRFbFBvc2l0aW9uKHRoaXMucGxheWVyXy5lbCgpKS5sZWZ0O1xuICAgIGxldCBza2V3ID0gcGFyZW50V2lkdGgvMiAtIHdpZHRoLzI7XG5cbiAgICBsZXQgbWluU2tldyA9IC1wYXJlbnRMZWZ0O1xuICAgIC8vIFRPRE86IHBsYXllcl8ud2lkdGgoKSBpcyBub3Qgd29ya2luZyBwcm9wZXJseSBhZnRlciBzd2l0Y2ggdG8gZnVsbHNjcmVlblxuICAgIGxldCBtYXhTa2V3ID0gdGhpcy5wbGF5ZXJfLmVsKCkub2Zmc2V0V2lkdGggLSBwYXJlbnRMZWZ0IC0gd2lkdGg7XG5cbiAgICBza2V3ID0gTWF0aC5taW4oTWF0aC5tYXgobWluU2tldywgc2tldyksIG1heFNrZXcpO1xuXG4gICAgdGhpcy5lbF8uc3R5bGUubGVmdCA9IHNrZXcgKyAncHgnO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1Rvb2x0aXAnLCBUb29sdGlwKTtcbmV4cG9ydCBkZWZhdWx0IFRvb2x0aXA7XG4iXX0=
},{"./component":66,"./utils/dom.js":144,"./utils/events.js":145,"./utils/fn.js":146,"global/document":7,"lodash-compat/function/throttle":13}],126:[function(_dereq_,module,exports){
/**
* @file audio-track-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackList = _dereq_('./track-list');
var _trackList2 = _interopRequireDefault(_trackList);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* anywhere we call this function we diverge from the spec
* as we only support one enabled audiotrack at a time
*
* @param {Array|AudioTrackList} list list to work on
* @param {AudioTrack} track the track to skip
*/
var disableOthers = function disableOthers(list, track) {
for (var i = 0; i < list.length; i++) {
if (track.id === list[i].id) {
continue;
}
// another audio track is enabled, disable it
list[i].enabled = false;
}
};
/**
* A list of possible audio tracks. All functionality is in the
* base class Tracklist and the spec for AudioTrackList is located at:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotracklist
*
* interface AudioTrackList : EventTarget {
* readonly attribute unsigned long length;
* getter AudioTrack (unsigned long index);
* AudioTrack? getTrackById(DOMString id);
*
* attribute EventHandler onchange;
* attribute EventHandler onaddtrack;
* attribute EventHandler onremovetrack;
* };
*
* @param {AudioTrack[]} tracks a list of audio tracks to instantiate the list with
* @extends TrackList
* @class AudioTrackList
*/
var AudioTrackList = (function (_TrackList) {
_inherits(AudioTrackList, _TrackList);
function AudioTrackList() {
var tracks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
_classCallCheck(this, AudioTrackList);
var list = undefined;
// make sure only 1 track is enabled
// sorted from last index to first index
for (var i = tracks.length - 1; i >= 0; i--) {
if (tracks[i].enabled) {
disableOthers(tracks, tracks[i]);
break;
}
}
// IE8 forces us to implement inheritance ourselves
// as it does not support Object.defineProperty properly
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in _trackList2['default'].prototype) {
if (prop !== 'constructor') {
list[prop] = _trackList2['default'].prototype[prop];
}
}
for (var prop in AudioTrackList.prototype) {
if (prop !== 'constructor') {
list[prop] = AudioTrackList.prototype[prop];
}
}
}
list = _TrackList.call(this, tracks, list);
list.changing_ = false;
return list;
}
AudioTrackList.prototype.addTrack_ = function addTrack_(track) {
var _this = this;
if (track.enabled) {
disableOthers(this, track);
}
_TrackList.prototype.addTrack_.call(this, track);
// native tracks don't have this
if (!track.addEventListener) {
return;
}
track.addEventListener('enabledchange', function () {
// when we are disabling other tracks (since we don't support
// more than one track at a time) we will set changing_
// to true so that we don't trigger additional change events
if (_this.changing_) {
return;
}
_this.changing_ = true;
disableOthers(_this, track);
_this.changing_ = false;
_this.trigger('change');
});
};
AudioTrackList.prototype.addTrack = function addTrack(track) {
this.addTrack_(track);
};
AudioTrackList.prototype.removeTrack = function removeTrack(track) {
_TrackList.prototype.removeTrack_.call(this, track);
};
return AudioTrackList;
})(_trackList2['default']);
exports['default'] = AudioTrackList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvYXVkaW8tdHJhY2stbGlzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7eUJBR3NCLGNBQWM7Ozs7OEJBQ1gscUJBQXFCOztJQUFsQyxPQUFPOzs4QkFDRSxpQkFBaUI7Ozs7Ozs7Ozs7O0FBU3RDLElBQU0sYUFBYSxHQUFHLFNBQWhCLGFBQWEsQ0FBWSxJQUFJLEVBQUUsS0FBSyxFQUFFO0FBQzFDLE9BQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BDLFFBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO0FBQzNCLGVBQVM7S0FDVjs7QUFFRCxRQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztHQUN6QjtDQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW9CSSxjQUFjO1lBQWQsY0FBYzs7QUFDUCxXQURQLGNBQWMsR0FDTztRQUFiLE1BQU0seURBQUcsRUFBRTs7MEJBRG5CLGNBQWM7O0FBRWhCLFFBQUksSUFBSSxZQUFBLENBQUM7Ozs7QUFJVCxTQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsVUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFO0FBQ3JCLHFCQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLGNBQU07T0FDUDtLQUNGOzs7O0FBSUQsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLFVBQUksR0FBRyw0QkFBUyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDeEMsV0FBSyxJQUFJLElBQUksSUFBSSx1QkFBVSxTQUFTLEVBQUU7QUFDcEMsWUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO0FBQzFCLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBVSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDeEM7T0FDRjtBQUNELFdBQUssSUFBSSxJQUFJLElBQUksY0FBYyxDQUFDLFNBQVMsRUFBRTtBQUN6QyxZQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7QUFDMUIsY0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0M7T0FDRjtLQUNGOztBQUVELFFBQUksR0FBRyxzQkFBTSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0IsUUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7O0FBRXZCLFdBQU8sSUFBSSxDQUFDO0dBQ2I7O0FBakNHLGdCQUFjLFdBbUNsQixTQUFTLEdBQUEsbUJBQUMsS0FBSyxFQUFFOzs7QUFDZixRQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUU7QUFDakIsbUJBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDNUI7O0FBRUQseUJBQU0sU0FBUyxLQUFBLE9BQUMsS0FBSyxDQUFDLENBQUM7O0FBRXZCLFFBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7QUFDM0IsYUFBTztLQUNSOztBQUVELFNBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLEVBQUUsWUFBTTs7OztBQUk1QyxVQUFJLE1BQUssU0FBUyxFQUFFO0FBQ2xCLGVBQU87T0FDUjtBQUNELFlBQUssU0FBUyxHQUFHLElBQUksQ0FBQztBQUN0QixtQkFBYSxRQUFPLEtBQUssQ0FBQyxDQUFDO0FBQzNCLFlBQUssU0FBUyxHQUFHLEtBQUssQ0FBQztBQUN2QixZQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN4QixDQUFDLENBQUM7R0FDSjs7QUExREcsZ0JBQWMsV0E0RGxCLFFBQVEsR0FBQSxrQkFBQyxLQUFLLEVBQUU7QUFDZCxRQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3ZCOztBQTlERyxnQkFBYyxXQWdFbEIsV0FBVyxHQUFBLHFCQUFDLEtBQUssRUFBRTtBQUNqQix5QkFBTSxZQUFZLEtBQUEsT0FBQyxLQUFLLENBQUMsQ0FBQztHQUMzQjs7U0FsRUcsY0FBYzs7O3FCQXNFTCxjQUFjIiwiZmlsZSI6InNyYy9qcy90cmFja3MvYXVkaW8tdHJhY2stbGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgYXVkaW8tdHJhY2stbGlzdC5qc1xuICovXG5pbXBvcnQgVHJhY2tMaXN0IGZyb20gJy4vdHJhY2stbGlzdCc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogYW55d2hlcmUgd2UgY2FsbCB0aGlzIGZ1bmN0aW9uIHdlIGRpdmVyZ2UgZnJvbSB0aGUgc3BlY1xuICogYXMgd2Ugb25seSBzdXBwb3J0IG9uZSBlbmFibGVkIGF1ZGlvdHJhY2sgYXQgYSB0aW1lXG4gKlxuICogQHBhcmFtIHtBcnJheXxBdWRpb1RyYWNrTGlzdH0gbGlzdCBsaXN0IHRvIHdvcmsgb25cbiAqIEBwYXJhbSB7QXVkaW9UcmFja30gdHJhY2sgdGhlIHRyYWNrIHRvIHNraXBcbiAqL1xuY29uc3QgZGlzYWJsZU90aGVycyA9IGZ1bmN0aW9uKGxpc3QsIHRyYWNrKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykge1xuICAgIGlmICh0cmFjay5pZCA9PT0gbGlzdFtpXS5pZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIC8vIGFub3RoZXIgYXVkaW8gdHJhY2sgaXMgZW5hYmxlZCwgZGlzYWJsZSBpdFxuICAgIGxpc3RbaV0uZW5hYmxlZCA9IGZhbHNlO1xuICB9XG59O1xuLyoqXG4gKiBBIGxpc3Qgb2YgcG9zc2libGUgYXVkaW8gdHJhY2tzLiBBbGwgZnVuY3Rpb25hbGl0eSBpcyBpbiB0aGVcbiAqIGJhc2UgY2xhc3MgVHJhY2tsaXN0IGFuZCB0aGUgc3BlYyBmb3IgQXVkaW9UcmFja0xpc3QgaXMgbG9jYXRlZCBhdDpcbiAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNhdWRpb3RyYWNrbGlzdFxuICpcbiAqIGludGVyZmFjZSBBdWRpb1RyYWNrTGlzdCA6IEV2ZW50VGFyZ2V0IHtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoO1xuICogICBnZXR0ZXIgQXVkaW9UcmFjayAodW5zaWduZWQgbG9uZyBpbmRleCk7XG4gKiAgIEF1ZGlvVHJhY2s/IGdldFRyYWNrQnlJZChET01TdHJpbmcgaWQpO1xuICpcbiAqICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmNoYW5nZTtcbiAqICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmFkZHRyYWNrO1xuICogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ucmVtb3ZldHJhY2s7XG4gKiB9O1xuICpcbiAqIEBwYXJhbSB7QXVkaW9UcmFja1tdfSB0cmFja3MgYSBsaXN0IG9mIGF1ZGlvIHRyYWNrcyB0byBpbnN0YW50aWF0ZSB0aGUgbGlzdCB3aXRoXG4gKiBAZXh0ZW5kcyBUcmFja0xpc3RcbiAqIEBjbGFzcyBBdWRpb1RyYWNrTGlzdFxuICovXG5jbGFzcyBBdWRpb1RyYWNrTGlzdCBleHRlbmRzIFRyYWNrTGlzdCB7XG4gIGNvbnN0cnVjdG9yKHRyYWNrcyA9IFtdKSB7XG4gICAgbGV0IGxpc3Q7XG5cbiAgICAvLyBtYWtlIHN1cmUgb25seSAxIHRyYWNrIGlzIGVuYWJsZWRcbiAgICAvLyBzb3J0ZWQgZnJvbSBsYXN0IGluZGV4IHRvIGZpcnN0IGluZGV4XG4gICAgZm9yIChsZXQgaSA9IHRyYWNrcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKHRyYWNrc1tpXS5lbmFibGVkKSB7XG4gICAgICAgIGRpc2FibGVPdGhlcnModHJhY2tzLCB0cmFja3NbaV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJRTggZm9yY2VzIHVzIHRvIGltcGxlbWVudCBpbmhlcml0YW5jZSBvdXJzZWx2ZXNcbiAgICAvLyBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBwcm9wZXJseVxuICAgIGlmIChicm93c2VyLklTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yIChsZXQgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHByb3AgaW4gQXVkaW9UcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IEF1ZGlvVHJhY2tMaXN0LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxpc3QgPSBzdXBlcih0cmFja3MsIGxpc3QpO1xuICAgIGxpc3QuY2hhbmdpbmdfID0gZmFsc2U7XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGFkZFRyYWNrXyh0cmFjaykge1xuICAgIGlmICh0cmFjay5lbmFibGVkKSB7XG4gICAgICBkaXNhYmxlT3RoZXJzKHRoaXMsIHRyYWNrKTtcbiAgICB9XG5cbiAgICBzdXBlci5hZGRUcmFja18odHJhY2spO1xuICAgIC8vIG5hdGl2ZSB0cmFja3MgZG9uJ3QgaGF2ZSB0aGlzXG4gICAgaWYgKCF0cmFjay5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignZW5hYmxlZGNoYW5nZScsICgpID0+IHtcbiAgICAgIC8vIHdoZW4gd2UgYXJlIGRpc2FibGluZyBvdGhlciB0cmFja3MgKHNpbmNlIHdlIGRvbid0IHN1cHBvcnRcbiAgICAgIC8vIG1vcmUgdGhhbiBvbmUgdHJhY2sgYXQgYSB0aW1lKSB3ZSB3aWxsIHNldCBjaGFuZ2luZ19cbiAgICAgIC8vIHRvIHRydWUgc28gdGhhdCB3ZSBkb24ndCB0cmlnZ2VyIGFkZGl0aW9uYWwgY2hhbmdlIGV2ZW50c1xuICAgICAgaWYgKHRoaXMuY2hhbmdpbmdfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdpbmdfID0gdHJ1ZTtcbiAgICAgIGRpc2FibGVPdGhlcnModGhpcywgdHJhY2spO1xuICAgICAgdGhpcy5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRUcmFjayh0cmFjaykge1xuICAgIHRoaXMuYWRkVHJhY2tfKHRyYWNrKTtcbiAgfVxuXG4gIHJlbW92ZVRyYWNrKHRyYWNrKSB7XG4gICAgc3VwZXIucmVtb3ZlVHJhY2tfKHRyYWNrKTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEF1ZGlvVHJhY2tMaXN0O1xuIl19
},{"../utils/browser.js":141,"./track-list":137,"global/document":7}],127:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackEnums = _dereq_('./track-enums');
var _track = _dereq_('./track');
var _track2 = _interopRequireDefault(_track);
var _utilsMergeOptions = _dereq_('../utils/merge-options');
var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
/**
* A single audio text track as defined in:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#audiotrack
*
* interface AudioTrack {
* readonly attribute DOMString id;
* readonly attribute DOMString kind;
* readonly attribute DOMString label;
* readonly attribute DOMString language;
* attribute boolean enabled;
* };
*
* @param {Object=} options Object of option names and values
* @class AudioTrack
*/
var AudioTrack = (function (_Track) {
_inherits(AudioTrack, _Track);
function AudioTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, AudioTrack);
var settings = _utilsMergeOptions2['default'](options, {
kind: _trackEnums.AudioTrackKind[options.kind] || ''
});
// on IE8 this will be a document element
// for every other browser this will be a normal object
var track = _Track.call(this, settings);
var enabled = false;
if (browser.IS_IE8) {
for (var prop in AudioTrack.prototype) {
if (prop !== 'constructor') {
track[prop] = AudioTrack.prototype[prop];
}
}
}
Object.defineProperty(track, 'enabled', {
get: function get() {
return enabled;
},
set: function set(newEnabled) {
// an invalid or unchanged value
if (typeof newEnabled !== 'boolean' || newEnabled === enabled) {
return;
}
enabled = newEnabled;
this.trigger('enabledchange');
}
});
// if the user sets this track to selected then
// set selected to that true value otherwise
// we keep it false
if (settings.enabled) {
track.enabled = settings.enabled;
}
track.loaded_ = true;
return track;
}
return AudioTrack;
})(_track2['default']);
exports['default'] = AudioTrack;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvYXVkaW8tdHJhY2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzBCQUE2QixlQUFlOztxQkFDMUIsU0FBUzs7OztpQ0FDVCx3QkFBd0I7Ozs7OEJBQ2pCLHFCQUFxQjs7SUFBbEMsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUJiLFVBQVU7WUFBVixVQUFVOztBQUNILFdBRFAsVUFBVSxHQUNZO1FBQWQsT0FBTyx5REFBRyxFQUFFOzswQkFEcEIsVUFBVTs7QUFFWixRQUFJLFFBQVEsR0FBRywrQkFBTSxPQUFPLEVBQUU7QUFDNUIsVUFBSSxFQUFFLDJCQUFlLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0tBQ3pDLENBQUMsQ0FBQzs7O0FBR0gsUUFBSSxLQUFLLEdBQUcsa0JBQU0sUUFBUSxDQUFDLENBQUM7QUFDNUIsUUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDOztBQUVwQixRQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDbEIsV0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFO0FBQ3JDLFlBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUMxQixlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUMxQztPQUNGO0tBQ0Y7O0FBRUQsVUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFO0FBQ3RDLFNBQUcsRUFBQSxlQUFHO0FBQUUsZUFBTyxPQUFPLENBQUM7T0FBRTtBQUN6QixTQUFHLEVBQUEsYUFBQyxVQUFVLEVBQUU7O0FBRWQsWUFBSSxPQUFPLFVBQVUsS0FBSyxTQUFTLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRTtBQUM3RCxpQkFBTztTQUNSO0FBQ0QsZUFBTyxHQUFHLFVBQVUsQ0FBQztBQUNyQixZQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO09BQy9CO0tBQ0YsQ0FBQyxDQUFDOzs7OztBQUtILFFBQUksUUFBUSxDQUFDLE9BQU8sRUFBRTtBQUNwQixXQUFLLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7S0FDbEM7QUFDRCxTQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQzs7QUFFckIsV0FBTyxLQUFLLENBQUM7R0FDZDs7U0F2Q0csVUFBVTs7O3FCQTBDRCxVQUFVIiwiZmlsZSI6InNyYy9qcy90cmFja3MvYXVkaW8tdHJhY2suanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0F1ZGlvVHJhY2tLaW5kfSBmcm9tICcuL3RyYWNrLWVudW1zJztcbmltcG9ydCBUcmFjayBmcm9tICcuL3RyYWNrJztcbmltcG9ydCBtZXJnZSBmcm9tICcuLi91dGlscy9tZXJnZS1vcHRpb25zJztcbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5cbi8qKlxuICogQSBzaW5nbGUgYXVkaW8gdGV4dCB0cmFjayBhcyBkZWZpbmVkIGluOlxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tcbiAqXG4gKiBpbnRlcmZhY2UgQXVkaW9UcmFjayB7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaWQ7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2luZDtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYWJlbDtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYW5ndWFnZTtcbiAqICAgYXR0cmlidXRlIGJvb2xlYW4gZW5hYmxlZDtcbiAqIH07XG4gKlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICogQGNsYXNzIEF1ZGlvVHJhY2tcbiAqL1xuY2xhc3MgQXVkaW9UcmFjayBleHRlbmRzIFRyYWNrIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IHNldHRpbmdzID0gbWVyZ2Uob3B0aW9ucywge1xuICAgICAga2luZDogQXVkaW9UcmFja0tpbmRbb3B0aW9ucy5raW5kXSB8fCAnJ1xuICAgIH0pO1xuICAgIC8vIG9uIElFOCB0aGlzIHdpbGwgYmUgYSBkb2N1bWVudCBlbGVtZW50XG4gICAgLy8gZm9yIGV2ZXJ5IG90aGVyIGJyb3dzZXIgdGhpcyB3aWxsIGJlIGEgbm9ybWFsIG9iamVjdFxuICAgIGxldCB0cmFjayA9IHN1cGVyKHNldHRpbmdzKTtcbiAgICBsZXQgZW5hYmxlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGJyb3dzZXIuSVNfSUU4KSB7XG4gICAgICBmb3IgKGxldCBwcm9wIGluIEF1ZGlvVHJhY2sucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgdHJhY2tbcHJvcF0gPSBBdWRpb1RyYWNrLnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFjaywgJ2VuYWJsZWQnLCB7XG4gICAgICBnZXQoKSB7IHJldHVybiBlbmFibGVkOyB9LFxuICAgICAgc2V0KG5ld0VuYWJsZWQpIHtcbiAgICAgICAgLy8gYW4gaW52YWxpZCBvciB1bmNoYW5nZWQgdmFsdWVcbiAgICAgICAgaWYgKHR5cGVvZiBuZXdFbmFibGVkICE9PSAnYm9vbGVhbicgfHwgbmV3RW5hYmxlZCA9PT0gZW5hYmxlZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBlbmFibGVkID0gbmV3RW5hYmxlZDtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdlbmFibGVkY2hhbmdlJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBzZXRzIHRoaXMgdHJhY2sgdG8gc2VsZWN0ZWQgdGhlblxuICAgIC8vIHNldCBzZWxlY3RlZCB0byB0aGF0IHRydWUgdmFsdWUgb3RoZXJ3aXNlXG4gICAgLy8gd2Uga2VlcCBpdCBmYWxzZVxuICAgIGlmIChzZXR0aW5ncy5lbmFibGVkKSB7XG4gICAgICB0cmFjay5lbmFibGVkID0gc2V0dGluZ3MuZW5hYmxlZDtcbiAgICB9XG4gICAgdHJhY2subG9hZGVkXyA9IHRydWU7XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXVkaW9UcmFjaztcbiJdfQ==
},{"../utils/browser.js":141,"../utils/merge-options":150,"./track":138,"./track-enums":136}],128:[function(_dereq_,module,exports){
/**
* @file html-track-element-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var HtmlTrackElementList = (function () {
function HtmlTrackElementList() {
var trackElements = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
_classCallCheck(this, HtmlTrackElementList);
var list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in HtmlTrackElementList.prototype) {
if (prop !== 'constructor') {
list[prop] = HtmlTrackElementList.prototype[prop];
}
}
}
list.trackElements_ = [];
Object.defineProperty(list, 'length', {
get: function get() {
return this.trackElements_.length;
}
});
for (var i = 0, _length = trackElements.length; i < _length; i++) {
list.addTrackElement_(trackElements[i]);
}
if (browser.IS_IE8) {
return list;
}
}
HtmlTrackElementList.prototype.addTrackElement_ = function addTrackElement_(trackElement) {
this.trackElements_.push(trackElement);
};
HtmlTrackElementList.prototype.getTrackElementByTrack_ = function getTrackElementByTrack_(track) {
var trackElement_ = undefined;
for (var i = 0, _length2 = this.trackElements_.length; i < _length2; i++) {
if (track === this.trackElements_[i].track) {
trackElement_ = this.trackElements_[i];
break;
}
}
return trackElement_;
};
HtmlTrackElementList.prototype.removeTrackElement_ = function removeTrackElement_(trackElement) {
for (var i = 0, _length3 = this.trackElements_.length; i < _length3; i++) {
if (trackElement === this.trackElements_[i]) {
this.trackElements_.splice(i, 1);
break;
}
}
};
return HtmlTrackElementList;
})();
exports['default'] = HtmlTrackElementList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvaHRtbC10cmFjay1lbGVtZW50LWxpc3QuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OEJBSXlCLHFCQUFxQjs7SUFBbEMsT0FBTzs7OEJBQ0UsaUJBQWlCOzs7O0lBRWhDLG9CQUFvQjtBQUNiLFdBRFAsb0JBQW9CLEdBQ1E7UUFBcEIsYUFBYSx5REFBRyxFQUFFOzswQkFEMUIsb0JBQW9COztBQUV0QixRQUFJLElBQUksR0FBRyxJQUFJLENBQUM7O0FBRWhCLFFBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixVQUFJLEdBQUcsNEJBQVMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDOztBQUV4QyxXQUFLLElBQUksSUFBSSxJQUFJLG9CQUFvQixDQUFDLFNBQVMsRUFBRTtBQUMvQyxZQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7QUFDMUIsY0FBSSxDQUFDLElBQUksQ0FBQyxHQUFHLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNuRDtPQUNGO0tBQ0Y7O0FBRUQsUUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7O0FBRXpCLFVBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxTQUFHLEVBQUEsZUFBRztBQUNKLGVBQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7T0FDbkM7S0FDRixDQUFDLENBQUM7O0FBRUgsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLE9BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM5RCxVQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekM7O0FBRUQsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLGFBQU8sSUFBSSxDQUFDO0tBQ2I7R0FDRjs7QUE3Qkcsc0JBQW9CLFdBK0J4QixnQkFBZ0IsR0FBQSwwQkFBQyxZQUFZLEVBQUU7QUFDN0IsUUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7R0FDeEM7O0FBakNHLHNCQUFvQixXQW1DeEIsdUJBQXVCLEdBQUEsaUNBQUMsS0FBSyxFQUFFO0FBQzdCLFFBQUksYUFBYSxZQUFBLENBQUM7O0FBRWxCLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BFLFVBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFO0FBQzFDLHFCQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFdkMsY0FBTTtPQUNQO0tBQ0Y7O0FBRUQsV0FBTyxhQUFhLENBQUM7R0FDdEI7O0FBL0NHLHNCQUFvQixXQWlEeEIsbUJBQW1CLEdBQUEsNkJBQUMsWUFBWSxFQUFFO0FBQ2hDLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsUUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ3BFLFVBQUksWUFBWSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDM0MsWUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQUVqQyxjQUFNO09BQ1A7S0FDRjtHQUNGOztTQXpERyxvQkFBb0I7OztxQkE0RFgsb0JBQW9CIiwiZmlsZSI6InNyYy9qcy90cmFja3MvaHRtbC10cmFjay1lbGVtZW50LWxpc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC1saXN0LmpzXG4gKi9cblxuaW1wb3J0ICogYXMgYnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuXG5jbGFzcyBIdG1sVHJhY2tFbGVtZW50TGlzdCB7XG4gIGNvbnN0cnVjdG9yKHRyYWNrRWxlbWVudHMgPSBbXSkge1xuICAgIGxldCBsaXN0ID0gdGhpcztcblxuICAgIGlmIChicm93c2VyLklTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuXG4gICAgICBmb3IgKGxldCBwcm9wIGluIEh0bWxUcmFja0VsZW1lbnRMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIGxpc3RbcHJvcF0gPSBIdG1sVHJhY2tFbGVtZW50TGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0LnRyYWNrRWxlbWVudHNfID0gW107XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHRyYWNrRWxlbWVudHMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxpc3QuYWRkVHJhY2tFbGVtZW50Xyh0cmFja0VsZW1lbnRzW2ldKTtcbiAgICB9XG5cbiAgICBpZiAoYnJvd3Nlci5JU19JRTgpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgfVxuXG4gIGFkZFRyYWNrRWxlbWVudF8odHJhY2tFbGVtZW50KSB7XG4gICAgdGhpcy50cmFja0VsZW1lbnRzXy5wdXNoKHRyYWNrRWxlbWVudCk7XG4gIH1cblxuICBnZXRUcmFja0VsZW1lbnRCeVRyYWNrXyh0cmFjaykge1xuICAgIGxldCB0cmFja0VsZW1lbnRfO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmFjayA9PT0gdGhpcy50cmFja0VsZW1lbnRzX1tpXS50cmFjaykge1xuICAgICAgICB0cmFja0VsZW1lbnRfID0gdGhpcy50cmFja0VsZW1lbnRzX1tpXTtcblxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2tFbGVtZW50XztcbiAgfVxuXG4gIHJlbW92ZVRyYWNrRWxlbWVudF8odHJhY2tFbGVtZW50KSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IHRoaXMudHJhY2tFbGVtZW50c18ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh0cmFja0VsZW1lbnQgPT09IHRoaXMudHJhY2tFbGVtZW50c19baV0pIHtcbiAgICAgICAgdGhpcy50cmFja0VsZW1lbnRzXy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEh0bWxUcmFja0VsZW1lbnRMaXN0O1xuIl19
},{"../utils/browser.js":141,"global/document":7}],129:[function(_dereq_,module,exports){
/**
* @file html-track-element.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _tracksTextTrack = _dereq_('../tracks/text-track');
var _tracksTextTrack2 = _interopRequireDefault(_tracksTextTrack);
var NONE = 0;
var LOADING = 1;
var LOADED = 2;
var ERROR = 3;
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#htmltrackelement
*
* interface HTMLTrackElement : HTMLElement {
* attribute DOMString kind;
* attribute DOMString src;
* attribute DOMString srclang;
* attribute DOMString label;
* attribute boolean default;
*
* const unsigned short NONE = 0;
* const unsigned short LOADING = 1;
* const unsigned short LOADED = 2;
* const unsigned short ERROR = 3;
* readonly attribute unsigned short readyState;
*
* readonly attribute TextTrack track;
* };
*
* @param {Object} options TextTrack configuration
* @class HTMLTrackElement
*/
var HTMLTrackElement = (function (_EventTarget) {
_inherits(HTMLTrackElement, _EventTarget);
function HTMLTrackElement() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, HTMLTrackElement);
_EventTarget.call(this);
var readyState = undefined,
trackElement = this;
if (browser.IS_IE8) {
trackElement = _globalDocument2['default'].createElement('custom');
for (var prop in HTMLTrackElement.prototype) {
if (prop !== 'constructor') {
trackElement[prop] = HTMLTrackElement.prototype[prop];
}
}
}
var track = new _tracksTextTrack2['default'](options);
trackElement.kind = track.kind;
trackElement.src = track.src;
trackElement.srclang = track.language;
trackElement.label = track.label;
trackElement['default'] = track['default'];
Object.defineProperty(trackElement, 'readyState', {
get: function get() {
return readyState;
}
});
Object.defineProperty(trackElement, 'track', {
get: function get() {
return track;
}
});
readyState = NONE;
track.addEventListener('loadeddata', function () {
readyState = LOADED;
trackElement.trigger({
type: 'load',
target: trackElement
});
});
if (browser.IS_IE8) {
return trackElement;
}
}
return HTMLTrackElement;
})(_eventTarget2['default']);
HTMLTrackElement.prototype.allowedEvents_ = {
load: 'load'
};
HTMLTrackElement.NONE = NONE;
HTMLTrackElement.LOADING = LOADING;
HTMLTrackElement.LOADED = LOADED;
HTMLTrackElement.ERROR = ERROR;
exports['default'] = HTMLTrackElement;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvaHRtbC10cmFjay1lbGVtZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OEJBSXlCLHFCQUFxQjs7SUFBbEMsT0FBTzs7OEJBQ0UsaUJBQWlCOzs7OzJCQUNkLGlCQUFpQjs7OzsrQkFDbkIsc0JBQXNCOzs7O0FBRTVDLElBQU0sSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNmLElBQU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUNsQixJQUFNLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFDakIsSUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBeUJWLGdCQUFnQjtZQUFoQixnQkFBZ0I7O0FBQ1QsV0FEUCxnQkFBZ0IsR0FDTTtRQUFkLE9BQU8seURBQUcsRUFBRTs7MEJBRHBCLGdCQUFnQjs7QUFFbEIsMkJBQU8sQ0FBQzs7QUFFUixRQUFJLFVBQVUsWUFBQTtRQUNWLFlBQVksR0FBRyxJQUFJLENBQUM7O0FBRXhCLFFBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixrQkFBWSxHQUFHLDRCQUFTLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7QUFFaEQsV0FBSyxJQUFJLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUU7QUFDM0MsWUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO0FBQzFCLHNCQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3ZEO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLEtBQUssR0FBRyxpQ0FBYyxPQUFPLENBQUMsQ0FBQzs7QUFFbkMsZ0JBQVksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztBQUMvQixnQkFBWSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzdCLGdCQUFZLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7QUFDdEMsZ0JBQVksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztBQUNqQyxnQkFBWSxXQUFRLEdBQUcsS0FBSyxXQUFRLENBQUM7O0FBRXJDLFVBQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksRUFBRTtBQUNoRCxTQUFHLEVBQUEsZUFBRztBQUNKLGVBQU8sVUFBVSxDQUFDO09BQ25CO0tBQ0YsQ0FBQyxDQUFDOztBQUVILFVBQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRTtBQUMzQyxTQUFHLEVBQUEsZUFBRztBQUNKLGVBQU8sS0FBSyxDQUFDO09BQ2Q7S0FDRixDQUFDLENBQUM7O0FBRUgsY0FBVSxHQUFHLElBQUksQ0FBQzs7QUFFbEIsU0FBSyxDQUFDLGdCQUFnQixDQUFDLFlBQVksRUFBRSxZQUFXO0FBQzlDLGdCQUFVLEdBQUcsTUFBTSxDQUFDOztBQUVwQixrQkFBWSxDQUFDLE9BQU8sQ0FBQztBQUNuQixZQUFJLEVBQUUsTUFBTTtBQUNaLGNBQU0sRUFBRSxZQUFZO09BQ3JCLENBQUMsQ0FBQztLQUNKLENBQUMsQ0FBQzs7QUFFSCxRQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDbEIsYUFBTyxZQUFZLENBQUM7S0FDckI7R0FDRjs7U0FuREcsZ0JBQWdCOzs7QUFzRHRCLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUc7QUFDMUMsTUFBSSxFQUFFLE1BQU07Q0FDYixDQUFDOztBQUVGLGdCQUFnQixDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7QUFDN0IsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUNuQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0FBQ2pDLGdCQUFnQixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7O3FCQUVoQixnQkFBZ0IiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy9odG1sLXRyYWNrLWVsZW1lbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGh0bWwtdHJhY2stZWxlbWVudC5qc1xuICovXG5cbmltcG9ydCAqIGFzIGJyb3dzZXIgZnJvbSAnLi4vdXRpbHMvYnJvd3Nlci5qcyc7XG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCBFdmVudFRhcmdldCBmcm9tICcuLi9ldmVudC10YXJnZXQnO1xuaW1wb3J0IFRleHRUcmFjayBmcm9tICcuLi90cmFja3MvdGV4dC10cmFjayc7XG5cbmNvbnN0IE5PTkUgPSAwO1xuY29uc3QgTE9BRElORyA9IDE7XG5jb25zdCBMT0FERUQgPSAyO1xuY29uc3QgRVJST1IgPSAzO1xuXG4vKipcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNodG1sdHJhY2tlbGVtZW50XG4gKlxuICogaW50ZXJmYWNlIEhUTUxUcmFja0VsZW1lbnQgOiBIVE1MRWxlbWVudCB7XG4gKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcga2luZDtcbiAqICAgYXR0cmlidXRlIERPTVN0cmluZyBzcmM7XG4gKiAgIGF0dHJpYnV0ZSBET01TdHJpbmcgc3JjbGFuZztcbiAqICAgYXR0cmlidXRlIERPTVN0cmluZyBsYWJlbDtcbiAqICAgYXR0cmlidXRlIGJvb2xlYW4gZGVmYXVsdDtcbiAqXG4gKiAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5PTkUgPSAwO1xuICogICBjb25zdCB1bnNpZ25lZCBzaG9ydCBMT0FESU5HID0gMTtcbiAqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgTE9BREVEID0gMjtcbiAqICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRVJST1IgPSAzO1xuICogICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVhZHlTdGF0ZTtcbiAqXG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBUZXh0VHJhY2sgdHJhY2s7XG4gKiB9O1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIFRleHRUcmFjayBjb25maWd1cmF0aW9uXG4gKiBAY2xhc3MgSFRNTFRyYWNrRWxlbWVudFxuICovXG5cbmNsYXNzIEhUTUxUcmFja0VsZW1lbnQgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBsZXQgcmVhZHlTdGF0ZSxcbiAgICAgICAgdHJhY2tFbGVtZW50ID0gdGhpcztcblxuICAgIGlmIChicm93c2VyLklTX0lFOCkge1xuICAgICAgdHJhY2tFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAobGV0IHByb3AgaW4gSFRNTFRyYWNrRWxlbWVudC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0cmFja0VsZW1lbnRbcHJvcF0gPSBIVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0cmFjayA9IG5ldyBUZXh0VHJhY2sob3B0aW9ucyk7XG5cbiAgICB0cmFja0VsZW1lbnQua2luZCA9IHRyYWNrLmtpbmQ7XG4gICAgdHJhY2tFbGVtZW50LnNyYyA9IHRyYWNrLnNyYztcbiAgICB0cmFja0VsZW1lbnQuc3JjbGFuZyA9IHRyYWNrLmxhbmd1YWdlO1xuICAgIHRyYWNrRWxlbWVudC5sYWJlbCA9IHRyYWNrLmxhYmVsO1xuICAgIHRyYWNrRWxlbWVudC5kZWZhdWx0ID0gdHJhY2suZGVmYXVsdDtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFja0VsZW1lbnQsICdyZWFkeVN0YXRlJywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gcmVhZHlTdGF0ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0cmFja0VsZW1lbnQsICd0cmFjaycsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRyYWNrO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmVhZHlTdGF0ZSA9IE5PTkU7XG5cbiAgICB0cmFjay5hZGRFdmVudExpc3RlbmVyKCdsb2FkZWRkYXRhJywgZnVuY3Rpb24oKSB7XG4gICAgICByZWFkeVN0YXRlID0gTE9BREVEO1xuXG4gICAgICB0cmFja0VsZW1lbnQudHJpZ2dlcih7XG4gICAgICAgIHR5cGU6ICdsb2FkJyxcbiAgICAgICAgdGFyZ2V0OiB0cmFja0VsZW1lbnRcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGJyb3dzZXIuSVNfSUU4KSB7XG4gICAgICByZXR1cm4gdHJhY2tFbGVtZW50O1xuICAgIH1cbiAgfVxufVxuXG5IVE1MVHJhY2tFbGVtZW50LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgbG9hZDogJ2xvYWQnXG59O1xuXG5IVE1MVHJhY2tFbGVtZW50Lk5PTkUgPSBOT05FO1xuSFRNTFRyYWNrRWxlbWVudC5MT0FESU5HID0gTE9BRElORztcbkhUTUxUcmFja0VsZW1lbnQuTE9BREVEID0gTE9BREVEO1xuSFRNTFRyYWNrRWxlbWVudC5FUlJPUiA9IEVSUk9SO1xuXG5leHBvcnQgZGVmYXVsdCBIVE1MVHJhY2tFbGVtZW50O1xuIl19
},{"../event-target":104,"../tracks/text-track":135,"../utils/browser.js":141,"global/document":7}],130:[function(_dereq_,module,exports){
/**
* @file text-track-cue-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* A List of text track cues as defined in:
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackcuelist
*
* interface TextTrackCueList {
* readonly attribute unsigned long length;
* getter TextTrackCue (unsigned long index);
* TextTrackCue? getCueById(DOMString id);
* };
*
* @param {Array} cues A list of cues to be initialized with
* @class TextTrackCueList
*/
var TextTrackCueList = (function () {
function TextTrackCueList(cues) {
_classCallCheck(this, TextTrackCueList);
var list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in TextTrackCueList.prototype) {
if (prop !== 'constructor') {
list[prop] = TextTrackCueList.prototype[prop];
}
}
}
TextTrackCueList.prototype.setCues_.call(list, cues);
Object.defineProperty(list, 'length', {
get: function get() {
return this.length_;
}
});
if (browser.IS_IE8) {
return list;
}
}
/**
* A setter for cues in this list
*
* @param {Array} cues an array of cues
* @method setCues_
* @private
*/
TextTrackCueList.prototype.setCues_ = function setCues_(cues) {
var oldLength = this.length || 0;
var i = 0;
var l = cues.length;
this.cues_ = cues;
this.length_ = cues.length;
var defineProp = function defineProp(index) {
if (!('' + index in this)) {
Object.defineProperty(this, '' + index, {
get: function get() {
return this.cues_[index];
}
});
}
};
if (oldLength < l) {
i = oldLength;
for (; i < l; i++) {
defineProp.call(this, i);
}
}
};
/**
* Get a cue that is currently in the Cue list by id
*
* @param {String} id
* @method getCueById
* @return {Object} a single cue
*/
TextTrackCueList.prototype.getCueById = function getCueById(id) {
var result = null;
for (var i = 0, l = this.length; i < l; i++) {
var cue = this[i];
if (cue.id === id) {
result = cue;
break;
}
}
return result;
};
return TextTrackCueList;
})();
exports['default'] = TextTrackCueList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay1jdWUtbGlzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OzhCQUd5QixxQkFBcUI7O0lBQWxDLE9BQU87OzhCQUNFLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBZ0JoQyxnQkFBZ0I7QUFDVCxXQURQLGdCQUFnQixDQUNSLElBQUksRUFBRTswQkFEZCxnQkFBZ0I7O0FBRWxCLFFBQUksSUFBSSxHQUFHLElBQUksQ0FBQzs7QUFFaEIsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLFVBQUksR0FBRyw0QkFBUyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7O0FBRXhDLFdBQUssSUFBSSxJQUFJLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFO0FBQzNDLFlBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUMxQixjQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9DO09BQ0Y7S0FDRjs7QUFFRCxvQkFBZ0IsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7O0FBRXJELFVBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxTQUFHLEVBQUEsZUFBRztBQUNKLGVBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztPQUNyQjtLQUNGLENBQUMsQ0FBQzs7QUFFSCxRQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUU7QUFDbEIsYUFBTyxJQUFJLENBQUM7S0FDYjtHQUNGOzs7Ozs7Ozs7O0FBekJHLGtCQUFnQixXQWtDcEIsUUFBUSxHQUFBLGtCQUFDLElBQUksRUFBRTtBQUNiLFFBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO0FBQ2pDLFFBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLFFBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7O0FBRXBCLFFBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2xCLFFBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs7QUFFM0IsUUFBSSxVQUFVLEdBQUcsU0FBYixVQUFVLENBQVksS0FBSyxFQUFFO0FBQy9CLFVBQUksRUFBRSxFQUFFLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQSxBQUFDLEVBQUU7QUFDekIsY0FBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRTtBQUN0QyxhQUFHLEVBQUEsZUFBRztBQUNKLG1CQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7V0FDMUI7U0FDRixDQUFDLENBQUM7T0FDSjtLQUNGLENBQUM7O0FBRUYsUUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO0FBQ2pCLE9BQUMsR0FBRyxTQUFTLENBQUM7O0FBRWQsYUFBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQ2pCLGtCQUFVLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztPQUMxQjtLQUNGO0dBQ0Y7Ozs7Ozs7Ozs7QUEzREcsa0JBQWdCLFdBb0VwQixVQUFVLEdBQUEsb0JBQUMsRUFBRSxFQUFFO0FBQ2IsUUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOztBQUVsQixTQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFVBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFbEIsVUFBSSxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRTtBQUNqQixjQUFNLEdBQUcsR0FBRyxDQUFDO0FBQ2IsY0FBTTtPQUNQO0tBQ0Y7O0FBRUQsV0FBTyxNQUFNLENBQUM7R0FDZjs7U0FqRkcsZ0JBQWdCOzs7cUJBb0ZQLGdCQUFnQiIsImZpbGUiOiJzcmMvanMvdHJhY2tzL3RleHQtdHJhY2stY3VlLWxpc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRleHQtdHJhY2stY3VlLWxpc3QuanNcbiAqL1xuaW1wb3J0ICogYXMgYnJvd3NlciBmcm9tICcuLi91dGlscy9icm93c2VyLmpzJztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuXG4vKipcbiAqIEEgTGlzdCBvZiB0ZXh0IHRyYWNrIGN1ZXMgYXMgZGVmaW5lZCBpbjpcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2tjdWVsaXN0XG4gKlxuICogaW50ZXJmYWNlIFRleHRUcmFja0N1ZUxpc3Qge1xuICogICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7XG4gKiAgIGdldHRlciBUZXh0VHJhY2tDdWUgKHVuc2lnbmVkIGxvbmcgaW5kZXgpO1xuICogICBUZXh0VHJhY2tDdWU/IGdldEN1ZUJ5SWQoRE9NU3RyaW5nIGlkKTtcbiAqIH07XG4gKlxuICogQHBhcmFtIHtBcnJheX0gY3VlcyBBIGxpc3Qgb2YgY3VlcyB0byBiZSBpbml0aWFsaXplZCB3aXRoXG4gKiBAY2xhc3MgVGV4dFRyYWNrQ3VlTGlzdFxuICovXG5cbmNsYXNzIFRleHRUcmFja0N1ZUxpc3Qge1xuICBjb25zdHJ1Y3RvcihjdWVzKSB7XG4gICAgbGV0IGxpc3QgPSB0aGlzO1xuXG4gICAgaWYgKGJyb3dzZXIuSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG5cbiAgICAgIGZvciAobGV0IHByb3AgaW4gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVGV4dFRyYWNrQ3VlTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBUZXh0VHJhY2tDdWVMaXN0LnByb3RvdHlwZS5zZXRDdWVzXy5jYWxsKGxpc3QsIGN1ZXMpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpc3QsICdsZW5ndGgnLCB7XG4gICAgICBnZXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxlbmd0aF87XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYnJvd3Nlci5JU19JRTgpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBIHNldHRlciBmb3IgY3VlcyBpbiB0aGlzIGxpc3RcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gY3VlcyBhbiBhcnJheSBvZiBjdWVzXG4gICAqIEBtZXRob2Qgc2V0Q3Vlc19cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNldEN1ZXNfKGN1ZXMpIHtcbiAgICBsZXQgb2xkTGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMDtcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGwgPSBjdWVzLmxlbmd0aDtcblxuICAgIHRoaXMuY3Vlc18gPSBjdWVzO1xuICAgIHRoaXMubGVuZ3RoXyA9IGN1ZXMubGVuZ3RoO1xuXG4gICAgbGV0IGRlZmluZVByb3AgPSBmdW5jdGlvbihpbmRleCkge1xuICAgICAgaWYgKCEoJycgKyBpbmRleCBpbiB0aGlzKSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJycgKyBpbmRleCwge1xuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1ZXNfW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAob2xkTGVuZ3RoIDwgbCkge1xuICAgICAgaSA9IG9sZExlbmd0aDtcblxuICAgICAgZm9yICg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgZGVmaW5lUHJvcC5jYWxsKHRoaXMsIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBjdWUgdGhhdCBpcyBjdXJyZW50bHkgaW4gdGhlIEN1ZSBsaXN0IGJ5IGlkXG4gICAqXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBpZFxuICAgKiBAbWV0aG9kIGdldEN1ZUJ5SWRcbiAgICogQHJldHVybiB7T2JqZWN0fSBhIHNpbmdsZSBjdWVcbiAgICovXG4gIGdldEN1ZUJ5SWQoaWQpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxldCBjdWUgPSB0aGlzW2ldO1xuXG4gICAgICBpZiAoY3VlLmlkID09PSBpZCkge1xuICAgICAgICByZXN1bHQgPSBjdWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVGV4dFRyYWNrQ3VlTGlzdDtcbiJdfQ==
},{"../utils/browser.js":141,"global/document":7}],131:[function(_dereq_,module,exports){
/**
* @file text-track-display.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _menuMenuJs = _dereq_('../menu/menu.js');
var _menuMenuJs2 = _interopRequireDefault(_menuMenuJs);
var _menuMenuItemJs = _dereq_('../menu/menu-item.js');
var _menuMenuItemJs2 = _interopRequireDefault(_menuMenuItemJs);
var _menuMenuButtonJs = _dereq_('../menu/menu-button.js');
var _menuMenuButtonJs2 = _interopRequireDefault(_menuMenuButtonJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var darkGray = '#222';
var lightGray = '#ccc';
var fontMap = {
monospace: 'monospace',
sansSerif: 'sans-serif',
serif: 'serif',
monospaceSansSerif: '"Andale Mono", "Lucida Console", monospace',
monospaceSerif: '"Courier New", monospace',
proportionalSansSerif: 'sans-serif',
proportionalSerif: 'serif',
casual: '"Comic Sans MS", Impact, fantasy',
script: '"Monotype Corsiva", cursive',
smallcaps: '"Andale Mono", "Lucida Console", monospace, sans-serif'
};
/**
* The component for displaying text track cues
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @param {Function=} ready Ready callback function
* @extends Component
* @class TextTrackDisplay
*/
var TextTrackDisplay = (function (_Component) {
_inherits(TextTrackDisplay, _Component);
function TextTrackDisplay(player, options, ready) {
_classCallCheck(this, TextTrackDisplay);
_Component.call(this, player, options, ready);
player.on('loadstart', Fn.bind(this, this.toggleDisplay));
player.on('texttrackchange', Fn.bind(this, this.updateDisplay));
// This used to be called during player init, but was causing an error
// if a track should show by default and the display hadn't loaded yet.
// Should probably be moved to an external track loader when we support
// tracks that don't need a display.
player.ready(Fn.bind(this, function () {
if (player.tech_ && player.tech_['featuresNativeTextTracks']) {
this.hide();
return;
}
player.on('fullscreenchange', Fn.bind(this, this.updateDisplay));
var tracks = this.options_.playerOptions['tracks'] || [];
for (var i = 0; i < tracks.length; i++) {
var track = tracks[i];
this.player_.addRemoteTextTrack(track);
}
var modes = { 'captions': 1, 'subtitles': 1 };
var trackList = this.player_.textTracks();
var firstDesc = undefined;
var firstCaptions = undefined;
if (trackList) {
for (var i = 0; i < trackList.length; i++) {
var track = trackList[i];
if (track['default']) {
if (track.kind === 'descriptions' && !firstDesc) {
firstDesc = track;
} else if (track.kind in modes && !firstCaptions) {
firstCaptions = track;
}
}
}
// We want to show the first default track but captions and subtitles
// take precedence over descriptions.
// So, display the first default captions or subtitles track
// and otherwise the first default descriptions track.
if (firstCaptions) {
firstCaptions.mode = 'showing';
} else if (firstDesc) {
firstDesc.mode = 'showing';
}
}
}));
}
/**
* Add cue HTML to display
*
* @param {Number} color Hex number for color, like #f0e
* @param {Number} opacity Value for opacity,0.0 - 1.0
* @return {RGBAColor} In the form 'rgba(255, 0, 0, 0.3)'
* @method constructColor
*/
/**
* Toggle display texttracks
*
* @method toggleDisplay
*/
TextTrackDisplay.prototype.toggleDisplay = function toggleDisplay() {
if (this.player_.tech_ && this.player_.tech_['featuresNativeTextTracks']) {
this.hide();
} else {
this.show();
}
};
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TextTrackDisplay.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-text-track-display'
}, {
'aria-live': 'assertive',
'aria-atomic': 'true'
});
};
/**
* Clear display texttracks
*
* @method clearDisplay
*/
TextTrackDisplay.prototype.clearDisplay = function clearDisplay() {
if (typeof _globalWindow2['default']['WebVTT'] === 'function') {
_globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], [], this.el_);
}
};
/**
* Update display texttracks
*
* @method updateDisplay
*/
TextTrackDisplay.prototype.updateDisplay = function updateDisplay() {
var tracks = this.player_.textTracks();
this.clearDisplay();
if (!tracks) {
return;
}
// Track display prioritization model: if multiple tracks are 'showing',
// display the first 'subtitles' or 'captions' track which is 'showing',
// otherwise display the first 'descriptions' track which is 'showing'
var descriptionsTrack = null;
var captionsSubtitlesTrack = null;
var i = tracks.length;
while (i--) {
var track = tracks[i];
if (track['mode'] === 'showing') {
if (track['kind'] === 'descriptions') {
descriptionsTrack = track;
} else {
captionsSubtitlesTrack = track;
}
}
}
if (captionsSubtitlesTrack) {
this.updateForTrack(captionsSubtitlesTrack);
} else if (descriptionsTrack) {
this.updateForTrack(descriptionsTrack);
}
};
/**
* Add texttrack to texttrack list
*
* @param {TextTrackObject} track Texttrack object to be added to list
* @method updateForTrack
*/
TextTrackDisplay.prototype.updateForTrack = function updateForTrack(track) {
if (typeof _globalWindow2['default']['WebVTT'] !== 'function' || !track['activeCues']) {
return;
}
var overrides = this.player_['textTrackSettings'].getValues();
var cues = [];
for (var _i = 0; _i < track['activeCues'].length; _i++) {
cues.push(track['activeCues'][_i]);
}
_globalWindow2['default']['WebVTT']['processCues'](_globalWindow2['default'], cues, this.el_);
var i = cues.length;
while (i--) {
var cue = cues[i];
if (!cue) {
continue;
}
var cueDiv = cue.displayState;
if (overrides.color) {
cueDiv.firstChild.style.color = overrides.color;
}
if (overrides.textOpacity) {
tryUpdateStyle(cueDiv.firstChild, 'color', constructColor(overrides.color || '#fff', overrides.textOpacity));
}
if (overrides.backgroundColor) {
cueDiv.firstChild.style.backgroundColor = overrides.backgroundColor;
}
if (overrides.backgroundOpacity) {
tryUpdateStyle(cueDiv.firstChild, 'backgroundColor', constructColor(overrides.backgroundColor || '#000', overrides.backgroundOpacity));
}
if (overrides.windowColor) {
if (overrides.windowOpacity) {
tryUpdateStyle(cueDiv, 'backgroundColor', constructColor(overrides.windowColor, overrides.windowOpacity));
} else {
cueDiv.style.backgroundColor = overrides.windowColor;
}
}
if (overrides.edgeStyle) {
if (overrides.edgeStyle === 'dropshadow') {
cueDiv.firstChild.style.textShadow = '2px 2px 3px ' + darkGray + ', 2px 2px 4px ' + darkGray + ', 2px 2px 5px ' + darkGray;
} else if (overrides.edgeStyle === 'raised') {
cueDiv.firstChild.style.textShadow = '1px 1px ' + darkGray + ', 2px 2px ' + darkGray + ', 3px 3px ' + darkGray;
} else if (overrides.edgeStyle === 'depressed') {
cueDiv.firstChild.style.textShadow = '1px 1px ' + lightGray + ', 0 1px ' + lightGray + ', -1px -1px ' + darkGray + ', 0 -1px ' + darkGray;
} else if (overrides.edgeStyle === 'uniform') {
cueDiv.firstChild.style.textShadow = '0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray + ', 0 0 4px ' + darkGray;
}
}
if (overrides.fontPercent && overrides.fontPercent !== 1) {
var fontSize = _globalWindow2['default'].parseFloat(cueDiv.style.fontSize);
cueDiv.style.fontSize = fontSize * overrides.fontPercent + 'px';
cueDiv.style.height = 'auto';
cueDiv.style.top = 'auto';
cueDiv.style.bottom = '2px';
}
if (overrides.fontFamily && overrides.fontFamily !== 'default') {
if (overrides.fontFamily === 'small-caps') {
cueDiv.firstChild.style.fontVariant = 'small-caps';
} else {
cueDiv.firstChild.style.fontFamily = fontMap[overrides.fontFamily];
}
}
}
};
return TextTrackDisplay;
})(_component2['default']);
function constructColor(color, opacity) {
return 'rgba(' +
// color looks like "#f0e"
parseInt(color[1] + color[1], 16) + ',' + parseInt(color[2] + color[2], 16) + ',' + parseInt(color[3] + color[3], 16) + ',' + opacity + ')';
}
/**
* Try to update style
* Some style changes will throw an error, particularly in IE8. Those should be noops.
*
* @param {Element} el The element to be styles
* @param {CSSProperty} style The CSS property to be styled
* @param {CSSStyle} rule The actual style to be applied to the property
* @method tryUpdateStyle
*/
function tryUpdateStyle(el, style, rule) {
//
try {
el.style[style] = rule;
} catch (e) {}
}
_component2['default'].registerComponent('TextTrackDisplay', TextTrackDisplay);
exports['default'] = TextTrackDisplay;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay1kaXNwbGF5LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozt5QkFHc0IsY0FBYzs7OzswQkFDbkIsaUJBQWlCOzs7OzhCQUNiLHNCQUFzQjs7OztnQ0FDcEIsd0JBQXdCOzs7O3lCQUMzQixnQkFBZ0I7O0lBQXhCLEVBQUU7OzhCQUNPLGlCQUFpQjs7Ozs0QkFDbkIsZUFBZTs7OztBQUVsQyxJQUFNLFFBQVEsR0FBRyxNQUFNLENBQUM7QUFDeEIsSUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO0FBQ3pCLElBQU0sT0FBTyxHQUFHO0FBQ2QsV0FBUyxFQUFjLFdBQVc7QUFDbEMsV0FBUyxFQUFjLFlBQVk7QUFDbkMsT0FBSyxFQUFrQixPQUFPO0FBQzlCLG9CQUFrQixFQUFLLDRDQUE0QztBQUNuRSxnQkFBYyxFQUFTLDBCQUEwQjtBQUNqRCx1QkFBcUIsRUFBRSxZQUFZO0FBQ25DLG1CQUFpQixFQUFNLE9BQU87QUFDOUIsUUFBTSxFQUFpQixrQ0FBa0M7QUFDekQsUUFBTSxFQUFpQiw2QkFBNkI7QUFDcEQsV0FBUyxFQUFjLHdEQUF3RDtDQUNoRixDQUFDOzs7Ozs7Ozs7Ozs7SUFXSSxnQkFBZ0I7WUFBaEIsZ0JBQWdCOztBQUVULFdBRlAsZ0JBQWdCLENBRVIsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUM7MEJBRi9CLGdCQUFnQjs7QUFHbEIsMEJBQU0sTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzs7QUFFOUIsVUFBTSxDQUFDLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7QUFDMUQsVUFBTSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs7Ozs7O0FB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LEdBQUcsR0FBRyxHQUN2QyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQ3ZDLE9BQU8sR0FBRyxHQUFHLENBQUM7Q0FDakI7Ozs7Ozs7Ozs7O0FBV0QsU0FBUyxjQUFjLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7O0FBRXZDLE1BQUk7QUFDRixNQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztHQUN4QixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUU7Q0FDZjs7QUFFRCx1QkFBVSxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO3FCQUNuRCxnQkFBZ0IiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90ZXh0LXRyYWNrLWRpc3BsYXkuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRleHQtdHJhY2stZGlzcGxheS5qc1xuICovXG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4uL2NvbXBvbmVudCc7XG5pbXBvcnQgTWVudSBmcm9tICcuLi9tZW51L21lbnUuanMnO1xuaW1wb3J0IE1lbnVJdGVtIGZyb20gJy4uL21lbnUvbWVudS1pdGVtLmpzJztcbmltcG9ydCBNZW51QnV0dG9uIGZyb20gJy4uL21lbnUvbWVudS1idXR0b24uanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG5jb25zdCBkYXJrR3JheSA9ICcjMjIyJztcbmNvbnN0IGxpZ2h0R3JheSA9ICcjY2NjJztcbmNvbnN0IGZvbnRNYXAgPSB7XG4gIG1vbm9zcGFjZTogICAgICAgICAgICAgJ21vbm9zcGFjZScsXG4gIHNhbnNTZXJpZjogICAgICAgICAgICAgJ3NhbnMtc2VyaWYnLFxuICBzZXJpZjogICAgICAgICAgICAgICAgICdzZXJpZicsXG4gIG1vbm9zcGFjZVNhbnNTZXJpZjogICAgJ1wiQW5kYWxlIE1vbm9cIiwgXCJMdWNpZGEgQ29uc29sZVwiLCBtb25vc3BhY2UnLFxuICBtb25vc3BhY2VTZXJpZjogICAgICAgICdcIkNvdXJpZXIgTmV3XCIsIG1vbm9zcGFjZScsXG4gIHByb3BvcnRpb25hbFNhbnNTZXJpZjogJ3NhbnMtc2VyaWYnLFxuICBwcm9wb3J0aW9uYWxTZXJpZjogICAgICdzZXJpZicsXG4gIGNhc3VhbDogICAgICAgICAgICAgICAgJ1wiQ29taWMgU2FucyBNU1wiLCBJbXBhY3QsIGZhbnRhc3knLFxuICBzY3JpcHQ6ICAgICAgICAgICAgICAgICdcIk1vbm90eXBlIENvcnNpdmFcIiwgY3Vyc2l2ZScsXG4gIHNtYWxsY2FwczogICAgICAgICAgICAgJ1wiQW5kYWxlIE1vbm9cIiwgXCJMdWNpZGEgQ29uc29sZVwiLCBtb25vc3BhY2UsIHNhbnMtc2VyaWYnXG59O1xuXG4vKipcbiAqIFRoZSBjb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgdGV4dCB0cmFjayBjdWVzXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBsYXllciAgTWFpbiBQbGF5ZXJcbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPYmplY3Qgb2Ygb3B0aW9uIG5hbWVzIGFuZCB2YWx1ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb249fSByZWFkeSAgICBSZWFkeSBjYWxsYmFjayBmdW5jdGlvblxuICogQGV4dGVuZHMgQ29tcG9uZW50XG4gKiBAY2xhc3MgVGV4dFRyYWNrRGlzcGxheVxuICovXG5jbGFzcyBUZXh0VHJhY2tEaXNwbGF5IGV4dGVuZHMgQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KXtcbiAgICBzdXBlcihwbGF5ZXIsIG9wdGlvbnMsIHJlYWR5KTtcblxuICAgIHBsYXllci5vbignbG9hZHN0YXJ0JywgRm4uYmluZCh0aGlzLCB0aGlzLnRvZ2dsZURpc3BsYXkpKTtcbiAgICBwbGF5ZXIub24oJ3RleHR0cmFja2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG5cbiAgICAvLyBUaGlzIHVzZWQgdG8gYmUgY2FsbGVkIGR1cmluZyBwbGF5ZXIgaW5pdCwgYnV0IHdhcyBjYXVzaW5nIGFuIGVycm9yXG4gICAgLy8gaWYgYSB0cmFjayBzaG91bGQgc2hvdyBieSBkZWZhdWx0IGFuZCB0aGUgZGlzcGxheSBoYWRuJ3QgbG9hZGVkIHlldC5cbiAgICAvLyBTaG91bGQgcHJvYmFibHkgYmUgbW92ZWQgdG8gYW4gZXh0ZXJuYWwgdHJhY2sgbG9hZGVyIHdoZW4gd2Ugc3VwcG9ydFxuICAgIC8vIHRyYWNrcyB0aGF0IGRvbid0IG5lZWQgYSBkaXNwbGF5LlxuICAgIHBsYXllci5yZWFkeShGbi5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKHBsYXllci50ZWNoXyAmJiBwbGF5ZXIudGVjaF9bJ2ZlYXR1cmVzTmF0aXZlVGV4dFRyYWNrcyddKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBsYXllci5vbignZnVsbHNjcmVlbmNoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG5cbiAgICAgIGxldCB0cmFja3MgPSB0aGlzLm9wdGlvbnNfLnBsYXllck9wdGlvbnNbJ3RyYWNrcyddIHx8IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHRyYWNrID0gdHJhY2tzW2ldO1xuICAgICAgICB0aGlzLnBsYXllcl8uYWRkUmVtb3RlVGV4dFRyYWNrKHRyYWNrKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1vZGVzID0geydjYXB0aW9ucyc6IDEsICdzdWJ0aXRsZXMnOiAxfTtcbiAgICAgIGxldCB0cmFja0xpc3QgPSB0aGlzLnBsYXllcl8udGV4dFRyYWNrcygpO1xuICAgICAgbGV0IGZpcnN0RGVzYztcbiAgICAgIGxldCBmaXJzdENhcHRpb25zO1xuXG4gICAgICBpZiAodHJhY2tMaXN0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHJhY2tMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGV0IHRyYWNrID0gdHJhY2tMaXN0W2ldO1xuICAgICAgICAgIGlmICh0cmFjay5kZWZhdWx0KSB7XG4gICAgICAgICAgICBpZiAodHJhY2sua2luZCA9PT0gJ2Rlc2NyaXB0aW9ucycgJiYgIWZpcnN0RGVzYykge1xuICAgICAgICAgICAgICBmaXJzdERlc2MgPSB0cmFjaztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2sua2luZCBpbiBtb2RlcyAmJiAhZmlyc3RDYXB0aW9ucykge1xuICAgICAgICAgICAgICBmaXJzdENhcHRpb25zID0gdHJhY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2Ugd2FudCB0byBzaG93IHRoZSBmaXJzdCBkZWZhdWx0IHRyYWNrIGJ1dCBjYXB0aW9ucyBhbmQgc3VidGl0bGVzXG4gICAgICAgIC8vIHRha2UgcHJlY2VkZW5jZSBvdmVyIGRlc2NyaXB0aW9ucy5cbiAgICAgICAgLy8gU28sIGRpc3BsYXkgdGhlIGZpcnN0IGRlZmF1bHQgY2FwdGlvbnMgb3Igc3VidGl0bGVzIHRyYWNrXG4gICAgICAgIC8vIGFuZCBvdGhlcndpc2UgdGhlIGZpcnN0IGRlZmF1bHQgZGVzY3JpcHRpb25zIHRyYWNrLlxuICAgICAgICBpZiAoZmlyc3RDYXB0aW9ucykge1xuICAgICAgICAgIGZpcnN0Q2FwdGlvbnMubW9kZSA9ICdzaG93aW5nJztcbiAgICAgICAgfSBlbHNlIGlmIChmaXJzdERlc2MpIHtcbiAgICAgICAgICBmaXJzdERlc2MubW9kZSA9ICdzaG93aW5nJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgZGlzcGxheSB0ZXh0dHJhY2tzXG4gICAqXG4gICAqIEBtZXRob2QgdG9nZ2xlRGlzcGxheVxuICAgKi9cbiAgdG9nZ2xlRGlzcGxheSgpIHtcbiAgICBpZiAodGhpcy5wbGF5ZXJfLnRlY2hfICYmIHRoaXMucGxheWVyXy50ZWNoX1snZmVhdHVyZXNOYXRpdmVUZXh0VHJhY2tzJ10pIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNob3coKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBjb21wb25lbnQncyBET00gZWxlbWVudFxuICAgKlxuICAgKiBAcmV0dXJuIHtFbGVtZW50fVxuICAgKiBAbWV0aG9kIGNyZWF0ZUVsXG4gICAqL1xuICBjcmVhdGVFbCgpIHtcbiAgICByZXR1cm4gc3VwZXIuY3JlYXRlRWwoJ2RpdicsIHtcbiAgICAgIGNsYXNzTmFtZTogJ3Zqcy10ZXh0LXRyYWNrLWRpc3BsYXknXG4gICAgfSwge1xuICAgICAgJ2FyaWEtbGl2ZSc6ICdhc3NlcnRpdmUnLFxuICAgICAgJ2FyaWEtYXRvbWljJzogJ3RydWUnXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgZGlzcGxheSB0ZXh0dHJhY2tzXG4gICAqXG4gICAqIEBtZXRob2QgY2xlYXJEaXNwbGF5XG4gICAqL1xuICBjbGVhckRpc3BsYXkoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3dbJ1dlYlZUVCddID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB3aW5kb3dbJ1dlYlZUVCddWydwcm9jZXNzQ3VlcyddKHdpbmRvdywgW10sIHRoaXMuZWxfKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGRpc3BsYXkgdGV4dHRyYWNrc1xuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZURpc3BsYXlcbiAgICovXG4gIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgdmFyIHRyYWNrcyA9IHRoaXMucGxheWVyXy50ZXh0VHJhY2tzKCk7XG5cbiAgICB0aGlzLmNsZWFyRGlzcGxheSgpO1xuXG4gICAgaWYgKCF0cmFja3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUcmFjayBkaXNwbGF5IHByaW9yaXRpemF0aW9uIG1vZGVsOiBpZiBtdWx0aXBsZSB0cmFja3MgYXJlICdzaG93aW5nJyxcbiAgICAvLyAgZGlzcGxheSB0aGUgZmlyc3QgJ3N1YnRpdGxlcycgb3IgJ2NhcHRpb25zJyB0cmFjayB3aGljaCBpcyAnc2hvd2luZycsXG4gICAgLy8gIG90aGVyd2lzZSBkaXNwbGF5IHRoZSBmaXJzdCAnZGVzY3JpcHRpb25zJyB0cmFjayB3aGljaCBpcyAnc2hvd2luZydcblxuICAgIGxldCBkZXNjcmlwdGlvbnNUcmFjayA9IG51bGw7XG4gICAgbGV0IGNhcHRpb25zU3VidGl0bGVzVHJhY2sgPSBudWxsO1xuXG4gICAgbGV0IGkgPSB0cmFja3MubGVuZ3RoO1xuICAgIHdoaWxlIChpLS0pIHtcbiAgICAgIGxldCB0cmFjayA9IHRyYWNrc1tpXTtcbiAgICAgIGlmICh0cmFja1snbW9kZSddID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgaWYgKHRyYWNrWydraW5kJ10gPT09ICdkZXNjcmlwdGlvbnMnKSB7XG4gICAgICAgICAgZGVzY3JpcHRpb25zVHJhY2sgPSB0cmFjaztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYXB0aW9uc1N1YnRpdGxlc1RyYWNrID0gdHJhY2s7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2FwdGlvbnNTdWJ0aXRsZXNUcmFjaykge1xuICAgICAgdGhpcy51cGRhdGVGb3JUcmFjayhjYXB0aW9uc1N1YnRpdGxlc1RyYWNrKTtcbiAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uc1RyYWNrKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZvclRyYWNrKGRlc2NyaXB0aW9uc1RyYWNrKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIHRleHR0cmFjayB0byB0ZXh0dHJhY2sgbGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge1RleHRUcmFja09iamVjdH0gdHJhY2sgVGV4dHRyYWNrIG9iamVjdCB0byBiZSBhZGRlZCB0byBsaXN0XG4gICAqIEBtZXRob2QgdXBkYXRlRm9yVHJhY2tcbiAgICovXG4gIHVwZGF0ZUZvclRyYWNrKHRyYWNrKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3dbJ1dlYlZUVCddICE9PSAnZnVuY3Rpb24nIHx8ICF0cmFja1snYWN0aXZlQ3VlcyddKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IG92ZXJyaWRlcyA9IHRoaXMucGxheWVyX1sndGV4dFRyYWNrU2V0dGluZ3MnXS5nZXRWYWx1ZXMoKTtcblxuICAgIGxldCBjdWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFja1snYWN0aXZlQ3VlcyddLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjdWVzLnB1c2godHJhY2tbJ2FjdGl2ZUN1ZXMnXVtpXSk7XG4gICAgfVxuXG4gICAgd2luZG93WydXZWJWVFQnXVsncHJvY2Vzc0N1ZXMnXSh3aW5kb3csIGN1ZXMsIHRoaXMuZWxfKTtcblxuICAgIGxldCBpID0gY3Vlcy5sZW5ndGg7XG4gICAgd2hpbGUgKGktLSkge1xuICAgICAgbGV0IGN1ZSA9IGN1ZXNbaV07XG4gICAgICBpZiAoIWN1ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgbGV0IGN1ZURpdiA9IGN1ZS5kaXNwbGF5U3RhdGU7XG4gICAgICBpZiAob3ZlcnJpZGVzLmNvbG9yKSB7XG4gICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmNvbG9yID0gb3ZlcnJpZGVzLmNvbG9yO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy50ZXh0T3BhY2l0eSkge1xuICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2NvbG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0Q29sb3Iob3ZlcnJpZGVzLmNvbG9yIHx8ICcjZmZmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGVzLnRleHRPcGFjaXR5KSk7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmJhY2tncm91bmRDb2xvcikge1xuICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBvdmVycmlkZXMuYmFja2dyb3VuZENvbG9yO1xuICAgICAgfVxuICAgICAgaWYgKG92ZXJyaWRlcy5iYWNrZ3JvdW5kT3BhY2l0eSkge1xuICAgICAgICB0cnlVcGRhdGVTdHlsZShjdWVEaXYuZmlyc3RDaGlsZCxcbiAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2tncm91bmRDb2xvcicsXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdENvbG9yKG92ZXJyaWRlcy5iYWNrZ3JvdW5kQ29sb3IgfHwgJyMwMDAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVycmlkZXMuYmFja2dyb3VuZE9wYWNpdHkpKTtcbiAgICAgIH1cbiAgICAgIGlmIChvdmVycmlkZXMud2luZG93Q29sb3IpIHtcbiAgICAgICAgaWYgKG92ZXJyaWRlcy53aW5kb3dPcGFjaXR5KSB7XG4gICAgICAgICAgdHJ5VXBkYXRlU3R5bGUoY3VlRGl2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICdiYWNrZ3JvdW5kQ29sb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdENvbG9yKG92ZXJyaWRlcy53aW5kb3dDb2xvciwgb3ZlcnJpZGVzLndpbmRvd09wYWNpdHkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjdWVEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gb3ZlcnJpZGVzLndpbmRvd0NvbG9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmVkZ2VTdHlsZSkge1xuICAgICAgICBpZiAob3ZlcnJpZGVzLmVkZ2VTdHlsZSA9PT0gJ2Ryb3BzaGFkb3cnKSB7XG4gICAgICAgICAgY3VlRGl2LmZpcnN0Q2hpbGQuc3R5bGUudGV4dFNoYWRvdyA9IGAycHggMnB4IDNweCAke2RhcmtHcmF5fSwgMnB4IDJweCA0cHggJHtkYXJrR3JheX0sIDJweCAycHggNXB4ICR7ZGFya0dyYXl9YDtcbiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAncmFpc2VkJykge1xuICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLnRleHRTaGFkb3cgPSBgMXB4IDFweCAke2RhcmtHcmF5fSwgMnB4IDJweCAke2RhcmtHcmF5fSwgM3B4IDNweCAke2RhcmtHcmF5fWA7XG4gICAgICAgIH0gZWxzZSBpZiAob3ZlcnJpZGVzLmVkZ2VTdHlsZSA9PT0gJ2RlcHJlc3NlZCcpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gYDFweCAxcHggJHtsaWdodEdyYXl9LCAwIDFweCAke2xpZ2h0R3JheX0sIC0xcHggLTFweCAke2RhcmtHcmF5fSwgMCAtMXB4ICR7ZGFya0dyYXl9YDtcbiAgICAgICAgfSBlbHNlIGlmIChvdmVycmlkZXMuZWRnZVN0eWxlID09PSAndW5pZm9ybScpIHtcbiAgICAgICAgICBjdWVEaXYuZmlyc3RDaGlsZC5zdHlsZS50ZXh0U2hhZG93ID0gYDAgMCA0cHggJHtkYXJrR3JheX0sIDAgMCA0cHggJHtkYXJrR3JheX0sIDAgMCA0cHggJHtkYXJrR3JheX0sIDAgMCA0cHggJHtkYXJrR3JheX1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmZvbnRQZXJjZW50ICYmIG92ZXJyaWRlcy5mb250UGVyY2VudCAhPT0gMSkge1xuICAgICAgICBjb25zdCBmb250U2l6ZSA9IHdpbmRvdy5wYXJzZUZsb2F0KGN1ZURpdi5zdHlsZS5mb250U2l6ZSk7XG4gICAgICAgIGN1ZURpdi5zdHlsZS5mb250U2l6ZSA9IChmb250U2l6ZSAqIG92ZXJyaWRlcy5mb250UGVyY2VudCkgKyAncHgnO1xuICAgICAgICBjdWVEaXYuc3R5bGUuaGVpZ2h0ID0gJ2F1dG8nO1xuICAgICAgICBjdWVEaXYuc3R5bGUudG9wID0gJ2F1dG8nO1xuICAgICAgICBjdWVEaXYuc3R5bGUuYm90dG9tID0gJzJweCc7XG4gICAgICB9XG4gICAgICBpZiAob3ZlcnJpZGVzLmZvbnRGYW1pbHkgJiYgb3ZlcnJpZGVzLmZvbnRGYW1pbHkgIT09ICdkZWZhdWx0Jykge1xuICAgICAgICBpZiAob3ZlcnJpZGVzLmZvbnRGYW1pbHkgPT09ICdzbWFsbC1jYXBzJykge1xuICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmZvbnRWYXJpYW50ID0gJ3NtYWxsLWNhcHMnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGN1ZURpdi5maXJzdENoaWxkLnN0eWxlLmZvbnRGYW1pbHkgPSBmb250TWFwW292ZXJyaWRlcy5mb250RmFtaWx5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG59XG5cbi8qKlxuKiBBZGQgY3VlIEhUTUwgdG8gZGlzcGxheVxuKlxuKiBAcGFyYW0ge051bWJlcn0gY29sb3IgSGV4IG51bWJlciBmb3IgY29sb3IsIGxpa2UgI2YwZVxuKiBAcGFyYW0ge051bWJlcn0gb3BhY2l0eSBWYWx1ZSBmb3Igb3BhY2l0eSwwLjAgLSAxLjBcbiogQHJldHVybiB7UkdCQUNvbG9yfSBJbiB0aGUgZm9ybSAncmdiYSgyNTUsIDAsIDAsIDAuMyknXG4qIEBtZXRob2QgY29uc3RydWN0Q29sb3JcbiovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcihjb2xvciwgb3BhY2l0eSkge1xuICByZXR1cm4gJ3JnYmEoJyArXG4gICAgLy8gY29sb3IgbG9va3MgbGlrZSBcIiNmMGVcIlxuICAgIHBhcnNlSW50KGNvbG9yWzFdICsgY29sb3JbMV0sIDE2KSArICcsJyArXG4gICAgcGFyc2VJbnQoY29sb3JbMl0gKyBjb2xvclsyXSwgMTYpICsgJywnICtcbiAgICBwYXJzZUludChjb2xvclszXSArIGNvbG9yWzNdLCAxNikgKyAnLCcgK1xuICAgIG9wYWNpdHkgKyAnKSc7XG59XG5cbi8qKlxuICogVHJ5IHRvIHVwZGF0ZSBzdHlsZVxuICogU29tZSBzdHlsZSBjaGFuZ2VzIHdpbGwgdGhyb3cgYW4gZXJyb3IsIHBhcnRpY3VsYXJseSBpbiBJRTguIFRob3NlIHNob3VsZCBiZSBub29wcy5cbiAqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHRvIGJlIHN0eWxlc1xuICogQHBhcmFtIHtDU1NQcm9wZXJ0eX0gc3R5bGUgVGhlIENTUyBwcm9wZXJ0eSB0byBiZSBzdHlsZWRcbiAqIEBwYXJhbSB7Q1NTU3R5bGV9IHJ1bGUgVGhlIGFjdHVhbCBzdHlsZSB0byBiZSBhcHBsaWVkIHRvIHRoZSBwcm9wZXJ0eVxuICogQG1ldGhvZCB0cnlVcGRhdGVTdHlsZVxuICovXG5mdW5jdGlvbiB0cnlVcGRhdGVTdHlsZShlbCwgc3R5bGUsIHJ1bGUpIHtcbiAgLy9cbiAgdHJ5IHtcbiAgICBlbC5zdHlsZVtzdHlsZV0gPSBydWxlO1xuICB9IGNhdGNoIChlKSB7fVxufVxuXG5Db21wb25lbnQucmVnaXN0ZXJDb21wb25lbnQoJ1RleHRUcmFja0Rpc3BsYXknLCBUZXh0VHJhY2tEaXNwbGF5KTtcbmV4cG9ydCBkZWZhdWx0IFRleHRUcmFja0Rpc3BsYXk7XG4iXX0=
},{"../component":66,"../menu/menu-button.js":109,"../menu/menu-item.js":110,"../menu/menu.js":111,"../utils/fn.js":146,"global/document":7,"global/window":8}],132:[function(_dereq_,module,exports){
/**
* Utilities for capturing text track state and re-creating tracks
* based on a capture.
*
* @file text-track-list-converter.js
*/
/**
* Examine a single text track and return a JSON-compatible javascript
* object that represents the text track's state.
* @param track {TextTrackObject} the text track to query
* @return {Object} a serializable javascript representation of the
* @private
*/
'use strict';
exports.__esModule = true;
var trackToJson_ = function trackToJson_(track) {
var ret = ['kind', 'label', 'language', 'id', 'inBandMetadataTrackDispatchType', 'mode', 'src'].reduce(function (acc, prop, i) {
if (track[prop]) {
acc[prop] = track[prop];
}
return acc;
}, {
cues: track.cues && Array.prototype.map.call(track.cues, function (cue) {
return {
startTime: cue.startTime,
endTime: cue.endTime,
text: cue.text,
id: cue.id
};
})
});
return ret;
};
/**
* Examine a tech and return a JSON-compatible javascript array that
* represents the state of all text tracks currently configured. The
* return array is compatible with `jsonToTextTracks`.
* @param tech {tech} the tech object to query
* @return {Array} a serializable javascript representation of the
* @function textTracksToJson
*/
var textTracksToJson = function textTracksToJson(tech) {
var trackEls = tech.$$('track');
var trackObjs = Array.prototype.map.call(trackEls, function (t) {
return t.track;
});
var tracks = Array.prototype.map.call(trackEls, function (trackEl) {
var json = trackToJson_(trackEl.track);
if (trackEl.src) {
json.src = trackEl.src;
}
return json;
});
return tracks.concat(Array.prototype.filter.call(tech.textTracks(), function (track) {
return trackObjs.indexOf(track) === -1;
}).map(trackToJson_));
};
/**
* Creates a set of remote text tracks on a tech based on an array of
* javascript text track representations.
* @param json {Array} an array of text track representation objects,
* like those that would be produced by `textTracksToJson`
* @param tech {tech} the tech to create text tracks on
* @function jsonToTextTracks
*/
var jsonToTextTracks = function jsonToTextTracks(json, tech) {
json.forEach(function (track) {
var addedTrack = tech.addRemoteTextTrack(track).track;
if (!track.src && track.cues) {
track.cues.forEach(function (cue) {
return addedTrack.addCue(cue);
});
}
});
return tech.textTracks();
};
exports['default'] = { textTracksToJson: textTracksToJson, jsonToTextTracks: jsonToTextTracks, trackToJson_: trackToJson_ };
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay1saXN0LWNvbnZlcnRlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLElBQUksWUFBWSxHQUFHLFNBQWYsWUFBWSxDQUFZLEtBQUssRUFBRTtBQUNqQyxNQUFJLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksRUFDakMsaUNBQWlDLEVBQ2pDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBSztBQUNqRCxRQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRTtBQUNmLFNBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDekI7O0FBRUQsV0FBTyxHQUFHLENBQUM7R0FDWixFQUFFO0FBQ0QsUUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBUyxHQUFHLEVBQUU7QUFDckUsYUFBTztBQUNMLGlCQUFTLEVBQUUsR0FBRyxDQUFDLFNBQVM7QUFDeEIsZUFBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPO0FBQ3BCLFlBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtBQUNkLFVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRTtPQUNYLENBQUM7S0FDSCxDQUFDO0dBQ0gsQ0FBQyxDQUFDOztBQUVILFNBQU8sR0FBRyxDQUFDO0NBQ1osQ0FBQzs7Ozs7Ozs7OztBQVVGLElBQUksZ0JBQWdCLEdBQUcsU0FBbkIsZ0JBQWdCLENBQVksSUFBSSxFQUFFOztBQUVwQyxNQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUVoQyxNQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQUMsQ0FBQztXQUFLLENBQUMsQ0FBQyxLQUFLO0dBQUEsQ0FBQyxDQUFDO0FBQ25FLE1BQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsVUFBUyxPQUFPLEVBQUU7QUFDaEUsUUFBSSxJQUFJLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QyxRQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7QUFDZixVQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7S0FDeEI7QUFDRCxXQUFPLElBQUksQ0FBQztHQUNiLENBQUMsQ0FBQzs7QUFFSCxTQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFTLEtBQUssRUFBRTtBQUNsRixXQUFPLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7R0FDeEMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0NBQ3ZCLENBQUM7Ozs7Ozs7Ozs7QUFVRixJQUFJLGdCQUFnQixHQUFHLFNBQW5CLGdCQUFnQixDQUFZLElBQUksRUFBRSxJQUFJLEVBQUU7QUFDMUMsTUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFTLEtBQUssRUFBRTtBQUMzQixRQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ3RELFFBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7QUFDNUIsV0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBQyxHQUFHO2VBQUssVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUM7T0FBQSxDQUFDLENBQUM7S0FDckQ7R0FDRixDQUFDLENBQUM7O0FBRUgsU0FBTyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Q0FDMUIsQ0FBQzs7cUJBRWEsRUFBQyxnQkFBZ0IsRUFBaEIsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQWhCLGdCQUFnQixFQUFFLFlBQVksRUFBWixZQUFZLEVBQUMiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90ZXh0LXRyYWNrLWxpc3QtY29udmVydGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVdGlsaXRpZXMgZm9yIGNhcHR1cmluZyB0ZXh0IHRyYWNrIHN0YXRlIGFuZCByZS1jcmVhdGluZyB0cmFja3NcbiAqIGJhc2VkIG9uIGEgY2FwdHVyZS5cbiAqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLWxpc3QtY29udmVydGVyLmpzXG4gKi9cblxuLyoqXG4gKiBFeGFtaW5lIGEgc2luZ2xlIHRleHQgdHJhY2sgYW5kIHJldHVybiBhIEpTT04tY29tcGF0aWJsZSBqYXZhc2NyaXB0XG4gKiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSB0ZXh0IHRyYWNrJ3Mgc3RhdGUuXG4gKiBAcGFyYW0gdHJhY2sge1RleHRUcmFja09iamVjdH0gdGhlIHRleHQgdHJhY2sgdG8gcXVlcnlcbiAqIEByZXR1cm4ge09iamVjdH0gYSBzZXJpYWxpemFibGUgamF2YXNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGVcbiAqIEBwcml2YXRlXG4gKi9cbmxldCB0cmFja1RvSnNvbl8gPSBmdW5jdGlvbih0cmFjaykge1xuICBsZXQgcmV0ID0gWydraW5kJywgJ2xhYmVsJywgJ2xhbmd1YWdlJywgJ2lkJyxcbiAgICAgICAgICAgICAnaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZScsXG4gICAgICAgICAgICAgJ21vZGUnLCAnc3JjJ10ucmVkdWNlKChhY2MsIHByb3AsIGkpID0+IHtcbiAgICBpZiAodHJhY2tbcHJvcF0pIHtcbiAgICAgIGFjY1twcm9wXSA9IHRyYWNrW3Byb3BdO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7XG4gICAgY3VlczogdHJhY2suY3VlcyAmJiBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodHJhY2suY3VlcywgZnVuY3Rpb24oY3VlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGFydFRpbWU6IGN1ZS5zdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWU6IGN1ZS5lbmRUaW1lLFxuICAgICAgICB0ZXh0OiBjdWUudGV4dCxcbiAgICAgICAgaWQ6IGN1ZS5pZFxuICAgICAgfTtcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gcmV0O1xufTtcblxuLyoqXG4gKiBFeGFtaW5lIGEgdGVjaCBhbmQgcmV0dXJuIGEgSlNPTi1jb21wYXRpYmxlIGphdmFzY3JpcHQgYXJyYXkgdGhhdFxuICogcmVwcmVzZW50cyB0aGUgc3RhdGUgb2YgYWxsIHRleHQgdHJhY2tzIGN1cnJlbnRseSBjb25maWd1cmVkLiBUaGVcbiAqIHJldHVybiBhcnJheSBpcyBjb21wYXRpYmxlIHdpdGggYGpzb25Ub1RleHRUcmFja3NgLlxuICogQHBhcmFtIHRlY2gge3RlY2h9IHRoZSB0ZWNoIG9iamVjdCB0byBxdWVyeVxuICogQHJldHVybiB7QXJyYXl9IGEgc2VyaWFsaXphYmxlIGphdmFzY3JpcHQgcmVwcmVzZW50YXRpb24gb2YgdGhlXG4gKiBAZnVuY3Rpb24gdGV4dFRyYWNrc1RvSnNvblxuICovXG5sZXQgdGV4dFRyYWNrc1RvSnNvbiA9IGZ1bmN0aW9uKHRlY2gpIHtcblxuICBsZXQgdHJhY2tFbHMgPSB0ZWNoLiQkKCd0cmFjaycpO1xuXG4gIGxldCB0cmFja09ianMgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwodHJhY2tFbHMsICh0KSA9PiB0LnRyYWNrKTtcbiAgbGV0IHRyYWNrcyA9IEFycmF5LnByb3RvdHlwZS5tYXAuY2FsbCh0cmFja0VscywgZnVuY3Rpb24odHJhY2tFbCkge1xuICAgIGxldCBqc29uID0gdHJhY2tUb0pzb25fKHRyYWNrRWwudHJhY2spO1xuICAgIGlmICh0cmFja0VsLnNyYykge1xuICAgICAganNvbi5zcmMgPSB0cmFja0VsLnNyYztcbiAgICB9XG4gICAgcmV0dXJuIGpzb247XG4gIH0pO1xuXG4gIHJldHVybiB0cmFja3MuY29uY2F0KEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbCh0ZWNoLnRleHRUcmFja3MoKSwgZnVuY3Rpb24odHJhY2spIHtcbiAgICByZXR1cm4gdHJhY2tPYmpzLmluZGV4T2YodHJhY2spID09PSAtMTtcbiAgfSkubWFwKHRyYWNrVG9Kc29uXykpO1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgc2V0IG9mIHJlbW90ZSB0ZXh0IHRyYWNrcyBvbiBhIHRlY2ggYmFzZWQgb24gYW4gYXJyYXkgb2ZcbiAqIGphdmFzY3JpcHQgdGV4dCB0cmFjayByZXByZXNlbnRhdGlvbnMuXG4gKiBAcGFyYW0ganNvbiB7QXJyYXl9IGFuIGFycmF5IG9mIHRleHQgdHJhY2sgcmVwcmVzZW50YXRpb24gb2JqZWN0cyxcbiAqIGxpa2UgdGhvc2UgdGhhdCB3b3VsZCBiZSBwcm9kdWNlZCBieSBgdGV4dFRyYWNrc1RvSnNvbmBcbiAqIEBwYXJhbSB0ZWNoIHt0ZWNofSB0aGUgdGVjaCB0byBjcmVhdGUgdGV4dCB0cmFja3Mgb25cbiAqIEBmdW5jdGlvbiBqc29uVG9UZXh0VHJhY2tzXG4gKi9cbmxldCBqc29uVG9UZXh0VHJhY2tzID0gZnVuY3Rpb24oanNvbiwgdGVjaCkge1xuICBqc29uLmZvckVhY2goZnVuY3Rpb24odHJhY2spIHtcbiAgICBsZXQgYWRkZWRUcmFjayA9IHRlY2guYWRkUmVtb3RlVGV4dFRyYWNrKHRyYWNrKS50cmFjaztcbiAgICBpZiAoIXRyYWNrLnNyYyAmJiB0cmFjay5jdWVzKSB7XG4gICAgICB0cmFjay5jdWVzLmZvckVhY2goKGN1ZSkgPT4gYWRkZWRUcmFjay5hZGRDdWUoY3VlKSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gdGVjaC50ZXh0VHJhY2tzKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7dGV4dFRyYWNrc1RvSnNvbiwganNvblRvVGV4dFRyYWNrcywgdHJhY2tUb0pzb25ffTtcbiJdfQ==
},{}],133:[function(_dereq_,module,exports){
/**
* @file text-track-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackList = _dereq_('./track-list');
var _trackList2 = _interopRequireDefault(_trackList);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* A list of possible text tracks. All functionality is in the
* base class TrackList. The spec for TextTrackList is located at:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#texttracklist
*
* interface TextTrackList : EventTarget {
* readonly attribute unsigned long length;
* getter TextTrack (unsigned long index);
* TextTrack? getTrackById(DOMString id);
*
* attribute EventHandler onchange;
* attribute EventHandler onaddtrack;
* attribute EventHandler onremovetrack;
* };
*
* @param {TextTrack[]} tracks A list of tracks to initialize the list with
* @extends TrackList
* @class TextTrackList
*/
var TextTrackList = (function (_TrackList) {
_inherits(TextTrackList, _TrackList);
function TextTrackList() {
var tracks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
_classCallCheck(this, TextTrackList);
var list = undefined;
// IE8 forces us to implement inheritance ourselves
// as it does not support Object.defineProperty properly
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in _trackList2['default'].prototype) {
if (prop !== 'constructor') {
list[prop] = _trackList2['default'].prototype[prop];
}
}
for (var prop in TextTrackList.prototype) {
if (prop !== 'constructor') {
list[prop] = TextTrackList.prototype[prop];
}
}
}
list = _TrackList.call(this, tracks, list);
return list;
}
TextTrackList.prototype.addTrack_ = function addTrack_(track) {
_TrackList.prototype.addTrack_.call(this, track);
track.addEventListener('modechange', Fn.bind(this, function () {
this.trigger('change');
}));
};
/**
* Remove TextTrack from TextTrackList
* NOTE: Be mindful of what is passed in as it may be a HTMLTrackElement
*
* @param {TextTrack} rtrack
* @method removeTrack_
* @private
*/
TextTrackList.prototype.removeTrack_ = function removeTrack_(rtrack) {
var track = undefined;
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === rtrack) {
track = this[i];
if (track.off) {
track.off();
}
this.tracks_.splice(i, 1);
break;
}
}
if (!track) {
return;
}
this.trigger({
track: track,
type: 'removetrack'
});
};
/**
* Get a TextTrack from TextTrackList by a tracks id
*
* @param {String} id - the id of the track to get
* @method getTrackById
* @return {TextTrack}
* @private
*/
TextTrackList.prototype.getTrackById = function getTrackById(id) {
var result = null;
for (var i = 0, l = this.length; i < l; i++) {
var track = this[i];
if (track.id === id) {
result = track;
break;
}
}
return result;
};
return TextTrackList;
})(_trackList2['default']);
exports['default'] = TextTrackList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay1saXN0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozt5QkFHc0IsY0FBYzs7Ozt5QkFDaEIsZ0JBQWdCOztJQUF4QixFQUFFOzs4QkFDVyxxQkFBcUI7O0lBQWxDLE9BQU87OzhCQUNFLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBcUJoQyxhQUFhO1lBQWIsYUFBYTs7QUFDTixXQURQLGFBQWEsR0FDUTtRQUFiLE1BQU0seURBQUcsRUFBRTs7MEJBRG5CLGFBQWE7O0FBRWYsUUFBSSxJQUFJLFlBQUEsQ0FBQzs7OztBQUlULFFBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixVQUFJLEdBQUcsNEJBQVMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFdBQUssSUFBSSxJQUFJLElBQUksdUJBQVUsU0FBUyxFQUFFO0FBQ3BDLFlBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUMxQixjQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsdUJBQVUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hDO09BQ0Y7QUFDRCxXQUFLLElBQUksSUFBSSxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUU7QUFDeEMsWUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO0FBQzFCLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLEdBQUcsc0JBQU0sTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNCLFdBQU8sSUFBSSxDQUFDO0dBQ2I7O0FBdEJHLGVBQWEsV0F3QmpCLFNBQVMsR0FBQSxtQkFBQyxLQUFLLEVBQUU7QUFDZix5QkFBTSxTQUFTLEtBQUEsT0FBQyxLQUFLLENBQUMsQ0FBQztBQUN2QixTQUFLLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVc7QUFDNUQsVUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN4QixDQUFDLENBQUMsQ0FBQztHQUNMOzs7Ozs7Ozs7OztBQTdCRyxlQUFhLFdBdUNqQixZQUFZLEdBQUEsc0JBQUMsTUFBTSxFQUFFO0FBQ25CLFFBQUksS0FBSyxZQUFBLENBQUM7O0FBRVYsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMzQyxVQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7QUFDdEIsYUFBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNoQixZQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7QUFDYixlQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7U0FDYjs7QUFFRCxZQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7O0FBRTFCLGNBQU07T0FDUDtLQUNGOztBQUVELFFBQUksQ0FBQyxLQUFLLEVBQUU7QUFDVixhQUFPO0tBQ1I7O0FBRUQsUUFBSSxDQUFDLE9BQU8sQ0FBQztBQUNYLFdBQUssRUFBTCxLQUFLO0FBQ0wsVUFBSSxFQUFFLGFBQWE7S0FDcEIsQ0FBQyxDQUFDO0dBQ0o7Ozs7Ozs7Ozs7O0FBL0RHLGVBQWEsV0F5RWpCLFlBQVksR0FBQSxzQkFBQyxFQUFFLEVBQUU7QUFDZixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRWxCLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVwQixVQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO0FBQ25CLGNBQU0sR0FBRyxLQUFLLENBQUM7QUFDZixjQUFNO09BQ1A7S0FDRjs7QUFFRCxXQUFPLE1BQU0sQ0FBQztHQUNmOztTQXRGRyxhQUFhOzs7cUJBd0ZKLGFBQWEiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90ZXh0LXRyYWNrLWxpc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRleHQtdHJhY2stbGlzdC5qc1xuICovXG5pbXBvcnQgVHJhY2tMaXN0IGZyb20gJy4vdHJhY2stbGlzdCc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogQSBsaXN0IG9mIHBvc3NpYmxlIHRleHQgdHJhY2tzLiBBbGwgZnVuY3Rpb25hbGl0eSBpcyBpbiB0aGVcbiAqIGJhc2UgY2xhc3MgVHJhY2tMaXN0LiBUaGUgc3BlYyBmb3IgVGV4dFRyYWNrTGlzdCBpcyBsb2NhdGVkIGF0OlxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja2xpc3RcbiAqXG4gKiBpbnRlcmZhY2UgVGV4dFRyYWNrTGlzdCA6IEV2ZW50VGFyZ2V0IHtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoO1xuICogICBnZXR0ZXIgVGV4dFRyYWNrICh1bnNpZ25lZCBsb25nIGluZGV4KTtcbiAqICAgVGV4dFRyYWNrPyBnZXRUcmFja0J5SWQoRE9NU3RyaW5nIGlkKTtcbiAqXG4gKiAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25jaGFuZ2U7XG4gKiAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25hZGR0cmFjaztcbiAqICAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnJlbW92ZXRyYWNrO1xuICogfTtcbiAqXG4gKiBAcGFyYW0ge1RleHRUcmFja1tdfSB0cmFja3MgQSBsaXN0IG9mIHRyYWNrcyB0byBpbml0aWFsaXplIHRoZSBsaXN0IHdpdGhcbiAqIEBleHRlbmRzIFRyYWNrTGlzdFxuICogQGNsYXNzIFRleHRUcmFja0xpc3RcbiAqL1xuY2xhc3MgVGV4dFRyYWNrTGlzdCBleHRlbmRzIFRyYWNrTGlzdCB7XG4gIGNvbnN0cnVjdG9yKHRyYWNrcyA9IFtdKSB7XG4gICAgbGV0IGxpc3Q7XG5cbiAgICAvLyBJRTggZm9yY2VzIHVzIHRvIGltcGxlbWVudCBpbmhlcml0YW5jZSBvdXJzZWx2ZXNcbiAgICAvLyBhcyBpdCBkb2VzIG5vdCBzdXBwb3J0IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBwcm9wZXJseVxuICAgIGlmIChicm93c2VyLklTX0lFOCkge1xuICAgICAgbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yIChsZXQgcHJvcCBpbiBUcmFja0xpc3QucHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgbGlzdFtwcm9wXSA9IFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAobGV0IHByb3AgaW4gVGV4dFRyYWNrTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVGV4dFRyYWNrTGlzdC5wcm90b3R5cGVbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0ID0gc3VwZXIodHJhY2tzLCBsaXN0KTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIGFkZFRyYWNrXyh0cmFjaykge1xuICAgIHN1cGVyLmFkZFRyYWNrXyh0cmFjayk7XG4gICAgdHJhY2suYWRkRXZlbnRMaXN0ZW5lcignbW9kZWNoYW5nZScsIEZuLmJpbmQodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgVGV4dFRyYWNrIGZyb20gVGV4dFRyYWNrTGlzdFxuICAgKiBOT1RFOiBCZSBtaW5kZnVsIG9mIHdoYXQgaXMgcGFzc2VkIGluIGFzIGl0IG1heSBiZSBhIEhUTUxUcmFja0VsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtUZXh0VHJhY2t9IHJ0cmFja1xuICAgKiBAbWV0aG9kIHJlbW92ZVRyYWNrX1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVtb3ZlVHJhY2tfKHJ0cmFjaykge1xuICAgIGxldCB0cmFjaztcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGlmICh0aGlzW2ldID09PSBydHJhY2spIHtcbiAgICAgICAgdHJhY2sgPSB0aGlzW2ldO1xuICAgICAgICBpZiAodHJhY2sub2ZmKSB7XG4gICAgICAgICAgdHJhY2sub2ZmKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYWNrc18uc3BsaWNlKGksIDEpO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdHJhY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgdHJhY2ssXG4gICAgICB0eXBlOiAncmVtb3ZldHJhY2snXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgVGV4dFRyYWNrIGZyb20gVGV4dFRyYWNrTGlzdCBieSBhIHRyYWNrcyBpZFxuICAgKlxuICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgLSB0aGUgaWQgb2YgdGhlIHRyYWNrIHRvIGdldFxuICAgKiBAbWV0aG9kIGdldFRyYWNrQnlJZFxuICAgKiBAcmV0dXJuIHtUZXh0VHJhY2t9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRUcmFja0J5SWQoaWQpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxldCB0cmFjayA9IHRoaXNbaV07XG5cbiAgICAgIGlmICh0cmFjay5pZCA9PT0gaWQpIHtcbiAgICAgICAgcmVzdWx0ID0gdHJhY2s7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFRleHRUcmFja0xpc3Q7XG4iXX0=
},{"../utils/browser.js":141,"../utils/fn.js":146,"./track-list":137,"global/document":7}],134:[function(_dereq_,module,exports){
/**
* @file text-track-settings.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _component = _dereq_('../component');
var _component2 = _interopRequireDefault(_component);
var _utilsEventsJs = _dereq_('../utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _safeJsonParseTuple = _dereq_('safe-json-parse/tuple');
var _safeJsonParseTuple2 = _interopRequireDefault(_safeJsonParseTuple);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Manipulate settings of texttracks
*
* @param {Object} player Main Player
* @param {Object=} options Object of option names and values
* @extends Component
* @class TextTrackSettings
*/
var TextTrackSettings = (function (_Component) {
_inherits(TextTrackSettings, _Component);
function TextTrackSettings(player, options) {
_classCallCheck(this, TextTrackSettings);
_Component.call(this, player, options);
this.hide();
// Grab `persistTextTrackSettings` from the player options if not passed in child options
if (options.persistTextTrackSettings === undefined) {
this.options_.persistTextTrackSettings = this.options_.playerOptions.persistTextTrackSettings;
}
Events.on(this.$('.vjs-done-button'), 'click', Fn.bind(this, function () {
this.saveSettings();
this.hide();
}));
Events.on(this.$('.vjs-default-button'), 'click', Fn.bind(this, function () {
this.$('.vjs-fg-color > select').selectedIndex = 0;
this.$('.vjs-bg-color > select').selectedIndex = 0;
this.$('.window-color > select').selectedIndex = 0;
this.$('.vjs-text-opacity > select').selectedIndex = 0;
this.$('.vjs-bg-opacity > select').selectedIndex = 0;
this.$('.vjs-window-opacity > select').selectedIndex = 0;
this.$('.vjs-edge-style select').selectedIndex = 0;
this.$('.vjs-font-family select').selectedIndex = 0;
this.$('.vjs-font-percent select').selectedIndex = 2;
this.updateDisplay();
}));
Events.on(this.$('.vjs-fg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-bg-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.window-color > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-text-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-bg-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-window-opacity > select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-font-percent select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-edge-style select'), 'change', Fn.bind(this, this.updateDisplay));
Events.on(this.$('.vjs-font-family select'), 'change', Fn.bind(this, this.updateDisplay));
if (this.options_.persistTextTrackSettings) {
this.restoreSettings();
}
}
/**
* Create the component's DOM element
*
* @return {Element}
* @method createEl
*/
TextTrackSettings.prototype.createEl = function createEl() {
return _Component.prototype.createEl.call(this, 'div', {
className: 'vjs-caption-settings vjs-modal-overlay',
innerHTML: captionOptionsMenuTemplate()
});
};
/**
* Get texttrack settings
* Settings are
* .vjs-edge-style
* .vjs-font-family
* .vjs-fg-color
* .vjs-text-opacity
* .vjs-bg-color
* .vjs-bg-opacity
* .window-color
* .vjs-window-opacity
*
* @return {Object}
* @method getValues
*/
TextTrackSettings.prototype.getValues = function getValues() {
var textEdge = getSelectedOptionValue(this.$('.vjs-edge-style select'));
var fontFamily = getSelectedOptionValue(this.$('.vjs-font-family select'));
var fgColor = getSelectedOptionValue(this.$('.vjs-fg-color > select'));
var textOpacity = getSelectedOptionValue(this.$('.vjs-text-opacity > select'));
var bgColor = getSelectedOptionValue(this.$('.vjs-bg-color > select'));
var bgOpacity = getSelectedOptionValue(this.$('.vjs-bg-opacity > select'));
var windowColor = getSelectedOptionValue(this.$('.window-color > select'));
var windowOpacity = getSelectedOptionValue(this.$('.vjs-window-opacity > select'));
var fontPercent = _globalWindow2['default']['parseFloat'](getSelectedOptionValue(this.$('.vjs-font-percent > select')));
var result = {
'backgroundOpacity': bgOpacity,
'textOpacity': textOpacity,
'windowOpacity': windowOpacity,
'edgeStyle': textEdge,
'fontFamily': fontFamily,
'color': fgColor,
'backgroundColor': bgColor,
'windowColor': windowColor,
'fontPercent': fontPercent
};
for (var _name in result) {
if (result[_name] === '' || result[_name] === 'none' || _name === 'fontPercent' && result[_name] === 1.00) {
delete result[_name];
}
}
return result;
};
/**
* Set texttrack settings
* Settings are
* .vjs-edge-style
* .vjs-font-family
* .vjs-fg-color
* .vjs-text-opacity
* .vjs-bg-color
* .vjs-bg-opacity
* .window-color
* .vjs-window-opacity
*
* @param {Object} values Object with texttrack setting values
* @method setValues
*/
TextTrackSettings.prototype.setValues = function setValues(values) {
setSelectedOption(this.$('.vjs-edge-style select'), values.edgeStyle);
setSelectedOption(this.$('.vjs-font-family select'), values.fontFamily);
setSelectedOption(this.$('.vjs-fg-color > select'), values.color);
setSelectedOption(this.$('.vjs-text-opacity > select'), values.textOpacity);
setSelectedOption(this.$('.vjs-bg-color > select'), values.backgroundColor);
setSelectedOption(this.$('.vjs-bg-opacity > select'), values.backgroundOpacity);
setSelectedOption(this.$('.window-color > select'), values.windowColor);
setSelectedOption(this.$('.vjs-window-opacity > select'), values.windowOpacity);
var fontPercent = values.fontPercent;
if (fontPercent) {
fontPercent = fontPercent.toFixed(2);
}
setSelectedOption(this.$('.vjs-font-percent > select'), fontPercent);
};
/**
* Restore texttrack settings
*
* @method restoreSettings
*/
TextTrackSettings.prototype.restoreSettings = function restoreSettings() {
var err = undefined,
values = undefined;
try {
var _safeParseTuple = _safeJsonParseTuple2['default'](_globalWindow2['default'].localStorage.getItem('vjs-text-track-settings'));
err = _safeParseTuple[0];
values = _safeParseTuple[1];
if (err) {
_utilsLogJs2['default'].error(err);
}
} catch (e) {
_utilsLogJs2['default'].warn(e);
}
if (values) {
this.setValues(values);
}
};
/**
* Save texttrack settings to local storage
*
* @method saveSettings
*/
TextTrackSettings.prototype.saveSettings = function saveSettings() {
if (!this.options_.persistTextTrackSettings) {
return;
}
var values = this.getValues();
try {
if (Object.getOwnPropertyNames(values).length > 0) {
_globalWindow2['default'].localStorage.setItem('vjs-text-track-settings', JSON.stringify(values));
} else {
_globalWindow2['default'].localStorage.removeItem('vjs-text-track-settings');
}
} catch (e) {
_utilsLogJs2['default'].warn(e);
}
};
/**
* Update display of texttrack settings
*
* @method updateDisplay
*/
TextTrackSettings.prototype.updateDisplay = function updateDisplay() {
var ttDisplay = this.player_.getChild('textTrackDisplay');
if (ttDisplay) {
ttDisplay.updateDisplay();
}
};
return TextTrackSettings;
})(_component2['default']);
_component2['default'].registerComponent('TextTrackSettings', TextTrackSettings);
function getSelectedOptionValue(target) {
var selectedOption = undefined;
// not all browsers support selectedOptions, so, fallback to options
if (target.selectedOptions) {
selectedOption = target.selectedOptions[0];
} else if (target.options) {
selectedOption = target.options[target.options.selectedIndex];
}
return selectedOption.value;
}
function setSelectedOption(target, value) {
if (!value) {
return;
}
var i = undefined;
for (i = 0; i < target.options.length; i++) {
var option = target.options[i];
if (option.value === value) {
break;
}
}
target.selectedIndex = i;
}
function captionOptionsMenuTemplate() {
var template = '
\n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n \n \n \n \n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n \n \n
';
return template;
}
exports['default'] = TextTrackSettings;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay1zZXR0aW5ncy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7eUJBR3NCLGNBQWM7Ozs7NkJBQ1osb0JBQW9COztJQUFoQyxNQUFNOzt5QkFDRSxnQkFBZ0I7O0lBQXhCLEVBQUU7OzBCQUNFLGlCQUFpQjs7OztrQ0FDTix1QkFBdUI7Ozs7NEJBQy9CLGVBQWU7Ozs7Ozs7Ozs7Ozs7SUFVNUIsaUJBQWlCO1lBQWpCLGlCQUFpQjs7QUFFVixXQUZQLGlCQUFpQixDQUVULE1BQU0sRUFBRSxPQUFPLEVBQUU7MEJBRnpCLGlCQUFpQjs7QUFHbkIsMEJBQU0sTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzs7O0FBR1osUUFBSSxPQUFPLENBQUMsd0JBQXdCLEtBQUssU0FBUyxFQUFFO0FBQ2xELFVBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUM7S0FDL0Y7O0FBRUQsVUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVc7QUFDdEUsVUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0FBQ3BCLFVBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztLQUNiLENBQUMsQ0FBQyxDQUFDOztBQUVKLFVBQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFXO0FBQ3pFLFVBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ25ELFVBQUksQ0FBQyxDQUFDLENBQUMsd0JBQXdC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LGFBQWEsQ0FBQyxDQUFDO0dBQy9EOztBQUVELFNBQU8sY0FBYyxDQUFDLEtBQUssQ0FBQztDQUM3Qjs7QUFFRCxTQUFTLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUU7QUFDeEMsTUFBSSxDQUFDLEtBQUssRUFBRTtBQUNWLFdBQU87R0FDUjs7QUFFRCxNQUFJLENBQUMsWUFBQSxDQUFDO0FBQ04sT0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxRQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pDLFFBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxLQUFLLEVBQUU7QUFDMUIsWUFBTTtLQUNQO0dBQ0Y7O0FBRUQsUUFBTSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUM7Q0FDMUI7O0FBRUQsU0FBUywwQkFBMEIsR0FBRztBQUNwQyxNQUFJLFFBQVEsay9KQStHSCxDQUFDOztBQUVSLFNBQU8sUUFBUSxDQUFDO0NBQ25COztxQkFFYyxpQkFBaUIiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90ZXh0LXRyYWNrLXNldHRpbmdzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLXNldHRpbmdzLmpzXG4gKi9cbmltcG9ydCBDb21wb25lbnQgZnJvbSAnLi4vY29tcG9uZW50JztcbmltcG9ydCAqIGFzIEV2ZW50cyBmcm9tICcuLi91dGlscy9ldmVudHMuanMnO1xuaW1wb3J0ICogYXMgRm4gZnJvbSAnLi4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IHNhZmVQYXJzZVR1cGxlIGZyb20gJ3NhZmUtanNvbi1wYXJzZS90dXBsZSc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG4vKipcbiAqIE1hbmlwdWxhdGUgc2V0dGluZ3Mgb2YgdGV4dHRyYWNrc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwbGF5ZXIgIE1haW4gUGxheWVyXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAZXh0ZW5kcyBDb21wb25lbnRcbiAqIEBjbGFzcyBUZXh0VHJhY2tTZXR0aW5nc1xuICovXG5jbGFzcyBUZXh0VHJhY2tTZXR0aW5ncyBleHRlbmRzIENvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IocGxheWVyLCBvcHRpb25zKSB7XG4gICAgc3VwZXIocGxheWVyLCBvcHRpb25zKTtcbiAgICB0aGlzLmhpZGUoKTtcblxuICAgIC8vIEdyYWIgYHBlcnNpc3RUZXh0VHJhY2tTZXR0aW5nc2AgZnJvbSB0aGUgcGxheWVyIG9wdGlvbnMgaWYgbm90IHBhc3NlZCBpbiBjaGlsZCBvcHRpb25zXG4gICAgaWYgKG9wdGlvbnMucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMub3B0aW9uc18ucGVyc2lzdFRleHRUcmFja1NldHRpbmdzID0gdGhpcy5vcHRpb25zXy5wbGF5ZXJPcHRpb25zLnBlcnNpc3RUZXh0VHJhY2tTZXR0aW5ncztcbiAgICB9XG5cbiAgICBFdmVudHMub24odGhpcy4kKCcudmpzLWRvbmUtYnV0dG9uJyksICdjbGljaycsIEZuLmJpbmQodGhpcywgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xuICAgICAgdGhpcy5oaWRlKCk7XG4gICAgfSkpO1xuXG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy1kZWZhdWx0LWJ1dHRvbicpLCAnY2xpY2snLCBGbi5iaW5kKHRoaXMsIGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy4kKCcudmpzLWZnLWNvbG9yID4gc2VsZWN0Jykuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB0aGlzLiQoJy52anMtYmctY29sb3IgPiBzZWxlY3QnKS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIHRoaXMuJCgnLndpbmRvdy1jb2xvciA+IHNlbGVjdCcpLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgdGhpcy4kKCcudmpzLXRleHQtb3BhY2l0eSA+IHNlbGVjdCcpLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgdGhpcy4kKCcudmpzLWJnLW9wYWNpdHkgPiBzZWxlY3QnKS5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIHRoaXMuJCgnLnZqcy13aW5kb3ctb3BhY2l0eSA+IHNlbGVjdCcpLnNlbGVjdGVkSW5kZXggPSAwO1xuICAgICAgdGhpcy4kKCcudmpzLWVkZ2Utc3R5bGUgc2VsZWN0Jykuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB0aGlzLiQoJy52anMtZm9udC1mYW1pbHkgc2VsZWN0Jykuc2VsZWN0ZWRJbmRleCA9IDA7XG4gICAgICB0aGlzLiQoJy52anMtZm9udC1wZXJjZW50IHNlbGVjdCcpLnNlbGVjdGVkSW5kZXggPSAyO1xuICAgICAgdGhpcy51cGRhdGVEaXNwbGF5KCk7XG4gICAgfSkpO1xuXG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcpLCAnY2hhbmdlJywgRm4uYmluZCh0aGlzLCB0aGlzLnVwZGF0ZURpc3BsYXkpKTtcbiAgICBFdmVudHMub24odGhpcy4kKCcudmpzLWJnLWNvbG9yID4gc2VsZWN0JyksICdjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXMudXBkYXRlRGlzcGxheSkpO1xuICAgIEV2ZW50cy5vbih0aGlzLiQoJy53aW5kb3ctY29sb3IgPiBzZWxlY3QnKSwgJ2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy10ZXh0LW9wYWNpdHkgPiBzZWxlY3QnKSwgJ2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy1iZy1vcGFjaXR5ID4gc2VsZWN0JyksICdjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXMudXBkYXRlRGlzcGxheSkpO1xuICAgIEV2ZW50cy5vbih0aGlzLiQoJy52anMtd2luZG93LW9wYWNpdHkgPiBzZWxlY3QnKSwgJ2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy1mb250LXBlcmNlbnQgc2VsZWN0JyksICdjaGFuZ2UnLCBGbi5iaW5kKHRoaXMsIHRoaXMudXBkYXRlRGlzcGxheSkpO1xuICAgIEV2ZW50cy5vbih0aGlzLiQoJy52anMtZWRnZS1zdHlsZSBzZWxlY3QnKSwgJ2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG4gICAgRXZlbnRzLm9uKHRoaXMuJCgnLnZqcy1mb250LWZhbWlseSBzZWxlY3QnKSwgJ2NoYW5nZScsIEZuLmJpbmQodGhpcywgdGhpcy51cGRhdGVEaXNwbGF5KSk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25zXy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3MpIHtcbiAgICAgIHRoaXMucmVzdG9yZVNldHRpbmdzKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSB0aGUgY29tcG9uZW50J3MgRE9NIGVsZW1lbnRcbiAgICpcbiAgICogQHJldHVybiB7RWxlbWVudH1cbiAgICogQG1ldGhvZCBjcmVhdGVFbFxuICAgKi9cbiAgY3JlYXRlRWwoKSB7XG4gICAgcmV0dXJuIHN1cGVyLmNyZWF0ZUVsKCdkaXYnLCB7XG4gICAgICBjbGFzc05hbWU6ICd2anMtY2FwdGlvbi1zZXR0aW5ncyB2anMtbW9kYWwtb3ZlcmxheScsXG4gICAgICBpbm5lckhUTUw6IGNhcHRpb25PcHRpb25zTWVudVRlbXBsYXRlKClcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGV4dHRyYWNrIHNldHRpbmdzXG4gICAqIFNldHRpbmdzIGFyZVxuICAgKiAudmpzLWVkZ2Utc3R5bGVcbiAgICogLnZqcy1mb250LWZhbWlseVxuICAgKiAudmpzLWZnLWNvbG9yXG4gICAqIC52anMtdGV4dC1vcGFjaXR5XG4gICAqIC52anMtYmctY29sb3JcbiAgICogLnZqcy1iZy1vcGFjaXR5XG4gICAqIC53aW5kb3ctY29sb3JcbiAgICogLnZqcy13aW5kb3ctb3BhY2l0eVxuICAgKlxuICAgKiBAcmV0dXJuIHtPYmplY3R9XG4gICAqIEBtZXRob2QgZ2V0VmFsdWVzXG4gICAqL1xuICBnZXRWYWx1ZXMoKSB7XG4gICAgY29uc3QgdGV4dEVkZ2UgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKHRoaXMuJCgnLnZqcy1lZGdlLXN0eWxlIHNlbGVjdCcpKTtcbiAgICBjb25zdCBmb250RmFtaWx5ID0gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZSh0aGlzLiQoJy52anMtZm9udC1mYW1pbHkgc2VsZWN0JykpO1xuICAgIGNvbnN0IGZnQ29sb3IgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKHRoaXMuJCgnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcpKTtcbiAgICBjb25zdCB0ZXh0T3BhY2l0eSA9IGdldFNlbGVjdGVkT3B0aW9uVmFsdWUodGhpcy4kKCcudmpzLXRleHQtb3BhY2l0eSA+IHNlbGVjdCcpKTtcbiAgICBjb25zdCBiZ0NvbG9yID0gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZSh0aGlzLiQoJy52anMtYmctY29sb3IgPiBzZWxlY3QnKSk7XG4gICAgY29uc3QgYmdPcGFjaXR5ID0gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZSh0aGlzLiQoJy52anMtYmctb3BhY2l0eSA+IHNlbGVjdCcpKTtcbiAgICBjb25zdCB3aW5kb3dDb2xvciA9IGdldFNlbGVjdGVkT3B0aW9uVmFsdWUodGhpcy4kKCcud2luZG93LWNvbG9yID4gc2VsZWN0JykpO1xuICAgIGNvbnN0IHdpbmRvd09wYWNpdHkgPSBnZXRTZWxlY3RlZE9wdGlvblZhbHVlKHRoaXMuJCgnLnZqcy13aW5kb3ctb3BhY2l0eSA+IHNlbGVjdCcpKTtcbiAgICBjb25zdCBmb250UGVyY2VudCA9IHdpbmRvd1sncGFyc2VGbG9hdCddKGdldFNlbGVjdGVkT3B0aW9uVmFsdWUodGhpcy4kKCcudmpzLWZvbnQtcGVyY2VudCA+IHNlbGVjdCcpKSk7XG5cbiAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgJ2JhY2tncm91bmRPcGFjaXR5JzogYmdPcGFjaXR5LFxuICAgICAgJ3RleHRPcGFjaXR5JzogdGV4dE9wYWNpdHksXG4gICAgICAnd2luZG93T3BhY2l0eSc6IHdpbmRvd09wYWNpdHksXG4gICAgICAnZWRnZVN0eWxlJzogdGV4dEVkZ2UsXG4gICAgICAnZm9udEZhbWlseSc6IGZvbnRGYW1pbHksXG4gICAgICAnY29sb3InOiBmZ0NvbG9yLFxuICAgICAgJ2JhY2tncm91bmRDb2xvcic6IGJnQ29sb3IsXG4gICAgICAnd2luZG93Q29sb3InOiB3aW5kb3dDb2xvcixcbiAgICAgICdmb250UGVyY2VudCc6IGZvbnRQZXJjZW50XG4gICAgfTtcbiAgICBmb3IgKGxldCBuYW1lIGluIHJlc3VsdCkge1xuICAgICAgaWYgKHJlc3VsdFtuYW1lXSA9PT0gJycgfHwgcmVzdWx0W25hbWVdID09PSAnbm9uZScgfHwgKG5hbWUgPT09ICdmb250UGVyY2VudCcgJiYgcmVzdWx0W25hbWVdID09PSAxLjAwKSkge1xuICAgICAgICBkZWxldGUgcmVzdWx0W25hbWVdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0ZXh0dHJhY2sgc2V0dGluZ3NcbiAgICogU2V0dGluZ3MgYXJlXG4gICAqIC52anMtZWRnZS1zdHlsZVxuICAgKiAudmpzLWZvbnQtZmFtaWx5XG4gICAqIC52anMtZmctY29sb3JcbiAgICogLnZqcy10ZXh0LW9wYWNpdHlcbiAgICogLnZqcy1iZy1jb2xvclxuICAgKiAudmpzLWJnLW9wYWNpdHlcbiAgICogLndpbmRvdy1jb2xvclxuICAgKiAudmpzLXdpbmRvdy1vcGFjaXR5XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSB2YWx1ZXMgT2JqZWN0IHdpdGggdGV4dHRyYWNrIHNldHRpbmcgdmFsdWVzXG4gICAqIEBtZXRob2Qgc2V0VmFsdWVzXG4gICAqL1xuICBzZXRWYWx1ZXModmFsdWVzKSB7XG4gICAgc2V0U2VsZWN0ZWRPcHRpb24odGhpcy4kKCcudmpzLWVkZ2Utc3R5bGUgc2VsZWN0JyksIHZhbHVlcy5lZGdlU3R5bGUpO1xuICAgIHNldFNlbGVjdGVkT3B0aW9uKHRoaXMuJCgnLnZqcy1mb250LWZhbWlseSBzZWxlY3QnKSwgdmFsdWVzLmZvbnRGYW1pbHkpO1xuICAgIHNldFNlbGVjdGVkT3B0aW9uKHRoaXMuJCgnLnZqcy1mZy1jb2xvciA+IHNlbGVjdCcpLCB2YWx1ZXMuY29sb3IpO1xuICAgIHNldFNlbGVjdGVkT3B0aW9uKHRoaXMuJCgnLnZqcy10ZXh0LW9wYWNpdHkgPiBzZWxlY3QnKSwgdmFsdWVzLnRleHRPcGFjaXR5KTtcbiAgICBzZXRTZWxlY3RlZE9wdGlvbih0aGlzLiQoJy52anMtYmctY29sb3IgPiBzZWxlY3QnKSwgdmFsdWVzLmJhY2tncm91bmRDb2xvcik7XG4gICAgc2V0U2VsZWN0ZWRPcHRpb24odGhpcy4kKCcudmpzLWJnLW9wYWNpdHkgPiBzZWxlY3QnKSwgdmFsdWVzLmJhY2tncm91bmRPcGFjaXR5KTtcbiAgICBzZXRTZWxlY3RlZE9wdGlvbih0aGlzLiQoJy53aW5kb3ctY29sb3IgPiBzZWxlY3QnKSwgdmFsdWVzLndpbmRvd0NvbG9yKTtcbiAgICBzZXRTZWxlY3RlZE9wdGlvbih0aGlzLiQoJy52anMtd2luZG93LW9wYWNpdHkgPiBzZWxlY3QnKSwgdmFsdWVzLndpbmRvd09wYWNpdHkpO1xuXG4gICAgbGV0IGZvbnRQZXJjZW50ID0gdmFsdWVzLmZvbnRQZXJjZW50O1xuXG4gICAgaWYgKGZvbnRQZXJjZW50KSB7XG4gICAgICBmb250UGVyY2VudCA9IGZvbnRQZXJjZW50LnRvRml4ZWQoMik7XG4gICAgfVxuXG4gICAgc2V0U2VsZWN0ZWRPcHRpb24odGhpcy4kKCcudmpzLWZvbnQtcGVyY2VudCA+IHNlbGVjdCcpLCBmb250UGVyY2VudCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzdG9yZSB0ZXh0dHJhY2sgc2V0dGluZ3NcbiAgICpcbiAgICogQG1ldGhvZCByZXN0b3JlU2V0dGluZ3NcbiAgICovXG4gIHJlc3RvcmVTZXR0aW5ncygpIHtcbiAgICBsZXQgZXJyLCB2YWx1ZXM7XG5cbiAgICB0cnkge1xuICAgICAgW2VyciwgdmFsdWVzXSA9IHNhZmVQYXJzZVR1cGxlKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmpzLXRleHQtdHJhY2stc2V0dGluZ3MnKSk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgbG9nLmVycm9yKGVycik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oZSk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcykge1xuICAgICAgdGhpcy5zZXRWYWx1ZXModmFsdWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSB0ZXh0dHJhY2sgc2V0dGluZ3MgdG8gbG9jYWwgc3RvcmFnZVxuICAgKlxuICAgKiBAbWV0aG9kIHNhdmVTZXR0aW5nc1xuICAgKi9cbiAgc2F2ZVNldHRpbmdzKCkge1xuICAgIGlmICghdGhpcy5vcHRpb25zXy5wZXJzaXN0VGV4dFRyYWNrU2V0dGluZ3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdmFsdWVzID0gdGhpcy5nZXRWYWx1ZXMoKTtcbiAgICB0cnkge1xuICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlcykubGVuZ3RoID4gMCkge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3Zqcy10ZXh0LXRyYWNrLXNldHRpbmdzJywgSlNPTi5zdHJpbmdpZnkodmFsdWVzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oJ3Zqcy10ZXh0LXRyYWNrLXNldHRpbmdzJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLndhcm4oZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBkaXNwbGF5IG9mIHRleHR0cmFjayBzZXR0aW5nc1xuICAgKlxuICAgKiBAbWV0aG9kIHVwZGF0ZURpc3BsYXlcbiAgICovXG4gIHVwZGF0ZURpc3BsYXkoKSB7XG4gICAgbGV0IHR0RGlzcGxheSA9IHRoaXMucGxheWVyXy5nZXRDaGlsZCgndGV4dFRyYWNrRGlzcGxheScpO1xuICAgIGlmICh0dERpc3BsYXkpIHtcbiAgICAgIHR0RGlzcGxheS51cGRhdGVEaXNwbGF5KCk7XG4gICAgfVxuICB9XG5cbn1cblxuQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50KCdUZXh0VHJhY2tTZXR0aW5ncycsIFRleHRUcmFja1NldHRpbmdzKTtcblxuZnVuY3Rpb24gZ2V0U2VsZWN0ZWRPcHRpb25WYWx1ZSh0YXJnZXQpIHtcbiAgbGV0IHNlbGVjdGVkT3B0aW9uO1xuICAvLyBub3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgc2VsZWN0ZWRPcHRpb25zLCBzbywgZmFsbGJhY2sgdG8gb3B0aW9uc1xuICBpZiAodGFyZ2V0LnNlbGVjdGVkT3B0aW9ucykge1xuICAgIHNlbGVjdGVkT3B0aW9uID0gdGFyZ2V0LnNlbGVjdGVkT3B0aW9uc1swXTtcbiAgfSBlbHNlIGlmICh0YXJnZXQub3B0aW9ucykge1xuICAgIHNlbGVjdGVkT3B0aW9uID0gdGFyZ2V0Lm9wdGlvbnNbdGFyZ2V0Lm9wdGlvbnMuc2VsZWN0ZWRJbmRleF07XG4gIH1cblxuICByZXR1cm4gc2VsZWN0ZWRPcHRpb24udmFsdWU7XG59XG5cbmZ1bmN0aW9uIHNldFNlbGVjdGVkT3B0aW9uKHRhcmdldCwgdmFsdWUpIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxldCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgdGFyZ2V0Lm9wdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvcHRpb24gPSB0YXJnZXQub3B0aW9uc1tpXTtcbiAgICBpZiAob3B0aW9uLnZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdGFyZ2V0LnNlbGVjdGVkSW5kZXggPSBpO1xufVxuXG5mdW5jdGlvbiBjYXB0aW9uT3B0aW9uc01lbnVUZW1wbGF0ZSgpIHtcbiAgbGV0IHRlbXBsYXRlID0gYDxkaXYgY2xhc3M9XCJ2anMtdHJhY2tzZXR0aW5nc1wiPlxuICAgICAgPGRpdiBjbGFzcz1cInZqcy10cmFja3NldHRpbmdzLWNvbG9yc1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmpzLWZnLWNvbG9yIHZqcy10cmFja3NldHRpbmdcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInZqcy1sYWJlbFwiPkZvcmVncm91bmQ8L2xhYmVsPlxuICAgICAgICAgICAgPHNlbGVjdD5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPi0tLTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiI0ZGRlwiPldoaXRlPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjMDAwXCI+QmxhY2s8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiNGMDBcIj5SZWQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiMwRjBcIj5HcmVlbjwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiIzAwRlwiPkJsdWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiNGRjBcIj5ZZWxsb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiNGMEZcIj5NYWdlbnRhPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjMEZGXCI+Q3lhbjwvb3B0aW9uPlxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZqcy10ZXh0LW9wYWNpdHkgdmpzLW9wYWNpdHlcIj5cbiAgICAgICAgICAgICAgPHNlbGVjdD5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj5PcGFxdWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMC41XCI+U2VtaS1PcGFxdWU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PiA8IS0tIHZqcy1mZy1jb2xvciAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZqcy1iZy1jb2xvciB2anMtdHJhY2tzZXR0aW5nXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2anMtbGFiZWxcIj5CYWNrZ3JvdW5kPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3Q+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLS08L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiNGRkZcIj5XaGl0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiIzAwMFwiPkJsYWNrPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjRjAwXCI+UmVkPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjMEYwXCI+R3JlZW48L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiMwMEZcIj5CbHVlPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjRkYwXCI+WWVsbG93PC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjRjBGXCI+TWFnZW50YTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiIzBGRlwiPkN5YW48L29wdGlvbj5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ2anMtYmctb3BhY2l0eSB2anMtb3BhY2l0eVwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3Q+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMVwiPk9wYXF1ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjAuNVwiPlNlbWktVHJhbnNwYXJlbnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwXCI+VHJhbnNwYXJlbnQ8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+IDwhLS0gdmpzLWJnLWNvbG9yIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2luZG93LWNvbG9yIHZqcy10cmFja3NldHRpbmdcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInZqcy1sYWJlbFwiPldpbmRvdzwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0PlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+LS0tPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjRkZGXCI+V2hpdGU8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiMwMDBcIj5CbGFjazwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiI0YwMFwiPlJlZDwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiIzBGMFwiPkdyZWVuPC9vcHRpb24+XG4gICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIjMDBGXCI+Qmx1ZTwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiI0ZGMFwiPlllbGxvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiI0YwRlwiPk1hZ2VudGE8L29wdGlvbj5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIiMwRkZcIj5DeWFuPC9vcHRpb24+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmpzLXdpbmRvdy1vcGFjaXR5IHZqcy1vcGFjaXR5XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLS08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxXCI+T3BhcXVlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMC41XCI+U2VtaS1UcmFuc3BhcmVudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjBcIj5UcmFuc3BhcmVudDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj4gPCEtLSB2anMtd2luZG93LWNvbG9yIC0tPlxuICAgICAgPC9kaXY+IDwhLS0gdmpzLXRyYWNrc2V0dGluZ3MgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwidmpzLXRyYWNrc2V0dGluZ3MtZm9udFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmpzLWZvbnQtcGVyY2VudCB2anMtdHJhY2tzZXR0aW5nXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwidmpzLWxhYmVsXCI+Rm9udCBTaXplPC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0PlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjAuNTBcIj41MCU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIwLjc1XCI+NzUlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMS4wMFwiIHNlbGVjdGVkPjEwMCU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxLjI1XCI+MTI1JTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEuNTBcIj4xNTAlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiMS43NVwiPjE3NSU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIyLjAwXCI+MjAwJTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjMuMDBcIj4zMDAlPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNC4wMFwiPjQwMCU8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPC9kaXY+IDwhLS0gdmpzLWZvbnQtcGVyY2VudCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZqcy1lZGdlLXN0eWxlIHZqcy10cmFja3NldHRpbmdcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2anMtbGFiZWxcIj5UZXh0IEVkZ2UgU3R5bGU8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3Q+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibm9uZVwiPk5vbmU8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyYWlzZWRcIj5SYWlzZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkZXByZXNzZWRcIj5EZXByZXNzZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ1bmlmb3JtXCI+VW5pZm9ybTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImRyb3BzaGFkb3dcIj5Ecm9wc2hhZG93PC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDwvZGl2PiA8IS0tIHZqcy1lZGdlLXN0eWxlIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmpzLWZvbnQtZmFtaWx5IHZqcy10cmFja3NldHRpbmdcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ2anMtbGFiZWxcIj5Gb250IEZhbWlseTwvbGFiZWw+XG4gICAgICAgICAgPHNlbGVjdD5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5EZWZhdWx0PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwibW9ub3NwYWNlU2VyaWZcIj5Nb25vc3BhY2UgU2VyaWY8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcm9wb3J0aW9uYWxTZXJpZlwiPlByb3BvcnRpb25hbCBTZXJpZjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbm9zcGFjZVNhbnNTZXJpZlwiPk1vbm9zcGFjZSBTYW5zLVNlcmlmPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJvcG9ydGlvbmFsU2Fuc1NlcmlmXCI+UHJvcG9ydGlvbmFsIFNhbnMtU2VyaWY8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjYXN1YWxcIj5DYXN1YWw8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzY3JpcHRcIj5TY3JpcHQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJzbWFsbC1jYXBzXCI+U21hbGwgQ2Fwczwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8L2Rpdj4gPCEtLSB2anMtZm9udC1mYW1pbHkgLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwidmpzLXRyYWNrc2V0dGluZ3MtY29udHJvbHNcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJ2anMtZGVmYXVsdC1idXR0b25cIj5EZWZhdWx0czwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBjbGFzcz1cInZqcy1kb25lLWJ1dHRvblwiPkRvbmU8L2J1dHRvbj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBUZXh0VHJhY2tTZXR0aW5ncztcbiJdfQ==
},{"../component":66,"../utils/events.js":145,"../utils/fn.js":146,"../utils/log.js":149,"global/window":8,"safe-json-parse/tuple":57}],135:[function(_dereq_,module,exports){
/**
* @file text-track.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _textTrackCueList = _dereq_('./text-track-cue-list');
var _textTrackCueList2 = _interopRequireDefault(_textTrackCueList);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _trackEnums = _dereq_('./track-enums');
var _utilsLogJs = _dereq_('../utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _trackJs = _dereq_('./track.js');
var _trackJs2 = _interopRequireDefault(_trackJs);
var _utilsUrlJs = _dereq_('../utils/url.js');
var _xhr = _dereq_('xhr');
var _xhr2 = _interopRequireDefault(_xhr);
var _utilsMergeOptions = _dereq_('../utils/merge-options');
var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
/**
* takes a webvtt file contents and parses it into cues
*
* @param {String} srcContent webVTT file contents
* @param {Track} track track to addcues to
*/
var parseCues = function parseCues(srcContent, track) {
var parser = new _globalWindow2['default'].WebVTT.Parser(_globalWindow2['default'], _globalWindow2['default'].vttjs, _globalWindow2['default'].WebVTT.StringDecoder());
var errors = [];
parser.oncue = function (cue) {
track.addCue(cue);
};
parser.onparsingerror = function (error) {
errors.push(error);
};
parser.onflush = function () {
track.trigger({
type: 'loadeddata',
target: track
});
};
parser.parse(srcContent);
if (errors.length > 0) {
if (console.groupCollapsed) {
console.groupCollapsed('Text Track parsing errors for ' + track.src);
}
errors.forEach(function (error) {
return _utilsLogJs2['default'].error(error);
});
if (console.groupEnd) {
console.groupEnd();
}
}
parser.flush();
};
/**
* load a track from a specifed url
*
* @param {String} src url to load track from
* @param {Track} track track to addcues to
*/
var loadTrack = function loadTrack(src, track) {
var opts = {
uri: src
};
var crossOrigin = _utilsUrlJs.isCrossOrigin(src);
if (crossOrigin) {
opts.cors = crossOrigin;
}
_xhr2['default'](opts, Fn.bind(this, function (err, response, responseBody) {
if (err) {
return _utilsLogJs2['default'].error(err, response);
}
track.loaded_ = true;
// Make sure that vttjs has loaded, otherwise, wait till it finished loading
// NOTE: this is only used for the alt/video.novtt.js build
if (typeof _globalWindow2['default'].WebVTT !== 'function') {
if (track.tech_) {
(function () {
var loadHandler = function loadHandler() {
return parseCues(responseBody, track);
};
track.tech_.on('vttjsloaded', loadHandler);
track.tech_.on('vttjserror', function () {
_utilsLogJs2['default'].error('vttjs failed to load, stopping trying to process ' + track.src);
track.tech_.off('vttjsloaded', loadHandler);
});
})();
}
} else {
parseCues(responseBody, track);
}
}));
};
/**
* A single text track as defined in:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#texttrack
*
* interface TextTrack : EventTarget {
* readonly attribute TextTrackKind kind;
* readonly attribute DOMString label;
* readonly attribute DOMString language;
*
* readonly attribute DOMString id;
* readonly attribute DOMString inBandMetadataTrackDispatchType;
*
* attribute TextTrackMode mode;
*
* readonly attribute TextTrackCueList? cues;
* readonly attribute TextTrackCueList? activeCues;
*
* void addCue(TextTrackCue cue);
* void removeCue(TextTrackCue cue);
*
* attribute EventHandler oncuechange;
* };
*
* @param {Object=} options Object of option names and values
* @extends Track
* @class TextTrack
*/
var TextTrack = (function (_Track) {
_inherits(TextTrack, _Track);
function TextTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, TextTrack);
if (!options.tech) {
throw new Error('A tech was not provided.');
}
var settings = _utilsMergeOptions2['default'](options, {
kind: _trackEnums.TextTrackKind[options.kind] || 'subtitles',
language: options.language || options.srclang || ''
});
var mode = _trackEnums.TextTrackMode[settings.mode] || 'disabled';
var default_ = settings['default'];
if (settings.kind === 'metadata' || settings.kind === 'chapters') {
mode = 'hidden';
}
// on IE8 this will be a document element
// for every other browser this will be a normal object
var tt = _Track.call(this, settings);
tt.tech_ = settings.tech;
if (browser.IS_IE8) {
for (var prop in TextTrack.prototype) {
if (prop !== 'constructor') {
tt[prop] = TextTrack.prototype[prop];
}
}
}
tt.cues_ = [];
tt.activeCues_ = [];
var cues = new _textTrackCueList2['default'](tt.cues_);
var activeCues = new _textTrackCueList2['default'](tt.activeCues_);
var changed = false;
var timeupdateHandler = Fn.bind(tt, function () {
this.activeCues;
if (changed) {
this.trigger('cuechange');
changed = false;
}
});
if (mode !== 'disabled') {
tt.tech_.on('timeupdate', timeupdateHandler);
}
Object.defineProperty(tt, 'default', {
get: function get() {
return default_;
},
set: function set() {}
});
Object.defineProperty(tt, 'mode', {
get: function get() {
return mode;
},
set: function set(newMode) {
if (!_trackEnums.TextTrackMode[newMode]) {
return;
}
mode = newMode;
if (mode === 'showing') {
this.tech_.on('timeupdate', timeupdateHandler);
}
this.trigger('modechange');
}
});
Object.defineProperty(tt, 'cues', {
get: function get() {
if (!this.loaded_) {
return null;
}
return cues;
},
set: function set() {}
});
Object.defineProperty(tt, 'activeCues', {
get: function get() {
if (!this.loaded_) {
return null;
}
// nothing to do
if (this.cues.length === 0) {
return activeCues;
}
var ct = this.tech_.currentTime();
var active = [];
for (var i = 0, l = this.cues.length; i < l; i++) {
var cue = this.cues[i];
if (cue.startTime <= ct && cue.endTime >= ct) {
active.push(cue);
} else if (cue.startTime === cue.endTime && cue.startTime <= ct && cue.startTime + 0.5 >= ct) {
active.push(cue);
}
}
changed = false;
if (active.length !== this.activeCues_.length) {
changed = true;
} else {
for (var i = 0; i < active.length; i++) {
if (this.activeCues_.indexOf(active[i]) === -1) {
changed = true;
}
}
}
this.activeCues_ = active;
activeCues.setCues_(this.activeCues_);
return activeCues;
},
set: function set() {}
});
if (settings.src) {
tt.src = settings.src;
loadTrack(settings.src, tt);
} else {
tt.loaded_ = true;
}
return tt;
}
/**
* cuechange - One or more cues in the track have become active or stopped being active.
*/
/**
* add a cue to the internal list of cues
*
* @param {Object} cue the cue to add to our internal list
* @method addCue
*/
TextTrack.prototype.addCue = function addCue(cue) {
var tracks = this.tech_.textTracks();
if (tracks) {
for (var i = 0; i < tracks.length; i++) {
if (tracks[i] !== this) {
tracks[i].removeCue(cue);
}
}
}
this.cues_.push(cue);
this.cues.setCues_(this.cues_);
};
/**
* remvoe a cue from our internal list
*
* @param {Object} removeCue the cue to remove from our internal list
* @method removeCue
*/
TextTrack.prototype.removeCue = function removeCue(_removeCue) {
var removed = false;
for (var i = 0, l = this.cues_.length; i < l; i++) {
var cue = this.cues_[i];
if (cue === _removeCue) {
this.cues_.splice(i, 1);
removed = true;
}
}
if (removed) {
this.cues.setCues_(this.cues_);
}
};
return TextTrack;
})(_trackJs2['default']);
TextTrack.prototype.allowedEvents_ = {
cuechange: 'cuechange'
};
exports['default'] = TextTrack;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdGV4dC10cmFjay5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Z0NBRzZCLHVCQUF1Qjs7Ozt5QkFDaEMsZ0JBQWdCOztJQUF4QixFQUFFOzswQkFDNkIsZUFBZTs7MEJBQzFDLGlCQUFpQjs7Ozs4QkFDWixpQkFBaUI7Ozs7NEJBQ25CLGVBQWU7Ozs7dUJBQ2hCLFlBQVk7Ozs7MEJBQ0EsaUJBQWlCOzttQkFDL0IsS0FBSzs7OztpQ0FDSCx3QkFBd0I7Ozs7OEJBQ2pCLHFCQUFxQjs7SUFBbEMsT0FBTzs7Ozs7Ozs7QUFRbkIsSUFBTSxTQUFTLEdBQUcsU0FBWixTQUFTLENBQVksVUFBVSxFQUFFLEtBQUssRUFBRTtBQUM1QyxNQUFJLE1BQU0sR0FBRyxJQUFJLDBCQUFPLE1BQU0sQ0FBQyxNQUFNLDRCQUNDLDBCQUFPLEtBQUssRUFDWiwwQkFBTyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztBQUNyRSxNQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7O0FBRWhCLFFBQU0sQ0FBQyxLQUFLLEdBQUcsVUFBUyxHQUFHLEVBQUU7QUFDM0IsU0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztHQUNuQixDQUFDOztBQUVGLFFBQU0sQ0FBQyxjQUFjLEdBQUcsVUFBUyxLQUFLLEVBQUU7QUFDdEMsVUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUNwQixDQUFDOztBQUVGLFFBQU0sQ0FBQyxPQUFPLEdBQUcsWUFBVztBQUMxQixTQUFLLENBQUMsT0FBTyxDQUFDO0FBQ1osVUFBSSxFQUFFLFlBQVk7QUFDbEIsWUFBTSxFQUFFLEtBQUs7S0FDZCxDQUFDLENBQUM7R0FDSixDQUFDOztBQUVGLFFBQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekIsTUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtBQUNyQixRQUFJLE9BQU8sQ0FBQyxjQUFj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QUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN4QixlQUFPLEdBQUcsSUFBSSxDQUFDO09BQ2hCO0tBQ0Y7O0FBRUQsUUFBSSxPQUFPLEVBQUU7QUFDWCxVQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDaEM7R0FDRjs7U0FuTEcsU0FBUzs7O0FBeUxmLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxHQUFHO0FBQ25DLFdBQVMsRUFBRSxXQUFXO0NBQ3ZCLENBQUM7O3FCQUVhLFNBQVMiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90ZXh0LXRyYWNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB0ZXh0LXRyYWNrLmpzXG4gKi9cbmltcG9ydCBUZXh0VHJhY2tDdWVMaXN0IGZyb20gJy4vdGV4dC10cmFjay1jdWUtbGlzdCc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi91dGlscy9mbi5qcyc7XG5pbXBvcnQge1RleHRUcmFja0tpbmQsIFRleHRUcmFja01vZGV9IGZyb20gJy4vdHJhY2stZW51bXMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IFRyYWNrIGZyb20gJy4vdHJhY2suanMnO1xuaW1wb3J0IHsgaXNDcm9zc09yaWdpbiB9IGZyb20gJy4uL3V0aWxzL3VybC5qcyc7XG5pbXBvcnQgWEhSIGZyb20gJ3hocic7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnLi4vdXRpbHMvbWVyZ2Utb3B0aW9ucyc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuXG4vKipcbiAqIHRha2VzIGEgd2VidnR0IGZpbGUgY29udGVudHMgYW5kIHBhcnNlcyBpdCBpbnRvIGN1ZXNcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3JjQ29udGVudCB3ZWJWVFQgZmlsZSBjb250ZW50c1xuICogQHBhcmFtIHtUcmFja30gdHJhY2sgdHJhY2sgdG8gYWRkY3VlcyB0b1xuICovXG5jb25zdCBwYXJzZUN1ZXMgPSBmdW5jdGlvbihzcmNDb250ZW50LCB0cmFjaykge1xuICBsZXQgcGFyc2VyID0gbmV3IHdpbmRvdy5XZWJWVFQuUGFyc2VyKHdpbmRvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudnR0anMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LldlYlZUVC5TdHJpbmdEZWNvZGVyKCkpO1xuICBsZXQgZXJyb3JzID0gW107XG5cbiAgcGFyc2VyLm9uY3VlID0gZnVuY3Rpb24oY3VlKSB7XG4gICAgdHJhY2suYWRkQ3VlKGN1ZSk7XG4gIH07XG5cbiAgcGFyc2VyLm9ucGFyc2luZ2Vycm9yID0gZnVuY3Rpb24oZXJyb3IpIHtcbiAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gIH07XG5cbiAgcGFyc2VyLm9uZmx1c2ggPSBmdW5jdGlvbigpIHtcbiAgICB0cmFjay50cmlnZ2VyKHtcbiAgICAgIHR5cGU6ICdsb2FkZWRkYXRhJyxcbiAgICAgIHRhcmdldDogdHJhY2tcbiAgICB9KTtcbiAgfTtcblxuICBwYXJzZXIucGFyc2Uoc3JjQ29udGVudCk7XG4gIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgIGlmIChjb25zb2xlLmdyb3VwQ29sbGFwc2VkKSB7XG4gICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKGBUZXh0IFRyYWNrIHBhcnNpbmcgZXJyb3JzIGZvciAke3RyYWNrLnNyY31gKTtcbiAgICB9XG4gICAgZXJyb3JzLmZvckVhY2goKGVycm9yKSA9PiBsb2cuZXJyb3IoZXJyb3IpKTtcbiAgICBpZiAoY29uc29sZS5ncm91cEVuZCkge1xuICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlci5mbHVzaCgpO1xufTtcblxuLyoqXG4gKiBsb2FkIGEgdHJhY2sgZnJvbSBhICBzcGVjaWZlZCB1cmxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3JjIHVybCB0byBsb2FkIHRyYWNrIGZyb21cbiAqIEBwYXJhbSB7VHJhY2t9IHRyYWNrIHRyYWNrIHRvIGFkZGN1ZXMgdG9cbiAqL1xuY29uc3QgbG9hZFRyYWNrID0gZnVuY3Rpb24oc3JjLCB0cmFjaykge1xuICBsZXQgb3B0cyA9IHtcbiAgICB1cmk6IHNyY1xuICB9O1xuICBsZXQgY3Jvc3NPcmlnaW4gPSBpc0Nyb3NzT3JpZ2luKHNyYyk7XG5cbiAgaWYgKGNyb3NzT3JpZ2luKSB7XG4gICAgb3B0cy5jb3JzID0gY3Jvc3NPcmlnaW47XG4gIH1cblxuICBYSFIob3B0cywgRm4uYmluZCh0aGlzLCBmdW5jdGlvbihlcnIsIHJlc3BvbnNlLCByZXNwb25zZUJvZHkpIHtcbiAgICBpZiAoZXJyKSB7XG4gICAgICByZXR1cm4gbG9nLmVycm9yKGVyciwgcmVzcG9uc2UpO1xuICAgIH1cblxuICAgIHRyYWNrLmxvYWRlZF8gPSB0cnVlO1xuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdnR0anMgaGFzIGxvYWRlZCwgb3RoZXJ3aXNlLCB3YWl0IHRpbGwgaXQgZmluaXNoZWQgbG9hZGluZ1xuICAgIC8vIE5PVEU6IHRoaXMgaXMgb25seSB1c2VkIGZvciB0aGUgYWx0L3ZpZGVvLm5vdnR0LmpzIGJ1aWxkXG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuV2ViVlRUICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAodHJhY2sudGVjaF8pIHtcbiAgICAgICAgbGV0IGxvYWRIYW5kbGVyID0gKCkgPT4gcGFyc2VDdWVzKHJlc3BvbnNlQm9keSwgdHJhY2spO1xuICAgICAgICB0cmFjay50ZWNoXy5vbigndnR0anNsb2FkZWQnLCBsb2FkSGFuZGxlcik7XG4gICAgICAgIHRyYWNrLnRlY2hfLm9uKCd2dHRqc2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcihgdnR0anMgZmFpbGVkIHRvIGxvYWQsIHN0b3BwaW5nIHRyeWluZyB0byBwcm9jZXNzICR7dHJhY2suc3JjfWApO1xuICAgICAgICAgIHRyYWNrLnRlY2hfLm9mZigndnR0anNsb2FkZWQnLCBsb2FkSGFuZGxlcik7XG4gICAgICAgIH0pO1xuXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnNlQ3VlcyhyZXNwb25zZUJvZHksIHRyYWNrKTtcbiAgICB9XG5cbiAgfSkpO1xufTtcblxuLyoqXG4gKiBBIHNpbmdsZSB0ZXh0IHRyYWNrIGFzIGRlZmluZWQgaW46XG4gKiBAbGluayBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbWJlZGRlZC1jb250ZW50Lmh0bWwjdGV4dHRyYWNrXG4gKlxuICogaW50ZXJmYWNlIFRleHRUcmFjayA6IEV2ZW50VGFyZ2V0IHtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIFRleHRUcmFja0tpbmQga2luZDtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYWJlbDtcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYW5ndWFnZTtcbiAqXG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaWQ7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaW5CYW5kTWV0YWRhdGFUcmFja0Rpc3BhdGNoVHlwZTtcbiAqXG4gKiAgIGF0dHJpYnV0ZSBUZXh0VHJhY2tNb2RlIG1vZGU7XG4gKlxuICogICByZWFkb25seSBhdHRyaWJ1dGUgVGV4dFRyYWNrQ3VlTGlzdD8gY3VlcztcbiAqICAgcmVhZG9ubHkgYXR0cmlidXRlIFRleHRUcmFja0N1ZUxpc3Q/IGFjdGl2ZUN1ZXM7XG4gKlxuICogICB2b2lkIGFkZEN1ZShUZXh0VHJhY2tDdWUgY3VlKTtcbiAqICAgdm9pZCByZW1vdmVDdWUoVGV4dFRyYWNrQ3VlIGN1ZSk7XG4gKlxuICogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uY3VlY2hhbmdlO1xuICogfTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAZXh0ZW5kcyBUcmFja1xuICogQGNsYXNzIFRleHRUcmFja1xuICovXG5jbGFzcyBUZXh0VHJhY2sgZXh0ZW5kcyBUcmFjayB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7fSkge1xuICAgIGlmICghb3B0aW9ucy50ZWNoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgdGVjaCB3YXMgbm90IHByb3ZpZGVkLicpO1xuICAgIH1cblxuICAgIGxldCBzZXR0aW5ncyA9IG1lcmdlKG9wdGlvbnMsIHtcbiAgICAgIGtpbmQ6IFRleHRUcmFja0tpbmRbb3B0aW9ucy5raW5kXSB8fCAnc3VidGl0bGVzJyxcbiAgICAgIGxhbmd1YWdlOiBvcHRpb25zLmxhbmd1YWdlIHx8IG9wdGlvbnMuc3JjbGFuZyB8fCAnJ1xuICAgIH0pO1xuICAgIGxldCBtb2RlID0gVGV4dFRyYWNrTW9kZVtzZXR0aW5ncy5tb2RlXSB8fCAnZGlzYWJsZWQnO1xuICAgIGxldCBkZWZhdWx0XyA9IHNldHRpbmdzLmRlZmF1bHQ7XG5cbiAgICBpZiAoc2V0dGluZ3Mua2luZCA9PT0gJ21ldGFkYXRhJyB8fCBzZXR0aW5ncy5raW5kID09PSAnY2hhcHRlcnMnKSB7XG4gICAgICBtb2RlID0gJ2hpZGRlbic7XG4gICAgfVxuICAgIC8vIG9uIElFOCB0aGlzIHdpbGwgYmUgYSBkb2N1bWVudCBlbGVtZW50XG4gICAgLy8gZm9yIGV2ZXJ5IG90aGVyIGJyb3dzZXIgdGhpcyB3aWxsIGJlIGEgbm9ybWFsIG9iamVjdFxuICAgIGxldCB0dCA9IHN1cGVyKHNldHRpbmdzKTtcbiAgICB0dC50ZWNoXyA9IHNldHRpbmdzLnRlY2g7XG5cbiAgICBpZiAoYnJvd3Nlci5JU19JRTgpIHtcbiAgICAgIGZvciAobGV0IHByb3AgaW4gVGV4dFRyYWNrLnByb3RvdHlwZSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICAgIHR0W3Byb3BdID0gVGV4dFRyYWNrLnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHR0LmN1ZXNfID0gW107XG4gICAgdHQuYWN0aXZlQ3Vlc18gPSBbXTtcblxuICAgIGxldCBjdWVzID0gbmV3IFRleHRUcmFja0N1ZUxpc3QodHQuY3Vlc18pO1xuICAgIGxldCBhY3RpdmVDdWVzID0gbmV3IFRleHRUcmFja0N1ZUxpc3QodHQuYWN0aXZlQ3Vlc18pO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWV1cGRhdGVIYW5kbGVyID0gRm4uYmluZCh0dCwgZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmFjdGl2ZUN1ZXM7XG4gICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2N1ZWNoYW5nZScpO1xuICAgICAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAobW9kZSAhPT0gJ2Rpc2FibGVkJykge1xuICAgICAgdHQudGVjaF8ub24oJ3RpbWV1cGRhdGUnLCB0aW1ldXBkYXRlSGFuZGxlcik7XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnZGVmYXVsdCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRfO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHt9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHQsICdtb2RlJywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gbW9kZTtcbiAgICAgIH0sXG4gICAgICBzZXQobmV3TW9kZSkge1xuICAgICAgICBpZiAoIVRleHRUcmFja01vZGVbbmV3TW9kZV0pIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbW9kZSA9IG5ld01vZGU7XG4gICAgICAgIGlmIChtb2RlID09PSAnc2hvd2luZycpIHtcbiAgICAgICAgICB0aGlzLnRlY2hfLm9uKCd0aW1ldXBkYXRlJywgdGltZXVwZGF0ZUhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHJpZ2dlcignbW9kZWNoYW5nZScpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR0LCAnY3VlcycsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxvYWRlZF8pIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjdWVzO1xuICAgICAgfSxcbiAgICAgIHNldCgpIHt9XG4gICAgfSk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHQsICdhY3RpdmVDdWVzJywge1xuICAgICAgZ2V0KCkge1xuICAgICAgICBpZiAoIXRoaXMubG9hZGVkXykge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbm90aGluZyB0byBkb1xuICAgICAgICBpZiAodGhpcy5jdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJldHVybiBhY3RpdmVDdWVzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN0ID0gdGhpcy50ZWNoXy5jdXJyZW50VGltZSgpO1xuICAgICAgICBsZXQgYWN0aXZlID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmN1ZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgbGV0IGN1ZSA9IHRoaXMuY3Vlc1tpXTtcblxuICAgICAgICAgIGlmIChjdWUuc3RhcnRUaW1lIDw9IGN0ICYmIGN1ZS5lbmRUaW1lID49IGN0KSB7XG4gICAgICAgICAgICBhY3RpdmUucHVzaChjdWUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLnN0YXJ0VGltZSA9PT0gY3VlLmVuZFRpbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgIGN1ZS5zdGFydFRpbWUgPD0gY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgIGN1ZS5zdGFydFRpbWUgKyAwLjUgPj0gY3QpIHtcbiAgICAgICAgICAgIGFjdGl2ZS5wdXNoKGN1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChhY3RpdmUubGVuZ3RoICE9PSB0aGlzLmFjdGl2ZUN1ZXNfLmxlbmd0aCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDdWVzXy5pbmRleE9mKGFjdGl2ZVtpXSkgPT09IC0xKSB7XG4gICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWN0aXZlQ3Vlc18gPSBhY3RpdmU7XG4gICAgICAgIGFjdGl2ZUN1ZXMuc2V0Q3Vlc18odGhpcy5hY3RpdmVDdWVzXyk7XG5cbiAgICAgICAgcmV0dXJuIGFjdGl2ZUN1ZXM7XG4gICAgICB9LFxuICAgICAgc2V0KCkge31cbiAgICB9KTtcblxuICAgIGlmIChzZXR0aW5ncy5zcmMpIHtcbiAgICAgIHR0LnNyYyA9IHNldHRpbmdzLnNyYztcbiAgICAgIGxvYWRUcmFjayhzZXR0aW5ncy5zcmMsIHR0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHQubG9hZGVkXyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHR0O1xuICB9XG5cbiAgLyoqXG4gICAqIGFkZCBhIGN1ZSB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBjdWVzXG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBjdWUgdGhlIGN1ZSB0byBhZGQgdG8gb3VyIGludGVybmFsIGxpc3RcbiAgICogQG1ldGhvZCBhZGRDdWVcbiAgICovXG4gIGFkZEN1ZShjdWUpIHtcbiAgICBsZXQgdHJhY2tzID0gdGhpcy50ZWNoXy50ZXh0VHJhY2tzKCk7XG5cbiAgICBpZiAodHJhY2tzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodHJhY2tzW2ldICE9PSB0aGlzKSB7XG4gICAgICAgICAgdHJhY2tzW2ldLnJlbW92ZUN1ZShjdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jdWVzXy5wdXNoKGN1ZSk7XG4gICAgdGhpcy5jdWVzLnNldEN1ZXNfKHRoaXMuY3Vlc18pO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlbXZvZSBhIGN1ZSBmcm9tIG91ciBpbnRlcm5hbCBsaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdmVDdWUgdGhlIGN1ZSB0byByZW1vdmUgZnJvbSBvdXIgaW50ZXJuYWwgbGlzdFxuICAgKiBAbWV0aG9kIHJlbW92ZUN1ZVxuICAgKi9cbiAgcmVtb3ZlQ3VlKHJlbW92ZUN1ZSkge1xuICAgIGxldCByZW1vdmVkID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRoaXMuY3Vlc18ubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZXQgY3VlID0gdGhpcy5jdWVzX1tpXTtcblxuICAgICAgaWYgKGN1ZSA9PT0gcmVtb3ZlQ3VlKSB7XG4gICAgICAgIHRoaXMuY3Vlc18uc3BsaWNlKGksIDEpO1xuICAgICAgICByZW1vdmVkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVtb3ZlZCkge1xuICAgICAgdGhpcy5jdWVzLnNldEN1ZXNfKHRoaXMuY3Vlc18pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIGN1ZWNoYW5nZSAtIE9uZSBvciBtb3JlIGN1ZXMgaW4gdGhlIHRyYWNrIGhhdmUgYmVjb21lIGFjdGl2ZSBvciBzdG9wcGVkIGJlaW5nIGFjdGl2ZS5cbiAqL1xuVGV4dFRyYWNrLnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgY3VlY2hhbmdlOiAnY3VlY2hhbmdlJ1xufTtcblxuZXhwb3J0IGRlZmF1bHQgVGV4dFRyYWNrO1xuIl19
},{"../utils/browser.js":141,"../utils/fn.js":146,"../utils/log.js":149,"../utils/merge-options":150,"../utils/url.js":154,"./text-track-cue-list":130,"./track-enums":136,"./track.js":138,"global/document":7,"global/window":8,"xhr":60}],136:[function(_dereq_,module,exports){
/**
* @file track-kinds.js
*/
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#dom-videotrack-kind
*
* enum VideoTrackKind {
* "alternative",
* "captions",
* "main",
* "sign",
* "subtitles",
* "commentary",
* "",
* };
*/
'use strict';
exports.__esModule = true;
var VideoTrackKind = {
alternative: 'alternative',
captions: 'captions',
main: 'main',
sign: 'sign',
subtitles: 'subtitles',
commentary: 'commentary'
};
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#dom-audiotrack-kind
*
* enum AudioTrackKind {
* "alternative",
* "descriptions",
* "main",
* "main-desc",
* "translation",
* "commentary",
* "",
* };
*/
var AudioTrackKind = {
alternative: 'alternative',
descriptions: 'descriptions',
main: 'main',
'main-desc': 'main-desc',
translation: 'translation',
commentary: 'commentary'
};
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackkind
*
* enum TextTrackKind {
* "subtitles",
* "captions",
* "descriptions",
* "chapters",
* "metadata"
* };
*/
var TextTrackKind = {
subtitles: 'subtitles',
captions: 'captions',
descriptions: 'descriptions',
chapters: 'chapters',
metadata: 'metadata'
};
/**
* https://html.spec.whatwg.org/multipage/embedded-content.html#texttrackmode
*
* enum TextTrackMode { "disabled", "hidden", "showing" };
*/
var TextTrackMode = {
disabled: 'disabled',
hidden: 'hidden',
showing: 'showing'
};
/* jshint ignore:start */
// we ignore jshint here because it does not see
// AudioTrackKind as defined here
exports['default'] = { VideoTrackKind: VideoTrackKind, AudioTrackKind: AudioTrackKind, TextTrackKind: TextTrackKind, TextTrackMode: TextTrackMode };
/* jshint ignore:end */
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdHJhY2stZW51bXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQkEsSUFBTSxjQUFjLEdBQUc7QUFDckIsYUFBVyxFQUFFLGFBQWE7QUFDMUIsVUFBUSxFQUFFLFVBQVU7QUFDcEIsTUFBSSxFQUFFLE1BQU07QUFDWixNQUFJLEVBQUUsTUFBTTtBQUNaLFdBQVMsRUFBRSxXQUFXO0FBQ3RCLFlBQVUsRUFBRSxZQUFZO0NBQ3pCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQWVGLElBQU0sY0FBYyxHQUFHO0FBQ3JCLGFBQVcsRUFBRSxhQUFhO0FBQzFCLGNBQVksRUFBRSxjQUFjO0FBQzVCLE1BQUksRUFBRSxNQUFNO0FBQ1osYUFBVyxFQUFFLFdBQVc7QUFDeEIsYUFBVyxFQUFFLGFBQWE7QUFDMUIsWUFBVSxFQUFFLFlBQVk7Q0FDekIsQ0FBQzs7Ozs7Ozs7Ozs7OztBQWFGLElBQU0sYUFBYSxHQUFHO0FBQ3BCLFdBQVMsRUFBRSxXQUFXO0FBQ3RCLFVBQVEsRUFBRSxVQUFVO0FBQ3BCLGNBQVksRUFBRSxjQUFjO0FBQzVCLFVBQVEsRUFBRSxVQUFVO0FBQ3BCLFVBQVEsRUFBRSxVQUFVO0NBQ3JCLENBQUM7Ozs7Ozs7QUFTRixJQUFNLGFBQWEsR0FBRztBQUNwQixVQUFRLEVBQUUsVUFBVTtBQUNwQixRQUFNLEVBQUUsUUFBUTtBQUNoQixTQUFPLEVBQUUsU0FBUztDQUNuQixDQUFDOzs7OztxQkFLYSxFQUFFLGNBQWMsRUFBZCxjQUFjLEVBQUUsY0FBYyxFQUFkLGNBQWMsRUFBRSxhQUFhLEVBQWIsYUFBYSxFQUFFLGFBQWEsRUFBYixhQUFhLEVBQUUiLCJmaWxlIjoic3JjL2pzL3RyYWNrcy90cmFjay1lbnVtcy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdHJhY2sta2luZHMuanNcbiAqL1xuXG4vKipcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tdmlkZW90cmFjay1raW5kXG4gKlxuICogZW51bSBWaWRlb1RyYWNrS2luZCB7XG4gKiAgIFwiYWx0ZXJuYXRpdmVcIixcbiAqICAgXCJjYXB0aW9uc1wiLFxuICogICBcIm1haW5cIixcbiAqICAgXCJzaWduXCIsXG4gKiAgIFwic3VidGl0bGVzXCIsXG4gKiAgIFwiY29tbWVudGFyeVwiLFxuICogICBcIlwiLFxuICogfTtcbiAqL1xuY29uc3QgVmlkZW9UcmFja0tpbmQgPSB7XG4gIGFsdGVybmF0aXZlOiAnYWx0ZXJuYXRpdmUnLFxuICBjYXB0aW9uczogJ2NhcHRpb25zJyxcbiAgbWFpbjogJ21haW4nLFxuICBzaWduOiAnc2lnbicsXG4gIHN1YnRpdGxlczogJ3N1YnRpdGxlcycsXG4gIGNvbW1lbnRhcnk6ICdjb21tZW50YXJ5Jyxcbn07XG5cbi8qKlxuICogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI2RvbS1hdWRpb3RyYWNrLWtpbmRcbiAqXG4gKiBlbnVtIEF1ZGlvVHJhY2tLaW5kIHtcbiAqICAgXCJhbHRlcm5hdGl2ZVwiLFxuICogICBcImRlc2NyaXB0aW9uc1wiLFxuICogICBcIm1haW5cIixcbiAqICAgXCJtYWluLWRlc2NcIixcbiAqICAgXCJ0cmFuc2xhdGlvblwiLFxuICogICBcImNvbW1lbnRhcnlcIixcbiAqICAgXCJcIixcbiAqIH07XG4gKi9cbmNvbnN0IEF1ZGlvVHJhY2tLaW5kID0ge1xuICBhbHRlcm5hdGl2ZTogJ2FsdGVybmF0aXZlJyxcbiAgZGVzY3JpcHRpb25zOiAnZGVzY3JpcHRpb25zJyxcbiAgbWFpbjogJ21haW4nLFxuICAnbWFpbi1kZXNjJzogJ21haW4tZGVzYycsXG4gIHRyYW5zbGF0aW9uOiAndHJhbnNsYXRpb24nLFxuICBjb21tZW50YXJ5OiAnY29tbWVudGFyeScsXG59O1xuXG4vKipcbiAqIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN0ZXh0dHJhY2traW5kXG4gKlxuICogZW51bSBUZXh0VHJhY2tLaW5kIHtcbiAqICAgXCJzdWJ0aXRsZXNcIixcbiAqICAgXCJjYXB0aW9uc1wiLFxuICogICBcImRlc2NyaXB0aW9uc1wiLFxuICogICBcImNoYXB0ZXJzXCIsXG4gKiAgIFwibWV0YWRhdGFcIlxuICogfTtcbiAqL1xuY29uc3QgVGV4dFRyYWNrS2luZCA9IHtcbiAgc3VidGl0bGVzOiAnc3VidGl0bGVzJyxcbiAgY2FwdGlvbnM6ICdjYXB0aW9ucycsXG4gIGRlc2NyaXB0aW9uczogJ2Rlc2NyaXB0aW9ucycsXG4gIGNoYXB0ZXJzOiAnY2hhcHRlcnMnLFxuICBtZXRhZGF0YTogJ21ldGFkYXRhJ1xufTtcblxuXG5cbi8qKlxuICogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3RleHR0cmFja21vZGVcbiAqXG4gKiBlbnVtIFRleHRUcmFja01vZGUgeyBcImRpc2FibGVkXCIsICBcImhpZGRlblwiLCAgXCJzaG93aW5nXCIgfTtcbiAqL1xuY29uc3QgVGV4dFRyYWNrTW9kZSA9IHtcbiAgZGlzYWJsZWQ6ICdkaXNhYmxlZCcsXG4gIGhpZGRlbjogJ2hpZGRlbicsXG4gIHNob3dpbmc6ICdzaG93aW5nJ1xufTtcblxuLyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuLy8gd2UgaWdub3JlIGpzaGludCBoZXJlIGJlY2F1c2UgaXQgZG9lcyBub3Qgc2VlXG4vLyBBdWRpb1RyYWNrS2luZCBhcyBkZWZpbmVkIGhlcmVcbmV4cG9ydCBkZWZhdWx0IHsgVmlkZW9UcmFja0tpbmQsIEF1ZGlvVHJhY2tLaW5kLCBUZXh0VHJhY2tLaW5kLCBUZXh0VHJhY2tNb2RlIH07XG4vKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXG4iXX0=
},{}],137:[function(_dereq_,module,exports){
/**
* @file track-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _utilsFnJs = _dereq_('../utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* Common functionaliy between Text, Audio, and Video TrackLists
* Interfaces defined in the following spec:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html
*
* @param {Track[]} tracks A list of tracks to initialize the list with
* @param {Object} list the child object with inheritance done manually for ie8
* @extends EventTarget
* @class TrackList
*/
var TrackList = (function (_EventTarget) {
_inherits(TrackList, _EventTarget);
function TrackList() {
var tracks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
var list = arguments.length <= 1 || arguments[1] === undefined ? null : arguments[1];
_classCallCheck(this, TrackList);
_EventTarget.call(this);
if (!list) {
list = this;
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in TrackList.prototype) {
if (prop !== 'constructor') {
list[prop] = TrackList.prototype[prop];
}
}
}
}
list.tracks_ = [];
Object.defineProperty(list, 'length', {
get: function get() {
return this.tracks_.length;
}
});
for (var i = 0; i < tracks.length; i++) {
list.addTrack_(tracks[i]);
}
return list;
}
/**
* change - One or more tracks in the track list have been enabled or disabled.
* addtrack - A track has been added to the track list.
* removetrack - A track has been removed from the track list.
*/
/**
* Add a Track from TrackList
*
* @param {Mixed} track
* @method addTrack_
* @private
*/
TrackList.prototype.addTrack_ = function addTrack_(track) {
var index = this.tracks_.length;
if (!('' + index in this)) {
Object.defineProperty(this, index, {
get: function get() {
return this.tracks_[index];
}
});
}
// Do not add duplicate tracks
if (this.tracks_.indexOf(track) === -1) {
this.tracks_.push(track);
this.trigger({
track: track,
type: 'addtrack'
});
}
};
/**
* Remove a Track from TrackList
*
* @param {Track} rtrack track to be removed
* @method removeTrack_
* @private
*/
TrackList.prototype.removeTrack_ = function removeTrack_(rtrack) {
var track = undefined;
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === rtrack) {
track = this[i];
if (track.off) {
track.off();
}
this.tracks_.splice(i, 1);
break;
}
}
if (!track) {
return;
}
this.trigger({
track: track,
type: 'removetrack'
});
};
/**
* Get a Track from the TrackList by a tracks id
*
* @param {String} id - the id of the track to get
* @method getTrackById
* @return {Track}
* @private
*/
TrackList.prototype.getTrackById = function getTrackById(id) {
var result = null;
for (var i = 0, l = this.length; i < l; i++) {
var track = this[i];
if (track.id === id) {
result = track;
break;
}
}
return result;
};
return TrackList;
})(_eventTarget2['default']);
TrackList.prototype.allowedEvents_ = {
change: 'change',
addtrack: 'addtrack',
removetrack: 'removetrack'
};
// emulate attribute EventHandler support to allow for feature detection
for (var _event in TrackList.prototype.allowedEvents_) {
TrackList.prototype['on' + _event] = null;
}
exports['default'] = TrackList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdHJhY2stbGlzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7MkJBR3dCLGlCQUFpQjs7Ozt5QkFDckIsZ0JBQWdCOztJQUF4QixFQUFFOzs4QkFDVyxxQkFBcUI7O0lBQWxDLE9BQU87OzhCQUNFLGlCQUFpQjs7Ozs7Ozs7Ozs7Ozs7O0lBWWhDLFNBQVM7WUFBVCxTQUFTOztBQUNGLFdBRFAsU0FBUyxHQUN5QjtRQUExQixNQUFNLHlEQUFHLEVBQUU7UUFBRSxJQUFJLHlEQUFHLElBQUk7OzBCQURoQyxTQUFTOztBQUVYLDJCQUFPLENBQUM7QUFDUixRQUFJLENBQUMsSUFBSSxFQUFFO0FBQ1QsVUFBSSxHQUFHLElBQUksQ0FBQztBQUNaLFVBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixZQUFJLEdBQUcsNEJBQVMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLGFBQUssSUFBSSxJQUFJLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTtBQUNwQyxjQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7QUFDMUIsZ0JBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1dBQ3hDO1NBQ0Y7T0FDRjtLQUNGOztBQUVELFFBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0FBQ2xCLFVBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNwQyxTQUFHLEVBQUEsZUFBRztBQUNKLGVBQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7T0FDNUI7S0FDRixDQUFDLENBQUM7O0FBRUgsU0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEMsVUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzQjs7QUFFRCxXQUFPLElBQUksQ0FBQztHQUNiOzs7Ozs7Ozs7Ozs7Ozs7O0FBM0JHLFdBQVMsV0FvQ2IsU0FBUyxHQUFBLG1CQUFDLEtBQUssRUFBRTtBQUNmLFFBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDOztBQUVoQyxRQUFJLEVBQUUsRUFBRSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUEsQUFBQyxFQUFFO0FBQ3pCLFlBQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtBQUNqQyxXQUFHLEVBQUEsZUFBRztBQUNKLGlCQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7T0FDRixDQUFDLENBQUM7S0FDSjs7O0FBR0QsUUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTtBQUN0QyxVQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN6QixVQUFJLENBQUMsT0FBTyxDQUFDO0FBQ1gsYUFBSyxFQUFMLEtBQUs7QUFDTCxZQUFJLEVBQUUsVUFBVTtPQUNqQixDQUFDLENBQUM7S0FDSjtHQUNGOzs7Ozs7Ozs7O0FBdkRHLFdBQVMsV0FnRWIsWUFBWSxHQUFBLHNCQUFDLE1BQU0sRUFBRTtBQUNuQixRQUFJLEtBQUssWUFBQSxDQUFDOztBQUVWLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsVUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxFQUFFO0FBQ3RCLGFBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDaEIsWUFBSSxLQUFLLENBQUMsR0FBRyxFQUFFO0FBQ2IsZUFBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1NBQ2I7O0FBRUQsWUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztBQUUxQixjQUFNO09BQ1A7S0FDRjs7QUFFRCxRQUFJLENBQUMsS0FBSyxFQUFFO0FBQ1YsYUFBTztLQUNSOztBQUVELFFBQUksQ0FBQyxPQUFPLENBQUM7QUFDWCxXQUFLLEVBQUwsS0FBSztBQUNMLFVBQUksRUFBRSxhQUFhO0tBQ3BCLENBQUMsQ0FBQztHQUNKOzs7Ozs7Ozs7OztBQXhGRyxXQUFTLFdBa0diLFlBQVksR0FBQSxzQkFBQyxFQUFFLEVBQUU7QUFDZixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7O0FBRWxCLFNBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDM0MsVUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BCLFVBQUksS0FBSyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUU7QUFDbkIsY0FBTSxHQUFHLEtBQUssQ0FBQztBQUNmLGNBQU07T0FDUDtLQUNGOztBQUVELFdBQU8sTUFBTSxDQUFDO0dBQ2Y7O1NBOUdHLFNBQVM7OztBQXNIZixTQUFTLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRztBQUNuQyxRQUFNLEVBQUUsUUFBUTtBQUNoQixVQUFRLEVBQUUsVUFBVTtBQUNwQixhQUFXLEVBQUUsYUFBYTtDQUMzQixDQUFDOzs7QUFHRixLQUFLLElBQUksTUFBSyxJQUFJLFNBQVMsQ0FBQyxTQUFTLENBQUMsY0FBYyxFQUFFO0FBQ3BELFdBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLE1BQUssQ0FBQyxHQUFHLElBQUksQ0FBQztDQUMxQzs7cUJBRWMsU0FBUyIsImZpbGUiOiJzcmMvanMvdHJhY2tzL3RyYWNrLWxpc3QuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRyYWNrLWxpc3QuanNcbiAqL1xuaW1wb3J0IEV2ZW50VGFyZ2V0IGZyb20gJy4uL2V2ZW50LXRhcmdldCc7XG5pbXBvcnQgKiBhcyBGbiBmcm9tICcuLi91dGlscy9mbi5qcyc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogQ29tbW9uIGZ1bmN0aW9uYWxpeSBiZXR3ZWVuIFRleHQsIEF1ZGlvLCBhbmQgVmlkZW8gVHJhY2tMaXN0c1xuICogSW50ZXJmYWNlcyBkZWZpbmVkIGluIHRoZSBmb2xsb3dpbmcgc3BlYzpcbiAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbFxuICpcbiAqIEBwYXJhbSB7VHJhY2tbXX0gdHJhY2tzIEEgbGlzdCBvZiB0cmFja3MgdG8gaW5pdGlhbGl6ZSB0aGUgbGlzdCB3aXRoXG4gKiBAcGFyYW0ge09iamVjdH0gbGlzdCB0aGUgY2hpbGQgb2JqZWN0IHdpdGggaW5oZXJpdGFuY2UgZG9uZSBtYW51YWxseSBmb3IgaWU4XG4gKiBAZXh0ZW5kcyBFdmVudFRhcmdldFxuICogQGNsYXNzIFRyYWNrTGlzdFxuICovXG5jbGFzcyBUcmFja0xpc3QgZXh0ZW5kcyBFdmVudFRhcmdldCB7XG4gIGNvbnN0cnVjdG9yKHRyYWNrcyA9IFtdLCBsaXN0ID0gbnVsbCkge1xuICAgIHN1cGVyKCk7XG4gICAgaWYgKCFsaXN0KSB7XG4gICAgICBsaXN0ID0gdGhpcztcbiAgICAgIGlmIChicm93c2VyLklTX0lFOCkge1xuICAgICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG4gICAgICAgIGZvciAobGV0IHByb3AgaW4gVHJhY2tMaXN0LnByb3RvdHlwZSkge1xuICAgICAgICAgIGlmIChwcm9wICE9PSAnY29uc3RydWN0b3InKSB7XG4gICAgICAgICAgICBsaXN0W3Byb3BdID0gVHJhY2tMaXN0LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsaXN0LnRyYWNrc18gPSBbXTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobGlzdCwgJ2xlbmd0aCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzXy5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7IGkrKykge1xuICAgICAgbGlzdC5hZGRUcmFja18odHJhY2tzW2ldKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGlzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBUcmFjayBmcm9tIFRyYWNrTGlzdFxuICAgKlxuICAgKiBAcGFyYW0ge01peGVkfSB0cmFja1xuICAgKiBAbWV0aG9kIGFkZFRyYWNrX1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgYWRkVHJhY2tfKHRyYWNrKSB7XG4gICAgbGV0IGluZGV4ID0gdGhpcy50cmFja3NfLmxlbmd0aDtcblxuICAgIGlmICghKCcnICsgaW5kZXggaW4gdGhpcykpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBpbmRleCwge1xuICAgICAgICBnZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tzX1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERvIG5vdCBhZGQgZHVwbGljYXRlIHRyYWNrc1xuICAgIGlmICh0aGlzLnRyYWNrc18uaW5kZXhPZih0cmFjaykgPT09IC0xKSB7XG4gICAgICB0aGlzLnRyYWNrc18ucHVzaCh0cmFjayk7XG4gICAgICB0aGlzLnRyaWdnZXIoe1xuICAgICAgICB0cmFjayxcbiAgICAgICAgdHlwZTogJ2FkZHRyYWNrJ1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIFRyYWNrIGZyb20gVHJhY2tMaXN0XG4gICAqXG4gICAqIEBwYXJhbSB7VHJhY2t9IHJ0cmFjayB0cmFjayB0byBiZSByZW1vdmVkXG4gICAqIEBtZXRob2QgcmVtb3ZlVHJhY2tfXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZW1vdmVUcmFja18ocnRyYWNrKSB7XG4gICAgbGV0IHRyYWNrO1xuXG4gICAgZm9yIChsZXQgaSA9IDAsIGwgPSB0aGlzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgaWYgKHRoaXNbaV0gPT09IHJ0cmFjaykge1xuICAgICAgICB0cmFjayA9IHRoaXNbaV07XG4gICAgICAgIGlmICh0cmFjay5vZmYpIHtcbiAgICAgICAgICB0cmFjay5vZmYoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudHJhY2tzXy5zcGxpY2UoaSwgMSk7XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF0cmFjaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudHJpZ2dlcih7XG4gICAgICB0cmFjayxcbiAgICAgIHR5cGU6ICdyZW1vdmV0cmFjaydcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBUcmFjayBmcm9tIHRoZSBUcmFja0xpc3QgYnkgYSB0cmFja3MgaWRcbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IGlkIC0gdGhlIGlkIG9mIHRoZSB0cmFjayB0byBnZXRcbiAgICogQG1ldGhvZCBnZXRUcmFja0J5SWRcbiAgICogQHJldHVybiB7VHJhY2t9XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRUcmFja0J5SWQoaWQpIHtcbiAgICBsZXQgcmVzdWx0ID0gbnVsbDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBsID0gdGhpcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGxldCB0cmFjayA9IHRoaXNbaV07XG4gICAgICBpZiAodHJhY2suaWQgPT09IGlkKSB7XG4gICAgICAgIHJlc3VsdCA9IHRyYWNrO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbi8qKlxuICogY2hhbmdlIC0gT25lIG9yIG1vcmUgdHJhY2tzIGluIHRoZSB0cmFjayBsaXN0IGhhdmUgYmVlbiBlbmFibGVkIG9yIGRpc2FibGVkLlxuICogYWRkdHJhY2sgLSBBIHRyYWNrIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB0cmFjayBsaXN0LlxuICogcmVtb3ZldHJhY2sgLSBBIHRyYWNrIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2sgbGlzdC5cbiAqL1xuVHJhY2tMaXN0LnByb3RvdHlwZS5hbGxvd2VkRXZlbnRzXyA9IHtcbiAgY2hhbmdlOiAnY2hhbmdlJyxcbiAgYWRkdHJhY2s6ICdhZGR0cmFjaycsXG4gIHJlbW92ZXRyYWNrOiAncmVtb3ZldHJhY2snXG59O1xuXG4vLyBlbXVsYXRlIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgc3VwcG9ydCB0byBhbGxvdyBmb3IgZmVhdHVyZSBkZXRlY3Rpb25cbmZvciAobGV0IGV2ZW50IGluIFRyYWNrTGlzdC5wcm90b3R5cGUuYWxsb3dlZEV2ZW50c18pIHtcbiAgVHJhY2tMaXN0LnByb3RvdHlwZVsnb24nICsgZXZlbnRdID0gbnVsbDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhY2tMaXN0O1xuIl19
},{"../event-target":104,"../utils/browser.js":141,"../utils/fn.js":146,"global/document":7}],138:[function(_dereq_,module,exports){
/**
* @file track.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _utilsGuidJs = _dereq_('../utils/guid.js');
var Guid = _interopRequireWildcard(_utilsGuidJs);
var _eventTarget = _dereq_('../event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
/**
* setup the common parts of an audio, video, or text track
* @link https://html.spec.whatwg.org/multipage/embedded-content.html
*
* @param {String} type The type of track we are dealing with audio|video|text
* @param {Object=} options Object of option names and values
* @extends EventTarget
* @class Track
*/
var Track = (function (_EventTarget) {
_inherits(Track, _EventTarget);
function Track() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, Track);
_EventTarget.call(this);
var track = this;
if (browser.IS_IE8) {
track = _globalDocument2['default'].createElement('custom');
for (var prop in Track.prototype) {
if (prop !== 'constructor') {
track[prop] = Track.prototype[prop];
}
}
}
var trackProps = {
id: options.id || 'vjs_track_' + Guid.newGUID(),
kind: options.kind || '',
label: options.label || '',
language: options.language || ''
};
var _loop = function (key) {
Object.defineProperty(track, key, {
get: function get() {
return trackProps[key];
},
set: function set() {}
});
};
for (var key in trackProps) {
_loop(key);
}
return track;
}
return Track;
})(_eventTarget2['default']);
exports['default'] = Track;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdHJhY2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OzhCQUd5QixxQkFBcUI7O0lBQWxDLE9BQU87OzhCQUNFLGlCQUFpQjs7OzsyQkFDaEIsa0JBQWtCOztJQUE1QixJQUFJOzsyQkFDUSxpQkFBaUI7Ozs7Ozs7Ozs7Ozs7O0lBV25DLEtBQUs7WUFBTCxLQUFLOztBQUNFLFdBRFAsS0FBSyxHQUNpQjtRQUFkLE9BQU8seURBQUcsRUFBRTs7MEJBRHBCLEtBQUs7O0FBRVAsMkJBQU8sQ0FBQzs7QUFFUixRQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7QUFDakIsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLFdBQUssR0FBRyw0QkFBUyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDekMsV0FBSyxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsU0FBUyxFQUFFO0FBQ2hDLFlBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUMxQixlQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQztPQUNGO0tBQ0Y7O0FBRUQsUUFBSSxVQUFVLEdBQUc7QUFDZixRQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRTtBQUMvQyxVQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFO0FBQ3hCLFdBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLEVBQUU7QUFDMUIsY0FBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksRUFBRTtLQUNqQyxDQUFDOzswQkFFTyxHQUFHO0FBQ1YsWUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFO0FBQ2hDLFdBQUcsRUFBQSxlQUFHO0FBQUUsaUJBQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQUU7QUFDakMsV0FBRyxFQUFBLGVBQUcsRUFBRTtPQUNULENBQUMsQ0FBQzs7O0FBSkwsU0FBSyxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUU7WUFBbkIsR0FBRztLQUtYOztBQUVELFdBQU8sS0FBSyxDQUFDO0dBQ2Q7O1NBN0JHLEtBQUs7OztxQkFnQ0ksS0FBSyIsImZpbGUiOiJzcmMvanMvdHJhY2tzL3RyYWNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB0cmFjay5qc1xuICovXG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgKiBhcyBHdWlkIGZyb20gJy4uL3V0aWxzL2d1aWQuanMnO1xuaW1wb3J0IEV2ZW50VGFyZ2V0IGZyb20gJy4uL2V2ZW50LXRhcmdldCc7XG5cbi8qKlxuICogc2V0dXAgdGhlIGNvbW1vbiBwYXJ0cyBvZiBhbiBhdWRpbywgdmlkZW8sIG9yIHRleHQgdHJhY2tcbiAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIFRoZSB0eXBlIG9mIHRyYWNrIHdlIGFyZSBkZWFsaW5nIHdpdGggYXVkaW98dmlkZW98dGV4dFxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zIE9iamVjdCBvZiBvcHRpb24gbmFtZXMgYW5kIHZhbHVlc1xuICogQGV4dGVuZHMgRXZlbnRUYXJnZXRcbiAqIEBjbGFzcyBUcmFja1xuICovXG5jbGFzcyBUcmFjayBleHRlbmRzIEV2ZW50VGFyZ2V0IHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGxldCB0cmFjayA9IHRoaXM7XG4gICAgaWYgKGJyb3dzZXIuSVNfSUU4KSB7XG4gICAgICB0cmFjayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2N1c3RvbScpO1xuICAgICAgZm9yIChsZXQgcHJvcCBpbiBUcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0cmFja1twcm9wXSA9IFRyYWNrLnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGxldCB0cmFja1Byb3BzID0ge1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgfHwgJ3Zqc190cmFja18nICsgR3VpZC5uZXdHVUlEKCksXG4gICAgICBraW5kOiBvcHRpb25zLmtpbmQgfHwgJycsXG4gICAgICBsYWJlbDogb3B0aW9ucy5sYWJlbCB8fCAnJyxcbiAgICAgIGxhbmd1YWdlOiBvcHRpb25zLmxhbmd1YWdlIHx8ICcnXG4gICAgfTtcblxuICAgIGZvciAobGV0IGtleSBpbiB0cmFja1Byb3BzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHJhY2ssIGtleSwge1xuICAgICAgICBnZXQoKSB7IHJldHVybiB0cmFja1Byb3BzW2tleV07IH0sXG4gICAgICAgIHNldCgpIHt9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhY2s7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVHJhY2s7XG4iXX0=
},{"../event-target":104,"../utils/browser.js":141,"../utils/guid.js":148,"global/document":7}],139:[function(_dereq_,module,exports){
/**
* @file video-track-list.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackList = _dereq_('./track-list');
var _trackList2 = _interopRequireDefault(_trackList);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* disable other video tracks before selecting the new one
*
* @param {Array|VideoTrackList} list list to work on
* @param {VideoTrack} track the track to skip
*/
var disableOthers = function disableOthers(list, track) {
for (var i = 0; i < list.length; i++) {
if (track.id === list[i].id) {
continue;
}
// another audio track is enabled, disable it
list[i].selected = false;
}
};
/**
* A list of possiblee video tracks. Most functionality is in the
* base class Tracklist and the spec for VideoTrackList is located at:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotracklist
*
* interface VideoTrackList : EventTarget {
* readonly attribute unsigned long length;
* getter VideoTrack (unsigned long index);
* VideoTrack? getTrackById(DOMString id);
* readonly attribute long selectedIndex;
*
* attribute EventHandler onchange;
* attribute EventHandler onaddtrack;
* attribute EventHandler onremovetrack;
* };
*
* @param {VideoTrack[]} tracks a list of video tracks to instantiate the list with
# @extends TrackList
* @class VideoTrackList
*/
var VideoTrackList = (function (_TrackList) {
_inherits(VideoTrackList, _TrackList);
function VideoTrackList() {
var tracks = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0];
_classCallCheck(this, VideoTrackList);
var list = undefined;
// make sure only 1 track is enabled
// sorted from last index to first index
for (var i = tracks.length - 1; i >= 0; i--) {
if (tracks[i].selected) {
disableOthers(tracks, tracks[i]);
break;
}
}
// IE8 forces us to implement inheritance ourselves
// as it does not support Object.defineProperty properly
if (browser.IS_IE8) {
list = _globalDocument2['default'].createElement('custom');
for (var prop in _trackList2['default'].prototype) {
if (prop !== 'constructor') {
list[prop] = _trackList2['default'].prototype[prop];
}
}
for (var prop in VideoTrackList.prototype) {
if (prop !== 'constructor') {
list[prop] = VideoTrackList.prototype[prop];
}
}
}
list = _TrackList.call(this, tracks, list);
list.changing_ = false;
Object.defineProperty(list, 'selectedIndex', {
get: function get() {
for (var i = 0; i < this.length; i++) {
if (this[i].selected) {
return i;
}
}
return -1;
},
set: function set() {}
});
return list;
}
VideoTrackList.prototype.addTrack_ = function addTrack_(track) {
var _this = this;
if (track.selected) {
disableOthers(this, track);
}
_TrackList.prototype.addTrack_.call(this, track);
// native tracks don't have this
if (!track.addEventListener) {
return;
}
track.addEventListener('selectedchange', function () {
if (_this.changing_) {
return;
}
_this.changing_ = true;
disableOthers(_this, track);
_this.changing_ = false;
_this.trigger('change');
});
};
VideoTrackList.prototype.addTrack = function addTrack(track) {
this.addTrack_(track);
};
VideoTrackList.prototype.removeTrack = function removeTrack(track) {
_TrackList.prototype.removeTrack_.call(this, track);
};
return VideoTrackList;
})(_trackList2['default']);
exports['default'] = VideoTrackList;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdmlkZW8tdHJhY2stbGlzdC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7eUJBR3NCLGNBQWM7Ozs7OEJBQ1gscUJBQXFCOztJQUFsQyxPQUFPOzs4QkFDRSxpQkFBaUI7Ozs7Ozs7Ozs7QUFRdEMsSUFBTSxhQUFhLEdBQUcsU0FBaEIsYUFBYSxDQUFZLElBQUksRUFBRSxLQUFLLEVBQUU7QUFDMUMsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDcEMsUUFBSSxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDM0IsZUFBUztLQUNWOztBQUVELFFBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO0dBQzFCO0NBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFzQkksY0FBYztZQUFkLGNBQWM7O0FBRVAsV0FGUCxjQUFjLEdBRU87UUFBYixNQUFNLHlEQUFHLEVBQUU7OzBCQUZuQixjQUFjOztBQUdoQixRQUFJLElBQUksWUFBQSxDQUFDOzs7O0FBSVQsU0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO0FBQzNDLFVBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRTtBQUN0QixxQkFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNqQyxjQUFNO09BQ1A7S0FDRjs7OztBQUlELFFBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtBQUNsQixVQUFJLEdBQUcsNEJBQVMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hDLFdBQUssSUFBSSxJQUFJLElBQUksdUJBQVUsU0FBUyxFQUFFO0FBQ3BDLFlBQUksSUFBSSxLQUFLLGFBQWEsRUFBRTtBQUMxQixjQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsdUJBQVUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3hDO09BQ0Y7QUFDRCxXQUFLLElBQUksSUFBSSxJQUFJLGNBQWMsQ0FBQyxTQUFTLEVBQUU7QUFDekMsWUFBSSxJQUFJLEtBQUssYUFBYSxFQUFFO0FBQzFCLGNBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdDO09BQ0Y7S0FDRjs7QUFFRCxRQUFJLEdBQUcsc0JBQU0sTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzNCLFFBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDOztBQUV2QixVQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUU7QUFDM0MsU0FBRyxFQUFBLGVBQUc7QUFDSixhQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUNwQyxjQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUU7QUFDcEIsbUJBQU8sQ0FBQyxDQUFDO1dBQ1Y7U0FDRjtBQUNELGVBQU8sQ0FBQyxDQUFDLENBQUM7T0FDWDtBQUNELFNBQUcsRUFBQSxlQUFHLEVBQUU7S0FDVCxDQUFDLENBQUM7O0FBRUgsV0FBTyxJQUFJLENBQUM7R0FDYjs7QUE5Q0csZ0JBQWMsV0FnRGxCLFNBQVMsR0FBQSxtQkFBQyxLQUFLLEVBQUU7OztBQUNmLFFBQUksS0FBSyxDQUFDLFFBQVEsRUFBRTtBQUNsQixtQkFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUM1Qjs7QUFFRCx5QkFBTSxTQUFTLEtBQUEsT0FBQyxLQUFLLENBQUMsQ0FBQzs7QUFFdkIsUUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtBQUMzQixhQUFPO0tBQ1I7QUFDRCxTQUFLLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUUsWUFBTTtBQUM3QyxVQUFJLE1BQUssU0FBUyxFQUFFO0FBQ2xCLGVBQU87T0FDUjtBQUNELFlBQUssU0FBUyxHQUFHLElBQUksQ0FBQztBQUN0QixtQkFBYSxRQUFPLEtBQUssQ0FBQyxDQUFDO0FBQzNCLFlBQUssU0FBUyxHQUFHLEtBQUssQ0FBQztBQUN2QixZQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN4QixDQUFDLENBQUM7R0FDSjs7QUFuRUcsZ0JBQWMsV0FxRWxCLFFBQVEsR0FBQSxrQkFBQyxLQUFLLEVBQUU7QUFDZCxRQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3ZCOztBQXZFRyxnQkFBYyxXQXlFbEIsV0FBVyxHQUFBLHFCQUFDLEtBQUssRUFBRTtBQUNqQix5QkFBTSxZQUFZLEtBQUEsT0FBQyxLQUFLLENBQUMsQ0FBQztHQUMzQjs7U0EzRUcsY0FBYzs7O3FCQStFTCxjQUFjIiwiZmlsZSI6InNyYy9qcy90cmFja3MvdmlkZW8tdHJhY2stbGlzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdmlkZW8tdHJhY2stbGlzdC5qc1xuICovXG5pbXBvcnQgVHJhY2tMaXN0IGZyb20gJy4vdHJhY2stbGlzdCc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5cbi8qKlxuICogZGlzYWJsZSBvdGhlciB2aWRlbyB0cmFja3MgYmVmb3JlIHNlbGVjdGluZyB0aGUgbmV3IG9uZVxuICpcbiAqIEBwYXJhbSB7QXJyYXl8VmlkZW9UcmFja0xpc3R9IGxpc3QgbGlzdCB0byB3b3JrIG9uXG4gKiBAcGFyYW0ge1ZpZGVvVHJhY2t9IHRyYWNrIHRoZSB0cmFjayB0byBza2lwXG4gKi9cbmNvbnN0IGRpc2FibGVPdGhlcnMgPSBmdW5jdGlvbihsaXN0LCB0cmFjaykge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodHJhY2suaWQgPT09IGxpc3RbaV0uaWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyBhbm90aGVyIGF1ZGlvIHRyYWNrIGlzIGVuYWJsZWQsIGRpc2FibGUgaXRcbiAgICBsaXN0W2ldLnNlbGVjdGVkID0gZmFsc2U7XG4gIH1cbn07XG5cbi8qKlxuKiBBIGxpc3Qgb2YgcG9zc2libGVlIHZpZGVvIHRyYWNrcy4gTW9zdCBmdW5jdGlvbmFsaXR5IGlzIGluIHRoZVxuICogYmFzZSBjbGFzcyBUcmFja2xpc3QgYW5kIHRoZSBzcGVjIGZvciBWaWRlb1RyYWNrTGlzdCBpcyBsb2NhdGVkIGF0OlxuICogQGxpbmsgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0XG4gKlxuICogaW50ZXJmYWNlIFZpZGVvVHJhY2tMaXN0IDogRXZlbnRUYXJnZXQge1xuICogICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7XG4gKiAgIGdldHRlciBWaWRlb1RyYWNrICh1bnNpZ25lZCBsb25nIGluZGV4KTtcbiAqICAgVmlkZW9UcmFjaz8gZ2V0VHJhY2tCeUlkKERPTVN0cmluZyBpZCk7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIHNlbGVjdGVkSW5kZXg7XG4gKlxuICogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uY2hhbmdlO1xuICogICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uYWRkdHJhY2s7XG4gKiAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25yZW1vdmV0cmFjaztcbiAqIH07XG4gKlxuICogQHBhcmFtIHtWaWRlb1RyYWNrW119IHRyYWNrcyBhIGxpc3Qgb2YgdmlkZW8gdHJhY2tzIHRvIGluc3RhbnRpYXRlIHRoZSBsaXN0IHdpdGhcbiAjIEBleHRlbmRzIFRyYWNrTGlzdFxuICogQGNsYXNzIFZpZGVvVHJhY2tMaXN0XG4gKi9cbmNsYXNzIFZpZGVvVHJhY2tMaXN0IGV4dGVuZHMgVHJhY2tMaXN0IHtcblxuICBjb25zdHJ1Y3Rvcih0cmFja3MgPSBbXSkge1xuICAgIGxldCBsaXN0O1xuXG4gICAgLy8gbWFrZSBzdXJlIG9ubHkgMSB0cmFjayBpcyBlbmFibGVkXG4gICAgLy8gc29ydGVkIGZyb20gbGFzdCBpbmRleCB0byBmaXJzdCBpbmRleFxuICAgIGZvciAobGV0IGkgPSB0cmFja3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmICh0cmFja3NbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgZGlzYWJsZU90aGVycyh0cmFja3MsIHRyYWNrc1tpXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElFOCBmb3JjZXMgdXMgdG8gaW1wbGVtZW50IGluaGVyaXRhbmNlIG91cnNlbHZlc1xuICAgIC8vIGFzIGl0IGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LmRlZmluZVByb3BlcnR5IHByb3Blcmx5XG4gICAgaWYgKGJyb3dzZXIuSVNfSUU4KSB7XG4gICAgICBsaXN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY3VzdG9tJyk7XG4gICAgICBmb3IgKGxldCBwcm9wIGluIFRyYWNrTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVHJhY2tMaXN0LnByb3RvdHlwZVtwcm9wXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChsZXQgcHJvcCBpbiBWaWRlb1RyYWNrTGlzdC5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICBsaXN0W3Byb3BdID0gVmlkZW9UcmFja0xpc3QucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGlzdCA9IHN1cGVyKHRyYWNrcywgbGlzdCk7XG4gICAgbGlzdC5jaGFuZ2luZ18gPSBmYWxzZTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShsaXN0LCAnc2VsZWN0ZWRJbmRleCcsIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKHRoaXNbaV0uc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICB9LFxuICAgICAgc2V0KCkge31cbiAgICB9KTtcblxuICAgIHJldHVybiBsaXN0O1xuICB9XG5cbiAgYWRkVHJhY2tfKHRyYWNrKSB7XG4gICAgaWYgKHRyYWNrLnNlbGVjdGVkKSB7XG4gICAgICBkaXNhYmxlT3RoZXJzKHRoaXMsIHRyYWNrKTtcbiAgICB9XG5cbiAgICBzdXBlci5hZGRUcmFja18odHJhY2spO1xuICAgIC8vIG5hdGl2ZSB0cmFja3MgZG9uJ3QgaGF2ZSB0aGlzXG4gICAgaWYgKCF0cmFjay5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGVkY2hhbmdlJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2hhbmdpbmdfKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hhbmdpbmdfID0gdHJ1ZTtcbiAgICAgIGRpc2FibGVPdGhlcnModGhpcywgdHJhY2spO1xuICAgICAgdGhpcy5jaGFuZ2luZ18gPSBmYWxzZTtcbiAgICAgIHRoaXMudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgfSk7XG4gIH1cblxuICBhZGRUcmFjayh0cmFjaykge1xuICAgIHRoaXMuYWRkVHJhY2tfKHRyYWNrKTtcbiAgfVxuXG4gIHJlbW92ZVRyYWNrKHRyYWNrKSB7XG4gICAgc3VwZXIucmVtb3ZlVHJhY2tfKHRyYWNrKTtcbiAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFZpZGVvVHJhY2tMaXN0O1xuIl19
},{"../utils/browser.js":141,"./track-list":137,"global/document":7}],140:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var _trackEnums = _dereq_('./track-enums');
var _track = _dereq_('./track');
var _track2 = _interopRequireDefault(_track);
var _utilsMergeOptions = _dereq_('../utils/merge-options');
var _utilsMergeOptions2 = _interopRequireDefault(_utilsMergeOptions);
var _utilsBrowserJs = _dereq_('../utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
/**
* A single video text track as defined in:
* @link https://html.spec.whatwg.org/multipage/embedded-content.html#videotrack
*
* interface VideoTrack {
* readonly attribute DOMString id;
* readonly attribute DOMString kind;
* readonly attribute DOMString label;
* readonly attribute DOMString language;
* attribute boolean selected;
* };
*
* @param {Object=} options Object of option names and values
* @class VideoTrack
*/
var VideoTrack = (function (_Track) {
_inherits(VideoTrack, _Track);
function VideoTrack() {
var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
_classCallCheck(this, VideoTrack);
var settings = _utilsMergeOptions2['default'](options, {
kind: _trackEnums.VideoTrackKind[options.kind] || ''
});
// on IE8 this will be a document element
// for every other browser this will be a normal object
var track = _Track.call(this, settings);
var selected = false;
if (browser.IS_IE8) {
for (var prop in VideoTrack.prototype) {
if (prop !== 'constructor') {
track[prop] = VideoTrack.prototype[prop];
}
}
}
Object.defineProperty(track, 'selected', {
get: function get() {
return selected;
},
set: function set(newSelected) {
// an invalid or unchanged value
if (typeof newSelected !== 'boolean' || newSelected === selected) {
return;
}
selected = newSelected;
this.trigger('selectedchange');
}
});
// if the user sets this track to selected then
// set selected to that true value otherwise
// we keep it false
if (settings.selected) {
track.selected = settings.selected;
}
return track;
}
return VideoTrack;
})(_track2['default']);
exports['default'] = VideoTrack;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy90cmFja3MvdmlkZW8tdHJhY2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OzBCQUE2QixlQUFlOztxQkFDMUIsU0FBUzs7OztpQ0FDVCx3QkFBd0I7Ozs7OEJBQ2pCLHFCQUFxQjs7SUFBbEMsT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBaUJiLFVBQVU7WUFBVixVQUFVOztBQUNILFdBRFAsVUFBVSxHQUNZO1FBQWQsT0FBTyx5REFBRyxFQUFFOzswQkFEcEIsVUFBVTs7QUFFWixRQUFJLFFBQVEsR0FBRywrQkFBTSxPQUFPLEVBQUU7QUFDNUIsVUFBSSxFQUFFLDJCQUFlLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO0tBQ3pDLENBQUMsQ0FBQzs7OztBQUlILFFBQUksS0FBSyxHQUFHLGtCQUFNLFFBQVEsQ0FBQyxDQUFDO0FBQzVCLFFBQUksUUFBUSxHQUFHLEtBQUssQ0FBQzs7QUFFckIsUUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFO0FBQ2xCLFdBQUssSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRTtBQUNyQyxZQUFJLElBQUksS0FBSyxhQUFhLEVBQUU7QUFDMUIsZUFBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7T0FDRjtLQUNGOztBQUVELFVBQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRTtBQUN2QyxTQUFHLEVBQUEsZUFBRztBQUFFLGVBQU8sUUFBUSxDQUFDO09BQUU7QUFDMUIsU0FBRyxFQUFBLGFBQUMsV0FBVyxFQUFFOztBQUVmLFlBQUksT0FBTyxXQUFXLEtBQUssU0FBUyxJQUFJLFdBQVcsS0FBSyxRQUFRLEVBQUU7QUFDaEUsaUJBQU87U0FDUjtBQUNELGdCQUFRLEdBQUcsV0FBVyxDQUFDO0FBQ3ZCLFlBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztPQUNoQztLQUNGLENBQUMsQ0FBQzs7Ozs7QUFLSCxRQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUU7QUFDckIsV0FBSyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO0tBQ3BDOztBQUVELFdBQU8sS0FBSyxDQUFDO0dBQ2Q7O1NBdkNHLFVBQVU7OztxQkEwQ0QsVUFBVSIsImZpbGUiOiJzcmMvanMvdHJhY2tzL3ZpZGVvLXRyYWNrLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtWaWRlb1RyYWNrS2luZH0gZnJvbSAnLi90cmFjay1lbnVtcyc7XG5pbXBvcnQgVHJhY2sgZnJvbSAnLi90cmFjayc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnLi4vdXRpbHMvbWVyZ2Utb3B0aW9ucyc7XG5pbXBvcnQgKiBhcyBicm93c2VyIGZyb20gJy4uL3V0aWxzL2Jyb3dzZXIuanMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIHZpZGVvIHRleHQgdHJhY2sgYXMgZGVmaW5lZCBpbjpcbiAqIEBsaW5rIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2VtYmVkZGVkLWNvbnRlbnQuaHRtbCN2aWRlb3RyYWNrXG4gKlxuICogaW50ZXJmYWNlIFZpZGVvVHJhY2sge1xuICogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGlkO1xuICogICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGtpbmQ7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbGFiZWw7XG4gKiAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbGFuZ3VhZ2U7XG4gKiAgIGF0dHJpYnV0ZSBib29sZWFuIHNlbGVjdGVkO1xuICogfTtcbiAqXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT2JqZWN0IG9mIG9wdGlvbiBuYW1lcyBhbmQgdmFsdWVzXG4gKiBAY2xhc3MgVmlkZW9UcmFja1xuICovXG5jbGFzcyBWaWRlb1RyYWNrIGV4dGVuZHMgVHJhY2sge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBsZXQgc2V0dGluZ3MgPSBtZXJnZShvcHRpb25zLCB7XG4gICAgICBraW5kOiBWaWRlb1RyYWNrS2luZFtvcHRpb25zLmtpbmRdIHx8ICcnXG4gICAgfSk7XG5cbiAgICAvLyBvbiBJRTggdGhpcyB3aWxsIGJlIGEgZG9jdW1lbnQgZWxlbWVudFxuICAgIC8vIGZvciBldmVyeSBvdGhlciBicm93c2VyIHRoaXMgd2lsbCBiZSBhIG5vcm1hbCBvYmplY3RcbiAgICBsZXQgdHJhY2sgPSBzdXBlcihzZXR0aW5ncyk7XG4gICAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICBpZiAoYnJvd3Nlci5JU19JRTgpIHtcbiAgICAgIGZvciAobGV0IHByb3AgaW4gVmlkZW9UcmFjay5wcm90b3R5cGUpIHtcbiAgICAgICAgaWYgKHByb3AgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgICB0cmFja1twcm9wXSA9IFZpZGVvVHJhY2sucHJvdG90eXBlW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRyYWNrLCAnc2VsZWN0ZWQnLCB7XG4gICAgICBnZXQoKSB7IHJldHVybiBzZWxlY3RlZDsgfSxcbiAgICAgIHNldChuZXdTZWxlY3RlZCkge1xuICAgICAgICAvLyBhbiBpbnZhbGlkIG9yIHVuY2hhbmdlZCB2YWx1ZVxuICAgICAgICBpZiAodHlwZW9mIG5ld1NlbGVjdGVkICE9PSAnYm9vbGVhbicgfHwgbmV3U2VsZWN0ZWQgPT09IHNlbGVjdGVkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkID0gbmV3U2VsZWN0ZWQ7XG4gICAgICAgIHRoaXMudHJpZ2dlcignc2VsZWN0ZWRjaGFuZ2UnKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIGlmIHRoZSB1c2VyIHNldHMgdGhpcyB0cmFjayB0byBzZWxlY3RlZCB0aGVuXG4gICAgLy8gc2V0IHNlbGVjdGVkIHRvIHRoYXQgdHJ1ZSB2YWx1ZSBvdGhlcndpc2VcbiAgICAvLyB3ZSBrZWVwIGl0IGZhbHNlXG4gICAgaWYgKHNldHRpbmdzLnNlbGVjdGVkKSB7XG4gICAgICB0cmFjay5zZWxlY3RlZCA9IHNldHRpbmdzLnNlbGVjdGVkO1xuICAgIH1cblxuICAgIHJldHVybiB0cmFjaztcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1RyYWNrO1xuIl19
},{"../utils/browser.js":141,"../utils/merge-options":150,"./track":138,"./track-enums":136}],141:[function(_dereq_,module,exports){
/**
* @file browser.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var USER_AGENT = _globalWindow2['default'].navigator.userAgent;
var webkitVersionMap = /AppleWebKit\/([\d.]+)/i.exec(USER_AGENT);
var appleWebkitVersion = webkitVersionMap ? parseFloat(webkitVersionMap.pop()) : null;
/*
* Device is an iPhone
*
* @type {Boolean}
* @constant
* @private
*/
var IS_IPAD = /iPad/i.test(USER_AGENT);
exports.IS_IPAD = IS_IPAD;
// The Facebook app's UIWebView identifies as both an iPhone and iPad, so
// to identify iPhones, we need to exclude iPads.
// http://artsy.github.io/blog/2012/10/18/the-perils-of-ios-user-agent-sniffing/
var IS_IPHONE = /iPhone/i.test(USER_AGENT) && !IS_IPAD;
exports.IS_IPHONE = IS_IPHONE;
var IS_IPOD = /iPod/i.test(USER_AGENT);
exports.IS_IPOD = IS_IPOD;
var IS_IOS = IS_IPHONE || IS_IPAD || IS_IPOD;
exports.IS_IOS = IS_IOS;
var IOS_VERSION = (function () {
var match = USER_AGENT.match(/OS (\d+)_/i);
if (match && match[1]) {
return match[1];
}
})();
exports.IOS_VERSION = IOS_VERSION;
var IS_ANDROID = /Android/i.test(USER_AGENT);
exports.IS_ANDROID = IS_ANDROID;
var ANDROID_VERSION = (function () {
// This matches Android Major.Minor.Patch versions
// ANDROID_VERSION is Major.Minor as a Number, if Minor isn't available, then only Major is returned
var match = USER_AGENT.match(/Android (\d+)(?:\.(\d+))?(?:\.(\d+))*/i),
major,
minor;
if (!match) {
return null;
}
major = match[1] && parseFloat(match[1]);
minor = match[2] && parseFloat(match[2]);
if (major && minor) {
return parseFloat(match[1] + '.' + match[2]);
} else if (major) {
return major;
} else {
return null;
}
})();
exports.ANDROID_VERSION = ANDROID_VERSION;
// Old Android is defined as Version older than 2.3, and requiring a webkit version of the android browser
var IS_OLD_ANDROID = IS_ANDROID && /webkit/i.test(USER_AGENT) && ANDROID_VERSION < 2.3;
exports.IS_OLD_ANDROID = IS_OLD_ANDROID;
var IS_NATIVE_ANDROID = IS_ANDROID && ANDROID_VERSION < 5 && appleWebkitVersion < 537;
exports.IS_NATIVE_ANDROID = IS_NATIVE_ANDROID;
var IS_FIREFOX = /Firefox/i.test(USER_AGENT);
exports.IS_FIREFOX = IS_FIREFOX;
var IS_EDGE = /Edge/i.test(USER_AGENT);
exports.IS_EDGE = IS_EDGE;
var IS_CHROME = !IS_EDGE && /Chrome/i.test(USER_AGENT);
exports.IS_CHROME = IS_CHROME;
var IS_IE8 = /MSIE\s8\.0/.test(USER_AGENT);
exports.IS_IE8 = IS_IE8;
var TOUCH_ENABLED = !!('ontouchstart' in _globalWindow2['default'] || _globalWindow2['default'].DocumentTouch && _globalDocument2['default'] instanceof _globalWindow2['default'].DocumentTouch);
exports.TOUCH_ENABLED = TOUCH_ENABLED;
var BACKGROUND_SIZE_SUPPORTED = ('backgroundSize' in _globalDocument2['default'].createElement('video').style);
exports.BACKGROUND_SIZE_SUPPORTED = BACKGROUND_SIZE_SUPPORTED;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9icm93c2VyLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs4QkFHcUIsaUJBQWlCOzs7OzRCQUNuQixlQUFlOzs7O0FBRWxDLElBQU0sVUFBVSxHQUFHLDBCQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7QUFDOUMsSUFBTSxnQkFBZ0IsR0FBRyxBQUFDLHdCQUF3QixDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUNyRSxJQUFNLGtCQUFrQixHQUFHLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzs7Ozs7Ozs7O0FBU2pGLElBQU0sT0FBTyxHQUFHLEFBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7Ozs7O0FBSzNDLElBQU0sU0FBUyxHQUFHLEFBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQzs7QUFDM0QsSUFBTSxPQUFPLEdBQUcsQUFBQyxPQUFPLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUMzQyxJQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQzs7O0FBRS9DLElBQU0sV0FBVyxHQUFHLENBQUMsWUFBVTtBQUNwQyxNQUFJLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQzNDLE1BQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtBQUFFLFdBQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQUU7Q0FDNUMsQ0FBQSxFQUFHLENBQUM7OztBQUVFLElBQU0sVUFBVSxHQUFHLEFBQUMsVUFBVSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFDakQsSUFBTSxlQUFlLEdBQUcsQ0FBQyxZQUFXOzs7QUFHekMsTUFBSSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQztNQUNwRSxLQUFLO01BQ0wsS0FBSyxDQUFDOztBQUVSLE1BQUksQ0FBQyxLQUFLLEVBQUU7QUFDVixXQUFPLElBQUksQ0FBQztHQUNiOztBQUVELE9BQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3pDLE9BQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUV6QyxNQUFJLEtBQUssSUFBSSxLQUFLLEVBQUU7QUFDbEIsV0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztHQUM5QyxNQUFNLElBQUksS0FBSyxFQUFFO0FBQ2hCLFdBQU8sS0FBSyxDQUFDO0dBQ2QsTUFBTTtBQUNMLFdBQU8sSUFBSSxDQUFDO0dBQ2I7Q0FDRixDQUFBLEVBQUcsQ0FBQzs7O0FBRUUsSUFBTSxjQUFjLEdBQUcsVUFBVSxJQUFJLEFBQUMsU0FBUyxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxlQUFlLEdBQUcsR0FBRyxDQUFDOztBQUMzRixJQUFNLGlCQUFpQixHQUFHLFVBQVUsSUFBSSxlQUFlLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixHQUFHLEdBQUcsQ0FBQzs7O0FBRXhGLElBQU0sVUFBVSxHQUFHLEFBQUMsVUFBVSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7QUFDakQsSUFBTSxPQUFPLEdBQUcsQUFBQyxPQUFPLENBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUMzQyxJQUFNLFNBQVMsR0FBRyxDQUFDLE9BQU8sSUFBSSxBQUFDLFNBQVMsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBQzNELElBQU0sTUFBTSxHQUFHLEFBQUMsWUFBWSxDQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzs7O0FBRS9DLElBQU0sYUFBYSxHQUFHLENBQUMsRUFBRSxBQUFDLGNBQWMsNkJBQVUsSUFBSywwQkFBTyxhQUFhLElBQUksdUNBQW9CLDBCQUFPLGFBQWEsQ0FBQSxBQUFDLENBQUM7O0FBQ3pILElBQU0seUJBQXlCLElBQUcsZ0JBQWdCLElBQUksNEJBQVMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQSxDQUFDIiwiZmlsZSI6InNyYy9qcy91dGlscy9icm93c2VyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBicm93c2VyLmpzXG4gKi9cbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcblxuY29uc3QgVVNFUl9BR0VOVCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50O1xuY29uc3Qgd2Via2l0VmVyc2lvbk1hcCA9ICgvQXBwbGVXZWJLaXRcXC8oW1xcZC5dKykvaSkuZXhlYyhVU0VSX0FHRU5UKTtcbmNvbnN0IGFwcGxlV2Via2l0VmVyc2lvbiA9IHdlYmtpdFZlcnNpb25NYXAgPyBwYXJzZUZsb2F0KHdlYmtpdFZlcnNpb25NYXAucG9wKCkpIDogbnVsbDtcblxuLypcbiAqIERldmljZSBpcyBhbiBpUGhvbmVcbiAqXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqIEBjb25zdGFudFxuICogQHByaXZhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IElTX0lQQUQgPSAoL2lQYWQvaSkudGVzdChVU0VSX0FHRU5UKTtcblxuLy8gVGhlIEZhY2Vib29rIGFwcCdzIFVJV2ViVmlldyBpZGVudGlmaWVzIGFzIGJvdGggYW4gaVBob25lIGFuZCBpUGFkLCBzb1xuLy8gdG8gaWRlbnRpZnkgaVBob25lcywgd2UgbmVlZCB0byBleGNsdWRlIGlQYWRzLlxuLy8gaHR0cDovL2FydHN5LmdpdGh1Yi5pby9ibG9nLzIwMTIvMTAvMTgvdGhlLXBlcmlscy1vZi1pb3MtdXNlci1hZ2VudC1zbmlmZmluZy9cbmV4cG9ydCBjb25zdCBJU19JUEhPTkUgPSAoL2lQaG9uZS9pKS50ZXN0KFVTRVJfQUdFTlQpICYmICFJU19JUEFEO1xuZXhwb3J0IGNvbnN0IElTX0lQT0QgPSAoL2lQb2QvaSkudGVzdChVU0VSX0FHRU5UKTtcbmV4cG9ydCBjb25zdCBJU19JT1MgPSBJU19JUEhPTkUgfHwgSVNfSVBBRCB8fCBJU19JUE9EO1xuXG5leHBvcnQgY29uc3QgSU9TX1ZFUlNJT04gPSAoZnVuY3Rpb24oKXtcbiAgdmFyIG1hdGNoID0gVVNFUl9BR0VOVC5tYXRjaCgvT1MgKFxcZCspXy9pKTtcbiAgaWYgKG1hdGNoICYmIG1hdGNoWzFdKSB7IHJldHVybiBtYXRjaFsxXTsgfVxufSkoKTtcblxuZXhwb3J0IGNvbnN0IElTX0FORFJPSUQgPSAoL0FuZHJvaWQvaSkudGVzdChVU0VSX0FHRU5UKTtcbmV4cG9ydCBjb25zdCBBTkRST0lEX1ZFUlNJT04gPSAoZnVuY3Rpb24oKSB7XG4gIC8vIFRoaXMgbWF0Y2hlcyBBbmRyb2lkIE1ham9yLk1pbm9yLlBhdGNoIHZlcnNpb25zXG4gIC8vIEFORFJPSURfVkVSU0lPTiBpcyBNYWpvci5NaW5vciBhcyBhIE51bWJlciwgaWYgTWlub3IgaXNuJ3QgYXZhaWxhYmxlLCB0aGVuIG9ubHkgTWFqb3IgaXMgcmV0dXJuZWRcbiAgdmFyIG1hdGNoID0gVVNFUl9BR0VOVC5tYXRjaCgvQW5kcm9pZCAoXFxkKykoPzpcXC4oXFxkKykpPyg/OlxcLihcXGQrKSkqL2kpLFxuICAgIG1ham9yLFxuICAgIG1pbm9yO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG1ham9yID0gbWF0Y2hbMV0gJiYgcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIG1pbm9yID0gbWF0Y2hbMl0gJiYgcGFyc2VGbG9hdChtYXRjaFsyXSk7XG5cbiAgaWYgKG1ham9yICYmIG1pbm9yKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQobWF0Y2hbMV0gKyAnLicgKyBtYXRjaFsyXSk7XG4gIH0gZWxzZSBpZiAobWFqb3IpIHtcbiAgICByZXR1cm4gbWFqb3I7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pKCk7XG4vLyBPbGQgQW5kcm9pZCBpcyBkZWZpbmVkIGFzIFZlcnNpb24gb2xkZXIgdGhhbiAyLjMsIGFuZCByZXF1aXJpbmcgYSB3ZWJraXQgdmVyc2lvbiBvZiB0aGUgYW5kcm9pZCBicm93c2VyXG5leHBvcnQgY29uc3QgSVNfT0xEX0FORFJPSUQgPSBJU19BTkRST0lEICYmICgvd2Via2l0L2kpLnRlc3QoVVNFUl9BR0VOVCkgJiYgQU5EUk9JRF9WRVJTSU9OIDwgMi4zO1xuZXhwb3J0IGNvbnN0IElTX05BVElWRV9BTkRST0lEID0gSVNfQU5EUk9JRCAmJiBBTkRST0lEX1ZFUlNJT04gPCA1ICYmIGFwcGxlV2Via2l0VmVyc2lvbiA8IDUzNztcblxuZXhwb3J0IGNvbnN0IElTX0ZJUkVGT1ggPSAoL0ZpcmVmb3gvaSkudGVzdChVU0VSX0FHRU5UKTtcbmV4cG9ydCBjb25zdCBJU19FREdFID0gKC9FZGdlL2kpLnRlc3QoVVNFUl9BR0VOVCk7XG5leHBvcnQgY29uc3QgSVNfQ0hST01FID0gIUlTX0VER0UgJiYgKC9DaHJvbWUvaSkudGVzdChVU0VSX0FHRU5UKTtcbmV4cG9ydCBjb25zdCBJU19JRTggPSAoL01TSUVcXHM4XFwuMC8pLnRlc3QoVVNFUl9BR0VOVCk7XG5cbmV4cG9ydCBjb25zdCBUT1VDSF9FTkFCTEVEID0gISEoKCdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdykgfHwgd2luZG93LkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiB3aW5kb3cuRG9jdW1lbnRUb3VjaCk7XG5leHBvcnQgY29uc3QgQkFDS0dST1VORF9TSVpFX1NVUFBPUlRFRCA9ICdiYWNrZ3JvdW5kU2l6ZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKS5zdHlsZTtcbiJdfQ==
},{"global/document":7,"global/window":8}],142:[function(_dereq_,module,exports){
/**
* @file buffer.js
*/
'use strict';
exports.__esModule = true;
exports.bufferedPercent = bufferedPercent;
var _timeRangesJs = _dereq_('./time-ranges.js');
/**
* Compute how much your video has been buffered
*
* @param {Object} Buffered object
* @param {Number} Total duration
* @return {Number} Percent buffered of the total duration
* @private
* @function bufferedPercent
*/
function bufferedPercent(buffered, duration) {
var bufferedDuration = 0,
start,
end;
if (!duration) {
return 0;
}
if (!buffered || !buffered.length) {
buffered = _timeRangesJs.createTimeRange(0, 0);
}
for (var i = 0; i < buffered.length; i++) {
start = buffered.start(i);
end = buffered.end(i);
// buffered end can be bigger than duration by a very small fraction
if (end > duration) {
end = duration;
}
bufferedDuration += end - start;
}
return bufferedDuration / duration;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9idWZmZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7NEJBR2dDLGtCQUFrQjs7Ozs7Ozs7Ozs7O0FBVzNDLFNBQVMsZUFBZSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUU7QUFDbEQsTUFBSSxnQkFBZ0IsR0FBRyxDQUFDO01BQ3BCLEtBQUs7TUFBRSxHQUFHLENBQUM7O0FBRWYsTUFBSSxDQUFDLFFBQVEsRUFBRTtBQUNiLFdBQU8sQ0FBQyxDQUFDO0dBQ1Y7O0FBRUQsTUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7QUFDakMsWUFBUSxHQUFHLDhCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7R0FDbEM7O0FBRUQsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7QUFDdkMsU0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUIsT0FBRyxHQUFLLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7OztBQUd4QixRQUFJLEdBQUcsR0FBRyxRQUFRLEVBQUU7QUFDbEIsU0FBRyxHQUFHLFFBQVEsQ0FBQztLQUNoQjs7QUFFRCxvQkFBZ0IsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDO0dBQ2pDOztBQUVELFNBQU8sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0NBQ3BDIiwiZmlsZSI6InNyYy9qcy91dGlscy9idWZmZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGJ1ZmZlci5qc1xuICovXG5pbXBvcnQgeyBjcmVhdGVUaW1lUmFuZ2UgfSBmcm9tICcuL3RpbWUtcmFuZ2VzLmpzJztcblxuLyoqXG4gKiBDb21wdXRlIGhvdyBtdWNoIHlvdXIgdmlkZW8gaGFzIGJlZW4gYnVmZmVyZWRcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IEJ1ZmZlcmVkIG9iamVjdFxuICogQHBhcmFtICB7TnVtYmVyfSBUb3RhbCBkdXJhdGlvblxuICogQHJldHVybiB7TnVtYmVyfSBQZXJjZW50IGJ1ZmZlcmVkIG9mIHRoZSB0b3RhbCBkdXJhdGlvblxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBidWZmZXJlZFBlcmNlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1ZmZlcmVkUGVyY2VudChidWZmZXJlZCwgZHVyYXRpb24pIHtcbiAgdmFyIGJ1ZmZlcmVkRHVyYXRpb24gPSAwLFxuICAgICAgc3RhcnQsIGVuZDtcblxuICBpZiAoIWR1cmF0aW9uKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZiAoIWJ1ZmZlcmVkIHx8ICFidWZmZXJlZC5sZW5ndGgpIHtcbiAgICBidWZmZXJlZCA9IGNyZWF0ZVRpbWVSYW5nZSgwLCAwKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyZWQubGVuZ3RoOyBpKyspe1xuICAgIHN0YXJ0ID0gYnVmZmVyZWQuc3RhcnQoaSk7XG4gICAgZW5kICAgPSBidWZmZXJlZC5lbmQoaSk7XG5cbiAgICAvLyBidWZmZXJlZCBlbmQgY2FuIGJlIGJpZ2dlciB0aGFuIGR1cmF0aW9uIGJ5IGEgdmVyeSBzbWFsbCBmcmFjdGlvblxuICAgIGlmIChlbmQgPiBkdXJhdGlvbikge1xuICAgICAgZW5kID0gZHVyYXRpb247XG4gICAgfVxuXG4gICAgYnVmZmVyZWREdXJhdGlvbiArPSBlbmQgLSBzdGFydDtcbiAgfVxuXG4gIHJldHVybiBidWZmZXJlZER1cmF0aW9uIC8gZHVyYXRpb247XG59XG4iXX0=
},{"./time-ranges.js":152}],143:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
/**
* Object containing the default behaviors for available handler methods.
*
* @private
* @type {Object}
*/
var defaultBehaviors = {
get: function get(obj, key) {
return obj[key];
},
set: function set(obj, key, value) {
obj[key] = value;
return true;
}
};
/**
* Expose private objects publicly using a Proxy to log deprecation warnings.
*
* Browsers that do not support Proxy objects will simply return the `target`
* object, so it can be directly exposed.
*
* @param {Object} target The target object.
* @param {Object} messages Messages to display from a Proxy. Only operations
* with an associated message will be proxied.
* @param {String} [messages.get]
* @param {String} [messages.set]
* @return {Object} A Proxy if supported or the `target` argument.
*/
exports['default'] = function (target) {
var messages = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
if (typeof Proxy === 'function') {
var _ret = (function () {
var handler = {};
// Build a handler object based on those keys that have both messages
// and default behaviors.
Object.keys(messages).forEach(function (key) {
if (defaultBehaviors.hasOwnProperty(key)) {
handler[key] = function () {
_logJs2['default'].warn(messages[key]);
return defaultBehaviors[key].apply(this, arguments);
};
}
});
return {
v: new Proxy(target, handler)
};
})();
if (typeof _ret === 'object') return _ret.v;
}
return target;
};
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9jcmVhdGUtZGVwcmVjYXRpb24tcHJveHkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O3FCQUFnQixVQUFVOzs7Ozs7Ozs7O0FBUTFCLElBQU0sZ0JBQWdCLEdBQUc7QUFDdkIsS0FBRyxFQUFBLGFBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRTtBQUNaLFdBQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ2pCO0FBQ0QsS0FBRyxFQUFBLGFBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUU7QUFDbkIsT0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztBQUNqQixXQUFPLElBQUksQ0FBQztHQUNiO0NBQ0YsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztxQkFlYSxVQUFDLE1BQU0sRUFBa0I7TUFBaEIsUUFBUSx5REFBQyxFQUFFOztBQUNqQyxNQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsRUFBRTs7QUFDL0IsVUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDOzs7O0FBSWpCLFlBQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUEsR0FBRyxFQUFJO0FBQ25DLFlBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3hDLGlCQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsWUFBVztBQUN4QiwrQkFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEIsbUJBQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztXQUNyRCxDQUFDO1NBQ0g7T0FDRixDQUFDLENBQUM7O0FBRUg7V0FBTyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO1FBQUM7Ozs7R0FDbkM7QUFDRCxTQUFPLE1BQU0sQ0FBQztDQUNmIiwiZmlsZSI6InNyYy9qcy91dGlscy9jcmVhdGUtZGVwcmVjYXRpb24tcHJveHkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nLmpzJztcblxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyB0aGUgZGVmYXVsdCBiZWhhdmlvcnMgZm9yIGF2YWlsYWJsZSBoYW5kbGVyIG1ldGhvZHMuXG4gKlxuICogQHByaXZhdGVcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbmNvbnN0IGRlZmF1bHRCZWhhdmlvcnMgPSB7XG4gIGdldChvYmosIGtleSkge1xuICAgIHJldHVybiBvYmpba2V5XTtcbiAgfSxcbiAgc2V0KG9iaiwga2V5LCB2YWx1ZSkge1xuICAgIG9ialtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07XG5cbi8qKlxuICogRXhwb3NlIHByaXZhdGUgb2JqZWN0cyBwdWJsaWNseSB1c2luZyBhIFByb3h5IHRvIGxvZyBkZXByZWNhdGlvbiB3YXJuaW5ncy5cbiAqXG4gKiBCcm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IFByb3h5IG9iamVjdHMgd2lsbCBzaW1wbHkgcmV0dXJuIHRoZSBgdGFyZ2V0YFxuICogb2JqZWN0LCBzbyBpdCBjYW4gYmUgZGlyZWN0bHkgZXhwb3NlZC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFyZ2V0IFRoZSB0YXJnZXQgb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IG1lc3NhZ2VzIE1lc3NhZ2VzIHRvIGRpc3BsYXkgZnJvbSBhIFByb3h5LiBPbmx5IG9wZXJhdGlvbnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGFuIGFzc29jaWF0ZWQgbWVzc2FnZSB3aWxsIGJlIHByb3hpZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gW21lc3NhZ2VzLmdldF1cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbWVzc2FnZXMuc2V0XVxuICogQHJldHVybiB7T2JqZWN0fSBBIFByb3h5IGlmIHN1cHBvcnRlZCBvciB0aGUgYHRhcmdldGAgYXJndW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0ICh0YXJnZXQsIG1lc3NhZ2VzPXt9KSA9PiB7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09ICdmdW5jdGlvbicpIHtcbiAgICBsZXQgaGFuZGxlciA9IHt9O1xuXG4gICAgLy8gQnVpbGQgYSBoYW5kbGVyIG9iamVjdCBiYXNlZCBvbiB0aG9zZSBrZXlzIHRoYXQgaGF2ZSBib3RoIG1lc3NhZ2VzXG4gICAgLy8gYW5kIGRlZmF1bHQgYmVoYXZpb3JzLlxuICAgIE9iamVjdC5rZXlzKG1lc3NhZ2VzKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoZGVmYXVsdEJlaGF2aW9ycy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGhhbmRsZXJba2V5XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGxvZy53YXJuKG1lc3NhZ2VzW2tleV0pO1xuICAgICAgICAgIHJldHVybiBkZWZhdWx0QmVoYXZpb3JzW2tleV0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCBoYW5kbGVyKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufTtcbiJdfQ==
},{"./log.js":149}],144:[function(_dereq_,module,exports){
/**
* @file dom.js
*/
'use strict';
exports.__esModule = true;
exports.getEl = getEl;
exports.createEl = createEl;
exports.textContent = textContent;
exports.insertElFirst = insertElFirst;
exports.getElData = getElData;
exports.hasElData = hasElData;
exports.removeElData = removeElData;
exports.hasElClass = hasElClass;
exports.addElClass = addElClass;
exports.removeElClass = removeElClass;
exports.toggleElClass = toggleElClass;
exports.setElAttributes = setElAttributes;
exports.getElAttributes = getElAttributes;
exports.blockTextSelection = blockTextSelection;
exports.unblockTextSelection = unblockTextSelection;
exports.findElPosition = findElPosition;
exports.getPointerPosition = getPointerPosition;
exports.isEl = isEl;
exports.isTextNode = isTextNode;
exports.emptyEl = emptyEl;
exports.normalizeContent = normalizeContent;
exports.appendContent = appendContent;
exports.insertContent = insertContent;
var _templateObject = _taggedTemplateLiteralLoose(['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.'], ['Setting attributes in the second argument of createEl()\n has been deprecated. Use the third argument instead.\n createEl(type, properties, attributes). Attempting to set ', ' to ', '.']);
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _taggedTemplateLiteralLoose(strings, raw) { strings.raw = raw; return strings; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _guidJs = _dereq_('./guid.js');
var Guid = _interopRequireWildcard(_guidJs);
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
var _tsml = _dereq_('tsml');
var _tsml2 = _interopRequireDefault(_tsml);
/**
* Detect if a value is a string with any non-whitespace characters.
*
* @param {String} str
* @return {Boolean}
*/
function isNonBlankString(str) {
return typeof str === 'string' && /\S/.test(str);
}
/**
* Throws an error if the passed string has whitespace. This is used by
* class methods to be relatively consistent with the classList API.
*
* @param {String} str
* @return {Boolean}
*/
function throwIfWhitespace(str) {
if (/\s/.test(str)) {
throw new Error('class has illegal whitespace characters');
}
}
/**
* Produce a regular expression for matching a class name.
*
* @param {String} className
* @return {RegExp}
*/
function classRegExp(className) {
return new RegExp('(^|\\s)' + className + '($|\\s)');
}
/**
* Creates functions to query the DOM using a given method.
*
* @function createQuerier
* @private
* @param {String} method
* @return {Function}
*/
function createQuerier(method) {
return function (selector, context) {
if (!isNonBlankString(selector)) {
return _globalDocument2['default'][method](null);
}
if (isNonBlankString(context)) {
context = _globalDocument2['default'].querySelector(context);
}
return (isEl(context) ? context : _globalDocument2['default'])[method](selector);
};
}
/**
* Shorthand for document.getElementById()
* Also allows for CSS (jQuery) ID syntax. But nothing other than IDs.
*
* @param {String} id Element ID
* @return {Element} Element with supplied ID
* @function getEl
*/
function getEl(id) {
if (id.indexOf('#') === 0) {
id = id.slice(1);
}
return _globalDocument2['default'].getElementById(id);
}
/**
* Creates an element and applies properties.
*
* @param {String} [tagName='div'] Name of tag to be created.
* @param {Object} [properties={}] Element properties to be applied.
* @param {Object} [attributes={}] Element attributes to be applied.
* @return {Element}
* @function createEl
*/
function createEl() {
var tagName = arguments.length <= 0 || arguments[0] === undefined ? 'div' : arguments[0];
var properties = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1];
var attributes = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var el = _globalDocument2['default'].createElement(tagName);
Object.getOwnPropertyNames(properties).forEach(function (propName) {
var val = properties[propName];
// See #2176
// We originally were accepting both properties and attributes in the
// same object, but that doesn't work so well.
if (propName.indexOf('aria-') !== -1 || propName === 'role' || propName === 'type') {
_logJs2['default'].warn(_tsml2['default'](_templateObject, propName, val));
el.setAttribute(propName, val);
} else {
el[propName] = val;
}
});
Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
var val = attributes[attrName];
el.setAttribute(attrName, attributes[attrName]);
});
return el;
}
/**
* Injects text into an element, replacing any existing contents entirely.
*
* @param {Element} el
* @param {String} text
* @return {Element}
* @function textContent
*/
function textContent(el, text) {
if (typeof el.textContent === 'undefined') {
el.innerText = text;
} else {
el.textContent = text;
}
}
/**
* Insert an element as the first child node of another
*
* @param {Element} child Element to insert
* @param {Element} parent Element to insert child into
* @private
* @function insertElFirst
*/
function insertElFirst(child, parent) {
if (parent.firstChild) {
parent.insertBefore(child, parent.firstChild);
} else {
parent.appendChild(child);
}
}
/**
* Element Data Store. Allows for binding data to an element without putting it directly on the element.
* Ex. Event listeners are stored here.
* (also from jsninja.com, slightly modified and updated for closure compiler)
*
* @type {Object}
* @private
*/
var elData = {};
/*
* Unique attribute name to store an element's guid in
*
* @type {String}
* @constant
* @private
*/
var elIdAttr = 'vdata' + new Date().getTime();
/**
* Returns the cache object where data for an element is stored
*
* @param {Element} el Element to store data for.
* @return {Object}
* @function getElData
*/
function getElData(el) {
var id = el[elIdAttr];
if (!id) {
id = el[elIdAttr] = Guid.newGUID();
}
if (!elData[id]) {
elData[id] = {};
}
return elData[id];
}
/**
* Returns whether or not an element has cached data
*
* @param {Element} el A dom element
* @return {Boolean}
* @private
* @function hasElData
*/
function hasElData(el) {
var id = el[elIdAttr];
if (!id) {
return false;
}
return !!Object.getOwnPropertyNames(elData[id]).length;
}
/**
* Delete data for the element from the cache and the guid attr from getElementById
*
* @param {Element} el Remove data for an element
* @private
* @function removeElData
*/
function removeElData(el) {
var id = el[elIdAttr];
if (!id) {
return;
}
// Remove all stored data
delete elData[id];
// Remove the elIdAttr property from the DOM node
try {
delete el[elIdAttr];
} catch (e) {
if (el.removeAttribute) {
el.removeAttribute(elIdAttr);
} else {
// IE doesn't appear to support removeAttribute on the document element
el[elIdAttr] = null;
}
}
}
/**
* Check if an element has a CSS class
*
* @function hasElClass
* @param {Element} element Element to check
* @param {String} classToCheck Classname to check
*/
function hasElClass(element, classToCheck) {
throwIfWhitespace(classToCheck);
if (element.classList) {
return element.classList.contains(classToCheck);
} else {
return classRegExp(classToCheck).test(element.className);
}
}
/**
* Add a CSS class name to an element
*
* @function addElClass
* @param {Element} element Element to add class name to
* @param {String} classToAdd Classname to add
*/
function addElClass(element, classToAdd) {
if (element.classList) {
element.classList.add(classToAdd);
// Don't need to `throwIfWhitespace` here because `hasElClass` will do it
// in the case of classList not being supported.
} else if (!hasElClass(element, classToAdd)) {
element.className = (element.className + ' ' + classToAdd).trim();
}
return element;
}
/**
* Remove a CSS class name from an element
*
* @function removeElClass
* @param {Element} element Element to remove from class name
* @param {String} classToRemove Classname to remove
*/
function removeElClass(element, classToRemove) {
if (element.classList) {
element.classList.remove(classToRemove);
} else {
throwIfWhitespace(classToRemove);
element.className = element.className.split(/\s+/).filter(function (c) {
return c !== classToRemove;
}).join(' ');
}
return element;
}
/**
* Adds or removes a CSS class name on an element depending on an optional
* condition or the presence/absence of the class name.
*
* @function toggleElClass
* @param {Element} element
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*/
function toggleElClass(element, classToToggle, predicate) {
// This CANNOT use `classList` internally because IE does not support the
// second parameter to the `classList.toggle()` method! Which is fine because
// `classList` will be used by the add/remove functions.
var has = hasElClass(element, classToToggle);
if (typeof predicate === 'function') {
predicate = predicate(element, classToToggle);
}
if (typeof predicate !== 'boolean') {
predicate = !has;
}
// If the necessary class operation matches the current state of the
// element, no action is required.
if (predicate === has) {
return;
}
if (predicate) {
addElClass(element, classToToggle);
} else {
removeElClass(element, classToToggle);
}
return element;
}
/**
* Apply attributes to an HTML element.
*
* @param {Element} el Target element.
* @param {Object=} attributes Element attributes to be applied.
* @private
* @function setElAttributes
*/
function setElAttributes(el, attributes) {
Object.getOwnPropertyNames(attributes).forEach(function (attrName) {
var attrValue = attributes[attrName];
if (attrValue === null || typeof attrValue === 'undefined' || attrValue === false) {
el.removeAttribute(attrName);
} else {
el.setAttribute(attrName, attrValue === true ? '' : attrValue);
}
});
}
/**
* Get an element's attribute values, as defined on the HTML tag
* Attributes are not the same as properties. They're defined on the tag
* or with setAttribute (which shouldn't be used with HTML)
* This will return true or false for boolean attributes.
*
* @param {Element} tag Element from which to get tag attributes
* @return {Object}
* @private
* @function getElAttributes
*/
function getElAttributes(tag) {
var obj, knownBooleans, attrs, attrName, attrVal;
obj = {};
// known boolean attributes
// we can check for matching boolean properties, but older browsers
// won't know about HTML5 boolean attributes that we still read from
knownBooleans = ',' + 'autoplay,controls,loop,muted,default' + ',';
if (tag && tag.attributes && tag.attributes.length > 0) {
attrs = tag.attributes;
for (var i = attrs.length - 1; i >= 0; i--) {
attrName = attrs[i].name;
attrVal = attrs[i].value;
// check for known booleans
// the matching element property will return a value for typeof
if (typeof tag[attrName] === 'boolean' || knownBooleans.indexOf(',' + attrName + ',') !== -1) {
// the value of an included boolean attribute is typically an empty
// string ('') which would equal false if we just check for a false value.
// we also don't want support bad code like autoplay='false'
attrVal = attrVal !== null ? true : false;
}
obj[attrName] = attrVal;
}
}
return obj;
}
/**
* Attempt to block the ability to select text while dragging controls
*
* @return {Boolean}
* @function blockTextSelection
*/
function blockTextSelection() {
_globalDocument2['default'].body.focus();
_globalDocument2['default'].onselectstart = function () {
return false;
};
}
/**
* Turn off text selection blocking
*
* @return {Boolean}
* @function unblockTextSelection
*/
function unblockTextSelection() {
_globalDocument2['default'].onselectstart = function () {
return true;
};
}
/**
* Offset Left
* getBoundingClientRect technique from
* John Resig http://ejohn.org/blog/getboundingclientrect-is-awesome/
*
* @function findElPosition
* @param {Element} el Element from which to get offset
* @return {Object}
*/
function findElPosition(el) {
var box = undefined;
if (el.getBoundingClientRect && el.parentNode) {
box = el.getBoundingClientRect();
}
if (!box) {
return {
left: 0,
top: 0
};
}
var docEl = _globalDocument2['default'].documentElement;
var body = _globalDocument2['default'].body;
var clientLeft = docEl.clientLeft || body.clientLeft || 0;
var scrollLeft = _globalWindow2['default'].pageXOffset || body.scrollLeft;
var left = box.left + scrollLeft - clientLeft;
var clientTop = docEl.clientTop || body.clientTop || 0;
var scrollTop = _globalWindow2['default'].pageYOffset || body.scrollTop;
var top = box.top + scrollTop - clientTop;
// Android sometimes returns slightly off decimal values, so need to round
return {
left: Math.round(left),
top: Math.round(top)
};
}
/**
* Get pointer position in element
* Returns an object with x and y coordinates.
* The base on the coordinates are the bottom left of the element.
*
* @function getPointerPosition
* @param {Element} el Element on which to get the pointer position on
* @param {Event} event Event object
* @return {Object} This object will have x and y coordinates corresponding to the mouse position
*/
function getPointerPosition(el, event) {
var position = {};
var box = findElPosition(el);
var boxW = el.offsetWidth;
var boxH = el.offsetHeight;
var boxY = box.top;
var boxX = box.left;
var pageY = event.pageY;
var pageX = event.pageX;
if (event.changedTouches) {
pageX = event.changedTouches[0].pageX;
pageY = event.changedTouches[0].pageY;
}
position.y = Math.max(0, Math.min(1, (boxY - pageY + boxH) / boxH));
position.x = Math.max(0, Math.min(1, (pageX - boxX) / boxW));
return position;
}
/**
* Determines, via duck typing, whether or not a value is a DOM element.
*
* @function isEl
* @param {Mixed} value
* @return {Boolean}
*/
function isEl(value) {
return !!value && typeof value === 'object' && value.nodeType === 1;
}
/**
* Determines, via duck typing, whether or not a value is a text node.
*
* @param {Mixed} value
* @return {Boolean}
*/
function isTextNode(value) {
return !!value && typeof value === 'object' && value.nodeType === 3;
}
/**
* Empties the contents of an element.
*
* @function emptyEl
* @param {Element} el
* @return {Element}
*/
function emptyEl(el) {
while (el.firstChild) {
el.removeChild(el.firstChild);
}
return el;
}
/**
* Normalizes content for eventual insertion into the DOM.
*
* This allows a wide range of content definition methods, but protects
* from falling into the trap of simply writing to `innerHTML`, which is
* an XSS concern.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @function normalizeContent
* @param {String|Element|TextNode|Array|Function} content
* @return {Array}
*/
function normalizeContent(content) {
// First, invoke content if it is a function. If it produces an array,
// that needs to happen before normalization.
if (typeof content === 'function') {
content = content();
}
// Next up, normalize to an array, so one or many items can be normalized,
// filtered, and returned.
return (Array.isArray(content) ? content : [content]).map(function (value) {
// First, invoke value if it is a function to produce a new value,
// which will be subsequently normalized to a Node of some kind.
if (typeof value === 'function') {
value = value();
}
if (isEl(value) || isTextNode(value)) {
return value;
}
if (typeof value === 'string' && /\S/.test(value)) {
return _globalDocument2['default'].createTextNode(value);
}
}).filter(function (value) {
return value;
});
}
/**
* Normalizes and appends content to an element.
*
* @function appendContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* See: `normalizeContent`
* @return {Element}
*/
function appendContent(el, content) {
normalizeContent(content).forEach(function (node) {
return el.appendChild(node);
});
return el;
}
/**
* Normalizes and inserts content into an element; this is identical to
* `appendContent()`, except it empties the element first.
*
* @function insertContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* See: `normalizeContent`
* @return {Element}
*/
function insertContent(el, content) {
return appendContent(emptyEl(el), content);
}
/**
* Finds a single DOM element matching `selector` within the optional
* `context` of another DOM element (defaulting to `document`).
*
* @function $
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelector`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {Element|null}
*/
var $ = createQuerier('querySelector');
exports.$ = $;
/**
* Finds a all DOM elements matching `selector` within the optional
* `context` of another DOM element (defaulting to `document`).
*
* @function $$
* @param {String} selector
* A valid CSS selector, which will be passed to `querySelectorAll`.
*
* @param {Element|String} [context=document]
* A DOM element within which to query. Can also be a selector
* string in which case the first matching element will be used
* as context. If missing (or no element matches selector), falls
* back to `document`.
*
* @return {NodeList}
*/
var $$ = createQuerier('querySelectorAll');
exports.$$ = $$;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQztDQUNYOzs7Ozs7Ozs7Ozs7O0FBWU0sU0FBUyxhQUFhLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUN6QyxTQUFPLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Q0FDNUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtCTSxJQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFrQnpDLElBQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDIiwiZmlsZSI6InNyYy9qcy91dGlscy9kb20uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGRvbS5qc1xuICovXG5pbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5pbXBvcnQgICogYXMgR3VpZCBmcm9tICcuL2d1aWQuanMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZy5qcyc7XG5pbXBvcnQgdHNtbCBmcm9tICd0c21sJztcblxuLyoqXG4gKiBEZXRlY3QgaWYgYSB2YWx1ZSBpcyBhIHN0cmluZyB3aXRoIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiBpc05vbkJsYW5rU3RyaW5nKHN0cikge1xuICByZXR1cm4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgL1xcUy8udGVzdChzdHIpO1xufVxuXG4vKipcbiAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFzc2VkIHN0cmluZyBoYXMgd2hpdGVzcGFjZS4gVGhpcyBpcyB1c2VkIGJ5XG4gKiBjbGFzcyBtZXRob2RzIHRvIGJlIHJlbGF0aXZlbHkgY29uc2lzdGVudCB3aXRoIHRoZSBjbGFzc0xpc3QgQVBJLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5mdW5jdGlvbiB0aHJvd0lmV2hpdGVzcGFjZShzdHIpIHtcbiAgaWYgKC9cXHMvLnRlc3Qoc3RyKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xhc3MgaGFzIGlsbGVnYWwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm9kdWNlIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBtYXRjaGluZyBhIGNsYXNzIG5hbWUuXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSBjbGFzc05hbWVcbiAqIEByZXR1cm4ge1JlZ0V4cH1cbiAqL1xuZnVuY3Rpb24gY2xhc3NSZWdFeHAoY2xhc3NOYW1lKSB7XG4gIHJldHVybiBuZXcgUmVnRXhwKCcoXnxcXFxccyknICsgY2xhc3NOYW1lICsgJygkfFxcXFxzKScpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgZnVuY3Rpb25zIHRvIHF1ZXJ5IHRoZSBET00gdXNpbmcgYSBnaXZlbiBtZXRob2QuXG4gKlxuICogQGZ1bmN0aW9uIGNyZWF0ZVF1ZXJpZXJcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gIHtTdHJpbmd9IG1ldGhvZFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVF1ZXJpZXIobWV0aG9kKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoc2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzTm9uQmxhbmtTdHJpbmcoc2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnRbbWV0aG9kXShudWxsKTtcbiAgICB9XG4gICAgaWYgKGlzTm9uQmxhbmtTdHJpbmcoY29udGV4dCkpIHtcbiAgICAgIGNvbnRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gKGlzRWwoY29udGV4dCkgPyBjb250ZXh0IDogZG9jdW1lbnQpW21ldGhvZF0oc2VsZWN0b3IpO1xuICB9O1xufVxuXG4vKipcbiAqIFNob3J0aGFuZCBmb3IgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoKVxuICogQWxzbyBhbGxvd3MgZm9yIENTUyAoalF1ZXJ5KSBJRCBzeW50YXguIEJ1dCBub3RoaW5nIG90aGVyIHRoYW4gSURzLlxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gaWQgIEVsZW1lbnQgSURcbiAqIEByZXR1cm4ge0VsZW1lbnR9ICAgIEVsZW1lbnQgd2l0aCBzdXBwbGllZCBJRFxuICogQGZ1bmN0aW9uIGdldEVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFbChpZCl7XG4gIGlmIChpZC5pbmRleE9mKCcjJykgPT09IDApIHtcbiAgICBpZCA9IGlkLnNsaWNlKDEpO1xuICB9XG5cbiAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYW5kIGFwcGxpZXMgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFt0YWdOYW1lPSdkaXYnXSBOYW1lIG9mIHRhZyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtICB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gRWxlbWVudCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gIHtPYmplY3R9IFthdHRyaWJ1dGVzPXt9XSBFbGVtZW50IGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKiBAZnVuY3Rpb24gY3JlYXRlRWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVsKHRhZ05hbWU9J2RpdicsIHByb3BlcnRpZXM9e30sIGF0dHJpYnV0ZXM9e30pe1xuICBsZXQgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuXG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3BlcnRpZXMpLmZvckVhY2goZnVuY3Rpb24ocHJvcE5hbWUpe1xuICAgIGxldCB2YWwgPSBwcm9wZXJ0aWVzW3Byb3BOYW1lXTtcblxuICAgIC8vIFNlZSAjMjE3NlxuICAgIC8vIFdlIG9yaWdpbmFsbHkgd2VyZSBhY2NlcHRpbmcgYm90aCBwcm9wZXJ0aWVzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZVxuICAgIC8vIHNhbWUgb2JqZWN0LCBidXQgdGhhdCBkb2Vzbid0IHdvcmsgc28gd2VsbC5cbiAgICBpZiAocHJvcE5hbWUuaW5kZXhPZignYXJpYS0nKSAhPT0gLTEgfHwgcHJvcE5hbWUgPT09ICdyb2xlJyB8fCBwcm9wTmFtZSA9PT0gJ3R5cGUnKSB7XG4gICAgICBsb2cud2Fybih0c21sYFNldHRpbmcgYXR0cmlidXRlcyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGNyZWF0ZUVsKClcbiAgICAgICAgICAgICAgICBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHRoaXJkIGFyZ3VtZW50IGluc3RlYWQuXG4gICAgICAgICAgICAgICAgY3JlYXRlRWwodHlwZSwgcHJvcGVydGllcywgYXR0cmlidXRlcykuIEF0dGVtcHRpbmcgdG8gc2V0ICR7cHJvcE5hbWV9IHRvICR7dmFsfS5gKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZShwcm9wTmFtZSwgdmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxbcHJvcE5hbWVdID0gdmFsO1xuICAgIH1cbiAgfSk7XG5cbiAgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbihhdHRyTmFtZSl7XG4gICAgbGV0IHZhbCA9IGF0dHJpYnV0ZXNbYXR0ck5hbWVdO1xuICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0cmlidXRlc1thdHRyTmFtZV0pO1xuICB9KTtcblxuICByZXR1cm4gZWw7XG59XG5cbi8qKlxuICogSW5qZWN0cyB0ZXh0IGludG8gYW4gZWxlbWVudCwgcmVwbGFjaW5nIGFueSBleGlzdGluZyBjb250ZW50cyBlbnRpcmVseS5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHBhcmFtICB7U3RyaW5nfSB0ZXh0XG4gKiBAcmV0dXJuIHtFbGVtZW50fVxuICogQGZ1bmN0aW9uIHRleHRDb250ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZXh0Q29udGVudChlbCwgdGV4dCkge1xuICBpZiAodHlwZW9mIGVsLnRleHRDb250ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgIGVsLmlubmVyVGV4dCA9IHRleHQ7XG4gIH0gZWxzZSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG59XG5cbi8qKlxuICogSW5zZXJ0IGFuIGVsZW1lbnQgYXMgdGhlIGZpcnN0IGNoaWxkIG5vZGUgb2YgYW5vdGhlclxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGNoaWxkICAgRWxlbWVudCB0byBpbnNlcnRcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHBhcmVudCBFbGVtZW50IHRvIGluc2VydCBjaGlsZCBpbnRvXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGluc2VydEVsRmlyc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc2VydEVsRmlyc3QoY2hpbGQsIHBhcmVudCl7XG4gIGlmIChwYXJlbnQuZmlyc3RDaGlsZCkge1xuICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHBhcmVudC5maXJzdENoaWxkKTtcbiAgfSBlbHNlIHtcbiAgICBwYXJlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xuICB9XG59XG5cbi8qKlxuICogRWxlbWVudCBEYXRhIFN0b3JlLiBBbGxvd3MgZm9yIGJpbmRpbmcgZGF0YSB0byBhbiBlbGVtZW50IHdpdGhvdXQgcHV0dGluZyBpdCBkaXJlY3RseSBvbiB0aGUgZWxlbWVudC5cbiAqIEV4LiBFdmVudCBsaXN0ZW5lcnMgYXJlIHN0b3JlZCBoZXJlLlxuICogKGFsc28gZnJvbSBqc25pbmphLmNvbSwgc2xpZ2h0bHkgbW9kaWZpZWQgYW5kIHVwZGF0ZWQgZm9yIGNsb3N1cmUgY29tcGlsZXIpXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IGVsRGF0YSA9IHt9O1xuXG4vKlxuICogVW5pcXVlIGF0dHJpYnV0ZSBuYW1lIHRvIHN0b3JlIGFuIGVsZW1lbnQncyBndWlkIGluXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqIEBjb25zdGFudFxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgZWxJZEF0dHIgPSAndmRhdGEnICsgKG5ldyBEYXRlKCkpLmdldFRpbWUoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjYWNoZSBvYmplY3Qgd2hlcmUgZGF0YSBmb3IgYW4gZWxlbWVudCBpcyBzdG9yZWRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbCBFbGVtZW50IHRvIHN0b3JlIGRhdGEgZm9yLlxuICogQHJldHVybiB7T2JqZWN0fVxuICogQGZ1bmN0aW9uIGdldEVsRGF0YVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxEYXRhKGVsKSB7XG4gIGxldCBpZCA9IGVsW2VsSWRBdHRyXTtcblxuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBlbFtlbElkQXR0cl0gPSBHdWlkLm5ld0dVSUQoKTtcbiAgfVxuXG4gIGlmICghZWxEYXRhW2lkXSkge1xuICAgIGVsRGF0YVtpZF0gPSB7fTtcbiAgfVxuXG4gIHJldHVybiBlbERhdGFbaWRdO1xufVxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgYW4gZWxlbWVudCBoYXMgY2FjaGVkIGRhdGFcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbCBBIGRvbSBlbGVtZW50XG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBoYXNFbERhdGFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VsRGF0YShlbCkge1xuICBjb25zdCBpZCA9IGVsW2VsSWRBdHRyXTtcblxuICBpZiAoIWlkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuICEhT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZWxEYXRhW2lkXSkubGVuZ3RoO1xufVxuXG4vKipcbiAqIERlbGV0ZSBkYXRhIGZvciB0aGUgZWxlbWVudCBmcm9tIHRoZSBjYWNoZSBhbmQgdGhlIGd1aWQgYXR0ciBmcm9tIGdldEVsZW1lbnRCeUlkXG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgUmVtb3ZlIGRhdGEgZm9yIGFuIGVsZW1lbnRcbiAqIEBwcml2YXRlXG4gKiBAZnVuY3Rpb24gcmVtb3ZlRWxEYXRhXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVFbERhdGEoZWwpIHtcbiAgbGV0IGlkID0gZWxbZWxJZEF0dHJdO1xuXG4gIGlmICghaWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSZW1vdmUgYWxsIHN0b3JlZCBkYXRhXG4gIGRlbGV0ZSBlbERhdGFbaWRdO1xuXG4gIC8vIFJlbW92ZSB0aGUgZWxJZEF0dHIgcHJvcGVydHkgZnJvbSB0aGUgRE9NIG5vZGVcbiAgdHJ5IHtcbiAgICBkZWxldGUgZWxbZWxJZEF0dHJdO1xuICB9IGNhdGNoKGUpIHtcbiAgICBpZiAoZWwucmVtb3ZlQXR0cmlidXRlKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoZWxJZEF0dHIpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJRSBkb2Vzbid0IGFwcGVhciB0byBzdXBwb3J0IHJlbW92ZUF0dHJpYnV0ZSBvbiB0aGUgZG9jdW1lbnQgZWxlbWVudFxuICAgICAgZWxbZWxJZEF0dHJdID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBlbGVtZW50IGhhcyBhIENTUyBjbGFzc1xuICpcbiAqIEBmdW5jdGlvbiBoYXNFbENsYXNzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9DaGVjayBDbGFzc25hbWUgdG8gY2hlY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc0VsQ2xhc3MoZWxlbWVudCwgY2xhc3NUb0NoZWNrKSB7XG4gIHRocm93SWZXaGl0ZXNwYWNlKGNsYXNzVG9DaGVjayk7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIHJldHVybiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc1RvQ2hlY2spO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjbGFzc1JlZ0V4cChjbGFzc1RvQ2hlY2spLnRlc3QoZWxlbWVudC5jbGFzc05hbWUpO1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgQ1NTIGNsYXNzIG5hbWUgdG8gYW4gZWxlbWVudFxuICpcbiAqIEBmdW5jdGlvbiBhZGRFbENsYXNzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgICAgRWxlbWVudCB0byBhZGQgY2xhc3MgbmFtZSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9BZGQgQ2xhc3NuYW1lIHRvIGFkZFxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRWxDbGFzcyhlbGVtZW50LCBjbGFzc1RvQWRkKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc1RvQWRkKTtcblxuICAvLyBEb24ndCBuZWVkIHRvIGB0aHJvd0lmV2hpdGVzcGFjZWAgaGVyZSBiZWNhdXNlIGBoYXNFbENsYXNzYCB3aWxsIGRvIGl0XG4gIC8vIGluIHRoZSBjYXNlIG9mIGNsYXNzTGlzdCBub3QgYmVpbmcgc3VwcG9ydGVkLlxuICB9IGVsc2UgaWYgKCFoYXNFbENsYXNzKGVsZW1lbnQsIGNsYXNzVG9BZGQpKSB7XG4gICAgZWxlbWVudC5jbGFzc05hbWUgPSAoZWxlbWVudC5jbGFzc05hbWUgKyAnICcgKyBjbGFzc1RvQWRkKS50cmltKCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgYSBDU1MgY2xhc3MgbmFtZSBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBAZnVuY3Rpb24gcmVtb3ZlRWxDbGFzc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50ICAgIEVsZW1lbnQgdG8gcmVtb3ZlIGZyb20gY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9SZW1vdmUgQ2xhc3NuYW1lIHRvIHJlbW92ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRWxDbGFzcyhlbGVtZW50LCBjbGFzc1RvUmVtb3ZlKSB7XG4gIGlmIChlbGVtZW50LmNsYXNzTGlzdCkge1xuICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShjbGFzc1RvUmVtb3ZlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvd0lmV2hpdGVzcGFjZShjbGFzc1RvUmVtb3ZlKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IGVsZW1lbnQuY2xhc3NOYW1lLnNwbGl0KC9cXHMrLykuZmlsdGVyKGZ1bmN0aW9uKGMpIHtcbiAgICAgIHJldHVybiBjICE9PSBjbGFzc1RvUmVtb3ZlO1xuICAgIH0pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgb3IgcmVtb3ZlcyBhIENTUyBjbGFzcyBuYW1lIG9uIGFuIGVsZW1lbnQgZGVwZW5kaW5nIG9uIGFuIG9wdGlvbmFsXG4gKiBjb25kaXRpb24gb3IgdGhlIHByZXNlbmNlL2Fic2VuY2Ugb2YgdGhlIGNsYXNzIG5hbWUuXG4gKlxuICogQGZ1bmN0aW9uIHRvZ2dsZUVsQ2xhc3NcbiAqIEBwYXJhbSAgICB7RWxlbWVudH0gZWxlbWVudFxuICogQHBhcmFtICAgIHtTdHJpbmd9IGNsYXNzVG9Ub2dnbGVcbiAqIEBwYXJhbSAgICB7Qm9vbGVhbnxGdW5jdGlvbn0gW3ByZWRpY2F0ZV1cbiAqICAgICAgICAgICBDYW4gYmUgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBCb29sZWFuLiBJZiBgdHJ1ZWAsIHRoZSBjbGFzc1xuICogICAgICAgICAgIHdpbGwgYmUgYWRkZWQ7IGlmIGBmYWxzZWAsIHRoZSBjbGFzcyB3aWxsIGJlIHJlbW92ZWQuIElmIG5vdFxuICogICAgICAgICAgIGdpdmVuLCB0aGUgY2xhc3Mgd2lsbCBiZSBhZGRlZCBpZiBub3QgcHJlc2VudCBhbmQgdmljZSB2ZXJzYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUVsQ2xhc3MoZWxlbWVudCwgY2xhc3NUb1RvZ2dsZSwgcHJlZGljYXRlKSB7XG5cbiAgLy8gVGhpcyBDQU5OT1QgdXNlIGBjbGFzc0xpc3RgIGludGVybmFsbHkgYmVjYXVzZSBJRSBkb2VzIG5vdCBzdXBwb3J0IHRoZVxuICAvLyBzZWNvbmQgcGFyYW1ldGVyIHRvIHRoZSBgY2xhc3NMaXN0LnRvZ2dsZSgpYCBtZXRob2QhIFdoaWNoIGlzIGZpbmUgYmVjYXVzZVxuICAvLyBgY2xhc3NMaXN0YCB3aWxsIGJlIHVzZWQgYnkgdGhlIGFkZC9yZW1vdmUgZnVuY3Rpb25zLlxuICBsZXQgaGFzID0gaGFzRWxDbGFzcyhlbGVtZW50LCBjbGFzc1RvVG9nZ2xlKTtcblxuICBpZiAodHlwZW9mIHByZWRpY2F0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZShlbGVtZW50LCBjbGFzc1RvVG9nZ2xlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgcHJlZGljYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICBwcmVkaWNhdGUgPSAhaGFzO1xuICB9XG5cbiAgLy8gSWYgdGhlIG5lY2Vzc2FyeSBjbGFzcyBvcGVyYXRpb24gbWF0Y2hlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGVcbiAgLy8gZWxlbWVudCwgbm8gYWN0aW9uIGlzIHJlcXVpcmVkLlxuICBpZiAocHJlZGljYXRlID09PSBoYXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAocHJlZGljYXRlKSB7XG4gICAgYWRkRWxDbGFzcyhlbGVtZW50LCBjbGFzc1RvVG9nZ2xlKTtcbiAgfSBlbHNlIHtcbiAgICByZW1vdmVFbENsYXNzKGVsZW1lbnQsIGNsYXNzVG9Ub2dnbGUpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59XG5cbi8qKlxuICogQXBwbHkgYXR0cmlidXRlcyB0byBhbiBIVE1MIGVsZW1lbnQuXG4gKlxuICogQHBhcmFtICB7RWxlbWVudH0gZWwgICAgICAgICBUYXJnZXQgZWxlbWVudC5cbiAqIEBwYXJhbSAge09iamVjdD19IGF0dHJpYnV0ZXMgRWxlbWVudCBhdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQuXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIHNldEVsQXR0cmlidXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RWxBdHRyaWJ1dGVzKGVsLCBhdHRyaWJ1dGVzKSB7XG4gIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGF0dHJpYnV0ZXMpLmZvckVhY2goZnVuY3Rpb24oYXR0ck5hbWUpe1xuICAgIGxldCBhdHRyVmFsdWUgPSBhdHRyaWJ1dGVzW2F0dHJOYW1lXTtcblxuICAgIGlmIChhdHRyVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGF0dHJWYWx1ZSA9PT0gJ3VuZGVmaW5lZCcgfHwgYXR0clZhbHVlID09PSBmYWxzZSkge1xuICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCAoYXR0clZhbHVlID09PSB0cnVlID8gJycgOiBhdHRyVmFsdWUpKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldCBhbiBlbGVtZW50J3MgYXR0cmlidXRlIHZhbHVlcywgYXMgZGVmaW5lZCBvbiB0aGUgSFRNTCB0YWdcbiAqIEF0dHJpYnV0ZXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBwcm9wZXJ0aWVzLiBUaGV5J3JlIGRlZmluZWQgb24gdGhlIHRhZ1xuICogb3Igd2l0aCBzZXRBdHRyaWJ1dGUgKHdoaWNoIHNob3VsZG4ndCBiZSB1c2VkIHdpdGggSFRNTClcbiAqIFRoaXMgd2lsbCByZXR1cm4gdHJ1ZSBvciBmYWxzZSBmb3IgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR9IHRhZyBFbGVtZW50IGZyb20gd2hpY2ggdG8gZ2V0IHRhZyBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIGdldEVsQXR0cmlidXRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWxBdHRyaWJ1dGVzKHRhZykge1xuICB2YXIgb2JqLCBrbm93bkJvb2xlYW5zLCBhdHRycywgYXR0ck5hbWUsIGF0dHJWYWw7XG5cbiAgb2JqID0ge307XG5cbiAgLy8ga25vd24gYm9vbGVhbiBhdHRyaWJ1dGVzXG4gIC8vIHdlIGNhbiBjaGVjayBmb3IgbWF0Y2hpbmcgYm9vbGVhbiBwcm9wZXJ0aWVzLCBidXQgb2xkZXIgYnJvd3NlcnNcbiAgLy8gd29uJ3Qga25vdyBhYm91dCBIVE1MNSBib29sZWFuIGF0dHJpYnV0ZXMgdGhhdCB3ZSBzdGlsbCByZWFkIGZyb21cbiAga25vd25Cb29sZWFucyA9ICcsJysnYXV0b3BsYXksY29udHJvbHMsbG9vcCxtdXRlZCxkZWZhdWx0JysnLCc7XG5cbiAgaWYgKHRhZyAmJiB0YWcuYXR0cmlidXRlcyAmJiB0YWcuYXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgYXR0cnMgPSB0YWcuYXR0cmlidXRlcztcblxuICAgIGZvciAodmFyIGkgPSBhdHRycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgYXR0ck5hbWUgPSBhdHRyc1tpXS5uYW1lO1xuICAgICAgYXR0clZhbCA9IGF0dHJzW2ldLnZhbHVlO1xuXG4gICAgICAvLyBjaGVjayBmb3Iga25vd24gYm9vbGVhbnNcbiAgICAgIC8vIHRoZSBtYXRjaGluZyBlbGVtZW50IHByb3BlcnR5IHdpbGwgcmV0dXJuIGEgdmFsdWUgZm9yIHR5cGVvZlxuICAgICAgaWYgKHR5cGVvZiB0YWdbYXR0ck5hbWVdID09PSAnYm9vbGVhbicgfHwga25vd25Cb29sZWFucy5pbmRleE9mKCcsJythdHRyTmFtZSsnLCcpICE9PSAtMSkge1xuICAgICAgICAvLyB0aGUgdmFsdWUgb2YgYW4gaW5jbHVkZWQgYm9vbGVhbiBhdHRyaWJ1dGUgaXMgdHlwaWNhbGx5IGFuIGVtcHR5XG4gICAgICAgIC8vIHN0cmluZyAoJycpIHdoaWNoIHdvdWxkIGVxdWFsIGZhbHNlIGlmIHdlIGp1c3QgY2hlY2sgZm9yIGEgZmFsc2UgdmFsdWUuXG4gICAgICAgIC8vIHdlIGFsc28gZG9uJ3Qgd2FudCBzdXBwb3J0IGJhZCBjb2RlIGxpa2UgYXV0b3BsYXk9J2ZhbHNlJ1xuICAgICAgICBhdHRyVmFsID0gKGF0dHJWYWwgIT09IG51bGwpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBvYmpbYXR0ck5hbWVdID0gYXR0clZhbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2JqO1xufVxuXG4vKipcbiAqIEF0dGVtcHQgdG8gYmxvY2sgdGhlIGFiaWxpdHkgdG8gc2VsZWN0IHRleHQgd2hpbGUgZHJhZ2dpbmcgY29udHJvbHNcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGZ1bmN0aW9uIGJsb2NrVGV4dFNlbGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tUZXh0U2VsZWN0aW9uKCkge1xuICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gIGRvY3VtZW50Lm9uc2VsZWN0c3RhcnQgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbi8qKlxuICogVHVybiBvZmYgdGV4dCBzZWxlY3Rpb24gYmxvY2tpbmdcbiAqXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICogQGZ1bmN0aW9uIHVuYmxvY2tUZXh0U2VsZWN0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmJsb2NrVGV4dFNlbGVjdGlvbigpIHtcbiAgZG9jdW1lbnQub25zZWxlY3RzdGFydCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xufVxuXG4vKipcbiAqIE9mZnNldCBMZWZ0XG4gKiBnZXRCb3VuZGluZ0NsaWVudFJlY3QgdGVjaG5pcXVlIGZyb21cbiAqIEpvaG4gUmVzaWcgaHR0cDovL2Vqb2huLm9yZy9ibG9nL2dldGJvdW5kaW5nY2xpZW50cmVjdC1pcy1hd2Vzb21lL1xuICpcbiAqIEBmdW5jdGlvbiBmaW5kRWxQb3NpdGlvblxuICogQHBhcmFtIHtFbGVtZW50fSBlbCBFbGVtZW50IGZyb20gd2hpY2ggdG8gZ2V0IG9mZnNldFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEVsUG9zaXRpb24oZWwpIHtcbiAgbGV0IGJveDtcblxuICBpZiAoZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICYmIGVsLnBhcmVudE5vZGUpIHtcbiAgICBib3ggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfVxuXG4gIGlmICghYm94KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGxlZnQ6IDAsXG4gICAgICB0b3A6IDBcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgZG9jRWwgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5ib2R5O1xuXG4gIGNvbnN0IGNsaWVudExlZnQgPSBkb2NFbC5jbGllbnRMZWZ0IHx8IGJvZHkuY2xpZW50TGVmdCB8fCAwO1xuICBjb25zdCBzY3JvbGxMZWZ0ID0gd2luZG93LnBhZ2VYT2Zmc2V0IHx8IGJvZHkuc2Nyb2xsTGVmdDtcbiAgY29uc3QgbGVmdCA9IGJveC5sZWZ0ICsgc2Nyb2xsTGVmdCAtIGNsaWVudExlZnQ7XG5cbiAgY29uc3QgY2xpZW50VG9wID0gZG9jRWwuY2xpZW50VG9wIHx8IGJvZHkuY2xpZW50VG9wIHx8IDA7XG4gIGNvbnN0IHNjcm9sbFRvcCA9IHdpbmRvdy5wYWdlWU9mZnNldCB8fCBib2R5LnNjcm9sbFRvcDtcbiAgY29uc3QgdG9wID0gYm94LnRvcCArIHNjcm9sbFRvcCAtIGNsaWVudFRvcDtcblxuICAvLyBBbmRyb2lkIHNvbWV0aW1lcyByZXR1cm5zIHNsaWdodGx5IG9mZiBkZWNpbWFsIHZhbHVlcywgc28gbmVlZCB0byByb3VuZFxuICByZXR1cm4ge1xuICAgIGxlZnQ6IE1hdGgucm91bmQobGVmdCksXG4gICAgdG9wOiBNYXRoLnJvdW5kKHRvcClcbiAgfTtcbn1cblxuLyoqXG4gKiBHZXQgcG9pbnRlciBwb3NpdGlvbiBpbiBlbGVtZW50XG4gKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHggYW5kIHkgY29vcmRpbmF0ZXMuXG4gKiBUaGUgYmFzZSBvbiB0aGUgY29vcmRpbmF0ZXMgYXJlIHRoZSBib3R0b20gbGVmdCBvZiB0aGUgZWxlbWVudC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0UG9pbnRlclBvc2l0aW9uXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIEVsZW1lbnQgb24gd2hpY2ggdG8gZ2V0IHRoZSBwb2ludGVyIHBvc2l0aW9uIG9uXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCBFdmVudCBvYmplY3RcbiAqIEByZXR1cm4ge09iamVjdH0gVGhpcyBvYmplY3Qgd2lsbCBoYXZlIHggYW5kIHkgY29vcmRpbmF0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbW91c2UgcG9zaXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBvaW50ZXJQb3NpdGlvbihlbCwgZXZlbnQpIHtcbiAgbGV0IHBvc2l0aW9uID0ge307XG4gIGxldCBib3ggPSBmaW5kRWxQb3NpdGlvbihlbCk7XG4gIGxldCBib3hXID0gZWwub2Zmc2V0V2lkdGg7XG4gIGxldCBib3hIID0gZWwub2Zmc2V0SGVpZ2h0O1xuXG4gIGxldCBib3hZID0gYm94LnRvcDtcbiAgbGV0IGJveFggPSBib3gubGVmdDtcbiAgbGV0IHBhZ2VZID0gZXZlbnQucGFnZVk7XG4gIGxldCBwYWdlWCA9IGV2ZW50LnBhZ2VYO1xuXG4gIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykge1xuICAgIHBhZ2VYID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0ucGFnZVg7XG4gICAgcGFnZVkgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5wYWdlWTtcbiAgfVxuXG4gIHBvc2l0aW9uLnkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCAoKGJveFkgLSBwYWdlWSkgKyBib3hIKSAvIGJveEgpKTtcbiAgcG9zaXRpb24ueCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChwYWdlWCAtIGJveFgpIC8gYm94VykpO1xuXG4gIHJldHVybiBwb3NpdGlvbjtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSBET00gZWxlbWVudC5cbiAqXG4gKiBAZnVuY3Rpb24gaXNFbFxuICogQHBhcmFtICAgIHtNaXhlZH0gdmFsdWVcbiAqIEByZXR1cm4gICB7Qm9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRWwodmFsdWUpIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5ub2RlVHlwZSA9PT0gMTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSB0ZXh0IG5vZGUuXG4gKlxuICogQHBhcmFtICB7TWl4ZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNUZXh0Tm9kZSh2YWx1ZSkge1xuICByZXR1cm4gISF2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlLm5vZGVUeXBlID09PSAzO1xufVxuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogQGZ1bmN0aW9uIGVtcHR5RWxcbiAqIEBwYXJhbSAgICB7RWxlbWVudH0gZWxcbiAqIEByZXR1cm4gICB7RWxlbWVudH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVtcHR5RWwoZWwpIHtcbiAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICBlbC5yZW1vdmVDaGlsZChlbC5maXJzdENoaWxkKTtcbiAgfVxuICByZXR1cm4gZWw7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBjb250ZW50IGZvciBldmVudHVhbCBpbnNlcnRpb24gaW50byB0aGUgRE9NLlxuICpcbiAqIFRoaXMgYWxsb3dzIGEgd2lkZSByYW5nZSBvZiBjb250ZW50IGRlZmluaXRpb24gbWV0aG9kcywgYnV0IHByb3RlY3RzXG4gKiBmcm9tIGZhbGxpbmcgaW50byB0aGUgdHJhcCBvZiBzaW1wbHkgd3JpdGluZyB0byBgaW5uZXJIVE1MYCwgd2hpY2ggaXNcbiAqIGFuIFhTUyBjb25jZXJuLlxuICpcbiAqIFRoZSBjb250ZW50IGZvciBhbiBlbGVtZW50IGNhbiBiZSBwYXNzZWQgaW4gbXVsdGlwbGUgdHlwZXMgYW5kXG4gKiBjb21iaW5hdGlvbnMsIHdob3NlIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6XG4gKlxuICogLSBTdHJpbmdcbiAqICAgTm9ybWFsaXplZCBpbnRvIGEgdGV4dCBub2RlLlxuICpcbiAqIC0gRWxlbWVudCwgVGV4dE5vZGVcbiAqICAgUGFzc2VkIHRocm91Z2guXG4gKlxuICogLSBBcnJheVxuICogICBBIG9uZS1kaW1lbnNpb25hbCBhcnJheSBvZiBzdHJpbmdzLCBlbGVtZW50cywgbm9kZXMsIG9yIGZ1bmN0aW9ucyAod2hpY2hcbiAqICAgcmV0dXJuIHNpbmdsZSBzdHJpbmdzLCBlbGVtZW50cywgb3Igbm9kZXMpLlxuICpcbiAqIC0gRnVuY3Rpb25cbiAqICAgSWYgdGhlIHNvbGUgYXJndW1lbnQsIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgYSBzdHJpbmcsIGVsZW1lbnQsXG4gKiAgIG5vZGUsIG9yIGFycmF5LlxuICpcbiAqIEBmdW5jdGlvbiBub3JtYWxpemVDb250ZW50XG4gKiBAcGFyYW0gICAge1N0cmluZ3xFbGVtZW50fFRleHROb2RlfEFycmF5fEZ1bmN0aW9ufSBjb250ZW50XG4gKiBAcmV0dXJuICAge0FycmF5fVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ29udGVudChjb250ZW50KSB7XG5cbiAgLy8gRmlyc3QsIGludm9rZSBjb250ZW50IGlmIGl0IGlzIGEgZnVuY3Rpb24uIElmIGl0IHByb2R1Y2VzIGFuIGFycmF5LFxuICAvLyB0aGF0IG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgbm9ybWFsaXphdGlvbi5cbiAgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29udGVudCA9IGNvbnRlbnQoKTtcbiAgfVxuXG4gIC8vIE5leHQgdXAsIG5vcm1hbGl6ZSB0byBhbiBhcnJheSwgc28gb25lIG9yIG1hbnkgaXRlbXMgY2FuIGJlIG5vcm1hbGl6ZWQsXG4gIC8vIGZpbHRlcmVkLCBhbmQgcmV0dXJuZWQuXG4gIHJldHVybiAoQXJyYXkuaXNBcnJheShjb250ZW50KSA/IGNvbnRlbnQgOiBbY29udGVudF0pLm1hcCh2YWx1ZSA9PiB7XG5cbiAgICAvLyBGaXJzdCwgaW52b2tlIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24gdG8gcHJvZHVjZSBhIG5ldyB2YWx1ZSxcbiAgICAvLyB3aGljaCB3aWxsIGJlIHN1YnNlcXVlbnRseSBub3JtYWxpemVkIHRvIGEgTm9kZSBvZiBzb21lIGtpbmQuXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdmFsdWUgPSB2YWx1ZSgpO1xuICAgIH1cblxuICAgIGlmIChpc0VsKHZhbHVlKSB8fCBpc1RleHROb2RlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIC9cXFMvLnRlc3QodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgIH1cbiAgfSkuZmlsdGVyKHZhbHVlID0+IHZhbHVlKTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemVzIGFuZCBhcHBlbmRzIGNvbnRlbnQgdG8gYW4gZWxlbWVudC5cbiAqXG4gKiBAZnVuY3Rpb24gYXBwZW5kQ29udGVudFxuICogQHBhcmFtICAgIHtFbGVtZW50fSBlbFxuICogQHBhcmFtICAgIHtTdHJpbmd8RWxlbWVudHxUZXh0Tm9kZXxBcnJheXxGdW5jdGlvbn0gY29udGVudFxuICogICAgICAgICAgIFNlZTogYG5vcm1hbGl6ZUNvbnRlbnRgXG4gKiBAcmV0dXJuICAge0VsZW1lbnR9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBlbmRDb250ZW50KGVsLCBjb250ZW50KSB7XG4gIG5vcm1hbGl6ZUNvbnRlbnQoY29udGVudCkuZm9yRWFjaChub2RlID0+IGVsLmFwcGVuZENoaWxkKG5vZGUpKTtcbiAgcmV0dXJuIGVsO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIGluc2VydHMgY29udGVudCBpbnRvIGFuIGVsZW1lbnQ7IHRoaXMgaXMgaWRlbnRpY2FsIHRvXG4gKiBgYXBwZW5kQ29udGVudCgpYCwgZXhjZXB0IGl0IGVtcHRpZXMgdGhlIGVsZW1lbnQgZmlyc3QuXG4gKlxuICogQGZ1bmN0aW9uIGluc2VydENvbnRlbnRcbiAqIEBwYXJhbSAgICB7RWxlbWVudH0gZWxcbiAqIEBwYXJhbSAgICB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnRcbiAqICAgICAgICAgICBTZWU6IGBub3JtYWxpemVDb250ZW50YFxuICogQHJldHVybiAgIHtFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zZXJ0Q29udGVudChlbCwgY29udGVudCkge1xuICByZXR1cm4gYXBwZW5kQ29udGVudChlbXB0eUVsKGVsKSwgY29udGVudCk7XG59XG5cbi8qKlxuICogRmluZHMgYSBzaW5nbGUgRE9NIGVsZW1lbnQgbWF0Y2hpbmcgYHNlbGVjdG9yYCB3aXRoaW4gdGhlIG9wdGlvbmFsXG4gKiBgY29udGV4dGAgb2YgYW5vdGhlciBET00gZWxlbWVudCAoZGVmYXVsdGluZyB0byBgZG9jdW1lbnRgKS5cbiAqXG4gKiBAZnVuY3Rpb24gJFxuICogQHBhcmFtICAgIHtTdHJpbmd9IHNlbGVjdG9yXG4gKiAgICAgICAgICAgQSB2YWxpZCBDU1Mgc2VsZWN0b3IsIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIGBxdWVyeVNlbGVjdG9yYC5cbiAqXG4gKiBAcGFyYW0gICAge0VsZW1lbnR8U3RyaW5nfSBbY29udGV4dD1kb2N1bWVudF1cbiAqICAgICAgICAgICBBIERPTSBlbGVtZW50IHdpdGhpbiB3aGljaCB0byBxdWVyeS4gQ2FuIGFsc28gYmUgYSBzZWxlY3RvclxuICogICAgICAgICAgIHN0cmluZyBpbiB3aGljaCBjYXNlIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IHdpbGwgYmUgdXNlZFxuICogICAgICAgICAgIGFzIGNvbnRleHQuIElmIG1pc3NpbmcgKG9yIG5vIGVsZW1lbnQgbWF0Y2hlcyBzZWxlY3RvciksIGZhbGxzXG4gKiAgICAgICAgICAgYmFjayB0byBgZG9jdW1lbnRgLlxuICpcbiAqIEByZXR1cm4gICB7RWxlbWVudHxudWxsfVxuICovXG5leHBvcnQgY29uc3QgJCA9IGNyZWF0ZVF1ZXJpZXIoJ3F1ZXJ5U2VsZWN0b3InKTtcblxuLyoqXG4gKiBGaW5kcyBhIGFsbCBET00gZWxlbWVudHMgbWF0Y2hpbmcgYHNlbGVjdG9yYCB3aXRoaW4gdGhlIG9wdGlvbmFsXG4gKiBgY29udGV4dGAgb2YgYW5vdGhlciBET00gZWxlbWVudCAoZGVmYXVsdGluZyB0byBgZG9jdW1lbnRgKS5cbiAqXG4gKiBAZnVuY3Rpb24gJCRcbiAqIEBwYXJhbSAgICB7U3RyaW5nfSBzZWxlY3RvclxuICogICAgICAgICAgIEEgdmFsaWQgQ1NTIHNlbGVjdG9yLCB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBgcXVlcnlTZWxlY3RvckFsbGAuXG4gKlxuICogQHBhcmFtICAgIHtFbGVtZW50fFN0cmluZ30gW2NvbnRleHQ9ZG9jdW1lbnRdXG4gKiAgICAgICAgICAgQSBET00gZWxlbWVudCB3aXRoaW4gd2hpY2ggdG8gcXVlcnkuIENhbiBhbHNvIGJlIGEgc2VsZWN0b3JcbiAqICAgICAgICAgICBzdHJpbmcgaW4gd2hpY2ggY2FzZSB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCB3aWxsIGJlIHVzZWRcbiAqICAgICAgICAgICBhcyBjb250ZXh0LiBJZiBtaXNzaW5nIChvciBubyBlbGVtZW50IG1hdGNoZXMgc2VsZWN0b3IpLCBmYWxsc1xuICogICAgICAgICAgIGJhY2sgdG8gYGRvY3VtZW50YC5cbiAqXG4gKiBAcmV0dXJuICAge05vZGVMaXN0fVxuICovXG5leHBvcnQgY29uc3QgJCQgPSBjcmVhdGVRdWVyaWVyKCdxdWVyeVNlbGVjdG9yQWxsJyk7XG4iXX0=
},{"./guid.js":148,"./log.js":149,"global/document":7,"global/window":8,"tsml":59}],145:[function(_dereq_,module,exports){
/**
* @file events.js
*
* Event System (John Resig - Secrets of a JS Ninja http://jsninja.com/)
* (Original book version wasn't completely usable, so fixed some things and made Closure Compiler compatible)
* This should work very similarly to jQuery's events, however it's based off the book version which isn't as
* robust as jquery's, so there's probably some differences.
*/
'use strict';
exports.__esModule = true;
exports.on = on;
exports.off = off;
exports.trigger = trigger;
exports.one = one;
exports.fixEvent = fixEvent;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
var _domJs = _dereq_('./dom.js');
var Dom = _interopRequireWildcard(_domJs);
var _guidJs = _dereq_('./guid.js');
var Guid = _interopRequireWildcard(_guidJs);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
/**
* Add an event listener to element
* It stores the handler function in a separate cache object
* and adds a generic handler to the element's event,
* along with a unique id (guid) to the element.
*
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String|Array} type Type of event to bind to.
* @param {Function} fn Event listener.
* @method on
*/
function on(elem, type, fn) {
if (Array.isArray(type)) {
return _handleMultipleEvents(on, elem, type, fn);
}
var data = Dom.getElData(elem);
// We need a place to store all our handler data
if (!data.handlers) data.handlers = {};
if (!data.handlers[type]) data.handlers[type] = [];
if (!fn.guid) fn.guid = Guid.newGUID();
data.handlers[type].push(fn);
if (!data.dispatcher) {
data.disabled = false;
data.dispatcher = function (event, hash) {
if (data.disabled) return;
event = fixEvent(event);
var handlers = data.handlers[event.type];
if (handlers) {
// Copy handlers so if handlers are added/removed during the process it doesn't throw everything off.
var handlersCopy = handlers.slice(0);
for (var m = 0, n = handlersCopy.length; m < n; m++) {
if (event.isImmediatePropagationStopped()) {
break;
} else {
handlersCopy[m].call(elem, event, hash);
}
}
}
};
}
if (data.handlers[type].length === 1) {
if (elem.addEventListener) {
elem.addEventListener(type, data.dispatcher, false);
} else if (elem.attachEvent) {
elem.attachEvent('on' + type, data.dispatcher);
}
}
}
/**
* Removes event listeners from an element
*
* @param {Element|Object} elem Object to remove listeners from
* @param {String|Array=} type Type of listener to remove. Don't include to remove all events from element.
* @param {Function} fn Specific listener to remove. Don't include to remove listeners for an event type.
* @method off
*/
function off(elem, type, fn) {
// Don't want to add a cache object through getElData if not needed
if (!Dom.hasElData(elem)) return;
var data = Dom.getElData(elem);
// If no events exist, nothing to unbind
if (!data.handlers) {
return;
}
if (Array.isArray(type)) {
return _handleMultipleEvents(off, elem, type, fn);
}
// Utility function
var removeType = function removeType(t) {
data.handlers[t] = [];
_cleanUpEvents(elem, t);
};
// Are we removing all bound events?
if (!type) {
for (var t in data.handlers) {
removeType(t);
}return;
}
var handlers = data.handlers[type];
// If no handlers exist, nothing to unbind
if (!handlers) return;
// If no listener was provided, remove all listeners for type
if (!fn) {
removeType(type);
return;
}
// We're only removing a single handler
if (fn.guid) {
for (var n = 0; n < handlers.length; n++) {
if (handlers[n].guid === fn.guid) {
handlers.splice(n--, 1);
}
}
}
_cleanUpEvents(elem, type);
}
/**
* Trigger an event for an element
*
* @param {Element|Object} elem Element to trigger an event on
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Boolean=} Returned only if default was prevented
* @method trigger
*/
function trigger(elem, event, hash) {
// Fetches element data and a reference to the parent (for bubbling).
// Don't want to add a data object to cache for every parent,
// so checking hasElData first.
var elemData = Dom.hasElData(elem) ? Dom.getElData(elem) : {};
var parent = elem.parentNode || elem.ownerDocument;
// type = event.type || event,
// handler;
// If an event name was passed as a string, creates an event out of it
if (typeof event === 'string') {
event = { type: event, target: elem };
}
// Normalizes the event properties.
event = fixEvent(event);
// If the passed element has a dispatcher, executes the established handlers.
if (elemData.dispatcher) {
elemData.dispatcher.call(elem, event, hash);
}
// Unless explicitly stopped or the event does not bubble (e.g. media events)
// recursively calls this function to bubble the event up the DOM.
if (parent && !event.isPropagationStopped() && event.bubbles === true) {
trigger.call(null, parent, event, hash);
// If at the top of the DOM, triggers the default action unless disabled.
} else if (!parent && !event.defaultPrevented) {
var targetData = Dom.getElData(event.target);
// Checks if the target has a default action for this event.
if (event.target[event.type]) {
// Temporarily disables event dispatching on the target as we have already executed the handler.
targetData.disabled = true;
// Executes the default action.
if (typeof event.target[event.type] === 'function') {
event.target[event.type]();
}
// Re-enables event dispatching.
targetData.disabled = false;
}
}
// Inform the triggerer if the default was prevented by returning false
return !event.defaultPrevented;
}
/**
* Trigger a listener only once for an event
*
* @param {Element|Object} elem Element or object to
* @param {String|Array} type Name/type of event
* @param {Function} fn Event handler function
* @method one
*/
function one(elem, type, fn) {
if (Array.isArray(type)) {
return _handleMultipleEvents(one, elem, type, fn);
}
var func = function func() {
off(elem, type, func);
fn.apply(this, arguments);
};
// copy the guid to the new function so it can removed using the original function's ID
func.guid = fn.guid = fn.guid || Guid.newGUID();
on(elem, type, func);
}
/**
* Fix a native event to have standard property values
*
* @param {Object} event Event object to fix
* @return {Object}
* @private
* @method fixEvent
*/
function fixEvent(event) {
function returnTrue() {
return true;
}
function returnFalse() {
return false;
}
// Test if fixing up is needed
// Used to check if !event.stopPropagation instead of isPropagationStopped
// But native events return true for stopPropagation, but don't have
// other expected methods like isPropagationStopped. Seems to be a problem
// with the Javascript Ninja code. So we're just overriding all events now.
if (!event || !event.isPropagationStopped) {
var old = event || _globalWindow2['default'].event;
event = {};
// Clone the old object so that we can modify the values event = {};
// IE8 Doesn't like when you mess with native event properties
// Firefox returns false for event.hasOwnProperty('type') and other props
// which makes copying more difficult.
// TODO: Probably best to create a whitelist of event props
for (var key in old) {
// Safari 6.0.3 warns you if you try to copy deprecated layerX/Y
// Chrome warns you if you try to copy deprecated keyboardEvent.keyLocation
// and webkitMovementX/Y
if (key !== 'layerX' && key !== 'layerY' && key !== 'keyLocation' && key !== 'webkitMovementX' && key !== 'webkitMovementY') {
// Chrome 32+ warns if you try to copy deprecated returnValue, but
// we still want to if preventDefault isn't supported (IE8).
if (!(key === 'returnValue' && old.preventDefault)) {
event[key] = old[key];
}
}
}
// The event occurred on this element
if (!event.target) {
event.target = event.srcElement || _globalDocument2['default'];
}
// Handle which other element the event is related to
if (!event.relatedTarget) {
event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
}
// Stop the default browser action
event.preventDefault = function () {
if (old.preventDefault) {
old.preventDefault();
}
event.returnValue = false;
old.returnValue = false;
event.defaultPrevented = true;
};
event.defaultPrevented = false;
// Stop the event from bubbling
event.stopPropagation = function () {
if (old.stopPropagation) {
old.stopPropagation();
}
event.cancelBubble = true;
old.cancelBubble = true;
event.isPropagationStopped = returnTrue;
};
event.isPropagationStopped = returnFalse;
// Stop the event from bubbling and executing other handlers
event.stopImmediatePropagation = function () {
if (old.stopImmediatePropagation) {
old.stopImmediatePropagation();
}
event.isImmediatePropagationStopped = returnTrue;
event.stopPropagation();
};
event.isImmediatePropagationStopped = returnFalse;
// Handle mouse position
if (event.clientX != null) {
var doc = _globalDocument2['default'].documentElement,
body = _globalDocument2['default'].body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
}
// Handle key presses
event.which = event.charCode || event.keyCode;
// Fix button for mouse clicks:
// 0 == left; 1 == middle; 2 == right
if (event.button != null) {
event.button = event.button & 1 ? 0 : event.button & 4 ? 1 : event.button & 2 ? 2 : 0;
}
}
// Returns fixed-up instance
return event;
}
/**
* Clean up the listener cache and dispatchers
*
* @param {Element|Object} elem Element to clean up
* @param {String} type Type of event to clean up
* @private
* @method _cleanUpEvents
*/
function _cleanUpEvents(elem, type) {
var data = Dom.getElData(elem);
// Remove the events of a particular type if there are none left
if (data.handlers[type].length === 0) {
delete data.handlers[type];
// data.handlers[type] = null;
// Setting to null was causing an error with data.handlers
// Remove the meta-handler from the element
if (elem.removeEventListener) {
elem.removeEventListener(type, data.dispatcher, false);
} else if (elem.detachEvent) {
elem.detachEvent('on' + type, data.dispatcher);
}
}
// Remove the events object if there are no types left
if (Object.getOwnPropertyNames(data.handlers).length <= 0) {
delete data.handlers;
delete data.dispatcher;
delete data.disabled;
}
// Finally remove the element data if there is no data left
if (Object.getOwnPropertyNames(data).length === 0) {
Dom.removeElData(elem);
}
}
/**
* Loops through an array of event types and calls the requested method for each type.
*
* @param {Function} fn The event method we want to use.
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String} type Type of event to bind to.
* @param {Function} callback Event listener.
* @private
* @function _handleMultipleEvents
*/
function _handleMultipleEvents(fn, elem, types, callback) {
types.forEach(function (type) {
//Call the event method for each one of the types
fn(elem, type, callback);
});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9ldmVudHMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztxQkFTc0IsVUFBVTs7SUFBbkIsR0FBRzs7c0JBQ08sV0FBVzs7SUFBckIsSUFBSTs7NEJBQ0UsZUFBZTs7Ozs4QkFDYixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhL0IsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUM7QUFDaEMsTUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO0FBQ3ZCLFdBQU8scUJBQXFCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDbEQ7O0FBRUQsTUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQzs7O0FBRy9CLE1BQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDOztBQUV2QyxNQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQzs7QUFFbkQsTUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7O0FBRXZDLE1BQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztBQUU3QixNQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtBQUNwQixRQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzs7QUFFdEIsUUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEtBQUssRUFBRSxJQUFJLEVBQUM7O0FBRXRDLFVBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPO0FBQzFCLFdBQUss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QyxNQUFNLElBQUksQ0FBQyxFQUFFO0FBQ3pELFdBQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztBQUNyQixXQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7QUFDdkIsV0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0dBQ3RCOzs7QUFHRCxNQUFJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0FBQ2pELE9BQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDeEI7Q0FDRjs7Ozs7Ozs7Ozs7O0FBWUQsU0FBUyxxQkFBcUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7QUFDeEQsT0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFTLElBQUksRUFBRTs7QUFFM0IsTUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7R0FDMUIsQ0FBQyxDQUFDO0NBQ0oiLCJmaWxlIjoic3JjL2pzL3V0aWxzL2V2ZW50cy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgZXZlbnRzLmpzXG4gKlxuICogRXZlbnQgU3lzdGVtIChKb2huIFJlc2lnIC0gU2VjcmV0cyBvZiBhIEpTIE5pbmphIGh0dHA6Ly9qc25pbmphLmNvbS8pXG4gKiAoT3JpZ2luYWwgYm9vayB2ZXJzaW9uIHdhc24ndCBjb21wbGV0ZWx5IHVzYWJsZSwgc28gZml4ZWQgc29tZSB0aGluZ3MgYW5kIG1hZGUgQ2xvc3VyZSBDb21waWxlciBjb21wYXRpYmxlKVxuICogVGhpcyBzaG91bGQgd29yayB2ZXJ5IHNpbWlsYXJseSB0byBqUXVlcnkncyBldmVudHMsIGhvd2V2ZXIgaXQncyBiYXNlZCBvZmYgdGhlIGJvb2sgdmVyc2lvbiB3aGljaCBpc24ndCBhc1xuICogcm9idXN0IGFzIGpxdWVyeSdzLCBzbyB0aGVyZSdzIHByb2JhYmx5IHNvbWUgZGlmZmVyZW5jZXMuXG4gKi9cblxuaW1wb3J0ICAqIGFzIERvbSBmcm9tICcuL2RvbS5qcyc7XG5pbXBvcnQgICogYXMgR3VpZCBmcm9tICcuL2d1aWQuanMnO1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBlbGVtZW50XG4gKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3RcbiAqIGFuZCBhZGRzIGEgZ2VuZXJpYyBoYW5kbGVyIHRvIHRoZSBlbGVtZW50J3MgZXZlbnQsXG4gKiBhbG9uZyB3aXRoIGEgdW5pcXVlIGlkIChndWlkKSB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fE9iamVjdH0gICBlbGVtIEVsZW1lbnQgb3Igb2JqZWN0IHRvIGJpbmQgbGlzdGVuZXJzIHRvXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9ICAgdHlwZSBUeXBlIG9mIGV2ZW50IHRvIGJpbmQgdG8uXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICBFdmVudCBsaXN0ZW5lci5cbiAqIEBtZXRob2Qgb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uKGVsZW0sIHR5cGUsIGZuKXtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gX2hhbmRsZU11bHRpcGxlRXZlbnRzKG9uLCBlbGVtLCB0eXBlLCBmbik7XG4gIH1cblxuICBsZXQgZGF0YSA9IERvbS5nZXRFbERhdGEoZWxlbSk7XG5cbiAgLy8gV2UgbmVlZCBhIHBsYWNlIHRvIHN0b3JlIGFsbCBvdXIgaGFuZGxlciBkYXRhXG4gIGlmICghZGF0YS5oYW5kbGVycykgZGF0YS5oYW5kbGVycyA9IHt9O1xuXG4gIGlmICghZGF0YS5oYW5kbGVyc1t0eXBlXSkgZGF0YS5oYW5kbGVyc1t0eXBlXSA9IFtdO1xuXG4gIGlmICghZm4uZ3VpZCkgZm4uZ3VpZCA9IEd1aWQubmV3R1VJRCgpO1xuXG4gIGRhdGEuaGFuZGxlcnNbdHlwZV0ucHVzaChmbik7XG5cbiAgaWYgKCFkYXRhLmRpc3BhdGNoZXIpIHtcbiAgICBkYXRhLmRpc2FibGVkID0gZmFsc2U7XG5cbiAgICBkYXRhLmRpc3BhdGNoZXIgPSBmdW5jdGlvbiAoZXZlbnQsIGhhc2gpe1xuXG4gICAgICBpZiAoZGF0YS5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZXZlbnQgPSBmaXhFdmVudChldmVudCk7XG5cbiAgICAgIHZhciBoYW5kbGVycyA9IGRhdGEuaGFuZGxlcnNbZXZlbnQudHlwZV07XG5cbiAgICAgIGlmIChoYW5kbGVycykge1xuICAgICAgICAvLyBDb3B5IGhhbmRsZXJzIHNvIGlmIGhhbmRsZXJzIGFyZSBhZGRlZC9yZW1vdmVkIGR1cmluZyB0aGUgcHJvY2VzcyBpdCBkb2Vzbid0IHRocm93IGV2ZXJ5dGhpbmcgb2ZmLlxuICAgICAgICB2YXIgaGFuZGxlcnNDb3B5ID0gaGFuZGxlcnMuc2xpY2UoMCk7XG5cbiAgICAgICAgZm9yICh2YXIgbSA9IDAsIG4gPSBoYW5kbGVyc0NvcHkubGVuZ3RoOyBtIDwgbjsgbSsrKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVyc0NvcHlbbV0uY2FsbChlbGVtLCBldmVudCwgaGFzaCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCA9PT0gMSkge1xuICAgIGlmIChlbGVtLmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgIGVsZW0uYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBkYXRhLmRpc3BhdGNoZXIsIGZhbHNlKTtcbiAgICB9IGVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpIHtcbiAgICAgIGVsZW0uYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGRhdGEuZGlzcGF0Y2hlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudHxPYmplY3R9ICAgZWxlbSBPYmplY3QgdG8gcmVtb3ZlIGxpc3RlbmVycyBmcm9tXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXk9fSAgIHR5cGUgVHlwZSBvZiBsaXN0ZW5lciB0byByZW1vdmUuIERvbid0IGluY2x1ZGUgdG8gcmVtb3ZlIGFsbCBldmVudHMgZnJvbSBlbGVtZW50LlxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgU3BlY2lmaWMgbGlzdGVuZXIgdG8gcmVtb3ZlLiBEb24ndCBpbmNsdWRlIHRvIHJlbW92ZSBsaXN0ZW5lcnMgZm9yIGFuIGV2ZW50IHR5cGUuXG4gKiBAbWV0aG9kIG9mZlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2ZmKGVsZW0sIHR5cGUsIGZuKSB7XG4gIC8vIERvbid0IHdhbnQgdG8gYWRkIGEgY2FjaGUgb2JqZWN0IHRocm91Z2ggZ2V0RWxEYXRhIGlmIG5vdCBuZWVkZWRcbiAgaWYgKCFEb20uaGFzRWxEYXRhKGVsZW0pKSByZXR1cm47XG5cbiAgbGV0IGRhdGEgPSBEb20uZ2V0RWxEYXRhKGVsZW0pO1xuXG4gIC8vIElmIG5vIGV2ZW50cyBleGlzdCwgbm90aGluZyB0byB1bmJpbmRcbiAgaWYgKCFkYXRhLmhhbmRsZXJzKSB7IHJldHVybjsgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHR5cGUpKSB7XG4gICAgcmV0dXJuIF9oYW5kbGVNdWx0aXBsZUV2ZW50cyhvZmYsIGVsZW0sIHR5cGUsIGZuKTtcbiAgfVxuXG4gIC8vIFV0aWxpdHkgZnVuY3Rpb25cbiAgdmFyIHJlbW92ZVR5cGUgPSBmdW5jdGlvbih0KXtcbiAgICAgZGF0YS5oYW5kbGVyc1t0XSA9IFtdO1xuICAgICBfY2xlYW5VcEV2ZW50cyhlbGVtLHQpO1xuICB9O1xuXG4gIC8vIEFyZSB3ZSByZW1vdmluZyBhbGwgYm91bmQgZXZlbnRzP1xuICBpZiAoIXR5cGUpIHtcbiAgICBmb3IgKGxldCB0IGluIGRhdGEuaGFuZGxlcnMpIHJlbW92ZVR5cGUodCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGhhbmRsZXJzID0gZGF0YS5oYW5kbGVyc1t0eXBlXTtcblxuICAvLyBJZiBubyBoYW5kbGVycyBleGlzdCwgbm90aGluZyB0byB1bmJpbmRcbiAgaWYgKCFoYW5kbGVycykgcmV0dXJuO1xuXG4gIC8vIElmIG5vIGxpc3RlbmVyIHdhcyBwcm92aWRlZCwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgZm9yIHR5cGVcbiAgaWYgKCFmbikge1xuICAgIHJlbW92ZVR5cGUodHlwZSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gV2UncmUgb25seSByZW1vdmluZyBhIHNpbmdsZSBoYW5kbGVyXG4gIGlmIChmbi5ndWlkKSB7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCBoYW5kbGVycy5sZW5ndGg7IG4rKykge1xuICAgICAgaWYgKGhhbmRsZXJzW25dLmd1aWQgPT09IGZuLmd1aWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3BsaWNlKG4tLSwgMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2NsZWFuVXBFdmVudHMoZWxlbSwgdHlwZSk7XG59XG5cbi8qKlxuICogVHJpZ2dlciBhbiBldmVudCBmb3IgYW4gZWxlbWVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR8T2JqZWN0fSAgICAgIGVsZW0gIEVsZW1lbnQgdG8gdHJpZ2dlciBhbiBldmVudCBvblxuICogQHBhcmFtICB7RXZlbnR8T2JqZWN0fFN0cmluZ30gZXZlbnQgQSBzdHJpbmcgKHRoZSB0eXBlKSBvciBhbiBldmVudCBvYmplY3Qgd2l0aCBhIHR5cGUgYXR0cmlidXRlXG4gKiBAcGFyYW0gIHtPYmplY3R9IFtoYXNoXSBkYXRhIGhhc2ggdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBldmVudFxuICogQHJldHVybiB7Qm9vbGVhbj19IFJldHVybmVkIG9ubHkgaWYgZGVmYXVsdCB3YXMgcHJldmVudGVkXG4gKiBAbWV0aG9kIHRyaWdnZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXIoZWxlbSwgZXZlbnQsIGhhc2gpIHtcbiAgLy8gRmV0Y2hlcyBlbGVtZW50IGRhdGEgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJlbnQgKGZvciBidWJibGluZykuXG4gIC8vIERvbid0IHdhbnQgdG8gYWRkIGEgZGF0YSBvYmplY3QgdG8gY2FjaGUgZm9yIGV2ZXJ5IHBhcmVudCxcbiAgLy8gc28gY2hlY2tpbmcgaGFzRWxEYXRhIGZpcnN0LlxuICB2YXIgZWxlbURhdGEgPSAoRG9tLmhhc0VsRGF0YShlbGVtKSkgPyBEb20uZ2V0RWxEYXRhKGVsZW0pIDoge307XG4gIHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUgfHwgZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgLy8gdHlwZSA9IGV2ZW50LnR5cGUgfHwgZXZlbnQsXG4gICAgICAvLyBoYW5kbGVyO1xuXG4gIC8vIElmIGFuIGV2ZW50IG5hbWUgd2FzIHBhc3NlZCBhcyBhIHN0cmluZywgY3JlYXRlcyBhbiBldmVudCBvdXQgb2YgaXRcbiAgaWYgKHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycpIHtcbiAgICBldmVudCA9IHsgdHlwZTpldmVudCwgdGFyZ2V0OmVsZW0gfTtcbiAgfVxuICAvLyBOb3JtYWxpemVzIHRoZSBldmVudCBwcm9wZXJ0aWVzLlxuICBldmVudCA9IGZpeEV2ZW50KGV2ZW50KTtcblxuICAvLyBJZiB0aGUgcGFzc2VkIGVsZW1lbnQgaGFzIGEgZGlzcGF0Y2hlciwgZXhlY3V0ZXMgdGhlIGVzdGFibGlzaGVkIGhhbmRsZXJzLlxuICBpZiAoZWxlbURhdGEuZGlzcGF0Y2hlcikge1xuICAgIGVsZW1EYXRhLmRpc3BhdGNoZXIuY2FsbChlbGVtLCBldmVudCwgaGFzaCk7XG4gIH1cblxuICAvLyBVbmxlc3MgZXhwbGljaXRseSBzdG9wcGVkIG9yIHRoZSBldmVudCBkb2VzIG5vdCBidWJibGUgKGUuZy4gbWVkaWEgZXZlbnRzKVxuICAgIC8vIHJlY3Vyc2l2ZWx5IGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gYnViYmxlIHRoZSBldmVudCB1cCB0aGUgRE9NLlxuICAgIGlmIChwYXJlbnQgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgJiYgZXZlbnQuYnViYmxlcyA9PT0gdHJ1ZSkge1xuICAgICAgdHJpZ2dlci5jYWxsKG51bGwsIHBhcmVudCwgZXZlbnQsIGhhc2gpO1xuXG4gIC8vIElmIGF0IHRoZSB0b3Agb2YgdGhlIERPTSwgdHJpZ2dlcnMgdGhlIGRlZmF1bHQgYWN0aW9uIHVubGVzcyBkaXNhYmxlZC5cbiAgfSBlbHNlIGlmICghcGFyZW50ICYmICFldmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgdmFyIHRhcmdldERhdGEgPSBEb20uZ2V0RWxEYXRhKGV2ZW50LnRhcmdldCk7XG5cbiAgICAvLyBDaGVja3MgaWYgdGhlIHRhcmdldCBoYXMgYSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhpcyBldmVudC5cbiAgICBpZiAoZXZlbnQudGFyZ2V0W2V2ZW50LnR5cGVdKSB7XG4gICAgICAvLyBUZW1wb3JhcmlseSBkaXNhYmxlcyBldmVudCBkaXNwYXRjaGluZyBvbiB0aGUgdGFyZ2V0IGFzIHdlIGhhdmUgYWxyZWFkeSBleGVjdXRlZCB0aGUgaGFuZGxlci5cbiAgICAgIHRhcmdldERhdGEuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgLy8gRXhlY3V0ZXMgdGhlIGRlZmF1bHQgYWN0aW9uLlxuICAgICAgaWYgKHR5cGVvZiBldmVudC50YXJnZXRbZXZlbnQudHlwZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZXZlbnQudGFyZ2V0W2V2ZW50LnR5cGVdKCk7XG4gICAgICB9XG4gICAgICAvLyBSZS1lbmFibGVzIGV2ZW50IGRpc3BhdGNoaW5nLlxuICAgICAgdGFyZ2V0RGF0YS5kaXNhYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEluZm9ybSB0aGUgdHJpZ2dlcmVyIGlmIHRoZSBkZWZhdWx0IHdhcyBwcmV2ZW50ZWQgYnkgcmV0dXJuaW5nIGZhbHNlXG4gIHJldHVybiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZDtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGEgbGlzdGVuZXIgb25seSBvbmNlIGZvciBhbiBldmVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR8T2JqZWN0fSAgIGVsZW0gRWxlbWVudCBvciBvYmplY3QgdG9cbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gICB0eXBlIE5hbWUvdHlwZSBvZiBldmVudFxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBtZXRob2Qgb25lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmUoZWxlbSwgdHlwZSwgZm4pIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHtcbiAgICByZXR1cm4gX2hhbmRsZU11bHRpcGxlRXZlbnRzKG9uZSwgZWxlbSwgdHlwZSwgZm4pO1xuICB9XG4gIHZhciBmdW5jID0gZnVuY3Rpb24oKXtcbiAgICBvZmYoZWxlbSwgdHlwZSwgZnVuYyk7XG4gICAgZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfTtcbiAgLy8gY29weSB0aGUgZ3VpZCB0byB0aGUgbmV3IGZ1bmN0aW9uIHNvIGl0IGNhbiByZW1vdmVkIHVzaW5nIHRoZSBvcmlnaW5hbCBmdW5jdGlvbidzIElEXG4gIGZ1bmMuZ3VpZCA9IGZuLmd1aWQgPSBmbi5ndWlkIHx8IEd1aWQubmV3R1VJRCgpO1xuICBvbihlbGVtLCB0eXBlLCBmdW5jKTtcbn1cblxuLyoqXG4gKiBGaXggYSBuYXRpdmUgZXZlbnQgdG8gaGF2ZSBzdGFuZGFyZCBwcm9wZXJ0eSB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0gIHtPYmplY3R9IGV2ZW50IEV2ZW50IG9iamVjdCB0byBmaXhcbiAqIEByZXR1cm4ge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGZpeEV2ZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXhFdmVudChldmVudCkge1xuXG4gIGZ1bmN0aW9uIHJldHVyblRydWUoKSB7IHJldHVybiB0cnVlOyB9XG4gIGZ1bmN0aW9uIHJldHVybkZhbHNlKCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAvLyBUZXN0IGlmIGZpeGluZyB1cCBpcyBuZWVkZWRcbiAgLy8gVXNlZCB0byBjaGVjayBpZiAhZXZlbnQuc3RvcFByb3BhZ2F0aW9uIGluc3RlYWQgb2YgaXNQcm9wYWdhdGlvblN0b3BwZWRcbiAgLy8gQnV0IG5hdGl2ZSBldmVudHMgcmV0dXJuIHRydWUgZm9yIHN0b3BQcm9wYWdhdGlvbiwgYnV0IGRvbid0IGhhdmVcbiAgLy8gb3RoZXIgZXhwZWN0ZWQgbWV0aG9kcyBsaWtlIGlzUHJvcGFnYXRpb25TdG9wcGVkLiBTZWVtcyB0byBiZSBhIHByb2JsZW1cbiAgLy8gd2l0aCB0aGUgSmF2YXNjcmlwdCBOaW5qYSBjb2RlLiBTbyB3ZSdyZSBqdXN0IG92ZXJyaWRpbmcgYWxsIGV2ZW50cyBub3cuXG4gIGlmICghZXZlbnQgfHwgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKSB7XG4gICAgdmFyIG9sZCA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDtcblxuICAgIGV2ZW50ID0ge307XG4gICAgLy8gQ2xvbmUgdGhlIG9sZCBvYmplY3Qgc28gdGhhdCB3ZSBjYW4gbW9kaWZ5IHRoZSB2YWx1ZXMgZXZlbnQgPSB7fTtcbiAgICAvLyBJRTggRG9lc24ndCBsaWtlIHdoZW4geW91IG1lc3Mgd2l0aCBuYXRpdmUgZXZlbnQgcHJvcGVydGllc1xuICAgIC8vIEZpcmVmb3ggcmV0dXJucyBmYWxzZSBmb3IgZXZlbnQuaGFzT3duUHJvcGVydHkoJ3R5cGUnKSBhbmQgb3RoZXIgcHJvcHNcbiAgICAvLyAgd2hpY2ggbWFrZXMgY29weWluZyBtb3JlIGRpZmZpY3VsdC5cbiAgICAvLyBUT0RPOiBQcm9iYWJseSBiZXN0IHRvIGNyZWF0ZSBhIHdoaXRlbGlzdCBvZiBldmVudCBwcm9wc1xuICAgIGZvciAodmFyIGtleSBpbiBvbGQpIHtcbiAgICAgIC8vIFNhZmFyaSA2LjAuMyB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQgbGF5ZXJYL1lcbiAgICAgIC8vIENocm9tZSB3YXJucyB5b3UgaWYgeW91IHRyeSB0byBjb3B5IGRlcHJlY2F0ZWQga2V5Ym9hcmRFdmVudC5rZXlMb2NhdGlvblxuICAgICAgLy8gYW5kIHdlYmtpdE1vdmVtZW50WC9ZXG4gICAgICBpZiAoa2V5ICE9PSAnbGF5ZXJYJyAmJiBrZXkgIT09ICdsYXllclknICYmIGtleSAhPT0gJ2tleUxvY2F0aW9uJyAmJlxuICAgICAgICAgIGtleSAhPT0gJ3dlYmtpdE1vdmVtZW50WCcgJiYga2V5ICE9PSAnd2Via2l0TW92ZW1lbnRZJykge1xuICAgICAgICAvLyBDaHJvbWUgMzIrIHdhcm5zIGlmIHlvdSB0cnkgdG8gY29weSBkZXByZWNhdGVkIHJldHVyblZhbHVlLCBidXRcbiAgICAgICAgLy8gd2Ugc3RpbGwgd2FudCB0byBpZiBwcmV2ZW50RGVmYXVsdCBpc24ndCBzdXBwb3J0ZWQgKElFOCkuXG4gICAgICAgIGlmICghKGtleSA9PT0gJ3JldHVyblZhbHVlJyAmJiBvbGQucHJldmVudERlZmF1bHQpKSB7XG4gICAgICAgICAgZXZlbnRba2V5XSA9IG9sZFtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGV2ZW50IG9jY3VycmVkIG9uIHRoaXMgZWxlbWVudFxuICAgIGlmICghZXZlbnQudGFyZ2V0KSB7XG4gICAgICBldmVudC50YXJnZXQgPSBldmVudC5zcmNFbGVtZW50IHx8IGRvY3VtZW50O1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSB3aGljaCBvdGhlciBlbGVtZW50IHRoZSBldmVudCBpcyByZWxhdGVkIHRvXG4gICAgaWYgKCFldmVudC5yZWxhdGVkVGFyZ2V0KSB7XG4gICAgICBldmVudC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCA/XG4gICAgICAgIGV2ZW50LnRvRWxlbWVudCA6XG4gICAgICAgIGV2ZW50LmZyb21FbGVtZW50O1xuICAgIH1cblxuICAgIC8vIFN0b3AgdGhlIGRlZmF1bHQgYnJvd3NlciBhY3Rpb25cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbGQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgb2xkLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICAgICAgb2xkLnJldHVyblZhbHVlID0gZmFsc2U7XG4gICAgICBldmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gICAgLy8gU3RvcCB0aGUgZXZlbnQgZnJvbSBidWJibGluZ1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbGQuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICAgIG9sZC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGV2ZW50LmNhbmNlbEJ1YmJsZSA9IHRydWU7XG4gICAgICBvbGQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgICB9O1xuXG4gICAgZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5GYWxzZTtcblxuICAgIC8vIFN0b3AgdGhlIGV2ZW50IGZyb20gYnViYmxpbmcgYW5kIGV4ZWN1dGluZyBvdGhlciBoYW5kbGVyc1xuICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvbGQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKSB7XG4gICAgICAgIG9sZC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG5cbiAgICBldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVybkZhbHNlO1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlIHBvc2l0aW9uXG4gICAgaWYgKGV2ZW50LmNsaWVudFggIT0gbnVsbCkge1xuICAgICAgdmFyIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3VtZW50LmJvZHk7XG5cbiAgICAgIGV2ZW50LnBhZ2VYID0gZXZlbnQuY2xpZW50WCArXG4gICAgICAgIChkb2MgJiYgZG9jLnNjcm9sbExlZnQgfHwgYm9keSAmJiBib2R5LnNjcm9sbExlZnQgfHwgMCkgLVxuICAgICAgICAoZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDApO1xuICAgICAgZXZlbnQucGFnZVkgPSBldmVudC5jbGllbnRZICtcbiAgICAgICAgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9keS5zY3JvbGxUb3AgfHwgMCkgLVxuICAgICAgICAoZG9jICYmIGRvYy5jbGllbnRUb3AgfHwgYm9keSAmJiBib2R5LmNsaWVudFRvcCB8fCAwKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUga2V5IHByZXNzZXNcbiAgICBldmVudC53aGljaCA9IGV2ZW50LmNoYXJDb2RlIHx8IGV2ZW50LmtleUNvZGU7XG5cbiAgICAvLyBGaXggYnV0dG9uIGZvciBtb3VzZSBjbGlja3M6XG4gICAgLy8gMCA9PSBsZWZ0OyAxID09IG1pZGRsZTsgMiA9PSByaWdodFxuICAgIGlmIChldmVudC5idXR0b24gIT0gbnVsbCkge1xuICAgICAgZXZlbnQuYnV0dG9uID0gKGV2ZW50LmJ1dHRvbiAmIDEgPyAwIDpcbiAgICAgICAgKGV2ZW50LmJ1dHRvbiAmIDQgPyAxIDpcbiAgICAgICAgICAoZXZlbnQuYnV0dG9uICYgMiA/IDIgOiAwKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgZml4ZWQtdXAgaW5zdGFuY2VcbiAgcmV0dXJuIGV2ZW50O1xufVxuXG4vKipcbiAqIENsZWFuIHVwIHRoZSBsaXN0ZW5lciBjYWNoZSBhbmQgZGlzcGF0Y2hlcnNcbipcbiAqIEBwYXJhbSAge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEVsZW1lbnQgdG8gY2xlYW4gdXBcbiAqIEBwYXJhbSAge1N0cmluZ30gdHlwZSBUeXBlIG9mIGV2ZW50IHRvIGNsZWFuIHVwXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBfY2xlYW5VcEV2ZW50c1xuICovXG5mdW5jdGlvbiBfY2xlYW5VcEV2ZW50cyhlbGVtLCB0eXBlKSB7XG4gIHZhciBkYXRhID0gRG9tLmdldEVsRGF0YShlbGVtKTtcblxuICAvLyBSZW1vdmUgdGhlIGV2ZW50cyBvZiBhIHBhcnRpY3VsYXIgdHlwZSBpZiB0aGVyZSBhcmUgbm9uZSBsZWZ0XG4gIGlmIChkYXRhLmhhbmRsZXJzW3R5cGVdLmxlbmd0aCA9PT0gMCkge1xuICAgIGRlbGV0ZSBkYXRhLmhhbmRsZXJzW3R5cGVdO1xuICAgIC8vIGRhdGEuaGFuZGxlcnNbdHlwZV0gPSBudWxsO1xuICAgIC8vIFNldHRpbmcgdG8gbnVsbCB3YXMgY2F1c2luZyBhbiBlcnJvciB3aXRoIGRhdGEuaGFuZGxlcnNcblxuICAgIC8vIFJlbW92ZSB0aGUgbWV0YS1oYW5kbGVyIGZyb20gdGhlIGVsZW1lbnRcbiAgICBpZiAoZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKSB7XG4gICAgICBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZGF0YS5kaXNwYXRjaGVyLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChlbGVtLmRldGFjaEV2ZW50KSB7XG4gICAgICBlbGVtLmRldGFjaEV2ZW50KCdvbicgKyB0eXBlLCBkYXRhLmRpc3BhdGNoZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGUgZXZlbnRzIG9iamVjdCBpZiB0aGVyZSBhcmUgbm8gdHlwZXMgbGVmdFxuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZGF0YS5oYW5kbGVycykubGVuZ3RoIDw9IDApIHtcbiAgICBkZWxldGUgZGF0YS5oYW5kbGVycztcbiAgICBkZWxldGUgZGF0YS5kaXNwYXRjaGVyO1xuICAgIGRlbGV0ZSBkYXRhLmRpc2FibGVkO1xuICB9XG5cbiAgLy8gRmluYWxseSByZW1vdmUgdGhlIGVsZW1lbnQgZGF0YSBpZiB0aGVyZSBpcyBubyBkYXRhIGxlZnRcbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGRhdGEpLmxlbmd0aCA9PT0gMCkge1xuICAgIERvbS5yZW1vdmVFbERhdGEoZWxlbSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb29wcyB0aHJvdWdoIGFuIGFycmF5IG9mIGV2ZW50IHR5cGVzIGFuZCBjYWxscyB0aGUgcmVxdWVzdGVkIG1ldGhvZCBmb3IgZWFjaCB0eXBlLlxuICpcbiAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiAgIFRoZSBldmVudCBtZXRob2Qgd2Ugd2FudCB0byB1c2UuXG4gKiBAcGFyYW0gIHtFbGVtZW50fE9iamVjdH0gZWxlbSBFbGVtZW50IG9yIG9iamVjdCB0byBiaW5kIGxpc3RlbmVycyB0b1xuICogQHBhcmFtICB7U3RyaW5nfSAgIHR5cGUgVHlwZSBvZiBldmVudCB0byBiaW5kIHRvLlxuICogQHBhcmFtICB7RnVuY3Rpb259IGNhbGxiYWNrICAgRXZlbnQgbGlzdGVuZXIuXG4gKiBAcHJpdmF0ZVxuICogQGZ1bmN0aW9uIF9oYW5kbGVNdWx0aXBsZUV2ZW50c1xuICovXG5mdW5jdGlvbiBfaGFuZGxlTXVsdGlwbGVFdmVudHMoZm4sIGVsZW0sIHR5cGVzLCBjYWxsYmFjaykge1xuICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uKHR5cGUpIHtcbiAgICAvL0NhbGwgdGhlIGV2ZW50IG1ldGhvZCBmb3IgZWFjaCBvbmUgb2YgdGhlIHR5cGVzXG4gICAgZm4oZWxlbSwgdHlwZSwgY2FsbGJhY2spO1xuICB9KTtcbn1cbiJdfQ==
},{"./dom.js":144,"./guid.js":148,"global/document":7,"global/window":8}],146:[function(_dereq_,module,exports){
/**
* @file fn.js
*/
'use strict';
exports.__esModule = true;
var _guidJs = _dereq_('./guid.js');
/**
* Bind (a.k.a proxy or Context). A simple method for changing the context of a function
* It also stores a unique id on the function so it can be easily removed from events
*
* @param {*} context The object to bind as scope
* @param {Function} fn The function to be bound to a scope
* @param {Number=} uid An optional unique ID for the function to be set
* @return {Function}
* @private
* @method bind
*/
var bind = function bind(context, fn, uid) {
// Make sure the function has a unique ID
if (!fn.guid) {
fn.guid = _guidJs.newGUID();
}
// Create the new function that changes the context
var ret = function ret() {
return fn.apply(context, arguments);
};
// Allow for the ability to individualize this function
// Needed in the case where multiple objects might share the same prototype
// IF both items add an event listener with the same function, then you try to remove just one
// it will remove both because they both have the same guid.
// when using this, you need to use the bind method when you remove the listener as well.
// currently used in text tracks
ret.guid = uid ? uid + '_' + fn.guid : fn.guid;
return ret;
};
exports.bind = bind;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9mbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3NCQUd3QixXQUFXOzs7Ozs7Ozs7Ozs7O0FBYTVCLElBQU0sSUFBSSxHQUFHLFNBQVAsSUFBSSxDQUFZLE9BQU8sRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFOztBQUU3QyxNQUFJLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRTtBQUFFLE1BQUUsQ0FBQyxJQUFJLEdBQUcsaUJBQVMsQ0FBQztHQUFFOzs7QUFHdEMsTUFBSSxHQUFHLEdBQUcsU0FBTixHQUFHLEdBQWM7QUFDbkIsV0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztHQUNyQyxDQUFDOzs7Ozs7OztBQVFGLEtBQUcsQ0FBQyxJQUFJLEdBQUcsQUFBQyxHQUFHLEdBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7O0FBRWpELFNBQU8sR0FBRyxDQUFDO0NBQ1osQ0FBQyIsImZpbGUiOiJzcmMvanMvdXRpbHMvZm4uanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGZuLmpzXG4gKi9cbmltcG9ydCB7IG5ld0dVSUQgfSBmcm9tICcuL2d1aWQuanMnO1xuXG4vKipcbiAqIEJpbmQgKGEuay5hIHByb3h5IG9yIENvbnRleHQpLiBBIHNpbXBsZSBtZXRob2QgZm9yIGNoYW5naW5nIHRoZSBjb250ZXh0IG9mIGEgZnVuY3Rpb25cbiAqIEl0IGFsc28gc3RvcmVzIGEgdW5pcXVlIGlkIG9uIHRoZSBmdW5jdGlvbiBzbyBpdCBjYW4gYmUgZWFzaWx5IHJlbW92ZWQgZnJvbSBldmVudHNcbiAqXG4gKiBAcGFyYW0gIHsqfSAgIGNvbnRleHQgVGhlIG9iamVjdCB0byBiaW5kIGFzIHNjb3BlXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICAgICBUaGUgZnVuY3Rpb24gdG8gYmUgYm91bmQgdG8gYSBzY29wZVxuICogQHBhcmFtICB7TnVtYmVyPX0gICB1aWQgICAgIEFuIG9wdGlvbmFsIHVuaXF1ZSBJRCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGJlIHNldFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBiaW5kXG4gKi9cbmV4cG9ydCBjb25zdCBiaW5kID0gZnVuY3Rpb24oY29udGV4dCwgZm4sIHVpZCkge1xuICAvLyBNYWtlIHN1cmUgdGhlIGZ1bmN0aW9uIGhhcyBhIHVuaXF1ZSBJRFxuICBpZiAoIWZuLmd1aWQpIHsgZm4uZ3VpZCA9IG5ld0dVSUQoKTsgfVxuXG4gIC8vIENyZWF0ZSB0aGUgbmV3IGZ1bmN0aW9uIHRoYXQgY2hhbmdlcyB0aGUgY29udGV4dFxuICBsZXQgcmV0ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgLy8gQWxsb3cgZm9yIHRoZSBhYmlsaXR5IHRvIGluZGl2aWR1YWxpemUgdGhpcyBmdW5jdGlvblxuICAvLyBOZWVkZWQgaW4gdGhlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgb2JqZWN0cyBtaWdodCBzaGFyZSB0aGUgc2FtZSBwcm90b3R5cGVcbiAgLy8gSUYgYm90aCBpdGVtcyBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbiwgdGhlbiB5b3UgdHJ5IHRvIHJlbW92ZSBqdXN0IG9uZVxuICAvLyBpdCB3aWxsIHJlbW92ZSBib3RoIGJlY2F1c2UgdGhleSBib3RoIGhhdmUgdGhlIHNhbWUgZ3VpZC5cbiAgLy8gd2hlbiB1c2luZyB0aGlzLCB5b3UgbmVlZCB0byB1c2UgdGhlIGJpbmQgbWV0aG9kIHdoZW4geW91IHJlbW92ZSB0aGUgbGlzdGVuZXIgYXMgd2VsbC5cbiAgLy8gY3VycmVudGx5IHVzZWQgaW4gdGV4dCB0cmFja3NcbiAgcmV0Lmd1aWQgPSAodWlkKSA/IHVpZCArICdfJyArIGZuLmd1aWQgOiBmbi5ndWlkO1xuXG4gIHJldHVybiByZXQ7XG59O1xuIl19
},{"./guid.js":148}],147:[function(_dereq_,module,exports){
/**
* @file format-time.js
*
* Format seconds as a time string, H:MM:SS or M:SS
* Supplying a guide (in seconds) will force a number of leading zeros
* to cover the length of the guide
*
* @param {Number} seconds Number of seconds to be turned into a string
* @param {Number} guide Number (in seconds) to model the string after
* @return {String} Time formatted as H:MM:SS or M:SS
* @private
* @function formatTime
*/
'use strict';
exports.__esModule = true;
function formatTime(seconds) {
var guide = arguments.length <= 1 || arguments[1] === undefined ? seconds : arguments[1];
return (function () {
seconds = seconds < 0 ? 0 : seconds;
var s = Math.floor(seconds % 60);
var m = Math.floor(seconds / 60 % 60);
var h = Math.floor(seconds / 3600);
var gm = Math.floor(guide / 60 % 60);
var gh = Math.floor(guide / 3600);
// handle invalid times
if (isNaN(seconds) || seconds === Infinity) {
// '-' is false for all relational operators (e.g. <, >=) so this setting
// will add the minimum number of fields specified by the guide
h = m = s = '-';
}
// Check if we need to show hours
h = h > 0 || gh > 0 ? h + ':' : '';
// If hours are showing, we may need to add a leading zero.
// Always show at least one digit of minutes.
m = ((h || gm >= 10) && m < 10 ? '0' + m : m) + ':';
// Check if leading zero is need for seconds
s = s < 10 ? '0' + s : s;
return h + m + s;
})();
}
exports['default'] = formatTime;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9mb3JtYXQtdGltZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBYUEsU0FBUyxVQUFVLENBQUMsT0FBTztNQUFFLEtBQUsseURBQUMsT0FBTztzQkFBRTtBQUMxQyxXQUFPLEdBQUcsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDO0FBQ3BDLFFBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0FBQ2pDLFFBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztBQUN0QyxRQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQztBQUNuQyxRQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFDdkMsUUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUM7OztBQUdwQyxRQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLEtBQUssUUFBUSxFQUFFOzs7QUFHMUMsT0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2pCOzs7QUFHRCxLQUFDLEdBQUcsQUFBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7Ozs7QUFJckMsS0FBQyxHQUFHLENBQUMsQUFBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFBLElBQUssQ0FBQyxHQUFHLEVBQUUsR0FBSSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxHQUFJLEdBQUcsQ0FBQzs7O0FBR3RELEtBQUMsR0FBRyxBQUFDLENBQUMsR0FBRyxFQUFFLEdBQUksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7O0FBRTNCLFdBQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDbEI7Q0FBQTs7cUJBRWMsVUFBVSIsImZpbGUiOiJzcmMvanMvdXRpbHMvZm9ybWF0LXRpbWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIGZvcm1hdC10aW1lLmpzXG4gKlxuICogRm9ybWF0IHNlY29uZHMgYXMgYSB0aW1lIHN0cmluZywgSDpNTTpTUyBvciBNOlNTXG4gKiBTdXBwbHlpbmcgYSBndWlkZSAoaW4gc2Vjb25kcykgd2lsbCBmb3JjZSBhIG51bWJlciBvZiBsZWFkaW5nIHplcm9zXG4gKiB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZVxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gc2Vjb25kcyBOdW1iZXIgb2Ygc2Vjb25kcyB0byBiZSB0dXJuZWQgaW50byBhIHN0cmluZ1xuICogQHBhcmFtICB7TnVtYmVyfSBndWlkZSAgIE51bWJlciAoaW4gc2Vjb25kcykgdG8gbW9kZWwgdGhlIHN0cmluZyBhZnRlclxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgIFRpbWUgZm9ybWF0dGVkIGFzIEg6TU06U1Mgb3IgTTpTU1xuICogQHByaXZhdGVcbiAqIEBmdW5jdGlvbiBmb3JtYXRUaW1lXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFRpbWUoc2Vjb25kcywgZ3VpZGU9c2Vjb25kcykge1xuICBzZWNvbmRzID0gc2Vjb25kcyA8IDAgPyAwIDogc2Vjb25kcztcbiAgbGV0IHMgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7XG4gIGxldCBtID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjAgJSA2MCk7XG4gIGxldCBoID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gMzYwMCk7XG4gIGNvbnN0IGdtID0gTWF0aC5mbG9vcihndWlkZSAvIDYwICUgNjApO1xuICBjb25zdCBnaCA9IE1hdGguZmxvb3IoZ3VpZGUgLyAzNjAwKTtcblxuICAvLyBoYW5kbGUgaW52YWxpZCB0aW1lc1xuICBpZiAoaXNOYU4oc2Vjb25kcykgfHwgc2Vjb25kcyA9PT0gSW5maW5pdHkpIHtcbiAgICAvLyAnLScgaXMgZmFsc2UgZm9yIGFsbCByZWxhdGlvbmFsIG9wZXJhdG9ycyAoZS5nLiA8LCA+PSkgc28gdGhpcyBzZXR0aW5nXG4gICAgLy8gd2lsbCBhZGQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGZpZWxkcyBzcGVjaWZpZWQgYnkgdGhlIGd1aWRlXG4gICAgaCA9IG0gPSBzID0gJy0nO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IGhvdXJzXG4gIGggPSAoaCA+IDAgfHwgZ2ggPiAwKSA/IGggKyAnOicgOiAnJztcblxuICAvLyBJZiBob3VycyBhcmUgc2hvd2luZywgd2UgbWF5IG5lZWQgdG8gYWRkIGEgbGVhZGluZyB6ZXJvLlxuICAvLyBBbHdheXMgc2hvdyBhdCBsZWFzdCBvbmUgZGlnaXQgb2YgbWludXRlcy5cbiAgbSA9ICgoKGggfHwgZ20gPj0gMTApICYmIG0gPCAxMCkgPyAnMCcgKyBtIDogbSkgKyAnOic7XG5cbiAgLy8gQ2hlY2sgaWYgbGVhZGluZyB6ZXJvIGlzIG5lZWQgZm9yIHNlY29uZHNcbiAgcyA9IChzIDwgMTApID8gJzAnICsgcyA6IHM7XG5cbiAgcmV0dXJuIGggKyBtICsgcztcbn1cblxuZXhwb3J0IGRlZmF1bHQgZm9ybWF0VGltZTtcbiJdfQ==
},{}],148:[function(_dereq_,module,exports){
/**
* @file guid.js
*
* Unique ID for an element or function
* @type {Number}
* @private
*/
"use strict";
exports.__esModule = true;
exports.newGUID = newGUID;
var _guid = 1;
/**
* Get the next unique ID
*
* @return {String}
* @function newGUID
*/
function newGUID() {
return _guid++;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9ndWlkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBT0EsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDOzs7Ozs7Ozs7QUFRUCxTQUFTLE9BQU8sR0FBRztBQUN4QixTQUFPLEtBQUssRUFBRSxDQUFDO0NBQ2hCIiwiZmlsZSI6InNyYy9qcy91dGlscy9ndWlkLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSBndWlkLmpzXG4gKlxuICogVW5pcXVlIElEIGZvciBhbiBlbGVtZW50IG9yIGZ1bmN0aW9uXG4gKiBAdHlwZSB7TnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xubGV0IF9ndWlkID0gMTtcblxuLyoqXG4gKiBHZXQgdGhlIG5leHQgdW5pcXVlIElEXG4gKlxuICogQHJldHVybiB7U3RyaW5nfSBcbiAqIEBmdW5jdGlvbiBuZXdHVUlEXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZXdHVUlEKCkge1xuICByZXR1cm4gX2d1aWQrKztcbn1cbiJdfQ==
},{}],149:[function(_dereq_,module,exports){
/**
* @file log.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Log plain debug messages
*/
var log = function log() {
_logType(null, arguments);
};
/**
* Keep a history of log messages
* @type {Array}
*/
log.history = [];
/**
* Log error messages
*/
log.error = function () {
_logType('error', arguments);
};
/**
* Log warning messages
*/
log.warn = function () {
_logType('warn', arguments);
};
/**
* Log messages to the console and history based on the type of message
*
* @param {String} type The type of message, or `null` for `log`
* @param {Object} args The args to be passed to the log
* @private
* @method _logType
*/
function _logType(type, args) {
// convert args to an array to get array functions
var argsArray = Array.prototype.slice.call(args);
// if there's no console then don't try to output messages
// they will still be stored in log.history
// Was setting these once outside of this function, but containing them
// in the function makes it easier to test cases where console doesn't exist
var noop = function noop() {};
var console = _globalWindow2['default']['console'] || {
'log': noop,
'warn': noop,
'error': noop
};
if (type) {
// add the type to the front of the message
argsArray.unshift(type.toUpperCase() + ':');
} else {
// default to log with no prefix
type = 'log';
}
// add to history
log.history.push(argsArray);
// add console prefix after adding to history
argsArray.unshift('VIDEOJS:');
// call appropriate log function
if (console[type].apply) {
console[type].apply(console, argsArray);
} else {
// ie8 doesn't allow error.apply, but it will just join() the array anyway
console[type](argsArray.join(' '));
}
}
exports['default'] = log;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9sb2cuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OzRCQUdtQixlQUFlOzs7Ozs7O0FBS2xDLElBQU0sR0FBRyxHQUFHLFNBQU4sR0FBRyxHQUFhO0FBQ3BCLFVBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7Q0FDM0IsQ0FBQzs7Ozs7O0FBTUYsR0FBRyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Ozs7O0FBS2pCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsWUFBVTtBQUNwQixVQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0NBQzlCLENBQUM7Ozs7O0FBS0YsR0FBRyxDQUFDLElBQUksR0FBRyxZQUFVO0FBQ25CLFVBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7Q0FDN0IsQ0FBQzs7Ozs7Ozs7OztBQVVGLFNBQVMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUM7O0FBRTNCLE1BQUksU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7Ozs7QUFLakQsTUFBSSxJQUFJLEdBQUcsU0FBUCxJQUFJLEdBQWEsRUFBRSxDQUFDOztBQUV4QixNQUFJLE9BQU8sR0FBRywwQkFBTyxTQUFTLENBQUMsSUFBSTtBQUNqQyxTQUFLLEVBQUUsSUFBSTtBQUNYLFVBQU0sRUFBRSxJQUFJO0FBQ1osV0FBTyxFQUFFLElBQUk7R0FDZCxDQUFDOztBQUVGLE1BQUksSUFBSSxFQUFFOztBQUVSLGFBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQzNDLE1BQU07O0FBRUwsUUFBSSxHQUFHLEtBQUssQ0FBQztHQUNkOzs7QUFHRCxLQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzs7O0FBRzVCLFdBQVMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7OztBQUc5QixNQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUU7QUFDdkIsV0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDekMsTUFBTTs7QUFFTCxXQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0dBQ3BDO0NBQ0Y7O3FCQUVjLEdBQUciLCJmaWxlIjoic3JjL2pzL3V0aWxzL2xvZy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgbG9nLmpzXG4gKi9cbmltcG9ydCB3aW5kb3cgZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbi8qKlxuICogTG9nIHBsYWluIGRlYnVnIG1lc3NhZ2VzXG4gKi9cbmNvbnN0IGxvZyA9IGZ1bmN0aW9uKCl7XG4gIF9sb2dUeXBlKG51bGwsIGFyZ3VtZW50cyk7XG59O1xuXG4vKipcbiAqIEtlZXAgYSBoaXN0b3J5IG9mIGxvZyBtZXNzYWdlc1xuICogQHR5cGUge0FycmF5fVxuICovXG5sb2cuaGlzdG9yeSA9IFtdO1xuXG4vKipcbiAqIExvZyBlcnJvciBtZXNzYWdlc1xuICovXG5sb2cuZXJyb3IgPSBmdW5jdGlvbigpe1xuICBfbG9nVHlwZSgnZXJyb3InLCBhcmd1bWVudHMpO1xufTtcblxuLyoqXG4gKiBMb2cgd2FybmluZyBtZXNzYWdlc1xuICovXG5sb2cud2FybiA9IGZ1bmN0aW9uKCl7XG4gIF9sb2dUeXBlKCd3YXJuJywgYXJndW1lbnRzKTtcbn07XG5cbi8qKlxuICogTG9nIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlIGFuZCBoaXN0b3J5IGJhc2VkIG9uIHRoZSB0eXBlIG9mIG1lc3NhZ2VcbiAqXG4gKiBAcGFyYW0gIHtTdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgbWVzc2FnZSwgb3IgYG51bGxgIGZvciBgbG9nYFxuICogQHBhcmFtICB7T2JqZWN0fSBhcmdzIFRoZSBhcmdzIHRvIGJlIHBhc3NlZCB0byB0aGUgbG9nXG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCBfbG9nVHlwZVxuICovXG5mdW5jdGlvbiBfbG9nVHlwZSh0eXBlLCBhcmdzKXtcbiAgLy8gY29udmVydCBhcmdzIHRvIGFuIGFycmF5IHRvIGdldCBhcnJheSBmdW5jdGlvbnNcbiAgbGV0IGFyZ3NBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3MpO1xuICAvLyBpZiB0aGVyZSdzIG5vIGNvbnNvbGUgdGhlbiBkb24ndCB0cnkgdG8gb3V0cHV0IG1lc3NhZ2VzXG4gIC8vIHRoZXkgd2lsbCBzdGlsbCBiZSBzdG9yZWQgaW4gbG9nLmhpc3RvcnlcbiAgLy8gV2FzIHNldHRpbmcgdGhlc2Ugb25jZSBvdXRzaWRlIG9mIHRoaXMgZnVuY3Rpb24sIGJ1dCBjb250YWluaW5nIHRoZW1cbiAgLy8gaW4gdGhlIGZ1bmN0aW9uIG1ha2VzIGl0IGVhc2llciB0byB0ZXN0IGNhc2VzIHdoZXJlIGNvbnNvbGUgZG9lc24ndCBleGlzdFxuICBsZXQgbm9vcCA9IGZ1bmN0aW9uKCl7fTtcblxuICBsZXQgY29uc29sZSA9IHdpbmRvd1snY29uc29sZSddIHx8IHtcbiAgICAnbG9nJzogbm9vcCxcbiAgICAnd2Fybic6IG5vb3AsXG4gICAgJ2Vycm9yJzogbm9vcFxuICB9O1xuXG4gIGlmICh0eXBlKSB7XG4gICAgLy8gYWRkIHRoZSB0eXBlIHRvIHRoZSBmcm9udCBvZiB0aGUgbWVzc2FnZVxuICAgIGFyZ3NBcnJheS51bnNoaWZ0KHR5cGUudG9VcHBlckNhc2UoKSsnOicpO1xuICB9IGVsc2Uge1xuICAgIC8vIGRlZmF1bHQgdG8gbG9nIHdpdGggbm8gcHJlZml4XG4gICAgdHlwZSA9ICdsb2cnO1xuICB9XG5cbiAgLy8gYWRkIHRvIGhpc3RvcnlcbiAgbG9nLmhpc3RvcnkucHVzaChhcmdzQXJyYXkpO1xuXG4gIC8vIGFkZCBjb25zb2xlIHByZWZpeCBhZnRlciBhZGRpbmcgdG8gaGlzdG9yeVxuICBhcmdzQXJyYXkudW5zaGlmdCgnVklERU9KUzonKTtcblxuICAvLyBjYWxsIGFwcHJvcHJpYXRlIGxvZyBmdW5jdGlvblxuICBpZiAoY29uc29sZVt0eXBlXS5hcHBseSkge1xuICAgIGNvbnNvbGVbdHlwZV0uYXBwbHkoY29uc29sZSwgYXJnc0FycmF5KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZTggZG9lc24ndCBhbGxvdyBlcnJvci5hcHBseSwgYnV0IGl0IHdpbGwganVzdCBqb2luKCkgdGhlIGFycmF5IGFueXdheVxuICAgIGNvbnNvbGVbdHlwZV0oYXJnc0FycmF5LmpvaW4oJyAnKSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbG9nO1xuIl19
},{"global/window":8}],150:[function(_dereq_,module,exports){
/**
* @file merge-options.js
*/
'use strict';
exports.__esModule = true;
exports['default'] = mergeOptions;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
function isPlain(obj) {
return !!obj && typeof obj === 'object' && obj.toString() === '[object Object]' && obj.constructor === Object;
}
/**
* Merge customizer. video.js simply overwrites non-simple objects
* (like arrays) instead of attempting to overlay them.
* @see https://lodash.com/docs#merge
*/
var customizer = function customizer(destination, source) {
// If we're not working with a plain object, copy the value as is
// If source is an array, for instance, it will replace destination
if (!isPlain(source)) {
return source;
}
// If the new value is a plain object but the first object value is not
// we need to create a new object for the first object to merge with.
// This makes it consistent with how merge() works by default
// and also protects from later changes the to first object affecting
// the second object's values.
if (!isPlain(destination)) {
return mergeOptions(source);
}
};
/**
* Merge one or more options objects, recursively merging **only**
* plain object properties. Previously `deepMerge`.
*
* @param {...Object} source One or more objects to merge
* @returns {Object} a new object that is the union of all
* provided objects
* @function mergeOptions
*/
function mergeOptions() {
// contruct the call dynamically to handle the variable number of
// objects to merge
var args = Array.prototype.slice.call(arguments);
// unshift an empty object into the front of the call as the target
// of the merge
args.unshift({});
// customize conflict resolution to match our historical merge behavior
args.push(customizer);
_lodashCompatObjectMerge2['default'].apply(null, args);
// return the mutated result object
return args[0];
}
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9tZXJnZS1vcHRpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztxQkEyQ3dCLFlBQVk7Ozs7dUNBeENsQiw0QkFBNEI7Ozs7QUFFOUMsU0FBUyxPQUFPLENBQUMsR0FBRyxFQUFFO0FBQ3BCLFNBQU8sQ0FBQyxDQUFDLEdBQUcsSUFDUCxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQ3ZCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxpQkFBaUIsSUFDcEMsR0FBRyxDQUFDLFdBQVcsS0FBSyxNQUFNLENBQUM7Q0FDakM7Ozs7Ozs7QUFPRCxJQUFNLFVBQVUsR0FBRyxTQUFiLFVBQVUsQ0FBWSxXQUFXLEVBQUUsTUFBTSxFQUFFOzs7QUFHL0MsTUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtBQUNwQixXQUFPLE1BQU0sQ0FBQztHQUNmOzs7Ozs7O0FBT0QsTUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtBQUN6QixXQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztHQUM3QjtDQUNGLENBQUM7Ozs7Ozs7Ozs7OztBQVdhLFNBQVMsWUFBWSxHQUFHOzs7QUFHckMsTUFBSSxJQUFJLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzs7O0FBSWpELE1BQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7OztBQUdqQixNQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDOztBQUV0Qix1Q0FBTSxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDOzs7QUFHeEIsU0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDaEIiLCJmaWxlIjoic3JjL2pzL3V0aWxzL21lcmdlLW9wdGlvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIG1lcmdlLW9wdGlvbnMuanNcbiAqL1xuaW1wb3J0IG1lcmdlIGZyb20gJ2xvZGFzaC1jb21wYXQvb2JqZWN0L21lcmdlJztcblxuZnVuY3Rpb24gaXNQbGFpbihvYmopIHtcbiAgcmV0dXJuICEhb2JqXG4gICAgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCdcbiAgICAmJiBvYmoudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbiAgICAmJiBvYmouY29uc3RydWN0b3IgPT09IE9iamVjdDtcbn1cblxuLyoqXG4gKiBNZXJnZSBjdXN0b21pemVyLiB2aWRlby5qcyBzaW1wbHkgb3ZlcndyaXRlcyBub24tc2ltcGxlIG9iamVjdHNcbiAqIChsaWtlIGFycmF5cykgaW5zdGVhZCBvZiBhdHRlbXB0aW5nIHRvIG92ZXJsYXkgdGhlbS5cbiAqIEBzZWUgaHR0cHM6Ly9sb2Rhc2guY29tL2RvY3MjbWVyZ2VcbiAqL1xuY29uc3QgY3VzdG9taXplciA9IGZ1bmN0aW9uKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHtcbiAgLy8gSWYgd2UncmUgbm90IHdvcmtpbmcgd2l0aCBhIHBsYWluIG9iamVjdCwgY29weSB0aGUgdmFsdWUgYXMgaXNcbiAgLy8gSWYgc291cmNlIGlzIGFuIGFycmF5LCBmb3IgaW5zdGFuY2UsIGl0IHdpbGwgcmVwbGFjZSBkZXN0aW5hdGlvblxuICBpZiAoIWlzUGxhaW4oc291cmNlKSkge1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICAvLyBJZiB0aGUgbmV3IHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0IGJ1dCB0aGUgZmlyc3Qgb2JqZWN0IHZhbHVlIGlzIG5vdFxuICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBvYmplY3QgZm9yIHRoZSBmaXJzdCBvYmplY3QgdG8gbWVyZ2Ugd2l0aC5cbiAgLy8gVGhpcyBtYWtlcyBpdCBjb25zaXN0ZW50IHdpdGggaG93IG1lcmdlKCkgd29ya3MgYnkgZGVmYXVsdFxuICAvLyBhbmQgYWxzbyBwcm90ZWN0cyBmcm9tIGxhdGVyIGNoYW5nZXMgdGhlIHRvIGZpcnN0IG9iamVjdCBhZmZlY3RpbmdcbiAgLy8gdGhlIHNlY29uZCBvYmplY3QncyB2YWx1ZXMuXG4gIGlmICghaXNQbGFpbihkZXN0aW5hdGlvbikpIHtcbiAgICByZXR1cm4gbWVyZ2VPcHRpb25zKHNvdXJjZSk7XG4gIH1cbn07XG5cbi8qKlxuICogTWVyZ2Ugb25lIG9yIG1vcmUgb3B0aW9ucyBvYmplY3RzLCByZWN1cnNpdmVseSBtZXJnaW5nICoqb25seSoqXG4gKiBwbGFpbiBvYmplY3QgcHJvcGVydGllcy4gIFByZXZpb3VzbHkgYGRlZXBNZXJnZWAuXG4gKlxuICogQHBhcmFtICB7Li4uT2JqZWN0fSBzb3VyY2UgT25lIG9yIG1vcmUgb2JqZWN0cyB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gICAgICAgICAgYSBuZXcgb2JqZWN0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGFsbFxuICogcHJvdmlkZWQgb2JqZWN0c1xuICogQGZ1bmN0aW9uIG1lcmdlT3B0aW9uc1xuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZU9wdGlvbnMoKSB7XG4gIC8vIGNvbnRydWN0IHRoZSBjYWxsIGR5bmFtaWNhbGx5IHRvIGhhbmRsZSB0aGUgdmFyaWFibGUgbnVtYmVyIG9mXG4gIC8vIG9iamVjdHMgdG8gbWVyZ2VcbiAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gIC8vIHVuc2hpZnQgYW4gZW1wdHkgb2JqZWN0IGludG8gdGhlIGZyb250IG9mIHRoZSBjYWxsIGFzIHRoZSB0YXJnZXRcbiAgLy8gb2YgdGhlIG1lcmdlXG4gIGFyZ3MudW5zaGlmdCh7fSk7XG5cbiAgLy8gY3VzdG9taXplIGNvbmZsaWN0IHJlc29sdXRpb24gdG8gbWF0Y2ggb3VyIGhpc3RvcmljYWwgbWVyZ2UgYmVoYXZpb3JcbiAgYXJncy5wdXNoKGN1c3RvbWl6ZXIpO1xuXG4gIG1lcmdlLmFwcGx5KG51bGwsIGFyZ3MpO1xuXG4gIC8vIHJldHVybiB0aGUgbXV0YXRlZCByZXN1bHQgb2JqZWN0XG4gIHJldHVybiBhcmdzWzBdO1xufVxuIl19
},{"lodash-compat/object/merge":46}],151:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var createStyleElement = function createStyleElement(className) {
var style = _globalDocument2['default'].createElement('style');
style.className = className;
return style;
};
exports.createStyleElement = createStyleElement;
var setTextContent = function setTextContent(el, content) {
if (el.styleSheet) {
el.styleSheet.cssText = content;
} else {
el.textContent = content;
}
};
exports.setTextContent = setTextContent;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy9zdHlsZXNoZWV0LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs4QkFBcUIsaUJBQWlCOzs7O0FBRS9CLElBQUksa0JBQWtCLEdBQUcsU0FBckIsa0JBQWtCLENBQVksU0FBUyxFQUFFO0FBQ2xELE1BQUksS0FBSyxHQUFHLDRCQUFTLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1QyxPQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQzs7QUFFNUIsU0FBTyxLQUFLLENBQUM7Q0FDZCxDQUFDOzs7QUFFSyxJQUFJLGNBQWMsR0FBRyxTQUFqQixjQUFjLENBQVksRUFBRSxFQUFFLE9BQU8sRUFBRTtBQUNoRCxNQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7QUFDakIsTUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0dBQ2pDLE1BQU07QUFDTCxNQUFFLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztHQUMxQjtDQUNGLENBQUMiLCJmaWxlIjoic3JjL2pzL3V0aWxzL3N0eWxlc2hlZXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZG9jdW1lbnQgZnJvbSAnZ2xvYmFsL2RvY3VtZW50JztcblxuZXhwb3J0IGxldCBjcmVhdGVTdHlsZUVsZW1lbnQgPSBmdW5jdGlvbihjbGFzc05hbWUpIHtcbiAgbGV0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuXG4gIHJldHVybiBzdHlsZTtcbn07XG5cbmV4cG9ydCBsZXQgc2V0VGV4dENvbnRlbnQgPSBmdW5jdGlvbihlbCwgY29udGVudCkge1xuICBpZiAoZWwuc3R5bGVTaGVldCkge1xuICAgIGVsLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNvbnRlbnQ7XG4gIH0gZWxzZSB7XG4gICAgZWwudGV4dENvbnRlbnQgPSBjb250ZW50O1xuICB9XG59O1xuIl19
},{"global/document":7}],152:[function(_dereq_,module,exports){
'use strict';
exports.__esModule = true;
exports.createTimeRanges = createTimeRanges;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _logJs = _dereq_('./log.js');
var _logJs2 = _interopRequireDefault(_logJs);
/**
* @file time-ranges.js
*
* Should create a fake TimeRange object
* Mimics an HTML5 time range instance, which has functions that
* return the start and end times for a range
* TimeRanges are returned by the buffered() method
*
* @param {(Number|Array)} Start of a single range or an array of ranges
* @param {Number} End of a single range
* @private
* @method createTimeRanges
*/
function createTimeRanges(start, end) {
if (Array.isArray(start)) {
return createTimeRangesObj(start);
} else if (start === undefined || end === undefined) {
return createTimeRangesObj();
}
return createTimeRangesObj([[start, end]]);
}
exports.createTimeRange = createTimeRanges;
function createTimeRangesObj(ranges) {
if (ranges === undefined || ranges.length === 0) {
return {
length: 0,
start: function start() {
throw new Error('This TimeRanges object is empty');
},
end: function end() {
throw new Error('This TimeRanges object is empty');
}
};
}
return {
length: ranges.length,
start: getRange.bind(null, 'start', 0, ranges),
end: getRange.bind(null, 'end', 1, ranges)
};
}
function getRange(fnName, valueIndex, ranges, rangeIndex) {
if (rangeIndex === undefined) {
_logJs2['default'].warn('DEPRECATED: Function \'' + fnName + '\' on \'TimeRanges\' called without an index argument.');
rangeIndex = 0;
}
rangeCheck(fnName, rangeIndex, ranges.length - 1);
return ranges[rangeIndex][valueIndex];
}
function rangeCheck(fnName, index, maxIndex) {
if (index < 0 || index > maxIndex) {
throw new Error('Failed to execute \'' + fnName + '\' on \'TimeRanges\': The index provided (' + index + ') is greater than or equal to the maximum bound (' + maxIndex + ').');
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy90aW1lLXJhbmdlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O3FCQUFnQixVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFlbkIsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFDO0FBQzFDLE1BQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUN4QixXQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ25DLE1BQU0sSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxTQUFTLEVBQUU7QUFDbkQsV0FBTyxtQkFBbUIsRUFBRSxDQUFDO0dBQzlCO0FBQ0QsU0FBTyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM1Qzs7UUFFNEIsZUFBZSxHQUFuQyxnQkFBZ0I7O0FBRXpCLFNBQVMsbUJBQW1CLENBQUMsTUFBTSxFQUFDO0FBQ2xDLE1BQUksTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtBQUMvQyxXQUFPO0FBQ0wsWUFBTSxFQUFFLENBQUM7QUFDVCxXQUFLLEVBQUUsaUJBQVc7QUFDaEIsY0FBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO09BQ3BEO0FBQ0QsU0FBRyxFQUFFLGVBQVc7QUFDZCxjQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7T0FDcEQ7S0FDRixDQUFDO0dBQ0g7QUFDRCxTQUFPO0FBQ0wsVUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO0FBQ3JCLFNBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQztBQUM5QyxPQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUM7R0FDM0MsQ0FBQztDQUNIOztBQUVELFNBQVMsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBQztBQUN2RCxNQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7QUFDNUIsdUJBQUksSUFBSSw2QkFBMEIsTUFBTSw0REFBc0QsQ0FBQztBQUMvRixjQUFVLEdBQUcsQ0FBQyxDQUFDO0dBQ2hCO0FBQ0QsWUFBVSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRCxTQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztDQUN2Qzs7QUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQztBQUMxQyxNQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxHQUFHLFFBQVEsRUFBRTtBQUNqQyxVQUFNLElBQUksS0FBSywwQkFBdUIsTUFBTSxrREFBMEMsS0FBSyx5REFBb0QsUUFBUSxRQUFLLENBQUM7R0FDOUo7Q0FDRiIsImZpbGUiOiJzcmMvanMvdXRpbHMvdGltZS1yYW5nZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4vbG9nLmpzJztcblxuLyoqXG4gKiBAZmlsZSB0aW1lLXJhbmdlcy5qc1xuICpcbiAqIFNob3VsZCBjcmVhdGUgYSBmYWtlIFRpbWVSYW5nZSBvYmplY3RcbiAqIE1pbWljcyBhbiBIVE1MNSB0aW1lIHJhbmdlIGluc3RhbmNlLCB3aGljaCBoYXMgZnVuY3Rpb25zIHRoYXRcbiAqIHJldHVybiB0aGUgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgYSByYW5nZVxuICogVGltZVJhbmdlcyBhcmUgcmV0dXJuZWQgYnkgdGhlIGJ1ZmZlcmVkKCkgbWV0aG9kXG4gKlxuICogQHBhcmFtICB7KE51bWJlcnxBcnJheSl9IFN0YXJ0IG9mIGEgc2luZ2xlIHJhbmdlIG9yIGFuIGFycmF5IG9mIHJhbmdlc1xuICogQHBhcmFtICB7TnVtYmVyfSBFbmQgb2YgYSBzaW5nbGUgcmFuZ2VcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGNyZWF0ZVRpbWVSYW5nZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRpbWVSYW5nZXMoc3RhcnQsIGVuZCl7XG4gIGlmIChBcnJheS5pc0FycmF5KHN0YXJ0KSkge1xuICAgIHJldHVybiBjcmVhdGVUaW1lUmFuZ2VzT2JqKHN0YXJ0KTtcbiAgfSBlbHNlIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGNyZWF0ZVRpbWVSYW5nZXNPYmooKTtcbiAgfVxuICByZXR1cm4gY3JlYXRlVGltZVJhbmdlc09iaihbW3N0YXJ0LCBlbmRdXSk7XG59XG5cbmV4cG9ydCB7IGNyZWF0ZVRpbWVSYW5nZXMgYXMgY3JlYXRlVGltZVJhbmdlIH07XG5cbmZ1bmN0aW9uIGNyZWF0ZVRpbWVSYW5nZXNPYmoocmFuZ2VzKXtcbiAgaWYgKHJhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IHJhbmdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgVGltZVJhbmdlcyBvYmplY3QgaXMgZW1wdHknKTtcbiAgICAgIH0sXG4gICAgICBlbmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgVGltZVJhbmdlcyBvYmplY3QgaXMgZW1wdHknKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbGVuZ3RoOiByYW5nZXMubGVuZ3RoLFxuICAgIHN0YXJ0OiBnZXRSYW5nZS5iaW5kKG51bGwsICdzdGFydCcsIDAsIHJhbmdlcyksXG4gICAgZW5kOiBnZXRSYW5nZS5iaW5kKG51bGwsICdlbmQnLCAxLCByYW5nZXMpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFJhbmdlKGZuTmFtZSwgdmFsdWVJbmRleCwgcmFuZ2VzLCByYW5nZUluZGV4KXtcbiAgaWYgKHJhbmdlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIGxvZy53YXJuKGBERVBSRUNBVEVEOiBGdW5jdGlvbiAnJHtmbk5hbWV9JyBvbiAnVGltZVJhbmdlcycgY2FsbGVkIHdpdGhvdXQgYW4gaW5kZXggYXJndW1lbnQuYCk7XG4gICAgcmFuZ2VJbmRleCA9IDA7XG4gIH1cbiAgcmFuZ2VDaGVjayhmbk5hbWUsIHJhbmdlSW5kZXgsIHJhbmdlcy5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIHJhbmdlc1tyYW5nZUluZGV4XVt2YWx1ZUluZGV4XTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VDaGVjayhmbk5hbWUsIGluZGV4LCBtYXhJbmRleCl7XG4gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBtYXhJbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGV4ZWN1dGUgJyR7Zm5OYW1lfScgb24gJ1RpbWVSYW5nZXMnOiBUaGUgaW5kZXggcHJvdmlkZWQgKCR7aW5kZXh9KSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG1heGltdW0gYm91bmQgKCR7bWF4SW5kZXh9KS5gKTtcbiAgfVxufVxuIl19
},{"./log.js":149}],153:[function(_dereq_,module,exports){
/**
* @file to-title-case.js
*
* Uppercase the first letter of a string
*
* @param {String} string String to be uppercased
* @return {String}
* @private
* @method toTitleCase
*/
"use strict";
exports.__esModule = true;
function toTitleCase(string) {
return string.charAt(0).toUpperCase() + string.slice(1);
}
exports["default"] = toTitleCase;
module.exports = exports["default"];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9qcy91dGlscy90by10aXRsZS1jYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFVQSxTQUFTLFdBQVcsQ0FBQyxNQUFNLEVBQUM7QUFDMUIsU0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDekQ7O3FCQUVjLFdBQVciLCJmaWxlIjoic3JjL2pzL3V0aWxzL3RvLXRpdGxlLWNhc2UuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlIHRvLXRpdGxlLWNhc2UuanNcbiAqXG4gKiBVcHBlcmNhc2UgdGhlIGZpcnN0IGxldHRlciBvZiBhIHN0cmluZ1xuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gc3RyaW5nIFN0cmluZyB0byBiZSB1cHBlcmNhc2VkXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAcHJpdmF0ZVxuICogQG1ldGhvZCB0b1RpdGxlQ2FzZVxuICovXG5mdW5jdGlvbiB0b1RpdGxlQ2FzZShzdHJpbmcpe1xuICByZXR1cm4gc3RyaW5nLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyaW5nLnNsaWNlKDEpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB0b1RpdGxlQ2FzZTtcbiJdfQ==
},{}],154:[function(_dereq_,module,exports){
/**
* @file url.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
/**
* Resolve and parse the elements of a URL
*
* @param {String} url The url to parse
* @return {Object} An object of url details
* @method parseUrl
*/
var parseUrl = function parseUrl(url) {
var props = ['protocol', 'hostname', 'port', 'pathname', 'search', 'hash', 'host'];
// add the url to an anchor and let the browser parse the URL
var a = _globalDocument2['default'].createElement('a');
a.href = url;
// IE8 (and 9?) Fix
// ie8 doesn't parse the URL correctly until the anchor is actually
// added to the body, and an innerHTML is needed to trigger the parsing
var addToBody = a.host === '' && a.protocol !== 'file:';
var div = undefined;
if (addToBody) {
div = _globalDocument2['default'].createElement('div');
div.innerHTML = '';
a = div.firstChild;
// prevent the div from affecting layout
div.setAttribute('style', 'display:none; position:absolute;');
_globalDocument2['default'].body.appendChild(div);
}
// Copy the specific URL properties to a new object
// This is also needed for IE8 because the anchor loses its
// properties when it's removed from the dom
var details = {};
for (var i = 0; i < props.length; i++) {
details[props[i]] = a[props[i]];
}
// IE9 adds the port to the host property unlike everyone else. If
// a port identifier is added for standard ports, strip it.
if (details.protocol === 'http:') {
details.host = details.host.replace(/:80$/, '');
}
if (details.protocol === 'https:') {
details.host = details.host.replace(/:443$/, '');
}
if (addToBody) {
_globalDocument2['default'].body.removeChild(div);
}
return details;
};
exports.parseUrl = parseUrl;
/**
* Get absolute version of relative URL. Used to tell flash correct URL.
* http://stackoverflow.com/questions/470832/getting-an-absolute-url-from-a-relative-one-ie6-issue
*
* @param {String} url URL to make absolute
* @return {String} Absolute URL
* @private
* @method getAbsoluteURL
*/
var getAbsoluteURL = function getAbsoluteURL(url) {
// Check if absolute URL
if (!url.match(/^https?:\/\//)) {
// Convert to absolute URL. Flash hosted off-site needs an absolute URL.
var div = _globalDocument2['default'].createElement('div');
div.innerHTML = 'x';
url = div.firstChild.href;
}
return url;
};
exports.getAbsoluteURL = getAbsoluteURL;
/**
* Returns the extension of the passed file name. It will return an empty string if you pass an invalid path
*
* @param {String} path The fileName path like '/path/to/file.mp4'
* @returns {String} The extension in lower case or an empty string if no extension could be found.
* @method getFileExtension
*/
var getFileExtension = function getFileExtension(path) {
if (typeof path === 'string') {
var splitPathRe = /^(\/?)([\s\S]*?)((?:\.{1,2}|[^\/]+?)(\.([^\.\/\?]+)))(?:[\/]*|[\?].*)$/i;
var pathParts = splitPathRe.exec(path);
if (pathParts) {
return pathParts.pop().toLowerCase();
}
}
return '';
};
exports.getFileExtension = getFileExtension;
/**
* Returns whether the url passed is a cross domain request or not.
*
* @param {String} url The url to check
* @return {Boolean} Whether it is a cross domain request or not
* @method isCrossOrigin
*/
var isCrossOrigin = function isCrossOrigin(url) {
var winLoc = _globalWindow2['default'].location;
var urlInfo = parseUrl(url);
// IE8 protocol relative urls will return ':' for protocol
var srcProtocol = urlInfo.protocol === ':' ? winLoc.protocol : urlInfo.protocol;
// Check if url is for another domain/origin
// IE8 doesn't know location.origin, so we won't rely on it here
var crossOrigin = srcProtocol + urlInfo.host !== winLoc.protocol + winLoc.host;
return crossOrigin;
};
exports.isCrossOrigin = isCrossOrigin;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDdEM7R0FDRjs7QUFFRCxTQUFPLEVBQUUsQ0FBQztDQUNYLENBQUM7Ozs7Ozs7Ozs7QUFTSyxJQUFNLGFBQWEsR0FBRyxTQUFoQixhQUFhLENBQVksR0FBRyxFQUFFO0FBQ3pDLE1BQUksTUFBTSxHQUFHLDBCQUFPLFFBQVEsQ0FBQztBQUM3QixNQUFJLE9BQU8sR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7OztBQUc1QixNQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxLQUFLLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7Ozs7QUFJaEYsTUFBSSxXQUFXLEdBQUcsQUFBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBTyxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEFBQUMsQ0FBQzs7QUFFbkYsU0FBTyxXQUFXLENBQUM7Q0FDcEIsQ0FBQyIsImZpbGUiOiJzcmMvanMvdXRpbHMvdXJsLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZSB1cmwuanNcbiAqL1xuaW1wb3J0IGRvY3VtZW50IGZyb20gJ2dsb2JhbC9kb2N1bWVudCc7XG5pbXBvcnQgd2luZG93IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuXG4vKipcbiAqIFJlc29sdmUgYW5kIHBhcnNlIHRoZSBlbGVtZW50cyBvZiBhIFVSTFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFRoZSB1cmwgdG8gcGFyc2VcbiAqIEByZXR1cm4ge09iamVjdH0gICAgIEFuIG9iamVjdCBvZiB1cmwgZGV0YWlsc1xuICogQG1ldGhvZCBwYXJzZVVybFxuICovXG5leHBvcnQgY29uc3QgcGFyc2VVcmwgPSBmdW5jdGlvbih1cmwpIHtcbiAgY29uc3QgcHJvcHMgPSBbJ3Byb3RvY29sJywgJ2hvc3RuYW1lJywgJ3BvcnQnLCAncGF0aG5hbWUnLCAnc2VhcmNoJywgJ2hhc2gnLCAnaG9zdCddO1xuXG4gIC8vIGFkZCB0aGUgdXJsIHRvIGFuIGFuY2hvciBhbmQgbGV0IHRoZSBicm93c2VyIHBhcnNlIHRoZSBVUkxcbiAgbGV0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGEuaHJlZiA9IHVybDtcblxuICAvLyBJRTggKGFuZCA5PykgRml4XG4gIC8vIGllOCBkb2Vzbid0IHBhcnNlIHRoZSBVUkwgY29ycmVjdGx5IHVudGlsIHRoZSBhbmNob3IgaXMgYWN0dWFsbHlcbiAgLy8gYWRkZWQgdG8gdGhlIGJvZHksIGFuZCBhbiBpbm5lckhUTUwgaXMgbmVlZGVkIHRvIHRyaWdnZXIgdGhlIHBhcnNpbmdcbiAgbGV0IGFkZFRvQm9keSA9IChhLmhvc3QgPT09ICcnICYmIGEucHJvdG9jb2wgIT09ICdmaWxlOicpO1xuICBsZXQgZGl2O1xuICBpZiAoYWRkVG9Cb2R5KSB7XG4gICAgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgZGl2LmlubmVySFRNTCA9IGA8YSBocmVmPVwiJHt1cmx9XCI+PC9hPmA7XG4gICAgYSA9IGRpdi5maXJzdENoaWxkO1xuICAgIC8vIHByZXZlbnQgdGhlIGRpdiBmcm9tIGFmZmVjdGluZyBsYXlvdXRcbiAgICBkaXYuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOycpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZGl2KTtcbiAgfVxuXG4gIC8vIENvcHkgdGhlIHNwZWNpZmljIFVSTCBwcm9wZXJ0aWVzIHRvIGEgbmV3IG9iamVjdFxuICAvLyBUaGlzIGlzIGFsc28gbmVlZGVkIGZvciBJRTggYmVjYXVzZSB0aGUgYW5jaG9yIGxvc2VzIGl0c1xuICAvLyBwcm9wZXJ0aWVzIHdoZW4gaXQncyByZW1vdmVkIGZyb20gdGhlIGRvbVxuICBsZXQgZGV0YWlscyA9IHt9O1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgZGV0YWlsc1twcm9wc1tpXV0gPSBhW3Byb3BzW2ldXTtcbiAgfVxuXG4gIC8vIElFOSBhZGRzIHRoZSBwb3J0IHRvIHRoZSBob3N0IHByb3BlcnR5IHVubGlrZSBldmVyeW9uZSBlbHNlLiBJZlxuICAvLyBhIHBvcnQgaWRlbnRpZmllciBpcyBhZGRlZCBmb3Igc3RhbmRhcmQgcG9ydHMsIHN0cmlwIGl0LlxuICBpZiAoZGV0YWlscy5wcm90b2NvbCA9PT0gJ2h0dHA6Jykge1xuICAgIGRldGFpbHMuaG9zdCA9IGRldGFpbHMuaG9zdC5yZXBsYWNlKC86ODAkLywgJycpO1xuICB9XG4gIGlmIChkZXRhaWxzLnByb3RvY29sID09PSAnaHR0cHM6Jykge1xuICAgIGRldGFpbHMuaG9zdCA9IGRldGFpbHMuaG9zdC5yZXBsYWNlKC86NDQzJC8sICcnKTtcbiAgfVxuXG4gIGlmIChhZGRUb0JvZHkpIHtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gIH1cblxuICByZXR1cm4gZGV0YWlscztcbn07XG5cbi8qKlxuICogR2V0IGFic29sdXRlIHZlcnNpb24gb2YgcmVsYXRpdmUgVVJMLiBVc2VkIHRvIHRlbGwgZmxhc2ggY29ycmVjdCBVUkwuXG4gKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3MDgzMi9nZXR0aW5nLWFuLWFic29sdXRlLXVybC1mcm9tLWEtcmVsYXRpdmUtb25lLWllNi1pc3N1ZVxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFVSTCB0byBtYWtlIGFic29sdXRlXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICBBYnNvbHV0ZSBVUkxcbiAqIEBwcml2YXRlXG4gKiBAbWV0aG9kIGdldEFic29sdXRlVVJMXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBYnNvbHV0ZVVSTCA9IGZ1bmN0aW9uKHVybCl7XG4gIC8vIENoZWNrIGlmIGFic29sdXRlIFVSTFxuICBpZiAoIXVybC5tYXRjaCgvXmh0dHBzPzpcXC9cXC8vKSkge1xuICAgIC8vIENvbnZlcnQgdG8gYWJzb2x1dGUgVVJMLiBGbGFzaCBob3N0ZWQgb2ZmLXNpdGUgbmVlZHMgYW4gYWJzb2x1dGUgVVJMLlxuICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gYDxhIGhyZWY9XCIke3VybH1cIj54PC9hPmA7XG4gICAgdXJsID0gZGl2LmZpcnN0Q2hpbGQuaHJlZjtcbiAgfVxuXG4gIHJldHVybiB1cmw7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGV4dGVuc2lvbiBvZiB0aGUgcGFzc2VkIGZpbGUgbmFtZS4gSXQgd2lsbCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGlmIHlvdSBwYXNzIGFuIGludmFsaWQgcGF0aFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSAgICBwYXRoICAgIFRoZSBmaWxlTmFtZSBwYXRoIGxpa2UgJy9wYXRoL3RvL2ZpbGUubXA0J1xuICogQHJldHVybnMge1N0cmluZ30gICAgICAgICAgVGhlIGV4dGVuc2lvbiBpbiBsb3dlciBjYXNlIG9yIGFuIGVtcHR5IHN0cmluZyBpZiBubyBleHRlbnNpb24gY291bGQgYmUgZm91bmQuXG4gKiBAbWV0aG9kIGdldEZpbGVFeHRlbnNpb25cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEZpbGVFeHRlbnNpb24gPSBmdW5jdGlvbihwYXRoKSB7XG4gIGlmKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJyl7XG4gICAgbGV0IHNwbGl0UGF0aFJlID0gL14oXFwvPykoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz8pKFxcLihbXlxcLlxcL1xcP10rKSkpKD86W1xcL10qfFtcXD9dLiopJC9pO1xuICAgIGxldCBwYXRoUGFydHMgPSBzcGxpdFBhdGhSZS5leGVjKHBhdGgpO1xuXG4gICAgaWYgKHBhdGhQYXJ0cykge1xuICAgICAgcmV0dXJuIHBhdGhQYXJ0cy5wb3AoKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiAnJztcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSB1cmwgcGFzc2VkIGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIHVybCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gICBXaGV0aGVyIGl0IGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90XG4gKiBAbWV0aG9kIGlzQ3Jvc3NPcmlnaW5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQ3Jvc3NPcmlnaW4gPSBmdW5jdGlvbih1cmwpIHtcbiAgbGV0IHdpbkxvYyA9IHdpbmRvdy5sb2NhdGlvbjtcbiAgbGV0IHVybEluZm8gPSBwYXJzZVVybCh1cmwpO1xuXG4gIC8vIElFOCBwcm90b2NvbCByZWxhdGl2ZSB1cmxzIHdpbGwgcmV0dXJuICc6JyBmb3IgcHJvdG9jb2xcbiAgbGV0IHNyY1Byb3RvY29sID0gdXJsSW5mby5wcm90b2NvbCA9PT0gJzonID8gd2luTG9jLnByb3RvY29sIDogdXJsSW5mby5wcm90b2NvbDtcblxuICAvLyBDaGVjayBpZiB1cmwgaXMgZm9yIGFub3RoZXIgZG9tYWluL29yaWdpblxuICAvLyBJRTggZG9lc24ndCBrbm93IGxvY2F0aW9uLm9yaWdpbiwgc28gd2Ugd29uJ3QgcmVseSBvbiBpdCBoZXJlXG4gIGxldCBjcm9zc09yaWdpbiA9IChzcmNQcm90b2NvbCArIHVybEluZm8uaG9zdCkgIT09ICh3aW5Mb2MucHJvdG9jb2wgKyB3aW5Mb2MuaG9zdCk7XG5cbiAgcmV0dXJuIGNyb3NzT3JpZ2luO1xufTtcbiJdfQ==
},{"global/document":7,"global/window":8}],155:[function(_dereq_,module,exports){
/**
* @file video.js
*/
'use strict';
exports.__esModule = true;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _globalWindow = _dereq_('global/window');
var _globalWindow2 = _interopRequireDefault(_globalWindow);
var _globalDocument = _dereq_('global/document');
var _globalDocument2 = _interopRequireDefault(_globalDocument);
var _setup = _dereq_('./setup');
var setup = _interopRequireWildcard(_setup);
var _utilsStylesheetJs = _dereq_('./utils/stylesheet.js');
var stylesheet = _interopRequireWildcard(_utilsStylesheetJs);
var _component = _dereq_('./component');
var _component2 = _interopRequireDefault(_component);
var _eventTarget = _dereq_('./event-target');
var _eventTarget2 = _interopRequireDefault(_eventTarget);
var _utilsEventsJs = _dereq_('./utils/events.js');
var Events = _interopRequireWildcard(_utilsEventsJs);
var _player = _dereq_('./player');
var _player2 = _interopRequireDefault(_player);
var _pluginsJs = _dereq_('./plugins.js');
var _pluginsJs2 = _interopRequireDefault(_pluginsJs);
var _srcJsUtilsMergeOptionsJs = _dereq_('../../src/js/utils/merge-options.js');
var _srcJsUtilsMergeOptionsJs2 = _interopRequireDefault(_srcJsUtilsMergeOptionsJs);
var _utilsFnJs = _dereq_('./utils/fn.js');
var Fn = _interopRequireWildcard(_utilsFnJs);
var _tracksTextTrackJs = _dereq_('./tracks/text-track.js');
var _tracksTextTrackJs2 = _interopRequireDefault(_tracksTextTrackJs);
var _tracksAudioTrackJs = _dereq_('./tracks/audio-track.js');
var _tracksAudioTrackJs2 = _interopRequireDefault(_tracksAudioTrackJs);
var _tracksVideoTrackJs = _dereq_('./tracks/video-track.js');
var _tracksVideoTrackJs2 = _interopRequireDefault(_tracksVideoTrackJs);
var _objectAssign = _dereq_('object.assign');
var _objectAssign2 = _interopRequireDefault(_objectAssign);
var _utilsTimeRangesJs = _dereq_('./utils/time-ranges.js');
var _utilsFormatTimeJs = _dereq_('./utils/format-time.js');
var _utilsFormatTimeJs2 = _interopRequireDefault(_utilsFormatTimeJs);
var _utilsLogJs = _dereq_('./utils/log.js');
var _utilsLogJs2 = _interopRequireDefault(_utilsLogJs);
var _utilsDomJs = _dereq_('./utils/dom.js');
var Dom = _interopRequireWildcard(_utilsDomJs);
var _utilsBrowserJs = _dereq_('./utils/browser.js');
var browser = _interopRequireWildcard(_utilsBrowserJs);
var _utilsUrlJs = _dereq_('./utils/url.js');
var Url = _interopRequireWildcard(_utilsUrlJs);
var _extendJs = _dereq_('./extend.js');
var _extendJs2 = _interopRequireDefault(_extendJs);
var _lodashCompatObjectMerge = _dereq_('lodash-compat/object/merge');
var _lodashCompatObjectMerge2 = _interopRequireDefault(_lodashCompatObjectMerge);
var _utilsCreateDeprecationProxyJs = _dereq_('./utils/create-deprecation-proxy.js');
var _utilsCreateDeprecationProxyJs2 = _interopRequireDefault(_utilsCreateDeprecationProxyJs);
var _xhr = _dereq_('xhr');
var _xhr2 = _interopRequireDefault(_xhr);
// Include the built-in techs
var _techTechJs = _dereq_('./tech/tech.js');
var _techTechJs2 = _interopRequireDefault(_techTechJs);
var _techHtml5Js = _dereq_('./tech/html5.js');
var _techHtml5Js2 = _interopRequireDefault(_techHtml5Js);
var _techFlashJs = _dereq_('./tech/flash.js');
var _techFlashJs2 = _interopRequireDefault(_techFlashJs);
// HTML5 Element Shim for IE8
if (typeof HTMLVideoElement === 'undefined') {
_globalDocument2['default'].createElement('video');
_globalDocument2['default'].createElement('audio');
_globalDocument2['default'].createElement('track');
}
/**
* Doubles as the main function for users to create a player instance and also
* the main library object.
* The `videojs` function can be used to initialize or retrieve a player.
* ```js
* var myPlayer = videojs('my_video_id');
* ```
*
* @param {String|Element} id Video element or video element ID
* @param {Object=} options Optional options object for config/settings
* @param {Function=} ready Optional ready callback
* @return {Player} A player instance
* @mixes videojs
* @method videojs
*/
var videojs = function videojs(id, options, ready) {
var tag = undefined; // Element of ID
// Allow for element or ID to be passed in
// String ID
if (typeof id === 'string') {
// Adjust for jQuery ID syntax
if (id.indexOf('#') === 0) {
id = id.slice(1);
}
// If a player instance has already been created for this ID return it.
if (videojs.getPlayers()[id]) {
// If options or ready funtion are passed, warn
if (options) {
_utilsLogJs2['default'].warn('Player "' + id + '" is already initialised. Options will not be applied.');
}
if (ready) {
videojs.getPlayers()[id].ready(ready);
}
return videojs.getPlayers()[id];
// Otherwise get element for ID
} else {
tag = Dom.getEl(id);
}
// ID is a media element
} else {
tag = id;
}
// Check for a useable element
if (!tag || !tag.nodeName) {
// re: nodeName, could be a box div also
throw new TypeError('The element or ID supplied is not valid. (videojs)'); // Returns
}
// Element may have a player attr referring to an already created player instance.
// If not, set up a new player and return the instance.
return tag['player'] || _player2['default'].players[tag.playerId] || new _player2['default'](tag, options, ready);
};
// Add default styles
if (_globalWindow2['default'].VIDEOJS_NO_DYNAMIC_STYLE !== true) {
var style = Dom.$('.vjs-styles-defaults');
if (!style) {
style = stylesheet.createStyleElement('vjs-styles-defaults');
var head = Dom.$('head');
head.insertBefore(style, head.firstChild);
stylesheet.setTextContent(style, '\n .video-js {\n width: 300px;\n height: 150px;\n }\n\n .vjs-fluid {\n padding-top: 56.25%\n }\n ');
}
}
// Run Auto-load players
// You have to wait at least once in case this script is loaded after your video in the DOM (weird behavior only with minified version)
setup.autoSetupTimeout(1, videojs);
/*
* Current software version (semver)
*
* @type {String}
*/
videojs.VERSION = '5.10.2-27';
/**
* Indicates it's the Hola version of video.js
*
* @type {boolean}
*/
videojs.HOLA_VERSION = true;
/**
* The global options object. These are the settings that take effect
* if no overrides are specified when the player is created.
*
* ```js
* videojs.options.autoplay = true
* // -> all players will autoplay by default
* ```
*
* @type {Object}
*/
videojs.options = _player2['default'].prototype.options_;
/**
* Get an object with the currently created players, keyed by player ID
*
* @return {Object} The created players
* @mixes videojs
* @method getPlayers
*/
videojs.getPlayers = function () {
return _player2['default'].players;
};
/**
* For backward compatibility, expose players object.
*
* @deprecated
* @memberOf videojs
* @property {Object|Proxy} players
*/
videojs.players = _utilsCreateDeprecationProxyJs2['default'](_player2['default'].players, {
get: 'Access to videojs.players is deprecated; use videojs.getPlayers instead',
set: 'Modification of videojs.players is deprecated'
});
/**
* Get a component class object by name
* ```js
* var VjsButton = videojs.getComponent('Button');
* // Create a new instance of the component
* var myButton = new VjsButton(myPlayer);
* ```
*
* @return {Component} Component identified by name
* @mixes videojs
* @method getComponent
*/
videojs.getComponent = _component2['default'].getComponent;
/**
* Register a component so it can referred to by name
* Used when adding to other
* components, either through addChild
* `component.addChild('myComponent')`
* or through default children options
* `{ children: ['myComponent'] }`.
* ```js
* // Get a component to subclass
* var VjsButton = videojs.getComponent('Button');
* // Subclass the component (see 'extend' doc for more info)
* var MySpecialButton = videojs.extend(VjsButton, {});
* // Register the new component
* VjsButton.registerComponent('MySepcialButton', MySepcialButton);
* // (optionally) add the new component as a default player child
* myPlayer.addChild('MySepcialButton');
* ```
* NOTE: You could also just initialize the component before adding.
* `component.addChild(new MyComponent());`
*
* @param {String} The class name of the component
* @param {Component} The component class
* @return {Component} The newly registered component
* @mixes videojs
* @method registerComponent
*/
videojs.registerComponent = function (name, comp) {
if (_techTechJs2['default'].isTech(comp)) {
_utilsLogJs2['default'].warn('The ' + name + ' tech was registered as a component. It should instead be registered using videojs.registerTech(name, tech)');
}
_component2['default'].registerComponent.call(_component2['default'], name, comp);
};
/**
* Get a Tech class object by name
* ```js
* var Html5 = videojs.getTech('Html5');
* // Create a new instance of the component
* var html5 = new Html5(options);
* ```
*
* @return {Tech} Tech identified by name
* @mixes videojs
* @method getComponent
*/
videojs.getTech = _techTechJs2['default'].getTech;
/**
* Register a Tech so it can referred to by name.
* This is used in the tech order for the player.
*
* ```js
* // get the Html5 Tech
* var Html5 = videojs.getTech('Html5');
* var MyTech = videojs.extend(Html5, {});
* // Register the new Tech
* VjsButton.registerTech('Tech', MyTech);
* var player = videojs('myplayer', {
* techOrder: ['myTech', 'html5']
* });
* ```
*
* @param {String} The class name of the tech
* @param {Tech} The tech class
* @return {Tech} The newly registered Tech
* @mixes videojs
* @method registerTech
*/
videojs.registerTech = _techTechJs2['default'].registerTech;
/**
* A suite of browser and device tests
*
* @type {Object}
* @private
*/
videojs.browser = browser;
/**
* Whether or not the browser supports touch events. Included for backward
* compatibility with 4.x, but deprecated. Use `videojs.browser.TOUCH_ENABLED`
* instead going forward.
*
* @deprecated
* @type {Boolean}
*/
videojs.TOUCH_ENABLED = browser.TOUCH_ENABLED;
/**
* Subclass an existing class
* Mimics ES6 subclassing with the `extend` keyword
* ```js
* // Create a basic javascript 'class'
* function MyClass(name){
* // Set a property at initialization
* this.myName = name;
* }
* // Create an instance method
* MyClass.prototype.sayMyName = function(){
* alert(this.myName);
* };
* // Subclass the exisitng class and change the name
* // when initializing
* var MySubClass = videojs.extend(MyClass, {
* constructor: function(name) {
* // Call the super class constructor for the subclass
* MyClass.call(this, name)
* }
* });
* // Create an instance of the new sub class
* var myInstance = new MySubClass('John');
* myInstance.sayMyName(); // -> should alert "John"
* ```
*
* @param {Function} The Class to subclass
* @param {Object} An object including instace methods for the new class
* Optionally including a `constructor` function
* @return {Function} The newly created subclass
* @mixes videojs
* @method extend
*/
videojs.extend = _extendJs2['default'];
/**
* Merge two options objects recursively
* Performs a deep merge like lodash.merge but **only merges plain objects**
* (not arrays, elements, anything else)
* Other values will be copied directly from the second object.
* ```js
* var defaultOptions = {
* foo: true,
* bar: {
* a: true,
* b: [1,2,3]
* }
* };
* var newOptions = {
* foo: false,
* bar: {
* b: [4,5,6]
* }
* };
* var result = videojs.mergeOptions(defaultOptions, newOptions);
* // result.foo = false;
* // result.bar.a = true;
* // result.bar.b = [4,5,6];
* ```
*
* @param {Object} defaults The options object whose values will be overriden
* @param {Object} overrides The options object with values to override the first
* @param {Object} etc Any number of additional options objects
*
* @return {Object} a new object with the merged values
* @mixes videojs
* @method mergeOptions
*/
videojs.mergeOptions = _srcJsUtilsMergeOptionsJs2['default'];
/**
* Change the context (this) of a function
*
* videojs.bind(newContext, function(){
* this === newContext
* });
*
* NOTE: as of v5.0 we require an ES5 shim, so you should use the native
* `function(){}.bind(newContext);` instead of this.
*
* @param {*} context The object to bind as scope
* @param {Function} fn The function to be bound to a scope
* @param {Number=} uid An optional unique ID for the function to be set
* @return {Function}
*/
videojs.bind = Fn.bind;
/**
* Create a Video.js player plugin
* Plugins are only initialized when options for the plugin are included
* in the player options, or the plugin function on the player instance is
* called.
* **See the plugin guide in the docs for a more detailed example**
* ```js
* // Make a plugin that alerts when the player plays
* videojs.plugin('myPlugin', function(myPluginOptions) {
* myPluginOptions = myPluginOptions || {};
*
* var player = this;
* var alertText = myPluginOptions.text || 'Player is playing!'
*
* player.on('play', function(){
* alert(alertText);
* });
* });
* // USAGE EXAMPLES
* // EXAMPLE 1: New player with plugin options, call plugin immediately
* var player1 = videojs('idOne', {
* myPlugin: {
* text: 'Custom text!'
* }
* });
* // Click play
* // --> Should alert 'Custom text!'
* // EXAMPLE 3: New player, initialize plugin later
* var player3 = videojs('idThree');
* // Click play
* // --> NO ALERT
* // Click pause
* // Initialize plugin using the plugin function on the player instance
* player3.myPlugin({
* text: 'Plugin added later!'
* });
* // Click play
* // --> Should alert 'Plugin added later!'
* ```
*
* @param {String} name The plugin name
* @param {Function} fn The plugin function that will be called with options
* @mixes videojs
* @method plugin
*/
videojs.plugin = _pluginsJs2['default'];
/**
* Adding languages so that they're available to all players.
* ```js
* videojs.addLanguage('es', { 'Hello': 'Hola' });
* ```
*
* @param {String} code The language code or dictionary property
* @param {Object} data The data values to be translated
* @return {Object} The resulting language dictionary object
* @mixes videojs
* @method addLanguage
*/
videojs.addLanguage = function (code, data) {
var _merge;
code = ('' + code).toLowerCase();
return _lodashCompatObjectMerge2['default'](videojs.options.languages, (_merge = {}, _merge[code] = data, _merge))[code];
};
/**
* Log debug messages.
*
* @param {...Object} messages One or more messages to log
*/
videojs.log = _utilsLogJs2['default'];
/**
* Creates an emulated TimeRange object.
*
* @param {Number|Array} start Start time in seconds or an array of ranges
* @param {Number} end End time in seconds
* @return {Object} Fake TimeRange object
* @method createTimeRange
*/
videojs.createTimeRange = videojs.createTimeRanges = _utilsTimeRangesJs.createTimeRanges;
/**
* Format seconds as a time string, H:MM:SS or M:SS
* Supplying a guide (in seconds) will force a number of leading zeros
* to cover the length of the guide
*
* @param {Number} seconds Number of seconds to be turned into a string
* @param {Number} guide Number (in seconds) to model the string after
* @return {String} Time formatted as H:MM:SS or M:SS
* @method formatTime
*/
videojs.formatTime = _utilsFormatTimeJs2['default'];
/**
* Resolve and parse the elements of a URL
*
* @param {String} url The url to parse
* @return {Object} An object of url details
* @method parseUrl
*/
videojs.parseUrl = Url.parseUrl;
/**
* Returns whether the url passed is a cross domain request or not.
*
* @param {String} url The url to check
* @return {Boolean} Whether it is a cross domain request or not
* @method isCrossOrigin
*/
videojs.isCrossOrigin = Url.isCrossOrigin;
/**
* Event target class.
*
* @type {Function}
*/
videojs.EventTarget = _eventTarget2['default'];
/**
* Add an event listener to element
* It stores the handler function in a separate cache object
* and adds a generic handler to the element's event,
* along with a unique id (guid) to the element.
*
* @param {Element|Object} elem Element or object to bind listeners to
* @param {String|Array} type Type of event to bind to.
* @param {Function} fn Event listener.
* @method on
*/
videojs.on = Events.on;
/**
* Trigger a listener only once for an event
*
* @param {Element|Object} elem Element or object to
* @param {String|Array} type Name/type of event
* @param {Function} fn Event handler function
* @method one
*/
videojs.one = Events.one;
/**
* Removes event listeners from an element
*
* @param {Element|Object} elem Object to remove listeners from
* @param {String|Array=} type Type of listener to remove. Don't include to remove all events from element.
* @param {Function} fn Specific listener to remove. Don't include to remove listeners for an event type.
* @method off
*/
videojs.off = Events.off;
/**
* Trigger an event for an element
*
* @param {Element|Object} elem Element to trigger an event on
* @param {Event|Object|String} event A string (the type) or an event object with a type attribute
* @param {Object} [hash] data hash to pass along with the event
* @return {Boolean=} Returned only if default was prevented
* @method trigger
*/
videojs.trigger = Events.trigger;
/**
* A cross-browser XMLHttpRequest wrapper. Here's a simple example:
*
* videojs.xhr({
* body: someJSONString,
* uri: "/foo",
* headers: {
* "Content-Type": "application/json"
* }
* }, function (err, resp, body) {
* // check resp.statusCode
* });
*
* Check out the [full
* documentation](https://github.com/Raynos/xhr/blob/v2.1.0/README.md)
* for more options.
*
* @param {Object} options settings for the request.
* @return {XMLHttpRequest|XDomainRequest} the request object.
* @see https://github.com/Raynos/xhr
*/
videojs.xhr = _xhr2['default'];
/**
* TextTrack class
*
* @type {Function}
*/
videojs.TextTrack = _tracksTextTrackJs2['default'];
/**
* export the AudioTrack class so that source handlers can create
* AudioTracks and then add them to the players AudioTrackList
*
* @type {Function}
*/
videojs.AudioTrack = _tracksAudioTrackJs2['default'];
/**
* export the VideoTrack class so that source handlers can create
* VideoTracks and then add them to the players VideoTrackList
*
* @type {Function}
*/
videojs.VideoTrack = _tracksVideoTrackJs2['default'];
/**
* Determines, via duck typing, whether or not a value is a DOM element.
*
* @method isEl
* @param {Mixed} value
* @return {Boolean}
*/
videojs.isEl = Dom.isEl;
/**
* Determines, via duck typing, whether or not a value is a text node.
*
* @method isTextNode
* @param {Mixed} value
* @return {Boolean}
*/
videojs.isTextNode = Dom.isTextNode;
/**
* Creates an element and applies properties.
*
* @method createEl
* @param {String} [tagName='div'] Name of tag to be created.
* @param {Object} [properties={}] Element properties to be applied.
* @param {Object} [attributes={}] Element attributes to be applied.
* @return {Element}
*/
videojs.createEl = Dom.createEl;
/**
* Check if an element has a CSS class
*
* @method hasClass
* @param {Element} element Element to check
* @param {String} classToCheck Classname to check
*/
videojs.hasClass = Dom.hasElClass;
/**
* Add a CSS class name to an element
*
* @method addClass
* @param {Element} element Element to add class name to
* @param {String} classToAdd Classname to add
*/
videojs.addClass = Dom.addElClass;
/**
* Remove a CSS class name from an element
*
* @method removeClass
* @param {Element} element Element to remove from class name
* @param {String} classToRemove Classname to remove
*/
videojs.removeClass = Dom.removeElClass;
/**
* Adds or removes a CSS class name on an element depending on an optional
* condition or the presence/absence of the class name.
*
* @method toggleElClass
* @param {Element} element
* @param {String} classToToggle
* @param {Boolean|Function} [predicate]
* Can be a function that returns a Boolean. If `true`, the class
* will be added; if `false`, the class will be removed. If not
* given, the class will be added if not present and vice versa.
*/
videojs.toggleClass = Dom.toggleElClass;
/**
* Apply attributes to an HTML element.
*
* @method setAttributes
* @param {Element} el Target element.
* @param {Object=} attributes Element attributes to be applied.
*/
videojs.setAttributes = Dom.setElAttributes;
/**
* Get an element's attribute values, as defined on the HTML tag
* Attributes are not the same as properties. They're defined on the tag
* or with setAttribute (which shouldn't be used with HTML)
* This will return true or false for boolean attributes.
*
* @method getAttributes
* @param {Element} tag Element from which to get tag attributes
* @return {Object}
*/
videojs.getAttributes = Dom.getElAttributes;
/**
* Empties the contents of an element.
*
* @method emptyEl
* @param {Element} el
* @return {Element}
*/
videojs.emptyEl = Dom.emptyEl;
/**
* Normalizes and appends content to an element.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @method appendContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* @return {Element}
*/
videojs.appendContent = Dom.appendContent;
/**
* Normalizes and inserts content into an element; this is identical to
* `appendContent()`, except it empties the element first.
*
* The content for an element can be passed in multiple types and
* combinations, whose behavior is as follows:
*
* - String
* Normalized into a text node.
*
* - Element, TextNode
* Passed through.
*
* - Array
* A one-dimensional array of strings, elements, nodes, or functions (which
* return single strings, elements, or nodes).
*
* - Function
* If the sole argument, is expected to produce a string, element,
* node, or array.
*
* @method insertContent
* @param {Element} el
* @param {String|Element|TextNode|Array|Function} content
* @return {Element}
*/
videojs.insertContent = Dom.insertContent;
/*
* Custom Universal Module Definition (UMD)
*
* Video.js will never be a non-browser lib so we can simplify UMD a bunch and
* still support requirejs and browserify. This also needs to be closure
* compiler compatible, so string keys are used.
*/
if (typeof define === 'function' && define['amd']) {
define('videojs', [], function () {
return videojs;
});
// checking that module is an object too because of umdjs/umd#35
} else if (typeof exports === 'object' && typeof module === 'object') {
module['exports'] = videojs;
}
exports['default'] = videojs;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Ozs7Ozs7Ozs7O0FBWTVDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQzs7Ozs7Ozs7O0FBUzVDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMkI5QixPQUFPLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0QjFDLE9BQU8sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0FBUzFDLElBQUksT0FBTyxNQUFNLEtBQUssVUFBVSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUNqRCxRQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxZQUFVO0FBQUUsV0FBTyxPQUFPLENBQUM7R0FBRSxDQUFDLENBQUM7OztDQUd0RCxNQUFNLElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtBQUNwRSxVQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsT0FBTyxDQUFDO0dBQzdCOztxQkFFYyxPQUFPIiwiZmlsZSI6InNyYy9qcy92aWRlby5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGUgdmlkZW8uanNcbiAqL1xuaW1wb3J0IHdpbmRvdyBmcm9tICdnbG9iYWwvd2luZG93JztcbmltcG9ydCBkb2N1bWVudCBmcm9tICdnbG9iYWwvZG9jdW1lbnQnO1xuaW1wb3J0ICogYXMgc2V0dXAgZnJvbSAnLi9zZXR1cCc7XG5pbXBvcnQgKiBhcyBzdHlsZXNoZWV0IGZyb20gJy4vdXRpbHMvc3R5bGVzaGVldC5qcyc7XG5pbXBvcnQgQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50JztcbmltcG9ydCBFdmVudFRhcmdldCBmcm9tICcuL2V2ZW50LXRhcmdldCc7XG5pbXBvcnQgKiBhcyBFdmVudHMgZnJvbSAnLi91dGlscy9ldmVudHMuanMnO1xuaW1wb3J0IFBsYXllciBmcm9tICcuL3BsYXllcic7XG5pbXBvcnQgcGx1Z2luIGZyb20gJy4vcGx1Z2lucy5qcyc7XG5pbXBvcnQgbWVyZ2VPcHRpb25zIGZyb20gJy4uLy4uL3NyYy9qcy91dGlscy9tZXJnZS1vcHRpb25zLmpzJztcbmltcG9ydCAqIGFzIEZuIGZyb20gJy4vdXRpbHMvZm4uanMnO1xuaW1wb3J0IFRleHRUcmFjayBmcm9tICcuL3RyYWNrcy90ZXh0LXRyYWNrLmpzJztcbmltcG9ydCBBdWRpb1RyYWNrIGZyb20gJy4vdHJhY2tzL2F1ZGlvLXRyYWNrLmpzJztcbmltcG9ydCBWaWRlb1RyYWNrIGZyb20gJy4vdHJhY2tzL3ZpZGVvLXRyYWNrLmpzJztcblxuaW1wb3J0IGFzc2lnbiBmcm9tICdvYmplY3QuYXNzaWduJztcbmltcG9ydCB7IGNyZWF0ZVRpbWVSYW5nZXMgfSBmcm9tICcuL3V0aWxzL3RpbWUtcmFuZ2VzLmpzJztcbmltcG9ydCBmb3JtYXRUaW1lIGZyb20gJy4vdXRpbHMvZm9ybWF0LXRpbWUuanMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQgKiBhcyBEb20gZnJvbSAnLi91dGlscy9kb20uanMnO1xuaW1wb3J0ICogYXMgYnJvd3NlciBmcm9tICcuL3V0aWxzL2Jyb3dzZXIuanMnO1xuaW1wb3J0ICogYXMgVXJsIGZyb20gJy4vdXRpbHMvdXJsLmpzJztcbmltcG9ydCBleHRlbmRGbiBmcm9tICcuL2V4dGVuZC5qcyc7XG5pbXBvcnQgbWVyZ2UgZnJvbSAnbG9kYXNoLWNvbXBhdC9vYmplY3QvbWVyZ2UnO1xuaW1wb3J0IGNyZWF0ZURlcHJlY2F0aW9uUHJveHkgZnJvbSAnLi91dGlscy9jcmVhdGUtZGVwcmVjYXRpb24tcHJveHkuanMnO1xuaW1wb3J0IHhociBmcm9tICd4aHInO1xuXG4vLyBJbmNsdWRlIHRoZSBidWlsdC1pbiB0ZWNoc1xuaW1wb3J0IFRlY2ggZnJvbSAnLi90ZWNoL3RlY2guanMnO1xuaW1wb3J0IEh0bWw1IGZyb20gJy4vdGVjaC9odG1sNS5qcyc7XG5pbXBvcnQgRmxhc2ggZnJvbSAnLi90ZWNoL2ZsYXNoLmpzJztcblxuLy8gSFRNTDUgRWxlbWVudCBTaGltIGZvciBJRThcbmlmICh0eXBlb2YgSFRNTFZpZGVvRWxlbWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmlkZW8nKTtcbiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYXVkaW8nKTtcbiAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHJhY2snKTtcbn1cblxuLyoqXG4gKiBEb3VibGVzIGFzIHRoZSBtYWluIGZ1bmN0aW9uIGZvciB1c2VycyB0byBjcmVhdGUgYSBwbGF5ZXIgaW5zdGFuY2UgYW5kIGFsc29cbiAqIHRoZSBtYWluIGxpYnJhcnkgb2JqZWN0LlxuICogVGhlIGB2aWRlb2pzYCBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpbml0aWFsaXplIG9yIHJldHJpZXZlIGEgcGxheWVyLlxuICogYGBganNcbiAqICAgICB2YXIgbXlQbGF5ZXIgPSB2aWRlb2pzKCdteV92aWRlb19pZCcpO1xuICogYGBgXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfEVsZW1lbnR9IGlkICAgICAgVmlkZW8gZWxlbWVudCBvciB2aWRlbyBlbGVtZW50IElEXG4gKiBAcGFyYW0gIHtPYmplY3Q9fSBvcHRpb25zICAgICAgICBPcHRpb25hbCBvcHRpb25zIG9iamVjdCBmb3IgY29uZmlnL3NldHRpbmdzXG4gKiBAcGFyYW0gIHtGdW5jdGlvbj19IHJlYWR5ICAgICAgICBPcHRpb25hbCByZWFkeSBjYWxsYmFja1xuICogQHJldHVybiB7UGxheWVyfSAgICAgICAgICAgICAgICAgQSBwbGF5ZXIgaW5zdGFuY2VcbiAqIEBtaXhlcyB2aWRlb2pzXG4gKiBAbWV0aG9kIHZpZGVvanNcbiAqL1xubGV0IHZpZGVvanMgPSBmdW5jdGlvbihpZCwgb3B0aW9ucywgcmVhZHkpe1xuICBsZXQgdGFnOyAvLyBFbGVtZW50IG9mIElEXG5cbiAgLy8gQWxsb3cgZm9yIGVsZW1lbnQgb3IgSUQgdG8gYmUgcGFzc2VkIGluXG4gIC8vIFN0cmluZyBJRFxuICBpZiAodHlwZW9mIGlkID09PSAnc3RyaW5nJykge1xuXG4gICAgLy8gQWRqdXN0IGZvciBqUXVlcnkgSUQgc3ludGF4XG4gICAgaWYgKGlkLmluZGV4T2YoJyMnKSA9PT0gMCkge1xuICAgICAgaWQgPSBpZC5zbGljZSgxKTtcbiAgICB9XG5cbiAgICAvLyBJZiBhIHBsYXllciBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgZm9yIHRoaXMgSUQgcmV0dXJuIGl0LlxuICAgIGlmICh2aWRlb2pzLmdldFBsYXllcnMoKVtpZF0pIHtcblxuICAgICAgLy8gSWYgb3B0aW9ucyBvciByZWFkeSBmdW50aW9uIGFyZSBwYXNzZWQsIHdhcm5cbiAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgIGxvZy53YXJuKGBQbGF5ZXIgXCIke2lkfVwiIGlzIGFscmVhZHkgaW5pdGlhbGlzZWQuIE9wdGlvbnMgd2lsbCBub3QgYmUgYXBwbGllZC5gKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlYWR5KSB7XG4gICAgICAgIHZpZGVvanMuZ2V0UGxheWVycygpW2lkXS5yZWFkeShyZWFkeSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB2aWRlb2pzLmdldFBsYXllcnMoKVtpZF07XG5cbiAgICAvLyBPdGhlcndpc2UgZ2V0IGVsZW1lbnQgZm9yIElEXG4gICAgfSBlbHNlIHtcbiAgICAgIHRhZyA9IERvbS5nZXRFbChpZCk7XG4gICAgfVxuXG4gIC8vIElEIGlzIGEgbWVkaWEgZWxlbWVudFxuICB9IGVsc2Uge1xuICAgIHRhZyA9IGlkO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGEgdXNlYWJsZSBlbGVtZW50XG4gIGlmICghdGFnIHx8ICF0YWcubm9kZU5hbWUpIHsgLy8gcmU6IG5vZGVOYW1lLCBjb3VsZCBiZSBhIGJveCBkaXYgYWxzb1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBlbGVtZW50IG9yIElEIHN1cHBsaWVkIGlzIG5vdCB2YWxpZC4gKHZpZGVvanMpJyk7IC8vIFJldHVybnNcbiAgfVxuXG4gIC8vIEVsZW1lbnQgbWF5IGhhdmUgYSBwbGF5ZXIgYXR0ciByZWZlcnJpbmcgdG8gYW4gYWxyZWFkeSBjcmVhdGVkIHBsYXllciBpbnN0YW5jZS5cbiAgLy8gSWYgbm90LCBzZXQgdXAgYSBuZXcgcGxheWVyIGFuZCByZXR1cm4gdGhlIGluc3RhbmNlLlxuICByZXR1cm4gdGFnWydwbGF5ZXInXSB8fCBQbGF5ZXIucGxheWVyc1t0YWcucGxheWVySWRdIHx8IG5ldyBQbGF5ZXIodGFnLCBvcHRpb25zLCByZWFkeSk7XG59O1xuXG4vLyBBZGQgZGVmYXVsdCBzdHlsZXNcbmlmICh3aW5kb3cuVklERU9KU19OT19EWU5BTUlDX1NUWUxFICE9PSB0cnVlKSB7XG4gIGxldCBzdHlsZSA9IERvbS4kKCcudmpzLXN0eWxlcy1kZWZhdWx0cycpO1xuXG4gIGlmICghc3R5bGUpIHtcbiAgICBzdHlsZSA9IHN0eWxlc2hlZXQuY3JlYXRlU3R5bGVFbGVtZW50KCd2anMtc3R5bGVzLWRlZmF1bHRzJyk7XG4gICAgbGV0IGhlYWQgPSBEb20uJCgnaGVhZCcpO1xuICAgIGhlYWQuaW5zZXJ0QmVmb3JlKHN0eWxlLCBoZWFkLmZpcnN0Q2hpbGQpO1xuICAgIHN0eWxlc2hlZXQuc2V0VGV4dENvbnRlbnQoc3R5bGUsIGBcbiAgICAgIC52aWRlby1qcyB7XG4gICAgICAgIHdpZHRoOiAzMDBweDtcbiAgICAgICAgaGVpZ2h0OiAxNTBweDtcbiAgICAgIH1cblxuICAgICAgLnZqcy1mbHVpZCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiA1Ni4yNSVcbiAgICAgIH1cbiAgICBgKTtcbiAgfVxufVxuXG4vLyBSdW4gQXV0by1sb2FkIHBsYXllcnNcbi8vIFlvdSBoYXZlIHRvIHdhaXQgYXQgbGVhc3Qgb25jZSBpbiBjYXNlIHRoaXMgc2NyaXB0IGlzIGxvYWRlZCBhZnRlciB5b3VyIHZpZGVvIGluIHRoZSBET00gKHdlaXJkIGJlaGF2aW9yIG9ubHkgd2l0aCBtaW5pZmllZCB2ZXJzaW9uKVxuc2V0dXAuYXV0b1NldHVwVGltZW91dCgxLCB2aWRlb2pzKTtcblxuLypcbiAqIEN1cnJlbnQgc29mdHdhcmUgdmVyc2lvbiAoc2VtdmVyKVxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbnZpZGVvanMuVkVSU0lPTiA9ICdfX1ZFUlNJT05fXyc7XG5cbi8qKlxuICogSW5kaWNhdGVzIGl0J3MgdGhlIEhvbGEgdmVyc2lvbiBvZiB2aWRlby5qc1xuICpcbiAqIEB0eXBlIHtib29sZWFufVxuICovXG52aWRlb2pzLkhPTEFfVkVSU0lPTiA9IHRydWU7XG5cbi8qKlxuICogVGhlIGdsb2JhbCBvcHRpb25zIG9iamVjdC4gVGhlc2UgYXJlIHRoZSBzZXR0aW5ncyB0aGF0IHRha2UgZWZmZWN0XG4gKiBpZiBubyBvdmVycmlkZXMgYXJlIHNwZWNpZmllZCB3aGVuIHRoZSBwbGF5ZXIgaXMgY3JlYXRlZC5cbiAqXG4gKiBgYGBqc1xuICogICAgIHZpZGVvanMub3B0aW9ucy5hdXRvcGxheSA9IHRydWVcbiAqICAgICAvLyAtPiBhbGwgcGxheWVycyB3aWxsIGF1dG9wbGF5IGJ5IGRlZmF1bHRcbiAqIGBgYFxuICpcbiAqIEB0eXBlIHtPYmplY3R9XG4gKi9cbnZpZGVvanMub3B0aW9ucyA9IFBsYXllci5wcm90b3R5cGUub3B0aW9uc187XG5cbi8qKlxuICogR2V0IGFuIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50bHkgY3JlYXRlZCBwbGF5ZXJzLCBrZXllZCBieSBwbGF5ZXIgSURcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBjcmVhdGVkIHBsYXllcnNcbiAqIEBtaXhlcyB2aWRlb2pzXG4gKiBAbWV0aG9kIGdldFBsYXllcnNcbiAqL1xudmlkZW9qcy5nZXRQbGF5ZXJzID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiBQbGF5ZXIucGxheWVycztcbn07XG5cbi8qKlxuICogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIGV4cG9zZSBwbGF5ZXJzIG9iamVjdC5cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQG1lbWJlck9mIHZpZGVvanNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fFByb3h5fSBwbGF5ZXJzXG4gKi9cbnZpZGVvanMucGxheWVycyA9IGNyZWF0ZURlcHJlY2F0aW9uUHJveHkoUGxheWVyLnBsYXllcnMsIHtcbiAgZ2V0OiAnQWNjZXNzIHRvIHZpZGVvanMucGxheWVycyBpcyBkZXByZWNhdGVkOyB1c2UgdmlkZW9qcy5nZXRQbGF5ZXJzIGluc3RlYWQnLFxuICBzZXQ6ICdNb2RpZmljYXRpb24gb2YgdmlkZW9qcy5wbGF5ZXJzIGlzIGRlcHJlY2F0ZWQnXG59KTtcblxuLyoqXG4gKiBHZXQgYSBjb21wb25lbnQgY2xhc3Mgb2JqZWN0IGJ5IG5hbWVcbiAqIGBgYGpzXG4gKiAgICAgdmFyIFZqc0J1dHRvbiA9IHZpZGVvanMuZ2V0Q29tcG9uZW50KCdCdXR0b24nKTtcbiAqICAgICAvLyBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudFxuICogICAgIHZhciBteUJ1dHRvbiA9IG5ldyBWanNCdXR0b24obXlQbGF5ZXIpO1xuICogYGBgXG4gKlxuICogQHJldHVybiB7Q29tcG9uZW50fSBDb21wb25lbnQgaWRlbnRpZmllZCBieSBuYW1lXG4gKiBAbWl4ZXMgdmlkZW9qc1xuICogQG1ldGhvZCBnZXRDb21wb25lbnRcbiAqL1xudmlkZW9qcy5nZXRDb21wb25lbnQgPSBDb21wb25lbnQuZ2V0Q29tcG9uZW50O1xuXG4vKipcbiAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IHNvIGl0IGNhbiByZWZlcnJlZCB0byBieSBuYW1lXG4gKiBVc2VkIHdoZW4gYWRkaW5nIHRvIG90aGVyXG4gKiBjb21wb25lbnRzLCBlaXRoZXIgdGhyb3VnaCBhZGRDaGlsZFxuICogYGNvbXBvbmVudC5hZGRDaGlsZCgnbXlDb21wb25lbnQnKWBcbiAqIG9yIHRocm91Z2ggZGVmYXVsdCBjaGlsZHJlbiBvcHRpb25zXG4gKiBgeyBjaGlsZHJlbjogWydteUNvbXBvbmVudCddIH1gLlxuICogYGBganNcbiAqICAgICAvLyBHZXQgYSBjb21wb25lbnQgdG8gc3ViY2xhc3NcbiAqICAgICB2YXIgVmpzQnV0dG9uID0gdmlkZW9qcy5nZXRDb21wb25lbnQoJ0J1dHRvbicpO1xuICogICAgIC8vIFN1YmNsYXNzIHRoZSBjb21wb25lbnQgKHNlZSAnZXh0ZW5kJyBkb2MgZm9yIG1vcmUgaW5mbylcbiAqICAgICB2YXIgTXlTcGVjaWFsQnV0dG9uID0gdmlkZW9qcy5leHRlbmQoVmpzQnV0dG9uLCB7fSk7XG4gKiAgICAgLy8gUmVnaXN0ZXIgdGhlIG5ldyBjb21wb25lbnRcbiAqICAgICBWanNCdXR0b24ucmVnaXN0ZXJDb21wb25lbnQoJ015U2VwY2lhbEJ1dHRvbicsIE15U2VwY2lhbEJ1dHRvbik7XG4gKiAgICAgLy8gKG9wdGlvbmFsbHkpIGFkZCB0aGUgbmV3IGNvbXBvbmVudCBhcyBhIGRlZmF1bHQgcGxheWVyIGNoaWxkXG4gKiAgICAgbXlQbGF5ZXIuYWRkQ2hpbGQoJ015U2VwY2lhbEJ1dHRvbicpO1xuICogYGBgXG4gKiBOT1RFOiBZb3UgY291bGQgYWxzbyBqdXN0IGluaXRpYWxpemUgdGhlIGNvbXBvbmVudCBiZWZvcmUgYWRkaW5nLlxuICogYGNvbXBvbmVudC5hZGRDaGlsZChuZXcgTXlDb21wb25lbnQoKSk7YFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgY29tcG9uZW50XG4gKiBAcGFyYW0ge0NvbXBvbmVudH0gVGhlIGNvbXBvbmVudCBjbGFzc1xuICogQHJldHVybiB7Q29tcG9uZW50fSBUaGUgbmV3bHkgcmVnaXN0ZXJlZCBjb21wb25lbnRcbiAqIEBtaXhlcyB2aWRlb2pzXG4gKiBAbWV0aG9kIHJlZ2lzdGVyQ29tcG9uZW50XG4gKi9cbnZpZGVvanMucmVnaXN0ZXJDb21wb25lbnQgPSAobmFtZSwgY29tcCkgPT4ge1xuICBpZiAoVGVjaC5pc1RlY2goY29tcCkpIHtcbiAgICBsb2cud2FybihgVGhlICR7bmFtZX0gdGVjaCB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNvbXBvbmVudC4gSXQgc2hvdWxkIGluc3RlYWQgYmUgcmVnaXN0ZXJlZCB1c2luZyB2aWRlb2pzLnJlZ2lzdGVyVGVjaChuYW1lLCB0ZWNoKWApO1xuICB9XG5cbiAgQ29tcG9uZW50LnJlZ2lzdGVyQ29tcG9uZW50LmNhbGwoQ29tcG9uZW50LCBuYW1lLCBjb21wKTtcbn07XG5cbi8qKlxuICogR2V0IGEgVGVjaCBjbGFzcyBvYmplY3QgYnkgbmFtZVxuICogYGBganNcbiAqICAgICB2YXIgSHRtbDUgPSB2aWRlb2pzLmdldFRlY2goJ0h0bWw1Jyk7XG4gKiAgICAgLy8gQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBjb21wb25lbnRcbiAqICAgICB2YXIgaHRtbDUgPSBuZXcgSHRtbDUob3B0aW9ucyk7XG4gKiBgYGBcbiAqXG4gKiBAcmV0dXJuIHtUZWNofSBUZWNoIGlkZW50aWZpZWQgYnkgbmFtZVxuICogQG1peGVzIHZpZGVvanNcbiAqIEBtZXRob2QgZ2V0Q29tcG9uZW50XG4gKi9cbnZpZGVvanMuZ2V0VGVjaCA9IFRlY2guZ2V0VGVjaDtcblxuLyoqXG4gKiBSZWdpc3RlciBhIFRlY2ggc28gaXQgY2FuIHJlZmVycmVkIHRvIGJ5IG5hbWUuXG4gKiBUaGlzIGlzIHVzZWQgaW4gdGhlIHRlY2ggb3JkZXIgZm9yIHRoZSBwbGF5ZXIuXG4gKlxuICogYGBganNcbiAqICAgICAvLyBnZXQgdGhlIEh0bWw1IFRlY2hcbiAqICAgICB2YXIgSHRtbDUgPSB2aWRlb2pzLmdldFRlY2goJ0h0bWw1Jyk7XG4gKiAgICAgdmFyIE15VGVjaCA9IHZpZGVvanMuZXh0ZW5kKEh0bWw1LCB7fSk7XG4gKiAgICAgLy8gUmVnaXN0ZXIgdGhlIG5ldyBUZWNoXG4gKiAgICAgVmpzQnV0dG9uLnJlZ2lzdGVyVGVjaCgnVGVjaCcsIE15VGVjaCk7XG4gKiAgICAgdmFyIHBsYXllciA9IHZpZGVvanMoJ215cGxheWVyJywge1xuICogICAgICAgdGVjaE9yZGVyOiBbJ215VGVjaCcsICdodG1sNSddXG4gKiAgICAgfSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gVGhlIGNsYXNzIG5hbWUgb2YgdGhlIHRlY2hcbiAqIEBwYXJhbSB7VGVjaH0gVGhlIHRlY2ggY2xhc3NcbiAqIEByZXR1cm4ge1RlY2h9IFRoZSBuZXdseSByZWdpc3RlcmVkIFRlY2hcbiAqIEBtaXhlcyB2aWRlb2pzXG4gKiBAbWV0aG9kIHJlZ2lzdGVyVGVjaFxuICovXG52aWRlb2pzLnJlZ2lzdGVyVGVjaCA9IFRlY2gucmVnaXN0ZXJUZWNoO1xuXG4vKipcbiAqIEEgc3VpdGUgb2YgYnJvd3NlciBhbmQgZGV2aWNlIHRlc3RzXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbnZpZGVvanMuYnJvd3NlciA9IGJyb3dzZXI7XG5cbi8qKlxuICogV2hldGhlciBvciBub3QgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdG91Y2ggZXZlbnRzLiBJbmNsdWRlZCBmb3IgYmFja3dhcmRcbiAqIGNvbXBhdGliaWxpdHkgd2l0aCA0LngsIGJ1dCBkZXByZWNhdGVkLiBVc2UgYHZpZGVvanMuYnJvd3Nlci5UT1VDSF9FTkFCTEVEYFxuICogaW5zdGVhZCBnb2luZyBmb3J3YXJkLlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAdHlwZSB7Qm9vbGVhbn1cbiAqL1xudmlkZW9qcy5UT1VDSF9FTkFCTEVEID0gYnJvd3Nlci5UT1VDSF9FTkFCTEVEO1xuXG4vKipcbiAqIFN1YmNsYXNzIGFuIGV4aXN0aW5nIGNsYXNzXG4gKiBNaW1pY3MgRVM2IHN1YmNsYXNzaW5nIHdpdGggdGhlIGBleHRlbmRgIGtleXdvcmRcbiAqIGBgYGpzXG4gKiAgICAgLy8gQ3JlYXRlIGEgYmFzaWMgamF2YXNjcmlwdCAnY2xhc3MnXG4gKiAgICAgZnVuY3Rpb24gTXlDbGFzcyhuYW1lKXtcbiAqICAgICAgIC8vIFNldCBhIHByb3BlcnR5IGF0IGluaXRpYWxpemF0aW9uXG4gKiAgICAgICB0aGlzLm15TmFtZSA9IG5hbWU7XG4gKiAgICAgfVxuICogICAgIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSBtZXRob2RcbiAqICAgICBNeUNsYXNzLnByb3RvdHlwZS5zYXlNeU5hbWUgPSBmdW5jdGlvbigpe1xuICogICAgICAgYWxlcnQodGhpcy5teU5hbWUpO1xuICogICAgIH07XG4gKiAgICAgLy8gU3ViY2xhc3MgdGhlIGV4aXNpdG5nIGNsYXNzIGFuZCBjaGFuZ2UgdGhlIG5hbWVcbiAqICAgICAvLyB3aGVuIGluaXRpYWxpemluZ1xuICogICAgIHZhciBNeVN1YkNsYXNzID0gdmlkZW9qcy5leHRlbmQoTXlDbGFzcywge1xuICogICAgICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAqICAgICAgICAgLy8gQ2FsbCB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBzdWJjbGFzc1xuICogICAgICAgICBNeUNsYXNzLmNhbGwodGhpcywgbmFtZSlcbiAqICAgICAgIH1cbiAqICAgICB9KTtcbiAqICAgICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIG5ldyBzdWIgY2xhc3NcbiAqICAgICB2YXIgbXlJbnN0YW5jZSA9IG5ldyBNeVN1YkNsYXNzKCdKb2huJyk7XG4gKiAgICAgbXlJbnN0YW5jZS5zYXlNeU5hbWUoKTsgLy8gLT4gc2hvdWxkIGFsZXJ0IFwiSm9oblwiXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBUaGUgQ2xhc3MgdG8gc3ViY2xhc3NcbiAqIEBwYXJhbSB7T2JqZWN0fSBBbiBvYmplY3QgaW5jbHVkaW5nIGluc3RhY2UgbWV0aG9kcyBmb3IgdGhlIG5ldyBjbGFzc1xuICogICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSBpbmNsdWRpbmcgYSBgY29uc3RydWN0b3JgIGZ1bmN0aW9uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIG5ld2x5IGNyZWF0ZWQgc3ViY2xhc3NcbiAqIEBtaXhlcyB2aWRlb2pzXG4gKiBAbWV0aG9kIGV4dGVuZFxuICovXG52aWRlb2pzLmV4dGVuZCA9IGV4dGVuZEZuO1xuXG4vKipcbiAqIE1lcmdlIHR3byBvcHRpb25zIG9iamVjdHMgcmVjdXJzaXZlbHlcbiAqIFBlcmZvcm1zIGEgZGVlcCBtZXJnZSBsaWtlIGxvZGFzaC5tZXJnZSBidXQgKipvbmx5IG1lcmdlcyBwbGFpbiBvYmplY3RzKipcbiAqIChub3QgYXJyYXlzLCBlbGVtZW50cywgYW55dGhpbmcgZWxzZSlcbiAqIE90aGVyIHZhbHVlcyB3aWxsIGJlIGNvcGllZCBkaXJlY3RseSBmcm9tIHRoZSBzZWNvbmQgb2JqZWN0LlxuICogYGBganNcbiAqICAgICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7XG4gKiAgICAgICBmb286IHRydWUsXG4gKiAgICAgICBiYXI6IHtcbiAqICAgICAgICAgYTogdHJ1ZSxcbiAqICAgICAgICAgYjogWzEsMiwzXVxuICogICAgICAgfVxuICogICAgIH07XG4gKiAgICAgdmFyIG5ld09wdGlvbnMgPSB7XG4gKiAgICAgICBmb286IGZhbHNlLFxuICogICAgICAgYmFyOiB7XG4gKiAgICAgICAgIGI6IFs0LDUsNl1cbiAqICAgICAgIH1cbiAqICAgICB9O1xuICogICAgIHZhciByZXN1bHQgPSB2aWRlb2pzLm1lcmdlT3B0aW9ucyhkZWZhdWx0T3B0aW9ucywgbmV3T3B0aW9ucyk7XG4gKiAgICAgLy8gcmVzdWx0LmZvbyA9IGZhbHNlO1xuICogICAgIC8vIHJlc3VsdC5iYXIuYSA9IHRydWU7XG4gKiAgICAgLy8gcmVzdWx0LmJhci5iID0gWzQsNSw2XTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBkZWZhdWx0cyAgVGhlIG9wdGlvbnMgb2JqZWN0IHdob3NlIHZhbHVlcyB3aWxsIGJlIG92ZXJyaWRlblxuICogQHBhcmFtIHtPYmplY3R9IG92ZXJyaWRlcyBUaGUgb3B0aW9ucyBvYmplY3Qgd2l0aCB2YWx1ZXMgdG8gb3ZlcnJpZGUgdGhlIGZpcnN0XG4gKiBAcGFyYW0ge09iamVjdH0gZXRjICAgICAgIEFueSBudW1iZXIgb2YgYWRkaXRpb25hbCBvcHRpb25zIG9iamVjdHNcbiAqXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEgbmV3IG9iamVjdCB3aXRoIHRoZSBtZXJnZWQgdmFsdWVzXG4gKiBAbWl4ZXMgdmlkZW9qc1xuICogQG1ldGhvZCBtZXJnZU9wdGlvbnNcbiAqL1xudmlkZW9qcy5tZXJnZU9wdGlvbnMgPSBtZXJnZU9wdGlvbnM7XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBjb250ZXh0ICh0aGlzKSBvZiBhIGZ1bmN0aW9uXG4gKlxuICogICAgIHZpZGVvanMuYmluZChuZXdDb250ZXh0LCBmdW5jdGlvbigpe1xuICogICAgICAgdGhpcyA9PT0gbmV3Q29udGV4dFxuICogICAgIH0pO1xuICpcbiAqIE5PVEU6IGFzIG9mIHY1LjAgd2UgcmVxdWlyZSBhbiBFUzUgc2hpbSwgc28geW91IHNob3VsZCB1c2UgdGhlIG5hdGl2ZVxuICogYGZ1bmN0aW9uKCl7fS5iaW5kKG5ld0NvbnRleHQpO2AgaW5zdGVhZCBvZiB0aGlzLlxuICpcbiAqIEBwYXJhbSAgeyp9ICAgICAgICBjb250ZXh0IFRoZSBvYmplY3QgdG8gYmluZCBhcyBzY29wZVxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuICAgICAgVGhlIGZ1bmN0aW9uIHRvIGJlIGJvdW5kIHRvIGEgc2NvcGVcbiAqIEBwYXJhbSAge051bWJlcj19ICB1aWQgICAgIEFuIG9wdGlvbmFsIHVuaXF1ZSBJRCBmb3IgdGhlIGZ1bmN0aW9uIHRvIGJlIHNldFxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbnZpZGVvanMuYmluZCA9IEZuLmJpbmQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgVmlkZW8uanMgcGxheWVyIHBsdWdpblxuICogUGx1Z2lucyBhcmUgb25seSBpbml0aWFsaXplZCB3aGVuIG9wdGlvbnMgZm9yIHRoZSBwbHVnaW4gYXJlIGluY2x1ZGVkXG4gKiBpbiB0aGUgcGxheWVyIG9wdGlvbnMsIG9yIHRoZSBwbHVnaW4gZnVuY3Rpb24gb24gdGhlIHBsYXllciBpbnN0YW5jZSBpc1xuICogY2FsbGVkLlxuICogKipTZWUgdGhlIHBsdWdpbiBndWlkZSBpbiB0aGUgZG9jcyBmb3IgYSBtb3JlIGRldGFpbGVkIGV4YW1wbGUqKlxuICogYGBganNcbiAqICAgICAvLyBNYWtlIGEgcGx1Z2luIHRoYXQgYWxlcnRzIHdoZW4gdGhlIHBsYXllciBwbGF5c1xuICogICAgIHZpZGVvanMucGx1Z2luKCdteVBsdWdpbicsIGZ1bmN0aW9uKG15UGx1Z2luT3B0aW9ucykge1xuICogICAgICAgbXlQbHVnaW5PcHRpb25zID0gbXlQbHVnaW5PcHRpb25zIHx8IHt9O1xuICpcbiAqICAgICAgIHZhciBwbGF5ZXIgPSB0aGlzO1xuICogICAgICAgdmFyIGFsZXJ0VGV4dCA9IG15UGx1Z2luT3B0aW9ucy50ZXh0IHx8ICdQbGF5ZXIgaXMgcGxheWluZyEnXG4gKlxuICogICAgICAgcGxheWVyLm9uKCdwbGF5JywgZnVuY3Rpb24oKXtcbiAqICAgICAgICAgYWxlcnQoYWxlcnRUZXh0KTtcbiAqICAgICAgIH0pO1xuICogICAgIH0pO1xuICogICAgIC8vIFVTQUdFIEVYQU1QTEVTXG4gKiAgICAgLy8gRVhBTVBMRSAxOiBOZXcgcGxheWVyIHdpdGggcGx1Z2luIG9wdGlvbnMsIGNhbGwgcGx1Z2luIGltbWVkaWF0ZWx5XG4gKiAgICAgdmFyIHBsYXllcjEgPSB2aWRlb2pzKCdpZE9uZScsIHtcbiAqICAgICAgIG15UGx1Z2luOiB7XG4gKiAgICAgICAgIHRleHQ6ICdDdXN0b20gdGV4dCEnXG4gKiAgICAgICB9XG4gKiAgICAgfSk7XG4gKiAgICAgLy8gQ2xpY2sgcGxheVxuICogICAgIC8vIC0tPiBTaG91bGQgYWxlcnQgJ0N1c3RvbSB0ZXh0ISdcbiAqICAgICAvLyBFWEFNUExFIDM6IE5ldyBwbGF5ZXIsIGluaXRpYWxpemUgcGx1Z2luIGxhdGVyXG4gKiAgICAgdmFyIHBsYXllcjMgPSB2aWRlb2pzKCdpZFRocmVlJyk7XG4gKiAgICAgLy8gQ2xpY2sgcGxheVxuICogICAgIC8vIC0tPiBOTyBBTEVSVFxuICogICAgIC8vIENsaWNrIHBhdXNlXG4gKiAgICAgLy8gSW5pdGlhbGl6ZSBwbHVnaW4gdXNpbmcgdGhlIHBsdWdpbiBmdW5jdGlvbiBvbiB0aGUgcGxheWVyIGluc3RhbmNlXG4gKiAgICAgcGxheWVyMy5teVBsdWdpbih7XG4gKiAgICAgICB0ZXh0OiAnUGx1Z2luIGFkZGVkIGxhdGVyISdcbiAqICAgICB9KTtcbiAqICAgICAvLyBDbGljayBwbGF5XG4gKiAgICAgLy8gLS0+IFNob3VsZCBhbGVydCAnUGx1Z2luIGFkZGVkIGxhdGVyISdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIFRoZSBwbHVnaW4gbmFtZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIHBsdWdpbiBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIHdpdGggb3B0aW9uc1xuICogQG1peGVzIHZpZGVvanNcbiAqIEBtZXRob2QgcGx1Z2luXG4gKi9cbnZpZGVvanMucGx1Z2luID0gcGx1Z2luO1xuXG4vKipcbiAqIEFkZGluZyBsYW5ndWFnZXMgc28gdGhhdCB0aGV5J3JlIGF2YWlsYWJsZSB0byBhbGwgcGxheWVycy5cbiAqIGBgYGpzXG4gKiAgICAgdmlkZW9qcy5hZGRMYW5ndWFnZSgnZXMnLCB7ICdIZWxsbyc6ICdIb2xhJyB9KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSAge1N0cmluZ30gY29kZSBUaGUgbGFuZ3VhZ2UgY29kZSBvciBkaWN0aW9uYXJ5IHByb3BlcnR5XG4gKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgVGhlIGRhdGEgdmFsdWVzIHRvIGJlIHRyYW5zbGF0ZWRcbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyBsYW5ndWFnZSBkaWN0aW9uYXJ5IG9iamVjdFxuICogQG1peGVzIHZpZGVvanNcbiAqIEBtZXRob2QgYWRkTGFuZ3VhZ2VcbiAqL1xudmlkZW9qcy5hZGRMYW5ndWFnZSA9IGZ1bmN0aW9uKGNvZGUsIGRhdGEpe1xuICBjb2RlID0gKCcnICsgY29kZSkudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIG1lcmdlKHZpZGVvanMub3B0aW9ucy5sYW5ndWFnZXMsIHsgW2NvZGVdOiBkYXRhIH0pW2NvZGVdO1xufTtcblxuLyoqXG4gKiBMb2cgZGVidWcgbWVzc2FnZXMuXG4gKlxuICogQHBhcmFtIHsuLi5PYmplY3R9IG1lc3NhZ2VzIE9uZSBvciBtb3JlIG1lc3NhZ2VzIHRvIGxvZ1xuICovXG52aWRlb2pzLmxvZyA9IGxvZztcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVtdWxhdGVkIFRpbWVSYW5nZSBvYmplY3QuXG4gKlxuICogQHBhcmFtICB7TnVtYmVyfEFycmF5fSBzdGFydCBTdGFydCB0aW1lIGluIHNlY29uZHMgb3IgYW4gYXJyYXkgb2YgcmFuZ2VzXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGVuZCAgIEVuZCB0aW1lIGluIHNlY29uZHNcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgRmFrZSBUaW1lUmFuZ2Ugb2JqZWN0XG4gKiBAbWV0aG9kIGNyZWF0ZVRpbWVSYW5nZVxuICovXG52aWRlb2pzLmNyZWF0ZVRpbWVSYW5nZSA9IHZpZGVvanMuY3JlYXRlVGltZVJhbmdlcyA9IGNyZWF0ZVRpbWVSYW5nZXM7XG5cbi8qKlxuICogRm9ybWF0IHNlY29uZHMgYXMgYSB0aW1lIHN0cmluZywgSDpNTTpTUyBvciBNOlNTXG4gKiBTdXBwbHlpbmcgYSBndWlkZSAoaW4gc2Vjb25kcykgd2lsbCBmb3JjZSBhIG51bWJlciBvZiBsZWFkaW5nIHplcm9zXG4gKiB0byBjb3ZlciB0aGUgbGVuZ3RoIG9mIHRoZSBndWlkZVxuICpcbiAqIEBwYXJhbSAge051bWJlcn0gc2Vjb25kcyBOdW1iZXIgb2Ygc2Vjb25kcyB0byBiZSB0dXJuZWQgaW50byBhIHN0cmluZ1xuICogQHBhcmFtICB7TnVtYmVyfSBndWlkZSAgIE51bWJlciAoaW4gc2Vjb25kcykgdG8gbW9kZWwgdGhlIHN0cmluZyBhZnRlclxuICogQHJldHVybiB7U3RyaW5nfSAgICAgICAgIFRpbWUgZm9ybWF0dGVkIGFzIEg6TU06U1Mgb3IgTTpTU1xuICogQG1ldGhvZCBmb3JtYXRUaW1lXG4gKi9cbnZpZGVvanMuZm9ybWF0VGltZSA9IGZvcm1hdFRpbWU7XG5cbi8qKlxuICogUmVzb2x2ZSBhbmQgcGFyc2UgdGhlIGVsZW1lbnRzIG9mIGEgVVJMXG4gKlxuICogQHBhcmFtICB7U3RyaW5nfSB1cmwgVGhlIHVybCB0byBwYXJzZVxuICogQHJldHVybiB7T2JqZWN0fSAgICAgQW4gb2JqZWN0IG9mIHVybCBkZXRhaWxzXG4gKiBAbWV0aG9kIHBhcnNlVXJsXG4gKi9cbnZpZGVvanMucGFyc2VVcmwgPSBVcmwucGFyc2VVcmw7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIHRoZSB1cmwgcGFzc2VkIGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgVGhlIHVybCB0byBjaGVja1xuICogQHJldHVybiB7Qm9vbGVhbn0gICBXaGV0aGVyIGl0IGlzIGEgY3Jvc3MgZG9tYWluIHJlcXVlc3Qgb3Igbm90XG4gKiBAbWV0aG9kIGlzQ3Jvc3NPcmlnaW5cbiAqL1xudmlkZW9qcy5pc0Nyb3NzT3JpZ2luID0gVXJsLmlzQ3Jvc3NPcmlnaW47XG5cbi8qKlxuICogRXZlbnQgdGFyZ2V0IGNsYXNzLlxuICpcbiAqIEB0eXBlIHtGdW5jdGlvbn1cbiAqL1xudmlkZW9qcy5FdmVudFRhcmdldCA9IEV2ZW50VGFyZ2V0O1xuXG4vKipcbiAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0byBlbGVtZW50XG4gKiBJdCBzdG9yZXMgdGhlIGhhbmRsZXIgZnVuY3Rpb24gaW4gYSBzZXBhcmF0ZSBjYWNoZSBvYmplY3RcbiAqIGFuZCBhZGRzIGEgZ2VuZXJpYyBoYW5kbGVyIHRvIHRoZSBlbGVtZW50J3MgZXZlbnQsXG4gKiBhbG9uZyB3aXRoIGEgdW5pcXVlIGlkIChndWlkKSB0byB0aGUgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fE9iamVjdH0gICBlbGVtIEVsZW1lbnQgb3Igb2JqZWN0IHRvIGJpbmQgbGlzdGVuZXJzIHRvXG4gKiBAcGFyYW0gIHtTdHJpbmd8QXJyYXl9ICAgdHlwZSBUeXBlIG9mIGV2ZW50IHRvIGJpbmQgdG8uXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICBFdmVudCBsaXN0ZW5lci5cbiAqIEBtZXRob2Qgb25cbiAqL1xudmlkZW9qcy5vbiA9IEV2ZW50cy5vbjtcblxuLyoqXG4gKiBUcmlnZ2VyIGEgbGlzdGVuZXIgb25seSBvbmNlIGZvciBhbiBldmVudFxuICpcbiAqIEBwYXJhbSAge0VsZW1lbnR8T2JqZWN0fSAgIGVsZW0gRWxlbWVudCBvciBvYmplY3QgdG9cbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheX0gICB0eXBlIE5hbWUvdHlwZSBvZiBldmVudFxuICogQHBhcmFtICB7RnVuY3Rpb259IGZuIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAqIEBtZXRob2Qgb25lXG4gKi9cbnZpZGVvanMub25lID0gRXZlbnRzLm9uZTtcblxuLyoqXG4gKiBSZW1vdmVzIGV2ZW50IGxpc3RlbmVycyBmcm9tIGFuIGVsZW1lbnRcbiAqXG4gKiBAcGFyYW0gIHtFbGVtZW50fE9iamVjdH0gICBlbGVtIE9iamVjdCB0byByZW1vdmUgbGlzdGVuZXJzIGZyb21cbiAqIEBwYXJhbSAge1N0cmluZ3xBcnJheT19ICAgdHlwZSBUeXBlIG9mIGxpc3RlbmVyIHRvIHJlbW92ZS4gRG9uJ3QgaW5jbHVkZSB0byByZW1vdmUgYWxsIGV2ZW50cyBmcm9tIGVsZW1lbnQuXG4gKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gICBTcGVjaWZpYyBsaXN0ZW5lciB0byByZW1vdmUuIERvbid0IGluY2x1ZGUgdG8gcmVtb3ZlIGxpc3RlbmVycyBmb3IgYW4gZXZlbnQgdHlwZS5cbiAqIEBtZXRob2Qgb2ZmXG4gKi9cbnZpZGVvanMub2ZmID0gRXZlbnRzLm9mZjtcblxuLyoqXG4gKiBUcmlnZ2VyIGFuIGV2ZW50IGZvciBhbiBlbGVtZW50XG4gKlxuICogQHBhcmFtICB7RWxlbWVudHxPYmplY3R9ICAgICAgZWxlbSAgRWxlbWVudCB0byB0cmlnZ2VyIGFuIGV2ZW50IG9uXG4gKiBAcGFyYW0gIHtFdmVudHxPYmplY3R8U3RyaW5nfSBldmVudCBBIHN0cmluZyAodGhlIHR5cGUpIG9yIGFuIGV2ZW50IG9iamVjdCB3aXRoIGEgdHlwZSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSAge09iamVjdH0gW2hhc2hdIGRhdGEgaGFzaCB0byBwYXNzIGFsb25nIHdpdGggdGhlIGV2ZW50XG4gKiBAcmV0dXJuIHtCb29sZWFuPX0gUmV0dXJuZWQgb25seSBpZiBkZWZhdWx0IHdhcyBwcmV2ZW50ZWRcbiAqIEBtZXRob2QgdHJpZ2dlclxuICovXG52aWRlb2pzLnRyaWdnZXIgPSBFdmVudHMudHJpZ2dlcjtcblxuLyoqXG4gKiBBIGNyb3NzLWJyb3dzZXIgWE1MSHR0cFJlcXVlc3Qgd3JhcHBlci4gSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGU6XG4gKlxuICogICAgIHZpZGVvanMueGhyKHtcbiAqICAgICAgIGJvZHk6IHNvbWVKU09OU3RyaW5nLFxuICogICAgICAgdXJpOiBcIi9mb29cIixcbiAqICAgICAgIGhlYWRlcnM6IHtcbiAqICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAqICAgICAgIH1cbiAqICAgICB9LCBmdW5jdGlvbiAoZXJyLCByZXNwLCBib2R5KSB7XG4gKiAgICAgICAvLyBjaGVjayByZXNwLnN0YXR1c0NvZGVcbiAqICAgICB9KTtcbiAqXG4gKiBDaGVjayBvdXQgdGhlIFtmdWxsXG4gKiBkb2N1bWVudGF0aW9uXShodHRwczovL2dpdGh1Yi5jb20vUmF5bm9zL3hoci9ibG9iL3YyLjEuMC9SRUFETUUubWQpXG4gKiBmb3IgbW9yZSBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHNldHRpbmdzIGZvciB0aGUgcmVxdWVzdC5cbiAqIEByZXR1cm4ge1hNTEh0dHBSZXF1ZXN0fFhEb21haW5SZXF1ZXN0fSB0aGUgcmVxdWVzdCBvYmplY3QuXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9SYXlub3MveGhyXG4gKi9cbnZpZGVvanMueGhyID0geGhyO1xuXG4vKipcbiAqIFRleHRUcmFjayBjbGFzc1xuICpcbiAqIEB0eXBlIHtGdW5jdGlvbn1cbiAqL1xudmlkZW9qcy5UZXh0VHJhY2sgPSBUZXh0VHJhY2s7XG5cbi8qKlxuICogZXhwb3J0IHRoZSBBdWRpb1RyYWNrIGNsYXNzIHNvIHRoYXQgc291cmNlIGhhbmRsZXJzIGNhbiBjcmVhdGVcbiAqIEF1ZGlvVHJhY2tzIGFuZCB0aGVuIGFkZCB0aGVtIHRvIHRoZSBwbGF5ZXJzIEF1ZGlvVHJhY2tMaXN0XG4gKlxuICogQHR5cGUge0Z1bmN0aW9ufVxuICovXG52aWRlb2pzLkF1ZGlvVHJhY2sgPSBBdWRpb1RyYWNrO1xuXG4vKipcbiAqIGV4cG9ydCB0aGUgVmlkZW9UcmFjayBjbGFzcyBzbyB0aGF0IHNvdXJjZSBoYW5kbGVycyBjYW4gY3JlYXRlXG4gKiBWaWRlb1RyYWNrcyBhbmQgdGhlbiBhZGQgdGhlbSB0byB0aGUgcGxheWVycyBWaWRlb1RyYWNrTGlzdFxuICpcbiAqIEB0eXBlIHtGdW5jdGlvbn1cbiAqL1xudmlkZW9qcy5WaWRlb1RyYWNrID0gVmlkZW9UcmFjaztcblxuLyoqXG4gKiBEZXRlcm1pbmVzLCB2aWEgZHVjayB0eXBpbmcsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgaXMgYSBET00gZWxlbWVudC5cbiAqXG4gKiBAbWV0aG9kIGlzRWxcbiAqIEBwYXJhbSAge01peGVkfSB2YWx1ZVxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xudmlkZW9qcy5pc0VsID0gRG9tLmlzRWw7XG5cbi8qKlxuICogRGV0ZXJtaW5lcywgdmlhIGR1Y2sgdHlwaW5nLCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIGlzIGEgdGV4dCBub2RlLlxuICpcbiAqIEBtZXRob2QgaXNUZXh0Tm9kZVxuICogQHBhcmFtICB7TWl4ZWR9IHZhbHVlXG4gKiBAcmV0dXJuIHtCb29sZWFufVxuICovXG52aWRlb2pzLmlzVGV4dE5vZGUgPSBEb20uaXNUZXh0Tm9kZTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIGVsZW1lbnQgYW5kIGFwcGxpZXMgcHJvcGVydGllcy5cbiAqXG4gKiBAbWV0aG9kIGNyZWF0ZUVsXG4gKiBAcGFyYW0gIHtTdHJpbmd9IFt0YWdOYW1lPSdkaXYnXSBOYW1lIG9mIHRhZyB0byBiZSBjcmVhdGVkLlxuICogQHBhcmFtICB7T2JqZWN0fSBbcHJvcGVydGllcz17fV0gRWxlbWVudCBwcm9wZXJ0aWVzIHRvIGJlIGFwcGxpZWQuXG4gKiBAcGFyYW0gIHtPYmplY3R9IFthdHRyaWJ1dGVzPXt9XSBFbGVtZW50IGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZC5cbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbnZpZGVvanMuY3JlYXRlRWwgPSBEb20uY3JlYXRlRWw7XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqXG4gKiBAbWV0aG9kIGhhc0NsYXNzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgRWxlbWVudCB0byBjaGVja1xuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9DaGVjayBDbGFzc25hbWUgdG8gY2hlY2tcbiAqL1xudmlkZW9qcy5oYXNDbGFzcyA9IERvbS5oYXNFbENsYXNzO1xuXG4vKipcbiAqIEFkZCBhIENTUyBjbGFzcyBuYW1lIHRvIGFuIGVsZW1lbnRcbiAqXG4gKiBAbWV0aG9kIGFkZENsYXNzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgICAgRWxlbWVudCB0byBhZGQgY2xhc3MgbmFtZSB0b1xuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9BZGQgQ2xhc3NuYW1lIHRvIGFkZFxuICovXG52aWRlb2pzLmFkZENsYXNzID0gRG9tLmFkZEVsQ2xhc3M7XG5cbi8qKlxuICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG5hbWUgZnJvbSBhbiBlbGVtZW50XG4gKlxuICogQG1ldGhvZCByZW1vdmVDbGFzc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50ICAgIEVsZW1lbnQgdG8gcmVtb3ZlIGZyb20gY2xhc3MgbmFtZVxuICogQHBhcmFtIHtTdHJpbmd9IGNsYXNzVG9SZW1vdmUgQ2xhc3NuYW1lIHRvIHJlbW92ZVxuICovXG52aWRlb2pzLnJlbW92ZUNsYXNzID0gRG9tLnJlbW92ZUVsQ2xhc3M7XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIGEgQ1NTIGNsYXNzIG5hbWUgb24gYW4gZWxlbWVudCBkZXBlbmRpbmcgb24gYW4gb3B0aW9uYWxcbiAqIGNvbmRpdGlvbiBvciB0aGUgcHJlc2VuY2UvYWJzZW5jZSBvZiB0aGUgY2xhc3MgbmFtZS5cbiAqXG4gKiBAbWV0aG9kIHRvZ2dsZUVsQ2xhc3NcbiAqIEBwYXJhbSAge0VsZW1lbnR9IGVsZW1lbnRcbiAqIEBwYXJhbSAge1N0cmluZ30gY2xhc3NUb1RvZ2dsZVxuICogQHBhcmFtICB7Qm9vbGVhbnxGdW5jdGlvbn0gW3ByZWRpY2F0ZV1cbiAqICAgICAgICAgQ2FuIGJlIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgQm9vbGVhbi4gSWYgYHRydWVgLCB0aGUgY2xhc3NcbiAqICAgICAgICAgd2lsbCBiZSBhZGRlZDsgaWYgYGZhbHNlYCwgdGhlIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC4gSWYgbm90XG4gKiAgICAgICAgIGdpdmVuLCB0aGUgY2xhc3Mgd2lsbCBiZSBhZGRlZCBpZiBub3QgcHJlc2VudCBhbmQgdmljZSB2ZXJzYS5cbiAqL1xudmlkZW9qcy50b2dnbGVDbGFzcyA9IERvbS50b2dnbGVFbENsYXNzO1xuXG4vKipcbiAqIEFwcGx5IGF0dHJpYnV0ZXMgdG8gYW4gSFRNTCBlbGVtZW50LlxuICpcbiAqIEBtZXRob2Qgc2V0QXR0cmlidXRlc1xuICogQHBhcmFtICB7RWxlbWVudH0gZWwgICAgICAgICBUYXJnZXQgZWxlbWVudC5cbiAqIEBwYXJhbSAge09iamVjdD19IGF0dHJpYnV0ZXMgRWxlbWVudCBhdHRyaWJ1dGVzIHRvIGJlIGFwcGxpZWQuXG4gKi9cbnZpZGVvanMuc2V0QXR0cmlidXRlcyA9IERvbS5zZXRFbEF0dHJpYnV0ZXM7XG5cbi8qKlxuICogR2V0IGFuIGVsZW1lbnQncyBhdHRyaWJ1dGUgdmFsdWVzLCBhcyBkZWZpbmVkIG9uIHRoZSBIVE1MIHRhZ1xuICogQXR0cmlidXRlcyBhcmUgbm90IHRoZSBzYW1lIGFzIHByb3BlcnRpZXMuIFRoZXkncmUgZGVmaW5lZCBvbiB0aGUgdGFnXG4gKiBvciB3aXRoIHNldEF0dHJpYnV0ZSAod2hpY2ggc2hvdWxkbid0IGJlIHVzZWQgd2l0aCBIVE1MKVxuICogVGhpcyB3aWxsIHJldHVybiB0cnVlIG9yIGZhbHNlIGZvciBib29sZWFuIGF0dHJpYnV0ZXMuXG4gKlxuICogQG1ldGhvZCBnZXRBdHRyaWJ1dGVzXG4gKiBAcGFyYW0gIHtFbGVtZW50fSB0YWcgRWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0YWcgYXR0cmlidXRlc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52aWRlb2pzLmdldEF0dHJpYnV0ZXMgPSBEb20uZ2V0RWxBdHRyaWJ1dGVzO1xuXG4vKipcbiAqIEVtcHRpZXMgdGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQuXG4gKlxuICogQG1ldGhvZCBlbXB0eUVsXG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHJldHVybiB7RWxlbWVudH1cbiAqL1xudmlkZW9qcy5lbXB0eUVsID0gRG9tLmVtcHR5RWw7XG5cbi8qKlxuICogTm9ybWFsaXplcyBhbmQgYXBwZW5kcyBjb250ZW50IHRvIGFuIGVsZW1lbnQuXG4gKlxuICogVGhlIGNvbnRlbnQgZm9yIGFuIGVsZW1lbnQgY2FuIGJlIHBhc3NlZCBpbiBtdWx0aXBsZSB0eXBlcyBhbmRcbiAqIGNvbWJpbmF0aW9ucywgd2hvc2UgYmVoYXZpb3IgaXMgYXMgZm9sbG93czpcbiAqXG4gKiAtIFN0cmluZ1xuICogICBOb3JtYWxpemVkIGludG8gYSB0ZXh0IG5vZGUuXG4gKlxuICogLSBFbGVtZW50LCBUZXh0Tm9kZVxuICogICBQYXNzZWQgdGhyb3VnaC5cbiAqXG4gKiAtIEFycmF5XG4gKiAgIEEgb25lLWRpbWVuc2lvbmFsIGFycmF5IG9mIHN0cmluZ3MsIGVsZW1lbnRzLCBub2Rlcywgb3IgZnVuY3Rpb25zICh3aGljaFxuICogICByZXR1cm4gc2luZ2xlIHN0cmluZ3MsIGVsZW1lbnRzLCBvciBub2RlcykuXG4gKlxuICogLSBGdW5jdGlvblxuICogICBJZiB0aGUgc29sZSBhcmd1bWVudCwgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIHN0cmluZywgZWxlbWVudCxcbiAqICAgbm9kZSwgb3IgYXJyYXkuXG4gKlxuICogQG1ldGhvZCBhcHBlbmRDb250ZW50XG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHBhcmFtICB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnRcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbnZpZGVvanMuYXBwZW5kQ29udGVudCA9IERvbS5hcHBlbmRDb250ZW50O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYW5kIGluc2VydHMgY29udGVudCBpbnRvIGFuIGVsZW1lbnQ7IHRoaXMgaXMgaWRlbnRpY2FsIHRvXG4gKiBgYXBwZW5kQ29udGVudCgpYCwgZXhjZXB0IGl0IGVtcHRpZXMgdGhlIGVsZW1lbnQgZmlyc3QuXG4gKlxuICogVGhlIGNvbnRlbnQgZm9yIGFuIGVsZW1lbnQgY2FuIGJlIHBhc3NlZCBpbiBtdWx0aXBsZSB0eXBlcyBhbmRcbiAqIGNvbWJpbmF0aW9ucywgd2hvc2UgYmVoYXZpb3IgaXMgYXMgZm9sbG93czpcbiAqXG4gKiAtIFN0cmluZ1xuICogICBOb3JtYWxpemVkIGludG8gYSB0ZXh0IG5vZGUuXG4gKlxuICogLSBFbGVtZW50LCBUZXh0Tm9kZVxuICogICBQYXNzZWQgdGhyb3VnaC5cbiAqXG4gKiAtIEFycmF5XG4gKiAgIEEgb25lLWRpbWVuc2lvbmFsIGFycmF5IG9mIHN0cmluZ3MsIGVsZW1lbnRzLCBub2Rlcywgb3IgZnVuY3Rpb25zICh3aGljaFxuICogICByZXR1cm4gc2luZ2xlIHN0cmluZ3MsIGVsZW1lbnRzLCBvciBub2RlcykuXG4gKlxuICogLSBGdW5jdGlvblxuICogICBJZiB0aGUgc29sZSBhcmd1bWVudCwgaXMgZXhwZWN0ZWQgdG8gcHJvZHVjZSBhIHN0cmluZywgZWxlbWVudCxcbiAqICAgbm9kZSwgb3IgYXJyYXkuXG4gKlxuICogQG1ldGhvZCBpbnNlcnRDb250ZW50XG4gKiBAcGFyYW0gIHtFbGVtZW50fSBlbFxuICogQHBhcmFtICB7U3RyaW5nfEVsZW1lbnR8VGV4dE5vZGV8QXJyYXl8RnVuY3Rpb259IGNvbnRlbnRcbiAqIEByZXR1cm4ge0VsZW1lbnR9XG4gKi9cbnZpZGVvanMuaW5zZXJ0Q29udGVudCA9IERvbS5pbnNlcnRDb250ZW50O1xuXG4vKlxuICogQ3VzdG9tIFVuaXZlcnNhbCBNb2R1bGUgRGVmaW5pdGlvbiAoVU1EKVxuICpcbiAqIFZpZGVvLmpzIHdpbGwgbmV2ZXIgYmUgYSBub24tYnJvd3NlciBsaWIgc28gd2UgY2FuIHNpbXBsaWZ5IFVNRCBhIGJ1bmNoIGFuZFxuICogc3RpbGwgc3VwcG9ydCByZXF1aXJlanMgYW5kIGJyb3dzZXJpZnkuIFRoaXMgYWxzbyBuZWVkcyB0byBiZSBjbG9zdXJlXG4gKiBjb21waWxlciBjb21wYXRpYmxlLCBzbyBzdHJpbmcga2V5cyBhcmUgdXNlZC5cbiAqL1xuaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lWydhbWQnXSkge1xuICBkZWZpbmUoJ3ZpZGVvanMnLCBbXSwgZnVuY3Rpb24oKXsgcmV0dXJuIHZpZGVvanM7IH0pO1xuXG4vLyBjaGVja2luZyB0aGF0IG1vZHVsZSBpcyBhbiBvYmplY3QgdG9vIGJlY2F1c2Ugb2YgdW1kanMvdW1kIzM1XG59IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0Jykge1xuICBtb2R1bGVbJ2V4cG9ydHMnXSA9IHZpZGVvanM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZpZGVvanM7XG4iXX0=
},{"../../src/js/utils/merge-options.js":150,"./component":66,"./event-target":104,"./extend.js":105,"./player":113,"./plugins.js":114,"./setup":118,"./tech/flash.js":121,"./tech/html5.js":122,"./tech/tech.js":124,"./tracks/audio-track.js":127,"./tracks/text-track.js":135,"./tracks/video-track.js":140,"./utils/browser.js":141,"./utils/create-deprecation-proxy.js":143,"./utils/dom.js":144,"./utils/events.js":145,"./utils/fn.js":146,"./utils/format-time.js":147,"./utils/log.js":149,"./utils/stylesheet.js":151,"./utils/time-ranges.js":152,"./utils/url.js":154,"global/document":7,"global/window":8,"lodash-compat/object/merge":46,"object.assign":53,"xhr":60}]},{},[155])(155)
});
//# sourceMappingURL=video.js.map
(function(window, vjs){
'use strict';
var volume_icon_svg = '';
var fullscreen_svg = '';
var exit_fullscreen_svg = '';
var play_button_svg = '';
var slider_gaps = ''
+'';
var skin = '.vjs5-hola-skin';
var custom_css = skin+' .vjs-big-play-button:hover .vjs-button-icon {'
+' fill: @play_button_color;'
+'}'
+skin+':not(.vjs-ad-playing) .vjs-progress-control .vjs-play-progress,'
+skin+' .vjs-progress-control .vjs-mouse-display:before,'
+skin+' .vjs-progress-control .vjs-play-progress:before,'
+skin+' .vjs-captions-toggle>.vjs-button-icon:after {'
+' background-color: @seek_bar_color;'
+'}';
function add_css(url, ver){
var link = document.createElement('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', url+(ver ? '?'+ver : ''));
document.getElementsByTagName('head')[0].appendChild(link);
}
var HolaSkin = function(player, opt){
var _this = this;
this.player = player;
this.el = player.el();
this.opt = opt;
this.classes_added = [];
player.on('dispose', function(){ _this.dispose(); });
player.on('ready', function(){ _this.init(); });
var resize = this._resize = this.resize.bind(this);
player.on('resize', resize);
player.on('fullscreenchange', function(){ setTimeout(resize); });
window.addEventListener('resize', resize);
this.apply();
this.resize();
};
HolaSkin.prototype.apply = function(){
var c, classes = [this.opt.className];
if (this.opt.show_controls_before_start)
classes.push('vjs-show-controls-before-start');
if (this.opt.show_time_for_live)
classes.push('vjs-show-time-for-live');
while (c = classes.shift())
{
if (this.player.addClass(c))
this.classes_added.push(c);
}
};
HolaSkin.prototype.resize = function(){
this.player.toggleClass('vjs-small', this.el.offsetWidth<=480);
};
HolaSkin.prototype.init = function(){
var _this = this;
var player = this.player;
this.init_volume_button();
this.has_played = false;
var play_el = player.controlBar.playToggle.el();
play_el.appendChild(vjs.createEl('div', {className: 'vjs-button-icon'}));
player.on('play', function(){
_this.is_ended = false;
_this.update_state(player);
})
.on('ended', function(){
_this.is_ended = true;
_this.update_state(player);
})
.on('seeking', function(){
// hide replay button if it's not rewind to the start (cur time == 0)
if (player.currentTime())
{
_this.is_ended = false;
_this.has_played = true;
}
else
_this.has_played = false;
_this.update_state(player);
})
.on('timeupdate', function(val, t1, t2){
var has_pos = !!player.currentTime();
if (has_pos==_this.has_played)
return;
_this.has_played = has_pos;
_this.update_state(player);
})
.on('mouseleave', function(){
if (!player.hasClass('vjs-settings-expanded'))
player.userActive(false);
});
this.update_state(player);
var control_bar = player.controlBar;
var progress_holder = control_bar.progressControl.seekBar.el();
progress_holder.insertAdjacentHTML('beforeend', slider_gaps);
player.addChild('PlayAnimation');
var volume_btn = control_bar.volumeMenuButton;
var volume_slider = volume_btn.volumeBar.el();
volume_slider.insertAdjacentHTML('beforeend', slider_gaps);
volume_btn.on('mouseenter', function(){
volume_btn.addClass('vjs-show-volume-button'); });
var interval, report_activity = player.reportUserActivity.bind(player);
control_bar.on('mouseenter', function(){
interval = this.setInterval(report_activity, 250); });
control_bar.on('mouseleave', function(){
if (interval)
this.clearInterval(interval);
volume_btn.removeClass('vjs-show-volume-button');
});
var spacer_el = control_bar.customControlSpacer.el();
control_bar.on('mousemove', function(e){
var r = spacer_el.getBoundingClientRect();
if (e.clientX>r.left || e.clientY 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = options.action;
this.container = options.container;
this.emitter = options.emitter;
this.target = options.target;
this.text = options.text;
this.trigger = options.trigger;
this.selectedText = '';
}
}, {
key: 'initSelection',
value: function initSelection() {
if (this.text) {
this.selectFake();
} else if (this.target) {
this.selectTarget();
}
}
}, {
key: 'selectFake',
value: function selectFake() {
var _this = this;
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
this.removeFake();
this.fakeHandlerCallback = function () {
return _this.removeFake();
};
this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
this.fakeElem = document.createElement('textarea');
// Prevent zooming on iOS
this.fakeElem.style.fontSize = '12pt';
// Reset box model
this.fakeElem.style.border = '0';
this.fakeElem.style.padding = '0';
this.fakeElem.style.margin = '0';
// Move element out of screen horizontally
this.fakeElem.style.position = 'absolute';
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
// Move element to the same position vertically
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
this.fakeElem.style.top = yPosition + 'px';
this.fakeElem.setAttribute('readonly', '');
this.fakeElem.value = this.text;
this.container.appendChild(this.fakeElem);
this.selectedText = (0, _select2.default)(this.fakeElem);
this.copyText();
}
}, {
key: 'removeFake',
value: function removeFake() {
if (this.fakeHandler) {
this.container.removeEventListener('click', this.fakeHandlerCallback);
this.fakeHandler = null;
this.fakeHandlerCallback = null;
}
if (this.fakeElem) {
this.container.removeChild(this.fakeElem);
this.fakeElem = null;
}
}
}, {
key: 'selectTarget',
value: function selectTarget() {
this.selectedText = (0, _select2.default)(this.target);
this.copyText();
}
}, {
key: 'copyText',
value: function copyText() {
var succeeded = void 0;
try {
succeeded = document.execCommand(this.action);
} catch (err) {
succeeded = false;
}
this.handleResult(succeeded);
}
}, {
key: 'handleResult',
value: function handleResult(succeeded) {
this.emitter.emit(succeeded ? 'success' : 'error', {
action: this.action,
text: this.selectedText,
trigger: this.trigger,
clearSelection: this.clearSelection.bind(this)
});
}
}, {
key: 'clearSelection',
value: function clearSelection() {
if (this.trigger) {
this.trigger.focus();
}
window.getSelection().removeAllRanges();
}
}, {
key: 'destroy',
value: function destroy() {
this.removeFake();
}
}, {
key: 'action',
set: function set() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
this._action = action;
if (this._action !== 'copy' && this._action !== 'cut') {
throw new Error('Invalid "action" value, use either "copy" or "cut"');
}
},
get: function get() {
return this._action;
}
}, {
key: 'target',
set: function set(target) {
if (target !== undefined) {
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
if (this.action === 'copy' && target.hasAttribute('disabled')) {
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
}
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
}
this._target = target;
} else {
throw new Error('Invalid "target" value, use a valid Element');
}
}
},
get: function get() {
return this._target;
}
}]);
return ClipboardAction;
}();
module.exports = ClipboardAction;
});
},{"select":129}],3:[function(_dereq_,module,exports){
(function (global, factory) {
if (typeof define === "function" && define.amd) {
define(['module', './clipboard-action', 'tiny-emitter', 'good-listener'], factory);
} else if (typeof exports !== "undefined") {
factory(module, _dereq_('./clipboard-action'), _dereq_('tiny-emitter'), _dereq_('good-listener'));
} else {
var mod = {
exports: {}
};
factory(mod, global.clipboardAction, global.tinyEmitter, global.goodListener);
global.clipboard = mod.exports;
}
})(this, function (module, _clipboardAction, _tinyEmitter, _goodListener) {
'use strict';
var _clipboardAction2 = _interopRequireDefault(_clipboardAction);
var _tinyEmitter2 = _interopRequireDefault(_tinyEmitter);
var _goodListener2 = _interopRequireDefault(_goodListener);
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
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;
};
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
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;
};
}();
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}
return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
enumerable: false,
writable: true,
configurable: true
}
});
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
}
var Clipboard = function (_Emitter) {
_inherits(Clipboard, _Emitter);
/**
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
* @param {Object} options
*/
function Clipboard(trigger, options) {
_classCallCheck(this, Clipboard);
var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
_this.resolveOptions(options);
_this.listenClick(trigger);
return _this;
}
/**
* Defines if attributes would be resolved using internal setter functions
* or custom functions that were passed in the constructor.
* @param {Object} options
*/
_createClass(Clipboard, [{
key: 'resolveOptions',
value: function resolveOptions() {
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
this.container = _typeof(options.container) === 'object' ? options.container : document.body;
}
}, {
key: 'listenClick',
value: function listenClick(trigger) {
var _this2 = this;
this.listener = (0, _goodListener2.default)(trigger, 'click', function (e) {
return _this2.onClick(e);
});
}
}, {
key: 'onClick',
value: function onClick(e) {
var trigger = e.delegateTarget || e.currentTarget;
if (this.clipboardAction) {
this.clipboardAction = null;
}
this.clipboardAction = new _clipboardAction2.default({
action: this.action(trigger),
target: this.target(trigger),
text: this.text(trigger),
container: this.container,
trigger: trigger,
emitter: this
});
}
}, {
key: 'defaultAction',
value: function defaultAction(trigger) {
return getAttributeValue('action', trigger);
}
}, {
key: 'defaultTarget',
value: function defaultTarget(trigger) {
var selector = getAttributeValue('target', trigger);
if (selector) {
return document.querySelector(selector);
}
}
}, {
key: 'defaultText',
value: function defaultText(trigger) {
return getAttributeValue('text', trigger);
}
}, {
key: 'destroy',
value: function destroy() {
this.listener.destroy();
if (this.clipboardAction) {
this.clipboardAction.destroy();
this.clipboardAction = null;
}
}
}], [{
key: 'isSupported',
value: function isSupported() {
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
var actions = typeof action === 'string' ? [action] : action;
var support = !!document.queryCommandSupported;
actions.forEach(function (action) {
support = support && !!document.queryCommandSupported(action);
});
return support;
}
}]);
return Clipboard;
}(_tinyEmitter2.default);
/**
* Helper function to retrieve attribute value.
* @param {String} suffix
* @param {Element} element
*/
function getAttributeValue(suffix, element) {
var attribute = 'data-clipboard-' + suffix;
if (!element.hasAttribute(attribute)) {
return;
}
return element.getAttribute(attribute);
}
module.exports = Clipboard;
});
},{"./clipboard-action":2,"good-listener":7,"tiny-emitter":130}],4:[function(_dereq_,module,exports){
var DOCUMENT_NODE_TYPE = 9;
/**
* A polyfill for Element.matches()
*/
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
var proto = Element.prototype;
proto.matches = proto.matchesSelector ||
proto.mozMatchesSelector ||
proto.msMatchesSelector ||
proto.oMatchesSelector ||
proto.webkitMatchesSelector;
}
/**
* Finds the closest parent that matches a selector.
*
* @param {Element} element
* @param {String} selector
* @return {Function}
*/
function closest (element, selector) {
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
if (typeof element.matches === 'function' &&
element.matches(selector)) {
return element;
}
element = element.parentNode;
}
}
module.exports = closest;
},{}],5:[function(_dereq_,module,exports){
var closest = _dereq_('./closest');
/**
* Delegates event to a selector.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @param {Boolean} useCapture
* @return {Object}
*/
function delegate(element, selector, type, callback, useCapture) {
var listenerFn = listener.apply(this, arguments);
element.addEventListener(type, listenerFn, useCapture);
return {
destroy: function() {
element.removeEventListener(type, listenerFn, useCapture);
}
}
}
/**
* Finds closest match and invokes callback.
*
* @param {Element} element
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Function}
*/
function listener(element, selector, type, callback) {
return function(e) {
e.delegateTarget = closest(e.target, selector);
if (e.delegateTarget) {
callback.call(element, e);
}
}
}
module.exports = delegate;
},{"./closest":4}],6:[function(_dereq_,module,exports){
/**
* Check if argument is a HTML element.
*
* @param {Object} value
* @return {Boolean}
*/
exports.node = function(value) {
return value !== undefined
&& value instanceof HTMLElement
&& value.nodeType === 1;
};
/**
* Check if argument is a list of HTML elements.
*
* @param {Object} value
* @return {Boolean}
*/
exports.nodeList = function(value) {
var type = Object.prototype.toString.call(value);
return value !== undefined
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
&& ('length' in value)
&& (value.length === 0 || exports.node(value[0]));
};
/**
* Check if argument is a string.
*
* @param {Object} value
* @return {Boolean}
*/
exports.string = function(value) {
return typeof value === 'string'
|| value instanceof String;
};
/**
* Check if argument is a function.
*
* @param {Object} value
* @return {Boolean}
*/
exports.fn = function(value) {
var type = Object.prototype.toString.call(value);
return type === '[object Function]';
};
},{}],7:[function(_dereq_,module,exports){
var is = _dereq_('./is');
var delegate = _dereq_('delegate');
/**
* Validates all params and calls the right
* listener function based on its target type.
*
* @param {String|HTMLElement|HTMLCollection|NodeList} target
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listen(target, type, callback) {
if (!target && !type && !callback) {
throw new Error('Missing required arguments');
}
if (!is.string(type)) {
throw new TypeError('Second argument must be a String');
}
if (!is.fn(callback)) {
throw new TypeError('Third argument must be a Function');
}
if (is.node(target)) {
return listenNode(target, type, callback);
}
else if (is.nodeList(target)) {
return listenNodeList(target, type, callback);
}
else if (is.string(target)) {
return listenSelector(target, type, callback);
}
else {
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
}
}
/**
* Adds an event listener to a HTML element
* and returns a remove listener function.
*
* @param {HTMLElement} node
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNode(node, type, callback) {
node.addEventListener(type, callback);
return {
destroy: function() {
node.removeEventListener(type, callback);
}
}
}
/**
* Add an event listener to a list of HTML elements
* and returns a remove listener function.
*
* @param {NodeList|HTMLCollection} nodeList
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenNodeList(nodeList, type, callback) {
Array.prototype.forEach.call(nodeList, function(node) {
node.addEventListener(type, callback);
});
return {
destroy: function() {
Array.prototype.forEach.call(nodeList, function(node) {
node.removeEventListener(type, callback);
});
}
}
}
/**
* Add an event listener to a selector
* and returns a remove listener function.
*
* @param {String} selector
* @param {String} type
* @param {Function} callback
* @return {Object}
*/
function listenSelector(selector, type, callback) {
return delegate(document.body, selector, type, callback);
}
module.exports = listen;
},{"./is":6,"delegate":5}],8:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative'),
root = _dereq_('./_root');
/* Built-in method references that are verified to be native. */
var DataView = getNative(root, 'DataView');
module.exports = DataView;
},{"./_getNative":57,"./_root":92}],9:[function(_dereq_,module,exports){
var hashClear = _dereq_('./_hashClear'),
hashDelete = _dereq_('./_hashDelete'),
hashGet = _dereq_('./_hashGet'),
hashHas = _dereq_('./_hashHas'),
hashSet = _dereq_('./_hashSet');
/**
* Creates a hash object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Hash(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `Hash`.
Hash.prototype.clear = hashClear;
Hash.prototype['delete'] = hashDelete;
Hash.prototype.get = hashGet;
Hash.prototype.has = hashHas;
Hash.prototype.set = hashSet;
module.exports = Hash;
},{"./_hashClear":63,"./_hashDelete":64,"./_hashGet":65,"./_hashHas":66,"./_hashSet":67}],10:[function(_dereq_,module,exports){
var listCacheClear = _dereq_('./_listCacheClear'),
listCacheDelete = _dereq_('./_listCacheDelete'),
listCacheGet = _dereq_('./_listCacheGet'),
listCacheHas = _dereq_('./_listCacheHas'),
listCacheSet = _dereq_('./_listCacheSet');
/**
* Creates an list cache object.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function ListCache(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `ListCache`.
ListCache.prototype.clear = listCacheClear;
ListCache.prototype['delete'] = listCacheDelete;
ListCache.prototype.get = listCacheGet;
ListCache.prototype.has = listCacheHas;
ListCache.prototype.set = listCacheSet;
module.exports = ListCache;
},{"./_listCacheClear":74,"./_listCacheDelete":75,"./_listCacheGet":76,"./_listCacheHas":77,"./_listCacheSet":78}],11:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative'),
root = _dereq_('./_root');
/* Built-in method references that are verified to be native. */
var Map = getNative(root, 'Map');
module.exports = Map;
},{"./_getNative":57,"./_root":92}],12:[function(_dereq_,module,exports){
var mapCacheClear = _dereq_('./_mapCacheClear'),
mapCacheDelete = _dereq_('./_mapCacheDelete'),
mapCacheGet = _dereq_('./_mapCacheGet'),
mapCacheHas = _dereq_('./_mapCacheHas'),
mapCacheSet = _dereq_('./_mapCacheSet');
/**
* Creates a map cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function MapCache(entries) {
var index = -1,
length = entries == null ? 0 : entries.length;
this.clear();
while (++index < length) {
var entry = entries[index];
this.set(entry[0], entry[1]);
}
}
// Add methods to `MapCache`.
MapCache.prototype.clear = mapCacheClear;
MapCache.prototype['delete'] = mapCacheDelete;
MapCache.prototype.get = mapCacheGet;
MapCache.prototype.has = mapCacheHas;
MapCache.prototype.set = mapCacheSet;
module.exports = MapCache;
},{"./_mapCacheClear":79,"./_mapCacheDelete":80,"./_mapCacheGet":81,"./_mapCacheHas":82,"./_mapCacheSet":83}],13:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative'),
root = _dereq_('./_root');
/* Built-in method references that are verified to be native. */
var Promise = getNative(root, 'Promise');
module.exports = Promise;
},{"./_getNative":57,"./_root":92}],14:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative'),
root = _dereq_('./_root');
/* Built-in method references that are verified to be native. */
var Set = getNative(root, 'Set');
module.exports = Set;
},{"./_getNative":57,"./_root":92}],15:[function(_dereq_,module,exports){
var MapCache = _dereq_('./_MapCache'),
setCacheAdd = _dereq_('./_setCacheAdd'),
setCacheHas = _dereq_('./_setCacheHas');
/**
*
* Creates an array cache object to store unique values.
*
* @private
* @constructor
* @param {Array} [values] The values to cache.
*/
function SetCache(values) {
var index = -1,
length = values == null ? 0 : values.length;
this.__data__ = new MapCache;
while (++index < length) {
this.add(values[index]);
}
}
// Add methods to `SetCache`.
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
SetCache.prototype.has = setCacheHas;
module.exports = SetCache;
},{"./_MapCache":12,"./_setCacheAdd":93,"./_setCacheHas":94}],16:[function(_dereq_,module,exports){
var ListCache = _dereq_('./_ListCache'),
stackClear = _dereq_('./_stackClear'),
stackDelete = _dereq_('./_stackDelete'),
stackGet = _dereq_('./_stackGet'),
stackHas = _dereq_('./_stackHas'),
stackSet = _dereq_('./_stackSet');
/**
* Creates a stack cache object to store key-value pairs.
*
* @private
* @constructor
* @param {Array} [entries] The key-value pairs to cache.
*/
function Stack(entries) {
var data = this.__data__ = new ListCache(entries);
this.size = data.size;
}
// Add methods to `Stack`.
Stack.prototype.clear = stackClear;
Stack.prototype['delete'] = stackDelete;
Stack.prototype.get = stackGet;
Stack.prototype.has = stackHas;
Stack.prototype.set = stackSet;
module.exports = Stack;
},{"./_ListCache":10,"./_stackClear":96,"./_stackDelete":97,"./_stackGet":98,"./_stackHas":99,"./_stackSet":100}],17:[function(_dereq_,module,exports){
var root = _dereq_('./_root');
/** Built-in value references. */
var Symbol = root.Symbol;
module.exports = Symbol;
},{"./_root":92}],18:[function(_dereq_,module,exports){
var root = _dereq_('./_root');
/** Built-in value references. */
var Uint8Array = root.Uint8Array;
module.exports = Uint8Array;
},{"./_root":92}],19:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative'),
root = _dereq_('./_root');
/* Built-in method references that are verified to be native. */
var WeakMap = getNative(root, 'WeakMap');
module.exports = WeakMap;
},{"./_getNative":57,"./_root":92}],20:[function(_dereq_,module,exports){
/**
* A specialized version of `_.filter` for arrays without support for
* iteratee shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {Array} Returns the new filtered array.
*/
function arrayFilter(array, predicate) {
var index = -1,
length = array == null ? 0 : array.length,
resIndex = 0,
result = [];
while (++index < length) {
var value = array[index];
if (predicate(value, index, array)) {
result[resIndex++] = value;
}
}
return result;
}
module.exports = arrayFilter;
},{}],21:[function(_dereq_,module,exports){
var baseTimes = _dereq_('./_baseTimes'),
isArguments = _dereq_('./isArguments'),
isArray = _dereq_('./isArray'),
isBuffer = _dereq_('./isBuffer'),
isIndex = _dereq_('./_isIndex'),
isTypedArray = _dereq_('./isTypedArray');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Creates an array of the enumerable property names of the array-like `value`.
*
* @private
* @param {*} value The value to query.
* @param {boolean} inherited Specify returning inherited property names.
* @returns {Array} Returns the array of property names.
*/
function arrayLikeKeys(value, inherited) {
var isArr = isArray(value),
isArg = !isArr && isArguments(value),
isBuff = !isArr && !isArg && isBuffer(value),
isType = !isArr && !isArg && !isBuff && isTypedArray(value),
skipIndexes = isArr || isArg || isBuff || isType,
result = skipIndexes ? baseTimes(value.length, String) : [],
length = result.length;
for (var key in value) {
if ((inherited || hasOwnProperty.call(value, key)) &&
!(skipIndexes && (
// Safari 9 has enumerable `arguments.length` in strict mode.
key == 'length' ||
// Node.js 0.10 has enumerable non-index properties on buffers.
(isBuff && (key == 'offset' || key == 'parent')) ||
// PhantomJS 2 has enumerable non-index properties on typed arrays.
(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
// Skip index properties.
isIndex(key, length)
))) {
result.push(key);
}
}
return result;
}
module.exports = arrayLikeKeys;
},{"./_baseTimes":43,"./_isIndex":68,"./isArguments":110,"./isArray":111,"./isBuffer":113,"./isTypedArray":119}],22:[function(_dereq_,module,exports){
/**
* A specialized version of `_.map` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the new mapped array.
*/
function arrayMap(array, iteratee) {
var index = -1,
length = array == null ? 0 : array.length,
result = Array(length);
while (++index < length) {
result[index] = iteratee(array[index], index, array);
}
return result;
}
module.exports = arrayMap;
},{}],23:[function(_dereq_,module,exports){
/**
* Appends the elements of `values` to `array`.
*
* @private
* @param {Array} array The array to modify.
* @param {Array} values The values to append.
* @returns {Array} Returns `array`.
*/
function arrayPush(array, values) {
var index = -1,
length = values.length,
offset = array.length;
while (++index < length) {
array[offset + index] = values[index];
}
return array;
}
module.exports = arrayPush;
},{}],24:[function(_dereq_,module,exports){
/**
* A specialized version of `_.some` for arrays without support for iteratee
* shorthands.
*
* @private
* @param {Array} [array] The array to iterate over.
* @param {Function} predicate The function invoked per iteration.
* @returns {boolean} Returns `true` if any element passes the predicate check,
* else `false`.
*/
function arraySome(array, predicate) {
var index = -1,
length = array == null ? 0 : array.length;
while (++index < length) {
if (predicate(array[index], index, array)) {
return true;
}
}
return false;
}
module.exports = arraySome;
},{}],25:[function(_dereq_,module,exports){
var eq = _dereq_('./eq');
/**
* Gets the index at which the `key` is found in `array` of key-value pairs.
*
* @private
* @param {Array} array The array to inspect.
* @param {*} key The key to search for.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function assocIndexOf(array, key) {
var length = array.length;
while (length--) {
if (eq(array[length][0], key)) {
return length;
}
}
return -1;
}
module.exports = assocIndexOf;
},{"./eq":104}],26:[function(_dereq_,module,exports){
/**
* The base implementation of `_.findIndex` and `_.findLastIndex` without
* support for iteratee shorthands.
*
* @private
* @param {Array} array The array to inspect.
* @param {Function} predicate The function invoked per iteration.
* @param {number} fromIndex The index to search from.
* @param {boolean} [fromRight] Specify iterating from right to left.
* @returns {number} Returns the index of the matched value, else `-1`.
*/
function baseFindIndex(array, predicate, fromIndex, fromRight) {
var length = array.length,
index = fromIndex + (fromRight ? 1 : -1);
while ((fromRight ? index-- : ++index < length)) {
if (predicate(array[index], index, array)) {
return index;
}
}
return -1;
}
module.exports = baseFindIndex;
},{}],27:[function(_dereq_,module,exports){
var castPath = _dereq_('./_castPath'),
toKey = _dereq_('./_toKey');
/**
* The base implementation of `_.get` without support for default values.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @returns {*} Returns the resolved value.
*/
function baseGet(object, path) {
path = castPath(path, object);
var index = 0,
length = path.length;
while (object != null && index < length) {
object = object[toKey(path[index++])];
}
return (index && index == length) ? object : undefined;
}
module.exports = baseGet;
},{"./_castPath":47,"./_toKey":102}],28:[function(_dereq_,module,exports){
var arrayPush = _dereq_('./_arrayPush'),
isArray = _dereq_('./isArray');
/**
* The base implementation of `getAllKeys` and `getAllKeysIn` which uses
* `keysFunc` and `symbolsFunc` to get the enumerable property names and
* symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Function} keysFunc The function to get the keys of `object`.
* @param {Function} symbolsFunc The function to get the symbols of `object`.
* @returns {Array} Returns the array of property names and symbols.
*/
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
var result = keysFunc(object);
return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
}
module.exports = baseGetAllKeys;
},{"./_arrayPush":23,"./isArray":111}],29:[function(_dereq_,module,exports){
var Symbol = _dereq_('./_Symbol'),
getRawTag = _dereq_('./_getRawTag'),
objectToString = _dereq_('./_objectToString');
/** `Object#toString` result references. */
var nullTag = '[object Null]',
undefinedTag = '[object Undefined]';
/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
/**
* The base implementation of `getTag` without fallbacks for buggy environments.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
function baseGetTag(value) {
if (value == null) {
return value === undefined ? undefinedTag : nullTag;
}
return (symToStringTag && symToStringTag in Object(value))
? getRawTag(value)
: objectToString(value);
}
module.exports = baseGetTag;
},{"./_Symbol":17,"./_getRawTag":58,"./_objectToString":90}],30:[function(_dereq_,module,exports){
/**
* The base implementation of `_.hasIn` without support for deep paths.
*
* @private
* @param {Object} [object] The object to query.
* @param {Array|string} key The key to check.
* @returns {boolean} Returns `true` if `key` exists, else `false`.
*/
function baseHasIn(object, key) {
return object != null && key in Object(object);
}
module.exports = baseHasIn;
},{}],31:[function(_dereq_,module,exports){
var baseGetTag = _dereq_('./_baseGetTag'),
isObjectLike = _dereq_('./isObjectLike');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]';
/**
* The base implementation of `_.isArguments`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
*/
function baseIsArguments(value) {
return isObjectLike(value) && baseGetTag(value) == argsTag;
}
module.exports = baseIsArguments;
},{"./_baseGetTag":29,"./isObjectLike":117}],32:[function(_dereq_,module,exports){
var baseIsEqualDeep = _dereq_('./_baseIsEqualDeep'),
isObjectLike = _dereq_('./isObjectLike');
/**
* The base implementation of `_.isEqual` which supports partial comparisons
* and tracks traversed objects.
*
* @private
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @param {boolean} bitmask The bitmask flags.
* 1 - Unordered comparison
* 2 - Partial comparison
* @param {Function} [customizer] The function to customize comparisons.
* @param {Object} [stack] Tracks traversed `value` and `other` objects.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
*/
function baseIsEqual(value, other, bitmask, customizer, stack) {
if (value === other) {
return true;
}
if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
return value !== value && other !== other;
}
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
}
module.exports = baseIsEqual;
},{"./_baseIsEqualDeep":33,"./isObjectLike":117}],33:[function(_dereq_,module,exports){
var Stack = _dereq_('./_Stack'),
equalArrays = _dereq_('./_equalArrays'),
equalByTag = _dereq_('./_equalByTag'),
equalObjects = _dereq_('./_equalObjects'),
getTag = _dereq_('./_getTag'),
isArray = _dereq_('./isArray'),
isBuffer = _dereq_('./isBuffer'),
isTypedArray = _dereq_('./isTypedArray');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1;
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
objectTag = '[object Object]';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A specialized version of `baseIsEqual` for arrays and objects which performs
* deep comparisons and tracks traversed objects enabling objects with circular
* references to be compared.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} [stack] Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
var objIsArr = isArray(object),
othIsArr = isArray(other),
objTag = objIsArr ? arrayTag : getTag(object),
othTag = othIsArr ? arrayTag : getTag(other);
objTag = objTag == argsTag ? objectTag : objTag;
othTag = othTag == argsTag ? objectTag : othTag;
var objIsObj = objTag == objectTag,
othIsObj = othTag == objectTag,
isSameTag = objTag == othTag;
if (isSameTag && isBuffer(object)) {
if (!isBuffer(other)) {
return false;
}
objIsArr = true;
objIsObj = false;
}
if (isSameTag && !objIsObj) {
stack || (stack = new Stack);
return (objIsArr || isTypedArray(object))
? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
: equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
}
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
if (objIsWrapped || othIsWrapped) {
var objUnwrapped = objIsWrapped ? object.value() : object,
othUnwrapped = othIsWrapped ? other.value() : other;
stack || (stack = new Stack);
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
}
}
if (!isSameTag) {
return false;
}
stack || (stack = new Stack);
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
}
module.exports = baseIsEqualDeep;
},{"./_Stack":16,"./_equalArrays":50,"./_equalByTag":51,"./_equalObjects":52,"./_getTag":60,"./isArray":111,"./isBuffer":113,"./isTypedArray":119}],34:[function(_dereq_,module,exports){
var Stack = _dereq_('./_Stack'),
baseIsEqual = _dereq_('./_baseIsEqual');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
COMPARE_UNORDERED_FLAG = 2;
/**
* The base implementation of `_.isMatch` without support for iteratee shorthands.
*
* @private
* @param {Object} object The object to inspect.
* @param {Object} source The object of property values to match.
* @param {Array} matchData The property names, values, and compare flags to match.
* @param {Function} [customizer] The function to customize comparisons.
* @returns {boolean} Returns `true` if `object` is a match, else `false`.
*/
function baseIsMatch(object, source, matchData, customizer) {
var index = matchData.length,
length = index,
noCustomizer = !customizer;
if (object == null) {
return !length;
}
object = Object(object);
while (index--) {
var data = matchData[index];
if ((noCustomizer && data[2])
? data[1] !== object[data[0]]
: !(data[0] in object)
) {
return false;
}
}
while (++index < length) {
data = matchData[index];
var key = data[0],
objValue = object[key],
srcValue = data[1];
if (noCustomizer && data[2]) {
if (objValue === undefined && !(key in object)) {
return false;
}
} else {
var stack = new Stack;
if (customizer) {
var result = customizer(objValue, srcValue, key, object, source, stack);
}
if (!(result === undefined
? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
: result
)) {
return false;
}
}
}
return true;
}
module.exports = baseIsMatch;
},{"./_Stack":16,"./_baseIsEqual":32}],35:[function(_dereq_,module,exports){
var isFunction = _dereq_('./isFunction'),
isMasked = _dereq_('./_isMasked'),
isObject = _dereq_('./isObject'),
toSource = _dereq_('./_toSource');
/**
* Used to match `RegExp`
* [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
*/
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
/** Used to detect host constructors (Safari). */
var reIsHostCtor = /^\[object .+?Constructor\]$/;
/** Used for built-in method references. */
var funcProto = Function.prototype,
objectProto = Object.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Used to detect if a method is native. */
var reIsNative = RegExp('^' +
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
/**
* The base implementation of `_.isNative` without bad shim checks.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a native function,
* else `false`.
*/
function baseIsNative(value) {
if (!isObject(value) || isMasked(value)) {
return false;
}
var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
return pattern.test(toSource(value));
}
module.exports = baseIsNative;
},{"./_isMasked":71,"./_toSource":103,"./isFunction":114,"./isObject":116}],36:[function(_dereq_,module,exports){
var baseGetTag = _dereq_('./_baseGetTag'),
isLength = _dereq_('./isLength'),
isObjectLike = _dereq_('./isObjectLike');
/** `Object#toString` result references. */
var argsTag = '[object Arguments]',
arrayTag = '[object Array]',
boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
funcTag = '[object Function]',
mapTag = '[object Map]',
numberTag = '[object Number]',
objectTag = '[object Object]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
weakMapTag = '[object WeakMap]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]',
float32Tag = '[object Float32Array]',
float64Tag = '[object Float64Array]',
int8Tag = '[object Int8Array]',
int16Tag = '[object Int16Array]',
int32Tag = '[object Int32Array]',
uint8Tag = '[object Uint8Array]',
uint8ClampedTag = '[object Uint8ClampedArray]',
uint16Tag = '[object Uint16Array]',
uint32Tag = '[object Uint32Array]';
/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;
/**
* The base implementation of `_.isTypedArray` without Node.js optimizations.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
*/
function baseIsTypedArray(value) {
return isObjectLike(value) &&
isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}
module.exports = baseIsTypedArray;
},{"./_baseGetTag":29,"./isLength":115,"./isObjectLike":117}],37:[function(_dereq_,module,exports){
var baseMatches = _dereq_('./_baseMatches'),
baseMatchesProperty = _dereq_('./_baseMatchesProperty'),
identity = _dereq_('./identity'),
isArray = _dereq_('./isArray'),
property = _dereq_('./property');
/**
* The base implementation of `_.iteratee`.
*
* @private
* @param {*} [value=_.identity] The value to convert to an iteratee.
* @returns {Function} Returns the iteratee.
*/
function baseIteratee(value) {
// Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
// See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
if (typeof value == 'function') {
return value;
}
if (value == null) {
return identity;
}
if (typeof value == 'object') {
return isArray(value)
? baseMatchesProperty(value[0], value[1])
: baseMatches(value);
}
return property(value);
}
module.exports = baseIteratee;
},{"./_baseMatches":39,"./_baseMatchesProperty":40,"./identity":109,"./isArray":111,"./property":122}],38:[function(_dereq_,module,exports){
var isPrototype = _dereq_('./_isPrototype'),
nativeKeys = _dereq_('./_nativeKeys');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
*/
function baseKeys(object) {
if (!isPrototype(object)) {
return nativeKeys(object);
}
var result = [];
for (var key in Object(object)) {
if (hasOwnProperty.call(object, key) && key != 'constructor') {
result.push(key);
}
}
return result;
}
module.exports = baseKeys;
},{"./_isPrototype":72,"./_nativeKeys":88}],39:[function(_dereq_,module,exports){
var baseIsMatch = _dereq_('./_baseIsMatch'),
getMatchData = _dereq_('./_getMatchData'),
matchesStrictComparable = _dereq_('./_matchesStrictComparable');
/**
* The base implementation of `_.matches` which doesn't clone `source`.
*
* @private
* @param {Object} source The object of property values to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatches(source) {
var matchData = getMatchData(source);
if (matchData.length == 1 && matchData[0][2]) {
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
}
return function(object) {
return object === source || baseIsMatch(object, source, matchData);
};
}
module.exports = baseMatches;
},{"./_baseIsMatch":34,"./_getMatchData":56,"./_matchesStrictComparable":85}],40:[function(_dereq_,module,exports){
var baseIsEqual = _dereq_('./_baseIsEqual'),
get = _dereq_('./get'),
hasIn = _dereq_('./hasIn'),
isKey = _dereq_('./_isKey'),
isStrictComparable = _dereq_('./_isStrictComparable'),
matchesStrictComparable = _dereq_('./_matchesStrictComparable'),
toKey = _dereq_('./_toKey');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
COMPARE_UNORDERED_FLAG = 2;
/**
* The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
*
* @private
* @param {string} path The path of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function baseMatchesProperty(path, srcValue) {
if (isKey(path) && isStrictComparable(srcValue)) {
return matchesStrictComparable(toKey(path), srcValue);
}
return function(object) {
var objValue = get(object, path);
return (objValue === undefined && objValue === srcValue)
? hasIn(object, path)
: baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
};
}
module.exports = baseMatchesProperty;
},{"./_baseIsEqual":32,"./_isKey":69,"./_isStrictComparable":73,"./_matchesStrictComparable":85,"./_toKey":102,"./get":107,"./hasIn":108}],41:[function(_dereq_,module,exports){
/**
* The base implementation of `_.property` without support for deep paths.
*
* @private
* @param {string} key The key of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function baseProperty(key) {
return function(object) {
return object == null ? undefined : object[key];
};
}
module.exports = baseProperty;
},{}],42:[function(_dereq_,module,exports){
var baseGet = _dereq_('./_baseGet');
/**
* A specialized version of `baseProperty` which supports deep paths.
*
* @private
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
*/
function basePropertyDeep(path) {
return function(object) {
return baseGet(object, path);
};
}
module.exports = basePropertyDeep;
},{"./_baseGet":27}],43:[function(_dereq_,module,exports){
/**
* The base implementation of `_.times` without support for iteratee shorthands
* or max array length checks.
*
* @private
* @param {number} n The number of times to invoke `iteratee`.
* @param {Function} iteratee The function invoked per iteration.
* @returns {Array} Returns the array of results.
*/
function baseTimes(n, iteratee) {
var index = -1,
result = Array(n);
while (++index < n) {
result[index] = iteratee(index);
}
return result;
}
module.exports = baseTimes;
},{}],44:[function(_dereq_,module,exports){
var Symbol = _dereq_('./_Symbol'),
arrayMap = _dereq_('./_arrayMap'),
isArray = _dereq_('./isArray'),
isSymbol = _dereq_('./isSymbol');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolToString = symbolProto ? symbolProto.toString : undefined;
/**
* The base implementation of `_.toString` which doesn't convert nullish
* values to empty strings.
*
* @private
* @param {*} value The value to process.
* @returns {string} Returns the string.
*/
function baseToString(value) {
// Exit early for strings to avoid a performance hit in some environments.
if (typeof value == 'string') {
return value;
}
if (isArray(value)) {
// Recursively convert values (susceptible to call stack limits).
return arrayMap(value, baseToString) + '';
}
if (isSymbol(value)) {
return symbolToString ? symbolToString.call(value) : '';
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
module.exports = baseToString;
},{"./_Symbol":17,"./_arrayMap":22,"./isArray":111,"./isSymbol":118}],45:[function(_dereq_,module,exports){
/**
* The base implementation of `_.unary` without support for storing metadata.
*
* @private
* @param {Function} func The function to cap arguments for.
* @returns {Function} Returns the new capped function.
*/
function baseUnary(func) {
return function(value) {
return func(value);
};
}
module.exports = baseUnary;
},{}],46:[function(_dereq_,module,exports){
/**
* Checks if a `cache` value for `key` exists.
*
* @private
* @param {Object} cache The cache to query.
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function cacheHas(cache, key) {
return cache.has(key);
}
module.exports = cacheHas;
},{}],47:[function(_dereq_,module,exports){
var isArray = _dereq_('./isArray'),
isKey = _dereq_('./_isKey'),
stringToPath = _dereq_('./_stringToPath'),
toString = _dereq_('./toString');
/**
* Casts `value` to a path array if it's not one.
*
* @private
* @param {*} value The value to inspect.
* @param {Object} [object] The object to query keys on.
* @returns {Array} Returns the cast property path array.
*/
function castPath(value, object) {
if (isArray(value)) {
return value;
}
return isKey(value, object) ? [value] : stringToPath(toString(value));
}
module.exports = castPath;
},{"./_isKey":69,"./_stringToPath":101,"./isArray":111,"./toString":128}],48:[function(_dereq_,module,exports){
var root = _dereq_('./_root');
/** Used to detect overreaching core-js shims. */
var coreJsData = root['__core-js_shared__'];
module.exports = coreJsData;
},{"./_root":92}],49:[function(_dereq_,module,exports){
var baseIteratee = _dereq_('./_baseIteratee'),
isArrayLike = _dereq_('./isArrayLike'),
keys = _dereq_('./keys');
/**
* Creates a `_.find` or `_.findLast` function.
*
* @private
* @param {Function} findIndexFunc The function to find the collection index.
* @returns {Function} Returns the new find function.
*/
function createFind(findIndexFunc) {
return function(collection, predicate, fromIndex) {
var iterable = Object(collection);
if (!isArrayLike(collection)) {
var iteratee = baseIteratee(predicate, 3);
collection = keys(collection);
predicate = function(key) { return iteratee(iterable[key], key, iterable); };
}
var index = findIndexFunc(collection, predicate, fromIndex);
return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
};
}
module.exports = createFind;
},{"./_baseIteratee":37,"./isArrayLike":112,"./keys":120}],50:[function(_dereq_,module,exports){
var SetCache = _dereq_('./_SetCache'),
arraySome = _dereq_('./_arraySome'),
cacheHas = _dereq_('./_cacheHas');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
COMPARE_UNORDERED_FLAG = 2;
/**
* A specialized version of `baseIsEqualDeep` for arrays with support for
* partial deep comparisons.
*
* @private
* @param {Array} array The array to compare.
* @param {Array} other The other array to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `array` and `other` objects.
* @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
*/
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
arrLength = array.length,
othLength = other.length;
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(array);
if (stacked && stack.get(other)) {
return stacked == other;
}
var index = -1,
result = true,
seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
stack.set(array, other);
stack.set(other, array);
// Ignore non-index properties.
while (++index < arrLength) {
var arrValue = array[index],
othValue = other[index];
if (customizer) {
var compared = isPartial
? customizer(othValue, arrValue, index, other, array, stack)
: customizer(arrValue, othValue, index, array, other, stack);
}
if (compared !== undefined) {
if (compared) {
continue;
}
result = false;
break;
}
// Recursively compare arrays (susceptible to call stack limits).
if (seen) {
if (!arraySome(other, function(othValue, othIndex) {
if (!cacheHas(seen, othIndex) &&
(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
return seen.push(othIndex);
}
})) {
result = false;
break;
}
} else if (!(
arrValue === othValue ||
equalFunc(arrValue, othValue, bitmask, customizer, stack)
)) {
result = false;
break;
}
}
stack['delete'](array);
stack['delete'](other);
return result;
}
module.exports = equalArrays;
},{"./_SetCache":15,"./_arraySome":24,"./_cacheHas":46}],51:[function(_dereq_,module,exports){
var Symbol = _dereq_('./_Symbol'),
Uint8Array = _dereq_('./_Uint8Array'),
eq = _dereq_('./eq'),
equalArrays = _dereq_('./_equalArrays'),
mapToArray = _dereq_('./_mapToArray'),
setToArray = _dereq_('./_setToArray');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1,
COMPARE_UNORDERED_FLAG = 2;
/** `Object#toString` result references. */
var boolTag = '[object Boolean]',
dateTag = '[object Date]',
errorTag = '[object Error]',
mapTag = '[object Map]',
numberTag = '[object Number]',
regexpTag = '[object RegExp]',
setTag = '[object Set]',
stringTag = '[object String]',
symbolTag = '[object Symbol]';
var arrayBufferTag = '[object ArrayBuffer]',
dataViewTag = '[object DataView]';
/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol ? Symbol.prototype : undefined,
symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
/**
* A specialized version of `baseIsEqualDeep` for comparing objects of
* the same `toStringTag`.
*
* **Note:** This function only supports comparing values with tags of
* `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {string} tag The `toStringTag` of the objects to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
switch (tag) {
case dataViewTag:
if ((object.byteLength != other.byteLength) ||
(object.byteOffset != other.byteOffset)) {
return false;
}
object = object.buffer;
other = other.buffer;
case arrayBufferTag:
if ((object.byteLength != other.byteLength) ||
!equalFunc(new Uint8Array(object), new Uint8Array(other))) {
return false;
}
return true;
case boolTag:
case dateTag:
case numberTag:
// Coerce booleans to `1` or `0` and dates to milliseconds.
// Invalid dates are coerced to `NaN`.
return eq(+object, +other);
case errorTag:
return object.name == other.name && object.message == other.message;
case regexpTag:
case stringTag:
// Coerce regexes to strings and treat strings, primitives and objects,
// as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
// for more details.
return object == (other + '');
case mapTag:
var convert = mapToArray;
case setTag:
var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
convert || (convert = setToArray);
if (object.size != other.size && !isPartial) {
return false;
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked) {
return stacked == other;
}
bitmask |= COMPARE_UNORDERED_FLAG;
// Recursively compare objects (susceptible to call stack limits).
stack.set(object, other);
var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
stack['delete'](object);
return result;
case symbolTag:
if (symbolValueOf) {
return symbolValueOf.call(object) == symbolValueOf.call(other);
}
}
return false;
}
module.exports = equalByTag;
},{"./_Symbol":17,"./_Uint8Array":18,"./_equalArrays":50,"./_mapToArray":84,"./_setToArray":95,"./eq":104}],52:[function(_dereq_,module,exports){
var getAllKeys = _dereq_('./_getAllKeys');
/** Used to compose bitmasks for value comparisons. */
var COMPARE_PARTIAL_FLAG = 1;
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* A specialized version of `baseIsEqualDeep` for objects with support for
* partial deep comparisons.
*
* @private
* @param {Object} object The object to compare.
* @param {Object} other The other object to compare.
* @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
* @param {Function} customizer The function to customize comparisons.
* @param {Function} equalFunc The function to determine equivalents of values.
* @param {Object} stack Tracks traversed `object` and `other` objects.
* @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
*/
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
objProps = getAllKeys(object),
objLength = objProps.length,
othProps = getAllKeys(other),
othLength = othProps.length;
if (objLength != othLength && !isPartial) {
return false;
}
var index = objLength;
while (index--) {
var key = objProps[index];
if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
return false;
}
}
// Assume cyclic values are equal.
var stacked = stack.get(object);
if (stacked && stack.get(other)) {
return stacked == other;
}
var result = true;
stack.set(object, other);
stack.set(other, object);
var skipCtor = isPartial;
while (++index < objLength) {
key = objProps[index];
var objValue = object[key],
othValue = other[key];
if (customizer) {
var compared = isPartial
? customizer(othValue, objValue, key, other, object, stack)
: customizer(objValue, othValue, key, object, other, stack);
}
// Recursively compare objects (susceptible to call stack limits).
if (!(compared === undefined
? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
: compared
)) {
result = false;
break;
}
skipCtor || (skipCtor = key == 'constructor');
}
if (result && !skipCtor) {
var objCtor = object.constructor,
othCtor = other.constructor;
// Non `Object` object instances with different constructors are not equal.
if (objCtor != othCtor &&
('constructor' in object && 'constructor' in other) &&
!(typeof objCtor == 'function' && objCtor instanceof objCtor &&
typeof othCtor == 'function' && othCtor instanceof othCtor)) {
result = false;
}
}
stack['delete'](object);
stack['delete'](other);
return result;
}
module.exports = equalObjects;
},{"./_getAllKeys":54}],53:[function(_dereq_,module,exports){
(function (global){
/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
module.exports = freeGlobal;
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
},{}],54:[function(_dereq_,module,exports){
var baseGetAllKeys = _dereq_('./_baseGetAllKeys'),
getSymbols = _dereq_('./_getSymbols'),
keys = _dereq_('./keys');
/**
* Creates an array of own enumerable property names and symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names and symbols.
*/
function getAllKeys(object) {
return baseGetAllKeys(object, keys, getSymbols);
}
module.exports = getAllKeys;
},{"./_baseGetAllKeys":28,"./_getSymbols":59,"./keys":120}],55:[function(_dereq_,module,exports){
var isKeyable = _dereq_('./_isKeyable');
/**
* Gets the data for `map`.
*
* @private
* @param {Object} map The map to query.
* @param {string} key The reference key.
* @returns {*} Returns the map data.
*/
function getMapData(map, key) {
var data = map.__data__;
return isKeyable(key)
? data[typeof key == 'string' ? 'string' : 'hash']
: data.map;
}
module.exports = getMapData;
},{"./_isKeyable":70}],56:[function(_dereq_,module,exports){
var isStrictComparable = _dereq_('./_isStrictComparable'),
keys = _dereq_('./keys');
/**
* Gets the property names, values, and compare flags of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the match data of `object`.
*/
function getMatchData(object) {
var result = keys(object),
length = result.length;
while (length--) {
var key = result[length],
value = object[key];
result[length] = [key, value, isStrictComparable(value)];
}
return result;
}
module.exports = getMatchData;
},{"./_isStrictComparable":73,"./keys":120}],57:[function(_dereq_,module,exports){
var baseIsNative = _dereq_('./_baseIsNative'),
getValue = _dereq_('./_getValue');
/**
* Gets the native function at `key` of `object`.
*
* @private
* @param {Object} object The object to query.
* @param {string} key The key of the method to get.
* @returns {*} Returns the function if it's native, else `undefined`.
*/
function getNative(object, key) {
var value = getValue(object, key);
return baseIsNative(value) ? value : undefined;
}
module.exports = getNative;
},{"./_baseIsNative":35,"./_getValue":61}],58:[function(_dereq_,module,exports){
var Symbol = _dereq_('./_Symbol');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString = objectProto.toString;
/** Built-in value references. */
var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
/**
* A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the raw `toStringTag`.
*/
function getRawTag(value) {
var isOwn = hasOwnProperty.call(value, symToStringTag),
tag = value[symToStringTag];
try {
value[symToStringTag] = undefined;
var unmasked = true;
} catch (e) {}
var result = nativeObjectToString.call(value);
if (unmasked) {
if (isOwn) {
value[symToStringTag] = tag;
} else {
delete value[symToStringTag];
}
}
return result;
}
module.exports = getRawTag;
},{"./_Symbol":17}],59:[function(_dereq_,module,exports){
var arrayFilter = _dereq_('./_arrayFilter'),
stubArray = _dereq_('./stubArray');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeGetSymbols = Object.getOwnPropertySymbols;
/**
* Creates an array of the own enumerable symbols of `object`.
*
* @private
* @param {Object} object The object to query.
* @returns {Array} Returns the array of symbols.
*/
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
if (object == null) {
return [];
}
object = Object(object);
return arrayFilter(nativeGetSymbols(object), function(symbol) {
return propertyIsEnumerable.call(object, symbol);
});
};
module.exports = getSymbols;
},{"./_arrayFilter":20,"./stubArray":123}],60:[function(_dereq_,module,exports){
var DataView = _dereq_('./_DataView'),
Map = _dereq_('./_Map'),
Promise = _dereq_('./_Promise'),
Set = _dereq_('./_Set'),
WeakMap = _dereq_('./_WeakMap'),
baseGetTag = _dereq_('./_baseGetTag'),
toSource = _dereq_('./_toSource');
/** `Object#toString` result references. */
var mapTag = '[object Map]',
objectTag = '[object Object]',
promiseTag = '[object Promise]',
setTag = '[object Set]',
weakMapTag = '[object WeakMap]';
var dataViewTag = '[object DataView]';
/** Used to detect maps, sets, and weakmaps. */
var dataViewCtorString = toSource(DataView),
mapCtorString = toSource(Map),
promiseCtorString = toSource(Promise),
setCtorString = toSource(Set),
weakMapCtorString = toSource(WeakMap);
/**
* Gets the `toStringTag` of `value`.
*
* @private
* @param {*} value The value to query.
* @returns {string} Returns the `toStringTag`.
*/
var getTag = baseGetTag;
// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
(Map && getTag(new Map) != mapTag) ||
(Promise && getTag(Promise.resolve()) != promiseTag) ||
(Set && getTag(new Set) != setTag) ||
(WeakMap && getTag(new WeakMap) != weakMapTag)) {
getTag = function(value) {
var result = baseGetTag(value),
Ctor = result == objectTag ? value.constructor : undefined,
ctorString = Ctor ? toSource(Ctor) : '';
if (ctorString) {
switch (ctorString) {
case dataViewCtorString: return dataViewTag;
case mapCtorString: return mapTag;
case promiseCtorString: return promiseTag;
case setCtorString: return setTag;
case weakMapCtorString: return weakMapTag;
}
}
return result;
};
}
module.exports = getTag;
},{"./_DataView":8,"./_Map":11,"./_Promise":13,"./_Set":14,"./_WeakMap":19,"./_baseGetTag":29,"./_toSource":103}],61:[function(_dereq_,module,exports){
/**
* Gets the value at `key` of `object`.
*
* @private
* @param {Object} [object] The object to query.
* @param {string} key The key of the property to get.
* @returns {*} Returns the property value.
*/
function getValue(object, key) {
return object == null ? undefined : object[key];
}
module.exports = getValue;
},{}],62:[function(_dereq_,module,exports){
var castPath = _dereq_('./_castPath'),
isArguments = _dereq_('./isArguments'),
isArray = _dereq_('./isArray'),
isIndex = _dereq_('./_isIndex'),
isLength = _dereq_('./isLength'),
toKey = _dereq_('./_toKey');
/**
* Checks if `path` exists on `object`.
*
* @private
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @param {Function} hasFunc The function to check properties.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
*/
function hasPath(object, path, hasFunc) {
path = castPath(path, object);
var index = -1,
length = path.length,
result = false;
while (++index < length) {
var key = toKey(path[index]);
if (!(result = object != null && hasFunc(object, key))) {
break;
}
object = object[key];
}
if (result || ++index != length) {
return result;
}
length = object == null ? 0 : object.length;
return !!length && isLength(length) && isIndex(key, length) &&
(isArray(object) || isArguments(object));
}
module.exports = hasPath;
},{"./_castPath":47,"./_isIndex":68,"./_toKey":102,"./isArguments":110,"./isArray":111,"./isLength":115}],63:[function(_dereq_,module,exports){
var nativeCreate = _dereq_('./_nativeCreate');
/**
* Removes all key-value entries from the hash.
*
* @private
* @name clear
* @memberOf Hash
*/
function hashClear() {
this.__data__ = nativeCreate ? nativeCreate(null) : {};
this.size = 0;
}
module.exports = hashClear;
},{"./_nativeCreate":87}],64:[function(_dereq_,module,exports){
/**
* Removes `key` and its value from the hash.
*
* @private
* @name delete
* @memberOf Hash
* @param {Object} hash The hash to modify.
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function hashDelete(key) {
var result = this.has(key) && delete this.__data__[key];
this.size -= result ? 1 : 0;
return result;
}
module.exports = hashDelete;
},{}],65:[function(_dereq_,module,exports){
var nativeCreate = _dereq_('./_nativeCreate');
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Gets the hash value for `key`.
*
* @private
* @name get
* @memberOf Hash
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function hashGet(key) {
var data = this.__data__;
if (nativeCreate) {
var result = data[key];
return result === HASH_UNDEFINED ? undefined : result;
}
return hasOwnProperty.call(data, key) ? data[key] : undefined;
}
module.exports = hashGet;
},{"./_nativeCreate":87}],66:[function(_dereq_,module,exports){
var nativeCreate = _dereq_('./_nativeCreate');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/**
* Checks if a hash value for `key` exists.
*
* @private
* @name has
* @memberOf Hash
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function hashHas(key) {
var data = this.__data__;
return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
}
module.exports = hashHas;
},{"./_nativeCreate":87}],67:[function(_dereq_,module,exports){
var nativeCreate = _dereq_('./_nativeCreate');
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/**
* Sets the hash `key` to `value`.
*
* @private
* @name set
* @memberOf Hash
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the hash instance.
*/
function hashSet(key, value) {
var data = this.__data__;
this.size += this.has(key) ? 0 : 1;
data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
return this;
}
module.exports = hashSet;
},{"./_nativeCreate":87}],68:[function(_dereq_,module,exports){
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;
/**
* Checks if `value` is a valid array-like index.
*
* @private
* @param {*} value The value to check.
* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
*/
function isIndex(value, length) {
length = length == null ? MAX_SAFE_INTEGER : length;
return !!length &&
(typeof value == 'number' || reIsUint.test(value)) &&
(value > -1 && value % 1 == 0 && value < length);
}
module.exports = isIndex;
},{}],69:[function(_dereq_,module,exports){
var isArray = _dereq_('./isArray'),
isSymbol = _dereq_('./isSymbol');
/** Used to match property names within property paths. */
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
reIsPlainProp = /^\w*$/;
/**
* Checks if `value` is a property name and not a property path.
*
* @private
* @param {*} value The value to check.
* @param {Object} [object] The object to query keys on.
* @returns {boolean} Returns `true` if `value` is a property name, else `false`.
*/
function isKey(value, object) {
if (isArray(value)) {
return false;
}
var type = typeof value;
if (type == 'number' || type == 'symbol' || type == 'boolean' ||
value == null || isSymbol(value)) {
return true;
}
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
(object != null && value in Object(object));
}
module.exports = isKey;
},{"./isArray":111,"./isSymbol":118}],70:[function(_dereq_,module,exports){
/**
* Checks if `value` is suitable for use as unique object key.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is suitable, else `false`.
*/
function isKeyable(value) {
var type = typeof value;
return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
? (value !== '__proto__')
: (value === null);
}
module.exports = isKeyable;
},{}],71:[function(_dereq_,module,exports){
var coreJsData = _dereq_('./_coreJsData');
/** Used to detect methods masquerading as native. */
var maskSrcKey = (function() {
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
return uid ? ('Symbol(src)_1.' + uid) : '';
}());
/**
* Checks if `func` has its source masked.
*
* @private
* @param {Function} func The function to check.
* @returns {boolean} Returns `true` if `func` is masked, else `false`.
*/
function isMasked(func) {
return !!maskSrcKey && (maskSrcKey in func);
}
module.exports = isMasked;
},{"./_coreJsData":48}],72:[function(_dereq_,module,exports){
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Checks if `value` is likely a prototype object.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
*/
function isPrototype(value) {
var Ctor = value && value.constructor,
proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
return value === proto;
}
module.exports = isPrototype;
},{}],73:[function(_dereq_,module,exports){
var isObject = _dereq_('./isObject');
/**
* Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
*
* @private
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` if suitable for strict
* equality comparisons, else `false`.
*/
function isStrictComparable(value) {
return value === value && !isObject(value);
}
module.exports = isStrictComparable;
},{"./isObject":116}],74:[function(_dereq_,module,exports){
/**
* Removes all key-value entries from the list cache.
*
* @private
* @name clear
* @memberOf ListCache
*/
function listCacheClear() {
this.__data__ = [];
this.size = 0;
}
module.exports = listCacheClear;
},{}],75:[function(_dereq_,module,exports){
var assocIndexOf = _dereq_('./_assocIndexOf');
/** Used for built-in method references. */
var arrayProto = Array.prototype;
/** Built-in value references. */
var splice = arrayProto.splice;
/**
* Removes `key` and its value from the list cache.
*
* @private
* @name delete
* @memberOf ListCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function listCacheDelete(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
return false;
}
var lastIndex = data.length - 1;
if (index == lastIndex) {
data.pop();
} else {
splice.call(data, index, 1);
}
--this.size;
return true;
}
module.exports = listCacheDelete;
},{"./_assocIndexOf":25}],76:[function(_dereq_,module,exports){
var assocIndexOf = _dereq_('./_assocIndexOf');
/**
* Gets the list cache value for `key`.
*
* @private
* @name get
* @memberOf ListCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function listCacheGet(key) {
var data = this.__data__,
index = assocIndexOf(data, key);
return index < 0 ? undefined : data[index][1];
}
module.exports = listCacheGet;
},{"./_assocIndexOf":25}],77:[function(_dereq_,module,exports){
var assocIndexOf = _dereq_('./_assocIndexOf');
/**
* Checks if a list cache value for `key` exists.
*
* @private
* @name has
* @memberOf ListCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function listCacheHas(key) {
return assocIndexOf(this.__data__, key) > -1;
}
module.exports = listCacheHas;
},{"./_assocIndexOf":25}],78:[function(_dereq_,module,exports){
var assocIndexOf = _dereq_('./_assocIndexOf');
/**
* Sets the list cache `key` to `value`.
*
* @private
* @name set
* @memberOf ListCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the list cache instance.
*/
function listCacheSet(key, value) {
var data = this.__data__,
index = assocIndexOf(data, key);
if (index < 0) {
++this.size;
data.push([key, value]);
} else {
data[index][1] = value;
}
return this;
}
module.exports = listCacheSet;
},{"./_assocIndexOf":25}],79:[function(_dereq_,module,exports){
var Hash = _dereq_('./_Hash'),
ListCache = _dereq_('./_ListCache'),
Map = _dereq_('./_Map');
/**
* Removes all key-value entries from the map.
*
* @private
* @name clear
* @memberOf MapCache
*/
function mapCacheClear() {
this.size = 0;
this.__data__ = {
'hash': new Hash,
'map': new (Map || ListCache),
'string': new Hash
};
}
module.exports = mapCacheClear;
},{"./_Hash":9,"./_ListCache":10,"./_Map":11}],80:[function(_dereq_,module,exports){
var getMapData = _dereq_('./_getMapData');
/**
* Removes `key` and its value from the map.
*
* @private
* @name delete
* @memberOf MapCache
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function mapCacheDelete(key) {
var result = getMapData(this, key)['delete'](key);
this.size -= result ? 1 : 0;
return result;
}
module.exports = mapCacheDelete;
},{"./_getMapData":55}],81:[function(_dereq_,module,exports){
var getMapData = _dereq_('./_getMapData');
/**
* Gets the map value for `key`.
*
* @private
* @name get
* @memberOf MapCache
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function mapCacheGet(key) {
return getMapData(this, key).get(key);
}
module.exports = mapCacheGet;
},{"./_getMapData":55}],82:[function(_dereq_,module,exports){
var getMapData = _dereq_('./_getMapData');
/**
* Checks if a map value for `key` exists.
*
* @private
* @name has
* @memberOf MapCache
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function mapCacheHas(key) {
return getMapData(this, key).has(key);
}
module.exports = mapCacheHas;
},{"./_getMapData":55}],83:[function(_dereq_,module,exports){
var getMapData = _dereq_('./_getMapData');
/**
* Sets the map `key` to `value`.
*
* @private
* @name set
* @memberOf MapCache
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the map cache instance.
*/
function mapCacheSet(key, value) {
var data = getMapData(this, key),
size = data.size;
data.set(key, value);
this.size += data.size == size ? 0 : 1;
return this;
}
module.exports = mapCacheSet;
},{"./_getMapData":55}],84:[function(_dereq_,module,exports){
/**
* Converts `map` to its key-value pairs.
*
* @private
* @param {Object} map The map to convert.
* @returns {Array} Returns the key-value pairs.
*/
function mapToArray(map) {
var index = -1,
result = Array(map.size);
map.forEach(function(value, key) {
result[++index] = [key, value];
});
return result;
}
module.exports = mapToArray;
},{}],85:[function(_dereq_,module,exports){
/**
* A specialized version of `matchesProperty` for source values suitable
* for strict equality comparisons, i.e. `===`.
*
* @private
* @param {string} key The key of the property to get.
* @param {*} srcValue The value to match.
* @returns {Function} Returns the new spec function.
*/
function matchesStrictComparable(key, srcValue) {
return function(object) {
if (object == null) {
return false;
}
return object[key] === srcValue &&
(srcValue !== undefined || (key in Object(object)));
};
}
module.exports = matchesStrictComparable;
},{}],86:[function(_dereq_,module,exports){
var memoize = _dereq_('./memoize');
/** Used as the maximum memoize cache size. */
var MAX_MEMOIZE_SIZE = 500;
/**
* A specialized version of `_.memoize` which clears the memoized function's
* cache when it exceeds `MAX_MEMOIZE_SIZE`.
*
* @private
* @param {Function} func The function to have its output memoized.
* @returns {Function} Returns the new memoized function.
*/
function memoizeCapped(func) {
var result = memoize(func, function(key) {
if (cache.size === MAX_MEMOIZE_SIZE) {
cache.clear();
}
return key;
});
var cache = result.cache;
return result;
}
module.exports = memoizeCapped;
},{"./memoize":121}],87:[function(_dereq_,module,exports){
var getNative = _dereq_('./_getNative');
/* Built-in method references that are verified to be native. */
var nativeCreate = getNative(Object, 'create');
module.exports = nativeCreate;
},{"./_getNative":57}],88:[function(_dereq_,module,exports){
var overArg = _dereq_('./_overArg');
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object);
module.exports = nativeKeys;
},{"./_overArg":91}],89:[function(_dereq_,module,exports){
var freeGlobal = _dereq_('./_freeGlobal');
/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;
/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports && freeGlobal.process;
/** Used to access faster Node.js helpers. */
var nodeUtil = (function() {
try {
return freeProcess && freeProcess.binding && freeProcess.binding('util');
} catch (e) {}
}());
module.exports = nodeUtil;
},{"./_freeGlobal":53}],90:[function(_dereq_,module,exports){
/** Used for built-in method references. */
var objectProto = Object.prototype;
/**
* Used to resolve the
* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
* of values.
*/
var nativeObjectToString = objectProto.toString;
/**
* Converts `value` to a string using `Object.prototype.toString`.
*
* @private
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
*/
function objectToString(value) {
return nativeObjectToString.call(value);
}
module.exports = objectToString;
},{}],91:[function(_dereq_,module,exports){
/**
* Creates a unary function that invokes `func` with its argument transformed.
*
* @private
* @param {Function} func The function to wrap.
* @param {Function} transform The argument transform.
* @returns {Function} Returns the new function.
*/
function overArg(func, transform) {
return function(arg) {
return func(transform(arg));
};
}
module.exports = overArg;
},{}],92:[function(_dereq_,module,exports){
var freeGlobal = _dereq_('./_freeGlobal');
/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();
module.exports = root;
},{"./_freeGlobal":53}],93:[function(_dereq_,module,exports){
/** Used to stand-in for `undefined` hash values. */
var HASH_UNDEFINED = '__lodash_hash_undefined__';
/**
* Adds `value` to the array cache.
*
* @private
* @name add
* @memberOf SetCache
* @alias push
* @param {*} value The value to cache.
* @returns {Object} Returns the cache instance.
*/
function setCacheAdd(value) {
this.__data__.set(value, HASH_UNDEFINED);
return this;
}
module.exports = setCacheAdd;
},{}],94:[function(_dereq_,module,exports){
/**
* Checks if `value` is in the array cache.
*
* @private
* @name has
* @memberOf SetCache
* @param {*} value The value to search for.
* @returns {number} Returns `true` if `value` is found, else `false`.
*/
function setCacheHas(value) {
return this.__data__.has(value);
}
module.exports = setCacheHas;
},{}],95:[function(_dereq_,module,exports){
/**
* Converts `set` to an array of its values.
*
* @private
* @param {Object} set The set to convert.
* @returns {Array} Returns the values.
*/
function setToArray(set) {
var index = -1,
result = Array(set.size);
set.forEach(function(value) {
result[++index] = value;
});
return result;
}
module.exports = setToArray;
},{}],96:[function(_dereq_,module,exports){
var ListCache = _dereq_('./_ListCache');
/**
* Removes all key-value entries from the stack.
*
* @private
* @name clear
* @memberOf Stack
*/
function stackClear() {
this.__data__ = new ListCache;
this.size = 0;
}
module.exports = stackClear;
},{"./_ListCache":10}],97:[function(_dereq_,module,exports){
/**
* Removes `key` and its value from the stack.
*
* @private
* @name delete
* @memberOf Stack
* @param {string} key The key of the value to remove.
* @returns {boolean} Returns `true` if the entry was removed, else `false`.
*/
function stackDelete(key) {
var data = this.__data__,
result = data['delete'](key);
this.size = data.size;
return result;
}
module.exports = stackDelete;
},{}],98:[function(_dereq_,module,exports){
/**
* Gets the stack value for `key`.
*
* @private
* @name get
* @memberOf Stack
* @param {string} key The key of the value to get.
* @returns {*} Returns the entry value.
*/
function stackGet(key) {
return this.__data__.get(key);
}
module.exports = stackGet;
},{}],99:[function(_dereq_,module,exports){
/**
* Checks if a stack value for `key` exists.
*
* @private
* @name has
* @memberOf Stack
* @param {string} key The key of the entry to check.
* @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
*/
function stackHas(key) {
return this.__data__.has(key);
}
module.exports = stackHas;
},{}],100:[function(_dereq_,module,exports){
var ListCache = _dereq_('./_ListCache'),
Map = _dereq_('./_Map'),
MapCache = _dereq_('./_MapCache');
/** Used as the size to enable large array optimizations. */
var LARGE_ARRAY_SIZE = 200;
/**
* Sets the stack `key` to `value`.
*
* @private
* @name set
* @memberOf Stack
* @param {string} key The key of the value to set.
* @param {*} value The value to set.
* @returns {Object} Returns the stack cache instance.
*/
function stackSet(key, value) {
var data = this.__data__;
if (data instanceof ListCache) {
var pairs = data.__data__;
if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
pairs.push([key, value]);
this.size = ++data.size;
return this;
}
data = this.__data__ = new MapCache(pairs);
}
data.set(key, value);
this.size = data.size;
return this;
}
module.exports = stackSet;
},{"./_ListCache":10,"./_Map":11,"./_MapCache":12}],101:[function(_dereq_,module,exports){
var memoizeCapped = _dereq_('./_memoizeCapped');
/** Used to match property names within property paths. */
var reLeadingDot = /^\./,
rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
/** Used to match backslashes in property paths. */
var reEscapeChar = /\\(\\)?/g;
/**
* Converts `string` to a property path array.
*
* @private
* @param {string} string The string to convert.
* @returns {Array} Returns the property path array.
*/
var stringToPath = memoizeCapped(function(string) {
var result = [];
if (reLeadingDot.test(string)) {
result.push('');
}
string.replace(rePropName, function(match, number, quote, string) {
result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
});
return result;
});
module.exports = stringToPath;
},{"./_memoizeCapped":86}],102:[function(_dereq_,module,exports){
var isSymbol = _dereq_('./isSymbol');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;
/**
* Converts `value` to a string key if it's not a string or symbol.
*
* @private
* @param {*} value The value to inspect.
* @returns {string|symbol} Returns the key.
*/
function toKey(value) {
if (typeof value == 'string' || isSymbol(value)) {
return value;
}
var result = (value + '');
return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}
module.exports = toKey;
},{"./isSymbol":118}],103:[function(_dereq_,module,exports){
/** Used for built-in method references. */
var funcProto = Function.prototype;
/** Used to resolve the decompiled source of functions. */
var funcToString = funcProto.toString;
/**
* Converts `func` to its source code.
*
* @private
* @param {Function} func The function to convert.
* @returns {string} Returns the source code.
*/
function toSource(func) {
if (func != null) {
try {
return funcToString.call(func);
} catch (e) {}
try {
return (func + '');
} catch (e) {}
}
return '';
}
module.exports = toSource;
},{}],104:[function(_dereq_,module,exports){
/**
* Performs a
* [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
* comparison between two values to determine if they are equivalent.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to compare.
* @param {*} other The other value to compare.
* @returns {boolean} Returns `true` if the values are equivalent, else `false`.
* @example
*
* var object = { 'a': 1 };
* var other = { 'a': 1 };
*
* _.eq(object, object);
* // => true
*
* _.eq(object, other);
* // => false
*
* _.eq('a', 'a');
* // => true
*
* _.eq('a', Object('a'));
* // => false
*
* _.eq(NaN, NaN);
* // => true
*/
function eq(value, other) {
return value === other || (value !== value && other !== other);
}
module.exports = eq;
},{}],105:[function(_dereq_,module,exports){
var createFind = _dereq_('./_createFind'),
findIndex = _dereq_('./findIndex');
/**
* Iterates over elements of `collection`, returning the first element
* `predicate` returns truthy for. The predicate is invoked with three
* arguments: (value, index|key, collection).
*
* @static
* @memberOf _
* @since 0.1.0
* @category Collection
* @param {Array|Object} collection The collection to inspect.
* @param {Function} [predicate=_.identity] The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {*} Returns the matched element, else `undefined`.
* @example
*
* var users = [
* { 'user': 'barney', 'age': 36, 'active': true },
* { 'user': 'fred', 'age': 40, 'active': false },
* { 'user': 'pebbles', 'age': 1, 'active': true }
* ];
*
* _.find(users, function(o) { return o.age < 40; });
* // => object for 'barney'
*
* // The `_.matches` iteratee shorthand.
* _.find(users, { 'age': 1, 'active': true });
* // => object for 'pebbles'
*
* // The `_.matchesProperty` iteratee shorthand.
* _.find(users, ['active', false]);
* // => object for 'fred'
*
* // The `_.property` iteratee shorthand.
* _.find(users, 'active');
* // => object for 'barney'
*/
var find = createFind(findIndex);
module.exports = find;
},{"./_createFind":49,"./findIndex":106}],106:[function(_dereq_,module,exports){
var baseFindIndex = _dereq_('./_baseFindIndex'),
baseIteratee = _dereq_('./_baseIteratee'),
toInteger = _dereq_('./toInteger');
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeMax = Math.max;
/**
* This method is like `_.find` except that it returns the index of the first
* element `predicate` returns truthy for instead of the element itself.
*
* @static
* @memberOf _
* @since 1.1.0
* @category Array
* @param {Array} array The array to inspect.
* @param {Function} [predicate=_.identity] The function invoked per iteration.
* @param {number} [fromIndex=0] The index to search from.
* @returns {number} Returns the index of the found element, else `-1`.
* @example
*
* var users = [
* { 'user': 'barney', 'active': false },
* { 'user': 'fred', 'active': false },
* { 'user': 'pebbles', 'active': true }
* ];
*
* _.findIndex(users, function(o) { return o.user == 'barney'; });
* // => 0
*
* // The `_.matches` iteratee shorthand.
* _.findIndex(users, { 'user': 'fred', 'active': false });
* // => 1
*
* // The `_.matchesProperty` iteratee shorthand.
* _.findIndex(users, ['active', false]);
* // => 0
*
* // The `_.property` iteratee shorthand.
* _.findIndex(users, 'active');
* // => 2
*/
function findIndex(array, predicate, fromIndex) {
var length = array == null ? 0 : array.length;
if (!length) {
return -1;
}
var index = fromIndex == null ? 0 : toInteger(fromIndex);
if (index < 0) {
index = nativeMax(length + index, 0);
}
return baseFindIndex(array, baseIteratee(predicate, 3), index);
}
module.exports = findIndex;
},{"./_baseFindIndex":26,"./_baseIteratee":37,"./toInteger":126}],107:[function(_dereq_,module,exports){
var baseGet = _dereq_('./_baseGet');
/**
* Gets the value at `path` of `object`. If the resolved value is
* `undefined`, the `defaultValue` is returned in its place.
*
* @static
* @memberOf _
* @since 3.7.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path of the property to get.
* @param {*} [defaultValue] The value returned for `undefined` resolved values.
* @returns {*} Returns the resolved value.
* @example
*
* var object = { 'a': [{ 'b': { 'c': 3 } }] };
*
* _.get(object, 'a[0].b.c');
* // => 3
*
* _.get(object, ['a', '0', 'b', 'c']);
* // => 3
*
* _.get(object, 'a.b.c', 'default');
* // => 'default'
*/
function get(object, path, defaultValue) {
var result = object == null ? undefined : baseGet(object, path);
return result === undefined ? defaultValue : result;
}
module.exports = get;
},{"./_baseGet":27}],108:[function(_dereq_,module,exports){
var baseHasIn = _dereq_('./_baseHasIn'),
hasPath = _dereq_('./_hasPath');
/**
* Checks if `path` is a direct or inherited property of `object`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Object
* @param {Object} object The object to query.
* @param {Array|string} path The path to check.
* @returns {boolean} Returns `true` if `path` exists, else `false`.
* @example
*
* var object = _.create({ 'a': _.create({ 'b': 2 }) });
*
* _.hasIn(object, 'a');
* // => true
*
* _.hasIn(object, 'a.b');
* // => true
*
* _.hasIn(object, ['a', 'b']);
* // => true
*
* _.hasIn(object, 'b');
* // => false
*/
function hasIn(object, path) {
return object != null && hasPath(object, path, baseHasIn);
}
module.exports = hasIn;
},{"./_baseHasIn":30,"./_hasPath":62}],109:[function(_dereq_,module,exports){
/**
* This method returns the first argument it receives.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Util
* @param {*} value Any value.
* @returns {*} Returns `value`.
* @example
*
* var object = { 'a': 1 };
*
* console.log(_.identity(object) === object);
* // => true
*/
function identity(value) {
return value;
}
module.exports = identity;
},{}],110:[function(_dereq_,module,exports){
var baseIsArguments = _dereq_('./_baseIsArguments'),
isObjectLike = _dereq_('./isObjectLike');
/** Used for built-in method references. */
var objectProto = Object.prototype;
/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;
/** Built-in value references. */
var propertyIsEnumerable = objectProto.propertyIsEnumerable;
/**
* Checks if `value` is likely an `arguments` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an `arguments` object,
* else `false`.
* @example
*
* _.isArguments(function() { return arguments; }());
* // => true
*
* _.isArguments([1, 2, 3]);
* // => false
*/
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
!propertyIsEnumerable.call(value, 'callee');
};
module.exports = isArguments;
},{"./_baseIsArguments":31,"./isObjectLike":117}],111:[function(_dereq_,module,exports){
/**
* Checks if `value` is classified as an `Array` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an array, else `false`.
* @example
*
* _.isArray([1, 2, 3]);
* // => true
*
* _.isArray(document.body.children);
* // => false
*
* _.isArray('abc');
* // => false
*
* _.isArray(_.noop);
* // => false
*/
var isArray = Array.isArray;
module.exports = isArray;
},{}],112:[function(_dereq_,module,exports){
var isFunction = _dereq_('./isFunction'),
isLength = _dereq_('./isLength');
/**
* Checks if `value` is array-like. A value is considered array-like if it's
* not a function and has a `value.length` that's an integer greater than or
* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is array-like, else `false`.
* @example
*
* _.isArrayLike([1, 2, 3]);
* // => true
*
* _.isArrayLike(document.body.children);
* // => true
*
* _.isArrayLike('abc');
* // => true
*
* _.isArrayLike(_.noop);
* // => false
*/
function isArrayLike(value) {
return value != null && isLength(value.length) && !isFunction(value);
}
module.exports = isArrayLike;
},{"./isFunction":114,"./isLength":115}],113:[function(_dereq_,module,exports){
var root = _dereq_('./_root'),
stubFalse = _dereq_('./stubFalse');
/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;
/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;
/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;
/**
* Checks if `value` is a buffer.
*
* @static
* @memberOf _
* @since 4.3.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
* @example
*
* _.isBuffer(new Buffer(2));
* // => true
*
* _.isBuffer(new Uint8Array(2));
* // => false
*/
var isBuffer = nativeIsBuffer || stubFalse;
module.exports = isBuffer;
},{"./_root":92,"./stubFalse":124}],114:[function(_dereq_,module,exports){
var baseGetTag = _dereq_('./_baseGetTag'),
isObject = _dereq_('./isObject');
/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]',
funcTag = '[object Function]',
genTag = '[object GeneratorFunction]',
proxyTag = '[object Proxy]';
/**
* Checks if `value` is classified as a `Function` object.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a function, else `false`.
* @example
*
* _.isFunction(_);
* // => true
*
* _.isFunction(/abc/);
* // => false
*/
function isFunction(value) {
if (!isObject(value)) {
return false;
}
// The use of `Object#toString` avoids issues with the `typeof` operator
// in Safari 9 which returns 'object' for typed arrays and other constructors.
var tag = baseGetTag(value);
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}
module.exports = isFunction;
},{"./_baseGetTag":29,"./isObject":116}],115:[function(_dereq_,module,exports){
/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;
/**
* Checks if `value` is a valid array-like length.
*
* **Note:** This method is loosely based on
* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
* @example
*
* _.isLength(3);
* // => true
*
* _.isLength(Number.MIN_VALUE);
* // => false
*
* _.isLength(Infinity);
* // => false
*
* _.isLength('3');
* // => false
*/
function isLength(value) {
return typeof value == 'number' &&
value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}
module.exports = isLength;
},{}],116:[function(_dereq_,module,exports){
/**
* Checks if `value` is the
* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
*
* @static
* @memberOf _
* @since 0.1.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is an object, else `false`.
* @example
*
* _.isObject({});
* // => true
*
* _.isObject([1, 2, 3]);
* // => true
*
* _.isObject(_.noop);
* // => true
*
* _.isObject(null);
* // => false
*/
function isObject(value) {
var type = typeof value;
return value != null && (type == 'object' || type == 'function');
}
module.exports = isObject;
},{}],117:[function(_dereq_,module,exports){
/**
* Checks if `value` is object-like. A value is object-like if it's not `null`
* and has a `typeof` result of "object".
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is object-like, else `false`.
* @example
*
* _.isObjectLike({});
* // => true
*
* _.isObjectLike([1, 2, 3]);
* // => true
*
* _.isObjectLike(_.noop);
* // => false
*
* _.isObjectLike(null);
* // => false
*/
function isObjectLike(value) {
return value != null && typeof value == 'object';
}
module.exports = isObjectLike;
},{}],118:[function(_dereq_,module,exports){
var baseGetTag = _dereq_('./_baseGetTag'),
isObjectLike = _dereq_('./isObjectLike');
/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';
/**
* Checks if `value` is classified as a `Symbol` primitive or object.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
* @example
*
* _.isSymbol(Symbol.iterator);
* // => true
*
* _.isSymbol('abc');
* // => false
*/
function isSymbol(value) {
return typeof value == 'symbol' ||
(isObjectLike(value) && baseGetTag(value) == symbolTag);
}
module.exports = isSymbol;
},{"./_baseGetTag":29,"./isObjectLike":117}],119:[function(_dereq_,module,exports){
var baseIsTypedArray = _dereq_('./_baseIsTypedArray'),
baseUnary = _dereq_('./_baseUnary'),
nodeUtil = _dereq_('./_nodeUtil');
/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
/**
* Checks if `value` is classified as a typed array.
*
* @static
* @memberOf _
* @since 3.0.0
* @category Lang
* @param {*} value The value to check.
* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
* @example
*
* _.isTypedArray(new Uint8Array);
* // => true
*
* _.isTypedArray([]);
* // => false
*/
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
module.exports = isTypedArray;
},{"./_baseIsTypedArray":36,"./_baseUnary":45,"./_nodeUtil":89}],120:[function(_dereq_,module,exports){
var arrayLikeKeys = _dereq_('./_arrayLikeKeys'),
baseKeys = _dereq_('./_baseKeys'),
isArrayLike = _dereq_('./isArrayLike');
/**
* Creates an array of the own enumerable property names of `object`.
*
* **Note:** Non-object values are coerced to objects. See the
* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
* for more details.
*
* @static
* @since 0.1.0
* @memberOf _
* @category Object
* @param {Object} object The object to query.
* @returns {Array} Returns the array of property names.
* @example
*
* function Foo() {
* this.a = 1;
* this.b = 2;
* }
*
* Foo.prototype.c = 3;
*
* _.keys(new Foo);
* // => ['a', 'b'] (iteration order is not guaranteed)
*
* _.keys('hi');
* // => ['0', '1']
*/
function keys(object) {
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}
module.exports = keys;
},{"./_arrayLikeKeys":21,"./_baseKeys":38,"./isArrayLike":112}],121:[function(_dereq_,module,exports){
var MapCache = _dereq_('./_MapCache');
/** Error message constants. */
var FUNC_ERROR_TEXT = 'Expected a function';
/**
* Creates a function that memoizes the result of `func`. If `resolver` is
* provided, it determines the cache key for storing the result based on the
* arguments provided to the memoized function. By default, the first argument
* provided to the memoized function is used as the map cache key. The `func`
* is invoked with the `this` binding of the memoized function.
*
* **Note:** The cache is exposed as the `cache` property on the memoized
* function. Its creation may be customized by replacing the `_.memoize.Cache`
* constructor with one whose instances implement the
* [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
* method interface of `clear`, `delete`, `get`, `has`, and `set`.
*
* @static
* @memberOf _
* @since 0.1.0
* @category Function
* @param {Function} func The function to have its output memoized.
* @param {Function} [resolver] The function to resolve the cache key.
* @returns {Function} Returns the new memoized function.
* @example
*
* var object = { 'a': 1, 'b': 2 };
* var other = { 'c': 3, 'd': 4 };
*
* var values = _.memoize(_.values);
* values(object);
* // => [1, 2]
*
* values(other);
* // => [3, 4]
*
* object.a = 2;
* values(object);
* // => [1, 2]
*
* // Modify the result cache.
* values.cache.set(object, ['a', 'b']);
* values(object);
* // => ['a', 'b']
*
* // Replace `_.memoize.Cache`.
* _.memoize.Cache = WeakMap;
*/
function memoize(func, resolver) {
if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
throw new TypeError(FUNC_ERROR_TEXT);
}
var memoized = function() {
var args = arguments,
key = resolver ? resolver.apply(this, args) : args[0],
cache = memoized.cache;
if (cache.has(key)) {
return cache.get(key);
}
var result = func.apply(this, args);
memoized.cache = cache.set(key, result) || cache;
return result;
};
memoized.cache = new (memoize.Cache || MapCache);
return memoized;
}
// Expose `MapCache`.
memoize.Cache = MapCache;
module.exports = memoize;
},{"./_MapCache":12}],122:[function(_dereq_,module,exports){
var baseProperty = _dereq_('./_baseProperty'),
basePropertyDeep = _dereq_('./_basePropertyDeep'),
isKey = _dereq_('./_isKey'),
toKey = _dereq_('./_toKey');
/**
* Creates a function that returns the value at `path` of a given object.
*
* @static
* @memberOf _
* @since 2.4.0
* @category Util
* @param {Array|string} path The path of the property to get.
* @returns {Function} Returns the new accessor function.
* @example
*
* var objects = [
* { 'a': { 'b': 2 } },
* { 'a': { 'b': 1 } }
* ];
*
* _.map(objects, _.property('a.b'));
* // => [2, 1]
*
* _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
* // => [1, 2]
*/
function property(path) {
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
}
module.exports = property;
},{"./_baseProperty":41,"./_basePropertyDeep":42,"./_isKey":69,"./_toKey":102}],123:[function(_dereq_,module,exports){
/**
* This method returns a new empty array.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {Array} Returns the new empty array.
* @example
*
* var arrays = _.times(2, _.stubArray);
*
* console.log(arrays);
* // => [[], []]
*
* console.log(arrays[0] === arrays[1]);
* // => false
*/
function stubArray() {
return [];
}
module.exports = stubArray;
},{}],124:[function(_dereq_,module,exports){
/**
* This method returns `false`.
*
* @static
* @memberOf _
* @since 4.13.0
* @category Util
* @returns {boolean} Returns `false`.
* @example
*
* _.times(2, _.stubFalse);
* // => [false, false]
*/
function stubFalse() {
return false;
}
module.exports = stubFalse;
},{}],125:[function(_dereq_,module,exports){
var toNumber = _dereq_('./toNumber');
/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0,
MAX_INTEGER = 1.7976931348623157e+308;
/**
* Converts `value` to a finite number.
*
* @static
* @memberOf _
* @since 4.12.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted number.
* @example
*
* _.toFinite(3.2);
* // => 3.2
*
* _.toFinite(Number.MIN_VALUE);
* // => 5e-324
*
* _.toFinite(Infinity);
* // => 1.7976931348623157e+308
*
* _.toFinite('3.2');
* // => 3.2
*/
function toFinite(value) {
if (!value) {
return value === 0 ? value : 0;
}
value = toNumber(value);
if (value === INFINITY || value === -INFINITY) {
var sign = (value < 0 ? -1 : 1);
return sign * MAX_INTEGER;
}
return value === value ? value : 0;
}
module.exports = toFinite;
},{"./toNumber":127}],126:[function(_dereq_,module,exports){
var toFinite = _dereq_('./toFinite');
/**
* Converts `value` to an integer.
*
* **Note:** This method is loosely based on
* [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {number} Returns the converted integer.
* @example
*
* _.toInteger(3.2);
* // => 3
*
* _.toInteger(Number.MIN_VALUE);
* // => 0
*
* _.toInteger(Infinity);
* // => 1.7976931348623157e+308
*
* _.toInteger('3.2');
* // => 3
*/
function toInteger(value) {
var result = toFinite(value),
remainder = result % 1;
return result === result ? (remainder ? result - remainder : result) : 0;
}
module.exports = toInteger;
},{"./toFinite":125}],127:[function(_dereq_,module,exports){
var isObject = _dereq_('./isObject'),
isSymbol = _dereq_('./isSymbol');
/** Used as references for various `Number` constants. */
var NAN = 0 / 0;
/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;
/** Used to detect bad signed hexadecimal string values. */
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
/** Used to detect binary string values. */
var reIsBinary = /^0b[01]+$/i;
/** Used to detect octal string values. */
var reIsOctal = /^0o[0-7]+$/i;
/** Built-in method references without a dependency on `root`. */
var freeParseInt = parseInt;
/**
* Converts `value` to a number.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to process.
* @returns {number} Returns the number.
* @example
*
* _.toNumber(3.2);
* // => 3.2
*
* _.toNumber(Number.MIN_VALUE);
* // => 5e-324
*
* _.toNumber(Infinity);
* // => Infinity
*
* _.toNumber('3.2');
* // => 3.2
*/
function toNumber(value) {
if (typeof value == 'number') {
return value;
}
if (isSymbol(value)) {
return NAN;
}
if (isObject(value)) {
var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
value = isObject(other) ? (other + '') : other;
}
if (typeof value != 'string') {
return value === 0 ? value : +value;
}
value = value.replace(reTrim, '');
var isBinary = reIsBinary.test(value);
return (isBinary || reIsOctal.test(value))
? freeParseInt(value.slice(2), isBinary ? 2 : 8)
: (reIsBadHex.test(value) ? NAN : +value);
}
module.exports = toNumber;
},{"./isObject":116,"./isSymbol":118}],128:[function(_dereq_,module,exports){
var baseToString = _dereq_('./_baseToString');
/**
* Converts `value` to a string. An empty string is returned for `null`
* and `undefined` values. The sign of `-0` is preserved.
*
* @static
* @memberOf _
* @since 4.0.0
* @category Lang
* @param {*} value The value to convert.
* @returns {string} Returns the converted string.
* @example
*
* _.toString(null);
* // => ''
*
* _.toString(-0);
* // => '-0'
*
* _.toString([1, 2, 3]);
* // => '1,2,3'
*/
function toString(value) {
return value == null ? '' : baseToString(value);
}
module.exports = toString;
},{"./_baseToString":44}],129:[function(_dereq_,module,exports){
function select(element) {
var selectedText;
if (element.nodeName === 'SELECT') {
element.focus();
selectedText = element.value;
}
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
var isReadOnly = element.hasAttribute('readonly');
if (!isReadOnly) {
element.setAttribute('readonly', '');
}
element.select();
element.setSelectionRange(0, element.value.length);
if (!isReadOnly) {
element.removeAttribute('readonly');
}
selectedText = element.value;
}
else {
if (element.hasAttribute('contenteditable')) {
element.focus();
}
var selection = window.getSelection();
var range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
selectedText = selection.toString();
}
return selectedText;
}
module.exports = select;
},{}],130:[function(_dereq_,module,exports){
function E () {
// Keep this empty so it's easier to inherit from
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
}
E.prototype = {
on: function (name, callback, ctx) {
var e = this.e || (this.e = {});
(e[name] || (e[name] = [])).push({
fn: callback,
ctx: ctx
});
return this;
},
once: function (name, callback, ctx) {
var self = this;
function listener () {
self.off(name, listener);
callback.apply(ctx, arguments);
};
listener._ = callback
return this.on(name, listener, ctx);
},
emit: function (name) {
var data = [].slice.call(arguments, 1);
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
var i = 0;
var len = evtArr.length;
for (i; i < len; i++) {
evtArr[i].fn.apply(evtArr[i].ctx, data);
}
return this;
},
off: function (name, callback) {
var e = this.e || (this.e = {});
var evts = e[name];
var liveEvents = [];
if (evts && callback) {
for (var i = 0, len = evts.length; i < len; i++) {
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
liveEvents.push(evts[i]);
}
}
// Remove event from queue to prevent memory leak
// Suggested by https://github.com/lazd
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
(liveEvents.length)
? e[name] = liveEvents
: delete e[name];
return this;
}
};
module.exports = E;
},{}],131:[function(_dereq_,module,exports){
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Default exports for Node. Export the extended versions of VTTCue and
// VTTRegion in Node since we likely want the capability to convert back and
// forth between JSON. If we don't then it's not that big of a deal since we're
// off browser.
var vttjs = module.exports = {
WebVTT: _dereq_("./vtt.js").WebVTT,
VTTCue: _dereq_("./vttcue-extended.js").VTTCue,
VTTRegion: _dereq_("./vttregion-extended.js").VTTRegion
};
window.vttjs = vttjs;
window.WebVTT = vttjs.WebVTT;
var cueShim = vttjs.VTTCue;
var regionShim = vttjs.VTTRegion;
var nativeVTTCue = window.VTTCue;
var nativeVTTRegion = window.VTTRegion;
vttjs.shim = function() {
window.VTTCue = cueShim;
window.VTTRegion = regionShim;
};
vttjs.restore = function() {
window.VTTCue = nativeVTTCue;
window.VTTRegion = nativeVTTRegion;
};
if (!window.VTTCue) {
vttjs.shim();
}
},{"./vtt.js":132,"./vttcue-extended.js":133,"./vttregion-extended.js":135}],132:[function(_dereq_,module,exports){
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
(function(global) {
var _objCreate = Object.create || (function() {
function F() {}
return function(o) {
if (arguments.length !== 1) {
throw new Error('Object.create shim only accepts one parameter.');
}
F.prototype = o;
return new F();
};
})();
// Creates a new ParserError object from an errorData object. The errorData
// object should have default code and message properties. The default message
// property can be overriden by passing in a message parameter.
// See ParsingError.Errors below for acceptable errors.
function ParsingError(errorData, message) {
this.name = "ParsingError";
this.code = errorData.code;
this.message = message || errorData.message;
}
ParsingError.prototype = _objCreate(Error.prototype);
ParsingError.prototype.constructor = ParsingError;
// ParsingError metadata for acceptable ParsingErrors.
ParsingError.Errors = {
BadSignature: {
code: 0,
message: "Malformed WebVTT signature."
},
BadTimeStamp: {
code: 1,
message: "Malformed time stamp."
}
};
// Try to parse input as a time stamp.
function parseTimeStamp(input) {
function computeSeconds(h, m, s, f) {
return (h | 0) * 3600 + (m | 0) * 60 + (s | 0) + (f | 0) / 1000;
}
var m = input.match(/^(\d+):(\d{2})(:\d{2})?\.(\d{3})/);
if (!m) {
return null;
}
if (m[3]) {
// Timestamp takes the form of [hours]:[minutes]:[seconds].[milliseconds]
return computeSeconds(m[1], m[2], m[3].replace(":", ""), m[4]);
} else if (m[1] > 59) {
// Timestamp takes the form of [hours]:[minutes].[milliseconds]
// First position is hours as it's over 59.
return computeSeconds(m[1], m[2], 0, m[4]);
} else {
// Timestamp takes the form of [minutes]:[seconds].[milliseconds]
return computeSeconds(0, m[1], m[2], m[4]);
}
}
// A settings object holds key/value pairs and will ignore anything but the first
// assignment to a specific key.
function Settings() {
this.values = _objCreate(null);
}
Settings.prototype = {
// Only accept the first assignment to any key.
set: function(k, v) {
if (!this.get(k) && v !== "") {
this.values[k] = v;
}
},
// Return the value for a key, or a default value.
// If 'defaultKey' is passed then 'dflt' is assumed to be an object with
// a number of possible default values as properties where 'defaultKey' is
// the key of the property that will be chosen; otherwise it's assumed to be
// a single value.
get: function(k, dflt, defaultKey) {
if (defaultKey) {
return this.has(k) ? this.values[k] : dflt[defaultKey];
}
return this.has(k) ? this.values[k] : dflt;
},
// Check whether we have a value for a key.
has: function(k) {
return k in this.values;
},
// Accept a setting if its one of the given alternatives.
alt: function(k, v, a) {
for (var n = 0; n < a.length; ++n) {
if (v === a[n]) {
this.set(k, v);
break;
}
}
},
// Accept a setting if its a valid (signed) integer.
integer: function(k, v) {
if (/^-?\d+$/.test(v)) { // integer
this.set(k, parseInt(v, 10));
}
},
// Accept a setting if its a valid percentage.
percent: function(k, v) {
var m;
if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) {
v = parseFloat(v);
if (v >= 0 && v <= 100) {
this.set(k, v);
return true;
}
}
return false;
}
};
// Helper function to parse input into groups separated by 'groupDelim', and
// interprete each group as a key/value pair separated by 'keyValueDelim'.
function parseOptions(input, callback, keyValueDelim, groupDelim) {
var groups = groupDelim ? input.split(groupDelim) : [input];
for (var i in groups) {
if (typeof groups[i] !== "string") {
continue;
}
var kv = groups[i].split(keyValueDelim);
if (kv.length !== 2) {
continue;
}
var k = kv[0];
var v = kv[1];
callback(k, v);
}
}
function parseCue(input, cue, regionList) {
// Remember the original input if we need to throw an error.
var oInput = input;
// 4.1 WebVTT timestamp
function consumeTimeStamp() {
var ts = parseTimeStamp(input);
if (ts === null) {
throw new ParsingError(ParsingError.Errors.BadTimeStamp,
"Malformed timestamp: " + oInput);
}
// Remove time stamp from input.
input = input.replace(/^[^\sa-zA-Z-]+/, "");
return ts;
}
// 4.4.2 WebVTT cue settings
function consumeCueSettings(input, cue) {
var settings = new Settings();
parseOptions(input, function (k, v) {
switch (k) {
case "region":
// Find the last region we parsed with the same region id.
for (var i = regionList.length - 1; i >= 0; i--) {
if (regionList[i].id === v) {
settings.set(k, regionList[i].region);
break;
}
}
break;
case "vertical":
settings.alt(k, v, ["rl", "lr"]);
break;
case "line":
var vals = v.split(","),
vals0 = vals[0];
settings.integer(k, vals0);
settings.percent(k, vals0) ? settings.set("snapToLines", false) : null;
settings.alt(k, vals0, ["auto"]);
if (vals.length === 2) {
settings.alt("lineAlign", vals[1], ["start", "middle", "end"]);
}
break;
case "position":
vals = v.split(",");
settings.percent(k, vals[0]);
if (vals.length === 2) {
settings.alt("positionAlign", vals[1], ["start", "middle", "end"]);
}
break;
case "size":
settings.percent(k, v);
break;
case "align":
settings.alt(k, v, ["start", "middle", "end", "left", "right"]);
break;
}
}, /:/, /\s/);
// Apply default values for any missing fields.
cue.region = settings.get("region", null);
cue.vertical = settings.get("vertical", "");
cue.line = settings.get("line", "auto");
cue.lineAlign = settings.get("lineAlign", "start");
cue.snapToLines = settings.get("snapToLines", true);
cue.size = settings.get("size", 100);
cue.align = settings.get("align", "middle");
cue.position = settings.get("position", {
start: 0,
left: 0,
middle: 50,
end: 100,
right: 100
}, cue.align);
cue.positionAlign = settings.get("positionAlign", {
start: "start",
left: "start",
middle: "middle",
end: "end",
right: "end"
}, cue.align);
}
function skipWhitespace() {
input = input.replace(/^\s+/, "");
}
// 4.1 WebVTT cue timings.
skipWhitespace();
cue.startTime = consumeTimeStamp(); // (1) collect cue start time
skipWhitespace();
if (input.substr(0, 3) !== "-->") { // (3) next characters must match "-->"
throw new ParsingError(ParsingError.Errors.BadTimeStamp,
"Malformed time stamp (time stamps must be separated by '-->'): " +
oInput);
}
input = input.substr(3);
skipWhitespace();
cue.endTime = consumeTimeStamp(); // (5) collect cue end time
// 4.1 WebVTT cue settings list.
skipWhitespace();
consumeCueSettings(input, cue);
}
var ESCAPE = {
"&": "&",
"<": "<",
">": ">",
"": "\u200e",
"": "\u200f",
" ": "\u00a0"
};
var TAG_NAME = {
c: "span",
i: "i",
b: "b",
u: "u",
ruby: "ruby",
rt: "rt",
v: "span",
lang: "span"
};
var TAG_ANNOTATION = {
v: "title",
lang: "lang"
};
var NEEDS_PARENT = {
rt: "ruby"
};
// Parse content into a document fragment.
function parseContent(window, input) {
function nextToken() {
// Check for end-of-string.
if (!input) {
return null;
}
// Consume 'n' characters from the input.
function consume(result) {
input = input.substr(result.length);
return result;
}
var m = input.match(/^([^<]*)(<[^>]+>?)?/);
// If there is some text before the next tag, return it, otherwise return
// the tag.
return consume(m[1] ? m[1] : m[2]);
}
// Unescape a string 's'.
function unescape1(e) {
return ESCAPE[e];
}
function unescape(s) {
while ((m = s.match(/&(amp|lt|gt|lrm|rlm|nbsp);/))) {
s = s.replace(m[0], unescape1);
}
return s;
}
function shouldAdd(current, element) {
return !NEEDS_PARENT[element.localName] ||
NEEDS_PARENT[element.localName] === current.localName;
}
// Create an element for this tag.
function createElement(type, annotation) {
var tagName = TAG_NAME[type];
if (!tagName) {
return null;
}
var element = window.document.createElement(tagName);
element.localName = tagName;
var name = TAG_ANNOTATION[type];
if (name && annotation) {
element[name] = annotation.trim();
}
return element;
}
var rootDiv = window.document.createElement("div"),
current = rootDiv,
t,
tagStack = [];
while ((t = nextToken()) !== null) {
if (t[0] === '<') {
if (t[1] === "/") {
// If the closing tag matches, move back up to the parent node.
if (tagStack.length &&
tagStack[tagStack.length - 1] === t.substr(2).replace(">", "")) {
tagStack.pop();
current = current.parentNode;
}
// Otherwise just ignore the end tag.
continue;
}
var ts = parseTimeStamp(t.substr(1, t.length - 2));
var node;
if (ts) {
// Timestamps are lead nodes as well.
node = window.document.createProcessingInstruction("timestamp", ts);
current.appendChild(node);
continue;
}
var m = t.match(/^<([^.\s/0-9>]+)(\.[^\s\\>]+)?([^>\\]+)?(\\?)>?$/);
// If we can't parse the tag, skip to the next tag.
if (!m) {
continue;
}
// Try to construct an element, and ignore the tag if we couldn't.
node = createElement(m[1], m[3]);
if (!node) {
continue;
}
// Determine if the tag should be added based on the context of where it
// is placed in the cuetext.
if (!shouldAdd(current, node)) {
continue;
}
// Set the class list (as a list of classes, separated by space).
if (m[2]) {
node.className = m[2].substr(1).replace('.', ' ');
}
// Append the node to the current node, and enter the scope of the new
// node.
tagStack.push(m[1]);
current.appendChild(node);
current = node;
continue;
}
// Text nodes are leaf nodes.
current.appendChild(window.document.createTextNode(unescape(t)));
}
return rootDiv;
}
// This is a list of all the Unicode characters that have a strong
// right-to-left category. What this means is that these characters are
// written right-to-left for sure. It was generated by pulling all the strong
// right-to-left characters out of the Unicode data table. That table can
// found at: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt
var strongRTLRanges = [[0x5be, 0x5be], [0x5c0, 0x5c0], [0x5c3, 0x5c3], [0x5c6, 0x5c6],
[0x5d0, 0x5ea], [0x5f0, 0x5f4], [0x608, 0x608], [0x60b, 0x60b], [0x60d, 0x60d],
[0x61b, 0x61b], [0x61e, 0x64a], [0x66d, 0x66f], [0x671, 0x6d5], [0x6e5, 0x6e6],
[0x6ee, 0x6ef], [0x6fa, 0x70d], [0x70f, 0x710], [0x712, 0x72f], [0x74d, 0x7a5],
[0x7b1, 0x7b1], [0x7c0, 0x7ea], [0x7f4, 0x7f5], [0x7fa, 0x7fa], [0x800, 0x815],
[0x81a, 0x81a], [0x824, 0x824], [0x828, 0x828], [0x830, 0x83e], [0x840, 0x858],
[0x85e, 0x85e], [0x8a0, 0x8a0], [0x8a2, 0x8ac], [0x200f, 0x200f],
[0xfb1d, 0xfb1d], [0xfb1f, 0xfb28], [0xfb2a, 0xfb36], [0xfb38, 0xfb3c],
[0xfb3e, 0xfb3e], [0xfb40, 0xfb41], [0xfb43, 0xfb44], [0xfb46, 0xfbc1],
[0xfbd3, 0xfd3d], [0xfd50, 0xfd8f], [0xfd92, 0xfdc7], [0xfdf0, 0xfdfc],
[0xfe70, 0xfe74], [0xfe76, 0xfefc], [0x10800, 0x10805], [0x10808, 0x10808],
[0x1080a, 0x10835], [0x10837, 0x10838], [0x1083c, 0x1083c], [0x1083f, 0x10855],
[0x10857, 0x1085f], [0x10900, 0x1091b], [0x10920, 0x10939], [0x1093f, 0x1093f],
[0x10980, 0x109b7], [0x109be, 0x109bf], [0x10a00, 0x10a00], [0x10a10, 0x10a13],
[0x10a15, 0x10a17], [0x10a19, 0x10a33], [0x10a40, 0x10a47], [0x10a50, 0x10a58],
[0x10a60, 0x10a7f], [0x10b00, 0x10b35], [0x10b40, 0x10b55], [0x10b58, 0x10b72],
[0x10b78, 0x10b7f], [0x10c00, 0x10c48], [0x1ee00, 0x1ee03], [0x1ee05, 0x1ee1f],
[0x1ee21, 0x1ee22], [0x1ee24, 0x1ee24], [0x1ee27, 0x1ee27], [0x1ee29, 0x1ee32],
[0x1ee34, 0x1ee37], [0x1ee39, 0x1ee39], [0x1ee3b, 0x1ee3b], [0x1ee42, 0x1ee42],
[0x1ee47, 0x1ee47], [0x1ee49, 0x1ee49], [0x1ee4b, 0x1ee4b], [0x1ee4d, 0x1ee4f],
[0x1ee51, 0x1ee52], [0x1ee54, 0x1ee54], [0x1ee57, 0x1ee57], [0x1ee59, 0x1ee59],
[0x1ee5b, 0x1ee5b], [0x1ee5d, 0x1ee5d], [0x1ee5f, 0x1ee5f], [0x1ee61, 0x1ee62],
[0x1ee64, 0x1ee64], [0x1ee67, 0x1ee6a], [0x1ee6c, 0x1ee72], [0x1ee74, 0x1ee77],
[0x1ee79, 0x1ee7c], [0x1ee7e, 0x1ee7e], [0x1ee80, 0x1ee89], [0x1ee8b, 0x1ee9b],
[0x1eea1, 0x1eea3], [0x1eea5, 0x1eea9], [0x1eeab, 0x1eebb], [0x10fffd, 0x10fffd]];
function isStrongRTLChar(charCode) {
for (var i = 0; i < strongRTLRanges.length; i++) {
var currentRange = strongRTLRanges[i];
if (charCode >= currentRange[0] && charCode <= currentRange[1]) {
return true;
}
}
return false;
}
function determineBidi(cueDiv) {
var nodeStack = [],
text = "",
charCode;
if (!cueDiv || !cueDiv.childNodes) {
return "ltr";
}
function pushNodes(nodeStack, node) {
for (var i = node.childNodes.length - 1; i >= 0; i--) {
nodeStack.push(node.childNodes[i]);
}
}
function nextTextNode(nodeStack) {
if (!nodeStack || !nodeStack.length) {
return null;
}
var node = nodeStack.pop(),
text = node.textContent || node.innerText;
if (text) {
// TODO: This should match all unicode type B characters (paragraph
// separator characters). See issue #115.
var m = text.match(/^.*(\n|\r)/);
if (m) {
nodeStack.length = 0;
return m[0];
}
return text;
}
if (node.tagName === "ruby") {
return nextTextNode(nodeStack);
}
if (node.childNodes) {
pushNodes(nodeStack, node);
return nextTextNode(nodeStack);
}
}
pushNodes(nodeStack, cueDiv);
while ((text = nextTextNode(nodeStack))) {
for (var i = 0; i < text.length; i++) {
charCode = text.charCodeAt(i);
if (isStrongRTLChar(charCode)) {
return "rtl";
}
}
}
return "ltr";
}
function computeLinePos(cue) {
if (typeof cue.line === "number" &&
(cue.snapToLines || (cue.line >= 0 && cue.line <= 100))) {
return cue.line;
}
if (!cue.track || !cue.track.textTrackList ||
!cue.track.textTrackList.mediaElement) {
return -1;
}
var track = cue.track,
trackList = track.textTrackList,
count = 0;
for (var i = 0; i < trackList.length && trackList[i] !== track; i++) {
if (trackList[i].mode === "showing") {
count++;
}
}
return ++count * -1;
}
function StyleBox() {
}
// Apply styles to a div. If there is no div passed then it defaults to the
// div on 'this'.
StyleBox.prototype.applyStyles = function(styles, div) {
div = div || this.div;
for (var prop in styles) {
if (styles.hasOwnProperty(prop)) {
div.style[prop] = styles[prop];
}
}
};
StyleBox.prototype.formatStyle = function(val, unit) {
return val === 0 ? 0 : val + unit;
};
// Constructs the computed display state of the cue (a div). Places the div
// into the overlay which should be a block level element (usually a div).
function CueStyleBox(window, cue, styleOptions) {
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
var color = "rgba(255, 255, 255, 1)";
var backgroundColor = "rgba(0, 0, 0, 0.8)";
if (isIE8) {
color = "rgb(255, 255, 255)";
backgroundColor = "rgb(0, 0, 0)";
}
StyleBox.call(this);
this.cue = cue;
// Parse our cue's text into a DOM tree rooted at 'cueDiv'. This div will
// have inline positioning and will function as the cue background box.
this.cueDiv = parseContent(window, cue.text);
var styles = {
color: color,
backgroundColor: backgroundColor,
position: "relative",
left: 0,
right: 0,
top: 0,
bottom: 0,
display: "inline"
};
if (!isIE8) {
styles.writingMode = cue.vertical === "" ? "horizontal-tb"
: cue.vertical === "lr" ? "vertical-lr"
: "vertical-rl";
styles.unicodeBidi = "plaintext";
}
this.applyStyles(styles, this.cueDiv);
// Create an absolutely positioned div that will be used to position the cue
// div. Note, all WebVTT cue-setting alignments are equivalent to the CSS
// mirrors of them except "middle" which is "center" in CSS.
this.div = window.document.createElement("div");
styles = {
textAlign: cue.align === "middle" ? "center" : cue.align,
font: styleOptions.font,
whiteSpace: "pre-line",
position: "absolute"
};
if (!isIE8) {
styles.direction = determineBidi(this.cueDiv);
styles.writingMode = cue.vertical === "" ? "horizontal-tb"
: cue.vertical === "lr" ? "vertical-lr"
: "vertical-rl".
stylesunicodeBidi = "plaintext";
}
this.applyStyles(styles);
this.div.appendChild(this.cueDiv);
// Calculate the distance from the reference edge of the viewport to the text
// position of the cue box. The reference edge will be resolved later when
// the box orientation styles are applied.
var textPos = 0;
switch (cue.positionAlign) {
case "start":
textPos = cue.position;
break;
case "middle":
textPos = cue.position - (cue.size / 2);
break;
case "end":
textPos = cue.position - cue.size;
break;
}
// Horizontal box orientation; textPos is the distance from the left edge of the
// area to the left edge of the box and cue.size is the distance extending to
// the right from there.
if (cue.vertical === "") {
this.applyStyles({
left: this.formatStyle(textPos, "%"),
width: this.formatStyle(cue.size, "%")
});
// Vertical box orientation; textPos is the distance from the top edge of the
// area to the top edge of the box and cue.size is the height extending
// downwards from there.
} else {
this.applyStyles({
top: this.formatStyle(textPos, "%"),
height: this.formatStyle(cue.size, "%")
});
}
this.move = function(box) {
this.applyStyles({
top: this.formatStyle(box.top, "px"),
bottom: this.formatStyle(box.bottom, "px"),
left: this.formatStyle(box.left, "px"),
right: this.formatStyle(box.right, "px"),
height: this.formatStyle(box.height, "px"),
width: this.formatStyle(box.width, "px")
});
};
}
CueStyleBox.prototype = _objCreate(StyleBox.prototype);
CueStyleBox.prototype.constructor = CueStyleBox;
// Represents the co-ordinates of an Element in a way that we can easily
// compute things with such as if it overlaps or intersects with another Element.
// Can initialize it with either a StyleBox or another BoxPosition.
function BoxPosition(obj) {
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
// Either a BoxPosition was passed in and we need to copy it, or a StyleBox
// was passed in and we need to copy the results of 'getBoundingClientRect'
// as the object returned is readonly. All co-ordinate values are in reference
// to the viewport origin (top left).
var lh, height, width, top;
if (obj.div) {
height = obj.div.offsetHeight;
width = obj.div.offsetWidth;
top = obj.div.offsetTop;
var rects = (rects = obj.div.childNodes) && (rects = rects[0]) &&
rects.getClientRects && rects.getClientRects();
obj = obj.div.getBoundingClientRect();
// In certain cases the outter div will be slightly larger then the sum of
// the inner div's lines. This could be due to bold text, etc, on some platforms.
// In this case we should get the average line height and use that. This will
// result in the desired behaviour.
lh = rects ? Math.max((rects[0] && rects[0].height) || 0, obj.height / rects.length)
: 0;
}
this.left = obj.left;
this.right = obj.right;
this.top = obj.top || top;
this.height = obj.height || height;
this.bottom = obj.bottom || (top + (obj.height || height));
this.width = obj.width || width;
this.lineHeight = lh !== undefined ? lh : obj.lineHeight;
if (isIE8 && !this.lineHeight) {
this.lineHeight = 13;
}
}
// Move the box along a particular axis. Optionally pass in an amount to move
// the box. If no amount is passed then the default is the line height of the
// box.
BoxPosition.prototype.move = function(axis, toMove) {
toMove = toMove !== undefined ? toMove : this.lineHeight;
switch (axis) {
case "+x":
this.left += toMove;
this.right += toMove;
break;
case "-x":
this.left -= toMove;
this.right -= toMove;
break;
case "+y":
this.top += toMove;
this.bottom += toMove;
break;
case "-y":
this.top -= toMove;
this.bottom -= toMove;
break;
}
};
// Check if this box overlaps another box, b2.
BoxPosition.prototype.overlaps = function(b2) {
return this.left < b2.right &&
this.right > b2.left &&
this.top < b2.bottom &&
this.bottom > b2.top;
};
// Check if this box overlaps any other boxes in boxes.
BoxPosition.prototype.overlapsAny = function(boxes) {
for (var i = 0; i < boxes.length; i++) {
if (this.overlaps(boxes[i])) {
return true;
}
}
return false;
};
// Check if this box is within another box.
BoxPosition.prototype.within = function(container) {
return this.top >= container.top &&
this.bottom <= container.bottom &&
this.left >= container.left &&
this.right <= container.right;
};
// Check if this box is entirely within the container or it is overlapping
// on the edge opposite of the axis direction passed. For example, if "+x" is
// passed and the box is overlapping on the left edge of the container, then
// return true.
BoxPosition.prototype.overlapsOppositeAxis = function(container, axis) {
switch (axis) {
case "+x":
return this.left < container.left;
case "-x":
return this.right > container.right;
case "+y":
return this.top < container.top;
case "-y":
return this.bottom > container.bottom;
}
};
// Find the percentage of the area that this box is overlapping with another
// box.
BoxPosition.prototype.intersectPercentage = function(b2) {
var x = Math.max(0, Math.min(this.right, b2.right) - Math.max(this.left, b2.left)),
y = Math.max(0, Math.min(this.bottom, b2.bottom) - Math.max(this.top, b2.top)),
intersectArea = x * y;
return intersectArea / (this.height * this.width);
};
// Convert the positions from this box to CSS compatible positions using
// the reference container's positions. This has to be done because this
// box's positions are in reference to the viewport origin, whereas, CSS
// values are in referecne to their respective edges.
BoxPosition.prototype.toCSSCompatValues = function(reference) {
return {
top: this.top - reference.top,
bottom: reference.bottom - this.bottom,
left: this.left - reference.left,
right: reference.right - this.right,
height: this.height,
width: this.width
};
};
// Get an object that represents the box's position without anything extra.
// Can pass a StyleBox, HTMLElement, or another BoxPositon.
BoxPosition.getSimpleBoxPosition = function(obj) {
var height = obj.div ? obj.div.offsetHeight : obj.tagName ? obj.offsetHeight : 0;
var width = obj.div ? obj.div.offsetWidth : obj.tagName ? obj.offsetWidth : 0;
var top = obj.div ? obj.div.offsetTop : obj.tagName ? obj.offsetTop : 0;
obj = obj.div ? obj.div.getBoundingClientRect() :
obj.tagName ? obj.getBoundingClientRect() : obj;
var ret = {
left: obj.left,
right: obj.right,
top: obj.top || top,
height: obj.height || height,
bottom: obj.bottom || (top + (obj.height || height)),
width: obj.width || width
};
return ret;
};
// Move a StyleBox to its specified, or next best, position. The containerBox
// is the box that contains the StyleBox, such as a div. boxPositions are
// a list of other boxes that the styleBox can't overlap with.
function moveBoxToLinePosition(window, styleBox, containerBox, boxPositions) {
// Find the best position for a cue box, b, on the video. The axis parameter
// is a list of axis, the order of which, it will move the box along. For example:
// Passing ["+x", "-x"] will move the box first along the x axis in the positive
// direction. If it doesn't find a good position for it there it will then move
// it along the x axis in the negative direction.
function findBestPosition(b, axis) {
var bestPosition,
specifiedPosition = new BoxPosition(b),
percentage = 1; // Highest possible so the first thing we get is better.
for (var i = 0; i < axis.length; i++) {
while (b.overlapsOppositeAxis(containerBox, axis[i]) ||
(b.within(containerBox) && b.overlapsAny(boxPositions))) {
b.move(axis[i]);
}
// We found a spot where we aren't overlapping anything. This is our
// best position.
if (b.within(containerBox)) {
return b;
}
var p = b.intersectPercentage(containerBox);
// If we're outside the container box less then we were on our last try
// then remember this position as the best position.
if (percentage > p) {
bestPosition = new BoxPosition(b);
percentage = p;
}
// Reset the box position to the specified position.
b = new BoxPosition(specifiedPosition);
}
return bestPosition || specifiedPosition;
}
var boxPosition = new BoxPosition(styleBox),
cue = styleBox.cue,
linePos = computeLinePos(cue),
axis = [];
// If we have a line number to align the cue to.
if (cue.snapToLines) {
var size;
switch (cue.vertical) {
case "":
axis = [ "+y", "-y" ];
size = "height";
break;
case "rl":
axis = [ "+x", "-x" ];
size = "width";
break;
case "lr":
axis = [ "-x", "+x" ];
size = "width";
break;
}
var step = boxPosition.lineHeight,
position = step * Math.round(linePos),
maxPosition = containerBox[size] + step,
initialAxis = axis[0];
// If the specified intial position is greater then the max position then
// clamp the box to the amount of steps it would take for the box to
// reach the max position.
if (Math.abs(position) > maxPosition) {
position = position < 0 ? -1 : 1;
position *= Math.ceil(maxPosition / step) * step;
}
// If computed line position returns negative then line numbers are
// relative to the bottom of the video instead of the top. Therefore, we
// need to increase our initial position by the length or width of the
// video, depending on the writing direction, and reverse our axis directions.
if (linePos < 0) {
position += cue.vertical === "" ? containerBox.height : containerBox.width;
axis = axis.reverse();
}
// Move the box to the specified position. This may not be its best
// position.
boxPosition.move(initialAxis, position);
} else {
// If we have a percentage line value for the cue.
var calculatedPercentage = (boxPosition.lineHeight / containerBox.height) * 100;
switch (cue.lineAlign) {
case "middle":
linePos -= (calculatedPercentage / 2);
break;
case "end":
linePos -= calculatedPercentage;
break;
}
// Apply initial line position to the cue box.
switch (cue.vertical) {
case "":
styleBox.applyStyles({
top: styleBox.formatStyle(linePos, "%")
});
break;
case "rl":
styleBox.applyStyles({
left: styleBox.formatStyle(linePos, "%")
});
break;
case "lr":
styleBox.applyStyles({
right: styleBox.formatStyle(linePos, "%")
});
break;
}
axis = [ "+y", "-x", "+x", "-y" ];
// Get the box position again after we've applied the specified positioning
// to it.
boxPosition = new BoxPosition(styleBox);
}
var bestPosition = findBestPosition(boxPosition, axis);
styleBox.move(bestPosition.toCSSCompatValues(containerBox));
}
function WebVTT() {
// Nothing
}
// Helper to allow strings to be decoded instead of the default binary utf8 data.
WebVTT.StringDecoder = function() {
return {
decode: function(data) {
if (!data) {
return "";
}
if (typeof data !== "string") {
throw new Error("Error - expected string data.");
}
return decodeURIComponent(encodeURIComponent(data));
}
};
};
WebVTT.convertCueToDOMTree = function(window, cuetext) {
if (!window || !cuetext) {
return null;
}
return parseContent(window, cuetext);
};
var FONT_SIZE_PERCENT = 0.05;
var FONT_STYLE = "sans-serif";
var CUE_BACKGROUND_PADDING = "1.5%";
// Runs the processing model over the cues and regions passed to it.
// @param overlay A block level element (usually a div) that the computed cues
// and regions will be placed into.
WebVTT.processCues = function(window, cues, overlay) {
if (!window || !cues || !overlay) {
return null;
}
// Remove all previous children.
while (overlay.firstChild) {
overlay.removeChild(overlay.firstChild);
}
var paddedOverlay = window.document.createElement("div");
paddedOverlay.style.position = "absolute";
paddedOverlay.style.left = "0";
paddedOverlay.style.right = "0";
paddedOverlay.style.top = "0";
paddedOverlay.style.bottom = "0";
paddedOverlay.style.margin = CUE_BACKGROUND_PADDING;
overlay.appendChild(paddedOverlay);
// Determine if we need to compute the display states of the cues. This could
// be the case if a cue's state has been changed since the last computation or
// if it has not been computed yet.
function shouldCompute(cues) {
for (var i = 0; i < cues.length; i++) {
if (cues[i].hasBeenReset || !cues[i].displayState) {
return true;
}
}
return false;
}
// We don't need to recompute the cues' display states. Just reuse them.
if (!shouldCompute(cues)) {
for (var i = 0; i < cues.length; i++) {
paddedOverlay.appendChild(cues[i].displayState);
}
return;
}
var boxPositions = [],
containerBox = BoxPosition.getSimpleBoxPosition(paddedOverlay),
fontSize = Math.round(containerBox.height * FONT_SIZE_PERCENT * 100) / 100;
var styleOptions = {
font: fontSize + "px " + FONT_STYLE
};
(function() {
var styleBox, cue;
for (var i = 0; i < cues.length; i++) {
cue = cues[i];
// Compute the intial position and styles of the cue div.
styleBox = new CueStyleBox(window, cue, styleOptions);
paddedOverlay.appendChild(styleBox.div);
// Move the cue div to it's correct line position.
moveBoxToLinePosition(window, styleBox, containerBox, boxPositions);
// Remember the computed div so that we don't have to recompute it later
// if we don't have too.
cue.displayState = styleBox.div;
boxPositions.push(BoxPosition.getSimpleBoxPosition(styleBox));
}
})();
};
WebVTT.Parser = function(window, vttjs, decoder) {
if (!decoder) {
decoder = vttjs;
vttjs = {};
}
if (!vttjs) {
vttjs = {};
}
this.window = window;
this.vttjs = vttjs;
this.state = "INITIAL";
this.buffer = "";
this.decoder = decoder || new TextDecoder("utf8");
this.regionList = [];
};
WebVTT.Parser.prototype = {
// If the error is a ParsingError then report it to the consumer if
// possible. If it's not a ParsingError then throw it like normal.
reportOrThrowError: function(e) {
if (e instanceof ParsingError) {
this.onparsingerror && this.onparsingerror(e);
} else {
throw e;
}
},
parse: function (data) {
var self = this;
// If there is no data then we won't decode it, but will just try to parse
// whatever is in buffer already. This may occur in circumstances, for
// example when flush() is called.
if (data) {
// Try to decode the data that we received.
self.buffer += self.decoder.decode(data, {stream: true});
}
function collectNextLine() {
var buffer = self.buffer;
var pos = 0;
while (pos < buffer.length && buffer[pos] !== '\r' && buffer[pos] !== '\n') {
++pos;
}
var line = buffer.substr(0, pos);
// Advance the buffer early in case we fail below.
if (buffer[pos] === '\r') {
++pos;
}
if (buffer[pos] === '\n') {
++pos;
}
self.buffer = buffer.substr(pos);
return line;
}
// 3.4 WebVTT region and WebVTT region settings syntax
function parseRegion(input) {
var settings = new Settings();
parseOptions(input, function (k, v) {
switch (k) {
case "id":
settings.set(k, v);
break;
case "width":
settings.percent(k, v);
break;
case "lines":
settings.integer(k, v);
break;
case "regionanchor":
case "viewportanchor":
var xy = v.split(',');
if (xy.length !== 2) {
break;
}
// We have to make sure both x and y parse, so use a temporary
// settings object here.
var anchor = new Settings();
anchor.percent("x", xy[0]);
anchor.percent("y", xy[1]);
if (!anchor.has("x") || !anchor.has("y")) {
break;
}
settings.set(k + "X", anchor.get("x"));
settings.set(k + "Y", anchor.get("y"));
break;
case "scroll":
settings.alt(k, v, ["up"]);
break;
}
}, /=/, /\s/);
// Create the region, using default values for any values that were not
// specified.
if (settings.has("id")) {
var region = new (self.vttjs.VTTRegion || self.window.VTTRegion)();
region.width = settings.get("width", 100);
region.lines = settings.get("lines", 3);
region.regionAnchorX = settings.get("regionanchorX", 0);
region.regionAnchorY = settings.get("regionanchorY", 100);
region.viewportAnchorX = settings.get("viewportanchorX", 0);
region.viewportAnchorY = settings.get("viewportanchorY", 100);
region.scroll = settings.get("scroll", "");
// Register the region.
self.onregion && self.onregion(region);
// Remember the VTTRegion for later in case we parse any VTTCues that
// reference it.
self.regionList.push({
id: settings.get("id"),
region: region
});
}
}
// draft-pantos-http-live-streaming-20
// https://tools.ietf.org/html/draft-pantos-http-live-streaming-20#section-3.5
// 3.5 WebVTT
function parseTimestampMap(input) {
var settings = new Settings();
parseOptions(input, function(k, v) {
switch(k) {
case "MPEGT":
settings.integer(k + 'S', v);
break;
case "LOCA":
settings.set(k + 'L', parseTimeStamp(v));
break;
}
}, /[^\d]:/, /,/);
self.ontimestampmap && self.ontimestampmap({
"MPEGTS": settings.get("MPEGTS"),
"LOCAL": settings.get("LOCAL")
});
}
// 3.2 WebVTT metadata header syntax
function parseHeader(input) {
if (input.match(/X-TIMESTAMP-MAP/)) {
// This line contains HLS X-TIMESTAMP-MAP metadata
parseOptions(input, function(k, v) {
switch(k) {
case "X-TIMESTAMP-MAP":
parseTimestampMap(v);
break;
}
}, /=/);
} else {
parseOptions(input, function (k, v) {
switch (k) {
case "Region":
// 3.3 WebVTT region metadata header syntax
parseRegion(v);
break;
}
}, /:/);
}
}
// 5.1 WebVTT file parsing.
try {
var line;
if (self.state === "INITIAL") {
// We can't start parsing until we have the first line.
if (!/\r\n|\n/.test(self.buffer)) {
return this;
}
line = collectNextLine();
var m = line.match(/^WEBVTT([ \t].*)?$/);
if (!m || !m[0]) {
throw new ParsingError(ParsingError.Errors.BadSignature);
}
self.state = "HEADER";
}
var alreadyCollectedLine = false;
while (self.buffer) {
// We can't parse a line until we have the full line.
if (!/\r\n|\n/.test(self.buffer)) {
return this;
}
if (!alreadyCollectedLine) {
line = collectNextLine();
} else {
alreadyCollectedLine = false;
}
switch (self.state) {
case "HEADER":
// 13-18 - Allow a header (metadata) under the WEBVTT line.
if (/:/.test(line)) {
parseHeader(line);
} else if (!line) {
// An empty line terminates the header and starts the body (cues).
self.state = "ID";
}
continue;
case "NOTE":
// Ignore NOTE blocks.
if (!line) {
self.state = "ID";
}
continue;
case "ID":
// Check for the start of NOTE blocks.
if (/^NOTE($|[ \t])/.test(line)) {
self.state = "NOTE";
break;
}
// 19-29 - Allow any number of line terminators, then initialize new cue values.
if (!line) {
continue;
}
self.cue = new (self.vttjs.VTTCue || self.window.VTTCue)(0, 0, "");
self.state = "CUE";
// 30-39 - Check if self line contains an optional identifier or timing data.
if (line.indexOf("-->") === -1) {
self.cue.id = line;
continue;
}
// Process line as start of a cue.
/*falls through*/
case "CUE":
// 40 - Collect cue timings and settings.
try {
parseCue(line, self.cue, self.regionList);
} catch (e) {
self.reportOrThrowError(e);
// In case of an error ignore rest of the cue.
self.cue = null;
self.state = "BADCUE";
continue;
}
self.state = "CUETEXT";
continue;
case "CUETEXT":
var hasSubstring = line.indexOf("-->") !== -1;
// 34 - If we have an empty line then report the cue.
// 35 - If we have the special substring '-->' then report the cue,
// but do not collect the line as we need to process the current
// one as a new cue.
if (!line || hasSubstring && (alreadyCollectedLine = true)) {
// We are done parsing self cue.
self.oncue && self.oncue(self.cue);
self.cue = null;
self.state = "ID";
continue;
}
if (self.cue.text) {
self.cue.text += "\n";
}
self.cue.text += line;
continue;
case "BADCUE": // BADCUE
// 54-62 - Collect and discard the remaining cue.
if (!line) {
self.state = "ID";
}
continue;
}
}
} catch (e) {
self.reportOrThrowError(e);
// If we are currently parsing a cue, report what we have.
if (self.state === "CUETEXT" && self.cue && self.oncue) {
self.oncue(self.cue);
}
self.cue = null;
// Enter BADWEBVTT state if header was not parsed correctly otherwise
// another exception occurred so enter BADCUE state.
self.state = self.state === "INITIAL" ? "BADWEBVTT" : "BADCUE";
}
return this;
},
flush: function () {
var self = this;
try {
// Finish decoding the stream.
self.buffer += self.decoder.decode();
// Synthesize the end of the current cue or region.
if (self.cue || self.state === "HEADER") {
self.buffer += "\n\n";
self.parse();
}
// If we've flushed, parsed, and we're still on the INITIAL state then
// that means we don't have enough of the stream to parse the first
// line.
if (self.state === "INITIAL") {
throw new ParsingError(ParsingError.Errors.BadSignature);
}
} catch(e) {
self.reportOrThrowError(e);
}
self.onflush && self.onflush();
return this;
}
};
global.WebVTT = WebVTT;
}(this, (this.vttjs || {})));
},{}],133:[function(_dereq_,module,exports){
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// If we're in Node.js then require VTTCue so we can extend it, otherwise assume
// VTTCue is on the global.
if (typeof module !== "undefined" && module.exports) {
this.VTTCue = this.VTTCue || _dereq_("./vttcue").VTTCue;
}
// Extend VTTCue with methods to convert to JSON, from JSON, and construct a
// VTTCue from an options object. The primary purpose of this is for use in the
// vtt.js test suite (for testing only properties that we care about). It's also
// useful if you need to work with VTTCues in JSON format.
(function(root) {
root.VTTCue.prototype.toJSON = function() {
var cue = {},
self = this;
// Filter out getCueAsHTML as it's a function and hasBeenReset and displayState as
// they're only used when running the processing model algorithm.
Object.keys(this).forEach(function(key) {
if (key !== "getCueAsHTML" && key !== "hasBeenReset" && key !== "displayState") {
cue[key] = self[key];
}
});
return cue;
};
root.VTTCue.create = function(options) {
if (!options.hasOwnProperty("startTime") || !options.hasOwnProperty("endTime") ||
!options.hasOwnProperty("text")) {
throw new Error("You must at least have start time, end time, and text.");
}
var cue = new root.VTTCue(options.startTime, options.endTime, options.text);
for (var key in options) {
if (cue.hasOwnProperty(key)) {
cue[key] = options[key];
}
}
return cue;
};
root.VTTCue.fromJSON = function(json) {
return this.create(JSON.parse(json));
};
}(this));
},{"./vttcue":134}],134:[function(_dereq_,module,exports){
/**
* Copyright 2013 vtt.js Contributors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
(function(root, vttjs) {
var autoKeyword = "auto";
var directionSetting = {
"": true,
"lr": true,
"rl": true
};
var alignSetting = {
"start": true,
"middle": true,
"end": true,
"left": true,
"right": true
};
function findDirectionSetting(value) {
if (typeof value !== "string") {
return false;
}
var dir = directionSetting[value.toLowerCase()];
return dir ? value.toLowerCase() : false;
}
function findAlignSetting(value) {
if (typeof value !== "string") {
return false;
}
var align = alignSetting[value.toLowerCase()];
return align ? value.toLowerCase() : false;
}
function extend(obj) {
var i = 1;
for (; i < arguments.length; i++) {
var cobj = arguments[i];
for (var p in cobj) {
obj[p] = cobj[p];
}
}
return obj;
}
function VTTCue(startTime, endTime, text) {
var cue = this;
var isIE8 = (/MSIE\s8\.0/).test(navigator.userAgent);
var baseObj = {};
if (isIE8) {
cue = document.createElement('custom');
} else {
baseObj.enumerable = true;
}
/**
* Shim implementation specific properties. These properties are not in
* the spec.
*/
// Lets us know when the VTTCue's data has changed in such a way that we need
// to recompute its display state. This lets us compute its display state
// lazily.
cue.hasBeenReset = false;
/**
* VTTCue and TextTrackCue properties
* http://dev.w3.org/html5/webvtt/#vttcue-interface
*/
var _id = "";
var _pauseOnExit = false;
var _startTime = startTime;
var _endTime = endTime;
var _text = text;
var _region = null;
var _vertical = "";
var _snapToLines = true;
var _line = "auto";
var _lineAlign = "start";
var _position = 50;
var _positionAlign = "middle";
var _size = 50;
var _align = "middle";
Object.defineProperty(cue,
"id", extend({}, baseObj, {
get: function() {
return _id;
},
set: function(value) {
_id = "" + value;
}
}));
Object.defineProperty(cue,
"pauseOnExit", extend({}, baseObj, {
get: function() {
return _pauseOnExit;
},
set: function(value) {
_pauseOnExit = !!value;
}
}));
Object.defineProperty(cue,
"startTime", extend({}, baseObj, {
get: function() {
return _startTime;
},
set: function(value) {
if (typeof value !== "number") {
throw new TypeError("Start time must be set to a number.");
}
_startTime = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"endTime", extend({}, baseObj, {
get: function() {
return _endTime;
},
set: function(value) {
if (typeof value !== "number") {
throw new TypeError("End time must be set to a number.");
}
_endTime = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"text", extend({}, baseObj, {
get: function() {
return _text;
},
set: function(value) {
_text = "" + value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"region", extend({}, baseObj, {
get: function() {
return _region;
},
set: function(value) {
_region = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"vertical", extend({}, baseObj, {
get: function() {
return _vertical;
},
set: function(value) {
var setting = findDirectionSetting(value);
// Have to check for false because the setting an be an empty string.
if (setting === false) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_vertical = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"snapToLines", extend({}, baseObj, {
get: function() {
return _snapToLines;
},
set: function(value) {
_snapToLines = !!value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"line", extend({}, baseObj, {
get: function() {
return _line;
},
set: function(value) {
if (typeof value !== "number" && value !== autoKeyword) {
throw new SyntaxError("An invalid number or illegal string was specified.");
}
_line = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"lineAlign", extend({}, baseObj, {
get: function() {
return _lineAlign;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_lineAlign = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"position", extend({}, baseObj, {
get: function() {
return _position;
},
set: function(value) {
if (value < 0 || value > 100) {
throw new Error("Position must be between 0 and 100.");
}
_position = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"positionAlign", extend({}, baseObj, {
get: function() {
return _positionAlign;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_positionAlign = setting;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"size", extend({}, baseObj, {
get: function() {
return _size;
},
set: function(value) {
if (value < 0 || value > 100) {
throw new Error("Size must be between 0 and 100.");
}
_size = value;
this.hasBeenReset = true;
}
}));
Object.defineProperty(cue,
"align", extend({}, baseObj, {
get: function() {
return _align;
},
set: function(value) {
var setting = findAlignSetting(value);
if (!setting) {
throw new SyntaxError("An invalid or illegal string was specified.");
}
_align = setting;
this.hasBeenReset = true;
}
}));
/**
* Other