lodash-rails 4.0.0 → 4.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,29 +1,30 @@
1
1
  /**
2
2
  * @license
3
- * lodash 4.0.0 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
3
+ * lodash 4.3.0 (Custom Build) lodash.com/license | Underscore.js 1.8.3 underscorejs.org/LICENSE
4
4
  * Build: `lodash core -o ./dist/lodash.core.js`
5
5
  */
6
- ;(function(){function n(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function t(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===ln?i===i:r(i,c)))var c=i,f=o}return f}function r(n,t,r){var e;return r(n,function(n,r,u){return t(n,r,u)?(e=n,false):void 0}),e}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return w(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return vn[n];
7
- }function c(n){var t=false;if(null!=n&&typeof n.toString!="function")try{t=!!(n+"")}catch(r){}return t}function f(n,t){return n=typeof n=="number"||hn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function a(n){if(Z(n)&&!Vn(n)){if(n instanceof l)return n;if(En.call(n,"__wrapped__")){var t=new l(n.__wrapped__,n.__chain__);return t.__actions__=k(n.__actions__),t}}return new l(n)}function l(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function p(n,t,r,e){return n===ln||H(n,xn[r])&&!En.call(e,r)?t:n;
8
- }function s(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(ln,r)},t)}function h(n,t){var r=true;return $n(n,function(n,e,u){return r=!!t(n,e,u)}),r}function v(n,t){var r=[];return $n(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function y(t,r,e,u){u||(u=[]);for(var o=-1,i=t.length;++o<i;){var c=t[o];Z(c)&&Q(c)&&(e||Vn(c)||L(c))?r?y(c,r,e,u):n(u,c):e||(u[u.length]=c)}return u}function _(n,t){return n&&qn(n,t,un)}function g(n,t){return v(t,function(t){
9
- return W(n[t])})}function b(n,t,r,e,u){return n===t?true:null==n||null==t||!Y(n)&&!Z(t)?n!==n&&t!==t:j(n,t,b,r,e,u)}function j(n,t,r,e,u,o){var i=Vn(n),f=Vn(t),a="[object Array]",l="[object Array]";i||(a=kn.call(n),"[object Arguments]"==a&&(a="[object Object]")),f||(l=kn.call(t),"[object Arguments]"==l&&(l="[object Object]"));var p="[object Object]"==a&&!c(n),f="[object Object]"==l&&!c(t);return!(l=a==l)||i||p?2&u||(a=p&&En.call(n,"__wrapped__"),f=f&&En.call(t,"__wrapped__"),!a&&!f)?l?(o||(o=[]),(a=C(o,function(t){
10
- return t[0]===n}))&&a[1]?a[1]==t:(o.push([n,t]),t=(i?R:$)(n,t,r,e,u,o),o.pop(),t)):false:r(a?n.value():n,f?t.value():t,e,u,o):I(n,t,a)}function d(n){var t=typeof n;return"function"==t?n:null==n?fn:("object"==t?O:E)(n)}function m(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function w(n,t){var r=-1,e=Q(n)?Array(n.length):[];return $n(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function O(n){var t=un(n),r=t.length;return function(e){if(null==e)return!r;for(e=Object(e);r--;){var u=t[r];if(!(u in e&&b(n[u],e[u],ln,true)))return false;
11
- }return true}}function x(n,t){return n=Object(n),J(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function E(n){return function(t){return null==t?ln:t[n]}}function A(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function k(n){return A(n,0,n.length)}function N(n,t){var r;return $n(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function S(t,r){return J(r,function(t,r){return r.func.apply(r.thisArg,n([t],r.args))},t);
12
- }function T(n,t,r,e){r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=e?e(r[i],n[i],i,r,n):n[i],f=r,a=f[i];(!H(a,c)||H(a,xn[i])&&!En.call(f,i)||c===ln&&!(i in f))&&(f[i]=c)}return r}function F(n){return V(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:ln,o=typeof o=="function"?(u--,o):ln;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,o)}return t})}function B(n){return function(){var t=arguments,r=In(n.prototype),t=n.apply(r,t);return Y(t)?t:r}}function D(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==wn&&this instanceof e?u:n;++c<f;)a[c]=r[c];
13
- for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");var u=B(n);return e}function R(n,t,r,e,u,o){var i=-1,c=1&u,f=n.length,a=t.length;if(f!=a&&!(2&u&&a>f))return false;for(a=true;++i<f;){var l=n[i],p=t[i];if(void 0!==ln){a=false;break}if(c){if(!N(t,function(n){return l===n||r(l,n,e,u,o)})){a=false;break}}else if(l!==p&&!r(l,p,e,u,o)){a=false;break}}return a}function I(n,t,r){switch(r){case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":
14
- return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":return n==t+""}return false}function $(n,t,r,e,u,o){var i=2&u,c=1&u,f=un(n),a=f.length,l=un(t);if(a!=l.length&&!i)return false;for(var p=a;p--;){var s=f[p];if(!(i?s in t:En.call(t,s))||!c&&s!=l[p])return false}for(c=true;++p<a;){var s=f[p],l=n[s],h=t[s];if(void 0!==ln||l!==h&&!r(l,h,e,u,o)){c=false;break}i||(i="constructor"==s)}return c&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(c=false)),
15
- c}function q(n){var t=n?n.length:ln;if(X(t)&&(Vn(n)||tn(n)||L(n))){n=String;for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);t=e}else t=null;return t}function M(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||xn)}function z(n){return n?n[0]:ln}function C(n,t){return r(n,d(t),$n)}function G(n,t){return $n(n,typeof t=="function"?t:fn)}function J(n,t,r){return e(n,d(t),r,3>arguments.length,$n)}function P(n){return null==n?0:(n=Q(n)?n:un(n),n.length)}function U(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");
16
- return n=Hn(n),function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=ln),r}}function V(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");return t=Rn(t===ln?n.length-1:Hn(t),0),function(){for(var r=arguments,e=-1,u=Rn(r.length-t,0),o=Array(u);++e<u;)o[e]=r[t+e];for(u=Array(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function H(n,t){return n===t||n!==n&&t!==t}function K(n,t){return n>t}function L(n){return Z(n)&&Q(n)&&En.call(n,"callee")&&(!Fn.call(n,"callee")||"[object Arguments]"==kn.call(n));
17
- }function Q(n){return null!=n&&!(typeof n=="function"&&W(n))&&X(Mn(n))}function W(n){return n=Y(n)?kn.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function X(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function Y(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function Z(n){return!!n&&typeof n=="object"}function nn(n){return typeof n=="number"||Z(n)&&"[object Number]"==kn.call(n)}function tn(n){return typeof n=="string"||!Vn(n)&&Z(n)&&"[object String]"==kn.call(n);
18
- }function rn(n,t){return t>n}function en(n){return typeof n=="string"?n:null==n?"":n+""}function un(n){var t=M(n);if(!t&&!Q(n))return Dn(Object(n));var r,e=q(n),u=!!e,e=e||[],o=e.length;for(r in n)!En.call(n,r)||u&&("length"==r||f(r,o))||t&&"constructor"==r||e.push(r);return e}function on(n){for(var t=-1,r=M(n),e=m(n),u=e.length,o=q(n),i=!!o,o=o||[],c=o.length;++t<u;){var a=e[t];i&&("length"==a||f(a,c))||"constructor"==a&&(r||!En.call(n,a))||o.push(a)}return o}function cn(n){return n?u(n,un(n)):[];
19
- }function fn(n){return n}function an(t,r,e){var u=un(r),o=g(r,u);null!=e||Y(r)&&(o.length||!u.length)||(e=r,r=t,t=this,o=g(r,un(r)));var i=Y(e)&&"chain"in e?e.chain:true,c=W(t);return $n(o,function(e){var u=r[e];t[e]=u,c&&(t.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=t(this.__wrapped__);return(e.__actions__=k(this.__actions__)).push({func:u,args:arguments,thisArg:t}),e.__chain__=r,e}return u.apply(t,n([this.value()],arguments))})}),t}var ln,pn=/[&<>"'`]/g,sn=RegExp(pn.source),hn=/^(?:0|[1-9]\d*)$/,vn={
20
- "&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},yn={"function":true,object:true},_n=yn[typeof exports]&&exports&&!exports.nodeType?exports:null,gn=yn[typeof module]&&module&&!module.nodeType?module:null,bn=o(yn[typeof self]&&self),jn=o(yn[typeof window]&&window),dn=gn&&gn.exports===_n?_n:null,mn=o(yn[typeof this]&&this),wn=o(_n&&gn&&typeof global=="object"&&global)||jn!==(mn&&mn.window)&&jn||bn||mn||Function("return this")(),On=Array.prototype,xn=Object.prototype,En=xn.hasOwnProperty,An=0,kn=xn.toString,Nn=wn._,Sn=wn.f,Tn=Sn?Sn.g:ln,Fn=xn.propertyIsEnumerable,Bn=wn.isFinite,Dn=Object.keys,Rn=Math.max,In=function(){
21
- function n(){}return function(t){if(Y(t)){n.prototype=t;var r=new n;n.prototype=ln}return r||{}}}(),$n=function(n,t){return function(r,e){if(null==r)return r;if(!Q(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(_),qn=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}();Tn&&!Fn.call({valueOf:1},"valueOf")&&(m=function(n){n=Tn(n);for(var t,r=[];!(t=n.next()).done;)r.push(t.value);
22
- return r});var Mn=E("length"),zn=V(function(t,r){y(r);var e=Vn(t)?t:[Object(t)];return n(k(e),cn)}),Cn=V(function(n,t,r){var e=typeof t=="function";return w(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})}),Gn=Date.now,Jn=V(function(n,t,r){return D(n,t,r)}),Pn=V(function(n,t){return s(n,1,t)}),Un=V(function(n,t,r){return s(n,Kn(t)||0,r)}),Vn=Array.isArray,Hn=Number,Kn=Number,Ln=F(function(n,t){T(t,un(t),n)}),Qn=F(function(n,t){T(t,on(t),n)}),Wn=F(function(n,t,r){T(t,on(t),n,r)}),Xn=V(function(n){
23
- return n.push(ln,p),Wn.apply(ln,n)}),Yn=V(function(n,t){return null==n?{}:x(n,y(t))}),Zn=d;l.prototype=In(a.prototype),l.prototype.constructor=l,a.assignIn=Qn,a.before=U,a.bind=Jn,a.chain=function(n){return n=a(n),n.__chain__=true,n},a.compact=function(n){return v(n,Boolean)},a.concat=zn,a.create=function(n,t){var r=In(n);return t?Ln(r,t):r},a.defaults=Xn,a.defer=Pn,a.delay=Un,a.filter=function(n,t){return v(n,d(t))},a.flatten=function(n){return n&&n.length?y(n):[]},a.flattenDeep=function(n){return n&&n.length?y(n,true):[];
24
- },a.invokeMap=Cn,a.iteratee=Zn,a.keys=un,a.map=function(n,t){return w(n,d(t))},a.mixin=an,a.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},a.once=function(n){return U(2,n)},a.pick=Yn,a.slice=function(n,t,r){return n&&n.length?A(n,t,r):[]},a.sortBy=function(n,t){var r=0;return t=d(t),w(w(n,function(n,e,u){return{c:n,b:r++,a:t(n,e,u)}}).sort(function(n,t){var r;n:{r=n.a;var e=t.a;if(r!==e){var u=null===r,o=r===ln,i=r===r,c=null===e,f=e===ln,a=e===e;
25
- if(r>e&&!c||!i||u&&!f&&a||o&&a){r=1;break n}if(e>r&&!u||!a||c&&!o&&i||f&&i){r=-1;break n}}r=0}return r||n.b-t.b}),E("c"))},a.tap=function(n,t){return t(n),n},a.thru=function(n,t){return t(n)},a.toArray=function(n){return Q(n)?n.length?k(n):[]:cn(n)},a.values=cn,a.each=G,a.extend=Qn,an(a,a),a.clone=function(n){return Y(n)?Vn(n)?k(n):T(n,un(n)):n},a.escape=function(n){return(n=en(n))&&sn.test(n)?n.replace(pn,i):n},a.every=function(n,t,r){return t=r?ln:t,h(n,d(t))},a.find=C,a.forEach=G,a.has=function(n,t){
26
- return null!=n&&En.call(n,t)},a.head=z,a.identity=fn,a.indexOf=function(n,t,r){var e=n?n.length:0;r=typeof r=="number"?0>r?Rn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1},a.isArguments=L,a.isArray=Vn,a.isBoolean=function(n){return true===n||false===n||Z(n)&&"[object Boolean]"==kn.call(n)},a.isDate=function(n){return Z(n)&&"[object Date]"==kn.call(n)},a.isEmpty=function(n){return!Z(n)||W(n.splice)?!P(n):!un(n).length},a.isEqual=function(n,t){return b(n,t)},
27
- a.isFinite=function(n){return typeof n=="number"&&Bn(n)},a.isFunction=W,a.isNaN=function(n){return nn(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=nn,a.isObject=Y,a.isRegExp=function(n){return Y(n)&&"[object RegExp]"==kn.call(n)},a.isString=tn,a.isUndefined=function(n){return n===ln},a.last=function(n){var t=n?n.length:0;return t?n[t-1]:ln},a.max=function(n){return n&&n.length?t(n,fn,K):ln},a.min=function(n){return n&&n.length?t(n,fn,rn):ln},a.noConflict=function(){return wn._=Nn,this;
28
- },a.noop=function(){},a.now=Gn,a.reduce=J,a.result=function(n,t,r){return t=null==n?ln:n[t],t===ln&&(t=r),W(t)?t.call(n):t},a.size=P,a.some=function(n,t,r){return t=r?ln:t,N(n,d(t))},a.uniqueId=function(n){var t=++An;return en(n)+t},a.first=z,an(a,function(){var n={};return _(a,function(t,r){En.call(a.prototype,r)||(n[r]=t)}),n}(),{chain:false}),a.VERSION="4.0.0",$n("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){var t=(/^(?:replace|split)$/.test(n)?String.prototype:On)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);
29
- a.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),a.prototype.toJSON=a.prototype.valueOf=a.prototype.value=function(){return S(this.__wrapped__,this.__actions__)},(jn||bn||{})._=a,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){return a}):_n&&gn?(dn&&((gn.exports=a)._=a),_n._=a):wn._=a}).call(this);
6
+ ;(function(){function n(n,t){for(var r=-1,e=t.length,u=n.length;++r<e;)n[u+r]=t[r];return n}function t(n,t,r){for(var e=-1,u=n.length;++e<u;){var o=n[e],i=t(o);if(null!=i&&(c===an?i===i:r(i,c)))var c=i,f=o}return f}function r(n,t,r){var e;return r(n,function(n,r,u){return t(n,r,u)?(e=n,false):void 0}),e}function e(n,t,r,e,u){return u(n,function(n,u,o){r=e?(e=false,n):t(r,n,u,o)}),r}function u(n,t){return w(t,function(t){return n[t]})}function o(n){return n&&n.Object===Object?n:null}function i(n){return hn[n];
7
+ }function c(n){var t=false;if(null!=n&&typeof n.toString!="function")try{t=!!(n+"")}catch(r){}return t}function f(n,t){return n=typeof n=="number"||sn.test(n)?+n:-1,n>-1&&0==n%1&&(null==t?9007199254740991:t)>n}function a(n){if(Y(n)&&!Mn(n)){if(n instanceof l)return n;if(xn.call(n,"__wrapped__")){var t=new l(n.__wrapped__,n.__chain__);return t.__actions__=k(n.__actions__),t}}return new l(n)}function l(n,t){this.__wrapped__=n,this.__actions__=[],this.__chain__=!!t}function p(n,t,r,e){return n===an||V(n,On[r])&&!xn.call(e,r)?t:n;
8
+ }function s(n,t,r){if(typeof n!="function")throw new TypeError("Expected a function");return setTimeout(function(){n.apply(an,r)},t)}function h(n,t){var r=true;return In(n,function(n,e,u){return r=!!t(n,e,u)}),r}function v(n,t){var r=[];return In(n,function(n,e,u){t(n,e,u)&&r.push(n)}),r}function y(t,r,e,u){u||(u=[]);for(var o=-1,i=t.length;++o<i;){var c=t[o];Y(c)&&L(c)&&(e||Mn(c)||K(c))?r?y(c,r,e,u):n(u,c):e||(u[u.length]=c)}return u}function _(n,t){return n&&$n(n,t,en)}function g(n,t){return v(t,function(t){
9
+ return Q(n[t])})}function b(n,t,r,e,u){return n===t?true:null==n||null==t||!X(n)&&!Y(t)?n!==n&&t!==t:j(n,t,b,r,e,u)}function j(n,t,r,e,u,o){var i=Mn(n),f=Mn(t),a="[object Array]",l="[object Array]";i||(a=An.call(n),"[object Arguments]"==a&&(a="[object Object]")),f||(l=An.call(t),"[object Arguments]"==l&&(l="[object Object]"));var p="[object Object]"==a&&!c(n),f="[object Object]"==l&&!c(t);return!(l=a==l)||i||p?2&u||(a=p&&xn.call(n,"__wrapped__"),f=f&&xn.call(t,"__wrapped__"),!a&&!f)?l?(o||(o=[]),(a=G(o,function(t){
10
+ return t[0]===n}))&&a[1]?a[1]==t:(o.push([n,t]),t=(i?D:$)(n,t,r,e,u,o),o.pop(),t)):false:r(a?n.value():n,f?t.value():t,e,u,o):I(n,t,a)}function m(n){var t=typeof n;return"function"==t?n:null==n?cn:("object"==t?O:E)(n)}function d(n){n=null==n?n:Object(n);var t,r=[];for(t in n)r.push(t);return r}function w(n,t){var r=-1,e=L(n)?Array(n.length):[];return In(n,function(n,u,o){e[++r]=t(n,u,o)}),e}function O(n){var t=en(n);return function(r){var e=t.length;if(null==r)return!e;for(r=Object(r);e--;){var u=t[e];
11
+ if(!(u in r&&b(n[u],r[u],an,3)))return false}return true}}function x(n,t){return n=Object(n),M(t,function(t,r){return r in n&&(t[r]=n[r]),t},{})}function E(n){return function(t){return null==t?an:t[n]}}function A(n,t,r){var e=-1,u=n.length;for(0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0,r=Array(u);++e<u;)r[e]=n[e+t];return r}function k(n){return A(n,0,n.length)}function N(n,t){var r;return In(n,function(n,e,u){return r=t(n,e,u),!r}),!!r}function S(t,r){return M(r,function(t,r){return r.func.apply(r.thisArg,n([t],r.args));
12
+ },t)}function T(n,t,r,e){r||(r={});for(var u=-1,o=t.length;++u<o;){var i=t[u],c=e?e(r[i],n[i],i,r,n):n[i],f=r,a=f[i];(!V(a,c)||V(a,On[i])&&!xn.call(f,i)||c===an&&!(i in f))&&(f[i]=c)}return r}function F(n){return U(function(t,r){var e=-1,u=r.length,o=u>1?r[u-1]:an,o=typeof o=="function"?(u--,o):an;for(t=Object(t);++e<u;){var i=r[e];i&&n(t,i,e,o)}return t})}function B(n){return function(){var t=arguments,r=Dn(n.prototype),t=n.apply(r,t);return X(t)?t:r}}function R(n,t,r){function e(){for(var o=-1,i=arguments.length,c=-1,f=r.length,a=Array(f+i),l=this&&this!==dn&&this instanceof e?u:n;++c<f;)a[c]=r[c];
13
+ for(;i--;)a[c++]=arguments[++o];return l.apply(t,a)}if(typeof n!="function")throw new TypeError("Expected a function");var u=B(n);return e}function D(n,t,r,e,u,o){var i=-1,c=1&u,f=n.length,a=t.length;if(f!=a&&!(2&u&&a>f))return false;for(a=true;++i<f;){var l=n[i],p=t[i];if(void 0!==an){a=false;break}if(c){if(!N(t,function(n){return l===n||r(l,n,e,u,o)})){a=false;break}}else if(l!==p&&!r(l,p,e,u,o)){a=false;break}}return a}function I(n,t,r){switch(r){case"[object Boolean]":case"[object Date]":return+n==+t;case"[object Error]":
14
+ return n.name==t.name&&n.message==t.message;case"[object Number]":return n!=+n?t!=+t:n==+t;case"[object RegExp]":case"[object String]":return n==t+""}return false}function $(n,t,r,e,u,o){var i=2&u,c=en(n),f=c.length,a=en(t).length;if(f!=a&&!i)return false;for(var l=f;l--;){var p=c[l];if(!(i?p in t:xn.call(t,p)))return false}for(a=true;++l<f;){var p=c[l],s=n[p],h=t[p];if(void 0!==an||s!==h&&!r(s,h,e,u,o)){a=false;break}i||(i="constructor"==p)}return a&&!i&&(r=n.constructor,e=t.constructor,r!=e&&"constructor"in n&&"constructor"in t&&!(typeof r=="function"&&r instanceof r&&typeof e=="function"&&e instanceof e)&&(a=false)),
15
+ a}function q(n){var t=n?n.length:an;if(W(t)&&(Mn(n)||nn(n)||K(n))){n=String;for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);t=e}else t=null;return t}function z(n){var t=n&&n.constructor;return n===(typeof t=="function"&&t.prototype||On)}function C(n){return n?n[0]:an}function G(n,t){return r(n,m(t),In)}function J(n,t){return In(n,typeof t=="function"?t:cn)}function M(n,t,r){return e(n,m(t),r,3>arguments.length,In)}function P(n,t){var r;if(typeof t!="function")throw new TypeError("Expected a function");return n=Pn(n),
16
+ function(){return 0<--n&&(r=t.apply(this,arguments)),1>=n&&(t=an),r}}function U(n){var t;if(typeof n!="function")throw new TypeError("Expected a function");return t=Rn(t===an?n.length-1:Pn(t),0),function(){for(var r=arguments,e=-1,u=Rn(r.length-t,0),o=Array(u);++e<u;)o[e]=r[t+e];for(u=Array(t+1),e=-1;++e<t;)u[e]=r[e];return u[t]=o,n.apply(this,u)}}function V(n,t){return n===t||n!==n&&t!==t}function H(n,t){return n>t}function K(n){return Y(n)&&L(n)&&xn.call(n,"callee")&&(!Tn.call(n,"callee")||"[object Arguments]"==An.call(n));
17
+ }function L(n){return null!=n&&!(typeof n=="function"&&Q(n))&&W(qn(n))}function Q(n){return n=X(n)?An.call(n):"","[object Function]"==n||"[object GeneratorFunction]"==n}function W(n){return typeof n=="number"&&n>-1&&0==n%1&&9007199254740991>=n}function X(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function Y(n){return!!n&&typeof n=="object"}function Z(n){return typeof n=="number"||Y(n)&&"[object Number]"==An.call(n)}function nn(n){return typeof n=="string"||!Mn(n)&&Y(n)&&"[object String]"==An.call(n);
18
+ }function tn(n,t){return t>n}function rn(n){return typeof n=="string"?n:null==n?"":n+""}function en(n){var t=z(n);if(!t&&!L(n))return Bn(Object(n));var r,e=q(n),u=!!e,e=e||[],o=e.length;for(r in n)!xn.call(n,r)||u&&("length"==r||f(r,o))||t&&"constructor"==r||e.push(r);return e}function un(n){for(var t=-1,r=z(n),e=d(n),u=e.length,o=q(n),i=!!o,o=o||[],c=o.length;++t<u;){var a=e[t];i&&("length"==a||f(a,c))||"constructor"==a&&(r||!xn.call(n,a))||o.push(a)}return o}function on(n){return n?u(n,en(n)):[];
19
+ }function cn(n){return n}function fn(t,r,e){var u=en(r),o=g(r,u);null!=e||X(r)&&(o.length||!u.length)||(e=r,r=t,t=this,o=g(r,en(r)));var i=X(e)&&"chain"in e?e.chain:true,c=Q(t);return In(o,function(e){var u=r[e];t[e]=u,c&&(t.prototype[e]=function(){var r=this.__chain__;if(i||r){var e=t(this.__wrapped__);return(e.__actions__=k(this.__actions__)).push({func:u,args:arguments,thisArg:t}),e.__chain__=r,e}return u.apply(t,n([this.value()],arguments))})}),t}var an,ln=/[&<>"'`]/g,pn=RegExp(ln.source),sn=/^(?:0|[1-9]\d*)$/,hn={
20
+ "&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","`":"&#96;"},vn={"function":true,object:true},yn=vn[typeof exports]&&exports&&!exports.nodeType?exports:null,_n=vn[typeof module]&&module&&!module.nodeType?module:null,gn=o(vn[typeof self]&&self),bn=o(vn[typeof window]&&window),jn=_n&&_n.exports===yn?yn:null,mn=o(vn[typeof this]&&this),dn=o(yn&&_n&&typeof global=="object"&&global)||bn!==(mn&&mn.window)&&bn||gn||mn||Function("return this")(),wn=Array.prototype,On=Object.prototype,xn=On.hasOwnProperty,En=0,An=On.toString,kn=dn._,Nn=dn.f,Sn=Nn?Nn.g:an,Tn=On.propertyIsEnumerable,Fn=dn.isFinite,Bn=Object.keys,Rn=Math.max,Dn=function(){
21
+ function n(){}return function(t){if(X(t)){n.prototype=t;var r=new n;n.prototype=an}return r||{}}}(),In=function(n,t){return function(r,e){if(null==r)return r;if(!L(r))return n(r,e);for(var u=r.length,o=t?u:-1,i=Object(r);(t?o--:++o<u)&&false!==e(i[o],o,i););return r}}(_),$n=function(n){return function(t,r,e){var u=-1,o=Object(t);e=e(t);for(var i=e.length;i--;){var c=e[n?i:++u];if(false===r(o[c],c,o))break}return t}}();Sn&&!Tn.call({valueOf:1},"valueOf")&&(d=function(n){n=Sn(n);for(var t,r=[];!(t=n.next()).done;)r.push(t.value);
22
+ return r});var qn=E("length"),zn=U(function(t,r){return Mn(t)||(t=null==t?[]:[Object(t)]),y(r),n(k(t),on)}),Cn=U(function(n,t,r){return R(n,t,r)}),Gn=U(function(n,t){return s(n,1,t)}),Jn=U(function(n,t,r){return s(n,Un(t)||0,r)}),Mn=Array.isArray,Pn=Number,Un=Number,Vn=F(function(n,t){T(t,en(t),n)}),Hn=F(function(n,t){T(t,un(t),n)}),Kn=F(function(n,t,r,e){T(t,un(t),n,e)}),Ln=U(function(n){return n.push(an,p),Kn.apply(an,n)}),Qn=U(function(n,t){return null==n?{}:x(n,y(t))}),Wn=m;l.prototype=Dn(a.prototype),
23
+ l.prototype.constructor=l,a.assignIn=Hn,a.before=P,a.bind=Cn,a.chain=function(n){return n=a(n),n.__chain__=true,n},a.compact=function(n){return v(n,Boolean)},a.concat=zn,a.create=function(n,t){var r=Dn(n);return t?Vn(r,t):r},a.defaults=Ln,a.defer=Gn,a.delay=Jn,a.filter=function(n,t){return v(n,m(t))},a.flatten=function(n){return n&&n.length?y(n):[]},a.flattenDeep=function(n){return n&&n.length?y(n,true):[]},a.iteratee=Wn,a.keys=en,a.map=function(n,t){return w(n,m(t))},a.matches=function(n){return O(Vn({},n));
24
+ },a.mixin=fn,a.negate=function(n){if(typeof n!="function")throw new TypeError("Expected a function");return function(){return!n.apply(this,arguments)}},a.once=function(n){return P(2,n)},a.pick=Qn,a.slice=function(n,t,r){var e=n?n.length:0;return r=r===an?e:+r,e?A(n,null==t?0:+t,r):[]},a.sortBy=function(n,t){var r=0;return t=m(t),w(w(n,function(n,e,u){return{c:n,b:r++,a:t(n,e,u)}}).sort(function(n,t){var r;n:{r=n.a;var e=t.a;if(r!==e){var u=null===r,o=r===an,i=r===r,c=null===e,f=e===an,a=e===e;if(r>e&&!c||!i||u&&!f&&a||o&&a){
25
+ r=1;break n}if(e>r&&!u||!a||c&&!o&&i||f&&i){r=-1;break n}}r=0}return r||n.b-t.b}),E("c"))},a.tap=function(n,t){return t(n),n},a.thru=function(n,t){return t(n)},a.toArray=function(n){return L(n)?n.length?k(n):[]:on(n)},a.values=on,a.extend=Hn,fn(a,a),a.clone=function(n){return X(n)?Mn(n)?k(n):T(n,en(n)):n},a.escape=function(n){return(n=rn(n))&&pn.test(n)?n.replace(ln,i):n},a.every=function(n,t,r){return t=r?an:t,h(n,m(t))},a.find=G,a.forEach=J,a.has=function(n,t){return null!=n&&xn.call(n,t)},a.head=C,
26
+ a.identity=cn,a.indexOf=function(n,t,r){var e=n?n.length:0;r=typeof r=="number"?0>r?Rn(e+r,0):r:0,r=(r||0)-1;for(var u=t===t;++r<e;){var o=n[r];if(u?o===t:o!==o)return r}return-1},a.isArguments=K,a.isArray=Mn,a.isBoolean=function(n){return true===n||false===n||Y(n)&&"[object Boolean]"==An.call(n)},a.isDate=function(n){return Y(n)&&"[object Date]"==An.call(n)},a.isEmpty=function(n){if(L(n)&&(Mn(n)||nn(n)||Q(n.splice)||K(n)))return!n.length;for(var t in n)if(xn.call(n,t))return false;return true},a.isEqual=function(n,t){
27
+ return b(n,t)},a.isFinite=function(n){return typeof n=="number"&&Fn(n)},a.isFunction=Q,a.isNaN=function(n){return Z(n)&&n!=+n},a.isNull=function(n){return null===n},a.isNumber=Z,a.isObject=X,a.isRegExp=function(n){return X(n)&&"[object RegExp]"==An.call(n)},a.isString=nn,a.isUndefined=function(n){return n===an},a.last=function(n){var t=n?n.length:0;return t?n[t-1]:an},a.max=function(n){return n&&n.length?t(n,cn,H):an},a.min=function(n){return n&&n.length?t(n,cn,tn):an},a.noConflict=function(){return dn._===this&&(dn._=kn),
28
+ this},a.noop=function(){},a.reduce=M,a.result=function(n,t,r){return t=null==n?an:n[t],t===an&&(t=r),Q(t)?t.call(n):t},a.size=function(n){return null==n?0:(n=L(n)?n:en(n),n.length)},a.some=function(n,t,r){return t=r?an:t,N(n,m(t))},a.uniqueId=function(n){var t=++En;return rn(n)+t},a.each=J,a.first=C,fn(a,function(){var n={};return _(a,function(t,r){xn.call(a.prototype,r)||(n[r]=t)}),n}(),{chain:false}),a.VERSION="4.3.0",In("pop join replace reverse split push shift sort splice unshift".split(" "),function(n){
29
+ var t=(/^(?:replace|split)$/.test(n)?String.prototype:wn)[n],r=/^(?:push|sort|unshift)$/.test(n)?"tap":"thru",e=/^(?:pop|join|replace|shift)$/.test(n);a.prototype[n]=function(){var n=arguments;return e&&!this.__chain__?t.apply(this.value(),n):this[r](function(r){return t.apply(r,n)})}}),a.prototype.toJSON=a.prototype.valueOf=a.prototype.value=function(){return S(this.__wrapped__,this.__actions__)},(bn||gn||{})._=a,typeof define=="function"&&typeof define.amd=="object"&&define.amd? define(function(){
30
+ return a}):yn&&_n?(jn&&((_n.exports=a)._=a),yn._=a):dn._=a}).call(this);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @license
3
- * lodash 4.0.0 (Custom Build) <https://lodash.com/>
3
+ * lodash 4.3.0 (Custom Build) <https://lodash.com/>
4
4
  * Build: `lodash -o ./dist/lodash.js`
5
5
  * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/>
6
6
  * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
@@ -13,7 +13,7 @@
13
13
  var undefined;
14
14
 
15
15
  /** Used as the semantic version number. */
16
- var VERSION = '4.0.0';
16
+ var VERSION = '4.3.0';
17
17
 
18
18
  /** Used to compose bitmasks for wrapper metadata. */
19
19
  var BIND_FLAG = 1,
@@ -82,7 +82,8 @@
82
82
  setTag = '[object Set]',
83
83
  stringTag = '[object String]',
84
84
  symbolTag = '[object Symbol]',
85
- weakMapTag = '[object WeakMap]';
85
+ weakMapTag = '[object WeakMap]',
86
+ weakSetTag = '[object WeakSet]';
86
87
 
87
88
  var arrayBufferTag = '[object ArrayBuffer]',
88
89
  float32Tag = '[object Float32Array]',
@@ -163,7 +164,8 @@
163
164
 
164
165
  /** Used to compose unicode character classes. */
165
166
  var rsAstralRange = '\\ud800-\\udfff',
166
- rsComboRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
167
+ rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23',
168
+ rsComboSymbolsRange = '\\u20d0-\\u20f0',
167
169
  rsDingbatRange = '\\u2700-\\u27bf',
168
170
  rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff',
169
171
  rsMathOpRange = '\\xac\\xb1\\xd7\\xf7',
@@ -177,12 +179,13 @@
177
179
  /** Used to compose unicode capture groups. */
178
180
  var rsAstral = '[' + rsAstralRange + ']',
179
181
  rsBreak = '[' + rsBreakRange + ']',
180
- rsCombo = '[' + rsComboRange + ']',
182
+ rsCombo = '[' + rsComboMarksRange + rsComboSymbolsRange + ']',
181
183
  rsDigits = '\\d+',
182
184
  rsDingbat = '[' + rsDingbatRange + ']',
183
185
  rsLower = '[' + rsLowerRange + ']',
184
186
  rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',
185
- rsModifier = '(?:\\ud83c[\\udffb-\\udfff])',
187
+ rsFitz = '\\ud83c[\\udffb-\\udfff]',
188
+ rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',
186
189
  rsNonAstral = '[^' + rsAstralRange + ']',
187
190
  rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}',
