From ba39281d60547b673b9a97f9b8d6fd10493ef269 Mon Sep 17 00:00:00 2001 From: Eileen Kang Date: Wed, 4 Dec 2024 09:17:50 +0800 Subject: [PATCH] chore: revert package to 2.8.0 - add package manager --- .gitignore | 8 + .npmignore | 1 + .yarn/install-state.gz | Bin 0 -> 301655 bytes .yarn/releases/yarn-1.22.22.js | 148049 ++++++++++++++++++++++++++++++ package.json | 3 +- 5 files changed, 148060 insertions(+), 1 deletion(-) create mode 100644 .yarn/install-state.gz create mode 100755 .yarn/releases/yarn-1.22.22.js diff --git a/.gitignore b/.gitignore index 5d64756..37b1013 100644 --- a/.gitignore +++ b/.gitignore @@ -54,3 +54,11 @@ buck-out/ # Bundle artifact *.jsbundle + +# Ignore yarn files. +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/sdks +!.yarn/versions diff --git a/.npmignore b/.npmignore index 63b9d4c..db90851 100644 --- a/.npmignore +++ b/.npmignore @@ -1,3 +1,4 @@ # Don't ship the example project ExampleProject/ .github/ +CHANGELOG.md diff --git a/.yarn/install-state.gz b/.yarn/install-state.gz new file mode 100644 index 0000000000000000000000000000000000000000..26624206c6358d563da1c6389033d1baac12325f GIT binary patch literal 301655 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

8@_X_y< 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Д3) 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

rYo*enqs~6vG%^5WOp_T`(1}Qd)hd`z`ieAMy zsz{M@Wqj#7EM(Z7dm_vXlU>c3dm&U^X=xlGKadwJrTLDG+)v~Tx*IG9d1R9u_Twm? zTZt|cokC~zCxhD!i;0Wkco3l1#5YK&TD%-)?C+)^fjw3}HH78bkEhY(}Id^sCB z+Rei7N`l!B{1k?tXG0Cnqw(&0;N07*Y|JTjLyUoJ(mJ#MwKyKcX^uGg0Nq`OWLW8M zDJ$#zg6|F5Vs#H1=pX^07*2dd2%L7F(jOF7Zr0L!V9qwa7&=~_KDlAHb>G{Qnik)E zt+$M~p5EdN!IDUezWD7|n99gLr%&%s7RfT}BetL`egKUrj*gSe7~511DW&!i{}GD4 z*r=g|?)Ua_Ai%P>J60MKao=;T4>D1&k_2NBL-$4p*e)1I2>o^rerl-k)~6Tb6&L&F z@eU!H^hxD8GbZz3zM$Nuuq0G*-v#yA0T%)YQ{HB3N;0GXrJViBacAzO3xb5fj(!KT zr-G}{!93?(1O|+IAf$qbrJ&oPhH}Oe9OYuhA%GD#?u^X_2@WEN12sP6T>YsVRLUR(Tzm*Gn}JF1Sk&)RH&$TN4* zuKAi`UMuGMG{;t6MULEzk6Kbwx4Q81IgVKc%4oshMf%)PLxAg-I}=1z0!mI4jU?xSP0Pm?Xl zFR1!Q0Wv(aUv6A20wUnWz{wY<=JeH{j#ArQZ8vb}N~-&jbicGr%dEIS zG7kGn&vFh#;$zTRt+tBAj-$fupHWlxVaIgOa*IncWpQCoB9EZ&>~ygmO~94T9|46e zp8-F+ML%brYtXscZo)M-2FihrSbN@anT9Y2a8R{sG1Kd|krosJ6PMyAP-IGAbX^F~ zY|P{otO+o7vvzQ%mE0sSWx=gbhtr?OH*IsfL}i3SlAXo!p8Y*CDFxF{Vs8|ZQKv9g zs)-&-8Wi*>-8@6WHHzr2gQ*Qr6mQJ!W?{3vNazrnkK4IN;H$c`Z@YXT>m(A?_8xRU zy%QReATKz}*hZJ^e$4`_9ILU*oL);@uo0}t9$&`QI8g%4Fw{_O9&A({$ZlMu31;&M zE&a^Ivv?(jIA=>?C%+k$?nR)dpT}M@NC|BVN>>ci|U?TlB!&Q=lH-wxlv#y z)XdSt8J?F%B*3rOd4e%TofVOC!XljoKFP>Iqtp=VNF#T|nE3oO{> z6}%(t>gLEeO%($?J7h2L0^}rJX4!|4Z(unA4QzPi9-StL^Ex_yj;_|UIXrrP*01kH znr|uGwE*k3839%ztf1K@5C`zJ)XME$iwu|z#)o91vAaCk0apZ*Tcr@VD*T+hoP&-N zB#!2@nM=3F!>Uy}&Xsd7TTn?xL=AyVP`JogkSBjT80(iC5C#|RL*nl%>%HdG`squQ zwdZ0scU%Z;VTj< ziEga6X$(#l@7nWADWsopN`rw>g_;Lqazc7$sAWirBp6eLD5Uj~C5XErzQQQIu&8PW zQ;ej3?se<*-eZmZ$iN4i{NlY5Ck`dhHkA=y=a0aSvrwo7g16?W{PY1_0VgNlG>;o= zRMENy{XW9fbD&d|+?PT8?|UBSXkks7(Bb07p;ty{mrNE9r!|(9?#s`4r_bg6=Gl>G zZ&>Y^#9=mRH5eXD{x?1_6KBm#04(CSc09|pBc4a%t5KiINA6BJ@!{`(h#q+ z0Zn9C1z~j{m^_gmNfaru-KbnGoqAfq$$j0&1^drf?Sh?8y*j8Iy&M)|0V+ky2LVQI z2lDV>#XpLP+XYq6;%Z=P-LOH{JWx;Wf=XbZ&RW$vXYINLq8@Sptp_pHaOt)0&D)pR zo0udH1nN6kwbrvxnEgFEy3{GV05)P#iXO9Lc!KmBMbh>rb+;z9*E>n1Vx@qSdRv#x z3%u1cG2|S0yP)mKCYId*d3dLX`oRw{Dh<)q5@qS+;h#;+ozG4nB!Op9Y><{7VW(ir z!TtsBP3Ou0HG#M`u$EU*!YWmm;DijZ_O+Jl_u+}>6)1vE) zLt%jnDzzC!D6%0zBRlC89ydY|o*8qum>l|B3BE;OGf+faDK)Y$7i1A3^s|*>96gr% zMszPUFme))?D6{awS6hU;(4F4jTOsK?`d3ALCxPY>Neh0+X!8dK19?9r~|k9TJg9_> z!-6R--`X~Z7MB5ALsDT+{r%QhG-K{y9Q{Ciy!8mTNTN9&ZwNmP=QI?VEF$_m5n6x)%klQJ~R=@zo zOX~&NTQtl}^>vS<8HWqd=PqpqRT^{)K_AyRMJIHX3dlNs>pe7)d=}9bD?8ByI8U)< zf#zgO5lBD0s7o}+Egbc65C$MXM|cP*_6|0&L~ekVh!{KK$${V?<%ldfwcU2IJ~g6? zac$Op2dpBn1P0z19Of%tj_>t$x%RrXhz&kgA$VStHS5|KgS8kt?mZgT^#w_`=Y>p{ zHbA88eEI_f3%T~)7gNu7oAS{feGfuIur|oT!9~+U%Vezut(2+^?xvWe4mjKrj$$fn zH^bbNym{jh_{BNL)`OxW&VjWdbn*b@m%^zHf9K#b`kn^=b!C$3rs`H^vU+J0@v)DL zP>5wIfkZaRu?gD~CnqpHrvg;C&1ELPTPR`ttdb6Kee+gwJm-;6ew5=0<<&~!>ayP(6t#i3c(MqO8*UBG41iO98m z>A}Gwh|$o*Q4@lB=aWg!7+4)nq#~m&j{QJot@V9}y84|*<0~gX4&R*ZHt0vlw!sNi zq+T$O#YoStg9>iI93U4D_x_C`v6NN#^_JbI&GfYL;bCMX{k#dwSqEb6`6i1N14tZb zu1NoLUWiWTzOpYMfeovZM;mJ8gUxbIpp*|;*Sv_D`dyu|davoN*rk@c+92%AXKxP9 z{tvR-RONUB60b6;FVvMJ3s7Knbgz=UrXRRR5J2wPKTEA&ALyAu-U2e^p8IM(V!2-rOlWp_FCD5b3!a}pNl1{1Hc&ghUO@lE`eU05r)N5A9nAxEVLZhqe z;;rLuZUbc*lkULePm)Zh+$t-KI)%ME{pLzS-XR~pW3&)p^pf9mUxsAk}6MXYRd zzKOJ%Gst82(2*q6UK|60;(4$UShY{0#ug5eVvXnB;jduxoINSL_M8Ni zPLR+x-?(x1xz*~dn7UuLS4$!w@QUo2Gt_(MDI|xd$>_|vBHjT5T3RV@FKUG-UD%!X z*_7G^HPDNe3}C`dF-~Xl41Qz#WP(@;lNOzAO51NA#o*oE1!tH32u8MLX@_v}ibd96 zEM9E|n4ieIXDuvR(@FUa5Ci-k7(~$gKa^bV%`-F|GF*%`y{CmxMvfSz+70a>xK0yx zGr|EW?Y*Y~7ms_}aL23Jd;ed*5KW|D1B1NKsur73)6p>)Dl_QncQM2nHN2nIgri z*9oot;R|2Dt2xc&Q5T{VkFS){S1O^ZO&XZDabhgu3*vUy!s@2e`rcoG4G%gpz;p}L zy9=v@m zbbjAOD}B&pcdhfDs^Q*x(rMwDw1!-# z{n9WQppipqI5bnB4`Vf%J}L)xQ3N)XUO1Ju9q-i28n7NYjYUh29wFx-q)TsYky2{J zw9?Ks7s~%KC@oC z@s1@c4s;%ZKg~Cer^)*4_wr#TDoOALb4k3XcOob%R2VKDU0)bo43`d6<&_Q#gVBgpPbNeyC)i%vAtASkCrR)fAX69(*xe${&ss=r-A)Gl zy4F3|(a?k;@)Nl%q!-v$KA_vFe46^4*`A_~B62pYg;h6CcI))pl;ST<<@lI z3-Ac9dta~Lc;}H^d5@o&PG18WB*{;??E+dU&SnGe^YTNg`}-+yXtz_w)SbTfALt0-DDEz+mo~-;$ue`qVpYLzS^zNtiHg{Z~xj14A8p`5;mn;tn z?CkHm+~b!+oH7Bj7kF(`rOnQ7E9T*7vC}EmjWe}Z;kgi^O%!F!W3bRkvM%o3N{J3q zT+YB2IwZHcixd(O^q01=#FfY<01xQBb>H)>4LX5bTDJtq-$XmJ+Ez7tZEmfb3fb!w z*<+!4z}z>Ebo2lmP5^^}lvl3iUGN+dV1kh5=wDvm&pK-yle~k=WYfCp$lGS29=R)OCqC>F4_PuhH+^&Y&k`*dXYlEwoN?km5(24USAM{+-rx)$pCn_UKnG* zIgyR8jTk`Z8=y?KH{C;iE+-D#Xq>zhg@I%Y_!a@znIYEY-Vv!5UE8BeTQL3#cK~y< z(P!aIp}jwgM*1kt38fY1pVMga(a}Cf*1BL$Dm3zQ`*)3e>>SUqKzq*~3~Zu{7HaHo zNs_~uB-}n=s_fg*3&G8q9I>sn&QWfS0F8&)juQs2DNjw4971m-b}LQS=M+)dU~1w@ z+1?SK;Rdj(6;4l>p%D2}KtKz?@}wL<8r9mpeXUhYLs8k_ucrTja)l#RDZw4MXLYNx zhP$nI1LM6cb>`DR`lo4(Rc(il$q{~n_2M*kOCvk;0Mi_FnNte#(S>>{qgyN)t6@;& zg|T@!^~Pz|PcQV{)|%2IQ=evq{bVhN2Gj%b`y!|UL2e7?wh)VWo+8@=CB(>nmp2;u zB&M*0iF$;*-IE1PGiUON1MKUgceX+_(2+~e$}pC}^4XG6>{gb}-mBALHEWDD9wO;{ zW!Bc;q&$C)1UKla<-z4+IpwyHjPaHw^-Ef45&u7fC^mx|0*RDgycV)@=h99KO5COH zXVQ{FVFzJP2b?w@pe zcvBy`M_?|e(tmtT6Rd9In*biFv{#Pu zT?fk#mtp#$%EWpP-xLs;K^-*SZA1mKN5a&IYlq%bPv<*1RcaH=$R)Wf<9)y#qR48s!<)u0hto3k1vtClvf3FB9A~eCa5m zt2=g#6K9HWm6>Hwf|wX-omtsJo4lK0B0jO#c*OzN6#Qg^v7rX^*X8Oh%bX4&6h$D46%B&_HPq1Ew!BykuwLVx9VtABw z-rRK+MH|R798VUFKx{V%D(9U zzk1z@v=>08rlUYY-+qu~yKjVY~uQ`Q86IeU1nN{=_CREbYL2}gH<4L!$JW6%X{ z%P(@3%J6qW(;N(b);)|z*OZuq?@(KxmPE6|oWChF@4Y&788Cdj@#z*wlVHDTI&(Mm z16h{kTV^eM9(@;@lnbb^sr9Q*+NK&$B*E`|QNvukoY9M|y#ac2!9BE)X)C~dk1obnOOI33?IJP!2m94;25JHM^3xZvzd{NOBKn`USz}465)&YgtskZeTCBNs18*?`o6 z#@hgYEv^lj`Ydgz)=JMCi9?%rbS^!tQsxC#Mh>b2NxtuqvE86XS%m`9l!!SJ^HdeY zH13KK+b=j_Nbzz@xjfzj8tpq33?$lQ_TD*(zZ|c68=V3CWxrS73ff`;3$yXQFiaxkONC?w5V*g$)MR6MF&jUyVbH}d4?++p7juzOqO;X`U+wh zW53JzF^-BYb~G9QtsEX)SAjK?swXp3dd-k-0MC-nshb!*$2b}i6@%4jPbYVYTgVaK zT8_*TU1IS(5uf?T5 z0-0QF504ls&)9$tYf;QmG&)~?lP(rQ`b6`^ZO@v|+> zB_WwnSOK)oFk+RpdZpWwvRpxw@=CYUE=wA2Q*ydFhWN!ciP=OoN_@O{CK^|NwT5rNR?L4x*%Ob| znEq5K=XQDNg>Z8g0zOFLCAcGKW__K50- zvmu*ks3@aS`3i3joJrfZ#A=YmM9ommN>hCkdUoQK*B!e=R$gv|jIbX`h33+}O#-A;@{k(E-zdQ6{2#L%9gPJV>0h0`Y*tQGa~Sxpoy& zSrlgKiYOnMZW4uMPSP=i>4wzYsI>tSOt<-+4?1@bYaz&Ao1J&xsE@yKhn_{R^ytmD z{44yVxzw_}vUhyLvMqC=)RQaJnzq~HE?Ievw9;3!?#@r1JH|2&V~1lUk0v;rvsfh! zaxYlPR2`A?;1U~stlDJlgACDn}Glj(AEZmu* zRcQSJMriHJpoX1uf-B~F;C4^!$*6^Qr?Tv4!Br-M+VNPHJ5kTBuf}7l23$Rveldvd zME<#*5x2=4Q)7#8J|&z*OGdV*L1?s#xFF>-BYhA-7GqwyykR9Mi^x)V<&3y4}k-;Za{I&_c zXzqYMrzl={fYlykG4>+7YNXaN5PO}SC~9lhAp5leGUzm&-?;0HSO??{xB{|Or#Oh~#=A>)`+Qs9xa<9M<)Y)bpnQhd1ht_(8nUW>l48y8SVt3BQnAN3b?1oGYolA7$ z5VsjfboGngqE^>oxJ_LT7$V>lyvOi3!?$R6!9sF@_)cL z+vqxl@75e|1@PeuMt+fXKu8cEl{i7iTqr(SOe^jEF?0c9dV3qS!8T}L8+?U)P^LNxhae5FU-9*ZFWRwf1GZ;uGj1RNcnx>sYWHT{fckK*-@QwNMD?6OH}UYTj>um zT}S%T_RR|&C?#6)062U(*rW)PQ;q+>hOuf4<}NFwHQt)LdO1&kiV|~3JYV_|2=%Pf zI3sZU$WEqd)mQC6)?V;ru?BB}9{W(oB^$iexqupERny89`XfG1<-XA6h;y-6qbE*L)6#n)bV*fy^~;cd)YmKfRhqhJ?}29UdA5P!so!%S z)Pe!t=nfdvgK5{7?qZhEp{>$G)2nClmosg4I}7y^J|HStXo(N4J_9_kW$E1OdWAPB(+P< zcH#T(jAfwTsGUSozi_-d?KEa*i|+hl)f*~vbb@meUDXwX9X7s(;=aRyo_>D$HgC}u^0(rb9IWT=GT!*7MietU>=XQDb ziX5Qc@K^awsgbM*Y11J;5^6*mCVf-RMtQ#35i-p1{5Xo2t5PSx+Rm(xm;7kl&ppc; z-u8$u6E^Go3&DlLq`P`I#LHV_EVc+b&kG7Y5q0c{Eaqi$UQ zp57zdI68&#_NL*lN3V*-gB#tt%Gh62TJ2f3R%Zv@7@?>;O$=6vnb09kW|-ku=7Y_ zKQc8t_j#J;g4XcRM#qj?dSc@iSj4-XjN!Bkj)lG)uRyoTOI z$%oFx=lG1>v8NlLT!W+%g!|^XdiWrCD~xmnpF4LT?si_{aNxN6tU66iPGsG?3-FFL z-x)l1+Qz}iE|xE4E8J1vyG&Ev^CSYk;|-k*!XJdX(@uZ+?F#7eBC~hS2Gik@KMruA zdNsy+OXsDnLLv?b*e#>4_E@DFdV@>KtW;I@YW5>P1sp?LK|Di$vg*O|9hy6(LSzX_ zfyLK0_>3?O2!!&uV&tPh`NzEjTc0E~YvQzV#omHOWvH?&Y_UlImEwCXiM5Znk?@1T zd(pxG;5LKtGY)44uOKw`HI6V*WR){^8*lE#nu<_r#VmVhrE)^vxUN=dEqxqHKV<&?Jla}^+2pMd?>VyT0)rQ-RDimdS2EpN|8brNom!ax#SAg!>`;`|9l z*n8LPS&xubv|dCBg(+if_Dd%&&b*O+mjyMowg*{Ku@%(bCVQ!U>kCp9h(L#;AuNwa zPm2zD)Zg0U3VYsqd8i57NhESW;=&()1a`-Zk0BFzYqI*?dfR4chn{>uk;m$JMIICb zaJol01}nC1rdb-S%1Ws~6HizNrNK~$dce)iUO5LO0^7dx3ONkzou@u)^9>6Dw-cPy zYLQ53q!DeiYds}0LIpryo}?%NGR(RZ2q-`@GHEYBr}g_Ock9aBCC8eftR{Zr8$mP8 z2NEn{P!h5bT@jx;buLK!N?VOh$ClZ6u0%^!0Tjvb{(#9WD>TUpchJQ+gup~&$@T2{ z2xioPEzfF_Cx?)F-e(X&gOC5X=Ud{6?U*VEo9s3t}R8{aKEXv+ZtX=;s9AM;MK zGOfN-YBK@e8ia+BJpyr$QhGNCaRUPYD<=e4%mM{O>ECUd&7?SZMHQIEH= z3Euc*Hk}Pno3ra2-Bj#O+0fz`1&vMY(Z?H#Sc5q`|4G>+R_pxtYqP>3P%xz=EGd+< zCYo6mD{sD22uN$aEr7h2611h(Vh&;S6#RttS5Brv_etW*s+9n>Je#c_Bq5`6JjX$~ zBayxMc>(|MXQga+YbR}A?&MTVgEwK!OS*rufXX65E=&&Pnec9|qyRM0c%Cktvr9LI z>%4jA;nG3S6MdWoPP@_SU5#C9M|Z<^@sZ1h_oCrv=#&QF7p`F@fG6Ww;IMKvxJQ6m zS|}U9y!Ue%VKVl_GI}X1&w$Y~g%QE5($>At;INRpw8Wb}29RB*yGbuq`lAs-K>!`x z;n3aNT+OnafGK{}lS#c}191_kMUyVtv`y|xIB~{ih4vDV5Bg<9Z|NVw$H6;3@)?Vj zkKo(9PY_E(VsR{y+U-l}DKa0+Z zo0dIL*|b@7%&V{8_Ruu9VyED#I{c$9muNnnpuHC}K=KP{2DzP{tChcb<`>oiG(-)l zYGD>0F)^`ehG2OjJQxPlI@X={YU#BL^|f7$p7>?KZ~a^dK!AH)u!salpj26M%!!?; z6!1uVeP;1Tex>G~l0b3ICX4dS1nLtAy2f;`UPQnOwd^=pzX#`eg=;s3=xXt((TR%V znPZ>deH)1OnHz;s78{}qfaU&ng9j%FN<^xili$7XUMoChfz(rZWgs*j0(zz$3)iI;$`-GW9zbkpTN&Tfy~ z$mkA*tsh~m+~VPmt~W=Yyt$)*!a}~;TS1{mSDl;sZP)yD*7Q_HfXLm>v4sLEZ8pYn zerqCQ{8CrB{%oA3z@bM3QFCb+OpW{pIU)QHaA&rbq8Y#C`gORhjthTN@1lj@33eWU zfrsx1<574D?lOhd|GNw15|{V~qQ1>F0#%axSb?8n#M^a@J>)5}rpdA^9cK?{@5TgI zX9D}JGN~~g_{y30;i%5gRzFYP<~T+shZ^tcm~J|Z`fW_d#=~mc9?Up;hR-DSo#$=Z zsGx=4#2%uVdj2j-XW6NT-L!nUCeZ!?Yn1%VHMe+RSp7tMihP*EO6L}LDVdQNv#Fk0 z3xG-WNjl+13X35IbMY%26QmZnfK-XbQ{3XK*+>t9&pw~&yh%cyS>Bp=MNaZ;o0Wu$ z^cLb$z_uaeto$m0%aoNY8Vy=o8v~k08!W_6p{Q%8K0AB@V4w9pW$~VdT1#3(*_9kx zh8jJmuXSE^1G1sCv7;oOQ&?DFUM!^j`&?LK8BKV|$pze)d^HR02~YWmA-x|Q@)m$r zVpW}k44B5ciHX3Z@bv5+j=YJTn==Fkh{ebm}ntE^TKwn#0Fl?D)T{ZgNW*`_50qVGhA zcjla`=+5fFQ64bJSH_2FU{u?YchEwC_FWpoI|U|wuw z6I3#wSJdIbRjxI!83#pz|IF6v4URV^j^$w> z6$Asay)j%^aNlQ2UFsMV>*k93tXgmM969b0Vkb&)O@(jZL5I}X48pj9Fw+(niOLST zwn`#!zJ@+#fRSLsQh6k;UK3hl4)(j>vMJx?k=5TP_=$TQ!~hP2{GLpoF@jUQYFB!$k}fyy>}CXvvE5-aY}zY z6F7B*yc?4gVQ#6sC|k2S+e87FW8-rPlHm0vITreX|ul z(rNCrdB6=$4bRrmoBdQ`tP8_CC(R_T@LA83gN+a!n^31^0KmZ- z1*=iqV9+Tn6~)b{aXIXlGfg!gO_$^=ReI%!$Xe1lU218wKT0z6c`u;@oje%ne5i6> zA}C)f-0B6S6F(Zq-yP0zgKQ>5#hNv6$wga9(=WWrs9EL7{6Zjreqq$LCoQiboevT9 zEnGuP-XNtXqQC<%b&>_RLX#IR7#+x5-{=8ysWM;W;S)!BnlPUZJBx58zEHMpZ?(>z zx20DmR@UGMv#Wy++zk2(o#i>;$8aQyasj3pd9%xZ(p9mrOoD)B0 z)!e7g@KNQ72Jps$mh>W|VovZXKJ0KlCkatow4ijMS1X6mZaJ%QTL6eZSES{9_7h%! zmu|CZY5t=HA?vv7L&G;_p$4e%<&qKwprUEgyG8ED2QE0>X z7D6c+FXQ2Mh8!510~M3O;dj4H*2RgUqOdNCWf7eSk~6}#&st!qmEAE!mmNIYl=s0^ zLR+nRE)jBpzH>>4#9+?cE)h|q@1trw(`h+DtK)AAy5O+dA(;dl$tFcqe!z+TW#}jH zoy?1kap%z98~hX`UV5vpJ=pP|$C87e_ZEvdfx_v>Y|)w;9HrQaG^DtPFxBUMBl~WP%CQTQm7k zWl&_?Sa|TUz2hAojoq|eUhowMMnBvRVW4fBFy&ZBxr(%qeN0;#IX zbBGIaar9^9B(_9%v}_V`FLb{CSlA0UTV;%ZTzc@X=T}s$S_HL@yHV9PVW-FP3e(o? zl0P2VZ09!H6>hF;_{AG<2bo`?S|*1EY$cKW z^>(b12guqL)QB@{s;{McUyba0(TKy zZ>2@j&#A#pr239tTd%>*tzlmoG6AZ4XI9R>+{WleLrW@*@Yo0dUY~*~^^CbnBC-Lo z!8Ter!)j~S6D9Wpe*}6y8%5c5RGS@n4ZY0#Z8IdW2pU9^JZy*sG$9?`6yt zk6t!R1Pv>X9KLT-oAhj0%@8HyvjCQov1XYMGYWtFlm9kZY*_keo) zV79$JxV1oirM~89Dgj?`1&qA=F@)+=6EDi20JLDS+34B@$C5-6CO(k@!w1hE@EPBT znIzO>rAWnSIP3t?yW;>j)4uS>E)m|z%jM)Tm8 z2jc=EE4G+7@%_C!u4N)Cbf+o%QfT|8uWPPS-ifg-ri}oxIW}+th5U7Fow;J|dUgo> zbkKCoV-&tzn=M9*2zxUMI#Nz0As+iqt+TP%;A83SQ7lH|j!j zpo-C5z}qrenKiWqcI~a{ubuh$M6|b!5)$EIEw`-L&{qT(Upl9R{8Z&o_o`0NpyPBd zH@G!7w)f%$J=Xco?_>5FZ6Qc|7oFWp<&nXV+L`o|Gf>tqrgMw&a4yHNqSk?2h#dnE zZ1J`ahss-Jq@--_1vu{r`gGPgywZciNK4mF~tnBfGjEo0)AD$*_W?(y@&BQY=z6DXCsA|l|w9|+|TgKIC$7?tFb3~6 z;2ivw@9M%uupgQ4TuvL7CTCt>g~555GblQ-j4wbMx*0}2=Sl?gtW@KxO0PxqP5#D2 zloW6w-@9uho)OI%LK8ojs3&77}fj zKdipVeM)1i*C80uu!0nGV(I-h=_;FEEbNI=&g42FC=J>mqOva1%}&*39OfdWo_jUh z?O@K-NJfKmSP%H%rRmgr@_t7JYXM$6p9`CqC@7PjGA?Gh6jj&?n2>CZZcht!s5K{I z4amFV6c>%r-*aYtHL0Y-FIAuz5RpHN7sKdqdvZ%h@Ljw zfQJunF-TgOYl(8q6cb83nJqNyhWPBr_M_zFvEKQS*E-l~x-4|y7xg=vt=D7pHYY{1 zN#%@ENkY1W&jKbgggCvY`=OEb6fnEN)a$_OdTEL9n~}>z%d}O`ebOKgvj(%&NmxukgULlKKcd{C z5WFZ2?=#!EcIPf&9Fja>!PU>k?nA>@i6=**l%ymwIT~$b(Z9cEf#2`0T@)#<5!pJJ zYcU#1V?;8YPftCU+dtmWNdLwyB}-ifRj!f_s1P7McT)?p7gHFXgzHR(J$^dHRrpO3 zvZTz7GPCxD0SXjLBvq?kJufMz&=FqmWMQHzK+i+!13xY?E)EUrWmADe^dMBU2+LG>vF8|XD~UyzIUULR7n4()OcuX|xYg#Sxp zuMD842m;#>8RwNRYf%#AwyJO%J$j&`S>gvFtS-t;+sLHxQ@EPB^;MaI0Yw7zg#9g@_AJ{0E`-@uhQ*H?^FzYq^2`waH*h2*uecRyza{_<2GC!S7|M zh6F5s5xtT$zd1_M*Q_=<`fKi1vXa&oCo|+1b&wycID~Fd~_v?13fA<<+G1-^k28_A}mY;h=$e?Lf84w z!XYHIg@Xv#l?%yz`!=0^u;|WjJQ6m6RPgxV;;~AsgIA0G`ZE zXOR9PgSF(uZ-+VcqFa?ilASHp16v6Dl|9NNP|Edp%N7TuWJY`hApbfgu6b0yW_C51 z7ig!-0Cit(xlHsHmL`tMB#3#2KM(*fQ=in`2S0@}UzJ18_tuP&3i09lk;D=H1@^jB zKBZw6b`s$BP@Hqzi-jQ=b6^0j{9EIV$;T7_T{obUe9JDfaL9?I=38nDipk(D-rR8* zK{G7So1kzPJ+CwGo$R?c8&-^8NT2MID{m=jF^cP>(xD7Z4 z#--gGB#5iFPytjDntb^k z=UH^-BCt&eUA(j9LTB4K=>^rtx{+jEmBua4NnW3XqP!W5tGn?~=o{?-887B)t94@C zV=EeX26oeP#5*dq$o817FhUDTj208{i>%^LW)AF&kKO5wN5yb?8X=Z3ubp*E0y$C_N5$OY^hfX0Q#I7+fK&|7Lcs7Vmx;D}0^+K@zwD^Utbx3ji$u z7QmH_z>;gs2r6MUw@PM0jYRUVKpwpXVN({)HVb9OYq=y$$E0|{9lmxkT@N?KT9dp+ zTi9_(AC$whq6XR?daApz?(1e(+Uq;bs4%#%bh)&r_(Q``dA!r=QA1GK`yX>>lqAWj zW5F!}5(t(f5bS>mWv-}2q}lw;%)RebS7%0mbdGxr9@f3^ZocZD+6I2pjk07%pp9&o z)DhRd+j()~o0G;b9wwmdA*G4aF9sHPNo(y^xl_vPH_vsak;+41+ZIcZ3RUG4E70E% z1ox)IMnr3_&CgR-=Upb?P%f^}U@&-dX`qQAr2A)2hGEfTd&1kCz&9~~ zLM_rC)NavG?<%aiFQdOu_%o0e^Y;%Ex7n$gcLaob_-5%y_`=r23Zh2R z>bh$3aUoVAa|AjweREu{pumiRc54Dph;_zvHUn$wyrLH)I|rg8*^L57P+Dn2Z6CJ8 z>)q}btqv8z22*Q1jscN_9$Jy4gvcuqXYvW{rws;NL0oI^*(jPY@Py?*C)Y*ZCyGmT zqV0AWo%jLgim!rz2Dl!f(m2+f=!G;tOPXaUD$PJ-xYo{%qP9JfpaEgj@NZHDftgf& zC|IKnz;OUQ9&Dc41D<%%gId6ZBlle@g;mxz^5%9&LPnS!=+BCPr3TNTY{ubUKBj1{ z#|*l5{@O7svU))8YwpiFvQx4ol|2enI_`uJBIM>1J@|k^R{}oD)UDc~B6Gy~Tqp93 zFL`k|xodjAGpVecGaHSYjOF*)F7C3j3)#ujJhHM32U5(uP6`n-8ah^{%$rRen8yGnU~s$XVL3v zg+5-3-A3i~Ab!QHc&eDo;e^L)Ve_xDn3u}8yuq9?qg+L*^NGLKVbFYUYlkfd{O_@VKoGbZgOnJn4(q3vNtUOC zXypUJsD`UqxsZ1)fbDo-I6}UyMU3pmC>o9wj+bBe`sO=~q-g+c%>nR;eH!oV#qCs4 zvkiH)jJU*Ag0t%7fr^j?Lx<}VukzmH*~}z6$J(0P39khe zyT%^Z<-E$l4V7L2SG~Cu$qVPX}fY`X=^-Ms|nX zgVlns~hIuvek;#+mR61Up<*sGYYG?HY%VBKy7l){~oC$Xi+3zPCtt0Hw~1n>0+= z1#Z9yX?c(hWpYJLZq^Aqs}|}gsQ#e-Hvp%s0$3J29R8(v+FUc3*G__K@1 zYR;Ty67215wzw0>s-rX=^ib=b?4t*w%U<@B7-NkdmM3W6C3rpY$nJ^QD1qAkHiCDRMdfjL^#4c-;U;fJk$i`rx}! z3+8t0h{zfX!Y14Ume&-733Wy)? zE(PWGC-`ZFL>{54wVVk0YT4=KfHSvqc-x3!20=;~;sFNLE~C;_p=gohlo|<(ogiji zLEQ8Culo^=Pt7o7zv!@B8D0%9aWnf`R!!aJAjFW7_ju?@ncgQT#Gt6q1m|> zQe_U8{k)T(g@QJc%4-AFKYD$Oh+&ZZhm+TA5KO#_LIxlTet;FlFduBtKG0T210cqM z?IJ8{lx_iCDdTex(la`Hwns8wF$j`$`wDF3w474N>&})@NKn|VlYLQ~6*=H|*kGuC z&G*a}mo9^|h?}Ldr@p5%P@8LC0U&g((Ppd%FYlb31x)LOye(tafVRPcBwHec=+Sc> z;CXYwUof#ZAXSmOCcY1)*EeSFI)Q_-dz+68&f5z()QslQ+@N2-YzWrs>@@jk=-W(( z0T$8wWle(;ed zj*2_c8JltBSu*3cRbeN$C7Cq`OznW=2QDdX=OyuUPUDF>$ZwlWDXSHT4)a0vppc4O z0D1G0(hu@D@}kUsgki)CE9DH<{v0s}q-KHx2j1Oig+ek+`spZj-Y`;HEd$#)GkYfe zijb6#2qC$Pt8hnAQ8^r7Nn!-aH<>(hh%UTw82u6|!+lQTwsV#(Y=iaia9mrjVTyRB zgtr$})j2Me?q}l?8LMYb&r=iViq@&2%CYj+UeU(uV(Q6(8H%ZwpM5D^o4MFI#2p+B z7(*T*!K~$+g+V+>7||-44D5=g(3OT1Q1`>Zc}{YocI$1~5-G3?5QDzUz-~`|lTfE$ zO8_m6J?ycpVzF2-@IAox!5~d$Wo&_|zvE>+bz?6BC(ksy9hz0|@b(`ufx~a%1z*8d z)v>eE37v?Im^pMU%$^af8jL;AAyX`;mR059>nd93E}fgt8U4~6K181SxQ5dvU6mF6 z5n)VfsCK3Fo8jw5N3a*E-fP9k4cRiO*jT(rTn00hZ)yoP)_$G9Jyf0;m2SJykL}G2 zEvR22=qXV)N6aLR@}xLC;OD;1D`H{YmJidNE<}L$!MRB-Q(+vR>x95rsGC*% zu2YLKvbk$8r&^`lhtVRTXS=?BIc1fT^9Rk+60rpG+-vUZ>+lLWZj-d_LYB4Agnjt&#Z0nySy89Bo(?w_}_SdYPhV6qko zspSp^LUXe8IJlnXd4xV|*W5?^z>kodCXW9Ag4bo8b61X99+gWrw|AA=aE8@#<{}qJ zyi6-rlGQOJG!*RDc@5RYpmp$|pQtn5?I_cNGC`@&ai~ z)QJs*;dRUWLMOMRz>BC!VNd9kp9t!}_-8Q?nZ6E)CYvzwK(aPS$`xhid#UmoDWeS~ z!ERD*fTi>OYTM|1s*X`~0ak@Owe*>fby6n1Upct$dEvE|SiqA_WV>m1r$JZ60mlFk zoA}NkYVn<2bGHKNP0^N=yE&^(WbbrcFN3nytFBG0j5@vq78V)2IA7tnlSw~9c}Z?) zw;oy)VudtB0Ck?cvTbz8UhfQf8)1*J%c=Gg+U^H9uJ)lhnOKUdnjpH2v%Rc60wQuVCn7gN5 zrgO8Fl|zOlh{gogDZK1;gd~_@`dbz?M4>aSJ);rqUwp^}Jb0gdlnk`L%B?2jw|K@& zhq{0SsadWsCJo3H$`EhR=sKM|(#CZ5IHNpozHKj-@C-?IjFRJNij$Rw*IaZeIAiBy zefiba;P5lxC^|#7!-V=%i??cQc|cz(tg@xR}g$b2CTC1fr{5BY_8q1D+Sr0!I-&hBM%Q};$2EAw6gpj9F zRj&<~FJ&>#_{?%ID9d{5JFnCWEeBv~l!wf(zx-xxc-}%y8YoJk?75H!tn~mpFH1Vj zCVU|m4NW!ixRWSUo0XF34K8J+V0#5a9og(?vEG6uN)A*D;4@XCxdhjdAQgJo^N`so ztO&UHF)nQvQugDNG*a>X^Ir%S8!Y`iR0G z-;hjtJ;!(e1%Yy&sTVIKm#NdG>cBKTdxkQ-dh4)0DTNl#Q`4waL6;wDj@Y5So>@r< zg1R;6vOF2dyDOQdBFeTDZQz=$Y-{j0Uv$8Q8Sw7vWr>V^glJ7eFuTt=j5=OBf!YFb z%U#q&^T+~LDP{|jces+mwH`Eo)P~p7L04l_3vgKaQkzwNqP_+T1JFa87ZM>TTrS-! ze{EZDRT2Ptn6a6kf+rSInDL9@lwVSj8K}t6jbI6YDBRm7Cv2QV!MJIlp`$c1D*lJc z?;9UVQNu0>{u+QZvEKEJMH@T9L97!NV1?-IJ_)=F`=qUkN@Y$#>yUJs4p@DQ3N0jN z<%P(w3Y%!{LmA-Vr9{9xkXSw5LA`Z!M_M9t(?qwROz`$EXDs zb48DH2tu!cCP;x(r=@iv-6%wYYMKE+g-NH4?MIMtzN`J~cHUEXsLKG`oj|=-#$}ur z4OBiS|Gme>8^x=44la!X-M60J4C$DGfF-gLFd{<>e|38HzPv$EvMf|Y4e)I&09nf@r-J%>F^x4E(%mXif`?`-vF_I1^|m*$kI+CHTlpDQ{P)XiKmJ+ez9loRAGh4P0y9YLvA{# z3F{@eQeA?<)xLQ>qxiQb?9GP}nIALiMTFV|pnr#_A&hN_V=bc}pF#Z@J6ha` z2wn6MD@p2Q7n39Y0JaSB*5@$pcN;MbZDgex8lPy#x@(S)QAs#{i`V}jQ;%T zie`HZ;PxaMJXs-te<`kIoQ-XKX^Y_xS1QPq8Vg-jJPt4KhOkQV+xtoYuMpp$QU<>N z=v|}p&K!o&M3u;Er5Zh?OxcHNWM1gdL%^R217_)D!B1nh#joUoDF?Y{3<;=^s~-%$ zOlD42wAgCK-enCqg3;J3rLevWgp1Nvv%%1fJrV<;4Kt!1JKk14n&@5n$<*C0V9Es# zyH{oytPbaU4=vFnjs(WoRG8t$yAx%ytzul^7NIQ-|5$C-98u_0}HBk)p8(1A5X80Lxz26 zjB$#qH{Jx=v2SoG)>yS^p-R;#Cfs>39bb;a;Kn_OD+5Qqx7)IHPoLV{a!*+&0pRY^ z_>Z?Y3sf8y=Yx8{NET`2aYk+`5SkVK=2m+bPKGt2MvSG{D9!19yeQwKd=2njKZ{Km zL9@$(q|rvKX~4*#U&&z2DANW^CFF3*xubN=F{h?iv>$GjRMpu&2!*(#&?WOZIZsn3 zGD6c5s1@+?t|J_e@$j$=5T71W+nH@UP%92pUxZ>)ssW2Lwk!fBh&~qo+p7efYCDFj zxVNkZ6s_yFEr)}Yp+qj|KMJQ!X7R0VpGNR>5^V(li1sqh_!`zGI{e6c1a>u&W*5V+ z2gXG1atX^&?rmm2(Urj*4)0&_De3WF5$9s*o6R$ z;E&?#O1;)NZ=MSiryh)LB>a1 z#~3fhDq0=XHV9_`Arkst+=(wN5ja5v5Y)qtUB?HO=@o(thp8-w?H&kRnmYUij4D%4q*FJ4eOBu68_H4J3QzmhF<6sqgJc zRBFLi4c6+I9~fO6qLkE;3dQdOHHdWrvaph*qM#xeZ?$b5#CK_Qoe75Nq5#4-;;~zG zZ^K#%9f}37Q?uvE?#F#sPtb6NW6Uwkd})z7>3Y zQg%8a?KTg}{yE4h2c()8G{%ZSTy)%Y(aGy-w|W8J=8eP1Lp~{bM|g6 zN1x_zI*_!vp}0azaCWlw_96v{Y$20|umiZu6P%|Lbzo+R+L}zejVE5+`;0iK()88M zqLnx4qX54fLjtP|?K+gsahI%?<%FGNpTQksGlX*Q4cjoZl?w&E`W*;BSoC%@P_n7U zaV6W8)Q4^c;VZeWq*CU!l1yBGgw%RhG^Rz~QYY=BW$alkseT!)VmRe63klsPp6FFCyCNjgfGNiTkpOmM z?FiVCiSC@7v-oFau1>tB*we?Sc1$HplH6D0L5DO3ksFOPSj~OYdfZrm?h-D_Th6$} zp_0u`5q6+)^tGtaaT1~XiZz_o8$H&N`KHSpR2vItDyWPtFOys-i?^;XRP-Kvkuf{6 zz73+HkA$NE)4%dv2 zrPbgC?=u5A`l`PdwRBNsQcNO5C zrZwZYmo?bAEY5%r5ZvDDpC!&*<@kkrW3!+~xPxnF<^QYHb^GJtb#T>AwI!(DDaFD% zq%U$h;@?8>q&NDWVCs7t{AqVBE?H(=N-+XcD72N=U6S86rLeBEVuXsFbPl5*P=dnX zd$g&kzs-peB!#wMn`ys*NcmAPlZz!Kn|BI+c7Jzps<{x?-?Ecvn5ldAyKvnaN_cB` z9!8oflQi~(Xt+*LF1)1L%!Hw6sMfsV6&r{Do{=Pcg2qML3}m86E926&70ERjXzdDK zrBZe!{*l+()i1eoz2F~Yz0=#guwcStcQHS#{ohScXgsPgS!~|@E=YuGJ_P4DAr*zr zAdgxjoUOWU79OWl+Gj7ud6Ci%?y%-!$@OW;g_vN?e5aHZC^I^J3O@R8fvBbI5iz+W!~ zY<`tzi*^mUhFeZ2V!A}{=sbz|_O+=t5CBBG0bz_beAL*n3yWGl{Z8tf5b0D2#NphO1Qg}_>31tXD^lKZN5-1DzH)>bxTX+G_jKMhl`C=hmF6G*eGqT9$ECtM5 zd-%GpGzmECmpyV)4(YXz%``Q*W*|-ns6%k1XAYXX0@CUdR5BYCK2E;`ZTUF2k-iHi z9{z8;QYk{bk+>10$Xmw=*+MS9J#Sju!50{FaC2E9wOc#j4GH?c;-8vXbJ(zW;Lg{Nfc@0Ba#>Ey4a z-esdtT8dD&Do6Wi@X4;_zmUGL zJ+N-dSJ7i&`IJa@+vIT&fM7*0vxJ)!%6N}C6^U5MN<*mtw20#%PX;GOh7tZLA5LbI zC+Ci^tOj)L^eI&oL1#i$3CR0=yZamyIn?fpJb{dQrRKQ^)AFN>L`r9jA{9q-!H)#6 z33X;p`s-u0L@Hdln{^TLzj3lpd2ivUTPlqKL{s|+<3yCf&cGw;hoMqo)Q=z)8C1kEOnmJ@Z?VMbRMtTU{M)heb9yz5CeglxH5^k`k__E3fK zhr$98BY)7;f-tyCVo;p`QCU_>U){{6a>k+816k}^NfiX|jIa(r@STF02>WY&Ji4^8 zR^qmkC^`Pi<_4VA@nwB#;dQKE>+@BQerKSwq4&WVwk33$>UW`sHu0#!9KYE1kkzS)}{9e zd_l`SP^LLiXdYSEjI55l#|MYlVNK|A@(1&RxLMwzsXb!Y*TvP5*O*D|{sPx6zOwExg4)nJ z3Z(~y-B5Imvjof@#9_)N*vJu4bv}oXM%pqeHI$B)^P^TC%hVip5DTVWCdAf0nKT-Y zdJhPXh<=KI^;fJ==B*jr2vwdx9p}}BiLo~s|1?I>wYxEQ1r&ocf(3}yDc3-h!bT-C z7sU;^ed~z{u(~^Lf^T8mZzmv7TTEeK25y0UoJOhPWXNxA1xLe#^-##jV|(Gn&tn-R z&>3B0UYr0y1>XkL)`9A6Vx6W>OEX@$0n3_w8o%2|Unk3qEg2o`Z|ZCtC6SYyyB&;a z3;5EsIs&dEN$rM>wdvVV+pFyge`lYRB2$KFy7?}T!1z_y8M4Y-;#4vBe3ow)Q5l7& zV0LSjo*AH|q@4BF*X}wtezOe%js(FyuOlb2vzEB$b;3tIx6D(v66N(mDV-S7by%D3 zWh%i)W}R;|WzmuoQLdS*K{J{?z7a<(vV@3-1tJ_rp%`07?yBajD~Z zLR=JAI=jj%2UH~_!*__Oh>@$}Q?2;dNevir4NfKlOyt5Ep0xa_aaGVwo%!ez5S|&a zY11G}Uy!N#+AZqno15u^kb{!7*7m*M)>13U88Sv!dYeJlbY2lGi^qbs^7?4b;RA=u zQ%gwP&DuXbS~BK%f=(N4K%RY!!AThuME14L2E3SNBag4bjBU|`UI`wiE1U2|lG_*J z73OEz`ko%<<=Zw%br-&)(K0y6CT3^tpES4e=UTk}N?nY%QQDRDypFDAB{2w$PTzFc z`#MO2cyaB?@pT1h?<85pslAxRX4Gm>vy4{(d)@NhcPmV?a)GDSa@NFyz#UdtHC8soV8|j(f7fl{D8cU|YB`CYM~(R~%M0)kG|b8Dt~i%?mJlPDB(4|> zSH_jS4(_t+l0inCO%;Vhz!IBAq(ll!_P0=!wD&;Sm%Jah0wXv&ahWjcVkGy?M7&3`s7A zoMo9o%FgESsnr%m9H}VTmkR-8o2{?2+d89oi5S+I1$Y}M+2^(~m7EMD<{Lhhu4k_x zJ^JDX<`gPVb(ulv(xAxrNLnI{^ z$iRdU1y9`0_YtYkH-6@X#<=QYf?G7~2VS*GcB^mtVTYwo&zH4#FKj5^sU#|~51e9$ zpCd@C&fZTgNr3Haz|YtOP8Qtt3iRh**7x9s7gR7tBy%I%x>RLnS$HHjjaSC?oH{C7 zn8jKlzm%=|Cc3G-Wu=_!;K zAal{O9J99ja&~ObtF>ZyzHv?CR^Wk{p(265_U3xa_IyXGt-5Zl6z==O3WNma3YEEF z69Nblz6md;ZH*P4kPc|4 ztv4^c*m>eEBI+Aydx3z+Q~3geew|Pu6r_4kP<{*JhsMYTksMP3TMnqUXC#tElyZ>O zh7jmD|9hT>4J~zv_EySn2Fab$CCMXwF+#vS(4SOQ$P_d_bw^Wf@@I06NcDU^7v$0X zLsTqog15DI)RC121Bo@N_D&SKHQFe;(`~lTmBO6>-C*Boe-V1n4QEB59` z=nI>3UWE{?2t1xWw@y|ddPwV_dzo@J+(4Iqd|xbsc!dAI4w z(~@p=A0h6s+qg?1;=zG(0&o*7Fxr=BFb+Ern9(kC9|HhP=D%0g3$t~^UcGnu zN=vM%shG_ZoLO{N##roZDjd3-m4MeK%7C0Fk$A2R2d!`~rJqU#$!(i$(kne(X2pZl zxsi6Xq_+BG5Kyc!!0nzKq{NeRMsWf@@HTPDzB`Mr!1*e2g!5xjMgPPA2{@T>WjJJH z;2J+nzC;QiYjf-CB3Q4RMh^Ju0iNAv*#ee>S4*W&fq<#q{EI-h&4!f4u}DLmt_Myo z=)@g;&rUihWB!uc_K%naevcr-s1;|>oG;_A(1is4nN&67`bO-v14)RQ!sHjka(OG> zuQB8^_TxZAiMBKn*f66pVwkZjUl$W|ySwTph=XSRMUTQ_<8C3$|3 zeBcO0olBw~!9l2BdEyCBU-QGIjuNq5UjMtBI@3bMq?l9@bnB)J@Q`$AM6G=^PS_=} zb-5Vf?Bunm^`mQ%BV~%q;r<=8@kw~kh8gO zmdz}GQPD_Rew{2_Y#wsum!)cBu*mwsCCP@MSR5|oooz3g+wPNycrXxO4Ph)!O{W}0 zLY>omeOe*zan60KHs1sRk1moCbKjd^oazmLFHyAT!dzwc$!&u}Z^({>F*7wDuvH`H zmOwjP-o{>Q(Gx{vzFat2&l#bS!Fk-_Ho{wPQ^h})Vy$iKh^1s7J0ibfxH7k1{2u} zEF%`fuIfBUQ{_^-Cs)9J@pf(ka78&0;}pTPn6>|Nc)C6A60+808M1QSs-4g_!-%0I z$(FZ*zr`2@8j$U?Pn2037u$NB)~}#rf)p^6aObUoRqgdqQ?k?qz8R(xx85+ec{)}y zPj4zGd_c$;D49W23DBI(7Z*}FOl`pIoR4e4baO3IaDEo=gFRpg@b+eWi%$9y0Do*1 zSoBsMQ_3|(V(OR=7Uud^YGqQI3QcM-|VIX9|w5V8n67>knF;;_3CPc`mDVY|pd!%5aaI?%n4DcDt2> zEUAR^DEbyyntXW!a8JnrB(W?fdpW%9wJQ;g&;tqxY6|x=1xdQks^r}B_{!@!_!uu{ z^^AaJtl%IgM99~j9PXUAKg8I>k*dN$4pNP%>?`wkCJVhuzr;3>yAI2eraAP`zkUrm>lsGVy8WMaJ-9>)Uo*qN!>azfdi zZ7J+ghn;Sxy?uB+Wb&C5z@k#i(YjO~)#^b zpdYidpesl_&cfIzi>>)L+9$83MQL;J_{7Um+tT_vWG*OZ2Fq>pyrwbNd?IHWII}wl z;z^=*kG=wKuNQ2McOS7vI&hXpl#nbNaWkAX+5^;4a^mZ(G_{x!b7tU5%iFpy=HeU} zLC4ICgcurWsZ6++&w38qA8=uouc_wwF7GlAv}Z7+b4AU*RO_bwtyHFWg4!%+?-?<$gljh(fuixDGPLgNIfxDyu9qe5OinMRz>cJQ zVjO*Ig3Z>oUW|E3)DM{4tL~V)lVR2HTa;Ws1w3vXARmh%1B!Hs{J@W(wNBy7%SH)`p2Fm*5Z4Q=OOJ{bOXGg|_Fvy0eJ~$+FZaUYLoFZwI z9E~ltv+HyVB;4%Vr5GJ>s%9MIg+n|b6?-w?N ze>Y-I9vru9X=sQsKmvq57AMe0&e>!Ta%ObI>AH9;5a8Vx^PpWpvhd`?E~(gWOMb_~ zYd1rbFl-1GCcpl0g;+WNty1vBi~I(_mIXm3s1Y{qMhJmg802uO;B64fy1QJ?S^QNj zB)_7?3wO0Gxyd2(!X&CMG@6|zyd8UEq@W6J@S=Y)x|p;)J9fdSOro6kZxDXpy|W}6 z?^5|dY74frEQ+O4`dD^asW3@NDJk~7c688H8Lc9aV0*NmwNEo}M+=07%kdis5e6-y zjcj$sY35>ef}91P@*Z6ARyK^C=VM_Y5@!*3Hto~(2PMR7nAMisd?RaoH%@_D+-(!x zsu^88>U~d|ss_%C$|EvLFEG%n#B55cw{ zN^_+lMSbKXXmHg+82NtESn94*1M_EVAX+JY_i}0071e$B$nzjiS{w+waontO)aYSE zLzKBH(_#=&^HK1VJrn%{nT~>;1xQLNT0S>o#j`3$>og}+#zU>6GNqM5w79Yd3`0O# zCO50~~=ImHbs36}kQqRtyNIMO_3n;R!y z#`1Ak0g__rINrMS$k^h8Am<1!7qT!Z))X4cq&F(#6-1CHW%8Rrj64L)jOZ!E#3V%} zzDD*@fM!e_>gce*jK~`PJf*SRl~&v3x^ZIWz8o7|RpAASt8cUD%k>o>>3|b*dj5D- zHr__(O08YXebtte+dXS;h2zUe2;fq@lm10LR&N#2T{K&ud>rxP?q0R~TZaq2dS7hi zS&rOBfP+8s*^iO?+v)JKUXkl^PJhbr?ApAL7&h-ihW{f}X!2Rhl;o((2;bgJ*S4}8 zkJZW$GNotRJ>Z_SH7`0_4z%#_r_+M#3kWoc-7#iXv@7IiGGUYGgIt{`5vJkRWr?;~ zfxuNo9~&TJFIObWi>-tH8VfsOQJtSyJoN1RD>#Aexo}r!XX3R4@-(cg?VffU9dnM^ zJ~wCZex+-nRWRCGbAUP52VV=nwrG3o^%kxuzO)!}MUo22c^7QD~jw@r~JkYnj&(HXhu{>Nrm%f_wiP9?&OB@ zb@2_a+NKB5t7OtKz}syVNo=+*0JqCgB2Ms&jl4Pw7+DvQ@MJZ=7b0#BB)LcS&~%kr z07mSb?S|t~cuM_u!HjVp_BMw?$hdi49go8RD&!CD!w9L!p%Kg*9z_{L zTn-fQGpiqkaC{yNm3=p3Vzg$sOS!~N=jqcq$WwWL1Q1fM4(P6-)ws`?_m*JZKW$g! z%(VXu_9I(Cj@BSA?L?7oh_&`9uW%m>1Fo=0122Cs$&tU+O7yODdgg5C^ZsVytI%+Y_HH= zIlfdvh+GfP=z!uYECc*v)wwdC4^_YYH2_{Tml_JGN4AUovC>FMTTM*6L#L3Ohn}?> zX;G^YIvO_a$9D#m4ib!2z(I)bD{%;Il-YsjLus_wt|~|cK^kYk-`%)9*W)_L<~bmAF!EfCNr$c2&!R-Gq3BKHw4C(?-?&Ufm%8aH$J({E zxL3!W-<$GrsMejYEeO^x$Edy6hp}%S>dUoPRNWLd)?1CYG-_cBuZta}CS~UVeuX5% z2Ngh!qHW|L1?=gN!77_eG0QoNeYk06#tp15D(h}QBQS0;L<0wo80S?>a$&or@}D)e zoFK6` z4j}AHNtaHV;Zd`c&LJLyla)a@euJ0DA;~SmP{D+9_Ivp~>{B|zxw>MTW3Jy$hNlYB z?hPrmOdi3$BB3Z{3qe3Fb3utz{<6Rl+}C`AK{@C7Vf2i^nH|p7_?if3>$~Btl&W1h zqWhw#pMvEPxLrqodFlyczE(MNuY+B?FU$f-NVmipzdX0LgQgJ%7`G{`Jg*yLjowE^ zDA6|H0G$Gphd0XQZCbP;qkwnJVfg6i;OHZ&!ks8Ay~r;=>&X_bteLZGcS`C~m5*2B zp&u3QDT8lrxJOZ(!Q=>9g9_e5&t52E){8BV#A+FinV5$h znhqG}ZB8nkWvRY*R)!6K;78!ErI*9%qiv-Iwh)!PzA92s7hXmT{+I?}lpiO_Fp^Y5 zdasR2>V0j?YEL$@t73+L3hJ)#ezl;kN%3OLntt(K#iK`LU5EZ?Q(Sfg8E700Wl*&u zlA*Nvqb{;ztxNucB;KwdFnQ8+X!|(o1_a?X{BZh);`4Y;7rrep4=Me&6hYts!gO*0 zOLz7W1Lg5-+^OR=MCb!U(+MD{R&(4jVWbqsP=k#BDi>NIe@>PCP9Kru;umEAV0q5y2MJ0AR0^n4a^iL|jZuPrj~!j@ z{WfJ?2Qp?Nu>xue>~BsQv6Wj9icsoqe%86$7D%P%myRtE!A2Bp8+N|tdHI3!wva|+ z0!2MW*Q4OH`;FhiVrzubdOD&7W+Qzw&>_KWi%&WhUZ?^Gu_dN5D$7r%w^Q4^_*T&^ zrKJ@R4E2$cU!~J;gi(td!taUz6~BeGGW_YgGi4$2(+MbA>ryZqKb$Zq1x|w0&vEUP%n82Vw; zsH32>xkh<(zr<`c!VCs*ko-8cKUPV15jwm^gK&?oiY51H4P@m6U zSgyUhj1BS_lji#2%rVAJc>_4my)$(xiy&3S-+gO;D3co>D2#igcuijGuSEXOoZdJv zDw6sFTGSz#J(4n8>*{0yISNLoSFk5SdJU73V(-hr{BD-t6`Guo ze$}aLhA?AHB^yfVf2{N;b8{31y7n5C_jxI{zI%t}MS1DUx83o#s~VK!hmzD#{8CS6 z2EB=FPdXVC0H|_@DF2#XV1G=X2AV#w#Qjj}uMi-XQ69xd&t>8q!SU+Njffr0{e|Bt z&^TlHZGc(karye=n{>eH4BQi(h00^@`)FT#W9##@oXSuN&GV|;wHlaZ_!@pM@gCZ; z2_;XTO~K0+ial#P^uI|_v6H)kwXm1B9x;FG1N-;tQs;eh0?J<7y57nt9M+QTZ7WXb>mC?C z+A*5#C-aUWhYF53yRch2ZuEQ^9RXAwsXz|yQfK0)bNPWmyV4K zuJR@x;l$EGIQI-r_MEPBje-z>83J)-m2((WN)$OvU1Rt%`NWB04Oyqg+2rZgK%p3RjPFBY}K7684GO%@01rQDW@ z?Dz3z;se&Fydq?{C^e4)veDc`F4M$y4#EEZcwn+-A0Pt9>&qJffJh3{qsedJA-EfD zCttWOmiDI15A{{J&BW2SAROgeA^zaD+l^eCgJP!tWcM+c8hRN3I=8Xe9|ag&EVB!S z-!b}Q2;OWr;c{a!fe9^iLbG$iV0hKt)-`Lx*T&SA;lu)k1Mb?}VNO-8woLl{z;9u{ za6ri9@JV6SspwM-2Fkvoleze$>gjz4%mth0O@1pUR;h24-rnSd#-zR7iEhXmW5G*f z+t`oIvSHiHZ5Q%KJxtqZb!YHYot@IdAT_XgL&|KPKWR2e)_gL?>~VVb0GNvOkH_Viyn9-kQzj%4DFI;D zMvlP|WpEj5YQ5g2HkSQ|Ba+mSx=m$98?%tTIy(NcFdVko(Z=~TdrBi@!MNnf^f|^oi8&Y^gB2X zpwVE$1TDGZQ5PNSPH5!3!5&Mst*u~M>*P`by5(liem1lJ!p4xli25eap$|!9`I{^@&vKd=5gPI_%ma8GSkVbb|6n`b#KgPv7 z&sX<}8KnE`ciQUi>;AI(p ztlAc@*jd2|Y`febSsvE%?)kX7EFl+4Qs>`oZ##%NXP43&`ta6;DX#Tzjb0*6`1nE-7sxb3O-dX1yy zu_O?3XzP-dT&;Vpw7W5$R1(;mgdK^k)68cO`m8O#5qtH`dFNb4xK_%PGhumaUz|Z? z)t3L&WI*b3SahKt1ePBYlP06HW$K`sX&Aqx_D~*Yl1HY3hhoD++6ogcm=>ek)osZD zzJ3`D;84ajqc8n8mUW4xh)Gm|5rDB@7!;1*HYhc{h-t0B8f+fZgot*( z-ua~zs43WG%IQPldD+UePmp~W3`H0>=G@a7tSZ(hIy+TsUe=q>C7*jOs(oQc6_!oh zl!Yi<#?=N0)#5C|w%JqNj!BPub_lR84v} zj$fmS)sDoX0^u|bMsvRHq}mBNaGrWg%UVp9Njt#Olw zZSH4_#|qa!2iFdnrgiYt+|wE^`~E6A%@Ii-pg?KUC@j}^O~~UFHpMWsFmj`p9K4Z@ zJe1m{@!H(@io(s-cs(a>8*bMw6)s$w@W}Z2-iN#{F`L$B?mHKrC20`J??48#9)_t> z4j@pNehRrKFW|s#C>ZF=OHdVjiX#}PkzPa&O#&jJt3U8ts5gX+yUV-`G8OF+@TBV! zY{EgRP9UxYOZRAFc13CDOaOxW?hW(9XG)7v+ULRqv>^o=vpk&6?O(M|wRj2GXH; zVGDIYF}K&7HdQpt{re-A`p7! zqX!>m)mEGwUmjhUOeUiNM1ia>+Ps_2we`TpQ)F7f`_q z*Q_}N!y0{#4bs4uvkD=bZw*nN)S7<2n@_b@I5%3n)i)|OaUI0JO`Z!2%k{Q_m>fZP9w7IPMu^N~6q zTwJ(oOTHyZOtp6l&3VHR{11^lB4#I$X{ANYN={zcQi@{tO`|>dMB2(V% z0y=@@K*v3{(mVI^89Z-iQ&wl>l8^%TS-|#3AE2cp4rnXE-lU!%$U75%TT`a~P6s;3 zn-V4kKq2qdUco0_I$B7#4qw+n*3jo{6vY=$7+iNSH7?6GJKL#kSnTyvr6 zhv?STmJL#HyJE`BKsUrOud9)1MhbHyv+&h)p@xfe2tmwg`K7F#abZ~$ytve^)6i1G z7=)eGWGpR?EipA`D7?6;G8K1r=%W4XyyWg$3z16rm^Vue`|!GQz`7zlG92dR&LAXdZ*R!*@psZ5r-8+{`0%^m0}bPbXq z@4X*+@4dsbHcMh{QWAt>YjYaiK(U&|+WGJA|GqEQdf(@PDvv-Z*DxPu!&X;EIq^kWn-M|=<2CX^(mZ{Gj-4r zq$1N`Y^ee+DrEM`1d@>xH*OF^It~X=xQVKnaZrUD=>pJW4A!7U?WyWricQdOv@`sa z%59LO30H06mpG`A*~Q77Z(p^51+Xp4nwNQUo+5cn*yDmZ6=Y?8a1@nODY5oByXH-+s)lSlQRQi5(4_eeh++ZWuhd)cVXS)+uRs!2 zQn|@WA*Ed#u>_8N!4ApN8OxLP+!X^m3CM_0Xqsu*9G<-!^_+W81u;$`U?7a8P?G0{ zs(2@O6@z%*+T92qM=Be5L-M641$jF-&}%RY3ppiZK!Yw)N4j)13Cd%42>B5(D}JO7 z_Of{0lhH6poIDDVUUu6Pb!YiO%BU*D|HnxfP(qDBu84f+cXFc)s+nf z8p#{fLZa(Zg@{ED2m-$dwa$C{^pWwu)DWB#=IXeKQ5sT@nwK>heq5#?I5n5Wuo9*N z3N8V`Ej8ahbd~|T12jG$gIo&QPW~Qfk4lACL1+33+-ReaGclhyQY74?WlpE$KvoRT zCNqpX*=OiVtmS9JB2zjy9qAm0p_CuQ)(bk`RvWN+1m`%te&EU5NxsYXeRl{hgUEqIQCoFuYj@o~8G}Wzu8ZrO!gjaTN_Tv{@FfUhUlGnwEacGAPTNNTb`I^!5nyG53yel#yS$fYnbX&Tz zda7x)RAY8JTiAOWFTB9^c)h?>nNI_kL`x>ARcllPL7jHOYz%E@{HL35Ug=AM7He6} zn6I>b=gnnM>x3!K8P9i}yYVgq-=qvdO93`quLqrGQ8}6;H(9!4zW{eDEpS8o?36(K z*WgK4{`6;CWm}(F2XhPxxz0HPGz#bdy!;zetqT(w`Hgbw=6%IesCEaoxi(H&@#2;O zkaqY?qvL{G>`vHLEbr3gUcz{cFnYU4OEdf9Qp$Wf?WaY&kEs*gqFi)zp+^7|dP;>s zi)s-BI&%^c48g$SGCZCDb8n4IQ)gpQ52{IoN6;lvB1fDfW#B@4w_Jz94}gG$K#2fB^=vr7eE5)nYhgF}@O+6!ea3}SgW9Y5~KSRvs>Ky84&lvm&0dXp!# z0`HEPP!mV7ax(uZs;|^^*4`1izCH1|G-VeuFR^ta^T~1i6xj2K$V(0I9RN*Huja=k zS5qnooyYI-zJTfRM#*XnPh8D$vL0is=#M6F{CQl%M}?)v4`$k)8|{hUL}z3r{TN7( zd-Y@`?sPM?4^>vwn`IEztGru-0ZSb^^$ft7MH`ZEouFT6%ghmp9_xgOjk&2v?l<6) zz`t(cYwy><*|9h(pmmZJAg+|?M;fl2UN>3aMWAaqGpO1J=U)O4n1`{eCb`(OluJj` zoI4OtA`ziL#E`%bbn;yX!iR53>GYVzY72QP@$@-oP6*-2A9D%>fL<_rswTx$%KG z8yO@Uy%2AODa@vjeC>=@4Exf}jpUxY8eqqqaVH9TTfEXu_E6a5r}Bmyw7#q@&S!07I=H+#%)~wm^0%aIYVy8Y|EEsj+Np|Nn4ToI{Z7yU@%$I-NGzMX?r0= z6p8JzihUzqVFTEX$9fa8A=nB{|JC84cQSgb&d z;`WuuUy+_^6|&l$`J%;1I|2FwBeoYWOLKLwcDjhz6VgCyd*@uyrst8xd(^_XjEaL^ zW6G=A^4V0t?kVjl-+tpuSyR2lA~4!A0|z48JC+}biebeEoaRXTVwIn`$0@`UxE$w_ zQFr9mw<$!A!aEZ&j*l*n*Z&VGulcLITw zbhta>Zl-{Hz#A@XTHGW94XaX_I9rVXP#qgm$4m#9?0o+ zA(k%ZJdr5PQ!?ibZ()HyfS4)lN7dVS6LVnA=L|H9b>MQ+1JGAGXM0h;6ukBF{*)>M zFwdkLnEXO4yE~)YN#1Tkqnj;nUBoX>f)L&lDA{DC5l+S^j!rW*MjYc3NSK>OSHf=7 zdmt>c^${Gtp18;4rz-1#Fw;c^Ok>Dp_#)*d!rkIZTht_lK3+fcnq3j2+(#l^nhoA6KTUY|Cr39A_Z@^B;5m< z4N#X}b^9Rx>_e*AVouu!ASnk&NIEiesg3V7bXG@|{ZI4ElpC~g?v}y?xy5(jEYDWK%Ts~w`qZ>PP}j2Tx_Bo z*J(mpR;m0ps4@^7Bg+Dxi8Aobn3ZkbT~Pj>!as+Gi51SFmO0S##Y2^7Cg5Ex^PR8= z3sL^n#bi6$z{0gTR)<*bi7&xIodm^)|6ESU0hq?b02ur^N{fmSP)0SBI{UZ-Yb2i((~5Ucm*an{$3 z=_@|ldR^8wpmh17-~jf2+eSfCn5RK>z$rQ5Qz@SFMz)N?8!)Dg0tl4mN@i&by!M7i zGV_cWdsDiIAV@Lwd;!qhDJ7ni>^y3+Jg7}v@9?**jl{J~iHjH%39^Fg7|0qm;1W}* zQ)u&;l0G1SJ2GXTr6@UWL!6NuYj%s>vSlPNP*TP%GN>MU2^-&Sd9`r?EM-{Q0`HC~ zrDOm@p0Q*i%NQzYtgLXh7|(CQ8{X^mqm@BPY2^n~kk9sR1H8Al_BihRS_znuR0)NyNG=;O6 zq3{-Ks8k3rhoFuN#vU^dx1sn(wZw5(MW}>JV1q5w4BR+uWRY zNan!|DnzH-HDd{tK?8UtJ&Nj=S8HxBlhpFH2w;6beuVDum}pTv57zm zbL|5IvWQ)(AShB7oEfkNu$OUv<E=` z>!7ZpnBUg%Vm8}KG-mkP6SI{$)|0ljMbfWI%*{-`-UkJ9>jsGL+^DCoHeXyRk(yY9+KhyG|*9$8+EXBZ8a|r_io~%t}2x>u!6y z!&J2keypu?LXaBNs?#&YNt{Mx5@VRma{p#@+Q9r0iJCM>t#)CvHgHESo=dE>SinP; z$`lklRf}y-AGJ)IjQjM8-e5h=JQ21Iho!~$x;z2eK4_6)gJBV`12S#Se0GssJi_mJg&}v| zgMWM{>a=IWos0}`<>FLGun=P6#*3JbLjbCtl>m9(*_j@V z>+G8q+2?4NmXDJXKD`;I$lI|1jwz*uRUpp-@ME!xDj4L)p5U{AvkOcD7HeSd8~-cU zNF>JQeyClNbh=Fz;|vbMWC>V-waek6kv!2TAu;`)H)|gqXt32$*(UIkO3H8@V(UOF zJKoctNxwTO#{4v*t)#^6%KNMhUNwe(E%T;EEkyQ3EynSMu@-UayW45XiU(r7$ygq< z{A`T7(9n`2@6m%o(hB3A;KNQFa7LyFx{mHm>oT#mnLF|5Yn#|e$RPuVMvIk&ZI2gR z11Zi+$?J+YA=ET%ggB$s;j_$@><~K(Fa=bNa$^?9dK=$ zMMzh5;JfLH>r|o*2qKM5iCa3E4Kpw&cJ4&0tVz=&k}qa-;%V6m@v2jxXa`qUv<}9L z@cC(nc6YcdxdF!ICr+R~c5m(Y!kv5@e+1h0bGCLe4a(Yq0!BcL8b2M+7Hjj|H(p&_ z#S5QnchsvXEC52ykQ!hPj|4jTyT{@N1{GyiBIkSBpbN<{sHl`64X)7-@Aywr%9(Sm zhp1a0XQCZnXY7Q{CgL=(&GSV_f%qnD%BR9p7cI>NZfCLNd=rKRSL75h!64xY2fMe#V`aKv8? z{LU^is0{y&FOvlb90XcrBeLS3i6vpN>AM*t9?0lvorO9vSlAZr3UIB7!p5jnox0;0 z@jc)>Hjsh&;J9;;O4TJLvXs!ZX6zO5R(77XYZ6Tn1kHPp9qSXPmC>%92!qgQZP4a5 z)zOhLGk?do8{Vr`&N9j;9Ll`(F*V#{ro|{QKSA%#kbX-7u$QcJ(qBd}Vck2F_&%{z zH5SO5)S_eB3l9#C2 z06^EaCy;0a>M{upGW~WNdzwx(lu=XAFK4(9`Sh%hKrr=YtK(4Tvnm9iGidKxSqO7P zgT1zOV=s+jE02(5v?BltZ-981IhG?Xl2RrtC-YgURskF@E1~eMmvd#JmF2{ePq)G$ z;ufsh&OC;kA)Q1tA7BfDwOMx?;WnLn1Af!ySbN=mM7HVmJ3|3T+_aiX6c6 zDSS4VaC0LGGJ^7yW~W|rBgb~RFJ4|rW@W3zV6K7|+6O0ctGy32bSGb4U-tTbd?PHW z=&Cf~d`?K4-3Ra6jhBW5KBrrcD6c&IU^ERESug03vn*MS&OR?s12j)*ddA|LgFI=D zRcDq7p^*mfwh2o1@J3f#d?SoFTW_I6HJb_OpWljQl6~4)Ezoj(QGpgf{Fs)7_Rz48{lNexelDU}Y3A+xSrd{@JG7K;j`l5O( zKMSiMsbGTJw0#cG+}mKuC4|%Dr@UOX)QgvM2OM68MyZzs($T>965z<1m+3|oz2+e- z0~^J5{375=5??zhQEO#0oaz=VS@+@}H`89)K;Q-=sh?f(1UWciR&OZ_4!FV#PiF6h z{nk$B<)j=fGEfrYcS*ek;RU|K%I5TnR?Hn`Lxb6ogR#O?k#G#n=FKysw|S|-ik*5% zbGA$pkFFbMxTHteUFpI*E&XnQeUUWadl}!iL&^d_h$fqzq-7$vfm|=*w+M^iq9f>Z zidu!>!rg_k^6F>iGc%i!N##s;fl-eT@wkXxn^Ffa736?;Z?88)Ib&#gnD=5Kw#ipE zIl?16h2C^*xN9+MDi({y6$Qdg!gQrf{T5V8%X!YEn;RWm^n_5ri>J{$D}?x-DNwa( zI5##2ZcgVdvuc3~dpOm*SGSX%>Y5-k;o|~+FY)5Wh0+RE(h7?U<&g0<$9;SAM#3$& z)rKgXtERhOa|VY#kTj3UgmkTh5eEHsoMRk){^a4uvj83y68SHm2bYa93DAPNrletP%%(UJ?fgTZ+O>fuc&Ui(&!F zDzjj5Aiu4<<-z(;=SsZYUQ`y4B`e4n2w-R@7X{k5@%Oucj8jPDMUP{7;z+jy=e?IE z%=2y1kw~dl+B%11Lrd$@&L3AG#jFSw(OQ)lUf_RC%`WSS)j_+#SZ!VyJyl<_DZtT0 z$hhK$x70^+tXDSBukFz9u~R=5&IMkaKT&wkU^_7m9<$L} zIM!eZ%|g14iJ~>{*%wD@tNiPP&v4`xA|QrxjJAW9wK8?0D8v9cTRH}Q6eNNgCg|u+ z93fS;Qa$0Vy@NPLf^I}=@+_R<06%6L%hM?*xumvmLDL!Gd{vGp0oi5vqtKjBstH`@ zsWGsiTtyX5reB~{RcAZQ`xQaPLIuQup7g%u~D_d`l-8~E@HX7;v9#Z;bhdsuc%p1ZnBHlLJ^&B>A4jE*mOg0qqJXu>H-dju1EDooiK$UFn3#C;@40IA~DQ;V}aT{G3!O5D{<{Cs->;UyQ zI}DDJoI#~+icCg2r1E`6d936KXL!#FHs1#v4|qnmGa_uqhGo7QC%KzH*>y%RDETBH z8f$BUM_{DB#%!$Z=nNU0_o=XbHn9pF=6f|>K$_7W?u9Q2@H>GcbyaR|g(Y;xIz|U? zV%YJ}cA_*q!bkd4<4Z-rZ1k!fXuu^>wHUxkwQFDstyaLoW8fL;lb3{1bF`O64(mvU zWWF%LBOua6q5qQhI; z4!PDKZTUvhULeE?T-!x2Pzve_K?p8Ziey=YS?f~*Y;K8(M8E*%pr8?=d6id!$$cPk_`(~eiL?RQx1qJQJ3)sQzbo`-6^1yB=*@w%r&R?4YN7y( z$LZK6I?y$znM7+*2)4wfNvE@ZVO_xx4$2Q?wAB;2a=o)sSbPfTqkd}{L{A2U%%m=q zz8bWA9_yFk5xj-e+qUYbp!mJ5v^$OxA&k-!X0A<-TH73n#wxN<8o$N>mjI)))`h5t zYwIi>n+R5~xAI;r^fk1yA#p7zf#Mg@AqHKVZ^WnAj^%r<`{E8m8y3Nz@5I38^5UGG zZ=WM*qR(9D=x4za(4(_if;?+_N%2%oq#$6HgSRX>(-+yI1thYB=E&(0<1Yu$PG0oD zGGgJWXAvz%3|oy4689NrsAI*cN&sm9oIw&ht$g_}^95l-VVupN+%~?&q+r1Uq@R7s zQyU2hP7gWcT34Oc*5RnrOjjz7T#HN1h)y(y`V~N!vc0x-t*^W$=Sa>WE#iq962IOS z2WeCyIJx%_ww)~f9Kh*Cl-8im-N143jOY_%8|1N^FWJ6X$pasiaj{ilunvgTImRjV1bW?4^;cTE%E)H z-;ai|R$vM=-K0Uo4%pw$v=UZgW@01dD?q&v5lm2CX*W8N;(EKmwBA!Yq1J-GfkV*l zQzt2_!_dgEK9}%jT*@r$t~M8HiQW{*ZCw{6Y#r+~?Tc1DyG#l)zFUoe5#s0qmtvXFl#}^WLx@txixefc=d>5?Yo+ z+|ow*gTz-QHU80r#aX>!<66nQiW}l$)=R!MtVOe99Yt2pNg;dlgn~fQF)a+tfsV3G z9sL-{?UmQlB)+AZ7zr!+jGHqiW|Z5;vqA!E@1&v^vgQH+xh$E``*`<0@g9(tIWTlp zR|V(Pbf?4{jUBDc=d2nBwiTP$+H*GUm?O@Vd~x=n^p}U$!&EUrAH~%v^=z0)ORESgJFr7vx9T;=g`0#B)GO>2&Y9 zj&eKFy~^USv5|>0iPBPa@mpI(cEoSXtud0N$3(yRkR>c2NeYfs$Upcc?}4~g`V^p5 zHXHj9j!1o?Ts-7+)1K&_Y_`rx^KPC>%g=ztSF{cth_$liUP9yC=8U6^>n+O7wQ~#(K)rb`uc^%>hc@=)O8D zf)!Juz&qzBmq-O}xjx!@+ zY-rMa;1eXKtlImnpb5S84XY69p8`|XCfpae6C4UnYsuM#3E$0vxXjl@qW4& z;|GBYW!uB>k;W@kjzwN0nE^f@Iyiv#i@EoVL)$m=HlD;XyR;2NIjiK;bKt{H%|I+q zUku2}jWqF2MfEJ(xvPY#Yt*9MDx%eJA*olPJ1Y=Dt*~_q;&V zGgN)Ptz{Zx&A}gFyRL;LKHqJ@=HyHRytnSMH=VguyS4$9K~^Ee7CPEaNH5z;iT80? zv6Y!lykcHM(QfSR1HcLlmn8`-4vmHVI2WcwOZ`d;xfV~aDS`i`j&(ZAgL)h9s?6o~ zO~KW)d(8Ki2BV$e@2$l<>Wv&-nePGp7F(wgU6DPpRv(id=8si}=7D z{0~o9SS@)QH3S;jBziV4RxQnTeN1aWTa`?r4aQ#?e)ohW$swTSUd14>ZhCduGK)%V z60Ge{9z!VpwiFFxz9vN+8^D|lajvI12Ajz_Hup3TK9Bp&KLylovZIL3dqm2&k7I*edb!YfzV>626SYyJfYh#c$s3q zyxdE;R|UAgr9lu-crk?)(D7kj4D=;c79tl(uv^N#E7M3LxZUM!re7SRp)ao0`-)?& z6;4R(k@hWM?nzpZ?qs+!J5Mc;D2e2j^5Euhk}1!y;*{fohTPb902iTqqHcu>vbL+I z{-&Ea&4xiWqtw*%wQ?a%)GzM_QM4e~}L5Z_Ku8;KNQvK7fZk!zyHHOg0~E z&e9B%YV-C)9@0{^au5SEmu2*kTLD9%_3*KjLx8P|&y57-YTGpnNhAYKWS~go665FO zFz`6&h&?54iGzD?OsmAn`jjJ}WFVeHx*bIiw~cjS(cYqc=TcW%C*G&)JO&UA@Z2U@ zvr0SjBKSR%H)`KxnkW=k$+yj@@zYy{H%-T$Q0FwSrtsAaRF;Zs8AK4-7SP3ac)?0mg1yhqE0wEE;25j7&d5#l2=jZN%jwVq1eg};T9FWE5^ zcbt!Eq0hhVFx7oJr$WU-&vD0{NDCVWaKB@=y6(2?eHO5~N39kI2Cp53cdfHeb4$T% z%27l_Uq@YyT1BoH*oG#c2eXxhjj-`G^TnOL0KzBO#5y#L;2mnY*d)=NXSh&@mNk7? zWy89}`O$YiDcK$gTx45%t?eAXDYGn#bOzmq-K}v=Z~)%ZtSky}Y+?lz$1ck%3#qzp zxRe&RrxcE@JP9?L9I91#IN|*9O}bgLU>SOHO@h#kVp3rR9IH}8v?GaB@SSctXD+PO zt29`Id1AujMV&|kWQvg}LS7w*F{U6Sr@_OqBZAOS1W`XWGv-2GYSoP=a3X$?DbTWe z?gx@N*TUWt9d|ybwS3nRnsyYvX~rtWdk?`>!JjF!vNOzV0h^IY^vQv;&_Lh{0829= zL$;n)8!ROvb{M~EZX=z;?5G&{D8vP+i0Yy-JK_Dco{c{MT{}D%?Q^9yMl=KWH2yCi z#zbSwV8%g(C@52#PMP$XdG>HWn@Z53Z<)8OCkS87Pefi}I_wxR!`PaU58TddP=u#q zT6)wKDR5>cgZJE=!c;kAII*!^rUZj?pIKvj1G#3lQnw^&;L9>fC8qG{aK3B9=WY#n zGg$Alv+684Pm32fY%)nU1*KH-9P_}OQa*0=utoxEU3IXTLJ1Y8_UaIrFv}05X1o#T zCho82C<>sB{f}2;oo&sk%yu-RF{F@7of&3+ygM>A(#gC>K~>F090_T29(x=r0lH5D zPG7UmwRx-ExpGE?DhAG+chyR@mO^lvJ&sX*(wEv5Co~PrB2@5M74BXfO#o9stiKG( z#~$8VHxlUO;H_)7Zx~%V$DqTCmxWjXA4S_8k{t0L!ecb}>RbaQ+XQS2tr=dB%b0V_ z>2QxFS03V|COsH;EUmZ+N#}SH95(_kw_L3=-wscdR|x`?tki@AbD%L5)*G!6di-Tp zCkG4`i^j!80S$k7%xs#yI`bX+=RWfteoPuD)5U73U}9h@Sa@c|hHizFAc;qr{ixot zaV!d{!2(#}A_bFs3T8K~EvB6t$e6~ay5*~j&dCucuFT~Kb~RaK@!^uoydb`gOq$I! zSIaG&Dnp$MYhdM5#=*D*q_bF*8KXx)(ySFdWSkNU4IO~XGp}Uc_%DuTc3)?3Z9MJK zMC9ZUKUcEN!F#C<$wOywiH>T?-U-T-JOxj+ZKqz%CV-O3H6Us1kf|rgD9h2Rl$KW- zEN;?_!PP8`#p|vqo@JaX3k+~VVmtI|8z-;bgaLy}a_`(<)Gu4j*7(SIahrGK%V9-x zJ7q_9ji8D#mg*e}g?l}H++JoV9`88dXL9KRlmPs~VWo&1aRq`6jWKBjM17bw4&?zn zuq8&}m4P4Sq_Lier@Km}BDT#vTs!F|xb|4O85IvOwFD zn9c^Gs`FL4Pj}$Vs~DhdM9rm<@q&kZS^@s1J5rzKj3ZB(%n|7_bAWYRB)WWn1rC~W zIv#6^6Hl=^A;P561vzS}tm>|sGG~SgOB`5PtD?fLBX~l7VPEhSn}(3FPZ@5>-i_Cfjo?_d*kV57FI?fz}Dgj|DwR%=oBuW|Z+q>7l`sVoCFaPBF@S~vP zA~-mGZL8gOV#Y;6hVTFf&mocXsmP8YBz0$YHBD}>nf>v;R8Z!r-J5O7HG~fN7>aK_ z>_!;MYy=&61b{lgLM9|BrmuhaVZZyr)9W9+T|e>Hzy7Dzo6kS~$-B2d_TPK`>z}{d z>&tiVzxq*M`jdP8tMC2#dw;wA^{@ZVyZ1l-@WtBx=_jv$`LFf&AKtus`}&9ZlkrJ< z{TrXJx1arVedd2Tf23dj>DwQ_efK+WU;oPIZ{Gg+w}0;ofBl2M`mgv)e*5*W?RRg_ zn=jwId;1~1{*B{b_}k-e_nW8dq*<*k8^xpUjhVXj(;>ivnI}ao6>bCXe~rE$v$z5; zzVL%ikTzMukvS#b<$3O7u(_ec1>I?Vx zf8y&u+NXc$^{cP{tbdt*x%fAK>-pdLv;W5*u{Ur3_@{s9_kS}a8X0>TQ|&JOj-pFO zmkr{XU!@(W1=xqf+k8mO7<@R^c2L1MwP?$y4dEQ7(Qp6XQpZI^d+>0$RYtzVJUdOqk)@J1y*;#Y)`dz^I-O^GkJ3ZBX0ii-F00s>Y zV~<5&ysSt^x3ncGa9La$qu;VC$j_R0-EfY0H_TdRBT}C>=qVX22k_Dy>e;Pf zqG@^T{rHDoMY)iZUGj}?h$bsusD_gG8b`Y`EhvbbJ6rU#fsj-=i3m*ZtYKWXGw6a< zlxsv6373kxFC|wFDI5H9KqM7n$K=;YLF!xxU9Vz`c=rqK4 z7~6NgpJQ%BHGMEs7Kd;L$XFl$C_jbfUQQ}0Kx~+n1J~6+_zT<-W4V2Op_fR_S8y37 z%(;8P;@XAT;^!)i)Dl~W!Sr;nmOq3v%07{X;g`awJo9pXP_M|;$3ONeZdcSCCfrEB zXWpP;s?jUVS{D>mI-@Cdxr^52p*}_P8d1X3j&9lwtg4k;e9K;B9;{WUdY#r|fuP)X zhFX|NUo0nzFm!l&{Nt~p41QB362d}Y2XJme62-zv1*m{y&WEk+hOQBjfy(M`%nJo? z%V~!at2dA`aLb0^*e%>~&KPtrY>1wg0alcSY)BJLj zHG}3l=W5$eRy+^Pnrg;%BoO0m9vr%D-reWW*~ZYbQdzhPop?TxXuVqOcGi`JAWqfh zkAFJuok-c*FgIg+t%T-*EJ@ z#%ZH^-^Y3?XGc$Lq+5q{$}9YNwYPR3|IDi(b28+w7_7H+Pt*c%LX}Y79_q(ddBS8^ zErN|ncjgh!L*(|LuaQonmyGBU$pSSFXfHFHLxvak3ie$b)VPDs^~XQ^D!Nu~ z1;h?%zcUIZNdO6(6vGnBv$j^lu7PeV@5ZU6Xg@~|78#4oBD;fGd&#Yh44PsL>)<30 zy-fmlVDjmVH#d$sH z&8qkTp(2IK+<|k5{8}C3FrHt05UMeONs@Y6J57VIL~)Nqc~=0~JHz_o$*x&^;OfttYrcJa!-2R=(my^q$t?Lu0O z+(oaz^Q1!|uIJLPut9x|4n^yy_~tb^$$tFH@l37c2j^jxMnCzKL4=y95+zf*#5qfA zCuq|LB!Dq+KzP13Z*G+Vw@S@kTm@_eBSqWXSMbm^lp|x1X04WwN!L;M;xT+5VoK0 zp6If4xftMRJ?e+i~r(P>bPm& z3_agMT6vpAz~r9&_}Al`N|UWVr3*Bwp@ZCEa4UOZN_b##4o1f;`|lCm7jjq5U)yGn-yO#_Lh zFA{a8Q#=SK`hiN1zim-EN3#tyX<0bq&7y)(uK`Wt-{wBS75&r6oNm8)9>+b#XC517Y4Dt0K3~k?8~PdKX$EEo|gH5 z)57r6%=>B=3KU}>%6|Ri?OBxmJ_TU5cnWL-CBjZEW09-_6Z_!6TE%I>y=G6ABR7bho`ph-TUsGHr zVxBxHg=~t0XX!rKZFQSA+2{?ZDmC8s7+6BsUptpnUu+1jj zWVuI5xty7mlthBQFo@7q)m$oU_MTTro5==l`>?&6rPWNC+=EX7HHy* z(NadO#N+1V?O&0~PM#F2TcQDS0*NnmP3)TJD?D)tF-Rb+!#kWg(hwu@?4C&0z)XOc z*NZFzKHg&mITr6TkAL^o({^4WTs5_H2hu>fyv>7w7>5aobCf4?xb~#wgj61{+r5{T z$YFB>_PKYzZ6OLrS8TZ9N&ObGioiZ{IV9ol;2D1Fx~um4`1hWkW@trX zGoyHV803^&Faz^eCVpW_CE%_KE5;KDQqHCA@gF>0o#3o7)NWIj|C4XHcT#2-Qd(|; z?`+j8WEydNBeRCzam0xk?K05m08gVR*sdQNCtu8xx*@Yygo`+qk04cRIdI!dHRSOh zz6!7=_+D)l@5UXO6*74Bn)AkkTx(tHj<}WVNvoV}D>^cajIAcny`3nXgzsiA%g^-4_z_5ztQt)6vEs4-X-=p7*KT_by6SSSHDnSN+{KxSd3HX2Z zleAHo%+~sjowKZ1L7)ovdMlCUN)m`s5LCQ;ScR{#nOX2jYwry`r>wPS(gQdzRqm-b z(FvGHV{H&Ljo;q(YWDa~el|I1H32*2IKQH;kcki3g1S13%Sc;&%f%bL)m9cxP&g9z zs(Kd6ZJWGV+fiPG8J_x#Ft#6(DFv}fCw{XksQp;JmR{?A{C&Um>0kPt4U=O~`e%Q5 z_tW>=|JeTg%_o2A!>7L#^W|LFjbaG6qm;#Ll#`ipndolFYSD2Ks=tjqj_S#Am?566 z^$Pbh07mw$8rXnp?U zkH7SveDV4E(x1LxQS=qVVY{q1@6sZ4rH0EuGbL$|jes^AL4vME* z(%L5x-#O3siZ4Aqe!f@q4|{##AAk04efj*lf9X%|8`pjPB>miV|Mb_t;C0W%_1#`^ z>ce;5XCK~H!zoGkf7Sz@1}0|8ei|bJw>CS+cWDSrNI3Swv+TcJ?2iRnLHgkV^MZ0Arm|#sW zeMEqvr5u~tA+ffNQhnb^eV^9n2qq^1(PD?c39wz-j7!%ZXUXF~k2k=EB@)UGtXJP_ zoaWP#DO^>bxi3B4Iv_-bzN6hTCC$?rly^q7QzwJ9ji$I#MJNJV2Sd17$W2qu=)X9z zmcz>}1HSIf^*;WKI6dPLy+KziE#C^hWRTt$pgijo-BX!k<5|}l%YbGD+xZ$}XTsw+ z@L(aNTGz>20&Naa7c7$i&Y1YjIcPSb;j_4wg^yQEN^yR>Q) zyg0J@Nd-mIWa0$JlJRi&eJR(2IVfn_T6z4}PZOq|qFbB|`(T;AFwU5-VOk5pKd>9b zkng_Oc6-?>Rg;^*FQDEWg=dQ84GF{qAf0=j6|c*>$R+lbx<{`(o(>DL9C`RtAOFp( zCmY3#l3#W_XBNGAT0kIr8>iNBNWx>zK)U3dbednlM%;SS#F672f$rVqs;4a12;RmkMCil65i@z& z)7SHNq5bZ|Pu}czZ||GWzLBwd;ZN=xPpI)p`9#0=gnIhxU;GJ0orrNw?>Z|<;kKx} zjRIey7hrjLm%IYNefDU5=Z)>BB*Wwwk>{;zu)CrO%LXlB3n?@MDPYk<%B^2xjlx-f zopf#W3>V_@-^CM(JI1=89CKuGgU*nSZ%{{THd|$r;#RH+8!KKyj#z zYf?)@K~^}84t1!lgBKD!KUA*3$#hy;yHm>IUG%oZs82HH-pak$5egKavYJyccph7O z=^y8-`^oDce))S}_=m6VD!&$gvERS>;>*{+dA|Br|L1*0XfigE)T7*sWmQ=?%q!EF zaAv%ib*yw;A}~82d9N}9NCKlD-*_c#r&qN zR6*10AHH92Kl9gr_|O0SA96a~tKz#-;O>rKasYYbkhee}_{I5Vw9I!dJ8#&z<2vR` za}bo=Z*{bYtfLrBcw-KaJ2sBVly4bl(pwY}1FsrB&Ztw0KL3Tj^pErG0rCI*t3;4w zv#jE5K1z$OP6HEqck5*=c@iOCY!aADE!U6_R>Y^J9VLEFQAo;$BA6zd7vSI=I5_N)Bmzwj@ppUh9%@Bi@AAN+rLSNQrL@7?QPdG`g6i1qnz z|Nb9-{n1|(|F1vxfA=?h`h%Z)%{VfcNBFhPGqQV@ETGninMt~WMe|;o=}Q`vu0{u6 zvog4C2Yeig-cstObT9>w+$m|FiKuL!0)C4_6h>O5DFAo6#{#72v#aQ($6C*>q94Yz z@%anJOMhnHc)@6&l%G2SKmGOhZrB2awH8n*#lYdVdd-k|5uT8ZA-*NgPD_cpdTVVP zUCMgB_CU!-SN|r)W(d%G%g6Vmz+!_H=1v?-WkD$QC$*joyG*y*`j%JPmy9AlyVicy zfA`IoAOGmxyKh`?Fa5dwnL6Cdn@ZuVvlUA@)6c&xgc)rdc#~&j^wRWnJMd#Yt4xP{ zH~C<|TY2XVO{^H1&nt(>PScypsHaVut_Kz}TScjjjbWwP)P_BOLcVn9^x5_H=YIC) z%OCyJKK|+Z&p*EJ-~Hs{&)$4vto+iS;J2((+Ou^^`#xTIGpL?Y3e;siTFyaGzQC8a zJIe6f&ODop*HR-v1Xp3)9pDAK>Ju11Ie-=^W$-*>&;?9W^_)9aLCAPnd(S1f3mXkrY7njaL4yZ20vXZ$D>r+u6H6&2E`i*KWwGz7NlnMt=UB0 z1m6&q_dX!$a><^O=^fdUYa0a6OFIWhb4~N)$NwCAjJ^c*N+%!GmT6gmOJoKe%7wk6 z-7qXyK-^QBF`UZCH+RbXl#TA%sSxp#TB2q~f~hgDm(#7$zh>A4Cne8}AMKu^L*{t= zFOi^5aIaP&7fc5ka>+T@;gExlpO~D>-R%7#3MEJdOe^!%An4ekKwO!%=Cs!JF$vX0U{`WYc-a-uC$G`6(P0YSz@- zHDEVrw|(c+BNpn1IKghx4{ejwK?B& z=2ksz%M|-}Kio-mlygM7I-ncaPo4Q4FY-iHDJ2QDBkI`A_zusq^Yf$U3%8w~Z&TiU z_V(R-|M+*lW!Ul3pWHW|lln>eq<-x=`SjPn_;ZrBZ zg<_+D0kisn=wHSVO_d9pEoQ~RK9pC5oM6RiYG+LjX@Xo>dV)QVNDHCQMt?0yAAjRV z-+iJAV!DsqpuZC$$)onI6h~9y(qh#PEI+7#AhGI#xPS2Yl47P(S0UnQzOeEI&(+s{6J@1Obaexttr z(jVcsO#9NaY2WwqP;$xzMZ8i60j2xSl_Td|dUncMw-inYkZ<>tly3Y9Q();t?eE9gy+Yeu^ z&p-F`@n@gEv-SDs-@t{u^k?`j^Oy8&{_-7Mdj#Dtwn3MA6r~W!e%ap8gUjs`7M@6R zr7m!L(N)u0XhV@nfQj5Cvs&bkXNar~^67%QzqeI8>O{PXYQEeM6#Wsr$56 z`!z1rM@*%kHf!JU%OpaB1N=>i$m0DJx=LHNwU*mG91Z;NnxDsL$7h}CRLy2<%B{Eb z%8?Ny-vuY@w&27%zmmk`f^(-4;Fw-BxM+okF3qy^=X;EoF7Q9QO#bMP-hKFzd)k{X zKYsJ}zWc@tRhmYgmINyj(zwqbw|IcVUMr`%$!qBc=-!h5a z)!C&j8hHhiCm}Ti7j5pPeO;9Zj?&}}RV|nR6xR)g?=tgZYrvJwcZsD9U3M!Xd6#kJ zIDpSKk3l4S{4IX~SN%YMc{vFJR!$Wx>^kk_DW;d|5?v11=J%XR$xci60{q9Ne7y zu)H9LE=kTCaTr&SNf&ae8D)KDF-1b6Dg^3`LcmaM+E`srKVz>xMth!RdTET$^R4Tf zw|~t~-@Nzt-{_9L@W=M`Z|JZ6jL#?e|N4slSzrAdzxa0)z<3vg5kPXy?A z1v?T*-Y}<0YDDdal1(1?3R2!-9$D3Qd;A?AeGj5`e?}z#zIn#oqrlndM~d9N&SugJ z(!BB}Hms|!3YBV38MEEpDb9?v(sj;Fl^UC!W(#j>!3I-t5?A52Tkcv;J89K1+qBf7 zU#5%2v#gw|{rnj>l70~fZuO21mwC>uJ&nmN!2vnp7vVnCZ@TAZu7o_s=_`#citxwnznkKa@KE@evF%tGNt1GeYgZf^$SY1%qK%I8oh--f=#ym?3&c{b_nvjd>Y zMOOoRM3p?t?mZF{Cf%?a&Qwhe<=`y6&n;42g?Gi#r7GBHvtr2_}aIv^KZC7s)aW;-&-v^U1s zu4lFR_&cls%ZWar>eQ*g;_!DTcd4^F}-Vj6F=+o`~yOxDP<#qkrrD zYLW?OThsr8z4z+5GfA@b0AbLB zGd&}T&`1z;p$px!m6?%YvVY75A|oQJIYU+z$g1fX{R(+^j=X~mt)TEsr`NDs>$BuKtNyA$6~WKbH8t9M#NgrTEJJK&m6wz&{YpJ2BkYj6kw>ZOmO031Wra7Rac6S^;2$)X6oO6j{i%k`Dq=Y9j`E;id3m zgX|OeyX*&zxFx3_-fQ0ejO!cWjo`}W!#b|Bs6HpvF&VH@Da>y@fYl%7n1}+7h76&Z zx&qmV2yu>R87}b0x*S2w86!=@Axp*pdN5+-V4($rY^>RnrN!~vpZVewfW6#r{}28+ zciaCjy#38zd-u%lFNm$}%wsHSYryFfv`*Hz_=AP0Uq1>u*oJEx5=q>gC^r<`A!jVS z`3Sv3Y-hiEJP7X#Bb(3}Bdp2Bp1DH9C#^i|AlYFY^6&5d`Xl>Mf4}>qvR33RO(w(8 zD^vyu_Xh;N@Qq`#0lF~`ZY8_-l8*al1j0EcjGV{8`=>1UClMiwsTG=Oy4INok+2gg z2kmdWW(NL58Y~C=o`qpg=UOJ#~qa z1_(Y4krJI+RT|eE)*OG8<|9-Xy)S}TrNJKT0P+$1YKSPi{n^(Uv~ygvD&ou6+9i*V zl?Wt5unYd1Sc-Fz_NFgDk{W`z!g2x}qVo*kvKSeH)I{(^ooCLu`vKO@>T#L{?JIHHY>WC+5FcVrNcu6PbeFx&v5XgH0!|PY?zIprd z)t6s?`$WV1=#_iYfM}>@epdtH{m(ypaRUq)tnG+(TaCDlf#|f2O%v&nmy-+$V{%%# z*tN4j(*d(ma=Ie+!*?QcO$QQYYV0W+uLL+D)7Iq|T|QSdyxddW5LFOc_PG7IFFt{) z_x9&~3a8uc&%X*i4oD^&CKQd4;@PmXLDi^)G|#F+4SJ3u(`5H0g;bbsVji4tS!zEmzUkantpNK>Z`NR)R)LM@EK9=*?zv7j>SzPdHQD*HUA zZCu7M)KWm1_Gj8k%-dKuroefQPdXRg|~n$`sHrjdzIkmueYI}9&7txd(oY%-kWgBx*n`govhyTX+uiDp?;JRu*yv6YcK8Y5` zU-U_|IR4^KqQ&u-d=f2=zx0!6F8pPm#P#bhfAJ|4#ec;oQ564`pTt%4uX^$0Kj}kX zMGsQs(Q#9-8Gzw|Z7dP-*#I)9NF^Bqexte^_}Oqr0;jCofUX-et2MT}r#WGk)zJz7 zO&O2Lu~ji4XE(#ik&5y(#BF2|&mN<}t=P z)}WD$378U1s5?P#It!VgJ9dIe$ej>v09;d_>nwsdZ;YloZ-32)oX7vRtDq$kuYsuO zmowK$fM0^)fgM#1u09c6lr@TnC6w2&3!x{Pz{tZ;5ffN!Jo9a)1!5m?PmGf)7o`XO zi{k}0!|n@)v$T|ZHrb>bqy z8+>k)I^r=AFG$68HVnFID@QAkp7Uh&xsht1!@+-R!Pt^?fuE3*vxx%iRAQqO!1CuZ zz(ShG(;S%Vw(fWON2d}!qs)HwrbeZHU?nh*gjy$@*UR*u*C)bMyuh|nZQTtJ!zq`-%gYSOf0|0{0Rk014 zxUzG|>N#xpfKr?H$pQm+SWeu%`4}r7#CD{eB00UT?L!N-ApX`Dh~jk9HpkQi9v)|55oKl#Yh_fIkq~I4feOIp{6HIv?Jhn z@OFhg2JpSUJMh0<(B4#E3m+l&RiNZ(!&#tm0_-`%$yywtlG|VR;#07+|Mi!DC(Z;y zyE_)r`j+4}cJn}SwObX%h7~>0HcT>;+UV`do;BA>0zGGpcEbCB8sC>A0}5>SWqJ|g zEM2XXJJ|G_Fzu8qJuS7y2y$bNU61UhdQ+d+pob_~KIl1piH+L?hsD zzFITYr^>K8JNKsAhDx8%EVG@1<;>{5mrjrgWB`7BnbEh*R5d(=ottC0#))oo!q&Go zUAW+;!{#`Vq*)n&i1lV57XU-;9=G5Bt0)E9whsG~2nj7&7|juJzk==80+Jmplj)rd zr*#4kWi&G0hgG$+3OZpepxs?UW}8?7{QJ3gA)VZ4LlJC1CrnsTfxIO@i*A45S3kV5 zz7L@>fd%M%c^bC&I=D$sajG^zEhuqCHUgkjz#WXyS4{DKDQM=Qzzl$-H7LU?=1FY* zjYiZOxymxjcqn=+jx>eYb&XQG2k1XKknhP{`l~NqzWc2=`>WUQ?oY}`uiUf7`gUim z|Gf}Z@>z6gJ|CfJ`LUQ?uD(b^X?h_6TYmUzWfds__kh`zbjw^pENffyof)aIuk`sfw|IIJA+3ib1t(` z2H|1zm4C3^#gGJuj(MD60x!ghy@b#5t{oVmBaEVKCDJp5ay8_ifk-bKrUc8r{JRI7P37)zijQDH@n=@#WWVUjFu({ymP| zgO}~uJe+=)hx0-D=^I$QVp5Eo5eH|AS+MlgNJENc%&s=OAS!Df^+DtMT+`HsT!Xba_5fpbV2IgKRC+nBgD^>q(~cK!lm$!4(frs^ zKGLSk?Qeha3D}N58yEC5j0oWP1fBOSeZz(28$r9ut0tVy2m$Ozwt-wc^K6i>$1WrU z;G}|lBe*wc^=I?mn>WZ!k7-7j8IR&z6<6xt(bbTXG&T}O(w@jV+IQC)p}pe}C740F z0BM@B5z;9@+zM_>n8lPGpO6>~hp+@;LueDscB~bT(LiyV9d#-C5YcyYhv+Od`;pkE zx-+49k$x8PpTdmj^xk#>(+6^mZNv~mLxq`N-Tux?K@C(6zVH^w(UIpe zsG~HIJ=;M$p+?*2KMd};bQm%#wqFTjVTIhWE_4X_Wd+)tK=QDq`{lvte&n1+(v~_m zB!(g^YaUl5ZQcH^PoaZx_mVyO1x|X4A#aL18f6#2uz2Ov8|NH zn0&?=q0okJ^MjfiPWv@;2^VdNF%qXpN7LQ&TuO0YyUA><77I}ILesHTyVd>)(f%rWpf=V4I_i^d&@h1Rb<%o;p07=de zXS0z-ZG#Kauzr|xa%)O^ndAEJJ#T;Siy!~$2ZtmGBdQK7j=#9BmVzo|>Xus5vJM8< z)NS*^M%~ZV=;G8CV9WTl9#{7qXz6jGX$G`njH*=-F?0~64CXi(__WVHdn>zZJPEFS zbk_R)q4@R7Z(hBrubvtd9=&eQG=ln%#`hXQ`1z9?&jCzef?&xGa&f28(5g)}?p}1D zq8bJ1AIJ9A_hDw!Jtl;I7^dv0Xy>=aAe1f)J2;JT+dNv;WUe{~Y}!?!+j0tc`~&5i zPhN2_7ftrRW67>I0NRO!14Qp{Y&X6(1YP+|$`W$Ivme!C%5soRHnI zT@+-{QCOGk>5AB)K0Nv~X=Q!3Iqw~8f7Dk$ee$3^c)^|xNA7pw$RDCqnPZGCe#S;e zE3b$ZWmOs{F<8hZv)78D0-aupf<(Kz9CQIOY@Z=Gb;(%}v>prF>Wb_-&K9T%=fqe} zH=#agz~F-oFeCHO?eDvenuCsz%~jDxq5UOZddq- zAzJUi+~8{iD*{7~?`U+H6u37>A!XHf9;jE^8W=qF(pZfvZht>M1&y$P%4;ih&a1^a zW8g;I%K+h8HfEZS;U~HeQsgbIv2z3f5KTAlX}!j1X3f{YoUM zI})v?(>NQ+7JmB&-rpz>rZ)wxL0cPX;DlJnnpdivxbsE?o1q1poIIHEIe0e+Cv-7Q z^>Rg5RZk3r3igGhlH-V*1ziZ)bZ`g=f=y{2Kjb*+E%WvdUS%5|(il|g?;_^nnRzw^)vVF96Zz1wr35H!Db_3gt3J ziX799_uD`8;>W-Ap|?R?6hXqrJfPd2`%0eC7#2l?V(K-_n60DpimYc=5U>fzXz*-- zf9WCvDpG+YmUSK)aO&-FIh_VZBI^veWO!2(MlC(3uj%)-=%Z2EciZ4Ee)VPH+`Zom zAH8bNQs~+ph3w`|LT&vdQ5Bq)#1IIfCHf{&*+ieog1VK zhcK?Uxpv1OX*ERmQcSs&CHP}BuY(GlGMn&Uq+!UtZ~yQ|=vB^x=5USWjw?`2G69m> z$ObNG@ z2lujMSQQ1St<*!KPCttVj-HKocZ}MnbJsc7#LdhQPwK$+Llko{CJ#BptbjLhXZCS| z5ewoxX6xB^%kq1kav4U_Llz=oNxHPtaxoj!(OF_$u87j^0vlHuR|)RFFd*pUv3&a2 z({j(`AQb*(s8oA(LSCwZ>Q^4gGP6#=XTK^|BdUJibNq!j_4LB~=p}n1M(gAIH{Kt7 z_Y0p~Z554kaRC)4F>|%G5xu^k4g~de17W#4`bnIV?4Y}oj3&vJ1-zXvybu#Zjn#BH z{Iw^VH8ct#inV=o#DSIp(!hy4M4t1&jKA({dD(rrCo5$c667yI3}xj$8-ZcPBj-l6 z&S2i9&S)xc+OZC7W!DWnpX@yge<(LwfviU z^VO?A?di4R!Rz*On+834i@h(tAN+Cdr-g4`y?GTc&zH|3WE^VF4T<+LN(?S-Afqwc zK}s?5sI-4!BkcBf^PoKRZC}lNxJtks8PA9^do)~e=vmA{~4VVNmHS5coB)}(2 zJX+UXYR^KlKZT+8Kl%}L9YqViPay8A!&Nzy2=88JB-l~7S;50<;Clcf4Wnn)Sj`4C z%D%uUIo=_<#vZaxDOG3#BXup9@X2G;&Q>!gdJF8W1QK1ke@sK7SBqmyNGs<-1GphC z%H7ykuG51Xlad9_H9;;WswBiTpTdOHL)Zg>T-zJk^|-2HpCJrq-wEiTANMc#6*_6a~my-B<;r+jRJRbdV?hR(= z)tCA5+pk}~d-dk)*Uv?N&}t03d`p;B_H1MIUWd-o18r3{>zxh)z}kiV&C9b8yUu3J zD+9s~QzgSBVq-Q1?QN2IQ-_%m-VILc)6pm29oM)u4s8JOzkjRg-$j3X@FIL{&gPah z>cFtGCo(G$xCgzhY^3Mdsy?>O#@GHB&=7}gp0?3sA0bf6@**TdW@~yTf)DwWcBNtn zYcQTT8C`1RE=YN-{HaLpGucHRy=u?6UdNs5b$pOr1hynk7CVy~A_|B>;V2DN*ES%w zhE;9NEo6sH%NH*hE5vN#8=IqicFY{`mqEyBE_XnCdTV1Mk{&%bIFN_UgdmT*iqej5 zw}0{@G@i0IFsCXQR;qn^%n{5^-iF$2AszO%0_7ips1B!;dPDAvx-*o;KKUF2Jhf+` zi=Id?A(vVjkTrK{2y+Te^68PWHg`NF=SkenPPbFtYALL?(1S@%qqW<>{Jawa50_8E zEvFDw4X{Bh5Nwbw*O1CWV&BbKhYA{3Yr|`!9J7y66a}LlQwy_=B!WVZyT|<<`WL?X zx}F4CKYGcYJn-wz=Dj{p=z(L4kh5E}jmXhDwV+i)@Z=eZ2_2$8T8GYz(Wtn>1)}*R zZxFn+hTMS_m~XN|!=8TTlnH`QK*zTZ&=Znm)Z4=3&U7kRHbS?5>Vhns5}VryNh+~B zYAIr0w&Nf?Xux07Q>RZ&|(1H4-7d3l$Y2CHB&Qh)8`MglV;`+G}q(($-qdHc<SY#n0XAXoTLiTY;pE;+%R zL5z_Cckj1<_9HL{+di{Vu*3lB3X}(!?o)cM?uf;c+=z4xkNJLug2+*+R=38Qk*g zO3Ga_%z}9C#a(y5khI`8Bu41Nt2yw%CR)931Zopfwu?Mlm%6+csm9xj3b;e|+mMSiPQA15`@rBw`)HrVW8aS# zAG~DG^uFz`_iZ1f_dR$LB_e38cA6H$C(w=9j|`gC%K(f&QUrv|q(pDbYHkM2Wf-#R z8ZN+H?UmSsZ<*=W-+ z$(oHClDCqlgUU$*Q!@f0%15;$Inp*d&~2>Idg-ju5%5H2SAN|EC#Xb{oo+Lk(s`Ny zQdXWi?Owh4IXv)>Ub1KA>GC7}-aH*Y{~mbY|M`y+jor9=F20lt7cQk6!pY$=gUqhR zmWinvi#def!;plDen~Uldkh$ZX$?BdVi-+!w`1ETV$-Zmvmp~MS;8P%s7gAmG2`!eD*$^Mx5DVn9M%Kk-n>eZfHYJ^EiubLRyac5}u|d5Ds&jpzJkR8&<#l z3l~@gsEIRy8i8-?fFE&!Vgt{MOQxW|8g02r-)P`e7biHvjsRAnUQI`#0aw_f)&`=| zh(LBhxwChyJ&jI_Nc>418qsx;E&Sa6#jC(dK+4#BtEl9tfe8T;Dg6j)r`c*(qhn#~ ztTv}CLb2U4*IX0QP7=CsH%shLK~ssAGR^e91s;pia};*^=0@pf9P0;+=e}?M(x)(& zxNk%}_~YD*62AGZuj}Qhci%kIp6zCZj0RdB11&;n5Ygo3CA)XB*d6A%0&}zsUtZ1y zPfsY1Ag3v@kity^oyCn_zC`CFD#3Iz0FY8!Evf6+rxuPzpn1e)X=r;6Hnh1BQ4IQPQd^wI zNtPe7UO|ievN#q9K(~MSV<>Vb_D4N|&eU*2{)9pFsZ8&^f^?!G!qk8iUQsQ5)Dgsv z9FTz=i4`+!41k}TzzGbERaLvNAC2W|h~W2ftECvij&e9N+dWLc7yN}|7Cc>%doEZB z(33oJ3#Ast5f1dmtA2U-^)isXzR6{>py!<)8Zg zpMNKj(?;x_dZs%JsII+t*IDaG6aovzKm-H#1u?@u(IAb5%wJ##CVz$jomPi*k2`~Wj#nltX@PabL+<5KyoEj~7DES^XKfDNdP3FQBo$X%Ta zws4F>Adk--Q4TB+N|&ReipSWxd#om@@GnouJ5Sq(bKwfLEmrzP-&BU)Q}LK~9G4UyhDd5GN#L41qUr&F*u92X?N|wCJfdU zo~jW%K;zVteS1mBk%{Sv&#c?OahWi$Ti*(kjjA2kk*;!TCHW@U^ab^2wxFTaQP*$G z`G}5jXB@Go0D2xZtO8ca$*9|u$EmBPg7ndstu|Fh?TJC&Sxv8`sN27JjRwcziR?(- z5}RERE{f!-?sF2bkEVqXN%DgzhDjZg?=F@T?us@-q}m~nLB^1Xvmq1KX=hIaISjB5 zhQ#%UEr9*~Lbwv`O1=GC@6%c^(Xpa3q)?HQgC78D>RjIUSd)3yvF@|PM{w_g9#3XZ zaXEXf7!7;b!k)}*qc3vowOr$$(G@P1fZw z2Z1yqo6c@?=-P)5*ht1>M)O8H*g5p9t)pjjTSFJztkrh)t*yF6(>|0CjzX8h%;yG% zSH}(vB~UH8v~&AIS1(~KxvJPRbJ+16hV(nTzMcU=6fZ+FM7AfWp*GJE$!vXMug9I- zz`hWZF~Dz~1i@7nZCL-PwS^%Cx-Je8mvB1aq!WrQdi%HWDGZI5c4lYO6Kz-{OWOmp zT_>a35~Q`;A|naMUlidB1&hkS@*^c|5k98UqKV)InS@Z=*^eT*qpR73LI9uw(}px3 z5g8#-w}0mXt}&r0}hSwUr1n15)E~?^K!n_V2#<1j^LUqiTMJ_tF=P{KzP>8V3TT zsb|eO+jb~oy3_21l5q61z@lIKySQ>=AeZ)7VFfe zMI2SU3od>VwXU|7qtmRc%TbGbs{$z*EmZil1vlWn4wBf)pwq4^0?|;8y0dP*&Dkj=@cpyW!FiK6rNeE2!3m4QDTR; zw8c#vGE;!e+Byu);7TeMNB~WlXF|SqU)Xl$vMoGyo_-8xud}T^$B5msP26$8wgn+% z;j)69ASOSNI(Rl(+ZBx5?Fm%RL3rmz_+7c3(EvKVt`*Qx10y*Eb8e0k*7v<2=*4^F z^vkdIyL$T@zF$A_DL#7ro>AnsJ4NoNDGSm%k<(55SO*PaF|t)I&ifwg#2N!~bs==K zP)mX1gs0=6OQD8ct}`GmupMhdEJrtMMsDqZCrGoQ4uWv8VHVc*m~-Id9QRDR;mG}o z)2O_GoW~F)9${3Mdl||5E9C@Ujcde8%RpXpKT`wt*f1bXqz7?8dd&;b9Khhy>E}Sq z>^68VO;MB?`-&SdK*#QFk3Ybczn^UQk6yH=HZuCr_}zr7AAI)KUS2)$VX!eQB)LF#}24BY*TPe=!$$%He?LWFM^fDJZAUIw!HgC=u z0d8$WhKS?Ok&9xbxUsB5)Q4ZOW!5>I(l#F`;&)-3jjOGWxe<7EaA6oN`r z08(-9K6~`Xx$kYgdyUWaTx~ORa3iH7XKQE&DBNc7p;c|s$fb=TCCny3d7Y-6m7>L- z7qPPsw7ss2q{PBFUDDh`qia7HnpJR{xD`zhF82iQY+Z~qf7UDg;RnX#=u-y-#B|nJ zq%H#*t3!>~F{Kd`rn&;WYh6*h!*x1RzB5}e=o6KIF(=W^1DbMQG;>*id}zb~8shhM zF3ckm^Zo;!__*(UT61hg!tTW5K)->#wq#kCsQT+|Or7 z_7U>*5JwL&S+MWIJ9M_EL+9XW|X|UA)03ncav0x7vMHQ6T{0 z;J{se=8+AgWSzCR054dyF$Mu*;LOzO^C-(yirg4&jMy5kRj$nmLfz2{=Q=tZyUHK{ zI<5LfiWro&#BndQ{4AceN3Yp4whg|sZSV)_k+haX&G#B}UE&w`iLxgH_C5sR?SS(7 z46;_O8C2EO6NEkJP7e=5Fv4yPD5m3J*0kbDkx($ATC#vPmv9eP$Ol z6WXCzeG;NEsAk|_FW(7;b+WSrOtts)q(^svo=Gdc&huAazI&BVS`&|6yw9~YG0GeK zHQ3J>B=sTNqQR1%0lVH26_=)noULsL7ch(}2$>JFL%>b5CKOAty*y;@qSIw3GER8c z8C4n7p=oj6vr9(=feTNr&-J(5qFA>wzTX*5MIuKdFgCRTzdLwElcnmuwIuq3a7qp{+t9F9YT)z@}vz%Q+8Xdf`&$N?hFWjv|T-Nm7YG z0742plw>RoacCtCu8x!2&^Z!rn>OxUd4Hcoz(ydGee90A<0_}R)c>|Iif07IgJFV3 z=iwsQVWb0pu{(AhSZAfGP-SA|gBxhh8j7yV?9ER?ymI=)c<1uf#|a=Vq)9&M!M=U< z=B=M6kK2P6?b!`(+--0lq66FAau#O{h0|q{O**TxdO$G&SzDYl`_N{=;n89ME4uO9 zhL1zJPoKuKHY7EAc0&X9Xh&w4o$`_^fe${3mWE5FMmyXw>5$uh_F?7K-+i4w*ss3) z9bI*7(|!6z`&d>gl{3QrpjwU0Zlh-_5j(o8b>I8CIsyHgHgYv$C~TQId|%D=10_jE z2EZ9@WY0Br8;eEJ2&p-A%qDa0w2)^1x^tk)WsCV9i$B$ziF z+IPLJ)QR1?l0TP+6ATw-bNy)w^r> z{KR7L;8lC}W=VH9%MX!Eu2F&<5D(+Fkzc#!2Cd#m{qSTuG6kdu4qGi?&VtE5AVwk# z`<6>@+>@@Z?LYqrMHLmzAsoJDfU%&l zH`7qGlbwMlu(!r3YqQp6q2QCFPn6j?e zt;q)lH8LI)dEY|cQGhoLRaujU1-k(5Lc%$fI`}+6!wVF~3}cNE6N=iljdub=k|DSZ z(qWLpLk8xrjLi16eJ+~}(CFEQ0{JwIa?W-g((V44|K(S2zW(a%H!siIdiRqjUD5|H z-7}j%-E~RngLD&k=^i>=0weS`kW9O?O9R#!nBct(L}-HN=Jd_o4-_T2>OiWyXzw<7 zfLhj43%_O3IL%v^d3>zo7@ZGkA7>Oo^&EUQ33xo_?Z3E&J-s}fDi_eghM5iEZ{ED$vq5)cJr|k}*JVP?Ah&vdJ2(i;ouhxQXY9Qug zakCSJ_)hF8J=Im`2FIasuMseTpj*{;Via=@)jbg7(T>!+*YB6U_P6iq<*&W_>In<# z(F^wsLb2Z=6h90LYEMB7P2Vb6GeysUrZ0!|B00#oKe}*fT0!o3xO=c2_q~UQ?Xtbs4(_Fv)UYt*5rT@8#i*j5`H@0FMk zwsst6e_st3at-K@XG0zsUwZw%ZD(y&pe$?8raQF1HyaMbO}57BxoZuBa?v5TIt_Wm zv7G>cxc%3kf>rtU-+TmwYD41C?tLvAY1)p$3CFg2gEq~*5{bGnlFw@8eVGmNp@~pF z@Yp%II$|Vf;5Q{1EDFo|eDBc0EN*Q(4Kk5v4(>208b}Qv_u|LTXA5}r!adW?A9vmS z55qrv_!jWrzIcDnFZe*3nDIWLtf2tucM=tjm?LQ*qZJc_f%(8XKv|o}sfxDt)X8h| zxF*wZAL84eWL!A~O-baq_MS!)`GILMiqFbH)b;k?U7v!HFm*N*s=RvJtHWJLE}Vxz z;1sYPn;~IL<%9(YnH`YAhB=L)mY@;HQKda#Dg#;xI_?@6#UnwWPQyJRc1jCfYF4U? zTFLFdzobB;mH_Lflxx$7HPYM;a7@Tu&7w02rZbh%5-C5e6M_+u8-_F=6j=%E5}XhP z!AP#wwO{~Rqa9y?lp{Ga4-(ao=WaTA_okh0|HDVX!Chv)m~KrFLyB*3ZeK?hV4AD5 z%4vPiT%$|tXkx5pb489h5v+Dxp%|9t1bgY1@DgrL+K~*%0NR4C(dlVbfO5S z=YHCB8Aj=W$-5w*I21;>-jZaJt&WI~I8uHHjs3~(Fwrd>j7BQiCWNMWM zMdU#S4Q8oQ(4>JH&?ga1>xs$BaA-UsRa0(52TT)04ESJNu>!JS5!iYK*f+wOi((kp`cSBbHs*_0UN}v1M4tgE$mY?tFecT zIa%}eKVH5%%rO_FD3KjWHxO#Ut3N0M`#HD& z`6FC>NgAMK)Dhl_?6q7mgU!Vy_9`}S#)x3of&tH0hvH(BSSmb#c&ZW6+_hkyW*BgH zsDMV3@N8t$wUH#PYBs{pn$i$8wT|41iz9lk>6KD=S%+u%wikjE7+WAG5@Elk|el8_CyLNq?J-Culv@z>tH z{4Ia;`bpvY;8lC(#OZe@&W9;{G5DQJ1^cBeOxxgDN?x9Y+}oNuhpDZ3+Eo~O*Bxug zp(e2?2#yt^YWUa9V5cDTWtgm~W!LR(} z+c*B@%XhE7_|jiL8TvkY?LJo;Z>#}~(S%QMj8g+yyRxKM;65I0Omtwz66$-ZP`?Ck zPyuuT!dpRY;eIBlp=iffok=cWCam(UZ7P}qv<1vOY1>Ns@t9}NytjLSeZlFcH9HKX zCk88<*2Vz8A?I^OfyB-+u_xIwbb}D%o!ICO9UYmVKVRTI9pL=89vKrO)=>>MY7~Ga zY;bB4)XKmCw3Xw&^YBG|^YYy{Z_D32x%EGI;hxQJ>38`ppP`m^!~yFtNMFKIAUnic zCu37plY29IW5B>>7f>b5T8)J6aXE4_7xH=$0jIo~^+<)!-HpM{EWp0kh13Uz;F_Gm zlt;5uFY=m*?`aN6fgCw{g?8>!O-`wm4qUmOWEjWX^-v?Q^X%rJuc6#Q+wo zD5Eix5Q%bXGlEcJb*Z_#Z?t%URv_58GBA%t+&^zWe1Dt*asSQz6Zhzq`}y25 zKZ1(N!>CTd`L=*T9ELe&8Hd8upq*DF!6|pzFk^0GZ%sLDz%&bH4Fg%4F?o-%_u_fb zw*uE9*&1SPW@wW$;pj(OeHPFbRjWNwQJsE~*0_}cTO!p*3)p(DNjMz?=rJay>V32g zepRVN35Njj!WAG4YxpEq$uu0%i64~HKKsPgB4f2W{2Q53fG{)zkLH}&?5 z`Xd~wk6yZGj3DjK2=Ym8a=LT`ka#=LlPB*?;3(ruozN>r&#=9GcaGhll|b7x5JQ1z zbcWl4=j=!$=RHpLzKx`lSP{EKB1BrzB=>`K6g_QW2mm(Cd=kNzd3BVO!BA3Rg|~C0 zUhy53SND^<% z3~d>W4w1+#?F+~=Ylq%*5)abRjHdqdJu8$M?vs%iHN| z`Ivrhuv{%Q3=OQ@ob1iEWS+{yF{&Bt+-{OoM?vgjY`!L z*m-*IO>~Jg9EIMa#VVSJB^yJA9JFxl9^3N!UcLJx>~xP_x6k!?vyQ6j$lfj_YmPP< z*9H-k<0kJhS+k}Y^kLQ3sDa|?>;?!Qos#YoP2xNQ(()P9#x?AN0k@gPKKOnG>Za~C zr_(?d&%&MgbA8?(y>3sQw|;k->!0RjPFElZA}0`>6F}m@2YB~oN?!QxyoH2w#TLZf z3nJOdKxiMpt~cf8ja7Og*WkdGhlbPH2|ORMZo>0{P#+r*isBI4=J4F#$5Jj>889gJ zITb05wt*xR9yNwzuwVsGzmd$2AoN_E2~qqczEY+@ui~Z*4343hjeM%yi!B^&eqAf} z7}pT{5({TrZ8pJNOrBikzWn;l%eUWtc^QD79;uIAx@TH){jMeVVY<{0pHls=A3+q{ z(aj(mC+R{#4nQ~98Vv>|1oB8s)DhPvSAL>z5~!*i{kb-D!3PMHbflSkD_9*6|0Ew=H0EN!5`ZTm!1W;km zLX6`?=&>M2O%(H%rQ88^0c7MT!c$WF*ehkJ%C~A{8tvglllLQs1qygMz+V zv^{}o6ZK7VjICvRd*P&1C~nKM5oj_SfdivQUELALgQzepX!tMF?SK0i!K_d$W3ogd zs6-~9^uQ~Zw!C~T2ABt z@T8z7FD-7lmIXqp`yd;(k$^t^SPtbv*o|uil4;eOtK^PVtRsh0&UrdtFse?_=39k> z%pF4z^Ld8%z55wpV$Umtt&JQ-hYFo4_8Jm=-CsVmfbbGAlRR zB(sh|Uh571zd4RTh{z@bsc}#nrZ2){s5`l9Q`Qkc7_^|!RY0)cU$Ni3`tsEq|0bS1 z_m5t;XY;%0F2CzTsB&-=ML7s)0$0};|?WYnGmA!V&`zx^K{;i*5A$W3m(p$#_A(R@fW zZ8O&jrtJuLM>`QJgN)OxDM5ygsAcFr`&=wsMy<8XqkT$94e`3zaK2Pl&|=hhkl<2Y z(uRhS<$c%o(OEY4PyOq+-@XiwpFC-tJ$l`qA_&{}ulYat?iW6}(sEBs*$}u6a!P?r zenxQ{s~R`2gYgY9=!->=Kie|3)B(<6n>4)(#G{x|+Dw;ifUQMQz#BZy*1hLK=zvTi zU+uuB%$md;?MW)b=kmlodflE02mOBQOg>O}i1fn8-o7xl7?`O{DAXO^6*Q1`pOJ_I z0X)rv9ZeV)r6}srH5|@CbOKkTDvS@A$K%MBm5`5~zH)b&@Ybru&a*J{<&u%@_J4ki zG~Cg<);Md3MsF?h5a!p_5xgKo_$J$$DewaFNNup+A)jva&V&?rpmqDfX|KhdPtUV( z{fbya0q(4JVnz9IfgHbVbtHJ2(S2R%c*Y6h5k3Xz<=((hAb(q~oIAhFryNmN#*q4v zevt@N+=9-=v|<$4uSj@7flu2lclkIlid@ReK=N9zZU^5+u<^=0&$=h_{qprwzI z)Nej9yF7U5KG&Xcp|LrZY^3Q3GKl;12*Eg$#M`XBY|tL*%iY#Y-O$=X5O~PO&VZ*d zMHbq)c1k0YC(TepCnvF$4VAvLv+)VcC?Pu9WOLqo`VX8YTmxycZESBXpdc@uv?|cy z?R=25=t1)=O>h*8ba}dZ!uiVcqDed9L;{WR-Y_-u0StDg6B?EnZgtu(W!`l|)<$Z3< zXj{U!G9B}Fimn5B8qUKKh*C9!KBK!0RTz|DtOFzr_+A>(yNd>O!hm)b+H&ZI?)$BF zciqR-DlM7=DwP3}6@sY~16L^|>k%tT>I+}7LMz&siR0)rgw!`rPi-R0B+$QRZ4hwQ z;I<4eg}^V3%TP`Smr509M~RRv<+a8a9A><~P@ZJyAk#|OtoMBHh6 zt2J%|a{JHqd3*G_eXi&FsX{=|=7PjccT*DN^LUMgx#OlTEu+INYDhvs>_hndVtUBvi99&wP4Gg1#Wb9_}vEgK9OaZcGWAc}N7#Mx)GHr0`dC(XGg53>fUd$YNVmrX;w zBIdl#qY$C$G!+IWR$U1#-2tsHXSXLK=|_jm-d9lm<-1oe>s|QQ^~5Fe=%st+WT)@3 z+TQ>Cvp@I`r)2y;AK}3_AF>5I%rHbWwl%TI(t_n^X&jFM!amI3NN1_jxVBodl*=bzI#hI_~YB!}>Wr_>W$?pN~E2Q+V+I z-;eR&!!BYCgt>)#9hBE7KeJaxGn$Ol(&0W8Th%qxN^S^63?936mUM~L3?f%17!B50 z2hlHGcU!?=@8^tlC@`K$1}=4MLOAGsA$Jf}m(-bQ&elisYHSmDvIHA%B^we1G5PT| zsPfn;?i<&gNqz4@VhF8FhmE@RONY_A(CX>q|6}jXy8TLy?7k(*-A$?Owhc@2vL5y5 zwNQ@8jL3}SlRt!??^+R&8EmMl3MBy57S%8EJkRqy&+|Obmi(z~Ywd$#i}>G5id+Wx zzo5ydLKOj=nq;2 zsDtnv6E*sQo6X#POzARuBAHSeHR2hl${#_qT&qDd*?0<3?HRlz%#}yW8VLcA&iU~F zypKp)B{+HdTD>DyO%Y>M4YhO_Kx;Cfq+=U?UPrE|J2(oUzb*s@_OS&No2Y|`Zpa?f zyG{|N9Bt@}|4%JWI9JRD_)CM#IBf9|v!X9pwJl zUfrP_gR&TfXh(Q8thWN%EyvIVTrg4RNNQ;(w=ED|c|>0>8#+;>0ld#MP+D{C+jXGH zKFN_Z?23OWWN-9s4VDXVVx#YjTtp!4_La!P+5#%+vZ!FB)1yCVo_p_>L&pdVB%kFQ zf%RuFp(B`z3SuW1dIzvY+x0e^?>Fkz559f##NK!3QG4S1Z#Uon$6-X-;S%1M^AP7A z#tlYY@H0RuIXJ2J*%}+^1|8#N1lStV05TmRl?GUx9-YQM1a-o5Ai zZNS%^ALnLz{L%N<0eAvlef@*?UBz#nNQ29ZCIU>E$ciGL4C<_RLr)3$>9Do~|A(H> z0)iRDA=1$jBpXH?2*EE3DRkC419OgAM<5)U%a(|^1fU49A${~5h@J>vru}@F2B+`S z;Lv~avP4n*l*J`V0C!f_MieSXGFc|Y6iMluXFwA_koKyKbl(*=jG_ihnRrN;Wj5r2 zPeW=f^3p8P!NCs-%OdydpF*JDefZm6d;;EUGucO|K^jZWoBIml(9Aptf1AfDaWayL z-3Hmq>v(kw?gZO+>kwA5ZycyuPCK-;TxaGi^R;XoNpyjYASYKXj?-C_;S2SyiS86WpJPy12fCHKsqgD!>unLfZCP@5!g9{q zyr7e82*o(G%V`OcHk=?Far4WW4m$~tocowggV&wg*cHfpiGHhVMlv}->fVeuc<(zB z;6)qFPoEP(4V(@}qdAP7aV-QPf^>u{)En~mq@6zS;a{Z+3v_TRk?x&?k?moqQYhzW zNUan^k5VFp^1}`doGkwKhhOI-$zbP5a)382e8c6&^C5}aZ(^u`Du`t zaVjg7uAYhTH;^)?w|x#FShVFqU0^uaS2X)}-ffGXh+v>oj7VyO1}Rq#kkF}Hx87$n z-|jtbPx#>F1NX@LUq8F~2C}e>EtADg+XIpgUfYip$_l;!^=h(#8YX8&4r^WG=mTub>d^~QVKg5ZVJV>Vsvj&N*wEH2w!cN?K&&7I&A<8a^l z<&R%iHMpIQprceLFynXw49O_5@W_P)1V?R;4bTU3m7`w5dykEH4F&KeFUQhe5i6(7 zRBrR6-EOVF`PH}YeiC`%-Xr(qj!HK>>N8y71W?{R5zAoV};W$ zY0=VRut)YjNh9cp0*xTcM;^yGtv-(}1Oi_!9tB2rG%AFi$^_+QT3_ka@#)|4vp%C4 zckhvVG~?(C`oex}#=Zabvzu`Vn$ye>0@-*MwWhlP>RP$D@hPxPj7jjO%O?X(97x0h z0LahE0cwyBPNYQ3YzJ1FKBI9RMAd*XHsB~+q_m<95jiIcXp2Vxtr&J$KicVx_L&I#qv;*-0_SYgBj`m9Xt=%Q90~z>2e^ii zOynm?I>KBa!n##Gyk~u&7xt(oa_512Qa8>wy775HFzFCHb9Nb&k?L>%sUj&7_Zyd?XsDx_hfJe|c!J5>**m6cmAIlpW zKBvPs2~0l1rj}9jV=4+AS16)!!(qTKseUUi`+TPTy$9|WW|z48wEsIk!L)CvR?T^N z6qDPowHlM?sPsh*Cg8<61=my8MsZ1uP0excI#JjWwM@rB7r(7jKz)^uF?)-Si0F%~ zQFXF-Y-|Yi zbi|E#jJ^+O{y~i!O3)ftV^s=J5$Tz8atI(@$44Aq?L5ln`mRd!q^$DZL-&N(r`?3o zwU0wdw}on!ab#GE>Yj}Tj^;LWJF?4_IFO(l6VCcG`pjuC2QYmS~r zi6SQ~Eu(b!36wViRlHVJ$h%|Qgvt5g?|gAVzi?5I=nZ1qO@_S4R^S+^5KRJ|==7n= zXEuO=4Y!10CW!Kb!6`ZmeCV~Ikx@Unbeb)Z%YQOjwiRRg!b0e5olh91WR5-_{;n6# zU|s%vwu#4GfQ}=0ZX##krjTQ|m66KmP+~M0I+^8c5*sYYUq#628JcUO3xqc5L36-_ z`hajIcj(j=40%T{b?Y4;;IV{2vY0mV<0)x1`mhUdorZqz*FJt1-JK!1LfkJr%2Wh2 zdjn!uta@7$!cLd7hQqulDNYddt(CK*>P#0x8kna}9oL^xGJDiOS*aVcFgKu1ld4VQ zv0&%ca`!O0?I?auOX|Ic?#U&!-7KjeLqB=%CG}>G-1~8Eul47v*MI8OcP7Qh>qzP0 z7}R5B9}tCcJcULzK?VBQvdo_Z(r88Uw(Og_%HMI zJ}+;IgSxldxsyf^}T?3JUYHmRuAg+F}3{r6w+y?5KsdGqHE+<8yx-fe6X zVo!o!162=hMZDUet`?%$zS~yqSDG3Me*=-XFs#Ut%i{@>RX3mbf1NR7w~=bVx=meU z;IQ3+o-^mY*w*9CpFYLrk8CyRzGL!H?!5D)tqB=Gv=unoIPfjZON^&L-g%HRxIDJ^ zp2MXhQP`1Awp1C5lwPq(KU&y5+t}bA@G9hJTzm3@ zG(4zPA1yZ!o&ieuE{OwS>GYU0F!xUzv>}@oKqS)Q#Q1y1>&zX zR_e%Z+Dn0&t3$rl%3fKC4oN>}3#2dy=h~J*4m|r<(fiqf4+u4O68GXM1K}sgR%s7^ z_jQe0j`R@()^-5orcP%!oSh>8=w7v!tsU;&MF~P_SWptD#9mj}Y9eu&q@^SRHv53f zNft`tS2qUAFOM^|M&CY1Q|)uAHp@p;kUKxlZ318Zwtx9MPi;vD$02=BjHCuH9@H$g z8GzNrYr^#A)c0lz#RCRN2aT2;8pD?zP|3zxq!nvV-{Ku8o2DcBl+LGh%CQa4LuV9)T|72h9p8@Y+rIHb9hQNOgyLc5u?$pAV@r-wb^l;RYLQMc%30r zk*P~DGmKhZ>aEjJ z4<50**hUt+MXY%))&cZ+;m%ut`UO4qY_HjT#$d4dh}Jp2@TZhN{Jk%pgF^4`!&40L zidvgI1c;N}5eJOQ?d~BPfo-iZAkDjmZ#(OX`fPrn&#_uu37t3fhz$?*%AJIN+~FYY zOxvIib?e0K;I^Fxn3ZkBkLAPP|Et>5FX8bMO@$?%9Oq~R_@uFID4ZTlQB6kVL=_k< z^42KfP}kefBo#_}HykuyON~We4%1m;PJ2AwnY%UK{XM^(JbT5C6c6 z@4xuyQ0uChTkVz`|{P-@6H>~cdvf;aZ<#c z2k&!L%8)Y<_uG(O2J(01bd4Pwtj8U0fT{LjBAc4AQY?pBrFK-GE8`LZjBDF-oE_y>sMEy_3gLceDnIvyR)CV1#PbocV!36K~pkbscaCIHc zuFCW5F=fpzrd+4EfB1Ik{oDQcu9(rSiL&x)rle$&)Q(U$#S@Q)%@g&dN&UdV*~|v$ zHA@UQmMd*xfhSCRC=`unD7bPKlls!m0YE0oFnjtCb&|F8bnE!bZV%6j@QV?%&4eAa zr@;aW;Ora*bDoT_@>6NC587V5Ee*HMC8%XFvQ%<5SxEVtH5zM>M>_=2I;1g63C^lZ zU^|-PmG$99G#_yxfBnnX8xMAioWAp*{rJxCo8RpW^NaRl)w$pJ(Z6|i=Mn6Tb{hJu zzNR9z7>sqWd^&KdeMxIcRgJ(A8!J@~zLL{=oRU-UMxiCXlzJdo8~>%%o()$Kx5#$k zxUME#&+-{`+M11#Mtf_+8fybW;UR5NS8A+7ZPtj!S$9e3%__W>TFqi1|xm7l?Uppv^;R#O`~k%IHNbOC%q$^q=K9 z{?^iZ=P`TI^3`rEUmrtS!;STTaRqeBK-5WR@4FSww{cKs^qO;~2iv&JDH82E=rk#h z#dM4S0$OsY#TBd$5q}FnUKAB1K#>tg3pm%A>l`G0pruHiAO7JN&%pKkIhwE^uV>h% zRc9~EHq%TX#BHBFjGGR#y>v7iR6wb+vE`|SGIDYtjU0Jg)p`QIN~k{Mfm~=VM8@vk za{F`|S#6Co@+dI;bJ0Tf71f99*=4%EZk}UB?L57f65$XF6h3R!=rS(GSwTo6r~@-i z1s8H;KXRJ3)&P4ZF6h??za^JMrz^v)7P{2C+AQUsyjYeA%c_M|_iByil!t%h#ix)i z3?a)Vb8xa=toLO&S~;9ezE+#N`t^0}#hFNV^wzI?D|Y>W#BS|K#!tJ{fsRFEJ^*1- zJ4D4cC|3i|4YsQq{la~R?Fs*bez35<|Mf>$Sntdu zeE3J7gMQ)RAA9i(`rHry_={&ipnmu#UOWR_-)BY-e7wsU4MkEHoxDu3h!NvGb^;%w zrZT)#xi^&dcdzn@mS@Xq+>2;Id%ckw-i+7M#bcxPGLxmxq`_xy!h&g>3yHG-4 z!9!22*)t9DgFH5aW5BzJbfJnfadD`wZ9R%qyz}GSLhODNB>H&ir4s{Tw}vfH1%9Ks zp(?FLi6w^-)Uu4R~%B zHz|W|f)rR|+ruSu;9`aLb%!^%8OgW^S!XVv4b3hNoCptXCE87tZfnu^K1u#OWb1nm z-7kjj`3dA0hp2@t!0c1nI17aEsp+`S_2VE0A#k=IPpdku_g7%P7ua#R{-1p8$F1ULim4D{2mV1xe6Lq=|=UaQ8^R2be z(*{!zY-si=i1C(>`k$V!9GjBjS^ZCuVz8a0TaQf4=9I@u` z)>s?jP+3BoC+L^@=+#jO^xZIy$2j(4_)~To!FYqr$16wC1&c~8SB}Dz;E;~|Xlz5$ z^lT+u+|HvC@4ZVBKYKjTy$9}zC5~^FxL=ZZpnu^L5JRf%FqU(&l#Qq#1gE1(U$P+- zSfCfh9yWB?Al#|;-g*2`+TKkeR+S-z(!d1WP4@}Z8k*GFE~wO8Bovh`uCw{lm9XYk zf8=nxcah>}1ZLlR)Sj60bTj9F1-JlzrB)a;9hr5adV{MaOkM z673@`=9#z{Cau1D-za#g)|^-|X~DO(_8I%^V4IC; zsEp5r-+J$Hdtx=|H>*kiD62^p_C{N$Bxix*k=KuaVjQ&&pWCUi37^_k3z)TSOm>#u zGpDh5UJM|97@4fm&+Te*@5i}4W4(HNY35$N zJx{e2dZO&nn#z=ogekNGbkHa}+cz&|mO@X#uyS>T+2=vt6mhh(j+wPhV@jy2kp?PZ zO=7?RPSy}^R6Dd2qQ92uA!QZ!xyGKiwXOHU-jBbApyDivc!6FE*+>#KkgHW~d)mVC z+NZ!Qt+2$m%|zefv_t^X#E$;x z;&<yAA>k?ZvxQ6zw|6xWdHIf2wB;(&oU*JoqIN|JdR;2yA}c5 zG`Vdi&()hO-e;w*qh|=iMw8hO?4%+de6r6WasP;+tLB-aNrKAtR$M^m zBRk2x$M|R8b?!ZIPnZqq#%%aYf{XoEJ_RmT&>)4uEBfLkRkD5W#^SNchqPree9>Uk ze~H(OX{o(KI4d5b_iSe`siV@4_5sqyP*>Tlb*>S1BHPlMBAw>R9$JFrS6R2`@q251 zZ>#KABk}FKAAb3`0Cew>domiDZla+-#=H++xZ$=wNyvOoTPHZo&geFlOK^E^O_VC4 zYas0AG*qd^5*MkM+oW07^5L|akk%^S<8-T?)VHTVZgOM+w@!Uq$<(z%%pU&LPcZK- z!QH@8pwM=f;dp|65Af-2UL_cA;Ms#R9Eq2p!fsD>9TQwPX-L;|*&TTXsP9nMc+-K*i%biWrPR$|iKXTgq$=`bGUtt2}Z-0xa^`qkM z`~K?7cduW*j<@H{?|OXs2=8(45q+ZD+CTUn-v9a|Tt3*AjhT7U#X*dnz*$5`kU7?u zT>(ytJC8nCxjK@wX^8f4TcKn2HERr%B6e%diro8&4(}2wV#EiHMATqy$rYp*1I$|WCIX(J zX@tmpRly+FYLgw!&1-nWz*{HVd-l_&?>PidcdJ;w^W*$zR{z?&A3^~2(=CRa4T`Ik z45li0t316L9oJY1sd0xo|D3iIE#$+XE)`caKltEOqGS^ewI@al2}4wh^}RN?wcrn@ zNptKbBs+Z*x3r;7=yd(4s`v-~#`j28X@kMXsc{CMhnzVNImJ?f|=QJO^FE>=XC^#R*_ul()o_v+R z^=Hr5KfWS8LHL;4V15`p%9RX+A$G;CjdlguAtrFF)TkYV+i14k5Ia*mc}4`3Y#j!h zJ=~dhb8tFOofSMu8n!c5(b5)cQL~zcIRS+g-MrL$3yeQc^RH`0@6^1id7@6WqONCd zqonJ?F{D!nskva;lcA5As530Ld(N_@uMAX3x?w zkpR6(Z(d^R-nrxSGDGscNoyW(7caP_^q?ljv<78{OzxXo#7J5*l! zAzwx0!jHes?|<*-IYYjmp|Ahs_g;U4!-0SKxBT88xcz}|{_Ai4&DVnUH$Cwi|JZl` z>8Jhv?|<(@iOS|x!+hjc*6w`>kJ)ggF6b#6?%2AD22?}cWfPJsy{j&RqZiAYya`V!@1joPO# zNV2v-H;+V^sU@w`wmN+jpNm{K4`hOBvOP2437pgp8i#vZw=&gLFu!e1>1&QQ3&z1) zW!7Ky>g`WCpWb`yp1{xX4Sw$9h_hJrSPV2ri_4mDx!MZAM1nSnfS_#0JSEp*OWc38 zdtG%)fuYJLE(qZpTQkTAJD?UiZq;bDoZKPBK;a!ln}Pj66F1se5C6ueNHIG=KazKR z{yjTXb}P1l!ZrYJ7?CIp%j&iZWrO6g*_UncHRrsnuQcbPY`9vlmd=BjZHb* zO5qwDC81G=ASp&R@uND$oyYiQ=Kr}v5tcwGD2Z>ZRU4Vofo>Ryx#%kfIYwJFfR7FsP_Xc}~4?06nzttGcEUD_nj&q=a z|Etu3Jkj3`I;Uq$Y43sX8~e@)pe{zpk+txq7`MwxXCy_CFNbarFtlZJb%zpNq=8yF zNp~Fhq>p+4MRGIY{@9nV-oAVD^6jfH&)4r>zQIU7!O6Jy7(RKhayt)YqTJ2sNS zI+RQ(MeccIB+MV#K|VtUF|UL>vIkUa&U)4yG*1hce$uofl#I)ikynK7>QKdn#@5cM zXYp7Tr?j<)fBVHV@TWZdJ6D)TA2pO<5Iq`xnm2-AU<|{Jq*`nw2jDMvnwwHjOACmB zxgErVD6Z+*1j?}>BqXGBoIn4cxw zQo0K77-ea*_dWtJJ-Ec%!@vJ5RB`{oi|_w6Pq)WxDGt!0#@sID`zD+j9y5^NWSuVpjI3gSsi&sp-g2I9FGz4{31l(<8CN zy&vbvp31LX`_2<(TbL@{?DVrHKFK4H_B1_Yd3d5!47auJNexhSGMuu85k56Kvw$fI z{J2Rt^6&1sTa#`K4cJbdtFX!+*VD%^Ix&MXPFC$5H&ysq3-4YG46>j=Xh`*~DQyo; zIEYY6`*FZ6oY)5Xin1!qV61xF+C?J&Bjydr0im$9Y&$^L^Iq(G1X)d zKRUVI`EhPhnLp_*l0>v!z9H#|W~ap}Q@H7S_Si6SB0@@+%!beT2BEZUAe_< zHG!cR4pxX-l!4$@IDKp7+zs1xw+*Ylju352puzo1UC!SC5M91#?}_L?M+yF~{H|(# z{eU;c@;`WEoNsdW8MPB_NtRc|nb+|pmE6``thV+- z*hQPG%SJRcTXCGe=R%Jpt6Z9&5$(1~bno-P&#vIU_rN`&=%X7&AAJ-B)7=%^|IsIy z_KY5h$S%}((wGXpZ09{9hNMd`0&BF#(gPjHuHFyew$tV&Yx8*Q>79_Ab!cP%f>sj& zRT^yRpz6oj?t{iK7ZTg8#YuQbK2Q7py+`edrGDP@h32p9`@gd9|7Ez<61bat^l6un zMKvk~t+F-=FcFV+su0q2U>yf!1)DSeUjL!!F)M2>PfyjIrgZd_||^F=4(&{U1jF%96}WAf$qOPD%&46hX%T19mHv zXoj>}+r~z^a<1BCB+SgX-5ps*xesy-+Sq|^?OC0tZ5{)X0R}J=s;k;7hk3G+b#0|K z#~j{k(~`sq<2H0P0=kO>6^)1|KdeMR zVsG4g4S4u3p93rWbAn|&p+q-rKrw=9JbC(3+TLh{pt>;wKT9zpwP`C4gB@h=a!Qsp z-56&~ixGYAj(EV`c9!TGtV_Li!yj}aNQjyUPeq5=Tj4J;{Ym++_dZE{J{7ztY+RiX z?v~WOBL+-}J!xX)89lib@oIy*T8N_C+mLh*KZ*e_JLZI|DNT;d+*@n->E=+1!I~Sp zjZ|yfVZX>WdXBHEpr zrt(4pE{^_PY0Jiiuj?5{O$g8yJ#+6t{Qr%5=Ci0IJYGxofC*J$ zZOdS5wzFSnt{EqGGl^wdfKywoDhKfw(iwzhFNS4#3zRk1%EDKyWwcvYA2u(08tzin zcNj8R+C?sxV>*~O$!$J3as>I>AMQ;={(Jz55F1A7~ zisp8OU+kE3Zlsv?hAK7;qQ@8-%m&$T?A4()29auIYt=c8oDG2)Ei2|}kbcc7?1bw{ zcpx^}F^3wDxfs50($Tz@o$e*QHAd?Q2xuVk>%BpvpCvSDT_RTzd^$|0$qZQtWd{PW z=RC3|+WXcJLM^$0k3RhvM6kJhoH))8|J8F4b$upHlqZgo6jS>i%{SJgm04pllA`A& zahb%6qevC5)ppuuOFf%#q@2EMZbMhxJ+!m4#^!X}N13*Q@&Ny$_1#%0;a=nH4r%F0 zKKtBGtM|u_?|pO|R-b&F&-N_Zvkld=a32|9>x((mDJc5y)mm^sFY1DFyLlQ?K^h#x z)$ta)x1AQ@t@wf{5{h~ZQ?DC7piBO|t`e2@-2Ujk0iOsK+lyAaM+nj>nk*!a5JTf_ znG{nbrEi{b?dh;xDYKutq6#T$u#^eROlFyFV%0L(w|K9xbnUy4B|OjKe*II(S$eD4 z{iCnmzWny7dmnqx zJ!vCu!g5fJ8lZa)^0kYYrwpn&&Y8ptLT6o3D-;98G|gxy=V?H8volg%{n8IJiZ)t) zAmtjhW_M@|BagRj;p^oUb1V4DLL3zp#7&NL{;N#fG%sc1#D+XQ!{I z4hBkVyZ33h+2XuB3pYqWH4rVHB6FW!tRx_uFJ94(H084w3}|~!2!1cG2K>9HaU#}6 z2_=j%9{%eqvvh|=1C68?bz1BTyw^o@aI`i2v{~1w8{ScN7>=P;)dkdRgEo|7BAAzq zG^q*%Y!*YFFv2&SnGdE(Kg;|$7&di|Fn|jp5C6^e6m$2O1IY~(^dJY73zsYN(ManqXnannt?{? zv2sCj>!oM6edNG%C{#vA8*ow`Z*397)R-LPjzI5?@SBlQv}0JK7^C@I@QB4FlYX?s ze*5N2?Cj@FJnHe?dF-C(x$sTTHuN^u4;@ZtHs}!~PZ}}BqEvvy+>o`nPH)~6=4eDR5;7an3+|HTZ7&UHAqSJq zo2H|ss4G{j*;8&N+{$BPh*@7vRJU^Uu@lFZjvK0Z@roe}3sgcVH<_eE2)a74wnG%L zdH1IK0fIlRuk5H+jj)hGVSmZd)Q7XS6vy*WQX+5U$w{o8lH{qo)G zCr*?19>FJPUb~rjAH$iT!H%rgByfi~ht1?kn{-zY!q4mU*=>x4On2cuEHNNB9ebaO zq)+@#)}0A#JuH8eg`zl%p%t;%<7(KcK>aQ%0<| zSUI;M_9rNO150M&xn;5JAnAwPuwOcUaGFzl6L^`ojA0Nlq@F%=ThZj&ZVJIlJEt$n zJSdJ{?SR{3p=h%y06I-Y4=`dFVsE=3`Ej>RB(v`_?Jij@XFHb@vZ%Kt!JoeuJoqut zN5pN4;qmfa#-mX3ry&Gt=c2P>E0QHWxb-%v-FB;gfBt{_=F3OAiaQV86MOuJ-h}ay zyb1T7__w`{J3r3N9QlK9^2t8cge(SLXrQFQV{a`tJB)>A$MDRBi_X>&R)$UXI1S*O z77S)m89ohXe(q3Za_zAMm7OtbcZSOpQ3lq=;tZ~BS(~LJ73uf;RKE{)vQLtS)Bs>} zM3)T;1Vx^%-Z^Qlsoe_95E^s)mN2L3vzWouf*=4EwqeKH^1%7KV)Zm?vxS9BA8XEX zi2?kOh{Z6jqa40$j&>dqQSU9ZyyY%_SM_`QGGBlBIGXg{gZGOm!+iWB+aSdL*4#eZ z>F(+oRjswztfJzGk?Eug*OcUDJACF|4!g|JhQ8i}=z##aOz@ovE_)MdXlog)+Z^2C zC$Kqt#6>&q1gh~ZQTg+lboU;-N0V;e+!N+U5(6HD5pkr59+g9KjClAkwNfA?m*xic zAA-x(GF)OJ3jjs;t0CRQCesfBz|HqinHo zR<=2elF)+Rrk8}VPq=5JwK{>;UwL{pXqKg~B9J}XYFm~VYPQwq*we=V8@rB3VMqqv z^90t~)dh-KT)wkKWt?-HL03l?CedU~+9*{ogFIjItiaqo9_}~-LIlo{)eNl@f>n8F zE$7Jr-N;aICJ==h`gi~0*_|^aHjI*PUZ0*z-jSl~0{^Iof@Rj+t;_ho5DsZpksBdREoZ)@M88?mcdgW?cV*KZqUq z_3!@0vzu{Hw-L3b;Cu}Q^9tRs)i^gHEmgr4gXeDX5OgjfWm7qVfTAiu%+~BveWTtR z%^D;S4#mn!lTJGep1GSXP|FHM zxKM?k&0aD$Q%DnK0a4p=Gi?p>UmP}gHB-cQHX$eth8|tr{oi z1jk^s;u^Q@md|F!-Fw`gP$-v;-3H<8Md; z5AoQ9#%+4Sb=un0KE2?_a3oFYa8%25I!s09B?x3F{!~tG77dBUQCjMSWb8NLnh+9ckGp$XR8?STSBl? zH3LW!NRZAob~yP~fA}9RUIXo+yQ&3P?F5+V;mIg3VAW_W$lVIi=+HGveAZLu$ke`J z?4zE7(4GKT1&L7_X?0-LqFB`(_T%crQn8oqok!`M)qAJXdiWn-T(tHSk_?4bAWw@} zU_nGURQJ*&PBcjooRBUc$96Y_5nO_I3!2ugtJ89U5~pvpw+4dsv~Q(RCr%&TkUyY6 z5>8n)sA$8P{_sCtq=fWz$;h%v3QlrGG?nGi_9m1jSDUrA2vX<{MML9lEuG%a8HqkO zSe69{bZG2OOQ5MpSR=Q@%+`~fvPTqIKY@t2#mIPW`{94aQ*4G!M#CcE6{{f|W~Vj~ zs?KvnA9YTU;AQgc=aSh0QnOd|YID_L-82oMOjgt#k)lTi%jBjqqm5jhR)FY5*5mkT zdzFJAdLI6l7Z>S&!DV-#2L6%0s8^F z`EetR<|wcTm-1Y2>kiv_Sc6oNAJ&P2OliTVG9Lcd>x~@7k)-cUqjVASAVBdzArJO0 zgagJI&>(i1T`9Zpo(3PD(h+2dR%m08POY^X4bIgmg;_jWD(XvfUoWC)Cu#%9)Qt^ss#Z;Hws_Q5C4WtBk{2%`Oi|_yO zk6!V?=?d`erDAKNVwQayBbNfY9L9;NPk9 z9urOOJ#J6jzxhUd_AJ$oLl1=y-wAI%IeHJa+8MF-5@DOL2E>^RF9+Gg9@wMkwC!V2 zX6ujyz}3B(E@~UPDI4)X>*OTdC(}mh*1a66Fr2|)a&41tJ-~6I6N6}h=xCnZt#!m^ z11d}9v+dK6-%{BWparZT+2ew3c_LuC6OWEMaqnmK*^#6=W3X>jPS|TyQ6IFXE3I5J zA+s-^EA!Sr^M_x*`3`&csEK*!aeESmOE)mwXE@(vODjs-*X^Q#!d6T;BRTAhV+`y7 z;r*CW9z~!;-`j>(!E_&a0-nz5w)I+$r1&}~?%g0nES8aFwO1ezr6J+P8@!PvbZ#-U zTJxN2{Y>vZtK%@)12XppZ*CHTK}+=D>^kWT9#(DlbVc%DUy~E()1ff&HzX9Xyv9=Q`iYf^d2s2-Xl(xMJCi zxgCc@nKpPO5+PRC3mlVh8u=(4YXMC^fC^zG`@!CZu0XksjJ_Z@SRyugZ-WP<1)V9Afa+ZjcSFxWC=l{HIq96x7eL&qm$@Zdz+{Q?7C2Bb1Ta#_x znpd*pn3Mpf1|qKo$ez#;aaAAlL4>5F<8vh8*keo-1UcXsHwpX@F!b!OH|3s+@LE-J^{< z?Now2nr=SSK2VbXc*b51$6DnfAC9KN!7pFRZHUu_LYTJ{FUb*|&)*@x`b zVesrIv~KMc!pQ5TrA@8Pn#h3A-YVC86i4jhqiP^bEJ?@op1Pa48och4;d&p;tB*lP zP+zVk9*g=GR>oBrCCfxwqUnN$hZSp>o}#tTg+O$Tj-Y0_1vS4Q6f0}cS&t66_3G>W z^4o7-zJ2x8H;*&0?>%^*>&?oW_Qof($=+K*^zPsBL6Ai{8%QW}01UvFduR-ezsTO3 z_1cvrS$aULGpkhSR#is=deck2Gumx%ck}!)7cg@(k6<^043NyqtnL@7CH*(e^E}V< zJkJu=W@L57Iah$7x)FyV2>FtiAQ^{#eET*xTkBiFyI-tMfNQPNg66Tbs0PiIk_lRW ziu;eZ+?mbiJgsqG=)X-uBVX3c+nfBOCuzTpP5Vn9Ucb%v_2J$7uYdL1^t8Y5`mSI3 z=+%4Xs2ev&-S`}Loiy;XSgNC#V^B#jeKu6oz@Y)S*9&c5Sgq1@V@l`gy+%eY7~g8p zffgL7G@`17bm4>{ejrp0Q-$2@DtLjcoS>8}>KUWosyBXOyYA7e_soU<`+h-v3BTYE z&_yb6|K~cBe6@t&ei)lc`f>OIWHi27GIPrI?4dMTe#*N;ykV@RgRQ3$bv_9Cts<}l zyHw3OP6Q4UxjCZt?2_(_jb(fC9f#s5?1u@o-`a3iowJuKH*Y}^324~P5JTy7fu+2c z;fx^%y;Kf@%mepe1~|J`P2?(WWHOC0RC2qgOo$}bA)G}d${_N^?Z+7bUP2j$|G|k_8((9se*HgfUN$ob!p#m`JbTQcFe@>j@;YeG zYAvO2WJ(@(YD~Us%Q#TYZyyMxv?hQRJBchvO3K=Z)*`{8dHRPgxz6h6%wyv^Cm46J zwr3&Qt+fm^cRdzV_!|-fC_aL&w1OQfi6$a@H9yD9#w?;hBN_1!vmlk&8MZ|R&$Q~} z6ze!7MmA*5_4E(_0O3ltZ~{t2vjt#IUbABOj!eeMj+Epj$2y?!sT!-XpLqevDXj2H z98)ld3NRe;-dU*v%XfXZ64mVFU+}1og)N*rUeepXv3ogWn;zoZ$kTJ0D2ximuo+555+(m ze_qb4o|4YcAYJ^G10F6aw?$zK?Gn^yeA+zwRsfG&zBx{`W??3~kZrWn`e8W;b6Gj5 zdxNEmx=2S*F;E7s;uscnB-D3b8)AIeFX; z;Quh|_^;l4d=>BC{rbZ*to8@5-jB2E@V!v+*2wB7Myt$i=OnP=Ff&a*+*G+O1eHQ( zMItn`HvA!FW_W#xVzS*5HxB4_CpS-sdXRV^W$32}V!D&h2y)jz1~JA8?dc!6&U}Wx z4UM;X=B~bLd$D#stUIK-y6u^u5?7vVa2S{}8a^8;h^@;R2q-TZJ3SVr*##Hii9MIe z8L@0zCtad@WGrApkvxpFwWojd5(M&uw6o1foA7jXIfasN89B9xsjVFx43Kb^8v&u# zR)K>#sK87lcCugm%asVm z>Amkfea@}hBT!*^SU&yZU%WiYdCoQW)qUSvkYZEQiXEUEq?HVza0^fR=?Ltc5C*f3f`+)EzojCgM$q*#LxH~;rAKd9 z24{*$M?JEkGNl160mZx|Ge(ARr0BYJQD@$A+h%_B$GI(z_WO4qKD_$yt^fM%Gc=xn z%CsXnbPw+*2f=eS7+j?pM?l>a)>Ll_(z|x^Tr!b;F=xh37ep+lG+hQEsJ<#|zTxz|_-ekuseBYXpVs=M2yoj{?3Fw$(Aj=>B# zE>X_F&_8RSBv^|V+u?OmhS9R8fAWh9*PnBn3$8{zF$##0c`C1Xhi0@k^eZWK#@I&z zLkhynszWAf7de|u6I9~Gl{nXrQ4qn#vc_mpyMR^Rt3+|JW*$5a_LJRWT^{{$ZpCS@ zKOhOX{F`UCw~n)hgxXkxJmzTuYK80$0@jMwjuPZ=ZCZmZ0^r&0rh90#PFK`m?R9B` zOlGmz|(7q63GDQ&cd%@$`T zINrO5!Vkd!qqWk_T0D1yKL%=gG-eDIls!BU-m%;45)&i2J}I8fuej0@3a$!CR|P>| z0hmDH%f;+#wQ1n59g}NNHwx)exd*9A2RJ!&Idx?73Z)6&sv|99bwrcGWDF3D<~q&7JFoDbXD$|WbJU}j(jji6*IubS zS~;2#vU|u(OUqTM4DGVV>5Cxrr^VY=8^STxvAyHzpTb+cGN-{N)=#KRM8}`nob&3Q zRW?(UdNb{$ox|vLdvCxcinm~E$br-yj-*cB632W&z_pe(Lwpee3^<#yMmlN}CB~44HN?-}0Hrnyc^)|b z#fvLxq&m3{WjnQG#jwe8#kYT&;xgn68 zN_v144-;p=*g9)RoPP3Rv?HJcaVd9$zDF15xA5<;>f>*Vg` zYt)IU;mWdtTR$5wcwWMzPwt*rNiPQuU3#iwFk6Uy!UW#?o``+fU}@ELksJsOF&>jw zHRM13v5XoCkug9fSNPp}}<81~9tMb#Xsb`-o} zLx$hKmUPb+u;pcG`hYO0waV%u6Ytt~kXv`@j>i01xY>oCJ(#450 zZACV#)(HVq2s4-fE0kBussNp&_E~G8W|6kLHpDWi4nFfh4vI^{&5rw{tn>P9y?Wz+ z<4>P8#yooYejH1{%Wpdlr< z`kI>>?8akqja_z%5!Hx{XMr-^t)TYvBtiW727jR0ICNHXjo8D)K zGv(a*uzvpf!>eC^xHJ7ddeNR?g7Xa%{AI=&QVM6Q;*w>MS0bg{E)QbJ!DGb}-frA~ z&2#pH*oSs(VE&1R+CZjYHV7gaz)5IyF{ra1FlzhWA(oR?8EZ#w9un3lOcwFeKm7yv zPY&-@E8@z_!_gyZyPv)7%xGn_*W*{%nk#f-K7_`>e;C1n()fF+6;5#LB3eCg5^k?X$xcX-?1qdLEat{D`4Ly~JzpUZ9NMmLY%nN{W5|_SHB3)$4tSE`RXa z{Zvz8lNL<~L^uS|qbr+En%0HRut6m{&q8x#Ai8Y_16@r#Fpg$+L>Qdx;-aSkGu3Bv znX4B}d82OuO2XGh?9b(yt8SyS5qI3HZZG)ey>}Y4@ZELtW$j4MYbqs0Yt-pHprwX~ zIjlrg{3X2Apnpy++~@wdGE zumAMhdXF#a{+j>b6?~>3k(+|#1){M(18Dwjqx!)g=hkKLwSRbZ-uPF~O|+(rrZ!BI zcn&{1fXq}a{5vK}`^MtB&O(fW9_c>Qsa$L<- z#23zfv|Ar7S#=#+SM2uhcBl2v1|W}4r+E5je*ld%E(IGc;>98JC~sh8&LCO4NV$n0 zDn>IVOk~u7MD8p=thpn$ILzw9c!J5HwC z1Q6~Z-7t|`K_*rm+0+COyU4aN zmsaW|Z*HrnF&K@lAqlPerZKzgEu!paA3wZ#eHX_1=rw!h3>)7|DE##EXZQA`1`YsG z2eL4>aNjBre}j$HH-p`u-h}wd0EfpMwSDzZz(vk+|q9M*_b*MRaLrUqU=GI%uD&58_ zyYV@+=B>FD-Db#YY79Zz-sXPh=)w!F@l(MwE{~N!Lb5VMI@q^F?85tK+iXKghxbUt zq9(*dx)(l>=|1YGOPe534Fkfb={%hg(9+j$;bedOGcdt_>ni=b-@beQjlX&QH|ozQ zCg~sVM6r)v%4ZHd{ZhYo;Nj=bZVOhxd?Be9!^-AUTrcG!mY9a9gNGNiNuja_dEim4h*OF zPW(*-KGj0LxcRv`@ctiezDF2eW0PfxLEgYN?%(dQngR{3kzR)LE>hJI2n?HQYK(s;Hdc{_NCrxGRKc zV-lI3kTNbXVsUZYg0c66j8rlhT-0AJEd=%EncHWFd$=JfP0;8TR{ zzPgTGM<)SGH1hOTym&Rd(|KHbrs+j#1o`MRx_XM6FxI5Zm@GsN$kZ6td9@QF+5lt| zpm&1WbkNVp1pnR?#oufh{PZvW0Iral%X3r?9rlXKkaq9fNiaGAxD za|PU)Y%@dv$XVGqhtu+DG9=A|`&1}t)@oa*jgw-ZzTb54S%3vT821B5lK|Hs|Cqoy z*Vuy>f+`pYuI?@4R+#s*c=wz8O!7ys*)y&X`kpx9)6akYGblHg!>*!-ZTI8wzFcv^ zh{|r4+f$q6DK@Jo$*tObzxK8TgqICGwPHh`(Q(17a1VEoIZBfvwd zh7BLF+N7s{>2hOj3~obvhpSM}!DG>T%MPyjCh39s6Cs5yY1jS_~YC@DEn)F^Vgqg-;BzX!BM^^5M>99=gcu(2b4I3W=Gb*k)5%5v4&Zz z2q}2vBnDn59W-y*s09y=NqgsLy)8WFur?TS+j<;dm)&@uCD&zU+zOKUyY>w=0>gxT zs3ArPO942VHoP||$q=`MuncpKenw5_v36pk!EUs(3v)7j4X9SpljoirfwqKOUnfds z_XMF#@U~ev+lN%kE>Hi;C+5H8M5v)Ca4?Q!dN3HWgLiqh2fnUG)&`$AX9ZCW!fCj7 zq_WPofrlmBBg&a58WVSjGGolO&IJ{k3bFFMK&~j#Mu3e_=jmVl;&WhD{%hCkb%2Xq zi+tiLE3+epWF1ig_}g6!y%o2MNr#W4eZuEDA?}g|ZbRGT%f}Hf;u4Z|9H%nKBWE&{ zAK1Q;vln-)&Q_>({4%{1q;H>8idLjXcgP2Qy~k%LZW)?Cgf%6JJQcX+sl) zd=1F175;VtAi7vUn4F8yM-@WWNe+?KN9LZ1*adtc$K}ikH*b6TH@^7gAHBFL>rfq6B=)%8-aHu)_3kV(J&>ea7b=f|(_WML0px@TZs^u6xhr=S1) z@A?%M#}Ee-dgOpFCSm9__bJE=LRbxSD4mha;i4BwF9s@uH0l?F7kN0Rtq?&{2lZ*t zx>VcH3~w&rre=o&a*tN0ui~`Mt{cADd!qf=Ek+-3c)35RcReHd~@vb z=Da6*yXWc#6NEhGwVO(pxS$zN|MnNZ{P~M3riN<`FE*S^YmFvHWq})Avl^W4p|g%6 zgcsZP07lY|dx29%4Flmi!)MbG18F~pfUn~fw3Zqu^8u;4AebF@%7MElcQ)FcLLbWblhHuJw%MY@`BA>c?g&;h()m{@hATxB3Wv#LL3NCFz8u7{X3sU zN%Zf24ky5^S>(YV=hiIp$yjtfEzeliI(wr%m2-Ik{1X*>n-1V=tOFf@TNyo=F~ptIepQLo&KXYUg^!D|D!jBn9G4Lr$;G4YfXywz%htNgSx zrrnSKK|*O`#`5huiP^|T)r_B@#i?h zn%Ys4#l&U3M~COrs~zhF>Is^Kz-q7E7U+5gT;hSH7w8{|%Vp)J3V3yvB4IFc;hnp6 zui|2pUP%~Q@6q9SwRXUmtuc8R{d5kcTa3$t7w*}HUAt-6y~HcrYR%X%2zYW^4!J92 z<_!@?PR5s|dqB*c%B^TNSV+wXt@)OcD9P(;ty}bwHGyuR4zv#X0UgNDpjHG>oq!9+ zNpy}ZL>WH)dq05gS&=+k4K|`qvT1`Ek;;o2F5F`HP^I=!j)Q&W@!Q-~DU zXvcC=Z_8Y^8yBFu zW7E8QdtQI_;p4ma_sLQZUb!D_SoY``oTq>P>Kze$xF#56tu=J)!6u}odHNDJdYsn;9S=Bpi z59NE<-H@~BYp!Hkg8xk<;_ z5x%t5HB=n?v_f<-6hGo_INeEc=F=D*3C641JXwG|9)#MS^tnqqa>N^xppp9%ji7q; zvi&$Vc078YVqkjbl<+-d1|efG*`yAO0Ez4g`Scn!v-}@x#bQ zg8ca0X{M(iY3)KB63goDht4bzdF?jF5l%oK43GD_|zd#p8h1qHEivx*FH6>|eRtP-^s@cr%tXJll;5|s z0dmlA^zxinL_#=kJnwd-Q6bCa;_Qe>fXom#mw2m-moC?vD=fZz35;?W3c&AA0 z4h+XxF&R<~TRazvgu=ZcW-By-CNcWn8Ui!>bVUVrus?kEfE&(7yS?ti;{5j8J6O%5 z7wyNn^85ffW7+mH1RRFSi4|z1DQBSQA&r(iwLay=lE)b`ad{lt7z4vSokr^inQaaE z3}?W$;1OZ!maTC9Zk96~6}R9w9lJc^JAAZ(fU*teJL zzxeI1zP*#8K6=TXK{wD1y5VKIN|1Do)2OE$whQaM@jRPyDSI)wiHR^Q^%lUb<>lLl2ECYdxMC2FKa{EWzME! zWgOEs14e$tbUB)%26E@c?&l3;So5*Uan{+h{HB-s1v zc4Ag4zB*l0eOPZaxFJliuT(oTvKW{Xw7Lkk<~V84`7s(O#$tn-;C)Y{aKt-JN2FG} z<8d&=hIptn*^bACU9sC$Ix%tu`@;Bv28K@=VG68xW+UCbNmGak4!XAk6k44s$Sus0 zAYql()@nkKzB{rIp-vF>edSb++dcAkz44Fr;p3~{KAN{9<_9m{GyUmy)1Q8sKHX>= zEfv)cjYut6B2hl5DTv6!ye{1LXla~wHnsG=vxyT(gNoCB)DgEut)-qrT@Fj>cJMn> z+l)hKOpctmrzi3%rgC4j<>^2DA+DwvJVqVoL_&+?>H|3X*~B;Q*rQHxN+T5SJ3)Dz zn?p}(*5ZzDJsM^m^X%D1W3eqf#PIflK2o_#kw@S?*g6c*=<*|Pq1`gKNEjV0KfY8c zjXUJDa6(`d1JF@xahT|sSh}23U~!$okB3`V=HX zE*XP__O&`2+KVHPggAELK*+Y;0IJc$zr!DfFdU(l5 zpzo_sJm2U-xVnQlZGoFFt+At$4`v-aV^~o2Lh+SK5slY6y}<||dyKIW7~K!&8eP!7 zgV**%t=1*8Cqg#~E$ejiypYCAyEAB)*y$rI7JBHeWyXLni z$ZztiSK%KjU*8dZ9=&qU$}`)IJo7WW?kRdQQ8CPM0@t4EXbdJ1573~OR8_OlTqo=4 z2<#iMOf)(^#2IcC+B^-pfsHva=Lbm-&lN)KMh*!4+MJC7;Y^sCu4`@mR^K%CY{a0E zcNU$_YdRW^-E4E4j4UabUopBzMx;*WhJ+9Ffq?Svpv@x;Go&2>ssNKfY`+ZWzxF=I zlHRI35Q?;Lk{~hxx^&&W12W6^;+3!7ybFKxDqp|96R$ja<$fGs-_>yJ((!^YkcdMW z7=vD5ekja@2a>BnvRh4$*1C7MSZ%jZy5JlhqR{Di2dLGYI}(T5*aI1(G^E2rV*{9tIO%&JJrQSCA5wc^7;H5sX+kuY}meQ`g8j0Fzy>s(ki!k0l5h=26ud;AKf|ayz({$a%-p0n- zNDug0E81BO7)0*5TSaRMpkPNl=b`LlZUFlu15vENjSEtU5!JS5lwD{RMHUVQ5l}zx zKDJfHigpWu{`r*|!OsL*KXlQa!KQr=I`FekKYww&!@TsxtJ39P0VB>`t(pXCksaM-Uk8JLQcXG4tc!Vq#(t!6Z z^an`!1LI+DX5rM0!g_1q+nLeIMntSa*0r-EnP!J>(N$wOAD%J!mlrh%jmj<+{Qb(R~2?p;kwR1qqdSX~)y#xev5M z2PIOgIMv2MgxO@Pe%mv7^vAhX`7bTGh14R9@2QvZ>< zYRzp2QiFW01JUk)QcSWmgjQnt*6QfD4{D~_RiLej+a02TUR4bTEMrhK2!W+Z8*6-+A^J&==4o?wePFl$C2|GBHwUnfF1TpF?2s;o6>1 z>+D6xtxN2!`Sf30Hdai9VZ!f_R6t}FoyxAeU0ZGI0#uW0l5_-{@~|$t5dv7VIaY_^ zC4icf5TP+)?r}njfc4{qu!G~JupQ7@z0R3b$l*I}ggpJ1Uwj57-P3<{eIsq2S$nNC zxM4DVokM$jDTD6`95|Af8AZ8wXFa&NY;w0*1VmH{B!spVO#So?E`JI$ynz=$i8}hHCPc!BfNPld$ zRD;x+4rU}_x&jMO$iz@Ova2De4Nz8i0<#VHw58xT!4tM1XumlP=dKZ4qmT^0|(k=&+r4H6=vapzl6w3>`zyWqp(iFsNm1k^?mG z?x6CV<9CtqLl>Y8zM;m89tdsO3nQQ5nT{9eU`IUJnER|Fg78J)B8~cXNsE5wQjP+} z38nF54Ncpp2zRedt1HVS`0RXNUDDjHEw%0;^IyGvMs)t@MSG?tCpRs*7ht-+{ATMg zwdLBF`WNH`R47wKrB+9p0D=P$JE6wDonevk;@yoJAt(2frfcMp8CoE$IppPQh;`(4 zBR*En5V4)vI(2u<4F!1bShsk0a!akAn{(yW zyz%w?xiedEfNvB{jyF0c&6rkjXX_Zw>% zgx}<9!&Xt730Q6S+yKF?0UEC<*&*IF?X;$vy`$nH*}g8_>DAE94fy^k;SyC;Z86oK z{@V)&6!U~f4b4$_>c@#02s5m)MUcs2(ibQJAd{rdfZDm^enEls#n>@DY{I+9S&k|A zLF7HOIkUmjWmC|B4PV1HP1$-z-A$-^g|rSbHULI|W%4?x=>R$>z}YZzXa*Jb z3>W;)p_S1Md?+x&kl_c;nerKk6X*srCC@QhPhS#VG$T9BhRS-&KGil_AqCLY(|>=J zynFN<3j^DNPa1+Di{(CJ;!;~V^n%miriHmjBjn3j+viHh>SitK%x%af?J0XJAaG_0 zAFhc=0H44W0^-v?6*eoJxYpA7^gn!Y+3WE1A@B%s#u-`Z0qP&1m34ZomT+I5J~3P= zgVV@{4BN^(JM1WMavrWVHc!8L;IuhosROhz!b+9~6z7&YP6s|F*rN5dpZ>=$e)*SP zT>h)AqZyB`CxG_I;fbn&Z06$~;Z-(T%w28uz7M!FlN$QlXK4qxX7ka`!Y#a^By{{$ z8 zfz%b9pi{uxXAJb-7mxHw$$db<(dp@b`T^!61aJaHyPR1HuOM`kAc$pBHbml1AgxVy z$o4kIp(YjG5Y^bSsKoj;w*x-QC1(_X{1*T~(TT&AvTH}9p-^GYg@CF_X!YI-75bXN zQ+;elmx386F|^@2UVy3^2xPI8%~L_uAV0YU5t0W)FTk}McSgb460?iwDi_j{hF-jp zzM1+Fc-y&LPI~JYM7oZBYqR*v-}?J{`|;H`@A6k~?h4;WuidlhGIWzJ^Ade)J+LI^ zSOKWM_n6u243H47!fDQS`kKCYwtzM9$`TfKQx}yGcKLBb?fY zfO$%hXXo&?(D~_9bFbEGKmE@?z|QAkXW3e4iRl(8lYySl9)!Frg*6ca5uoRAonAV9 zhcDbjv?o~)KLrZ-S!0n+hP|lvwrjHC3TY#oHWX@c|-X%Lq!?tII z6jY$g(#M)G7cGPwoPrQM8FAFzhE<_9fDDB;tjf16!1wjx-J3tDSLgk^J8#jWm+q(P zq(oJmXadQ~0k{ue@lFRu@5t5s_>?|u?!I+Jmia|j(LOKHGP;{ICQ}e)SCd)eI4GXy zNZ=Sz7g#(J5k)hrwcIWoJ_SUVpYWD@^wK@kOl>#K)X#IvakkzFu8BniV8BA}0AcjV zu&VS4jQ|37`jvx{;b&niYKW!GQqKZRtWHZ2y((-l`KldCpE9kI7ZJ$`^0tu=3FgN_ zzx>WS+3=S%kHv~c*anz?B)*X`8|KSf6PHQdVy#+(S}K4s9EZpzx}>HEN^4EL6J)5Y zU_O&hfHnus&Dq#-rsKh0FY*fA!V-`pQ4nt9t+b-JPoT(X03DK}RI-pN#PSy;o zRfkbiYY!XJynM6!5ttQ+C}SagDeeCBzo37%WSr3(qX*IhkadO++Qu-lPUng_XWNIv z+sw9m@wTWr4xuv_8(;R=tke;=TDBRybI4F9qk5~&yX|bpq(<=yWgB~NTSM|Z{jWbj zl-QhO!8`!8{fa#noih=)I#+{pZx9TQz7CE!ccf>_0wK0G&353LTg4;9`(VIb$2j=h zf&2xs4#(#12xY}=p<^tB{2Wn3j?B4r#em2QhEf}59k%j5_jGU!fWzo}E2prMEIeO~ zr)eEGL#yn7kg-Ci_NAS}_Cox?ag$U5d{EIv6DU{-jZ{TjD{XW2vyw&V&OU!VcdzO< zcc`)lFWWOs1i5J<$csFB;O`d9)dmXyVnCYaMe)lq%^V;zW-v!EtB5_E=pq3lAc&U- z4@x;@r|nivqcJmOTe2`9jC9~UcR>zPyESA%DEys4x|Y$?|Mo+)&lLX#?xW}gg)piK zj4PqHSY!@XJgk{Mc3(Wt%7rF|@ zrx?dIa?Rtno4(I0jb(@8w%lS7;z7kn&m&N(59RV^0|u*4I^7f|1FV*tG~;M2yoVf- z-~nxDAP$+hm>P|qDuAh0$c`Ls&jpD4oJ-o>4DavxYaiadef6!s|4^^$PwMTfsE;4( z{ik=(U1Q6G)qsD#lW3yT?ewZ zJe%h*#H=Jnh9@XFujtNrfHufBPE-_UyS`aN?3)0g9WCoq2g?Dn1J zMl#_tz`dH7CiiT4#^vWYNTEvVzJX$09rdEfrBEZgW?GHv1QY_mXcU}cH7n82*{fnU z%%`SUVPYBFApdU0YXJ1T>5hjRI#7dA%#naF%mXm4AdR*JcOYJ8E=Ug+pkBDk(e8kK zM6hp*GztWb@MX1zO^6*HpnpwMHPFcf|y9ZZy1ct;n#` zreup~J8VV2^4=;MwKah4FoghOHS0zIm|{Rr(0R7$TOjUTV8m@3d(AGrsF$>-|NRGe z_3t1g;U!+FW23)Kc6hJcxF~fxHSwlGJj@YvL*YFY+misF@GdZ~b`j)X;kF*?xRiKa z3MbgaN)Z~FV?@ADri$nUX!fb+9iZ%|w*4Qye9vrumYeN={lfnTw*UX}|L0l#zs|D) z|5mdb?bB2nP&D3$yWmtV3s6JAxdPszmrPdyZh%_z3vMQeCKo^J82pc!9Xje3D3Tl? zWr$}lZ6=};HzBBZ`EUO0z9JLzNHgC$V1F1TM?SN>WF;on& z2xRB>My(i-MLwhht<*`6JS(#um% zM5BhMz|_;I;*xCQo_m!D3>tP7lQ@XtIeRD4mQcd3b@_ro3|nos>Y!2;?W_e_&(HvQ zUQKA~o{2c4c}|hus+|7t!`Bu5_N!O>-8bL(+q{ope(dT!)0p}GuHzRXAgr!IKoTG; z_81-X^I^w9ZHAG}NdR5XWs_tl{IFXE1*H$i~}IvJo$ zt@qi*uCLW5IAimGUn6>mca+`Z@TIPG(cwYiYYlec76TNzrOn5Pp?fi{ zq1In;s=p~eV&3fMid0lv&JqNI%46E^cDiltjR)3vK(*a z8gt2j=rTNdzm;D-8uD|q-Tsc(Z|{KOk6y87id?!8BYd8BDmzob)S|YKanZX`=iSAf zz<~$S48dJO1z8$9^`q8fa!Uay0bJrxmFVD&Qnx%{$HSq~O+v%9k9HVE=Gq>9av*n| zFt#0cSNP9=r#*Vbew@Pg<#$@>l3cag3`~L>q!7jIn3VO7?22I_Yqq9)3%AazMQmS_ zl!F%{)f=S2hizH2t6__)^i>;iLKzu31z)+s)g(!MQISsqJNXtSM`bxVd?Dn8=Nd~f zuXf~Mme_{Bh(xbLpyv-*(J1TLIBr=vI3!Ihz;k&o%)OzD|^U3v@&Qwbg(9* zpcuzk?=|>N%KUqO>Tlk>{_ycGS^B}N_EWvQ^IRf{EE71YK&My)gEE4j2O;kQA(+eI z4NH#0t$HOZOp4lT>zIyiO(%i@OtkA(wu&dB8BBlMDg|k2%m+G6(B#`t+1%g z?08!!c$XU~MPqHM-TFewyUfEbPIu8oY}gE-CPQ;Je=3L{L9Xb;de+dN1>w!M+C zT_BK;NfSEH(}4`h1cGQ%>$cmSMd|nU*Zw~1Znr&p)t-^d&zo3|`8n=3npa@rILift z0?3Te9=n30Bq9}36sW-FUSk=0`XQ%!+JGgHb|3=^X)LKSV=zaTrhU|LXXISx0up9g zqXhSe7MRtNnpacJtn(@#xk2ac&7$9+Zqm3Krr<17d-2 zM1_xnG>F};buVCI#+clJ#ejfnM%qwbXZPv7k2$ApuvOOX_#S#&J+J<2?W~C)WZP$U z*{DKH%}EUI?5Dr)B`?l@hCf*#DR<9PaPqKkyrFtOU=c-YMtuhMBCiT$vPZ9srZ>{KYI1OT5dOyB?#fr64Dk=pg-@UJ?0yg|+q+66@Q zTu6eLxExUQ)#Aj-2BwK3j8-5g*Khd;3f1bEMBnsd#(1 z4QE)E;Z)86kVY&%k=YKzRoiaxV?t@4a_Lcw*#1#BX+cgS?kN`Svr0wytwmHvS?TBn(ZhesoU?5a{#H5!EWn&)|*=Xsugob24{ z2D|Q;5KV^4`YI*vIx{=7?iV-Scs<8uVTt%<5|>kuf- z(Lh?|8zvMr$RqYXIK~g+F(zH;C~};DXMUBN@~NsE)UF~?Vv>_qjluP$igg!siGjX#`NwK$NEFM5u6Xz6AU1m_A!rT*P3l_Nk(H zW2C1tF^##UWVhmFXqTgJ@R&+;&)j1nPRoXKfu1o2IIAznnf3W+fB5G8yRTo$QeS!D zKCtoiC#>Jv_>bTC4q~HM&3)(T6RSmPTqH+5=G8r>=hl69#+?^sHH^%-ut(>(qZZ6o zz2ckj=z%ccTX?n8lr`C|UUbQ)l9vH{lZZ+NGX!o$E%JK%kA8%WkM@1yb#(=SiU3Xq z9hgz=>`8GMFvD?TjdJmQvP>lnQO6TcJSsCnGRHo_j4ax?V_Zc>5*}hiNi`t52&^0s zJ2&FajSmu)pEthugVlQ_3xH(MG3G^Xk=}sA7JN1K>eAg0AC>fa1P_vlWb$xs)J)@o z4cm)YQD!Y~D=U0{{9mrX&kZCr1jWO4U3Fee&j|kC{<6RN`tvXQP5u1KuU^`KUwiSs zw}4AxWXSZcu6Fo82iWyF=S-V2FWb2Wev=2qrhU&aId_b?(gnO#;U!g&*CpgWNmibS zT#Jn}Ncz~Yp=+2^&n|KvJrjbixb*fPL#?$+`iSho-Pf`v;jM_kyFx%4hFUv~*G@Zk zE|%;Bl)0CVJ5Y{yt)q|98A?DY+cHle5*JuuxQKHjwSLKz0e{sZaL|3-sM>G;@sDuZ z3gQ{PeFGCS?3SeMB{l(QNk)6z9JVdQLqi7!Y;`#UePPx;Ch6i?9uqRQwS)J#VTf*; z;S5h79azYb)#~noj89~3+&*OSw|iKKX!$6{2&@)3rof!)95xZ=<>~O? z`6FebDfeEHvPS62fHXJuy$Bv*N=T9s+&jB)4K*Pf z$Vg15wZhI$m zh;#RlI((jQO0T@e&qDN{z5Cg_dUIcl*$l^5x@7S%Fa3wcBr(Of$b{e~ASLL?D*E4^Y}#DC4> z9g5)Yd22kAzCV@i_S(z#K{^aQ(P4go+pQK_h~Wc9zK$#ezadctV5v23)$lt#5GP`G z$^r>4XiVHgFgYItZuhlCnR8GzoGu*NTP%$DEVQnNPUs|dFhaiz3C|g0ya?Wn24C#h z@;po{Yc(z>K{RycfF9$aT_+=y)Q4{s8R{a4$PS*BXccG`Tqu zfMbt{5sK(W)kV36b__q1_sBMci^sK*r?nS@ayDIP9UIFBB;i=$OS+31z=?D7p?IL$ z%uvA++zQXa%}-~;z4pR=s>oT*c|wQWmOUaR#)BYs@7SR-9?TiL;W~!&j2Y+1dA!;7 zL2!~Mb?wvR)ZV)mQtw@T5$X2TR8(->c^zGmdJrscn3)P7A}`XOKb;Nt+6(tVgBLv+ zyncWiZa3{vG#>bXk9Wu6qUFnX0Sg4;EE;H|_)g$G>C_T%X9^;)qZWOg2n5BAzFX6P<$Z8+i{x< zLs-)~ z457!)cN_#Gr@07?nY!Z$z)adp1VgCa$P}CSerrKM3A)4pzTnfnG`#l0z1VR6bZPJ( z=B0sws8AaANH0Qm^W8Y^iHZ^{hNchj>@iDaWM+5fy!#GZoHRJrpsBrMuX8N{jnVxe zkCZ4No(o=((YAswVtP4Aw$39-FZ#|WmiVL?yEc-)>`ZG&L{4n3Ch~ua@WO2a>+sm&fJV*wzJG;;+Fsdn0pN!7CGM6!uO9f=% z3cfO{0wiRq3JGAOATi${2i|$Fk6hp?lK@xfTMfu>Yt2u1$G!H-z1VTk zdVS-ZU?qpaf6LI}>WBobV+k7B3`EyUgrsxv+CFoUiscAc>%x{Cs1~1g+~51|t2g)O z@8AF8-TC_W-aL4^$uY)uXz{z>&Wjs*;A&rOXpb$l2&QneVW9( zb-{7d2(L=Zx?|ziGg{B3*(ATtK>7b=hd${;Z$*M0ek7 zui~dlDw%g_ox1Wc=dQh0rI28eqB8b&c)1vFBSC0=)b4}yudQo1`>qKNsQN0)6HGpU zZ@n}2rtU_dQx8j@Mx;PvpH&8bj@Q`w+@ljkS~q2tARcjVgfG%#s(xT?xZn~g4`ef%zC7OhrN4s69JY)2?ZBGo&xTN#jatDVb^`2KahgrlFzWOKfm9< zh@*Ms1^a$_a}VvrIrvec=nf9Q;gPL-WPp#6z>)7=oyhs}GCpIka$&ekzZsc;1l(cuS)|4uZfh^E~?giIpRlXfa zp-*v(Owa;&A&wdc@g6095-_JIT&^ESu5NQaQ&-UK7tO1sSs+H*-r!lmdv37h4ceC# z4-O>;!7R*F9E=ynYS=8(ssZ_{oVqVhSY;6qwnq%kt{Y8#uKT`ICGvXhHBRg!!-N$H z)6bHkU)1BB^8&v1%B%LhWm+SZI}qqK)eqGS+QfTLg++D+pK%vJ&nZXQZlLg+XTz!A zkA8Am9XTxw!)p4=#V1ZZNL5JK7ynu_FU`AN>CxB z5~LNiikW$*%}(S><^ZN=RKv2EX(y#a1NJSg-3)r_ewcX1tXWkhxtV-+IlJzp^fkr` z=rKU&Q=E5fBcC-MGK(6_0^-9@U@|Yj)t78@8FYbeM3g|i} zpuxOTr3)1`ErF>4aTUEs-~#vvxLc>D^%}6L^)-He-Tj^YzJHpZef{REFW!CjS-*5& zyz=UOKYRZp3_?Tr>cx;4nEC)A`b6#twiy$E$b1mrhE}9x%bb)GSVt-g#|Wi1{wffl zAVS~C#?vn$t_!c|>oA|!>|8sEJmEH{9>_7PXCYgUSmCp(Azehn0wi|Ya)bgo)#vVk z(Q^(LA2u#fs7*NZb|QAe;bFY)Fnu0oj!T(>_*bx2>N<@k=hZiMEDgFoxA)mLqn^9A zzn!1`^*5jIulmbB%>Djl4A3ht-Um2c^2F(qk5t)%nG@ILQa7|*O(2JDWWDbJlHb{f z`_Yc_*>O@K!=qW}5vV!WsS+|6&le}U*oX;P_i|6+dnnrKj0L2FaD`BuGo^XvnXdS{ zp0>_wf1E!F(fRtXf6-t4as&NsU;feWfAs+a&M2OnX%#{T%8z)eLB2{i zBOsBg#}*X3cXKuuXzu&!~;oNG_0D{o~wj}fhH=P;7AF^8~rTj!y9N}s?+n9SUJ z3|TDefy*{1md}EYZ#NK2Y{%JFj8pgQ=d0Fhf1D3~mB01J{nnI+Ix6vL^XNs?*yK%dO-3Q1ICDqH| z`2h4c?xLm{GL*&iK7FU1ksg7R&Yg1&*^zl2xxNbeABI0WAxlf;+0dO|$|h|7_A3H7 z$sj0c5lIwlEjhuE>B`8?7T~OqXQ3ow?ma^K(Pkl``TU)}_Q!cT+5fZ$Gp)7=fjKsuB-zU3>*Ii)|M({goToZ7oCfV!kpDlPb~p*>ffKrk(*wb+ z4*!7JMW5>|-=?lJqZ8cR)xQMrW*o;IMtKvlUxb-IPaIzP<2-$df73^jnGv{-Fpbu` zjdJ33&DQtkBf+PDzL5}musSyw#E6UC*$ue%$A#iM;axY^st>goS{cmh)tn-D8QyMS-lrv-f`HQO~$q19uHg&C4@l&$HZm z>hUvdICfKACXQoM_l$gadty~Li*IL|7s$#BU>UGZBaGG=L}Rtd5No@Y1Ww7b_7&JMe{oB2RM z0_m7`w8<=7K#t#t6^=Plc+{8`{K%>J9bs|L&3-a9a z*#j){U{H`Ka?V)2(Y9;HDFQ+L z>|xRqLfVETzz%Q!`Hx{HLodEdXrWhsgk`UiqpSLi(-k9ZKqwodo9yh+be0r7Fb*cf zicY9i?n>}6rAGs&z8^40UNTKa*7jrbLM3#Hr5xEkHT*>w@29l$UwiF7(DzwSeV_IJ zjh+85e1x6Pxsf8S6AfgbxGo__EmVE`I8!m(P(kQ8z>7Y~WCu_cB58+&sLtq(L4Fjn z4wy@hcN~Z;KN6kLh7Xdf`Dakqll z7}6`<&~E8vIwMVYvyeM(;+JK~I0(&jk!5}mT(BP#sj+X$ozuL7-u}xUVbq6H3xsUH z5AydMW8jlYL+0Q|hepflLyiC;!QC+(Ma-aCvbGnR3PLb4U9K&0`2Z>cSdA5rIC~(5 z)gZ1okM&6;ogK4L@f`2?+WYPKrty#s_g9r@L_K3OUU}(0RasM@F|m}VPNYxI7@JH_ zBDJIUBY$QdJ}_x=$jzSjqP`$Kq{A4tUz=;BcD^ochi{<*%Df8^)=bILk6x9D z280w=x1P7$Yd_Y{Q0ZTMnP0rYzI!oad*yZe;C>rV`|Z1^wIKMKi1iaSiJ52AbVjuE z#bC2?BgmWvvKH^YckMCS5o3>m&Qa(DYu@YuYey%Kv55y;>agvYRO$u6`GGo^V=KOr zPTvhQ=Y9LH;JByl@d!*{L~dfRH%{$ozoiSM5mv@c9~97ZQ!!0#ZM|7;h2o4jMQcXHJ%* z(+A+~8?BxZW;(ZTrTcBbnSKN5|Ly^2mkf#Zn*gU-+D-^eKu)=Y%M28tXVyJwS5^#y zL8MjdN-;c27wE)8bP@KsvmE^It|f7r*AVZ^OI+ED%QV4B^xbzT*PYKN*;J62w^bmw zPX}K#QWqf~pyKLaK8`T9CIc5PlxhtvzTilch3Oz!sybDMUPxv{{rWxkpe|L7Oy1$* zh~?S_Fw(+58+7t*FFL-l?Dm4edioO6nn|(eF!SS;(1ZMkAq}F3E{Z_S-)OG z<`{W_ZP?BmeFbXL9)?Qup@)G{V*!#fsOIWG5Mv|rJwxXi>?v=l-;yXv*4rSR;M%+E5E^Fqw>}Nvd z1J2`xHK)Ftse((%=@z1^k!_+jwk#n8n)e>Q^MxMm z)3ltt_9}kxbfu@$^}A>f)}BbWzo&ejyL4qh(K$Wus=PJeySEk^`4D#IQjkat`s>QI z@+=X9T<1bmRY#Cn&W{GrBt^%c5vwqA8WcSFNOvV!w8pTKxBuox=!y?|Xpj#OY7jah zF&i+{?4%u6*MJlT8NT4@wS7x@GSuuqsOMgNuVI*2v1bKI+mK!?s!ISoc*xwm z2ahId7)b?G;T_}dtm2BHsJTILT@&ism5Q#l+H-&6w?5y$-}UvI{0jWy7goPlUb{~< zfP5_>Biy7O*Bp-U3mC70zT*Ug(wyM_^5beHt{h+}#NK{}B7IVx1|Q4AW-9g`ehV5<5`N_lken2zXn7;bZM*<8pY z(v^LXYjS!G3#mC}t+@jE4z&h?J0SwiDF(NEDy$)UZojpk6(66}o_p=J`&7Yidybfo zD2>hS{HO}nY9x5`f-)Rk^VNGv9sp99xFbnQjckC9v7_hq6>Chcy%2bqyY13~<4)OC zfS;XfEj~yCyfJ<4OX4=3&$)YcY*xD_mxR{Hbt8~7?_=}wY(|>+kl_H1WP2<=+H3g1>QbJn%Rh6x+($riK@6A>0$(_ckdVe)XQal2_t#O56XfjXJ1&?} zu%bH6xfW-e-r5N_?m#N6fscHA=|GobUPN@Y!^aoFusQ8Z{@tBL7PHCx6XCX7V#lPJ&}oRX$WklqOAis(3x8lu$hKS zwxut6=woyqbSG+U@;w+@)%8o2w?J_Xy_uN2{kI>TV#7Ef?pmJEwJctP5JR>g`^T$x z0KgF~3}<%?%QF_d6btow4Fd8HppG_PdDI+@&jeKWdf7;6ZAEN}gi^#&W2RKUh{@b< z|DA8l-4P^L_SH4p;?AU5-8a2pq=u;6eGa_Exi`!u9@ylqe5v?IM-N;;Kr~m+I?DzB ztrFOU1`stmC$%h4FsE-gPbTg}$a#AE@BSEq@$cvWdOTb|`pNIq`*%P2{jYxa&wq2x z1RXXkiueRRDq24C>ciGp6pv&LL5xp(Z(c|(Uk@4e$cVmd`yv(yQ61=eoLU4crNc-Y zBVojwrWIUtk3)nu;u@md_vIH1``6xm&&jIqK6^0$f9)0fzUw-dbick~L`yTt1tT z#<9Ck$K;kX2P2&Q__>7jd=^|-k4xN$?K~C(*=$aSrzLQX2QlbpT6gkRXGgBBPRg)$ zf=Op$gskHnhoc3)6--U=Q;fS0nD%{oZn4`dS=J#R`0;b-<^7y!`lH{=uRf@^c8R_kP-GwMr+x<7}C09)QzHi96;rle#oNO~>e|s*#znlwv1dV(R8fcM3a>MI- z`aZhwYaNlXe8wi&z2XLXd>9_CvA;oH;#!-oc4;^P(Tc$0P((MAVBTu<*+u`P0l^{0<*kIYagcv zXXUu>(ViVk9(K{V>)1vcMwyr93^`63NA^6=v&zO4YV1nDK5$MI+fT{~11y`FvJnId6>Kc&H9J({Xc^V#@ts!i?kOdsVf=#&Lfq|WSu09)FEChvsVgT`5 znGE%Tri?*KS2>c+rU!iElrP3Txl2h4zM~n{47lFoA5DjVS@!PDTB-*M^q^@cGs4zg zrPi^5L4eMa7F6^bR(hG_pus@qM~{JwIEH$%%x=x8>pERJHBNpI`0$r2>-QQ~={H~Y zKlJnd>gAaIl~?imA$Ox92B23jq}c+gEIQ4ql=aA{-j~5%SUJ~h&$2kXcJXFBGCH{% z6ykHhh+3lDJO`>HQ253KVDI+14-pjHQ6heC(4L6lT8lN_{(C=u;C3{$7Crg7g2EQhyN)WTHjP&OfwVNJ%AoUkd3B zv?>Q_mkSxt0;4>BsLl)nM>1d@c;T~|F4=|os|qGK|64!#?AHT<}8 z{chgyQeBh~VL90D+1f)v)YpQKZ6*vAb4P8Rc*G2fR(UqUqWCZvG~1I{Uc_EDsXpJvQX{arR7r z)K2BvD9&McM4ob}WW-}Cc&}}+dm<`Ib)J?xj5H7rkMNXMw$Z>?fS`pO`EEG_wA9sT z&bkdF=JU`Teya-n%lZEOn_r($zPRqb_WJ$$?*GkSb=ZRu>Hl4s$L)! z(BTTsLm;g|LfyMS&f-WDHH@V7oC7V|!^{cGoon(#`Hk+w+!jD ziyXUPu5pg|*0=xZH$$U7d6Q|WCwpJ_p#!t-l5vJej@ol8FPuS>*8)~Rnh}HcO-I_t zC91HKfnvDtC57ad0P-+9(wmQ7G@2f^)9l7lppcC7_CNbZWj%!LPJ3uLagGo4dPq8^ zI~}a~-r_2PAJQw*_jCdjVX)95VLEezlc?7lTJyZ8c|fVY8fAPB;U47uG|110F@7|x^+3!C49f)N9=x@xl;$pD572Na5DC?qg1^CGB z^R6kDfbM4K+6Qy%JG+)|ooML;1uK`=#r{Ry*uZn z_;h{#voF5vufBToWq=bwG`!jAXaEBL{yG(BCVzl&Ly%rNUE_>qd{Wu9isgAoeQ zM>B10fOfQfW(Z9T>R?>WT03UL6@5D55q4;z4fF?u(uw=t!sQJ=nYwWtjUf)UsA_^J z+x7Op_y~3D;(ZBzCLVXAr1Qs+5;tAHx%Ko}HY^#Z!U5GZ3H-foV@|>y!`=7nA>0JO zeH=5R^vcsf&g;5@h~wl~v*&`hP-T&{-1VYv1^zo{Uonhkr%zaXOczY*nQg63u?$CW z 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 literal 0 HcmV?d00001 diff --git a/.yarn/releases/yarn-1.22.22.js b/.yarn/releases/yarn-1.22.22.js new file mode 100755 index 0000000..3ff8687 --- /dev/null +++ b/.yarn/releases/yarn-1.22.22.js @@ -0,0 +1,148049 @@ +#!/usr/bin/env node +module.exports = +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // identity function for calling harmony imports with the correct context +/******/ __webpack_require__.i = function(value) { return value; }; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = 517); +/******/ }) +/************************************************************************/ +/******/ ([ +/* 0 */ +/***/ (function(module, exports) { + +module.exports = require("path"); + +/***/ }), +/* 1 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = __extends; +/* unused harmony export __assign */ +/* unused harmony export __rest */ +/* unused harmony export __decorate */ +/* unused harmony export __param */ +/* unused harmony export __metadata */ +/* unused harmony export __awaiter */ +/* unused harmony export __generator */ +/* unused harmony export __exportStar */ +/* unused harmony export __values */ +/* unused harmony export __read */ +/* unused harmony export __spread */ +/* unused harmony export __await */ +/* unused harmony export __asyncGenerator */ +/* unused harmony export __asyncDelegator */ +/* unused harmony export __asyncValues */ +/* unused harmony export __makeTemplateObject */ +/* unused harmony export __importStar */ +/* unused harmony export __importDefault */ +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. All rights reserved. +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +this file except in compliance with the License. You may obtain a copy of the +License at http://www.apache.org/licenses/LICENSE-2.0 + +THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED +WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, +MERCHANTABLITY OR NON-INFRINGEMENT. + +See the Apache Version 2.0 License for specific language governing permissions +and limitations under the License. +***************************************************************************** */ +/* global Reflect, Promise */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + } + return __assign.apply(this, arguments); +} + +function __rest(s, e) { + var t = {}; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) + t[p] = s[p]; + if (s != null && typeof Object.getOwnPropertySymbols === "function") + for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0) + t[p[i]] = s[p[i]]; + return t; +} + +function __decorate(decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +} + +function __param(paramIndex, decorator) { + return function (target, key) { decorator(target, key, paramIndex); } +} + +function __metadata(metadataKey, metadataValue) { + if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue); +} + +function __awaiter(thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +function __generator(thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +} + +function __exportStar(m, exports) { + for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; +} + +function __values(o) { + var m = typeof Symbol === "function" && o[Symbol.iterator], i = 0; + if (m) return m.call(o); + return { + next: function () { + if (o && i >= o.length) o = void 0; + return { value: o && o[i++], done: !o }; + } + }; +} + +function __read(o, n) { + var m = typeof Symbol === "function" && o[Symbol.iterator]; + if (!m) return o; + var i = m.call(o), r, ar = [], e; + try { + while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); + } + catch (error) { e = { error: error }; } + finally { + try { + if (r && !r.done && (m = i["return"])) m.call(i); + } + finally { if (e) throw e.error; } + } + return ar; +} + +function __spread() { + for (var ar = [], i = 0; i < arguments.length; i++) + ar = ar.concat(__read(arguments[i])); + return ar; +} + +function __await(v) { + return this instanceof __await ? (this.v = v, this) : new __await(v); +} + +function __asyncGenerator(thisArg, _arguments, generator) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var g = generator.apply(thisArg, _arguments || []), i, q = []; + return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; + function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } + function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } + function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } + function fulfill(value) { resume("next", value); } + function reject(value) { resume("throw", value); } + function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } +} + +function __asyncDelegator(o) { + var i, p; + return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i; + function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; } +} + +function __asyncValues(o) { + if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); + var m = o[Symbol.asyncIterator], i; + return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i); + function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; } + function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); } +} + +function __makeTemplateObject(cooked, raw) { + if (Object.defineProperty) { Object.defineProperty(cooked, "raw", { value: raw }); } else { cooked.raw = raw; } + return cooked; +}; + +function __importStar(mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result.default = mod; + return result; +} + +function __importDefault(mod) { + return (mod && mod.__esModule) ? mod : { default: mod }; +} + + +/***/ }), +/* 2 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +var _promise = __webpack_require__(224); + +var _promise2 = _interopRequireDefault(_promise); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = function (fn) { + return function () { + var gen = fn.apply(this, arguments); + return new _promise2.default(function (resolve, reject) { + function step(key, arg) { + try { + var info = gen[key](arg); + var value = info.value; + } catch (error) { + reject(error); + return; + } + + if (info.done) { + resolve(value); + } else { + return _promise2.default.resolve(value).then(function (value) { + step("next", value); + }, function (err) { + step("throw", err); + }); + } + } + + return step("next"); + }); + }; +}; + +/***/ }), +/* 3 */ +/***/ (function(module, exports) { + +module.exports = require("util"); + +/***/ }), +/* 4 */ +/***/ (function(module, exports) { + +module.exports = require("fs"); + +/***/ }), +/* 5 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getFirstSuitableFolder = exports.readFirstAvailableStream = exports.makeTempDir = exports.hardlinksWork = exports.writeFilePreservingEol = exports.getFileSizeOnDisk = exports.walk = exports.symlink = exports.find = exports.readJsonAndFile = exports.readJson = exports.readFileAny = exports.hardlinkBulk = exports.copyBulk = exports.unlink = exports.glob = exports.link = exports.chmod = exports.lstat = exports.exists = exports.mkdirp = exports.stat = exports.access = exports.rename = exports.readdir = exports.realpath = exports.readlink = exports.writeFile = exports.open = exports.readFileBuffer = exports.lockQueue = exports.constants = undefined; + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +let buildActionsForCopy = (() => { + var _ref = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + + // + let build = (() => { + var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, + dest = data.dest, + type = data.type; + + const onFresh = data.onFresh || noop; + const onDone = data.onDone || noop; + + // TODO https://github.com/yarnpkg/yarn/issues/3751 + // related to bundled dependencies handling + if (files.has(dest.toLowerCase())) { + reporter.verbose(`The case-insensitive file ${dest} shouldn't be copied twice in one bulk copy`); + } else { + files.add(dest.toLowerCase()); + } + + if (type === 'symlink') { + yield mkdirp((_path || _load_path()).default.dirname(dest)); + onFresh(); + actions.symlink.push({ + dest, + linkname: src + }); + onDone(); + return; + } + + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + // ignored file + return; + } + + const srcStat = yield lstat(src); + let srcFiles; + + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + + let destStat; + try { + // try accessing the destination + destStat = yield lstat(dest); + } catch (e) { + // proceed if destination doesn't exist, otherwise error + if (e.code !== 'ENOENT') { + throw e; + } + } + + // if destination exists + if (destStat) { + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + + // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving + // us modes that aren't valid. investigate this, it's generally safe to proceed. + + /* if (srcStat.mode !== destStat.mode) { + try { + await access(dest, srcStat.mode); + } catch (err) {} + } */ + + if (bothFiles && artifactFiles.has(dest)) { + // this file gets changed during build, likely by a custom install script. Don't bother checking it. + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); + return; + } + + if (bothFiles && srcStat.size === destStat.size && (0, (_fsNormalized || _load_fsNormalized()).fileDatesEqual)(srcStat.mtime, destStat.mtime)) { + // we can safely assume this is the same file + onDone(); + reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.size, +srcStat.mtime)); + return; + } + + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + // if both symlinks are the same then we can continue on + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); + return; + } + } + + if (bothFolders) { + // mark files that aren't in this folder as possibly extraneous + const destFiles = yield readdir(dest); + invariant(srcFiles, 'src files not initialised'); + + for (var _iterator4 = destFiles, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref6; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref6 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref6 = _i4.value; + } + + const file = _ref6; + + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator5 = yield readdir(loc), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref7; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref7 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref7 = _i5.value; + } + + const file = _ref7; + + possibleExtraneous.add((_path || _load_path()).default.join(loc, file)); + } + } + } + } + } + } + + if (destStat && destStat.isSymbolicLink()) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + destStat = null; + } + + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + if (!destStat) { + reporter.verbose(reporter.lang('verboseFileFolder', dest)); + yield mkdirp(dest); + } + + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + + // push all files to queue + invariant(srcFiles, 'src files not initialised'); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator6 = srcFiles, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref8; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref8 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref8 = _i6.value; + } + + const file = _ref8; + + queue.push({ + dest: (_path || _load_path()).default.join(dest, file), + onFresh, + onDone: function (_onDone) { + function onDone() { + return _onDone.apply(this, arguments); + } + + onDone.toString = function () { + return _onDone.toString(); + }; + + return onDone; + }(function () { + if (--remaining === 0) { + onDone(); + } + }), + src: (_path || _load_path()).default.join(src, file) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.file.push({ + src, + dest, + atime: srcStat.atime, + mtime: srcStat.mtime, + mode: srcStat.mode + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + + return function build(_x5) { + return _ref5.apply(this, arguments); + }; + })(); + + const artifactFiles = new Set(events.artifactFiles || []); + const files = new Set(); + + // initialise events + for (var _iterator = queue, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref2; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref2 = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref2 = _i.value; + } + + const item = _ref2; + + const onDone = item.onDone; + item.onDone = function () { + events.onProgress(item.dest); + if (onDone) { + onDone(); + } + }; + } + events.onStart(queue.length); + + // start building actions + const actions = { + file: [], + symlink: [], + link: [] + }; + + // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items + // at a time due to the requirement to push items onto the queue + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + + // simulate the existence of some files to prevent considering them extraneous + for (var _iterator2 = artifactFiles, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref3; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref3 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref3 = _i2.value; + } + + const file = _ref3; + + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); + possibleExtraneous.delete(file); + } + } + + for (var _iterator3 = possibleExtraneous, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref4; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref4 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref4 = _i3.value; + } + + const loc = _ref4; + + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + + return actions; + }); + + return function buildActionsForCopy(_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; +})(); + +let buildActionsForHardlink = (() => { + var _ref9 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, events, possibleExtraneous, reporter) { + + // + let build = (() => { + var _ref13 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + const src = data.src, + dest = data.dest; + + const onFresh = data.onFresh || noop; + const onDone = data.onDone || noop; + if (files.has(dest.toLowerCase())) { + // Fixes issue https://github.com/yarnpkg/yarn/issues/2734 + // When bulk hardlinking we have A -> B structure that we want to hardlink to A1 -> B1, + // package-linker passes that modules A1 and B1 need to be hardlinked, + // the recursive linking algorithm of A1 ends up scheduling files in B1 to be linked twice which will case + // an exception. + onDone(); + return; + } + files.add(dest.toLowerCase()); + + if (events.ignoreBasenames.indexOf((_path || _load_path()).default.basename(src)) >= 0) { + // ignored file + return; + } + + const srcStat = yield lstat(src); + let srcFiles; + + if (srcStat.isDirectory()) { + srcFiles = yield readdir(src); + } + + const destExists = yield exists(dest); + if (destExists) { + const destStat = yield lstat(dest); + + const bothSymlinks = srcStat.isSymbolicLink() && destStat.isSymbolicLink(); + const bothFolders = srcStat.isDirectory() && destStat.isDirectory(); + const bothFiles = srcStat.isFile() && destStat.isFile(); + + if (srcStat.mode !== destStat.mode) { + try { + yield access(dest, srcStat.mode); + } catch (err) { + // EINVAL access errors sometimes happen which shouldn't because node shouldn't be giving + // us modes that aren't valid. investigate this, it's generally safe to proceed. + reporter.verbose(err); + } + } + + if (bothFiles && artifactFiles.has(dest)) { + // this file gets changed during build, likely by a custom install script. Don't bother checking it. + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipArtifact', src)); + return; + } + + // correct hardlink + if (bothFiles && srcStat.ino !== null && srcStat.ino === destStat.ino) { + onDone(); + reporter.verbose(reporter.lang('verboseFileSkip', src, dest, srcStat.ino)); + return; + } + + if (bothSymlinks) { + const srcReallink = yield readlink(src); + if (srcReallink === (yield readlink(dest))) { + // if both symlinks are the same then we can continue on + onDone(); + reporter.verbose(reporter.lang('verboseFileSkipSymlink', src, dest, srcReallink)); + return; + } + } + + if (bothFolders) { + // mark files that aren't in this folder as possibly extraneous + const destFiles = yield readdir(dest); + invariant(srcFiles, 'src files not initialised'); + + for (var _iterator10 = destFiles, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref14; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref14 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref14 = _i10.value; + } + + const file = _ref14; + + if (srcFiles.indexOf(file) < 0) { + const loc = (_path || _load_path()).default.join(dest, file); + possibleExtraneous.add(loc); + + if ((yield lstat(loc)).isDirectory()) { + for (var _iterator11 = yield readdir(loc), _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref15; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref15 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref15 = _i11.value; + } + + const file = _ref15; + + possibleExtraneous.add((_path || _load_path()).default.join(loc, file)); + } + } + } + } + } + } + + if (srcStat.isSymbolicLink()) { + onFresh(); + const linkname = yield readlink(src); + actions.symlink.push({ + dest, + linkname + }); + onDone(); + } else if (srcStat.isDirectory()) { + reporter.verbose(reporter.lang('verboseFileFolder', dest)); + yield mkdirp(dest); + + const destParts = dest.split((_path || _load_path()).default.sep); + while (destParts.length) { + files.add(destParts.join((_path || _load_path()).default.sep).toLowerCase()); + destParts.pop(); + } + + // push all files to queue + invariant(srcFiles, 'src files not initialised'); + let remaining = srcFiles.length; + if (!remaining) { + onDone(); + } + for (var _iterator12 = srcFiles, _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref16; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref16 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref16 = _i12.value; + } + + const file = _ref16; + + queue.push({ + onFresh, + src: (_path || _load_path()).default.join(src, file), + dest: (_path || _load_path()).default.join(dest, file), + onDone: function (_onDone2) { + function onDone() { + return _onDone2.apply(this, arguments); + } + + onDone.toString = function () { + return _onDone2.toString(); + }; + + return onDone; + }(function () { + if (--remaining === 0) { + onDone(); + } + }) + }); + } + } else if (srcStat.isFile()) { + onFresh(); + actions.link.push({ + src, + dest, + removeDest: destExists + }); + onDone(); + } else { + throw new Error(`unsure how to copy this: ${src}`); + } + }); + + return function build(_x10) { + return _ref13.apply(this, arguments); + }; + })(); + + const artifactFiles = new Set(events.artifactFiles || []); + const files = new Set(); + + // initialise events + for (var _iterator7 = queue, _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref10; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref10 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref10 = _i7.value; + } + + const item = _ref10; + + const onDone = item.onDone || noop; + item.onDone = function () { + events.onProgress(item.dest); + onDone(); + }; + } + events.onStart(queue.length); + + // start building actions + const actions = { + file: [], + symlink: [], + link: [] + }; + + // custom concurrency logic as we're always executing stacks of CONCURRENT_QUEUE_ITEMS queue items + // at a time due to the requirement to push items onto the queue + while (queue.length) { + const items = queue.splice(0, CONCURRENT_QUEUE_ITEMS); + yield Promise.all(items.map(build)); + } + + // simulate the existence of some files to prevent considering them extraneous + for (var _iterator8 = artifactFiles, _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref11; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref11 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref11 = _i8.value; + } + + const file = _ref11; + + if (possibleExtraneous.has(file)) { + reporter.verbose(reporter.lang('verboseFilePhantomExtraneous', file)); + possibleExtraneous.delete(file); + } + } + + for (var _iterator9 = possibleExtraneous, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref12; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref12 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref12 = _i9.value; + } + + const loc = _ref12; + + if (files.has(loc.toLowerCase())) { + possibleExtraneous.delete(loc); + } + } + + return actions; + }); + + return function buildActionsForHardlink(_x6, _x7, _x8, _x9) { + return _ref9.apply(this, arguments); + }; +})(); + +let copyBulk = exports.copyBulk = (() => { + var _ref17 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop, + onProgress: _events && _events.onProgress || noop, + possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), + ignoreBasenames: _events && _events.ignoreBasenames || [], + artifactFiles: _events && _events.artifactFiles || [] + }; + + const actions = yield buildActionsForCopy(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + + const fileActions = actions.file; + + const currentlyWriting = new Map(); + + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref18 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + let writePromise; + while (writePromise = currentlyWriting.get(data.dest)) { + yield writePromise; + } + + reporter.verbose(reporter.lang('verboseFileCopy', data.src, data.dest)); + const copier = (0, (_fsNormalized || _load_fsNormalized()).copyFile)(data, function () { + return currentlyWriting.delete(data.dest); + }); + currentlyWriting.set(data.dest, copier); + events.onProgress(data.dest); + return copier; + }); + + return function (_x14) { + return _ref18.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + + // we need to copy symlinks last as they could reference files we were copying + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function (data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + + return function copyBulk(_x11, _x12, _x13) { + return _ref17.apply(this, arguments); + }; +})(); + +let hardlinkBulk = exports.hardlinkBulk = (() => { + var _ref19 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (queue, reporter, _events) { + const events = { + onStart: _events && _events.onStart || noop, + onProgress: _events && _events.onProgress || noop, + possibleExtraneous: _events ? _events.possibleExtraneous : new Set(), + artifactFiles: _events && _events.artifactFiles || [], + ignoreBasenames: [] + }; + + const actions = yield buildActionsForHardlink(queue, events, events.possibleExtraneous, reporter); + events.onStart(actions.file.length + actions.symlink.length + actions.link.length); + + const fileActions = actions.link; + + yield (_promise || _load_promise()).queue(fileActions, (() => { + var _ref20 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (data) { + reporter.verbose(reporter.lang('verboseFileLink', data.src, data.dest)); + if (data.removeDest) { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(data.dest); + } + yield link(data.src, data.dest); + }); + + return function (_x18) { + return _ref20.apply(this, arguments); + }; + })(), CONCURRENT_QUEUE_ITEMS); + + // we need to copy symlinks last as they could reference files we were copying + const symlinkActions = actions.symlink; + yield (_promise || _load_promise()).queue(symlinkActions, function (data) { + const linkname = (_path || _load_path()).default.resolve((_path || _load_path()).default.dirname(data.dest), data.linkname); + reporter.verbose(reporter.lang('verboseFileSymlink', data.dest, linkname)); + return symlink(linkname, data.dest); + }); + }); + + return function hardlinkBulk(_x15, _x16, _x17) { + return _ref19.apply(this, arguments); + }; +})(); + +let readFileAny = exports.readFileAny = (() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (files) { + for (var _iterator13 = files, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref22; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref22 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref22 = _i13.value; + } + + const file = _ref22; + + if (yield exists(file)) { + return readFile(file); + } + } + return null; + }); + + return function readFileAny(_x19) { + return _ref21.apply(this, arguments); + }; +})(); + +let readJson = exports.readJson = (() => { + var _ref23 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + return (yield readJsonAndFile(loc)).object; + }); + + return function readJson(_x20) { + return _ref23.apply(this, arguments); + }; +})(); + +let readJsonAndFile = exports.readJsonAndFile = (() => { + var _ref24 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const file = yield readFile(loc); + try { + return { + object: (0, (_map || _load_map()).default)(JSON.parse(stripBOM(file))), + content: file + }; + } catch (err) { + err.message = `${loc}: ${err.message}`; + throw err; + } + }); + + return function readJsonAndFile(_x21) { + return _ref24.apply(this, arguments); + }; +})(); + +let find = exports.find = (() => { + var _ref25 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (filename, dir) { + const parts = dir.split((_path || _load_path()).default.sep); + + while (parts.length) { + const loc = parts.concat(filename).join((_path || _load_path()).default.sep); + + if (yield exists(loc)) { + return loc; + } else { + parts.pop(); + } + } + + return false; + }); + + return function find(_x22, _x23) { + return _ref25.apply(this, arguments); + }; +})(); + +let symlink = exports.symlink = (() => { + var _ref26 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (src, dest) { + if (process.platform !== 'win32') { + // use relative paths otherwise which will be retained if the directory is moved + src = (_path || _load_path()).default.relative((_path || _load_path()).default.dirname(dest), src); + // When path.relative returns an empty string for the current directory, we should instead use + // '.', which is a valid fs.symlink target. + src = src || '.'; + } + + try { + const stats = yield lstat(dest); + if (stats.isSymbolicLink()) { + const resolved = dest; + if (resolved === src) { + return; + } + } + } catch (err) { + if (err.code !== 'ENOENT') { + throw err; + } + } + + // We use rimraf for unlink which never throws an ENOENT on missing target + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dest); + + if (process.platform === 'win32') { + // use directory junctions if possible on win32, this requires absolute paths + yield fsSymlink(src, dest, 'junction'); + } else { + yield fsSymlink(src, dest); + } + }); + + return function symlink(_x24, _x25) { + return _ref26.apply(this, arguments); + }; +})(); + +let walk = exports.walk = (() => { + var _ref27 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir, relativeDir, ignoreBasenames = new Set()) { + let files = []; + + let filenames = yield readdir(dir); + if (ignoreBasenames.size) { + filenames = filenames.filter(function (name) { + return !ignoreBasenames.has(name); + }); + } + + for (var _iterator14 = filenames, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref28; + + if (_isArray14) { + if (_i14 >= _iterator14.length) break; + _ref28 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) break; + _ref28 = _i14.value; + } + + const name = _ref28; + + const relative = relativeDir ? (_path || _load_path()).default.join(relativeDir, name) : name; + const loc = (_path || _load_path()).default.join(dir, name); + const stat = yield lstat(loc); + + files.push({ + relative, + basename: name, + absolute: loc, + mtime: +stat.mtime + }); + + if (stat.isDirectory()) { + files = files.concat((yield walk(loc, relative, ignoreBasenames))); + } + } + + return files; + }); + + return function walk(_x26, _x27) { + return _ref27.apply(this, arguments); + }; +})(); + +let getFileSizeOnDisk = exports.getFileSizeOnDisk = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (loc) { + const stat = yield lstat(loc); + const size = stat.size, + blockSize = stat.blksize; + + + return Math.ceil(size / blockSize) * blockSize; + }); + + return function getFileSizeOnDisk(_x28) { + return _ref29.apply(this, arguments); + }; +})(); + +let getEolFromFile = (() => { + var _ref30 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path) { + if (!(yield exists(path))) { + return undefined; + } + + const buffer = yield readFileBuffer(path); + + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] === cr) { + return '\r\n'; + } + if (buffer[i] === lf) { + return '\n'; + } + } + return undefined; + }); + + return function getEolFromFile(_x29) { + return _ref30.apply(this, arguments); + }; +})(); + +let writeFilePreservingEol = exports.writeFilePreservingEol = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (path, data) { + const eol = (yield getEolFromFile(path)) || (_os || _load_os()).default.EOL; + if (eol !== '\n') { + data = data.replace(/\n/g, eol); + } + yield writeFile(path, data); + }); + + return function writeFilePreservingEol(_x30, _x31) { + return _ref31.apply(this, arguments); + }; +})(); + +let hardlinksWork = exports.hardlinksWork = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (dir) { + const filename = 'test-file' + Math.random(); + const file = (_path || _load_path()).default.join(dir, filename); + const fileLink = (_path || _load_path()).default.join(dir, filename + '-link'); + try { + yield writeFile(file, 'test'); + yield link(file, fileLink); + } catch (err) { + return false; + } finally { + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(file); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(fileLink); + } + return true; + }); + + return function hardlinksWork(_x32) { + return _ref32.apply(this, arguments); + }; +})(); + +// not a strict polyfill for Node's fs.mkdtemp + + +let makeTempDir = exports.makeTempDir = (() => { + var _ref33 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (prefix) { + const dir = (_path || _load_path()).default.join((_os || _load_os()).default.tmpdir(), `yarn-${prefix || ''}-${Date.now()}-${Math.random()}`); + yield (0, (_fsNormalized || _load_fsNormalized()).unlink)(dir); + yield mkdirp(dir); + return dir; + }); + + return function makeTempDir(_x33) { + return _ref33.apply(this, arguments); + }; +})(); + +let readFirstAvailableStream = exports.readFirstAvailableStream = (() => { + var _ref34 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths) { + for (var _iterator15 = paths, _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref35; + + if (_isArray15) { + if (_i15 >= _iterator15.length) break; + _ref35 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) break; + _ref35 = _i15.value; + } + + const path = _ref35; + + try { + const fd = yield open(path, 'r'); + return (_fs || _load_fs()).default.createReadStream(path, { fd }); + } catch (err) { + // Try the next one + } + } + return null; + }); + + return function readFirstAvailableStream(_x34) { + return _ref34.apply(this, arguments); + }; +})(); + +let getFirstSuitableFolder = exports.getFirstSuitableFolder = (() => { + var _ref36 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (paths, mode = constants.W_OK | constants.X_OK) { + const result = { + skipped: [], + folder: null + }; + + for (var _iterator16 = paths, _isArray16 = Array.isArray(_iterator16), _i16 = 0, _iterator16 = _isArray16 ? _iterator16 : _iterator16[Symbol.iterator]();;) { + var _ref37; + + if (_isArray16) { + if (_i16 >= _iterator16.length) break; + _ref37 = _iterator16[_i16++]; + } else { + _i16 = _iterator16.next(); + if (_i16.done) break; + _ref37 = _i16.value; + } + + const folder = _ref37; + + try { + yield mkdirp(folder); + yield access(folder, mode); + + result.folder = folder; + + return result; + } catch (error) { + result.skipped.push({ + error, + folder + }); + } + } + return result; + }); + + return function getFirstSuitableFolder(_x35) { + return _ref36.apply(this, arguments); + }; +})(); + +exports.copy = copy; +exports.readFile = readFile; +exports.readFileRaw = readFileRaw; +exports.normalizeOS = normalizeOS; + +var _fs; + +function _load_fs() { + return _fs = _interopRequireDefault(__webpack_require__(4)); +} + +var _glob; + +function _load_glob() { + return _glob = _interopRequireDefault(__webpack_require__(99)); +} + +var _os; + +function _load_os() { + return _os = _interopRequireDefault(__webpack_require__(42)); +} + +var _path; + +function _load_path() { + return _path = _interopRequireDefault(__webpack_require__(0)); +} + +var _blockingQueue; + +function _load_blockingQueue() { + return _blockingQueue = _interopRequireDefault(__webpack_require__(110)); +} + +var _promise; + +function _load_promise() { + return _promise = _interopRequireWildcard(__webpack_require__(51)); +} + +var _promise2; + +function _load_promise2() { + return _promise2 = __webpack_require__(51); +} + +var _map; + +function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(30)); +} + +var _fsNormalized; + +function _load_fsNormalized() { + return _fsNormalized = __webpack_require__(216); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const constants = exports.constants = typeof (_fs || _load_fs()).default.constants !== 'undefined' ? (_fs || _load_fs()).default.constants : { + R_OK: (_fs || _load_fs()).default.R_OK, + W_OK: (_fs || _load_fs()).default.W_OK, + X_OK: (_fs || _load_fs()).default.X_OK +}; + +const lockQueue = exports.lockQueue = new (_blockingQueue || _load_blockingQueue()).default('fs lock'); + +const readFileBuffer = exports.readFileBuffer = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readFile); +const open = exports.open = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.open); +const writeFile = exports.writeFile = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.writeFile); +const readlink = exports.readlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readlink); +const realpath = exports.realpath = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.realpath); +const readdir = exports.readdir = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.readdir); +const rename = exports.rename = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.rename); +const access = exports.access = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.access); +const stat = exports.stat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.stat); +const mkdirp = exports.mkdirp = (0, (_promise2 || _load_promise2()).promisify)(__webpack_require__(146)); +const exists = exports.exists = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.exists, true); +const lstat = exports.lstat = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.lstat); +const chmod = exports.chmod = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.chmod); +const link = exports.link = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.link); +const glob = exports.glob = (0, (_promise2 || _load_promise2()).promisify)((_glob || _load_glob()).default); +exports.unlink = (_fsNormalized || _load_fsNormalized()).unlink; + +// fs.copyFile uses the native file copying instructions on the system, performing much better +// than any JS-based solution and consumes fewer resources. Repeated testing to fine tune the +// concurrency level revealed 128 as the sweet spot on a quad-core, 16 CPU Intel system with SSD. + +const CONCURRENT_QUEUE_ITEMS = (_fs || _load_fs()).default.copyFile ? 128 : 4; + +const fsSymlink = (0, (_promise2 || _load_promise2()).promisify)((_fs || _load_fs()).default.symlink); +const invariant = __webpack_require__(9); +const stripBOM = __webpack_require__(161); + +const noop = () => {}; + +function copy(src, dest, reporter) { + return copyBulk([{ src, dest }], reporter); +} + +function _readFile(loc, encoding) { + return new Promise((resolve, reject) => { + (_fs || _load_fs()).default.readFile(loc, encoding, function (err, content) { + if (err) { + reject(err); + } else { + resolve(content); + } + }); + }); +} + +function readFile(loc) { + return _readFile(loc, 'utf8').then(normalizeOS); +} + +function readFileRaw(loc) { + return _readFile(loc, 'binary'); +} + +function normalizeOS(body) { + return body.replace(/\r\n/g, '\n'); +} + +const cr = '\r'.charCodeAt(0); +const lf = '\n'.charCodeAt(0); + +/***/ }), +/* 6 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +class MessageError extends Error { + constructor(msg, code) { + super(msg); + this.code = code; + } + +} + +exports.MessageError = MessageError; +class ProcessSpawnError extends MessageError { + constructor(msg, code, process) { + super(msg, code); + this.process = process; + } + +} + +exports.ProcessSpawnError = ProcessSpawnError; +class SecurityError extends MessageError {} + +exports.SecurityError = SecurityError; +class ProcessTermError extends MessageError {} + +exports.ProcessTermError = ProcessTermError; +class ResponseError extends Error { + constructor(msg, responseCode) { + super(msg); + this.responseCode = responseCode; + } + +} + +exports.ResponseError = ResponseError; +class OneTimePasswordError extends Error { + constructor(notice) { + super(); + this.notice = notice; + } + +} +exports.OneTimePasswordError = OneTimePasswordError; + +/***/ }), +/* 7 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subscriber; }); +/* unused harmony export SafeSubscriber */ +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isFunction__ = __webpack_require__(155); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Observer__ = __webpack_require__(420); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__ = __webpack_require__(322); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__config__ = __webpack_require__(186); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__util_hostReportError__ = __webpack_require__(324); +/** PURE_IMPORTS_START tslib,_util_isFunction,_Observer,_Subscription,_internal_symbol_rxSubscriber,_config,_util_hostReportError PURE_IMPORTS_END */ + + + + + + + +var Subscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](Subscriber, _super); + function Subscriber(destinationOrNext, error, complete) { + var _this = _super.call(this) || this; + _this.syncErrorValue = null; + _this.syncErrorThrown = false; + _this.syncErrorThrowable = false; + _this.isStopped = false; + _this._parentSubscription = null; + switch (arguments.length) { + case 0: + _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]; + break; + case 1: + if (!destinationOrNext) { + _this.destination = __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]; + break; + } + if (typeof destinationOrNext === 'object') { + if (destinationOrNext instanceof Subscriber) { + _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable; + _this.destination = destinationOrNext; + destinationOrNext.add(_this); + } + else { + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext); + } + break; + } + default: + _this.syncErrorThrowable = true; + _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete); + break; + } + return _this; + } + Subscriber.prototype[__WEBPACK_IMPORTED_MODULE_4__internal_symbol_rxSubscriber__["a" /* rxSubscriber */]] = function () { return this; }; + Subscriber.create = function (next, error, complete) { + var subscriber = new Subscriber(next, error, complete); + subscriber.syncErrorThrowable = false; + return subscriber; + }; + Subscriber.prototype.next = function (value) { + if (!this.isStopped) { + this._next(value); + } + }; + Subscriber.prototype.error = function (err) { + if (!this.isStopped) { + this.isStopped = true; + this._error(err); + } + }; + Subscriber.prototype.complete = function () { + if (!this.isStopped) { + this.isStopped = true; + this._complete(); + } + }; + Subscriber.prototype.unsubscribe = function () { + if (this.closed) { + return; + } + this.isStopped = true; + _super.prototype.unsubscribe.call(this); + }; + Subscriber.prototype._next = function (value) { + this.destination.next(value); + }; + Subscriber.prototype._error = function (err) { + this.destination.error(err); + this.unsubscribe(); + }; + Subscriber.prototype._complete = function () { + this.destination.complete(); + this.unsubscribe(); + }; + Subscriber.prototype._unsubscribeAndRecycle = function () { + var _a = this, _parent = _a._parent, _parents = _a._parents; + this._parent = null; + this._parents = null; + this.unsubscribe(); + this.closed = false; + this.isStopped = false; + this._parent = _parent; + this._parents = _parents; + this._parentSubscription = null; + return this; + }; + return Subscriber; +}(__WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */])); + +var SafeSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](SafeSubscriber, _super); + function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) { + var _this = _super.call(this) || this; + _this._parentSubscriber = _parentSubscriber; + var next; + var context = _this; + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__["a" /* isFunction */])(observerOrNext)) { + next = observerOrNext; + } + else if (observerOrNext) { + next = observerOrNext.next; + error = observerOrNext.error; + complete = observerOrNext.complete; + if (observerOrNext !== __WEBPACK_IMPORTED_MODULE_2__Observer__["a" /* empty */]) { + context = Object.create(observerOrNext); + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isFunction__["a" /* isFunction */])(context.unsubscribe)) { + _this.add(context.unsubscribe.bind(context)); + } + context.unsubscribe = _this.unsubscribe.bind(_this); + } + } + _this._context = context; + _this._next = next; + _this._error = error; + _this._complete = complete; + return _this; + } + SafeSubscriber.prototype.next = function (value) { + if (!this.isStopped && this._next) { + var _parentSubscriber = this._parentSubscriber; + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._next, value); + } + else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + var useDeprecatedSynchronousErrorHandling = __WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling; + if (this._error) { + if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(this._error, err); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, this._error, err); + this.unsubscribe(); + } + } + else if (!_parentSubscriber.syncErrorThrowable) { + this.unsubscribe(); + if (useDeprecatedSynchronousErrorHandling) { + throw err; + } + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + else { + if (useDeprecatedSynchronousErrorHandling) { + _parentSubscriber.syncErrorValue = err; + _parentSubscriber.syncErrorThrown = true; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.complete = function () { + var _this = this; + if (!this.isStopped) { + var _parentSubscriber = this._parentSubscriber; + if (this._complete) { + var wrappedComplete = function () { return _this._complete.call(_this._context); }; + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) { + this.__tryOrUnsub(wrappedComplete); + this.unsubscribe(); + } + else { + this.__tryOrSetError(_parentSubscriber, wrappedComplete); + this.unsubscribe(); + } + } + else { + this.unsubscribe(); + } + } + }; + SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) { + try { + fn.call(this._context, value); + } + catch (err) { + this.unsubscribe(); + if (__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + throw err; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + } + } + }; + SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) { + if (!__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + throw new Error('bad call'); + } + try { + fn.call(this._context, value); + } + catch (err) { + if (__WEBPACK_IMPORTED_MODULE_5__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + parent.syncErrorValue = err; + parent.syncErrorThrown = true; + return true; + } + else { + __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_6__util_hostReportError__["a" /* hostReportError */])(err); + return true; + } + } + return false; + }; + SafeSubscriber.prototype._unsubscribe = function () { + var _parentSubscriber = this._parentSubscriber; + this._context = null; + this._parentSubscriber = null; + _parentSubscriber.unsubscribe(); + }; + return SafeSubscriber; +}(Subscriber)); + +//# sourceMappingURL=Subscriber.js.map + + +/***/ }), +/* 8 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.getPathKey = getPathKey; +const os = __webpack_require__(42); +const path = __webpack_require__(0); +const userHome = __webpack_require__(67).default; + +var _require = __webpack_require__(222); + +const getCacheDir = _require.getCacheDir, + getConfigDir = _require.getConfigDir, + getDataDir = _require.getDataDir; + +const isWebpackBundle = __webpack_require__(278); + +const DEPENDENCY_TYPES = exports.DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies', 'peerDependencies']; +const OWNED_DEPENDENCY_TYPES = exports.OWNED_DEPENDENCY_TYPES = ['devDependencies', 'dependencies', 'optionalDependencies']; + +const RESOLUTIONS = exports.RESOLUTIONS = 'resolutions'; +const MANIFEST_FIELDS = exports.MANIFEST_FIELDS = [RESOLUTIONS, ...DEPENDENCY_TYPES]; + +const SUPPORTED_NODE_VERSIONS = exports.SUPPORTED_NODE_VERSIONS = '^4.8.0 || ^5.7.0 || ^6.2.2 || >=8.0.0'; + +const YARN_REGISTRY = exports.YARN_REGISTRY = 'https://registry.yarnpkg.com'; +const NPM_REGISTRY_RE = exports.NPM_REGISTRY_RE = /https?:\/\/registry\.npmjs\.org/g; + +const YARN_DOCS = exports.YARN_DOCS = 'https://yarnpkg.com/en/docs/cli/'; +const YARN_INSTALLER_SH = exports.YARN_INSTALLER_SH = 'https://yarnpkg.com/install.sh'; +const YARN_INSTALLER_MSI = exports.YARN_INSTALLER_MSI = 'https://yarnpkg.com/latest.msi'; + +const SELF_UPDATE_VERSION_URL = exports.SELF_UPDATE_VERSION_URL = 'https://yarnpkg.com/latest-version'; + +// cache version, bump whenever we make backwards incompatible changes +const CACHE_VERSION = exports.CACHE_VERSION = 6; + +// lockfile version, bump whenever we make backwards incompatible changes +const LOCKFILE_VERSION = exports.LOCKFILE_VERSION = 1; + +// max amount of network requests to perform concurrently +const NETWORK_CONCURRENCY = exports.NETWORK_CONCURRENCY = 8; + +// HTTP timeout used when downloading packages +const NETWORK_TIMEOUT = exports.NETWORK_TIMEOUT = 30 * 1000; // in milliseconds + +// max amount of child processes to execute concurrently +const CHILD_CONCURRENCY = exports.CHILD_CONCURRENCY = 5; + +const REQUIRED_PACKAGE_KEYS = exports.REQUIRED_PACKAGE_KEYS = ['name', 'version', '_uid']; + +function getPreferredCacheDirectories() { + const preferredCacheDirectories = [getCacheDir()]; + + if (process.getuid) { + // $FlowFixMe: process.getuid exists, dammit + preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache-${process.getuid()}`)); + } + + preferredCacheDirectories.push(path.join(os.tmpdir(), `.yarn-cache`)); + + return preferredCacheDirectories; +} + +const PREFERRED_MODULE_CACHE_DIRECTORIES = exports.PREFERRED_MODULE_CACHE_DIRECTORIES = getPreferredCacheDirectories(); +const CONFIG_DIRECTORY = exports.CONFIG_DIRECTORY = getConfigDir(); +const DATA_DIRECTORY = exports.DATA_DIRECTORY = getDataDir(); +const LINK_REGISTRY_DIRECTORY = exports.LINK_REGISTRY_DIRECTORY = path.join(DATA_DIRECTORY, 'link'); +const GLOBAL_MODULE_DIRECTORY = exports.GLOBAL_MODULE_DIRECTORY = path.join(DATA_DIRECTORY, 'global'); + +const NODE_BIN_PATH = exports.NODE_BIN_PATH = process.execPath; +const YARN_BIN_PATH = exports.YARN_BIN_PATH = getYarnBinPath(); + +// Webpack needs to be configured with node.__dirname/__filename = false +function getYarnBinPath() { + if (isWebpackBundle) { + return __filename; + } else { + return path.join(__dirname, '..', 'bin', 'yarn.js'); + } +} + +const NODE_MODULES_FOLDER = exports.NODE_MODULES_FOLDER = 'node_modules'; +const NODE_PACKAGE_JSON = exports.NODE_PACKAGE_JSON = 'package.json'; + +const PNP_FILENAME = exports.PNP_FILENAME = '.pnp.js'; + +const POSIX_GLOBAL_PREFIX = exports.POSIX_GLOBAL_PREFIX = `${process.env.DESTDIR || ''}/usr/local`; +const FALLBACK_GLOBAL_PREFIX = exports.FALLBACK_GLOBAL_PREFIX = path.join(userHome, '.yarn'); + +const META_FOLDER = exports.META_FOLDER = '.yarn-meta'; +const INTEGRITY_FILENAME = exports.INTEGRITY_FILENAME = '.yarn-integrity'; +const LOCKFILE_FILENAME = exports.LOCKFILE_FILENAME = 'yarn.lock'; +const METADATA_FILENAME = exports.METADATA_FILENAME = '.yarn-metadata.json'; +const TARBALL_FILENAME = exports.TARBALL_FILENAME = '.yarn-tarball.tgz'; +const CLEAN_FILENAME = exports.CLEAN_FILENAME = '.yarnclean'; + +const NPM_LOCK_FILENAME = exports.NPM_LOCK_FILENAME = 'package-lock.json'; +const NPM_SHRINKWRAP_FILENAME = exports.NPM_SHRINKWRAP_FILENAME = 'npm-shrinkwrap.json'; + +const DEFAULT_INDENT = exports.DEFAULT_INDENT = ' '; +const SINGLE_INSTANCE_PORT = exports.SINGLE_INSTANCE_PORT = 31997; +const SINGLE_INSTANCE_FILENAME = exports.SINGLE_INSTANCE_FILENAME = '.yarn-single-instance'; + +const ENV_PATH_KEY = exports.ENV_PATH_KEY = getPathKey(process.platform, process.env); + +function getPathKey(platform, env) { + let pathKey = 'PATH'; + + // windows calls its path "Path" usually, but this is not guaranteed. + if (platform === 'win32') { + pathKey = 'Path'; + + for (const key in env) { + if (key.toLowerCase() === 'path') { + pathKey = key; + } + } + } + + return pathKey; +} + +const VERSION_COLOR_SCHEME = exports.VERSION_COLOR_SCHEME = { + major: 'red', + premajor: 'red', + minor: 'yellow', + preminor: 'yellow', + patch: 'green', + prepatch: 'green', + prerelease: 'red', + unchanged: 'white', + unknown: 'red' +}; + +/***/ }), +/* 9 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + + + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var NODE_ENV = process.env.NODE_ENV; + +var invariant = function(condition, format, a, b, c, d, e, f) { + if (NODE_ENV !== 'production') { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + } + + if (!condition) { + var error; + if (format === undefined) { + error = new Error( + 'Minified exception occurred; use the non-minified dev environment ' + + 'for the full error message and additional helpful warnings.' + ); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error( + format.replace(/%s/g, function() { return args[argIndex++]; }) + ); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +}; + +module.exports = invariant; + + +/***/ }), +/* 10 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +var YAMLException = __webpack_require__(55); + +var TYPE_CONSTRUCTOR_OPTIONS = [ + 'kind', + 'resolve', + 'construct', + 'instanceOf', + 'predicate', + 'represent', + 'defaultStyle', + 'styleAliases' +]; + +var YAML_NODE_KINDS = [ + 'scalar', + 'sequence', + 'mapping' +]; + +function compileStyleAliases(map) { + var result = {}; + + if (map !== null) { + Object.keys(map).forEach(function (style) { + map[style].forEach(function (alias) { + result[String(alias)] = style; + }); + }); + } + + return result; +} + +function Type(tag, options) { + options = options || {}; + + Object.keys(options).forEach(function (name) { + if (TYPE_CONSTRUCTOR_OPTIONS.indexOf(name) === -1) { + throw new YAMLException('Unknown option "' + name + '" is met in definition of "' + tag + '" YAML type.'); + } + }); + + // TODO: Add tag format check. + this.tag = tag; + this.kind = options['kind'] || null; + this.resolve = options['resolve'] || function () { return true; }; + this.construct = options['construct'] || function (data) { return data; }; + this.instanceOf = options['instanceOf'] || null; + this.predicate = options['predicate'] || null; + this.represent = options['represent'] || null; + this.defaultStyle = options['defaultStyle'] || null; + this.styleAliases = compileStyleAliases(options['styleAliases'] || null); + + if (YAML_NODE_KINDS.indexOf(this.kind) === -1) { + throw new YAMLException('Unknown kind "' + this.kind + '" is specified for "' + tag + '" YAML type.'); + } +} + +module.exports = Type; + + +/***/ }), +/* 11 */ +/***/ (function(module, exports) { + +module.exports = require("crypto"); + +/***/ }), +/* 12 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Observable; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_canReportError__ = __webpack_require__(323); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__ = __webpack_require__(932); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__ = __webpack_require__(118); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_pipe__ = __webpack_require__(325); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__config__ = __webpack_require__(186); +/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_internal_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ + + + + + +var Observable = /*@__PURE__*/ (function () { + function Observable(subscribe) { + this._isScalar = false; + if (subscribe) { + this._subscribe = subscribe; + } + } + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; + }; + Observable.prototype.subscribe = function (observerOrNext, error, complete) { + var operator = this.operator; + var sink = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_toSubscriber__["a" /* toSubscriber */])(observerOrNext, error, complete); + if (operator) { + operator.call(sink, this.source); + } + else { + sink.add(this.source || (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? + this._subscribe(sink) : + this._trySubscribe(sink)); + } + if (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + if (sink.syncErrorThrowable) { + sink.syncErrorThrowable = false; + if (sink.syncErrorThrown) { + throw sink.syncErrorValue; + } + } + } + return sink; + }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + if (__WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_canReportError__["a" /* canReportError */])(sink)) { + sink.error(err); + } + else { + console.warn(err); + } + } + }; + Observable.prototype.forEach = function (next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var subscription; + subscription = _this.subscribe(function (value) { + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, reject, resolve); + }); + }; + Observable.prototype._subscribe = function (subscriber) { + var source = this.source; + return source && source.subscribe(subscriber); + }; + Observable.prototype[__WEBPACK_IMPORTED_MODULE_2__internal_symbol_observable__["a" /* observable */]] = function () { + return this; + }; + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; + } + if (operations.length === 0) { + return this; + } + return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_pipe__["b" /* pipeFromArray */])(operations)(this); + }; + Observable.prototype.toPromise = function (promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); + }; + Observable.create = function (subscribe) { + return new Observable(subscribe); + }; + return Observable; +}()); + +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = __WEBPACK_IMPORTED_MODULE_4__config__["a" /* config */].Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} +//# sourceMappingURL=Observable.js.map + + +/***/ }), +/* 13 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return OuterSubscriber; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Subscriber__ = __webpack_require__(7); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +var OuterSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](OuterSubscriber, _super); + function OuterSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); + }; + OuterSubscriber.prototype.notifyComplete = function (innerSub) { + this.destination.complete(); + }; + return OuterSubscriber; +}(__WEBPACK_IMPORTED_MODULE_1__Subscriber__["a" /* Subscriber */])); + +//# sourceMappingURL=OuterSubscriber.js.map + + +/***/ }), +/* 14 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (immutable) */ __webpack_exports__["a"] = subscribeToResult; +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__ = __webpack_require__(84); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__subscribeTo__ = __webpack_require__(446); +/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo PURE_IMPORTS_END */ + + +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { + destination = new __WEBPACK_IMPORTED_MODULE_0__InnerSubscriber__["a" /* InnerSubscriber */](outerSubscriber, outerValue, outerIndex); + } + if (destination.closed) { + return; + } + return __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__subscribeTo__["a" /* subscribeTo */])(result)(destination); +} +//# sourceMappingURL=subscribeToResult.js.map + + +/***/ }), +/* 15 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* eslint-disable node/no-deprecated-api */ + + + +var buffer = __webpack_require__(64) +var Buffer = buffer.Buffer + +var safer = {} + +var key + +for (key in buffer) { + if (!buffer.hasOwnProperty(key)) continue + if (key === 'SlowBuffer' || key === 'Buffer') continue + safer[key] = buffer[key] +} + +var Safer = safer.Buffer = {} +for (key in Buffer) { + if (!Buffer.hasOwnProperty(key)) continue + if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue + Safer[key] = Buffer[key] +} + +safer.Buffer.prototype = Buffer.prototype + +if (!Safer.from || Safer.from === Uint8Array.from) { + Safer.from = function (value, encodingOrOffset, length) { + if (typeof value === 'number') { + throw new TypeError('The "value" argument must not be of type number. Received type ' + typeof value) + } + if (value && typeof value.length === 'undefined') { + throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value) + } + return Buffer(value, encodingOrOffset, length) + } +} + +if (!Safer.alloc) { + Safer.alloc = function (size, fill, encoding) { + if (typeof size !== 'number') { + throw new TypeError('The "size" argument must be of type number. Received type ' + typeof size) + } + if (size < 0 || size >= 2 * (1 << 30)) { + throw new RangeError('The value "' + size + '" is invalid for option "size"') + } + var buf = Buffer(size) + if (!fill || fill.length === 0) { + buf.fill(0) + } else if (typeof encoding === 'string') { + buf.fill(fill, encoding) + } else { + buf.fill(fill) + } + return buf + } +} + +if (!safer.kStringMaxLength) { + try { + safer.kStringMaxLength = process.binding('buffer').kStringMaxLength + } catch (e) { + // we can't determine kStringMaxLength in environments where process.binding + // is unsupported, so let's not set it + } +} + +if (!safer.constants) { + safer.constants = { + MAX_LENGTH: safer.kMaxLength + } + if (safer.kStringMaxLength) { + safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength + } +} + +module.exports = safer + + +/***/ }), +/* 16 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright (c) 2012, Mark Cavage. All rights reserved. +// Copyright 2015 Joyent, Inc. + +var assert = __webpack_require__(29); +var Stream = __webpack_require__(23).Stream; +var util = __webpack_require__(3); + + +///--- Globals + +/* JSSTYLED */ +var UUID_REGEXP = /^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/; + + +///--- Internal + +function _capitalize(str) { + return (str.charAt(0).toUpperCase() + str.slice(1)); +} + +function _toss(name, expected, oper, arg, actual) { + throw new assert.AssertionError({ + message: util.format('%s (%s) is required', name, expected), + actual: (actual === undefined) ? typeof (arg) : actual(arg), + expected: expected, + operator: oper || '===', + stackStartFunction: _toss.caller + }); +} + +function _getClass(arg) { + return (Object.prototype.toString.call(arg).slice(8, -1)); +} + +function noop() { + // Why even bother with asserts? +} + + +///--- Exports + +var types = { + bool: { + check: function (arg) { return typeof (arg) === 'boolean'; } + }, + func: { + check: function (arg) { return typeof (arg) === 'function'; } + }, + string: { + check: function (arg) { return typeof (arg) === 'string'; } + }, + object: { + check: function (arg) { + return typeof (arg) === 'object' && arg !== null; + } + }, + number: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg); + } + }, + finite: { + check: function (arg) { + return typeof (arg) === 'number' && !isNaN(arg) && isFinite(arg); + } + }, + buffer: { + check: function (arg) { return Buffer.isBuffer(arg); }, + operator: 'Buffer.isBuffer' + }, + array: { + check: function (arg) { return Array.isArray(arg); }, + operator: 'Array.isArray' + }, + stream: { + check: function (arg) { return arg instanceof Stream; }, + operator: 'instanceof', + actual: _getClass + }, + date: { + check: function (arg) { return arg instanceof Date; }, + operator: 'instanceof', + actual: _getClass + }, + regexp: { + check: function (arg) { return arg instanceof RegExp; }, + operator: 'instanceof', + actual: _getClass + }, + uuid: { + check: function (arg) { + return typeof (arg) === 'string' && UUID_REGEXP.test(arg); + }, + operator: 'isUUID' + } +}; + +function _setExports(ndebug) { + var keys = Object.keys(types); + var out; + + /* re-export standard assert */ + if (process.env.NODE_NDEBUG) { + out = noop; + } else { + out = function (arg, msg) { + if (!arg) { + _toss(msg, 'true', arg); + } + }; + } + + /* standard checks */ + keys.forEach(function (k) { + if (ndebug) { + out[k] = noop; + return; + } + var type = types[k]; + out[k] = function (arg, msg) { + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* optional checks */ + keys.forEach(function (k) { + var name = 'optional' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!type.check(arg)) { + _toss(msg, k, type.operator, arg, type.actual); + } + }; + }); + + /* arrayOf checks */ + keys.forEach(function (k) { + var name = 'arrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* optionalArrayOf checks */ + keys.forEach(function (k) { + var name = 'optionalArrayOf' + _capitalize(k); + if (ndebug) { + out[name] = noop; + return; + } + var type = types[k]; + var expected = '[' + k + ']'; + out[name] = function (arg, msg) { + if (arg === undefined || arg === null) { + return; + } + if (!Array.isArray(arg)) { + _toss(msg, expected, type.operator, arg, type.actual); + } + var i; + for (i = 0; i < arg.length; i++) { + if (!type.check(arg[i])) { + _toss(msg, expected, type.operator, arg, type.actual); + } + } + }; + }); + + /* re-export built-in assertions */ + Object.keys(assert).forEach(function (k) { + if (k === 'AssertionError') { + out[k] = assert[k]; + return; + } + if (ndebug) { + out[k] = noop; + return; + } + out[k] = assert[k]; + }); + + /* export ourselves (for unit tests _only_) */ + out._setExports = _setExports; + + return out; +} + +module.exports = _setExports(process.env.NODE_NDEBUG); + + +/***/ }), +/* 17 */ +/***/ (function(module, exports) { + +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + + +/***/ }), +/* 18 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.sortAlpha = sortAlpha; +exports.sortOptionsByFlags = sortOptionsByFlags; +exports.entries = entries; +exports.removePrefix = removePrefix; +exports.removeSuffix = removeSuffix; +exports.addSuffix = addSuffix; +exports.hyphenate = hyphenate; +exports.camelCase = camelCase; +exports.compareSortedArrays = compareSortedArrays; +exports.sleep = sleep; +const _camelCase = __webpack_require__(227); + +function sortAlpha(a, b) { + // sort alphabetically in a deterministic way + const shortLen = Math.min(a.length, b.length); + for (let i = 0; i < shortLen; i++) { + const aChar = a.charCodeAt(i); + const bChar = b.charCodeAt(i); + if (aChar !== bChar) { + return aChar - bChar; + } + } + return a.length - b.length; +} + +function sortOptionsByFlags(a, b) { + const aOpt = a.flags.replace(/-/g, ''); + const bOpt = b.flags.replace(/-/g, ''); + return sortAlpha(aOpt, bOpt); +} + +function entries(obj) { + const entries = []; + if (obj) { + for (const key in obj) { + entries.push([key, obj[key]]); + } + } + return entries; +} + +function removePrefix(pattern, prefix) { + if (pattern.startsWith(prefix)) { + pattern = pattern.slice(prefix.length); + } + + return pattern; +} + +function removeSuffix(pattern, suffix) { + if (pattern.endsWith(suffix)) { + return pattern.slice(0, -suffix.length); + } + + return pattern; +} + +function addSuffix(pattern, suffix) { + if (!pattern.endsWith(suffix)) { + return pattern + suffix; + } + + return pattern; +} + +function hyphenate(str) { + return str.replace(/[A-Z]/g, match => { + return '-' + match.charAt(0).toLowerCase(); + }); +} + +function camelCase(str) { + if (/[A-Z]/.test(str)) { + return null; + } else { + return _camelCase(str); + } +} + +function compareSortedArrays(array1, array2) { + if (array1.length !== array2.length) { + return false; + } + for (let i = 0, len = array1.length; i < len; i++) { + if (array1[i] !== array2[i]) { + return false; + } + } + return true; +} + +function sleep(ms) { + return new Promise(resolve => { + setTimeout(resolve, ms); + }); +} + +/***/ }), +/* 19 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.stringify = exports.parse = undefined; + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +var _parse; + +function _load_parse() { + return _parse = __webpack_require__(106); +} + +Object.defineProperty(exports, 'parse', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_parse || _load_parse()).default; + } +}); + +var _stringify; + +function _load_stringify() { + return _stringify = __webpack_require__(200); +} + +Object.defineProperty(exports, 'stringify', { + enumerable: true, + get: function get() { + return _interopRequireDefault(_stringify || _load_stringify()).default; + } +}); +exports.implodeEntry = implodeEntry; +exports.explodeEntry = explodeEntry; + +var _misc; + +function _load_misc() { + return _misc = __webpack_require__(18); +} + +var _normalizePattern; + +function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(37); +} + +var _parse2; + +function _load_parse2() { + return _parse2 = _interopRequireDefault(__webpack_require__(106)); +} + +var _constants; + +function _load_constants() { + return _constants = __webpack_require__(8); +} + +var _fs; + +function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(5)); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const invariant = __webpack_require__(9); + +const path = __webpack_require__(0); +const ssri = __webpack_require__(65); + +function getName(pattern) { + return (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern).name; +} + +function blankObjectUndefined(obj) { + return obj && Object.keys(obj).length ? obj : undefined; +} + +function keyForRemote(remote) { + return remote.resolved || (remote.reference && remote.hash ? `${remote.reference}#${remote.hash}` : null); +} + +function serializeIntegrity(integrity) { + // We need this because `Integrity.toString()` does not use sorting to ensure a stable string output + // See https://git.io/vx2Hy + return integrity.toString().split(' ').sort().join(' '); +} + +function implodeEntry(pattern, obj) { + const inferredName = getName(pattern); + const integrity = obj.integrity ? serializeIntegrity(obj.integrity) : ''; + const imploded = { + name: inferredName === obj.name ? undefined : obj.name, + version: obj.version, + uid: obj.uid === obj.version ? undefined : obj.uid, + resolved: obj.resolved, + registry: obj.registry === 'npm' ? undefined : obj.registry, + dependencies: blankObjectUndefined(obj.dependencies), + optionalDependencies: blankObjectUndefined(obj.optionalDependencies), + permissions: blankObjectUndefined(obj.permissions), + prebuiltVariants: blankObjectUndefined(obj.prebuiltVariants) + }; + if (integrity) { + imploded.integrity = integrity; + } + return imploded; +} + +function explodeEntry(pattern, obj) { + obj.optionalDependencies = obj.optionalDependencies || {}; + obj.dependencies = obj.dependencies || {}; + obj.uid = obj.uid || obj.version; + obj.permissions = obj.permissions || {}; + obj.registry = obj.registry || 'npm'; + obj.name = obj.name || getName(pattern); + const integrity = obj.integrity; + if (integrity && integrity.isIntegrity) { + obj.integrity = ssri.parse(integrity); + } + return obj; +} + +class Lockfile { + constructor({ cache, source, parseResultType } = {}) { + this.source = source || ''; + this.cache = cache; + this.parseResultType = parseResultType; + } + + // source string if the `cache` was parsed + + + // if true, we're parsing an old yarn file and need to update integrity fields + hasEntriesExistWithoutIntegrity() { + if (!this.cache) { + return false; + } + + for (const key in this.cache) { + // $FlowFixMe - `this.cache` is clearly defined at this point + if (!/^.*@(file:|http)/.test(key) && this.cache[key] && !this.cache[key].integrity) { + return true; + } + } + + return false; + } + + static fromDirectory(dir, reporter) { + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // read the manifest in this directory + const lockfileLoc = path.join(dir, (_constants || _load_constants()).LOCKFILE_FILENAME); + + let lockfile; + let rawLockfile = ''; + let parseResult; + + if (yield (_fs || _load_fs()).exists(lockfileLoc)) { + rawLockfile = yield (_fs || _load_fs()).readFile(lockfileLoc); + parseResult = (0, (_parse2 || _load_parse2()).default)(rawLockfile, lockfileLoc); + + if (reporter) { + if (parseResult.type === 'merge') { + reporter.info(reporter.lang('lockfileMerged')); + } else if (parseResult.type === 'conflict') { + reporter.warn(reporter.lang('lockfileConflict')); + } + } + + lockfile = parseResult.object; + } else if (reporter) { + reporter.info(reporter.lang('noLockfileFound')); + } + + if (lockfile && lockfile.__metadata) { + const lockfilev2 = lockfile; + lockfile = {}; + } + + return new Lockfile({ cache: lockfile, source: rawLockfile, parseResultType: parseResult && parseResult.type }); + })(); + } + + getLocked(pattern) { + const cache = this.cache; + if (!cache) { + return undefined; + } + + const shrunk = pattern in cache && cache[pattern]; + + if (typeof shrunk === 'string') { + return this.getLocked(shrunk); + } else if (shrunk) { + explodeEntry(pattern, shrunk); + return shrunk; + } + + return undefined; + } + + removePattern(pattern) { + const cache = this.cache; + if (!cache) { + return; + } + delete cache[pattern]; + } + + getLockfile(patterns) { + const lockfile = {}; + const seen = new Map(); + + // order by name so that lockfile manifest is assigned to the first dependency with this manifest + // the others that have the same remoteKey will just refer to the first + // ordering allows for consistency in lockfile when it is serialized + const sortedPatternsKeys = Object.keys(patterns).sort((_misc || _load_misc()).sortAlpha); + + for (var _iterator = sortedPatternsKeys, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const pattern = _ref; + + const pkg = patterns[pattern]; + const remote = pkg._remote, + ref = pkg._reference; + + invariant(ref, 'Package is missing a reference'); + invariant(remote, 'Package is missing a remote'); + + const remoteKey = keyForRemote(remote); + const pkgName = getName(pattern); + + const seenKey = remoteKey ? `${remoteKey}#${pkgName}` : null; + const seenPattern = seenKey ? seen.get(seenKey) : null; + + if (seenPattern) { + // no point in duplicating it + lockfile[pattern] = seenPattern; + continue; + } + + const obj = implodeEntry(pattern, { + name: pkgName, + version: pkg.version, + uid: pkg._uid, + resolved: remote.resolved, + integrity: remote.integrity, + registry: remote.registry, + dependencies: pkg.dependencies, + peerDependencies: pkg.peerDependencies, + optionalDependencies: pkg.optionalDependencies, + permissions: ref.permissions, + prebuiltVariants: pkg.prebuiltVariants + }); + + lockfile[pattern] = obj; + + if (seenKey) { + seen.set(seenKey, obj); + } + } + + return lockfile; + } +} +exports.default = Lockfile; + +/***/ }), +/* 20 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +exports.__esModule = true; + +var _assign = __webpack_require__(559); + +var _assign2 = _interopRequireDefault(_assign); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +exports.default = _assign2.default || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/***/ }), +/* 21 */ +/***/ (function(module, exports, __webpack_require__) { + +var store = __webpack_require__(134)('wks'); +var uid = __webpack_require__(138); +var Symbol = __webpack_require__(17).Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + + +/***/ }), +/* 22 */ +/***/ (function(module, exports) { + +exports = module.exports = SemVer; + +// The debug function is excluded entirely from the minified version. +/* nomin */ var debug; +/* nomin */ if (typeof process === 'object' && + /* nomin */ process.env && + /* nomin */ process.env.NODE_DEBUG && + /* nomin */ /\bsemver\b/i.test(process.env.NODE_DEBUG)) + /* nomin */ debug = function() { + /* nomin */ var args = Array.prototype.slice.call(arguments, 0); + /* nomin */ args.unshift('SEMVER'); + /* nomin */ console.log.apply(console, args); + /* nomin */ }; +/* nomin */ else + /* nomin */ debug = function() {}; + +// Note: this is the semver.org version of the spec that it implements +// Not necessarily the package version of this code. +exports.SEMVER_SPEC_VERSION = '2.0.0'; + +var MAX_LENGTH = 256; +var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + +// Max safe segment length for coercion. +var MAX_SAFE_COMPONENT_LENGTH = 16; + +// The actual regexps go on exports.re +var re = exports.re = []; +var src = exports.src = []; +var R = 0; + +// The following Regular Expressions can be used for tokenizing, +// validating, and parsing SemVer version strings. + +// ## Numeric Identifier +// A single `0`, or a non-zero digit followed by zero or more digits. + +var NUMERICIDENTIFIER = R++; +src[NUMERICIDENTIFIER] = '0|[1-9]\\d*'; +var NUMERICIDENTIFIERLOOSE = R++; +src[NUMERICIDENTIFIERLOOSE] = '[0-9]+'; + + +// ## Non-numeric Identifier +// Zero or more digits, followed by a letter or hyphen, and then zero or +// more letters, digits, or hyphens. + +var NONNUMERICIDENTIFIER = R++; +src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*'; + + +// ## Main Version +// Three dot-separated numeric identifiers. + +var MAINVERSION = R++; +src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')\\.' + + '(' + src[NUMERICIDENTIFIER] + ')'; + +var MAINVERSIONLOOSE = R++; +src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + + '(' + src[NUMERICIDENTIFIERLOOSE] + ')'; + +// ## Pre-release Version Identifier +// A numeric identifier, or a non-numeric identifier. + +var PRERELEASEIDENTIFIER = R++; +src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + +var PRERELEASEIDENTIFIERLOOSE = R++; +src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + + '|' + src[NONNUMERICIDENTIFIER] + ')'; + + +// ## Pre-release Version +// Hyphen, followed by one or more dot-separated pre-release version +// identifiers. + +var PRERELEASE = R++; +src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + + '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))'; + +var PRERELEASELOOSE = R++; +src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + + '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))'; + +// ## Build Metadata Identifier +// Any combination of digits, letters, or hyphens. + +var BUILDIDENTIFIER = R++; +src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+'; + +// ## Build Metadata +// Plus sign, followed by one or more period-separated build metadata +// identifiers. + +var BUILD = R++; +src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + + '(?:\\.' + src[BUILDIDENTIFIER] + ')*))'; + + +// ## Full Version String +// A main version, followed optionally by a pre-release version and +// build metadata. + +// Note that the only major, minor, patch, and pre-release sections of +// the version string are capturing groups. The build metadata is not a +// capturing group, because it should not ever be used in version +// comparison. + +var FULL = R++; +var FULLPLAIN = 'v?' + src[MAINVERSION] + + src[PRERELEASE] + '?' + + src[BUILD] + '?'; + +src[FULL] = '^' + FULLPLAIN + '$'; + +// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. +// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty +// common in the npm registry. +var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + + src[PRERELEASELOOSE] + '?' + + src[BUILD] + '?'; + +var LOOSE = R++; +src[LOOSE] = '^' + LOOSEPLAIN + '$'; + +var GTLT = R++; +src[GTLT] = '((?:<|>)?=?)'; + +// Something like "2.*" or "1.2.x". +// Note that "x.x" is a valid xRange identifer, meaning "any version" +// Only the first item is strictly required. +var XRANGEIDENTIFIERLOOSE = R++; +src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*'; +var XRANGEIDENTIFIER = R++; +src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*'; + +var XRANGEPLAIN = R++; +src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + + '(?:' + src[PRERELEASE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGEPLAINLOOSE = R++; +src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + + '(?:' + src[PRERELEASELOOSE] + ')?' + + src[BUILD] + '?' + + ')?)?'; + +var XRANGE = R++; +src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$'; +var XRANGELOOSE = R++; +src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$'; + +// Coercion. +// Extract anything that could conceivably be a part of a valid semver +var COERCE = R++; +src[COERCE] = '(?:^|[^\\d])' + + '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + + '(?:$|[^\\d])'; + +// Tilde ranges. +// Meaning is "reasonably at or greater than" +var LONETILDE = R++; +src[LONETILDE] = '(?:~>?)'; + +var TILDETRIM = R++; +src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+'; +re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g'); +var tildeTrimReplace = '$1~'; + +var TILDE = R++; +src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$'; +var TILDELOOSE = R++; +src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$'; + +// Caret ranges. +// Meaning is "at least and backwards compatible with" +var LONECARET = R++; +src[LONECARET] = '(?:\\^)'; + +var CARETTRIM = R++; +src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+'; +re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g'); +var caretTrimReplace = '$1^'; + +var CARET = R++; +src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$'; +var CARETLOOSE = R++; +src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$'; + +// A simple gt/lt/eq thing, or just "" to indicate "any version" +var COMPARATORLOOSE = R++; +src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$'; +var COMPARATOR = R++; +src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$'; + + +// An expression to strip any whitespace between the gtlt and the thing +// it modifies, so that `> 1.2.3` ==> `>1.2.3` +var COMPARATORTRIM = R++; +src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + + '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')'; + +// this one has to use the /g flag +re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g'); +var comparatorTrimReplace = '$1$2$3'; + + +// Something like `1.2.3 - 1.2.4` +// Note that these all use the loose form, because they'll be +// checked against either the strict or loose comparator form +// later. +var HYPHENRANGE = R++; +src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAIN] + ')' + + '\\s*$'; + +var HYPHENRANGELOOSE = R++; +src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s+-\\s+' + + '(' + src[XRANGEPLAINLOOSE] + ')' + + '\\s*$'; + +// Star ranges basically just allow anything at all. +var STAR = R++; +src[STAR] = '(<|>)?=?\\s*\\*'; + +// Compile to actual regexp objects. +// All are flag-free, unless they were created above with a flag. +for (var i = 0; i < R; i++) { + debug(i, src[i]); + if (!re[i]) + re[i] = new RegExp(src[i]); +} + +exports.parse = parse; +function parse(version, loose) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + if (version.length > MAX_LENGTH) + return null; + + var r = loose ? re[LOOSE] : re[FULL]; + if (!r.test(version)) + return null; + + try { + return new SemVer(version, loose); + } catch (er) { + return null; + } +} + +exports.valid = valid; +function valid(version, loose) { + var v = parse(version, loose); + return v ? v.version : null; +} + + +exports.clean = clean; +function clean(version, loose) { + var s = parse(version.trim().replace(/^[=v]+/, ''), loose); + return s ? s.version : null; +} + +exports.SemVer = SemVer; + +function SemVer(version, loose) { + if (version instanceof SemVer) { + if (version.loose === loose) + return version; + else + version = version.version; + } else if (typeof version !== 'string') { + throw new TypeError('Invalid Version: ' + version); + } + + if (version.length > MAX_LENGTH) + throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') + + if (!(this instanceof SemVer)) + return new SemVer(version, loose); + + debug('SemVer', version, loose); + this.loose = loose; + var m = version.trim().match(loose ? re[LOOSE] : re[FULL]); + + if (!m) + throw new TypeError('Invalid Version: ' + version); + + this.raw = version; + + // these are actually numbers + this.major = +m[1]; + this.minor = +m[2]; + this.patch = +m[3]; + + if (this.major > MAX_SAFE_INTEGER || this.major < 0) + throw new TypeError('Invalid major version') + + if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) + throw new TypeError('Invalid minor version') + + if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) + throw new TypeError('Invalid patch version') + + // numberify any prerelease numeric ids + if (!m[4]) + this.prerelease = []; + else + this.prerelease = m[4].split('.').map(function(id) { + if (/^[0-9]+$/.test(id)) { + var num = +id; + if (num >= 0 && num < MAX_SAFE_INTEGER) + return num; + } + return id; + }); + + this.build = m[5] ? m[5].split('.') : []; + this.format(); +} + +SemVer.prototype.format = function() { + this.version = this.major + '.' + this.minor + '.' + this.patch; + if (this.prerelease.length) + this.version += '-' + this.prerelease.join('.'); + return this.version; +}; + +SemVer.prototype.toString = function() { + return this.version; +}; + +SemVer.prototype.compare = function(other) { + debug('SemVer.compare', this.version, this.loose, other); + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return this.compareMain(other) || this.comparePre(other); +}; + +SemVer.prototype.compareMain = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + return compareIdentifiers(this.major, other.major) || + compareIdentifiers(this.minor, other.minor) || + compareIdentifiers(this.patch, other.patch); +}; + +SemVer.prototype.comparePre = function(other) { + if (!(other instanceof SemVer)) + other = new SemVer(other, this.loose); + + // NOT having a prerelease is > having one + if (this.prerelease.length && !other.prerelease.length) + return -1; + else if (!this.prerelease.length && other.prerelease.length) + return 1; + else if (!this.prerelease.length && !other.prerelease.length) + return 0; + + var i = 0; + do { + var a = this.prerelease[i]; + var b = other.prerelease[i]; + debug('prerelease compare', i, a, b); + if (a === undefined && b === undefined) + return 0; + else if (b === undefined) + return 1; + else if (a === undefined) + return -1; + else if (a === b) + continue; + else + return compareIdentifiers(a, b); + } while (++i); +}; + +// preminor will bump the version up to the next minor release, and immediately +// down to pre-release. premajor and prepatch work the same way. +SemVer.prototype.inc = function(release, identifier) { + switch (release) { + case 'premajor': + this.prerelease.length = 0; + this.patch = 0; + this.minor = 0; + this.major++; + this.inc('pre', identifier); + break; + case 'preminor': + this.prerelease.length = 0; + this.patch = 0; + this.minor++; + this.inc('pre', identifier); + break; + case 'prepatch': + // If this is already a prerelease, it will bump to the next version + // drop any prereleases that might already exist, since they are not + // relevant at this point. + this.prerelease.length = 0; + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + // If the input is a non-prerelease version, this acts the same as + // prepatch. + case 'prerelease': + if (this.prerelease.length === 0) + this.inc('patch', identifier); + this.inc('pre', identifier); + break; + + case 'major': + // If this is a pre-major version, bump up to the same major version. + // Otherwise increment major. + // 1.0.0-5 bumps to 1.0.0 + // 1.1.0 bumps to 2.0.0 + if (this.minor !== 0 || this.patch !== 0 || this.prerelease.length === 0) + this.major++; + this.minor = 0; + this.patch = 0; + this.prerelease = []; + break; + case 'minor': + // If this is a pre-minor version, bump up to the same minor version. + // Otherwise increment minor. + // 1.2.0-5 bumps to 1.2.0 + // 1.2.1 bumps to 1.3.0 + if (this.patch !== 0 || this.prerelease.length === 0) + this.minor++; + this.patch = 0; + this.prerelease = []; + break; + case 'patch': + // If this is not a pre-release version, it will increment the patch. + // If it is a pre-release it will bump up to the same patch version. + // 1.2.0-5 patches to 1.2.0 + // 1.2.0 patches to 1.2.1 + if (this.prerelease.length === 0) + this.patch++; + this.prerelease = []; + break; + // This probably shouldn't be used publicly. + // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. + case 'pre': + if (this.prerelease.length === 0) + this.prerelease = [0]; + else { + var i = this.prerelease.length; + while (--i >= 0) { + if (typeof this.prerelease[i] === 'number') { + this.prerelease[i]++; + i = -2; + } + } + if (i === -1) // didn't increment anything + this.prerelease.push(0); + } + if (identifier) { + // 1.2.0-beta.1 bumps to 1.2.0-beta.2, + // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 + if (this.prerelease[0] === identifier) { + if (isNaN(this.prerelease[1])) + this.prerelease = [identifier, 0]; + } else + this.prerelease = [identifier, 0]; + } + break; + + default: + throw new Error('invalid increment argument: ' + release); + } + this.format(); + this.raw = this.version; + return this; +}; + +exports.inc = inc; +function inc(version, release, loose, identifier) { + if (typeof(loose) === 'string') { + identifier = loose; + loose = undefined; + } + + try { + return new SemVer(version, loose).inc(release, identifier).version; + } catch (er) { + return null; + } +} + +exports.diff = diff; +function diff(version1, version2) { + if (eq(version1, version2)) { + return null; + } else { + var v1 = parse(version1); + var v2 = parse(version2); + if (v1.prerelease.length || v2.prerelease.length) { + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return 'pre'+key; + } + } + } + return 'prerelease'; + } + for (var key in v1) { + if (key === 'major' || key === 'minor' || key === 'patch') { + if (v1[key] !== v2[key]) { + return key; + } + } + } + } +} + +exports.compareIdentifiers = compareIdentifiers; + +var numeric = /^[0-9]+$/; +function compareIdentifiers(a, b) { + var anum = numeric.test(a); + var bnum = numeric.test(b); + + if (anum && bnum) { + a = +a; + b = +b; + } + + return (anum && !bnum) ? -1 : + (bnum && !anum) ? 1 : + a < b ? -1 : + a > b ? 1 : + 0; +} + +exports.rcompareIdentifiers = rcompareIdentifiers; +function rcompareIdentifiers(a, b) { + return compareIdentifiers(b, a); +} + +exports.major = major; +function major(a, loose) { + return new SemVer(a, loose).major; +} + +exports.minor = minor; +function minor(a, loose) { + return new SemVer(a, loose).minor; +} + +exports.patch = patch; +function patch(a, loose) { + return new SemVer(a, loose).patch; +} + +exports.compare = compare; +function compare(a, b, loose) { + return new SemVer(a, loose).compare(new SemVer(b, loose)); +} + +exports.compareLoose = compareLoose; +function compareLoose(a, b) { + return compare(a, b, true); +} + +exports.rcompare = rcompare; +function rcompare(a, b, loose) { + return compare(b, a, loose); +} + +exports.sort = sort; +function sort(list, loose) { + return list.sort(function(a, b) { + return exports.compare(a, b, loose); + }); +} + +exports.rsort = rsort; +function rsort(list, loose) { + return list.sort(function(a, b) { + return exports.rcompare(a, b, loose); + }); +} + +exports.gt = gt; +function gt(a, b, loose) { + return compare(a, b, loose) > 0; +} + +exports.lt = lt; +function lt(a, b, loose) { + return compare(a, b, loose) < 0; +} + +exports.eq = eq; +function eq(a, b, loose) { + return compare(a, b, loose) === 0; +} + +exports.neq = neq; +function neq(a, b, loose) { + return compare(a, b, loose) !== 0; +} + +exports.gte = gte; +function gte(a, b, loose) { + return compare(a, b, loose) >= 0; +} + +exports.lte = lte; +function lte(a, b, loose) { + return compare(a, b, loose) <= 0; +} + +exports.cmp = cmp; +function cmp(a, op, b, loose) { + var ret; + switch (op) { + case '===': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a === b; + break; + case '!==': + if (typeof a === 'object') a = a.version; + if (typeof b === 'object') b = b.version; + ret = a !== b; + break; + case '': case '=': case '==': ret = eq(a, b, loose); break; + case '!=': ret = neq(a, b, loose); break; + case '>': ret = gt(a, b, loose); break; + case '>=': ret = gte(a, b, loose); break; + case '<': ret = lt(a, b, loose); break; + case '<=': ret = lte(a, b, loose); break; + default: throw new TypeError('Invalid operator: ' + op); + } + return ret; +} + +exports.Comparator = Comparator; +function Comparator(comp, loose) { + if (comp instanceof Comparator) { + if (comp.loose === loose) + return comp; + else + comp = comp.value; + } + + if (!(this instanceof Comparator)) + return new Comparator(comp, loose); + + debug('comparator', comp, loose); + this.loose = loose; + this.parse(comp); + + if (this.semver === ANY) + this.value = ''; + else + this.value = this.operator + this.semver.version; + + debug('comp', this); +} + +var ANY = {}; +Comparator.prototype.parse = function(comp) { + var r = this.loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var m = comp.match(r); + + if (!m) + throw new TypeError('Invalid comparator: ' + comp); + + this.operator = m[1]; + if (this.operator === '=') + this.operator = ''; + + // if it literally is just '>' or '' then allow anything. + if (!m[2]) + this.semver = ANY; + else + this.semver = new SemVer(m[2], this.loose); +}; + +Comparator.prototype.toString = function() { + return this.value; +}; + +Comparator.prototype.test = function(version) { + debug('Comparator.test', version, this.loose); + + if (this.semver === ANY) + return true; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + return cmp(version, this.operator, this.semver, this.loose); +}; + +Comparator.prototype.intersects = function(comp, loose) { + if (!(comp instanceof Comparator)) { + throw new TypeError('a Comparator is required'); + } + + var rangeTmp; + + if (this.operator === '') { + rangeTmp = new Range(comp.value, loose); + return satisfies(this.value, rangeTmp, loose); + } else if (comp.operator === '') { + rangeTmp = new Range(this.value, loose); + return satisfies(comp.semver, rangeTmp, loose); + } + + var sameDirectionIncreasing = + (this.operator === '>=' || this.operator === '>') && + (comp.operator === '>=' || comp.operator === '>'); + var sameDirectionDecreasing = + (this.operator === '<=' || this.operator === '<') && + (comp.operator === '<=' || comp.operator === '<'); + var sameSemVer = this.semver.version === comp.semver.version; + var differentDirectionsInclusive = + (this.operator === '>=' || this.operator === '<=') && + (comp.operator === '>=' || comp.operator === '<='); + var oppositeDirectionsLessThan = + cmp(this.semver, '<', comp.semver, loose) && + ((this.operator === '>=' || this.operator === '>') && + (comp.operator === '<=' || comp.operator === '<')); + var oppositeDirectionsGreaterThan = + cmp(this.semver, '>', comp.semver, loose) && + ((this.operator === '<=' || this.operator === '<') && + (comp.operator === '>=' || comp.operator === '>')); + + return sameDirectionIncreasing || sameDirectionDecreasing || + (sameSemVer && differentDirectionsInclusive) || + oppositeDirectionsLessThan || oppositeDirectionsGreaterThan; +}; + + +exports.Range = Range; +function Range(range, loose) { + if (range instanceof Range) { + if (range.loose === loose) { + return range; + } else { + return new Range(range.raw, loose); + } + } + + if (range instanceof Comparator) { + return new Range(range.value, loose); + } + + if (!(this instanceof Range)) + return new Range(range, loose); + + this.loose = loose; + + // First, split based on boolean or || + this.raw = range; + this.set = range.split(/\s*\|\|\s*/).map(function(range) { + return this.parseRange(range.trim()); + }, this).filter(function(c) { + // throw out any that are not relevant for whatever reason + return c.length; + }); + + if (!this.set.length) { + throw new TypeError('Invalid SemVer Range: ' + range); + } + + this.format(); +} + +Range.prototype.format = function() { + this.range = this.set.map(function(comps) { + return comps.join(' ').trim(); + }).join('||').trim(); + return this.range; +}; + +Range.prototype.toString = function() { + return this.range; +}; + +Range.prototype.parseRange = function(range) { + var loose = this.loose; + range = range.trim(); + debug('range', range, loose); + // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` + var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE]; + range = range.replace(hr, hyphenReplace); + debug('hyphen replace', range); + // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` + range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace); + debug('comparator trim', range, re[COMPARATORTRIM]); + + // `~ 1.2.3` => `~1.2.3` + range = range.replace(re[TILDETRIM], tildeTrimReplace); + + // `^ 1.2.3` => `^1.2.3` + range = range.replace(re[CARETTRIM], caretTrimReplace); + + // normalize spaces + range = range.split(/\s+/).join(' '); + + // At this point, the range is completely trimmed and + // ready to be split into comparators. + + var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR]; + var set = range.split(' ').map(function(comp) { + return parseComparator(comp, loose); + }).join(' ').split(/\s+/); + if (this.loose) { + // in loose mode, throw out any that are not valid comparators + set = set.filter(function(comp) { + return !!comp.match(compRe); + }); + } + set = set.map(function(comp) { + return new Comparator(comp, loose); + }); + + return set; +}; + +Range.prototype.intersects = function(range, loose) { + if (!(range instanceof Range)) { + throw new TypeError('a Range is required'); + } + + return this.set.some(function(thisComparators) { + return thisComparators.every(function(thisComparator) { + return range.set.some(function(rangeComparators) { + return rangeComparators.every(function(rangeComparator) { + return thisComparator.intersects(rangeComparator, loose); + }); + }); + }); + }); +}; + +// Mostly just for testing and legacy API reasons +exports.toComparators = toComparators; +function toComparators(range, loose) { + return new Range(range, loose).set.map(function(comp) { + return comp.map(function(c) { + return c.value; + }).join(' ').trim().split(' '); + }); +} + +// comprised of xranges, tildes, stars, and gtlt's at this point. +// already replaced the hyphen ranges +// turn into a set of JUST comparators. +function parseComparator(comp, loose) { + debug('comp', comp); + comp = replaceCarets(comp, loose); + debug('caret', comp); + comp = replaceTildes(comp, loose); + debug('tildes', comp); + comp = replaceXRanges(comp, loose); + debug('xrange', comp); + comp = replaceStars(comp, loose); + debug('stars', comp); + return comp; +} + +function isX(id) { + return !id || id.toLowerCase() === 'x' || id === '*'; +} + +// ~, ~> --> * (any, kinda silly) +// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 +// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 +// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 +// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 +// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 +function replaceTildes(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceTilde(comp, loose); + }).join(' '); +} + +function replaceTilde(comp, loose) { + var r = loose ? re[TILDELOOSE] : re[TILDE]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('tilde', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) + // ~1.2 == >=1.2.0 <1.3.0 + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else if (pr) { + debug('replaceTilde pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + // ~1.2.3 == >=1.2.3 <1.3.0 + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + + debug('tilde return', ret); + return ret; + }); +} + +// ^ --> * (any, kinda silly) +// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 +// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 +// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 +// ^1.2.3 --> >=1.2.3 <2.0.0 +// ^1.2.0 --> >=1.2.0 <2.0.0 +function replaceCarets(comp, loose) { + return comp.trim().split(/\s+/).map(function(comp) { + return replaceCaret(comp, loose); + }).join(' '); +} + +function replaceCaret(comp, loose) { + debug('caret', comp, loose); + var r = loose ? re[CARETLOOSE] : re[CARET]; + return comp.replace(r, function(_, M, m, p, pr) { + debug('caret', comp, _, M, m, p, pr); + var ret; + + if (isX(M)) + ret = ''; + else if (isX(m)) + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + else if (isX(p)) { + if (M === '0') + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + else + ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'; + } else if (pr) { + debug('replaceCaret pr', pr); + if (pr.charAt(0) !== '-') + pr = '-' + pr; + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + pr + + ' <' + (+M + 1) + '.0.0'; + } else { + debug('no pr'); + if (M === '0') { + if (m === '0') + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + m + '.' + (+p + 1); + else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + M + '.' + (+m + 1) + '.0'; + } else + ret = '>=' + M + '.' + m + '.' + p + + ' <' + (+M + 1) + '.0.0'; + } + + debug('caret return', ret); + return ret; + }); +} + +function replaceXRanges(comp, loose) { + debug('replaceXRanges', comp, loose); + return comp.split(/\s+/).map(function(comp) { + return replaceXRange(comp, loose); + }).join(' '); +} + +function replaceXRange(comp, loose) { + comp = comp.trim(); + var r = loose ? re[XRANGELOOSE] : re[XRANGE]; + return comp.replace(r, function(ret, gtlt, M, m, p, pr) { + debug('xRange', comp, ret, gtlt, M, m, p, pr); + var xM = isX(M); + var xm = xM || isX(m); + var xp = xm || isX(p); + var anyX = xp; + + if (gtlt === '=' && anyX) + gtlt = ''; + + if (xM) { + if (gtlt === '>' || gtlt === '<') { + // nothing is allowed + ret = '<0.0.0'; + } else { + // nothing is forbidden + ret = '*'; + } + } else if (gtlt && anyX) { + // replace X with 0 + if (xm) + m = 0; + if (xp) + p = 0; + + if (gtlt === '>') { + // >1 => >=2.0.0 + // >1.2 => >=1.3.0 + // >1.2.3 => >= 1.2.4 + gtlt = '>='; + if (xm) { + M = +M + 1; + m = 0; + p = 0; + } else if (xp) { + m = +m + 1; + p = 0; + } + } else if (gtlt === '<=') { + // <=0.7.x is actually <0.8.0, since any 0.7.x should + // pass. Similarly, <=7.x is actually <8.0.0, etc. + gtlt = '<'; + if (xm) + M = +M + 1; + else + m = +m + 1; + } + + ret = gtlt + M + '.' + m + '.' + p; + } else if (xm) { + ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'; + } else if (xp) { + ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'; + } + + debug('xRange return', ret); + + return ret; + }); +} + +// Because * is AND-ed with everything else in the comparator, +// and '' means "any version", just remove the *s entirely. +function replaceStars(comp, loose) { + debug('replaceStars', comp, loose); + // Looseness is ignored here. star is always as loose as it gets! + return comp.trim().replace(re[STAR], ''); +} + +// This function is passed to string.replace(re[HYPHENRANGE]) +// M, m, patch, prerelease, build +// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 +// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do +// 1.2 - 3.4 => >=1.2.0 <3.5.0 +function hyphenReplace($0, + from, fM, fm, fp, fpr, fb, + to, tM, tm, tp, tpr, tb) { + + if (isX(fM)) + from = ''; + else if (isX(fm)) + from = '>=' + fM + '.0.0'; + else if (isX(fp)) + from = '>=' + fM + '.' + fm + '.0'; + else + from = '>=' + from; + + if (isX(tM)) + to = ''; + else if (isX(tm)) + to = '<' + (+tM + 1) + '.0.0'; + else if (isX(tp)) + to = '<' + tM + '.' + (+tm + 1) + '.0'; + else if (tpr) + to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr; + else + to = '<=' + to; + + return (from + ' ' + to).trim(); +} + + +// if ANY of the sets match ALL of its comparators, then pass +Range.prototype.test = function(version) { + if (!version) + return false; + + if (typeof version === 'string') + version = new SemVer(version, this.loose); + + for (var i = 0; i < this.set.length; i++) { + if (testSet(this.set[i], version)) + return true; + } + return false; +}; + +function testSet(set, version) { + for (var i = 0; i < set.length; i++) { + if (!set[i].test(version)) + return false; + } + + if (version.prerelease.length) { + // Find the set of versions that are allowed to have prereleases + // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 + // That should allow `1.2.3-pr.2` to pass. + // However, `1.2.4-alpha.notready` should NOT be allowed, + // even though it's within the range set by the comparators. + for (var i = 0; i < set.length; i++) { + debug(set[i].semver); + if (set[i].semver === ANY) + continue; + + if (set[i].semver.prerelease.length > 0) { + var allowed = set[i].semver; + if (allowed.major === version.major && + allowed.minor === version.minor && + allowed.patch === version.patch) + return true; + } + } + + // Version has a -pre, but it's not one of the ones we like. + return false; + } + + return true; +} + +exports.satisfies = satisfies; +function satisfies(version, range, loose) { + try { + range = new Range(range, loose); + } catch (er) { + return false; + } + return range.test(version); +} + +exports.maxSatisfying = maxSatisfying; +function maxSatisfying(versions, range, loose) { + var max = null; + var maxSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!max || maxSV.compare(v) === -1) { // compare(max, v, true) + max = v; + maxSV = new SemVer(max, loose); + } + } + }) + return max; +} + +exports.minSatisfying = minSatisfying; +function minSatisfying(versions, range, loose) { + var min = null; + var minSV = null; + try { + var rangeObj = new Range(range, loose); + } catch (er) { + return null; + } + versions.forEach(function (v) { + if (rangeObj.test(v)) { // satisfies(v, range, loose) + if (!min || minSV.compare(v) === 1) { // compare(min, v, true) + min = v; + minSV = new SemVer(min, loose); + } + } + }) + return min; +} + +exports.validRange = validRange; +function validRange(range, loose) { + try { + // Return '*' instead of '' so that truthiness works. + // This will throw if it's invalid anyway + return new Range(range, loose).range || '*'; + } catch (er) { + return null; + } +} + +// Determine if version is less than all the versions possible in the range +exports.ltr = ltr; +function ltr(version, range, loose) { + return outside(version, range, '<', loose); +} + +// Determine if version is greater than all the versions possible in the range. +exports.gtr = gtr; +function gtr(version, range, loose) { + return outside(version, range, '>', loose); +} + +exports.outside = outside; +function outside(version, range, hilo, loose) { + version = new SemVer(version, loose); + range = new Range(range, loose); + + var gtfn, ltefn, ltfn, comp, ecomp; + switch (hilo) { + case '>': + gtfn = gt; + ltefn = lte; + ltfn = lt; + comp = '>'; + ecomp = '>='; + break; + case '<': + gtfn = lt; + ltefn = gte; + ltfn = gt; + comp = '<'; + ecomp = '<='; + break; + default: + throw new TypeError('Must provide a hilo val of "<" or ">"'); + } + + // If it satisifes the range it is not outside + if (satisfies(version, range, loose)) { + return false; + } + + // From now on, variable terms are as if we're in "gtr" mode. + // but note that everything is flipped for the "ltr" function. + + for (var i = 0; i < range.set.length; ++i) { + var comparators = range.set[i]; + + var high = null; + var low = null; + + comparators.forEach(function(comparator) { + if (comparator.semver === ANY) { + comparator = new Comparator('>=0.0.0') + } + high = high || comparator; + low = low || comparator; + if (gtfn(comparator.semver, high.semver, loose)) { + high = comparator; + } else if (ltfn(comparator.semver, low.semver, loose)) { + low = comparator; + } + }); + + // If the edge version comparator has a operator then our version + // isn't outside it + if (high.operator === comp || high.operator === ecomp) { + return false; + } + + // If the lowest version comparator has an operator and our version + // is less than it then it isn't higher than the range + if ((!low.operator || low.operator === comp) && + ltefn(version, low.semver)) { + return false; + } else if (low.operator === ecomp && ltfn(version, low.semver)) { + return false; + } + } + return true; +} + +exports.prerelease = prerelease; +function prerelease(version, loose) { + var parsed = parse(version, loose); + return (parsed && parsed.prerelease.length) ? parsed.prerelease : null; +} + +exports.intersects = intersects; +function intersects(r1, r2, loose) { + r1 = new Range(r1, loose) + r2 = new Range(r2, loose) + return r1.intersects(r2) +} + +exports.coerce = coerce; +function coerce(version) { + if (version instanceof SemVer) + return version; + + if (typeof version !== 'string') + return null; + + var match = version.match(re[COERCE]); + + if (match == null) + return null; + + return parse((match[1] || '0') + '.' + (match[2] || '0') + '.' + (match[3] || '0')); +} + + +/***/ }), +/* 23 */ +/***/ (function(module, exports) { + +module.exports = require("stream"); + +/***/ }), +/* 24 */ +/***/ (function(module, exports) { + +module.exports = require("url"); + +/***/ }), +/* 25 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subscription; }); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__util_isArray__ = __webpack_require__(41); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__util_isObject__ = __webpack_require__(444); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__util_isFunction__ = __webpack_require__(155); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__util_tryCatch__ = __webpack_require__(57); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_errorObject__ = __webpack_require__(48); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__ = __webpack_require__(441); +/** PURE_IMPORTS_START _util_isArray,_util_isObject,_util_isFunction,_util_tryCatch,_util_errorObject,_util_UnsubscriptionError PURE_IMPORTS_END */ + + + + + + +var Subscription = /*@__PURE__*/ (function () { + function Subscription(unsubscribe) { + this.closed = false; + this._parent = null; + this._parents = null; + this._subscriptions = null; + if (unsubscribe) { + this._unsubscribe = unsubscribe; + } + } + Subscription.prototype.unsubscribe = function () { + var hasErrors = false; + var errors; + if (this.closed) { + return; + } + var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions; + this.closed = true; + this._parent = null; + this._parents = null; + this._subscriptions = null; + var index = -1; + var len = _parents ? _parents.length : 0; + while (_parent) { + _parent.remove(this); + _parent = ++index < len && _parents[index] || null; + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_2__util_isFunction__["a" /* isFunction */])(_unsubscribe)) { + var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__["a" /* tryCatch */])(_unsubscribe).call(this); + if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */]) { + hasErrors = true; + errors = errors || (__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */] ? + flattenUnsubscriptionErrors(__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e.errors) : [__WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e]); + } + } + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_0__util_isArray__["a" /* isArray */])(_subscriptions)) { + index = -1; + len = _subscriptions.length; + while (++index < len) { + var sub = _subscriptions[index]; + if (__webpack_require__.i(__WEBPACK_IMPORTED_MODULE_1__util_isObject__["a" /* isObject */])(sub)) { + var trial = __webpack_require__.i(__WEBPACK_IMPORTED_MODULE_3__util_tryCatch__["a" /* tryCatch */])(sub.unsubscribe).call(sub); + if (trial === __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */]) { + hasErrors = true; + errors = errors || []; + var err = __WEBPACK_IMPORTED_MODULE_4__util_errorObject__["a" /* errorObject */].e; + if (err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */]) { + errors = errors.concat(flattenUnsubscriptionErrors(err.errors)); + } + else { + errors.push(err); + } + } + } + } + } + if (hasErrors) { + throw new __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */](errors); + } + }; + Subscription.prototype.add = function (teardown) { + if (!teardown || (teardown === Subscription.EMPTY)) { + return Subscription.EMPTY; + } + if (teardown === this) { + return this; + } + var subscription = teardown; + switch (typeof teardown) { + case 'function': + subscription = new Subscription(teardown); + case 'object': + if (subscription.closed || typeof subscription.unsubscribe !== 'function') { + return subscription; + } + else if (this.closed) { + subscription.unsubscribe(); + return subscription; + } + else if (typeof subscription._addParent !== 'function') { + var tmp = subscription; + subscription = new Subscription(); + subscription._subscriptions = [tmp]; + } + break; + default: + throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.'); + } + var subscriptions = this._subscriptions || (this._subscriptions = []); + subscriptions.push(subscription); + subscription._addParent(this); + return subscription; + }; + Subscription.prototype.remove = function (subscription) { + var subscriptions = this._subscriptions; + if (subscriptions) { + var subscriptionIndex = subscriptions.indexOf(subscription); + if (subscriptionIndex !== -1) { + subscriptions.splice(subscriptionIndex, 1); + } + } + }; + Subscription.prototype._addParent = function (parent) { + var _a = this, _parent = _a._parent, _parents = _a._parents; + if (!_parent || _parent === parent) { + this._parent = parent; + } + else if (!_parents) { + this._parents = [parent]; + } + else if (_parents.indexOf(parent) === -1) { + _parents.push(parent); + } + }; + Subscription.EMPTY = (function (empty) { + empty.closed = true; + return empty; + }(new Subscription())); + return Subscription; +}()); + +function flattenUnsubscriptionErrors(errors) { + return errors.reduce(function (errs, err) { return errs.concat((err instanceof __WEBPACK_IMPORTED_MODULE_5__util_UnsubscriptionError__["a" /* UnsubscriptionError */]) ? err.errors : err); }, []); +} +//# sourceMappingURL=Subscription.js.map + + +/***/ }), +/* 26 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2015 Joyent, Inc. + +module.exports = { + bufferSplit: bufferSplit, + addRSAMissing: addRSAMissing, + calculateDSAPublic: calculateDSAPublic, + calculateED25519Public: calculateED25519Public, + calculateX25519Public: calculateX25519Public, + mpNormalize: mpNormalize, + mpDenormalize: mpDenormalize, + ecNormalize: ecNormalize, + countZeros: countZeros, + assertCompatible: assertCompatible, + isCompatible: isCompatible, + opensslKeyDeriv: opensslKeyDeriv, + opensshCipherInfo: opensshCipherInfo, + publicFromPrivateECDSA: publicFromPrivateECDSA, + zeroPadToLength: zeroPadToLength, + writeBitString: writeBitString, + readBitString: readBitString +}; + +var assert = __webpack_require__(16); +var Buffer = __webpack_require__(15).Buffer; +var PrivateKey = __webpack_require__(33); +var Key = __webpack_require__(28); +var crypto = __webpack_require__(11); +var algs = __webpack_require__(32); +var asn1 = __webpack_require__(66); + +var ec, jsbn; +var nacl; + +var MAX_CLASS_DEPTH = 3; + +function isCompatible(obj, klass, needVer) { + if (obj === null || typeof (obj) !== 'object') + return (false); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return (true); + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + if (!proto || ++depth > MAX_CLASS_DEPTH) + return (false); + } + if (proto.constructor.name !== klass.name) + return (false); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + if (ver[0] != needVer[0] || ver[1] < needVer[1]) + return (false); + return (true); +} + +function assertCompatible(obj, klass, needVer, name) { + if (name === undefined) + name = 'object'; + assert.ok(obj, name + ' must not be null'); + assert.object(obj, name + ' must be an object'); + if (needVer === undefined) + needVer = klass.prototype._sshpkApiVersion; + if (obj instanceof klass && + klass.prototype._sshpkApiVersion[0] == needVer[0]) + return; + var proto = Object.getPrototypeOf(obj); + var depth = 0; + while (proto.constructor.name !== klass.name) { + proto = Object.getPrototypeOf(proto); + assert.ok(proto && ++depth <= MAX_CLASS_DEPTH, + name + ' must be a ' + klass.name + ' instance'); + } + assert.strictEqual(proto.constructor.name, klass.name, + name + ' must be a ' + klass.name + ' instance'); + var ver = proto._sshpkApiVersion; + if (ver === undefined) + ver = klass._oldVersionDetect(obj); + assert.ok(ver[0] == needVer[0] && ver[1] >= needVer[1], + name + ' must be compatible with ' + klass.name + ' klass ' + + 'version ' + needVer[0] + '.' + needVer[1]); +} + +var CIPHER_LEN = { + 'des-ede3-cbc': { key: 7, iv: 8 }, + 'aes-128-cbc': { key: 16, iv: 16 } +}; +var PKCS5_SALT_LEN = 8; + +function opensslKeyDeriv(cipher, salt, passphrase, count) { + assert.buffer(salt, 'salt'); + assert.buffer(passphrase, 'passphrase'); + assert.number(count, 'iteration count'); + + var clen = CIPHER_LEN[cipher]; + assert.object(clen, 'supported cipher'); + + salt = salt.slice(0, PKCS5_SALT_LEN); + + var D, D_prev, bufs; + var material = Buffer.alloc(0); + while (material.length < clen.key + clen.iv) { + bufs = []; + if (D_prev) + bufs.push(D_prev); + bufs.push(passphrase); + bufs.push(salt); + D = Buffer.concat(bufs); + for (var j = 0; j < count; ++j) + D = crypto.createHash('md5').update(D).digest(); + material = Buffer.concat([material, D]); + D_prev = D; + } + + return ({ + key: material.slice(0, clen.key), + iv: material.slice(clen.key, clen.key + clen.iv) + }); +} + +/* Count leading zero bits on a buffer */ +function countZeros(buf) { + var o = 0, obit = 8; + while (o < buf.length) { + var mask = (1 << obit); + if ((buf[o] & mask) === mask) + break; + obit--; + if (obit < 0) { + o++; + obit = 8; + } + } + return (o*8 + (8 - obit) - 1); +} + +function bufferSplit(buf, chr) { + assert.buffer(buf); + assert.string(chr); + + var parts = []; + var lastPart = 0; + var matches = 0; + for (var i = 0; i < buf.length; ++i) { + if (buf[i] === chr.charCodeAt(matches)) + ++matches; + else if (buf[i] === chr.charCodeAt(0)) + matches = 1; + else + matches = 0; + + if (matches >= chr.length) { + var newPart = i + 1; + parts.push(buf.slice(lastPart, newPart - matches)); + lastPart = newPart; + matches = 0; + } + } + if (lastPart <= buf.length) + parts.push(buf.slice(lastPart, buf.length)); + + return (parts); +} + +function ecNormalize(buf, addZero) { + assert.buffer(buf); + if (buf[0] === 0x00 && buf[1] === 0x04) { + if (addZero) + return (buf); + return (buf.slice(1)); + } else if (buf[0] === 0x04) { + if (!addZero) + return (buf); + } else { + while (buf[0] === 0x00) + buf = buf.slice(1); + if (buf[0] === 0x02 || buf[0] === 0x03) + throw (new Error('Compressed elliptic curve points ' + + 'are not supported')); + if (buf[0] !== 0x04) + throw (new Error('Not a valid elliptic curve point')); + if (!addZero) + return (buf); + } + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x0; + buf.copy(b, 1); + return (b); +} + +function readBitString(der, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var buf = der.readString(tag, true); + assert.strictEqual(buf[0], 0x00, 'bit strings with unused bits are ' + + 'not supported (0x' + buf[0].toString(16) + ')'); + return (buf.slice(1)); +} + +function writeBitString(der, buf, tag) { + if (tag === undefined) + tag = asn1.Ber.BitString; + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + der.writeBuffer(b, tag); +} + +function mpNormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00 && (buf[1] & 0x80) === 0x00) + buf = buf.slice(1); + if ((buf[0] & 0x80) === 0x80) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function mpDenormalize(buf) { + assert.buffer(buf); + while (buf.length > 1 && buf[0] === 0x00) + buf = buf.slice(1); + return (buf); +} + +function zeroPadToLength(buf, len) { + assert.buffer(buf); + assert.number(len); + while (buf.length > len) { + assert.equal(buf[0], 0x00); + buf = buf.slice(1); + } + while (buf.length < len) { + var b = Buffer.alloc(buf.length + 1); + b[0] = 0x00; + buf.copy(b, 1); + buf = b; + } + return (buf); +} + +function bigintToMpBuf(bigint) { + var buf = Buffer.from(bigint.toByteArray()); + buf = mpNormalize(buf); + return (buf); +} + +function calculateDSAPublic(g, p, x) { + assert.buffer(g); + assert.buffer(p); + assert.buffer(x); + try { + var bigInt = __webpack_require__(81).BigInteger; + } catch (e) { + throw (new Error('To load a PKCS#8 format DSA private key, ' + + 'the node jsbn library is required.')); + } + g = new bigInt(g); + p = new bigInt(p); + x = new bigInt(x); + var y = g.modPow(x, p); + var ybuf = bigintToMpBuf(y); + return (ybuf); +} + +function calculateED25519Public(k) { + assert.buffer(k); + + if (nacl === undefined) + nacl = __webpack_require__(76); + + var kp = nacl.sign.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function calculateX25519Public(k) { + assert.buffer(k); + + if (nacl === undefined) + nacl = __webpack_require__(76); + + var kp = nacl.box.keyPair.fromSeed(new Uint8Array(k)); + return (Buffer.from(kp.publicKey)); +} + +function addRSAMissing(key) { + assert.object(key); + assertCompatible(key, PrivateKey, [1, 1]); + try { + var bigInt = __webpack_require__(81).BigInteger; + } catch (e) { + throw (new Error('To write a PEM private key from ' + + 'this source, the node jsbn lib is required.')); + } + + var d = new bigInt(key.part.d.data); + var buf; + + if (!key.part.dmodp) { + var p = new bigInt(key.part.p.data); + var dmodp = d.mod(p.subtract(1)); + + buf = bigintToMpBuf(dmodp); + key.part.dmodp = {name: 'dmodp', data: buf}; + key.parts.push(key.part.dmodp); + } + if (!key.part.dmodq) { + var q = new bigInt(key.part.q.data); + var dmodq = d.mod(q.subtract(1)); + + buf = bigintToMpBuf(dmodq); + key.part.dmodq = {name: 'dmodq', data: buf}; + key.parts.push(key.part.dmodq); + } +} + +function publicFromPrivateECDSA(curveName, priv) { + assert.string(curveName, 'curveName'); + assert.buffer(priv); + if (ec === undefined) + ec = __webpack_require__(140); + if (jsbn === undefined) + jsbn = __webpack_require__(81).BigInteger; + var params = algs.curves[curveName]; + var p = new jsbn(params.p); + var a = new jsbn(params.a); + var b = new jsbn(params.b); + var curve = new ec.ECCurveFp(p, a, b); + var G = curve.decodePointHex(params.G.toString('hex')); + + var d = new jsbn(mpNormalize(priv)); + var pub = G.multiply(d); + pub = Buffer.from(curve.encodePointHex(pub), 'hex'); + + var parts = []; + parts.push({name: 'curve', data: Buffer.from(curveName)}); + parts.push({name: 'Q', data: pub}); + + var key = new Key({type: 'ecdsa', curve: curve, parts: parts}); + return (key); +} + +function opensshCipherInfo(cipher) { + var inf = {}; + switch (cipher) { + case '3des-cbc': + inf.keySize = 24; + inf.blockSize = 8; + inf.opensslName = 'des-ede3-cbc'; + break; + case 'blowfish-cbc': + inf.keySize = 16; + inf.blockSize = 8; + inf.opensslName = 'bf-cbc'; + break; + case 'aes128-cbc': + case 'aes128-ctr': + case 'aes128-gcm@openssh.com': + inf.keySize = 16; + inf.blockSize = 16; + inf.opensslName = 'aes-128-' + cipher.slice(7, 10); + break; + case 'aes192-cbc': + case 'aes192-ctr': + case 'aes192-gcm@openssh.com': + inf.keySize = 24; + inf.blockSize = 16; + inf.opensslName = 'aes-192-' + cipher.slice(7, 10); + break; + case 'aes256-cbc': + case 'aes256-ctr': + case 'aes256-gcm@openssh.com': + inf.keySize = 32; + inf.blockSize = 16; + inf.opensslName = 'aes-256-' + cipher.slice(7, 10); + break; + default: + throw (new Error( + 'Unsupported openssl cipher "' + cipher + '"')); + } + return (inf); +} + + +/***/ }), +/* 27 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +const escapeStringRegexp = __webpack_require__(382); +const ansiStyles = __webpack_require__(474); +const stdoutColor = __webpack_require__(566).stdout; + +const template = __webpack_require__(567); + +const isSimpleWindowsTerm = process.platform === 'win32' && !(process.env.TERM || '').toLowerCase().startsWith('xterm'); + +// `supportsColor.level` → `ansiStyles.color[name]` mapping +const levelMapping = ['ansi', 'ansi', 'ansi256', 'ansi16m']; + +// `color-convert` models to exclude from the Chalk API due to conflicts and such +const skipModels = new Set(['gray']); + +const styles = Object.create(null); + +function applyOptions(obj, options) { + options = options || {}; + + // Detect level if not set manually + const scLevel = stdoutColor ? stdoutColor.level : 0; + obj.level = options.level === undefined ? scLevel : options.level; + obj.enabled = 'enabled' in options ? options.enabled : obj.level > 0; +} + +function Chalk(options) { + // We check for this.template here since calling `chalk.constructor()` + // by itself will have a `this` of a previously constructed chalk object + if (!this || !(this instanceof Chalk) || this.template) { + const chalk = {}; + applyOptions(chalk, options); + + chalk.template = function () { + const args = [].slice.call(arguments); + return chalkTag.apply(null, [chalk.template].concat(args)); + }; + + Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk.template, chalk); + + chalk.template.constructor = Chalk; + + return chalk.template; + } + + applyOptions(this, options); +} + +// Use bright blue on Windows as the normal blue color is illegible +if (isSimpleWindowsTerm) { + ansiStyles.blue.open = '\u001B[94m'; +} + +for (const key of Object.keys(ansiStyles)) { + ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g'); + + styles[key] = { + get() { + const codes = ansiStyles[key]; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, key); + } + }; +} + +styles.visible = { + get() { + return build.call(this, this._styles || [], true, 'visible'); + } +}; + +ansiStyles.color.closeRe = new RegExp(escapeStringRegexp(ansiStyles.color.close), 'g'); +for (const model of Object.keys(ansiStyles.color.ansi)) { + if (skipModels.has(model)) { + continue; + } + + styles[model] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.color[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.color.close, + closeRe: ansiStyles.color.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +ansiStyles.bgColor.closeRe = new RegExp(escapeStringRegexp(ansiStyles.bgColor.close), 'g'); +for (const model of Object.keys(ansiStyles.bgColor.ansi)) { + if (skipModels.has(model)) { + continue; + } + + const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); + styles[bgModel] = { + get() { + const level = this.level; + return function () { + const open = ansiStyles.bgColor[levelMapping[level]][model].apply(null, arguments); + const codes = { + open, + close: ansiStyles.bgColor.close, + closeRe: ansiStyles.bgColor.closeRe + }; + return build.call(this, this._styles ? this._styles.concat(codes) : [codes], this._empty, model); + }; + } + }; +} + +const proto = Object.defineProperties(() => {}, styles); + +function build(_styles, _empty, key) { + const builder = function () { + return applyStyle.apply(builder, arguments); + }; + + builder._styles = _styles; + builder._empty = _empty; + + const self = this; + + Object.defineProperty(builder, 'level', { + enumerable: true, + get() { + return self.level; + }, + set(level) { + self.level = level; + } + }); + + Object.defineProperty(builder, 'enabled', { + enumerable: true, + get() { + return self.enabled; + }, + set(enabled) { + self.enabled = enabled; + } + }); + + // See below for fix regarding invisible grey/dim combination on Windows + builder.hasGrey = this.hasGrey || key === 'gray' || key === 'grey'; + + // `__proto__` is used because we must return a function, but there is + // no way to create a function with a different prototype + builder.__proto__ = proto; // eslint-disable-line no-proto + + return builder; +} + +function applyStyle() { + // Support varags, but simply cast to string in case there's only one arg + const args = arguments; + const argsLen = args.length; + let str = String(arguments[0]); + + if (argsLen === 0) { + return ''; + } + + if (argsLen > 1) { + // Don't slice `arguments`, it prevents V8 optimizations + for (let a = 1; a < argsLen; a++) { + str += ' ' + args[a]; + } + } + + if (!this.enabled || this.level <= 0 || !str) { + return this._empty ? '' : str; + } + + // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe, + // see https://github.com/chalk/chalk/issues/58 + // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop. + const originalDim = ansiStyles.dim.open; + if (isSimpleWindowsTerm && this.hasGrey) { + ansiStyles.dim.open = ''; + } + + for (const code of this._styles.slice().reverse()) { + // Replace any instances already present with a re-opening code + // otherwise only the part of the string until said closing code + // will be colored, and the rest will simply be 'plain'. + str = code.open + str.replace(code.closeRe, code.open) + code.close; + + // Close the styling before a linebreak and reopen + // after next line to fix a bleed issue on macOS + // https://github.com/chalk/chalk/pull/92 + str = str.replace(/\r?\n/g, `${code.close}$&${code.open}`); + } + + // Reset the original `dim` if we changed it to work around the Windows dimmed gray issue + ansiStyles.dim.open = originalDim; + + return str; +} + +function chalkTag(chalk, strings) { + if (!Array.isArray(strings)) { + // If chalk() was called by itself or with a string, + // return the string itself as a string. + return [].slice.call(arguments, 1).join(' '); + } + + const args = [].slice.call(arguments, 2); + const parts = [strings.raw[0]]; + + for (let i = 1; i < strings.length; i++) { + parts.push(String(args[i - 1]).replace(/[{}\\]/g, '\\$&')); + parts.push(String(strings.raw[i])); + } + + return template(chalk, parts.join('')); +} + +Object.defineProperties(Chalk.prototype, styles); + +module.exports = Chalk(); // eslint-disable-line new-cap +module.exports.supportsColor = stdoutColor; +module.exports.default = module.exports; // For TypeScript + + +/***/ }), +/* 28 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2017 Joyent, Inc. + +module.exports = Key; + +var assert = __webpack_require__(16); +var algs = __webpack_require__(32); +var crypto = __webpack_require__(11); +var Fingerprint = __webpack_require__(157); +var Signature = __webpack_require__(75); +var DiffieHellman = __webpack_require__(326).DiffieHellman; +var errs = __webpack_require__(74); +var utils = __webpack_require__(26); +var PrivateKey = __webpack_require__(33); +var edCompat; + +try { + edCompat = __webpack_require__(454); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; + +var formats = {}; +formats['auto'] = __webpack_require__(455); +formats['pem'] = __webpack_require__(86); +formats['pkcs1'] = __webpack_require__(328); +formats['pkcs8'] = __webpack_require__(158); +formats['rfc4253'] = __webpack_require__(103); +formats['ssh'] = __webpack_require__(456); +formats['ssh-private'] = __webpack_require__(193); +formats['openssh'] = formats['ssh-private']; +formats['dnssec'] = __webpack_require__(327); + +function Key(opts) { + assert.object(opts, 'options'); + assert.arrayOfObject(opts.parts, 'options.parts'); + assert.string(opts.type, 'options.type'); + assert.optionalString(opts.comment, 'options.comment'); + + var algInfo = algs.info[opts.type]; + if (typeof (algInfo) !== 'object') + throw (new InvalidAlgorithmError(opts.type)); + + var partLookup = {}; + for (var i = 0; i < opts.parts.length; ++i) { + var part = opts.parts[i]; + partLookup[part.name] = part; + } + + this.type = opts.type; + this.parts = opts.parts; + this.part = partLookup; + this.comment = undefined; + this.source = opts.source; + + /* for speeding up hashing/fingerprint operations */ + this._rfc4253Cache = opts._rfc4253Cache; + this._hashCache = {}; + + var sz; + this.curve = undefined; + if (this.type === 'ecdsa') { + var curve = this.part.curve.data.toString(); + this.curve = curve; + sz = algs.curves[curve].size; + } else if (this.type === 'ed25519' || this.type === 'curve25519') { + sz = 256; + this.curve = 'curve25519'; + } else { + var szPart = this.part[algInfo.sizePart]; + sz = szPart.data.length; + sz = sz * 8 - utils.countZeros(szPart.data); + } + this.size = sz; +} + +Key.formats = formats; + +Key.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'ssh'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + if (format === 'rfc4253') { + if (this._rfc4253Cache === undefined) + this._rfc4253Cache = formats['rfc4253'].write(this); + return (this._rfc4253Cache); + } + + return (formats[format].write(this, options)); +}; + +Key.prototype.toString = function (format, options) { + return (this.toBuffer(format, options).toString()); +}; + +Key.prototype.hash = function (algo) { + assert.string(algo, 'algorithm'); + algo = algo.toLowerCase(); + if (algs.hashAlgs[algo] === undefined) + throw (new InvalidAlgorithmError(algo)); + + if (this._hashCache[algo]) + return (this._hashCache[algo]); + var hash = crypto.createHash(algo). + update(this.toBuffer('rfc4253')).digest(); + this._hashCache[algo] = hash; + return (hash); +}; + +Key.prototype.fingerprint = function (algo) { + if (algo === undefined) + algo = 'sha256'; + assert.string(algo, 'algorithm'); + var opts = { + type: 'key', + hash: this.hash(algo), + algorithm: algo + }; + return (new Fingerprint(opts)); +}; + +Key.prototype.defaultHashAlgorithm = function () { + var hashAlgo = 'sha1'; + if (this.type === 'rsa') + hashAlgo = 'sha256'; + if (this.type === 'dsa' && this.size > 1024) + hashAlgo = 'sha256'; + if (this.type === 'ed25519') + hashAlgo = 'sha512'; + if (this.type === 'ecdsa') { + if (this.size <= 256) + hashAlgo = 'sha256'; + else if (this.size <= 384) + hashAlgo = 'sha384'; + else + hashAlgo = 'sha512'; + } + return (hashAlgo); +}; + +Key.prototype.createVerify = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Verifier(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createVerify(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldVerify = v.verify.bind(v); + var key = this.toBuffer('pkcs8'); + var curve = this.curve; + var self = this; + v.verify = function (signature, fmt) { + if (Signature.isSignature(signature, [2, 0])) { + if (signature.type !== self.type) + return (false); + if (signature.hashAlgorithm && + signature.hashAlgorithm !== hashAlgo) + return (false); + if (signature.curve && self.type === 'ecdsa' && + signature.curve !== curve) + return (false); + return (oldVerify(key, signature.toBuffer('asn1'))); + + } else if (typeof (signature) === 'string' || + Buffer.isBuffer(signature)) { + return (oldVerify(key, signature, fmt)); + + /* + * Avoid doing this on valid arguments, walking the prototype + * chain can be quite slow. + */ + } else if (Signature.isSignature(signature, [1, 0])) { + throw (new Error('signature was created by too old ' + + 'a version of sshpk and cannot be verified')); + + } else { + throw (new TypeError('signature must be a string, ' + + 'Buffer, or Signature object')); + } + }; + return (v); +}; + +Key.prototype.createDiffieHellman = function () { + if (this.type === 'rsa') + throw (new Error('RSA keys do not support Diffie-Hellman')); + + return (new DiffieHellman(this)); +}; +Key.prototype.createDH = Key.prototype.createDiffieHellman; + +Key.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + if (k instanceof PrivateKey) + k = k.toPublic(); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +Key.isKey = function (obj, ver) { + return (utils.isCompatible(obj, Key, ver)); +}; + +/* + * API versions for Key: + * [1,0] -- initial ver, may take Signature for createVerify or may not + * [1,1] -- added pkcs1, pkcs8 formats + * [1,2] -- added auto, ssh-private, openssh formats + * [1,3] -- added defaultHashAlgorithm + * [1,4] -- added ed support, createDH + * [1,5] -- first explicitly tagged version + * [1,6] -- changed ed25519 part names + */ +Key.prototype._sshpkApiVersion = [1, 6]; + +Key._oldVersionDetect = function (obj) { + assert.func(obj.toBuffer); + assert.func(obj.fingerprint); + if (obj.createDH) + return ([1, 4]); + if (obj.defaultHashAlgorithm) + return ([1, 3]); + if (obj.formats['auto']) + return ([1, 2]); + if (obj.formats['pkcs1']) + return ([1, 1]); + return ([1, 0]); +}; + + +/***/ }), +/* 29 */ +/***/ (function(module, exports) { + +module.exports = require("assert"); + +/***/ }), +/* 30 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = nullify; +function nullify(obj = {}) { + if (Array.isArray(obj)) { + for (var _iterator = obj, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const item = _ref; + + nullify(item); + } + } else if (obj !== null && typeof obj === 'object' || typeof obj === 'function') { + Object.setPrototypeOf(obj, null); + + // for..in can only be applied to 'object', not 'function' + if (typeof obj === 'object') { + for (const key in obj) { + nullify(obj[key]); + } + } + } + + return obj; +} + +/***/ }), +/* 31 */ +/***/ (function(module, exports) { + +var core = module.exports = { version: '2.5.7' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + + +/***/ }), +/* 32 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2015 Joyent, Inc. + +var Buffer = __webpack_require__(15).Buffer; + +var algInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y'], + sizePart: 'p' + }, + 'rsa': { + parts: ['e', 'n'], + sizePart: 'n' + }, + 'ecdsa': { + parts: ['curve', 'Q'], + sizePart: 'Q' + }, + 'ed25519': { + parts: ['A'], + sizePart: 'A' + } +}; +algInfo['curve25519'] = algInfo['ed25519']; + +var algPrivInfo = { + 'dsa': { + parts: ['p', 'q', 'g', 'y', 'x'] + }, + 'rsa': { + parts: ['n', 'e', 'd', 'iqmp', 'p', 'q'] + }, + 'ecdsa': { + parts: ['curve', 'Q', 'd'] + }, + 'ed25519': { + parts: ['A', 'k'] + } +}; +algPrivInfo['curve25519'] = algPrivInfo['ed25519']; + +var hashAlgs = { + 'md5': true, + 'sha1': true, + 'sha256': true, + 'sha384': true, + 'sha512': true +}; + +/* + * Taken from + * http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf + */ +var curves = { + 'nistp256': { + size: 256, + pkcs8oid: '1.2.840.10045.3.1.7', + p: Buffer.from(('00' + + 'ffffffff 00000001 00000000 00000000' + + '00000000 ffffffff ffffffff ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF 00000001 00000000 00000000' + + '00000000 FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + '5ac635d8 aa3a93e7 b3ebbd55 769886bc' + + '651d06b0 cc53b0f6 3bce3c3e 27d2604b'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'c49d3608 86e70493 6a6678e1 139d26b7' + + '819f7e90'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff 00000000 ffffffff ffffffff' + + 'bce6faad a7179e84 f3b9cac2 fc632551'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '6b17d1f2 e12c4247 f8bce6e5 63a440f2' + + '77037d81 2deb33a0 f4a13945 d898c296' + + '4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16' + + '2bce3357 6b315ece cbb64068 37bf51f5'). + replace(/ /g, ''), 'hex') + }, + 'nistp384': { + size: 384, + pkcs8oid: '1.3.132.0.34', + p: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffe' + + 'ffffffff 00000000 00000000 ffffffff'). + replace(/ /g, ''), 'hex'), + a: Buffer.from(('00' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFE' + + 'FFFFFFFF 00000000 00000000 FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(( + 'b3312fa7 e23ee7e4 988e056b e3f82d19' + + '181d9c6e fe814112 0314088f 5013875a' + + 'c656398d 8a2ed19d 2a85c8ed d3ec2aef'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'a335926a a319a27a 1d00896a 6773a482' + + '7acdac73'). + replace(/ /g, ''), 'hex'), + n: Buffer.from(('00' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff c7634d81 f4372ddf' + + '581a0db2 48b0a77a ecec196a ccc52973'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + 'aa87ca22 be8b0537 8eb1c71e f320ad74' + + '6e1d3b62 8ba79b98 59f741e0 82542a38' + + '5502f25d bf55296c 3a545e38 72760ab7' + + '3617de4a 96262c6f 5d9e98bf 9292dc29' + + 'f8f41dbd 289a147c e9da3113 b5f0b8c0' + + '0a60b1ce 1d7e819d 7a431d7c 90ea0e5f'). + replace(/ /g, ''), 'hex') + }, + 'nistp521': { + size: 521, + pkcs8oid: '1.3.132.0.35', + p: Buffer.from(( + '01ffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffff').replace(/ /g, ''), 'hex'), + a: Buffer.from(('01FF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF' + + 'FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFC'). + replace(/ /g, ''), 'hex'), + b: Buffer.from(('51' + + '953eb961 8e1c9a1f 929a21a0 b68540ee' + + 'a2da725b 99b315f3 b8b48991 8ef109e1' + + '56193951 ec7e937b 1652c0bd 3bb1bf07' + + '3573df88 3d2c34f1 ef451fd4 6b503f00'). + replace(/ /g, ''), 'hex'), + s: Buffer.from(('00' + + 'd09e8800 291cb853 96cc6717 393284aa' + + 'a0da64ba').replace(/ /g, ''), 'hex'), + n: Buffer.from(('01ff' + + 'ffffffff ffffffff ffffffff ffffffff' + + 'ffffffff ffffffff ffffffff fffffffa' + + '51868783 bf2f966b 7fcc0148 f709a5d0' + + '3bb5c9b8 899c47ae bb6fb71e 91386409'). + replace(/ /g, ''), 'hex'), + G: Buffer.from(('04' + + '00c6 858e06b7 0404e9cd 9e3ecb66 2395b442' + + '9c648139 053fb521 f828af60 6b4d3dba' + + 'a14b5e77 efe75928 fe1dc127 a2ffa8de' + + '3348b3c1 856a429b f97e7e31 c2e5bd66' + + '0118 39296a78 9a3bc004 5c8a5fb4 2c7d1bd9' + + '98f54449 579b4468 17afbd17 273e662c' + + '97ee7299 5ef42640 c550b901 3fad0761' + + '353c7086 a272c240 88be9476 9fd16650'). + replace(/ /g, ''), 'hex') + } +}; + +module.exports = { + info: algInfo, + privInfo: algPrivInfo, + hashAlgs: hashAlgs, + curves: curves +}; + + +/***/ }), +/* 33 */ +/***/ (function(module, exports, __webpack_require__) { + +// Copyright 2017 Joyent, Inc. + +module.exports = PrivateKey; + +var assert = __webpack_require__(16); +var Buffer = __webpack_require__(15).Buffer; +var algs = __webpack_require__(32); +var crypto = __webpack_require__(11); +var Fingerprint = __webpack_require__(157); +var Signature = __webpack_require__(75); +var errs = __webpack_require__(74); +var util = __webpack_require__(3); +var utils = __webpack_require__(26); +var dhe = __webpack_require__(326); +var generateECDSA = dhe.generateECDSA; +var generateED25519 = dhe.generateED25519; +var edCompat; +var nacl; + +try { + edCompat = __webpack_require__(454); +} catch (e) { + /* Just continue through, and bail out if we try to use it. */ +} + +var Key = __webpack_require__(28); + +var InvalidAlgorithmError = errs.InvalidAlgorithmError; +var KeyParseError = errs.KeyParseError; +var KeyEncryptedError = errs.KeyEncryptedError; + +var formats = {}; +formats['auto'] = __webpack_require__(455); +formats['pem'] = __webpack_require__(86); +formats['pkcs1'] = __webpack_require__(328); +formats['pkcs8'] = __webpack_require__(158); +formats['rfc4253'] = __webpack_require__(103); +formats['ssh-private'] = __webpack_require__(193); +formats['openssh'] = formats['ssh-private']; +formats['ssh'] = formats['ssh-private']; +formats['dnssec'] = __webpack_require__(327); + +function PrivateKey(opts) { + assert.object(opts, 'options'); + Key.call(this, opts); + + this._pubCache = undefined; +} +util.inherits(PrivateKey, Key); + +PrivateKey.formats = formats; + +PrivateKey.prototype.toBuffer = function (format, options) { + if (format === undefined) + format = 'pkcs1'; + assert.string(format, 'format'); + assert.object(formats[format], 'formats[format]'); + assert.optionalObject(options, 'options'); + + return (formats[format].write(this, options)); +}; + +PrivateKey.prototype.hash = function (algo) { + return (this.toPublic().hash(algo)); +}; + +PrivateKey.prototype.toPublic = function () { + if (this._pubCache) + return (this._pubCache); + + var algInfo = algs.info[this.type]; + var pubParts = []; + for (var i = 0; i < algInfo.parts.length; ++i) { + var p = algInfo.parts[i]; + pubParts.push(this.part[p]); + } + + this._pubCache = new Key({ + type: this.type, + source: this, + parts: pubParts + }); + if (this.comment) + this._pubCache.comment = this.comment; + return (this._pubCache); +}; + +PrivateKey.prototype.derive = function (newType) { + assert.string(newType, 'type'); + var priv, pub, pair; + + if (this.type === 'ed25519' && newType === 'curve25519') { + if (nacl === undefined) + nacl = __webpack_require__(76); + + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.box.keyPair.fromSecretKey(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'curve25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } else if (this.type === 'curve25519' && newType === 'ed25519') { + if (nacl === undefined) + nacl = __webpack_require__(76); + + priv = this.part.k.data; + if (priv[0] === 0x00) + priv = priv.slice(1); + + pair = nacl.sign.keyPair.fromSeed(new Uint8Array(priv)); + pub = Buffer.from(pair.publicKey); + + return (new PrivateKey({ + type: 'ed25519', + parts: [ + { name: 'A', data: utils.mpNormalize(pub) }, + { name: 'k', data: utils.mpNormalize(priv) } + ] + })); + } + throw (new Error('Key derivation not supported from ' + this.type + + ' to ' + newType)); +}; + +PrivateKey.prototype.createVerify = function (hashAlgo) { + return (this.toPublic().createVerify(hashAlgo)); +}; + +PrivateKey.prototype.createSign = function (hashAlgo) { + if (hashAlgo === undefined) + hashAlgo = this.defaultHashAlgorithm(); + assert.string(hashAlgo, 'hash algorithm'); + + /* ED25519 is not supported by OpenSSL, use a javascript impl. */ + if (this.type === 'ed25519' && edCompat !== undefined) + return (new edCompat.Signer(this, hashAlgo)); + if (this.type === 'curve25519') + throw (new Error('Curve25519 keys are not suitable for ' + + 'signing or verification')); + + var v, nm, err; + try { + nm = hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } catch (e) { + err = e; + } + if (v === undefined || (err instanceof Error && + err.message.match(/Unknown message digest/))) { + nm = 'RSA-'; + nm += hashAlgo.toUpperCase(); + v = crypto.createSign(nm); + } + assert.ok(v, 'failed to create verifier'); + var oldSign = v.sign.bind(v); + var key = this.toBuffer('pkcs1'); + var type = this.type; + var curve = this.curve; + v.sign = function () { + var sig = oldSign(key); + if (typeof (sig) === 'string') + sig = Buffer.from(sig, 'binary'); + sig = Signature.parse(sig, type, 'asn1'); + sig.hashAlgorithm = hashAlgo; + sig.curve = curve; + return (sig); + }; + return (v); +}; + +PrivateKey.parse = function (data, format, options) { + if (typeof (data) !== 'string') + assert.buffer(data, 'data'); + if (format === undefined) + format = 'auto'; + assert.string(format, 'format'); + if (typeof (options) === 'string') + options = { filename: options }; + assert.optionalObject(options, 'options'); + if (options === undefined) + options = {}; + assert.optionalString(options.filename, 'options.filename'); + if (options.filename === undefined) + options.filename = '(unnamed)'; + + assert.object(formats[format], 'formats[format]'); + + try { + var k = formats[format].read(data, options); + assert.ok(k instanceof PrivateKey, 'key is not a private key'); + if (!k.comment) + k.comment = options.filename; + return (k); + } catch (e) { + if (e.name === 'KeyEncryptedError') + throw (e); + throw (new KeyParseError(options.filename, format, e)); + } +}; + +PrivateKey.isPrivateKey = function (obj, ver) { + return (utils.isCompatible(obj, PrivateKey, ver)); +}; + +PrivateKey.generate = function (type, options) { + if (options === undefined) + options = {}; + assert.object(options, 'options'); + + switch (type) { + case 'ecdsa': + if (options.curve === undefined) + options.curve = 'nistp256'; + assert.string(options.curve, 'options.curve'); + return (generateECDSA(options.curve)); + case 'ed25519': + return (generateED25519()); + default: + throw (new Error('Key generation not supported with key ' + + 'type "' + type + '"')); + } +}; + +/* + * API versions for PrivateKey: + * [1,0] -- initial ver + * [1,1] -- added auto, pkcs[18], openssh/ssh-private formats + * [1,2] -- added defaultHashAlgorithm + * [1,3] -- added derive, ed, createDH + * [1,4] -- first tagged version + * [1,5] -- changed ed25519 part names and format + */ +PrivateKey.prototype._sshpkApiVersion = [1, 5]; + +PrivateKey._oldVersionDetect = function (obj) { + assert.func(obj.toPublic); + assert.func(obj.createSign); + if (obj.derive) + return ([1, 3]); + if (obj.defaultHashAlgorithm) + return ([1, 2]); + if (obj.formats['auto']) + return ([1, 1]); + return ([1, 0]); +}; + + +/***/ }), +/* 34 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.wrapLifecycle = exports.run = exports.install = exports.Install = undefined; + +var _extends2; + +function _load_extends() { + return _extends2 = _interopRequireDefault(__webpack_require__(20)); +} + +var _asyncToGenerator2; + +function _load_asyncToGenerator() { + return _asyncToGenerator2 = _interopRequireDefault(__webpack_require__(2)); +} + +let install = exports.install = (() => { + var _ref29 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, lockfile) { + yield wrapLifecycle(config, flags, (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const install = new Install(flags, config, reporter, lockfile); + yield install.init(); + })); + }); + + return function install(_x7, _x8, _x9, _x10) { + return _ref29.apply(this, arguments); + }; +})(); + +let run = exports.run = (() => { + var _ref31 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, reporter, flags, args) { + let lockfile; + let error = 'installCommandRenamed'; + if (flags.lockfile === false) { + lockfile = new (_lockfile || _load_lockfile()).default(); + } else { + lockfile = yield (_lockfile || _load_lockfile()).default.fromDirectory(config.lockfileFolder, reporter); + } + + if (args.length) { + const exampleArgs = args.slice(); + + if (flags.saveDev) { + exampleArgs.push('--dev'); + } + if (flags.savePeer) { + exampleArgs.push('--peer'); + } + if (flags.saveOptional) { + exampleArgs.push('--optional'); + } + if (flags.saveExact) { + exampleArgs.push('--exact'); + } + if (flags.saveTilde) { + exampleArgs.push('--tilde'); + } + let command = 'add'; + if (flags.global) { + error = 'globalFlagRemoved'; + command = 'global add'; + } + throw new (_errors || _load_errors()).MessageError(reporter.lang(error, `yarn ${command} ${exampleArgs.join(' ')}`)); + } + + yield install(config, reporter, flags, lockfile); + }); + + return function run(_x11, _x12, _x13, _x14) { + return _ref31.apply(this, arguments); + }; +})(); + +let wrapLifecycle = exports.wrapLifecycle = (() => { + var _ref32 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (config, flags, factory) { + yield config.executeLifecycleScript('preinstall'); + + yield factory(); + + // npm behaviour, seems kinda funky but yay compatibility + yield config.executeLifecycleScript('install'); + yield config.executeLifecycleScript('postinstall'); + + if (!config.production) { + if (!config.disablePrepublish) { + yield config.executeLifecycleScript('prepublish'); + } + yield config.executeLifecycleScript('prepare'); + } + }); + + return function wrapLifecycle(_x15, _x16, _x17) { + return _ref32.apply(this, arguments); + }; +})(); + +exports.hasWrapper = hasWrapper; +exports.setFlags = setFlags; + +var _objectPath; + +function _load_objectPath() { + return _objectPath = _interopRequireDefault(__webpack_require__(304)); +} + +var _hooks; + +function _load_hooks() { + return _hooks = __webpack_require__(368); +} + +var _index; + +function _load_index() { + return _index = _interopRequireDefault(__webpack_require__(218)); +} + +var _errors; + +function _load_errors() { + return _errors = __webpack_require__(6); +} + +var _integrityChecker; + +function _load_integrityChecker() { + return _integrityChecker = _interopRequireDefault(__webpack_require__(206)); +} + +var _lockfile; + +function _load_lockfile() { + return _lockfile = _interopRequireDefault(__webpack_require__(19)); +} + +var _lockfile2; + +function _load_lockfile2() { + return _lockfile2 = __webpack_require__(19); +} + +var _packageFetcher; + +function _load_packageFetcher() { + return _packageFetcher = _interopRequireWildcard(__webpack_require__(208)); +} + +var _packageInstallScripts; + +function _load_packageInstallScripts() { + return _packageInstallScripts = _interopRequireDefault(__webpack_require__(525)); +} + +var _packageCompatibility; + +function _load_packageCompatibility() { + return _packageCompatibility = _interopRequireWildcard(__webpack_require__(207)); +} + +var _packageResolver; + +function _load_packageResolver() { + return _packageResolver = _interopRequireDefault(__webpack_require__(360)); +} + +var _packageLinker; + +function _load_packageLinker() { + return _packageLinker = _interopRequireDefault(__webpack_require__(209)); +} + +var _index2; + +function _load_index2() { + return _index2 = __webpack_require__(58); +} + +var _index3; + +function _load_index3() { + return _index3 = __webpack_require__(78); +} + +var _autoclean; + +function _load_autoclean() { + return _autoclean = __webpack_require__(348); +} + +var _constants; + +function _load_constants() { + return _constants = _interopRequireWildcard(__webpack_require__(8)); +} + +var _normalizePattern; + +function _load_normalizePattern() { + return _normalizePattern = __webpack_require__(37); +} + +var _fs; + +function _load_fs() { + return _fs = _interopRequireWildcard(__webpack_require__(5)); +} + +var _map; + +function _load_map() { + return _map = _interopRequireDefault(__webpack_require__(30)); +} + +var _yarnVersion; + +function _load_yarnVersion() { + return _yarnVersion = __webpack_require__(105); +} + +var _generatePnpMap; + +function _load_generatePnpMap() { + return _generatePnpMap = __webpack_require__(547); +} + +var _workspaceLayout; + +function _load_workspaceLayout() { + return _workspaceLayout = _interopRequireDefault(__webpack_require__(90)); +} + +var _resolutionMap; + +function _load_resolutionMap() { + return _resolutionMap = _interopRequireDefault(__webpack_require__(212)); +} + +var _guessName; + +function _load_guessName() { + return _guessName = _interopRequireDefault(__webpack_require__(169)); +} + +var _audit; + +function _load_audit() { + return _audit = _interopRequireDefault(__webpack_require__(347)); +} + +function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const deepEqual = __webpack_require__(599); + +const emoji = __webpack_require__(302); +const invariant = __webpack_require__(9); +const path = __webpack_require__(0); +const semver = __webpack_require__(22); +const uuid = __webpack_require__(120); +const ssri = __webpack_require__(65); + +const ONE_DAY = 1000 * 60 * 60 * 24; + +/** + * Try and detect the installation method for Yarn and provide a command to update it with. + */ + +function getUpdateCommand(installationMethod) { + if (installationMethod === 'tar') { + return `curl --compressed -o- -L ${(_constants || _load_constants()).YARN_INSTALLER_SH} | bash`; + } + + if (installationMethod === 'homebrew') { + return 'brew upgrade yarn'; + } + + if (installationMethod === 'deb') { + return 'sudo apt-get update && sudo apt-get install yarn'; + } + + if (installationMethod === 'rpm') { + return 'sudo yum install yarn'; + } + + if (installationMethod === 'npm') { + return 'npm install --global yarn'; + } + + if (installationMethod === 'chocolatey') { + return 'choco upgrade yarn'; + } + + if (installationMethod === 'apk') { + return 'apk update && apk add -u yarn'; + } + + if (installationMethod === 'portage') { + return 'sudo emerge --sync && sudo emerge -au sys-apps/yarn'; + } + + return null; +} + +function getUpdateInstaller(installationMethod) { + // Windows + if (installationMethod === 'msi') { + return (_constants || _load_constants()).YARN_INSTALLER_MSI; + } + + return null; +} + +function normalizeFlags(config, rawFlags) { + const flags = { + // install + har: !!rawFlags.har, + ignorePlatform: !!rawFlags.ignorePlatform, + ignoreEngines: !!rawFlags.ignoreEngines, + ignoreScripts: !!rawFlags.ignoreScripts, + ignoreOptional: !!rawFlags.ignoreOptional, + force: !!rawFlags.force, + flat: !!rawFlags.flat, + lockfile: rawFlags.lockfile !== false, + pureLockfile: !!rawFlags.pureLockfile, + updateChecksums: !!rawFlags.updateChecksums, + skipIntegrityCheck: !!rawFlags.skipIntegrityCheck, + frozenLockfile: !!rawFlags.frozenLockfile, + linkDuplicates: !!rawFlags.linkDuplicates, + checkFiles: !!rawFlags.checkFiles, + audit: !!rawFlags.audit, + + // add + peer: !!rawFlags.peer, + dev: !!rawFlags.dev, + optional: !!rawFlags.optional, + exact: !!rawFlags.exact, + tilde: !!rawFlags.tilde, + ignoreWorkspaceRootCheck: !!rawFlags.ignoreWorkspaceRootCheck, + + // outdated, update-interactive + includeWorkspaceDeps: !!rawFlags.includeWorkspaceDeps, + + // add, remove, update + workspaceRootIsCwd: rawFlags.workspaceRootIsCwd !== false + }; + + if (config.getOption('ignore-scripts')) { + flags.ignoreScripts = true; + } + + if (config.getOption('ignore-platform')) { + flags.ignorePlatform = true; + } + + if (config.getOption('ignore-engines')) { + flags.ignoreEngines = true; + } + + if (config.getOption('ignore-optional')) { + flags.ignoreOptional = true; + } + + if (config.getOption('force')) { + flags.force = true; + } + + return flags; +} + +class Install { + constructor(flags, config, reporter, lockfile) { + this.rootManifestRegistries = []; + this.rootPatternsToOrigin = (0, (_map || _load_map()).default)(); + this.lockfile = lockfile; + this.reporter = reporter; + this.config = config; + this.flags = normalizeFlags(config, flags); + this.resolutions = (0, (_map || _load_map()).default)(); // Legacy resolutions field used for flat install mode + this.resolutionMap = new (_resolutionMap || _load_resolutionMap()).default(config); // Selective resolutions for nested dependencies + this.resolver = new (_packageResolver || _load_packageResolver()).default(config, lockfile, this.resolutionMap); + this.integrityChecker = new (_integrityChecker || _load_integrityChecker()).default(config); + this.linker = new (_packageLinker || _load_packageLinker()).default(config, this.resolver); + this.scripts = new (_packageInstallScripts || _load_packageInstallScripts()).default(config, this.resolver, this.flags.force); + } + + /** + * Create a list of dependency requests from the current directories manifests. + */ + + fetchRequestFromCwd(excludePatterns = [], ignoreUnusedPatterns = false) { + var _this = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const patterns = []; + const deps = []; + let resolutionDeps = []; + const manifest = {}; + + const ignorePatterns = []; + const usedPatterns = []; + let workspaceLayout; + + // some commands should always run in the context of the entire workspace + const cwd = _this.flags.includeWorkspaceDeps || _this.flags.workspaceRootIsCwd ? _this.config.lockfileFolder : _this.config.cwd; + + // non-workspaces are always root, otherwise check for workspace root + const cwdIsRoot = !_this.config.workspaceRootFolder || _this.config.lockfileFolder === cwd; + + // exclude package names that are in install args + const excludeNames = []; + for (var _iterator = excludePatterns, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { + var _ref; + + if (_isArray) { + if (_i >= _iterator.length) break; + _ref = _iterator[_i++]; + } else { + _i = _iterator.next(); + if (_i.done) break; + _ref = _i.value; + } + + const pattern = _ref; + + if ((0, (_index3 || _load_index3()).getExoticResolver)(pattern)) { + excludeNames.push((0, (_guessName || _load_guessName()).default)(pattern)); + } else { + // extract the name + const parts = (0, (_normalizePattern || _load_normalizePattern()).normalizePattern)(pattern); + excludeNames.push(parts.name); + } + } + + const stripExcluded = function stripExcluded(manifest) { + for (var _iterator2 = excludeNames, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { + var _ref2; + + if (_isArray2) { + if (_i2 >= _iterator2.length) break; + _ref2 = _iterator2[_i2++]; + } else { + _i2 = _iterator2.next(); + if (_i2.done) break; + _ref2 = _i2.value; + } + + const exclude = _ref2; + + if (manifest.dependencies && manifest.dependencies[exclude]) { + delete manifest.dependencies[exclude]; + } + if (manifest.devDependencies && manifest.devDependencies[exclude]) { + delete manifest.devDependencies[exclude]; + } + if (manifest.optionalDependencies && manifest.optionalDependencies[exclude]) { + delete manifest.optionalDependencies[exclude]; + } + } + }; + + for (var _iterator3 = Object.keys((_index2 || _load_index2()).registries), _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { + var _ref3; + + if (_isArray3) { + if (_i3 >= _iterator3.length) break; + _ref3 = _iterator3[_i3++]; + } else { + _i3 = _iterator3.next(); + if (_i3.done) break; + _ref3 = _i3.value; + } + + const registry = _ref3; + + const filename = (_index2 || _load_index2()).registries[registry].filename; + + const loc = path.join(cwd, filename); + if (!(yield (_fs || _load_fs()).exists(loc))) { + continue; + } + + _this.rootManifestRegistries.push(registry); + + const projectManifestJson = yield _this.config.readJson(loc); + yield (0, (_index || _load_index()).default)(projectManifestJson, cwd, _this.config, cwdIsRoot); + + Object.assign(_this.resolutions, projectManifestJson.resolutions); + Object.assign(manifest, projectManifestJson); + + _this.resolutionMap.init(_this.resolutions); + for (var _iterator4 = Object.keys(_this.resolutionMap.resolutionsByPackage), _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { + var _ref4; + + if (_isArray4) { + if (_i4 >= _iterator4.length) break; + _ref4 = _iterator4[_i4++]; + } else { + _i4 = _iterator4.next(); + if (_i4.done) break; + _ref4 = _i4.value; + } + + const packageName = _ref4; + + const optional = (_objectPath || _load_objectPath()).default.has(manifest.optionalDependencies, packageName) && _this.flags.ignoreOptional; + for (var _iterator8 = _this.resolutionMap.resolutionsByPackage[packageName], _isArray8 = Array.isArray(_iterator8), _i8 = 0, _iterator8 = _isArray8 ? _iterator8 : _iterator8[Symbol.iterator]();;) { + var _ref9; + + if (_isArray8) { + if (_i8 >= _iterator8.length) break; + _ref9 = _iterator8[_i8++]; + } else { + _i8 = _iterator8.next(); + if (_i8.done) break; + _ref9 = _i8.value; + } + + const _ref8 = _ref9; + const pattern = _ref8.pattern; + + resolutionDeps = [...resolutionDeps, { registry, pattern, optional, hint: 'resolution' }]; + } + } + + const pushDeps = function pushDeps(depType, manifest, { hint, optional }, isUsed) { + if (ignoreUnusedPatterns && !isUsed) { + return; + } + // We only take unused dependencies into consideration to get deterministic hoisting. + // Since flat mode doesn't care about hoisting and everything is top level and specified then we can safely + // leave these out. + if (_this.flags.flat && !isUsed) { + return; + } + const depMap = manifest[depType]; + for (const name in depMap) { + if (excludeNames.indexOf(name) >= 0) { + continue; + } + + let pattern = name; + if (!_this.lockfile.getLocked(pattern)) { + // when we use --save we save the dependency to the lockfile with just the name rather than the + // version combo + pattern += '@' + depMap[name]; + } + + // normalization made sure packages are mentioned only once + if (isUsed) { + usedPatterns.push(pattern); + } else { + ignorePatterns.push(pattern); + } + + _this.rootPatternsToOrigin[pattern] = depType; + patterns.push(pattern); + deps.push({ pattern, registry, hint, optional, workspaceName: manifest.name, workspaceLoc: manifest._loc }); + } + }; + + if (cwdIsRoot) { + pushDeps('dependencies', projectManifestJson, { hint: null, optional: false }, true); + pushDeps('devDependencies', projectManifestJson, { hint: 'dev', optional: false }, !_this.config.production); + pushDeps('optionalDependencies', projectManifestJson, { hint: 'optional', optional: true }, true); + } + + if (_this.config.workspaceRootFolder) { + const workspaceLoc = cwdIsRoot ? loc : path.join(_this.config.lockfileFolder, filename); + const workspacesRoot = path.dirname(workspaceLoc); + + let workspaceManifestJson = projectManifestJson; + if (!cwdIsRoot) { + // the manifest we read before was a child workspace, so get the root + workspaceManifestJson = yield _this.config.readJson(workspaceLoc); + yield (0, (_index || _load_index()).default)(workspaceManifestJson, workspacesRoot, _this.config, true); + } + + const workspaces = yield _this.config.resolveWorkspaces(workspacesRoot, workspaceManifestJson); + workspaceLayout = new (_workspaceLayout || _load_workspaceLayout()).default(workspaces, _this.config); + + // add virtual manifest that depends on all workspaces, this way package hoisters and resolvers will work fine + const workspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.dependencies); + for (var _iterator5 = Object.keys(workspaces), _isArray5 = Array.isArray(_iterator5), _i5 = 0, _iterator5 = _isArray5 ? _iterator5 : _iterator5[Symbol.iterator]();;) { + var _ref5; + + if (_isArray5) { + if (_i5 >= _iterator5.length) break; + _ref5 = _iterator5[_i5++]; + } else { + _i5 = _iterator5.next(); + if (_i5.done) break; + _ref5 = _i5.value; + } + + const workspaceName = _ref5; + + const workspaceManifest = workspaces[workspaceName].manifest; + workspaceDependencies[workspaceName] = workspaceManifest.version; + + // include dependencies from all workspaces + if (_this.flags.includeWorkspaceDeps) { + pushDeps('dependencies', workspaceManifest, { hint: null, optional: false }, true); + pushDeps('devDependencies', workspaceManifest, { hint: 'dev', optional: false }, !_this.config.production); + pushDeps('optionalDependencies', workspaceManifest, { hint: 'optional', optional: true }, true); + } + } + const virtualDependencyManifest = { + _uid: '', + name: `workspace-aggregator-${uuid.v4()}`, + version: '1.0.0', + _registry: 'npm', + _loc: workspacesRoot, + dependencies: workspaceDependencies, + devDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.devDependencies), + optionalDependencies: (0, (_extends2 || _load_extends()).default)({}, workspaceManifestJson.optionalDependencies), + private: workspaceManifestJson.private, + workspaces: workspaceManifestJson.workspaces + }; + workspaceLayout.virtualManifestName = virtualDependencyManifest.name; + const virtualDep = {}; + virtualDep[virtualDependencyManifest.name] = virtualDependencyManifest.version; + workspaces[virtualDependencyManifest.name] = { loc: workspacesRoot, manifest: virtualDependencyManifest }; + + // ensure dependencies that should be excluded are stripped from the correct manifest + stripExcluded(cwdIsRoot ? virtualDependencyManifest : workspaces[projectManifestJson.name].manifest); + + pushDeps('workspaces', { workspaces: virtualDep }, { hint: 'workspaces', optional: false }, true); + + const implicitWorkspaceDependencies = (0, (_extends2 || _load_extends()).default)({}, workspaceDependencies); + + for (var _iterator6 = (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES, _isArray6 = Array.isArray(_iterator6), _i6 = 0, _iterator6 = _isArray6 ? _iterator6 : _iterator6[Symbol.iterator]();;) { + var _ref6; + + if (_isArray6) { + if (_i6 >= _iterator6.length) break; + _ref6 = _iterator6[_i6++]; + } else { + _i6 = _iterator6.next(); + if (_i6.done) break; + _ref6 = _i6.value; + } + + const type = _ref6; + + for (var _iterator7 = Object.keys(projectManifestJson[type] || {}), _isArray7 = Array.isArray(_iterator7), _i7 = 0, _iterator7 = _isArray7 ? _iterator7 : _iterator7[Symbol.iterator]();;) { + var _ref7; + + if (_isArray7) { + if (_i7 >= _iterator7.length) break; + _ref7 = _iterator7[_i7++]; + } else { + _i7 = _iterator7.next(); + if (_i7.done) break; + _ref7 = _i7.value; + } + + const dependencyName = _ref7; + + delete implicitWorkspaceDependencies[dependencyName]; + } + } + + pushDeps('dependencies', { dependencies: implicitWorkspaceDependencies }, { hint: 'workspaces', optional: false }, true); + } + + break; + } + + // inherit root flat flag + if (manifest.flat) { + _this.flags.flat = true; + } + + return { + requests: [...resolutionDeps, ...deps], + patterns, + manifest, + usedPatterns, + ignorePatterns, + workspaceLayout + }; + })(); + } + + /** + * TODO description + */ + + prepareRequests(requests) { + return requests; + } + + preparePatterns(patterns) { + return patterns; + } + preparePatternsForLinking(patterns, cwdManifest, cwdIsRoot) { + return patterns; + } + + prepareManifests() { + var _this2 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const manifests = yield _this2.config.getRootManifests(); + return manifests; + })(); + } + + bailout(patterns, workspaceLayout) { + var _this3 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // We don't want to skip the audit - it could yield important errors + if (_this3.flags.audit) { + return false; + } + // PNP is so fast that the integrity check isn't pertinent + if (_this3.config.plugnplayEnabled) { + return false; + } + if (_this3.flags.skipIntegrityCheck || _this3.flags.force) { + return false; + } + const lockfileCache = _this3.lockfile.cache; + if (!lockfileCache) { + return false; + } + const lockfileClean = _this3.lockfile.parseResultType === 'success'; + const match = yield _this3.integrityChecker.check(patterns, lockfileCache, _this3.flags, workspaceLayout); + if (_this3.flags.frozenLockfile && (!lockfileClean || match.missingPatterns.length > 0)) { + throw new (_errors || _load_errors()).MessageError(_this3.reporter.lang('frozenLockfileError')); + } + + const haveLockfile = yield (_fs || _load_fs()).exists(path.join(_this3.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME)); + + const lockfileIntegrityPresent = !_this3.lockfile.hasEntriesExistWithoutIntegrity(); + const integrityBailout = lockfileIntegrityPresent || !_this3.config.autoAddIntegrity; + + if (match.integrityMatches && haveLockfile && lockfileClean && integrityBailout) { + _this3.reporter.success(_this3.reporter.lang('upToDate')); + return true; + } + + if (match.integrityFileMissing && haveLockfile) { + // Integrity file missing, force script installations + _this3.scripts.setForce(true); + return false; + } + + if (match.hardRefreshRequired) { + // e.g. node version doesn't match, force script installations + _this3.scripts.setForce(true); + return false; + } + + if (!patterns.length && !match.integrityFileMissing) { + _this3.reporter.success(_this3.reporter.lang('nothingToInstall')); + yield _this3.createEmptyManifestFolders(); + yield _this3.saveLockfileAndIntegrity(patterns, workspaceLayout); + return true; + } + + return false; + })(); + } + + /** + * Produce empty folders for all used root manifests. + */ + + createEmptyManifestFolders() { + var _this4 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + if (_this4.config.modulesFolder) { + // already created + return; + } + + for (var _iterator9 = _this4.rootManifestRegistries, _isArray9 = Array.isArray(_iterator9), _i9 = 0, _iterator9 = _isArray9 ? _iterator9 : _iterator9[Symbol.iterator]();;) { + var _ref10; + + if (_isArray9) { + if (_i9 >= _iterator9.length) break; + _ref10 = _iterator9[_i9++]; + } else { + _i9 = _iterator9.next(); + if (_i9.done) break; + _ref10 = _i9.value; + } + + const registryName = _ref10; + const folder = _this4.config.registries[registryName].folder; + + yield (_fs || _load_fs()).mkdirp(path.join(_this4.config.lockfileFolder, folder)); + } + })(); + } + + /** + * TODO description + */ + + markIgnored(patterns) { + for (var _iterator10 = patterns, _isArray10 = Array.isArray(_iterator10), _i10 = 0, _iterator10 = _isArray10 ? _iterator10 : _iterator10[Symbol.iterator]();;) { + var _ref11; + + if (_isArray10) { + if (_i10 >= _iterator10.length) break; + _ref11 = _iterator10[_i10++]; + } else { + _i10 = _iterator10.next(); + if (_i10.done) break; + _ref11 = _i10.value; + } + + const pattern = _ref11; + + const manifest = this.resolver.getStrictResolvedPattern(pattern); + const ref = manifest._reference; + invariant(ref, 'expected package reference'); + + // just mark the package as ignored. if the package is used by a required package, the hoister + // will take care of that. + ref.ignore = true; + } + } + + /** + * helper method that gets only recent manifests + * used by global.ls command + */ + getFlattenedDeps() { + var _this5 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + var _ref12 = yield _this5.fetchRequestFromCwd(); + + const depRequests = _ref12.requests, + rawPatterns = _ref12.patterns; + + + yield _this5.resolver.init(depRequests, {}); + + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this5.resolver.getManifests(), _this5.config); + _this5.resolver.updateManifests(manifests); + + return _this5.flatten(rawPatterns); + })(); + } + + /** + * TODO description + */ + + init() { + var _this6 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.checkUpdate(); + + // warn if we have a shrinkwrap + if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_SHRINKWRAP_FILENAME))) { + _this6.reporter.warn(_this6.reporter.lang('shrinkwrapWarning')); + } + + // warn if we have an npm lockfile + if (yield (_fs || _load_fs()).exists(path.join(_this6.config.lockfileFolder, (_constants || _load_constants()).NPM_LOCK_FILENAME))) { + _this6.reporter.warn(_this6.reporter.lang('npmLockfileWarning')); + } + + if (_this6.config.plugnplayEnabled) { + _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L1')); + _this6.reporter.info(_this6.reporter.lang('plugnplaySuggestV2L2')); + } + + let flattenedTopLevelPatterns = []; + const steps = []; + + var _ref13 = yield _this6.fetchRequestFromCwd(); + + const depRequests = _ref13.requests, + rawPatterns = _ref13.patterns, + ignorePatterns = _ref13.ignorePatterns, + workspaceLayout = _ref13.workspaceLayout, + manifest = _ref13.manifest; + + let topLevelPatterns = []; + + const artifacts = yield _this6.integrityChecker.getArtifacts(); + if (artifacts) { + _this6.linker.setArtifacts(artifacts); + _this6.scripts.setArtifacts(artifacts); + } + + if ((_packageCompatibility || _load_packageCompatibility()).shouldCheck(manifest, _this6.flags)) { + steps.push((() => { + var _ref14 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + _this6.reporter.step(curr, total, _this6.reporter.lang('checkingManifest'), emoji.get('mag')); + yield _this6.checkCompatibility(); + }); + + return function (_x, _x2) { + return _ref14.apply(this, arguments); + }; + })()); + } + + const audit = new (_audit || _load_audit()).default(_this6.config, _this6.reporter, { groups: (_constants || _load_constants()).OWNED_DEPENDENCY_TYPES }); + let auditFoundProblems = false; + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('resolveStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.reporter.lang('resolvingPackages'), emoji.get('mag')); + yield _this6.resolver.init(_this6.prepareRequests(depRequests), { + isFlat: _this6.flags.flat, + isFrozen: _this6.flags.frozenLockfile, + workspaceLayout + }); + topLevelPatterns = _this6.preparePatterns(rawPatterns); + flattenedTopLevelPatterns = yield _this6.flatten(topLevelPatterns); + return { bailout: !_this6.flags.audit && (yield _this6.bailout(topLevelPatterns, workspaceLayout)) }; + })); + }); + + if (_this6.flags.audit) { + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('auditStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.reporter.lang('auditRunning'), emoji.get('mag')); + if (_this6.flags.offline) { + _this6.reporter.warn(_this6.reporter.lang('auditOffline')); + return { bailout: false }; + } + const preparedManifests = yield _this6.prepareManifests(); + // $FlowFixMe - Flow considers `m` in the map operation to be "mixed", so does not recognize `m.object` + const mergedManifest = Object.assign({}, ...Object.values(preparedManifests).map(function (m) { + return m.object; + })); + const auditVulnerabilityCounts = yield audit.performAudit(mergedManifest, _this6.lockfile, _this6.resolver, _this6.linker, topLevelPatterns); + auditFoundProblems = auditVulnerabilityCounts.info || auditVulnerabilityCounts.low || auditVulnerabilityCounts.moderate || auditVulnerabilityCounts.high || auditVulnerabilityCounts.critical; + return { bailout: yield _this6.bailout(topLevelPatterns, workspaceLayout) }; + })); + }); + } + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('fetchStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.markIgnored(ignorePatterns); + _this6.reporter.step(curr, total, _this6.reporter.lang('fetchingPackages'), emoji.get('truck')); + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this6.resolver.getManifests(), _this6.config); + _this6.resolver.updateManifests(manifests); + yield (_packageCompatibility || _load_packageCompatibility()).check(_this6.resolver.getManifests(), _this6.config, _this6.flags.ignoreEngines); + })); + }); + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('linkStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // remove integrity hash to make this operation atomic + yield _this6.integrityChecker.removeIntegrityFile(); + _this6.reporter.step(curr, total, _this6.reporter.lang('linkingDependencies'), emoji.get('link')); + flattenedTopLevelPatterns = _this6.preparePatternsForLinking(flattenedTopLevelPatterns, manifest, _this6.config.lockfileFolder === _this6.config.cwd); + yield _this6.linker.init(flattenedTopLevelPatterns, workspaceLayout, { + linkDuplicates: _this6.flags.linkDuplicates, + ignoreOptional: _this6.flags.ignoreOptional + }); + })); + }); + + if (_this6.config.plugnplayEnabled) { + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('pnpStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const pnpPath = `${_this6.config.lockfileFolder}/${(_constants || _load_constants()).PNP_FILENAME}`; + + const code = yield (0, (_generatePnpMap || _load_generatePnpMap()).generatePnpMap)(_this6.config, flattenedTopLevelPatterns, { + resolver: _this6.resolver, + reporter: _this6.reporter, + targetPath: pnpPath, + workspaceLayout + }); + + try { + const file = yield (_fs || _load_fs()).readFile(pnpPath); + if (file === code) { + return; + } + } catch (error) {} + + yield (_fs || _load_fs()).writeFile(pnpPath, code); + yield (_fs || _load_fs()).chmod(pnpPath, 0o755); + })); + }); + } + + steps.push(function (curr, total) { + return (0, (_hooks || _load_hooks()).callThroughHook)('buildStep', (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + _this6.reporter.step(curr, total, _this6.flags.force ? _this6.reporter.lang('rebuildingPackages') : _this6.reporter.lang('buildingFreshPackages'), emoji.get('hammer')); + + if (_this6.config.ignoreScripts) { + _this6.reporter.warn(_this6.reporter.lang('ignoredScripts')); + } else { + yield _this6.scripts.init(flattenedTopLevelPatterns); + } + })); + }); + + if (_this6.flags.har) { + steps.push((() => { + var _ref21 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + const formattedDate = new Date().toISOString().replace(/:/g, '-'); + const filename = `yarn-install_${formattedDate}.har`; + _this6.reporter.step(curr, total, _this6.reporter.lang('savingHar', filename), emoji.get('black_circle_for_record')); + yield _this6.config.requestManager.saveHar(filename); + }); + + return function (_x3, _x4) { + return _ref21.apply(this, arguments); + }; + })()); + } + + if (yield _this6.shouldClean()) { + steps.push((() => { + var _ref22 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (curr, total) { + _this6.reporter.step(curr, total, _this6.reporter.lang('cleaningModules'), emoji.get('recycle')); + yield (0, (_autoclean || _load_autoclean()).clean)(_this6.config, _this6.reporter); + }); + + return function (_x5, _x6) { + return _ref22.apply(this, arguments); + }; + })()); + } + + let currentStep = 0; + for (var _iterator11 = steps, _isArray11 = Array.isArray(_iterator11), _i11 = 0, _iterator11 = _isArray11 ? _iterator11 : _iterator11[Symbol.iterator]();;) { + var _ref23; + + if (_isArray11) { + if (_i11 >= _iterator11.length) break; + _ref23 = _iterator11[_i11++]; + } else { + _i11 = _iterator11.next(); + if (_i11.done) break; + _ref23 = _i11.value; + } + + const step = _ref23; + + const stepResult = yield step(++currentStep, steps.length); + if (stepResult && stepResult.bailout) { + if (_this6.flags.audit) { + audit.summary(); + } + if (auditFoundProblems) { + _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails')); + } + _this6.maybeOutputUpdate(); + return flattenedTopLevelPatterns; + } + } + + // fin! + if (_this6.flags.audit) { + audit.summary(); + } + if (auditFoundProblems) { + _this6.reporter.warn(_this6.reporter.lang('auditRunAuditForDetails')); + } + yield _this6.saveLockfileAndIntegrity(topLevelPatterns, workspaceLayout); + yield _this6.persistChanges(); + _this6.maybeOutputUpdate(); + _this6.config.requestManager.clearCache(); + return flattenedTopLevelPatterns; + })(); + } + + checkCompatibility() { + var _this7 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + var _ref24 = yield _this7.fetchRequestFromCwd(); + + const manifest = _ref24.manifest; + + yield (_packageCompatibility || _load_packageCompatibility()).checkOne(manifest, _this7.config, _this7.flags.ignoreEngines); + })(); + } + + persistChanges() { + var _this8 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + // get all the different registry manifests in this folder + const manifests = yield _this8.config.getRootManifests(); + + if (yield _this8.applyChanges(manifests)) { + yield _this8.config.saveRootManifests(manifests); + } + })(); + } + + applyChanges(manifests) { + let hasChanged = false; + + if (this.config.plugnplayPersist) { + const object = manifests.npm.object; + + + if (typeof object.installConfig !== 'object') { + object.installConfig = {}; + } + + if (this.config.plugnplayEnabled && object.installConfig.pnp !== true) { + object.installConfig.pnp = true; + hasChanged = true; + } else if (!this.config.plugnplayEnabled && typeof object.installConfig.pnp !== 'undefined') { + delete object.installConfig.pnp; + hasChanged = true; + } + + if (Object.keys(object.installConfig).length === 0) { + delete object.installConfig; + } + } + + return Promise.resolve(hasChanged); + } + + /** + * Check if we should run the cleaning step. + */ + + shouldClean() { + return (_fs || _load_fs()).exists(path.join(this.config.lockfileFolder, (_constants || _load_constants()).CLEAN_FILENAME)); + } + + /** + * TODO + */ + + flatten(patterns) { + var _this9 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + if (!_this9.flags.flat) { + return patterns; + } + + const flattenedPatterns = []; + + for (var _iterator12 = _this9.resolver.getAllDependencyNamesByLevelOrder(patterns), _isArray12 = Array.isArray(_iterator12), _i12 = 0, _iterator12 = _isArray12 ? _iterator12 : _iterator12[Symbol.iterator]();;) { + var _ref25; + + if (_isArray12) { + if (_i12 >= _iterator12.length) break; + _ref25 = _iterator12[_i12++]; + } else { + _i12 = _iterator12.next(); + if (_i12.done) break; + _ref25 = _i12.value; + } + + const name = _ref25; + + const infos = _this9.resolver.getAllInfoForPackageName(name).filter(function (manifest) { + const ref = manifest._reference; + invariant(ref, 'expected package reference'); + return !ref.ignore; + }); + + if (infos.length === 0) { + continue; + } + + if (infos.length === 1) { + // single version of this package + // take out a single pattern as multiple patterns may have resolved to this package + flattenedPatterns.push(_this9.resolver.patternsByPackage[name][0]); + continue; + } + + const options = infos.map(function (info) { + const ref = info._reference; + invariant(ref, 'expected reference'); + return { + // TODO `and is required by {PARENT}`, + name: _this9.reporter.lang('manualVersionResolutionOption', ref.patterns.join(', '), info.version), + + value: info.version + }; + }); + const versions = infos.map(function (info) { + return info.version; + }); + let version; + + const resolutionVersion = _this9.resolutions[name]; + if (resolutionVersion && versions.indexOf(resolutionVersion) >= 0) { + // use json `resolution` version + version = resolutionVersion; + } else { + version = yield _this9.reporter.select(_this9.reporter.lang('manualVersionResolution', name), _this9.reporter.lang('answer'), options); + _this9.resolutions[name] = version; + } + + flattenedPatterns.push(_this9.resolver.collapseAllVersionsOfPackage(name, version)); + } + + // save resolutions to their appropriate root manifest + if (Object.keys(_this9.resolutions).length) { + const manifests = yield _this9.config.getRootManifests(); + + for (const name in _this9.resolutions) { + const version = _this9.resolutions[name]; + + const patterns = _this9.resolver.patternsByPackage[name]; + if (!patterns) { + continue; + } + + let manifest; + for (var _iterator13 = patterns, _isArray13 = Array.isArray(_iterator13), _i13 = 0, _iterator13 = _isArray13 ? _iterator13 : _iterator13[Symbol.iterator]();;) { + var _ref26; + + if (_isArray13) { + if (_i13 >= _iterator13.length) break; + _ref26 = _iterator13[_i13++]; + } else { + _i13 = _iterator13.next(); + if (_i13.done) break; + _ref26 = _i13.value; + } + + const pattern = _ref26; + + manifest = _this9.resolver.getResolvedPattern(pattern); + if (manifest) { + break; + } + } + invariant(manifest, 'expected manifest'); + + const ref = manifest._reference; + invariant(ref, 'expected reference'); + + const object = manifests[ref.registry].object; + object.resolutions = object.resolutions || {}; + object.resolutions[name] = version; + } + + yield _this9.config.saveRootManifests(manifests); + } + + return flattenedPatterns; + })(); + } + + /** + * Remove offline tarballs that are no longer required + */ + + pruneOfflineMirror(lockfile) { + var _this10 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const mirror = _this10.config.getOfflineMirrorPath(); + if (!mirror) { + return; + } + + const requiredTarballs = new Set(); + for (const dependency in lockfile) { + const resolved = lockfile[dependency].resolved; + if (resolved) { + const basename = path.basename(resolved.split('#')[0]); + if (dependency[0] === '@' && basename[0] !== '@') { + requiredTarballs.add(`${dependency.split('/')[0]}-${basename}`); + } + requiredTarballs.add(basename); + } + } + + const mirrorFiles = yield (_fs || _load_fs()).walk(mirror); + for (var _iterator14 = mirrorFiles, _isArray14 = Array.isArray(_iterator14), _i14 = 0, _iterator14 = _isArray14 ? _iterator14 : _iterator14[Symbol.iterator]();;) { + var _ref27; + + if (_isArray14) { + if (_i14 >= _iterator14.length) break; + _ref27 = _iterator14[_i14++]; + } else { + _i14 = _iterator14.next(); + if (_i14.done) break; + _ref27 = _i14.value; + } + + const file = _ref27; + + const isTarball = path.extname(file.basename) === '.tgz'; + // if using experimental-pack-script-packages-in-mirror flag, don't unlink prebuilt packages + const hasPrebuiltPackage = file.relative.startsWith('prebuilt/'); + if (isTarball && !hasPrebuiltPackage && !requiredTarballs.has(file.basename)) { + yield (_fs || _load_fs()).unlink(file.absolute); + } + } + })(); + } + + /** + * Save updated integrity and lockfiles. + */ + + saveLockfileAndIntegrity(patterns, workspaceLayout) { + var _this11 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const resolvedPatterns = {}; + Object.keys(_this11.resolver.patterns).forEach(function (pattern) { + if (!workspaceLayout || !workspaceLayout.getManifestByPattern(pattern)) { + resolvedPatterns[pattern] = _this11.resolver.patterns[pattern]; + } + }); + + // TODO this code is duplicated in a few places, need a common way to filter out workspace patterns from lockfile + patterns = patterns.filter(function (p) { + return !workspaceLayout || !workspaceLayout.getManifestByPattern(p); + }); + + const lockfileBasedOnResolver = _this11.lockfile.getLockfile(resolvedPatterns); + + if (_this11.config.pruneOfflineMirror) { + yield _this11.pruneOfflineMirror(lockfileBasedOnResolver); + } + + // write integrity hash + if (!_this11.config.plugnplayEnabled) { + yield _this11.integrityChecker.save(patterns, lockfileBasedOnResolver, _this11.flags, workspaceLayout, _this11.scripts.getArtifacts()); + } + + // --no-lockfile or --pure-lockfile or --frozen-lockfile + if (_this11.flags.lockfile === false || _this11.flags.pureLockfile || _this11.flags.frozenLockfile) { + return; + } + + const lockFileHasAllPatterns = patterns.every(function (p) { + return _this11.lockfile.getLocked(p); + }); + const lockfilePatternsMatch = Object.keys(_this11.lockfile.cache || {}).every(function (p) { + return lockfileBasedOnResolver[p]; + }); + const resolverPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) { + const manifest = _this11.lockfile.getLocked(pattern); + return manifest && manifest.resolved === lockfileBasedOnResolver[pattern].resolved && deepEqual(manifest.prebuiltVariants, lockfileBasedOnResolver[pattern].prebuiltVariants); + }); + const integrityPatternsAreSameAsInLockfile = Object.keys(lockfileBasedOnResolver).every(function (pattern) { + const existingIntegrityInfo = lockfileBasedOnResolver[pattern].integrity; + if (!existingIntegrityInfo) { + // if this entry does not have an integrity, no need to re-write the lockfile because of it + return true; + } + const manifest = _this11.lockfile.getLocked(pattern); + if (manifest && manifest.integrity) { + const manifestIntegrity = ssri.stringify(manifest.integrity); + return manifestIntegrity === existingIntegrityInfo; + } + return false; + }); + + // remove command is followed by install with force, lockfile will be rewritten in any case then + if (!_this11.flags.force && _this11.lockfile.parseResultType === 'success' && lockFileHasAllPatterns && lockfilePatternsMatch && resolverPatternsAreSameAsInLockfile && integrityPatternsAreSameAsInLockfile && patterns.length) { + return; + } + + // build lockfile location + const loc = path.join(_this11.config.lockfileFolder, (_constants || _load_constants()).LOCKFILE_FILENAME); + + // write lockfile + const lockSource = (0, (_lockfile2 || _load_lockfile2()).stringify)(lockfileBasedOnResolver, false, _this11.config.enableLockfileVersions); + yield (_fs || _load_fs()).writeFilePreservingEol(loc, lockSource); + + _this11._logSuccessSaveLockfile(); + })(); + } + + _logSuccessSaveLockfile() { + this.reporter.success(this.reporter.lang('savedLockfile')); + } + + /** + * Load the dependency graph of the current install. Only does package resolving and wont write to the cwd. + */ + hydrate(ignoreUnusedPatterns) { + var _this12 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + const request = yield _this12.fetchRequestFromCwd([], ignoreUnusedPatterns); + const depRequests = request.requests, + rawPatterns = request.patterns, + ignorePatterns = request.ignorePatterns, + workspaceLayout = request.workspaceLayout; + + + yield _this12.resolver.init(depRequests, { + isFlat: _this12.flags.flat, + isFrozen: _this12.flags.frozenLockfile, + workspaceLayout + }); + yield _this12.flatten(rawPatterns); + _this12.markIgnored(ignorePatterns); + + // fetch packages, should hit cache most of the time + const manifests = yield (_packageFetcher || _load_packageFetcher()).fetch(_this12.resolver.getManifests(), _this12.config); + _this12.resolver.updateManifests(manifests); + yield (_packageCompatibility || _load_packageCompatibility()).check(_this12.resolver.getManifests(), _this12.config, _this12.flags.ignoreEngines); + + // expand minimal manifests + for (var _iterator15 = _this12.resolver.getManifests(), _isArray15 = Array.isArray(_iterator15), _i15 = 0, _iterator15 = _isArray15 ? _iterator15 : _iterator15[Symbol.iterator]();;) { + var _ref28; + + if (_isArray15) { + if (_i15 >= _iterator15.length) break; + _ref28 = _iterator15[_i15++]; + } else { + _i15 = _iterator15.next(); + if (_i15.done) break; + _ref28 = _i15.value; + } + + const manifest = _ref28; + + const ref = manifest._reference; + invariant(ref, 'expected reference'); + const type = ref.remote.type; + // link specifier won't ever hit cache + + let loc = ''; + if (type === 'link') { + continue; + } else if (type === 'workspace') { + if (!ref.remote.reference) { + continue; + } + loc = ref.remote.reference; + } else { + loc = _this12.config.generateModuleCachePath(ref); + } + const newPkg = yield _this12.config.readManifest(loc); + yield _this12.resolver.updateManifest(ref, newPkg); + } + + return request; + })(); + } + + /** + * Check for updates every day and output a nag message if there's a newer version. + */ + + checkUpdate() { + if (this.config.nonInteractive) { + // don't show upgrade dialog on CI or non-TTY terminals + return; + } + + // don't check if disabled + if (this.config.getOption('disable-self-update-check')) { + return; + } + + // only check for updates once a day + const lastUpdateCheck = Number(this.config.getOption('lastUpdateCheck')) || 0; + if (lastUpdateCheck && Date.now() - lastUpdateCheck < ONE_DAY) { + return; + } + + // don't bug for updates on tagged releases + if ((_yarnVersion || _load_yarnVersion()).version.indexOf('-') >= 0) { + return; + } + + this._checkUpdate().catch(() => { + // swallow errors + }); + } + + _checkUpdate() { + var _this13 = this; + + return (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* () { + let latestVersion = yield _this13.config.requestManager.request({ + url: (_constants || _load_constants()).SELF_UPDATE_VERSION_URL + }); + invariant(typeof latestVersion === 'string', 'expected string'); + latestVersion = latestVersion.trim(); + if (!semver.valid(latestVersion)) { + return; + } + + // ensure we only check for updates periodically + _this13.config.registries.yarn.saveHomeConfig({ + lastUpdateCheck: Date.now() + }); + + if (semver.gt(latestVersion, (_yarnVersion || _load_yarnVersion()).version)) { + const installationMethod = yield (0, (_yarnVersion || _load_yarnVersion()).getInstallationMethod)(); + _this13.maybeOutputUpdate = function () { + _this13.reporter.warn(_this13.reporter.lang('yarnOutdated', latestVersion, (_yarnVersion || _load_yarnVersion()).version)); + + const command = getUpdateCommand(installationMethod); + if (command) { + _this13.reporter.info(_this13.reporter.lang('yarnOutdatedCommand')); + _this13.reporter.command(command); + } else { + const installer = getUpdateInstaller(installationMethod); + if (installer) { + _this13.reporter.info(_this13.reporter.lang('yarnOutdatedInstaller', installer)); + } + } + }; + } + })(); + } + + /** + * Method to override with a possible upgrade message. + */ + + maybeOutputUpdate() {} +} + +exports.Install = Install; +function hasWrapper(commander, args) { + return true; +} + +function setFlags(commander) { + commander.description('Yarn install is used to install all dependencies for a project.'); + commander.usage('install [flags]'); + commander.option('-A, --audit', 'Run vulnerability audit on installed packages'); + commander.option('-g, --global', 'DEPRECATED'); + commander.option('-S, --save', 'DEPRECATED - save package to your `dependencies`'); + commander.option('-D, --save-dev', 'DEPRECATED - save package to your `devDependencies`'); + commander.option('-P, --save-peer', 'DEPRECATED - save package to your `peerDependencies`'); + commander.option('-O, --save-optional', 'DEPRECATED - save package to your `optionalDependencies`'); + commander.option('-E, --save-exact', 'DEPRECATED'); + commander.option('-T, --save-tilde', 'DEPRECATED'); +} + +/***/ }), +/* 35 */ +/***/ (function(module, exports, __webpack_require__) { + +var isObject = __webpack_require__(53); +module.exports = function (it) { + if (!isObject(it)) throw TypeError(it + ' is not an object!'); + return it; +}; + + +/***/ }), +/* 36 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "b", function() { return SubjectSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Subject; }); +/* unused harmony export AnonymousSubject */ +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_tslib__ = __webpack_require__(1); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__Observable__ = __webpack_require__(12); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__Subscriber__ = __webpack_require__(7); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__Subscription__ = __webpack_require__(25); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__ = __webpack_require__(190); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__ = __webpack_require__(422); +/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__ = __webpack_require__(322); +/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ + + + + + + + +var SubjectSubscriber = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](SubjectSubscriber, _super); + function SubjectSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; + } + return SubjectSubscriber; +}(__WEBPACK_IMPORTED_MODULE_2__Subscriber__["a" /* Subscriber */])); + +var Subject = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](Subject, _super); + function Subject() { + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; + } + Subject.prototype[__WEBPACK_IMPORTED_MODULE_6__internal_symbol_rxSubscriber__["a" /* rxSubscriber */]] = function () { + return new SubjectSubscriber(this); + }; + Subject.prototype.lift = function (operator) { + var subject = new AnonymousSubject(this, this); + subject.operator = operator; + return subject; + }; + Subject.prototype.next = function (value) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + if (!this.isStopped) { + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].next(value); + } + } + }; + Subject.prototype.error = function (err) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + this.hasError = true; + this.thrownError = err; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].error(err); + } + this.observers.length = 0; + }; + Subject.prototype.complete = function () { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].complete(); + } + this.observers.length = 0; + }; + Subject.prototype.unsubscribe = function () { + this.isStopped = true; + this.closed = true; + this.observers = null; + }; + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } + }; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new __WEBPACK_IMPORTED_MODULE_4__util_ObjectUnsubscribedError__["a" /* ObjectUnsubscribedError */](); + } + else if (this.hasError) { + subscriber.error(this.thrownError); + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + else if (this.isStopped) { + subscriber.complete(); + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + else { + this.observers.push(subscriber); + return new __WEBPACK_IMPORTED_MODULE_5__SubjectSubscription__["a" /* SubjectSubscription */](this, subscriber); + } + }; + Subject.prototype.asObservable = function () { + var observable = new __WEBPACK_IMPORTED_MODULE_1__Observable__["a" /* Observable */](); + observable.source = this; + return observable; + }; + Subject.create = function (destination, source) { + return new AnonymousSubject(destination, source); + }; + return Subject; +}(__WEBPACK_IMPORTED_MODULE_1__Observable__["a" /* Observable */])); + +var AnonymousSubject = /*@__PURE__*/ (function (_super) { + __WEBPACK_IMPORTED_MODULE_0_tslib__["a" /* __extends */](AnonymousSubject, _super); + function AnonymousSubject(destination, source) { + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; + } + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); + } + }; + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { + this.destination.error(err); + } + }; + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); + } + }; + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); + } + else { + return __WEBPACK_IMPORTED_MODULE_3__Subscription__["a" /* Subscription */].EMPTY; + } + }; + return AnonymousSubject; +}(Subject)); + +//# sourceMappingURL=Subject.js.map + + +/***/ }), +/* 37 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.normalizePattern = normalizePattern; + +/** + * Explode and normalize a pattern into its name and range. + */ + +function normalizePattern(pattern) { + let hasVersion = false; + let range = 'latest'; + let name = pattern; + + // if we're a scope then remove the @ and add it back later + let isScoped = false; + if (name[0] === '@') { + isScoped = true; + name = name.slice(1); + } + + // take first part as the name + const parts = name.split('@'); + if (parts.length > 1) { + name = parts.shift(); + range = parts.join('@'); + + if (range) { + hasVersion = true; + } else { + range = '*'; + } + } + + // add back @ scope suffix + if (isScoped) { + name = `@${name}`; + } + + return { name, range, hasVersion }; +} + +/***/ }), +/* 38 */ +/***/ (function(module, exports, __webpack_require__) { + +/* WEBPACK VAR INJECTION */(function(module) {var __WEBPACK_AMD_DEFINE_RESULT__;/** + * @license + * Lodash + * Copyright JS Foundation and other contributors + * Released under MIT license + * Based on Underscore.js 1.8.3 + * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre-ES5 environments. */ + var undefined; + + /** Used as the semantic version number. */ + var VERSION = '4.17.10'; + + /** Used as the size to enable large array optimizations. */ + var LARGE_ARRAY_SIZE = 200; + + /** Error message constants. */ + var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.', + FUNC_ERROR_TEXT = 'Expected a function'; + + /** Used to stand-in for `undefined` hash values. */ + var HASH_UNDEFINED = '__lodash_hash_undefined__'; + + /** Used as the maximum memoize cache size. */ + var MAX_MEMOIZE_SIZE = 500; + + /** Used as the internal argument placeholder. */ + var PLACEHOLDER = '__lodash_placeholder__'; + + /** Used to compose bitmasks for cloning. */ + var CLONE_DEEP_FLAG = 1, + CLONE_FLAT_FLAG = 2, + CLONE_SYMBOLS_FLAG = 4; + + /** Used to compose bitmasks for value comparisons. */ + var COMPARE_PARTIAL_FLAG = 1, + COMPARE_UNORDERED_FLAG = 2; + + /** Used to compose bitmasks for function metadata. */ + var WRAP_BIND_FLAG = 1, + WRAP_BIND_KEY_FLAG = 2, + WRAP_CURRY_BOUND_FLAG = 4, + WRAP_CURRY_FLAG = 8, + WRAP_CURRY_RIGHT_FLAG = 16, + WRAP_PARTIAL_FLAG = 32, + WRAP_PARTIAL_RIGHT_FLAG = 64, + WRAP_ARY_FLAG = 128, + WRAP_REARG_FLAG = 256, + WRAP_FLIP_FLAG = 512; + + /** Used as default options for `_.truncate`. */ + var DEFAULT_TRUNC_LENGTH = 30, + DEFAULT_TRUNC_OMISSION = '...'; + + /** Used to detect hot functions by number of calls within a span of milliseconds. */ + var HOT_COUNT = 800, + HOT_SPAN = 16; + + /** Used to indicate the type of lazy iteratees. */ + var LAZY_FILTER_FLAG = 1, + LAZY_MAP_FLAG = 2, + LAZY_WHILE_FLAG = 3; + + /** Used as references for various `Number` constants. */ + var INFINITY = 1 / 0, + MAX_SAFE_INTEGER = 9007199254740991, + MAX_INTEGER = 1.7976931348623157e+308, + NAN = 0 / 0; + + /** Used as references for the maximum length and index of an array. */ + var MAX_ARRAY_LENGTH = 4294967295, + MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, + HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1; + + /** Used to associate wrap methods with their bit flags. */ + var wrapFlags = [ + ['ary', WRAP_ARY_FLAG], + ['bind', WRAP_BIND_FLAG], + ['bindKey', WRAP_BIND_KEY_FLAG], + ['curry', WRAP_CURRY_FLAG], + ['curryRight', WRAP_CURRY_RIGHT_FLAG], + ['flip', WRAP_FLIP_FLAG], + ['partial', WRAP_PARTIAL_FLAG], + ['partialRight', WRAP_PARTIAL_RIGHT_FLAG], + ['rearg', WRAP_REARG_FLAG] + ]; + + /** `Object#toString` result references. */ + var argsTag = '[object Arguments]', + arrayTag = '[object Array]', + asyncTag = '[object AsyncFunction]', + boolTag = '[object Boolean]', + dateTag = '[object Date]', + domExcTag = '[object DOMException]', + errorTag = '[object Error]', + funcTag = '[object Function]', + genTag = '[object GeneratorFunction]', + mapTag = '[object Map]', + numberTag = '[object Number]', + nullTag = '[object Null]', + objectTag = '[object Object]', + promiseTag = '[object Promise]', + proxyTag = '[object Proxy]', + regexpTag = '[object RegExp]', + setTag = '[object Set]', + stringTag = '[object String]', + symbolTag = '[object Symbol]', + undefinedTag = '[object Undefined]', + weakMapTag = '[object WeakMap]', + weakSetTag = '[object WeakSet]'; + + var arrayBufferTag = '[object ArrayBuffer]', + dataViewTag = '[object DataView]', + float32Tag = '[object Float32Array]', + float64Tag = '[object Float64Array]', + int8Tag = '[object Int8Array]', + int16Tag = '[object Int16Array]', + int32Tag = '[object Int32Array]', + uint8Tag = '[object Uint8Array]', + uint8ClampedTag = '[object Uint8ClampedArray]', + uint16Tag = '[object Uint16Array]', + uint32Tag = '[object Uint32Array]'; + + /** Used to match empty string literals in compiled template source. */ + var reEmptyStringLeading = /\b__p \+= '';/g, + reEmptyStringMiddle = /\b(__p \+=) '' \+/g, + reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g; + + /** Used to match HTML entities and HTML characters. */ + var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, + reUnescapedHtml = /[&<>"']/g, + reHasEscapedHtml = RegExp(reEscapedHtml.source), + reHasUnescapedHtml = RegExp(reUnescapedHtml.source); + + /** Used to match template delimiters. */ + var reEscape = /<%-([\s\S]+?)%>/g, + reEvaluate = /<%([\s\S]+?)%>/g, + reInterpolate = /<%=([\s\S]+?)%>/g; + + /** Used to match property names within property paths. */ + var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, + reIsPlainProp = /^\w*$/, + rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + + /** + * Used to match `RegExp` + * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). + */ + var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, + reHasRegExpChar = RegExp(reRegExpChar.source); + + /** Used to match leading and trailing whitespace. */ + var reTrim = /^\s+|\s+$/g, + reTrimStart = /^\s+/, + reTrimEnd = /\s+$/; + + /** Used to match wrap detail comments. */ + var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, + reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, + reSplitDetails = /,? & /; + + /** Used to match words composed of alphanumeric characters. */ + var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g; + + /** Used to match backslashes in property paths. */ + var reEscapeChar = /\\(\\)?/g; + + /** + * Used to match + * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components). + */ + var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g; + + /** Used to match `RegExp` flags from their coerced string values. */ + var reFlags = /\w*$/; + + /** Used to detect bad signed hexadecimal string values. */ + var reIsBadHex = /^[-+]0x[0-9a-f]+$/i; + + /** Used to detect binary string values. */ + var reIsBinary = /^0b[01]+$/i; + + /** Used to detect host constructors (Safari). */ + var reIsHostCtor = /^\[object .+?Constructor\]$/; + + /** Used to detect octal string values. */ + var reIsOctal = /^0o[0-7]+$/i; + + /** Used to detect unsigned integer values. */ + var reIsUint = /^(?:0|[1-9]\d*)$/; + + /** Used to match Latin Unicode letters (excluding mathematical operators). */ + var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g; + + /** Used to ensure capturing order of template delimiters. */ + var reNoMatch = /($^)/; + + /** Used to match unescaped characters in compiled string literals. */ + var reUnescapedString = /['\n\r\u2028\u2029\\]/g; + + /** Used to compose unicode character classes. */ + var rsAstralRange = '\\ud800-\\udfff', + rsComboMarksRange = '\\u0300-\\u036f', + reComboHalfMarksRange = '\\ufe20-\\ufe2f', + rsComboSymbolsRange = '\\u20d0-\\u20ff', + rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, + rsDingbatRange = '\\u2700-\\u27bf', + rsLowerRange = 'a-z\\xdf-\\xf6\\xf8-\\xff', + rsMathOpRange = '\\xac\\xb1\\xd7\\xf7', + rsNonCharRange = '\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf', + rsPunctuationRange = '\\u2000-\\u206f', + rsSpaceRange = ' \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000', + rsUpperRange = 'A-Z\\xc0-\\xd6\\xd8-\\xde', + rsVarRange = '\\ufe0e\\ufe0f', + rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange; + + /** Used to compose unicode capture groups. */ + var rsApos = "['\u2019]", + rsAstral = '[' + rsAstralRange + ']', + rsBreak = '[' + rsBreakRange + ']', + rsCombo = '[' + rsComboRange + ']', + rsDigits = '\\d+', + rsDingbat = '[' + rsDingbatRange + ']', + rsLower = '[' + rsLowerRange + ']', + rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']', + rsFitz = '\\ud83c[\\udffb-\\udfff]', + rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', + rsNonAstral = '[^' + rsAstralRange + ']', + rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', + rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', + rsUpper = '[' + rsUpperRange + ']', + rsZWJ = '\\u200d'; + + /** Used to compose unicode regexes. */ + var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')', + rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')', + rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?', + rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?', + reOptMod = rsModifier + '?', + rsOptVar = '[' + rsVarRange + ']?', + rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', + rsOrdLower = '\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])', + rsOrdUpper = '\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])', + rsSeq = rsOptVar + reOptMod + rsOptJoin, + rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq, + rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; + + /** Used to match apostrophes. */ + var reApos = RegExp(rsApos, 'g'); + + /** + * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and + * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols). + */ + var reComboMark = RegExp(rsCombo, 'g'); + + /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ + var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); + + /** Used to match complex or compound words. */ + var reUnicodeWord = RegExp([ + rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')', + rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')', + rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower, + rsUpper + '+' + rsOptContrUpper, + rsOrdUpper, + rsOrdLower, + rsDigits, + rsEmoji + ].join('|'), 'g'); + + /** 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/). */ + var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); + + /** Used to detect strings that need a more robust regexp to match words. */ + var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2,}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/; + + /** Used to assign default `context` object properties. */ + var contextProps = [ + 'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array', + 'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object', + 'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array', + 'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap', + '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout' + ]; + + /** Used to make template sourceURLs easier to identify. */ + var templateCounter = -1; + + /** Used to identify `toStringTag` values of typed arrays. */ + var typedArrayTags = {}; + typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = + typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = + typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = + typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = + typedArrayTags[uint32Tag] = true; + typedArrayTags[argsTag] = typedArrayTags[arrayTag] = + typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = + typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = + typedArrayTags[errorTag] = typedArrayTags[funcTag] = + typedArrayTags[mapTag] = typedArrayTags[numberTag] = + typedArrayTags[objectTag] = typedArrayTags[regexpTag] = + typedArrayTags[setTag] = typedArrayTags[stringTag] = + typedArrayTags[weakMapTag] = false; + + /** Used to identify `toStringTag` values supported by `_.clone`. */ + var cloneableTags = {}; + cloneableTags[argsTag] = cloneableTags[arrayTag] = + cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = + cloneableTags[boolTag] = cloneableTags[dateTag] = + cloneableTags[float32Tag] = cloneableTags[float64Tag] = + cloneableTags[int8Tag] = cloneableTags[int16Tag] = + cloneableTags[int32Tag] = cloneableTags[mapTag] = + cloneableTags[numberTag] = cloneableTags[objectTag] = + cloneableTags[regexpTag] = cloneableTags[setTag] = + cloneableTags[stringTag] = cloneableTags[symbolTag] = + cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = + cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true; + cloneableTags[errorTag] = cloneableTags[funcTag] = + cloneableTags[weakMapTag] = false; + + /** Used to map Latin Unicode letters to basic Latin letters. */ + var deburredLetters = { + // Latin-1 Supplement block. + '\xc0': 'A', '\xc1': 'A', '\xc2': 'A', '\xc3': 'A', '\xc4': 'A', '\xc5': 'A', + '\xe0': 'a', '\xe1': 'a', '\xe2': 'a', '\xe3': 'a', '\xe4': 'a', '\xe5': 'a', + '\xc7': 'C', '\xe7': 'c', + '\xd0': 'D', '\xf0': 'd', + '\xc8': 'E', '\xc9': 'E', '\xca': 'E', '\xcb': 'E', + '\xe8': 'e', '\xe9': 'e', '\xea': 'e', '\xeb': 'e', + '\xcc': 'I', '\xcd': 'I', '\xce': 'I', '\xcf': 'I', + '\xec': 'i', '\xed': 'i', '\xee': 'i', '\xef': 'i', + '\xd1': 'N', '\xf1': 'n', + '\xd2': 'O', '\xd3': 'O', '\xd4': 'O', '\xd5': 'O', '\xd6': 'O', '\xd8': 'O', + '\xf2': 'o', '\xf3': 'o', '\xf4': 'o', '\xf5': 'o', '\xf6': 'o', '\xf8': 'o', + '\xd9': 'U', '\xda': 'U', '\xdb': 'U', '\xdc': 'U', + '\xf9': 'u', '\xfa': 'u', '\xfb': 'u', '\xfc': 'u', + '\xdd': 'Y', '\xfd': 'y', '\xff': 'y', + '\xc6': 'Ae', '\xe6': 'ae', + '\xde': 'Th', '\xfe': 'th', + '\xdf': 'ss', + // Latin Extended-A block. + '\u0100': 'A', '\u0102': 'A', '\u0104': 'A', + '\u0101': 'a', '\u0103': 'a', '\u0105': 'a', + '\u0106': 'C', '\u0108': 'C', '\u010a': 'C', '\u010c': 'C', + '\u0107': 'c', '\u0109': 'c', '\u010b': 'c', '\u010d': 'c', + '\u010e': 'D', '\u0110': 'D', '\u010f': 'd', '\u0111': 'd', + '\u0112': 'E', '\u0114': 'E', '\u0116': 'E', '\u0118': 'E', '\u011a': 'E', + '\u0113': 'e', '\u0115': 'e', '\u0117': 'e', '\u0119': 'e', '\u011b': 'e', + '\u011c': 'G', '\u011e': 'G', '\u0120': 'G', '\u0122': 'G', + '\u011d': 'g', '\u011f': 'g', '\u0121': 'g', '\u0123': 'g', + '\u0124': 'H', '\u0126': 'H', '\u0125': 'h', '\u0127': 'h', + '\u0128': 'I', '\u012a': 'I', '\u012c': 'I', '\u012e': 'I', '\u0130': 'I', + '\u0129': 'i', '\u012b': 'i', '\u012d': 'i', '\u012f': 'i', '\u0131': 'i', + '\u0134': 'J', '\u0135': 'j', + '\u0136': 'K', '\u0137': 'k', '\u0138': 'k', + '\u0139': 'L', '\u013b': 'L', '\u013d': 'L', '\u013f': 'L', '\u0141': 'L', + '\u013a': 'l', '\u013c': 'l', '\u013e': 'l', '\u0140': 'l', '\u0142': 'l', + '\u0143': 'N', '\u0145': 'N', '\u0147': 'N', '\u014a': 'N', + '\u0144': 'n', '\u0146': 'n', '\u0148': 'n', '\u014b': 'n', + '\u014c': 'O', '\u014e': 'O', '\u0150': 'O', + '\u014d': 'o', '\u014f': 'o', '\u0151': 'o', + '\u0154': 'R', '\u0156': 'R', '\u0158': 'R', + '\u0155': 'r', '\u0157': 'r', '\u0159': 'r', + '\u015a': 'S', '\u015c': 'S', '\u015e': 'S', '\u0160': 'S', + '\u015b': 's', '\u015d': 's', '\u015f': 's', '\u0161': 's', + '\u0162': 'T', '\u0164': 'T', '\u0166': 'T', + '\u0163': 't', '\u0165': 't', '\u0167': 't', + '\u0168': 'U', '\u016a': 'U', '\u016c': 'U', '\u016e': 'U', '\u0170': 'U', '\u0172': 'U', + '\u0169': 'u', '\u016b': 'u', '\u016d': 'u', '\u016f': 'u', '\u0171': 'u', '\u0173': 'u', + '\u0174': 'W', '\u0175': 'w', + '\u0176': 'Y', '\u0177': 'y', '\u0178': 'Y', + '\u0179': 'Z', '\u017b': 'Z', '\u017d': 'Z', + '\u017a': 'z', '\u017c': 'z', '\u017e': 'z', + '\u0132': 'IJ', '\u0133': 'ij', + '\u0152': 'Oe', '\u0153': 'oe', + '\u0149': "'n", '\u017f': 's' + }; + + /** Used to map characters to HTML entities. */ + var htmlEscapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; + + /** Used to map HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to escape characters for inclusion in compiled string literals. */ + var stringEscapes = { + '\\': '\\', + "'": "'", + '\n': 'n', + '\r': 'r', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + /** Built-in method references without a dependency on `root`. */ + var freeParseFloat = parseFloat, + freeParseInt = parseInt; + + /** Detect free variable `global` from Node.js. */ + var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; + + /** Detect free variable `self`. */ + var freeSelf = typeof self == 'object' && self && self.Object === Object && self; + + /** Used as a reference to the global object. */ + var root = freeGlobal || freeSelf || Function('return this')(); + + /** Detect free variable `exports`. */ + var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module; + + /** Detect the popular CommonJS extension `module.exports`. */ + var moduleExports = freeModule && freeModule.exports === freeExports; + + /** Detect free variable `process` from Node.js. */ + var freeProcess = moduleExports && freeGlobal.process; + + /** Used to access faster Node.js helpers. */ + var nodeUtil = (function() { + try { + // Use `util.types` for Node.js 10+. + var types = freeModule && freeModule.require && freeModule.require('util').types; + + if (types) { + return types; + } + + // Legacy `process.binding('util')` for Node.js < 10. + return freeProcess && freeProcess.binding && freeProcess.binding('util'); + } catch (e) {} + }()); + + /* Node.js helper references. */ + var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, + nodeIsDate = nodeUtil && nodeUtil.isDate, + nodeIsMap = nodeUtil && nodeUtil.isMap, + nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, + nodeIsSet = nodeUtil && nodeUtil.isSet, + nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray; + + /*--------------------------------------------------------------------------*/ + + /** + * A faster alternative to `Function#apply`, this function invokes `func` + * with the `this` binding of `thisArg` and the arguments of `args`. + * + * @private + * @param {Function} func The function to invoke. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} args The arguments to invoke `func` with. + * @returns {*} Returns the result of `func`. + */ + function apply(func, thisArg, args) { + switch (args.length) { + case 0: return func.call(thisArg); + case 1: return func.call(thisArg, args[0]); + case 2: return func.call(thisArg, args[0], args[1]); + case 3: return func.call(thisArg, args[0], args[1], args[2]); + } + return func.apply(thisArg, args); + } + + /** + * A specialized version of `baseAggregator` for arrays. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function arrayAggregator(array, setter, iteratee, accumulator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + var value = array[index]; + setter(accumulator, value, iteratee(value), array); + } + return accumulator; + } + + /** + * A specialized version of `_.forEach` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEach(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (iteratee(array[index], index, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.forEachRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns `array`. + */ + function arrayEachRight(array, iteratee) { + var length = array == null ? 0 : array.length; + + while (length--) { + if (iteratee(array[length], length, array) === false) { + break; + } + } + return array; + } + + /** + * A specialized version of `_.every` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + */ + function arrayEvery(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (!predicate(array[index], index, array)) { + return false; + } + } + return true; + } + + /** + * A specialized version of `_.filter` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function arrayFilter(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * A specialized version of `_.includes` for arrays without support for + * specifying an index to search from. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludes(array, value) { + var length = array == null ? 0 : array.length; + return !!length && baseIndexOf(array, value, 0) > -1; + } + + /** + * This function is like `arrayIncludes` except that it accepts a comparator. + * + * @private + * @param {Array} [array] The array to inspect. + * @param {*} target The value to search for. + * @param {Function} comparator The comparator invoked per element. + * @returns {boolean} Returns `true` if `target` is found, else `false`. + */ + function arrayIncludesWith(array, value, comparator) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (comparator(value, array[index])) { + return true; + } + } + return false; + } + + /** + * A specialized version of `_.map` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function arrayMap(array, iteratee) { + var index = -1, + length = array == null ? 0 : array.length, + result = Array(length); + + while (++index < length) { + result[index] = iteratee(array[index], index, array); + } + return result; + } + + /** + * Appends the elements of `values` to `array`. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to append. + * @returns {Array} Returns `array`. + */ + function arrayPush(array, values) { + var index = -1, + length = values.length, + offset = array.length; + + while (++index < length) { + array[offset + index] = values[index]; + } + return array; + } + + /** + * A specialized version of `_.reduce` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the first element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduce(array, iteratee, accumulator, initAccum) { + var index = -1, + length = array == null ? 0 : array.length; + + if (initAccum && length) { + accumulator = array[++index]; + } + while (++index < length) { + accumulator = iteratee(accumulator, array[index], index, array); + } + return accumulator; + } + + /** + * A specialized version of `_.reduceRight` for arrays without support for + * iteratee shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @param {boolean} [initAccum] Specify using the last element of `array` as + * the initial value. + * @returns {*} Returns the accumulated value. + */ + function arrayReduceRight(array, iteratee, accumulator, initAccum) { + var length = array == null ? 0 : array.length; + if (initAccum && length) { + accumulator = array[--length]; + } + while (length--) { + accumulator = iteratee(accumulator, array[length], length, array); + } + return accumulator; + } + + /** + * A specialized version of `_.some` for arrays without support for iteratee + * shorthands. + * + * @private + * @param {Array} [array] The array to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function arraySome(array, predicate) { + var index = -1, + length = array == null ? 0 : array.length; + + while (++index < length) { + if (predicate(array[index], index, array)) { + return true; + } + } + return false; + } + + /** + * Gets the size of an ASCII `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + var asciiSize = baseProperty('length'); + + /** + * Converts an ASCII `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function asciiToArray(string) { + return string.split(''); + } + + /** + * Splits an ASCII `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function asciiWords(string) { + return string.match(reAsciiWord) || []; + } + + /** + * The base implementation of methods like `_.findKey` and `_.findLastKey`, + * without support for iteratee shorthands, which iterates over `collection` + * using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the found element or its key, else `undefined`. + */ + function baseFindKey(collection, predicate, eachFunc) { + var result; + eachFunc(collection, function(value, key, collection) { + if (predicate(value, key, collection)) { + result = key; + return false; + } + }); + return result; + } + + /** + * The base implementation of `_.findIndex` and `_.findLastIndex` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} predicate The function invoked per iteration. + * @param {number} fromIndex The index to search from. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseFindIndex(array, predicate, fromIndex, fromRight) { + var length = array.length, + index = fromIndex + (fromRight ? 1 : -1); + + while ((fromRight ? index-- : ++index < length)) { + if (predicate(array[index], index, array)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.indexOf` without `fromIndex` bounds checks. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOf(array, value, fromIndex) { + return value === value + ? strictIndexOf(array, value, fromIndex) + : baseFindIndex(array, baseIsNaN, fromIndex); + } + + /** + * This function is like `baseIndexOf` except that it accepts a comparator. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @param {Function} comparator The comparator invoked per element. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function baseIndexOfWith(array, value, fromIndex, comparator) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (comparator(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * The base implementation of `_.isNaN` without support for number objects. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + */ + function baseIsNaN(value) { + return value !== value; + } + + /** + * The base implementation of `_.mean` and `_.meanBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the mean. + */ + function baseMean(array, iteratee) { + var length = array == null ? 0 : array.length; + return length ? (baseSum(array, iteratee) / length) : NAN; + } + + /** + * The base implementation of `_.property` without support for deep paths. + * + * @private + * @param {string} key The key of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function baseProperty(key) { + return function(object) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.propertyOf` without support for deep paths. + * + * @private + * @param {Object} object The object to query. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyOf(object) { + return function(key) { + return object == null ? undefined : object[key]; + }; + } + + /** + * The base implementation of `_.reduce` and `_.reduceRight`, without support + * for iteratee shorthands, which iterates over `collection` using `eachFunc`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {*} accumulator The initial value. + * @param {boolean} initAccum Specify using the first or last element of + * `collection` as the initial value. + * @param {Function} eachFunc The function to iterate over `collection`. + * @returns {*} Returns the accumulated value. + */ + function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) { + eachFunc(collection, function(value, index, collection) { + accumulator = initAccum + ? (initAccum = false, value) + : iteratee(accumulator, value, index, collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.sortBy` which uses `comparer` to define the + * sort order of `array` and replaces criteria objects with their corresponding + * values. + * + * @private + * @param {Array} array The array to sort. + * @param {Function} comparer The function to define sort order. + * @returns {Array} Returns `array`. + */ + function baseSortBy(array, comparer) { + var length = array.length; + + array.sort(comparer); + while (length--) { + array[length] = array[length].value; + } + return array; + } + + /** + * The base implementation of `_.sum` and `_.sumBy` without support for + * iteratee shorthands. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {number} Returns the sum. + */ + function baseSum(array, iteratee) { + var result, + index = -1, + length = array.length; + + while (++index < length) { + var current = iteratee(array[index]); + if (current !== undefined) { + result = result === undefined ? current : (result + current); + } + } + return result; + } + + /** + * The base implementation of `_.times` without support for iteratee shorthands + * or max array length checks. + * + * @private + * @param {number} n The number of times to invoke `iteratee`. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the array of results. + */ + function baseTimes(n, iteratee) { + var index = -1, + result = Array(n); + + while (++index < n) { + result[index] = iteratee(index); + } + return result; + } + + /** + * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array + * of key-value pairs for `object` corresponding to the property names of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the key-value pairs. + */ + function baseToPairs(object, props) { + return arrayMap(props, function(key) { + return [key, object[key]]; + }); + } + + /** + * The base implementation of `_.unary` without support for storing metadata. + * + * @private + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + */ + function baseUnary(func) { + return function(value) { + return func(value); + }; + } + + /** + * The base implementation of `_.values` and `_.valuesIn` which creates an + * array of `object` property values corresponding to the property names + * of `props`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} props The property names to get values for. + * @returns {Object} Returns the array of property values. + */ + function baseValues(object, props) { + return arrayMap(props, function(key) { + return object[key]; + }); + } + + /** + * Checks if a `cache` value for `key` exists. + * + * @private + * @param {Object} cache The cache to query. + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function cacheHas(cache, key) { + return cache.has(key); + } + + /** + * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the first unmatched string symbol. + */ + function charsStartIndex(strSymbols, chrSymbols) { + var index = -1, + length = strSymbols.length; + + while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol + * that is not found in the character symbols. + * + * @private + * @param {Array} strSymbols The string symbols to inspect. + * @param {Array} chrSymbols The character symbols to find. + * @returns {number} Returns the index of the last unmatched string symbol. + */ + function charsEndIndex(strSymbols, chrSymbols) { + var index = strSymbols.length; + + while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {} + return index; + } + + /** + * Gets the number of `placeholder` occurrences in `array`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} placeholder The placeholder to search for. + * @returns {number} Returns the placeholder count. + */ + function countHolders(array, placeholder) { + var length = array.length, + result = 0; + + while (length--) { + if (array[length] === placeholder) { + ++result; + } + } + return result; + } + + /** + * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A + * letters to basic Latin letters. + * + * @private + * @param {string} letter The matched letter to deburr. + * @returns {string} Returns the deburred letter. + */ + var deburrLetter = basePropertyOf(deburredLetters); + + /** + * Used by `_.escape` to convert characters to HTML entities. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + var escapeHtmlChar = basePropertyOf(htmlEscapes); + + /** + * Used by `_.template` to escape characters for inclusion in compiled string literals. + * + * @private + * @param {string} chr The matched character to escape. + * @returns {string} Returns the escaped character. + */ + function escapeStringChar(chr) { + return '\\' + stringEscapes[chr]; + } + + /** + * Gets the value at `key` of `object`. + * + * @private + * @param {Object} [object] The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function getValue(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Checks if `string` contains Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a symbol is found, else `false`. + */ + function hasUnicode(string) { + return reHasUnicode.test(string); + } + + /** + * Checks if `string` contains a word composed of Unicode symbols. + * + * @private + * @param {string} string The string to inspect. + * @returns {boolean} Returns `true` if a word is found, else `false`. + */ + function hasUnicodeWord(string) { + return reHasUnicodeWord.test(string); + } + + /** + * Converts `iterator` to an array. + * + * @private + * @param {Object} iterator The iterator to convert. + * @returns {Array} Returns the converted array. + */ + function iteratorToArray(iterator) { + var data, + result = []; + + while (!(data = iterator.next()).done) { + result.push(data.value); + } + return result; + } + + /** + * Converts `map` to its key-value pairs. + * + * @private + * @param {Object} map The map to convert. + * @returns {Array} Returns the key-value pairs. + */ + function mapToArray(map) { + var index = -1, + result = Array(map.size); + + map.forEach(function(value, key) { + result[++index] = [key, value]; + }); + return result; + } + + /** + * Creates a unary function that invokes `func` with its argument transformed. + * + * @private + * @param {Function} func The function to wrap. + * @param {Function} transform The argument transform. + * @returns {Function} Returns the new function. + */ + function overArg(func, transform) { + return function(arg) { + return func(transform(arg)); + }; + } + + /** + * Replaces all `placeholder` elements in `array` with an internal placeholder + * and returns an array of their indexes. + * + * @private + * @param {Array} array The array to modify. + * @param {*} placeholder The placeholder to replace. + * @returns {Array} Returns the new array of placeholder indexes. + */ + function replaceHolders(array, placeholder) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value === placeholder || value === PLACEHOLDER) { + array[index] = PLACEHOLDER; + result[resIndex++] = index; + } + } + return result; + } + + /** + * Gets the value at `key`, unless `key` is "__proto__". + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the property to get. + * @returns {*} Returns the property value. + */ + function safeGet(object, key) { + return key == '__proto__' + ? undefined + : object[key]; + } + + /** + * Converts `set` to an array of its values. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the values. + */ + function setToArray(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = value; + }); + return result; + } + + /** + * Converts `set` to its value-value pairs. + * + * @private + * @param {Object} set The set to convert. + * @returns {Array} Returns the value-value pairs. + */ + function setToPairs(set) { + var index = -1, + result = Array(set.size); + + set.forEach(function(value) { + result[++index] = [value, value]; + }); + return result; + } + + /** + * A specialized version of `_.indexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictIndexOf(array, value, fromIndex) { + var index = fromIndex - 1, + length = array.length; + + while (++index < length) { + if (array[index] === value) { + return index; + } + } + return -1; + } + + /** + * A specialized version of `_.lastIndexOf` which performs strict equality + * comparisons of values, i.e. `===`. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} fromIndex The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function strictLastIndexOf(array, value, fromIndex) { + var index = fromIndex + 1; + while (index--) { + if (array[index] === value) { + return index; + } + } + return index; + } + + /** + * Gets the number of symbols in `string`. + * + * @private + * @param {string} string The string to inspect. + * @returns {number} Returns the string size. + */ + function stringSize(string) { + return hasUnicode(string) + ? unicodeSize(string) + : asciiSize(string); + } + + /** + * Converts `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function stringToArray(string) { + return hasUnicode(string) + ? unicodeToArray(string) + : asciiToArray(string); + } + + /** + * Used by `_.unescape` to convert HTML entities to characters. + * + * @private + * @param {string} chr The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + var unescapeHtmlChar = basePropertyOf(htmlUnescapes); + + /** + * Gets the size of a Unicode `string`. + * + * @private + * @param {string} string The string inspect. + * @returns {number} Returns the string size. + */ + function unicodeSize(string) { + var result = reUnicode.lastIndex = 0; + while (reUnicode.test(string)) { + ++result; + } + return result; + } + + /** + * Converts a Unicode `string` to an array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the converted array. + */ + function unicodeToArray(string) { + return string.match(reUnicode) || []; + } + + /** + * Splits a Unicode `string` into an array of its words. + * + * @private + * @param {string} The string to inspect. + * @returns {Array} Returns the words of `string`. + */ + function unicodeWords(string) { + return string.match(reUnicodeWord) || []; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Create a new pristine `lodash` function using the `context` object. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Util + * @param {Object} [context=root] The context object. + * @returns {Function} Returns a new `lodash` function. + * @example + * + * _.mixin({ 'foo': _.constant('foo') }); + * + * var lodash = _.runInContext(); + * lodash.mixin({ 'bar': lodash.constant('bar') }); + * + * _.isFunction(_.foo); + * // => true + * _.isFunction(_.bar); + * // => false + * + * lodash.isFunction(lodash.foo); + * // => false + * lodash.isFunction(lodash.bar); + * // => true + * + * // Create a suped-up `defer` in Node.js. + * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer; + */ + var runInContext = (function runInContext(context) { + context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps)); + + /** Built-in constructor references. */ + var Array = context.Array, + Date = context.Date, + Error = context.Error, + Function = context.Function, + Math = context.Math, + Object = context.Object, + RegExp = context.RegExp, + String = context.String, + TypeError = context.TypeError; + + /** Used for built-in method references. */ + var arrayProto = Array.prototype, + funcProto = Function.prototype, + objectProto = Object.prototype; + + /** Used to detect overreaching core-js shims. */ + var coreJsData = context['__core-js_shared__']; + + /** Used to resolve the decompiled source of functions. */ + var funcToString = funcProto.toString; + + /** Used to check objects for own properties. */ + var hasOwnProperty = objectProto.hasOwnProperty; + + /** Used to generate unique IDs. */ + var idCounter = 0; + + /** Used to detect methods masquerading as native. */ + var maskSrcKey = (function() { + var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); + return uid ? ('Symbol(src)_1.' + uid) : ''; + }()); + + /** + * Used to resolve the + * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) + * of values. + */ + var nativeObjectToString = objectProto.toString; + + /** Used to infer the `Object` constructor. */ + var objectCtorString = funcToString.call(Object); + + /** Used to restore the original `_` reference in `_.noConflict`. */ + var oldDash = root._; + + /** Used to detect if a method is native. */ + var reIsNative = RegExp('^' + + funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') + .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' + ); + + /** Built-in value references. */ + var Buffer = moduleExports ? context.Buffer : undefined, + Symbol = context.Symbol, + Uint8Array = context.Uint8Array, + allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined, + getPrototype = overArg(Object.getPrototypeOf, Object), + objectCreate = Object.create, + propertyIsEnumerable = objectProto.propertyIsEnumerable, + splice = arrayProto.splice, + spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined, + symIterator = Symbol ? Symbol.iterator : undefined, + symToStringTag = Symbol ? Symbol.toStringTag : undefined; + + var defineProperty = (function() { + try { + var func = getNative(Object, 'defineProperty'); + func({}, '', {}); + return func; + } catch (e) {} + }()); + + /** Mocked built-ins. */ + var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, + ctxNow = Date && Date.now !== root.Date.now && Date.now, + ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout; + + /* Built-in method references for those with the same name as other `lodash` methods. */ + var nativeCeil = Math.ceil, + nativeFloor = Math.floor, + nativeGetSymbols = Object.getOwnPropertySymbols, + nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined, + nativeIsFinite = context.isFinite, + nativeJoin = arrayProto.join, + nativeKeys = overArg(Object.keys, Object), + nativeMax = Math.max, + nativeMin = Math.min, + nativeNow = Date.now, + nativeParseInt = context.parseInt, + nativeRandom = Math.random, + nativeReverse = arrayProto.reverse; + + /* Built-in method references that are verified to be native. */ + var DataView = getNative(context, 'DataView'), + Map = getNative(context, 'Map'), + Promise = getNative(context, 'Promise'), + Set = getNative(context, 'Set'), + WeakMap = getNative(context, 'WeakMap'), + nativeCreate = getNative(Object, 'create'); + + /** Used to store function metadata. */ + var metaMap = WeakMap && new WeakMap; + + /** Used to lookup unminified function names. */ + var realNames = {}; + + /** Used to detect maps, sets, and weakmaps. */ + var dataViewCtorString = toSource(DataView), + mapCtorString = toSource(Map), + promiseCtorString = toSource(Promise), + setCtorString = toSource(Set), + weakMapCtorString = toSource(WeakMap); + + /** Used to convert symbols to primitives and strings. */ + var symbolProto = Symbol ? Symbol.prototype : undefined, + symbolValueOf = symbolProto ? symbolProto.valueOf : undefined, + symbolToString = symbolProto ? symbolProto.toString : undefined; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` object which wraps `value` to enable implicit method + * chain sequences. Methods that operate on and return arrays, collections, + * and functions can be chained together. Methods that retrieve a single value + * or may return a primitive value will automatically end the chain sequence + * and return the unwrapped value. Otherwise, the value must be unwrapped + * with `_#value`. + * + * Explicit chain sequences, which must be unwrapped with `_#value`, may be + * enabled using `_.chain`. + * + * The execution of chained methods is lazy, that is, it's deferred until + * `_#value` is implicitly or explicitly called. + * + * Lazy evaluation allows several methods to support shortcut fusion. + * Shortcut fusion is an optimization to merge iteratee calls; this avoids + * the creation of intermediate arrays and can greatly reduce the number of + * iteratee executions. Sections of a chain sequence qualify for shortcut + * fusion if the section is applied to an array and iteratees accept only + * one argument. The heuristic for whether a section qualifies for shortcut + * fusion is subject to change. + * + * Chaining is supported in custom builds as long as the `_#value` method is + * directly or indirectly included in the build. + * + * In addition to lodash methods, wrappers have `Array` and `String` methods. + * + * The wrapper `Array` methods are: + * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift` + * + * The wrapper `String` methods are: + * `replace` and `split` + * + * The wrapper methods that support shortcut fusion are: + * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`, + * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`, + * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray` + * + * The chainable wrapper methods are: + * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`, + * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`, + * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`, + * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`, + * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`, + * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`, + * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`, + * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`, + * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`, + * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`, + * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`, + * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`, + * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`, + * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`, + * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`, + * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`, + * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`, + * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`, + * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`, + * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`, + * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`, + * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`, + * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`, + * `zipObject`, `zipObjectDeep`, and `zipWith` + * + * The wrapper methods that are **not** chainable by default are: + * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`, + * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`, + * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`, + * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`, + * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`, + * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`, + * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`, + * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`, + * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`, + * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`, + * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`, + * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`, + * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`, + * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`, + * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`, + * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`, + * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`, + * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`, + * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`, + * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`, + * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`, + * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`, + * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`, + * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`, + * `upperFirst`, `value`, and `words` + * + * @name _ + * @constructor + * @category Seq + * @param {*} value The value to wrap in a `lodash` instance. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2, 3]); + * + * // Returns an unwrapped value. + * wrapped.reduce(_.add); + * // => 6 + * + * // Returns a wrapped value. + * var squares = wrapped.map(square); + * + * _.isArray(squares); + * // => false + * + * _.isArray(squares.value()); + * // => true + */ + function lodash(value) { + if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) { + if (value instanceof LodashWrapper) { + return value; + } + if (hasOwnProperty.call(value, '__wrapped__')) { + return wrapperClone(value); + } + } + return new LodashWrapper(value); + } + + /** + * The base implementation of `_.create` without support for assigning + * properties to the created object. + * + * @private + * @param {Object} proto The object to inherit from. + * @returns {Object} Returns the new object. + */ + var baseCreate = (function() { + function object() {} + return function(proto) { + if (!isObject(proto)) { + return {}; + } + if (objectCreate) { + return objectCreate(proto); + } + object.prototype = proto; + var result = new object; + object.prototype = undefined; + return result; + }; + }()); + + /** + * The function whose prototype chain sequence wrappers inherit from. + * + * @private + */ + function baseLodash() { + // No operation performed. + } + + /** + * The base constructor for creating `lodash` wrapper objects. + * + * @private + * @param {*} value The value to wrap. + * @param {boolean} [chainAll] Enable explicit method chain sequences. + */ + function LodashWrapper(value, chainAll) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__chain__ = !!chainAll; + this.__index__ = 0; + this.__values__ = undefined; + } + + /** + * By default, the template delimiters used by lodash are like those in + * embedded Ruby (ERB) as well as ES2015 template strings. Change the + * following template settings to use alternative delimiters. + * + * @static + * @memberOf _ + * @type {Object} + */ + lodash.templateSettings = { + + /** + * Used to detect `data` property values to be HTML-escaped. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'escape': reEscape, + + /** + * Used to detect code to be evaluated. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'evaluate': reEvaluate, + + /** + * Used to detect `data` property values to inject. + * + * @memberOf _.templateSettings + * @type {RegExp} + */ + 'interpolate': reInterpolate, + + /** + * Used to reference the data object in the template text. + * + * @memberOf _.templateSettings + * @type {string} + */ + 'variable': '', + + /** + * Used to import variables into the compiled template. + * + * @memberOf _.templateSettings + * @type {Object} + */ + 'imports': { + + /** + * A reference to the `lodash` function. + * + * @memberOf _.templateSettings.imports + * @type {Function} + */ + '_': lodash + } + }; + + // Ensure wrappers are instances of `baseLodash`. + lodash.prototype = baseLodash.prototype; + lodash.prototype.constructor = lodash; + + LodashWrapper.prototype = baseCreate(baseLodash.prototype); + LodashWrapper.prototype.constructor = LodashWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation. + * + * @private + * @constructor + * @param {*} value The value to wrap. + */ + function LazyWrapper(value) { + this.__wrapped__ = value; + this.__actions__ = []; + this.__dir__ = 1; + this.__filtered__ = false; + this.__iteratees__ = []; + this.__takeCount__ = MAX_ARRAY_LENGTH; + this.__views__ = []; + } + + /** + * Creates a clone of the lazy wrapper object. + * + * @private + * @name clone + * @memberOf LazyWrapper + * @returns {Object} Returns the cloned `LazyWrapper` object. + */ + function lazyClone() { + var result = new LazyWrapper(this.__wrapped__); + result.__actions__ = copyArray(this.__actions__); + result.__dir__ = this.__dir__; + result.__filtered__ = this.__filtered__; + result.__iteratees__ = copyArray(this.__iteratees__); + result.__takeCount__ = this.__takeCount__; + result.__views__ = copyArray(this.__views__); + return result; + } + + /** + * Reverses the direction of lazy iteration. + * + * @private + * @name reverse + * @memberOf LazyWrapper + * @returns {Object} Returns the new reversed `LazyWrapper` object. + */ + function lazyReverse() { + if (this.__filtered__) { + var result = new LazyWrapper(this); + result.__dir__ = -1; + result.__filtered__ = true; + } else { + result = this.clone(); + result.__dir__ *= -1; + } + return result; + } + + /** + * Extracts the unwrapped value from its lazy wrapper. + * + * @private + * @name value + * @memberOf LazyWrapper + * @returns {*} Returns the unwrapped value. + */ + function lazyValue() { + var array = this.__wrapped__.value(), + dir = this.__dir__, + isArr = isArray(array), + isRight = dir < 0, + arrLength = isArr ? array.length : 0, + view = getView(0, arrLength, this.__views__), + start = view.start, + end = view.end, + length = end - start, + index = isRight ? end : (start - 1), + iteratees = this.__iteratees__, + iterLength = iteratees.length, + resIndex = 0, + takeCount = nativeMin(length, this.__takeCount__); + + if (!isArr || (!isRight && arrLength == length && takeCount == length)) { + return baseWrapperValue(array, this.__actions__); + } + var result = []; + + outer: + while (length-- && resIndex < takeCount) { + index += dir; + + var iterIndex = -1, + value = array[index]; + + while (++iterIndex < iterLength) { + var data = iteratees[iterIndex], + iteratee = data.iteratee, + type = data.type, + computed = iteratee(value); + + if (type == LAZY_MAP_FLAG) { + value = computed; + } else if (!computed) { + if (type == LAZY_FILTER_FLAG) { + continue outer; + } else { + break outer; + } + } + } + result[resIndex++] = value; + } + return result; + } + + // Ensure `LazyWrapper` is an instance of `baseLodash`. + LazyWrapper.prototype = baseCreate(baseLodash.prototype); + LazyWrapper.prototype.constructor = LazyWrapper; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a hash object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Hash(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the hash. + * + * @private + * @name clear + * @memberOf Hash + */ + function hashClear() { + this.__data__ = nativeCreate ? nativeCreate(null) : {}; + this.size = 0; + } + + /** + * Removes `key` and its value from the hash. + * + * @private + * @name delete + * @memberOf Hash + * @param {Object} hash The hash to modify. + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function hashDelete(key) { + var result = this.has(key) && delete this.__data__[key]; + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the hash value for `key`. + * + * @private + * @name get + * @memberOf Hash + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function hashGet(key) { + var data = this.__data__; + if (nativeCreate) { + var result = data[key]; + return result === HASH_UNDEFINED ? undefined : result; + } + return hasOwnProperty.call(data, key) ? data[key] : undefined; + } + + /** + * Checks if a hash value for `key` exists. + * + * @private + * @name has + * @memberOf Hash + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function hashHas(key) { + var data = this.__data__; + return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key); + } + + /** + * Sets the hash `key` to `value`. + * + * @private + * @name set + * @memberOf Hash + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the hash instance. + */ + function hashSet(key, value) { + var data = this.__data__; + this.size += this.has(key) ? 0 : 1; + data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; + return this; + } + + // Add methods to `Hash`. + Hash.prototype.clear = hashClear; + Hash.prototype['delete'] = hashDelete; + Hash.prototype.get = hashGet; + Hash.prototype.has = hashHas; + Hash.prototype.set = hashSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an list cache object. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function ListCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the list cache. + * + * @private + * @name clear + * @memberOf ListCache + */ + function listCacheClear() { + this.__data__ = []; + this.size = 0; + } + + /** + * Removes `key` and its value from the list cache. + * + * @private + * @name delete + * @memberOf ListCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function listCacheDelete(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + return false; + } + var lastIndex = data.length - 1; + if (index == lastIndex) { + data.pop(); + } else { + splice.call(data, index, 1); + } + --this.size; + return true; + } + + /** + * Gets the list cache value for `key`. + * + * @private + * @name get + * @memberOf ListCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function listCacheGet(key) { + var data = this.__data__, + index = assocIndexOf(data, key); + + return index < 0 ? undefined : data[index][1]; + } + + /** + * Checks if a list cache value for `key` exists. + * + * @private + * @name has + * @memberOf ListCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function listCacheHas(key) { + return assocIndexOf(this.__data__, key) > -1; + } + + /** + * Sets the list cache `key` to `value`. + * + * @private + * @name set + * @memberOf ListCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the list cache instance. + */ + function listCacheSet(key, value) { + var data = this.__data__, + index = assocIndexOf(data, key); + + if (index < 0) { + ++this.size; + data.push([key, value]); + } else { + data[index][1] = value; + } + return this; + } + + // Add methods to `ListCache`. + ListCache.prototype.clear = listCacheClear; + ListCache.prototype['delete'] = listCacheDelete; + ListCache.prototype.get = listCacheGet; + ListCache.prototype.has = listCacheHas; + ListCache.prototype.set = listCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a map cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function MapCache(entries) { + var index = -1, + length = entries == null ? 0 : entries.length; + + this.clear(); + while (++index < length) { + var entry = entries[index]; + this.set(entry[0], entry[1]); + } + } + + /** + * Removes all key-value entries from the map. + * + * @private + * @name clear + * @memberOf MapCache + */ + function mapCacheClear() { + this.size = 0; + this.__data__ = { + 'hash': new Hash, + 'map': new (Map || ListCache), + 'string': new Hash + }; + } + + /** + * Removes `key` and its value from the map. + * + * @private + * @name delete + * @memberOf MapCache + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function mapCacheDelete(key) { + var result = getMapData(this, key)['delete'](key); + this.size -= result ? 1 : 0; + return result; + } + + /** + * Gets the map value for `key`. + * + * @private + * @name get + * @memberOf MapCache + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function mapCacheGet(key) { + return getMapData(this, key).get(key); + } + + /** + * Checks if a map value for `key` exists. + * + * @private + * @name has + * @memberOf MapCache + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function mapCacheHas(key) { + return getMapData(this, key).has(key); + } + + /** + * Sets the map `key` to `value`. + * + * @private + * @name set + * @memberOf MapCache + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the map cache instance. + */ + function mapCacheSet(key, value) { + var data = getMapData(this, key), + size = data.size; + + data.set(key, value); + this.size += data.size == size ? 0 : 1; + return this; + } + + // Add methods to `MapCache`. + MapCache.prototype.clear = mapCacheClear; + MapCache.prototype['delete'] = mapCacheDelete; + MapCache.prototype.get = mapCacheGet; + MapCache.prototype.has = mapCacheHas; + MapCache.prototype.set = mapCacheSet; + + /*------------------------------------------------------------------------*/ + + /** + * + * Creates an array cache object to store unique values. + * + * @private + * @constructor + * @param {Array} [values] The values to cache. + */ + function SetCache(values) { + var index = -1, + length = values == null ? 0 : values.length; + + this.__data__ = new MapCache; + while (++index < length) { + this.add(values[index]); + } + } + + /** + * Adds `value` to the array cache. + * + * @private + * @name add + * @memberOf SetCache + * @alias push + * @param {*} value The value to cache. + * @returns {Object} Returns the cache instance. + */ + function setCacheAdd(value) { + this.__data__.set(value, HASH_UNDEFINED); + return this; + } + + /** + * Checks if `value` is in the array cache. + * + * @private + * @name has + * @memberOf SetCache + * @param {*} value The value to search for. + * @returns {number} Returns `true` if `value` is found, else `false`. + */ + function setCacheHas(value) { + return this.__data__.has(value); + } + + // Add methods to `SetCache`. + SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; + SetCache.prototype.has = setCacheHas; + + /*------------------------------------------------------------------------*/ + + /** + * Creates a stack cache object to store key-value pairs. + * + * @private + * @constructor + * @param {Array} [entries] The key-value pairs to cache. + */ + function Stack(entries) { + var data = this.__data__ = new ListCache(entries); + this.size = data.size; + } + + /** + * Removes all key-value entries from the stack. + * + * @private + * @name clear + * @memberOf Stack + */ + function stackClear() { + this.__data__ = new ListCache; + this.size = 0; + } + + /** + * Removes `key` and its value from the stack. + * + * @private + * @name delete + * @memberOf Stack + * @param {string} key The key of the value to remove. + * @returns {boolean} Returns `true` if the entry was removed, else `false`. + */ + function stackDelete(key) { + var data = this.__data__, + result = data['delete'](key); + + this.size = data.size; + return result; + } + + /** + * Gets the stack value for `key`. + * + * @private + * @name get + * @memberOf Stack + * @param {string} key The key of the value to get. + * @returns {*} Returns the entry value. + */ + function stackGet(key) { + return this.__data__.get(key); + } + + /** + * Checks if a stack value for `key` exists. + * + * @private + * @name has + * @memberOf Stack + * @param {string} key The key of the entry to check. + * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. + */ + function stackHas(key) { + return this.__data__.has(key); + } + + /** + * Sets the stack `key` to `value`. + * + * @private + * @name set + * @memberOf Stack + * @param {string} key The key of the value to set. + * @param {*} value The value to set. + * @returns {Object} Returns the stack cache instance. + */ + function stackSet(key, value) { + var data = this.__data__; + if (data instanceof ListCache) { + var pairs = data.__data__; + if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) { + pairs.push([key, value]); + this.size = ++data.size; + return this; + } + data = this.__data__ = new MapCache(pairs); + } + data.set(key, value); + this.size = data.size; + return this; + } + + // Add methods to `Stack`. + Stack.prototype.clear = stackClear; + Stack.prototype['delete'] = stackDelete; + Stack.prototype.get = stackGet; + Stack.prototype.has = stackHas; + Stack.prototype.set = stackSet; + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of the enumerable property names of the array-like `value`. + * + * @private + * @param {*} value The value to query. + * @param {boolean} inherited Specify returning inherited property names. + * @returns {Array} Returns the array of property names. + */ + function arrayLikeKeys(value, inherited) { + var isArr = isArray(value), + isArg = !isArr && isArguments(value), + isBuff = !isArr && !isArg && isBuffer(value), + isType = !isArr && !isArg && !isBuff && isTypedArray(value), + skipIndexes = isArr || isArg || isBuff || isType, + result = skipIndexes ? baseTimes(value.length, String) : [], + length = result.length; + + for (var key in value) { + if ((inherited || hasOwnProperty.call(value, key)) && + !(skipIndexes && ( + // Safari 9 has enumerable `arguments.length` in strict mode. + key == 'length' || + // Node.js 0.10 has enumerable non-index properties on buffers. + (isBuff && (key == 'offset' || key == 'parent')) || + // PhantomJS 2 has enumerable non-index properties on typed arrays. + (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) || + // Skip index properties. + isIndex(key, length) + ))) { + result.push(key); + } + } + return result; + } + + /** + * A specialized version of `_.sample` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @returns {*} Returns the random element. + */ + function arraySample(array) { + var length = array.length; + return length ? array[baseRandom(0, length - 1)] : undefined; + } + + /** + * A specialized version of `_.sampleSize` for arrays. + * + * @private + * @param {Array} array The array to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function arraySampleSize(array, n) { + return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length)); + } + + /** + * A specialized version of `_.shuffle` for arrays. + * + * @private + * @param {Array} array The array to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function arrayShuffle(array) { + return shuffleSelf(copyArray(array)); + } + + /** + * This function is like `assignValue` except that it doesn't assign + * `undefined` values. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignMergeValue(object, key, value) { + if ((value !== undefined && !eq(object[key], value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Assigns `value` to `key` of `object` if the existing value is not equivalent + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function assignValue(object, key, value) { + var objValue = object[key]; + if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || + (value === undefined && !(key in object))) { + baseAssignValue(object, key, value); + } + } + + /** + * Gets the index at which the `key` is found in `array` of key-value pairs. + * + * @private + * @param {Array} array The array to inspect. + * @param {*} key The key to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + */ + function assocIndexOf(array, key) { + var length = array.length; + while (length--) { + if (eq(array[length][0], key)) { + return length; + } + } + return -1; + } + + /** + * Aggregates elements of `collection` on `accumulator` with keys transformed + * by `iteratee` and values set by `setter`. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform keys. + * @param {Object} accumulator The initial aggregated object. + * @returns {Function} Returns `accumulator`. + */ + function baseAggregator(collection, setter, iteratee, accumulator) { + baseEach(collection, function(value, key, collection) { + setter(accumulator, value, iteratee(value), collection); + }); + return accumulator; + } + + /** + * The base implementation of `_.assign` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssign(object, source) { + return object && copyObject(source, keys(source), object); + } + + /** + * The base implementation of `_.assignIn` without support for multiple sources + * or `customizer` functions. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @returns {Object} Returns `object`. + */ + function baseAssignIn(object, source) { + return object && copyObject(source, keysIn(source), object); + } + + /** + * The base implementation of `assignValue` and `assignMergeValue` without + * value checks. + * + * @private + * @param {Object} object The object to modify. + * @param {string} key The key of the property to assign. + * @param {*} value The value to assign. + */ + function baseAssignValue(object, key, value) { + if (key == '__proto__' && defineProperty) { + defineProperty(object, key, { + 'configurable': true, + 'enumerable': true, + 'value': value, + 'writable': true + }); + } else { + object[key] = value; + } + } + + /** + * The base implementation of `_.at` without support for individual paths. + * + * @private + * @param {Object} object The object to iterate over. + * @param {string[]} paths The property paths to pick. + * @returns {Array} Returns the picked elements. + */ + function baseAt(object, paths) { + var index = -1, + length = paths.length, + result = Array(length), + skip = object == null; + + while (++index < length) { + result[index] = skip ? undefined : get(object, paths[index]); + } + return result; + } + + /** + * The base implementation of `_.clamp` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + */ + function baseClamp(number, lower, upper) { + if (number === number) { + if (upper !== undefined) { + number = number <= upper ? number : upper; + } + if (lower !== undefined) { + number = number >= lower ? number : lower; + } + } + return number; + } + + /** + * The base implementation of `_.clone` and `_.cloneDeep` which tracks + * traversed objects. + * + * @private + * @param {*} value The value to clone. + * @param {boolean} bitmask The bitmask flags. + * 1 - Deep clone + * 2 - Flatten inherited properties + * 4 - Clone symbols + * @param {Function} [customizer] The function to customize cloning. + * @param {string} [key] The key of `value`. + * @param {Object} [object] The parent object of `value`. + * @param {Object} [stack] Tracks traversed objects and their clone counterparts. + * @returns {*} Returns the cloned value. + */ + function baseClone(value, bitmask, customizer, key, object, stack) { + var result, + isDeep = bitmask & CLONE_DEEP_FLAG, + isFlat = bitmask & CLONE_FLAT_FLAG, + isFull = bitmask & CLONE_SYMBOLS_FLAG; + + if (customizer) { + result = object ? customizer(value, key, object, stack) : customizer(value); + } + if (result !== undefined) { + return result; + } + if (!isObject(value)) { + return value; + } + var isArr = isArray(value); + if (isArr) { + result = initCloneArray(value); + if (!isDeep) { + return copyArray(value, result); + } + } else { + var tag = getTag(value), + isFunc = tag == funcTag || tag == genTag; + + if (isBuffer(value)) { + return cloneBuffer(value, isDeep); + } + if (tag == objectTag || tag == argsTag || (isFunc && !object)) { + result = (isFlat || isFunc) ? {} : initCloneObject(value); + if (!isDeep) { + return isFlat + ? copySymbolsIn(value, baseAssignIn(result, value)) + : copySymbols(value, baseAssign(result, value)); + } + } else { + if (!cloneableTags[tag]) { + return object ? value : {}; + } + result = initCloneByTag(value, tag, isDeep); + } + } + // Check for circular references and return its corresponding clone. + stack || (stack = new Stack); + var stacked = stack.get(value); + if (stacked) { + return stacked; + } + stack.set(value, result); + + if (isSet(value)) { + value.forEach(function(subValue) { + result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack)); + }); + + return result; + } + + if (isMap(value)) { + value.forEach(function(subValue, key) { + result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + + return result; + } + + var keysFunc = isFull + ? (isFlat ? getAllKeysIn : getAllKeys) + : (isFlat ? keysIn : keys); + + var props = isArr ? undefined : keysFunc(value); + arrayEach(props || value, function(subValue, key) { + if (props) { + key = subValue; + subValue = value[key]; + } + // Recursively populate clone (susceptible to call stack limits). + assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack)); + }); + return result; + } + + /** + * The base implementation of `_.conforms` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property predicates to conform to. + * @returns {Function} Returns the new spec function. + */ + function baseConforms(source) { + var props = keys(source); + return function(object) { + return baseConformsTo(object, source, props); + }; + } + + /** + * The base implementation of `_.conformsTo` which accepts `props` to check. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + */ + function baseConformsTo(object, source, props) { + var length = props.length; + if (object == null) { + return !length; + } + object = Object(object); + while (length--) { + var key = props[length], + predicate = source[key], + value = object[key]; + + if ((value === undefined && !(key in object)) || !predicate(value)) { + return false; + } + } + return true; + } + + /** + * The base implementation of `_.delay` and `_.defer` which accepts `args` + * to provide to `func`. + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {Array} args The arguments to provide to `func`. + * @returns {number|Object} Returns the timer id or timeout object. + */ + function baseDelay(func, wait, args) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return setTimeout(function() { func.apply(undefined, args); }, wait); + } + + /** + * The base implementation of methods like `_.difference` without support + * for excluding multiple arrays or iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Array} values The values to exclude. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + */ + function baseDifference(array, values, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + isCommon = true, + length = array.length, + result = [], + valuesLength = values.length; + + if (!length) { + return result; + } + if (iteratee) { + values = arrayMap(values, baseUnary(iteratee)); + } + if (comparator) { + includes = arrayIncludesWith; + isCommon = false; + } + else if (values.length >= LARGE_ARRAY_SIZE) { + includes = cacheHas; + isCommon = false; + values = new SetCache(values); + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee == null ? value : iteratee(value); + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var valuesIndex = valuesLength; + while (valuesIndex--) { + if (values[valuesIndex] === computed) { + continue outer; + } + } + result.push(value); + } + else if (!includes(values, computed, comparator)) { + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.forEach` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEach = createBaseEach(baseForOwn); + + /** + * The base implementation of `_.forEachRight` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + */ + var baseEachRight = createBaseEach(baseForOwnRight, true); + + /** + * The base implementation of `_.every` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false` + */ + function baseEvery(collection, predicate) { + var result = true; + baseEach(collection, function(value, index, collection) { + result = !!predicate(value, index, collection); + return result; + }); + return result; + } + + /** + * The base implementation of methods like `_.max` and `_.min` which accepts a + * `comparator` to determine the extremum value. + * + * @private + * @param {Array} array The array to iterate over. + * @param {Function} iteratee The iteratee invoked per iteration. + * @param {Function} comparator The comparator used to compare values. + * @returns {*} Returns the extremum value. + */ + function baseExtremum(array, iteratee, comparator) { + var index = -1, + length = array.length; + + while (++index < length) { + var value = array[index], + current = iteratee(value); + + if (current != null && (computed === undefined + ? (current === current && !isSymbol(current)) + : comparator(current, computed) + )) { + var computed = current, + result = value; + } + } + return result; + } + + /** + * The base implementation of `_.fill` without an iteratee call guard. + * + * @private + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + */ + function baseFill(array, value, start, end) { + var length = array.length; + + start = toInteger(start); + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = (end === undefined || end > length) ? length : toInteger(end); + if (end < 0) { + end += length; + } + end = start > end ? 0 : toLength(end); + while (start < end) { + array[start++] = value; + } + return array; + } + + /** + * The base implementation of `_.filter` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + */ + function baseFilter(collection, predicate) { + var result = []; + baseEach(collection, function(value, index, collection) { + if (predicate(value, index, collection)) { + result.push(value); + } + }); + return result; + } + + /** + * The base implementation of `_.flatten` with support for restricting flattening. + * + * @private + * @param {Array} array The array to flatten. + * @param {number} depth The maximum recursion depth. + * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. + * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. + * @param {Array} [result=[]] The initial result value. + * @returns {Array} Returns the new flattened array. + */ + function baseFlatten(array, depth, predicate, isStrict, result) { + var index = -1, + length = array.length; + + predicate || (predicate = isFlattenable); + result || (result = []); + + while (++index < length) { + var value = array[index]; + if (depth > 0 && predicate(value)) { + if (depth > 1) { + // Recursively flatten arrays (susceptible to call stack limits). + baseFlatten(value, depth - 1, predicate, isStrict, result); + } else { + arrayPush(result, value); + } + } else if (!isStrict) { + result[result.length] = value; + } + } + return result; + } + + /** + * The base implementation of `baseForOwn` which iterates over `object` + * properties returned by `keysFunc` and invokes `iteratee` for each property. + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseFor = createBaseFor(); + + /** + * This function is like `baseFor` except that it iterates over properties + * in the opposite order. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @param {Function} keysFunc The function to get the keys of `object`. + * @returns {Object} Returns `object`. + */ + var baseForRight = createBaseFor(true); + + /** + * The base implementation of `_.forOwn` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwn(object, iteratee) { + return object && baseFor(object, iteratee, keys); + } + + /** + * The base implementation of `_.forOwnRight` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Object} Returns `object`. + */ + function baseForOwnRight(object, iteratee) { + return object && baseForRight(object, iteratee, keys); + } + + /** + * The base implementation of `_.functions` which creates an array of + * `object` function property names filtered from `props`. + * + * @private + * @param {Object} object The object to inspect. + * @param {Array} props The property names to filter. + * @returns {Array} Returns the function names. + */ + function baseFunctions(object, props) { + return arrayFilter(props, function(key) { + return isFunction(object[key]); + }); + } + + /** + * The base implementation of `_.get` without support for default values. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @returns {*} Returns the resolved value. + */ + function baseGet(object, path) { + path = castPath(path, object); + + var index = 0, + length = path.length; + + while (object != null && index < length) { + object = object[toKey(path[index++])]; + } + return (index && index == length) ? object : undefined; + } + + /** + * The base implementation of `getAllKeys` and `getAllKeysIn` which uses + * `keysFunc` and `symbolsFunc` to get the enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Function} keysFunc The function to get the keys of `object`. + * @param {Function} symbolsFunc The function to get the symbols of `object`. + * @returns {Array} Returns the array of property names and symbols. + */ + function baseGetAllKeys(object, keysFunc, symbolsFunc) { + var result = keysFunc(object); + return isArray(object) ? result : arrayPush(result, symbolsFunc(object)); + } + + /** + * The base implementation of `getTag` without fallbacks for buggy environments. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + function baseGetTag(value) { + if (value == null) { + return value === undefined ? undefinedTag : nullTag; + } + return (symToStringTag && symToStringTag in Object(value)) + ? getRawTag(value) + : objectToString(value); + } + + /** + * The base implementation of `_.gt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + */ + function baseGt(value, other) { + return value > other; + } + + /** + * The base implementation of `_.has` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHas(object, key) { + return object != null && hasOwnProperty.call(object, key); + } + + /** + * The base implementation of `_.hasIn` without support for deep paths. + * + * @private + * @param {Object} [object] The object to query. + * @param {Array|string} key The key to check. + * @returns {boolean} Returns `true` if `key` exists, else `false`. + */ + function baseHasIn(object, key) { + return object != null && key in Object(object); + } + + /** + * The base implementation of `_.inRange` which doesn't coerce arguments. + * + * @private + * @param {number} number The number to check. + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + */ + function baseInRange(number, start, end) { + return number >= nativeMin(start, end) && number < nativeMax(start, end); + } + + /** + * The base implementation of methods like `_.intersection`, without support + * for iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of shared values. + */ + function baseIntersection(arrays, iteratee, comparator) { + var includes = comparator ? arrayIncludesWith : arrayIncludes, + length = arrays[0].length, + othLength = arrays.length, + othIndex = othLength, + caches = Array(othLength), + maxLength = Infinity, + result = []; + + while (othIndex--) { + var array = arrays[othIndex]; + if (othIndex && iteratee) { + array = arrayMap(array, baseUnary(iteratee)); + } + maxLength = nativeMin(array.length, maxLength); + caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120)) + ? new SetCache(othIndex && array) + : undefined; + } + array = arrays[0]; + + var index = -1, + seen = caches[0]; + + outer: + while (++index < length && result.length < maxLength) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (!(seen + ? cacheHas(seen, computed) + : includes(result, computed, comparator) + )) { + othIndex = othLength; + while (--othIndex) { + var cache = caches[othIndex]; + if (!(cache + ? cacheHas(cache, computed) + : includes(arrays[othIndex], computed, comparator)) + ) { + continue outer; + } + } + if (seen) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.invert` and `_.invertBy` which inverts + * `object` with values transformed by `iteratee` and set by `setter`. + * + * @private + * @param {Object} object The object to iterate over. + * @param {Function} setter The function to set `accumulator` values. + * @param {Function} iteratee The iteratee to transform values. + * @param {Object} accumulator The initial inverted object. + * @returns {Function} Returns `accumulator`. + */ + function baseInverter(object, setter, iteratee, accumulator) { + baseForOwn(object, function(value, key, object) { + setter(accumulator, iteratee(value), key, object); + }); + return accumulator; + } + + /** + * The base implementation of `_.invoke` without support for individual + * method arguments. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {Array} args The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + */ + function baseInvoke(object, path, args) { + path = castPath(path, object); + object = parent(object, path); + var func = object == null ? object : object[toKey(last(path))]; + return func == null ? undefined : apply(func, object, args); + } + + /** + * The base implementation of `_.isArguments`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + */ + function baseIsArguments(value) { + return isObjectLike(value) && baseGetTag(value) == argsTag; + } + + /** + * The base implementation of `_.isArrayBuffer` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + */ + function baseIsArrayBuffer(value) { + return isObjectLike(value) && baseGetTag(value) == arrayBufferTag; + } + + /** + * The base implementation of `_.isDate` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + */ + function baseIsDate(value) { + return isObjectLike(value) && baseGetTag(value) == dateTag; + } + + /** + * The base implementation of `_.isEqual` which supports partial comparisons + * and tracks traversed objects. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {boolean} bitmask The bitmask flags. + * 1 - Unordered comparison + * 2 - Partial comparison + * @param {Function} [customizer] The function to customize comparisons. + * @param {Object} [stack] Tracks traversed `value` and `other` objects. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + */ + function baseIsEqual(value, other, bitmask, customizer, stack) { + if (value === other) { + return true; + } + if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) { + return value !== value && other !== other; + } + return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack); + } + + /** + * A specialized version of `baseIsEqual` for arrays and objects which performs + * deep comparisons and tracks traversed objects enabling objects with circular + * references to be compared. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} [stack] Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) { + var objIsArr = isArray(object), + othIsArr = isArray(other), + objTag = objIsArr ? arrayTag : getTag(object), + othTag = othIsArr ? arrayTag : getTag(other); + + objTag = objTag == argsTag ? objectTag : objTag; + othTag = othTag == argsTag ? objectTag : othTag; + + var objIsObj = objTag == objectTag, + othIsObj = othTag == objectTag, + isSameTag = objTag == othTag; + + if (isSameTag && isBuffer(object)) { + if (!isBuffer(other)) { + return false; + } + objIsArr = true; + objIsObj = false; + } + if (isSameTag && !objIsObj) { + stack || (stack = new Stack); + return (objIsArr || isTypedArray(object)) + ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) + : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack); + } + if (!(bitmask & COMPARE_PARTIAL_FLAG)) { + var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'), + othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__'); + + if (objIsWrapped || othIsWrapped) { + var objUnwrapped = objIsWrapped ? object.value() : object, + othUnwrapped = othIsWrapped ? other.value() : other; + + stack || (stack = new Stack); + return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack); + } + } + if (!isSameTag) { + return false; + } + stack || (stack = new Stack); + return equalObjects(object, other, bitmask, customizer, equalFunc, stack); + } + + /** + * The base implementation of `_.isMap` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + */ + function baseIsMap(value) { + return isObjectLike(value) && getTag(value) == mapTag; + } + + /** + * The base implementation of `_.isMatch` without support for iteratee shorthands. + * + * @private + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Array} matchData The property names, values, and compare flags to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + */ + function baseIsMatch(object, source, matchData, customizer) { + var index = matchData.length, + length = index, + noCustomizer = !customizer; + + if (object == null) { + return !length; + } + object = Object(object); + while (index--) { + var data = matchData[index]; + if ((noCustomizer && data[2]) + ? data[1] !== object[data[0]] + : !(data[0] in object) + ) { + return false; + } + } + while (++index < length) { + data = matchData[index]; + var key = data[0], + objValue = object[key], + srcValue = data[1]; + + if (noCustomizer && data[2]) { + if (objValue === undefined && !(key in object)) { + return false; + } + } else { + var stack = new Stack; + if (customizer) { + var result = customizer(objValue, srcValue, key, object, source, stack); + } + if (!(result === undefined + ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) + : result + )) { + return false; + } + } + } + return true; + } + + /** + * The base implementation of `_.isNative` without bad shim checks. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + */ + function baseIsNative(value) { + if (!isObject(value) || isMasked(value)) { + return false; + } + var pattern = isFunction(value) ? reIsNative : reIsHostCtor; + return pattern.test(toSource(value)); + } + + /** + * The base implementation of `_.isRegExp` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + */ + function baseIsRegExp(value) { + return isObjectLike(value) && baseGetTag(value) == regexpTag; + } + + /** + * The base implementation of `_.isSet` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + */ + function baseIsSet(value) { + return isObjectLike(value) && getTag(value) == setTag; + } + + /** + * The base implementation of `_.isTypedArray` without Node.js optimizations. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + */ + function baseIsTypedArray(value) { + return isObjectLike(value) && + isLength(value.length) && !!typedArrayTags[baseGetTag(value)]; + } + + /** + * The base implementation of `_.iteratee`. + * + * @private + * @param {*} [value=_.identity] The value to convert to an iteratee. + * @returns {Function} Returns the iteratee. + */ + function baseIteratee(value) { + // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9. + // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details. + if (typeof value == 'function') { + return value; + } + if (value == null) { + return identity; + } + if (typeof value == 'object') { + return isArray(value) + ? baseMatchesProperty(value[0], value[1]) + : baseMatches(value); + } + return property(value); + } + + /** + * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeys(object) { + if (!isPrototype(object)) { + return nativeKeys(object); + } + var result = []; + for (var key in Object(object)) { + if (hasOwnProperty.call(object, key) && key != 'constructor') { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function baseKeysIn(object) { + if (!isObject(object)) { + return nativeKeysIn(object); + } + var isProto = isPrototype(object), + result = []; + + for (var key in object) { + if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) { + result.push(key); + } + } + return result; + } + + /** + * The base implementation of `_.lt` which doesn't coerce arguments. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + */ + function baseLt(value, other) { + return value < other; + } + + /** + * The base implementation of `_.map` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} iteratee The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + */ + function baseMap(collection, iteratee) { + var index = -1, + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value, key, collection) { + result[++index] = iteratee(value, key, collection); + }); + return result; + } + + /** + * The base implementation of `_.matches` which doesn't clone `source`. + * + * @private + * @param {Object} source The object of property values to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatches(source) { + var matchData = getMatchData(source); + if (matchData.length == 1 && matchData[0][2]) { + return matchesStrictComparable(matchData[0][0], matchData[0][1]); + } + return function(object) { + return object === source || baseIsMatch(object, source, matchData); + }; + } + + /** + * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`. + * + * @private + * @param {string} path The path of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function baseMatchesProperty(path, srcValue) { + if (isKey(path) && isStrictComparable(srcValue)) { + return matchesStrictComparable(toKey(path), srcValue); + } + return function(object) { + var objValue = get(object, path); + return (objValue === undefined && objValue === srcValue) + ? hasIn(object, path) + : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG); + }; + } + + /** + * The base implementation of `_.merge` without support for multiple sources. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {number} srcIndex The index of `source`. + * @param {Function} [customizer] The function to customize merged values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMerge(object, source, srcIndex, customizer, stack) { + if (object === source) { + return; + } + baseFor(source, function(srcValue, key) { + if (isObject(srcValue)) { + stack || (stack = new Stack); + baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack); + } + else { + var newValue = customizer + ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack) + : undefined; + + if (newValue === undefined) { + newValue = srcValue; + } + assignMergeValue(object, key, newValue); + } + }, keysIn); + } + + /** + * A specialized version of `baseMerge` for arrays and objects which performs + * deep merges and tracks traversed objects enabling objects with circular + * references to be merged. + * + * @private + * @param {Object} object The destination object. + * @param {Object} source The source object. + * @param {string} key The key of the value to merge. + * @param {number} srcIndex The index of `source`. + * @param {Function} mergeFunc The function to merge values. + * @param {Function} [customizer] The function to customize assigned values. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + */ + function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) { + var objValue = safeGet(object, key), + srcValue = safeGet(source, key), + stacked = stack.get(srcValue); + + if (stacked) { + assignMergeValue(object, key, stacked); + return; + } + var newValue = customizer + ? customizer(objValue, srcValue, (key + ''), object, source, stack) + : undefined; + + var isCommon = newValue === undefined; + + if (isCommon) { + var isArr = isArray(srcValue), + isBuff = !isArr && isBuffer(srcValue), + isTyped = !isArr && !isBuff && isTypedArray(srcValue); + + newValue = srcValue; + if (isArr || isBuff || isTyped) { + if (isArray(objValue)) { + newValue = objValue; + } + else if (isArrayLikeObject(objValue)) { + newValue = copyArray(objValue); + } + else if (isBuff) { + isCommon = false; + newValue = cloneBuffer(srcValue, true); + } + else if (isTyped) { + isCommon = false; + newValue = cloneTypedArray(srcValue, true); + } + else { + newValue = []; + } + } + else if (isPlainObject(srcValue) || isArguments(srcValue)) { + newValue = objValue; + if (isArguments(objValue)) { + newValue = toPlainObject(objValue); + } + else if (!isObject(objValue) || (srcIndex && isFunction(objValue))) { + newValue = initCloneObject(srcValue); + } + } + else { + isCommon = false; + } + } + if (isCommon) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, newValue); + mergeFunc(newValue, srcValue, srcIndex, customizer, stack); + stack['delete'](srcValue); + } + assignMergeValue(object, key, newValue); + } + + /** + * The base implementation of `_.nth` which doesn't coerce arguments. + * + * @private + * @param {Array} array The array to query. + * @param {number} n The index of the element to return. + * @returns {*} Returns the nth element of `array`. + */ + function baseNth(array, n) { + var length = array.length; + if (!length) { + return; + } + n += n < 0 ? length : 0; + return isIndex(n, length) ? array[n] : undefined; + } + + /** + * The base implementation of `_.orderBy` without param guards. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by. + * @param {string[]} orders The sort orders of `iteratees`. + * @returns {Array} Returns the new sorted array. + */ + function baseOrderBy(collection, iteratees, orders) { + var index = -1; + iteratees = arrayMap(iteratees.length ? iteratees : [identity], baseUnary(getIteratee())); + + var result = baseMap(collection, function(value, key, collection) { + var criteria = arrayMap(iteratees, function(iteratee) { + return iteratee(value); + }); + return { 'criteria': criteria, 'index': ++index, 'value': value }; + }); + + return baseSortBy(result, function(object, other) { + return compareMultiple(object, other, orders); + }); + } + + /** + * The base implementation of `_.pick` without support for individual + * property identifiers. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @returns {Object} Returns the new object. + */ + function basePick(object, paths) { + return basePickBy(object, paths, function(value, path) { + return hasIn(object, path); + }); + } + + /** + * The base implementation of `_.pickBy` without support for iteratee shorthands. + * + * @private + * @param {Object} object The source object. + * @param {string[]} paths The property paths to pick. + * @param {Function} predicate The function invoked per property. + * @returns {Object} Returns the new object. + */ + function basePickBy(object, paths, predicate) { + var index = -1, + length = paths.length, + result = {}; + + while (++index < length) { + var path = paths[index], + value = baseGet(object, path); + + if (predicate(value, path)) { + baseSet(result, castPath(path, object), value); + } + } + return result; + } + + /** + * A specialized version of `baseProperty` which supports deep paths. + * + * @private + * @param {Array|string} path The path of the property to get. + * @returns {Function} Returns the new accessor function. + */ + function basePropertyDeep(path) { + return function(object) { + return baseGet(object, path); + }; + } + + /** + * The base implementation of `_.pullAllBy` without support for iteratee + * shorthands. + * + * @private + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + */ + function basePullAll(array, values, iteratee, comparator) { + var indexOf = comparator ? baseIndexOfWith : baseIndexOf, + index = -1, + length = values.length, + seen = array; + + if (array === values) { + values = copyArray(values); + } + if (iteratee) { + seen = arrayMap(array, baseUnary(iteratee)); + } + while (++index < length) { + var fromIndex = 0, + value = values[index], + computed = iteratee ? iteratee(value) : value; + + while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) { + if (seen !== array) { + splice.call(seen, fromIndex, 1); + } + splice.call(array, fromIndex, 1); + } + } + return array; + } + + /** + * The base implementation of `_.pullAt` without support for individual + * indexes or capturing the removed elements. + * + * @private + * @param {Array} array The array to modify. + * @param {number[]} indexes The indexes of elements to remove. + * @returns {Array} Returns `array`. + */ + function basePullAt(array, indexes) { + var length = array ? indexes.length : 0, + lastIndex = length - 1; + + while (length--) { + var index = indexes[length]; + if (length == lastIndex || index !== previous) { + var previous = index; + if (isIndex(index)) { + splice.call(array, index, 1); + } else { + baseUnset(array, index); + } + } + } + return array; + } + + /** + * The base implementation of `_.random` without support for returning + * floating-point numbers. + * + * @private + * @param {number} lower The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the random number. + */ + function baseRandom(lower, upper) { + return lower + nativeFloor(nativeRandom() * (upper - lower + 1)); + } + + /** + * The base implementation of `_.range` and `_.rangeRight` which doesn't + * coerce arguments. + * + * @private + * @param {number} start The start of the range. + * @param {number} end The end of the range. + * @param {number} step The value to increment or decrement by. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the range of numbers. + */ + function baseRange(start, end, step, fromRight) { + var index = -1, + length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), + result = Array(length); + + while (length--) { + result[fromRight ? length : ++index] = start; + start += step; + } + return result; + } + + /** + * The base implementation of `_.repeat` which doesn't coerce arguments. + * + * @private + * @param {string} string The string to repeat. + * @param {number} n The number of times to repeat the string. + * @returns {string} Returns the repeated string. + */ + function baseRepeat(string, n) { + var result = ''; + if (!string || n < 1 || n > MAX_SAFE_INTEGER) { + return result; + } + // Leverage the exponentiation by squaring algorithm for a faster repeat. + // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details. + do { + if (n % 2) { + result += string; + } + n = nativeFloor(n / 2); + if (n) { + string += string; + } + } while (n); + + return result; + } + + /** + * The base implementation of `_.rest` which doesn't validate or coerce arguments. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + */ + function baseRest(func, start) { + return setToString(overRest(func, start, identity), func + ''); + } + + /** + * The base implementation of `_.sample`. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + */ + function baseSample(collection) { + return arraySample(values(collection)); + } + + /** + * The base implementation of `_.sampleSize` without param guards. + * + * @private + * @param {Array|Object} collection The collection to sample. + * @param {number} n The number of elements to sample. + * @returns {Array} Returns the random elements. + */ + function baseSampleSize(collection, n) { + var array = values(collection); + return shuffleSelf(array, baseClamp(n, 0, array.length)); + } + + /** + * The base implementation of `_.set`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseSet(object, path, value, customizer) { + if (!isObject(object)) { + return object; + } + path = castPath(path, object); + + var index = -1, + length = path.length, + lastIndex = length - 1, + nested = object; + + while (nested != null && ++index < length) { + var key = toKey(path[index]), + newValue = value; + + if (index != lastIndex) { + var objValue = nested[key]; + newValue = customizer ? customizer(objValue, key, nested) : undefined; + if (newValue === undefined) { + newValue = isObject(objValue) + ? objValue + : (isIndex(path[index + 1]) ? [] : {}); + } + } + assignValue(nested, key, newValue); + nested = nested[key]; + } + return object; + } + + /** + * The base implementation of `setData` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var baseSetData = !metaMap ? identity : function(func, data) { + metaMap.set(func, data); + return func; + }; + + /** + * The base implementation of `setToString` without support for hot loop shorting. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var baseSetToString = !defineProperty ? identity : function(func, string) { + return defineProperty(func, 'toString', { + 'configurable': true, + 'enumerable': false, + 'value': constant(string), + 'writable': true + }); + }; + + /** + * The base implementation of `_.shuffle`. + * + * @private + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + */ + function baseShuffle(collection) { + return shuffleSelf(values(collection)); + } + + /** + * The base implementation of `_.slice` without an iteratee call guard. + * + * @private + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function baseSlice(array, start, end) { + var index = -1, + length = array.length; + + if (start < 0) { + start = -start > length ? 0 : (length + start); + } + end = end > length ? length : end; + if (end < 0) { + end += length; + } + length = start > end ? 0 : ((end - start) >>> 0); + start >>>= 0; + + var result = Array(length); + while (++index < length) { + result[index] = array[index + start]; + } + return result; + } + + /** + * The base implementation of `_.some` without support for iteratee shorthands. + * + * @private + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} predicate The function invoked per iteration. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + */ + function baseSome(collection, predicate) { + var result; + + baseEach(collection, function(value, index, collection) { + result = predicate(value, index, collection); + return !result; + }); + return !!result; + } + + /** + * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which + * performs a binary search of `array` to determine the index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndex(array, value, retHighest) { + var low = 0, + high = array == null ? low : array.length; + + if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) { + while (low < high) { + var mid = (low + high) >>> 1, + computed = array[mid]; + + if (computed !== null && !isSymbol(computed) && + (retHighest ? (computed <= value) : (computed < value))) { + low = mid + 1; + } else { + high = mid; + } + } + return high; + } + return baseSortedIndexBy(array, value, identity, retHighest); + } + + /** + * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy` + * which invokes `iteratee` for `value` and each element of `array` to compute + * their sort ranking. The iteratee is invoked with one argument; (value). + * + * @private + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} iteratee The iteratee invoked per element. + * @param {boolean} [retHighest] Specify returning the highest qualified index. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + */ + function baseSortedIndexBy(array, value, iteratee, retHighest) { + value = iteratee(value); + + var low = 0, + high = array == null ? 0 : array.length, + valIsNaN = value !== value, + valIsNull = value === null, + valIsSymbol = isSymbol(value), + valIsUndefined = value === undefined; + + while (low < high) { + var mid = nativeFloor((low + high) / 2), + computed = iteratee(array[mid]), + othIsDefined = computed !== undefined, + othIsNull = computed === null, + othIsReflexive = computed === computed, + othIsSymbol = isSymbol(computed); + + if (valIsNaN) { + var setLow = retHighest || othIsReflexive; + } else if (valIsUndefined) { + setLow = othIsReflexive && (retHighest || othIsDefined); + } else if (valIsNull) { + setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull); + } else if (valIsSymbol) { + setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol); + } else if (othIsNull || othIsSymbol) { + setLow = false; + } else { + setLow = retHighest ? (computed <= value) : (computed < value); + } + if (setLow) { + low = mid + 1; + } else { + high = mid; + } + } + return nativeMin(high, MAX_ARRAY_INDEX); + } + + /** + * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without + * support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseSortedUniq(array, iteratee) { + var index = -1, + length = array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + if (!index || !eq(computed, seen)) { + var seen = computed; + result[resIndex++] = value === 0 ? 0 : value; + } + } + return result; + } + + /** + * The base implementation of `_.toNumber` which doesn't ensure correct + * conversions of binary, hexadecimal, or octal string values. + * + * @private + * @param {*} value The value to process. + * @returns {number} Returns the number. + */ + function baseToNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + return +value; + } + + /** + * The base implementation of `_.toString` which doesn't convert nullish + * values to empty strings. + * + * @private + * @param {*} value The value to process. + * @returns {string} Returns the string. + */ + function baseToString(value) { + // Exit early for strings to avoid a performance hit in some environments. + if (typeof value == 'string') { + return value; + } + if (isArray(value)) { + // Recursively convert values (susceptible to call stack limits). + return arrayMap(value, baseToString) + ''; + } + if (isSymbol(value)) { + return symbolToString ? symbolToString.call(value) : ''; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * The base implementation of `_.uniqBy` without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + */ + function baseUniq(array, iteratee, comparator) { + var index = -1, + includes = arrayIncludes, + length = array.length, + isCommon = true, + result = [], + seen = result; + + if (comparator) { + isCommon = false; + includes = arrayIncludesWith; + } + else if (length >= LARGE_ARRAY_SIZE) { + var set = iteratee ? null : createSet(array); + if (set) { + return setToArray(set); + } + isCommon = false; + includes = cacheHas; + seen = new SetCache; + } + else { + seen = iteratee ? [] : result; + } + outer: + while (++index < length) { + var value = array[index], + computed = iteratee ? iteratee(value) : value; + + value = (comparator || value !== 0) ? value : 0; + if (isCommon && computed === computed) { + var seenIndex = seen.length; + while (seenIndex--) { + if (seen[seenIndex] === computed) { + continue outer; + } + } + if (iteratee) { + seen.push(computed); + } + result.push(value); + } + else if (!includes(seen, computed, comparator)) { + if (seen !== result) { + seen.push(computed); + } + result.push(value); + } + } + return result; + } + + /** + * The base implementation of `_.unset`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The property path to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + */ + function baseUnset(object, path) { + path = castPath(path, object); + object = parent(object, path); + return object == null || delete object[toKey(last(path))]; + } + + /** + * The base implementation of `_.update`. + * + * @private + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to update. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize path creation. + * @returns {Object} Returns `object`. + */ + function baseUpdate(object, path, updater, customizer) { + return baseSet(object, path, updater(baseGet(object, path)), customizer); + } + + /** + * The base implementation of methods like `_.dropWhile` and `_.takeWhile` + * without support for iteratee shorthands. + * + * @private + * @param {Array} array The array to query. + * @param {Function} predicate The function invoked per iteration. + * @param {boolean} [isDrop] Specify dropping elements instead of taking them. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Array} Returns the slice of `array`. + */ + function baseWhile(array, predicate, isDrop, fromRight) { + var length = array.length, + index = fromRight ? length : -1; + + while ((fromRight ? index-- : ++index < length) && + predicate(array[index], index, array)) {} + + return isDrop + ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length)) + : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index)); + } + + /** + * The base implementation of `wrapperValue` which returns the result of + * performing a sequence of actions on the unwrapped `value`, where each + * successive action is supplied the return value of the previous. + * + * @private + * @param {*} value The unwrapped value. + * @param {Array} actions Actions to perform to resolve the unwrapped value. + * @returns {*} Returns the resolved value. + */ + function baseWrapperValue(value, actions) { + var result = value; + if (result instanceof LazyWrapper) { + result = result.value(); + } + return arrayReduce(actions, function(result, action) { + return action.func.apply(action.thisArg, arrayPush([result], action.args)); + }, result); + } + + /** + * The base implementation of methods like `_.xor`, without support for + * iteratee shorthands, that accepts an array of arrays to inspect. + * + * @private + * @param {Array} arrays The arrays to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of values. + */ + function baseXor(arrays, iteratee, comparator) { + var length = arrays.length; + if (length < 2) { + return length ? baseUniq(arrays[0]) : []; + } + var index = -1, + result = Array(length); + + while (++index < length) { + var array = arrays[index], + othIndex = -1; + + while (++othIndex < length) { + if (othIndex != index) { + result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator); + } + } + } + return baseUniq(baseFlatten(result, 1), iteratee, comparator); + } + + /** + * This base implementation of `_.zipObject` which assigns values using `assignFunc`. + * + * @private + * @param {Array} props The property identifiers. + * @param {Array} values The property values. + * @param {Function} assignFunc The function to assign values. + * @returns {Object} Returns the new object. + */ + function baseZipObject(props, values, assignFunc) { + var index = -1, + length = props.length, + valsLength = values.length, + result = {}; + + while (++index < length) { + var value = index < valsLength ? values[index] : undefined; + assignFunc(result, props[index], value); + } + return result; + } + + /** + * Casts `value` to an empty array if it's not an array like object. + * + * @private + * @param {*} value The value to inspect. + * @returns {Array|Object} Returns the cast array-like object. + */ + function castArrayLikeObject(value) { + return isArrayLikeObject(value) ? value : []; + } + + /** + * Casts `value` to `identity` if it's not a function. + * + * @private + * @param {*} value The value to inspect. + * @returns {Function} Returns cast function. + */ + function castFunction(value) { + return typeof value == 'function' ? value : identity; + } + + /** + * Casts `value` to a path array if it's not one. + * + * @private + * @param {*} value The value to inspect. + * @param {Object} [object] The object to query keys on. + * @returns {Array} Returns the cast property path array. + */ + function castPath(value, object) { + if (isArray(value)) { + return value; + } + return isKey(value, object) ? [value] : stringToPath(toString(value)); + } + + /** + * A `baseRest` alias which can be replaced with `identity` by module + * replacement plugins. + * + * @private + * @type {Function} + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + var castRest = baseRest; + + /** + * Casts `array` to a slice if it's needed. + * + * @private + * @param {Array} array The array to inspect. + * @param {number} start The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the cast slice. + */ + function castSlice(array, start, end) { + var length = array.length; + end = end === undefined ? length : end; + return (!start && end >= length) ? array : baseSlice(array, start, end); + } + + /** + * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout). + * + * @private + * @param {number|Object} id The timer id or timeout object of the timer to clear. + */ + var clearTimeout = ctxClearTimeout || function(id) { + return root.clearTimeout(id); + }; + + /** + * Creates a clone of `buffer`. + * + * @private + * @param {Buffer} buffer The buffer to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Buffer} Returns the cloned buffer. + */ + function cloneBuffer(buffer, isDeep) { + if (isDeep) { + return buffer.slice(); + } + var length = buffer.length, + result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length); + + buffer.copy(result); + return result; + } + + /** + * Creates a clone of `arrayBuffer`. + * + * @private + * @param {ArrayBuffer} arrayBuffer The array buffer to clone. + * @returns {ArrayBuffer} Returns the cloned array buffer. + */ + function cloneArrayBuffer(arrayBuffer) { + var result = new arrayBuffer.constructor(arrayBuffer.byteLength); + new Uint8Array(result).set(new Uint8Array(arrayBuffer)); + return result; + } + + /** + * Creates a clone of `dataView`. + * + * @private + * @param {Object} dataView The data view to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned data view. + */ + function cloneDataView(dataView, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer; + return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength); + } + + /** + * Creates a clone of `regexp`. + * + * @private + * @param {Object} regexp The regexp to clone. + * @returns {Object} Returns the cloned regexp. + */ + function cloneRegExp(regexp) { + var result = new regexp.constructor(regexp.source, reFlags.exec(regexp)); + result.lastIndex = regexp.lastIndex; + return result; + } + + /** + * Creates a clone of the `symbol` object. + * + * @private + * @param {Object} symbol The symbol object to clone. + * @returns {Object} Returns the cloned symbol object. + */ + function cloneSymbol(symbol) { + return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {}; + } + + /** + * Creates a clone of `typedArray`. + * + * @private + * @param {Object} typedArray The typed array to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the cloned typed array. + */ + function cloneTypedArray(typedArray, isDeep) { + var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer; + return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length); + } + + /** + * Compares values to sort them in ascending order. + * + * @private + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {number} Returns the sort order indicator for `value`. + */ + function compareAscending(value, other) { + if (value !== other) { + var valIsDefined = value !== undefined, + valIsNull = value === null, + valIsReflexive = value === value, + valIsSymbol = isSymbol(value); + + var othIsDefined = other !== undefined, + othIsNull = other === null, + othIsReflexive = other === other, + othIsSymbol = isSymbol(other); + + if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) || + (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) || + (valIsNull && othIsDefined && othIsReflexive) || + (!valIsDefined && othIsReflexive) || + !valIsReflexive) { + return 1; + } + if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) || + (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) || + (othIsNull && valIsDefined && valIsReflexive) || + (!othIsDefined && valIsReflexive) || + !othIsReflexive) { + return -1; + } + } + return 0; + } + + /** + * Used by `_.orderBy` to compare multiple properties of a value to another + * and stable sort them. + * + * If `orders` is unspecified, all values are sorted in ascending order. Otherwise, + * specify an order of "desc" for descending or "asc" for ascending sort order + * of corresponding values. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {boolean[]|string[]} orders The order to sort by for each property. + * @returns {number} Returns the sort order indicator for `object`. + */ + function compareMultiple(object, other, orders) { + var index = -1, + objCriteria = object.criteria, + othCriteria = other.criteria, + length = objCriteria.length, + ordersLength = orders.length; + + while (++index < length) { + var result = compareAscending(objCriteria[index], othCriteria[index]); + if (result) { + if (index >= ordersLength) { + return result; + } + var order = orders[index]; + return result * (order == 'desc' ? -1 : 1); + } + } + // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications + // that causes it, under certain circumstances, to provide the same value for + // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247 + // for more details. + // + // This also ensures a stable sort in V8 and other engines. + // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details. + return object.index - other.index; + } + + /** + * Creates an array that is the composition of partially applied arguments, + * placeholders, and provided arguments into a single array of arguments. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to prepend to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgs(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersLength = holders.length, + leftIndex = -1, + leftLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(leftLength + rangeLength), + isUncurried = !isCurried; + + while (++leftIndex < leftLength) { + result[leftIndex] = partials[leftIndex]; + } + while (++argsIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[holders[argsIndex]] = args[argsIndex]; + } + } + while (rangeLength--) { + result[leftIndex++] = args[argsIndex++]; + } + return result; + } + + /** + * This function is like `composeArgs` except that the arguments composition + * is tailored for `_.partialRight`. + * + * @private + * @param {Array} args The provided arguments. + * @param {Array} partials The arguments to append to those provided. + * @param {Array} holders The `partials` placeholder indexes. + * @params {boolean} [isCurried] Specify composing for a curried function. + * @returns {Array} Returns the new array of composed arguments. + */ + function composeArgsRight(args, partials, holders, isCurried) { + var argsIndex = -1, + argsLength = args.length, + holdersIndex = -1, + holdersLength = holders.length, + rightIndex = -1, + rightLength = partials.length, + rangeLength = nativeMax(argsLength - holdersLength, 0), + result = Array(rangeLength + rightLength), + isUncurried = !isCurried; + + while (++argsIndex < rangeLength) { + result[argsIndex] = args[argsIndex]; + } + var offset = argsIndex; + while (++rightIndex < rightLength) { + result[offset + rightIndex] = partials[rightIndex]; + } + while (++holdersIndex < holdersLength) { + if (isUncurried || argsIndex < argsLength) { + result[offset + holders[holdersIndex]] = args[argsIndex++]; + } + } + return result; + } + + /** + * Copies the values of `source` to `array`. + * + * @private + * @param {Array} source The array to copy values from. + * @param {Array} [array=[]] The array to copy values to. + * @returns {Array} Returns `array`. + */ + function copyArray(source, array) { + var index = -1, + length = source.length; + + array || (array = Array(length)); + while (++index < length) { + array[index] = source[index]; + } + return array; + } + + /** + * Copies properties of `source` to `object`. + * + * @private + * @param {Object} source The object to copy properties from. + * @param {Array} props The property identifiers to copy. + * @param {Object} [object={}] The object to copy properties to. + * @param {Function} [customizer] The function to customize copied values. + * @returns {Object} Returns `object`. + */ + function copyObject(source, props, object, customizer) { + var isNew = !object; + object || (object = {}); + + var index = -1, + length = props.length; + + while (++index < length) { + var key = props[index]; + + var newValue = customizer + ? customizer(object[key], source[key], key, object, source) + : undefined; + + if (newValue === undefined) { + newValue = source[key]; + } + if (isNew) { + baseAssignValue(object, key, newValue); + } else { + assignValue(object, key, newValue); + } + } + return object; + } + + /** + * Copies own symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbols(source, object) { + return copyObject(source, getSymbols(source), object); + } + + /** + * Copies own and inherited symbols of `source` to `object`. + * + * @private + * @param {Object} source The object to copy symbols from. + * @param {Object} [object={}] The object to copy symbols to. + * @returns {Object} Returns `object`. + */ + function copySymbolsIn(source, object) { + return copyObject(source, getSymbolsIn(source), object); + } + + /** + * Creates a function like `_.groupBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} [initializer] The accumulator object initializer. + * @returns {Function} Returns the new aggregator function. + */ + function createAggregator(setter, initializer) { + return function(collection, iteratee) { + var func = isArray(collection) ? arrayAggregator : baseAggregator, + accumulator = initializer ? initializer() : {}; + + return func(collection, setter, getIteratee(iteratee, 2), accumulator); + }; + } + + /** + * Creates a function like `_.assign`. + * + * @private + * @param {Function} assigner The function to assign values. + * @returns {Function} Returns the new assigner function. + */ + function createAssigner(assigner) { + return baseRest(function(object, sources) { + var index = -1, + length = sources.length, + customizer = length > 1 ? sources[length - 1] : undefined, + guard = length > 2 ? sources[2] : undefined; + + customizer = (assigner.length > 3 && typeof customizer == 'function') + ? (length--, customizer) + : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + customizer = length < 3 ? undefined : customizer; + length = 1; + } + object = Object(object); + while (++index < length) { + var source = sources[index]; + if (source) { + assigner(object, source, index, customizer); + } + } + return object; + }); + } + + /** + * Creates a `baseEach` or `baseEachRight` function. + * + * @private + * @param {Function} eachFunc The function to iterate over a collection. + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseEach(eachFunc, fromRight) { + return function(collection, iteratee) { + if (collection == null) { + return collection; + } + if (!isArrayLike(collection)) { + return eachFunc(collection, iteratee); + } + var length = collection.length, + index = fromRight ? length : -1, + iterable = Object(collection); + + while ((fromRight ? index-- : ++index < length)) { + if (iteratee(iterable[index], index, iterable) === false) { + break; + } + } + return collection; + }; + } + + /** + * Creates a base function for methods like `_.forIn` and `_.forOwn`. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new base function. + */ + function createBaseFor(fromRight) { + return function(object, iteratee, keysFunc) { + var index = -1, + iterable = Object(object), + props = keysFunc(object), + length = props.length; + + while (length--) { + var key = props[fromRight ? length : ++index]; + if (iteratee(iterable[key], key, iterable) === false) { + break; + } + } + return object; + }; + } + + /** + * Creates a function that wraps `func` to invoke it with the optional `this` + * binding of `thisArg`. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createBind(func, bitmask, thisArg) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return fn.apply(isBind ? thisArg : this, arguments); + } + return wrapper; + } + + /** + * Creates a function like `_.lowerFirst`. + * + * @private + * @param {string} methodName The name of the `String` case method to use. + * @returns {Function} Returns the new case function. + */ + function createCaseFirst(methodName) { + return function(string) { + string = toString(string); + + var strSymbols = hasUnicode(string) + ? stringToArray(string) + : undefined; + + var chr = strSymbols + ? strSymbols[0] + : string.charAt(0); + + var trailing = strSymbols + ? castSlice(strSymbols, 1).join('') + : string.slice(1); + + return chr[methodName]() + trailing; + }; + } + + /** + * Creates a function like `_.camelCase`. + * + * @private + * @param {Function} callback The function to combine each word. + * @returns {Function} Returns the new compounder function. + */ + function createCompounder(callback) { + return function(string) { + return arrayReduce(words(deburr(string).replace(reApos, '')), callback, ''); + }; + } + + /** + * Creates a function that produces an instance of `Ctor` regardless of + * whether it was invoked as part of a `new` expression or by `call` or `apply`. + * + * @private + * @param {Function} Ctor The constructor to wrap. + * @returns {Function} Returns the new wrapped function. + */ + function createCtor(Ctor) { + return function() { + // Use a `switch` statement to work with class constructors. See + // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist + // for more details. + var args = arguments; + switch (args.length) { + case 0: return new Ctor; + case 1: return new Ctor(args[0]); + case 2: return new Ctor(args[0], args[1]); + case 3: return new Ctor(args[0], args[1], args[2]); + case 4: return new Ctor(args[0], args[1], args[2], args[3]); + case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]); + case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]); + case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]); + } + var thisBinding = baseCreate(Ctor.prototype), + result = Ctor.apply(thisBinding, args); + + // Mimic the constructor's `return` behavior. + // See https://es5.github.io/#x13.2.2 for more details. + return isObject(result) ? result : thisBinding; + }; + } + + /** + * Creates a function that wraps `func` to enable currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {number} arity The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createCurry(func, bitmask, arity) { + var Ctor = createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length, + placeholder = getHolder(wrapper); + + while (index--) { + args[index] = arguments[index]; + } + var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder) + ? [] + : replaceHolders(args, placeholder); + + length -= holders.length; + if (length < arity) { + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, undefined, + args, holders, undefined, undefined, arity - length); + } + var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + return apply(fn, this, args); + } + return wrapper; + } + + /** + * Creates a `_.find` or `_.findLast` function. + * + * @private + * @param {Function} findIndexFunc The function to find the collection index. + * @returns {Function} Returns the new find function. + */ + function createFind(findIndexFunc) { + return function(collection, predicate, fromIndex) { + var iterable = Object(collection); + if (!isArrayLike(collection)) { + var iteratee = getIteratee(predicate, 3); + collection = keys(collection); + predicate = function(key) { return iteratee(iterable[key], key, iterable); }; + } + var index = findIndexFunc(collection, predicate, fromIndex); + return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined; + }; + } + + /** + * Creates a `_.flow` or `_.flowRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new flow function. + */ + function createFlow(fromRight) { + return flatRest(function(funcs) { + var length = funcs.length, + index = length, + prereq = LodashWrapper.prototype.thru; + + if (fromRight) { + funcs.reverse(); + } + while (index--) { + var func = funcs[index]; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (prereq && !wrapper && getFuncName(func) == 'wrapper') { + var wrapper = new LodashWrapper([], true); + } + } + index = wrapper ? index : length; + while (++index < length) { + func = funcs[index]; + + var funcName = getFuncName(func), + data = funcName == 'wrapper' ? getData(func) : undefined; + + if (data && isLaziable(data[0]) && + data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && + !data[4].length && data[9] == 1 + ) { + wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]); + } else { + wrapper = (func.length == 1 && isLaziable(func)) + ? wrapper[funcName]() + : wrapper.thru(func); + } + } + return function() { + var args = arguments, + value = args[0]; + + if (wrapper && args.length == 1 && isArray(value)) { + return wrapper.plant(value).value(); + } + var index = 0, + result = length ? funcs[index].apply(this, args) : value; + + while (++index < length) { + result = funcs[index].call(this, result); + } + return result; + }; + }); + } + + /** + * Creates a function that wraps `func` to invoke it with optional `this` + * binding of `thisArg`, partial application, and currying. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [partialsRight] The arguments to append to those provided + * to the new function. + * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) { + var isAry = bitmask & WRAP_ARY_FLAG, + isBind = bitmask & WRAP_BIND_FLAG, + isBindKey = bitmask & WRAP_BIND_KEY_FLAG, + isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), + isFlip = bitmask & WRAP_FLIP_FLAG, + Ctor = isBindKey ? undefined : createCtor(func); + + function wrapper() { + var length = arguments.length, + args = Array(length), + index = length; + + while (index--) { + args[index] = arguments[index]; + } + if (isCurried) { + var placeholder = getHolder(wrapper), + holdersCount = countHolders(args, placeholder); + } + if (partials) { + args = composeArgs(args, partials, holders, isCurried); + } + if (partialsRight) { + args = composeArgsRight(args, partialsRight, holdersRight, isCurried); + } + length -= holdersCount; + if (isCurried && length < arity) { + var newHolders = replaceHolders(args, placeholder); + return createRecurry( + func, bitmask, createHybrid, wrapper.placeholder, thisArg, + args, newHolders, argPos, ary, arity - length + ); + } + var thisBinding = isBind ? thisArg : this, + fn = isBindKey ? thisBinding[func] : func; + + length = args.length; + if (argPos) { + args = reorder(args, argPos); + } else if (isFlip && length > 1) { + args.reverse(); + } + if (isAry && ary < length) { + args.length = ary; + } + if (this && this !== root && this instanceof wrapper) { + fn = Ctor || createCtor(fn); + } + return fn.apply(thisBinding, args); + } + return wrapper; + } + + /** + * Creates a function like `_.invertBy`. + * + * @private + * @param {Function} setter The function to set accumulator values. + * @param {Function} toIteratee The function to resolve iteratees. + * @returns {Function} Returns the new inverter function. + */ + function createInverter(setter, toIteratee) { + return function(object, iteratee) { + return baseInverter(object, setter, toIteratee(iteratee), {}); + }; + } + + /** + * Creates a function that performs a mathematical operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @param {number} [defaultValue] The value used for `undefined` arguments. + * @returns {Function} Returns the new mathematical operation function. + */ + function createMathOperation(operator, defaultValue) { + return function(value, other) { + var result; + if (value === undefined && other === undefined) { + return defaultValue; + } + if (value !== undefined) { + result = value; + } + if (other !== undefined) { + if (result === undefined) { + return other; + } + if (typeof value == 'string' || typeof other == 'string') { + value = baseToString(value); + other = baseToString(other); + } else { + value = baseToNumber(value); + other = baseToNumber(other); + } + result = operator(value, other); + } + return result; + }; + } + + /** + * Creates a function like `_.over`. + * + * @private + * @param {Function} arrayFunc The function to iterate over iteratees. + * @returns {Function} Returns the new over function. + */ + function createOver(arrayFunc) { + return flatRest(function(iteratees) { + iteratees = arrayMap(iteratees, baseUnary(getIteratee())); + return baseRest(function(args) { + var thisArg = this; + return arrayFunc(iteratees, function(iteratee) { + return apply(iteratee, thisArg, args); + }); + }); + }); + } + + /** + * Creates the padding for `string` based on `length`. The `chars` string + * is truncated if the number of characters exceeds `length`. + * + * @private + * @param {number} length The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padding for `string`. + */ + function createPadding(length, chars) { + chars = chars === undefined ? ' ' : baseToString(chars); + + var charsLength = chars.length; + if (charsLength < 2) { + return charsLength ? baseRepeat(chars, length) : chars; + } + var result = baseRepeat(chars, nativeCeil(length / stringSize(chars))); + return hasUnicode(chars) + ? castSlice(stringToArray(result), 0, length).join('') + : result.slice(0, length); + } + + /** + * Creates a function that wraps `func` to invoke it with the `this` binding + * of `thisArg` and `partials` prepended to the arguments it receives. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {*} thisArg The `this` binding of `func`. + * @param {Array} partials The arguments to prepend to those provided to + * the new function. + * @returns {Function} Returns the new wrapped function. + */ + function createPartial(func, bitmask, thisArg, partials) { + var isBind = bitmask & WRAP_BIND_FLAG, + Ctor = createCtor(func); + + function wrapper() { + var argsIndex = -1, + argsLength = arguments.length, + leftIndex = -1, + leftLength = partials.length, + args = Array(leftLength + argsLength), + fn = (this && this !== root && this instanceof wrapper) ? Ctor : func; + + while (++leftIndex < leftLength) { + args[leftIndex] = partials[leftIndex]; + } + while (argsLength--) { + args[leftIndex++] = arguments[++argsIndex]; + } + return apply(fn, isBind ? thisArg : this, args); + } + return wrapper; + } + + /** + * Creates a `_.range` or `_.rangeRight` function. + * + * @private + * @param {boolean} [fromRight] Specify iterating from right to left. + * @returns {Function} Returns the new range function. + */ + function createRange(fromRight) { + return function(start, end, step) { + if (step && typeof step != 'number' && isIterateeCall(start, end, step)) { + end = step = undefined; + } + // Ensure the sign of `-0` is preserved. + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + step = step === undefined ? (start < end ? 1 : -1) : toFinite(step); + return baseRange(start, end, step, fromRight); + }; + } + + /** + * Creates a function that performs a relational operation on two values. + * + * @private + * @param {Function} operator The function to perform the operation. + * @returns {Function} Returns the new relational operation function. + */ + function createRelationalOperation(operator) { + return function(value, other) { + if (!(typeof value == 'string' && typeof other == 'string')) { + value = toNumber(value); + other = toNumber(other); + } + return operator(value, other); + }; + } + + /** + * Creates a function that wraps `func` to continue currying. + * + * @private + * @param {Function} func The function to wrap. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @param {Function} wrapFunc The function to create the `func` wrapper. + * @param {*} placeholder The placeholder value. + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to prepend to those provided to + * the new function. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) { + var isCurry = bitmask & WRAP_CURRY_FLAG, + newHolders = isCurry ? holders : undefined, + newHoldersRight = isCurry ? undefined : holders, + newPartials = isCurry ? partials : undefined, + newPartialsRight = isCurry ? undefined : partials; + + bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG); + bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG); + + if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) { + bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG); + } + var newData = [ + func, bitmask, thisArg, newPartials, newHolders, newPartialsRight, + newHoldersRight, argPos, ary, arity + ]; + + var result = wrapFunc.apply(undefined, newData); + if (isLaziable(func)) { + setData(result, newData); + } + result.placeholder = placeholder; + return setWrapToString(result, func, bitmask); + } + + /** + * Creates a function like `_.round`. + * + * @private + * @param {string} methodName The name of the `Math` method to use when rounding. + * @returns {Function} Returns the new round function. + */ + function createRound(methodName) { + var func = Math[methodName]; + return function(number, precision) { + number = toNumber(number); + precision = precision == null ? 0 : nativeMin(toInteger(precision), 292); + if (precision) { + // Shift with exponential notation to avoid floating-point issues. + // See [MDN](https://mdn.io/round#Examples) for more details. + var pair = (toString(number) + 'e').split('e'), + value = func(pair[0] + 'e' + (+pair[1] + precision)); + + pair = (toString(value) + 'e').split('e'); + return +(pair[0] + 'e' + (+pair[1] - precision)); + } + return func(number); + }; + } + + /** + * Creates a set object of `values`. + * + * @private + * @param {Array} values The values to add to the set. + * @returns {Object} Returns the new set. + */ + var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { + return new Set(values); + }; + + /** + * Creates a `_.toPairs` or `_.toPairsIn` function. + * + * @private + * @param {Function} keysFunc The function to get the keys of a given object. + * @returns {Function} Returns the new pairs function. + */ + function createToPairs(keysFunc) { + return function(object) { + var tag = getTag(object); + if (tag == mapTag) { + return mapToArray(object); + } + if (tag == setTag) { + return setToPairs(object); + } + return baseToPairs(object, keysFunc(object)); + }; + } + + /** + * Creates a function that either curries or invokes `func` with optional + * `this` binding and partially applied arguments. + * + * @private + * @param {Function|string} func The function or method name to wrap. + * @param {number} bitmask The bitmask flags. + * 1 - `_.bind` + * 2 - `_.bindKey` + * 4 - `_.curry` or `_.curryRight` of a bound function + * 8 - `_.curry` + * 16 - `_.curryRight` + * 32 - `_.partial` + * 64 - `_.partialRight` + * 128 - `_.rearg` + * 256 - `_.ary` + * 512 - `_.flip` + * @param {*} [thisArg] The `this` binding of `func`. + * @param {Array} [partials] The arguments to be partially applied. + * @param {Array} [holders] The `partials` placeholder indexes. + * @param {Array} [argPos] The argument positions of the new function. + * @param {number} [ary] The arity cap of `func`. + * @param {number} [arity] The arity of `func`. + * @returns {Function} Returns the new wrapped function. + */ + function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) { + var isBindKey = bitmask & WRAP_BIND_KEY_FLAG; + if (!isBindKey && typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + var length = partials ? partials.length : 0; + if (!length) { + bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG); + partials = holders = undefined; + } + ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0); + arity = arity === undefined ? arity : toInteger(arity); + length -= holders ? holders.length : 0; + + if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) { + var partialsRight = partials, + holdersRight = holders; + + partials = holders = undefined; + } + var data = isBindKey ? undefined : getData(func); + + var newData = [ + func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, + argPos, ary, arity + ]; + + if (data) { + mergeData(newData, data); + } + func = newData[0]; + bitmask = newData[1]; + thisArg = newData[2]; + partials = newData[3]; + holders = newData[4]; + arity = newData[9] = newData[9] === undefined + ? (isBindKey ? 0 : func.length) + : nativeMax(newData[9] - length, 0); + + if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) { + bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG); + } + if (!bitmask || bitmask == WRAP_BIND_FLAG) { + var result = createBind(func, bitmask, thisArg); + } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) { + result = createCurry(func, bitmask, arity); + } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) { + result = createPartial(func, bitmask, thisArg, partials); + } else { + result = createHybrid.apply(undefined, newData); + } + var setter = data ? baseSetData : setData; + return setWrapToString(setter(result, newData), func, bitmask); + } + + /** + * Used by `_.defaults` to customize its `_.assignIn` use to assign properties + * of source objects to the destination object for all destination properties + * that resolve to `undefined`. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to assign. + * @param {Object} object The parent object of `objValue`. + * @returns {*} Returns the value to assign. + */ + function customDefaultsAssignIn(objValue, srcValue, key, object) { + if (objValue === undefined || + (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) { + return srcValue; + } + return objValue; + } + + /** + * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source + * objects into destination objects that are passed thru. + * + * @private + * @param {*} objValue The destination value. + * @param {*} srcValue The source value. + * @param {string} key The key of the property to merge. + * @param {Object} object The parent object of `objValue`. + * @param {Object} source The parent object of `srcValue`. + * @param {Object} [stack] Tracks traversed source values and their merged + * counterparts. + * @returns {*} Returns the value to assign. + */ + function customDefaultsMerge(objValue, srcValue, key, object, source, stack) { + if (isObject(objValue) && isObject(srcValue)) { + // Recursively merge objects and arrays (susceptible to call stack limits). + stack.set(srcValue, objValue); + baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack); + stack['delete'](srcValue); + } + return objValue; + } + + /** + * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain + * objects. + * + * @private + * @param {*} value The value to inspect. + * @param {string} key The key of the property to inspect. + * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`. + */ + function customOmitClone(value) { + return isPlainObject(value) ? undefined : value; + } + + /** + * A specialized version of `baseIsEqualDeep` for arrays with support for + * partial deep comparisons. + * + * @private + * @param {Array} array The array to compare. + * @param {Array} other The other array to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `array` and `other` objects. + * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`. + */ + function equalArrays(array, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + arrLength = array.length, + othLength = other.length; + + if (arrLength != othLength && !(isPartial && othLength > arrLength)) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(array); + if (stacked && stack.get(other)) { + return stacked == other; + } + var index = -1, + result = true, + seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined; + + stack.set(array, other); + stack.set(other, array); + + // Ignore non-index properties. + while (++index < arrLength) { + var arrValue = array[index], + othValue = other[index]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, arrValue, index, other, array, stack) + : customizer(arrValue, othValue, index, array, other, stack); + } + if (compared !== undefined) { + if (compared) { + continue; + } + result = false; + break; + } + // Recursively compare arrays (susceptible to call stack limits). + if (seen) { + if (!arraySome(other, function(othValue, othIndex) { + if (!cacheHas(seen, othIndex) && + (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) { + return seen.push(othIndex); + } + })) { + result = false; + break; + } + } else if (!( + arrValue === othValue || + equalFunc(arrValue, othValue, bitmask, customizer, stack) + )) { + result = false; + break; + } + } + stack['delete'](array); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseIsEqualDeep` for comparing objects of + * the same `toStringTag`. + * + * **Note:** This function only supports comparing values with tags of + * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {string} tag The `toStringTag` of the objects to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) { + switch (tag) { + case dataViewTag: + if ((object.byteLength != other.byteLength) || + (object.byteOffset != other.byteOffset)) { + return false; + } + object = object.buffer; + other = other.buffer; + + case arrayBufferTag: + if ((object.byteLength != other.byteLength) || + !equalFunc(new Uint8Array(object), new Uint8Array(other))) { + return false; + } + return true; + + case boolTag: + case dateTag: + case numberTag: + // Coerce booleans to `1` or `0` and dates to milliseconds. + // Invalid dates are coerced to `NaN`. + return eq(+object, +other); + + case errorTag: + return object.name == other.name && object.message == other.message; + + case regexpTag: + case stringTag: + // Coerce regexes to strings and treat strings, primitives and objects, + // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring + // for more details. + return object == (other + ''); + + case mapTag: + var convert = mapToArray; + + case setTag: + var isPartial = bitmask & COMPARE_PARTIAL_FLAG; + convert || (convert = setToArray); + + if (object.size != other.size && !isPartial) { + return false; + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked) { + return stacked == other; + } + bitmask |= COMPARE_UNORDERED_FLAG; + + // Recursively compare objects (susceptible to call stack limits). + stack.set(object, other); + var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack); + stack['delete'](object); + return result; + + case symbolTag: + if (symbolValueOf) { + return symbolValueOf.call(object) == symbolValueOf.call(other); + } + } + return false; + } + + /** + * A specialized version of `baseIsEqualDeep` for objects with support for + * partial deep comparisons. + * + * @private + * @param {Object} object The object to compare. + * @param {Object} other The other object to compare. + * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details. + * @param {Function} customizer The function to customize comparisons. + * @param {Function} equalFunc The function to determine equivalents of values. + * @param {Object} stack Tracks traversed `object` and `other` objects. + * @returns {boolean} Returns `true` if the objects are equivalent, else `false`. + */ + function equalObjects(object, other, bitmask, customizer, equalFunc, stack) { + var isPartial = bitmask & COMPARE_PARTIAL_FLAG, + objProps = getAllKeys(object), + objLength = objProps.length, + othProps = getAllKeys(other), + othLength = othProps.length; + + if (objLength != othLength && !isPartial) { + return false; + } + var index = objLength; + while (index--) { + var key = objProps[index]; + if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) { + return false; + } + } + // Assume cyclic values are equal. + var stacked = stack.get(object); + if (stacked && stack.get(other)) { + return stacked == other; + } + var result = true; + stack.set(object, other); + stack.set(other, object); + + var skipCtor = isPartial; + while (++index < objLength) { + key = objProps[index]; + var objValue = object[key], + othValue = other[key]; + + if (customizer) { + var compared = isPartial + ? customizer(othValue, objValue, key, other, object, stack) + : customizer(objValue, othValue, key, object, other, stack); + } + // Recursively compare objects (susceptible to call stack limits). + if (!(compared === undefined + ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)) + : compared + )) { + result = false; + break; + } + skipCtor || (skipCtor = key == 'constructor'); + } + if (result && !skipCtor) { + var objCtor = object.constructor, + othCtor = other.constructor; + + // Non `Object` object instances with different constructors are not equal. + if (objCtor != othCtor && + ('constructor' in object && 'constructor' in other) && + !(typeof objCtor == 'function' && objCtor instanceof objCtor && + typeof othCtor == 'function' && othCtor instanceof othCtor)) { + result = false; + } + } + stack['delete'](object); + stack['delete'](other); + return result; + } + + /** + * A specialized version of `baseRest` which flattens the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @returns {Function} Returns the new function. + */ + function flatRest(func) { + return setToString(overRest(func, undefined, flatten), func + ''); + } + + /** + * Creates an array of own enumerable property names and symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeys(object) { + return baseGetAllKeys(object, keys, getSymbols); + } + + /** + * Creates an array of own and inherited enumerable property names and + * symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names and symbols. + */ + function getAllKeysIn(object) { + return baseGetAllKeys(object, keysIn, getSymbolsIn); + } + + /** + * Gets metadata for `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {*} Returns the metadata for `func`. + */ + var getData = !metaMap ? noop : function(func) { + return metaMap.get(func); + }; + + /** + * Gets the name of `func`. + * + * @private + * @param {Function} func The function to query. + * @returns {string} Returns the function name. + */ + function getFuncName(func) { + var result = (func.name + ''), + array = realNames[result], + length = hasOwnProperty.call(realNames, result) ? array.length : 0; + + while (length--) { + var data = array[length], + otherFunc = data.func; + if (otherFunc == null || otherFunc == func) { + return data.name; + } + } + return result; + } + + /** + * Gets the argument placeholder value for `func`. + * + * @private + * @param {Function} func The function to inspect. + * @returns {*} Returns the placeholder value. + */ + function getHolder(func) { + var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func; + return object.placeholder; + } + + /** + * Gets the appropriate "iteratee" function. If `_.iteratee` is customized, + * this function returns the custom method, otherwise it returns `baseIteratee`. + * If arguments are provided, the chosen function is invoked with them and + * its result is returned. + * + * @private + * @param {*} [value] The value to convert to an iteratee. + * @param {number} [arity] The arity of the created iteratee. + * @returns {Function} Returns the chosen function or its result. + */ + function getIteratee() { + var result = lodash.iteratee || iteratee; + result = result === iteratee ? baseIteratee : result; + return arguments.length ? result(arguments[0], arguments[1]) : result; + } + + /** + * Gets the data for `map`. + * + * @private + * @param {Object} map The map to query. + * @param {string} key The reference key. + * @returns {*} Returns the map data. + */ + function getMapData(map, key) { + var data = map.__data__; + return isKeyable(key) + ? data[typeof key == 'string' ? 'string' : 'hash'] + : data.map; + } + + /** + * Gets the property names, values, and compare flags of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the match data of `object`. + */ + function getMatchData(object) { + var result = keys(object), + length = result.length; + + while (length--) { + var key = result[length], + value = object[key]; + + result[length] = [key, value, isStrictComparable(value)]; + } + return result; + } + + /** + * Gets the native function at `key` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {string} key The key of the method to get. + * @returns {*} Returns the function if it's native, else `undefined`. + */ + function getNative(object, key) { + var value = getValue(object, key); + return baseIsNative(value) ? value : undefined; + } + + /** + * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the raw `toStringTag`. + */ + function getRawTag(value) { + var isOwn = hasOwnProperty.call(value, symToStringTag), + tag = value[symToStringTag]; + + try { + value[symToStringTag] = undefined; + var unmasked = true; + } catch (e) {} + + var result = nativeObjectToString.call(value); + if (unmasked) { + if (isOwn) { + value[symToStringTag] = tag; + } else { + delete value[symToStringTag]; + } + } + return result; + } + + /** + * Creates an array of the own enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbols = !nativeGetSymbols ? stubArray : function(object) { + if (object == null) { + return []; + } + object = Object(object); + return arrayFilter(nativeGetSymbols(object), function(symbol) { + return propertyIsEnumerable.call(object, symbol); + }); + }; + + /** + * Creates an array of the own and inherited enumerable symbols of `object`. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of symbols. + */ + var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) { + var result = []; + while (object) { + arrayPush(result, getSymbols(object)); + object = getPrototype(object); + } + return result; + }; + + /** + * Gets the `toStringTag` of `value`. + * + * @private + * @param {*} value The value to query. + * @returns {string} Returns the `toStringTag`. + */ + var getTag = baseGetTag; + + // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6. + if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) || + (Map && getTag(new Map) != mapTag) || + (Promise && getTag(Promise.resolve()) != promiseTag) || + (Set && getTag(new Set) != setTag) || + (WeakMap && getTag(new WeakMap) != weakMapTag)) { + getTag = function(value) { + var result = baseGetTag(value), + Ctor = result == objectTag ? value.constructor : undefined, + ctorString = Ctor ? toSource(Ctor) : ''; + + if (ctorString) { + switch (ctorString) { + case dataViewCtorString: return dataViewTag; + case mapCtorString: return mapTag; + case promiseCtorString: return promiseTag; + case setCtorString: return setTag; + case weakMapCtorString: return weakMapTag; + } + } + return result; + }; + } + + /** + * Gets the view, applying any `transforms` to the `start` and `end` positions. + * + * @private + * @param {number} start The start of the view. + * @param {number} end The end of the view. + * @param {Array} transforms The transformations to apply to the view. + * @returns {Object} Returns an object containing the `start` and `end` + * positions of the view. + */ + function getView(start, end, transforms) { + var index = -1, + length = transforms.length; + + while (++index < length) { + var data = transforms[index], + size = data.size; + + switch (data.type) { + case 'drop': start += size; break; + case 'dropRight': end -= size; break; + case 'take': end = nativeMin(end, start + size); break; + case 'takeRight': start = nativeMax(start, end - size); break; + } + } + return { 'start': start, 'end': end }; + } + + /** + * Extracts wrapper details from the `source` body comment. + * + * @private + * @param {string} source The source to inspect. + * @returns {Array} Returns the wrapper details. + */ + function getWrapDetails(source) { + var match = source.match(reWrapDetails); + return match ? match[1].split(reSplitDetails) : []; + } + + /** + * Checks if `path` exists on `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @param {Function} hasFunc The function to check properties. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + */ + function hasPath(object, path, hasFunc) { + path = castPath(path, object); + + var index = -1, + length = path.length, + result = false; + + while (++index < length) { + var key = toKey(path[index]); + if (!(result = object != null && hasFunc(object, key))) { + break; + } + object = object[key]; + } + if (result || ++index != length) { + return result; + } + length = object == null ? 0 : object.length; + return !!length && isLength(length) && isIndex(key, length) && + (isArray(object) || isArguments(object)); + } + + /** + * Initializes an array clone. + * + * @private + * @param {Array} array The array to clone. + * @returns {Array} Returns the initialized clone. + */ + function initCloneArray(array) { + var length = array.length, + result = new array.constructor(length); + + // Add properties assigned by `RegExp#exec`. + if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) { + result.index = array.index; + result.input = array.input; + } + return result; + } + + /** + * Initializes an object clone. + * + * @private + * @param {Object} object The object to clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneObject(object) { + return (typeof object.constructor == 'function' && !isPrototype(object)) + ? baseCreate(getPrototype(object)) + : {}; + } + + /** + * Initializes an object clone based on its `toStringTag`. + * + * **Note:** This function only supports cloning values with tags of + * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`. + * + * @private + * @param {Object} object The object to clone. + * @param {string} tag The `toStringTag` of the object to clone. + * @param {boolean} [isDeep] Specify a deep clone. + * @returns {Object} Returns the initialized clone. + */ + function initCloneByTag(object, tag, isDeep) { + var Ctor = object.constructor; + switch (tag) { + case arrayBufferTag: + return cloneArrayBuffer(object); + + case boolTag: + case dateTag: + return new Ctor(+object); + + case dataViewTag: + return cloneDataView(object, isDeep); + + case float32Tag: case float64Tag: + case int8Tag: case int16Tag: case int32Tag: + case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag: + return cloneTypedArray(object, isDeep); + + case mapTag: + return new Ctor; + + case numberTag: + case stringTag: + return new Ctor(object); + + case regexpTag: + return cloneRegExp(object); + + case setTag: + return new Ctor; + + case symbolTag: + return cloneSymbol(object); + } + } + + /** + * Inserts wrapper `details` in a comment at the top of the `source` body. + * + * @private + * @param {string} source The source to modify. + * @returns {Array} details The details to insert. + * @returns {string} Returns the modified source. + */ + function insertWrapDetails(source, details) { + var length = details.length; + if (!length) { + return source; + } + var lastIndex = length - 1; + details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex]; + details = details.join(length > 2 ? ', ' : ' '); + return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n'); + } + + /** + * Checks if `value` is a flattenable `arguments` object or array. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. + */ + function isFlattenable(value) { + return isArray(value) || isArguments(value) || + !!(spreadableSymbol && value && value[spreadableSymbol]); + } + + /** + * Checks if `value` is a valid array-like index. + * + * @private + * @param {*} value The value to check. + * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. + * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. + */ + function isIndex(value, length) { + var type = typeof value; + length = length == null ? MAX_SAFE_INTEGER : length; + + return !!length && + (type == 'number' || + (type != 'symbol' && reIsUint.test(value))) && + (value > -1 && value % 1 == 0 && value < length); + } + + /** + * Checks if the given arguments are from an iteratee call. + * + * @private + * @param {*} value The potential iteratee value argument. + * @param {*} index The potential iteratee index or key argument. + * @param {*} object The potential iteratee object argument. + * @returns {boolean} Returns `true` if the arguments are from an iteratee call, + * else `false`. + */ + function isIterateeCall(value, index, object) { + if (!isObject(object)) { + return false; + } + var type = typeof index; + if (type == 'number' + ? (isArrayLike(object) && isIndex(index, object.length)) + : (type == 'string' && index in object) + ) { + return eq(object[index], value); + } + return false; + } + + /** + * Checks if `value` is a property name and not a property path. + * + * @private + * @param {*} value The value to check. + * @param {Object} [object] The object to query keys on. + * @returns {boolean} Returns `true` if `value` is a property name, else `false`. + */ + function isKey(value, object) { + if (isArray(value)) { + return false; + } + var type = typeof value; + if (type == 'number' || type == 'symbol' || type == 'boolean' || + value == null || isSymbol(value)) { + return true; + } + return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || + (object != null && value in Object(object)); + } + + /** + * Checks if `value` is suitable for use as unique object key. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is suitable, else `false`. + */ + function isKeyable(value) { + var type = typeof value; + return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') + ? (value !== '__proto__') + : (value === null); + } + + /** + * Checks if `func` has a lazy counterpart. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` has a lazy counterpart, + * else `false`. + */ + function isLaziable(func) { + var funcName = getFuncName(func), + other = lodash[funcName]; + + if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) { + return false; + } + if (func === other) { + return true; + } + var data = getData(other); + return !!data && func === data[0]; + } + + /** + * Checks if `func` has its source masked. + * + * @private + * @param {Function} func The function to check. + * @returns {boolean} Returns `true` if `func` is masked, else `false`. + */ + function isMasked(func) { + return !!maskSrcKey && (maskSrcKey in func); + } + + /** + * Checks if `func` is capable of being masked. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `func` is maskable, else `false`. + */ + var isMaskable = coreJsData ? isFunction : stubFalse; + + /** + * Checks if `value` is likely a prototype object. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. + */ + function isPrototype(value) { + var Ctor = value && value.constructor, + proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto; + + return value === proto; + } + + /** + * Checks if `value` is suitable for strict equality comparisons, i.e. `===`. + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` if suitable for strict + * equality comparisons, else `false`. + */ + function isStrictComparable(value) { + return value === value && !isObject(value); + } + + /** + * A specialized version of `matchesProperty` for source values suitable + * for strict equality comparisons, i.e. `===`. + * + * @private + * @param {string} key The key of the property to get. + * @param {*} srcValue The value to match. + * @returns {Function} Returns the new spec function. + */ + function matchesStrictComparable(key, srcValue) { + return function(object) { + if (object == null) { + return false; + } + return object[key] === srcValue && + (srcValue !== undefined || (key in Object(object))); + }; + } + + /** + * A specialized version of `_.memoize` which clears the memoized function's + * cache when it exceeds `MAX_MEMOIZE_SIZE`. + * + * @private + * @param {Function} func The function to have its output memoized. + * @returns {Function} Returns the new memoized function. + */ + function memoizeCapped(func) { + var result = memoize(func, function(key) { + if (cache.size === MAX_MEMOIZE_SIZE) { + cache.clear(); + } + return key; + }); + + var cache = result.cache; + return result; + } + + /** + * Merges the function metadata of `source` into `data`. + * + * Merging metadata reduces the number of wrappers used to invoke a function. + * This is possible because methods like `_.bind`, `_.curry`, and `_.partial` + * may be applied regardless of execution order. Methods like `_.ary` and + * `_.rearg` modify function arguments, making the order in which they are + * executed important, preventing the merging of metadata. However, we make + * an exception for a safe combined case where curried functions have `_.ary` + * and or `_.rearg` applied. + * + * @private + * @param {Array} data The destination metadata. + * @param {Array} source The source metadata. + * @returns {Array} Returns `data`. + */ + function mergeData(data, source) { + var bitmask = data[1], + srcBitmask = source[1], + newBitmask = bitmask | srcBitmask, + isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG); + + var isCombo = + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) || + ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) || + ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG)); + + // Exit early if metadata can't be merged. + if (!(isCommon || isCombo)) { + return data; + } + // Use source `thisArg` if available. + if (srcBitmask & WRAP_BIND_FLAG) { + data[2] = source[2]; + // Set when currying a bound function. + newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG; + } + // Compose partial arguments. + var value = source[3]; + if (value) { + var partials = data[3]; + data[3] = partials ? composeArgs(partials, value, source[4]) : value; + data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4]; + } + // Compose partial right arguments. + value = source[5]; + if (value) { + partials = data[5]; + data[5] = partials ? composeArgsRight(partials, value, source[6]) : value; + data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6]; + } + // Use source `argPos` if available. + value = source[7]; + if (value) { + data[7] = value; + } + // Use source `ary` if it's smaller. + if (srcBitmask & WRAP_ARY_FLAG) { + data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]); + } + // Use source `arity` if one is not provided. + if (data[9] == null) { + data[9] = source[9]; + } + // Use source `func` and merge bitmasks. + data[0] = source[0]; + data[1] = newBitmask; + + return data; + } + + /** + * This function is like + * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * except that it includes inherited enumerable properties. + * + * @private + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + */ + function nativeKeysIn(object) { + var result = []; + if (object != null) { + for (var key in Object(object)) { + result.push(key); + } + } + return result; + } + + /** + * Converts `value` to a string using `Object.prototype.toString`. + * + * @private + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + */ + function objectToString(value) { + return nativeObjectToString.call(value); + } + + /** + * A specialized version of `baseRest` which transforms the rest array. + * + * @private + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @param {Function} transform The rest array transform. + * @returns {Function} Returns the new function. + */ + function overRest(func, start, transform) { + start = nativeMax(start === undefined ? (func.length - 1) : start, 0); + return function() { + var args = arguments, + index = -1, + length = nativeMax(args.length - start, 0), + array = Array(length); + + while (++index < length) { + array[index] = args[start + index]; + } + index = -1; + var otherArgs = Array(start + 1); + while (++index < start) { + otherArgs[index] = args[index]; + } + otherArgs[start] = transform(array); + return apply(func, this, otherArgs); + }; + } + + /** + * Gets the parent value at `path` of `object`. + * + * @private + * @param {Object} object The object to query. + * @param {Array} path The path to get the parent value of. + * @returns {*} Returns the parent value. + */ + function parent(object, path) { + return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1)); + } + + /** + * Reorder `array` according to the specified indexes where the element at + * the first index is assigned as the first element, the element at + * the second index is assigned as the second element, and so on. + * + * @private + * @param {Array} array The array to reorder. + * @param {Array} indexes The arranged array indexes. + * @returns {Array} Returns `array`. + */ + function reorder(array, indexes) { + var arrLength = array.length, + length = nativeMin(indexes.length, arrLength), + oldArray = copyArray(array); + + while (length--) { + var index = indexes[length]; + array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined; + } + return array; + } + + /** + * Sets metadata for `func`. + * + * **Note:** If this function becomes hot, i.e. is invoked a lot in a short + * period of time, it will trip its breaker and transition to an identity + * function to avoid garbage collection pauses in V8. See + * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070) + * for more details. + * + * @private + * @param {Function} func The function to associate metadata with. + * @param {*} data The metadata. + * @returns {Function} Returns `func`. + */ + var setData = shortOut(baseSetData); + + /** + * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout). + * + * @private + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @returns {number|Object} Returns the timer id or timeout object. + */ + var setTimeout = ctxSetTimeout || function(func, wait) { + return root.setTimeout(func, wait); + }; + + /** + * Sets the `toString` method of `func` to return `string`. + * + * @private + * @param {Function} func The function to modify. + * @param {Function} string The `toString` result. + * @returns {Function} Returns `func`. + */ + var setToString = shortOut(baseSetToString); + + /** + * Sets the `toString` method of `wrapper` to mimic the source of `reference` + * with wrapper details in a comment at the top of the source body. + * + * @private + * @param {Function} wrapper The function to modify. + * @param {Function} reference The reference function. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Function} Returns `wrapper`. + */ + function setWrapToString(wrapper, reference, bitmask) { + var source = (reference + ''); + return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask))); + } + + /** + * Creates a function that'll short out and invoke `identity` instead + * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN` + * milliseconds. + * + * @private + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new shortable function. + */ + function shortOut(func) { + var count = 0, + lastCalled = 0; + + return function() { + var stamp = nativeNow(), + remaining = HOT_SPAN - (stamp - lastCalled); + + lastCalled = stamp; + if (remaining > 0) { + if (++count >= HOT_COUNT) { + return arguments[0]; + } + } else { + count = 0; + } + return func.apply(undefined, arguments); + }; + } + + /** + * A specialized version of `_.shuffle` which mutates and sets the size of `array`. + * + * @private + * @param {Array} array The array to shuffle. + * @param {number} [size=array.length] The size of `array`. + * @returns {Array} Returns `array`. + */ + function shuffleSelf(array, size) { + var index = -1, + length = array.length, + lastIndex = length - 1; + + size = size === undefined ? length : size; + while (++index < size) { + var rand = baseRandom(index, lastIndex), + value = array[rand]; + + array[rand] = array[index]; + array[index] = value; + } + array.length = size; + return array; + } + + /** + * Converts `string` to a property path array. + * + * @private + * @param {string} string The string to convert. + * @returns {Array} Returns the property path array. + */ + var stringToPath = memoizeCapped(function(string) { + var result = []; + if (string.charCodeAt(0) === 46 /* . */) { + result.push(''); + } + string.replace(rePropName, function(match, number, quote, subString) { + result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match)); + }); + return result; + }); + + /** + * Converts `value` to a string key if it's not a string or symbol. + * + * @private + * @param {*} value The value to inspect. + * @returns {string|symbol} Returns the key. + */ + function toKey(value) { + if (typeof value == 'string' || isSymbol(value)) { + return value; + } + var result = (value + ''); + return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; + } + + /** + * Converts `func` to its source code. + * + * @private + * @param {Function} func The function to convert. + * @returns {string} Returns the source code. + */ + function toSource(func) { + if (func != null) { + try { + return funcToString.call(func); + } catch (e) {} + try { + return (func + ''); + } catch (e) {} + } + return ''; + } + + /** + * Updates wrapper `details` based on `bitmask` flags. + * + * @private + * @returns {Array} details The details to modify. + * @param {number} bitmask The bitmask flags. See `createWrap` for more details. + * @returns {Array} Returns `details`. + */ + function updateWrapDetails(details, bitmask) { + arrayEach(wrapFlags, function(pair) { + var value = '_.' + pair[0]; + if ((bitmask & pair[1]) && !arrayIncludes(details, value)) { + details.push(value); + } + }); + return details.sort(); + } + + /** + * Creates a clone of `wrapper`. + * + * @private + * @param {Object} wrapper The wrapper to clone. + * @returns {Object} Returns the cloned wrapper. + */ + function wrapperClone(wrapper) { + if (wrapper instanceof LazyWrapper) { + return wrapper.clone(); + } + var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__); + result.__actions__ = copyArray(wrapper.__actions__); + result.__index__ = wrapper.__index__; + result.__values__ = wrapper.__values__; + return result; + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an array of elements split into groups the length of `size`. + * If `array` can't be split evenly, the final chunk will be the remaining + * elements. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to process. + * @param {number} [size=1] The length of each chunk + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the new array of chunks. + * @example + * + * _.chunk(['a', 'b', 'c', 'd'], 2); + * // => [['a', 'b'], ['c', 'd']] + * + * _.chunk(['a', 'b', 'c', 'd'], 3); + * // => [['a', 'b', 'c'], ['d']] + */ + function chunk(array, size, guard) { + if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) { + size = 1; + } else { + size = nativeMax(toInteger(size), 0); + } + var length = array == null ? 0 : array.length; + if (!length || size < 1) { + return []; + } + var index = 0, + resIndex = 0, + result = Array(nativeCeil(length / size)); + + while (index < length) { + result[resIndex++] = baseSlice(array, index, (index += size)); + } + return result; + } + + /** + * Creates an array with all falsey values removed. The values `false`, `null`, + * `0`, `""`, `undefined`, and `NaN` are falsey. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to compact. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.compact([0, 1, false, 2, '', 3]); + * // => [1, 2, 3] + */ + function compact(array) { + var index = -1, + length = array == null ? 0 : array.length, + resIndex = 0, + result = []; + + while (++index < length) { + var value = array[index]; + if (value) { + result[resIndex++] = value; + } + } + return result; + } + + /** + * Creates a new array concatenating `array` with any additional arrays + * and/or values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to concatenate. + * @param {...*} [values] The values to concatenate. + * @returns {Array} Returns the new concatenated array. + * @example + * + * var array = [1]; + * var other = _.concat(array, 2, [3], [[4]]); + * + * console.log(other); + * // => [1, 2, 3, [4]] + * + * console.log(array); + * // => [1] + */ + function concat() { + var length = arguments.length; + if (!length) { + return []; + } + var args = Array(length - 1), + array = arguments[0], + index = length; + + while (index--) { + args[index - 1] = arguments[index]; + } + return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1)); + } + + /** + * Creates an array of `array` values not included in the other given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * **Note:** Unlike `_.pullAll`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.without, _.xor + * @example + * + * _.difference([2, 1], [2, 3]); + * // => [1] + */ + var difference = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `iteratee` which + * is invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * **Note:** Unlike `_.pullAllBy`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2] + * + * // The `_.property` iteratee shorthand. + * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var differenceBy = baseRest(function(array, values) { + var iteratee = last(values); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.difference` except that it accepts `comparator` + * which is invoked to compare elements of `array` to `values`. The order and + * references of result values are determined by the first array. The comparator + * is invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.pullAllWith`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...Array} [values] The values to exclude. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * + * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual); + * // => [{ 'x': 2, 'y': 1 }] + */ + var differenceWith = baseRest(function(array, values) { + var comparator = last(values); + if (isArrayLikeObject(comparator)) { + comparator = undefined; + } + return isArrayLikeObject(array) + ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator) + : []; + }); + + /** + * Creates a slice of `array` with `n` elements dropped from the beginning. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.drop([1, 2, 3]); + * // => [2, 3] + * + * _.drop([1, 2, 3], 2); + * // => [3] + * + * _.drop([1, 2, 3], 5); + * // => [] + * + * _.drop([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function drop(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with `n` elements dropped from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to drop. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.dropRight([1, 2, 3]); + * // => [1, 2] + * + * _.dropRight([1, 2, 3], 2); + * // => [1] + * + * _.dropRight([1, 2, 3], 5); + * // => [] + * + * _.dropRight([1, 2, 3], 0); + * // => [1, 2, 3] + */ + function dropRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` excluding elements dropped from the end. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.dropRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney'] + * + * // The `_.matches` iteratee shorthand. + * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropRightWhile(users, ['active', false]); + * // => objects for ['barney'] + * + * // The `_.property` iteratee shorthand. + * _.dropRightWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true, true) + : []; + } + + /** + * Creates a slice of `array` excluding elements dropped from the beginning. + * Elements are dropped until `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.dropWhile(users, function(o) { return !o.active; }); + * // => objects for ['pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.dropWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.dropWhile(users, ['active', false]); + * // => objects for ['pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.dropWhile(users, 'active'); + * // => objects for ['barney', 'fred', 'pebbles'] + */ + function dropWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), true) + : []; + } + + /** + * Fills elements of `array` with `value` from `start` up to, but not + * including, `end`. + * + * **Note:** This method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Array + * @param {Array} array The array to fill. + * @param {*} value The value to fill `array` with. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.fill(array, 'a'); + * console.log(array); + * // => ['a', 'a', 'a'] + * + * _.fill(Array(3), 2); + * // => [2, 2, 2] + * + * _.fill([4, 6, 8, 10], '*', 1, 3); + * // => [4, '*', '*', 10] + */ + function fill(array, value, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (start && typeof start != 'number' && isIterateeCall(array, value, start)) { + start = 0; + end = length; + } + return baseFill(array, value, start, end); + } + + /** + * This method is like `_.find` except that it returns the index of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.findIndex(users, function(o) { return o.user == 'barney'; }); + * // => 0 + * + * // The `_.matches` iteratee shorthand. + * _.findIndex(users, { 'user': 'fred', 'active': false }); + * // => 1 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findIndex(users, ['active', false]); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.findIndex(users, 'active'); + * // => 2 + */ + function findIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseFindIndex(array, getIteratee(predicate, 3), index); + } + + /** + * This method is like `_.findIndex` except that it iterates over elements + * of `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the found element, else `-1`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; }); + * // => 2 + * + * // The `_.matches` iteratee shorthand. + * _.findLastIndex(users, { 'user': 'barney', 'active': true }); + * // => 0 + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastIndex(users, ['active', false]); + * // => 2 + * + * // The `_.property` iteratee shorthand. + * _.findLastIndex(users, 'active'); + * // => 0 + */ + function findLastIndex(array, predicate, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length - 1; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = fromIndex < 0 + ? nativeMax(length + index, 0) + : nativeMin(index, length - 1); + } + return baseFindIndex(array, getIteratee(predicate, 3), index, true); + } + + /** + * Flattens `array` a single level deep. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flatten([1, [2, [3, [4]], 5]]); + * // => [1, 2, [3, [4]], 5] + */ + function flatten(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, 1) : []; + } + + /** + * Recursively flattens `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to flatten. + * @returns {Array} Returns the new flattened array. + * @example + * + * _.flattenDeep([1, [2, [3, [4]], 5]]); + * // => [1, 2, 3, 4, 5] + */ + function flattenDeep(array) { + var length = array == null ? 0 : array.length; + return length ? baseFlatten(array, INFINITY) : []; + } + + /** + * Recursively flatten `array` up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Array + * @param {Array} array The array to flatten. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * var array = [1, [2, [3, [4]], 5]]; + * + * _.flattenDepth(array, 1); + * // => [1, 2, [3, [4]], 5] + * + * _.flattenDepth(array, 2); + * // => [1, 2, 3, [4], 5] + */ + function flattenDepth(array, depth) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(array, depth); + } + + /** + * The inverse of `_.toPairs`; this method returns an object composed + * from key-value `pairs`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} pairs The key-value pairs. + * @returns {Object} Returns the new object. + * @example + * + * _.fromPairs([['a', 1], ['b', 2]]); + * // => { 'a': 1, 'b': 2 } + */ + function fromPairs(pairs) { + var index = -1, + length = pairs == null ? 0 : pairs.length, + result = {}; + + while (++index < length) { + var pair = pairs[index]; + result[pair[0]] = pair[1]; + } + return result; + } + + /** + * Gets the first element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias first + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the first element of `array`. + * @example + * + * _.head([1, 2, 3]); + * // => 1 + * + * _.head([]); + * // => undefined + */ + function head(array) { + return (array && array.length) ? array[0] : undefined; + } + + /** + * Gets the index at which the first occurrence of `value` is found in `array` + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. If `fromIndex` is negative, it's used as the + * offset from the end of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.indexOf([1, 2, 1, 2], 2); + * // => 1 + * + * // Search from the `fromIndex`. + * _.indexOf([1, 2, 1, 2], 2, 2); + * // => 3 + */ + function indexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = fromIndex == null ? 0 : toInteger(fromIndex); + if (index < 0) { + index = nativeMax(length + index, 0); + } + return baseIndexOf(array, value, index); + } + + /** + * Gets all but the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.initial([1, 2, 3]); + * // => [1, 2] + */ + function initial(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 0, -1) : []; + } + + /** + * Creates an array of unique values that are included in all given arrays + * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. The order and references of result values are + * determined by the first array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersection([2, 1], [2, 3]); + * // => [2] + */ + var intersection = baseRest(function(arrays) { + var mapped = arrayMap(arrays, castArrayLikeObject); + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `iteratee` + * which is invoked for each element of each `arrays` to generate the criterion + * by which they're compared. The order and references of result values are + * determined by the first array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [2.1] + * + * // The `_.property` iteratee shorthand. + * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }] + */ + var intersectionBy = baseRest(function(arrays) { + var iteratee = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + if (iteratee === last(mapped)) { + iteratee = undefined; + } else { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, getIteratee(iteratee, 2)) + : []; + }); + + /** + * This method is like `_.intersection` except that it accepts `comparator` + * which is invoked to compare elements of `arrays`. The order and references + * of result values are determined by the first array. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of intersecting values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.intersectionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }] + */ + var intersectionWith = baseRest(function(arrays) { + var comparator = last(arrays), + mapped = arrayMap(arrays, castArrayLikeObject); + + comparator = typeof comparator == 'function' ? comparator : undefined; + if (comparator) { + mapped.pop(); + } + return (mapped.length && mapped[0] === arrays[0]) + ? baseIntersection(mapped, undefined, comparator) + : []; + }); + + /** + * Converts all elements in `array` into a string separated by `separator`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to convert. + * @param {string} [separator=','] The element separator. + * @returns {string} Returns the joined string. + * @example + * + * _.join(['a', 'b', 'c'], '~'); + * // => 'a~b~c' + */ + function join(array, separator) { + return array == null ? '' : nativeJoin.call(array, separator); + } + + /** + * Gets the last element of `array`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @returns {*} Returns the last element of `array`. + * @example + * + * _.last([1, 2, 3]); + * // => 3 + */ + function last(array) { + var length = array == null ? 0 : array.length; + return length ? array[length - 1] : undefined; + } + + /** + * This method is like `_.indexOf` except that it iterates over elements of + * `array` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=array.length-1] The index to search from. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.lastIndexOf([1, 2, 1, 2], 2); + * // => 3 + * + * // Search from the `fromIndex`. + * _.lastIndexOf([1, 2, 1, 2], 2, 2); + * // => 1 + */ + function lastIndexOf(array, value, fromIndex) { + var length = array == null ? 0 : array.length; + if (!length) { + return -1; + } + var index = length; + if (fromIndex !== undefined) { + index = toInteger(fromIndex); + index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1); + } + return value === value + ? strictLastIndexOf(array, value, index) + : baseFindIndex(array, baseIsNaN, index, true); + } + + /** + * Gets the element at index `n` of `array`. If `n` is negative, the nth + * element from the end is returned. + * + * @static + * @memberOf _ + * @since 4.11.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=0] The index of the element to return. + * @returns {*} Returns the nth element of `array`. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * + * _.nth(array, 1); + * // => 'b' + * + * _.nth(array, -2); + * // => 'c'; + */ + function nth(array, n) { + return (array && array.length) ? baseNth(array, toInteger(n)) : undefined; + } + + /** + * Removes all given values from `array` using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove` + * to remove elements from an array by predicate. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...*} [values] The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pull(array, 'a', 'c'); + * console.log(array); + * // => ['b', 'b'] + */ + var pull = baseRest(pullAll); + + /** + * This method is like `_.pull` except that it accepts an array of values to remove. + * + * **Note:** Unlike `_.difference`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @returns {Array} Returns `array`. + * @example + * + * var array = ['a', 'b', 'c', 'a', 'b', 'c']; + * + * _.pullAll(array, ['a', 'c']); + * console.log(array); + * // => ['b', 'b'] + */ + function pullAll(array, values) { + return (array && array.length && values && values.length) + ? basePullAll(array, values) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `iteratee` which is + * invoked for each element of `array` and `values` to generate the criterion + * by which they're compared. The iteratee is invoked with one argument: (value). + * + * **Note:** Unlike `_.differenceBy`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }]; + * + * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x'); + * console.log(array); + * // => [{ 'x': 2 }] + */ + function pullAllBy(array, values, iteratee) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, getIteratee(iteratee, 2)) + : array; + } + + /** + * This method is like `_.pullAll` except that it accepts `comparator` which + * is invoked to compare elements of `array` to `values`. The comparator is + * invoked with two arguments: (arrVal, othVal). + * + * **Note:** Unlike `_.differenceWith`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Array} values The values to remove. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns `array`. + * @example + * + * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }]; + * + * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual); + * console.log(array); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }] + */ + function pullAllWith(array, values, comparator) { + return (array && array.length && values && values.length) + ? basePullAll(array, values, undefined, comparator) + : array; + } + + /** + * Removes elements from `array` corresponding to `indexes` and returns an + * array of removed elements. + * + * **Note:** Unlike `_.at`, this method mutates `array`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {...(number|number[])} [indexes] The indexes of elements to remove. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = ['a', 'b', 'c', 'd']; + * var pulled = _.pullAt(array, [1, 3]); + * + * console.log(array); + * // => ['a', 'c'] + * + * console.log(pulled); + * // => ['b', 'd'] + */ + var pullAt = flatRest(function(array, indexes) { + var length = array == null ? 0 : array.length, + result = baseAt(array, indexes); + + basePullAt(array, arrayMap(indexes, function(index) { + return isIndex(index, length) ? +index : index; + }).sort(compareAscending)); + + return result; + }); + + /** + * Removes all elements from `array` that `predicate` returns truthy for + * and returns an array of the removed elements. The predicate is invoked + * with three arguments: (value, index, array). + * + * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull` + * to pull elements from an array by value. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Array + * @param {Array} array The array to modify. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new array of removed elements. + * @example + * + * var array = [1, 2, 3, 4]; + * var evens = _.remove(array, function(n) { + * return n % 2 == 0; + * }); + * + * console.log(array); + * // => [1, 3] + * + * console.log(evens); + * // => [2, 4] + */ + function remove(array, predicate) { + var result = []; + if (!(array && array.length)) { + return result; + } + var index = -1, + indexes = [], + length = array.length; + + predicate = getIteratee(predicate, 3); + while (++index < length) { + var value = array[index]; + if (predicate(value, index, array)) { + result.push(value); + indexes.push(index); + } + } + basePullAt(array, indexes); + return result; + } + + /** + * Reverses `array` so that the first element becomes the last, the second + * element becomes the second to last, and so on. + * + * **Note:** This method mutates `array` and is based on + * [`Array#reverse`](https://mdn.io/Array/reverse). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to modify. + * @returns {Array} Returns `array`. + * @example + * + * var array = [1, 2, 3]; + * + * _.reverse(array); + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function reverse(array) { + return array == null ? array : nativeReverse.call(array); + } + + /** + * Creates a slice of `array` from `start` up to, but not including, `end`. + * + * **Note:** This method is used instead of + * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are + * returned. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to slice. + * @param {number} [start=0] The start position. + * @param {number} [end=array.length] The end position. + * @returns {Array} Returns the slice of `array`. + */ + function slice(array, start, end) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + if (end && typeof end != 'number' && isIterateeCall(array, start, end)) { + start = 0; + end = length; + } + else { + start = start == null ? 0 : toInteger(start); + end = end === undefined ? length : toInteger(end); + } + return baseSlice(array, start, end); + } + + /** + * Uses a binary search to determine the lowest index at which `value` + * should be inserted into `array` in order to maintain its sort order. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedIndex([30, 50], 40); + * // => 1 + */ + function sortedIndex(array, value) { + return baseSortedIndex(array, value); + } + + /** + * This method is like `_.sortedIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 0 + * + * // The `_.property` iteratee shorthand. + * _.sortedIndexBy(objects, { 'x': 4 }, 'x'); + * // => 0 + */ + function sortedIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2)); + } + + /** + * This method is like `_.indexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedIndexOf([4, 5, 5, 5, 6], 5); + * // => 1 + */ + function sortedIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value); + if (index < length && eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.sortedIndex` except that it returns the highest + * index at which `value` should be inserted into `array` in order to + * maintain its sort order. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * _.sortedLastIndex([4, 5, 5, 5, 6], 5); + * // => 4 + */ + function sortedLastIndex(array, value) { + return baseSortedIndex(array, value, true); + } + + /** + * This method is like `_.sortedLastIndex` except that it accepts `iteratee` + * which is invoked for `value` and each element of `array` to compute their + * sort ranking. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The sorted array to inspect. + * @param {*} value The value to evaluate. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {number} Returns the index at which `value` should be inserted + * into `array`. + * @example + * + * var objects = [{ 'x': 4 }, { 'x': 5 }]; + * + * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; }); + * // => 1 + * + * // The `_.property` iteratee shorthand. + * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x'); + * // => 1 + */ + function sortedLastIndexBy(array, value, iteratee) { + return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true); + } + + /** + * This method is like `_.lastIndexOf` except that it performs a binary + * search on a sorted `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {*} value The value to search for. + * @returns {number} Returns the index of the matched value, else `-1`. + * @example + * + * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5); + * // => 3 + */ + function sortedLastIndexOf(array, value) { + var length = array == null ? 0 : array.length; + if (length) { + var index = baseSortedIndex(array, value, true) - 1; + if (eq(array[index], value)) { + return index; + } + } + return -1; + } + + /** + * This method is like `_.uniq` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniq([1, 1, 2]); + * // => [1, 2] + */ + function sortedUniq(array) { + return (array && array.length) + ? baseSortedUniq(array) + : []; + } + + /** + * This method is like `_.uniqBy` except that it's designed and optimized + * for sorted arrays. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor); + * // => [1.1, 2.3] + */ + function sortedUniqBy(array, iteratee) { + return (array && array.length) + ? baseSortedUniq(array, getIteratee(iteratee, 2)) + : []; + } + + /** + * Gets all but the first element of `array`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to query. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.tail([1, 2, 3]); + * // => [2, 3] + */ + function tail(array) { + var length = array == null ? 0 : array.length; + return length ? baseSlice(array, 1, length) : []; + } + + /** + * Creates a slice of `array` with `n` elements taken from the beginning. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.take([1, 2, 3]); + * // => [1] + * + * _.take([1, 2, 3], 2); + * // => [1, 2] + * + * _.take([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.take([1, 2, 3], 0); + * // => [] + */ + function take(array, n, guard) { + if (!(array && array.length)) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + return baseSlice(array, 0, n < 0 ? 0 : n); + } + + /** + * Creates a slice of `array` with `n` elements taken from the end. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {number} [n=1] The number of elements to take. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the slice of `array`. + * @example + * + * _.takeRight([1, 2, 3]); + * // => [3] + * + * _.takeRight([1, 2, 3], 2); + * // => [2, 3] + * + * _.takeRight([1, 2, 3], 5); + * // => [1, 2, 3] + * + * _.takeRight([1, 2, 3], 0); + * // => [] + */ + function takeRight(array, n, guard) { + var length = array == null ? 0 : array.length; + if (!length) { + return []; + } + n = (guard || n === undefined) ? 1 : toInteger(n); + n = length - n; + return baseSlice(array, n < 0 ? 0 : n, length); + } + + /** + * Creates a slice of `array` with elements taken from the end. Elements are + * taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': false } + * ]; + * + * _.takeRightWhile(users, function(o) { return !o.active; }); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.matches` iteratee shorthand. + * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false }); + * // => objects for ['pebbles'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeRightWhile(users, ['active', false]); + * // => objects for ['fred', 'pebbles'] + * + * // The `_.property` iteratee shorthand. + * _.takeRightWhile(users, 'active'); + * // => [] + */ + function takeRightWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3), false, true) + : []; + } + + /** + * Creates a slice of `array` with elements taken from the beginning. Elements + * are taken until `predicate` returns falsey. The predicate is invoked with + * three arguments: (value, index, array). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Array + * @param {Array} array The array to query. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the slice of `array`. + * @example + * + * var users = [ + * { 'user': 'barney', 'active': false }, + * { 'user': 'fred', 'active': false }, + * { 'user': 'pebbles', 'active': true } + * ]; + * + * _.takeWhile(users, function(o) { return !o.active; }); + * // => objects for ['barney', 'fred'] + * + * // The `_.matches` iteratee shorthand. + * _.takeWhile(users, { 'user': 'barney', 'active': false }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.takeWhile(users, ['active', false]); + * // => objects for ['barney', 'fred'] + * + * // The `_.property` iteratee shorthand. + * _.takeWhile(users, 'active'); + * // => [] + */ + function takeWhile(array, predicate) { + return (array && array.length) + ? baseWhile(array, getIteratee(predicate, 3)) + : []; + } + + /** + * Creates an array of unique values, in order, from all given arrays using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.union([2], [1, 2]); + * // => [2, 1] + */ + var union = baseRest(function(arrays) { + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true)); + }); + + /** + * This method is like `_.union` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which uniqueness is computed. Result values are chosen from the first + * array in which the value occurs. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * _.unionBy([2.1], [1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + var unionBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.union` except that it accepts `comparator` which + * is invoked to compare elements of `arrays`. Result values are chosen from + * the first array in which the value occurs. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of combined values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.unionWith(objects, others, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var unionWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator); + }); + + /** + * Creates a duplicate-free version of an array, using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons, in which only the first occurrence of each element + * is kept. The order of result values is determined by the order they occur + * in the array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniq([2, 1, 2]); + * // => [2, 1] + */ + function uniq(array) { + return (array && array.length) ? baseUniq(array) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `iteratee` which is + * invoked for each element in `array` to generate the criterion by which + * uniqueness is computed. The order of result values is determined by the + * order they occur in the array. The iteratee is invoked with one argument: + * (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * _.uniqBy([2.1, 1.2, 2.3], Math.floor); + * // => [2.1, 1.2] + * + * // The `_.property` iteratee shorthand. + * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 1 }, { 'x': 2 }] + */ + function uniqBy(array, iteratee) { + return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : []; + } + + /** + * This method is like `_.uniq` except that it accepts `comparator` which + * is invoked to compare elements of `array`. The order of result values is + * determined by the order they occur in the array.The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new duplicate free array. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.uniqWith(objects, _.isEqual); + * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }] + */ + function uniqWith(array, comparator) { + comparator = typeof comparator == 'function' ? comparator : undefined; + return (array && array.length) ? baseUniq(array, undefined, comparator) : []; + } + + /** + * This method is like `_.zip` except that it accepts an array of grouped + * elements and creates an array regrouping the elements to their pre-zip + * configuration. + * + * @static + * @memberOf _ + * @since 1.2.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + * + * _.unzip(zipped); + * // => [['a', 'b'], [1, 2], [true, false]] + */ + function unzip(array) { + if (!(array && array.length)) { + return []; + } + var length = 0; + array = arrayFilter(array, function(group) { + if (isArrayLikeObject(group)) { + length = nativeMax(group.length, length); + return true; + } + }); + return baseTimes(length, function(index) { + return arrayMap(array, baseProperty(index)); + }); + } + + /** + * This method is like `_.unzip` except that it accepts `iteratee` to specify + * how regrouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {Array} array The array of grouped elements to process. + * @param {Function} [iteratee=_.identity] The function to combine + * regrouped values. + * @returns {Array} Returns the new array of regrouped elements. + * @example + * + * var zipped = _.zip([1, 2], [10, 20], [100, 200]); + * // => [[1, 10, 100], [2, 20, 200]] + * + * _.unzipWith(zipped, _.add); + * // => [3, 30, 300] + */ + function unzipWith(array, iteratee) { + if (!(array && array.length)) { + return []; + } + var result = unzip(array); + if (iteratee == null) { + return result; + } + return arrayMap(result, function(group) { + return apply(iteratee, undefined, group); + }); + } + + /** + * Creates an array excluding all given values using + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * for equality comparisons. + * + * **Note:** Unlike `_.pull`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {Array} array The array to inspect. + * @param {...*} [values] The values to exclude. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.xor + * @example + * + * _.without([2, 1, 2, 3], 1, 2); + * // => [3] + */ + var without = baseRest(function(array, values) { + return isArrayLikeObject(array) + ? baseDifference(array, values) + : []; + }); + + /** + * Creates an array of unique values that is the + * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference) + * of the given arrays. The order of result values is determined by the order + * they occur in the arrays. + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @returns {Array} Returns the new array of filtered values. + * @see _.difference, _.without + * @example + * + * _.xor([2, 1], [2, 3]); + * // => [1, 3] + */ + var xor = baseRest(function(arrays) { + return baseXor(arrayFilter(arrays, isArrayLikeObject)); + }); + + /** + * This method is like `_.xor` except that it accepts `iteratee` which is + * invoked for each element of each `arrays` to generate the criterion by + * which by which they're compared. The order of result values is determined + * by the order they occur in the arrays. The iteratee is invoked with one + * argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor); + * // => [1.2, 3.4] + * + * // The `_.property` iteratee shorthand. + * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x'); + * // => [{ 'x': 2 }] + */ + var xorBy = baseRest(function(arrays) { + var iteratee = last(arrays); + if (isArrayLikeObject(iteratee)) { + iteratee = undefined; + } + return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2)); + }); + + /** + * This method is like `_.xor` except that it accepts `comparator` which is + * invoked to compare elements of `arrays`. The order of result values is + * determined by the order they occur in the arrays. The comparator is invoked + * with two arguments: (arrVal, othVal). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Array + * @param {...Array} [arrays] The arrays to inspect. + * @param {Function} [comparator] The comparator invoked per element. + * @returns {Array} Returns the new array of filtered values. + * @example + * + * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]; + * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }]; + * + * _.xorWith(objects, others, _.isEqual); + * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }] + */ + var xorWith = baseRest(function(arrays) { + var comparator = last(arrays); + comparator = typeof comparator == 'function' ? comparator : undefined; + return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator); + }); + + /** + * Creates an array of grouped elements, the first of which contains the + * first elements of the given arrays, the second of which contains the + * second elements of the given arrays, and so on. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zip(['a', 'b'], [1, 2], [true, false]); + * // => [['a', 1, true], ['b', 2, false]] + */ + var zip = baseRest(unzip); + + /** + * This method is like `_.fromPairs` except that it accepts two arrays, + * one of property identifiers and one of corresponding values. + * + * @static + * @memberOf _ + * @since 0.4.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObject(['a', 'b'], [1, 2]); + * // => { 'a': 1, 'b': 2 } + */ + function zipObject(props, values) { + return baseZipObject(props || [], values || [], assignValue); + } + + /** + * This method is like `_.zipObject` except that it supports property paths. + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Array + * @param {Array} [props=[]] The property identifiers. + * @param {Array} [values=[]] The property values. + * @returns {Object} Returns the new object. + * @example + * + * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]); + * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } } + */ + function zipObjectDeep(props, values) { + return baseZipObject(props || [], values || [], baseSet); + } + + /** + * This method is like `_.zip` except that it accepts `iteratee` to specify + * how grouped values should be combined. The iteratee is invoked with the + * elements of each group: (...group). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Array + * @param {...Array} [arrays] The arrays to process. + * @param {Function} [iteratee=_.identity] The function to combine + * grouped values. + * @returns {Array} Returns the new array of grouped elements. + * @example + * + * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) { + * return a + b + c; + * }); + * // => [111, 222] + */ + var zipWith = baseRest(function(arrays) { + var length = arrays.length, + iteratee = length > 1 ? arrays[length - 1] : undefined; + + iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined; + return unzipWith(arrays, iteratee); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Creates a `lodash` wrapper instance that wraps `value` with explicit method + * chain sequences enabled. The result of such sequences must be unwrapped + * with `_#value`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Seq + * @param {*} value The value to wrap. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'pebbles', 'age': 1 } + * ]; + * + * var youngest = _ + * .chain(users) + * .sortBy('age') + * .map(function(o) { + * return o.user + ' is ' + o.age; + * }) + * .head() + * .value(); + * // => 'pebbles is 1' + */ + function chain(value) { + var result = lodash(value); + result.__chain__ = true; + return result; + } + + /** + * This method invokes `interceptor` and returns `value`. The interceptor + * is invoked with one argument; (value). The purpose of this method is to + * "tap into" a method chain sequence in order to modify intermediate results. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns `value`. + * @example + * + * _([1, 2, 3]) + * .tap(function(array) { + * // Mutate input array. + * array.pop(); + * }) + * .reverse() + * .value(); + * // => [2, 1] + */ + function tap(value, interceptor) { + interceptor(value); + return value; + } + + /** + * This method is like `_.tap` except that it returns the result of `interceptor`. + * The purpose of this method is to "pass thru" values replacing intermediate + * results in a method chain sequence. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Seq + * @param {*} value The value to provide to `interceptor`. + * @param {Function} interceptor The function to invoke. + * @returns {*} Returns the result of `interceptor`. + * @example + * + * _(' abc ') + * .chain() + * .trim() + * .thru(function(value) { + * return [value]; + * }) + * .value(); + * // => ['abc'] + */ + function thru(value, interceptor) { + return interceptor(value); + } + + /** + * This method is the wrapper version of `_.at`. + * + * @name at + * @memberOf _ + * @since 1.0.0 + * @category Seq + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _(object).at(['a[0].b.c', 'a[1]']).value(); + * // => [3, 4] + */ + var wrapperAt = flatRest(function(paths) { + var length = paths.length, + start = length ? paths[0] : 0, + value = this.__wrapped__, + interceptor = function(object) { return baseAt(object, paths); }; + + if (length > 1 || this.__actions__.length || + !(value instanceof LazyWrapper) || !isIndex(start)) { + return this.thru(interceptor); + } + value = value.slice(start, +start + (length ? 1 : 0)); + value.__actions__.push({ + 'func': thru, + 'args': [interceptor], + 'thisArg': undefined + }); + return new LodashWrapper(value, this.__chain__).thru(function(array) { + if (length && !array.length) { + array.push(undefined); + } + return array; + }); + }); + + /** + * Creates a `lodash` wrapper instance with explicit method chain sequences enabled. + * + * @name chain + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 } + * ]; + * + * // A sequence without explicit chaining. + * _(users).head(); + * // => { 'user': 'barney', 'age': 36 } + * + * // A sequence with explicit chaining. + * _(users) + * .chain() + * .head() + * .pick('user') + * .value(); + * // => { 'user': 'barney' } + */ + function wrapperChain() { + return chain(this); + } + + /** + * Executes the chain sequence and returns the wrapped result. + * + * @name commit + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2]; + * var wrapped = _(array).push(3); + * + * console.log(array); + * // => [1, 2] + * + * wrapped = wrapped.commit(); + * console.log(array); + * // => [1, 2, 3] + * + * wrapped.last(); + * // => 3 + * + * console.log(array); + * // => [1, 2, 3] + */ + function wrapperCommit() { + return new LodashWrapper(this.value(), this.__chain__); + } + + /** + * Gets the next value on a wrapped object following the + * [iterator protocol](https://mdn.io/iteration_protocols#iterator). + * + * @name next + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the next iterator value. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped.next(); + * // => { 'done': false, 'value': 1 } + * + * wrapped.next(); + * // => { 'done': false, 'value': 2 } + * + * wrapped.next(); + * // => { 'done': true, 'value': undefined } + */ + function wrapperNext() { + if (this.__values__ === undefined) { + this.__values__ = toArray(this.value()); + } + var done = this.__index__ >= this.__values__.length, + value = done ? undefined : this.__values__[this.__index__++]; + + return { 'done': done, 'value': value }; + } + + /** + * Enables the wrapper to be iterable. + * + * @name Symbol.iterator + * @memberOf _ + * @since 4.0.0 + * @category Seq + * @returns {Object} Returns the wrapper object. + * @example + * + * var wrapped = _([1, 2]); + * + * wrapped[Symbol.iterator]() === wrapped; + * // => true + * + * Array.from(wrapped); + * // => [1, 2] + */ + function wrapperToIterator() { + return this; + } + + /** + * Creates a clone of the chain sequence planting `value` as the wrapped value. + * + * @name plant + * @memberOf _ + * @since 3.2.0 + * @category Seq + * @param {*} value The value to plant. + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * function square(n) { + * return n * n; + * } + * + * var wrapped = _([1, 2]).map(square); + * var other = wrapped.plant([3, 4]); + * + * other.value(); + * // => [9, 16] + * + * wrapped.value(); + * // => [1, 4] + */ + function wrapperPlant(value) { + var result, + parent = this; + + while (parent instanceof baseLodash) { + var clone = wrapperClone(parent); + clone.__index__ = 0; + clone.__values__ = undefined; + if (result) { + previous.__wrapped__ = clone; + } else { + result = clone; + } + var previous = clone; + parent = parent.__wrapped__; + } + previous.__wrapped__ = value; + return result; + } + + /** + * This method is the wrapper version of `_.reverse`. + * + * **Note:** This method mutates the wrapped array. + * + * @name reverse + * @memberOf _ + * @since 0.1.0 + * @category Seq + * @returns {Object} Returns the new `lodash` wrapper instance. + * @example + * + * var array = [1, 2, 3]; + * + * _(array).reverse().value() + * // => [3, 2, 1] + * + * console.log(array); + * // => [3, 2, 1] + */ + function wrapperReverse() { + var value = this.__wrapped__; + if (value instanceof LazyWrapper) { + var wrapped = value; + if (this.__actions__.length) { + wrapped = new LazyWrapper(this); + } + wrapped = wrapped.reverse(); + wrapped.__actions__.push({ + 'func': thru, + 'args': [reverse], + 'thisArg': undefined + }); + return new LodashWrapper(wrapped, this.__chain__); + } + return this.thru(reverse); + } + + /** + * Executes the chain sequence to resolve the unwrapped value. + * + * @name value + * @memberOf _ + * @since 0.1.0 + * @alias toJSON, valueOf + * @category Seq + * @returns {*} Returns the resolved unwrapped value. + * @example + * + * _([1, 2, 3]).value(); + * // => [1, 2, 3] + */ + function wrapperValue() { + return baseWrapperValue(this.__wrapped__, this.__actions__); + } + + /*------------------------------------------------------------------------*/ + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the number of times the key was returned by `iteratee`. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.countBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': 1, '6': 2 } + * + * // The `_.property` iteratee shorthand. + * _.countBy(['one', 'two', 'three'], 'length'); + * // => { '3': 2, '5': 1 } + */ + var countBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + ++result[key]; + } else { + baseAssignValue(result, key, 1); + } + }); + + /** + * Checks if `predicate` returns truthy for **all** elements of `collection`. + * Iteration is stopped once `predicate` returns falsey. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * **Note:** This method returns `true` for + * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because + * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of + * elements of empty collections. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if all elements pass the predicate check, + * else `false`. + * @example + * + * _.every([true, 1, null, 'yes'], Boolean); + * // => false + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.every(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.every(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.every(users, 'active'); + * // => false + */ + function every(collection, predicate, guard) { + var func = isArray(collection) ? arrayEvery : baseEvery; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning an array of all elements + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * **Note:** Unlike `_.remove`, this method returns a new array. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.reject + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false } + * ]; + * + * _.filter(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.filter(users, { 'age': 36, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.filter(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.filter(users, 'active'); + * // => objects for ['barney'] + */ + function filter(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Iterates over elements of `collection`, returning the first element + * `predicate` returns truthy for. The predicate is invoked with three + * arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=0] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': true }, + * { 'user': 'fred', 'age': 40, 'active': false }, + * { 'user': 'pebbles', 'age': 1, 'active': true } + * ]; + * + * _.find(users, function(o) { return o.age < 40; }); + * // => object for 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.find(users, { 'age': 1, 'active': true }); + * // => object for 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.find(users, ['active', false]); + * // => object for 'fred' + * + * // The `_.property` iteratee shorthand. + * _.find(users, 'active'); + * // => object for 'barney' + */ + var find = createFind(findIndex); + + /** + * This method is like `_.find` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param {number} [fromIndex=collection.length-1] The index to search from. + * @returns {*} Returns the matched element, else `undefined`. + * @example + * + * _.findLast([1, 2, 3, 4], function(n) { + * return n % 2 == 1; + * }); + * // => 3 + */ + var findLast = createFind(findLastIndex); + + /** + * Creates a flattened array of values by running each element in `collection` + * thru `iteratee` and flattening the mapped results. The iteratee is invoked + * with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [n, n]; + * } + * + * _.flatMap([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMap(collection, iteratee) { + return baseFlatten(map(collection, iteratee), 1); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDeep([1, 2], duplicate); + * // => [1, 1, 2, 2] + */ + function flatMapDeep(collection, iteratee) { + return baseFlatten(map(collection, iteratee), INFINITY); + } + + /** + * This method is like `_.flatMap` except that it recursively flattens the + * mapped results up to `depth` times. + * + * @static + * @memberOf _ + * @since 4.7.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {number} [depth=1] The maximum recursion depth. + * @returns {Array} Returns the new flattened array. + * @example + * + * function duplicate(n) { + * return [[[n, n]]]; + * } + * + * _.flatMapDepth([1, 2], duplicate, 2); + * // => [[1, 1], [2, 2]] + */ + function flatMapDepth(collection, iteratee, depth) { + depth = depth === undefined ? 1 : toInteger(depth); + return baseFlatten(map(collection, iteratee), depth); + } + + /** + * Iterates over elements of `collection` and invokes `iteratee` for each element. + * The iteratee is invoked with three arguments: (value, index|key, collection). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * **Note:** As with other "Collections" methods, objects with a "length" + * property are iterated like arrays. To avoid this behavior use `_.forIn` + * or `_.forOwn` for object iteration. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @alias each + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEachRight + * @example + * + * _.forEach([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `1` then `2`. + * + * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forEach(collection, iteratee) { + var func = isArray(collection) ? arrayEach : baseEach; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forEach` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @alias eachRight + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array|Object} Returns `collection`. + * @see _.forEach + * @example + * + * _.forEachRight([1, 2], function(value) { + * console.log(value); + * }); + * // => Logs `2` then `1`. + */ + function forEachRight(collection, iteratee) { + var func = isArray(collection) ? arrayEachRight : baseEachRight; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The order of grouped values + * is determined by the order they occur in `collection`. The corresponding + * value of each key is an array of elements responsible for generating the + * key. The iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * _.groupBy([6.1, 4.2, 6.3], Math.floor); + * // => { '4': [4.2], '6': [6.1, 6.3] } + * + * // The `_.property` iteratee shorthand. + * _.groupBy(['one', 'two', 'three'], 'length'); + * // => { '3': ['one', 'two'], '5': ['three'] } + */ + var groupBy = createAggregator(function(result, value, key) { + if (hasOwnProperty.call(result, key)) { + result[key].push(value); + } else { + baseAssignValue(result, key, [value]); + } + }); + + /** + * Checks if `value` is in `collection`. If `collection` is a string, it's + * checked for a substring of `value`, otherwise + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * is used for equality comparisons. If `fromIndex` is negative, it's used as + * the offset from the end of `collection`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @param {*} value The value to search for. + * @param {number} [fromIndex=0] The index to search from. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {boolean} Returns `true` if `value` is found, else `false`. + * @example + * + * _.includes([1, 2, 3], 1); + * // => true + * + * _.includes([1, 2, 3], 1, 2); + * // => false + * + * _.includes({ 'a': 1, 'b': 2 }, 1); + * // => true + * + * _.includes('abcd', 'bc'); + * // => true + */ + function includes(collection, value, fromIndex, guard) { + collection = isArrayLike(collection) ? collection : values(collection); + fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0; + + var length = collection.length; + if (fromIndex < 0) { + fromIndex = nativeMax(length + fromIndex, 0); + } + return isString(collection) + ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1) + : (!!length && baseIndexOf(collection, value, fromIndex) > -1); + } + + /** + * Invokes the method at `path` of each element in `collection`, returning + * an array of the results of each invoked method. Any additional arguments + * are provided to each invoked method. If `path` is a function, it's invoked + * for, and `this` bound to, each element in `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array|Function|string} path The path of the method to invoke or + * the function invoked per iteration. + * @param {...*} [args] The arguments to invoke each method with. + * @returns {Array} Returns the array of results. + * @example + * + * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort'); + * // => [[1, 5, 7], [1, 2, 3]] + * + * _.invokeMap([123, 456], String.prototype.split, ''); + * // => [['1', '2', '3'], ['4', '5', '6']] + */ + var invokeMap = baseRest(function(collection, path, args) { + var index = -1, + isFunc = typeof path == 'function', + result = isArrayLike(collection) ? Array(collection.length) : []; + + baseEach(collection, function(value) { + result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args); + }); + return result; + }); + + /** + * Creates an object composed of keys generated from the results of running + * each element of `collection` thru `iteratee`. The corresponding value of + * each key is the last element responsible for generating the key. The + * iteratee is invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The iteratee to transform keys. + * @returns {Object} Returns the composed aggregate object. + * @example + * + * var array = [ + * { 'dir': 'left', 'code': 97 }, + * { 'dir': 'right', 'code': 100 } + * ]; + * + * _.keyBy(array, function(o) { + * return String.fromCharCode(o.code); + * }); + * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } } + * + * _.keyBy(array, 'dir'); + * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } } + */ + var keyBy = createAggregator(function(result, value, key) { + baseAssignValue(result, key, value); + }); + + /** + * Creates an array of values by running each element in `collection` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`. + * + * The guarded methods are: + * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`, + * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`, + * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`, + * `template`, `trim`, `trimEnd`, `trimStart`, and `words` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new mapped array. + * @example + * + * function square(n) { + * return n * n; + * } + * + * _.map([4, 8], square); + * // => [16, 64] + * + * _.map({ 'a': 4, 'b': 8 }, square); + * // => [16, 64] (iteration order is not guaranteed) + * + * var users = [ + * { 'user': 'barney' }, + * { 'user': 'fred' } + * ]; + * + * // The `_.property` iteratee shorthand. + * _.map(users, 'user'); + * // => ['barney', 'fred'] + */ + function map(collection, iteratee) { + var func = isArray(collection) ? arrayMap : baseMap; + return func(collection, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.sortBy` except that it allows specifying the sort + * orders of the iteratees to sort by. If `orders` is unspecified, all values + * are sorted in ascending order. Otherwise, specify an order of "desc" for + * descending or "asc" for ascending sort order of corresponding values. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]] + * The iteratees to sort by. + * @param {string[]} [orders] The sort orders of `iteratees`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 34 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 36 } + * ]; + * + * // Sort by `user` in ascending order and by `age` in descending order. + * _.orderBy(users, ['user', 'age'], ['asc', 'desc']); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + */ + function orderBy(collection, iteratees, orders, guard) { + if (collection == null) { + return []; + } + if (!isArray(iteratees)) { + iteratees = iteratees == null ? [] : [iteratees]; + } + orders = guard ? undefined : orders; + if (!isArray(orders)) { + orders = orders == null ? [] : [orders]; + } + return baseOrderBy(collection, iteratees, orders); + } + + /** + * Creates an array of elements split into two groups, the first of which + * contains elements `predicate` returns truthy for, the second of which + * contains elements `predicate` returns falsey for. The predicate is + * invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the array of grouped elements. + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true }, + * { 'user': 'pebbles', 'age': 1, 'active': false } + * ]; + * + * _.partition(users, function(o) { return o.active; }); + * // => objects for [['fred'], ['barney', 'pebbles']] + * + * // The `_.matches` iteratee shorthand. + * _.partition(users, { 'age': 1, 'active': false }); + * // => objects for [['pebbles'], ['barney', 'fred']] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.partition(users, ['active', false]); + * // => objects for [['barney', 'pebbles'], ['fred']] + * + * // The `_.property` iteratee shorthand. + * _.partition(users, 'active'); + * // => objects for [['fred'], ['barney', 'pebbles']] + */ + var partition = createAggregator(function(result, value, key) { + result[key ? 0 : 1].push(value); + }, function() { return [[], []]; }); + + /** + * Reduces `collection` to a value which is the accumulated result of running + * each element in `collection` thru `iteratee`, where each successive + * invocation is supplied the return value of the previous. If `accumulator` + * is not given, the first element of `collection` is used as the initial + * value. The iteratee is invoked with four arguments: + * (accumulator, value, index|key, collection). + * + * Many lodash methods are guarded to work as iteratees for methods like + * `_.reduce`, `_.reduceRight`, and `_.transform`. + * + * The guarded methods are: + * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`, + * and `sortBy` + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduceRight + * @example + * + * _.reduce([1, 2], function(sum, n) { + * return sum + n; + * }, 0); + * // => 3 + * + * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * return result; + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed) + */ + function reduce(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduce : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach); + } + + /** + * This method is like `_.reduce` except that it iterates over elements of + * `collection` from right to left. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The initial value. + * @returns {*} Returns the accumulated value. + * @see _.reduce + * @example + * + * var array = [[0, 1], [2, 3], [4, 5]]; + * + * _.reduceRight(array, function(flattened, other) { + * return flattened.concat(other); + * }, []); + * // => [4, 5, 2, 3, 0, 1] + */ + function reduceRight(collection, iteratee, accumulator) { + var func = isArray(collection) ? arrayReduceRight : baseReduce, + initAccum = arguments.length < 3; + + return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight); + } + + /** + * The opposite of `_.filter`; this method returns the elements of `collection` + * that `predicate` does **not** return truthy for. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {Array} Returns the new filtered array. + * @see _.filter + * @example + * + * var users = [ + * { 'user': 'barney', 'age': 36, 'active': false }, + * { 'user': 'fred', 'age': 40, 'active': true } + * ]; + * + * _.reject(users, function(o) { return !o.active; }); + * // => objects for ['fred'] + * + * // The `_.matches` iteratee shorthand. + * _.reject(users, { 'age': 40, 'active': true }); + * // => objects for ['barney'] + * + * // The `_.matchesProperty` iteratee shorthand. + * _.reject(users, ['active', false]); + * // => objects for ['fred'] + * + * // The `_.property` iteratee shorthand. + * _.reject(users, 'active'); + * // => objects for ['barney'] + */ + function reject(collection, predicate) { + var func = isArray(collection) ? arrayFilter : baseFilter; + return func(collection, negate(getIteratee(predicate, 3))); + } + + /** + * Gets a random element from `collection`. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @returns {*} Returns the random element. + * @example + * + * _.sample([1, 2, 3, 4]); + * // => 2 + */ + function sample(collection) { + var func = isArray(collection) ? arraySample : baseSample; + return func(collection); + } + + /** + * Gets `n` random elements at unique keys from `collection` up to the + * size of `collection`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Collection + * @param {Array|Object} collection The collection to sample. + * @param {number} [n=1] The number of elements to sample. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Array} Returns the random elements. + * @example + * + * _.sampleSize([1, 2, 3], 2); + * // => [3, 1] + * + * _.sampleSize([1, 2, 3], 4); + * // => [2, 3, 1] + */ + function sampleSize(collection, n, guard) { + if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + var func = isArray(collection) ? arraySampleSize : baseSampleSize; + return func(collection, n); + } + + /** + * Creates an array of shuffled values, using a version of the + * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to shuffle. + * @returns {Array} Returns the new shuffled array. + * @example + * + * _.shuffle([1, 2, 3, 4]); + * // => [4, 1, 3, 2] + */ + function shuffle(collection) { + var func = isArray(collection) ? arrayShuffle : baseShuffle; + return func(collection); + } + + /** + * Gets the size of `collection` by returning its length for array-like + * values or the number of own enumerable string keyed properties for objects. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object|string} collection The collection to inspect. + * @returns {number} Returns the collection size. + * @example + * + * _.size([1, 2, 3]); + * // => 3 + * + * _.size({ 'a': 1, 'b': 2 }); + * // => 2 + * + * _.size('pebbles'); + * // => 7 + */ + function size(collection) { + if (collection == null) { + return 0; + } + if (isArrayLike(collection)) { + return isString(collection) ? stringSize(collection) : collection.length; + } + var tag = getTag(collection); + if (tag == mapTag || tag == setTag) { + return collection.size; + } + return baseKeys(collection).length; + } + + /** + * Checks if `predicate` returns truthy for **any** element of `collection`. + * Iteration is stopped once `predicate` returns truthy. The predicate is + * invoked with three arguments: (value, index|key, collection). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {boolean} Returns `true` if any element passes the predicate check, + * else `false`. + * @example + * + * _.some([null, 0, 'yes', false], Boolean); + * // => true + * + * var users = [ + * { 'user': 'barney', 'active': true }, + * { 'user': 'fred', 'active': false } + * ]; + * + * // The `_.matches` iteratee shorthand. + * _.some(users, { 'user': 'barney', 'active': false }); + * // => false + * + * // The `_.matchesProperty` iteratee shorthand. + * _.some(users, ['active', false]); + * // => true + * + * // The `_.property` iteratee shorthand. + * _.some(users, 'active'); + * // => true + */ + function some(collection, predicate, guard) { + var func = isArray(collection) ? arraySome : baseSome; + if (guard && isIterateeCall(collection, predicate, guard)) { + predicate = undefined; + } + return func(collection, getIteratee(predicate, 3)); + } + + /** + * Creates an array of elements, sorted in ascending order by the results of + * running each element in a collection thru each iteratee. This method + * performs a stable sort, that is, it preserves the original sort order of + * equal elements. The iteratees are invoked with one argument: (value). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Collection + * @param {Array|Object} collection The collection to iterate over. + * @param {...(Function|Function[])} [iteratees=[_.identity]] + * The iteratees to sort by. + * @returns {Array} Returns the new sorted array. + * @example + * + * var users = [ + * { 'user': 'fred', 'age': 48 }, + * { 'user': 'barney', 'age': 36 }, + * { 'user': 'fred', 'age': 40 }, + * { 'user': 'barney', 'age': 34 } + * ]; + * + * _.sortBy(users, [function(o) { return o.user; }]); + * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]] + * + * _.sortBy(users, ['user', 'age']); + * // => objects for [['barney', 34], ['barney', 36], ['fred', 40], ['fred', 48]] + */ + var sortBy = baseRest(function(collection, iteratees) { + if (collection == null) { + return []; + } + var length = iteratees.length; + if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) { + iteratees = []; + } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) { + iteratees = [iteratees[0]]; + } + return baseOrderBy(collection, baseFlatten(iteratees, 1), []); + }); + + /*------------------------------------------------------------------------*/ + + /** + * Gets the timestamp of the number of milliseconds that have elapsed since + * the Unix epoch (1 January 1970 00:00:00 UTC). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Date + * @returns {number} Returns the timestamp. + * @example + * + * _.defer(function(stamp) { + * console.log(_.now() - stamp); + * }, _.now()); + * // => Logs the number of milliseconds it took for the deferred invocation. + */ + var now = ctxNow || function() { + return root.Date.now(); + }; + + /*------------------------------------------------------------------------*/ + + /** + * The opposite of `_.before`; this method creates a function that invokes + * `func` once it's called `n` or more times. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {number} n The number of calls before `func` is invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var saves = ['profile', 'settings']; + * + * var done = _.after(saves.length, function() { + * console.log('done saving!'); + * }); + * + * _.forEach(saves, function(type) { + * asyncSave({ 'type': type, 'complete': done }); + * }); + * // => Logs 'done saving!' after the two async saves have completed. + */ + function after(n, func) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n < 1) { + return func.apply(this, arguments); + } + }; + } + + /** + * Creates a function that invokes `func`, with up to `n` arguments, + * ignoring any additional arguments. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @param {number} [n=func.length] The arity cap. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.ary(parseInt, 1)); + * // => [6, 8, 10] + */ + function ary(func, n, guard) { + n = guard ? undefined : n; + n = (func && n == null) ? func.length : n; + return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n); + } + + /** + * Creates a function that invokes `func`, with the `this` binding and arguments + * of the created function, while it's called less than `n` times. Subsequent + * calls to the created function return the result of the last `func` invocation. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {number} n The number of calls at which `func` is no longer invoked. + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * jQuery(element).on('click', _.before(5, addContactToList)); + * // => Allows adding up to 4 contacts to the list. + */ + function before(n, func) { + var result; + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + n = toInteger(n); + return function() { + if (--n > 0) { + result = func.apply(this, arguments); + } + if (n <= 1) { + func = undefined; + } + return result; + }; + } + + /** + * Creates a function that invokes `func` with the `this` binding of `thisArg` + * and `partials` prepended to the arguments it receives. + * + * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for partially applied arguments. + * + * **Note:** Unlike native `Function#bind`, this method doesn't set the "length" + * property of bound functions. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to bind. + * @param {*} thisArg The `this` binding of `func`. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * function greet(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * + * var object = { 'user': 'fred' }; + * + * var bound = _.bind(greet, object, 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * // Bound with placeholders. + * var bound = _.bind(greet, object, _, '!'); + * bound('hi'); + * // => 'hi fred!' + */ + var bind = baseRest(function(func, thisArg, partials) { + var bitmask = WRAP_BIND_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bind)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(func, bitmask, thisArg, partials, holders); + }); + + /** + * Creates a function that invokes the method at `object[key]` with `partials` + * prepended to the arguments it receives. + * + * This method differs from `_.bind` by allowing bound functions to reference + * methods that may be redefined or don't yet exist. See + * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern) + * for more details. + * + * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Function + * @param {Object} object The object to invoke the method on. + * @param {string} key The key of the method. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new bound function. + * @example + * + * var object = { + * 'user': 'fred', + * 'greet': function(greeting, punctuation) { + * return greeting + ' ' + this.user + punctuation; + * } + * }; + * + * var bound = _.bindKey(object, 'greet', 'hi'); + * bound('!'); + * // => 'hi fred!' + * + * object.greet = function(greeting, punctuation) { + * return greeting + 'ya ' + this.user + punctuation; + * }; + * + * bound('!'); + * // => 'hiya fred!' + * + * // Bound with placeholders. + * var bound = _.bindKey(object, 'greet', _, '!'); + * bound('hi'); + * // => 'hiya fred!' + */ + var bindKey = baseRest(function(object, key, partials) { + var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG; + if (partials.length) { + var holders = replaceHolders(partials, getHolder(bindKey)); + bitmask |= WRAP_PARTIAL_FLAG; + } + return createWrap(key, bitmask, object, partials, holders); + }); + + /** + * Creates a function that accepts arguments of `func` and either invokes + * `func` returning its result, if at least `arity` number of arguments have + * been provided, or returns a function that accepts the remaining `func` + * arguments, and so on. The arity of `func` may be specified if `func.length` + * is not sufficient. + * + * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, + * may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curry(abc); + * + * curried(1)(2)(3); + * // => [1, 2, 3] + * + * curried(1, 2)(3); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(1)(_, 3)(2); + * // => [1, 2, 3] + */ + function curry(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curry.placeholder; + return result; + } + + /** + * This method is like `_.curry` except that arguments are applied to `func` + * in the manner of `_.partialRight` instead of `_.partial`. + * + * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for provided arguments. + * + * **Note:** This method doesn't set the "length" property of curried functions. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to curry. + * @param {number} [arity=func.length] The arity of `func`. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the new curried function. + * @example + * + * var abc = function(a, b, c) { + * return [a, b, c]; + * }; + * + * var curried = _.curryRight(abc); + * + * curried(3)(2)(1); + * // => [1, 2, 3] + * + * curried(2, 3)(1); + * // => [1, 2, 3] + * + * curried(1, 2, 3); + * // => [1, 2, 3] + * + * // Curried with placeholders. + * curried(3)(1, _)(2); + * // => [1, 2, 3] + */ + function curryRight(func, arity, guard) { + arity = guard ? undefined : arity; + var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity); + result.placeholder = curryRight.placeholder; + return result; + } + + /** + * Creates a debounced function that delays invoking `func` until after `wait` + * milliseconds have elapsed since the last time the debounced function was + * invoked. The debounced function comes with a `cancel` method to cancel + * delayed `func` invocations and a `flush` method to immediately invoke them. + * Provide `options` to indicate whether `func` should be invoked on the + * leading and/or trailing edge of the `wait` timeout. The `func` is invoked + * with the last arguments provided to the debounced function. Subsequent + * calls to the debounced function return the result of the last `func` + * invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the debounced function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.debounce` and `_.throttle`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to debounce. + * @param {number} [wait=0] The number of milliseconds to delay. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=false] + * Specify invoking on the leading edge of the timeout. + * @param {number} [options.maxWait] + * The maximum time `func` is allowed to be delayed before it's invoked. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new debounced function. + * @example + * + * // Avoid costly calculations while the window size is in flux. + * jQuery(window).on('resize', _.debounce(calculateLayout, 150)); + * + * // Invoke `sendMail` when clicked, debouncing subsequent calls. + * jQuery(element).on('click', _.debounce(sendMail, 300, { + * 'leading': true, + * 'trailing': false + * })); + * + * // Ensure `batchLog` is invoked once after 1 second of debounced calls. + * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 }); + * var source = new EventSource('/stream'); + * jQuery(source).on('message', debounced); + * + * // Cancel the trailing debounced invocation. + * jQuery(window).on('popstate', debounced.cancel); + */ + function debounce(func, wait, options) { + var lastArgs, + lastThis, + maxWait, + result, + timerId, + lastCallTime, + lastInvokeTime = 0, + leading = false, + maxing = false, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + wait = toNumber(wait) || 0; + if (isObject(options)) { + leading = !!options.leading; + maxing = 'maxWait' in options; + maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + + function invokeFunc(time) { + var args = lastArgs, + thisArg = lastThis; + + lastArgs = lastThis = undefined; + lastInvokeTime = time; + result = func.apply(thisArg, args); + return result; + } + + function leadingEdge(time) { + // Reset any `maxWait` timer. + lastInvokeTime = time; + // Start the timer for the trailing edge. + timerId = setTimeout(timerExpired, wait); + // Invoke the leading edge. + return leading ? invokeFunc(time) : result; + } + + function remainingWait(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime, + timeWaiting = wait - timeSinceLastCall; + + return maxing + ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) + : timeWaiting; + } + + function shouldInvoke(time) { + var timeSinceLastCall = time - lastCallTime, + timeSinceLastInvoke = time - lastInvokeTime; + + // Either this is the first call, activity has stopped and we're at the + // trailing edge, the system time has gone backwards and we're treating + // it as the trailing edge, or we've hit the `maxWait` limit. + return (lastCallTime === undefined || (timeSinceLastCall >= wait) || + (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait)); + } + + function timerExpired() { + var time = now(); + if (shouldInvoke(time)) { + return trailingEdge(time); + } + // Restart the timer. + timerId = setTimeout(timerExpired, remainingWait(time)); + } + + function trailingEdge(time) { + timerId = undefined; + + // Only invoke if we have `lastArgs` which means `func` has been + // debounced at least once. + if (trailing && lastArgs) { + return invokeFunc(time); + } + lastArgs = lastThis = undefined; + return result; + } + + function cancel() { + if (timerId !== undefined) { + clearTimeout(timerId); + } + lastInvokeTime = 0; + lastArgs = lastCallTime = lastThis = timerId = undefined; + } + + function flush() { + return timerId === undefined ? result : trailingEdge(now()); + } + + function debounced() { + var time = now(), + isInvoking = shouldInvoke(time); + + lastArgs = arguments; + lastThis = this; + lastCallTime = time; + + if (isInvoking) { + if (timerId === undefined) { + return leadingEdge(lastCallTime); + } + if (maxing) { + // Handle invocations in a tight loop. + timerId = setTimeout(timerExpired, wait); + return invokeFunc(lastCallTime); + } + } + if (timerId === undefined) { + timerId = setTimeout(timerExpired, wait); + } + return result; + } + debounced.cancel = cancel; + debounced.flush = flush; + return debounced; + } + + /** + * Defers invoking the `func` until the current call stack has cleared. Any + * additional arguments are provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to defer. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.defer(function(text) { + * console.log(text); + * }, 'deferred'); + * // => Logs 'deferred' after one millisecond. + */ + var defer = baseRest(function(func, args) { + return baseDelay(func, 1, args); + }); + + /** + * Invokes `func` after `wait` milliseconds. Any additional arguments are + * provided to `func` when it's invoked. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to delay. + * @param {number} wait The number of milliseconds to delay invocation. + * @param {...*} [args] The arguments to invoke `func` with. + * @returns {number} Returns the timer id. + * @example + * + * _.delay(function(text) { + * console.log(text); + * }, 1000, 'later'); + * // => Logs 'later' after one second. + */ + var delay = baseRest(function(func, wait, args) { + return baseDelay(func, toNumber(wait) || 0, args); + }); + + /** + * Creates a function that invokes `func` with arguments reversed. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to flip arguments for. + * @returns {Function} Returns the new flipped function. + * @example + * + * var flipped = _.flip(function() { + * return _.toArray(arguments); + * }); + * + * flipped('a', 'b', 'c', 'd'); + * // => ['d', 'c', 'b', 'a'] + */ + function flip(func) { + return createWrap(func, WRAP_FLIP_FLAG); + } + + /** + * Creates a function that memoizes the result of `func`. If `resolver` is + * provided, it determines the cache key for storing the result based on the + * arguments provided to the memoized function. By default, the first argument + * provided to the memoized function is used as the map cache key. The `func` + * is invoked with the `this` binding of the memoized function. + * + * **Note:** The cache is exposed as the `cache` property on the memoized + * function. Its creation may be customized by replacing the `_.memoize.Cache` + * constructor with one whose instances implement the + * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) + * method interface of `clear`, `delete`, `get`, `has`, and `set`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to have its output memoized. + * @param {Function} [resolver] The function to resolve the cache key. + * @returns {Function} Returns the new memoized function. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * var other = { 'c': 3, 'd': 4 }; + * + * var values = _.memoize(_.values); + * values(object); + * // => [1, 2] + * + * values(other); + * // => [3, 4] + * + * object.a = 2; + * values(object); + * // => [1, 2] + * + * // Modify the result cache. + * values.cache.set(object, ['a', 'b']); + * values(object); + * // => ['a', 'b'] + * + * // Replace `_.memoize.Cache`. + * _.memoize.Cache = WeakMap; + */ + function memoize(func, resolver) { + if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) { + throw new TypeError(FUNC_ERROR_TEXT); + } + var memoized = function() { + var args = arguments, + key = resolver ? resolver.apply(this, args) : args[0], + cache = memoized.cache; + + if (cache.has(key)) { + return cache.get(key); + } + var result = func.apply(this, args); + memoized.cache = cache.set(key, result) || cache; + return result; + }; + memoized.cache = new (memoize.Cache || MapCache); + return memoized; + } + + // Expose `MapCache`. + memoize.Cache = MapCache; + + /** + * Creates a function that negates the result of the predicate `func`. The + * `func` predicate is invoked with the `this` binding and arguments of the + * created function. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} predicate The predicate to negate. + * @returns {Function} Returns the new negated function. + * @example + * + * function isEven(n) { + * return n % 2 == 0; + * } + * + * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven)); + * // => [1, 3, 5] + */ + function negate(predicate) { + if (typeof predicate != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + return function() { + var args = arguments; + switch (args.length) { + case 0: return !predicate.call(this); + case 1: return !predicate.call(this, args[0]); + case 2: return !predicate.call(this, args[0], args[1]); + case 3: return !predicate.call(this, args[0], args[1], args[2]); + } + return !predicate.apply(this, args); + }; + } + + /** + * Creates a function that is restricted to invoking `func` once. Repeat calls + * to the function return the value of the first invocation. The `func` is + * invoked with the `this` binding and arguments of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to restrict. + * @returns {Function} Returns the new restricted function. + * @example + * + * var initialize = _.once(createApplication); + * initialize(); + * initialize(); + * // => `createApplication` is invoked once + */ + function once(func) { + return before(2, func); + } + + /** + * Creates a function that invokes `func` with its arguments transformed. + * + * @static + * @since 4.0.0 + * @memberOf _ + * @category Function + * @param {Function} func The function to wrap. + * @param {...(Function|Function[])} [transforms=[_.identity]] + * The argument transforms. + * @returns {Function} Returns the new function. + * @example + * + * function doubled(n) { + * return n * 2; + * } + * + * function square(n) { + * return n * n; + * } + * + * var func = _.overArgs(function(x, y) { + * return [x, y]; + * }, [square, doubled]); + * + * func(9, 3); + * // => [81, 6] + * + * func(10, 5); + * // => [100, 10] + */ + var overArgs = castRest(function(func, transforms) { + transforms = (transforms.length == 1 && isArray(transforms[0])) + ? arrayMap(transforms[0], baseUnary(getIteratee())) + : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee())); + + var funcsLength = transforms.length; + return baseRest(function(args) { + var index = -1, + length = nativeMin(args.length, funcsLength); + + while (++index < length) { + args[index] = transforms[index].call(this, args[index]); + } + return apply(func, this, args); + }); + }); + + /** + * Creates a function that invokes `func` with `partials` prepended to the + * arguments it receives. This method is like `_.bind` except it does **not** + * alter the `this` binding. + * + * The `_.partial.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 0.2.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var sayHelloTo = _.partial(greet, 'hello'); + * sayHelloTo('fred'); + * // => 'hello fred' + * + * // Partially applied with placeholders. + * var greetFred = _.partial(greet, _, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + */ + var partial = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partial)); + return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders); + }); + + /** + * This method is like `_.partial` except that partially applied arguments + * are appended to the arguments it receives. + * + * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic + * builds, may be used as a placeholder for partially applied arguments. + * + * **Note:** This method doesn't set the "length" property of partially + * applied functions. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Function + * @param {Function} func The function to partially apply arguments to. + * @param {...*} [partials] The arguments to be partially applied. + * @returns {Function} Returns the new partially applied function. + * @example + * + * function greet(greeting, name) { + * return greeting + ' ' + name; + * } + * + * var greetFred = _.partialRight(greet, 'fred'); + * greetFred('hi'); + * // => 'hi fred' + * + * // Partially applied with placeholders. + * var sayHelloTo = _.partialRight(greet, 'hello', _); + * sayHelloTo('fred'); + * // => 'hello fred' + */ + var partialRight = baseRest(function(func, partials) { + var holders = replaceHolders(partials, getHolder(partialRight)); + return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders); + }); + + /** + * Creates a function that invokes `func` with arguments arranged according + * to the specified `indexes` where the argument value at the first index is + * provided as the first argument, the argument value at the second index is + * provided as the second argument, and so on. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Function + * @param {Function} func The function to rearrange arguments for. + * @param {...(number|number[])} indexes The arranged argument indexes. + * @returns {Function} Returns the new function. + * @example + * + * var rearged = _.rearg(function(a, b, c) { + * return [a, b, c]; + * }, [2, 0, 1]); + * + * rearged('b', 'c', 'a') + * // => ['a', 'b', 'c'] + */ + var rearg = flatRest(function(func, indexes) { + return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes); + }); + + /** + * Creates a function that invokes `func` with the `this` binding of the + * created function and arguments from `start` and beyond provided as + * an array. + * + * **Note:** This method is based on the + * [rest parameter](https://mdn.io/rest_parameters). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to apply a rest parameter to. + * @param {number} [start=func.length-1] The start position of the rest parameter. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.rest(function(what, names) { + * return what + ' ' + _.initial(names).join(', ') + + * (_.size(names) > 1 ? ', & ' : '') + _.last(names); + * }); + * + * say('hello', 'fred', 'barney', 'pebbles'); + * // => 'hello fred, barney, & pebbles' + */ + function rest(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start === undefined ? start : toInteger(start); + return baseRest(func, start); + } + + /** + * Creates a function that invokes `func` with the `this` binding of the + * create function and an array of arguments much like + * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply). + * + * **Note:** This method is based on the + * [spread operator](https://mdn.io/spread_operator). + * + * @static + * @memberOf _ + * @since 3.2.0 + * @category Function + * @param {Function} func The function to spread arguments over. + * @param {number} [start=0] The start position of the spread. + * @returns {Function} Returns the new function. + * @example + * + * var say = _.spread(function(who, what) { + * return who + ' says ' + what; + * }); + * + * say(['fred', 'hello']); + * // => 'fred says hello' + * + * var numbers = Promise.all([ + * Promise.resolve(40), + * Promise.resolve(36) + * ]); + * + * numbers.then(_.spread(function(x, y) { + * return x + y; + * })); + * // => a Promise of 76 + */ + function spread(func, start) { + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + start = start == null ? 0 : nativeMax(toInteger(start), 0); + return baseRest(function(args) { + var array = args[start], + otherArgs = castSlice(args, 0, start); + + if (array) { + arrayPush(otherArgs, array); + } + return apply(func, this, otherArgs); + }); + } + + /** + * Creates a throttled function that only invokes `func` at most once per + * every `wait` milliseconds. The throttled function comes with a `cancel` + * method to cancel delayed `func` invocations and a `flush` method to + * immediately invoke them. Provide `options` to indicate whether `func` + * should be invoked on the leading and/or trailing edge of the `wait` + * timeout. The `func` is invoked with the last arguments provided to the + * throttled function. Subsequent calls to the throttled function return the + * result of the last `func` invocation. + * + * **Note:** If `leading` and `trailing` options are `true`, `func` is + * invoked on the trailing edge of the timeout only if the throttled function + * is invoked more than once during the `wait` timeout. + * + * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred + * until to the next tick, similar to `setTimeout` with a timeout of `0`. + * + * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) + * for details over the differences between `_.throttle` and `_.debounce`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {Function} func The function to throttle. + * @param {number} [wait=0] The number of milliseconds to throttle invocations to. + * @param {Object} [options={}] The options object. + * @param {boolean} [options.leading=true] + * Specify invoking on the leading edge of the timeout. + * @param {boolean} [options.trailing=true] + * Specify invoking on the trailing edge of the timeout. + * @returns {Function} Returns the new throttled function. + * @example + * + * // Avoid excessively updating the position while scrolling. + * jQuery(window).on('scroll', _.throttle(updatePosition, 100)); + * + * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. + * var throttled = _.throttle(renewToken, 300000, { 'trailing': false }); + * jQuery(element).on('click', throttled); + * + * // Cancel the trailing throttled invocation. + * jQuery(window).on('popstate', throttled.cancel); + */ + function throttle(func, wait, options) { + var leading = true, + trailing = true; + + if (typeof func != 'function') { + throw new TypeError(FUNC_ERROR_TEXT); + } + if (isObject(options)) { + leading = 'leading' in options ? !!options.leading : leading; + trailing = 'trailing' in options ? !!options.trailing : trailing; + } + return debounce(func, wait, { + 'leading': leading, + 'maxWait': wait, + 'trailing': trailing + }); + } + + /** + * Creates a function that accepts up to one argument, ignoring any + * additional arguments. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Function + * @param {Function} func The function to cap arguments for. + * @returns {Function} Returns the new capped function. + * @example + * + * _.map(['6', '8', '10'], _.unary(parseInt)); + * // => [6, 8, 10] + */ + function unary(func) { + return ary(func, 1); + } + + /** + * Creates a function that provides `value` to `wrapper` as its first + * argument. Any additional arguments provided to the function are appended + * to those provided to the `wrapper`. The wrapper is invoked with the `this` + * binding of the created function. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Function + * @param {*} value The value to wrap. + * @param {Function} [wrapper=identity] The wrapper function. + * @returns {Function} Returns the new function. + * @example + * + * var p = _.wrap(_.escape, function(func, text) { + * return '

' + func(text) + '

'; + * }); + * + * p('fred, barney, & pebbles'); + * // => '

fred, barney, & pebbles

' + */ + function wrap(value, wrapper) { + return partial(castFunction(wrapper), value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Casts `value` as an array if it's not one. + * + * @static + * @memberOf _ + * @since 4.4.0 + * @category Lang + * @param {*} value The value to inspect. + * @returns {Array} Returns the cast array. + * @example + * + * _.castArray(1); + * // => [1] + * + * _.castArray({ 'a': 1 }); + * // => [{ 'a': 1 }] + * + * _.castArray('abc'); + * // => ['abc'] + * + * _.castArray(null); + * // => [null] + * + * _.castArray(undefined); + * // => [undefined] + * + * _.castArray(); + * // => [] + * + * var array = [1, 2, 3]; + * console.log(_.castArray(array) === array); + * // => true + */ + function castArray() { + if (!arguments.length) { + return []; + } + var value = arguments[0]; + return isArray(value) ? value : [value]; + } + + /** + * Creates a shallow clone of `value`. + * + * **Note:** This method is loosely based on the + * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm) + * and supports cloning arrays, array buffers, booleans, date objects, maps, + * numbers, `Object` objects, regexes, sets, strings, symbols, and typed + * arrays. The own enumerable properties of `arguments` objects are cloned + * as plain objects. An empty object is returned for uncloneable values such + * as error objects, functions, DOM nodes, and WeakMaps. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to clone. + * @returns {*} Returns the cloned value. + * @see _.cloneDeep + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var shallow = _.clone(objects); + * console.log(shallow[0] === objects[0]); + * // => true + */ + function clone(value) { + return baseClone(value, CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.clone` except that it accepts `customizer` which + * is invoked to produce the cloned value. If `customizer` returns `undefined`, + * cloning is handled by the method instead. The `customizer` is invoked with + * up to four arguments; (value [, index|key, object, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the cloned value. + * @see _.cloneDeepWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(false); + * } + * } + * + * var el = _.cloneWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 0 + */ + function cloneWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * This method is like `_.clone` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @returns {*} Returns the deep cloned value. + * @see _.clone + * @example + * + * var objects = [{ 'a': 1 }, { 'b': 2 }]; + * + * var deep = _.cloneDeep(objects); + * console.log(deep[0] === objects[0]); + * // => false + */ + function cloneDeep(value) { + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG); + } + + /** + * This method is like `_.cloneWith` except that it recursively clones `value`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to recursively clone. + * @param {Function} [customizer] The function to customize cloning. + * @returns {*} Returns the deep cloned value. + * @see _.cloneWith + * @example + * + * function customizer(value) { + * if (_.isElement(value)) { + * return value.cloneNode(true); + * } + * } + * + * var el = _.cloneDeepWith(document.body, customizer); + * + * console.log(el === document.body); + * // => false + * console.log(el.nodeName); + * // => 'BODY' + * console.log(el.childNodes.length); + * // => 20 + */ + function cloneDeepWith(value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer); + } + + /** + * Checks if `object` conforms to `source` by invoking the predicate + * properties of `source` with the corresponding property values of `object`. + * + * **Note:** This method is equivalent to `_.conforms` when `source` is + * partially applied. + * + * @static + * @memberOf _ + * @since 4.14.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property predicates to conform to. + * @returns {boolean} Returns `true` if `object` conforms, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.conformsTo(object, { 'b': function(n) { return n > 1; } }); + * // => true + * + * _.conformsTo(object, { 'b': function(n) { return n > 2; } }); + * // => false + */ + function conformsTo(object, source) { + return source == null || baseConformsTo(object, source, keys(source)); + } + + /** + * Performs a + * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) + * comparison between two values to determine if they are equivalent. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.eq(object, object); + * // => true + * + * _.eq(object, other); + * // => false + * + * _.eq('a', 'a'); + * // => true + * + * _.eq('a', Object('a')); + * // => false + * + * _.eq(NaN, NaN); + * // => true + */ + function eq(value, other) { + return value === other || (value !== value && other !== other); + } + + /** + * Checks if `value` is greater than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than `other`, + * else `false`. + * @see _.lt + * @example + * + * _.gt(3, 1); + * // => true + * + * _.gt(3, 3); + * // => false + * + * _.gt(1, 3); + * // => false + */ + var gt = createRelationalOperation(baseGt); + + /** + * Checks if `value` is greater than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is greater than or equal to + * `other`, else `false`. + * @see _.lte + * @example + * + * _.gte(3, 1); + * // => true + * + * _.gte(3, 3); + * // => true + * + * _.gte(1, 3); + * // => false + */ + var gte = createRelationalOperation(function(value, other) { + return value >= other; + }); + + /** + * Checks if `value` is likely an `arguments` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an `arguments` object, + * else `false`. + * @example + * + * _.isArguments(function() { return arguments; }()); + * // => true + * + * _.isArguments([1, 2, 3]); + * // => false + */ + var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) { + return isObjectLike(value) && hasOwnProperty.call(value, 'callee') && + !propertyIsEnumerable.call(value, 'callee'); + }; + + /** + * Checks if `value` is classified as an `Array` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array, else `false`. + * @example + * + * _.isArray([1, 2, 3]); + * // => true + * + * _.isArray(document.body.children); + * // => false + * + * _.isArray('abc'); + * // => false + * + * _.isArray(_.noop); + * // => false + */ + var isArray = Array.isArray; + + /** + * Checks if `value` is classified as an `ArrayBuffer` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`. + * @example + * + * _.isArrayBuffer(new ArrayBuffer(2)); + * // => true + * + * _.isArrayBuffer(new Array(2)); + * // => false + */ + var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer; + + /** + * Checks if `value` is array-like. A value is considered array-like if it's + * not a function and has a `value.length` that's an integer greater than or + * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is array-like, else `false`. + * @example + * + * _.isArrayLike([1, 2, 3]); + * // => true + * + * _.isArrayLike(document.body.children); + * // => true + * + * _.isArrayLike('abc'); + * // => true + * + * _.isArrayLike(_.noop); + * // => false + */ + function isArrayLike(value) { + return value != null && isLength(value.length) && !isFunction(value); + } + + /** + * This method is like `_.isArrayLike` except that it also checks if `value` + * is an object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an array-like object, + * else `false`. + * @example + * + * _.isArrayLikeObject([1, 2, 3]); + * // => true + * + * _.isArrayLikeObject(document.body.children); + * // => true + * + * _.isArrayLikeObject('abc'); + * // => false + * + * _.isArrayLikeObject(_.noop); + * // => false + */ + function isArrayLikeObject(value) { + return isObjectLike(value) && isArrayLike(value); + } + + /** + * Checks if `value` is classified as a boolean primitive or object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a boolean, else `false`. + * @example + * + * _.isBoolean(false); + * // => true + * + * _.isBoolean(null); + * // => false + */ + function isBoolean(value) { + return value === true || value === false || + (isObjectLike(value) && baseGetTag(value) == boolTag); + } + + /** + * Checks if `value` is a buffer. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. + * @example + * + * _.isBuffer(new Buffer(2)); + * // => true + * + * _.isBuffer(new Uint8Array(2)); + * // => false + */ + var isBuffer = nativeIsBuffer || stubFalse; + + /** + * Checks if `value` is classified as a `Date` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a date object, else `false`. + * @example + * + * _.isDate(new Date); + * // => true + * + * _.isDate('Mon April 23 2012'); + * // => false + */ + var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate; + + /** + * Checks if `value` is likely a DOM element. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`. + * @example + * + * _.isElement(document.body); + * // => true + * + * _.isElement(''); + * // => false + */ + function isElement(value) { + return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value); + } + + /** + * Checks if `value` is an empty object, collection, map, or set. + * + * Objects are considered empty if they have no own enumerable string keyed + * properties. + * + * Array-like values such as `arguments` objects, arrays, buffers, strings, or + * jQuery-like collections are considered empty if they have a `length` of `0`. + * Similarly, maps and sets are considered empty if they have a `size` of `0`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is empty, else `false`. + * @example + * + * _.isEmpty(null); + * // => true + * + * _.isEmpty(true); + * // => true + * + * _.isEmpty(1); + * // => true + * + * _.isEmpty([1, 2, 3]); + * // => false + * + * _.isEmpty({ 'a': 1 }); + * // => false + */ + function isEmpty(value) { + if (value == null) { + return true; + } + if (isArrayLike(value) && + (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' || + isBuffer(value) || isTypedArray(value) || isArguments(value))) { + return !value.length; + } + var tag = getTag(value); + if (tag == mapTag || tag == setTag) { + return !value.size; + } + if (isPrototype(value)) { + return !baseKeys(value).length; + } + for (var key in value) { + if (hasOwnProperty.call(value, key)) { + return false; + } + } + return true; + } + + /** + * Performs a deep comparison between two values to determine if they are + * equivalent. + * + * **Note:** This method supports comparing arrays, array buffers, booleans, + * date objects, error objects, maps, numbers, `Object` objects, regexes, + * sets, strings, symbols, and typed arrays. `Object` objects are compared + * by their own, not inherited, enumerable properties. Functions and DOM + * nodes are compared by strict equality, i.e. `===`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * var object = { 'a': 1 }; + * var other = { 'a': 1 }; + * + * _.isEqual(object, other); + * // => true + * + * object === other; + * // => false + */ + function isEqual(value, other) { + return baseIsEqual(value, other); + } + + /** + * This method is like `_.isEqual` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with up to + * six arguments: (objValue, othValue [, index|key, object, other, stack]). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if the values are equivalent, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, othValue) { + * if (isGreeting(objValue) && isGreeting(othValue)) { + * return true; + * } + * } + * + * var array = ['hello', 'goodbye']; + * var other = ['hi', 'goodbye']; + * + * _.isEqualWith(array, other, customizer); + * // => true + */ + function isEqualWith(value, other, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + var result = customizer ? customizer(value, other) : undefined; + return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result; + } + + /** + * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`, + * `SyntaxError`, `TypeError`, or `URIError` object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an error object, else `false`. + * @example + * + * _.isError(new Error); + * // => true + * + * _.isError(Error); + * // => false + */ + function isError(value) { + if (!isObjectLike(value)) { + return false; + } + var tag = baseGetTag(value); + return tag == errorTag || tag == domExcTag || + (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value)); + } + + /** + * Checks if `value` is a finite primitive number. + * + * **Note:** This method is based on + * [`Number.isFinite`](https://mdn.io/Number/isFinite). + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a finite number, else `false`. + * @example + * + * _.isFinite(3); + * // => true + * + * _.isFinite(Number.MIN_VALUE); + * // => true + * + * _.isFinite(Infinity); + * // => false + * + * _.isFinite('3'); + * // => false + */ + function isFinite(value) { + return typeof value == 'number' && nativeIsFinite(value); + } + + /** + * Checks if `value` is classified as a `Function` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a function, else `false`. + * @example + * + * _.isFunction(_); + * // => true + * + * _.isFunction(/abc/); + * // => false + */ + function isFunction(value) { + if (!isObject(value)) { + return false; + } + // The use of `Object#toString` avoids issues with the `typeof` operator + // in Safari 9 which returns 'object' for typed arrays and other constructors. + var tag = baseGetTag(value); + return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag; + } + + /** + * Checks if `value` is an integer. + * + * **Note:** This method is based on + * [`Number.isInteger`](https://mdn.io/Number/isInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an integer, else `false`. + * @example + * + * _.isInteger(3); + * // => true + * + * _.isInteger(Number.MIN_VALUE); + * // => false + * + * _.isInteger(Infinity); + * // => false + * + * _.isInteger('3'); + * // => false + */ + function isInteger(value) { + return typeof value == 'number' && value == toInteger(value); + } + + /** + * Checks if `value` is a valid array-like length. + * + * **Note:** This method is loosely based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. + * @example + * + * _.isLength(3); + * // => true + * + * _.isLength(Number.MIN_VALUE); + * // => false + * + * _.isLength(Infinity); + * // => false + * + * _.isLength('3'); + * // => false + */ + function isLength(value) { + return typeof value == 'number' && + value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is the + * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) + * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + * @example + * + * _.isObject({}); + * // => true + * + * _.isObject([1, 2, 3]); + * // => true + * + * _.isObject(_.noop); + * // => true + * + * _.isObject(null); + * // => false + */ + function isObject(value) { + var type = typeof value; + return value != null && (type == 'object' || type == 'function'); + } + + /** + * Checks if `value` is object-like. A value is object-like if it's not `null` + * and has a `typeof` result of "object". + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is object-like, else `false`. + * @example + * + * _.isObjectLike({}); + * // => true + * + * _.isObjectLike([1, 2, 3]); + * // => true + * + * _.isObjectLike(_.noop); + * // => false + * + * _.isObjectLike(null); + * // => false + */ + function isObjectLike(value) { + return value != null && typeof value == 'object'; + } + + /** + * Checks if `value` is classified as a `Map` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a map, else `false`. + * @example + * + * _.isMap(new Map); + * // => true + * + * _.isMap(new WeakMap); + * // => false + */ + var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap; + + /** + * Performs a partial deep comparison between `object` and `source` to + * determine if `object` contains equivalent property values. + * + * **Note:** This method is equivalent to `_.matches` when `source` is + * partially applied. + * + * Partial comparisons will match empty array and empty object `source` + * values against any array or object value, respectively. See `_.isEqual` + * for a list of supported value comparisons. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * var object = { 'a': 1, 'b': 2 }; + * + * _.isMatch(object, { 'b': 2 }); + * // => true + * + * _.isMatch(object, { 'b': 1 }); + * // => false + */ + function isMatch(object, source) { + return object === source || baseIsMatch(object, source, getMatchData(source)); + } + + /** + * This method is like `_.isMatch` except that it accepts `customizer` which + * is invoked to compare values. If `customizer` returns `undefined`, comparisons + * are handled by the method instead. The `customizer` is invoked with five + * arguments: (objValue, srcValue, index|key, object, source). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {Object} object The object to inspect. + * @param {Object} source The object of property values to match. + * @param {Function} [customizer] The function to customize comparisons. + * @returns {boolean} Returns `true` if `object` is a match, else `false`. + * @example + * + * function isGreeting(value) { + * return /^h(?:i|ello)$/.test(value); + * } + * + * function customizer(objValue, srcValue) { + * if (isGreeting(objValue) && isGreeting(srcValue)) { + * return true; + * } + * } + * + * var object = { 'greeting': 'hello' }; + * var source = { 'greeting': 'hi' }; + * + * _.isMatchWith(object, source, customizer); + * // => true + */ + function isMatchWith(object, source, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return baseIsMatch(object, source, getMatchData(source), customizer); + } + + /** + * Checks if `value` is `NaN`. + * + * **Note:** This method is based on + * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as + * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for + * `undefined` and other non-number values. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. + * @example + * + * _.isNaN(NaN); + * // => true + * + * _.isNaN(new Number(NaN)); + * // => true + * + * isNaN(undefined); + * // => true + * + * _.isNaN(undefined); + * // => false + */ + function isNaN(value) { + // An `NaN` primitive is the only value that is not equal to itself. + // Perform the `toStringTag` check first to avoid errors with some + // ActiveX objects in IE. + return isNumber(value) && value != +value; + } + + /** + * Checks if `value` is a pristine native function. + * + * **Note:** This method can't reliably detect native functions in the presence + * of the core-js package because core-js circumvents this kind of detection. + * Despite multiple requests, the core-js maintainer has made it clear: any + * attempt to fix the detection will be obstructed. As a result, we're left + * with little choice but to throw an error. Unfortunately, this also affects + * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill), + * which rely on core-js. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a native function, + * else `false`. + * @example + * + * _.isNative(Array.prototype.push); + * // => true + * + * _.isNative(_); + * // => false + */ + function isNative(value) { + if (isMaskable(value)) { + throw new Error(CORE_ERROR_TEXT); + } + return baseIsNative(value); + } + + /** + * Checks if `value` is `null`. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `null`, else `false`. + * @example + * + * _.isNull(null); + * // => true + * + * _.isNull(void 0); + * // => false + */ + function isNull(value) { + return value === null; + } + + /** + * Checks if `value` is `null` or `undefined`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is nullish, else `false`. + * @example + * + * _.isNil(null); + * // => true + * + * _.isNil(void 0); + * // => true + * + * _.isNil(NaN); + * // => false + */ + function isNil(value) { + return value == null; + } + + /** + * Checks if `value` is classified as a `Number` primitive or object. + * + * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are + * classified as numbers, use the `_.isFinite` method. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a number, else `false`. + * @example + * + * _.isNumber(3); + * // => true + * + * _.isNumber(Number.MIN_VALUE); + * // => true + * + * _.isNumber(Infinity); + * // => true + * + * _.isNumber('3'); + * // => false + */ + function isNumber(value) { + return typeof value == 'number' || + (isObjectLike(value) && baseGetTag(value) == numberTag); + } + + /** + * Checks if `value` is a plain object, that is, an object created by the + * `Object` constructor or one with a `[[Prototype]]` of `null`. + * + * @static + * @memberOf _ + * @since 0.8.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a plain object, else `false`. + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * _.isPlainObject(new Foo); + * // => false + * + * _.isPlainObject([1, 2, 3]); + * // => false + * + * _.isPlainObject({ 'x': 0, 'y': 0 }); + * // => true + * + * _.isPlainObject(Object.create(null)); + * // => true + */ + function isPlainObject(value) { + if (!isObjectLike(value) || baseGetTag(value) != objectTag) { + return false; + } + var proto = getPrototype(value); + if (proto === null) { + return true; + } + var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor; + return typeof Ctor == 'function' && Ctor instanceof Ctor && + funcToString.call(Ctor) == objectCtorString; + } + + /** + * Checks if `value` is classified as a `RegExp` object. + * + * @static + * @memberOf _ + * @since 0.1.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a regexp, else `false`. + * @example + * + * _.isRegExp(/abc/); + * // => true + * + * _.isRegExp('/abc/'); + * // => false + */ + var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp; + + /** + * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754 + * double precision number which isn't the result of a rounded unsafe integer. + * + * **Note:** This method is based on + * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`. + * @example + * + * _.isSafeInteger(3); + * // => true + * + * _.isSafeInteger(Number.MIN_VALUE); + * // => false + * + * _.isSafeInteger(Infinity); + * // => false + * + * _.isSafeInteger('3'); + * // => false + */ + function isSafeInteger(value) { + return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER; + } + + /** + * Checks if `value` is classified as a `Set` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a set, else `false`. + * @example + * + * _.isSet(new Set); + * // => true + * + * _.isSet(new WeakSet); + * // => false + */ + var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet; + + /** + * Checks if `value` is classified as a `String` primitive or object. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a string, else `false`. + * @example + * + * _.isString('abc'); + * // => true + * + * _.isString(1); + * // => false + */ + function isString(value) { + return typeof value == 'string' || + (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag); + } + + /** + * Checks if `value` is classified as a `Symbol` primitive or object. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. + * @example + * + * _.isSymbol(Symbol.iterator); + * // => true + * + * _.isSymbol('abc'); + * // => false + */ + function isSymbol(value) { + return typeof value == 'symbol' || + (isObjectLike(value) && baseGetTag(value) == symbolTag); + } + + /** + * Checks if `value` is classified as a typed array. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a typed array, else `false`. + * @example + * + * _.isTypedArray(new Uint8Array); + * // => true + * + * _.isTypedArray([]); + * // => false + */ + var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray; + + /** + * Checks if `value` is `undefined`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`. + * @example + * + * _.isUndefined(void 0); + * // => true + * + * _.isUndefined(null); + * // => false + */ + function isUndefined(value) { + return value === undefined; + } + + /** + * Checks if `value` is classified as a `WeakMap` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak map, else `false`. + * @example + * + * _.isWeakMap(new WeakMap); + * // => true + * + * _.isWeakMap(new Map); + * // => false + */ + function isWeakMap(value) { + return isObjectLike(value) && getTag(value) == weakMapTag; + } + + /** + * Checks if `value` is classified as a `WeakSet` object. + * + * @static + * @memberOf _ + * @since 4.3.0 + * @category Lang + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is a weak set, else `false`. + * @example + * + * _.isWeakSet(new WeakSet); + * // => true + * + * _.isWeakSet(new Set); + * // => false + */ + function isWeakSet(value) { + return isObjectLike(value) && baseGetTag(value) == weakSetTag; + } + + /** + * Checks if `value` is less than `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than `other`, + * else `false`. + * @see _.gt + * @example + * + * _.lt(1, 3); + * // => true + * + * _.lt(3, 3); + * // => false + * + * _.lt(3, 1); + * // => false + */ + var lt = createRelationalOperation(baseLt); + + /** + * Checks if `value` is less than or equal to `other`. + * + * @static + * @memberOf _ + * @since 3.9.0 + * @category Lang + * @param {*} value The value to compare. + * @param {*} other The other value to compare. + * @returns {boolean} Returns `true` if `value` is less than or equal to + * `other`, else `false`. + * @see _.gte + * @example + * + * _.lte(1, 3); + * // => true + * + * _.lte(3, 3); + * // => true + * + * _.lte(3, 1); + * // => false + */ + var lte = createRelationalOperation(function(value, other) { + return value <= other; + }); + + /** + * Converts `value` to an array. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Lang + * @param {*} value The value to convert. + * @returns {Array} Returns the converted array. + * @example + * + * _.toArray({ 'a': 1, 'b': 2 }); + * // => [1, 2] + * + * _.toArray('abc'); + * // => ['a', 'b', 'c'] + * + * _.toArray(1); + * // => [] + * + * _.toArray(null); + * // => [] + */ + function toArray(value) { + if (!value) { + return []; + } + if (isArrayLike(value)) { + return isString(value) ? stringToArray(value) : copyArray(value); + } + if (symIterator && value[symIterator]) { + return iteratorToArray(value[symIterator]()); + } + var tag = getTag(value), + func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values); + + return func(value); + } + + /** + * Converts `value` to a finite number. + * + * @static + * @memberOf _ + * @since 4.12.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted number. + * @example + * + * _.toFinite(3.2); + * // => 3.2 + * + * _.toFinite(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toFinite(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toFinite('3.2'); + * // => 3.2 + */ + function toFinite(value) { + if (!value) { + return value === 0 ? value : 0; + } + value = toNumber(value); + if (value === INFINITY || value === -INFINITY) { + var sign = (value < 0 ? -1 : 1); + return sign * MAX_INTEGER; + } + return value === value ? value : 0; + } + + /** + * Converts `value` to an integer. + * + * **Note:** This method is loosely based on + * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toInteger(3.2); + * // => 3 + * + * _.toInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toInteger(Infinity); + * // => 1.7976931348623157e+308 + * + * _.toInteger('3.2'); + * // => 3 + */ + function toInteger(value) { + var result = toFinite(value), + remainder = result % 1; + + return result === result ? (remainder ? result - remainder : result) : 0; + } + + /** + * Converts `value` to an integer suitable for use as the length of an + * array-like object. + * + * **Note:** This method is based on + * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toLength(3.2); + * // => 3 + * + * _.toLength(Number.MIN_VALUE); + * // => 0 + * + * _.toLength(Infinity); + * // => 4294967295 + * + * _.toLength('3.2'); + * // => 3 + */ + function toLength(value) { + return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0; + } + + /** + * Converts `value` to a number. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to process. + * @returns {number} Returns the number. + * @example + * + * _.toNumber(3.2); + * // => 3.2 + * + * _.toNumber(Number.MIN_VALUE); + * // => 5e-324 + * + * _.toNumber(Infinity); + * // => Infinity + * + * _.toNumber('3.2'); + * // => 3.2 + */ + function toNumber(value) { + if (typeof value == 'number') { + return value; + } + if (isSymbol(value)) { + return NAN; + } + if (isObject(value)) { + var other = typeof value.valueOf == 'function' ? value.valueOf() : value; + value = isObject(other) ? (other + '') : other; + } + if (typeof value != 'string') { + return value === 0 ? value : +value; + } + value = value.replace(reTrim, ''); + var isBinary = reIsBinary.test(value); + return (isBinary || reIsOctal.test(value)) + ? freeParseInt(value.slice(2), isBinary ? 2 : 8) + : (reIsBadHex.test(value) ? NAN : +value); + } + + /** + * Converts `value` to a plain object flattening inherited enumerable string + * keyed properties of `value` to own properties of the plain object. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {Object} Returns the converted plain object. + * @example + * + * function Foo() { + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.assign({ 'a': 1 }, new Foo); + * // => { 'a': 1, 'b': 2 } + * + * _.assign({ 'a': 1 }, _.toPlainObject(new Foo)); + * // => { 'a': 1, 'b': 2, 'c': 3 } + */ + function toPlainObject(value) { + return copyObject(value, keysIn(value)); + } + + /** + * Converts `value` to a safe integer. A safe integer can be compared and + * represented correctly. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {number} Returns the converted integer. + * @example + * + * _.toSafeInteger(3.2); + * // => 3 + * + * _.toSafeInteger(Number.MIN_VALUE); + * // => 0 + * + * _.toSafeInteger(Infinity); + * // => 9007199254740991 + * + * _.toSafeInteger('3.2'); + * // => 3 + */ + function toSafeInteger(value) { + return value + ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) + : (value === 0 ? value : 0); + } + + /** + * Converts `value` to a string. An empty string is returned for `null` + * and `undefined` values. The sign of `-0` is preserved. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Lang + * @param {*} value The value to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.toString(null); + * // => '' + * + * _.toString(-0); + * // => '-0' + * + * _.toString([1, 2, 3]); + * // => '1,2,3' + */ + function toString(value) { + return value == null ? '' : baseToString(value); + } + + /*------------------------------------------------------------------------*/ + + /** + * Assigns own enumerable string keyed properties of source objects to the + * destination object. Source objects are applied from left to right. + * Subsequent sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object` and is loosely based on + * [`Object.assign`](https://mdn.io/Object/assign). + * + * @static + * @memberOf _ + * @since 0.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assignIn + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assign({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'c': 3 } + */ + var assign = createAssigner(function(object, source) { + if (isPrototype(source) || isArrayLike(source)) { + copyObject(source, keys(source), object); + return; + } + for (var key in source) { + if (hasOwnProperty.call(source, key)) { + assignValue(object, key, source[key]); + } + } + }); + + /** + * This method is like `_.assign` except that it iterates over own and + * inherited source properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extend + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.assign + * @example + * + * function Foo() { + * this.a = 1; + * } + * + * function Bar() { + * this.c = 3; + * } + * + * Foo.prototype.b = 2; + * Bar.prototype.d = 4; + * + * _.assignIn({ 'a': 0 }, new Foo, new Bar); + * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 } + */ + var assignIn = createAssigner(function(object, source) { + copyObject(source, keysIn(source), object); + }); + + /** + * This method is like `_.assignIn` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias extendWith + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignInWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignInWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keysIn(source), object, customizer); + }); + + /** + * This method is like `_.assign` except that it accepts `customizer` + * which is invoked to produce the assigned values. If `customizer` returns + * `undefined`, assignment is handled by the method instead. The `customizer` + * is invoked with five arguments: (objValue, srcValue, key, object, source). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @see _.assignInWith + * @example + * + * function customizer(objValue, srcValue) { + * return _.isUndefined(objValue) ? srcValue : objValue; + * } + * + * var defaults = _.partialRight(_.assignWith, customizer); + * + * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var assignWith = createAssigner(function(object, source, srcIndex, customizer) { + copyObject(source, keys(source), object, customizer); + }); + + /** + * Creates an array of values corresponding to `paths` of `object`. + * + * @static + * @memberOf _ + * @since 1.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Array} Returns the picked values. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] }; + * + * _.at(object, ['a[0].b.c', 'a[1]']); + * // => [3, 4] + */ + var at = flatRest(baseAt); + + /** + * Creates an object that inherits from the `prototype` object. If a + * `properties` object is given, its own enumerable string keyed properties + * are assigned to the created object. + * + * @static + * @memberOf _ + * @since 2.3.0 + * @category Object + * @param {Object} prototype The object to inherit from. + * @param {Object} [properties] The properties to assign to the object. + * @returns {Object} Returns the new object. + * @example + * + * function Shape() { + * this.x = 0; + * this.y = 0; + * } + * + * function Circle() { + * Shape.call(this); + * } + * + * Circle.prototype = _.create(Shape.prototype, { + * 'constructor': Circle + * }); + * + * var circle = new Circle; + * circle instanceof Circle; + * // => true + * + * circle instanceof Shape; + * // => true + */ + function create(prototype, properties) { + var result = baseCreate(prototype); + return properties == null ? result : baseAssign(result, properties); + } + + /** + * Assigns own and inherited enumerable string keyed properties of source + * objects to the destination object for all destination properties that + * resolve to `undefined`. Source objects are applied from left to right. + * Once a property is set, additional values of the same property are ignored. + * + * **Note:** This method mutates `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaultsDeep + * @example + * + * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 }); + * // => { 'a': 1, 'b': 2 } + */ + var defaults = baseRest(function(object, sources) { + object = Object(object); + + var index = -1; + var length = sources.length; + var guard = length > 2 ? sources[2] : undefined; + + if (guard && isIterateeCall(sources[0], sources[1], guard)) { + length = 1; + } + + while (++index < length) { + var source = sources[index]; + var props = keysIn(source); + var propsIndex = -1; + var propsLength = props.length; + + while (++propsIndex < propsLength) { + var key = props[propsIndex]; + var value = object[key]; + + if (value === undefined || + (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) { + object[key] = source[key]; + } + } + } + + return object; + }); + + /** + * This method is like `_.defaults` except that it recursively assigns + * default properties. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.10.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @see _.defaults + * @example + * + * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }); + * // => { 'a': { 'b': 2, 'c': 3 } } + */ + var defaultsDeep = baseRest(function(args) { + args.push(undefined, customDefaultsMerge); + return apply(mergeWith, undefined, args); + }); + + /** + * This method is like `_.find` except that it returns the key of the first + * element `predicate` returns truthy for instead of the element itself. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findKey(users, function(o) { return o.age < 40; }); + * // => 'barney' (iteration order is not guaranteed) + * + * // The `_.matches` iteratee shorthand. + * _.findKey(users, { 'age': 1, 'active': true }); + * // => 'pebbles' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findKey(users, 'active'); + * // => 'barney' + */ + function findKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwn); + } + + /** + * This method is like `_.findKey` except that it iterates over elements of + * a collection in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @param {Function} [predicate=_.identity] The function invoked per iteration. + * @returns {string|undefined} Returns the key of the matched element, + * else `undefined`. + * @example + * + * var users = { + * 'barney': { 'age': 36, 'active': true }, + * 'fred': { 'age': 40, 'active': false }, + * 'pebbles': { 'age': 1, 'active': true } + * }; + * + * _.findLastKey(users, function(o) { return o.age < 40; }); + * // => returns 'pebbles' assuming `_.findKey` returns 'barney' + * + * // The `_.matches` iteratee shorthand. + * _.findLastKey(users, { 'age': 36, 'active': true }); + * // => 'barney' + * + * // The `_.matchesProperty` iteratee shorthand. + * _.findLastKey(users, ['active', false]); + * // => 'fred' + * + * // The `_.property` iteratee shorthand. + * _.findLastKey(users, 'active'); + * // => 'pebbles' + */ + function findLastKey(object, predicate) { + return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight); + } + + /** + * Iterates over own and inherited enumerable string keyed properties of an + * object and invokes `iteratee` for each property. The iteratee is invoked + * with three arguments: (value, key, object). Iteratee functions may exit + * iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forInRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forIn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed). + */ + function forIn(object, iteratee) { + return object == null + ? object + : baseFor(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * This method is like `_.forIn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forIn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forInRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'. + */ + function forInRight(object, iteratee) { + return object == null + ? object + : baseForRight(object, getIteratee(iteratee, 3), keysIn); + } + + /** + * Iterates over own enumerable string keyed properties of an object and + * invokes `iteratee` for each property. The iteratee is invoked with three + * arguments: (value, key, object). Iteratee functions may exit iteration + * early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 0.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwnRight + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwn(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'a' then 'b' (iteration order is not guaranteed). + */ + function forOwn(object, iteratee) { + return object && baseForOwn(object, getIteratee(iteratee, 3)); + } + + /** + * This method is like `_.forOwn` except that it iterates over properties of + * `object` in the opposite order. + * + * @static + * @memberOf _ + * @since 2.0.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns `object`. + * @see _.forOwn + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.forOwnRight(new Foo, function(value, key) { + * console.log(key); + * }); + * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'. + */ + function forOwnRight(object, iteratee) { + return object && baseForOwnRight(object, getIteratee(iteratee, 3)); + } + + /** + * Creates an array of function property names from own enumerable properties + * of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functionsIn + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functions(new Foo); + * // => ['a', 'b'] + */ + function functions(object) { + return object == null ? [] : baseFunctions(object, keys(object)); + } + + /** + * Creates an array of function property names from own and inherited + * enumerable properties of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to inspect. + * @returns {Array} Returns the function names. + * @see _.functions + * @example + * + * function Foo() { + * this.a = _.constant('a'); + * this.b = _.constant('b'); + * } + * + * Foo.prototype.c = _.constant('c'); + * + * _.functionsIn(new Foo); + * // => ['a', 'b', 'c'] + */ + function functionsIn(object) { + return object == null ? [] : baseFunctions(object, keysIn(object)); + } + + /** + * Gets the value at `path` of `object`. If the resolved value is + * `undefined`, the `defaultValue` is returned in its place. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to get. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.get(object, 'a[0].b.c'); + * // => 3 + * + * _.get(object, ['a', '0', 'b', 'c']); + * // => 3 + * + * _.get(object, 'a.b.c', 'default'); + * // => 'default' + */ + function get(object, path, defaultValue) { + var result = object == null ? undefined : baseGet(object, path); + return result === undefined ? defaultValue : result; + } + + /** + * Checks if `path` is a direct property of `object`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = { 'a': { 'b': 2 } }; + * var other = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.has(object, 'a'); + * // => true + * + * _.has(object, 'a.b'); + * // => true + * + * _.has(object, ['a', 'b']); + * // => true + * + * _.has(other, 'a'); + * // => false + */ + function has(object, path) { + return object != null && hasPath(object, path, baseHas); + } + + /** + * Checks if `path` is a direct or inherited property of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path to check. + * @returns {boolean} Returns `true` if `path` exists, else `false`. + * @example + * + * var object = _.create({ 'a': _.create({ 'b': 2 }) }); + * + * _.hasIn(object, 'a'); + * // => true + * + * _.hasIn(object, 'a.b'); + * // => true + * + * _.hasIn(object, ['a', 'b']); + * // => true + * + * _.hasIn(object, 'b'); + * // => false + */ + function hasIn(object, path) { + return object != null && hasPath(object, path, baseHasIn); + } + + /** + * Creates an object composed of the inverted keys and values of `object`. + * If `object` contains duplicate values, subsequent values overwrite + * property assignments of previous values. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Object + * @param {Object} object The object to invert. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invert(object); + * // => { '1': 'c', '2': 'b' } + */ + var invert = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + result[value] = key; + }, constant(identity)); + + /** + * This method is like `_.invert` except that the inverted object is generated + * from the results of running each element of `object` thru `iteratee`. The + * corresponding inverted value of each inverted key is an array of keys + * responsible for generating the inverted value. The iteratee is invoked + * with one argument: (value). + * + * @static + * @memberOf _ + * @since 4.1.0 + * @category Object + * @param {Object} object The object to invert. + * @param {Function} [iteratee=_.identity] The iteratee invoked per element. + * @returns {Object} Returns the new inverted object. + * @example + * + * var object = { 'a': 1, 'b': 2, 'c': 1 }; + * + * _.invertBy(object); + * // => { '1': ['a', 'c'], '2': ['b'] } + * + * _.invertBy(object, function(value) { + * return 'group' + value; + * }); + * // => { 'group1': ['a', 'c'], 'group2': ['b'] } + */ + var invertBy = createInverter(function(result, value, key) { + if (value != null && + typeof value.toString != 'function') { + value = nativeObjectToString.call(value); + } + + if (hasOwnProperty.call(result, value)) { + result[value].push(key); + } else { + result[value] = [key]; + } + }, getIteratee); + + /** + * Invokes the method at `path` of `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the method to invoke. + * @param {...*} [args] The arguments to invoke the method with. + * @returns {*} Returns the result of the invoked method. + * @example + * + * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] }; + * + * _.invoke(object, 'a[0].b.c.slice', 1, 3); + * // => [2, 3] + */ + var invoke = baseRest(baseInvoke); + + /** + * Creates an array of the own enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. See the + * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) + * for more details. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keys(new Foo); + * // => ['a', 'b'] (iteration order is not guaranteed) + * + * _.keys('hi'); + * // => ['0', '1'] + */ + function keys(object) { + return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object); + } + + /** + * Creates an array of the own and inherited enumerable property names of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property names. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.keysIn(new Foo); + * // => ['a', 'b', 'c'] (iteration order is not guaranteed) + */ + function keysIn(object) { + return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object); + } + + /** + * The opposite of `_.mapValues`; this method creates an object with the + * same values as `object` and keys generated by running each own enumerable + * string keyed property of `object` thru `iteratee`. The iteratee is invoked + * with three arguments: (value, key, object). + * + * @static + * @memberOf _ + * @since 3.8.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapValues + * @example + * + * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) { + * return key + value; + * }); + * // => { 'a1': 1, 'b2': 2 } + */ + function mapKeys(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, iteratee(value, key, object), value); + }); + return result; + } + + /** + * Creates an object with the same keys as `object` and values generated + * by running each own enumerable string keyed property of `object` thru + * `iteratee`. The iteratee is invoked with three arguments: + * (value, key, object). + * + * @static + * @memberOf _ + * @since 2.4.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @returns {Object} Returns the new mapped object. + * @see _.mapKeys + * @example + * + * var users = { + * 'fred': { 'user': 'fred', 'age': 40 }, + * 'pebbles': { 'user': 'pebbles', 'age': 1 } + * }; + * + * _.mapValues(users, function(o) { return o.age; }); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + * + * // The `_.property` iteratee shorthand. + * _.mapValues(users, 'age'); + * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed) + */ + function mapValues(object, iteratee) { + var result = {}; + iteratee = getIteratee(iteratee, 3); + + baseForOwn(object, function(value, key, object) { + baseAssignValue(result, key, iteratee(value, key, object)); + }); + return result; + } + + /** + * This method is like `_.assign` except that it recursively merges own and + * inherited enumerable string keyed properties of source objects into the + * destination object. Source properties that resolve to `undefined` are + * skipped if a destination value exists. Array and plain object properties + * are merged recursively. Other objects and value types are overridden by + * assignment. Source objects are applied from left to right. Subsequent + * sources overwrite property assignments of previous sources. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 0.5.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} [sources] The source objects. + * @returns {Object} Returns `object`. + * @example + * + * var object = { + * 'a': [{ 'b': 2 }, { 'd': 4 }] + * }; + * + * var other = { + * 'a': [{ 'c': 3 }, { 'e': 5 }] + * }; + * + * _.merge(object, other); + * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } + */ + var merge = createAssigner(function(object, source, srcIndex) { + baseMerge(object, source, srcIndex); + }); + + /** + * This method is like `_.merge` except that it accepts `customizer` which + * is invoked to produce the merged values of the destination and source + * properties. If `customizer` returns `undefined`, merging is handled by the + * method instead. The `customizer` is invoked with six arguments: + * (objValue, srcValue, key, object, source, stack). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The destination object. + * @param {...Object} sources The source objects. + * @param {Function} customizer The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * function customizer(objValue, srcValue) { + * if (_.isArray(objValue)) { + * return objValue.concat(srcValue); + * } + * } + * + * var object = { 'a': [1], 'b': [2] }; + * var other = { 'a': [3], 'b': [4] }; + * + * _.mergeWith(object, other, customizer); + * // => { 'a': [1, 3], 'b': [2, 4] } + */ + var mergeWith = createAssigner(function(object, source, srcIndex, customizer) { + baseMerge(object, source, srcIndex, customizer); + }); + + /** + * The opposite of `_.pick`; this method creates an object composed of the + * own and inherited enumerable property paths of `object` that are not omitted. + * + * **Note:** This method is considerably slower than `_.pick`. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to omit. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omit(object, ['a', 'c']); + * // => { 'b': '2' } + */ + var omit = flatRest(function(object, paths) { + var result = {}; + if (object == null) { + return result; + } + var isDeep = false; + paths = arrayMap(paths, function(path) { + path = castPath(path, object); + isDeep || (isDeep = path.length > 1); + return path; + }); + copyObject(object, getAllKeysIn(object), result); + if (isDeep) { + result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone); + } + var length = paths.length; + while (length--) { + baseUnset(result, paths[length]); + } + return result; + }); + + /** + * The opposite of `_.pickBy`; this method creates an object composed of + * the own and inherited enumerable string keyed properties of `object` that + * `predicate` doesn't return truthy for. The predicate is invoked with two + * arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.omitBy(object, _.isNumber); + * // => { 'b': '2' } + */ + function omitBy(object, predicate) { + return pickBy(object, negate(getIteratee(predicate))); + } + + /** + * Creates an object composed of the picked `object` properties. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The source object. + * @param {...(string|string[])} [paths] The property paths to pick. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pick(object, ['a', 'c']); + * // => { 'a': 1, 'c': 3 } + */ + var pick = flatRest(function(object, paths) { + return object == null ? {} : basePick(object, paths); + }); + + /** + * Creates an object composed of the `object` properties `predicate` returns + * truthy for. The predicate is invoked with two arguments: (value, key). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The source object. + * @param {Function} [predicate=_.identity] The function invoked per property. + * @returns {Object} Returns the new object. + * @example + * + * var object = { 'a': 1, 'b': '2', 'c': 3 }; + * + * _.pickBy(object, _.isNumber); + * // => { 'a': 1, 'c': 3 } + */ + function pickBy(object, predicate) { + if (object == null) { + return {}; + } + var props = arrayMap(getAllKeysIn(object), function(prop) { + return [prop]; + }); + predicate = getIteratee(predicate); + return basePickBy(object, props, function(value, path) { + return predicate(value, path[0]); + }); + } + + /** + * This method is like `_.get` except that if the resolved value is a + * function it's invoked with the `this` binding of its parent object and + * its result is returned. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @param {Array|string} path The path of the property to resolve. + * @param {*} [defaultValue] The value returned for `undefined` resolved values. + * @returns {*} Returns the resolved value. + * @example + * + * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] }; + * + * _.result(object, 'a[0].b.c1'); + * // => 3 + * + * _.result(object, 'a[0].b.c2'); + * // => 4 + * + * _.result(object, 'a[0].b.c3', 'default'); + * // => 'default' + * + * _.result(object, 'a[0].b.c3', _.constant('default')); + * // => 'default' + */ + function result(object, path, defaultValue) { + path = castPath(path, object); + + var index = -1, + length = path.length; + + // Ensure the loop is entered when path is empty. + if (!length) { + length = 1; + object = undefined; + } + while (++index < length) { + var value = object == null ? undefined : object[toKey(path[index])]; + if (value === undefined) { + index = length; + value = defaultValue; + } + object = isFunction(value) ? value.call(object) : value; + } + return object; + } + + /** + * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, + * it's created. Arrays are created for missing index properties while objects + * are created for all other missing properties. Use `_.setWith` to customize + * `path` creation. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 3.7.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.set(object, 'a[0].b.c', 4); + * console.log(object.a[0].b.c); + * // => 4 + * + * _.set(object, ['x', '0', 'y', 'z'], 5); + * console.log(object.x[0].y.z); + * // => 5 + */ + function set(object, path, value) { + return object == null ? object : baseSet(object, path, value); + } + + /** + * This method is like `_.set` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {*} value The value to set. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.setWith(object, '[0][1]', 'a', Object); + * // => { '0': { '1': 'a' } } + */ + function setWith(object, path, value, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseSet(object, path, value, customizer); + } + + /** + * Creates an array of own enumerable string keyed-value pairs for `object` + * which can be consumed by `_.fromPairs`. If `object` is a map or set, its + * entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entries + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairs(new Foo); + * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed) + */ + var toPairs = createToPairs(keys); + + /** + * Creates an array of own and inherited enumerable string keyed-value pairs + * for `object` which can be consumed by `_.fromPairs`. If `object` is a map + * or set, its entries are returned. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @alias entriesIn + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the key-value pairs. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.toPairsIn(new Foo); + * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed) + */ + var toPairsIn = createToPairs(keysIn); + + /** + * An alternative to `_.reduce`; this method transforms `object` to a new + * `accumulator` object which is the result of running each of its own + * enumerable string keyed properties thru `iteratee`, with each invocation + * potentially mutating the `accumulator` object. If `accumulator` is not + * provided, a new object with the same `[[Prototype]]` will be used. The + * iteratee is invoked with four arguments: (accumulator, value, key, object). + * Iteratee functions may exit iteration early by explicitly returning `false`. + * + * @static + * @memberOf _ + * @since 1.3.0 + * @category Object + * @param {Object} object The object to iterate over. + * @param {Function} [iteratee=_.identity] The function invoked per iteration. + * @param {*} [accumulator] The custom accumulator value. + * @returns {*} Returns the accumulated value. + * @example + * + * _.transform([2, 3, 4], function(result, n) { + * result.push(n *= n); + * return n % 2 == 0; + * }, []); + * // => [4, 9] + * + * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) { + * (result[value] || (result[value] = [])).push(key); + * }, {}); + * // => { '1': ['a', 'c'], '2': ['b'] } + */ + function transform(object, iteratee, accumulator) { + var isArr = isArray(object), + isArrLike = isArr || isBuffer(object) || isTypedArray(object); + + iteratee = getIteratee(iteratee, 4); + if (accumulator == null) { + var Ctor = object && object.constructor; + if (isArrLike) { + accumulator = isArr ? new Ctor : []; + } + else if (isObject(object)) { + accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {}; + } + else { + accumulator = {}; + } + } + (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) { + return iteratee(accumulator, value, index, object); + }); + return accumulator; + } + + /** + * Removes the property at `path` of `object`. + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to unset. + * @returns {boolean} Returns `true` if the property is deleted, else `false`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 7 } }] }; + * _.unset(object, 'a[0].b.c'); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + * + * _.unset(object, ['a', '0', 'b', 'c']); + * // => true + * + * console.log(object); + * // => { 'a': [{ 'b': {} }] }; + */ + function unset(object, path) { + return object == null ? true : baseUnset(object, path); + } + + /** + * This method is like `_.set` except that accepts `updater` to produce the + * value to set. Use `_.updateWith` to customize `path` creation. The `updater` + * is invoked with one argument: (value). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @returns {Object} Returns `object`. + * @example + * + * var object = { 'a': [{ 'b': { 'c': 3 } }] }; + * + * _.update(object, 'a[0].b.c', function(n) { return n * n; }); + * console.log(object.a[0].b.c); + * // => 9 + * + * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; }); + * console.log(object.x[0].y.z); + * // => 0 + */ + function update(object, path, updater) { + return object == null ? object : baseUpdate(object, path, castFunction(updater)); + } + + /** + * This method is like `_.update` except that it accepts `customizer` which is + * invoked to produce the objects of `path`. If `customizer` returns `undefined` + * path creation is handled by the method instead. The `customizer` is invoked + * with three arguments: (nsValue, key, nsObject). + * + * **Note:** This method mutates `object`. + * + * @static + * @memberOf _ + * @since 4.6.0 + * @category Object + * @param {Object} object The object to modify. + * @param {Array|string} path The path of the property to set. + * @param {Function} updater The function to produce the updated value. + * @param {Function} [customizer] The function to customize assigned values. + * @returns {Object} Returns `object`. + * @example + * + * var object = {}; + * + * _.updateWith(object, '[0][1]', _.constant('a'), Object); + * // => { '0': { '1': 'a' } } + */ + function updateWith(object, path, updater, customizer) { + customizer = typeof customizer == 'function' ? customizer : undefined; + return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer); + } + + /** + * Creates an array of the own enumerable string keyed property values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.values(new Foo); + * // => [1, 2] (iteration order is not guaranteed) + * + * _.values('hi'); + * // => ['h', 'i'] + */ + function values(object) { + return object == null ? [] : baseValues(object, keys(object)); + } + + /** + * Creates an array of the own and inherited enumerable string keyed property + * values of `object`. + * + * **Note:** Non-object values are coerced to objects. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category Object + * @param {Object} object The object to query. + * @returns {Array} Returns the array of property values. + * @example + * + * function Foo() { + * this.a = 1; + * this.b = 2; + * } + * + * Foo.prototype.c = 3; + * + * _.valuesIn(new Foo); + * // => [1, 2, 3] (iteration order is not guaranteed) + */ + function valuesIn(object) { + return object == null ? [] : baseValues(object, keysIn(object)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Clamps `number` within the inclusive `lower` and `upper` bounds. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category Number + * @param {number} number The number to clamp. + * @param {number} [lower] The lower bound. + * @param {number} upper The upper bound. + * @returns {number} Returns the clamped number. + * @example + * + * _.clamp(-10, -5, 5); + * // => -5 + * + * _.clamp(10, -5, 5); + * // => 5 + */ + function clamp(number, lower, upper) { + if (upper === undefined) { + upper = lower; + lower = undefined; + } + if (upper !== undefined) { + upper = toNumber(upper); + upper = upper === upper ? upper : 0; + } + if (lower !== undefined) { + lower = toNumber(lower); + lower = lower === lower ? lower : 0; + } + return baseClamp(toNumber(number), lower, upper); + } + + /** + * Checks if `n` is between `start` and up to, but not including, `end`. If + * `end` is not specified, it's set to `start` with `start` then set to `0`. + * If `start` is greater than `end` the params are swapped to support + * negative ranges. + * + * @static + * @memberOf _ + * @since 3.3.0 + * @category Number + * @param {number} number The number to check. + * @param {number} [start=0] The start of the range. + * @param {number} end The end of the range. + * @returns {boolean} Returns `true` if `number` is in the range, else `false`. + * @see _.range, _.rangeRight + * @example + * + * _.inRange(3, 2, 4); + * // => true + * + * _.inRange(4, 8); + * // => true + * + * _.inRange(4, 2); + * // => false + * + * _.inRange(2, 2); + * // => false + * + * _.inRange(1.2, 2); + * // => true + * + * _.inRange(5.2, 4); + * // => false + * + * _.inRange(-3, -2, -6); + * // => true + */ + function inRange(number, start, end) { + start = toFinite(start); + if (end === undefined) { + end = start; + start = 0; + } else { + end = toFinite(end); + } + number = toNumber(number); + return baseInRange(number, start, end); + } + + /** + * Produces a random number between the inclusive `lower` and `upper` bounds. + * If only one argument is provided a number between `0` and the given number + * is returned. If `floating` is `true`, or either `lower` or `upper` are + * floats, a floating-point number is returned instead of an integer. + * + * **Note:** JavaScript follows the IEEE-754 standard for resolving + * floating-point values which can produce unexpected results. + * + * @static + * @memberOf _ + * @since 0.7.0 + * @category Number + * @param {number} [lower=0] The lower bound. + * @param {number} [upper=1] The upper bound. + * @param {boolean} [floating] Specify returning a floating-point number. + * @returns {number} Returns the random number. + * @example + * + * _.random(0, 5); + * // => an integer between 0 and 5 + * + * _.random(5); + * // => also an integer between 0 and 5 + * + * _.random(5, true); + * // => a floating-point number between 0 and 5 + * + * _.random(1.2, 5.2); + * // => a floating-point number between 1.2 and 5.2 + */ + function random(lower, upper, floating) { + if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) { + upper = floating = undefined; + } + if (floating === undefined) { + if (typeof upper == 'boolean') { + floating = upper; + upper = undefined; + } + else if (typeof lower == 'boolean') { + floating = lower; + lower = undefined; + } + } + if (lower === undefined && upper === undefined) { + lower = 0; + upper = 1; + } + else { + lower = toFinite(lower); + if (upper === undefined) { + upper = lower; + lower = 0; + } else { + upper = toFinite(upper); + } + } + if (lower > upper) { + var temp = lower; + lower = upper; + upper = temp; + } + if (floating || lower % 1 || upper % 1) { + var rand = nativeRandom(); + return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper); + } + return baseRandom(lower, upper); + } + + /*------------------------------------------------------------------------*/ + + /** + * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the camel cased string. + * @example + * + * _.camelCase('Foo Bar'); + * // => 'fooBar' + * + * _.camelCase('--foo-bar--'); + * // => 'fooBar' + * + * _.camelCase('__FOO_BAR__'); + * // => 'fooBar' + */ + var camelCase = createCompounder(function(result, word, index) { + word = word.toLowerCase(); + return result + (index ? capitalize(word) : word); + }); + + /** + * Converts the first character of `string` to upper case and the remaining + * to lower case. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to capitalize. + * @returns {string} Returns the capitalized string. + * @example + * + * _.capitalize('FRED'); + * // => 'Fred' + */ + function capitalize(string) { + return upperFirst(toString(string).toLowerCase()); + } + + /** + * Deburrs `string` by converting + * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table) + * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A) + * letters to basic Latin letters and removing + * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to deburr. + * @returns {string} Returns the deburred string. + * @example + * + * _.deburr('déjà vu'); + * // => 'deja vu' + */ + function deburr(string) { + string = toString(string); + return string && string.replace(reLatin, deburrLetter).replace(reComboMark, ''); + } + + /** + * Checks if `string` ends with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=string.length] The position to search up to. + * @returns {boolean} Returns `true` if `string` ends with `target`, + * else `false`. + * @example + * + * _.endsWith('abc', 'c'); + * // => true + * + * _.endsWith('abc', 'b'); + * // => false + * + * _.endsWith('abc', 'b', 2); + * // => true + */ + function endsWith(string, target, position) { + string = toString(string); + target = baseToString(target); + + var length = string.length; + position = position === undefined + ? length + : baseClamp(toInteger(position), 0, length); + + var end = position; + position -= target.length; + return position >= 0 && string.slice(position, end) == target; + } + + /** + * Converts the characters "&", "<", ">", '"', and "'" in `string` to their + * corresponding HTML entities. + * + * **Note:** No other characters are escaped. To escape additional + * characters use a third-party library like [_he_](https://mths.be/he). + * + * Though the ">" character is escaped for symmetry, characters like + * ">" and "/" don't need escaping in HTML and have no special meaning + * unless they're part of a tag or unquoted attribute value. See + * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands) + * (under "semi-related fun fact") for more details. + * + * When working with HTML you should always + * [quote attribute values](http://wonko.com/post/html-escaping) to reduce + * XSS vectors. + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escape('fred, barney, & pebbles'); + * // => 'fred, barney, & pebbles' + */ + function escape(string) { + string = toString(string); + return (string && reHasUnescapedHtml.test(string)) + ? string.replace(reUnescapedHtml, escapeHtmlChar) + : string; + } + + /** + * Escapes the `RegExp` special characters "^", "$", "\", ".", "*", "+", + * "?", "(", ")", "[", "]", "{", "}", and "|" in `string`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to escape. + * @returns {string} Returns the escaped string. + * @example + * + * _.escapeRegExp('[lodash](https://lodash.com/)'); + * // => '\[lodash\]\(https://lodash\.com/\)' + */ + function escapeRegExp(string) { + string = toString(string); + return (string && reHasRegExpChar.test(string)) + ? string.replace(reRegExpChar, '\\$&') + : string; + } + + /** + * Converts `string` to + * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the kebab cased string. + * @example + * + * _.kebabCase('Foo Bar'); + * // => 'foo-bar' + * + * _.kebabCase('fooBar'); + * // => 'foo-bar' + * + * _.kebabCase('__FOO_BAR__'); + * // => 'foo-bar' + */ + var kebabCase = createCompounder(function(result, word, index) { + return result + (index ? '-' : '') + word.toLowerCase(); + }); + + /** + * Converts `string`, as space separated words, to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the lower cased string. + * @example + * + * _.lowerCase('--Foo-Bar--'); + * // => 'foo bar' + * + * _.lowerCase('fooBar'); + * // => 'foo bar' + * + * _.lowerCase('__FOO_BAR__'); + * // => 'foo bar' + */ + var lowerCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + word.toLowerCase(); + }); + + /** + * Converts the first character of `string` to lower case. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the converted string. + * @example + * + * _.lowerFirst('Fred'); + * // => 'fred' + * + * _.lowerFirst('FRED'); + * // => 'fRED' + */ + var lowerFirst = createCaseFirst('toLowerCase'); + + /** + * Pads `string` on the left and right sides if it's shorter than `length`. + * Padding characters are truncated if they can't be evenly divided by `length`. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.pad('abc', 8); + * // => ' abc ' + * + * _.pad('abc', 8, '_-'); + * // => '_-abc_-_' + * + * _.pad('abc', 3); + * // => 'abc' + */ + function pad(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + if (!length || strLength >= length) { + return string; + } + var mid = (length - strLength) / 2; + return ( + createPadding(nativeFloor(mid), chars) + + string + + createPadding(nativeCeil(mid), chars) + ); + } + + /** + * Pads `string` on the right side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padEnd('abc', 6); + * // => 'abc ' + * + * _.padEnd('abc', 6, '_-'); + * // => 'abc_-_' + * + * _.padEnd('abc', 3); + * // => 'abc' + */ + function padEnd(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (string + createPadding(length - strLength, chars)) + : string; + } + + /** + * Pads `string` on the left side if it's shorter than `length`. Padding + * characters are truncated if they exceed `length`. + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to pad. + * @param {number} [length=0] The padding length. + * @param {string} [chars=' '] The string used as padding. + * @returns {string} Returns the padded string. + * @example + * + * _.padStart('abc', 6); + * // => ' abc' + * + * _.padStart('abc', 6, '_-'); + * // => '_-_abc' + * + * _.padStart('abc', 3); + * // => 'abc' + */ + function padStart(string, length, chars) { + string = toString(string); + length = toInteger(length); + + var strLength = length ? stringSize(string) : 0; + return (length && strLength < length) + ? (createPadding(length - strLength, chars) + string) + : string; + } + + /** + * Converts `string` to an integer of the specified radix. If `radix` is + * `undefined` or `0`, a `radix` of `10` is used unless `value` is a + * hexadecimal, in which case a `radix` of `16` is used. + * + * **Note:** This method aligns with the + * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`. + * + * @static + * @memberOf _ + * @since 1.1.0 + * @category String + * @param {string} string The string to convert. + * @param {number} [radix=10] The radix to interpret `value` by. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {number} Returns the converted integer. + * @example + * + * _.parseInt('08'); + * // => 8 + * + * _.map(['6', '08', '10'], _.parseInt); + * // => [6, 8, 10] + */ + function parseInt(string, radix, guard) { + if (guard || radix == null) { + radix = 0; + } else if (radix) { + radix = +radix; + } + return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0); + } + + /** + * Repeats the given string `n` times. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to repeat. + * @param {number} [n=1] The number of times to repeat the string. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {string} Returns the repeated string. + * @example + * + * _.repeat('*', 3); + * // => '***' + * + * _.repeat('abc', 2); + * // => 'abcabc' + * + * _.repeat('abc', 0); + * // => '' + */ + function repeat(string, n, guard) { + if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) { + n = 1; + } else { + n = toInteger(n); + } + return baseRepeat(toString(string), n); + } + + /** + * Replaces matches for `pattern` in `string` with `replacement`. + * + * **Note:** This method is based on + * [`String#replace`](https://mdn.io/String/replace). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to modify. + * @param {RegExp|string} pattern The pattern to replace. + * @param {Function|string} replacement The match replacement. + * @returns {string} Returns the modified string. + * @example + * + * _.replace('Hi Fred', 'Fred', 'Barney'); + * // => 'Hi Barney' + */ + function replace() { + var args = arguments, + string = toString(args[0]); + + return args.length < 3 ? string : string.replace(args[1], args[2]); + } + + /** + * Converts `string` to + * [snake case](https://en.wikipedia.org/wiki/Snake_case). + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the snake cased string. + * @example + * + * _.snakeCase('Foo Bar'); + * // => 'foo_bar' + * + * _.snakeCase('fooBar'); + * // => 'foo_bar' + * + * _.snakeCase('--FOO-BAR--'); + * // => 'foo_bar' + */ + var snakeCase = createCompounder(function(result, word, index) { + return result + (index ? '_' : '') + word.toLowerCase(); + }); + + /** + * Splits `string` by `separator`. + * + * **Note:** This method is based on + * [`String#split`](https://mdn.io/String/split). + * + * @static + * @memberOf _ + * @since 4.0.0 + * @category String + * @param {string} [string=''] The string to split. + * @param {RegExp|string} separator The separator pattern to split by. + * @param {number} [limit] The length to truncate results to. + * @returns {Array} Returns the string segments. + * @example + * + * _.split('a-b-c', '-', 2); + * // => ['a', 'b'] + */ + function split(string, separator, limit) { + if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) { + separator = limit = undefined; + } + limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0; + if (!limit) { + return []; + } + string = toString(string); + if (string && ( + typeof separator == 'string' || + (separator != null && !isRegExp(separator)) + )) { + separator = baseToString(separator); + if (!separator && hasUnicode(string)) { + return castSlice(stringToArray(string), 0, limit); + } + } + return string.split(separator, limit); + } + + /** + * Converts `string` to + * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage). + * + * @static + * @memberOf _ + * @since 3.1.0 + * @category String + * @param {string} [string=''] The string to convert. + * @returns {string} Returns the start cased string. + * @example + * + * _.startCase('--foo-bar--'); + * // => 'Foo Bar' + * + * _.startCase('fooBar'); + * // => 'Foo Bar' + * + * _.startCase('__FOO_BAR__'); + * // => 'FOO BAR' + */ + var startCase = createCompounder(function(result, word, index) { + return result + (index ? ' ' : '') + upperFirst(word); + }); + + /** + * Checks if `string` starts with the given target string. + * + * @static + * @memberOf _ + * @since 3.0.0 + * @category String + * @param {string} [string=''] The string to inspect. + * @param {string} [target] The string to search for. + * @param {number} [position=0] The position to search from. + * @returns {boolean} Returns `true` if `string` starts with `target`, + * else `false`. + * @example + * + * _.startsWith('abc', 'a'); + * // => true + * + * _.startsWith('abc', 'b'); + * // => false + * + * _.startsWith('abc', 'b', 1); + * // => true + */ + function startsWith(string, target, position) { + string = toString(string); + position = position == null + ? 0 + : baseClamp(toInteger(position), 0, string.length); + + target = baseToString(target); + return string.slice(position, position + target.length) == target; + } + + /** + * Creates a compiled template function that can interpolate data properties + * in "interpolate" delimiters, HTML-escape interpolated data properties in + * "escape" delimiters, and execute JavaScript in "evaluate" delimiters. Data + * properties may be accessed as free variables in the template. If a setting + * object is given, it takes precedence over `_.templateSettings` values. + * + * **Note:** In the development build `_.template` utilizes + * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl) + * for easier debugging. + * + * For more information on precompiling templates see + * [lodash's custom builds documentation](https://lodash.com/custom-builds). + * + * For more information on Chrome extension sandboxes see + * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval). + * + * @static + * @since 0.1.0 + * @memberOf _ + * @category String + * @param {string} [string=''] The template string. + * @param {Object} [options={}] The options object. + * @param {RegExp} [options.escape=_.templateSettings.escape] + * The HTML "escape" delimiter. + * @param {RegExp} [options.evaluate=_.templateSettings.evaluate] + * The "evaluate" delimiter. + * @param {Object} [options.imports=_.templateSettings.imports] + * An object to import into the template as free variables. + * @param {RegExp} [options.interpolate=_.templateSettings.interpolate] + * The "interpolate" delimiter. + * @param {string} [options.sourceURL='lodash.templateSources[n]'] + * The sourceURL of the compiled template. + * @param {string} [options.variable='obj'] + * The data object variable name. + * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. + * @returns {Function} Returns the compiled template function. + * @example + * + * // Use the "interpolate" delimiter to create a compiled template. + * var compiled = _.template('hello <%= user %>!'); + * compiled({ 'user': 'fred' }); + * // => 'hello fred!' + * + * // Use the HTML "escape" delimiter to escape data property values. + * var compiled = _.template('<%- value %>'); + * compiled({ 'value': '