scrivito_sdk 0.42.1 → 0.50.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9f3bd4cf5c39c344c934c2f0ad91b7f7f55c2ca4
4
- data.tar.gz: acfdcaac620551d4b70d7e98bd1c12db595fae02
3
+ metadata.gz: 70cfbded7c08170b69bac4f46a7bafd3c37c8539
4
+ data.tar.gz: 4f684ad24b4cba99c43412e03949e802a4e3c707
5
5
  SHA512:
6
- metadata.gz: 9cbcf79bb46d010b5ac8138f3c498d7e306e470bc422b6933436be517e82f82d02eedf08657030f32d1e5df697134b4e581ec60fffc402f3eddffdcfa6fac450
7
- data.tar.gz: 482f68f1f96ac2e5fe415f4d5d3cdd222a6da5a36ed84d75a768568a30d0652a8020a60833a66e781fb5b179a6e9fcf56d9d3141fb06a3c9cf0afc7da4ae6c1c
6
+ metadata.gz: f379ba2c03ff06267648b8d1504e9dba89de52636b714612466a69a48d05618052a2721c7ac1d068d2c6e0f069d7e0ce01f2264584df29c1e386b21f231d45f4
7
+ data.tar.gz: 0a4f892d6809b97c9fb4cf4d3ca518d44d03950e8ceae94c18025452eef3421f0d53d6c578bd100d00da75ab85318b9024616eeaf64c635503347a1082022ded
@@ -4,7 +4,6 @@
4
4
  <title>Scrivito</title>
5
5
  <%= stylesheet_link_tag 'scrivito_ui' %>
6
6
  <%= javascript_include_tag 'scrivito_ui' %>
7
- <%= stylesheet_link_tag 'scrivito_ui_extensions' %>
8
7
  <%= javascript_include_tag 'scrivito_ui_extensions' %>
9
8
  </head>
10
9
  <body id="scrivito_ui">
data/config/ca-bundle.crt CHANGED
@@ -1,7 +1,7 @@
1
1
  ##
2
2
  ## Bundle of CA Root Certificates
3
3
  ##
4
- ## Certificate data from Mozilla as of: Tue Feb 24 17:42:01 2015
4
+ ## Certificate data from Mozilla as of: Fri Mar 6 09:58:49 2015
5
5
  ##
6
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
data/config/routes.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  Rails.application.routes.draw do
2
2
  resources :objs, controller: 'scrivito/objs', path: '__scrivito/objs',
3
- only: [:create, :update, :destroy] do
3
+ only: [:create, :update, :destroy], defaults: {format: :json} do
4
4
  collection do
5
5
  get :page_class_selection
6
6
  get :search
@@ -23,14 +23,17 @@ Rails.application.routes.draw do
23
23
  end
24
24
  end
25
25
 
26
- resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show]
26
+ resources :tasks, controller: 'scrivito/tasks', path: '__scrivito/tasks', only: [:show],
27
+ defaults: {format: :json}
27
28
 
28
- get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission'
29
+ get '__scrivito/blobs/upload_permission' => 'scrivito/blobs#upload_permission',
30
+ defaults: {format: :json}
29
31
 
30
32
  resources :workspaces,
31
33
  controller: 'scrivito/workspaces',
32
34
  path: '__scrivito/workspaces',
33
- only: [:index, :show, :create, :update, :destroy] do
35
+ only: [:index, :show, :create, :update, :destroy],
36
+ defaults: {format: :json} do
34
37
  member do
35
38
  put :rebase
36
39
  put :publish
@@ -38,7 +41,7 @@ Rails.application.routes.draw do
38
41
  end
39
42
  end
40
43
 
41
- get '__scrivito/users/suggest' => 'scrivito/users#suggest'
44
+ get '__scrivito/users/suggest' => 'scrivito/users#suggest', defaults: {format: :json}
42
45
 
43
46
  get 'scrivito', to: 'scrivito/ui#index', as: 'scrivito_ui'
44
47
  get 'scrivito/*application_path', to: 'scrivito/ui#index', format: false
@@ -15712,9 +15712,9 @@ if (typeof module !== 'undefined' && module.exports) {
15712
15712
  }
15713
15713
 
15714
15714
  ;
15715
- // Underscore.js 1.7.0
15715
+ // Underscore.js 1.8.2
15716
15716
  // http://underscorejs.org
15717
- // (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
15717
+ // (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
15718
15718
  // Underscore may be freely distributed under the MIT license.
15719
15719
 
