{"version":3,"sources":["node_modules/lodash/pullAll.js","node_modules/lodash/stubArray.js","node_modules/lodash/isSet.js","node_modules/lodash/_baseIndexOfWith.js","node_modules/lodash/memoize.js","node_modules/lodash/_customOmitClone.js","node_modules/lodash/_hasPath.js","node_modules/lodash/_castPath.js","node_modules/lodash/uniq.js","node_modules/lodash/_toKey.js","node_modules/lodash/_isKey.js","node_modules/lodash/cloneDeep.js","node_modules/lodash/_baseAssignIn.js","node_modules/lodash/isEmpty.js","node_modules/lodash/_copySymbolsIn.js","node_modules/lodash/_baseSet.js","node_modules/lodash/_basePick.js","node_modules/lodash/_getAllKeysIn.js","node_modules/lodash/_stringToPath.js","node_modules/lodash/_baseIsMap.js","node_modules/lodash/_Promise.js","node_modules/lodash/_baseInverter.js","node_modules/lodash/_memoizeCapped.js","node_modules/lodash/invert.js","node_modules/lodash/_baseForOwn.js","node_modules/lodash/pick.js","node_modules/lodash/_baseHasIn.js","node_modules/lodash/_baseSlice.js","node_modules/lodash/_baseUniq.js","node_modules/lodash/_arrayFilter.js","node_modules/lodash/_baseDifference.js","node_modules/lodash/_getSymbols.js","node_modules/lodash/_baseClone.js","node_modules/lodash/omit.js","node_modules/lodash/_createInverter.js","node_modules/lodash/_getTag.js","node_modules/lodash/last.js","node_modules/lodash/_baseUnset.js","node_modules/lodash/_copySymbols.js","node_modules/lodash/_basePullAll.js","node_modules/lodash/without.js","node_modules/lodash/_baseAssign.js","node_modules/lodash/_cloneDataView.js","node_modules/lodash/_baseGet.js","node_modules/lodash/_cloneRegExp.js","node_modules/object-path/index.js","node_modules/lodash/_createSet.js","node_modules/lodash/toString.js","node_modules/lodash/_baseGetAllKeys.js","node_modules/lodash/_parent.js","node_modules/lodash/hasIn.js","node_modules/lodash/_basePickBy.js","node_modules/lodash/_getSymbolsIn.js","node_modules/lodash/_cloneSymbol.js","node_modules/lodash/_getAllKeys.js","node_modules/lodash/_setToArray.js","node_modules/lodash/_DataView.js","node_modules/lodash/_baseIsSet.js","node_modules/lodash/_initCloneByTag.js","node_modules/lodash/_flatRest.js","node_modules/lodash/_Set.js","node_modules/lodash/_initCloneArray.js","node_modules/hammerjs/hammer.js","node_modules/lodash/isMap.js","node_modules/lodash/_baseToString.js"],"names":["basePullAll","require","module","exports","array","values","length","baseIsSet","baseUnary","nodeUtil","nodeIsSet","isSet","value","fromIndex","comparator","index","MapCache","memoize","func","resolver","TypeError","memoized","args","arguments","key","apply","this","cache","has","get","result","set","Cache","isPlainObject","undefined","castPath","isArguments","isArray","isIndex","isLength","toKey","object","path","hasFunc","isKey","stringToPath","toString","baseUniq","isSymbol","reIsDeepProp","reIsPlainProp","type","test","Object","baseClone","CLONE_DEEP_FLAG","copyObject","keysIn","source","baseKeys","getTag","isArrayLike","isBuffer","isPrototype","isTypedArray","hasOwnProperty","prototype","splice","tag","size","call","getSymbolsIn","assignValue","isObject","customizer","lastIndex","nested","newValue","objValue","basePickBy","hasIn","paths","baseGetAllKeys","memoizeCapped","rePropName","reEscapeChar","string","charCodeAt","push","replace","match","number","quote","subString","isObjectLike","Promise","getNative","baseForOwn","setter","iteratee","accumulator","clear","constant","createInverter","identity","nativeObjectToString","invert","baseFor","keys","basePick","pick","flatRest","start","end","Array","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","includes","isCommon","seen","outer","computed","seenIndex","predicate","resIndex","arrayMap","valuesLength","valuesIndex","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","getSymbols","symbol","Stack","arrayEach","baseAssign","baseAssignIn","cloneBuffer","copyArray","copySymbols","copySymbolsIn","getAllKeys","getAllKeysIn","initCloneArray","initCloneByTag","initCloneObject","isMap","cloneableTags","bitmask","stack","isDeep","isFlat","isFull","isArr","isFunc","stacked","forEach","subValue","add","props","baseUnset","customOmitClone","omit","baseInverter","toIteratee","DataView","Map","Set","WeakMap","baseGetTag","toSource","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","resolve","Ctor","constructor","ctorString","last","parent","baseIndexOf","baseIndexOfWith","indexOf","baseDifference","baseRest","isArrayLikeObject","without","cloneArrayBuffer","dataView","buffer","byteOffset","byteLength","reFlags","regexp","exec","root","factory","define","toStr","obj","prop","isEmpty","i","getKey","intKey","parseInt","options","hasShallowProperty","getShallowPropertySafely","objectPath","reduce","proxy","bind","getShallowProperty","doNotReplace","split","map","currentPath","currentValue","slice","includeInheritedProps","String","Error","j","ensureExists","insert","at","arr","empty","isBoolean","coalesce","defaultValue","len","nextObj","del","mod","create","withInheritedProps","noop","baseToString","arrayPush","keysFunc","symbolsFunc","baseGet","baseSlice","baseHasIn","hasPath","baseSet","getPrototype","Symbol","symbolProto","symbolValueOf","valueOf","cloneDataView","cloneRegExp","cloneSymbol","cloneTypedArray","flatten","overRest","setToString","input","window","document","exportName","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","setTimeout","bindFn","invokeArrayArg","arg","each","iterator","deprecate","method","name","message","deprecationMessage","e","log","console","warn","target","output","nextKey","extend","dest","src","merge","inherit","child","base","properties","childP","baseP","_super","boolOrFn","val","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parentNode","inStr","str","find","trim","inArray","findByKey","toArray","uniqueArray","sort","results","a","b","prefixed","property","prefix","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","navigator","userAgent","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","concat","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","filter","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","t","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","createInputInstance","toggleCssProps","item","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","baseIsMap","nodeIsMap","symbolToString"],"mappings":"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","file":"hashed/13.4b4c575c.chunk.js","sourcesContent":["var basePullAll = require('./_basePullAll');\n\n/**\n * This method is like `_.pull` except that it accepts an array of values to remove.\n *\n * **Note:** Unlike `_.difference`, this method mutates `array`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @returns {Array} Returns `array`.\n * @example\n *\n * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n *\n * _.pullAll(array, ['a', 'c']);\n * console.log(array);\n * // => ['b', 'b']\n */\nfunction pullAll(array, values) {\n return (array && array.length && values && values.length)\n ? basePullAll(array, values)\n : array;\n}\n\nmodule.exports = pullAll;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var baseIsSet = require('./_baseIsSet'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsSet = nodeUtil && nodeUtil.isSet;\n\n/**\n * Checks if `value` is classified as a `Set` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n * @example\n *\n * _.isSet(new Set);\n * // => true\n *\n * _.isSet(new WeakSet);\n * // => false\n */\nvar isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\nmodule.exports = isSet;\n","/**\n * This function is like `baseIndexOf` except that it accepts a comparator.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOfWith(array, value, fromIndex, comparator) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (comparator(array[index], value)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseIndexOfWith;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var isPlainObject = require('./isPlainObject');\n\n/**\n * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n * objects.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {string} key The key of the property to inspect.\n * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n */\nfunction customOmitClone(value) {\n return isPlainObject(value) ? undefined : value;\n}\n\nmodule.exports = customOmitClone;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseClone = require('./_baseClone');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nmodule.exports = cloneDeep;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * The base implementation of `_.assignIn` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssignIn(object, source) {\n return object && copyObject(source, keysIn(source), object);\n}\n\nmodule.exports = baseAssignIn;\n","var baseKeys = require('./_baseKeys'),\n getTag = require('./_getTag'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLike = require('./isArrayLike'),\n isBuffer = require('./isBuffer'),\n isPrototype = require('./_isPrototype'),\n isTypedArray = require('./isTypedArray');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n setTag = '[object Set]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if `value` is an empty object, collection, map, or set.\n *\n * Objects are considered empty if they have no own enumerable string keyed\n * properties.\n *\n * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n * jQuery-like collections are considered empty if they have a `length` of `0`.\n * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n * @example\n *\n * _.isEmpty(null);\n * // => true\n *\n * _.isEmpty(true);\n * // => true\n *\n * _.isEmpty(1);\n * // => true\n *\n * _.isEmpty([1, 2, 3]);\n * // => false\n *\n * _.isEmpty({ 'a': 1 });\n * // => false\n */\nfunction isEmpty(value) {\n if (value == null) {\n return true;\n }\n if (isArrayLike(value) &&\n (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n return !value.length;\n }\n var tag = getTag(value);\n if (tag == mapTag || tag == setTag) {\n return !value.size;\n }\n if (isPrototype(value)) {\n return !baseKeys(value).length;\n }\n for (var key in value) {\n if (hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n return true;\n}\n\nmodule.exports = isEmpty;\n","var copyObject = require('./_copyObject'),\n getSymbolsIn = require('./_getSymbolsIn');\n\n/**\n * Copies own and inherited symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbolsIn(source, object) {\n return copyObject(source, getSymbolsIn(source), object);\n}\n\nmodule.exports = copySymbolsIn;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var basePickBy = require('./_basePickBy'),\n hasIn = require('./hasIn');\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nmodule.exports = basePick;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbolsIn = require('./_getSymbolsIn'),\n keysIn = require('./keysIn');\n\n/**\n * Creates an array of own and inherited enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeysIn(object) {\n return baseGetAllKeys(object, keysIn, getSymbolsIn);\n}\n\nmodule.exports = getAllKeysIn;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]';\n\n/**\n * The base implementation of `_.isMap` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n */\nfunction baseIsMap(value) {\n return isObjectLike(value) && getTag(value) == mapTag;\n}\n\nmodule.exports = baseIsMap;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var baseForOwn = require('./_baseForOwn');\n\n/**\n * The base implementation of `_.invert` and `_.invertBy` which inverts\n * `object` with values transformed by `iteratee` and set by `setter`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform values.\n * @param {Object} accumulator The initial inverted object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseInverter(object, setter, iteratee, accumulator) {\n baseForOwn(object, function(value, key, object) {\n setter(accumulator, iteratee(value), key, object);\n });\n return accumulator;\n}\n\nmodule.exports = baseInverter;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","var constant = require('./constant'),\n createInverter = require('./_createInverter'),\n identity = require('./identity');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Creates an object composed of the inverted keys and values of `object`.\n * If `object` contains duplicate values, subsequent values overwrite\n * property assignments of previous values.\n *\n * @static\n * @memberOf _\n * @since 0.7.0\n * @category Object\n * @param {Object} object The object to invert.\n * @returns {Object} Returns the new inverted object.\n * @example\n *\n * var object = { 'a': 1, 'b': 2, 'c': 1 };\n *\n * _.invert(object);\n * // => { '1': 'c', '2': 'b' }\n */\nvar invert = createInverter(function(result, value, key) {\n if (value != null &&\n typeof value.toString != 'function') {\n value = nativeObjectToString.call(value);\n }\n\n result[value] = key;\n}, constant(identity));\n\nmodule.exports = invert;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var basePick = require('./_basePick'),\n flatRest = require('./_flatRest');\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nmodule.exports = pick;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nmodule.exports = baseSlice;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n arrayMap = require('./_arrayMap'),\n baseUnary = require('./_baseUnary'),\n cacheHas = require('./_cacheHas');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseDifference;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","var Stack = require('./_Stack'),\n arrayEach = require('./_arrayEach'),\n assignValue = require('./_assignValue'),\n baseAssign = require('./_baseAssign'),\n baseAssignIn = require('./_baseAssignIn'),\n cloneBuffer = require('./_cloneBuffer'),\n copyArray = require('./_copyArray'),\n copySymbols = require('./_copySymbols'),\n copySymbolsIn = require('./_copySymbolsIn'),\n getAllKeys = require('./_getAllKeys'),\n getAllKeysIn = require('./_getAllKeysIn'),\n getTag = require('./_getTag'),\n initCloneArray = require('./_initCloneArray'),\n initCloneByTag = require('./_initCloneByTag'),\n initCloneObject = require('./_initCloneObject'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isMap = require('./isMap'),\n isObject = require('./isObject'),\n isSet = require('./isSet'),\n keys = require('./keys'),\n keysIn = require('./keysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values supported by `_.clone`. */\nvar cloneableTags = {};\ncloneableTags[argsTag] = cloneableTags[arrayTag] =\ncloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\ncloneableTags[boolTag] = cloneableTags[dateTag] =\ncloneableTags[float32Tag] = cloneableTags[float64Tag] =\ncloneableTags[int8Tag] = cloneableTags[int16Tag] =\ncloneableTags[int32Tag] = cloneableTags[mapTag] =\ncloneableTags[numberTag] = cloneableTags[objectTag] =\ncloneableTags[regexpTag] = cloneableTags[setTag] =\ncloneableTags[stringTag] = cloneableTags[symbolTag] =\ncloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\ncloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\ncloneableTags[errorTag] = cloneableTags[funcTag] =\ncloneableTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n * traversed objects.\n *\n * @private\n * @param {*} value The value to clone.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Deep clone\n * 2 - Flatten inherited properties\n * 4 - Clone symbols\n * @param {Function} [customizer] The function to customize cloning.\n * @param {string} [key] The key of `value`.\n * @param {Object} [object] The parent object of `value`.\n * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n * @returns {*} Returns the cloned value.\n */\nfunction baseClone(value, bitmask, customizer, key, object, stack) {\n var result,\n isDeep = bitmask & CLONE_DEEP_FLAG,\n isFlat = bitmask & CLONE_FLAT_FLAG,\n isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n if (customizer) {\n result = object ? customizer(value, key, object, stack) : customizer(value);\n }\n if (result !== undefined) {\n return result;\n }\n if (!isObject(value)) {\n return value;\n }\n var isArr = isArray(value);\n if (isArr) {\n result = initCloneArray(value);\n if (!isDeep) {\n return copyArray(value, result);\n }\n } else {\n var tag = getTag(value),\n isFunc = tag == funcTag || tag == genTag;\n\n if (isBuffer(value)) {\n return cloneBuffer(value, isDeep);\n }\n if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n result = (isFlat || isFunc) ? {} : initCloneObject(value);\n if (!isDeep) {\n return isFlat\n ? copySymbolsIn(value, baseAssignIn(result, value))\n : copySymbols(value, baseAssign(result, value));\n }\n } else {\n if (!cloneableTags[tag]) {\n return object ? value : {};\n }\n result = initCloneByTag(value, tag, isDeep);\n }\n }\n // Check for circular references and return its corresponding clone.\n stack || (stack = new Stack);\n var stacked = stack.get(value);\n if (stacked) {\n return stacked;\n }\n stack.set(value, result);\n\n if (isSet(value)) {\n value.forEach(function(subValue) {\n result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n });\n } else if (isMap(value)) {\n value.forEach(function(subValue, key) {\n result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n }\n\n var keysFunc = isFull\n ? (isFlat ? getAllKeysIn : getAllKeys)\n : (isFlat ? keysIn : keys);\n\n var props = isArr ? undefined : keysFunc(value);\n arrayEach(props || value, function(subValue, key) {\n if (props) {\n key = subValue;\n subValue = value[key];\n }\n // Recursively populate clone (susceptible to call stack limits).\n assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n });\n return result;\n}\n\nmodule.exports = baseClone;\n","var arrayMap = require('./_arrayMap'),\n baseClone = require('./_baseClone'),\n baseUnset = require('./_baseUnset'),\n castPath = require('./_castPath'),\n copyObject = require('./_copyObject'),\n customOmitClone = require('./_customOmitClone'),\n flatRest = require('./_flatRest'),\n getAllKeysIn = require('./_getAllKeysIn');\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_FLAT_FLAG = 2,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * The opposite of `_.pick`; this method creates an object composed of the\n * own and inherited enumerable property paths of `object` that are not omitted.\n *\n * **Note:** This method is considerably slower than `_.pick`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to omit.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.omit(object, ['a', 'c']);\n * // => { 'b': '2' }\n */\nvar omit = flatRest(function(object, paths) {\n var result = {};\n if (object == null) {\n return result;\n }\n var isDeep = false;\n paths = arrayMap(paths, function(path) {\n path = castPath(path, object);\n isDeep || (isDeep = path.length > 1);\n return path;\n });\n copyObject(object, getAllKeysIn(object), result);\n if (isDeep) {\n result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n }\n var length = paths.length;\n while (length--) {\n baseUnset(result, paths[length]);\n }\n return result;\n});\n\nmodule.exports = omit;\n","var baseInverter = require('./_baseInverter');\n\n/**\n * Creates a function like `_.invertBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} toIteratee The function to resolve iteratees.\n * @returns {Function} Returns the new inverter function.\n */\nfunction createInverter(setter, toIteratee) {\n return function(object, iteratee) {\n return baseInverter(object, setter, toIteratee(iteratee), {});\n };\n}\n\nmodule.exports = createInverter;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nmodule.exports = last;\n","var castPath = require('./_castPath'),\n last = require('./last'),\n parent = require('./_parent'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.unset`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The property path to unset.\n * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n */\nfunction baseUnset(object, path) {\n path = castPath(path, object);\n object = parent(object, path);\n return object == null || delete object[toKey(last(path))];\n}\n\nmodule.exports = baseUnset;\n","var copyObject = require('./_copyObject'),\n getSymbols = require('./_getSymbols');\n\n/**\n * Copies own symbols of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy symbols from.\n * @param {Object} [object={}] The object to copy symbols to.\n * @returns {Object} Returns `object`.\n */\nfunction copySymbols(source, object) {\n return copyObject(source, getSymbols(source), object);\n}\n\nmodule.exports = copySymbols;\n","var arrayMap = require('./_arrayMap'),\n baseIndexOf = require('./_baseIndexOf'),\n baseIndexOfWith = require('./_baseIndexOfWith'),\n baseUnary = require('./_baseUnary'),\n copyArray = require('./_copyArray');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * The base implementation of `_.pullAllBy` without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to remove.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns `array`.\n */\nfunction basePullAll(array, values, iteratee, comparator) {\n var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n index = -1,\n length = values.length,\n seen = array;\n\n if (array === values) {\n values = copyArray(values);\n }\n if (iteratee) {\n seen = arrayMap(array, baseUnary(iteratee));\n }\n while (++index < length) {\n var fromIndex = 0,\n value = values[index],\n computed = iteratee ? iteratee(value) : value;\n\n while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n if (seen !== array) {\n splice.call(seen, fromIndex, 1);\n }\n splice.call(array, fromIndex, 1);\n }\n }\n return array;\n}\n\nmodule.exports = basePullAll;\n","var baseDifference = require('./_baseDifference'),\n baseRest = require('./_baseRest'),\n isArrayLikeObject = require('./isArrayLikeObject');\n\n/**\n * Creates an array excluding all given values using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * **Note:** Unlike `_.pull`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...*} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.difference, _.xor\n * @example\n *\n * _.without([2, 1, 2, 3], 1, 2);\n * // => [3]\n */\nvar without = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, values)\n : [];\n});\n\nmodule.exports = without;\n","var copyObject = require('./_copyObject'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.assign` without support for multiple sources\n * or `customizer` functions.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @returns {Object} Returns `object`.\n */\nfunction baseAssign(object, source) {\n return object && copyObject(source, keys(source), object);\n}\n\nmodule.exports = baseAssign;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `dataView`.\n *\n * @private\n * @param {Object} dataView The data view to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned data view.\n */\nfunction cloneDataView(dataView, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n}\n\nmodule.exports = cloneDataView;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","/** Used to match `RegExp` flags from their coerced string values. */\nvar reFlags = /\\w*$/;\n\n/**\n * Creates a clone of `regexp`.\n *\n * @private\n * @param {Object} regexp The regexp to clone.\n * @returns {Object} Returns the cloned regexp.\n */\nfunction cloneRegExp(regexp) {\n var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n result.lastIndex = regexp.lastIndex;\n return result;\n}\n\nmodule.exports = cloneRegExp;\n","(function (root, factory) {\n 'use strict'\n\n /*istanbul ignore next:cant test*/\n if (typeof module === 'object' && typeof module.exports === 'object') {\n module.exports = factory()\n } else if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define([], factory)\n } else {\n // Browser globals\n root.objectPath = factory()\n }\n})(this, function () {\n 'use strict'\n\n var toStr = Object.prototype.toString\n\n function hasOwnProperty (obj, prop) {\n if (obj == null) {\n return false\n }\n //to handle objects with null prototypes (too edge case?)\n return Object.prototype.hasOwnProperty.call(obj, prop)\n }\n\n function isEmpty (value) {\n if (!value) {\n return true\n }\n if (isArray(value) && value.length === 0) {\n return true\n } else if (typeof value !== 'string') {\n for (var i in value) {\n if (hasOwnProperty(value, i)) {\n return false\n }\n }\n return true\n }\n return false\n }\n\n function toString (type) {\n return toStr.call(type)\n }\n\n function isObject (obj) {\n return typeof obj === 'object' && toString(obj) === '[object Object]'\n }\n\n var isArray = Array.isArray || function (obj) {\n /*istanbul ignore next:cant test*/\n return toStr.call(obj) === '[object Array]'\n }\n\n function isBoolean (obj) {\n return typeof obj === 'boolean' || toString(obj) === '[object Boolean]'\n }\n\n function getKey (key) {\n var intKey = parseInt(key)\n if (intKey.toString() === key) {\n return intKey\n }\n return key\n }\n\n function factory (options) {\n options = options || {}\n\n var objectPath = function (obj) {\n return Object.keys(objectPath).reduce(function (proxy, prop) {\n if (prop === 'create') {\n return proxy\n }\n\n /*istanbul ignore else*/\n if (typeof objectPath[prop] === 'function') {\n proxy[prop] = objectPath[prop].bind(objectPath, obj)\n }\n\n return proxy\n }, {})\n }\n\n var hasShallowProperty\n if (options.includeInheritedProps) {\n hasShallowProperty = function () {\n return true\n }\n } else {\n hasShallowProperty = function (obj, prop) {\n return (typeof prop === 'number' && Array.isArray(obj)) || hasOwnProperty(obj, prop)\n }\n }\n\n function getShallowProperty (obj, prop) {\n if (hasShallowProperty(obj, prop)) {\n return obj[prop]\n }\n }\n\n var getShallowPropertySafely\n if (options.includeInheritedProps) {\n getShallowPropertySafely = function (obj, currentPath) {\n if (typeof currentPath !== 'string' && typeof currentPath !== 'number') {\n currentPath = String(currentPath)\n }\n var currentValue = getShallowProperty(obj, currentPath)\n if (currentPath === '__proto__' || currentPath === 'prototype' ||\n (currentPath === 'constructor' && typeof currentValue === 'function')) {\n throw new Error('For security reasons, object\\'s magic properties cannot be set')\n }\n return currentValue\n }\n } else {\n getShallowPropertySafely = function (obj, currentPath) {\n return getShallowProperty(obj, currentPath)\n }\n }\n\n function set (obj, path, value, doNotReplace) {\n if (typeof path === 'number') {\n path = [path]\n }\n if (!path || path.length === 0) {\n return obj\n }\n if (typeof path === 'string') {\n return set(obj, path.split('.').map(getKey), value, doNotReplace)\n }\n var currentPath = path[0]\n var currentValue = getShallowPropertySafely(obj, currentPath)\n if (path.length === 1) {\n if (currentValue === void 0 || !doNotReplace) {\n obj[currentPath] = value\n }\n return currentValue\n }\n\n if (currentValue === void 0) {\n //check if we assume an array\n if (typeof path[1] === 'number') {\n obj[currentPath] = []\n } else {\n obj[currentPath] = {}\n }\n }\n\n return set(obj[currentPath], path.slice(1), value, doNotReplace)\n }\n\n objectPath.has = function (obj, path) {\n if (typeof path === 'number') {\n path = [path]\n } else if (typeof path === 'string') {\n path = path.split('.')\n }\n\n if (!path || path.length === 0) {\n return !!obj\n }\n\n for (var i = 0; i < path.length; i++) {\n var j = getKey(path[i])\n\n if ((typeof j === 'number' && isArray(obj) && j < obj.length) ||\n (options.includeInheritedProps ? (j in Object(obj)) : hasOwnProperty(obj, j))) {\n obj = obj[j]\n } else {\n return false\n }\n }\n\n return true\n }\n\n objectPath.ensureExists = function (obj, path, value) {\n return set(obj, path, value, true)\n }\n\n objectPath.set = function (obj, path, value, doNotReplace) {\n return set(obj, path, value, doNotReplace)\n }\n\n objectPath.insert = function (obj, path, value, at) {\n var arr = objectPath.get(obj, path)\n at = ~~at\n if (!isArray(arr)) {\n arr = []\n objectPath.set(obj, path, arr)\n }\n arr.splice(at, 0, value)\n }\n\n objectPath.empty = function (obj, path) {\n if (isEmpty(path)) {\n return void 0\n }\n if (obj == null) {\n return void 0\n }\n\n var value, i\n if (!(value = objectPath.get(obj, path))) {\n return void 0\n }\n\n if (typeof value === 'string') {\n return objectPath.set(obj, path, '')\n } else if (isBoolean(value)) {\n return objectPath.set(obj, path, false)\n } else if (typeof value === 'number') {\n return objectPath.set(obj, path, 0)\n } else if (isArray(value)) {\n value.length = 0\n } else if (isObject(value)) {\n for (i in value) {\n if (hasShallowProperty(value, i)) {\n delete value[i]\n }\n }\n } else {\n return objectPath.set(obj, path, null)\n }\n }\n\n objectPath.push = function (obj, path /*, values */) {\n var arr = objectPath.get(obj, path)\n if (!isArray(arr)) {\n arr = []\n objectPath.set(obj, path, arr)\n }\n\n arr.push.apply(arr, Array.prototype.slice.call(arguments, 2))\n }\n\n objectPath.coalesce = function (obj, paths, defaultValue) {\n var value\n\n for (var i = 0, len = paths.length; i < len; i++) {\n if ((value = objectPath.get(obj, paths[i])) !== void 0) {\n return value\n }\n }\n\n return defaultValue\n }\n\n objectPath.get = function (obj, path, defaultValue) {\n if (typeof path === 'number') {\n path = [path]\n }\n if (!path || path.length === 0) {\n return obj\n }\n if (obj == null) {\n return defaultValue\n }\n if (typeof path === 'string') {\n return objectPath.get(obj, path.split('.'), defaultValue)\n }\n\n var currentPath = getKey(path[0])\n var nextObj = getShallowPropertySafely(obj, currentPath)\n if (nextObj === void 0) {\n return defaultValue\n }\n\n if (path.length === 1) {\n return nextObj\n }\n\n return objectPath.get(obj[currentPath], path.slice(1), defaultValue)\n }\n\n objectPath.del = function del (obj, path) {\n if (typeof path === 'number') {\n path = [path]\n }\n\n if (obj == null) {\n return obj\n }\n\n if (isEmpty(path)) {\n return obj\n }\n if (typeof path === 'string') {\n return objectPath.del(obj, path.split('.'))\n }\n\n var currentPath = getKey(path[0])\n getShallowPropertySafely(obj, currentPath)\n if (!hasShallowProperty(obj, currentPath)) {\n return obj\n }\n\n if (path.length === 1) {\n if (isArray(obj)) {\n obj.splice(currentPath, 1)\n } else {\n delete obj[currentPath]\n }\n } else {\n return objectPath.del(obj[currentPath], path.slice(1))\n }\n\n return obj\n }\n\n return objectPath\n }\n\n var mod = factory()\n mod.create = factory\n mod.withInheritedProps = factory({includeInheritedProps: true})\n return mod\n})\n","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var baseGet = require('./_baseGet'),\n baseSlice = require('./_baseSlice');\n\n/**\n * Gets the parent value at `path` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array} path The path to get the parent value of.\n * @returns {*} Returns the parent value.\n */\nfunction parent(object, path) {\n return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n}\n\nmodule.exports = parent;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var baseGet = require('./_baseGet'),\n baseSet = require('./_baseSet'),\n castPath = require('./_castPath');\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nmodule.exports = basePickBy;\n","var arrayPush = require('./_arrayPush'),\n getPrototype = require('./_getPrototype'),\n getSymbols = require('./_getSymbols'),\n stubArray = require('./stubArray');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own and inherited enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n var result = [];\n while (object) {\n arrayPush(result, getSymbols(object));\n object = getPrototype(object);\n }\n return result;\n};\n\nmodule.exports = getSymbolsIn;\n","var Symbol = require('./_Symbol');\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * Creates a clone of the `symbol` object.\n *\n * @private\n * @param {Object} symbol The symbol object to clone.\n * @returns {Object} Returns the cloned symbol object.\n */\nfunction cloneSymbol(symbol) {\n return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n}\n\nmodule.exports = cloneSymbol;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getTag = require('./_getTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar setTag = '[object Set]';\n\n/**\n * The base implementation of `_.isSet` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n */\nfunction baseIsSet(value) {\n return isObjectLike(value) && getTag(value) == setTag;\n}\n\nmodule.exports = baseIsSet;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer'),\n cloneDataView = require('./_cloneDataView'),\n cloneRegExp = require('./_cloneRegExp'),\n cloneSymbol = require('./_cloneSymbol'),\n cloneTypedArray = require('./_cloneTypedArray');\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/**\n * Initializes an object clone based on its `toStringTag`.\n *\n * **Note:** This function only supports cloning values with tags of\n * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n *\n * @private\n * @param {Object} object The object to clone.\n * @param {string} tag The `toStringTag` of the object to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneByTag(object, tag, isDeep) {\n var Ctor = object.constructor;\n switch (tag) {\n case arrayBufferTag:\n return cloneArrayBuffer(object);\n\n case boolTag:\n case dateTag:\n return new Ctor(+object);\n\n case dataViewTag:\n return cloneDataView(object, isDeep);\n\n case float32Tag: case float64Tag:\n case int8Tag: case int16Tag: case int32Tag:\n case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n return cloneTypedArray(object, isDeep);\n\n case mapTag:\n return new Ctor;\n\n case numberTag:\n case stringTag:\n return new Ctor(object);\n\n case regexpTag:\n return cloneRegExp(object);\n\n case setTag:\n return new Ctor;\n\n case symbolTag:\n return cloneSymbol(object);\n }\n}\n\nmodule.exports = initCloneByTag;\n","var flatten = require('./flatten'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nmodule.exports = flatRest;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Initializes an array clone.\n *\n * @private\n * @param {Array} array The array to clone.\n * @returns {Array} Returns the initialized clone.\n */\nfunction initCloneArray(array) {\n var length = array.length,\n result = new array.constructor(length);\n\n // Add properties assigned by `RegExp#exec`.\n if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n result.index = array.index;\n result.input = array.input;\n }\n return result;\n}\n\nmodule.exports = initCloneArray;\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n 'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n if (Array.isArray(arg)) {\n each(arg, context[fn], context);\n return true;\n }\n return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n var i;\n\n if (!obj) {\n return;\n }\n\n if (obj.forEach) {\n obj.forEach(iterator, context);\n } else if (obj.length !== undefined) {\n i = 0;\n while (i < obj.length) {\n iterator.call(context, obj[i], i, obj);\n i++;\n }\n } else {\n for (i in obj) {\n obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n }\n }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n return function() {\n var e = new Error('get-stack-trace');\n var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n .replace(/^\\s+at\\s+/gm, '')\n .replace(/^Object.\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n var log = window.console && (window.console.warn || window.console.log);\n if (log) {\n log.call(window.console, deprecationMessage, stack);\n }\n return method.apply(this, arguments);\n };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n assign = function assign(target) {\n if (target === undefined || target === null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n var output = Object(target);\n for (var index = 1; index < arguments.length; index++) {\n var source = arguments[index];\n if (source !== undefined && source !== null) {\n for (var nextKey in source) {\n if (source.hasOwnProperty(nextKey)) {\n output[nextKey] = source[nextKey];\n }\n }\n }\n }\n return output;\n };\n} else {\n assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n var keys = Object.keys(src);\n var i = 0;\n while (i < keys.length) {\n if (!merge || (merge && dest[keys[i]] === undefined)) {\n dest[keys[i]] = src[keys[i]];\n }\n i++;\n }\n return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n var baseP = base.prototype,\n childP;\n\n childP = child.prototype = Object.create(baseP);\n childP.constructor = child;\n childP._super = baseP;\n\n if (properties) {\n assign(childP, properties);\n }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n return function boundFn() {\n return fn.apply(context, arguments);\n };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n if (typeof val == TYPE_FUNCTION) {\n return val.apply(args ? args[0] || undefined : undefined, args);\n }\n return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.addEventListener(type, handler, false);\n });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n each(splitStr(types), function(type) {\n target.removeEventListener(type, handler, false);\n });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n while (node) {\n if (node == parent) {\n return true;\n }\n node = node.parentNode;\n }\n return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n if (src.indexOf && !findByKey) {\n return src.indexOf(find);\n } else {\n var i = 0;\n while (i < src.length) {\n if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n return i;\n }\n i++;\n }\n return -1;\n }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n var results = [];\n var values = [];\n var i = 0;\n\n while (i < src.length) {\n var val = key ? src[i][key] : src[i];\n if (inArray(values, val) < 0) {\n results.push(src[i]);\n }\n values[i] = val;\n i++;\n }\n\n if (sort) {\n if (!key) {\n results = results.sort();\n } else {\n results = results.sort(function sortUniqueArray(a, b) {\n return a[key] > b[key];\n });\n }\n }\n\n return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n var prefix, prop;\n var camelProp = property[0].toUpperCase() + property.slice(1);\n\n var i = 0;\n while (i < VENDOR_PREFIXES.length) {\n prefix = VENDOR_PREFIXES[i];\n prop = (prefix) ? prefix + camelProp : property;\n\n if (prop in obj) {\n return prop;\n }\n i++;\n }\n return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n var doc = element.ownerDocument || element;\n return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n var self = this;\n this.manager = manager;\n this.callback = callback;\n this.element = manager.element;\n this.target = manager.options.inputTarget;\n\n // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n // so when disabled the input events are completely bypassed.\n this.domHandler = function(ev) {\n if (boolOrFn(manager.options.enable, [manager])) {\n self.handler(ev);\n }\n };\n\n this.init();\n\n}\n\nInput.prototype = {\n /**\n * should handle the inputEvent data and trigger the callback\n * @virtual\n */\n handler: function() { },\n\n /**\n * bind the events\n */\n init: function() {\n this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n },\n\n /**\n * unbind the events\n */\n destroy: function() {\n this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n var Type;\n var inputClass = manager.options.inputClass;\n\n if (inputClass) {\n Type = inputClass;\n } else if (SUPPORT_POINTER_EVENTS) {\n Type = PointerEventInput;\n } else if (SUPPORT_ONLY_TOUCH) {\n Type = TouchInput;\n } else if (!SUPPORT_TOUCH) {\n Type = MouseInput;\n } else {\n Type = TouchMouseInput;\n }\n return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n var pointersLen = input.pointers.length;\n var changedPointersLen = input.changedPointers.length;\n var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n input.isFirst = !!isFirst;\n input.isFinal = !!isFinal;\n\n if (isFirst) {\n manager.session = {};\n }\n\n // source event is the normalized value of the domEvents\n // like 'touchstart, mouseup, pointerdown'\n input.eventType = eventType;\n\n // compute scale, rotation etc\n computeInputData(manager, input);\n\n // emit secret event\n manager.emit('hammer.input', input);\n\n manager.recognize(input);\n manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n var session = manager.session;\n var pointers = input.pointers;\n var pointersLength = pointers.length;\n\n // store the first input to calculate the distance and direction\n if (!session.firstInput) {\n session.firstInput = simpleCloneInputData(input);\n }\n\n // to compute scale and rotation we need to store the multiple touches\n if (pointersLength > 1 && !session.firstMultiple) {\n session.firstMultiple = simpleCloneInputData(input);\n } else if (pointersLength === 1) {\n session.firstMultiple = false;\n }\n\n var firstInput = session.firstInput;\n var firstMultiple = session.firstMultiple;\n var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n var center = input.center = getCenter(pointers);\n input.timeStamp = now();\n input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n input.angle = getAngle(offsetCenter, center);\n input.distance = getDistance(offsetCenter, center);\n\n computeDeltaXY(session, input);\n input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n input.overallVelocityX = overallVelocity.x;\n input.overallVelocityY = overallVelocity.y;\n input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n computeIntervalInputData(session, input);\n\n // find the correct target\n var target = manager.element;\n if (hasParent(input.srcEvent.target, target)) {\n target = input.srcEvent.target;\n }\n input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n var center = input.center;\n var offset = session.offsetDelta || {};\n var prevDelta = session.prevDelta || {};\n var prevInput = session.prevInput || {};\n\n if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n prevDelta = session.prevDelta = {\n x: prevInput.deltaX || 0,\n y: prevInput.deltaY || 0\n };\n\n offset = session.offsetDelta = {\n x: center.x,\n y: center.y\n };\n }\n\n input.deltaX = prevDelta.x + (center.x - offset.x);\n input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n var last = session.lastInterval || input,\n deltaTime = input.timeStamp - last.timeStamp,\n velocity, velocityX, velocityY, direction;\n\n if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n var deltaX = input.deltaX - last.deltaX;\n var deltaY = input.deltaY - last.deltaY;\n\n var v = getVelocity(deltaTime, deltaX, deltaY);\n velocityX = v.x;\n velocityY = v.y;\n velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n direction = getDirection(deltaX, deltaY);\n\n session.lastInterval = input;\n } else {\n // use latest velocity info if it doesn't overtake a minimum period\n velocity = last.velocity;\n velocityX = last.velocityX;\n velocityY = last.velocityY;\n direction = last.direction;\n }\n\n input.velocity = velocity;\n input.velocityX = velocityX;\n input.velocityY = velocityY;\n input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n // make a simple copy of the pointers because we will get a reference if we don't\n // we only need clientXY for the calculations\n var pointers = [];\n var i = 0;\n while (i < input.pointers.length) {\n pointers[i] = {\n clientX: round(input.pointers[i].clientX),\n clientY: round(input.pointers[i].clientY)\n };\n i++;\n }\n\n return {\n timeStamp: now(),\n pointers: pointers,\n center: getCenter(pointers),\n deltaX: input.deltaX,\n deltaY: input.deltaY\n };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n var pointersLength = pointers.length;\n\n // no need to loop when only one touch\n if (pointersLength === 1) {\n return {\n x: round(pointers[0].clientX),\n y: round(pointers[0].clientY)\n };\n }\n\n var x = 0, y = 0, i = 0;\n while (i < pointersLength) {\n x += pointers[i].clientX;\n y += pointers[i].clientY;\n i++;\n }\n\n return {\n x: round(x / pointersLength),\n y: round(y / pointersLength)\n };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n return {\n x: x / deltaTime || 0,\n y: y / deltaTime || 0\n };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n if (x === y) {\n return DIRECTION_NONE;\n }\n\n if (abs(x) >= abs(y)) {\n return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n }\n return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n\n return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n if (!props) {\n props = PROPS_XY;\n }\n var x = p2[props[0]] - p1[props[0]],\n y = p2[props[1]] - p1[props[1]];\n return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n mousedown: INPUT_START,\n mousemove: INPUT_MOVE,\n mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n this.evEl = MOUSE_ELEMENT_EVENTS;\n this.evWin = MOUSE_WINDOW_EVENTS;\n\n this.pressed = false; // mousedown state\n\n Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function MEhandler(ev) {\n var eventType = MOUSE_INPUT_MAP[ev.type];\n\n // on start we want to have the left mouse button down\n if (eventType & INPUT_START && ev.button === 0) {\n this.pressed = true;\n }\n\n if (eventType & INPUT_MOVE && ev.which !== 1) {\n eventType = INPUT_END;\n }\n\n // mouse must be down\n if (!this.pressed) {\n return;\n }\n\n if (eventType & INPUT_END) {\n this.pressed = false;\n }\n\n this.callback(this.manager, eventType, {\n pointers: [ev],\n changedPointers: [ev],\n pointerType: INPUT_TYPE_MOUSE,\n srcEvent: ev\n });\n }\n});\n\nvar POINTER_INPUT_MAP = {\n pointerdown: INPUT_START,\n pointermove: INPUT_MOVE,\n pointerup: INPUT_END,\n pointercancel: INPUT_CANCEL,\n pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n 2: INPUT_TYPE_TOUCH,\n 3: INPUT_TYPE_PEN,\n 4: INPUT_TYPE_MOUSE,\n 5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n this.evEl = POINTER_ELEMENT_EVENTS;\n this.evWin = POINTER_WINDOW_EVENTS;\n\n Input.apply(this, arguments);\n\n this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n /**\n * handle mouse events\n * @param {Object} ev\n */\n handler: function PEhandler(ev) {\n var store = this.store;\n var removePointer = false;\n\n var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n // get index of the event in the store\n var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n // start and mouse must be down\n if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n if (storeIndex < 0) {\n store.push(ev);\n storeIndex = store.length - 1;\n }\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n removePointer = true;\n }\n\n // it not found, so the pointer hasn't been down (so it's probably a hover)\n if (storeIndex < 0) {\n return;\n }\n\n // update the event in the store\n store[storeIndex] = ev;\n\n this.callback(this.manager, eventType, {\n pointers: store,\n changedPointers: [ev],\n pointerType: pointerType,\n srcEvent: ev\n });\n\n if (removePointer) {\n // remove from the store\n store.splice(storeIndex, 1);\n }\n }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n this.started = false;\n\n Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n handler: function TEhandler(ev) {\n var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n // should we handle the touch events?\n if (type === INPUT_START) {\n this.started = true;\n }\n\n if (!this.started) {\n return;\n }\n\n var touches = normalizeSingleTouches.call(this, ev, type);\n\n // when done, reset the started state\n if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n this.started = false;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n var all = toArray(ev.touches);\n var changed = toArray(ev.changedTouches);\n\n if (type & (INPUT_END | INPUT_CANCEL)) {\n all = uniqueArray(all.concat(changed), 'identifier', true);\n }\n\n return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n touchstart: INPUT_START,\n touchmove: INPUT_MOVE,\n touchend: INPUT_END,\n touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n this.evTarget = TOUCH_TARGET_EVENTS;\n this.targetIds = {};\n\n Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n handler: function MTEhandler(ev) {\n var type = TOUCH_INPUT_MAP[ev.type];\n var touches = getTouches.call(this, ev, type);\n if (!touches) {\n return;\n }\n\n this.callback(this.manager, type, {\n pointers: touches[0],\n changedPointers: touches[1],\n pointerType: INPUT_TYPE_TOUCH,\n srcEvent: ev\n });\n }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n var allTouches = toArray(ev.touches);\n var targetIds = this.targetIds;\n\n // when there is only one touch, the process can be simplified\n if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n targetIds[allTouches[0].identifier] = true;\n return [allTouches, allTouches];\n }\n\n var i,\n targetTouches,\n changedTouches = toArray(ev.changedTouches),\n changedTargetTouches = [],\n target = this.target;\n\n // get target touches from touches\n targetTouches = allTouches.filter(function(touch) {\n return hasParent(touch.target, target);\n });\n\n // collect touches\n if (type === INPUT_START) {\n i = 0;\n while (i < targetTouches.length) {\n targetIds[targetTouches[i].identifier] = true;\n i++;\n }\n }\n\n // filter changed touches to only contain touches that exist in the collected target ids\n i = 0;\n while (i < changedTouches.length) {\n if (targetIds[changedTouches[i].identifier]) {\n changedTargetTouches.push(changedTouches[i]);\n }\n\n // cleanup removed touches\n if (type & (INPUT_END | INPUT_CANCEL)) {\n delete targetIds[changedTouches[i].identifier];\n }\n i++;\n }\n\n if (!changedTargetTouches.length) {\n return;\n }\n\n return [\n // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n changedTargetTouches\n ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n Input.apply(this, arguments);\n\n var handler = bindFn(this.handler, this);\n this.touch = new TouchInput(this.manager, handler);\n this.mouse = new MouseInput(this.manager, handler);\n\n this.primaryTouch = null;\n this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n /**\n * handle mouse and touch events\n * @param {Hammer} manager\n * @param {String} inputEvent\n * @param {Object} inputData\n */\n handler: function TMEhandler(manager, inputEvent, inputData) {\n var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n return;\n }\n\n // when we're in a touch event, record touches to de-dupe synthetic mouse event\n if (isTouch) {\n recordTouches.call(this, inputEvent, inputData);\n } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n return;\n }\n\n this.callback(manager, inputEvent, inputData);\n },\n\n /**\n * remove the event listeners\n */\n destroy: function destroy() {\n this.touch.destroy();\n this.mouse.destroy();\n }\n});\n\nfunction recordTouches(eventType, eventData) {\n if (eventType & INPUT_START) {\n this.primaryTouch = eventData.changedPointers[0].identifier;\n setLastTouch.call(this, eventData);\n } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n setLastTouch.call(this, eventData);\n }\n}\n\nfunction setLastTouch(eventData) {\n var touch = eventData.changedPointers[0];\n\n if (touch.identifier === this.primaryTouch) {\n var lastTouch = {x: touch.clientX, y: touch.clientY};\n this.lastTouches.push(lastTouch);\n var lts = this.lastTouches;\n var removeLastTouch = function() {\n var i = lts.indexOf(lastTouch);\n if (i > -1) {\n lts.splice(i, 1);\n }\n };\n setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n }\n}\n\nfunction isSyntheticEvent(eventData) {\n var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n for (var i = 0; i < this.lastTouches.length; i++) {\n var t = this.lastTouches[i];\n var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n return true;\n }\n }\n return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n this.manager = manager;\n this.set(value);\n}\n\nTouchAction.prototype = {\n /**\n * set the touchAction value on the element or enable the polyfill\n * @param {String} value\n */\n set: function(value) {\n // find out the touch-action by the event handlers\n if (value == TOUCH_ACTION_COMPUTE) {\n value = this.compute();\n }\n\n if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n }\n this.actions = value.toLowerCase().trim();\n },\n\n /**\n * just re-set the touchAction value\n */\n update: function() {\n this.set(this.manager.options.touchAction);\n },\n\n /**\n * compute the value for the touchAction property based on the recognizer's settings\n * @returns {String} value\n */\n compute: function() {\n var actions = [];\n each(this.manager.recognizers, function(recognizer) {\n if (boolOrFn(recognizer.options.enable, [recognizer])) {\n actions = actions.concat(recognizer.getTouchAction());\n }\n });\n return cleanTouchActions(actions.join(' '));\n },\n\n /**\n * this method is called on each input cycle and provides the preventing of the browser behavior\n * @param {Object} input\n */\n preventDefaults: function(input) {\n var srcEvent = input.srcEvent;\n var direction = input.offsetDirection;\n\n // if the touch action did prevented once this session\n if (this.manager.session.prevented) {\n srcEvent.preventDefault();\n return;\n }\n\n var actions = this.actions;\n var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n if (hasNone) {\n //do not prevent defaults if this is a tap gesture\n\n var isTapPointer = input.pointers.length === 1;\n var isTapMovement = input.distance < 2;\n var isTapTouchTime = input.deltaTime < 250;\n\n if (isTapPointer && isTapMovement && isTapTouchTime) {\n return;\n }\n }\n\n if (hasPanX && hasPanY) {\n // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n return;\n }\n\n if (hasNone ||\n (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n (hasPanX && direction & DIRECTION_VERTICAL)) {\n return this.preventSrc(srcEvent);\n }\n },\n\n /**\n * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n * @param {Object} srcEvent\n */\n preventSrc: function(srcEvent) {\n this.manager.session.prevented = true;\n srcEvent.preventDefault();\n }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n // none\n if (inStr(actions, TOUCH_ACTION_NONE)) {\n return TOUCH_ACTION_NONE;\n }\n\n var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n // if both pan-x and pan-y are set (different recognizers\n // for different directions, e.g. horizontal pan but vertical swipe?)\n // we need none (as otherwise with pan-x pan-y combined none of these\n // recognizers will work, since the browser would handle all panning\n if (hasPanX && hasPanY) {\n return TOUCH_ACTION_NONE;\n }\n\n // pan-x OR pan-y\n if (hasPanX || hasPanY) {\n return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n }\n\n // manipulation\n if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n return TOUCH_ACTION_MANIPULATION;\n }\n\n return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n if (!NATIVE_TOUCH_ACTION) {\n return false;\n }\n var touchMap = {};\n var cssSupports = window.CSS && window.CSS.supports;\n ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n // If css.supports is not supported but there is native touch-action assume it supports\n // all values. This is the case for IE 10 and 11.\n touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n });\n return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n * Possible\n * |\n * +-----+---------------+\n * | |\n * +-----+-----+ |\n * | | |\n * Failed Cancelled |\n * +-------+------+\n * | |\n * Recognized Began\n * |\n * Changed\n * |\n * Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n this.options = assign({}, this.defaults, options || {});\n\n this.id = uniqueId();\n\n this.manager = null;\n\n // default is enable true\n this.options.enable = ifUndefined(this.options.enable, true);\n\n this.state = STATE_POSSIBLE;\n\n this.simultaneous = {};\n this.requireFail = [];\n}\n\nRecognizer.prototype = {\n /**\n * @virtual\n * @type {Object}\n */\n defaults: {},\n\n /**\n * set options\n * @param {Object} options\n * @return {Recognizer}\n */\n set: function(options) {\n assign(this.options, options);\n\n // also update the touchAction, in case something changed about the directions/enabled state\n this.manager && this.manager.touchAction.update();\n return this;\n },\n\n /**\n * recognize simultaneous with an other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n recognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n return this;\n }\n\n var simultaneous = this.simultaneous;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (!simultaneous[otherRecognizer.id]) {\n simultaneous[otherRecognizer.id] = otherRecognizer;\n otherRecognizer.recognizeWith(this);\n }\n return this;\n },\n\n /**\n * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRecognizeWith: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n delete this.simultaneous[otherRecognizer.id];\n return this;\n },\n\n /**\n * recognizer can only run when an other is failing\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n requireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n return this;\n }\n\n var requireFail = this.requireFail;\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n if (inArray(requireFail, otherRecognizer) === -1) {\n requireFail.push(otherRecognizer);\n otherRecognizer.requireFailure(this);\n }\n return this;\n },\n\n /**\n * drop the requireFailure link. it does not remove the link on the other recognizer.\n * @param {Recognizer} otherRecognizer\n * @returns {Recognizer} this\n */\n dropRequireFailure: function(otherRecognizer) {\n if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n return this;\n }\n\n otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n var index = inArray(this.requireFail, otherRecognizer);\n if (index > -1) {\n this.requireFail.splice(index, 1);\n }\n return this;\n },\n\n /**\n * has require failures boolean\n * @returns {boolean}\n */\n hasRequireFailures: function() {\n return this.requireFail.length > 0;\n },\n\n /**\n * if the recognizer can recognize simultaneous with an other recognizer\n * @param {Recognizer} otherRecognizer\n * @returns {Boolean}\n */\n canRecognizeWith: function(otherRecognizer) {\n return !!this.simultaneous[otherRecognizer.id];\n },\n\n /**\n * You should use `tryEmit` instead of `emit` directly to check\n * that all the needed recognizers has failed before emitting.\n * @param {Object} input\n */\n emit: function(input) {\n var self = this;\n var state = this.state;\n\n function emit(event) {\n self.manager.emit(event, input);\n }\n\n // 'panstart' and 'panmove'\n if (state < STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n\n emit(self.options.event); // simple 'eventName' events\n\n if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n emit(input.additionalEvent);\n }\n\n // panend and pancancel\n if (state >= STATE_ENDED) {\n emit(self.options.event + stateStr(state));\n }\n },\n\n /**\n * Check that all the require failure recognizers has failed,\n * if true, it emits a gesture event,\n * otherwise, setup the state to FAILED.\n * @param {Object} input\n */\n tryEmit: function(input) {\n if (this.canEmit()) {\n return this.emit(input);\n }\n // it's failing anyway\n this.state = STATE_FAILED;\n },\n\n /**\n * can we emit?\n * @returns {boolean}\n */\n canEmit: function() {\n var i = 0;\n while (i < this.requireFail.length) {\n if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n return false;\n }\n i++;\n }\n return true;\n },\n\n /**\n * update the recognizer\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n // make a new copy of the inputData\n // so we can change the inputData without messing up the other recognizers\n var inputDataClone = assign({}, inputData);\n\n // is is enabled and allow recognizing?\n if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n this.reset();\n this.state = STATE_FAILED;\n return;\n }\n\n // reset when we've reached the end\n if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n this.state = STATE_POSSIBLE;\n }\n\n this.state = this.process(inputDataClone);\n\n // the recognizer has recognized a gesture\n // so trigger an event\n if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n this.tryEmit(inputDataClone);\n }\n },\n\n /**\n * return the state of the recognizer\n * the actual recognizing happens in this method\n * @virtual\n * @param {Object} inputData\n * @returns {Const} STATE\n */\n process: function(inputData) { }, // jshint ignore:line\n\n /**\n * return the preferred touch-action\n * @virtual\n * @returns {Array}\n */\n getTouchAction: function() { },\n\n /**\n * called when the gesture isn't allowed to recognize\n * like when another is being recognized or it is disabled\n * @virtual\n */\n reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n if (state & STATE_CANCELLED) {\n return 'cancel';\n } else if (state & STATE_ENDED) {\n return 'end';\n } else if (state & STATE_CHANGED) {\n return 'move';\n } else if (state & STATE_BEGAN) {\n return 'start';\n }\n return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n if (direction == DIRECTION_DOWN) {\n return 'down';\n } else if (direction == DIRECTION_UP) {\n return 'up';\n } else if (direction == DIRECTION_LEFT) {\n return 'left';\n } else if (direction == DIRECTION_RIGHT) {\n return 'right';\n }\n return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n var manager = recognizer.manager;\n if (manager) {\n return manager.get(otherRecognizer);\n }\n return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof AttrRecognizer\n */\n defaults: {\n /**\n * @type {Number}\n * @default 1\n */\n pointers: 1\n },\n\n /**\n * Used to check if it the recognizer receives valid input, like input.distance > 10.\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {Boolean} recognized\n */\n attrTest: function(input) {\n var optionPointers = this.options.pointers;\n return optionPointers === 0 || input.pointers.length === optionPointers;\n },\n\n /**\n * Process the input and return the state for the recognizer\n * @memberof AttrRecognizer\n * @param {Object} input\n * @returns {*} State\n */\n process: function(input) {\n var state = this.state;\n var eventType = input.eventType;\n\n var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n var isValid = this.attrTest(input);\n\n // on cancel input and we've recognized before, return STATE_CANCELLED\n if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n return state | STATE_CANCELLED;\n } else if (isRecognized || isValid) {\n if (eventType & INPUT_END) {\n return state | STATE_ENDED;\n } else if (!(state & STATE_BEGAN)) {\n return STATE_BEGAN;\n }\n return state | STATE_CHANGED;\n }\n return STATE_FAILED;\n }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n AttrRecognizer.apply(this, arguments);\n\n this.pX = null;\n this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PanRecognizer\n */\n defaults: {\n event: 'pan',\n threshold: 10,\n pointers: 1,\n direction: DIRECTION_ALL\n },\n\n getTouchAction: function() {\n var direction = this.options.direction;\n var actions = [];\n if (direction & DIRECTION_HORIZONTAL) {\n actions.push(TOUCH_ACTION_PAN_Y);\n }\n if (direction & DIRECTION_VERTICAL) {\n actions.push(TOUCH_ACTION_PAN_X);\n }\n return actions;\n },\n\n directionTest: function(input) {\n var options = this.options;\n var hasMoved = true;\n var distance = input.distance;\n var direction = input.direction;\n var x = input.deltaX;\n var y = input.deltaY;\n\n // lock to axis?\n if (!(direction & options.direction)) {\n if (options.direction & DIRECTION_HORIZONTAL) {\n direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n hasMoved = x != this.pX;\n distance = Math.abs(input.deltaX);\n } else {\n direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n hasMoved = y != this.pY;\n distance = Math.abs(input.deltaY);\n }\n }\n input.direction = direction;\n return hasMoved && distance > options.threshold && direction & options.direction;\n },\n\n attrTest: function(input) {\n return AttrRecognizer.prototype.attrTest.call(this, input) &&\n (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n },\n\n emit: function(input) {\n\n this.pX = input.deltaX;\n this.pY = input.deltaY;\n\n var direction = directionStr(input.direction);\n\n if (direction) {\n input.additionalEvent = this.options.event + direction;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'pinch',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n },\n\n emit: function(input) {\n if (input.scale !== 1) {\n var inOut = input.scale < 1 ? 'in' : 'out';\n input.additionalEvent = this.options.event + inOut;\n }\n this._super.emit.call(this, input);\n }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n Recognizer.apply(this, arguments);\n\n this._timer = null;\n this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PressRecognizer\n */\n defaults: {\n event: 'press',\n pointers: 1,\n time: 251, // minimal time of the pointer to be pressed\n threshold: 9 // a minimal movement is ok, but keep it low\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_AUTO];\n },\n\n process: function(input) {\n var options = this.options;\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTime = input.deltaTime > options.time;\n\n this._input = input;\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n this.reset();\n } else if (input.eventType & INPUT_START) {\n this.reset();\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.time, this);\n } else if (input.eventType & INPUT_END) {\n return STATE_RECOGNIZED;\n }\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function(input) {\n if (this.state !== STATE_RECOGNIZED) {\n return;\n }\n\n if (input && (input.eventType & INPUT_END)) {\n this.manager.emit(this.options.event + 'up', input);\n } else {\n this._input.timeStamp = now();\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof RotateRecognizer\n */\n defaults: {\n event: 'rotate',\n threshold: 0,\n pointers: 2\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_NONE];\n },\n\n attrTest: function(input) {\n return this._super.attrTest.call(this, input) &&\n (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n /**\n * @namespace\n * @memberof SwipeRecognizer\n */\n defaults: {\n event: 'swipe',\n threshold: 10,\n velocity: 0.3,\n direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n pointers: 1\n },\n\n getTouchAction: function() {\n return PanRecognizer.prototype.getTouchAction.call(this);\n },\n\n attrTest: function(input) {\n var direction = this.options.direction;\n var velocity;\n\n if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n velocity = input.overallVelocity;\n } else if (direction & DIRECTION_HORIZONTAL) {\n velocity = input.overallVelocityX;\n } else if (direction & DIRECTION_VERTICAL) {\n velocity = input.overallVelocityY;\n }\n\n return this._super.attrTest.call(this, input) &&\n direction & input.offsetDirection &&\n input.distance > this.options.threshold &&\n input.maxPointers == this.options.pointers &&\n abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n },\n\n emit: function(input) {\n var direction = directionStr(input.offsetDirection);\n if (direction) {\n this.manager.emit(this.options.event + direction, input);\n }\n\n this.manager.emit(this.options.event, input);\n }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n Recognizer.apply(this, arguments);\n\n // previous time and center,\n // used for tap counting\n this.pTime = false;\n this.pCenter = false;\n\n this._timer = null;\n this._input = null;\n this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n /**\n * @namespace\n * @memberof PinchRecognizer\n */\n defaults: {\n event: 'tap',\n pointers: 1,\n taps: 1,\n interval: 300, // max time between the multi-tap taps\n time: 250, // max time of the pointer to be down (like finger on the screen)\n threshold: 9, // a minimal movement is ok, but keep it low\n posThreshold: 10 // a multi-tap can be a bit off the initial position\n },\n\n getTouchAction: function() {\n return [TOUCH_ACTION_MANIPULATION];\n },\n\n process: function(input) {\n var options = this.options;\n\n var validPointers = input.pointers.length === options.pointers;\n var validMovement = input.distance < options.threshold;\n var validTouchTime = input.deltaTime < options.time;\n\n this.reset();\n\n if ((input.eventType & INPUT_START) && (this.count === 0)) {\n return this.failTimeout();\n }\n\n // we only allow little movement\n // and we've reached an end event, so a tap is possible\n if (validMovement && validTouchTime && validPointers) {\n if (input.eventType != INPUT_END) {\n return this.failTimeout();\n }\n\n var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n this.pTime = input.timeStamp;\n this.pCenter = input.center;\n\n if (!validMultiTap || !validInterval) {\n this.count = 1;\n } else {\n this.count += 1;\n }\n\n this._input = input;\n\n // if tap count matches we have recognized it,\n // else it has began recognizing...\n var tapCount = this.count % options.taps;\n if (tapCount === 0) {\n // no failing requirements, immediately trigger the tap event\n // or wait as long as the multitap interval to trigger\n if (!this.hasRequireFailures()) {\n return STATE_RECOGNIZED;\n } else {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_RECOGNIZED;\n this.tryEmit();\n }, options.interval, this);\n return STATE_BEGAN;\n }\n }\n }\n return STATE_FAILED;\n },\n\n failTimeout: function() {\n this._timer = setTimeoutContext(function() {\n this.state = STATE_FAILED;\n }, this.options.interval, this);\n return STATE_FAILED;\n },\n\n reset: function() {\n clearTimeout(this._timer);\n },\n\n emit: function() {\n if (this.state == STATE_RECOGNIZED) {\n this._input.tapCount = this.count;\n this.manager.emit(this.options.event, this._input);\n }\n }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n options = options || {};\n options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n /**\n * set if DOM events are being triggered.\n * But this is slower and unused by simple implementations, so disabled by default.\n * @type {Boolean}\n * @default false\n */\n domEvents: false,\n\n /**\n * The value for the touchAction property/fallback.\n * When set to `compute` it will magically set the correct value based on the added recognizers.\n * @type {String}\n * @default compute\n */\n touchAction: TOUCH_ACTION_COMPUTE,\n\n /**\n * @type {Boolean}\n * @default true\n */\n enable: true,\n\n /**\n * EXPERIMENTAL FEATURE -- can be removed/changed\n * Change the parent input target element.\n * If Null, then it is being set the to main element.\n * @type {Null|EventTarget}\n * @default null\n */\n inputTarget: null,\n\n /**\n * force an input class\n * @type {Null|Function}\n * @default null\n */\n inputClass: null,\n\n /**\n * Default recognizer setup when calling `Hammer()`\n * When creating a new Manager these will be skipped.\n * @type {Array}\n */\n preset: [\n // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n [RotateRecognizer, {enable: false}],\n [PinchRecognizer, {enable: false}, ['rotate']],\n [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n [TapRecognizer],\n [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n [PressRecognizer]\n ],\n\n /**\n * Some CSS properties can be used to improve the working of Hammer.\n * Add them to this method and they will be set when creating a new Manager.\n * @namespace\n */\n cssProps: {\n /**\n * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userSelect: 'none',\n\n /**\n * Disable the Windows Phone grippers when pressing an element.\n * @type {String}\n * @default 'none'\n */\n touchSelect: 'none',\n\n /**\n * Disables the default callout shown when you touch and hold a touch target.\n * On iOS, when you touch and hold a touch target such as a link, Safari displays\n * a callout containing information about the link. This property allows you to disable that callout.\n * @type {String}\n * @default 'none'\n */\n touchCallout: 'none',\n\n /**\n * Specifies whether zooming is enabled. Used by IE10>\n * @type {String}\n * @default 'none'\n */\n contentZooming: 'none',\n\n /**\n * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n * @type {String}\n * @default 'none'\n */\n userDrag: 'none',\n\n /**\n * Overrides the highlight color shown when the user taps a link or a JavaScript\n * clickable element in iOS. This property obeys the alpha value, if specified.\n * @type {String}\n * @default 'rgba(0,0,0,0)'\n */\n tapHighlightColor: 'rgba(0,0,0,0)'\n }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n this.options = assign({}, Hammer.defaults, options || {});\n\n this.options.inputTarget = this.options.inputTarget || element;\n\n this.handlers = {};\n this.session = {};\n this.recognizers = [];\n this.oldCssProps = {};\n\n this.element = element;\n this.input = createInputInstance(this);\n this.touchAction = new TouchAction(this, this.options.touchAction);\n\n toggleCssProps(this, true);\n\n each(this.options.recognizers, function(item) {\n var recognizer = this.add(new (item[0])(item[1]));\n item[2] && recognizer.recognizeWith(item[2]);\n item[3] && recognizer.requireFailure(item[3]);\n }, this);\n}\n\nManager.prototype = {\n /**\n * set options\n * @param {Object} options\n * @returns {Manager}\n */\n set: function(options) {\n assign(this.options, options);\n\n // Options that need a little more setup\n if (options.touchAction) {\n this.touchAction.update();\n }\n if (options.inputTarget) {\n // Clean up existing event listeners and reinitialize\n this.input.destroy();\n this.input.target = options.inputTarget;\n this.input.init();\n }\n return this;\n },\n\n /**\n * stop recognizing for this session.\n * This session will be discarded, when a new [input]start event is fired.\n * When forced, the recognizer cycle is stopped immediately.\n * @param {Boolean} [force]\n */\n stop: function(force) {\n this.session.stopped = force ? FORCED_STOP : STOP;\n },\n\n /**\n * run the recognizers!\n * called by the inputHandler function on every movement of the pointers (touches)\n * it walks through all the recognizers and tries to detect the gesture that is being made\n * @param {Object} inputData\n */\n recognize: function(inputData) {\n var session = this.session;\n if (session.stopped) {\n return;\n }\n\n // run the touch-action polyfill\n this.touchAction.preventDefaults(inputData);\n\n var recognizer;\n var recognizers = this.recognizers;\n\n // this holds the recognizer that is being recognized.\n // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n // if no recognizer is detecting a thing, it is set to `null`\n var curRecognizer = session.curRecognizer;\n\n // reset when the last recognizer is recognized\n // or when we're in a new session\n if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n curRecognizer = session.curRecognizer = null;\n }\n\n var i = 0;\n while (i < recognizers.length) {\n recognizer = recognizers[i];\n\n // find out if we are allowed try to recognize the input for this one.\n // 1. allow if the session is NOT forced stopped (see the .stop() method)\n // 2. allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n // that is being recognized.\n // 3. allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n // this can be setup with the `recognizeWith()` method on the recognizer.\n if (session.stopped !== FORCED_STOP && ( // 1\n !curRecognizer || recognizer == curRecognizer || // 2\n recognizer.canRecognizeWith(curRecognizer))) { // 3\n recognizer.recognize(inputData);\n } else {\n recognizer.reset();\n }\n\n // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n // current active recognizer. but only if we don't already have an active recognizer\n if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n curRecognizer = session.curRecognizer = recognizer;\n }\n i++;\n }\n },\n\n /**\n * get a recognizer by its event name.\n * @param {Recognizer|String} recognizer\n * @returns {Recognizer|Null}\n */\n get: function(recognizer) {\n if (recognizer instanceof Recognizer) {\n return recognizer;\n }\n\n var recognizers = this.recognizers;\n for (var i = 0; i < recognizers.length; i++) {\n if (recognizers[i].options.event == recognizer) {\n return recognizers[i];\n }\n }\n return null;\n },\n\n /**\n * add a recognizer to the manager\n * existing recognizers with the same event name will be removed\n * @param {Recognizer} recognizer\n * @returns {Recognizer|Manager}\n */\n add: function(recognizer) {\n if (invokeArrayArg(recognizer, 'add', this)) {\n return this;\n }\n\n // remove existing\n var existing = this.get(recognizer.options.event);\n if (existing) {\n this.remove(existing);\n }\n\n this.recognizers.push(recognizer);\n recognizer.manager = this;\n\n this.touchAction.update();\n return recognizer;\n },\n\n /**\n * remove a recognizer by name or instance\n * @param {Recognizer|String} recognizer\n * @returns {Manager}\n */\n remove: function(recognizer) {\n if (invokeArrayArg(recognizer, 'remove', this)) {\n return this;\n }\n\n recognizer = this.get(recognizer);\n\n // let's make sure this recognizer exists\n if (recognizer) {\n var recognizers = this.recognizers;\n var index = inArray(recognizers, recognizer);\n\n if (index !== -1) {\n recognizers.splice(index, 1);\n this.touchAction.update();\n }\n }\n\n return this;\n },\n\n /**\n * bind event\n * @param {String} events\n * @param {Function} handler\n * @returns {EventEmitter} this\n */\n on: function(events, handler) {\n if (events === undefined) {\n return;\n }\n if (handler === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n handlers[event] = handlers[event] || [];\n handlers[event].push(handler);\n });\n return this;\n },\n\n /**\n * unbind event, leave emit blank to remove all handlers\n * @param {String} events\n * @param {Function} [handler]\n * @returns {EventEmitter} this\n */\n off: function(events, handler) {\n if (events === undefined) {\n return;\n }\n\n var handlers = this.handlers;\n each(splitStr(events), function(event) {\n if (!handler) {\n delete handlers[event];\n } else {\n handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n }\n });\n return this;\n },\n\n /**\n * emit event to the listeners\n * @param {String} event\n * @param {Object} data\n */\n emit: function(event, data) {\n // we also want to trigger dom events\n if (this.options.domEvents) {\n triggerDomEvent(event, data);\n }\n\n // no handlers, so skip it all\n var handlers = this.handlers[event] && this.handlers[event].slice();\n if (!handlers || !handlers.length) {\n return;\n }\n\n data.type = event;\n data.preventDefault = function() {\n data.srcEvent.preventDefault();\n };\n\n var i = 0;\n while (i < handlers.length) {\n handlers[i](data);\n i++;\n }\n },\n\n /**\n * destroy the manager and unbinds all events\n * it doesn't unbind dom events, that is the user own responsibility\n */\n destroy: function() {\n this.element && toggleCssProps(this, false);\n\n this.handlers = {};\n this.session = {};\n this.input.destroy();\n this.element = null;\n }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n var element = manager.element;\n if (!element.style) {\n return;\n }\n var prop;\n each(manager.options.cssProps, function(value, name) {\n prop = prefixed(element.style, name);\n if (add) {\n manager.oldCssProps[prop] = element.style[prop];\n element.style[prop] = value;\n } else {\n element.style[prop] = manager.oldCssProps[prop] || '';\n }\n });\n if (!add) {\n manager.oldCssProps = {};\n }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n var gestureEvent = document.createEvent('Event');\n gestureEvent.initEvent(event, true, true);\n gestureEvent.gesture = data;\n data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n INPUT_START: INPUT_START,\n INPUT_MOVE: INPUT_MOVE,\n INPUT_END: INPUT_END,\n INPUT_CANCEL: INPUT_CANCEL,\n\n STATE_POSSIBLE: STATE_POSSIBLE,\n STATE_BEGAN: STATE_BEGAN,\n STATE_CHANGED: STATE_CHANGED,\n STATE_ENDED: STATE_ENDED,\n STATE_RECOGNIZED: STATE_RECOGNIZED,\n STATE_CANCELLED: STATE_CANCELLED,\n STATE_FAILED: STATE_FAILED,\n\n DIRECTION_NONE: DIRECTION_NONE,\n DIRECTION_LEFT: DIRECTION_LEFT,\n DIRECTION_RIGHT: DIRECTION_RIGHT,\n DIRECTION_UP: DIRECTION_UP,\n DIRECTION_DOWN: DIRECTION_DOWN,\n DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n DIRECTION_ALL: DIRECTION_ALL,\n\n Manager: Manager,\n Input: Input,\n TouchAction: TouchAction,\n\n TouchInput: TouchInput,\n MouseInput: MouseInput,\n PointerEventInput: PointerEventInput,\n TouchMouseInput: TouchMouseInput,\n SingleTouchInput: SingleTouchInput,\n\n Recognizer: Recognizer,\n AttrRecognizer: AttrRecognizer,\n Tap: TapRecognizer,\n Pan: PanRecognizer,\n Swipe: SwipeRecognizer,\n Pinch: PinchRecognizer,\n Rotate: RotateRecognizer,\n Press: PressRecognizer,\n\n on: addEventListeners,\n off: removeEventListeners,\n each: each,\n merge: merge,\n extend: extend,\n assign: assign,\n inherit: inherit,\n bindFn: bindFn,\n prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n// style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n define(function() {\n return Hammer;\n });\n} else if (typeof module != 'undefined' && module.exports) {\n module.exports = Hammer;\n} else {\n window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","var baseIsMap = require('./_baseIsMap'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsMap = nodeUtil && nodeUtil.isMap;\n\n/**\n * Checks if `value` is classified as a `Map` object.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n * @example\n *\n * _.isMap(new Map);\n * // => true\n *\n * _.isMap(new WeakMap);\n * // => false\n */\nvar isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\nmodule.exports = isMap;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n"],"sourceRoot":""}