Passed
Branch master (8b6cf2)
by Pavel
01:44
created

node_modules/lodash/lodash.js   F

Complexity

Total Complexity 1744
Complexity/F 2.52

Size

Lines of Code 17201
Function Count 691

Duplication

Duplicated Lines 2509
Ratio 14.59 %

Importance

Changes 0
Metric Value
eloc 4709
dl 2509
loc 17201
rs 0.8
c 0
b 0
f 0
wmc 1744
mnd 1053
bc 1053
fnc 691
bpm 1.5238
cpm 2.5238
noi 364

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complexity

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like node_modules/lodash/lodash.js often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

1
/**
2
 * @license
3
 * Lodash <https://lodash.com/>
4
 * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
5
 * Released under MIT license <https://lodash.com/license>
6
 * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
7
 * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
8
 */
9
;(function() {
10
11
  /** Used as a safe reference for `undefined` in pre-ES5 environments. */
12
  var undefined;
13
14
  /** Used as the semantic version number. */
15
  var VERSION = '4.17.21';
16
17
  /** Used as the size to enable large array optimizations. */
18
  var LARGE_ARRAY_SIZE = 200;
19
20
  /** Error message constants. */
21
  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',
22
      FUNC_ERROR_TEXT = 'Expected a function',
23
      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';
24
25
  /** Used to stand-in for `undefined` hash values. */
26
  var HASH_UNDEFINED = '__lodash_hash_undefined__';
27
28
  /** Used as the maximum memoize cache size. */
29
  var MAX_MEMOIZE_SIZE = 500;
30
31
  /** Used as the internal argument placeholder. */
32
  var PLACEHOLDER = '__lodash_placeholder__';
33
34
  /** Used to compose bitmasks for cloning. */
35
  var CLONE_DEEP_FLAG = 1,
36
      CLONE_FLAT_FLAG = 2,
37
      CLONE_SYMBOLS_FLAG = 4;
38
39
  /** Used to compose bitmasks for value comparisons. */
40
  var COMPARE_PARTIAL_FLAG = 1,
41
      COMPARE_UNORDERED_FLAG = 2;
42
43
  /** Used to compose bitmasks for function metadata. */
44
  var WRAP_BIND_FLAG = 1,
45
      WRAP_BIND_KEY_FLAG = 2,
46
      WRAP_CURRY_BOUND_FLAG = 4,
47
      WRAP_CURRY_FLAG = 8,
48
      WRAP_CURRY_RIGHT_FLAG = 16,
49
      WRAP_PARTIAL_FLAG = 32,
50
      WRAP_PARTIAL_RIGHT_FLAG = 64,
51
      WRAP_ARY_FLAG = 128,
52
      WRAP_REARG_FLAG = 256,
53
      WRAP_FLIP_FLAG = 512;
54
55
  /** Used as default options for `_.truncate`. */
56
  var DEFAULT_TRUNC_LENGTH = 30,
57
      DEFAULT_TRUNC_OMISSION = '...';
58
59
  /** Used to detect hot functions by number of calls within a span of milliseconds. */
60
  var HOT_COUNT = 800,
61
      HOT_SPAN = 16;
62
63
  /** Used to indicate the type of lazy iteratees. */
64
  var LAZY_FILTER_FLAG = 1,
65
      LAZY_MAP_FLAG = 2,
66
      LAZY_WHILE_FLAG = 3;
67
68
  /** Used as references for various `Number` constants. */
69
  var INFINITY = 1 / 0,
70
      MAX_SAFE_INTEGER = 9007199254740991,
71
      MAX_INTEGER = 1.7976931348623157e+308,
72
      NAN = 0 / 0;
73
74
  /** Used as references for the maximum length and index of an array. */
75
  var MAX_ARRAY_LENGTH = 4294967295,
76
      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,
77
      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
78
79
  /** Used to associate wrap methods with their bit flags. */
80
  var wrapFlags = [
81
    ['ary', WRAP_ARY_FLAG],
82
    ['bind', WRAP_BIND_FLAG],
83
    ['bindKey', WRAP_BIND_KEY_FLAG],
84
    ['curry', WRAP_CURRY_FLAG],
85
    ['curryRight', WRAP_CURRY_RIGHT_FLAG],
86
    ['flip', WRAP_FLIP_FLAG],
87
    ['partial', WRAP_PARTIAL_FLAG],
88
    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
89
    ['rearg', WRAP_REARG_FLAG]
90
  ];
91
92
  /** `Object#toString` result references. */
93
  var argsTag = '[object Arguments]',
94
      arrayTag = '[object Array]',
95
      asyncTag = '[object AsyncFunction]',
96
      boolTag = '[object Boolean]',
97
      dateTag = '[object Date]',
98
      domExcTag = '[object DOMException]',
99
      errorTag = '[object Error]',
100
      funcTag = '[object Function]',
101
      genTag = '[object GeneratorFunction]',
102
      mapTag = '[object Map]',
103
      numberTag = '[object Number]',
104
      nullTag = '[object Null]',
105
      objectTag = '[object Object]',
106
      promiseTag = '[object Promise]',
107
      proxyTag = '[object Proxy]',
108
      regexpTag = '[object RegExp]',
109
      setTag = '[object Set]',
110
      stringTag = '[object String]',
111
      symbolTag = '[object Symbol]',
112
      undefinedTag = '[object Undefined]',
113
      weakMapTag = '[object WeakMap]',
114
      weakSetTag = '[object WeakSet]';
115
116
  var arrayBufferTag = '[object ArrayBuffer]',
117
      dataViewTag = '[object DataView]',
118
      float32Tag = '[object Float32Array]',
119
      float64Tag = '[object Float64Array]',
120
      int8Tag = '[object Int8Array]',
121
      int16Tag = '[object Int16Array]',
122
      int32Tag = '[object Int32Array]',
123
      uint8Tag = '[object Uint8Array]',
124
      uint8ClampedTag = '[object Uint8ClampedArray]',
125
      uint16Tag = '[object Uint16Array]',
126
      uint32Tag = '[object Uint32Array]';
127
128
  /** Used to match empty string literals in compiled template source. */
129
  var reEmptyStringLeading = /\b__p \+= '';/g,
130
      reEmptyStringMiddle = /\b(__p \+=) '' \+/g,
131
      reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
132
133
  /** Used to match HTML entities and HTML characters. */
134
  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,
135
      reUnescapedHtml = /[&<>"']/g,
136
      reHasEscapedHtml = RegExp(reEscapedHtml.source),
137
      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
138
139
  /** Used to match template delimiters. */
140
  var reEscape = /<%-([\s\S]+?)%>/g,
141
      reEvaluate = /<%([\s\S]+?)%>/g,
142
      reInterpolate = /<%=([\s\S]+?)%>/g;
143
144
  /** Used to match property names within property paths. */
145
  var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
146
      reIsPlainProp = /^\w*$/,
147
      rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
148
149
  /**
150
   * Used to match `RegExp`
151
   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).
152
   */
153
  var reRegExpChar = /[\\^$.*+?()[\]{}|]/g,
154
      reHasRegExpChar = RegExp(reRegExpChar.source);
155
156
  /** Used to match leading whitespace. */
157
  var reTrimStart = /^\s+/;
158
159
  /** Used to match a single whitespace character. */
160
  var reWhitespace = /\s/;
161
162
  /** Used to match wrap detail comments. */
163
  var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/,
164
      reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
165
      reSplitDetails = /,? & /;
166
167
  /** Used to match words composed of alphanumeric characters. */
168
  var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
169
170
  /**
171
   * Used to validate the `validate` option in `_.template` variable.
172
   *
173
   * Forbids characters which could potentially change the meaning of the function argument definition:
174
   * - "()," (modification of function parameters)
175
   * - "=" (default value)
176
   * - "[]{}" (destructuring of function parameters)
177
   * - "/" (beginning of a comment)
178
   * - whitespace
179
   */
180
  var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
181
182
  /** Used to match backslashes in property paths. */
183
  var reEscapeChar = /\\(\\)?/g;
184
185
  /**
186
   * Used to match
187
   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).
188
   */
189
  var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
190
191
  /** Used to match `RegExp` flags from their coerced string values. */
192
  var reFlags = /\w*$/;
193
194
  /** Used to detect bad signed hexadecimal string values. */
195
  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
196
197
  /** Used to detect binary string values. */
198
  var reIsBinary = /^0b[01]+$/i;
199
200
  /** Used to detect host constructors (Safari). */
201
  var reIsHostCtor = /^\[object .+?Constructor\]$/;
202
203
  /** Used to detect octal string values. */
204
  var reIsOctal = /^0o[0-7]+$/i;
205
206
  /** Used to detect unsigned integer values. */
207
  var reIsUint = /^(?:0|[1-9]\d*)$/;
208
209
  /** Used to match Latin Unicode letters (excluding mathematical operators). */
210
  var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
211
212
  /** Used to ensure capturing order of template delimiters. */
213
  var reNoMatch = /($^)/;
214
215
  /** Used to match unescaped characters in compiled string literals. */
216
  var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
217
218
  /** Used to compose unicode character classes. */
219
  var rsAstralRange = '\\ud800-\\udfff',
220
      rsComboMarksRange = '\\u0300-\\u036f',
221
      reComboHalfMarksRange = '\\ufe20-\\ufe2f',
222
      rsComboSymbolsRange = '\\u20d0-\\u20ff',
223
      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,
224
      rsDingbatRange = '\\u2700-\\u27bf',
225
      rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
226
      rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
227
      rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf',
228
      rsPunctuationRange = '\\u2000-\\u206f',
229
      rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000',
230
      rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde',
231
      rsVarRange = '\\ufe0e\\ufe0f',
232
      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
233
234
  /** Used to compose unicode capture groups. */
235
  var rsApos = "['\u2019]",
236
      rsAstral = '[' + rsAstralRange + ']',
237
      rsBreak = '[' + rsBreakRange + ']',
238
      rsCombo = '[' + rsComboRange + ']',
239
      rsDigits = '\\d+',
240
      rsDingbat = '[' + rsDingbatRange + ']',
241
      rsLower = '[' + rsLowerRange + ']',
242
      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
243
      rsFitz = '\\ud83c[\\udffb-\\udfff]',
244
      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
245
      rsNonAstral = '[^' + rsAstralRange + ']',
246
      rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
247
      rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
248
      rsUpper = '[' + rsUpperRange + ']',
249
      rsZWJ = '\\u200d';
250
251
  /** Used to compose unicode regexes. */
252
  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',
253
      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',
254
      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',
255
      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',
256
      reOptMod = rsModifier + '?',
257
      rsOptVar = '[' + rsVarRange + ']?',
258
      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',
259
      rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])',
260
      rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])',
261
      rsSeq = rsOptVar + reOptMod + rsOptJoin,
262
      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
263
      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
264
265
  /** Used to match apostrophes. */
266
  var reApos = RegExp(rsApos, 'g');
267
268
  /**
269
   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
270
   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
271
   */
272
  var reComboMark = RegExp(rsCombo, 'g');
273
274
  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
275
  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
276
277
  /** Used to match complex or compound words. */
278
  var reUnicodeWord = RegExp([
279
    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
280
    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',
281
    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,
282
    rsUpper + '+' + rsOptContrUpper,
283
    rsOrdUpper,
284
    rsOrdLower,
285
    rsDigits,
286
    rsEmoji
287
  ].join('|'), 'g');
288
289
  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
290
  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');
291
292
  /** Used to detect strings that need a more robust regexp to match words. */
293
  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
294
295
  /** Used to assign default `context` object properties. */
296
  var contextProps = [
297
    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',
298
    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
299
    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
300
    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',
301
    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
302
  ];
303
304
  /** Used to make template sourceURLs easier to identify. */
305
  var templateCounter = -1;
306
307
  /** Used to identify `toStringTag` values of typed arrays. */
308
  var typedArrayTags = {};
309
  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
310
  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
311
  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
312
  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
313
  typedArrayTags[uint32Tag] = true;
314
  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =
315
  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
316
  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
317
  typedArrayTags[errorTag] = typedArrayTags[funcTag] =
318
  typedArrayTags[mapTag] = typedArrayTags[numberTag] =
319
  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
320
  typedArrayTags[setTag] = typedArrayTags[stringTag] =
321
  typedArrayTags[weakMapTag] = false;
322
323
  /** Used to identify `toStringTag` values supported by `_.clone`. */
324
  var cloneableTags = {};
325
  cloneableTags[argsTag] = cloneableTags[arrayTag] =
326
  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =
327
  cloneableTags[boolTag] = cloneableTags[dateTag] =
328
  cloneableTags[float32Tag] = cloneableTags[float64Tag] =
329
  cloneableTags[int8Tag] = cloneableTags[int16Tag] =
330
  cloneableTags[int32Tag] = cloneableTags[mapTag] =
331
  cloneableTags[numberTag] = cloneableTags[objectTag] =
332
  cloneableTags[regexpTag] = cloneableTags[setTag] =
333
  cloneableTags[stringTag] = cloneableTags[symbolTag] =
334
  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =
335
  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
336
  cloneableTags[errorTag] = cloneableTags[funcTag] =
337
  cloneableTags[weakMapTag] = false;
338
339
  /** Used to map Latin Unicode letters to basic Latin letters. */
340
  var deburredLetters = {
341
    // Latin-1 Supplement block.
342
    '\xc0': 'A',  '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A',
343
    '\xe0': 'a',  '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a',
344
    '\xc7': 'C',  '\xe7': 'c',
345
    '\xd0': 'D',  '\xf0': 'd',
346
    '\xc8': 'E',  '\xc9': 'E', '\xca': 'E', '\xcb': 'E',
347
    '\xe8': 'e',  '\xe9': 'e', '\xea': 'e', '\xeb': 'e',
348
    '\xcc': 'I',  '\xcd': 'I', '\xce': 'I', '\xcf': 'I',
349
    '\xec': 'i',  '\xed': 'i', '\xee': 'i', '\xef': 'i',
350
    '\xd1': 'N',  '\xf1': 'n',
351
    '\xd2': 'O',  '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O',
352
    '\xf2': 'o',  '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o',
353
    '\xd9': 'U',  '\xda': 'U', '\xdb': 'U', '\xdc': 'U',
354
    '\xf9': 'u',  '\xfa': 'u', '\xfb': 'u', '\xfc': 'u',
355
    '\xdd': 'Y',  '\xfd': 'y', '\xff': 'y',
356
    '\xc6': 'Ae', '\xe6': 'ae',
357
    '\xde': 'Th', '\xfe': 'th',
358
    '\xdf': 'ss',
359
    // Latin Extended-A block.
360
    '\u0100': 'A',  '\u0102': 'A', '\u0104': 'A',
361
    '\u0101': 'a',  '\u0103': 'a', '\u0105': 'a',
362
    '\u0106': 'C',  '\u0108': 'C', '\u010a': 'C', '\u010c': 'C',
363
    '\u0107': 'c',  '\u0109': 'c', '\u010b': 'c', '\u010d': 'c',
364
    '\u010e': 'D',  '\u0110': 'D', '\u010f': 'd', '\u0111': 'd',
365
    '\u0112': 'E',  '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E',
366
    '\u0113': 'e',  '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e',
367
    '\u011c': 'G',  '\u011e': 'G', '\u0120': 'G', '\u0122': 'G',
368
    '\u011d': 'g',  '\u011f': 'g', '\u0121': 'g', '\u0123': 'g',
369
    '\u0124': 'H',  '\u0126': 'H', '\u0125': 'h', '\u0127': 'h',
370
    '\u0128': 'I',  '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I',
371
    '\u0129': 'i',  '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i',
372
    '\u0134': 'J',  '\u0135': 'j',
373
    '\u0136': 'K',  '\u0137': 'k', '\u0138': 'k',
374
    '\u0139': 'L',  '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L',
375
    '\u013a': 'l',  '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l',
376
    '\u0143': 'N',  '\u0145': 'N', '\u0147': 'N', '\u014a': 'N',
377
    '\u0144': 'n',  '\u0146': 'n', '\u0148': 'n', '\u014b': 'n',
378
    '\u014c': 'O',  '\u014e': 'O', '\u0150': 'O',
379
    '\u014d': 'o',  '\u014f': 'o', '\u0151': 'o',
380
    '\u0154': 'R',  '\u0156': 'R', '\u0158': 'R',
381
    '\u0155': 'r',  '\u0157': 'r', '\u0159': 'r',
382
    '\u015a': 'S',  '\u015c': 'S', '\u015e': 'S', '\u0160': 'S',
383
    '\u015b': 's',  '\u015d': 's', '\u015f': 's', '\u0161': 's',
384
    '\u0162': 'T',  '\u0164': 'T', '\u0166': 'T',
385
    '\u0163': 't',  '\u0165': 't', '\u0167': 't',
386
    '\u0168': 'U',  '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U',
387
    '\u0169': 'u',  '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u',
388
    '\u0174': 'W',  '\u0175': 'w',
389
    '\u0176': 'Y',  '\u0177': 'y', '\u0178': 'Y',
390
    '\u0179': 'Z',  '\u017b': 'Z', '\u017d': 'Z',
391
    '\u017a': 'z',  '\u017c': 'z', '\u017e': 'z',
392
    '\u0132': 'IJ', '\u0133': 'ij',
393
    '\u0152': 'Oe', '\u0153': 'oe',
394
    '\u0149': "'n", '\u017f': 's'
395
  };
396
397
  /** Used to map characters to HTML entities. */
398
  var htmlEscapes = {
399
    '&': '&amp;',
400
    '<': '&lt;',
401
    '>': '&gt;',
402
    '"': '&quot;',
403
    "'": '&#39;'
404
  };
405
406
  /** Used to map HTML entities to characters. */
407
  var htmlUnescapes = {
408
    '&amp;': '&',
409
    '&lt;': '<',
410
    '&gt;': '>',
411
    '&quot;': '"',
412
    '&#39;': "'"
413
  };
414
415
  /** Used to escape characters for inclusion in compiled string literals. */
416
  var stringEscapes = {
417
    '\\': '\\',
418
    "'": "'",
419
    '\n': 'n',
420
    '\r': 'r',
421
    '\u2028': 'u2028',
422
    '\u2029': 'u2029'
423
  };
424
425
  /** Built-in method references without a dependency on `root`. */
426
  var freeParseFloat = parseFloat,
427
      freeParseInt = parseInt;
428
429
  /** Detect free variable `global` from Node.js. */
430
  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
431
432
  /** Detect free variable `self`. */
433
  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
434
435
  /** Used as a reference to the global object. */
436
  var root = freeGlobal || freeSelf || Function('return this')();
437
438
  /** Detect free variable `exports`. */
439
  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;
440
441
  /** Detect free variable `module`. */
442
  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;
443
444
  /** Detect the popular CommonJS extension `module.exports`. */
445
  var moduleExports = freeModule && freeModule.exports === freeExports;
446
447
  /** Detect free variable `process` from Node.js. */
448
  var freeProcess = moduleExports && freeGlobal.process;
449
450
  /** Used to access faster Node.js helpers. */
451
  var nodeUtil = (function() {
452
    try {
453
      // Use `util.types` for Node.js 10+.
454
      var types = freeModule && freeModule.require && freeModule.require('util').types;
455
456
      if (types) {
457
        return types;
458
      }
459
460
      // Legacy `process.binding('util')` for Node.js < 10.
461
      return freeProcess && freeProcess.binding && freeProcess.binding('util');
462
    } catch (e) {}
463
  }());
464
465
  /* Node.js helper references. */
466
  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,
467
      nodeIsDate = nodeUtil && nodeUtil.isDate,
468
      nodeIsMap = nodeUtil && nodeUtil.isMap,
469
      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,
470
      nodeIsSet = nodeUtil && nodeUtil.isSet,
471
      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
472
473
  /*--------------------------------------------------------------------------*/
474
475
  /**
476
   * A faster alternative to `Function#apply`, this function invokes `func`
477
   * with the `this` binding of `thisArg` and the arguments of `args`.
478
   *
479
   * @private
480
   * @param {Function} func The function to invoke.
481
   * @param {*} thisArg The `this` binding of `func`.
482
   * @param {Array} args The arguments to invoke `func` with.
483
   * @returns {*} Returns the result of `func`.
484
   */
485
  function apply(func, thisArg, args) {
486
    switch (args.length) {
487
      case 0: return func.call(thisArg);
488
      case 1: return func.call(thisArg, args[0]);
489
      case 2: return func.call(thisArg, args[0], args[1]);
490
      case 3: return func.call(thisArg, args[0], args[1], args[2]);
491
    }
492
    return func.apply(thisArg, args);
493
  }
494
495
  /**
496
   * A specialized version of `baseAggregator` for arrays.
497
   *
498
   * @private
499
   * @param {Array} [array] The array to iterate over.
500
   * @param {Function} setter The function to set `accumulator` values.
501
   * @param {Function} iteratee The iteratee to transform keys.
502
   * @param {Object} accumulator The initial aggregated object.
503
   * @returns {Function} Returns `accumulator`.
504
   */
505
  function arrayAggregator(array, setter, iteratee, accumulator) {
506
    var index = -1,
507
        length = array == null ? 0 : array.length;
508
509
    while (++index < length) {
510
      var value = array[index];
511
      setter(accumulator, value, iteratee(value), array);
512
    }
513
    return accumulator;
514
  }
515
516
  /**
517
   * A specialized version of `_.forEach` for arrays without support for
518
   * iteratee shorthands.
519
   *
520
   * @private
521
   * @param {Array} [array] The array to iterate over.
522
   * @param {Function} iteratee The function invoked per iteration.
523
   * @returns {Array} Returns `array`.
524
   */
525
  function arrayEach(array, iteratee) {
526
    var index = -1,
527
        length = array == null ? 0 : array.length;
528
529
    while (++index < length) {
530
      if (iteratee(array[index], index, array) === false) {
531
        break;
532
      }
533
    }
534
    return array;
535
  }
536
537
  /**
538
   * A specialized version of `_.forEachRight` for arrays without support for
539
   * iteratee shorthands.
540
   *
541
   * @private
542
   * @param {Array} [array] The array to iterate over.
543
   * @param {Function} iteratee The function invoked per iteration.
544
   * @returns {Array} Returns `array`.
545
   */
546
  function arrayEachRight(array, iteratee) {
547
    var length = array == null ? 0 : array.length;
548
549
    while (length--) {
550
      if (iteratee(array[length], length, array) === false) {
551
        break;
552
      }
553
    }
554
    return array;
555
  }
556
557
  /**
558
   * A specialized version of `_.every` for arrays without support for
559
   * iteratee shorthands.
560
   *
561
   * @private
562
   * @param {Array} [array] The array to iterate over.
563
   * @param {Function} predicate The function invoked per iteration.
564
   * @returns {boolean} Returns `true` if all elements pass the predicate check,
565
   *  else `false`.
566
   */
567
  function arrayEvery(array, predicate) {
568
    var index = -1,
569
        length = array == null ? 0 : array.length;
570
571
    while (++index < length) {
572
      if (!predicate(array[index], index, array)) {
573
        return false;
574
      }
575
    }
576
    return true;
577
  }
578
579
  /**
580
   * A specialized version of `_.filter` for arrays without support for
581
   * iteratee shorthands.
582
   *
583
   * @private
584
   * @param {Array} [array] The array to iterate over.
585
   * @param {Function} predicate The function invoked per iteration.
586
   * @returns {Array} Returns the new filtered array.
587
   */
588
  function arrayFilter(array, predicate) {
589
    var index = -1,
590
        length = array == null ? 0 : array.length,
591
        resIndex = 0,
592
        result = [];
593
594
    while (++index < length) {
595
      var value = array[index];
596
      if (predicate(value, index, array)) {
597
        result[resIndex++] = value;
598
      }
599
    }
600
    return result;
601
  }
602
603
  /**
604
   * A specialized version of `_.includes` for arrays without support for
605
   * specifying an index to search from.
606
   *
607
   * @private
608
   * @param {Array} [array] The array to inspect.
609
   * @param {*} target The value to search for.
610
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
611
   */
612
  function arrayIncludes(array, value) {
613
    var length = array == null ? 0 : array.length;
614
    return !!length && baseIndexOf(array, value, 0) > -1;
615
  }
616
617
  /**
618
   * This function is like `arrayIncludes` except that it accepts a comparator.
619
   *
620
   * @private
621
   * @param {Array} [array] The array to inspect.
622
   * @param {*} target The value to search for.
623
   * @param {Function} comparator The comparator invoked per element.
624
   * @returns {boolean} Returns `true` if `target` is found, else `false`.
625
   */
626
  function arrayIncludesWith(array, value, comparator) {
627
    var index = -1,
628
        length = array == null ? 0 : array.length;
629
630
    while (++index < length) {
631
      if (comparator(value, array[index])) {
632
        return true;
633
      }
634
    }
635
    return false;
636
  }
637
638
  /**
639
   * A specialized version of `_.map` for arrays without support for iteratee
640
   * shorthands.
641
   *
642
   * @private
643
   * @param {Array} [array] The array to iterate over.
644
   * @param {Function} iteratee The function invoked per iteration.
645
   * @returns {Array} Returns the new mapped array.
646
   */
647
  function arrayMap(array, iteratee) {
648
    var index = -1,
649
        length = array == null ? 0 : array.length,
650
        result = Array(length);
651
652
    while (++index < length) {
653
      result[index] = iteratee(array[index], index, array);
654
    }
655
    return result;
656
  }
657
658
  /**
659
   * Appends the elements of `values` to `array`.
660
   *
661
   * @private
662
   * @param {Array} array The array to modify.
663
   * @param {Array} values The values to append.
664
   * @returns {Array} Returns `array`.
665
   */
666
  function arrayPush(array, values) {
667
    var index = -1,
668
        length = values.length,
669
        offset = array.length;
670
671
    while (++index < length) {
672
      array[offset + index] = values[index];
673
    }
674
    return array;
675
  }
676
677
  /**
678
   * A specialized version of `_.reduce` for arrays without support for
679
   * iteratee shorthands.
680
   *
681
   * @private
682
   * @param {Array} [array] The array to iterate over.
683
   * @param {Function} iteratee The function invoked per iteration.
684
   * @param {*} [accumulator] The initial value.
685
   * @param {boolean} [initAccum] Specify using the first element of `array` as
686
   *  the initial value.
687
   * @returns {*} Returns the accumulated value.
688
   */
689
  function arrayReduce(array, iteratee, accumulator, initAccum) {
690
    var index = -1,
691
        length = array == null ? 0 : array.length;
692
693
    if (initAccum && length) {
694
      accumulator = array[++index];
695
    }
696
    while (++index < length) {
697
      accumulator = iteratee(accumulator, array[index], index, array);
698
    }
699
    return accumulator;
700
  }
701
702
  /**
703
   * A specialized version of `_.reduceRight` for arrays without support for
704
   * iteratee shorthands.
705
   *
706
   * @private
707
   * @param {Array} [array] The array to iterate over.
708
   * @param {Function} iteratee The function invoked per iteration.
709
   * @param {*} [accumulator] The initial value.
710
   * @param {boolean} [initAccum] Specify using the last element of `array` as
711
   *  the initial value.
712
   * @returns {*} Returns the accumulated value.
713
   */
714
  function arrayReduceRight(array, iteratee, accumulator, initAccum) {
715
    var length = array == null ? 0 : array.length;
716
    if (initAccum && length) {
717
      accumulator = array[--length];
718
    }
719
    while (length--) {
720
      accumulator = iteratee(accumulator, array[length], length, array);
721
    }
722
    return accumulator;
723
  }
724
725
  /**
726
   * A specialized version of `_.some` for arrays without support for iteratee
727
   * shorthands.
728
   *
729
   * @private
730
   * @param {Array} [array] The array to iterate over.
731
   * @param {Function} predicate The function invoked per iteration.
732
   * @returns {boolean} Returns `true` if any element passes the predicate check,
733
   *  else `false`.
734
   */
735
  function arraySome(array, predicate) {
736
    var index = -1,
737
        length = array == null ? 0 : array.length;
738
739
    while (++index < length) {
740
      if (predicate(array[index], index, array)) {
741
        return true;
742
      }
743
    }
744
    return false;
745
  }
746
747
  /**
748
   * Gets the size of an ASCII `string`.
749
   *
750
   * @private
751
   * @param {string} string The string inspect.
752
   * @returns {number} Returns the string size.
753
   */
754
  var asciiSize = baseProperty('length');
755
756
  /**
757
   * Converts an ASCII `string` to an array.
758
   *
759
   * @private
760
   * @param {string} string The string to convert.
761
   * @returns {Array} Returns the converted array.
762
   */
763
  function asciiToArray(string) {
764
    return string.split('');
765
  }
766
767
  /**
768
   * Splits an ASCII `string` into an array of its words.
769
   *
770
   * @private
771
   * @param {string} The string to inspect.
772
   * @returns {Array} Returns the words of `string`.
773
   */
774
  function asciiWords(string) {
775
    return string.match(reAsciiWord) || [];
776
  }
777
778
  /**
779
   * The base implementation of methods like `_.findKey` and `_.findLastKey`,
780
   * without support for iteratee shorthands, which iterates over `collection`
781
   * using `eachFunc`.
782
   *
783
   * @private
784
   * @param {Array|Object} collection The collection to inspect.
785
   * @param {Function} predicate The function invoked per iteration.
786
   * @param {Function} eachFunc The function to iterate over `collection`.
787
   * @returns {*} Returns the found element or its key, else `undefined`.
788
   */
789
  function baseFindKey(collection, predicate, eachFunc) {
790
    var result;
791
    eachFunc(collection, function(value, key, collection) {
792
      if (predicate(value, key, collection)) {
793
        result = key;
794
        return false;
795
      }
796
    });
797
    return result;
798
  }
799
800
  /**
801
   * The base implementation of `_.findIndex` and `_.findLastIndex` without
802
   * support for iteratee shorthands.
803
   *
804
   * @private
805
   * @param {Array} array The array to inspect.
806
   * @param {Function} predicate The function invoked per iteration.
807
   * @param {number} fromIndex The index to search from.
808
   * @param {boolean} [fromRight] Specify iterating from right to left.
809
   * @returns {number} Returns the index of the matched value, else `-1`.
810
   */
811
  function baseFindIndex(array, predicate, fromIndex, fromRight) {
812
    var length = array.length,
813
        index = fromIndex + (fromRight ? 1 : -1);
814
815
    while ((fromRight ? index-- : ++index < length)) {
816
      if (predicate(array[index], index, array)) {
817
        return index;
818
      }
819
    }
820
    return -1;
821
  }
822
823
  /**
824
   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
825
   *
826
   * @private
827
   * @param {Array} array The array to inspect.
828
   * @param {*} value The value to search for.
829
   * @param {number} fromIndex The index to search from.
830
   * @returns {number} Returns the index of the matched value, else `-1`.
831
   */
832
  function baseIndexOf(array, value, fromIndex) {
833
    return value === value
834
      ? strictIndexOf(array, value, fromIndex)
835
      : baseFindIndex(array, baseIsNaN, fromIndex);
836
  }
837
838
  /**
839
   * This function is like `baseIndexOf` except that it accepts a comparator.
840
   *
841
   * @private
842
   * @param {Array} array The array to inspect.
843
   * @param {*} value The value to search for.
844
   * @param {number} fromIndex The index to search from.
845
   * @param {Function} comparator The comparator invoked per element.
846
   * @returns {number} Returns the index of the matched value, else `-1`.
847
   */
848
  function baseIndexOfWith(array, value, fromIndex, comparator) {
849
    var index = fromIndex - 1,
850
        length = array.length;
851
852
    while (++index < length) {
853
      if (comparator(array[index], value)) {
854
        return index;
855
      }
856
    }
857
    return -1;
858
  }
859
860
  /**
861
   * The base implementation of `_.isNaN` without support for number objects.
862
   *
863
   * @private
864
   * @param {*} value The value to check.
865
   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
866
   */
867
  function baseIsNaN(value) {
868
    return value !== value;
869
  }
870
871
  /**
872
   * The base implementation of `_.mean` and `_.meanBy` without support for
873
   * iteratee shorthands.
874
   *
875
   * @private
876
   * @param {Array} array The array to iterate over.
877
   * @param {Function} iteratee The function invoked per iteration.
878
   * @returns {number} Returns the mean.
879
   */
880
  function baseMean(array, iteratee) {
881
    var length = array == null ? 0 : array.length;
882
    return length ? (baseSum(array, iteratee) / length) : NAN;
883
  }
884
885
  /**
886
   * The base implementation of `_.property` without support for deep paths.
887
   *
888
   * @private
889
   * @param {string} key The key of the property to get.
890
   * @returns {Function} Returns the new accessor function.
891
   */
892
  function baseProperty(key) {
893
    return function(object) {
894
      return object == null ? undefined : object[key];
895
    };
896
  }
897
898
  /**
899
   * The base implementation of `_.propertyOf` without support for deep paths.
900
   *
901
   * @private
902
   * @param {Object} object The object to query.
903
   * @returns {Function} Returns the new accessor function.
904
   */
905
  function basePropertyOf(object) {
906
    return function(key) {
907
      return object == null ? undefined : object[key];
908
    };
909
  }
910
911
  /**
912
   * The base implementation of `_.reduce` and `_.reduceRight`, without support
913
   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
914
   *
915
   * @private
916
   * @param {Array|Object} collection The collection to iterate over.
917
   * @param {Function} iteratee The function invoked per iteration.
918
   * @param {*} accumulator The initial value.
919
   * @param {boolean} initAccum Specify using the first or last element of
920
   *  `collection` as the initial value.
921
   * @param {Function} eachFunc The function to iterate over `collection`.
922
   * @returns {*} Returns the accumulated value.
923
   */
924
  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
925
    eachFunc(collection, function(value, index, collection) {
926
      accumulator = initAccum
927
        ? (initAccum = false, value)
928
        : iteratee(accumulator, value, index, collection);
929
    });
930
    return accumulator;
931
  }
932
933
  /**
934
   * The base implementation of `_.sortBy` which uses `comparer` to define the
935
   * sort order of `array` and replaces criteria objects with their corresponding
936
   * values.
937
   *
938
   * @private
939
   * @param {Array} array The array to sort.
940
   * @param {Function} comparer The function to define sort order.
941
   * @returns {Array} Returns `array`.
942
   */
943
  function baseSortBy(array, comparer) {
944
    var length = array.length;
945
946
    array.sort(comparer);
947
    while (length--) {
948
      array[length] = array[length].value;
949
    }
950
    return array;
951
  }
952
953
  /**
954
   * The base implementation of `_.sum` and `_.sumBy` without support for
955
   * iteratee shorthands.
956
   *
957
   * @private
958
   * @param {Array} array The array to iterate over.
959
   * @param {Function} iteratee The function invoked per iteration.
960
   * @returns {number} Returns the sum.
961
   */
962
  function baseSum(array, iteratee) {
963
    var result,
964
        index = -1,
965
        length = array.length;
966
967
    while (++index < length) {
968
      var current = iteratee(array[index]);
969
      if (current !== undefined) {
970
        result = result === undefined ? current : (result + current);
971
      }
972
    }
973
    return result;
974
  }
975
976
  /**
977
   * The base implementation of `_.times` without support for iteratee shorthands
978
   * or max array length checks.
979
   *
980
   * @private
981
   * @param {number} n The number of times to invoke `iteratee`.
982
   * @param {Function} iteratee The function invoked per iteration.
983
   * @returns {Array} Returns the array of results.
984
   */
985
  function baseTimes(n, iteratee) {
986
    var index = -1,
987
        result = Array(n);
988
989
    while (++index < n) {
990
      result[index] = iteratee(index);
991
    }
992
    return result;
993
  }
994
995
  /**
996
   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
997
   * of key-value pairs for `object` corresponding to the property names of `props`.
998
   *
999
   * @private
1000
   * @param {Object} object The object to query.
1001
   * @param {Array} props The property names to get values for.
1002
   * @returns {Object} Returns the key-value pairs.
1003
   */
1004
  function baseToPairs(object, props) {
1005
    return arrayMap(props, function(key) {
1006
      return [key, object[key]];
1007
    });
1008
  }
1009
1010
  /**
1011
   * The base implementation of `_.trim`.
1012
   *
1013
   * @private
1014
   * @param {string} string The string to trim.
1015
   * @returns {string} Returns the trimmed string.
1016
   */
1017
  function baseTrim(string) {
1018
    return string
1019
      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')
1020
      : string;
1021
  }
1022
1023
  /**
1024
   * The base implementation of `_.unary` without support for storing metadata.
1025
   *
1026
   * @private
1027
   * @param {Function} func The function to cap arguments for.
1028
   * @returns {Function} Returns the new capped function.
1029
   */
1030
  function baseUnary(func) {
1031
    return function(value) {
1032
      return func(value);
1033
    };
1034
  }
1035
1036
  /**
1037
   * The base implementation of `_.values` and `_.valuesIn` which creates an
1038
   * array of `object` property values corresponding to the property names
1039
   * of `props`.
1040
   *
1041
   * @private
1042
   * @param {Object} object The object to query.
1043
   * @param {Array} props The property names to get values for.
1044
   * @returns {Object} Returns the array of property values.
1045
   */
1046
  function baseValues(object, props) {
1047
    return arrayMap(props, function(key) {
1048
      return object[key];
1049
    });
1050
  }
1051
1052
  /**
1053
   * Checks if a `cache` value for `key` exists.
1054
   *
1055
   * @private
1056
   * @param {Object} cache The cache to query.
1057
   * @param {string} key The key of the entry to check.
1058
   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
1059
   */
1060
  function cacheHas(cache, key) {
1061
    return cache.has(key);
1062
  }
1063
1064
  /**
1065
   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol
1066
   * that is not found in the character symbols.
1067
   *
1068
   * @private
1069
   * @param {Array} strSymbols The string symbols to inspect.
1070
   * @param {Array} chrSymbols The character symbols to find.
1071
   * @returns {number} Returns the index of the first unmatched string symbol.
1072
   */
1073
  function charsStartIndex(strSymbols, chrSymbols) {
1074
    var index = -1,
1075
        length = strSymbols.length;
1076
1077
    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1078
    return index;
1079
  }
1080
1081
  /**
1082
   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol
1083
   * that is not found in the character symbols.
1084
   *
1085
   * @private
1086
   * @param {Array} strSymbols The string symbols to inspect.
1087
   * @param {Array} chrSymbols The character symbols to find.
1088
   * @returns {number} Returns the index of the last unmatched string symbol.
1089
   */
1090
  function charsEndIndex(strSymbols, chrSymbols) {
1091
    var index = strSymbols.length;
1092
1093
    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}
1094
    return index;
1095
  }
1096
1097
  /**
1098
   * Gets the number of `placeholder` occurrences in `array`.
1099
   *
1100
   * @private
1101
   * @param {Array} array The array to inspect.
1102
   * @param {*} placeholder The placeholder to search for.
1103
   * @returns {number} Returns the placeholder count.
1104
   */
1105
  function countHolders(array, placeholder) {
1106
    var length = array.length,
1107
        result = 0;
1108
1109
    while (length--) {
1110
      if (array[length] === placeholder) {
1111
        ++result;
1112
      }
1113
    }
1114
    return result;
1115
  }
1116
1117
  /**
1118
   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A
1119
   * letters to basic Latin letters.
1120
   *
1121
   * @private
1122
   * @param {string} letter The matched letter to deburr.
1123
   * @returns {string} Returns the deburred letter.
1124
   */
1125
  var deburrLetter = basePropertyOf(deburredLetters);
1126
1127
  /**
1128
   * Used by `_.escape` to convert characters to HTML entities.
1129
   *
1130
   * @private
1131
   * @param {string} chr The matched character to escape.
1132
   * @returns {string} Returns the escaped character.
1133
   */
1134
  var escapeHtmlChar = basePropertyOf(htmlEscapes);
1135
1136
  /**
1137
   * Used by `_.template` to escape characters for inclusion in compiled string literals.
1138
   *
1139
   * @private
1140
   * @param {string} chr The matched character to escape.
1141
   * @returns {string} Returns the escaped character.
1142
   */
1143
  function escapeStringChar(chr) {
1144
    return '\\' + stringEscapes[chr];
1145
  }
1146
1147
  /**
1148
   * Gets the value at `key` of `object`.
1149
   *
1150
   * @private
1151
   * @param {Object} [object] The object to query.
1152
   * @param {string} key The key of the property to get.
1153
   * @returns {*} Returns the property value.
1154
   */
1155
  function getValue(object, key) {
1156
    return object == null ? undefined : object[key];
1157
  }
1158
1159
  /**
1160
   * Checks if `string` contains Unicode symbols.
1161
   *
1162
   * @private
1163
   * @param {string} string The string to inspect.
1164
   * @returns {boolean} Returns `true` if a symbol is found, else `false`.
1165
   */
1166
  function hasUnicode(string) {
1167
    return reHasUnicode.test(string);
1168
  }
1169
1170
  /**
1171
   * Checks if `string` contains a word composed of Unicode symbols.
1172
   *
1173
   * @private
1174
   * @param {string} string The string to inspect.
1175
   * @returns {boolean} Returns `true` if a word is found, else `false`.
1176
   */
1177
  function hasUnicodeWord(string) {
1178
    return reHasUnicodeWord.test(string);
1179
  }
1180
1181
  /**
1182
   * Converts `iterator` to an array.
1183
   *
1184
   * @private
1185
   * @param {Object} iterator The iterator to convert.
1186
   * @returns {Array} Returns the converted array.
1187
   */
1188
  function iteratorToArray(iterator) {
1189
    var data,
1190
        result = [];
1191
1192
    while (!(data = iterator.next()).done) {
1193
      result.push(data.value);
1194
    }
1195
    return result;
1196
  }
1197
1198
  /**
1199
   * Converts `map` to its key-value pairs.
1200
   *
1201
   * @private
1202
   * @param {Object} map The map to convert.
1203
   * @returns {Array} Returns the key-value pairs.
1204
   */
1205
  function mapToArray(map) {
1206
    var index = -1,
1207
        result = Array(map.size);
1208
1209
    map.forEach(function(value, key) {
1210
      result[++index] = [key, value];
1211
    });
1212
    return result;
1213
  }
1214
1215
  /**
1216
   * Creates a unary function that invokes `func` with its argument transformed.
1217
   *
1218
   * @private
1219
   * @param {Function} func The function to wrap.
1220
   * @param {Function} transform The argument transform.
1221
   * @returns {Function} Returns the new function.
1222
   */
1223
  function overArg(func, transform) {
1224
    return function(arg) {
1225
      return func(transform(arg));
1226
    };
1227
  }
1228
1229
  /**
1230
   * Replaces all `placeholder` elements in `array` with an internal placeholder
1231
   * and returns an array of their indexes.
1232
   *
1233
   * @private
1234
   * @param {Array} array The array to modify.
1235
   * @param {*} placeholder The placeholder to replace.
1236
   * @returns {Array} Returns the new array of placeholder indexes.
1237
   */
1238
  function replaceHolders(array, placeholder) {
1239
    var index = -1,
1240
        length = array.length,
1241
        resIndex = 0,
1242
        result = [];
1243
1244
    while (++index < length) {
1245
      var value = array[index];
1246
      if (value === placeholder || value === PLACEHOLDER) {
1247
        array[index] = PLACEHOLDER;
1248
        result[resIndex++] = index;
1249
      }
1250
    }
1251
    return result;
1252
  }
1253
1254
  /**
1255
   * Converts `set` to an array of its values.
1256
   *
1257
   * @private
1258
   * @param {Object} set The set to convert.
1259
   * @returns {Array} Returns the values.
1260
   */
1261
  function setToArray(set) {
1262
    var index = -1,
1263
        result = Array(set.size);
1264
1265
    set.forEach(function(value) {
1266
      result[++index] = value;
1267
    });
1268
    return result;
1269
  }
1270
1271
  /**
1272
   * Converts `set` to its value-value pairs.
1273
   *
1274
   * @private
1275
   * @param {Object} set The set to convert.
1276
   * @returns {Array} Returns the value-value pairs.
1277
   */
1278
  function setToPairs(set) {
1279
    var index = -1,
1280
        result = Array(set.size);
1281
1282
    set.forEach(function(value) {
1283
      result[++index] = [value, value];
1284
    });
1285
    return result;
1286
  }
1287
1288
  /**
1289
   * A specialized version of `_.indexOf` which performs strict equality
1290
   * comparisons of values, i.e. `===`.
1291
   *
1292
   * @private
1293
   * @param {Array} array The array to inspect.
1294
   * @param {*} value The value to search for.
1295
   * @param {number} fromIndex The index to search from.
1296
   * @returns {number} Returns the index of the matched value, else `-1`.
1297
   */
1298
  function strictIndexOf(array, value, fromIndex) {
1299
    var index = fromIndex - 1,
1300
        length = array.length;
1301
1302
    while (++index < length) {
1303
      if (array[index] === value) {
1304
        return index;
1305
      }
1306
    }
1307
    return -1;
1308
  }
1309
1310
  /**
1311
   * A specialized version of `_.lastIndexOf` which performs strict equality
1312
   * comparisons of values, i.e. `===`.
1313
   *
1314
   * @private
1315
   * @param {Array} array The array to inspect.
1316
   * @param {*} value The value to search for.
1317
   * @param {number} fromIndex The index to search from.
1318
   * @returns {number} Returns the index of the matched value, else `-1`.
1319
   */
1320
  function strictLastIndexOf(array, value, fromIndex) {
1321
    var index = fromIndex + 1;
1322
    while (index--) {
1323
      if (array[index] === value) {
1324
        return index;
1325
      }
1326
    }
1327
    return index;
1328
  }
1329
1330
  /**
1331
   * Gets the number of symbols in `string`.
1332
   *
1333
   * @private
1334
   * @param {string} string The string to inspect.
1335
   * @returns {number} Returns the string size.
1336
   */
1337
  function stringSize(string) {
1338
    return hasUnicode(string)
1339
      ? unicodeSize(string)
1340
      : asciiSize(string);
1341
  }
1342
1343
  /**
1344
   * Converts `string` to an array.
1345
   *
1346
   * @private
1347
   * @param {string} string The string to convert.
1348
   * @returns {Array} Returns the converted array.
1349
   */
1350
  function stringToArray(string) {
1351
    return hasUnicode(string)
1352
      ? unicodeToArray(string)
1353
      : asciiToArray(string);
1354
  }
1355
1356
  /**
1357
   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace
1358
   * character of `string`.
1359
   *
1360
   * @private
1361
   * @param {string} string The string to inspect.
1362
   * @returns {number} Returns the index of the last non-whitespace character.
1363
   */
1364
  function trimmedEndIndex(string) {
1365
    var index = string.length;
1366
1367
    while (index-- && reWhitespace.test(string.charAt(index))) {}
1368
    return index;
1369
  }
1370
1371
  /**
1372
   * Used by `_.unescape` to convert HTML entities to characters.
1373
   *
1374
   * @private
1375
   * @param {string} chr The matched character to unescape.
1376
   * @returns {string} Returns the unescaped character.
1377
   */
1378
  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
1379
1380
  /**
1381
   * Gets the size of a Unicode `string`.
1382
   *
1383
   * @private
1384
   * @param {string} string The string inspect.
1385
   * @returns {number} Returns the string size.
1386
   */
1387
  function unicodeSize(string) {
1388
    var result = reUnicode.lastIndex = 0;
1389
    while (reUnicode.test(string)) {
1390
      ++result;
1391
    }
1392
    return result;
1393
  }
1394
1395
  /**
1396
   * Converts a Unicode `string` to an array.
1397
   *
1398
   * @private
1399
   * @param {string} string The string to convert.
1400
   * @returns {Array} Returns the converted array.
1401
   */
1402
  function unicodeToArray(string) {
1403
    return string.match(reUnicode) || [];
1404
  }
1405
1406
  /**
1407
   * Splits a Unicode `string` into an array of its words.
1408
   *
1409
   * @private
1410
   * @param {string} The string to inspect.
1411
   * @returns {Array} Returns the words of `string`.
1412
   */
1413
  function unicodeWords(string) {
1414
    return string.match(reUnicodeWord) || [];
1415
  }
1416
1417
  /*--------------------------------------------------------------------------*/
1418
1419
  /**
1420
   * Create a new pristine `lodash` function using the `context` object.
1421
   *
1422
   * @static
1423
   * @memberOf _
1424
   * @since 1.1.0
1425
   * @category Util
1426
   * @param {Object} [context=root] The context object.
1427
   * @returns {Function} Returns a new `lodash` function.
1428
   * @example
1429
   *
1430
   * _.mixin({ 'foo': _.constant('foo') });
1431
   *
1432
   * var lodash = _.runInContext();
1433
   * lodash.mixin({ 'bar': lodash.constant('bar') });
1434
   *
1435
   * _.isFunction(_.foo);
1436
   * // => true
1437
   * _.isFunction(_.bar);
1438
   * // => false
1439
   *
1440
   * lodash.isFunction(lodash.foo);
1441
   * // => false
1442
   * lodash.isFunction(lodash.bar);
1443
   * // => true
1444
   *
1445
   * // Create a suped-up `defer` in Node.js.
1446
   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
1447
   */
1448
  var runInContext = (function runInContext(context) {
1449
    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));
1450
1451
    /** Built-in constructor references. */
1452
    var Array = context.Array,
1453
        Date = context.Date,
1454
        Error = context.Error,
1455
        Function = context.Function,
1456
        Math = context.Math,
1457
        Object = context.Object,
1458
        RegExp = context.RegExp,
1459
        String = context.String,
1460
        TypeError = context.TypeError;
1461
1462
    /** Used for built-in method references. */
1463
    var arrayProto = Array.prototype,
1464
        funcProto = Function.prototype,
1465
        objectProto = Object.prototype;
1466
1467
    /** Used to detect overreaching core-js shims. */
1468
    var coreJsData = context['__core-js_shared__'];
1469
1470
    /** Used to resolve the decompiled source of functions. */
1471
    var funcToString = funcProto.toString;
1472
1473
    /** Used to check objects for own properties. */
1474
    var hasOwnProperty = objectProto.hasOwnProperty;
1475
1476
    /** Used to generate unique IDs. */
1477
    var idCounter = 0;
1478
1479
    /** Used to detect methods masquerading as native. */
1480
    var maskSrcKey = (function() {
1481
      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');
1482
      return uid ? ('Symbol(src)_1.' + uid) : '';
1483
    }());
1484
1485
    /**
1486
     * Used to resolve the
1487
     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
1488
     * of values.
1489
     */
1490
    var nativeObjectToString = objectProto.toString;
1491
1492
    /** Used to infer the `Object` constructor. */
1493
    var objectCtorString = funcToString.call(Object);
1494
1495
    /** Used to restore the original `_` reference in `_.noConflict`. */
1496
    var oldDash = root._;
1497
1498
    /** Used to detect if a method is native. */
1499
    var reIsNative = RegExp('^' +
1500
      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
1501
      .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
1502
    );
1503
1504
    /** Built-in value references. */
1505
    var Buffer = moduleExports ? context.Buffer : undefined,
1506
        Symbol = context.Symbol,
1507
        Uint8Array = context.Uint8Array,
1508
        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,
1509
        getPrototype = overArg(Object.getPrototypeOf, Object),
1510
        objectCreate = Object.create,
1511
        propertyIsEnumerable = objectProto.propertyIsEnumerable,
1512
        splice = arrayProto.splice,
1513
        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,
1514
        symIterator = Symbol ? Symbol.iterator : undefined,
1515
        symToStringTag = Symbol ? Symbol.toStringTag : undefined;
1516
1517
    var defineProperty = (function() {
1518
      try {
1519
        var func = getNative(Object, 'defineProperty');
1520
        func({}, '', {});
1521
        return func;
1522
      } catch (e) {}
1523
    }());
1524
1525
    /** Mocked built-ins. */
1526
    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,
1527
        ctxNow = Date && Date.now !== root.Date.now && Date.now,
1528
        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
1529
1530
    /* Built-in method references for those with the same name as other `lodash` methods. */
1531
    var nativeCeil = Math.ceil,
1532
        nativeFloor = Math.floor,
1533
        nativeGetSymbols = Object.getOwnPropertySymbols,
1534
        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,
1535
        nativeIsFinite = context.isFinite,
1536
        nativeJoin = arrayProto.join,
1537
        nativeKeys = overArg(Object.keys, Object),
1538
        nativeMax = Math.max,
1539
        nativeMin = Math.min,
1540
        nativeNow = Date.now,
1541
        nativeParseInt = context.parseInt,
1542
        nativeRandom = Math.random,
1543
        nativeReverse = arrayProto.reverse;
1544
1545
    /* Built-in method references that are verified to be native. */
1546
    var DataView = getNative(context, 'DataView'),
1547
        Map = getNative(context, 'Map'),
1548
        Promise = getNative(context, 'Promise'),
1549
        Set = getNative(context, 'Set'),
1550
        WeakMap = getNative(context, 'WeakMap'),
1551
        nativeCreate = getNative(Object, 'create');
1552
1553
    /** Used to store function metadata. */
1554
    var metaMap = WeakMap && new WeakMap;
1555
1556
    /** Used to lookup unminified function names. */
1557
    var realNames = {};
1558
1559
    /** Used to detect maps, sets, and weakmaps. */
1560
    var dataViewCtorString = toSource(DataView),
1561
        mapCtorString = toSource(Map),
1562
        promiseCtorString = toSource(Promise),
1563
        setCtorString = toSource(Set),
1564
        weakMapCtorString = toSource(WeakMap);
1565
1566
    /** Used to convert symbols to primitives and strings. */
1567
    var symbolProto = Symbol ? Symbol.prototype : undefined,
1568
        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,
1569
        symbolToString = symbolProto ? symbolProto.toString : undefined;
1570
1571
    /*------------------------------------------------------------------------*/
1572
1573
    /**
1574
     * Creates a `lodash` object which wraps `value` to enable implicit method
1575
     * chain sequences. Methods that operate on and return arrays, collections,
1576
     * and functions can be chained together. Methods that retrieve a single value
1577
     * or may return a primitive value will automatically end the chain sequence
1578
     * and return the unwrapped value. Otherwise, the value must be unwrapped
1579
     * with `_#value`.
1580
     *
1581
     * Explicit chain sequences, which must be unwrapped with `_#value`, may be
1582
     * enabled using `_.chain`.
1583
     *
1584
     * The execution of chained methods is lazy, that is, it's deferred until
1585
     * `_#value` is implicitly or explicitly called.
1586
     *
1587
     * Lazy evaluation allows several methods to support shortcut fusion.
1588
     * Shortcut fusion is an optimization to merge iteratee calls; this avoids
1589
     * the creation of intermediate arrays and can greatly reduce the number of
1590
     * iteratee executions. Sections of a chain sequence qualify for shortcut
1591
     * fusion if the section is applied to an array and iteratees accept only
1592
     * one argument. The heuristic for whether a section qualifies for shortcut
1593
     * fusion is subject to change.
1594
     *
1595
     * Chaining is supported in custom builds as long as the `_#value` method is
1596
     * directly or indirectly included in the build.
1597
     *
1598
     * In addition to lodash methods, wrappers have `Array` and `String` methods.
1599
     *
1600
     * The wrapper `Array` methods are:
1601
     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
1602
     *
1603
     * The wrapper `String` methods are:
1604
     * `replace` and `split`
1605
     *
1606
     * The wrapper methods that support shortcut fusion are:
1607
     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
1608
     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
1609
     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
1610
     *
1611
     * The chainable wrapper methods are:
1612
     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
1613
     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
1614
     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
1615
     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
1616
     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
1617
     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
1618
     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
1619
     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
1620
     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
1621
     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
1622
     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
1623
     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
1624
     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
1625
     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
1626
     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
1627
     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
1628
     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
1629
     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
1630
     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
1631
     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
1632
     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
1633
     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
1634
     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
1635
     * `zipObject`, `zipObjectDeep`, and `zipWith`
1636
     *
1637
     * The wrapper methods that are **not** chainable by default are:
1638
     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
1639
     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
1640
     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
1641
     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
1642
     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
1643
     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
1644
     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
1645
     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
1646
     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
1647
     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
1648
     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
1649
     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
1650
     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
1651
     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
1652
     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
1653
     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
1654
     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
1655
     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
1656
     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
1657
     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
1658
     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
1659
     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
1660
     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
1661
     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
1662
     * `upperFirst`, `value`, and `words`
1663
     *
1664
     * @name _
1665
     * @constructor
1666
     * @category Seq
1667
     * @param {*} value The value to wrap in a `lodash` instance.
1668
     * @returns {Object} Returns the new `lodash` wrapper instance.
1669
     * @example
1670
     *
1671
     * function square(n) {
1672
     *   return n * n;
1673
     * }
1674
     *
1675
     * var wrapped = _([1, 2, 3]);
1676
     *
1677
     * // Returns an unwrapped value.
1678
     * wrapped.reduce(_.add);
1679
     * // => 6
1680
     *
1681
     * // Returns a wrapped value.
1682
     * var squares = wrapped.map(square);
1683
     *
1684
     * _.isArray(squares);
1685
     * // => false
1686
     *
1687
     * _.isArray(squares.value());
1688
     * // => true
1689
     */
1690
    function lodash(value) {
1691
      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
1692
        if (value instanceof LodashWrapper) {
1693
          return value;
1694
        }
1695
        if (hasOwnProperty.call(value, '__wrapped__')) {
1696
          return wrapperClone(value);
1697
        }
1698
      }
1699
      return new LodashWrapper(value);
1700
    }
1701
1702
    /**
1703
     * The base implementation of `_.create` without support for assigning
1704
     * properties to the created object.
1705
     *
1706
     * @private
1707
     * @param {Object} proto The object to inherit from.
1708
     * @returns {Object} Returns the new object.
1709
     */
1710
    var baseCreate = (function() {
1711
      function object() {}
1712
      return function(proto) {
1713
        if (!isObject(proto)) {
1714
          return {};
1715
        }
1716
        if (objectCreate) {
1717
          return objectCreate(proto);
1718
        }
1719
        object.prototype = proto;
1720
        var result = new object;
1721
        object.prototype = undefined;
1722
        return result;
1723
      };
1724
    }());
1725
1726
    /**
1727
     * The function whose prototype chain sequence wrappers inherit from.
1728
     *
1729
     * @private
1730
     */
1731
    function baseLodash() {
1732
      // No operation performed.
1733
    }
1734
1735
    /**
1736
     * The base constructor for creating `lodash` wrapper objects.
1737
     *
1738
     * @private
1739
     * @param {*} value The value to wrap.
1740
     * @param {boolean} [chainAll] Enable explicit method chain sequences.
1741
     */
1742
    function LodashWrapper(value, chainAll) {
1743
      this.__wrapped__ = value;
1744
      this.__actions__ = [];
1745
      this.__chain__ = !!chainAll;
1746
      this.__index__ = 0;
1747
      this.__values__ = undefined;
1748
    }
1749
1750
    /**
1751
     * By default, the template delimiters used by lodash are like those in
1752
     * embedded Ruby (ERB) as well as ES2015 template strings. Change the
1753
     * following template settings to use alternative delimiters.
1754
     *
1755
     * @static
1756
     * @memberOf _
1757
     * @type {Object}
1758
     */
1759
    lodash.templateSettings = {
1760
1761
      /**
1762
       * Used to detect `data` property values to be HTML-escaped.
1763
       *
1764
       * @memberOf _.templateSettings
1765
       * @type {RegExp}
1766
       */
1767
      'escape': reEscape,
1768
1769
      /**
1770
       * Used to detect code to be evaluated.
1771
       *
1772
       * @memberOf _.templateSettings
1773
       * @type {RegExp}
1774
       */
1775
      'evaluate': reEvaluate,
1776
1777
      /**
1778
       * Used to detect `data` property values to inject.
1779
       *
1780
       * @memberOf _.templateSettings
1781
       * @type {RegExp}
1782
       */
1783
      'interpolate': reInterpolate,
1784
1785
      /**
1786
       * Used to reference the data object in the template text.
1787
       *
1788
       * @memberOf _.templateSettings
1789
       * @type {string}
1790
       */
1791
      'variable': '',
1792
1793
      /**
1794
       * Used to import variables into the compiled template.
1795
       *
1796
       * @memberOf _.templateSettings
1797
       * @type {Object}
1798
       */
1799
      'imports': {
1800
1801
        /**
1802
         * A reference to the `lodash` function.
1803
         *
1804
         * @memberOf _.templateSettings.imports
1805
         * @type {Function}
1806
         */
1807
        '_': lodash
1808
      }
1809
    };
1810
1811
    // Ensure wrappers are instances of `baseLodash`.
1812
    lodash.prototype = baseLodash.prototype;
1813
    lodash.prototype.constructor = lodash;
1814
1815
    LodashWrapper.prototype = baseCreate(baseLodash.prototype);
1816
    LodashWrapper.prototype.constructor = LodashWrapper;
1817
1818
    /*------------------------------------------------------------------------*/
1819
1820
    /**
1821
     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
1822
     *
1823
     * @private
1824
     * @constructor
1825
     * @param {*} value The value to wrap.
1826
     */
1827
    function LazyWrapper(value) {
1828
      this.__wrapped__ = value;
1829
      this.__actions__ = [];
1830
      this.__dir__ = 1;
1831
      this.__filtered__ = false;
1832
      this.__iteratees__ = [];
1833
      this.__takeCount__ = MAX_ARRAY_LENGTH;
1834
      this.__views__ = [];
1835
    }
1836
1837
    /**
1838
     * Creates a clone of the lazy wrapper object.
1839
     *
1840
     * @private
1841
     * @name clone
1842
     * @memberOf LazyWrapper
1843
     * @returns {Object} Returns the cloned `LazyWrapper` object.
1844
     */
1845
    function lazyClone() {
1846
      var result = new LazyWrapper(this.__wrapped__);
1847
      result.__actions__ = copyArray(this.__actions__);
1848
      result.__dir__ = this.__dir__;
1849
      result.__filtered__ = this.__filtered__;
1850
      result.__iteratees__ = copyArray(this.__iteratees__);
1851
      result.__takeCount__ = this.__takeCount__;
1852
      result.__views__ = copyArray(this.__views__);
1853
      return result;
1854
    }
1855
1856
    /**
1857
     * Reverses the direction of lazy iteration.
1858
     *
1859
     * @private
1860
     * @name reverse
1861
     * @memberOf LazyWrapper
1862
     * @returns {Object} Returns the new reversed `LazyWrapper` object.
1863
     */
1864
    function lazyReverse() {
1865
      if (this.__filtered__) {
1866
        var result = new LazyWrapper(this);
1867
        result.__dir__ = -1;
1868
        result.__filtered__ = true;
1869
      } else {
1870
        result = this.clone();
1871
        result.__dir__ *= -1;
1872
      }
1873
      return result;
1874
    }
1875
1876
    /**
1877
     * Extracts the unwrapped value from its lazy wrapper.
1878
     *
1879
     * @private
1880
     * @name value
1881
     * @memberOf LazyWrapper
1882
     * @returns {*} Returns the unwrapped value.
1883
     */
1884
    function lazyValue() {
1885
      var array = this.__wrapped__.value(),
1886
          dir = this.__dir__,
1887
          isArr = isArray(array),
1888
          isRight = dir < 0,
1889
          arrLength = isArr ? array.length : 0,
1890
          view = getView(0, arrLength, this.__views__),
1891
          start = view.start,
1892
          end = view.end,
1893
          length = end - start,
1894
          index = isRight ? end : (start - 1),
1895
          iteratees = this.__iteratees__,
1896
          iterLength = iteratees.length,
1897
          resIndex = 0,
1898
          takeCount = nativeMin(length, this.__takeCount__);
1899
1900
      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {
1901
        return baseWrapperValue(array, this.__actions__);
1902
      }
1903
      var result = [];
1904
1905
      outer:
1906
      while (length-- && resIndex < takeCount) {
1907
        index += dir;
1908
1909
        var iterIndex = -1,
1910
            value = array[index];
1911
1912
        while (++iterIndex < iterLength) {
1913
          var data = iteratees[iterIndex],
1914
              iteratee = data.iteratee,
1915
              type = data.type,
1916
              computed = iteratee(value);
1917
1918
          if (type == LAZY_MAP_FLAG) {
1919
            value = computed;
1920
          } else if (!computed) {
1921
            if (type == LAZY_FILTER_FLAG) {
1922
              continue outer;
1923
            } else {
1924
              break outer;
1925
            }
1926
          }
1927
        }
1928
        result[resIndex++] = value;
1929
      }
1930
      return result;
1931
    }
1932
1933
    // Ensure `LazyWrapper` is an instance of `baseLodash`.
1934
    LazyWrapper.prototype = baseCreate(baseLodash.prototype);
1935
    LazyWrapper.prototype.constructor = LazyWrapper;
1936
1937
    /*------------------------------------------------------------------------*/
1938
1939
    /**
1940
     * Creates a hash object.
1941
     *
1942
     * @private
1943
     * @constructor
1944
     * @param {Array} [entries] The key-value pairs to cache.
1945
     */
1946
    function Hash(entries) {
1947
      var index = -1,
1948
          length = entries == null ? 0 : entries.length;
1949
1950
      this.clear();
1951
      while (++index < length) {
1952
        var entry = entries[index];
1953
        this.set(entry[0], entry[1]);
1954
      }
1955
    }
1956
1957
    /**
1958
     * Removes all key-value entries from the hash.
1959
     *
1960
     * @private
1961
     * @name clear
1962
     * @memberOf Hash
1963
     */
1964
    function hashClear() {
1965
      this.__data__ = nativeCreate ? nativeCreate(null) : {};
1966
      this.size = 0;
1967
    }
1968
1969
    /**
1970
     * Removes `key` and its value from the hash.
1971
     *
1972
     * @private
1973
     * @name delete
1974
     * @memberOf Hash
1975
     * @param {Object} hash The hash to modify.
1976
     * @param {string} key The key of the value to remove.
1977
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
1978
     */
1979
    function hashDelete(key) {
1980
      var result = this.has(key) && delete this.__data__[key];
1981
      this.size -= result ? 1 : 0;
1982
      return result;
1983
    }
1984
1985
    /**
1986
     * Gets the hash value for `key`.
1987
     *
1988
     * @private
1989
     * @name get
1990
     * @memberOf Hash
1991
     * @param {string} key The key of the value to get.
1992
     * @returns {*} Returns the entry value.
1993
     */
1994
    function hashGet(key) {
1995
      var data = this.__data__;
1996
      if (nativeCreate) {
1997
        var result = data[key];
1998
        return result === HASH_UNDEFINED ? undefined : result;
1999
      }
2000
      return hasOwnProperty.call(data, key) ? data[key] : undefined;
2001
    }
2002
2003
    /**
2004
     * Checks if a hash value for `key` exists.
2005
     *
2006
     * @private
2007
     * @name has
2008
     * @memberOf Hash
2009
     * @param {string} key The key of the entry to check.
2010
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2011
     */
2012
    function hashHas(key) {
2013
      var data = this.__data__;
2014
      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);
2015
    }
2016
2017
    /**
2018
     * Sets the hash `key` to `value`.
2019
     *
2020
     * @private
2021
     * @name set
2022
     * @memberOf Hash
2023
     * @param {string} key The key of the value to set.
2024
     * @param {*} value The value to set.
2025
     * @returns {Object} Returns the hash instance.
2026
     */
2027
    function hashSet(key, value) {
2028
      var data = this.__data__;
2029
      this.size += this.has(key) ? 0 : 1;
2030
      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;
2031
      return this;
2032
    }
2033
2034
    // Add methods to `Hash`.
2035
    Hash.prototype.clear = hashClear;
2036
    Hash.prototype['delete'] = hashDelete;
2037
    Hash.prototype.get = hashGet;
2038
    Hash.prototype.has = hashHas;
2039
    Hash.prototype.set = hashSet;
2040
2041
    /*------------------------------------------------------------------------*/
2042
2043
    /**
2044
     * Creates an list cache object.
2045
     *
2046
     * @private
2047
     * @constructor
2048
     * @param {Array} [entries] The key-value pairs to cache.
2049
     */
2050
    function ListCache(entries) {
2051
      var index = -1,
2052
          length = entries == null ? 0 : entries.length;
2053
2054
      this.clear();
2055
      while (++index < length) {
2056
        var entry = entries[index];
2057
        this.set(entry[0], entry[1]);
2058
      }
2059
    }
2060
2061
    /**
2062
     * Removes all key-value entries from the list cache.
2063
     *
2064
     * @private
2065
     * @name clear
2066
     * @memberOf ListCache
2067
     */
2068
    function listCacheClear() {
2069
      this.__data__ = [];
2070
      this.size = 0;
2071
    }
2072
2073
    /**
2074
     * Removes `key` and its value from the list cache.
2075
     *
2076
     * @private
2077
     * @name delete
2078
     * @memberOf ListCache
2079
     * @param {string} key The key of the value to remove.
2080
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2081
     */
2082
    function listCacheDelete(key) {
2083
      var data = this.__data__,
2084
          index = assocIndexOf(data, key);
2085
2086
      if (index < 0) {
2087
        return false;
2088
      }
2089
      var lastIndex = data.length - 1;
2090
      if (index == lastIndex) {
2091
        data.pop();
2092
      } else {
2093
        splice.call(data, index, 1);
2094
      }
2095
      --this.size;
2096
      return true;
2097
    }
2098
2099
    /**
2100
     * Gets the list cache value for `key`.
2101
     *
2102
     * @private
2103
     * @name get
2104
     * @memberOf ListCache
2105
     * @param {string} key The key of the value to get.
2106
     * @returns {*} Returns the entry value.
2107
     */
2108
    function listCacheGet(key) {
2109
      var data = this.__data__,
2110
          index = assocIndexOf(data, key);
2111
2112
      return index < 0 ? undefined : data[index][1];
2113
    }
2114
2115
    /**
2116
     * Checks if a list cache value for `key` exists.
2117
     *
2118
     * @private
2119
     * @name has
2120
     * @memberOf ListCache
2121
     * @param {string} key The key of the entry to check.
2122
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2123
     */
2124
    function listCacheHas(key) {
2125
      return assocIndexOf(this.__data__, key) > -1;
2126
    }
2127
2128
    /**
2129
     * Sets the list cache `key` to `value`.
2130
     *
2131
     * @private
2132
     * @name set
2133
     * @memberOf ListCache
2134
     * @param {string} key The key of the value to set.
2135
     * @param {*} value The value to set.
2136
     * @returns {Object} Returns the list cache instance.
2137
     */
2138
    function listCacheSet(key, value) {
2139
      var data = this.__data__,
2140
          index = assocIndexOf(data, key);
2141
2142
      if (index < 0) {
2143
        ++this.size;
2144
        data.push([key, value]);
2145
      } else {
2146
        data[index][1] = value;
2147
      }
2148
      return this;
2149
    }
2150
2151
    // Add methods to `ListCache`.
2152
    ListCache.prototype.clear = listCacheClear;
2153
    ListCache.prototype['delete'] = listCacheDelete;
2154
    ListCache.prototype.get = listCacheGet;
2155
    ListCache.prototype.has = listCacheHas;
2156
    ListCache.prototype.set = listCacheSet;
2157
2158
    /*------------------------------------------------------------------------*/
2159
2160
    /**
2161
     * Creates a map cache object to store key-value pairs.
2162
     *
2163
     * @private
2164
     * @constructor
2165
     * @param {Array} [entries] The key-value pairs to cache.
2166
     */
2167
    function MapCache(entries) {
2168
      var index = -1,
2169
          length = entries == null ? 0 : entries.length;
2170
2171
      this.clear();
2172
      while (++index < length) {
2173
        var entry = entries[index];
2174
        this.set(entry[0], entry[1]);
2175
      }
2176
    }
2177
2178
    /**
2179
     * Removes all key-value entries from the map.
2180
     *
2181
     * @private
2182
     * @name clear
2183
     * @memberOf MapCache
2184
     */
2185
    function mapCacheClear() {
2186
      this.size = 0;
2187
      this.__data__ = {
2188
        'hash': new Hash,
2189
        'map': new (Map || ListCache),
2190
        'string': new Hash
2191
      };
2192
    }
2193
2194
    /**
2195
     * Removes `key` and its value from the map.
2196
     *
2197
     * @private
2198
     * @name delete
2199
     * @memberOf MapCache
2200
     * @param {string} key The key of the value to remove.
2201
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2202
     */
2203
    function mapCacheDelete(key) {
2204
      var result = getMapData(this, key)['delete'](key);
2205
      this.size -= result ? 1 : 0;
2206
      return result;
2207
    }
2208
2209
    /**
2210
     * Gets the map value for `key`.
2211
     *
2212
     * @private
2213
     * @name get
2214
     * @memberOf MapCache
2215
     * @param {string} key The key of the value to get.
2216
     * @returns {*} Returns the entry value.
2217
     */
2218
    function mapCacheGet(key) {
2219
      return getMapData(this, key).get(key);
2220
    }
2221
2222
    /**
2223
     * Checks if a map value for `key` exists.
2224
     *
2225
     * @private
2226
     * @name has
2227
     * @memberOf MapCache
2228
     * @param {string} key The key of the entry to check.
2229
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2230
     */
2231
    function mapCacheHas(key) {
2232
      return getMapData(this, key).has(key);
2233
    }
2234
2235
    /**
2236
     * Sets the map `key` to `value`.
2237
     *
2238
     * @private
2239
     * @name set
2240
     * @memberOf MapCache
2241
     * @param {string} key The key of the value to set.
2242
     * @param {*} value The value to set.
2243
     * @returns {Object} Returns the map cache instance.
2244
     */
2245
    function mapCacheSet(key, value) {
2246
      var data = getMapData(this, key),
2247
          size = data.size;
2248
2249
      data.set(key, value);
2250
      this.size += data.size == size ? 0 : 1;
2251
      return this;
2252
    }
2253
2254
    // Add methods to `MapCache`.
2255
    MapCache.prototype.clear = mapCacheClear;
2256
    MapCache.prototype['delete'] = mapCacheDelete;
2257
    MapCache.prototype.get = mapCacheGet;
2258
    MapCache.prototype.has = mapCacheHas;
2259
    MapCache.prototype.set = mapCacheSet;
2260
2261
    /*------------------------------------------------------------------------*/
2262
2263
    /**
2264
     *
2265
     * Creates an array cache object to store unique values.
2266
     *
2267
     * @private
2268
     * @constructor
2269
     * @param {Array} [values] The values to cache.
2270
     */
2271
    function SetCache(values) {
2272
      var index = -1,
2273
          length = values == null ? 0 : values.length;
2274
2275
      this.__data__ = new MapCache;
2276
      while (++index < length) {
2277
        this.add(values[index]);
2278
      }
2279
    }
2280
2281
    /**
2282
     * Adds `value` to the array cache.
2283
     *
2284
     * @private
2285
     * @name add
2286
     * @memberOf SetCache
2287
     * @alias push
2288
     * @param {*} value The value to cache.
2289
     * @returns {Object} Returns the cache instance.
2290
     */
2291
    function setCacheAdd(value) {
2292
      this.__data__.set(value, HASH_UNDEFINED);
2293
      return this;
2294
    }
2295
2296
    /**
2297
     * Checks if `value` is in the array cache.
2298
     *
2299
     * @private
2300
     * @name has
2301
     * @memberOf SetCache
2302
     * @param {*} value The value to search for.
2303
     * @returns {number} Returns `true` if `value` is found, else `false`.
2304
     */
2305
    function setCacheHas(value) {
2306
      return this.__data__.has(value);
2307
    }
2308
2309
    // Add methods to `SetCache`.
2310
    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
2311
    SetCache.prototype.has = setCacheHas;
2312
2313
    /*------------------------------------------------------------------------*/
2314
2315
    /**
2316
     * Creates a stack cache object to store key-value pairs.
2317
     *
2318
     * @private
2319
     * @constructor
2320
     * @param {Array} [entries] The key-value pairs to cache.
2321
     */
2322
    function Stack(entries) {
2323
      var data = this.__data__ = new ListCache(entries);
2324
      this.size = data.size;
2325
    }
2326
2327
    /**
2328
     * Removes all key-value entries from the stack.
2329
     *
2330
     * @private
2331
     * @name clear
2332
     * @memberOf Stack
2333
     */
2334
    function stackClear() {
2335
      this.__data__ = new ListCache;
2336
      this.size = 0;
2337
    }
2338
2339
    /**
2340
     * Removes `key` and its value from the stack.
2341
     *
2342
     * @private
2343
     * @name delete
2344
     * @memberOf Stack
2345
     * @param {string} key The key of the value to remove.
2346
     * @returns {boolean} Returns `true` if the entry was removed, else `false`.
2347
     */
2348
    function stackDelete(key) {
2349
      var data = this.__data__,
2350
          result = data['delete'](key);
2351
2352
      this.size = data.size;
2353
      return result;
2354
    }
2355
2356
    /**
2357
     * Gets the stack value for `key`.
2358
     *
2359
     * @private
2360
     * @name get
2361
     * @memberOf Stack
2362
     * @param {string} key The key of the value to get.
2363
     * @returns {*} Returns the entry value.
2364
     */
2365
    function stackGet(key) {
2366
      return this.__data__.get(key);
2367
    }
2368
2369
    /**
2370
     * Checks if a stack value for `key` exists.
2371
     *
2372
     * @private
2373
     * @name has
2374
     * @memberOf Stack
2375
     * @param {string} key The key of the entry to check.
2376
     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
2377
     */
2378
    function stackHas(key) {
2379
      return this.__data__.has(key);
2380
    }
2381
2382
    /**
2383
     * Sets the stack `key` to `value`.
2384
     *
2385
     * @private
2386
     * @name set
2387
     * @memberOf Stack
2388
     * @param {string} key The key of the value to set.
2389
     * @param {*} value The value to set.
2390
     * @returns {Object} Returns the stack cache instance.
2391
     */
2392
    function stackSet(key, value) {
2393
      var data = this.__data__;
2394
      if (data instanceof ListCache) {
2395
        var pairs = data.__data__;
2396
        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {
2397
          pairs.push([key, value]);
2398
          this.size = ++data.size;
2399
          return this;
2400
        }
2401
        data = this.__data__ = new MapCache(pairs);
2402
      }
2403
      data.set(key, value);
2404
      this.size = data.size;
2405
      return this;
2406
    }
2407
2408
    // Add methods to `Stack`.
2409
    Stack.prototype.clear = stackClear;
2410
    Stack.prototype['delete'] = stackDelete;
2411
    Stack.prototype.get = stackGet;
2412
    Stack.prototype.has = stackHas;
2413
    Stack.prototype.set = stackSet;
2414
2415
    /*------------------------------------------------------------------------*/
2416
2417
    /**
2418
     * Creates an array of the enumerable property names of the array-like `value`.
2419
     *
2420
     * @private
2421
     * @param {*} value The value to query.
2422
     * @param {boolean} inherited Specify returning inherited property names.
2423
     * @returns {Array} Returns the array of property names.
2424
     */
2425
    function arrayLikeKeys(value, inherited) {
2426
      var isArr = isArray(value),
2427
          isArg = !isArr && isArguments(value),
2428
          isBuff = !isArr && !isArg && isBuffer(value),
2429
          isType = !isArr && !isArg && !isBuff && isTypedArray(value),
2430
          skipIndexes = isArr || isArg || isBuff || isType,
2431
          result = skipIndexes ? baseTimes(value.length, String) : [],
2432
          length = result.length;
2433
2434
      for (var key in value) {
2435
        if ((inherited || hasOwnProperty.call(value, key)) &&
2436
            !(skipIndexes && (
2437
               // Safari 9 has enumerable `arguments.length` in strict mode.
2438
               key == 'length' ||
2439
               // Node.js 0.10 has enumerable non-index properties on buffers.
2440
               (isBuff && (key == 'offset' || key == 'parent')) ||
2441
               // PhantomJS 2 has enumerable non-index properties on typed arrays.
2442
               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
2443
               // Skip index properties.
2444
               isIndex(key, length)
2445
            ))) {
2446
          result.push(key);
2447
        }
2448
      }
2449
      return result;
2450
    }
2451
2452
    /**
2453
     * A specialized version of `_.sample` for arrays.
2454
     *
2455
     * @private
2456
     * @param {Array} array The array to sample.
2457
     * @returns {*} Returns the random element.
2458
     */
2459
    function arraySample(array) {
2460
      var length = array.length;
2461
      return length ? array[baseRandom(0, length - 1)] : undefined;
2462
    }
2463
2464
    /**
2465
     * A specialized version of `_.sampleSize` for arrays.
2466
     *
2467
     * @private
2468
     * @param {Array} array The array to sample.
2469
     * @param {number} n The number of elements to sample.
2470
     * @returns {Array} Returns the random elements.
2471
     */
2472
    function arraySampleSize(array, n) {
2473
      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));
2474
    }
2475
2476
    /**
2477
     * A specialized version of `_.shuffle` for arrays.
2478
     *
2479
     * @private
2480
     * @param {Array} array The array to shuffle.
2481
     * @returns {Array} Returns the new shuffled array.
2482
     */
2483
    function arrayShuffle(array) {
2484
      return shuffleSelf(copyArray(array));
2485
    }
2486
2487
    /**
2488
     * This function is like `assignValue` except that it doesn't assign
2489
     * `undefined` values.
2490
     *
2491
     * @private
2492
     * @param {Object} object The object to modify.
2493
     * @param {string} key The key of the property to assign.
2494
     * @param {*} value The value to assign.
2495
     */
2496
    function assignMergeValue(object, key, value) {
2497
      if ((value !== undefined && !eq(object[key], value)) ||
2498
          (value === undefined && !(key in object))) {
2499
        baseAssignValue(object, key, value);
2500
      }
2501
    }
2502
2503
    /**
2504
     * Assigns `value` to `key` of `object` if the existing value is not equivalent
2505
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
2506
     * for equality comparisons.
2507
     *
2508
     * @private
2509
     * @param {Object} object The object to modify.
2510
     * @param {string} key The key of the property to assign.
2511
     * @param {*} value The value to assign.
2512
     */
2513
    function assignValue(object, key, value) {
2514
      var objValue = object[key];
2515
      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||
2516
          (value === undefined && !(key in object))) {
2517
        baseAssignValue(object, key, value);
2518
      }
2519
    }
2520
2521
    /**
2522
     * Gets the index at which the `key` is found in `array` of key-value pairs.
2523
     *
2524
     * @private
2525
     * @param {Array} array The array to inspect.
2526
     * @param {*} key The key to search for.
2527
     * @returns {number} Returns the index of the matched value, else `-1`.
2528
     */
2529
    function assocIndexOf(array, key) {
2530
      var length = array.length;
2531
      while (length--) {
2532
        if (eq(array[length][0], key)) {
2533
          return length;
2534
        }
2535
      }
2536
      return -1;
2537
    }
2538
2539
    /**
2540
     * Aggregates elements of `collection` on `accumulator` with keys transformed
2541
     * by `iteratee` and values set by `setter`.
2542
     *
2543
     * @private
2544
     * @param {Array|Object} collection The collection to iterate over.
2545
     * @param {Function} setter The function to set `accumulator` values.
2546
     * @param {Function} iteratee The iteratee to transform keys.
2547
     * @param {Object} accumulator The initial aggregated object.
2548
     * @returns {Function} Returns `accumulator`.
2549
     */
2550
    function baseAggregator(collection, setter, iteratee, accumulator) {
2551
      baseEach(collection, function(value, key, collection) {
2552
        setter(accumulator, value, iteratee(value), collection);
2553
      });
2554
      return accumulator;
2555
    }
2556
2557
    /**
2558
     * The base implementation of `_.assign` without support for multiple sources
2559
     * or `customizer` functions.
2560
     *
2561
     * @private
2562
     * @param {Object} object The destination object.
2563
     * @param {Object} source The source object.
2564
     * @returns {Object} Returns `object`.
2565
     */
2566
    function baseAssign(object, source) {
2567
      return object && copyObject(source, keys(source), object);
2568
    }
2569
2570
    /**
2571
     * The base implementation of `_.assignIn` without support for multiple sources
2572
     * or `customizer` functions.
2573
     *
2574
     * @private
2575
     * @param {Object} object The destination object.
2576
     * @param {Object} source The source object.
2577
     * @returns {Object} Returns `object`.
2578
     */
2579
    function baseAssignIn(object, source) {
2580
      return object && copyObject(source, keysIn(source), object);
2581
    }
2582
2583
    /**
2584
     * The base implementation of `assignValue` and `assignMergeValue` without
2585
     * value checks.
2586
     *
2587
     * @private
2588
     * @param {Object} object The object to modify.
2589
     * @param {string} key The key of the property to assign.
2590
     * @param {*} value The value to assign.
2591
     */
2592
    function baseAssignValue(object, key, value) {
2593
      if (key == '__proto__' && defineProperty) {
2594
        defineProperty(object, key, {
2595
          'configurable': true,
2596
          'enumerable': true,
2597
          'value': value,
2598
          'writable': true
2599
        });
2600
      } else {
2601
        object[key] = value;
2602
      }
2603
    }
2604
2605
    /**
2606
     * The base implementation of `_.at` without support for individual paths.
2607
     *
2608
     * @private
2609
     * @param {Object} object The object to iterate over.
2610
     * @param {string[]} paths The property paths to pick.
2611
     * @returns {Array} Returns the picked elements.
2612
     */
2613
    function baseAt(object, paths) {
2614
      var index = -1,
2615
          length = paths.length,
2616
          result = Array(length),
2617
          skip = object == null;
2618
2619
      while (++index < length) {
2620
        result[index] = skip ? undefined : get(object, paths[index]);
2621
      }
2622
      return result;
2623
    }
2624
2625
    /**
2626
     * The base implementation of `_.clamp` which doesn't coerce arguments.
2627
     *
2628
     * @private
2629
     * @param {number} number The number to clamp.
2630
     * @param {number} [lower] The lower bound.
2631
     * @param {number} upper The upper bound.
2632
     * @returns {number} Returns the clamped number.
2633
     */
2634
    function baseClamp(number, lower, upper) {
2635
      if (number === number) {
2636
        if (upper !== undefined) {
2637
          number = number <= upper ? number : upper;
2638
        }
2639
        if (lower !== undefined) {
2640
          number = number >= lower ? number : lower;
2641
        }
2642
      }
2643
      return number;
2644
    }
2645
2646
    /**
2647
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
2648
     * traversed objects.
2649
     *
2650
     * @private
2651
     * @param {*} value The value to clone.
2652
     * @param {boolean} bitmask The bitmask flags.
2653
     *  1 - Deep clone
2654
     *  2 - Flatten inherited properties
2655
     *  4 - Clone symbols
2656
     * @param {Function} [customizer] The function to customize cloning.
2657
     * @param {string} [key] The key of `value`.
2658
     * @param {Object} [object] The parent object of `value`.
2659
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
2660
     * @returns {*} Returns the cloned value.
2661
     */
2662
    function baseClone(value, bitmask, customizer, key, object, stack) {
2663
      var result,
2664
          isDeep = bitmask & CLONE_DEEP_FLAG,
2665
          isFlat = bitmask & CLONE_FLAT_FLAG,
2666
          isFull = bitmask & CLONE_SYMBOLS_FLAG;
2667
2668
      if (customizer) {
2669
        result = object ? customizer(value, key, object, stack) : customizer(value);
2670
      }
2671
      if (result !== undefined) {
2672
        return result;
2673
      }
2674
      if (!isObject(value)) {
2675
        return value;
2676
      }
2677
      var isArr = isArray(value);
2678
      if (isArr) {
2679
        result = initCloneArray(value);
2680
        if (!isDeep) {
2681
          return copyArray(value, result);
2682
        }
2683
      } else {
2684
        var tag = getTag(value),
2685
            isFunc = tag == funcTag || tag == genTag;
2686
2687
        if (isBuffer(value)) {
2688
          return cloneBuffer(value, isDeep);
2689
        }
2690
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
2691
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
2692
          if (!isDeep) {
2693
            return isFlat
2694
              ? copySymbolsIn(value, baseAssignIn(result, value))
2695
              : copySymbols(value, baseAssign(result, value));
2696
          }
2697
        } else {
2698
          if (!cloneableTags[tag]) {
2699
            return object ? value : {};
2700
          }
2701
          result = initCloneByTag(value, tag, isDeep);
2702
        }
2703
      }
2704
      // Check for circular references and return its corresponding clone.
2705
      stack || (stack = new Stack);
2706
      var stacked = stack.get(value);
2707
      if (stacked) {
2708
        return stacked;
2709
      }
2710
      stack.set(value, result);
2711
2712
      if (isSet(value)) {
2713
        value.forEach(function(subValue) {
2714
          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
2715
        });
2716
      } else if (isMap(value)) {
2717
        value.forEach(function(subValue, key) {
2718
          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
2719
        });
2720
      }
2721
2722
      var keysFunc = isFull
2723
        ? (isFlat ? getAllKeysIn : getAllKeys)
2724
        : (isFlat ? keysIn : keys);
2725
2726
      var props = isArr ? undefined : keysFunc(value);
2727
      arrayEach(props || value, function(subValue, key) {
2728
        if (props) {
2729
          key = subValue;
2730
          subValue = value[key];
2731
        }
2732
        // Recursively populate clone (susceptible to call stack limits).
2733
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
2734
      });
2735
      return result;
2736
    }
2737
2738
    /**
2739
     * The base implementation of `_.conforms` which doesn't clone `source`.
2740
     *
2741
     * @private
2742
     * @param {Object} source The object of property predicates to conform to.
2743
     * @returns {Function} Returns the new spec function.
2744
     */
2745
    function baseConforms(source) {
2746
      var props = keys(source);
2747
      return function(object) {
2748
        return baseConformsTo(object, source, props);
2749
      };
2750
    }
2751
2752
    /**
2753
     * The base implementation of `_.conformsTo` which accepts `props` to check.
2754
     *
2755
     * @private
2756
     * @param {Object} object The object to inspect.
2757
     * @param {Object} source The object of property predicates to conform to.
2758
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
2759
     */
2760
    function baseConformsTo(object, source, props) {
2761
      var length = props.length;
2762
      if (object == null) {
2763
        return !length;
2764
      }
2765
      object = Object(object);
2766
      while (length--) {
2767
        var key = props[length],
2768
            predicate = source[key],
2769
            value = object[key];
2770
2771
        if ((value === undefined && !(key in object)) || !predicate(value)) {
2772
          return false;
2773
        }
2774
      }
2775
      return true;
2776
    }
2777
2778
    /**
2779
     * The base implementation of `_.delay` and `_.defer` which accepts `args`
2780
     * to provide to `func`.
2781
     *
2782
     * @private
2783
     * @param {Function} func The function to delay.
2784
     * @param {number} wait The number of milliseconds to delay invocation.
2785
     * @param {Array} args The arguments to provide to `func`.
2786
     * @returns {number|Object} Returns the timer id or timeout object.
2787
     */
2788
    function baseDelay(func, wait, args) {
2789
      if (typeof func != 'function') {
2790
        throw new TypeError(FUNC_ERROR_TEXT);
2791
      }
2792
      return setTimeout(function() { func.apply(undefined, args); }, wait);
2793
    }
2794
2795
    /**
2796
     * The base implementation of methods like `_.difference` without support
2797
     * for excluding multiple arrays or iteratee shorthands.
2798
     *
2799
     * @private
2800
     * @param {Array} array The array to inspect.
2801
     * @param {Array} values The values to exclude.
2802
     * @param {Function} [iteratee] The iteratee invoked per element.
2803
     * @param {Function} [comparator] The comparator invoked per element.
2804
     * @returns {Array} Returns the new array of filtered values.
2805
     */
2806
    function baseDifference(array, values, iteratee, comparator) {
2807
      var index = -1,
2808
          includes = arrayIncludes,
2809
          isCommon = true,
2810
          length = array.length,
2811
          result = [],
2812
          valuesLength = values.length;
2813
2814
      if (!length) {
2815
        return result;
2816
      }
2817
      if (iteratee) {
2818
        values = arrayMap(values, baseUnary(iteratee));
2819
      }
2820
      if (comparator) {
2821
        includes = arrayIncludesWith;
2822
        isCommon = false;
2823
      }
2824
      else if (values.length >= LARGE_ARRAY_SIZE) {
2825
        includes = cacheHas;
2826
        isCommon = false;
2827
        values = new SetCache(values);
2828
      }
2829
      outer:
2830
      while (++index < length) {
2831
        var value = array[index],
2832
            computed = iteratee == null ? value : iteratee(value);
2833
2834
        value = (comparator || value !== 0) ? value : 0;
2835
        if (isCommon && computed === computed) {
2836
          var valuesIndex = valuesLength;
2837
          while (valuesIndex--) {
2838
            if (values[valuesIndex] === computed) {
2839
              continue outer;
2840
            }
2841
          }
2842
          result.push(value);
2843
        }
2844
        else if (!includes(values, computed, comparator)) {
2845
          result.push(value);
2846
        }
2847
      }
2848
      return result;
2849
    }
2850
2851
    /**
2852
     * The base implementation of `_.forEach` without support for iteratee shorthands.
2853
     *
2854
     * @private
2855
     * @param {Array|Object} collection The collection to iterate over.
2856
     * @param {Function} iteratee The function invoked per iteration.
2857
     * @returns {Array|Object} Returns `collection`.
2858
     */
2859
    var baseEach = createBaseEach(baseForOwn);
2860
2861
    /**
2862
     * The base implementation of `_.forEachRight` without support for iteratee shorthands.
2863
     *
2864
     * @private
2865
     * @param {Array|Object} collection The collection to iterate over.
2866
     * @param {Function} iteratee The function invoked per iteration.
2867
     * @returns {Array|Object} Returns `collection`.
2868
     */
2869
    var baseEachRight = createBaseEach(baseForOwnRight, true);
2870
2871
    /**
2872
     * The base implementation of `_.every` without support for iteratee shorthands.
2873
     *
2874
     * @private
2875
     * @param {Array|Object} collection The collection to iterate over.
2876
     * @param {Function} predicate The function invoked per iteration.
2877
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
2878
     *  else `false`
2879
     */
2880
    function baseEvery(collection, predicate) {
2881
      var result = true;
2882
      baseEach(collection, function(value, index, collection) {
2883
        result = !!predicate(value, index, collection);
2884
        return result;
2885
      });
2886
      return result;
2887
    }
2888
2889
    /**
2890
     * The base implementation of methods like `_.max` and `_.min` which accepts a
2891
     * `comparator` to determine the extremum value.
2892
     *
2893
     * @private
2894
     * @param {Array} array The array to iterate over.
2895
     * @param {Function} iteratee The iteratee invoked per iteration.
2896
     * @param {Function} comparator The comparator used to compare values.
2897
     * @returns {*} Returns the extremum value.
2898
     */
2899
    function baseExtremum(array, iteratee, comparator) {
2900
      var index = -1,
2901
          length = array.length;
2902
2903
      while (++index < length) {
2904
        var value = array[index],
2905
            current = iteratee(value);
2906
2907
        if (current != null && (computed === undefined
2908
              ? (current === current && !isSymbol(current))
2909
              : comparator(current, computed)
2910
            )) {
2911
          var computed = current,
2912
              result = value;
2913
        }
2914
      }
2915
      return result;
2916
    }
2917
2918
    /**
2919
     * The base implementation of `_.fill` without an iteratee call guard.
2920
     *
2921
     * @private
2922
     * @param {Array} array The array to fill.
2923
     * @param {*} value The value to fill `array` with.
2924
     * @param {number} [start=0] The start position.
2925
     * @param {number} [end=array.length] The end position.
2926
     * @returns {Array} Returns `array`.
2927
     */
2928
    function baseFill(array, value, start, end) {
2929
      var length = array.length;
2930
2931
      start = toInteger(start);
2932
      if (start < 0) {
2933
        start = -start > length ? 0 : (length + start);
2934
      }
2935
      end = (end === undefined || end > length) ? length : toInteger(end);
2936
      if (end < 0) {
2937
        end += length;
2938
      }
2939
      end = start > end ? 0 : toLength(end);
2940
      while (start < end) {
2941
        array[start++] = value;
2942
      }
2943
      return array;
2944
    }
2945
2946
    /**
2947
     * The base implementation of `_.filter` without support for iteratee shorthands.
2948
     *
2949
     * @private
2950
     * @param {Array|Object} collection The collection to iterate over.
2951
     * @param {Function} predicate The function invoked per iteration.
2952
     * @returns {Array} Returns the new filtered array.
2953
     */
2954
    function baseFilter(collection, predicate) {
2955
      var result = [];
2956
      baseEach(collection, function(value, index, collection) {
2957
        if (predicate(value, index, collection)) {
2958
          result.push(value);
2959
        }
2960
      });
2961
      return result;
2962
    }
2963
2964
    /**
2965
     * The base implementation of `_.flatten` with support for restricting flattening.
2966
     *
2967
     * @private
2968
     * @param {Array} array The array to flatten.
2969
     * @param {number} depth The maximum recursion depth.
2970
     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
2971
     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
2972
     * @param {Array} [result=[]] The initial result value.
2973
     * @returns {Array} Returns the new flattened array.
2974
     */
2975
    function baseFlatten(array, depth, predicate, isStrict, result) {
2976
      var index = -1,
2977
          length = array.length;
2978
2979
      predicate || (predicate = isFlattenable);
2980
      result || (result = []);
2981
2982
      while (++index < length) {
2983
        var value = array[index];
2984
        if (depth > 0 && predicate(value)) {
2985
          if (depth > 1) {
2986
            // Recursively flatten arrays (susceptible to call stack limits).
2987
            baseFlatten(value, depth - 1, predicate, isStrict, result);
2988
          } else {
2989
            arrayPush(result, value);
2990
          }
2991
        } else if (!isStrict) {
2992
          result[result.length] = value;
2993
        }
2994
      }
2995
      return result;
2996
    }
2997
2998
    /**
2999
     * The base implementation of `baseForOwn` which iterates over `object`
3000
     * properties returned by `keysFunc` and invokes `iteratee` for each property.
3001
     * Iteratee functions may exit iteration early by explicitly returning `false`.
3002
     *
3003
     * @private
3004
     * @param {Object} object The object to iterate over.
3005
     * @param {Function} iteratee The function invoked per iteration.
3006
     * @param {Function} keysFunc The function to get the keys of `object`.
3007
     * @returns {Object} Returns `object`.
3008
     */
3009
    var baseFor = createBaseFor();
3010
3011
    /**
3012
     * This function is like `baseFor` except that it iterates over properties
3013
     * in the opposite order.
3014
     *
3015
     * @private
3016
     * @param {Object} object The object to iterate over.
3017
     * @param {Function} iteratee The function invoked per iteration.
3018
     * @param {Function} keysFunc The function to get the keys of `object`.
3019
     * @returns {Object} Returns `object`.
3020
     */
3021
    var baseForRight = createBaseFor(true);
3022
3023
    /**
3024
     * The base implementation of `_.forOwn` without support for iteratee shorthands.
3025
     *
3026
     * @private
3027
     * @param {Object} object The object to iterate over.
3028
     * @param {Function} iteratee The function invoked per iteration.
3029
     * @returns {Object} Returns `object`.
3030
     */
3031
    function baseForOwn(object, iteratee) {
3032
      return object && baseFor(object, iteratee, keys);
3033
    }
3034
3035
    /**
3036
     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.
3037
     *
3038
     * @private
3039
     * @param {Object} object The object to iterate over.
3040
     * @param {Function} iteratee The function invoked per iteration.
3041
     * @returns {Object} Returns `object`.
3042
     */
3043
    function baseForOwnRight(object, iteratee) {
3044
      return object && baseForRight(object, iteratee, keys);
3045
    }
3046
3047
    /**
3048
     * The base implementation of `_.functions` which creates an array of
3049
     * `object` function property names filtered from `props`.
3050
     *
3051
     * @private
3052
     * @param {Object} object The object to inspect.
3053
     * @param {Array} props The property names to filter.
3054
     * @returns {Array} Returns the function names.
3055
     */
3056
    function baseFunctions(object, props) {
3057
      return arrayFilter(props, function(key) {
3058
        return isFunction(object[key]);
3059
      });
3060
    }
3061
3062
    /**
3063
     * The base implementation of `_.get` without support for default values.
3064
     *
3065
     * @private
3066
     * @param {Object} object The object to query.
3067
     * @param {Array|string} path The path of the property to get.
3068
     * @returns {*} Returns the resolved value.
3069
     */
3070
    function baseGet(object, path) {
3071
      path = castPath(path, object);
3072
3073
      var index = 0,
3074
          length = path.length;
3075
3076
      while (object != null && index < length) {
3077
        object = object[toKey(path[index++])];
3078
      }
3079
      return (index && index == length) ? object : undefined;
3080
    }
3081
3082
    /**
3083
     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
3084
     * `keysFunc` and `symbolsFunc` to get the enumerable property names and
3085
     * symbols of `object`.
3086
     *
3087
     * @private
3088
     * @param {Object} object The object to query.
3089
     * @param {Function} keysFunc The function to get the keys of `object`.
3090
     * @param {Function} symbolsFunc The function to get the symbols of `object`.
3091
     * @returns {Array} Returns the array of property names and symbols.
3092
     */
3093
    function baseGetAllKeys(object, keysFunc, symbolsFunc) {
3094
      var result = keysFunc(object);
3095
      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
3096
    }
3097
3098
    /**
3099
     * The base implementation of `getTag` without fallbacks for buggy environments.
3100
     *
3101
     * @private
3102
     * @param {*} value The value to query.
3103
     * @returns {string} Returns the `toStringTag`.
3104
     */
3105
    function baseGetTag(value) {
3106
      if (value == null) {
3107
        return value === undefined ? undefinedTag : nullTag;
3108
      }
3109
      return (symToStringTag && symToStringTag in Object(value))
3110
        ? getRawTag(value)
3111
        : objectToString(value);
3112
    }
3113
3114
    /**
3115
     * The base implementation of `_.gt` which doesn't coerce arguments.
3116
     *
3117
     * @private
3118
     * @param {*} value The value to compare.
3119
     * @param {*} other The other value to compare.
3120
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
3121
     *  else `false`.
3122
     */
3123
    function baseGt(value, other) {
3124
      return value > other;
3125
    }
3126
3127
    /**
3128
     * The base implementation of `_.has` without support for deep paths.
3129
     *
3130
     * @private
3131
     * @param {Object} [object] The object to query.
3132
     * @param {Array|string} key The key to check.
3133
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3134
     */
3135
    function baseHas(object, key) {
3136
      return object != null && hasOwnProperty.call(object, key);
3137
    }
3138
3139
    /**
3140
     * The base implementation of `_.hasIn` without support for deep paths.
3141
     *
3142
     * @private
3143
     * @param {Object} [object] The object to query.
3144
     * @param {Array|string} key The key to check.
3145
     * @returns {boolean} Returns `true` if `key` exists, else `false`.
3146
     */
3147
    function baseHasIn(object, key) {
3148
      return object != null && key in Object(object);
3149
    }
3150
3151
    /**
3152
     * The base implementation of `_.inRange` which doesn't coerce arguments.
3153
     *
3154
     * @private
3155
     * @param {number} number The number to check.
3156
     * @param {number} start The start of the range.
3157
     * @param {number} end The end of the range.
3158
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
3159
     */
3160
    function baseInRange(number, start, end) {
3161
      return number >= nativeMin(start, end) && number < nativeMax(start, end);
3162
    }
3163
3164
    /**
3165
     * The base implementation of methods like `_.intersection`, without support
3166
     * for iteratee shorthands, that accepts an array of arrays to inspect.
3167
     *
3168
     * @private
3169
     * @param {Array} arrays The arrays to inspect.
3170
     * @param {Function} [iteratee] The iteratee invoked per element.
3171
     * @param {Function} [comparator] The comparator invoked per element.
3172
     * @returns {Array} Returns the new array of shared values.
3173
     */
3174
    function baseIntersection(arrays, iteratee, comparator) {
3175
      var includes = comparator ? arrayIncludesWith : arrayIncludes,
3176
          length = arrays[0].length,
3177
          othLength = arrays.length,
3178
          othIndex = othLength,
3179
          caches = Array(othLength),
3180
          maxLength = Infinity,
3181
          result = [];
3182
3183
      while (othIndex--) {
3184
        var array = arrays[othIndex];
3185
        if (othIndex && iteratee) {
3186
          array = arrayMap(array, baseUnary(iteratee));
3187
        }
3188
        maxLength = nativeMin(array.length, maxLength);
3189
        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
3190
          ? new SetCache(othIndex && array)
3191
          : undefined;
3192
      }
3193
      array = arrays[0];
3194
3195
      var index = -1,
3196
          seen = caches[0];
3197
3198
      outer:
3199
      while (++index < length && result.length < maxLength) {
3200
        var value = array[index],
3201
            computed = iteratee ? iteratee(value) : value;
3202
3203
        value = (comparator || value !== 0) ? value : 0;
3204
        if (!(seen
3205
              ? cacheHas(seen, computed)
3206
              : includes(result, computed, comparator)
3207
            )) {
3208
          othIndex = othLength;
3209
          while (--othIndex) {
3210
            var cache = caches[othIndex];
3211
            if (!(cache
3212
                  ? cacheHas(cache, computed)
3213
                  : includes(arrays[othIndex], computed, comparator))
3214
                ) {
3215
              continue outer;
3216
            }
3217
          }
3218
          if (seen) {
3219
            seen.push(computed);
3220
          }
3221
          result.push(value);
3222
        }
3223
      }
3224
      return result;
3225
    }
3226
3227
    /**
3228
     * The base implementation of `_.invert` and `_.invertBy` which inverts
3229
     * `object` with values transformed by `iteratee` and set by `setter`.
3230
     *
3231
     * @private
3232
     * @param {Object} object The object to iterate over.
3233
     * @param {Function} setter The function to set `accumulator` values.
3234
     * @param {Function} iteratee The iteratee to transform values.
3235
     * @param {Object} accumulator The initial inverted object.
3236
     * @returns {Function} Returns `accumulator`.
3237
     */
3238
    function baseInverter(object, setter, iteratee, accumulator) {
3239
      baseForOwn(object, function(value, key, object) {
3240
        setter(accumulator, iteratee(value), key, object);
3241
      });
3242
      return accumulator;
3243
    }
3244
3245
    /**
3246
     * The base implementation of `_.invoke` without support for individual
3247
     * method arguments.
3248
     *
3249
     * @private
3250
     * @param {Object} object The object to query.
3251
     * @param {Array|string} path The path of the method to invoke.
3252
     * @param {Array} args The arguments to invoke the method with.
3253
     * @returns {*} Returns the result of the invoked method.
3254
     */
3255
    function baseInvoke(object, path, args) {
3256
      path = castPath(path, object);
3257
      object = parent(object, path);
3258
      var func = object == null ? object : object[toKey(last(path))];
3259
      return func == null ? undefined : apply(func, object, args);
3260
    }
3261
3262
    /**
3263
     * The base implementation of `_.isArguments`.
3264
     *
3265
     * @private
3266
     * @param {*} value The value to check.
3267
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
3268
     */
3269
    function baseIsArguments(value) {
3270
      return isObjectLike(value) && baseGetTag(value) == argsTag;
3271
    }
3272
3273
    /**
3274
     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.
3275
     *
3276
     * @private
3277
     * @param {*} value The value to check.
3278
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
3279
     */
3280
    function baseIsArrayBuffer(value) {
3281
      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
3282
    }
3283
3284
    /**
3285
     * The base implementation of `_.isDate` without Node.js optimizations.
3286
     *
3287
     * @private
3288
     * @param {*} value The value to check.
3289
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
3290
     */
3291
    function baseIsDate(value) {
3292
      return isObjectLike(value) && baseGetTag(value) == dateTag;
3293
    }
3294
3295
    /**
3296
     * The base implementation of `_.isEqual` which supports partial comparisons
3297
     * and tracks traversed objects.
3298
     *
3299
     * @private
3300
     * @param {*} value The value to compare.
3301
     * @param {*} other The other value to compare.
3302
     * @param {boolean} bitmask The bitmask flags.
3303
     *  1 - Unordered comparison
3304
     *  2 - Partial comparison
3305
     * @param {Function} [customizer] The function to customize comparisons.
3306
     * @param {Object} [stack] Tracks traversed `value` and `other` objects.
3307
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
3308
     */
3309
    function baseIsEqual(value, other, bitmask, customizer, stack) {
3310
      if (value === other) {
3311
        return true;
3312
      }
3313
      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
3314
        return value !== value && other !== other;
3315
      }
3316
      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
3317
    }
3318
3319
    /**
3320
     * A specialized version of `baseIsEqual` for arrays and objects which performs
3321
     * deep comparisons and tracks traversed objects enabling objects with circular
3322
     * references to be compared.
3323
     *
3324
     * @private
3325
     * @param {Object} object The object to compare.
3326
     * @param {Object} other The other object to compare.
3327
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
3328
     * @param {Function} customizer The function to customize comparisons.
3329
     * @param {Function} equalFunc The function to determine equivalents of values.
3330
     * @param {Object} [stack] Tracks traversed `object` and `other` objects.
3331
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
3332
     */
3333
    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
3334
      var objIsArr = isArray(object),
3335
          othIsArr = isArray(other),
3336
          objTag = objIsArr ? arrayTag : getTag(object),
3337
          othTag = othIsArr ? arrayTag : getTag(other);
3338
3339
      objTag = objTag == argsTag ? objectTag : objTag;
3340
      othTag = othTag == argsTag ? objectTag : othTag;
3341
3342
      var objIsObj = objTag == objectTag,
3343
          othIsObj = othTag == objectTag,
3344
          isSameTag = objTag == othTag;
3345
3346
      if (isSameTag && isBuffer(object)) {
3347
        if (!isBuffer(other)) {
3348
          return false;
3349
        }
3350
        objIsArr = true;
3351
        objIsObj = false;
3352
      }
3353
      if (isSameTag && !objIsObj) {
3354
        stack || (stack = new Stack);
3355
        return (objIsArr || isTypedArray(object))
3356
          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
3357
          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
3358
      }
3359
      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
3360
        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),
3361
            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');
3362
3363
        if (objIsWrapped || othIsWrapped) {
3364
          var objUnwrapped = objIsWrapped ? object.value() : object,
3365
              othUnwrapped = othIsWrapped ? other.value() : other;
3366
3367
          stack || (stack = new Stack);
3368
          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
3369
        }
3370
      }
3371
      if (!isSameTag) {
3372
        return false;
3373
      }
3374
      stack || (stack = new Stack);
3375
      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
3376
    }
3377
3378
    /**
3379
     * The base implementation of `_.isMap` without Node.js optimizations.
3380
     *
3381
     * @private
3382
     * @param {*} value The value to check.
3383
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
3384
     */
3385
    function baseIsMap(value) {
3386
      return isObjectLike(value) && getTag(value) == mapTag;
3387
    }
3388
3389
    /**
3390
     * The base implementation of `_.isMatch` without support for iteratee shorthands.
3391
     *
3392
     * @private
3393
     * @param {Object} object The object to inspect.
3394
     * @param {Object} source The object of property values to match.
3395
     * @param {Array} matchData The property names, values, and compare flags to match.
3396
     * @param {Function} [customizer] The function to customize comparisons.
3397
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
3398
     */
3399
    function baseIsMatch(object, source, matchData, customizer) {
3400
      var index = matchData.length,
3401
          length = index,
3402
          noCustomizer = !customizer;
3403
3404
      if (object == null) {
3405
        return !length;
3406
      }
3407
      object = Object(object);
3408
      while (index--) {
3409
        var data = matchData[index];
3410
        if ((noCustomizer && data[2])
3411
              ? data[1] !== object[data[0]]
3412
              : !(data[0] in object)
3413
            ) {
3414
          return false;
3415
        }
3416
      }
3417
      while (++index < length) {
3418
        data = matchData[index];
3419
        var key = data[0],
3420
            objValue = object[key],
3421
            srcValue = data[1];
3422
3423
        if (noCustomizer && data[2]) {
3424
          if (objValue === undefined && !(key in object)) {
3425
            return false;
3426
          }
3427
        } else {
3428
          var stack = new Stack;
3429
          if (customizer) {
3430
            var result = customizer(objValue, srcValue, key, object, source, stack);
3431
          }
3432
          if (!(result === undefined
3433
                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)
3434
                : result
3435
              )) {
3436
            return false;
3437
          }
3438
        }
3439
      }
3440
      return true;
3441
    }
3442
3443
    /**
3444
     * The base implementation of `_.isNative` without bad shim checks.
3445
     *
3446
     * @private
3447
     * @param {*} value The value to check.
3448
     * @returns {boolean} Returns `true` if `value` is a native function,
3449
     *  else `false`.
3450
     */
3451
    function baseIsNative(value) {
3452
      if (!isObject(value) || isMasked(value)) {
3453
        return false;
3454
      }
3455
      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;
3456
      return pattern.test(toSource(value));
3457
    }
3458
3459
    /**
3460
     * The base implementation of `_.isRegExp` without Node.js optimizations.
3461
     *
3462
     * @private
3463
     * @param {*} value The value to check.
3464
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
3465
     */
3466
    function baseIsRegExp(value) {
3467
      return isObjectLike(value) && baseGetTag(value) == regexpTag;
3468
    }
3469
3470
    /**
3471
     * The base implementation of `_.isSet` without Node.js optimizations.
3472
     *
3473
     * @private
3474
     * @param {*} value The value to check.
3475
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
3476
     */
3477
    function baseIsSet(value) {
3478
      return isObjectLike(value) && getTag(value) == setTag;
3479
    }
3480
3481
    /**
3482
     * The base implementation of `_.isTypedArray` without Node.js optimizations.
3483
     *
3484
     * @private
3485
     * @param {*} value The value to check.
3486
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
3487
     */
3488
    function baseIsTypedArray(value) {
3489
      return isObjectLike(value) &&
3490
        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
3491
    }
3492
3493
    /**
3494
     * The base implementation of `_.iteratee`.
3495
     *
3496
     * @private
3497
     * @param {*} [value=_.identity] The value to convert to an iteratee.
3498
     * @returns {Function} Returns the iteratee.
3499
     */
3500
    function baseIteratee(value) {
3501
      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
3502
      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
3503
      if (typeof value == 'function') {
3504
        return value;
3505
      }
3506
      if (value == null) {
3507
        return identity;
3508
      }
3509
      if (typeof value == 'object') {
3510
        return isArray(value)
3511
          ? baseMatchesProperty(value[0], value[1])
3512
          : baseMatches(value);
3513
      }
3514
      return property(value);
3515
    }
3516
3517
    /**
3518
     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
3519
     *
3520
     * @private
3521
     * @param {Object} object The object to query.
3522
     * @returns {Array} Returns the array of property names.
3523
     */
3524
    function baseKeys(object) {
3525
      if (!isPrototype(object)) {
3526
        return nativeKeys(object);
3527
      }
3528
      var result = [];
3529
      for (var key in Object(object)) {
3530
        if (hasOwnProperty.call(object, key) && key != 'constructor') {
3531
          result.push(key);
3532
        }
3533
      }
3534
      return result;
3535
    }
3536
3537
    /**
3538
     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
3539
     *
3540
     * @private
3541
     * @param {Object} object The object to query.
3542
     * @returns {Array} Returns the array of property names.
3543
     */
3544
    function baseKeysIn(object) {
3545
      if (!isObject(object)) {
3546
        return nativeKeysIn(object);
3547
      }
3548
      var isProto = isPrototype(object),
3549
          result = [];
3550
3551
      for (var key in object) {
3552
        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {
3553
          result.push(key);
3554
        }
3555
      }
3556
      return result;
3557
    }
3558
3559
    /**
3560
     * The base implementation of `_.lt` which doesn't coerce arguments.
3561
     *
3562
     * @private
3563
     * @param {*} value The value to compare.
3564
     * @param {*} other The other value to compare.
3565
     * @returns {boolean} Returns `true` if `value` is less than `other`,
3566
     *  else `false`.
3567
     */
3568
    function baseLt(value, other) {
3569
      return value < other;
3570
    }
3571
3572
    /**
3573
     * The base implementation of `_.map` without support for iteratee shorthands.
3574
     *
3575
     * @private
3576
     * @param {Array|Object} collection The collection to iterate over.
3577
     * @param {Function} iteratee The function invoked per iteration.
3578
     * @returns {Array} Returns the new mapped array.
3579
     */
3580
    function baseMap(collection, iteratee) {
3581
      var index = -1,
3582
          result = isArrayLike(collection) ? Array(collection.length) : [];
3583
3584
      baseEach(collection, function(value, key, collection) {
3585
        result[++index] = iteratee(value, key, collection);
3586
      });
3587
      return result;
3588
    }
3589
3590
    /**
3591
     * The base implementation of `_.matches` which doesn't clone `source`.
3592
     *
3593
     * @private
3594
     * @param {Object} source The object of property values to match.
3595
     * @returns {Function} Returns the new spec function.
3596
     */
3597
    function baseMatches(source) {
3598
      var matchData = getMatchData(source);
3599
      if (matchData.length == 1 && matchData[0][2]) {
3600
        return matchesStrictComparable(matchData[0][0], matchData[0][1]);
3601
      }
3602
      return function(object) {
3603
        return object === source || baseIsMatch(object, source, matchData);
3604
      };
3605
    }
3606
3607
    /**
3608
     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
3609
     *
3610
     * @private
3611
     * @param {string} path The path of the property to get.
3612
     * @param {*} srcValue The value to match.
3613
     * @returns {Function} Returns the new spec function.
3614
     */
3615
    function baseMatchesProperty(path, srcValue) {
3616
      if (isKey(path) && isStrictComparable(srcValue)) {
3617
        return matchesStrictComparable(toKey(path), srcValue);
3618
      }
3619
      return function(object) {
3620
        var objValue = get(object, path);
3621
        return (objValue === undefined && objValue === srcValue)
3622
          ? hasIn(object, path)
3623
          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
3624
      };
3625
    }
3626
3627
    /**
3628
     * The base implementation of `_.merge` without support for multiple sources.
3629
     *
3630
     * @private
3631
     * @param {Object} object The destination object.
3632
     * @param {Object} source The source object.
3633
     * @param {number} srcIndex The index of `source`.
3634
     * @param {Function} [customizer] The function to customize merged values.
3635
     * @param {Object} [stack] Tracks traversed source values and their merged
3636
     *  counterparts.
3637
     */
3638
    function baseMerge(object, source, srcIndex, customizer, stack) {
3639
      if (object === source) {
3640
        return;
3641
      }
3642
      baseFor(source, function(srcValue, key) {
3643
        stack || (stack = new Stack);
3644
        if (isObject(srcValue)) {
3645
          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
3646
        }
3647
        else {
3648
          var newValue = customizer
3649
            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)
3650
            : undefined;
3651
3652
          if (newValue === undefined) {
3653
            newValue = srcValue;
3654
          }
3655
          assignMergeValue(object, key, newValue);
3656
        }
3657
      }, keysIn);
3658
    }
3659
3660
    /**
3661
     * A specialized version of `baseMerge` for arrays and objects which performs
3662
     * deep merges and tracks traversed objects enabling objects with circular
3663
     * references to be merged.
3664
     *
3665
     * @private
3666
     * @param {Object} object The destination object.
3667
     * @param {Object} source The source object.
3668
     * @param {string} key The key of the value to merge.
3669
     * @param {number} srcIndex The index of `source`.
3670
     * @param {Function} mergeFunc The function to merge values.
3671
     * @param {Function} [customizer] The function to customize assigned values.
3672
     * @param {Object} [stack] Tracks traversed source values and their merged
3673
     *  counterparts.
3674
     */
3675
    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
3676
      var objValue = safeGet(object, key),
3677
          srcValue = safeGet(source, key),
3678
          stacked = stack.get(srcValue);
3679
3680
      if (stacked) {
3681
        assignMergeValue(object, key, stacked);
3682
        return;
3683
      }
3684
      var newValue = customizer
3685
        ? customizer(objValue, srcValue, (key + ''), object, source, stack)
3686
        : undefined;
3687
3688
      var isCommon = newValue === undefined;
3689
3690
      if (isCommon) {
3691
        var isArr = isArray(srcValue),
3692
            isBuff = !isArr && isBuffer(srcValue),
3693
            isTyped = !isArr && !isBuff && isTypedArray(srcValue);
3694
3695
        newValue = srcValue;
3696
        if (isArr || isBuff || isTyped) {
3697
          if (isArray(objValue)) {
3698
            newValue = objValue;
3699
          }
3700
          else if (isArrayLikeObject(objValue)) {
3701
            newValue = copyArray(objValue);
3702
          }
3703
          else if (isBuff) {
3704
            isCommon = false;
3705
            newValue = cloneBuffer(srcValue, true);
3706
          }
3707
          else if (isTyped) {
3708
            isCommon = false;
3709
            newValue = cloneTypedArray(srcValue, true);
3710
          }
3711
          else {
3712
            newValue = [];
3713
          }
3714
        }
3715
        else if (isPlainObject(srcValue) || isArguments(srcValue)) {
3716
          newValue = objValue;
3717
          if (isArguments(objValue)) {
3718
            newValue = toPlainObject(objValue);
3719
          }
3720
          else if (!isObject(objValue) || isFunction(objValue)) {
3721
            newValue = initCloneObject(srcValue);
3722
          }
3723
        }
3724
        else {
3725
          isCommon = false;
3726
        }
3727
      }
3728
      if (isCommon) {
3729
        // Recursively merge objects and arrays (susceptible to call stack limits).
3730
        stack.set(srcValue, newValue);
3731
        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
3732
        stack['delete'](srcValue);
3733
      }
3734
      assignMergeValue(object, key, newValue);
3735
    }
3736
3737
    /**
3738
     * The base implementation of `_.nth` which doesn't coerce arguments.
3739
     *
3740
     * @private
3741
     * @param {Array} array The array to query.
3742
     * @param {number} n The index of the element to return.
3743
     * @returns {*} Returns the nth element of `array`.
3744
     */
3745
    function baseNth(array, n) {
3746
      var length = array.length;
3747
      if (!length) {
3748
        return;
3749
      }
3750
      n += n < 0 ? length : 0;
3751
      return isIndex(n, length) ? array[n] : undefined;
3752
    }
3753
3754
    /**
3755
     * The base implementation of `_.orderBy` without param guards.
3756
     *
3757
     * @private
3758
     * @param {Array|Object} collection The collection to iterate over.
3759
     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.
3760
     * @param {string[]} orders The sort orders of `iteratees`.
3761
     * @returns {Array} Returns the new sorted array.
3762
     */
3763
    function baseOrderBy(collection, iteratees, orders) {
3764
      if (iteratees.length) {
3765
        iteratees = arrayMap(iteratees, function(iteratee) {
3766
          if (isArray(iteratee)) {
3767
            return function(value) {
3768
              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);
3769
            }
3770
          }
3771
          return iteratee;
3772
        });
3773
      } else {
3774
        iteratees = [identity];
3775
      }
3776
3777
      var index = -1;
3778
      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
3779
3780
      var result = baseMap(collection, function(value, key, collection) {
3781
        var criteria = arrayMap(iteratees, function(iteratee) {
3782
          return iteratee(value);
3783
        });
3784
        return { 'criteria': criteria, 'index': ++index, 'value': value };
3785
      });
3786
3787
      return baseSortBy(result, function(object, other) {
3788
        return compareMultiple(object, other, orders);
3789
      });
3790
    }
3791
3792
    /**
3793
     * The base implementation of `_.pick` without support for individual
3794
     * property identifiers.
3795
     *
3796
     * @private
3797
     * @param {Object} object The source object.
3798
     * @param {string[]} paths The property paths to pick.
3799
     * @returns {Object} Returns the new object.
3800
     */
3801
    function basePick(object, paths) {
3802
      return basePickBy(object, paths, function(value, path) {
3803
        return hasIn(object, path);
3804
      });
3805
    }
3806
3807
    /**
3808
     * The base implementation of  `_.pickBy` without support for iteratee shorthands.
3809
     *
3810
     * @private
3811
     * @param {Object} object The source object.
3812
     * @param {string[]} paths The property paths to pick.
3813
     * @param {Function} predicate The function invoked per property.
3814
     * @returns {Object} Returns the new object.
3815
     */
3816
    function basePickBy(object, paths, predicate) {
3817
      var index = -1,
3818
          length = paths.length,
3819
          result = {};
3820
3821
      while (++index < length) {
3822
        var path = paths[index],
3823
            value = baseGet(object, path);
3824
3825
        if (predicate(value, path)) {
3826
          baseSet(result, castPath(path, object), value);
3827
        }
3828
      }
3829
      return result;
3830
    }
3831
3832
    /**
3833
     * A specialized version of `baseProperty` which supports deep paths.
3834
     *
3835
     * @private
3836
     * @param {Array|string} path The path of the property to get.
3837
     * @returns {Function} Returns the new accessor function.
3838
     */
3839
    function basePropertyDeep(path) {
3840
      return function(object) {
3841
        return baseGet(object, path);
3842
      };
3843
    }
3844
3845
    /**
3846
     * The base implementation of `_.pullAllBy` without support for iteratee
3847
     * shorthands.
3848
     *
3849
     * @private
3850
     * @param {Array} array The array to modify.
3851
     * @param {Array} values The values to remove.
3852
     * @param {Function} [iteratee] The iteratee invoked per element.
3853
     * @param {Function} [comparator] The comparator invoked per element.
3854
     * @returns {Array} Returns `array`.
3855
     */
3856
    function basePullAll(array, values, iteratee, comparator) {
3857
      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
3858
          index = -1,
3859
          length = values.length,
3860
          seen = array;
3861
3862
      if (array === values) {
3863
        values = copyArray(values);
3864
      }
3865
      if (iteratee) {
3866
        seen = arrayMap(array, baseUnary(iteratee));
3867
      }
3868
      while (++index < length) {
3869
        var fromIndex = 0,
3870
            value = values[index],
3871
            computed = iteratee ? iteratee(value) : value;
3872
3873
        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
3874
          if (seen !== array) {
3875
            splice.call(seen, fromIndex, 1);
3876
          }
3877
          splice.call(array, fromIndex, 1);
3878
        }
3879
      }
3880
      return array;
3881
    }
3882
3883
    /**
3884
     * The base implementation of `_.pullAt` without support for individual
3885
     * indexes or capturing the removed elements.
3886
     *
3887
     * @private
3888
     * @param {Array} array The array to modify.
3889
     * @param {number[]} indexes The indexes of elements to remove.
3890
     * @returns {Array} Returns `array`.
3891
     */
3892
    function basePullAt(array, indexes) {
3893
      var length = array ? indexes.length : 0,
3894
          lastIndex = length - 1;
3895
3896
      while (length--) {
3897
        var index = indexes[length];
3898
        if (length == lastIndex || index !== previous) {
3899
          var previous = index;
3900
          if (isIndex(index)) {
3901
            splice.call(array, index, 1);
3902
          } else {
3903
            baseUnset(array, index);
3904
          }
3905
        }
3906
      }
3907
      return array;
3908
    }
3909
3910
    /**
3911
     * The base implementation of `_.random` without support for returning
3912
     * floating-point numbers.
3913
     *
3914
     * @private
3915
     * @param {number} lower The lower bound.
3916
     * @param {number} upper The upper bound.
3917
     * @returns {number} Returns the random number.
3918
     */
3919
    function baseRandom(lower, upper) {
3920
      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
3921
    }
3922
3923
    /**
3924
     * The base implementation of `_.range` and `_.rangeRight` which doesn't
3925
     * coerce arguments.
3926
     *
3927
     * @private
3928
     * @param {number} start The start of the range.
3929
     * @param {number} end The end of the range.
3930
     * @param {number} step The value to increment or decrement by.
3931
     * @param {boolean} [fromRight] Specify iterating from right to left.
3932
     * @returns {Array} Returns the range of numbers.
3933
     */
3934
    function baseRange(start, end, step, fromRight) {
3935
      var index = -1,
3936
          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),
3937
          result = Array(length);
3938
3939
      while (length--) {
3940
        result[fromRight ? length : ++index] = start;
3941
        start += step;
3942
      }
3943
      return result;
3944
    }
3945
3946
    /**
3947
     * The base implementation of `_.repeat` which doesn't coerce arguments.
3948
     *
3949
     * @private
3950
     * @param {string} string The string to repeat.
3951
     * @param {number} n The number of times to repeat the string.
3952
     * @returns {string} Returns the repeated string.
3953
     */
3954
    function baseRepeat(string, n) {
3955
      var result = '';
3956
      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {
3957
        return result;
3958
      }
3959
      // Leverage the exponentiation by squaring algorithm for a faster repeat.
3960
      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.
3961
      do {
3962
        if (n % 2) {
3963
          result += string;
3964
        }
3965
        n = nativeFloor(n / 2);
3966
        if (n) {
3967
          string += string;
3968
        }
3969
      } while (n);
3970
3971
      return result;
3972
    }
3973
3974
    /**
3975
     * The base implementation of `_.rest` which doesn't validate or coerce arguments.
3976
     *
3977
     * @private
3978
     * @param {Function} func The function to apply a rest parameter to.
3979
     * @param {number} [start=func.length-1] The start position of the rest parameter.
3980
     * @returns {Function} Returns the new function.
3981
     */
3982
    function baseRest(func, start) {
3983
      return setToString(overRest(func, start, identity), func + '');
3984
    }
3985
3986
    /**
3987
     * The base implementation of `_.sample`.
3988
     *
3989
     * @private
3990
     * @param {Array|Object} collection The collection to sample.
3991
     * @returns {*} Returns the random element.
3992
     */
3993
    function baseSample(collection) {
3994
      return arraySample(values(collection));
3995
    }
3996
3997
    /**
3998
     * The base implementation of `_.sampleSize` without param guards.
3999
     *
4000
     * @private
4001
     * @param {Array|Object} collection The collection to sample.
4002
     * @param {number} n The number of elements to sample.
4003
     * @returns {Array} Returns the random elements.
4004
     */
4005
    function baseSampleSize(collection, n) {
4006
      var array = values(collection);
4007
      return shuffleSelf(array, baseClamp(n, 0, array.length));
4008
    }
4009
4010
    /**
4011
     * The base implementation of `_.set`.
4012
     *
4013
     * @private
4014
     * @param {Object} object The object to modify.
4015
     * @param {Array|string} path The path of the property to set.
4016
     * @param {*} value The value to set.
4017
     * @param {Function} [customizer] The function to customize path creation.
4018
     * @returns {Object} Returns `object`.
4019
     */
4020
    function baseSet(object, path, value, customizer) {
4021
      if (!isObject(object)) {
4022
        return object;
4023
      }
4024
      path = castPath(path, object);
4025
4026
      var index = -1,
4027
          length = path.length,
4028
          lastIndex = length - 1,
4029
          nested = object;
4030
4031
      while (nested != null && ++index < length) {
4032
        var key = toKey(path[index]),
4033
            newValue = value;
4034
4035
        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
4036
          return object;
4037
        }
4038
4039
        if (index != lastIndex) {
4040
          var objValue = nested[key];
4041
          newValue = customizer ? customizer(objValue, key, nested) : undefined;
4042
          if (newValue === undefined) {
4043
            newValue = isObject(objValue)
4044
              ? objValue
4045
              : (isIndex(path[index + 1]) ? [] : {});
4046
          }
4047
        }
4048
        assignValue(nested, key, newValue);
4049
        nested = nested[key];
4050
      }
4051
      return object;
4052
    }
4053
4054
    /**
4055
     * The base implementation of `setData` without support for hot loop shorting.
4056
     *
4057
     * @private
4058
     * @param {Function} func The function to associate metadata with.
4059
     * @param {*} data The metadata.
4060
     * @returns {Function} Returns `func`.
4061
     */
4062
    var baseSetData = !metaMap ? identity : function(func, data) {
4063
      metaMap.set(func, data);
4064
      return func;
4065
    };
4066
4067
    /**
4068
     * The base implementation of `setToString` without support for hot loop shorting.
4069
     *
4070
     * @private
4071
     * @param {Function} func The function to modify.
4072
     * @param {Function} string The `toString` result.
4073
     * @returns {Function} Returns `func`.
4074
     */
4075
    var baseSetToString = !defineProperty ? identity : function(func, string) {
4076
      return defineProperty(func, 'toString', {
4077
        'configurable': true,
4078
        'enumerable': false,
4079
        'value': constant(string),
4080
        'writable': true
4081
      });
4082
    };
4083
4084
    /**
4085
     * The base implementation of `_.shuffle`.
4086
     *
4087
     * @private
4088
     * @param {Array|Object} collection The collection to shuffle.
4089
     * @returns {Array} Returns the new shuffled array.
4090
     */
4091
    function baseShuffle(collection) {
4092
      return shuffleSelf(values(collection));
4093
    }
4094
4095
    /**
4096
     * The base implementation of `_.slice` without an iteratee call guard.
4097
     *
4098
     * @private
4099
     * @param {Array} array The array to slice.
4100
     * @param {number} [start=0] The start position.
4101
     * @param {number} [end=array.length] The end position.
4102
     * @returns {Array} Returns the slice of `array`.
4103
     */
4104
    function baseSlice(array, start, end) {
4105
      var index = -1,
4106
          length = array.length;
4107
4108
      if (start < 0) {
4109
        start = -start > length ? 0 : (length + start);
4110
      }
4111
      end = end > length ? length : end;
4112
      if (end < 0) {
4113
        end += length;
4114
      }
4115
      length = start > end ? 0 : ((end - start) >>> 0);
4116
      start >>>= 0;
4117
4118
      var result = Array(length);
4119
      while (++index < length) {
4120
        result[index] = array[index + start];
4121
      }
4122
      return result;
4123
    }
4124
4125
    /**
4126
     * The base implementation of `_.some` without support for iteratee shorthands.
4127
     *
4128
     * @private
4129
     * @param {Array|Object} collection The collection to iterate over.
4130
     * @param {Function} predicate The function invoked per iteration.
4131
     * @returns {boolean} Returns `true` if any element passes the predicate check,
4132
     *  else `false`.
4133
     */
4134
    function baseSome(collection, predicate) {
4135
      var result;
4136
4137
      baseEach(collection, function(value, index, collection) {
4138
        result = predicate(value, index, collection);
4139
        return !result;
4140
      });
4141
      return !!result;
4142
    }
4143
4144
    /**
4145
     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which
4146
     * performs a binary search of `array` to determine the index at which `value`
4147
     * should be inserted into `array` in order to maintain its sort order.
4148
     *
4149
     * @private
4150
     * @param {Array} array The sorted array to inspect.
4151
     * @param {*} value The value to evaluate.
4152
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4153
     * @returns {number} Returns the index at which `value` should be inserted
4154
     *  into `array`.
4155
     */
4156
    function baseSortedIndex(array, value, retHighest) {
4157
      var low = 0,
4158
          high = array == null ? low : array.length;
4159
4160
      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
4161
        while (low < high) {
4162
          var mid = (low + high) >>> 1,
4163
              computed = array[mid];
4164
4165
          if (computed !== null && !isSymbol(computed) &&
4166
              (retHighest ? (computed <= value) : (computed < value))) {
4167
            low = mid + 1;
4168
          } else {
4169
            high = mid;
4170
          }
4171
        }
4172
        return high;
4173
      }
4174
      return baseSortedIndexBy(array, value, identity, retHighest);
4175
    }
4176
4177
    /**
4178
     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`
4179
     * which invokes `iteratee` for `value` and each element of `array` to compute
4180
     * their sort ranking. The iteratee is invoked with one argument; (value).
4181
     *
4182
     * @private
4183
     * @param {Array} array The sorted array to inspect.
4184
     * @param {*} value The value to evaluate.
4185
     * @param {Function} iteratee The iteratee invoked per element.
4186
     * @param {boolean} [retHighest] Specify returning the highest qualified index.
4187
     * @returns {number} Returns the index at which `value` should be inserted
4188
     *  into `array`.
4189
     */
4190
    function baseSortedIndexBy(array, value, iteratee, retHighest) {
4191
      var low = 0,
4192
          high = array == null ? 0 : array.length;
4193
      if (high === 0) {
4194
        return 0;
4195
      }
4196
4197
      value = iteratee(value);
4198
      var valIsNaN = value !== value,
4199
          valIsNull = value === null,
4200
          valIsSymbol = isSymbol(value),
4201
          valIsUndefined = value === undefined;
4202
4203
      while (low < high) {
4204
        var mid = nativeFloor((low + high) / 2),
4205
            computed = iteratee(array[mid]),
4206
            othIsDefined = computed !== undefined,
4207
            othIsNull = computed === null,
4208
            othIsReflexive = computed === computed,
4209
            othIsSymbol = isSymbol(computed);
4210
4211
        if (valIsNaN) {
4212
          var setLow = retHighest || othIsReflexive;
4213
        } else if (valIsUndefined) {
4214
          setLow = othIsReflexive && (retHighest || othIsDefined);
4215
        } else if (valIsNull) {
4216
          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
4217
        } else if (valIsSymbol) {
4218
          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
4219
        } else if (othIsNull || othIsSymbol) {
4220
          setLow = false;
4221
        } else {
4222
          setLow = retHighest ? (computed <= value) : (computed < value);
4223
        }
4224
        if (setLow) {
4225
          low = mid + 1;
4226
        } else {
4227
          high = mid;
4228
        }
4229
      }
4230
      return nativeMin(high, MAX_ARRAY_INDEX);
4231
    }
4232
4233
    /**
4234
     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without
4235
     * support for iteratee shorthands.
4236
     *
4237
     * @private
4238
     * @param {Array} array The array to inspect.
4239
     * @param {Function} [iteratee] The iteratee invoked per element.
4240
     * @returns {Array} Returns the new duplicate free array.
4241
     */
4242
    function baseSortedUniq(array, iteratee) {
4243
      var index = -1,
4244
          length = array.length,
4245
          resIndex = 0,
4246
          result = [];
4247
4248
      while (++index < length) {
4249
        var value = array[index],
4250
            computed = iteratee ? iteratee(value) : value;
4251
4252
        if (!index || !eq(computed, seen)) {
4253
          var seen = computed;
4254
          result[resIndex++] = value === 0 ? 0 : value;
4255
        }
4256
      }
4257
      return result;
4258
    }
4259
4260
    /**
4261
     * The base implementation of `_.toNumber` which doesn't ensure correct
4262
     * conversions of binary, hexadecimal, or octal string values.
4263
     *
4264
     * @private
4265
     * @param {*} value The value to process.
4266
     * @returns {number} Returns the number.
4267
     */
4268
    function baseToNumber(value) {
4269
      if (typeof value == 'number') {
4270
        return value;
4271
      }
4272
      if (isSymbol(value)) {
4273
        return NAN;
4274
      }
4275
      return +value;
4276
    }
4277
4278
    /**
4279
     * The base implementation of `_.toString` which doesn't convert nullish
4280
     * values to empty strings.
4281
     *
4282
     * @private
4283
     * @param {*} value The value to process.
4284
     * @returns {string} Returns the string.
4285
     */
4286
    function baseToString(value) {
4287
      // Exit early for strings to avoid a performance hit in some environments.
4288
      if (typeof value == 'string') {
4289
        return value;
4290
      }
4291
      if (isArray(value)) {
4292
        // Recursively convert values (susceptible to call stack limits).
4293
        return arrayMap(value, baseToString) + '';
4294
      }
4295
      if (isSymbol(value)) {
4296
        return symbolToString ? symbolToString.call(value) : '';
4297
      }
4298
      var result = (value + '');
4299
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
4300
    }
4301
4302
    /**
4303
     * The base implementation of `_.uniqBy` without support for iteratee shorthands.
4304
     *
4305
     * @private
4306
     * @param {Array} array The array to inspect.
4307
     * @param {Function} [iteratee] The iteratee invoked per element.
4308
     * @param {Function} [comparator] The comparator invoked per element.
4309
     * @returns {Array} Returns the new duplicate free array.
4310
     */
4311
    function baseUniq(array, iteratee, comparator) {
4312
      var index = -1,
4313
          includes = arrayIncludes,
4314
          length = array.length,
4315
          isCommon = true,
4316
          result = [],
4317
          seen = result;
4318
4319
      if (comparator) {
4320
        isCommon = false;
4321
        includes = arrayIncludesWith;
4322
      }
4323
      else if (length >= LARGE_ARRAY_SIZE) {
4324
        var set = iteratee ? null : createSet(array);
4325
        if (set) {
4326
          return setToArray(set);
4327
        }
4328
        isCommon = false;
4329
        includes = cacheHas;
4330
        seen = new SetCache;
4331
      }
4332
      else {
4333
        seen = iteratee ? [] : result;
4334
      }
4335
      outer:
4336
      while (++index < length) {
4337
        var value = array[index],
4338
            computed = iteratee ? iteratee(value) : value;
4339
4340
        value = (comparator || value !== 0) ? value : 0;
4341
        if (isCommon && computed === computed) {
4342
          var seenIndex = seen.length;
4343
          while (seenIndex--) {
4344
            if (seen[seenIndex] === computed) {
4345
              continue outer;
4346
            }
4347
          }
4348
          if (iteratee) {
4349
            seen.push(computed);
4350
          }
4351
          result.push(value);
4352
        }
4353
        else if (!includes(seen, computed, comparator)) {
4354
          if (seen !== result) {
4355
            seen.push(computed);
4356
          }
4357
          result.push(value);
4358
        }
4359
      }
4360
      return result;
4361
    }
4362
4363
    /**
4364
     * The base implementation of `_.unset`.
4365
     *
4366
     * @private
4367
     * @param {Object} object The object to modify.
4368
     * @param {Array|string} path The property path to unset.
4369
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
4370
     */
4371
    function baseUnset(object, path) {
4372
      path = castPath(path, object);
4373
      object = parent(object, path);
4374
      return object == null || delete object[toKey(last(path))];
4375
    }
4376
4377
    /**
4378
     * The base implementation of `_.update`.
4379
     *
4380
     * @private
4381
     * @param {Object} object The object to modify.
4382
     * @param {Array|string} path The path of the property to update.
4383
     * @param {Function} updater The function to produce the updated value.
4384
     * @param {Function} [customizer] The function to customize path creation.
4385
     * @returns {Object} Returns `object`.
4386
     */
4387
    function baseUpdate(object, path, updater, customizer) {
4388
      return baseSet(object, path, updater(baseGet(object, path)), customizer);
4389
    }
4390
4391
    /**
4392
     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`
4393
     * without support for iteratee shorthands.
4394
     *
4395
     * @private
4396
     * @param {Array} array The array to query.
4397
     * @param {Function} predicate The function invoked per iteration.
4398
     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.
4399
     * @param {boolean} [fromRight] Specify iterating from right to left.
4400
     * @returns {Array} Returns the slice of `array`.
4401
     */
4402
    function baseWhile(array, predicate, isDrop, fromRight) {
4403
      var length = array.length,
4404
          index = fromRight ? length : -1;
4405
4406
      while ((fromRight ? index-- : ++index < length) &&
4407
        predicate(array[index], index, array)) {}
4408
4409
      return isDrop
4410
        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))
4411
        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));
4412
    }
4413
4414
    /**
4415
     * The base implementation of `wrapperValue` which returns the result of
4416
     * performing a sequence of actions on the unwrapped `value`, where each
4417
     * successive action is supplied the return value of the previous.
4418
     *
4419
     * @private
4420
     * @param {*} value The unwrapped value.
4421
     * @param {Array} actions Actions to perform to resolve the unwrapped value.
4422
     * @returns {*} Returns the resolved value.
4423
     */
4424
    function baseWrapperValue(value, actions) {
4425
      var result = value;
4426
      if (result instanceof LazyWrapper) {
4427
        result = result.value();
4428
      }
4429
      return arrayReduce(actions, function(result, action) {
4430
        return action.func.apply(action.thisArg, arrayPush([result], action.args));
4431
      }, result);
4432
    }
4433
4434
    /**
4435
     * The base implementation of methods like `_.xor`, without support for
4436
     * iteratee shorthands, that accepts an array of arrays to inspect.
4437
     *
4438
     * @private
4439
     * @param {Array} arrays The arrays to inspect.
4440
     * @param {Function} [iteratee] The iteratee invoked per element.
4441
     * @param {Function} [comparator] The comparator invoked per element.
4442
     * @returns {Array} Returns the new array of values.
4443
     */
4444
    function baseXor(arrays, iteratee, comparator) {
4445
      var length = arrays.length;
4446
      if (length < 2) {
4447
        return length ? baseUniq(arrays[0]) : [];
4448
      }
4449
      var index = -1,
4450
          result = Array(length);
4451
4452
      while (++index < length) {
4453
        var array = arrays[index],
4454
            othIndex = -1;
4455
4456
        while (++othIndex < length) {
4457
          if (othIndex != index) {
4458
            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);
4459
          }
4460
        }
4461
      }
4462
      return baseUniq(baseFlatten(result, 1), iteratee, comparator);
4463
    }
4464
4465
    /**
4466
     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
4467
     *
4468
     * @private
4469
     * @param {Array} props The property identifiers.
4470
     * @param {Array} values The property values.
4471
     * @param {Function} assignFunc The function to assign values.
4472
     * @returns {Object} Returns the new object.
4473
     */
4474
    function baseZipObject(props, values, assignFunc) {
4475
      var index = -1,
4476
          length = props.length,
4477
          valsLength = values.length,
4478
          result = {};
4479
4480
      while (++index < length) {
4481
        var value = index < valsLength ? values[index] : undefined;
4482
        assignFunc(result, props[index], value);
4483
      }
4484
      return result;
4485
    }
4486
4487
    /**
4488
     * Casts `value` to an empty array if it's not an array like object.
4489
     *
4490
     * @private
4491
     * @param {*} value The value to inspect.
4492
     * @returns {Array|Object} Returns the cast array-like object.
4493
     */
4494
    function castArrayLikeObject(value) {
4495
      return isArrayLikeObject(value) ? value : [];
4496
    }
4497
4498
    /**
4499
     * Casts `value` to `identity` if it's not a function.
4500
     *
4501
     * @private
4502
     * @param {*} value The value to inspect.
4503
     * @returns {Function} Returns cast function.
4504
     */
4505
    function castFunction(value) {
4506
      return typeof value == 'function' ? value : identity;
4507
    }
4508
4509
    /**
4510
     * Casts `value` to a path array if it's not one.
4511
     *
4512
     * @private
4513
     * @param {*} value The value to inspect.
4514
     * @param {Object} [object] The object to query keys on.
4515
     * @returns {Array} Returns the cast property path array.
4516
     */
4517
    function castPath(value, object) {
4518
      if (isArray(value)) {
4519
        return value;
4520
      }
4521
      return isKey(value, object) ? [value] : stringToPath(toString(value));
4522
    }
4523
4524
    /**
4525
     * A `baseRest` alias which can be replaced with `identity` by module
4526
     * replacement plugins.
4527
     *
4528
     * @private
4529
     * @type {Function}
4530
     * @param {Function} func The function to apply a rest parameter to.
4531
     * @returns {Function} Returns the new function.
4532
     */
4533
    var castRest = baseRest;
4534
4535
    /**
4536
     * Casts `array` to a slice if it's needed.
4537
     *
4538
     * @private
4539
     * @param {Array} array The array to inspect.
4540
     * @param {number} start The start position.
4541
     * @param {number} [end=array.length] The end position.
4542
     * @returns {Array} Returns the cast slice.
4543
     */
4544
    function castSlice(array, start, end) {
4545
      var length = array.length;
4546
      end = end === undefined ? length : end;
4547
      return (!start && end >= length) ? array : baseSlice(array, start, end);
4548
    }
4549
4550
    /**
4551
     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).
4552
     *
4553
     * @private
4554
     * @param {number|Object} id The timer id or timeout object of the timer to clear.
4555
     */
4556
    var clearTimeout = ctxClearTimeout || function(id) {
4557
      return root.clearTimeout(id);
4558
    };
4559
4560
    /**
4561
     * Creates a clone of  `buffer`.
4562
     *
4563
     * @private
4564
     * @param {Buffer} buffer The buffer to clone.
4565
     * @param {boolean} [isDeep] Specify a deep clone.
4566
     * @returns {Buffer} Returns the cloned buffer.
4567
     */
4568
    function cloneBuffer(buffer, isDeep) {
4569
      if (isDeep) {
4570
        return buffer.slice();
4571
      }
4572
      var length = buffer.length,
4573
          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
4574
4575
      buffer.copy(result);
4576
      return result;
4577
    }
4578
4579
    /**
4580
     * Creates a clone of `arrayBuffer`.
4581
     *
4582
     * @private
4583
     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
4584
     * @returns {ArrayBuffer} Returns the cloned array buffer.
4585
     */
4586
    function cloneArrayBuffer(arrayBuffer) {
4587
      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
4588
      new Uint8Array(result).set(new Uint8Array(arrayBuffer));
4589
      return result;
4590
    }
4591
4592
    /**
4593
     * Creates a clone of `dataView`.
4594
     *
4595
     * @private
4596
     * @param {Object} dataView The data view to clone.
4597
     * @param {boolean} [isDeep] Specify a deep clone.
4598
     * @returns {Object} Returns the cloned data view.
4599
     */
4600
    function cloneDataView(dataView, isDeep) {
4601
      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
4602
      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
4603
    }
4604
4605
    /**
4606
     * Creates a clone of `regexp`.
4607
     *
4608
     * @private
4609
     * @param {Object} regexp The regexp to clone.
4610
     * @returns {Object} Returns the cloned regexp.
4611
     */
4612
    function cloneRegExp(regexp) {
4613
      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
4614
      result.lastIndex = regexp.lastIndex;
4615
      return result;
4616
    }
4617
4618
    /**
4619
     * Creates a clone of the `symbol` object.
4620
     *
4621
     * @private
4622
     * @param {Object} symbol The symbol object to clone.
4623
     * @returns {Object} Returns the cloned symbol object.
4624
     */
4625
    function cloneSymbol(symbol) {
4626
      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
4627
    }
4628
4629
    /**
4630
     * Creates a clone of `typedArray`.
4631
     *
4632
     * @private
4633
     * @param {Object} typedArray The typed array to clone.
4634
     * @param {boolean} [isDeep] Specify a deep clone.
4635
     * @returns {Object} Returns the cloned typed array.
4636
     */
4637
    function cloneTypedArray(typedArray, isDeep) {
4638
      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
4639
      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
4640
    }
4641
4642
    /**
4643
     * Compares values to sort them in ascending order.
4644
     *
4645
     * @private
4646
     * @param {*} value The value to compare.
4647
     * @param {*} other The other value to compare.
4648
     * @returns {number} Returns the sort order indicator for `value`.
4649
     */
4650
    function compareAscending(value, other) {
4651
      if (value !== other) {
4652
        var valIsDefined = value !== undefined,
4653
            valIsNull = value === null,
4654
            valIsReflexive = value === value,
4655
            valIsSymbol = isSymbol(value);
4656
4657
        var othIsDefined = other !== undefined,
4658
            othIsNull = other === null,
4659
            othIsReflexive = other === other,
4660
            othIsSymbol = isSymbol(other);
4661
4662
        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||
4663
            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||
4664
            (valIsNull && othIsDefined && othIsReflexive) ||
4665
            (!valIsDefined && othIsReflexive) ||
4666
            !valIsReflexive) {
4667
          return 1;
4668
        }
4669
        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||
4670
            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||
4671
            (othIsNull && valIsDefined && valIsReflexive) ||
4672
            (!othIsDefined && valIsReflexive) ||
4673
            !othIsReflexive) {
4674
          return -1;
4675
        }
4676
      }
4677
      return 0;
4678
    }
4679
4680
    /**
4681
     * Used by `_.orderBy` to compare multiple properties of a value to another
4682
     * and stable sort them.
4683
     *
4684
     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,
4685
     * specify an order of "desc" for descending or "asc" for ascending sort order
4686
     * of corresponding values.
4687
     *
4688
     * @private
4689
     * @param {Object} object The object to compare.
4690
     * @param {Object} other The other object to compare.
4691
     * @param {boolean[]|string[]} orders The order to sort by for each property.
4692
     * @returns {number} Returns the sort order indicator for `object`.
4693
     */
4694
    function compareMultiple(object, other, orders) {
4695
      var index = -1,
4696
          objCriteria = object.criteria,
4697
          othCriteria = other.criteria,
4698
          length = objCriteria.length,
4699
          ordersLength = orders.length;
4700
4701
      while (++index < length) {
4702
        var result = compareAscending(objCriteria[index], othCriteria[index]);
4703
        if (result) {
4704
          if (index >= ordersLength) {
4705
            return result;
4706
          }
4707
          var order = orders[index];
4708
          return result * (order == 'desc' ? -1 : 1);
4709
        }
4710
      }
4711
      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications
4712
      // that causes it, under certain circumstances, to provide the same value for
4713
      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247
4714
      // for more details.
4715
      //
4716
      // This also ensures a stable sort in V8 and other engines.
4717
      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.
4718
      return object.index - other.index;
4719
    }
4720
4721
    /**
4722
     * Creates an array that is the composition of partially applied arguments,
4723
     * placeholders, and provided arguments into a single array of arguments.
4724
     *
4725
     * @private
4726
     * @param {Array} args The provided arguments.
4727
     * @param {Array} partials The arguments to prepend to those provided.
4728
     * @param {Array} holders The `partials` placeholder indexes.
4729
     * @params {boolean} [isCurried] Specify composing for a curried function.
4730
     * @returns {Array} Returns the new array of composed arguments.
4731
     */
4732
    function composeArgs(args, partials, holders, isCurried) {
4733
      var argsIndex = -1,
4734
          argsLength = args.length,
4735
          holdersLength = holders.length,
4736
          leftIndex = -1,
4737
          leftLength = partials.length,
4738
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4739
          result = Array(leftLength + rangeLength),
4740
          isUncurried = !isCurried;
4741
4742
      while (++leftIndex < leftLength) {
4743
        result[leftIndex] = partials[leftIndex];
4744
      }
4745
      while (++argsIndex < holdersLength) {
4746
        if (isUncurried || argsIndex < argsLength) {
4747
          result[holders[argsIndex]] = args[argsIndex];
4748
        }
4749
      }
4750
      while (rangeLength--) {
4751
        result[leftIndex++] = args[argsIndex++];
4752
      }
4753
      return result;
4754
    }
4755
4756
    /**
4757
     * This function is like `composeArgs` except that the arguments composition
4758
     * is tailored for `_.partialRight`.
4759
     *
4760
     * @private
4761
     * @param {Array} args The provided arguments.
4762
     * @param {Array} partials The arguments to append to those provided.
4763
     * @param {Array} holders The `partials` placeholder indexes.
4764
     * @params {boolean} [isCurried] Specify composing for a curried function.
4765
     * @returns {Array} Returns the new array of composed arguments.
4766
     */
4767
    function composeArgsRight(args, partials, holders, isCurried) {
4768
      var argsIndex = -1,
4769
          argsLength = args.length,
4770
          holdersIndex = -1,
4771
          holdersLength = holders.length,
4772
          rightIndex = -1,
4773
          rightLength = partials.length,
4774
          rangeLength = nativeMax(argsLength - holdersLength, 0),
4775
          result = Array(rangeLength + rightLength),
4776
          isUncurried = !isCurried;
4777
4778
      while (++argsIndex < rangeLength) {
4779
        result[argsIndex] = args[argsIndex];
4780
      }
4781
      var offset = argsIndex;
4782
      while (++rightIndex < rightLength) {
4783
        result[offset + rightIndex] = partials[rightIndex];
4784
      }
4785
      while (++holdersIndex < holdersLength) {
4786
        if (isUncurried || argsIndex < argsLength) {
4787
          result[offset + holders[holdersIndex]] = args[argsIndex++];
4788
        }
4789
      }
4790
      return result;
4791
    }
4792
4793
    /**
4794
     * Copies the values of `source` to `array`.
4795
     *
4796
     * @private
4797
     * @param {Array} source The array to copy values from.
4798
     * @param {Array} [array=[]] The array to copy values to.
4799
     * @returns {Array} Returns `array`.
4800
     */
4801
    function copyArray(source, array) {
4802
      var index = -1,
4803
          length = source.length;
4804
4805
      array || (array = Array(length));
4806
      while (++index < length) {
4807
        array[index] = source[index];
4808
      }
4809
      return array;
4810
    }
4811
4812
    /**
4813
     * Copies properties of `source` to `object`.
4814
     *
4815
     * @private
4816
     * @param {Object} source The object to copy properties from.
4817
     * @param {Array} props The property identifiers to copy.
4818
     * @param {Object} [object={}] The object to copy properties to.
4819
     * @param {Function} [customizer] The function to customize copied values.
4820
     * @returns {Object} Returns `object`.
4821
     */
4822
    function copyObject(source, props, object, customizer) {
4823
      var isNew = !object;
4824
      object || (object = {});
4825
4826
      var index = -1,
4827
          length = props.length;
4828
4829
      while (++index < length) {
4830
        var key = props[index];
4831
4832
        var newValue = customizer
4833
          ? customizer(object[key], source[key], key, object, source)
4834
          : undefined;
4835
4836
        if (newValue === undefined) {
4837
          newValue = source[key];
4838
        }
4839
        if (isNew) {
4840
          baseAssignValue(object, key, newValue);
4841
        } else {
4842
          assignValue(object, key, newValue);
4843
        }
4844
      }
4845
      return object;
4846
    }
4847
4848
    /**
4849
     * Copies own symbols of `source` to `object`.
4850
     *
4851
     * @private
4852
     * @param {Object} source The object to copy symbols from.
4853
     * @param {Object} [object={}] The object to copy symbols to.
4854
     * @returns {Object} Returns `object`.
4855
     */
4856
    function copySymbols(source, object) {
4857
      return copyObject(source, getSymbols(source), object);
4858
    }
4859
4860
    /**
4861
     * Copies own and inherited symbols of `source` to `object`.
4862
     *
4863
     * @private
4864
     * @param {Object} source The object to copy symbols from.
4865
     * @param {Object} [object={}] The object to copy symbols to.
4866
     * @returns {Object} Returns `object`.
4867
     */
4868
    function copySymbolsIn(source, object) {
4869
      return copyObject(source, getSymbolsIn(source), object);
4870
    }
4871
4872
    /**
4873
     * Creates a function like `_.groupBy`.
4874
     *
4875
     * @private
4876
     * @param {Function} setter The function to set accumulator values.
4877
     * @param {Function} [initializer] The accumulator object initializer.
4878
     * @returns {Function} Returns the new aggregator function.
4879
     */
4880
    function createAggregator(setter, initializer) {
4881
      return function(collection, iteratee) {
4882
        var func = isArray(collection) ? arrayAggregator : baseAggregator,
4883
            accumulator = initializer ? initializer() : {};
4884
4885
        return func(collection, setter, getIteratee(iteratee, 2), accumulator);
4886
      };
4887
    }
4888
4889
    /**
4890
     * Creates a function like `_.assign`.
4891
     *
4892
     * @private
4893
     * @param {Function} assigner The function to assign values.
4894
     * @returns {Function} Returns the new assigner function.
4895
     */
4896
    function createAssigner(assigner) {
4897
      return baseRest(function(object, sources) {
4898
        var index = -1,
4899
            length = sources.length,
4900
            customizer = length > 1 ? sources[length - 1] : undefined,
4901
            guard = length > 2 ? sources[2] : undefined;
4902
4903
        customizer = (assigner.length > 3 && typeof customizer == 'function')
4904
          ? (length--, customizer)
4905
          : undefined;
4906
4907
        if (guard && isIterateeCall(sources[0], sources[1], guard)) {
4908
          customizer = length < 3 ? undefined : customizer;
4909
          length = 1;
4910
        }
4911
        object = Object(object);
4912
        while (++index < length) {
4913
          var source = sources[index];
4914
          if (source) {
4915
            assigner(object, source, index, customizer);
4916
          }
4917
        }
4918
        return object;
4919
      });
4920
    }
4921
4922
    /**
4923
     * Creates a `baseEach` or `baseEachRight` function.
4924
     *
4925
     * @private
4926
     * @param {Function} eachFunc The function to iterate over a collection.
4927
     * @param {boolean} [fromRight] Specify iterating from right to left.
4928
     * @returns {Function} Returns the new base function.
4929
     */
4930
    function createBaseEach(eachFunc, fromRight) {
4931
      return function(collection, iteratee) {
4932
        if (collection == null) {
4933
          return collection;
4934
        }
4935
        if (!isArrayLike(collection)) {
4936
          return eachFunc(collection, iteratee);
4937
        }
4938
        var length = collection.length,
4939
            index = fromRight ? length : -1,
4940
            iterable = Object(collection);
4941
4942
        while ((fromRight ? index-- : ++index < length)) {
4943
          if (iteratee(iterable[index], index, iterable) === false) {
4944
            break;
4945
          }
4946
        }
4947
        return collection;
4948
      };
4949
    }
4950
4951
    /**
4952
     * Creates a base function for methods like `_.forIn` and `_.forOwn`.
4953
     *
4954
     * @private
4955
     * @param {boolean} [fromRight] Specify iterating from right to left.
4956
     * @returns {Function} Returns the new base function.
4957
     */
4958
    function createBaseFor(fromRight) {
4959
      return function(object, iteratee, keysFunc) {
4960
        var index = -1,
4961
            iterable = Object(object),
4962
            props = keysFunc(object),
4963
            length = props.length;
4964
4965
        while (length--) {
4966
          var key = props[fromRight ? length : ++index];
4967
          if (iteratee(iterable[key], key, iterable) === false) {
4968
            break;
4969
          }
4970
        }
4971
        return object;
4972
      };
4973
    }
4974
4975
    /**
4976
     * Creates a function that wraps `func` to invoke it with the optional `this`
4977
     * binding of `thisArg`.
4978
     *
4979
     * @private
4980
     * @param {Function} func The function to wrap.
4981
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
4982
     * @param {*} [thisArg] The `this` binding of `func`.
4983
     * @returns {Function} Returns the new wrapped function.
4984
     */
4985
    function createBind(func, bitmask, thisArg) {
4986
      var isBind = bitmask & WRAP_BIND_FLAG,
4987
          Ctor = createCtor(func);
4988
4989
      function wrapper() {
4990
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
4991
        return fn.apply(isBind ? thisArg : this, arguments);
4992
      }
4993
      return wrapper;
4994
    }
4995
4996
    /**
4997
     * Creates a function like `_.lowerFirst`.
4998
     *
4999
     * @private
5000
     * @param {string} methodName The name of the `String` case method to use.
5001
     * @returns {Function} Returns the new case function.
5002
     */
5003
    function createCaseFirst(methodName) {
5004
      return function(string) {
5005
        string = toString(string);
5006
5007
        var strSymbols = hasUnicode(string)
5008
          ? stringToArray(string)
5009
          : undefined;
5010
5011
        var chr = strSymbols
5012
          ? strSymbols[0]
5013
          : string.charAt(0);
5014
5015
        var trailing = strSymbols
5016
          ? castSlice(strSymbols, 1).join('')
5017
          : string.slice(1);
5018
5019
        return chr[methodName]() + trailing;
5020
      };
5021
    }
5022
5023
    /**
5024
     * Creates a function like `_.camelCase`.
5025
     *
5026
     * @private
5027
     * @param {Function} callback The function to combine each word.
5028
     * @returns {Function} Returns the new compounder function.
5029
     */
5030
    function createCompounder(callback) {
5031
      return function(string) {
5032
        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');
5033
      };
5034
    }
5035
5036
    /**
5037
     * Creates a function that produces an instance of `Ctor` regardless of
5038
     * whether it was invoked as part of a `new` expression or by `call` or `apply`.
5039
     *
5040
     * @private
5041
     * @param {Function} Ctor The constructor to wrap.
5042
     * @returns {Function} Returns the new wrapped function.
5043
     */
5044
    function createCtor(Ctor) {
5045
      return function() {
5046
        // Use a `switch` statement to work with class constructors. See
5047
        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
5048
        // for more details.
5049
        var args = arguments;
5050
        switch (args.length) {
5051
          case 0: return new Ctor;
5052
          case 1: return new Ctor(args[0]);
5053
          case 2: return new Ctor(args[0], args[1]);
5054
          case 3: return new Ctor(args[0], args[1], args[2]);
5055
          case 4: return new Ctor(args[0], args[1], args[2], args[3]);
5056
          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
5057
          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
5058
          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
5059
        }
5060
        var thisBinding = baseCreate(Ctor.prototype),
5061
            result = Ctor.apply(thisBinding, args);
5062
5063
        // Mimic the constructor's `return` behavior.
5064
        // See https://es5.github.io/#x13.2.2 for more details.
5065
        return isObject(result) ? result : thisBinding;
5066
      };
5067
    }
5068
5069
    /**
5070
     * Creates a function that wraps `func` to enable currying.
5071
     *
5072
     * @private
5073
     * @param {Function} func The function to wrap.
5074
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5075
     * @param {number} arity The arity of `func`.
5076
     * @returns {Function} Returns the new wrapped function.
5077
     */
5078
    function createCurry(func, bitmask, arity) {
5079
      var Ctor = createCtor(func);
5080
5081
      function wrapper() {
5082
        var length = arguments.length,
5083
            args = Array(length),
5084
            index = length,
5085
            placeholder = getHolder(wrapper);
5086
5087
        while (index--) {
5088
          args[index] = arguments[index];
5089
        }
5090
        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
5091
          ? []
5092
          : replaceHolders(args, placeholder);
5093
5094
        length -= holders.length;
5095
        if (length < arity) {
5096
          return createRecurry(
5097
            func, bitmask, createHybrid, wrapper.placeholder, undefined,
5098
            args, holders, undefined, undefined, arity - length);
5099
        }
5100
        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5101
        return apply(fn, this, args);
5102
      }
5103
      return wrapper;
5104
    }
5105
5106
    /**
5107
     * Creates a `_.find` or `_.findLast` function.
5108
     *
5109
     * @private
5110
     * @param {Function} findIndexFunc The function to find the collection index.
5111
     * @returns {Function} Returns the new find function.
5112
     */
5113
    function createFind(findIndexFunc) {
5114
      return function(collection, predicate, fromIndex) {
5115
        var iterable = Object(collection);
5116
        if (!isArrayLike(collection)) {
5117
          var iteratee = getIteratee(predicate, 3);
5118
          collection = keys(collection);
5119
          predicate = function(key) { return iteratee(iterable[key], key, iterable); };
5120
        }
5121
        var index = findIndexFunc(collection, predicate, fromIndex);
5122
        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
5123
      };
5124
    }
5125
5126
    /**
5127
     * Creates a `_.flow` or `_.flowRight` function.
5128
     *
5129
     * @private
5130
     * @param {boolean} [fromRight] Specify iterating from right to left.
5131
     * @returns {Function} Returns the new flow function.
5132
     */
5133
    function createFlow(fromRight) {
5134
      return flatRest(function(funcs) {
5135
        var length = funcs.length,
5136
            index = length,
5137
            prereq = LodashWrapper.prototype.thru;
5138
5139
        if (fromRight) {
5140
          funcs.reverse();
5141
        }
5142
        while (index--) {
5143
          var func = funcs[index];
5144
          if (typeof func != 'function') {
5145
            throw new TypeError(FUNC_ERROR_TEXT);
5146
          }
5147
          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {
5148
            var wrapper = new LodashWrapper([], true);
5149
          }
5150
        }
5151
        index = wrapper ? index : length;
5152
        while (++index < length) {
5153
          func = funcs[index];
5154
5155
          var funcName = getFuncName(func),
5156
              data = funcName == 'wrapper' ? getData(func) : undefined;
5157
5158
          if (data && isLaziable(data[0]) &&
5159
                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&
5160
                !data[4].length && data[9] == 1
5161
              ) {
5162
            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
5163
          } else {
5164
            wrapper = (func.length == 1 && isLaziable(func))
5165
              ? wrapper[funcName]()
5166
              : wrapper.thru(func);
5167
          }
5168
        }
5169
        return function() {
5170
          var args = arguments,
5171
              value = args[0];
5172
5173
          if (wrapper && args.length == 1 && isArray(value)) {
5174
            return wrapper.plant(value).value();
5175
          }
5176
          var index = 0,
5177
              result = length ? funcs[index].apply(this, args) : value;
5178
5179
          while (++index < length) {
5180
            result = funcs[index].call(this, result);
5181
          }
5182
          return result;
5183
        };
5184
      });
5185
    }
5186
5187
    /**
5188
     * Creates a function that wraps `func` to invoke it with optional `this`
5189
     * binding of `thisArg`, partial application, and currying.
5190
     *
5191
     * @private
5192
     * @param {Function|string} func The function or method name to wrap.
5193
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5194
     * @param {*} [thisArg] The `this` binding of `func`.
5195
     * @param {Array} [partials] The arguments to prepend to those provided to
5196
     *  the new function.
5197
     * @param {Array} [holders] The `partials` placeholder indexes.
5198
     * @param {Array} [partialsRight] The arguments to append to those provided
5199
     *  to the new function.
5200
     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
5201
     * @param {Array} [argPos] The argument positions of the new function.
5202
     * @param {number} [ary] The arity cap of `func`.
5203
     * @param {number} [arity] The arity of `func`.
5204
     * @returns {Function} Returns the new wrapped function.
5205
     */
5206
    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
5207
      var isAry = bitmask & WRAP_ARY_FLAG,
5208
          isBind = bitmask & WRAP_BIND_FLAG,
5209
          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,
5210
          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),
5211
          isFlip = bitmask & WRAP_FLIP_FLAG,
5212
          Ctor = isBindKey ? undefined : createCtor(func);
5213
5214
      function wrapper() {
5215
        var length = arguments.length,
5216
            args = Array(length),
5217
            index = length;
5218
5219
        while (index--) {
5220
          args[index] = arguments[index];
5221
        }
5222
        if (isCurried) {
5223
          var placeholder = getHolder(wrapper),
5224
              holdersCount = countHolders(args, placeholder);
5225
        }
5226
        if (partials) {
5227
          args = composeArgs(args, partials, holders, isCurried);
5228
        }
5229
        if (partialsRight) {
5230
          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
5231
        }
5232
        length -= holdersCount;
5233
        if (isCurried && length < arity) {
5234
          var newHolders = replaceHolders(args, placeholder);
5235
          return createRecurry(
5236
            func, bitmask, createHybrid, wrapper.placeholder, thisArg,
5237
            args, newHolders, argPos, ary, arity - length
5238
          );
5239
        }
5240
        var thisBinding = isBind ? thisArg : this,
5241
            fn = isBindKey ? thisBinding[func] : func;
5242
5243
        length = args.length;
5244
        if (argPos) {
5245
          args = reorder(args, argPos);
5246
        } else if (isFlip && length > 1) {
5247
          args.reverse();
5248
        }
5249
        if (isAry && ary < length) {
5250
          args.length = ary;
5251
        }
5252
        if (this && this !== root && this instanceof wrapper) {
5253
          fn = Ctor || createCtor(fn);
5254
        }
5255
        return fn.apply(thisBinding, args);
5256
      }
5257
      return wrapper;
5258
    }
5259
5260
    /**
5261
     * Creates a function like `_.invertBy`.
5262
     *
5263
     * @private
5264
     * @param {Function} setter The function to set accumulator values.
5265
     * @param {Function} toIteratee The function to resolve iteratees.
5266
     * @returns {Function} Returns the new inverter function.
5267
     */
5268
    function createInverter(setter, toIteratee) {
5269
      return function(object, iteratee) {
5270
        return baseInverter(object, setter, toIteratee(iteratee), {});
5271
      };
5272
    }
5273
5274
    /**
5275
     * Creates a function that performs a mathematical operation on two values.
5276
     *
5277
     * @private
5278
     * @param {Function} operator The function to perform the operation.
5279
     * @param {number} [defaultValue] The value used for `undefined` arguments.
5280
     * @returns {Function} Returns the new mathematical operation function.
5281
     */
5282
    function createMathOperation(operator, defaultValue) {
5283
      return function(value, other) {
5284
        var result;
5285
        if (value === undefined && other === undefined) {
5286
          return defaultValue;
5287
        }
5288
        if (value !== undefined) {
5289
          result = value;
5290
        }
5291
        if (other !== undefined) {
5292
          if (result === undefined) {
5293
            return other;
5294
          }
5295
          if (typeof value == 'string' || typeof other == 'string') {
5296
            value = baseToString(value);
5297
            other = baseToString(other);
5298
          } else {
5299
            value = baseToNumber(value);
5300
            other = baseToNumber(other);
5301
          }
5302
          result = operator(value, other);
5303
        }
5304
        return result;
5305
      };
5306
    }
5307
5308
    /**
5309
     * Creates a function like `_.over`.
5310
     *
5311
     * @private
5312
     * @param {Function} arrayFunc The function to iterate over iteratees.
5313
     * @returns {Function} Returns the new over function.
5314
     */
5315
    function createOver(arrayFunc) {
5316
      return flatRest(function(iteratees) {
5317
        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
5318
        return baseRest(function(args) {
5319
          var thisArg = this;
5320
          return arrayFunc(iteratees, function(iteratee) {
5321
            return apply(iteratee, thisArg, args);
5322
          });
5323
        });
5324
      });
5325
    }
5326
5327
    /**
5328
     * Creates the padding for `string` based on `length`. The `chars` string
5329
     * is truncated if the number of characters exceeds `length`.
5330
     *
5331
     * @private
5332
     * @param {number} length The padding length.
5333
     * @param {string} [chars=' '] The string used as padding.
5334
     * @returns {string} Returns the padding for `string`.
5335
     */
5336
    function createPadding(length, chars) {
5337
      chars = chars === undefined ? ' ' : baseToString(chars);
5338
5339
      var charsLength = chars.length;
5340
      if (charsLength < 2) {
5341
        return charsLength ? baseRepeat(chars, length) : chars;
5342
      }
5343
      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
5344
      return hasUnicode(chars)
5345
        ? castSlice(stringToArray(result), 0, length).join('')
5346
        : result.slice(0, length);
5347
    }
5348
5349
    /**
5350
     * Creates a function that wraps `func` to invoke it with the `this` binding
5351
     * of `thisArg` and `partials` prepended to the arguments it receives.
5352
     *
5353
     * @private
5354
     * @param {Function} func The function to wrap.
5355
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5356
     * @param {*} thisArg The `this` binding of `func`.
5357
     * @param {Array} partials The arguments to prepend to those provided to
5358
     *  the new function.
5359
     * @returns {Function} Returns the new wrapped function.
5360
     */
5361
    function createPartial(func, bitmask, thisArg, partials) {
5362
      var isBind = bitmask & WRAP_BIND_FLAG,
5363
          Ctor = createCtor(func);
5364
5365
      function wrapper() {
5366
        var argsIndex = -1,
5367
            argsLength = arguments.length,
5368
            leftIndex = -1,
5369
            leftLength = partials.length,
5370
            args = Array(leftLength + argsLength),
5371
            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;
5372
5373
        while (++leftIndex < leftLength) {
5374
          args[leftIndex] = partials[leftIndex];
5375
        }
5376
        while (argsLength--) {
5377
          args[leftIndex++] = arguments[++argsIndex];
5378
        }
5379
        return apply(fn, isBind ? thisArg : this, args);
5380
      }
5381
      return wrapper;
5382
    }
5383
5384
    /**
5385
     * Creates a `_.range` or `_.rangeRight` function.
5386
     *
5387
     * @private
5388
     * @param {boolean} [fromRight] Specify iterating from right to left.
5389
     * @returns {Function} Returns the new range function.
5390
     */
5391
    function createRange(fromRight) {
5392
      return function(start, end, step) {
5393
        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {
5394
          end = step = undefined;
5395
        }
5396
        // Ensure the sign of `-0` is preserved.
5397
        start = toFinite(start);
5398
        if (end === undefined) {
5399
          end = start;
5400
          start = 0;
5401
        } else {
5402
          end = toFinite(end);
5403
        }
5404
        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);
5405
        return baseRange(start, end, step, fromRight);
5406
      };
5407
    }
5408
5409
    /**
5410
     * Creates a function that performs a relational operation on two values.
5411
     *
5412
     * @private
5413
     * @param {Function} operator The function to perform the operation.
5414
     * @returns {Function} Returns the new relational operation function.
5415
     */
5416
    function createRelationalOperation(operator) {
5417
      return function(value, other) {
5418
        if (!(typeof value == 'string' && typeof other == 'string')) {
5419
          value = toNumber(value);
5420
          other = toNumber(other);
5421
        }
5422
        return operator(value, other);
5423
      };
5424
    }
5425
5426
    /**
5427
     * Creates a function that wraps `func` to continue currying.
5428
     *
5429
     * @private
5430
     * @param {Function} func The function to wrap.
5431
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
5432
     * @param {Function} wrapFunc The function to create the `func` wrapper.
5433
     * @param {*} placeholder The placeholder value.
5434
     * @param {*} [thisArg] The `this` binding of `func`.
5435
     * @param {Array} [partials] The arguments to prepend to those provided to
5436
     *  the new function.
5437
     * @param {Array} [holders] The `partials` placeholder indexes.
5438
     * @param {Array} [argPos] The argument positions of the new function.
5439
     * @param {number} [ary] The arity cap of `func`.
5440
     * @param {number} [arity] The arity of `func`.
5441
     * @returns {Function} Returns the new wrapped function.
5442
     */
5443
    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
5444
      var isCurry = bitmask & WRAP_CURRY_FLAG,
5445
          newHolders = isCurry ? holders : undefined,
5446
          newHoldersRight = isCurry ? undefined : holders,
5447
          newPartials = isCurry ? partials : undefined,
5448
          newPartialsRight = isCurry ? undefined : partials;
5449
5450
      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);
5451
      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
5452
5453
      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
5454
        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
5455
      }
5456
      var newData = [
5457
        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
5458
        newHoldersRight, argPos, ary, arity
5459
      ];
5460
5461
      var result = wrapFunc.apply(undefined, newData);
5462
      if (isLaziable(func)) {
5463
        setData(result, newData);
5464
      }
5465
      result.placeholder = placeholder;
5466
      return setWrapToString(result, func, bitmask);
5467
    }
5468
5469
    /**
5470
     * Creates a function like `_.round`.
5471
     *
5472
     * @private
5473
     * @param {string} methodName The name of the `Math` method to use when rounding.
5474
     * @returns {Function} Returns the new round function.
5475
     */
5476
    function createRound(methodName) {
5477
      var func = Math[methodName];
5478
      return function(number, precision) {
5479
        number = toNumber(number);
5480
        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);
5481
        if (precision && nativeIsFinite(number)) {
5482
          // Shift with exponential notation to avoid floating-point issues.
5483
          // See [MDN](https://mdn.io/round#Examples) for more details.
5484
          var pair = (toString(number) + 'e').split('e'),
5485
              value = func(pair[0] + 'e' + (+pair[1] + precision));
5486
5487
          pair = (toString(value) + 'e').split('e');
5488
          return +(pair[0] + 'e' + (+pair[1] - precision));
5489
        }
5490
        return func(number);
5491
      };
5492
    }
5493
5494
    /**
5495
     * Creates a set object of `values`.
5496
     *
5497
     * @private
5498
     * @param {Array} values The values to add to the set.
5499
     * @returns {Object} Returns the new set.
5500
     */
5501
    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {
5502
      return new Set(values);
5503
    };
5504
5505
    /**
5506
     * Creates a `_.toPairs` or `_.toPairsIn` function.
5507
     *
5508
     * @private
5509
     * @param {Function} keysFunc The function to get the keys of a given object.
5510
     * @returns {Function} Returns the new pairs function.
5511
     */
5512
    function createToPairs(keysFunc) {
5513
      return function(object) {
5514
        var tag = getTag(object);
5515
        if (tag == mapTag) {
5516
          return mapToArray(object);
5517
        }
5518
        if (tag == setTag) {
5519
          return setToPairs(object);
5520
        }
5521
        return baseToPairs(object, keysFunc(object));
5522
      };
5523
    }
5524
5525
    /**
5526
     * Creates a function that either curries or invokes `func` with optional
5527
     * `this` binding and partially applied arguments.
5528
     *
5529
     * @private
5530
     * @param {Function|string} func The function or method name to wrap.
5531
     * @param {number} bitmask The bitmask flags.
5532
     *    1 - `_.bind`
5533
     *    2 - `_.bindKey`
5534
     *    4 - `_.curry` or `_.curryRight` of a bound function
5535
     *    8 - `_.curry`
5536
     *   16 - `_.curryRight`
5537
     *   32 - `_.partial`
5538
     *   64 - `_.partialRight`
5539
     *  128 - `_.rearg`
5540
     *  256 - `_.ary`
5541
     *  512 - `_.flip`
5542
     * @param {*} [thisArg] The `this` binding of `func`.
5543
     * @param {Array} [partials] The arguments to be partially applied.
5544
     * @param {Array} [holders] The `partials` placeholder indexes.
5545
     * @param {Array} [argPos] The argument positions of the new function.
5546
     * @param {number} [ary] The arity cap of `func`.
5547
     * @param {number} [arity] The arity of `func`.
5548
     * @returns {Function} Returns the new wrapped function.
5549
     */
5550
    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
5551
      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
5552
      if (!isBindKey && typeof func != 'function') {
5553
        throw new TypeError(FUNC_ERROR_TEXT);
5554
      }
5555
      var length = partials ? partials.length : 0;
5556
      if (!length) {
5557
        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
5558
        partials = holders = undefined;
5559
      }
5560
      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);
5561
      arity = arity === undefined ? arity : toInteger(arity);
5562
      length -= holders ? holders.length : 0;
5563
5564
      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
5565
        var partialsRight = partials,
5566
            holdersRight = holders;
5567
5568
        partials = holders = undefined;
5569
      }
5570
      var data = isBindKey ? undefined : getData(func);
5571
5572
      var newData = [
5573
        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
5574
        argPos, ary, arity
5575
      ];
5576
5577
      if (data) {
5578
        mergeData(newData, data);
5579
      }
5580
      func = newData[0];
5581
      bitmask = newData[1];
5582
      thisArg = newData[2];
5583
      partials = newData[3];
5584
      holders = newData[4];
5585
      arity = newData[9] = newData[9] === undefined
5586
        ? (isBindKey ? 0 : func.length)
5587
        : nativeMax(newData[9] - length, 0);
5588
5589
      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
5590
        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
5591
      }
5592
      if (!bitmask || bitmask == WRAP_BIND_FLAG) {
5593
        var result = createBind(func, bitmask, thisArg);
5594
      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
5595
        result = createCurry(func, bitmask, arity);
5596
      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
5597
        result = createPartial(func, bitmask, thisArg, partials);
5598
      } else {
5599
        result = createHybrid.apply(undefined, newData);
5600
      }
5601
      var setter = data ? baseSetData : setData;
5602
      return setWrapToString(setter(result, newData), func, bitmask);
5603
    }
5604
5605
    /**
5606
     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties
5607
     * of source objects to the destination object for all destination properties
5608
     * that resolve to `undefined`.
5609
     *
5610
     * @private
5611
     * @param {*} objValue The destination value.
5612
     * @param {*} srcValue The source value.
5613
     * @param {string} key The key of the property to assign.
5614
     * @param {Object} object The parent object of `objValue`.
5615
     * @returns {*} Returns the value to assign.
5616
     */
5617
    function customDefaultsAssignIn(objValue, srcValue, key, object) {
5618
      if (objValue === undefined ||
5619
          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {
5620
        return srcValue;
5621
      }
5622
      return objValue;
5623
    }
5624
5625
    /**
5626
     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source
5627
     * objects into destination objects that are passed thru.
5628
     *
5629
     * @private
5630
     * @param {*} objValue The destination value.
5631
     * @param {*} srcValue The source value.
5632
     * @param {string} key The key of the property to merge.
5633
     * @param {Object} object The parent object of `objValue`.
5634
     * @param {Object} source The parent object of `srcValue`.
5635
     * @param {Object} [stack] Tracks traversed source values and their merged
5636
     *  counterparts.
5637
     * @returns {*} Returns the value to assign.
5638
     */
5639
    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {
5640
      if (isObject(objValue) && isObject(srcValue)) {
5641
        // Recursively merge objects and arrays (susceptible to call stack limits).
5642
        stack.set(srcValue, objValue);
5643
        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);
5644
        stack['delete'](srcValue);
5645
      }
5646
      return objValue;
5647
    }
5648
5649
    /**
5650
     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
5651
     * objects.
5652
     *
5653
     * @private
5654
     * @param {*} value The value to inspect.
5655
     * @param {string} key The key of the property to inspect.
5656
     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
5657
     */
5658
    function customOmitClone(value) {
5659
      return isPlainObject(value) ? undefined : value;
5660
    }
5661
5662
    /**
5663
     * A specialized version of `baseIsEqualDeep` for arrays with support for
5664
     * partial deep comparisons.
5665
     *
5666
     * @private
5667
     * @param {Array} array The array to compare.
5668
     * @param {Array} other The other array to compare.
5669
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5670
     * @param {Function} customizer The function to customize comparisons.
5671
     * @param {Function} equalFunc The function to determine equivalents of values.
5672
     * @param {Object} stack Tracks traversed `array` and `other` objects.
5673
     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
5674
     */
5675
    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
5676
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5677
          arrLength = array.length,
5678
          othLength = other.length;
5679
5680
      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
5681
        return false;
5682
      }
5683
      // Check that cyclic values are equal.
5684
      var arrStacked = stack.get(array);
5685
      var othStacked = stack.get(other);
5686
      if (arrStacked && othStacked) {
5687
        return arrStacked == other && othStacked == array;
5688
      }
5689
      var index = -1,
5690
          result = true,
5691
          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
5692
5693
      stack.set(array, other);
5694
      stack.set(other, array);
5695
5696
      // Ignore non-index properties.
5697
      while (++index < arrLength) {
5698
        var arrValue = array[index],
5699
            othValue = other[index];
5700
5701
        if (customizer) {
5702
          var compared = isPartial
5703
            ? customizer(othValue, arrValue, index, other, array, stack)
5704
            : customizer(arrValue, othValue, index, array, other, stack);
5705
        }
5706
        if (compared !== undefined) {
5707
          if (compared) {
5708
            continue;
5709
          }
5710
          result = false;
5711
          break;
5712
        }
5713
        // Recursively compare arrays (susceptible to call stack limits).
5714
        if (seen) {
5715
          if (!arraySome(other, function(othValue, othIndex) {
5716
                if (!cacheHas(seen, othIndex) &&
5717
                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
5718
                  return seen.push(othIndex);
5719
                }
5720
              })) {
5721
            result = false;
5722
            break;
5723
          }
5724
        } else if (!(
5725
              arrValue === othValue ||
5726
                equalFunc(arrValue, othValue, bitmask, customizer, stack)
5727
            )) {
5728
          result = false;
5729
          break;
5730
        }
5731
      }
5732
      stack['delete'](array);
5733
      stack['delete'](other);
5734
      return result;
5735
    }
5736
5737
    /**
5738
     * A specialized version of `baseIsEqualDeep` for comparing objects of
5739
     * the same `toStringTag`.
5740
     *
5741
     * **Note:** This function only supports comparing values with tags of
5742
     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
5743
     *
5744
     * @private
5745
     * @param {Object} object The object to compare.
5746
     * @param {Object} other The other object to compare.
5747
     * @param {string} tag The `toStringTag` of the objects to compare.
5748
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5749
     * @param {Function} customizer The function to customize comparisons.
5750
     * @param {Function} equalFunc The function to determine equivalents of values.
5751
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5752
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5753
     */
5754
    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
5755
      switch (tag) {
5756
        case dataViewTag:
5757
          if ((object.byteLength != other.byteLength) ||
5758
              (object.byteOffset != other.byteOffset)) {
5759
            return false;
5760
          }
5761
          object = object.buffer;
5762
          other = other.buffer;
5763
5764
        case arrayBufferTag:
5765
          if ((object.byteLength != other.byteLength) ||
5766
              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {
5767
            return false;
5768
          }
5769
          return true;
5770
5771
        case boolTag:
5772
        case dateTag:
5773
        case numberTag:
5774
          // Coerce booleans to `1` or `0` and dates to milliseconds.
5775
          // Invalid dates are coerced to `NaN`.
5776
          return eq(+object, +other);
5777
5778
        case errorTag:
5779
          return object.name == other.name && object.message == other.message;
5780
5781
        case regexpTag:
5782
        case stringTag:
5783
          // Coerce regexes to strings and treat strings, primitives and objects,
5784
          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
5785
          // for more details.
5786
          return object == (other + '');
5787
5788
        case mapTag:
5789
          var convert = mapToArray;
5790
5791
        case setTag:
5792
          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
5793
          convert || (convert = setToArray);
5794
5795
          if (object.size != other.size && !isPartial) {
5796
            return false;
5797
          }
5798
          // Assume cyclic values are equal.
5799
          var stacked = stack.get(object);
5800
          if (stacked) {
5801
            return stacked == other;
5802
          }
5803
          bitmask |= COMPARE_UNORDERED_FLAG;
5804
5805
          // Recursively compare objects (susceptible to call stack limits).
5806
          stack.set(object, other);
5807
          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
5808
          stack['delete'](object);
5809
          return result;
5810
5811
        case symbolTag:
5812
          if (symbolValueOf) {
5813
            return symbolValueOf.call(object) == symbolValueOf.call(other);
5814
          }
5815
      }
5816
      return false;
5817
    }
5818
5819
    /**
5820
     * A specialized version of `baseIsEqualDeep` for objects with support for
5821
     * partial deep comparisons.
5822
     *
5823
     * @private
5824
     * @param {Object} object The object to compare.
5825
     * @param {Object} other The other object to compare.
5826
     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
5827
     * @param {Function} customizer The function to customize comparisons.
5828
     * @param {Function} equalFunc The function to determine equivalents of values.
5829
     * @param {Object} stack Tracks traversed `object` and `other` objects.
5830
     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
5831
     */
5832
    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
5833
      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
5834
          objProps = getAllKeys(object),
5835
          objLength = objProps.length,
5836
          othProps = getAllKeys(other),
5837
          othLength = othProps.length;
5838
5839
      if (objLength != othLength && !isPartial) {
5840
        return false;
5841
      }
5842
      var index = objLength;
5843
      while (index--) {
5844
        var key = objProps[index];
5845
        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {
5846
          return false;
5847
        }
5848
      }
5849
      // Check that cyclic values are equal.
5850
      var objStacked = stack.get(object);
5851
      var othStacked = stack.get(other);
5852
      if (objStacked && othStacked) {
5853
        return objStacked == other && othStacked == object;
5854
      }
5855
      var result = true;
5856
      stack.set(object, other);
5857
      stack.set(other, object);
5858
5859
      var skipCtor = isPartial;
5860
      while (++index < objLength) {
5861
        key = objProps[index];
5862
        var objValue = object[key],
5863
            othValue = other[key];
5864
5865
        if (customizer) {
5866
          var compared = isPartial
5867
            ? customizer(othValue, objValue, key, other, object, stack)
5868
            : customizer(objValue, othValue, key, object, other, stack);
5869
        }
5870
        // Recursively compare objects (susceptible to call stack limits).
5871
        if (!(compared === undefined
5872
              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
5873
              : compared
5874
            )) {
5875
          result = false;
5876
          break;
5877
        }
5878
        skipCtor || (skipCtor = key == 'constructor');
5879
      }
5880
      if (result && !skipCtor) {
5881
        var objCtor = object.constructor,
5882
            othCtor = other.constructor;
5883
5884
        // Non `Object` object instances with different constructors are not equal.
5885
        if (objCtor != othCtor &&
5886
            ('constructor' in object && 'constructor' in other) &&
5887
            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
5888
              typeof othCtor == 'function' && othCtor instanceof othCtor)) {
5889
          result = false;
5890
        }
5891
      }
5892
      stack['delete'](object);
5893
      stack['delete'](other);
5894
      return result;
5895
    }
5896
5897
    /**
5898
     * A specialized version of `baseRest` which flattens the rest array.
5899
     *
5900
     * @private
5901
     * @param {Function} func The function to apply a rest parameter to.
5902
     * @returns {Function} Returns the new function.
5903
     */
5904
    function flatRest(func) {
5905
      return setToString(overRest(func, undefined, flatten), func + '');
5906
    }
5907
5908
    /**
5909
     * Creates an array of own enumerable property names and symbols of `object`.
5910
     *
5911
     * @private
5912
     * @param {Object} object The object to query.
5913
     * @returns {Array} Returns the array of property names and symbols.
5914
     */
5915
    function getAllKeys(object) {
5916
      return baseGetAllKeys(object, keys, getSymbols);
5917
    }
5918
5919
    /**
5920
     * Creates an array of own and inherited enumerable property names and
5921
     * symbols of `object`.
5922
     *
5923
     * @private
5924
     * @param {Object} object The object to query.
5925
     * @returns {Array} Returns the array of property names and symbols.
5926
     */
5927
    function getAllKeysIn(object) {
5928
      return baseGetAllKeys(object, keysIn, getSymbolsIn);
5929
    }
5930
5931
    /**
5932
     * Gets metadata for `func`.
5933
     *
5934
     * @private
5935
     * @param {Function} func The function to query.
5936
     * @returns {*} Returns the metadata for `func`.
5937
     */
5938
    var getData = !metaMap ? noop : function(func) {
5939
      return metaMap.get(func);
5940
    };
5941
5942
    /**
5943
     * Gets the name of `func`.
5944
     *
5945
     * @private
5946
     * @param {Function} func The function to query.
5947
     * @returns {string} Returns the function name.
5948
     */
5949
    function getFuncName(func) {
5950
      var result = (func.name + ''),
5951
          array = realNames[result],
5952
          length = hasOwnProperty.call(realNames, result) ? array.length : 0;
5953
5954
      while (length--) {
5955
        var data = array[length],
5956
            otherFunc = data.func;
5957
        if (otherFunc == null || otherFunc == func) {
5958
          return data.name;
5959
        }
5960
      }
5961
      return result;
5962
    }
5963
5964
    /**
5965
     * Gets the argument placeholder value for `func`.
5966
     *
5967
     * @private
5968
     * @param {Function} func The function to inspect.
5969
     * @returns {*} Returns the placeholder value.
5970
     */
5971
    function getHolder(func) {
5972
      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;
5973
      return object.placeholder;
5974
    }
5975
5976
    /**
5977
     * Gets the appropriate "iteratee" function. If `_.iteratee` is customized,
5978
     * this function returns the custom method, otherwise it returns `baseIteratee`.
5979
     * If arguments are provided, the chosen function is invoked with them and
5980
     * its result is returned.
5981
     *
5982
     * @private
5983
     * @param {*} [value] The value to convert to an iteratee.
5984
     * @param {number} [arity] The arity of the created iteratee.
5985
     * @returns {Function} Returns the chosen function or its result.
5986
     */
5987
    function getIteratee() {
5988
      var result = lodash.iteratee || iteratee;
5989
      result = result === iteratee ? baseIteratee : result;
5990
      return arguments.length ? result(arguments[0], arguments[1]) : result;
5991
    }
5992
5993
    /**
5994
     * Gets the data for `map`.
5995
     *
5996
     * @private
5997
     * @param {Object} map The map to query.
5998
     * @param {string} key The reference key.
5999
     * @returns {*} Returns the map data.
6000
     */
6001
    function getMapData(map, key) {
6002
      var data = map.__data__;
6003
      return isKeyable(key)
6004
        ? data[typeof key == 'string' ? 'string' : 'hash']
6005
        : data.map;
6006
    }
6007
6008
    /**
6009
     * Gets the property names, values, and compare flags of `object`.
6010
     *
6011
     * @private
6012
     * @param {Object} object The object to query.
6013
     * @returns {Array} Returns the match data of `object`.
6014
     */
6015
    function getMatchData(object) {
6016
      var result = keys(object),
6017
          length = result.length;
6018
6019
      while (length--) {
6020
        var key = result[length],
6021
            value = object[key];
6022
6023
        result[length] = [key, value, isStrictComparable(value)];
6024
      }
6025
      return result;
6026
    }
6027
6028
    /**
6029
     * Gets the native function at `key` of `object`.
6030
     *
6031
     * @private
6032
     * @param {Object} object The object to query.
6033
     * @param {string} key The key of the method to get.
6034
     * @returns {*} Returns the function if it's native, else `undefined`.
6035
     */
6036
    function getNative(object, key) {
6037
      var value = getValue(object, key);
6038
      return baseIsNative(value) ? value : undefined;
6039
    }
6040
6041
    /**
6042
     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
6043
     *
6044
     * @private
6045
     * @param {*} value The value to query.
6046
     * @returns {string} Returns the raw `toStringTag`.
6047
     */
6048
    function getRawTag(value) {
6049
      var isOwn = hasOwnProperty.call(value, symToStringTag),
6050
          tag = value[symToStringTag];
6051
6052
      try {
6053
        value[symToStringTag] = undefined;
6054
        var unmasked = true;
6055
      } catch (e) {}
6056
6057
      var result = nativeObjectToString.call(value);
6058
      if (unmasked) {
6059
        if (isOwn) {
6060
          value[symToStringTag] = tag;
6061
        } else {
6062
          delete value[symToStringTag];
6063
        }
6064
      }
6065
      return result;
6066
    }
6067
6068
    /**
6069
     * Creates an array of the own enumerable symbols of `object`.
6070
     *
6071
     * @private
6072
     * @param {Object} object The object to query.
6073
     * @returns {Array} Returns the array of symbols.
6074
     */
6075
    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
6076
      if (object == null) {
6077
        return [];
6078
      }
6079
      object = Object(object);
6080
      return arrayFilter(nativeGetSymbols(object), function(symbol) {
6081
        return propertyIsEnumerable.call(object, symbol);
6082
      });
6083
    };
6084
6085
    /**
6086
     * Creates an array of the own and inherited enumerable symbols of `object`.
6087
     *
6088
     * @private
6089
     * @param {Object} object The object to query.
6090
     * @returns {Array} Returns the array of symbols.
6091
     */
6092
    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
6093
      var result = [];
6094
      while (object) {
6095
        arrayPush(result, getSymbols(object));
6096
        object = getPrototype(object);
6097
      }
6098
      return result;
6099
    };
6100
6101
    /**
6102
     * Gets the `toStringTag` of `value`.
6103
     *
6104
     * @private
6105
     * @param {*} value The value to query.
6106
     * @returns {string} Returns the `toStringTag`.
6107
     */
6108
    var getTag = baseGetTag;
6109
6110
    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
6111
    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||
6112
        (Map && getTag(new Map) != mapTag) ||
6113
        (Promise && getTag(Promise.resolve()) != promiseTag) ||
6114
        (Set && getTag(new Set) != setTag) ||
6115
        (WeakMap && getTag(new WeakMap) != weakMapTag)) {
6116
      getTag = function(value) {
6117
        var result = baseGetTag(value),
6118
            Ctor = result == objectTag ? value.constructor : undefined,
6119
            ctorString = Ctor ? toSource(Ctor) : '';
6120
6121
        if (ctorString) {
6122
          switch (ctorString) {
6123
            case dataViewCtorString: return dataViewTag;
6124
            case mapCtorString: return mapTag;
6125
            case promiseCtorString: return promiseTag;
6126
            case setCtorString: return setTag;
6127
            case weakMapCtorString: return weakMapTag;
6128
          }
6129
        }
6130
        return result;
6131
      };
6132
    }
6133
6134
    /**
6135
     * Gets the view, applying any `transforms` to the `start` and `end` positions.
6136
     *
6137
     * @private
6138
     * @param {number} start The start of the view.
6139
     * @param {number} end The end of the view.
6140
     * @param {Array} transforms The transformations to apply to the view.
6141
     * @returns {Object} Returns an object containing the `start` and `end`
6142
     *  positions of the view.
6143
     */
6144
    function getView(start, end, transforms) {
6145
      var index = -1,
6146
          length = transforms.length;
6147
6148
      while (++index < length) {
6149
        var data = transforms[index],
6150
            size = data.size;
6151
6152
        switch (data.type) {
6153
          case 'drop':      start += size; break;
6154
          case 'dropRight': end -= size; break;
6155
          case 'take':      end = nativeMin(end, start + size); break;
6156
          case 'takeRight': start = nativeMax(start, end - size); break;
6157
        }
6158
      }
6159
      return { 'start': start, 'end': end };
6160
    }
6161
6162
    /**
6163
     * Extracts wrapper details from the `source` body comment.
6164
     *
6165
     * @private
6166
     * @param {string} source The source to inspect.
6167
     * @returns {Array} Returns the wrapper details.
6168
     */
6169
    function getWrapDetails(source) {
6170
      var match = source.match(reWrapDetails);
6171
      return match ? match[1].split(reSplitDetails) : [];
6172
    }
6173
6174
    /**
6175
     * Checks if `path` exists on `object`.
6176
     *
6177
     * @private
6178
     * @param {Object} object The object to query.
6179
     * @param {Array|string} path The path to check.
6180
     * @param {Function} hasFunc The function to check properties.
6181
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
6182
     */
6183
    function hasPath(object, path, hasFunc) {
6184
      path = castPath(path, object);
6185
6186
      var index = -1,
6187
          length = path.length,
6188
          result = false;
6189
6190
      while (++index < length) {
6191
        var key = toKey(path[index]);
6192
        if (!(result = object != null && hasFunc(object, key))) {
6193
          break;
6194
        }
6195
        object = object[key];
6196
      }
6197
      if (result || ++index != length) {
6198
        return result;
6199
      }
6200
      length = object == null ? 0 : object.length;
6201
      return !!length && isLength(length) && isIndex(key, length) &&
6202
        (isArray(object) || isArguments(object));
6203
    }
6204
6205
    /**
6206
     * Initializes an array clone.
6207
     *
6208
     * @private
6209
     * @param {Array} array The array to clone.
6210
     * @returns {Array} Returns the initialized clone.
6211
     */
6212
    function initCloneArray(array) {
6213
      var length = array.length,
6214
          result = new array.constructor(length);
6215
6216
      // Add properties assigned by `RegExp#exec`.
6217
      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {
6218
        result.index = array.index;
6219
        result.input = array.input;
6220
      }
6221
      return result;
6222
    }
6223
6224
    /**
6225
     * Initializes an object clone.
6226
     *
6227
     * @private
6228
     * @param {Object} object The object to clone.
6229
     * @returns {Object} Returns the initialized clone.
6230
     */
6231
    function initCloneObject(object) {
6232
      return (typeof object.constructor == 'function' && !isPrototype(object))
6233
        ? baseCreate(getPrototype(object))
6234
        : {};
6235
    }
6236
6237
    /**
6238
     * Initializes an object clone based on its `toStringTag`.
6239
     *
6240
     * **Note:** This function only supports cloning values with tags of
6241
     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
6242
     *
6243
     * @private
6244
     * @param {Object} object The object to clone.
6245
     * @param {string} tag The `toStringTag` of the object to clone.
6246
     * @param {boolean} [isDeep] Specify a deep clone.
6247
     * @returns {Object} Returns the initialized clone.
6248
     */
6249
    function initCloneByTag(object, tag, isDeep) {
6250
      var Ctor = object.constructor;
6251
      switch (tag) {
6252
        case arrayBufferTag:
6253
          return cloneArrayBuffer(object);
6254
6255
        case boolTag:
6256
        case dateTag:
6257
          return new Ctor(+object);
6258
6259
        case dataViewTag:
6260
          return cloneDataView(object, isDeep);
6261
6262
        case float32Tag: case float64Tag:
6263
        case int8Tag: case int16Tag: case int32Tag:
6264
        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:
6265
          return cloneTypedArray(object, isDeep);
6266
6267
        case mapTag:
6268
          return new Ctor;
6269
6270
        case numberTag:
6271
        case stringTag:
6272
          return new Ctor(object);
6273
6274
        case regexpTag:
6275
          return cloneRegExp(object);
6276
6277
        case setTag:
6278
          return new Ctor;
6279
6280
        case symbolTag:
6281
          return cloneSymbol(object);
6282
      }
6283
    }
6284
6285
    /**
6286
     * Inserts wrapper `details` in a comment at the top of the `source` body.
6287
     *
6288
     * @private
6289
     * @param {string} source The source to modify.
6290
     * @returns {Array} details The details to insert.
6291
     * @returns {string} Returns the modified source.
6292
     */
6293
    function insertWrapDetails(source, details) {
6294
      var length = details.length;
6295
      if (!length) {
6296
        return source;
6297
      }
6298
      var lastIndex = length - 1;
6299
      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
6300
      details = details.join(length > 2 ? ', ' : ' ');
6301
      return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
6302
    }
6303
6304
    /**
6305
     * Checks if `value` is a flattenable `arguments` object or array.
6306
     *
6307
     * @private
6308
     * @param {*} value The value to check.
6309
     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
6310
     */
6311
    function isFlattenable(value) {
6312
      return isArray(value) || isArguments(value) ||
6313
        !!(spreadableSymbol && value && value[spreadableSymbol]);
6314
    }
6315
6316
    /**
6317
     * Checks if `value` is a valid array-like index.
6318
     *
6319
     * @private
6320
     * @param {*} value The value to check.
6321
     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
6322
     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
6323
     */
6324
    function isIndex(value, length) {
6325
      var type = typeof value;
6326
      length = length == null ? MAX_SAFE_INTEGER : length;
6327
6328
      return !!length &&
6329
        (type == 'number' ||
6330
          (type != 'symbol' && reIsUint.test(value))) &&
6331
            (value > -1 && value % 1 == 0 && value < length);
6332
    }
6333
6334
    /**
6335
     * Checks if the given arguments are from an iteratee call.
6336
     *
6337
     * @private
6338
     * @param {*} value The potential iteratee value argument.
6339
     * @param {*} index The potential iteratee index or key argument.
6340
     * @param {*} object The potential iteratee object argument.
6341
     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
6342
     *  else `false`.
6343
     */
6344
    function isIterateeCall(value, index, object) {
6345
      if (!isObject(object)) {
6346
        return false;
6347
      }
6348
      var type = typeof index;
6349
      if (type == 'number'
6350
            ? (isArrayLike(object) && isIndex(index, object.length))
6351
            : (type == 'string' && index in object)
6352
          ) {
6353
        return eq(object[index], value);
6354
      }
6355
      return false;
6356
    }
6357
6358
    /**
6359
     * Checks if `value` is a property name and not a property path.
6360
     *
6361
     * @private
6362
     * @param {*} value The value to check.
6363
     * @param {Object} [object] The object to query keys on.
6364
     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
6365
     */
6366
    function isKey(value, object) {
6367
      if (isArray(value)) {
6368
        return false;
6369
      }
6370
      var type = typeof value;
6371
      if (type == 'number' || type == 'symbol' || type == 'boolean' ||
6372
          value == null || isSymbol(value)) {
6373
        return true;
6374
      }
6375
      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
6376
        (object != null && value in Object(object));
6377
    }
6378
6379
    /**
6380
     * Checks if `value` is suitable for use as unique object key.
6381
     *
6382
     * @private
6383
     * @param {*} value The value to check.
6384
     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
6385
     */
6386
    function isKeyable(value) {
6387
      var type = typeof value;
6388
      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')
6389
        ? (value !== '__proto__')
6390
        : (value === null);
6391
    }
6392
6393
    /**
6394
     * Checks if `func` has a lazy counterpart.
6395
     *
6396
     * @private
6397
     * @param {Function} func The function to check.
6398
     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
6399
     *  else `false`.
6400
     */
6401
    function isLaziable(func) {
6402
      var funcName = getFuncName(func),
6403
          other = lodash[funcName];
6404
6405
      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
6406
        return false;
6407
      }
6408
      if (func === other) {
6409
        return true;
6410
      }
6411
      var data = getData(other);
6412
      return !!data && func === data[0];
6413
    }
6414
6415
    /**
6416
     * Checks if `func` has its source masked.
6417
     *
6418
     * @private
6419
     * @param {Function} func The function to check.
6420
     * @returns {boolean} Returns `true` if `func` is masked, else `false`.
6421
     */
6422
    function isMasked(func) {
6423
      return !!maskSrcKey && (maskSrcKey in func);
6424
    }
6425
6426
    /**
6427
     * Checks if `func` is capable of being masked.
6428
     *
6429
     * @private
6430
     * @param {*} value The value to check.
6431
     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.
6432
     */
6433
    var isMaskable = coreJsData ? isFunction : stubFalse;
6434
6435
    /**
6436
     * Checks if `value` is likely a prototype object.
6437
     *
6438
     * @private
6439
     * @param {*} value The value to check.
6440
     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
6441
     */
6442
    function isPrototype(value) {
6443
      var Ctor = value && value.constructor,
6444
          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;
6445
6446
      return value === proto;
6447
    }
6448
6449
    /**
6450
     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
6451
     *
6452
     * @private
6453
     * @param {*} value The value to check.
6454
     * @returns {boolean} Returns `true` if `value` if suitable for strict
6455
     *  equality comparisons, else `false`.
6456
     */
6457
    function isStrictComparable(value) {
6458
      return value === value && !isObject(value);
6459
    }
6460
6461
    /**
6462
     * A specialized version of `matchesProperty` for source values suitable
6463
     * for strict equality comparisons, i.e. `===`.
6464
     *
6465
     * @private
6466
     * @param {string} key The key of the property to get.
6467
     * @param {*} srcValue The value to match.
6468
     * @returns {Function} Returns the new spec function.
6469
     */
6470
    function matchesStrictComparable(key, srcValue) {
6471
      return function(object) {
6472
        if (object == null) {
6473
          return false;
6474
        }
6475
        return object[key] === srcValue &&
6476
          (srcValue !== undefined || (key in Object(object)));
6477
      };
6478
    }
6479
6480
    /**
6481
     * A specialized version of `_.memoize` which clears the memoized function's
6482
     * cache when it exceeds `MAX_MEMOIZE_SIZE`.
6483
     *
6484
     * @private
6485
     * @param {Function} func The function to have its output memoized.
6486
     * @returns {Function} Returns the new memoized function.
6487
     */
6488
    function memoizeCapped(func) {
6489
      var result = memoize(func, function(key) {
6490
        if (cache.size === MAX_MEMOIZE_SIZE) {
6491
          cache.clear();
6492
        }
6493
        return key;
6494
      });
6495
6496
      var cache = result.cache;
6497
      return result;
6498
    }
6499
6500
    /**
6501
     * Merges the function metadata of `source` into `data`.
6502
     *
6503
     * Merging metadata reduces the number of wrappers used to invoke a function.
6504
     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
6505
     * may be applied regardless of execution order. Methods like `_.ary` and
6506
     * `_.rearg` modify function arguments, making the order in which they are
6507
     * executed important, preventing the merging of metadata. However, we make
6508
     * an exception for a safe combined case where curried functions have `_.ary`
6509
     * and or `_.rearg` applied.
6510
     *
6511
     * @private
6512
     * @param {Array} data The destination metadata.
6513
     * @param {Array} source The source metadata.
6514
     * @returns {Array} Returns `data`.
6515
     */
6516
    function mergeData(data, source) {
6517
      var bitmask = data[1],
6518
          srcBitmask = source[1],
6519
          newBitmask = bitmask | srcBitmask,
6520
          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
6521
6522
      var isCombo =
6523
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||
6524
        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||
6525
        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));
6526
6527
      // Exit early if metadata can't be merged.
6528
      if (!(isCommon || isCombo)) {
6529
        return data;
6530
      }
6531
      // Use source `thisArg` if available.
6532
      if (srcBitmask & WRAP_BIND_FLAG) {
6533
        data[2] = source[2];
6534
        // Set when currying a bound function.
6535
        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
6536
      }
6537
      // Compose partial arguments.
6538
      var value = source[3];
6539
      if (value) {
6540
        var partials = data[3];
6541
        data[3] = partials ? composeArgs(partials, value, source[4]) : value;
6542
        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
6543
      }
6544
      // Compose partial right arguments.
6545
      value = source[5];
6546
      if (value) {
6547
        partials = data[5];
6548
        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
6549
        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
6550
      }
6551
      // Use source `argPos` if available.
6552
      value = source[7];
6553
      if (value) {
6554
        data[7] = value;
6555
      }
6556
      // Use source `ary` if it's smaller.
6557
      if (srcBitmask & WRAP_ARY_FLAG) {
6558
        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
6559
      }
6560
      // Use source `arity` if one is not provided.
6561
      if (data[9] == null) {
6562
        data[9] = source[9];
6563
      }
6564
      // Use source `func` and merge bitmasks.
6565
      data[0] = source[0];
6566
      data[1] = newBitmask;
6567
6568
      return data;
6569
    }
6570
6571
    /**
6572
     * This function is like
6573
     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
6574
     * except that it includes inherited enumerable properties.
6575
     *
6576
     * @private
6577
     * @param {Object} object The object to query.
6578
     * @returns {Array} Returns the array of property names.
6579
     */
6580
    function nativeKeysIn(object) {
6581
      var result = [];
6582
      if (object != null) {
6583
        for (var key in Object(object)) {
6584
          result.push(key);
6585
        }
6586
      }
6587
      return result;
6588
    }
6589
6590
    /**
6591
     * Converts `value` to a string using `Object.prototype.toString`.
6592
     *
6593
     * @private
6594
     * @param {*} value The value to convert.
6595
     * @returns {string} Returns the converted string.
6596
     */
6597
    function objectToString(value) {
6598
      return nativeObjectToString.call(value);
6599
    }
6600
6601
    /**
6602
     * A specialized version of `baseRest` which transforms the rest array.
6603
     *
6604
     * @private
6605
     * @param {Function} func The function to apply a rest parameter to.
6606
     * @param {number} [start=func.length-1] The start position of the rest parameter.
6607
     * @param {Function} transform The rest array transform.
6608
     * @returns {Function} Returns the new function.
6609
     */
6610
    function overRest(func, start, transform) {
6611
      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
6612
      return function() {
6613
        var args = arguments,
6614
            index = -1,
6615
            length = nativeMax(args.length - start, 0),
6616
            array = Array(length);
6617
6618
        while (++index < length) {
6619
          array[index] = args[start + index];
6620
        }
6621
        index = -1;
6622
        var otherArgs = Array(start + 1);
6623
        while (++index < start) {
6624
          otherArgs[index] = args[index];
6625
        }
6626
        otherArgs[start] = transform(array);
6627
        return apply(func, this, otherArgs);
6628
      };
6629
    }
6630
6631
    /**
6632
     * Gets the parent value at `path` of `object`.
6633
     *
6634
     * @private
6635
     * @param {Object} object The object to query.
6636
     * @param {Array} path The path to get the parent value of.
6637
     * @returns {*} Returns the parent value.
6638
     */
6639
    function parent(object, path) {
6640
      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
6641
    }
6642
6643
    /**
6644
     * Reorder `array` according to the specified indexes where the element at
6645
     * the first index is assigned as the first element, the element at
6646
     * the second index is assigned as the second element, and so on.
6647
     *
6648
     * @private
6649
     * @param {Array} array The array to reorder.
6650
     * @param {Array} indexes The arranged array indexes.
6651
     * @returns {Array} Returns `array`.
6652
     */
6653
    function reorder(array, indexes) {
6654
      var arrLength = array.length,
6655
          length = nativeMin(indexes.length, arrLength),
6656
          oldArray = copyArray(array);
6657
6658
      while (length--) {
6659
        var index = indexes[length];
6660
        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
6661
      }
6662
      return array;
6663
    }
6664
6665
    /**
6666
     * Gets the value at `key`, unless `key` is "__proto__" or "constructor".
6667
     *
6668
     * @private
6669
     * @param {Object} object The object to query.
6670
     * @param {string} key The key of the property to get.
6671
     * @returns {*} Returns the property value.
6672
     */
6673
    function safeGet(object, key) {
6674
      if (key === 'constructor' && typeof object[key] === 'function') {
6675
        return;
6676
      }
6677
6678
      if (key == '__proto__') {
6679
        return;
6680
      }
6681
6682
      return object[key];
6683
    }
6684
6685
    /**
6686
     * Sets metadata for `func`.
6687
     *
6688
     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
6689
     * period of time, it will trip its breaker and transition to an identity
6690
     * function to avoid garbage collection pauses in V8. See
6691
     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
6692
     * for more details.
6693
     *
6694
     * @private
6695
     * @param {Function} func The function to associate metadata with.
6696
     * @param {*} data The metadata.
6697
     * @returns {Function} Returns `func`.
6698
     */
6699
    var setData = shortOut(baseSetData);
6700
6701
    /**
6702
     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).
6703
     *
6704
     * @private
6705
     * @param {Function} func The function to delay.
6706
     * @param {number} wait The number of milliseconds to delay invocation.
6707
     * @returns {number|Object} Returns the timer id or timeout object.
6708
     */
6709
    var setTimeout = ctxSetTimeout || function(func, wait) {
6710
      return root.setTimeout(func, wait);
6711
    };
6712
6713
    /**
6714
     * Sets the `toString` method of `func` to return `string`.
6715
     *
6716
     * @private
6717
     * @param {Function} func The function to modify.
6718
     * @param {Function} string The `toString` result.
6719
     * @returns {Function} Returns `func`.
6720
     */
6721
    var setToString = shortOut(baseSetToString);
6722
6723
    /**
6724
     * Sets the `toString` method of `wrapper` to mimic the source of `reference`
6725
     * with wrapper details in a comment at the top of the source body.
6726
     *
6727
     * @private
6728
     * @param {Function} wrapper The function to modify.
6729
     * @param {Function} reference The reference function.
6730
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6731
     * @returns {Function} Returns `wrapper`.
6732
     */
6733
    function setWrapToString(wrapper, reference, bitmask) {
6734
      var source = (reference + '');
6735
      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
6736
    }
6737
6738
    /**
6739
     * Creates a function that'll short out and invoke `identity` instead
6740
     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
6741
     * milliseconds.
6742
     *
6743
     * @private
6744
     * @param {Function} func The function to restrict.
6745
     * @returns {Function} Returns the new shortable function.
6746
     */
6747
    function shortOut(func) {
6748
      var count = 0,
6749
          lastCalled = 0;
6750
6751
      return function() {
6752
        var stamp = nativeNow(),
6753
            remaining = HOT_SPAN - (stamp - lastCalled);
6754
6755
        lastCalled = stamp;
6756
        if (remaining > 0) {
6757
          if (++count >= HOT_COUNT) {
6758
            return arguments[0];
6759
          }
6760
        } else {
6761
          count = 0;
6762
        }
6763
        return func.apply(undefined, arguments);
6764
      };
6765
    }
6766
6767
    /**
6768
     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.
6769
     *
6770
     * @private
6771
     * @param {Array} array The array to shuffle.
6772
     * @param {number} [size=array.length] The size of `array`.
6773
     * @returns {Array} Returns `array`.
6774
     */
6775
    function shuffleSelf(array, size) {
6776
      var index = -1,
6777
          length = array.length,
6778
          lastIndex = length - 1;
6779
6780
      size = size === undefined ? length : size;
6781
      while (++index < size) {
6782
        var rand = baseRandom(index, lastIndex),
6783
            value = array[rand];
6784
6785
        array[rand] = array[index];
6786
        array[index] = value;
6787
      }
6788
      array.length = size;
6789
      return array;
6790
    }
6791
6792
    /**
6793
     * Converts `string` to a property path array.
6794
     *
6795
     * @private
6796
     * @param {string} string The string to convert.
6797
     * @returns {Array} Returns the property path array.
6798
     */
6799
    var stringToPath = memoizeCapped(function(string) {
6800
      var result = [];
6801
      if (string.charCodeAt(0) === 46 /* . */) {
6802
        result.push('');
6803
      }
6804
      string.replace(rePropName, function(match, number, quote, subString) {
6805
        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
6806
      });
6807
      return result;
6808
    });
6809
6810
    /**
6811
     * Converts `value` to a string key if it's not a string or symbol.
6812
     *
6813
     * @private
6814
     * @param {*} value The value to inspect.
6815
     * @returns {string|symbol} Returns the key.
6816
     */
6817
    function toKey(value) {
6818
      if (typeof value == 'string' || isSymbol(value)) {
6819
        return value;
6820
      }
6821
      var result = (value + '');
6822
      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
6823
    }
6824
6825
    /**
6826
     * Converts `func` to its source code.
6827
     *
6828
     * @private
6829
     * @param {Function} func The function to convert.
6830
     * @returns {string} Returns the source code.
6831
     */
6832
    function toSource(func) {
6833
      if (func != null) {
6834
        try {
6835
          return funcToString.call(func);
6836
        } catch (e) {}
6837
        try {
6838
          return (func + '');
6839
        } catch (e) {}
6840
      }
6841
      return '';
6842
    }
6843
6844
    /**
6845
     * Updates wrapper `details` based on `bitmask` flags.
6846
     *
6847
     * @private
6848
     * @returns {Array} details The details to modify.
6849
     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
6850
     * @returns {Array} Returns `details`.
6851
     */
6852
    function updateWrapDetails(details, bitmask) {
6853
      arrayEach(wrapFlags, function(pair) {
6854
        var value = '_.' + pair[0];
6855
        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
6856
          details.push(value);
6857
        }
6858
      });
6859
      return details.sort();
6860
    }
6861
6862
    /**
6863
     * Creates a clone of `wrapper`.
6864
     *
6865
     * @private
6866
     * @param {Object} wrapper The wrapper to clone.
6867
     * @returns {Object} Returns the cloned wrapper.
6868
     */
6869
    function wrapperClone(wrapper) {
6870
      if (wrapper instanceof LazyWrapper) {
6871
        return wrapper.clone();
6872
      }
6873
      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
6874
      result.__actions__ = copyArray(wrapper.__actions__);
6875
      result.__index__  = wrapper.__index__;
6876
      result.__values__ = wrapper.__values__;
6877
      return result;
6878
    }
6879
6880
    /*------------------------------------------------------------------------*/
6881
6882
    /**
6883
     * Creates an array of elements split into groups the length of `size`.
6884
     * If `array` can't be split evenly, the final chunk will be the remaining
6885
     * elements.
6886
     *
6887
     * @static
6888
     * @memberOf _
6889
     * @since 3.0.0
6890
     * @category Array
6891
     * @param {Array} array The array to process.
6892
     * @param {number} [size=1] The length of each chunk
6893
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
6894
     * @returns {Array} Returns the new array of chunks.
6895
     * @example
6896
     *
6897
     * _.chunk(['a', 'b', 'c', 'd'], 2);
6898
     * // => [['a', 'b'], ['c', 'd']]
6899
     *
6900
     * _.chunk(['a', 'b', 'c', 'd'], 3);
6901
     * // => [['a', 'b', 'c'], ['d']]
6902
     */
6903
    function chunk(array, size, guard) {
6904
      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
6905
        size = 1;
6906
      } else {
6907
        size = nativeMax(toInteger(size), 0);
6908
      }
6909
      var length = array == null ? 0 : array.length;
6910
      if (!length || size < 1) {
6911
        return [];
6912
      }
6913
      var index = 0,
6914
          resIndex = 0,
6915
          result = Array(nativeCeil(length / size));
6916
6917
      while (index < length) {
6918
        result[resIndex++] = baseSlice(array, index, (index += size));
6919
      }
6920
      return result;
6921
    }
6922
6923
    /**
6924
     * Creates an array with all falsey values removed. The values `false`, `null`,
6925
     * `0`, `""`, `undefined`, and `NaN` are falsey.
6926
     *
6927
     * @static
6928
     * @memberOf _
6929
     * @since 0.1.0
6930
     * @category Array
6931
     * @param {Array} array The array to compact.
6932
     * @returns {Array} Returns the new array of filtered values.
6933
     * @example
6934
     *
6935
     * _.compact([0, 1, false, 2, '', 3]);
6936
     * // => [1, 2, 3]
6937
     */
6938
    function compact(array) {
6939
      var index = -1,
6940
          length = array == null ? 0 : array.length,
6941
          resIndex = 0,
6942
          result = [];
6943
6944
      while (++index < length) {
6945
        var value = array[index];
6946
        if (value) {
6947
          result[resIndex++] = value;
6948
        }
6949
      }
6950
      return result;
6951
    }
6952
6953
    /**
6954
     * Creates a new array concatenating `array` with any additional arrays
6955
     * and/or values.
6956
     *
6957
     * @static
6958
     * @memberOf _
6959
     * @since 4.0.0
6960
     * @category Array
6961
     * @param {Array} array The array to concatenate.
6962
     * @param {...*} [values] The values to concatenate.
6963
     * @returns {Array} Returns the new concatenated array.
6964
     * @example
6965
     *
6966
     * var array = [1];
6967
     * var other = _.concat(array, 2, [3], [[4]]);
6968
     *
6969
     * console.log(other);
6970
     * // => [1, 2, 3, [4]]
6971
     *
6972
     * console.log(array);
6973
     * // => [1]
6974
     */
6975
    function concat() {
6976
      var length = arguments.length;
6977
      if (!length) {
6978
        return [];
6979
      }
6980
      var args = Array(length - 1),
6981
          array = arguments[0],
6982
          index = length;
6983
6984
      while (index--) {
6985
        args[index - 1] = arguments[index];
6986
      }
6987
      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));
6988
    }
6989
6990
    /**
6991
     * Creates an array of `array` values not included in the other given arrays
6992
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
6993
     * for equality comparisons. The order and references of result values are
6994
     * determined by the first array.
6995
     *
6996
     * **Note:** Unlike `_.pullAll`, this method returns a new array.
6997
     *
6998
     * @static
6999
     * @memberOf _
7000
     * @since 0.1.0
7001
     * @category Array
7002
     * @param {Array} array The array to inspect.
7003
     * @param {...Array} [values] The values to exclude.
7004
     * @returns {Array} Returns the new array of filtered values.
7005
     * @see _.without, _.xor
7006
     * @example
7007
     *
7008
     * _.difference([2, 1], [2, 3]);
7009
     * // => [1]
7010
     */
7011
    var difference = baseRest(function(array, values) {
7012
      return isArrayLikeObject(array)
7013
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
7014
        : [];
7015
    });
7016
7017
    /**
7018
     * This method is like `_.difference` except that it accepts `iteratee` which
7019
     * is invoked for each element of `array` and `values` to generate the criterion
7020
     * by which they're compared. The order and references of result values are
7021
     * determined by the first array. The iteratee is invoked with one argument:
7022
     * (value).
7023
     *
7024
     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.
7025
     *
7026
     * @static
7027
     * @memberOf _
7028
     * @since 4.0.0
7029
     * @category Array
7030
     * @param {Array} array The array to inspect.
7031
     * @param {...Array} [values] The values to exclude.
7032
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7033
     * @returns {Array} Returns the new array of filtered values.
7034
     * @example
7035
     *
7036
     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7037
     * // => [1.2]
7038
     *
7039
     * // The `_.property` iteratee shorthand.
7040
     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
7041
     * // => [{ 'x': 2 }]
7042
     */
7043
    var differenceBy = baseRest(function(array, values) {
7044
      var iteratee = last(values);
7045
      if (isArrayLikeObject(iteratee)) {
7046
        iteratee = undefined;
7047
      }
7048
      return isArrayLikeObject(array)
7049
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))
7050
        : [];
7051
    });
7052
7053
    /**
7054
     * This method is like `_.difference` except that it accepts `comparator`
7055
     * which is invoked to compare elements of `array` to `values`. The order and
7056
     * references of result values are determined by the first array. The comparator
7057
     * is invoked with two arguments: (arrVal, othVal).
7058
     *
7059
     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.
7060
     *
7061
     * @static
7062
     * @memberOf _
7063
     * @since 4.0.0
7064
     * @category Array
7065
     * @param {Array} array The array to inspect.
7066
     * @param {...Array} [values] The values to exclude.
7067
     * @param {Function} [comparator] The comparator invoked per element.
7068
     * @returns {Array} Returns the new array of filtered values.
7069
     * @example
7070
     *
7071
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7072
     *
7073
     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
7074
     * // => [{ 'x': 2, 'y': 1 }]
7075
     */
7076
    var differenceWith = baseRest(function(array, values) {
7077
      var comparator = last(values);
7078
      if (isArrayLikeObject(comparator)) {
7079
        comparator = undefined;
7080
      }
7081
      return isArrayLikeObject(array)
7082
        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)
7083
        : [];
7084
    });
7085
7086
    /**
7087
     * Creates a slice of `array` with `n` elements dropped from the beginning.
7088
     *
7089
     * @static
7090
     * @memberOf _
7091
     * @since 0.5.0
7092
     * @category Array
7093
     * @param {Array} array The array to query.
7094
     * @param {number} [n=1] The number of elements to drop.
7095
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7096
     * @returns {Array} Returns the slice of `array`.
7097
     * @example
7098
     *
7099
     * _.drop([1, 2, 3]);
7100
     * // => [2, 3]
7101
     *
7102
     * _.drop([1, 2, 3], 2);
7103
     * // => [3]
7104
     *
7105
     * _.drop([1, 2, 3], 5);
7106
     * // => []
7107
     *
7108
     * _.drop([1, 2, 3], 0);
7109
     * // => [1, 2, 3]
7110
     */
7111
    function drop(array, n, guard) {
7112
      var length = array == null ? 0 : array.length;
7113
      if (!length) {
7114
        return [];
7115
      }
7116
      n = (guard || n === undefined) ? 1 : toInteger(n);
7117
      return baseSlice(array, n < 0 ? 0 : n, length);
7118
    }
7119
7120
    /**
7121
     * Creates a slice of `array` with `n` elements dropped from the end.
7122
     *
7123
     * @static
7124
     * @memberOf _
7125
     * @since 3.0.0
7126
     * @category Array
7127
     * @param {Array} array The array to query.
7128
     * @param {number} [n=1] The number of elements to drop.
7129
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
7130
     * @returns {Array} Returns the slice of `array`.
7131
     * @example
7132
     *
7133
     * _.dropRight([1, 2, 3]);
7134
     * // => [1, 2]
7135
     *
7136
     * _.dropRight([1, 2, 3], 2);
7137
     * // => [1]
7138
     *
7139
     * _.dropRight([1, 2, 3], 5);
7140
     * // => []
7141
     *
7142
     * _.dropRight([1, 2, 3], 0);
7143
     * // => [1, 2, 3]
7144
     */
7145
    function dropRight(array, n, guard) {
7146
      var length = array == null ? 0 : array.length;
7147
      if (!length) {
7148
        return [];
7149
      }
7150
      n = (guard || n === undefined) ? 1 : toInteger(n);
7151
      n = length - n;
7152
      return baseSlice(array, 0, n < 0 ? 0 : n);
7153
    }
7154
7155
    /**
7156
     * Creates a slice of `array` excluding elements dropped from the end.
7157
     * Elements are dropped until `predicate` returns falsey. The predicate is
7158
     * invoked with three arguments: (value, index, array).
7159
     *
7160
     * @static
7161
     * @memberOf _
7162
     * @since 3.0.0
7163
     * @category Array
7164
     * @param {Array} array The array to query.
7165
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7166
     * @returns {Array} Returns the slice of `array`.
7167
     * @example
7168
     *
7169
     * var users = [
7170
     *   { 'user': 'barney',  'active': true },
7171
     *   { 'user': 'fred',    'active': false },
7172
     *   { 'user': 'pebbles', 'active': false }
7173
     * ];
7174
     *
7175
     * _.dropRightWhile(users, function(o) { return !o.active; });
7176
     * // => objects for ['barney']
7177
     *
7178
     * // The `_.matches` iteratee shorthand.
7179
     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
7180
     * // => objects for ['barney', 'fred']
7181
     *
7182
     * // The `_.matchesProperty` iteratee shorthand.
7183
     * _.dropRightWhile(users, ['active', false]);
7184
     * // => objects for ['barney']
7185
     *
7186
     * // The `_.property` iteratee shorthand.
7187
     * _.dropRightWhile(users, 'active');
7188
     * // => objects for ['barney', 'fred', 'pebbles']
7189
     */
7190
    function dropRightWhile(array, predicate) {
7191
      return (array && array.length)
7192
        ? baseWhile(array, getIteratee(predicate, 3), true, true)
7193
        : [];
7194
    }
7195
7196
    /**
7197
     * Creates a slice of `array` excluding elements dropped from the beginning.
7198
     * Elements are dropped until `predicate` returns falsey. The predicate is
7199
     * invoked with three arguments: (value, index, array).
7200
     *
7201
     * @static
7202
     * @memberOf _
7203
     * @since 3.0.0
7204
     * @category Array
7205
     * @param {Array} array The array to query.
7206
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7207
     * @returns {Array} Returns the slice of `array`.
7208
     * @example
7209
     *
7210
     * var users = [
7211
     *   { 'user': 'barney',  'active': false },
7212
     *   { 'user': 'fred',    'active': false },
7213
     *   { 'user': 'pebbles', 'active': true }
7214
     * ];
7215
     *
7216
     * _.dropWhile(users, function(o) { return !o.active; });
7217
     * // => objects for ['pebbles']
7218
     *
7219
     * // The `_.matches` iteratee shorthand.
7220
     * _.dropWhile(users, { 'user': 'barney', 'active': false });
7221
     * // => objects for ['fred', 'pebbles']
7222
     *
7223
     * // The `_.matchesProperty` iteratee shorthand.
7224
     * _.dropWhile(users, ['active', false]);
7225
     * // => objects for ['pebbles']
7226
     *
7227
     * // The `_.property` iteratee shorthand.
7228
     * _.dropWhile(users, 'active');
7229
     * // => objects for ['barney', 'fred', 'pebbles']
7230
     */
7231
    function dropWhile(array, predicate) {
7232
      return (array && array.length)
7233
        ? baseWhile(array, getIteratee(predicate, 3), true)
7234
        : [];
7235
    }
7236
7237
    /**
7238
     * Fills elements of `array` with `value` from `start` up to, but not
7239
     * including, `end`.
7240
     *
7241
     * **Note:** This method mutates `array`.
7242
     *
7243
     * @static
7244
     * @memberOf _
7245
     * @since 3.2.0
7246
     * @category Array
7247
     * @param {Array} array The array to fill.
7248
     * @param {*} value The value to fill `array` with.
7249
     * @param {number} [start=0] The start position.
7250
     * @param {number} [end=array.length] The end position.
7251
     * @returns {Array} Returns `array`.
7252
     * @example
7253
     *
7254
     * var array = [1, 2, 3];
7255
     *
7256
     * _.fill(array, 'a');
7257
     * console.log(array);
7258
     * // => ['a', 'a', 'a']
7259
     *
7260
     * _.fill(Array(3), 2);
7261
     * // => [2, 2, 2]
7262
     *
7263
     * _.fill([4, 6, 8, 10], '*', 1, 3);
7264
     * // => [4, '*', '*', 10]
7265
     */
7266
    function fill(array, value, start, end) {
7267
      var length = array == null ? 0 : array.length;
7268
      if (!length) {
7269
        return [];
7270
      }
7271
      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {
7272
        start = 0;
7273
        end = length;
7274
      }
7275
      return baseFill(array, value, start, end);
7276
    }
7277
7278
    /**
7279
     * This method is like `_.find` except that it returns the index of the first
7280
     * element `predicate` returns truthy for instead of the element itself.
7281
     *
7282
     * @static
7283
     * @memberOf _
7284
     * @since 1.1.0
7285
     * @category Array
7286
     * @param {Array} array The array to inspect.
7287
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7288
     * @param {number} [fromIndex=0] The index to search from.
7289
     * @returns {number} Returns the index of the found element, else `-1`.
7290
     * @example
7291
     *
7292
     * var users = [
7293
     *   { 'user': 'barney',  'active': false },
7294
     *   { 'user': 'fred',    'active': false },
7295
     *   { 'user': 'pebbles', 'active': true }
7296
     * ];
7297
     *
7298
     * _.findIndex(users, function(o) { return o.user == 'barney'; });
7299
     * // => 0
7300
     *
7301
     * // The `_.matches` iteratee shorthand.
7302
     * _.findIndex(users, { 'user': 'fred', 'active': false });
7303
     * // => 1
7304
     *
7305
     * // The `_.matchesProperty` iteratee shorthand.
7306
     * _.findIndex(users, ['active', false]);
7307
     * // => 0
7308
     *
7309
     * // The `_.property` iteratee shorthand.
7310
     * _.findIndex(users, 'active');
7311
     * // => 2
7312
     */
7313
    function findIndex(array, predicate, fromIndex) {
7314
      var length = array == null ? 0 : array.length;
7315
      if (!length) {
7316
        return -1;
7317
      }
7318
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7319
      if (index < 0) {
7320
        index = nativeMax(length + index, 0);
7321
      }
7322
      return baseFindIndex(array, getIteratee(predicate, 3), index);
7323
    }
7324
7325
    /**
7326
     * This method is like `_.findIndex` except that it iterates over elements
7327
     * of `collection` from right to left.
7328
     *
7329
     * @static
7330
     * @memberOf _
7331
     * @since 2.0.0
7332
     * @category Array
7333
     * @param {Array} array The array to inspect.
7334
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7335
     * @param {number} [fromIndex=array.length-1] The index to search from.
7336
     * @returns {number} Returns the index of the found element, else `-1`.
7337
     * @example
7338
     *
7339
     * var users = [
7340
     *   { 'user': 'barney',  'active': true },
7341
     *   { 'user': 'fred',    'active': false },
7342
     *   { 'user': 'pebbles', 'active': false }
7343
     * ];
7344
     *
7345
     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
7346
     * // => 2
7347
     *
7348
     * // The `_.matches` iteratee shorthand.
7349
     * _.findLastIndex(users, { 'user': 'barney', 'active': true });
7350
     * // => 0
7351
     *
7352
     * // The `_.matchesProperty` iteratee shorthand.
7353
     * _.findLastIndex(users, ['active', false]);
7354
     * // => 2
7355
     *
7356
     * // The `_.property` iteratee shorthand.
7357
     * _.findLastIndex(users, 'active');
7358
     * // => 0
7359
     */
7360
    function findLastIndex(array, predicate, fromIndex) {
7361
      var length = array == null ? 0 : array.length;
7362
      if (!length) {
7363
        return -1;
7364
      }
7365
      var index = length - 1;
7366
      if (fromIndex !== undefined) {
7367
        index = toInteger(fromIndex);
7368
        index = fromIndex < 0
7369
          ? nativeMax(length + index, 0)
7370
          : nativeMin(index, length - 1);
7371
      }
7372
      return baseFindIndex(array, getIteratee(predicate, 3), index, true);
7373
    }
7374
7375
    /**
7376
     * Flattens `array` a single level deep.
7377
     *
7378
     * @static
7379
     * @memberOf _
7380
     * @since 0.1.0
7381
     * @category Array
7382
     * @param {Array} array The array to flatten.
7383
     * @returns {Array} Returns the new flattened array.
7384
     * @example
7385
     *
7386
     * _.flatten([1, [2, [3, [4]], 5]]);
7387
     * // => [1, 2, [3, [4]], 5]
7388
     */
7389
    function flatten(array) {
7390
      var length = array == null ? 0 : array.length;
7391
      return length ? baseFlatten(array, 1) : [];
7392
    }
7393
7394
    /**
7395
     * Recursively flattens `array`.
7396
     *
7397
     * @static
7398
     * @memberOf _
7399
     * @since 3.0.0
7400
     * @category Array
7401
     * @param {Array} array The array to flatten.
7402
     * @returns {Array} Returns the new flattened array.
7403
     * @example
7404
     *
7405
     * _.flattenDeep([1, [2, [3, [4]], 5]]);
7406
     * // => [1, 2, 3, 4, 5]
7407
     */
7408
    function flattenDeep(array) {
7409
      var length = array == null ? 0 : array.length;
7410
      return length ? baseFlatten(array, INFINITY) : [];
7411
    }
7412
7413
    /**
7414
     * Recursively flatten `array` up to `depth` times.
7415
     *
7416
     * @static
7417
     * @memberOf _
7418
     * @since 4.4.0
7419
     * @category Array
7420
     * @param {Array} array The array to flatten.
7421
     * @param {number} [depth=1] The maximum recursion depth.
7422
     * @returns {Array} Returns the new flattened array.
7423
     * @example
7424
     *
7425
     * var array = [1, [2, [3, [4]], 5]];
7426
     *
7427
     * _.flattenDepth(array, 1);
7428
     * // => [1, 2, [3, [4]], 5]
7429
     *
7430
     * _.flattenDepth(array, 2);
7431
     * // => [1, 2, 3, [4], 5]
7432
     */
7433
    function flattenDepth(array, depth) {
7434
      var length = array == null ? 0 : array.length;
7435
      if (!length) {
7436
        return [];
7437
      }
7438
      depth = depth === undefined ? 1 : toInteger(depth);
7439
      return baseFlatten(array, depth);
7440
    }
7441
7442
    /**
7443
     * The inverse of `_.toPairs`; this method returns an object composed
7444
     * from key-value `pairs`.
7445
     *
7446
     * @static
7447
     * @memberOf _
7448
     * @since 4.0.0
7449
     * @category Array
7450
     * @param {Array} pairs The key-value pairs.
7451
     * @returns {Object} Returns the new object.
7452
     * @example
7453
     *
7454
     * _.fromPairs([['a', 1], ['b', 2]]);
7455
     * // => { 'a': 1, 'b': 2 }
7456
     */
7457
    function fromPairs(pairs) {
7458
      var index = -1,
7459
          length = pairs == null ? 0 : pairs.length,
7460
          result = {};
7461
7462
      while (++index < length) {
7463
        var pair = pairs[index];
7464
        result[pair[0]] = pair[1];
7465
      }
7466
      return result;
7467
    }
7468
7469
    /**
7470
     * Gets the first element of `array`.
7471
     *
7472
     * @static
7473
     * @memberOf _
7474
     * @since 0.1.0
7475
     * @alias first
7476
     * @category Array
7477
     * @param {Array} array The array to query.
7478
     * @returns {*} Returns the first element of `array`.
7479
     * @example
7480
     *
7481
     * _.head([1, 2, 3]);
7482
     * // => 1
7483
     *
7484
     * _.head([]);
7485
     * // => undefined
7486
     */
7487
    function head(array) {
7488
      return (array && array.length) ? array[0] : undefined;
7489
    }
7490
7491
    /**
7492
     * Gets the index at which the first occurrence of `value` is found in `array`
7493
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7494
     * for equality comparisons. If `fromIndex` is negative, it's used as the
7495
     * offset from the end of `array`.
7496
     *
7497
     * @static
7498
     * @memberOf _
7499
     * @since 0.1.0
7500
     * @category Array
7501
     * @param {Array} array The array to inspect.
7502
     * @param {*} value The value to search for.
7503
     * @param {number} [fromIndex=0] The index to search from.
7504
     * @returns {number} Returns the index of the matched value, else `-1`.
7505
     * @example
7506
     *
7507
     * _.indexOf([1, 2, 1, 2], 2);
7508
     * // => 1
7509
     *
7510
     * // Search from the `fromIndex`.
7511
     * _.indexOf([1, 2, 1, 2], 2, 2);
7512
     * // => 3
7513
     */
7514
    function indexOf(array, value, fromIndex) {
7515
      var length = array == null ? 0 : array.length;
7516
      if (!length) {
7517
        return -1;
7518
      }
7519
      var index = fromIndex == null ? 0 : toInteger(fromIndex);
7520
      if (index < 0) {
7521
        index = nativeMax(length + index, 0);
7522
      }
7523
      return baseIndexOf(array, value, index);
7524
    }
7525
7526
    /**
7527
     * Gets all but the last element of `array`.
7528
     *
7529
     * @static
7530
     * @memberOf _
7531
     * @since 0.1.0
7532
     * @category Array
7533
     * @param {Array} array The array to query.
7534
     * @returns {Array} Returns the slice of `array`.
7535
     * @example
7536
     *
7537
     * _.initial([1, 2, 3]);
7538
     * // => [1, 2]
7539
     */
7540
    function initial(array) {
7541
      var length = array == null ? 0 : array.length;
7542
      return length ? baseSlice(array, 0, -1) : [];
7543
    }
7544
7545
    /**
7546
     * Creates an array of unique values that are included in all given arrays
7547
     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7548
     * for equality comparisons. The order and references of result values are
7549
     * determined by the first array.
7550
     *
7551
     * @static
7552
     * @memberOf _
7553
     * @since 0.1.0
7554
     * @category Array
7555
     * @param {...Array} [arrays] The arrays to inspect.
7556
     * @returns {Array} Returns the new array of intersecting values.
7557
     * @example
7558
     *
7559
     * _.intersection([2, 1], [2, 3]);
7560
     * // => [2]
7561
     */
7562
    var intersection = baseRest(function(arrays) {
7563
      var mapped = arrayMap(arrays, castArrayLikeObject);
7564
      return (mapped.length && mapped[0] === arrays[0])
7565
        ? baseIntersection(mapped)
7566
        : [];
7567
    });
7568
7569
    /**
7570
     * This method is like `_.intersection` except that it accepts `iteratee`
7571
     * which is invoked for each element of each `arrays` to generate the criterion
7572
     * by which they're compared. The order and references of result values are
7573
     * determined by the first array. The iteratee is invoked with one argument:
7574
     * (value).
7575
     *
7576
     * @static
7577
     * @memberOf _
7578
     * @since 4.0.0
7579
     * @category Array
7580
     * @param {...Array} [arrays] The arrays to inspect.
7581
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7582
     * @returns {Array} Returns the new array of intersecting values.
7583
     * @example
7584
     *
7585
     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);
7586
     * // => [2.1]
7587
     *
7588
     * // The `_.property` iteratee shorthand.
7589
     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
7590
     * // => [{ 'x': 1 }]
7591
     */
7592
    var intersectionBy = baseRest(function(arrays) {
7593
      var iteratee = last(arrays),
7594
          mapped = arrayMap(arrays, castArrayLikeObject);
7595
7596
      if (iteratee === last(mapped)) {
7597
        iteratee = undefined;
7598
      } else {
7599
        mapped.pop();
7600
      }
7601
      return (mapped.length && mapped[0] === arrays[0])
7602
        ? baseIntersection(mapped, getIteratee(iteratee, 2))
7603
        : [];
7604
    });
7605
7606
    /**
7607
     * This method is like `_.intersection` except that it accepts `comparator`
7608
     * which is invoked to compare elements of `arrays`. The order and references
7609
     * of result values are determined by the first array. The comparator is
7610
     * invoked with two arguments: (arrVal, othVal).
7611
     *
7612
     * @static
7613
     * @memberOf _
7614
     * @since 4.0.0
7615
     * @category Array
7616
     * @param {...Array} [arrays] The arrays to inspect.
7617
     * @param {Function} [comparator] The comparator invoked per element.
7618
     * @returns {Array} Returns the new array of intersecting values.
7619
     * @example
7620
     *
7621
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
7622
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
7623
     *
7624
     * _.intersectionWith(objects, others, _.isEqual);
7625
     * // => [{ 'x': 1, 'y': 2 }]
7626
     */
7627
    var intersectionWith = baseRest(function(arrays) {
7628
      var comparator = last(arrays),
7629
          mapped = arrayMap(arrays, castArrayLikeObject);
7630
7631
      comparator = typeof comparator == 'function' ? comparator : undefined;
7632
      if (comparator) {
7633
        mapped.pop();
7634
      }
7635
      return (mapped.length && mapped[0] === arrays[0])
7636
        ? baseIntersection(mapped, undefined, comparator)
7637
        : [];
7638
    });
7639
7640
    /**
7641
     * Converts all elements in `array` into a string separated by `separator`.
7642
     *
7643
     * @static
7644
     * @memberOf _
7645
     * @since 4.0.0
7646
     * @category Array
7647
     * @param {Array} array The array to convert.
7648
     * @param {string} [separator=','] The element separator.
7649
     * @returns {string} Returns the joined string.
7650
     * @example
7651
     *
7652
     * _.join(['a', 'b', 'c'], '~');
7653
     * // => 'a~b~c'
7654
     */
7655
    function join(array, separator) {
7656
      return array == null ? '' : nativeJoin.call(array, separator);
7657
    }
7658
7659
    /**
7660
     * Gets the last element of `array`.
7661
     *
7662
     * @static
7663
     * @memberOf _
7664
     * @since 0.1.0
7665
     * @category Array
7666
     * @param {Array} array The array to query.
7667
     * @returns {*} Returns the last element of `array`.
7668
     * @example
7669
     *
7670
     * _.last([1, 2, 3]);
7671
     * // => 3
7672
     */
7673
    function last(array) {
7674
      var length = array == null ? 0 : array.length;
7675
      return length ? array[length - 1] : undefined;
7676
    }
7677
7678
    /**
7679
     * This method is like `_.indexOf` except that it iterates over elements of
7680
     * `array` from right to left.
7681
     *
7682
     * @static
7683
     * @memberOf _
7684
     * @since 0.1.0
7685
     * @category Array
7686
     * @param {Array} array The array to inspect.
7687
     * @param {*} value The value to search for.
7688
     * @param {number} [fromIndex=array.length-1] The index to search from.
7689
     * @returns {number} Returns the index of the matched value, else `-1`.
7690
     * @example
7691
     *
7692
     * _.lastIndexOf([1, 2, 1, 2], 2);
7693
     * // => 3
7694
     *
7695
     * // Search from the `fromIndex`.
7696
     * _.lastIndexOf([1, 2, 1, 2], 2, 2);
7697
     * // => 1
7698
     */
7699
    function lastIndexOf(array, value, fromIndex) {
7700
      var length = array == null ? 0 : array.length;
7701
      if (!length) {
7702
        return -1;
7703
      }
7704
      var index = length;
7705
      if (fromIndex !== undefined) {
7706
        index = toInteger(fromIndex);
7707
        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
7708
      }
7709
      return value === value
7710
        ? strictLastIndexOf(array, value, index)
7711
        : baseFindIndex(array, baseIsNaN, index, true);
7712
    }
7713
7714
    /**
7715
     * Gets the element at index `n` of `array`. If `n` is negative, the nth
7716
     * element from the end is returned.
7717
     *
7718
     * @static
7719
     * @memberOf _
7720
     * @since 4.11.0
7721
     * @category Array
7722
     * @param {Array} array The array to query.
7723
     * @param {number} [n=0] The index of the element to return.
7724
     * @returns {*} Returns the nth element of `array`.
7725
     * @example
7726
     *
7727
     * var array = ['a', 'b', 'c', 'd'];
7728
     *
7729
     * _.nth(array, 1);
7730
     * // => 'b'
7731
     *
7732
     * _.nth(array, -2);
7733
     * // => 'c';
7734
     */
7735
    function nth(array, n) {
7736
      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;
7737
    }
7738
7739
    /**
7740
     * Removes all given values from `array` using
7741
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
7742
     * for equality comparisons.
7743
     *
7744
     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
7745
     * to remove elements from an array by predicate.
7746
     *
7747
     * @static
7748
     * @memberOf _
7749
     * @since 2.0.0
7750
     * @category Array
7751
     * @param {Array} array The array to modify.
7752
     * @param {...*} [values] The values to remove.
7753
     * @returns {Array} Returns `array`.
7754
     * @example
7755
     *
7756
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7757
     *
7758
     * _.pull(array, 'a', 'c');
7759
     * console.log(array);
7760
     * // => ['b', 'b']
7761
     */
7762
    var pull = baseRest(pullAll);
7763
7764
    /**
7765
     * This method is like `_.pull` except that it accepts an array of values to remove.
7766
     *
7767
     * **Note:** Unlike `_.difference`, this method mutates `array`.
7768
     *
7769
     * @static
7770
     * @memberOf _
7771
     * @since 4.0.0
7772
     * @category Array
7773
     * @param {Array} array The array to modify.
7774
     * @param {Array} values The values to remove.
7775
     * @returns {Array} Returns `array`.
7776
     * @example
7777
     *
7778
     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
7779
     *
7780
     * _.pullAll(array, ['a', 'c']);
7781
     * console.log(array);
7782
     * // => ['b', 'b']
7783
     */
7784
    function pullAll(array, values) {
7785
      return (array && array.length && values && values.length)
7786
        ? basePullAll(array, values)
7787
        : array;
7788
    }
7789
7790
    /**
7791
     * This method is like `_.pullAll` except that it accepts `iteratee` which is
7792
     * invoked for each element of `array` and `values` to generate the criterion
7793
     * by which they're compared. The iteratee is invoked with one argument: (value).
7794
     *
7795
     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
7796
     *
7797
     * @static
7798
     * @memberOf _
7799
     * @since 4.0.0
7800
     * @category Array
7801
     * @param {Array} array The array to modify.
7802
     * @param {Array} values The values to remove.
7803
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
7804
     * @returns {Array} Returns `array`.
7805
     * @example
7806
     *
7807
     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];
7808
     *
7809
     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');
7810
     * console.log(array);
7811
     * // => [{ 'x': 2 }]
7812
     */
7813
    function pullAllBy(array, values, iteratee) {
7814
      return (array && array.length && values && values.length)
7815
        ? basePullAll(array, values, getIteratee(iteratee, 2))
7816
        : array;
7817
    }
7818
7819
    /**
7820
     * This method is like `_.pullAll` except that it accepts `comparator` which
7821
     * is invoked to compare elements of `array` to `values`. The comparator is
7822
     * invoked with two arguments: (arrVal, othVal).
7823
     *
7824
     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.
7825
     *
7826
     * @static
7827
     * @memberOf _
7828
     * @since 4.6.0
7829
     * @category Array
7830
     * @param {Array} array The array to modify.
7831
     * @param {Array} values The values to remove.
7832
     * @param {Function} [comparator] The comparator invoked per element.
7833
     * @returns {Array} Returns `array`.
7834
     * @example
7835
     *
7836
     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];
7837
     *
7838
     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);
7839
     * console.log(array);
7840
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]
7841
     */
7842
    function pullAllWith(array, values, comparator) {
7843
      return (array && array.length && values && values.length)
7844
        ? basePullAll(array, values, undefined, comparator)
7845
        : array;
7846
    }
7847
7848
    /**
7849
     * Removes elements from `array` corresponding to `indexes` and returns an
7850
     * array of removed elements.
7851
     *
7852
     * **Note:** Unlike `_.at`, this method mutates `array`.
7853
     *
7854
     * @static
7855
     * @memberOf _
7856
     * @since 3.0.0
7857
     * @category Array
7858
     * @param {Array} array The array to modify.
7859
     * @param {...(number|number[])} [indexes] The indexes of elements to remove.
7860
     * @returns {Array} Returns the new array of removed elements.
7861
     * @example
7862
     *
7863
     * var array = ['a', 'b', 'c', 'd'];
7864
     * var pulled = _.pullAt(array, [1, 3]);
7865
     *
7866
     * console.log(array);
7867
     * // => ['a', 'c']
7868
     *
7869
     * console.log(pulled);
7870
     * // => ['b', 'd']
7871
     */
7872
    var pullAt = flatRest(function(array, indexes) {
7873
      var length = array == null ? 0 : array.length,
7874
          result = baseAt(array, indexes);
7875
7876
      basePullAt(array, arrayMap(indexes, function(index) {
7877
        return isIndex(index, length) ? +index : index;
7878
      }).sort(compareAscending));
7879
7880
      return result;
7881
    });
7882
7883
    /**
7884
     * Removes all elements from `array` that `predicate` returns truthy for
7885
     * and returns an array of the removed elements. The predicate is invoked
7886
     * with three arguments: (value, index, array).
7887
     *
7888
     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
7889
     * to pull elements from an array by value.
7890
     *
7891
     * @static
7892
     * @memberOf _
7893
     * @since 2.0.0
7894
     * @category Array
7895
     * @param {Array} array The array to modify.
7896
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
7897
     * @returns {Array} Returns the new array of removed elements.
7898
     * @example
7899
     *
7900
     * var array = [1, 2, 3, 4];
7901
     * var evens = _.remove(array, function(n) {
7902
     *   return n % 2 == 0;
7903
     * });
7904
     *
7905
     * console.log(array);
7906
     * // => [1, 3]
7907
     *
7908
     * console.log(evens);
7909
     * // => [2, 4]
7910
     */
7911
    function remove(array, predicate) {
7912
      var result = [];
7913
      if (!(array && array.length)) {
7914
        return result;
7915
      }
7916
      var index = -1,
7917
          indexes = [],
7918
          length = array.length;
7919
7920
      predicate = getIteratee(predicate, 3);
7921
      while (++index < length) {
7922
        var value = array[index];
7923
        if (predicate(value, index, array)) {
7924
          result.push(value);
7925
          indexes.push(index);
7926
        }
7927
      }
7928
      basePullAt(array, indexes);
7929
      return result;
7930
    }
7931
7932
    /**
7933
     * Reverses `array` so that the first element becomes the last, the second
7934
     * element becomes the second to last, and so on.
7935
     *
7936
     * **Note:** This method mutates `array` and is based on
7937
     * [`Array#reverse`](https://mdn.io/Array/reverse).
7938
     *
7939
     * @static
7940
     * @memberOf _
7941
     * @since 4.0.0
7942
     * @category Array
7943
     * @param {Array} array The array to modify.
7944
     * @returns {Array} Returns `array`.
7945
     * @example
7946
     *
7947
     * var array = [1, 2, 3];
7948
     *
7949
     * _.reverse(array);
7950
     * // => [3, 2, 1]
7951
     *
7952
     * console.log(array);
7953
     * // => [3, 2, 1]
7954
     */
7955
    function reverse(array) {
7956
      return array == null ? array : nativeReverse.call(array);
7957
    }
7958
7959
    /**
7960
     * Creates a slice of `array` from `start` up to, but not including, `end`.
7961
     *
7962
     * **Note:** This method is used instead of
7963
     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are
7964
     * returned.
7965
     *
7966
     * @static
7967
     * @memberOf _
7968
     * @since 3.0.0
7969
     * @category Array
7970
     * @param {Array} array The array to slice.
7971
     * @param {number} [start=0] The start position.
7972
     * @param {number} [end=array.length] The end position.
7973
     * @returns {Array} Returns the slice of `array`.
7974
     */
7975
    function slice(array, start, end) {
7976
      var length = array == null ? 0 : array.length;
7977
      if (!length) {
7978
        return [];
7979
      }
7980
      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {
7981
        start = 0;
7982
        end = length;
7983
      }
7984
      else {
7985
        start = start == null ? 0 : toInteger(start);
7986
        end = end === undefined ? length : toInteger(end);
7987
      }
7988
      return baseSlice(array, start, end);
7989
    }
7990
7991
    /**
7992
     * Uses a binary search to determine the lowest index at which `value`
7993
     * should be inserted into `array` in order to maintain its sort order.
7994
     *
7995
     * @static
7996
     * @memberOf _
7997
     * @since 0.1.0
7998
     * @category Array
7999
     * @param {Array} array The sorted array to inspect.
8000
     * @param {*} value The value to evaluate.
8001
     * @returns {number} Returns the index at which `value` should be inserted
8002
     *  into `array`.
8003
     * @example
8004
     *
8005
     * _.sortedIndex([30, 50], 40);
8006
     * // => 1
8007
     */
8008
    function sortedIndex(array, value) {
8009
      return baseSortedIndex(array, value);
8010
    }
8011
8012
    /**
8013
     * This method is like `_.sortedIndex` except that it accepts `iteratee`
8014
     * which is invoked for `value` and each element of `array` to compute their
8015
     * sort ranking. The iteratee is invoked with one argument: (value).
8016
     *
8017
     * @static
8018
     * @memberOf _
8019
     * @since 4.0.0
8020
     * @category Array
8021
     * @param {Array} array The sorted array to inspect.
8022
     * @param {*} value The value to evaluate.
8023
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8024
     * @returns {number} Returns the index at which `value` should be inserted
8025
     *  into `array`.
8026
     * @example
8027
     *
8028
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
8029
     *
8030
     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8031
     * // => 0
8032
     *
8033
     * // The `_.property` iteratee shorthand.
8034
     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');
8035
     * // => 0
8036
     */
8037
    function sortedIndexBy(array, value, iteratee) {
8038
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));
8039
    }
8040
8041
    /**
8042
     * This method is like `_.indexOf` except that it performs a binary
8043
     * search on a sorted `array`.
8044
     *
8045
     * @static
8046
     * @memberOf _
8047
     * @since 4.0.0
8048
     * @category Array
8049
     * @param {Array} array The array to inspect.
8050
     * @param {*} value The value to search for.
8051
     * @returns {number} Returns the index of the matched value, else `-1`.
8052
     * @example
8053
     *
8054
     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);
8055
     * // => 1
8056
     */
8057
    function sortedIndexOf(array, value) {
8058
      var length = array == null ? 0 : array.length;
8059
      if (length) {
8060
        var index = baseSortedIndex(array, value);
8061
        if (index < length && eq(array[index], value)) {
8062
          return index;
8063
        }
8064
      }
8065
      return -1;
8066
    }
8067
8068
    /**
8069
     * This method is like `_.sortedIndex` except that it returns the highest
8070
     * index at which `value` should be inserted into `array` in order to
8071
     * maintain its sort order.
8072
     *
8073
     * @static
8074
     * @memberOf _
8075
     * @since 3.0.0
8076
     * @category Array
8077
     * @param {Array} array The sorted array to inspect.
8078
     * @param {*} value The value to evaluate.
8079
     * @returns {number} Returns the index at which `value` should be inserted
8080
     *  into `array`.
8081
     * @example
8082
     *
8083
     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);
8084
     * // => 4
8085
     */
8086
    function sortedLastIndex(array, value) {
8087
      return baseSortedIndex(array, value, true);
8088
    }
8089
8090
    /**
8091
     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`
8092
     * which is invoked for `value` and each element of `array` to compute their
8093
     * sort ranking. The iteratee is invoked with one argument: (value).
8094
     *
8095
     * @static
8096
     * @memberOf _
8097
     * @since 4.0.0
8098
     * @category Array
8099
     * @param {Array} array The sorted array to inspect.
8100
     * @param {*} value The value to evaluate.
8101
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8102
     * @returns {number} Returns the index at which `value` should be inserted
8103
     *  into `array`.
8104
     * @example
8105
     *
8106
     * var objects = [{ 'x': 4 }, { 'x': 5 }];
8107
     *
8108
     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });
8109
     * // => 1
8110
     *
8111
     * // The `_.property` iteratee shorthand.
8112
     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');
8113
     * // => 1
8114
     */
8115
    function sortedLastIndexBy(array, value, iteratee) {
8116
      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);
8117
    }
8118
8119
    /**
8120
     * This method is like `_.lastIndexOf` except that it performs a binary
8121
     * search on a sorted `array`.
8122
     *
8123
     * @static
8124
     * @memberOf _
8125
     * @since 4.0.0
8126
     * @category Array
8127
     * @param {Array} array The array to inspect.
8128
     * @param {*} value The value to search for.
8129
     * @returns {number} Returns the index of the matched value, else `-1`.
8130
     * @example
8131
     *
8132
     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);
8133
     * // => 3
8134
     */
8135
    function sortedLastIndexOf(array, value) {
8136
      var length = array == null ? 0 : array.length;
8137
      if (length) {
8138
        var index = baseSortedIndex(array, value, true) - 1;
8139
        if (eq(array[index], value)) {
8140
          return index;
8141
        }
8142
      }
8143
      return -1;
8144
    }
8145
8146
    /**
8147
     * This method is like `_.uniq` except that it's designed and optimized
8148
     * for sorted arrays.
8149
     *
8150
     * @static
8151
     * @memberOf _
8152
     * @since 4.0.0
8153
     * @category Array
8154
     * @param {Array} array The array to inspect.
8155
     * @returns {Array} Returns the new duplicate free array.
8156
     * @example
8157
     *
8158
     * _.sortedUniq([1, 1, 2]);
8159
     * // => [1, 2]
8160
     */
8161
    function sortedUniq(array) {
8162
      return (array && array.length)
8163
        ? baseSortedUniq(array)
8164
        : [];
8165
    }
8166
8167
    /**
8168
     * This method is like `_.uniqBy` except that it's designed and optimized
8169
     * for sorted arrays.
8170
     *
8171
     * @static
8172
     * @memberOf _
8173
     * @since 4.0.0
8174
     * @category Array
8175
     * @param {Array} array The array to inspect.
8176
     * @param {Function} [iteratee] The iteratee invoked per element.
8177
     * @returns {Array} Returns the new duplicate free array.
8178
     * @example
8179
     *
8180
     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
8181
     * // => [1.1, 2.3]
8182
     */
8183
    function sortedUniqBy(array, iteratee) {
8184
      return (array && array.length)
8185
        ? baseSortedUniq(array, getIteratee(iteratee, 2))
8186
        : [];
8187
    }
8188
8189
    /**
8190
     * Gets all but the first element of `array`.
8191
     *
8192
     * @static
8193
     * @memberOf _
8194
     * @since 4.0.0
8195
     * @category Array
8196
     * @param {Array} array The array to query.
8197
     * @returns {Array} Returns the slice of `array`.
8198
     * @example
8199
     *
8200
     * _.tail([1, 2, 3]);
8201
     * // => [2, 3]
8202
     */
8203
    function tail(array) {
8204
      var length = array == null ? 0 : array.length;
8205
      return length ? baseSlice(array, 1, length) : [];
8206
    }
8207
8208
    /**
8209
     * Creates a slice of `array` with `n` elements taken from the beginning.
8210
     *
8211
     * @static
8212
     * @memberOf _
8213
     * @since 0.1.0
8214
     * @category Array
8215
     * @param {Array} array The array to query.
8216
     * @param {number} [n=1] The number of elements to take.
8217
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8218
     * @returns {Array} Returns the slice of `array`.
8219
     * @example
8220
     *
8221
     * _.take([1, 2, 3]);
8222
     * // => [1]
8223
     *
8224
     * _.take([1, 2, 3], 2);
8225
     * // => [1, 2]
8226
     *
8227
     * _.take([1, 2, 3], 5);
8228
     * // => [1, 2, 3]
8229
     *
8230
     * _.take([1, 2, 3], 0);
8231
     * // => []
8232
     */
8233
    function take(array, n, guard) {
8234
      if (!(array && array.length)) {
8235
        return [];
8236
      }
8237
      n = (guard || n === undefined) ? 1 : toInteger(n);
8238
      return baseSlice(array, 0, n < 0 ? 0 : n);
8239
    }
8240
8241
    /**
8242
     * Creates a slice of `array` with `n` elements taken from the end.
8243
     *
8244
     * @static
8245
     * @memberOf _
8246
     * @since 3.0.0
8247
     * @category Array
8248
     * @param {Array} array The array to query.
8249
     * @param {number} [n=1] The number of elements to take.
8250
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
8251
     * @returns {Array} Returns the slice of `array`.
8252
     * @example
8253
     *
8254
     * _.takeRight([1, 2, 3]);
8255
     * // => [3]
8256
     *
8257
     * _.takeRight([1, 2, 3], 2);
8258
     * // => [2, 3]
8259
     *
8260
     * _.takeRight([1, 2, 3], 5);
8261
     * // => [1, 2, 3]
8262
     *
8263
     * _.takeRight([1, 2, 3], 0);
8264
     * // => []
8265
     */
8266
    function takeRight(array, n, guard) {
8267
      var length = array == null ? 0 : array.length;
8268
      if (!length) {
8269
        return [];
8270
      }
8271
      n = (guard || n === undefined) ? 1 : toInteger(n);
8272
      n = length - n;
8273
      return baseSlice(array, n < 0 ? 0 : n, length);
8274
    }
8275
8276
    /**
8277
     * Creates a slice of `array` with elements taken from the end. Elements are
8278
     * taken until `predicate` returns falsey. The predicate is invoked with
8279
     * three arguments: (value, index, array).
8280
     *
8281
     * @static
8282
     * @memberOf _
8283
     * @since 3.0.0
8284
     * @category Array
8285
     * @param {Array} array The array to query.
8286
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8287
     * @returns {Array} Returns the slice of `array`.
8288
     * @example
8289
     *
8290
     * var users = [
8291
     *   { 'user': 'barney',  'active': true },
8292
     *   { 'user': 'fred',    'active': false },
8293
     *   { 'user': 'pebbles', 'active': false }
8294
     * ];
8295
     *
8296
     * _.takeRightWhile(users, function(o) { return !o.active; });
8297
     * // => objects for ['fred', 'pebbles']
8298
     *
8299
     * // The `_.matches` iteratee shorthand.
8300
     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
8301
     * // => objects for ['pebbles']
8302
     *
8303
     * // The `_.matchesProperty` iteratee shorthand.
8304
     * _.takeRightWhile(users, ['active', false]);
8305
     * // => objects for ['fred', 'pebbles']
8306
     *
8307
     * // The `_.property` iteratee shorthand.
8308
     * _.takeRightWhile(users, 'active');
8309
     * // => []
8310
     */
8311
    function takeRightWhile(array, predicate) {
8312
      return (array && array.length)
8313
        ? baseWhile(array, getIteratee(predicate, 3), false, true)
8314
        : [];
8315
    }
8316
8317
    /**
8318
     * Creates a slice of `array` with elements taken from the beginning. Elements
8319
     * are taken until `predicate` returns falsey. The predicate is invoked with
8320
     * three arguments: (value, index, array).
8321
     *
8322
     * @static
8323
     * @memberOf _
8324
     * @since 3.0.0
8325
     * @category Array
8326
     * @param {Array} array The array to query.
8327
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
8328
     * @returns {Array} Returns the slice of `array`.
8329
     * @example
8330
     *
8331
     * var users = [
8332
     *   { 'user': 'barney',  'active': false },
8333
     *   { 'user': 'fred',    'active': false },
8334
     *   { 'user': 'pebbles', 'active': true }
8335
     * ];
8336
     *
8337
     * _.takeWhile(users, function(o) { return !o.active; });
8338
     * // => objects for ['barney', 'fred']
8339
     *
8340
     * // The `_.matches` iteratee shorthand.
8341
     * _.takeWhile(users, { 'user': 'barney', 'active': false });
8342
     * // => objects for ['barney']
8343
     *
8344
     * // The `_.matchesProperty` iteratee shorthand.
8345
     * _.takeWhile(users, ['active', false]);
8346
     * // => objects for ['barney', 'fred']
8347
     *
8348
     * // The `_.property` iteratee shorthand.
8349
     * _.takeWhile(users, 'active');
8350
     * // => []
8351
     */
8352
    function takeWhile(array, predicate) {
8353
      return (array && array.length)
8354
        ? baseWhile(array, getIteratee(predicate, 3))
8355
        : [];
8356
    }
8357
8358
    /**
8359
     * Creates an array of unique values, in order, from all given arrays using
8360
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8361
     * for equality comparisons.
8362
     *
8363
     * @static
8364
     * @memberOf _
8365
     * @since 0.1.0
8366
     * @category Array
8367
     * @param {...Array} [arrays] The arrays to inspect.
8368
     * @returns {Array} Returns the new array of combined values.
8369
     * @example
8370
     *
8371
     * _.union([2], [1, 2]);
8372
     * // => [2, 1]
8373
     */
8374
    var union = baseRest(function(arrays) {
8375
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
8376
    });
8377
8378
    /**
8379
     * This method is like `_.union` except that it accepts `iteratee` which is
8380
     * invoked for each element of each `arrays` to generate the criterion by
8381
     * which uniqueness is computed. Result values are chosen from the first
8382
     * array in which the value occurs. The iteratee is invoked with one argument:
8383
     * (value).
8384
     *
8385
     * @static
8386
     * @memberOf _
8387
     * @since 4.0.0
8388
     * @category Array
8389
     * @param {...Array} [arrays] The arrays to inspect.
8390
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8391
     * @returns {Array} Returns the new array of combined values.
8392
     * @example
8393
     *
8394
     * _.unionBy([2.1], [1.2, 2.3], Math.floor);
8395
     * // => [2.1, 1.2]
8396
     *
8397
     * // The `_.property` iteratee shorthand.
8398
     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8399
     * // => [{ 'x': 1 }, { 'x': 2 }]
8400
     */
8401
    var unionBy = baseRest(function(arrays) {
8402
      var iteratee = last(arrays);
8403
      if (isArrayLikeObject(iteratee)) {
8404
        iteratee = undefined;
8405
      }
8406
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));
8407
    });
8408
8409
    /**
8410
     * This method is like `_.union` except that it accepts `comparator` which
8411
     * is invoked to compare elements of `arrays`. Result values are chosen from
8412
     * the first array in which the value occurs. The comparator is invoked
8413
     * with two arguments: (arrVal, othVal).
8414
     *
8415
     * @static
8416
     * @memberOf _
8417
     * @since 4.0.0
8418
     * @category Array
8419
     * @param {...Array} [arrays] The arrays to inspect.
8420
     * @param {Function} [comparator] The comparator invoked per element.
8421
     * @returns {Array} Returns the new array of combined values.
8422
     * @example
8423
     *
8424
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8425
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8426
     *
8427
     * _.unionWith(objects, others, _.isEqual);
8428
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8429
     */
8430
    var unionWith = baseRest(function(arrays) {
8431
      var comparator = last(arrays);
8432
      comparator = typeof comparator == 'function' ? comparator : undefined;
8433
      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);
8434
    });
8435
8436
    /**
8437
     * Creates a duplicate-free version of an array, using
8438
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8439
     * for equality comparisons, in which only the first occurrence of each element
8440
     * is kept. The order of result values is determined by the order they occur
8441
     * in the array.
8442
     *
8443
     * @static
8444
     * @memberOf _
8445
     * @since 0.1.0
8446
     * @category Array
8447
     * @param {Array} array The array to inspect.
8448
     * @returns {Array} Returns the new duplicate free array.
8449
     * @example
8450
     *
8451
     * _.uniq([2, 1, 2]);
8452
     * // => [2, 1]
8453
     */
8454
    function uniq(array) {
8455
      return (array && array.length) ? baseUniq(array) : [];
8456
    }
8457
8458
    /**
8459
     * This method is like `_.uniq` except that it accepts `iteratee` which is
8460
     * invoked for each element in `array` to generate the criterion by which
8461
     * uniqueness is computed. The order of result values is determined by the
8462
     * order they occur in the array. The iteratee is invoked with one argument:
8463
     * (value).
8464
     *
8465
     * @static
8466
     * @memberOf _
8467
     * @since 4.0.0
8468
     * @category Array
8469
     * @param {Array} array The array to inspect.
8470
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8471
     * @returns {Array} Returns the new duplicate free array.
8472
     * @example
8473
     *
8474
     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
8475
     * // => [2.1, 1.2]
8476
     *
8477
     * // The `_.property` iteratee shorthand.
8478
     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
8479
     * // => [{ 'x': 1 }, { 'x': 2 }]
8480
     */
8481
    function uniqBy(array, iteratee) {
8482
      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];
8483
    }
8484
8485
    /**
8486
     * This method is like `_.uniq` except that it accepts `comparator` which
8487
     * is invoked to compare elements of `array`. The order of result values is
8488
     * determined by the order they occur in the array.The comparator is invoked
8489
     * with two arguments: (arrVal, othVal).
8490
     *
8491
     * @static
8492
     * @memberOf _
8493
     * @since 4.0.0
8494
     * @category Array
8495
     * @param {Array} array The array to inspect.
8496
     * @param {Function} [comparator] The comparator invoked per element.
8497
     * @returns {Array} Returns the new duplicate free array.
8498
     * @example
8499
     *
8500
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];
8501
     *
8502
     * _.uniqWith(objects, _.isEqual);
8503
     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]
8504
     */
8505
    function uniqWith(array, comparator) {
8506
      comparator = typeof comparator == 'function' ? comparator : undefined;
8507
      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];
8508
    }
8509
8510
    /**
8511
     * This method is like `_.zip` except that it accepts an array of grouped
8512
     * elements and creates an array regrouping the elements to their pre-zip
8513
     * configuration.
8514
     *
8515
     * @static
8516
     * @memberOf _
8517
     * @since 1.2.0
8518
     * @category Array
8519
     * @param {Array} array The array of grouped elements to process.
8520
     * @returns {Array} Returns the new array of regrouped elements.
8521
     * @example
8522
     *
8523
     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);
8524
     * // => [['a', 1, true], ['b', 2, false]]
8525
     *
8526
     * _.unzip(zipped);
8527
     * // => [['a', 'b'], [1, 2], [true, false]]
8528
     */
8529
    function unzip(array) {
8530
      if (!(array && array.length)) {
8531
        return [];
8532
      }
8533
      var length = 0;
8534
      array = arrayFilter(array, function(group) {
8535
        if (isArrayLikeObject(group)) {
8536
          length = nativeMax(group.length, length);
8537
          return true;
8538
        }
8539
      });
8540
      return baseTimes(length, function(index) {
8541
        return arrayMap(array, baseProperty(index));
8542
      });
8543
    }
8544
8545
    /**
8546
     * This method is like `_.unzip` except that it accepts `iteratee` to specify
8547
     * how regrouped values should be combined. The iteratee is invoked with the
8548
     * elements of each group: (...group).
8549
     *
8550
     * @static
8551
     * @memberOf _
8552
     * @since 3.8.0
8553
     * @category Array
8554
     * @param {Array} array The array of grouped elements to process.
8555
     * @param {Function} [iteratee=_.identity] The function to combine
8556
     *  regrouped values.
8557
     * @returns {Array} Returns the new array of regrouped elements.
8558
     * @example
8559
     *
8560
     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);
8561
     * // => [[1, 10, 100], [2, 20, 200]]
8562
     *
8563
     * _.unzipWith(zipped, _.add);
8564
     * // => [3, 30, 300]
8565
     */
8566
    function unzipWith(array, iteratee) {
8567
      if (!(array && array.length)) {
8568
        return [];
8569
      }
8570
      var result = unzip(array);
8571
      if (iteratee == null) {
8572
        return result;
8573
      }
8574
      return arrayMap(result, function(group) {
8575
        return apply(iteratee, undefined, group);
8576
      });
8577
    }
8578
8579
    /**
8580
     * Creates an array excluding all given values using
8581
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
8582
     * for equality comparisons.
8583
     *
8584
     * **Note:** Unlike `_.pull`, this method returns a new array.
8585
     *
8586
     * @static
8587
     * @memberOf _
8588
     * @since 0.1.0
8589
     * @category Array
8590
     * @param {Array} array The array to inspect.
8591
     * @param {...*} [values] The values to exclude.
8592
     * @returns {Array} Returns the new array of filtered values.
8593
     * @see _.difference, _.xor
8594
     * @example
8595
     *
8596
     * _.without([2, 1, 2, 3], 1, 2);
8597
     * // => [3]
8598
     */
8599
    var without = baseRest(function(array, values) {
8600
      return isArrayLikeObject(array)
8601
        ? baseDifference(array, values)
8602
        : [];
8603
    });
8604
8605
    /**
8606
     * Creates an array of unique values that is the
8607
     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
8608
     * of the given arrays. The order of result values is determined by the order
8609
     * they occur in the arrays.
8610
     *
8611
     * @static
8612
     * @memberOf _
8613
     * @since 2.4.0
8614
     * @category Array
8615
     * @param {...Array} [arrays] The arrays to inspect.
8616
     * @returns {Array} Returns the new array of filtered values.
8617
     * @see _.difference, _.without
8618
     * @example
8619
     *
8620
     * _.xor([2, 1], [2, 3]);
8621
     * // => [1, 3]
8622
     */
8623
    var xor = baseRest(function(arrays) {
8624
      return baseXor(arrayFilter(arrays, isArrayLikeObject));
8625
    });
8626
8627
    /**
8628
     * This method is like `_.xor` except that it accepts `iteratee` which is
8629
     * invoked for each element of each `arrays` to generate the criterion by
8630
     * which by which they're compared. The order of result values is determined
8631
     * by the order they occur in the arrays. The iteratee is invoked with one
8632
     * argument: (value).
8633
     *
8634
     * @static
8635
     * @memberOf _
8636
     * @since 4.0.0
8637
     * @category Array
8638
     * @param {...Array} [arrays] The arrays to inspect.
8639
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
8640
     * @returns {Array} Returns the new array of filtered values.
8641
     * @example
8642
     *
8643
     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);
8644
     * // => [1.2, 3.4]
8645
     *
8646
     * // The `_.property` iteratee shorthand.
8647
     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
8648
     * // => [{ 'x': 2 }]
8649
     */
8650
    var xorBy = baseRest(function(arrays) {
8651
      var iteratee = last(arrays);
8652
      if (isArrayLikeObject(iteratee)) {
8653
        iteratee = undefined;
8654
      }
8655
      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));
8656
    });
8657
8658
    /**
8659
     * This method is like `_.xor` except that it accepts `comparator` which is
8660
     * invoked to compare elements of `arrays`. The order of result values is
8661
     * determined by the order they occur in the arrays. The comparator is invoked
8662
     * with two arguments: (arrVal, othVal).
8663
     *
8664
     * @static
8665
     * @memberOf _
8666
     * @since 4.0.0
8667
     * @category Array
8668
     * @param {...Array} [arrays] The arrays to inspect.
8669
     * @param {Function} [comparator] The comparator invoked per element.
8670
     * @returns {Array} Returns the new array of filtered values.
8671
     * @example
8672
     *
8673
     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
8674
     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
8675
     *
8676
     * _.xorWith(objects, others, _.isEqual);
8677
     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]
8678
     */
8679
    var xorWith = baseRest(function(arrays) {
8680
      var comparator = last(arrays);
8681
      comparator = typeof comparator == 'function' ? comparator : undefined;
8682
      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);
8683
    });
8684
8685
    /**
8686
     * Creates an array of grouped elements, the first of which contains the
8687
     * first elements of the given arrays, the second of which contains the
8688
     * second elements of the given arrays, and so on.
8689
     *
8690
     * @static
8691
     * @memberOf _
8692
     * @since 0.1.0
8693
     * @category Array
8694
     * @param {...Array} [arrays] The arrays to process.
8695
     * @returns {Array} Returns the new array of grouped elements.
8696
     * @example
8697
     *
8698
     * _.zip(['a', 'b'], [1, 2], [true, false]);
8699
     * // => [['a', 1, true], ['b', 2, false]]
8700
     */
8701
    var zip = baseRest(unzip);
8702
8703
    /**
8704
     * This method is like `_.fromPairs` except that it accepts two arrays,
8705
     * one of property identifiers and one of corresponding values.
8706
     *
8707
     * @static
8708
     * @memberOf _
8709
     * @since 0.4.0
8710
     * @category Array
8711
     * @param {Array} [props=[]] The property identifiers.
8712
     * @param {Array} [values=[]] The property values.
8713
     * @returns {Object} Returns the new object.
8714
     * @example
8715
     *
8716
     * _.zipObject(['a', 'b'], [1, 2]);
8717
     * // => { 'a': 1, 'b': 2 }
8718
     */
8719
    function zipObject(props, values) {
8720
      return baseZipObject(props || [], values || [], assignValue);
8721
    }
8722
8723
    /**
8724
     * This method is like `_.zipObject` except that it supports property paths.
8725
     *
8726
     * @static
8727
     * @memberOf _
8728
     * @since 4.1.0
8729
     * @category Array
8730
     * @param {Array} [props=[]] The property identifiers.
8731
     * @param {Array} [values=[]] The property values.
8732
     * @returns {Object} Returns the new object.
8733
     * @example
8734
     *
8735
     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
8736
     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
8737
     */
8738
    function zipObjectDeep(props, values) {
8739
      return baseZipObject(props || [], values || [], baseSet);
8740
    }
8741
8742
    /**
8743
     * This method is like `_.zip` except that it accepts `iteratee` to specify
8744
     * how grouped values should be combined. The iteratee is invoked with the
8745
     * elements of each group: (...group).
8746
     *
8747
     * @static
8748
     * @memberOf _
8749
     * @since 3.8.0
8750
     * @category Array
8751
     * @param {...Array} [arrays] The arrays to process.
8752
     * @param {Function} [iteratee=_.identity] The function to combine
8753
     *  grouped values.
8754
     * @returns {Array} Returns the new array of grouped elements.
8755
     * @example
8756
     *
8757
     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {
8758
     *   return a + b + c;
8759
     * });
8760
     * // => [111, 222]
8761
     */
8762
    var zipWith = baseRest(function(arrays) {
8763
      var length = arrays.length,
8764
          iteratee = length > 1 ? arrays[length - 1] : undefined;
8765
8766
      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;
8767
      return unzipWith(arrays, iteratee);
8768
    });
8769
8770
    /*------------------------------------------------------------------------*/
8771
8772
    /**
8773
     * Creates a `lodash` wrapper instance that wraps `value` with explicit method
8774
     * chain sequences enabled. The result of such sequences must be unwrapped
8775
     * with `_#value`.
8776
     *
8777
     * @static
8778
     * @memberOf _
8779
     * @since 1.3.0
8780
     * @category Seq
8781
     * @param {*} value The value to wrap.
8782
     * @returns {Object} Returns the new `lodash` wrapper instance.
8783
     * @example
8784
     *
8785
     * var users = [
8786
     *   { 'user': 'barney',  'age': 36 },
8787
     *   { 'user': 'fred',    'age': 40 },
8788
     *   { 'user': 'pebbles', 'age': 1 }
8789
     * ];
8790
     *
8791
     * var youngest = _
8792
     *   .chain(users)
8793
     *   .sortBy('age')
8794
     *   .map(function(o) {
8795
     *     return o.user + ' is ' + o.age;
8796
     *   })
8797
     *   .head()
8798
     *   .value();
8799
     * // => 'pebbles is 1'
8800
     */
8801
    function chain(value) {
8802
      var result = lodash(value);
8803
      result.__chain__ = true;
8804
      return result;
8805
    }
8806
8807
    /**
8808
     * This method invokes `interceptor` and returns `value`. The interceptor
8809
     * is invoked with one argument; (value). The purpose of this method is to
8810
     * "tap into" a method chain sequence in order to modify intermediate results.
8811
     *
8812
     * @static
8813
     * @memberOf _
8814
     * @since 0.1.0
8815
     * @category Seq
8816
     * @param {*} value The value to provide to `interceptor`.
8817
     * @param {Function} interceptor The function to invoke.
8818
     * @returns {*} Returns `value`.
8819
     * @example
8820
     *
8821
     * _([1, 2, 3])
8822
     *  .tap(function(array) {
8823
     *    // Mutate input array.
8824
     *    array.pop();
8825
     *  })
8826
     *  .reverse()
8827
     *  .value();
8828
     * // => [2, 1]
8829
     */
8830
    function tap(value, interceptor) {
8831
      interceptor(value);
8832
      return value;
8833
    }
8834
8835
    /**
8836
     * This method is like `_.tap` except that it returns the result of `interceptor`.
8837
     * The purpose of this method is to "pass thru" values replacing intermediate
8838
     * results in a method chain sequence.
8839
     *
8840
     * @static
8841
     * @memberOf _
8842
     * @since 3.0.0
8843
     * @category Seq
8844
     * @param {*} value The value to provide to `interceptor`.
8845
     * @param {Function} interceptor The function to invoke.
8846
     * @returns {*} Returns the result of `interceptor`.
8847
     * @example
8848
     *
8849
     * _('  abc  ')
8850
     *  .chain()
8851
     *  .trim()
8852
     *  .thru(function(value) {
8853
     *    return [value];
8854
     *  })
8855
     *  .value();
8856
     * // => ['abc']
8857
     */
8858
    function thru(value, interceptor) {
8859
      return interceptor(value);
8860
    }
8861
8862
    /**
8863
     * This method is the wrapper version of `_.at`.
8864
     *
8865
     * @name at
8866
     * @memberOf _
8867
     * @since 1.0.0
8868
     * @category Seq
8869
     * @param {...(string|string[])} [paths] The property paths to pick.
8870
     * @returns {Object} Returns the new `lodash` wrapper instance.
8871
     * @example
8872
     *
8873
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
8874
     *
8875
     * _(object).at(['a[0].b.c', 'a[1]']).value();
8876
     * // => [3, 4]
8877
     */
8878
    var wrapperAt = flatRest(function(paths) {
8879
      var length = paths.length,
8880
          start = length ? paths[0] : 0,
8881
          value = this.__wrapped__,
8882
          interceptor = function(object) { return baseAt(object, paths); };
8883
8884
      if (length > 1 || this.__actions__.length ||
8885
          !(value instanceof LazyWrapper) || !isIndex(start)) {
8886
        return this.thru(interceptor);
8887
      }
8888
      value = value.slice(start, +start + (length ? 1 : 0));
8889
      value.__actions__.push({
8890
        'func': thru,
8891
        'args': [interceptor],
8892
        'thisArg': undefined
8893
      });
8894
      return new LodashWrapper(value, this.__chain__).thru(function(array) {
8895
        if (length && !array.length) {
8896
          array.push(undefined);
8897
        }
8898
        return array;
8899
      });
8900
    });
8901
8902
    /**
8903
     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.
8904
     *
8905
     * @name chain
8906
     * @memberOf _
8907
     * @since 0.1.0
8908
     * @category Seq
8909
     * @returns {Object} Returns the new `lodash` wrapper instance.
8910
     * @example
8911
     *
8912
     * var users = [
8913
     *   { 'user': 'barney', 'age': 36 },
8914
     *   { 'user': 'fred',   'age': 40 }
8915
     * ];
8916
     *
8917
     * // A sequence without explicit chaining.
8918
     * _(users).head();
8919
     * // => { 'user': 'barney', 'age': 36 }
8920
     *
8921
     * // A sequence with explicit chaining.
8922
     * _(users)
8923
     *   .chain()
8924
     *   .head()
8925
     *   .pick('user')
8926
     *   .value();
8927
     * // => { 'user': 'barney' }
8928
     */
8929
    function wrapperChain() {
8930
      return chain(this);
8931
    }
8932
8933
    /**
8934
     * Executes the chain sequence and returns the wrapped result.
8935
     *
8936
     * @name commit
8937
     * @memberOf _
8938
     * @since 3.2.0
8939
     * @category Seq
8940
     * @returns {Object} Returns the new `lodash` wrapper instance.
8941
     * @example
8942
     *
8943
     * var array = [1, 2];
8944
     * var wrapped = _(array).push(3);
8945
     *
8946
     * console.log(array);
8947
     * // => [1, 2]
8948
     *
8949
     * wrapped = wrapped.commit();
8950
     * console.log(array);
8951
     * // => [1, 2, 3]
8952
     *
8953
     * wrapped.last();
8954
     * // => 3
8955
     *
8956
     * console.log(array);
8957
     * // => [1, 2, 3]
8958
     */
8959
    function wrapperCommit() {
8960
      return new LodashWrapper(this.value(), this.__chain__);
8961
    }
8962
8963
    /**
8964
     * Gets the next value on a wrapped object following the
8965
     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).
8966
     *
8967
     * @name next
8968
     * @memberOf _
8969
     * @since 4.0.0
8970
     * @category Seq
8971
     * @returns {Object} Returns the next iterator value.
8972
     * @example
8973
     *
8974
     * var wrapped = _([1, 2]);
8975
     *
8976
     * wrapped.next();
8977
     * // => { 'done': false, 'value': 1 }
8978
     *
8979
     * wrapped.next();
8980
     * // => { 'done': false, 'value': 2 }
8981
     *
8982
     * wrapped.next();
8983
     * // => { 'done': true, 'value': undefined }
8984
     */
8985
    function wrapperNext() {
8986
      if (this.__values__ === undefined) {
8987
        this.__values__ = toArray(this.value());
8988
      }
8989
      var done = this.__index__ >= this.__values__.length,
8990
          value = done ? undefined : this.__values__[this.__index__++];
8991
8992
      return { 'done': done, 'value': value };
8993
    }
8994
8995
    /**
8996
     * Enables the wrapper to be iterable.
8997
     *
8998
     * @name Symbol.iterator
8999
     * @memberOf _
9000
     * @since 4.0.0
9001
     * @category Seq
9002
     * @returns {Object} Returns the wrapper object.
9003
     * @example
9004
     *
9005
     * var wrapped = _([1, 2]);
9006
     *
9007
     * wrapped[Symbol.iterator]() === wrapped;
9008
     * // => true
9009
     *
9010
     * Array.from(wrapped);
9011
     * // => [1, 2]
9012
     */
9013
    function wrapperToIterator() {
9014
      return this;
9015
    }
9016
9017
    /**
9018
     * Creates a clone of the chain sequence planting `value` as the wrapped value.
9019
     *
9020
     * @name plant
9021
     * @memberOf _
9022
     * @since 3.2.0
9023
     * @category Seq
9024
     * @param {*} value The value to plant.
9025
     * @returns {Object} Returns the new `lodash` wrapper instance.
9026
     * @example
9027
     *
9028
     * function square(n) {
9029
     *   return n * n;
9030
     * }
9031
     *
9032
     * var wrapped = _([1, 2]).map(square);
9033
     * var other = wrapped.plant([3, 4]);
9034
     *
9035
     * other.value();
9036
     * // => [9, 16]
9037
     *
9038
     * wrapped.value();
9039
     * // => [1, 4]
9040
     */
9041
    function wrapperPlant(value) {
9042
      var result,
9043
          parent = this;
9044
9045
      while (parent instanceof baseLodash) {
9046
        var clone = wrapperClone(parent);
9047
        clone.__index__ = 0;
9048
        clone.__values__ = undefined;
9049
        if (result) {
9050
          previous.__wrapped__ = clone;
9051
        } else {
9052
          result = clone;
9053
        }
9054
        var previous = clone;
9055
        parent = parent.__wrapped__;
9056
      }
9057
      previous.__wrapped__ = value;
9058
      return result;
9059
    }
9060
9061
    /**
9062
     * This method is the wrapper version of `_.reverse`.
9063
     *
9064
     * **Note:** This method mutates the wrapped array.
9065
     *
9066
     * @name reverse
9067
     * @memberOf _
9068
     * @since 0.1.0
9069
     * @category Seq
9070
     * @returns {Object} Returns the new `lodash` wrapper instance.
9071
     * @example
9072
     *
9073
     * var array = [1, 2, 3];
9074
     *
9075
     * _(array).reverse().value()
9076
     * // => [3, 2, 1]
9077
     *
9078
     * console.log(array);
9079
     * // => [3, 2, 1]
9080
     */
9081
    function wrapperReverse() {
9082
      var value = this.__wrapped__;
9083
      if (value instanceof LazyWrapper) {
9084
        var wrapped = value;
9085
        if (this.__actions__.length) {
9086
          wrapped = new LazyWrapper(this);
9087
        }
9088
        wrapped = wrapped.reverse();
9089
        wrapped.__actions__.push({
9090
          'func': thru,
9091
          'args': [reverse],
9092
          'thisArg': undefined
9093
        });
9094
        return new LodashWrapper(wrapped, this.__chain__);
9095
      }
9096
      return this.thru(reverse);
9097
    }
9098
9099
    /**
9100
     * Executes the chain sequence to resolve the unwrapped value.
9101
     *
9102
     * @name value
9103
     * @memberOf _
9104
     * @since 0.1.0
9105
     * @alias toJSON, valueOf
9106
     * @category Seq
9107
     * @returns {*} Returns the resolved unwrapped value.
9108
     * @example
9109
     *
9110
     * _([1, 2, 3]).value();
9111
     * // => [1, 2, 3]
9112
     */
9113
    function wrapperValue() {
9114
      return baseWrapperValue(this.__wrapped__, this.__actions__);
9115
    }
9116
9117
    /*------------------------------------------------------------------------*/
9118
9119
    /**
9120
     * Creates an object composed of keys generated from the results of running
9121
     * each element of `collection` thru `iteratee`. The corresponding value of
9122
     * each key is the number of times the key was returned by `iteratee`. The
9123
     * iteratee is invoked with one argument: (value).
9124
     *
9125
     * @static
9126
     * @memberOf _
9127
     * @since 0.5.0
9128
     * @category Collection
9129
     * @param {Array|Object} collection The collection to iterate over.
9130
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9131
     * @returns {Object} Returns the composed aggregate object.
9132
     * @example
9133
     *
9134
     * _.countBy([6.1, 4.2, 6.3], Math.floor);
9135
     * // => { '4': 1, '6': 2 }
9136
     *
9137
     * // The `_.property` iteratee shorthand.
9138
     * _.countBy(['one', 'two', 'three'], 'length');
9139
     * // => { '3': 2, '5': 1 }
9140
     */
9141
    var countBy = createAggregator(function(result, value, key) {
9142
      if (hasOwnProperty.call(result, key)) {
9143
        ++result[key];
9144
      } else {
9145
        baseAssignValue(result, key, 1);
9146
      }
9147
    });
9148
9149
    /**
9150
     * Checks if `predicate` returns truthy for **all** elements of `collection`.
9151
     * Iteration is stopped once `predicate` returns falsey. The predicate is
9152
     * invoked with three arguments: (value, index|key, collection).
9153
     *
9154
     * **Note:** This method returns `true` for
9155
     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
9156
     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
9157
     * elements of empty collections.
9158
     *
9159
     * @static
9160
     * @memberOf _
9161
     * @since 0.1.0
9162
     * @category Collection
9163
     * @param {Array|Object} collection The collection to iterate over.
9164
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9165
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9166
     * @returns {boolean} Returns `true` if all elements pass the predicate check,
9167
     *  else `false`.
9168
     * @example
9169
     *
9170
     * _.every([true, 1, null, 'yes'], Boolean);
9171
     * // => false
9172
     *
9173
     * var users = [
9174
     *   { 'user': 'barney', 'age': 36, 'active': false },
9175
     *   { 'user': 'fred',   'age': 40, 'active': false }
9176
     * ];
9177
     *
9178
     * // The `_.matches` iteratee shorthand.
9179
     * _.every(users, { 'user': 'barney', 'active': false });
9180
     * // => false
9181
     *
9182
     * // The `_.matchesProperty` iteratee shorthand.
9183
     * _.every(users, ['active', false]);
9184
     * // => true
9185
     *
9186
     * // The `_.property` iteratee shorthand.
9187
     * _.every(users, 'active');
9188
     * // => false
9189
     */
9190
    function every(collection, predicate, guard) {
9191
      var func = isArray(collection) ? arrayEvery : baseEvery;
9192
      if (guard && isIterateeCall(collection, predicate, guard)) {
9193
        predicate = undefined;
9194
      }
9195
      return func(collection, getIteratee(predicate, 3));
9196
    }
9197
9198
    /**
9199
     * Iterates over elements of `collection`, returning an array of all elements
9200
     * `predicate` returns truthy for. The predicate is invoked with three
9201
     * arguments: (value, index|key, collection).
9202
     *
9203
     * **Note:** Unlike `_.remove`, this method returns a new array.
9204
     *
9205
     * @static
9206
     * @memberOf _
9207
     * @since 0.1.0
9208
     * @category Collection
9209
     * @param {Array|Object} collection The collection to iterate over.
9210
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9211
     * @returns {Array} Returns the new filtered array.
9212
     * @see _.reject
9213
     * @example
9214
     *
9215
     * var users = [
9216
     *   { 'user': 'barney', 'age': 36, 'active': true },
9217
     *   { 'user': 'fred',   'age': 40, 'active': false }
9218
     * ];
9219
     *
9220
     * _.filter(users, function(o) { return !o.active; });
9221
     * // => objects for ['fred']
9222
     *
9223
     * // The `_.matches` iteratee shorthand.
9224
     * _.filter(users, { 'age': 36, 'active': true });
9225
     * // => objects for ['barney']
9226
     *
9227
     * // The `_.matchesProperty` iteratee shorthand.
9228
     * _.filter(users, ['active', false]);
9229
     * // => objects for ['fred']
9230
     *
9231
     * // The `_.property` iteratee shorthand.
9232
     * _.filter(users, 'active');
9233
     * // => objects for ['barney']
9234
     *
9235
     * // Combining several predicates using `_.overEvery` or `_.overSome`.
9236
     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));
9237
     * // => objects for ['fred', 'barney']
9238
     */
9239
    function filter(collection, predicate) {
9240
      var func = isArray(collection) ? arrayFilter : baseFilter;
9241
      return func(collection, getIteratee(predicate, 3));
9242
    }
9243
9244
    /**
9245
     * Iterates over elements of `collection`, returning the first element
9246
     * `predicate` returns truthy for. The predicate is invoked with three
9247
     * arguments: (value, index|key, collection).
9248
     *
9249
     * @static
9250
     * @memberOf _
9251
     * @since 0.1.0
9252
     * @category Collection
9253
     * @param {Array|Object} collection The collection to inspect.
9254
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9255
     * @param {number} [fromIndex=0] The index to search from.
9256
     * @returns {*} Returns the matched element, else `undefined`.
9257
     * @example
9258
     *
9259
     * var users = [
9260
     *   { 'user': 'barney',  'age': 36, 'active': true },
9261
     *   { 'user': 'fred',    'age': 40, 'active': false },
9262
     *   { 'user': 'pebbles', 'age': 1,  'active': true }
9263
     * ];
9264
     *
9265
     * _.find(users, function(o) { return o.age < 40; });
9266
     * // => object for 'barney'
9267
     *
9268
     * // The `_.matches` iteratee shorthand.
9269
     * _.find(users, { 'age': 1, 'active': true });
9270
     * // => object for 'pebbles'
9271
     *
9272
     * // The `_.matchesProperty` iteratee shorthand.
9273
     * _.find(users, ['active', false]);
9274
     * // => object for 'fred'
9275
     *
9276
     * // The `_.property` iteratee shorthand.
9277
     * _.find(users, 'active');
9278
     * // => object for 'barney'
9279
     */
9280
    var find = createFind(findIndex);
9281
9282
    /**
9283
     * This method is like `_.find` except that it iterates over elements of
9284
     * `collection` from right to left.
9285
     *
9286
     * @static
9287
     * @memberOf _
9288
     * @since 2.0.0
9289
     * @category Collection
9290
     * @param {Array|Object} collection The collection to inspect.
9291
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9292
     * @param {number} [fromIndex=collection.length-1] The index to search from.
9293
     * @returns {*} Returns the matched element, else `undefined`.
9294
     * @example
9295
     *
9296
     * _.findLast([1, 2, 3, 4], function(n) {
9297
     *   return n % 2 == 1;
9298
     * });
9299
     * // => 3
9300
     */
9301
    var findLast = createFind(findLastIndex);
9302
9303
    /**
9304
     * Creates a flattened array of values by running each element in `collection`
9305
     * thru `iteratee` and flattening the mapped results. The iteratee is invoked
9306
     * with three arguments: (value, index|key, collection).
9307
     *
9308
     * @static
9309
     * @memberOf _
9310
     * @since 4.0.0
9311
     * @category Collection
9312
     * @param {Array|Object} collection The collection to iterate over.
9313
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9314
     * @returns {Array} Returns the new flattened array.
9315
     * @example
9316
     *
9317
     * function duplicate(n) {
9318
     *   return [n, n];
9319
     * }
9320
     *
9321
     * _.flatMap([1, 2], duplicate);
9322
     * // => [1, 1, 2, 2]
9323
     */
9324
    function flatMap(collection, iteratee) {
9325
      return baseFlatten(map(collection, iteratee), 1);
9326
    }
9327
9328
    /**
9329
     * This method is like `_.flatMap` except that it recursively flattens the
9330
     * mapped results.
9331
     *
9332
     * @static
9333
     * @memberOf _
9334
     * @since 4.7.0
9335
     * @category Collection
9336
     * @param {Array|Object} collection The collection to iterate over.
9337
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9338
     * @returns {Array} Returns the new flattened array.
9339
     * @example
9340
     *
9341
     * function duplicate(n) {
9342
     *   return [[[n, n]]];
9343
     * }
9344
     *
9345
     * _.flatMapDeep([1, 2], duplicate);
9346
     * // => [1, 1, 2, 2]
9347
     */
9348
    function flatMapDeep(collection, iteratee) {
9349
      return baseFlatten(map(collection, iteratee), INFINITY);
9350
    }
9351
9352
    /**
9353
     * This method is like `_.flatMap` except that it recursively flattens the
9354
     * mapped results up to `depth` times.
9355
     *
9356
     * @static
9357
     * @memberOf _
9358
     * @since 4.7.0
9359
     * @category Collection
9360
     * @param {Array|Object} collection The collection to iterate over.
9361
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9362
     * @param {number} [depth=1] The maximum recursion depth.
9363
     * @returns {Array} Returns the new flattened array.
9364
     * @example
9365
     *
9366
     * function duplicate(n) {
9367
     *   return [[[n, n]]];
9368
     * }
9369
     *
9370
     * _.flatMapDepth([1, 2], duplicate, 2);
9371
     * // => [[1, 1], [2, 2]]
9372
     */
9373
    function flatMapDepth(collection, iteratee, depth) {
9374
      depth = depth === undefined ? 1 : toInteger(depth);
9375
      return baseFlatten(map(collection, iteratee), depth);
9376
    }
9377
9378
    /**
9379
     * Iterates over elements of `collection` and invokes `iteratee` for each element.
9380
     * The iteratee is invoked with three arguments: (value, index|key, collection).
9381
     * Iteratee functions may exit iteration early by explicitly returning `false`.
9382
     *
9383
     * **Note:** As with other "Collections" methods, objects with a "length"
9384
     * property are iterated like arrays. To avoid this behavior use `_.forIn`
9385
     * or `_.forOwn` for object iteration.
9386
     *
9387
     * @static
9388
     * @memberOf _
9389
     * @since 0.1.0
9390
     * @alias each
9391
     * @category Collection
9392
     * @param {Array|Object} collection The collection to iterate over.
9393
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9394
     * @returns {Array|Object} Returns `collection`.
9395
     * @see _.forEachRight
9396
     * @example
9397
     *
9398
     * _.forEach([1, 2], function(value) {
9399
     *   console.log(value);
9400
     * });
9401
     * // => Logs `1` then `2`.
9402
     *
9403
     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
9404
     *   console.log(key);
9405
     * });
9406
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
9407
     */
9408
    function forEach(collection, iteratee) {
9409
      var func = isArray(collection) ? arrayEach : baseEach;
9410
      return func(collection, getIteratee(iteratee, 3));
9411
    }
9412
9413
    /**
9414
     * This method is like `_.forEach` except that it iterates over elements of
9415
     * `collection` from right to left.
9416
     *
9417
     * @static
9418
     * @memberOf _
9419
     * @since 2.0.0
9420
     * @alias eachRight
9421
     * @category Collection
9422
     * @param {Array|Object} collection The collection to iterate over.
9423
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9424
     * @returns {Array|Object} Returns `collection`.
9425
     * @see _.forEach
9426
     * @example
9427
     *
9428
     * _.forEachRight([1, 2], function(value) {
9429
     *   console.log(value);
9430
     * });
9431
     * // => Logs `2` then `1`.
9432
     */
9433
    function forEachRight(collection, iteratee) {
9434
      var func = isArray(collection) ? arrayEachRight : baseEachRight;
9435
      return func(collection, getIteratee(iteratee, 3));
9436
    }
9437
9438
    /**
9439
     * Creates an object composed of keys generated from the results of running
9440
     * each element of `collection` thru `iteratee`. The order of grouped values
9441
     * is determined by the order they occur in `collection`. The corresponding
9442
     * value of each key is an array of elements responsible for generating the
9443
     * key. The iteratee is invoked with one argument: (value).
9444
     *
9445
     * @static
9446
     * @memberOf _
9447
     * @since 0.1.0
9448
     * @category Collection
9449
     * @param {Array|Object} collection The collection to iterate over.
9450
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9451
     * @returns {Object} Returns the composed aggregate object.
9452
     * @example
9453
     *
9454
     * _.groupBy([6.1, 4.2, 6.3], Math.floor);
9455
     * // => { '4': [4.2], '6': [6.1, 6.3] }
9456
     *
9457
     * // The `_.property` iteratee shorthand.
9458
     * _.groupBy(['one', 'two', 'three'], 'length');
9459
     * // => { '3': ['one', 'two'], '5': ['three'] }
9460
     */
9461
    var groupBy = createAggregator(function(result, value, key) {
9462
      if (hasOwnProperty.call(result, key)) {
9463
        result[key].push(value);
9464
      } else {
9465
        baseAssignValue(result, key, [value]);
9466
      }
9467
    });
9468
9469
    /**
9470
     * Checks if `value` is in `collection`. If `collection` is a string, it's
9471
     * checked for a substring of `value`, otherwise
9472
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
9473
     * is used for equality comparisons. If `fromIndex` is negative, it's used as
9474
     * the offset from the end of `collection`.
9475
     *
9476
     * @static
9477
     * @memberOf _
9478
     * @since 0.1.0
9479
     * @category Collection
9480
     * @param {Array|Object|string} collection The collection to inspect.
9481
     * @param {*} value The value to search for.
9482
     * @param {number} [fromIndex=0] The index to search from.
9483
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9484
     * @returns {boolean} Returns `true` if `value` is found, else `false`.
9485
     * @example
9486
     *
9487
     * _.includes([1, 2, 3], 1);
9488
     * // => true
9489
     *
9490
     * _.includes([1, 2, 3], 1, 2);
9491
     * // => false
9492
     *
9493
     * _.includes({ 'a': 1, 'b': 2 }, 1);
9494
     * // => true
9495
     *
9496
     * _.includes('abcd', 'bc');
9497
     * // => true
9498
     */
9499
    function includes(collection, value, fromIndex, guard) {
9500
      collection = isArrayLike(collection) ? collection : values(collection);
9501
      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
9502
9503
      var length = collection.length;
9504
      if (fromIndex < 0) {
9505
        fromIndex = nativeMax(length + fromIndex, 0);
9506
      }
9507
      return isString(collection)
9508
        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
9509
        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
9510
    }
9511
9512
    /**
9513
     * Invokes the method at `path` of each element in `collection`, returning
9514
     * an array of the results of each invoked method. Any additional arguments
9515
     * are provided to each invoked method. If `path` is a function, it's invoked
9516
     * for, and `this` bound to, each element in `collection`.
9517
     *
9518
     * @static
9519
     * @memberOf _
9520
     * @since 4.0.0
9521
     * @category Collection
9522
     * @param {Array|Object} collection The collection to iterate over.
9523
     * @param {Array|Function|string} path The path of the method to invoke or
9524
     *  the function invoked per iteration.
9525
     * @param {...*} [args] The arguments to invoke each method with.
9526
     * @returns {Array} Returns the array of results.
9527
     * @example
9528
     *
9529
     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');
9530
     * // => [[1, 5, 7], [1, 2, 3]]
9531
     *
9532
     * _.invokeMap([123, 456], String.prototype.split, '');
9533
     * // => [['1', '2', '3'], ['4', '5', '6']]
9534
     */
9535
    var invokeMap = baseRest(function(collection, path, args) {
9536
      var index = -1,
9537
          isFunc = typeof path == 'function',
9538
          result = isArrayLike(collection) ? Array(collection.length) : [];
9539
9540
      baseEach(collection, function(value) {
9541
        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
9542
      });
9543
      return result;
9544
    });
9545
9546
    /**
9547
     * Creates an object composed of keys generated from the results of running
9548
     * each element of `collection` thru `iteratee`. The corresponding value of
9549
     * each key is the last element responsible for generating the key. The
9550
     * iteratee is invoked with one argument: (value).
9551
     *
9552
     * @static
9553
     * @memberOf _
9554
     * @since 4.0.0
9555
     * @category Collection
9556
     * @param {Array|Object} collection The collection to iterate over.
9557
     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
9558
     * @returns {Object} Returns the composed aggregate object.
9559
     * @example
9560
     *
9561
     * var array = [
9562
     *   { 'dir': 'left', 'code': 97 },
9563
     *   { 'dir': 'right', 'code': 100 }
9564
     * ];
9565
     *
9566
     * _.keyBy(array, function(o) {
9567
     *   return String.fromCharCode(o.code);
9568
     * });
9569
     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
9570
     *
9571
     * _.keyBy(array, 'dir');
9572
     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
9573
     */
9574
    var keyBy = createAggregator(function(result, value, key) {
9575
      baseAssignValue(result, key, value);
9576
    });
9577
9578
    /**
9579
     * Creates an array of values by running each element in `collection` thru
9580
     * `iteratee`. The iteratee is invoked with three arguments:
9581
     * (value, index|key, collection).
9582
     *
9583
     * Many lodash methods are guarded to work as iteratees for methods like
9584
     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
9585
     *
9586
     * The guarded methods are:
9587
     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
9588
     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
9589
     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
9590
     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
9591
     *
9592
     * @static
9593
     * @memberOf _
9594
     * @since 0.1.0
9595
     * @category Collection
9596
     * @param {Array|Object} collection The collection to iterate over.
9597
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9598
     * @returns {Array} Returns the new mapped array.
9599
     * @example
9600
     *
9601
     * function square(n) {
9602
     *   return n * n;
9603
     * }
9604
     *
9605
     * _.map([4, 8], square);
9606
     * // => [16, 64]
9607
     *
9608
     * _.map({ 'a': 4, 'b': 8 }, square);
9609
     * // => [16, 64] (iteration order is not guaranteed)
9610
     *
9611
     * var users = [
9612
     *   { 'user': 'barney' },
9613
     *   { 'user': 'fred' }
9614
     * ];
9615
     *
9616
     * // The `_.property` iteratee shorthand.
9617
     * _.map(users, 'user');
9618
     * // => ['barney', 'fred']
9619
     */
9620
    function map(collection, iteratee) {
9621
      var func = isArray(collection) ? arrayMap : baseMap;
9622
      return func(collection, getIteratee(iteratee, 3));
9623
    }
9624
9625
    /**
9626
     * This method is like `_.sortBy` except that it allows specifying the sort
9627
     * orders of the iteratees to sort by. If `orders` is unspecified, all values
9628
     * are sorted in ascending order. Otherwise, specify an order of "desc" for
9629
     * descending or "asc" for ascending sort order of corresponding values.
9630
     *
9631
     * @static
9632
     * @memberOf _
9633
     * @since 4.0.0
9634
     * @category Collection
9635
     * @param {Array|Object} collection The collection to iterate over.
9636
     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]
9637
     *  The iteratees to sort by.
9638
     * @param {string[]} [orders] The sort orders of `iteratees`.
9639
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
9640
     * @returns {Array} Returns the new sorted array.
9641
     * @example
9642
     *
9643
     * var users = [
9644
     *   { 'user': 'fred',   'age': 48 },
9645
     *   { 'user': 'barney', 'age': 34 },
9646
     *   { 'user': 'fred',   'age': 40 },
9647
     *   { 'user': 'barney', 'age': 36 }
9648
     * ];
9649
     *
9650
     * // Sort by `user` in ascending order and by `age` in descending order.
9651
     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
9652
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]
9653
     */
9654
    function orderBy(collection, iteratees, orders, guard) {
9655
      if (collection == null) {
9656
        return [];
9657
      }
9658
      if (!isArray(iteratees)) {
9659
        iteratees = iteratees == null ? [] : [iteratees];
9660
      }
9661
      orders = guard ? undefined : orders;
9662
      if (!isArray(orders)) {
9663
        orders = orders == null ? [] : [orders];
9664
      }
9665
      return baseOrderBy(collection, iteratees, orders);
9666
    }
9667
9668
    /**
9669
     * Creates an array of elements split into two groups, the first of which
9670
     * contains elements `predicate` returns truthy for, the second of which
9671
     * contains elements `predicate` returns falsey for. The predicate is
9672
     * invoked with one argument: (value).
9673
     *
9674
     * @static
9675
     * @memberOf _
9676
     * @since 3.0.0
9677
     * @category Collection
9678
     * @param {Array|Object} collection The collection to iterate over.
9679
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9680
     * @returns {Array} Returns the array of grouped elements.
9681
     * @example
9682
     *
9683
     * var users = [
9684
     *   { 'user': 'barney',  'age': 36, 'active': false },
9685
     *   { 'user': 'fred',    'age': 40, 'active': true },
9686
     *   { 'user': 'pebbles', 'age': 1,  'active': false }
9687
     * ];
9688
     *
9689
     * _.partition(users, function(o) { return o.active; });
9690
     * // => objects for [['fred'], ['barney', 'pebbles']]
9691
     *
9692
     * // The `_.matches` iteratee shorthand.
9693
     * _.partition(users, { 'age': 1, 'active': false });
9694
     * // => objects for [['pebbles'], ['barney', 'fred']]
9695
     *
9696
     * // The `_.matchesProperty` iteratee shorthand.
9697
     * _.partition(users, ['active', false]);
9698
     * // => objects for [['barney', 'pebbles'], ['fred']]
9699
     *
9700
     * // The `_.property` iteratee shorthand.
9701
     * _.partition(users, 'active');
9702
     * // => objects for [['fred'], ['barney', 'pebbles']]
9703
     */
9704
    var partition = createAggregator(function(result, value, key) {
9705
      result[key ? 0 : 1].push(value);
9706
    }, function() { return [[], []]; });
9707
9708
    /**
9709
     * Reduces `collection` to a value which is the accumulated result of running
9710
     * each element in `collection` thru `iteratee`, where each successive
9711
     * invocation is supplied the return value of the previous. If `accumulator`
9712
     * is not given, the first element of `collection` is used as the initial
9713
     * value. The iteratee is invoked with four arguments:
9714
     * (accumulator, value, index|key, collection).
9715
     *
9716
     * Many lodash methods are guarded to work as iteratees for methods like
9717
     * `_.reduce`, `_.reduceRight`, and `_.transform`.
9718
     *
9719
     * The guarded methods are:
9720
     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
9721
     * and `sortBy`
9722
     *
9723
     * @static
9724
     * @memberOf _
9725
     * @since 0.1.0
9726
     * @category Collection
9727
     * @param {Array|Object} collection The collection to iterate over.
9728
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9729
     * @param {*} [accumulator] The initial value.
9730
     * @returns {*} Returns the accumulated value.
9731
     * @see _.reduceRight
9732
     * @example
9733
     *
9734
     * _.reduce([1, 2], function(sum, n) {
9735
     *   return sum + n;
9736
     * }, 0);
9737
     * // => 3
9738
     *
9739
     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
9740
     *   (result[value] || (result[value] = [])).push(key);
9741
     *   return result;
9742
     * }, {});
9743
     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
9744
     */
9745
    function reduce(collection, iteratee, accumulator) {
9746
      var func = isArray(collection) ? arrayReduce : baseReduce,
9747
          initAccum = arguments.length < 3;
9748
9749
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
9750
    }
9751
9752
    /**
9753
     * This method is like `_.reduce` except that it iterates over elements of
9754
     * `collection` from right to left.
9755
     *
9756
     * @static
9757
     * @memberOf _
9758
     * @since 0.1.0
9759
     * @category Collection
9760
     * @param {Array|Object} collection The collection to iterate over.
9761
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
9762
     * @param {*} [accumulator] The initial value.
9763
     * @returns {*} Returns the accumulated value.
9764
     * @see _.reduce
9765
     * @example
9766
     *
9767
     * var array = [[0, 1], [2, 3], [4, 5]];
9768
     *
9769
     * _.reduceRight(array, function(flattened, other) {
9770
     *   return flattened.concat(other);
9771
     * }, []);
9772
     * // => [4, 5, 2, 3, 0, 1]
9773
     */
9774
    function reduceRight(collection, iteratee, accumulator) {
9775
      var func = isArray(collection) ? arrayReduceRight : baseReduce,
9776
          initAccum = arguments.length < 3;
9777
9778
      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
9779
    }
9780
9781
    /**
9782
     * The opposite of `_.filter`; this method returns the elements of `collection`
9783
     * that `predicate` does **not** return truthy for.
9784
     *
9785
     * @static
9786
     * @memberOf _
9787
     * @since 0.1.0
9788
     * @category Collection
9789
     * @param {Array|Object} collection The collection to iterate over.
9790
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9791
     * @returns {Array} Returns the new filtered array.
9792
     * @see _.filter
9793
     * @example
9794
     *
9795
     * var users = [
9796
     *   { 'user': 'barney', 'age': 36, 'active': false },
9797
     *   { 'user': 'fred',   'age': 40, 'active': true }
9798
     * ];
9799
     *
9800
     * _.reject(users, function(o) { return !o.active; });
9801
     * // => objects for ['fred']
9802
     *
9803
     * // The `_.matches` iteratee shorthand.
9804
     * _.reject(users, { 'age': 40, 'active': true });
9805
     * // => objects for ['barney']
9806
     *
9807
     * // The `_.matchesProperty` iteratee shorthand.
9808
     * _.reject(users, ['active', false]);
9809
     * // => objects for ['fred']
9810
     *
9811
     * // The `_.property` iteratee shorthand.
9812
     * _.reject(users, 'active');
9813
     * // => objects for ['barney']
9814
     */
9815
    function reject(collection, predicate) {
9816
      var func = isArray(collection) ? arrayFilter : baseFilter;
9817
      return func(collection, negate(getIteratee(predicate, 3)));
9818
    }
9819
9820
    /**
9821
     * Gets a random element from `collection`.
9822
     *
9823
     * @static
9824
     * @memberOf _
9825
     * @since 2.0.0
9826
     * @category Collection
9827
     * @param {Array|Object} collection The collection to sample.
9828
     * @returns {*} Returns the random element.
9829
     * @example
9830
     *
9831
     * _.sample([1, 2, 3, 4]);
9832
     * // => 2
9833
     */
9834
    function sample(collection) {
9835
      var func = isArray(collection) ? arraySample : baseSample;
9836
      return func(collection);
9837
    }
9838
9839
    /**
9840
     * Gets `n` random elements at unique keys from `collection` up to the
9841
     * size of `collection`.
9842
     *
9843
     * @static
9844
     * @memberOf _
9845
     * @since 4.0.0
9846
     * @category Collection
9847
     * @param {Array|Object} collection The collection to sample.
9848
     * @param {number} [n=1] The number of elements to sample.
9849
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9850
     * @returns {Array} Returns the random elements.
9851
     * @example
9852
     *
9853
     * _.sampleSize([1, 2, 3], 2);
9854
     * // => [3, 1]
9855
     *
9856
     * _.sampleSize([1, 2, 3], 4);
9857
     * // => [2, 3, 1]
9858
     */
9859
    function sampleSize(collection, n, guard) {
9860
      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {
9861
        n = 1;
9862
      } else {
9863
        n = toInteger(n);
9864
      }
9865
      var func = isArray(collection) ? arraySampleSize : baseSampleSize;
9866
      return func(collection, n);
9867
    }
9868
9869
    /**
9870
     * Creates an array of shuffled values, using a version of the
9871
     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).
9872
     *
9873
     * @static
9874
     * @memberOf _
9875
     * @since 0.1.0
9876
     * @category Collection
9877
     * @param {Array|Object} collection The collection to shuffle.
9878
     * @returns {Array} Returns the new shuffled array.
9879
     * @example
9880
     *
9881
     * _.shuffle([1, 2, 3, 4]);
9882
     * // => [4, 1, 3, 2]
9883
     */
9884
    function shuffle(collection) {
9885
      var func = isArray(collection) ? arrayShuffle : baseShuffle;
9886
      return func(collection);
9887
    }
9888
9889
    /**
9890
     * Gets the size of `collection` by returning its length for array-like
9891
     * values or the number of own enumerable string keyed properties for objects.
9892
     *
9893
     * @static
9894
     * @memberOf _
9895
     * @since 0.1.0
9896
     * @category Collection
9897
     * @param {Array|Object|string} collection The collection to inspect.
9898
     * @returns {number} Returns the collection size.
9899
     * @example
9900
     *
9901
     * _.size([1, 2, 3]);
9902
     * // => 3
9903
     *
9904
     * _.size({ 'a': 1, 'b': 2 });
9905
     * // => 2
9906
     *
9907
     * _.size('pebbles');
9908
     * // => 7
9909
     */
9910
    function size(collection) {
9911
      if (collection == null) {
9912
        return 0;
9913
      }
9914
      if (isArrayLike(collection)) {
9915
        return isString(collection) ? stringSize(collection) : collection.length;
9916
      }
9917
      var tag = getTag(collection);
9918
      if (tag == mapTag || tag == setTag) {
9919
        return collection.size;
9920
      }
9921
      return baseKeys(collection).length;
9922
    }
9923
9924
    /**
9925
     * Checks if `predicate` returns truthy for **any** element of `collection`.
9926
     * Iteration is stopped once `predicate` returns truthy. The predicate is
9927
     * invoked with three arguments: (value, index|key, collection).
9928
     *
9929
     * @static
9930
     * @memberOf _
9931
     * @since 0.1.0
9932
     * @category Collection
9933
     * @param {Array|Object} collection The collection to iterate over.
9934
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
9935
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
9936
     * @returns {boolean} Returns `true` if any element passes the predicate check,
9937
     *  else `false`.
9938
     * @example
9939
     *
9940
     * _.some([null, 0, 'yes', false], Boolean);
9941
     * // => true
9942
     *
9943
     * var users = [
9944
     *   { 'user': 'barney', 'active': true },
9945
     *   { 'user': 'fred',   'active': false }
9946
     * ];
9947
     *
9948
     * // The `_.matches` iteratee shorthand.
9949
     * _.some(users, { 'user': 'barney', 'active': false });
9950
     * // => false
9951
     *
9952
     * // The `_.matchesProperty` iteratee shorthand.
9953
     * _.some(users, ['active', false]);
9954
     * // => true
9955
     *
9956
     * // The `_.property` iteratee shorthand.
9957
     * _.some(users, 'active');
9958
     * // => true
9959
     */
9960
    function some(collection, predicate, guard) {
9961
      var func = isArray(collection) ? arraySome : baseSome;
9962
      if (guard && isIterateeCall(collection, predicate, guard)) {
9963
        predicate = undefined;
9964
      }
9965
      return func(collection, getIteratee(predicate, 3));
9966
    }
9967
9968
    /**
9969
     * Creates an array of elements, sorted in ascending order by the results of
9970
     * running each element in a collection thru each iteratee. This method
9971
     * performs a stable sort, that is, it preserves the original sort order of
9972
     * equal elements. The iteratees are invoked with one argument: (value).
9973
     *
9974
     * @static
9975
     * @memberOf _
9976
     * @since 0.1.0
9977
     * @category Collection
9978
     * @param {Array|Object} collection The collection to iterate over.
9979
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
9980
     *  The iteratees to sort by.
9981
     * @returns {Array} Returns the new sorted array.
9982
     * @example
9983
     *
9984
     * var users = [
9985
     *   { 'user': 'fred',   'age': 48 },
9986
     *   { 'user': 'barney', 'age': 36 },
9987
     *   { 'user': 'fred',   'age': 30 },
9988
     *   { 'user': 'barney', 'age': 34 }
9989
     * ];
9990
     *
9991
     * _.sortBy(users, [function(o) { return o.user; }]);
9992
     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]
9993
     *
9994
     * _.sortBy(users, ['user', 'age']);
9995
     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]
9996
     */
9997
    var sortBy = baseRest(function(collection, iteratees) {
9998
      if (collection == null) {
9999
        return [];
10000
      }
10001
      var length = iteratees.length;
10002
      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
10003
        iteratees = [];
10004
      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
10005
        iteratees = [iteratees[0]];
10006
      }
10007
      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
10008
    });
10009
10010
    /*------------------------------------------------------------------------*/
10011
10012
    /**
10013
     * Gets the timestamp of the number of milliseconds that have elapsed since
10014
     * the Unix epoch (1 January 1970 00:00:00 UTC).
10015
     *
10016
     * @static
10017
     * @memberOf _
10018
     * @since 2.4.0
10019
     * @category Date
10020
     * @returns {number} Returns the timestamp.
10021
     * @example
10022
     *
10023
     * _.defer(function(stamp) {
10024
     *   console.log(_.now() - stamp);
10025
     * }, _.now());
10026
     * // => Logs the number of milliseconds it took for the deferred invocation.
10027
     */
10028
    var now = ctxNow || function() {
10029
      return root.Date.now();
10030
    };
10031
10032
    /*------------------------------------------------------------------------*/
10033
10034
    /**
10035
     * The opposite of `_.before`; this method creates a function that invokes
10036
     * `func` once it's called `n` or more times.
10037
     *
10038
     * @static
10039
     * @memberOf _
10040
     * @since 0.1.0
10041
     * @category Function
10042
     * @param {number} n The number of calls before `func` is invoked.
10043
     * @param {Function} func The function to restrict.
10044
     * @returns {Function} Returns the new restricted function.
10045
     * @example
10046
     *
10047
     * var saves = ['profile', 'settings'];
10048
     *
10049
     * var done = _.after(saves.length, function() {
10050
     *   console.log('done saving!');
10051
     * });
10052
     *
10053
     * _.forEach(saves, function(type) {
10054
     *   asyncSave({ 'type': type, 'complete': done });
10055
     * });
10056
     * // => Logs 'done saving!' after the two async saves have completed.
10057
     */
10058
    function after(n, func) {
10059
      if (typeof func != 'function') {
10060
        throw new TypeError(FUNC_ERROR_TEXT);
10061
      }
10062
      n = toInteger(n);
10063
      return function() {
10064
        if (--n < 1) {
10065
          return func.apply(this, arguments);
10066
        }
10067
      };
10068
    }
10069
10070
    /**
10071
     * Creates a function that invokes `func`, with up to `n` arguments,
10072
     * ignoring any additional arguments.
10073
     *
10074
     * @static
10075
     * @memberOf _
10076
     * @since 3.0.0
10077
     * @category Function
10078
     * @param {Function} func The function to cap arguments for.
10079
     * @param {number} [n=func.length] The arity cap.
10080
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10081
     * @returns {Function} Returns the new capped function.
10082
     * @example
10083
     *
10084
     * _.map(['6', '8', '10'], _.ary(parseInt, 1));
10085
     * // => [6, 8, 10]
10086
     */
10087
    function ary(func, n, guard) {
10088
      n = guard ? undefined : n;
10089
      n = (func && n == null) ? func.length : n;
10090
      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);
10091
    }
10092
10093
    /**
10094
     * Creates a function that invokes `func`, with the `this` binding and arguments
10095
     * of the created function, while it's called less than `n` times. Subsequent
10096
     * calls to the created function return the result of the last `func` invocation.
10097
     *
10098
     * @static
10099
     * @memberOf _
10100
     * @since 3.0.0
10101
     * @category Function
10102
     * @param {number} n The number of calls at which `func` is no longer invoked.
10103
     * @param {Function} func The function to restrict.
10104
     * @returns {Function} Returns the new restricted function.
10105
     * @example
10106
     *
10107
     * jQuery(element).on('click', _.before(5, addContactToList));
10108
     * // => Allows adding up to 4 contacts to the list.
10109
     */
10110
    function before(n, func) {
10111
      var result;
10112
      if (typeof func != 'function') {
10113
        throw new TypeError(FUNC_ERROR_TEXT);
10114
      }
10115
      n = toInteger(n);
10116
      return function() {
10117
        if (--n > 0) {
10118
          result = func.apply(this, arguments);
10119
        }
10120
        if (n <= 1) {
10121
          func = undefined;
10122
        }
10123
        return result;
10124
      };
10125
    }
10126
10127
    /**
10128
     * Creates a function that invokes `func` with the `this` binding of `thisArg`
10129
     * and `partials` prepended to the arguments it receives.
10130
     *
10131
     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
10132
     * may be used as a placeholder for partially applied arguments.
10133
     *
10134
     * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
10135
     * property of bound functions.
10136
     *
10137
     * @static
10138
     * @memberOf _
10139
     * @since 0.1.0
10140
     * @category Function
10141
     * @param {Function} func The function to bind.
10142
     * @param {*} thisArg The `this` binding of `func`.
10143
     * @param {...*} [partials] The arguments to be partially applied.
10144
     * @returns {Function} Returns the new bound function.
10145
     * @example
10146
     *
10147
     * function greet(greeting, punctuation) {
10148
     *   return greeting + ' ' + this.user + punctuation;
10149
     * }
10150
     *
10151
     * var object = { 'user': 'fred' };
10152
     *
10153
     * var bound = _.bind(greet, object, 'hi');
10154
     * bound('!');
10155
     * // => 'hi fred!'
10156
     *
10157
     * // Bound with placeholders.
10158
     * var bound = _.bind(greet, object, _, '!');
10159
     * bound('hi');
10160
     * // => 'hi fred!'
10161
     */
10162
    var bind = baseRest(function(func, thisArg, partials) {
10163
      var bitmask = WRAP_BIND_FLAG;
10164
      if (partials.length) {
10165
        var holders = replaceHolders(partials, getHolder(bind));
10166
        bitmask |= WRAP_PARTIAL_FLAG;
10167
      }
10168
      return createWrap(func, bitmask, thisArg, partials, holders);
10169
    });
10170
10171
    /**
10172
     * Creates a function that invokes the method at `object[key]` with `partials`
10173
     * prepended to the arguments it receives.
10174
     *
10175
     * This method differs from `_.bind` by allowing bound functions to reference
10176
     * methods that may be redefined or don't yet exist. See
10177
     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)
10178
     * for more details.
10179
     *
10180
     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic
10181
     * builds, may be used as a placeholder for partially applied arguments.
10182
     *
10183
     * @static
10184
     * @memberOf _
10185
     * @since 0.10.0
10186
     * @category Function
10187
     * @param {Object} object The object to invoke the method on.
10188
     * @param {string} key The key of the method.
10189
     * @param {...*} [partials] The arguments to be partially applied.
10190
     * @returns {Function} Returns the new bound function.
10191
     * @example
10192
     *
10193
     * var object = {
10194
     *   'user': 'fred',
10195
     *   'greet': function(greeting, punctuation) {
10196
     *     return greeting + ' ' + this.user + punctuation;
10197
     *   }
10198
     * };
10199
     *
10200
     * var bound = _.bindKey(object, 'greet', 'hi');
10201
     * bound('!');
10202
     * // => 'hi fred!'
10203
     *
10204
     * object.greet = function(greeting, punctuation) {
10205
     *   return greeting + 'ya ' + this.user + punctuation;
10206
     * };
10207
     *
10208
     * bound('!');
10209
     * // => 'hiya fred!'
10210
     *
10211
     * // Bound with placeholders.
10212
     * var bound = _.bindKey(object, 'greet', _, '!');
10213
     * bound('hi');
10214
     * // => 'hiya fred!'
10215
     */
10216
    var bindKey = baseRest(function(object, key, partials) {
10217
      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
10218
      if (partials.length) {
10219
        var holders = replaceHolders(partials, getHolder(bindKey));
10220
        bitmask |= WRAP_PARTIAL_FLAG;
10221
      }
10222
      return createWrap(key, bitmask, object, partials, holders);
10223
    });
10224
10225
    /**
10226
     * Creates a function that accepts arguments of `func` and either invokes
10227
     * `func` returning its result, if at least `arity` number of arguments have
10228
     * been provided, or returns a function that accepts the remaining `func`
10229
     * arguments, and so on. The arity of `func` may be specified if `func.length`
10230
     * is not sufficient.
10231
     *
10232
     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,
10233
     * may be used as a placeholder for provided arguments.
10234
     *
10235
     * **Note:** This method doesn't set the "length" property of curried functions.
10236
     *
10237
     * @static
10238
     * @memberOf _
10239
     * @since 2.0.0
10240
     * @category Function
10241
     * @param {Function} func The function to curry.
10242
     * @param {number} [arity=func.length] The arity of `func`.
10243
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10244
     * @returns {Function} Returns the new curried function.
10245
     * @example
10246
     *
10247
     * var abc = function(a, b, c) {
10248
     *   return [a, b, c];
10249
     * };
10250
     *
10251
     * var curried = _.curry(abc);
10252
     *
10253
     * curried(1)(2)(3);
10254
     * // => [1, 2, 3]
10255
     *
10256
     * curried(1, 2)(3);
10257
     * // => [1, 2, 3]
10258
     *
10259
     * curried(1, 2, 3);
10260
     * // => [1, 2, 3]
10261
     *
10262
     * // Curried with placeholders.
10263
     * curried(1)(_, 3)(2);
10264
     * // => [1, 2, 3]
10265
     */
10266
    function curry(func, arity, guard) {
10267
      arity = guard ? undefined : arity;
10268
      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10269
      result.placeholder = curry.placeholder;
10270
      return result;
10271
    }
10272
10273
    /**
10274
     * This method is like `_.curry` except that arguments are applied to `func`
10275
     * in the manner of `_.partialRight` instead of `_.partial`.
10276
     *
10277
     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic
10278
     * builds, may be used as a placeholder for provided arguments.
10279
     *
10280
     * **Note:** This method doesn't set the "length" property of curried functions.
10281
     *
10282
     * @static
10283
     * @memberOf _
10284
     * @since 3.0.0
10285
     * @category Function
10286
     * @param {Function} func The function to curry.
10287
     * @param {number} [arity=func.length] The arity of `func`.
10288
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
10289
     * @returns {Function} Returns the new curried function.
10290
     * @example
10291
     *
10292
     * var abc = function(a, b, c) {
10293
     *   return [a, b, c];
10294
     * };
10295
     *
10296
     * var curried = _.curryRight(abc);
10297
     *
10298
     * curried(3)(2)(1);
10299
     * // => [1, 2, 3]
10300
     *
10301
     * curried(2, 3)(1);
10302
     * // => [1, 2, 3]
10303
     *
10304
     * curried(1, 2, 3);
10305
     * // => [1, 2, 3]
10306
     *
10307
     * // Curried with placeholders.
10308
     * curried(3)(1, _)(2);
10309
     * // => [1, 2, 3]
10310
     */
10311
    function curryRight(func, arity, guard) {
10312
      arity = guard ? undefined : arity;
10313
      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
10314
      result.placeholder = curryRight.placeholder;
10315
      return result;
10316
    }
10317
10318
    /**
10319
     * Creates a debounced function that delays invoking `func` until after `wait`
10320
     * milliseconds have elapsed since the last time the debounced function was
10321
     * invoked. The debounced function comes with a `cancel` method to cancel
10322
     * delayed `func` invocations and a `flush` method to immediately invoke them.
10323
     * Provide `options` to indicate whether `func` should be invoked on the
10324
     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
10325
     * with the last arguments provided to the debounced function. Subsequent
10326
     * calls to the debounced function return the result of the last `func`
10327
     * invocation.
10328
     *
10329
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10330
     * invoked on the trailing edge of the timeout only if the debounced function
10331
     * is invoked more than once during the `wait` timeout.
10332
     *
10333
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10334
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10335
     *
10336
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10337
     * for details over the differences between `_.debounce` and `_.throttle`.
10338
     *
10339
     * @static
10340
     * @memberOf _
10341
     * @since 0.1.0
10342
     * @category Function
10343
     * @param {Function} func The function to debounce.
10344
     * @param {number} [wait=0] The number of milliseconds to delay.
10345
     * @param {Object} [options={}] The options object.
10346
     * @param {boolean} [options.leading=false]
10347
     *  Specify invoking on the leading edge of the timeout.
10348
     * @param {number} [options.maxWait]
10349
     *  The maximum time `func` is allowed to be delayed before it's invoked.
10350
     * @param {boolean} [options.trailing=true]
10351
     *  Specify invoking on the trailing edge of the timeout.
10352
     * @returns {Function} Returns the new debounced function.
10353
     * @example
10354
     *
10355
     * // Avoid costly calculations while the window size is in flux.
10356
     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
10357
     *
10358
     * // Invoke `sendMail` when clicked, debouncing subsequent calls.
10359
     * jQuery(element).on('click', _.debounce(sendMail, 300, {
10360
     *   'leading': true,
10361
     *   'trailing': false
10362
     * }));
10363
     *
10364
     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
10365
     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
10366
     * var source = new EventSource('/stream');
10367
     * jQuery(source).on('message', debounced);
10368
     *
10369
     * // Cancel the trailing debounced invocation.
10370
     * jQuery(window).on('popstate', debounced.cancel);
10371
     */
10372
    function debounce(func, wait, options) {
10373
      var lastArgs,
10374
          lastThis,
10375
          maxWait,
10376
          result,
10377
          timerId,
10378
          lastCallTime,
10379
          lastInvokeTime = 0,
10380
          leading = false,
10381
          maxing = false,
10382
          trailing = true;
10383
10384
      if (typeof func != 'function') {
10385
        throw new TypeError(FUNC_ERROR_TEXT);
10386
      }
10387
      wait = toNumber(wait) || 0;
10388
      if (isObject(options)) {
10389
        leading = !!options.leading;
10390
        maxing = 'maxWait' in options;
10391
        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
10392
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10393
      }
10394
10395
      function invokeFunc(time) {
10396
        var args = lastArgs,
10397
            thisArg = lastThis;
10398
10399
        lastArgs = lastThis = undefined;
10400
        lastInvokeTime = time;
10401
        result = func.apply(thisArg, args);
10402
        return result;
10403
      }
10404
10405
      function leadingEdge(time) {
10406
        // Reset any `maxWait` timer.
10407
        lastInvokeTime = time;
10408
        // Start the timer for the trailing edge.
10409
        timerId = setTimeout(timerExpired, wait);
10410
        // Invoke the leading edge.
10411
        return leading ? invokeFunc(time) : result;
10412
      }
10413
10414
      function remainingWait(time) {
10415
        var timeSinceLastCall = time - lastCallTime,
10416
            timeSinceLastInvoke = time - lastInvokeTime,
10417
            timeWaiting = wait - timeSinceLastCall;
10418
10419
        return maxing
10420
          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
10421
          : timeWaiting;
10422
      }
10423
10424
      function shouldInvoke(time) {
10425
        var timeSinceLastCall = time - lastCallTime,
10426
            timeSinceLastInvoke = time - lastInvokeTime;
10427
10428
        // Either this is the first call, activity has stopped and we're at the
10429
        // trailing edge, the system time has gone backwards and we're treating
10430
        // it as the trailing edge, or we've hit the `maxWait` limit.
10431
        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
10432
          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
10433
      }
10434
10435
      function timerExpired() {
10436
        var time = now();
10437
        if (shouldInvoke(time)) {
10438
          return trailingEdge(time);
10439
        }
10440
        // Restart the timer.
10441
        timerId = setTimeout(timerExpired, remainingWait(time));
10442
      }
10443
10444
      function trailingEdge(time) {
10445
        timerId = undefined;
10446
10447
        // Only invoke if we have `lastArgs` which means `func` has been
10448
        // debounced at least once.
10449
        if (trailing && lastArgs) {
10450
          return invokeFunc(time);
10451
        }
10452
        lastArgs = lastThis = undefined;
10453
        return result;
10454
      }
10455
10456
      function cancel() {
10457
        if (timerId !== undefined) {
10458
          clearTimeout(timerId);
10459
        }
10460
        lastInvokeTime = 0;
10461
        lastArgs = lastCallTime = lastThis = timerId = undefined;
10462
      }
10463
10464
      function flush() {
10465
        return timerId === undefined ? result : trailingEdge(now());
10466
      }
10467
10468
      function debounced() {
10469
        var time = now(),
10470
            isInvoking = shouldInvoke(time);
10471
10472
        lastArgs = arguments;
10473
        lastThis = this;
10474
        lastCallTime = time;
10475
10476
        if (isInvoking) {
10477
          if (timerId === undefined) {
10478
            return leadingEdge(lastCallTime);
10479
          }
10480
          if (maxing) {
10481
            // Handle invocations in a tight loop.
10482
            clearTimeout(timerId);
10483
            timerId = setTimeout(timerExpired, wait);
10484
            return invokeFunc(lastCallTime);
10485
          }
10486
        }
10487
        if (timerId === undefined) {
10488
          timerId = setTimeout(timerExpired, wait);
10489
        }
10490
        return result;
10491
      }
10492
      debounced.cancel = cancel;
10493
      debounced.flush = flush;
10494
      return debounced;
10495
    }
10496
10497
    /**
10498
     * Defers invoking the `func` until the current call stack has cleared. Any
10499
     * additional arguments are provided to `func` when it's invoked.
10500
     *
10501
     * @static
10502
     * @memberOf _
10503
     * @since 0.1.0
10504
     * @category Function
10505
     * @param {Function} func The function to defer.
10506
     * @param {...*} [args] The arguments to invoke `func` with.
10507
     * @returns {number} Returns the timer id.
10508
     * @example
10509
     *
10510
     * _.defer(function(text) {
10511
     *   console.log(text);
10512
     * }, 'deferred');
10513
     * // => Logs 'deferred' after one millisecond.
10514
     */
10515
    var defer = baseRest(function(func, args) {
10516
      return baseDelay(func, 1, args);
10517
    });
10518
10519
    /**
10520
     * Invokes `func` after `wait` milliseconds. Any additional arguments are
10521
     * provided to `func` when it's invoked.
10522
     *
10523
     * @static
10524
     * @memberOf _
10525
     * @since 0.1.0
10526
     * @category Function
10527
     * @param {Function} func The function to delay.
10528
     * @param {number} wait The number of milliseconds to delay invocation.
10529
     * @param {...*} [args] The arguments to invoke `func` with.
10530
     * @returns {number} Returns the timer id.
10531
     * @example
10532
     *
10533
     * _.delay(function(text) {
10534
     *   console.log(text);
10535
     * }, 1000, 'later');
10536
     * // => Logs 'later' after one second.
10537
     */
10538
    var delay = baseRest(function(func, wait, args) {
10539
      return baseDelay(func, toNumber(wait) || 0, args);
10540
    });
10541
10542
    /**
10543
     * Creates a function that invokes `func` with arguments reversed.
10544
     *
10545
     * @static
10546
     * @memberOf _
10547
     * @since 4.0.0
10548
     * @category Function
10549
     * @param {Function} func The function to flip arguments for.
10550
     * @returns {Function} Returns the new flipped function.
10551
     * @example
10552
     *
10553
     * var flipped = _.flip(function() {
10554
     *   return _.toArray(arguments);
10555
     * });
10556
     *
10557
     * flipped('a', 'b', 'c', 'd');
10558
     * // => ['d', 'c', 'b', 'a']
10559
     */
10560
    function flip(func) {
10561
      return createWrap(func, WRAP_FLIP_FLAG);
10562
    }
10563
10564
    /**
10565
     * Creates a function that memoizes the result of `func`. If `resolver` is
10566
     * provided, it determines the cache key for storing the result based on the
10567
     * arguments provided to the memoized function. By default, the first argument
10568
     * provided to the memoized function is used as the map cache key. The `func`
10569
     * is invoked with the `this` binding of the memoized function.
10570
     *
10571
     * **Note:** The cache is exposed as the `cache` property on the memoized
10572
     * function. Its creation may be customized by replacing the `_.memoize.Cache`
10573
     * constructor with one whose instances implement the
10574
     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
10575
     * method interface of `clear`, `delete`, `get`, `has`, and `set`.
10576
     *
10577
     * @static
10578
     * @memberOf _
10579
     * @since 0.1.0
10580
     * @category Function
10581
     * @param {Function} func The function to have its output memoized.
10582
     * @param {Function} [resolver] The function to resolve the cache key.
10583
     * @returns {Function} Returns the new memoized function.
10584
     * @example
10585
     *
10586
     * var object = { 'a': 1, 'b': 2 };
10587
     * var other = { 'c': 3, 'd': 4 };
10588
     *
10589
     * var values = _.memoize(_.values);
10590
     * values(object);
10591
     * // => [1, 2]
10592
     *
10593
     * values(other);
10594
     * // => [3, 4]
10595
     *
10596
     * object.a = 2;
10597
     * values(object);
10598
     * // => [1, 2]
10599
     *
10600
     * // Modify the result cache.
10601
     * values.cache.set(object, ['a', 'b']);
10602
     * values(object);
10603
     * // => ['a', 'b']
10604
     *
10605
     * // Replace `_.memoize.Cache`.
10606
     * _.memoize.Cache = WeakMap;
10607
     */
10608
    function memoize(func, resolver) {
10609
      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
10610
        throw new TypeError(FUNC_ERROR_TEXT);
10611
      }
10612
      var memoized = function() {
10613
        var args = arguments,
10614
            key = resolver ? resolver.apply(this, args) : args[0],
10615
            cache = memoized.cache;
10616
10617
        if (cache.has(key)) {
10618
          return cache.get(key);
10619
        }
10620
        var result = func.apply(this, args);
10621
        memoized.cache = cache.set(key, result) || cache;
10622
        return result;
10623
      };
10624
      memoized.cache = new (memoize.Cache || MapCache);
10625
      return memoized;
10626
    }
10627
10628
    // Expose `MapCache`.
10629
    memoize.Cache = MapCache;
10630
10631
    /**
10632
     * Creates a function that negates the result of the predicate `func`. The
10633
     * `func` predicate is invoked with the `this` binding and arguments of the
10634
     * created function.
10635
     *
10636
     * @static
10637
     * @memberOf _
10638
     * @since 3.0.0
10639
     * @category Function
10640
     * @param {Function} predicate The predicate to negate.
10641
     * @returns {Function} Returns the new negated function.
10642
     * @example
10643
     *
10644
     * function isEven(n) {
10645
     *   return n % 2 == 0;
10646
     * }
10647
     *
10648
     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
10649
     * // => [1, 3, 5]
10650
     */
10651
    function negate(predicate) {
10652
      if (typeof predicate != 'function') {
10653
        throw new TypeError(FUNC_ERROR_TEXT);
10654
      }
10655
      return function() {
10656
        var args = arguments;
10657
        switch (args.length) {
10658
          case 0: return !predicate.call(this);
10659
          case 1: return !predicate.call(this, args[0]);
10660
          case 2: return !predicate.call(this, args[0], args[1]);
10661
          case 3: return !predicate.call(this, args[0], args[1], args[2]);
10662
        }
10663
        return !predicate.apply(this, args);
10664
      };
10665
    }
10666
10667
    /**
10668
     * Creates a function that is restricted to invoking `func` once. Repeat calls
10669
     * to the function return the value of the first invocation. The `func` is
10670
     * invoked with the `this` binding and arguments of the created function.
10671
     *
10672
     * @static
10673
     * @memberOf _
10674
     * @since 0.1.0
10675
     * @category Function
10676
     * @param {Function} func The function to restrict.
10677
     * @returns {Function} Returns the new restricted function.
10678
     * @example
10679
     *
10680
     * var initialize = _.once(createApplication);
10681
     * initialize();
10682
     * initialize();
10683
     * // => `createApplication` is invoked once
10684
     */
10685
    function once(func) {
10686
      return before(2, func);
10687
    }
10688
10689
    /**
10690
     * Creates a function that invokes `func` with its arguments transformed.
10691
     *
10692
     * @static
10693
     * @since 4.0.0
10694
     * @memberOf _
10695
     * @category Function
10696
     * @param {Function} func The function to wrap.
10697
     * @param {...(Function|Function[])} [transforms=[_.identity]]
10698
     *  The argument transforms.
10699
     * @returns {Function} Returns the new function.
10700
     * @example
10701
     *
10702
     * function doubled(n) {
10703
     *   return n * 2;
10704
     * }
10705
     *
10706
     * function square(n) {
10707
     *   return n * n;
10708
     * }
10709
     *
10710
     * var func = _.overArgs(function(x, y) {
10711
     *   return [x, y];
10712
     * }, [square, doubled]);
10713
     *
10714
     * func(9, 3);
10715
     * // => [81, 6]
10716
     *
10717
     * func(10, 5);
10718
     * // => [100, 10]
10719
     */
10720
    var overArgs = castRest(function(func, transforms) {
10721
      transforms = (transforms.length == 1 && isArray(transforms[0]))
10722
        ? arrayMap(transforms[0], baseUnary(getIteratee()))
10723
        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
10724
10725
      var funcsLength = transforms.length;
10726
      return baseRest(function(args) {
10727
        var index = -1,
10728
            length = nativeMin(args.length, funcsLength);
10729
10730
        while (++index < length) {
10731
          args[index] = transforms[index].call(this, args[index]);
10732
        }
10733
        return apply(func, this, args);
10734
      });
10735
    });
10736
10737
    /**
10738
     * Creates a function that invokes `func` with `partials` prepended to the
10739
     * arguments it receives. This method is like `_.bind` except it does **not**
10740
     * alter the `this` binding.
10741
     *
10742
     * The `_.partial.placeholder` value, which defaults to `_` in monolithic
10743
     * builds, may be used as a placeholder for partially applied arguments.
10744
     *
10745
     * **Note:** This method doesn't set the "length" property of partially
10746
     * applied functions.
10747
     *
10748
     * @static
10749
     * @memberOf _
10750
     * @since 0.2.0
10751
     * @category Function
10752
     * @param {Function} func The function to partially apply arguments to.
10753
     * @param {...*} [partials] The arguments to be partially applied.
10754
     * @returns {Function} Returns the new partially applied function.
10755
     * @example
10756
     *
10757
     * function greet(greeting, name) {
10758
     *   return greeting + ' ' + name;
10759
     * }
10760
     *
10761
     * var sayHelloTo = _.partial(greet, 'hello');
10762
     * sayHelloTo('fred');
10763
     * // => 'hello fred'
10764
     *
10765
     * // Partially applied with placeholders.
10766
     * var greetFred = _.partial(greet, _, 'fred');
10767
     * greetFred('hi');
10768
     * // => 'hi fred'
10769
     */
10770
    var partial = baseRest(function(func, partials) {
10771
      var holders = replaceHolders(partials, getHolder(partial));
10772
      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);
10773
    });
10774
10775
    /**
10776
     * This method is like `_.partial` except that partially applied arguments
10777
     * are appended to the arguments it receives.
10778
     *
10779
     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic
10780
     * builds, may be used as a placeholder for partially applied arguments.
10781
     *
10782
     * **Note:** This method doesn't set the "length" property of partially
10783
     * applied functions.
10784
     *
10785
     * @static
10786
     * @memberOf _
10787
     * @since 1.0.0
10788
     * @category Function
10789
     * @param {Function} func The function to partially apply arguments to.
10790
     * @param {...*} [partials] The arguments to be partially applied.
10791
     * @returns {Function} Returns the new partially applied function.
10792
     * @example
10793
     *
10794
     * function greet(greeting, name) {
10795
     *   return greeting + ' ' + name;
10796
     * }
10797
     *
10798
     * var greetFred = _.partialRight(greet, 'fred');
10799
     * greetFred('hi');
10800
     * // => 'hi fred'
10801
     *
10802
     * // Partially applied with placeholders.
10803
     * var sayHelloTo = _.partialRight(greet, 'hello', _);
10804
     * sayHelloTo('fred');
10805
     * // => 'hello fred'
10806
     */
10807
    var partialRight = baseRest(function(func, partials) {
10808
      var holders = replaceHolders(partials, getHolder(partialRight));
10809
      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);
10810
    });
10811
10812
    /**
10813
     * Creates a function that invokes `func` with arguments arranged according
10814
     * to the specified `indexes` where the argument value at the first index is
10815
     * provided as the first argument, the argument value at the second index is
10816
     * provided as the second argument, and so on.
10817
     *
10818
     * @static
10819
     * @memberOf _
10820
     * @since 3.0.0
10821
     * @category Function
10822
     * @param {Function} func The function to rearrange arguments for.
10823
     * @param {...(number|number[])} indexes The arranged argument indexes.
10824
     * @returns {Function} Returns the new function.
10825
     * @example
10826
     *
10827
     * var rearged = _.rearg(function(a, b, c) {
10828
     *   return [a, b, c];
10829
     * }, [2, 0, 1]);
10830
     *
10831
     * rearged('b', 'c', 'a')
10832
     * // => ['a', 'b', 'c']
10833
     */
10834
    var rearg = flatRest(function(func, indexes) {
10835
      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);
10836
    });
10837
10838
    /**
10839
     * Creates a function that invokes `func` with the `this` binding of the
10840
     * created function and arguments from `start` and beyond provided as
10841
     * an array.
10842
     *
10843
     * **Note:** This method is based on the
10844
     * [rest parameter](https://mdn.io/rest_parameters).
10845
     *
10846
     * @static
10847
     * @memberOf _
10848
     * @since 4.0.0
10849
     * @category Function
10850
     * @param {Function} func The function to apply a rest parameter to.
10851
     * @param {number} [start=func.length-1] The start position of the rest parameter.
10852
     * @returns {Function} Returns the new function.
10853
     * @example
10854
     *
10855
     * var say = _.rest(function(what, names) {
10856
     *   return what + ' ' + _.initial(names).join(', ') +
10857
     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);
10858
     * });
10859
     *
10860
     * say('hello', 'fred', 'barney', 'pebbles');
10861
     * // => 'hello fred, barney, & pebbles'
10862
     */
10863
    function rest(func, start) {
10864
      if (typeof func != 'function') {
10865
        throw new TypeError(FUNC_ERROR_TEXT);
10866
      }
10867
      start = start === undefined ? start : toInteger(start);
10868
      return baseRest(func, start);
10869
    }
10870
10871
    /**
10872
     * Creates a function that invokes `func` with the `this` binding of the
10873
     * create function and an array of arguments much like
10874
     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).
10875
     *
10876
     * **Note:** This method is based on the
10877
     * [spread operator](https://mdn.io/spread_operator).
10878
     *
10879
     * @static
10880
     * @memberOf _
10881
     * @since 3.2.0
10882
     * @category Function
10883
     * @param {Function} func The function to spread arguments over.
10884
     * @param {number} [start=0] The start position of the spread.
10885
     * @returns {Function} Returns the new function.
10886
     * @example
10887
     *
10888
     * var say = _.spread(function(who, what) {
10889
     *   return who + ' says ' + what;
10890
     * });
10891
     *
10892
     * say(['fred', 'hello']);
10893
     * // => 'fred says hello'
10894
     *
10895
     * var numbers = Promise.all([
10896
     *   Promise.resolve(40),
10897
     *   Promise.resolve(36)
10898
     * ]);
10899
     *
10900
     * numbers.then(_.spread(function(x, y) {
10901
     *   return x + y;
10902
     * }));
10903
     * // => a Promise of 76
10904
     */
10905
    function spread(func, start) {
10906
      if (typeof func != 'function') {
10907
        throw new TypeError(FUNC_ERROR_TEXT);
10908
      }
10909
      start = start == null ? 0 : nativeMax(toInteger(start), 0);
10910
      return baseRest(function(args) {
10911
        var array = args[start],
10912
            otherArgs = castSlice(args, 0, start);
10913
10914
        if (array) {
10915
          arrayPush(otherArgs, array);
10916
        }
10917
        return apply(func, this, otherArgs);
10918
      });
10919
    }
10920
10921
    /**
10922
     * Creates a throttled function that only invokes `func` at most once per
10923
     * every `wait` milliseconds. The throttled function comes with a `cancel`
10924
     * method to cancel delayed `func` invocations and a `flush` method to
10925
     * immediately invoke them. Provide `options` to indicate whether `func`
10926
     * should be invoked on the leading and/or trailing edge of the `wait`
10927
     * timeout. The `func` is invoked with the last arguments provided to the
10928
     * throttled function. Subsequent calls to the throttled function return the
10929
     * result of the last `func` invocation.
10930
     *
10931
     * **Note:** If `leading` and `trailing` options are `true`, `func` is
10932
     * invoked on the trailing edge of the timeout only if the throttled function
10933
     * is invoked more than once during the `wait` timeout.
10934
     *
10935
     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
10936
     * until to the next tick, similar to `setTimeout` with a timeout of `0`.
10937
     *
10938
     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
10939
     * for details over the differences between `_.throttle` and `_.debounce`.
10940
     *
10941
     * @static
10942
     * @memberOf _
10943
     * @since 0.1.0
10944
     * @category Function
10945
     * @param {Function} func The function to throttle.
10946
     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
10947
     * @param {Object} [options={}] The options object.
10948
     * @param {boolean} [options.leading=true]
10949
     *  Specify invoking on the leading edge of the timeout.
10950
     * @param {boolean} [options.trailing=true]
10951
     *  Specify invoking on the trailing edge of the timeout.
10952
     * @returns {Function} Returns the new throttled function.
10953
     * @example
10954
     *
10955
     * // Avoid excessively updating the position while scrolling.
10956
     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
10957
     *
10958
     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
10959
     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
10960
     * jQuery(element).on('click', throttled);
10961
     *
10962
     * // Cancel the trailing throttled invocation.
10963
     * jQuery(window).on('popstate', throttled.cancel);
10964
     */
10965
    function throttle(func, wait, options) {
10966
      var leading = true,
10967
          trailing = true;
10968
10969
      if (typeof func != 'function') {
10970
        throw new TypeError(FUNC_ERROR_TEXT);
10971
      }
10972
      if (isObject(options)) {
10973
        leading = 'leading' in options ? !!options.leading : leading;
10974
        trailing = 'trailing' in options ? !!options.trailing : trailing;
10975
      }
10976
      return debounce(func, wait, {
10977
        'leading': leading,
10978
        'maxWait': wait,
10979
        'trailing': trailing
10980
      });
10981
    }
10982
10983
    /**
10984
     * Creates a function that accepts up to one argument, ignoring any
10985
     * additional arguments.
10986
     *
10987
     * @static
10988
     * @memberOf _
10989
     * @since 4.0.0
10990
     * @category Function
10991
     * @param {Function} func The function to cap arguments for.
10992
     * @returns {Function} Returns the new capped function.
10993
     * @example
10994
     *
10995
     * _.map(['6', '8', '10'], _.unary(parseInt));
10996
     * // => [6, 8, 10]
10997
     */
10998
    function unary(func) {
10999
      return ary(func, 1);
11000
    }
11001
11002
    /**
11003
     * Creates a function that provides `value` to `wrapper` as its first
11004
     * argument. Any additional arguments provided to the function are appended
11005
     * to those provided to the `wrapper`. The wrapper is invoked with the `this`
11006
     * binding of the created function.
11007
     *
11008
     * @static
11009
     * @memberOf _
11010
     * @since 0.1.0
11011
     * @category Function
11012
     * @param {*} value The value to wrap.
11013
     * @param {Function} [wrapper=identity] The wrapper function.
11014
     * @returns {Function} Returns the new function.
11015
     * @example
11016
     *
11017
     * var p = _.wrap(_.escape, function(func, text) {
11018
     *   return '<p>' + func(text) + '</p>';
11019
     * });
11020
     *
11021
     * p('fred, barney, & pebbles');
11022
     * // => '<p>fred, barney, &amp; pebbles</p>'
11023
     */
11024
    function wrap(value, wrapper) {
11025
      return partial(castFunction(wrapper), value);
11026
    }
11027
11028
    /*------------------------------------------------------------------------*/
11029
11030
    /**
11031
     * Casts `value` as an array if it's not one.
11032
     *
11033
     * @static
11034
     * @memberOf _
11035
     * @since 4.4.0
11036
     * @category Lang
11037
     * @param {*} value The value to inspect.
11038
     * @returns {Array} Returns the cast array.
11039
     * @example
11040
     *
11041
     * _.castArray(1);
11042
     * // => [1]
11043
     *
11044
     * _.castArray({ 'a': 1 });
11045
     * // => [{ 'a': 1 }]
11046
     *
11047
     * _.castArray('abc');
11048
     * // => ['abc']
11049
     *
11050
     * _.castArray(null);
11051
     * // => [null]
11052
     *
11053
     * _.castArray(undefined);
11054
     * // => [undefined]
11055
     *
11056
     * _.castArray();
11057
     * // => []
11058
     *
11059
     * var array = [1, 2, 3];
11060
     * console.log(_.castArray(array) === array);
11061
     * // => true
11062
     */
11063
    function castArray() {
11064
      if (!arguments.length) {
11065
        return [];
11066
      }
11067
      var value = arguments[0];
11068
      return isArray(value) ? value : [value];
11069
    }
11070
11071
    /**
11072
     * Creates a shallow clone of `value`.
11073
     *
11074
     * **Note:** This method is loosely based on the
11075
     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
11076
     * and supports cloning arrays, array buffers, booleans, date objects, maps,
11077
     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
11078
     * arrays. The own enumerable properties of `arguments` objects are cloned
11079
     * as plain objects. An empty object is returned for uncloneable values such
11080
     * as error objects, functions, DOM nodes, and WeakMaps.
11081
     *
11082
     * @static
11083
     * @memberOf _
11084
     * @since 0.1.0
11085
     * @category Lang
11086
     * @param {*} value The value to clone.
11087
     * @returns {*} Returns the cloned value.
11088
     * @see _.cloneDeep
11089
     * @example
11090
     *
11091
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11092
     *
11093
     * var shallow = _.clone(objects);
11094
     * console.log(shallow[0] === objects[0]);
11095
     * // => true
11096
     */
11097
    function clone(value) {
11098
      return baseClone(value, CLONE_SYMBOLS_FLAG);
11099
    }
11100
11101
    /**
11102
     * This method is like `_.clone` except that it accepts `customizer` which
11103
     * is invoked to produce the cloned value. If `customizer` returns `undefined`,
11104
     * cloning is handled by the method instead. The `customizer` is invoked with
11105
     * up to four arguments; (value [, index|key, object, stack]).
11106
     *
11107
     * @static
11108
     * @memberOf _
11109
     * @since 4.0.0
11110
     * @category Lang
11111
     * @param {*} value The value to clone.
11112
     * @param {Function} [customizer] The function to customize cloning.
11113
     * @returns {*} Returns the cloned value.
11114
     * @see _.cloneDeepWith
11115
     * @example
11116
     *
11117
     * function customizer(value) {
11118
     *   if (_.isElement(value)) {
11119
     *     return value.cloneNode(false);
11120
     *   }
11121
     * }
11122
     *
11123
     * var el = _.cloneWith(document.body, customizer);
11124
     *
11125
     * console.log(el === document.body);
11126
     * // => false
11127
     * console.log(el.nodeName);
11128
     * // => 'BODY'
11129
     * console.log(el.childNodes.length);
11130
     * // => 0
11131
     */
11132
    function cloneWith(value, customizer) {
11133
      customizer = typeof customizer == 'function' ? customizer : undefined;
11134
      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
11135
    }
11136
11137
    /**
11138
     * This method is like `_.clone` except that it recursively clones `value`.
11139
     *
11140
     * @static
11141
     * @memberOf _
11142
     * @since 1.0.0
11143
     * @category Lang
11144
     * @param {*} value The value to recursively clone.
11145
     * @returns {*} Returns the deep cloned value.
11146
     * @see _.clone
11147
     * @example
11148
     *
11149
     * var objects = [{ 'a': 1 }, { 'b': 2 }];
11150
     *
11151
     * var deep = _.cloneDeep(objects);
11152
     * console.log(deep[0] === objects[0]);
11153
     * // => false
11154
     */
11155
    function cloneDeep(value) {
11156
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
11157
    }
11158
11159
    /**
11160
     * This method is like `_.cloneWith` except that it recursively clones `value`.
11161
     *
11162
     * @static
11163
     * @memberOf _
11164
     * @since 4.0.0
11165
     * @category Lang
11166
     * @param {*} value The value to recursively clone.
11167
     * @param {Function} [customizer] The function to customize cloning.
11168
     * @returns {*} Returns the deep cloned value.
11169
     * @see _.cloneWith
11170
     * @example
11171
     *
11172
     * function customizer(value) {
11173
     *   if (_.isElement(value)) {
11174
     *     return value.cloneNode(true);
11175
     *   }
11176
     * }
11177
     *
11178
     * var el = _.cloneDeepWith(document.body, customizer);
11179
     *
11180
     * console.log(el === document.body);
11181
     * // => false
11182
     * console.log(el.nodeName);
11183
     * // => 'BODY'
11184
     * console.log(el.childNodes.length);
11185
     * // => 20
11186
     */
11187
    function cloneDeepWith(value, customizer) {
11188
      customizer = typeof customizer == 'function' ? customizer : undefined;
11189
      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
11190
    }
11191
11192
    /**
11193
     * Checks if `object` conforms to `source` by invoking the predicate
11194
     * properties of `source` with the corresponding property values of `object`.
11195
     *
11196
     * **Note:** This method is equivalent to `_.conforms` when `source` is
11197
     * partially applied.
11198
     *
11199
     * @static
11200
     * @memberOf _
11201
     * @since 4.14.0
11202
     * @category Lang
11203
     * @param {Object} object The object to inspect.
11204
     * @param {Object} source The object of property predicates to conform to.
11205
     * @returns {boolean} Returns `true` if `object` conforms, else `false`.
11206
     * @example
11207
     *
11208
     * var object = { 'a': 1, 'b': 2 };
11209
     *
11210
     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });
11211
     * // => true
11212
     *
11213
     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });
11214
     * // => false
11215
     */
11216
    function conformsTo(object, source) {
11217
      return source == null || baseConformsTo(object, source, keys(source));
11218
    }
11219
11220
    /**
11221
     * Performs a
11222
     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
11223
     * comparison between two values to determine if they are equivalent.
11224
     *
11225
     * @static
11226
     * @memberOf _
11227
     * @since 4.0.0
11228
     * @category Lang
11229
     * @param {*} value The value to compare.
11230
     * @param {*} other The other value to compare.
11231
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11232
     * @example
11233
     *
11234
     * var object = { 'a': 1 };
11235
     * var other = { 'a': 1 };
11236
     *
11237
     * _.eq(object, object);
11238
     * // => true
11239
     *
11240
     * _.eq(object, other);
11241
     * // => false
11242
     *
11243
     * _.eq('a', 'a');
11244
     * // => true
11245
     *
11246
     * _.eq('a', Object('a'));
11247
     * // => false
11248
     *
11249
     * _.eq(NaN, NaN);
11250
     * // => true
11251
     */
11252
    function eq(value, other) {
11253
      return value === other || (value !== value && other !== other);
11254
    }
11255
11256
    /**
11257
     * Checks if `value` is greater than `other`.
11258
     *
11259
     * @static
11260
     * @memberOf _
11261
     * @since 3.9.0
11262
     * @category Lang
11263
     * @param {*} value The value to compare.
11264
     * @param {*} other The other value to compare.
11265
     * @returns {boolean} Returns `true` if `value` is greater than `other`,
11266
     *  else `false`.
11267
     * @see _.lt
11268
     * @example
11269
     *
11270
     * _.gt(3, 1);
11271
     * // => true
11272
     *
11273
     * _.gt(3, 3);
11274
     * // => false
11275
     *
11276
     * _.gt(1, 3);
11277
     * // => false
11278
     */
11279
    var gt = createRelationalOperation(baseGt);
11280
11281
    /**
11282
     * Checks if `value` is greater than or equal to `other`.
11283
     *
11284
     * @static
11285
     * @memberOf _
11286
     * @since 3.9.0
11287
     * @category Lang
11288
     * @param {*} value The value to compare.
11289
     * @param {*} other The other value to compare.
11290
     * @returns {boolean} Returns `true` if `value` is greater than or equal to
11291
     *  `other`, else `false`.
11292
     * @see _.lte
11293
     * @example
11294
     *
11295
     * _.gte(3, 1);
11296
     * // => true
11297
     *
11298
     * _.gte(3, 3);
11299
     * // => true
11300
     *
11301
     * _.gte(1, 3);
11302
     * // => false
11303
     */
11304
    var gte = createRelationalOperation(function(value, other) {
11305
      return value >= other;
11306
    });
11307
11308
    /**
11309
     * Checks if `value` is likely an `arguments` object.
11310
     *
11311
     * @static
11312
     * @memberOf _
11313
     * @since 0.1.0
11314
     * @category Lang
11315
     * @param {*} value The value to check.
11316
     * @returns {boolean} Returns `true` if `value` is an `arguments` object,
11317
     *  else `false`.
11318
     * @example
11319
     *
11320
     * _.isArguments(function() { return arguments; }());
11321
     * // => true
11322
     *
11323
     * _.isArguments([1, 2, 3]);
11324
     * // => false
11325
     */
11326
    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {
11327
      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&
11328
        !propertyIsEnumerable.call(value, 'callee');
11329
    };
11330
11331
    /**
11332
     * Checks if `value` is classified as an `Array` object.
11333
     *
11334
     * @static
11335
     * @memberOf _
11336
     * @since 0.1.0
11337
     * @category Lang
11338
     * @param {*} value The value to check.
11339
     * @returns {boolean} Returns `true` if `value` is an array, else `false`.
11340
     * @example
11341
     *
11342
     * _.isArray([1, 2, 3]);
11343
     * // => true
11344
     *
11345
     * _.isArray(document.body.children);
11346
     * // => false
11347
     *
11348
     * _.isArray('abc');
11349
     * // => false
11350
     *
11351
     * _.isArray(_.noop);
11352
     * // => false
11353
     */
11354
    var isArray = Array.isArray;
11355
11356
    /**
11357
     * Checks if `value` is classified as an `ArrayBuffer` object.
11358
     *
11359
     * @static
11360
     * @memberOf _
11361
     * @since 4.3.0
11362
     * @category Lang
11363
     * @param {*} value The value to check.
11364
     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.
11365
     * @example
11366
     *
11367
     * _.isArrayBuffer(new ArrayBuffer(2));
11368
     * // => true
11369
     *
11370
     * _.isArrayBuffer(new Array(2));
11371
     * // => false
11372
     */
11373
    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
11374
11375
    /**
11376
     * Checks if `value` is array-like. A value is considered array-like if it's
11377
     * not a function and has a `value.length` that's an integer greater than or
11378
     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
11379
     *
11380
     * @static
11381
     * @memberOf _
11382
     * @since 4.0.0
11383
     * @category Lang
11384
     * @param {*} value The value to check.
11385
     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
11386
     * @example
11387
     *
11388
     * _.isArrayLike([1, 2, 3]);
11389
     * // => true
11390
     *
11391
     * _.isArrayLike(document.body.children);
11392
     * // => true
11393
     *
11394
     * _.isArrayLike('abc');
11395
     * // => true
11396
     *
11397
     * _.isArrayLike(_.noop);
11398
     * // => false
11399
     */
11400
    function isArrayLike(value) {
11401
      return value != null && isLength(value.length) && !isFunction(value);
11402
    }
11403
11404
    /**
11405
     * This method is like `_.isArrayLike` except that it also checks if `value`
11406
     * is an object.
11407
     *
11408
     * @static
11409
     * @memberOf _
11410
     * @since 4.0.0
11411
     * @category Lang
11412
     * @param {*} value The value to check.
11413
     * @returns {boolean} Returns `true` if `value` is an array-like object,
11414
     *  else `false`.
11415
     * @example
11416
     *
11417
     * _.isArrayLikeObject([1, 2, 3]);
11418
     * // => true
11419
     *
11420
     * _.isArrayLikeObject(document.body.children);
11421
     * // => true
11422
     *
11423
     * _.isArrayLikeObject('abc');
11424
     * // => false
11425
     *
11426
     * _.isArrayLikeObject(_.noop);
11427
     * // => false
11428
     */
11429
    function isArrayLikeObject(value) {
11430
      return isObjectLike(value) && isArrayLike(value);
11431
    }
11432
11433
    /**
11434
     * Checks if `value` is classified as a boolean primitive or object.
11435
     *
11436
     * @static
11437
     * @memberOf _
11438
     * @since 0.1.0
11439
     * @category Lang
11440
     * @param {*} value The value to check.
11441
     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.
11442
     * @example
11443
     *
11444
     * _.isBoolean(false);
11445
     * // => true
11446
     *
11447
     * _.isBoolean(null);
11448
     * // => false
11449
     */
11450
    function isBoolean(value) {
11451
      return value === true || value === false ||
11452
        (isObjectLike(value) && baseGetTag(value) == boolTag);
11453
    }
11454
11455
    /**
11456
     * Checks if `value` is a buffer.
11457
     *
11458
     * @static
11459
     * @memberOf _
11460
     * @since 4.3.0
11461
     * @category Lang
11462
     * @param {*} value The value to check.
11463
     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
11464
     * @example
11465
     *
11466
     * _.isBuffer(new Buffer(2));
11467
     * // => true
11468
     *
11469
     * _.isBuffer(new Uint8Array(2));
11470
     * // => false
11471
     */
11472
    var isBuffer = nativeIsBuffer || stubFalse;
11473
11474
    /**
11475
     * Checks if `value` is classified as a `Date` object.
11476
     *
11477
     * @static
11478
     * @memberOf _
11479
     * @since 0.1.0
11480
     * @category Lang
11481
     * @param {*} value The value to check.
11482
     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.
11483
     * @example
11484
     *
11485
     * _.isDate(new Date);
11486
     * // => true
11487
     *
11488
     * _.isDate('Mon April 23 2012');
11489
     * // => false
11490
     */
11491
    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
11492
11493
    /**
11494
     * Checks if `value` is likely a DOM element.
11495
     *
11496
     * @static
11497
     * @memberOf _
11498
     * @since 0.1.0
11499
     * @category Lang
11500
     * @param {*} value The value to check.
11501
     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.
11502
     * @example
11503
     *
11504
     * _.isElement(document.body);
11505
     * // => true
11506
     *
11507
     * _.isElement('<body>');
11508
     * // => false
11509
     */
11510
    function isElement(value) {
11511
      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
11512
    }
11513
11514
    /**
11515
     * Checks if `value` is an empty object, collection, map, or set.
11516
     *
11517
     * Objects are considered empty if they have no own enumerable string keyed
11518
     * properties.
11519
     *
11520
     * Array-like values such as `arguments` objects, arrays, buffers, strings, or
11521
     * jQuery-like collections are considered empty if they have a `length` of `0`.
11522
     * Similarly, maps and sets are considered empty if they have a `size` of `0`.
11523
     *
11524
     * @static
11525
     * @memberOf _
11526
     * @since 0.1.0
11527
     * @category Lang
11528
     * @param {*} value The value to check.
11529
     * @returns {boolean} Returns `true` if `value` is empty, else `false`.
11530
     * @example
11531
     *
11532
     * _.isEmpty(null);
11533
     * // => true
11534
     *
11535
     * _.isEmpty(true);
11536
     * // => true
11537
     *
11538
     * _.isEmpty(1);
11539
     * // => true
11540
     *
11541
     * _.isEmpty([1, 2, 3]);
11542
     * // => false
11543
     *
11544
     * _.isEmpty({ 'a': 1 });
11545
     * // => false
11546
     */
11547
    function isEmpty(value) {
11548
      if (value == null) {
11549
        return true;
11550
      }
11551
      if (isArrayLike(value) &&
11552
          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
11553
            isBuffer(value) || isTypedArray(value) || isArguments(value))) {
11554
        return !value.length;
11555
      }
11556
      var tag = getTag(value);
11557
      if (tag == mapTag || tag == setTag) {
11558
        return !value.size;
11559
      }
11560
      if (isPrototype(value)) {
11561
        return !baseKeys(value).length;
11562
      }
11563
      for (var key in value) {
11564
        if (hasOwnProperty.call(value, key)) {
11565
          return false;
11566
        }
11567
      }
11568
      return true;
11569
    }
11570
11571
    /**
11572
     * Performs a deep comparison between two values to determine if they are
11573
     * equivalent.
11574
     *
11575
     * **Note:** This method supports comparing arrays, array buffers, booleans,
11576
     * date objects, error objects, maps, numbers, `Object` objects, regexes,
11577
     * sets, strings, symbols, and typed arrays. `Object` objects are compared
11578
     * by their own, not inherited, enumerable properties. Functions and DOM
11579
     * nodes are compared by strict equality, i.e. `===`.
11580
     *
11581
     * @static
11582
     * @memberOf _
11583
     * @since 0.1.0
11584
     * @category Lang
11585
     * @param {*} value The value to compare.
11586
     * @param {*} other The other value to compare.
11587
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11588
     * @example
11589
     *
11590
     * var object = { 'a': 1 };
11591
     * var other = { 'a': 1 };
11592
     *
11593
     * _.isEqual(object, other);
11594
     * // => true
11595
     *
11596
     * object === other;
11597
     * // => false
11598
     */
11599
    function isEqual(value, other) {
11600
      return baseIsEqual(value, other);
11601
    }
11602
11603
    /**
11604
     * This method is like `_.isEqual` except that it accepts `customizer` which
11605
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11606
     * are handled by the method instead. The `customizer` is invoked with up to
11607
     * six arguments: (objValue, othValue [, index|key, object, other, stack]).
11608
     *
11609
     * @static
11610
     * @memberOf _
11611
     * @since 4.0.0
11612
     * @category Lang
11613
     * @param {*} value The value to compare.
11614
     * @param {*} other The other value to compare.
11615
     * @param {Function} [customizer] The function to customize comparisons.
11616
     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
11617
     * @example
11618
     *
11619
     * function isGreeting(value) {
11620
     *   return /^h(?:i|ello)$/.test(value);
11621
     * }
11622
     *
11623
     * function customizer(objValue, othValue) {
11624
     *   if (isGreeting(objValue) && isGreeting(othValue)) {
11625
     *     return true;
11626
     *   }
11627
     * }
11628
     *
11629
     * var array = ['hello', 'goodbye'];
11630
     * var other = ['hi', 'goodbye'];
11631
     *
11632
     * _.isEqualWith(array, other, customizer);
11633
     * // => true
11634
     */
11635
    function isEqualWith(value, other, customizer) {
11636
      customizer = typeof customizer == 'function' ? customizer : undefined;
11637
      var result = customizer ? customizer(value, other) : undefined;
11638
      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;
11639
    }
11640
11641
    /**
11642
     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,
11643
     * `SyntaxError`, `TypeError`, or `URIError` object.
11644
     *
11645
     * @static
11646
     * @memberOf _
11647
     * @since 3.0.0
11648
     * @category Lang
11649
     * @param {*} value The value to check.
11650
     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.
11651
     * @example
11652
     *
11653
     * _.isError(new Error);
11654
     * // => true
11655
     *
11656
     * _.isError(Error);
11657
     * // => false
11658
     */
11659
    function isError(value) {
11660
      if (!isObjectLike(value)) {
11661
        return false;
11662
      }
11663
      var tag = baseGetTag(value);
11664
      return tag == errorTag || tag == domExcTag ||
11665
        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));
11666
    }
11667
11668
    /**
11669
     * Checks if `value` is a finite primitive number.
11670
     *
11671
     * **Note:** This method is based on
11672
     * [`Number.isFinite`](https://mdn.io/Number/isFinite).
11673
     *
11674
     * @static
11675
     * @memberOf _
11676
     * @since 0.1.0
11677
     * @category Lang
11678
     * @param {*} value The value to check.
11679
     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.
11680
     * @example
11681
     *
11682
     * _.isFinite(3);
11683
     * // => true
11684
     *
11685
     * _.isFinite(Number.MIN_VALUE);
11686
     * // => true
11687
     *
11688
     * _.isFinite(Infinity);
11689
     * // => false
11690
     *
11691
     * _.isFinite('3');
11692
     * // => false
11693
     */
11694
    function isFinite(value) {
11695
      return typeof value == 'number' && nativeIsFinite(value);
11696
    }
11697
11698
    /**
11699
     * Checks if `value` is classified as a `Function` object.
11700
     *
11701
     * @static
11702
     * @memberOf _
11703
     * @since 0.1.0
11704
     * @category Lang
11705
     * @param {*} value The value to check.
11706
     * @returns {boolean} Returns `true` if `value` is a function, else `false`.
11707
     * @example
11708
     *
11709
     * _.isFunction(_);
11710
     * // => true
11711
     *
11712
     * _.isFunction(/abc/);
11713
     * // => false
11714
     */
11715
    function isFunction(value) {
11716
      if (!isObject(value)) {
11717
        return false;
11718
      }
11719
      // The use of `Object#toString` avoids issues with the `typeof` operator
11720
      // in Safari 9 which returns 'object' for typed arrays and other constructors.
11721
      var tag = baseGetTag(value);
11722
      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
11723
    }
11724
11725
    /**
11726
     * Checks if `value` is an integer.
11727
     *
11728
     * **Note:** This method is based on
11729
     * [`Number.isInteger`](https://mdn.io/Number/isInteger).
11730
     *
11731
     * @static
11732
     * @memberOf _
11733
     * @since 4.0.0
11734
     * @category Lang
11735
     * @param {*} value The value to check.
11736
     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.
11737
     * @example
11738
     *
11739
     * _.isInteger(3);
11740
     * // => true
11741
     *
11742
     * _.isInteger(Number.MIN_VALUE);
11743
     * // => false
11744
     *
11745
     * _.isInteger(Infinity);
11746
     * // => false
11747
     *
11748
     * _.isInteger('3');
11749
     * // => false
11750
     */
11751
    function isInteger(value) {
11752
      return typeof value == 'number' && value == toInteger(value);
11753
    }
11754
11755
    /**
11756
     * Checks if `value` is a valid array-like length.
11757
     *
11758
     * **Note:** This method is loosely based on
11759
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
11760
     *
11761
     * @static
11762
     * @memberOf _
11763
     * @since 4.0.0
11764
     * @category Lang
11765
     * @param {*} value The value to check.
11766
     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
11767
     * @example
11768
     *
11769
     * _.isLength(3);
11770
     * // => true
11771
     *
11772
     * _.isLength(Number.MIN_VALUE);
11773
     * // => false
11774
     *
11775
     * _.isLength(Infinity);
11776
     * // => false
11777
     *
11778
     * _.isLength('3');
11779
     * // => false
11780
     */
11781
    function isLength(value) {
11782
      return typeof value == 'number' &&
11783
        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
11784
    }
11785
11786
    /**
11787
     * Checks if `value` is the
11788
     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)
11789
     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
11790
     *
11791
     * @static
11792
     * @memberOf _
11793
     * @since 0.1.0
11794
     * @category Lang
11795
     * @param {*} value The value to check.
11796
     * @returns {boolean} Returns `true` if `value` is an object, else `false`.
11797
     * @example
11798
     *
11799
     * _.isObject({});
11800
     * // => true
11801
     *
11802
     * _.isObject([1, 2, 3]);
11803
     * // => true
11804
     *
11805
     * _.isObject(_.noop);
11806
     * // => true
11807
     *
11808
     * _.isObject(null);
11809
     * // => false
11810
     */
11811
    function isObject(value) {
11812
      var type = typeof value;
11813
      return value != null && (type == 'object' || type == 'function');
11814
    }
11815
11816
    /**
11817
     * Checks if `value` is object-like. A value is object-like if it's not `null`
11818
     * and has a `typeof` result of "object".
11819
     *
11820
     * @static
11821
     * @memberOf _
11822
     * @since 4.0.0
11823
     * @category Lang
11824
     * @param {*} value The value to check.
11825
     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
11826
     * @example
11827
     *
11828
     * _.isObjectLike({});
11829
     * // => true
11830
     *
11831
     * _.isObjectLike([1, 2, 3]);
11832
     * // => true
11833
     *
11834
     * _.isObjectLike(_.noop);
11835
     * // => false
11836
     *
11837
     * _.isObjectLike(null);
11838
     * // => false
11839
     */
11840
    function isObjectLike(value) {
11841
      return value != null && typeof value == 'object';
11842
    }
11843
11844
    /**
11845
     * Checks if `value` is classified as a `Map` object.
11846
     *
11847
     * @static
11848
     * @memberOf _
11849
     * @since 4.3.0
11850
     * @category Lang
11851
     * @param {*} value The value to check.
11852
     * @returns {boolean} Returns `true` if `value` is a map, else `false`.
11853
     * @example
11854
     *
11855
     * _.isMap(new Map);
11856
     * // => true
11857
     *
11858
     * _.isMap(new WeakMap);
11859
     * // => false
11860
     */
11861
    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
11862
11863
    /**
11864
     * Performs a partial deep comparison between `object` and `source` to
11865
     * determine if `object` contains equivalent property values.
11866
     *
11867
     * **Note:** This method is equivalent to `_.matches` when `source` is
11868
     * partially applied.
11869
     *
11870
     * Partial comparisons will match empty array and empty object `source`
11871
     * values against any array or object value, respectively. See `_.isEqual`
11872
     * for a list of supported value comparisons.
11873
     *
11874
     * @static
11875
     * @memberOf _
11876
     * @since 3.0.0
11877
     * @category Lang
11878
     * @param {Object} object The object to inspect.
11879
     * @param {Object} source The object of property values to match.
11880
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11881
     * @example
11882
     *
11883
     * var object = { 'a': 1, 'b': 2 };
11884
     *
11885
     * _.isMatch(object, { 'b': 2 });
11886
     * // => true
11887
     *
11888
     * _.isMatch(object, { 'b': 1 });
11889
     * // => false
11890
     */
11891
    function isMatch(object, source) {
11892
      return object === source || baseIsMatch(object, source, getMatchData(source));
11893
    }
11894
11895
    /**
11896
     * This method is like `_.isMatch` except that it accepts `customizer` which
11897
     * is invoked to compare values. If `customizer` returns `undefined`, comparisons
11898
     * are handled by the method instead. The `customizer` is invoked with five
11899
     * arguments: (objValue, srcValue, index|key, object, source).
11900
     *
11901
     * @static
11902
     * @memberOf _
11903
     * @since 4.0.0
11904
     * @category Lang
11905
     * @param {Object} object The object to inspect.
11906
     * @param {Object} source The object of property values to match.
11907
     * @param {Function} [customizer] The function to customize comparisons.
11908
     * @returns {boolean} Returns `true` if `object` is a match, else `false`.
11909
     * @example
11910
     *
11911
     * function isGreeting(value) {
11912
     *   return /^h(?:i|ello)$/.test(value);
11913
     * }
11914
     *
11915
     * function customizer(objValue, srcValue) {
11916
     *   if (isGreeting(objValue) && isGreeting(srcValue)) {
11917
     *     return true;
11918
     *   }
11919
     * }
11920
     *
11921
     * var object = { 'greeting': 'hello' };
11922
     * var source = { 'greeting': 'hi' };
11923
     *
11924
     * _.isMatchWith(object, source, customizer);
11925
     * // => true
11926
     */
11927
    function isMatchWith(object, source, customizer) {
11928
      customizer = typeof customizer == 'function' ? customizer : undefined;
11929
      return baseIsMatch(object, source, getMatchData(source), customizer);
11930
    }
11931
11932
    /**
11933
     * Checks if `value` is `NaN`.
11934
     *
11935
     * **Note:** This method is based on
11936
     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
11937
     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
11938
     * `undefined` and other non-number values.
11939
     *
11940
     * @static
11941
     * @memberOf _
11942
     * @since 0.1.0
11943
     * @category Lang
11944
     * @param {*} value The value to check.
11945
     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
11946
     * @example
11947
     *
11948
     * _.isNaN(NaN);
11949
     * // => true
11950
     *
11951
     * _.isNaN(new Number(NaN));
11952
     * // => true
11953
     *
11954
     * isNaN(undefined);
11955
     * // => true
11956
     *
11957
     * _.isNaN(undefined);
11958
     * // => false
11959
     */
11960
    function isNaN(value) {
11961
      // An `NaN` primitive is the only value that is not equal to itself.
11962
      // Perform the `toStringTag` check first to avoid errors with some
11963
      // ActiveX objects in IE.
11964
      return isNumber(value) && value != +value;
11965
    }
11966
11967
    /**
11968
     * Checks if `value` is a pristine native function.
11969
     *
11970
     * **Note:** This method can't reliably detect native functions in the presence
11971
     * of the core-js package because core-js circumvents this kind of detection.
11972
     * Despite multiple requests, the core-js maintainer has made it clear: any
11973
     * attempt to fix the detection will be obstructed. As a result, we're left
11974
     * with little choice but to throw an error. Unfortunately, this also affects
11975
     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),
11976
     * which rely on core-js.
11977
     *
11978
     * @static
11979
     * @memberOf _
11980
     * @since 3.0.0
11981
     * @category Lang
11982
     * @param {*} value The value to check.
11983
     * @returns {boolean} Returns `true` if `value` is a native function,
11984
     *  else `false`.
11985
     * @example
11986
     *
11987
     * _.isNative(Array.prototype.push);
11988
     * // => true
11989
     *
11990
     * _.isNative(_);
11991
     * // => false
11992
     */
11993
    function isNative(value) {
11994
      if (isMaskable(value)) {
11995
        throw new Error(CORE_ERROR_TEXT);
11996
      }
11997
      return baseIsNative(value);
11998
    }
11999
12000
    /**
12001
     * Checks if `value` is `null`.
12002
     *
12003
     * @static
12004
     * @memberOf _
12005
     * @since 0.1.0
12006
     * @category Lang
12007
     * @param {*} value The value to check.
12008
     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.
12009
     * @example
12010
     *
12011
     * _.isNull(null);
12012
     * // => true
12013
     *
12014
     * _.isNull(void 0);
12015
     * // => false
12016
     */
12017
    function isNull(value) {
12018
      return value === null;
12019
    }
12020
12021
    /**
12022
     * Checks if `value` is `null` or `undefined`.
12023
     *
12024
     * @static
12025
     * @memberOf _
12026
     * @since 4.0.0
12027
     * @category Lang
12028
     * @param {*} value The value to check.
12029
     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.
12030
     * @example
12031
     *
12032
     * _.isNil(null);
12033
     * // => true
12034
     *
12035
     * _.isNil(void 0);
12036
     * // => true
12037
     *
12038
     * _.isNil(NaN);
12039
     * // => false
12040
     */
12041
    function isNil(value) {
12042
      return value == null;
12043
    }
12044
12045
    /**
12046
     * Checks if `value` is classified as a `Number` primitive or object.
12047
     *
12048
     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
12049
     * classified as numbers, use the `_.isFinite` method.
12050
     *
12051
     * @static
12052
     * @memberOf _
12053
     * @since 0.1.0
12054
     * @category Lang
12055
     * @param {*} value The value to check.
12056
     * @returns {boolean} Returns `true` if `value` is a number, else `false`.
12057
     * @example
12058
     *
12059
     * _.isNumber(3);
12060
     * // => true
12061
     *
12062
     * _.isNumber(Number.MIN_VALUE);
12063
     * // => true
12064
     *
12065
     * _.isNumber(Infinity);
12066
     * // => true
12067
     *
12068
     * _.isNumber('3');
12069
     * // => false
12070
     */
12071
    function isNumber(value) {
12072
      return typeof value == 'number' ||
12073
        (isObjectLike(value) && baseGetTag(value) == numberTag);
12074
    }
12075
12076
    /**
12077
     * Checks if `value` is a plain object, that is, an object created by the
12078
     * `Object` constructor or one with a `[[Prototype]]` of `null`.
12079
     *
12080
     * @static
12081
     * @memberOf _
12082
     * @since 0.8.0
12083
     * @category Lang
12084
     * @param {*} value The value to check.
12085
     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
12086
     * @example
12087
     *
12088
     * function Foo() {
12089
     *   this.a = 1;
12090
     * }
12091
     *
12092
     * _.isPlainObject(new Foo);
12093
     * // => false
12094
     *
12095
     * _.isPlainObject([1, 2, 3]);
12096
     * // => false
12097
     *
12098
     * _.isPlainObject({ 'x': 0, 'y': 0 });
12099
     * // => true
12100
     *
12101
     * _.isPlainObject(Object.create(null));
12102
     * // => true
12103
     */
12104
    function isPlainObject(value) {
12105
      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
12106
        return false;
12107
      }
12108
      var proto = getPrototype(value);
12109
      if (proto === null) {
12110
        return true;
12111
      }
12112
      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;
12113
      return typeof Ctor == 'function' && Ctor instanceof Ctor &&
12114
        funcToString.call(Ctor) == objectCtorString;
12115
    }
12116
12117
    /**
12118
     * Checks if `value` is classified as a `RegExp` object.
12119
     *
12120
     * @static
12121
     * @memberOf _
12122
     * @since 0.1.0
12123
     * @category Lang
12124
     * @param {*} value The value to check.
12125
     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.
12126
     * @example
12127
     *
12128
     * _.isRegExp(/abc/);
12129
     * // => true
12130
     *
12131
     * _.isRegExp('/abc/');
12132
     * // => false
12133
     */
12134
    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
12135
12136
    /**
12137
     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754
12138
     * double precision number which isn't the result of a rounded unsafe integer.
12139
     *
12140
     * **Note:** This method is based on
12141
     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).
12142
     *
12143
     * @static
12144
     * @memberOf _
12145
     * @since 4.0.0
12146
     * @category Lang
12147
     * @param {*} value The value to check.
12148
     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.
12149
     * @example
12150
     *
12151
     * _.isSafeInteger(3);
12152
     * // => true
12153
     *
12154
     * _.isSafeInteger(Number.MIN_VALUE);
12155
     * // => false
12156
     *
12157
     * _.isSafeInteger(Infinity);
12158
     * // => false
12159
     *
12160
     * _.isSafeInteger('3');
12161
     * // => false
12162
     */
12163
    function isSafeInteger(value) {
12164
      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
12165
    }
12166
12167
    /**
12168
     * Checks if `value` is classified as a `Set` object.
12169
     *
12170
     * @static
12171
     * @memberOf _
12172
     * @since 4.3.0
12173
     * @category Lang
12174
     * @param {*} value The value to check.
12175
     * @returns {boolean} Returns `true` if `value` is a set, else `false`.
12176
     * @example
12177
     *
12178
     * _.isSet(new Set);
12179
     * // => true
12180
     *
12181
     * _.isSet(new WeakSet);
12182
     * // => false
12183
     */
12184
    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
12185
12186
    /**
12187
     * Checks if `value` is classified as a `String` primitive or object.
12188
     *
12189
     * @static
12190
     * @since 0.1.0
12191
     * @memberOf _
12192
     * @category Lang
12193
     * @param {*} value The value to check.
12194
     * @returns {boolean} Returns `true` if `value` is a string, else `false`.
12195
     * @example
12196
     *
12197
     * _.isString('abc');
12198
     * // => true
12199
     *
12200
     * _.isString(1);
12201
     * // => false
12202
     */
12203
    function isString(value) {
12204
      return typeof value == 'string' ||
12205
        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);
12206
    }
12207
12208
    /**
12209
     * Checks if `value` is classified as a `Symbol` primitive or object.
12210
     *
12211
     * @static
12212
     * @memberOf _
12213
     * @since 4.0.0
12214
     * @category Lang
12215
     * @param {*} value The value to check.
12216
     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
12217
     * @example
12218
     *
12219
     * _.isSymbol(Symbol.iterator);
12220
     * // => true
12221
     *
12222
     * _.isSymbol('abc');
12223
     * // => false
12224
     */
12225
    function isSymbol(value) {
12226
      return typeof value == 'symbol' ||
12227
        (isObjectLike(value) && baseGetTag(value) == symbolTag);
12228
    }
12229
12230
    /**
12231
     * Checks if `value` is classified as a typed array.
12232
     *
12233
     * @static
12234
     * @memberOf _
12235
     * @since 3.0.0
12236
     * @category Lang
12237
     * @param {*} value The value to check.
12238
     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
12239
     * @example
12240
     *
12241
     * _.isTypedArray(new Uint8Array);
12242
     * // => true
12243
     *
12244
     * _.isTypedArray([]);
12245
     * // => false
12246
     */
12247
    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
12248
12249
    /**
12250
     * Checks if `value` is `undefined`.
12251
     *
12252
     * @static
12253
     * @since 0.1.0
12254
     * @memberOf _
12255
     * @category Lang
12256
     * @param {*} value The value to check.
12257
     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.
12258
     * @example
12259
     *
12260
     * _.isUndefined(void 0);
12261
     * // => true
12262
     *
12263
     * _.isUndefined(null);
12264
     * // => false
12265
     */
12266
    function isUndefined(value) {
12267
      return value === undefined;
12268
    }
12269
12270
    /**
12271
     * Checks if `value` is classified as a `WeakMap` object.
12272
     *
12273
     * @static
12274
     * @memberOf _
12275
     * @since 4.3.0
12276
     * @category Lang
12277
     * @param {*} value The value to check.
12278
     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.
12279
     * @example
12280
     *
12281
     * _.isWeakMap(new WeakMap);
12282
     * // => true
12283
     *
12284
     * _.isWeakMap(new Map);
12285
     * // => false
12286
     */
12287
    function isWeakMap(value) {
12288
      return isObjectLike(value) && getTag(value) == weakMapTag;
12289
    }
12290
12291
    /**
12292
     * Checks if `value` is classified as a `WeakSet` object.
12293
     *
12294
     * @static
12295
     * @memberOf _
12296
     * @since 4.3.0
12297
     * @category Lang
12298
     * @param {*} value The value to check.
12299
     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.
12300
     * @example
12301
     *
12302
     * _.isWeakSet(new WeakSet);
12303
     * // => true
12304
     *
12305
     * _.isWeakSet(new Set);
12306
     * // => false
12307
     */
12308
    function isWeakSet(value) {
12309
      return isObjectLike(value) && baseGetTag(value) == weakSetTag;
12310
    }
12311
12312
    /**
12313
     * Checks if `value` is less than `other`.
12314
     *
12315
     * @static
12316
     * @memberOf _
12317
     * @since 3.9.0
12318
     * @category Lang
12319
     * @param {*} value The value to compare.
12320
     * @param {*} other The other value to compare.
12321
     * @returns {boolean} Returns `true` if `value` is less than `other`,
12322
     *  else `false`.
12323
     * @see _.gt
12324
     * @example
12325
     *
12326
     * _.lt(1, 3);
12327
     * // => true
12328
     *
12329
     * _.lt(3, 3);
12330
     * // => false
12331
     *
12332
     * _.lt(3, 1);
12333
     * // => false
12334
     */
12335
    var lt = createRelationalOperation(baseLt);
12336
12337
    /**
12338
     * Checks if `value` is less than or equal to `other`.
12339
     *
12340
     * @static
12341
     * @memberOf _
12342
     * @since 3.9.0
12343
     * @category Lang
12344
     * @param {*} value The value to compare.
12345
     * @param {*} other The other value to compare.
12346
     * @returns {boolean} Returns `true` if `value` is less than or equal to
12347
     *  `other`, else `false`.
12348
     * @see _.gte
12349
     * @example
12350
     *
12351
     * _.lte(1, 3);
12352
     * // => true
12353
     *
12354
     * _.lte(3, 3);
12355
     * // => true
12356
     *
12357
     * _.lte(3, 1);
12358
     * // => false
12359
     */
12360
    var lte = createRelationalOperation(function(value, other) {
12361
      return value <= other;
12362
    });
12363
12364
    /**
12365
     * Converts `value` to an array.
12366
     *
12367
     * @static
12368
     * @since 0.1.0
12369
     * @memberOf _
12370
     * @category Lang
12371
     * @param {*} value The value to convert.
12372
     * @returns {Array} Returns the converted array.
12373
     * @example
12374
     *
12375
     * _.toArray({ 'a': 1, 'b': 2 });
12376
     * // => [1, 2]
12377
     *
12378
     * _.toArray('abc');
12379
     * // => ['a', 'b', 'c']
12380
     *
12381
     * _.toArray(1);
12382
     * // => []
12383
     *
12384
     * _.toArray(null);
12385
     * // => []
12386
     */
12387
    function toArray(value) {
12388
      if (!value) {
12389
        return [];
12390
      }
12391
      if (isArrayLike(value)) {
12392
        return isString(value) ? stringToArray(value) : copyArray(value);
12393
      }
12394
      if (symIterator && value[symIterator]) {
12395
        return iteratorToArray(value[symIterator]());
12396
      }
12397
      var tag = getTag(value),
12398
          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);
12399
12400
      return func(value);
12401
    }
12402
12403
    /**
12404
     * Converts `value` to a finite number.
12405
     *
12406
     * @static
12407
     * @memberOf _
12408
     * @since 4.12.0
12409
     * @category Lang
12410
     * @param {*} value The value to convert.
12411
     * @returns {number} Returns the converted number.
12412
     * @example
12413
     *
12414
     * _.toFinite(3.2);
12415
     * // => 3.2
12416
     *
12417
     * _.toFinite(Number.MIN_VALUE);
12418
     * // => 5e-324
12419
     *
12420
     * _.toFinite(Infinity);
12421
     * // => 1.7976931348623157e+308
12422
     *
12423
     * _.toFinite('3.2');
12424
     * // => 3.2
12425
     */
12426
    function toFinite(value) {
12427
      if (!value) {
12428
        return value === 0 ? value : 0;
12429
      }
12430
      value = toNumber(value);
12431
      if (value === INFINITY || value === -INFINITY) {
12432
        var sign = (value < 0 ? -1 : 1);
12433
        return sign * MAX_INTEGER;
12434
      }
12435
      return value === value ? value : 0;
12436
    }
12437
12438
    /**
12439
     * Converts `value` to an integer.
12440
     *
12441
     * **Note:** This method is loosely based on
12442
     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
12443
     *
12444
     * @static
12445
     * @memberOf _
12446
     * @since 4.0.0
12447
     * @category Lang
12448
     * @param {*} value The value to convert.
12449
     * @returns {number} Returns the converted integer.
12450
     * @example
12451
     *
12452
     * _.toInteger(3.2);
12453
     * // => 3
12454
     *
12455
     * _.toInteger(Number.MIN_VALUE);
12456
     * // => 0
12457
     *
12458
     * _.toInteger(Infinity);
12459
     * // => 1.7976931348623157e+308
12460
     *
12461
     * _.toInteger('3.2');
12462
     * // => 3
12463
     */
12464
    function toInteger(value) {
12465
      var result = toFinite(value),
12466
          remainder = result % 1;
12467
12468
      return result === result ? (remainder ? result - remainder : result) : 0;
12469
    }
12470
12471
    /**
12472
     * Converts `value` to an integer suitable for use as the length of an
12473
     * array-like object.
12474
     *
12475
     * **Note:** This method is based on
12476
     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).
12477
     *
12478
     * @static
12479
     * @memberOf _
12480
     * @since 4.0.0
12481
     * @category Lang
12482
     * @param {*} value The value to convert.
12483
     * @returns {number} Returns the converted integer.
12484
     * @example
12485
     *
12486
     * _.toLength(3.2);
12487
     * // => 3
12488
     *
12489
     * _.toLength(Number.MIN_VALUE);
12490
     * // => 0
12491
     *
12492
     * _.toLength(Infinity);
12493
     * // => 4294967295
12494
     *
12495
     * _.toLength('3.2');
12496
     * // => 3
12497
     */
12498
    function toLength(value) {
12499
      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;
12500
    }
12501
12502
    /**
12503
     * Converts `value` to a number.
12504
     *
12505
     * @static
12506
     * @memberOf _
12507
     * @since 4.0.0
12508
     * @category Lang
12509
     * @param {*} value The value to process.
12510
     * @returns {number} Returns the number.
12511
     * @example
12512
     *
12513
     * _.toNumber(3.2);
12514
     * // => 3.2
12515
     *
12516
     * _.toNumber(Number.MIN_VALUE);
12517
     * // => 5e-324
12518
     *
12519
     * _.toNumber(Infinity);
12520
     * // => Infinity
12521
     *
12522
     * _.toNumber('3.2');
12523
     * // => 3.2
12524
     */
12525
    function toNumber(value) {
12526
      if (typeof value == 'number') {
12527
        return value;
12528
      }
12529
      if (isSymbol(value)) {
12530
        return NAN;
12531
      }
12532
      if (isObject(value)) {
12533
        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
12534
        value = isObject(other) ? (other + '') : other;
12535
      }
12536
      if (typeof value != 'string') {
12537
        return value === 0 ? value : +value;
12538
      }
12539
      value = baseTrim(value);
12540
      var isBinary = reIsBinary.test(value);
12541
      return (isBinary || reIsOctal.test(value))
12542
        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
12543
        : (reIsBadHex.test(value) ? NAN : +value);
12544
    }
12545
12546
    /**
12547
     * Converts `value` to a plain object flattening inherited enumerable string
12548
     * keyed properties of `value` to own properties of the plain object.
12549
     *
12550
     * @static
12551
     * @memberOf _
12552
     * @since 3.0.0
12553
     * @category Lang
12554
     * @param {*} value The value to convert.
12555
     * @returns {Object} Returns the converted plain object.
12556
     * @example
12557
     *
12558
     * function Foo() {
12559
     *   this.b = 2;
12560
     * }
12561
     *
12562
     * Foo.prototype.c = 3;
12563
     *
12564
     * _.assign({ 'a': 1 }, new Foo);
12565
     * // => { 'a': 1, 'b': 2 }
12566
     *
12567
     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));
12568
     * // => { 'a': 1, 'b': 2, 'c': 3 }
12569
     */
12570
    function toPlainObject(value) {
12571
      return copyObject(value, keysIn(value));
12572
    }
12573
12574
    /**
12575
     * Converts `value` to a safe integer. A safe integer can be compared and
12576
     * represented correctly.
12577
     *
12578
     * @static
12579
     * @memberOf _
12580
     * @since 4.0.0
12581
     * @category Lang
12582
     * @param {*} value The value to convert.
12583
     * @returns {number} Returns the converted integer.
12584
     * @example
12585
     *
12586
     * _.toSafeInteger(3.2);
12587
     * // => 3
12588
     *
12589
     * _.toSafeInteger(Number.MIN_VALUE);
12590
     * // => 0
12591
     *
12592
     * _.toSafeInteger(Infinity);
12593
     * // => 9007199254740991
12594
     *
12595
     * _.toSafeInteger('3.2');
12596
     * // => 3
12597
     */
12598
    function toSafeInteger(value) {
12599
      return value
12600
        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)
12601
        : (value === 0 ? value : 0);
12602
    }
12603
12604
    /**
12605
     * Converts `value` to a string. An empty string is returned for `null`
12606
     * and `undefined` values. The sign of `-0` is preserved.
12607
     *
12608
     * @static
12609
     * @memberOf _
12610
     * @since 4.0.0
12611
     * @category Lang
12612
     * @param {*} value The value to convert.
12613
     * @returns {string} Returns the converted string.
12614
     * @example
12615
     *
12616
     * _.toString(null);
12617
     * // => ''
12618
     *
12619
     * _.toString(-0);
12620
     * // => '-0'
12621
     *
12622
     * _.toString([1, 2, 3]);
12623
     * // => '1,2,3'
12624
     */
12625
    function toString(value) {
12626
      return value == null ? '' : baseToString(value);
12627
    }
12628
12629
    /*------------------------------------------------------------------------*/
12630
12631
    /**
12632
     * Assigns own enumerable string keyed properties of source objects to the
12633
     * destination object. Source objects are applied from left to right.
12634
     * Subsequent sources overwrite property assignments of previous sources.
12635
     *
12636
     * **Note:** This method mutates `object` and is loosely based on
12637
     * [`Object.assign`](https://mdn.io/Object/assign).
12638
     *
12639
     * @static
12640
     * @memberOf _
12641
     * @since 0.10.0
12642
     * @category Object
12643
     * @param {Object} object The destination object.
12644
     * @param {...Object} [sources] The source objects.
12645
     * @returns {Object} Returns `object`.
12646
     * @see _.assignIn
12647
     * @example
12648
     *
12649
     * function Foo() {
12650
     *   this.a = 1;
12651
     * }
12652
     *
12653
     * function Bar() {
12654
     *   this.c = 3;
12655
     * }
12656
     *
12657
     * Foo.prototype.b = 2;
12658
     * Bar.prototype.d = 4;
12659
     *
12660
     * _.assign({ 'a': 0 }, new Foo, new Bar);
12661
     * // => { 'a': 1, 'c': 3 }
12662
     */
12663
    var assign = createAssigner(function(object, source) {
12664
      if (isPrototype(source) || isArrayLike(source)) {
12665
        copyObject(source, keys(source), object);
12666
        return;
12667
      }
12668
      for (var key in source) {
12669
        if (hasOwnProperty.call(source, key)) {
12670
          assignValue(object, key, source[key]);
12671
        }
12672
      }
12673
    });
12674
12675
    /**
12676
     * This method is like `_.assign` except that it iterates over own and
12677
     * inherited source properties.
12678
     *
12679
     * **Note:** This method mutates `object`.
12680
     *
12681
     * @static
12682
     * @memberOf _
12683
     * @since 4.0.0
12684
     * @alias extend
12685
     * @category Object
12686
     * @param {Object} object The destination object.
12687
     * @param {...Object} [sources] The source objects.
12688
     * @returns {Object} Returns `object`.
12689
     * @see _.assign
12690
     * @example
12691
     *
12692
     * function Foo() {
12693
     *   this.a = 1;
12694
     * }
12695
     *
12696
     * function Bar() {
12697
     *   this.c = 3;
12698
     * }
12699
     *
12700
     * Foo.prototype.b = 2;
12701
     * Bar.prototype.d = 4;
12702
     *
12703
     * _.assignIn({ 'a': 0 }, new Foo, new Bar);
12704
     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
12705
     */
12706
    var assignIn = createAssigner(function(object, source) {
12707
      copyObject(source, keysIn(source), object);
12708
    });
12709
12710
    /**
12711
     * This method is like `_.assignIn` except that it accepts `customizer`
12712
     * which is invoked to produce the assigned values. If `customizer` returns
12713
     * `undefined`, assignment is handled by the method instead. The `customizer`
12714
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12715
     *
12716
     * **Note:** This method mutates `object`.
12717
     *
12718
     * @static
12719
     * @memberOf _
12720
     * @since 4.0.0
12721
     * @alias extendWith
12722
     * @category Object
12723
     * @param {Object} object The destination object.
12724
     * @param {...Object} sources The source objects.
12725
     * @param {Function} [customizer] The function to customize assigned values.
12726
     * @returns {Object} Returns `object`.
12727
     * @see _.assignWith
12728
     * @example
12729
     *
12730
     * function customizer(objValue, srcValue) {
12731
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12732
     * }
12733
     *
12734
     * var defaults = _.partialRight(_.assignInWith, customizer);
12735
     *
12736
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12737
     * // => { 'a': 1, 'b': 2 }
12738
     */
12739
    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
12740
      copyObject(source, keysIn(source), object, customizer);
12741
    });
12742
12743
    /**
12744
     * This method is like `_.assign` except that it accepts `customizer`
12745
     * which is invoked to produce the assigned values. If `customizer` returns
12746
     * `undefined`, assignment is handled by the method instead. The `customizer`
12747
     * is invoked with five arguments: (objValue, srcValue, key, object, source).
12748
     *
12749
     * **Note:** This method mutates `object`.
12750
     *
12751
     * @static
12752
     * @memberOf _
12753
     * @since 4.0.0
12754
     * @category Object
12755
     * @param {Object} object The destination object.
12756
     * @param {...Object} sources The source objects.
12757
     * @param {Function} [customizer] The function to customize assigned values.
12758
     * @returns {Object} Returns `object`.
12759
     * @see _.assignInWith
12760
     * @example
12761
     *
12762
     * function customizer(objValue, srcValue) {
12763
     *   return _.isUndefined(objValue) ? srcValue : objValue;
12764
     * }
12765
     *
12766
     * var defaults = _.partialRight(_.assignWith, customizer);
12767
     *
12768
     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12769
     * // => { 'a': 1, 'b': 2 }
12770
     */
12771
    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
12772
      copyObject(source, keys(source), object, customizer);
12773
    });
12774
12775
    /**
12776
     * Creates an array of values corresponding to `paths` of `object`.
12777
     *
12778
     * @static
12779
     * @memberOf _
12780
     * @since 1.0.0
12781
     * @category Object
12782
     * @param {Object} object The object to iterate over.
12783
     * @param {...(string|string[])} [paths] The property paths to pick.
12784
     * @returns {Array} Returns the picked values.
12785
     * @example
12786
     *
12787
     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };
12788
     *
12789
     * _.at(object, ['a[0].b.c', 'a[1]']);
12790
     * // => [3, 4]
12791
     */
12792
    var at = flatRest(baseAt);
12793
12794
    /**
12795
     * Creates an object that inherits from the `prototype` object. If a
12796
     * `properties` object is given, its own enumerable string keyed properties
12797
     * are assigned to the created object.
12798
     *
12799
     * @static
12800
     * @memberOf _
12801
     * @since 2.3.0
12802
     * @category Object
12803
     * @param {Object} prototype The object to inherit from.
12804
     * @param {Object} [properties] The properties to assign to the object.
12805
     * @returns {Object} Returns the new object.
12806
     * @example
12807
     *
12808
     * function Shape() {
12809
     *   this.x = 0;
12810
     *   this.y = 0;
12811
     * }
12812
     *
12813
     * function Circle() {
12814
     *   Shape.call(this);
12815
     * }
12816
     *
12817
     * Circle.prototype = _.create(Shape.prototype, {
12818
     *   'constructor': Circle
12819
     * });
12820
     *
12821
     * var circle = new Circle;
12822
     * circle instanceof Circle;
12823
     * // => true
12824
     *
12825
     * circle instanceof Shape;
12826
     * // => true
12827
     */
12828
    function create(prototype, properties) {
12829
      var result = baseCreate(prototype);
12830
      return properties == null ? result : baseAssign(result, properties);
12831
    }
12832
12833
    /**
12834
     * Assigns own and inherited enumerable string keyed properties of source
12835
     * objects to the destination object for all destination properties that
12836
     * resolve to `undefined`. Source objects are applied from left to right.
12837
     * Once a property is set, additional values of the same property are ignored.
12838
     *
12839
     * **Note:** This method mutates `object`.
12840
     *
12841
     * @static
12842
     * @since 0.1.0
12843
     * @memberOf _
12844
     * @category Object
12845
     * @param {Object} object The destination object.
12846
     * @param {...Object} [sources] The source objects.
12847
     * @returns {Object} Returns `object`.
12848
     * @see _.defaultsDeep
12849
     * @example
12850
     *
12851
     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
12852
     * // => { 'a': 1, 'b': 2 }
12853
     */
12854
    var defaults = baseRest(function(object, sources) {
12855
      object = Object(object);
12856
12857
      var index = -1;
12858
      var length = sources.length;
12859
      var guard = length > 2 ? sources[2] : undefined;
12860
12861
      if (guard && isIterateeCall(sources[0], sources[1], guard)) {
12862
        length = 1;
12863
      }
12864
12865
      while (++index < length) {
12866
        var source = sources[index];
12867
        var props = keysIn(source);
12868
        var propsIndex = -1;
12869
        var propsLength = props.length;
12870
12871
        while (++propsIndex < propsLength) {
12872
          var key = props[propsIndex];
12873
          var value = object[key];
12874
12875
          if (value === undefined ||
12876
              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {
12877
            object[key] = source[key];
12878
          }
12879
        }
12880
      }
12881
12882
      return object;
12883
    });
12884
12885
    /**
12886
     * This method is like `_.defaults` except that it recursively assigns
12887
     * default properties.
12888
     *
12889
     * **Note:** This method mutates `object`.
12890
     *
12891
     * @static
12892
     * @memberOf _
12893
     * @since 3.10.0
12894
     * @category Object
12895
     * @param {Object} object The destination object.
12896
     * @param {...Object} [sources] The source objects.
12897
     * @returns {Object} Returns `object`.
12898
     * @see _.defaults
12899
     * @example
12900
     *
12901
     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });
12902
     * // => { 'a': { 'b': 2, 'c': 3 } }
12903
     */
12904
    var defaultsDeep = baseRest(function(args) {
12905
      args.push(undefined, customDefaultsMerge);
12906
      return apply(mergeWith, undefined, args);
12907
    });
12908
12909
    /**
12910
     * This method is like `_.find` except that it returns the key of the first
12911
     * element `predicate` returns truthy for instead of the element itself.
12912
     *
12913
     * @static
12914
     * @memberOf _
12915
     * @since 1.1.0
12916
     * @category Object
12917
     * @param {Object} object The object to inspect.
12918
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12919
     * @returns {string|undefined} Returns the key of the matched element,
12920
     *  else `undefined`.
12921
     * @example
12922
     *
12923
     * var users = {
12924
     *   'barney':  { 'age': 36, 'active': true },
12925
     *   'fred':    { 'age': 40, 'active': false },
12926
     *   'pebbles': { 'age': 1,  'active': true }
12927
     * };
12928
     *
12929
     * _.findKey(users, function(o) { return o.age < 40; });
12930
     * // => 'barney' (iteration order is not guaranteed)
12931
     *
12932
     * // The `_.matches` iteratee shorthand.
12933
     * _.findKey(users, { 'age': 1, 'active': true });
12934
     * // => 'pebbles'
12935
     *
12936
     * // The `_.matchesProperty` iteratee shorthand.
12937
     * _.findKey(users, ['active', false]);
12938
     * // => 'fred'
12939
     *
12940
     * // The `_.property` iteratee shorthand.
12941
     * _.findKey(users, 'active');
12942
     * // => 'barney'
12943
     */
12944
    function findKey(object, predicate) {
12945
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
12946
    }
12947
12948
    /**
12949
     * This method is like `_.findKey` except that it iterates over elements of
12950
     * a collection in the opposite order.
12951
     *
12952
     * @static
12953
     * @memberOf _
12954
     * @since 2.0.0
12955
     * @category Object
12956
     * @param {Object} object The object to inspect.
12957
     * @param {Function} [predicate=_.identity] The function invoked per iteration.
12958
     * @returns {string|undefined} Returns the key of the matched element,
12959
     *  else `undefined`.
12960
     * @example
12961
     *
12962
     * var users = {
12963
     *   'barney':  { 'age': 36, 'active': true },
12964
     *   'fred':    { 'age': 40, 'active': false },
12965
     *   'pebbles': { 'age': 1,  'active': true }
12966
     * };
12967
     *
12968
     * _.findLastKey(users, function(o) { return o.age < 40; });
12969
     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
12970
     *
12971
     * // The `_.matches` iteratee shorthand.
12972
     * _.findLastKey(users, { 'age': 36, 'active': true });
12973
     * // => 'barney'
12974
     *
12975
     * // The `_.matchesProperty` iteratee shorthand.
12976
     * _.findLastKey(users, ['active', false]);
12977
     * // => 'fred'
12978
     *
12979
     * // The `_.property` iteratee shorthand.
12980
     * _.findLastKey(users, 'active');
12981
     * // => 'pebbles'
12982
     */
12983
    function findLastKey(object, predicate) {
12984
      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
12985
    }
12986
12987
    /**
12988
     * Iterates over own and inherited enumerable string keyed properties of an
12989
     * object and invokes `iteratee` for each property. The iteratee is invoked
12990
     * with three arguments: (value, key, object). Iteratee functions may exit
12991
     * iteration early by explicitly returning `false`.
12992
     *
12993
     * @static
12994
     * @memberOf _
12995
     * @since 0.3.0
12996
     * @category Object
12997
     * @param {Object} object The object to iterate over.
12998
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
12999
     * @returns {Object} Returns `object`.
13000
     * @see _.forInRight
13001
     * @example
13002
     *
13003
     * function Foo() {
13004
     *   this.a = 1;
13005
     *   this.b = 2;
13006
     * }
13007
     *
13008
     * Foo.prototype.c = 3;
13009
     *
13010
     * _.forIn(new Foo, function(value, key) {
13011
     *   console.log(key);
13012
     * });
13013
     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).
13014
     */
13015
    function forIn(object, iteratee) {
13016
      return object == null
13017
        ? object
13018
        : baseFor(object, getIteratee(iteratee, 3), keysIn);
13019
    }
13020
13021
    /**
13022
     * This method is like `_.forIn` except that it iterates over properties of
13023
     * `object` in the opposite order.
13024
     *
13025
     * @static
13026
     * @memberOf _
13027
     * @since 2.0.0
13028
     * @category Object
13029
     * @param {Object} object The object to iterate over.
13030
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13031
     * @returns {Object} Returns `object`.
13032
     * @see _.forIn
13033
     * @example
13034
     *
13035
     * function Foo() {
13036
     *   this.a = 1;
13037
     *   this.b = 2;
13038
     * }
13039
     *
13040
     * Foo.prototype.c = 3;
13041
     *
13042
     * _.forInRight(new Foo, function(value, key) {
13043
     *   console.log(key);
13044
     * });
13045
     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.
13046
     */
13047
    function forInRight(object, iteratee) {
13048
      return object == null
13049
        ? object
13050
        : baseForRight(object, getIteratee(iteratee, 3), keysIn);
13051
    }
13052
13053
    /**
13054
     * Iterates over own enumerable string keyed properties of an object and
13055
     * invokes `iteratee` for each property. The iteratee is invoked with three
13056
     * arguments: (value, key, object). Iteratee functions may exit iteration
13057
     * early by explicitly returning `false`.
13058
     *
13059
     * @static
13060
     * @memberOf _
13061
     * @since 0.3.0
13062
     * @category Object
13063
     * @param {Object} object The object to iterate over.
13064
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13065
     * @returns {Object} Returns `object`.
13066
     * @see _.forOwnRight
13067
     * @example
13068
     *
13069
     * function Foo() {
13070
     *   this.a = 1;
13071
     *   this.b = 2;
13072
     * }
13073
     *
13074
     * Foo.prototype.c = 3;
13075
     *
13076
     * _.forOwn(new Foo, function(value, key) {
13077
     *   console.log(key);
13078
     * });
13079
     * // => Logs 'a' then 'b' (iteration order is not guaranteed).
13080
     */
13081
    function forOwn(object, iteratee) {
13082
      return object && baseForOwn(object, getIteratee(iteratee, 3));
13083
    }
13084
13085
    /**
13086
     * This method is like `_.forOwn` except that it iterates over properties of
13087
     * `object` in the opposite order.
13088
     *
13089
     * @static
13090
     * @memberOf _
13091
     * @since 2.0.0
13092
     * @category Object
13093
     * @param {Object} object The object to iterate over.
13094
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13095
     * @returns {Object} Returns `object`.
13096
     * @see _.forOwn
13097
     * @example
13098
     *
13099
     * function Foo() {
13100
     *   this.a = 1;
13101
     *   this.b = 2;
13102
     * }
13103
     *
13104
     * Foo.prototype.c = 3;
13105
     *
13106
     * _.forOwnRight(new Foo, function(value, key) {
13107
     *   console.log(key);
13108
     * });
13109
     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.
13110
     */
13111
    function forOwnRight(object, iteratee) {
13112
      return object && baseForOwnRight(object, getIteratee(iteratee, 3));
13113
    }
13114
13115
    /**
13116
     * Creates an array of function property names from own enumerable properties
13117
     * of `object`.
13118
     *
13119
     * @static
13120
     * @since 0.1.0
13121
     * @memberOf _
13122
     * @category Object
13123
     * @param {Object} object The object to inspect.
13124
     * @returns {Array} Returns the function names.
13125
     * @see _.functionsIn
13126
     * @example
13127
     *
13128
     * function Foo() {
13129
     *   this.a = _.constant('a');
13130
     *   this.b = _.constant('b');
13131
     * }
13132
     *
13133
     * Foo.prototype.c = _.constant('c');
13134
     *
13135
     * _.functions(new Foo);
13136
     * // => ['a', 'b']
13137
     */
13138
    function functions(object) {
13139
      return object == null ? [] : baseFunctions(object, keys(object));
13140
    }
13141
13142
    /**
13143
     * Creates an array of function property names from own and inherited
13144
     * enumerable properties of `object`.
13145
     *
13146
     * @static
13147
     * @memberOf _
13148
     * @since 4.0.0
13149
     * @category Object
13150
     * @param {Object} object The object to inspect.
13151
     * @returns {Array} Returns the function names.
13152
     * @see _.functions
13153
     * @example
13154
     *
13155
     * function Foo() {
13156
     *   this.a = _.constant('a');
13157
     *   this.b = _.constant('b');
13158
     * }
13159
     *
13160
     * Foo.prototype.c = _.constant('c');
13161
     *
13162
     * _.functionsIn(new Foo);
13163
     * // => ['a', 'b', 'c']
13164
     */
13165
    function functionsIn(object) {
13166
      return object == null ? [] : baseFunctions(object, keysIn(object));
13167
    }
13168
13169
    /**
13170
     * Gets the value at `path` of `object`. If the resolved value is
13171
     * `undefined`, the `defaultValue` is returned in its place.
13172
     *
13173
     * @static
13174
     * @memberOf _
13175
     * @since 3.7.0
13176
     * @category Object
13177
     * @param {Object} object The object to query.
13178
     * @param {Array|string} path The path of the property to get.
13179
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13180
     * @returns {*} Returns the resolved value.
13181
     * @example
13182
     *
13183
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13184
     *
13185
     * _.get(object, 'a[0].b.c');
13186
     * // => 3
13187
     *
13188
     * _.get(object, ['a', '0', 'b', 'c']);
13189
     * // => 3
13190
     *
13191
     * _.get(object, 'a.b.c', 'default');
13192
     * // => 'default'
13193
     */
13194
    function get(object, path, defaultValue) {
13195
      var result = object == null ? undefined : baseGet(object, path);
13196
      return result === undefined ? defaultValue : result;
13197
    }
13198
13199
    /**
13200
     * Checks if `path` is a direct property of `object`.
13201
     *
13202
     * @static
13203
     * @since 0.1.0
13204
     * @memberOf _
13205
     * @category Object
13206
     * @param {Object} object The object to query.
13207
     * @param {Array|string} path The path to check.
13208
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13209
     * @example
13210
     *
13211
     * var object = { 'a': { 'b': 2 } };
13212
     * var other = _.create({ 'a': _.create({ 'b': 2 }) });
13213
     *
13214
     * _.has(object, 'a');
13215
     * // => true
13216
     *
13217
     * _.has(object, 'a.b');
13218
     * // => true
13219
     *
13220
     * _.has(object, ['a', 'b']);
13221
     * // => true
13222
     *
13223
     * _.has(other, 'a');
13224
     * // => false
13225
     */
13226
    function has(object, path) {
13227
      return object != null && hasPath(object, path, baseHas);
13228
    }
13229
13230
    /**
13231
     * Checks if `path` is a direct or inherited property of `object`.
13232
     *
13233
     * @static
13234
     * @memberOf _
13235
     * @since 4.0.0
13236
     * @category Object
13237
     * @param {Object} object The object to query.
13238
     * @param {Array|string} path The path to check.
13239
     * @returns {boolean} Returns `true` if `path` exists, else `false`.
13240
     * @example
13241
     *
13242
     * var object = _.create({ 'a': _.create({ 'b': 2 }) });
13243
     *
13244
     * _.hasIn(object, 'a');
13245
     * // => true
13246
     *
13247
     * _.hasIn(object, 'a.b');
13248
     * // => true
13249
     *
13250
     * _.hasIn(object, ['a', 'b']);
13251
     * // => true
13252
     *
13253
     * _.hasIn(object, 'b');
13254
     * // => false
13255
     */
13256
    function hasIn(object, path) {
13257
      return object != null && hasPath(object, path, baseHasIn);
13258
    }
13259
13260
    /**
13261
     * Creates an object composed of the inverted keys and values of `object`.
13262
     * If `object` contains duplicate values, subsequent values overwrite
13263
     * property assignments of previous values.
13264
     *
13265
     * @static
13266
     * @memberOf _
13267
     * @since 0.7.0
13268
     * @category Object
13269
     * @param {Object} object The object to invert.
13270
     * @returns {Object} Returns the new inverted object.
13271
     * @example
13272
     *
13273
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13274
     *
13275
     * _.invert(object);
13276
     * // => { '1': 'c', '2': 'b' }
13277
     */
13278
    var invert = createInverter(function(result, value, key) {
13279
      if (value != null &&
13280
          typeof value.toString != 'function') {
13281
        value = nativeObjectToString.call(value);
13282
      }
13283
13284
      result[value] = key;
13285
    }, constant(identity));
13286
13287
    /**
13288
     * This method is like `_.invert` except that the inverted object is generated
13289
     * from the results of running each element of `object` thru `iteratee`. The
13290
     * corresponding inverted value of each inverted key is an array of keys
13291
     * responsible for generating the inverted value. The iteratee is invoked
13292
     * with one argument: (value).
13293
     *
13294
     * @static
13295
     * @memberOf _
13296
     * @since 4.1.0
13297
     * @category Object
13298
     * @param {Object} object The object to invert.
13299
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
13300
     * @returns {Object} Returns the new inverted object.
13301
     * @example
13302
     *
13303
     * var object = { 'a': 1, 'b': 2, 'c': 1 };
13304
     *
13305
     * _.invertBy(object);
13306
     * // => { '1': ['a', 'c'], '2': ['b'] }
13307
     *
13308
     * _.invertBy(object, function(value) {
13309
     *   return 'group' + value;
13310
     * });
13311
     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
13312
     */
13313
    var invertBy = createInverter(function(result, value, key) {
13314
      if (value != null &&
13315
          typeof value.toString != 'function') {
13316
        value = nativeObjectToString.call(value);
13317
      }
13318
13319
      if (hasOwnProperty.call(result, value)) {
13320
        result[value].push(key);
13321
      } else {
13322
        result[value] = [key];
13323
      }
13324
    }, getIteratee);
13325
13326
    /**
13327
     * Invokes the method at `path` of `object`.
13328
     *
13329
     * @static
13330
     * @memberOf _
13331
     * @since 4.0.0
13332
     * @category Object
13333
     * @param {Object} object The object to query.
13334
     * @param {Array|string} path The path of the method to invoke.
13335
     * @param {...*} [args] The arguments to invoke the method with.
13336
     * @returns {*} Returns the result of the invoked method.
13337
     * @example
13338
     *
13339
     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };
13340
     *
13341
     * _.invoke(object, 'a[0].b.c.slice', 1, 3);
13342
     * // => [2, 3]
13343
     */
13344
    var invoke = baseRest(baseInvoke);
13345
13346
    /**
13347
     * Creates an array of the own enumerable property names of `object`.
13348
     *
13349
     * **Note:** Non-object values are coerced to objects. See the
13350
     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
13351
     * for more details.
13352
     *
13353
     * @static
13354
     * @since 0.1.0
13355
     * @memberOf _
13356
     * @category Object
13357
     * @param {Object} object The object to query.
13358
     * @returns {Array} Returns the array of property names.
13359
     * @example
13360
     *
13361
     * function Foo() {
13362
     *   this.a = 1;
13363
     *   this.b = 2;
13364
     * }
13365
     *
13366
     * Foo.prototype.c = 3;
13367
     *
13368
     * _.keys(new Foo);
13369
     * // => ['a', 'b'] (iteration order is not guaranteed)
13370
     *
13371
     * _.keys('hi');
13372
     * // => ['0', '1']
13373
     */
13374
    function keys(object) {
13375
      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
13376
    }
13377
13378
    /**
13379
     * Creates an array of the own and inherited enumerable property names of `object`.
13380
     *
13381
     * **Note:** Non-object values are coerced to objects.
13382
     *
13383
     * @static
13384
     * @memberOf _
13385
     * @since 3.0.0
13386
     * @category Object
13387
     * @param {Object} object The object to query.
13388
     * @returns {Array} Returns the array of property names.
13389
     * @example
13390
     *
13391
     * function Foo() {
13392
     *   this.a = 1;
13393
     *   this.b = 2;
13394
     * }
13395
     *
13396
     * Foo.prototype.c = 3;
13397
     *
13398
     * _.keysIn(new Foo);
13399
     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
13400
     */
13401
    function keysIn(object) {
13402
      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
13403
    }
13404
13405
    /**
13406
     * The opposite of `_.mapValues`; this method creates an object with the
13407
     * same values as `object` and keys generated by running each own enumerable
13408
     * string keyed property of `object` thru `iteratee`. The iteratee is invoked
13409
     * with three arguments: (value, key, object).
13410
     *
13411
     * @static
13412
     * @memberOf _
13413
     * @since 3.8.0
13414
     * @category Object
13415
     * @param {Object} object The object to iterate over.
13416
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13417
     * @returns {Object} Returns the new mapped object.
13418
     * @see _.mapValues
13419
     * @example
13420
     *
13421
     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {
13422
     *   return key + value;
13423
     * });
13424
     * // => { 'a1': 1, 'b2': 2 }
13425
     */
13426
    function mapKeys(object, iteratee) {
13427
      var result = {};
13428
      iteratee = getIteratee(iteratee, 3);
13429
13430
      baseForOwn(object, function(value, key, object) {
13431
        baseAssignValue(result, iteratee(value, key, object), value);
13432
      });
13433
      return result;
13434
    }
13435
13436
    /**
13437
     * Creates an object with the same keys as `object` and values generated
13438
     * by running each own enumerable string keyed property of `object` thru
13439
     * `iteratee`. The iteratee is invoked with three arguments:
13440
     * (value, key, object).
13441
     *
13442
     * @static
13443
     * @memberOf _
13444
     * @since 2.4.0
13445
     * @category Object
13446
     * @param {Object} object The object to iterate over.
13447
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13448
     * @returns {Object} Returns the new mapped object.
13449
     * @see _.mapKeys
13450
     * @example
13451
     *
13452
     * var users = {
13453
     *   'fred':    { 'user': 'fred',    'age': 40 },
13454
     *   'pebbles': { 'user': 'pebbles', 'age': 1 }
13455
     * };
13456
     *
13457
     * _.mapValues(users, function(o) { return o.age; });
13458
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13459
     *
13460
     * // The `_.property` iteratee shorthand.
13461
     * _.mapValues(users, 'age');
13462
     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
13463
     */
13464
    function mapValues(object, iteratee) {
13465
      var result = {};
13466
      iteratee = getIteratee(iteratee, 3);
13467
13468
      baseForOwn(object, function(value, key, object) {
13469
        baseAssignValue(result, key, iteratee(value, key, object));
13470
      });
13471
      return result;
13472
    }
13473
13474
    /**
13475
     * This method is like `_.assign` except that it recursively merges own and
13476
     * inherited enumerable string keyed properties of source objects into the
13477
     * destination object. Source properties that resolve to `undefined` are
13478
     * skipped if a destination value exists. Array and plain object properties
13479
     * are merged recursively. Other objects and value types are overridden by
13480
     * assignment. Source objects are applied from left to right. Subsequent
13481
     * sources overwrite property assignments of previous sources.
13482
     *
13483
     * **Note:** This method mutates `object`.
13484
     *
13485
     * @static
13486
     * @memberOf _
13487
     * @since 0.5.0
13488
     * @category Object
13489
     * @param {Object} object The destination object.
13490
     * @param {...Object} [sources] The source objects.
13491
     * @returns {Object} Returns `object`.
13492
     * @example
13493
     *
13494
     * var object = {
13495
     *   'a': [{ 'b': 2 }, { 'd': 4 }]
13496
     * };
13497
     *
13498
     * var other = {
13499
     *   'a': [{ 'c': 3 }, { 'e': 5 }]
13500
     * };
13501
     *
13502
     * _.merge(object, other);
13503
     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }
13504
     */
13505
    var merge = createAssigner(function(object, source, srcIndex) {
13506
      baseMerge(object, source, srcIndex);
13507
    });
13508
13509
    /**
13510
     * This method is like `_.merge` except that it accepts `customizer` which
13511
     * is invoked to produce the merged values of the destination and source
13512
     * properties. If `customizer` returns `undefined`, merging is handled by the
13513
     * method instead. The `customizer` is invoked with six arguments:
13514
     * (objValue, srcValue, key, object, source, stack).
13515
     *
13516
     * **Note:** This method mutates `object`.
13517
     *
13518
     * @static
13519
     * @memberOf _
13520
     * @since 4.0.0
13521
     * @category Object
13522
     * @param {Object} object The destination object.
13523
     * @param {...Object} sources The source objects.
13524
     * @param {Function} customizer The function to customize assigned values.
13525
     * @returns {Object} Returns `object`.
13526
     * @example
13527
     *
13528
     * function customizer(objValue, srcValue) {
13529
     *   if (_.isArray(objValue)) {
13530
     *     return objValue.concat(srcValue);
13531
     *   }
13532
     * }
13533
     *
13534
     * var object = { 'a': [1], 'b': [2] };
13535
     * var other = { 'a': [3], 'b': [4] };
13536
     *
13537
     * _.mergeWith(object, other, customizer);
13538
     * // => { 'a': [1, 3], 'b': [2, 4] }
13539
     */
13540
    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
13541
      baseMerge(object, source, srcIndex, customizer);
13542
    });
13543
13544
    /**
13545
     * The opposite of `_.pick`; this method creates an object composed of the
13546
     * own and inherited enumerable property paths of `object` that are not omitted.
13547
     *
13548
     * **Note:** This method is considerably slower than `_.pick`.
13549
     *
13550
     * @static
13551
     * @since 0.1.0
13552
     * @memberOf _
13553
     * @category Object
13554
     * @param {Object} object The source object.
13555
     * @param {...(string|string[])} [paths] The property paths to omit.
13556
     * @returns {Object} Returns the new object.
13557
     * @example
13558
     *
13559
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13560
     *
13561
     * _.omit(object, ['a', 'c']);
13562
     * // => { 'b': '2' }
13563
     */
13564
    var omit = flatRest(function(object, paths) {
13565
      var result = {};
13566
      if (object == null) {
13567
        return result;
13568
      }
13569
      var isDeep = false;
13570
      paths = arrayMap(paths, function(path) {
13571
        path = castPath(path, object);
13572
        isDeep || (isDeep = path.length > 1);
13573
        return path;
13574
      });
13575
      copyObject(object, getAllKeysIn(object), result);
13576
      if (isDeep) {
13577
        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
13578
      }
13579
      var length = paths.length;
13580
      while (length--) {
13581
        baseUnset(result, paths[length]);
13582
      }
13583
      return result;
13584
    });
13585
13586
    /**
13587
     * The opposite of `_.pickBy`; this method creates an object composed of
13588
     * the own and inherited enumerable string keyed properties of `object` that
13589
     * `predicate` doesn't return truthy for. The predicate is invoked with two
13590
     * arguments: (value, key).
13591
     *
13592
     * @static
13593
     * @memberOf _
13594
     * @since 4.0.0
13595
     * @category Object
13596
     * @param {Object} object The source object.
13597
     * @param {Function} [predicate=_.identity] The function invoked per property.
13598
     * @returns {Object} Returns the new object.
13599
     * @example
13600
     *
13601
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13602
     *
13603
     * _.omitBy(object, _.isNumber);
13604
     * // => { 'b': '2' }
13605
     */
13606
    function omitBy(object, predicate) {
13607
      return pickBy(object, negate(getIteratee(predicate)));
13608
    }
13609
13610
    /**
13611
     * Creates an object composed of the picked `object` properties.
13612
     *
13613
     * @static
13614
     * @since 0.1.0
13615
     * @memberOf _
13616
     * @category Object
13617
     * @param {Object} object The source object.
13618
     * @param {...(string|string[])} [paths] The property paths to pick.
13619
     * @returns {Object} Returns the new object.
13620
     * @example
13621
     *
13622
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13623
     *
13624
     * _.pick(object, ['a', 'c']);
13625
     * // => { 'a': 1, 'c': 3 }
13626
     */
13627
    var pick = flatRest(function(object, paths) {
13628
      return object == null ? {} : basePick(object, paths);
13629
    });
13630
13631
    /**
13632
     * Creates an object composed of the `object` properties `predicate` returns
13633
     * truthy for. The predicate is invoked with two arguments: (value, key).
13634
     *
13635
     * @static
13636
     * @memberOf _
13637
     * @since 4.0.0
13638
     * @category Object
13639
     * @param {Object} object The source object.
13640
     * @param {Function} [predicate=_.identity] The function invoked per property.
13641
     * @returns {Object} Returns the new object.
13642
     * @example
13643
     *
13644
     * var object = { 'a': 1, 'b': '2', 'c': 3 };
13645
     *
13646
     * _.pickBy(object, _.isNumber);
13647
     * // => { 'a': 1, 'c': 3 }
13648
     */
13649
    function pickBy(object, predicate) {
13650
      if (object == null) {
13651
        return {};
13652
      }
13653
      var props = arrayMap(getAllKeysIn(object), function(prop) {
13654
        return [prop];
13655
      });
13656
      predicate = getIteratee(predicate);
13657
      return basePickBy(object, props, function(value, path) {
13658
        return predicate(value, path[0]);
13659
      });
13660
    }
13661
13662
    /**
13663
     * This method is like `_.get` except that if the resolved value is a
13664
     * function it's invoked with the `this` binding of its parent object and
13665
     * its result is returned.
13666
     *
13667
     * @static
13668
     * @since 0.1.0
13669
     * @memberOf _
13670
     * @category Object
13671
     * @param {Object} object The object to query.
13672
     * @param {Array|string} path The path of the property to resolve.
13673
     * @param {*} [defaultValue] The value returned for `undefined` resolved values.
13674
     * @returns {*} Returns the resolved value.
13675
     * @example
13676
     *
13677
     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };
13678
     *
13679
     * _.result(object, 'a[0].b.c1');
13680
     * // => 3
13681
     *
13682
     * _.result(object, 'a[0].b.c2');
13683
     * // => 4
13684
     *
13685
     * _.result(object, 'a[0].b.c3', 'default');
13686
     * // => 'default'
13687
     *
13688
     * _.result(object, 'a[0].b.c3', _.constant('default'));
13689
     * // => 'default'
13690
     */
13691
    function result(object, path, defaultValue) {
13692
      path = castPath(path, object);
13693
13694
      var index = -1,
13695
          length = path.length;
13696
13697
      // Ensure the loop is entered when path is empty.
13698
      if (!length) {
13699
        length = 1;
13700
        object = undefined;
13701
      }
13702
      while (++index < length) {
13703
        var value = object == null ? undefined : object[toKey(path[index])];
13704
        if (value === undefined) {
13705
          index = length;
13706
          value = defaultValue;
13707
        }
13708
        object = isFunction(value) ? value.call(object) : value;
13709
      }
13710
      return object;
13711
    }
13712
13713
    /**
13714
     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,
13715
     * it's created. Arrays are created for missing index properties while objects
13716
     * are created for all other missing properties. Use `_.setWith` to customize
13717
     * `path` creation.
13718
     *
13719
     * **Note:** This method mutates `object`.
13720
     *
13721
     * @static
13722
     * @memberOf _
13723
     * @since 3.7.0
13724
     * @category Object
13725
     * @param {Object} object The object to modify.
13726
     * @param {Array|string} path The path of the property to set.
13727
     * @param {*} value The value to set.
13728
     * @returns {Object} Returns `object`.
13729
     * @example
13730
     *
13731
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13732
     *
13733
     * _.set(object, 'a[0].b.c', 4);
13734
     * console.log(object.a[0].b.c);
13735
     * // => 4
13736
     *
13737
     * _.set(object, ['x', '0', 'y', 'z'], 5);
13738
     * console.log(object.x[0].y.z);
13739
     * // => 5
13740
     */
13741
    function set(object, path, value) {
13742
      return object == null ? object : baseSet(object, path, value);
13743
    }
13744
13745
    /**
13746
     * This method is like `_.set` except that it accepts `customizer` which is
13747
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13748
     * path creation is handled by the method instead. The `customizer` is invoked
13749
     * with three arguments: (nsValue, key, nsObject).
13750
     *
13751
     * **Note:** This method mutates `object`.
13752
     *
13753
     * @static
13754
     * @memberOf _
13755
     * @since 4.0.0
13756
     * @category Object
13757
     * @param {Object} object The object to modify.
13758
     * @param {Array|string} path The path of the property to set.
13759
     * @param {*} value The value to set.
13760
     * @param {Function} [customizer] The function to customize assigned values.
13761
     * @returns {Object} Returns `object`.
13762
     * @example
13763
     *
13764
     * var object = {};
13765
     *
13766
     * _.setWith(object, '[0][1]', 'a', Object);
13767
     * // => { '0': { '1': 'a' } }
13768
     */
13769
    function setWith(object, path, value, customizer) {
13770
      customizer = typeof customizer == 'function' ? customizer : undefined;
13771
      return object == null ? object : baseSet(object, path, value, customizer);
13772
    }
13773
13774
    /**
13775
     * Creates an array of own enumerable string keyed-value pairs for `object`
13776
     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
13777
     * entries are returned.
13778
     *
13779
     * @static
13780
     * @memberOf _
13781
     * @since 4.0.0
13782
     * @alias entries
13783
     * @category Object
13784
     * @param {Object} object The object to query.
13785
     * @returns {Array} Returns the key-value pairs.
13786
     * @example
13787
     *
13788
     * function Foo() {
13789
     *   this.a = 1;
13790
     *   this.b = 2;
13791
     * }
13792
     *
13793
     * Foo.prototype.c = 3;
13794
     *
13795
     * _.toPairs(new Foo);
13796
     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
13797
     */
13798
    var toPairs = createToPairs(keys);
13799
13800
    /**
13801
     * Creates an array of own and inherited enumerable string keyed-value pairs
13802
     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map
13803
     * or set, its entries are returned.
13804
     *
13805
     * @static
13806
     * @memberOf _
13807
     * @since 4.0.0
13808
     * @alias entriesIn
13809
     * @category Object
13810
     * @param {Object} object The object to query.
13811
     * @returns {Array} Returns the key-value pairs.
13812
     * @example
13813
     *
13814
     * function Foo() {
13815
     *   this.a = 1;
13816
     *   this.b = 2;
13817
     * }
13818
     *
13819
     * Foo.prototype.c = 3;
13820
     *
13821
     * _.toPairsIn(new Foo);
13822
     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)
13823
     */
13824
    var toPairsIn = createToPairs(keysIn);
13825
13826
    /**
13827
     * An alternative to `_.reduce`; this method transforms `object` to a new
13828
     * `accumulator` object which is the result of running each of its own
13829
     * enumerable string keyed properties thru `iteratee`, with each invocation
13830
     * potentially mutating the `accumulator` object. If `accumulator` is not
13831
     * provided, a new object with the same `[[Prototype]]` will be used. The
13832
     * iteratee is invoked with four arguments: (accumulator, value, key, object).
13833
     * Iteratee functions may exit iteration early by explicitly returning `false`.
13834
     *
13835
     * @static
13836
     * @memberOf _
13837
     * @since 1.3.0
13838
     * @category Object
13839
     * @param {Object} object The object to iterate over.
13840
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
13841
     * @param {*} [accumulator] The custom accumulator value.
13842
     * @returns {*} Returns the accumulated value.
13843
     * @example
13844
     *
13845
     * _.transform([2, 3, 4], function(result, n) {
13846
     *   result.push(n *= n);
13847
     *   return n % 2 == 0;
13848
     * }, []);
13849
     * // => [4, 9]
13850
     *
13851
     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
13852
     *   (result[value] || (result[value] = [])).push(key);
13853
     * }, {});
13854
     * // => { '1': ['a', 'c'], '2': ['b'] }
13855
     */
13856
    function transform(object, iteratee, accumulator) {
13857
      var isArr = isArray(object),
13858
          isArrLike = isArr || isBuffer(object) || isTypedArray(object);
13859
13860
      iteratee = getIteratee(iteratee, 4);
13861
      if (accumulator == null) {
13862
        var Ctor = object && object.constructor;
13863
        if (isArrLike) {
13864
          accumulator = isArr ? new Ctor : [];
13865
        }
13866
        else if (isObject(object)) {
13867
          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};
13868
        }
13869
        else {
13870
          accumulator = {};
13871
        }
13872
      }
13873
      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {
13874
        return iteratee(accumulator, value, index, object);
13875
      });
13876
      return accumulator;
13877
    }
13878
13879
    /**
13880
     * Removes the property at `path` of `object`.
13881
     *
13882
     * **Note:** This method mutates `object`.
13883
     *
13884
     * @static
13885
     * @memberOf _
13886
     * @since 4.0.0
13887
     * @category Object
13888
     * @param {Object} object The object to modify.
13889
     * @param {Array|string} path The path of the property to unset.
13890
     * @returns {boolean} Returns `true` if the property is deleted, else `false`.
13891
     * @example
13892
     *
13893
     * var object = { 'a': [{ 'b': { 'c': 7 } }] };
13894
     * _.unset(object, 'a[0].b.c');
13895
     * // => true
13896
     *
13897
     * console.log(object);
13898
     * // => { 'a': [{ 'b': {} }] };
13899
     *
13900
     * _.unset(object, ['a', '0', 'b', 'c']);
13901
     * // => true
13902
     *
13903
     * console.log(object);
13904
     * // => { 'a': [{ 'b': {} }] };
13905
     */
13906
    function unset(object, path) {
13907
      return object == null ? true : baseUnset(object, path);
13908
    }
13909
13910
    /**
13911
     * This method is like `_.set` except that accepts `updater` to produce the
13912
     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`
13913
     * is invoked with one argument: (value).
13914
     *
13915
     * **Note:** This method mutates `object`.
13916
     *
13917
     * @static
13918
     * @memberOf _
13919
     * @since 4.6.0
13920
     * @category Object
13921
     * @param {Object} object The object to modify.
13922
     * @param {Array|string} path The path of the property to set.
13923
     * @param {Function} updater The function to produce the updated value.
13924
     * @returns {Object} Returns `object`.
13925
     * @example
13926
     *
13927
     * var object = { 'a': [{ 'b': { 'c': 3 } }] };
13928
     *
13929
     * _.update(object, 'a[0].b.c', function(n) { return n * n; });
13930
     * console.log(object.a[0].b.c);
13931
     * // => 9
13932
     *
13933
     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });
13934
     * console.log(object.x[0].y.z);
13935
     * // => 0
13936
     */
13937
    function update(object, path, updater) {
13938
      return object == null ? object : baseUpdate(object, path, castFunction(updater));
13939
    }
13940
13941
    /**
13942
     * This method is like `_.update` except that it accepts `customizer` which is
13943
     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`
13944
     * path creation is handled by the method instead. The `customizer` is invoked
13945
     * with three arguments: (nsValue, key, nsObject).
13946
     *
13947
     * **Note:** This method mutates `object`.
13948
     *
13949
     * @static
13950
     * @memberOf _
13951
     * @since 4.6.0
13952
     * @category Object
13953
     * @param {Object} object The object to modify.
13954
     * @param {Array|string} path The path of the property to set.
13955
     * @param {Function} updater The function to produce the updated value.
13956
     * @param {Function} [customizer] The function to customize assigned values.
13957
     * @returns {Object} Returns `object`.
13958
     * @example
13959
     *
13960
     * var object = {};
13961
     *
13962
     * _.updateWith(object, '[0][1]', _.constant('a'), Object);
13963
     * // => { '0': { '1': 'a' } }
13964
     */
13965
    function updateWith(object, path, updater, customizer) {
13966
      customizer = typeof customizer == 'function' ? customizer : undefined;
13967
      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
13968
    }
13969
13970
    /**
13971
     * Creates an array of the own enumerable string keyed property values of `object`.
13972
     *
13973
     * **Note:** Non-object values are coerced to objects.
13974
     *
13975
     * @static
13976
     * @since 0.1.0
13977
     * @memberOf _
13978
     * @category Object
13979
     * @param {Object} object The object to query.
13980
     * @returns {Array} Returns the array of property values.
13981
     * @example
13982
     *
13983
     * function Foo() {
13984
     *   this.a = 1;
13985
     *   this.b = 2;
13986
     * }
13987
     *
13988
     * Foo.prototype.c = 3;
13989
     *
13990
     * _.values(new Foo);
13991
     * // => [1, 2] (iteration order is not guaranteed)
13992
     *
13993
     * _.values('hi');
13994
     * // => ['h', 'i']
13995
     */
13996
    function values(object) {
13997
      return object == null ? [] : baseValues(object, keys(object));
13998
    }
13999
14000
    /**
14001
     * Creates an array of the own and inherited enumerable string keyed property
14002
     * values of `object`.
14003
     *
14004
     * **Note:** Non-object values are coerced to objects.
14005
     *
14006
     * @static
14007
     * @memberOf _
14008
     * @since 3.0.0
14009
     * @category Object
14010
     * @param {Object} object The object to query.
14011
     * @returns {Array} Returns the array of property values.
14012
     * @example
14013
     *
14014
     * function Foo() {
14015
     *   this.a = 1;
14016
     *   this.b = 2;
14017
     * }
14018
     *
14019
     * Foo.prototype.c = 3;
14020
     *
14021
     * _.valuesIn(new Foo);
14022
     * // => [1, 2, 3] (iteration order is not guaranteed)
14023
     */
14024
    function valuesIn(object) {
14025
      return object == null ? [] : baseValues(object, keysIn(object));
14026
    }
14027
14028
    /*------------------------------------------------------------------------*/
14029
14030
    /**
14031
     * Clamps `number` within the inclusive `lower` and `upper` bounds.
14032
     *
14033
     * @static
14034
     * @memberOf _
14035
     * @since 4.0.0
14036
     * @category Number
14037
     * @param {number} number The number to clamp.
14038
     * @param {number} [lower] The lower bound.
14039
     * @param {number} upper The upper bound.
14040
     * @returns {number} Returns the clamped number.
14041
     * @example
14042
     *
14043
     * _.clamp(-10, -5, 5);
14044
     * // => -5
14045
     *
14046
     * _.clamp(10, -5, 5);
14047
     * // => 5
14048
     */
14049
    function clamp(number, lower, upper) {
14050
      if (upper === undefined) {
14051
        upper = lower;
14052
        lower = undefined;
14053
      }
14054
      if (upper !== undefined) {
14055
        upper = toNumber(upper);
14056
        upper = upper === upper ? upper : 0;
14057
      }
14058
      if (lower !== undefined) {
14059
        lower = toNumber(lower);
14060
        lower = lower === lower ? lower : 0;
14061
      }
14062
      return baseClamp(toNumber(number), lower, upper);
14063
    }
14064
14065
    /**
14066
     * Checks if `n` is between `start` and up to, but not including, `end`. If
14067
     * `end` is not specified, it's set to `start` with `start` then set to `0`.
14068
     * If `start` is greater than `end` the params are swapped to support
14069
     * negative ranges.
14070
     *
14071
     * @static
14072
     * @memberOf _
14073
     * @since 3.3.0
14074
     * @category Number
14075
     * @param {number} number The number to check.
14076
     * @param {number} [start=0] The start of the range.
14077
     * @param {number} end The end of the range.
14078
     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.
14079
     * @see _.range, _.rangeRight
14080
     * @example
14081
     *
14082
     * _.inRange(3, 2, 4);
14083
     * // => true
14084
     *
14085
     * _.inRange(4, 8);
14086
     * // => true
14087
     *
14088
     * _.inRange(4, 2);
14089
     * // => false
14090
     *
14091
     * _.inRange(2, 2);
14092
     * // => false
14093
     *
14094
     * _.inRange(1.2, 2);
14095
     * // => true
14096
     *
14097
     * _.inRange(5.2, 4);
14098
     * // => false
14099
     *
14100
     * _.inRange(-3, -2, -6);
14101
     * // => true
14102
     */
14103
    function inRange(number, start, end) {
14104
      start = toFinite(start);
14105
      if (end === undefined) {
14106
        end = start;
14107
        start = 0;
14108
      } else {
14109
        end = toFinite(end);
14110
      }
14111
      number = toNumber(number);
14112
      return baseInRange(number, start, end);
14113
    }
14114
14115
    /**
14116
     * Produces a random number between the inclusive `lower` and `upper` bounds.
14117
     * If only one argument is provided a number between `0` and the given number
14118
     * is returned. If `floating` is `true`, or either `lower` or `upper` are
14119
     * floats, a floating-point number is returned instead of an integer.
14120
     *
14121
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
14122
     * floating-point values which can produce unexpected results.
14123
     *
14124
     * @static
14125
     * @memberOf _
14126
     * @since 0.7.0
14127
     * @category Number
14128
     * @param {number} [lower=0] The lower bound.
14129
     * @param {number} [upper=1] The upper bound.
14130
     * @param {boolean} [floating] Specify returning a floating-point number.
14131
     * @returns {number} Returns the random number.
14132
     * @example
14133
     *
14134
     * _.random(0, 5);
14135
     * // => an integer between 0 and 5
14136
     *
14137
     * _.random(5);
14138
     * // => also an integer between 0 and 5
14139
     *
14140
     * _.random(5, true);
14141
     * // => a floating-point number between 0 and 5
14142
     *
14143
     * _.random(1.2, 5.2);
14144
     * // => a floating-point number between 1.2 and 5.2
14145
     */
14146
    function random(lower, upper, floating) {
14147
      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {
14148
        upper = floating = undefined;
14149
      }
14150
      if (floating === undefined) {
14151
        if (typeof upper == 'boolean') {
14152
          floating = upper;
14153
          upper = undefined;
14154
        }
14155
        else if (typeof lower == 'boolean') {
14156
          floating = lower;
14157
          lower = undefined;
14158
        }
14159
      }
14160
      if (lower === undefined && upper === undefined) {
14161
        lower = 0;
14162
        upper = 1;
14163
      }
14164
      else {
14165
        lower = toFinite(lower);
14166
        if (upper === undefined) {
14167
          upper = lower;
14168
          lower = 0;
14169
        } else {
14170
          upper = toFinite(upper);
14171
        }
14172
      }
14173
      if (lower > upper) {
14174
        var temp = lower;
14175
        lower = upper;
14176
        upper = temp;
14177
      }
14178
      if (floating || lower % 1 || upper % 1) {
14179
        var rand = nativeRandom();
14180
        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);
14181
      }
14182
      return baseRandom(lower, upper);
14183
    }
14184
14185
    /*------------------------------------------------------------------------*/
14186
14187
    /**
14188
     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).
14189
     *
14190
     * @static
14191
     * @memberOf _
14192
     * @since 3.0.0
14193
     * @category String
14194
     * @param {string} [string=''] The string to convert.
14195
     * @returns {string} Returns the camel cased string.
14196
     * @example
14197
     *
14198
     * _.camelCase('Foo Bar');
14199
     * // => 'fooBar'
14200
     *
14201
     * _.camelCase('--foo-bar--');
14202
     * // => 'fooBar'
14203
     *
14204
     * _.camelCase('__FOO_BAR__');
14205
     * // => 'fooBar'
14206
     */
14207
    var camelCase = createCompounder(function(result, word, index) {
14208
      word = word.toLowerCase();
14209
      return result + (index ? capitalize(word) : word);
14210
    });
14211
14212
    /**
14213
     * Converts the first character of `string` to upper case and the remaining
14214
     * to lower case.
14215
     *
14216
     * @static
14217
     * @memberOf _
14218
     * @since 3.0.0
14219
     * @category String
14220
     * @param {string} [string=''] The string to capitalize.
14221
     * @returns {string} Returns the capitalized string.
14222
     * @example
14223
     *
14224
     * _.capitalize('FRED');
14225
     * // => 'Fred'
14226
     */
14227
    function capitalize(string) {
14228
      return upperFirst(toString(string).toLowerCase());
14229
    }
14230
14231
    /**
14232
     * Deburrs `string` by converting
14233
     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)
14234
     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)
14235
     * letters to basic Latin letters and removing
14236
     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).
14237
     *
14238
     * @static
14239
     * @memberOf _
14240
     * @since 3.0.0
14241
     * @category String
14242
     * @param {string} [string=''] The string to deburr.
14243
     * @returns {string} Returns the deburred string.
14244
     * @example
14245
     *
14246
     * _.deburr('déjà vu');
14247
     * // => 'deja vu'
14248
     */
14249
    function deburr(string) {
14250
      string = toString(string);
14251
      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');
14252
    }
14253
14254
    /**
14255
     * Checks if `string` ends with the given target string.
14256
     *
14257
     * @static
14258
     * @memberOf _
14259
     * @since 3.0.0
14260
     * @category String
14261
     * @param {string} [string=''] The string to inspect.
14262
     * @param {string} [target] The string to search for.
14263
     * @param {number} [position=string.length] The position to search up to.
14264
     * @returns {boolean} Returns `true` if `string` ends with `target`,
14265
     *  else `false`.
14266
     * @example
14267
     *
14268
     * _.endsWith('abc', 'c');
14269
     * // => true
14270
     *
14271
     * _.endsWith('abc', 'b');
14272
     * // => false
14273
     *
14274
     * _.endsWith('abc', 'b', 2);
14275
     * // => true
14276
     */
14277
    function endsWith(string, target, position) {
14278
      string = toString(string);
14279
      target = baseToString(target);
14280
14281
      var length = string.length;
14282
      position = position === undefined
14283
        ? length
14284
        : baseClamp(toInteger(position), 0, length);
14285
14286
      var end = position;
14287
      position -= target.length;
14288
      return position >= 0 && string.slice(position, end) == target;
14289
    }
14290
14291
    /**
14292
     * Converts the characters "&", "<", ">", '"', and "'" in `string` to their
14293
     * corresponding HTML entities.
14294
     *
14295
     * **Note:** No other characters are escaped. To escape additional
14296
     * characters use a third-party library like [_he_](https://mths.be/he).
14297
     *
14298
     * Though the ">" character is escaped for symmetry, characters like
14299
     * ">" and "/" don't need escaping in HTML and have no special meaning
14300
     * unless they're part of a tag or unquoted attribute value. See
14301
     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)
14302
     * (under "semi-related fun fact") for more details.
14303
     *
14304
     * When working with HTML you should always
14305
     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce
14306
     * XSS vectors.
14307
     *
14308
     * @static
14309
     * @since 0.1.0
14310
     * @memberOf _
14311
     * @category String
14312
     * @param {string} [string=''] The string to escape.
14313
     * @returns {string} Returns the escaped string.
14314
     * @example
14315
     *
14316
     * _.escape('fred, barney, & pebbles');
14317
     * // => 'fred, barney, &amp; pebbles'
14318
     */
14319
    function escape(string) {
14320
      string = toString(string);
14321
      return (string && reHasUnescapedHtml.test(string))
14322
        ? string.replace(reUnescapedHtml, escapeHtmlChar)
14323
        : string;
14324
    }
14325
14326
    /**
14327
     * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+",
14328
     * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`.
14329
     *
14330
     * @static
14331
     * @memberOf _
14332
     * @since 3.0.0
14333
     * @category String
14334
     * @param {string} [string=''] The string to escape.
14335
     * @returns {string} Returns the escaped string.
14336
     * @example
14337
     *
14338
     * _.escapeRegExp('[lodash](https://lodash.com/)');
14339
     * // => '\[lodash\]\(https://lodash\.com/\)'
14340
     */
14341
    function escapeRegExp(string) {
14342
      string = toString(string);
14343
      return (string && reHasRegExpChar.test(string))
14344
        ? string.replace(reRegExpChar, '\\$&')
14345
        : string;
14346
    }
14347
14348
    /**
14349
     * Converts `string` to
14350
     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).
14351
     *
14352
     * @static
14353
     * @memberOf _
14354
     * @since 3.0.0
14355
     * @category String
14356
     * @param {string} [string=''] The string to convert.
14357
     * @returns {string} Returns the kebab cased string.
14358
     * @example
14359
     *
14360
     * _.kebabCase('Foo Bar');
14361
     * // => 'foo-bar'
14362
     *
14363
     * _.kebabCase('fooBar');
14364
     * // => 'foo-bar'
14365
     *
14366
     * _.kebabCase('__FOO_BAR__');
14367
     * // => 'foo-bar'
14368
     */
14369
    var kebabCase = createCompounder(function(result, word, index) {
14370
      return result + (index ? '-' : '') + word.toLowerCase();
14371
    });
14372
14373
    /**
14374
     * Converts `string`, as space separated words, to lower case.
14375
     *
14376
     * @static
14377
     * @memberOf _
14378
     * @since 4.0.0
14379
     * @category String
14380
     * @param {string} [string=''] The string to convert.
14381
     * @returns {string} Returns the lower cased string.
14382
     * @example
14383
     *
14384
     * _.lowerCase('--Foo-Bar--');
14385
     * // => 'foo bar'
14386
     *
14387
     * _.lowerCase('fooBar');
14388
     * // => 'foo bar'
14389
     *
14390
     * _.lowerCase('__FOO_BAR__');
14391
     * // => 'foo bar'
14392
     */
14393
    var lowerCase = createCompounder(function(result, word, index) {
14394
      return result + (index ? ' ' : '') + word.toLowerCase();
14395
    });
14396
14397
    /**
14398
     * Converts the first character of `string` to lower case.
14399
     *
14400
     * @static
14401
     * @memberOf _
14402
     * @since 4.0.0
14403
     * @category String
14404
     * @param {string} [string=''] The string to convert.
14405
     * @returns {string} Returns the converted string.
14406
     * @example
14407
     *
14408
     * _.lowerFirst('Fred');
14409
     * // => 'fred'
14410
     *
14411
     * _.lowerFirst('FRED');
14412
     * // => 'fRED'
14413
     */
14414
    var lowerFirst = createCaseFirst('toLowerCase');
14415
14416
    /**
14417
     * Pads `string` on the left and right sides if it's shorter than `length`.
14418
     * Padding characters are truncated if they can't be evenly divided by `length`.
14419
     *
14420
     * @static
14421
     * @memberOf _
14422
     * @since 3.0.0
14423
     * @category String
14424
     * @param {string} [string=''] The string to pad.
14425
     * @param {number} [length=0] The padding length.
14426
     * @param {string} [chars=' '] The string used as padding.
14427
     * @returns {string} Returns the padded string.
14428
     * @example
14429
     *
14430
     * _.pad('abc', 8);
14431
     * // => '  abc   '
14432
     *
14433
     * _.pad('abc', 8, '_-');
14434
     * // => '_-abc_-_'
14435
     *
14436
     * _.pad('abc', 3);
14437
     * // => 'abc'
14438
     */
14439
    function pad(string, length, chars) {
14440
      string = toString(string);
14441
      length = toInteger(length);
14442
14443
      var strLength = length ? stringSize(string) : 0;
14444
      if (!length || strLength >= length) {
14445
        return string;
14446
      }
14447
      var mid = (length - strLength) / 2;
14448
      return (
14449
        createPadding(nativeFloor(mid), chars) +
14450
        string +
14451
        createPadding(nativeCeil(mid), chars)
14452
      );
14453
    }
14454
14455
    /**
14456
     * Pads `string` on the right side if it's shorter than `length`. Padding
14457
     * characters are truncated if they exceed `length`.
14458
     *
14459
     * @static
14460
     * @memberOf _
14461
     * @since 4.0.0
14462
     * @category String
14463
     * @param {string} [string=''] The string to pad.
14464
     * @param {number} [length=0] The padding length.
14465
     * @param {string} [chars=' '] The string used as padding.
14466
     * @returns {string} Returns the padded string.
14467
     * @example
14468
     *
14469
     * _.padEnd('abc', 6);
14470
     * // => 'abc   '
14471
     *
14472
     * _.padEnd('abc', 6, '_-');
14473
     * // => 'abc_-_'
14474
     *
14475
     * _.padEnd('abc', 3);
14476
     * // => 'abc'
14477
     */
14478
    function padEnd(string, length, chars) {
14479
      string = toString(string);
14480
      length = toInteger(length);
14481
14482
      var strLength = length ? stringSize(string) : 0;
14483
      return (length && strLength < length)
14484
        ? (string + createPadding(length - strLength, chars))
14485
        : string;
14486
    }
14487
14488
    /**
14489
     * Pads `string` on the left side if it's shorter than `length`. Padding
14490
     * characters are truncated if they exceed `length`.
14491
     *
14492
     * @static
14493
     * @memberOf _
14494
     * @since 4.0.0
14495
     * @category String
14496
     * @param {string} [string=''] The string to pad.
14497
     * @param {number} [length=0] The padding length.
14498
     * @param {string} [chars=' '] The string used as padding.
14499
     * @returns {string} Returns the padded string.
14500
     * @example
14501
     *
14502
     * _.padStart('abc', 6);
14503
     * // => '   abc'
14504
     *
14505
     * _.padStart('abc', 6, '_-');
14506
     * // => '_-_abc'
14507
     *
14508
     * _.padStart('abc', 3);
14509
     * // => 'abc'
14510
     */
14511
    function padStart(string, length, chars) {
14512
      string = toString(string);
14513
      length = toInteger(length);
14514
14515
      var strLength = length ? stringSize(string) : 0;
14516
      return (length && strLength < length)
14517
        ? (createPadding(length - strLength, chars) + string)
14518
        : string;
14519
    }
14520
14521
    /**
14522
     * Converts `string` to an integer of the specified radix. If `radix` is
14523
     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a
14524
     * hexadecimal, in which case a `radix` of `16` is used.
14525
     *
14526
     * **Note:** This method aligns with the
14527
     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.
14528
     *
14529
     * @static
14530
     * @memberOf _
14531
     * @since 1.1.0
14532
     * @category String
14533
     * @param {string} string The string to convert.
14534
     * @param {number} [radix=10] The radix to interpret `value` by.
14535
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14536
     * @returns {number} Returns the converted integer.
14537
     * @example
14538
     *
14539
     * _.parseInt('08');
14540
     * // => 8
14541
     *
14542
     * _.map(['6', '08', '10'], _.parseInt);
14543
     * // => [6, 8, 10]
14544
     */
14545
    function parseInt(string, radix, guard) {
14546
      if (guard || radix == null) {
14547
        radix = 0;
14548
      } else if (radix) {
14549
        radix = +radix;
14550
      }
14551
      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);
14552
    }
14553
14554
    /**
14555
     * Repeats the given string `n` times.
14556
     *
14557
     * @static
14558
     * @memberOf _
14559
     * @since 3.0.0
14560
     * @category String
14561
     * @param {string} [string=''] The string to repeat.
14562
     * @param {number} [n=1] The number of times to repeat the string.
14563
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14564
     * @returns {string} Returns the repeated string.
14565
     * @example
14566
     *
14567
     * _.repeat('*', 3);
14568
     * // => '***'
14569
     *
14570
     * _.repeat('abc', 2);
14571
     * // => 'abcabc'
14572
     *
14573
     * _.repeat('abc', 0);
14574
     * // => ''
14575
     */
14576
    function repeat(string, n, guard) {
14577
      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {
14578
        n = 1;
14579
      } else {
14580
        n = toInteger(n);
14581
      }
14582
      return baseRepeat(toString(string), n);
14583
    }
14584
14585
    /**
14586
     * Replaces matches for `pattern` in `string` with `replacement`.
14587
     *
14588
     * **Note:** This method is based on
14589
     * [`String#replace`](https://mdn.io/String/replace).
14590
     *
14591
     * @static
14592
     * @memberOf _
14593
     * @since 4.0.0
14594
     * @category String
14595
     * @param {string} [string=''] The string to modify.
14596
     * @param {RegExp|string} pattern The pattern to replace.
14597
     * @param {Function|string} replacement The match replacement.
14598
     * @returns {string} Returns the modified string.
14599
     * @example
14600
     *
14601
     * _.replace('Hi Fred', 'Fred', 'Barney');
14602
     * // => 'Hi Barney'
14603
     */
14604
    function replace() {
14605
      var args = arguments,
14606
          string = toString(args[0]);
14607
14608
      return args.length < 3 ? string : string.replace(args[1], args[2]);
14609
    }
14610
14611
    /**
14612
     * Converts `string` to
14613
     * [snake case](https://en.wikipedia.org/wiki/Snake_case).
14614
     *
14615
     * @static
14616
     * @memberOf _
14617
     * @since 3.0.0
14618
     * @category String
14619
     * @param {string} [string=''] The string to convert.
14620
     * @returns {string} Returns the snake cased string.
14621
     * @example
14622
     *
14623
     * _.snakeCase('Foo Bar');
14624
     * // => 'foo_bar'
14625
     *
14626
     * _.snakeCase('fooBar');
14627
     * // => 'foo_bar'
14628
     *
14629
     * _.snakeCase('--FOO-BAR--');
14630
     * // => 'foo_bar'
14631
     */
14632
    var snakeCase = createCompounder(function(result, word, index) {
14633
      return result + (index ? '_' : '') + word.toLowerCase();
14634
    });
14635
14636
    /**
14637
     * Splits `string` by `separator`.
14638
     *
14639
     * **Note:** This method is based on
14640
     * [`String#split`](https://mdn.io/String/split).
14641
     *
14642
     * @static
14643
     * @memberOf _
14644
     * @since 4.0.0
14645
     * @category String
14646
     * @param {string} [string=''] The string to split.
14647
     * @param {RegExp|string} separator The separator pattern to split by.
14648
     * @param {number} [limit] The length to truncate results to.
14649
     * @returns {Array} Returns the string segments.
14650
     * @example
14651
     *
14652
     * _.split('a-b-c', '-', 2);
14653
     * // => ['a', 'b']
14654
     */
14655
    function split(string, separator, limit) {
14656
      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {
14657
        separator = limit = undefined;
14658
      }
14659
      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;
14660
      if (!limit) {
14661
        return [];
14662
      }
14663
      string = toString(string);
14664
      if (string && (
14665
            typeof separator == 'string' ||
14666
            (separator != null && !isRegExp(separator))
14667
          )) {
14668
        separator = baseToString(separator);
14669
        if (!separator && hasUnicode(string)) {
14670
          return castSlice(stringToArray(string), 0, limit);
14671
        }
14672
      }
14673
      return string.split(separator, limit);
14674
    }
14675
14676
    /**
14677
     * Converts `string` to
14678
     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).
14679
     *
14680
     * @static
14681
     * @memberOf _
14682
     * @since 3.1.0
14683
     * @category String
14684
     * @param {string} [string=''] The string to convert.
14685
     * @returns {string} Returns the start cased string.
14686
     * @example
14687
     *
14688
     * _.startCase('--foo-bar--');
14689
     * // => 'Foo Bar'
14690
     *
14691
     * _.startCase('fooBar');
14692
     * // => 'Foo Bar'
14693
     *
14694
     * _.startCase('__FOO_BAR__');
14695
     * // => 'FOO BAR'
14696
     */
14697
    var startCase = createCompounder(function(result, word, index) {
14698
      return result + (index ? ' ' : '') + upperFirst(word);
14699
    });
14700
14701
    /**
14702
     * Checks if `string` starts with the given target string.
14703
     *
14704
     * @static
14705
     * @memberOf _
14706
     * @since 3.0.0
14707
     * @category String
14708
     * @param {string} [string=''] The string to inspect.
14709
     * @param {string} [target] The string to search for.
14710
     * @param {number} [position=0] The position to search from.
14711
     * @returns {boolean} Returns `true` if `string` starts with `target`,
14712
     *  else `false`.
14713
     * @example
14714
     *
14715
     * _.startsWith('abc', 'a');
14716
     * // => true
14717
     *
14718
     * _.startsWith('abc', 'b');
14719
     * // => false
14720
     *
14721
     * _.startsWith('abc', 'b', 1);
14722
     * // => true
14723
     */
14724
    function startsWith(string, target, position) {
14725
      string = toString(string);
14726
      position = position == null
14727
        ? 0
14728
        : baseClamp(toInteger(position), 0, string.length);
14729
14730
      target = baseToString(target);
14731
      return string.slice(position, position + target.length) == target;
14732
    }
14733
14734
    /**
14735
     * Creates a compiled template function that can interpolate data properties
14736
     * in "interpolate" delimiters, HTML-escape interpolated data properties in
14737
     * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
14738
     * properties may be accessed as free variables in the template. If a setting
14739
     * object is given, it takes precedence over `_.templateSettings` values.
14740
     *
14741
     * **Note:** In the development build `_.template` utilizes
14742
     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
14743
     * for easier debugging.
14744
     *
14745
     * For more information on precompiling templates see
14746
     * [lodash's custom builds documentation](https://lodash.com/custom-builds).
14747
     *
14748
     * For more information on Chrome extension sandboxes see
14749
     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).
14750
     *
14751
     * @static
14752
     * @since 0.1.0
14753
     * @memberOf _
14754
     * @category String
14755
     * @param {string} [string=''] The template string.
14756
     * @param {Object} [options={}] The options object.
14757
     * @param {RegExp} [options.escape=_.templateSettings.escape]
14758
     *  The HTML "escape" delimiter.
14759
     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]
14760
     *  The "evaluate" delimiter.
14761
     * @param {Object} [options.imports=_.templateSettings.imports]
14762
     *  An object to import into the template as free variables.
14763
     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]
14764
     *  The "interpolate" delimiter.
14765
     * @param {string} [options.sourceURL='lodash.templateSources[n]']
14766
     *  The sourceURL of the compiled template.
14767
     * @param {string} [options.variable='obj']
14768
     *  The data object variable name.
14769
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
14770
     * @returns {Function} Returns the compiled template function.
14771
     * @example
14772
     *
14773
     * // Use the "interpolate" delimiter to create a compiled template.
14774
     * var compiled = _.template('hello <%= user %>!');
14775
     * compiled({ 'user': 'fred' });
14776
     * // => 'hello fred!'
14777
     *
14778
     * // Use the HTML "escape" delimiter to escape data property values.
14779
     * var compiled = _.template('<b><%- value %></b>');
14780
     * compiled({ 'value': '<script>' });
14781
     * // => '<b>&lt;script&gt;</b>'
14782
     *
14783
     * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
14784
     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
14785
     * compiled({ 'users': ['fred', 'barney'] });
14786
     * // => '<li>fred</li><li>barney</li>'
14787
     *
14788
     * // Use the internal `print` function in "evaluate" delimiters.
14789
     * var compiled = _.template('<% print("hello " + user); %>!');
14790
     * compiled({ 'user': 'barney' });
14791
     * // => 'hello barney!'
14792
     *
14793
     * // Use the ES template literal delimiter as an "interpolate" delimiter.
14794
     * // Disable support by replacing the "interpolate" delimiter.
14795
     * var compiled = _.template('hello ${ user }!');
14796
     * compiled({ 'user': 'pebbles' });
14797
     * // => 'hello pebbles!'
14798
     *
14799
     * // Use backslashes to treat delimiters as plain text.
14800
     * var compiled = _.template('<%= "\\<%- value %\\>" %>');
14801
     * compiled({ 'value': 'ignored' });
14802
     * // => '<%- value %>'
14803
     *
14804
     * // Use the `imports` option to import `jQuery` as `jq`.
14805
     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
14806
     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
14807
     * compiled({ 'users': ['fred', 'barney'] });
14808
     * // => '<li>fred</li><li>barney</li>'
14809
     *
14810
     * // Use the `sourceURL` option to specify a custom sourceURL for the template.
14811
     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
14812
     * compiled(data);
14813
     * // => Find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector.
14814
     *
14815
     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
14816
     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
14817
     * compiled.source;
14818
     * // => function(data) {
14819
     * //   var __t, __p = '';
14820
     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';
14821
     * //   return __p;
14822
     * // }
14823
     *
14824
     * // Use custom template delimiters.
14825
     * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
14826
     * var compiled = _.template('hello {{ user }}!');
14827
     * compiled({ 'user': 'mustache' });
14828
     * // => 'hello mustache!'
14829
     *
14830
     * // Use the `source` property to inline compiled templates for meaningful
14831
     * // line numbers in error messages and stack traces.
14832
     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\
14833
     *   var JST = {\
14834
     *     "main": ' + _.template(mainText).source + '\
14835
     *   };\
14836
     * ');
14837
     */
14838
    function template(string, options, guard) {
14839
      // Based on John Resig's `tmpl` implementation
14840
      // (http://ejohn.org/blog/javascript-micro-templating/)
14841
      // and Laura Doktorova's doT.js (https://github.com/olado/doT).
14842
      var settings = lodash.templateSettings;
14843
14844
      if (guard && isIterateeCall(string, options, guard)) {
14845
        options = undefined;
14846
      }
14847
      string = toString(string);
14848
      options = assignInWith({}, options, settings, customDefaultsAssignIn);
14849
14850
      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),
14851
          importsKeys = keys(imports),
14852
          importsValues = baseValues(imports, importsKeys);
14853
14854
      var isEscaping,
14855
          isEvaluating,
14856
          index = 0,
14857
          interpolate = options.interpolate || reNoMatch,
14858
          source = "__p += '";
14859
14860
      // Compile the regexp to match each delimiter.
14861
      var reDelimiters = RegExp(
14862
        (options.escape || reNoMatch).source + '|' +
14863
        interpolate.source + '|' +
14864
        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +
14865
        (options.evaluate || reNoMatch).source + '|$'
14866
      , 'g');
14867
14868
      // Use a sourceURL for easier debugging.
14869
      // The sourceURL gets injected into the source that's eval-ed, so be careful
14870
      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in
14871
      // and escape the comment, thus injecting code that gets evaled.
14872
      var sourceURL = '//# sourceURL=' +
14873
        (hasOwnProperty.call(options, 'sourceURL')
14874
          ? (options.sourceURL + '').replace(/\s/g, ' ')
14875
          : ('lodash.templateSources[' + (++templateCounter) + ']')
14876
        ) + '\n';
14877
14878
      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
14879
        interpolateValue || (interpolateValue = esTemplateValue);
14880
14881
        // Escape characters that can't be included in string literals.
14882
        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
14883
14884
        // Replace delimiters with snippets.
14885
        if (escapeValue) {
14886
          isEscaping = true;
14887
          source += "' +\n__e(" + escapeValue + ") +\n'";
14888
        }
14889
        if (evaluateValue) {
14890
          isEvaluating = true;
14891
          source += "';\n" + evaluateValue + ";\n__p += '";
14892
        }
14893
        if (interpolateValue) {
14894
          source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
14895
        }
14896
        index = offset + match.length;
14897
14898
        // The JS engine embedded in Adobe products needs `match` returned in
14899
        // order to produce the correct `offset` value.
14900
        return match;
14901
      });
14902
14903
      source += "';\n";
14904
14905
      // If `variable` is not specified wrap a with-statement around the generated
14906
      // code to add the data object to the top of the scope chain.
14907
      var variable = hasOwnProperty.call(options, 'variable') && options.variable;
14908
      if (!variable) {
14909
        source = 'with (obj) {\n' + source + '\n}\n';
14910
      }
14911
      // Throw an error if a forbidden character was found in `variable`, to prevent
14912
      // potential command injection attacks.
14913
      else if (reForbiddenIdentifierChars.test(variable)) {
14914
        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);
14915
      }
14916
14917
      // Cleanup code by stripping empty strings.
14918
      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)
14919
        .replace(reEmptyStringMiddle, '$1')
14920
        .replace(reEmptyStringTrailing, '$1;');
14921
14922
      // Frame code as the function body.
14923
      source = 'function(' + (variable || 'obj') + ') {\n' +
14924
        (variable
14925
          ? ''
14926
          : 'obj || (obj = {});\n'
14927
        ) +
14928
        "var __t, __p = ''" +
14929
        (isEscaping
14930
           ? ', __e = _.escape'
14931
           : ''
14932
        ) +
14933
        (isEvaluating
14934
          ? ', __j = Array.prototype.join;\n' +
14935
            "function print() { __p += __j.call(arguments, '') }\n"
14936
          : ';\n'
14937
        ) +
14938
        source +
14939
        'return __p\n}';
14940
14941
      var result = attempt(function() {
14942
        return Function(importsKeys, sourceURL + 'return ' + source)
14943
          .apply(undefined, importsValues);
14944
      });
14945
14946
      // Provide the compiled function's source by its `toString` method or
14947
      // the `source` property as a convenience for inlining compiled templates.
14948
      result.source = source;
14949
      if (isError(result)) {
14950
        throw result;
14951
      }
14952
      return result;
14953
    }
14954
14955
    /**
14956
     * Converts `string`, as a whole, to lower case just like
14957
     * [String#toLowerCase](https://mdn.io/toLowerCase).
14958
     *
14959
     * @static
14960
     * @memberOf _
14961
     * @since 4.0.0
14962
     * @category String
14963
     * @param {string} [string=''] The string to convert.
14964
     * @returns {string} Returns the lower cased string.
14965
     * @example
14966
     *
14967
     * _.toLower('--Foo-Bar--');
14968
     * // => '--foo-bar--'
14969
     *
14970
     * _.toLower('fooBar');
14971
     * // => 'foobar'
14972
     *
14973
     * _.toLower('__FOO_BAR__');
14974
     * // => '__foo_bar__'
14975
     */
14976
    function toLower(value) {
14977
      return toString(value).toLowerCase();
14978
    }
14979
14980
    /**
14981
     * Converts `string`, as a whole, to upper case just like
14982
     * [String#toUpperCase](https://mdn.io/toUpperCase).
14983
     *
14984
     * @static
14985
     * @memberOf _
14986
     * @since 4.0.0
14987
     * @category String
14988
     * @param {string} [string=''] The string to convert.
14989
     * @returns {string} Returns the upper cased string.
14990
     * @example
14991
     *
14992
     * _.toUpper('--foo-bar--');
14993
     * // => '--FOO-BAR--'
14994
     *
14995
     * _.toUpper('fooBar');
14996
     * // => 'FOOBAR'
14997
     *
14998
     * _.toUpper('__foo_bar__');
14999
     * // => '__FOO_BAR__'
15000
     */
15001
    function toUpper(value) {
15002
      return toString(value).toUpperCase();
15003
    }
15004
15005
    /**
15006
     * Removes leading and trailing whitespace or specified characters from `string`.
15007
     *
15008
     * @static
15009
     * @memberOf _
15010
     * @since 3.0.0
15011
     * @category String
15012
     * @param {string} [string=''] The string to trim.
15013
     * @param {string} [chars=whitespace] The characters to trim.
15014
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15015
     * @returns {string} Returns the trimmed string.
15016
     * @example
15017
     *
15018
     * _.trim('  abc  ');
15019
     * // => 'abc'
15020
     *
15021
     * _.trim('-_-abc-_-', '_-');
15022
     * // => 'abc'
15023
     *
15024
     * _.map(['  foo  ', '  bar  '], _.trim);
15025
     * // => ['foo', 'bar']
15026
     */
15027
    function trim(string, chars, guard) {
15028
      string = toString(string);
15029
      if (string && (guard || chars === undefined)) {
15030
        return baseTrim(string);
15031
      }
15032
      if (!string || !(chars = baseToString(chars))) {
15033
        return string;
15034
      }
15035
      var strSymbols = stringToArray(string),
15036
          chrSymbols = stringToArray(chars),
15037
          start = charsStartIndex(strSymbols, chrSymbols),
15038
          end = charsEndIndex(strSymbols, chrSymbols) + 1;
15039
15040
      return castSlice(strSymbols, start, end).join('');
15041
    }
15042
15043
    /**
15044
     * Removes trailing whitespace or specified characters from `string`.
15045
     *
15046
     * @static
15047
     * @memberOf _
15048
     * @since 4.0.0
15049
     * @category String
15050
     * @param {string} [string=''] The string to trim.
15051
     * @param {string} [chars=whitespace] The characters to trim.
15052
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15053
     * @returns {string} Returns the trimmed string.
15054
     * @example
15055
     *
15056
     * _.trimEnd('  abc  ');
15057
     * // => '  abc'
15058
     *
15059
     * _.trimEnd('-_-abc-_-', '_-');
15060
     * // => '-_-abc'
15061
     */
15062
    function trimEnd(string, chars, guard) {
15063
      string = toString(string);
15064
      if (string && (guard || chars === undefined)) {
15065
        return string.slice(0, trimmedEndIndex(string) + 1);
15066
      }
15067
      if (!string || !(chars = baseToString(chars))) {
15068
        return string;
15069
      }
15070
      var strSymbols = stringToArray(string),
15071
          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
15072
15073
      return castSlice(strSymbols, 0, end).join('');
15074
    }
15075
15076
    /**
15077
     * Removes leading whitespace or specified characters from `string`.
15078
     *
15079
     * @static
15080
     * @memberOf _
15081
     * @since 4.0.0
15082
     * @category String
15083
     * @param {string} [string=''] The string to trim.
15084
     * @param {string} [chars=whitespace] The characters to trim.
15085
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15086
     * @returns {string} Returns the trimmed string.
15087
     * @example
15088
     *
15089
     * _.trimStart('  abc  ');
15090
     * // => 'abc  '
15091
     *
15092
     * _.trimStart('-_-abc-_-', '_-');
15093
     * // => 'abc-_-'
15094
     */
15095
    function trimStart(string, chars, guard) {
15096
      string = toString(string);
15097
      if (string && (guard || chars === undefined)) {
15098
        return string.replace(reTrimStart, '');
15099
      }
15100
      if (!string || !(chars = baseToString(chars))) {
15101
        return string;
15102
      }
15103
      var strSymbols = stringToArray(string),
15104
          start = charsStartIndex(strSymbols, stringToArray(chars));
15105
15106
      return castSlice(strSymbols, start).join('');
15107
    }
15108
15109
    /**
15110
     * Truncates `string` if it's longer than the given maximum string length.
15111
     * The last characters of the truncated string are replaced with the omission
15112
     * string which defaults to "...".
15113
     *
15114
     * @static
15115
     * @memberOf _
15116
     * @since 4.0.0
15117
     * @category String
15118
     * @param {string} [string=''] The string to truncate.
15119
     * @param {Object} [options={}] The options object.
15120
     * @param {number} [options.length=30] The maximum string length.
15121
     * @param {string} [options.omission='...'] The string to indicate text is omitted.
15122
     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.
15123
     * @returns {string} Returns the truncated string.
15124
     * @example
15125
     *
15126
     * _.truncate('hi-diddly-ho there, neighborino');
15127
     * // => 'hi-diddly-ho there, neighbo...'
15128
     *
15129
     * _.truncate('hi-diddly-ho there, neighborino', {
15130
     *   'length': 24,
15131
     *   'separator': ' '
15132
     * });
15133
     * // => 'hi-diddly-ho there,...'
15134
     *
15135
     * _.truncate('hi-diddly-ho there, neighborino', {
15136
     *   'length': 24,
15137
     *   'separator': /,? +/
15138
     * });
15139
     * // => 'hi-diddly-ho there...'
15140
     *
15141
     * _.truncate('hi-diddly-ho there, neighborino', {
15142
     *   'omission': ' [...]'
15143
     * });
15144
     * // => 'hi-diddly-ho there, neig [...]'
15145
     */
15146
    function truncate(string, options) {
15147
      var length = DEFAULT_TRUNC_LENGTH,
15148
          omission = DEFAULT_TRUNC_OMISSION;
15149
15150
      if (isObject(options)) {
15151
        var separator = 'separator' in options ? options.separator : separator;
15152
        length = 'length' in options ? toInteger(options.length) : length;
15153
        omission = 'omission' in options ? baseToString(options.omission) : omission;
15154
      }
15155
      string = toString(string);
15156
15157
      var strLength = string.length;
15158
      if (hasUnicode(string)) {
15159
        var strSymbols = stringToArray(string);
15160
        strLength = strSymbols.length;
15161
      }
15162
      if (length >= strLength) {
15163
        return string;
15164
      }
15165
      var end = length - stringSize(omission);
15166
      if (end < 1) {
15167
        return omission;
15168
      }
15169
      var result = strSymbols
15170
        ? castSlice(strSymbols, 0, end).join('')
15171
        : string.slice(0, end);
15172
15173
      if (separator === undefined) {
15174
        return result + omission;
15175
      }
15176
      if (strSymbols) {
15177
        end += (result.length - end);
15178
      }
15179
      if (isRegExp(separator)) {
15180
        if (string.slice(end).search(separator)) {
15181
          var match,
15182
              substring = result;
15183
15184
          if (!separator.global) {
15185
            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');
15186
          }
15187
          separator.lastIndex = 0;
15188
          while ((match = separator.exec(substring))) {
15189
            var newEnd = match.index;
15190
          }
15191
          result = result.slice(0, newEnd === undefined ? end : newEnd);
15192
        }
15193
      } else if (string.indexOf(baseToString(separator), end) != end) {
15194
        var index = result.lastIndexOf(separator);
15195
        if (index > -1) {
15196
          result = result.slice(0, index);
15197
        }
15198
      }
15199
      return result + omission;
15200
    }
15201
15202
    /**
15203
     * The inverse of `_.escape`; this method converts the HTML entities
15204
     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to
15205
     * their corresponding characters.
15206
     *
15207
     * **Note:** No other HTML entities are unescaped. To unescape additional
15208
     * HTML entities use a third-party library like [_he_](https://mths.be/he).
15209
     *
15210
     * @static
15211
     * @memberOf _
15212
     * @since 0.6.0
15213
     * @category String
15214
     * @param {string} [string=''] The string to unescape.
15215
     * @returns {string} Returns the unescaped string.
15216
     * @example
15217
     *
15218
     * _.unescape('fred, barney, &amp; pebbles');
15219
     * // => 'fred, barney, & pebbles'
15220
     */
15221
    function unescape(string) {
15222
      string = toString(string);
15223
      return (string && reHasEscapedHtml.test(string))
15224
        ? string.replace(reEscapedHtml, unescapeHtmlChar)
15225
        : string;
15226
    }
15227
15228
    /**
15229
     * Converts `string`, as space separated words, to upper case.
15230
     *
15231
     * @static
15232
     * @memberOf _
15233
     * @since 4.0.0
15234
     * @category String
15235
     * @param {string} [string=''] The string to convert.
15236
     * @returns {string} Returns the upper cased string.
15237
     * @example
15238
     *
15239
     * _.upperCase('--foo-bar');
15240
     * // => 'FOO BAR'
15241
     *
15242
     * _.upperCase('fooBar');
15243
     * // => 'FOO BAR'
15244
     *
15245
     * _.upperCase('__foo_bar__');
15246
     * // => 'FOO BAR'
15247
     */
15248
    var upperCase = createCompounder(function(result, word, index) {
15249
      return result + (index ? ' ' : '') + word.toUpperCase();
15250
    });
15251
15252
    /**
15253
     * Converts the first character of `string` to upper case.
15254
     *
15255
     * @static
15256
     * @memberOf _
15257
     * @since 4.0.0
15258
     * @category String
15259
     * @param {string} [string=''] The string to convert.
15260
     * @returns {string} Returns the converted string.
15261
     * @example
15262
     *
15263
     * _.upperFirst('fred');
15264
     * // => 'Fred'
15265
     *
15266
     * _.upperFirst('FRED');
15267
     * // => 'FRED'
15268
     */
15269
    var upperFirst = createCaseFirst('toUpperCase');
15270
15271
    /**
15272
     * Splits `string` into an array of its words.
15273
     *
15274
     * @static
15275
     * @memberOf _
15276
     * @since 3.0.0
15277
     * @category String
15278
     * @param {string} [string=''] The string to inspect.
15279
     * @param {RegExp|string} [pattern] The pattern to match words.
15280
     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
15281
     * @returns {Array} Returns the words of `string`.
15282
     * @example
15283
     *
15284
     * _.words('fred, barney, & pebbles');
15285
     * // => ['fred', 'barney', 'pebbles']
15286
     *
15287
     * _.words('fred, barney, & pebbles', /[^, ]+/g);
15288
     * // => ['fred', 'barney', '&', 'pebbles']
15289
     */
15290
    function words(string, pattern, guard) {
15291
      string = toString(string);
15292
      pattern = guard ? undefined : pattern;
15293
15294
      if (pattern === undefined) {
15295
        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
15296
      }
15297
      return string.match(pattern) || [];
15298
    }
15299
15300
    /*------------------------------------------------------------------------*/
15301
15302
    /**
15303
     * Attempts to invoke `func`, returning either the result or the caught error
15304
     * object. Any additional arguments are provided to `func` when it's invoked.
15305
     *
15306
     * @static
15307
     * @memberOf _
15308
     * @since 3.0.0
15309
     * @category Util
15310
     * @param {Function} func The function to attempt.
15311
     * @param {...*} [args] The arguments to invoke `func` with.
15312
     * @returns {*} Returns the `func` result or error object.
15313
     * @example
15314
     *
15315
     * // Avoid throwing errors for invalid selectors.
15316
     * var elements = _.attempt(function(selector) {
15317
     *   return document.querySelectorAll(selector);
15318
     * }, '>_>');
15319
     *
15320
     * if (_.isError(elements)) {
15321
     *   elements = [];
15322
     * }
15323
     */
15324
    var attempt = baseRest(function(func, args) {
15325
      try {
15326
        return apply(func, undefined, args);
15327
      } catch (e) {
15328
        return isError(e) ? e : new Error(e);
15329
      }
15330
    });
15331
15332
    /**
15333
     * Binds methods of an object to the object itself, overwriting the existing
15334
     * method.
15335
     *
15336
     * **Note:** This method doesn't set the "length" property of bound functions.
15337
     *
15338
     * @static
15339
     * @since 0.1.0
15340
     * @memberOf _
15341
     * @category Util
15342
     * @param {Object} object The object to bind and assign the bound methods to.
15343
     * @param {...(string|string[])} methodNames The object method names to bind.
15344
     * @returns {Object} Returns `object`.
15345
     * @example
15346
     *
15347
     * var view = {
15348
     *   'label': 'docs',
15349
     *   'click': function() {
15350
     *     console.log('clicked ' + this.label);
15351
     *   }
15352
     * };
15353
     *
15354
     * _.bindAll(view, ['click']);
15355
     * jQuery(element).on('click', view.click);
15356
     * // => Logs 'clicked docs' when clicked.
15357
     */
15358
    var bindAll = flatRest(function(object, methodNames) {
15359
      arrayEach(methodNames, function(key) {
15360
        key = toKey(key);
15361
        baseAssignValue(object, key, bind(object[key], object));
15362
      });
15363
      return object;
15364
    });
15365
15366
    /**
15367
     * Creates a function that iterates over `pairs` and invokes the corresponding
15368
     * function of the first predicate to return truthy. The predicate-function
15369
     * pairs are invoked with the `this` binding and arguments of the created
15370
     * function.
15371
     *
15372
     * @static
15373
     * @memberOf _
15374
     * @since 4.0.0
15375
     * @category Util
15376
     * @param {Array} pairs The predicate-function pairs.
15377
     * @returns {Function} Returns the new composite function.
15378
     * @example
15379
     *
15380
     * var func = _.cond([
15381
     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],
15382
     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
15383
     *   [_.stubTrue,                      _.constant('no match')]
15384
     * ]);
15385
     *
15386
     * func({ 'a': 1, 'b': 2 });
15387
     * // => 'matches A'
15388
     *
15389
     * func({ 'a': 0, 'b': 1 });
15390
     * // => 'matches B'
15391
     *
15392
     * func({ 'a': '1', 'b': '2' });
15393
     * // => 'no match'
15394
     */
15395
    function cond(pairs) {
15396
      var length = pairs == null ? 0 : pairs.length,
15397
          toIteratee = getIteratee();
15398
15399
      pairs = !length ? [] : arrayMap(pairs, function(pair) {
15400
        if (typeof pair[1] != 'function') {
15401
          throw new TypeError(FUNC_ERROR_TEXT);
15402
        }
15403
        return [toIteratee(pair[0]), pair[1]];
15404
      });
15405
15406
      return baseRest(function(args) {
15407
        var index = -1;
15408
        while (++index < length) {
15409
          var pair = pairs[index];
15410
          if (apply(pair[0], this, args)) {
15411
            return apply(pair[1], this, args);
15412
          }
15413
        }
15414
      });
15415
    }
15416
15417
    /**
15418
     * Creates a function that invokes the predicate properties of `source` with
15419
     * the corresponding property values of a given object, returning `true` if
15420
     * all predicates return truthy, else `false`.
15421
     *
15422
     * **Note:** The created function is equivalent to `_.conformsTo` with
15423
     * `source` partially applied.
15424
     *
15425
     * @static
15426
     * @memberOf _
15427
     * @since 4.0.0
15428
     * @category Util
15429
     * @param {Object} source The object of property predicates to conform to.
15430
     * @returns {Function} Returns the new spec function.
15431
     * @example
15432
     *
15433
     * var objects = [
15434
     *   { 'a': 2, 'b': 1 },
15435
     *   { 'a': 1, 'b': 2 }
15436
     * ];
15437
     *
15438
     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));
15439
     * // => [{ 'a': 1, 'b': 2 }]
15440
     */
15441
    function conforms(source) {
15442
      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
15443
    }
15444
15445
    /**
15446
     * Creates a function that returns `value`.
15447
     *
15448
     * @static
15449
     * @memberOf _
15450
     * @since 2.4.0
15451
     * @category Util
15452
     * @param {*} value The value to return from the new function.
15453
     * @returns {Function} Returns the new constant function.
15454
     * @example
15455
     *
15456
     * var objects = _.times(2, _.constant({ 'a': 1 }));
15457
     *
15458
     * console.log(objects);
15459
     * // => [{ 'a': 1 }, { 'a': 1 }]
15460
     *
15461
     * console.log(objects[0] === objects[1]);
15462
     * // => true
15463
     */
15464
    function constant(value) {
15465
      return function() {
15466
        return value;
15467
      };
15468
    }
15469
15470
    /**
15471
     * Checks `value` to determine whether a default value should be returned in
15472
     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,
15473
     * or `undefined`.
15474
     *
15475
     * @static
15476
     * @memberOf _
15477
     * @since 4.14.0
15478
     * @category Util
15479
     * @param {*} value The value to check.
15480
     * @param {*} defaultValue The default value.
15481
     * @returns {*} Returns the resolved value.
15482
     * @example
15483
     *
15484
     * _.defaultTo(1, 10);
15485
     * // => 1
15486
     *
15487
     * _.defaultTo(undefined, 10);
15488
     * // => 10
15489
     */
15490
    function defaultTo(value, defaultValue) {
15491
      return (value == null || value !== value) ? defaultValue : value;
15492
    }
15493
15494
    /**
15495
     * Creates a function that returns the result of invoking the given functions
15496
     * with the `this` binding of the created function, where each successive
15497
     * invocation is supplied the return value of the previous.
15498
     *
15499
     * @static
15500
     * @memberOf _
15501
     * @since 3.0.0
15502
     * @category Util
15503
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15504
     * @returns {Function} Returns the new composite function.
15505
     * @see _.flowRight
15506
     * @example
15507
     *
15508
     * function square(n) {
15509
     *   return n * n;
15510
     * }
15511
     *
15512
     * var addSquare = _.flow([_.add, square]);
15513
     * addSquare(1, 2);
15514
     * // => 9
15515
     */
15516
    var flow = createFlow();
15517
15518
    /**
15519
     * This method is like `_.flow` except that it creates a function that
15520
     * invokes the given functions from right to left.
15521
     *
15522
     * @static
15523
     * @since 3.0.0
15524
     * @memberOf _
15525
     * @category Util
15526
     * @param {...(Function|Function[])} [funcs] The functions to invoke.
15527
     * @returns {Function} Returns the new composite function.
15528
     * @see _.flow
15529
     * @example
15530
     *
15531
     * function square(n) {
15532
     *   return n * n;
15533
     * }
15534
     *
15535
     * var addSquare = _.flowRight([square, _.add]);
15536
     * addSquare(1, 2);
15537
     * // => 9
15538
     */
15539
    var flowRight = createFlow(true);
15540
15541
    /**
15542
     * This method returns the first argument it receives.
15543
     *
15544
     * @static
15545
     * @since 0.1.0
15546
     * @memberOf _
15547
     * @category Util
15548
     * @param {*} value Any value.
15549
     * @returns {*} Returns `value`.
15550
     * @example
15551
     *
15552
     * var object = { 'a': 1 };
15553
     *
15554
     * console.log(_.identity(object) === object);
15555
     * // => true
15556
     */
15557
    function identity(value) {
15558
      return value;
15559
    }
15560
15561
    /**
15562
     * Creates a function that invokes `func` with the arguments of the created
15563
     * function. If `func` is a property name, the created function returns the
15564
     * property value for a given element. If `func` is an array or object, the
15565
     * created function returns `true` for elements that contain the equivalent
15566
     * source properties, otherwise it returns `false`.
15567
     *
15568
     * @static
15569
     * @since 4.0.0
15570
     * @memberOf _
15571
     * @category Util
15572
     * @param {*} [func=_.identity] The value to convert to a callback.
15573
     * @returns {Function} Returns the callback.
15574
     * @example
15575
     *
15576
     * var users = [
15577
     *   { 'user': 'barney', 'age': 36, 'active': true },
15578
     *   { 'user': 'fred',   'age': 40, 'active': false }
15579
     * ];
15580
     *
15581
     * // The `_.matches` iteratee shorthand.
15582
     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));
15583
     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]
15584
     *
15585
     * // The `_.matchesProperty` iteratee shorthand.
15586
     * _.filter(users, _.iteratee(['user', 'fred']));
15587
     * // => [{ 'user': 'fred', 'age': 40 }]
15588
     *
15589
     * // The `_.property` iteratee shorthand.
15590
     * _.map(users, _.iteratee('user'));
15591
     * // => ['barney', 'fred']
15592
     *
15593
     * // Create custom iteratee shorthands.
15594
     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {
15595
     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {
15596
     *     return func.test(string);
15597
     *   };
15598
     * });
15599
     *
15600
     * _.filter(['abc', 'def'], /ef/);
15601
     * // => ['def']
15602
     */
15603
    function iteratee(func) {
15604
      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));
15605
    }
15606
15607
    /**
15608
     * Creates a function that performs a partial deep comparison between a given
15609
     * object and `source`, returning `true` if the given object has equivalent
15610
     * property values, else `false`.
15611
     *
15612
     * **Note:** The created function is equivalent to `_.isMatch` with `source`
15613
     * partially applied.
15614
     *
15615
     * Partial comparisons will match empty array and empty object `source`
15616
     * values against any array or object value, respectively. See `_.isEqual`
15617
     * for a list of supported value comparisons.
15618
     *
15619
     * **Note:** Multiple values can be checked by combining several matchers
15620
     * using `_.overSome`
15621
     *
15622
     * @static
15623
     * @memberOf _
15624
     * @since 3.0.0
15625
     * @category Util
15626
     * @param {Object} source The object of property values to match.
15627
     * @returns {Function} Returns the new spec function.
15628
     * @example
15629
     *
15630
     * var objects = [
15631
     *   { 'a': 1, 'b': 2, 'c': 3 },
15632
     *   { 'a': 4, 'b': 5, 'c': 6 }
15633
     * ];
15634
     *
15635
     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));
15636
     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]
15637
     *
15638
     * // Checking for several possible values
15639
     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));
15640
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
15641
     */
15642
    function matches(source) {
15643
      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
15644
    }
15645
15646
    /**
15647
     * Creates a function that performs a partial deep comparison between the
15648
     * value at `path` of a given object to `srcValue`, returning `true` if the
15649
     * object value is equivalent, else `false`.
15650
     *
15651
     * **Note:** Partial comparisons will match empty array and empty object
15652
     * `srcValue` values against any array or object value, respectively. See
15653
     * `_.isEqual` for a list of supported value comparisons.
15654
     *
15655
     * **Note:** Multiple values can be checked by combining several matchers
15656
     * using `_.overSome`
15657
     *
15658
     * @static
15659
     * @memberOf _
15660
     * @since 3.2.0
15661
     * @category Util
15662
     * @param {Array|string} path The path of the property to get.
15663
     * @param {*} srcValue The value to match.
15664
     * @returns {Function} Returns the new spec function.
15665
     * @example
15666
     *
15667
     * var objects = [
15668
     *   { 'a': 1, 'b': 2, 'c': 3 },
15669
     *   { 'a': 4, 'b': 5, 'c': 6 }
15670
     * ];
15671
     *
15672
     * _.find(objects, _.matchesProperty('a', 4));
15673
     * // => { 'a': 4, 'b': 5, 'c': 6 }
15674
     *
15675
     * // Checking for several possible values
15676
     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));
15677
     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]
15678
     */
15679
    function matchesProperty(path, srcValue) {
15680
      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
15681
    }
15682
15683
    /**
15684
     * Creates a function that invokes the method at `path` of a given object.
15685
     * Any additional arguments are provided to the invoked method.
15686
     *
15687
     * @static
15688
     * @memberOf _
15689
     * @since 3.7.0
15690
     * @category Util
15691
     * @param {Array|string} path The path of the method to invoke.
15692
     * @param {...*} [args] The arguments to invoke the method with.
15693
     * @returns {Function} Returns the new invoker function.
15694
     * @example
15695
     *
15696
     * var objects = [
15697
     *   { 'a': { 'b': _.constant(2) } },
15698
     *   { 'a': { 'b': _.constant(1) } }
15699
     * ];
15700
     *
15701
     * _.map(objects, _.method('a.b'));
15702
     * // => [2, 1]
15703
     *
15704
     * _.map(objects, _.method(['a', 'b']));
15705
     * // => [2, 1]
15706
     */
15707
    var method = baseRest(function(path, args) {
15708
      return function(object) {
15709
        return baseInvoke(object, path, args);
15710
      };
15711
    });
15712
15713
    /**
15714
     * The opposite of `_.method`; this method creates a function that invokes
15715
     * the method at a given path of `object`. Any additional arguments are
15716
     * provided to the invoked method.
15717
     *
15718
     * @static
15719
     * @memberOf _
15720
     * @since 3.7.0
15721
     * @category Util
15722
     * @param {Object} object The object to query.
15723
     * @param {...*} [args] The arguments to invoke the method with.
15724
     * @returns {Function} Returns the new invoker function.
15725
     * @example
15726
     *
15727
     * var array = _.times(3, _.constant),
15728
     *     object = { 'a': array, 'b': array, 'c': array };
15729
     *
15730
     * _.map(['a[2]', 'c[0]'], _.methodOf(object));
15731
     * // => [2, 0]
15732
     *
15733
     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));
15734
     * // => [2, 0]
15735
     */
15736
    var methodOf = baseRest(function(object, args) {
15737
      return function(path) {
15738
        return baseInvoke(object, path, args);
15739
      };
15740
    });
15741
15742
    /**
15743
     * Adds all own enumerable string keyed function properties of a source
15744
     * object to the destination object. If `object` is a function, then methods
15745
     * are added to its prototype as well.
15746
     *
15747
     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to
15748
     * avoid conflicts caused by modifying the original.
15749
     *
15750
     * @static
15751
     * @since 0.1.0
15752
     * @memberOf _
15753
     * @category Util
15754
     * @param {Function|Object} [object=lodash] The destination object.
15755
     * @param {Object} source The object of functions to add.
15756
     * @param {Object} [options={}] The options object.
15757
     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.
15758
     * @returns {Function|Object} Returns `object`.
15759
     * @example
15760
     *
15761
     * function vowels(string) {
15762
     *   return _.filter(string, function(v) {
15763
     *     return /[aeiou]/i.test(v);
15764
     *   });
15765
     * }
15766
     *
15767
     * _.mixin({ 'vowels': vowels });
15768
     * _.vowels('fred');
15769
     * // => ['e']
15770
     *
15771
     * _('fred').vowels().value();
15772
     * // => ['e']
15773
     *
15774
     * _.mixin({ 'vowels': vowels }, { 'chain': false });
15775
     * _('fred').vowels();
15776
     * // => ['e']
15777
     */
15778
    function mixin(object, source, options) {
15779
      var props = keys(source),
15780
          methodNames = baseFunctions(source, props);
15781
15782
      if (options == null &&
15783
          !(isObject(source) && (methodNames.length || !props.length))) {
15784
        options = source;
15785
        source = object;
15786
        object = this;
15787
        methodNames = baseFunctions(source, keys(source));
15788
      }
15789
      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,
15790
          isFunc = isFunction(object);
15791
15792
      arrayEach(methodNames, function(methodName) {
15793
        var func = source[methodName];
15794
        object[methodName] = func;
15795
        if (isFunc) {
15796
          object.prototype[methodName] = function() {
15797
            var chainAll = this.__chain__;
15798
            if (chain || chainAll) {
15799
              var result = object(this.__wrapped__),
15800
                  actions = result.__actions__ = copyArray(this.__actions__);
15801
15802
              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });
15803
              result.__chain__ = chainAll;
15804
              return result;
15805
            }
15806
            return func.apply(object, arrayPush([this.value()], arguments));
15807
          };
15808
        }
15809
      });
15810
15811
      return object;
15812
    }
15813
15814
    /**
15815
     * Reverts the `_` variable to its previous value and returns a reference to
15816
     * the `lodash` function.
15817
     *
15818
     * @static
15819
     * @since 0.1.0
15820
     * @memberOf _
15821
     * @category Util
15822
     * @returns {Function} Returns the `lodash` function.
15823
     * @example
15824
     *
15825
     * var lodash = _.noConflict();
15826
     */
15827
    function noConflict() {
15828
      if (root._ === this) {
15829
        root._ = oldDash;
15830
      }
15831
      return this;
15832
    }
15833
15834
    /**
15835
     * This method returns `undefined`.
15836
     *
15837
     * @static
15838
     * @memberOf _
15839
     * @since 2.3.0
15840
     * @category Util
15841
     * @example
15842
     *
15843
     * _.times(2, _.noop);
15844
     * // => [undefined, undefined]
15845
     */
15846
    function noop() {
15847
      // No operation performed.
15848
    }
15849
15850
    /**
15851
     * Creates a function that gets the argument at index `n`. If `n` is negative,
15852
     * the nth argument from the end is returned.
15853
     *
15854
     * @static
15855
     * @memberOf _
15856
     * @since 4.0.0
15857
     * @category Util
15858
     * @param {number} [n=0] The index of the argument to return.
15859
     * @returns {Function} Returns the new pass-thru function.
15860
     * @example
15861
     *
15862
     * var func = _.nthArg(1);
15863
     * func('a', 'b', 'c', 'd');
15864
     * // => 'b'
15865
     *
15866
     * var func = _.nthArg(-2);
15867
     * func('a', 'b', 'c', 'd');
15868
     * // => 'c'
15869
     */
15870
    function nthArg(n) {
15871
      n = toInteger(n);
15872
      return baseRest(function(args) {
15873
        return baseNth(args, n);
15874
      });
15875
    }
15876
15877
    /**
15878
     * Creates a function that invokes `iteratees` with the arguments it receives
15879
     * and returns their results.
15880
     *
15881
     * @static
15882
     * @memberOf _
15883
     * @since 4.0.0
15884
     * @category Util
15885
     * @param {...(Function|Function[])} [iteratees=[_.identity]]
15886
     *  The iteratees to invoke.
15887
     * @returns {Function} Returns the new function.
15888
     * @example
15889
     *
15890
     * var func = _.over([Math.max, Math.min]);
15891
     *
15892
     * func(1, 2, 3, 4);
15893
     * // => [4, 1]
15894
     */
15895
    var over = createOver(arrayMap);
15896
15897
    /**
15898
     * Creates a function that checks if **all** of the `predicates` return
15899
     * truthy when invoked with the arguments it receives.
15900
     *
15901
     * Following shorthands are possible for providing predicates.
15902
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
15903
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
15904
     *
15905
     * @static
15906
     * @memberOf _
15907
     * @since 4.0.0
15908
     * @category Util
15909
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15910
     *  The predicates to check.
15911
     * @returns {Function} Returns the new function.
15912
     * @example
15913
     *
15914
     * var func = _.overEvery([Boolean, isFinite]);
15915
     *
15916
     * func('1');
15917
     * // => true
15918
     *
15919
     * func(null);
15920
     * // => false
15921
     *
15922
     * func(NaN);
15923
     * // => false
15924
     */
15925
    var overEvery = createOver(arrayEvery);
15926
15927
    /**
15928
     * Creates a function that checks if **any** of the `predicates` return
15929
     * truthy when invoked with the arguments it receives.
15930
     *
15931
     * Following shorthands are possible for providing predicates.
15932
     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.
15933
     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.
15934
     *
15935
     * @static
15936
     * @memberOf _
15937
     * @since 4.0.0
15938
     * @category Util
15939
     * @param {...(Function|Function[])} [predicates=[_.identity]]
15940
     *  The predicates to check.
15941
     * @returns {Function} Returns the new function.
15942
     * @example
15943
     *
15944
     * var func = _.overSome([Boolean, isFinite]);
15945
     *
15946
     * func('1');
15947
     * // => true
15948
     *
15949
     * func(null);
15950
     * // => true
15951
     *
15952
     * func(NaN);
15953
     * // => false
15954
     *
15955
     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])
15956
     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])
15957
     */
15958
    var overSome = createOver(arraySome);
15959
15960
    /**
15961
     * Creates a function that returns the value at `path` of a given object.
15962
     *
15963
     * @static
15964
     * @memberOf _
15965
     * @since 2.4.0
15966
     * @category Util
15967
     * @param {Array|string} path The path of the property to get.
15968
     * @returns {Function} Returns the new accessor function.
15969
     * @example
15970
     *
15971
     * var objects = [
15972
     *   { 'a': { 'b': 2 } },
15973
     *   { 'a': { 'b': 1 } }
15974
     * ];
15975
     *
15976
     * _.map(objects, _.property('a.b'));
15977
     * // => [2, 1]
15978
     *
15979
     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
15980
     * // => [1, 2]
15981
     */
15982
    function property(path) {
15983
      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
15984
    }
15985
15986
    /**
15987
     * The opposite of `_.property`; this method creates a function that returns
15988
     * the value at a given path of `object`.
15989
     *
15990
     * @static
15991
     * @memberOf _
15992
     * @since 3.0.0
15993
     * @category Util
15994
     * @param {Object} object The object to query.
15995
     * @returns {Function} Returns the new accessor function.
15996
     * @example
15997
     *
15998
     * var array = [0, 1, 2],
15999
     *     object = { 'a': array, 'b': array, 'c': array };
16000
     *
16001
     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));
16002
     * // => [2, 0]
16003
     *
16004
     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));
16005
     * // => [2, 0]
16006
     */
16007
    function propertyOf(object) {
16008
      return function(path) {
16009
        return object == null ? undefined : baseGet(object, path);
16010
      };
16011
    }
16012
16013
    /**
16014
     * Creates an array of numbers (positive and/or negative) progressing from
16015
     * `start` up to, but not including, `end`. A step of `-1` is used if a negative
16016
     * `start` is specified without an `end` or `step`. If `end` is not specified,
16017
     * it's set to `start` with `start` then set to `0`.
16018
     *
16019
     * **Note:** JavaScript follows the IEEE-754 standard for resolving
16020
     * floating-point values which can produce unexpected results.
16021
     *
16022
     * @static
16023
     * @since 0.1.0
16024
     * @memberOf _
16025
     * @category Util
16026
     * @param {number} [start=0] The start of the range.
16027
     * @param {number} end The end of the range.
16028
     * @param {number} [step=1] The value to increment or decrement by.
16029
     * @returns {Array} Returns the range of numbers.
16030
     * @see _.inRange, _.rangeRight
16031
     * @example
16032
     *
16033
     * _.range(4);
16034
     * // => [0, 1, 2, 3]
16035
     *
16036
     * _.range(-4);
16037
     * // => [0, -1, -2, -3]
16038
     *
16039
     * _.range(1, 5);
16040
     * // => [1, 2, 3, 4]
16041
     *
16042
     * _.range(0, 20, 5);
16043
     * // => [0, 5, 10, 15]
16044
     *
16045
     * _.range(0, -4, -1);
16046
     * // => [0, -1, -2, -3]
16047
     *
16048
     * _.range(1, 4, 0);
16049
     * // => [1, 1, 1]
16050
     *
16051
     * _.range(0);
16052
     * // => []
16053
     */
16054
    var range = createRange();
16055
16056
    /**
16057
     * This method is like `_.range` except that it populates values in
16058
     * descending order.
16059
     *
16060
     * @static
16061
     * @memberOf _
16062
     * @since 4.0.0
16063
     * @category Util
16064
     * @param {number} [start=0] The start of the range.
16065
     * @param {number} end The end of the range.
16066
     * @param {number} [step=1] The value to increment or decrement by.
16067
     * @returns {Array} Returns the range of numbers.
16068
     * @see _.inRange, _.range
16069
     * @example
16070
     *
16071
     * _.rangeRight(4);
16072
     * // => [3, 2, 1, 0]
16073
     *
16074
     * _.rangeRight(-4);
16075
     * // => [-3, -2, -1, 0]
16076
     *
16077
     * _.rangeRight(1, 5);
16078
     * // => [4, 3, 2, 1]
16079
     *
16080
     * _.rangeRight(0, 20, 5);
16081
     * // => [15, 10, 5, 0]
16082
     *
16083
     * _.rangeRight(0, -4, -1);
16084
     * // => [-3, -2, -1, 0]
16085
     *
16086
     * _.rangeRight(1, 4, 0);
16087
     * // => [1, 1, 1]
16088
     *
16089
     * _.rangeRight(0);
16090
     * // => []
16091
     */
16092
    var rangeRight = createRange(true);
16093
16094
    /**
16095
     * This method returns a new empty array.
16096
     *
16097
     * @static
16098
     * @memberOf _
16099
     * @since 4.13.0
16100
     * @category Util
16101
     * @returns {Array} Returns the new empty array.
16102
     * @example
16103
     *
16104
     * var arrays = _.times(2, _.stubArray);
16105
     *
16106
     * console.log(arrays);
16107
     * // => [[], []]
16108
     *
16109
     * console.log(arrays[0] === arrays[1]);
16110
     * // => false
16111
     */
16112
    function stubArray() {
16113
      return [];
16114
    }
16115
16116
    /**
16117
     * This method returns `false`.
16118
     *
16119
     * @static
16120
     * @memberOf _
16121
     * @since 4.13.0
16122
     * @category Util
16123
     * @returns {boolean} Returns `false`.
16124
     * @example
16125
     *
16126
     * _.times(2, _.stubFalse);
16127
     * // => [false, false]
16128
     */
16129
    function stubFalse() {
16130
      return false;
16131
    }
16132
16133
    /**
16134
     * This method returns a new empty object.
16135
     *
16136
     * @static
16137
     * @memberOf _
16138
     * @since 4.13.0
16139
     * @category Util
16140
     * @returns {Object} Returns the new empty object.
16141
     * @example
16142
     *
16143
     * var objects = _.times(2, _.stubObject);
16144
     *
16145
     * console.log(objects);
16146
     * // => [{}, {}]
16147
     *
16148
     * console.log(objects[0] === objects[1]);
16149
     * // => false
16150
     */
16151
    function stubObject() {
16152
      return {};
16153
    }
16154
16155
    /**
16156
     * This method returns an empty string.
16157
     *
16158
     * @static
16159
     * @memberOf _
16160
     * @since 4.13.0
16161
     * @category Util
16162
     * @returns {string} Returns the empty string.
16163
     * @example
16164
     *
16165
     * _.times(2, _.stubString);
16166
     * // => ['', '']
16167
     */
16168
    function stubString() {
16169
      return '';
16170
    }
16171
16172
    /**
16173
     * This method returns `true`.
16174
     *
16175
     * @static
16176
     * @memberOf _
16177
     * @since 4.13.0
16178
     * @category Util
16179
     * @returns {boolean} Returns `true`.
16180
     * @example
16181
     *
16182
     * _.times(2, _.stubTrue);
16183
     * // => [true, true]
16184
     */
16185
    function stubTrue() {
16186
      return true;
16187
    }
16188
16189
    /**
16190
     * Invokes the iteratee `n` times, returning an array of the results of
16191
     * each invocation. The iteratee is invoked with one argument; (index).
16192
     *
16193
     * @static
16194
     * @since 0.1.0
16195
     * @memberOf _
16196
     * @category Util
16197
     * @param {number} n The number of times to invoke `iteratee`.
16198
     * @param {Function} [iteratee=_.identity] The function invoked per iteration.
16199
     * @returns {Array} Returns the array of results.
16200
     * @example
16201
     *
16202
     * _.times(3, String);
16203
     * // => ['0', '1', '2']
16204
     *
16205
     *  _.times(4, _.constant(0));
16206
     * // => [0, 0, 0, 0]
16207
     */
16208
    function times(n, iteratee) {
16209
      n = toInteger(n);
16210
      if (n < 1 || n > MAX_SAFE_INTEGER) {
16211
        return [];
16212
      }
16213
      var index = MAX_ARRAY_LENGTH,
16214
          length = nativeMin(n, MAX_ARRAY_LENGTH);
16215
16216
      iteratee = getIteratee(iteratee);
16217
      n -= MAX_ARRAY_LENGTH;
16218
16219
      var result = baseTimes(length, iteratee);
16220
      while (++index < n) {
16221
        iteratee(index);
16222
      }
16223
      return result;
16224
    }
16225
16226
    /**
16227
     * Converts `value` to a property path array.
16228
     *
16229
     * @static
16230
     * @memberOf _
16231
     * @since 4.0.0
16232
     * @category Util
16233
     * @param {*} value The value to convert.
16234
     * @returns {Array} Returns the new property path array.
16235
     * @example
16236
     *
16237
     * _.toPath('a.b.c');
16238
     * // => ['a', 'b', 'c']
16239
     *
16240
     * _.toPath('a[0].b.c');
16241
     * // => ['a', '0', 'b', 'c']
16242
     */
16243
    function toPath(value) {
16244
      if (isArray(value)) {
16245
        return arrayMap(value, toKey);
16246
      }
16247
      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));
16248
    }
16249
16250
    /**
16251
     * Generates a unique ID. If `prefix` is given, the ID is appended to it.
16252
     *
16253
     * @static
16254
     * @since 0.1.0
16255
     * @memberOf _
16256
     * @category Util
16257
     * @param {string} [prefix=''] The value to prefix the ID with.
16258
     * @returns {string} Returns the unique ID.
16259
     * @example
16260
     *
16261
     * _.uniqueId('contact_');
16262
     * // => 'contact_104'
16263
     *
16264
     * _.uniqueId();
16265
     * // => '105'
16266
     */
16267
    function uniqueId(prefix) {
16268
      var id = ++idCounter;
16269
      return toString(prefix) + id;
16270
    }
16271
16272
    /*------------------------------------------------------------------------*/
16273
16274
    /**
16275
     * Adds two numbers.
16276
     *
16277
     * @static
16278
     * @memberOf _
16279
     * @since 3.4.0
16280
     * @category Math
16281
     * @param {number} augend The first number in an addition.
16282
     * @param {number} addend The second number in an addition.
16283
     * @returns {number} Returns the total.
16284
     * @example
16285
     *
16286
     * _.add(6, 4);
16287
     * // => 10
16288
     */
16289
    var add = createMathOperation(function(augend, addend) {
16290
      return augend + addend;
16291
    }, 0);
16292
16293
    /**
16294
     * Computes `number` rounded up to `precision`.
16295
     *
16296
     * @static
16297
     * @memberOf _
16298
     * @since 3.10.0
16299
     * @category Math
16300
     * @param {number} number The number to round up.
16301
     * @param {number} [precision=0] The precision to round up to.
16302
     * @returns {number} Returns the rounded up number.
16303
     * @example
16304
     *
16305
     * _.ceil(4.006);
16306
     * // => 5
16307
     *
16308
     * _.ceil(6.004, 2);
16309
     * // => 6.01
16310
     *
16311
     * _.ceil(6040, -2);
16312
     * // => 6100
16313
     */
16314
    var ceil = createRound('ceil');
16315
16316
    /**
16317
     * Divide two numbers.
16318
     *
16319
     * @static
16320
     * @memberOf _
16321
     * @since 4.7.0
16322
     * @category Math
16323
     * @param {number} dividend The first number in a division.
16324
     * @param {number} divisor The second number in a division.
16325
     * @returns {number} Returns the quotient.
16326
     * @example
16327
     *
16328
     * _.divide(6, 4);
16329
     * // => 1.5
16330
     */
16331
    var divide = createMathOperation(function(dividend, divisor) {
16332
      return dividend / divisor;
16333
    }, 1);
16334
16335
    /**
16336
     * Computes `number` rounded down to `precision`.
16337
     *
16338
     * @static
16339
     * @memberOf _
16340
     * @since 3.10.0
16341
     * @category Math
16342
     * @param {number} number The number to round down.
16343
     * @param {number} [precision=0] The precision to round down to.
16344
     * @returns {number} Returns the rounded down number.
16345
     * @example
16346
     *
16347
     * _.floor(4.006);
16348
     * // => 4
16349
     *
16350
     * _.floor(0.046, 2);
16351
     * // => 0.04
16352
     *
16353
     * _.floor(4060, -2);
16354
     * // => 4000
16355
     */
16356
    var floor = createRound('floor');
16357
16358
    /**
16359
     * Computes the maximum value of `array`. If `array` is empty or falsey,
16360
     * `undefined` is returned.
16361
     *
16362
     * @static
16363
     * @since 0.1.0
16364
     * @memberOf _
16365
     * @category Math
16366
     * @param {Array} array The array to iterate over.
16367
     * @returns {*} Returns the maximum value.
16368
     * @example
16369
     *
16370
     * _.max([4, 2, 8, 6]);
16371
     * // => 8
16372
     *
16373
     * _.max([]);
16374
     * // => undefined
16375
     */
16376
    function max(array) {
16377
      return (array && array.length)
16378
        ? baseExtremum(array, identity, baseGt)
16379
        : undefined;
16380
    }
16381
16382
    /**
16383
     * This method is like `_.max` except that it accepts `iteratee` which is
16384
     * invoked for each element in `array` to generate the criterion by which
16385
     * the value is ranked. The iteratee is invoked with one argument: (value).
16386
     *
16387
     * @static
16388
     * @memberOf _
16389
     * @since 4.0.0
16390
     * @category Math
16391
     * @param {Array} array The array to iterate over.
16392
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16393
     * @returns {*} Returns the maximum value.
16394
     * @example
16395
     *
16396
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16397
     *
16398
     * _.maxBy(objects, function(o) { return o.n; });
16399
     * // => { 'n': 2 }
16400
     *
16401
     * // The `_.property` iteratee shorthand.
16402
     * _.maxBy(objects, 'n');
16403
     * // => { 'n': 2 }
16404
     */
16405
    function maxBy(array, iteratee) {
16406
      return (array && array.length)
16407
        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)
16408
        : undefined;
16409
    }
16410
16411
    /**
16412
     * Computes the mean of the values in `array`.
16413
     *
16414
     * @static
16415
     * @memberOf _
16416
     * @since 4.0.0
16417
     * @category Math
16418
     * @param {Array} array The array to iterate over.
16419
     * @returns {number} Returns the mean.
16420
     * @example
16421
     *
16422
     * _.mean([4, 2, 8, 6]);
16423
     * // => 5
16424
     */
16425
    function mean(array) {
16426
      return baseMean(array, identity);
16427
    }
16428
16429
    /**
16430
     * This method is like `_.mean` except that it accepts `iteratee` which is
16431
     * invoked for each element in `array` to generate the value to be averaged.
16432
     * The iteratee is invoked with one argument: (value).
16433
     *
16434
     * @static
16435
     * @memberOf _
16436
     * @since 4.7.0
16437
     * @category Math
16438
     * @param {Array} array The array to iterate over.
16439
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16440
     * @returns {number} Returns the mean.
16441
     * @example
16442
     *
16443
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16444
     *
16445
     * _.meanBy(objects, function(o) { return o.n; });
16446
     * // => 5
16447
     *
16448
     * // The `_.property` iteratee shorthand.
16449
     * _.meanBy(objects, 'n');
16450
     * // => 5
16451
     */
16452
    function meanBy(array, iteratee) {
16453
      return baseMean(array, getIteratee(iteratee, 2));
16454
    }
16455
16456
    /**
16457
     * Computes the minimum value of `array`. If `array` is empty or falsey,
16458
     * `undefined` is returned.
16459
     *
16460
     * @static
16461
     * @since 0.1.0
16462
     * @memberOf _
16463
     * @category Math
16464
     * @param {Array} array The array to iterate over.
16465
     * @returns {*} Returns the minimum value.
16466
     * @example
16467
     *
16468
     * _.min([4, 2, 8, 6]);
16469
     * // => 2
16470
     *
16471
     * _.min([]);
16472
     * // => undefined
16473
     */
16474
    function min(array) {
16475
      return (array && array.length)
16476
        ? baseExtremum(array, identity, baseLt)
16477
        : undefined;
16478
    }
16479
16480
    /**
16481
     * This method is like `_.min` except that it accepts `iteratee` which is
16482
     * invoked for each element in `array` to generate the criterion by which
16483
     * the value is ranked. The iteratee is invoked with one argument: (value).
16484
     *
16485
     * @static
16486
     * @memberOf _
16487
     * @since 4.0.0
16488
     * @category Math
16489
     * @param {Array} array The array to iterate over.
16490
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16491
     * @returns {*} Returns the minimum value.
16492
     * @example
16493
     *
16494
     * var objects = [{ 'n': 1 }, { 'n': 2 }];
16495
     *
16496
     * _.minBy(objects, function(o) { return o.n; });
16497
     * // => { 'n': 1 }
16498
     *
16499
     * // The `_.property` iteratee shorthand.
16500
     * _.minBy(objects, 'n');
16501
     * // => { 'n': 1 }
16502
     */
16503
    function minBy(array, iteratee) {
16504
      return (array && array.length)
16505
        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)
16506
        : undefined;
16507
    }
16508
16509
    /**
16510
     * Multiply two numbers.
16511
     *
16512
     * @static
16513
     * @memberOf _
16514
     * @since 4.7.0
16515
     * @category Math
16516
     * @param {number} multiplier The first number in a multiplication.
16517
     * @param {number} multiplicand The second number in a multiplication.
16518
     * @returns {number} Returns the product.
16519
     * @example
16520
     *
16521
     * _.multiply(6, 4);
16522
     * // => 24
16523
     */
16524
    var multiply = createMathOperation(function(multiplier, multiplicand) {
16525
      return multiplier * multiplicand;
16526
    }, 1);
16527
16528
    /**
16529
     * Computes `number` rounded to `precision`.
16530
     *
16531
     * @static
16532
     * @memberOf _
16533
     * @since 3.10.0
16534
     * @category Math
16535
     * @param {number} number The number to round.
16536
     * @param {number} [precision=0] The precision to round to.
16537
     * @returns {number} Returns the rounded number.
16538
     * @example
16539
     *
16540
     * _.round(4.006);
16541
     * // => 4
16542
     *
16543
     * _.round(4.006, 2);
16544
     * // => 4.01
16545
     *
16546
     * _.round(4060, -2);
16547
     * // => 4100
16548
     */
16549
    var round = createRound('round');
16550
16551
    /**
16552
     * Subtract two numbers.
16553
     *
16554
     * @static
16555
     * @memberOf _
16556
     * @since 4.0.0
16557
     * @category Math
16558
     * @param {number} minuend The first number in a subtraction.
16559
     * @param {number} subtrahend The second number in a subtraction.
16560
     * @returns {number} Returns the difference.
16561
     * @example
16562
     *
16563
     * _.subtract(6, 4);
16564
     * // => 2
16565
     */
16566
    var subtract = createMathOperation(function(minuend, subtrahend) {
16567
      return minuend - subtrahend;
16568
    }, 0);
16569
16570
    /**
16571
     * Computes the sum of the values in `array`.
16572
     *
16573
     * @static
16574
     * @memberOf _
16575
     * @since 3.4.0
16576
     * @category Math
16577
     * @param {Array} array The array to iterate over.
16578
     * @returns {number} Returns the sum.
16579
     * @example
16580
     *
16581
     * _.sum([4, 2, 8, 6]);
16582
     * // => 20
16583
     */
16584
    function sum(array) {
16585
      return (array && array.length)
16586
        ? baseSum(array, identity)
16587
        : 0;
16588
    }
16589
16590
    /**
16591
     * This method is like `_.sum` except that it accepts `iteratee` which is
16592
     * invoked for each element in `array` to generate the value to be summed.
16593
     * The iteratee is invoked with one argument: (value).
16594
     *
16595
     * @static
16596
     * @memberOf _
16597
     * @since 4.0.0
16598
     * @category Math
16599
     * @param {Array} array The array to iterate over.
16600
     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
16601
     * @returns {number} Returns the sum.
16602
     * @example
16603
     *
16604
     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
16605
     *
16606
     * _.sumBy(objects, function(o) { return o.n; });
16607
     * // => 20
16608
     *
16609
     * // The `_.property` iteratee shorthand.
16610
     * _.sumBy(objects, 'n');
16611
     * // => 20
16612
     */
16613
    function sumBy(array, iteratee) {
16614
      return (array && array.length)
16615
        ? baseSum(array, getIteratee(iteratee, 2))
16616
        : 0;
16617
    }
16618
16619
    /*------------------------------------------------------------------------*/
16620
16621
    // Add methods that return wrapped values in chain sequences.
16622
    lodash.after = after;
16623
    lodash.ary = ary;
16624
    lodash.assign = assign;
16625
    lodash.assignIn = assignIn;
16626
    lodash.assignInWith = assignInWith;
16627
    lodash.assignWith = assignWith;
16628
    lodash.at = at;
16629
    lodash.before = before;
16630
    lodash.bind = bind;
16631
    lodash.bindAll = bindAll;
16632
    lodash.bindKey = bindKey;
16633
    lodash.castArray = castArray;
16634
    lodash.chain = chain;
16635
    lodash.chunk = chunk;
16636
    lodash.compact = compact;
16637
    lodash.concat = concat;
16638
    lodash.cond = cond;
16639
    lodash.conforms = conforms;
16640
    lodash.constant = constant;
16641
    lodash.countBy = countBy;
16642
    lodash.create = create;
16643
    lodash.curry = curry;
16644
    lodash.curryRight = curryRight;
16645
    lodash.debounce = debounce;
16646
    lodash.defaults = defaults;
16647
    lodash.defaultsDeep = defaultsDeep;
16648
    lodash.defer = defer;
16649
    lodash.delay = delay;
16650
    lodash.difference = difference;
16651
    lodash.differenceBy = differenceBy;
16652
    lodash.differenceWith = differenceWith;
16653
    lodash.drop = drop;
16654
    lodash.dropRight = dropRight;
16655
    lodash.dropRightWhile = dropRightWhile;
16656
    lodash.dropWhile = dropWhile;
16657
    lodash.fill = fill;
16658
    lodash.filter = filter;
16659
    lodash.flatMap = flatMap;
16660
    lodash.flatMapDeep = flatMapDeep;
16661
    lodash.flatMapDepth = flatMapDepth;
16662
    lodash.flatten = flatten;
16663
    lodash.flattenDeep = flattenDeep;
16664
    lodash.flattenDepth = flattenDepth;
16665
    lodash.flip = flip;
16666
    lodash.flow = flow;
16667
    lodash.flowRight = flowRight;
16668
    lodash.fromPairs = fromPairs;
16669
    lodash.functions = functions;
16670
    lodash.functionsIn = functionsIn;
16671
    lodash.groupBy = groupBy;
16672
    lodash.initial = initial;
16673
    lodash.intersection = intersection;
16674
    lodash.intersectionBy = intersectionBy;
16675
    lodash.intersectionWith = intersectionWith;
16676
    lodash.invert = invert;
16677
    lodash.invertBy = invertBy;
16678
    lodash.invokeMap = invokeMap;
16679
    lodash.iteratee = iteratee;
16680
    lodash.keyBy = keyBy;
16681
    lodash.keys = keys;
16682
    lodash.keysIn = keysIn;
16683
    lodash.map = map;
16684
    lodash.mapKeys = mapKeys;
16685
    lodash.mapValues = mapValues;
16686
    lodash.matches = matches;
16687
    lodash.matchesProperty = matchesProperty;
16688
    lodash.memoize = memoize;
16689
    lodash.merge = merge;
16690
    lodash.mergeWith = mergeWith;
16691
    lodash.method = method;
16692
    lodash.methodOf = methodOf;
16693
    lodash.mixin = mixin;
16694
    lodash.negate = negate;
16695
    lodash.nthArg = nthArg;
16696
    lodash.omit = omit;
16697
    lodash.omitBy = omitBy;
16698
    lodash.once = once;
16699
    lodash.orderBy = orderBy;
16700
    lodash.over = over;
16701
    lodash.overArgs = overArgs;
16702
    lodash.overEvery = overEvery;
16703
    lodash.overSome = overSome;
16704
    lodash.partial = partial;
16705
    lodash.partialRight = partialRight;
16706
    lodash.partition = partition;
16707
    lodash.pick = pick;
16708
    lodash.pickBy = pickBy;
16709
    lodash.property = property;
16710
    lodash.propertyOf = propertyOf;
16711
    lodash.pull = pull;
16712
    lodash.pullAll = pullAll;
16713
    lodash.pullAllBy = pullAllBy;
16714
    lodash.pullAllWith = pullAllWith;
16715
    lodash.pullAt = pullAt;
16716
    lodash.range = range;
16717
    lodash.rangeRight = rangeRight;
16718
    lodash.rearg = rearg;
16719
    lodash.reject = reject;
16720
    lodash.remove = remove;
16721
    lodash.rest = rest;
16722
    lodash.reverse = reverse;
16723
    lodash.sampleSize = sampleSize;
16724
    lodash.set = set;
16725
    lodash.setWith = setWith;
16726
    lodash.shuffle = shuffle;
16727
    lodash.slice = slice;
16728
    lodash.sortBy = sortBy;
16729
    lodash.sortedUniq = sortedUniq;
16730
    lodash.sortedUniqBy = sortedUniqBy;
16731
    lodash.split = split;
16732
    lodash.spread = spread;
16733
    lodash.tail = tail;
16734
    lodash.take = take;
16735
    lodash.takeRight = takeRight;
16736
    lodash.takeRightWhile = takeRightWhile;
16737
    lodash.takeWhile = takeWhile;
16738
    lodash.tap = tap;
16739
    lodash.throttle = throttle;
16740
    lodash.thru = thru;
16741
    lodash.toArray = toArray;
16742
    lodash.toPairs = toPairs;
16743
    lodash.toPairsIn = toPairsIn;
16744
    lodash.toPath = toPath;
16745
    lodash.toPlainObject = toPlainObject;
16746
    lodash.transform = transform;
16747
    lodash.unary = unary;
16748
    lodash.union = union;
16749
    lodash.unionBy = unionBy;
16750
    lodash.unionWith = unionWith;
16751
    lodash.uniq = uniq;
16752
    lodash.uniqBy = uniqBy;
16753
    lodash.uniqWith = uniqWith;
16754
    lodash.unset = unset;
16755
    lodash.unzip = unzip;
16756
    lodash.unzipWith = unzipWith;
16757
    lodash.update = update;
16758
    lodash.updateWith = updateWith;
16759
    lodash.values = values;
16760
    lodash.valuesIn = valuesIn;
16761
    lodash.without = without;
16762
    lodash.words = words;
16763
    lodash.wrap = wrap;
16764
    lodash.xor = xor;
16765
    lodash.xorBy = xorBy;
16766
    lodash.xorWith = xorWith;
16767
    lodash.zip = zip;
16768
    lodash.zipObject = zipObject;
16769
    lodash.zipObjectDeep = zipObjectDeep;
16770
    lodash.zipWith = zipWith;
16771
16772
    // Add aliases.
16773
    lodash.entries = toPairs;
16774
    lodash.entriesIn = toPairsIn;
16775
    lodash.extend = assignIn;
16776
    lodash.extendWith = assignInWith;
16777
16778
    // Add methods to `lodash.prototype`.
16779
    mixin(lodash, lodash);
16780
16781
    /*------------------------------------------------------------------------*/
16782
16783
    // Add methods that return unwrapped values in chain sequences.
16784
    lodash.add = add;
16785
    lodash.attempt = attempt;
16786
    lodash.camelCase = camelCase;
16787
    lodash.capitalize = capitalize;
16788
    lodash.ceil = ceil;
16789
    lodash.clamp = clamp;
16790
    lodash.clone = clone;
16791
    lodash.cloneDeep = cloneDeep;
16792
    lodash.cloneDeepWith = cloneDeepWith;
16793
    lodash.cloneWith = cloneWith;
16794
    lodash.conformsTo = conformsTo;
16795
    lodash.deburr = deburr;
16796
    lodash.defaultTo = defaultTo;
16797
    lodash.divide = divide;
16798
    lodash.endsWith = endsWith;
16799
    lodash.eq = eq;
16800
    lodash.escape = escape;
16801
    lodash.escapeRegExp = escapeRegExp;
16802
    lodash.every = every;
16803
    lodash.find = find;
16804
    lodash.findIndex = findIndex;
16805
    lodash.findKey = findKey;
16806
    lodash.findLast = findLast;
16807
    lodash.findLastIndex = findLastIndex;
16808
    lodash.findLastKey = findLastKey;
16809
    lodash.floor = floor;
16810
    lodash.forEach = forEach;
16811
    lodash.forEachRight = forEachRight;
16812
    lodash.forIn = forIn;
16813
    lodash.forInRight = forInRight;
16814
    lodash.forOwn = forOwn;
16815
    lodash.forOwnRight = forOwnRight;
16816
    lodash.get = get;
16817
    lodash.gt = gt;
16818
    lodash.gte = gte;
16819
    lodash.has = has;
16820
    lodash.hasIn = hasIn;
16821
    lodash.head = head;
16822
    lodash.identity = identity;
16823
    lodash.includes = includes;
16824
    lodash.indexOf = indexOf;
16825
    lodash.inRange = inRange;
16826
    lodash.invoke = invoke;
16827
    lodash.isArguments = isArguments;
16828
    lodash.isArray = isArray;
16829
    lodash.isArrayBuffer = isArrayBuffer;
16830
    lodash.isArrayLike = isArrayLike;
16831
    lodash.isArrayLikeObject = isArrayLikeObject;
16832
    lodash.isBoolean = isBoolean;
16833
    lodash.isBuffer = isBuffer;
16834
    lodash.isDate = isDate;
16835
    lodash.isElement = isElement;
16836
    lodash.isEmpty = isEmpty;
16837
    lodash.isEqual = isEqual;
16838
    lodash.isEqualWith = isEqualWith;
16839
    lodash.isError = isError;
16840
    lodash.isFinite = isFinite;
16841
    lodash.isFunction = isFunction;
16842
    lodash.isInteger = isInteger;
16843
    lodash.isLength = isLength;
16844
    lodash.isMap = isMap;
16845
    lodash.isMatch = isMatch;
16846
    lodash.isMatchWith = isMatchWith;
16847
    lodash.isNaN = isNaN;
16848
    lodash.isNative = isNative;
16849
    lodash.isNil = isNil;
16850
    lodash.isNull = isNull;
16851
    lodash.isNumber = isNumber;
16852
    lodash.isObject = isObject;
16853
    lodash.isObjectLike = isObjectLike;
16854
    lodash.isPlainObject = isPlainObject;
16855
    lodash.isRegExp = isRegExp;
16856
    lodash.isSafeInteger = isSafeInteger;
16857
    lodash.isSet = isSet;
16858
    lodash.isString = isString;
16859
    lodash.isSymbol = isSymbol;
16860
    lodash.isTypedArray = isTypedArray;
16861
    lodash.isUndefined = isUndefined;
16862
    lodash.isWeakMap = isWeakMap;
16863
    lodash.isWeakSet = isWeakSet;
16864
    lodash.join = join;
16865
    lodash.kebabCase = kebabCase;
16866
    lodash.last = last;
16867
    lodash.lastIndexOf = lastIndexOf;
16868
    lodash.lowerCase = lowerCase;
16869
    lodash.lowerFirst = lowerFirst;
16870
    lodash.lt = lt;
16871
    lodash.lte = lte;
16872
    lodash.max = max;
16873
    lodash.maxBy = maxBy;
16874
    lodash.mean = mean;
16875
    lodash.meanBy = meanBy;
16876
    lodash.min = min;
16877
    lodash.minBy = minBy;
16878
    lodash.stubArray = stubArray;
16879
    lodash.stubFalse = stubFalse;
16880
    lodash.stubObject = stubObject;
16881
    lodash.stubString = stubString;
16882
    lodash.stubTrue = stubTrue;
16883
    lodash.multiply = multiply;
16884
    lodash.nth = nth;
16885
    lodash.noConflict = noConflict;
16886
    lodash.noop = noop;
16887
    lodash.now = now;
16888
    lodash.pad = pad;
16889
    lodash.padEnd = padEnd;
16890
    lodash.padStart = padStart;
16891
    lodash.parseInt = parseInt;
16892
    lodash.random = random;
16893
    lodash.reduce = reduce;
16894
    lodash.reduceRight = reduceRight;
16895
    lodash.repeat = repeat;
16896
    lodash.replace = replace;
16897
    lodash.result = result;
16898
    lodash.round = round;
16899
    lodash.runInContext = runInContext;
16900
    lodash.sample = sample;
16901
    lodash.size = size;
16902
    lodash.snakeCase = snakeCase;
16903
    lodash.some = some;
16904
    lodash.sortedIndex = sortedIndex;
16905
    lodash.sortedIndexBy = sortedIndexBy;
16906
    lodash.sortedIndexOf = sortedIndexOf;
16907
    lodash.sortedLastIndex = sortedLastIndex;
16908
    lodash.sortedLastIndexBy = sortedLastIndexBy;
16909
    lodash.sortedLastIndexOf = sortedLastIndexOf;
16910
    lodash.startCase = startCase;
16911
    lodash.startsWith = startsWith;
16912
    lodash.subtract = subtract;
16913
    lodash.sum = sum;
16914
    lodash.sumBy = sumBy;
16915
    lodash.template = template;
16916
    lodash.times = times;
16917
    lodash.toFinite = toFinite;
16918
    lodash.toInteger = toInteger;
16919
    lodash.toLength = toLength;
16920
    lodash.toLower = toLower;
16921
    lodash.toNumber = toNumber;
16922
    lodash.toSafeInteger = toSafeInteger;
16923
    lodash.toString = toString;
16924
    lodash.toUpper = toUpper;
16925
    lodash.trim = trim;
16926
    lodash.trimEnd = trimEnd;
16927
    lodash.trimStart = trimStart;
16928
    lodash.truncate = truncate;
16929
    lodash.unescape = unescape;
16930
    lodash.uniqueId = uniqueId;
16931
    lodash.upperCase = upperCase;
16932
    lodash.upperFirst = upperFirst;
16933
16934
    // Add aliases.
16935
    lodash.each = forEach;
16936
    lodash.eachRight = forEachRight;
16937
    lodash.first = head;
16938
16939
    mixin(lodash, (function() {
16940
      var source = {};
16941
      baseForOwn(lodash, function(func, methodName) {
16942
        if (!hasOwnProperty.call(lodash.prototype, methodName)) {
16943
          source[methodName] = func;
16944
        }
16945
      });
16946
      return source;
16947
    }()), { 'chain': false });
16948
16949
    /*------------------------------------------------------------------------*/
16950
16951
    /**
16952
     * The semantic version number.
16953
     *
16954
     * @static
16955
     * @memberOf _
16956
     * @type {string}
16957
     */
16958
    lodash.VERSION = VERSION;
16959
16960
    // Assign default placeholders.
16961
    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {
16962
      lodash[methodName].placeholder = lodash;
16963
    });
16964
16965
    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.
16966
    arrayEach(['drop', 'take'], function(methodName, index) {
16967
      LazyWrapper.prototype[methodName] = function(n) {
16968
        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);
16969
16970
        var result = (this.__filtered__ && !index)
16971
          ? new LazyWrapper(this)
16972
          : this.clone();
16973
16974
        if (result.__filtered__) {
16975
          result.__takeCount__ = nativeMin(n, result.__takeCount__);
16976
        } else {
16977
          result.__views__.push({
16978
            'size': nativeMin(n, MAX_ARRAY_LENGTH),
16979
            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')
16980
          });
16981
        }
16982
        return result;
16983
      };
16984
16985
      LazyWrapper.prototype[methodName + 'Right'] = function(n) {
16986
        return this.reverse()[methodName](n).reverse();
16987
      };
16988
    });
16989
16990
    // Add `LazyWrapper` methods that accept an `iteratee` value.
16991
    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {
16992
      var type = index + 1,
16993
          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
16994
16995
      LazyWrapper.prototype[methodName] = function(iteratee) {
16996
        var result = this.clone();
16997
        result.__iteratees__.push({
16998
          'iteratee': getIteratee(iteratee, 3),
16999
          'type': type
17000
        });
17001
        result.__filtered__ = result.__filtered__ || isFilter;
17002
        return result;
17003
      };
17004
    });
17005
17006
    // Add `LazyWrapper` methods for `_.head` and `_.last`.
17007
    arrayEach(['head', 'last'], function(methodName, index) {
17008
      var takeName = 'take' + (index ? 'Right' : '');
17009
17010
      LazyWrapper.prototype[methodName] = function() {
17011
        return this[takeName](1).value()[0];
17012
      };
17013
    });
17014
17015
    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.
17016
    arrayEach(['initial', 'tail'], function(methodName, index) {
17017
      var dropName = 'drop' + (index ? '' : 'Right');
17018
17019
      LazyWrapper.prototype[methodName] = function() {
17020
        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
17021
      };
17022
    });
17023
17024
    LazyWrapper.prototype.compact = function() {
17025
      return this.filter(identity);
17026
    };
17027
17028
    LazyWrapper.prototype.find = function(predicate) {
17029
      return this.filter(predicate).head();
17030
    };
17031
17032
    LazyWrapper.prototype.findLast = function(predicate) {
17033
      return this.reverse().find(predicate);
17034
    };
17035
17036
    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
17037
      if (typeof path == 'function') {
17038
        return new LazyWrapper(this);
17039
      }
17040
      return this.map(function(value) {
17041
        return baseInvoke(value, path, args);
17042
      });
17043
    });
17044
17045
    LazyWrapper.prototype.reject = function(predicate) {
17046
      return this.filter(negate(getIteratee(predicate)));
17047
    };
17048
17049
    LazyWrapper.prototype.slice = function(start, end) {
17050
      start = toInteger(start);
17051
17052
      var result = this;
17053
      if (result.__filtered__ && (start > 0 || end < 0)) {
17054
        return new LazyWrapper(result);
17055
      }
17056
      if (start < 0) {
17057
        result = result.takeRight(-start);
17058
      } else if (start) {
17059
        result = result.drop(start);
17060
      }
17061
      if (end !== undefined) {
17062
        end = toInteger(end);
17063
        result = end < 0 ? result.dropRight(-end) : result.take(end - start);
17064
      }
17065
      return result;
17066
    };
17067
17068
    LazyWrapper.prototype.takeRightWhile = function(predicate) {
17069
      return this.reverse().takeWhile(predicate).reverse();
17070
    };
17071
17072
    LazyWrapper.prototype.toArray = function() {
17073
      return this.take(MAX_ARRAY_LENGTH);
17074
    };
17075
17076
    // Add `LazyWrapper` methods to `lodash.prototype`.
17077
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17078
      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),
17079
          isTaker = /^(?:head|last)$/.test(methodName),
17080
          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],
17081
          retUnwrapped = isTaker || /^find/.test(methodName);
17082
17083
      if (!lodashFunc) {
17084
        return;
17085
      }
17086
      lodash.prototype[methodName] = function() {
17087
        var value = this.__wrapped__,
17088
            args = isTaker ? [1] : arguments,
17089
            isLazy = value instanceof LazyWrapper,
17090
            iteratee = args[0],
17091
            useLazy = isLazy || isArray(value);
17092
17093
        var interceptor = function(value) {
17094
          var result = lodashFunc.apply(lodash, arrayPush([value], args));
17095
          return (isTaker && chainAll) ? result[0] : result;
17096
        };
17097
17098
        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {
17099
          // Avoid lazy use if the iteratee has a "length" value other than `1`.
17100
          isLazy = useLazy = false;
17101
        }
17102
        var chainAll = this.__chain__,
17103
            isHybrid = !!this.__actions__.length,
17104
            isUnwrapped = retUnwrapped && !chainAll,
17105
            onlyLazy = isLazy && !isHybrid;
17106
17107
        if (!retUnwrapped && useLazy) {
17108
          value = onlyLazy ? value : new LazyWrapper(this);
17109
          var result = func.apply(value, args);
17110
          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });
17111
          return new LodashWrapper(result, chainAll);
17112
        }
17113
        if (isUnwrapped && onlyLazy) {
17114
          return func.apply(this, args);
17115
        }
17116
        result = this.thru(interceptor);
17117
        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;
17118
      };
17119
    });
17120
17121
    // Add `Array` methods to `lodash.prototype`.
17122
    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {
17123
      var func = arrayProto[methodName],
17124
          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',
17125
          retUnwrapped = /^(?:pop|shift)$/.test(methodName);
17126
17127
      lodash.prototype[methodName] = function() {
17128
        var args = arguments;
17129
        if (retUnwrapped && !this.__chain__) {
17130
          var value = this.value();
17131
          return func.apply(isArray(value) ? value : [], args);
17132
        }
17133
        return this[chainName](function(value) {
17134
          return func.apply(isArray(value) ? value : [], args);
17135
        });
17136
      };
17137
    });
17138
17139
    // Map minified method names to their real names.
17140
    baseForOwn(LazyWrapper.prototype, function(func, methodName) {
17141
      var lodashFunc = lodash[methodName];
17142
      if (lodashFunc) {
17143
        var key = lodashFunc.name + '';
17144
        if (!hasOwnProperty.call(realNames, key)) {
17145
          realNames[key] = [];
17146
        }
17147
        realNames[key].push({ 'name': methodName, 'func': lodashFunc });
17148
      }
17149
    });
17150
17151
    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{
17152
      'name': 'wrapper',
17153
      'func': undefined
17154
    }];
17155
17156
    // Add methods to `LazyWrapper`.
17157
    LazyWrapper.prototype.clone = lazyClone;
17158
    LazyWrapper.prototype.reverse = lazyReverse;
17159
    LazyWrapper.prototype.value = lazyValue;
17160
17161
    // Add chain sequence methods to the `lodash` wrapper.
17162
    lodash.prototype.at = wrapperAt;
17163
    lodash.prototype.chain = wrapperChain;
17164
    lodash.prototype.commit = wrapperCommit;
17165
    lodash.prototype.next = wrapperNext;
17166
    lodash.prototype.plant = wrapperPlant;
17167
    lodash.prototype.reverse = wrapperReverse;
17168
    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
17169
17170
    // Add lazy aliases.
17171
    lodash.prototype.first = lodash.prototype.head;
17172
17173
    if (symIterator) {
17174
      lodash.prototype[symIterator] = wrapperToIterator;
17175
    }
17176
    return lodash;
17177
  });
17178
17179
  /*--------------------------------------------------------------------------*/
17180
17181
  // Export lodash.
17182
  var _ = runInContext();
17183
17184
  // Some AMD build optimizers, like r.js, check for condition patterns like:
17185
  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
17186
    // Expose Lodash on the global object to prevent errors when Lodash is
17187
    // loaded by a script tag in the presence of an AMD loader.
17188
    // See http://requirejs.org/docs/errors.html#mismatch for more details.
17189
    // Use `_.noConflict` to remove Lodash from the global object.
17190
    root._ = _;
17191
17192
    // Define as an anonymous module so, through path mapping, it can be
17193
    // referenced as the "underscore" module.
17194
    define(function() {
17195
      return _;
17196
    });
17197
  }
17198
  // Check for `exports` after `define` in case a build optimizer adds it.
17199
  else if (freeModule) {
17200
    // Export for Node.js.
17201
    (freeModule.exports = _)._ = _;
17202
    // Export for CommonJS support.
17203
    freeExports._ = _;
17204
  }
17205
  else {
17206
    // Export to the global object.
17207
    root._ = _;
17208
  }
17209
}.call(this));
17210