188
191
  rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]',
@@ -199,14 +202,17 @@
199
202
  rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,
200
203
  rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';
201
204
 
202
- /** Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). */
205
+ /**
206
+ * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and
207
+ * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).
208
+ */
203
209
  var reComboMark = RegExp(rsCombo, 'g');
204
210
 
205
211
  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
206
- var reComplexSymbol = RegExp(rsSymbol + rsSeq, 'g');
212
+ var reComplexSymbol = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');
207
213
 
208
214
  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
209
- var reHasComplexSymbol = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');
215
+ var reHasComplexSymbol = RegExp('[' + rsZWJ + rsAstralRange + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');
210
216
 
211
217
  /** Used to match non-compound words composed of alphanumeric characters. */
212
218
  var reBasicWord = /[a-zA-Z0-9]+/g;
@@ -216,7 +222,8 @@
216
222
  rsUpper + '?' + rsLower + '+(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',
217
223
  rsUpperMisc + '+(?=' + [rsBreak, rsUpper + rsLowerMisc, '$'].join('|') + ')',
218
224
  rsUpper + '?' + rsLowerMisc + '+',
219
- rsDigits + '(?:' + rsLowerMisc + '+)?',
225
+ rsUpper + '+',
226
+ rsDigits,
220
227
  rsEmoji
221
228
  ].join('|'), 'g');
222
229
 
@@ -225,8 +232,8 @@
225
232
 
226
233
  /** Used to assign default `context` object properties. */
