From 383b1a5769f2f44d8aee24cbd782a15abfea468c Mon Sep 17 00:00:00 2001 From: John-David Dalton Date: Thu, 22 Nov 2012 23:53:16 -0600 Subject: [PATCH] Avoid Firefox's unoptimized `Function` constructor. Former-commit-id: 7cc5fc63c0cebd1410edde47c88e580c64fa2b98 --- build.js | 27 +++++++++++----- build/pre-compile.js | 7 ++++- lodash.js | 35 +++++++++++++++++++-- lodash.min.js | 74 ++++++++++++++++++++++---------------------- 4 files changed, 96 insertions(+), 47 deletions(-) diff --git a/build.js b/build.js index 0e210f0ef..ca7f0160e 100755 --- a/build.js +++ b/build.js @@ -329,7 +329,7 @@ precompiled = getFunctionSource(_.template(text, null, options)), prop = filename.replace(/\..*$/, ''); - source.push(" templates['" + prop.replace(/'/g, "\\'") + "'] = " + precompiled + ';', ''); + source.push(" templates['" + prop.replace(/['\n\r\t]/g, '\\$&') + "'] = " + precompiled + ';', ''); } }); @@ -637,6 +637,18 @@ return _.uniq(_.intersection(allMethods, methodNames)); } + /** + * Removes the `createFunction` function from `source`. + * + * @private + * @param {String} source The source to process. + * @returns {String} Returns the modified source. + */ + function removeCreateFunction(source) { + return removeFunction(source, 'createFunction') + .replace(/\n *try *{\s*createFunction[\s\S]+?catch[^}]+}\n/, ''); + } + /** * Removes the all references to `refName` from `createIterator` in `source`. * @@ -663,7 +675,7 @@ * @private * @param {String} source The source to process. * @param {String} funcName The name of the function to remove. - * @returns {String} Returns the source with the function removed. + * @returns {String} Returns the modified source. */ function removeFunction(source, funcName) { // remove function @@ -690,7 +702,7 @@ * * @private * @param {String} source The source to process. - * @returns {String} Returns the source with the `isArguments` fallback removed. + * @returns {String} Returns the modified source. */ function removeIsArgumentsFallback(source) { return source.replace(getIsArgumentsFallback(source), ''); @@ -701,7 +713,7 @@ * * @private * @param {String} source The source to process. - * @returns {String} Returns the source with the `isFunction` fallback removed. + * @returns {String} Returns the modified source. */ function removeIsFunctionFallback(source) { return source.replace(getIsFunctionFallback(source), ''); @@ -785,7 +797,7 @@ * @private * @param {String} source The source to process. * @param {String} varName The name of the variable to remove. - * @returns {String} Returns the source with the variable removed. + * @returns {String} Returns the modified source. */ function removeVar(source, varName) { // simplify `cloneableClasses` @@ -823,7 +835,7 @@ * @private * @param {String} source The source to inspect. * @param {String} varName The name of the function to replace. - * @returns {String} Returns the source with the function replaced. + * @returns {String} Returns the modified source. */ function replaceFunction(source, funcName, funcValue) { var match = matchFunction(source, funcName); @@ -843,7 +855,7 @@ * @private * @param {String} source The source to inspect. * @param {String} varName The name of the variable to replace. - * @returns {String} Returns the source with the variable replaced. + * @returns {String} Returns the modified source. */ function replaceVar(source, varName, varValue) { // replace a variable that's not part of a declaration list @@ -1710,6 +1722,7 @@ source = removeVar(source, 'extendIteratorOptions'); source = removeVar(source, 'iteratorTemplate'); source = removeVar(source, 'noCharByIndex'); + source = removeCreateFunction(source); source = removeNoArgsClass(source); source = removeNoNodeClass(source); } diff --git a/build/pre-compile.js b/build/pre-compile.js index 8c4e19bdb..bdef9f42c 100644 --- a/build/pre-compile.js +++ b/build/pre-compile.js @@ -246,6 +246,9 @@ // add newline to `+"__p+='"` in underscore.js `_.template` source = source.replace(/\+"__p\+='"/g, '+"\\n__p+=\'"'); + // add newline to `body + '}'` in `createFunction` + source = source.replace(/body *\+ *'}'/, 'body+"\\n}"'); + // remove whitespace from `_.template` related regexes source = source.replace(/(?:reEmptyString\w+|reInsertVariable) *=.+/g, function(match) { return match.replace(/ |\\n/g, ''); @@ -318,7 +321,9 @@ modified = snippet; // add brackets to whitelisted properties so the Closure Compiler won't mung them - modified = modified.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), "['$1']"); + modified = modified.replace(RegExp('\\.(' + iteratorOptions.join('|') + ')\\b', 'g'), function(match, prop) { + return "['" + prop.replace(/['\n\r\t]/g, '\\$&') + "']"; + }); if (isCreateIterator) { // replace with modified snippet early and clip snippet to the `factory` diff --git a/lodash.js b/lodash.js index 131fca1a0..60e3608c7 100644 --- a/lodash.js +++ b/lodash.js @@ -16,6 +16,9 @@ window = freeGlobal; } + /** Document shortcut used by `createFunction` */ + var document = window.document; + /** Used for array and object method references */ var arrayRef = [], // avoid a Closure Compiler bug by creatively creating an object @@ -171,7 +174,7 @@ * a string without a `toString` property value of `typeof` "function". */ try { - var noNodeClass = ({ 'toString': 0 } + '', toString.call(window.document || 0) == objectClass); + var noNodeClass = ({ 'toString': 0 } + '', toString.call(document || 0) == objectClass); } catch(e) { } /* Detect if `Function#bind` exists and is inferred to be fast (all but V8) */ @@ -298,6 +301,34 @@ /*--------------------------------------------------------------------------*/ + /** + * Creates a function from the given `args` and `body` strings. + * + * @private + * @param {String} args The comma separated function arguments. + * @param {String} body The function body. + * @returns {Function} The new function. + */ + var createFunction = function(args, body) { + var oldValue = window._, + script = document.createElement('script'), + sibling = document.getElementsByTagName('script')[0]; + + // use script injection to avoid Firefox's unoptimized `Function` constructor + // http://bugzil.la/804933 + script.text = 'var _=function(' + args + '){' + body + '}'; + sibling.parentNode.insertBefore(script, sibling).parentNode.removeChild(script); + var result = window._; + window._ = oldValue; + return result; + }; + + try { + createFunction(); + } catch(e) { + createFunction = Function; + } + /** * The template used to create iterator functions. * @@ -639,7 +670,7 @@ data.firstArg = /^[^,]+/.exec(args)[0]; // create the function factory - var factory = Function( + var factory = createFunction( 'createCallback, hasOwnProperty, isArguments, isString, objectTypes, ' + 'nativeKeys, propertyIsEnumerable', 'return function(' + args + ') {\n' + iteratorTemplate(data) + '\n}' diff --git a/lodash.min.js b/lodash.min.js index 2c2e40928..b9ab2640d 100644 --- a/lodash.min.js +++ b/lodash.min.js @@ -2,40 +2,40 @@ Lo-Dash 0.10.0 lodash.com/license Underscore.js 1.4.2 underscorejs.org/LICENSE */ -;(function(e,t){function s(e){if(e&&e.__wrapped__)return e;if(!(this instanceof s))return new s(e);this.__wrapped__=e}function o(e,t,n){t||(t=0);var r=e.length,i=r-t>=(n||et);if(i)for(var s={},n=t-1;++nn||e===t)return 1;if(ei;i++)r+="i='"+e.j[i]+"';if(","constructor"==e.j[i]&&(r+="!(f&&f.prototype===l)&&"),r+="h.call(l,i)){x=l[i];"+e.g+"}"}if(e.b||e.h)r+="}";return r+=e.c+";return t",Function("e,h,j,k,p,n,s","return function("+t+"){"+r+"}")(l,wt,m,N,Yt,At,St)}function h(e){return"\\"+ -Zt[e]}function p(e){return un[e]}function d(){}function v(e){return an[e]}function m(e){return Tt.call(e)==Dt}function g(e){var t=i;if(!e||"object"!=typeof e||m(e))return t;var n=e.constructor;return(!$t||"function"==typeof e.toString||"string"!=typeof (e+""))&&(!x(n)||n instanceof n)?Ut?(sn(e,function(e,n,r){return t=!wt.call(r,n),i}),t===i):(sn(e,function(e,n){t=n}),t===i||wt.call(e,t)):t}function y(e){var t=[];return on(e,function(e,n){t.push(n)}),t}function b(e,t,n,s,o){if(e==r)return e;n&&(t= -i);if(n=T(e)){var u=Tt.call(e);if(!Gt[u]||Xt&&m(e))return e;var a=u==Pt,n=a||(u==Ft?cn(e):n)}if(!n||!t)return n?a?xt.call(e):rn({},e):e;n=e.constructor;switch(u){case Ht:case Bt:return new n(+e);case jt:case qt:return new n(e);case It:return n(e.source,ut.exec(e))}s||(s=[]),o||(o=[]);for(u=s.length;u--;)if(s[u]==e)return o[u];var f=a?n(e.length):{};return s.push(e),o.push(f),(a?pn:on)(e,function(e,n){f[n]=b(e,t,r,s,o)}),f}function w(e){var t=[];return sn(e,function(e,n){x(e)&&t.push(n)}),t.sort() -}function E(e){var t={};return on(e,function(e,n){t[e]=n}),t}function S(e,t,s,o){if(e===t)return 0!==e||1/e==1/t;if(e==r||t==r)return e===t;var u=Tt.call(e);if(u!=Tt.call(t))return i;switch(u){case Ht:case Bt:return+e==+t;case jt:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case It:case qt:return e==t+""}var a=u==Pt||u==Dt;if(Xt&&!a&&(a=m(e))&&!m(t))return i;if(!a){if(e.__wrapped__||t.__wrapped__)return S(e.__wrapped__||e,t.__wrapped__||t);if(u!=Ft||$t&&("function"!=typeof e.toString&&"string"==typeof -(e+"")||"function"!=typeof t.toString&&"string"==typeof (t+"")))return i;var u=e.constructor,f=t.constructor;if(u!=f&&(!x(u)||!(u instanceof u&&x(f)&&f instanceof f)))return i}s||(s=[]),o||(o=[]);for(u=s.length;u--;)if(s[u]==e)return o[u]==t;var u=-1,f=n,l=0;s.push(e),o.push(t);if(a){l=e.length;if(f=l==t.length)for(;l--&&(f=S(e[l],t[l],s,o)););return f}for(var c in e)if(wt.call(e,c)&&(l++,!wt.call(t,c)||!S(e[c],t[c],s,o)))return i;for(c in t)if(wt.call(t,c)&&!(l--))return i;if(Rt)for(;7>++u;)if(c= -vt[u],wt.call(e,c)&&(!wt.call(t,c)||!S(e[c],t[c],s,o)))return i;return n}function x(e){return"function"==typeof e}function T(e){return e?Yt[typeof e]:i}function N(e){return Tt.call(e)==qt}function C(e,t,n){var i=arguments,s=0,o=2,u=i[3],a=i[4];n!==Z&&(u=[],a=[],"number"!=typeof n&&(o=i.length));for(;++sn?Ot(0,s+n):n)||0;return"number"==typeof s?o=-1<(N(e)?e.indexOf(t,n):q(e,t,n)):pn(e,function(e){if(++r>=n)return!(o=e===t)}),o}function A(e,t,r){var i=n,t=l(t,r);if(ln(e))for(var r=-1,s=e.length;++rr&&(r=n,o=e)});else for(;++io&&(o=e[i]);return o}function P(e,t){var n=[];return pn(e,function(e){n.push(e[t])}),n}function H(e,t,n,r){var s=3>arguments.length;return t||(t=X),pn(e,function(e,o,u){n=s?(s=i,e):t.call(r,n,e,o,u)}),n}function B(e,t,n,r){var s=e,o=e?e.length:0,u=3>arguments.length;if("number"!=typeof o)var a=hn(e),o=a.length;else Vt&&N(e)&&(s=e.split(""));return t||(t=X),pn(e,function(e,f,l){f=a?a[--o]:--o,n=u?(u=i,s[f]):t.call(r,n,s[f],f,l)}),n}function j(e,t,n){var r,t=l(t,n);if(ln(e))for(var n=-1,i=e.length -;++nn?Ot(0,i+n):n||0)-1;else if(n)return r=U(e,t),e[r]===t?r:-1;for(;++r>>1,n(e[r])q(a,h))(n||f)&&a.push(h),u.push(r)}return u}function W(e,t){return Kt||Nt&&2|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/,rt=/&(?:amp|lt|gt|quot|#x27);/g,it=/\b__p\+='';/g,st=/\b(__p\+=)''\+/g, -ot=/(__e\(.*?\)|\b__t\))\+'';/g,ut=/\w*$/,at=/(?:__e|__t=)\(\s*(?![\d\s"']|this\.)/g,ft=RegExp("^"+(G.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),lt=/\$\{((?:(?=\\?)\\?[\s\S])*?)}/g,ct=/<%=([\s\S]+?)%>/g,ht=/($^)/,pt=/[&<>"']/g,dt=/['\n\r\t\u2028\u2029\\]/g,vt="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),mt=Math.ceil,gt=Q.concat,yt=Math.floor,bt=ft.test(bt=Object.getPrototypeOf)&&bt, -wt=G.hasOwnProperty,Et=Q.push,St=G.propertyIsEnumerable,xt=Q.slice,Tt=G.toString,Nt=ft.test(Nt=xt.bind)&&Nt,Ct=ft.test(Ct=Array.isArray)&&Ct,kt=e.isFinite,Lt=e.isNaN,At=ft.test(At=Object.keys)&&At,Ot=Math.max,Mt=Math.min,_t=Math.random,Dt="[object Arguments]",Pt="[object Array]",Ht="[object Boolean]",Bt="[object Date]",jt="[object Number]",Ft="[object Object]",It="[object RegExp]",qt="[object String]",Rt,Ut,zt=(zt={0:1,length:1},Q.splice.call(zt,0,1),zt[0]),Wt=n;(function(){function e(){this.x=1} -var t=[];e.prototype={valueOf:1,y:1};for(var n in new e)t.push(n);for(n in arguments)Wt=!n;Rt=!/valueOf/.test(t),Ut="x"!=t[0]})(1);var Xt=!m(arguments),Vt="xx"!="x"[0]+Object("x")[0];try{var $t=("[object Object]",Tt.call(e.document||0)==Ft)}catch(Jt){}var Kt=Nt&&/\n|Opera/.test(Nt+Tt.call(e.opera)),Qt=At&&/^.+$|true/.test(At+!!e.attachEvent),Gt={};Gt[Dt]=Gt["[object Function]"]=i,Gt[Pt]=Gt[Ht]=Gt[Bt]=Gt[jt]=Gt[Ft]=Gt[It]=Gt[qt]=n;var Yt={"boolean":i,"function":n,object:n,number:i,string:i,"undefined" -:i},Zt={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};s.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:ct,variable:""};var en={a:"o,v,g",k:"for(var a=1,b=typeof g=='number'?2:arguments.length;a":">",'"':""","'":"'"},an=E(un),fn=c(en,{g:"if(t[i]==null)"+en.g}),ln=Ct||function(e){return Tt.call(e)==Pt};x(/x/)&&(x=function(e){return"[object Function]"==Tt.call(e)});var cn=bt?function(e){if(!e||"object"!=typeof e)return i;var t=e.valueOf,n="function"==typeof t&&(n=bt(t))&&bt(n);return n?e==n||bt(e)==n&&!m(e):g(e)}:g,hn=At?function(e){return"function"==typeof e&&St.call(e,"prototype")?y(e):T(e)?At(e):[]}:y,pn=c(tn);s.VERSION="0.10.0",s.assign= -rn,s.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply(this,arguments)}},s.bind=W,s.bindAll=function(e){for(var t=arguments,n=1q(i,e)){for(var s=n;--s;)if(!(r[s]||(r[s]=o(t[s])))(e))return;i.push(e)}}),i},s.invert=E,s.invoke=function(e,t){var n=xt.call(arguments,2),r="function"==typeof t,i=[];return pn(e,function(e){i.push((r?t:e[t]).apply(e,n))}),i},s.isArguments=m,s.isArray=ln,s.isBoolean=function(e -){return e===n||e===i||Tt.call(e)==Ht},s.isDate=function(e){return Tt.call(e)==Bt},s.isElement=function(e){return e?1===e.nodeType:i},s.isEmpty=function(e){var t=n;if(!e)return t;var r=Tt.call(e),s=e.length;return r==Pt||r==qt||r==Dt||Xt&&m(e)||r==Ft&&"number"==typeof s&&x(e.splice)?!s:(on(e,function(){return t=i}),t)},s.isEqual=S,s.isFinite=function(e){return kt(e)&&!Lt(parseFloat(e))},s.isFunction=x,s.isNaN=function(e){return Tt.call(e)==jt&&e!=+e},s.isNull=function(e){return e===r},s.isNumber= -function(e){return Tt.call(e)==jt},s.isObject=T,s.isPlainObject=cn,s.isRegExp=function(e){return Tt.call(e)==It},s.isString=N,s.isUndefined=function(e){return e===t},s.keys=hn,s.last=function(e,t,n){if(e){var i=e.length;return t==r||n?e[i-1]:xt.call(e,-t||i)}},s.lastIndexOf=function(e,t,n){var r=e?e.length:0;for("number"==typeof n&&(r=(0>n?Ot(0,r+n):Mt(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},s.map=_,s.max=D,s.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments): -arguments[0];return wt.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},s.merge=C,s.min=function(e,t,n){var r=Infinity,i=-1,s=e?e.length:0,o=r;if(t||!ln(e))t=!t&&N(e)?u:l(t,n),pn(e,function(e,n,i){n=t(e,n,i),nq(s,n,1))i[n]=e}),i},s.once=function(e){var t,s=i;return function(){return s?t:(s=n,t=e.apply(this,arguments),e=r,t)}},s.pairs=function(e){var t=[];return on(e,function(e,n){t.push([n,e])}),t},s.partial=function(e){return f(e,xt.call(arguments,1))},s.pick=function(e,t,n){var r={};if("function"!=typeof t)for(var i=0,s=gt.apply(Q,arguments),o=s.length;++i=f?(clearTimeout(u),a=r,s=e.apply(o,i)):u||(u=setTimeout -(n,f)),s}},s.times=function(e,t,n){for(var e=+e||0,r=-1,i=Array(e);++r=(n||nt);if(i)for(var s={},n=t-1;++nn||e===t)return 1;if(ei;i++)r+="i='"+e.j[i]+"';if(","constructor"==e.j[i]&&(r+="!(f&&f.prototype===l)&&" +),r+="h.call(l,i)){x=l[i];"+e.g+"}"}if(e.b||e.h)r+="}";return r+=e.c+";return t",s("e,h,j,k,p,n,s","return function("+t+"){"+r+"}")(c,St,g,C,en,Mt,Tt)}function p(e){return"\\"+tn[e]}function d(e){return ln[e]}function v(){}function m(e){return cn[e]}function g(e){return Ct.call(e)==Ht}function y(e){var t=i;if(!e||"object"!=typeof e||g(e))return t;var n=e.constructor;return(!Kt||"function"==typeof e.toString||"string"!=typeof (e+""))&&(!T(n)||n instanceof n)?Wt?(an(e,function(e,n,r){return t=!St.call +(r,n),i}),t===i):(an(e,function(e,n){t=n}),t===i||St.call(e,t)):t}function b(e){var t=[];return fn(e,function(e,n){t.push(n)}),t}function w(e,t,n,s,o){if(e==r)return e;n&&(t=i);if(n=N(e)){var u=Ct.call(e);if(!Zt[u]||$t&&g(e))return e;var a=u==Bt,n=a||(u==qt?dn(e):n)}if(!n||!t)return n?a?Nt.call(e):un({},e):e;n=e.constructor;switch(u){case jt:case Ft:return new n(+e);case It:case Ut:return new n(e);case Rt:return n(e.source,ft.exec(e))}s||(s=[]),o||(o=[]);for(u=s.length;u--;)if(s[u]==e)return o[u] +;var f=a?n(e.length):{};return s.push(e),o.push(f),(a?mn:fn)(e,function(e,n){f[n]=w(e,t,r,s,o)}),f}function E(e){var t=[];return an(e,function(e,n){T(e)&&t.push(n)}),t.sort()}function S(e){var t={};return fn(e,function(e,n){t[e]=n}),t}function x(e,t,s,o){if(e===t)return 0!==e||1/e==1/t;if(e==r||t==r)return e===t;var u=Ct.call(e);if(u!=Ct.call(t))return i;switch(u){case jt:case Ft:return+e==+t;case It:return e!=+e?t!=+t:0==e?1/e==1/t:e==+t;case Rt:case Ut:return e==t+""}var a=u==Bt||u==Ht;if($t&&! +a&&(a=g(e))&&!g(t))return i;if(!a){if(e.__wrapped__||t.__wrapped__)return x(e.__wrapped__||e,t.__wrapped__||t);if(u!=qt||Kt&&("function"!=typeof e.toString&&"string"==typeof (e+"")||"function"!=typeof t.toString&&"string"==typeof (t+"")))return i;var u=e.constructor,f=t.constructor;if(u!=f&&(!T(u)||!(u instanceof u&&T(f)&&f instanceof f)))return i}s||(s=[]),o||(o=[]);for(u=s.length;u--;)if(s[u]==e)return o[u]==t;var u=-1,f=n,l=0;s.push(e),o.push(t);if(a){l=e.length;if(f=l==t.length)for(;l--&&(f=x +(e[l],t[l],s,o)););return f}for(var c in e)if(St.call(e,c)&&(l++,!St.call(t,c)||!x(e[c],t[c],s,o)))return i;for(c in t)if(St.call(t,c)&&!(l--))return i;if(zt)for(;7>++u;)if(c=gt[u],St.call(e,c)&&(!St.call(t,c)||!x(e[c],t[c],s,o)))return i;return n}function T(e){return"function"==typeof e}function N(e){return e?en[typeof e]:i}function C(e){return Ct.call(e)==Ut}function k(e,t,n){var i=arguments,s=0,o=2,u=i[3],a=i[4];n!==tt&&(u=[],a=[],"number"!=typeof n&&(o=i.length));for(;++sn?_t(0,s+n):n)||0;return"number"==typeof s?o=-1<(C(e)?e.indexOf(t,n):R(e,t,n)):mn(e,function(e){if(++r>=n)return!(o=e===t)}),o}function O(e,t,r){var i=n,t=c(t,r);if(pn(e))for(var r=-1,s=e. +length;++rr&&(r=n,o=e)});else for(;++io&&(o=e[i]);return o}function H(e,t){var n=[];return mn(e,function(e){n.push(e[t])}),n}function B(e,t,n,r){var s=3>arguments.length;return t||(t=V),mn(e,function(e,o,u){n=s?(s=i,e):t.call(r,n,e,o,u)}),n}function j(e,t,n,r){var s=e,o=e?e.length:0,u=3>arguments.length;if("number"!=typeof o)var a=vn(e),o=a.length;else Jt&& +C(e)&&(s=e.split(""));return t||(t=V),mn(e,function(e,f,l){f=a?a[--o]:--o,n=u?(u=i,s[f]):t.call(r,n,s[f],f,l)}),n}function F(e,t,n){var r,t=c(t,n);if(pn(e))for(var n=-1,i=e.length;++nn?_t(0,i+n):n||0)-1;else if(n)return r=z(e,t),e[r]===t?r:-1;for(;++r>>1,n(e[r])R(a,h))(n||f)&&a.push(h),u.push(r)}return u}function X(e,t){return Gt||kt&&2|{(\/]|\[\D|\b(?:delete|in|instanceof|new|typeof|void)\b/,st=/&(?:amp|lt|gt|quot|#x27);/g,ot=/\b__p\+='';/g,ut=/\b(__p\+=)''\+/g,at=/(__e\(.*?\)|\b__t\))\+'';/g,ft=/\w*$/,lt=/(?:__e|__t=)\(\s*(?![\d\s"']|this\.)/g,ct=RegExp("^"+(Z.valueOf+"").replace(/[.*+?^=!:${}()|[\]\/\\]/g,"\\$&").replace(/valueOf|for [^\]]+/g,".+?")+"$"),ht=/\$\{((?:(?=\\?)\\?[\s\S])*?)}/g,pt=/<%=([\s\S]+?)%>/g,dt=/($^)/,vt=/[&<>"']/g,mt=/['\n\r\t\u2028\u2029\\]/g +,gt="constructor hasOwnProperty isPrototypeOf propertyIsEnumerable toLocaleString toString valueOf".split(" "),yt=Math.ceil,bt=Y.concat,wt=Math.floor,Et=ct.test(Et=Object.getPrototypeOf)&&Et,St=Z.hasOwnProperty,xt=Y.push,Tt=Z.propertyIsEnumerable,Nt=Y.slice,Ct=Z.toString,kt=ct.test(kt=Nt.bind)&&kt,Lt=ct.test(Lt=Array.isArray)&&Lt,At=e.isFinite,Ot=e.isNaN,Mt=ct.test(Mt=Object.keys)&&Mt,_t=Math.max,Dt=Math.min,Pt=Math.random,Ht="[object Arguments]",Bt="[object Array]",jt="[object Boolean]",Ft="[object Date]" +,It="[object Number]",qt="[object Object]",Rt="[object RegExp]",Ut="[object String]",zt,Wt,Xt=(Xt={0:1,length:1},Y.splice.call(Xt,0,1),Xt[0]),Vt=n;(function(){function e(){this.x=1}var t=[];e.prototype={valueOf:1,y:1};for(var n in new e)t.push(n);for(n in arguments)Vt=!n;zt=!/valueOf/.test(t),Wt="x"!=t[0]})(1);var $t=!g(arguments),Jt="xx"!="x"[0]+Object("x")[0];try{var Kt=("[object Object]",Ct.call(G||0)==qt)}catch(Qt){}var Gt=kt&&/\n|Opera/.test(kt+Ct.call(e.opera)),Yt=Mt&&/^.+$|true/.test(Mt+!! +e.attachEvent),Zt={};Zt[Ht]=Zt["[object Function]"]=i,Zt[Bt]=Zt[jt]=Zt[Ft]=Zt[It]=Zt[qt]=Zt[Rt]=Zt[Ut]=n;var en={"boolean":i,"function":n,object:n,number:i,string:i,"undefined":i},tn={"\\":"\\","'":"'","\n":"n","\r":"r"," ":"t","\u2028":"u2028","\u2029":"u2029"};o.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:pt,variable:""};try{s()}catch(nn){s=Function}var rn={a:"o,v,g",k:"for(var a=1,b=typeof g=='number'?2:arguments.length;a":">",'"':""","'":"'"},cn=S(ln),hn=h(rn,{g:"if(t[i]==null)"+rn.g}),pn=Lt||function(e){return Ct.call(e)==Bt};T(/x/)&&(T=function(e){return"[object Function]"==Ct.call(e)});var dn=Et?function(e){if(!e||"object"!=typeof e)return i;var t=e.valueOf,n="function"==typeof +t&&(n=Et(t))&&Et(n);return n?e==n||Et(e)==n&&!g(e):y(e)}:y,vn=Mt?function(e){return"function"==typeof e&&Tt.call(e,"prototype")?b(e):N(e)?Mt(e):[]}:b,mn=h(sn);o.VERSION="0.10.0",o.assign=un,o.after=function(e,t){return 1>e?t():function(){if(1>--e)return t.apply(this,arguments)}},o.bind=X,o.bindAll=function(e){for(var t=arguments,n=1R(i,e)){for(var s=n;--s;)if(!(r[s]||(r[s]=u(t[s])))(e))return;i.push(e)}}),i},o.invert=S,o.invoke= +function(e,t){var n=Nt.call(arguments,2),r="function"==typeof t,i=[];return mn(e,function(e){i.push((r?t:e[t]).apply(e,n))}),i},o.isArguments=g,o.isArray=pn,o.isBoolean=function(e){return e===n||e===i||Ct.call(e)==jt},o.isDate=function(e){return Ct.call(e)==Ft},o.isElement=function(e){return e?1===e.nodeType:i},o.isEmpty=function(e){var t=n;if(!e)return t;var r=Ct.call(e),s=e.length;return r==Bt||r==Ut||r==Ht||$t&&g(e)||r==qt&&"number"==typeof s&&T(e.splice)?!s:(fn(e,function(){return t=i}),t)},o +.isEqual=x,o.isFinite=function(e){return At(e)&&!Ot(parseFloat(e))},o.isFunction=T,o.isNaN=function(e){return Ct.call(e)==It&&e!=+e},o.isNull=function(e){return e===r},o.isNumber=function(e){return Ct.call(e)==It},o.isObject=N,o.isPlainObject=dn,o.isRegExp=function(e){return Ct.call(e)==Rt},o.isString=C,o.isUndefined=function(e){return e===t},o.keys=vn,o.last=function(e,t,n){if(e){var i=e.length;return t==r||n?e[i-1]:Nt.call(e,-t||i)}},o.lastIndexOf=function(e,t,n){var r=e?e.length:0;for("number"==typeof +n&&(r=(0>n?_t(0,r+n):Dt(n,r-1))+1);r--;)if(e[r]===t)return r;return-1},o.map=D,o.max=P,o.memoize=function(e,t){var n={};return function(){var r=t?t.apply(this,arguments):arguments[0];return St.call(n,r)?n[r]:n[r]=e.apply(this,arguments)}},o.merge=k,o.min=function(e,t,n){var r=Infinity,i=-1,s=e?e.length:0,o=r;if(t||!pn(e))t=!t&&C(e)?a:c(t,n),mn(e,function(e,n,i){n=t(e,n,i),nR(s,n,1))i[n]=e}),i},o.once=function(e){var t,s=i;return function(){return s?t:(s=n,t=e.apply(this,arguments),e=r,t)}},o.pairs=function(e){var t=[];return fn(e,function(e,n){t.push([n,e])}),t},o.partial=function(e){return l(e,Nt.call(arguments,1))},o.pick=function( +e,t,n){var r={};if("function"!=typeof t)for(var i=0,s=bt.apply(Y,arguments),o=s.length;++i=f?(clearTimeout(u),a=r,s=e.apply(o,i)):u||(u=setTimeout(n,f)),s}},o.times=function(e,t,n){for(var e=+e||0,r=-1,i=Array(e);++r