PageSourceSearch

https://www.suntech-power.co.jp/js/vendor/underscore.js

js suntech-power.co.jp collected 2026-10-02 18:20:20 UTC 45,489 bytes, 1,343 lines download raw bytes

1//     Underscore.js 1.6.0
2//     http://underscorejs.org
3//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
4//     Underscore may be freely distributed under the MIT license.
5
6(function() {
7
8  // Baseline setup
9  // --------------
10
11  // Establish the root object, `window` in the browser, or `exports` on the server.
12  var root = this;
13
14  // Save the previous value of the `_` variable.
15  var previousUnderscore = root._;
16
17  // Establish the object that gets returned to break out of a loop iteration.
18  var breaker = {};
19
20  // Save bytes in the minified (but not gzipped) version:
21  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
22
23  // Create quick reference variables for speed access to core prototypes.
24  var
25    push             = ArrayProto.push,
26    slice            = ArrayProto.slice,
27    concat           = ArrayProto.concat,
28    toString         = ObjProto.toString,
29    hasOwnProperty   = ObjProto.hasOwnProperty;
30
31  // All **ECMAScript 5** native function implementations that we hope to use
32  // are declared here.
33  var
34    nativeForEach      = ArrayProto.forEach,
35    nativeMap          = ArrayProto.map,
36    nativeReduce       = ArrayProto.reduce,
37    nativeReduceRight  = ArrayProto.reduceRight,
38    nativeFilter       = ArrayProto.filter,
39    nativeEvery        = ArrayProto.every,
40    nativeSome         = ArrayProto.some,
41    nativeIndexOf      = ArrayProto.indexOf,
42    nativeLastIndexOf  = ArrayProto.lastIndexOf,
43    nativeIsArray      = Array.isArray,
44    nativeKeys         = Object.keys,
45    nativeBind         = FuncProto.bind;
46
47  // Create a safe reference to the Underscore object for use below.
48  var _ = function(obj) {
49    if (obj instanceof _) return obj;
50    if (!(this instanceof _)) return new _(obj);
51    this._wrapped = obj;
52  };
53
54  // Export the Underscore object for **Node.js**, with
55  // backwards-compatibility for the old `require()` API. If we're in
56  // the browser, add `_` as a global object via a string identifier,
57  // for Closure Compiler "advanced" mode.
58  if (typeof exports !== 'undefined') {
59    if (typeof module !== 'undefined' && module.exports) {
60      exports = module.exports = _;
61    }
62    exports._ = _;
63  } else {
64    root._ = _;
65  }
66
67  // Current version.
68  _.VERSION = '1.6.0';
69
70  // Collection Functions
71  // --------------------
72
73  // The cornerstone, an `each` implementation, aka `forEach`.
74  // Handles objects with the built-in `forEach`, arrays, and raw objects.
75  // Delegates to **ECMAScript 5**'s native `forEach` if available.
76  var each = _.each = _.forEach = function(obj, iterator, context) {
77    if (obj == null) return obj;
78    if (nativeForEach && obj.forEach === nativeForEach) {
79      obj.forEach(iterator, context);
80    } else if (obj.length === +obj.length) {
81      for (var i = 0, length = obj.length; i < length; i++) {
82        if (iterator.call(context, obj[i], i, obj) === breaker) return;
83      }
84    } else {
85      var keys = _.keys(obj);
86      for (var i = 0, length = keys.length; i < length; i++) {
87        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
88      }
89    }
90    return obj;
91  };
92
93  // Return the results of applying the iterator to each element.
94  // Delegates to **ECMAScript 5**'s native `map` if available.
95  _.map = _.collect = function(obj, iterator, context) {
96    var results = [];
97    if (obj == null) return results;
98    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
99    each(obj, function(value, index, list) {
100      results.push(iterator.call(context, value, index, list));
101    });
102    return results;
103  };
104
105  var reduceError = 'Reduce of empty array with no initial value';
106
107  // **Reduce** builds up a single result from a list of values, aka `inject`,
108  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
109  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
110    var initial = arguments.length > 2;
111    if (obj == null) obj = [];
112    if (nativeReduce && obj.reduce === nativeReduce) {
113      if (context) iterator = _.bind(iterator, context);
114      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
115    }
116    each(obj, function(value, index, list) {
117      if (!initial) {
118        memo = value;
119        initial = true;
120      } else {
121        memo = iterator.call(context, memo, value, index, list);
122      }
123    });
124    if (!initial) throw new TypeError(reduceError);
125    return memo;
126  };
127
128  // The right-associative version of reduce, also known as `foldr`.
129  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
130  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
131    var initial = arguments.length > 2;
132    if (obj == null) obj = [];
133    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
134      if (context) iterator = _.bind(iterator, context);
135      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
136    }
137    var length = obj.length;
138    if (length !== +length) {
139      var keys = _.keys(obj);
140      length = keys.length;
141    }
142    each(obj, function(value, index, list) {
143      index = keys ? keys[--length] : --length;
144      if (!initial) {
145        memo = obj[index];
146        initial = true;
147      } else {
148        memo = iterator.call(context, memo, obj[index], index, list);
149      }
150    });
151    if (!initial) throw new TypeError(reduceError);
152    return memo;
153  };
154
155  // Return the first value which passes a truth test. Aliased as `detect`.
156  _.find = _.detect = function(obj, predicate, context) {
157    var result;
158    any(obj, function(value, index, list) {
159      if (predicate.call(context, value, index, list)) {
160        result = value;
161        return true;
162      }
163    });
164    return result;
165  };
166
167  // Return all the elements that pass a truth test.
168  // Delegates to **ECMAScript 5**'s native `filter` if available.
169  // Aliased as `select`.
170  _.filter = _.select = function(obj, predicate, context) {
171    var results = [];
172    if (obj == null) return results;
173    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);
174    each(obj, function(value, index, list) {
175      if (predicate.call(context, value, index, list)) results.push(value);
176    });
177    return results;
178  };
179
180  // Return all the elements for which a truth test fails.
181  _.reject = function(obj, predicate, context) {
182    return _.filter(obj, function(value, index, list) {
183      return !predicate.call(context, value, index, list);
184    }, context);
185  };
186
187  // Determine whether all of the elements match a truth test.
188  // Delegates to **ECMAScript 5**'s native `every` if available.
189  // Aliased as `all`.
190  _.every = _.all = function(obj, predicate, context) {
191    predicate || (predicate = _.identity);
192    var result = true;
193    if (obj == null) return result;
194    if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);
195    each(obj, function(value, index, list) {
196      if (!(result = result && predicate.call(context, value, index, list))) return breaker;
197    });
198    return !!result;
199  };
200
201  // Determine if at least one element in the object matches a truth test.
202  // Delegates to **ECMAScript 5**'s native `some` if available.
203  // Aliased as `any`.
204  var any = _.some = _.any = function(obj, predicate, context) {
205    predicate || (predicate = _.identity);
206    var result = false;
207    if (obj == null) return result;
208    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);
209    each(obj, function(value, index, list) {
210      if (result || (result = predicate.call(context, value, index, list))) return breaker;
211    });
212    return !!result;
213  };
214
215  // Determine if the array or object contains a given value (using `===`).
216  // Aliased as `include`.
217  _.contains = _.include = function(obj, target) {
218    if (obj == null) return false;
219    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
220    return any(obj, function(value) {
221      return value === target;
222    });
223  };
224
225  // Invoke a method (with arguments) on every item in a collection.
226  _.invoke = function(obj, method) {
227    var args = slice.call(arguments, 2);
228    var isFunc = _.isFunction(method);
229    return _.map(obj, function(value) {
230      return (isFunc ? method : value[method]).apply(value, args);
231    });
232  };
233
234  // Convenience version of a common use case of `map`: fetching a property.
235  _.pluck = function(obj, key) {
236    return _.map(obj, _.property(key));
237  };
238
239  // Convenience version of a common use case of `filter`: selecting only objects
240  // containing specific `key:value` pairs.
241  _.where = function(obj, attrs) {
242    return _.filter(obj, _.matches(attrs));
243  };
244
245  // Convenience version of a common use case of `find`: getting the first object
246  // containing specific `key:value` pairs.
247  _.findWhere = function(obj, attrs) {
248    return _.find(obj, _.matches(attrs));
249  };
250
251  // Return the maximum element or (element-based computation).
252  // Can't optimize arrays of integers longer than 65,535 elements.
253  // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
254  _.max = function(obj, iterator, context) {
255    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
256      return Math.max.apply(Math, obj);
257    }
258    var result = -Infinity, lastComputed = -Infinity;
259    each(obj, function(value, index, list) {
260      var computed = iterator ? iterator.call(context, value, index, list) : value;
261      if (computed > lastComputed) {
262        result = value;
263        lastComputed = computed;
264      }
265    });
266    return result;
267  };
268
269  // Return the minimum element (or element-based computation).
270  _.min = function(obj, iterator, context) {
271    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
272      return Math.min.apply(Math, obj);
273    }
274    var result = Infinity, lastComputed = Infinity;
275    each(obj, function(value, index, list) {
276      var computed = iterator ? iterator.call(context, value, index, list) : value;
277      if (computed < lastComputed) {
278        result = value;
279        lastComputed = computed;
280      }
281    });
282    return result;
283  };
284
285  // Shuffle an array, using the modern version of the
286  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
287  _.shuffle = function(obj) {
288    var rand;
289    var index = 0;
290    var shuffled = [];
291    each(obj, function(value) {
292      rand = _.random(index++);
293      shuffled[index - 1] = shuffled[rand];
294      shuffled[rand] = value;
295    });
296    return shuffled;
297  };
298
299  // Sample **n** random values from a collection.
300  // If **n** is not specified, returns a single random element.
301  // The internal `guard` argument allows it to work with `map`.
302  _.sample = function(obj, n, guard) {
303    if (n == null || guard) {
304      if (obj.length !== +obj.length) obj = _.values(obj);
305      return obj[_.random(obj.length - 1)];
306    }
307    return _.shuffle(obj).slice(0, Math.max(0, n));
308  };
309
310  // An internal function to generate lookup iterators.
311  var lookupIterator = function(value) {
312    if (value == null) return _.identity;
313    if (_.isFunction(value)) return value;
314    return _.property(value);
315  };
316
317  // Sort the object's values by a criterion produced by an iterator.
318  _.sortBy = function(obj, iterator, context) {
319    iterator = lookupIterator(iterator);
320    return _.pluck(_.map(obj, function(value, index, list) {
321      return {
322        value: value,
323        index: index,
324        criteria: iterator.call(context, value, index, list)
325      };
326    }).sort(function(left, right) {
327      var a = left.criteria;
328      var b = right.criteria;
329      if (a !== b) {
330        if (a > b || a === void 0) return 1;
331        if (a < b || b === void 0) return -1;
332      }
333      return left.index - right.index;
334    }), 'value');
335  };
336
337  // An internal function used for aggregate "group by" operations.
338  var group = function(behavior) {
339    return function(obj, iterator, context) {
340      var result = {};
341      iterator = lookupIterator(iterator);
342      each(obj, function(value, index) {
343        var key = iterator.call(context, value, index, obj);
344        behavior(result, key, value);
345      });
346      return result;
347    };
348  };
349
350  // Groups the object's values by a criterion. Pass either a string attribute
351  // to group by, or a function that returns the criterion.
352  _.groupBy = group(function(result, key, value) {
353    _.has(result, key) ? result[key].push(value) : result[key] = [value];
354  });
355
356  // Indexes the object's values by a criterion, similar to `groupBy`, but for
357  // when you know that your index values will be unique.
358  _.indexBy = group(function(result, key, value) {
359    result[key] = value;
360  });
361
362  // Counts instances of an object that group by a certain criterion. Pass
363  // either a string attribute to count by, or a function that returns the
364  // criterion.
365  _.countBy = group(function(result, key) {
366    _.has(result, key) ? result[key]++ : result[key] = 1;
367  });
368
369  // Use a comparator function to figure out the smallest index at which
370  // an object should be inserted so as to maintain order. Uses binary search.
371  _.sortedIndex = function(array, obj, iterator, context) {
372    iterator = lookupIterator(iterator);
373    var value = iterator.call(context, obj);
374    var low = 0, high = array.length;
375    while (low < high) {
376      var mid = (low + high) >>> 1;
377      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
378    }
379    return low;
380  };
381
382  // Safely create a real, live array from anything iterable.
383  _.toArray = function(obj) {
384    if (!obj) return [];
385    if (_.isArray(obj)) return slice.call(obj);
386    if (obj.length === +obj.length) return _.map(obj, _.identity);
387    return _.values(obj);
388  };
389
390  // Return the number of elements in an object.
391  _.size = function(obj) {
392    if (obj == null) return 0;
393    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
394  };
395
396  // Array Functions
397  // ---------------
398
399  // Get the first element of an array. Passing **n** will return the first N
400  // values in the array. Aliased as `head` and `take`. The **guard** check
401  // allows it to work with `_.map`.
402  _.first = _.head = _.take = function(array, n, guard) {
403    if (array == null) return void 0;
404    if ((n == null) || guard) return array[0];
405    if (n < 0) return [];
406    return slice.call(array, 0, n);
407  };
408
409  // Returns everything but the last entry of the array. Especially useful on
410  // the arguments object. Passing **n** will return all the values in
411  // the array, excluding the last N. The **guard** check allows it to work with
412  // `_.map`.
413  _.initial = function(array, n, guard) {
414    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
415  };
416
417  // Get the last element of an array. Passing **n** will return the last N
418  // values in the array. The **guard** check allows it to work with `_.map`.
419  _.last = function(array, n, guard) {
420    if (array == null) return void 0;
421    if ((n == null) || guard) return array[array.length - 1];
422    return slice.call(array, Math.max(array.length - n, 0));
423  };
424
425  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
426  // Especially useful on the arguments object. Passing an **n** will return
427  // the rest N values in the array. The **guard**
428  // check allows it to work with `_.map`.
429  _.rest = _.tail = _.drop = function(array, n, guard) {
430    return slice.call(array, (n == null) || guard ? 1 : n);
431  };
432
433  // Trim out all falsy values from an array.
434  _.compact = function(array) {
435    return _.filter(array, _.identity);
436  };
437
438  // Internal implementation of a recursive `flatten` function.
439  var flatten = function(input, shallow, output) {
440    if (shallow && _.every(input, _.isArray)) {
441      return concat.apply(output, input);
442    }
443    each(input, function(value) {
444      if (_.isArray(value) || _.isArguments(value)) {
445        shallow ? push.apply(output, value) : flatten(value, shallow, output);
446      } else {
447        output.push(value);
448      }
449    });
450    return output;
451  };
452
453  // Flatten out an array, either recursively (by default), or just one level.
454  _.flatten = function(array, shallow) {
455    return flatten(array, shallow, []);
456  };
457
458  // Return a version of the array that does not contain the specified value(s).
459  _.without = function(array) {
460    return _.difference(array, slice.call(arguments, 1));
461  };
462
463  // Split an array into two arrays: one whose elements all satisfy the given
464  // predicate, and one whose elements all do not satisfy the predicate.
465  _.partition = function(array, predicate) {
466    var pass = [], fail = [];
467    each(array, function(elem) {
468      (predicate(elem) ? pass : fail).push(elem);
469    });
470    return [pass, fail];
471  };
472
473  // Produce a duplicate-free version of the array. If the array has already
474  // been sorted, you have the option of using a faster algorithm.
475  // Aliased as `unique`.
476  _.uniq = _.unique = function(array, isSorted, iterator, context) {
477    if (_.isFunction(isSorted)) {
478      context = iterator;
479      iterator = isSorted;
480      isSorted = false;
481    }
482    var initial = iterator ? _.map(array, iterator, context) : array;
483    var results = [];
484    var seen = [];
485    each(initial, function(value, index) {
486      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
487        seen.push(value);
488        results.push(array[index]);
489      }
490    });
491    return results;
492  };
493
494  // Produce an array that contains the union: each distinct element from all of
495  // the passed-in arrays.
496  _.union = function() {
497    return _.uniq(_.flatten(arguments, true));
498  };
499
500  // Produce an array that contains every item shared between all the
501  // passed-in arrays.
502  _.intersection = function(array) {
503    var rest = slice.call(arguments, 1);
504    return _.filter(_.uniq(array), function(item) {
505      return _.every(rest, function(other) {
506        return _.contains(other, item);
507      });
508    });
509  };
510
511  // Take the difference between one array and a number of other arrays.
512  // Only the elements present in just the first array will remain.
513  _.difference = function(array) {
514    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
515    return _.filter(array, function(value){ return !_.contains(rest, value); });
516  };
517
518  // Zip together multiple lists into a single array -- elements that share
519  // an index go together.
520  _.zip = function() {
521    var length = _.max(_.pluck(arguments, 'length').concat(0));
522    var results = new Array(length);
523    for (var i = 0; i < length; i++) {
524      results[i] = _.pluck(arguments, '' + i);
525    }
526    return results;
527  };
528
529  // Converts lists into objects. Pass either a single array of `[key, value]`
530  // pairs, or two parallel arrays of the same length -- one of keys, and one of
531  // the corresponding values.
532  _.object = function(list, values) {
533    if (list == null) return {};
534    var result = {};
535    for (var i = 0, length = list.length; i < length; i++) {
536      if (values) {
537        result[list[i]] = values[i];
538      } else {
539        result[list[i][0]] = list[i][1];
540      }
541    }
542    return result;
543  };
544
545  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
546  // we need this function. Return the position of the first occurrence of an
547  // item in an array, or -1 if the item is not included in the array.
548  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
549  // If the array is large and already in sort order, pass `true`
550  // for **isSorted** to use binary search.
551  _.indexOf = function(array, item, isSorted) {
552    if (array == null) return -1;
553    var i = 0, length = array.length;
554    if (isSorted) {
555      if (typeof isSorted == 'number') {
556        i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
557      } else {
558        i = _.sortedIndex(array, item);
559        return array[i] === item ? i : -1;
560      }
561    }
562    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
563    for (; i < length; i++) if (array[i] === item) return i;
564    return -1;
565  };
566
567  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
568  _.lastIndexOf = function(array, item, from) {
569    if (array == null) return -1;
570    var hasIndex = from != null;
571    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
572      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
573    }
574    var i = (hasIndex ? from : array.length);
575    while (i--) if (array[i] === item) return i;
576    return -1;
577  };
578
579  // Generate an integer Array containing an arithmetic progression. A port of
580  // the native Python `range()` function. See
581  // [the Python documentation](http://docs.python.org/library/functions.html#range).
582  _.range = function(start, stop, step) {
583    if (arguments.length <= 1) {
584      stop = start || 0;
585      start = 0;
586    }
587    step = arguments[2] || 1;
588
589    var length = Math.max(Math.ceil((stop - start) / step), 0);
590    var idx = 0;
591    var range = new Array(length);
592
593    while(idx < length) {
594      range[idx++] = start;
595      start += step;
596    }
597
598    return range;
599  };
600
601  // Function (ahem) Functions
602  // ------------------
603
604  // Reusable constructor function for prototype setting.
605  var ctor = function(){};
606
607  // Create a function bound to a given object (assigning `this`, and arguments,
608  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
609  // available.
610  _.bind = function(func, context) {
611    var args, bound;
612    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
613    if (!_.isFunction(func)) throw new TypeError;
614    args = slice.call(arguments, 2);
615    return bound = function() {
616      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
617      ctor.prototype = func.prototype;
618      var self = new ctor;
619      ctor.prototype = null;
620      var result = func.apply(self, args.concat(slice.call(arguments)));
621      if (Object(result) === result) return result;
622      return self;
623    };
624  };
625
626  // Partially apply a function by creating a version that has had some of its
627  // arguments pre-filled, without changing its dynamic `this` context. _ acts
628  // as a placeholder, allowing any combination of arguments to be pre-filled.
629  _.partial = function(func) {
630    var boundArgs = slice.call(arguments, 1);
631    return function() {
632      var position = 0;
633      var args = boundArgs.slice();
634      for (var i = 0, length = args.length; i < length; i++) {
635        if (args[i] === _) args[i] = arguments[position++];
636      }
637      while (position < arguments.length) args.push(arguments[position++]);
638      return func.apply(this, args);
639    };
640  };
641
642  // Bind a number of an object's methods to that object. Remaining arguments
643  // are the method names to be bound. Useful for ensuring that all callbacks
644  // defined on an object belong to it.
645  _.bindAll = function(obj) {
646    var funcs = slice.call(arguments, 1);
647    if (funcs.length === 0) throw new Error('bindAll must be passed function names');
648    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
649    return obj;
650  };
651
652  // Memoize an expensive function by storing its results.
653  _.memoize = function(func, hasher) {
654    var memo = {};
655    hasher || (hasher = _.identity);
656    return function() {
657      var key = hasher.apply(this, arguments);
658      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
659    };
660  };
661
662  // Delays a function for the given number of milliseconds, and then calls
663  // it with the arguments supplied.
664  _.delay = function(func, wait) {
665    var args = slice.call(arguments, 2);
666    return setTimeout(function(){ return func.apply(null, args); }, wait);
667  };
668
669  // Defers a function, scheduling it to run after the current call stack has
670  // cleared.
671  _.defer = function(func) {
672    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
673  };
674
675  // Returns a function, that, when invoked, will only be triggered at most once
676  // during a given window of time. Normally, the throttled function will run
677  // as much as it can, without ever going more than once per `wait` duration;
678  // but if you'd like to disable the execution on the leading edge, pass
679  // `{leading: false}`. To disable execution on the trailing edge, ditto.
680  _.throttle = function(func, wait, options) {
681    var context, args, result;
682    var timeout = null;
683    var previous = 0;
684    options || (options = {});
685    var later = function() {
686      previous = options.leading === false ? 0 : _.now();
687      timeout = null;
688      result = func.apply(context, args);
689      context = args = null;
690    };
691    return function() {
692      var now = _.now();
693      if (!previous && options.leading === false) previous = now;
694      var remaining = wait - (now - previous);
695      context = this;
696      args = arguments;
697      if (remaining <= 0) {
698        clearTimeout(timeout);
699        timeout = null;
700        previous = now;
701        result = func.apply(context, args);
702        context = args = null;
703      } else if (!timeout && options.trailing !== false) {
704        timeout = setTimeout(later, remaining);
705      }
706      return result;
707    };
708  };
709
710  // Returns a function, that, as long as it continues to be invoked, will not
711  // be triggered. The function will be called after it stops being called for
712  // N milliseconds. If `immediate` is passed, trigger the function on the
713  // leading edge, instead of the trailing.
714  _.debounce = function(func, wait, immediate) {
715    var timeout, args, context, timestamp, result;
716
717    var later = function() {
718      var last = _.now() - timestamp;
719      if (last < wait) {
720        timeout = setTimeout(later, wait - last);
721      } else {
722        timeout = null;
723        if (!immediate) {
724          result = func.apply(context, args);
725          context = args = null;
726        }
727      }
728    };
729
730    return function() {
731      context = this;
732      args = arguments;
733      timestamp = _.now();
734      var callNow = immediate && !timeout;
735      if (!timeout) {
736        timeout = setTimeout(later, wait);
737      }
738      if (callNow) {
739        result = func.apply(context, args);
740        context = args = null;
741      }
742
743      return result;
744    };
745  };
746
747  // Returns a function that will be executed at most one time, no matter how
748  // often you call it. Useful for lazy initialization.
749  _.once = function(func) {
750    var ran = false, memo;
751    return function() {
752      if (ran) return memo;
753      ran = true;
754      memo = func.apply(this, arguments);
755      func = null;
756      return memo;
757    };
758  };
759
760  // Returns the first function passed as an argument to the second,
761  // allowing you to adjust arguments, run code before and after, and
762  // conditionally execute the original function.
763  _.wrap = function(func, wrapper) {
764    return _.partial(wrapper, func);
765  };
766
767  // Returns a function that is the composition of a list of functions, each
768  // consuming the return value of the function that follows.
769  _.compose = function() {
770    var funcs = arguments;
771    return function() {
772      var args = arguments;
773      for (var i = funcs.length - 1; i >= 0; i--) {
774        args = [funcs[i].apply(this, args)];
775      }
776      return args[0];
777    };
778  };
779
780  // Returns a function that will only be executed after being called N times.
781  _.after = function(times, func) {
782    return function() {
783      if (--times < 1) {
784        return func.apply(this, arguments);
785      }
786    };
787  };
788
789  // Object Functions
790  // ----------------
791
792  // Retrieve the names of an object's properties.
793  // Delegates to **ECMAScript 5**'s native `Object.keys`
794  _.keys = function(obj) {
795    if (!_.isObject(obj)) return [];
796    if (nativeKeys) return nativeKeys(obj);
797    var keys = [];
798    for (var key in obj) if (_.has(obj, key)) keys.push(key);
799    return keys;
800  };
801
802  // Retrieve the values of an object's properties.
803  _.values = function(obj) {
804    var keys = _.keys(obj);
805    var length = keys.length;
806    var values = new Array(length);
807    for (var i = 0; i < length; i++) {
808      values[i] = obj[keys[i]];
809    }
810    return values;
811  };
812
813  // Convert an object into a list of `[key, value]` pairs.
814  _.pairs = function(obj) {
815    var keys = _.keys(obj);
816    var length = keys.length;
817    var pairs = new Array(length);
818    for (var i = 0; i < length; i++) {
819      pairs[i] = [keys[i], obj[keys[i]]];
820    }
821    return pairs;
822  };
823
824  // Invert the keys and values of an object. The values must be serializable.
825  _.invert = function(obj) {
826    var result = {};
827    var keys = _.keys(obj);
828    for (var i = 0, length = keys.length; i < length; i++) {
829      result[obj[keys[i]]] = keys[i];
830    }
831    return result;
832  };
833
834  // Return a sorted list of the function names available on the object.
835  // Aliased as `methods`
836  _.functions = _.methods = function(obj) {
837    var names = [];
838    for (var key in obj) {
839      if (_.isFunction(obj[key])) names.push(key);
840    }
841    return names.sort();
842  };
843
844  // Extend a given object with all the properties in passed-in object(s).
845  _.extend = function(obj) {
846    each(slice.call(arguments, 1), function(source) {
847      if (source) {
848        for (var prop in source) {
849          obj[prop] = source[prop];
850        }
851      }
852    });
853    return obj;
854  };
855
856  // Return a copy of the object only containing the whitelisted properties.
857  _.pick = function(obj) {
858    var copy = {};
859    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
860    each(keys, function(key) {
861      if (key in obj) copy[key] = obj[key];
862    });
863    return copy;
864  };
865
866   // Return a copy of the object without the blacklisted properties.
867  _.omit = function(obj) {
868    var copy = {};
869    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
870    for (var key in obj) {
871      if (!_.contains(keys, key)) copy[key] = obj[key];
872    }
873    return copy;
874  };
875
876  // Fill in a given object with default properties.
877  _.defaults = function(obj) {
878    each(slice.call(arguments, 1), function(source) {
879      if (source) {
880        for (var prop in source) {
881          if (obj[prop] === void 0) obj[prop] = source[prop];
882        }
883      }
884    });
885    return obj;
886  };
887
888  // Create a (shallow-cloned) duplicate of an object.
889  _.clone = function(obj) {
890    if (!_.isObject(obj)) return obj;
891    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
892  };
893
894  // Invokes interceptor with the obj, and then returns obj.
895  // The primary purpose of this method is to "tap into" a method chain, in
896  // order to perform operations on intermediate results within the chain.
897  _.tap = function(obj, interceptor) {
898    interceptor(obj);
899    return obj;
900  };
901
902  // Internal recursive comparison function for `isEqual`.
903  var eq = function(a, b, aStack, bStack) {
904    // Identical objects are equal. `0 === -0`, but they aren't identical.
905    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
906    if (a === b) return a !== 0 || 1 / a == 1 / b;
907    // A strict comparison is necessary because `null == undefined`.
908    if (a == null || b == null) return a === b;
909    // Unwrap any wrapped objects.
910    if (a instanceof _) a = a._wrapped;
911    if (b instanceof _) b = b._wrapped;
912    // Compare `[[Class]]` names.
913    var className = toString.call(a);
914    if (className != toString.call(b)) return false;
915    switch (className) {
916      // Strings, numbers, dates, and booleans are compared by value.
917      case '[object String]':
918        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
919        // equivalent to `new String("5")`.
920        return a == String(b);
921      case '[object Number]':
922        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
923        // other numeric values.
924        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
925      case '[object Date]':
926      case '[object Boolean]':
927        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
928        // millisecond representations. Note that invalid dates with millisecond representations
929        // of `NaN` are not equivalent.
930        return +a == +b;
931      // RegExps are compared by their source patterns and flags.
932      case '[object RegExp]':
933        return a.source == b.source &&
934               a.global == b.global &&
935               a.multiline == b.multiline &&
936               a.ignoreCase == b.ignoreCase;
937    }
938    if (typeof a != 'object' || typeof b != 'object') return false;
939    // Assume equality for cyclic structures. The algorithm for detecting cyclic
940    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
941    var length = aStack.length;
942    while (length--) {
943      // Linear search. Performance is inversely proportional to the number of
944      // unique nested structures.
945      if (aStack[length] == a) return bStack[length] == b;
946    }
947    // Objects with different constructors are not equivalent, but `Object`s
948    // from different frames are.
949    var aCtor = a.constructor, bCtor = b.constructor;
950    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
951                             _.isFunction(bCtor) && (bCtor instanceof bCtor))
952                        && ('constructor' in a && 'constructor' in b)) {
953      return false;
954    }
955    // Add the first object to the stack of traversed objects.
956    aStack.push(a);
957    bStack.push(b);
958    var size = 0, result = true;
959    // Recursively compare objects and arrays.
960    if (className == '[object Array]') {
961      // Compare array lengths to determine if a deep comparison is necessary.
962      size = a.length;
963      result = size == b.length;
964      if (result) {
965        // Deep compare the contents, ignoring non-numeric properties.
966        while (size--) {
967          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
968        }
969      }
970    } else {
971      // Deep compare objects.
972      for (var key in a) {
973        if (_.has(a, key)) {
974          // Count the expected number of properties.
975          size++;
976          // Deep compare each member.
977          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
978        }
979      }
980      // Ensure that both objects contain the same number of properties.
981      if (result) {
982        for (key in b) {
983          if (_.has(b, key) && !(size--)) break;
984        }
985        result = !size;
986      }
987    }
988    // Remove the first object from the stack of traversed objects.
989    aStack.pop();
990    bStack.pop();
991    return result;
992  };
993
994  // Perform a deep comparison to check if two objects are equal.
995  _.isEqual = function(a, b) {
996    return eq(a, b, [], []);
997  };
998
999  // Is a given array, string, or object empty?
1000  // An "empty" object has no enumerable own-properties.
1001  _.isEmpty = function(obj) {
1002    if (obj == null) return true;
1003    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
1004    for (var key in obj) if (_.has(obj, key)) return false;
1005    return true;
1006  };
1007
1008  // Is a given value a DOM element?
1009  _.isElement = function(obj) {
1010    return !!(obj && obj.nodeType === 1);
1011  };
1012
1013  // Is a given value an array?
1014  // Delegates to ECMA5's native Array.isArray
1015  _.isArray = nativeIsArray || function(obj) {
1016    return toString.call(obj) == '[object Array]';
1017  };
1018
1019  // Is a given variable an object?
1020  _.isObject = function(obj) {
1021    return obj === Object(obj);
1022  };
1023
1024  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
1025  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
1026    _['is' + name] = function(obj) {
1027      return toString.call(obj) == '[object ' + name + ']';
1028    };
1029  });
1030
1031  // Define a fallback version of the method in browsers (ahem, IE), where
1032  // there isn't any inspectable "Arguments" type.
1033  if (!_.isArguments(arguments)) {
1034    _.isArguments = function(obj) {
1035      return !!(obj && _.has(obj, 'callee'));
1036    };
1037  }
1038
1039  // Optimize `isFunction` if appropriate.
1040  if (typeof (/./) !== 'function') {
1041    _.isFunction = function(obj) {
1042      return typeof obj === 'function';
1043    };
1044  }
1045
1046  // Is a given object a finite number?
1047  _.isFinite = function(obj) {
1048    return isFinite(obj) && !isNaN(parseFloat(obj));
1049  };
1050
1051  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
1052  _.isNaN = function(obj) {
1053    return _.isNumber(obj) && obj != +obj;
1054  };
1055
1056  // Is a given value a boolean?
1057  _.isBoolean = function(obj) {
1058    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
1059  };
1060
1061  // Is a given value equal to null?
1062  _.isNull = function(obj) {
1063    return obj === null;
1064  };
1065
1066  // Is a given variable undefined?
1067  _.isUndefined = function(obj) {
1068    return obj === void 0;
1069  };
1070
1071  // Shortcut function for checking if an object has a given property directly
1072  // on itself (in other words, not on a prototype).
1073  _.has = function(obj, key) {
1074    return hasOwnProperty.call(obj, key);
1075  };
1076
1077  // Utility Functions
1078  // -----------------
1079
1080  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
1081  // previous owner. Returns a reference to the Underscore object.
1082  _.noConflict = function() {
1083    root._ = previousUnderscore;
1084    return this;
1085  };
1086
1087  // Keep the identity function around for default iterators.
1088  _.identity = function(value) {
1089    return value;
1090  };
1091
1092  _.constant = function(value) {
1093    return function () {
1094      return value;
1095    };
1096  };
1097
1098  _.property = function(key) {
1099    return function(obj) {
1100      return obj[key];
1101    };
1102  };
1103
1104  // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
1105  _.matches = function(attrs) {
1106    return function(obj) {
1107      if (obj === attrs) return true; //avoid comparing an object to itself.
1108      for (var key in attrs) {
1109        if (attrs[key] !== obj[key])
1110          return false;
1111      }
1112      return true;
1113    }
1114  };
1115
1116  // Run a function **n** times.
1117  _.times = function(n, iterator, context) {
1118    var accum = Array(Math.max(0, n));
1119    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
1120    return accum;
1121  };
1122
1123  // Return a random integer between min and max (inclusive).
1124  _.random = function(min, max) {
1125    if (max == null) {
1126      max = min;
1127      min = 0;
1128    }
1129    return min + Math.floor(Math.random() * (max - min + 1));
1130  };
1131
1132  // A (possibly faster) way to get the current timestamp as an integer.
1133  _.now = Date.now || function() { return new Date().getTime(); };
1134
1135  // List of HTML entities for escaping.
1136  var entityMap = {
1137    escape: {
1138      '&': '&amp;',
1139      '<': '&lt;',
1140      '>': '&gt;',
1141      '"': '&quot;',
1142      "'": '&#x27;'
1143    }
1144  };
1145  entityMap.unescape = _.invert(entityMap.escape);
1146
1147  // Regexes containing the keys and values listed immediately above.
1148  var entityRegexes = {
1149    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
1150    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
1151  };
1152
1153  // Functions for escaping and unescaping strings to/from HTML interpolation.
1154  _.each(['escape', 'unescape'], function(method) {
1155    _[method] = function(string) {
1156      if (string == null) return '';
1157      return ('' + string).replace(entityRegexes[method], function(match) {
1158        return entityMap[method][match];
1159      });
1160    };
1161  });
1162
1163  // If the value of the named `property` is a function then invoke it with the
1164  // `object` as context; otherwise, return it.
1165  _.result = function(object, property) {
1166    if (object == null) return void 0;
1167    var value = object[property];
1168    return _.isFunction(value) ? value.call(object) : value;
1169  };
1170
1171  // Add your own custom functions to the Underscore object.
1172  _.mixin = function(obj) {
1173    each(_.functions(obj), function(name) {
1174      var func = _[name] = obj[name];
1175      _.prototype[name] = function() {
1176        var args = [this._wrapped];
1177        push.apply(args, arguments);
1178        return result.call(this, func.apply(_, args));
1179      };
1180    });
1181  };
1182
1183  // Generate a unique integer id (unique within the entire client session).
1184  // Useful for temporary DOM ids.
1185  var idCounter = 0;
1186  _.uniqueId = function(prefix) {
1187    var id = ++idCounter + '';
1188    return prefix ? prefix + id : id;
1189  };
1190
1191  // By default, Underscore uses ERB-style template delimiters, change the
1192  // following template settings to use alternative delimiters.
1193  _.templateSettings = {
1194    evaluate    : /<%([\s\S]+?)%>/g,
1195    interpolate : /<%=([\s\S]+?)%>/g,
1196    escape      : /<%-([\s\S]+?)%>/g
1197  };
1198
1199  // When customizing `templateSettings`, if you don't want to define an
1200  // interpolation, evaluation or escaping regex, we need one that is
1201  // guaranteed not to match.
1202  var noMatch = /(.)^/;
1203
1204  // Certain characters need to be escaped so that they can be put into a
1205  // string literal.
1206  var escapes = {
1207    "'":      "'",
1208    '\\':     '\\',
1209    '\r':     'r',
1210    '\n':     'n',
1211    '\t':     't',
1212    '\u2028': 'u2028',
1213    '\u2029': 'u2029'
1214  };
1215
1216  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
1217
1218  // JavaScript micro-templating, similar to John Resig's implementation.
1219  // Underscore templating handles arbitrary delimiters, preserves whitespace,
1220  // and correctly escapes quotes within interpolated code.
1221  _.template = function(text, data, settings) {
1222    var render;
1223    settings = _.defaults({}, settings, _.templateSettings);
1224
1225    // Combine delimiters into one regular expression via alternation.
1226    var matcher = new RegExp([
1227      (settings.escape || noMatch).source,
1228      (settings.interpolate || noMatch).source,
1229      (settings.evaluate || noMatch).source
1230    ].join('|') + '|$', 'g');
1231
1232    // Compile the template source, escaping string literals appropriately.
1233    var index = 0;
1234    var source = "__p+='";
1235    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
1236      source += text.slice(index, offset)
1237        .replace(escaper, function(match) { return '\\' + escapes[match]; });
1238
1239      if (escape) {
1240        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
1241      }
1242      if (interpolate) {
1243        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
1244      }
1245      if (evaluate) {
1246        source += "';\n" + evaluate + "\n__p+='";
1247      }
1248      index = offset + match.length;
1249      return match;
1250    });
1251    source += "';\n";
1252
1253    // If a variable is not specified, place data values in local scope.
1254    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
1255
1256    source = "var __t,__p='',__j=Array.prototype.join," +
1257      "print=function(){__p+=__j.call(arguments,'');};\n" +
1258      source + "return __p;\n";
1259
1260    try {
1261      render = new Function(settings.variable || 'obj', '_', source);
1262    } catch (e) {
1263      e.source = source;
1264      throw e;
1265    }
1266
1267    if (data) return render(data, _);
1268    var template = function(data) {
1269      return render.call(this, data, _);
1270    };
1271
1272    // Provide the compiled function source as a convenience for precompilation.
1273    template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
1274
1275    return template;
1276  };
1277
1278  // Add a "chain" function, which will delegate to the wrapper.
1279  _.chain = function(obj) {
1280    return _(obj).chain();
1281  };
1282
1283  // OOP
1284  // ---------------
1285  // If Underscore is called as a function, it returns a wrapped object that
1286  // can be used OO-style. This wrapper holds altered versions of all the
1287  // underscore functions. Wrapped objects may be chained.
1288
1289  // Helper function to continue chaining intermediate results.
1290  var result = function(obj) {
1291    return this._chain ? _(obj).chain() : obj;
1292  };
1293
1294  // Add all of the Underscore functions to the wrapper object.
1295  _.mixin(_);
1296
1297  // Add all mutator Array functions to the wrapper.
1298  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
1299    var method = ArrayProto[name];
1300    _.prototype[name] = function() {
1301      var obj = this._wrapped;
1302      method.apply(obj, arguments);
1303      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
1304      return result.call(this, obj);
1305    };
1306  });
1307
1308  // Add all accessor Array functions to the wrapper.
1309  each(['concat', 'join', 'slice'], function(name) {
1310    var method = ArrayProto[name];
1311    _.prototype[name] = function() {
1312      return result.call(this, method.apply(this._wrapped, arguments));
1313    };
1314  });
1315
1316  _.extend(_.prototype, {
1317
1318    // Start chaining a wrapped Underscore object.
1319    chain: function() {
1320      this._chain = true;
1321      return this;
1322    },
1323
1324    // Extracts the result from a wrapped and chained object.
1325    value: function() {
1326      return this._wrapped;
1327    }
1328
1329  });
1330
1331  // AMD registration happens at the end for compatibility with AMD loaders
1332  // that may not enforce next-turn semantics on modules. Even though general
1333  // practice for AMD registration is to be anonymous, underscore registers
1334  // as a named module because, like jQuery, it is a base library that is
1335  // popular enough to be bundled in a third party lib, but not be part of
1336  // an AMD load request. Those cases could generate an error when an
1337  // anonymous define() is called outside of a loader request.
1338  if (typeof define === 'function' && define.amd) {
1339    define('underscore', [], function() {
1340      return _;
1341    });
1342  }
1343}).call(this);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.