227
234
  var contextProps = [
228
- 'Array', 'Date', 'Error', 'Float32Array', 'Float64Array', 'Function',
229
- 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
235
+ 'Array', 'Buffer', 'Date', 'Error', 'Float32Array', 'Float64Array',
236
+ 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',
230
237
  'Reflect', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',
231
238
  'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', '_',
232
239
  'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'
@@ -391,11 +398,11 @@
391
398
  * @private
392
399
  * @param {Function} func The function to invoke.
393
400
  * @param {*} thisArg The `this` binding of `func`.
394
- * @param {...*} [args] The arguments to invoke `func` with.
401
+ * @param {...*} args The arguments to invoke `func` with.
395
402
  * @returns {*} Returns the result of `func`.
396
403
  */
397
404
  function apply(func, thisArg, args) {
398
- var length = args ? args.length : 0;
405
+ var length = args.length;
399
406
  switch (length) {
400
407
  case 0: return func.call(thisArg);
401
408
  case 1: return func.call(thisArg, args[0]);
@@ -405,6 +412,27 @@
405
412
  return func.apply(thisArg, args);
406
413
  }
407
414
 
415
+ /**
416
+ * A specialized version of `baseAggregator` for arrays.
417
+ *
418
+ * @private
419
+ * @param {Array} array The array to iterate over.
420
+ * @param {Function} setter The function to set `accumulator` values.
421
+ * @param {Function} iteratee The iteratee to transform keys.
422
+ * @param {Object} accumulator The initial aggregated object.
423
+ * @returns {Function} Returns `accumulator`.
424
+ */
425
+ function arrayAggregator(array, setter, iteratee, accumulator) {
426
+ var index = -1,
427
+ length = array.length;
428
+
429
+ while (++index < length) {
430
+ var value = array[index];
431
+ setter(accumulator, value, iteratee(value), array);
432
+ }
433
+ return accumulator;
434
+ }
435
+
408
436
  /**
409
437
  * Creates a new array concatenating `array` with `other`.
410
438
  *
@@ -597,14 +625,14 @@
597
625
  * @param {Array} array The array to iterate over.
598
626
  * @param {Function} iteratee The function invoked per iteration.
599
627
  * @param {*} [accumulator] The initial value.
600
- * @param {boolean} [initFromArray] Specify using the first element of `array` as the initial value.
628
+ * @param {boolean} [initAccum] Specify using the first element of `array` as the initial value.
601
629
  * @returns {*} Returns the accumulated value.
602
630
  */
603
- function arrayReduce(array, iteratee, accumulator, initFromArray) {
631
+ function arrayReduce(array, iteratee, accumulator, initAccum) {
604
632
  var index = -1,
605
633
  length = array.length;
606
634
 
607
- if (initFromArray && length) {
635
+ if (initAccum && length) {
608
636
  accumulator = array[++index];
609
637
  }
610
638
  while (++index < length) {
@@ -621,12 +649,12 @@
621
649
  * @param {Array} array The array to iterate over.
622
650
  * @param {Function} iteratee The function invoked per iteration.
623
651
  * @param {*} [accumulator] The initial value.
624
- * @param {boolean} [initFromArray] Specify using the last element of `array` as the initial value.
652
+ * @param {boolean} [initAccum] Specify using the last element of `array` as the initial value.
625
653
  * @returns {*} Returns the accumulated value.
626
654
  */
627
- function arrayReduceRight(array, iteratee, accumulator, initFromArray) {
655
+ function arrayReduceRight(array, iteratee, accumulator, initAccum) {
628
656
  var length = array.length;
629
- if (initFromArray && length) {
657
+ if (initAccum && length) {
630
658
  accumulator = array[--length];
631
659
  }
632
660
  while (length--) {
@@ -688,7 +716,7 @@
688
716
  /**
689
717
  * The base implementation of methods like `_.find` and `_.findKey`, without
690
718
  * support for iteratee shorthands, which iterates over `collection` using
691
- * the provided `eachFunc`.
719
+ * `eachFunc`.
692
720
  *
693
721
  * @private
694
722
  * @param {Array|Object} collection The collection to search.
@@ -756,21 +784,20 @@
756
784
 
757
785
  /**
758
786
  * The base implementation of `_.reduce` and `_.reduceRight`, without support
759
- * for iteratee shorthands, which iterates over `collection` using the provided
760
- * `eachFunc`.
787
+ * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
761
788
  *
762
789
  * @private
763
790
  * @param {Array|Object} collection The collection to iterate over.
764
791
  * @param {Function} iteratee The function invoked per iteration.
765
792
  * @param {*} accumulator The initial value.
766
- * @param {boolean} initFromCollection Specify using the first or last element of `collection` as the initial value.
793
+ * @param {boolean} initAccum Specify using the first or last element of `collection` as the initial value.
767
794
  * @param {Function} eachFunc The function to iterate over `collection`.
768
795
  * @returns {*} Returns the accumulated value.
769
796
  */
770
- function baseReduce(collection, iteratee, accumulator, initFromCollection, eachFunc) {
797
+ function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
771
798
  eachFunc(collection, function(value, index, collection) {
772
- accumulator = initFromCollection
773
- ? (initFromCollection = false, value)
799
+ accumulator = initAccum
800
+ ? (initAccum = false, value)
774
801
  : iteratee(accumulator, value, index, collection);
775
802
  });
776
803
  return accumulator;
@@ -1164,6 +1191,7 @@
1164
1191
  /**
1165
1192
  * Gets the number of symbols in `string`.
1166
1193
  *
1194
+ * @private
1167
1195
  * @param {string} string The string to inspect.
1168
1196
  * @returns {number} Returns the string size.
1169
1197
  */
@@ -1227,14 +1255,14 @@
1227
1255
  * lodash.isFunction(lodash.bar);
1228
1256
  * // => true
1229
1257
  *
1230
- * // using `context` to mock `Date#getTime` use in `_.now`
1258
+ * // Use `context` to mock `Date#getTime` use in `_.now`.
1231
1259
  * var mock = _.runInContext({
1232
1260
  * 'Date': function() {
1233
1261
  * return { 'getTime': getTimeMock };
1234
1262
  * }
1235
1263
  * });
1236
1264
  *
1237
- * // or creating a suped-up `defer` in Node.js
1265
+ * // Create a suped-up `defer` in Node.js.
1238
1266
  * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;
1239
1267
  */
1240
1268
  function runInContext(context) {
@@ -1279,14 +1307,15 @@
1279
1307
  );
1280
1308
 
1281
1309
  /** Built-in value references. */
1282
- var _Symbol = context.Symbol,
1310
+ var Buffer = moduleExports ? context.Buffer : undefined,
1283
1311
  Reflect = context.Reflect,
1312
+ Symbol = context.Symbol,
1284
1313
  Uint8Array = context.Uint8Array,
1285
1314
  clearTimeout = context.clearTimeout,
1286
1315
  enumerate = Reflect ? Reflect.enumerate : undefined,
1287
1316
  getPrototypeOf = Object.getPrototypeOf,
1288
1317
  getOwnPropertySymbols = Object.getOwnPropertySymbols,
1289
- iteratorSymbol = typeof (iteratorSymbol = _Symbol && _Symbol.iterator) == 'symbol' ? iteratorSymbol : undefined,
1318
+ iteratorSymbol = typeof (iteratorSymbol = Symbol && Symbol.iterator) == 'symbol' ? iteratorSymbol : undefined,
1290
1319
  propertyIsEnumerable = objectProto.propertyIsEnumerable,
1291
1320
  setTimeout = context.setTimeout,
1292
1321
  splice = arrayProto.splice;
@@ -1312,14 +1341,15 @@
1312
1341
  /** Used to store function metadata. */
1313
1342
  var metaMap = WeakMap && new WeakMap;
1314
1343
 
1315
- /** Used to detect maps and sets. */
1344
+ /** Used to detect maps, sets, and weakmaps. */
1316
1345
  var mapCtorString = Map ? funcToString.call(Map) : '',
1317
- setCtorString = Set ? funcToString.call(Set) : '';
1346
+ setCtorString = Set ? funcToString.call(Set) : '',
1347
+ weakMapCtorString = WeakMap ? funcToString.call(WeakMap) : '';
1318
1348
 
1319
1349
  /** Used to convert symbols to primitives and strings. */
1320
- var symbolProto = _Symbol ? _Symbol.prototype : undefined,
1321
- symbolValueOf = _Symbol ? symbolProto.valueOf : undefined,
1322
- symbolToString = _Symbol ? symbolProto.toString : undefined;
1350
+ var symbolProto = Symbol ? Symbol.prototype : undefined,
1351
+ symbolValueOf = Symbol ? symbolProto.valueOf : undefined,
1352
+ symbolToString = Symbol ? symbolProto.toString : undefined;
1323
1353
 
1324
1354
  /** Used to lookup unminified function names. */
1325
1355
  var realNames = {};
@@ -1367,47 +1397,48 @@
1367
1397
  * The chainable wrapper methods are:
1368
1398
  * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`,
1369
1399
  * `at`, `before`, `bind`, `bindAll`, `bindKey`, `chain`, `chunk`, `commit`,
1370
- * `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, `curry`,
1400
+ * `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, `curry`,
1371
1401
  * `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, `difference`,
1372
- * `differenceBy`, `differenceWith`, `drop`, `dropRight`, `dropRightWhile`,
1402
+ * `differenceBy`, `differenceWith`, `drop`, `dropRight`, `dropRightWhile`,
1373
1403
  * `dropWhile`, `fill`, `filter`, `flatten`, `flattenDeep`, `flip`, `flow`,
1374
- * `flowRight`, `forEach`, `forEachRight`, `forIn`, `forInRight`, `forOwn`,
1375
- * `forOwnRight`, `fromPairs`, `functions`, `functionsIn`, `groupBy`, `initial`,
1376
- * `intersection`, `intersectionBy`, `intersectionWith`, invert`, `invokeMap`,
1377
- * `iteratee`, `keyBy`, `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`,
1378
- * `matches`, `matchesProperty`, `memoize`, `merge`, `mergeWith`, `method`,
1379
- * `methodOf`, `mixin`, `negate`, `nthArg`, `omit`, `omitBy`, `once`, `orderBy`,
1380
- * `over`, `overArgs`, `overEvery`, `overSome`, `partial`, `partialRight`,
1381
- * `partition`, `pick`, `pickBy`, `plant`, `property`, `propertyOf`, `pull`,
1382
- * `pullAll`, `pullAllBy`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`,
1383
- * `reject`, `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`,
1384
- * `shuffle`, `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`,
1385
- * `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`,
1386
- * `toArray`, `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`,
1387
- * `unary`, `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`,
1388
- * `unset`, `unshift`, `unzip`, `unzipWith`, `values`, `valuesIn`, `without`,
1389
- * `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, `zipObject`, and `zipWith`
1404
+ * `flowRight`, `fromPairs`, `functions`, `functionsIn`, `groupBy`, `initial`,
1405
+ * `intersection`, `intersectionBy`, `intersectionWith`, `invert`, `invertBy`,
1406
+ * `invokeMap`, `iteratee`, `keyBy`, `keys`, `keysIn`, `map`, `mapKeys`,
1407
+ * `mapValues`, `matches`, `matchesProperty`, `memoize`, `merge`, `mergeWith`,
1408
+ * `method`, `methodOf`, `mixin`, `negate`, `nthArg`, `omit`, `omitBy`, `once`,
1409
+ * `orderBy`, `over`, `overArgs`, `overEvery`, `overSome`, `partial`,
1410
+ * `partialRight`, `partition`, `pick`, `pickBy`, `plant`, `property`,
1411
+ * `propertyOf`, `pull`, `pullAll`, `pullAllBy`, `pullAt`, `push`, `range`,
1412
+ * `rangeRight`, `rearg`, `reject`, `remove`, `rest`, `reverse`, `sampleSize`,
1413
+ * `set`, `setWith`, `shuffle`, `slice`, `sort`, `sortBy`, `splice`, `spread`,
1414
+ * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, `tap`, `throttle`,
1415
+ * `thru`, `toArray`, `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`,
1416
+ * `transform`, `unary`, `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`,
1417
+ * `uniqWith`, `unset`, `unshift`, `unzip`, `unzipWith`, `values`, `valuesIn`,
1418
+ * `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, `zipObject`,
1419
+ * `zipObjectDeep`, and `zipWith`
1390
1420
  *
1391
1421
  * The wrapper methods that are **not** chainable by default are:
1392
1422
  * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
1393
1423
  * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `deburr`, `endsWith`, `eq`,
1394
1424
  * `escape`, `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`,
1395
- * `findLast`, `findLastIndex`, `findLastKey`, `floor`, `get`, `gt`, `gte`,
1396
- * `has`, `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`,
1397
- * `invoke`, `isArguments`, `isArray`, `isArrayLike`, `isArrayLikeObject`,
1398
- * `isBoolean`, `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`,
1399
- * `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMatch`,
1400
- * `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`,
1401
- * `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, `isSafeInteger`,
1402
- * `isString`, `isUndefined`, `isTypedArray`, `join`, `kebabCase`, `last`,
1403
- * `lastIndexOf`, `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`,
1404
- * `mean`, `min`, `minBy`, `noConflict`, `noop`, `now`, `pad`, `padEnd`,
1405
- * `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, `repeat`,
1406
- * `result`, `round`, `runInContext`, `sample`, `shift`, `size`, `snakeCase`,
1407
- * `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, `sortedLastIndexBy`,
1408
- * `startCase`, `startsWith`, `subtract`, `sum`, sumBy`, `template`, `times`,
1409
- * `toLower`, `toInteger`, `toLength`, `toNumber`, `toSafeInteger`, toString`,
1410
- * `toUpper`, `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`,
1425
+ * `findLast`, `findLastIndex`, `findLastKey`, `floor`, `forEach`, `forEachRight`,
1426
+ * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
1427
+ * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
1428
+ * `isArguments`, `isArray`, `isArrayLike`, `isArrayLikeObject`, `isBoolean`,
1429
+ * `isDate`, `isElement`, `isEmpty`, `isEqual`, `isEqualWith`, `isError`,
1430
+ * `isFinite`, `isFunction`, `isInteger`, `isLength`, `isMatch`, `isMatchWith`,
1431
+ * `isNaN`, `isNative`, `isNil`, `isNull`, `isNumber`, `isObject`, `isObjectLike`,
1432
+ * `isPlainObject`, `isRegExp`, `isSafeInteger`, `isString`, `isUndefined`,
1433
+ * `isTypedArray`, `join`, `kebabCase`, `last`, `lastIndexOf`, `lowerCase`,
1434
+ * `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `min`, `minBy`,
1435
+ * `noConflict`, `noop`, `now`, `pad`, `padEnd`, `padStart`, `parseInt`,
1436
+ * `pop`, `random`, `reduce`, `reduceRight`, `repeat`, `result`, `round`,
1437
+ * `runInContext`, `sample`, `shift`, `size`, `snakeCase`, `some`, `sortedIndex`,
1438
+ * `sortedIndexBy`, `sortedLastIndex`, `sortedLastIndexBy`, `startCase`,
1439
+ * `startsWith`, `subtract`, `sum`, `sumBy`, `template`, `times`, `toLower`,
1440
+ * `toInteger`, `toLength`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`,
1441
+ * `trim`, `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`,
1411
1442
  * `upperCase`, `upperFirst`, `value`, and `words`
1412
1443
  *
1413
1444
  * @name _
@@ -1423,11 +1454,11 @@
1423
1454
  *
1424
1455
  * var wrapped = _([1, 2, 3]);
1425
1456
  *
1426
- * // returns an unwrapped value
1457
+ * // Returns an unwrapped value.
1427
1458
  * wrapped.reduce(_.add);
1428
1459
  * // => 6
1429
1460
  *
1430
- * // returns a wrapped value
1461
+ * // Returns a wrapped value.
1431
1462
  * var squares = wrapped.map(square);
1432
1463
  *
1433
1464
  * _.isArray(squares);
@@ -2117,6 +2148,24 @@
2117
2148
  }
2118
2149
  }
2119
2150
 
2151
+ /**
2152
+ * Aggregates elements of `collection` on `accumulator` with keys transformed
2153
+ * by `iteratee` and values set by `setter`.
2154
+ *
2155
+ * @private
2156
+ * @param {Array|Object} collection The collection to iterate over.
2157
+ * @param {Function} setter The function to set `accumulator` values.
2158
+ * @param {Function} iteratee The iteratee to transform keys.
2159
+ * @param {Object} accumulator The initial aggregated object.
2160
+ * @returns {Function} Returns `accumulator`.
2161
+ */
2162
+ function baseAggregator(collection, setter, iteratee, accumulator) {
2163
+ baseEach(collection, function(value, key, collection) {
2164
+ setter(accumulator, value, iteratee(value), collection);
2165
+ });
2166
+ return accumulator;
2167
+ }
2168
+
2120
2169
  /**
2121
2170
  * The base implementation of `_.assign` without support for multiple sources
2122
2171
  * or `customizer` functions.
@@ -2205,6 +2254,9 @@
2205
2254
  var tag = getTag(value),
2206
2255
  isFunc = tag == funcTag || tag == genTag;
2207
2256
 
2257
+ if (isBuffer(value)) {
2258
+ return cloneBuffer(value, isDeep);
2259
+ }
2208
2260
  if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
2209
2261
  if (isHostObject(value)) {
2210
2262
  return object ? value : {};
@@ -2290,7 +2342,7 @@
2290
2342
  * @private
2291
2343
  * @param {Function} func The function to delay.
2292
2344
  * @param {number} wait The number of milliseconds to delay invocation.
2293
- * @param {Object} args The arguments provide to `func`.
2345
+ * @param {Object} args The arguments to provide to `func`.
2294
2346
  * @returns {number} Returns the timer id.
2295
2347
  */
2296
2348
  function baseDelay(func, wait, args) {
@@ -2535,7 +2587,7 @@
2535
2587
 
2536
2588
  /**
2537
2589
  * The base implementation of `_.functions` which creates an array of
2538
- * `object` function property names filtered from those provided.
2590
+ * `object` function property names filtered from `props`.
2539
2591
  *
2540
2592
  * @private
2541
2593
  * @param {Object} object The object to inspect.
@@ -2663,11 +2715,28 @@
2663
2715
  return result;
2664
2716
  }
2665
2717
 
2718
+ /**
2719
+ * The base implementation of `_.invert` and `_.invertBy` which inverts
2720
+ * `object` with values transformed by `iteratee` and set by `setter`.
2721
+ *
2722
+ * @private
2723
+ * @param {Object} object The object to iterate over.
2724
+ * @param {Function} setter The function to set `accumulator` values.
2725
+ * @param {Function} iteratee The iteratee to transform values.
2726
+ * @param {Object} accumulator The initial inverted object.
2727
+ * @returns {Function} Returns `accumulator`.
2728
+ */
2729
+ function baseInverter(object, setter, iteratee, accumulator) {
2730
+ baseForOwn(object, function(value, key, object) {
2731
+ setter(accumulator, iteratee(value), key, object);
2732
+ });
2733
+ return accumulator;
2734
+ }
2735
+
2666
2736
  /**
2667
2737
  * The base implementation of `_.invoke` without support for individual
2668
2738
  * method arguments.
2669
2739
  *
2670
- *
2671
2740
  * @private
2672
2741
  * @param {Object} object The object to query.
2673
2742
  * @param {Array|string} path The path of the method to invoke.
@@ -2810,7 +2879,10 @@
2810
2879
  var stack = new Stack,
2811
2880
  result = customizer ? customizer(objValue, srcValue, key, object, source, stack) : undefined;
2812
2881
 
2813
- if (!(result === undefined ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack) : result)) {
2882
+ if (!(result === undefined
2883
+ ? baseIsEqual(srcValue, objValue, customizer, UNORDERED_COMPARE_FLAG | PARTIAL_COMPARE_FLAG, stack)
2884
+ : result
2885
+ )) {
2814
2886
  return false;
2815
2887
  }
2816
2888
  }
@@ -2946,10 +3018,11 @@
2946
3018
  * @private
2947
3019
  * @param {Object} object The destination object.
2948
3020
  * @param {Object} source The source object.
3021
+ * @param {number} srcIndex The index of `source`.
2949
3022
  * @param {Function} [customizer] The function to customize merged values.
2950
3023
  * @param {Object} [stack] Tracks traversed source values and their merged counterparts.
2951
3024
  */
2952
- function baseMerge(object, source, customizer, stack) {
3025
+ function baseMerge(object, source, srcIndex, customizer, stack) {
2953
3026
  if (object === source) {
2954
3027
  return;
2955
3028
  }
@@ -2961,7 +3034,7 @@
2961
3034
  }
2962
3035
  if (isObject(srcValue)) {
2963
3036
  stack || (stack = new Stack);
2964
- baseMergeDeep(object, source, key, baseMerge, customizer, stack);
3037
+ baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);
2965
3038
  }
2966
3039
  else {
2967
3040
  var newValue = customizer ? customizer(object[key], srcValue, (key + ''), object, source, stack) : undefined;
@@ -2982,14 +3055,15 @@
2982
3055
  * @param {Object} object The destination object.
2983
3056
  * @param {Object} source The source object.
2984
3057
  * @param {string} key The key of the value to merge.
3058
+ * @param {number} srcIndex The index of `source`.
2985
3059
  * @param {Function} mergeFunc The function to merge values.
2986
3060
  * @param {Function} [customizer] The function to customize assigned values.
2987
3061
  * @param {Object} [stack] Tracks traversed source values and their merged counterparts.
2988
3062
  */
2989
- function baseMergeDeep(object, source, key, mergeFunc, customizer, stack) {
3063
+ function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {
2990
3064
  var objValue = object[key],
2991
3065
  srcValue = source[key],
2992
- stacked = stack.get(srcValue) || stack.get(objValue);
3066
+ stacked = stack.get(srcValue);
2993
3067
 
2994
3068
  if (stacked) {
2995
3069
  assignMergeValue(object, key, stacked);
@@ -3001,24 +3075,38 @@
3001
3075
  if (isCommon) {
3002
3076
  newValue = srcValue;
3003
3077
  if (isArray(srcValue) || isTypedArray(srcValue)) {
3004
- newValue = isArray(objValue)
3005
- ? objValue
3006
- : ((isArrayLikeObject(objValue)) ? copyArray(objValue) : baseClone(srcValue));
3078
+ if (isArray(objValue)) {
3079
+ newValue = srcIndex ? copyArray(objValue) : objValue;
3080
+ }
3081
+ else if (isArrayLikeObject(objValue)) {
3082
+ newValue = copyArray(objValue);
3083
+ }
3084
+ else {
3085
+ isCommon = false;
3086
+ newValue = baseClone(srcValue);
3087
+ }
3007
3088
  }
3008
3089
  else if (isPlainObject(srcValue) || isArguments(srcValue)) {
3009
- newValue = isArguments(objValue)
3010
- ? toPlainObject(objValue)
3011
- : (isObject(objValue) ? objValue : baseClone(srcValue));
3090
+ if (isArguments(objValue)) {
3091
+ newValue = toPlainObject(objValue);
3092
+ }
3093
+ else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) {
3094
+ isCommon = false;
3095
+ newValue = baseClone(srcValue);
3096
+ }
3097
+ else {
3098
+ newValue = srcIndex ? baseClone(objValue) : objValue;
3099
+ }
3012
3100
  }
3013
3101
  else {
3014
- isCommon = isFunction(srcValue);
3102
+ isCommon = false;
3015
3103
  }
3016
3104
  }
3017
3105
  stack.set(srcValue, newValue);
3018
3106
 
3019
3107
  if (isCommon) {
3020
3108
  // Recursively merge objects and arrays (susceptible to call stack limits).
3021
- mergeFunc(newValue, srcValue, customizer, stack);
3109
+ mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
3022
3110
  }
3023
3111
  assignMergeValue(object, key, newValue);
3024
3112
  }
@@ -3082,7 +3170,7 @@
3082
3170
  function basePickBy(object, predicate) {
3083
3171
  var result = {};
3084
3172
  baseForIn(object, function(value, key) {
3085
- if (predicate(value)) {
3173
+ if (predicate(value, key)) {
3086
3174
  result[key] = value;
3087
3175
  }
3088
3176
  });
@@ -3605,18 +3693,58 @@
3605
3693
  }
3606
3694
 
3607
3695
  /**
3608
- * Creates a clone of `buffer`.
3696
+ * This base implementation of `_.zipObject` which assigns values using `assignFunc`.
3609
3697
  *
3610
3698
  * @private
3611
- * @param {ArrayBuffer} buffer The array buffer to clone.
3612
- * @returns {ArrayBuffer} Returns the cloned array buffer.
3699
+ * @param {Array} props The property names.
3700
+ * @param {Array} values The property values.
3701
+ * @param {Function} assignFunc The function to assign values.
3702
+ * @returns {Object} Returns the new object.
3613
3703
  */
3614
- function cloneBuffer(buffer) {
3704
+ function baseZipObject(props, values, assignFunc) {
3705
+ var index = -1,
3706
+ length = props.length,
3707
+ valsLength = values.length,
3708
+ result = {};
3709
+
3710
+ while (++index < length) {
3711
+ assignFunc(result, props[index], index < valsLength ? values[index] : undefined);
3712
+ }
3713
+ return result;
3714
+ }
3715
+
3716
+ /**
3717
+ * Creates a clone of `buffer`.
3718
+ *
3719
+ * @private
3720
+ * @param {Buffer} buffer The buffer to clone.
3721
+ * @param {boolean} [isDeep] Specify a deep clone.
3722
+ * @returns {Buffer} Returns the cloned buffer.
3723
+ */
3724
+ function cloneBuffer(buffer, isDeep) {
3725
+ if (isDeep) {
3726
+ return buffer.slice();
3727
+ }
3615
3728
  var Ctor = buffer.constructor,
3616
- result = new Ctor(buffer.byteLength),
3729
+ result = new Ctor(buffer.length);
3730
+
3731
+ buffer.copy(result);
3732
+ return result;
3733
+ }
3734
+
3735
+ /**
3736
+ * Creates a clone of `arrayBuffer`.
3737
+ *
3738
+ * @private
3739
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
3740
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
3741
+ */
3742
+ function cloneArrayBuffer(arrayBuffer) {
3743
+ var Ctor = arrayBuffer.constructor,
3744
+ result = new Ctor(arrayBuffer.byteLength),
3617
3745
  view = new Uint8Array(result);
3618
3746
 
3619
- view.set(new Uint8Array(buffer));
3747
+ view.set(new Uint8Array(arrayBuffer));
3620
3748
  return result;
3621
3749
  }
3622
3750
 
@@ -3667,7 +3795,7 @@
3667
3795
  * @returns {Object} Returns the cloned symbol object.
3668
3796
  */
3669
3797
  function cloneSymbol(symbol) {
3670
- return _Symbol ? Object(symbolValueOf.call(symbol)) : {};
3798
+ return Symbol ? Object(symbolValueOf.call(symbol)) : {};
3671
3799
  }
3672
3800
 
3673
3801
  /**
@@ -3682,7 +3810,7 @@
3682
3810
  var buffer = typedArray.buffer,
3683
3811
  Ctor = typedArray.constructor;
3684
3812
 
3685
- return new Ctor(isDeep ? cloneBuffer(buffer) : buffer, typedArray.byteOffset, typedArray.length);
3813
+ return new Ctor(isDeep ? cloneArrayBuffer(buffer) : buffer, typedArray.byteOffset, typedArray.length);
3686
3814
  }
3687
3815
 
3688
3816
  /**
@@ -3821,29 +3949,16 @@
3821
3949
  * Creates a function like `_.groupBy`.
3822
3950
  *
3823
3951
  * @private
3824
- * @param {Function} setter The function to set keys and values of the accumulator object.
3825
- * @param {Function} [initializer] The function to initialize the accumulator object.
3952
+ * @param {Function} setter The function to set accumulator values.
3953
+ * @param {Function} [initializer] The accumulator object initializer.
3826
3954
  * @returns {Function} Returns the new aggregator function.
3827
3955
  */
3828
3956
  function createAggregator(setter, initializer) {
3829
3957
  return function(collection, iteratee) {
3830
- var result = initializer ? initializer() : {};
3831
- iteratee = getIteratee(iteratee);
3832
-
3833
- if (isArray(collection)) {
3834
- var index = -1,
3835
- length = collection.length;
3958
+ var func = isArray(collection) ? arrayAggregator : baseAggregator,
3959
+ accumulator = initializer ? initializer() : {};
3836
3960
 
3837
- while (++index < length) {
3838
- var value = collection[index];
3839
- setter(result, value, iteratee(value), collection);
3840
- }
3841
- } else {
3842
- baseEach(collection, function(value, key, collection) {
3843
- setter(result, value, iteratee(value), collection);
3844
- });
3845
- }
3846
- return result;
3961
+ return func(collection, setter, getIteratee(iteratee), accumulator);
3847
3962
  };
3848
3963
  }
3849
3964
 
@@ -3870,7 +3985,7 @@
3870
3985
  while (++index < length) {
3871
3986
  var source = sources[index];
3872
3987
  if (source) {
3873
- assigner(object, source, customizer);
3988
+ assigner(object, source, index, customizer);
3874
3989
  }
3875
3990
  }
3876
3991
  return object;
@@ -4033,7 +4148,7 @@
4033
4148
  index = length,
4034
4149
  args = Array(length),
4035
4150
  fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,
4036
- placeholder = wrapper.placeholder;
4151
+ placeholder = lodash.placeholder || wrapper.placeholder;
4037
4152
 
4038
4153
  while (index--) {
4039
4154
  args[index] = arguments[index];
@@ -4149,7 +4264,7 @@
4149
4264
  args = composeArgsRight(args, partialsRight, holdersRight);
4150
4265
  }
4151
4266
  if (isCurry || isCurryRight) {
4152
- var placeholder = wrapper.placeholder,
4267
+ var placeholder = lodash.placeholder || wrapper.placeholder,
4153
4268
  argsHolders = replaceHolders(args, placeholder);
4154
4269
 
4155
4270
  length -= argsHolders.length;
@@ -4176,6 +4291,20 @@
4176
4291
  return wrapper;
4177
4292
  }
4178
4293
 
4294
+ /**
4295
+ * Creates a function like `_.invertBy`.
4296
+ *
4297
+ * @private
4298
+ * @param {Function} setter The function to set accumulator values.
4299
+ * @param {Function} toIteratee The function to resolve iteratees.
4300
+ * @returns {Function} Returns the new inverter function.
4301
+ */
4302
+ function createInverter(setter, toIteratee) {
4303
+ return function(object, iteratee) {
4304
+ return baseInverter(object, setter, toIteratee(iteratee), {});
4305
+ };
4306
+ }
4307
+
4179
4308
  /**
4180
4309
  * Creates a function like `_.over`.
4181
4310
  *
@@ -4555,7 +4684,7 @@
4555
4684
  equalFunc(convert(object), convert(other), customizer, bitmask | UNORDERED_COMPARE_FLAG);
4556
4685
 
4557
4686
  case symbolTag:
4558
- return !!_Symbol && (symbolValueOf.call(object) == symbolValueOf.call(other));
4687
+ return !!Symbol && (symbolValueOf.call(object) == symbolValueOf.call(other));
4559
4688
  }
4560
4689
  return false;
4561
4690
  }
@@ -4575,7 +4704,6 @@
4575
4704
  */
4576
4705
  function equalObjects(object, other, equalFunc, customizer, bitmask, stack) {
4577
4706
  var isPartial = bitmask & PARTIAL_COMPARE_FLAG,
4578
- isUnordered = bitmask & UNORDERED_COMPARE_FLAG,
4579
4707
  objProps = keys(object),
4580
4708
  objLength = objProps.length,
4581
4709
  othProps = keys(other),
@@ -4587,8 +4715,7 @@
4587
4715
  var index = objLength;
4588
4716
  while (index--) {
4589
4717
  var key = objProps[index];
4590
- if (!(isPartial ? key in other : baseHas(other, key)) ||
4591
- !(isUnordered || key == othProps[index])) {
4718
+ if (!(isPartial ? key in other : baseHas(other, key))) {
4592
4719
  return false;
4593
4720
  }
4594
4721
  }
@@ -4658,7 +4785,7 @@
4658
4785
  function getFuncName(func) {
4659
4786
  var result = (func.name + ''),
4660
4787
  array = realNames[result],
4661
- length = array ? array.length : 0;
4788
+ length = hasOwnProperty.call(realNames, result) ? array.length : 0;
4662
4789
 
4663
4790
  while (length--) {
4664
4791
  var data = array[length],
@@ -4751,19 +4878,20 @@
4751
4878
  return objectToString.call(value);
4752
4879
  }
4753
4880
 
4754
- // Fallback for IE 11 providing `toStringTag` values for maps and sets.
4755
- if ((Map && getTag(new Map) != mapTag) || (Set && getTag(new Set) != setTag)) {
4881
+ // Fallback for IE 11 providing `toStringTag` values for maps, sets, and weakmaps.
4882
+ if ((Map && getTag(new Map) != mapTag) ||
4883
+ (Set && getTag(new Set) != setTag) ||
4884
+ (WeakMap && getTag(new WeakMap) != weakMapTag)) {
4756
4885
  getTag = function(value) {
4757
4886
  var result = objectToString.call(value),
4758
4887
  Ctor = result == objectTag ? value.constructor : null,
4759
4888
  ctorString = typeof Ctor == 'function' ? funcToString.call(Ctor) : '';
4760
4889
 
4761
4890
  if (ctorString) {
4762
- if (ctorString == mapCtorString) {
4763
- return mapTag;
4764
- }
4765
- if (ctorString == setCtorString) {
4766
- return setTag;
4891
+ switch (ctorString) {
4892
+ case mapCtorString: return mapTag;
4893
+ case setCtorString: return setTag;
4894
+ case weakMapCtorString: return weakMapTag;
4767
4895
  }
4768
4896
  }
4769
4897
  return result;
@@ -4820,8 +4948,11 @@
4820
4948
  result = hasFunc(object, path);
4821
4949
  }
4822
4950
  }
4823
- return result || (isLength(object && object.length) && isIndex(path, object.length) &&
4824
- (isArray(object) || isString(object) || isArguments(object)));
4951
+ var length = object ? object.length : undefined;
4952
+ return result || (
4953
+ !!length && isLength(length) && isIndex(path, length) &&
4954
+ (isArray(object) || isString(object) || isArguments(object))
4955
+ );
4825
4956
  }
4826
4957
 
4827
4958
  /**
@@ -4851,6 +4982,9 @@
4851
4982
  * @returns {Object} Returns the initialized clone.
4852
4983
  */
4853
4984
  function initCloneObject(object) {
4985
+ if (isPrototype(object)) {
4986
+ return {};
4987
+ }
4854
4988
  var Ctor = object.constructor;
4855
4989
  return baseCreate(isFunction(Ctor) ? Ctor.prototype : undefined);
4856
4990
  }
@@ -4871,7 +5005,7 @@
4871
5005
  var Ctor = object.constructor;
4872
5006
  switch (tag) {
4873
5007
  case arrayBufferTag:
4874
- return cloneBuffer(object);
5008
+ return cloneArrayBuffer(object);
4875
5009
 
4876
5010
  case boolTag:
4877
5011
  case dateTag:
@@ -4910,13 +5044,15 @@
4910
5044
  */
4911
5045
  function indexKeys(object) {
4912
5046
  var length = object ? object.length : undefined;
4913
- return (isLength(length) && (isArray(object) || isString(object) || isArguments(object)))
4914
- ? baseTimes(length, String)
4915
- : null;
5047
+ if (isLength(length) &&
5048
+ (isArray(object) || isString(object) || isArguments(object))) {
5049
+ return baseTimes(length, String);
5050
+ }
5051
+ return null;
4916
5052
  }
4917
5053
 
4918
5054
  /**
4919
- * Checks if the provided arguments are from an iteratee call.
5055
+ * Checks if the given arguments are from an iteratee call.
4920
5056
  *
4921
5057
  * @private
4922
5058
  * @param {*} value The potential iteratee value argument.
@@ -5099,9 +5235,9 @@
5099
5235
  function mergeDefaults(objValue, srcValue, key, object, source, stack) {
5100
5236
  if (isObject(objValue) && isObject(srcValue)) {
5101
5237
  stack.set(srcValue, objValue);
5102
- baseMerge(objValue, srcValue, mergeDefaults, stack);
5238
+ baseMerge(objValue, srcValue, undefined, mergeDefaults, stack);
5103
5239
  }
5104
- return objValue === undefined ? baseClone(srcValue) : objValue;
5240
+ return objValue;
5105
5241
  }
5106
5242
 
5107
5243
  /**
@@ -5315,13 +5451,16 @@
5315
5451
  * // => [1]
5316
5452
  */
5317
5453
  var concat = rest(function(array, values) {
5454
+ if (!isArray(array)) {
5455
+ array = array == null ? [] : [Object(array)];
5456
+ }
5318
5457
  values = baseFlatten(values);
5319
- return arrayConcat(isArray(array) ? array : [Object(array)], values);
5458
+ return arrayConcat(array, values);
5320
5459
  });
5321
5460
 
5322
5461
  /**
5323
5462
  * Creates an array of unique `array` values not included in the other
5324
- * provided arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5463
+ * given arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5325
5464
  * for equality comparisons.
5326
5465
  *
5327
5466
  * @static
@@ -5358,7 +5497,7 @@
5358
5497
  * _.differenceBy([3.1, 2.2, 1.3], [4.4, 2.5], Math.floor);
5359
5498
  * // => [3.1, 1.3]
5360
5499
  *
5361
- * // using the `_.property` iteratee shorthand
5500
+ * // The `_.property` iteratee shorthand.
5362
5501
  * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
5363
5502
  * // => [{ 'x': 2 }]
5364
5503
  */
@@ -5490,15 +5629,15 @@
5490
5629
  * _.dropRightWhile(users, function(o) { return !o.active; });
5491
5630
  * // => objects for ['barney']
5492
5631
  *
5493
- * // using the `_.matches` iteratee shorthand
5632
+ * // The `_.matches` iteratee shorthand.
5494
5633
  * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });
5495
5634
  * // => objects for ['barney', 'fred']
5496
5635
  *
5497
- * // using the `_.matchesProperty` iteratee shorthand
5636
+ * // The `_.matchesProperty` iteratee shorthand.
5498
5637
  * _.dropRightWhile(users, ['active', false]);
5499
5638
  * // => objects for ['barney']
5500
5639
  *
5501
- * // using the `_.property` iteratee shorthand
5640
+ * // The `_.property` iteratee shorthand.
5502
5641
  * _.dropRightWhile(users, 'active');
5503
5642
  * // => objects for ['barney', 'fred', 'pebbles']
5504
5643
  */
@@ -5530,15 +5669,15 @@
5530
5669
  * _.dropWhile(users, function(o) { return !o.active; });
5531
5670
  * // => objects for ['pebbles']
5532
5671
  *
5533
- * // using the `_.matches` iteratee shorthand
5672
+ * // The `_.matches` iteratee shorthand.
5534
5673
  * _.dropWhile(users, { 'user': 'barney', 'active': false });
5535
5674
  * // => objects for ['fred', 'pebbles']
5536
5675
  *
5537
- * // using the `_.matchesProperty` iteratee shorthand
5676
+ * // The `_.matchesProperty` iteratee shorthand.
5538
5677
  * _.dropWhile(users, ['active', false]);
5539
5678
  * // => objects for ['pebbles']
5540
5679
  *
5541
- * // using the `_.property` iteratee shorthand
5680
+ * // The `_.property` iteratee shorthand.
5542
5681
  * _.dropWhile(users, 'active');
5543
5682
  * // => objects for ['barney', 'fred', 'pebbles']
5544
5683
  */
@@ -5609,15 +5748,15 @@
5609
5748
  * _.findIndex(users, function(o) { return o.user == 'barney'; });
5610
5749
  * // => 0
5611
5750
  *
5612
- * // using the `_.matches` iteratee shorthand
5751
+ * // The `_.matches` iteratee shorthand.
5613
5752
  * _.findIndex(users, { 'user': 'fred', 'active': false });
5614
5753
  * // => 1
5615
5754
  *
5616
- * // using the `_.matchesProperty` iteratee shorthand
5755
+ * // The `_.matchesProperty` iteratee shorthand.
5617
5756
  * _.findIndex(users, ['active', false]);
5618
5757
  * // => 0
5619
5758
  *
5620
- * // using the `_.property` iteratee shorthand
5759
+ * // The `_.property` iteratee shorthand.
5621
5760
  * _.findIndex(users, 'active');
5622
5761
  * // => 2
5623
5762
  */
@@ -5648,15 +5787,15 @@
5648
5787
  * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });
5649
5788
  * // => 2
5650
5789
  *
5651
- * // using the `_.matches` iteratee shorthand
5790
+ * // The `_.matches` iteratee shorthand.
5652
5791
  * _.findLastIndex(users, { 'user': 'barney', 'active': true });
5653
5792
  * // => 0
5654
5793
  *
5655
- * // using the `_.matchesProperty` iteratee shorthand
5794
+ * // The `_.matchesProperty` iteratee shorthand.
5656
5795
  * _.findLastIndex(users, ['active', false]);
5657
5796
  * // => 2
5658
5797
  *
5659
- * // using the `_.property` iteratee shorthand
5798
+ * // The `_.property` iteratee shorthand.
5660
5799
  * _.findLastIndex(users, 'active');
5661
5800
  * // => 0
5662
5801
  */
@@ -5666,31 +5805,6 @@
5666
5805
  : -1;
5667
5806
  }
5668
5807
 
5669
- /**
5670
- * Creates an array of flattened values by running each element in `array`
5671
- * through `iteratee` and concating its result to the other mapped values.
5672
- * The iteratee is invoked with three arguments: (value, index|key, array).
5673
- *
5674
- * @static
5675
- * @memberOf _
5676
- * @category Array
5677
- * @param {Array} array The array to iterate over.
5678
- * @param {Function|Object|string} [iteratee=_.identity] The function invoked per iteration.
5679
- * @returns {Array} Returns the new array.
5680
- * @example
5681
- *
5682
- * function duplicate(n) {
5683
- * return [n, n];
5684
- * }
5685
- *
5686
- * _.flatMap([1, 2], duplicate);
5687
- * // => [1, 1, 2, 2]
5688
- */
5689
- function flatMap(array, iteratee) {
5690
- var length = array ? array.length : 0;
5691
- return length ? baseFlatten(arrayMap(array, getIteratee(iteratee, 3))) : [];
5692
- }
5693
-
5694
5808
  /**
5695
5809
  * Flattens `array` a single level.
5696
5810
  *
@@ -5748,7 +5862,7 @@
5748
5862
 
5749
5863
  while (++index < length) {
5750
5864
  var pair = pairs[index];
5751
- baseSet(result, pair[0], pair[1]);
5865
+ result[pair[0]] = pair[1];
5752
5866
  }
5753
5867
  return result;
5754
5868
  }
@@ -5778,8 +5892,7 @@
5778
5892
  * Gets the index at which the first occurrence of `value` is found in `array`
5779
5893
  * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5780
5894
  * for equality comparisons. If `fromIndex` is negative, it's used as the offset
5781
- * from the end of `array`. If `array` is sorted providing `true` for `fromIndex`
5782
- * performs a faster binary search.
5895
+ * from the end of `array`.
5783
5896
  *
5784
5897
  * @static
5785
5898
  * @memberOf _
@@ -5793,7 +5906,7 @@
5793
5906
  * _.indexOf([1, 2, 1, 2], 2);
5794
5907
  * // => 1
5795
5908
  *
5796
- * // using `fromIndex`
5909
+ * // Search from the `fromIndex`.
5797
5910
  * _.indexOf([1, 2, 1, 2], 2, 2);
5798
5911
  * // => 3
5799
5912
  */
@@ -5827,8 +5940,8 @@
5827
5940
  }
5828
5941
 
5829
5942
  /**
5830
- * Creates an array of unique values that are included in all of the provided
5831
- * arrays using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5943
+ * Creates an array of unique values that are included in all given arrays
5944
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5832
5945
  * for equality comparisons.
5833
5946
  *
5834
5947
  * @static
@@ -5837,6 +5950,7 @@
5837
5950
  * @param {...Array} [arrays] The arrays to inspect.
5838
5951
  * @returns {Array} Returns the new array of shared values.
5839
5952
  * @example
5953
+ *
5840
5954
  * _.intersection([2, 1], [4, 2], [1, 2]);
5841
5955
  * // => [2]
5842
5956
  */
@@ -5863,7 +5977,7 @@
5863
5977
  * _.intersectionBy([2.1, 1.2], [4.3, 2.4], Math.floor);
5864
5978
  * // => [2.1]
5865
5979
  *
5866
- * // using the `_.property` iteratee shorthand
5980
+ * // The `_.property` iteratee shorthand.
5867
5981
  * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
5868
5982
  * // => [{ 'x': 1 }]
5869
5983
  */
@@ -5966,7 +6080,7 @@
5966
6080
  * _.lastIndexOf([1, 2, 1, 2], 2);
5967
6081
  * // => 3
5968
6082
  *
5969
- * // using `fromIndex`
6083
+ * // Search from the `fromIndex`.
5970
6084
  * _.lastIndexOf([1, 2, 1, 2], 2, 2);
5971
6085
  * // => 1
5972
6086
  */
@@ -5992,7 +6106,7 @@
5992
6106
  }
5993
6107
 
5994
6108
  /**
5995
- * Removes all provided values from `array` using
6109
+ * Removes all given values from `array` using
5996
6110
  * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
5997
6111
  * for equality comparisons.
5998
6112
  *
@@ -6029,7 +6143,7 @@
6029
6143
  *
6030
6144
  * var array = [1, 2, 3, 1, 2, 3];
6031
6145
  *
6032
- * _.pull(array, [2, 3]);
6146
+ * _.pullAll(array, [2, 3]);
6033
6147
  * console.log(array);
6034
6148
  * // => [1, 1]
6035
6149
  */
@@ -6041,7 +6155,7 @@
6041
6155
 
6042
6156
  /**
6043
6157
  * This method is like `_.pullAll` except that it accepts `iteratee` which is
6044
- * invoked for each element of `array` and `values` to to generate the criterion
6158
+ * invoked for each element of `array` and `values` to generate the criterion
6045
6159
  * by which uniqueness is computed. The iteratee is invoked with one argument: (value).
6046
6160
  *
6047
6161
  * **Note:** Unlike `_.differenceBy`, this method mutates `array`.
@@ -6153,6 +6267,7 @@
6153
6267
  * **Note:** This method mutates `array` and is based on
6154
6268
  * [`Array#reverse`](https://mdn.io/Array/reverse).
6155
6269
  *
6270
+ * @static
6156
6271
  * @memberOf _
6157
6272
  * @category Array
6158
6273
  * @returns {Array} Returns `array`.
@@ -6241,7 +6356,7 @@
6241
6356
  * _.sortedIndexBy(['thirty', 'fifty'], 'forty', _.propertyOf(dict));
6242
6357
  * // => 1
6243
6358
  *
6244
- * // using the `_.property` iteratee shorthand
6359
+ * // The `_.property` iteratee shorthand.
6245
6360
  * _.sortedIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
6246
6361
  * // => 0
6247
6362
  */
@@ -6309,7 +6424,7 @@
6309
6424
  * @returns {number} Returns the index at which `value` should be inserted into `array`.
6310
6425
  * @example
6311
6426
  *
6312
- * // using the `_.property` iteratee shorthand
6427
+ * // The `_.property` iteratee shorthand.
6313
6428
  * _.sortedLastIndexBy([{ 'x': 4 }, { 'x': 5 }], { 'x': 4 }, 'x');
6314
6429
  * // => 1
6315
6430
  */
@@ -6376,7 +6491,7 @@
6376
6491
  * @example
6377
6492
  *
6378
6493
  * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);
6379
- * // => [1.1, 2.2]
6494
+ * // => [1.1, 2.3]
6380
6495
  */
6381
6496
  function sortedUniqBy(array, iteratee) {
6382
6497
  return (array && array.length)
@@ -6489,15 +6604,15 @@
6489
6604
  * _.takeRightWhile(users, function(o) { return !o.active; });
6490
6605
  * // => objects for ['fred', 'pebbles']
6491
6606
  *
6492
- * // using the `_.matches` iteratee shorthand
6607
+ * // The `_.matches` iteratee shorthand.
6493
6608
  * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });
6494
6609
  * // => objects for ['pebbles']
6495
6610
  *
6496
- * // using the `_.matchesProperty` iteratee shorthand
6611
+ * // The `_.matchesProperty` iteratee shorthand.
6497
6612
  * _.takeRightWhile(users, ['active', false]);
6498
6613
  * // => objects for ['fred', 'pebbles']
6499
6614
  *
6500
- * // using the `_.property` iteratee shorthand
6615
+ * // The `_.property` iteratee shorthand.
6501
6616
  * _.takeRightWhile(users, 'active');
6502
6617
  * // => []
6503
6618
  */
@@ -6529,15 +6644,15 @@
6529
6644
  * _.takeWhile(users, function(o) { return !o.active; });
6530
6645
  * // => objects for ['barney', 'fred']
6531
6646
  *
6532
- * // using the `_.matches` iteratee shorthand
6647
+ * // The `_.matches` iteratee shorthand.
6533
6648
  * _.takeWhile(users, { 'user': 'barney', 'active': false });
6534
6649
  * // => objects for ['barney']
6535
6650
  *
6536
- * // using the `_.matchesProperty` iteratee shorthand
6651
+ * // The `_.matchesProperty` iteratee shorthand.
6537
6652
  * _.takeWhile(users, ['active', false]);
6538
6653
  * // => objects for ['barney', 'fred']
6539
6654
  *
6540
- * // using the `_.property` iteratee shorthand
6655
+ * // The `_.property` iteratee shorthand.
6541
6656
  * _.takeWhile(users, 'active');
6542
6657
  * // => []
6543
6658
  */
@@ -6548,8 +6663,8 @@
6548
6663
  }
6549
6664
 
6550
6665
  /**
6551
- * Creates an array of unique values, in order, from all of the provided arrays
6552
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
6666
+ * Creates an array of unique values, in order, from all given arrays using
6667
+ * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
6553
6668
  * for equality comparisons.
6554
6669
  *
6555
6670
  * @static
@@ -6582,7 +6697,7 @@
6582
6697
  * _.unionBy([2.1, 1.2], [4.3, 2.4], Math.floor);
6583
6698
  * // => [2.1, 1.2, 4.3]
6584
6699
  *
6585
- * // using the `_.property` iteratee shorthand
6700
+ * // The `_.property` iteratee shorthand.
6586
6701
  * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
6587
6702
  * // => [{ 'x': 1 }, { 'x': 2 }]
6588
6703
  */
@@ -6659,7 +6774,7 @@
6659
6774
  * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
6660
6775
  * // => [2.1, 1.2]
6661
6776
  *
6662
- * // using the `_.property` iteratee shorthand
6777
+ * // The `_.property` iteratee shorthand.
6663
6778
  * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
6664
6779
  * // => [{ 'x': 1 }, { 'x': 2 }]
6665
6780
  */
@@ -6760,7 +6875,7 @@
6760
6875
  }
6761
6876
 
6762
6877
  /**
6763
- * Creates an array excluding all provided values using
6878
+ * Creates an array excluding all given values using
6764
6879
  * [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
6765
6880
  * for equality comparisons.
6766
6881
  *
@@ -6783,7 +6898,7 @@
6783
6898
 
6784
6899
  /**
6785
6900
  * Creates an array of unique values that is the [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)
6786
- * of the provided arrays.
6901
+ * of the given arrays.
6787
6902
  *
6788
6903
  * @static
6789
6904
  * @memberOf _
@@ -6815,7 +6930,7 @@
6815
6930
  * _.xorBy([2.1, 1.2], [4.3, 2.4], Math.floor);
6816
6931
  * // => [1.2, 4.3]
6817
6932
  *
6818
- * // using the `_.property` iteratee shorthand
6933
+ * // The `_.property` iteratee shorthand.
6819
6934
  * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
6820
6935
  * // => [{ 'x': 2 }]
6821
6936
  */
@@ -6883,19 +6998,29 @@
6883
6998
  * @returns {Object} Returns the new object.
6884
6999
  * @example
6885
7000
  *
6886
- * _.zipObject(['fred', 'barney'], [30, 40]);
6887
- * // => { 'fred': 30, 'barney': 40 }
7001
+ * _.zipObject(['a', 'b'], [1, 2]);
7002
+ * // => { 'a': 1, 'b': 2 }
6888
7003
  */
6889
7004
  function zipObject(props, values) {
6890
- var index = -1,
6891
- length = props ? props.length : 0,
6892
- valsLength = values ? values.length : 0,
6893
- result = {};
7005
+ return baseZipObject(props || [], values || [], assignValue);
7006
+ }
6894
7007
 
6895
- while (++index < length) {
6896
- baseSet(result, props[index], index < valsLength ? values[index] : undefined);
6897
- }
6898
- return result;
7008
+ /**
7009
+ * This method is like `_.zipObject` except that it supports property paths.
7010
+ *
7011
+ * @static
7012
+ * @memberOf _
7013
+ * @category Array
7014
+ * @param {Array} [props=[]] The property names.
7015
+ * @param {Array} [values=[]] The property values.
7016
+ * @returns {Object} Returns the new object.
7017
+ * @example
7018
+ *
7019
+ * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);
7020
+ * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }
7021
+ */
7022
+ function zipObjectDeep(props, values) {
7023
+ return baseZipObject(props || [], values || [], baseSet);
6899
7024
  }
6900
7025
 
6901
7026
  /**
@@ -6960,10 +7085,9 @@
6960
7085
  }
6961
7086
 
6962
7087
  /**
6963
- * This method invokes `interceptor` and returns `value`. The interceptor is
6964
- * invoked with one argument; (value). The purpose of this method is to "tap into"
6965
- * a method chain in order to perform operations on intermediate results within
6966
- * the chain.
7088
+ * This method invokes `interceptor` and returns `value`. The interceptor
7089
+ * is invoked with one argument; (value). The purpose of this method is to
7090
+ * "tap into" a method chain in order to modify intermediate results.
6967
7091
  *
6968
7092
  * @static
6969
7093
  * @memberOf _
@@ -6975,6 +7099,7 @@
6975
7099
  *
6976
7100
  * _([1, 2, 3])
6977
7101
  * .tap(function(array) {
7102
+ * // Mutate input array.
6978
7103
  * array.pop();
6979
7104
  * })
6980
7105
  * .reverse()
@@ -6988,6 +7113,8 @@
6988
7113
 
6989
7114
  /**
6990
7115
  * This method is like `_.tap` except that it returns the result of `interceptor`.
7116
+ * The purpose of this method is to "pass thru" values replacing intermediate
7117
+ * results in a method chain.
6991
7118
  *
6992
7119
  * @static
6993
7120
  * @memberOf _
@@ -7063,11 +7190,11 @@
7063
7190
  * { 'user': 'fred', 'age': 40 }
7064
7191
  * ];
7065
7192
  *
7066
- * // without explicit chaining
7193
+ * // A sequence without explicit chaining.
7067
7194
  * _(users).head();
7068
7195
  * // => { 'user': 'barney', 'age': 36 }
7069
7196
  *
7070
- * // with explicit chaining
7197
+ * // A sequence with explicit chaining.
7071
7198
  * _(users)
7072
7199
  * .chain()
7073
7200
  * .head()
@@ -7111,7 +7238,7 @@
7111
7238
  /**
7112
7239
  * This method is the wrapper version of `_.flatMap`.
7113
7240
  *
7114
- * @static
7241
+ * @name flatMap
7115
7242
  * @memberOf _
7116
7243
  * @category Seq
7117
7244
  * @param {Function|Object|string} [iteratee=_.identity] The function invoked per iteration.
@@ -7262,7 +7389,7 @@
7262
7389
  *
7263
7390
  * @name value
7264
7391
  * @memberOf _
7265
- * @alias run, toJSON, valueOf
7392
+ * @alias toJSON, valueOf
7266
7393
  * @category Seq
7267
7394
  * @returns {*} Returns the resolved unwrapped value.
7268
7395
  * @example
@@ -7286,7 +7413,7 @@
7286
7413
  * @memberOf _
7287
7414
  * @category Collection
7288
7415
  * @param {Array|Object} collection The collection to iterate over.
7289
- * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
7416
+ * @param {Function|Object|string} [iteratee=_.identity] The iteratee to transform keys.
7290
7417
  * @returns {Object} Returns the composed aggregate object.
7291
7418
  * @example
7292
7419
  *
@@ -7322,15 +7449,15 @@
7322
7449
  * { 'user': 'fred', 'active': false }
7323
7450
  * ];
7324
7451
  *
7325
- * // using the `_.matches` iteratee shorthand
7452
+ * // The `_.matches` iteratee shorthand.
7326
7453
  * _.every(users, { 'user': 'barney', 'active': false });
7327
7454
  * // => false
7328
7455
  *
7329
- * // using the `_.matchesProperty` iteratee shorthand
7456
+ * // The `_.matchesProperty` iteratee shorthand.
7330
7457
  * _.every(users, ['active', false]);
7331
7458
  * // => true
7332
7459
  *
7333
- * // using the `_.property` iteratee shorthand
7460
+ * // The `_.property` iteratee shorthand.
7334
7461
  * _.every(users, 'active');
7335
7462
  * // => false
7336
7463
  */
@@ -7363,15 +7490,15 @@
7363
7490
  * _.filter(users, function(o) { return !o.active; });
7364
7491
  * // => objects for ['fred']
7365
7492
  *
7366
- * // using the `_.matches` iteratee shorthand
7493
+ * // The `_.matches` iteratee shorthand.
7367
7494
  * _.filter(users, { 'age': 36, 'active': true });
7368
7495
  * // => objects for ['barney']
7369
7496
  *
7370
- * // using the `_.matchesProperty` iteratee shorthand
7497
+ * // The `_.matchesProperty` iteratee shorthand.
7371
7498
  * _.filter(users, ['active', false]);
7372
7499
  * // => objects for ['fred']
7373
7500
  *
7374
- * // using the `_.property` iteratee shorthand
7501
+ * // The `_.property` iteratee shorthand.
7375
7502
  * _.filter(users, 'active');
7376
7503
  * // => objects for ['barney']
7377
7504
  */
@@ -7402,15 +7529,15 @@
7402
7529
  * _.find(users, function(o) { return o.age < 40; });
7403
7530
  * // => object for 'barney'
7404
7531
  *
7405
- * // using the `_.matches` iteratee shorthand
7532
+ * // The `_.matches` iteratee shorthand.
7406
7533
  * _.find(users, { 'age': 1, 'active': true });
7407
7534
  * // => object for 'pebbles'
7408
7535
  *
7409
- * // using the `_.matchesProperty` iteratee shorthand
7536
+ * // The `_.matchesProperty` iteratee shorthand.
7410
7537
  * _.find(users, ['active', false]);
7411
7538
  * // => object for 'fred'
7412
7539
  *
7413
- * // using the `_.property` iteratee shorthand
7540
+ * // The `_.property` iteratee shorthand.
7414
7541
  * _.find(users, 'active');
7415
7542
  * // => object for 'barney'
7416
7543
  */
@@ -7449,6 +7576,30 @@
7449
7576
  return baseFind(collection, predicate, baseEachRight);
7450
7577
  }
7451
7578
 
7579
+ /**
7580
+ * Creates an array of flattened values by running each element in `collection`
7581
+ * through `iteratee` and concating its result to the other mapped values.
7582
+ * The iteratee is invoked with three arguments: (value, index|key, collection).
7583
+ *
7584
+ * @static
7585
+ * @memberOf _
7586
+ * @category Collection
7587
+ * @param {Array|Object} collection The collection to iterate over.
7588
+ * @param {Function|Object|string} [iteratee=_.identity] The function invoked per iteration.
7589
+ * @returns {Array} Returns the new flattened array.
7590
+ * @example
7591
+ *
7592
+ * function duplicate(n) {
7593
+ * return [n, n];
7594
+ * }
7595
+ *
7596
+ * _.flatMap([1, 2], duplicate);
7597
+ * // => [1, 1, 2, 2]
7598
+ */
7599
+ function flatMap(collection, iteratee) {
7600
+ return baseFlatten(map(collection, iteratee));
7601
+ }
7602
+
7452
7603
  /**
7453
7604
  * Iterates over elements of `collection` invoking `iteratee` for each element.
7454
7605
  * The iteratee is invoked with three arguments: (value, index|key, collection).
@@ -7510,21 +7661,21 @@
7510
7661
  /**
7511
7662
  * Creates an object composed of keys generated from the results of running
7512
7663
  * each element of `collection` through `iteratee`. The corresponding value
7513
- * of each key is an array of the elements responsible for generating the key.
7664
+ * of each key is an array of elements responsible for generating the key.
7514
7665
  * The iteratee is invoked with one argument: (value).
7515
7666
  *
7516
7667
  * @static
7517
7668
  * @memberOf _
7518
7669
  * @category Collection
7519
7670
  * @param {Array|Object} collection The collection to iterate over.
7520
- * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
7671
+ * @param {Function|Object|string} [iteratee=_.identity] The iteratee to transform keys.
7521
7672
  * @returns {Object} Returns the composed aggregate object.
7522
7673
  * @example
7523
7674
  *
7524
7675
  * _.groupBy([6.1, 4.2, 6.3], Math.floor);
7525
7676
  * // => { '4': [4.2], '6': [6.1, 6.3] }
7526
7677
  *
7527
- * // using the `_.property` iteratee shorthand
7678
+ * // The `_.property` iteratee shorthand.
7528
7679
  * _.groupBy(['one', 'two', 'three'], 'length');
7529
7680
  * // => { '3': ['one', 'two'], '5': ['three'] }
7530
7681
  */
@@ -7622,22 +7773,22 @@
7622
7773
  * @memberOf _
7623
7774
  * @category Collection
7624
7775
  * @param {Array|Object} collection The collection to iterate over.
7625
- * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
7776
+ * @param {Function|Object|string} [iteratee=_.identity] The iteratee to transform keys.
7626
7777
  * @returns {Object} Returns the composed aggregate object.
7627
7778
  * @example
7628
7779
  *
7629
- * var keyData = [
7780
+ * var array = [
7630
7781
  * { 'dir': 'left', 'code': 97 },
7631
7782
  * { 'dir': 'right', 'code': 100 }
7632
7783
  * ];
7633
7784
  *
7634
- * _.keyBy(keyData, 'dir');
7635
- * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
7636
- *
7637
- * _.keyBy(keyData, function(o) {
7785
+ * _.keyBy(array, function(o) {
7638
7786
  * return String.fromCharCode(o.code);
7639
7787
  * });
7640
7788
  * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }
7789
+ *
7790
+ * _.keyBy(array, 'dir');
7791
+ * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }
7641
7792
  */
7642
7793
  var keyBy = createAggregator(function(result, value, key) {
7643
7794
  result[key] = value;
@@ -7669,18 +7820,18 @@
7669
7820
  * return n * n;
7670
7821
  * }
7671
7822
  *
7672
- * _.map([1, 2], square);
7673
- * // => [3, 6]
7823
+ * _.map([4, 8], square);
7824
+ * // => [16, 64]
7674
7825
  *
7675
- * _.map({ 'a': 1, 'b': 2 }, square);
7676
- * // => [3, 6] (iteration order is not guaranteed)
7826
+ * _.map({ 'a': 4, 'b': 8 }, square);
7827
+ * // => [16, 64] (iteration order is not guaranteed)
7677
7828
  *
7678
7829
  * var users = [
7679
7830
  * { 'user': 'barney' },
7680
7831
  * { 'user': 'fred' }
7681
7832
  * ];
7682
7833
  *
7683
- * // using the `_.property` iteratee shorthand
7834
+ * // The `_.property` iteratee shorthand.
7684
7835
  * _.map(users, 'user');
7685
7836
  * // => ['barney', 'fred']
7686
7837
  */
@@ -7712,7 +7863,7 @@
7712
7863
  * { 'user': 'barney', 'age': 36 }
7713
7864
  * ];
7714
7865
  *
7715
- * // sort by `user` in ascending order and by `age` in descending order
7866
+ * // Sort by `user` in ascending order and by `age` in descending order.
7716
7867
  * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);
7717
7868
  * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 42]]
7718
7869
  */
@@ -7732,9 +7883,9 @@
7732
7883
 
7733
7884
  /**
7734
7885
  * Creates an array of elements split into two groups, the first of which
7735
- * contains elements `predicate` returns truthy for, while the second of which
7736
- * contains elements `predicate` returns falsey for. The predicate is invoked
7737
- * with three arguments: (value, index|key, collection).
7886
+ * contains elements `predicate` returns truthy for, the second of which
7887
+ * contains elements `predicate` returns falsey for. The predicate is
7888
+ * invoked with one argument: (value).
7738
7889
  *
7739
7890
  * @static
7740
7891
  * @memberOf _
@@ -7753,15 +7904,15 @@
7753
7904
  * _.partition(users, function(o) { return o.active; });
7754
7905
  * // => objects for [['fred'], ['barney', 'pebbles']]
7755
7906
  *
7756
- * // using the `_.matches` iteratee shorthand
7907
+ * // The `_.matches` iteratee shorthand.
7757
7908
  * _.partition(users, { 'age': 1, 'active': false });
7758
7909
  * // => objects for [['pebbles'], ['barney', 'fred']]
7759
7910
  *
7760
- * // using the `_.matchesProperty` iteratee shorthand
7911
+ * // The `_.matchesProperty` iteratee shorthand.
7761
7912
  * _.partition(users, ['active', false]);
7762
7913
  * // => objects for [['barney', 'pebbles'], ['fred']]
7763
7914
  *
7764
- * // using the `_.property` iteratee shorthand
7915
+ * // The `_.property` iteratee shorthand.
7765
7916
  * _.partition(users, 'active');
7766
7917
  * // => objects for [['fred'], ['barney', 'pebbles']]
7767
7918
  */
@@ -7773,7 +7924,7 @@
7773
7924
  * Reduces `collection` to a value which is the accumulated result of running
7774
7925
  * each element in `collection` through `iteratee`, where each successive
7775
7926
  * invocation is supplied the return value of the previous. If `accumulator`
7776
- * is not provided the first element of `collection` is used as the initial
7927
+ * is not given the first element of `collection` is used as the initial
7777
7928
  * value. The iteratee is invoked with four arguments:
7778
7929
  * (accumulator, value, index|key, collection).
7779
7930
  *
@@ -7795,7 +7946,7 @@
7795
7946
  *
7796
7947
  * _.reduce([1, 2], function(sum, n) {
7797
7948
  * return sum + n;
7798
- * });
7949
+ * }, 0);
7799
7950
  * // => 3
7800
7951
  *
7801
7952
  * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
@@ -7806,9 +7957,9 @@
7806
7957
  */
7807
7958
  function reduce(collection, iteratee, accumulator) {
7808
7959
  var func = isArray(collection) ? arrayReduce : baseReduce,
7809
- initFromCollection = arguments.length < 3;
7960
+ initAccum = arguments.length < 3;
7810
7961
 
7811
- return func(collection, getIteratee(iteratee, 4), accumulator, initFromCollection, baseEach);
7962
+ return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);
7812
7963
  }
7813
7964
 
7814
7965
  /**
@@ -7833,9 +7984,9 @@
7833
7984
  */
7834
7985
  function reduceRight(collection, iteratee, accumulator) {
7835
7986
  var func = isArray(collection) ? arrayReduceRight : baseReduce,
7836
- initFromCollection = arguments.length < 3;
7987
+ initAccum = arguments.length < 3;
7837
7988
 
7838
- return func(collection, getIteratee(iteratee, 4), accumulator, initFromCollection, baseEachRight);
7989
+ return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);
7839
7990
  }
