cubelyr/0000755000176200001440000000000013757153513011731 5ustar liggesuserscubelyr/NAMESPACE0000644000176200001440000000214713756757731013167 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(as.data.frame,tbl_cube) S3method(as.table,tbl_cube) S3method(as.tbl_cube,array) S3method(as.tbl_cube,data.frame) S3method(as.tbl_cube,matrix) S3method(as.tbl_cube,table) S3method(as_tibble,tbl_cube) S3method(auto_copy,tbl_cube) S3method(dim,tbl_cube) S3method(group_by,tbl_cube) S3method(group_vars,tbl_cube) S3method(groups,tbl_cube) S3method(print,tbl_cube) S3method(rename,tbl_cube) S3method(same_src,tbl_cube) S3method(select,tbl_cube) S3method(summarise,tbl_cube) S3method(tbl_vars,tbl_cube) S3method(ungroup,tbl_cube) export(as.tbl_cube) export(tbl_cube) import(rlang) importFrom(dplyr,auto_copy) importFrom(dplyr,filter) importFrom(dplyr,group_by) importFrom(dplyr,group_vars) importFrom(dplyr,groups) importFrom(dplyr,rename) importFrom(dplyr,same_src) importFrom(dplyr,select) importFrom(dplyr,summarise) importFrom(dplyr,tbl_vars) importFrom(dplyr,ungroup) importFrom(glue,glue) importFrom(purrr,map) importFrom(purrr,map2_int) importFrom(purrr,map_chr) importFrom(purrr,map_int) importFrom(purrr,map_lgl) importFrom(stats,setNames) importFrom(tibble,as_tibble) cubelyr/LICENSE0000644000176200001440000000005413623770637012741 0ustar liggesusersYEAR: 2020 COPYRIGHT HOLDER: Hadley Wickham cubelyr/README.md0000644000176200001440000000107213756757725013226 0ustar liggesusers# cubelyr [![R-CMD-check](https://github.com/hadley/cubelyr/workflows/R-CMD-check/badge.svg)](https://github.com/hadley/cubelyr/actions) cubelyr pulls the experimental `tbl_cube()` out of dplyr, so you can continue to use it if you want. ## Installation You can install the released version of cubelyr from [CRAN](https://CRAN.R-project.org) with: ``` r install.packages("cubelyr") ``` ## Example This is a basic example which shows you how to solve a common problem: ``` r library(cubelyr) ## basic example code ``` cubelyr/data/0000755000176200001440000000000013574520726012643 5ustar liggesuserscubelyr/data/nasa.rda0000644000176200001440000052612012250440134014243 0ustar liggesusersBZh91AY&SY[3{]]Xf P@@@A⪪Q@DDB**J@RTI%"TQ%"B U)( !PPHE$U*TPP(UPdJF}4GH JD DF!IJhHA@J5 ATT *)BHH ( **AB@ D P(!E$( **(HUQU J( ((HI@@P@$**U( P Q$ ( R@k6EWLhJ١(*P@zV@ U B !HD @! "  P"(T y@kfYlڳZ,5 [hR !  JPHT ("R%R" QPI*@5@ФQJPPQU">| !)AHNB@ BMT6U?L A4 i?MSMڀ DBAORhM@i5?B(B$BbT4=!L Fi LHRzm@h!)"F=5Mz&M1CFifOCSG?  ti4!T#N:΢6 @Ҕ HiДl:Miӥ@M&mh@(vͻEhbZ+mrr(MAUnUE-p.skshԔt& :֤V+tխ\.TPVJ҆@ Vrض+]1 )4)Eb9֍U[vȱ tit\9hnTW&УB:P@@itHiҚ.JUJGM(V%P&1!JSRM(-4 4).chM͋W([8"tҮ4!DZT*c_\^6t!t5BЅlIH4 W@PhCl!FC[XwuTU]5AiЅ4 ЕJ~ H@& !)#bM& i(@4t] NR(iJFZ.@ FHWBk@J@!t:Ti4 hiUt!Кt 4!J VjTi.4! J]RCJPҩ4 HR b)J44<mQ\\*[-sjV-cTlM[(Zl &U(Z4&"R( "]PAJQD@ M ҅:4СCJ4FKкRPдBhBR!Jy U^mhU\cF6]"t@PSBkD-sn֋bnj)-)(Q-l!:Һ6”&ZV[aBthSFihКdT\665%b*jckƶZ-lG@4T]l V(F W-k\ֈBJM PFDiCJGNiF4 )B @EW"+rrT'$hīJBt:JWN\勛D\kN kH.$h Uh& HW5rmѫ\ wt;nŧgIЅ44:ӡ[.bV*SB:1)ARt"4iHv TҢi  G5wuwuDsrPVj劍mXnE`5F54 TBiSBihرrA܋QQ-.ZДJҘ+(] 4.]JJ]JPk@@R !4[bhh1Vk72X!  I@@U"@A )Hҥ!(4 m`tUTIIIrU\E4 β( 5Ҏѥi176hh-.MhPPl[rұrڋc.ik[kEFmEskFD6jB i6[Z7-ulѭʊXƷ"j"Kn t& t:4N H-.AlPQl &Ħ[ h ,5\sNtQ\JQҺ"ZM.#*r7MŌXrcX55̉vjQlrsgg\WZ4b-(hbZ@٢q9F5hvHuZF.4h4.lFΊw.sPSƋӻEEl=:x(nVc\rኋG1rSv墌c7- 1nX.-*mcl\1 NW"LutwEhkJ MiM5j˚\D͹&ň4\"@:4P6 幵sstukPLa44'I4mJ5uݮr+ 9(փKCE+lP9sr&:QWNƴhmZ"CFکuͱuSwN:tlnݱGJ@[ -b4 l&+a(5hւE-hsXƣjkKSti"3HjCk&.KhvdAK#4SF!Ѧ]6 )-NRj4\ΉcXwr'+,WM6qwuݝ;.r1 AFƨ4lִM'@NZ @r7*wr-nskusN\6&)iZ4.m]h c.lkFmuVζbvӺ˲%]ӛh6k[Yq D&'pkFfh軮ݎW(wP]ՠ4ƓQ%ֵCv#gw v*ڝgMѢ[Y)4kAE%iHk\ܹnrQPCq.nPwr1Fbֳkm)ӊ4ӌ`Qm)˗NpMk4h5Zًf *¹aJRqґKq9шt(Ƙ+mZ1E*6m;Af"Fwbg;i&`I*-wnf#jkkjflQlFh5TlŋBmQ.ȮrH1q+Uc mXm1jӠ#m[V+RV-bTX6 ]W+m͢tw\+src.;cV5ckbvFؓ4NcD(4lcku)lF*ĦZ5lsf*Ֆ1k:-#]H;tgwsNi:8p]˺ZNIcbjWNQQL`5rpfڭw 튂dbii@mqi6i7g0P9'FۄŽL 0Hِ\Q-CkRkFrB'#(kb|i4)Th#ڦlN Fbi14Abg9(Ίhh-mٜB2(QDB( '9AENջ֧ MlGQ` ؁HES|n71.@pnmMA6 <75vnq4[uRieE[R;mH#XHC^@* $N2(F!B7!cMꐹ2r"dB/,cǏj2 !1G"+r" M&.gW#G#qZ8FZr& +$`yi&fq֥HM' )S1L|fqēc(IclX.o3YvZ9SDT5 7>"H-i {8R8ŵo!I&eT(阵\9H6Qb8@bLvh*H$qdT\iF m+D%!6V-e ۯm֧9@'EH,bnbUrr`Dib+׎jhۭ8h5bc&&\ִM3wK+X5t( dM`B4>=OwS֮uE#92&W$ًqbN;2YE"״Zh޻f1ܑA6Dq6nnVf1^35*r"-Xw'68łx 3xj˛JqL+kadF<-P(>kq֭y.1Y 2M55A" jM ̭nqՕ yQG ِ LMx{sv,wR*a̒9S9Bׯ!V#s[ձa>mn[vkPS0 1҉ǁ7kUU,P&M=,SM<64t,fnrMMܛ031ȮMfnyXZVIX5ZnV,qcj(CbW^c5j9h <~a[\Q&?J(!CiB$ںP#[_7U?0EnG.J.*Q VЀm&{Qt)՜IPCglLm} />ߎcTlxma:kٷV3M[\t,:49\l!e?EY&IM*YZ/;r`=kޫ=O3],lm>'Fu^IDN8@̊)D~uEթ8 ) nԊ.lLP^9Fc}zN")´c؜93%N H(liwlHg$5DG\lsc&յ4;uD%86Ү-_L8î΍7O$~튨t?բWҏ򳍰|@ lzCmHmd[}8]XѢo3皚u (.u-sjՂE@QN3D[Wȧ~۽'-zd#k(!0cLF~ÊpH_50̅v}go"tGUKԭu_G:ha)ï"%d`0R!08>RbNt8q6wS&:T Ʉ<5lܵ60WEv8ܪ%oMp׎>%Sz,}(I@*N/>Eߺ> " ݂  AB/jj9wϵ0A"dlJݝ><&|' u2{XDoX)vD}1E Y5I?Lԭ}ik6󬕥?Hq$u!#fՙ/vX}t} yݙ&*fTW _;A؜'md!h=ϯErm6\$ӥg!eKTNνekNwJ\Ɔ`R<)r9zvT,*czu8a0*`*(6J@Th:Qϐ0ns8VUuիX [+@%Rp"{*Sp:W!*Z3K24/k$ªvQ!NW7/~ g򥞪hKsO"M # `E`'Ʋފ#Xݕ 5VLW.}o2h| 8;b.Vύ#tX"ːœo?_6*9N$kSYBGy~y~#ߌ"i&"Y:ǍؑڅlHE2g7lmŋц"JN?:~Dӭ{pUCTOljŭUk|#T[_ASCuMxѯS#EbPbk~g9 GP|$PO_>+1D﹙JJC;n"3]Soޡ*s& +]^ # g?[jzMP,Janr9qXχ `ȧ~, LdLgog g4};֒նE[p`XfE!Nv2^mD,~R[XWBy>yȆdWZ_ Tf1Og@ZC9~m[0'v(ފi4HFpAW/ġƹlQ=`['!A)ކBqo, "LOFv$ IۦTrZ) )j.VD۷zꞬAVeiY<g6ӫo"/Qx\5ztΧq]TsH~+};8dIcw^jW]g-i(u[  mU#Bxue뫺ƧK^_HF{Y Oe@PKb usua1﹝7ڙ^Ex[}_ŷzqLm*"~Ϭp T6ۍbX/JF}tli|ju6jʾzsb{qMDLV-lb:3ߝ  BO u,#;6h|Ԝ^Bݎ ЋVZ+(&-+čR.eYIo9nEm`[l&Z裸$*T -,Uʔ3 l,RHGRs*c(7 wJheWu-LǚjS|3^D_ Ql9ŋ yu.1qvԏ%õ6#վo٫o,#峧ے0ZDՍ*j)=DUN+Tk &mZ V%zCj#7vvz0ۛk7cJ֗jlK=x:{sHC2Cm#ot,&ˤA/D*v!(٫8$e*0dXD0z črF#(/7)Nuw@Y׊& B8MA/ ER"@EI[qB /ŴZu΢0/uSlXe'ڗHGcI Y;jz$V1uoTB?/`"=Ybz G;4 *E#ÅE5iiʭTe$309iR?U}?ykܳ2WU*'tw: S1l<RxQ X_N"aP/vjyeWL-zL #!~M7A~F\ 2d2"×hFyb@]S 9`UIfBcj0Eh*eY5siם\(mУb{3jxfEҪ5TbЦ;HJ!%ExXwfG˭>]y>ӭnO: 0!еYV1Djvԯ;V͂33Ob_k8<}J.WD_ʚ_tWtVbJX9vi;4ɐԲV²+2gjb :ǕED8"q{,PO)t)[_y GMHM2sLvBd{_ʀ.*:pqmLVAwWHT*`.H`]օghaףeFf{ZJ1TNtVC7vZ`x $T֎lH.+t{ڄjPl{*{vmj3*%aቦ2<o#",vL(@/ʽ,w 2SF"-8u] 0eyta4 ; >q =Tw$KNHas[&1zタ/-#VZUcs* Di/}Lchϡ/eޮO>TƉ]AĤRTҒK.5$uFbZ[U$123Um"yAjM9аW]4?0~z=?*zT'ށqCv I2< B&s -y"R3&mˁnhsln&P 6W(7pB2e{dͻ]Z~թLMթC.%$g%t+X< O+#V:ֶ kZ뛩hPDvBLSNBJ-ϑ95ɁV1I)-4 P|-F@4FQ tU)¸f"JG1_?r3tWb5vub I=Ehc*[%%Hz `{Pjbj!#܎_z*91K+qOw|J$Mn)+1^ 1 ŕ=[ Xjs9.0:BOT]׉Oѥ:Ve}AQe,8k"FY甐]֪ G|YS Sv V݅7ÿ_Tܓ'X+J[s=cjAs3eh( !K?޺,亱rtϏNㆌ}.s @>r^6dǬ5j)|xUʸ3P^YX9gpBކz6]$E:0_5Y2$WM7(Ab1WD!FNWir9{TG7zmmWĨ.hJ^ݵ4gՙ&$Ol U쇆#6:}dD6,Y7}na2^:6L Y}/ԬqWu`UZQPحH0eM]*vXFnNP;9撈JX7^-s|'=Ʋ.'qLw+jܨX_G9~vAc{wjϺC?{jnOǔ;ȩ( EQ6[Ǭ2ţGq-W֨qqft@M3@F Z'zUw=ۑj['7VY>ӚSS_0KA[f!=Sr"¨CtSw WK[ޛeU7Sy1G5XOѷ&n߄֯MԔ\u696>fG#+h`'%'nKXfMTpqO7d<JY׋H^E$NhE+iU.{Z1L-N狷L~6^jwƆ9$њ^> s-iƖ?OG.tVKh[v>.a1ed0{5X:4<{f^Ya{ r%%,jI,Tv=%pic RmS(츥&}g`)ޝ+mݻph@ͭ6^%wux[`ϞeZ6J0vWfD %'" p)}]1-µIh G" >k16 | OU2E s(ưoQ{o+}gJ. hV Cs"uZVOmV~xLQI# pj9FO-Ŕ#Bb2ܺю;o }Cٴy Sj5lM{/鸵iIY١[VkW=%[CJre/L̴du#Jd`ub-%*tӭE+Nf pj8&Zlܒv-c'"#neZ=@3060tl7Hꢯ@}͊kM*YNO]ƙ٨ީWySLi26~A%6CjOSjsw]o[+=-8ߨnz},6_euwy[}O?' a!]w\LisVfm/ǣ~$[y"4wB*7OGXt~½F#Ƀݲߜq,"]\˭Y=t 6drH9vtgGIza[䍺XOcNE)ZYlZēim)' CZey&ϣ?!V biGv:Hn)9D&]r&ΣW2ڙ%^zn{tO Y,Mg]5BY"͖,Td}WHd ZSpiWfo'owgK҅*6)?dRB.T[add2ۜokZ=p܁O,lP90 /,A]CG< '{kjʍ$91kMV4s6#{sSee>*zyբۅFԼۉ76EVY&R]=3G TC0C@=Bo+A ToMGhn.~Iuz6ç^/#k7xMRCD?|5UfKxsxTH\;D+=V]Džv 6+X/Vwb F*cb7TeުQDD~P$ sJ,V88:@&Nb^|qHҿDˋI{孟SC-&B0q%΅N ,8*%mPtvGf ֦aNz֛5Aj "d1UCvBAa1R*lqX@6t`z_h|m]k3N:лYr[6k`%>]5eT=PS{ᨌO @C} iTų*\'Eưٵ%V}ܨ!@$ e,wjm}o^H'÷ h|gZwڎ+ |kk)~\'Dr0C\?,Epekm7>sĆ|Ӟ~MkpG3=ކ-(usߔ" c/O?PW*\DfOcf9F')M!ĺc.C뗵s|ᯍszц# lH&BڋMXttg|](eh# s'.SP1np03);#-/ŴG]4ZN\6aFڛSd: Q1vR5aꝝ|D^w^L5۽y~%0KwR톪p3\5#숛xe㚫Y*CZ1otFC=.౰ir|ikkp9ɟ=;NXڬ0co^iFMop\v4\@WTRGi hx]u$h2 cxٹgI!ݸXaqBv+'V.u!d|?buY@!RAtۯUSA:<(C9yrнo9LFϳʉR6UVxXɰyk:g&5\S&!Ew؅8M=@ڛ'z*ZInZeb랊kL5ib׸ g4s_|W] Ki  O6mW{i&ri.q n)0H@ 2;[fibdUK'5N놺D!pxC*veG8Ww|&y<\q9f(-UHܭ 1!)$,mZJU-҈ͼ$RXd+vO<9SeHV'6qk_'E9+a ǓYzIUuz/>,Ê;Nzr3$3 vXݑRr1&U#Qjݒ j]2$(Om%5o5p3 mLݙh# 3Yd㇏K5yOF1YZBA,xF,$]..* gOJHԼ)e'wJϋJf QaQìZojľ}Wpj.pQG?4i>OGΕE]0tTGN嘥/ь@2*,h*9V0hqe􁦡A3@IЇ5MDsEtQ˾{ȇC\\ (Z/TbAu;TY!H%WQ@O d;jǓxZeFH0+$iZCyMBT *KȝyyDܞ8FR{ ZT;UwXi~%;˶FIz@؇1Ø~ɍ|m|ᯋyYY>uV{n|5ݠ%G;p}9B2qsѶk~"渔W2B%%H9Hza[ЈQ8 sۚuqR,S*H6ZB=>1qQvM+e ׵(lo4e̾858[v-z4p,nWp5VVJ,bxH晢{:Wf`m׏Q~b0c 5~wWv_o!QJv1m[ bOP`M@n;34<#zTK@/Cg/EPS TK!qkR,Y:tYLxi%19!;pU{Jj$pK!ӋB85@K(N|/qs==nbG ;O*?D痾 k}> 5hH߂hyW az@; zOPf)[c$ASL<]Xq19tog8Hˤ>3VnJy0G +1%ϓ5K!v<(1cUqbP-̃7yf(3-ev#1Y.45| 8C3&N} xʆ'|M=ʝ&vgኒD Gx4ӂdK3x*4`[IQ+rqov5W(X:4j&f:!\LoTePBiQN6^# ^M^emI)C>5Akh1]-'%REZ|ht\`G9jٱ쭪%+Xmo.: Q qWhtN)@j^:p=+}* (tq)vGiC Ysipu; o+IKEJ#Vay%c<誧ܰ$B,w?iJ *߹QM6X%M5ツjw3Sͱ90nGXx"eb22ɆfW:Y˚hfZV4 7׈zy-]oYmyk}nT?|w4lISE,*Z:)dȞ8m;JB"~]v``Յ>yW%1 Ajuǖq,1 Ѳ"j4al~i([fF"gK=LBᑩH}p.'PDZ>ۂݧ8/" =fʧ?1G~@yY I/7ZdlM"Qr۔R"61YKq/듛m3%n/0I3YNW{a6 !kÖ׹J]"բ1QCu09^.8QuyI)8_9=X@[J XiKT&1KL@Ƈ,rPtS\HĎՏx8y@|%BB"᫢nyYÁ'-ڍ&Ml#J5Y$ʐ-r,8s1JrD%Gjkb,V'Z*OO ݡ ?+L*X9s/4b-.L$$yb*y3ISXaT_lM 9GIHdڜD6_m2j/rǼK=?eeE!K'n5 "tÉ,T/C_pY`we/JN>z3b( h-ʎ5o-{R+S܈ۉ@r' ĉȹ1҆q0LC~z0P)%]1#[|?V~˸HK6dM'X! R3͓(͋TA/2 fJ3DXܶ?!{YK/zr=mߚ3aT[(3&qSl_&>>?'DۋXhGèrfkVJFq9r';) \Eӽg("8DA$IΰuZQ@)I*: ͬ?0JUY*4M ly6#7#uٲZŜ_뽹KQL݊ן5Џ(v9hRFJsn*Єڠr9 ׬A+NW vj\#-2?Y9)ʊ1tS)^aa]%U J,PXyK˫HRͦU^ĊqQA~M3,ra@5`RfIB/} hb'/{6Xj4Y~Qξcj,Wm@cC?:M[k]6QЃ$wKuwq~*t~۝g -ܤX'!×&,dMlP;[ҷ/ [ϝk鈻LN:.ŝp群rxUl8=7|6X"bX5Mu}Xoy\O"-%:yGQ\JUyʓ_/+\^6;gP5TuZ,[XJ:ya+Fi|U ?!53gKpP~ʦW4'"+)d[tD)pYD3 M1ߎ}%jĀyw;%:vjxKƤKKT#cik[w;s t^=l=myqCQ]x ~[&Չĺ=q6jWb7m[!ߋÚh%1,YfЫ)4іLGM^rik0<ߏ7Bdd:;W϶E!S#"*7w"eRmJVĶYG\OeɬCTjWJD5wSLf:v(ѬX[ GuK۵Z$VV#;r6#}`cQbsjRj)j7-{p}&?pT&'ωr()3uض(biKZE. UBY0+zRO?nCw %9o/{>i0i ~ƺKA }7J",[O 16p[ t܂It6Q7&-S43F5ޚ8wȺsr%4,h&&z؟%:S !dL! g9I(Ș+t2Т%)V0R6aR~ (S1c/E? DGue-1Auo,R"+ČGexmyEN,+/K6(s>W^Sb)(OZ9TLyVɇǫ'n0Y/ hC w|ԝњpz=>(w:QvIn;R{av. l&⢌Z% :0׌uof* ^l6^Zߪ-&~E{$uNVS2Z@۴GEi|Q #q&S](H#뾌B|@\)PٛysC2N  b?Yq|QH~ ^ ɲ.U?т լ@=r4>M: 7NԪ"䭙j]?$߲?yl݆V5|=sSfg@pt:crMξM7yaS΢L)M7GO*OUG<ҚI\t=?~> 賸yt멮Oݝ976Tu;3m3ߢS}9IڮȤsč(ǢtԭVZHG$Zm|.^\VAR4"W:W$'rz}AI@,T :$oÈB+ΐL-(Ao S;1p7#ҭ'N֍O&l iPmY9ū:cfy_k{:G6GQ1D`ѷ E*tW"f+7y,"sA1خ5*ʣ5TA ,yfUk8 ?Aڽ}"[@hgix'i4FL/npO/Fo}p(Ccg&"14pM:%[G]5J]"{JÒFc\-|fI`γ~uٴڿN=[EشЮҝZJoRRWܒ:ҵg^j XȬzqo9Hs]/ך6Қ`Xҷ[:1=Īyx$I!մ&unSlx:.8ͮ,XGp|ln)s!-T;}{F_BBQ9g0#| .L(:gIX3T= 3*ϛ4GL{;dH{|3 }g;tfķ {*ڵ_q;Q(UM{1×J&n+b;і'ȼEUqqK<ŝb mV"n1$"(TeSɑ_j&ܫnNǰ Uq&i<)B;o8d@ I$P4%H!L-Iޚnf߳J (L\P{)'}(-ȅ7X.=BqDi)i\2K9Md+2 SAV%$l\U!?T&2TRGT Ǧi ccu;֔nCrYM{5UU*=Z%9J+H7&Uɇ6Y" 6jX;e2`O<䳐xs ӭ>'=ly5uK%8gFm)+U [st#ke683Ar wݏ Bi/t[ ;N[)Xg6_}V,z e~"^.(촻}7o]Υ]oP%::/ T17Q T6"p)v^CKg]]ttCt|##M`Mm)0XXiFiu45UnW tnm(%$/L~o~g*ß*1PL'1"#xpqB[ M-\,zDX6E)Ia; G#T FͤdEhԓ.JRx=TwjeD$nmD i&Cm w7$# |D0."Wr~-=mߪn  Chƹؙ/oo8۟=7|1,_>lÜ&;g7ŜKFX͝}I_2;UHh5,}Ȧ]+je>grq mSU8ls$7C4ʬu~S`.2bn53jC=ɅN?2n+bs"R2,Qxf,@ \dysv2;L:ki8[]QJQ :PЋnG-N@C(YAgK&,:U!Ji{~z,YlϘF.k&4 jj(U"0pD ⧯j,Z,qzZ;n/pVw83ƈ#ɧ+>pJLhRJUC3lhs23(n쑽XKRzԲђmչvT7riTOTF1Qc:uNus;[O@F5U݇#^hO;7ZSHB<_[EOr~) _CA:ܾ’j ޙ:! Ūwfc6],I& (t- wNp^llS!֑ȕrB)&!͕IUUJ b*Zp{1lBp梼]YٽZF&!G\"I챉f!eJH]s4:"N#d5!$4Oyֻ0>Uh*'GEh - d.pks{xq&W\ɤDFsy* P=%Zd4̨Auyrr!Q^SQTk$,ؒ%R /_HacvLYa~\4[Ȏm7HJIDr߃[Жy u͋Ӵ@A-f1✵8j I\T'gh:YXr䖡}W6;-GBcgKg4(Q 1(f^צTnZn5٪(ABUz^qRI@B4|Kޥi ]C%:Nfy>yW-81v3Z 9 S6~~Û_fE秢߅8NSec0tPE44("ҋ֥/dT: ڼ./;&~{qd&VJ=roP<{I~O@gEbΤ2 ">-&*y@[hfέ% Qq]0`k7jj|H`]J3/2ύcqn"M6mIccg|{ f6O-*6Zb쳉FnSRd&ɶt#(2 Ef6d~36jEZE9Ъmg Vm |ƭ{T3엡2\B)tT0,AKԍ zvOwh`䡫v `0Ҋ b U!7Oߊs֫Bj*֍{.xr'^+poS9ԁz C:Jud*{]ݬPS oFĎޅs4q/LQqC FQat2yE|8 *'􄘓CФ:^ GH}@H2u&Pa|C%-dʎ2%>~`MEO6 I$qo)!㘜5X{K>gV8h'j9ec 0,e kQ$Q5 s*2aQK|ᕑ WK jqv((6A%*v|0`Z>Lj%6Ư#jCqHĂZXͅtJP)lt~^idyo^}p$pO|{/̛{E_ngИMSI~z71CŰb RtA\$V(y[jmJ`sSxm[:EtEeLq4#'!_{ßX:Z v>rE fgԔ 5F.[`sMP\n'۸O~SCv^kH)\+jiĞθ ܈,:P/iSZqau6աRlzhӒ9w]9dhwD69ٕ­ڌeS As$ݕfO2q(W;5j HO8X1v+tY0Ts>_(뺟PgcƈXP+bW^xZW$VڈԂ{cPϒ֞Yet)ָA̙j`OB :*Z$-{#e+s6z{E[ <@.v{_ +CؤoL|/(o8[1l4Q)L]٦cɭ?x۹Tag+ͮ&I+8>|!yH^}޳$ 'P0Oue\+DH2=[氚XŴwʿK_nB$}ӜT6k"雏W O~Pc6)+fP o4DW mK*b^h_.$!b&ԩCuMf.rc$ ;DLoA!y滝6π!5uz0,lR;,7G'Sx^mGڒ &Ѓ +~u-u켈mci~|t]SI_?D2ȧZGI ,lZMKG?ӟ[wJX!J6z% ,|\ͤNtK:Ujez̕Yy&/I=To#eԈ$2AWuH<7Nv)9Ch9]3D^I7lk#tW}4Qzynr!F9uOמ[^mЬȂCؓXjb%Sjo׈PN_lhΝuO6qy?4f}'OKaMϜ|:Ӣ}!iXμ\̏" u,Q2x(sޞ]ī*B //UlvHg}5P Y!.<~fXq>ngאAr/%R&g]!IH։ 76i;`ۈ++%ܢɾzYQF\&žo#FVv~Z-OhT\@17 +Ƶ| h:i?SbͳIv){.0+'t x;@M |߃tu^.~© Pz=(Z%'jq`W>hϭDžjW`6z7u(ip>RjwyAH[d}s3\z F7ܸtaau 2NPӎOSD<̣l0""9O-H=Τ5vfaD"e[=m9)VߘBIE) wI4 xND:vۂ`q;Qv='7;#tAW" s9wmUID:KUdHbkbG'&>1 \YVoI3[\]Ѕӏj `I^T)MK@{6o=ޟnu\ c+1%wcDiI 1iD,)<>ҕȣ?*93'&t "jBRb w=i0q0y*鈷y5^]0g_m >Oߖs6i.]=g'ڟI7:R7N ~t%NP7ثpF:ҌzP>< EۙpgC.}g7K7$*F œ/=B#ՊӌW uy?yxd8NLsi#:\<׍ԇZji >D_|@|=o@ԪiFɉr}2>"}|妞ɆOm /Dkx^%(?',[הX: q`czOKHu.}^$ n!zKv-Ak-$LgeE/cg\nӱsL S=^OPTo1Q(K+GkGa]C&0a;#ekRd Q ^F١Ozb$s,hR7&ig7`V㾕X" +7qCs@4ȁkl%!U:')@DRĽ <N"H\;GF)rICߙaGqxCa=J'pOh˔ʧ6QE &b{mZ4$3cETurțC/s,_='"!Z%-y]Vnh SVu>ET9j>w)i""b3<+D^iy#̌N#5TV m#9j5jV.q5aU`5L͖dO)4]Y'o*tY՘a Ffy֤ܮive%7gJJʰ%*R.,kZ4DQC=!Gʫ95Sey_~q_P# K2otf[gMԃJGb[-["O~ZHxmCܛLـGe)KUC!G^=Ɵ]=keKfX  4O(?m[h{N;ѵWrkmx&.#zbJLl@I1z"ɬ6&xI" )rY9׏8g 8v0FJDΜcn& 9܅7*#=Կ&rG /2X IxtZKch"0.nkvM7$=p3LQ%cvHݝ]+#7;pξ/\?ߜ}GY+0U䥴kf}/चy}tljz3I!7n|BtH}:OgGz5ѣ9qc9T<ȁKEsrfl] +CAX7>2U͏')[Ej={C)d(Y#(Ѵ8sNQGFeUO0q2gD|Jh,S1K̟ m n7nB9=Ժ(jY Tcn̲/f|>UAyqRU~TS4/'#'ծɜg5~ѝ5~׳Kw@GO^FK<8 -5;ϿPmsW-',&ME 0Ϭ LB3'2azZĢBh&K/GfSyDAnF@CHVt_?ڈ)}_9ȫ@o}٢>*?,MQ;G)nk9X#|u!sky{oq/ixOA1Nty0c'66zWU6{S07$.do'IFYT7[K&;5(2ʎg#i;bYB;y@< :@mCl]"ц;SޜgjYcK]6IBT:YC9[%*vFtw/&93Er BD<)SҽM5ܦq&й&h;IݖN{mXt)aE<4Shqǧm;4w dkZSur>e[ps.Adia3NMYooY-__ ?>>,(V,>B%_we8Zk#):U:]$9-u!w0Eag†\N6&6iRCCb`&H^b. FKjۧ V'~PBE3~|gaMvje$"˞.sc c*Ye%?JνT|&J5[ BܻgTK}!:K`X5WVwVzҤA.Xw''pFƵ+ر[I3Mb;P݂N=s龶HT~g\tQx4<3$G]0ϛpl3kd&'iX)0FKA$\c[}h<<9O_|ּ-@znti"A=w~tcJ垈:5ئRS*3 2^e]w0ț b{~YʚK ixUL!˴U駳//0h_p/,cXmUOJe6hO^di HXPCtW~,u!́UwZO;O2Ō@%'UndmQ5k{ mZNZ9$#abJ=`-k«9ɇΞ j*V =0AC`b?tٓ O ;2V0h>m60LӚ<ʷ_ė@=IckJ7L4^AY=RRh1#_Sq"M{aFV6i{U̴ Keb3mH l&B^Y Wq-,ۖ%fEkn7fs?`PQgǚ?L䐤<40픏n30/!A+b3r$Lm xqxczĄ f~IGyTlbǖ|_4τK * ~gխT{OV.i(sNf YI9)8|i@QgG_)_}2m' 8n6l*X)/#H$ b0o"3~kG5#5;ڮ_)XȷA$ ۑGXy>3[kd߰R_]pHM(ca:+;Oj DSsNH&jrf^*@2 |$lNa8䡅2Y81ͭ9힊߬Go ^GR91W/P&b|7WEVs3&CW{v!4Ӳا(K`-$,~|-j|X=Мj4Bt525o>!CT2g]:7O YN儵W׼L仒l6/<:5E#R|fob)VJBQ@|tה.֦Fy<|܎עOn`H(d!Jnw~EwK2nVe|p)v9Td%62Mvfܑ,O}p68%٣s*PghûAسE{/U~#LHyIψsΡv)D޶+7td>ܱnFi_v2z^ލS 뷉5=WboWlW(=1!fw-}ċ}@ӫLOWMV'l0~*~%I|{G??lW=OLT 3N9=s,$nCe_NX,(yVNQfnjrfבI`YuS.z,*:%zZ8˧;UN!3c|BD\QG'=B>2RQ'Eᓰ1ZLsF83dH,Ö>Ҋl/5LεaT9qdkzYШbvwY'כ$|,RDѴ\WD XS<{ܥU4sؤm1pKKp%wLU& L vZ̀A5W+/BIrɯU30knSdۛ%V.G_s S]USrR ؀h6-?8d~Ki{w*U)8}Dx*_dT\):0,}*//5e\ %uIny^1B,Ρ~I[Y;ZqCAv$mG6w69}Oj,tdS9 TZf:J'!$vg2 篏LOS a聉*f}C10Ҏ_Jz{ICpOXGͥ^O}VP3>T=MbV~[ Rj[s˘)R[2_-ʜ rlxE2Qzb\Qc$I%6Ÿdz+bbyМޞikx>s,uzV]@B)hzwVYr[Xм?ֺ~LERzW*WNUCBZIZj4'mO/ Ѵr~s \53Hhvd5u*_ 9]?|Uiy^'@T 4en' Qr7 .h=H NɑZQ<_y;}nwOβ"6Uuzuy7-"Cf{Nӻw{ۡk6KY}zez玁w/^hb]ěGGPفSdžN֯DQ0H.ԬQ_ct#ɡb#-2(,[a?ߖ[~I22hֽ׭^&6~;C܇?KoJCb }?H>aՈ7[fzCGV?d?oS+1;S,j|WKAP^" !r/[ c݇/"x::5 SV'a)w@HEFDbHP;Lo CW)u!T(!'fz zv'կNN" O {LlxC Vͦ.㗗L34$"~K{ .\-ޔ`Wlш |}XrobOjslVvn#H{؊޳Lh*?2~pw jTHty PPEp7V,sbϚd0'm:z^,vrTde`סsh1.WIt^!S?f/&WrEЖd禄NhKibTf~ڄ bHc:v;ciX-yA:(4\No%X!O>ne/ղ)o࣮^Af-^p?vYl+LM ?aKfw<:[q!j FO|%4*݌mt[QP̱C_jfbK8{ų8x{{󹶸Pngv /NHg-㹺wkTdJgLqYEN-WVZ'k3U˛>{m}m.ʻHeɾpeҖZ_Rzo"uzLw/xߓW=[fS  zT&m|ϡƀUU#_Cn 4c4sʇn}="5T#ڃ%Q^V>;l 3 ^Z׹D=nU{zJޯV*qYk̙f&9id}pᤙ $$y_>}!CR~·I/Mӯ"h1'M4Ф / *Nce>ozn'R.o?xбnIcMca=[{s{~϶}56##ПvA'EQwh蛾8rR{~8mOB9|TĞ_z7m۵ht!ɗH_ߐN)v#3/,v**)9oYd)NMZئko'=_;[DjS531EŎNPQ0)8C3Ն+` ^q[Dvs @ѽ\g~ ´ٜh16w/E̛Uhu3̞+I?E~읛lǜN't]n}+Ƚt(Y1$) wȱbuMJ)bA =d["T EDfN0r}\ʇ„)Z̰&C֢Ur:$SHW"hb0lL(-:p~,M#nli(L4_~4o꘹7SWXXDtʚ~KCb=Ol|ҝEtLӲ}i`2g_pG&eM SHtYqG&_N~FLNݦ]#\f 3?[p?MPy|!} Z}]$:|S#Xl_3ec{p'U_qM}6lЗb>] vEX68{]xh,P/B >+ڳQXŴ\[F?_r8S\Șb 8Aq~$oPt!YH>O#~IH.P8j-=qZ=[近m0y{_bEyjҨ{DDȄdrh|\<ߊdEKng"6tڳ93+$Hh^E#[ԝ1 ~(p;^zqɺǒgh; |1u h6::mt&B18QќXkYN!-,9٬QVIۉt+a}Ť'4M@rk+5R~fy6jD(Z*-p0OTdnzbOjMsoNEz3t7ÍX @Gƛ]Q(/*QeA%M*u[.k w4%(b8ЧRIs&՚NKY7N}/i+E/Iu5t( EgT30{+RDiS3# Ooa+԰a -@{ʹKF"Mpbs jtK%}rϔĽUmgFmjhYONt)<+6קy/VDY?rMydW5#QQ DphJPJTItؖ^O!Ǐyc˜s$J9 diFD|7)xL0 >y '{uo7"3/v(搮^ 3 -H@z*hE$* $,\XU/ 6;$ ܠ6/>3UUuڄrM1Y-uW[@6sލa6gΊ=g^ o?Oyya`g 'ި: />[2_>M_~'dey7H*wLOwYdG:cQHM_)gfq 7ñ.%Bjw b喦xVܳYWtRpښ 7D"zPk6 $./-3w\* V%EJ<i$#LFfD6t-v3kA]fvNQ $A\nMͧW~vX38FN#K23F\˒. CZ!>? g=y^MQ Qa /yH܃fgb#Tx@1K־8Zogm^{IytY%YΉa=wq= 5 ,~Dѱ:9N,_ez?j=~ԏYz%;oUqpM #4tKI9Lj'7Z% RCxPؘR`$xSE`VR9Dl}f?MP|&X;)]\@=~G=Lm~:wsr>q#W<`h&9o0_XQaTEV@Cp%a%ȼҹQS3éSب В1C'n}=;$L%R) |/qQ=LDʼnmN+ 3eDo-XraA<'EŖG xW2>'f>7*ƌ:%77qڂ]?lnX9$ /Ֆ#CE$'īIU|T~-#)]ҏ>U呇r,993Td:ޗ>{$R2d/ TT;|Y ϶iwRO݌7sv&^W_<'DO~ngVt^/-+kZ4}d{l_{^YNm\Ee mUs)ҦzsRg;;?6|h>ۭpɕ掭li·?x ԞUC._gǚM}: w0i0'FI"T܈VMrlк]t=OB O6僪J c.%NVɛũ)o%j/v4|DA޲hh(Gs9{g?b,+?=3qٷbߓ c{v:854H?z=¬`)UE~?<>6WXQ\bU!dI]"XDBcm G6Umԥ).jZ%-#|du~zzuWIY )ժ'FUc%k4DgRd K01MݳG @,)*_g+1U=EdSͰ|B3H,ӂ@cJi˪ts1g_21 FG;^GѺV(A%.*+9ґ)IЏ B( '~ GXUdaAɣ'4YV:f<&HIaq̄"o B ldק´dbLZoɹ܊lYx$2I9w9GICnt#/Ym6欥Fe_I|^q.;5/ֶ܄xOG,?*fd%u_J_]:C!8!ׯ40>P ݆'Dt^ R8(ua 3֧ԋC:W& U¼gHo8mȗq[?`Í}>ya@I7B75?ΤR敝n@* m8Me.k:/~NQ˓`NWi@<>e>>EsN,,%T!4Wq̟!CO0=Et=բC~SUӮ5(tÚ _i)72o]h, DU)M y ˞}Ce* tW5!NUB&NiNJ /!cKEKyw9_ * yɑN]hbLMՐLTsW85쮑aXH*򧹡͛4>!R0:N"p໿Z99:w=x?&vvvA ZQ%ޏy+??&YbN?h-_լr~zJ@shăY,άgsd]]ϴ雽=So'3tj@u5/o=2UEjw+觿?G>e@?β$j-Sa89zdt^:y Nu B+vF}"2٧ZO쇺'd 閿W|N!_WΆj#q3NuqkԔ!DC} aNѻuE1ٸPAwZOU.t^WTQF.{3 kKN;:D\NXUe9Bp-a(!5jşL"R4yfc=dZnȓ?LЕ}vq= Hs6ͯ t ٓ^s4z7=nMM5z#јg\I[>bY^Xܚıl-LR>YSetU\ݚU!=ճ4LҸW; 2[%TXҞV,e/pԴY8TYyz`_VItՙWWy>J=?(BJT#Ih 7g?37_U2l$EuR_Lr`Tv6'_pH$<ћSd9dRu#dBxxkBn6y˸uW:֯ IV7_gjYmލ5YM.(דXZ,垓OӟU+ hՏ9>/#Cv5l9GSDZ%t/\p㈟f6r/7ݭiLVt*UGER Pcп PZ?i׊W$gYIwE|=.F~iBUMSh|y͑?(r1`Kث`gn;˄bnI=3LF- 3ݛ]A׿{j%$rr[  1MIB\DQYvTSM *Gg&BLLs.NVگ 0GbI|uN=J|i1 oE*0)M^krtee6˒ p04;QkMd.Q{QP;=At )s1GToN] f)LP!n<ʞ9x[z^i:.-}SOm=ɛ<}Juѧ)!?"iPQ W.؂k%d`9]QI!5k<^ck/tMr10$&R(n)NA\Җwj|Q#YSA7DOW(F49 !A~eÖ!2,sűWAJ IT{ z\aY,b2EUAQMAY7>tzJvr  !v'8ek/ xB/QHljh['֧sКݑHڿN n{(Z[#Cu 39yYy: |] nZ%uWӜzPKFJLDuJ3<FP>ѡA%ON̴~2$DJ".15f%fߝ!a[ cҡt%M;Z~="[>I\3,idόc٭ 0^Sziҩ껧 [G|3K'3; @{s[O{vTC7&u` c S&UtZ~âtX,>dGCPYNdKµIYu(i?H1]^]t%ߡܖKa3*RJ;FRC زK,caqW$eOݟQvGTaD$/C+ "a7߉(XxdOrW,B#z~5'dd_zb%T< ҙ(c|tP>m%O)_tECZEOZ;Omo弔Hѕ^}TH%'E,4 ?ti(XlE[+2(j})I#VvӶM9G' ?jmneURDg%zm9|lZS 9[GɄ9Џ{]neSwy "*J`,5"ݲX .x/W7B̓5S#ے 5m:Xdp_z>^jIcKi׏1ț?= ~k7. dIy:69G.p=󃸦XۛNSrg|"\]~zxFi6܇31iRԅZ"G TV(Xk+>gIH)^LX~_/: {a,B:aȱ!X"҄S{Froᑰ,to%k濡̸lع I}}+¯)ySc\j%S WxH㸠u0΅iOȿ'!O&wڅ|*K')Qhվͦmd!)Z?N<v!U;wX; hQl|d܉+a?E2LlxspD4 O!{:~Jp~=~zS&lq-г7a?X[9ޗn$tα` fR) 19j|NtIL =VR"_QYcF/r1*kJש==#u֌w&ͤ7e87nʍ^fўln 3 W_ UD>&ت\:#k!_:IA'V^n17Lܽ0C Јg슔f;z5Z;(B+9ꡜgI 0ZBTtR"v-{[ZhwSD8]i ԑbѲw8s92XC-yڏ`jGv$'֊j#SbJF7)z} :#4mRZM<5N^~y2yotGx Q'xؠG Ξ왃V7_c_hߪKopT21@Ekj?._&)ǴguhMySC㪤k .LOʀ(W^N=o `zOaf$$4F'iMz Wl̼#8opLڢ.$  XLr9Jج]J0IZe]\֟Tq /կ|g[7h ĿH6%/_g&ZR^oZN@_fv*}emMT.vы'Ӧ{4% ncW4V7gklNt-~j_Be8d'0iFS -(RG;IvBC$P FeZH22ZNZvmr?tDIZ<źow:f1+YH)& J{ֿ-`|Ѩx^sIPIZ S 7TaF>llI{yVjG?lӂޟsH( tоTtdko\-YTj']' !# 7DTH^q 穽 =&ޮDϫK0oJ6I@n$EwRIgw?u..}MH|mLaz0 ?%;4IqtN5GӚa\J9.[m BU޴ Zj:Gj[U)jSkQti RB%,E<;*ISKSB;9,WYƌR3:30#ϬO~@=mӟh2lj xw,4#B{M]GJrQ=|onmQJ#UO-(:qTS77Lhp8gJH%3W7ˊoFWjYTebJE,D)TTɸXE}V/4$.D_1/`KP_(-bxWZ ,maY`1']7*۫^^=\xߑ`Y0LZ6lj #mvRu؁9TϷ'dfq?Z#tPgޞvPK8VbD*7H(՘(E)!|t_D{%L%E6 ̭&}I UE't1CX 8IIYVS2?"~+s*i |gS'D4*xD!:;h͈lQC>!½:ٿێb^~_a5U@ V7vCm_R>XƲEPŁӕ 'B)ro+%]ڴrDrZf}VH^"AԘ0ɍ1qۺќ1#RBcv4O۩?0`ZJZB@h V#J)Jj8m_Z{XQ<1.,wM;A@rv \֪)^TL8gdK,=BFVEW3[@zE&莠Q}3t2Ơza]_"S10Nxt2^8V&8Ge:.m0~2gEQej2ZG'L܈r*2MZֲ*[F~u_lܟ|Qy/PG>sI2W83$HR|Mk .q݉I{$C @t`t]fhS(yo_%dVۆ__l+˲uSe;B.fy9ZF[a=]8W6)Gs@m^P9!c᎞qyʻ 4\<thԙY9S@Ccqr?#E+5/vo8)ϼE#YYn#i͇3Br\e99fѧ*)#T?|} Mo?&y$ήl5=.hа/8э淞JΔ9//> Վ\C$R@u.yXP\6GPb2nʏ#si7=Ӝ@E0"(w^h~)m; 8 XR<3|vHiY:KXt_`H&?6JI˚sOVΥt[!f]JjH6߷E1v90cr}+wO銧og,'T&:@b^D8ZY#KZr'2< dApI7g .pILa_Ff2QY.}ny\.Esܻ`Jn2Uąob?e7d{*m zdL[zD̔/YuLM9[\%SK51G>U/zdC~+Fmd,#* k5 a]| ubUES|u#>s,I[6ؠD I}2VU Zs6L1 DՒ|OenZnF&f]/?6=ɩ%Rrmxjuٝ(e&cWaiKj 1  5>ȑqo=YH]ױ3B V u,%[*Wg"]o%$.e1b7 "18KsVRg\Ws9)o68sQ 㣇6>,xN=.Ďȝj# +>|'_b\ #煿K ͥ9֯OؼXDH2WRs0YZ[Qust:T:&KWc'Zl-6qgQ̻[0%9ALyfRǸq@4:&s5}}P2~.>$ݶm5J=YC?C̢uv:4ZJC?7dQ'Ⱥ\tI3ryAV2ȔtaPfOq$70 gfVni1bCr߭-U+yiB_ 4$dv7{}&GXgc%bـ/HX+-FIy?wz2`$&C_؆YŸ8̝^NVw6\`Ή_H;5"8Ρ]ډu hTlBK#01FKuY;; `8GS_o LODFUQl/+/cz)no*dr? KZ нML6m#޿pg" &bjh;Q+0C*Qr7R@ H&a(LW:%;w(Yps*?ҳdA!xJ^^+yLiw(Cw}˳ƀ,4^B%D>VB\p0ߑme^A![qZI䳹BIhyӕFhIN!AūTNu(+[ pZb .? ab2=4dBmv$1E+a$R?-}ov>]tqJYYf(½&jfU|MX14RLr.XŢ꜅f*؞I sߦ+IUH+Ne `NPL TNpf'"̓ITesΡ%.T&,qF#6a,+J7,.YgQq;og<`i*-DQÈ\#5Pm}ΪU \<dfz6+\Sc6۬DN(u A ;1`?Mn!Z|߂1)KI]ܦ^̔@øI#i\L׉NKi5.wq_>i>?Yg &>]ˁnFs$bm D˱㝠Y(9'B NJP̙,b_J H0EeI(ͫPs:fOIͯr@\xK糯Om"Cur'l-”-FM3Z[}T n1c㷜kA)R> JTtONk|dA{S\{?růcn>2 4뮛Rt$p6'M T;JfKxI-ڔ`'R/#b=,Ej3'[jH]I+U+sC] l]JJ(F]˘~p+?"ƈUK~W9}^_~D("A ],LZ65i&$AFšƢk_ȴZ Yb_冖 &X`iJ_:.d:=u]gr57fѡW?X^7{:Omst8oje LyexTwmA̟6?b=ɋFӼyv({u1 )G IKg\r4RU[M46ۑ( /nlhkFhb[g:Պb PhZV7Wphwxqc8M"7q_NݼӖDŽm4sT4|@ϪbCHj#ʞ| #K3lTo57_gq= ihPI&X،idE ƚzڊXxc&Z.Ϣ:Lh]˓T;dTIFwq ^éJ CADG_"֜T@ }@ !6|6=@ ^ww#Dk%@s C~b4*Fg弯[s>~EDT/t炈'G8KQ>>DT"IUDq/*!D>@UBAG~wPeDA!@UC ? 2'tHpTPe~U⊪OdUABUdeDk⒇)j+c7lյ:(˨ECEj~ Sc#KA })s# %@O 'Ud@EUPe@VA_*#B!(!JST?ns=bU^WUK%=6a&%sظ~xΎZsJ_ B:hZsNq Lә[[+ޞa.kIh@:u; CE@Rsa&Ciܚ9 􎣩4=m9;*#ȽȺv&K5WTh8+ZœI>>sp}uXBx\^x%;Q+ 拌/yTP!(?cUo]#ם^r Hss_KWkIE鳱.C.AaξwY9 xÉN_((9usO]+%ԹPH# AmiR G7͜4QF/J^ѝ2.Ԋz=Ƣ=ŇA0G> +^ }}{Ԝ^r tT`6(1uWxɎt[Ft)';>:{gFs}HM/qC%;SY>NW$<@kO闻;2G~+r `$}kسpׂMs⋁:9 8&szٍࠁs6bӋNSAŢ^sNtM~/:8H)0R4ulo/Wq׋ĽF!|G&5^+r{\oo{44ےpZ.;PuHRs9!xܶ樢ڣFnFMV4 ,F{أI-Aci:|) 2bPJ^KIBW%^@pT& T󫕃Eޗ+/oNEϝǞXƈѿQ*'[!^ѽ2kᢍ^+ۆC:9QJd9 4 h t4D)=HmHi-{M>BXOS*D:)(.*$ Q$TÉyӽ4mQkom ='4K4Rw Z{{xuՉAH1<0KËHcO?Mܵ ub8;/u'}1:|ƜCY{?8|C?9u/3>$L{W-+xۛGr,[cEk=N9P@RR4k2ɣF+A]̚mث5I\PEmmW74+O TN鷋Ѷ[DV5㘍bElFTjѹ+'Yh E%EhL;~{΢-=$:]lT-Q )\!.HSTQoʹQPc#~pjQUwZ.nVĜitيDMP[ j )h=`|+|+̙bSwY}A9 CJܷXh+*.rm1&ִ h1>7x`[Kbcg*Y&?rgMy+E}g,ʀ7!2U!4w&oVзŎZ%; !RqXٮRU5olgtC4%\&ez+OSlw.sc tQ jv4Ht+ᕾ?X *o~(j0 ~7Byok=T[!SE> A|NAODy>ϑ}{;8tO{{ȌcȣFj ne0g+ 5.ɑuj6˩YUAV"@2zbf r*lJ%!U*t>|GN hMw}wǹ'Xvrf罕]DکF:`]w#^ʥ>T&d]=!S~}DG)QsשrujmvVG5i{Nk]nQ!#Pi\z9^Vu\Y`UPVe ؈Yw]X]~Aa`r[jjXn-lEH^O ]i̴b}c]2bλX$g]P}E#o㬣Z_fPPyJM:Y|#"eoQ:zs" q8N6Vom^W;Q{iˌr/r@ +7'oOhG"66s{b&l5| 5^:ǽ;:T,ήJUvQ9o]#AK՞{VƏgp.G]fL0v-MgV{6\Ddx!o7tC%hGOF4)iK N.-aRݝó.fy=Ů͑0dco[>\5zކcu7fLorc{1R<#;ZWt:}<LuBBT0Ջ:V5 R:csZGm5 {]NL1=F%PL( PyPF[LFrgܴ]d:ܥ+{C YdhtYܰHrn%J o"ԀXe(5GU}3;eǥ #H gF ԮTr&CwjӴ1iJhȪC7o%YIZ&Jϖژ& RZHEd  s~JI5rhF]ұC'&HfbfР̪|,pY0[@zKJ)-:?:Sț^͐@T̢VjYl㓵cP&ꄤd*3 ZUTϧĢfr]Mז&2>2SpֳN] zF4/kEx^0=L!2Mz:YG/|2BtvL'zJ\}˽+û=MnR);g| u!;Z=t,$Hɖ%VK ,![f\qs]]=I2ԕsВ+^wT}F>СRs}\0دrC#u4H-Ubӄ2"/rE;EL6fazKWd]Gu&G%WmH+刴d*Q:_ _^ߜ&zgSӟRE^5516Z/97DjZGU[U4oɯ3]w OxӫxZkƧ(OEҰr9q}F'۔C/zE7Kp<"a[@흴RvegZ$Zd`)܄b70վuN6G(\l;rFrlVi.e+GƱPS5iPXVvŭRh,iK̤ݤ.=62ޭĤQԥx:<;D=v,\fc`}5,_ 33qɷey :3`$C\44B PKςrssgTX )`UJoo_z ;jzv]CEY5IN iYebfJ4b|$*dؽw_ B8DD!UUhڿ$[lY1c%4j7r̥ۖmIJ?7:kcր5͎nc'2 X(blQ6,Xn[F"V RTXѼ[QGm?bcjfj"l_hV"E?ŤT'ۑ4  $4*4: A4Q(@&DVJ@y* ! V*E[<M(KE)kݶ6 U#4 }rBMi)@ 0@hFS( GH ZJ@0-jʢbh*Khr*$oKF6ۗ(ƍc}yJJBu Ҁ|AԏPZCD:Jy*@hRJ-iEE[6+sDk:iBCEt)QДHӘ yƍh1#RDE2*ǦkQQccmQQ}56JJ JBB=z@@#Ҋ|JP9"iiH!E5汪TZF6m&Zڋrtb,H`yب Z%JQy@J@"R4-+TD & t ʎZ@4h_H9*P{TV5shr$(4 4)KNiX.j 6'[%Q%Tk6Q5ƭ>Uh hWҢH(RU4#J{?/8Gx)U)tl/Pi@ mJB Gs)*Q3\]I6{[&4k (.+ƷUx1{rUW-TRBWM !܂= T|ைQT|@rд]4MQMyM^rXQK+FF(UE_eslh֊+j}a(=œJDSGG9]" Z=ЁPҭ)BPM(!KH-u*!I"ȏ%Ԋh( lHiкhC$XR0cEh1W2h6lZ4mMMb4CQ-uWs8 =iSJJC A@(4R&4 G^H IJ JR)<_)hS RB) iRBSi}E+ 3&4ZLJQ5FcPh[ض4ڃE6bbώ@H+AI0 밴4#@%E!IԚw*rsm&T_ih_ ZZ%r|R*|RPyą @JM I@lgКЦ: 3h1I"( he(Wv*QbȨ!*;\"FFƱ4[Tm-Q l[`-W*1F1Ƃѭ%1WmZ6dVZƭR )TB=A|6(ѵQ(\ծm_MnZ+cF7tn`t:I(3&jLIfF5BbPE^*x эyx;hHݮit A󴆗*e6֢|;h֋Ѵ&lKiiJB J.Q5 Ѷ-m|*ەƯ6#_ˀiR )N(DtP)E Ppw)Z}d{åZo +EcXQhV6nhxo)B[&J()#kj(Amb@Y,Qh6656ohDX[Eh#hlcFƊZQXԅ W",EchMHAZC]j"hj-r juWoXrQbV64P50p EYj(bVܢ -cFhƶ*rQEErѓXEEdʮiB 2A  l(؍$Fȋ_MJ+5$0Rl(,j,X4^b>WQҮEFgش0͠KV @m/~uFѬѣ JR%#@k66җ1##䩦PEnhmu:Jh]yk"/mr5ōCV[,Xn[6ڌZcFѵEcE۾nɮ̦S&J(*0d{nDBeT`*7LAZHz\Q๨0I4cFI^Kb5$TbIT`QE$`i m`њ!iZO")J -F[cQh[nh6DV( Q&cm5Ec}-[uhE5(FMh5ojclQ4k5ETmFX" W5F[njH7c`4l(mU 1%,&DX#d4pfS\ٕDhbb0SמuAIE Y,F 6,G:jBΘ4llb 1Fƙ߷5zshmjLmFҼkQhZ5%A~5r1Q_ƢwjQkoxEi61QF6oѨk5LFCZ*$"5*62V5_rLWXE5j6ƊF5E7Om "F3(JFH}wMEwhf0)-^.bIS)Rcb1Gro؊"}7%FOx& !A41EQj7 lFph"$RlUhոh}6F:`DVKRm&XքKX)6hڊے&MFbThlV "1?nz]("JNZi) i)ޕW#lE*nhh-X5Y,Z4lj5Qlb߳kƦI"D2bEe$BD$lh 1$ AiBh Mab"4BG,lTQDj0ɈҷzF#`wE"Xh&fȘ6&c>W1lV(BWQPQXر1lhԛW2#&#Rc&hTk&=Br# D-`A`ѠHRQj 21RiЖX"DjI1FE( b-QE1"#QD%jcmvŋ1$i!BEDe HFhQD#)2(7ɘouQQ@ll$Z1y>:x6!AL‘(ƌ RII븨(ђV"-E&Qub$YlS ,E%ň(0QL6,Q@ b61zpOkl3hl2z4&mQXz#X`,kEQhwb؆DFS5Im%EfmTEAQhLb EF#R&Th֊K e$st MwXш&_K`bIQ!b2)?v߹\!bɴj&vj" F" "HQ:Q& +Qj(@UIQPl z ,k ەFJKA˹OˤSHj PM>#,_] hoM{^(ѣRQFɨilh"iu1F̣vh ęIFQhE bzk#CD}-\ۥ02cD&b4FXՍh׍]\H4Ĥ IRRhIC)0z(}u$j C$$i Y-O}t@ -ClhbLWr В,d35+OäJ F"JF7W3O4;I6av]F LE%G.R_EQ1F'(HTD͉nIhcccd㸲kɶ#b?]U%0DQ3L1B5ʍ#AFjb5cdV3*-VH"6@6$DJL0"$MR") D (") L-͊2X6LP&c0J4SF#^.|9C1lF<׃&cQxF!cbBM4dws"%F1]q?Ȅ CAۗ$BRh$NJM&(F5ݢ.12lhF0Lb"XJK$XdcZ2ci4XMR"6h&K!hi%5 F*Fm&QnBBRIh2h$D$)4Di,y *$nJ$QfJ~r |LQA""~I&Mb(ĄX($?pd`"ńh!PDj@ɔw6M$!!FƓIDM1Q2B5LQJa AI^vCMQ"ED[dM,Qp&)4&I1E`,Qdd`d2!(#%j 5&-IIl$$\¼$D4 d(XK "Eͽ:h2= $`$1f„Q4PE6}H=:F<_$*R6 3 TH$& AHdχh&HbM!(M bdcS,  QFۥ(`BE#C$ R d) L̡2"-ʼn32Xc&#D S6 JrIh1IS"5+h&-R(,&"S3h6wٯJ1 %$D(Ffnh3HflFa,a @fhѩ) d)"@뺈I|Qh Bb(d1$dIA&k`PGYJ2#0] JF 4sG߯64;r"*3"$Db,0e &# 1#i9d L(!$i1XE d(-dc` RTlF4 c2iY&أb RJ%(, 0$j,lE5#chLX-M0DD1LBd4n(os,%׾ݳ,$5$D400` ёQ@B `f^.!$ cE"b 0! !t21bLRY `4 DDm%OKv) ܒF$u3Dɓ"4DM4lh4Q3dIBbł 4l!"C$Y d $j4I34(BF 0$Q&E bȆKEPITZ4hɈ&4TfE2E&)CM#$i64$ x12$|9!1Y)'R._nE"1$H|wS {F*I%40 & "2n`Ql@y2f(ld5ɊD`6"0 *f61 & ;d`FDRHBE%"@R#Ed|J00dHhY# BQRbdjR(0h,# b$0@HQ-JLĈe5%h6+QQF#@hl(ɂS2gfL%OU S#3bL C#IdLfa&$}1 Ʈb1Ĵ11 2iI&h 2I>;&x2fHAY)@}u1%4D!5". JfdQ `2 1k0P!WNc%DdIh&@~  )$3LDQdH PZSE،QRAddhD"ŖF!JQcIB)1XQ&$ D&%F1BEY$"DĒ$ \=L1 ( $$Ba]1 fFӖ)L@vm/}B&ncQe$$41XMDH2fR$Kf2RL@HH Qf4$% )"$&FI& bD) C!#L!tM1 FBfF$3I$((0M02H,PPhМFdJ)#Ei( HDFfY(`KRE 2IQQ$a1M BFiLc3cIRJ%)sD٦*@@$c"dAdDi^@C2OJapЛ2(̨d 0$Yf"0(2a$d11 &IBD-#&L0FdP3F2!! R$əD-QF JS# mRI 2)tFJ̊ M>RlIY(БcbȈ`jW"6B(*#4a0,l&Ȗ"ش),P2R@0&`DX4FdlI3l@bi(%\~\J!"Q)416P1A" fY4DҊ ~d& $Z&+] b4FRIh!,hF&i!"$PFR` 3*K#DJK&be$,%%b`J0A4jH$&jC$E,a2PL2ƙh)1RlQQcWˌŊ6-BdJBI]r2Rf "M9F)#@IM)! D<\bQI2&e QR6J{2DHH4D$BD6fFFLTF!RK "5 @FLHf)DBDKq$HЈl@A$!)-( bb(0e,“4 (#(H bHH6"`F!4Q!F h4j  %LlњXHJ!"0@ġH$ɢ0&RbuMM b&L3A"Dҙ$a.~{vdD$eP&& dDDJ7ZCjM%!3DuІ&dfdP; @J4 02H#$H#+L `4ɂ, IfhB`RIfY(FDA&Q4I `٘"aL11dAV I"4Ԋdi2"j"JH4!"Xe` "jA1Hi1"@@/t2B2F !2BQbFHX dQPP#$dA)4R$P2L HIC(K0_J!HdBQX #IF3"H4lXHbB&3)iJ" @ dRfDDj1&L PJfBd3 6" "2RP͊$$hɢ!2`#0 v]BE)2,h/ ) &cʺ SR$ؑDoèLBDI Zi1'5ɑ# DRRdnͦ,^we"12BA$dP&HR)C 21&iBI&$",*)JBMѩ=ONb %l51H$DP&FLI2b2&D@H1e0FaH 34ы&"$łf4% Di),i mb@L XR"4lИYA&i DTI31!S( HOn1F Q@@&)CR1  ,@JF%'vɒ[c(0Q HD3M! & (I됅/}2" $hca c <&$ *B%&P#)d( ")d@I4fMLQRd3Bcb#)A !bI & )A( BB*Bi! iS `I(A"D,@TQSLI2DD"BT%DT& {3"!^ """&&K1Ғc4$0$HjDDBE2@RԚIQa`I$bH 3ё RIRDBHd0#BA3LRR$ԐcFLIlHɢb%ѲTFd(& Dl#!E  dҘ !ۊJ1eq (X)4$da04i#1,DPِ$RL@!JHHfR$LdD P$a LJHI!)$X0Ĕى%)b LDdɢ r`#$X驘!I1!"BHH"DL!1i2$`% $Dƃ05@S! 0)fę e2d$D%21Hb$ddF\&d1dS 4$`0Eyܐ`F039eYJEHX o!3 He cQ&$` #e"K H% č(k)R0dAbfd)`}̐FL( e(ƙ#F# )3`2@!)j 2!HkλD0FJX(HJY!aH fP 1#4!M l$$fQ")0b%0I $ @E! &10Ɩ܄%&R"H@c$ bJ I&Dd&) Y1PI,bbB"d &DPD&M23f-%M(مJl1*J0ȲQI3 DF3bR4dFFXRI#(X1,#3, GA,DЈ#&4d4d@LHfL_q !(D5"L)0DJdFD"C1f1 R )42 h DFѐ(R4&% `a (2d@DD f$A 0#&!Ĉh›4hJh $H d X$d$(0#Q4Qd(c)I)M1HԆZ"`i!D$FD&$1L6$Fb12f$leF2C2SFIDB"H%&DH4I"I4~:0c A2D`L)A! І$ђ4əID04 l(c"`QJ,3D$6c2`Ɋ,!!2f1 &Y4)($&DĊMA$"!};&HL(L ! 4dDAh1 &22D~;Ȅ`DC fD (d bJLL"lQ20ήd،J0bfafM0IbADYD%ņRLM6P02II AE`3AHȊS# HePfH$뤅M4 2#Ȧ@HODLBdI,1Ji4$4dRei14L0HP4(c)A 4F0%H̍?n 52dEn2c3Dh R&DYB"BTB@*I( %(J !4И216*&"X h$A!JP)0 &HdŒ&b"D)20S*`Y&`S(!҉IDb,!1FJ24d2hI)F F"4(ɩRJR0&I, Pi$${d2A"LHٌ2 3Y0c11H `̩,F4dJfQ R@@HcLA@QУD( 2 4%hA"QhDh0D&I I$cD@D`l "LHPRFY`w$ IE0D L20 "4PI1%"!R1bA2H!a0M)33HɌ&FAADHQd` A FLHICA$0iȱdҙ&Y 1`e `cHXLJMLȒ 4b (MFAL#lP$D$6 (R3$(!&D"I&LL7 #1E& F#(0 2$%A(DĠL$I12d0)114F2LBD 0I1F6L@c"+Fhi D4B&l,"e@K DLdd3i2ic 2`$łFA (XFb hJE4Ȁ,Db!\Hh"Jj Rh"Ff( H"P,2D PĀQdFLcC) IhH2 bY(4 I3#0M#2H $KI a" "E2K4)D$䌑FD@YQDH(1/N L@IDF$M34II121S e LbB  BT! B@D014 R2E"A"dIRjSbH̡$&يlɱ! 32L@4 # )LDHcb S3,Sa4#0(%D]j&FJ 3P(;Jm2DX]d2H12šF) C5APBRSFY{2S i1!yM I1J1,B͑31E!!4CAh&Z%ˆX( hMXS1(,S3 3&]I)(JfIFH4@(E6hcDb Jfhdf4hLLR# DAc R&f(Ц) ؤ2$f 7w0ňfD$bK$R$ Fd"e"6wF0&B" $4`, 4S2f6"&L4d4Qb,F*CC-AȲbI$Ȉ1bf2IP AF( #"آMƉ0jEB!d٥Y)*dcC!HaJAA2S@PD P(21$HdFJec4% 4h$Af4DH͙IIhF2Q4[%M@ @!2̈%I$2dM1 fFH30e2ƒT lXS LLQڃj2""$ MS0Ȥh2b, 1LX4$$d@d!fF%JRhM `Fb"A2@`6 hM x۔Bd0ɦbX0QљMI!RLLA" 1X 3Aj"@HP!I1$XI1Y$2ZB c$X$ "d`h4A $с#LR&I!&01fa(K310"ȑAY0`AL2cwuHL@26fdAMc 4(1CRAB1j(1E,I0A5 R EɲBFdDa&bJ34Id̢(Ěda4 &BhQhhBIL E"LX.s20P_wg_QnE@>w">PiE|`W`ZV?u{//_zgMp;/н73:(س?M%ΎbU#{\@jGj 7tqc·BX?ִH1D ۏ @>^^0b\"G^a>koҾ=YvZ_Lx*ChSC( v7LKԐ(a)b6$SBv*m E+m).#J,+aFk|r? #X:5SA\"r 2PMtd f]\ X;_ ci׽ǥZ#Mh'KwDnfPix Ff60}IHчWVAbAII,A9z13u4<,WAE_8"%m6~e<1@{0%bY21E$qUˢu2. ,[0@*!lIHcYC9ZO AДwǙgF_@h.R;dZp>$_{Q?=uت 3FJ5@E'_S!T e|>VKa\}2eOs5ױP9xiLQFPg\y)ȗpó+;wa)Q u:1 3KF! U ezɇ#?mګAzi*UUԙ* v( &pgo~4nUO6!^]~zGn~yV=?x8QE3Uϓz؍*aii#*-IEͨT<K7Ug6Hgir*h#`#Y!s ߔkFME`(s)M)IAA+M(4jf&]QGћ;sDZdd埲aYљ~G.ҊQ@ʫjP ?onE };<2X6vBuſ%r^x[scBsCkiu!eA%@X,@Re/. `68:) Jãi*[Bڲ+fqD-/]w9GG|׋%VWc.m="ak1w=g,^'}Ƥ l6 DJ%2 WmV?LkRÍl =!,*t/l/)RCΖq8t"(g*:-YGH))ǙIv`hңԗ`zPddqIǤxGr!)NGu(BsUN$E ajXGA0@f#i&Iz#7.18U ,vzj?^ׁU [lm vR,ba» ªVp*#cW];>NV-x(![Z@26)RI>;ҐFgNi,o_yꮼ nZR>8R^_?L)R|dh< GF: P0*oȎRJ,@ U]3(5ͮs)5 F16%`J72ǩcjO*@٢0cOqZPK̪~GG3TÒ ֢E*A)CVL_eZAB޸᨟G`ED/`RLwDB0xShǍGo 'ܯm9#BUkƞ$ ^t(PMp>x* fK|s+»ݪZ;05g5$`C!MLJetdbb82r4RRLrm`~綺M,~oYOz!eKһ8ፌL(a6O~iWT&%(b£!b=9P /UiH6QR`ދ swJpmndqx/cpo/Fu3tiL5"-QBV)\;?^&kHBdB}l}S}F , & ubS.U\;?~kaYfXLKSA;K)J.RIaSu}'ik>gmZFm8?3wN,kPњÅRpE5i (HJ -l%Z)>hQ J2 I Abmz@ l6ĝV*UQ"U%P 21U3gq8m`Ct X3L{c*߁0_J܆<`& )= \oWvCӒE]avG$vuϓtk%VD#iˮbJё~'ym84j֔Ԥ(z- u4ʩb41r6ci`W!l MN+S+z7`~O%\a» J]J{k; C"bq{HKe?yY)>u/P{SM4(go]lbHjšVu6nD|j&z{ LQļVa7?XZ-]a+ǘh%fLz_rm^;N@Lx{\xrh4opq"ڋ/shحg-͆yJ̼KbPME̺Кaң_Yr־QOD&zVKsqo+H Z!ejDd̓y4tJlkf5Nmޕ|cA)*ٗatkr;U lĄg$IMRU۳# f`}oɅh 6.r[)g!܈U[5,T0zڕ +!,/LHG}tS2e5>߄ ofteںAx; JM3 Fg-׈ľ;k6 !Z Ph'e"5gty51j2ggDguh֗m%Dž\̷Bu5j;&qmJxd AAr7:я/zlYi[4g leߓ+ֹgV7!%84&0v/"I!I,tC|RT}.'MRa(\ ``*˯z5Kc@yGL= *+//4JC_}aY}ڳ>{">j~zݥ0<1=&bgJ/\r|dbU]Rhj|Зnimh&Ӆ׏Ґ%q.4c-lt޷ݞ,+،5wІ^+Fj%:ۍӑM.ZӫPC[ |$\PFѮ5Z/oC"p"<_Y:eʁ=І bbZ/s۶ȸϲmř/[YOUj 3jVY:yޗO7Txu}Zm&V̻k@ZdCu= %.=:E1G=7{_q6Q~2ɭ[g HR.)7կ{^_wO$.LQBQcz :mR s=F뗨}oIۺa,Dk)x%:`G*(?]# +btFi~.{hy 1W}R"7y;+9V]Ɍ/ 08wVcmDfqT fde`:MWN]vE75JmڠprzM u>]:}p5mt@^֝tk@o26BjW4h]>ujFqCcHȯ\!Cb53DAm]WhޏzR@8\1%P?}3Y5<+t_B.k0UuG)Q푶ʽns. 2F#e썲>wZ^bcr=&kGngb- 2%x!=՞4FB ?9qtـԶV{$[`D+| wpFNk0Jry OH8s!-F3{]ۺsx4+';9FR\kŪ霜c|'}k _f#0W|qJ_^dĹvSMiFa @mI4Wl|IVng)K,Ԅq><K sj"Tu4hm9=vg aKK4TxF\sO @ڕLhtfj'"(GI!k:j2KD:C!,ަ ͒%tZvF:޳:M 3&u*0 8Os lեYG <lRÒRk(] ;,{jG[:vC]Uz銃뎦W%˾`'__y~irPoJu O{zM꩘mWu_U'hSn8;uƃht6O%*`׷Hbc‰^VN¾t6?#K)26ݞ36X-Fvl&*%2a7={>{atӿ'_'P7i 6bgU0?Nʊs`wd@荚6j =;Lh%h=qp4UTīgʰ @KXuh[GBۼ? dq(֟4=j huzHٯ^BhES]M\LRZNJrT]Z8-yzs3/P Y^+mk Ʌ$C b&5V4V֭GݲIUzZcR-!!^-Z +L*m=&B؋v`m@Ⅸ7bfu+#BHDLAS"lYrZ2e!_R# YdƴDA Ƨ&+L^H#ιkݛ՛J絺WIװ/$:p+f;XShUIQn0\QXKloU;J=.wdI*`B )4"g*;AYsM.:<=h~wΨ8j|m1RLJcUB*"i_U=7.Z-9]?m3 ֽm75f|, x5׶D P8Ĕsmtv1Li(Niw9(ȅr1Ee W81gYJbqvPaPPaXM&>G;UF5 Ln4ΨtNTwf v۶ lBǛ*kT A\j981 (rNjE{׶(&9%z먨t5f1ISlPMn]-`< e턜: hG%Z08hК+WA xc`DV(t[ vnJ ۞7#[Q485$ J쪚fT]l5Lwef e@(.U 4 *aTAK4_a7Vc^Z5M 45:=bmpleZ)83miSW 8s`߱s[bCuJ ]zoy(PAc'^*{W Wk_ڦh#b V&rJNs8tQ*$իy%ǡxU+TEO4,Qk#3n:r3hoi<櫈Ӆ[[7g"K:(LӕPU%igi!n( ԕT#9٪k>; FxMa*F+k<)eh-4Ͼrgm I:Ȩbū\31춥Bsz [,Kp~t׊ӹ-F/E>|dD1%4j6"zY1[&T%AAf1TXSY˄h[xޯk4d1Œ-l)* -IR %sITvzsI?ɌJfk:kfFZVq2EUqg i5bqM`7Л(Z5~y]MeS|J5ߞb|q^>2Nw_%Y>DQ-hZ$jepB,K)%SEUd|ˎ4 +1*63SIu0/w<߯ Ƣ:}91aWC[5&kD>s Lc &v=U+R 7~0Ԭ#u94;D'PCTv2z9l]gK G%N>6C a/no av@V,>8V$QI@ 0IJZp )BQJdLrIf]Wƫ!r)=0;pw:T;1m?jk4KbZj|t'Lo]YuHD9NzAb_ fZ~<(k%;fǡuz5N61Ph^&%*7N9'. `&#mre7f7~t|>4#lo{HȓLPfU.kftvծ{~#D x_-7>+m.cEf6u]nzy :DŽ˕@Ձʪ9MMf 1H'Jo2^eSƋJEO};`zޖfvs5ǦoZo\g(8`PXة;7Tf KIN̏nݚ)΢ s#7y15f˜4=|`ҙ^- Vk4KJ'Y+,HDq]*~(p gfآ_2ݖ" 0*o6;-!n^T; a0"tK߳xÆL+Dz}j0ITҎm=V=c7Rn̑i.76Ad(N)QjK3XT[Y5% E?k̟ՠ4msJ v"WiQmdFZ#{ӟ|u<{}vZG.6BNO±Ηt[?1]3s #R.:o[WӪ8u͛[yNzgiQcfM3d0p8sɪIbzidF4ܵZ]#aשg)9G8뫂H۹)L h=|ظ< g,1xrmy>ǯ1{q%o%yN+}2^)\d€$ %hwVAv89HN\p4@[h"C@2^H4:M<\ @߾Z37Kzs`L;P*B't6G/L|*I"ڴV4r #Z}UTE 2fsۮbjnl-m{bPQHZ|shoMX2H${jf'<᫥@ĻtvLesQ-(W7gKO'&.]GSK.BU哐RånMB%D㠑'SSD7,英,NJN:$ўbpZM|",LѐZ5v۪s,2)< wSja@Fj_qw_#ߏH(+YnVaObLySKg폡pQ [1g[f㯯G Ÿ˾g=gXK ԢíHM%P^} ʅllS0L,NНkc”҉4߈ja~3|%m<^)ȿ4?*6QmB:#ws zQťJ6fC \t ZB5o4ak/VEK2ޛL[-,,ddćNܰo]i`#C za15br-VH]ᛛLqR};f=о{_?*ig zr¬׳\ԱzFc>Li~dKLV8r1%i*]G[вr "2.PߞtC~R'(eb Tbן S>k@s3;WӪ\CN:YlMd]5BGnʼ\`&<|x|dkx*x 8c\i'}U׎~\l)Dׇ?9\VWHf4~5[C&cFQV*3=oMC/gpոFsH 'm˾3֒X|P+]-JpF QME/ LB#+މa:Am@5k5oDpN:z5kxzUf>mvsӒoLDlY=b`:PtU_;>N^/#kNT|ȜUI=K{o\8.sj C>WLd>:鄀U `>Az7`J'eÄ80$D9-%ḁBDH_E@N6ESG)N]o7&^.mW[xթe ow&e%Dٽk'>E=1ڈ>2j>^Gzzvj4l(ϲgMǤ6ڿcFemkw:0-4%]ّKփh6XpOb['t#>]ʍSXH K`N8;whBHKB1%ATU&݂fZAB֛AD/1M=N2 O !CIxqz{0cY.#뼶g:OuqOU:EXH.%$/mNsD* קI4uw=jv|k=ǭ9_Oc7-s.bV5 +n)X]BS:-Mer;w:X%5c1%^LQ/dG(]Zdyki"i#).&yAohL3%uRҎjX0Ix΃ޮ$6C\=ZI*޴2bڳi6L(>#E/|nf B.i65Yc6BڼL fͣLJUTMj<`/]jٲhŽ&T W0,xKёU,A5I(E5.嶷jtcz~=#pimyѾRwwE TMNr{ UW0ƋGEhQ XEjMV0";?"*5nM=TZVYQ ɉ}6u[x[̛"nNt*d5XDr)rϮkIy X+a/ c!Wsnޔ\oH+[W^ɧ.JG):5MlTR 1ǏBKg-7#J^zQsg-x7㕠uux.Y v9K=G5 aR;XYn'5ao:?<)*kYFΒEj{Կ涭'n"ݏR0 zfJ-J&06xi*<潬kh[&e,3b0hxΛ+\߼7zj;zP7.Ywgx/ *䊙huDG-aWS;ɬHl Ѭ&CtmL B­kzaSURP%R$بbBFlUM4RH %lebى jeKI$vpoV9IX("=1MN"i1F:G: @@H1ߛ+J uq4|Q耀!QD@>sPVIgXZ[]RSSQSxat r*RA@5B$RIUH%@ ) ETIUh U`4Ɔ` Zm"Id8q@ܢR z<}uowP!\ poDM_K ^J U>y}@fo՞U_;#@2Cl*kBJ(TSCR@%%%AA@(P R"(tue5;m@E }2ѦLBDO,r GV6^|R慉P(@@A)H@TPH*!P)*PCBMaхZ T*(T"@QR(@ RUJJ*% EE$ $̀!UFh8r $JP}h )4PT&iڻ|(t'(ꃰ"h&& L&j~TPhh @@$IJQ) Hd 4b @h 4TDLBh*~A=M' 4Cj%"(5OSOP P.?A2 ҄t KVUU"2)QT,-L#%*C4ҺreV ŨY,Qe XaWH(Ij\,F"I8\!ºFUУp A++9pN)1s"S)*$ ƒt$б."()U NY$VJZ`e V-U,PTXNC36YsU-ffF-Za-B(n.uȻ j]%HLhrʥXk %Df`K Q%Bdi %jD*-Ф(YPO+̪#VdeR -:ERR"T3@ӑh%;DED-RB$C Z饙Z’,K ”05Kf2b0HZ&QI*$SI"+Z(NfYFU 4ZVUYYZFSIP5( :ʰH4 ԭM, UaE\jSTDT$:JR]eKǻ:ufҺ ,YhE"'C-S`*EMAjlҺ%RU E痡] 5EJHt%YgN%iIBqsp؃8DYZ-N(FF$sWCT15!5VE:IImHiʌH Nr ! LA'DURrR)5I L$M*22՚EM0-@\E3TZ L.V)!ZDT$P&EEuLYņ Wi"Aph\#]^!aT2(UEG%8U)b'sn$Mيg,Yeb$%UDRt!KCS&iQ"U*,+l.$wE',rn%F8r$$5PLi$T*P4LN_qZ*,="$ZO0b$YG1MPwKdP\*jZ.v)m:RUT@OQC2]\#J TX B+)ֱjF"AT̴ULi! Bh h)I*22-jaJ, %J1a×z9ȀD]ۦ2gcowSaYi0ӰQFUʣbD5Kun(u<ޯ=\]w1UD3v^wuRV^=ePpsϷ#k^. y:UVIeg]\w/sq^89(srBz^wrxsW:`2D ˦Mp1jr4m 4HA`zǖt'QGr(z%y&BUxsy<ӌRս|5E/N:!&v;c"V1mRo5qwt1rȊx9^}hKe@hS:DVB9mIDj Vj< Q>o]ʃAxN_sH,Gp s5|?:Br7PQ6T*a xJծr-y*2ǴR2 V6ۖўOhrB*c՗,Zlbvb޲0R.l(p,]+懜-h^sw(4F+hf̯v\js\]yZq (!+t A(ZX|OV1HCH]9M8 ̈́t͵,9bm?KlDX]"WYả$ S8RVM]'* sd aI'crh&9 2(H<'L/8,EgPuoG=0HJy&yxyԒ< #mgBs(xu2%,h+htrN~ލ9 et4k(nj2lxkL9tNHHz9d(Tb#W"Y %u\+3] QG`ThOWm{躖zaA183&mռK643JA6ԓE_Jsh6NnVM"@ߗF˜[l}alһd\L]vׇαioSucLqDQAjf; AGB1A81Rs|'X֕8]^;.jߞnI-Rzxu-MCAj.U3gkA O5YHi"r'[1z-+掲7z9$NjفT:۷NLGEf4ĐhP\$MXĚ5֊<]֘}_]oHƁ=jۙiٳ#Lu8Zn*DD! ٮGTP "T"hyahyEDŽEi,@AH ocq vxϓ'!g3HS!",{FVx^O>]=O$2%sZsy co>6F1S 9phLPN#8ÓIWVД=3XO͵ļac$yib=tcòCթ-McgA9OiN9l*+cTJ MadLX`X&8'Ƙ\]^c_4JRse`ACN'N(Oޯ]~wo\PnAD2 FNDKGݕF$6VäΑ*ӻKG"/t{.OJdsEM?{(T|hqZ&y1pg Qog{$x;GTGCnDbĈ> H)]Y7 'Ma'4fL,`4u)+QSEǠ=eNLZoUs*"en#x˻M`}"pqƨ[XkN9xMJ`[!w>RтнUMq̙4܎;c$T'c=*XW*S64՗F4NWj=,fۛB6ܮM)(h:LmWi 愹pƢO%ͮ]Z&<{?! ߸\cnĆ@K9W`Y6& ZUPAsQiH.rSkaHu}o'(̺t*9S N?D4ȚgusĵzB6ImQhj*]x& >GЬL\)G8^Qx-ʷgbT쬠Zo&˜F1oDSWR*S*|_+G{Vnʌ$1hQLJ" R N?/&B셰 yI Jډnuz$K#n͖RJh}r˃&p˻lI.,AՅNlpW̶! Js\{T)tѴОtG(ңLRlUUfo;$ }eĘqmbeo9<FF̝Ɔ5NMy5T:#׉D4 {xkw=JL^IYC'ZbtSj]% 'vzʵڈn9{.v:Vbv壹 ۺeOV\3G [+qWLZvp&/D _g6NнgU=W,dN6a^Se2- IUd*{rrr a׷d=b9Ͷ L]j)ێtIedxJ9F?~Wz6#BoKdaΛeoY3,nl(VU;"bݝnJȩaSm5nɓכNǦ yL"Ӻ5Y_G9ޭ 1Tݢިi ) %o3P u.Izdi:>^vMw9M_&%ױ7n{yoRK,l˔JA5ZIJlec[np.RU\W uN%vaLɵ/d-%ͼx=p!&;.@:_ WEI422OE Rk~lQ8ݭ%4BPN!"~' 8\UynET]q;]\%qԏ=7]|n;/ LDs+|8ԑ ̢ܟ'E#"B0W2{_Hi56eGknNA&5c1kغEݤkAvoe9Ǡiȳj\Tc@E33ӧU9;)+5||9F"" wҽ uw=9E/W YTȒG""9/ $Z(&'8{a+w=-нMd!jht%mYLY&"\%̗;竻<=q/VX"t =wp_͎thqtG1w'QV*wqOD2w\HekiǢssժE*T@*ߨ 4tw=z8xI`N=ISqj;O p.p+=ŹSnp3ékkwR)*w7GE.Rȵ}ׅD+"H ]76U&Y6XUXrU܋p>Yseב{EVu SVhfҗ.Td12aBQ,"Az lX$22a\eԤjE Dh?si~ w6 N'*}{O2"F,syҸG{tYVo;) 4Fa+$0+R$PQ9r)S@0F=>? IRWnJ8^SzN{{/<[ݦzܒ{E׮{МC4=p &KI,_ Zx0dͪ.>|dtUdžfȃha{ P~!uWOMuR=V *"W^w/JqEGW.6v[.뉨lwT4uP1wd\qhu=#u4wq(1U.yC޸rs2Cs.@(pD*HssH*@E( B۲sDl+O H^B}8."*֕ᗸJ[lEPʍ-T[7\\wq ۸rD-$sqj堨ȣM0Ke+!.VRXQ!cR(h;B **+rŦmq)uy(ZU W=}HjAj^.5ڵVq9ZѴz=Gd}nb܎ԯ$R}ϼ+[ղ=\9EBM7$$!s6FӬ6,mFEA٘{CKp 2HLBEټ!mhYHֽh>)/E[2U.]=GXږBzlvvK:r(!y2jMt:~g~Jc6ahXEأZ;0rn;UUܳbJak QIJ[xN5:WbBdnICL`߸#()E4Ti<! K\Bg6svDnIřr=J+(NȊʢ?g 9NIXC!7&P9CfC.+vZӡ~< ?%/!"}< p?!IDB yv}.BH,ɂeaBb")P=@瞣UŖ\5ysa>dy\\;ELcM hRc&qծARot_Nܾ\Έts/z}RQ,d+%QrwC$3C7sy9p.\fn!|(.*/J]p_ߡAUZp[*,˛|])4/+_2/+JIwnD=r_}d@s @F3ٍpFd(]fn]ӢLB=}qĿH DwӽF1a/X3o J&kvJBd}D@|Za% s3 )(3ILPv~:K⪄ }g@W:#݅QɐAG!M2DADDL \Eyu"'_W~տWLM}Xp]%"I޺ɹTDN`RD'@=zR$ jw+r]*E1'ѧMzr c.lF^SO~ő{P)ݺqΐDr/1_/s_-۸ V;ZKcū#eJ62=ek.gYcݶr?1a[9#LwKW[Ȝo:>%YiדJ=(bTy@@RYldli̞aT;Z-t]PӚh:X͜^_Urv9'Wz'xNSLrevܦMsTl|I[:*dXq.ڵrN1q[|7V\}t{uT!mb^Svdo72B:U9su.=yvZp䫬z);EMNǺ4fdn(JXnR8:4ޓY V̈ Nֳ 1 A hu53 s>'\C )&2o>9eSUoק?{Ɯ@=;>;j~~=|o_񾓞ْ/rb>(и+u4Cy8s6{3 # \F<ƌ}y|ryK鑝nϰ{FMUW^P_GM~ǟį>{?~~;|Wzz|N~[7.V>7ңb}N9/|*|2VMǿQ!XCUe׾Q܎ߏ+]jwru>gnb{#ycJ ;N߈][~z&GZgc_.G 'mkQOlǟ1_?^]丿oi9;~ǯGqCرI9>:}=#Ƈ$Q{^v?}jwG㶁 !Uo-v>c<{tLi`P[^qƽob:'N_gozY=Nəxo~Nco>;r[ퟯK 롲Hp4zb{7q.wnkϋ)թhTէ5Q$i=#5nAǟ{={gO=z>c]>=LI??~U_1=!XS39jz~\ɁG^ݸ< 1֫קRN?Ŭ}9g{qU10ȢNVXROَuY=?+w9"wai9ݽ" (r#{8G QL~:t27 0NJL<*O/Y"5'Ӊ뉞59XB}TӥX9)hGA]ɟ]Ⱦ</V=@ S ! Ѳ +{1ky||){1}R#&a(eBhsTM)B-Ő)L.W"j; !zpI$p()NY*ĖwmڍpH"dN8~iǷ_>]wu{焊ˈ8=Y' k~?6:#X<ǿuNj#+`7ba&dhA͈7O 0ߴŞ^elB s)Fv8BZ\FbzU] pe^@iDk" *4I qg̮sIœ 8aϋri(judU1zKz㬹/n:_^Qɉ^ߏ6cyI0mH)`әaQ:" >{(,CԖ O9Q\Bބ3@qv`2 Zr8]9[;=%!\Jd(,_Gqwѓf5bGqdkypa$H;dOQ}XcIRil9@r)·-&ᝍvݓȧ֬V뽘ɂ:" P^Q{`ǨmNG+=y6aL''ϗF>mA"SXgy`]^ ?s~އ}bc8q?cXh6Rc3w1Ag$.?FBZ "2Еa:0d oXflf,i $+HbZ;Ȣ40w5\ $s`6$y5ٲ֕m:ƇDW[:0$Ԭ#88~B6oAIZd ,7HbHcyݠ8xN,R]`=u=#z&6E\>Psje"ؠF`Dұu5jN3c3`Ęe8z epFFc MpQ#tB;^c>:ڔ /`tLX1MI"T&!)-cw`/ktRauن6#PBID, $e-BtUC24MUɇ6e8ŬrJh}WoqzވߋvAw[du҈>1/ow:tJ>.KaI$! L&o5 w_o'21(צSUrY;Y%叠,d F 'QL7Dӆ{*F֍Đ !8"!`b8ܔ5t4kT vf<~8Kzq&e`jSm !Jk2\ 7hpEAF, G@Xk*Xa ,$ D!\S!p<11ӌȲHv"AXjpdZ>yMN#c4@\#YM#~|As׊sc*lLl)\K$ A3: DW=lBP̐md0Ik(po nHG Ԅd=^g4``E`#`2i !T ScD- JY,=\P6 0+ł4$D``G !I^skҞݻDGoCX@C 7PPf1T ͻ r?v2ـkO;KV,Mwd) EBlF'WnL܁d㊪5T12@$o(Ë<;(K=^_:rzN {B' ;+~RP$-vdtK`w-Ŋr{6"s`{΃;x `0 IPHZw(O%>cJVBalB?*Eޥ;94{htKE ćL&u߀(Z Zpys"bvP̙˄qnΜ]qËf9#BXMIJqEA4BX5^m /=n9AC{A2vhߡQy/ GD'bNJysYi>9e[#0 j^8(Q῟goU (@߸C|uth|+ TK6مJ9Us ?hSJ~)^@޲zCM*FQ:hh94V٤n&Z`}l@^O4BBmɟG!`9z;Q(B9TL*eUGTo9G9UlXMTA]rҪLN8΍ k j6un)StsiTiD6@!TC0(i=ƹ*b (VpN Q\WMliM"쁹SJRrG_0y x IˁE`o-ʣ]8RL8\6A(WțRP9Nj('%4Sb*"-'<(8:7yyxCMPi:It(#Q;4iTiAiZ)tRthA(J4P R;"ҭEsUn[G6h)< {̆@i;'d)>tǰ&9zMYnw`9qyIS>O6NL?}CN>wלfba/sRzYo9KP^I+~S{;Ƈy$\N!+YӔ2<kwT/yQy"A=] ׆z"9Nmx Ҟ rWi)h9|0i >8zܔ!t% /|']G'e)H$ҡF%.ePwA^JwDTJP3R] J&ՈhA)(hsJ7%s埈v=`p)$J SݲtJP߇5_UhiP PO'NIKT/G;c 8NcDRJy҂P q4f B.SB Eymsl)Tj+ʣX母nEAh+b4}-Q|&%)X)J&9` 4ȷ#QwPU͍Z)wxP jP;# DJvH5B0J% < B4!Cj(չF&Ɗ664LJi˒0:F GҕEPVNv kc5<.^n=UahJ"N (.wpt =]L؂LPmhce d(Ut`P)TO9G@J*RJd(A4!M-S@.}|U'`Q!d{,հre>ulrJ44bԨP˂e  V"#4~ZyFX8mHhP3^{g.kv%q+m / :9GGka+<ѣ^>%>={V:8@kLcfB'̏ P4i '|=Jw|ϛ!AC J nCޤ}9܉s( <#p;dp1rFH+>Q"\/uLf񑜤3M㴊qFMJ`ibsWt)C UZwWZ7*X~i涊=yc[3AT6=}z! ;01 )#q!こ`_i譹3 s,#``kNm0H$QY#l@eѸ(BP]/^a}{ϸOןIT ZT h 1i4ݻSA̸_xĞ^C Ԝ(wsDj$ xxcN'2cL9؈̺S.L|giSJc@|豁,o:ֻo8` pqI|fr$54@0G-F =ؘ}r~`ǝ4J@| :4FѢ lQ,.Pa\U]0H57*B`MкH&NyM]]q2HH28$+;A˜w5B0(%"/3R1t0N4 Lomt7fp@b(P5@A+l/&|t >+w=tl/}cFD&Q (k RC};*p:YNO]: HK-&m[yWRErZMc[rѫ(9[s7&@Cm,*ĒA;ㄣ Rqrp),b[Ν `4#< gͩOU<5׋q"Cly (2q{)OFםĻr?ˑŔ-̕{_dz_B]Ui&R';*"?;ÓF`I3-jpXdFLAC` RBUX1]QOyǘ`|O *0 D >)("m:z}A4=MU@&D!Q ES _ƃ[[*(RjtRѝiMSFՑeY3P(VE(Ҙ6hF0\IAa0c9V D"JBKA# js.nN]3RHIF5#[m1"k1c1XrhZ66h4TFȍVX-ͣn\*TZrDmrRR Kaj-$*U;4i') QA(@45k;dfh;YC)V* .]Ą:ӤLTHkJ-35ݤ#RP .1CJG SN.آ6 bmc;ktTٝ4$Bΐ)RhT*w\Vt(W-s()-kYXM5ʤ9ƹZcmF E-rE;tm8P eб-@h]RT256sJƍ`JV35n8HtTҔ*I*. ʠ9.L̂vT\UV ӗ2"kDˉQ(18˶] IW(GwXt("+m 5ZZ&YIsK]K6r"ӹuq h Q帲TdA9s]TR,nnj(H$ڎW:"݅QQE0m)q -ssFe L\ v"wvҘ*]SPaWH \F2ssDe08EΥs;9\5 "Ei3;@T(Th;8S,]+-s( SJHκ6K..EEmh\`ܣ`ŹQEɴ7Bb-h.kqݸ&ӎT$a$u LѴ\;!#DdeUQ"TU NJh\" 2.˙H"e6$S4eC5&J38P.k(5]( (tavY bv$], i1"$:q,Ü]ݗuqNUіBQ\L *"K%3b4uvBPLbvDD]PwqDC,ws Y ,\M`9%L%"Y#\%:䓦pF8Y4" b\$`:e06TtɅè 4&˅աUhIQ*.uv@&LEhQGBY 6h'T #a)BtT1dZTFf*CIB(ibLbpl(TZPYjW(*̬1r5˄Ё"m 9':*]˝naQsrf! F:sNvwt,&*ەn8戙Bq!"*PؒpeA&3tΙ(#b ccrvvNn\mq"&$"VeY]JHMܶdHW#5aQXܻ0(e&DTҴ,QDBE u]͖mT Ła32.Fj'dW#ӐW ˆDQJQTD!h"\S* H4 FR[ NN!t!wn݊;uاus 4C$.GI5wvNE4eGeiY1V[,k YuXR"&X%AHjI$I,9VB!C(̬Tي4: ȤSU8*ur%2Ʌ$QENи;+cBl Drqú;$5*(˜23:\a]G#cdUʺU$SPRɔ $rm(!DZ jABq t.9u38e%YFhe&hR̪#@֡Tي,$IDDDa:+#eHJr3A#L!"h!qT¢ge%8R(DQDYm8BLV&rZ4ҤS$8%f!TQ$dESDd®Ⱥ!Id\S0%p#&XjtlȡZAe2J# (܎`77R *PDIIdZQ&J*DQP!&2J$i;YmsEIK4Rʊt(B#B IsMXrR4tTjYJ[$Ch4(+F(PFBe e"g-+QdF%\FE$"PQ+I)*6Ridr$Z9r&2)9b̭+EQt؊J1NXPJ%&+RQUQ̴,B"!j҉&6ڥEaDJIi&RPgThDFpC"EI U!VUm,jQ(LU[2͑M I[j 0LJ$)U3.%Dr24Nd9 "Ab,J9LF7sDr૕Y)Yj'Z4Q%$DTDCAUt3V"Fm8'TR MSE#2Fr+g*CQbTlRIfV˔*D]ERVTJ&PbX%Yʉ # .$ppNF:&Er-;]p*19 ۰V30"fjH8乎uX 8XU,eTgfr*Ȉ3IDU,Lԑ++PSP#%S0BZj&%Kۑ3)!EE5$%DȩZ˄Rl2dZI hFAV $PQgshdd.MC3JHt3 p:Ȁ-)RE3\$ZDTAa&a,IUjsE(ŴP)h\ 摉вZ uJ 9$ZEE•'J*˥i`H™u NXRZKY,C#XK6Ӭ3+ ʃ-,RUTR$B"(5qhvrMȶDBUtQ4 "JHZ&C2Yq[B260Q RX[,3-W\$FIAr HrP,"(,BM3"""2Q*U"Ti%EUQ2jE*Tȴ!"9r˚iRUh!TF$!,T I)21 5lTՕP* ,ȋE5Y%L2Tk$3drtIu݄"3HjJ%()9!EUS(N,0SNSdm$KUI.a*!RP""aeMB+'Te$ $4X"VYITS4p2uȈ5ATVR&tZJ"2.UU-CZL,E4TRE!UЂ J%R!]Z& lEjjij""\($TNdww\Rb9t'6 !T.au"j[;hFkIfgJT9SdIӊWP'9J$F-E$Mv99:λrL&!9\G(덄ӹ MeV"*U\̔rHբuebq*I6WeQwdRt$$ws9 !VF,*S5YFt"Aj%eITJrR,:HD1Ӊw;0Lƻ 4L9\sR@"Ց ˄*ʂ&KPSBje)[XTuJ4Nh!Z!fVJm fi)h*Vr)RG(TΘhr)-h\FJ4#Z ]C*,R " Ε.1#W71HT(.QWL(U*RH+3EDLA ""rYĊ)UB+ 8UQaMLЌ2(54UKR$"JV-3-BT4iUВ1+[%;D6ALG *E"£bJ(S(VlYuԱiГ%)TW+mPTU&]Yef2SM*)efdXIdQI 6EV)+$MJIf!3 k"6IJ& l K&6S"E;ASU (* -5))P%8Q$[RI R$lShda*H5KIJi 1";*D4) :YTU@OnC*"*(!V]LP"!@ *Tr (4Q5l,Y9 jh`"4](c(hIOCFtpA@&@ބj`6O~$(H`ƶɢ؈ҋjۺA(BIIX4J% H.*!M ,&aUU6klU IM0)E=bSd"SM+A% HUT L Кh[M1i @ &AM FZBc4:R MR @)pQ&iH4m5Xeymm]wA$$ ;/18vJ BRnl- أZQ5")UaLr8ޡnnc|xD:@R44rIϑNy’waO;YWTRwN9m Mϝ#ې"hj#J:0 ]΍dK?5w)#OTRG&&ӑ%mV?, */KhO;tUd+`:xBKNȾyyGOO\-ZgT88 dH$1 ?BJY[V+zW\N#xwgzI:VUSBb4N5iDȷ=*uIE %e! 6.f\72JꢎHZ6pɢW L2oRD!= ܧqwsΪ{ ~bMβ2DO~HrORT$ *[C|:xW,rs8$BH E ↢ČƦ8RfͶY`c->/͟]#$~m|r;UջNp8xt_ws"ޮZrgC$ϞUw{w$N4ЇI\!BKr `E#_}h||C,'WHLmАSƤ#% "Y+e"#;s.6*3Iq*f3Hj4|y"mAQd2xF9'߫hm>_ԏ d^etJbR-8fj3lIxYa6_n:/Ma]8Z!}gUA"TdR G D3ߛ=N=*@ R+hXᨎ.:tl&c+d-$`+TȢlMiՉskX>泲UK$RRzR(FE*+djm~ 3*pKd*ˑH JR Z/zpuh pbL+]8 _BOv ~yCB ?O8:Q}˻ZQҢinЋN;$jҨwbRgˣф#7AtXl#D"Բ @,XL'/Q T"8w}"6MA5k! nȋxX6mM̗,D .bHU%5MJ[8Ѩ.m IC,,$4r]f@TB9)z+4Ng*^a0GI?H ڟg4ЁF niqOm|9]f#H7sh2ԙe.BLU1pmQB*%I2%-` IWӚ1{ tX1O5m\\!_m_ڨ}w.d?t~t rYR_}{Guߡć >()/uW+e=ViVWǰ뾾ۦ$+bdcl` nB* ~1|qyhjcQ$CeqG' Ys$rDKr!RymhxٽՈ6}Gآ'Gq15UAݒY+rĀj>슆L$DO~:D (a 4GB,K EAZOG:3io}w{t>c 2'Ӣ$gH1D,2EcJ I!`h(ɘE%)"v0g3ݹ|mszЩ $+M!Gh'K2#d Fd؊bcrd)SIJ guafL3&kHqQ+hBM|zϝ2ݤ1BbLg}_j <΋*|ww9Åtwv;=cy>(ǂ;@H@~>s=8"?1!$pj4!~Ϛ%P{詋}Hc'y&̚"ۻ{Q{gǷ!޾oƀ`9xK@:WyRz Y^0lg81)$5ZM4kA4mA,Yg.1"r\5t&4 :3 "P&E҈P$B%*)B( ҠA  A Jw(VBY$DZ(ReDbfQJ3`50FŒ$,ccF6Œ ZLEQb+TdƓY0iZQD(أi,MEcb(6LlTLѓBX Fѩ,Z-EDDd56-* *1cQX* %"cAXD̢R6cZ(4EQ&4%4LLXEd,hQԅX3H1TPP-QE%(QbjQ!PR)K%$FbЙ4F 4̍4ѴPآ I,`HZ#h$ʼn4S(Ŋ$#S-0e6M$hE"hȊcAE&M3 fLlf- lS "1$cKF1l$aQIDX AIQ(ل F jMP2EF1BbBA Hlh&T3Da$K!&A2D#X bhc4M6!4fBbMRh"FCA$e*3 (  b1 @QR4h2aED&5F $DH$4lc"FI) Qb$SH  XlAPb +QH1ELPjE҅Œ6,h1DQ!L%HI6 ,Y5I 2M!"i*5(ThchFhشlbɨƈ34V,Z IDXec%dRhE#"iƔ$QhԖEDRbƋ`afj(HQ4#e2LҖ"F*@†hcm P2d QD&3(؃(bd4ш֊eRMFhTi4$1hc! ,Rh2#bhɉFL$j%3YZ,cфIEfXLXb)b FdM@4D!Hhѱcb&dPk֋5m[e ld"4chEFFlk)#!*$!XؤclYJ6(ذQ22؊52I!X#c4h10&#b#lkdţlBIcb-DEf"RIbIZT4j1&hɃHIbF TZLD[PEAJ5IZ!ZLC 6MclljHJH*-$X ؠ*h!i*I*6Š%lXƱI&"6,EbآIEFƊbQh,cchb6h66#i"PQhƩ"Zh"1XlQ@A!&44D l6,E& ƱX֍Tmi(31QY4e,X,EiEFdj1d&6eB QDȨ(6IB%E؄c1!0B+CQEReF&A4X"&0i#BQAhZ(HXɨC"d"1TTi) Q0Hщ4I$H %"4f (E 1b4TF!5&J"J5fьX26Ě(-h`LƫcjEcTQ͢h+HUEEAU21@ؙ-FKFhYC$j5Pb B1H1ih-Z#lI"#"4ljJMcL4d0F"Ff&"&$DJI&B1IF5%2A"Ch2(ɢ1$D%E$&6aMlhCQLE EXZj-kUQlU$1h+XlV5FhT#%-h6 X mZA*6ŒIb(T%ɱlFe ĚИՋPcY143*Pj*JV cbiAHDIE&Hm)d&M& bX5X,E-FMZ,Qj6JRJiFZ@ TXZiZ F)U(D*تLZ cXըTI,j+FѱZBS+chɲDM"4Z-Q*6( U-ڱFQEUZ5hF+cTJ(B"ТP(VF*M& eb٘h"PQF$LhchX1E#QJM#d6kAcXF0Z4`5&565lmcj,chXm[cTllh [ckbZEX[bبƂ* i1 Dc $M)()F(+(KP&1%`DV LBT,h( 4E 5(EQmъآI"H#h#-&hEQhQQkIb,-6֪JZ#JJD%Q[F-`h؋&ɱXTZ*#F`"6 XBƒ1JEQA3AZ5Iű aFɰFэDKlcDf4)"-$H0TFTEIhAZMMQcQbѶѩ1HԁcEhѶMj6T@kZG؜-1(6-+hƠ+c%5Y2(6K% AJ[EDPX5K&ɒX MQcAj+& l*0RFLSRb*66 DZ#cb1-fH (Ѩ̢ŊԘ4K( `5j"5ѓP9y Rj6-lRjkFFƍDb %15HQ3lQbRQɨP RH$,E5 Xa0Q4 F2J6#b"-D` DF$1Uh4X%dH\̢uBg-%bڈѶŬV+Flhڍ+d,EE"JK1f0 BPQb"JA 뺺=ܺ]ܗ;XE5` ф&EPQQZ"jƢb[b2PJ% BЫ,lZ)(`, I65nl{$+$yy\k1$Qѩ(ƢbTbض &-QXڈX,mL cj6-i5h#F AWSxT&$WoK$gsy1u7qwn:cwY Ѻh&4DXņaZ*ŊHɊ5D64b F"EbAXHbEEE V%jMmeQ!S9燈gEdȰU,-r^H}@ j%<" A\ n^%f1{q^+J=yy2c#,梩Fct7]H(vN|6@PQ:OEw '=U@ЙAA|D@DPJQ([Wo٣6*hAb:N@w&HiJ4TT Y%6bF٘`[ l%V2XգZ-Qj@^cqȩ((%U!AJ (i$2-EMFشJiL%EbA#F*4AmFDi3,X1dYHY$li)Y5"43IJi&ŨF-Q[b(-b nEj*k[h4r)5&JF(i-"mh p6(4ъȕs\EQZZ(6̱Twt_zQEE,\}aC@hF4 (P+UZj"P4H dИbi&] T.J) b<J40`HhF*%'$JPt+&O80Xjmj 9>se%j\J-W.hؤT i ť=ۛI])4MFHAF4U5Ò[ou^& m^yR[˚5V5ԝ={/%@i\bn`-gvU @^',[9ض}trh|Wuat{y,\,M$׽xRswwtnzwG ޴h )5Br-jߵM)MHHP"R*)H>YEIv25TXH t%@AP;}iB)B6ƪ)B** گZ0j+GN&E6m)A9J&/nqȨ7)hnE$&'~ǡB3/fWehD+Ok<>4)*~z}y\zez^ݦ]q#¶8lMCY-Pr+/qDf*㇈=B3?pO M".O)(UOzj%O0Q*"! :&NIJ:%UH%̲4z C2B5Oz˜'HФU"C 1TiZ%%!#!$ %TY˥ibtDe# T!J!j'Dshk,5u;PtJSU4Kt>%Rd9(̩PK}}% Zk\Re,5L,\s9\9'2VijzH&D$SQS}. (2 єDvwZDC/ТLG0ZQX[܆|ύʑlD!a )J&DL\I3(#`cstf*eO]؞뼢CP[|u EL03$hi!D#7wHi##dihK>Q7\qJb_;Θbё`%#4fIl|n2$LHRs*&Fт]sYs^>r"뗩$?+udT\&ICbW-T9T"w%S>uAo '&&NJrC.s_\J2IAm0Kj V1GZ!rʐ'<]"9!6 EA sF-ٻS)!KwwQ ih|ig hg>oWWc=OGPB0w.֠=)dI(hAP(3v I6#F, 4&QF" Ej ҩ@#B-ЈP)B+†NJP*$@VM Vڴa AlͶ٢ADeQZf"QJtҷۅ,lQbsmcYc0ɈDQX H1IY˖ܬQR:s]6Wo/7HSr  Sb99 $$ۇnt&kWbnN=p|Ǻ$xov~D(ǜrTH]rn;r",JG'y ޕ}UV5p<%lC#8G><7[ klŴh cx(o# ]Eebd4A"I 52P5-Qj*֮Uj4 N$dD̔)z*(gx#b1-uڏPE' +p2 {\JS;T\p+0/3t-ַ9RFwSajΑK!I2:B&"c6#5R" ͕ Np eXz.:Ɓ:suԷ\g\w[K, $fI*v>meBZ6(^ 1QiJaK*1FF-hwNI3j:v(MKw%_j~,t*ѢBo6O5rTYE9WTlEp}>^q}hϛ^=hxBo{IuFSj5QqnRc&PU5.LKVAY(Yh(7a,-#zC6(E/;J*fB3Q.Hмݳv.gQsW9K{nN^h*"dZΫ+W2e0q3qȣEݥWg0TFm+)NvD+1NʈPl#YR@Q=ŃMvTm4!wC)$KHzzq %*,:Nnstإ5 Oz(@3 vΦf7SH#ED-cx N@dY@(n k uf"u/;3AUffmFڅ!eٓOKTN[b "edNw@Ђrr;0ve?s>31 %!~:F!E21E=g#~g#w~GozAo**ds$nP!9IZ=bpʠ #I&7.~˙/ӮuRQ%"Ds7Ct""\i,$7L$u1(}}P(>ץC"f _ ot d{Er_w~_~g}Y\dQ2"f/$WW'7}9\a>{-HS ]v&.\}]߯wOçͫ4剘0/WS/7&6evy$;iW[>ze޼8xI|S3|lAϝ7.R~ˑ |FE] o׼@K4҅ RGCx(VyCQB% 2vi@^@?G>˘cqܷgIא;b}h G#(PIHcñe:,y T=qt`IZ`uu:LPdAвtH܍O2+r8Q3u}Jy8wD_v\&AQ7=@z$|8C%iq2}da 3w!EU}*9W4ZccH|1ۦt٦}iY "]D5Q QU**)%QD6kE* x*9ĈH(Ј)@P5EV*,kkJF[kkX6L(S&ATUUB QhӤ6FUWu\QqM<ڊyn0[nXtu ʹSN8*j"$W(͒9͏9/,] gH쌼*$wvq盡>˟7&i9Hr'PGvxGy U(cb6OV+F̭ ,FJ*JPrRe& ab"!BB7b{wW 1 6d06L"7*bUTE2dՊlUbڱQZmj5WJZhE3ECQ"@P@O?%{!IAB:* |c? 2Ϧ0wk{v}ul?;GvA-*jٶ­UQfl()b@"@ Ѷxy 5hi `hDѶ%E*5 RPER)E($@*@)(TIQP%SZP@I T$%UP($-#A"UUH*X d!]|IRP @(zH$ $ RS@4TlAL5У P4hU*`D@i!D@ DJ@$(R( CV-4J!mVmVJJP *$ʆ(BǷPH(4kd  sl{}Mj6Z6Š%'@A"Ǽ티;7`H }iͺ` P>5mRr%)gNs393"绎(*뤔a{nnVu3)1j"k@4d*Ӕ&OZ.C=uwEHlѯ.E6 $㥓-"T\]Nܧ3v㻞̱W͔>z֖EfDŽlnZhZ˅zt IUtOsK3(>wpE#Jz^.) ™m aS]c$/D9Fd ׻-XGeI(YMGtz(U^Hz;N1<ٞ`8&6.usK`6 @]KZGfR Z aVRJu(:n랶 EDV[em[]\Rꧮ.Y!abBR`堶R؏= Lwn^$=3w1Ipu"nb橺V*ե)&#LmkWDWarCs8޳4<4؅77[oVC#̨b[)((ɷpiK2Pc=N' ԍtŋ"!G9Wjhϧwm{-)H9@*Х D%R5c*eK\%ވw43",G$M6BĐpm-%%nv"Z؊4 eIvȄ,swq'olTޝ)'$XM%P/v]=ޚȯJvfz4r kxV!9DV6# )b֡۾<^ `A"V2Ki'l`e4Bq bi j` ,- R]@ݸrHEmV[QM Nyun;)JJK4Mɳdu.;S0+bc[-(\ȐRcĕc[V[eKPqzNs[JNLZb-G`V ln^2wenmt;l݌T^1#YkM54&[ӭ׷MޥN2.ooAXKPF1%% '(6@&ݷMV,Qsc9ǥvmV9 ҶYRb"H8mQt$hBȊHY43L'wNy] 7KH7$:Nf$仡%%ǵ ,E@kp`&(3ݒ{vw;tN,Kل8`C3d#M#[ g22n(um݊EM7R$4ݛaR׎5{x]@5x{V];f |yM䣿[QOˋb})z!9ȥiȇG/Gbm$3`z^=r:<_8]ZDӲN"|Vۯ{v\yq@"МDt+:("͖Y|PQˆC<{w@0|4L)yIM`GT fieM$_T =MC O].B %@ 10mHB"數Qsq qw9ΑtSsHG((!Ndu(qR68ݝ)Ý's}otܓkD9tɤ2T" pB@ D75C9R̈́ ;Cyo SEtQWIGJA!DIN(Ũ'Ds,\Rϱw. |Y >:$AR9q)9(ւ"GK|YpCw%.'K ]|g'"H㼲"={ I+lm*;N#Ü"$ ZGu>s47Z:S8޽ϊΗY%pt;H菶 T\$R'A9qu>wt%׷HI]'qQ@8qQ ['qϥ֗o_$D۩ 4l(#;]=qN#nm}}^@I%s[Hxztְ:两EyyէGq^YV'y%=zbf{a T.=)Y=Y}8vN}&!zyZ5ݲ$;dHWnaVD\*&x9ⳇvK (!'CCa Xb(D<Z,'$@N;<3*`Lĥ#{2&_fxd,Ja kφa.l|j7SPP%<Q!W 1Y*g.D4frR-I%,#NQUiӑWaZ&t R&HL8I'fcv--DR̕9rIJaE٢d&DF52idsj)r[YۑY$Mr+J"$XݥM6i0&۔mۥJӭ7.̤乭r"N3ٵ'ePwl݁rtq6fvFŖ22 ZГ+JؐKNֱ)ҙĊI.\֐]:(Kͷ0vqAݦDuQbD8R bv%@\Z8YK8);m6+.*lJ\W[h0n⎻.Im\Vgg\WEuTEEDWUuEhQwT[k,ZZ ֔4 (;mtYENs2P. .ؙI9LPDNFh)ZFiS!TQ@KJ4 ANiҚ) JmhSZB%M4\UfetVڬ㠮!(] 5J hi (JD( \wmӫJ-*ַBĂB:RG\wNڳN:mYGId]R:@ Q *Vf$eaYb Ge*.H$YvY9JvgI"RI8G&udQWqmfbJ&6tAE+(B"H%A QڳܗGNQ-i;R*.*4Eh+Dӎ$IqmJ@N:êi4)( ] ZG\Gqvg%YlŶlet]iW6 .#4.֊rAqHR4JPКlδ uEvwVڻ,:"tmYfۻ$wNGtQ$UY۳˨HRDL&$4]+mrۈM3:32mwYiZuRsi:@B֕ HК q +Z4i4BlXѧAEJj'ae'p:Ӏ-8:J 㨲f컈u䩸bVmEaZ;Kҋ:mvv4eq۝gbquts99@]faX$\pIqrI+h"3vGMe&M Ĩ[]wT%gtQ%'!e[5w)9 PkHjHRB6JƝ"T1$*̨VضZivEvrt"mNa6ۺ(ݖDճ&Gmbݑ8j۱ i#;(i;7 ӛMLXcV&Pr9U3YÌ(ûI;[uH"qÅItNrH!u'D䢗 w)" 9K:N.K0$)Z-7QTHS$N(닄:˳(38LJ;.md؈4+m,mUPTtwԡ6([mۢƻNqB[eleIBmfsVk43W5 :EHIU8rMB",fřL9)4tsI3mmq%6n,)BM+4%.G9qE ks#uS0갪 'I8R$8Bq8胖d;ٝw'nqnѭp8ՓkVXDHwYDV]eq!e6,.NSpDhT.4MN I0щE3\&MkY#m;G8m Ȫ*hDm8ZEvmfE1[VtVETsrU˒$Ur AB;(.HIT햭ƒ!̌8:"PB&-*;E%J*Q"ͳ\i)(&%F&puNˑ\1kmȎDVG%9N&mMn܌mA !(E-l)I լSȗed NFM8īaqeH]Mdt‹8 h:d4*B͠Jk4Cf2- ֢FBA$C:g5a4BV9B֑( Ҵ6b)6ħl55$hfq,tݶq@6D䓳kvCQfsЊ̚7vYQ`L#R5HQU5,uS\maf謻C R$ӁH\9E!ԓeM6`$&Gg8գI:"mBtpm&@U 9TEAJaTHdk0Hidfֶ vK k.K6,ɠa°D洶wgQ\ۻ+,KLJlv hʎ.nf"I)CmݜSZ(rʶ%U3U' ad1fZЛZŹ[22mbnlfRu#[BE"Y(a9bDvHNe,q;6ӎVXJp۵:WDk4]AU;7kXlXmjD2@Hfm[cX ͢12:Fl[\: Qi:vĮ*HFv ؒv*$ӈv!,0LReuvt]%*%"& !KBLkmn Rgd$5lY&KUNGBZZZhL4:"Nfj!&hmVd-L***Tf !*Z6!ΜbX--+EHrMN+SVEڴti1#ePjȑe ,Sl̴ܰA9\kgI RA#l2Gd.\kfAb,ι]k8[GB6Ze#$s%i! HCPPZEeL fMlI,mf"M0"%ERd dST8;ik&؍i;-͉S.Th]iR]+.Y)20-CJUʕ:%+2IJ̴,钪 TRLEiR jii \6k)!9A&Y4-1e⡠jp$b rP#4p;;QQͥdFZ6!ɤG(e6k %ZPvS)Ս[ ErZ6%M9sh6DY]͝q."%ZH$ElC&*jEBt5l!Ӵ ZXVclmtCkmVqkm[6sTZLT襄Yӭag"['w3ݝ횊kZIldvF͝--VuDtw6+;m:N0m8qd:qFMj$[n9iv;plt4pF ; l%Łv \ΐjdA YeeܜvF۫++6t5͎ӈq8H:-#mcekn: & PZqCIc$lmrdՈIܑhi8fhRv((C,n$p莜%QScn"'tNG6nHe NHӓ⌮#K*kw%huZEKi ke!,v(+ ,m`Vaj, YHI-.q!ĖT(-97.RStE3Ϊa,4"uE9T*S鵠ڜN؋ )+ 8m\(ҊQSU-RDfZ3)hۻ,nE 21 i6[8e-XEMFM244sΒuiMVTQ(LDvRK%FtK *VP CNDt"q*̂Cq H-wfܐ rt8GI̕J\wqgNv;e:ͻq f8.N)$GHWueͬ]BhȢUBem3SiEUȚv25fff\V\]hVQZEdهv%vv-sl$-*3*IRQ!Юө:&IhN#.p3NJdԬUj%RhWn"RB#(! UZZDRDJ'KHZ2Q)+UH9[h9HPF%1 @JG*M$%&mfR ܔbMVΑfƬ-'pt@D$;%É$ҒpӌֱqqfSnq).&بf69[V-fG9I",&ևdmiƭf.N8 a# 9"8EÝٙQsq6@#"Ӭ;S0NG ĒUdu0AU XM$8NmVڎ;hԶ,bkbBv'($H$9 hܝKbM8,.83 GVcn3K4Y,69%P!:aL# cZ%M Zm&̓m Ym\˨'mI9 [:FQtQ[kpM+DQ lg R' YE-.+S*D칠]EPtsm fDXmcllݠ ș֜$$ѶmD9#M"p8㎑8!9YJ$vNP8%Q :Dfq'q$mm(!T 9(&ݻ("3*##8:m`p$ܡ8AI*;m#9՛9'6P4-%)'Zݢ''digg6-4QU)VVJNRWS CLM&15lieJhvuGDRM)ZuH(̴(:";(mfYMAvBʦ+\Bb+0MŶβFTVu\YfqHt [Mm4Kuhfpʣ,NRGqE]gdprviQYZtGq8"HI RvZjIhPjBUaEa[X[v]$pludU%KvDD.Y TfE#Xu.fQrJAu Z(".TtʋVT U3$CEi8"NIӚ(k1a&*:YXtCL]v6SƁT-X eVeMR[ J,άm"XBWe֜ +Pč(FIVge5vqŜpYafglpvZlݡ%[nL&-FYLHJ!9BM2*ȋv3MIMflYfgdc25)[,ݜlr 4+c ͝PjTjsP)H)DB:кu5svYN@JiXRFElIaVXZULJEGN[YfلsKL#iRE"6VI$9eٖq#MD0(DȦZ ST*SddZr r" gYW"&5eˡkVFh۲EcX&Ie*'"LfeդGjsi-hu,(Z )HČJD)Iҩ4(ԶCs % h% n5g8-)Y"ZִȦZ.ŭf E"T"ňPfI'*ÚES RD")Y-D!HNDӥUV3qmѝ(hQ),E&Q RRFWLIJ (]9E2%0۽+k'o2F.8JN#[NBHTKeL軣՝ТGr䤒 .BP-#M A@QB@-5c(r񞾀,'sCY\1q4a捧1BҀ"PI4EI*[\瓝"S`;. "C~CDV(@ޜG(4*whnTm': w̴znƥ5>kS_TV c9>zCϣ?@_c~s+#1T?.q{vdbnC۹[FAfKC_O  +$"{*J\8.] szzRW9|;#a+w_omW=|uEwߖ7a|666w/3Đ3rHQGʼ͛õ7ϜhNx.%O[S~8&[W^٭}+#W7OE狼r-n_o+]x<|e/\R3G JjyZC>1[#'˺89Oy_Hʜ,Q&D :=OwFHRNYAHkiX- }6U62*-$ӏ;|*akXmdpPi ڌ+^t5gNK5 4&ɾ1*`T$ !Ī0c1!M0PīIL"T85(CMFxMXD[7vn6+Vr:j!PDPkJ ȅE/X(rt,)?C㭑?ܮ%Wj-A!DgՌ*͛g)5%l>LL2I痃&?:g}UGnZ I[SuN$ Ut]c8ϛ֘NIXBh!= X@$[0{RgQVy+=,ly×$f>Y"0 CH73IIL$HD%!BEq&U M1[mg-5.ءQady&^l'[-MmvI9-qz@};b5upҖj̽2%]jZVp{V}Zkggb@7Yٔa(h`$a DtVʿnL ']'m9v0ǭADUX*5@&n|w8sa3sd=ˆnaZ?jH'`Wz)ǽV(*A6¨"=ܜ[YH0(r h{zo"(ߑH 5/9(hLAyygK-pá +(F{-Vb *0$%.+IM*)(P QaPX7pԻ#Dei$ b "an̡lu'\]9.pJg,fe9+) {&hQ 5ߋ4 BhHCa4XUYtE@(ZnlV"QpUb%J Vn]实ߝA5(_ LX#雉NA2 G$17@эr>kHb{=6gLr-tޣCwvxhWX'å C,+t YR˜q%@ijuX9bFeQcf^T qz4m̭A:Ȯ$B$u$܋'o,NΠEe :8f&|nVyxP+L{Nn:Mp-keiæ($;ߏVw{ 0 Jz'zsroK97e.EUXkkNZhUjڔYE+4ӎX0:kH9s;HB.9$N$y^#mԀBH de.߯7dBy)1z@ 3uqrw9mZ6!ApHI):J(6E .) 0}ݙ'oxFa'xeH%Ť 4J(6?ۭZD A'>Ⱥp$HrU I'9ZCRP;N'r'wӜtHHGsGiHPߏ|pfVg6z#$U6"t4N:(HI"h%?ONjpqE.Q8QSK~vp9H\G}k/9J.u :r'_(m'^w%߅n_Z$HA1**vQ$E-w壝hs%wD+G"jSw%Ys_ĝ8]ChD"/Y9?F'CCοԾ8|_Ouk4:rzaς p v^e=_ojI2ix&1R'N I+['Sq~u:Ol\%GsNI'׷z\E!'夿ff~t߅kS"#~5gG$J'Ap/W/w׭slG?M'Z}}8<r9{_c^^ 9+Bwn\Iqq#'>trJ{h5:wށh/{^oj He 'oI|hdI[WjH+ 6w#`yDtuv^kZ|V,zf CX=;i,!i`b0i<"M',Q{g[پZ ̵T,(RW( r&ɹ ߺ=ǫ嶺4 =z<2y rz3ILS Cre*7 +H 72,Pq83|.F=H8=Ӊ_&&3̞'z|5V )Fz^!^z3k jR [lO$~L&˨hl PP5*+=][5/_ԉJgYT\gn/(' 8.ˡvvYX 2=۰s Ε1eǝz@UirQ9W14A /:gSC+jȭ"ngzzclfPmITk= '' 9q,mvfhN$d[Xr^TNȢujtqúhye:jsi 9wݤ%r#r6,=XH$9,fն΃LA Ӈ:m)َ;RA(U\(Զ„kL:QS /qWFȎXViә:nEQr9SA5DԄgJQHu%WqȻ.S,jI0RN+U"jZ%kfEtM(]QzЋ@`tt:v9Nʳ 㣬(%+ TK]纬6edm4+@ȗk5D畁(9 : Ǖ^IZ=mrk%9-qlVq  -VڰS9wh!Pځ3g&K!0ISTpSœ;;LGmDwǎwE]m#9EDDmYzzpm/|&ŕ$KnR)-e[kCd%HV֖ۑ1 p5VZJ6&@swaYuy-W%aVGD\/3YDI,͘ 8E=ֽfpJjhRp,kcFDZPm,c nP w Y=:-)m^(<򰢢Qקr˳t"#mdw{d=rrrG*ֲS;GiU59<݈ ytA"%#p;PZ[ppG en#4IEtH\wfSri6rK,Cm9+4sΔ \st6Nmq!'CN+32͒HW33DD 9pNN[V.!qE99'$w)Dpp9"D$'^ؠۑ)$rQ8$ p'yh9Zr;lD8OPGSE SD##J#;%9J.#PN<ԹVTD9GsGQ\G9EHNAD&IȎ\ 9P:N |:[SlZwI6(#N)qEBHN@RQ+K'DDABw9“d:!˜E;GBCHtC%"@!9w) 8N=qˉ9pY휢v݀EX#(8\L>_\p-ksȢ$NkRrO:ԠJJ)2d2Ewvֈ(9s">mte)=o5㱵E|AiӢ ++; ^ir!|e'%8e6'NtNlQv@&6@dG6R:aQYMrW>y݄bU!DsR#\ki a$EݶMbQ5eceHwEr,/C("f2Ɏٷ{KUUPM%l34j{ylςUbjhX)@ު`,⺓H#.R ' 9ufiAVLTJL<7:JոޭuVu6 A!lHĪ3L-Fns,;eb%ݧgg✄X>ɾ<-QM*Zg7w8q96|M+%"I&khDbi' Iv4:ib%EtKU1H2oЌBt ̐ 1V{e氤RQ:IbbFbRdH(8h'PYȑ&,ZfA.iWYQE&`CK J9Kz5 ڱF$jԢ좂'$xHBdQ$3uYӘKU\L$p(,래-sA8ζVXr2#-B edo;8m,L%DdI8{Yc<ʲ ./M0UptqdvtoklYnŬNM֓7g3y$K>>t9V%n:Z%(DY.;.+2v"pE)UK4406ȐZVMb8͙5.[чuTBCsIM2Us$vXp"̒ QZEH`ujuD*Y#HGw*t$ma1{N7&ie!V0ŀDɘ,>[N9vEL1eZB 5hI$yv|RY2P'nfR||nBn"@k% L k4\64fnsgmnK $`nKq+eC"1ni iI YL6.ul! R9 DFz#{in +Q$fiG0ݗc/³ZAGI/'| t0Ce@6I޽ou8CrrS!Dn d$F&lnNDc).M 7mîNe}a'rD@(@'{v98qpIGr{|grܔ2B;t3I y0BRD#Jxc 鰛睲uLj1WUI߭ӜD8Wַ\"Ii)f9Z9:"N p;.ȑ䤇 $tùps@$+ݮkG!Ye!{ݝ=x{wϗ >m)Jp:ÁNäCr. ĸE}m8:T. B)89'_5!:Dpq!ӎ:#}2_[H"}4$^$p%PA=8_[FX°5ě;;BLORB $)!k-PQ2IG8qrDQs8w'INE}3H('Ht*ND,;$sKWI:"'G@8li!G k"x":'&odu/-*.+ǙE3}+ +2NNK9$[HI 9))܀ t'8'"JHDJS!˙;Yfe !tÔ/m|cwhUw-8坫%"}.G'$Pո)btCo{PtpqWHIG*Tq<1$IhLII[{v2P#v}IDG'%mś`B[;FxZq2^(d6`BJ$ݺUd5`X 605zBS!IHW,evь  9rX1Pu/%H9&F"s8;F.yeީ|pBbMoc$ɧv.iL^3E  SCpqBPih/F9ޔp7]yx3@̙\?+7h` B@k T0㔣< !"1fcTz٭>bvwD Dbptos6B|'7kս W\BȠ*kfuu]q/#%Xhz;ξмinUH)i7#y{w1PP fڹ2lHѥbٛ4 !]/ܠ#;ƙhmƷd-UFj y[[wUXw}st;=crlYa+aJf$'ZDa +jKf9 &5# T77{pmy*oȗc ٛaEHim ' :Gw2O'uoh\& ڤmdK|Q6$>;tȥk~*0gErGVhS, g,YA98.T-Pv(2 Ea:EfvsAil&\#9'8D Q֠4ar$S3,xM4W3S{NZeIVKML7{RrTv,n5ԋ${g7\7aU= (i `m_. qyN$ϿժnZW (ߧ )HPNn:քRz@H6MJ[nN .s#"˸8>|ƵtGI <ؼ  >gxD͞.pqqBQ?;ց8sܹ s4䜸tNNq~8-_{{œa=z3H^$p|l=l7z?[ʋvW%H8DI8C%\SNq rpw#'9ΜB\>k 8Rr.;-P =mgU#:Z'Dr'sĢHk-{%|h1H*H:<8qʇrw8q98Hf!9J ('_a{sp79CR\.(ƞIp bO[D$ny۔3?f>+>֎^X?;ʼ䃜-]sHE? ~6*$H:BCӋoH(۴Iq @c<2Oisnj̉b";̳*ҍ s燝/e˕L%HĘ)#;SnIo#$IMн׸H˴m^onȄk_5vi\q|Z\Ѯ"䣢}n $*;|WꬋvIeFQۧ#8G^lTڲ\\``C۵"f''ȤrRnGN kI2t9qpsCtI`N۵(^Y%۲YrQ'tQ|ے6IʒJN.#:ȀM-+3˥'>ފe Qz׶I3SrրmF,r>:qDDs8("hD)ܐpS/kSr@'(-! 8%p8pNpDfwn.߯W߭yG[i~aqOѡD;>7/:QEgg|]蜐K4;;~6Z8 LJ*]֕ᖧN:r8G{-&R>,#\ʬ!9!eUL4CËvˆn j%%6L"|.صam(F].HFԍv0ivktgTw hE*bT"C"ȩ4JE<""i>@ ~P[Hs %ctt'qѝ&*%wEUIw: $:(AOiOќ͙( i]EHuIԸG;*:sŪc#rR|4 fܦ"(HQCcubelyr/man/0000755000176200001440000000000013756757725012522 5ustar liggesuserscubelyr/man/as.table.tbl_cube.Rd0000644000176200001440000000155213623771036016243 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cube.R \name{as.table.tbl_cube} \alias{as.table.tbl_cube} \alias{as.data.frame.tbl_cube} \alias{as_tibble.tbl_cube} \title{Coerce a \code{tbl_cube} to other data structures} \usage{ \method{as.table}{tbl_cube}(x, ..., measure = 1L) \method{as.data.frame}{tbl_cube}(x, ...) \method{as_tibble}{tbl_cube}(x, ...) } \arguments{ \item{x}{a \code{tbl_cube}} \item{...}{Passed on to individual methods; otherwise ignored.} \item{measure}{A measure name or index, default: the first measure} } \value{ A table, data frame, or tibble, as appropriate. } \description{ Supports conversion to tables, data frames, tibbles. For a cube, the data frame returned by \code{\link[tibble:as_tibble]{tibble::as_tibble()}} resulting data frame contains the dimensions as character values (and not as factors). } cubelyr/man/tbl_cube.Rd0000644000176200001440000000705613623771036014560 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cube.R \name{tbl_cube} \alias{tbl_cube} \title{A data cube tbl} \usage{ tbl_cube(dimensions, measures) } \arguments{ \item{dimensions}{A named list of vectors. A dimension is a variable whose values are known before the experiment is conducted; they are fixed by design (in \pkg{reshape2} they are known as id variables). \code{tbl_cubes} are dense which means that almost every combination of the dimensions should have associated measurements: missing values require an explicit NA, so if the variables are nested, not crossed, the majority of the data structure will be empty. Dimensions are typically, but not always, categorical variables.} \item{measures}{A named list of arrays. A measure is something that is actually measured, and is not known in advance. The dimension of each array should be the same as the length of the dimensions. Measures are typically, but not always, continuous values.} } \value{ A new data cube with class \code{tbl_cube}. } \description{ A cube tbl stores data in a compact array format where dimension names are not needlessly repeated. They are particularly appropriate for experimental data where all combinations of factors are tried (e.g. complete factorial designs), or for storing the result of aggregations. Compared to data frames, they will occupy much less memory when variables are crossed, not nested. } \details{ \code{tbl_cube} support is currently experimental and little performance optimisation has been done, but you may find them useful if your data already comes in this form, or you struggle with the memory overhead of the sparse/crossed of data frames. There is no support for hierarchical indices (although I think that would be a relatively straightforward extension to storing data frames for indices rather than vectors). } \section{Implementation}{ Manipulation functions: \itemize{ \item \code{select()} (M) \item \code{summarise()} (M), corresponds to roll-up, but rather more limited since there are no hierarchies. \item \code{filter()} (D), corresponds to slice/dice. \item \code{mutate()} (M) is not implemented, but should be relatively straightforward given the implementation of \code{summarise}. \item \code{arrange()} (D?) Not implemented: not obvious how much sense it would make } Joins: not implemented. See \code{vignettes/joins.graffle} for ideas. Probably straightforward if you get the indexes right, and that's probably some straightforward array/tensor operation. } \examples{ library(dplyr) # The built in nasa dataset records meterological data (temperature, # cloud cover, ozone etc) for a 4d spatio-temporal dataset (lat, long, # month and year) nasa head(as.data.frame(nasa)) titanic <- as.tbl_cube(Titanic) head(as.data.frame(titanic)) admit <- as.tbl_cube(UCBAdmissions) head(as.data.frame(admit)) as.tbl_cube(esoph, dim_names = 1:3) # Some manipulation examples with the NASA dataset -------------------------- # select() operates only on measures: it doesn't affect dimensions in any way select(nasa, cloudhigh:cloudmid) select(nasa, matches("temp")) # filter() operates only on dimensions filter(nasa, lat > 0, year == 2000) # Each component can only refer to one dimensions, ensuring that you always # create a rectangular subset \dontrun{filter(nasa, lat > long)} # Arrange is meaningless for tbl_cubes by_loc <- group_by(nasa, lat, long) summarise(by_loc, pressure = max(pressure), temp = mean(temperature)) } \seealso{ \code{\link[=as.tbl_cube]{as.tbl_cube()}} for ways of coercing existing data structures into a \code{tbl_cube}. } cubelyr/man/as.tbl_cube.Rd0000644000176200001440000000223313623771036015152 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cube.R \name{as.tbl_cube} \alias{as.tbl_cube} \alias{as.tbl_cube.array} \alias{as.tbl_cube.table} \alias{as.tbl_cube.matrix} \alias{as.tbl_cube.data.frame} \title{Coerce an existing data structure into a \code{tbl_cube}} \usage{ as.tbl_cube(x, ...) \method{as.tbl_cube}{array}( x, dim_names = names(dimnames(x)), met_name = deparse(substitute(x)), ... ) \method{as.tbl_cube}{table}(x, dim_names = names(dimnames(x)), met_name = "Freq", ...) \method{as.tbl_cube}{matrix}( x, dim_names = names(dimnames(x)), met_name = deparse(substitute(x)), ... ) \method{as.tbl_cube}{data.frame}(x, dim_names = NULL, met_name = guess_met(x), ...) } \arguments{ \item{x}{an object to convert. Built in methods will convert arrays, tables and data frames.} \item{...}{Passed on to individual methods; otherwise ignored.} \item{dim_names}{names of the dimensions. Defaults to the names of the \code{\link[=dimnames]{dimnames()}}.} \item{met_name}{a string to use as the name for the measure.} } \value{ A \code{tbl_cube}. } \description{ Coerce an existing data structure into a \code{tbl_cube} } cubelyr/man/nasa.Rd0000644000176200001440000000220713756757725013734 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data-nasa.R \docType{data} \name{nasa} \alias{nasa} \title{NASA spatio-temporal data} \format{ A \link{tbl_cube} with 41,472 observations. } \usage{ nasa } \description{ This data comes from the ASA 2007 data expo, \url{http://stat-computing.org/dataexpo/2006/}. The data are geographic and atmospheric measures on a very coarse 24 by 24 grid covering Central America. The variables are: temperature (surface and air), ozone, air pressure, and cloud cover (low, mid, and high). All variables are monthly averages, with observations for Jan 1995 to Dec 2000. These data were obtained from the NASA Langley Research Center Atmospheric Sciences Data Center (with permission; see important copyright terms below). } \section{Dimensions}{ \itemize{ \item \code{lat}, \code{long}: latitude and longitude \item \code{year}, \code{month}: month and year } } \section{Measures}{ \itemize{ \item \code{cloudlow}, \code{cloudmed}, \code{cloudhigh}: cloud cover at three heights \item \code{ozone} \item \code{surftemp} and \code{temperature} \item \code{pressure} } } \examples{ nasa } cubelyr/man/cubelyr-package.Rd0000644000176200001440000000120713613055737016031 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/cubelyr-package.R \docType{package} \name{cubelyr-package} \alias{cubelyr} \alias{cubelyr-package} \title{cubelyr: A Data Cube 'dplyr' Backend} \description{ An implementation of a data cube extracted out of 'dplyr' for backward compatibility. } \seealso{ Useful links: \itemize{ \item \url{https://github.com/hadley/cubelyr} \item Report bugs at \url{https://github.com/hadley/cubelyr/issues} } } \author{ \strong{Maintainer}: Hadley Wickham \email{hadley@rstudio.com} Other contributors: \itemize{ \item RStudio [copyright holder] } } \keyword{internal} cubelyr/DESCRIPTION0000644000176200001440000000160113757153513013435 0ustar liggesusersPackage: cubelyr Title: A Data Cube 'dplyr' Backend Version: 1.0.1 Authors@R: c(person(given = "Hadley", family = "Wickham", role = c("aut", "cre"), email = "hadley@rstudio.com"), person(given = "RStudio", role = "cph")) Description: An implementation of a data cube extracted out of 'dplyr' for backward compatibility. License: MIT + file LICENSE Depends: R (>= 3.3) Imports: dplyr, glue, pillar, purrr, rlang, tibble, tidyselect Suggests: covr, testthat (>= 2.1.0) Encoding: UTF-8 LazyData: true RoxygenNote: 7.1.1 URL: https://github.com/hadley/cubelyr BugReports: https://github.com/hadley/cubelyr/issues NeedsCompilation: no Packaged: 2020-11-23 16:25:53 UTC; hadley Author: Hadley Wickham [aut, cre], RStudio [cph] Maintainer: Hadley Wickham Repository: CRAN Date/Publication: 2020-11-24 09:50:03 UTC cubelyr/tests/0000755000176200001440000000000013574520551013070 5ustar liggesuserscubelyr/tests/testthat/0000755000176200001440000000000013757153513014733 5ustar liggesuserscubelyr/tests/testthat/test-cube.R0000644000176200001440000000670713613052076016754 0ustar liggesuserstest_that("construction errors", { expect_error( tbl_cube(1:3, 1:3), "`dimensions` must be a named list of vectors, not an integer vector", fixed = TRUE ) expect_error( tbl_cube(list(a = 1:3), 1:3), "`measures` must be a named list of arrays, not an integer vector", fixed = TRUE ) expect_error( tbl_cube(list(a = 1:3), list(b = 1:3)), "`measures` must be a named list of arrays, not a list", fixed = TRUE ) expect_error( tbl_cube(list(a = 1:3), list(b = array(1:3), c = array(1:2))), "Measure `c` needs dimensions [3], not [2]", fixed = TRUE ) }) test_that("coercion", { grid <- expand.grid(x = letters[1:3], y = letters[1:5], stringsAsFactors = FALSE) tbl <- table(x = grid$x, y = grid$y) tbl_as_df <- as.data.frame(tbl, stringsAsFactors = FALSE) expect_message(cube <- as.tbl_cube(tbl_as_df), "Using Freq as") expect_identical(cube$dims, list(x = letters[1:3], y = letters[1:5])) expect_identical(names(cube$mets), "Freq") expect_message(cube_met <- as.tbl_cube(tbl_as_df, met_name = "Freq"), NA) expect_identical(cube, cube_met) expect_message(cube_dim <- as.tbl_cube(tbl_as_df, dim_names = c("x", "y")), NA) expect_identical(cube, cube_dim) expect_message(cube_tbl <- as.tbl_cube(tbl), NA) expect_identical(cube, cube_tbl) }) test_that("incomplete", { d <- rbind( cbind(data.frame(s = 1), expand.grid(j = 1)), cbind(data.frame(s = 2), expand.grid(j = 1:2)) ) d$value <- 1:3 cube <- as.tbl_cube(d, met_name = "value") expect_true(is.na(as.data.frame(filter(cube, s == 1, j == 2))[["value"]])) expect_equal(filter(as_tibble(cube), s != 1 | j != 2), as_tibble(d)) }) test_that("duplicate", { d <- rbind( cbind(data.frame(s = 1), expand.grid(j = c(1, 1))), cbind(data.frame(s = 2), expand.grid(j = 1:2)) ) d$value <- 1:4 expect_error( as.tbl_cube(d, met_name = "value"), "`x` must be unique in all combinations of dimension variables, duplicates: `s` = 1, `j` = 1", fixed = TRUE ) }) test_that("filter", { expect_equal( nasa %>% filter(month == 1) %>% filter(year == 2000), nasa %>% filter(year == 2000) %>% filter(month == 1) ) expect_equal( nasa %>% filter(month == 1) %>% filter(year == 2000), filter(nasa, month == 1, year == 2000) ) expect_equal( filter(nasa, month == 1, year == 2000), filter(nasa, year == 2000, month == 1) ) expect_error( filter(nasa, month == 1 & year == 2000), "`month == 1 & year == 2000` must refer to exactly one dimension, not `month`, `year`" ) }) test_that("summarise works with single group", { by_month <- group_by(nasa, month) out <- summarise(by_month, temp = mean(temperature)) expect_equal(names(out$dims), "month") expect_equal(names(out$mets), "temp") expect_equal(dim(out), c(12, 1)) }) test_that("can coerce to tibble", { slice <- filter(nasa, year == 1995L, month == 1L) expect_identical( as_tibble(as.data.frame(slice, stringsAsFactors = FALSE)), as_tibble(slice) ) }) test_that("can coerce to table", { expect_is(as.table(nasa), "table") expect_equal(length(dim(as.table(nasa))), 4L) expect_equal(dimnames(as.table(nasa)), lapply(nasa$dims, as.character)) expect_equal(as.vector(as.table(nasa)), as.vector(nasa$mets[[1]])) expect_identical(as.table(nasa, measure = "ozone"), as.table(select(nasa, ozone))) }) test_that("group_vars() returns variables", { gcube <- group_by(nasa, month) expect_identical(group_vars(gcube), "month") }) cubelyr/tests/testthat.R0000644000176200001440000000007213574520551015052 0ustar liggesuserslibrary(testthat) library(cubelyr) test_check("cubelyr") cubelyr/R/0000755000176200001440000000000013756757725012150 5ustar liggesuserscubelyr/R/utils.R0000644000176200001440000000022113574521601013402 0ustar liggesuserscommas <- function(...) paste0(..., collapse = ", ") any_apply <- function(xs, f) { for (x in xs) { if (f(x)) return(TRUE) } FALSE } cubelyr/R/zzz.R0000644000176200001440000000143613574522070013111 0ustar liggesusers# nocov start .onLoad <- function(...) { register_s3_method("dplyr", "filter", "tbl_cube") } register_s3_method <- function(pkg, generic, class, fun = NULL) { stopifnot(is.character(pkg), length(pkg) == 1) stopifnot(is.character(generic), length(generic) == 1) stopifnot(is.character(class), length(class) == 1) if (is.null(fun)) { fun <- get(paste0(generic, ".", class), envir = parent.frame()) } else { stopifnot(is.function(fun)) } if (pkg %in% loadedNamespaces()) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } # Always register hook in case package is later unloaded & reloaded setHook( packageEvent(pkg, "onLoad"), function(...) { registerS3method(generic, class, fun, envir = asNamespace(pkg)) } ) } # nocov end cubelyr/R/cubelyr-package.R0000644000176200001440000000051413574522005015304 0ustar liggesusers#' @keywords internal #' @importFrom glue glue #' @importFrom purrr map map_int map_lgl map_chr map2_int #' @importFrom stats setNames #' @import rlang "_PACKAGE" # The following block is used by usethis to automatically manage # roxygen namespace tags. Modify with care! ## usethis namespace: start ## usethis namespace: end NULL cubelyr/R/cube.R0000644000176200001440000003140113756757725013210 0ustar liggesusers#' A data cube tbl #' #' A cube tbl stores data in a compact array format where dimension #' names are not needlessly repeated. They are particularly appropriate for #' experimental data where all combinations of factors are tried (e.g. #' complete factorial designs), or for storing the result of aggregations. #' Compared to data frames, they will occupy much less memory when variables #' are crossed, not nested. #' #' `tbl_cube` support is currently experimental and little performance #' optimisation has been done, but you may find them useful if your data #' already comes in this form, or you struggle with the memory overhead of the #' sparse/crossed of data frames. There is no support for hierarchical #' indices (although I think that would be a relatively straightforward #' extension to storing data frames for indices rather than vectors). #' #' @section Implementation: #' #' Manipulation functions: #' #' \itemize{ #' \item `select()` (M) #' #' \item `summarise()` (M), corresponds to roll-up, but rather more #' limited since there are no hierarchies. #' #' \item `filter()` (D), corresponds to slice/dice. #' #' \item `mutate()` (M) is not implemented, but should be relatively #' straightforward given the implementation of `summarise`. #' #' \item `arrange()` (D?) Not implemented: not obvious how much sense #' it would make #' } #' #' Joins: not implemented. See `vignettes/joins.graffle` for ideas. #' Probably straightforward if you get the indexes right, and that's probably #' some straightforward array/tensor operation. #' #' @return A new data cube with class `tbl_cube`. #' @export #' @param dimensions A named list of vectors. A dimension is a variable #' whose values are known before the experiment is conducted; they are #' fixed by design (in \pkg{reshape2} they are known as id variables). #' `tbl_cubes` are dense which means that almost every combination of #' the dimensions should have associated measurements: missing values require #' an explicit NA, so if the variables are nested, not crossed, the #' majority of the data structure will be empty. Dimensions are typically, #' but not always, categorical variables. #' @param measures A named list of arrays. A measure is something that is #' actually measured, and is not known in advance. The dimension of each #' array should be the same as the length of the dimensions. Measures are #' typically, but not always, continuous values. #' @seealso [as.tbl_cube()] for ways of coercing existing data #' structures into a `tbl_cube`. #' @examples #' library(dplyr) #' # The built in nasa dataset records meterological data (temperature, #' # cloud cover, ozone etc) for a 4d spatio-temporal dataset (lat, long, #' # month and year) #' nasa #' head(as.data.frame(nasa)) #' #' titanic <- as.tbl_cube(Titanic) #' head(as.data.frame(titanic)) #' #' admit <- as.tbl_cube(UCBAdmissions) #' head(as.data.frame(admit)) #' #' as.tbl_cube(esoph, dim_names = 1:3) #' #' # Some manipulation examples with the NASA dataset -------------------------- #' #' # select() operates only on measures: it doesn't affect dimensions in any way #' select(nasa, cloudhigh:cloudmid) #' select(nasa, matches("temp")) #' #' # filter() operates only on dimensions #' filter(nasa, lat > 0, year == 2000) #' # Each component can only refer to one dimensions, ensuring that you always #' # create a rectangular subset #' \dontrun{filter(nasa, lat > long)} #' #' # Arrange is meaningless for tbl_cubes #' #' by_loc <- group_by(nasa, lat, long) #' summarise(by_loc, pressure = max(pressure), temp = mean(temperature)) tbl_cube <- function(dimensions, measures) { if (!is.list(dimensions) || any_apply(dimensions, Negate(is.atomic)) || is.null(names(dimensions))) { bad_args("dimensions", "must be a named list of vectors, ", "not {friendly_type_of(dimensions)}" ) } if (!is.list(measures) || any_apply(measures, Negate(is.array)) || is.null(names(measures))) { bad_args("measures", "must be a named list of arrays, ", "not {friendly_type_of(measures)}" ) } # Check measures have correct dimensions dims <- vapply(dimensions, length, integer(1), USE.NAMES = FALSE) dims_ok <- vapply( measures, function(x) identical(unname(dim(x)), dims), logical(1) ) if (any(!dims_ok)) { bad <- names(measures)[!dims_ok] bad_measures(bad, "needs dimensions {fmt_dims(dims)}, not {bad_dim}", bad_dim = fmt_dims(dim(measures[!dims_ok][[1L]])) ) } structure(list(dims = dimensions, mets = measures), class = "tbl_cube") } #' @importFrom dplyr tbl_vars #' @export tbl_vars.tbl_cube <- function(x) names(x$dims) #' @export dim.tbl_cube <- function(x) { c(length(x$mets[[1]]), length(x$dims)) } #' @importFrom dplyr same_src #' @export same_src.tbl_cube <- function(x, y) { inherits(y, "tbl_cube") } #' @export print.tbl_cube <- function(x, ...) { cat("Source: local array ", dplyr::dim_desc(x), "\n", sep = "") if (!is.null(x$groups)) { cat( "Grouped by: ", paste(names(x$dims)[x$groups], collapse = ", "), "\n", sep = "" ) } # Dimensions types <- vapply(x$dims, pillar::type_sum, character(1)) lengths <- vapply(x$dims, length, integer(1)) vars <- paste0("D: ", names(x$dims), " [", types, ", ", lengths, "]") cat(vars, sep = "\n") # Measures types <- vapply(x$mets, pillar::type_sum, character(1)) vars <- paste0("M: ", names(x$mets), " [", types, "]") cat(vars, sep = "\n") invisible(x) } # Coercion methods (from tbl_cube) --------------------------------------------- #' Coerce a `tbl_cube` to other data structures #' #' Supports conversion to tables, data frames, tibbles. #' #' @param x a `tbl_cube` #' @param ... Passed on to individual methods; otherwise ignored. #' @param measure A measure name or index, default: the first measure #' @name as.table.tbl_cube #' @returns A table, data frame, or tibble, as appropriate. #' @export as.table.tbl_cube <- function(x, ..., measure = 1L) { ret <- x$mets[[measure]] dimnames(ret) <- x$dims class(ret) <- "table" ret } #' @rdname as.table.tbl_cube #' @export as.data.frame.tbl_cube <- function(x, ...) { dims <- expand.grid(x$dims, KEEP.OUT.ATTRS = FALSE, ...) mets <- lapply(x$mets, as.vector) all <- c(dims, mets) class(all) <- "data.frame" attr(all, "row.names") <- .set_row_names(nrow(dims)) all } #' @importFrom tibble as_tibble #' @rdname as.table.tbl_cube #' @description For a cube, the data frame returned by #' [tibble::as_tibble()] resulting data frame contains the #' dimensions as character values (and not as factors). #' @export as_tibble.tbl_cube <- function(x, ...) { as_tibble(as.data.frame(x, ..., stringsAsFactors = FALSE)) } # Coercion methods ------------------------------------------------------------- #' Coerce an existing data structure into a `tbl_cube` #' #' @param x an object to convert. Built in methods will convert arrays, #' tables and data frames. #' @param ... Passed on to individual methods; otherwise ignored. #' @returns A `tbl_cube`. #' @export as.tbl_cube <- function(x, ...) UseMethod("as.tbl_cube") #' @export #' @rdname as.tbl_cube #' @param dim_names names of the dimensions. Defaults to the names of #' the [dimnames()]. #' @param met_name a string to use as the name for the measure. as.tbl_cube.array <- function(x, dim_names = names(dimnames(x)), met_name = deparse(substitute(x)), ...) { force(met_name) dims <- dimnames(x) dims <- lapply(dims, utils::type.convert, as.is = TRUE) mets <- setNames(list(undimname(x)), met_name) tbl_cube(dims, mets) } undimname <- function(x) { dimnames(x) <- NULL x } #' @export #' @rdname as.tbl_cube as.tbl_cube.table <- function(x, dim_names = names(dimnames(x)), met_name = "Freq", ...) { as.tbl_cube.array(unclass(x), dim_names = dim_names, met_name = met_name) } #' @export #' @rdname as.tbl_cube as.tbl_cube.matrix <- as.tbl_cube.array guess_met <- function(df) { if ("Freq" %in% names(df)) { met <- "Freq" } else { is_num <- vapply(df, is.numeric, logical(1L)) met <- names(df)[is_num] } inform(paste0("Using ", paste(met, collapse = ", "), " as measure column(s): use `met_name` to override.")) met } #' @export #' @rdname as.tbl_cube as.tbl_cube.data.frame <- function(x, dim_names = NULL, met_name = guess_met(x), ...) { if (is.null(dim_names)) { dim_names <- setdiff(names(x), met_name) } else { met_name <- NULL if (!is.character(dim_names)) { dim_names <- names(x)[dim_names] } } if (is.null(met_name)) { met_name <- setdiff(names(x), dim_names) } else if (!is.character(met_name)) { met_name <- names(x)[met_name] } dims <- lapply(x[dim_names], unique) n <- vapply(dims, length, integer(1)) grid <- expand.grid(dims, KEEP.OUT.ATTRS = FALSE, stringsAsFactors = FALSE) all <- dplyr::left_join(grid, x, by = dim_names) if (nrow(all) > nrow(grid)) { dupe_row <- anyDuplicated(all[dim_names]) dupe <- unlist(all[dupe_row, dim_names]) bad_args("x", "must be unique in all combinations of dimension variables, ", "duplicates: {fmt_named(dupe)}" ) } mets <- lapply(met_name, function(i) array(all[[i]], unname(n))) names(mets) <- met_name tbl_cube(dims, mets) } # Verbs ------------------------------------------------------------------- #' @importFrom dplyr select #' @export select.tbl_cube <- function(.data, ...) { vars <- tidyselect::vars_select(names(.data$mets), ...) .data$mets <- .data$mets[vars] .data } #' @importFrom dplyr rename #' @export rename.tbl_cube <- function(.data, ...) { vars <- tidyselect::vars_rename(names(.data$mets), !!!enquos(...)) .data$mets <- .data$mets[vars] .data } # lazily registered onLoad #' @importFrom dplyr filter filter.tbl_cube <- function(.data, ...) { dots <- enquos(...) idx <- map2_int( seq_along(dots), dots, function(i, d) find_index_check(i, d, names(.data$dims)) ) for (i in seq_along(dots)) { sel <- eval_tidy(dots[[i]], .data$dims) sel <- sel & !is.na(sel) .data$dims[[idx[i]]] <- .data$dims[[idx[i]]][sel] .data$mets <- lapply(.data$mets, subs_index, idx[i], sel) } .data } find_index_check <- function(i, x, names) { idx <- find_index(quo_get_expr(x), names) if (length(idx) != 1) { bad_calls(x, "must refer to exactly one dimension, ", "not {fmt_obj(names[idx])}" ) } idx } find_index <- function(x, names) { # Base cases if (is.atomic(x)) return(integer()) if (is.name(x)) { var <- as.character(x) return(which(var == names)) } # Recursive case: function call stopifnot(is.call(x)) unlist(lapply(x[-1], find_index, names = names)) } #' @importFrom dplyr ungroup #' @export ungroup.tbl_cube <- function(x, ...) { x$groups <- NULL x } #' @importFrom dplyr group_by #' @export group_by.tbl_cube <- function(.data, ..., .drop = FALSE) { groups <- dplyr::group_by_prepare(.data, ...) # Convert symbols to indices groups$data$groups <- match(groups$group_names, names(groups$data$dims)) groups$data } #' @importFrom dplyr groups #' @export groups.tbl_cube <- function(x) { lapply(group_vars(x), as.name) } #' @importFrom dplyr group_vars #' @export group_vars.tbl_cube <- function(x) { names(x$dims[x$groups]) } # mutate and summarise operate similarly need to evaluate variables in special # context - need to use the same active environment tricks as in dplyr # for better performance #' @importFrom dplyr summarise #' @export summarise.tbl_cube <- function(.data, ...) { dots <- enquos(..., .named = TRUE) out_dims <- .data$dims[.data$groups] n <- lengths(out_dims) out_mets <- list() for (nm in names(dots)) { out_mets[[nm]] <- array(logical(), n) } slices <- expand.grid(map(out_dims, seq_along), KEEP.OUT.ATTRS = FALSE) # Loop over each group for (i in seq_len(nrow(slices))) { index <- as.list(slices[i, , drop = FALSE]) mets <- map( .data$mets, subs_index, i = .data$groups, val = index, drop = TRUE ) # Loop over each expression for (j in seq_along(dots)) { res <- eval_tidy(dots[[j]], mets) out_mets[[j]][i] <- res } } structure(list(dims = out_dims, mets = out_mets), class = "tbl_cube") } subs_index <- function(x, i, val, drop = FALSE) { dims <- length(dim(x) %||% 1) args <- rep(list(quote(expr = )), dims) if (length(i) == 1 && is.atomic(val)) { args[[i]] <- quote(val) } else if (length(i) >= 1 && is.list(val)) { exprs <- lapply( seq_along(i), function(i) as.call(c(quote(`[[`), quote(val), i)) ) args[i] <- exprs } else { abort("Invalid input") } args$drop <- drop call <- as.call(c(quote(`[`), quote(x), args)) eval_bare(call) } #' @importFrom dplyr auto_copy #' @export auto_copy.tbl_cube <- function(x, y, copy = FALSE, ...) { abort("Copying not supported by tbl_cube") } cubelyr/R/error.R0000644000176200001440000001050113574521435013402 0ustar liggesuserscheck_pkg <- function(name, reason, install = TRUE) { if (is_installed(name)) { return(invisible(TRUE)) } glubort(NULL, "The {name} package is required to {reason}.", if (install) '\nPlease install it with `install.packages("{name}")`' else "" ) } # ngettext() does extra work, this function is a simpler version ntext <- function(n, msg1, msg2) { if (n == 1) msg1 else msg2 } bad <- function(..., .envir = parent.frame()) { glubort(NULL, ..., .envir = parent.frame()) } bad_args <- function(args, ..., .envir = parent.frame()) { glubort(fmt_args(args), ..., .envir = .envir) } bad_pos_args <- function(pos_args, ..., .envir = parent.frame()) { glubort(fmt_pos_args(pos_args), ..., .envir = .envir) } bad_calls <- function(calls, ..., .envir = parent.frame()) { glubort(fmt_calls(calls), ..., .envir = .envir) } bad_named_calls <- function(named_calls, ..., .envir = parent.frame()) { glubort(fmt_named_calls(named_calls), ..., .envir = .envir) } bad_eq_ops <- function(named_calls, ..., .envir = parent.frame()) { glubort(NULL, ..., "\n", fmt_wrong_eq_ops(named_calls), sep="", .envir = .envir) } bad_cols <- function(cols, ..., .envir = parent.frame()) { glubort(fmt_cols(cols), ..., .envir = .envir) } bad_measures <- function(measures, ..., .envir = parent.frame()) { glubort(fmt_measures(measures), ..., .envir = .envir) } glubort <- function(header, ..., .envir = parent.frame(), .abort = abort) { text <- glue(..., .envir = .envir) if (!is_null(header)) text <- paste0(header, " ", text) .abort(text) } fmt_args <- function(x) { x <- parse_args(x) fmt_obj(x) } fmt_pos_args <- function(x) { args <- ntext(length(x), "Argument", "Arguments") glue("{args} {fmt_comma(x)}") } fmt_calls <- function(...) { x <- parse_named_call(...) fmt_obj(x) } fmt_named_calls <- function(...) { x <- parse_named_call(...) fmt_named(x) } fmt_wrong_eq_ops <- function(...) { x <- parse_named_call(...) fmt_items( paste0("Did you mean ", fmt_obj1(paste0(names2(x), " == ", x)), "?"), bullet = "*" ) } fmt_cols <- function(x) { cols <- ntext(length(x), "Column", "Columns") glue("{cols} {fmt_obj(x)}") } fmt_measures <- function(x) { measures <- ntext(length(x), "Measure", "Measures") glue("{measures} {fmt_obj(x)}") } fmt_named <- function(x) { fmt_comma(paste0(fmt_obj1(names2(x)), " = ", x)) } fmt_obj <- function(x) { fmt_comma(fmt_obj1(x)) } fmt_obj1 <- function(x) { paste0("`", x, "`") } fmt_classes <- function(x) { paste(class(x), collapse = "/") } fmt_dims <- function(x) { paste0("[", paste0(x, collapse = " x "), "]") } fmt_comma <- function(..., .max = 6) { x <- paste0(...) if (length(x) > .max) { length(x) <- .max x[[.max]] <- "..." } commas(x) } fmt_items <- function(x, bullet = "-", .max = 6) { if (length(x) > .max) { more <- glue("({length(x) - (.max - 1)} more)") length(x) <- .max x[.max] <- more } paste0(glue("{bullet} {x}"), collapse = "\n") } parse_args <- function(x) { # convert single formula to list of length 1 x <- unlist(list(x), recursive = FALSE) is_fml <- map_lgl(x, is_formula) x[is_fml] <- map_chr(map(x[is_fml], "[[", 2), as_string) unlist(x) } parse_named_call <- function(x) { map_chr(x, quo_text) } # From rlang friendly_type_of <- function(x) { if (is.object(x)) { sprintf("a `%s` object", fmt_classes(x)) } else { as_friendly_type(typeof(x)) } } as_friendly_type <- function(type) { switch(type, logical = "a logical vector", integer = "an integer vector", numeric = , double = "a double vector", complex = "a complex vector", character = "a character vector", raw = "a raw vector", string = "a string", list = "a list", NULL = "NULL", environment = "an environment", externalptr = "a pointer", weakref = "a weak reference", S4 = "an S4 object", name = , symbol = "a symbol", language = "a call", pairlist = "a pairlist node", expression = "an expression vector", quosure = "a quosure", formula = "a formula", char = "an internal string", promise = "an internal promise", ... = "an internal dots object", any = "an internal `any` object", bytecode = "an internal bytecode object", primitive = , builtin = , special = "a primitive function", closure = "a function", type ) } cubelyr/R/data-nasa.R0000644000176200001440000000205513574520701014102 0ustar liggesusers#' NASA spatio-temporal data #' #' This data comes from the ASA 2007 data expo, #' \url{http://stat-computing.org/dataexpo/2006/}. The data are geographic and #' atmospheric measures on a very coarse 24 by 24 grid covering Central #' America. The variables are: temperature (surface and air), ozone, #' air pressure, and cloud cover (low, mid, and high). All variables are #' monthly averages, with observations for Jan 1995 to Dec 2000. These data #' were obtained from the NASA Langley Research Center Atmospheric Sciences #' Data Center (with permission; see important copyright terms below). #' #' @section Dimensions: #' #' \itemize{ #' \item `lat`, `long`: latitude and longitude #' \item `year`, `month`: month and year #' } #' #' @section Measures: #' #' \itemize{ #' \item `cloudlow`, `cloudmed`, `cloudhigh`: cloud cover #' at three heights #' \item `ozone` #' \item `surftemp` and `temperature` #' \item `pressure` #' } #' @docType data #' @name nasa #' @usage nasa #' @format A [tbl_cube] with 41,472 observations. #' @examples #' nasa NULL cubelyr/NEWS.md0000644000176200001440000000027313756761210013027 0ustar liggesusers# cubelyr 1.0.1 usethis::use_version('patch')# cubelyr (development version) * Fixes for dplyr compatibility # cubelyr 1.0.0 * Added a `NEWS.md` file to track changes to the package. cubelyr/MD50000644000176200001440000000162613757153513012246 0ustar liggesusers728c0f47bffa715ba34d7c1c4c9fbd78 *DESCRIPTION 92f87050d2894835fbd50002fc4a28b0 *LICENSE a379d4656ccd49433e93be1116cb2401 *NAMESPACE b37a8f9b86e2408cdf39088e178497a7 *NEWS.md 808e2e4833c5c27b0b5d5c213fbea412 *R/cube.R 0b14ceb250ff1a80e9b85c4a4d8dafdc *R/cubelyr-package.R a08ae483d3ebcd598d3b457c77415561 *R/data-nasa.R 5a89c52a82025850e92506d79bef36a7 *R/error.R db0d8544280e19d3a969b26e4376bc34 *R/utils.R 78778c60c15e9547e62e467492bda998 *R/zzz.R 362044cd8088a41f051c0552b592def0 *README.md db40a0145d2a88069865e7f18d3dcf1f *data/nasa.rda 9dcb7e068dc91a7a3bf0b1e389470a4a *man/as.table.tbl_cube.Rd 692564712c8b75ac75c9c25452349185 *man/as.tbl_cube.Rd fbee8e8580b47ce32e7df1589ef6edae *man/cubelyr-package.Rd 6256032227b2aea3328ee0e031c184e0 *man/nasa.Rd cfc69501d7d88767f22d51123401deaa *man/tbl_cube.Rd 4191ab57e39adb798e855c0ca6f56ab4 *tests/testthat.R b469811b2d1b637ba89be91fb2fb414d *tests/testthat/test-cube.R