Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / lodash / core.js
1 /**
2  * @license
3  * Lodash (Custom Build) <https://lodash.com/>
4  * Build: `lodash core -o ./dist/lodash.core.js`
5  * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
6  * Released under MIT license <https://lodash.com/license>
7  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
8  * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
9  */
10 ;(function() {
11
12   /** Used as a safe reference for `undefined` in pre-ES5 environments. */
13   var undefined;
14
15   /** Used as the semantic version number. */
16   var VERSION = '4.17.20';
17
18   /** Error message constants. */
19   var FUNC_ERROR_TEXT = 'Expected a function';
20
21   /** Used to compose bitmasks for value comparisons. */
22   var COMPARE_PARTIAL_FLAG = 1,
23       COMPARE_UNORDERED_FLAG = 2;
24
25   /** Used to compose bitmasks for function metadata. */
26   var WRAP_BIND_FLAG = 1,
27       WRAP_PARTIAL_FLAG = 32;
28
29   /** Used as references for various `Number` constants. */
30   var INFINITY = 1 / 0,
31       MAX_SAFE_INTEGER = 9007199254740991;
32
33   /** `Object#toString` result references. */
34   var argsTag = '[object Arguments]',
35       arrayTag = '[object Array]',
36       asyncTag = '[object AsyncFunction]',
37       boolTag = '[object Boolean]',
38       dateTag = '[object Date]',
39       errorTag = '[object Error]',
40       funcTag = '[object Function]',
41       genTag = '[object GeneratorFunction]',
42       numberTag = '[object Number]',
43       objectTag = '[object Object]',
44       proxyTag = '[object Proxy]',
45       regexpTag = '[object RegExp]',
46       stringTag = '[object String]';
47
48   /** Used to match HTML entities and HTML characters. */
49   var reUnescapedHtml = /[&<>"']/g,
50       reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
51
52   /** Used to detect unsigned integer values. */
53   var reIsUint = /^(?:0|[1-9]\d*)$/;
54
55   /** Used to map characters to HTML entities. */
56   var htmlEscapes = {
57     '&': '&amp;',
58     '<': '&lt;',
59     '>': '&gt;',
60     '"': '&quot;',
61     "'": '&#39;'
62   };
63
64   /** Detect free variable `global` from Node.js. */
65   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
66
67   /** Detect free variable `self`. */
68   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
69
70   /** Used as a reference to the global object. */
71   var root = freeGlobal || freeSelf || Function('return this')();
72
73   /** Detect free variable `exports`. */
74   var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
75
76   /** Detect free variable `module`. */
77   var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
78
79   /*--------------------------------------------------------------------------*/
80
81   /**
82    * Appends the elements of `values` to `array`.
83    *
84    * @private
85    * @param {Array} array The array to modify.
86    * @param {Array} values The values to append.
87    * @returns {Array} Returns `array`.
88    */
89   function arrayPush(array, values) {
90     array.push.apply(array, values);
91     return array;
92   }
93
94   /**
95    * The base implementation of `_.findIndex` and `_.findLastIndex` without
96    * support for iteratee shorthands.
97    *
98    * @private
99    * @param {Array} array The array to inspect.
100    * @param {Function} predicate The function invoked per iteration.
101    * @param {number} fromIndex The index to search from.
102    * @param {boolean} [fromRight] Specify iterating from right to left.
103    * @returns {number} Returns the index of the matched value, else `-1`.
104    */
105   function baseFindIndex(array, predicate, fromIndex, fromRight) {
106     var length = array.length,
107         index = fromIndex + (fromRight ? 1 : -1);
108
109     while ((fromRight ? index-- : ++index < length)) {
110       if (predicate(array[index], index, array)) {
111         return index;
112       }
113     }
114     return -1;
115   }
116
117   /**
118    * The base implementation of `_.property` without support for deep paths.
119    *
120    * @private
121    * @param {string} key The key of the property to get.
122    * @returns {Function} Returns the new accessor function.
123    */
124   function baseProperty(key) {
125     return function(object) {
126       return object == null ? undefined : object[key];
127     };
128   }
129
130   /**
131    * The base implementation of `_.propertyOf` without support for deep paths.
132    *
133    * @private
134    * @param {Object} object The object to query.
135    * @returns {Function} Returns the new accessor function.
136    */
137   function basePropertyOf(object) {
138     return function(key) {
139       return object == null ? undefined : object[key];
140     };
141   }
142
143   /**
144    * The base implementation of `_.reduce` and `_.reduceRight`, without support
145    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
146    *
147    * @private
148    * @param {Array|Object} collection The collection to iterate over.
149    * @param {Function} iteratee The function invoked per iteration.
150    * @param {*} accumulator The initial value.
151    * @param {boolean} initAccum Specify using the first or last element of
152    *  `collection` as the initial value.
153    * @param {Function} eachFunc The function to iterate over `collection`.
154    * @returns {*} Returns the accumulated value.
155    */
156   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
157     eachFunc(collection, function(value, index, collection) {
158       accumulator = initAccum
159         ? (initAccum = false, value)
160         : iteratee(accumulator, value, index, collection);
161     });
162     return accumulator;
163   }
164
165   /**
166    * The base implementation of `_.values` and `_.valuesIn` which creates an
167    * array of `object` property values corresponding to the property names
168    * of `props`.
169    *
170    * @private
171    * @param {Object} object The object to query.
172    * @param {Array} props The property names to get values for.
173    * @returns {Object} Returns the array of property values.
174    */
175   function baseValues(object, props) {
176     return baseMap(props, function(key) {
177       return object[key];
178     });
179   }
180
181   /**
182    * Used by `_.escape` to convert characters to HTML entities.
183    *
184    * @private
185    * @param {string} chr The matched character to escape.
186    * @returns {string} Returns the escaped character.
187    */
188   var escapeHtmlChar = basePropertyOf(htmlEscapes);
189
190   /**
191    * Creates a unary function that invokes `func` with its argument transformed.
192    *
193    * @private
194    * @param {Function} func The function to wrap.
195    * @param {Function} transform The argument transform.
196    * @returns {Function} Returns the new function.
197    */
198   function overArg(func, transform) {
199     return function(arg) {
200       return func(transform(arg));
201     };
202   }
203
204   /*--------------------------------------------------------------------------*/
205
206   /** Used for built-in method references. */
207   var arrayProto = Array.prototype,
208       objectProto = Object.prototype;
209
210   /** Used to check objects for own properties. */
211   var hasOwnProperty = objectProto.hasOwnProperty;
212
213   /** Used to generate unique IDs. */
214   var idCounter = 0;
215
216   /**
217    * Used to resolve the
218    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
219    * of values.
220    */
221   var nativeObjectToString = objectProto.toString;
222
223   /** Used to restore the original `_` reference in `_.noConflict`. */
224   var oldDash = root._;
225
226   /** Built-in value references. */
227   var objectCreate = Object.create,
228       propertyIsEnumerable = objectProto.propertyIsEnumerable;
229
230   /* Built-in method references for those with the same name as other `lodash` methods. */
231   var nativeIsFinite = root.isFinite,
232       nativeKeys = overArg(Object.keys, Object),
233       nativeMax = Math.max;
234
235   /*------------------------------------------------------------------------*/
236
237   /**
238    * Creates a `lodash` object which wraps `value` to enable implicit method
239    * chain sequences. Methods that operate on and return arrays, collections,
240    * and functions can be chained together. Methods that retrieve a single value
241    * or may return a primitive value will automatically end the chain sequence
242    * and return the unwrapped value. Otherwise, the value must be unwrapped
243    * with `_#value`.
244    *
245    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
246    * enabled using `_.chain`.
247    *
248    * The execution of chained methods is lazy, that is, it's deferred until
249    * `_#value` is implicitly or explicitly called.
250    *
251    * Lazy evaluation allows several methods to support shortcut fusion.
252    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
253    * the creation of intermediate arrays and can greatly reduce the number of
254    * iteratee executions. Sections of a chain sequence qualify for shortcut
255    * fusion if the section is applied to an array and iteratees accept only
256    * one argument. The heuristic for whether a section qualifies for shortcut
257    * fusion is subject to change.
258    *
259    * Chaining is supported in custom builds as long as the `_#value` method is
260    * directly or indirectly included in the build.
261    *
262    * In addition to lodash methods, wrappers have `Array` and `String` methods.
263    *
264    * The wrapper `Array` methods are:
265    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
266    *
267    * The wrapper `String` methods are:
268    * `replace` and `split`
269    *
270    * The wrapper methods that support shortcut fusion are:
271    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
272    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
273    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
274    *
275    * The chainable wrapper methods are:
276    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
277    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
278    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
279    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
280    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
281    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
282    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
283    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
284    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
285    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
286    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
287    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
288    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
289    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
290    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
291    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
292    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
293    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
294    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
295    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
296    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
297    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
298    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
299    * `zipObject`, `zipObjectDeep`, and `zipWith`
300    *
301    * The wrapper methods that are **not** chainable by default are:
302    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
303    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
304    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
305    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
306    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
307    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
308    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
309    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
310    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
311    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
312    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
313    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
314    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
315    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
316    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
317    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
318    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
319    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
320    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
321    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
322    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
323    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
324    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
325    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
326    * `upperFirst`, `value`, and `words`
327    *
328    * @name _
329    * @constructor
330    * @category Seq
331    * @param {*} value The value to wrap in a `lodash` instance.
332    * @returns {Object} Returns the new `lodash` wrapper instance.
333    * @example
334    *
335    * function square(n) {
336    *   return n * n;
337    * }
338    *
339    * var wrapped = _([1, 2, 3]);
340    *
341    * // Returns an unwrapped value.
342    * wrapped.reduce(_.add);
343    * // => 6
344    *
345    * // Returns a wrapped value.
346    * var squares = wrapped.map(square);
347    *
348    * _.isArray(squares);
349    * // => false
350    *
351    * _.isArray(squares.value());
352    * // => true
353    */
354   function lodash(value) {
355     return value instanceof LodashWrapper
356       ? value
357       : new LodashWrapper(value);
358   }
359
360   /**
361    * The base implementation of `_.create` without support for assigning
362    * properties to the created object.
363    *
364    * @private
365    * @param {Object} proto The object to inherit from.
366    * @returns {Object} Returns the new object.
367    */
368   var baseCreate = (function() {
369     function object() {}
370     return function(proto) {
371       if (!isObject(proto)) {
372         return {};
373       }
374       if (objectCreate) {
375         return objectCreate(proto);
376       }
377       object.prototype = proto;
378       var result = new object;
379       object.prototype = undefined;
380       return result;
381     };
382   }());
383
384   /**
385    * The base constructor for creating `lodash` wrapper objects.
386    *
387    * @private
388    * @param {*} value The value to wrap.
389    * @param {boolean} [chainAll] Enable explicit method chain sequences.
390    */
391   function LodashWrapper(value, chainAll) {
392     this.__wrapped__ = value;
393     this.__actions__ = [];
394     this.__chain__ = !!chainAll;
395   }
396
397   LodashWrapper.prototype = baseCreate(lodash.prototype);
398   LodashWrapper.prototype.constructor = LodashWrapper;
399
400   /*------------------------------------------------------------------------*/
401
402   /**
403    * Assigns `value` to `key` of `object` if the existing value is not equivalent
404    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
405    * for equality comparisons.
406    *
407    * @private
408    * @param {Object} object The object to modify.
409    * @param {string} key The key of the property to assign.
410    * @param {*} value The value to assign.
411    */
412   function assignValue(object, key, value) {
413     var objValue = object[key];
414     if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
415         (value === undefined && !(key in object))) {
416       baseAssignValue(object, key, value);
417     }
418   }
419
420   /**
421    * The base implementation of `assignValue` and `assignMergeValue` without
422    * value checks.
423    *
424    * @private
425    * @param {Object} object The object to modify.
426    * @param {string} key The key of the property to assign.
427    * @param {*} value The value to assign.
428    */
429   function baseAssignValue(object, key, value) {
430     object[key] = value;
431   }
432
433   /**
434    * The base implementation of `_.delay` and `_.defer` which accepts `args`
435    * to provide to `func`.
436    *
437    * @private
438    * @param {Function} func The function to delay.
439    * @param {number} wait The number of milliseconds to delay invocation.
440    * @param {Array} args The arguments to provide to `func`.
441    * @returns {number|Object} Returns the timer id or timeout object.
442    */
443   function baseDelay(func, wait, args) {
444     if (typeof func != 'function') {
445       throw new TypeError(FUNC_ERROR_TEXT);
446     }
447     return setTimeout(function() { func.apply(undefined, args); }, wait);
448   }
449
450   /**
451    * The base implementation of `_.forEach` without support for iteratee shorthands.
452    *
453    * @private
454    * @param {Array|Object} collection The collection to iterate over.
455    * @param {Function} iteratee The function invoked per iteration.
456    * @returns {Array|Object} Returns `collection`.
457    */
458   var baseEach = createBaseEach(baseForOwn);
459
460   /**
461    * The base implementation of `_.every` without support for iteratee shorthands.
462    *
463    * @private
464    * @param {Array|Object} collection The collection to iterate over.
465    * @param {Function} predicate The function invoked per iteration.
466    * @returns {boolean} Returns `true` if all elements pass the predicate check,
467    *  else `false`
468    */
469   function baseEvery(collection, predicate) {
470     var result = true;
471     baseEach(collection, function(value, index, collection) {
472       result = !!predicate(value, index, collection);
473       return result;
474     });
475     return result;
476   }
477
478   /**
479    * The base implementation of methods like `_.max` and `_.min` which accepts a
480    * `comparator` to determine the extremum value.
481    *
482    * @private
483    * @param {Array} array The array to iterate over.
484    * @param {Function} iteratee The iteratee invoked per iteration.
485    * @param {Function} comparator The comparator used to compare values.
486    * @returns {*} Returns the extremum value.
487    */
488   function baseExtremum(array, iteratee, comparator) {
489     var index = -1,
490         length = array.length;
491
492     while (++index < length) {
493       var value = array[index],
494           current = iteratee(value);
495
496       if (current != null && (computed === undefined
497             ? (current === current && !false)
498             : comparator(current, computed)
499           )) {
500         var computed = current,
501             result = value;
502       }
503     }
504     return result;
505   }
506
507   /**
508    * The base implementation of `_.filter` without support for iteratee shorthands.
509    *
510    * @private
511    * @param {Array|Object} collection The collection to iterate over.
512    * @param {Function} predicate The function invoked per iteration.
513    * @returns {Array} Returns the new filtered array.
514    */
515   function baseFilter(collection, predicate) {
516     var result = [];
517     baseEach(collection, function(value, index, collection) {
518       if (predicate(value, index, collection)) {
519         result.push(value);
520       }
521     });
522     return result;
523   }
524
525   /**
526    * The base implementation of `_.flatten` with support for restricting flattening.
527    *
528    * @private
529    * @param {Array} array The array to flatten.
530    * @param {number} depth The maximum recursion depth.
531    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
532    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
533    * @param {Array} [result=[]] The initial result value.
534    * @returns {Array} Returns the new flattened array.
535    */
536   function baseFlatten(array, depth, predicate, isStrict, result) {
537     var index = -1,
538         length = array.length;
539
540     predicate || (predicate = isFlattenable);
541     result || (result = []);
542
543     while (++index < length) {
544       var value = array[index];
545       if (depth > 0 && predicate(value)) {
546         if (depth > 1) {
547           // Recursively flatten arrays (susceptible to call stack limits).
548           baseFlatten(value, depth - 1, predicate, isStrict, result);
549         } else {
550           arrayPush(result, value);
551         }
552       } else if (!isStrict) {
553         result[result.length] = value;
554       }
555     }
556     return result;
557   }
558
559   /**
560    * The base implementation of `baseForOwn` which iterates over `object`
561    * properties returned by `keysFunc` and invokes `iteratee` for each property.
562    * Iteratee functions may exit iteration early by explicitly returning `false`.
563    *
564    * @private
565    * @param {Object} object The object to iterate over.
566    * @param {Function} iteratee The function invoked per iteration.
567    * @param {Function} keysFunc The function to get the keys of `object`.
568    * @returns {Object} Returns `object`.
569    */
570   var baseFor = createBaseFor();
571
572   /**
573    * The base implementation of `_.forOwn` without support for iteratee shorthands.
574    *
575    * @private
576    * @param {Object} object The object to iterate over.
577    * @param {Function} iteratee The function invoked per iteration.
578    * @returns {Object} Returns `object`.
579    */
580   function baseForOwn(object, iteratee) {
581     return object && baseFor(object, iteratee, keys);
582   }
583
584   /**
585    * The base implementation of `_.functions` which creates an array of
586    * `object` function property names filtered from `props`.
587    *
588    * @private
589    * @param {Object} object The object to inspect.
590    * @param {Array} props The property names to filter.
591    * @returns {Array} Returns the function names.
592    */
593   function baseFunctions(object, props) {
594     return baseFilter(props, function(key) {
595       return isFunction(object[key]);
596     });
597   }
598
599   /**
600    * The base implementation of `getTag` without fallbacks for buggy environments.
601    *
602    * @private
603    * @param {*} value The value to query.
604    * @returns {string} Returns the `toStringTag`.
605    */
606   function baseGetTag(value) {
607     return objectToString(value);
608   }
609
610   /**
611    * The base implementation of `_.gt` which doesn't coerce arguments.
612    *
613    * @private
614    * @param {*} value The value to compare.
615    * @param {*} other The other value to compare.
616    * @returns {boolean} Returns `true` if `value` is greater than `other`,
617    *  else `false`.
618    */
619   function baseGt(value, other) {
620     return value > other;
621   }
622
623   /**
624    * The base implementation of `_.isArguments`.
625    *
626    * @private
627    * @param {*} value The value to check.
628    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
629    */
630   var baseIsArguments = noop;
631
632   /**
633    * The base implementation of `_.isDate` without Node.js optimizations.
634    *
635    * @private
636    * @param {*} value The value to check.
637    * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
638    */
639   function baseIsDate(value) {
640     return isObjectLike(value) && baseGetTag(value) == dateTag;
641   }
642
643   /**
644    * The base implementation of `_.isEqual` which supports partial comparisons
645    * and tracks traversed objects.
646    *
647    * @private
648    * @param {*} value The value to compare.
649    * @param {*} other The other value to compare.
650    * @param {boolean} bitmask The bitmask flags.
651    *  1 - Unordered comparison
652    *  2 - Partial comparison
653    * @param {Function} [customizer] The function to customize comparisons.
654    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
655    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
656    */
657   function baseIsEqual(value, other, bitmask, customizer, stack) {
658     if (value === other) {
659       return true;
660     }
661     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
662       return value !== value && other !== other;
663     }
664     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
665   }
666
667   /**
668    * A specialized version of `baseIsEqual` for arrays and objects which performs
669    * deep comparisons and tracks traversed objects enabling objects with circular
670    * references to be compared.
671    *
672    * @private
673    * @param {Object} object The object to compare.
674    * @param {Object} other The other object to compare.
675    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
676    * @param {Function} customizer The function to customize comparisons.
677    * @param {Function} equalFunc The function to determine equivalents of values.
678    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
679    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
680    */
681   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
682     var objIsArr = isArray(object),
683         othIsArr = isArray(other),
684         objTag = objIsArr ? arrayTag : baseGetTag(object),
685         othTag = othIsArr ? arrayTag : baseGetTag(other);
686
687     objTag = objTag == argsTag ? objectTag : objTag;
688     othTag = othTag == argsTag ? objectTag : othTag;
689
690     var objIsObj = objTag == objectTag,
691         othIsObj = othTag == objectTag,
692         isSameTag = objTag == othTag;
693
694     stack || (stack = []);
695     var objStack = find(stack, function(entry) {
696       return entry[0] == object;
697     });
698     var othStack = find(stack, function(entry) {
699       return entry[0] == other;
700     });
701     if (objStack && othStack) {
702       return objStack[1] == other;
703     }
704     stack.push([object, other]);
705     stack.push([other, object]);
706     if (isSameTag && !objIsObj) {
707       var result = (objIsArr)
708         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
709         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
710       stack.pop();
711       return result;
712     }
713     if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
714       var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
715           othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
716
717       if (objIsWrapped || othIsWrapped) {
718         var objUnwrapped = objIsWrapped ? object.value() : object,
719             othUnwrapped = othIsWrapped ? other.value() : other;
720
721         var result = equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
722         stack.pop();
723         return result;
724       }
725     }
726     if (!isSameTag) {
727       return false;
728     }
729     var result = equalObjects(object, other, bitmask, customizer, equalFunc, stack);
730     stack.pop();
731     return result;
732   }
733
734   /**
735    * The base implementation of `_.isRegExp` without Node.js optimizations.
736    *
737    * @private
738    * @param {*} value The value to check.
739    * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
740    */
741   function baseIsRegExp(value) {
742     return isObjectLike(value) && baseGetTag(value) == regexpTag;
743   }
744
745   /**
746    * The base implementation of `_.iteratee`.
747    *
748    * @private
749    * @param {*} [value=_.identity] The value to convert to an iteratee.
750    * @returns {Function} Returns the iteratee.
751    */
752   function baseIteratee(func) {
753     if (typeof func == 'function') {
754       return func;
755     }
756     if (func == null) {
757       return identity;
758     }
759     return (typeof func == 'object' ? baseMatches : baseProperty)(func);
760   }
761
762   /**
763    * The base implementation of `_.lt` which doesn't coerce arguments.
764    *
765    * @private
766    * @param {*} value The value to compare.
767    * @param {*} other The other value to compare.
768    * @returns {boolean} Returns `true` if `value` is less than `other`,
769    *  else `false`.
770    */
771   function baseLt(value, other) {
772     return value < other;
773   }
774
775   /**
776    * The base implementation of `_.map` without support for iteratee shorthands.
777    *
778    * @private
779    * @param {Array|Object} collection The collection to iterate over.
780    * @param {Function} iteratee The function invoked per iteration.
781    * @returns {Array} Returns the new mapped array.
782    */
783   function baseMap(collection, iteratee) {
784     var index = -1,
785         result = isArrayLike(collection) ? Array(collection.length) : [];
786
787     baseEach(collection, function(value, key, collection) {
788       result[++index] = iteratee(value, key, collection);
789     });
790     return result;
791   }
792
793   /**
794    * The base implementation of `_.matches` which doesn't clone `source`.
795    *
796    * @private
797    * @param {Object} source The object of property values to match.
798    * @returns {Function} Returns the new spec function.
799    */
800   function baseMatches(source) {
801     var props = nativeKeys(source);
802     return function(object) {
803       var length = props.length;
804       if (object == null) {
805         return !length;
806       }
807       object = Object(object);
808       while (length--) {
809         var key = props[length];
810         if (!(key in object &&
811               baseIsEqual(source[key], object[key], COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)
812             )) {
813           return false;
814         }
815       }
816       return true;
817     };
818   }
819
820   /**
821    * The base implementation of `_.pick` without support for individual
822    * property identifiers.
823    *
824    * @private
825    * @param {Object} object The source object.
826    * @param {string[]} paths The property paths to pick.
827    * @returns {Object} Returns the new object.
828    */
829   function basePick(object, props) {
830     object = Object(object);
831     return reduce(props, function(result, key) {
832       if (key in object) {
833         result[key] = object[key];
834       }
835       return result;
836     }, {});
837   }
838
839   /**
840    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
841    *
842    * @private
843    * @param {Function} func The function to apply a rest parameter to.
844    * @param {number} [start=func.length-1] The start position of the rest parameter.
845    * @returns {Function} Returns the new function.
846    */
847   function baseRest(func, start) {
848     return setToString(overRest(func, start, identity), func + '');
849   }
850
851   /**
852    * The base implementation of `_.slice` without an iteratee call guard.
853    *
854    * @private
855    * @param {Array} array The array to slice.
856    * @param {number} [start=0] The start position.
857    * @param {number} [end=array.length] The end position.
858    * @returns {Array} Returns the slice of `array`.
859    */
860   function baseSlice(array, start, end) {
861     var index = -1,
862         length = array.length;
863
864     if (start < 0) {
865       start = -start > length ? 0 : (length + start);
866     }
867     end = end > length ? length : end;
868     if (end < 0) {
869       end += length;
870     }
871     length = start > end ? 0 : ((end - start) >>> 0);
872     start >>>= 0;
873
874     var result = Array(length);
875     while (++index < length) {
876       result[index] = array[index + start];
877     }
878     return result;
879   }
880
881   /**
882    * Copies the values of `source` to `array`.
883    *
884    * @private
885    * @param {Array} source The array to copy values from.
886    * @param {Array} [array=[]] The array to copy values to.
887    * @returns {Array} Returns `array`.
888    */
889   function copyArray(source) {
890     return baseSlice(source, 0, source.length);
891   }
892
893   /**
894    * The base implementation of `_.some` without support for iteratee shorthands.
895    *
896    * @private
897    * @param {Array|Object} collection The collection to iterate over.
898    * @param {Function} predicate The function invoked per iteration.
899    * @returns {boolean} Returns `true` if any element passes the predicate check,
900    *  else `false`.
901    */
902   function baseSome(collection, predicate) {
903     var result;
904
905     baseEach(collection, function(value, index, collection) {
906       result = predicate(value, index, collection);
907       return !result;
908     });
909     return !!result;
910   }
911
912   /**
913    * The base implementation of `wrapperValue` which returns the result of
914    * performing a sequence of actions on the unwrapped `value`, where each
915    * successive action is supplied the return value of the previous.
916    *
917    * @private
918    * @param {*} value The unwrapped value.
919    * @param {Array} actions Actions to perform to resolve the unwrapped value.
920    * @returns {*} Returns the resolved value.
921    */
922   function baseWrapperValue(value, actions) {
923     var result = value;
924     return reduce(actions, function(result, action) {
925       return action.func.apply(action.thisArg, arrayPush([result], action.args));
926     }, result);
927   }
928
929   /**
930    * Compares values to sort them in ascending order.
931    *
932    * @private
933    * @param {*} value The value to compare.
934    * @param {*} other The other value to compare.
935    * @returns {number} Returns the sort order indicator for `value`.
936    */
937   function compareAscending(value, other) {
938     if (value !== other) {
939       var valIsDefined = value !== undefined,
940           valIsNull = value === null,
941           valIsReflexive = value === value,
942           valIsSymbol = false;
943
944       var othIsDefined = other !== undefined,
945           othIsNull = other === null,
946           othIsReflexive = other === other,
947           othIsSymbol = false;
948
949       if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
950           (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
951           (valIsNull && othIsDefined && othIsReflexive) ||
952           (!valIsDefined && othIsReflexive) ||
953           !valIsReflexive) {
954         return 1;
955       }
956       if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
957           (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
958           (othIsNull && valIsDefined && valIsReflexive) ||
959           (!othIsDefined && valIsReflexive) ||
960           !othIsReflexive) {
961         return -1;
962       }
963     }
964     return 0;
965   }
966
967   /**
968    * Copies properties of `source` to `object`.
969    *
970    * @private
971    * @param {Object} source The object to copy properties from.
972    * @param {Array} props The property identifiers to copy.
973    * @param {Object} [object={}] The object to copy properties to.
974    * @param {Function} [customizer] The function to customize copied values.
975    * @returns {Object} Returns `object`.
976    */
977   function copyObject(source, props, object, customizer) {
978     var isNew = !object;
979     object || (object = {});
980
981     var index = -1,
982         length = props.length;
983
984     while (++index < length) {
985       var key = props[index];
986
987       var newValue = customizer
988         ? customizer(object[key], source[key], key, object, source)
989         : undefined;
990
991       if (newValue === undefined) {
992         newValue = source[key];
993       }
994       if (isNew) {
995         baseAssignValue(object, key, newValue);
996       } else {
997         assignValue(object, key, newValue);
998       }
999     }
1000     return object;
1001   }
1002
1003   /**
1004    * Creates a function like `_.assign`.
1005    *
1006    * @private
1007    * @param {Function} assigner The function to assign values.
1008    * @returns {Function} Returns the new assigner function.
1009    */
1010   function createAssigner(assigner) {
1011     return baseRest(function(object, sources) {
1012       var index = -1,
1013           length = sources.length,
1014           customizer = length > 1 ? sources[length - 1] : undefined;
1015
1016       customizer = (assigner.length > 3 && typeof customizer == 'function')
1017         ? (length--, customizer)
1018         : undefined;
1019
1020       object = Object(object);
1021       while (++index < length) {
1022         var source = sources[index];
1023         if (source) {
1024           assigner(object, source, index, customizer);
1025         }
1026       }
1027       return object;
1028     });
1029   }
1030
1031   /**
1032    * Creates a `baseEach` or `baseEachRight` function.
1033    *
1034    * @private
1035    * @param {Function} eachFunc The function to iterate over a collection.
1036    * @param {boolean} [fromRight] Specify iterating from right to left.
1037    * @returns {Function} Returns the new base function.
1038    */
1039   function createBaseEach(eachFunc, fromRight) {
1040     return function(collection, iteratee) {
1041       if (collection == null) {
1042         return collection;
1043       }
1044       if (!isArrayLike(collection)) {
1045         return eachFunc(collection, iteratee);
1046       }
1047       var length = collection.length,
1048           index = fromRight ? length : -1,
1049           iterable = Object(collection);
1050
1051       while ((fromRight ? index-- : ++index < length)) {
1052         if (iteratee(iterable[index], index, iterable) === false) {
1053           break;
1054         }
1055       }
1056       return collection;
1057     };
1058   }
1059
1060   /**
1061    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
1062    *
1063    * @private
1064    * @param {boolean} [fromRight] Specify iterating from right to left.
1065    * @returns {Function} Returns the new base function.
1066    */
1067   function createBaseFor(fromRight) {
1068     return function(object, iteratee, keysFunc) {
1069       var index = -1,
1070           iterable = Object(object),
1071           props = keysFunc(object),
1072           length = props.length;
1073
1074       while (length--) {
1075         var key = props[fromRight ? length : ++index];
1076         if (iteratee(iterable[key], key, iterable) === false) {
1077           break;
1078         }
1079       }
1080       return object;
1081     };
1082   }
1083
1084   /**
1085    * Creates a function that produces an instance of `Ctor` regardless of
1086    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
1087    *
1088    * @private
1089    * @param {Function} Ctor The constructor to wrap.
1090    * @returns {Function} Returns the new wrapped function.
1091    */
1092   function createCtor(Ctor) {
1093     return function() {
1094       // Use a `switch` statement to work with class constructors. See
1095       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
1096       // for more details.
1097       var args = arguments;
1098       var thisBinding = baseCreate(Ctor.prototype),
1099           result = Ctor.apply(thisBinding, args);
1100
1101       // Mimic the constructor's `return` behavior.
1102       // See https://es5.github.io/#x13.2.2 for more details.
1103       return isObject(result) ? result : thisBinding;
1104     };
1105   }
1106
1107   /**
1108    * Creates a `_.find` or `_.findLast` function.
1109    *
1110    * @private
1111    * @param {Function} findIndexFunc The function to find the collection index.
1112    * @returns {Function} Returns the new find function.
1113    */
1114   function createFind(findIndexFunc) {
1115     return function(collection, predicate, fromIndex) {
1116       var iterable = Object(collection);
1117       if (!isArrayLike(collection)) {
1118         var iteratee = baseIteratee(predicate, 3);
1119         collection = keys(collection);
1120         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
1121       }
1122       var index = findIndexFunc(collection, predicate, fromIndex);
1123       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
1124     };
1125   }
1126
1127   /**
1128    * Creates a function that wraps `func` to invoke it with the `this` binding
1129    * of `thisArg` and `partials` prepended to the arguments it receives.
1130    *
1131    * @private
1132    * @param {Function} func The function to wrap.
1133    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
1134    * @param {*} thisArg The `this` binding of `func`.
1135    * @param {Array} partials The arguments to prepend to those provided to
1136    *  the new function.
1137    * @returns {Function} Returns the new wrapped function.
1138    */
1139   function createPartial(func, bitmask, thisArg, partials) {
1140     if (typeof func != 'function') {
1141       throw new TypeError(FUNC_ERROR_TEXT);
1142     }
1143     var isBind = bitmask & WRAP_BIND_FLAG,
1144         Ctor = createCtor(func);
1145
1146     function wrapper() {
1147       var argsIndex = -1,
1148           argsLength = arguments.length,
1149           leftIndex = -1,
1150           leftLength = partials.length,
1151           args = Array(leftLength + argsLength),
1152           fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
1153
1154       while (++leftIndex < leftLength) {
1155         args[leftIndex] = partials[leftIndex];
1156       }
1157       while (argsLength--) {
1158         args[leftIndex++] = arguments[++argsIndex];
1159       }
1160       return fn.apply(isBind ? thisArg : this, args);
1161     }
1162     return wrapper;
1163   }
1164
1165   /**
1166    * A specialized version of `baseIsEqualDeep` for arrays with support for
1167    * partial deep comparisons.
1168    *
1169    * @private
1170    * @param {Array} array The array to compare.
1171    * @param {Array} other The other array to compare.
1172    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1173    * @param {Function} customizer The function to customize comparisons.
1174    * @param {Function} equalFunc The function to determine equivalents of values.
1175    * @param {Object} stack Tracks traversed `array` and `other` objects.
1176    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
1177    */
1178   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
1179     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1180         arrLength = array.length,
1181         othLength = other.length;
1182
1183     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
1184       return false;
1185     }
1186     // Check that cyclic values are equal.
1187     var arrStacked = stack.get(array);
1188     var othStacked = stack.get(other);
1189     if (arrStacked && othStacked) {
1190       return arrStacked == other && othStacked == array;
1191     }
1192     var index = -1,
1193         result = true,
1194         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? [] : undefined;
1195
1196     // Ignore non-index properties.
1197     while (++index < arrLength) {
1198       var arrValue = array[index],
1199           othValue = other[index];
1200
1201       var compared;
1202       if (compared !== undefined) {
1203         if (compared) {
1204           continue;
1205         }
1206         result = false;
1207         break;
1208       }
1209       // Recursively compare arrays (susceptible to call stack limits).
1210       if (seen) {
1211         if (!baseSome(other, function(othValue, othIndex) {
1212               if (!indexOf(seen, othIndex) &&
1213                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
1214                 return seen.push(othIndex);
1215               }
1216             })) {
1217           result = false;
1218           break;
1219         }
1220       } else if (!(
1221             arrValue === othValue ||
1222               equalFunc(arrValue, othValue, bitmask, customizer, stack)
1223           )) {
1224         result = false;
1225         break;
1226       }
1227     }
1228     return result;
1229   }
1230
1231   /**
1232    * A specialized version of `baseIsEqualDeep` for comparing objects of
1233    * the same `toStringTag`.
1234    *
1235    * **Note:** This function only supports comparing values with tags of
1236    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
1237    *
1238    * @private
1239    * @param {Object} object The object to compare.
1240    * @param {Object} other The other object to compare.
1241    * @param {string} tag The `toStringTag` of the objects to compare.
1242    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1243    * @param {Function} customizer The function to customize comparisons.
1244    * @param {Function} equalFunc The function to determine equivalents of values.
1245    * @param {Object} stack Tracks traversed `object` and `other` objects.
1246    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1247    */
1248   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
1249     switch (tag) {
1250
1251       case boolTag:
1252       case dateTag:
1253       case numberTag:
1254         // Coerce booleans to `1` or `0` and dates to milliseconds.
1255         // Invalid dates are coerced to `NaN`.
1256         return eq(+object, +other);
1257
1258       case errorTag:
1259         return object.name == other.name && object.message == other.message;
1260
1261       case regexpTag:
1262       case stringTag:
1263         // Coerce regexes to strings and treat strings, primitives and objects,
1264         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
1265         // for more details.
1266         return object == (other + '');
1267
1268     }
1269     return false;
1270   }
1271
1272   /**
1273    * A specialized version of `baseIsEqualDeep` for objects with support for
1274    * partial deep comparisons.
1275    *
1276    * @private
1277    * @param {Object} object The object to compare.
1278    * @param {Object} other The other object to compare.
1279    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
1280    * @param {Function} customizer The function to customize comparisons.
1281    * @param {Function} equalFunc The function to determine equivalents of values.
1282    * @param {Object} stack Tracks traversed `object` and `other` objects.
1283    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
1284    */
1285   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
1286     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
1287         objProps = keys(object),
1288         objLength = objProps.length,
1289         othProps = keys(other),
1290         othLength = othProps.length;
1291
1292     if (objLength != othLength && !isPartial) {
1293       return false;
1294     }
1295     var index = objLength;
1296     while (index--) {
1297       var key = objProps[index];
1298       if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
1299         return false;
1300       }
1301     }
1302     // Check that cyclic values are equal.
1303     var objStacked = stack.get(object);
1304     var othStacked = stack.get(other);
1305     if (objStacked && othStacked) {
1306       return objStacked == other && othStacked == object;
1307     }
1308     var result = true;
1309
1310     var skipCtor = isPartial;
1311     while (++index < objLength) {
1312       key = objProps[index];
1313       var objValue = object[key],
1314           othValue = other[key];
1315
1316       var compared;
1317       // Recursively compare objects (susceptible to call stack limits).
1318       if (!(compared === undefined
1319             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
1320             : compared
1321           )) {
1322         result = false;
1323         break;
1324       }
1325       skipCtor || (skipCtor = key == 'constructor');
1326     }
1327     if (result && !skipCtor) {
1328       var objCtor = object.constructor,
1329           othCtor = other.constructor;
1330
1331       // Non `Object` object instances with different constructors are not equal.
1332       if (objCtor != othCtor &&
1333           ('constructor' in object && 'constructor' in other) &&
1334           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
1335             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
1336         result = false;
1337       }
1338     }
1339     return result;
1340   }
1341
1342   /**
1343    * A specialized version of `baseRest` which flattens the rest array.
1344    *
1345    * @private
1346    * @param {Function} func The function to apply a rest parameter to.
1347    * @returns {Function} Returns the new function.
1348    */
1349   function flatRest(func) {
1350     return setToString(overRest(func, undefined, flatten), func + '');
1351   }
1352
1353   /**
1354    * Checks if `value` is a flattenable `arguments` object or array.
1355    *
1356    * @private
1357    * @param {*} value The value to check.
1358    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
1359    */
1360   function isFlattenable(value) {
1361     return isArray(value) || isArguments(value);
1362   }
1363
1364   /**
1365    * Checks if `value` is a valid array-like index.
1366    *
1367    * @private
1368    * @param {*} value The value to check.
1369    * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
1370    * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
1371    */
1372   function isIndex(value, length) {
1373     var type = typeof value;
1374     length = length == null ? MAX_SAFE_INTEGER : length;
1375
1376     return !!length &&
1377       (type == 'number' ||
1378         (type != 'symbol' && reIsUint.test(value))) &&
1379           (value > -1 && value % 1 == 0 && value < length);
1380   }
1381
1382   /**
1383    * Checks if the given arguments are from an iteratee call.
1384    *
1385    * @private
1386    * @param {*} value The potential iteratee value argument.
1387    * @param {*} index The potential iteratee index or key argument.
1388    * @param {*} object The potential iteratee object argument.
1389    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
1390    *  else `false`.
1391    */
1392   function isIterateeCall(value, index, object) {
1393     if (!isObject(object)) {
1394       return false;
1395     }
1396     var type = typeof index;
1397     if (type == 'number'
1398           ? (isArrayLike(object) && isIndex(index, object.length))
1399           : (type == 'string' && index in object)
1400         ) {
1401       return eq(object[index], value);
1402     }
1403     return false;
1404   }
1405
1406   /**
1407    * This function is like
1408    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
1409    * except that it includes inherited enumerable properties.
1410    *
1411    * @private
1412    * @param {Object} object The object to query.
1413    * @returns {Array} Returns the array of property names.
1414    */
1415   function nativeKeysIn(object) {
1416     var result = [];
1417     if (object != null) {
1418       for (var key in Object(object)) {
1419         result.push(key);
1420       }
1421     }
1422     return result;
1423   }
1424
1425   /**
1426    * Converts `value` to a string using `Object.prototype.toString`.
1427    *
1428    * @private
1429    * @param {*} value The value to convert.
1430    * @returns {string} Returns the converted string.
1431    */
1432   function objectToString(value) {
1433     return nativeObjectToString.call(value);
1434   }
1435
1436   /**
1437    * A specialized version of `baseRest` which transforms the rest array.
1438    *
1439    * @private
1440    * @param {Function} func The function to apply a rest parameter to.
1441    * @param {number} [start=func.length-1] The start position of the rest parameter.
1442    * @param {Function} transform The rest array transform.
1443    * @returns {Function} Returns the new function.
1444    */
1445   function overRest(func, start, transform) {
1446     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
1447     return function() {
1448       var args = arguments,
1449           index = -1,
1450           length = nativeMax(args.length - start, 0),
1451           array = Array(length);
1452
1453       while (++index < length) {
1454         array[index] = args[start + index];
1455       }
1456       index = -1;
1457       var otherArgs = Array(start + 1);
1458       while (++index < start) {
1459         otherArgs[index] = args[index];
1460       }
1461       otherArgs[start] = transform(array);
1462       return func.apply(this, otherArgs);
1463     };
1464   }
1465
1466   /**
1467    * Sets the `toString` method of `func` to return `string`.
1468    *
1469    * @private
1470    * @param {Function} func The function to modify.
1471    * @param {Function} string The `toString` result.
1472    * @returns {Function} Returns `func`.
1473    */
1474   var setToString = identity;
1475
1476   /*------------------------------------------------------------------------*/
1477
1478   /**
1479    * Creates an array with all falsey values removed. The values `false`, `null`,
1480    * `0`, `""`, `undefined`, and `NaN` are falsey.
1481    *
1482    * @static
1483    * @memberOf _
1484    * @since 0.1.0
1485    * @category Array
1486    * @param {Array} array The array to compact.
1487    * @returns {Array} Returns the new array of filtered values.
1488    * @example
1489    *
1490    * _.compact([0, 1, false, 2, '', 3]);
1491    * // => [1, 2, 3]
1492    */
1493   function compact(array) {
1494     return baseFilter(array, Boolean);
1495   }
1496
1497   /**
1498    * Creates a new array concatenating `array` with any additional arrays
1499    * and/or values.
1500    *
1501    * @static
1502    * @memberOf _
1503    * @since 4.0.0
1504    * @category Array
1505    * @param {Array} array The array to concatenate.
1506    * @param {...*} [values] The values to concatenate.
1507    * @returns {Array} Returns the new concatenated array.
1508    * @example
1509    *
1510    * var array = [1];
1511    * var other = _.concat(array, 2, [3], [[4]]);
1512    *
1513    * console.log(other);
1514    * // => [1, 2, 3, [4]]
1515    *
1516    * console.log(array);
1517    * // => [1]
1518    */
1519   function concat() {
1520     var length = arguments.length;
1521     if (!length) {
1522       return [];
1523     }
1524     var args = Array(length - 1),
1525         array = arguments[0],
1526         index = length;
1527
1528     while (index--) {
1529       args[index - 1] = arguments[index];
1530     }
1531     return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
1532   }
1533
1534   /**
1535    * This method is like `_.find` except that it returns the index of the first
1536    * element `predicate` returns truthy for instead of the element itself.
1537    *
1538    * @static
1539    * @memberOf _
1540    * @since 1.1.0
1541    * @category Array
1542    * @param {Array} array The array to inspect.
1543    * @param {Function} [predicate=_.identity] The function invoked per iteration.
1544    * @param {number} [fromIndex=0] The index to search from.
1545    * @returns {number} Returns the index of the found element, else `-1`.
1546    * @example
1547    *
1548    * var users = [
1549    *   { 'user': 'barney',  'active': false },
1550    *   { 'user': 'fred',    'active': false },
1551    *   { 'user': 'pebbles', 'active': true }
1552    * ];
1553    *
1554    * _.findIndex(users, function(o) { return o.user == 'barney'; });
1555    * // => 0
1556    *
1557    * // The `_.matches` iteratee shorthand.
1558    * _.findIndex(users, { 'user': 'fred', 'active': false });
1559    * // => 1
1560    *
1561    * // The `_.matchesProperty` iteratee shorthand.
1562    * _.findIndex(users, ['active', false]);
1563    * // => 0
1564    *
1565    * // The `_.property` iteratee shorthand.
1566    * _.findIndex(users, 'active');
1567    * // => 2
1568    */
1569   function findIndex(array, predicate, fromIndex) {
1570     var length = array == null ? 0 : array.length;
1571     if (!length) {
1572       return -1;
1573     }
1574     var index = fromIndex == null ? 0 : toInteger(fromIndex);
1575     if (index < 0) {
1576       index = nativeMax(length + index, 0);
1577     }
1578     return baseFindIndex(array, baseIteratee(predicate, 3), index);
1579   }
1580
1581   /**
1582    * Flattens `array` a single level deep.
1583    *
1584    * @static
1585    * @memberOf _
1586    * @since 0.1.0
1587    * @category Array
1588    * @param {Array} array The array to flatten.
1589    * @returns {Array} Returns the new flattened array.
1590    * @example
1591    *
1592    * _.flatten([1, [2, [3, [4]], 5]]);
1593    * // => [1, 2, [3, [4]], 5]
1594    */
1595   function flatten(array) {
1596     var length = array == null ? 0 : array.length;
1597     return length ? baseFlatten(array, 1) : [];
1598   }
1599
1600   /**
1601    * Recursively flattens `array`.
1602    *
1603    * @static
1604    * @memberOf _
1605    * @since 3.0.0
1606    * @category Array
1607    * @param {Array} array The array to flatten.
1608    * @returns {Array} Returns the new flattened array.
1609    * @example
1610    *
1611    * _.flattenDeep([1, [2, [3, [4]], 5]]);
1612    * // => [1, 2, 3, 4, 5]
1613    */
1614   function flattenDeep(array) {
1615     var length = array == null ? 0 : array.length;
1616     return length ? baseFlatten(array, INFINITY) : [];
1617   }
1618
1619   /**
1620    * Gets the first element of `array`.
1621    *
1622    * @static
1623    * @memberOf _
1624    * @since 0.1.0
1625    * @alias first
1626    * @category Array
1627    * @param {Array} array The array to query.
1628    * @returns {*} Returns the first element of `array`.
1629    * @example
1630    *
1631    * _.head([1, 2, 3]);
1632    * // => 1
1633    *
1634    * _.head([]);
1635    * // => undefined
1636    */
1637   function head(array) {
1638     return (array && array.length) ? array[0] : undefined;
1639   }
1640
1641   /**
1642    * Gets the index at which the first occurrence of `value` is found in `array`
1643    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
1644    * for equality comparisons. If `fromIndex` is negative, it's used as the
1645    * offset from the end of `array`.
1646    *
1647    * @static
1648    * @memberOf _
1649    * @since 0.1.0
1650    * @category Array
1651    * @param {Array} array The array to inspect.
1652    * @param {*} value The value to search for.
1653    * @param {number} [fromIndex=0] The index to search from.
1654    * @returns {number} Returns the index of the matched value, else `-1`.
1655    * @example
1656    *
1657    * _.indexOf([1, 2, 1, 2], 2);
1658    * // => 1
1659    *
1660    * // Search from the `fromIndex`.
1661    * _.indexOf([1, 2, 1, 2], 2, 2);
1662    * // => 3
1663    */
1664   function indexOf(array, value, fromIndex) {
1665     var length = array == null ? 0 : array.length;
1666     if (typeof fromIndex == 'number') {
1667       fromIndex = fromIndex < 0 ? nativeMax(length + fromIndex, 0) : fromIndex;
1668     } else {
1669       fromIndex = 0;
1670     }
1671     var index = (fromIndex || 0) - 1,
1672         isReflexive = value === value;
1673
1674     while (++index < length) {
1675       var other = array[index];
1676       if ((isReflexive ? other === value : other !== other)) {
1677         return index;
1678       }
1679     }
1680     return -1;
1681   }
1682
1683   /**
1684    * Gets the last element of `array`.
1685    *
1686    * @static
1687    * @memberOf _
1688    * @since 0.1.0
1689    * @category Array
1690    * @param {Array} array The array to query.
1691    * @returns {*} Returns the last element of `array`.
1692    * @example
1693    *
1694    * _.last([1, 2, 3]);
1695    * // => 3
1696    */
1697   function last(array) {
1698     var length = array == null ? 0 : array.length;
1699     return length ? array[length - 1] : undefined;
1700   }
1701
1702   /**
1703    * Creates a slice of `array` from `start` up to, but not including, `end`.
1704    *
1705    * **Note:** This method is used instead of
1706    * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
1707    * returned.
1708    *
1709    * @static
1710    * @memberOf _
1711    * @since 3.0.0
1712    * @category Array
1713    * @param {Array} array The array to slice.
1714    * @param {number} [start=0] The start position.
1715    * @param {number} [end=array.length] The end position.
1716    * @returns {Array} Returns the slice of `array`.
1717    */
1718   function slice(array, start, end) {
1719     var length = array == null ? 0 : array.length;
1720     start = start == null ? 0 : +start;
1721     end = end === undefined ? length : +end;
1722     return length ? baseSlice(array, start, end) : [];
1723   }
1724
1725   /*------------------------------------------------------------------------*/
1726
1727   /**
1728    * Creates a `lodash` wrapper instance that wraps `value` with explicit method
1729    * chain sequences enabled. The result of such sequences must be unwrapped
1730    * with `_#value`.
1731    *
1732    * @static
1733    * @memberOf _
1734    * @since 1.3.0
1735    * @category Seq
1736    * @param {*} value The value to wrap.
1737    * @returns {Object} Returns the new `lodash` wrapper instance.
1738    * @example
1739    *
1740    * var users = [
1741    *   { 'user': 'barney',  'age': 36 },
1742    *   { 'user': 'fred',    'age': 40 },
1743    *   { 'user': 'pebbles', 'age': 1 }
1744    * ];
1745    *
1746    * var youngest = _
1747    *   .chain(users)
1748    *   .sortBy('age')
1749    *   .map(function(o) {
1750    *     return o.user + ' is ' + o.age;
1751    *   })
1752    *   .head()
1753    *   .value();
1754    * // => 'pebbles is 1'
1755    */
1756   function chain(value) {
1757     var result = lodash(value);
1758     result.__chain__ = true;
1759     return result;
1760   }
1761
1762   /**
1763    * This method invokes `interceptor` and returns `value`. The interceptor
1764    * is invoked with one argument; (value). The purpose of this method is to
1765    * "tap into" a method chain sequence in order to modify intermediate results.
1766    *
1767    * @static
1768    * @memberOf _
1769    * @since 0.1.0
1770    * @category Seq
1771    * @param {*} value The value to provide to `interceptor`.
1772    * @param {Function} interceptor The function to invoke.
1773    * @returns {*} Returns `value`.
1774    * @example
1775    *
1776    * _([1, 2, 3])
1777    *  .tap(function(array) {
1778    *    // Mutate input array.
1779    *    array.pop();
1780    *  })
1781    *  .reverse()
1782    *  .value();
1783    * // => [2, 1]
1784    */
1785   function tap(value, interceptor) {
1786     interceptor(value);
1787     return value;
1788   }
1789
1790   /**
1791    * This method is like `_.tap` except that it returns the result of `interceptor`.
1792    * The purpose of this method is to "pass thru" values replacing intermediate
1793    * results in a method chain sequence.
1794    *
1795    * @static
1796    * @memberOf _
1797    * @since 3.0.0
1798    * @category Seq
1799    * @param {*} value The value to provide to `interceptor`.
1800    * @param {Function} interceptor The function to invoke.
1801    * @returns {*} Returns the result of `interceptor`.
1802    * @example
1803    *
1804    * _('  abc  ')
1805    *  .chain()
1806    *  .trim()
1807    *  .thru(function(value) {
1808    *    return [value];
1809    *  })
1810    *  .value();
1811    * // => ['abc']
1812    */
1813   function thru(value, interceptor) {
1814     return interceptor(value);
1815   }
1816
1817   /**
1818    * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
1819    *
1820    * @name chain
1821    * @memberOf _
1822    * @since 0.1.0
1823    * @category Seq
1824    * @returns {Object} Returns the new `lodash` wrapper instance.
1825    * @example
1826    *
1827    * var users = [
1828    *   { 'user': 'barney', 'age': 36 },
1829    *   { 'user': 'fred',   'age': 40 }
1830    * ];
1831    *
1832    * // A sequence without explicit chaining.
1833    * _(users).head();
1834    * // => { 'user': 'barney', 'age': 36 }
1835    *
1836    * // A sequence with explicit chaining.
1837    * _(users)
1838    *   .chain()
1839    *   .head()
1840    *   .pick('user')
1841    *   .value();
1842    * // => { 'user': 'barney' }
1843    */
1844   function wrapperChain() {
1845     return chain(this);
1846   }
1847
1848   /**
1849    * Executes the chain sequence to resolve the unwrapped value.
1850    *
1851    * @name value
1852    * @memberOf _
1853    * @since 0.1.0
1854    * @alias toJSON, valueOf
1855    * @category Seq
1856    * @returns {*} Returns the resolved unwrapped value.
1857    * @example
1858    *
1859    * _([1, 2, 3]).value();
1860    * // => [1, 2, 3]
1861    */
1862   function wrapperValue() {
1863     return baseWrapperValue(this.__wrapped__, this.__actions__);
1864   }
1865
1866   /*------------------------------------------------------------------------*/
1867
1868   /**
1869    * Checks if `predicate` returns truthy for **all** elements of `collection`.
1870    * Iteration is stopped once `predicate` returns falsey. The predicate is
1871    * invoked with three arguments: (value, index|key, collection).
1872    *
1873    * **Note:** This method returns `true` for
1874    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
1875    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
1876    * elements of empty collections.
1877    *
1878    * @static
1879    * @memberOf _
1880    * @since 0.1.0
1881    * @category Collection
1882    * @param {Array|Object} collection The collection to iterate over.
1883    * @param {Function} [predicate=_.identity] The function invoked per iteration.
1884    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
1885    * @returns {boolean} Returns `true` if all elements pass the predicate check,
1886    *  else `false`.
1887    * @example
1888    *
1889    * _.every([true, 1, null, 'yes'], Boolean);
1890    * // => false
1891    *
1892    * var users = [
1893    *   { 'user': 'barney', 'age': 36, 'active': false },
1894    *   { 'user': 'fred',   'age': 40, 'active': false }
1895    * ];
1896    *
1897    * // The `_.matches` iteratee shorthand.
1898    * _.every(users, { 'user': 'barney', 'active': false });
1899    * // => false
1900    *
1901    * // The `_.matchesProperty` iteratee shorthand.
1902    * _.every(users, ['active', false]);
1903    * // => true
1904    *
1905    * // The `_.property` iteratee shorthand.
1906    * _.every(users, 'active');
1907    * // => false
1908    */
1909   function every(collection, predicate, guard) {
1910     predicate = guard ? undefined : predicate;
1911     return baseEvery(collection, baseIteratee(predicate));
1912   }
1913
1914   /**
1915    * Iterates over elements of `collection`, returning an array of all elements
1916    * `predicate` returns truthy for. The predicate is invoked with three
1917    * arguments: (value, index|key, collection).
1918    *
1919    * **Note:** Unlike `_.remove`, this method returns a new array.
1920    *
1921    * @static
1922    * @memberOf _
1923    * @since 0.1.0
1924    * @category Collection
1925    * @param {Array|Object} collection The collection to iterate over.
1926    * @param {Function} [predicate=_.identity] The function invoked per iteration.
1927    * @returns {Array} Returns the new filtered array.
1928    * @see _.reject
1929    * @example
1930    *
1931    * var users = [
1932    *   { 'user': 'barney', 'age': 36, 'active': true },
1933    *   { 'user': 'fred',   'age': 40, 'active': false }
1934    * ];
1935    *
1936    * _.filter(users, function(o) { return !o.active; });
1937    * // => objects for ['fred']
1938    *
1939    * // The `_.matches` iteratee shorthand.
1940    * _.filter(users, { 'age': 36, 'active': true });
1941    * // => objects for ['barney']
1942    *
1943    * // The `_.matchesProperty` iteratee shorthand.
1944    * _.filter(users, ['active', false]);
1945    * // => objects for ['fred']
1946    *
1947    * // The `_.property` iteratee shorthand.
1948    * _.filter(users, 'active');
1949    * // => objects for ['barney']
1950    *
1951    * // Combining several predicates using `_.overEvery` or `_.overSome`.
1952    * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
1953    * // => objects for ['fred', 'barney']
1954    */
1955   function filter(collection, predicate) {
1956     return baseFilter(collection, baseIteratee(predicate));
1957   }
1958
1959   /**
1960    * Iterates over elements of `collection`, returning the first element
1961    * `predicate` returns truthy for. The predicate is invoked with three
1962    * arguments: (value, index|key, collection).
1963    *
1964    * @static
1965    * @memberOf _
1966    * @since 0.1.0
1967    * @category Collection
1968    * @param {Array|Object} collection The collection to inspect.
1969    * @param {Function} [predicate=_.identity] The function invoked per iteration.
1970    * @param {number} [fromIndex=0] The index to search from.
1971    * @returns {*} Returns the matched element, else `undefined`.
1972    * @example
1973    *
1974    * var users = [
1975    *   { 'user': 'barney',  'age': 36, 'active': true },
1976    *   { 'user': 'fred',    'age': 40, 'active': false },
1977    *   { 'user': 'pebbles', 'age': 1,  'active': true }
1978    * ];
1979    *
1980    * _.find(users, function(o) { return o.age < 40; });
1981    * // => object for 'barney'
1982    *
1983    * // The `_.matches` iteratee shorthand.
1984    * _.find(users, { 'age': 1, 'active': true });
1985    * // => object for 'pebbles'
1986    *
1987    * // The `_.matchesProperty` iteratee shorthand.
1988    * _.find(users, ['active', false]);
1989    * // => object for 'fred'
1990    *
1991    * // The `_.property` iteratee shorthand.
1992    * _.find(users, 'active');
1993    * // => object for 'barney'
1994    */
1995   var find = createFind(findIndex);
1996
1997   /**
1998    * Iterates over elements of `collection` and invokes `iteratee` for each element.
1999    * The iteratee is invoked with three arguments: (value, index|key, collection).
2000    * Iteratee functions may exit iteration early by explicitly returning `false`.
2001    *
2002    * **Note:** As with other "Collections" methods, objects with a "length"
2003    * property are iterated like arrays. To avoid this behavior use `_.forIn`
2004    * or `_.forOwn` for object iteration.
2005    *
2006    * @static
2007    * @memberOf _
2008    * @since 0.1.0
2009    * @alias each
2010    * @category Collection
2011    * @param {Array|Object} collection The collection to iterate over.
2012    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2013    * @returns {Array|Object} Returns `collection`.
2014    * @see _.forEachRight
2015    * @example
2016    *
2017    * _.forEach([1, 2], function(value) {
2018    *   console.log(value);
2019    * });
2020    * // => Logs `1` then `2`.
2021    *
2022    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
2023    *   console.log(key);
2024    * });
2025    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
2026    */
2027   function forEach(collection, iteratee) {
2028     return baseEach(collection, baseIteratee(iteratee));
2029   }
2030
2031   /**
2032    * Creates an array of values by running each element in `collection` thru
2033    * `iteratee`. The iteratee is invoked with three arguments:
2034    * (value, index|key, collection).
2035    *
2036    * Many lodash methods are guarded to work as iteratees for methods like
2037    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
2038    *
2039    * The guarded methods are:
2040    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
2041    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
2042    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
2043    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
2044    *
2045    * @static
2046    * @memberOf _
2047    * @since 0.1.0
2048    * @category Collection
2049    * @param {Array|Object} collection The collection to iterate over.
2050    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2051    * @returns {Array} Returns the new mapped array.
2052    * @example
2053    *
2054    * function square(n) {
2055    *   return n * n;
2056    * }
2057    *
2058    * _.map([4, 8], square);
2059    * // => [16, 64]
2060    *
2061    * _.map({ 'a': 4, 'b': 8 }, square);
2062    * // => [16, 64] (iteration order is not guaranteed)
2063    *
2064    * var users = [
2065    *   { 'user': 'barney' },
2066    *   { 'user': 'fred' }
2067    * ];
2068    *
2069    * // The `_.property` iteratee shorthand.
2070    * _.map(users, 'user');
2071    * // => ['barney', 'fred']
2072    */
2073   function map(collection, iteratee) {
2074     return baseMap(collection, baseIteratee(iteratee));
2075   }
2076
2077   /**
2078    * Reduces `collection` to a value which is the accumulated result of running
2079    * each element in `collection` thru `iteratee`, where each successive
2080    * invocation is supplied the return value of the previous. If `accumulator`
2081    * is not given, the first element of `collection` is used as the initial
2082    * value. The iteratee is invoked with four arguments:
2083    * (accumulator, value, index|key, collection).
2084    *
2085    * Many lodash methods are guarded to work as iteratees for methods like
2086    * `_.reduce`, `_.reduceRight`, and `_.transform`.
2087    *
2088    * The guarded methods are:
2089    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
2090    * and `sortBy`
2091    *
2092    * @static
2093    * @memberOf _
2094    * @since 0.1.0
2095    * @category Collection
2096    * @param {Array|Object} collection The collection to iterate over.
2097    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
2098    * @param {*} [accumulator] The initial value.
2099    * @returns {*} Returns the accumulated value.
2100    * @see _.reduceRight
2101    * @example
2102    *
2103    * _.reduce([1, 2], function(sum, n) {
2104    *   return sum + n;
2105    * }, 0);
2106    * // => 3
2107    *
2108    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
2109    *   (result[value] || (result[value] = [])).push(key);
2110    *   return result;
2111    * }, {});
2112    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
2113    */
2114   function reduce(collection, iteratee, accumulator) {
2115     return baseReduce(collection, baseIteratee(iteratee), accumulator, arguments.length < 3, baseEach);
2116   }
2117
2118   /**
2119    * Gets the size of `collection` by returning its length for array-like
2120    * values or the number of own enumerable string keyed properties for objects.
2121    *
2122    * @static
2123    * @memberOf _
2124    * @since 0.1.0
2125    * @category Collection
2126    * @param {Array|Object|string} collection The collection to inspect.
2127    * @returns {number} Returns the collection size.
2128    * @example
2129    *
2130    * _.size([1, 2, 3]);
2131    * // => 3
2132    *
2133    * _.size({ 'a': 1, 'b': 2 });
2134    * // => 2
2135    *
2136    * _.size('pebbles');
2137    * // => 7
2138    */
2139   function size(collection) {
2140     if (collection == null) {
2141       return 0;
2142     }
2143     collection = isArrayLike(collection) ? collection : nativeKeys(collection);
2144     return collection.length;
2145   }
2146
2147   /**
2148    * Checks if `predicate` returns truthy for **any** element of `collection`.
2149    * Iteration is stopped once `predicate` returns truthy. The predicate is
2150    * invoked with three arguments: (value, index|key, collection).
2151    *
2152    * @static
2153    * @memberOf _
2154    * @since 0.1.0
2155    * @category Collection
2156    * @param {Array|Object} collection The collection to iterate over.
2157    * @param {Function} [predicate=_.identity] The function invoked per iteration.
2158    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
2159    * @returns {boolean} Returns `true` if any element passes the predicate check,
2160    *  else `false`.
2161    * @example
2162    *
2163    * _.some([null, 0, 'yes', false], Boolean);
2164    * // => true
2165    *
2166    * var users = [
2167    *   { 'user': 'barney', 'active': true },
2168    *   { 'user': 'fred',   'active': false }
2169    * ];
2170    *
2171    * // The `_.matches` iteratee shorthand.
2172    * _.some(users, { 'user': 'barney', 'active': false });
2173    * // => false
2174    *
2175    * // The `_.matchesProperty` iteratee shorthand.
2176    * _.some(users, ['active', false]);
2177    * // => true
2178    *
2179    * // The `_.property` iteratee shorthand.
2180    * _.some(users, 'active');
2181    * // => true
2182    */
2183   function some(collection, predicate, guard) {
2184     predicate = guard ? undefined : predicate;
2185     return baseSome(collection, baseIteratee(predicate));
2186   }
2187
2188   /**
2189    * Creates an array of elements, sorted in ascending order by the results of
2190    * running each element in a collection thru each iteratee. This method
2191    * performs a stable sort, that is, it preserves the original sort order of
2192    * equal elements. The iteratees are invoked with one argument: (value).
2193    *
2194    * @static
2195    * @memberOf _
2196    * @since 0.1.0
2197    * @category Collection
2198    * @param {Array|Object} collection The collection to iterate over.
2199    * @param {...(Function|Function[])} [iteratees=[_.identity]]
2200    *  The iteratees to sort by.
2201    * @returns {Array} Returns the new sorted array.
2202    * @example
2203    *
2204    * var users = [
2205    *   { 'user': 'fred',   'age': 48 },
2206    *   { 'user': 'barney', 'age': 36 },
2207    *   { 'user': 'fred',   'age': 30 },
2208    *   { 'user': 'barney', 'age': 34 }
2209    * ];
2210    *
2211    * _.sortBy(users, [function(o) { return o.user; }]);
2212    * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
2213    *
2214    * _.sortBy(users, ['user', 'age']);
2215    * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
2216    */
2217   function sortBy(collection, iteratee) {
2218     var index = 0;
2219     iteratee = baseIteratee(iteratee);
2220
2221     return baseMap(baseMap(collection, function(value, key, collection) {
2222       return { 'value': value, 'index': index++, 'criteria': iteratee(value, key, collection) };
2223     }).sort(function(object, other) {
2224       return compareAscending(object.criteria, other.criteria) || (object.index - other.index);
2225     }), baseProperty('value'));
2226   }
2227
2228   /*------------------------------------------------------------------------*/
2229
2230   /**
2231    * Creates a function that invokes `func`, with the `this` binding and arguments
2232    * of the created function, while it's called less than `n` times. Subsequent
2233    * calls to the created function return the result of the last `func` invocation.
2234    *
2235    * @static
2236    * @memberOf _
2237    * @since 3.0.0
2238    * @category Function
2239    * @param {number} n The number of calls at which `func` is no longer invoked.
2240    * @param {Function} func The function to restrict.
2241    * @returns {Function} Returns the new restricted function.
2242    * @example
2243    *
2244    * jQuery(element).on('click', _.before(5, addContactToList));
2245    * // => Allows adding up to 4 contacts to the list.
2246    */
2247   function before(n, func) {
2248     var result;
2249     if (typeof func != 'function') {
2250       throw new TypeError(FUNC_ERROR_TEXT);
2251     }
2252     n = toInteger(n);
2253     return function() {
2254       if (--n > 0) {
2255         result = func.apply(this, arguments);
2256       }
2257       if (n <= 1) {
2258         func = undefined;
2259       }
2260       return result;
2261     };
2262   }
2263
2264   /**
2265    * Creates a function that invokes `func` with the `this` binding of `thisArg`
2266    * and `partials` prepended to the arguments it receives.
2267    *
2268    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
2269    * may be used as a placeholder for partially applied arguments.
2270    *
2271    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
2272    * property of bound functions.
2273    *
2274    * @static
2275    * @memberOf _
2276    * @since 0.1.0
2277    * @category Function
2278    * @param {Function} func The function to bind.
2279    * @param {*} thisArg The `this` binding of `func`.
2280    * @param {...*} [partials] The arguments to be partially applied.
2281    * @returns {Function} Returns the new bound function.
2282    * @example
2283    *
2284    * function greet(greeting, punctuation) {
2285    *   return greeting + ' ' + this.user + punctuation;
2286    * }
2287    *
2288    * var object = { 'user': 'fred' };
2289    *
2290    * var bound = _.bind(greet, object, 'hi');
2291    * bound('!');
2292    * // => 'hi fred!'
2293    *
2294    * // Bound with placeholders.
2295    * var bound = _.bind(greet, object, _, '!');
2296    * bound('hi');
2297    * // => 'hi fred!'
2298    */
2299   var bind = baseRest(function(func, thisArg, partials) {
2300     return createPartial(func, WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG, thisArg, partials);
2301   });
2302
2303   /**
2304    * Defers invoking the `func` until the current call stack has cleared. Any
2305    * additional arguments are provided to `func` when it's invoked.
2306    *
2307    * @static
2308    * @memberOf _
2309    * @since 0.1.0
2310    * @category Function
2311    * @param {Function} func The function to defer.
2312    * @param {...*} [args] The arguments to invoke `func` with.
2313    * @returns {number} Returns the timer id.
2314    * @example
2315    *
2316    * _.defer(function(text) {
2317    *   console.log(text);
2318    * }, 'deferred');
2319    * // => Logs 'deferred' after one millisecond.
2320    */
2321   var defer = baseRest(function(func, args) {
2322     return baseDelay(func, 1, args);
2323   });
2324
2325   /**
2326    * Invokes `func` after `wait` milliseconds. Any additional arguments are
2327    * provided to `func` when it's invoked.
2328    *
2329    * @static
2330    * @memberOf _
2331    * @since 0.1.0
2332    * @category Function
2333    * @param {Function} func The function to delay.
2334    * @param {number} wait The number of milliseconds to delay invocation.
2335    * @param {...*} [args] The arguments to invoke `func` with.
2336    * @returns {number} Returns the timer id.
2337    * @example
2338    *
2339    * _.delay(function(text) {
2340    *   console.log(text);
2341    * }, 1000, 'later');
2342    * // => Logs 'later' after one second.
2343    */
2344   var delay = baseRest(function(func, wait, args) {
2345     return baseDelay(func, toNumber(wait) || 0, args);
2346   });
2347
2348   /**
2349    * Creates a function that negates the result of the predicate `func`. The
2350    * `func` predicate is invoked with the `this` binding and arguments of the
2351    * created function.
2352    *
2353    * @static
2354    * @memberOf _
2355    * @since 3.0.0
2356    * @category Function
2357    * @param {Function} predicate The predicate to negate.
2358    * @returns {Function} Returns the new negated function.
2359    * @example
2360    *
2361    * function isEven(n) {
2362    *   return n % 2 == 0;
2363    * }
2364    *
2365    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
2366    * // => [1, 3, 5]
2367    */
2368   function negate(predicate) {
2369     if (typeof predicate != 'function') {
2370       throw new TypeError(FUNC_ERROR_TEXT);
2371     }
2372     return function() {
2373       var args = arguments;
2374       return !predicate.apply(this, args);
2375     };
2376   }
2377
2378   /**
2379    * Creates a function that is restricted to invoking `func` once. Repeat calls
2380    * to the function return the value of the first invocation. The `func` is
2381    * invoked with the `this` binding and arguments of the created function.
2382    *
2383    * @static
2384    * @memberOf _
2385    * @since 0.1.0
2386    * @category Function
2387    * @param {Function} func The function to restrict.
2388    * @returns {Function} Returns the new restricted function.
2389    * @example
2390    *
2391    * var initialize = _.once(createApplication);
2392    * initialize();
2393    * initialize();
2394    * // => `createApplication` is invoked once
2395    */
2396   function once(func) {
2397     return before(2, func);
2398   }
2399
2400   /*------------------------------------------------------------------------*/
2401
2402   /**
2403    * Creates a shallow clone of `value`.
2404    *
2405    * **Note:** This method is loosely based on the
2406    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
2407    * and supports cloning arrays, array buffers, booleans, date objects, maps,
2408    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
2409    * arrays. The own enumerable properties of `arguments` objects are cloned
2410    * as plain objects. An empty object is returned for uncloneable values such
2411    * as error objects, functions, DOM nodes, and WeakMaps.
2412    *
2413    * @static
2414    * @memberOf _
2415    * @since 0.1.0
2416    * @category Lang
2417    * @param {*} value The value to clone.
2418    * @returns {*} Returns the cloned value.
2419    * @see _.cloneDeep
2420    * @example
2421    *
2422    * var objects = [{ 'a': 1 }, { 'b': 2 }];
2423    *
2424    * var shallow = _.clone(objects);
2425    * console.log(shallow[0] === objects[0]);
2426    * // => true
2427    */
2428   function clone(value) {
2429     if (!isObject(value)) {
2430       return value;
2431     }
2432     return isArray(value) ? copyArray(value) : copyObject(value, nativeKeys(value));
2433   }
2434
2435   /**
2436    * Performs a
2437    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2438    * comparison between two values to determine if they are equivalent.
2439    *
2440    * @static
2441    * @memberOf _
2442    * @since 4.0.0
2443    * @category Lang
2444    * @param {*} value The value to compare.
2445    * @param {*} other The other value to compare.
2446    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2447    * @example
2448    *
2449    * var object = { 'a': 1 };
2450    * var other = { 'a': 1 };
2451    *
2452    * _.eq(object, object);
2453    * // => true
2454    *
2455    * _.eq(object, other);
2456    * // => false
2457    *
2458    * _.eq('a', 'a');
2459    * // => true
2460    *
2461    * _.eq('a', Object('a'));
2462    * // => false
2463    *
2464    * _.eq(NaN, NaN);
2465    * // => true
2466    */
2467   function eq(value, other) {
2468     return value === other || (value !== value && other !== other);
2469   }
2470
2471   /**
2472    * Checks if `value` is likely an `arguments` object.
2473    *
2474    * @static
2475    * @memberOf _
2476    * @since 0.1.0
2477    * @category Lang
2478    * @param {*} value The value to check.
2479    * @returns {boolean} Returns `true` if `value` is an `arguments` object,
2480    *  else `false`.
2481    * @example
2482    *
2483    * _.isArguments(function() { return arguments; }());
2484    * // => true
2485    *
2486    * _.isArguments([1, 2, 3]);
2487    * // => false
2488    */
2489   var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
2490     return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
2491       !propertyIsEnumerable.call(value, 'callee');
2492   };
2493
2494   /**
2495    * Checks if `value` is classified as an `Array` object.
2496    *
2497    * @static
2498    * @memberOf _
2499    * @since 0.1.0
2500    * @category Lang
2501    * @param {*} value The value to check.
2502    * @returns {boolean} Returns `true` if `value` is an array, else `false`.
2503    * @example
2504    *
2505    * _.isArray([1, 2, 3]);
2506    * // => true
2507    *
2508    * _.isArray(document.body.children);
2509    * // => false
2510    *
2511    * _.isArray('abc');
2512    * // => false
2513    *
2514    * _.isArray(_.noop);
2515    * // => false
2516    */
2517   var isArray = Array.isArray;
2518
2519   /**
2520    * Checks if `value` is array-like. A value is considered array-like if it's
2521    * not a function and has a `value.length` that's an integer greater than or
2522    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
2523    *
2524    * @static
2525    * @memberOf _
2526    * @since 4.0.0
2527    * @category Lang
2528    * @param {*} value The value to check.
2529    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
2530    * @example
2531    *
2532    * _.isArrayLike([1, 2, 3]);
2533    * // => true
2534    *
2535    * _.isArrayLike(document.body.children);
2536    * // => true
2537    *
2538    * _.isArrayLike('abc');
2539    * // => true
2540    *
2541    * _.isArrayLike(_.noop);
2542    * // => false
2543    */
2544   function isArrayLike(value) {
2545     return value != null && isLength(value.length) && !isFunction(value);
2546   }
2547
2548   /**
2549    * Checks if `value` is classified as a boolean primitive or object.
2550    *
2551    * @static
2552    * @memberOf _
2553    * @since 0.1.0
2554    * @category Lang
2555    * @param {*} value The value to check.
2556    * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
2557    * @example
2558    *
2559    * _.isBoolean(false);
2560    * // => true
2561    *
2562    * _.isBoolean(null);
2563    * // => false
2564    */
2565   function isBoolean(value) {
2566     return value === true || value === false ||
2567       (isObjectLike(value) && baseGetTag(value) == boolTag);
2568   }
2569
2570   /**
2571    * Checks if `value` is classified as a `Date` object.
2572    *
2573    * @static
2574    * @memberOf _
2575    * @since 0.1.0
2576    * @category Lang
2577    * @param {*} value The value to check.
2578    * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
2579    * @example
2580    *
2581    * _.isDate(new Date);
2582    * // => true
2583    *
2584    * _.isDate('Mon April 23 2012');
2585    * // => false
2586    */
2587   var isDate = baseIsDate;
2588
2589   /**
2590    * Checks if `value` is an empty object, collection, map, or set.
2591    *
2592    * Objects are considered empty if they have no own enumerable string keyed
2593    * properties.
2594    *
2595    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
2596    * jQuery-like collections are considered empty if they have a `length` of `0`.
2597    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
2598    *
2599    * @static
2600    * @memberOf _
2601    * @since 0.1.0
2602    * @category Lang
2603    * @param {*} value The value to check.
2604    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
2605    * @example
2606    *
2607    * _.isEmpty(null);
2608    * // => true
2609    *
2610    * _.isEmpty(true);
2611    * // => true
2612    *
2613    * _.isEmpty(1);
2614    * // => true
2615    *
2616    * _.isEmpty([1, 2, 3]);
2617    * // => false
2618    *
2619    * _.isEmpty({ 'a': 1 });
2620    * // => false
2621    */
2622   function isEmpty(value) {
2623     if (isArrayLike(value) &&
2624         (isArray(value) || isString(value) ||
2625           isFunction(value.splice) || isArguments(value))) {
2626       return !value.length;
2627     }
2628     return !nativeKeys(value).length;
2629   }
2630
2631   /**
2632    * Performs a deep comparison between two values to determine if they are
2633    * equivalent.
2634    *
2635    * **Note:** This method supports comparing arrays, array buffers, booleans,
2636    * date objects, error objects, maps, numbers, `Object` objects, regexes,
2637    * sets, strings, symbols, and typed arrays. `Object` objects are compared
2638    * by their own, not inherited, enumerable properties. Functions and DOM
2639    * nodes are compared by strict equality, i.e. `===`.
2640    *
2641    * @static
2642    * @memberOf _
2643    * @since 0.1.0
2644    * @category Lang
2645    * @param {*} value The value to compare.
2646    * @param {*} other The other value to compare.
2647    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
2648    * @example
2649    *
2650    * var object = { 'a': 1 };
2651    * var other = { 'a': 1 };
2652    *
2653    * _.isEqual(object, other);
2654    * // => true
2655    *
2656    * object === other;
2657    * // => false
2658    */
2659   function isEqual(value, other) {
2660     return baseIsEqual(value, other);
2661   }
2662
2663   /**
2664    * Checks if `value` is a finite primitive number.
2665    *
2666    * **Note:** This method is based on
2667    * [`Number.isFinite`](https://mdn.io/Number/isFinite).
2668    *
2669    * @static
2670    * @memberOf _
2671    * @since 0.1.0
2672    * @category Lang
2673    * @param {*} value The value to check.
2674    * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
2675    * @example
2676    *
2677    * _.isFinite(3);
2678    * // => true
2679    *
2680    * _.isFinite(Number.MIN_VALUE);
2681    * // => true
2682    *
2683    * _.isFinite(Infinity);
2684    * // => false
2685    *
2686    * _.isFinite('3');
2687    * // => false
2688    */
2689   function isFinite(value) {
2690     return typeof value == 'number' && nativeIsFinite(value);
2691   }
2692
2693   /**
2694    * Checks if `value` is classified as a `Function` object.
2695    *
2696    * @static
2697    * @memberOf _
2698    * @since 0.1.0
2699    * @category Lang
2700    * @param {*} value The value to check.
2701    * @returns {boolean} Returns `true` if `value` is a function, else `false`.
2702    * @example
2703    *
2704    * _.isFunction(_);
2705    * // => true
2706    *
2707    * _.isFunction(/abc/);
2708    * // => false
2709    */
2710   function isFunction(value) {
2711     if (!isObject(value)) {
2712       return false;
2713     }
2714     // The use of `Object#toString` avoids issues with the `typeof` operator
2715     // in Safari 9 which returns 'object' for typed arrays and other constructors.
2716     var tag = baseGetTag(value);
2717     return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
2718   }
2719
2720   /**
2721    * Checks if `value` is a valid array-like length.
2722    *
2723    * **Note:** This method is loosely based on
2724    * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
2725    *
2726    * @static
2727    * @memberOf _
2728    * @since 4.0.0
2729    * @category Lang
2730    * @param {*} value The value to check.
2731    * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
2732    * @example
2733    *
2734    * _.isLength(3);
2735    * // => true
2736    *
2737    * _.isLength(Number.MIN_VALUE);
2738    * // => false
2739    *
2740    * _.isLength(Infinity);
2741    * // => false
2742    *
2743    * _.isLength('3');
2744    * // => false
2745    */
2746   function isLength(value) {
2747     return typeof value == 'number' &&
2748       value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
2749   }
2750
2751   /**
2752    * Checks if `value` is the
2753    * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
2754    * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
2755    *
2756    * @static
2757    * @memberOf _
2758    * @since 0.1.0
2759    * @category Lang
2760    * @param {*} value The value to check.
2761    * @returns {boolean} Returns `true` if `value` is an object, else `false`.
2762    * @example
2763    *
2764    * _.isObject({});
2765    * // => true
2766    *
2767    * _.isObject([1, 2, 3]);
2768    * // => true
2769    *
2770    * _.isObject(_.noop);
2771    * // => true
2772    *
2773    * _.isObject(null);
2774    * // => false
2775    */
2776   function isObject(value) {
2777     var type = typeof value;
2778     return value != null && (type == 'object' || type == 'function');
2779   }
2780
2781   /**
2782    * Checks if `value` is object-like. A value is object-like if it's not `null`
2783    * and has a `typeof` result of "object".
2784    *
2785    * @static
2786    * @memberOf _
2787    * @since 4.0.0
2788    * @category Lang
2789    * @param {*} value The value to check.
2790    * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
2791    * @example
2792    *
2793    * _.isObjectLike({});
2794    * // => true
2795    *
2796    * _.isObjectLike([1, 2, 3]);
2797    * // => true
2798    *
2799    * _.isObjectLike(_.noop);
2800    * // => false
2801    *
2802    * _.isObjectLike(null);
2803    * // => false
2804    */
2805   function isObjectLike(value) {
2806     return value != null && typeof value == 'object';
2807   }
2808
2809   /**
2810    * Checks if `value` is `NaN`.
2811    *
2812    * **Note:** This method is based on
2813    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
2814    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
2815    * `undefined` and other non-number values.
2816    *
2817    * @static
2818    * @memberOf _
2819    * @since 0.1.0
2820    * @category Lang
2821    * @param {*} value The value to check.
2822    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
2823    * @example
2824    *
2825    * _.isNaN(NaN);
2826    * // => true
2827    *
2828    * _.isNaN(new Number(NaN));
2829    * // => true
2830    *
2831    * isNaN(undefined);
2832    * // => true
2833    *
2834    * _.isNaN(undefined);
2835    * // => false
2836    */
2837   function isNaN(value) {
2838     // An `NaN` primitive is the only value that is not equal to itself.
2839     // Perform the `toStringTag` check first to avoid errors with some
2840     // ActiveX objects in IE.
2841     return isNumber(value) && value != +value;
2842   }
2843
2844   /**
2845    * Checks if `value` is `null`.
2846    *
2847    * @static
2848    * @memberOf _
2849    * @since 0.1.0
2850    * @category Lang
2851    * @param {*} value The value to check.
2852    * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
2853    * @example
2854    *
2855    * _.isNull(null);
2856    * // => true
2857    *
2858    * _.isNull(void 0);
2859    * // => false
2860    */
2861   function isNull(value) {
2862     return value === null;
2863   }
2864
2865   /**
2866    * Checks if `value` is classified as a `Number` primitive or object.
2867    *
2868    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
2869    * classified as numbers, use the `_.isFinite` method.
2870    *
2871    * @static
2872    * @memberOf _
2873    * @since 0.1.0
2874    * @category Lang
2875    * @param {*} value The value to check.
2876    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
2877    * @example
2878    *
2879    * _.isNumber(3);
2880    * // => true
2881    *
2882    * _.isNumber(Number.MIN_VALUE);
2883    * // => true
2884    *
2885    * _.isNumber(Infinity);
2886    * // => true
2887    *
2888    * _.isNumber('3');
2889    * // => false
2890    */
2891   function isNumber(value) {
2892     return typeof value == 'number' ||
2893       (isObjectLike(value) && baseGetTag(value) == numberTag);
2894   }
2895
2896   /**
2897    * Checks if `value` is classified as a `RegExp` object.
2898    *
2899    * @static
2900    * @memberOf _
2901    * @since 0.1.0
2902    * @category Lang
2903    * @param {*} value The value to check.
2904    * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
2905    * @example
2906    *
2907    * _.isRegExp(/abc/);
2908    * // => true
2909    *
2910    * _.isRegExp('/abc/');
2911    * // => false
2912    */
2913   var isRegExp = baseIsRegExp;
2914
2915   /**
2916    * Checks if `value` is classified as a `String` primitive or object.
2917    *
2918    * @static
2919    * @since 0.1.0
2920    * @memberOf _
2921    * @category Lang
2922    * @param {*} value The value to check.
2923    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
2924    * @example
2925    *
2926    * _.isString('abc');
2927    * // => true
2928    *
2929    * _.isString(1);
2930    * // => false
2931    */
2932   function isString(value) {
2933     return typeof value == 'string' ||
2934       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
2935   }
2936
2937   /**
2938    * Checks if `value` is `undefined`.
2939    *
2940    * @static
2941    * @since 0.1.0
2942    * @memberOf _
2943    * @category Lang
2944    * @param {*} value The value to check.
2945    * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
2946    * @example
2947    *
2948    * _.isUndefined(void 0);
2949    * // => true
2950    *
2951    * _.isUndefined(null);
2952    * // => false
2953    */
2954   function isUndefined(value) {
2955     return value === undefined;
2956   }
2957
2958   /**
2959    * Converts `value` to an array.
2960    *
2961    * @static
2962    * @since 0.1.0
2963    * @memberOf _
2964    * @category Lang
2965    * @param {*} value The value to convert.
2966    * @returns {Array} Returns the converted array.
2967    * @example
2968    *
2969    * _.toArray({ 'a': 1, 'b': 2 });
2970    * // => [1, 2]
2971    *
2972    * _.toArray('abc');
2973    * // => ['a', 'b', 'c']
2974    *
2975    * _.toArray(1);
2976    * // => []
2977    *
2978    * _.toArray(null);
2979    * // => []
2980    */
2981   function toArray(value) {
2982     if (!isArrayLike(value)) {
2983       return values(value);
2984     }
2985     return value.length ? copyArray(value) : [];
2986   }
2987
2988   /**
2989    * Converts `value` to an integer.
2990    *
2991    * **Note:** This method is loosely based on
2992    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
2993    *
2994    * @static
2995    * @memberOf _
2996    * @since 4.0.0
2997    * @category Lang
2998    * @param {*} value The value to convert.
2999    * @returns {number} Returns the converted integer.
3000    * @example
3001    *
3002    * _.toInteger(3.2);
3003    * // => 3
3004    *
3005    * _.toInteger(Number.MIN_VALUE);
3006    * // => 0
3007    *
3008    * _.toInteger(Infinity);
3009    * // => 1.7976931348623157e+308
3010    *
3011    * _.toInteger('3.2');
3012    * // => 3
3013    */
3014   var toInteger = Number;
3015
3016   /**
3017    * Converts `value` to a number.
3018    *
3019    * @static
3020    * @memberOf _
3021    * @since 4.0.0
3022    * @category Lang
3023    * @param {*} value The value to process.
3024    * @returns {number} Returns the number.
3025    * @example
3026    *
3027    * _.toNumber(3.2);
3028    * // => 3.2
3029    *
3030    * _.toNumber(Number.MIN_VALUE);
3031    * // => 5e-324
3032    *
3033    * _.toNumber(Infinity);
3034    * // => Infinity
3035    *
3036    * _.toNumber('3.2');
3037    * // => 3.2
3038    */
3039   var toNumber = Number;
3040
3041   /**
3042    * Converts `value` to a string. An empty string is returned for `null`
3043    * and `undefined` values. The sign of `-0` is preserved.
3044    *
3045    * @static
3046    * @memberOf _
3047    * @since 4.0.0
3048    * @category Lang
3049    * @param {*} value The value to convert.
3050    * @returns {string} Returns the converted string.
3051    * @example
3052    *
3053    * _.toString(null);
3054    * // => ''
3055    *
3056    * _.toString(-0);
3057    * // => '-0'
3058    *
3059    * _.toString([1, 2, 3]);
3060    * // => '1,2,3'
3061    */
3062   function toString(value) {
3063     if (typeof value == 'string') {
3064       return value;
3065     }
3066     return value == null ? '' : (value + '');
3067   }
3068
3069   /*------------------------------------------------------------------------*/
3070
3071   /**
3072    * Assigns own enumerable string keyed properties of source objects to the
3073    * destination object. Source objects are applied from left to right.
3074    * Subsequent sources overwrite property assignments of previous sources.
3075    *
3076    * **Note:** This method mutates `object` and is loosely based on
3077    * [`Object.assign`](https://mdn.io/Object/assign).
3078    *
3079    * @static
3080    * @memberOf _
3081    * @since 0.10.0
3082    * @category Object
3083    * @param {Object} object The destination object.
3084    * @param {...Object} [sources] The source objects.
3085    * @returns {Object} Returns `object`.
3086    * @see _.assignIn
3087    * @example
3088    *
3089    * function Foo() {
3090    *   this.a = 1;
3091    * }
3092    *
3093    * function Bar() {
3094    *   this.c = 3;
3095    * }
3096    *
3097    * Foo.prototype.b = 2;
3098    * Bar.prototype.d = 4;
3099    *
3100    * _.assign({ 'a': 0 }, new Foo, new Bar);
3101    * // => { 'a': 1, 'c': 3 }
3102    */
3103   var assign = createAssigner(function(object, source) {
3104     copyObject(source, nativeKeys(source), object);
3105   });
3106
3107   /**
3108    * This method is like `_.assign` except that it iterates over own and
3109    * inherited source properties.
3110    *
3111    * **Note:** This method mutates `object`.
3112    *
3113    * @static
3114    * @memberOf _
3115    * @since 4.0.0
3116    * @alias extend
3117    * @category Object
3118    * @param {Object} object The destination object.
3119    * @param {...Object} [sources] The source objects.
3120    * @returns {Object} Returns `object`.
3121    * @see _.assign
3122    * @example
3123    *
3124    * function Foo() {
3125    *   this.a = 1;
3126    * }
3127    *
3128    * function Bar() {
3129    *   this.c = 3;
3130    * }
3131    *
3132    * Foo.prototype.b = 2;
3133    * Bar.prototype.d = 4;
3134    *
3135    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
3136    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
3137    */
3138   var assignIn = createAssigner(function(object, source) {
3139     copyObject(source, nativeKeysIn(source), object);
3140   });
3141
3142   /**
3143    * Creates an object that inherits from the `prototype` object. If a
3144    * `properties` object is given, its own enumerable string keyed properties
3145    * are assigned to the created object.
3146    *
3147    * @static
3148    * @memberOf _
3149    * @since 2.3.0
3150    * @category Object
3151    * @param {Object} prototype The object to inherit from.
3152    * @param {Object} [properties] The properties to assign to the object.
3153    * @returns {Object} Returns the new object.
3154    * @example
3155    *
3156    * function Shape() {
3157    *   this.x = 0;
3158    *   this.y = 0;
3159    * }
3160    *
3161    * function Circle() {
3162    *   Shape.call(this);
3163    * }
3164    *
3165    * Circle.prototype = _.create(Shape.prototype, {
3166    *   'constructor': Circle
3167    * });
3168    *
3169    * var circle = new Circle;
3170    * circle instanceof Circle;
3171    * // => true
3172    *
3173    * circle instanceof Shape;
3174    * // => true
3175    */
3176   function create(prototype, properties) {
3177     var result = baseCreate(prototype);
3178     return properties == null ? result : assign(result, properties);
3179   }
3180
3181   /**
3182    * Assigns own and inherited enumerable string keyed properties of source
3183    * objects to the destination object for all destination properties that
3184    * resolve to `undefined`. Source objects are applied from left to right.
3185    * Once a property is set, additional values of the same property are ignored.
3186    *
3187    * **Note:** This method mutates `object`.
3188    *
3189    * @static
3190    * @since 0.1.0
3191    * @memberOf _
3192    * @category Object
3193    * @param {Object} object The destination object.
3194    * @param {...Object} [sources] The source objects.
3195    * @returns {Object} Returns `object`.
3196    * @see _.defaultsDeep
3197    * @example
3198    *
3199    * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
3200    * // => { 'a': 1, 'b': 2 }
3201    */
3202   var defaults = baseRest(function(object, sources) {
3203     object = Object(object);
3204
3205     var index = -1;
3206     var length = sources.length;
3207     var guard = length > 2 ? sources[2] : undefined;
3208
3209     if (guard && isIterateeCall(sources[0], sources[1], guard)) {
3210       length = 1;
3211     }
3212
3213     while (++index < length) {
3214       var source = sources[index];
3215       var props = keysIn(source);
3216       var propsIndex = -1;
3217       var propsLength = props.length;
3218
3219       while (++propsIndex < propsLength) {
3220         var key = props[propsIndex];
3221         var value = object[key];
3222
3223         if (value === undefined ||
3224             (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
3225           object[key] = source[key];
3226         }
3227       }
3228     }
3229
3230     return object;
3231   });
3232
3233   /**
3234    * Checks if `path` is a direct property of `object`.
3235    *
3236    * @static
3237    * @since 0.1.0
3238    * @memberOf _
3239    * @category Object
3240    * @param {Object} object The object to query.
3241    * @param {Array|string} path The path to check.
3242    * @returns {boolean} Returns `true` if `path` exists, else `false`.
3243    * @example
3244    *
3245    * var object = { 'a': { 'b': 2 } };
3246    * var other = _.create({ 'a': _.create({ 'b': 2 }) });
3247    *
3248    * _.has(object, 'a');
3249    * // => true
3250    *
3251    * _.has(object, 'a.b');
3252    * // => true
3253    *
3254    * _.has(object, ['a', 'b']);
3255    * // => true
3256    *
3257    * _.has(other, 'a');
3258    * // => false
3259    */
3260   function has(object, path) {
3261     return object != null && hasOwnProperty.call(object, path);
3262   }
3263
3264   /**
3265    * Creates an array of the own enumerable property names of `object`.
3266    *
3267    * **Note:** Non-object values are coerced to objects. See the
3268    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
3269    * for more details.
3270    *
3271    * @static
3272    * @since 0.1.0
3273    * @memberOf _
3274    * @category Object
3275    * @param {Object} object The object to query.
3276    * @returns {Array} Returns the array of property names.
3277    * @example
3278    *
3279    * function Foo() {
3280    *   this.a = 1;
3281    *   this.b = 2;
3282    * }
3283    *
3284    * Foo.prototype.c = 3;
3285    *
3286    * _.keys(new Foo);
3287    * // => ['a', 'b'] (iteration order is not guaranteed)
3288    *
3289    * _.keys('hi');
3290    * // => ['0', '1']
3291    */
3292   var keys = nativeKeys;
3293
3294   /**
3295    * Creates an array of the own and inherited enumerable property names of `object`.
3296    *
3297    * **Note:** Non-object values are coerced to objects.
3298    *
3299    * @static
3300    * @memberOf _
3301    * @since 3.0.0
3302    * @category Object
3303    * @param {Object} object The object to query.
3304    * @returns {Array} Returns the array of property names.
3305    * @example
3306    *
3307    * function Foo() {
3308    *   this.a = 1;
3309    *   this.b = 2;
3310    * }
3311    *
3312    * Foo.prototype.c = 3;
3313    *
3314    * _.keysIn(new Foo);
3315    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
3316    */
3317   var keysIn = nativeKeysIn;
3318
3319   /**
3320    * Creates an object composed of the picked `object` properties.
3321    *
3322    * @static
3323    * @since 0.1.0
3324    * @memberOf _
3325    * @category Object
3326    * @param {Object} object The source object.
3327    * @param {...(string|string[])} [paths] The property paths to pick.
3328    * @returns {Object} Returns the new object.
3329    * @example
3330    *
3331    * var object = { 'a': 1, 'b': '2', 'c': 3 };
3332    *
3333    * _.pick(object, ['a', 'c']);
3334    * // => { 'a': 1, 'c': 3 }
3335    */
3336   var pick = flatRest(function(object, paths) {
3337     return object == null ? {} : basePick(object, paths);
3338   });
3339
3340   /**
3341    * This method is like `_.get` except that if the resolved value is a
3342    * function it's invoked with the `this` binding of its parent object and
3343    * its result is returned.
3344    *
3345    * @static
3346    * @since 0.1.0
3347    * @memberOf _
3348    * @category Object
3349    * @param {Object} object The object to query.
3350    * @param {Array|string} path The path of the property to resolve.
3351    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
3352    * @returns {*} Returns the resolved value.
3353    * @example
3354    *
3355    * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
3356    *
3357    * _.result(object, 'a[0].b.c1');
3358    * // => 3
3359    *
3360    * _.result(object, 'a[0].b.c2');
3361    * // => 4
3362    *
3363    * _.result(object, 'a[0].b.c3', 'default');
3364    * // => 'default'
3365    *
3366    * _.result(object, 'a[0].b.c3', _.constant('default'));
3367    * // => 'default'
3368    */
3369   function result(object, path, defaultValue) {
3370     var value = object == null ? undefined : object[path];
3371     if (value === undefined) {
3372       value = defaultValue;
3373     }
3374     return isFunction(value) ? value.call(object) : value;
3375   }
3376
3377   /**
3378    * Creates an array of the own enumerable string keyed property values of `object`.
3379    *
3380    * **Note:** Non-object values are coerced to objects.
3381    *
3382    * @static
3383    * @since 0.1.0
3384    * @memberOf _
3385    * @category Object
3386    * @param {Object} object The object to query.
3387    * @returns {Array} Returns the array of property values.
3388    * @example
3389    *
3390    * function Foo() {
3391    *   this.a = 1;
3392    *   this.b = 2;
3393    * }
3394    *
3395    * Foo.prototype.c = 3;
3396    *
3397    * _.values(new Foo);
3398    * // => [1, 2] (iteration order is not guaranteed)
3399    *
3400    * _.values('hi');
3401    * // => ['h', 'i']
3402    */
3403   function values(object) {
3404     return object == null ? [] : baseValues(object, keys(object));
3405   }
3406
3407   /*------------------------------------------------------------------------*/
3408
3409   /**
3410    * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
3411    * corresponding HTML entities.
3412    *
3413    * **Note:** No other characters are escaped. To escape additional
3414    * characters use a third-party library like [_he_](https://mths.be/he).
3415    *
3416    * Though the ">" character is escaped for symmetry, characters like
3417    * ">" and "/" don't need escaping in HTML and have no special meaning
3418    * unless they're part of a tag or unquoted attribute value. See
3419    * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
3420    * (under "semi-related fun fact") for more details.
3421    *
3422    * When working with HTML you should always
3423    * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
3424    * XSS vectors.
3425    *
3426    * @static
3427    * @since 0.1.0
3428    * @memberOf _
3429    * @category String
3430    * @param {string} [string=''] The string to escape.
3431    * @returns {string} Returns the escaped string.
3432    * @example
3433    *
3434    * _.escape('fred, barney, & pebbles');
3435    * // => 'fred, barney, &amp; pebbles'
3436    */
3437   function escape(string) {
3438     string = toString(string);
3439     return (string && reHasUnescapedHtml.test(string))
3440       ? string.replace(reUnescapedHtml, escapeHtmlChar)
3441       : string;
3442   }
3443
3444   /*------------------------------------------------------------------------*/
3445
3446   /**
3447    * This method returns the first argument it receives.
3448    *
3449    * @static
3450    * @since 0.1.0
3451    * @memberOf _
3452    * @category Util
3453    * @param {*} value Any value.
3454    * @returns {*} Returns `value`.
3455    * @example
3456    *
3457    * var object = { 'a': 1 };
3458    *
3459    * console.log(_.identity(object) === object);
3460    * // => true
3461    */
3462   function identity(value) {
3463     return value;
3464   }
3465
3466   /**
3467    * Creates a function that invokes `func` with the arguments of the created
3468    * function. If `func` is a property name, the created function returns the
3469    * property value for a given element. If `func` is an array or object, the
3470    * created function returns `true` for elements that contain the equivalent
3471    * source properties, otherwise it returns `false`.
3472    *
3473    * @static
3474    * @since 4.0.0
3475    * @memberOf _
3476    * @category Util
3477    * @param {*} [func=_.identity] The value to convert to a callback.
3478    * @returns {Function} Returns the callback.
3479    * @example
3480    *
3481    * var users = [
3482    *   { 'user': 'barney', 'age': 36, 'active': true },
3483    *   { 'user': 'fred',   'age': 40, 'active': false }
3484    * ];
3485    *
3486    * // The `_.matches` iteratee shorthand.
3487    * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
3488    * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
3489    *
3490    * // The `_.matchesProperty` iteratee shorthand.
3491    * _.filter(users, _.iteratee(['user', 'fred']));
3492    * // => [{ 'user': 'fred', 'age': 40 }]
3493    *
3494    * // The `_.property` iteratee shorthand.
3495    * _.map(users, _.iteratee('user'));
3496    * // => ['barney', 'fred']
3497    *
3498    * // Create custom iteratee shorthands.
3499    * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
3500    *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
3501    *     return func.test(string);
3502    *   };
3503    * });
3504    *
3505    * _.filter(['abc', 'def'], /ef/);
3506    * // => ['def']
3507    */
3508   var iteratee = baseIteratee;
3509
3510   /**
3511    * Creates a function that performs a partial deep comparison between a given
3512    * object and `source`, returning `true` if the given object has equivalent
3513    * property values, else `false`.
3514    *
3515    * **Note:** The created function is equivalent to `_.isMatch` with `source`
3516    * partially applied.
3517    *
3518    * Partial comparisons will match empty array and empty object `source`
3519    * values against any array or object value, respectively. See `_.isEqual`
3520    * for a list of supported value comparisons.
3521    *
3522    * **Note:** Multiple values can be checked by combining several matchers
3523    * using `_.overSome`
3524    *
3525    * @static
3526    * @memberOf _
3527    * @since 3.0.0
3528    * @category Util
3529    * @param {Object} source The object of property values to match.
3530    * @returns {Function} Returns the new spec function.
3531    * @example
3532    *
3533    * var objects = [
3534    *   { 'a': 1, 'b': 2, 'c': 3 },
3535    *   { 'a': 4, 'b': 5, 'c': 6 }
3536    * ];
3537    *
3538    * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
3539    * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
3540    *
3541    * // Checking for several possible values
3542    * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
3543    * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
3544    */
3545   function matches(source) {
3546     return baseMatches(assign({}, source));
3547   }
3548
3549   /**
3550    * Adds all own enumerable string keyed function properties of a source
3551    * object to the destination object. If `object` is a function, then methods
3552    * are added to its prototype as well.
3553    *
3554    * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
3555    * avoid conflicts caused by modifying the original.
3556    *
3557    * @static
3558    * @since 0.1.0
3559    * @memberOf _
3560    * @category Util
3561    * @param {Function|Object} [object=lodash] The destination object.
3562    * @param {Object} source The object of functions to add.
3563    * @param {Object} [options={}] The options object.
3564    * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
3565    * @returns {Function|Object} Returns `object`.
3566    * @example
3567    *
3568    * function vowels(string) {
3569    *   return _.filter(string, function(v) {
3570    *     return /[aeiou]/i.test(v);
3571    *   });
3572    * }
3573    *
3574    * _.mixin({ 'vowels': vowels });
3575    * _.vowels('fred');
3576    * // => ['e']
3577    *
3578    * _('fred').vowels().value();
3579    * // => ['e']
3580    *
3581    * _.mixin({ 'vowels': vowels }, { 'chain': false });
3582    * _('fred').vowels();
3583    * // => ['e']
3584    */
3585   function mixin(object, source, options) {
3586     var props = keys(source),
3587         methodNames = baseFunctions(source, props);
3588
3589     if (options == null &&
3590         !(isObject(source) && (methodNames.length || !props.length))) {
3591       options = source;
3592       source = object;
3593       object = this;
3594       methodNames = baseFunctions(source, keys(source));
3595     }
3596     var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
3597         isFunc = isFunction(object);
3598
3599     baseEach(methodNames, function(methodName) {
3600       var func = source[methodName];
3601       object[methodName] = func;
3602       if (isFunc) {
3603         object.prototype[methodName] = function() {
3604           var chainAll = this.__chain__;
3605           if (chain || chainAll) {
3606             var result = object(this.__wrapped__),
3607                 actions = result.__actions__ = copyArray(this.__actions__);
3608
3609             actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
3610             result.__chain__ = chainAll;
3611             return result;
3612           }
3613           return func.apply(object, arrayPush([this.value()], arguments));
3614         };
3615       }
3616     });
3617
3618     return object;
3619   }
3620
3621   /**
3622    * Reverts the `_` variable to its previous value and returns a reference to
3623    * the `lodash` function.
3624    *
3625    * @static
3626    * @since 0.1.0
3627    * @memberOf _
3628    * @category Util
3629    * @returns {Function} Returns the `lodash` function.
3630    * @example
3631    *
3632    * var lodash = _.noConflict();
3633    */
3634   function noConflict() {
3635     if (root._ === this) {
3636       root._ = oldDash;
3637     }
3638     return this;
3639   }
3640
3641   /**
3642    * This method returns `undefined`.
3643    *
3644    * @static
3645    * @memberOf _
3646    * @since 2.3.0
3647    * @category Util
3648    * @example
3649    *
3650    * _.times(2, _.noop);
3651    * // => [undefined, undefined]
3652    */
3653   function noop() {
3654     // No operation performed.
3655   }
3656
3657   /**
3658    * Generates a unique ID. If `prefix` is given, the ID is appended to it.
3659    *
3660    * @static
3661    * @since 0.1.0
3662    * @memberOf _
3663    * @category Util
3664    * @param {string} [prefix=''] The value to prefix the ID with.
3665    * @returns {string} Returns the unique ID.
3666    * @example
3667    *
3668    * _.uniqueId('contact_');
3669    * // => 'contact_104'
3670    *
3671    * _.uniqueId();
3672    * // => '105'
3673    */
3674   function uniqueId(prefix) {
3675     var id = ++idCounter;
3676     return toString(prefix) + id;
3677   }
3678
3679   /*------------------------------------------------------------------------*/
3680
3681   /**
3682    * Computes the maximum value of `array`. If `array` is empty or falsey,
3683    * `undefined` is returned.
3684    *
3685    * @static
3686    * @since 0.1.0
3687    * @memberOf _
3688    * @category Math
3689    * @param {Array} array The array to iterate over.
3690    * @returns {*} Returns the maximum value.
3691    * @example
3692    *
3693    * _.max([4, 2, 8, 6]);
3694    * // => 8
3695    *
3696    * _.max([]);
3697    * // => undefined
3698    */
3699   function max(array) {
3700     return (array && array.length)
3701       ? baseExtremum(array, identity, baseGt)
3702       : undefined;
3703   }
3704
3705   /**
3706    * Computes the minimum value of `array`. If `array` is empty or falsey,
3707    * `undefined` is returned.
3708    *
3709    * @static
3710    * @since 0.1.0
3711    * @memberOf _
3712    * @category Math
3713    * @param {Array} array The array to iterate over.
3714    * @returns {*} Returns the minimum value.
3715    * @example
3716    *
3717    * _.min([4, 2, 8, 6]);
3718    * // => 2
3719    *
3720    * _.min([]);
3721    * // => undefined
3722    */
3723   function min(array) {
3724     return (array && array.length)
3725       ? baseExtremum(array, identity, baseLt)
3726       : undefined;
3727   }
3728
3729   /*------------------------------------------------------------------------*/
3730
3731   // Add methods that return wrapped values in chain sequences.
3732   lodash.assignIn = assignIn;
3733   lodash.before = before;
3734   lodash.bind = bind;
3735   lodash.chain = chain;
3736   lodash.compact = compact;
3737   lodash.concat = concat;
3738   lodash.create = create;
3739   lodash.defaults = defaults;
3740   lodash.defer = defer;
3741   lodash.delay = delay;
3742   lodash.filter = filter;
3743   lodash.flatten = flatten;
3744   lodash.flattenDeep = flattenDeep;
3745   lodash.iteratee = iteratee;
3746   lodash.keys = keys;
3747   lodash.map = map;
3748   lodash.matches = matches;
3749   lodash.mixin = mixin;
3750   lodash.negate = negate;
3751   lodash.once = once;
3752   lodash.pick = pick;
3753   lodash.slice = slice;
3754   lodash.sortBy = sortBy;
3755   lodash.tap = tap;
3756   lodash.thru = thru;
3757   lodash.toArray = toArray;
3758   lodash.values = values;
3759
3760   // Add aliases.
3761   lodash.extend = assignIn;
3762
3763   // Add methods to `lodash.prototype`.
3764   mixin(lodash, lodash);
3765
3766   /*------------------------------------------------------------------------*/
3767
3768   // Add methods that return unwrapped values in chain sequences.
3769   lodash.clone = clone;
3770   lodash.escape = escape;
3771   lodash.every = every;
3772   lodash.find = find;
3773   lodash.forEach = forEach;
3774   lodash.has = has;
3775   lodash.head = head;
3776   lodash.identity = identity;
3777   lodash.indexOf = indexOf;
3778   lodash.isArguments = isArguments;
3779   lodash.isArray = isArray;
3780   lodash.isBoolean = isBoolean;
3781   lodash.isDate = isDate;
3782   lodash.isEmpty = isEmpty;
3783   lodash.isEqual = isEqual;
3784   lodash.isFinite = isFinite;
3785   lodash.isFunction = isFunction;
3786   lodash.isNaN = isNaN;
3787   lodash.isNull = isNull;
3788   lodash.isNumber = isNumber;
3789   lodash.isObject = isObject;
3790   lodash.isRegExp = isRegExp;
3791   lodash.isString = isString;
3792   lodash.isUndefined = isUndefined;
3793   lodash.last = last;
3794   lodash.max = max;
3795   lodash.min = min;
3796   lodash.noConflict = noConflict;
3797   lodash.noop = noop;
3798   lodash.reduce = reduce;
3799   lodash.result = result;
3800   lodash.size = size;
3801   lodash.some = some;
3802   lodash.uniqueId = uniqueId;
3803
3804   // Add aliases.
3805   lodash.each = forEach;
3806   lodash.first = head;
3807
3808   mixin(lodash, (function() {
3809     var source = {};
3810     baseForOwn(lodash, function(func, methodName) {
3811       if (!hasOwnProperty.call(lodash.prototype, methodName)) {
3812         source[methodName] = func;
3813       }
3814     });
3815     return source;
3816   }()), { 'chain': false });
3817
3818   /*------------------------------------------------------------------------*/
3819
3820   /**
3821    * The semantic version number.
3822    *
3823    * @static
3824    * @memberOf _
3825    * @type {string}
3826    */
3827   lodash.VERSION = VERSION;
3828
3829   // Add `Array` methods to `lodash.prototype`.
3830   baseEach(['pop', 'join', 'replace', 'reverse', 'split', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
3831     var func = (/^(?:replace|split)$/.test(methodName) ? String.prototype : arrayProto)[methodName],
3832         chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
3833         retUnwrapped = /^(?:pop|join|replace|shift)$/.test(methodName);
3834
3835     lodash.prototype[methodName] = function() {
3836       var args = arguments;
3837       if (retUnwrapped && !this.__chain__) {
3838         var value = this.value();
3839         return func.apply(isArray(value) ? value : [], args);
3840       }
3841       return this[chainName](function(value) {
3842         return func.apply(isArray(value) ? value : [], args);
3843       });
3844     };
3845   });
3846
3847   // Add chain sequence methods to the `lodash` wrapper.
3848   lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
3849
3850   /*--------------------------------------------------------------------------*/
3851
3852   // Some AMD build optimizers, like r.js, check for condition patterns like:
3853   if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
3854     // Expose Lodash on the global object to prevent errors when Lodash is
3855     // loaded by a script tag in the presence of an AMD loader.
3856     // See http://requirejs.org/docs/errors.html#mismatch for more details.
3857     // Use `_.noConflict` to remove Lodash from the global object.
3858     root._ = lodash;
3859
3860     // Define as an anonymous module so, through path mapping, it can be
3861     // referenced as the "underscore" module.
3862     define(function() {
3863       return lodash;
3864     });
3865   }
3866   // Check for `exports` after `define` in case a build optimizer adds it.
3867   else if (freeModule) {
3868     // Export for Node.js.
3869     (freeModule.exports = lodash)._ = lodash;
3870     // Export for CommonJS support.
3871     freeExports._ = lodash;
3872   }
3873   else {
3874     // Export to the global object.
3875     root._ = lodash;
3876   }
3877 }.call(this));