7840
7991
 
7841
7992
  /**
@@ -7858,15 +8009,15 @@
7858
8009
  * _.reject(users, function(o) { return !o.active; });
7859
8010
  * // => objects for ['fred']
7860
8011
  *
7861
- * // using the `_.matches` iteratee shorthand
8012
+ * // The `_.matches` iteratee shorthand.
7862
8013
  * _.reject(users, { 'age': 40, 'active': true });
7863
8014
  * // => objects for ['barney']
7864
8015
  *
7865
- * // using the `_.matchesProperty` iteratee shorthand
8016
+ * // The `_.matchesProperty` iteratee shorthand.
7866
8017
  * _.reject(users, ['active', false]);
7867
8018
  * // => objects for ['fred']
7868
8019
  *
7869
- * // using the `_.property` iteratee shorthand
8020
+ * // The `_.property` iteratee shorthand.
7870
8021
  * _.reject(users, 'active');
7871
8022
  * // => objects for ['barney']
7872
8023
  */
@@ -7899,7 +8050,8 @@
7899
8050
  }
7900
8051
 
7901
8052
  /**
7902
- * Gets `n` random elements from `collection`.
8053
+ * Gets `n` random elements at unique keys from `collection` up to the
8054
+ * size of `collection`.
7903
8055
  *
7904
8056
  * @static
7905
8057
  * @memberOf _
@@ -7909,8 +8061,11 @@
7909
8061
  * @returns {Array} Returns the random elements.
7910
8062
  * @example
7911
8063
  *
7912
- * _.sampleSize([1, 2, 3, 4], 2);
8064
+ * _.sampleSize([1, 2, 3], 2);
7913
8065
  * // => [3, 1]
8066
+ *
8067
+ * _.sampleSize([1, 2, 3], 4);
8068
+ * // => [2, 3, 1]
7914
8069
  */