15720
15720
  (function() {
@@ -15735,7 +15735,6 @@ if (typeof module !== 'undefined' && module.exports) {
15735
15735
  var
15736
15736
  push = ArrayProto.push,
15737
15737
  slice = ArrayProto.slice,
15738
- concat = ArrayProto.concat,
15739
15738
  toString = ObjProto.toString,
15740
15739
  hasOwnProperty = ObjProto.hasOwnProperty;
15741
15740
 
@@ -15744,7 +15743,11 @@ if (typeof module !== 'undefined' && module.exports) {
15744
15743
  var
15745
15744
  nativeIsArray = Array.isArray,
15746
15745
  nativeKeys = Object.keys,
15747
- nativeBind = FuncProto.bind;
15746
+ nativeBind = FuncProto.bind,
15747
+ nativeCreate = Object.create;
15748
+
15749
+ // Naked function reference for surrogate-prototype-swapping.
15750
+ var Ctor = function(){};
15748
15751
 
15749
15752
  // Create a safe reference to the Underscore object for use below.
15750
15753
  var _ = function(obj) {
@@ -15766,12 +15769,12 @@ if (typeof module !== 'undefined' && module.exports) {
15766
15769
  }
15767
15770
 
15768
15771
  // Current version.
15769
- _.VERSION = '1.7.0';
15772
+ _.VERSION = '1.8.2';
15770
15773
 
15771
15774
  // Internal function that returns an efficient (for current engines) version
15772
15775
  // of the passed-in callback, to be repeatedly applied in other Underscore
15773
15776
  // functions.
15774
- var createCallback = function(func, context, argCount) {
15777
+ var optimizeCb = function(func, context, argCount) {
15775
15778
  if (context === void 0) return func;
15776
15779
  switch (argCount == null ? 3 : argCount) {
15777
15780
  case 1: return function(value) {
@@ -15795,12 +15798,52 @@ if (typeof module !== 'undefined' && module.exports) {
15795
15798
  // A mostly-internal function to generate callbacks that can be applied
15796
15799
  // to each element in a collection, returning the desired result — either
15797
15800
  // identity, an arbitrary callback, a property matcher, or a property accessor.
15798
- _.iteratee = function(value, context, argCount) {
15801
+ var cb = function(value, context, argCount) {
15799
15802
  if (value == null) return _.identity;
15800
- if (_.isFunction(value)) return createCallback(value, context, argCount);
15801
- if (_.isObject(value)) return _.matches(value);
15803
+ if (_.isFunction(value)) return optimizeCb(value, context, argCount);
15804
+ if (_.isObject(value)) return _.matcher(value);
15802
15805
  return _.property(value);
15803
15806
  };
15807
+ _.iteratee = function(value, context) {
15808
+ return cb(value, context, Infinity);
15809
+ };
15810
+
15811
+ // An internal function for creating assigner functions.
15812
+ var createAssigner = function(keysFunc, undefinedOnly) {
15813
+ return function(obj) {
15814
+ var length = arguments.length;
15815
+ if (length < 2 || obj == null) return obj;
15816
+ for (var index = 1; index < length; index++) {
15817
+ var source = arguments[index],
15818
+ keys = keysFunc(source),
15819
+ l = keys.length;
15820
+ for (var i = 0; i < l; i++) {
15821
+ var key = keys[i];
15822
+ if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key];
15823
+ }
15824
+ }
15825
+ return obj;
15826
+ };
15827
+ };
15828
+
15829
+ // An internal function for creating a new object that inherits from another.
15830
+ var baseCreate = function(prototype) {
15831
+ if (!_.isObject(prototype)) return {};
15832
+ if (nativeCreate) return nativeCreate(prototype);
15833
+ Ctor.prototype = prototype;
15834
+ var result = new Ctor;
15835
+ Ctor.prototype = null;
15836
+ return result;
15837
+ };
15838
+
15839
+ // Helper for collection methods to determine whether a collection
15840
+ // should be iterated as an array or as an object
15841
+ // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
15842
+ var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
15843
+ var isArrayLike = function(collection) {
15844
+ var length = collection && collection.length;
15845
+ return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX;
15846
+ };
15804
15847
 
15805
15848
  // Collection Functions
15806
15849
  // --------------------
@@ -15809,11 +15852,10 @@ if (typeof module !== 'undefined' && module.exports) {
15809
15852
  // Handles raw objects in addition to array-likes. Treats all
15810
15853
  // sparse array-likes as if they were dense.
15811
15854
  _.each = _.forEach = function(obj, iteratee, context) {
15812
- if (obj == null) return obj;
15813
- iteratee = createCallback(iteratee, context);
15814
- var i, length = obj.length;
15815
- if (length === +length) {
15816
- for (i = 0; i < length; i++) {
15855
+ iteratee = optimizeCb(iteratee, context);
15856
+ var i, length;
15857
+ if (isArrayLike(obj)) {
15858
+ for (i = 0, length = obj.length; i < length; i++) {
15817
15859
  iteratee(obj[i], i, obj);
15818
15860
  }
15819
15861
  } else {
@@ -15827,77 +15869,66 @@ if (typeof module !== 'undefined' && module.exports) {
15827
15869
 
15828
15870
  // Return the results of applying the iteratee to each element.
15829
15871
  _.map = _.collect = function(obj, iteratee, context) {
15830
- if (obj == null) return [];
15831
- iteratee = _.iteratee(iteratee, context);
15832
- var keys = obj.length !== +obj.length && _.keys(obj),
15872
+ iteratee = cb(iteratee, context);
15873
+ var keys = !isArrayLike(obj) && _.keys(obj),
15833
15874
  length = (keys || obj).length,
15834
- results = Array(length),
15835
- currentKey;
15875
+ results = Array(length);
15836
15876
  for (var index = 0; index < length; index++) {
15837
- currentKey = keys ? keys[index] : index;
15877
+ var currentKey = keys ? keys[index] : index;
15838
15878
  results[index] = iteratee(obj[currentKey], currentKey, obj);
15839
15879
  }
15840
15880
  return results;
15841
15881
  };
15842
15882
 
15843
- var reduceError = 'Reduce of empty array with no initial value';
15883
+ // Create a reducing function iterating left or right.
15884
+ function createReduce(dir) {
15885
+ // Optimized iterator function as using arguments.length
15886
+ // in the main function will deoptimize the, see #1991.
15887
+ function iterator(obj, iteratee, memo, keys, index, length) {
15888
+ for (; index >= 0 && index < length; index += dir) {
15889
+ var currentKey = keys ? keys[index] : index;
15890
+ memo = iteratee(memo, obj[currentKey], currentKey, obj);
15891
+ }
15892
+ return memo;
15893
+ }
15894
+
15895
+ return function(obj, iteratee, memo, context) {
15896
+ iteratee = optimizeCb(iteratee, context, 4);
15897
+ var keys = !isArrayLike(obj) && _.keys(obj),
15898
+ length = (keys || obj).length,
15899
+ index = dir > 0 ? 0 : length - 1;
15900
+ // Determine the initial value if none is provided.
15901
+ if (arguments.length < 3) {
15902
+ memo = obj[keys ? keys[index] : index];
15903
+ index += dir;
15904
+ }
15905
+ return iterator(obj, iteratee, memo, keys, index, length);
15906
+ };
15907
+ }
15844
15908
 
15845
15909
  // **Reduce** builds up a single result from a list of values, aka `inject`,
15846
15910
  // or `foldl`.
15847
- _.reduce = _.foldl = _.inject = function(obj, iteratee, memo, context) {
15848
- if (obj == null) obj = [];
15849
- iteratee = createCallback(iteratee, context, 4);
15850
- var keys = obj.length !== +obj.length && _.keys(obj),
15851
- length = (keys || obj).length,
15852
- index = 0, currentKey;
15853
- if (arguments.length < 3) {
15854
- if (!length) throw new TypeError(reduceError);
15855
- memo = obj[keys ? keys[index++] : index++];
15856
- }
15857
- for (; index < length; index++) {
15858
- currentKey = keys ? keys[index] : index;
15859
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
15860
- }
15861
- return memo;
15862
- };
15911
+ _.reduce = _.foldl = _.inject = createReduce(1);
15863
15912
 
15864
15913
  // The right-associative version of reduce, also known as `foldr`.
15865
- _.reduceRight = _.foldr = function(obj, iteratee, memo, context) {
15866
- if (obj == null) obj = [];
15867
- iteratee = createCallback(iteratee, context, 4);
15868
- var keys = obj.length !== + obj.length && _.keys(obj),
15869
- index = (keys || obj).length,
15870
- currentKey;
15871
- if (arguments.length < 3) {
15872
- if (!index) throw new TypeError(reduceError);
15873
- memo = obj[keys ? keys[--index] : --index];
15874
- }
15875
- while (index--) {
15876
- currentKey = keys ? keys[index] : index;
15877
- memo = iteratee(memo, obj[currentKey], currentKey, obj);
15878
- }
15879
- return memo;
15880
- };
15914
+ _.reduceRight = _.foldr = createReduce(-1);
15881
15915
 
15882
15916
  // Return the first value which passes a truth test. Aliased as `detect`.
15883
15917
  _.find = _.detect = function(obj, predicate, context) {
15884
- var result;
15885
- predicate = _.iteratee(predicate, context);
15886
- _.some(obj, function(value, index, list) {
15887
- if (predicate(value, index, list)) {
15888
- result = value;
15889
- return true;
15890
- }
15891
- });
15892
- return result;
15918
+ var key;
15919
+ if (isArrayLike(obj)) {
15920
+ key = _.findIndex(obj, predicate, context);
15921
+ } else {
15922
+ key = _.findKey(obj, predicate, context);
15923
+ }
15924
+ if (key !== void 0 && key !== -1) return obj[key];
15893
15925
  };
15894
15926
 
15895
15927
  // Return all the elements that pass a truth test.
15896
15928
  // Aliased as `select`.
15897
15929
  _.filter = _.select = function(obj, predicate, context) {
15898
15930
  var results = [];
15899
- if (obj == null) return results;
15900
- predicate = _.iteratee(predicate, context);
15931
+ predicate = cb(predicate, context);
15901
15932
  _.each(obj, function(value, index, list) {
15902
15933
  if (predicate(value, index, list)) results.push(value);
15903
15934
  });
@@ -15906,19 +15937,17 @@ if (typeof module !== 'undefined' && module.exports) {
15906
15937
 
15907
15938
  // Return all the elements for which a truth test fails.
15908
15939
  _.reject = function(obj, predicate, context) {
15909
- return _.filter(obj, _.negate(_.iteratee(predicate)), context);
15940
+ return _.filter(obj, _.negate(cb(predicate)), context);
15910
15941
  };
15911
15942
 
15912
15943
  // Determine whether all of the elements match a truth test.
15913
15944
  // Aliased as `all`.
15914
15945
  _.every = _.all = function(obj, predicate, context) {
15915
- if (obj == null) return true;
15916
- predicate = _.iteratee(predicate, context);
15917
- var keys = obj.length !== +obj.length && _.keys(obj),
15918
- length = (keys || obj).length,
15919
- index, currentKey;
15920
- for (index = 0; index < length; index++) {
15921
- currentKey = keys ? keys[index] : index;
15946
+ predicate = cb(predicate, context);
15947
+ var keys = !isArrayLike(obj) && _.keys(obj),
15948
+ length = (keys || obj).length;
15949
+ for (var index = 0; index < length; index++) {
15950
+ var currentKey = keys ? keys[index] : index;
15922
15951
  if (!predicate(obj[currentKey], currentKey, obj)) return false;
15923
15952
  }
15924
15953
  return true;
@@ -15927,24 +15956,21 @@ if (typeof module !== 'undefined' && module.exports) {
15927
15956
  // Determine if at least one element in the object matches a truth test.
15928
15957
  // Aliased as `any`.
15929
15958
  _.some = _.any = function(obj, predicate, context) {
15930
- if (obj == null) return false;
15931
- predicate = _.iteratee(predicate, context);
15932
- var keys = obj.length !== +obj.length && _.keys(obj),
15933
- length = (keys || obj).length,
15934
- index, currentKey;
15935
- for (index = 0; index < length; index++) {
15936
- currentKey = keys ? keys[index] : index;
15959
+ predicate = cb(predicate, context);
15960
+ var keys = !isArrayLike(obj) && _.keys(obj),
15961
+ length = (keys || obj).length;
15962
+ for (var index = 0; index < length; index++) {
15963
+ var currentKey = keys ? keys[index] : index;
15937
15964
  if (predicate(obj[currentKey], currentKey, obj)) return true;
15938
15965
  }
15939
15966
  return false;
15940
15967
  };
15941
15968
 
15942
15969
  // Determine if the array or object contains a given value (using `===`).
15943
- // Aliased as `include`.
15944
- _.contains = _.include = function(obj, target) {
15945
- if (obj == null) return false;
15946
- if (obj.length !== +obj.length) obj = _.values(obj);
15947
- return _.indexOf(obj, target) >= 0;
15970
+ // Aliased as `includes` and `include`.
15971
+ _.contains = _.includes = _.include = function(obj, target, fromIndex) {
15972
+ if (!isArrayLike(obj)) obj = _.values(obj);
15973
+ return _.indexOf(obj, target, typeof fromIndex == 'number' && fromIndex) >= 0;
15948
15974
  };
15949
15975
 
15950
15976
  // Invoke a method (with arguments) on every item in a collection.
@@ -15952,7 +15978,8 @@ if (typeof module !== 'undefined' && module.exports) {
15952
15978
  var args = slice.call(arguments, 2);
15953
15979
  var isFunc = _.isFunction(method);
15954
15980
  return _.map(obj, function(value) {
15955
- return (isFunc ? method : value[method]).apply(value, args);
15981
+ var func = isFunc ? method : value[method];
15982
+ return func == null ? func : func.apply(value, args);
15956
15983
  });
15957
15984
  };
15958
15985
 
@@ -15964,13 +15991,13 @@ if (typeof module !== 'undefined' && module.exports) {
15964
15991
  // Convenience version of a common use case of `filter`: selecting only objects
15965
15992
  // containing specific `key:value` pairs.
15966
15993
  _.where = function(obj, attrs) {
15967
- return _.filter(obj, _.matches(attrs));
15994
+ return _.filter(obj, _.matcher(attrs));
15968
15995
  };
15969
15996
 
15970
15997
  // Convenience version of a common use case of `find`: getting the first object
15971
15998
  // containing specific `key:value` pairs.
15972
15999
  _.findWhere = function(obj, attrs) {
15973
- return _.find(obj, _.matches(attrs));
16000
+ return _.find(obj, _.matcher(attrs));
15974
16001
  };
15975
16002
 
15976
16003
  // Return the maximum element (or element-based computation).
@@ -15978,7 +16005,7 @@ if (typeof module !== 'undefined' && module.exports) {
15978
16005
  var result = -Infinity, lastComputed = -Infinity,
15979
16006
  value, computed;
15980
16007
  if (iteratee == null && obj != null) {
15981
- obj = obj.length === +obj.length ? obj : _.values(obj);
16008
+ obj = isArrayLike(obj) ? obj : _.values(obj);
15982
16009
  for (var i = 0, length = obj.length; i < length; i++) {
15983
16010
  value = obj[i];
15984
16011
  if (value > result) {
@@ -15986,7 +16013,7 @@ if (typeof module !== 'undefined' && module.exports) {
15986
16013
  }
15987
16014
  }
15988
16015
  } else {
15989
- iteratee = _.iteratee(iteratee, context);
16016
+ iteratee = cb(iteratee, context);
15990
16017
  _.each(obj, function(value, index, list) {
15991
16018
  computed = iteratee(value, index, list);
15992
16019
  if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
@@ -16003,7 +16030,7 @@ if (typeof module !== 'undefined' && module.exports) {
16003
16030
  var result = Infinity, lastComputed = Infinity,
16004
16031
  value, computed;
16005
16032
  if (iteratee == null && obj != null) {
16006
- obj = obj.length === +obj.length ? obj : _.values(obj);
16033
+ obj = isArrayLike(obj) ? obj : _.values(obj);
16007
16034
  for (var i = 0, length = obj.length; i < length; i++) {
16008
16035
  value = obj[i];
16009
16036
  if (value < result) {
@@ -16011,7 +16038,7 @@ if (typeof module !== 'undefined' && module.exports) {
16011
16038
  }
16012
16039
  }
16013
16040
  } else {
16014
- iteratee = _.iteratee(iteratee, context);
16041
+ iteratee = cb(iteratee, context);
16015
16042
  _.each(obj, function(value, index, list) {
16016
16043
  computed = iteratee(value, index, list);
16017
16044
  if (computed < lastComputed || computed === Infinity && result === Infinity) {
@@ -16026,7 +16053,7 @@ if (typeof module !== 'undefined' && module.exports) {
16026
16053
  // Shuffle a collection, using the modern version of the
16027
16054
  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
16028
16055
  _.shuffle = function(obj) {
16029
- var set = obj && obj.length === +obj.length ? obj : _.values(obj);
16056
+ var set = isArrayLike(obj) ? obj : _.values(obj);
16030
16057
  var length = set.length;
16031
16058
  var shuffled = Array(length);
16032
16059
  for (var index = 0, rand; index < length; index++) {
@@ -16042,7 +16069,7 @@ if (typeof module !== 'undefined' && module.exports) {
16042
16069
  // The internal `guard` argument allows it to work with `map`.
16043
16070
  _.sample = function(obj, n, guard) {
16044
16071
  if (n == null || guard) {
16045
- if (obj.length !== +obj.length) obj = _.values(obj);
16072
+ if (!isArrayLike(obj)) obj = _.values(obj);
16046
16073
  return obj[_.random(obj.length - 1)];
16047
16074
  }
16048
16075
  return _.shuffle(obj).slice(0, Math.max(0, n));
@@ -16050,7 +16077,7 @@ if (typeof module !== 'undefined' && module.exports) {
16050
16077
 
16051
16078
  // Sort the object's values by a criterion produced by an iteratee.
16052
16079
  _.sortBy = function(obj, iteratee, context) {
16053
- iteratee = _.iteratee(iteratee, context);
16080
+ iteratee = cb(iteratee, context);
16054
16081
  return _.pluck(_.map(obj, function(value, index, list) {
16055
16082
  return {
16056
16083
  value: value,
@@ -16072,7 +16099,7 @@ if (typeof module !== 'undefined' && module.exports) {
16072
16099
  var group = function(behavior) {
16073
16100
  return function(obj, iteratee, context) {
16074
16101
  var result = {};
16075
- iteratee = _.iteratee(iteratee, context);
16102
+ iteratee = cb(iteratee, context);
16076
16103
  _.each(obj, function(value, index) {
16077
16104
  var key = iteratee(value, index, obj);
16078
16105
  behavior(result, value, key);
@@ -16100,37 +16127,24 @@ if (typeof module !== 'undefined' && module.exports) {
16100
16127
  if (_.has(result, key)) result[key]++; else result[key] = 1;
16101
16128
  });
16102
16129
 
16103
- // Use a comparator function to figure out the smallest index at which
16104
- // an object should be inserted so as to maintain order. Uses binary search.
16105
- _.sortedIndex = function(array, obj, iteratee, context) {
16106
- iteratee = _.iteratee(iteratee, context, 1);
16107
- var value = iteratee(obj);
16108
- var low = 0, high = array.length;
16109
- while (low < high) {
16110
- var mid = low + high >>> 1;
16111
- if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
16112
- }
16113
- return low;
16114
- };
16115
-
16116
16130
  // Safely create a real, live array from anything iterable.
16117
16131
  _.toArray = function(obj) {
16118
16132
  if (!obj) return [];
16119
16133
  if (_.isArray(obj)) return slice.call(obj);
16120
- if (obj.length === +obj.length) return _.map(obj, _.identity);
16134
+ if (isArrayLike(obj)) return _.map(obj, _.identity);
16121
16135
  return _.values(obj);
16122
16136
  };
16123
16137
 
16124
16138
  // Return the number of elements in an object.
16125
16139
  _.size = function(obj) {
16126
16140
  if (obj == null) return 0;
16127
- return obj.length === +obj.length ? obj.length : _.keys(obj).length;
16141
+ return isArrayLike(obj) ? obj.length : _.keys(obj).length;
16128
16142
  };
16129
16143
 
16130
16144
  // Split a collection into two arrays: one whose elements all satisfy the given
16131
16145
  // predicate, and one whose elements all do not satisfy the predicate.
16132
16146
  _.partition = function(obj, predicate, context) {
16133
- predicate = _.iteratee(predicate, context);
16147
+ predicate = cb(predicate, context);
16134
16148
  var pass = [], fail = [];
16135
16149
  _.each(obj, function(value, key, obj) {
16136
16150
  (predicate(value, key, obj) ? pass : fail).push(value);
@@ -16147,30 +16161,27 @@ if (typeof module !== 'undefined' && module.exports) {
16147
16161
  _.first = _.head = _.take = function(array, n, guard) {
16148
16162
  if (array == null) return void 0;
16149
16163
  if (n == null || guard) return array[0];
16150
- if (n < 0) return [];
16151
- return slice.call(array, 0, n);
16164
+ return _.initial(array, array.length - n);
16152
16165
  };
16153
16166
 
16154
16167
  // Returns everything but the last entry of the array. Especially useful on
16155
16168
  // the arguments object. Passing **n** will return all the values in
16156
- // the array, excluding the last N. The **guard** check allows it to work with
16157
- // `_.map`.
16169
+ // the array, excluding the last N.
16158
16170
  _.initial = function(array, n, guard) {
16159
16171
  return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
16160
16172
  };
16161
16173
 
16162
16174
  // Get the last element of an array. Passing **n** will return the last N
16163
- // values in the array. The **guard** check allows it to work with `_.map`.
16175
+ // values in the array.
16164
16176
  _.last = function(array, n, guard) {
16165
16177
  if (array == null) return void 0;
16166
16178
  if (n == null || guard) return array[array.length - 1];
16167
- return slice.call(array, Math.max(array.length - n, 0));
16179
+ return _.rest(array, Math.max(0, array.length - n));
16168
16180
  };
16169
16181
 
16170
16182
  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
16171
16183
  // Especially useful on the arguments object. Passing an **n** will return
16172
- // the rest N values in the array. The **guard**
16173
- // check allows it to work with `_.map`.
16184
+ // the rest N values in the array.
16174
16185
  _.rest = _.tail = _.drop = function(array, n, guard) {
16175
16186
  return slice.call(array, n == null || guard ? 1 : n);
16176
16187
  };
@@ -16181,18 +16192,20 @@ if (typeof module !== 'undefined' && module.exports) {
16181
16192
  };
16182
16193
 
16183
16194
  // Internal implementation of a recursive `flatten` function.
16184
- var flatten = function(input, shallow, strict, output) {
16185
- if (shallow && _.every(input, _.isArray)) {
16186
- return concat.apply(output, input);
16187
- }
16188
- for (var i = 0, length = input.length; i < length; i++) {
16195
+ var flatten = function(input, shallow, strict, startIndex) {
16196
+ var output = [], idx = 0;
16197
+ for (var i = startIndex || 0, length = input && input.length; i < length; i++) {
16189
16198
  var value = input[i];
16190
- if (!_.isArray(value) && !_.isArguments(value)) {
16191
- if (!strict) output.push(value);
16192
- } else if (shallow) {
16193
- push.apply(output, value);
16194
- } else {
16195
- flatten(value, shallow, strict, output);
16199
+ if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) {
16200
+ //flatten current level of array or arguments object
16201
+ if (!shallow) value = flatten(value, shallow, strict);
16202
+ var j = 0, len = value.length;
16203
+ output.length += len;
16204
+ while (j < len) {
16205
+ output[idx++] = value[j++];
16206
+ }
16207
+ } else if (!strict) {
16208
+ output[idx++] = value;
16196
16209
  }
16197
16210
  }
16198
16211
  return output;
@@ -16200,7 +16213,7 @@ if (typeof module !== 'undefined' && module.exports) {
16200
16213
 
16201
16214
  // Flatten out an array, either recursively (by default), or just one level.
16202
16215
  _.flatten = function(array, shallow) {
16203
- return flatten(array, shallow, false, []);
16216
+ return flatten(array, shallow, false);
16204
16217
  };
16205
16218
 
16206
16219
  // Return a version of the array that does not contain the specified value(s).
@@ -16218,21 +16231,21 @@ if (typeof module !== 'undefined' && module.exports) {
16218
16231
  iteratee = isSorted;
16219
16232
  isSorted = false;
16220
16233
  }
16221
- if (iteratee != null) iteratee = _.iteratee(iteratee, context);
16234
+ if (iteratee != null) iteratee = cb(iteratee, context);
16222
16235
  var result = [];
16223
16236
  var seen = [];
16224
16237
  for (var i = 0, length = array.length; i < length; i++) {
16225
- var value = array[i];
16238
+ var value = array[i],
16239
+ computed = iteratee ? iteratee(value, i, array) : value;
16226
16240
  if (isSorted) {
16227
- if (!i || seen !== value) result.push(value);
16228
- seen = value;
16241
+ if (!i || seen !== computed) result.push(value);
16242
+ seen = computed;
16229
16243
  } else if (iteratee) {
16230
- var computed = iteratee(value, i, array);
16231
- if (_.indexOf(seen, computed) < 0) {
16244
+ if (!_.contains(seen, computed)) {
16232
16245
  seen.push(computed);
16233
16246
  result.push(value);
16234
16247
  }
16235
- } else if (_.indexOf(result, value) < 0) {
16248
+ } else if (!_.contains(result, value)) {
16236
16249
  result.push(value);
16237
16250
  }
16238
16251
  }
@@ -16242,7 +16255,7 @@ if (typeof module !== 'undefined' && module.exports) {
16242
16255
  // Produce an array that contains the union: each distinct element from all of
16243
16256
  // the passed-in arrays.
16244
16257
  _.union = function() {
16245
- return _.uniq(flatten(arguments, true, true, []));
16258
+ return _.uniq(flatten(arguments, true, true));
16246
16259
  };
16247
16260
 
16248
16261
  // Produce an array that contains every item shared between all the
@@ -16265,7 +16278,7 @@ if (typeof module !== 'undefined' && module.exports) {
16265
16278
  // Take the difference between one array and a number of other arrays.
16266
16279
  // Only the elements present in just the first array will remain.
16267
16280
  _.difference = function(array) {
16268
- var rest = flatten(slice.call(arguments, 1), true, true, []);
16281
+ var rest = flatten(arguments, true, true, 1);
16269
16282
  return _.filter(array, function(value){
16270
16283
  return !_.contains(rest, value);
16271
16284
  });
@@ -16273,23 +16286,28 @@ if (typeof module !== 'undefined' && module.exports) {
16273
16286
 
16274
16287
  // Zip together multiple lists into a single array -- elements that share
16275
16288
  // an index go together.
16276
- _.zip = function(array) {
16277
- if (array == null) return [];
16278
- var length = _.max(arguments, 'length').length;
16279
- var results = Array(length);
16280
- for (var i = 0; i < length; i++) {
16281
- results[i] = _.pluck(arguments, i);
16289
+ _.zip = function() {
16290
+ return _.unzip(arguments);
16291
+ };
16292
+
16293
+ // Complement of _.zip. Unzip accepts an array of arrays and groups
16294
+ // each array's elements on shared indices
16295
+ _.unzip = function(array) {
16296
+ var length = array && _.max(array, 'length').length || 0;
16297
+ var result = Array(length);
16298
+
16299
+ for (var index = 0; index < length; index++) {
16300
+ result[index] = _.pluck(array, index);
16282
16301
  }
16283
- return results;
16302
+ return result;
16284
16303
  };
16285
16304
 
16286
16305
  // Converts lists into objects. Pass either a single array of `[key, value]`
16287
16306
  // pairs, or two parallel arrays of the same length -- one of keys, and one of
16288
16307
  // the corresponding values.
16289
16308
  _.object = function(list, values) {
16290
- if (list == null) return {};
16291
16309
  var result = {};
16292
- for (var i = 0, length = list.length; i < length; i++) {
16310
+ for (var i = 0, length = list && list.length; i < length; i++) {
16293
16311
  if (values) {
16294
16312
  result[list[i]] = values[i];
16295
16313
  } else {
@@ -16304,30 +16322,63 @@ if (typeof module !== 'undefined' && module.exports) {
16304
16322
  // If the array is large and already in sort order, pass `true`
16305
16323
  // for **isSorted** to use binary search.
16306
16324
  _.indexOf = function(array, item, isSorted) {
16307
- if (array == null) return -1;
16308
- var i = 0, length = array.length;
16309
- if (isSorted) {
16310
- if (typeof isSorted == 'number') {
16311
- i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
16312
- } else {
16313
- i = _.sortedIndex(array, item);
16314
- return array[i] === item ? i : -1;
16315
- }
16325
+ var i = 0, length = array && array.length;
16326
+ if (typeof isSorted == 'number') {
16327
+ i = isSorted < 0 ? Math.max(0, length + isSorted) : isSorted;
16328
+ } else if (isSorted && length) {
16329
+ i = _.sortedIndex(array, item);
16330
+ return array[i] === item ? i : -1;
16331
+ }
16332
+ if (item !== item) {
16333
+ return _.findIndex(slice.call(array, i), _.isNaN);
16316
16334
  }
16317
16335
  for (; i < length; i++) if (array[i] === item) return i;
16318
16336
  return -1;
16319
16337
  };
16320
16338
 
16321
16339
  _.lastIndexOf = function(array, item, from) {
16322
- if (array == null) return -1;
16323
- var idx = array.length;
16340
+ var idx = array ? array.length : 0;
16324
16341
  if (typeof from == 'number') {
16325
16342
  idx = from < 0 ? idx + from + 1 : Math.min(idx, from + 1);
16326
16343
  }
16344
+ if (item !== item) {
16345
+ return _.findLastIndex(slice.call(array, 0, idx), _.isNaN);
16346
+ }
16327
16347
  while (--idx >= 0) if (array[idx] === item) return idx;
16328
16348
  return -1;
16329
16349
  };
16330
16350
 
16351
+ // Generator function to create the findIndex and findLastIndex functions
16352
+ function createIndexFinder(dir) {
16353
+ return function(array, predicate, context) {
16354
+ predicate = cb(predicate, context);
16355
+ var length = array != null && array.length;
16356
+ var index = dir > 0 ? 0 : length - 1;
16357
+ for (; index >= 0 && index < length; index += dir) {
16358
+ if (predicate(array[index], index, array)) return index;
16359
+ }
16360
+ return -1;
16361
+ };
16362
+ }
16363
+
16364
+ // Returns the first index on an array-like that passes a predicate test
16365
+ _.findIndex = createIndexFinder(1);
16366
+
16367
+ _.findLastIndex = createIndexFinder(-1);
16368
+
16369
+ // Use a comparator function to figure out the smallest index at which
16370
+ // an object should be inserted so as to maintain order. Uses binary search.
16371
+ _.sortedIndex = function(array, obj, iteratee, context) {
16372
+ iteratee = cb(iteratee, context, 1);
16373
+ var value = iteratee(obj);
16374
+ var low = 0, high = array.length;
16375
+ while (low < high) {
16376
+ var mid = Math.floor((low + high) / 2);
16377
+ if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
16378
+ }
16379
+ return low;
16380
+ };
16381
+
16331
16382
  // Generate an integer Array containing an arithmetic progression. A port of
16332
16383
  // the native Python `range()` function. See
16333
16384
  // [the Python documentation](http://docs.python.org/library/functions.html#range).
@@ -16351,25 +16402,25 @@ if (typeof module !== 'undefined' && module.exports) {
16351
16402
  // Function (ahem) Functions
16352
16403
  // ------------------
16353
16404
 
16354
- // Reusable constructor function for prototype setting.
16355
- var Ctor = function(){};
16405
+ // Determines whether to execute a function as a constructor
16406
+ // or a normal function with the provided arguments
16407
+ var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {
16408
+ if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
16409
+ var self = baseCreate(sourceFunc.prototype);
16410
+ var result = sourceFunc.apply(self, args);
16411
+ if (_.isObject(result)) return result;
16412
+ return self;
16413
+ };
16356
16414
 
16357
16415
  // Create a function bound to a given object (assigning `this`, and arguments,
16358
16416
  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
16359
16417
  // available.
16360
16418
  _.bind = function(func, context) {
16361
- var args, bound;
16362
16419
  if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
16363
16420
  if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function');
16364
- args = slice.call(arguments, 2);
16365
- bound = function() {
16366
- if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
16367
- Ctor.prototype = func.prototype;
16368
- var self = new Ctor;
16369
- Ctor.prototype = null;
16370
- var result = func.apply(self, args.concat(slice.call(arguments)));
16371
- if (_.isObject(result)) return result;
16372
- return self;
16421
+ var args = slice.call(arguments, 2);
16422
+ var bound = function() {
16423
+ return executeBound(func, bound, context, this, args.concat(slice.call(arguments)));
16373
16424
  };
16374
16425
  return bound;
16375
16426
  };
@@ -16379,15 +16430,16 @@ if (typeof module !== 'undefined' && module.exports) {
16379
16430
  // as a placeholder, allowing any combination of arguments to be pre-filled.
16380
16431
  _.partial = function(func) {
16381
16432
  var boundArgs = slice.call(arguments, 1);
16382
- return function() {
16383
- var position = 0;
16384
- var args = boundArgs.slice();
16385
- for (var i = 0, length = args.length; i < length; i++) {
16386
- if (args[i] === _) args[i] = arguments[position++];
16433
+ var bound = function() {
16434
+ var position = 0, length = boundArgs.length;
16435
+ var args = Array(length);
16436
+ for (var i = 0; i < length; i++) {
16437
+ args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i];
16387
16438
  }
16388
16439
  while (position < arguments.length) args.push(arguments[position++]);
16389
- return func.apply(this, args);
16440
+ return executeBound(func, bound, this, this, args);
16390
16441
  };
16442
+ return bound;
16391
16443
  };
16392
16444
 
16393
16445
  // Bind a number of an object's methods to that object. Remaining arguments
@@ -16407,7 +16459,7 @@ if (typeof module !== 'undefined' && module.exports) {
16407
16459
  _.memoize = function(func, hasher) {
16408
16460
  var memoize = function(key) {
16409
16461
  var cache = memoize.cache;
16410
- var address = hasher ? hasher.apply(this, arguments) : key;
16462
+ var address = '' + (hasher ? hasher.apply(this, arguments) : key);
16411
16463
  if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
16412
16464
  return cache[address];
16413
16465
  };
@@ -16426,9 +16478,7 @@ if (typeof module !== 'undefined' && module.exports) {
16426
16478
 
16427
16479
  // Defers a function, scheduling it to run after the current call stack has
16428
16480
  // cleared.
16429
- _.defer = function(func) {
16430
- return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
16431
- };
16481
+ _.defer = _.partial(_.delay, _, 1);
16432
16482
 
16433
16483
  // Returns a function, that, when invoked, will only be triggered at most once
16434
16484
  // during a given window of time. Normally, the throttled function will run
@@ -16453,8 +16503,10 @@ if (typeof module !== 'undefined' && module.exports) {
16453
16503
  context = this;
16454
16504
  args = arguments;
16455
16505
  if (remaining <= 0 || remaining > wait) {
16456
- clearTimeout(timeout);
16457
- timeout = null;
16506
+ if (timeout) {
16507
+ clearTimeout(timeout);
16508
+ timeout = null;
16509
+ }
16458
16510
  previous = now;
16459
16511
  result = func.apply(context, args);
16460
16512
  if (!timeout) context = args = null;
@@ -16475,7 +16527,7 @@ if (typeof module !== 'undefined' && module.exports) {
16475
16527
  var later = function() {
16476
16528
  var last = _.now() - timestamp;
16477
16529
 
16478
- if (last < wait && last > 0) {
16530
+ if (last < wait && last >= 0) {
16479
16531
  timeout = setTimeout(later, wait - last);
16480
16532
  } else {
16481
16533
  timeout = null;
@@ -16528,7 +16580,7 @@ if (typeof module !== 'undefined' && module.exports) {
16528
16580
  };
16529
16581
  };
16530
16582
 
16531
- // Returns a function that will only be executed after being called N times.
16583
+ // Returns a function that will only be executed on and after the Nth call.
16532
16584
  _.after = function(times, func) {
16533
16585
  return function() {
16534
16586
  if (--times < 1) {
@@ -16537,15 +16589,14 @@ if (typeof module !== 'undefined' && module.exports) {
16537
16589
  };
16538
16590
  };
16539
16591
 
16540
- // Returns a function that will only be executed before being called N times.
16592
+ // Returns a function that will only be executed up to (but not including) the Nth call.
16541
16593
  _.before = function(times, func) {
16542
16594
  var memo;
16543
16595
  return function() {
16544
16596
  if (--times > 0) {
16545
16597
  memo = func.apply(this, arguments);
16546
- } else {
16547
- func = null;
16548
16598
  }
16599
+ if (times <= 1) func = null;
16549
16600
  return memo;
16550
16601
  };
16551
16602
  };
@@ -16557,13 +16608,47 @@ if (typeof module !== 'undefined' && module.exports) {
16557
16608
  // Object Functions
16558
16609
  // ----------------
16559
16610
 
16560
- // Retrieve the names of an object's properties.
16611
+ // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
16612
+ var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
16613
+ var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
16614
+ 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
16615
+
16616
+ function collectNonEnumProps(obj, keys) {
16617
+ var nonEnumIdx = nonEnumerableProps.length;
16618
+ var constructor = obj.constructor;
16619
+ var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto;
16620
+
16621
+ // Constructor is a special case.
16622
+ var prop = 'constructor';
16623
+ if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop);
16624
+
16625
+ while (nonEnumIdx--) {
16626
+ prop = nonEnumerableProps[nonEnumIdx];
16627
+ if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) {
16628
+ keys.push(prop);
16629
+ }
16630
+ }
16631
+ }
16632
+
16633
+ // Retrieve the names of an object's own properties.
16561
16634
  // Delegates to **ECMAScript 5**'s native `Object.keys`
16562
16635
  _.keys = function(obj) {
16563
16636
  if (!_.isObject(obj)) return [];
16564
16637
  if (nativeKeys) return nativeKeys(obj);
16565
16638
  var keys = [];
16566
16639
  for (var key in obj) if (_.has(obj, key)) keys.push(key);
16640
+ // Ahem, IE < 9.
16641
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
16642
+ return keys;
16643
+ };
16644
+
16645
+ // Retrieve all the property names of an object.
16646
+ _.allKeys = function(obj) {
16647
+ if (!_.isObject(obj)) return [];
16648
+ var keys = [];
16649
+ for (var key in obj) keys.push(key);
16650
+ // Ahem, IE < 9.
16651
+ if (hasEnumBug) collectNonEnumProps(obj, keys);
16567
16652
  return keys;
16568
16653
  };
16569
16654
 
@@ -16578,6 +16663,21 @@ if (typeof module !== 'undefined' && module.exports) {
16578
16663
  return values;
16579
16664
  };
16580
16665
 
16666
+ // Returns the results of applying the iteratee to each element of the object
16667
+ // In contrast to _.map it returns an object
16668
+ _.mapObject = function(obj, iteratee, context) {
16669
+ iteratee = cb(iteratee, context);
16670
+ var keys = _.keys(obj),
16671
+ length = keys.length,
16672
+ results = {},
16673
+ currentKey;
16674
+ for (var index = 0; index < length; index++) {
16675
+ currentKey = keys[index];
16676
+ results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
16677
+ }
16678
+ return results;
16679
+ };
16680
+
16581
16681
  // Convert an object into a list of `[key, value]` pairs.
16582
16682
  _.pairs = function(obj) {
16583
16683
  var keys = _.keys(obj);
@@ -16610,37 +16710,38 @@ if (typeof module !== 'undefined' && module.exports) {
16610
16710
  };
16611
16711
 
16612
16712
  // Extend a given object with all the properties in passed-in object(s).
16613
- _.extend = function(obj) {
16614
- if (!_.isObject(obj)) return obj;
16615
- var source, prop;
16616
- for (var i = 1, length = arguments.length; i < length; i++) {
16617
- source = arguments[i];
16618
- for (prop in source) {
16619
- if (hasOwnProperty.call(source, prop)) {
16620
- obj[prop] = source[prop];
16621
- }
16622
- }
16713
+ _.extend = createAssigner(_.allKeys);
16714
+
16715
+ // Assigns a given object with all the own properties in the passed-in object(s)
16716
+ // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
16717
+ _.extendOwn = _.assign = createAssigner(_.keys);
16718
+
16719
+ // Returns the first key on an object that passes a predicate test
16720
+ _.findKey = function(obj, predicate, context) {
16721
+ predicate = cb(predicate, context);
16722
+ var keys = _.keys(obj), key;
16723
+ for (var i = 0, length = keys.length; i < length; i++) {
16724
+ key = keys[i];
16725
+ if (predicate(obj[key], key, obj)) return key;
16623
16726
  }
16624
- return obj;
16625
16727
  };
16626
16728
 
16627
16729
  // Return a copy of the object only containing the whitelisted properties.
16628
- _.pick = function(obj, iteratee, context) {
16629
- var result = {}, key;
16730
+ _.pick = function(object, oiteratee, context) {
16731
+ var result = {}, obj = object, iteratee, keys;
16630
16732
  if (obj == null) return result;
16631
- if (_.isFunction(iteratee)) {
16632
- iteratee = createCallback(iteratee, context);
16633
- for (key in obj) {
16634
- var value = obj[key];
16635
- if (iteratee(value, key, obj)) result[key] = value;
16636
- }
16733
+ if (_.isFunction(oiteratee)) {
16734
+ keys = _.allKeys(obj);
16735
+ iteratee = optimizeCb(oiteratee, context);
16637
16736
  } else {
16638
- var keys = concat.apply([], slice.call(arguments, 1));
16639
- obj = new Object(obj);
16640
- for (var i = 0, length = keys.length; i < length; i++) {
16641
- key = keys[i];
16642
- if (key in obj) result[key] = obj[key];
16643
- }
16737
+ keys = flatten(arguments, false, false, 1);
16738
+ iteratee = function(value, key, obj) { return key in obj; };
16739
+ obj = Object(obj);
16740
+ }
16741
+ for (var i = 0, length = keys.length; i < length; i++) {
16742
+ var key = keys[i];
16743
+ var value = obj[key];
16744
+ if (iteratee(value, key, obj)) result[key] = value;
16644
16745
  }
16645
16746
  return result;
16646
16747
  };
@@ -16650,7 +16751,7 @@ if (typeof module !== 'undefined' && module.exports) {
16650
16751
  if (_.isFunction(iteratee)) {
16651
16752
  iteratee = _.negate(iteratee);
16652
16753
  } else {
16653
- var keys = _.map(concat.apply([], slice.call(arguments, 1)), String);
16754
+ var keys = _.map(flatten(arguments, false, false, 1), String);
16654
16755
  iteratee = function(value, key) {
16655
16756
  return !_.contains(keys, key);
16656
16757
  };
@@ -16659,16 +16760,7 @@ if (typeof module !== 'undefined' && module.exports) {
16659
16760
  };
16660
16761
 
16661
16762
  // Fill in a given object with default properties.
16662
- _.defaults = function(obj) {
16663
- if (!_.isObject(obj)) return obj;
16664
- for (var i = 1, length = arguments.length; i < length; i++) {
16665
- var source = arguments[i];
16666
- for (var prop in source) {
16667
- if (obj[prop] === void 0) obj[prop] = source[prop];
16668
- }
16669
- }
16670
- return obj;
16671
- };
16763
+ _.defaults = createAssigner(_.allKeys, true);
16672
16764
 
16673
16765
  // Create a (shallow-cloned) duplicate of an object.
16674
16766
  _.clone = function(obj) {
@@ -16684,6 +16776,19 @@ if (typeof module !== 'undefined' && module.exports) {
16684
16776
  return obj;
16685
16777
  };
16686
16778
 
16779
+ // Returns whether an object has a given set of `key:value` pairs.
16780
+ _.isMatch = function(object, attrs) {
16781
+ var keys = _.keys(attrs), length = keys.length;
16782
+ if (object == null) return !length;
16783
+ var obj = Object(object);
16784
+ for (var i = 0; i < length; i++) {
16785
+ var key = keys[i];
16786
+ if (attrs[key] !== obj[key] || !(key in obj)) return false;
16787
+ }
16788
+ return true;
16789
+ };
16790
+
16791
+
16687
16792
  // Internal recursive comparison function for `isEqual`.
16688
16793
  var eq = function(a, b, aStack, bStack) {
16689
16794
  // Identical objects are equal. `0 === -0`, but they aren't identical.
@@ -16718,74 +16823,76 @@ if (typeof module !== 'undefined' && module.exports) {
16718
16823
  // of `NaN` are not equivalent.
16719
16824
  return +a === +b;
16720
16825
  }
16721
- if (typeof a != 'object' || typeof b != 'object') return false;
16826
+
16827
+ var areArrays = className === '[object Array]';
16828
+ if (!areArrays) {
16829
+ if (typeof a != 'object' || typeof b != 'object') return false;
16830
+
16831
+ // Objects with different constructors are not equivalent, but `Object`s or `Array`s
16832
+ // from different frames are.
16833
+ var aCtor = a.constructor, bCtor = b.constructor;
16834
+ if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
16835
+ _.isFunction(bCtor) && bCtor instanceof bCtor)
16836
+ && ('constructor' in a && 'constructor' in b)) {
16837
+ return false;
16838
+ }
16839
+ }
16722
16840
  // Assume equality for cyclic structures. The algorithm for detecting cyclic
16723
16841
  // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
16842
+
16843
+ // Initializing stack of traversed objects.
16844
+ // It's done here since we only need them for objects and arrays comparison.
16845
+ aStack = aStack || [];
16846
+ bStack = bStack || [];
16724
16847
  var length = aStack.length;
16725
16848
  while (length--) {
16726
16849
  // Linear search. Performance is inversely proportional to the number of
16727
16850
  // unique nested structures.
16728
16851
  if (aStack[length] === a) return bStack[length] === b;
16729
16852
  }
16730
- // Objects with different constructors are not equivalent, but `Object`s
16731
- // from different frames are.
16732
- var aCtor = a.constructor, bCtor = b.constructor;
16733
- if (
16734
- aCtor !== bCtor &&
16735
- // Handle Object.create(x) cases
16736
- 'constructor' in a && 'constructor' in b &&
16737
- !(_.isFunction(aCtor) && aCtor instanceof aCtor &&
16738
- _.isFunction(bCtor) && bCtor instanceof bCtor)
16739
- ) {
16740
- return false;
16741
- }
16853
+
16742
16854
  // Add the first object to the stack of traversed objects.
16743
16855
  aStack.push(a);
16744
16856
  bStack.push(b);
16745
- var size, result;
16857
+
16746
16858
  // Recursively compare objects and arrays.
16747
- if (className === '[object Array]') {
16859
+ if (areArrays) {
16748
16860
  // Compare array lengths to determine if a deep comparison is necessary.
16749
- size = a.length;
16750
- result = size === b.length;
16751
- if (result) {
16752
- // Deep compare the contents, ignoring non-numeric properties.
16753
- while (size--) {
16754
- if (!(result = eq(a[size], b[size], aStack, bStack))) break;
16755
- }
16861
+ length = a.length;
16862
+ if (length !== b.length) return false;
16863
+ // Deep compare the contents, ignoring non-numeric properties.
16864
+ while (length--) {
16865
+ if (!eq(a[length], b[length], aStack, bStack)) return false;
16756
16866
  }
16757
16867
  } else {
16758
16868
  // Deep compare objects.
16759
16869
  var keys = _.keys(a), key;
16760
- size = keys.length;
16870
+ length = keys.length;
16761
16871
  // Ensure that both objects contain the same number of properties before comparing deep equality.
16762
- result = _.keys(b).length === size;
16763
- if (result) {
16764
- while (size--) {
16765
- // Deep compare each member
16766
- key = keys[size];
16767
- if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
16768
- }
16872
+ if (_.keys(b).length !== length) return false;
16873
+ while (length--) {
16874
+ // Deep compare each member
16875
+ key = keys[length];
16876
+ if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
16769
16877
  }
16770
16878
  }
16771
16879
  // Remove the first object from the stack of traversed objects.
16772
16880
  aStack.pop();
16773
16881
  bStack.pop();
16774
- return result;
16882
+ return true;
16775
16883
  };
16776
16884
 
16777
16885
  // Perform a deep comparison to check if two objects are equal.
16778
16886
  _.isEqual = function(a, b) {
16779
- return eq(a, b, [], []);
16887
+ return eq(a, b);
16780
16888
  };
16781
16889
 
16782
16890
  // Is a given array, string, or object empty?
16783
16891
  // An "empty" object has no enumerable own-properties.
16784
16892
  _.isEmpty = function(obj) {
16785
16893
  if (obj == null) return true;
16786
- if (_.isArray(obj) || _.isString(obj) || _.isArguments(obj)) return obj.length === 0;
16787
- for (var key in obj) if (_.has(obj, key)) return false;
16788
- return true;
16894
+ if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0;
16895
+ return _.keys(obj).length === 0;
16789
16896
  };
16790
16897
 
16791
16898
  // Is a given value a DOM element?
@@ -16805,14 +16912,14 @@ if (typeof module !== 'undefined' && module.exports) {
16805
16912
  return type === 'function' || type === 'object' && !!obj;
16806
16913
  };
16807
16914
 
16808
- // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
16809
- _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
16915
+ // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError.
16916
+ _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) {
16810
16917
  _['is' + name] = function(obj) {
16811
16918
  return toString.call(obj) === '[object ' + name + ']';
16812
16919
  };
16813
16920
  });
16814
16921
 
16815
- // Define a fallback version of the method in browsers (ahem, IE), where
16922
+ // Define a fallback version of the method in browsers (ahem, IE < 9), where
16816
16923
  // there isn't any inspectable "Arguments" type.
16817
16924
  if (!_.isArguments(arguments)) {
16818
16925
  _.isArguments = function(obj) {
@@ -16820,8 +16927,9 @@ if (typeof module !== 'undefined' && module.exports) {
16820
16927
  };
16821
16928
  }
16822
16929
 
16823
- // Optimize `isFunction` if appropriate. Work around an IE 11 bug.
16824
- if (typeof /./ !== 'function') {
16930
+ // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8,
16931
+ // IE 11 (#1621), and in Safari 8 (#1929).
16932
+ if (typeof /./ != 'function' && typeof Int8Array != 'object') {
16825
16933
  _.isFunction = function(obj) {
16826
16934
  return typeof obj == 'function' || false;
16827
16935
  };
@@ -16884,28 +16992,30 @@ if (typeof module !== 'undefined' && module.exports) {
16884
16992
 
16885
16993
  _.property = function(key) {
16886
16994
  return function(obj) {
16995
+ return obj == null ? void 0 : obj[key];
16996
+ };
16997
+ };
16998
+
16999
+ // Generates a function for a given object that returns a given property.
17000
+ _.propertyOf = function(obj) {
17001
+ return obj == null ? function(){} : function(key) {
16887
17002
  return obj[key];
16888
17003
  };
16889
17004
  };
16890
17005
 
16891
- // Returns a predicate for checking whether an object has a given set of `key:value` pairs.
16892
- _.matches = function(attrs) {
16893
- var pairs = _.pairs(attrs), length = pairs.length;
17006
+ // Returns a predicate for checking whether an object has a given set of
17007
+ // `key:value` pairs.
17008
+ _.matcher = _.matches = function(attrs) {
17009
+ attrs = _.extendOwn({}, attrs);
16894
17010
  return function(obj) {
16895
- if (obj == null) return !length;
16896
- obj = new Object(obj);
16897
- for (var i = 0; i < length; i++) {
16898
- var pair = pairs[i], key = pair[0];
16899
- if (pair[1] !== obj[key] || !(key in obj)) return false;
16900
- }
16901
- return true;
17011
+ return _.isMatch(obj, attrs);
16902
17012
  };
16903
17013
  };
16904
17014
 
16905
17015
  // Run a function **n** times.
16906
17016
  _.times = function(n, iteratee, context) {
16907
17017
  var accum = Array(Math.max(0, n));
16908
- iteratee = createCallback(iteratee, context, 1);
17018
+ iteratee = optimizeCb(iteratee, context, 1);
16909
17019
  for (var i = 0; i < n; i++) accum[i] = iteratee(i);
16910
17020
  return accum;
16911
17021
  };
@@ -16954,10 +17064,12 @@ if (typeof module !== 'undefined' && module.exports) {
16954
17064
 
16955
17065
  // If the value of the named `property` is a function then invoke it with the
16956
17066
  // `object` as context; otherwise, return it.
16957
- _.result = function(object, property) {
16958
- if (object == null) return void 0;
16959
- var value = object[property];
16960
- return _.isFunction(value) ? object[property]() : value;
17067
+ _.result = function(object, property, fallback) {
17068
+ var value = object == null ? void 0 : object[property];
17069
+ if (value === void 0) {
17070
+ value = fallback;
17071
+ }
17072
+ return _.isFunction(value) ? value.call(object) : value;
16961
17073
  };
16962
17074
 
16963
17075
  // Generate a unique integer id (unique within the entire client session).
@@ -17072,8 +17184,8 @@ if (typeof module !== 'undefined' && module.exports) {
17072
17184
  // underscore functions. Wrapped objects may be chained.
17073
17185
 
17074
17186
  // Helper function to continue chaining intermediate results.
17075
- var result = function(obj) {
17076
- return this._chain ? _(obj).chain() : obj;
17187
+ var result = function(instance, obj) {
17188
+ return instance._chain ? _(obj).chain() : obj;
17077
17189
  };
17078
17190
 
17079
17191
  // Add your own custom functions to the Underscore object.
@@ -17083,7 +17195,7 @@ if (typeof module !== 'undefined' && module.exports) {
17083
17195
  _.prototype[name] = function() {
17084
17196
  var args = [this._wrapped];
17085
17197
  push.apply(args, arguments);
17086
- return result.call(this, func.apply(_, args));
17198
+ return result(this, func.apply(_, args));
17087
17199
  };
17088
17200
  });
17089
17201
  };
@@ -17098,7 +17210,7 @@ if (typeof module !== 'undefined' && module.exports) {
17098
17210
  var obj = this._wrapped;
17099
17211
  method.apply(obj, arguments);
17100
17212
  if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0];
17101
- return result.call(this, obj);
17213
+ return result(this, obj);
17102
17214
  };
17103
17215
  });
17104
17216
 
@@ -17106,7 +17218,7 @@ if (typeof module !== 'undefined' && module.exports) {
17106
17218
  _.each(['concat', 'join', 'slice'], function(name) {
17107
17219
  var method = ArrayProto[name];
17108
17220
  _.prototype[name] = function() {
17109
- return result.call(this, method.apply(this._wrapped, arguments));
17221
+ return result(this, method.apply(this._wrapped, arguments));
17110
17222
  };
17111
17223
  });
17112
17224
 
@@ -17115,6 +17227,14 @@ if (typeof module !== 'undefined' && module.exports) {
17115
17227
  return this._wrapped;
17116
17228
  };
17117
17229
 
17230
+ // Provide unwrapping proxy for some methods used in engine operations
17231
+ // such as arithmetic and JSON stringification.
17232
+ _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
17233
+
17234
+ _.prototype.toString = function() {
17235
+ return '' + this._wrapped;
17236
+ };
17237
+
17118
17238
  // AMD registration happens at the end for compatibility with AMD loaders
17119
17239
  // that may not enforce next-turn semantics on modules. Even though general
17120
17240
  // practice for AMD registration is to be anonymous, underscore registers