7915
8070
  function sampleSize(collection, n) {
7916
8071
  var index = -1,
@@ -8001,15 +8156,15 @@
8001
8156
  * { 'user': 'fred', 'active': false }
8002
8157
  * ];
8003
8158
  *
8004
- * // using the `_.matches` iteratee shorthand
8159
+ * // The `_.matches` iteratee shorthand.
8005
8160
  * _.some(users, { 'user': 'barney', 'active': false });
8006
8161
  * // => false
8007
8162
  *
8008
- * // using the `_.matchesProperty` iteratee shorthand
8163
+ * // The `_.matchesProperty` iteratee shorthand.
8009
8164
  * _.some(users, ['active', false]);
8010
8165
  * // => true
8011
8166
  *
8012
- * // using the `_.property` iteratee shorthand
8167
+ * // The `_.property` iteratee shorthand.
8013
8168
  * _.some(users, 'active');
8014
8169
  * // => true
8015
8170
  */
@@ -8209,7 +8364,7 @@
8209
8364
  * bound('!');
8210
8365
  * // => 'hi fred!'
8211
8366
  *
8212
- * // using placeholders
8367
+ * // Bound with placeholders.
8213
8368
  * var bound = _.bind(greet, object, _, '!');
8214
8369
  * bound('hi');
8215
8370
  * // => 'hi fred!'
@@ -8217,7 +8372,9 @@
8217
8372
  var bind = rest(function(func, thisArg, partials) {
8218
8373
  var bitmask = BIND_FLAG;
8219
8374
  if (partials.length) {
8220
- var holders = replaceHolders(partials, bind.placeholder);
8375
+ var placeholder = lodash.placeholder || bind.placeholder,
8376
+ holders = replaceHolders(partials, placeholder);
8377
+
8221
8378
  bitmask |= PARTIAL_FLAG;
8222
8379
  }
8223
8380
  return createWrapper(func, bitmask, thisArg, partials, holders);
@@ -8262,7 +8419,7 @@
8262
8419
  * bound('!');
8263
8420
  * // => 'hiya fred!'
8264
8421
  *
8265
- * // using placeholders
8422
+ * // Bound with placeholders.
8266
8423
  * var bound = _.bindKey(object, 'greet', _, '!');
8267
8424
  * bound('hi');
8268
8425
  * // => 'hiya fred!'
@@ -8270,7 +8427,9 @@
8270
8427
  var bindKey = rest(function(object, key, partials) {
8271
8428
  var bitmask = BIND_FLAG | BIND_KEY_FLAG;
8272
8429
  if (partials.length) {
8273
- var holders = replaceHolders(partials, bindKey.placeholder);
8430
+ var placeholder = lodash.placeholder || bindKey.placeholder,
8431
+ holders = replaceHolders(partials, placeholder);
8432
+
8274
8433
  bitmask |= PARTIAL_FLAG;
8275
8434
  }
8276
8435
  return createWrapper(key, bitmask, object, partials, holders);
@@ -8312,14 +8471,14 @@
8312
8471
  * curried(1, 2, 3);
8313
8472
  * // => [1, 2, 3]
8314
8473
  *
8315
- * // using placeholders
8474
+ * // Curried with placeholders.
8316
8475
  * curried(1)(_, 3)(2);
8317
8476
  * // => [1, 2, 3]
8318
8477
  */
8319
8478
  function curry(func, arity, guard) {
8320
8479
  arity = guard ? undefined : arity;
8321
8480
  var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
8322
- result.placeholder = curry.placeholder;
8481
+ result.placeholder = lodash.placeholder || curry.placeholder;
8323
8482
  return result;
8324
8483
  }
8325
8484
 
@@ -8356,14 +8515,14 @@
8356
8515
  * curried(1, 2, 3);
8357
8516
  * // => [1, 2, 3]
8358
8517
  *
8359
- * // using placeholders
8518
+ * // Curried with placeholders.
8360
8519
  * curried(3)(1, _)(2);
8361
8520
  * // => [1, 2, 3]
8362
8521
  */
8363
8522
  function curryRight(func, arity, guard) {
8364
8523
  arity = guard ? undefined : arity;
8365
8524
  var result = createWrapper(func, CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);
8366
- result.placeholder = curryRight.placeholder;
8525
+ result.placeholder = lodash.placeholder || curryRight.placeholder;
8367
8526
  return result;
8368
8527
  }
8369
8528
 
@@ -8378,7 +8537,7 @@
8378
8537
  * to the debounced function return the result of the last `func` invocation.
8379
8538
  *
8380
8539
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
8381
- * on the trailing edge of the timeout only if the the debounced function is
8540
+ * on the trailing edge of the timeout only if the debounced function is
8382
8541
  * invoked more than once during the `wait` timeout.
8383
8542
  *
8384
8543
  * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
@@ -8399,21 +8558,21 @@
8399
8558
  * @returns {Function} Returns the new debounced function.
8400
8559
  * @example
8401
8560
  *
8402
- * // avoid costly calculations while the window size is in flux
8561
+ * // Avoid costly calculations while the window size is in flux.
8403
8562
  * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
8404
8563
  *
8405
- * // invoke `sendMail` when clicked, debouncing subsequent calls
8564
+ * // Invoke `sendMail` when clicked, debouncing subsequent calls.
8406
8565
  * jQuery(element).on('click', _.debounce(sendMail, 300, {
8407
8566
  * 'leading': true,
8408
8567
  * 'trailing': false
8409
8568
  * }));
8410
8569
  *
8411
- * // ensure `batchLog` is invoked once after 1 second of debounced calls
8570
+ * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
8412
8571
  * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
8413
8572
  * var source = new EventSource('/stream');
8414
8573
  * jQuery(source).on('message', debounced);
8415
8574
  *
8416
- * // cancel a trailing debounced invocation
8575
+ * // Cancel the trailing debounced invocation.
8417
8576
  * jQuery(window).on('popstate', debounced.cancel);
8418
8577
  */
8419
8578
  function debounce(func, wait, options) {
@@ -8494,7 +8653,7 @@
8494
8653
  if (maxWait === false) {
8495
8654
  var leadingCall = leading && !timeoutId;
8496
8655
  } else {
8497
- if (!maxTimeoutId && !leading) {
8656
+ if (!lastCalled && !maxTimeoutId && !leading) {
8498
8657
  lastCalled = stamp;
8499
8658
  }
8500
8659
  var remaining = maxWait - (stamp - lastCalled),
@@ -8546,7 +8705,7 @@
8546
8705
  * _.defer(function(text) {
8547
8706
  * console.log(text);
8548
8707
  * }, 'deferred');
8549
- * // logs 'deferred' after one or more milliseconds
8708
+ * // => logs 'deferred' after one or more milliseconds
8550
8709
  */
8551
8710
  var defer = rest(function(func, args) {
8552
8711
  return baseDelay(func, 1, args);
@@ -8629,12 +8788,12 @@
8629
8788
  * values(object);
8630
8789
  * // => [1, 2]
8631
8790
  *
8632
- * // modifying the result cache
8791
+ * // Modify the result cache.
8633
8792
  * values.cache.set(object, ['a', 'b']);
8634
8793
  * values(object);
8635
8794
  * // => ['a', 'b']
8636
8795
  *
8637
- * // replacing `_.memoize.Cache`
8796
+ * // Replace `_.memoize.Cache`.
8638
8797
  * _.memoize.Cache = WeakMap;
8639
8798
  */
8640
8799
  function memoize(func, resolver) {
@@ -8779,13 +8938,15 @@
8779
8938
  * sayHelloTo('fred');
8780
8939
  * // => 'hello fred'
8781
8940
  *
8782
- * // using placeholders
8941
+ * // Partially applied with placeholders.
8783
8942
  * var greetFred = _.partial(greet, _, 'fred');
8784
8943
  * greetFred('hi');
8785
8944
  * // => 'hi fred'
8786
8945
  */
8787
8946
  var partial = rest(function(func, partials) {
8788
- var holders = replaceHolders(partials, partial.placeholder);
8947
+ var placeholder = lodash.placeholder || partial.placeholder,
8948
+ holders = replaceHolders(partials, placeholder);
8949
+
8789
8950
  return createWrapper(func, PARTIAL_FLAG, undefined, partials, holders);
8790
8951
  });
8791
8952
 
@@ -8815,13 +8976,15 @@
8815
8976
  * greetFred('hi');
8816
8977
  * // => 'hi fred'
8817
8978
  *
8818
- * // using placeholders
8979
+ * // Partially applied with placeholders.
8819
8980
  * var sayHelloTo = _.partialRight(greet, 'hello', _);
8820
8981
  * sayHelloTo('fred');
8821
8982
  * // => 'hello fred'
8822
8983
  */
8823
8984
  var partialRight = rest(function(func, partials) {
8824
- var holders = replaceHolders(partials, partialRight.placeholder);
8985
+ var placeholder = lodash.placeholder || partialRight.placeholder,
8986
+ holders = replaceHolders(partials, placeholder);
8987
+
8825
8988
  return createWrapper(func, PARTIAL_RIGHT_FLAG, undefined, partials, holders);
8826
8989
  });
8827
8990
 
@@ -8912,6 +9075,7 @@
8912
9075
  * @memberOf _
8913
9076
  * @category Function
8914
9077
  * @param {Function} func The function to spread arguments over.
9078
+ * @param {number} [start=0] The start position of the spread.
8915
9079
  * @returns {Function} Returns the new function.
8916
9080
  * @example
8917
9081
  *
@@ -8922,7 +9086,6 @@
8922
9086
  * say(['fred', 'hello']);
8923
9087
  * // => 'fred says hello'
8924
9088
  *
8925
- * // with a Promise
8926
9089
  * var numbers = Promise.all([
8927
9090
  * Promise.resolve(40),
8928
9091
  * Promise.resolve(36)
@@ -8933,13 +9096,20 @@
8933
9096
  * }));
8934
9097
  * // => a Promise of 76
8935
9098
  */
8936
- function spread(func) {
9099
+ function spread(func, start) {
8937
9100
  if (typeof func != 'function') {
8938
9101
  throw new TypeError(FUNC_ERROR_TEXT);
8939
9102
  }
8940
- return function(array) {
8941
- return apply(func, this, array);
8942
- };
9103
+ start = start === undefined ? 0 : nativeMax(toInteger(start), 0);
9104
+ return rest(function(args) {
9105
+ var array = args[start],
9106
+ otherArgs = args.slice(0, start);
9107
+
9108
+ if (array) {
9109
+ arrayPush(otherArgs, array);
9110
+ }
9111
+ return apply(func, this, otherArgs);
9112
+ });
8943
9113
  }
8944
9114
 
8945
9115
  /**
@@ -8953,7 +9123,7 @@
8953
9123
  * result of the last `func` invocation.
8954
9124
  *
8955
9125
  * **Note:** If `leading` and `trailing` options are `true`, `func` is invoked
8956
- * on the trailing edge of the timeout only if the the throttled function is
9126
+ * on the trailing edge of the timeout only if the throttled function is
8957
9127
  * invoked more than once during the `wait` timeout.
8958
9128
  *
8959
9129
  * See [David Corbacho's article](http://drupalmotion.com/article/debounce-and-throttle-visual-explanation)
@@ -8972,14 +9142,14 @@
8972
9142
  * @returns {Function} Returns the new throttled function.
8973
9143
  * @example
8974
9144
  *
8975
- * // avoid excessively updating the position while scrolling
9145
+ * // Avoid excessively updating the position while scrolling.
8976
9146
  * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
8977
9147
  *
8978
- * // invoke `renewToken` when the click event is fired, but not more than once every 5 minutes
9148
+ * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
8979
9149
  * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
8980
9150
  * jQuery(element).on('click', throttled);
8981
9151
  *
8982
- * // cancel a trailing throttled invocation
9152
+ * // Cancel the trailing throttled invocation.
8983
9153
  * jQuery(window).on('popstate', throttled.cancel);
8984
9154
  */
8985
9155
  function throttle(func, wait, options) {
@@ -9074,7 +9244,7 @@
9074
9244
  * This method is like `_.clone` except that it accepts `customizer` which
9075
9245
  * is invoked to produce the cloned value. If `customizer` returns `undefined`
9076
9246
  * cloning is handled by the method instead. The `customizer` is invoked with
9077
- * up to five arguments; (value [, index|key, object, stack]).
9247
+ * up to four arguments; (value [, index|key, object, stack]).
9078
9248
  *
9079
9249
  * @static
9080
9250
  * @memberOf _
@@ -9090,7 +9260,7 @@
9090
9260
  * }
9091
9261
  * }
9092
9262
  *
9093
- * var el = _.clone(document.body, customizer);
9263
+ * var el = _.cloneWith(document.body, customizer);
9094
9264
  *
9095
9265
  * console.log(el === document.body);
9096
9266
  * // => false
@@ -9140,7 +9310,7 @@
9140
9310
  * }
9141
9311
  * }
9142
9312
  *
9143
- * var el = _.cloneDeep(document.body, customizer);
9313
+ * var el = _.cloneDeepWith(document.body, customizer);
9144
9314
  *
9145
9315
  * console.log(el === document.body);
9146
9316
  * // => false
@@ -9282,6 +9452,27 @@
9282
9452
  */
9283
9453
  var isArray = Array.isArray;
9284
9454
 
9455
+ /**
9456
+ * Checks if `value` is classified as an `ArrayBuffer` object.
9457
+ *
9458
+ * @static
9459
+ * @memberOf _
9460
+ * @type Function
9461
+ * @category Lang
9462
+ * @param {*} value The value to check.
9463
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9464
+ * @example
9465
+ *
9466
+ * _.isArrayBuffer(new ArrayBuffer(2));
9467
+ * // => true
9468
+ *
9469
+ * _.isArrayBuffer(new Array(2));
9470
+ * // => false
9471
+ */
9472
+ function isArrayBuffer(value) {
9473
+ return isObjectLike(value) && objectToString.call(value) == arrayBufferTag;
9474
+ }
9475
+
9285
9476
  /**
9286
9477
  * Checks if `value` is array-like. A value is considered array-like if it's
9287
9478
  * not a function and has a `value.length` that's an integer greater than or
@@ -9361,6 +9552,26 @@
9361
9552
  (isObjectLike(value) && objectToString.call(value) == boolTag);
9362
9553
  }
9363
9554
 
9555
+ /**
9556
+ * Checks if `value` is a buffer.
9557
+ *
9558
+ * @static
9559
+ * @memberOf _
9560
+ * @category Lang
9561
+ * @param {*} value The value to check.
9562
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
9563
+ * @example
9564
+ *
9565
+ * _.isBuffer(new Buffer(2));
9566
+ * // => true
9567
+ *
9568
+ * _.isBuffer(new Uint8Array(2));
9569
+ * // => false
9570
+ */
9571
+ var isBuffer = !Buffer ? constant(false) : function(value) {
9572
+ return value instanceof Buffer;
9573
+ };
9574
+
9364
9575
  /**
9365
9576
  * Checks if `value` is classified as a `Date` object.
9366
9577
  *
@@ -9429,9 +9640,16 @@
9429
9640
  * // => false
9430
9641
  */
9431
9642
  function isEmpty(value) {
9432
- return (!isObjectLike(value) || isFunction(value.splice))
9433
- ? !size(value)
9434
- : !keys(value).length;
9643
+ if (isArrayLike(value) &&
9644
+ (isArray(value) || isString(value) || isFunction(value.splice) || isArguments(value))) {
9645
+ return !value.length;
9646
+ }
9647
+ for (var key in value) {
9648
+ if (hasOwnProperty.call(value, key)) {
9649
+ return false;
9650
+ }
9651
+ }
9652
+ return true;
9435
9653
  }
9436
9654
 
9437
9655
  /**
@@ -9468,7 +9686,7 @@
9468
9686
  /**
9469
9687
  * This method is like `_.isEqual` except that it accepts `customizer` which is
9470
9688
  * invoked to compare values. If `customizer` returns `undefined` comparisons are
9471
- * handled by the method instead. The `customizer` is invoked with up to seven arguments:
9689
+ * handled by the method instead. The `customizer` is invoked with up to six arguments:
9472
9690
  * (objValue, othValue [, index|key, object, other, stack]).
9473
9691
  *
9474
9692
  * @static
@@ -9656,8 +9874,6 @@
9656
9874
  * // => false
9657
9875
  */
9658
9876
  function isObject(value) {
9659
- // Avoid a V8 JIT bug in Chrome 19-20.
9660
- // See https://code.google.com/p/v8/issues/detail?id=2291 for more details.
9661
9877
  var type = typeof value;
9662
9878
  return !!value && (type == 'object' || type == 'function');
9663
9879
  }
@@ -9689,6 +9905,26 @@
9689
9905
  return !!value && typeof value == 'object';
9690
9906
  }
9691
9907
 
9908
+ /**
9909
+ * Checks if `value` is classified as a `Map` object.
9910
+ *
9911
+ * @static
9912
+ * @memberOf _
9913
+ * @category Lang
9914
+ * @param {*} value The value to check.
9915
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
9916
+ * @example
9917
+ *
9918
+ * _.isMap(new Map);
9919
+ * // => true
9920
+ *
9921
+ * _.isMap(new WeakMap);
9922
+ * // => false
9923
+ */
9924
+ function isMap(value) {
9925
+ return isObjectLike(value) && getTag(value) == mapTag;
9926
+ }
9927
+
9692
9928
  /**
9693
9929
  * Performs a deep comparison between `object` and `source` to determine if
9694
9930
  * `object` contains equivalent property values.
@@ -9718,7 +9954,7 @@
9718
9954
  /**
9719
9955
  * This method is like `_.isMatch` except that it accepts `customizer` which
9720
9956
  * is invoked to compare values. If `customizer` returns `undefined` comparisons
9721
- * are handled by the method instead. The `customizer` is invoked with three
9957
+ * are handled by the method instead. The `customizer` is invoked with five
9722
9958
  * arguments: (objValue, srcValue, index|key, object, source).
9723
9959
  *
9724
9960
  * @static
@@ -9974,6 +10210,26 @@
9974
10210
  return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
9975
10211
  }
9976
10212
 
10213
+ /**
10214
+ * Checks if `value` is classified as a `Set` object.
10215
+ *
10216
+ * @static
10217
+ * @memberOf _
10218
+ * @category Lang
10219
+ * @param {*} value The value to check.
10220
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10221
+ * @example
10222
+ *
10223
+ * _.isSet(new Set);
10224
+ * // => true
10225
+ *
10226
+ * _.isSet(new WeakSet);
10227
+ * // => false
10228
+ */
10229
+ function isSet(value) {
10230
+ return isObjectLike(value) && getTag(value) == setTag;
10231
+ }
10232
+
9977
10233
  /**
9978
10234
  * Checks if `value` is classified as a `String` primitive or object.
9979
10235
  *
@@ -10056,6 +10312,46 @@
10056
10312
  return value === undefined;
10057
10313
  }
10058
10314
 
10315
+ /**
10316
+ * Checks if `value` is classified as a `WeakMap` object.
10317
+ *
10318
+ * @static
10319
+ * @memberOf _
10320
+ * @category Lang
10321
+ * @param {*} value The value to check.
10322
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10323
+ * @example
10324
+ *
10325
+ * _.isWeakMap(new WeakMap);
10326
+ * // => true
10327
+ *
10328
+ * _.isWeakMap(new Map);
10329
+ * // => false
10330
+ */
10331
+ function isWeakMap(value) {
10332
+ return isObjectLike(value) && getTag(value) == weakMapTag;
10333
+ }
10334
+
10335
+ /**
10336
+ * Checks if `value` is classified as a `WeakSet` object.
10337
+ *
10338
+ * @static
10339
+ * @memberOf _
10340
+ * @category Lang
10341
+ * @param {*} value The value to check.
10342
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
10343
+ * @example
10344
+ *
10345
+ * _.isWeakSet(new WeakSet);
10346
+ * // => true
10347
+ *
10348
+ * _.isWeakSet(new Set);
10349
+ * // => false
10350
+ */
10351
+ function isWeakSet(value) {
10352
+ return isObjectLike(value) && objectToString.call(value) == weakSetTag;
10353
+ }
10354
+
10059
10355
  /**
10060
10356
  * Checks if `value` is less than `other`.
10061
10357
  *
@@ -10189,7 +10485,7 @@
10189
10485
  * @memberOf _
10190
10486
  * @category Lang
10191
10487
  * @param {*} value The value to convert.
10192
- * @return {number} Returns the converted integer.
10488
+ * @returns {number} Returns the converted integer.
10193
10489
  * @example
10194
10490
  *
10195
10491
  * _.toLength(3);
@@ -10328,7 +10624,7 @@
10328
10624
  return '';
10329
10625
  }
10330
10626
  if (isSymbol(value)) {
10331
- return _Symbol ? symbolToString.call(value) : '';
10627
+ return Symbol ? symbolToString.call(value) : '';
10332
10628
  }
10333
10629
  var result = (value + '');
10334
10630
  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
@@ -10430,7 +10726,7 @@
10430
10726
  * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
10431
10727
  * // => { 'a': 1, 'b': 2 }
10432
10728
  */
10433
- var assignInWith = createAssigner(function(object, source, customizer) {
10729
+ var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
10434
10730
  copyObjectWith(source, keysIn(source), object, customizer);
10435
10731
  });
10436
10732
 
@@ -10460,7 +10756,7 @@
10460
10756
  * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });
10461
10757
  * // => { 'a': 1, 'b': 2 }
10462
10758
  */
10463
- var assignWith = createAssigner(function(object, source, customizer) {
10759
+ var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
10464
10760
  copyObjectWith(source, keys(source), object, customizer);
10465
10761
  });
10466
10762
 
@@ -10490,7 +10786,7 @@
10490
10786
 
10491
10787
  /**
10492
10788
  * Creates an object that inherits from the `prototype` object. If a `properties`
10493
- * object is provided its own enumerable properties are assigned to the created object.
10789
+ * object is given its own enumerable properties are assigned to the created object.
10494
10790
  *
10495
10791
  * @static
10496
10792
  * @memberOf _
@@ -10593,15 +10889,15 @@
10593
10889
  * _.findKey(users, function(o) { return o.age < 40; });
10594
10890
  * // => 'barney' (iteration order is not guaranteed)
10595
10891
  *
10596
- * // using the `_.matches` iteratee shorthand
10892
+ * // The `_.matches` iteratee shorthand.
10597
10893
  * _.findKey(users, { 'age': 1, 'active': true });
10598
10894
  * // => 'pebbles'
10599
10895
  *
10600
- * // using the `_.matchesProperty` iteratee shorthand
10896
+ * // The `_.matchesProperty` iteratee shorthand.
10601
10897
  * _.findKey(users, ['active', false]);
10602
10898
  * // => 'fred'
10603
10899
  *
10604
- * // using the `_.property` iteratee shorthand
10900
+ * // The `_.property` iteratee shorthand.
10605
10901
  * _.findKey(users, 'active');
10606
10902
  * // => 'barney'
10607
10903
  */
@@ -10630,15 +10926,15 @@
10630
10926
  * _.findLastKey(users, function(o) { return o.age < 40; });
10631
10927
  * // => returns 'pebbles' assuming `_.findKey` returns 'barney'
10632
10928
  *
10633
- * // using the `_.matches` iteratee shorthand
10929
+ * // The `_.matches` iteratee shorthand.
10634
10930
  * _.findLastKey(users, { 'age': 36, 'active': true });
10635
10931
  * // => 'barney'
10636
10932
  *
10637
- * // using the `_.matchesProperty` iteratee shorthand
10933
+ * // The `_.matchesProperty` iteratee shorthand.
10638
10934
  * _.findLastKey(users, ['active', false]);
10639
10935
  * // => 'fred'
10640
10936
  *
10641
- * // using the `_.property` iteratee shorthand
10937
+ * // The `_.property` iteratee shorthand.
10642
10938
  * _.findLastKey(users, 'active');
10643
10939
  * // => 'pebbles'
10644
10940
  */
@@ -10903,14 +11199,12 @@
10903
11199
  /**
10904
11200
  * Creates an object composed of the inverted keys and values of `object`.
10905
11201
  * If `object` contains duplicate values, subsequent values overwrite property
10906
- * assignments of previous values unless `multiVal` is `true`.
11202
+ * assignments of previous values.
10907
11203
  *
10908
11204
  * @static
10909
11205
  * @memberOf _
10910
11206
  * @category Object
10911
11207
  * @param {Object} object The object to invert.
10912
- * @param {boolean} [multiVal] Allow multiple values per key.
10913
- * @param- {Object} [guard] Enables use as an iteratee for functions like `_.map`.
10914
11208
  * @returns {Object} Returns the new inverted object.
10915
11209
  * @example
10916
11210
  *
@@ -10918,27 +11212,43 @@
10918
11212
  *
10919
11213
  * _.invert(object);
10920
11214
  * // => { '1': 'c', '2': 'b' }
11215
+ */
11216
+ var invert = createInverter(function(result, value, key) {
11217
+ result[value] = key;
11218
+ }, constant(identity));
11219
+
11220
+ /**
11221
+ * This method is like `_.invert` except that the inverted object is generated
11222
+ * from the results of running each element of `object` through `iteratee`.
11223
+ * The corresponding inverted value of each inverted key is an array of keys
11224
+ * responsible for generating the inverted value. The iteratee is invoked
11225
+ * with one argument: (value).
11226
+ *
11227
+ * @static
11228
+ * @memberOf _
11229
+ * @category Object
11230
+ * @param {Object} object The object to invert.
11231
+ * @param {Function|Object|string} [iteratee=_.identity] The iteratee invoked per element.
11232
+ * @returns {Object} Returns the new inverted object.
11233
+ * @example
11234
+ *
11235
+ * var object = { 'a': 1, 'b': 2, 'c': 1 };
10921
11236
  *
10922
- * // with `multiVal`
10923
- * _.invert(object, true);
11237
+ * _.invertBy(object);
10924
11238
  * // => { '1': ['a', 'c'], '2': ['b'] }
11239
+ *
11240
+ * _.invertBy(object, function(value) {
11241
+ * return 'group' + value;
11242
+ * });
11243
+ * // => { 'group1': ['a', 'c'], 'group2': ['b'] }
10925
11244
  */
10926
- function invert(object, multiVal, guard) {
10927
- return arrayReduce(keys(object), function(result, key) {
10928
- var value = object[key];
10929
- if (multiVal && !guard) {
10930
- if (hasOwnProperty.call(result, value)) {
10931
- result[value].push(key);
10932
- } else {
10933
- result[value] = [key];
10934
- }
10935
- }
10936
- else {
10937
- result[value] = key;
10938
- }
10939
- return result;
10940
- }, {});
10941
- }
11245
+ var invertBy = createInverter(function(result, value, key) {
11246
+ if (hasOwnProperty.call(result, value)) {
11247
+ result[value].push(key);
11248
+ } else {
11249
+ result[value] = [key];
11250
+ }
11251
+ }, getIteratee);
10942
11252
 
10943
11253
  /**
10944
11254
  * Invokes the method at `path` of `object`.
@@ -11097,7 +11407,7 @@
11097
11407
  * _.mapValues(users, function(o) { return o.age; });
11098
11408
  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
11099
11409
  *
11100
- * // using the `_.property` iteratee shorthand
11410
+ * // The `_.property` iteratee shorthand.
11101
11411
  * _.mapValues(users, 'age');
11102
11412
  * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
11103
11413
  */
@@ -11140,8 +11450,8 @@
11140
11450
  * _.merge(users, ages);
11141
11451
  * // => { 'data': [{ 'user': 'barney', 'age': 36 }, { 'user': 'fred', 'age': 40 }] }
11142
11452
  */
11143
- var merge = createAssigner(function(object, source) {
11144
- baseMerge(object, source);
11453
+ var merge = createAssigner(function(object, source, srcIndex) {
11454
+ baseMerge(object, source, srcIndex);
11145
11455
  });
11146
11456
 
11147
11457
  /**
@@ -11151,6 +11461,8 @@
11151
11461
  * method instead. The `customizer` is invoked with seven arguments:
11152
11462
  * (objValue, srcValue, key, object, source, stack).
11153
11463
  *
11464
+ * **Note:** This method mutates `object`.
11465
+ *
11154
11466
  * @static
11155
11467
  * @memberOf _
11156
11468
  * @category Object
@@ -11179,8 +11491,8 @@
11179
11491
  * _.mergeWith(object, other, customizer);
11180
11492
  * // => { 'fruits': ['apple', 'banana'], 'vegetables': ['beet', 'carrot'] }
11181
11493
  */
11182
- var mergeWith = createAssigner(function(object, source, customizer) {
11183
- baseMerge(object, source, customizer);
11494
+ var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
11495
+ baseMerge(object, source, srcIndex, customizer);
11184
11496
  });
11185
11497
 
11186
11498
  /**
@@ -11228,9 +11540,9 @@
11228
11540
  * // => { 'b': '2' }
11229
11541
  */
11230
11542
  function omitBy(object, predicate) {
11231
- predicate = getIteratee(predicate);
11232
- return basePickBy(object, function(value) {
11233
- return !predicate(value);
11543
+ predicate = getIteratee(predicate, 2);
11544
+ return basePickBy(object, function(value, key) {
11545
+ return !predicate(value, key);
11234
11546
  });
11235
11547
  }
11236
11548
 
@@ -11257,7 +11569,7 @@
11257
11569
 
11258
11570
  /**
11259
11571
  * Creates an object composed of the `object` properties `predicate` returns
11260
- * truthy for. The predicate is invoked with one argument: (value).
11572
+ * truthy for. The predicate is invoked with two arguments: (value, key).
11261
11573
  *
11262
11574
  * @static
11263
11575
  * @memberOf _
@@ -11273,7 +11585,7 @@
11273
11585
  * // => { 'a': 1, 'c': 3 }
11274
11586
  */
11275
11587
  function pickBy(object, predicate) {
11276
- return object == null ? {} : basePickBy(object, getIteratee(predicate));
11588
+ return object == null ? {} : basePickBy(object, getIteratee(predicate, 2));
11277
11589
  }
11278
11590
 
11279
11591
  /**
@@ -11324,6 +11636,8 @@
11324
11636
  * are created for all other missing properties. Use `_.setWith` to customize
11325
11637
  * `path` creation.
11326
11638
  *
11639
+ * **Note:** This method mutates `object`.
11640
+ *
11327
11641
  * @static
11328
11642
  * @memberOf _
11329
11643
  * @category Object
@@ -11353,6 +11667,8 @@
11353
11667
  * path creation is handled by the method instead. The `customizer` is invoked
11354
11668
  * with three arguments: (nsValue, key, nsObject).
11355
11669
  *
11670
+ * **Note:** This method mutates `object`.
11671
+ *
11356
11672
  * @static
11357
11673
  * @memberOf _
11358
11674
  * @category Object
@@ -11439,12 +11755,12 @@
11439
11755
  * _.transform([2, 3, 4], function(result, n) {
11440
11756
  * result.push(n *= n);
11441
11757
  * return n % 2 == 0;
11442
- * });
11758
+ * }, []);
11443
11759
  * // => [4, 9]
11444
11760
  *
11445
11761
  * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
11446
11762
  * (result[value] || (result[value] = [])).push(key);
11447
- * });
11763
+ * }, {});
11448
11764
  * // => { '1': ['a', 'c'], '2': ['b'] }
11449
11765
  */
11450
11766
  function transform(object, iteratee, accumulator) {
@@ -11472,6 +11788,8 @@
11472
11788
  /**
11473
11789
  * Removes the property at `path` of `object`.
11474
11790
  *
11791
+ * **Note:** This method mutates `object`.
11792
+ *
11475
11793
  * @static
11476
11794
  * @memberOf _
11477
11795
  * @category Object
@@ -12040,7 +12358,7 @@
12040
12358
  * `undefined` or `0`, a `radix` of `10` is used unless `value` is a hexadecimal,
12041
12359
  * in which case a `radix` of `16` is used.
12042
12360
  *
12043
- * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#E)
12361
+ * **Note:** This method aligns with the [ES5 implementation](https://es5.github.io/#x15.1.2.2)
12044
12362
  * of `parseInt`.
12045
12363
  *
12046
12364
  * @static
@@ -12234,7 +12552,7 @@
12234
12552
  * in "interpolate" delimiters, HTML-escape interpolated data properties in
12235
12553
  * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data
12236
12554
  * properties may be accessed as free variables in the template. If a setting
12237
- * object is provided it takes precedence over `_.templateSettings` values.
12555
+ * object is given it takes precedence over `_.templateSettings` values.
12238
12556
  *
12239
12557
  * **Note:** In the development build `_.template` utilizes
12240
12558
  * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)
@@ -12261,54 +12579,54 @@
12261
12579
  * @returns {Function} Returns the compiled template function.
12262
12580
  * @example
12263
12581
  *
12264
- * // using the "interpolate" delimiter to create a compiled template
12582
+ * // Use the "interpolate" delimiter to create a compiled template.
12265
12583
  * var compiled = _.template('hello <%= user %>!');
12266
12584
  * compiled({ 'user': 'fred' });
12267
12585
  * // => 'hello fred!'
12268
12586
  *
12269
- * // using the HTML "escape" delimiter to escape data property values
12587
+ * // Use the HTML "escape" delimiter to escape data property values.
12270
12588
  * var compiled = _.template('<b><%- value %></b>');
12271
12589
  * compiled({ 'value': '<script>' });
12272
12590
  * // => '<b>&lt;script&gt;</b>'
12273
12591
  *
12274
- * // using the "evaluate" delimiter to execute JavaScript and generate HTML
12592
+ * // Use the "evaluate" delimiter to execute JavaScript and generate HTML.
12275
12593
  * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');
12276
12594
  * compiled({ 'users': ['fred', 'barney'] });
12277
12595
  * // => '<li>fred</li><li>barney</li>'
12278
12596
  *
12279
- * // using the internal `print` function in "evaluate" delimiters
12597
+ * // Use the internal `print` function in "evaluate" delimiters.
12280
12598
  * var compiled = _.template('<% print("hello " + user); %>!');
12281
12599
  * compiled({ 'user': 'barney' });
12282
12600
  * // => 'hello barney!'
12283
12601
  *
12284
- * // using the ES delimiter as an alternative to the default "interpolate" delimiter
12602
+ * // Use the ES delimiter as an alternative to the default "interpolate" delimiter.
12285
12603
  * var compiled = _.template('hello ${ user }!');
12286
12604
  * compiled({ 'user': 'pebbles' });
12287
12605
  * // => 'hello pebbles!'
12288
12606
  *
12289
- * // using custom template delimiters
12607
+ * // Use custom template delimiters.
12290
12608
  * _.templateSettings.interpolate = /{{([\s\S]+?)}}/g;
12291
12609
  * var compiled = _.template('hello {{ user }}!');
12292
12610
  * compiled({ 'user': 'mustache' });
12293
12611
  * // => 'hello mustache!'
12294
12612
  *
12295
- * // using backslashes to treat delimiters as plain text
12613
+ * // Use backslashes to treat delimiters as plain text.
12296
12614
  * var compiled = _.template('<%= "\\<%- value %\\>" %>');
12297
12615
  * compiled({ 'value': 'ignored' });
12298
12616
  * // => '<%- value %>'
12299
12617
  *
12300
- * // using the `imports` option to import `jQuery` as `jq`
12618
+ * // Use the `imports` option to import `jQuery` as `jq`.
12301
12619
  * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';
12302
12620
  * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });
12303
12621
  * compiled({ 'users': ['fred', 'barney'] });
12304
12622
  * // => '<li>fred</li><li>barney</li>'
12305
12623
  *
12306
- * // using the `sourceURL` option to specify a custom sourceURL for the template
12624
+ * // Use the `sourceURL` option to specify a custom sourceURL for the template.
12307
12625
  * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });
12308
12626
  * compiled(data);
12309
12627
  * // => find the source of "greeting.jst" under the Sources tab or Resources panel of the web inspector
12310
12628
  *
12311
- * // using the `variable` option to ensure a with-statement isn't used in the compiled template
12629
+ * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.
12312
12630
  * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });
12313
12631
  * compiled.source;
12314
12632
  * // => function(data) {
@@ -12317,8 +12635,8 @@
12317
12635
  * // return __p;
12318
12636
  * // }
12319
12637
  *
12320
- * // using the `source` property to inline compiled templates for meaningful
12321
- * // line numbers in error messages and a stack trace
12638
+ * // Use the `source` property to inline compiled templates for meaningful
12639
+ * // line numbers in error messages and stack traces.
12322
12640
  * fs.writeFileSync(path.join(cwd, 'jst.js'), '\
12323
12641
  * var JST = {\
12324
12642
  * "main": ' + _.template(mainText).source + '\
@@ -12765,7 +13083,7 @@
12765
13083
  * @returns {*} Returns the `func` result or error object.
12766
13084
  * @example
12767
13085
  *
12768
- * // avoid throwing errors for invalid selectors
13086
+ * // Avoid throwing errors for invalid selectors.
12769
13087
  * var elements = _.attempt(function(selector) {
12770
13088
  * return document.querySelectorAll(selector);
12771
13089
  * }, '>_>');
@@ -12778,7 +13096,7 @@
12778
13096
  try {
12779
13097
  return apply(func, undefined, args);
12780
13098
  } catch (e) {
12781
- return isError(e) ? e : new Error(e);
13099
+ return isObject(e) ? e : new Error(e);
12782
13100
  }
12783
13101
  });
12784
13102
 
@@ -12832,7 +13150,7 @@
12832
13150
  * [_.matches({ 'a': 1 }), _.constant('matches A')],
12833
13151
  * [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],
12834
13152
  * [_.constant(true), _.constant('no match')]
12835
- * ])
13153
+ * ]);
12836
13154
  *
12837
13155
  * func({ 'a': 1, 'b': 2 });
12838
13156
  * // => 'matches A'
@@ -12912,9 +13230,9 @@
12912
13230
  }
12913
13231
 
12914
13232
  /**
12915
- * Creates a function that returns the result of invoking the provided
12916
- * functions with the `this` binding of the created function, where each
12917
- * successive invocation is supplied the return value of the previous.
13233
+ * Creates a function that returns the result of invoking the given functions
13234
+ * with the `this` binding of the created function, where each successive
13235
+ * invocation is supplied the return value of the previous.
12918
13236
  *
12919
13237
  * @static
12920
13238
  * @memberOf _
@@ -12935,7 +13253,7 @@
12935
13253
 
12936
13254
  /**
12937
13255
  * This method is like `_.flow` except that it creates a function that
12938
- * invokes the provided functions from right to left.
13256
+ * invokes the given functions from right to left.
12939
13257
  *
12940
13258
  * @static
12941
13259
  * @memberOf _
@@ -12955,7 +13273,7 @@
12955
13273
  var flowRight = createFlow(true);
12956
13274
 
12957
13275
  /**
12958
- * This method returns the first argument provided to it.
13276
+ * This method returns the first argument given to it.
12959
13277
  *
12960
13278
  * @static
12961
13279
  * @memberOf _
@@ -12991,7 +13309,7 @@
12991
13309
  * { 'user': 'fred', 'age': 40 }
12992
13310
  * ];
12993
13311
  *
12994
- * // create custom iteratee shorthands
13312
+ * // Create custom iteratee shorthands.
12995
13313
  * _.iteratee = _.wrap(_.iteratee, function(callback, func) {
12996
13314
  * var p = /^(\S+)\s*([<>])\s*(\S+)$/.exec(func);
12997
13315
  * return !p ? callback(func) : function(object) {
@@ -13003,9 +13321,7 @@
13003
13321
  * // => [{ 'user': 'fred', 'age': 40 }]
13004
13322
  */
13005
13323
  function iteratee(func) {
13006
- return (isObjectLike(func) && !isArray(func))
13007
- ? matches(func)
13008
- : baseIteratee(func);
13324
+ return baseIteratee(typeof func == 'function' ? func : baseClone(func, true));
13009
13325
  }
13010
13326
 
13011
13327
  /**
@@ -13203,7 +13519,9 @@
13203
13519
  * var lodash = _.noConflict();
13204
13520
  */
13205
13521
  function noConflict() {
13206
- root._ = oldDash;
13522
+ if (root._ === this) {
13523
+ root._ = oldDash;
13524
+ }
13207
13525
  return this;
13208
13526
  }
13209
13527
 
@@ -13368,8 +13686,7 @@
13368
13686
  * Creates an array of numbers (positive and/or negative) progressing from
13369
13687
  * `start` up to, but not including, `end`. A step of `-1` is used if a negative
13370
13688
  * `start` is specified without an `end` or `step`. If `end` is not specified
13371
- * it's set to `start` with `start` then set to `0`. If `end` is less than
13372
- * `start` a zero-length range is created unless a negative `step` is specified.
13689
+ * it's set to `start` with `start` then set to `0`.
13373
13690
  *
13374
13691
  * **Note:** JavaScript follows the IEEE-754 standard for resolving
13375
13692
  * floating-point values which can produce unexpected results.
@@ -13508,7 +13825,7 @@
13508
13825
  }
13509
13826
 
13510
13827
  /**
13511
- * Generates a unique ID. If `prefix` is provided the ID is appended to it.
13828
+ * Generates a unique ID. If `prefix` is given the ID is appended to it.
13512
13829
  *
13513
13830
  * @static
13514
13831
  * @memberOf _
@@ -13546,6 +13863,9 @@
13546
13863
  */
13547
13864
  function add(augend, addend) {
13548
13865
  var result;
13866
+ if (augend === undefined && addend === undefined) {
13867
+ return 0;
13868
+ }
13549
13869
  if (augend !== undefined) {
13550
13870
  result = augend;
13551
13871
  }
@@ -13637,10 +13957,10 @@
13637
13957
  *
13638
13958
  * var objects = [{ 'n': 1 }, { 'n': 2 }];
13639
13959
  *
13640
- * _.maxBy(objects, function(o) { return o.a; });
13960
+ * _.maxBy(objects, function(o) { return o.n; });
13641
13961
  * // => { 'n': 2 }
13642
13962
  *
13643
- * // using the `_.property` iteratee shorthand
13963
+ * // The `_.property` iteratee shorthand.
13644
13964
  * _.maxBy(objects, 'n');
13645
13965
  * // => { 'n': 2 }
13646
13966
  */
@@ -13705,10 +14025,10 @@
13705
14025
  *
13706
14026
  * var objects = [{ 'n': 1 }, { 'n': 2 }];
13707
14027
  *
13708
- * _.minBy(objects, function(o) { return o.a; });
14028
+ * _.minBy(objects, function(o) { return o.n; });
13709
14029
  * // => { 'n': 1 }
13710
14030
  *
13711
- * // using the `_.property` iteratee shorthand
14031
+ * // The `_.property` iteratee shorthand.
13712
14032
  * _.minBy(objects, 'n');
13713
14033
  * // => { 'n': 1 }
13714
14034
  */
@@ -13756,6 +14076,9 @@
13756
14076
  */
13757
14077
  function subtract(minuend, subtrahend) {
13758
14078
  var result;
14079
+ if (minuend === undefined && subtrahend === undefined) {
14080
+ return 0;
14081
+ }
13759
14082
  if (minuend !== undefined) {
13760
14083
  result = minuend;
13761
14084
  }
@@ -13781,7 +14104,7 @@
13781
14104
  function sum(array) {
13782
14105
  return (array && array.length)
13783
14106
  ? baseSum(array, identity)
13784
- : undefined;
14107
+ : 0;
13785
14108
  }
13786
14109
 
13787
14110
  /**
@@ -13802,14 +14125,14 @@
13802
14125
  * _.sumBy(objects, function(o) { return o.n; });
13803
14126
  * // => 20
13804
14127
  *
13805
- * // using the `_.property` iteratee shorthand
14128
+ * // The `_.property` iteratee shorthand.
13806
14129
  * _.sumBy(objects, 'n');
13807
14130
  * // => 20
13808
14131
  */
13809
14132
  function sumBy(array, iteratee) {
13810
14133
  return (array && array.length)
13811
14134
  ? baseSum(array, getIteratee(iteratee))
13812
- : undefined;
14135
+ : 0;
13813
14136
  }
13814
14137
 
13815
14138
  /*------------------------------------------------------------------------*/
@@ -13898,6 +14221,7 @@
13898
14221
  lodash.intersectionBy = intersectionBy;
13899
14222
  lodash.intersectionWith = intersectionWith;
13900
14223
  lodash.invert = invert;
14224
+ lodash.invertBy = invertBy;
13901
14225
  lodash.invokeMap = invokeMap;
13902
14226
  lodash.iteratee = iteratee;
13903
14227
  lodash.keyBy = keyBy;
@@ -13986,11 +14310,10 @@
13986
14310
  lodash.xorWith = xorWith;
13987
14311
  lodash.zip = zip;
13988
14312
  lodash.zipObject = zipObject;
14313
+ lodash.zipObjectDeep = zipObjectDeep;
13989
14314
  lodash.zipWith = zipWith;
13990
14315
 
13991
14316
  // Add aliases.
13992
- lodash.each = forEach;
13993
- lodash.eachRight = forEachRight;
13994
14317
  lodash.extend = assignIn;
13995
14318
  lodash.extendWith = assignInWith;
13996
14319
 
@@ -14042,9 +14365,11 @@
14042
14365
  lodash.invoke = invoke;
14043
14366
  lodash.isArguments = isArguments;
14044
14367
  lodash.isArray = isArray;
14368
+ lodash.isArrayBuffer = isArrayBuffer;
14045
14369
  lodash.isArrayLike = isArrayLike;
14046
14370
  lodash.isArrayLikeObject = isArrayLikeObject;
14047
14371
  lodash.isBoolean = isBoolean;
14372
+ lodash.isBuffer = isBuffer;
14048
14373
  lodash.isDate = isDate;
14049
14374
  lodash.isElement = isElement;
14050
14375
  lodash.isEmpty = isEmpty;
@@ -14055,6 +14380,7 @@
14055
14380
  lodash.isFunction = isFunction;
14056
14381
  lodash.isInteger = isInteger;
14057
14382
  lodash.isLength = isLength;
14383
+ lodash.isMap = isMap;
14058
14384
  lodash.isMatch = isMatch;
14059
14385
  lodash.isMatchWith = isMatchWith;
14060
14386
  lodash.isNaN = isNaN;
@@ -14067,10 +14393,13 @@
14067
14393
  lodash.isPlainObject = isPlainObject;
14068
14394
  lodash.isRegExp = isRegExp;
14069
14395
  lodash.isSafeInteger = isSafeInteger;
14396
+ lodash.isSet = isSet;
14070
14397
  lodash.isString = isString;
14071
14398
  lodash.isSymbol = isSymbol;
14072
14399
  lodash.isTypedArray = isTypedArray;
14073
14400
  lodash.isUndefined = isUndefined;
14401
+ lodash.isWeakMap = isWeakMap;
14402
+ lodash.isWeakSet = isWeakSet;
14074
14403
  lodash.join = join;
14075
14404
  lodash.kebabCase = kebabCase;
14076
14405
  lodash.last = last;
@@ -14133,6 +14462,8 @@
14133
14462
  lodash.upperFirst = upperFirst;
14134
14463
 
14135
14464
  // Add aliases.
14465
+ lodash.each = forEach;
14466
+ lodash.eachRight = forEachRight;
14136
14467
  lodash.first = head;
14137
14468
 
14138
14469
  mixin(lodash, (function() {