eaf/0000755000176200001440000000000014660742423011015 5ustar liggesuserseaf/tests/0000755000176200001440000000000014660712374012161 5ustar liggesuserseaf/tests/eafplot.R0000644000176200001440000000107114405735254013734 0ustar liggesuserssource("testthat/helper-common.R") pdf(file = "eafplot.pdf", title = "eafplot.pdf", width = 6, height = 6) data(gcp2x2) tabucol <- subset(gcp2x2, alg != "TSinN1") tabucol$alg <- tabucol$alg[drop = TRUE] eafplot(time + best ~ run, data = tabucol, subset = tabucol$inst == "DSJC500.5") eafplot(time + best ~ run | inst, groups = alg, data = gcp2x2) eafplot(time + best ~ run | inst, groups = alg, data = gcp2x2, percentiles = c(0, 50, 100), include.extremes = TRUE, cex = 1.4, lty = c(2, 1, 2), lwd = c(2, 2, 2), col = c("black", "blue", "grey50")) dev.off() eaf/tests/eafplot.pdf0000644000176200001440000021004013534247654014306 0ustar liggesusers%PDF-1.4 %ρ\r 1 0 obj << /CreationDate (D:20160921164815) /ModDate (D:20160921164815) /Title (eafplot.pdf) /Producer (R 3.2.3) /Creator (R) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 7 0 obj << /Type /Page /Parent 3 0 R /Contents 8 0 R /Resources 4 0 R >> endobj 8 0 obj << /Length 1369 /Filter /FlateDecode >> stream xKoE+qMH@!%HXvߧ15U8d/]鯫wV[ţ}~7ݢd2Q׻$^މJhq R%jV:'SZFIܑF6CIxG`4n4.P̀((+q ,] QUFz;:륟$ü͎(`3cQ@ѡ~m/*2U]Sh|Ww5]Ks|_uw}Csͩˎo q2fF+u#NקΗSTO&ɬ6@vel{ \M>ʵdcK볭ՃӁPk g9IX+V}ިeH%ݫ><>_7xAt[ܾ:V{W /w,hhCsx-2 466g@gSxXQ +v3`5]Lx]jDOC?; m$yxZq˵rҫS.f)]rwesٻu}1}Mr1#0kB/m3JΗ}]:#KOA$>ޢ`a?~a˗[|Z w \*S4 p6t}/f"".Ia%E,E o'%rСu0u\ s2{|8tF~VHfS/CH(?)!IjpI2N!!$c(飞֖5Hz?{W=6FP$\)(d8z& )0MŤmr8di8NYysOWވ.q#Ж<áQ`"po -YKq*AqULE<y8pVՌLQW:3DrC,prZ"8 Prt)'$MRWޕp\y@hn*` R)2!RáHp*u'8 R0MV_6}PDJ8ԏ\nZ z%Eq1zO#8aYƟ_S; RPK! uQ\&b t`kQ*xu`FMd#NBd$DK$f" I1|KKVM;({ NT~ߝ>j݄JDHTK 8եZ0:9wl}Cp 8wpYpwk ]s\䋮O?\OS?_~ > +`fAendstream endobj 9 0 obj << /Type /Page /Parent 3 0 R /Contents 10 0 R /Resources 4 0 R >> endobj 10 0 obj << /Length 5258 /Filter /FlateDecode >> stream x՝ˮ$uE+jHc*A6@l6iAʐiؿx8qvԽUjŌ쪌+^YԷonoo|KIrf%{ysozk-~÷oJ&ʿo0W0ۿ7?iu)uǷ/mgtsJ_QM,FsЎk.VqDg^"oXάQ~Kp9Jt%B9YάUvKXyvyv0+19+QQ7g4iguNp98^+q'8^/q/q8J w?BM1ܴƁG6?tJ}}?sνgk]t+?ݔ/~OO9{jW|tkV;OOeiL1 zw ~|}37oݽj޾N|;km1|^UMo.ɫխYS:Yά [:>^ Ze>e7߱{֍M g[Ƕm5G?Yzv8wu!4CCO6<ݘln;cX?r xKRԁXVǽ<PաRpFJⸯR,U}Jμe{9X².c܍|倲ejyW!5ãf{D~d@9ׁD$ 83IVIj_C e{+pf@rg$ֶP3>%0Qʸ4j@BH)VY :  "Ka&68SȗA\!z-32La=3PJ)iR0,:YRpP'k)5$*U)`IÇݕ~*/fq%g2dĕ\Dd%8+_#Rp ~I3Ռ/Y~gӶH,qga@A˼c)_@\yi ʈ+/$?aof;YB'dWB'D~w|]@ (VZK./< %YB3΀>с%yr%YrG\ H"q$m Rp1OY{FFoF;=%?}ZcuّJ6DklVfSen;i ض tB{A:-S.y_:9Խ T#+Po~>b /T]ry^TϬC;*;~L?ŎsZ1ǔcH9#v;~Lh2tl|vKSۮi~Su}~js[-g?+lԖԶj?~fs͟:/۹bq߶v}fug;Z; T,+Й(2@Z:@gV_*.R&|ѻu߯qn w+h[?w vƶqֺ]Q;[Ow 3)oS?|.=[đa{Yo݁B́C;MKI:뫒ڕ H8\>mGD{XQ.V>J z0]FݧNr˭Џ-Xf*]Bc33)-,uDo"RMKboތu,Q o51| ;*Shw`ɖrp`f& `R$LL!-d5:p6yU+d)+y}S?0ٖ[}QmBf6L:E!N j H:$NF"^fcֆccId:,q8;{a>2.k.+9d$3?C80m?0i[L~K2(yY,:ُLMoO~JUFo: H*D8ץ$pۙ p \gp8. vu|sW:8n߱"Oe >2mz,k-2__{DndB 5m LyJ}$du&?gKf~ֵiKXD4է~u$Am\zH$A}a.q j8C]q_}w1.-k{`2734w*ۦꂗ0EfZs`2)yfhd2w)Mffu`2קe1"}$̵ԁ\Z`fnm9su˭,q[|0ԍ1ġruAmEghljdh>u L>wLv$/ʾ6iެ@&Ca^23pαdf`5L27>fZs`P m< c_`2=L;['@RցDRuIQ;.EsRI$Eĩh]րSє['k^q>rNȹm}Gns0k52n42:/m3S>0d{ꭍ`n%mz42,yd{j+ d{*yٜH\2ٜٝ-ҹmH:?v{6+K$=$s :]ġX+h 'ffw`2Ԋ42h׈9adfhP&C>L'Opihh6^s 6L6np!q(<I.@R2 )j N[=a^}֛YT8"93uf 7}B&]ےLg ^0Mb,2#Zdo24ثO< v7|2ܟ3MF[`2mA&Mqs52x*yLDր\dDn0:".Fd"{D&rF|눸D N>7L>a.JZ&g/i fr :Ib&;ISdcWeԚf/^,~\zȤL6 !>XB` I6 2-"Kd$>x#iZOAlIյHAXДުIo`~5ױz4\47/>nEd'ćLs4Ls@湱@(izރۉTfY`4ࢫ.ĩjOT~&*?:Gx?e:PUN'k[jñf }kCC<֧+diQԻWEqvFL,8 F?n*K[-H}<lG`aZ-=Y0lBV%\j@Ec 9R\yPdH;!?s^O0_+zz^嫭,(T~vkL _d/t aS?oװȆu~훷~;;0V'>3 $')֫~Bʃ_=6-VC- -ғڷq&*ix!o6Ì `eW=nT\I0dR/'lv =nPw7 ՘5Bnӫt9=dWrv܀;us=V!SPH@80( 8q|8|)VyK=9^q/5/@809Q no~Eak_9ho~Y,͏sX'8M;̊EQU!3e,`A4 *3ȩbAm0MN/3'SsQAT~*m"mh]ZTꮼp|{=Iy#HlӐmJL Cz-1666JՍ4k,d:5gM#6Ţz*i3cSbHڊ%Hʪ8[XK ) $!f6I4%O]I>K/*^pH^Cd/LY␼5@&yxYLY> endobj 14 0 obj << /Length 13524 /Filter /FlateDecode >> stream xM-q&g)V~,-6 lB–hȁOE6+Sk G]SQ[}{KjY_ZV^f_z7}/}Oey{ϯ~O[/~wQ^F-)~{O9tOkmݭON,/{s/ߍ奧8nl:|u@2_:?`|}@Ľ>uSx3@ʿ#x)"_dwʯNy;MW)2~ /+ib?y֦~ѿyO_ϭߟ?/%?饼Korz8O;CIeپ%g/_J[o_VP x5/nea\Kߟn~u<%/W1WWh~uno-EOJ%?L&q*&8Bw:ʕUfmǿ2f%sru1sy Npy^T'C*9z j.'˘)rMҫPcYTJM~AUSOvvKwZ6ZcBdu.dZe ;%CA)M/fgvIPG6AiX6X %q1'c<;8l/J-H>3IP?pꩶ'mie\C9)('^+ SdB,EJžY_(8h=3V;xJ=="5/QfPkVU#`:͗,zF-F-(kbB`;[d<8P[9rd ;J˒K@XZN @G%G33S,zF/dUBP ,'}[|B gAtP^3eR&i+,s/'VGqT(K:fvVK7vF 3r J{b1d԰vO$݉C2R2C ;`d%{T6KQ(Qv\DvSJД_H”@4lJE92Y4KjF"a7w`^`͑LAX`,9t藱vdr7F-rJ-ĬAXb^]!މZzI]:KTΜڅBCD\D$>~9e˴ݛZ+il,@pGxp,σanO#e:s1JWN{poqyVWtwF\P f[Jy^;7V9iEk64/Fw5KyjHyČs]A{/;⒉':ԅ~=>[y٥&wigԂL'Ĺqgp/₎eyW$Ο'c N!+m/o3^VkOsnAg.ݩއIu׵[%c1WHy fk6sNݕQ'?~+g7F{})(ϳsFM4R1{zF\1ԓͪ"vkpI-=%+;PA{D\>82G'ayQD}9)͹Sa:⥢3ʛZ'6 Y}~|p1K}@ybiO LF}Al׳4?=_҃יXWhb،yR?^kbkZ0[z6-t<sv3M ~I=HXfMOW{(Ofn7x,jc;SnhvvxJ>c=j:Cc{{i@ݞ7*u'OoX.^QǟݥDmᕩQv :߁Ǣ~q|5zYz9]sY 1^c.q">fF}޵=<xXxp=quO^ ;\_Ĩoe<˝r{~ɍC==?T6u܃F[f޹qz>Jﷶk)S+1[y(}]X?5/=DbwKWVcNni/7E3g?{\[n`*iaBo6j|O$b·暨/mb_w]p\*uuol9K)qj6q҅,b"QXxqzƣܸ1^tbS Cl\pK'bF}<·^߽m{/bb3K?6wg/"F{ԧĈe ͝-Qcն>f|O\m1cL-ż5l7#߁N'V'jOI&s:7q|~k}!]}*Xχ:׌n^H7/̗df}UwjK{Ꞌ$y'w{w.Oدw'iՃC[FlK5KE>#=6C=O^5w.AaGѨ/~m {ڇ̨oa3ƛEȇw5Kǜ̳Ḍwy7w5 Sgs_k_C!BxD\=wqY VgVwSA7n^_y=f}=?-u+uvԷ<*w2Nl5F==@ȯg'ߗmġ%~k{juŒߙ5=KDE]sPxz/.ŬtaL臃Ѷ,$e(ϋNbn|OD\Ykbߦݼ3h32pшNJ.\y,jwsi}MYcR0IPֳ)Ϸiܬ>]2uwkz'ԨNׄ5Zǃԝ=Q^z:ؾ.Xoye1#M'4x|`K{xy-.%fjh6Nx>!FQC{4[K/ÉG5Nf#x^|Id(0:F<l(qF~х54Ĉ'6 yz+{x_; F50`FyuaXfċq1P?K+q|aJf[>"獍-mXz/olᕎ(Ϻ~PGtZq&Fy>\|GĨ/M]͒x^O%Fy<Jı?$sK@ez{aUxD}yĸdAx`"2/=>uQ,,s~b}13srh[lf9^Oć(ω-tf>2kYXb7_k,}XZ2]YGsOdb`afWFy]VFz)\&w2K{uUO=\y`=6bē 1O^Ԉזg@]ҟMxtiÅ =tZf=BwFys1kzD[~x1c/X7.fl3gLĶϓ=O< N^ svOjwnΕsXZwFF71Y8rwwnVm=.[8֫{l70W{(oDzycy{7kt{Rk!^,Z^פ#oVGJq< $.80g~yejT kz ,1f bb~3#?ch^ky/YߧnRh:|e<ҍO|z{ϯ~Ot8/~[nuܡ~?9=Y% @ܚu^qI|= NW݁ eC6eDZ=6,D{Psu YQTȗԋQø~DY.姳-Niɾ['np fb`xqtê@!6~L:UIJu~16Ϗ^)O[_@ߺ!a`z"} glNOŋ؊ʜt :xm[ uik02ciklFȡX uh!3.{$q~rzbܯƠ]k n?_Nݮ]]5Qg޶Fb祡qt޲5Ӗ63fI4&3I:KSuvKyۍxҫ4;z`(1c띤MfK?%c1^h-HmQnn4KMK[ƕ[%Mh_:N>'wi9gj,tJ{Sw?ߑ0ѾtU9X0=ݖE Q cO|񒟉ul֡h_:9dY.Hh,=uhŅn #ol>}Dz~#xq=Xt1q5ƢeF榮O\܅^<=}aO<:57z3맱̨/M3nlJƏ!N܍ؗ9i֡Kflmu Mf72`_Z0_f+/Q_7_5Q`K [[xѾp553c뜢]HS+y.j,W /uj037̥JxhGkEaf~}*mϻ#,_eq}&F}WtiLf,ot|GÑ:{S}.:u/+~z===T|,1[3ExhcE{|^>k"3ڣ.o牳O䞋؆6č牞JbģX >pgo_=Zvqo1/?ߘó{{#3kUFgEX\s6곪[ӽv[gZ]9sZ6ܸނ,T5Θ{&b4Q֐"bsUQ .>&Ž5bk0j+3ׇ0^Q~=Cb{UcxhKUG-j[`if'VOԈWeiMm 㡭ub+,^G 37X[bg[B~:۷i>;xtC@OR?i[ڦ[SJ3~O6a\u@oLy$bHςߋxXoM uE߸?%Nf .{2\'?qOt77[;qgw'tKky=zgNmSӥŘ,=ophO/ΌX܈Z:J3׶kG={pxbh{x͝Ͳt11ꋁ^XKb+.FlkL3>th>6PghN^k0W7b<џ2ur-MԈgN eF}1Do<I}A ljI/K3|10bxȯgW/XZ5t 淉-?<&Fy94T0kb;>"FyrnhM~ L]֍,K7gUqaMtoOl\ZF,K>F=si~#=r/i@\7d^6^2gtkyJ\`.Mک?m끌Ә0 1ڋSfn~={]X\~FP_{ K=4.fMh8}&2#ZXڂY*f [{{,]Fxt\?f51KGZq/j-c:}?X=aī[+Nb_,N|{?v= 1ʻ׉>m̌xS63O bgll Y[h`F}uցufW̨6ף fxdF_IЖ IJ49qOҟl[SksF5ssWĶv2A=Qmds1O>0#^nˏؚ=Q^;A7;{WqXڏ߅ZKJ"ڶn׆mmm[ҿڶ׉XZ$Ifl t hNt!Y' :8Ѿu\Ҏ+j?^+z;}' 83[KoIei@ҟŜ̚gwȯ:[Kb bfl} i4f[#a efލvv3#dzZmn>ڷ:4ڗΗ77׎[foHo[f 5fun~ao,51\N={Pk{@&~gO􇋥NP&^oZ!dfz>KEܘ}kH[ZxܽY#q"b;7==exFoXt%קFzjKo]Ay=F}Vt+z 1nfy`9}oC}":'>#Öei|$Ŷ֓ qɰG23㊭cmqltǠ[Wjl#>/ĶumN̺˶ά:ߏٶnbn̶ށ}xά%p^Ė^u2:zFѶ|r,!Ķƌx4̶;d.Nww[ݽ~?ٯWKn^==Ğ/0{zĕzz~}띝{=[>敹{~^^0b+o1_<9R Lm1ݼx2K{|>5|کџ%ߓ.[kÓٶvGN޶f!|TĈ'%"bl 0A|zf{um ϬUx1lqqWn?],; =lkhK2p=-xoMOͺ󆭿{Qc͆ bu]~do-/d vF{33:&~Ļö& ['wuhۚG,qߓ&qm[\o4'Z~{y$F{c<7Xy%ߓ8[sf]cF߱5 q_ݨpOn}_ƃ^ #GAzF}Cl[^ܶxo-2:148oe`/sWwӱ5quk)S[z7lNR{y6o~6ڛQjfݨ1e_0lkhccb_O?ob.foBvF<0om6-,c=}6ƕr풹{r'OgFwOš_m-N\>FӾgr.ӽYn&fb.FPߏ͏xխ{dnO5[me5F|hbijx51ʃRĈgFb߃#oǘyMn\Vш<#֑b<܅z=_Oys6⽉{s{zh[u:zb=iQ_D{!zxcN3cA/J=ܴ?[G}B݋;ѥPjn:[ykC_^6ߧboaĖ߰^cc=EMy=|2z^\j|%?3f$Lbm~1v`lX1E8gf􋜃/(t%"weEvґ85tMoC%ZKe/Q%Of*DO#'7x2kyC8%3$ib-~^r0vdlŘ6=Zbl=1Vg c9X/ggLƑg:\2ηt33<6#Y~䜄g'D%qNSLm 田'# -{kqemD\ݘc3(u/δ"̖q Q*aq6>O cu6\IwhU췰 csL'.geX.? B4.9{H .f/*~Tk=.Jٖ2Zm3s0ᬄhL᫜?*>ЂJ3ROUtHyE'jF*E|a,a,gTO5'Wf؜튛/ڇH<Тk""aa$2aȂL L2m> 0C6g%__`aoc,RD"ܪ,V$2aA3m˻Zu˽Ht˂;]Rc˜a$DX{\+Җ`UDE_u ؍B\26gc+Jw|XUW䋴M.K^ ̈LFh6tQuPm:mP/ll̕0mgdgRqTˇ*j5oA.xTOHN-IUX#LkU$Bl\LX ٧]Zȴ%OH3u]u9Mile{沆X(jw[F"Uˑht:E1{12tٺHj] _o ]J+؍bkk۸"(d~iH'͘Nτ::Å]\i<Ba6ʋ!s^r3EPgh6{4Y%(C>PlH؍R>~JX2fgdL+*f6K,Cl`ΌY/>8>]J+Οӹ.c. M9[?n¯>ϟ~_/~$?~o_-t,{QLݺ~o嗷w_ܺJ-I( 7}oWU|˧tgP-)~{OY/ujQԮ3U,lM?4zY,M|Xt+nnjm5ʅRn}=7v$tyOV;~NO#bO:mt||OEcendstream endobj 15 0 obj << /Type /Page /Parent 3 0 R /Contents 16 0 R /Resources 4 0 R >> endobj 16 0 obj << /Length 13492 /Filter /FlateDecode >> stream xˎ,q&y\rHHH hAp1CR6ן0T]Gf&?Vtd%W|__o}v[mm[ۿO?A_/~q寿U?8ߺn77m_W%neͷ5v1ӟ:\[wFyP|~w4qx,Tzw$f' H1JHw4DwNi / w|͛j[}Y_w7ٯR[#??UN#3/dXxLw ?:DxE b&܋sic= ץ;u< vKd,:w!^l"ֆtI#w7u9h/œZԛy#X~ΈC/gOjYNjW-X/= ս%j7%lif߈-Wppndf#n>3#)I\ĈgJF{呛>5u7kzEw?OϧY3fOՈ+zrYUx_ĝڮW{-Q^.؞wEzG#*hr8cGD#;,31ӢT~>h/s=E\9w2sRg?y[Tb`FySC؆rA?+ӏ.f#O, uxި/z'bBz:u'Gg{2RL󣢭6פjxS=|Xx:3QTQ3O?^K}M-ˠ OQǻ=HTȏhT}4>V}ig~̸_gd 󳣇IĈE7qx84y'FyWusIܬ<, 1[ŋ}UP1g?'?~/b+.=j{S Vf_U۵Q^;urkz=,a.F}/pOno}Fps=Y1ynqM >f7 E͏Rޟ, ^hYfgM;QHJ.{:FF{;O?N8bNpA=̥O˯MM 3dn[~wjgMfK&0=tNtxiϼ9G6 ˌi3I jy70ɇ-S=ǢF{N:3uʍpog3L=݃3 |? |R;qցEbMO~]J^iy,ۛ)Xaџӵ?%}U:=/a lVj]s?1׎k7W.ŝOMVǼ+ܸ=?ݓCܞJ{mSWO=l#]â{XdN杩v:_WsIVޣgy푨^1O\q6LmsꇜĜD(diO\&bw:bH"]˘?5K~Ìў48N暨Q<6ʋI]V"NnZkx!G>n%$n~1-] 9j:[zψ>`b$kD=ݨoJP&&׳'Qe<@'-ib2qvRg>khÖٞW9 5Ox7v㞟p'\{q۟wu0q0[׳=&u>2uujw[Kbnv?]{':1xx[FЯwC7ējw:^]y.4k}@>E}afdzk^~|+UWwr{<(+ċ⽍{ jóI gn潩1cfij,9hOW=ԉ!>D>hoLYQpͥ'OWjīkF{f6?_>u-eiRqd#3v0c>}TԎ+Kdph{0Cx+ўXo;x1Ӈ>%F<(kmdnAΝ<,6{\^uO!C~?Q?IVz+s71͚Q|AdFLxl_hlW`=Fdp񌭁GlC_dDĨeb,2pF$XbF-HmSWcnݹ{Pk|ثQ4ꋬFDža23[|̬zQz*ģĨ/d=]1'=|8.x]>D}‡uxP#Wt?~r'n]s8̝^u=toaܞ2_ʻRwoG}Ḳr'Ķ^,k4sˉzv}ip6|Xb+ﷶϮ6_W,Yӳ$O^='x\:O(/~8m[aA_F.Dĵ&m;{_v1*x̥ǢFyW==ke<-Ĩe=B|{Qx,&c)Sw'q2NZz|Mx_u 1]h4c<tRO]h7 |爗[O/ҫaRn8oĈwb5G;!Dbb5̗dNfH 3[zMfF~D|ΌK7^`Fy{'%qE2ߎY߇/3ە?x4Nf!F aF{zeoUj,œer''_W ^͍z՟c#F<4Exm~,ĈG6\߻13KeF+ww7fnkEaFs5kfO'17ۉџh{#F'C5%wZ}kzf<˕{{=652^JuM1¬f~~O|>_c@㱞svK{WJ0߽f<c ,Y7c>)136ΉjAb}*&u1k~Fza/nǛYs/ݸx=]{<0n H~m'uE~Zk}Z3sA</77<{:1"|e'%F}Wc =6қwFyZQ|Ws4WE}̌Ӊ(o1&g6c.Mҟ\c^ߋyU|oA)b/ n0}4FwxkKtbGՆbbm/֦ Oj#:Z}'en߶QWdk{x> lY75qwz?ivwzg|:dnɮEKESo~{KAҭN;'gG5[3޽~+>N:2ж/S[?p!i;plx(ЦHGچhjwְ.3@"+ z1j}]r/Y_NX~<{Q u6k+vʈG7 mnR 1iȄ.SO,[j"  'b:0طp6_IǠ׶^lͬK#$]K#$]c3ڗFeUC-̀=u ^90X:(i{/=q{}qR7wO7|9qwvIԖt 8Dz"._Gf ^^hٞkzְgO[zpX%ҘXZ'kf,M%^- o7eKi[cٞ~Čw6--t{y u:G]ݏo,5m/m-{Wjl 4}8nǜ%Z朩Wҩ+Ӗ>M|GDUI3cäKDw[mFAF\>bS7qbK~&ֱY}S+g h֡}f^:5t Ke[=ڗ8s%bcՖfYOՓ`֭b֌Ɍ'1G:usϷ-}uh(k>qq{z=y>xuj<3A nfOcQ_dfFyٔK;g]C/(s5ӬC(hod7`֩V^nj3<3<<*^Oѭ> <}ikQkz:g9EFEVR\XZ䇳=^+`f,o K3K{nф׊~|-sT:'ڞwG~=Yf=}&F}WtiLf,ot|GÑ:轩>z麉E?=S*KK{-ƍ`FMh{ -y:"M4qy(Fn­ϻ&پ+{q/]ܛ;7&qxޞ:ȌZ9/|{:zcOܝ-}Ƽ;?6hwڌُO㙓rti1f=/g>>*wvOj41ړC3<7EVNfxA=-=t>8ZQ|,^`F}7Gt{sg,]Lb`뇳--K[zh]",Ml,11ڳSWbF{i--cblbLmKS'5٩CQ_L,-[3O,@<|R_4BpqbkR >bbdb7L18+K&"x >l`n~,ìmb&b(Q^N, >̠vDy}eQ\85{_bSx`Fy3u#s1 ynܯ~XZs>џ)^x퉫Y%rOB]xG*kPPkIIV^DڰbumkYwP:1K'w07ԇXz!F} ^,6=0g {HR#uO\qg{Rw,ؘܛz=y!N5HfFy\u m=tkJu?ضn׉Yv?{֙U1 C\̍;ϙ$K{S׫Nf<[W](ږ/^:e<ض=ޘU]ٶv֚N}kr]ÞzݛW#z>tO^u'O< xc'l_=>_WnOy'n{unÈ|)blOgckK)3Lt , b=L׬jF|Oo Of:1{ۚ!طvn3 [S#s'+5h|b 陑^%֭5pxdkEiG{Ŏbt|Ol":ΙQt~4}wn=}&Fzطi`m^^xqzv༭]ݍڶND͏׭[ǧLmݰ5:q2KyhuhoGYқ9wx'F{S?u 1e qەXو8ݏmzxt,Wӽ_o]_Oo뉛{pO'~ǜ~*Y*WZ׻˵Knɝ>m~}Cp~=偋~ڈ&g^qUnOZnL={>xb]8=15\}|lbīs7?^{z= ߻#xl7Y etO^+j<qƝmQ'w;mQm'w^2_y/I[ %:?q.O9}(VA{ŝA|'f䷆ۣ<ѣ<q<;/_1Kxr\fW\=>X;.u1ш3/-7w2W.OڨϖmNOo&jW=n^m=3^'/Z{ݩߵ|f' ROsݩ_0Ϸ|:JGzVb/E&ě='5!_u^O<;pͽ>9qw~Iwq΍+⵳3S^&^۽Y1Wrݸw|M{~]sciO|cW_r(fo qv/Kuۏ(دއ`mO,!-az;u12k{4:d> 3·`J~[gIhUu#k~1v`lX1E8gf􋜃/(t%"weEvґ85tMoC%ZKe/Q%f*DO#'ΗxW!vŒsjr]FZ/9s26b}V _Fkt_r1E}Ş3l۳3&H3?Y.Ykl?`̌:q͈l߁09'ai Q`G1B#Sw@[9% DHyuByiYE>e8c7،32"D@˿3mtż>BH)%F܂nJXdSX19;!BĬ4Dҝ?$d`Z0-؜+# Y3V6>en͇`F?xR/8"˸ j5F?ZEeViLL8+!S*'rʨҌSf>a^I0Jc :e'EXC$SB$#Sq6Fi% DY?v)Wd)Xkl?5kz"uM$­bE"V;ӶU܋D,%U@>f/Y NBUgո"m Zu HTU`ތ(!+cs6ຢy̗,91YuEH*ڍд"HX̌md FkCQ.,P զӆ 2&\ vKva,KU|@;&]FDj:[GtI"4]5ʹK_E"ńչ }EL[d q*ى9SYU#єVg.kux=&{I.>Em$B^FM@x#Q#.CDuP>еpkbKݸ!A +⁞Bt܌8zL#1\%ƣ!ZOf8":p9%7^/5qm#G[8X?+(#78+cvKKN\J?bf{r Op|3+̸ߌ٥T99=Д&uHF-No_/~q寿t{_d)onkWno:/Y-N: u6eq8_Y~]B/;no-߾[X[traLw~?_~_;NRuN"Ij)}<` YjOyendstream endobj 17 0 obj << /Type /Page /Parent 3 0 R /Contents 18 0 R /Resources 4 0 R >> endobj 18 0 obj << /Length 9983 /Filter /FlateDecode >> stream xˎ$q.}=E.g jЂB! 8_oUWfMV`;:2.~w|%_7?_~N2sk,s/|w˟䠧_˯yJϫ?տo]>`<__PRznzu=r9S}9|u@{_g|}r}J.;]OznWO%o$o,'dzyX2ڔwחO?'=qCտ?ߗ7O {9w9 u&yePJ:xXr~w߯/_ӯloeJ pzO^ǵuOߎ #倒/_0s_W_xd?I㍴瀿1߿o?^%ݑC!}Tnr[}=NPڐLfnq='X#H7Nsgp?rUgy}/{,vbH8O(i,l$'Xwd}.&- VtAA;;籹Yy#ihn@l|(ӒPp*L]=u=svo2u25膆(Œ#=^oAkz 跜gwݹ-E=3wcp:)ן>v5/\*2nq7O_W͍F2L{{=+v`JpBzg9 <,;qQ`> RpG['j.C7ss3hm>W1SOww8w<j;?fOr{z'5[FzR߸=uQ#?-K~8zX{lGwt嚤vՌY;ŭ7oUҌgW.&_t𑰙Hg'+d|Oqy;ý?U}Nl%/Wg/2K|ͷ R_#,y=_pbf/҉ۈ<$آzt@MLfڞ$˝{pM]mgw.szp/cPWnO/ep'N^Z V(:y|:$)U}|BbNdF~t4̤=\-?=p>7tEp{2eOfýyĝ{׃g-^y;.]s7:G1}~:Y*17+'51gA9DmbHtEP奫JXʨ_Қ]y݋1;wXU#m$MfgJ eIITk[K0$ X;!N%Lί&U{ Lۂ)h֨ |O291/!c6̨y&@g]Z4*ESAD R L5zni%O,ZZB&P7hWlx;3+ܭ#;ښl0;Ȅ+\A0p6G58=h34Δ'!:A8"+2 Z{:r`7.J{8'avڃ%h맥Qzؑƨ=X۴UAicD1ֻ07/T}~3l2v18ɨ+tfN7i1VdCϺތHHZ#2e2&;xlJ&XVQnABK:vmmMұ?~č:;q I^1w?xh]9_(.'Ì1I} vs6NluatYHgg[[~,f[!!1q<$؅[Z%uI5(3 cw%ĞFV_([1K};%f= ^LRcEbA{ln O3bTŪ{P[l=f|Oem s|[-O7M;|3^h$i+xgk5 $HM,v92`*އW`F{am qغ6bŦl:bvoZ:5;bMF/l:ےzz}"η5G1x_oAh d(Kl-vεbF{apE W&O ؏lp{$u-x4=!z4C=~9s'ݬ8;s ~/eK~͵pgsg.VWbصa^{h07yۍqS<?חĞF8;-=u }MV׌پWm2wg,MўVGK46wDb][piÏ21{}xu6Klb} Kf80w?WjKMl :[]C]cSA-=bgw=hy,-MY;]m';t&[sj?^Cb/l\|R~N̢nfAL0tkzF~8PcΝcP7=O!~?qˤ.F7g_f(x\7c~>Mo73u㵼N~? .g23z5=F1P%x@} wvW^7j{_{});^Wf-/tL݋: =Cms}fl9Klnb=ola#/;f'{1s>?̌ŦanJp1a`|KymڟgYnYCwo'~]հ+q6|F{j“hzth;aoruvp569s3K}xMls2gF}}鋏̥1b<؛7򛉽ҢٽQ[ΌF}pa"8[ւsc1ƣv޼l{~dU1xݸ{>f;N=Qߖ(u;5c[%0{aT2ҁ#flcF/ޖg/[ ]b N3Ƌeb44{%FֿxĶFҡFz5^`ސo91w.r*w2ިш/q-5bcaT#?%{+%jL_lbN,7=6K~L\xɏ+#enYyru![kx h7wwܝz;푸{Qwߕ^ҟ@lϫcoh2wjԶNXw=@l@y@kym{+bof=xq_osK_ʙ;})WjK/p=1wmeFz[<9'jlow6rLm7&4=h3x:uoh{6b[|36%(o3;!^Mb}_{-F,|ݹydjW'h|aohM>&ƭ P3@{^]}&ݓz=;7wze=F}2.t}ݸ}q7w3O{fnըmJwgf}oJE?wIl^y#:&s7'l{$;l*^OlO9Z.ԶwbA~}SP/jO68^_,M(+o| bgEsP0L\VjۛsjeZ^"F~Z63l~ӺwtO LmI .9k.f<+[OA~-)fNF=x;9_]oljۻFN~l|oLbW`o̒__џΜ̺7q4ڣ%Q^U}g~O/Ex&qߓjދ\׉z11kmoĜ̵Q>cu>,e{˶^Do[c[(O+ֳޱ {}Ǒ=E(ow wa^ UwfmXO/h:q{p+6WG{hI4-#?FL>E|[|㖺ݸwɍ{>1O(a 1ʣbg^+:~\:&nfo>4u7K~F3m7z4ʫ6~F~ݴ0O,bK{wG/ab|}#?F~o퉑 gvjۛ=x s6K}8$V_E{Ĩ =G<5b|oCS'q . M^֓07n F}{h1=6[w4;޲S ϋXg&|ѶcN뙈w?QvԶ=#=L:;y}g"&| <Щz4CS?t3롈wxNb0h<ŏګ[ިYSoD`_jt="1򓭁ўXoz˵QhgmX]܃ۯggj'm[r_BdOoj^hl>"^o7-]fy_Uod bOjBGMhOmk7ky}wWǟx>b^fg`O <*%U )[YMjb:jY3t (ɬj5L _&p"'nA{R4B>UGbKv3sVQRUڲTyt@sEx "6̊[6adzoRF$5&$P'ƽ Zs9[۵Jc$n e<B\#Oc !CHdC25QS.?=˳pVk`m:lѫw>h[;-}8^=lbIe{/;,A'giIc1#vEE V&a{lkO9_FޗbT ׽slo铋0(}ombKz޳'؝/wu׹̶нӃHD`]#v6_=p;7}mFl䓇 @]K2es۲&ܾ^EZد~N>wcgj}C;scV*~GyYbkN ;;ؒ'JNNyo[2֖VjiVO 08xZcX:0w?xo%ٟh闟~//F \d*U.0sk|w˟!ͯIC鷿z44҇qΞױ$h{Ov2|?Yy}{XKk|:7~}wO,o=ٺPM^OW?z?z^$9Nьul]|o aendstream endobj 19 0 obj << /Type /Page /Parent 3 0 R /Contents 20 0 R /Resources 4 0 R >> endobj 20 0 obj << /Length 1149 /Filter /FlateDecode >> stream xXMo6WR`P11Z=9" ~IZii#!i-.c(l1J q/~Խy;qv) gf `2yǘgCv5oftнv ʣ`j|QlV]eVZbj\61W5N<+sFԉ~: 5b<4<,ix?ŵQj>QKk'xA CPS*(>4<߄)(?u ׅLWfOĔjRKcK^t绿nҽ~᫖xow)SuiӴmĄTe cdEդg.a'3Ȋưn#1Տ1lnF#OF S1#a(}xЅ1ؑ|nNm3=c|-P2T0BFr2mǥurJ~F1T'|zMGs]E3>Gv |ȭ=^#a*WQs5i["͊M$q{w~}l8u=]]mVln;ֱw_?byw zo/bendstream endobj 21 0 obj << /Type /Page /Parent 3 0 R /Contents 22 0 R /Resources 4 0 R >> endobj 22 0 obj << /Length 1142 /Filter /FlateDecode >> stream xXKo7ी|(CKMaE !UD ѠCw9ݕAYpoF[ţ) 5Za,(K<%wz(5A|k>HJ*%~kZ-[S| -p/'bB}kAཌC\! L(+x(+D#CuQ S0य. H+pb{B KQl]";bt=*&O'Tab(1d|:FL>"&P۔?NxԼ7 C;mAf>ol#ujdBscx.Ǚ[/0 ^`zop95,0;v vn66&^⻍Dv&O<}Sah!H~,o:˹z-aC]n`3XשSVaV19- f ѥWWp*}PpU0'z*3\w;I(YH>O({K,~f9i):B)&s6>5d獱sa˥@[ykN-묵qg%.ɨ ՔX}yۋܦ%/Tٔ:Z{ъ)/{%x9 @ hFV;ƺ>㴪c @<uchidh[Cwg/XG*-+'79݅dgu+o&%ܪ1y&BGc󌉋)<> endobj 24 0 obj << /Length 1359 /Filter /FlateDecode >> stream xŘMo6<ڇ2tl m@IE WЃ~I;/u@=/6NE)tVGlko׭zlԽz|kuulTo_L[^VQu߁6F.0pn'˙0ZY:z' 0d 1œAڀp4X$!+Q{7~njAOA 8VF՟9ss`C C=j}6| V1CXFp\)z8ǻcKKe!dW.rlTz#~TUv`WnwOwXmek;RcmD ^5$Ku욨YuJ}5]1C:dsI'sK }v.L ݩϗi_qHdc W< seӷIAR' Wj h&igG•+]=Qx. rrbbr br_GQ$\~Mkd ,@Y4W;;q*ڱ9EΓnּƱ_+Osy'u|~.A _wKʡvzaw,>~67|͏8gMD.O0;Pat<}!K+b6Ʉ^l?q4Frt1ev2i|$>e/;6CNc(g # Gal)!Uw/SơYYu ff8Pʛl2ǹt'au>b_lizc߇iBSIs5i^<нmp'4^%n"_i|gQN[Işǧ5/?dq?_I/i*9t{|>px9&q0Xkendstream endobj 25 0 obj << /Type /Page /Parent 3 0 R /Contents 26 0 R /Resources 4 0 R >> endobj 26 0 obj << /Length 13524 /Filter /FlateDecode >> stream xM-q&g)V~,-6 lB–hȁOE6+Sk G]SQ[}{KjY_ZV^f_z7}/}Oey{ϯ~O[/~wQ^F-)~{O9tOkmݭON,/{s/ߍ奧8nl:|u@2_:?`|}@Ľ>uSx3@ʿ#x)"_dwʯNy;MW)2~ /+ib?y֦~ѿyO_ϭߟ?/%?饼Korz8O;CIeپ%g/_J[o_VP x5/nea\Kߟn~u<%/W1WWh~uno-EOJ%?L&q*&8Bw:ʕUfmǿ2f%sru1sy Npy^T'C*9z j.'˘)rMҫPcYTJM~AUSOvvKwZ6ZcBdu.dZe ;%CA)M/fgvIPG6AiX6X %q1'c<;8l/J-H>3IP?pꩶ'mie\C9)('^+ SdB,EJžY_(8h=3V;xJ=="5/QfPkVU#`:͗,zF-F-(kbB`;[d<8P[9rd ;J˒K@XZN @G%G33S,zF/dUBP ,'}[|B gAtP^3eR&i+,s/'VGqT(K:fvVK7vF 3r J{b1d԰vO$݉C2R2C ;`d%{T6KQ(Qv\DvSJД_H”@4lJE92Y4KjF"a7w`^`͑LAX`,9t藱vdr7F-rJ-ĬAXb^]!މZzI]:KTΜڅBCD\D$>~9e˴ݛZ+il,@pGxp,σanO#e:s1JWN{poqyVWtwF\P f[Jy^;7V9iEk64/Fw5KyjHyČs]A{/;⒉':ԅ~=>[y٥&wigԂL'Ĺqgp/₎eyW$Ο'c N!+m/o3^VkOsnAg.ݩއIu׵[%c1WHy fk6sNݕQ'?~+g7F{})(ϳsFM4R1{zF\1ԓͪ"vkpI-=%+;PA{D\>82G'ayQD}9)͹Sa:⥢3ʛZ'6 Y}~|p1K}@ybiO LF}Al׳4?=_҃יXWhb،yR?^kbkZ0[z6-t<sv3M ~I=HXfMOW{(Ofn7x,jc;SnhvvxJ>c=j:Cc{{i@ݞ7*u'OoX.^QǟݥDmᕩQv :߁Ǣ~q|5zYz9]sY 1^c.q">fF}޵=<xXxp=quO^ ;\_Ĩoe<˝r{~ɍC==?T6u܃F[f޹qz>Jﷶk)S+1[y(}]X?5/=DbwKWVcNni/7E3g?{\[n`*iaBo6j|O$b·暨/mb_w]p\*uuol9K)qj6q҅,b"QXxqzƣܸ1^tbS Cl\pK'bF}<·^߽m{/bb3K?6wg/"F{ԧĈe ͝-Qcն>f|O\m1cL-ż5l7#߁N'V'jOI&s:7q|~k}!]}*Xχ:׌n^H7/̗df}UwjK{Ꞌ$y'w{w.Oدw'iՃC[FlK5KE>#=6C=O^5w.AaGѨ/~m {ڇ̨oa3ƛEȇw5Kǜ̳Ḍwy7w5 Sgs_k_C!BxD\=wqY VgVwSA7n^_y=f}=?-u+uvԷ<*w2Nl5F==@ȯg'ߗmġ%~k{juŒߙ5=KDE]sPxz/.ŬtaL臃Ѷ,$e(ϋNbn|OD\Ykbߦݼ3h32pшNJ.\y,jwsi}MYcR0IPֳ)Ϸiܬ>]2uwkz'ԨNׄ5Zǃԝ=Q^z:ؾ.Xoye1#M'4x|`K{xy-.%fjh6Nx>!FQC{4[K/ÉG5Nf#x^|Id(0:F<l(qF~х54Ĉ'6 yz+{x_; F50`FyuaXfċq1P?K+q|aJf[>"獍-mXz/olᕎ(Ϻ~PGtZq&Fy>\|GĨ/M]͒x^O%Fy<Jı?$sK@ez{aUxD}yĸdAx`"2/=>uQ,,s~b}13srh[lf9^Oć(ω-tf>2kYXb7_k,}XZ2]YGsOdb`afWFy]VFz)\&w2K{uUO=\y`=6bē 1O^Ԉזg@]ҟMxtiÅ =tZf=BwFys1kzD[~x1c/X7.fl3gLĶϓ=O< N^ svOjwnΕsXZwFF71Y8rwwnVm=.[8֫{l70W{(oDzycy{7kt{Rk!^,Z^פ#oVGJq< $.80g~yejT kz ,1f bb~3#?ch^ky/YߧnRh:|e<ҍO|z{ϯ~Ot8/~[nuܡ~?9=Y% @ܚu^qI|= NW݁ eC6eDZ=6,D{Psu YQTȗԋQø~DY.姳-Niɾ['np fb`xqtê@!6~L:UIJu~16Ϗ^)O[_@ߺ!a`z"} glNOŋ؊ʜt :xm[ uik02ciklFȡX uh!3.{$q~rzbܯƠ]k n?_Nݮ]]5Qg޶Fb祡qt޲5Ӗ63fI4&3I:KSuvKyۍxҫ4;z`(1c띤MfK?%c1^h-HmQnn4KMK[ƕ[%Mh_:N>'wi9gj,tJ{Sw?ߑ0ѾtU9X0=ݖE Q cO|񒟉ul֡h_:9dY.Hh,=uhŅn #ol>}Dz~#xq=Xt1q5ƢeF榮O\܅^<=}aO<:57z3맱̨/M3nlJƏ!N܍ؗ9i֡Kflmu Mf72`_Z0_f+/Q_7_5Q`K [[xѾp553c뜢]HS+y.j,W /uj037̥JxhGkEaf~}*mϻ#,_eq}&F}WtiLf,ot|GÑ:{S}.:u/+~z===T|,1[3ExhcE{|^>k"3ڣ.o牳O䞋؆6č牞JbģX >pgo_=Zvqo1/?ߘó{{#3kUFgEX\s6곪[ӽv[gZ]9sZ6ܸނ,T5Θ{&b4Q֐"bsUQ .>&Ž5bk0j+3ׇ0^Q~=Cb{UcxhKUG-j[`if'VOԈWeiMm 㡭ub+,^G 37X[bg[B~:۷i>;xtC@OR?i[ڦ[SJ3~O6a\u@oLy$bHςߋxXoM uE߸?%Nf .{2\'?qOt77[;qgw'tKky=zgNmSӥŘ,=ophO/ΌX܈Z:J3׶kG={pxbh{x͝Ͳt11ꋁ^XKb+.FlkL3>th>6PghN^k0W7b<џ2ur-MԈgN eF}1Do<I}A ljI/K3|10bxȯgW/XZ5t 淉-?<&Fy94T0kb;>"FyrnhM~ L]֍,K7gUqaMtoOl\ZF,K>F=si~#=r/i@\7d^6^2gtkyJ\`.Mک?m끌Ә0 1ڋSfn~={]X\~FP_{ K=4.fMh8}&2#ZXڂY*f [{{,]Fxt\?f51KGZq/j-c:}?X=aī[+Nb_,N|{?v= 1ʻ׉>m̌xS63O bgll Y[h`F}uցufW̨6ף fxdF_IЖ IJ49qOҟl[SksF5ssWĶv2A=Qmds1O>0#^nˏؚ=Q^;A7;{WqXڏ߅ZKJ"ڶn׆mmm[ҿڶ׉XZ$Ifl t hNt!Y' :8Ѿu\Ҏ+j?^+z;}' 83[KoIei@ҟŜ̚gwȯ:[Kb bfl} i4f[#a efލvv3#dzZmn>ڷ:4ڗΗ77׎[foHo[f 5fun~ao,51\N={Pk{@&~gO􇋥NP&^oZ!dfz>KEܘ}kH[ZxܽY#q"b;7==exFoXt%קFzjKo]Ay=F}Vt+z 1nfy`9}oC}":'>#Öei|$Ŷ֓ qɰG23㊭cmqltǠ[Wjl#>/ĶumN̺˶ά:ߏٶnbn̶ށ}xά%p^Ė^u2:zFѶ|r,!Ķƌx4̶;d.Nww[ݽ~?ٯWKn^==Ğ/0{zĕzz~}띝{=[>敹{~^^0b+o1_<9R Lm1ݼx2K{|>5|کџ%ߓ.[kÓٶvGN޶f!|TĈ'%"bl 0A|zf{um ϬUx1lqqWn?],; =lkhK2p=-xoMOͺ󆭿{Qc͆ bu]~do-/d vF{33:&~Ļö& ['wuhۚG,qߓ&qm[\o4'Z~{y$F{c<7Xy%ߓ8[sf]cF߱5 q_ݨpOn}_ƃ^ #GAzF}Cl[^ܶxo-2:148oe`/sWwӱ5quk)S[z7lNR{y6o~6ڛQjfݨ1e_0lkhccb_O?ob.foBvF<0om6-,c=}6ƕr풹{r'OgFwOš_m-N\>FӾgr.ӽYn&fb.FPߏ͏xխ{dnO5[me5F|hbijx51ʃRĈgFb߃#oǘyMn\Vш<#֑b<܅z=_Oys6⽉{s{zh[u:zb=iQ_D{!zxcN3cA/J=ܴ?[G}B݋;ѥPjn:[ykC_^6ߧboaĖ߰^cc=EMy=|2z^\j|%?3f$Lbm~1v`lX1E8gf􋜃/(t%"weEvґ85tMoC%ZKe/Q%Of*DO#'7x2kyC8%3$ib-~^r0vdlŘ6=Zbl=1Vg c9X/ggLƑg:\2ηt33<6#Y~䜄g'D%qNSLm 田'# -{kqemD\ݘc3(u/δ"̖q Q*aq6>O cu6\IwhU췰 csL'.geX.? B4.9{H .f/*~Tk=.Jٖ2Zm3s0ᬄhL᫜?*>ЂJ3ROUtHyE'jF*E|a,a,gTO5'Wf؜튛/ڇH<Тk""aa$2aȂL L2m> 0C6g%__`aoc,RD"ܪ,V$2aA3m˻Zu˽Ht˂;]Rc˜a$DX{\+Җ`UDE_u ؍B\26gc+Jw|XUW䋴M.K^ ̈LFh6tQuPm:mP/ll̕0mgdgRqTˇ*j5oA.xTOHN-IUX#LkU$Bl\LX ٧]Zȴ%OH3u]u9Mile{沆X(jw[F"Uˑht:E1{12tٺHj] _o ]J+؍bkk۸"(d~iH'͘Nτ::Å]\i<Ba6ʋ!s^r3EPgh6{4Y%(C>PlH؍R>~JX2fgdL+*f6K,Cl`ΌY/>8>]J+Οӹ.c. M9[?n¯>ϟ~_/~$?~o_-t,{QLݺ~o嗷w_ܺJ-I( 7}oWU|˧tgP-)~{OY/ujQԮ3U,lM?4zY,M|Xt+nnjm5ʅRn}=7v$tyOV;~NO#bO:mt||OEcendstream endobj 3 0 obj << /Type /Pages /Kids [ 7 0 R 9 0 R 11 0 R 13 0 R 15 0 R 17 0 R 19 0 R 21 0 R 23 0 R 25 0 R ] /Count 10 /MediaBox [0 0 432 432] >> endobj 4 0 obj << /ProcSet [/PDF /Text] /Font <> /ExtGState << >> /ColorSpace << /sRGB 5 0 R >> >> endobj 5 0 obj [/ICCBased 6 0 R] endobj 6 0 obj << /Alternate /DeviceRGB /N 3 /Length 2596 /Filter /FlateDecode >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~endstream endobj 27 0 obj << /Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences [ 45/minus 96/quoteleft 144/dotlessi /grave /acute /circumflex /tilde /macron /breve /dotaccent /dieresis /.notdef /ring /cedilla /.notdef /hungarumlaut /ogonek /caron /space] >> endobj 28 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica /Encoding 27 0 R >> endobj 29 0 obj << /Type /Font /Subtype /Type1 /Name /F3 /BaseFont /Helvetica-Bold /Encoding 27 0 R >> endobj xref 0 30 0000000000 65535 f 0000000021 00000 n 0000000157 00000 n 0000065529 00000 n 0000065675 00000 n 0000065798 00000 n 0000065831 00000 n 0000000206 00000 n 0000000286 00000 n 0000001727 00000 n 0000001808 00000 n 0000007139 00000 n 0000007221 00000 n 0000010268 00000 n 0000010350 00000 n 0000023948 00000 n 0000024030 00000 n 0000037596 00000 n 0000037678 00000 n 0000047734 00000 n 0000047816 00000 n 0000049038 00000 n 0000049120 00000 n 0000050335 00000 n 0000050417 00000 n 0000051849 00000 n 0000051931 00000 n 0000068526 00000 n 0000068784 00000 n 0000068882 00000 n trailer << /Size 30 /Info 1 0 R /Root 2 0 R >> startxref 68985 %%EOF eaf/tests/testthat/0000755000176200001440000000000014660742422014016 5ustar liggesuserseaf/tests/testthat/test-normalise.R0000644000176200001440000000125214500025511017071 0ustar liggesuserssource("helper-common.R") test_that("normalise", { #skip_on_cran() my.2d.matrix <- function(...) matrix(c(...), ncol = 2, byrow=FALSE) x = my.2d.matrix(0, 0.5, 1, 0, 0.5, 1) expect_equal(normalise(x), my.2d.matrix(1, 1.5, 2, 1, 1.5, 2)) expect_equal(normalise(x, maximise = c(FALSE,TRUE)), my.2d.matrix(1, 1.5, 2, 2, 1.5, 1)) expect_equal(normalise(x, to_range = c(0, 1), maximise = c(FALSE,TRUE)), my.2d.matrix(0, 0.5, 1, 1, 0.5, 0)) expect_equal(normalise(my.2d.matrix(1,1,2,2)), my.2d.matrix(1,1,1,1)) df <- as.data.frame(x) expect_equal(normalise(df), as.matrix(data.frame(V1=c(1,1.5,2), V2=c(1,1.5,2)))) }) eaf/tests/testthat/DTLZDiscontinuousShape.3d.front.1000pts.10.rda0000644000176200001440000046353013627006324024023 0ustar liggesusers7zXZi"6!X]])TW"nRʟ)-t^JiȖo ֮w0'UmL%Q}@֠+Vc:X,G5"~W ??[s#@4jy h&,]"&~pzl\y\cjQdF*Fum+4lv<˖bMNQJaA@0&]n q4%]ɠ5|pob(XI̦fx7,e {@i+o .NLwWh%:! m(tkF%Hp=^aC;]eSZ}q*y:-/zaDFxSzE|J ߝQ®SvMn~< [tp:$tFa:MQN@e8V om%> ?xGoBk&,]a=xEiwvϷjЀ"3Iƺr[nwyeѧB64l{/ڝG[}]"kJiV: W[1| FW!_#]B #$_ @GeFA-߈ݢϝxCLGĜ([*X(8N>QicG$蜵0ZZȬ!󇆎{*وDkodFJ)YQ@RNnjVqGoJU˞1pN.nÿ+}Bem^uu9h8HQTܺf"*2ŌÉP4+h2acWy'p HSd ?\ a2ݨפPo^36*2lkTէBJ`f<\֡&w1}YjX=dl0)M8? w9 Z2+GsA]1ZrW݋÷󷒀} ̛NVF[Ha`ׇ̠ _ӧ`iN&D'5#O%j=pNOMS&o]`]"GWPp7? v3fv$ZpAEgt5r8\? \C'hFJֲO.-@+/~kg|!%rD¦BL>E}B7{ sRq8M3(@dyһϕ:y#n}4՚@ꩊ@%y;®!׮u Awi+Mr4 -;3nHay83r-Q$bC.w/tG~[pc*t?6hͺ9U d0Rǿy;wA߮A}Ň#w '(q7?zS 9C7N^,)ǓJ‹ޅs` 8ȱli4E8+(: 8]RC^|Z*-"*I%}e]Qm?vTw˘DT(s ۋHw}),Clw^'# ΏlrT" }QbD jė3RQqT2hPLăعyF% ?BKoW?MzE#F!}eh^b>V<,q'#nb6G<6T=pgo\qWޏ)/ N0x; @ٚ$.bS綛"S*:^n\܃~/^Ȕo܂Ӯmq"ω*ǎVQ ^l(I|CNճ/}ѠN_\3c_Mg"wtԿ_'fp/4P_QmKJҠq, =^u#=={ bV#}֨x3@ⳬffo.!Ax13Ҷo_ΎN# F*Xɻ @VqbX$.OziUUpx&2_4PW>=so9)t<Ac): ƅ3\=3I32ftJ/v[Ξяʎ68yBs-G@%0' )=h?m&y?/=F1ž_ !k,ߕ2%&*K}PzqIx<,<}N˶TkՐ%J`(b ȶ0@Dܲ?Dvcq>wo/䵬(4Jh;=Y-/-d^j$?E~>/u:& `vRGWzRm)\촛ԑm-W4)֡ёv;cCgkm˼7nq-+vPdART?u'm܂9fwȡtMUR!z's}S\ d@'>;5#z2k! dT(ٓd/ITv Xz=3MC MP*M fB|<ęùw(νs*p$'C6|3~ÈƔ"*3"!1e[UT\͝ Ixڬc4X&  fvp1.^L#UdךOդi K( X#Y+'Tؒ Sf|{5mfU{AO#P-5HGIH&fi{y'3㜀zu<׭!WXFZ(f. dU7>YMʃp4 XJx$dqj*5F';e i-y[-3y"/uGzk.hk/ wL>fcx؄I C(ZMsGeraNc-tT_x'Fb{)D >y^"76î*O_ k۴Ř܄$)[B1) )xLZw,58a,q2`-6TUhHƅ<ɱ`xRn k29%ctڀBrB|bUbv`#}9!XZhx@JtzvvD1Ђ)7(}|h=տ_<􌸓;6ca:Dzz kj& [$-6Κ/tC!\lTM2eR&a^(cQ͚s)\j#JPݦ5,`ieIcp#NT= 8|P\ݵMYK`Q+:dMZEPj)Ce6GUFfK7?kֶRJgqx& l yϡC,ρU>J Q2jp;]V!-iu ۚ`VL2p0{c]]] {tm㷭rFҦiҧ@×E5ŬB)+O;\@tRņCWsX}&AD4 gÁ ch;0:fBƘbxQFÊՇFׅ늯8@ql}j Z)sl6f-!_5EĶrR#=-uyRecG5Yhh6zFAŽGc.Iꮫe,WIF~& G_zwk kV[4& oP-zILaAjN(~-0YKGWn-̦$$QA[xBI ]uʒ%@PKc&пnxżA\au0lm9SV*nr5n2 aQ ]c,zhQ̿g3wcmTd!uJ^jP&cޘL; [ 'ŮJ,ea+]7&DV.>ycHQ΍9`DD)AV3ftx=J*%I*l1juOC&şhl hmUTk! lia']\]9U_D)D;zSɬ3aܿ|u:'p)hyn$bOr]f 8UF3. T~7sPihb ͷd ɶh5t!="";ͽCX!ZBj֘Ԇf˚+FE9- *jF 5P<)G:oV%>}`cC@U”cddʠM3fçUsv[u1o Xo^-jR̮e-.1$M`W(u{aw!Sgјbİ;Q!r'qhT4EaVe{[c;~)\=e2<ІϠ{|l5bߦNlgʜu(L\]jr"l?^%|$ݯPFytx]/ K Py>(,[M@ٴ=4HJѼ}*T5vWCgHذHg_)XCƀ=^te[6z%bBm~Kaqjts|J +ۨ%}vբ8G7Z7ͥr,'7|eMiƘE@*i\)#wIM*hOW`hwD!Q6fPy31Kab~3G%&,su-¤<#%d( JC u (ӋlokOʦ>n 3h/D>);dp%.B$z| 0{Qֵ ]Pbr pȚrU7H%CI׶3x^*ǍyWqr*N[i=qU)ǝ2xXE6N.^>b?40Tc^W`stp.kf;\;% wUpc*DTWɣ1VS)Az>_|I|qK=buyw.b!s&Ӊq|n] J(HUA8\qU] +A=c:^LZ`Gߺk@[%{eRHL]ޮ,R66z |H#Tv VD-G킨#k(j85<&D"iHbJmQdI*S6vWKc{m m#MOFG =LOyM9]_gtw(g5Q~ W?^Ήu͋5*>U-5;(63{ڔZjQ+So2_-?SݦWp_|^m[8*8=0':[RE73˰ΥcHݚf'|nGNgB\i Y ">ԳmzNPOHYg[$Bg/ nWgD/UfA q_-?w"ll<{0akN˭:o(f>X-ebϋ3sZ7ߨ/8xTrw_8:>Vm rN@BX]f 36E_@9[j uݔ?7W-{b谔MLuzwm%5LO.sPa_ Ma&[#zyVgу-h6r(tiË (H-`~I0:l„ؗTlf$*;3fT %DKp(01׍daɯI&\FݏOg i Lr>_OIyj-ܟf Gvi h: aTڞ pX4X2CJ}Rzu+VH6zK=FbBۮJN c[lmm>\1a[΃3Nv m/`4e;׭ƂW6Ã{T= ̼Ovfژ9Ag~>Qz%E4`G/dc֪bzϿǡ*.#0Ɠȵ4zӵK9 a֮7_RWޖFݷH<Kr<v}s =GHz8{}| VME-7&_(" ;G?d|\ݣ_|M8)GeAHshDRe3j\*VɧW5VP,Kz (qO6'KEY5s Y'$ZM/ze7:,srZfէeCqө Yx~j'27 |M+9g)J;CpଈqziGu#dV`2S\h@&j˾/,L[5IX{= ~؂e݂E& q6V]\A ( 9 _N9ጝ˨95_%ydg. d{zW=N`H4 =tEdB FZPF9Z?\HѰᱳ4Z/ݣoB~10F}v o#uO#hZpe맨"E~ܽ"j&k]P&IwfJ, ` !C@[#ltQ, L%JۊxSxOHeUB-]拡y%xx|  `n!.(&$/Bg$ZMq |my$b7un*cY2ǧꏳaeY5 eEc&$8Kv=^87卑~sk*'{Qr{JD8^;IН kue<[UiYt+lmB1[oWs/|z|pݚ'v:_w@Q2|˴7\T TÇ(V+*{,N8S9Yv\ #ݠtiC^Zor\KYpy3SիYPdomjɒ}q.ek.\tO e4ш p Qit]k`d7BVӌr eof)UnP-{~o2EE򆟮4lRk!ZYfK":c ġt|q[yxG ?9ǮLOA.}7/G\qrJD?F5?t+#ǰ[ ":! ɷ)-+k sBydqK gւsm*;T%_α^!yDC"~: G<y]/hcdeA0x8{ ku %.fuv7Q`c_|$J:<%{%l7}}%~@8oG^"Ccfm,U ;+UFvSӧ'ur.ؒἩ:kp&$FB tYw,m{.}1 %PQp*HnX{ÙD>t& uhnI݂8; ަ$"i!Lr-eQ]_o%Xx="~VgWA/3:zYÊuU/@RܬSQ=#Awb3|^M'@UAx)-Ʈ6̫= ;?6YXjpvUH3Nc 7B$oW&iIE<Q_ d(Xcq+^҂BP}-q# ,묧2וh^%Dh ij1⥛ JK'"FOkuᜇ5<-1سwM`,Kg9)9{gJ |p2$xUl5.x?ZӁ9R@\Z]ˌoEARd8~$49 3ʭmgKXBX axn/P) 5B"ʼtO%S5c1Nkp9ryioy_}ˉ.7a1'~Bm׿j}>aWhffxu{5Wߦa[UTSYY5N-ܽb+)B! uR:zņ`1w2 FGIjx_/`-[26Qz6R V*5 n,,$ GDGfVVa[.<ñZt:.gYY-bТVΤlowVpUrte+.}J-x@v~|\1N:`lvT|_/ܨ*<)B }G0IpYno_ῴc*|p 5>2[\%K~🍻+$KHW:f[ <.RȾQ/U)֬j4~ B&=b5h7?!?>H^нp8!"t!lqxDXyQ9xjÅ5'Y"˺a5O΢\bֱ`QZbB }7ęs_xPz0G ^Ä̟RB?\!F.t?`!ZA+!\&jZ-S<2`?)@YK^+SJzb3{RDZsRDJ\Ոdz)A%x1Mnp|2]E:q dF8kຕZV5jú &(%DI.5UMY]?R-{l mG+f=XEQNigD6zü:̷0 K@v߹BW A%M>xeP9Zs'[OD maD.K˯bI_{z&?:n(A|"_ոgLJy0Wpۆ-YBsD䉌#̩Z?`BC4b=O7'G%L,2kʾ5C, b9cRt&\|D$sy/3,󄴰]u.#IAr~B5QVkM5tyWŕ-lsnn&^',gRˉHi5ycuP?u{D'%?f{$7Y:b(xM/_GN5$ tQ_Ҧ(%||HVnBg%NDtcǀ|H3[g}+}լl #$Gukϊm^"rbܱ7P R+/XFIFASI1KbX; Us+d2uP4(s`TyځtVD}KO | n /chn0h\qzslXxv;/l}"yzR?{~xUA3fCF9؅;5hVwI?O?%$[y.DHxj:reNؑL6)+N }Y . =YbA3J۞Lk%/$|ac u!e\'8g{rpQḟp*-/e@-ULj{Il_̛t^{P^ 4-=+Gy@+ &f(`mT r `JmY GpZvi8A]ux8X QHAcZ$v#md^hWMji>{#?M4q%:cY,9|ˎ䔎^2u{@mA@}u;IQKꆢ$"+ݻ"o2I.͔ܕ37g69_E^5>^ &_=)եw$Tʪfq 2c2%hWBy1a{EHy'W2w'Y̸̓sXcZ)L+מʸԙdm-no fX\w60kP&m>Zʔ-($~͟=urHQ!q6j Åp`)v;QL*,ߺ̚N:IAqe_t26-)_DA7SU+TFgr q2Y@ְD 0żz|+WtH=)\лd܁8mU4]5Ņd0.;jGZNCTIʴ uZapr"CSG圭A'$7D+?/ ~ WVy4=(OhI8@E,@oP>kAr&amC~28gt+9q09%3PP; Ճ!cVm=QnS!o#JL QS#L+1'3;_ SƼJ4)xf%*ݾwzDbP -6-*/j0ZM@nnr_ %f$~އeMjKH:THh4GOBR:Die'8t7Jqo5ݾz_5%k.-T귂R5 &yfB@XX |sLHaiٕ28\i2`Fjonʔ2,M RSJkQtk mT/6SpX ЕsIRp.}J_q6lVX@-Wx9,ٔ&g0َoaYgr;[ n@ȈqO,)H ,{/`EU cZn]bO*$<]R8CryeAR5z# uO-B m񉓤}cx\Q;ۗaqAsݴ Yͼ7ePDx<ǡ[ebE'^k #V2"#ɃKhgmCS6WFfm9XG s{fN QXƮ~ i wir[P5ǐz,_!~[q$PyrJ4MRuw DQ>Y] }vo#V㙩9eeH=Q)Ù%W<wrVSiU/,BQϦ (CQĽq==y{<nT(0?6n8ܫil'ϚSv]&v^)lOWf][YM4ݬu˱1lBn\WЬ$Es54g"\F #e]6b wx[FvK$ 4~@ǚgG@o|+ˆL #F8I~pnEεgN5 6(Z0H_YȋI*{l֒?vV5;E:Zɦ뢉F/ ^_/ |MwҹGN:ך8/b\yL eל;C 2s0hu;,:_ lmW Ihf];VB Z %EvAg8T8k^,ڲ|LCsJ^XɲԯlH&bwի>A[3 :h+-:AP/Pa"_Xx! I+9Ky'NI`tO ɻT,S{.!(PD.!զ4#uX|UXmFڟCivު)2TV1W|Q>t,׷D #CrJPĭ&iTT;㖅P U - v7bCaN]@^yF(!1uf)w i!75iS[ 6M=%-[dtE(+,5]웪`i0fZc%S5VQ ܤo@lYC@_c NWawL ~fgm_ڒzw *>v|/Rؕy:Փ@pۭEߗVN8TYR+ zɑ1rd^w ֦\jGn>:jTqԀ;P1 x `; eنs}#&^Gq3So7GɎ`t~xl 0u1w_+>&loh dU!Ofʙg- Aw׫B]Z.㌻(\gl3ݪ Z}@?C 94E)>݈SU^tٳZ'R[Zc ɤk TTexg> "}Ul^ь  . ROR,S`_ Ok@q79jE@T*RczoAmg \ s9"z k(?[Vq׶[v\`{F3{jmhCE* w0ji,o  XͷbHX\iwO9ʜYOU EycAl*8՞^wX _G820 ݪͳ7]oc%D8=4sOkA?QI >o9=mTߨ+ O @)[AgrrGcD4;/,{oaxYmHhf<L]Ə>RG%=S;GD(X Kr _4{oF #fzeT.`-LiuٛONIDqf*ٸ5=d^{4QGA湟s( {:(W>ܾ(}IMNn̂J$=AKBc`GձsI^bph| c^ϖFkHk};޶? S=}륦cMmOY#1n~kouX )$Uf¤'T{MDŽ2:ܙlY3~hcֆ12]/$S_?6%1uYR ;],AtJלʋGKtQL Zs=uvmfO)D@t=Cqg+YeٝsVRLJYPHnoϠ.Lfzq~no:§('HphbԸGXE 0>CzM?O Jw1?a|f,DZKZ=Ϟ0D_a#I!ٛ"*>+!@wuz{K-_j3 DwC59aY vK&C` D2W#6s HH]v Cw@fDž#i=O=¶9@">q0oZ v{|m]|ʃk}DUOo?hmլ>_ ʐvL[$WׯyӘ.Ӽ+Aş;43S\Í҄F^\?Nu'z&?X9z vMN0k::1n;Vrc~ˆl W]Kހfn8#bg&8!,/^"meP֯zF{hB. {B& YXMQvY~"Z@nme +lɉ2NM5osTZz _</#R_ :C݋FXz73(fBT?oן eRq¸{IRdY]}sڋ ڱrW0Ռw=S@SMJ! WEy $ BJKa34+"F!宾he_9\T͠X%T EQ?I.? )`[e,nX&0B@2;wXۄv8L] YHrm~ ؜x$?CbM H)1cOYm5kyk1o::5q8Z٫c'װ7򀁡n]N hG_pR>/8nFm$z`#qY6𧞭n(#HkDrv~i}60KA}q-Ua"DR }edǹaMOX[SWLxP?,y tU?v~4g"&֢^WfǤuC$kxjG@v'Jyych+# +D#m4L-H-0&#˻Ҙ{y۝lJ]*qMcoWPAf|wOCF} BmAt+u8H/KF{߄YV~+34|9>x?H5 }%693:LSO$f2'cVoIߦ~nӕ~uۇ>*Cj\L"|u  ām] .g?jH df8THɗ|[y@# Ac > t;ɝtC&{m/&hxNޝ:h)@4.A޺n۬ZPd-\֭'e BĮ&Ϝ`u(ʍklg?:lنHOBݎN<r UkWf {9o" G\\WdPdgYk|/lRp+0e_3*G4 K݉"튉O_/#M 5ʛ:>cي%~Y:X0)!A2{ 3%W}MȀ/`2 75*PX`ǦLǹhX牱 AE6Y]30xbS<(dcDg9ZE1yP#0;RC휯s[B,b>xB+hO{$3dPzMYY g~\  /VΞK z_1hvS[| /ņfXgC?,EE7TDnSʭc5tJ 7**eQҼ2]QNshOS6*|;KE1WO}ևy|kDi+}*nt1%8pO'#ٓX[3|̪k7 ]s;:Cnl۽0l(. %f"N2c@h+1d3f4pNp0.c$ܐf% (u7qԇH14_''3y y7 2,q\3zI% uA>[V@^o,XI.= ~TI7.'>pG?<;0Fp3f5fʟL 8U9U5$=n,;Bx`*q V qU!T.0FǵE'P[4!M|`DL# !9K#Ij89\6^/߲qҼ PXbdw [Ә;o8-Ň)EdP~eMflO;w9E8\]Zoۍ: ;M62R\W[oWC} `4B72n" tF 6KEѻZd #{ ǜC0+GkfbTooٕZ jto  #]{$+ߢp S>gxҜPԬ#wz8TRI1q}vr0["z+%a_GSҠ(Ufʜncҟ$>c 6݅^o&^ =4YWntTMeu&fSk~Ț}IEr.6FU`(c"!ř~̞o^8]zz* vKŧ әԹr'Q,QbrfdF5:i|2c2y^ulS <<*j'3l6_ `Z2SjئDĨN۶_V̝p$:46#=#Wz %rV~._iT(g|:ʵZ=R`V!v 5+X8F4\%z5dtO2iw%$==k~K`u~%$NgX4Ss.3ONE׫5&KH I1i_-De$HHx'BCu m* tαv wW rE$PO u @d;r u kRgVX Q,aM brțDc7Ey!h 9I-/͡"ʥE*{MRM~:m̗S!W38g2#-̕ >眕$8߱t!Ke得0<Ӥ1^a?w "; <ܝ큅JT~:-ƾL? b$IƳx'K_2Goqں2= Gn8Ky7\+ڛF/֠0 ؃@T]-ߝLj}]r'Ll vcy#%y|ԂMՁd\H I&X]{ +M,8<+K-xÇwᮛС3sb'f#*ߕaf!ƣ,sCEa) ojEnIh^\[E14,; $@ڇ*:5iyfvQaw_uz%*j{]`z˯q4?#ݶK÷rj Gp)TAI#і9*k̉1MUWt:d#^Q乆 g:Dx {`V`:$Iua3b\$9w6yYvsM+cN7AE%)al5NPAG̯+ *e;m:K86K kv#ߛyG@4VIbRUנIT,w/. PHPpG=YD}#h盿}㼾Wn V%&MnV 7^:t!0R̲:ѬXI!5j͗-48_=)zsE:.yd npF Z2ʧ7v} !H3`2jGHۂ~)ߥ;D c\'h~᭶@2y٪|XijsZAH,N)+X7U/gYl sͨ4ːPѦN9ybIڊF.<8<x彯p 'с܎,)ժ k6v8Sq]i,_,FqN޴?1b/?6Ss(ìfc_"q0Dp }=l-]fCB=p yazY᭔΄\CIv^o>F;]bBJOOB%l{P0.h?7I^ڱb(DWΐ&jT"2K?79f'W1?^+y='\FX #\.9Xdɔ͑/?T +mS7HxV\4b/K&2^rDfGHjpEJ^GK cS9BTUOQ{!.U=FNu[ xt2w6UO;);Wlf<C唉}9y72i=,.dZmQd} 6CR)W{wE+$*0q ZWsMw($IQNG&;砄PAbb^2j{$hD4d_:dmfޭ/"C+\MІFM # ~ئmpVFWFc-!dɫ"I Nc &%>A%69XA,JȧJ6pV,L@I0#NDIn UՅb)?qw|_4;; CuӭJ#:JfɇvFp} PjL׳kKH#E2kI6 %6ƒ)O} Uj0ȤM/$R.Ͷ M@2JM įOM~ldSee^ɒ$_Y ,58952zE>ˬ;ٕ%X@Z7"n2HWa=C#ٸ/N˽Y+hd+" @X❹XΥGa'Iatª/릲/LFZ' Zc&a{6?"Bc@'!J@4:FXNQ GH|*00Z }*mw?.!L16gڲ'ծO^qR{&OLnĹ9gdV<\$cG~.[NTr@lv|Nr@:bp8YYύ%}|QNQצJ}+ƴgQ &S9|Ҽ;|E{tW",;=rw=n/M4V#HGsxV.xE-/nV:&?#VCiSY Tn~ XGnt7Kʌ}?MC~LnV@ Q0iIbxm:&%I 00lK5٠ C5>;/ɩܑ䙉ptr%*=WtOGs ͍٘iY(E[wlc?t;i!ni؅T,&5O`uԄe GeL={x6~ .(ُ!"bwp¡ "^>K7B,O[VR_%'ks$[͚ >6Z ܃XG _´m?nEi劵kgk*F($LMNJra %X/Q*au^pƼ  &!W#/6S}P4hB>Q|tgx|jȘI ]p`W~}B, mM4[; meQۣWaT$侬WJRl嶅QڀtcZćSCɷ6X(͏);=6Zi4c0#]*ڛ)B)H|zF)li])­JgZR7;RP=}!*QշyX*U mJBk<4~]5WҠ[s\K@ pBe/'n}-rGX N2]ێR="3h- Q2z17&䱂 0" =@gn-oiq<\9:=x["?# i 0匂?lL>/xJ* 5bwE&-lBT}]pel.7;Xi\sŝ27*DYCPp~/Vpc= M`_#36}ogܕGb/GU[i(o$G5e '8:%TT^P։*%:PO|b,͘. Awa2:in]9S {sDBƪެaPqYnbT\M0æFϟGĻ9"\U*~fJ+_8tJ,(̑po١.eцdãgF0RaMa"Pk8WM? L$1sKfTe ;nvWPf[p| >%t3-%=ԈҀ|wlxq7q#?XfUɌz?CJ]eՋm<>z<9xoy@zM#EUg# 6qGu5>[gOe&RFE{QroZi/@<=Ʊ/͎Ԗ-]l:~OPNd6؉OZ:ި[äw~wdK6&y ~T@/! 'LqS9I.7.* m]N$o=TBܺLy /.xx+ 3N`ngboO k2恵KiPf=7ނ\tdsXBE9Yc}0mꣽEj9#uoiicnVyb/'1wGw5wQBnt=pa?a+ ВTwLoT L#X:96<^0x}?%0"0=Ӣ%:~#j>(M{A@ ]'؛sФZc0x!%c)%S5*vٵ nB C>ݸ, ݒ{ R`W|ƨ`DaZWG uqYmcghq|#[^6H"{㫌rseOȒBOAkOGСЎk0td_2k˰fM,l.錁V)oo,-.).=kGl" G")A(Cؐv{C/=T2ph0 d0)~P rT>ӜjqZ;MǸ1;ﭲ*Fƥ4>bLWڙQF ^7A4t6K< >v{Sз Y2ضW^o+i58'&*/vSз{*`׳{&~ZjTLqI3 XN"Rt 5rNrv. Se`vG m'{ . ,Iwvo<7 Ő]i&b=9/2pBq(+tl J:w0Ki,.mkf<.p_ Dx6/?Gż׸ %rH=:P΅ Ay-}y8#Mx9 Hw⠇y$фg36;Pϖ1/Ӎ*r̴# Z?^%k yQN8]s`[ DIo! mDyZt}O\v/ZJ %1WhpG剼FluV"_8ޥ]ryZY:+?ZlhҊ"[]偛u^˰[אWkF;WS;aA9(QRqn/=17ME~N\kFmc\IKU@ԍUE՞م1;q/h::秘"#K=ȡ<%h#@rpgv8,nR">@HŴ̆yNw(<-:LVlҶ q3rkDl&,*:IaYLz(Z38Cau߹KKytf%G: 6ҳ)4 Ulư1 &,>I MCNB8k'OZ|U͜,1BwqiǺb"zQ<Wt~ ֈՠדdՠ1"ܐN΂,R<pn;nm_X2"X\lm=1zXC0{_ KLz䙃pFjAUd{29mfYh(]VA.=ؽ CVK=E_IQ5?[7޴-[R轠4Ҏ:;?i!݌/#b?7OI6 AƝ,ZqAh)~{a!镥QɫS9U-fPwAeF!ƭl/#u{pB>H_ڬ232{I꾛)7>Z쯼 aGޢ*݇5UuxʆW 􂐴Q#7yJGVevm!ߧ5 ~9*+2H nxOWpK+0lBeZ;s$jr{8c qQvcs"x-ߴ"̶LW~|ʔ @-iƺI,Ƥ#|m & toYꄅeg6X  &zfy;~ƚ-+w g[H ez~gjlc[×p+n(2vʇӓ1{#hy}]{Byƶπsps!w?WY$/3h!F5okIuI0$6wcd?K!J/;0ÛImˋ#4D k lތ+۾0<*ʳD3?jFVBgW]YBeGoZ_c[}'H&>zXD5C$ z^Wt?Ooǃٽߴh^8Q+:L2ڢ9a+uXR˶uHE3 3\;lqV- ^ ?!Pn?XczI-E1̮Ww6DA̒´}1 UsVV맸Ђ 8_ܕf닲G?i7z&^Ju;<|mq0yՀ5: hv.֬ZN2+<.vɦ!؎]^ѱѯ+E a,>RTcfR>l~m*Z ;gq3OP![n"ׂ,}sZ ?]Xs8eԬ2&+66=P4Xۃe/,A Hv^ 74soj2#[HϞ*'FSIy rikК7T־@T4Efh.8Gs}+0`ڱ]a}%aF<- iRkŦT @]+/%?<4.FcfJz@Vd _&4'CQʝC.!0H}y<bɭi] xXsnMaĀs/D/o5ewD-ލy?K%EjFLn2.1>K~H* (^9MD~Z*۪ăYz;i,LzCC8^;im禁y&OK{f'W%([(ʊbfӵOH \ζA(Y3 bO B /lZ*ݖeJnݶ"f g#z r@55zGC\%B a5&'dk_*F$;хi B|h$eTr 6@hSϪt ]F2hD \dGo`k<_#29d$̓ב9{˻,%wdUPoỜr}}pMN7TQNѓ.M¹)XnC5dxp 4RJ%N!`+#J%ij@g+2{Љ ؙM˃V(]@M1g|H׷tQRؑ JyO=]+ H8%$: Ό=pOKFfX]|jlm4mlIns*)P>_+1Iey񮀘Ʃf)y*0渭Â"`Zh|<,wK*=GEA=-J"Qhk|A< 2}sx!/i&"GRMݸޖ{$.3mMCoJ4=D$;f hܔ}m; [R4OD1 /b嫈IXE 2ݵ7v:^LkynNVCHx"nE2lK/WyiXLTwȱIgp6|́BݐRD9Qkhvk 1?u .k"48$ΜbL<_[Pߕ}?EF K@o)]C7+Vs,9q`,Bu| `{JF'plӦ(߽'V{ҏ&uhܝk{ͬ+*<,Q&M^R<rAo.' %FBOV^da*1]luAua1G^.0P;FTܒ!pudjlK\.U9[WvU / C82#ZGkiC'nzD.cF.uI=}OEn*̏fV/X$v#>` b3vE8+)r";2b2%Q#h9 =\\vHS7y0[tԤkNG70[}?Yf۰ymH:ᣲs[X ;sW5ނI0kJ d ${q V/g¹B礢#a?$R.1[9[p*9 ʘjaYB:g K9TA8Ϳٳm22^zӚV+aĎh=jL얏|('`)N@.8voFo2+XNBta"lZ4FPMhl~O5y f0@AF64U Eg6a [0 ic?cWp[k6lh`m:\:H(p ])oI T;lc?#_/ oDdj Ɵ޸t]6/Kb`R?AiQzYXMfOMJ[~t3*Dg"q 9aJ2$ G@6:َ+LF!  !&7Q jxt*\M y}%4-e=#A;kZzR2LNhȷ= )ǀjUPcDF_ %p{y123B4 ZKGꉗ,VLdqڊ bY$1-.81 )NV7#Y5_io5]mzœ7n MTnᚮ61֤Z={@[1oo330 kh.u% ]z/|nZn_5Lz7LD{ Ts7~ 6k44.|T 芀wGuI)O|s!!aRctb* Ģ(2n ,ekF>BVC.tb;:([k_ִb(['XyZh;uYQWiЌ!nݰ<B`"LdvIi˕O (}ԱlU0hL3RKo ~JB {H{CJMa$$`DBbR{cr2Rh0_Ȑף0.l >%34|GݩdN ܽUÎijVy]ލk|/ERSA\e ,Dkm+I9'jpYAJA#A[nX<=ej_d3.~+Z+`eU8m5zMAEcXFs(r;I ] X}utmnIx$̺(NNߟE,+#B5R{}D>6괻;ãQ4=\#kso#̀9Q7Գ8"!<+J7pn=57ݍNs@U#@hrtx16{㞐-3}Y2KT*O%K)h"R|}\&-}i]AVD!5m·QqȪ%`&%;k2c3ULlC'9X٫"tfy[T7 ڴx.x 2ѲK^A\J#-)wJKS {WnZ*x)ixU3As PE&W*88 :yOqra-_m cn1HW|4WO;tV$]КJLO6;>.= bp H1G]2Bck !-Y]OO 1 -˽> J Eټ6=i_$5P#!t u)ىBcȒB8)zo$GgƏFzdux&F_G8qPQYǮ|,o $=Zyml5c7q}j-0ZF\1>pJDY|ۚ,6w\uTWh{ABq'% _[7 [ eګ嘆d^!vꑭFb"fw4DVZ}F,֕.pK_1x56Ğ.ZKW?m]q,1s'1R*V9 逫ž6lDx:nR|˾DBi%p]m'^@<Jo#;͐!0±BH-)7e\ru"3WB711ش C]wQoBR&NLn2-nJCXm9*A%}Gp6pPß!1Af{)VϳIK0VLrj%}Z)Hÿ/nL@Nez55*iH)h Q PPdU-5:KMJdpb1hn3^<ѥh$(R%J yj)td]`Y,W1GDgl޴Lm^q2Ɗ֭l>j2~ańb? ,> 'zS' 6Dt:~~ kh9hfu՗ȷnW]};%>23GnL}Ӏ5) $: JN5Ϙ%˺:] Q9ߚ5d&e0i F5 #5׻\m[[n'-J *"~Ff +T;>2w刔}ӭKJ4W'C 6.5bAmIEB#TelI3Ѿ-´ϴpc},>|DNJѡbLJ\z)?Fz{f-? R:}-au]-XjK9JcV;hSS8B&2E ̓4&#b#ÆUz:rmBIWwPYh( D?Ot^Vu{8/=tXg[3O:{Da\c}fRAQlP98h?u[/_}]Tdf /v"(z-P lxM;,AT9bv>iLs-sG:dXhFlg~8 ؊nGu4ZUU \DD{>4H)jpL=0+ó\z؝ Aoj dGLv),QZzFϐ M&`Rf.2.H !ܸ|"zsRemPGSj-htzas$p^b>dkrl=u yie *u}"&YB֑)ʑ5J,#Op馡~+&S }h}\s=iF4…}*'/P񅯫оuo84 nSu8RFdX^+T<M! /:x539/ ЬH37SLaA2+\\ &锓68STV~ٻXnɞ1O N#8C1O@}J>ܦŵo"KgLKnYEx$Jh5%OΝz BIAUMơ}Cy5/.X 4j"[2َmq@ MsXw@& $DծxZ56Qm1% Tbڞ+^jj5gbyɂf?DD9Y(0N&r;nk[S7e0V0936>K؀xJoR>m?n9,g(+z#䵿_Ħ6bE@yF5ZVL$< Tx@:cֳ\~~XV؆'zo.w$Cz $[fW1 fip7O5:tjhmכ.n:seC/.Ƌ)Mxh{dBǵ%L#I`5Ps+MhBʯDB7Qn4A^RUT`@7UܴF0svď @3E2K)62 3jBT8j QY< ~@(Ǝ<~h١9q\QudEw1V_ eLur?u?=&o2`^^i bCcBP>4&kϜ]OO9[YsJRሬuXdx [SD` ͏da5Z _k׽5,h6|䴎С/pQL;#eF6F}( !*ƹV(2e%XYR.GN _KRPo.D 8tezI8r2:ϴ}?A ֌ IW$/~e YE* zAM; >?˟ QvQ'S^7}! yn4>cBdlVH3UMD?9 gZZ9ӮtEU)'t>6n?H!m̲JwiiwM=E#ټK}1Xs}2Q9`6` !Zgp1MUr_:SUɘvϊp?v^Kn_ZՎ'ѡ_qi |"* 5f$:5}6P)wN:Uf CxU&vN!lFX|p௜MvxKm!R ,8iRN)v (x^rmky4<|.Ғf'luҭyM&҄2~qG6JKHQU,jJ@cxEӛ+m~Mcu/|o[d‚^ȑk>UGcPM)rC*'1kѷʨUf9X@e&DRO(vx)Rٍ*67V~Pvs23o{:<U;zoHeNU% &6\'^`djEIG%%:PY4 *hhE^xVYeI ͧ+1\5l Xm.P+rW*HOA3ƈt$DR8fWH5&dH!zXD5{K2]{SS6 '#_ >|nXh`L@+݁0.N;9Sv򕫲ru3'uj!7ГkH.CwNCx+ױ3vS^AX\pʳU?Be7k-|ɯCjڵhՇKBgRg$!LZn 8L" ZJEE=!sRm㜺؊p;%/(][%!TӼ[NQ0{%$.,ݰ%K2=GH.CHȕfx|Z/j+ʂDܻ5f.0Ɂ9B*͑#E:pCmZo0k^a(3KVA g1.CBJ(gxHtXR3Fz9, 8[ z&锌SQkzFI+ۥMr'pj NSw-cǢQqCU1J=$G|j~sg*" pjRx*~KVPX]tP=WDnYQIh^eR:?߂Xv "eYH ۸+Fxkđ@`rvӸ{TRJ+d)4yPFF_0rYo/rb$cϞZGm:.҆'i`P #X'Ax:ևל{ X'g8C֊5Uj^oK+5) *'C4 "_ :I@Ӥx#$<9Nzb(0?C='w< S"mvrJZ2wWgFHZiqSYE闟ve&{IZxI?F^^,qB7J(q[ $5=4q ~|K`AGp:'3) O Xv~/ZK69Hy"I7 $jW# ;:9Jy@^Y6Og< 6.Z `7-X򻟨H} tGG[-8_t4d4? &`'q:ܯߊ< w,+n2(Ͷ T"+!6 K0x0T:8mv5҈}ss& oGE1R̳ۍJaMYZR_޺QL8hChcƊة`l#%vb N3rQSyڠ鈐Bmgf1| Ң(+5RqnƝ vbɧR2/V+O'qg}}Zw^ŪS5S a7lWɢ 46b@ @٠CWRSPZ3J h<PKj9#4a§O)5mZ)FQitP|˽ƈa^rƢys=yhԝBy-ܖ6, sD,^UKυT&:FL͓hqOb.XUs_(>NPpD<6|SO?O["zCєT5!i{)L/ 'k20uYi@yh5$JzȁB̒VB/2Ar $מ#v<7j Se8etl>c/}x(5^v*ö>S\Rs߅DgFfuзNۆUI/ideo;6M&_V;Rp9x5;mTe[,7JBfkʝu-I苠qh$.űc%7Ƞ]_/37W/v׽أP1?1^W=v`Of#,%eMm) t-Nckj*M+D?9­ %DU !jku"$;(RQWlpp(t¥"GlMS)θT˙ ~G7[ `HKb5gn 0_OSȷ$|A:ir)+wc|P8vub5Ƹ+8[Fì&˂3D}`99֡5xz>l=GGu E!&-MC1 Zg`4$s Ud'Dߗ3EUSln<{SD+{核ʆ#" vOPooS feY>j{Gz 2_LL%deŬ()Z!Be"HGF(ľԡ@8=M tҖ}菽0ޮٵ-756I<3*%1]VAqw7DST/3 ?&&!4z#+jnBj>@-,@%d +N=9M1Yo%bK pVb%ҡ uc36{ǒdC/g#ILvm3d' aAxiKo>"aӱ n^yŐGR {auc݅M,GoBY?2"31MHض墬=}X[^/5k_[7I?mBArtG&iZ/r֨kYP<&lFy 6ؔsmuV[e A䗂r*8"`SO#A8g9^2]ሩK"&uP>IL ljR]}uX Ȏ)-Pzlehr(.Dt+<ȸ&ZּWkEVr-(W0cYB!#{N,G0ǓO`J[vJY r($''uK GZSKJUkƊ:ۮNɏiX?jiʲ>3 +sfmpUFa)3,eIW%_ dkͤ %S^Ā:d'^ 8#o ĩw?I&A$GS;Ra;ihikOM4V[Ys(+ b- x @> Z %TBr lO${1I,>õ5k{+iF*y59&!O?ΛdQ#[\F鐐>ZT-rHP֮?4/*$bjFW׀0g%:V}Y7+Jth]t^o+E esf6Lf)]Br4 `;vk7=3|*n;B VȆWyɿݑ OZrٷ@JdrzzwU?Lg#0f!5dez9ap.凩e"`|RL.W2Nt5~J'd*1~\0$MJyS;O=$|&-ɁQ[_*tLZ^;{޳(h3#>-F7XHZBϸ(xvڼp&%̸Dr {@:;-(g4edֹ'QJn8}|T!|IJrΘ~R}pC7vjĮ=("rbi&b ~HAJJn@Պ,W|kxIbKׇ犓7H>~6J S̲V}e>ij6"tbH )HP%(4ihK34VS鴴h+WYep¨R)y+|] d=a?JֿE%bCOOӋ34nqIMH"Sns0l@8'k^lk'?tt4 *l⭇Z@c'_mgi׵ HwtAIc*/HuU2v<\[fr )yW=Lʳ*Unώ~F!|&`x $տh' )9q;[%%jq1\`U{0(OkQ&C $14ÁNDrW_2YIY” 27Zl~D@䷽]xZ}QptLes$Hgj{iF`Zqx1 O%@BcE)X5c}IP,[j!+~ MCM/>Fq0(a{ F>*QI^{ Y JR,m=&Txq0*O+(>5$s&8ζ^~N Z* 0jf2Tć)N ĹtTl[5hJ!uc+=űuڡCs='^mǦK-im8./\:LÁk.=t{oi{vn%:GK.$FQP)S8a^@kHKh\Q~b#/7lOo5I6gMURFylDA⌄7= ܯOl;ҋ AîiD`êMvqgPdH UtMb&a?KV4#Pv tz~瘷5͑I?\>]@]fOs]}Bz)u@v+uEWQūQfο6>h(y- U!K9_F;Qfu#@y-uVbݴ>WxP%_j4-}"%S!$BTPݪj,Vs{n}/nޯ,C':ug:*,, oO$9HUp+@M0],E$фj鶳 y+UjG%&mqc&B- SJnu$}ʩͤ()I9qd y#!]JrBNΎu'Ų 7AX5\BGC6S09*7j6y,׷XOEy,FA`OonNC%f(8S ߁>dNW*+ѡu[bjf4l}azoT ^85_s[]q'ͩB쉝r>l:]k$Vڠ9~pu'kY=_ىr|b;9~ թI@
Jo*E1z~rT^–./|KBzӀ|KwińĪ-4G|Gʳf^+6`mƌ: ik@p;z VtacM)k7&S+wlq)]r392lwkǫu1: 6&WxUO\Ux՜ eٖ?vb^(S佇f4t~W8Ae޻%ⱘ4A:Ƨ*kv++K~_ ZpTr&z>cXam>G2]NR45Nbs[ V@)+ Ja FQ[@r jBwm(Ū'Cm%EZ!(ͭ5`3@Eg='*m ȳeqTӊiGhEDwF'o*>Cd{bTX׾)%|uY%`ƿDuΕPef" G)ҕƔmXѿ&kڜ"6[ge\| p* b~wW|` œ*-;j6 /< og [WKiH2 7!]%33K D}a څQ^a/~ȍ rdNK( 9$YcI~BD{4NNweƢ ՞O 1}doa"G1Y|H*" \oghݸf`ԧ+rԣ_Uvx=BQo0hMCyȿX.5#@d6Z_ݭBXE]Ep2ôdlu-`<7w:Dfb]e VJBKSe&_J/NUݥ]nnȳ`LKQF(Z[ΓZs1*f4'AW]=To6%"yk)HX}VMRJch7݄+= FY/[Tɛ\dmK5<.xꪅ/PP[( LEsyn [~& Ko=9fHI|+/w%rIn]afgzv##Ԗ݊n n $[T4tqGuHmڒ?# r(=BfmIOI6.'RsH x%S' _G&*>-IݮQTGGYS#&XKs!pFV<]DS`̠M.ZȁYglB8Hs˘S'{`{$WZ̲cfɎ}?HY,5לCrЦ'K006IT*_Ѧ/cye ^-‹"xB1 [.}@Mzq)%lܲ+5DT["Rx@]"H <:Ƹi޹f7o1UlK5Ϻ܆4vlpg՚h,xB'FNrX/%%L'OHvzV<Ʈcl6{ &r x0S!8fY'wQPsS3 ِeg#Aʆמ`=nsOuMV̮/ns '˸ &}-poUdHK%DzFJ[`#Ψ=}bDt%o Cn.K.w+F>.݅ׯ+x.kXC7! u"I"}z0l K +={sOT㝙M~〸LM1|,KJ- R!3qtJi4X{+lZEiZ s.0ǫ9MfZlN+avoYQ08 /rS1e"(TMU]xtwy-ieTUJrYb$hJWh)h%F !UŌ$vǗZrgb'#>eYQHx|i4. <5zRFugEh+k` yRYřW;'0qzYo9P^!tוڛ9zUj*ݱE"@x"j+k]Hti4ljξB1np0(}zc$`pjcȨrBR"dknnFbTe>e-E0U^{m&^d\\Baocwh# GnP^ߵp?KIQ13gn'x&qFqg#\+1!+>%BSkbV|e| 9ާdk=IeY.][߽4 X`򺁦ȇSa8q0οĮ-[r]-1{`kk`8(k\;1vGWW6} Sګ!MČ =?+Awx8UKh9&b2cԻߜt9ف* T wfy|=^}q{ۼ3>6fAlO]&E5om.:&gp\fS;`b7CI/YrU{M}Bd*;@Vאj|Q!!Σ<><Ʉ#3.7a4^s3ٷ芴K @R7̿FsRbCjjͧs.= +r*4XIyL Ê'l\a n6IZx&m\IpGaT]6i O0bRIf *g%Ϋ¡4)4)0A?$]8wN`:aҸ9l@rP AH)l3/h|ߛY[Ц᜘vr`\ QuOp2 X9߸Y 8_TQ+c6-TAsAǓI΂Hv ]]IONo^ݪuq#a78Z [Za4amۉ߆t+f)*p+\:mB~V}"xXGٓ 0˨ 58:OnHQE5ViA¾rXw-EGTt JfrDc*+xrsy%)jm4H,EG}VnTFY>s!sTeVY9 (-<ЂYE]$K??9BFV,ܯKiNJp*t4puc C`u #?l$J|=O^lO4/E{F|A 7=;QB{gU?VV^# &֥*&>%1Q"x;PO*0^`K6}$HDRSL4N%T釼Y5`@2a7LT e3T'm ]Il&t|: D֍謶D|Y Ѣoߘ[`ۛ(܀z ZpXȖkp/`wJ Ne[Tu,RrcԔ1s.A9MLO1JƧ8Tޯڬ#:- / R*Κ rɵSr2QV[ryMJc8[1- cȀC|0~1 8)hذWɾJV&[/6*к,~^r27ŒR<ig D!9rcS19zWH3C:}Q !kQa!5޿`hs5BsW_ص!-W3q@ZJAJ Bd5@j:]צjAk*QSZ!1 X7Ԣ$'<+)tv+/(e${L^؟û0kɫ8WqxmYCSwLp /qYA#dn?0ㅃ;6[^xf6y{c*jX_&~@u)Uhpf?5& D g7. 9˜nAi=d j.6 $GE<;?DO7>Rty+h1q O}X)WyNyYp9v0#QF'1葨uSoYƫ0<_%IJ͚òjO(238\tmE(m!-Z:Bb=,޸uPܛi,21Cl"b҇f'ґ^bjx6Z ~.c'r$Iw"t˔8s^(}а:LHLPpϪ.q^}"XaaS @%;4]O٘g %eTk~v6Q`u% pQr7:zգ͎KYX pjNzգNP2Dq?QF:xj20OmrLS&av@Qu7s6ĝr3* !@0hnԭ#ƱU6dR3UIlB00 S @~]F.C"l'#y*0P P Rս5ȃg}ɱe5PECeB3%RmT!nB^SfMER ̉}$ܥpO<$jCL\޴& B5d(!O0;Sv4W )~ަe%tl:ZZ^c;|Hti7#Ѵ 7Zw "wS%v R?%&B$"6d-S̃ZDM*?t&qi#l q7fafѬnZǒeMFDZ< RnG-gґL;+)K$Uj$z?%ogETy1 o,j֯$XKB!rol(-4۴m!uao>e'aaE«U B{HBUD7FYk?x.X6J9W;N@2XrmEZ 5J F?rjl 05" nRL&c0Gj,J@7;7t1N~M}'CAu>4I,2?";J^R%UdK^A5bJ5\}+eƜ΃2.z#?K2< lA? fU WPG3 /- >-Wco-rAy'}/qemJWC2&׿.@M S1!9%&a\lKpTЍNv5e5ˡop7IԱ{$:!4u !zVj}Va׾[V'\.$Jh8ZXb~!wr+,4~n, ƅMב}K~Hd[ _ " oS!*0ZX2I}0i錍]>S7OXvsth b:+a~/B3Rw-V]\oJHѣp{)g0N!1bxȄxl$ыux YӕÔ_.|Sgbw(:B-?}N:||m4r]<42!/ C2.+oW;a*K ]vJC9%ڌzbt̾h-V1 Zc!HKvZzeE,0ZG۫=Iu™Z)5#J%'fB)\&Sْ-`~'u AF ٸJ>?A4O*0e͑X^#eMLсN8]fPk NP7rȧ+ pa!:bU*wS.QtJQ dq;2  HKA5IJ}A~-jMq#ʱGzF ڤ^M`ỈYfǷʳez/GbSJ4Kw1x1Z뮀яD *%' Vgf>˫<=~*|f%g2WZRZE贆yHChh4:v9"̀TQ}.7_ӧnuۤ76_5tM)Kkm/_З׫b@MY}QY9ɴL.sM(qێXlkja5ݾ]7y7[KE "9Kִf2Xws}ɼ~LYreЌB"]fU]z&|ȌaYcIJ]gely-qxBj^@g!qO"=0ibR_7Jnw &W=^.A!HGtֹ[X燤JsشbX}Aa^n!: -s]xg7pZ*sϏN i*[9%%7 $j? w{VbrW<-5_ZG^&VOzkh|#۷ɝRj#)A޵J~'G3 LW c|;7Y$odCHÛomsi`gV3$v WZS;7{ L&IޤafQמN,XopK! @O#|O yo󚛲4c: 1L&&n? |LYяƬ%0hP׹8(篶 ,wLX+4Sͱa43u36Wz[Uz,|4U^X)(KM5҅w: WU)VwdT`tx:j8T큮Wonglu5ZP3LnŇjҌB׍UcEf1$/X(6\hTN(݊Of?G:)H:ͱ(~[]:nO;Z&q7Q΄/W7a*&iv/MS^rW\ n甐N^q> N!7d^x/Ic(P6-Bg}kxE_h]J1f&`x9.E (ֱF~1QKe5PiS%no|xOP2OX5Ia1Z^<514ƭlRJcf㡛PuH2}tɲkGWO/d bgU-0q]rxY9hԧ{v_4,'` ˔=+t}Zx]rz# c^+Z$7]1a39rZ'kuP`I,V ^AyQOxb_{'>k0N*Pb۹V0~L41Og*6Er{ F1V ]%ULd+;*%i 9[M'wi)$5ictל釗wSOC:t*@61S8^^TGDDZJ4՜ecоSȶOJc0+̆T9RF1TQ]q8z"-(8F)ξJ9^^Chgq?I%lp!).61VTYee|0)8mr/u !_ kg7K2U(B"Yuh9?M{TD?ڗŻV*8ѓIZ`+*o< m NO ՘ˊ~!CT9teNtcqB8BZZjZG=9H%jab:#'Ft\m럮|fMUS.bckb/b . V.yY&Wʹv=wMX#r5:K'SK̘ #qtb>Y۽̣i<=Ǿ8Ӭ@X3Ob@_]/p06]QR pީ! $uё򳜅FD\翪ĞO2;:`ˋbRPX?ҋXX @ rIv` YYkXpgc̯'QG?[m)MsaE{N{jl~K}2@Uޗg CD$$5y#=&* ggqz%M2Nv3r:sR7cnGM%~)4xa9,]'blgoKe 흤)ZLAd[~*KS^|eW,nv$Vj&HH6{-z5ٍx;9GtU Pjq:ͥ\dΆg r+\g N'. \\9]`wd[Xr?zVF3mA#9DCj&ZHI{~oJu:&DNk<SP2uSLeDBLӝh8=!1BGS=E,UM q6.ߢ&nuR, |\>c|!lǜئOyzse6V1sRu+grg ;GHX \,~?jba/q{D7?}U O<]s?b | gt ^/l:^. B:*V 6+U2jꒈ9HFyavhqP ts<d-L{CXͪﵯ}Mkc"5sovu<#:B\;43c^ uea Xᦀ魖oG6U)-8 p O .$= cI^9:cpsǑ5V̘H&UO f4᳖q_?/ zjjbCGi 2gB!~%.eڕV;Z{`ZɃKoܷ>7R(iػgDԿP޶nbLtghҭuGA2^Jy@a~v8#xqCu%dT (y!qD{Z:;>iqejqt ~Ѡa$*X&k٢V-Ɩ5#ߤX`;7Tp7M۱ IE}$ `IJi>iAGv" N ׁ,rmKƲI&:#mk &Y{ڿ^clGHQŞjgW`Ho&X%AZ7簵O^ڜ+pu!*eYVb= Xı ZGf``'Pf1i7> u&pgҠ2Reac_h,(GD^;k"ǁ8Y)"q-#UJ7}Ѫ%\3ͺj C#n%ܞ9GO͚< +S@DX'ޚ͢R_Qg)]B[iSch5qP0zkԉ^t;ju4Nr*\6I J=>||̧noQJ y4wŎM'8Fb >/hgki{_%}va:54L0P$%|v7tޤsl bߕNa!ukt„yww.Roo{7 g2+qrD|s_F5ARv5xKױLnW.!:Ѥoы AGFbm~(Q~ !;7\o#--$V ن+\[Vp^s-}tWK}3ͮ_ _uvn(R&R5™0R)ײpX Y2rzj.V|.^D9aS\\޻:EgH@@O|鯯OKkJT/ `S2.LҮP|/*uܵf?"iO^~YoZҲLnS=2-zcѫ)J*2(ێ1dى,E&<0eet-CDxZ@v.5o">Co\s=얯Ȅ| ? EkHf={qѲ ^/Q-Zjl$ws[ F#Bn3ٺNbC?!bq P ql.;s^r6(G*}ȮfQKv}uRy{8)93[u:Xjl%6& Ss~Z:ҏ*%j\Bo߉Il47uо@Ye|`Ӥi|C%"#G{ rfÀX?9b(u,>u%02a$io ~]wg-լ9QuQS )Mp]}Lܿ1.u?zټz}x$Khhu)MPbG cA9*e] i{P7q,"3ʞL:|20D&O/|vօ~%4p5%AOrϭ4&d37xN}3édw E K]t {D\e@۱_a>% zY1S,o0{ivzI}/l[@LK }+pm[S]}zGw2h02Elf#\lV+HҐLc5aE$&a pf4 ge2&^CK?GebIZ~ 9Ң"tQ8<:6%ջTi!KLEw$\ O1O+99Z:@{b&ROe|5R-Q ~cd4hƍ8~2gk[ VQ;*+F݁v"؀]Diߢ/]h@oּQadx 6ovX޼q|_!/!zXnϖ|E׷uh3V cQE"٩Z;zW㖮#ͻ ´`GI79&>Axޑvo:rz}Nj,!0qYȽYN15>sl乄2]gO$:"7eJgp^GC4qq=r{~tLs `GR{Q=!17j*j:B镻ΐb"r!h5IIFA)#,J+]H.~▂.u.qy5[:+r2.zpVb_OMOrLl23}}J@ 1W O6-@aՍ08Lv$L=MS/|=d-dq$ݼeuu:J1*vEBѿb}UIQ[Onmæ.Ps*pydœ 4Z1^eQQmI9Ny[$ŋir`ɍ9l`8w?i%7+z <4̿gGm%*:=vQh!Jm%)+cX 4|\)XXact"U4( 9vh0$c-HWIW8ڙ vP1;ViljJ} [/U̴4ю̝>1 $ h);I8"X':|zS>+'y~'eQ%A|qh 306UnZ4Ɩh*Hѱ~Qe\ޓ>5&xHEkS_+ˆ0LYwOrHīc2y&s?k`΍qZqYtvm2!#*>%־ S؝f?DvPR|'r 4SPO^ A ۉҋOt$Yr:1tZ`f?%It^/ (;(5&Hi!$È,Ȫp:rt"{)ܑw7`xT&Ts<.Yll0ivurՌM$S=̪ɉRzМՈќX+5h\ (xPAEd޿w_ VNg^p?SL0pg{_ճ}.A>?xdj9D J2NRn1d9o;0eum,&[;*9 dČE'vtpPҧȞ\D/k>y̻!mȰ/ D|k$y5)Y7""A;ssp;L;w^~==0" \߄I /AF7')s~Y>ďl78-SXJVM~(Y ^%+b Cc-bUb[T^K )llWK"_e4=7B`-̦nX,%A f*>w)_+nIp^3&>tg$ ]:I(*[Bҡ؎w6C~< XjGA 8J- Oko#'#tde ~Ud:6R 2i D#a!K k@GqW _CҬxo~d"Wp3y0pv% 3:?+%Voȍݿ{[`ncv֯fQ.9:u](,O"CUސKp qC; :ܡ')[nHR91:-Bomn{y~}^tb˙ aq)d?p9-k^#FCn;IѭϰJh>0CeaWf ִuܐpl@a&[NQNթ Q`"l&Q| ,>4Üa'?r+]=pPIj'•g@  Z?΃LdDWՌ r5) ӂݯ8Iûݰj+b:y( dahȵ[5uZ T1Jܣ<"„XuT,^~nAJ(A1utW|-b`C:wHVO&nT#;'4 mFuipco-bP)̅W.%/l4`]rh&8of A>u!}+;Hj[K{vS[wG}(ykTJAͬ,Q!8DLW䝶7f ݹ;ۈ^ܤe H4 g@&grbyZ6|'q07RTr*H=LJpVu%grN8?&*ɀnBjJiO͚ggϗ9vb-jٍ}(ВSdթ%'W}]b^sFh2kJWIڎAv;z5wۑ.H?Zs@ԦE@^jb`{Ӛ;W=T7k+fu"I%RAzZDșsϯܽ~@Ai;A=#jȭ`P@5꼨F# ;s\~ngί$zؖ"ðVc/&vv\F Byei|7JfЕ߂!]?yMzJ<:M Qۂ#T4iTCI%;xIkXw<V^sYpSJtSD1RTT$@~aʵދkH_GX;5ڈIAqssRi=T+kg XVO^ЧRa?XkJN^H*g+5_ CW[D̳UM6y;B@R8աlY\>Vqw5d Qw-F\9!J-3)F }dV2J/A}hS|8^sOqo{xRRܤgJ,=L8c^2 =oP9Ipԓ7}Z!9{B^K8SD}d$(aO ï\|HEdq ;`Wm&@NZ)>&͎ϣ͢bY}.-G7D^`K0|yY3卋ױʴVfË."5qbSMx'xSDj`\=*+e8nw8lJB{nB g 1k"Vw1O-bS*ە0P̑zSɜA\%KG)kW zQRHmk]Q\3/McEʫGf-JdfjM/S LFLCU>4o&H=jUԬwTjz"JW?Drϯ[s #$u9QL!T A%?)bo@XcXV;wSw -)XM{D{_3 T+mJW>(~S%Qzuz`&]Õ8 $Iҟ5pAOCd{khx9ΐ]ZN|D_/m=M@Ѕ%OZn \џB^9XmyR2W::@y::.98m=4;Jm50t9ph1} IkS07)#-,˜tҰy[ :I Jl"p돩?Cac1䠼LLYiI6zYQt[T.-;2=v=QKzzD, =eM`C39kYaG!d5H*>9S*)ӜIsC#YU'4뺦0Y lJdJ~7z4%b6NPo;n6yeHA{ vZ OH%&YB-6 ZJL:Q,c6yɓKCOZl'fQy<5 ?Wy9į%::WwcG$dIհ™ju_ 4!-JD #r >/ť&& PRjd2nX*&,eј}A *UX"Ⱦh^uEFR❭brED@yxDl?HolLb9CksghN[GLR)P :*`GEpY&_Y &] [:wZTf(~#'<9>gnܖw`@v,1.DNwg%lt˜M%Ei.up1kMeQ;"{2uj,mb@ц>@~Ei~=m`GFswI 0f#/+E8 N~?y (Yk[S02I$4敠l.e{&2F׎&0Ҩ{yd{k v㕇TXT;ån8`]\nS.0nCr~jr狒$Љ~!oR6gZ̒p&I`D@/pE,J~=@U~{ "{C%8A$FB!Mȍ=PBPO{f^YO6,6;ÒXGX|RT/P \W"U-tBJFT*Exr/iroBPCbOW*u,p ÊF >j0V68;!؉h`% H["P(5zM>"YI 'kɂ%6L1(GT S)1zY5lOGcR0.]`pцcc&am_ae͎ ZᙅML\+%xp+ qnG GP`S}WP"eCo[l 0wIrUO"¢;y6K/!6&.o#ʄI9S^9=o܋n["u)5Sǥqa J!V ҃E2@\MhANj|!ϒٿ;a$ѮǺϼuexy^;Nscй "j#lɘaSo~8~ssv}Ïd9U Z))U|I:_]W^bPwK6LAq(*9gy8؆V*8[xP}Fי@Me9qpn;!0ւqt_ωt1KA>k}|X|'^/~#.O'># pbW)6ќfjtA*RԬ%"4E5*h'Nka65EC燝!7 HCL1Uxxt,uTېZ,8TcK |* x6{ ~{?:6/[-g \U#4i\ly/37ks~KHL^ hNPppEYBIMʹ2=6>!tx.'z4l Ɯ@a!PӒ0f7,aUWks)PWgwDv|Jt,/ u7Q;%)PZA~<}hd~vFGtx.TnA{F]|A&󦸧yXBiP<ΤWgM}KרZ?&n8ʆ:Jc3UEG!{` :5KTMru+R0ux<6v+wїgY' }EfAeO6oǼ)ﱲbb*#4u$G@SYSx`V."*!c{Oà?_L8uEIlzҸvnapHuF rt6rM=.[ tŹ3QǑk?HѰbĈByGL@g቟ ./,Tuݔ Tt0,-^]$kU3. xhTLUcW3[uC|w4N)Y?_L:tv۞:,|I+Nڳe,ΐ awr tr ~Y'G.]݆{6%tG8IR삻_-|[tQ IRM!٫8=2^5.3PΌ9GPkDwIc-5N*Kl'},LFP%KfU=M(ϵ n*p:ɄLg*HsТз z{ϛPnk]PvNtRus534/$S^8o::8(.!zgG~6@nt7q/9hiRk3 _iu=.͐ Co kL)?HwN;:]b;h#ߔ5U'5%#y 0 ywڮ8rUϹ/M*$3}Gy:]'>^,qސf[.~Y?^˨=t7hqoZH]YAr=q6rځP20{.Эx,51aUؔ;8\5T@ F#D7:tO(n740Ucg)"AyI) FCd5z#DR[  $ۿ}McAP?sɛ s;Tv}^(F dm. Š]w n e}V^|k׵g}͋p&{OG"?6 J4Pwe#JbsHqIhRmW[g 8krior$xB ݚ^%\ NM!tMuœU4hO[ͤmtAIsGMʭSAŨqSJǠ 9>s*$:TKNJf51ƪ i~U5ekN߫|FI}ٗVMO-- Pl<_Ǣ[nꀤ^!41F|Scז^Q%k2皘%#ڠnj{W 9e|p=@*|%ZT&ȱcͯVDݗҋ-/OvЬFBّ{. cuO%썻*cWmV23;i!L0 @57_7'?QC+C3DIBj(HYJО1+@#;eG Y8/w7@R 'enBJu=xY}3&ȣv?8z/S?XJJ*F[W*J,yd]XKջY)m1MB<@iQz$J)>-Ms tT5Zx[][~]>qat ݼgspŋ?lWhK$ Ov2rm REu93MBI \jHYil8@!t[\|M|ͼrOlpZIXR뱝 FWptl}i@6|PH $]G.wLZGY %L}W̶b5ަr;肩 Rm3LvUT' l TP $=W|Pe)PbC3iw=2(u|+ՉB{$"i':rrocYB0r)1S\mםڷWຊ wj2E);RF::?CWZJhemVJә_;_/#AX ŝXXNpr5!H{-0{yJaMKÛK ʣC܅sV6(?4 !kysYg6q}.aK3pJv`X-7 OeN$y*9Ƿ6/kIb}P2)=N]6=O!vt:rEdy-h @y[Mt`a@꟭ 7-`kI^ObI'dfQʠW}SՋ3Y PߗZs#@\Te\G,K/Ju,qRܢK{VpZޞ.ˀ 8mK? +T~HMPIe=1bKQѻM;0mF2ՆwO$a sxv\>pn־lXm b"+:GRMǰs@T(qDQlU#㐩,,2z!ӘDGTr"a kjOG#"95GZNu(z1͘P#̡>JYP  vz(لz"< hc޵q,faWjqg >e?32-zSKPn>݈ IjY-,Timŏ4ھ|q[Y6("L/ܦJ  ϶bj8)êX1aZ~&Jܤ'ϞrL?N8yndx<$?j9|@^܅lisLI\kկ&1aSPx-BT| RL]ݱ e D.C]tNɧTS;4oQZ-qb"S2H*u=Zٗ)o>OFcNn[  UR^[=kkb)p5Xu{Abzm&ҶR0⎀.K7JIXqy2NSbVTK-W]dbJ$d4yk#@ctB.Yk\vl5 O דA!j6N-|4-(}KS4 8LZ;d՛;Oc`j[oH:5zvKX+mAfG `yB02d gմh>CRF\!0P ~2}?_2]étt{ezK䐯b`\ gMJCyF5?/j>")M޹M miitLՐ@A#ˆ[0n-Me$vdhbnp} α*{V{,}Y8̭/W@'"kc y? x5oGn!dloŒckoKx_/C}33!+:4ۀc w"nU@\J1[!V?X?q`X)&[,@smǹ͝pwQIZKf=no9Z7 oUF6m͒L`W}{e0vWB$=6m FgٛdcF';2lm1Jd(ڹ%@h*Wx4BIU6! Z̋TBZM%h'(Ϥ֤l!ܳ 9,ovxqJ 3қLc'rTeӱA}8v/CUfQ^90?2LR7.GxDpD|nT 7qng 8 `%;*im59զ veX53g 0Ae쭰Q*:5;.[}CzBcm8]Ђ NӁR"%)5 I5gmМ7Lqf2Y%딉U@}wn+dyioQ=ND.HvdR88RuIWk"["K-Mw[Cr*곟_XA #Ts~ɺ`}jS=m*";JO7YFƲt!<R;*"U[+c'LA{]—v@ DaU'2%L/K'Ookc?4m`pKw^?-lN"EU~3EmeƓ^>L™cSZ"kqJh(b5 B"*ݕ;Ѩ8ә?¡+haĘ)^T䝶H1HtIm~edYnp)o"oO.Rb[7C:rIUOe"{xob8A+T έڰFG&R6߼+|.01c )%m9X3 K-d?x?&=L+Z^L1uFw{)5qEM!Mb-r4ZX>aW=O MZ* F$ A6еze(ߤ]'۷y󀥫a I*sQTys4#?>AQpzr9_-J)TvqFh=|w9).M'󚌴 R씠XRhFc-bIKښ"ҿ&lغI#ȣV^w0w^}:]=Ew(Q# 4B[;I+cJ>(ͮ =X AuFc9.Nɀጱ^"pz]ft.1W@Ӗ`AyŊ]9$@mnB/zglA [5$^fW qݻ$x1{ĵ*mV%}QnQG :T(@4^(OKPlڑsvT$>Ham\QbLVS9{(ލpm!V R(נh¾]}wȵlI푛3?Lo&^ *00L[*ݠ!0״MY|a:$vS*֞PznCM𯋜Hg!5H)!OH~gOzDnXv)>UmJ=8InA®}\Mw/[xul; o,ywQX V{cRB􃩌[UU~EŃ5 ^I0 ^ &4ۈQ=ϙgXR&&N:he~Êtiu?dA{OdU=WL HalT2SÍpWߨA 7̎yŐx< ĂN)ٷ;R]v]iVD8~JG-: cO> 'Ml."-;wYmal}b= z9l'`Z" x2[zok@EeLKq$QMQ_d;fC.0}lR1:ŜHXu6ToFXH+~]PNkh.Ysӵby~ ;PY(@iU$XQ_7-.#>g5^kF]lzl{`yWZy&=2AUTfD7]Gjx}/pm?j@ȕ HK t=c^cZ]2btkƲy`Iti̍TzeJZ0𫩞hyQ( PDۚV++Ӣ2M)0I,0|Y8b2BF$<6/X~}E[C*n=,IpSH/@ܗX* YH@cINrW{}td!Z$b-+\bO?",$wҟ3# 1vnRM息:$"^T1@RiګYeZ݋^6FV&J 7pyzDI}0uoíL%L)b>fNkGxg m kF ;񧲃eo<_Dї{. XtRC;}lL'SUk1]beߺg NJvoB:i:@qs*=FIi~łC﹜ a,FX| wygᔃ ,((S1! ߉wS@`?Ƴws i}b-OGCF`bp9ʠC[aiȳ؅;o7MrwwR;;]~FtVCtƉ;9Elf[ђ aCZ6ajH'F^uІ;KM͓.؉/j Cd=e@EW'7|_r50 ]2\~djso6NޣWOs ?hCt=`S9{ӸƖg}"j~ue/Jt[44슱\Γsҟ.z5nil VX%VFsYa-7͊"0=-54,txMb /ٴ=)ilAG6J"3a^vƛ4j&UI`]uN]uԸ!q@Jٖ~Y [ùc4| SS+4!47=.nF'IAׄjJyofS=׉TJ*U%T<>H~]P:y(MaS<\yyÌ ZEjK7kOS8 Z9E_ɬP )]> Z:<`ѲXWwi|Va^xʓW/U&+oMUl+e{wpp+r598G&l04.Qaз C4[jA(*8=M~f-xz#܈Hc  afKSbU%oi})I1b#֨΋d9ʻvZ87!kbO²ڵoCPH)նсas8DuMirun#tܒP? m5#䤄baO?>\¡ŸRv & ᭓@E;8vS-~ "co諎ud14`:hMZg^%ُLwnfn=Pɜa ^\7 Md;ٳly)nLk6`>NÒ i}~NZvnɓib8 ,02!S$X~M-uq8qMEUqTkޛgP<`U+^&Cp9.M]'S2&%f? փKG})ɽfɶ8N\žR*lXвX@%W-ۯlU~|=$CX'g[FmFvnXNĔw??Bު@\Xdv*e ?yj^A!Y`\tgWA=4v8go¶yl;M*d"!%B/p#R X'P!Fy \q\OLm)tMO'fA d@3noatLbA_jD;Y5;Xg]LATN칛#M3ABkĝ$uY+cPMb#1R+hKS/Y^ҕf Cb |e0%;pHg'M)ڿ\8,D_X҅[׍v\F_ Zu"ƃFp tvoI;̞JO(8̉&ɷNc IOk` 3np3s5Z Gs"7jY9\ JCGvխKlzUjLQiD3>!ـAު4rzS }nOQn99k*&fىO\4Xd3?}Z4~X4N߫"6ncAe0 w}*7 ȏwE;ۀf)yț9j?oB1]h>+1(*"Wi.ZY&n巎$X"i+HOړ!lB8mIy-^ u*Crunq+`V**gnRIf$ t|I^ƠI/ҤD Ypw@QV)Ӣ06ޓưk~ARMH7ݤQzۮof) * Un=\ٙq@%Lkxb13Wh r+e1@ZcVE}St|-'B˛9LI]@VmhFnRϨSqUV*r,Qڒc%G}sx} WI[)ӴľnC-b۶GTl~\\.'tr uD&r_Q̃gm[2@nu .=d$yoߎRJ 4BWfh%*:Wz*O3/ xJx'uYsP; kL0g-hn`\)"\&K2ڐxD×z9iho__aRBp!qM;S2c((%QItnD {ɇ)L&4>п$g 9$Z o^H_IG(98\MjK$<ȝLآ@ yYooH;ii_CɓѢ"9zZ<,7 ln#@$wz D1L7;^Je=7mi%CE&T" @a0CI Q;"WH~)gOugr0ڿ?rJggIi-1|C@X5=%x%QX .1>7K"r?+o<'lbVhsĹ2B<$UYQ\!@2:˗-A,W>z\#g+ HVx8 :JX6@*ei1.oڜ=eԱ?*շ *)6@t iE 7 uh xal/m6i _PgbEaIq 26F}[`SZa#/^"^C$#[Yq2GH?u{$?HUjFۛS )nKTINNZ"Q׍vlwQ)XsәZ&b1'6]p.HvKeCR[e~_vmqWx'j1UO<"Mqĵ-_nB''ƈkb`QPg^]8K Ι|i]gþV;';k މ)/1f,~`G?Olq\vzQZQ&=ѭag4]VθQhbhKN~i5TʤeLXB-ɉ| Ey[ CHxE+K>w$GI%5˾wZU\0 ngFF.d^NF5O9Xտ.r6DjPx,\JFR\r+Y$AUdS5pn6(״~E&PF'I1F4bלZ@L8 Բ+ze&BE>< YJEG^G}]ki1ZDVQ҂i سsgխDB=Iۡ~ڲ:-LSUI[Y"ܵM4#_A+Z:6B$ns6iӝp$YY'CO ƾDia[ӭw.]Z1K ZEK*L,V0Y9ɠuUg.yjI=?:tR[ )k$wP94־KB-fե:s^}*akm2FmO;ySUd&3"ZA]:"JO\  m=á+0 V4q..lwгFomV_ZNg(^Q_Bqf X'n7aԒCjUEO~8Q~6wyZtd[R *}3 |zĎhzHq>mz]).אMj${t+ P*% D0I8J2AhfL`VSṣE -\nRBTVETzeXkކݜc5dXI!I7Ce]PB^TrERd 0n}@L[ZUfe?Tm+=Rv8L9H|(կxv>c%M*X%njZ9ad45z=y+lg'X9k4 Lx^)dQHhM{׫%^ZC=?^[(LkMPIKRO%r%'@Vm[L]0-Jf35hVŒ"ږՅ@fC-ݑ$dAۼT@.5^/{<~QpJڏTxL^`4zBhG"k; Eg7 /au}/0\]I gk#\4g4EKx}#V ʴ6aCz%K0i1:h!>F1JQס$!k.% Q~|B$33@%Ye08. id9|SLtɡEUX6h-곐9qyyiY'OLO}aŹfCb_]a $+b] *މd xSf]RkV{ T#ξIvN^Џ)2G=o}JȻM L`0X&&Joٸ"p(_O?Bz=ZRPфݡWAٌ_ ,1[pu*5&[OOP*΀`$h'9v\ j5 9? ﴐ$ Hq+FeK=tx,PdG*?g~uY˴l:)l ؙ /*7w ˹$φ)Zj3f?0ɼ]ʐ,(zv}+B/,wLe,cF%qt?_XyRw#Xh1o#JSINlwoB =jsQx_,3ԍGXKKYtTԝ_k>'Pe 3X*0u0kG֥Ҕ+.62p'fN~ T8YjT̴fe[Ǝ]D>qh7s]:Bᐅ~1.-`L)BSDE @ư|,yk5>31+m2ʺ*h6Nqۍɺɂ (h~ 7.$JUWN?Lcmr"ޕN -q[5腻u@~{W>,+Q:,a#L&,Q+1ay [$,冁}yOA ~ dqʑ>n]ԝVL,|]B1ɠ g.-#QͬäSR YeaOڷ:PCWcbQ ؎4Wv=)WxhD,S:~+4XtU CG;>*pHon.&C s\5!'AG笖2R4To|;ֲ:Ҭ^R'W6MIߣI8*{\ԃ I ~研h6+He-Xop?#)f*̐_..@#i}> .17g` Qtdb ^m4`VV, >"Zc~δ{hi;2)9+K+|Q`)#At#Yq* B*,atƏ4A)ᰌ2+(Z=;$g5ݧ"'6&0ފT|fƮyyN|刹TfT~YT*֡U[Zo;dS46[,'הt(ə0eg/z9Q:jA]Adoq h99^²żHlu[ou ]VN'C(!2@+'X2,L.'܈VLSkHQ)S] JQyN޿ӡςʨt*" oР씇FdNf$V2wfpsM=9Zqp/ⶪ3X'y;^ 9~Of%Rˏ!&vI B9  &$3bwVg٧jF(U7+:ڱ^4b'nbjڭ|l$@x'Y =OnD/ItX:N ҔAQ"ٻ/ux*Dž;'$j%tJ*r{ZDPG7OvD~SU\ N/խk B:hx}*:'Fp-Hb6خRl%꡻2zu/j2'*w X1KgzU6cU7,R JbɮbwJ7>Hn ?-',Q*tf=Ee3H/>IeU";e=l3\5_5?ws e8VmoWEc%Eg{vDQ`zwa ?C]$jO䊌.C "j$Dý=<;e]]]((YT%_&P'G7& ?G ?(;@+ EҌi:GHD+N]G4@LL{Znhc2tP` 9I^Sco6,6 U@eJErZ;b.i qPq-kwZ0R-X(QY$57؏d)W&=ѦlI-nUQjE⢬F$fу! /ӻ+{-y |1[ܒM+6xKɣIԭL+sjӼ0Hh&ls-jo%hOXxxYz^S$}ɀJ8NG`U_q [HhϮրA-\2WR/(wvo醚mcd6mlCZo96DՌ&oOp&h50 0 yS` f~N>)M>[`/E%<3Ok A==\ O4F9M-B*kkI$ NOt'F}`R&'@a=$D3Jm}Qժ6X,48=Lp"x\imb/;i` l}Ш̲bkz{7 U5tK}V~ӄu򽽙EHcbLY;FSJJUbDǜ݁/3LWNWh6ꇀ ܃a\נ{y[ֈr6+W;Q8xS0[R遢CʹkEJ7pح _D)aGQ_ޮꖲ*#ыOϋ2EʋR#aŗ3n]Vf C^;2>:8O~NXի' fu eNY!$T/e7wX=jZVHV,yH_d(_uJj"ոX]/$Z);X 9B[뻇:GYJ A[f QiѮӸnNڈD`FC_yK]Lue:KJ!}6Zce91  .CZ}hm*GvQcm$}V^αҊͲn/|KWR:/y>ZKڧHqcNc)"$j.Sl@/&R492BE%*Gu2RLkXBcؠ6afcT-{Z֍ bqg}gtφEQ)vbx";S!"Z;ΌA_v0+9(&0PkT/8o璋MԜxPD!]on 5r^a̪茕ݢ^ՇVmMD?%-4ſ ؅L-D[ϧ /y-$Oԋ$w,Z3M:l_i;eHl1՞5wR͹;5Qp=|;EfQY>)ڊ$*9UlDYx@cxOK| BxpU~(8%'[P.r9d{֌Hfwdz[Вr'nuBi-v41Q{>0Tp n9ۼj4(!/X 6Z+ϕ9;ʼ}?'ƴjTΞ)1:u~&+F+~+ؾx?bT+/J0E`x<8/soOT  싲LBFd¢ǣlSH֯ -; ,W V?HQSlhlpMAD |DSp(R$$+73&#H+>:\LXO^9R(bDݒfVy #ڳa1B|VV6,e}GgGۓ*D2_oּw鰥sy=FˎJ撂EI*[(qXTѷ5e"2:~ 5 s[ RܮdC/$uώyl-3UªZ'uwVڼ qw׽$c$`I-Mgxk5J.BX̼}!-g ڤ&}*9d֪, Ю`rsw`1d"A3,/^Tl޳E-P3i붡d\ FDgآoU"Ee-fYH#R2ާX kP( gq'O١W!kțcȋtn/'O]Ēݘz4[SK:ۡhtup,lklʖ^d8a鴫M36LzT@F.buuLcJBȒǙ(q.,C͠ksKq{cfeIqi_jtWj;*SnQc#FNT|$[bSc&ҠquE%GOuXd:ji)ˤ}pbR7,6i@ ۛ%5e6Cs@D0ke;x?fPF2<ePcZa] ڜܲbr3眛2{ߏ "jc0#3 NЕس S|W%5#jb˵&*ȏ7mS7Ju#cȵ ]"ldϐߞCѮ٧UQg[wkrس2bF2W`=;/U}xpՙvF&lH̪ n\v]+Mlϵ1yUGSi+`$2B$?=JayF9Wbb~@JsnO wZv!m$/[ "DVDžw9ܓ/IMݪe2vw]aݴ谣4q+0Ym8&B}}t׀ͮ{#^.L`_?][\=|(E(33Uӷm6n u0lcY|խŢU[Q\M*RpCVtb347-!:WC(~>/Aڊ߲[HaRO!?"i^/@QXrg<]z;i֏iC7>qm>oPEV`VjC#$<|!TUZF=JQnn*;k)Jw>YcIXU:TNB}!B -:Zby?lȁU1B%)1k\iE-⌖^"43wO ƬڈNrƘX[1*ϓ1(J$Yk9\YV>4}# v[$"4U&K^ QU{)/Vk2l W]sotIQK'^][U8i,Pj}~QN 2?]2\U?voFabZ>tG,Bҿ]t wC^!ռz.OܞLMU(N bk> ~Ֆ Lk&+JO7񳕸.mDeS@V̴zp^O%s-9 {WB2B;).ܫ=Joy:WBa~؍:J-MnB3<{g0ZzrQ!lcoSN-2A(VlNCZjgǵ&\3925h*++j!*K<a9lx2yb}Fu-&IVI&ě̇գ ji;a1RFAn/VM}UG '0s\yESP! 4.`% #Jg.04d!˕hQ89  Kt^ఌV|rWr`GrmJ5!ėK~hYleY5al⨪GInGM%R'Mj67x_럲cP )!fi`8]?7LXϛi¶'FI 钷AM}b h ®Grfȁ͙Tc&~w h-Ι=\ՔiBGB13BRE+vIAj~S㦾Ewua .Xl2RhPdʹ]87ApTFADmqY%+d5"T9]|0AXO0PՈeمJ#PffA! 1 z;Ōp 2x.6ēeOxbpɡBSԅBYx}V,q48hk03R~{1Kz-ԓʕmҹ0`Z/z"L rQ_iP9cWh>AjL?Ԥ<˺KbYYZ+Gs8"UA/<XN&xF>AH-Dq O>^וYWڊcњ+cBݹ#.r9&aqR i5Z޲qR{}[p[ ld.ߧz(؁ TydؖWX%>{:`*2OLQDCsꄨ3gmsN(ePNlX5=?'K9䬑OpUu'^ntڝIVe3nTI`SF:*(ȱ^hBv@&{a-˭0bph^̧oQ0mVX7? 0J!*`8P:8_S®&wdo%YCŅtUTt{b:p.G~VlTHm.άUBk{Bƺg]Ʀ[zJ"rSiq>"d9 ƞ_ a2"%6p1$dHEk;bkc "G >Ou^=ߘ^O.Z a=+?ۉ@mL+iYȠwCcTԺʓmlT%$.&S?r9dM ֖qBK1oKw5bիc 5湒J(g ؈XO32e9<()6p9!gS.ݳ} 53l>0ϯc?20@b3N9G R֍ա#Ra+BƐ@ ;lMmW./UQE'ټL9m8XRr~ف-aFsȓ3 /KA9396P<ajj9ޢ l!H839ŌnI,g:o?+^*2"֑*N*Ay7&ԇa>|m~ a~7V} 83D J̝(eߊ '5/Gz~@%JJ\lq piCE5"p@"uv`?/vYx,C,)`T(|{B@ik+)+WckH&>ƙWhI$i/x—΍;NmpY?3FV'\)~?!ݦ}dW;{h܏}͘7 QެJ#T3=- )'.o7a$ޝIQ'{I3Жh,JR!Z E>"vOS! +@ Lo2 GR[/\I\Ɨ ? m hWMv{66Ri,c_fQPY8s}z4hXt 0{\"@lU/tO^-284q>U"IE}+Y4@,Ze@a!zv!F0-0،\oE[3p^Vo4[jD5VC0a5٣[Mr^##PU2&Z-N/Lb.%B']#y|rMYȜ* (q1XdsfmgmnXmev:Խ$!ԍjOi|q]`X@FOS>x1y-dK,S&KZD4iӃ?m9c1;J?@흜L8R*()f:r;pciF޼ a{;`U?Gr艮0PASwf.&nC5Μ%I9è(ga8I\m`%-6nW/jxU4vn- $&9)<qIǔcBw=UZy!@\;9 ,J?d5Ө"[+yC!L{.UccXqUCrFzVapZ3tD%)D6?8HgAQkMZ2Y*<ɕsi{rʎtcД݌UQE6j| CCy/j5"W؃@iED`a\4%zDqBd"i؎G< #RZ|CĊĵIT;4O)9;@e$'dvӭ7NgbHGFQ}oiȻM z(^ *(]7b#jVB>e} P'"NԀ-TxNmڶBYPJYD3:OT\ qh|nsݬ-mAu:Yʷ/&~k֪Q=cqpU-flbΟRf{zVVTxT傏#hǦKWEo0pT̙_n`Szq h-dgc/9Bq׼m&&;F$CSg&"G>;\%8'0{FEv<2kϷ0AoCi,G{jMݰo~&6Uf$Ԏ@5(aO=TE/e;cTY%e].xLg|Y4v\«*KZ4zH4,(˥:Jej YAkTQqzC'- bu2j'T9p8>V* ږz$`Z7^/7{`Pk`lc i y82jbQ_S\$vloܺzŬr?CyUx LK\1MgIOZc,8?a͟5Yt;#XNDKsvʩso7 /zsN`'!$K"С/T2ެz-5:#V`|E2E%@kQexia/m PI?p  X>-yTl>;FhJkZ[TO $ ].YuMmzv8vт: >zژ}[q]~]f1~x }PFIvYmŜAZ&ecj.MϺ!=W7E|,k;kWpn1̷UY ͽ8A[<^Ή Ji<,[NnI+ADX)wF1m1uѷW2=(5׷ u%k$ ǖ7LɳV݌j {3_% ` ;3;$ e*~𮥲? z]pBTyh1hPXA3>w{qGGBBh+3o$,amGI91"NZQ[~3 mqU܂`H:Ë́`R*~hR"/=y(.5@^?P#A32ZG.2N}\CpML^hMv9POS5/\v*V옘fCNY_=%8_0-bߝ"e-bNlTPό81L2VlױRCSR]J 4ŕv[Q;. 3|&ަ1뀮G)]9 &kG^+ |Ұ3ko]=>oeh1D<|BO_чtR#ziαיR^\pCIb~4kD{}N ?D"Y\e[D(&,ڢ^~` 砓 Q|n'O@"\i L<3\>$iKW%+[Z#\A:,-N=EoE~NtTa/WwYQl2-ܻxXH_l:05 >=-3j1p%5qgLKmPŦ(6ZbmM"}Kƺ$ξe=KULZTsI?g %*hd3-ƛ(T+%KFAEzD4(*T#hE?ni"^Zi3*a*$Am)pSLtH~KnƯ@QG$nw)q`DL+F  O`\BL/ C  b_ 4V,.ݹޗUB#W PϧOfG7pb*sͼ{+:@BnzQ/dVYZZ79َKhDy# Գf}' T<}|ޔ"9:Cݕo7;SS-njtw85] 0f`mNpT>sRѽ|x'/g"Ќ֫w9QY[>"7P6߉1i mDay BUAEv|sTY("?K%:R%  7U7ݢdXV1~j-gt7I ( uu9*7㢇T3o:vCN'}#dSp{ԓ2m7CЪl L!M(G ɤp;m A3y]RbfKX؃h:Bɧ-~~k[3x_ixw,3Y喷w=mW2Mj*g8GPӚTVF?zɱמȩs\E2ZɗsXXђD/4 1zZudt\~g29O9ndSR0@om˖!3[d~$}b4>Wmw_d١_;fգzOCvTZ([Q0݊XXd86rJYkwR@g}Tp|`V48fAum9KZH{ُk ky:w?\1Sf{Wd̑&u}֬1Śȍ N 8Ayܢ*`ԆqŭbI_1j{gQAS/9O/mvUSAK{2f0ς8\P_By"`4cl_$@d?AXzCLtMRj9 p@Lib',nmomvYnBjnl#o1Eqg#OQq?xik*vvlQ:wɮ'jGaP$R[%m;GGYd[Ə 3`'s'\ox@H-'1cD .+A1!Ӡ'3?YL#I`ÙN!(x87d,'ׂ/_dr-F{ Xyy$zP $凶G®W@@6P4;_O֡a ʔӿef)4kS"F#$ѥB2i :_|\ *ę˒D(E+TPƆU֝9@5z@.mP5"$sh7BD^R35/ !]_#x~ Z0S_.87OycyVOB|~r7qq%ZfABuϞonz!@)^ns@K?so',]d v (2W~-ja@h^ nd#DŽ*)v韱j Ez97G|ZM8KA d.ŒFm5by'wwiV޸,t=:S}9 /GchNCRF)mC>:zaüRF|8妘+:-BurɊYzQz! F0I)`I7 ~NkFI ˆe K ӷmGO/./cL O8őⰓZ7gȱٽy^31 "=P冯eYamíi]WrQx@kWF}:]bEفpG9ʃߨW5c1cb"!'UO?b; ; 4G#e~VMĒTQ`/oCl9(A%g _IkkSzQ1n {:[Ǎ 4TRlkJ X7]!*z i>F0,%؅!F@ C^E,kO3ѪRcbv̟h ou; kb4>Y Ntv-6$>Mm]k2⬱\$Lp6o"_(.8-4K~lm!(︈hz*t 鹸ˑ5,&ZjJ-r>2}^=8wéf'읏SIb Q*hL-E>j1̭&W\JmZTpʀw&'YaθbsP s-P$B#p(.vc !km)*(>\t5w)QnBUV_7vblۣré'3Lwp K#"P7'-.ViT!9#݂Cyj5BK;6UyE$xm%Ȗ_j~SIxY؈wm'εM4R Px%MT7IuOS(WFP4k320ctV1"Eiߖ b1}zB}xuNi=qmj1o ) l-Gh}PN#̄|Y/+W"&˿RxaV;vXJGm*R⸘.FI 4342 sX2mo܊p[d j)l׼Y:5 h) 6&az+7z ÔmGh+%bƚBAtq.4fO)/8bLA[r9l 4 ؉ ?IgkXU.@6mz7udD;z!İ'֔N@ Gv NBEKn$z`pcͤנrpe|MQĺKIPBvvŔ;8~u@Gi섌o%` kc·brV nsYq*'d ]q¦2n5zRI;Ŷ ˍXr,|y` n(xd x們C%Msg9(y[p5g&3 uϾ@~Kl&8p?*JLˁO oi'"Dc`(!e'o: GiŰ|I]AHb5t&:#Ly/ؐZ!;HE)ӕ'5cA.>i6*8P rT6,RBza51s\ڠh?H* ^CFpֲVNH#t{жG0mhk4LrvYx=ďWq,#(I{켓;( bJFdNVyW[|ބz:)2ǂ L5 鑲a>l f'KGk@u{'bMkHUNLB5w>j XvVAaݴȐg"qE| 6Hs˛u20sY%ǣ 0M;<ٞZb:OᘸT c/~El;'Yp)g2\j/##m#UXѭ7C"#R<xkNFRES1e`UBLy$r&;dd"tmFɌ':7;-k_nmPR/o-=?vF,fR.ѰQւGqЖ-H(cl#VW=dᄴ`H8C}{snL NsuDYlh DfGG7wiS>F8 y0- 3,ZܣY\r$fYu3%ѷ9s}\YK7c"ÄF[DPM])LSTk,1TCThXg NsdFMQ4K2=2tk9,kdqqS*^}.t) B~HdlCc⵽~}T^?Z&ۣcϨ4`#psP-̠=#}!p8 2%[bYآA+5M$Q DNΤ"qݻU?PTue1=yMQ] Z f[jI̡~6] J61AK[=R$C*-y>d?{}jҍv#Vׇ˂4T\*-4Dw" si jE*S#8Gh[kUl~".=T+Ə`M8%F`TL)1^-sD6%e ymmȃ@E]]%n8A'uor2g|61 WH\ vg#rF 'tHUҥ$54-nxja):("!Ϛ!:_ uK;iUsx'&$' 8#\1r8$onHպuA]cвlNt My)+øO˫ sB7@mK*cV2 Ep`Qlb2$M/tG#|ZĜ??|K5=5O#ZL-Y>N^*{Dg&]Q.գxih&)K8nHbjtRĒdaɬwKx+G*PD10. ?%Yt(h d"t>!\{ ]AL-:*}B>l/qx[$1W6+ hrPj)Y߿٤7}5_hl҇4/ fA/]u J@DW  tq I6GD͙M\]:WlE`E͆PMyqNVzE=RG_6MJ2kQ@)"06\0-Uf2X֛,GDvsz#ҀM }GƋ0%wkEƹJ)q 7Lpb{jn̍ <0!3X_rRb*{HJdCN?d PQØ@1@k*rFGY]`'b|5z{^8U Np#T|dXb-$N9^4ܬX(rQ DZ:>dm\ĿYj@ywW <_w5[1dxs5КWzMZ!dʎOh-!` -Tq[` Zgd%<&$u tmɆ{BGtP( w4I)b<;>ԳY>}s)[)x ,{yVݨaz栫 UJƝrnu 5ݤ_RD.!2 P.1B`MU {L'ԁEc!nwbI,~M򃃮NMS55@8DߒNǫͱ>纋 gm(H\ SߙSKV\۟iI`PYwŶ4KdJdnu1/d)@A KHK"DRxAYgb=zX TpinS[a$Nv0l[qu+QԵGgO!6cݼ|b/ `e Z%d5GK1|>B Y'ERE{f> 5̪'.Aq*ld$] }jrѶ/&j $h48, Ietkt;;0Z*5QD-lNcָg~גw۱ɦ4Dx)+j܇tj!27u"ྮ &σYn?G{?%JܛN-) 狵vRbBxUIEѤXwWwU}a b j327.i50!x|q VX*Ox*>~u)NPè j&ncC5SFr/I|YP&vdžnOM@.NطW,vmZxM`QN "p_9}\!;1%IYa"NlꖀÉw==`GR77 |fbaك|SǨ_VLs^7!tx]"o1帙F+K 'Yb}OAH$u wVGPɽF>GM6,;XW}eJUϟ"+lTByqzas M0A"7!*#QX?i  \ЦiCx?/AWyt6hV5n2Fla"H*-ƙ$@Ks$i(qTl7]q}+Azw.^Fe(;N?b [Xܘ4G#i{r6k.e\X>>$;9>>YQ3$e;ƅjuH!"i|)A=YfcylF $~F߫^'v+X&ڇ]CUVT73`|RnWSH0/h?W(kh6"蘜941Qd)_)Պ߇],a,ա'x9?6.Xj7 9m,/)Coك/c*Bh]PYArw`ʳ^!D} 2:yD1e7*d˒N^OYy޾s Ws9k)`{ ;M>jE-$M-M1z]QܯDlNPw5ȖqЪcݏMn,#**ϐm&(5ҠF^|.-0qy :$ `d/]ʧ: :}KEm/5i ZPs殮ţ# z;2Ƣ#ӵWCV7Gsֶ%b{3&yb edmՏ9u>%&3ir&0 N3sIs?v:Yu<zdʄhmZ;~r'q%y, \y;ٜ[V vZZp!YvVfPDgۘJâJǓ;N~1X)H~U/XԤY|jްWLGڛAo=(Է]ItJc6Vx:<`,SK;Q4o`d ERx4*\ % >JVB^"ǸR-fr|bbqB m?ՒF>QkRNK'@}޿8%k&,V0~.^.dXmj乲QzpF|ʿaPh5Ai]֢m\o VCԑM0sBme8uK.A[՟n/M'j/k' DWg@"#;%/Az9?8{ҧ&bGҔ䙱>qF/v!ifX8,gI:ǔ,*>->Wj.R\rƆt-{l$撽d3VO{8vT/8,: ZKel3ڀU@[诬Osfm\1${]j{quI`5xPD^0Yҁ(Q0?8]hDBޫ_B&9ND}nG>Uy]j|ps=9 Cu@ǤXͯ"n>[}^ڭ+6ͫI S)d3Q7q/R 㤼{c g&MU>!wXHL79eu}fyL?OkM9]oCXtp5P7!, [T!gQpI ,w~|ڹ%<<\{#};UZZL \qFEU8ᡐd412m 6u<`iJRl.YOCBU!Fvam#i(]@`1.VM`}^IScV:=u6܀Ge&{j$cJO(! k xn̳vugN k-!m̅MgD!5PW'w092sO3DTA 抜EqYcܣG3&\LLd f/B#oNkՍ"c2ZRo'JFQ})Bik7ʛ.q>iao]¡8Zw]k8?)jZOsBD0U(* `IUۢLԜQ]3:dua=*n<45ja{֤Mwïĸ !6Uwp[<;z P^ʣM{m*2v#M܄+]G~4"XD ř_YO4wf1,*g= Nrq=+8`=&Q9 )'MʆGmi Y_ i9vRM5;IkAm6$١E&mAV-t=m1} ԯ][cתP IX^a:QVVJDh9Di8< (9tH 4]h*ҩoX&69Y_MAXn)يOqS$566M! (R2(٨ɚz[LJRV;I^Bq>C[|/Sɼµ`cfem(ZnGi6kCZJBEhcWʦUHCRQ=i(L/\ZjmT qF:` ݻH$N n@xr}h0mVar|F<0uڑ|\7ڳSէM;dž̅xl( '99J21$ahJ)f)z!ڙa*2;MAA(t·P@.#?W//߲qu {N;W{O:J[ueŰ(D5Ks+OTUf5o"Zn^g1: h 7kC t/id?bIWB,aEW)?MLw`,Cjmj_%нvxSkL܍Ox^vE`6CcK ~qBWHx BH@M%A.W`&/^8Qy}u&+;^$zJӟAtcQxtgvz VPtoHPФ#(`g+IUg\w%/%zs;,WGE{#|̩X ζ4ir fGC%'%"'<8B,5%FLfږYz sg;-kء o_6دF%}z𧢙y[o{U`Nrٍ~nJ[dD,!Ʒ ^J戌Mk9M^iI$tGAۖĥ0551&pYb+z ×YlYˇ?xO"嬾 ʬ7`#.F2օANeE;V.1 ZBtkHܷ1{׈f5ojѣ<~"cspESkg2EӋe(Gf;GG8=PD:/KSm`Z '3v9ŃyI#[ĶZ@2 طhcuH2́hP"DOs!Sy 0Zzpˌ ~cױ׮"EN&+!҆GJW`<u~)ch2xw<[t*>u?h3[vXz^Ьxn!_н%l~;qvٕ53t2l| [ 2HMBi,!7/R#4s;\֨h&q# 3^al*P"6scܕ}r;8Y%G$[px Y}/}/(gw洦kG nčD͎QWl_{-uS&, ԭ&\uIfp)f(O3rqȓ>*'gzStnjF%9CFcJs5&?ּLn;hIJPz9DN hRsΟ@t_c3$CB(+wffj'gg3?N#vJy{z| &t V؜*lSgN\'_3mhz}"= XlsVlq\rbŭ/u }bTA53F)@O1uz=ҩhem,aS2ҒJzy(tp.\;M` 'f#ЬqXiL[U4 >ǟ-ĺ.z9b: ;:0cF(TwvF[ua#Rܚ5X !@eL(Pz*|ϳԪ)skz{0Q)b,L*f#.Pߒ}#dFZ[$n;`ZJgJqs$\Yܼ\,C`c8S<]>gZt'`Z'6ʡ-87,fR/r?k9zzT 0Y f;3[j- y!v?CSvW t=xb&v{ygS8 %1ΡLx%QNh"3A/&.r }D)wۖr:0zI]"j?7O=ɚ>;g`dv <cֶFog201Gkfzfy+7έeȶL1:MVכKb#:kan I9k&e]SqßAD~'S#]u;15K\' ?B8$@+'~CJݯ򖑯,3̃iROUsA!l)F MO1'4h69/ФȘ18`?vkU6R]kzi1S|5抂sjݐW4|UL5$~kUD~1RډD<8<9N B ch~!AΈ/&7$dF(x%0>MZcVyŚ<ֺE/*:ĉ$`D@Ox#ϙ^H,C۞RqhKB .nJkH~moGܜD.Q(]KcmzMvљ$,(}7bdL&{H}H/WQp*sLu8ֈk0ҩ~_ʪ0XNZ'AՋZ^܂ LǶZqoޒƢƊaG_/l6 !Dpյy9dgRCXyM J?}(R0N K:ylYH km  ۼb7og%va@|`glYDFaIA<ٖ(e0>YxPhÅce}9 ҿ hM5KI(``F&{fpO}ۯMGzԅOX-U'`Z.T}82ϵ$ƳͻhSGӋkO&2 .oZ!D(L*Fvoec;m;@'A`␌ ?b[X 9L'mNsz_1Q>*R$(ak~Z2D !DȝtPEv,HP {IƗ;MöOuDC8[_ȠQ+F3M3i.okf;`Hoѓ1sKx${^ϘGwwbu sDuFrfmE,^J̹KE(a${>a.YEe1c;mThMtJK\m} R>xv* dYO Nkcg%9Nm% Iٟn8xMi Ka5)cIˀEWvwHB~(}gs$]y;$XiVX(H2qʸ?7|nP*=lw9 Uw^߭ўhI Nzf;<ҀͪÀgh$aMI@7.BYo<KC%Mx^$WX|bg=u*!& |E:f^3OH{k&Z DԱ{-"mr6`Yʂ0iDF.K$J@&|Xϖfy VqQC\Aʺ:(v %&[~]G^͌wRJ"uj]_3mkvX \ #|Dq,!HoϬ0DδoPS.v F'<:O2֢i訣p$E_Y81}d28W T{T[.ZI(i~ID=^?aWQ7iJDX :yWw f8^3O<֝x6ozyv (M"$E.Y#a}'#$K`dY r%ǬvHnLJXN@iCo }Xz~h:؎]9B+w*_1ǝ+m/8Jn\%fω}Z"ܐIK"7JQ$y %Wq0@!-GOt,՟JV9tIz 7މZ .t^%Õqߴ ru٥G(,``~k;BOۂ׮xPg+Kh~{qo;.rMM"q((m)_m+ g4YBDP|#6έMqf31Ż#9V *'i Q.3WTIg`zzxҜ}_s/JhB@ksdbœUBuruI$i͓WZc7msT-ǹ 36fn X"ovs$9CRJ/&hlo"I A`3 idrGs85xc B겗ٚ4o٧ '@nN~̎L#m2O8.3N{fه-y>vyU1Y% [jebI"gjgZqaF3NHkp-h.&6 L^IԈH0k|M-4Km#DCAW60*.rJC;yT 2 x&Q)f<nDǓ4Nvڧ F*X C-~y˧Y5f?WWwCQ0̈.RJ LNFF8bDH> .'ap^> 4VNYJ(pZҭye!=g[/ ^p^jHQ$KP o)c-Vy])lLVE qx4NF$x7k!1ۆAW&VA܍uZn6CXXS>w$8gb28w~7@9PZqAw0ӅyËQDTpgF֍s5sg0W Dշ"cIVGUe/::~DLN:oJ͔:DAn`Gh?;e|5`Ů3XeO%OƠ^@9/:cm-&7Up6O@2ӣ3j<'X6cA)IDnj$is>@B/ x35<Tu_nP\9bW{5\Qz%HDf#-sꜱa=jC=u]6mwf[[ļie-9Cm~k85SzcēxW@o'~7u(7Z~S6yK~>ɠ4 |t.̛- w B t"Uj5zڭh(A'oѪjup2{SijA3Ekg}{ѸE %/]Sujz"߁WihrL͌{k0݇n(PeS'**3X7}&b^L߇/=j*7ޗǽfLf m-#k,>b=`P+[6ܝOMK/KopKR2ΐw[yJ2%(G@bnҍxV!X!.]`haqXݻc $y9S'#=ʐm?bR[@ĦTa dCK>1qkS2h^C @#᧷}c(˦ƴ*B藘acR4jƍΣ CYM2L,},% MyHV;2Z&hūU bMߛ޹=KX2 d%sʔ==Ƞ }tL]f⻶b~w%z0)e4Q \blL&Ԫ;Jy!4r9g o"})nQ(hU`%)dMx4##@KZ1#Lt2׎- 8޸y 6sI]>T.a`IAɿr}^6 VXB3WxW*%ƦwrB,9v!{5#~(Y"QEe)t(lUxZ;{ҠݬHI1죔BşcgܬffO"Ah)QGA؆z[e:$[ziX(Eq9r0}A,ıtYY!'P ;G7eWr #%є҄iG {-ADث3Uhw#ݥT|h4^*x ,C}T[d`GK_>7k-xݝ o_S#̞4M\d3;x+M@Ħ%pMhS^6OgTcz #Sࢻ(NkZ5N/x/$%g KF˺ ,|kGO;qnS*p0Is_[ ƯM i(9C%]?]uƋ:6Mp&\oc2f7=5̧/<9/wr.-8Jؗ * vw{T]79v|N,x>!9V&CPY174~`gvBQr>! [aQ ,r7ayYAda 2}I8<9s즯"@z©<ҟ+ıAB#:T Ptw/fط7= 2l_*'bPEڨ楽dnV|Bid6~wRJݪ> .o54%W@ytw*W)<7!-ejepgdEddr;g7Y1an-My>Lށ<pG@v메fFEBWf΅s՝];Gp Ψ yFhKκ'T;J _;.>&~xYwܲ8?dje`}L&^|yoU\^_v`#@r|KX`>[0Iwl$yQTr>\nJqtn5_}-FѪ ^f `):k_MACr o?\t|0.3*&]:sZ`i3%[-+˔./,jۺFd+gg ^ ͟JZYZ/:Efĝ|vB()yVLKNvv[a gBnL_6l#~`e]+'_j6RTh6;,C|/{1&Ј`\,=d/# [cXX-VN_]:nԆH-S%4 ss##3үp[k ()MVwU9䶜1F=?! SUw7[ti#|T?Ks~bNi9e6eBR^8ȯxe'7JFT<9I~ W;)+2B{/k2EbX¯CMpqѽ۳>'z%wӉl-``ACy҇bC)+\Y 6eὝ}1؎0XycTÇIn\e< KZ+cF,3ވn 2D⹺ `=(lP@#ԆjaQ%I1T^ҼmYHh$̶j:4c*aXւ? fTz.9uO+U,N>Ktƶ>~kv5`6o,=7iXqoiz6}F;=iZmOW풡\eaMBj_{:W|A-tHz![bV&78&Av$`xF9rޡn P k~SF %I[PBxkQVGx==DCاϠ{;v$-: g9 6 ongF[]<2ְ7Y+UG#dmͫե7>7r\%Vf82 Q:DǎKRflmPtHl3&oKsQD+pSEW*=KQY[ za}& (@;dFt>D3Gƶ2)!YA}߈ }`pxwvyKmsn)SW$u$t$Sq9FӤ8~hqщKU.#bΪ:J.؀ɓu q0Ѕb)d+ߋ~ޙ4b=p3Ό F'taS*suDTY/jn5*eÝ0d8cÖ?9ycʫQg9d/'/-HN 0zS5׍F<RKL<"@-%hӭ9z5薍ECqGÒBvibE7i K)Sua syI x_nbf>o!R'y>msכ?1ޛ<|~2Ne|rHXcED3-H7r7/B!loQ!(jLI?37+W毉U=SI"*t7+k%"OΠj2=ݞC}`yj41NJeO7,;˟<ѩ3U ;.D$Uؑ[1i&adW>yHvebœmKa{'WM[:ĝ&T B#eHcw*g^2f xz$lfCe z3I:nWomb :FGtPblOu@73%&6 (j˛G};qTT"ru}O(RZ K#g1 jwVD-~mn?&Eȉ?+J'i9 o KCv9%~{m1V"Bp)m(p;"HjoU%S! ܰ/TTAU ݹbI$cX̐䵗L}A6u=˧qrݵyG_t_?UC3E(210YV/lz3TbnX;%58z%w-7Gk0lEqB⎽+wIE~D|ѽ4|>ZFwwV5mv(g# K0!mFy,;w6xP ÌRb>"5N=j`~yDۊ| TW$aƴ3i3q8~  G3JOG>XBSMZ^Ljq#ֹ"6 "G6-x א6K'MGw z9aمlt:mߣ 61A sbbcdʬ/Ke+J}97 MDtV@"/fxdk;CH̉^ƼŽpDl#6Tot\WT OMiUV=  DD5L]_ئ%:;AY:pN&cgOPNCRܧWC+êy}4 ^oJG]EҽKQB>rAhV9HA=i%؂_k}pVm;sOBfL_ھ"ck$p b!*`b-=ګC-L|% {wq=Jx(>!>ÎQ#.`pI=!l 6c{%Qn𷺝` GJ$===_|$+^22tlt9i^$Àz%Gsgʢ~?O:G4:/U d$n%qJP%']++jSf/S&\)m2dG>t}7k*akZ?:srrN0+MgFC˂u |kL1[=Xܐ}@KE#N6WP s'ش=#H6`%'s6y6\.,z-GHGd8^"9FO0^3BQDhl D2 rk?ecȻ.ʯG.>x46,/P6-_؍&eBH ܘ\ ,ms2zjW٩\}.{g 8yYL :5{_>M'ԪVmbRBhbج뜅q7;s_~@bfu ct7ipRKa  =z`YOl f; (;`G7{+;*ȭJ Kɘb 6ck+N_=RZC[ hӵp/f>hxĮ0)FRTK,Q``^5%/qCvKF22vHS-F|3z+/S_~1U+5уRP~LI:}1c,X\̰UVY51B7V JG AUwaڞ o I[AЫ $$ IF-=ظJg%"¶ [.ԎI0{h ŘIc!27cA>4l IkL;oO8KֱSeVV̮+ &U%CU:,B)F;*AWDC+ݻ1C,>)~}36Bq%Rq,G[L,oQZO`m> [f)x΄V{/ֻ9p#mi6.?( ~DFZY~~T?]9NCAb̪nds7–|AJ'컒$Bpq}_Q7+`sx,6Z7x-X DCшНt;2uJtuiW0?%jqMñFs=qIz`:; ĥ$,ͲAC ?0e|tê WY^Y9l_9\B gn>;'@]V$ F?&8e3us]?r'_X+d4|`Si"$Fq+p1B[H<}BCO̯J-4PQpD5_ŋXM}K(u`>:"ebNO[]zY9,S6f9/A< .R17ɭL`[3zM=&W]1ENFK>(oE{4an}g2ˀ iܪ\Fc=.b~iczG%$L}^bHFҧ泧@N'ִqu[NN9"އrF3-JWWw\u~ 04wuXKF3y YpRs_[Rvi9W!t{_p62{47Zm4N@\AXHAXDYLy]f+t ^n/DmF)tk.DI12 0 C[rdAcewCIP/=`+$& ,, B=xc}NWm*nH<{J4 \jla>C._z|*\ԏmKM僋m\#A!T0O*,'xGkX|,l83N+RmDN'=Ǫa9Mi,umZi`rjok>AHYA|.+`ar*fg WUA:-C={;j~ƜeuiS6 %g /-  "lkL;G^ ;{VM]V ^8w<*&SP`qokDCwɒ.KsTJ(9`ʇ}d봸=u5 M? oލ1;>Q+vEfw6㆏)dJpnK?, J7 LY 뮉ym7WY#BW%B@(_%Bpĭw0$Qf7Q.u`or@iv5,[B.K lqW- AljP-Aml [ʐ.WSLuMyҚ >9exk,c{>43@*jT+X`EMXaxgCCl[F˦GuyGǜ;Ťn"0,FLxt㿋BMC؆SFC{l_Q +g+ŷɪ~203 N˸fˢewQٟ{w1zH47DYER2I/u w'SULo"pf'8vE } ҧ՝# }7=5̋1hru RȾ7U.7-FQO*h.At yp-S;';vQxs$0 .3CLħ 'ܑI 9V 7])X<&v6$#FH-K 3z(պ8Ĵxt:>QEw:OZ+UU/ uqI @K{/|Dr |SQ,HСiMM8̷L{LX0jrRX!SҙrkiHW-%Ue0htl݌3YO;@ |"6;$pw7GϥW!-ODMN~#$Ufnam3lkl4(nhUѯ&X b_TMSa;EA\#[B @叹=ʌ>BmU!kC:c=3%bmM1y-~AvyvyȴytEc"b[juRBۗO |v~.VȒ_WsN2;5)Y*P;h2U TkEZJ4CM3`ٲ>kwOn}M]KeGhnz' {&2IpV]_O72*aBӈ|x.E}"@(PB]ر+R6aZjIt{ehL[6S`}4 sWi.N(n:Lj8H36Ol<—m}(s$.NYW;ʼls5-Բm_oyT/Z][Tc]reOtRmwSK)}DZAcm燹fdPWMGٸ1Qxov#%0ڀs<.-Ce1je1Z̗K5w։%MraZ[jk8w FadҞ{bOUI5+] ⿎ւ#~z|#?~!^KyvbmĿvhԣnlGYEL1r!qFݖ<IJsN\}x1MFۘt [A Q+pP֯k AM$dn$-L*y#uj3i^:!^Vv/,ۨBu8676D)D=cW$]e"K3:Q31egBJզ< y<WlҋG1$ʀ}Q"ǽ р$KTcm^ӭ/x+_>y-wYlF<]*\zә/xH}n~KZ-PnkxV^ȇ>un#G*Kzs~kxW}\?p?䂃uME#& Cn3>DA>asa#OI1U3(J6x(nOWp37sheXCT@ `>M-;3>&Vzȿk/n&P%ם>|34)M<[`޶owzbK2#ҨVt]" D|nRcA6gNu«"k7( $XHk^xz6d`7fﭙam{mԶ,syR`Wm.`/*}&2x64"}ݿfD=餭 '\ nTCy˟c9L )N7|sEEGJRzǠ޺OU;'qP%p`N!"x079=$SEb-aVC%lDL+iS 3];EsoY2N$ɀ ^4f_ W/V]zg^2[ |G3K-_UqvA _C_D5AaO#x~HuGM- ri"oU8S>,.)B铧`u9kc?Y V| ;\}ۋ;cQ;f!lDDo7ϵ# FO"8]Ž%.M pPA&kh06&aO6`&|6[ /pvc'}SfY'eUv:eܤ0CAhqqxe^oBqfUwr􁂚{|$@z -?|eIػ^kMlxhb9jqv2y]eP7ع| ʹ>,q2j=du,)b@i:dh^+ iaݰT.-Qo^V/@xTR#&tB>044-}NO<=qޘJ?'m$$q *ƙ/xe'-<%_Vk<fL_:BڈZH1[?|Y/ѫ_]b{l^ "鵐[('t/%IsG kxq|ǚİd5&L7+I%IwW0s V/J[}js ?.3۷ьfkl2kIuR3 r6q@qfI~ל{_,"\bZ* vQB{1D.YB#t• LؖlzƝ=0IĹ06y4g} L'Qйs2F$0@€[!i*i YV.]@+q"/دtSm]0> iM(]ٓQ?'O2-Bk 4 Z%ޛ,ZĦYYjiu_&?ngY%r##Po᯹= O^qҘ"q*/2Ħ.sA781aJSԗjWlN'tAnTٹy#я\yTL JչǁKLƃV&<*3bTkbw.bh7PP._@dj1fەl)ʲH C5g)Q0]`ƶ" QOȌDp&̊7KԐr;mO2I/j #XŏN P}/4DoH񵚳VSˁ&c^N0, lӕ <dDk5@7fiXPL tv_0k+4PQ󀹩k*ȦDij ȳ-e0dOcX&mTmJwMIEnf.U삒jh;0(v+rieaXpvT"!g(qz^zrg|U3J%PW >ڭKZOieX{J.qR'"f~T(dڑ S:Uꦸ켰x 㔡bBR5>٨]`*,?]/nn# ?2 &V&I#x!KDN]~=tN˰mbhRb/ٺYw'u2gA:kZCp7y?LZg>@3 p]ewmoHޅ ?tخNH@CgPqYӒ{R4*0 d޽[䎞ǩZ~4L=fA yr"=gަJ-o%VcbBDWlZW=&fGE~* Ƿčvk]w*O98TM4aV[R9煙@ КL:Hv%6мQV>c-~EqJn[ipp/x)r6z;FԔﶬ?}tExiک YpR@~['u[J)ImuC7LiK'!6A_W{.[}3 5W&@L<V_ ޸S du,:(baGe.&,7?q៤Zץ宅`9څSE:v,XyW S ~X\Ⱦ+ڒ7 {2Ydce\Kԋah5N+1!+#$|f7Ԁ 6% 嗽: 0lhf{kb~;By-C"ca7ʵZd$#CEW 6 rq1(cʷGĠvpws0-sԞVQ2X~7@.O  MawO6$^:0T>ҾL8v]> ;0!~xȽ*ѽ=sז48\^$l7B7#mT /O[O?‹'ʞI}Ӌf8.SA&pct.&p ѯMp}!XQ!b'g`Ѳ#qBvh/2t?pNЙ|HySל6vD?K>?{=ru*sR2]ZlZh_eFU1LG 7rXۅCmї;4ɷ+*c`d2;^`?A}μINqa L `J@eԶKє춫[?D0!P֓Wg} -%_pxRԶ|$+s>KI C8d't790M[W[ΔivT" MmVӶ#`tMao0uS>m9sLwGΥ\}+ŝSߝ,3q?c!T}jBO 2c넒B7hkv5bבfL];鿅aIv )Gx`zaa]z U[˚'%-7A 5~re[n>904@[Mz0n-b1Š'~,φx"_]PUۮyӡC8L((CLZ8{M۵0{F[SI {ce0@7qe)Éq1J(`0nFt؃P4ҲK5'ؽ̦Oq5g࡜ƸB! NYBSC'pͤJ<;ESl$v1yx }h͖( SF/wmzqF}I=F?X)qz&0a6m*6JW.}s&ɊJeTwC)/ e&ȝ)(mċ0[c.Š{q5h%$Չ #R䙸Y$s *Um ؄N.ߔ.v7yxFE-q9M*|˛kWSPw1O&J]%<8\U|uE;}β-{{ODQ ?N)-4 PF Jjl^)?&LBZJ/RhMU!Y|aWANvV:D7V*av9,.v@6N5%ct4ӝD-x-rc4S[y{Z8ֲ3 ;R~L xP@cl:eKE9dXm 0HKP4,Ä Wm;ຬvR7Īdnu6e$5|4fd%psN{'+|Rk7vLN[NsO+71vK_z@=QUk#ѹ#в|em8G}Z2c`MG_MΦu~{E 9s$8uFN7 L{Ç_N~z[KJ1"Zien/qqra#~@榽O`^fEAw8)~=)dYΞ0^"C*~b5\,![$?CۋuJ){'Dc 4]-!$JˆDg>k|rC5DeISte4Ӽ/%!~5q66t:E# gH1-򃂷S39(( >ˢ@<#1')dcs\fOݠ 6`~E:zK\ sz:#XcB47;N2P9 S9mEmyIjPWanYD+Mq_*Ȁ5" ; ,ޜH%jh[#[4X; ^9:?2U0ȍ~vVqWV, Dk-k:te8i3 [JZomqmf"tX(ӭA:eAφV(_Ki:rOI|gSGQo)wIβ-Pka*Ku?E_jl-e?v񲧒RՔ^Q"8I_f=N;[Tu ]J(MxU6{Pir#M.c6eݵl@+ЫN5^~s=2VV[S-M:9@ ܑo2).TuxOz4EbϺtbVt/ U"g`1>ٴGvji܂AbqgPY0p%yE%AS ʅ@|٨\ dZ'9b2i@`+/;6~5خ#8FѐR?Q|/y$=@Q{ѦjwCfZ8|Ckt[(9`q(ev㧣 iA 5OSbdP<-L q`.nwG:KT} ]C{=p&oA+ hBV4 G=W'tNqJn5Uyt;9+iem& <_/bMA?;0P u$`獒 Ԗx:KlĬpS;xCq wK|Wu?'}G]E- [E:[0H*̏YhlՅ+{TpƌlXm [!HlficqlJۉZ~+LomЄnIm B (.I.Ow/S@G> Xoʟh bD8"p0ꥉ$:yF2ۘC`n&笧{{?{C4*8}|>[0YmGwVճ,j{LnS"E/<7,cd">-e_ {N ɎA.)Lsn0<@tٜCۓÇX2X` 'ǡi׺vuBk'|Lc :IPޤX5xkܙ$ hթ!·]1R,ƨd ߺ>gasN/gץE wO 7z'쥼;ԑ"Y6ߺ@"D`NG6) \)وڑثnbFEc9tr~avf3HCyIAکEt`A߫ "eRfWJX""tjeT+zYjN7j}͸AV?͞qtU:ѵ fLw #h/5;/ WG{@Kbe%3w|IIթjݻvsīX¾o{/Q/haoGpr~3^ٯp86_5iBK%<F S͜t02CSEG ;:,5!(&nZ:e˵ˋsCöpoրEZ1^o(q$tbQBҀZ \mLf"~}-ޤ?ۧ-vҨ K8>w:1 0zRy ?0Ua1 ER@h[8j0kVf4 |WUZ牄D0w-w`HjĴS$@`rŪE<OS$+.ֳj( \qUst/7ۚċ.[/]K#sJwiA蕜 6Z7 25}8as_; Z ,l@љnǭ7Sʼnwd\jԤɑd[l"NV/ڡHa[<2Pcwbj%77.* =4 b<] s?U6T'MӠS̭Ba s7.'{/͊>1p*҆M  axt/Rpa-mó]ށRŢ \БN2ugyC"%cU\5j$_4x0[kIM]hWk᫥~@Yaunm ?y*ߣ,50iNV~gC/!v'0@e2{1;u,XyC;Z{g |.{$_}dIMƮ2z3~X|`Ir-%vGUǛbfG۩Ui$gȴ1J]*Q|^lȂk\A \$G%HܘqU^ 6:4 Qa,3k~f8,WCrh* pRUܰQTf]Dm.8Q\˘Ґ2\VHx{Hpژà @. З'ꯢЊTS)N/<ܷ`8`3klܚ^>"En1s9X1?4;lȷzx`B4=,5LO SrX 2s]0 fkbo05;q|U 1SN!6z @h(^ P~#fR狧j^J[qbąri7*%8Vmoܽ#VuDŮ< 폠LsɮezNg*N {Q(*ֶiWo>K4D/]{E hU7W[d؏'M3<[1JsnBޡ6-ϚeKdU!u=^3΃s!c-،&1Jl*֚W7zKNʏM)h23b ^GɗsbP4܇;'{G9UyX jrߒaӃoBRjQ!8UwUyo$ȱ~6Ⱦ/i3/)Q !Ă}Вk2L( i)66"jDӬ+oC1Fr N.1RzB{DZL^|kN&x" ȢE@H!{ro"2_7Y:ďf;#dl&?Ary_|vWa?>93&)mm- u'b/Va6N@m#`ȓIG,{q) >v"t99?M[d- kcTCߝlV_N>Jϵ}Psh^[7՚eͬ}i\c oHīw@v6{wMYD>e'MЉқ!E?#W@G3Fq*I'm{[ub!ʾȆDe( vLj6d2Bb4DPUvV`GM82[)rLU1_8UFT6.$$_ut,١ۿ!drP li==ыL"$Ui8q{_xI| 87 %q-y8jVDiKۜo ׌Mf#yW9 ak'msu%š%,C,a'0wf%OP9̽%'|Z!cL!s"r!`n&[Ī.֍B3|~&|-CuU:/Nzُ\ rt#=Zk 2 Ͱ{ x־X*a+gJhC:''.sB]VfyIC,w-;')-E1ūž ŏ.Rͤ Qp+6OoU)MfK~'UZ:`ٺ`c3 f3D]h1ອ]uLm{aTV(}1nh4MuBlq */*gB (8:͟L"5K W:Mu^WA?fٸG/QnQ|ݮ#GYLV$SC Kx&pԗAǗ9Y%F6Fh_Z.,xucxYiM|-CKļ:gMa㖐-y >\sI ciF֚@,FW}y.Pr .d5-!?z/)Cn˭>Pp9ae.}`=cԇ ܲk+B@QD)rbBzYdL(ZqM>T{!qd*|v;v5 'l2ؖK׏% 2Ω!&"T8!* |'m"ޏHXtn(Մ8D,gi3s83;nGF{ݴp*(:g~AB@ B㨃Ԗo ~tRoWhL7&O]Lh ,S}ΒO-Bp]`6يܑ&6S};o[k`C7B'WaC8[0a%N+U/pz;rܰj/7En"K%c:Tg +Hݷ?H@c!".e@G=|֌B'0ނH4{ VnDC[qvxOb:*J޶6۲ (0j qlpzwbU]p>gr DC_*d);Gro{X,1Kx8\ dhUwp4iмo%2'l H'kF#fLݣDQ{gDKji<@0$/HAj& oG6Nsf]UWɚjм a,OsƏ5!Ri©ܙ/M 2fT׳1%FQT7>pfC##o zIuQcWmz.K=PlZ[ztxQ^&K}G;_1di(,3؊ț-=tUAʚ}3l[{k:p,tpezrJuX>,[0dD{6BP6`|I@C~#bc33B/_i4#ѮʴpҲJvz}򎄗ٽޛWAeͧj[ Œjy|)3b $? 0ˬ'k+6 /ewI['Wi`ݧz;neDQ>HARp.8?OU FmdStJ>=Ԭ.!"5k xAKJIfcj'fa8k%Q#D\Qz<=˰4c@K?䪾0c|/3Rutqtn#i)ƙrUVPp?KÀc>4.)Yw{;8T#;;5TV'Fq4-#ba׀g#C" .k >Pwj7XѰ2몱*u E^aT̙buZ6Gx4d .o٪fI#6o'kMaUbsGUʼnXto&O)!D̏*bkxٴ D&YvQζyůU\d`B~7f)VJH̡CbډM|y7G>ewζحv]6}^ÝUre X ux [̷<{x[8n"% jL8HqK5# ֗/bE&5<"Ԧ\ۂj}O tigS&=g$E$24kh|)}rdT0quSSYՒf/f s/`Lc'Ś&x9tު&m%sn銣4л]!MVGAH梚?Ֆ-%ȧ.h_l; :Ƈ:48=7gGǯzj:~80˪MAŇ(LipI˭p̽H봝B1 ݤGgOqH {\=үMj5,Q ,O\<LJf|j\+4 n'R@,\"6OYw=:\-xO)ĺ02ޘ z5 oĜ8>XWH\MhPZ8>ՃUgc"A.0 YZeaf/tests/testthat/test-eafplot.R0000644000176200001440000000765114537100015016546 0ustar liggesuserssource("helper-common.R") test_that("eafplot", { skip_on_cran() pdf(file = "eafplot.pdf", title = "eafplot.pdf", width = 9, height = 6) ## FIXME: Add main=invokation ## FIXME: We need smaller data! eaftest <- function(a, b, maximise = c(FALSE, FALSE)) { A1 <- read_datasets(file.path(system.file(package="eaf"), "extdata", a)) A2 <- read_datasets(file.path(system.file(package="eaf"), "extdata", b)) if (!any(maximise)) { # FIXME: Colors are wrong eafplot(A1, type = "area", legend.pos = "bottomleft") eafplot(A1, type = "point") eafplot(A1, type = "point", pch = 20) # FIXME: This doesn't plot anything useful. eafplot(list(A1 = A1, A2 = A2), type = "area", legend.pos = "bottomleft") eafplot(list(A1 = A1, A2 = A2), type = "point") eafplot(list(A1 = A1, A2 = A2), type = "point", pch = 20) } else { A1m <- A1; A1m[, which(maximise)] <- -A1m[, which(maximise)] A2m <- A2; A2m[, which(maximise)] <- -A2m[, which(maximise)] # FIXME: Colors are wrong eafplot(A1m, type = "area", maximise = maximise, legend.pos = "bottomleft") eafplot(A1m, type = "point", maximise = maximise) eafplot(A1m, type = "point", pch = 20, maximise = maximise) eafplot(list(A1m = A1m, A2m = A2m), type = "area", maximise = maximise, legend.pos = "bottomleft") eafplot(list(A1m = A1m, A2m = A2m), type = "point", maximise = maximise) eafplot(list(A1m = A1m, A2m = A2m), type = "point", pch = 20, maximise = maximise) } return(TRUE) } expect_true(eaftest("wrots_l10w100_dat", "wrots_l100w10_dat")) expect_true(eaftest("tpls", "rest")) expect_true(eaftest("ALG_1_dat.xz", "ALG_2_dat.xz")) expect_true(eaftest("ALG_1_dat.xz", "ALG_2_dat.xz", maximise = c(TRUE, FALSE))) expect_true(eaftest("ALG_1_dat.xz", "ALG_2_dat.xz", maximise = c(FALSE, TRUE))) expect_true(eaftest("ALG_1_dat.xz", "ALG_2_dat.xz", maximise = c(TRUE, TRUE))) dev.off() }) data(HybridGA) test_that("eafplot SPEA2relativeVanzyl", { skip_on_cran() data(SPEA2relativeVanzyl) expect_snapshot_plot("SPEA2relativeVanzyl", { eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") }) expect_snapshot_plot("SPEA2relativeVanzyl-extra_points", { eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") }) }) test_that("eafplot SPEA2relativeRichmond", { skip_on_cran() data(SPEA2relativeRichmond) expect_snapshot_plot("SPEA2relativeRichmond", { eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(90, 140), ylim = c(0, 25), extra.points = HybridGA$richmond, extra.lty = "dashed", extra.legend = "Hybrid GA") }) expect_snapshot_plot("SPEA2relativeRichmond-extra_points", { eafplot(SPEA2relativeRichmond, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(90, 140), ylim = c(0, 25), extra.points = HybridGA$richmond, extra.lty = "dashed", extra.legend = "Hybrid GA") }) }) test_that("eafplot SPEA2minstoptimeRichmond", { skip_on_cran() data(SPEA2minstoptimeRichmond) SPEA2minstoptimeRichmond[,2] <- SPEA2minstoptimeRichmond[,2] / 60 expect_snapshot_plot("SPEA2minstoptimeRichmond", { eafplot (SPEA2minstoptimeRichmond, xlab = expression(C[E]), ylab = "Minimum idle time (minutes)", las = 1, log = "y", maximise = c(FALSE, TRUE), main = "SPEA2 (Richmond)") }) expect_snapshot_plot("SPEA2minstoptimeRichmond-extra_points", { eafplot(SPEA2minstoptimeRichmond, xlab = expression(C[E]), ylab = "Minimum idle time (minutes)", las = 1, log = "y", maximise = c(FALSE, TRUE), main = "SPEA2 (Richmond)") }) }) eaf/tests/testthat/test-eafplot-list.R0000644000176200001440000000161614405735351017525 0ustar liggesuserssource("helper-common.R") test_that("eafplot list wrots", { skip_on_cran() a <- "wrots_l10w100_dat" b <- "wrots_l100w10_dat" A1 <- read_datasets(file.path(system.file(package="eaf"), "extdata", a)) A2 <- read_datasets(file.path(system.file(package="eaf"), "extdata", b)) n <- min(nrow(A1), nrow(A2)) A1 <- A1[1:n, ] A2 <- A2[1:n, ] expect_snapshot_plot("wrots_area_bottomleft", { eafplot(list(A1 = A1, A2 = A2), type = "area", legend.pos = "bottomleft") }) expect_snapshot_plot("wrots_point", { eafplot(list(A1 = A1, A2 = A2), type = "point") }) }) test_that("eafplot list ALG", { skip_on_cran() A1 <- read_extdata("ALG_1_dat.xz") A2 <- read_extdata("ALG_2_dat.xz") expect_snapshot_plot("ALG-50", { eafplot(list(A1 = A1, A2 = A2), percentiles = 50) }) expect_snapshot_plot("ALG-area-bottomleft", { eafplot(A1, type="area", legend.pos="bottomleft") }) }) eaf/tests/testthat/test-write_datasets.R0000644000176200001440000000042214405725540020135 0ustar liggesuserssource("helper-common.R") test_that("write_datasets", { x <- read_datasets(text="1 2\n3 4\n\n5 6\n7 8\n", col_names=c("obj1", "obj2")) y <- read_datasets(text = capture.output(write_datasets(x)), col_names=c("obj1", "obj2")) expect_equal(x,y) }) eaf/tests/testthat/ALG_1_dat-eaf.rds0000644000176200001440000110373613627006324016743 0ustar liggesusers̽XT]>> """*va'Jم`X`cw؁݊-` vb1y7.v 3kw#H,%VVuX\.dp %ڥ#o_O Jc|H4{,A+ޡM |^C%1?ě}!ph_Yk UgB0ﱷ?u_w U,żKЯxD6~lJ?"Bܾ%/c]{n=~=" )c:#@6z#ˢ]'4]z+޲qҼjJQft=ݖkZ @{ ,>mcOn"n=/M|G/`v2Ӽ@a#YS,*֞O'>>m}hS\Aqhaߍ|~`j/e+׊q1ύG7a<`J7a@! cڠ?aN̏υ"%?q7'Ns]HfaătOr$Oj>IϧcruݮQdCzx6oc ';*waWm=:W/C-}6^255]צXoWv=] \svL菩}eL> qbW1wQ~Mx1 Xw#|)c%7/p&abǸ؉0.*~;k<;R! 8]@5^q8¼CG7 ߳Tٴװ~UY*탽}N.ڷw /?qTKO~C֮;r(_puς*S~ڿ]Y\&:ڳ"f8 C=)(k\v)t~.c*G|e+pWi 0>?=*ߵp"]=|^-.0\93 8))u>ӮYjlɄwоΰӮz3Zpk~(on(h7{Fv`܆0φiaEpo?üoc;1nʃ[пe$U&|x;eJ|ɽ~FT ;~7)K^bۀmq'}%۰"\Mq}кT 8~[?L Ac1e ,]Wm~`7,np9l}!xUSOL([,W,vhߖacѿ}>߾ (BxnE;HBOf?e?rD[_ǔ qm+p*nq[bbkشF'8o'] q;[Go{#[lðk=G OY|R ýGj #~gO;Z0[G79S݁{p:}@~g~ٸ:Wԑp?Ck  b='Va'^Bч~}{T?/5~%Zff U` m3YÙG뗠R\K -_V^|}7T|ڮN|! گ[]Ȏ{|Ihx_씈!l%h\ɞx_6>ESo 0d~ [X8i"Xk,߫7+]DcUOWfգXgƇg9K0qM >q=&8 tڍ,NVhnylnB2qClbs֤=7iNM x.zU}Zq/nz. %/}% U aе4]:=nl41,2/B<{]Oz.$o|N¸rKQN7Wh|WN%Ar W%7xө}K_~{|% 4C¿s)[zZ^d~=Ƶ{oYCcoa_i%[T,alx=^u c,:fsYz,].d,v*,!o6#xZև_A7I Ҷv[JtbW!+ݝ}od11qtrj٨dU8e[([eDn~g څ+>8샡/=Cqw {gGw~ \סٔglVS#[ͽZ s{ʮ؜.J>[uxvk,3^UP^W962g>dgG6~īQ3kT.;"^WĩoF-d q gӸؚ4L:@9a^j.85z#nMW(ٷEo1(7ܯH[H{/|&q?&׺2OySX]2Ӄy>P5_u8uu'AFVF\%i\qW|,_ꈛ/f>ٗNi& /@xjG= XgH΋6zVM{*=Xr#6^^ru:^D KE'!p?'a9dR o&bY߀]ӀU;jy"Y#~IJ ;m'~((8v/GyPOm$t^>;*EgqX?>Q!xAǡ_P_TɅ8j(CBafIfhOiNxrR-gF<&/cyGQB$K< l@32K "[ neWq[:}kMV%{N>I>k b>F_/^E@;WVvpb1o=0BS`wgW?/5 ;a!~:@J|N{]1DP{}Y#$B[`C^R in0nȉhڹM7  O<>xBBua#>9>!< GRe{h|63eyX\ed_2Q)ׁbjo؎i+3wr%nxn#OMi4E̻ã8c(=Voq<Tm:& 6rE;[ό@ ?$pp'_Z7aUE֥フ]/#X {#)^C_=RWdFnl2Iv}Il^sl^_V2 ONL.M9W>HHbJO$Уv6Ux |M6 F~#9W([St; f\'tޒahɞ_y3IcK㷌r`dzEx1Nj0  fX-?هn6# ܭKgA/_=GX8";ԛ 󺬫­*} ~e҃#{<q+;)2/sG7 eW]mew!k޲'-/g"[n%_ny- _`}2W`XaYMz@ra|!?#}n |CR346\ֵoȋdz^ㇾ݉xC3BV}~g\Oc*c=êw߰^+ðM}$^{nAQrWoŇ_as cv}J|U'?v֟Tf6֓#I\CVx4x=v:gLz26'nh瑨O8cj5Ϣz/%ɁYϢ6[/g]'reo-x+RKD(Iq- zj~B|&/:<։jw=a>u-8;֗VTϪ L5L+BרH;Uוv7ړ'>;@K?@ڧmpZ;r:;kYਚS_Oڐ~jZ駛M;]! gҌ@H3]ø/*^51Ja뒕V%U cz;FqQZOfYA[׬Ejt&e1_ar /)kv0)ϓ5_71Zt@>< ZV(qeFڻ?2}AϖÞ`}^oߋ=5>T~/Аl_nS gxgøX<˯lHR ğ[7犭2wG)|>;v<@WjB/t8fHKnPD>2we_Ceq{|Δnr=K݅,=t O~bsVV>_9^k+KZ/b=^kmJŞXvAyCL-2?Ulv6 t=r4p|^T [9H;&|Qyh@*My㋖ޠo\ǭ#O::i~̅xc M?һ{U/uu>^` ;^l7 m^O,?'GEI|4E?LJ}k8x?faxޫWWi^=/hl__7f?8jΝJOa>ڪrߧֻ@2P;3Ն/gi^ㄼ҅?y(%8I W׺>t/҇=_.;)^Z ay@[MuO* /<8җȮ77 W >gA{RdCՍhb#FBnB"Ix$oG>FSWq.CkW'lP~OscW/aw3#|d'/ rPWr% =׽#@y{ף@SwMEyW)1.eqȻߟypa?܇7 ~ f6b{1Lmx ϑGe, xF,Ԙl7VX0ml"X~̃ y;BߵQM_$%FKۇ'ȿ4VP`|Ś[0R?\l#ČѱqQgjq>7uAާ3璕/ ><'oFocy;xgƳx}17cCփ[򃳞 iֳuf=硑|#4y%|azn֋Ȯ҇p ⿈b{yq:Koa>2@-p(l=W:9a0,}~e_ aXc1''vݼ-@8bI /[ ,|m_3ܱ wVlkJ1< sǗb~!fqoa5ioQ,!n E1J1ޞx6Ҋb`R6|u8T/w>T޿Z/J/;o u?oo:|[qH}*7҈͔W8VFA뵼{> қy/q|o+];7~:Wyl*[l^AhVm#&8#Dz<_μk֫6=K9oc}U"湭N4`#7Ŀi#፼:N'ށ۸a37yT=}\GrVj?yϺ׎+CݿٖPO | *SѯzՆ]YjMq~>HmܫVPggkA=~n#] <#_DŽe_I}:!V[ kRYh=X=[(RC?y^kUG<ڸϔ[z:F[/=xIDbmyy]-R79^mt={4*xCK{`oN7!n@!v5{c{2xt%dߜG ߷}1۩۽_߾$qbw+죕}Oa}[`Ȍ ,ry>1l^prڬb垾mY\yΰ*oJY G[yڭEv{%~? ύ딷w+ojx4ozq#oگ Mi|b_t!]8u9O9'9q\Dě$xE G+ {MX^^Y 'o o`M[<]bս'8^N`)5kwx~y[ias~9~L?Viy򉕕snՉol|*)F~q^kJJa!}Rg&ƁU6>k,|+*I絛^#ףkj7}Bt*ȿRzOOg_ _ϝG|ި)xQHq>'Qw x^2Fray<ՕXʾ=kUðoKe?#*5q~Udw2rh=pXK_אP]*Q<ا@&ڇsjBjaO=A5},թOB3𻪈&ȇVEn*bj߇TU gyx _\i9IxTװX5CFkI5NQUᩈ9bmٕk`)E󡟼ϯv} Y]|hKy^tP9^th|?(NjF{9E?q>yʔ_<-g,+!&|.sW(@9~w+3xݘ'rmHC;em]ws0tzK/=FNr[R. wd}|OF6Fv|F8#:GDvrc">Q7y-~ntX(萺MEx%栝{'"ݥnwMv|=~zGxb6?UA~2{(::Yq{6.Ǽr?2NTE/5;A޵N0^֩k5޵nnx"SKԿ[Ix ?L~ꓭ^?y"' #LTor:S Un 3?@ fsx: vg4į{'u<7V}a675Y>s[,7cye> ;oz }_m-xxV􏙫fZ9^x{e0 _*y1˾l +ga֡Έ okzV)[vZmDhC5~VĞ ~7-]6Y^ gvw3M_p[훪h%?lto!_mgڳX5=-wVȿ>*ד3 , fsw_7D ZߡĻNxd?+Nb\k /ybVpe1~e̿FK{Y_<~,|lP6mIX.a!o@V%-ܳw^'li)/;-끼Mߑ뱞0KdĘ oBc:YO87#zW [BgRm-'M삸"/Aɕwa}WF6wݧq9֑^)fuxXf|mt·N`cgdsb=> !lK\浭ֲQ4l}6>_Nlݶ -ۮ·Tؾcut/i^vU'l5RL>h>v"^8>O|$ #0͟7GީB-_zrOuQ_&ZndqE}7l2|Q?S?3K#3~23+"%׹@?.M:z'F \7(㟜 xFkOF>{.ȏtُ]dҔX*y2M y3{ugӄm] ayU;(Q΄_y |)4V]W}n%wNwy=Ux Zg C孏0v~%=KawӴ9keP=?"PWc.Pq+b6|8Եխ=Zg9붷 { .Ioر a.6 nS̻u;KkΖngR{h4F]q?۵,:q|ǧ[1߱~!eO73nϗraf!3^/7K=_K[ZV$x>Y"uU˺`]G6ػ#!5l~CV Ż@2 B~֥jsiihlvvǣ+㼆&\pב6x4 ^_Ok‼CӀh#^|m`7 qMSbE^7{n8A_yPONڇup[7b3|] b:V8hjK0K A )+Ӎ쀊}ASNv"{ : y/6G *NrbfDG /[Ʊ/m\qQ8H#8>u~aOȅx2Nz c3w&\[9<v~vlx۟|mn6 uMS(ZN1ǢK)QEd[4`5/Qn:xT>hQ1nbou-ܖB<0OɄZj^_/c|pgVڇ>j@⌊b#o!{{:GgNu:#ǘwL 7]73;0J fOռ<׃%h<[> %{%{ނ?o jܻOy~<^ka y~a^]a:*W?5]~:+gn!\h~=\LuHXש npo3(\0><~Û~iW77~ߖcϚ4J f>0Ձfc ᦎf >yo'!xkƘ㕕M Ey"'{L[ϒzrk'6֝zW,m ܄}s 9V]887IݤǼX7/KM%\8[w?~@?s//="H{D;Ĥg T\x{;_G<_Gn\xTC +mU$0RoRԿ(;K>K@~lj.ޏڿ~PVy>BK'KK;qc8->7wq͏]>Jr:ֻ!%˺F,в S@Et'@~%ݩuk <ݻ+^5)޸D?7Ms%;A!{GiϓWb! UdaowϢ(uDy6?&F/`fDyjw%y/ x{/+yӨs'oy6#-o3y6ǐ"oiQmTK#mz߶B}6׶! I5}u?Y.x?Ӯ? y!xޣ= Q] NOqBI^?k<[yXe4͈;-/&'{;?N%lϔg>wBǒe+b=mx%UNo N>}#z޲<Ңv?xZ݃bP^x!~ ^o{hpz]x^^ W<3zs*,:1Rywԁƭsd E(5e e˿y}/QO_5_>x 2Tkx*Oa΋$> uMtN7t'QK nɅ~1DL' c (K:'G.OBWa5 IANu'@7Q~&x^?YET?_o>{9]Gߢ[uIwCYl yG껫X*N9V'xxu]2?:9V;|{uJ s!`}N"G<oK'l lYG_~H^ta8wQW&e}\|aNhvyCL =]C^JV_uza' u>Duh]\z?1t7:t޾PG)`;'8>_'84Ӣ8NvлNUnv:ǩ띂A4 N }'~B\b!8lb@2؜Qiꙉ&?t]qf9oE6x}97_ͱo-B<ޝɃ~Rv+s}+,`us|%&7DX7yN?ۑGx*PS;OOq kط ,BHjkTlq5kgqb2x5$|F'5p:ƷY 큓Sg~杰'G?_pDh'7tn  qB ÈԿ(x=n CqS=skt.Sh*ޡDOrvL Ic= 1P7 \"xb:% :в=9/v:x e[eq,f<-{T3'.b۰דL88B>~3qT [Ju/^X)p|-gY պs,|-k`m{9_˶s)_>ɵ5{x|Ƀ@7_Yq7tDd'ϧO'<{qeJEK; hay;ߟ58u~-_߳I{w=w+cZU,^+u,תyґZXU $/~.g1b[} 7g5G+1:-vvQ/.\NG៫XU钚W< ϯوs3O9ywVgp2<þg/B櫏2v ?>~:]x?;Ƿk3𼗩o,P Oyx_ MZ}k>,ޱa:8=;p<:gܧI]\S}+ sԍyxM,q O@'x1ϑSk>xo,~{X@2Ͼ9o& ͋8_~'? ZAN<7YX}b!%Sg] yo]-a /a݊lc*c>4~;97f¦'nPs☧dWc-CƦ%㐷nr8Yi[=dc%۫9Nv:)O #a]cKPbKgc}c7'8bXػz cWƍ[~v y[uaƹX˰Մ8y|'*U=v}l /ZZމu&_/^ө}pHԪF.s:b )s7#OZu'e\"+hK_<+ƿϭ#8E=h.2ǫw@PsRٌ=)s_~Qed}PyJ=~rw-7j͕.qgϭJtp~qCτ1a Gjru9J7u~. P`Nu6gT ~_)} BVv{_&ʋ y7a/]8'.#Gu" u$T'缄}>* y,ʟ*<( O-Cmu)M%ؼj{j{/ͫ}ۦc~dkj_zjv&ߤs?#?YI+CYePWsڧ n vv|U;#T]>/|pЅy^4h7z^]+y8!9xͤd^;4 l߾cs1=-h}A^fp33k ID>ft0˚!7t8G=l%"!XKzHuK5KRWiW'} cu(/|"m ut) ; il &ǣΰQG!/9΃ w^{؜>!K|p>5*PLW!\xʢf,Nu 1}bQ. \swr`褕>z@8Dh~?'pof=Lآa @f!?[+W}s?ߢi>GsC;G9YףW ~O8XI x~?P#ş|x~^pl2MtPTg\ed({D:F;+pzA3d_i u70 ٟ,V7YsRQUُ.gͱˍNaNx ?O%~%vKu>[!*6Gp: W}= _=`SQUv c^N&8xս>vu2ѫrzc\݈Qm\/R3+t(]:q/˹Fz.;BG5slĹ<Hwx8i`T_1؜jK^fy=cpV'T?~T}S}N/ط/~PD?x~PvN~t3甇+EzY=_|Nx>2_ǹVLv0tCC=&rĉxDёYhG#6Ǻ"0όޘ9?Zupsw2:(oTr[ǿ*uRc_=X"ll+/NG^m/gcא=dIiũ}[ij{^߿6Y?wm)>~eiqmPƮæuo%{r[|ɽ~꙯gpn6YK법,iV,z}xJ0iV<=27m-|lݘ!5,)S_[ 9[l=29O9q}.|ON< [ |y缪&z"ts+ OU4 K`u|UFh ؟.;iVIr%pzJbεuQ/X8uaTOuKx.\q+|X%Y9}/3ϵQe bSThtB?f9c6wG"1EUuHUӤW~'E .3lhv uFqu"'zy˨#3ه(3 -w- ? EKiG\%~>e[6Dh'ͧh?JA.{uA1X(–-c*ۏq$^0[מe8WV$(p:Ə Dg s k\D%=WK@y40B}Z߾Ey:jPu%B9@PWM?.@\>pbB9Tر ,%;Y ]"j/c瓿<5s}/\u>UǛ^"쵅Q$5Vpo'J ^["4lSt UV6P|9rStœp_`Vg|fg8&|@5gg8/q>ZjL|s5r^"#5QAS֓pKX` ߄uk $~AKb!eì)6n;5bV7蕌sS4}Znrp|w~ /O{ԨCuUxIVRνCn|vGˁ=YڋY_<*ZWwQ۬.ip6upRSNB6f"n3"jF{s7ٛWڅm߮myn^6me1_ݨӥm񖮳>Q=/p|Ȯ[1!cgQw:'{H:ٹ vg:꿅󓵻 @*xʃ&C'ø}.s e,-PS uM=NwFN3a=ޤK_2+̰hI~Gwoߋ޶D|$ݽw)yR.bJ QoJ2RB֥|=uܷC~_^[ hϘ.Nuƻup"!ִb4GL] ~1B}|հieW<^OE g m83y? -7LӦԟ]̞7+zfqkh67[ f`hv97ޞ դdh~~LE 4ܤgޥ.Qg0ɷ43iV $ĝ\OLv9KXwOn{~.3{0s7X9A:?_r3u88 8Yo]xls1 SnyЙ V~$/!/.M<&΅2.,sΌ wŸ0_j~qQ}-E[5% +Mt#l%itq^ uyy݈Ӌ8'ZY{׍8sU '^cVϔ^ue|^OΥP M Nɩc27Yv >6:N~ϨMP%>۴潪 y?V~'`XGTM7'=ITdڏQ}>.>w|Q*vdn;qzSW MS,=ko'N:s6y}(.2O=GZb:D.iL$_i;kQ}'*NW![T ؀UW΋8UΕJFo_ETh:vհ͘62tjI'SU[LxAqAǢ0_z2X>^DЍ }q`wyԿD {GB߱P%t{k1_#sWxrqעO{N1kσTJ:#e|>տXeu w)@; (_xF&rqPabu~B=ӿF^WP@vVW)>Yξ}ؔADlqS^ rlT8H:0?چu ftM_)C/`}eLTl]&2h_Ҝ+&=#J?Ʒdnf M!y߽}QO>KN擗\Puh\VXsLj08G򎑳ɞ>yG/G_JMi:wZ%~scV1s b^_b~8(t:Qqvj9QO8Ǻ{*czgi?? UQu x#^l#?-uy=rO 8]R?.8oO۳?;;?ٱ}oβ ع:b߽cEϴhN'}<|RN'-[YzPEgbϽQNuMtϟ:'kby]ӛ3|ͯ)~>A |g/O O_C|TV>ow)G݋s7T~~RixG&:KT~ t EӤKǺ /^ P(\z3?u8D̩>)%;/P0x}%@{{1!77#ݼ.KSuƹ:T{碡3zރq@N{<<^shƙwj;:ylqSl_vjڇ=@Np^SqhNM)#k;ߨܡ:WRօ_w`;_n[g?øUGyΜޕ{$OxݫX.M/^z٨C^>\ݥ=ukawB6ё}`'ad{Q$I0旞$E}cntl,Οȱ~( s#鵁Tӓ8b0ѓzľ.Q}f9x]姞Q]倾U8=%:P?i{9_Ý1z ^O'~97jF!اak_u&Ygǒuv+3#ui y-ֱ<s,=cN85u$nۡ5-BW_][^X_WYށϱlfX)'^_/➸{.1>qn /67P9KZyò_=Acnb\YGeaٿ0;-1?Aq2uY ײtky۰ #~Uh:X|+@ 6\!oMb_+d|6xv:x]!`έ ^Q-vl^SQ N{P阷9쿰]A.҆c}#<>ls:7tZKW۾oVOXқg』1 t m=Zmʟy65f<_:{we7|adٴwyK%8T޼!͛g] iٺ Jϣ#t3dҾsQ[Ws<ҨBX`[i,O@'Ӄ`Yj?Dv OU#n/uIfو; WYd/O}zp7v9yS y7P/_t;A8?@~in/_p.\dg¿WF_CϟAdcxkRHPW@ O?=Pޅz_:Oilgwݍd?ǯVO*ʯOzR<-7bE3fBa yO>a+^lQۜ{=ȻV/=J2_ލ߿#4$"2#kE=yӶc{qNzER3u[+^Dܕ9Rv/^sT՛|x^'2P_}ԏc=F燩;hry&:A.@`R ~:xb)/6^pu&@+~NxzhscǿRQ yТ<|Yط𕺌 x~JmSoj__5k>~~ x>~Dm@~>/R[^KFd&|p0e| ^q(_oOm+&ōןkp~O,?scz8tyatl|ms7 [s":@1wL ?.༚EQ ɱ s_O?2Mtq^',슸k/bnl@ƬW[fQ'nV6 Y} Ǻ/!^RŘ/(ΡJjャߘؖ]i#I`ߚHݻoO=9 rTx#NtNڌ'.|8I~X#P'X{ֱng1V A|?:)Z]\^_f4Ըb:AXY n`E~X]> 9zoW xe![usq9*O_^&+;R4aUBMq,++7sey qmF_x11vSĵ'+*%0 cߍU"aZozB~I0Й {.t=B95r|TXg* ċ:r| ]绺q'T7pYŷqM:9fcRP*zoiU]@͕{6M|s=Bݰ\~3O|r(up;4grxw0; 7%fNhn?."k>Wbenn[hB;P:6O):^eu#BV9u|: 3iajOA~z9]WEQ C p}g*>_Oeb ]QYh9㔅V< Oz!Oo햗WkWiؿ loy+o_&] <(/*4yy** ?fJ+l߭nd_9> // b yϗq˥ H^97 ~HooA,~Tu\dވ$oZll<ޑ_{7Za.fuk-/>Tnp6Y&:A{/^v aJ"9@q8'#^O+c}A+fD93/z®X2Od qon^r[/ cE-c8Sg9!QS_ teEk`2(t 1}#8n8T(5!w#S)g^RA9+KֻX#xWS=qvu?{:ƟsIX/+Ajc#b1;?pSpNzŃz\XosXjgxe-Nwg}ʵ>)GWCBb@ᾃ1O'c]c{*0^L!Mxq}Q6UynaNgx:r%r7  `7Mڍ~1>RYOzl.e3Xqʪ?K/dcGXY 5><^o}5<.`C098}l=&O]3ͨ;MK,O}ü.a;tfȟʱ>ވ}D2xs֘OSnPbX(s:DMtt9!8=nmq#;`5(!k`@Yâ!ke!9Wo0 ]nx~& zNWÖ.:\oN#+?bC\.-1q@~C|"p_CF=7e'ТN 3|UT7 id?;8/PopOG<}P,!ouޅz2M'- ɮԆ?r\x⥘;!bߤPh:P&:HhМ wD?6{,ڄ'̱] TIhu "/O9]:8ND5NolZo쑏.o,a|oB^!k݈. gf%K Ծt4m{: Cg˛v;اN28Ahk^G=,^1y~;0wu8=g<&Ξ|q.V:z΃xuG#Q?]hY4y$$8zFa;?48a?9b|L07 ~^>z".!CC!GLg;W~Eo^wh [Hoky*Z~VyPg@ժ^~tk;کZRDOLp^u`3f*WPYSQ!].qZ}3I7I}?K2:aJՖ֡@^=zzJaszJg3UZ߭e.;սS"1W9yp5lB$K:9Yf0cN/}; %EVgԸjl]&I{(ME8GDTW1S] Rx]*B*?$;?s0!oHeCsZ>:̗wnNi.' ~>/k~`b:0juϨ]Ӽ>AC=Ꚓ[0с<.a^o<PtBݮօ8=ou @ z9}r^Qg|k"ls`w8NS @N_8ELoi8) څz(wœ,.Lm~SÊ+?5IsmyQ'G-!=0Mra#iCP0m_A¬^ ]5'ԃE7',Ӱ cXj8׎׋8],bп 9w)՟M"NmBgհez;P'ϸcJY1 'c;^V2"Kf\@pdFZf)^hY^UO`̺z\Ϟ}%*>8.%ԣDu(ψ.α#;{comNzutwG{`})e*]D9]ʜժw,څzT@:'ԥz?`s0Pku Tgt&Dj]5zղyDu)ᾘkZz~B]ʬ.TՇ$v+rQ/j\}F]XP7΍]UkIYݷґ8=hˆ# {F_&"ޓ|^ynX`~v6FLOD$4<'6{l<~qOG' 0F8Y^g=h[]W&k4[qzUEG:gA[q:U=[ɺrlzS/Oо굛՛}јϜNON[ 77.k%dp^S26U2PUTi~~ 9댐`_u^$H`/>]a: |OC= {y|״69t[=sT:Qc@6=jn*[ P 4p:HȰްCDiȓͱ>3NߋꍾySkXWZb%xP^> bzEq[:ޭckC#/9;!&xmQ|̟-rW)Tځc*xy?O!vT/ 8`ٰWb=nh&mRK;h&}ȅd*q nߟ+𿵵.>ko<qn>mho7%]涷Nsf_݁qnZ?~¨WLoo]`v|>.h7{t^Q\|Qd| KCNmiuz!= ;ä1-{vB:ǞB? c]A§n#EMoU}di놵>cѨfX3׽nj7C_ ~T/rd'^OɩЬ~wZ (52/t*}.TGK],2>-^?cL󖄭iKLt }0(D 70+G+"fLS: L5N7[[bۼ8/O@}uc]LG'>Z0>"LQ[;XK,CDN-p^STtґX|}BLN_S1޾V/=ؙq-= ~-cϛXu׊|כOw= ]Vv}Ɲ9 >ϓrot?CtRm~ls-Knjbe<ҭ|l,ӳ ^Fs>!+s)=[jC8ݥh_.s}^o9VBՊ/oj}.)hOXVkD:SwuuY_R^cs7Tɩ^a>t~6<{;:+c~tX=.-tY@|<ߔCTiKzcNsγɱ^i~,6iX\!]6MV:2YxO,?`AuN?)}t_7t؃_hWt~)+W֜_,[op:'뿢 tdq ҞqQb:Tn.lYnTi4Nw[{ ӗ>[E■/%O*/qR& UF\Ngzz+J"P_IZrx}-ڛL}ITWI9֑~GCļ$n/EJz6D7r+Տ8ݨ4w8nW B/Ɓpc X$b-0%nE~Sv G-E`n_Ÿӳz8]+u+x]+l4&4Wğv6^qs&/ =H ӿ }鷎[=LLӽIwE>8XqGszצ}7[>BVdOyx[\¸ #N?f}&m-/Wns? UnS-JATm{Xq`LQ|O+cEܽӛ +1xu׮G;bp?<̉u_&]UǸdօnW6`%WCuBN< 2< ޗކ9OuBv `8uUa/" >sD-]МhN3lϩ?\y?|GKX:c/?6y[^hBP{Puc0ߩ?L~cq^DŽQb4wOMS:R [՟,a*ϛS?OqO:W7ܯ:jQA!+EPAbg뛥zxSw uNNꚼsfLN4WfA~jh5Rk7:5ð_CYb Oyam>j ~]?m[Zy૵gdƾ~c,OfMtȂաzdw: `Vﳮ֕џ'd ]ebl&Z¿\ ʅ@ѕݧ,*ø qR ι3QC;T7S4:E-y4XoQ}6BtaY:*:xNGtɸ/ ]MT o5οoe֠w? !p'Xx=[pNI{9tL<|Q;^ѝX\^f:ixN߂Q7OK>|npF羫M8SK@WCaeȞ8>+af&zP ʇu鮳>փߜMu?҆ndE0MzoD nNpej_:Ɓ}ju hFZ޾^O0s[^k>*&hW'zkouרïuyJzO>Bv>ovrzIq7o0.$uWLO#0:=_a-ka}B"p]lNw^nE'g5}I-K5+ S\c-|n;Ex ml.{Y fj}qܣ0o¬UXWcNOxq-*?, :FG]OĊ7%oHGqΦ XOe?-PNzt $wjc1%rúO}H\'*M_){"e2s^WՐOS i|SڄzuhXqߠZhۡӳsC CT-8NDy8=l 39W'݂ yJTb\oB=ݙ}gQ}{o un1]7K;vNǶ˭| cfl,?խzN]K2QhSZIP youb>|κ Ɲ|sPGz,C iwM jSz~Oֈw"xNJ_.]q}r!ɾ)E No#Р8KÐ{nRx:|൥*upzKӣ~J.]ɥlNΩ.-GӮ7ƬyGKӣSգr#УE3To8?״@oΩlmZq78-Qup7+V`vsޫ#Lv Z~184q=*,{?Kq^$4CECۄ="\>.gx=>*1 (Y/zuERLS+NG/(*l8RˁgST?1@AJ`ފc**:^q3>gWP{"bUE&:6_eG=**Rt7.A)]aVUQ =|pE-M0~<)؄_Р\ ԇpm2W4 -xQWدK@SR#9W ߓo%G?ӽgz@齍~l 0xED#:-bY.`N !&¼:t y"f tɏz. )?+ &:uy<ͻ'>w6mO ]p_{9J4nUz7W8GD_ta q]&祭xnN_\vDJrs:; uuNGCo诼-==gNGX>ziRꜞSW[e˘:&3;}`zjA7g|ќvϑpp ~`=4i*y6u0|jKjhlj4Ю W9߽COиhpFkQ4u4ZO}=hqG>FΣl]=~/oA;OzbE.N߼q#mɏenqv~oNW9y&el~ uD;;yH6BY7/oyWފxl8܁\*a?/_L}eL+ WQ2/_c\ȏ{ ۣ[&X? _'\@w=<:4^M}Ygr6|$>/&[q\P'Rnuw> sPVa_w)}@FPy}Zb\Kɰ;ZMGmNq5=ttN?dPJ>=`sz<l!A1#?~=~HyOY߁{j ?YA`@NYfu"3,1¹ٸ_@U9}by[ ɩ.ї~)[znT7B]ӭ|qdC i Q]gTӱjstٸm#GUzig<թuwl"D8}+&ﳔnUp_r:Dv)ܿdFSRq,I%KU?"K]vgސ;{{3𻚥^&KibS.dB]B^ǞY><ON"2! NUӛנH|%guf`ݗ1l{qB|;{9ܜ-Էwbb:7oY{9}[LΩn]Un`9CYO _wf?v~=<TޡJfckCUǰ׹zSkYױ9:lݼ]^~6gk|6cW qMRqe П,Gd<>u!x`kvv6vx>'a)g],}й>X!\ω1u-v~vep}=T o~c,vNw9;Ɋ𧎝W8>s|?s33M@}]o#6'ӑC_:;0Y=A.ӕ9=dOOQG޷篚Ȝn`ƁcП5vb>|x]Ӎ_|vCeSyzuYl Xyc6O^_%gɋ_00X7w{jJ cZ.7h?d u$,qD>bТh} F |GW@_`nq6?7,ECOԍT4DT4U#E#kM+M$}I|ג> .Itջǭ<By^΍R̛C^7F‡dΡǬʋٸ C+^*NQ= ϑMc-)~wB_X!~CPO3s,+ m_N.g$~rN_Tj/u+׷ ̩^.ɇ# BueDsypOUu/Ľ|Zdgb(87F+u*M#\ta'$$|%]>z|N%x&z|]W>v,Uo c|Nw:ꐅIU@~O4ɀ_@Xg@XU/綩:z`(42Lo 6y IM/ \Ye]`u@o~[-i^p~Ւ7#j%̯58.`5}{p7p|s&yMT >;\* ;h[|w0B ŕ#.?I]W>S |.ջj4;x.=oΚB#}`u<}5yt`A >K~q_93cx2CˁucQ7<GV+'rSsszTou{:8gD_DuυjxsO=@NtA19}}꥘Wq/vNou~awb:Tֳۜ=l1UDY-[$k+x!=mx#F @PB:#Y;7cUfiph/Wu~>*[򛎞'uC{gdo'p&86Wlܝ 7px7t(C߶}n x't>Pw9 9kyz8܈ErLO٢3|&?~GP~߈mx}׌!;z"R7e+ _1;py=Z=ü=Kwvoשdu* qzHX~[zq#Nt^m-%@7.;uZp*w aiP{8 =L:!ݞ09=wqy;uIu@98esdm\~3z#>y&/,1O/zx30|e &{vxsy 0LyYwlwg}9G|~PO  gt_fum>_@' pFKVHo#q@A/O\@~ #yIrq:']P/hBިt/C`Uu Ct} nC.Vp';xx7Cv/ӱ14f č ]U3ۚƟhybO%`MgZ3q%pCpybyybdžtb@Q}6:9ݤ{4^'kK5\qzr*r^aC+P!~#s3^]❀#PgS^p3+]xB}^˯<V}. =×>[Q\>AEy._\c3zyNq9՛)o5%әT_6 }xMtE\{v1lNwt Z,f潎#ӛMtw<x׷󪼾 .;T(5qnBv6=`#d$9ݨh8>o\F~7Kgb5RΛ zB;@kS1誼neºfu<;X< }T#^.{U]\G]Q[c٫zu>NCrƇ?,7 u=Zz9ԗGmNgu` `?1~Gloz9Xخ VG6w}Hq8ݸ?u`?~ɦK0W;7X=^ =a_ %%@OTh Q$UdnĹ[^$ kj+T/=3껁F }qG:t1C0ѣK&.]XIE%u@1ZM<7xRŧu=] ?աTY$EuK {θоAui1=Zo.mGScKsz)kVns0ӧ݀~sr ՙ?3Uۢy֢͆zuѭ O_23 ^Sr#K;;Eu.{zos6ї9]yW{y.3_ &:3/9.W:.3ǧ2TVj;!^8P5p?ĩw'W;ϑڣAhWD!^uwWyY3i+`+c?)d|Eo,iFȣ0PFZCO;ӽz7s O!g=<y};~prO|b_Fy׷ws-ԗvN_ (ԙV_ CP_~7yY#;Yf/`|x/Ѩ)[-?ŸӯeWß_uW03Mг98f ~zwcooUhotaw]}Eݾ79}E'>MAWopu nɺ\cp]. >zrc9yuS9s%+^8WrzF&|OjƝXwr_ϟ!u[idOuX9VK'sz=xRF{a>|vryqLyGuznY q;#fcKb9=8@ o W>lύ/N֟'rguّZFk r]kW~b:v>$x k`=VnPJ?ٝ#$y5ܥsvG`3<^.s..ߜ(cݺsuŸ'@ y=#Q{NlssKmVN1[_gA_ι=~c= ĭ%ݹJ5҅t*ûa.|.G\ѽ#9= kN߽}*)Yο.~Ꙋc7v'\#ōFz'!KnMϳfXܥ@͎3fap5yS±+wQ$8n"a/kS  *YcU*mG/wx#AP_r{=krnr#tU.3jo<[Q56EQk]zx\+ז6k?y? DRS^]FyybVIc6^T Bx %w`s.zJ8Uty;>Ӫ3ɾ#;-xgf1CTgΧ ȎBrdKNѸ ը9B9#JuQ ţ0ǩX`RD#_=W]~sw|2/jƇҀ~K܁S=vHJv>Y6jPXt0uz(45:V_"1>_\MvsN瑽{-/`|g( اn?'Z yQ$w<o|ѳ1?W{Yu^X:r_y\A8oH4 ТQoA3]`c5us¾q]7\߭AU߭mgjo0dN~ǾSPqz)yU wn.!:?k u\ѹɎ}H.jFc0 ^x'譺搽ߛK!ϥάq'?:.**؁(؊ba؍؉" `"؁`b(X, ?k={]3gjXvܙXI#/8Y~$w 3N.@:E>i40X֞yܸ{JC0 1orKuM[Pg=t[Pgا2d7d~Wpe(7heׅ">e^ û)mS틲^܂+4ZB/gy=o(+v,ʡ Ž {q_cO;[0S.n/t֡9@mW34A펣 1|,}NʷpĜ ,W 52}~ ZL!SO FY9u[u*_2y޲q|[ ,0}|PǠ;z}{`7LA>j!4܁mR;mX`nK:! OrpB0>ϱA9ϟ݁To]w7B@ |D[;{ɷoiOm̿4xeFﰎe-s>ށk'Jw &=pDcIS+A7ȫ3>y_0dGb~ zғK R cG=ׇ%rkۇB.Ǹy%5o MlzZ-##>c;~Z@MW;hH|H\ߓV ~T+GC8ץi7N|~4/iNt?}}E gh>#!33#(g ڸgn;q$S]gNoCu$^uGI_$(w߷:ʔ罤2mo0-3 &+KvGc\wPo+.Nqp.-gŖԶ]);>#Ǭ&.m==}h6{'KC>6[o"PDug}m_uG跎3D.帿+/3 e"OUOaA=E'O]W1/3).eqnД3műÐSrR^NȐsEɥО:R6L=d1|SAE\KЇ\ϼ5HtnEbիP9aA=_D6 K`cPQcfܗLݒ}D  ogg6=&L~!$mQUjQم|Y> ;:ȾB/qQ7B=.~ƥ>#S >*;J̸^c Tv,1$1~ϽoÏюQ/!tq4%58/W`kQ<8Dixpf)WP-h]s Hf?2Ҏ#8 h__J;Z?C;fx J;)Y1 w*O;yאW`4?w]c~%19L0Y}csE=ö8s i;q^V(a $.t7y~ "+CCc:Vq PK-DdYyž׋j~ߏ{)/!sxsLO&#Viͧw}_UoKͯ'sh~WJ7.ͯU=;~8yxsvL(ԙJNʎ4cw~T2{ M'eoϙqn_hmWhy|a~i?/y??'cZ=+OO ;?j^?ؠ̵\CW7h~^j>iƧyya>~i;u)}*`~_n3n0G{?|>MbH5x~MhM<VYyWq+a>yM[<UO>1 ȏ?E9K͛=|+9^XK} wW\мzVѾSŅ|=j*:s f9|>(;y [|ඉ]|!cXaP_&h+x?/BE3|z܈3v{tk,J>ڂ~6cM (7Y>=\oKq$iۈ%) &>% %%l<}cALy%/Aڭ\F! rNI=LR')m|;)F tRyq)uW\z]u}pzqCow*)D>?Q1q)P?AD~;ʛEw%Ga[=E*hiGHX)LWr9y! I̼0Om: #mGZ"+?#1k9j{Npe=>H9 ϗG ~aQd}U,_5B>Vj&r}{Rz@*vQ7BHy(*ZQU/ҧ|"'R qxB7BHȼhz+=s0żsq7 f&;M$Onϓ>\\f'<̬ [aH\G»loHv@Lɇ~Q̉ z1!tbo0hb?̓q.d!y.?\#x8s( }1oC-˦2+?TE6'aX/Cdy XZqx:bC[D{* HKBY${qujPSrW^UANE\9JxL3nEDNk1>w,10C^kΡVS\s!uyׅb#oWCPOwk?Di})?h=^K.WqDsO2>>sH<;2fد;.'ϓ<^o2'~Юo9ѷ}׷/|[F H㏉D28*glu qx3c?q=8ߛ-/IG:PZ`^uwY㱜Gke=*otaYkXkgC7JV2 .zNCxҭd,Xy{D?Npļ8:;Gu{>|Ig<N%WXt=uyP!?jbƢ>K*S$`Ico7)eN)/q8u\;%Q,*½Uv˰/:?x![gn5FQBytx=Qys֛W1#뛥McSW_ϯX3øGrgaѿ[SRp)oA~x~%9_5~ߴT]uh`JD7cC#s^zQM}.DɃ0ރ< C;${8oawo!9捜~sElɭ[8C >x y7O')|;槮B$NĖAdy WxKmZ_Jna\0fM!/lr`=gs[MQn]J "nA*sIw ?ю?u By,s\{1] k7|*aQ2 X`"g_\a{k#R'b#GJ"ϪvޟxfGyVVmԋc~y|f^hnI)yz| ODg8wPEDKی<>+/?Qռ=͛Wڀg?su!~z]W5^\inJp (|%߽i-Ӽ~O|Δ| |<CuF2o:PJyVa^fi8yŞW'^k K2+OɗNL4o,?CK sXyc;n䏥~?1}}:-sG컆~>ðg>r}1Y>.<韃 8gCkrD>:M8~+%wEPlWMa&y8WX)}= 3b=4}usi|̫̓H'?7gKuc=;s* !k7,Bxn4m܏U9=]O~|x"9߽*wk{O @YjyԟZ'~i>7Jp^2[Zxi-/yu! yW<o|XZj~z#-ozHw)~EtNHn*KwY%.K,I9磤 8"} MjZ:綊uWQĸ4ʧ)ϝ̼z6XͧӿNEJtgϧOshZ,jٺ#/+mF}qft;7 ̓ Oh'~~y[_G·0\6WUh1hYؿHr柅yga٣LDV擏'_ Qs-<8'E`;F4G'OU֩-0~*of?\<|>[{ l.r~O絅kanJnxTcKO y;٧毵kVޚ7Vg參FiL3by7_lf6W;;vTyD^uwG.V+YB\?U.W4Z&!瓝^xW|iJw3o,zzoO#J3+OG?uk7O<<3_^733DȾюUɶ4suW!>ix;W<;WWɝ];7WGFK8Ȼh鏻wm@?0Ak(y ƣ=p]|vcZs|md";Mei^9S ~A1^c]@Cڡ~h<4/?Ga>ڳo7-eNE=Tx|H|χ>̫HI(2RnE;N]qUwĹߒrծ)a+h7_9ݵqfО'^qhygyOyb塥查]Diyqh/?{U~}({5H'3?y=0ӼǞ㌘vY,|J512+}[R~Y,\ّp !nG7Aw`ZjZ 2KL5A~+1}aӯymU#[sdҘKSǷE|^n^@o")% #B:Ea<6n_[h^ |yq>s>v)5-8o>d?k8y!CVuyl]!m_ylm;c䱞$?בG$nN!6'3E}sW8|00(u9w}d- nv4]ĵi*Mݵ9+sgrm0Nh׹)w6띛L ]gF=Iҙ\߁s4;">d4䫒#B$w $1M}1no;{|]yj]Owt}K|oyrS,_@X>3h>^cvꥸy#}zr}OKk=>{by2}k濿4yun7&9]bLDV>N/?Qk|Jxb?Nm6)6{H{Iq-.6?GٶmM`=5HYż`KO?}1 Ǔ}ͣ~40'5ʣT}tV\ ]pUj x̫+ytU4_|ŹMJsa|S8ƣyqa>y?y΃7uݧapRMbyc'/L]물'?uVyd^${qF0.+7 JWk2'h^lCDa~f yg$/Mͯ's}u9'5iy0xBc HyB!?J~w✞ڝU&q{y| wL6F`Q3Wr*!Nbxz'78q&iw?/1RN"s/; 뽮^]/]/Nb?|[n7&gכ$Gw4< y4~7"R3/KļӿAv7\W si~I`dw3tLyq ~? 6"u$qr=̜݇ Žc1u , E_E[\떡VXXMxVz;ղ2ۇZClY]L]a]VӸg_Ko 믿6ƭ: %71Dx\OLC3=Ei4*bϫdöa1Oc{SyL闀Ǜ2b~+Wr},xc^U$:m\_事Q a= 1ި?Z\+mGW\;9轆ݳT3֩{%!uY;{@d9W!FKc<̓яzb pȶryq ?q?|w BzAFpJzEp]>oP|.({X~]\ޘ?Fܡ?nyT)aZaqyS|i7|"Ӱ/dOB=$>>IQӇ IBƧC%(كZD]ȋg/>DBRבuH!BRT$yVehN/jQ6>IEN!{}ى+)zC?H.hakf+㕨(٥ƾI>"9Q?c*ЭP2Jʺ零WSyޫ nUX>哓9?vw+̭?m ʼ_nv"">AmD8sܸr]-|L[!)BB%/l}ѶCW׿~z&/C#з}&~1q TGoU3꺙ObWr4ϴv4+}'Tu4ݐ4G{91Iپ(lk)zUXYJنw{pY|uw-ԳPv2=˕o?;Y_#Se#c}QE`vt8h=Ƌ7*fhqnJu3F(˾YoNVE;Fk?vtܺxogy QƧP7r]=mЇQ9h=+9UCݻI:{{`m;JnG^G{ZLwr\2 8}X/)EȌ4z"0u!ԃ,wCJ ٸ}nbDa_z *ᤴ;qWbшrep7AT xOCXzGDc^\EBSڿ>")>aBx>Y>C1|XrX0u d^+/7}&Nƈ[n mm:q]?DnIX)=@XVq5x 6 j~ UcqH;E{a^R~o^VF?~y~U ˸u0¼!O0>X[Oy~-/_\~NyY(z{{M?Tֱ;ָ#NF͋cc0樣c~c}[{ A^P Xk6y*!V-:ϯߟye!h, s&QI}*A~ ?;Vm2s&uu=Û~cf>N4/oI1>?1?NOyc10?r yk?Tʿ &6:+nwwV6ߟ'{}<i9֣j^ȷWGj~ls{ֻ )I)/qf R~}qr~ŰQ r~C;{ڝ_4hG];W.aS#j6Z/&eH~%˯v":ylUwPMڇD6y^+v?:A c2Qlbx;^b|3QMG$򙒽c&$wCE6ƥngz NBmѳ=sS;^b"ܟ`z G81ѩݨ_xܺ3)ێ'eZX%8)jc{|-Yc!ϝ[ U#N/vxGy'qm\2-dak1AT= [ol9= ^=Q^۴p_液X߶VxmIEUz@=̳-2:G`?n'|dycџC.Dܺ\1oO%}ƨ:6a9ȏ+9^~#Hhhz_Ӝ`xpmLjoPS<>"E7S&|GNE2D%'kED+t[&{}2)?i8 NΞDx,I#X.!i/NBkӑ\}^$MWrj僛NB#0'.BCR]Doi֑v)ƣ>BoZD/>¨_+n]ywF=dAsn;ׅΡgu7sNws R}âXߟvw=H7d+ǗY:֛)ueue> SA=Tl,b[XǞCQߓv w"]2]Sip Gt$_Ԥp?k|3n.b^.tfs]Cae}OSS<*Ⱓ؟DgxO3W?k-tFwOa>b; I FD(l^w #x ,{l;RN5un1/j&nE:#?ՋTlϳ~}OW̺"?w)yㅗqϋ-fR݉To3}Unz޼z;D7 .fxb.Vz`>!x_朆2Su Oշu(Ɔ}5=uK'ԙTϫ՗{pܝ~BJ'ԕx"[W qn&N|>@;?u'ԙsƹʼ3yb'Ӵ7s5ӝzĜp3݉ Sbz9(j{UJӛ8[ɣHu(C+OƬ@Sr'O F˗P s=J^gwPQyLyo/8.,a6~%Q7lW mG ˁZyݟAS%yPq~w2B>P~*C6F98}]Ųh]*c Ҥ oW)ڨ.9%}sUtsz\E/0/S)GXOOׅb^%_q|aa9kUy+b3|\}E7tWT^J=8BGHr㏙?)ʼn(]Ok8"IXW ޷Gw@nHuUqV8(\xø 0~.'W$~uE5|5LXRWty_.紥~ 3ɘߑk+Ղ[(D/_ɕxLD\3Ռw*ّP?ԑ< Fk<FX?vD;1Au<< mEQa\=+: ̖+;y$3 x!a|9s>y^t9QQ1ڙZG9#>V٥Ph,ơlRe8fVsG$μ,&vwii01seU1пj72~^VVգxUU/jا 1׸BV=WrR u'+P';6:OlO݉$+ ?9U΢^Uort/ qНD]ޟHu'Y˰"ӝTd:M|G^;o?l-ّP?R'9GW?2>wZx#~ y|$W_|b$s } J+턎KI#~]C7EInd'x}1y;'"a_}#i=/q1ż~k3B_`<ޓ亐,$^:j51~V#?7˦˚C}n; I+;mYkp?oqy_!Y!~AG#E{c×o\6:qq[hWuC\?){[aK]|:)S$3].5&#ש[є#ubt8ܕP_goȮ0?s88|4>O&cJ~6ZC~cyܼ+pl wh[R>cAxtwŸQk޻b8>bWĴ~luMt![J`]_n:T"D45Tue=a=~r%+\n A\; զz[8+ ];@tj)9r{,CYk#a mHbb  Q81,=Fp3.hŒ >C#W.c;q {_2uG} נNW7Rrt0eW gayѤq4}e9.UɮC9&|Ft)QU!uPQ;yq/wy +=CUA]{˻ 5Q/t9ϓPs9,Y7߱ ߠnywuo`ni];{Km~*;nўzUGﳹ+Yc>)֣i!9l ü;zXc΢诮Xq7X <beQ>/Pr,j,'0ی<%8`=, 8:Ee>+RsWDM<+q~; UPU8Vi+uSZ ;g}űC ԫ+}Prekf!+~R3џºWӮa y0%(6 żwk[uS=lH8Tϫ~$M"JlL1djn~7{i] 0EgLJoqI[$妳mH!mq׾^(EoM 3?"|-o%XחúRڲS밟IڊN7NCK6s<,VQn=p{Y~Cm,*(R5AȉxHF>wB?A݄Kh/'%6Mt[וMfq&ctbs (\|lE &]{* ^ߏ" Z%q:\ }ºP?dfCm'쿒վ.nCzI:|NЮRi_:v's->aJ/qpa<^v A!NдC`BۅGm U8BoAڪ7-:,`>"RЧL DGY[ΠYsu2}ˆ>NgG= yu u8,P(ce㊺0e t@B~s2>!tNA^i t f_r,r{b\?cSӯX Ʃ]2/)LmSW" Զqk7-C^"׎GSo" D$/u 1'zEC`=g-:@Ed17AĎ%xUu ZcL?Ѣ6(n=}b~ _(4km.ǻb/-^rNwB0.95*.aB@oџsKb:xz!*z[!Rw09e3dS@Uo𧜁.`[E]ؓ$D,^qW(bOuo5_gxU;m+>8=/rIgyޡQH*'woa;ۃ0m.a{$NG+N|@ۙx&qR?|ٰY.P™b)h/1h/Ecz#G^GcA@Uw T?(sț$: E[/y,r$6GO]ۉH|wJ[ߝZC0.u {O|EC{y;$9on5֣PPPiaDMx\z(yzFڑJyqzfGWXGwHyc\5(_fzC}Z$Ƹc>3gz>T"Rw>:d cF?UFDe }=g C$OOGdr3bm0V:}7kiLqnPn+n5NZK{> U=k?bpN0XBUwQg=Qa5KB1̿$K=CB"DYȆa4I:"bdeQ >!9j&G4z"H|x689ýx78ڣ9u c`cF]|_m+9S B"?LpZɁDYԃ:Pax0U/Bo#h7R[B ~';K{9GHˌ=h&g"OB}zdC ay^]yԤx痚 9އTKމtZ'݋gmL+61%yW0}@-9#C IY$C>6J_%9Hl ^z)t|\ϫ*Qe'-[e)2+w էiqJ.6s!cxgPf9mЋP'rg9ED ɫ?:C@׵FA:sq抭]О!Qﳿ}onB+;ݟkH5w <>>s} ܟ\(Yƈ/[˓m5\q*Pɩیj{TT)Va}JZ˹q| QIe/CY2w5оuYTBAʲ/q/DǽKpKv/ r7e3q!Կ{1u0g7Bx>5X>&y IRيGASp%;3R^H)_QN9S.<'ثdE0ڧ:\q/q=D$z쪸v ̹yS~OO+:${x}!OC>\y^syGwN 7NU#: ʝl'6{?$uf4Fy=:z<!&z=&o"=D̿NMgM[5:ϰNXH ύ]nRúYHV4m݈xvp RӶ\XDMe_9+$2QW^h7i * ~~;!~%#yvB#>|B/)tby q&s(vZ׵)(Bmqv,1=R^s;us;pJ;|~~w4m*;-gD*$fe$ 2Ɣ-OCg]Ws/R}9[~.L>w_}$ǹjM>RquoA}$c ,|1 y>]bx0>'^]Ď8XQ2. }ЋhrBA]: Q~*-yT? 6/E|?CI=WaޞpߟAB7v7a8_oR:lTu8F7_sg:2~8 yGeć#FF;\2IՔɶGQ_]ŹI~uRNu[< $s@MFPߦW;!xP o߅Ƽ~n4('uDoxzrDgg򹺳I9:rv2qc )E>Z~nϜCn=Hy޲7;v织a^pRc<i,bF;5%?;ɟĺl#/OvV#}iO%:uSK%)D>'gnz*-:*3IT,G%Sck#RGzzKc :Sm6uXqxOU4ytU+:{*G)8TBGukO=˫[;/~Q I藜OadeR\ 9s)NܣbRs-}$e+|Eh }WX.깨߲m}Tv\U\,ǵ~=O踶ߋ: t]Qx,ߕWէr0_\Xkh'<vя'|O9/I98?{^Ӟ<"Ѹ.?hOkb^Xɘ.Ҟn]H;W\~y/J_KW }YK/O˥Lw\x:?./\.kNr$=Bڭ(Cb<~/g=øWNB+vq]Q8ak0>N渘3ӚW/`Rvxsݙ7X?2mqŜ٧Mx,#٨flŹ@;=2f> 56ڏx[ z0HEԁ ef`+KYܜ%Mfiz~&K˽=)xL=~.!ٗl>c*2:|}_ޕLbmQ?1D^a!xߓ5riX.l 7 {71 }XJ2 isEX9}|~׸1;u?٧i3N;G8O/IYhzEI. ўD}fk?'JyCY1<ړxti_jc_6KS_ujWفJ/o0o( '1 ;Ts'ϹdRo^:cH٩<ޅ{&影|6Y ۿ;ŢW3Srk~_^Cz5S+ڟ[(;ir'dz^ڬVjOP/NMUg۟}t@Ӌ~;p/q)MBqi̻soԻ}0z7s5 {{oK~e:*?{~oyxi*U4g &YZ}W\\ߢGokx="qe%:Q?^mxZ~{[яւq[`/nWm8=_*{Q[㽚Ss2SիS?QQW:5O.MSloV'>Iɾh/թIi33ɹZyi>L~.tRqy9;]c7yݚЫuͫۥlմ2]g-֩k_sYDkh߭wx9v/ ׻YJUv`5J]m׶jR>+~,GvzūW@Yk=n=7}Z$<^Pss J7cホ:<@Յ5w<[Z؎zuZFՖ֒d!nMg'8I:gb߱$qh'uV{DZ\\y8O^@ qԿ|M-3S׾SnMLvWX23JUCrpIe?5\wE( T!R^*>ySB7%Rb|uݔKM_9yFwh7߿O1>Xqfl[Lq)_#ˌʈ3;+yb$A꽻iL}Gg_C6yN)ܯݖk-Z ']ϫ |e[_~9r*j6[ĭw]bUγb9eV-"q9+ܼzݮv{vwQ(ii~H:X` X]r=ֳ w$֒r#aZr-r=79C= yI*XJdU[>(V{WBQ }!PAD1o̽}C )rgx}d\_rKk+R߇"UW|ZwFFH5|"oT9-܇"9/0Ɗj7p=S%o(2*(2.QD[x}QٹUz޹Zf1^k^7Rjmk֤Qpĥ^-~; j'pݢfy R,=&ѽRA:ZͅwIi7:^v1.uvRی^({Snql"6C-%vyR~pne^RʓҁV)O:&םp.v9x|OE|ZyRou>Pן]9,;)0o^=TgMpS;nlsL]ެJx4<ItwVLݷ8,82+'): گ@>y.o1yǣ.ٚQ>wr>\wq ֑^Ƣ)zF4vBi3,,w9jġ}KXQNc?Iɱ}4j,ϖWokԫ8OSգQx`(՟23މiltGLAVf(굫Z(❴$G~h0u/KN/\}['ա-aGz O_CM1O2_4R>s˝kޟiw7 p@}".Ϡ?Htsvׯ+TF &p_>#tjCsNQju~Ml_3q0Nطh 拖{ض]#ޣ=ُƐi/qӾFV+d'l ǎ`k~X_Br9R_N Z!q5 \YW$N0|_&.F"}H4_Jb$vuEoP~,e4~ANdjAw>2$?S7}1pb20γ{cX#+J}ۼ,W(TnM@d}#SPo0.cwKqRRyڿ6| S_+=ӿ5:81~/%x<$U-qhԕ^%MÒ%-Ǜ ' xI;cIRsNgC?y6%wD>/= P ]^5n~ϫsS by$ĩQtrO:`>1/;9xm 򝪻+I?^U7S9~]'<.ts?nbX^NPqjϓ7⎮lG.Wvƭ Kuuz"8ӴqIt?V4ut,?O9qx?=Ӕcy9sUulKFsYmB\ߎCyB4J~M3~%&Ǥ111ԇrbzU%XN?oy0/E]!)fϷK(IcPOλZβKH[nd:'hzkޤc ]96d,Q&W. 9ÒL&o -dr3c|U,vxc=sAUXj3\<8ӏܘЉQ +ѫ75 uaz0꿦F}Iu^~xcދ??"Jʯ<*P 2ʱp5Xf:4j]Dޅ鸚nx2[bnKk5Bޏw[ Xn+N墶Xv(JAm%wPq(sC؅CE%?ICH肶-y>hw g'txz'A̻!:-x%q1^IPC݋EhזQ!)KJgkzySv2*xOZǽ a~:{O^eͲW.(IG1؁s[$J yD}J}64ž 1nΈqejquOed*ұjoјkaxXV\t%CXχu>,(>H Jf!8?N& ՇO:N`uSmpۙ ^S?}w5P/S?wt3֑~fŘhvfGک0ߙ2ׅnP\Fjsr 26E6ļbgoV(S| y[%#yG9j'<B;yCMI ^GUv9.} rFAY]g5yu5i~L$C2g2wz]E8b/;^@ bHSп*zRSU\/Kba.g1eH[\r O.z:հzv;^ڮemWbg/L nf gKh?35t$qk4v MnNwD$E~Lߊߋ7"0#?uўz#/Έz{}{:?_e;d>"1Ų)x.Kx~pQCJ8<#SykhZySF$;=#>,|svXg>/0ݏGyS{,TSpĺ|=-|Ja\UϰZ_h9r'F{saoi:5j~ƭ1Eq~.â} u1P#t0ȗf(vZwkb>>f6]( ]Bh%z.Fa#j* =տCY{A~?Vxw^DU{xwZB;C3"}gJ;R#w|~gb]w1n(~T>,SoHn|oLOùytZ֡:` onxԱOü6/t1"{tl+bۚQokl{8ԏ#v]lW"7`> ǭcgîJnNix^ļ6?J;bnI]{A n.iH/VESUrI-LPtTIUqޗ{%uOouiGZv'}(+w}փӴҡdB$;WǸBG*yrJ'ipuJyuIBo/)'rAva4.hW.h͙jgmѸy_&KnJwR!1.wċI>`|XOIhq|#/1t%'KICb#ZlX̍ǽѼ_ $zkc~UџFB_D]Q?#6 /gTҺ6SoE꺢vf/G>/&;א`OsRԏ$qOv\Q㦺m)cdk Ƿ?W>&l_;"No6qVcIs ~G'J? I$yyu)9)%%*?Eoo '2q(ǭSQf;w跏*;.:"(W[T&qz&k8DT׌S*;~ݷ΋`\/#D־JM&Ŷ2(-9[nJKMVJNu 28OD=uS,/zz?DI^e >ϐ:ڵ[KbCr>7燴VIdҮ:N~|ic>w>#:}t@~w[/;i:ߩ!L贁-BxV}V`|}6i,03)nC\I8JNzohzD0Np]j; TLyuL7GdyEQ3{s#%VQO}S(I~E,$Lw`qo1+XIgb:& %uݒo0҅Zwqz_5:&/IuK.svvp٥Dx5 P̓i7N\b<NgƔLs~9(:ϭCL7*de~rYU 5=M&>/0͟3 vbeteYx3 lc'}8H8$5y4oM>F# 6- 5v6@>Hԗ!6k כ)GS~gE{8i~{#·WvӑmtQ݈xGR^UwTbh<9h8:q㌸-i!sx&-uy~gطGx6n,MOzX'cS)v7o#vNGsZxX>s.a 9pWQ,p3$159zJ`>2 g3L¸MJ觮mnD?!ߺyn+Hu1ʯƗcC;5:?y/ ^Dpzr ^]yhr+F;Q=Y~V^~Uv+C;Wn;)vGQ ۵u5a| 03}uW[ўّrK'UvC9fwET܈@єQL܉\o#k\}!\g51)Or4b~w3gɳQP{oJZWyu?q.I_6h'չIҁEʻh#?{iy.Bb_v0{raXk0a=7Bsj"W\hܻ͗owhG k =GF[c##@Y_{QG)? u$~:݈eИؘnd\iΏ%;u^QD}n$"DtӋ-~_m7""ͫ?u#b^Y7ˍE4D>>[D®?B^$";G8X~$=IɍXA}uu#B%9zM8mxslrތIubfȻ*>8ߏ8Z=]Я<-NZ>"哫1^˻xE ާ|۟u!mPaonz.]/[H^\Oد1oA7W-{|}ۜ6[ێ~6hl~qNىloGm5'ؙ"nW/g]KkRv~vSK8 N2u"v s OɃ\e1s5sJ=H7Wu@>^ QB~KIu%;Q?"þwnd%|˜yU#kz-B5[?x$ֱ>e Qk/&#ӧ8·dLQ+%1ؖԇsXO8&>w~ 882}͑gmdƼ<~MnF?5;Q>\I_D"O- ؎!t2Űbrd]|0o]hDSP )u<سPߵCNͯYF)g9a=֧5-שsa9u}?T٩A~*nFUu+Bo:g*iCy_rs/t&Wޙhx%W7Q,SN܄ʓ(9طUmOfwەP7y+~DFNY "U's~))_}TR}x"B@~耘m ]H$\>DBå ԅ=T2"֯q :?"b1<b˘.Zu> }H]Ã@TG'?@rGؐ1h@$suiu=1*iq|X ?=v BklGC:OE;c=ߪ?GKayzrߎ<ӧ0E HDl ~֍zI}\:X3Nda;z1'r:<{k,7{\'B}Hj/8򶲴ȋҌzZh|,3̓v EL|iN{t?XGڷ2xz|ECt.֩G1՞#h*fڽ^xAT+g:qV?w"[gѴ_{_R݄>b=-NWSJRo%Mڝɤzbz?q05|Kj$ƝL |ezdTy/7WƓIZyy]B٫y|mW뤾3i.$;˻Wt>1=? yn'KNRMw"yC츞ľ1?a i|L֛xH͈ yM%& 7UuEg ĸ60S䛓΍&? 0 $>}I9 Ⳃ,o&?s@>1kY'iUЎz'sJN.҂w}ӂӸYiQL 1I螼}Nmgܓ"cq@*Me*8(jAoUf |s)o!NYKvRB?o z5= L32aPV#3%4EK]C#/9.鐦܋GʫCb>% EԴqq /Ms2)vr}Ro)9eiR>Z\?;S?Fy*7;#+?{;1]|]S'A:;ǹ* *5 &BAߡ?I۠Gȍqjq/,J>،u:/>~9eMyJW?u:B3g12wr:,*{>%;N:: #Uk-k*32B[zh瓿g҅,@IQ;$/[E;bgI!Rnf1h9\=)ǠԋsЎYV7>hi%c]jνu\yGI?6D?'p)Wd?YH'S ]Ik; ,{zW4 EBמ.>x#*E'hj~,#kȳWa92Qar'Srx)w7a8/9?LT%EcdYe}jVcԕ=q})S_؇#u7>7𾃺STc:M'_rJvbncuK+7A:0?/=D|s-}0m:D~kEVMo%Ute2 x:v̳ :8 6bN{>R[ }kX>h̉>v5D q{{c;%_z`#ԍL.ϡdgrR $㹾ycSJПzU=Ȫ2q]BK|k aUBz>crǴFP֢(kv{~p$+q</a=ꃺzHx/ཅ^'<*X'_Pב|A`>C2,E3.C10bBDž_yg.Xg_QiϮX^ %|ki8xa+(oa%WQx)XJߞB(z >)s,QWx`eOz{迮"j;T!4XA9w~4{ލ8u;}P{h?5|~G6ݸǡc. lsEtkG밹tmF{-(w<=>w;g zMy1pgy:qz`he8 qh3R=%eߙoXRǗ{gGyF1 glYb1j'I#"2Ysu~0N^= ZB!AMy"|ljp9=\ Uߜþ։f1~|n,'!G$BJIGKB^$2B7Q ;DdېT1/QS8R]cA*Nb]bbz"<яu.џаpo닮u)wX[\rKᾗ|igiH[ y@ڢYn%T*wewx=ߏ<j8yR Q"+㢞Bw]S2uBWu"UPGT<{+}੔|`y F,7OykKHtENN,crӻq51x??_Q? ė7/'e%XME}IgJ%nI6+YZuY_=H}lR~^_<Ǭo:?ʹ8V e}kx-q'ח&sǿw %ϑGǑ^Czq{稄]G `1z(f5)h?ڕ[L#I9f XMx G֏ D#"]3LLW4!Կbf=РWOН}QC6Q̣PQ{Oxg,24#t im9o:U,?Èy]]^ݔ/_TMulkMue#R?E}MS4$>a6W:(MmE#&C=v <x ?L1Ea}1&'<)<1sZ(⫪v} q>׷\1f)?OߪPꭜrϛ]t5R :7zz(Ꞔ w%z=qk-m^B3z$)|oҙrqLgO: ?l|ERXNyQDјROu|O ?{R;Yr?Jܷ!_"[]8p?/oǭ"=-:$z*~֎AT'>4~1壄.z(22L9hD Pɉ-pE]T#&lWoC^NQ*W*W+x#1G%:M*;mKTO%tT)a5KŮAwS!y)ʫUTuP*vV$8sm1/uP*0+9('muOw6z'1礮/\c>'+5r#r/( W$sݔK}u\T^=T~9(S?^vPREe.]IEbl{ʓu"(sHԥ  S\4ΊOJBOӍHHH2G-p|}ف?wI8*=Gwa}w:01s4ǧNS`yv` xށ5삿=B|mra6&t`Ů}FeRQ׃ X~Y)U>|LR688am.u}I'cĹ/mp}W7k5z\M%&1״u WVGugR?]C?5eܟTvOCSaC;p"'t nVDh9o"ðy I'LR~~%sB>qNHq+R>tv'F>[IuVeskK pwnowc;>7|Jwc1#{IX'LvGyuFR}Їnu1l/Tf wN>^"wXմ#~uPOx AyW5߾_nD#zwj{ /ps]E+#R1q a<\|Kb]A;yԞk'#~Jig$u_7x:=ڣ]ާ \W[/X e! ~JW@m+^ +19W8R報eވጜ ;ePћtw߸#/"'nwC/a#~ӄ/tD?JHaz'b9"M!9Qb>YMyvB+F9 ^\Q/YnN!~FnXeR0c%3D˵J"o#׺vr7LӈlǭG-Sm}ڦHQgk喻~z1`{`n0I?=C{1u?^oY}>?2Џ:{,@ޣ_~ v$;(kH9s"z -Hܷԇ&N `:E 'E i[/*j;II9G>'}=5z{SUx4M!rN"˻'" Z"_bX(v}DhgA/lH+}H\IEމٓ/Q[%wDަnۚ\ ;X!o3Ebgq]UP2AD:5mk.汮G"4A1N/6H68Ԩ+sR=$~ sDZ#QJTMK:i>I<ꍞ?CF*hWkQD70Ӹr#`Y y@"ꂨ2T 㚽Xj{N^i<}еYXb 0 MYQ׸BwRNSnȲλΰ82 ''0~į_|&q)[;bGO]nejN곝0nx^3(Epb|wL b>u}͌О1/#P#t1q)]~Q}Li!xJNcjxB'( 7J݌nzs[}D݌ u1N'=H;8{a{MVyܸL{\XB"-CqސUN~L[9=kZGbzaǑg/A̗W7#2B'{aͯOs)ӑ?U).k^\ۢKbs'A>2ѵBh77UsDf]|Iv{WQmD1sq?EzB5#ߐx= H'DGI )obvhU7ƧFټ&suXyu=,w9t b.v8J`J0NE2ejzÙgQU&L!=h}9Xo:u7zq_V_!{?#eO\ ϓgS v9V(]g0_p|⺪Gp7Uou8o4nl#ɻgeo=07[RlE39sggC½M_ ZG{MbK.܉XzYFE)9(~$e8aB>Ca(#e_x)\/6w0u4B?#* u[-n(9>1TrTIw+8gH_E혏Yx2a8?FT"kA\> .߆}WR\yC?؏#ūfR^R\/s*+֑I\[:\sڀx+t`+\G8eY8\K6B粦*/"t.OtW. r/zFyv/ Kx +g#ړwK g'".F(2WaR\?˩ ìH;n]Kwø4^~6=b6A&“ćxߔj8'KP- jkǤ6J껍[a>[Pv}C.,ٵv#jG#pmGhױ5B IA^kɾI w'<ù^l7tC"6Ǣ|}3_򞈺!/u@ErjZȷz7KvAR=PQsAӛF<&-߅z< cr?ݐʫ 2FIG;~j}yLcw>M}F?>uW| avBQTJ3&ru6 31^9oFk[enަnvmkr7rmf+ =7ǻ/_#t5fC¹q~ v!ʢ5ըoT<1e׉rܸq*#ьu2Fdyh>~#n >Gg4f:zq緓>FyIej8ܮčtw2ub=˰|_>SN5X?2Ǹ,/sxgDfkN4<ѩ7i;ys˽6ļڑ8uƻ CHKy/(a;Ӕɫ)ʍiU fzgLD/71f^w1C ˧<ʌPp?;$:0Ϩk:ƒXOظ/l-ǰMD;s/qQ"Y.mukCoqv<Ѵo6ݹէ]`_e2oiΣP7k,ݷwWgĸш g1avhP̿^hDݿyGڽ]4tƾ#rE<7R紱 ˿ن`K@_ Y!vv#n1Hh?Uo!w58YQ]7j;oTgTR/p2,C]̱}}PKLǹay2/q݌_[gnneĜ}e\g#?U D#S{W-쇑e]oJhٵ=Av3 "0u{3OL'{ƠOy˻Io6]dԫ_@9iSvbrks4/pChU] 4xU<cQceV[ u-KzSMe*)UuKu|H]JяsF^NGU2Ug7CʽF=^4dI|~ 1y^uh<|n{ᾌ|~$5=!](i_i6G;FSyLsb~xs9) } u1,C'M=LrZErZxRm瓸3N@̼󦒳ᾼwXy=ڡ82%=L0 ~tC{bWc^Z_M#U$DɹH&Hu#ԋFކENUE{ R\89Xɧl[xǸX_M=88~1XV$8q~EE)H Si<:KUE{RRE8w*I:x'٫Tv+b.ef$%K ΂} ӥ2:Ky>>q)ߧ#*bN0=Oԫk&W^_n5>ϥw<ʌ ~e /ײ{></{I=+n:<=.CSH܀[)9ѫB&~'>I_Y /xGN=%s]Mz5v2C#93u7't3jzQ'cb_)wL~9Aܣe4dD|LE+UP֔KyY<䨧nO;禣^S^F4DnF]/C}Yv0BҺpa9\`EU"t.d%qzD%b}_jyM]+^]?VPչ쵟X%d]¿Br3 ݋#?y܍Сȏ˲K #Wt(%'uM9sKmw7;JqN.>~+NtxNw:=v=+oN]IL10#ӟgy9S)Ϙ-8gjMhRO:Dy8JǛW7i ƣ~Ffҝww?_ GMbFU?3Y7?r3sq?Ϝ:ζ1|gDa޳ϼ?enX;c\nوl<Kt4YNyGS(/Maf2B'3d<Lx>QȒ8q~^nx̧_Qr+Rq9EbnnKp^c|ze8ƥE̵Pw2\d˧g&X"W.RBBzχ^7w܊MSsmԫXOz(#zJߪ~&e/^4]x[tX}>O^\Wii?fza?О:n՝_,ʼu0^x<ĕw"}4Q/qU痛9<2U37{ޚ0Cp߇aswMqka&Ͻ޿:*i7:::i&#oM\V|~߾;c?[:?AnLen4nGש;b`ny뎝@℗$_Iڻ!qi g9ݮcb·:P3k(gC=A,ϓgdzy0NuLD;HOE#7{CQS[9RQz.Wnyfzzmt.(y[wi0<8@t,HX8bnF]/r21)H\שTO-̟z&EOKMG92ErUֶoDrZK~ױs!2z مV>aƧNdMO9~Wԍ,9Q?"t#| Q׋t#U?"t#ԋx\q"C\H~9wgycy{ȉxL~lC#% ~ g~cp:0Лč$  &mq݉ЛBMu1wr'ʧǺOH=Ё܊ݏu ˁdl7^D=ˁ43ӁtޗH ,27jzPqb{yԟYyά^C]H~;I_U!澷v%QVv+sb=s}{; ?͓$:awrq82[Dɾ%L'Ce/"p"BB=ˁ<*D<7d!;XNcНMe4f8!ϑg!/IY͸{oGLܧr>=k =gO\ e}E%q {/ -1C8"'/bÓIxIyFy][%~[ 4ozy5 OD.}ǟAX"qkD1_z Yi6l@"uWOSk/T#azq R%YWɤbyu=p:gkyƵƵEq4q{|Bx&?w`Zy:,W+ON1& ?RRĻmH}?FR~sIqO>O, Ǣa#}=w{xқF(SwHf%uЗPW)G"ُ8J"ÑBC;#bn?"v"!,s מ _(AX$uUn [G}F5xFWNC3F~󱟳`9Yp]UWEF5r%ߨQ:hV>ƣCU1u^v>nN=ǎXI8-@Nűø=;bn"%#(1{|` %X":s+u_>QAÑC]nܴrnPޡ8_oA蠽:ϾNbҾ\_6u;ˎxJCHcp}i_Gv/)Kއ%ݯxä%tZ%Ӿl_݃xP» M]YxG?뗮_K(Ԑ{( }uC{tSb3\ƺ-u0޿YP_A]ʞ ), =M[ [}ڽLeا(|UZQWPWP_;^g΂+]Y+\U')Gz&E] \x&E-!{.ʓ1%&I>.$n #qf7GԊǹ99/b'[ NXLN-)~ߓv>kzl#Hu6y5{/Ez1.\Gy0 Ļ8(a_TgC]Mϰsho5ƺ5FlL7w6xDOUv7&R u70<}oY>a={5Y`\p7ZZ-{#0OQW}:rwW|L";im[C3!v멱(u!I{UF.ڙשڕ4E}W聨J?˴d .%Stn~Q_q?:`xNJzSoj_ϝW7FL!¼ctru}CSOu]N\ݢztjMDYSng^hx dGϣ})u .QS#5 >v[vzqy|q#|Mc}Cঝ>_n/0%~==x\Wl>h=C_\q%rϗdG!-7':H'}0vLz"F,?>쇨7 y}nMp}:$R/tB:|R=B"w>NB:ֹF}N܏g:WD=N]gggH"3GSMr/;%b"q*O:_9ܼ̫̒ۆq~u3?!ܔxÚ(ݱ*7&7NO}3s81n|cʅcpy$|chCڊ݊݊v!v+6a *bwv+v+v v+v#(v!:ϹY=9=a_ٰ 5833h5(|1y5D}2ݱ߼'ZEc{w;bw%o#^|=QojM\Os~P/ma8ŲXմ:ރV6t۰O +2 u {D˝`|;M1u~Ϻ+ދVh6BQJuEStb6iw`^>2?H~x~|?<< |?Ziiz~?c^~ ?cǒ ?y"x.)1üGF|q3y_P)'cn$|BI^R 1 RjVG2_P!A/ȵ~U+ִߵAG'Ana>b[c"_2$V@> .|Qxn!jF?:zFDˉ+9Hr{Pk<-Qc\'a1S Ը1~b}g\A1)y lyy҆Q_ vը=Es~8\ܙ=ǢA&iEvz{{-jii[h~ը}Uk7-o{]݃}/9929*Ox839ֺ ~+%UglU j}W#B]MȄZ(|BWzo29hVD]#Mkm:2^m8L?mmf2̊SYI\#b!_J'YʆD>) ?BY_poROGmpeCP>ZS =+&"~aGguK&ΡTGu0U碷ϊ:W}gT2U2O\fsq?9WpFW4N9y2߄Y[qYޣaYiD7ԯ%iOFb?}) }<^XE?ԝ.1>(CPUy+߄_Z7WLr1Jҷ -/'T5G̟4gi83"g_?\_"NG8sy.J_B^P:-&1~P&' eqߘPv3)!/-?8@>J~#ψDۍ?+R' /!f1_Q+^$ﻄ(+ڶu _t_t;]#>Wͯ?/ 2طg5 o3<[9f]uC>BaЊS0>nB6q]s`im! ]lD`mmC>agsK%liD֑JN[f I[*n+L~Cciq#'*U7a~*ӡ?}Ⱦ)+2X>w1< y }EJ~uD#R 7/}DܘoV\7k7\ǬiYJe?kzbugigg?~] b_9#0]j-J97U*ɯ !!vSڏz,wHAО>$.EW|Go4|~nFj}Fj}E > G|,A$$ya>]ȯs)};̟sB=>EF0M%P_xMc~ue>wG`|/_ѿ7pEm+4FEVj4f_~\cZ+]eIӬ4 |>'-6ߣt7+)ߎbԜu0^_Ϻ`?E]iigծϼs֗.]ؘV(w04mtO5Eum϶ˋ m@?bO|:'vCc?}#@F 0pof{#*gɄrw'iBW3'"^D>YscE[k"&gcqj6zF}r}7qVS Uo䳙 \RlV|y7sʾOs;>?ɇs/ WO2Cfw]z(uh}7/_.j|:#~OkFRO':+)tE>ؚFٜCxN_W7 xn.Z_&3 =nYi}c;]miyz:ϱS_e.WP_n5(]><;'ݐ(oG[e/F2|1;>y̙.eOQ?2zx/eoyG96I_ eQ䨇gEϥΘDih^j8Z$#]{tiy'k΂ujrtm` Tĺ_ahy:Ok{,C}8BFoI!݈6_34avcW䧹T1_Քw} 7si^>$_K`KtEޥMA\]E_>y.}A'iPίG8ܷTP[7%:g&7\" ַ֯%rʹ-ۿTF6_ɦ+y+_hWG|D1Uٴl KQV7 -Ѝ|Êܯam^=|ŻY8hwncێwEw;^pW&x:L{{Ż>e]ObW7׋%*.ؗȟE>%?̧?Kɧ2Yd['C-F j\;p:~b\NX/~5CcwEh0#ʗ/CjfL [TR@.:?o&_t-k'_0k` .~-K>aN{4*s3J+:1=1&+P#K}m"_ܳUzXE I:'NY]4]QI~-ozRS1o1U !hkguAvb֛ ƼEٶg mu^2|[̯5v:}Ϛȷ5Ng,v=̟:=ڏE_ԫWGEڊ IFƇb87_GO1?>t C51J?je<.I)}P]1ttuj;8~%_Tx*'e,сS{`}*?%ϧ_}-Oy}f º>ci}Y;X - ?8:ߒ-˃;XSB/^,{"z~xi.Vӗ|Z+d>-=Y)˺/s褪}Z?RZFi k1?k |/ }Z̟u0"@Gi>cipyhJ#;q#߭p}G~EJOv?"ecE[ِz_,.m EY+ tT8wEO#Y'c~1O='">R{95|b߲s&71f6 %X+xxXm(5eS{b|X'aͨimfn-<ݜ70Ϝlu0|0nNc$Z-?s':F>)+(+|_oPۧEE>0R}y1W误Khϫ[;]OkZٶИ3qj[˥ #eo1|]8Ga-Ycޔ} J ۉ;m4*A/(y>b^?H _>uy?Ϟ7S |tqG9|<G}i1MQN)˟3!7~/M'livޯ=ٿj_O/GgXX4 s$?>vaVڏ3g.}M|Z?GgT5/Gٵ,7/m/w̯1K(sϙ=z]_γs$v.E~o̿N@=WS9䫩t'_cf}%辚ZZ#j9Z|{~j &GOKvcOG`O/q?bZ|_ʭ>xN'I?4ڒL۬q{!ԧs2UbU蟮r̓я~ŶiMd2mFԋ@~ > ~7? ʬ|sx[J!>݋Cy a+ƿm\5&wq&*俒F_;3Mԗ\? .ECߥ.pf/ " nU/>zr!MĔ|[L~j/Q }0%͕`r ˽kٷ}0`>҃ Vhw/tE,zpGSƆOE>WS~od>@e?imk!1DaOQ_Jch|}ƏЛe>k `~ie.M%ߎ)t^sUt hNן|}/t?gq.Oc.szdx_P|Hs/50ˆ8. xuˡ[h߶޴yg?^0+Jxv'9Nb};Y+ QW7OF)*L!EԂCo a&y&>;0oО~J͏|1BI%qd/y|1_3 1̬Q?k7t} >:7{ʳ~C;0ˊ2'bD]VS{>~.3Ӻ3ZODFpK<\Rlu$e&xhC[:ߍ\etxE_a=`QZ_%ni%OG/͈KV$-upDR7KY-{]1~+~Ogb ~^6:zٽ` ﯹFtȋx+?, yGNWYu}5K_g-~VP3ޗ;NCıw;6*;._ǎw{csi=c0+'h<7#ci^qcf~$S,ŎuǷyz;oGo8<2iN}8O[ EKiL|5e6Ǘ }E賩_3 3j}3_KUV/dx ;&~?OtXd)eFmhxcy%q?,7%ni2/Eb꧰PsE3gXid/O@wc,i?K /KO̟Llگ%}OT ::#<@b֜x_&tY캥X/wY(*~ ݮ- >soEt[n ir?O΃qyLu<=17OX/~ctFm:Σv .ȟҾ`wEї8'kpdo%o\zuwF\qgmVYSi$NoGu|%txM9J%?]!q_Pq|8|tK(od({|5Mq{4O'|5ivE>'Eͺau[cu/i5̻.8.&n?{To~_Y: mlG >b~l9Ho|6j5+j"'l6V[O~PƵP~?\ [a^|3qG,S[@%.61"_Rc]d>xLwa>Z/Cz}.O}6y!Q{yE{Iwv0iW䨈}0| |/C/siSmUAUcJa֨曀u`<*$27+1 .WǺJ-_O1Ew9Mc ;f]C}ipn|e\24ݿuaxoA` \g|5v4vH sa>_1 ~Ȱ!b}%j}LW}?J({n9,7ayu-\IqߌZc<|3/S2?7#˸^}rtof34^Do|(/ 9 Z/,-oOp_+{=r%x]L8 rBPZ`GJ~RŘgk+g%?ϞRxs.j"6EY_<1z |)0GI~}:?'їsz(ΏpDQd}۔ʉ2←aU }8 '=wF ʅh.E 3,_ƼCG,rqWE"8kdה2Q$g~_s6oF_sЮ7#XƭF9旱5|(e߄0+G~Esl)p{_++k A }&Fvg2\"os#\va,A%\05Sq`~}*eH_e*E[iy$Pc5.Ęĺd%xco){TWsjږoYEɷSc?17cJSi[,ڽB}lHZyco~rqUN`N=뻔 ߙOy@߷ |n׌G{)| ّ'4$<6AS+̗b~g#׸=okd,툼&sN(K2Ǭ4_ɥ~|$yGgC8Y1DD#_ܫ~Ork7D?bjeGS$?r"֩~*9O$COs"~;5U כ+FH羼.q)+k>KDOGofsTqTa{|I跡/١=GN{d]D]d 1GII=|P_1*jDzW$ǪP^Ue}~u?(dK:~r_Jcϣ`p_; .ZW8Jcuwo$_3;H:~r_?wrW\?Eб Gg W s{$`~aZhg>א=k`~mS~%CJVW1lʎ]>z / [[ڍxy|E="o! ӿ|s:">k[~ӎ9 59$1!JwĭKhZ{wn}{B"nx8Ab aC|";`?U!p(*sv?;oǀH5a!'%~4و|O@GA_A w'Fvo]: K֟@nep3UI~Ϡ K@_'X䀿$_AYۅ0>W ǣ,Q,dK>>~\qn} D~Zc # U @t.U0^#`Y#4}?>~^{o@%|BҹQmpms5|>-'Pq_U /PÄ'4dO+Z_ C"_S")頋s.z=3i9uO\rEKRw2)PiL,'P;}/{?K4!i7O)^/'?6}yyl =lx˛Ĵ~~sYx^Wko0GW#o\;Gmr]vɪmO- e+Q˷"͵νMGƵ \0?̷ǎzƹg]Gm675eܛq?m0د_`_1 _ТcAḮa`/f[_'r=C0Ϟ#ڽƺ{q'71 K׿ױ߯m9w2wUVcƿ ޖI{7w$KLJs3~͸z7[">q|&1:~WF=9į}wV،_ܺ.摸r^Yz_ZĩZemK~#j G0JZ?˝˛%+aF!|7p"eƕGcEn,2&7Y tEorc|| 'ocghݗky#:FU6GOO qoVߒdizp!FENxϲޜ:FKBp>ܚjO+$N}~qj?K 3y>sIȼg.` \5W6O^<UWece㾎l0| 2_Mk{}R?,U=LZ?q06 lJ/a,7{~ynX4FghY#R!1x\D/On3r˚d|qezl#/]7QnxE\2N̝sOߡF틿?ơK0}ZzӗKtAtΛEQf|:cj9P\/o&YȣAL.>* J<Ǹ4JϷC{Jg;+ cqYoydYęx3ϙe\9yrl܊('*MřE^%^LgVzܶ`o/nzp,r`_/(Ash\KUu%Nx3x8ds`Ӗ /KH\@.}[8fW2j湰yă/j9 QOy‰`Nj7vٿI߂}1^H)nj(/=W D G9My鄯1n/|qS482Z"ZsN7_NGZ@h//g \矑7ptga?q+;qQ(ח֘<幨9(""ɸ 8_"|_ENSwG^}K|t{W⤆QE=7\P#mCdt7|/XEc_sQyQ=F(yuWC7:֏֍|1064ؘi㍍q.3 ?ؘ'i1Z!ƶV=b/g5ƺ1.΅~>Wm{淌2N+;\crX*qW5g(oeU_ڴ8? U碥hlouߗ=ƻTnZX]P8*X}|<6Kd抚ϖ9R5Rf^wAdv%au/_m4?6Z&ⵌ6>ey+Kux __.|Lo>c8/UcMD%.i/_+eNR_J\.箫洆e3brYCy짏n(zb*qZe [r>+NyE./};ǜ=N֕,e {TY,J<+{enWF+q 򺸯5cy+㷉V-<Si_783y=mȺBZ?d5xx[dM/xD82cmv\t0*rQA=5yqOM?㤪9g 9Ns>כwr\WX\5=S9V<~{E痌[\rqjO3.Iqէug|rrX_-<^5θfx/_-#ОJ|qZz<Pˊ#~2^pUj vC;o!ocz:xC.V}E<-'rUQ;|S>6}sU=yyW?F㪹}}Ǹ꬝mE|ulC_6myjYz_μJ#{qIo-O7{a 朻ݭPSg5 O5'rρo3|?/~PN8)ީ*5Nh4J1=qzM6a~_Q*co?G\dy麹8gZ[#b"z!ԫ)SEdymExJN+Zj`NZ.to!m73W":cW.Dx(y(s͙/QNi9#ksgS7;EB/S_~ktcngt8fy)rLt_ e#sK+OycWV3އ+K[~-!]c??uG?}yce|]c6xM<0D̐e7yx8/?+8&/#e|昶Vv}"jf_kZd#%y"lta*A<P )"y`qO?W=d\S%)R5ظʕo>hhq ! $~8#8b>c/И"ewWǦ:,Wd(]᜛Qm@&7s/5B?՜m8SǑ-C]NG #yvm DИ|-"1ڡYAYθYx~ܬS/Şwt>ٔ20^:cm;mFڧYFۯ>w} 1bF`yhR Z4b龗鷛Orwa/\z?܏C c߇6e'ߡh;t-9h w(t2=J8alp|08e aÍkc1i5ـ6pV$ wq3]W'^+χqʨg.ΘVE_-V^9ʱ=\s0^-:]2.F%z#}]4>=ui"KSu\cN%tXr&}\qylWr0ʎgޝL18_Nۚδ4κԴBǝ#ie\ZN@ jOOnMxrJ^y>˸0~V2~XeZ.sWIc8G8E}B?)~F=v>J]e#'㠟]ǑCc'2l,ďm~>fj4y^<)ƻ[x_r1?Ϗrd?.K=G6dXW[?xq˦}k5*m ?@&x>,ujaXH_kݨ=mT/y[xa⼯0_ۮծhu#׃\+{yL?8(+qlq[:^Ưr 0j~]>ucowαGx׌[jwWԌO@:[[YƫUͭkV__PNCHzʡZ,;.S9$%.suˡ{hA<&4i,djƩŧ6666wn!<$,z>u~y< #8/W>e=xD8iONȊpjq,<1qmuܫ/+<9uS<_g4l(O޷&\Ѹrd}!_ΦEf0g.?,7 8sbP+xƛS+ߪ `\9`w3K5_CPN;Y79`<7x sZL_qi?gy7Z._!}bw+0d_{6p{W0ÄF>}c=c,^m~!֌7kzs:_4Fϲ6lBQ\c&?P{#qnNxU㱾Q+]@<#B<[e:<'t&q]s>/Y>h?gݬcP]~ws4ߑNCi/(v}۪1 v^Fxf9[ȸ|/)>:,:oM%ͨا*~Rw_;nqBY %o(esy9g+Z97e/8g '͚3?O26w{z[y ͟76O.G]wrQSM`*t9_TCy#%qO3υ~"a+Āi;ɺ^ߍbci؜r`^}x#kĈͳB:|~~j{СBqCA ^[Z; Geǟ;l(T=c>%|(Jܘq~!/nxjΩ/fry㗌#}9:@|1"cDWd1y:><- ߟׇw17 ? >MBPqѹX97ysδY\;\=瘀(+N7y7L䘱QYτ[x_kfK[;at9Kn999ޙkyJSs5f\痌[2>Y!ZߌrQNi=kۻ?DO2j3KoeOgy/y*axq"ϏwuD-dƑ>%䚃J\Wp5|yԻj9/3l(O or_VBh{Z\keƼڦ0v|!Z~UeP"+;]?ӏωuW??5/П쌗߅D^{8zZXO?? x<>'3H+̖ߙ;ޙP>us`޳ZDA=þyrF"8>קlC%n_&sH1>?0y.lY 9y^>yy\Iԋ<N%yxY88<"2]/{'ȳ%{5v>ߋ8蕡_?G ˟rUO"r'ۭq WeY;aEYę?Z%wqLW>B)~_} aU@_ jƎ^u75 T]E[ulSu߶Y#ª)L#dz륧g6j~ 1)4 6cQ-Vԟǹ_J3ՙ#g`3Bpn@L3+|f%g|YLgyWc˯,8:1"G+!ǵ|tcƍSʇW9q֗1b%Nܧ,m{is 9r_{<>셨u{"2,⿌o弆ݷqx2:Ӽ]5:}}H\ץdƻHW⼣6Mڣ)My^#q*)ig@⨌pScRg)S<,1f{ya ?^+Ʀrفxbl\6a~Sy^~%90ehUr.دyf u󫎞g1㴆x߯whso?1Os g}Dc!ߴ4.F _lø_؁!y Bn*kfDaܔR%NZ^28i k]Ƶ֞7Iz{o?7q5i5qc6yf_ڌl~myuC`suXL[eB;.s#v#isUrܙ/W}*ڟqݥ>wuOȆ~YsxtScty2+;@c,'~W5)y}\޼-&'幛d3n qr=fx#Qe7K+D-yYT?U̟+OlCo:2exWOQ>9DE7xFgz17㸞);f~JN.x\ ~tQ ^@YW)?ʺ/O7u=1noGZص7:!'\_,d}E>X2n$9!".9ԂqAqYx˴eKqI05I5Y_ p7eI\z.Z.P9t󟿋1ױ "{Kb|~3[hS;qFzNb<{w01Vt?+p.7C;p"s7%ޖ\6xۡڗяl&m:ݒDnu{m~Z>&b|=ۑޜɌ_6rm\"G QxE՚9Qf(_q 9&؇=}e>[~"/wZ2_qO{9ʿq)εtGz ;چNŖS[؇< ;-Li9\!9H0PU 1^:4^H7ӗ.8Q7%9Z;qKluHo+܋WVM!がxԂ7 9ZwgsS.üJO}/qOb0^ Ĺ271#\Ux@ĝ?$7ј!E~X! Oѩƫ{G<9G8#@g l/<>}?E? aOi'`'Ų~fh}s$Z?h->-oy}?q cQ~Zl:ڟ1OogQŰ{l)_GL2n\^ni՞WlGs@%gz r\Z>wo·Wz2._n]J2@8~K ùdCԦX3(cėM> q˯2b\+ 愝>-A}htb2C])kq]{r]bnxO߯>ļlv6ŋ_x{ƺ֛}_^b='|!9*!sΞ*7dBwwqo$Bo";圩C#2Y~Y!笑Q;dv'7I<_r_ܯ84so[G9EeU*=O9i.Es69(qO%޹52Ω7o9+qיKh9\S_cZ♌c嗗U!K[)^sJ}VXg x=6]s`.%>ohºm :4ux7a~?ۧi_u8U# n4Xkbz׆6#m׮|h2Z{Li{!_} nzި0q,iˈčKAs0zEna+>/Ƒ/1֫~m꫿^ȝAqf!_VɕCP/˞"<~`y.< 8&חGsΥi.4t"hƟSva:2ɥ˞A ,nD?m2cܸ[{ďu^29?/Rƹt߉yqM>Փ\עk4ٯw.ji0ǝR<*jhW޷_S; f?ː|M!?I]:$ 2l.Aۯslu͠26j{?˔ \OʌWe7nT ڷ.qWs:zJ>Pש&u{byGӘ-w.t|=w;'ړ'{e|y?g\˯G乹\gz>濋ۊ񝮂3^~D<:rMS8zu;g끲s@;s1s`*ѥ-]NEq{Cyob"y-øQP1N.G?\CCrms;$- _ ڢHy8qbܸ1"{7n|@_פVZ ȓ_woc܄bo't}NpC>mI3L>9+co7gqa yI]S/qvͲ"δFS3N^,2Mhl2^\2q_vr5[vo}h/ߠ;݀FwvzG<4ϣ\:GKgwf9Ӧ1d^!ofY-WyG^Q=2nx?{ rbI5*xqC4pcc?8j>ƍS>1[Hxtӳ[ʞw4N{qz=7cɹb`SZ'=1rbcmX ƍqˇ}B 4ۇı-3Өg3m(Ninn#8['jr[&#:ѷ2ՌS|GSm=mI?_v3^*|CQo f8m4^zO{! oպFz#'=^hI% Ҟe%NyǪ:滷1ni(`n)lO5KX'jϫ5r<V~aUjͫN5>j}:C?+4vazݵ7G:EQxz<urБR^UFZ.]=WE塡qlS 2> I j. mg]?)u>ۄnΣP7%ޯ)T&]{z>y>@\+s\侅c1nks^)q2=!ܶB nD35o=@9r/ԏ?"+*Z1E?%sؔ⯉UJ|-tx9WE6x}9k`2ޚt,]xnF/8Bc"[g:xC4mG6m=Ѹ ~ʄ~̏a|8OSn^;<;A]siX]Py.#ۧ/~󔧱:tV]hhz?`?a%?GVr~c4Ah} 1#i4ѧ Cq8hubNwG^с:JR╹_2]-䖕k؟_[6| [^Sm2yS9_∆>q9h|+r:ϩr1~Hq:N?N<ݙx{^b݀lPP% ]`'wpҎӓ-+!>e_h_7h1פ-_dz4v_:¾zd3>7EKNMiD~sC凃mk:qeC&,'x]9|q9gxVr?y(U!KQ/X-B~)xϫ]2nvq\ϫ[UB9,wB^a5p>w߀ZJvvǸ]Gjw]zyvOMcER[vy8{J'< }1/ig %S B.\s2?ڕǘ_FLdYO3"x A/ֵ߿CUd_j/MQAz8Gm|C<\؉CyȉξN%" BԗHܣweF۸Ǵ؉؟qᓉj>:y0" 3]ь> ~I⁈N"wR=ʶ`}{4?W5G:ޗ{;rdse {TKs\9x0g40orGxjѡ7r*8\='nol콀w|W=h]-W 4:z+Xæ:>@h04_$lv*Ac"7uj>JD{v=pɹGH?ʌ,X7bK@`=0q5#{ڏrǺZ@״HOR""2>/%?9fE{oܺ yxFdk܂񊀘)[xS0#\G%^9N~8S6X3u܁5m1Ə(9W|\s4vu\r>D-.-vC9Z.&+r1_ҹysoKzGCc(;ywq6Oh~v8)9{L/ļ}:N>Ni}BBsNx.ZܣO5(Ye}9Ǥ?5;h4e_& $qrP1bL* 2;W|L2w9A}Ʈ+񍨥foo3U[Pa.Uhh mG"6;BGe\P>qyįs;;Wn~2~p@9StVUŢzeEL\kM~~*q!2C?I)΢02y")4S0^61n"%)IHf祚#=HvK8̶!?'' y޼DGj9Its&Ѷ1OtzX/z=â?9!,q\%, S4?n*+ݛ@oHq`CEEyR/q\Dd+7N&K"ro᫋}/ȟ# Xa=V[sU"}apNIąt8/bH6/4x_8y9c׍Bsq;Hq\ iwNGsV+3W \7Oo>$BJ?#1*Jȅ,J|k'T 1^:EC x^W#(}neSjEnt z2? ]8ulQEH]I"C[xЛ4Qol.$ANǸ^3W,|&3^sgR|Fe^6j>0\*y"q_rJMnq#a>Ynzn0"/g2r-ga|EU !|<_(+WI67^J/C*p]B~F({Sacq}ɨ3}XO7ѓ$yo0N;~/MCd$C |sRsDC_Αz9V;xΡ 8> |u}/(O1\:؟<}: ݅^և~㴹Pm?+n^$YW5/pv{87x{ړۢs(wsUT6 ?q ?p@oM[_M/an1ql./QSDu:oIz%]E:zۋMOg:&}rN~ Ѐ(zywK8n^NC;~?:eR_ۂzn`7"͸״c~on:co>=ٺc_osnAEp>m4؍o#ju؃0Xg:|rwB0;Kg]ٙ~J9wmЏ<DWo]wsbXSJwgz ݟΞ:>Uo$Ww?U'ב\=[uxNg{-3ɺ2l>#$=۝F=ݕvܧc^F}d3C;y]rB/$[g79ZT7#c$EzycɼMgg:ӟu yk+MA?.χ.֢j?)PP}<]d^sLjuqnyE)K.^VwvlIw:7ӷw<չtm]QfcQNﺶEڳ$϶H_tbǁ]!:q\ [~%3C#Uo]uFpquMڐ9_W܂X>21!o8y-rͮd?kkTx}uetU;إ:StvZ]\_=\^to^!ۛ`H>Zcz ed0>S;#'ߩO])A`^y"3}b2\{Ὕs>#+y}3uZN`DzέVޥMuԷõ<8E}hd?v&njo ug$}Nzuqn-ҫ6,׭?A=ӯtُb?L޺ e5nm^tj}i%]п[eC7ӀW5 vեCe4G_iקy]^Ou/{٧7r\\sci8O!ZiF_q!TW`W@ tTݫT'~2^Oi923==8 խkZyyk;(3[I<ecO?5ف bLNԱ%brSD^mẒZN5 JԫN=$tA/ơOONէ%nѼ ztruhs8ICP՗y]CwuMPV/K2ӓ=[2]9e=ueIGS1zAL)Xӫ&il}4)#ÚZLOV#3Sy8!ؗn\n-ȰgqA1_|.Qf m֑\ of',Ҏ܉2ӕ,ԁs\Q\UWMƼ{1O-y4!exlR%yR3}ro0ڟwDi8kf9 e*~z,y0Lo -D+Ω^.kC=i*ݽX;q|1#^5r~ ӧߵ=u!tm및v_wZ]2 |F[sQ;?Q0L[z lyxv^/ocqeW'y|l'ͷBޤK7i3Z/G%L'x~"}TFP\ҿ[ ݊zx64=q%]\_=`Jzu1غx=UUFH'䑀(@^7{e狲<~(t߭+Џ_䠓uKCqIY][CݑwJ >uv<|z:矁s@77N^ _^.U{>]IVқ5վGן\~=IWԟ[.қ=9ݒ|yYVWfzu&|\~%ߒtd3XsUBeh7T7.^٧|2YI?S^W| 1XI71t5@Ķ۵@{| ^rruh%*{iE syWl8|^,ҕEz¶0n!Ţ9 jYIo.\<[v;ފCQK|ʺ2% 3WIezxglZ?OyP~~Oj44z.S7΂u Uꦼ^tҐBPdn-Cц=@"o҆\s~h~?BvE.,ctX}Lw鬇ǣg?k83._F;aSJ}6<CLꮜ:;?AW|#b~|>z밆1% bf(_} /m# 9cW+Z}itX2ݵqRL_5TO={/ *EG;h'=~ wq'4k0?w"';k;>Igeͥ8g@O"kɺI:l~CE*jSZuD}S5 3SJǼq3Tnjz:fJO'kc21hu̦`}zf41?gtLTh +ic_xX&ztʇ%6ͼZf#/Fy3؏Z/s2+tGiy㘮yg1\A?%]3ߋ!qΙ\]RAtL22Qdc;70~WqL<36ʼLO\&y_-wqYx%֘Kۂ\g0^GBZ씬XCsFI_鈷Wǡ/!>A|I~xG wjGx#$=uH;*J:#c]}mc>kҠ]I_DvRge:'_o 'cK;<QaI3/ĥhy?&sۂOQ;V3<l-m{:ꗟ}cEeUI:HuI^,_Z}9ib=r{_G%?r)ڙaR'#?vC|@cuA.>U *_& $霼LϜЁ\Lה֡oa>Nw,isnEu~J,y"潲StM)"uH(6A)F=C_쌨V5ۙa(Cu>_&O<"]Rxd$?;y}taAOc^}uEz":EKzbmxxNh[ Xm& wRNcShgiS Dˡ~x:^q0i{x>|3C22QdeE?1>+|m*o2΁ꛆsBrsE|kJzfbSg&[, ƥΝLKRgjea>;c<9:gFN}U6d]yڹ6tN^|:g9-Pt.f{1d--I| ʼtOz's^qn$霷s.}s_9+"[K tο^T5Ez:fqm뙼9o],>2CT1yŸ94N.}A}e\BFu+:)[":\nI'HQc 9kU Dr~9F9=%Iȕ' Ea\Or: 1/e7疐ۑL_ezjҸ^IOuS~ $駅opZji?TUtv-Onj^j{D(Ig/@{~vFq= m?Z |:,D c@O|? < ~g@;d@A )3l⺦?L~L5TUE:h.Nho֘|Ih:%*w)5r6X7,qeVZv݉~WV`+G:ny\xg8]ͽZqs~8-_}^+sR^C Gwz@-&%?oz#C[ƒμո4DVu[XSD/n/ # N s4Ȁu& y/ίƷqz;Cs^_u Es50#~p;s?(e:~#i -|~+0J{Zn#X{B>C0,{a?&03?Ol7:ƽ_ӡtzڃd}I?nLGpo@ֱ}(?=>x=kZ?Ubrur^ϱ?Ygo8݇q~Uy\'SWy=n~et=tpO]-=[Gsoȋ ;]hz6c> *JZ}Z.SK_ImО\ZҧuiCw{}+.{1"{x={d^yzu_JZҩSZ^HYVy.)G {re.z]_=:.KOҧEtruo9oy7b[ت`n-ڏ~[h<ӟ_lEEwx_oxa^S:xو"O:g:8wtn6kO9VGlg_g'WǞ8ٗLؒ~LmIG򺵡zZzZ cN7"~<'qGLҫ3/O%dA%L" Y7`[f_HՇ.,҃jSvJB.|{9/$ezLm\d_bb<_]3̲B܉Mcc=.ECV鴫AoҐ[UϚDs"LDRi{Izm](KoZmc`m/l2V2T&"JzSMVtTn7mK?ïx5{mez~l`|?ηnݥ:c2m6wƘ5s-]̵Sb::" Zܪ*|t/}M[u"JoDLL?>I:P/} _|(铼VtMG?I;/ٺNH+醼uOg:po#f>O/z\_W/8i)ISYIzܥOQ3=iNė9W;2N~BSqhtn䑒 rs7E%ʾ^|7qk"rL]D:ZPfzZ:wy]M_=mڥ'8\צiS xK_<,iLQa~5h{n4:gF>Gyc<]=qxJ=-g߳C3Z/m1_uO^e u/<7Qu}Eы1{DCu̽ez^+ў\]yG?<%O_.Md^nWteJ }~YwnED[ZgZ6W+9_.)|+e=Roqd?r=ҪcH3Tc]M'W>eYɺ>.6՞9d{-%/_1^?lovh7T;x.ꏾ5#яOhMcP>^4izz#Jq~΋2~V7oe Y7C^x:yL7ox]U7 =GSqXO_=1FXn>D%=V-bǥtECD=uDEfεt2ydz"#)G QD/R*AŊ85Wi4j@co}(y3hg-]Wܴ >9^\~oT+sOtK^{Jz?^+i1*Y7ڏDzWԀ 'ҷ%ұZ2ӳ,Ib:O< }*ͫV$fN#W%WnM6} EHpPm+>.n~DOs&ͦ";ZczZh93 -+ցn~ Q~0"{6"?WI/fx,u#7y"7"݆i"n$$}&Kd^>S%(>Ii2k;Gܷ(ϩ}9r'?%dP&<*"FA,DmY+[ɾ-6$~_ɈeG1Y#k7kҖƣ\9;3ez OxF4#Qk.FB7$5tH9~2O~t h_Jy~D]|Z#p7fb7b}& {f/[>%X+}k7v\}s=Ly$ X|w wɇVgQ0=4?x 1epwr,UxGtv. ?s8}hЯ,yAIP97"WQ(}%/%Fk3}C?NH=zsLUkzƬ?kΧl3w#K1wwJ:HVB(YfnZ>yݛ^ס>#{kJT{s3?P9[A.瑲R0xE:˘GOET\U .E0ac5zJ=Eo'J KxjN5 Nb>Ӹ M^R^ y'n◦nEDn9~2;8)~B=E^71^Nz$k C;KeF"){w $Ϛ0=;$^7E>7q|1c:Z$zI:H\1^uOWxjᇸe$ꍥt^P9.29.I+29;>֗/?tw#%cVKosE͓o>_񧱡bPI?$M_gnye}2SxEOʒs: OMDzIo8Ip q4ٟ{z]YE\~]̕t<^yi,S &#Έ]~:t|ߢ>_^OD\x7dz5w'#SMs34 n*S꭯z rxZ\O䱜GPw7.Up3OzRzZe],L?$XvhgdoG%|7a2YtECOnAp'se;/7ޝo5: }zjeE=$?uj76CI/a:H yx9dI_M/rE=0EA9N7wD(D^fczϜŋiU9|>c>n'!uA`sp{~}s ZC˟br|:qZ;|.*8$㛤0i>|nc,朦2)6)x~S}ˑ~~bY|ezΔ1:"7+qCȺB5IdzJn)"ݣy<.? Cd:L"mˀu4jж2Ѳ-yVⰯVL1o~[ͯL7PL_lFVߥ81tL }㐇wZ011?77uھ}mY??h2UZ~(4q>f']Ϝz9CL8a25Oh-iY>MiH9L+;sqþsAaͮ#pM#(7-AY_y׶ΥN"KycuƓy#J\ZNzN1g{7꙾qc~^qO7T)$Tmru^1>#e^xmTILazLGߵ&|Q["v#q(;܋HSRe7b5?6}Q.9$'0˵&|oQ.Scka|EV~Z5wuqpNSn:To24G كe$I~FQd?#]SJ~ݜA9V4G[+LhyLz}ԧ/k Aw8]vx_vlXLRtBT 㒯K:HݸyJ>uSUYDc^u1[RҥգC1םMҠםRJoGޤ~nS>~D%&u7~"}Wh{E mҿݦȰ'olFLiLY7 SvDf&eNV+-Y%i}7-9>ʹ#1ϴsJ5>\(ӫ9z1 Su5 b=k 1T7Rҋ>t!$}&G$Ig:K7$])v ()ɹ ʺ=8{~I}*^L￸uṪqDͯ<}pc-ǔ1 ?̽\_`#c?z"'GV;]v"2ݧ:|~ScO 9y?>9\$2sy/n9ڐEtsMt}gI?7JSF ׈q8=^$$xL/y7zɷQ/M^t^iKI C; :A!zL#VѲgb?=(-;`Aa^%e|7:v(3=Frp؃Z+яE?CxIāyؾW:Z}7~!KiDCHNQڙ^>C>T;v$GDzEP(+Qt W^%ꥼz|zCyQ~2[S,|>Y/{5]|]1n&7/.9/_yn`MnJ巢v52]y,UsO'&qRr~¼$?ς>k-y3ϴO;3*7ޱ{ywkϼ3Gy%;,JQ79Ʊo|k)yNmj5 |H痽گ2+OB/Y^1#-)=wFY)dyeѯ։(3y+Fo|&O獖dK3\ǹ렬G#ug]hb h=hh=⼢ګ-/ A\uqQZә@,du MO *yW)),3#wS~/U敲|2wƑd0l~+~,oxѲs1Jy$y|myZ2^}ӡ,?ծD6LG5;!FMHW ;t@e:¼NEd}>4QaTyOgj'gP_ bkZ.za|h]ZkCŒ"3d,*寉y(/%{uUp?]7b Sٻ=[_ }/COiVXqt^XDZa;ɇnXZ}Y&7eykzVSuY62'Ct1r3(U;M:~p "ט /NoF8JüN/&rT s> ]?+9&Ϯ]ke鍲( z|^,s9U篆v}ܜop+?ż.&ϙs.ԌF9@>_q5qYD_.o,hϻ6nOs]>ahwwtWxoFWkvy-Ϯ[|>*.l&ˠ9(OgB|~z6>7 ?y"= >giNZZ~<59k&xW¸b^cN^|hd2׳|. s^)_2#]m.Ӈo\x\\ּe&hwQ,?]5yo[[泽?_aޛ._Vż>.a_+& LbUHտ彽ߥ`O;x?UYJ-c{OpLbx>YlBhv M9Ziu؏gXOdw֎;+G1 ߘc6=kMSF37BU J;$)o?ݐ`ӭ,Fy^qZ}seZ bt>nߞ6p6fYtmz=ĖVy}~탑ꭓ(#{}a{]¼"܍RXG>Go0] u=C) c=6|EOhLYƭ:7^(5ʎyT̈́C{x=WdꅡWQ aܨP Еt5CD:i_d+.{0C+,thW9h_ FgP6d^I'`@%``@Z9^our:AtTh2Nd?Kt%1lg:%u>Opn0OUyzK1C\`=﹉ >.] hq~{ ?~ȁ~rO%l/Z~vFle;uݧ_|b]!QOH$W7`zoutbJ:A1֤vz#n =y>¼vV$6 ٿyoQf:(74,gyWd}N?|~6Fdy}?Hyr=P^/Yij6EyaƃQ ê{gĮkM=+OYW7}Iy[}0sD(Ok-)KM|GlVp?O}9U G?A[櫶êb\L/TY^z秉ыK}%1GKWZ&c@9ZJynDzo~ͣD'EΌs#F=u'=Dyl7Ag?|Z/<\~AY;0)޾ ?'XʇS*>p; m _uxPʋ?~wC{fzQZ-򩨰f)_΋$=%k2dM@&5@6i4ֱCl;E]Q5Yƕh0tͲX̅9 f3_)9)k=&6EQg~ 硔߯| ,W{(2;+,?ĸo?Ө2N`߲| qw7qJ7˳Y^|ϓ̇zx'R~iek.U,̹53ُ,44t_-2ыD4*M.?CŤ|a]FMd>S s,f%oo#O3Mha|u+mwFz3گ?b<ai_WlUv ^L@a_ruZ~I~?ܲ4G[廨wsM~f[<t=Ӟ|#w'|kh慺#ɺky-,‹+g!Ȑf2g'~&m/d]LY+oX=Ydq^C47N_L!^N DUX'ٷEV'g@עM˹db~)xk+YU( O_1[uFpqbg^Vߺ8&'77G_2uC}\E+aD:ӯ>yHu2wH >8/5?3~?#EA棟ӱX_Gסbs q/~NR^:X3ʼR)}g'}3n,^Ɋ~}?Ad_K/CYez|Pm&cy U].%DTO-0._@ 9r|>(}'}r3G̓Z,< sEM5 ļA׌|sn(wbC:&Cm8)14~?y8%TR5OGD{X9u ey}X:o. ug7^DX3ۿ!#נ~?;r6iomffy4;3y-+^]6A@vDCpޟv1kĩ8EɈhBׁpZ9[Ԫ_R:Y~| ΧԮs+gC &Ww gBA)_s{eyC\l@=GC=8C8Z? q>,8q^Ẉ 縷cQO5'KW!]']}"y{UWyR"6ݵ %tx=0nĒ&_77Cߌ .aUѲkgw~{zxutwq3:/? WDP)/B7ʠ|y|IZ:EK',O}}A<+'EVC;?7 A~^ttvCϗdz߯{tnlާ! M#|>r((]sg9|NE2{W!uPG7АMe3c4٧Y]u r5kU+Z9A^66 ^+߽֭]wLu}'y7g_=y[ G]~Z_qekMii} ?aeN㎙~K_X2|._|bыS)7ޝ?yno{_qʢi_d_> GRa/G' +!2~Nޛ='Cz!18y|D) ^;};|Cg'b⽭Y0s7:_%mGdyB׏ȼ9nPmU(-l+,ߎvOgzO| :^іwNHۧhюg>Z֝:=ܛk&6%1}gs\}ǾgNc?ltܦXBۦcCWIϼI)_yZǬrF\BRTkO?up/˓sY|:3Oʋw;AGS@dyҡ2_IE4>y"dTZJu}L̟l-k$ñ ,?\ j $`W* ,?y{2_)B_Z#[Cʢ~DroDg?Ğh#g_:3sZ^F-P?jceDgP? {݃1F`1C0^m1qQu8`b *e'bR`#v+v+v`' v`L3>ϙ^k93s콯kKCfdﻀ~BޘZ=oGjy:VBv+C[{R~t/N*z蟮Oie\ `L:z]$yغl]vw~W Vͮڔz:ܩAϋON~܏v% &]%\4&,%\~)c6_[GqVwuSaK\/Gu> c|)OuPa;bg0=\q^Gh_@|w ȴ:er:' xMB~;N`&9wB]iЅrw˹AxEW1-|e~7yPaz(gΗ!W.h5glY{w Ngcq4v{;/?1Vк>[?uM;1aY= Zװx uI{vlЮ}Uk`3^:vi\~xOF?nvJ?A|]붏u>V$+p}jS+ݙM_7 }T^uHr`Vov69cYu_ZSmSLSt +uJ䣯@z>)ܑNq(֋/pC9Lnu{]YePNEݛ3󲿰o^W^}>GYüyXݹB5#Ǯ >uѢLyp K ^j:r_5"z@kZz^X{J q7BSۘΫ_y^gW?lam:00ETn =F,Rῠ!N? S}/ԋO!42/pv]yм2fJ"q 7ϛq~wζ4wte9;}6ڝZ;6:߱`xHՀbdMj}L GvXs-Ə7aʛ߿} O8n{^!;uէc^Ҿy?O1yX#6mRnںǴu1e}WnHӌ%Y3߇oJhf;6vfIg|~&Ļʡ&w]7OZr7kZvMg1?ڙBy;[|y]UWwܼF`e ̾=v5lp>l']K|̐^n;lv*6YA->v*t<CܪjToAg\lIeajLm~t}d3*|?lW^OR"}-|G;{8ߞ~<6;KDB>nǟ ;;X 6;36cqǮD[Gt.lt;Os{Oyyޖ͟|~t*h ]C~ y`w`xl$44;v lI]Ē`TRvG 4n͗\/=%7/bCCvaCo}&r62$iZ_Wre(,#K@\#/9\y>z_>8/W@6ruk1Xyڍ 8peƅ?zR_/G*>G܉"-Eé~Ikk>VRs?F-wpN!#qc^Us E4 吿`>g0kܿ5+܅S{^ίڶR<Ѳ'>/5ۺ0y>T9!i^ɗ{ccR-8ю1kՂO`/2TK}itelq_u(816yʿ>?&Cwn›pZ|C`/<|7Lܼ|>}_YW>.(q}{6w>Go}L=iwn<㷺uۑno;5;N/Nk0^7tC>qroeq͎dyrF?E#W\9 RZs\_O^اWm fΌcnyg`^7wyfM>Vy$|䏇8Ȏ{8sk&F!Oifůmn[!@: XvI~ c,q@q4 ʎ#d\}yj㫦d28{e>i`s՚Q/wIghR#\~8iLᏋ:0kxI Sc= >.qQoq ;{;;^TRxdtxm~?B<:Uy=E?3WǮScYv` X"@^o˫d7¹my'Bv'|MD} [^_纠Z{N.C%M@O{^O4x:;׌C{>)-}^D(򄳿۫vO_VtK&%;娶a>o&^-gerۆ'dl?jW#2ؗSA$_SO!%4n*/Ω Os¯vэL0Kveg,[n9vl qd(-ݐ+{1Oizz*cPvK.QЮ`#h5an댸vj:Cv6Ѳ۾۞Ty}Wm .>6ש[Uv-rX(/|TunvEmmfq 2?Fb~mͼ7>*y{5+sM c=mZ$\"ov8ki++Ȫ\-Xn)Ω*T'S8d~|輐G2y] O][h\^MC;e^3^k(}%+*7 k'[^׬N̼*{!ʷHi8tJ\Rx+faѝƾ+ȧہ}C@Ȑ>͸ӂpsߵE懶ߝÉhDFTn|ew0_xӓq;z,AI]z:sr 2nf7 =s~26G\AeQ\+}d?>vBk&-I47MsOs`5G5ѕknF+`?&bO5 ~Aꠟ}n8M Ԭ~c=hV}n~g^O+O,tM3M}i{o6a&OOs $lH٭uYML܃ڙSZO7kQ3EO'4Ṡ=yjO蜵At}qb:CuL?_]2ӏzw8Zw:nC܉GݣΟUw^[ipj/ghUEgDS{E|30h Q{L谐mԮZ0[b W'.Fn=:PywgfF^>~z ~]~g1M;.wF~guUь=F!z*eX ǾϩbxoU\V 0-OUk.1[R,<ʸaD9+yp>J>i,*;ld5a6QU mv/0)<@!Oɞ?q-o*nhwv5oV6Sh,* ?)Q^k4D!zgBWw#MqL( ř 8I&Q =x)N}FS(96`S ~OMJ8"L=~::Σ~|ɽq'!{=,x5EK )b&NBAj|%u0U5GŚ[`sb)_}GEdo ^}N'\ _D~n7zu>‡X;%lt1h1 w\&s"s~K֣k݀ppW_鞳8ESE=~;Nl{"X7`}&~}S*OH{mK-Av=5n޽6W@:%KgA}.(~fn!]9mJ?4dP4}2'x|xs?0S5_m]n%aT_&;g2zwFdMvy@ oc!֦ wˡ2HW~=osE){mᗼcϴe`?{C wþ D.]\{~dӄI6bӮ(#Vaw7hiŜ[j%KMYˍx{jOqJ?c8"Dv8ŀhާ2-d[ ,+S.'g{bZWu8O,k;Y>f!+%K}Ph."%Y EXfW d'kEEgָ?*ey>Bw<̋3B"_fL`̿27϶+[蟍߻){1Ѿ="=1NtcCߦk'~"g;#kh"ӎwCg)i&S njAǣWƟQY%ve|j@\?!_6%ڔՔ&e6 RO?6 O)M)$+?W*{ɗhw~!h|~3g=I;O(Oq[sPt<^eQ~v} Y >C{f_De9==jw@hpۛK8͂>۸s%k]8H`u19$,u\JA.We'·vRNcȎq;(t>G\M?VG]HB*ѼJf':xh5pmk^"FFCC8/aeON_SF\=*_CʞũޓΣW{BXd9Kp4[ w!F1hCr'4ij~Χ-ʅë/gn#g+5Cq"A UT;og,l>[vL%۷+5}Fb2#rq跷" 3oxhz뽢6r7򟽙pU*w\^˓_띃u{ ؽf=h:?4+F}Gp"Q_55BoX¾yj%^Dy/96wQGR2uim~ v"Dm9]qJޅS馒-d3 $Q/kG d>0JCRK˨"?*=e Bs*\Xۋ1*y7;T~8_F%]S%y*;*VT`~C,_WG~]egVYpn+S MUu&Y>QUI^U ̾^d81h[_X%O8u}pC壋x*OZ2tV N aR ~=RyZp]ux[}K[ކާly'ehmVp.hJ~m._av'q-m_tjW 3)[N"4e IP90)[9P6o|*GV6?_3 Gi#~ t5hW*4uY_~cG2Nq^dN/<^s00n3)bX#ϰbWR )b%"u*pb 轊}0<㠯('(:Ml? B<֗Ks/R2ב?4|Yo#/ayi'& dyma]_c 7q%P6 tH^ԭ2_d"2HE;HN%4KRߟd;K=G+[~Źs>1✟s Ję3>_fs P!~?6p_FbWv^r+b$hMk#tg{p:/jp]:P<x1b3E_%:/Wg\FZs|l&/[#Q[߁mgQPϢ_Qh_Oxy7$۝x&BkD FW tG7DhL&w|8c Cp^zEAgJ:q"s#ԑTD˱j06ϱGvz>i~@:{{yem[6kDc 巆x;&Estsu7aTnZ~\~Vzkְǘj Z}ʇDzB;uлLzb3w:QX*Nj ,r} ; ^#q>I9@Nۑ# H@lXa&x3{AyFУ3J1gew'3A+џ~Vg+7c&}+>BF5םh?DkCd/_^)OӒ>G<]Q>fiYM<ꇴ?woAuvZz'zn{ص~Gbur %!е8~2 x z3mþU[7Cpa wu⺢|KFMN5v1^)M,8Ti|^uiR{U?9Zm@9խQh%/qU W$RS&eq|lxb{C(OqިIi&Kb$|{vYhcِ yVy4OFO?W܎iTc}|^o+v׎~nufu:k`ީ<J(\ǐXoj~c{` l3o546o98C>)'ݎ2SS4n{+~x/`3:Ftˋo u3`-`;!_L bQd@Zigy7~Gbyܚߥ-J1Ra}L^?a|V)"BTx#gx(^Op#|H}=٣|A~s+`^|Ȃ0t哆b/!{`g cNK*TNJ{<\tTO,/}O=R?=oT:m^QV${롐(8cPk%C3Ghs, q[C۶HsqqROjL }sîIܧ 4tV_ ']_ ]i/_|= Zއ_C]Ccy<7]D7gk췒ɳ8^S$9:Ƿ|՘IU >I>w)R 8^:4[֜B;2˔s* 8{{?6+]g1/;=Y~iUmK}ڊv1Yd0t"Kdr4i:zPR \ S a96=ϭ$UN"^3<#W]_NaˆPBg_Zc\cF~52a~s}|߫sY>i^)2 }wЧ>: ԓX?WhS}r<]\F܎g~'OTl'ʛcv w߀s7/.8}_1} ߁=}zXH?2Vb?ݯU;Rxx凛!'_*Y&/.3~qߡ>MGN-]\p*FYtCׅMWq\$t~ݤ(g9o{y}? sDOs8r\<:{_B |xo^ Ggw:g7IB8RO~#:v޶m ;g|opmG.w&{=qS3~YK3>lJyEO\>3pf%/vr5z 7k뱨wGH[Xs#}\8^?$X߉4n<t,?_B%L<؅U74=?v.ˏ{RMOHI xƫ3s|c>>߸Qy<o/1x .ĢWN8 o[& \g ?Sz-s<͏)С}kQ}&d#~L9.q1>(&~s-SJ9"s] ƜS|r=K*G7¾0(uyN#Mè~aHB9ʬ)} ez.1-ڱ|na(n>,gfxo+M.b$J`^z Ieygתр]FygP1,ϼ}uAT8} p襊|g8#~8Q" ω"i)#O"W0>uՐˊ2hZPQ߅x ũ~ud BXi %~5~W0%}I!w+,I cm7ʥwmq|xæE=?/No#˓Nxޏ}`ܧE>xhΧ(/k\3gys3qp>t _M Z”cdvˊxa+xb~\ǀ'*G=&!{/e鮻h-<3#q UuBq΃s#ׇTޒ>Gix_g|^X\9fyan8~{TDܪ""ݘ(r{uuB[^ȇ!mވ{w^aڝEv-toC#Ε7y<4??(1x.T󩴵O0oO[{y,ӂ"mY50{Y/AK_g|)d;϶-Y?dʳ>^᯵y3&p+ x7oAm:Y!ORVX  @^vf*9 |WʟWcSB?6W4Gܣޱ: 9(R a!^mjLfŦ#Ic#1ONĹ˺[p898 y x_c|M؄||o$<9:հ>0[g2۶b+#z78u|kZQ,jwȰ}دatDR&)} !/v2~\F{O2;7 Fhhվf}|ڼJY8y!NY:vկ@fy` (Zc_\-=pC?'n~f]TYva8mr<g״$Q׬[|^SǔTh>3xkuD1׶{y9s)} gQ3~NN{oE}moÀ|o7%85=NSY*? &Ook=uR~πާޱ:ͤ_'A#⸔_$x P~/>U7E^leGrd E/=ԋ=[UחN_c Q~ނsΕ~Q}T~܎rcS?[;[r>%-Y^2}?>XM}92 ⳕ U%\ \?q<&|O~,45Aޭm*r̋u+ EC(k~rrE0*M"_,=)x/5Ok ;z]EtO'>V@>]^.xÁ?D?~'g(UL10+|a𵞀|ncI ;(& ,r$}Eq>_ O@vڱ˫JC 47Dq]7I@ ǛU}\(&zRkc3Nn X7S0oem7^[gc[%/-=~&a~)?6OB>A;'&+ߧ{>{'?m|#SߞcQ' o^,3=j==,Cu~cyA3=_|Uhz w߉huY>Ѿȭ1ߖ[׉F yĿߐ)[>ޗʷ %gQ4nM`>(/<?=t9轒c?%ɘS)[Z7aįK>ߕ!R):ɧU^\@OcKNm'S;;W*}Sx)0f D*}͒ԧ{%K,:EAr ɫȫ$9y;DxF!\;$9lCXR<+89 '__ko '~Y>\ ǃ)O|W3_-C|xnWa!2x+T?܅=ҡ=շ#l~m>V>teu_'L,߂C~o|PbnzPl7=~2!c_sn!hKhKXms7V5ID\q"Ei²1t nJJ@ \l+.&NA~]< nS}G _CA~݁.W6Y~՝= j^>[-*u z/9|amFvxܓ[Za<=Gl wGO`{,un}{pi5OqdG8WިNx6QK$Gf1gbqo;8۬CgY뎣\q?dչ)7ά:^xgqAvSm0ΪS]jAsU!Y5aUr}5|dhYr_N|O n({߅#qUUY;dViLgQo9_x׳zoϴlɿ !$"2YB^LىTe2-J`Yu,[ˬr+/S ](~d ڝ<u<RX$QTKT;Ŀ^lL[ C^PtG"nAtj?{c?UڵCX5~9BJq量(?nD݃m EES v~B-Wq/` KYQ?{?q"u8.k<$Xun'Cfjun\Bֹ:@ys zzt-Yaq+aSu]F&Z n-#dC@^Č)5!OkƾGPmd/zO?^doN,cDm>ﱌ+FS~2֞G>l\ )3ў og9!cpkhoMꄸ'mRڤϡuUR[{[uSyI@3_jo[{c.ڛ79ެڋ)pbaa?MJ@6O8I]@gt_5z z{GıqɕOb"^"Kf.&Դ*ZpIt(i<}'?VGY|AC=1_OQc|2A~}ջ*]~ * tՔ?bi8叡8C<ֿo[ԡWֳʯwq <˛מԮZ ~5;^c r8'Qnu b}j@nFezU=g-;u-aYqr5'LGn)OoFUobCǼߙ6ϧ^jc?|8O=]Xnﶳ"u,]ȺMф"ܣ3ٍ6mH>-Lo\d]^NyXʺ?1(B!keWOL]Huۢf?ZmwMvP KsTaz17|Al[}&?KʿQ[ 0r/kki)Go_3I}|ҏG̓v`!HqԷ#c:ŭJQKoF$;sO{Fإ8a'o/Yύ"P׿i =VXi {CIo<O,тvCx3+BF!ەLX]3R'mBKBx/_xV`P||[_˾a߿xNhI}^̴W08_k އio|`ҲҖt{"m`-|@iO o]8w*5-aƙ VFyׯ~޿0.]{`>^]2M:?x-z0y ցps?y1Y2^A<B^{>.kqGβlTr c9>Y9.1~g?x.9L yYdޭkVG*, ;0gcYV;U Rn_оv)dY%}qvVqOYf2Fy ,To+MD9? sAxmyy!o'wx7๏<L~|0pZt>{G/0 Ggl/ ⑭Cמێx)uQ~I|?Fyf!~ybc3;Mx,<23~/iV GF5xy)؇U ⭅xOKʯ,O' ǴA#/|k6k#ߓ):֩%hʆ:ϕ[l [Om--ym_8}k[Pm8>S8u^ͨL;~yA9>c\_3!4>戛xEbhO6yBL?O = ϔZy/rGE`Z95aOVv{En!kJ@؊x/O EWa80ʣ~Ԅz~Ga[Cj gyKo!:Wȓo /ϡj]!au9[<`_x72_w2b5'lT G3G7y16OuB|RRl-l.1} yg٤OZ %E?,Oew5G3\)>vV?9tK㘇*V-~{gN.+VX=L~V|I<y^+W'mߊȻX)ꗷF.E`8+UG'ϗo#c<1 8 h/h\(Ѥ6h,&>=NG*7>qL82G`P45lߟ觑v\ĝ+%BRu; @?u~VFQ|>/\us+/#Amvj ӟ_,mۃ71)_|B<0u|qPG(| _DC1!#<Ì|Y?xX,Ux^SP>y_iؓ@/IM8vɾ@X6Kr!~EՕ1^q貥KOv4Xa>Oӫ /?Qȓ BTw@>?,w y\86[~,j1`&<| -ta,~QnKn3{CAބg)odRrUp+Ǻs$u݋շ4w"umA~*u#Twz't.I["SyJ[|ByL7ܐ/QrI,|&\ыp#p+"Hng=,A81m~T;}// Dvyo$I;6%5%#yX;|lE$is|x%(qzuiſ;5!3&: d%=]a%̿$DT zIZBd뷲l|qȳPhīO|nd0~́ßo;>FY/[W,%dʑ/7_*"i &:dzUY>UG} G]x127ʧv=yuVi[3Wυ/7g> E>*>2o`>?::La޷f> WMOǧgqB/S;Np%50fHEuvx_fq0~טٯ(?[jiY~V}_q|MqpMўg+|(5 o}k vR;8ztݒvyG x^8N5 qM<˯j!N[x~YW]o~!ϯ9߯\_/5g `W+ץ9~϶!%šuxi FTL`O]Mw5gVoj8ʩ"4kTSg9 iNV<~ ƾoMxV_>cb㑝66#WdMz֘"_Z}%*9- \<(g hqE?jܷ ?C6nM8Dciz?BG>վ րWKu+pГirôSe 1_ N9L|_̖ķf6s2$,EXϪJ5*5ePcpJ?pJw, '1h0_$ ߫{,6Wb~Zr'g7}\1{^xwrdA]~=uu5<^G7¯fw^+|uG!Rիaep.Y{G~4Ul vExOruKsc>|]K)諾&# +%H/'}wKT^|6H /'?Ffx+/{ByU׋Dy}EžϿ<2jR>(nTdwH~-6RyEl?"|BLo䓡hy!>22<22r/c2rl{jqP~X7)_>NgK*Ú[~qÂ{/PBCjO |J` "c4}J&S:]"oK9BHS\}}sq W_Z`BHmA}@?>0m&1yx_z~|}ʨgyzyMmn\ MΝTlNo6($5l@@MulZ:Sy@Y//W|~_Qf98wӀgy~3B~I~dGH7`wP;0%٭fZQ>f a| vA~YX6b?|@ PX݀ V]о;rAcp_nP+ a2~E q|@Z%#\cyS |.𻜾7G8~}7Qy&CRym%x+P..1Gcw%ro.SBNaL`u 8}GH3?iSg%X=BH8j|"k"/֣YZ,S޲< >~ic tSPy?>7;zIW Dt/-V:~_SX_Hw.+]&ǺZ,9/R GQek'S"T>d}JJucG@Vǰ@ i;ñN45^? vD ρn[ \ QaL)̍`¦S-.qK\:AU^R\ɍ|చyCoYa[)K}W-aizxb^$wLFx|Q)֭CT{w>xUO"+{" k ]`"%r;g+x҄ÚwN; 7G6ppFi'{zm;7Pyɑ(?q-0KNW90Piڂ'O}iqk6^@}ܤd@=_yL2>L2+?,yy_hs[2Y`#;ɳJNW('yލ+KOVWqjVN_i<ysfSh]SB!+^̑,!6E9?!'c h:up.D-'[2eCjWW1(?VxJMp }im~eR*pό<=j$9 y9zaVn׶G>$8K"o\P]"yY+`7y:kW5٨" Ps}q<~сkbG w'3nOMeZدelOy{2࿢xFN\1gwx+f%żB1\LM)fUރTD3EX)f>GmT̼VO,@>b>Bcw~f$Wy"`x}c.';K: 3\Wϱ\~Q‡; ]hvFn?@8tk~@a݈V$^&܋C1;ø(v1 bȯ+cuV9R;ocVӐ2ݴ!xLAG8Ϸ.7/>|a,7O+v?K[ɾ~OmK J~5X*oOuRzPOt,8{j##]jYӇ6ju5ޘ>`H5:?!t~ڕA&դNz6 J[~~id﫵gtR"OV?QuV⩼.PG->TGDzӏD4|$mH5 %Qu#W$bٕ/"b7r0oɷ!^Tۀ}KzW{WdߣkW?(^u0VqC\yu/`Auˣ|p A _ֆ\HsX=u1U Əb/~l1aYA2V'3_eXj6lVz<Y{D\sxMqSP^;]ߪ,~_q՚b2 W*b ЕĖ'PyLڡ

A>]eɛsk$fjpmdMz6 LInL~&:{ck`JxL^Ce٨*>'_G﹔[˭>AjHB}}̪׺'@:T!Ap,tayjRp?<ФJ_UĿy\~bbsb/z0Y'9u5*;+9kv`uKpO|7_|Z{ZBUO (K?hNZ7tnF#,e-;誃>j.T\Rgs(܈<\^);L齺g+sAL^V^c]%IdxVYE;cipjZ&Ztb}x4| \gs#uSݺ} 5-]Q \Lw $e;)e l77+%ۯ 3-}aC{A`7mh7xK11hsu *+WAб͂`]ua0W =. Uz4c)Sςmkec(Cw- Zl%"?9N?"+KÎv zrVF*s]р&l~?+WGDEKCoI +$Vrn.I!tϟ@(j@,Ń(~k¨ ;&i؈,AwA91+uj:\XޥBpza &WE2zaQwd  :6EkJD,X՘u茑ڳ @4gt$$qza'FjFoh@}!6G_ AתXuդnR"4/ koߗhc?WUUpq l­'=ȏYC4FLZe/NP_\y}i<F5w1ҫö3!KhGKmս[IG͌C+H-p w fES 054k̜/,k? -}ۇ˙@yDKC~ԍS%NIC˟\U*cT,'v_ 1-}@Ǡ[`[\;SwwiiŇp,U9r#Asڌ.w3 7yVJ Qz-;eQ/9Ԫg9:;P t·*Q6}0b=*׈Ye~1^8--pu=v_f߲ҍ7ܙ9(9ɓi{8]wja96GLdw 섬o?i_۴ⓓ!ȏb\BX CMZV^^1X7&+ p?`-Z\Nّksdt07wI>"꽼-I"s\ }rOR/>w~{tfFrtC'W_x}<7 8Bj!F˧{Wγ - }`v(8`sug` $Nc=,}JTZy]<{Wh9Yþf[Q[79B~D? %,P,'vrL @-Y,-뉗o}TwT J 6/* c.krwi-ބ]\j(x.TtdR^pAoUxpme~:;;"Rb * r?M=2lވÉ;8WҮ=BfWh:ltSߧHg綫J.7v( ;~OweMO] ^ MeAsf4W Ѧ+ʄfl:8px#! lG%ؑaή^S"v79;Gv#d'jwYjs(,$}Z Z_Wo+VMhj]50<ѣPTv&eIfв~wh?U?g1[.){ړX)+qU BF׽(`TŜi'18H}ӂ KR{cIpJuئ|@:@.D0!x4")B}daXr; 9}zA:a'.<<}Z1lIHqw1a32%g O[&#SI韻RjhR-;!j ^,U X8wȻFz䠮}38Dw̩GGqC_P_Z.Tmk;Ls%H") 8T,3.Y9?0{^F[m7B>O{aP)Q1}XnuxF"skfRJ;MCDH6Y[֓%;-L]Fw 1B3Qz:W.' n+ ~xGphM,(\3]vϖJ|!t|䶍Hf15{X {\ =f;kmH5P!1{謎zp}mnr?ؿ)YNZt;m-|wCVtuZQmZX>y0z,B^()y^Ѹ%1l.^>}'EEwg=w5z!^bXcxcagp٠P(5> ,܄Kty4k(6 Q;bŁx ة=rS[u`RYF:MW}οS v|;0X?CXnm巰UCݵfh}?s^M<3KsO=3h/m _z&ۏ$Ȃى7px-׃µOR/cY=i yW=N|XTv s{bn426ȹ 'VWI8H8/juͺ3Ą󷃗Pf#`G7透W ߟk ֥Ykj+ˈh̤)Pnts`6#y@, MTsd ^ [V.WZ:#}:5tv9l6DvGtNLOFMTE13vxV*/+ xz#Sq-?pcཟWZWap^` VnvK:. '`F~#<'KPorAbg@gr:z3R//ŤHopM%HfKt`B#HA-mm=Nw} Wsf;>I˃/fi5 v_. ayۆؙiB{9M@ϥ 1{Ď^ D$]x) ֍[^_gg'$Džs ĭP5i5yc9\'Hj`ah d}QDt6` fnW4ޢⱗ)=W^su51\q'{òH#%m9?P޲)h,md-4s8ÊmGH׌<^(G5$~s2//̀Cʎ"@֚Au32ຝT_(t-BkXt@`.'hLw>;SIs"Sr;Cz3^Zuv?b&~wuh=Uc":^@ǴHwzǫ.Vsʐ`4>2f7 vN|̣ӥr|Yb恞-sb #\5_ځ}?˼PL}+"Gb$«vo1kuπ ;EHEEpFEkGHq9Vk?ҵ/a>QشE>ELG<l/C/ׅ`^r!8l=]z΃Eo髫`Z2~sDd}L=&~yaiB݇FHWonGi4k3u~X%)BR\9$y1 'jgt3ӕ. } ]s8: z8%ѧ7.rh\+kK< wtXO1rb/8uQ<AsQ|tx.s  +4em ,Q|߱rr/#,L0h˄@7Ʋپ;^|O+g+=Qt+c 5j轹+Kh_* 4 6-9$㫊/^-%Y s Ȃ|-3v \(U-OR>ʱ[ !%Sk/-Tl}tMWOeTDb;d0aST-g&HJ/MظX8MsSTp B: ZYÝ:q06n XGS4scn=Eeh?U~8_35-~ݎ6cVzǰ.A 0D:9-.Y$O,&sWupU'^NIIV>$4 2v_6Jݠ AIm-⦯QWj[~Nfc>Zr'h2(a[23{xZrr٫5Ӄk"ZxXΣŕGW徣) I5YXDVdR5:&`wg;=}^Ֆ[iE[aQbhx=lZ L.2-LSsȎOюgh06dYF3,IuI'*9޼BD~~ z wf)կ;cO(F;i/G?0ԡ%/ȲU| <+l^mn;f=czc"-E|{Pu=m[}zؙwszfc>[!ȧ6̑E*?|~䤻wD}Eڦ[|Z7M)8IƯZ~w)07c90h%$GYLZT5Rwb ,ܱeShM&Tv50pYg.GӑX% h"SQHAyu茼"Գ"GtQoO nJ˫g 6gu.;fU 2ߢãZƣ#7}GP`AN/9@&[ϧn+5BrK}r2'̐^| D qtz :! uEM܁`dze>a6P6y~_  JjkmyнT1 J^Y@E6P)}S .d/rHK3t!| 70?#oѶCi_Ѭ(b/b Z27l: [mc@!ɇ)3Y5^Zv]/xwO6}v!R<繆m|$9Hܪ9},k${S0j4S#5:ո<V'sn3xj!5bYcDAW@U)O<AGX+\qCgx~OH3|<AKcz>*{wcx EӢ-4'}/Aן},;O3It~q RZluqAF)h_$k ֎@@{ن /<^ %KŀŝBӷfLoZ>-Ins,Ͼ•R~Y 7wՂ#Qoonnv7`pk7be79J,}5@}mX6PNh'UxjE}}]te8K2y_r<^FO#1`3.LW_\C+#sX;f>oe3U`ía K%;jGYhp"D%E7|{(GYREE4P&eśPfڌ]$ @kk_O+9AdPW3RnW =msB2m|5,7FX]1 Mz]}󗅻Ww3 Fq0 ݭ㺵h))uJmDg*!w}5kKw xBsThqR$;)c0Ը]$N)CrF >fUv9 .vg`רI\S{|fs5 kleP{%\Nmmb0&ww(s]CGSbݣN1 t>W"釷¶{m5W?3d&T?sܗl5e ]p)uXo'ׂ+Dj0U;*/zM@0WLg~Av*6^@;nńf!/XcexZ^΃"yH<^rRļ8eOo£Oq`)8o yV=`NK5$QLg(UO')k;P@/Fݨ[h@YƁss~ eC-N;s;-V. GUР`}DOc^eHS{ah?]O2k %+!p _hq;YuF=|O E䦩<&0[@᷆2[N_IqU'ͫZ^&yaqv"TR7\#ϋPKR˅zi|{ӌxGN{?"~b6,Wv-hbmn$ =Y6b"w(ZL;jya]u0JV,- )6ؙ;g\C5Z <^gV%>>̯>˿i~|kŸ;_xRh˼3;%u$Xdn \ .v3Aalh~IR;;>N>W[A9`s5e?=VUKզcbI!k7J㲛:UБ]UtWA`?Wo쩟]>MޖW95驂C(ʿ u毋_gǶ٫hn7!ʀ9 yĺMsq??nupUQɷ|-hYw"mEe`.uhM LP GEr޸"RCO]K}dls *gO9mG}2T/:Aգa.i`FRr0D0ӃBczy 0oT Tr#: Lc}]Mv++l1Co%=re9k2M} X }°V0l<},B9%EA)&+zZJ`"X.! cqTYj hDѥT?Vxh0ܳ)˔\SB@bRQ{D|WH-PB|:{ Ƭp &9fWZ՛(+3G>T.p Ì#Pqwph#"6tzbrTh Gfoͣr} B!5ŷLkk ζVc, >tOb܁pnY^jzΒAonu+@nO2 n'Ƕ\; h >}[i`֐y1i+܄,9֫WM1|f14 8{{.|y+ [^)0(U]uX]}iCO1坽([mwwvɂG#{|IlQ,:"3m@hۻg sM`KAdLM#.Qwnhl7F /3iM#vU J zWn'3< ;$v۵5W,E^x7^I:!;̗66 uN=כ[{S'?}~B?N*\{!R ?6tqwe+p'm⁻C!='k$+X> Kٝ"ckgu2xY]:Xm h%͜פklZ-ulPNK9빗23m%ns`OOU2*|ν\痾)\#ħ,o 孺oA/% D̍7Y?MOZSSf]!Xt5IF?lDH΍AHWiaV!Vp\>akkP %['3-I\9dq(aMwrըwW: `|i4 !O5&F OgՊ`߹Dq_!fuh62$ $+fUn]wΖ&n]ܣfԁ.<}I}6X;  WeU^¼a7l»_@z.}`mקߠzmyPw\<ĹR7w!5.ci x2* j9^cz!qnX^>`_4._v?nTlpt8Zh[R50U}C vWro$SԘl9Odށsԍh' }?Rfy4\a{)kS"zssv o윈w~9-ҟ8P;Rfnāfw"l<˧Yѹs 㘑OSV+aSP+Ô:>m">R+EK!|!>:JĄ!0(?]kB^6IG_| S%7%+#QyvJ޶=P* =*Д}M>f:6TKSI6(?v̗mB: -s^g=QpQ%Ai:ITj>\N b'(ѷQ"^u_Vl@p7= W.=;i59 2Mޔ~2v`E:X@`}1kWYNbGt_Cmo g>  3x՘ŴZoOfxpkި'K`p?2f$W%ΆdI˕9:7  $^>3\&n0daˈϮPgOA˩@ ZԷ zL|bԱǹ}]uw@*ͺu=+ΏlO|S6mFi\h1,yΣAXC?$79csz8._?t@4|[x5 {2Yk9<OGVX+ I!B9=̧f;Z̧x}Qcwsҳ xb[aUzII~/Q?T@}p 3pebθJάO(Ee `aYqS*'jF}eZhNOQ 2xY:ĠE&{ALؼu' x5VW9 7cƜvoߜߘF* 8X|+./u hyKYy`:q,$Ţ@.|6Yp>{P3[.:RzeC}\(g2g|_77_wG16p0?fBsȭs'=ro SC;w5xRTk.Cnvx-/#|| MmNIkOzD&TKDSzdr8w>Xߘi; .b{ Y@gkj4g}ܜ%NJoE Z~%>_{¼r2͊6*햋 N CklG@!Zbahktd2y6~mEkgk`R ^zn9| UAm`:ک~k-!r.Hogo7hl? MA%Qp{00lTiwBPa)"YaFqvYy,Q;>!@ 0ٮ? {R+Ll:0RCZ? &A,i)w:5VwO0Ct o*NkGݕU;c =$*!7[bZ58mx L \2o|.YÒ?Q_Wme]?zg~|&_[%K<@GE>3 :wQ[Vג>me0P/4=-UtaO5;pHx:[֙uq '6gy.`Mv. &%-σi{ B!󝟗s40|x;;C $wOǵE#)c~Fw`e^~^hP6' <5ECEؓGE8ks#{7cy0NP+&շ'p""M! Ƚ?/債{@XFS~=|<ܯgP~#55NE)\T 7Ʋo -_ťS8 S}@r4RG,dwyؙ[2!0wheplo_f X[Z6±NrGlH@%L >ZC"z\h~nDWwRh>r|'?Mj?jpUwnɧarחْW|k8E&nxđwd?i9?hlg'h6F.Ho 9]/prmx:iR r^@޵`y%SQ|vo{Ւp&];iN)ݵ;;,_<]훈:`[ӧ4k2/YC_u@/)qLk/vs^xe"&mll3*[e4:3Eo a%ꐞ#X}jS-7ɗ A m>0!kLjS/eOǡ|d6̞!#S ƅ/rDUs;1Tx v3UiqA^SG+@4_aτ ;׬?ɠ} x xOzVRMR#N_{dI ]sߤyx*0ܵe[q[T_6AR;6cITN11' H3}R<#};6ˊHؚ~u]h@%=B@͍5xh"P6 l VD; _U!&>;*ܷD%7n{0%Dgu$|ܤټ_T8Aa$l ?SD xh A^́1ޜQ9vMUm/4/f=|$]o "h=`l%bT_hQge'!8?n7r3wA˚#?FJ\m@6呦 -y{$r+thz o_!ѸӺOf@@6 x/Uz<>8yю/,m82 f>HuYϓw qU)z/l2,p!K؁ac_?G<7+.hź!%dLGnEG tuy]a+tkF jA[p2=NDX(NHS׈}{Mg+W΂k>|Kk=N)Lb[x@ s=s܄Y"YA-FI*n^5JݩB(H&\ޏ.{΂#ãZ3kԹ>>!ݻ_s߈!psHDc'誀 ?]>8m;€Wkx> Z2JYO)ۛ*̭'06_^'RAFj^~qVYj~ߦ\6e᧖hUzefh uecPӖ."}&|pwt=t A+9%XKXj9|P8S ͂:viPҧQV8Ņ<{*l~90R7s,CUv!(|8Ϋ]$pѡ&݇GNS`p΍04e\_޷ CG@oTܾ`zlRS+YgOU b [*GʳZv]'eCKN{Dqxc)b^ q FSb 1fyOkF]:jN< {͢uA $:4`hK' ٥1oC^ F,\{sν?ݥ7ܴ@tD0>k2me_ )v۶ Lu\ Uo`j#{Eo˟VYp9%UHߣp@ZEwC'液Z@y{k]u.Jr*ݵ^u"gxlNP j/ =`ճq_:*TV6v@Nu& ere⓫" G|nвfIt뒾ρFlbqx5mNAsEqk+$`gsUpDҭ]Xu Q tӋY`jz$<@朘NZ=.FZF)\1*@) fP/҅{P7{Sw_à/H}uvEE&=kGu\UyO'189}ҷ>~|<f}@󔹃O%Ǿb嗨\OF׃3 pw/O}nAw^--~=d^_PYiFYr<,ҽ,Vu2{t䍟䁸aۃ)E4~gKҌ&n?XS.tfͪ\eB"*hް)>]gӂtC4M< ?Ҩrv<wJwU?dUօ^43>fg΅ș8B el gwDkbH:aynڳq1z{u2D!ZFj~;8/ҿ\u܈,0 WK/1~oI# \NF؆ȁעhdל$rG^ѐU_ S݅0@>P4JR? tӊ0Ϩ?rb4n>|"UTK 0caPE*%4xA A>'aln46XDg\hbxzH;ӿI f΋ #VKH;՘56݉3}g[ |ŹH?~2Brϒ񇨙۶?h7j6D]z]3Є#Kiz/]GQxsb'Ln M}.ArMt4R&\.FgB͐gNQ5C8HEVqHNOΕ A8 }И!}4nϒxWY АR:QIh%,8}/ l]E¿;5Ѩ„;iË3;l"/[\+Vh7fmnYۅgS3zHbT=#{BrUrÝ$gr M6'/ڃg'uu;/$#ckC;cH$k?bE4>N@^_Hr?FFdV"-:KŋF yO˞=bP!kPёDh؂HK?jClrzRQ. lF;WZovwOb}A{$_I‚&{hum4dIOiv ?2F6WՌآ[WT%HmXoz=fR9MIE ̣#vHR|{&QUfO[#1|r5@S=|'~۠}^h*BwfN"6nAyKs԰P>}c!^_ cyH.WX:r?h\"ڄQ?7#LW6 wgmmB2E5@ 3؏5b*\9//K\GcnK7Ǐ g̥ԍj/"5u޼EM@qz ac״Z#jNz"m=9ԫ/r}0`pYcv80wZ 48yh[o'>@ݗӮšٓ_w!?j4d4|6I§MIHһP4Cq1Hh3W&TahtU4vǦd|os IAY"$]jjB~.RH*1CMVCN $}g򢎑'Q!tə+,htji-ZAWsDdȳxG77ʶ[&E߸"PHhRh'&UH6)E{Ů}P/ps ;"RCˍ|ChSe3#B2כqΌtG?c$ѐ\迃^ l$k|;x,1n]0a^bs+9e!=&@ɦyvŖ!qioJ/7YMQA[ŵ0C[Ž_hՊ x2pjMF[l: ){(aCP͌}L}P}p׷NN DN=ބrm. +R)EW|}~z#-愺5b2VCx??#6v,#ݡ_]Ìod Rv^`p#/ioH),3fR=)g">ʙfh.p-1'=")[bf!u]x!ծ 41bCEMk!UTK] rMGxz*v!~ L8M ~-;ȁ+ !2m(VHlvOAꘈZ!uIL o?R}xeJdFJfgH wpFw6+mـ$KN՘24O4C|4^t|hep$ݓBj GɟB=ۡۻmh}0nO:#a=*Mcj̑h4DGBZG}¼eg[4q?g'v:>fq7A`"RIi{%73jÑǥ 1<c2{g!AM_HH)[.F Br~ ,ld GDy/#5$+/cBJu6s/ jȗwGvLA?3re Îf?26 ?^F8v2TOW&{fHw$"y԰gwz S1λbD R3<=ckއP]ZT j4 W6jg}U"UϵԾ??Fu@7n)[ J3"՟|kUB.hx;n7q$lj 3BBݽWk|xjpV uzIqŸuan}b< 8P(/iRMIdc:ƨ+闣=%7V(&-3V銛1hw!kV gQA>4,wsEs߉P~"ĜR {F t)ꉿwCC/B Y1 C9 mg {<;YgT5"!Q=M)ϖmEZ|o}閻nԓEdv] AhWp I>։sh|X $kr?gq^Ofu6<})UĞXr6p}^B{‘~Kxqah:Oh4<66F ?y>ABcѤeބoqx;38/8I$ ^|᳦rO'D;EbW7m9]m*xڐtU Ѱ%أ eC[WBm>i_ex[b?c kF߃^0_D8lH]zWC$ɏwS. 8]zQa$}Dq[zpN0wțlH*j9蛄; /dXa6yq![C23o=[?F&^]Z[^IMؚDA;ф !wGgKCZO h\fN@\F+4]8piii+H;f9Vd^d6Ι38f[չ*%lq7dGu]>ξ! nbmaA]>KƎ7>i,F95ə˘낂˽h(L̃H-Ak4|cF7tQOjso !yS]$U4;!\eWE_6>}fooUk\zzԉ+[b(lE=h8T pl_TmVzp*^R$m߀&5 ^Wsp=x ѐ>%Zeیj8{Ml >"fFa߆TSvh~ jC>l*@ÝS<}5yiRsߢHHLx㏩H;  7n:[e7tq"gv<`pP~h^;ܤ :>Y 7-jڵ{',ܹmqOKi>,l]^+Z[$tI%@354~$-|7ɍ3 %.h^D8R>}U^dVe+9@) ޵g~rӿcT.aճD4~>M]M e CC=<5ԉ(Ȣ1˨*9|sj~q:iq>vYHP<=Z~Wl) MsF!m9USӧ-X"(w1h"Y>S4}{6=;q-Q/~#Y]m-#'HDdhllEڈ:4ή${~GTK+DC % bC^@ʼn% Q2G0*ެT Q6v{#'lamOR ?9IֺSGH "\~γH+ש!$3-)W}~!5Y? GFd#zq9HnIzmá> ]l޸/ -^AmOcE+$g-i#d?ϛƱ-d}WGҏQ5YT9CH9rp6G"Iix E]Tgߙ k{b"]TK{gf.qBey%rijővH]Ke{#EAջS9R.#϶%F;gK(s>Cu (H::sSRfAҋC9FnrjjY'M!ָ28TШ2ӥ^0=W4fN x.qǗ,O:,$dTyl˟[I]e94fw >(lkK}S7fjb-;uBÙ&]$~& ]H{'Ss$\ȁ>D֙$UbG*be6~ YU.=ȓyL]i@̽ luM+[uo`E#g^UFPL @ZhI!q1-nuM4}[O2'UPi?_nw?Dƽ`9Rn}iVM+hѨH?{k&{:w#] =KH!T1棝oH0it?aywnQ\N4 lsH?i[ҍ^WA߫ƈtx㤻 RIv14&H( "qLzHu?‰faIY$۽%f鈄I{rSzK\!Kuh7h]wG nvMe:Ov*2닀rh#orNqӟ$4E8nTyvAƼ:(Q+s a /$ḇ&?#ijV[>𭫿-VĞa6icH;h5؎neG"4m^ FZ^ Rh'뭟@#d wjŮ+%83pĐU R۟‚&f3Z}c?O_̄80cYl/hȳzaJ$l#E]zHq;|wRc̯꺫jo:K"~ϮQOiE-3rxGz""Xo~w8#c4F5QULM+ )VH DmHlU+3AhN(YֽHd I)4TTJ!E)$Tdl PTJAR9}{\{~u]|%}}e-B8n[XBam뜙tL; 0߿X }&Pz*?i`HWНp~^Rr#6ͨlwJ+bHt0)߽i[qn'‹ⶭ_EtGPOuksK#!ywo $S69:]1u'oQ&sY^HmO;})WlW_aZ}o9a'uѫ{_=(s  I~/m!VJ~P/ >{> TI֥GO,[SA؏]2ޣ96*q'Cr#u[*$Q .& sܓ scU }Ip*o/}u$nOc2oyut!1v>i%5#+K:VO؜a)D/RLz£CެV@L[!tZo,DWy_f7_qY.]yӗ5oi)) |FܳVS/NjNw)&|-p!H{ӟȮxs:ëK nfW |\0BR=jX-صW4qWMt6J撫KJ1`PѮ&6|e-h_ٵXdg\vKY | )̚\ -6`?oqd9h{.6i"y|Lz| $~I9$A-+s [* yp' '9ҝi!|7e)35oȧj\81R#ԪR5N-[Ԇ^\ihn/vaɞjnYfe)L]&f8unSvV._ nvY}di={.D_fČt|k[!0($:z8/JJzxl /$/fT|Q6_[S>`Zf,X6V`v`a*}rLoP붃iL0ICyuXD/V !e-0~{pjkwAsfH;/ズ~]B>u'8,K6EV;=BXH{Ԏ;, mpU׶ͅH>6ogH5]_5DG*}}gQl^Z̺a֤o'ɼ8>\t`>I16{XI{.DqZxu\P[DNJ=/ W`<]gN}G~NyGVnϏ |E1*su }{%]Bw Ɍ46̑+k[m oRs&=YOx:9M{񈿝y΋d9J/ݒf@#XV{38-N[^_?É_(5Ɨ&:t*ߡC}'ĻnͤJ{8~ I_A.PIB[\j10_QW<@bJ·*?8(}9|zcSH_tblp?'OYwQ1٥L!rAߏ6nvU \ǽĽI~4C<6od]Ck4 k,t %$=t{UXF C }[5ޯf:UT"9u ;ljU!]`Y t#ՓƕBlgOkecFrt?H8>fx:I+~@:apXE?377@lVdi79-,\ n~yv}HY,&nnJ|n=]se.m.8foz?M8ozQ(siBc|6Ci+@~q$Vgo|;ڪ2ycy SvS#τ~'^ˬl6ȺkhB41}r:ZP1ć=gX2ݥsABrkEeyߥARX6T`R[Waw p28)wNC.Z}ȱ!fy,W<67I/}4+&vיfU =$nU0\M]!ĥ4q[2V<vI͸v-5=[w ۷m(Q0MWxC tYYCσdm0PuiuHX`MLWֻga|z4 aLDr?1QdDw :'0x'Plj-I[6Fil&0})=7qrJuO5\q~ٞzEWǮ7{h&muAhF?w.D3-ۻ"* @%UWAփE>֪7LswG`U6w6VAx"XJ0>_|bE-9`\9xSAI+;̧m~>0NNC;`=:9he~{Nzǽ/crМV=!>>W@c R˭s!x;hC`ZpS|fWX "Έ7Y4(bߞ8]_ z )@IeWO~ +[mCZp7Б"o8ZY?@YhIhS., )xw\J"AY\g|( ʺ.װhWY 6fƌG1ϓt- l+t\)HPxPr87p3o'0m ۹0H-Yf} .^kN  Ͷ[\E^΄/+"4_R;n)x^$9XZj$Í4$9>.k,pv:C$&[g$#U8=x~dZouT)LՂ{$'H@Z"Dgi{k^0b>O=~чaռ(PPֲiD3UrW@bв!"Oȅh\Y*Hxr1+=p{&C+@;ð('YLއ>*yVG;!*jw<v8k~o-*׷jVy4ӯ 0?Bron>Syy ʜIutFNͼAkQ2LI 9+] ^л?@/2zt&dLPK'e:*kPܸ;5Cjod5. IU Ͱvm^5N 褷X:Uq0ԗ*Q*؆ ӕuI>s\78@LgW [/`dn=KA 1;xxa,&zZ{3Ɲv"ԉg>7$?2F 2.+Q"q6WGQ`1QpzVV;|6+j,M#fʶ_sXf.G%wQW"'1p~gfGϙM[rHOrL,cū k 瞐'b#pkD)r:!Y˰W>P߆~ 6ryUiĈ~$&( %EZCHϬKηĠ㶍=wcq ~H$,0?DܵkU lzX ڪӐ\>%]} &&AOP"O;E u a|FOrŦ N1V^~tSO_TdS׈7wiU"=pD);xY!/w̰S*Wւä 77neWpN8&}luߦ $~MxϖJӻbs&IJl^雟ǝJW*"sEGܩ?{Ks:s6\:|Ǣ`Ok~BrtfM}J_x=S_Z6ca{~N̨#d]U" d+o:wpXă/ S QLS*LL=O$3QZb |q@#'1`Վ NtpE]` =(&ixX^Atz;/3WD |Ju ]ו:Xlu3'BW=ggvIE7~LV!y QpxWޏNg #>h>k;ɨA02˃mWQIA\? -s1"8coL%וWFv#adTEXߏsϒ! \@ɽZ$ɹ ' \o2<^HO*Y^t/דi[L#57ٽFɜ̤?G}&cV 5HN  mܼ{6^lLBY[L|=pى9!P(Z^D7fOJ\gMP'j'{vs4p'w/(5+4a ̓ !$+O|.#yį`Gk\4jpcÛ,ݹ ǽ.Cbhƃd!sU **8M;SgѾ"zj5IJG#gS8[=U.ZQ>#=Dsxcikڔ^~=ru* *fK ~yd :R_@Zr#Nl1=ڭo#!" @A2kį+֔$t6dcgC0@ x/dۨL֝6$¢0tjV{@K?_jb.p NJܣ& i>2=S TN=#~?tiM40zI=(szƒAqI'r:$'iQ-^ n}0ⴜg'/( U5 s=TY-\[ihRbpW%MpCVQm++ؔݙf jaĿEsK_AM3$~ Jm$3TTHO_ 9ci  [tA<{A` 03 i՜zz6m2spxu[ *$S~}Oi^&g=$7)6 y9lBJax eZU*GE {y*{/WέCjz6(ź) =9 L 41L3tjfs~Wnp|X4rf(0UwtgC"UږPˇK{6&A ^o߸XN#ނ 3H)ߔIDWUW RApjeIA;4 T gQ; 6H~=([Z':ҘǦ 5$BT9[}E1Nk3OD~;U'O!bNMm-Al3cx=^JA, Gw'k4AyWHpb|ڀ(k7V1L拜w?YZ2Q ec`uj >Z.͏媓zv3@0%Iw&4.99W_|QBUp7:A:!$j E)NFkʖ¨9d%=^ Lr/8>Se]gs䍄7;>| x‘A!(hY^ l yo)g쪄䞾\;{:Ajˠ4HG&vVACm kyx@B ?y6ޏB:s`韛a҉wWXm q/r% Kz_c?m[ѤZ+IЙ!Zѹ}K5GSTQW 1 W1rooZ @86ւHM T0ӺA̦OWDn$;9/b 0ҷ±ޯ 8AQJוT,>UL|J}Y0SC^5.-< ܛsH=Y0[nh8 یz~s㛇z:̽}$"`زU?V`wN{5bc7_cE%xs| L4}Pg]n^yzXpUo ݈Wo=i(r;?{ЎI!Dp7VAj"f7#"X踭$G{Ozʲכ!zujJӋ9B9ҊloJ^26utUʧɅ n)$7 A<as{4i,^pCɎNW! Q7g|5ԲSU|q> E!z[m ċ;M(ӊS!tSK9}ǣ'y4gJa ̆hÇS5:^2d-Uu| s D?i3Nvo2XrK㆗K!~s[:gb亣Is#(wۤ\6y] $-'(ɾ.ԁڥQ0ԑBW/;BQڻVz ԅ8m$a}ky]_n.y)YCX3y8/Vp#gUa 鱢߈^H'ե@pnؑ";^S7pN^D gf>B{C`.|H_5K\Q}\Wm7M.^gj,X6~.lwPArKFoϧ&~C`gQshG'{<8&OBzu1} 9A߮ǎ\HzGz`9oĸ0[؞ofNO~uR#t4_)BWz%xygU6G\EsEA`PFyScКB>CEmo[lS1DC.{B4c^hh|{3Ѩ/s_?RNg[遑*#MDͶ:vA`5DKo۪ٵSpI 9PSŇz)0aн P~Gv 6]㚟Wk4^$$(GOr/սkI3Ԗ՞s}~?L|nUmFo5#v?'BfNnc ;e|W^C!HRV&Q0Myc^mÀk-!yˏupZZER>k U^,6{մ^/20ЫE&e~{ 5 $_4LB 9\N02!Mc YD&ߒjx5lO+HM{+ZFdM_=Ht/Vk%fJP>?jv|q*+|?R:-3H<<< `o6Wi,@lv&7YO޴I/_EK^A<+\s|$1 .wpԡki͛| k]~pe+0Oŕܺ8}Ʀڨ7=sbb#imʠ<{6yͼ]`͚l|sډH>;t~ &yLtSlSg >FlѤzjC) Dl=qwb-!Mmi)tˢ1zv+t^10v]%`fnz܉)-{Cl+ּmMIN?(s'9`9:]9fН"P <@ ۹I |UyT9duJߦ {x1۳Ncz+.8z$R-kz xt_;1uE0+ʿEk%nZ(}] N23O)7D} `p|~mRY6-ѩUkW8e ^P57 zsVÝx&j~ /MԽ|B*m6~Z227t-{#}6 NOɯ|nd8.uǔi`?qq[wͺ9IxG&'M{DX-Pێ 6/TpTuGBկGP Xq{r&j嶄&!dnoռ+On$W`}T!?Y%:;xg@X=˳ϭ_Ӿ;¶2!8 zn3Y*rdڑ^7$BW_Ueե=xtw1d;hT !ټ/XΟKYw}c3]鈭_Czƫq ;Mv[R\VMrlkϑ,|a%h+#ClN sIeSTB|r/EDsWoX[j29X 4'RIjknNZH&m]֏y-N@x)+HZuiHcVa] awSMb[_2 /;Gx}pՆtUrS~ʩz z.DQBR("){N>:~xkoޟ&&ǂr]l@($ zNG$Ŗ L^i; onJ4s72sHZ =U$1s;Y݅U/<<[eK^nm;[O[nxғ;ǀeC>3nĸv?bV;@PLtGbG=gX;'Aqÿ ɏu;Gߴ.?^z{ (d+84rNoJYD dnS "}A1$vݺ 3]q%V5d=['C|v[ņ7Ly~$eK+>[8B7>PyM-.Wc}bI+ ^̛ǒL|v@wj_'w<~u;'I?YkR jQ .{y1ϡ(Bu!huK35-ä$Wlhcc(WS12ONG!#CrߛF ;]S4~>$W>6A@O/{r$/q+i#N\v!8\rǀQZpQԐ E2{I^;6Iw@X߬uD΋aH_&δ.?ذ4lj;΃"S`_;}t ͉?DBP~ר$|c [p ћFI7yjYHқFf!Q4iqB]o|4V_1\ *3K#f[)~t_6o]*e:^~/pR{B;C^[k^D4hJ|`oKF <`\Q"%ߕCrd?7S*"S%wSE~!hi dd'矌?(y`w/P'oLɿ8~I̿#X4ʈ~3\+#t~o--d`3dL?.צĈ~w8SFmi-Oƈ md`cVFD;~1/Β矒n$dddD?߇2dDc$~R]YOJ꟔?gI3FLRrFD?̿(~WsdJR0Fw%1t_Ɉq_2%Zx1| /.n \xYe^g|V{, &w]>8(۝GO}}~?+\ eaf/data/SPEA2relativeRichmond.rda0000644000176200001440000000155213534247654016460 0ustar liggesusersVyHTA~VYme%%TFDAi{nʪ.M"QaaDHDDev!!]DEEٌ?,n |3~ zA'A.nCtt 3ay..uUVWBPYGiI0j7H2] gv|rقkǜEQDca=R2 d ]I$t|=?O< ϿOA}3?C!@ !@#F{?''G?U:j=`R'ݥ[檮3y25ti֊;m5ϥ涙J]ԟ~/| eaf/data/SPEA2relativeVanzyl.rda0000644000176200001440000000165613534247654016205 0ustar liggesusersV{HTYSLCfR5a/Z"FS9쒻D=v7{.FDHX=(7"ika{}s?.L8;~wagܚ94HA?}h\pZneyֈR͡%$ӕMxwYC~;/.C< ^[ ֕jIj_NK,먭>; !Z("?8ܩsrYҊNLmpyG!\ٍYs}g UXwk&}G˧ tXe'F`h]) }uF[ΐMys[#n `k+/Ρu2c3ޔ:Sp*O8?6֮{F4j(`R~Şf62zNR ?>)WWh=w^:fI]^ Ò!BA )#2F<<]Xw'TuFꛎigC|miK3 zX')y^zg(<(d#i|QآgesW:tL9c]2pAdveEg6R9kWsi K *KD°{$&YI.g9`RӳH}|<y_+=UwW}\pxþ ]J/c8V\.zL?~یVvlf|_g31$S,0&lj#La#mbc^8k6qB h8) i4rRo)8%T3oʍzvJ?ݵ$+hK*?gSI^mD eaf/data/HybridGA.rda0000644000176200001440000000041713534247654014056 0ustar liggesusers r0b```b`bd`b2Y#s1GeRQf#P0X3fbvҍ3`CC1eLi P}HCiT\gu.Bn Ud!3CiV$-y@ A0C8]CrNb1LL+%$Q/hr΢r= 15R< ND(Nd NbZ.Y`'3L NG7OVWUĎ,eaf/src/0000755000176200001440000000000014660712374011606 5ustar liggesuserseaf/src/Rhv.c0000644000176200001440000000635113706402717012513 0ustar liggesusers#include "Rcommon.h" #include "hv.h" SEXP hypervolume_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE) { int nprotected = 0; double *data = REAL(DATA); SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); SEXP_2_DOUBLE_VECTOR(REFERENCE, reference, reference_len); if (nobj != reference_len) Rf_error("length of reference point (%d) is different from number of objectives (%d)", reference_len, nobj); new_real_vector(hv, 1); hv[0] = fpli_hv(data, nobj, npoint, reference); UNPROTECT (nprotected); return Rexp(hv); } SEXP hv_contributions_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE) { int nprotected = 0; double *data = REAL(DATA); SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); SEXP_2_DOUBLE_VECTOR(REFERENCE, reference, reference_len); if (nobj != reference_len) Rf_error("length of reference point (%d) is different from number of objectives (%d)", reference_len, nobj); new_real_vector(hv, npoint); hv_contributions(hv, data, nobj, npoint, reference); UNPROTECT (nprotected); return Rexp(hv); } #include "whv.h" SEXP rect_weighted_hv2d_C(SEXP DATA, SEXP NPOINTS, SEXP RECTANGLES, SEXP RECTANGLES_NROW) { int nprotected = 0; // It cannot be const because we need to sort it. double *data = REAL(DATA); SEXP_2_INT(NPOINTS, npoints); // It cannot be const because we need to sort it. double *rectangles = REAL(RECTANGLES); SEXP_2_INT(RECTANGLES_NROW, rectangles_nrow); new_real_vector(hv, 1); hv[0] = rect_weighted_hv2d(data, npoints, rectangles, rectangles_nrow); UNPROTECT (nprotected); return Rexp(hv); } #include "whv_hype.h" hype_sample_dist * Sexp_to_dist(SEXP DIST, SEXP SEED) { int nprotected = 0; hype_sample_dist * dist = NULL; SEXP_2_INT(SEED, seed); const char * dist_type = CHAR(STRING_ELT(VECTOR_ELT(DIST, 0), 0)); if (0 == strcmp(dist_type, "uniform")) { dist = hype_dist_unif_new(seed); } else if (0 == strcmp(dist_type, "exponential")) { const double * mu = REAL(VECTOR_ELT(DIST, 1)); dist = hype_dist_exp_new(mu[0], seed); } else if (0 == strcmp(dist_type, "point")) { const double * mu = REAL(VECTOR_ELT(DIST, 1)); dist = hype_dist_gaussian_new(mu, seed); } else { Rf_error("unknown dist_type: %s", dist_type); } UNPROTECT (nprotected); return dist; } SEXP whv_hype_C(SEXP DATA, SEXP NPOINTS, SEXP IDEAL, SEXP REFERENCE, SEXP DIST, SEXP SEED, SEXP NSAMPLES) { int nprotected = 0; // It cannot be const because we need to sort it. double *data = REAL(DATA); SEXP_2_INT(NPOINTS, npoints); SEXP_2_INT(NSAMPLES, nsamples); SEXP_2_DOUBLE_VECTOR(REFERENCE, reference, reference_len); SEXP_2_DOUBLE_VECTOR(IDEAL, ideal, ideal_len); eaf_assert(reference_len == ideal_len); eaf_assert(reference_len == 2); hype_sample_dist * dist = Sexp_to_dist(DIST, SEED); new_real_vector(hv, 1); if (!dist) { Rf_error("Sexp_to_dist failed to create dist"); } else { hv[0] = whv_hype_estimate(data, npoints, ideal, reference, dist, nsamples); hype_dist_free(dist); } UNPROTECT (nprotected); return Rexp(hv); } eaf/src/Reaf.c0000644000176200001440000002433614531104525012625 0ustar liggesusers#include "Rcommon.h" #include "eaf.h" static eaf_t ** compute_eaf_helper (SEXP DATA, int nobj, SEXP CUMSIZES, int nruns, const double *percentile, int nlevels) { int k; SEXP_2_INT_VECTOR(CUMSIZES, cumsizes, cumsizes_len); if (cumsizes_len < nruns) Rf_error("length of cumsizes (%d) is less than nruns (%d)", cumsizes_len, nruns); int *level; if (percentile != NULL) { level = malloc(sizeof(int) * nlevels); for (k = 0; k < nlevels; k++) level[k] = percentile2level(percentile[k], nruns); } else { eaf_assert (nlevels == nruns); level = malloc(sizeof(int) * nruns); for (k = 0; k < nruns; k++) level[k] = k + 1; } double *data = REAL(DATA); DEBUG2( Rprintf ("attsurf ({(%f, %f", data[0], data[1]); for (k = 2; k < nobj; k++) { Rprintf (", %f", data[k]); } Rprintf (")...}, %d, { %d", nobj, cumsizes[0]); for (k = 1; k < nruns; k++) { Rprintf (", %d", cumsizes[k]); } Rprintf ("}, %d, { %d", nruns, level[0]); for (k = 1; k < nlevels; k++) { Rprintf (", %d", level[k]); } Rprintf ("}, %d)\n", nlevels); ); eaf_t **eaf = attsurf (data, nobj, cumsizes, nruns, level, nlevels); free (level); DEBUG2( Rprintf ("eaf computed\n"); for (k = 0; k < nlevels; k++) { Rprintf ("eaf[%d] = %lu\n", k, (unsigned long) eaf[k]->size); }); return eaf; } SEXP compute_eaf_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP PERCENTILE) { SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NRUNS, nruns); SEXP_2_DOUBLE_VECTOR(PERCENTILE, percentile, nlevels); eaf_t **eaf = compute_eaf_helper(DATA, nobj, CUMSIZES, nruns, percentile, nlevels); int totalpoints = eaf_totalpoints (eaf, nlevels); SEXP mat; PROTECT(mat = Rf_allocMatrix(REALSXP, totalpoints, nobj + 1)); double * rmat = REAL(mat); int pos = 0; int k; for (k = 0; k < nlevels; k++) { int npoints = eaf[k]->size; DEBUG2( int totalsize = npoints * nobj; Rprintf ("totalpoints eaf[%d] = %d\n", k, totalsize) ); int i; for (i = 0; i < npoints; i++) { int j; for (j = 0; j < nobj; j++) { rmat[pos + j * totalpoints] = eaf[k]->data[j + i * nobj]; } rmat[pos + nobj * totalpoints] = percentile[k]; pos++; } eaf_delete (eaf[k]); } free(eaf); UNPROTECT (1); return mat; } SEXP compute_eafdiff_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP INTERVALS) { SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NRUNS, nruns); SEXP_2_INT(INTERVALS, intervals); int k; eaf_t **eaf = compute_eaf_helper(DATA, nobj, CUMSIZES, nruns, NULL, nruns); int nsets1 = nruns / 2; int nsets2 = nruns - nsets1; int totalpoints = eaf_totalpoints (eaf, nruns); SEXP mat; PROTECT(mat = Rf_allocMatrix(REALSXP, totalpoints, nobj + 1)); double *rmat = REAL(mat); int pos = 0; for (k = 0; k < nruns; k++) { int npoints = eaf[k]->size; int i, j; DEBUG2( int totalsize = npoints * nobj; Rprintf ("totalpoints eaf[%d] = %d\n", k, totalsize) ); // FIXME: Find the most efficient order of the loop. for (i = 0; i < npoints; i++) { for (j = 0; j < nobj; j++) { rmat[pos + j * totalpoints] = eaf[k]->data[j + i * nobj]; } pos++; } } pos += (nobj - 1) * totalpoints; for (k = 0; k < nruns; k++) { int i; int npoints = eaf[k]->size; for (i = 0; i < npoints; i++) { int count_left; int count_right; /* bit_array_check(bit_array_offset(eaf[k]->bit_attained,i, eaf[k]->nruns), */ /* eaf[k]->attained + i * eaf[k]->nruns, npoints, nruns); */ attained_left_right (bit_array_offset(eaf[k]->bit_attained, i, eaf[k]->nruns), nsets1, nruns, &count_left, &count_right); rmat[pos] = intervals * (double) ((count_left / (double) nsets1) - (count_right / (double) nsets2)); pos++; } eaf_delete (eaf[k]); } free(eaf); UNPROTECT (1); return mat; } static int polygon_len(const double *src, int nobj) { const double *src_orig = src; while (*src != objective_MIN) src += nobj; src += nobj; return (src - src_orig) / nobj; } static int polygon_copy(double *dest, int start, int nrows, const double *src) { int len = start; while (*src != objective_MIN) { dest[len] = *src; dest[len + nrows] = *(src + 1); len++; src += 2; } dest[len] = NA_REAL; dest[len + nrows] = NA_REAL; len++; return len - start; } SEXP compute_eafdiff_rectangles_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP INTERVALS); SEXP compute_eafdiff_rectangles_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP INTERVALS) { SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NRUNS, nruns); SEXP_2_INT(INTERVALS, intervals); int nprotected = 0; int k; eaf_t **eaf = compute_eaf_helper(DATA, nobj, CUMSIZES, nruns, NULL, nruns); eaf_polygon_t * rects = eaf_compute_rectangles(eaf, nruns); for (k = 0; k < nruns; k++) eaf_delete (eaf[k]); free(eaf); const int division = nruns / 2; int nrow = vector_int_size(&rects->col); // Two points per row + color new_real_matrix (result, nrow, 2 * nobj + 1); double * p_xy = vector_objective_begin(&rects->xy); for (k = 0; k < nrow; ++k) { for (int i = 0; i < 2 * nobj; i++) result[k + nrow * i] = (double) *(p_xy++); } vector_objective_dtor (&rects->xy); for (k = 0; k < nrow; ++k) { double color = vector_int_at(&rects->col, k); // Each color is within [0, nruns / 2] or [-nruns / 2, 0] result[k + nrow * 2 * nobj] = intervals * color / (double) division; } // FIXME: This may return duplicated rows, remove them. vector_int_dtor (&rects->col); free(rects); const char* const colnames[] = {"xmin", "ymin", "xmax", "ymax", "diff"}; set_colnames(Rexp(result), colnames, 5); UNPROTECT (nprotected); return Rexp(result); } SEXP compute_eafdiff_area_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP INTERVALS); SEXP compute_eafdiff_area_C(SEXP DATA, SEXP NOBJ, SEXP CUMSIZES, SEXP NRUNS, SEXP INTERVALS) { int nprotected = 0; int k; SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NRUNS, nruns); SEXP_2_INT(INTERVALS, intervals); eaf_t **eaf = compute_eaf_helper(DATA, nobj, CUMSIZES, nruns, NULL, nruns); eaf_polygon_t *p = eaf_compute_area(eaf, nruns); for (k = 0; k < nruns; k++) eaf_delete (eaf[k]); free(eaf); const int division = nruns / 2; int ncol = vector_int_size(&p->col); DEBUG2(Rprintf ("ncol: %d\n", ncol)); int left_ncol = 0, right_ncol = 0; int left_len = 0, right_len = 0; /* First compute the adjusted colors, and how much space we need on each side. */ double * p_xy = vector_objective_begin(&p->xy); for (k = 0; k < ncol; k++) { // Truncate colors to interval int color = vector_int_at(&p->col, k) * intervals / (double) division; int len = polygon_len (p_xy, nobj); p_xy += len * nobj; DEBUG2(Rprintf ("color: %d, len = %d\n", color, len)); // First interval (-1, 1) is white if (color >= 1) { left_len += len; left_ncol++; } else if (color <= 1) { right_len += len; right_ncol++; } vector_int_set(&p->col, k, color); } DEBUG2(Rprintf ("left_len: %d, right_len: %d, left_ncol: %d, right_ncol: %d\n", left_len, right_len, left_ncol, right_ncol)); /* Now assign points to each side. */ new_real_vector(left_col, left_ncol); new_real_vector(right_col, right_ncol); const int left_npoints = left_len; new_real_matrix (left, left_npoints, nobj); const int right_npoints = right_len; new_real_matrix (right, right_npoints, nobj); p_xy = vector_objective_begin(&p->xy); left_len = right_len = 0; left_ncol = right_ncol = 0; for (k = 0; k < ncol; k++) { int len; int color = vector_int_at(&p->col, k); if (color >= 1) { len = polygon_copy (left, left_len, left_npoints, p_xy); left_len += len; left_col[left_ncol++] = color + 1; } else if (color <= 1) { len = polygon_copy (right, right_len, right_npoints, p_xy); right_len += len; right_col[right_ncol++] = 1 - color; } else { len = polygon_len (p_xy, nobj); } p_xy += nobj * len; } vector_int_dtor (&p->col); vector_objective_dtor (&p->xy); free(p); set_attribute(left, "col", left_col); set_attribute(right, "col", right_col); new_list(poly, 2); list_push_back (poly, left); list_push_back (poly, right); new_string_vector (names, list_len (poly)); string_vector_push_back (names, "left"); string_vector_push_back (names, "right"); set_names (poly, names); UNPROTECT (nprotected); return Rexp(poly); } SEXP read_data_sets (SEXP FILENAME) { SEXP_2_STRING(FILENAME, filename); /* Rprintf ("filename: %s\n", filename); */ objective_t * data = NULL; int * cumsizes = NULL; int nobj = 0, nruns = 0; read_objective_t_data (filename, &data, &nobj, &cumsizes, &nruns); const int ntotal = cumsizes[nruns - 1]; SEXP DATA; PROTECT(DATA = Rf_allocMatrix(REALSXP, cumsizes[nruns-1], nobj + 1)); double *rdata = REAL(DATA); double_transpose (rdata, data, ntotal, nobj); int k, j; size_t pos = ntotal * nobj; for (k = 0, j = 0; k < ntotal; k++, pos++) { if (k == cumsizes[j]) j++; rdata[pos] = j + 1; } free(data); free(cumsizes); UNPROTECT (1); return DATA; } eaf/src/Makevars.win0000644000176200001440000000177514660417434014107 0ustar liggesusers# -*- mode: makefile -*- # Do not put GCC specific flags here. Put them instead in CFLAGS and # CXXFLAGS in ~/.R/Makevars # This is from https://github.com/eddelbuettel/rcppgsl/blob/master/tools/winlibs.R RSCRIPT := "${R_HOME}/bin${R_ARCH_BIN}/Rscript.exe" GSL_ROOT :=$(shell $(RSCRIPT) -e 'cat(file.path(getwd(), "../windows/gsl-2.7/"))') GSL_CFLAGS = -I"$(GSL_ROOT)/include" GSL_LIBS = -L"$(GSL_ROOT)/lib${R_ARCH}${CRT}" -lgsl -lgslcblas DEBUG=0 PKG_CPPFLAGS = $(GSL_CFLAGS) -DR_PACKAGE -DDEBUG=$(DEBUG) -I./eaf/ -I./mo-tools/ PKG_LIBS = $(GSL_LIBS) EAF_SRC_FILES= avl.c eaf3d.c eaf.c io.c MOTOOLS_SRC_FILES = hv_contrib.c hv.c pareto.c whv.c whv_hype.c SOURCES = $(EAF_SRC_FILES:%=eaf/%) $(MOTOOLS_SRC_FILES:%=mo-tools/%) init.c Reaf.c Repsilon.c Rhv.c Rnondominated.c OBJECTS = $(SOURCES:.c=.o) export GSL_CFLAGS GSL_LIBS .PHONY: all clean winlibs all: $(SHLIB) $(SHLIB): $(OBJECTS) clean: @-rm -f *.o *.so *.dll eaf/*.o mo-tools/*.o $(OBJECTS): winlibs winlibs: $(RSCRIPT) "../tools/winlibs.R" eaf/src/Rcommon.h0000644000176200001440000001310413706402717013365 0ustar liggesusers#define R_NO_REMAP #include #include #include #include #include "common.h" #define CHECK_ARG_IS_NUMERIC_VECTOR(A) \ if (!Rf_isReal(A) || !Rf_isVector(A)) \ Rf_error("Argument '" #A "' is not a numeric vector"); #define CHECK_ARG_IS_INT_VECTOR(A) \ if (!Rf_isInteger(A) || !Rf_isVector(A)) \ Rf_error("Argument '" #A "' is not an integer vector"); #define CHECK_ARG_IS_LOGICAL_VECTOR(A) \ if (!Rf_isLogical(A) || !Rf_isVector(A)) \ Rf_error("Argument '" #A "' is not a logical vector"); /* The C API of R is awfully ugly and unpractical (and poorly documented). These wrappers make it a little more bearable. */ #define Rexp(VAR) Rexp_##VAR #define new_real_matrix(VAR, DIM1, DIM2) \ SEXP Rexp_##VAR; double *VAR; \ PROTECT(Rexp_##VAR = Rf_allocMatrix(REALSXP, (DIM1), (DIM2))); \ nprotected++; VAR = REAL(Rexp_##VAR) #define new_real_vector(VAR, DIM) \ SEXP Rexp_##VAR; double *VAR; \ PROTECT(Rexp_##VAR = Rf_allocVector(REALSXP, (DIM))); \ nprotected++; VAR = REAL(Rexp_##VAR) #define new_int_vector(VAR, DIM) \ SEXP Rexp_##VAR; int *VAR; \ PROTECT(Rexp_##VAR = Rf_allocVector(INTSXP, (DIM))); \ nprotected++; VAR = INTEGER(Rexp_##VAR) #define new_string_vector(VAR, DIM) \ SEXP Rexp_##VAR; int Rexp_##VAR##_len = 0; \ PROTECT(Rexp_##VAR = Rf_allocVector(STRSXP, (DIM))); \ nprotected++ #define string_vector_push_back(VAR, ELEMENT) \ SET_STRING_ELT(Rexp_##VAR, Rexp_##VAR##_len, Rf_mkChar(ELEMENT)); \ Rexp_##VAR##_len++ #define new_list(LISTVAR, LENGTH) \ SEXP Rexp_##LISTVAR; int Rexp_##LISTVAR##_len = 0; \ PROTECT(Rexp_##LISTVAR = Rf_allocVector(VECSXP, (LENGTH))); \ ++nprotected #define new_logical_vector(VAR, DIM) \ SEXP Rexp_##VAR; int *VAR; \ PROTECT(Rexp_##VAR = Rf_allocVector(LGLSXP, (DIM))); \ nprotected++; VAR = LOGICAL(Rexp_##VAR) #define list_len(VAR) Rexp_##VAR##_len #define list_push_back(LISTVAR, ELEMENT) \ SET_VECTOR_ELT(Rexp_##LISTVAR, Rexp_##LISTVAR##_len, Rexp_##ELEMENT); \ Rexp_##LISTVAR##_len++ #define set_names(VAR, NAMES) \ Rf_setAttrib(Rexp_##VAR, R_NamesSymbol, Rexp_##NAMES) #define set_attribute(VAR, ATTRIBUTE, VALUE) \ Rf_setAttrib(Rexp_##VAR, Rf_install(ATTRIBUTE), Rexp_##VALUE) /* * Unpack an integer vector stored in SEXP S. */ #define SEXP_2_DOUBLE_VECTOR(S, I, N) \ CHECK_ARG_IS_NUMERIC_VECTOR(S); \ double *I = REAL(S); \ const R_len_t N = Rf_length(S); #define SEXP_2_INT_VECTOR(S, I, N) \ CHECK_ARG_IS_INT_VECTOR(S); \ int *I = INTEGER(S); \ const R_len_t N = Rf_length(S); #define SEXP_2_LOGICAL_VECTOR(S, I, N) \ CHECK_ARG_IS_LOGICAL_VECTOR(S); \ int *I = LOGICAL(S); \ const R_len_t N = Rf_length(S); #define SEXP_2_INT(S,VAR) \ int VAR = Rf_asInteger(S); \ if (VAR == NA_INTEGER) \ Rf_error ("Argument '" #S "' is not an integer"); #define SEXP_2_LOGICAL(S,VAR) \ int VAR = Rf_asLogical(S); \ if (VAR == NA_LOGICAL) \ Rf_error ("Argument '" #S "' is not a logical"); #define SEXP_2_STRING(S,var) \ if (!Rf_isString(S) || Rf_length(S) != 1) \ Rf_error ("Argument '" #S "' is not a string"); \ const char * var = CHAR(STRING_ELT(S,0)); static inline void bool_2_logical_vector(int *dst, const bool *src, size_t n) { for (size_t i = 0; i < n; i++) dst[i] = src[i]; } /* FIXME: Measure if this is faster than the R implementation of t() */ static inline void double_transpose(double *dst, const double *src, const size_t nrows, const size_t ncols) { size_t j, i, pos = 0; for (j = 0; j < ncols; j++) { for (i = 0; i < nrows; i++) { dst[pos] = src[j + i * ncols]; pos++; } } } static inline SEXP set_colnames(SEXP matrix, const char *const * names, size_t names_len) { int nprotected=0; SEXP dimnames = Rf_getAttrib(matrix, R_DimNamesSymbol); if (dimnames == R_NilValue) { PROTECT(dimnames = Rf_allocVector(VECSXP, 2)); nprotected++; } new_string_vector (colnames, names_len); for (size_t k = 0; k < names_len; k++) { string_vector_push_back (colnames, names[k]); } SET_VECTOR_ELT(dimnames, 1, Rexp(colnames)); Rf_setAttrib(matrix, R_DimNamesSymbol, dimnames); UNPROTECT(nprotected); return(matrix); } eaf/src/eaf/0000755000176200001440000000000014660712374012341 5ustar liggesuserseaf/src/eaf/svn_version0000644000176200001440000000000414660712342014624 0ustar liggesusers292Meaf/src/eaf/README0000644000176200001440000000673014660712342013222 0ustar liggesusers-------------------------------------------------------------------- Computation of the Empirical Attainment Function in 2 or 3 Dimensions Carlos Fonseca and Manuel López-Ibáñez -------------------------------------------------------------------- Contents * Introduction * Usage * License * Changelog ------------ Introduction ------------ This program computes the empirical attainment function from a number of sets of nondominated points. This version is based on the original code written by Carlos M. Fonseca available at http://www.tik.ee.ethz.ch/pisa/. Relevant literature: [1] V. Grunert da Fonseca, C. M. Fonseca, and A. Hall. Inferential performance assessment of stochastic optimizers and the attainment function. In E. Zitzler, K. Deb, L. Thiele, C. C. Coello, and D. Corne, editors, Evolutionary Multi-criterion Optimization (EMO 2001), volume 1993 of Lecture Notes in Computer Science, pages 213-225. Springer Verlag, Berlin, Germany, 2001. ------------ Building ------------ The program has been tested on GNU/Linux using bash shell and a recent version of GCC (>= 4.2). If you have success or problems using other systems, please let me know. The default compilation is done with: make eaf You can optimize for a particular computer architecture with the option "march=", for example: make eaf march=pentium4 Modern versions of GCC support a value of 'march=native' that autodetects your architecture. See the GCC manual for the names of the architectures supported by your version of GCC. ------- Usage ------- For the remainder options available, see the output of eaf --help ------------ License ------------ This software is Copyright (C) 2006, 2007, 2008, 2009. Carlos Fonseca and Manuel López-Ibáñez. This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to (a) mention the fashion in which this software was used in the Methods section; (b) mention the algorithm in the References section. The appropriate citation is: V. Grunert da Fonseca, C. M. Fonseca, and A. Hall. Inferential performance assessment of stochastic optimizers and the attainment function. In E. Zitzler, K. Deb, L. Thiele, C. C. Coello, and D. Corne, editors, Evolutionary Multi-criterion Optimization (EMO 2001), volume 1993 of Lecture Notes in Computer Science, pages 213-225. Springer Verlag, Berlin, Germany, 2001. Moreover, as a personal note, I would appreciate it if you would email with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. ------------ Changelog ------------ eaf/src/eaf/eaf.c0000644000176200001440000011030314660712342013231 0ustar liggesusers/************************************************************************* eaf: Computes the empirical attainment function (EAF) from a number of approximation sets. --------------------------------------------------------------------- Copyright (c) 2005 Carlos M. Fonseca Copyright (c) 2006, 2007, 2008, 2015 Carlos M. Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- *************************************************************************/ #include #include #include #include #include #include "eaf.h" #ifndef DEBUG #define DEBUG 0 #endif #ifndef DEBUG_POLYGONS #define DEBUG_POLYGONS 0 #endif //#define OLD_ATTAINED(X) do { X; } while(0); #define OLD_ATTAINED(X) while(0) { X; }; static int compare_x_asc (const void *p1, const void *p2) { objective_t x1 = **(objective_t **)p1; objective_t x2 = **(objective_t **)p2; return (x1 < x2) ? -1 : ((x1 > x2) ? 1 : 0); } static int compare_y_desc (const void *p1, const void *p2) { objective_t y1 = *(*(objective_t **)p1+1); objective_t y2 = *(*(objective_t **)p2+1); return (y1 > y2) ? -1 : ((y1 < y2) ? 1 : 0); } static void point2d_printf(FILE *stream, const objective_t x, const objective_t y) { fprintf(stream, point_printf_format "\t" point_printf_format, x, y); } static void point_printf(FILE *stream, const objective_t *p, int nobj) { point2d_printf(stream, p[0], p[1]); for (int k = 2; k < nobj; k++) fprintf (stream, "\t" point_printf_format, p[k]); } eaf_t * eaf_create (int nobj, int nruns, int npoints) { eaf_t *eaf; EAF_MALLOC (eaf, 1, eaf_t); eaf->nobj = nobj; eaf->nruns = nruns; eaf->size = 0; eaf->nreallocs = 0; /* Maximum is npoints, but normally it will be smaller, so at most log2(2 * nruns) realloc will occur. */ eaf->maxsize = 256 + npoints / (2 * nruns); /* fprintf(stderr,"maxsize %ld = %d npoints, %d nruns\n", */ /* eaf->maxsize, npoints, nruns); */ EAF_MALLOC (eaf->data, nobj * eaf->maxsize, objective_t); eaf->bit_attained = malloc (bit_array_bytesize(nruns) * eaf->maxsize); eaf->attained = NULL; OLD_ATTAINED(eaf->attained = malloc(sizeof(bool) * nruns * eaf->maxsize)); return eaf; } void eaf_delete (eaf_t * eaf) { free (eaf->data); OLD_ATTAINED(free (eaf->attained)); free (eaf->bit_attained); free (eaf); } void eaf_realloc(eaf_t * eaf, size_t nobj) { const int nruns = eaf->nruns; eaf->data = realloc (eaf->data, sizeof(objective_t) * nobj * eaf->maxsize); eaf_assert(eaf->data); OLD_ATTAINED( eaf->attained = realloc (eaf->attained, sizeof(bool) * nruns * eaf->maxsize); eaf_assert(eaf->attained); ); eaf->bit_attained = realloc (eaf->bit_attained, bit_array_bytesize(nruns) * eaf->maxsize); eaf_assert(eaf->bit_attained); } objective_t * eaf_store_point_help (eaf_t * eaf, int nobj, const int *save_attained) { const int nruns = eaf->nruns; if (eaf->size == eaf->maxsize) { eaf_assert (eaf->size < INT_MAX / 2); //size_t old_maxsize = eaf->maxsize; eaf->maxsize = (size_t) (eaf->maxsize * (1.0 + 1.0 / pow(2, eaf->nreallocs / 4.0))); eaf->maxsize += 100; // At least we increase it by 100 points /* fprintf(stderr,"maxsize (%d): %ld -> %ld\n", eaf->nreallocs, */ /* old_maxsize, eaf->maxsize); */ eaf->nreallocs++; // FIXME: We could save memory by only storing eaf->attained per point if requested. eaf_realloc(eaf, nobj); } // FIXME: provide a bit_array function to do this. for (int k = 0; k < nruns; k++) { bit_array_set(bit_array_offset(eaf->bit_attained, eaf->size, nruns), k, (bool) save_attained[k]); OLD_ATTAINED(eaf->attained[nruns * eaf->size + k] = (bool) save_attained[k]); } OLD_ATTAINED( bitset_check(bit_array_offset(eaf->bit_attained, eaf->size, eaf->nruns), eaf->attained + eaf->size * eaf->nruns, eaf->nruns)); return eaf->data + nobj * eaf->size; } static void eaf_adjust_memory (eaf_t * eaf, int nobj) { if (eaf->size < eaf->maxsize) { //fprintf(stderr,"reduce size: %ld -> %ld\n", eaf->maxsize, eaf->size); eaf->maxsize = eaf->size; eaf_realloc(eaf, nobj); } OLD_ATTAINED( bit_array_check(eaf->bit_attained, eaf->attained, eaf->size, eaf->nruns)); } static void eaf_store_point_2d (eaf_t * eaf, objective_t x, objective_t y, const int *save_attained) { const int nobj = 2; objective_t * pos = eaf_store_point_help (eaf, nobj, save_attained); pos[0] = x; pos[1] = y; eaf->size++; } static void eaf_print_line (FILE *coord_file, FILE *indic_file, FILE *diff_file, const objective_t *x, int nobj, const bit_array *attained, int nruns) { int count1 = 0; int count2 = 0; int k; if (coord_file) { point_printf(coord_file, x, nobj); fprintf (coord_file, (coord_file == indic_file) || (coord_file == diff_file) ? "\t" : "\n"); } if (indic_file) { fprintf (indic_file, "%d", bit_array_get(attained, 0) ? (count1++,1) : 0); for (k = 1; k < nruns/2; k++) fprintf (indic_file, "\t%d", bit_array_get(attained, k) ? (count1++,1) : 0); for (k = nruns/2; k < nruns; k++) fprintf (indic_file, "\t%d", bit_array_get(attained, k) ? (count2++,1) : 0); fprintf (indic_file, (indic_file == diff_file) ? "\t" : "\n"); } else if (diff_file) { attained_left_right (attained, nruns/2, nruns, &count1, &count2); } if (diff_file) fprintf (diff_file,"%d\t%d\n", count1, count2); } /* Print one attainment surface of the EAF. */ void eaf_print_attsurf (eaf_t * eaf, FILE *coord_file, FILE *indic_file, FILE *diff_file) { OLD_ATTAINED( bit_array_check(eaf->bit_attained, eaf->attained, eaf->size, eaf->nruns)); for (size_t i = 0; i < eaf->size; i++) { const objective_t *p = eaf->data + i * eaf->nobj; /* bit_array_fprintf(stderr, eaf->bit_attained, eaf->nruns * eaf->size); */ OLD_ATTAINED(bitset_check(bit_array_offset(eaf->bit_attained, i, eaf->nruns), eaf->attained + i * eaf->nruns, eaf->nruns)); eaf_print_line (coord_file, indic_file, diff_file, p, eaf->nobj, bit_array_offset(eaf->bit_attained, i, eaf->nruns), eaf->nruns); } } __unused static void fprint_set2d (FILE *stream, const objective_t * const *data, int ntotal) { for (int k = 0; k < ntotal; k++) fprintf (stream, "%6d: " point_printf_format " " point_printf_format "\n", k, data[k][0], data[k][1]); } /* eaf2d: compute attainment surfaces from points in objective space, using dimension sweeping. Input arguments: data : a pointer to the data matrix, stored as a linear array of objective_t in row major order. cumsize : an array containing the cumulative number of rows in each non-dominated front (must be non-decreasing). nruns : the number of independent non-dominated fronts. attlevel : an array containing the attainment levels to compute. nlevel : number of attainment levels to compute. coord_file : stream to write the resulting attainment surfaces. indic_file : stream to write the resulting attainment indices. diff_file : stream to write the difference between the the first half and the second half of nruns. */ eaf_t ** eaf2d (const objective_t *data, const int *cumsize, int nruns, const int *attlevel, const int nlevels) { const int nobj = 2; eaf_t **eaf; const objective_t **datax, **datay; /* used to access the data sorted according to x or y */ const int ntotal = cumsize[nruns - 1]; /* total number of points in data */ int *runtab; int *attained, *save_attained; int k, j, l; /* Access to the data is made via two arrays of pointers: ix, iy These are sorted, to allow for dimension sweeping */ datax = malloc (ntotal * sizeof(objective_t *)); datay = malloc (ntotal * sizeof(objective_t *)); for (k = 0; k < ntotal ; k++) datax[k] = datay[k] = data + nobj * k; #if DEBUG > 1 fprintf (stderr, "Original data:\n"); fprint_set2d (stderr, datax, ntotal); #endif qsort (datax, ntotal, sizeof(*datax), &compare_x_asc); qsort (datay, ntotal, sizeof(*datay), &compare_y_desc); #if DEBUG > 1 fprintf (stderr, "Sorted data (x):\n"); fprint_set2d (stderr, datax, ntotal); fprintf (stderr, "Sorted data (y):\n"); fprint_set2d (stderr, datay, ntotal); #endif /* Setup a lookup table to go from a point to the approximation set (run) to which it belongs. */ runtab = malloc (ntotal * sizeof(int)); for (k = 0, j = 0; k < ntotal; k++) { if (k == cumsize[j]) j++; runtab[k] = j; } #if DEBUG > 1 fprintf (stderr, "Runtab:\n"); for (k = 0; k < ntotal; k++) fprintf (stderr, "%6d: %6d\n", k, runtab[k]); #endif /* Setup tables to keep attainment statistics. In particular, save_attained is needed to cope with repeated values on the same axis. */ attained = malloc (nruns * sizeof(int)); save_attained = malloc (nruns * sizeof(int)); eaf = malloc(nlevels * sizeof(eaf_t*)); for (l = 0; l < nlevels; l++) { eaf[l] = eaf_create (nobj, nruns, ntotal); int level = attlevel[l]; int x = 0; int y = 0; int nattained = 0; for (k = 0; k < nruns; k++) attained[k] = 0; /* Start at upper-left corner */ int run = runtab[(datax[x] - data) / nobj]; attained[run]++; nattained++; do { /* Move right until desired attainment level is reached */ while (x < ntotal - 1 && (nattained < level || datax[x][0] == datax[x+1][0])) { x++; if (datax[x][1] <= datay[y][1]) { run = runtab[(datax[x] - data)/nobj]; if (!attained[run]) nattained++; attained[run]++; } } #if DEBUG > 1 for (k = 0; k < nruns; k++) fprintf (stderr, "%d ", attained[k]); fprintf (stderr, "\n"); #endif if (nattained < level) continue; /* Now move down until desired attainment level is no longer reached. */ do { /* If there are repeated values along the y axis, we need to remember where we are. */ /*save_nattained = nattained;*/ memcpy (save_attained, attained, nruns * sizeof(*attained)); do { if (datay[y][0] <= datax[x][0]) { run = runtab[(datay[y] - data)/nobj]; attained[run]--; if (!attained[run]) nattained--; } #if DEBUG > 1 for (k = 0; k < nruns; k++) fprintf (stderr, "%d ", attained[k]); fprintf (stderr, "\n"); #endif y++; } while (y < ntotal && datay[y][1] == datay[y - 1][1]); } while (nattained >= level && y < ntotal); eaf_assert (nattained < level); eaf_store_point_2d (eaf[l], datax[x][0], datay[y - 1][1], save_attained); } while (x < ntotal - 1 && y < ntotal); eaf_adjust_memory(eaf[l], nobj); } free(save_attained); free(attained); free(runtab); free(datay); free(datax); return eaf; } #if DEBUG_POLYGONS > 0 #define PRINT_POINT(X,Y,C) do { \ fprintf(stdout, "PRINT_POINT:"); point2d_printf(stdout, X, Y); \ if (C != INT_MIN) fprintf(stdout, "\t%d", C); \ fprintf(stdout, "\n"); } while(0) #else #define PRINT_POINT(X,Y,C) (void)0 #endif static int eaf_max_size(eaf_t * const * eaf, int nlevels) { size_t max_size = 0; for (int a = 0; a < nlevels; a++) { if (max_size < eaf[a]->size) max_size = eaf[a]->size; } return max_size; } static int eaf_diff_color(const eaf_t * eaf, size_t k, int nruns) { const bit_array *bit_attained = bit_array_offset(eaf->bit_attained, k, nruns); OLD_ATTAINED( const bool *attained = eaf->attained + k * nruns; bitset_check(bit_attained, attained, nruns);); int count_left, count_right; attained_left_right (bit_attained, nruns/2, nruns, &count_left, &count_right); return count_left - count_right; } static void init_colors(int * color, const eaf_t * eaf, size_t eaf_size, int nruns) { for (size_t k = 0; k < eaf_size; k++) { color[k] = eaf_diff_color(eaf, k, nruns); } } static const objective_t * next_polygon(const objective_t *src, int nobj, const objective_t * end) { while (src < end && *src != objective_MIN) src += nobj; src += nobj; return src; } static void min_max_in_objective(const objective_t *v, int nobj, int k, objective_t *min_ref, objective_t *max_ref) { eaf_assert(k < nobj); eaf_assert(v[k] != objective_MIN); // Empty polygon? objective_t min = v[k]; objective_t max = v[k]; v += nobj; while (v[k] != objective_MIN) { if (min > v[k]) min = v[k]; if (max < v[k]) max = v[k]; v += nobj; } *min_ref = min; *max_ref = max; } static bool polygon_dominates_point(const objective_t *p, const objective_t *x, int nobj) { eaf_assert(x[0] != objective_MIN); while (p[0] != objective_MIN) { if (p[0] < x[0] && p[1] < x[1]) { /* point2d_printf(stdout, p[0], p[1]); */ /* printf(" dominates "); */ /* point2d_printf(stdout, x[0], x[1]); */ /* printf("\n"); */ return true; } p += nobj; } return false; } static bool polygon_dominates_any_point(const objective_t *a, const objective_t *b, int nobj) { while (b[0] != objective_MIN) { if (polygon_dominates_point(a, b, nobj)) return true; b += nobj; } return false; } static bool polygons_intersect(const objective_t *a, const objective_t *b, int nobj) { for (int k = 0; k < nobj; k++) { objective_t min_a, max_a, min_b, max_b; min_max_in_objective(a, nobj, k, &min_a, &max_a); min_max_in_objective(b, nobj, k, &min_b, &max_b); // If we can draw a line completely separating them in one axis, then // they don't intersect. if (max_a <= min_b || max_b <= min_a) return false; } // Two orthogonal polygons intersect if there is a corner of A that is // dominated by a corner of B and there is a corner of B that is dominated // by a corner of A return polygon_dominates_any_point(a, b, nobj) && polygon_dominates_any_point(b, a, nobj); } __unused static void polygon_print(const objective_t *p, int nobj) { while (p[0] != objective_MIN) { point_printf(stderr, p, nobj); fprintf(stderr, "\n"); p += nobj; } point_printf(stderr, p, nobj); fprintf(stderr, "\n"); } __unused static void eaf_check_polygons(eaf_polygon_t *p, int nobj) { // This only works for 2 objectives. assert(nobj == 2); // Check #1: Polygons don't intersect // Last point of last polygon const objective_t * end = vector_objective_end(&p->xy); const objective_t * pi = vector_objective_begin(&p->xy); while(pi < end) { const objective_t * pj = next_polygon(pi, nobj, end); const objective_t * next = pj; while(pj < end) { if (polygons_intersect(pi, pj, nobj)) { #if DEBUG_POLYGONS > 0 fprintf(stderr, "ERROR: Polygons intersect!\n"); polygon_print(pi, nobj); polygon_print(pj, nobj); #endif eaf_assert(false); } pj = next_polygon(pj, nobj, end); } pi = next; } // Check #2: Every point in the EAF is a corner of a polygon and it has the // same color as the polygon. //TODO } /* Produce a polygon suitable to be plotted by the polygon function in R. */ eaf_polygon_t * eaf_compute_polygon (eaf_t **eaf, int nlevels) { /* FIXME: Don't add anything if color_0 == 0 */ #define POLY_SIZE_CHECK() \ do { _poly_size_check--; eaf_assert(_poly_size_check >= 4); \ eaf_assert(_poly_size_check % 2 == 0); _poly_size_check = 0; } while(0) #define eaf_point(A,K) (eaf[(A)]->data + (K) * nobj) #define push_point_color(X, Y, C) \ do { vector_objective_push_back (&polygon->xy, (X)); \ vector_objective_push_back (&polygon->xy, (Y)); \ _poly_size_check++; PRINT_POINT(X,Y, C); \ } while(0) #define push_point(X, Y) push_point_color(X,Y, INT_MIN) #if DEBUG_POLYGONS > 0 #define EXPENSIVE_CHECK_POLYGONS() eaf_check_polygons(polygon, nobj) #else #define EXPENSIVE_CHECK_POLYGONS() (void)0 #endif #define polygon_close(COLOR) do { \ vector_int_push_back (&polygon->col, COLOR); \ push_point_color(objective_MIN, objective_MIN, COLOR); \ POLY_SIZE_CHECK(); EXPENSIVE_CHECK_POLYGONS(); \ } while(0) int _poly_size_check = 0; int nruns = eaf[0]->nruns; int nobj = eaf[0]->nobj; eaf_assert(nruns % 2 == 0); int max_size = eaf_max_size(eaf, nlevels); int *color; EAF_MALLOC (color, max_size, int); eaf_polygon_t * polygon; EAF_MALLOC(polygon, 1, eaf_polygon_t); vector_objective_ctor (&polygon->xy, max_size); vector_int_ctor (&polygon->col, max_size); for (int b = 1; b < nlevels; b++) { const int a = b - 1; const int eaf_a_size = eaf[a]->size; const int eaf_b_size = eaf[b]->size; init_colors(color, eaf[a], eaf_a_size, nruns); /* Find color transitions along the EAF level set. */ objective_t topleft_y = objective_MAX; int last_b = -1; int ka = 0; while (true) { const objective_t * pka = NULL; const objective_t * pkb = NULL; int kb = last_b + 1; // Find a point in a that does not overlap with a point in b while (ka < eaf_a_size && kb < eaf_b_size) { pka = eaf_point (a, ka); pkb = eaf_point (b, kb); if (pkb[0] != pka[0]) break; // They overlap in x, so we will skip kb, remember it. topleft_y = pkb[1]; last_b = kb; if (pkb[1] == pka[1]) { /* Ignore points that exactly overlap. */ // FIXME: This should not happen, but it does. We should remove these points. // eaf_assert(false); ka++; kb++; } else { /* b intersects a above pka. */ eaf_assert(pkb[1] > pka[1]); kb++; break; } } /* Everything in A was overlapping. */ if (ka == eaf_a_size) break; objective_t prev_pka_y = topleft_y; int color_0 = color[ka]; /* Print points and corners until we reach a different color. */ do { pka = eaf_point (a, ka); /* Find the point in B not above the current point in A. */ while (kb < eaf_b_size) { pkb = eaf_point (b, kb); eaf_assert(pkb[0] > pka[0]); if (pkb[1] <= pka[1]) break; kb++; } eaf_assert(pka[1] < prev_pka_y); push_point (pka[0], prev_pka_y); push_point (pka[0], pka[1]); prev_pka_y = pka[1]; ka++; if (kb < eaf_b_size && ka < eaf_a_size) { const objective_t * pka_next = eaf_point (a, ka); eaf_assert (pkb[0] > pka[0]); eaf_assert (pkb[1] <= pka[1]); if (pkb[0] <= pka_next[0]) { /* If B intersects with A, stop here. */ eaf_assert(pkb[1] == pka[1] || pkb[0] == pka_next[0]); eaf_assert (prev_pka_y >= pkb[1]); break; } } /* FIXME: When is color_0 != color[ka] if they are in the same eaf level ? */ } while (ka < eaf_a_size && color_0 == color[ka]); /* pka is the point before changing color, but ka is the position after. */ if (ka == eaf_a_size) {/* We reached the end of eaf_a */ /* We don't have to go down the other side since eaf_a completely dominates eaf_b, so just start by the end. */ if (last_b == eaf_b_size - 1) { /* The last point we skipped was the last point, so there is nothing on the other side, just create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, topleft_y); eaf_assert(topleft_y > pka[1]); } else { kb = eaf_b_size - 1; pkb = eaf_point(b, kb); eaf_assert (pkb[1] >= pka[1]); if (pkb[1] > pka[1]) { // Create two points in the infinity to jump from a to b (turn the corner). /* If pkb is above pkda, then it may happen that pkb[0] <= pka[0] if pkb is dominated by a previous pka. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, pkb[1]); eaf_assert (pkb[1] <= topleft_y); } else { // If they are at the same y-level, then pka must be to // the left, otherwise we should have found the // intersection earlier and something is wrong. eaf_assert(pkb[0] > pka[0]); } /* Now print in reverse. */ objective_t prev_pkb_x = pkb[0]; push_point (pkb[0], pkb[1]); kb--; while (kb > last_b) { pkb = eaf_point(b, kb); eaf_assert (pkb[1] > pka[1]); // pkb cannot be below pka push_point (prev_pkb_x, pkb[1]); push_point (pkb[0], pkb[1]); prev_pkb_x = pkb[0]; kb--; } push_point (pkb[0], topleft_y); eaf_assert (topleft_y > pkb[1]); } /* last_b = eaf_b_size - 1; */ polygon_close(color_0); /* DONE */ break; /* Really done! */ } else { if (kb == eaf_b_size) { eaf_assert (pka[1] < topleft_y); /* There is nothing on the other side, just create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, topleft_y); last_b = eaf_b_size - 1; } else { // This polygon is bounded above by eaf_b from last_b up to kb. eaf_assert (kb < eaf_b_size); pkb = eaf_point (b, kb); // If we have not finished eaf_b is because pkb is not above pka eaf_assert (pkb[1] <= pka[1]); eaf_assert (pkb[0] != pka[0]); /* If pkb and pka are in the same horizontal, pkb does not affect the next polygon. Otherwise, it does. */ int save_last_b = (pkb[1] == pka[1]) ? kb : kb - 1; /* Now print eaf_b in reverse. */ objective_t prev_pkb_x = pkb[0]; push_point (pkb[0], pka[1]); kb--; while (kb > last_b) { pkb = eaf_point (b, kb); // pkb must be above pka or we would have found the // intersection earlier. eaf_assert (pkb[1] > pka[1]); push_point (prev_pkb_x, pkb[1]); push_point (pkb[0], pkb[1]); prev_pkb_x = pkb[0]; kb--; } push_point (pkb[0], topleft_y); eaf_assert (topleft_y > pkb[1]); last_b = save_last_b; } polygon_close(color_0); /* DONE */ eaf_assert(topleft_y >= pka[1]); topleft_y = pka[1]; } } } free (color); #if DEBUG >= 1 eaf_check_polygons(polygon, nobj); // This is slow with lots of polygons #endif return polygon; } /* FIXME: This version does not care about intersections, which is much simpler, but it produces artifacts when plotted with the polygon function in R. */ eaf_polygon_t * eaf_compute_polygon_old (eaf_t **eaf, int nlevels) { int _poly_size_check = 0; eaf_polygon_t * polygon; int *color; int max_size = eaf_max_size(eaf, nlevels); int nruns = eaf[0]->nruns; int nobj = eaf[0]->nobj; eaf_assert(nruns % 2 == 0); EAF_MALLOC (color, max_size, int); EAF_MALLOC(polygon, 1, eaf_polygon_t); vector_objective_ctor (&polygon->xy, max_size); vector_int_ctor (&polygon->col, max_size); for (int b = 1; b < nlevels; b++) { const int a = b - 1; int eaf_a_size = eaf[a]->size; int eaf_b_size = eaf[a + 1]->size; init_colors(color, eaf[a], eaf_a_size, nruns); /* Find color transitions along the EAF level set. */ int last_b = -1; objective_t topleft_y = objective_MAX; int ka = 0; while (ka < eaf_a_size) { objective_t prev_pka_y = topleft_y; const objective_t * pka; /* Print points and corners until we reach a different color. */ int color_0 = color[ka]; do { pka = eaf_point (a, ka); push_point (pka[0], prev_pka_y); push_point (pka[0], pka[1]); prev_pka_y = pka[1]; ka++; } while (ka < eaf_a_size && color_0 == color[ka]); /* pka is the point before changing color, but ka is the position after. */ if (ka == eaf_a_size) {/* We reached the end of eaf_a */ /* We don't have to go down the other side since eaf_a completely dominates eaf_b, so just start by the end. */ int kb = eaf_b_size - 1; if (last_b == kb) { /* There is nothing on the other side, just create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, topleft_y); } else { const objective_t * pkb = eaf_point(a + 1, kb); eaf_assert (pkb[1] >= pka[1]); if (pkb[1] > pka[1]) { /* Create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, pkb[1]); } objective_t prev_pkb_x = pkb[0]; push_point (pkb[0], pkb[1]); kb--; while (kb > last_b) { pkb = eaf_point(a + 1, kb); push_point (prev_pkb_x, pkb[1]); push_point (pkb[0], pkb[1]); prev_pkb_x = pkb[0]; kb--; } push_point (pkb[0], topleft_y); last_b = eaf_b_size - 1; } polygon_close(color_0); /* DONE */ } else { int kb = last_b + 1; /* Different color, go down by the other side until reaching this point. */ if (kb == eaf_b_size) { /* There is nothing on the other side, just create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, topleft_y); polygon_close(color_0); /* DONE */ } else { const objective_t * pkb; do { pkb = eaf_point (b, kb); if (pkb[1] <= pka[1]) break; kb++; } while (kb < eaf_b_size); int save_last_b = kb - 1; if (kb == eaf_b_size) { /* There is nothing on the other side, just create two points in the infinity. */ push_point (objective_MAX, pka[1]); push_point (objective_MAX, pkb[1]); } else {/* pkb_y <= pka_y */ objective_t prev_pkb_x = pkb[0]; push_point (pkb[0], pka[1]); /* Now print in reverse. */ kb--; while (kb > last_b) { pkb = eaf_point (b, kb); push_point (prev_pkb_x, pkb[1]); push_point (pkb[0], pkb[1]); prev_pkb_x = pkb[0]; kb--; } push_point (pkb[0], topleft_y); } polygon_close(color_0); /* DONE */ last_b = save_last_b; } } topleft_y = pka[1]; } } free (color); return polygon; } #undef eaf_point #undef push_point #undef polygon_close #undef PRINT_POINT #undef POLY_SIZE_CHECK void eaf_print_polygon (FILE *stream, eaf_t **eaf, int nlevels) { eaf_polygon_t *p = eaf_compute_area (eaf, nlevels); for(size_t i = 0; i < vector_objective_size(&p->xy); i += 2) { point2d_printf(stream, vector_objective_at(&p->xy, i), vector_objective_at(&p->xy, i + 1)); fprintf(stream, "\n"); } fprintf (stream, "# col ="); for (size_t k = 0; k < vector_int_size (&p->col); k++) fprintf (stream, " %d", vector_int_at(&p->col, k)); fprintf (stream, "\n"); vector_objective_dtor (&p->xy); vector_int_dtor (&p->col); free(p); } static size_t rectangle_add(eaf_polygon_t * regions, objective_t lx, objective_t ly, objective_t ux, objective_t uy, int color) { #if 0 printf("rectangle_add: (" point_printf_format ", " point_printf_format ", " point_printf_format ", " point_printf_format ")[%d]\n", lx, ly, ux, uy, color); #endif eaf_assert(lx < ux); eaf_assert(ly < uy); vector_objective *rect = ®ions->xy; vector_objective_push_back(rect, lx); vector_objective_push_back(rect, ly); vector_objective_push_back(rect, ux); vector_objective_push_back(rect, uy); vector_int_push_back(®ions->col, color); return vector_objective_size(rect); } eaf_polygon_t * eaf_compute_rectangles (eaf_t **eaf, int nlevels) { #define eaf_point(A,K) (eaf[(A)]->data + (K) * nobj) #if 0 #define printf_points(ka,kb,pka,pkb) \ printf("%4d: pa[%d]=(" point_printf_format ", " point_printf_format "), pb[%d] = (" point_printf_format ", " point_printf_format ")\n", \ __LINE__, ka, pka[0], pka[1], kb, pkb[0], pkb[1]) #else #define printf_points(ka,kb,pka,pkb) #endif int nruns = eaf[0]->nruns; const int nobj = eaf[0]->nobj; eaf_assert(nruns % 2 == 0); int max_size = eaf_max_size(eaf, nlevels); int *color; EAF_MALLOC (color, max_size, int); eaf_polygon_t * regions; EAF_MALLOC(regions, 1, eaf_polygon_t); vector_objective_ctor (®ions->xy, max_size); vector_int_ctor (®ions->col, max_size); for (int b = 1; b < nlevels; b++) { const int a = b - 1; const int eaf_a_size = eaf[a]->size; const int eaf_b_size = eaf[b]->size; if (eaf_a_size == 0 || eaf_b_size == 0) continue; // FIXME: Skip points with color 0? init_colors(color, eaf[a], eaf_a_size, nruns); objective_t top = objective_MAX; int ka = 0, kb = 0; const objective_t * pkb = eaf_point (b, kb); const objective_t * pka = eaf_point (a, ka); printf_points(ka, kb, pka, pkb); while (true) { while (pka[1] < pkb[1]) { if (pka[0] < pkb[0]) // pka strictly dominates pkb rectangle_add(regions, pka[0], pkb[1], pkb[0], top, color[ka]); top = pkb[1]; kb++; if (kb >= eaf_b_size) goto close_eaf; pkb = eaf_point (b, kb); printf_points(ka, kb, pka, pkb); } // pka_above_equal_pkb: if (pka[0] < pkb[0]) { // pka does not strictly dominate pkb rectangle_add(regions, pka[0], pka[1], pkb[0], top, color[ka]); } else { // Skip repeated points eaf_assert(pka[0] == pkb[0] && pka[1] == pkb[1]); } top = pka[1]; ka++; if (ka >= eaf_a_size) goto next_eaf; pka = eaf_point (a, ka); printf_points(ka, kb, pka, pkb); if (pkb[1] == top) { // pkb was not above but equal to previous pka // Move to next pkb kb++; if (kb >= eaf_b_size) goto close_eaf; pkb = eaf_point (b, kb); printf_points(ka, kb, pka, pkb); } } close_eaf: // b is finished, add one rectangle for each pka point. while (true) { eaf_assert(pka[1] < pkb[1]); rectangle_add(regions, pka[0], pka[1], objective_MAX, top, color[ka]); top = pka[1]; ka++; if (ka >= eaf_a_size) break; pka = eaf_point (a, ka); printf_points(ka, kb, pka, pkb); } next_eaf: continue; } return regions; #undef eaf_point } eaf/src/eaf/gcc.mk0000644000176200001440000000146114660712342013423 0ustar liggesusers# -*- Makefile-gmake -*- WARN_CFLAGS = -pedantic -Wall -Wextra -Wvla SANITIZERS= -fsanitize=undefined -fsanitize=address ifeq ($(DEBUG), 0) OPT_CFLAGS ?= -O3 -flto -DNDEBUG # Options -funroll-loops -ffast-math -msse -mfpmath=sse improve performance but are not portable. # Options -fstandard-precision=fast -ftree-vectorize are not well # supported in some versions/architectures. else OPT_CFLAGS += -g3 -O0 $(SANITIZERS) endif ifdef march MARCH=$(march) endif ifndef MARCH MARCH=native endif gcc-guess-march = $(strip $(shell $(CC) -march=$(MARCH) $(CFLAGS) -x c -S -\#\#\# - < /dev/null 2>&1 | \ grep -m 1 -e cc1 | grep -o -e "march=[^'\"]*" | head -n 1 | sed 's,march=,,')) ifeq ($(gcc-guess-march),) gcc-guess-march=unknown endif ifneq ($(MARCH),none) OPT_CFLAGS += -march=$(MARCH) endif eaf/src/eaf/eaf3d.c0000644000176200001440000006000314660712342013461 0ustar liggesusers/************************************************************************* eaf3d: Compute the empirical attainment function from a sequence of non-dominated point sets (three-objective case) --------------------------------------------------------------------- Copyright (c) 2009-2011 Andreia Guerreiro Carlos M. Fonseca Luis Paquete Manuel Lopez-Ibanez This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- *************************************************************************/ #include "eaf.h" #include "avl.h" #include #include #include #include #include #include #define max( a, b ) ( ((a) > (b)) ? (a) : (b) ) typedef struct dlnode { objective_t *x; /* The data vector */ struct dlnode *next; struct dlnode *prev; int set; } dlnode_t; typedef struct removed_list { avl_node_t *head; } removed_list_t; static removed_list_t * removed_list; /* static bool avl_tree_is_empty (const avl_tree_t *avltree) { return avltree->top == NULL; } */ static inline objective_t *node_point(const avl_node_t *node) { return (objective_t*) node->item; } static int compare_node(const void *p1, const void *p2) { const objective_t x1 = *((*(const dlnode_t **)p1)->x); const objective_t x2 = *((*(const dlnode_t **)p2)->x); return (x1 < x2) ? -1 : ( x1 > x2 ) ? 1 : 0; } /* Create a list of points, ordered by the third coordinate. */ static dlnode_t * setup_cdllist(objective_t *data, int d, const int *cumsize, int nsets) { int n = cumsize[nsets - 1]; dlnode_t *head = malloc ((n + 1) * sizeof(dlnode_t)); head->x = data; head[0].set = 0; int i, k; for (i = 0, k = 0; i < n; i++) { if (i == cumsize[k]) k++; head[i+1].set = k; // ->x points to the first coordinate of each point. head[i+1].x = head[i].x + d ;// this will be fixed a few lines below... head[i+1].next = head[i].next; head[i+1].prev = head[i].prev; } head->x = NULL; // head contains no data dlnode_t **scratch = malloc(n * sizeof(dlnode_t*)); for (i = 0; i < n; i++) scratch[i] = head + i + 1; // ->x points to the last coordinate of each point. for (i = 0; i < n; i++) scratch[i]->x--; // Sort according to the last coordinate. qsort(scratch, n, sizeof(dlnode_t*), compare_node); head->next = scratch[0]; scratch[0]->prev = head; for (i = 1; i < n; i++) { scratch[i-1]->next = scratch[i]; scratch[i]->prev = scratch[i-1]; } scratch[n-1]->next = head; head->prev = scratch[n-1]; // ->x points to the first coordinate. for (i = 0; i < n; i++) scratch[i]->x -= d - 1; free(scratch); return head; } /* FIXME: Why this variant in one single indirection and the eaf2d equivalent is 2. */ static int compare_tree_asc_x(const void *p1, const void *p2) { const objective_t x1 = *((const objective_t *)p1); const objective_t x2 = *((const objective_t *)p2); return (x1 < x2) ? -1 : (x1 > x2) ? 1 : 0; } static int compare_tree_desc_y( const void *p1, const void *p2) { const objective_t y1 = *((const objective_t *)p1+1); const objective_t y2 = *((const objective_t *)p2+1); return (y1 > y2) ? -1 : (y1 < y2) ? 1 : 0; } static int avl_search_closest_y(const avl_tree_t *avltree, const void *item, avl_node_t **avlnode) { avl_node_t *node; int c; if(!avlnode) avlnode = &node; node = avltree->top; if(!node) { *avlnode = NULL; return 0; } do { c = compare_tree_desc_y(item, node->item); if (c < 0) { if(node->left) node = node->left; else { *avlnode = node; return -1; } } else if (c > 0) { if(node->right) node = node->right; else { *avlnode = node; return 1; } } else { *avlnode = node; return 0; } } while(true); } static void find_all_promoters(avl_node_t * avlnode, int * dom_sets, int nruns) { avl_node_t *node = avlnode; while (node != NULL) { dom_sets[node->set] = 1; if (node->remover != NULL) find_all_promoters(node->remover, dom_sets, nruns); node = node->promoter; } node = avlnode->equal; while (node != NULL) { dom_sets[node->set] = 1; node = node->equal; } } /* Prints the list in the tree, ordered by the second dimension, from the highest value to the lowest. The values printed are the values from dimension 0 to dimension dim of each point */ static void printlist(avl_tree_t *avltree, int dim, FILE *outfile) { avl_node_t *aux; aux = avltree->head; int i; objective_t * val; while(aux){ val = (objective_t *)aux->item; //printf("-> "); for(i = 0; i < dim; i++){ fprintf(outfile, point_printf_format "\t", val[i]); } fprintf(outfile, "\n"); aux = aux->next; } } void printset(FILE* stream, avl_tree_t **set, int nset) { int i; fprintf(stream, "# sets\n----------------------\n"); for(i = 0; i < nset; i++){ if(set[i]->top != NULL) { fprintf (stream, "set: %d", i); printlist(set[i], 3, stream); } } } void printlevel(FILE * stream, avl_tree_t **level, int nset) { int i; fprintf (stream, "#levels\n-------------------\n"); for(i = 0; i < nset; i++){ if(level[i]->top != NULL){ fprintf (stream, "level: %d\n", i); printlist(level[i], 3, stream); } } } static int printlist_points_indic(avl_tree_t *avltree, int dim, int nruns, FILE *outfile, FILE *outfileindic) { avl_node_t *aux; aux = avltree->head; int * dom_sets = (int *) malloc(nruns * sizeof(int)); int i, k, totalp = 0; objective_t * val; while(aux){ val = (objective_t *)aux->item; if(outfile){ fprintf(outfile, point_printf_format, val[0]); for(i = 1; i < dim; i++){ fprintf(outfile, "\t" point_printf_format, val[i]); } fprintf(outfile, (outfile == outfileindic) ? "\t" : "\n"); } if(outfileindic){ for(k = 0; k < nruns; k++) dom_sets[k] = 0; find_all_promoters(aux, dom_sets, nruns); fprintf(outfileindic, "%d", dom_sets[0]); for(k = 1; k < nruns; k++){ fprintf(outfileindic, "\t%d", dom_sets[k]); } fprintf(outfileindic, "\n"); } aux = aux->next; totalp++; } free(dom_sets); return totalp; } /* Returns the total number of points printed */ int printoutput(avl_tree_t **level, int nset, int d, FILE **outfile, int noutfiles, FILE **outfileindic, int noutfilesi, int * attlevel, int nlevels){ int i, k, f, fi, totalp = 0; for(i = 0; i < nlevels; i++){ k = attlevel[i] - 1; f = (noutfiles > 1) ? i : 0; fi = (noutfilesi > 1) ? i : 0; if(level[k]->head != NULL){ totalp += printlist_points_indic(level[k], d, nset, (outfile ? outfile[f] : NULL), (outfileindic ? outfileindic[fi] : NULL)); } if(i < nlevels -1){ if(outfile) fprintf(outfile[f], "\n"); if(outfileindic && (outfile == NULL || outfile[f] != outfileindic[fi])){ fprintf(outfileindic[fi], "\n"); } } } return totalp; } static void print_list_indic(avl_tree_t * level, int nruns, FILE * indicfile){ int * dom_sets = (int *) malloc(nruns * sizeof(int)); avl_node_t * avlnode; avlnode = level->head; int i; while(avlnode){ for(i = 0; i < nruns; i++){ dom_sets[i] = 0; } find_all_promoters(avlnode, dom_sets, nruns); for(i = 0; i < nruns; i++){ fprintf(indicfile, "%d\t", dom_sets[i]); } fprintf(indicfile, "\n"); avlnode = avlnode->next; } free(dom_sets); } void printindic(avl_tree_t ** levels, int nruns, FILE ** indicfile, int nfiles, int * attlevel, int nlevels){ int i, k, f; for(i=0; i < nlevels; i++){ k = attlevel[i] - 1; f = (nfiles == 1) ? 0 : i; if(levels[k]->head != NULL){ print_list_indic(levels[k], nruns, indicfile[f]); } fprintf(indicfile[f], "\n"); } } void printitem(FILE * stream, objective_t *value, int dim) { int i; for (i = 0; i < dim; i++) fprintf (stream, "%f ", value[i]); fprintf (stream, "\n"); } void add2output(avl_tree_t *output, avl_node_t *tnode) { if(output->top != NULL){ output->tail->next = tnode; output->tail = tnode; }else{ avl_insert_top(output, tnode); } } void add2output_all(avl_tree_t *output, avl_tree_t *tree_add){ avl_node_t *node = tree_add->head; avl_unlink_node(tree_add, node); free(node->item); free(node); node = tree_add->tail; avl_unlink_node(tree_add, node); free(node->item); free(node); if(tree_add->head != NULL){ if(output->tail != NULL){ output->tail->next=tree_add->head; }else{ output->head=tree_add->head; } } } //this fuction is called only when item isn't dominated by any point in tree. //note: prevnode is above and at item's left, so any dominated point that it may dominate is at its right static void add2set(avl_tree_t *tree, avl_node_t *prevnode, avl_node_t *tnode, objective_t *item) { avl_init_node (tnode, item); if(node_point(prevnode)[0] == item[0]) prevnode = prevnode->prev; avl_insert_after (tree, prevnode, tnode); tnode = tnode->next; // tnode->next is dominated by item while (node_point(tnode)[1] >= item[1]) { avl_unlink_node(tree, tnode); avl_node_t *node = tnode; tnode = tnode->next; free(node); } } static void avl_add_promoter(avl_node_t *avlnode, int set, avl_node_t *promoter) { avlnode->set = set; avlnode->promoter = promoter; avlnode->remover = NULL; avlnode->equal = NULL; } static void add_removed(avl_node_t *node) { node->next = removed_list->head; removed_list->head = node; } static avl_node_t * add2level(avl_tree_t *tree, objective_t *item, avl_tree_t *output, int set, avl_node_t * promoter) { avl_node_t *prevnode; avl_node_t *aux; switch (avl_search_closest_y(tree, item, &prevnode)) { case -1: prevnode = prevnode->prev; break; case 0: prevnode = (node_point(prevnode)[0] > item[0]) ? prevnode : prevnode->prev; break; case 1: break; } //aux represents the point immediately below item. aux = prevnode->next; // A new point (item) is added, but only if it isn't dominated. if (node_point(aux)[0] > item[0]) { avl_node_t *tnode = malloc(sizeof(avl_node_t)); avl_init_node(tnode, item); avl_add_promoter(tnode, set, promoter); avl_node_t *newnode = tnode; avl_insert_after(tree, prevnode, tnode); tnode = tnode->prev; // tnode->prev is dominated by item while (node_point(tnode)[0] >= item[0]) { avl_unlink_node(tree,tnode); aux = tnode; tnode = tnode->prev; if (node_point(aux)[2] < item[2]) add2output(output, aux); else{ free(aux->item); add_removed(aux); aux->remover = newnode; } /* Each point that is removed from this level, becomes a final point but only if the point that dominates it (item) dominates it only from dimension 0 to 1. */ } return newnode; } else{ free(item); return NULL; } } static objective_t * copy_point(const objective_t * v) { objective_t *value = malloc(3 * sizeof(objective_t)); value[0] = v[0]; value[1] = v[1]; value[2] = v[2]; return value; } //at left or equal static avl_node_t * find_point_at_left(avl_tree_t *tree, objective_t *item){ avl_node_t *leftNode; if (avl_search_closest(tree, item, &leftNode) < 0) leftNode = leftNode->prev; return leftNode; } //below and not equal static avl_node_t * find_point_below(avl_tree_t *tree, objective_t *item){ avl_node_t *belowNode; if (avl_search_closest_y(tree, item, &belowNode) >= 0) belowNode = belowNode->next; return belowNode; } static objective_t * new_point(objective_t x1, objective_t x2, objective_t x3) { objective_t *value = malloc(3 * sizeof(objective_t)); value[0] = x1; value[1] = x2; value[2] = x3; return value; } void eaf3df(dlnode_t *list, avl_tree_t **set, avl_tree_t **level, avl_tree_t **output, int nset) { // point from some level immediately at new's left, corresponds to r in pseudocode avl_node_t *leftNodeL; struct aux_nodes { /* levelNode[t] is the point being verified (possibly to be promoted) from level t, corresponds to s_t in pseudocode */ avl_node_t *levelNode; /* these points are needed to represent the intersections of new with the point, of each level, immediately at new's left */ avl_node_t intersectNode; objective_t intersectValues[2]; avl_node_t * promoter; }; struct aux_nodes * aux = malloc(sizeof(struct aux_nodes) * nset); dlnode_t *new = list->next; //new - represents the new point //add new to its set avl_node_t * tnode = avl_init_node(malloc(sizeof(avl_node_t)), new->x); avl_insert_after(set[new->set], set[new->set]->head, tnode); //new is the only point so far, so it is added to the first level tnode = avl_init_node(malloc(sizeof(avl_node_t)), copy_point(new->x)); avl_add_promoter(tnode, new->set, NULL); avl_insert_after(level[0], level[0]->head, tnode); bool * mask = malloc(sizeof(bool) * nset); // needed to know how many different sets were considered so far memset(mask, false, nset * sizeof(mask[0])); mask[new->set] = true; int start_at = 0, stop_at; // indicates which levels must be verified (from and to which) // Points are sorted in ascending order with respect to the third coordinate. while (new->next->x != NULL) { new = new->next; /* newPrev: point from new's set immediately at its left, it corresponds to q in pseudocode. */ avl_node_t *newPrev = find_point_at_left(set[new->set], new->x); // if new is dominated by a point from its set, skip it. if (node_point(newPrev)[1] <= new->x[1]) { continue; } avl_node_t *dom_new = NULL; stop_at = 0; // First part int k; for(k = start_at; k >= stop_at; k--) { leftNodeL = find_point_at_left(level[k], new->x); // new is dominated by a point from level k if (node_point(leftNodeL)[1] <= new->x[1]) { dom_new = leftNodeL; stop_at = k + 1; } else if (node_point(leftNodeL)[1] < node_point(newPrev)[1]) { /* the intersection point of new with the point in level k immediately at new's left should be added to level k+1, so this intersection point is saved in levelNode in order to be added later */ aux[k].intersectValues[0] = new->x[0]; aux[k].intersectValues[1] = node_point(leftNodeL)[1]; aux[k].intersectNode.item = aux[k].intersectValues; aux[k].intersectNode.next = leftNodeL->next; aux[k].levelNode = &(aux[k].intersectNode); aux[k].promoter = leftNodeL; } else { aux[k].levelNode = find_point_below(level[k], newPrev->item); aux[k].promoter = aux[k].levelNode; } } /* setNode: a point from new's set at its right, it also corresponds to q in pseudocode. */ avl_node_t *setNode = newPrev; //Second part do { setNode = setNode->next; objective_t lbound = max(node_point(setNode)[1], new->x[1]); for (k = start_at; k >= stop_at; k--) { //while levelNode is dominated by new but not by any point from new's set, levelNode is promoted while (node_point(aux[k].levelNode)[1] >= lbound && (node_point(aux[k].levelNode)[1] > lbound || lbound > new->x[1])) { if (node_point(setNode)[0] <= node_point(aux[k].levelNode)[0]) { aux[k].levelNode = find_point_below(level[k], setNode->item); aux[k].promoter = aux[k].levelNode; } else { objective_t *value = new_point(node_point(aux[k].levelNode)[0], node_point(aux[k].levelNode)[1], new->x[2]); tnode = add2level(level[k+1], value, output[k+1], new->set, aux[k].promoter); if(tnode != NULL && new->x[2] == node_point(aux[k].promoter)[2] && node_point(aux[k].levelNode)[0] == node_point(aux[k].promoter)[0]){ aux[k].promoter->equal = tnode; } aux[k].levelNode = aux[k].levelNode->next; aux[k].promoter = aux[k].levelNode; } } } } while(node_point(setNode)[1] > new->x[1]); //Third part for(k = start_at; k >= stop_at; k--){ //if the intersection point of new with the point from level k immediately below new //isn't dominated, it is added to level k+1 if(node_point(aux[k].levelNode)[0] < node_point(setNode)[0]){ objective_t *value =new_point(node_point(aux[k].levelNode)[0], new->x[1], new->x[2]); tnode = add2level(level[k+1], value, output[k+1], new->set, aux[k].promoter); if (tnode != NULL && new->x[2] == node_point(aux[k].levelNode)[2] && new->x[1] == node_point(aux[k].levelNode)[1]){ aux[k].promoter->equal = tnode; } } } //add new to its set tnode = avl_init_node(malloc(sizeof(avl_node_t)), new->x); add2set(set[new->set], newPrev, tnode, new->x); //add new to the lowest level where it isn't dominated by any point from that level tnode = add2level(level[stop_at], copy_point(new->x), output[stop_at], new->set, dom_new); if(stop_at > 0 && tnode != NULL && new->x[2] == node_point(dom_new)[2] && new->x[1] == node_point(dom_new)[1] && new->x[0] == node_point(dom_new)[0]){ dom_new->equal = tnode; } if (!mask[new->set]) { if (start_at < (nset - 2)) start_at++; mask[new->set] = true; } } free(mask); free(aux); } static void freetree(avl_tree_t *avltree) { avl_node_t *aux, *aux2; aux=avltree->head; if(aux){ while(aux){ aux2 = aux; aux = aux2->next; free(aux2->item); free(aux2); } } free(avltree); } static void freetree2(avl_tree_t *avltree) { avl_node_t *aux, *aux2; aux=avltree->head; free(aux->item); while(aux->next){ aux2 = aux; aux = aux2->next; free(aux2); } free(aux->item); free(aux); free(avltree); } static void free_removed(removed_list_t * removed_list) { avl_node_t * aux, * node = removed_list->head; while(node != NULL){ aux = node; node = node->next; free(aux); } free(removed_list); } __unused static void freeoutput(avl_tree_t **output, int nset) { int i; for(i = 0; i < nset; i++){ freetree(output[i]); } free(output); free_removed(removed_list); } void add_sentinels(avl_tree_t * tree, int n) { objective_t *value = malloc(n * sizeof(objective_t)); value[0] = objective_MIN; value[1] = objective_MAX; avl_node_t *tnode = avl_init_node(malloc(sizeof(avl_node_t)), value); avl_insert_top(tree, tnode); value = malloc(n * sizeof(objective_t)); value[0] = objective_MAX; value[1] = objective_MIN; avl_node_t *tnode2 = avl_init_node(malloc(sizeof(avl_node_t)), value); avl_insert_after(tree, tnode, tnode2); } static void eaf_store_point_3d (eaf_t * eaf, objective_t x, objective_t y, objective_t z, const int *save_attained) { const int nobj = 3; objective_t * pos = eaf_store_point_help (eaf, nobj, save_attained); pos[0] = x; pos[1] = y; pos[2] = z; eaf->size++; } eaf_t ** eaf3d (objective_t *data, const int *cumsize, int nruns, const int *attlevel, const int nlevels) { const int nobj = 3; const int ntotal = cumsize[nruns - 1]; /* total number of points in data */ avl_tree_t **set = malloc (nruns * sizeof(avl_tree_t)); avl_tree_t **level = malloc (nruns * sizeof(avl_tree_t)); avl_tree_t **output = malloc (nruns * sizeof(avl_tree_t)); int i; for (i = 0; i < nruns; i++) { set[i] = avl_alloc_tree ((avl_compare_t) compare_tree_asc_x, (avl_freeitem_t) free); level[i] = avl_alloc_tree ((avl_compare_t) compare_tree_asc_x, (avl_freeitem_t) free); output[i] = avl_alloc_tree ((avl_compare_t) compare_tree_asc_x, (avl_freeitem_t) free); add_sentinels(set[i], nobj); add_sentinels(level[i], nobj); } removed_list = (removed_list_t *) malloc(sizeof(removed_list_t)); removed_list->head = NULL; dlnode_t *list = setup_cdllist(data, nobj, cumsize, nruns); eaf3df(list, set, level, output, nruns); for (i = 0; i < nruns; i++) { add2output_all(output[i], level[i]); } for(i=0; ihead; while (aux) { objective_t * val = aux->item; for(int j = 0; j < nruns; j++) attained[j] = 0; find_all_promoters(aux, attained, nruns); eaf_store_point_3d (eaf[l], val[0], val[1], val[2], attained); aux = aux->next; } } return eaf; } eaf/src/eaf/bit_array.h0000644000176200001440000000655314660712342014472 0ustar liggesusers/* A better implementation https://github.com/noporpoise/BitArray */ #include #include #include // malloc, calloc #include // memcpy #include "common.h" // fatal_error typedef uint64_t bit_array, bit_array_word_t; typedef uint8_t word_offset_t; // Offset within a 64 bit word // number of bits per word static const size_t bit_array_word_size = sizeof(bit_array_word_t) * 8; static inline size_t bitset_index(const bit_array *b, size_t pos) { return(pos % (sizeof(*b)*8)); } static inline size_t bitset_word(const bit_array *b, size_t pos) { return(pos / (sizeof(*b)*8)); } static inline bit_array bitset_mask(size_t k) { return (bit_array)((bit_array)1 << k); } static inline void bit_array_set_one(bit_array * b, size_t i) { b[bitset_word(b, i)] |= bitset_mask(bitset_index(b,i)); } static inline void bit_array_set_zero(bit_array * b, size_t i) { b[bitset_word(b,i)] &=~ bitset_mask(bitset_index(b,i)); } static inline char bit_array_get(const bit_array * b, size_t i) { return (b[bitset_word(b,i)] >> bitset_index(b,i)) & 0x1; } static inline size_t bit_nwords(size_t nbits) { return (nbits + bit_array_word_size - 1) / bit_array_word_size; } static inline size_t bit_array_bytesize(size_t n) { return sizeof(bit_array_word_t) * bit_nwords(n); } static inline bit_array * bit_array_alloc(size_t n) { //fprintf(stderr, "n= %ld, word_size = %ld size = %ld\n", n, bit_array_word_size, bit_nwords(n)); return (bit_array *) malloc(bit_array_bytesize(n)); } static inline bit_array * bit_array_calloc(size_t n) { //fprintf(stderr, "word_size = %ld size = %ld", bit_array_word_size, bit_nwords(n)); return (bit_array *) calloc(bit_nwords(n), sizeof(bit_array_word_t)); } static inline bit_array * bit_array_realloc(bit_array *b, size_t n) { //fprintf(stderr, "word_size = %ld size = %ld", bit_array_word_size, bit_nwords(n)); return (bit_array *) realloc(b, bit_array_bytesize(n)); } static inline void bit_array_zero_all(bit_array *b, size_t n) { memset(b, 0, sizeof(bit_array_word_t) * bit_nwords(n)); } static inline void bit_array_set(bit_array * b, size_t i, bool x) { x ? bit_array_set_one(b, i) : bit_array_set_zero(b, i); } static inline void bitset_check(const bit_array *b __unused, const bool * ref __unused, size_t n) { for(size_t i = 0; i < n; i++) { if (bit_array_get(b, i) != ref[i]) { fatal_error("bit_array_check_failed at %lu: %d != %d : %lu!\n", (unsigned long) i, bit_array_get(b, i), ref[i], (unsigned long) n); } } } static inline bit_array * bit_array_offset(bit_array *b, size_t k, size_t nbits) { return b + k * bit_nwords(nbits); } static inline void bit_array_check (bit_array *b, const bool * ref, size_t n, size_t nbits) { for (size_t k = 0; k < n; k++) { // fprintf(stderr,"checking: k=%ld n=%ld, nbits=%ld offset=%ld\n", // k, n, nbits, k * bit_array_bytesize(nbits)); bitset_check(bit_array_offset(b, k, nbits), ref + k * nbits, nbits); } } static inline void bit_array_copy(bit_array * dest, const bit_array *src, size_t n) { memcpy(dest, src, sizeof(bit_array_word_t) * bit_nwords(n)); } static inline void bit_array_fprintf(FILE *stream, bit_array *b, size_t n) { for (size_t k = 0; k < n; k++) { fprintf(stream, "%d", bit_array_get(b, k) ? 1 : 0); } } eaf/src/eaf/avl.c0000644000176200001440000003317714660712342013275 0ustar liggesusers/***************************************************************************** avl.c - Source code for the AVL-tree library. Copyright (C) 1998 Michael H. Buselli Copyright (C) 2000-2002 Wessel Dankers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Augmented AVL-tree. Original by Michael H. Buselli . Modified by Wessel Dankers to add a bunch of bloat to the sourcecode, change the interface and squash a few bugs. Mail him if you find new bugs. *****************************************************************************/ #include #include #include #include "avl.h" static void avl_rebalance(avl_tree_t *, avl_node_t *); #ifdef AVL_COUNT #define NODE_COUNT(n) ((n) ? (n)->count : 0) #define L_COUNT(n) (NODE_COUNT((n)->left)) #define R_COUNT(n) (NODE_COUNT((n)->right)) #define CALC_COUNT(n) (L_COUNT(n) + R_COUNT(n) + 1) #endif #ifdef AVL_DEPTH #define NODE_DEPTH(n) ((n) ? (n)->depth : 0) #define L_DEPTH(n) (NODE_DEPTH((n)->left)) #define R_DEPTH(n) (NODE_DEPTH((n)->right)) #define CALC_DEPTH(n) ((L_DEPTH(n)>R_DEPTH(n)?L_DEPTH(n):R_DEPTH(n)) + 1) #endif #ifndef AVL_DEPTH /* Also known as ffs() (from BSD) */ static int lg(unsigned int u) { int r = 1; if(!u) return 0; if(u & 0xffff0000) { u >>= 16; r += 16; } if(u & 0x0000ff00) { u >>= 8; r += 8; } if(u & 0x000000f0) { u >>= 4; r += 4; } if(u & 0x0000000c) { u >>= 2; r += 2; } if(u & 0x00000002) r++; return r; } #endif static int avl_check_balance(avl_node_t *avlnode) { #ifdef AVL_DEPTH int d; d = R_DEPTH(avlnode) - L_DEPTH(avlnode); return d<-1?-1:d>1?1:0; #else /* int d; * d = lg(R_COUNT(avlnode)) - lg(L_COUNT(avlnode)); * d = d<-1?-1:d>1?1:0; */ #ifdef AVL_COUNT int pl, r; pl = lg(L_COUNT(avlnode)); r = R_COUNT(avlnode); if(r>>pl+1) return 1; if(pl<2 || r>>pl-2) return 0; return -1; #else #error No balancing possible. #endif #endif } #ifdef AVL_COUNT unsigned int avl_count(const avl_tree_t *avltree) { return NODE_COUNT(avltree->top); } avl_node_t *avl_at(const avl_tree_t *avltree, unsigned int index) { avl_node_t *avlnode; unsigned int c; avlnode = avltree->top; while(avlnode) { c = L_COUNT(avlnode); if(index < c) { avlnode = avlnode->left; } else if(index > c) { avlnode = avlnode->right; index -= c+1; } else { return avlnode; } } return NULL; } unsigned int avl_index(const avl_node_t *avlnode) { avl_node_t *next; unsigned int c; c = L_COUNT(avlnode); while((next = avlnode->parent)) { if(avlnode == next->right) c += L_COUNT(next) + 1; avlnode = next; } return c; } #endif int avl_search_closest(const avl_tree_t *avltree, const void *item, avl_node_t **avlnode) { avl_node_t *node; avl_compare_t cmp; int c; if(!avlnode) avlnode = &node; node = avltree->top; if(!node) return *avlnode = NULL, 0; cmp = avltree->cmp; for(;;) { c = cmp(item, node->item); if(c < 0) { if(node->left) node = node->left; else return *avlnode = node, -1; } else if(c > 0) { if(node->right) node = node->right; else return *avlnode = node, 1; } else { return *avlnode = node, 0; } } } /* * avl_search: * Return a pointer to a node with the given item in the tree. * If no such item is in the tree, then NULL is returned. */ avl_node_t *avl_search(const avl_tree_t *avltree, const void *item) { avl_node_t *node; return avl_search_closest(avltree, item, &node) ? NULL : node; } avl_tree_t *avl_init_tree(avl_tree_t *rc, avl_compare_t cmp, avl_freeitem_t freeitem) { if(rc) { rc->head = NULL; rc->tail = NULL; rc->top = NULL; rc->cmp = cmp; rc->freeitem = freeitem; } return rc; } avl_tree_t *avl_alloc_tree(avl_compare_t cmp, avl_freeitem_t freeitem) { return avl_init_tree(malloc(sizeof(avl_tree_t)), cmp, freeitem); } void avl_clear_tree(avl_tree_t *avltree) { avltree->top = avltree->head = avltree->tail = NULL; } void avl_free_nodes(avl_tree_t *avltree) { avl_node_t *node, *next; avl_freeitem_t freeitem; freeitem = avltree->freeitem; for(node = avltree->head; node; node = next) { next = node->next; if(freeitem) freeitem(node->item); free(node); } avl_clear_tree(avltree); } /* * avl_free_tree: * Free all memory used by this tree. If freeitem is not NULL, then * it is assumed to be a destructor for the items referenced in the avl_ * tree, and they are deleted as well. */ void avl_free_tree(avl_tree_t *avltree) { avl_free_nodes(avltree); free(avltree); } static void avl_clear_node(avl_node_t *newnode) { newnode->left = newnode->right = NULL; #ifdef AVL_COUNT newnode->count = 1; #endif #ifdef AVL_DEPTH newnode->depth = 1; #endif } avl_node_t *avl_init_node(avl_node_t *newnode, void *item) { if(newnode) { avl_clear_node(newnode); newnode->item = item; } return newnode; } avl_node_t *avl_insert_top(avl_tree_t *avltree, avl_node_t *newnode) { avl_clear_node(newnode); newnode->prev = newnode->next = newnode->parent = NULL; avltree->head = avltree->tail = avltree->top = newnode; return newnode; } avl_node_t *avl_insert_before(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode) { if(!node) return avltree->tail ? avl_insert_after(avltree, avltree->tail, newnode) : avl_insert_top(avltree, newnode); if(node->left) return avl_insert_after(avltree, node->prev, newnode); avl_clear_node(newnode); newnode->next = node; newnode->parent = node; newnode->prev = node->prev; if(node->prev) node->prev->next = newnode; else avltree->head = newnode; node->prev = newnode; node->left = newnode; avl_rebalance(avltree, node); return newnode; } avl_node_t *avl_insert_after(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode) { if(!node) return avltree->head ? avl_insert_before(avltree, avltree->head, newnode) : avl_insert_top(avltree, newnode); if(node->right) return avl_insert_before(avltree, node->next, newnode); avl_clear_node(newnode); newnode->prev = node; newnode->parent = node; newnode->next = node->next; if(node->next) node->next->prev = newnode; else avltree->tail = newnode; node->next = newnode; node->right = newnode; avl_rebalance(avltree, node); return newnode; } avl_node_t *avl_insert_node(avl_tree_t *avltree, avl_node_t *newnode) { avl_node_t *node; if(!avltree->top) return avl_insert_top(avltree, newnode); switch(avl_search_closest(avltree, newnode->item, &node)) { case -1: return avl_insert_before(avltree, node, newnode); case 1: return avl_insert_after(avltree, node, newnode); } return NULL; } /* * avl_insert: * Create a new node and insert an item there. * Returns the new node on success or NULL if no memory could be allocated. */ avl_node_t *avl_insert(avl_tree_t *avltree, void *item) { avl_node_t *newnode; newnode = avl_init_node(malloc(sizeof(avl_node_t)), item); if(newnode) { if(avl_insert_node(avltree, newnode)) return newnode; free(newnode); errno = EEXIST; } return NULL; } /* * avl_unlink_node: * Removes the given node. Does not delete the item at that node. * The item of the node may be freed before calling avl_unlink_node. * (In other words, it is not referenced by this function.) */ void avl_unlink_node(avl_tree_t *avltree, avl_node_t *avlnode) { avl_node_t *parent; avl_node_t **superparent; avl_node_t *subst, *left, *right; avl_node_t *balnode; if(avlnode->prev) avlnode->prev->next = avlnode->next; else avltree->head = avlnode->next; if(avlnode->next) avlnode->next->prev = avlnode->prev; else avltree->tail = avlnode->prev; parent = avlnode->parent; superparent = parent ? avlnode == parent->left ? &parent->left : &parent->right : &avltree->top; left = avlnode->left; right = avlnode->right; if(!left) { *superparent = right; if(right) right->parent = parent; balnode = parent; } else if(!right) { *superparent = left; left->parent = parent; balnode = parent; } else { subst = avlnode->prev; if(subst == left) { balnode = subst; } else { balnode = subst->parent; balnode->right = subst->left; if(balnode->right) balnode->right->parent = balnode; subst->left = left; left->parent = subst; } subst->right = right; subst->parent = parent; right->parent = subst; *superparent = subst; } avl_rebalance(avltree, balnode); } void *avl_delete_node(avl_tree_t *avltree, avl_node_t *avlnode) { void *item = NULL; if(avlnode) { item = avlnode->item; avl_unlink_node(avltree, avlnode); if(avltree->freeitem) avltree->freeitem(item); free(avlnode); } return item; } void *avl_delete(avl_tree_t *avltree, const void *item) { return avl_delete_node(avltree, avl_search(avltree, item)); } avl_node_t *avl_fixup_node(avl_tree_t *avltree, avl_node_t *newnode) { avl_node_t *oldnode = NULL, *node; if(!avltree || !newnode) return NULL; node = newnode->prev; if(node) { oldnode = node->next; node->next = newnode; } else { avltree->head = newnode; } node = newnode->next; if(node) { oldnode = node->prev; node->prev = newnode; } else { avltree->tail = newnode; } node = newnode->parent; if(node) { if(node->left == oldnode) node->left = newnode; else node->right = newnode; } else { oldnode = avltree->top; avltree->top = newnode; } return oldnode; } /* * avl_rebalance: * Rebalances the tree if one side becomes too heavy. This function * assumes that both subtrees are AVL-trees with consistant data. The * function has the additional side effect of recalculating the count of * the tree at this node. It should be noted that at the return of this * function, if a rebalance takes place, the top of this subtree is no * longer going to be the same node. */ void avl_rebalance(avl_tree_t *avltree, avl_node_t *avlnode) { avl_node_t *child; avl_node_t *gchild; avl_node_t *parent; avl_node_t **superparent; parent = avlnode; while(avlnode) { parent = avlnode->parent; superparent = parent ? avlnode == parent->left ? &parent->left : &parent->right : &avltree->top; switch(avl_check_balance(avlnode)) { case -1: child = avlnode->left; #ifdef AVL_DEPTH if(L_DEPTH(child) >= R_DEPTH(child)) { #else #ifdef AVL_COUNT if(L_COUNT(child) >= R_COUNT(child)) { #else #error No balancing possible. #endif #endif avlnode->left = child->right; if(avlnode->left) avlnode->left->parent = avlnode; child->right = avlnode; avlnode->parent = child; *superparent = child; child->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); #endif } else { gchild = child->right; avlnode->left = gchild->right; if(avlnode->left) avlnode->left->parent = avlnode; child->right = gchild->left; if(child->right) child->right->parent = child; gchild->right = avlnode; if(gchild->right) gchild->right->parent = gchild; gchild->left = child; if(gchild->left) gchild->left->parent = gchild; *superparent = gchild; gchild->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); gchild->count = CALC_COUNT(gchild); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); gchild->depth = CALC_DEPTH(gchild); #endif } break; case 1: child = avlnode->right; #ifdef AVL_DEPTH if(R_DEPTH(child) >= L_DEPTH(child)) { #else #ifdef AVL_COUNT if(R_COUNT(child) >= L_COUNT(child)) { #else #error No balancing possible. #endif #endif avlnode->right = child->left; if(avlnode->right) avlnode->right->parent = avlnode; child->left = avlnode; avlnode->parent = child; *superparent = child; child->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); #endif } else { gchild = child->left; avlnode->right = gchild->left; if(avlnode->right) avlnode->right->parent = avlnode; child->left = gchild->right; if(child->left) child->left->parent = child; gchild->left = avlnode; if(gchild->left) gchild->left->parent = gchild; gchild->right = child; if(gchild->right) gchild->right->parent = gchild; *superparent = gchild; gchild->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); gchild->count = CALC_COUNT(gchild); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); gchild->depth = CALC_DEPTH(gchild); #endif } break; default: #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); #endif } avlnode = parent; } } eaf/src/eaf/GNUmakefile0000644000176200001440000001021114660712342014401 0ustar liggesusers#------------------------------------------------------*- Makefile-gmake -*- # Makefile for eaf VERSION = 0.1svn$(SVN_REV) # --------------------------------------------------------------------- # Copyright (c) 2007, 2008 # Carlos Fonseca # Manuel Lopez-Ibanez # This program is free software (software libre); you can redistribute # it and/or modify it under the terms of the GNU General Public # License as published by the Free Software Foundation; either # version 2 of the License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, you can obtain a copy of the GNU # General Public License at: # http://www.gnu.org/copyleft/gpl.html # or by writing to: # Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA # #----------------------------------------------------------------------- # IMPORTANT NOTE: Please be aware that the fact that this program is # released as Free Software does not excuse you from scientific # propriety, which obligates you to give appropriate credit! If you # write a scientific paper describing research that made substantive # use of this program, it is your obligation as a scientist to # acknowledge its use. Moreover, as a personal note, I would # appreciate it if you would email # with citations of papers referencing this work so I can mention them # to my funding agent and tenure committee. #----------------------------------------------------------------------- DEBUG=0 mkfile_path:=$(dir $(realpath $(firstword $(MAKEFILE_LIST)))) BINDIR:=$(mkfile_path) OBJS = eaf.o io.o eaf_main.o eaf3d.o avl.o HEADERS = eaf.h io_priv.h io.h cvector.h avl.h common.h gcc_attribs.h bit_array.h DIST_OTHER_FILES = *.mk TODO GNUmakefile README LICENSE svn_version EAFEXE=eaf$(EXE) EXE_LDFLAGS = -lm ECHO = @echo "$(1)" -include svnversion.mk -include gcc.mk EAF_CFLAGS += $(OPT_CFLAGS) $(WARN_CFLAGS) \ -DDEBUG=$(DEBUG) -DVERSION='"$(VERSION)"' -DMARCH='"$(gcc-guess-march)"' .PHONY : default all clean distclean check test dist default: $(BINDIR)/$(EAFEXE) $(BINDIR)/$(EAFEXE) : $(OBJS) @mkdir -p $(BINDIR) $(call ECHO,--> Building $@ version $(VERSION) <---) $(CC) -o $@ $(OBJS) $(EAF_CFLAGS) $(CFLAGS) $(EXE_LDFLAGS) $(OBJS) : eaf.h io.h io.o : io_priv.h %.o : %.c $(CC) $(EAF_CFLAGS) $(CFLAGS) -c -o $@ $< TESTSUITE:="$(PWD)/testsuite" check: clean $(MAKE) DEBUG=1 SANITIZERS="" $(BINDIR)/$(EAFEXE) $(call ECHO,---> Checking for errors (DEBUG=1)... <--- ) @if test -d $(TESTSUITE); then \ cd $(TESTSUITE) && ./regtest.pl $(BINDIR)/$(EAFEXE) && cd $(PWD); \ else \ echo "Error: Testsuite not found in $(TESTSUITE)" && exit 1; \ fi test: clean $(MAKE) DEBUG=0 SANITIZERS="" $(BINDIR)/$(EAFEXE) $(call ECHO,---> Testing for speed (DEBUG=0)... <--- ) @if test -d $(TESTSUITE); then \ cd $(TESTSUITE) && ./regtest.pl $(BINDIR)/$(EAFEXE) && cd $(PWD); \ else \ echo "Error: Testsuite not found in $(TESTSUITE)" && exit 1; \ fi clean : $(call ECHO,---> Removing $(BINDIR)/$(EAFEXE) <---) @$(RM) $(BINDIR)/$(EAFEXE) $(call ECHO,---> Removing object files $(OBJS) <---) @$(RM) $(OBJS) all : clean $(MAKE) default DIST_SRC_FILES = $(DIST_OTHER_FILES) $(OBJS:.o=.c) $(HEADERS) DIST_SRC := eaf-$(VERSION)-src dist : DEBUG=0 dist : CDEBUG= dist : all @(mkdir -p ../$(DIST_SRC) \ && rsync -rlpC --copy-unsafe-links --exclude=.svn $(DIST_SRC_FILES) ../$(DIST_SRC)/ \ && cd .. \ && tar cf - $(DIST_SRC) | gzip -f9 > $(DIST_SRC).tar.gz \ && rm -rf ./$(DIST_SRC)/* && rmdir ./$(DIST_SRC)/ \ && echo "$(DIST_SRC).tar.gz created." && cd $(PWD) ) eaf/src/eaf/io.h0000644000176200001440000000643214660712342013121 0ustar liggesusers#ifndef EAF_INPUT_OUTPUT_H #define EAF_INPUT_OUTPUT_H #include "common.h" static const char stdin_name[] = ""; // FIXME: Should this be %-16.15g ? #define point_printf_format "% 17.16g" #define point_printf_sep "\t" /* Error codes for read_data. */ enum ERROR_READ_DATA { READ_INPUT_FILE_EMPTY = -1, READ_INPUT_WRONG_INITIAL_DIM = -2, ERROR_FOPEN = -3, ERROR_CONVERSION = -4, ERROR_COLUMNS = -5, }; int read_int_data (const char *filename, int **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p); int read_double_data (const char *filename, double **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p); #ifndef R_PACKAGE #include #include #include #include void vector_fprintf (FILE *stream, const double * vector, int size); void vector_printf (const double *vector, int size); int write_sets (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns); int write_sets_filtered (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns, const bool *write_p); static inline const signed char * read_minmax (const char *str, int *nobj) { signed char * minmax; int i; if (str == NULL) { /* Default all minimised. */ assert (*nobj > 0); minmax = malloc (sizeof(signed char) * *nobj); for (i = 0; i < *nobj; i++) minmax[i] = -1; return minmax; } int len = strlen (str); bool all_ignored = true; minmax = malloc (sizeof(signed char) * MAX(len, *nobj)); for (i = 0; i < len; i++) { switch (str[i]) { case '+': minmax[i] = 1; all_ignored = false; break; case '-': minmax[i] = -1; all_ignored = false; break; case '0': case 'i': minmax[i] = 0; break; default: /* something unexpected was found */ return NULL; break; } } if (all_ignored == true) { warnprintf ("all objectives ignored because of --obj=%s\n", str); exit (EXIT_SUCCESS); } // FIXME: How to adjust minmax dynamically according to the number of objectives? if (len < *nobj) { // Cycle for (i = 0; i < (*nobj - len); i++) { minmax[len + i] = minmax[i]; } } *nobj = len; return minmax; } static inline const bool * read_bitvector (const char *str, int *nobj) { bool * vec; int i; if (str == NULL) { /* Default all false. */ assert (*nobj > 0); vec = malloc (sizeof(bool) * *nobj); for (i = 0; i < *nobj; i++) vec[i] = false; return vec; } int len = strlen (str); vec = malloc (sizeof(bool) * len); for (i = 0; i < len; i++) { switch (str[i]) { case '1': vec[i] = true; break; case '0': vec[i] = false; break; default: /* something unexpected was found */ return NULL; } } *nobj = len; return vec; } #endif // R_PACKAGE #endif // EAF_INPUT_OUTPUT_H eaf/src/eaf/io_priv.h0000644000176200001440000001364114660712342014161 0ustar liggesusers#include #include #include /* for strerror() */ #include /* for errno */ #define QUOTE(name) #name #define STR(macro) QUOTE(macro) #define objective_t_str STR(objective_t) #define PAGE_SIZE 4096 /* allocate one page at a time */ #define DATA_INC (PAGE_SIZE/sizeof(objective_t)) /* * Read an array of objective values from a stream. This function may * be called repeatedly to add data to an existing data set. * * nobjs : number of objectives, also the number of columns. */ int read_objective_t_data (const char *filename, objective_t **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p) { int nobjs = *nobjs_p; /* number of objectives (and columns). */ int *cumsizes = *cumsizes_p; /* cumulative sizes of data sets. */ int nsets = *nsets_p; /* number of data sets. */ objective_t *data = *data_p; int errorcode = 0; FILE *instream; if (filename == NULL) { instream = stdin; filename = stdin_name; /* used to diagnose errors. */ } else if (NULL == (instream = fopen (filename,"rb"))) { errprintf ("%s: %s", filename, strerror (errno)); return ERROR_FOPEN; } int ntotal; /* the current element of (*datap) */ int datasize; int sizessize; if (nsets == 0) { ntotal = 0; sizessize = 0; datasize = 0; } else { ntotal = nobjs * cumsizes[nsets - 1]; sizessize = ((nsets - 1) / DATA_INC + 1) * DATA_INC; datasize = ((ntotal - 1) / DATA_INC + 1) * DATA_INC; } /* if size is equal to zero, this is equivalent to free(). That is, reinitialize the data structures. */ cumsizes = realloc (cumsizes, sizessize * sizeof(int)); data = realloc (data, datasize * sizeof(objective_t)); /* skip over leading whitespace, comments and empty lines. */ int retval; /* return value for fscanf */ int column = 0, line = 0; do { line++; /* skip full lines starting with # */ retval = skip_comment_line (instream); } while (retval == 1); if (retval == EOF) { /* faster than !feof() */ warnprintf ("%s: file is empty.", filename); errorcode = READ_INPUT_FILE_EMPTY; goto read_data_finish; } do { /* beginning of data set */ if (nsets == sizessize) { sizessize += DATA_INC; cumsizes = realloc(cumsizes, sizessize * sizeof(int)); } cumsizes[nsets] = (nsets == 0) ? 0 : cumsizes[nsets - 1]; do { /* beginning of row */ column = 0; do { /* new column */ column++; objective_t number; if (fscanf (instream, objective_t_scanf_format, &number) != 1) { char buffer[64]; if (fscanf (instream, "%60[^ \t\r\n]", buffer) != 1) { errprintf ("%s: line %d column %d: " "read error or unexpected end of file", filename, line, column); } else { errprintf ("%s: line %d column %d: " "could not convert string `%s' to %s (format: %s)", filename, line, column, buffer, objective_t_str, objective_t_scanf_format); } errorcode = ERROR_CONVERSION; goto read_data_finish; } if (ntotal == datasize) { datasize += DATA_INC; data = realloc (data, datasize * sizeof(objective_t)); } data[ntotal] = number; ntotal++; DEBUG2(fprintf(stderr, "%s:%d:%d(%d) %d (set %d) = " point_printf_format "\n", filename, line, column, nobjs, cumsizes[nsets], nsets, (double)number)); /* skip possible trailing whitespace */ skip_trailing_whitespace(instream); retval = fscanf_newline(instream); } while (retval == 0); if (!nobjs) nobjs = column; else if (column == nobjs) ; /* OK */ else if (cumsizes[0] == 0) { /* just finished first row. */ errprintf ("%s: line %d: input has dimension %d" " while previous data has dimension %d", filename,line, column, nobjs); errorcode = READ_INPUT_WRONG_INITIAL_DIM; goto read_data_finish; } else { errprintf ("%s: line %d has different number of columns (%d)" " from first row (%d)\n", filename, line, column, nobjs); errorcode = ERROR_COLUMNS; goto read_data_finish; } cumsizes[nsets]++; /* look for an empty line */ line++; retval = skip_comment_line (instream); } while (retval == 0); nsets++; /* new data set */ DEBUG2(fprintf (stderr, "%s: set %d, read %d rows\n", filename, nsets, cumsizes[nsets - 1])); /* skip over successive empty lines */ do { line++; retval = skip_comment_line (instream); } while (retval == 1); } while (retval != EOF); /* faster than !feof() */ /* adjust to real size (saves memory but probably slower). */ cumsizes = realloc (cumsizes, nsets * sizeof(int)); data = realloc (data, ntotal * sizeof(objective_t)); read_data_finish: *nobjs_p = nobjs; *nsets_p = nsets; *cumsizes_p = cumsizes; *data_p = data; if (instream != stdin) fclose(instream); return errorcode; } #undef PAGE_SIZE #undef DATA_INC #undef QUOTE #undef STR eaf/src/eaf/cvector.h0000644000176200001440000003322414660712342014156 0ustar liggesusers#ifndef __CVECTOR_H__ #define __CVECTOR_H__ #ifndef cvector_assert #include #define cvector_assert(X) assert(X) #endif #include #include // SIZE_MAX #define vector_define(VECTOR_TYPE, BASE_TYPE) \ struct VECTOR_TYPE; \ typedef struct VECTOR_TYPE VECTOR_TYPE; \ \ struct VECTOR_TYPE { \ BASE_TYPE *_begin; \ BASE_TYPE *_end; \ BASE_TYPE *_capacity; \ }; \ \ static inline \ void VECTOR_TYPE##_reserve(VECTOR_TYPE * v, size_t n); \ \ /* Default constructor: constructs an empty vector, with no content and a size of zero. */ \ static inline \ void VECTOR_TYPE##_ctor_zero(VECTOR_TYPE * v) \ { \ v->_begin = NULL; \ v->_end = NULL; \ v->_capacity = NULL; \ } \ \ /* Default constructor: constructs an empty vector, with no content and a size of zero. */ \ static inline \ void VECTOR_TYPE##_ctor(VECTOR_TYPE * v, size_t n) \ { \ VECTOR_TYPE##_ctor_zero (v); \ VECTOR_TYPE##_reserve (v, n); \ } \ \ /* Default constructor: dynamically allocates an empty vector, with no content and a size of zero. */ \ static inline \ VECTOR_TYPE * VECTOR_TYPE##_new(size_t n) \ { \ VECTOR_TYPE * v = malloc (sizeof(VECTOR_TYPE)); \ VECTOR_TYPE##_ctor (v, n); \ return v; \ } \ \ /* Destructor. It frees the memory allocated to the vector, but it does not try to free each of its elements or the vector itself. */ \ static inline \ void VECTOR_TYPE##_dtor(VECTOR_TYPE * v) \ { free(v->_begin); } \ \ /* Destructor. It frees the memory allocated to a dynamically allocated vector, but it does not try to free each of its elements. */ \ static inline \ void VECTOR_TYPE##_delete(VECTOR_TYPE * v) \ { VECTOR_TYPE##_dtor(v); free(v); } \ \ \ /* Returns the number of elements in the vector container. */ \ static inline \ size_t VECTOR_TYPE##_size(const VECTOR_TYPE * v) \ { return v->_end - v->_begin; } \ \ /* Return size of allocated storage capacity. */ \ static inline \ size_t VECTOR_TYPE##_capacity(const VECTOR_TYPE * v) \ { return v->_capacity - v->_begin; } \ \ /* Returns whether the vector container is empty, i.e. whether its size is 0. */ \ static inline \ bool VECTOR_TYPE##_empty(const VECTOR_TYPE * v) \ { return v->_begin == v->_end; } \ \ /* Requests that the capacity of the allocated storage space for the elements of the vector container be at least enough to hold n elements. This informs the vector of a planned increase in size, although notice that the parameter n informs of a minimum, so the resulting capacity may be any capacity equal or larger than this. When n is greater than the current capacity, a reallocation is attempted during the call to this function. If successful, it grants that no further automatic reallocations will happen because of a call to vector::insert or vector::push_back until the vector size surpasses at least n (this preserves the validity of iterators on all these future calls). A reallocation invalidates all previously obtained iterators, references and pointers to elements of the vector. In any case, a call to this function never affects the elements contained in the vector, nor the vector size. */ \ static inline \ void VECTOR_TYPE##_reserve(VECTOR_TYPE * v, size_t n) \ { \ size_t old_capacity = VECTOR_TYPE##_capacity(v); \ size_t old_size = VECTOR_TYPE##_size(v); \ if (n > old_capacity) { \ cvector_assert(SIZE_MAX / sizeof(BASE_TYPE) >= n); \ v->_begin = realloc(v->_begin, sizeof(BASE_TYPE) * n); \ cvector_assert(v->_begin != NULL); \ v->_end = v->_begin + old_size; \ v->_capacity = v->_begin + n; \ } \ } \ \ /* Adds a new element at the end of the vector, after its current last element. The content of this new element is initialized to a copy of x. This effectively increases the vector size by one, which causes a reallocation of the internal allocated storage if the vector size was equal to the vector capacity before the call. Reallocations invalidate all previously obtained iterators, references and pointers. */ \ static inline \ void VECTOR_TYPE##_push_back(VECTOR_TYPE * v, BASE_TYPE x) \ { \ if (v->_end == v->_capacity) \ VECTOR_TYPE##_reserve (v, \ (VECTOR_TYPE##_capacity (v) == 0) \ ? 8 \ : 2 * VECTOR_TYPE##_capacity (v)); \ *(v->_end) = x; \ v->_end++; \ } \ \ /* Removes the last element in the vector, effectively reducing the vector size by one and invalidating all iterators and references to it. Note that the element is not freed. */ \ static inline \ BASE_TYPE VECTOR_TYPE##_pop_back(VECTOR_TYPE * v) \ { \ cvector_assert(!VECTOR_TYPE##_empty(v)); \ v->_end--; \ return *(v->_end); \ } \ \ /* Returns the first element in the vector container. This is not a reference like in C++! */ \ static inline \ BASE_TYPE VECTOR_TYPE##_front(const VECTOR_TYPE * v) \ { \ cvector_assert (!VECTOR_TYPE##_empty(v)); \ return v->_begin[0]; \ } \ \ /* Returns the last element in the vector container. This is not a reference like in C++! */ \ static inline \ BASE_TYPE VECTOR_TYPE##_back(const VECTOR_TYPE * v) \ { \ cvector_assert (!VECTOR_TYPE##_empty(v)); \ return *(v->_end - 1); \ } \ \ /* Returns an iterator (pointer) referring to the first element in the vector container. */ \ static inline \ BASE_TYPE * VECTOR_TYPE##_begin(const VECTOR_TYPE * v) \ { return v->_begin; } \ \ /* Returns an iterator (pointer) referring to the past-the-end element in the vector container. */ \ static inline \ BASE_TYPE * VECTOR_TYPE##_end(const VECTOR_TYPE * v) \ { return v->_end; } \ \ /* Returns the element at position pos. */ \ static inline \ BASE_TYPE VECTOR_TYPE##_at(const VECTOR_TYPE * v, size_t pos) \ { \ cvector_assert(pos <= VECTOR_TYPE##_size(v)); \ return v->_begin[pos]; \ } \ \ /* Set the element at position pos to value e and return it. */ \ static inline \ BASE_TYPE VECTOR_TYPE##_set(const VECTOR_TYPE * v, size_t pos, BASE_TYPE e) \ { \ cvector_assert(pos <= VECTOR_TYPE##_size(v)); \ return (v->_begin[pos] = e); \ } \ #endif eaf/src/eaf/TODO0000644000176200001440000000050014660712342013017 0ustar liggesusers eaf_input.c : * Experiment with different values for PAGE_SIZE in eaf_input.c. * Experiment reading whole lines and then sscanf the line. * Consider mmaping the input file (or a big chunk of few megabytes), then read, then unmap. * Perhaps add --obj=X so it reads only that number of columns from input. eaf/src/eaf/eaf_main.c0000644000176200001440000003574014660712342014250 0ustar liggesusers/************************************************************************* eaf: Computes the empirical attainment function (EAF) from a number of approximation sets. --------------------------------------------------------------------- Copyright (c) 2006, 2007, 2008 Carlos Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- *************************************************************************/ #include "eaf.h" #include #include // strtol() #include // isprint() #include #include #include // for bool, true and false #include // for getopt() #define _GNU_SOURCE #include // for getopt_long() #include char *program_invocation_short_name = "eaf"; static void usage(void) { printf("\n" "Usage:\n" " %s [OPTIONS] [FILE...]\n\n", program_invocation_short_name); printf( "Computes the empirical attainment function (EAF) of all input FILEs. \n" "With no FILE, or when FILE is -, read standard input.\n\n" "Options:\n" " -h, --help print this summary and exit \n" " --version print version number (and compilation flags) and exit \n" " -v, --verbose print some information (time, input points, output \n" " points, etc) in stderr. Default is --quiet \n" " -o, --output FILE write output to FILE instead of standard output. \n" " -q, --quiet print just the EAF (as opposed to --verbose) \n" " -b, --best compute best attainment surface \n" " -m, --median compute median attainment surface \n" " -w, --worst compute worst attainment surface \n" " -p, --percentile REAL compute the given percentile of the EAF \n" " -l, --level LEVEL compute the given level of the EAF \n" " -i[FILE], --indices[=FILE] write attainment indices to FILE. \n" " If FILE is '-', print to stdout. \n" " If FILE is missing use the same file as for output. \n" " -d[FILE], --diff[=FILE] write difference between half of runs to FILE. \n" " If FILE is '-', print to stdout. \n" " If FILE is missing use the same file as for output. \n" " , --polygons Write EAF as R polygons. \n" "\n\n" ); } static void version(void) { #ifndef VERSION #define VERSION "unknown" #endif #ifdef MARCH #define OPTIMISED_FOR_STR " (optimised for "MARCH")" #else #define OPTIMISED_FOR_STR "" #endif printf("%s version " VERSION OPTIMISED_FOR_STR "\n\n", program_invocation_short_name); printf( "Copyright (C) 2009\n" "Carlos Fonseca \n" "Manuel Lopez-Ibanez \n" "\n" "This is free software, and you are welcome to redistribute it under certain\n" "conditions. See the GNU General Public License for details. There is NO\n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" "\n" ); } // FIXME: How to implement this with const char *str? static int read_doubles (double *vec, char *str) { char * cursor; char * endp = str; int k = 0; do { cursor = endp; vec[k] = strtod(cursor, &endp); if (cursor == endp && (*endp == ',' || *endp == ';')) { endp++; continue; } k++; } while (cursor != endp); // not end of string: error while (*cursor != '\0') { if (!isspace(*cursor)) { errprintf ("invalid argument to --percentiles '%s'", str); exit (EXIT_FAILURE); } cursor++; } // no number: error if (k == 1) { errprintf ("invalid argument to --percentiles '%s'", str); exit (EXIT_FAILURE); } return k - 1; } static int read_ints (int *levels, char *str) { char * cursor; char * endp = str; int k = 0; do { cursor = endp; levels[k] = strtol(cursor, &endp, 10); if (cursor == endp && (*endp == ',' || *endp == ';')) { endp++; continue; } k++; } while (cursor != endp); // not end of string: error while (*cursor != '\0') { if (!isspace(*cursor)) { errprintf ("invalid argument to --levels '%s'", str); exit (EXIT_FAILURE); } cursor++; } // no number: error if (k == 1) { errprintf ("invalid argument to --levels '%s'", str); exit (EXIT_FAILURE); } return k - 1; } void eaf_print (eaf_t **eaf, int nlevels, FILE *coord_file, FILE *indic_file, FILE *diff_file) { int k; for (k = 0; k < nlevels; k++) { eaf_print_attsurf (eaf[k], coord_file, indic_file, diff_file); if (coord_file) fprintf (coord_file, "\n"); else if (indic_file) fprintf(indic_file, "\n"); else if (diff_file) fprintf(diff_file, "\n"); } } void read_input_data (const char *filename, objective_t **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p) { int error = read_objective_t_data (filename, data_p, nobjs_p, cumsizes_p, nsets_p); switch (error) { case 0: /* No error */ break; case READ_INPUT_FILE_EMPTY: case READ_INPUT_WRONG_INITIAL_DIM: break; case ERROR_FOPEN: case ERROR_CONVERSION: case ERROR_COLUMNS: exit (EXIT_FAILURE); default: exit (EXIT_FAILURE); } } int main(int argc, char *argv[]) { bool verbose_flag = true; bool best_flag = false; bool median_flag = false; bool worst_flag = false; bool polygon_flag = false; const char *coord_filename = NULL; const char *indic_filename = NULL; const char *diff_filename = NULL; FILE *coord_file = stdout; FILE *indic_file = NULL; FILE *diff_file = NULL; int option; int longopt_index; /* see the man page for getopt_long for an explanation of these fields */ static const char short_options[] = "hVvqbmwl:p:o:i::d::P"; static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, {"best", no_argument, NULL, 'b'}, {"median", no_argument, NULL, 'm'}, {"worst", no_argument, NULL, 'w'}, {"output", required_argument, NULL, 'o'}, /* The optional_argument must be together with the parameter such as -iFILE or -i=FILE, otherwise it will be considered an input file. */ {"indices", optional_argument, NULL, 'i'}, {"diff", optional_argument, NULL, 'd'}, {"percentile", required_argument, NULL, 'p'}, {"level", required_argument, NULL, 'l'}, {"polygons", no_argument, NULL, 'P'}, {NULL, 0, NULL, 0} /* marks end of list */ }; #define MAX_LEVELS 50 int *level = malloc(MAX_LEVELS * sizeof(int)); int nlevels = 0; double *percentile = malloc(MAX_LEVELS * sizeof(double)); int npercentiles = 0; while (0 < (option = getopt_long(argc, argv, short_options, long_options, &longopt_index))) { switch (option) { case 'l': assert(nlevels < MAX_LEVELS); nlevels += read_ints(level + nlevels, optarg); break; case 'p': assert(npercentiles < MAX_LEVELS); npercentiles += read_doubles(percentile + npercentiles, optarg); break; case 'o': if (!strcmp(optarg,"-")) { coord_file = stdout; coord_filename = NULL; } else coord_filename = optarg; break; case 'i': if (!optarg) { indic_file = stdin; /* Overwrite with coord_file later. */ indic_filename = NULL; } else if (!strcmp(optarg,"-")) { indic_file = stdout; indic_filename = NULL; } else { indic_filename = optarg; } break; case 'd': if (!optarg) { diff_file = stdin; /* Overwrite with coord_file later. */ diff_filename = NULL; } else if (!strcmp(optarg,"-")) { diff_file = stdout; diff_filename = NULL; } else { diff_filename = optarg; } break; case 'b': best_flag = true; break; case 'm': median_flag = true; break; case 'w': worst_flag = true; break; case 'P': polygon_flag = true; break; case 'q': // --quiet verbose_flag = false; break; case 'v': // --verbose verbose_flag = true; break; case 'V': // --version version(); exit(EXIT_SUCCESS); case 'h': // --help usage(); exit(EXIT_SUCCESS); case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); default: abort (); } } objective_t *data = NULL; int* cumsizes = NULL; int nobj = 0, nruns = 0, k; if (optind < argc) { for (k = optind; k < argc; k++) { if (strcmp (argv[k],"-")) read_input_data (argv[k], &data, &nobj, &cumsizes, &nruns); else read_input_data (NULL, &data, &nobj, &cumsizes, &nruns); } } else read_input_data (NULL, &data, &nobj, &cumsizes, &nruns); if (coord_filename) { coord_file = fopen (coord_filename, "w"); if (NULL == coord_file) { errprintf ("%s: %s", coord_filename, strerror (errno)); exit (EXIT_FAILURE); } } /* indic_file is neither NULL nor stdout and no filename was given, use same settings as for --output. */ if (indic_file && indic_file != stdout && !indic_filename) { indic_file = coord_file; indic_filename = coord_filename; } /* If a different filename as for --output was given, open it. */ if (indic_filename && (!coord_filename || strcmp (indic_filename, coord_filename))) { indic_file = fopen (indic_filename, "w"); if (NULL == indic_file) { errprintf ("%s: %s", indic_filename, strerror (errno)); exit (EXIT_FAILURE); } } /* diff_file is neither NULL nor stdout and no filename was given, use same settings as for --output. */ if (diff_file && diff_file != stdout && !diff_filename) { diff_file = coord_file; diff_filename = coord_filename; } /* If a different filename as for --output and --indices was given, open it. */ if (diff_filename && (!coord_filename || strcmp (diff_filename, coord_filename)) && (!indic_filename || strcmp (diff_filename, indic_filename))) { diff_file = fopen (diff_filename, "w"); if (NULL == diff_file) { errprintf ("%s: %s", diff_filename, strerror (errno)); exit(EXIT_FAILURE); } } if (best_flag) { level[0] = 1; nlevels = 1; } else if (median_flag) { level[0] = percentile2level (50, nruns); nlevels = 1; } else if (worst_flag) { level[0] = nruns; nlevels = 1; } else if (npercentiles > 0) { nlevels = npercentiles; for (k = 0; k < nlevels; k++) { if (percentile[k] <= 0) { errprintf ("arg to --percentile must be higher than 0.\n"); exit (EXIT_FAILURE); } else if (percentile[k] > 100) { errprintf ("arg to --percentile must be <= 100.\n"); exit (EXIT_FAILURE); } level[k] = percentile2level(percentile[k], nruns); } } else if (nlevels > 0) { level = realloc (level, nlevels * sizeof(int)); for (k = 0; k < nlevels; k++) { if (level[k] <= 0) { errprintf ("arg to --level must be higher than 0.\n"); exit (EXIT_FAILURE); } else if (level[k] > nruns) { errprintf ("arg to --level must not be higher than number of" " approximation sets (%d).\n", nruns); exit (EXIT_FAILURE); } } } else if (nlevels == 0) { nlevels = nruns; level = realloc (level, nlevels * sizeof(int)); for (k = 0; k < nruns; k++) { level[k] = k + 1; } } if (verbose_flag) { fprintf (stderr, "# objectives (%d): --\n", nobj); fprintf (stderr, "# sets: %d\n", nruns); fprintf (stderr, "# points: %d\n", cumsizes[nruns - 1]); fprintf (stderr, "%s: calculating levels:", program_invocation_short_name); for (k = 0; k < nlevels; k++) fprintf (stderr, " %d", level[k]); fprintf (stderr, "\n"); } eaf_t **eaf = attsurf (data, nobj, cumsizes, nruns, level, nlevels); if (polygon_flag) { eaf_print_polygon (coord_file, eaf, nlevels); fclose (coord_file); } else { eaf_print (eaf, nlevels, coord_file, indic_file, diff_file); fclose (coord_file); if (indic_file && indic_file != coord_file) fclose (indic_file); if (diff_file && diff_file != coord_file && diff_file != indic_file) fclose (diff_file); } free(level); free(data); free(cumsizes); return 0; } eaf/src/eaf/LICENSE0000644000176200001440000004642014660712342013347 0ustar liggesusers --------------------------------------------------------------------- Copyright (c) 2006, 2007, 2008 Carlos Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. There should be a verbatim copy of the GNU General Public License below; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. eaf/src/eaf/io.c0000644000176200001440000001240314660712342013107 0ustar liggesusers/***************************************************************************** I/O functions --------------------------------------------------------------------- Copyright (c) 2005-2008 Carlos M. Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- TODO: things that may or may not improve reading performance. * different values for PAGE_SIZE. * reading whole lines and then sscanf the line. * mmaping the input file (or a big chunk of few megabytes), then read, then unmmap. *****************************************************************************/ #include #include "io.h" #include "common.h" /* FIXME: Do we need to handle the following weird files? */ /* fscanf (instream, "%*[ \t]"); retval = fscanf (instream, "%1[\r\n]", newline); // We do not consider that '\r\n' starts a new set. if (retval == 1 && newline[0] == '\r') fscanf (instream, "%*[\n]"); */ static inline void skip_trailing_whitespace (FILE * instream) { ignore_unused_result (fscanf (instream, "%*[ \t\r]")); } static inline int fscanf_newline(FILE * instream) { char newline[2]; return fscanf (instream, "%1[\n]", newline); } /* skip full lines starting with # */ static inline int skip_comment_line (FILE * instream) { char newline[2]; if (!fscanf (instream, "%1[#]%*[^\n]", newline)) /* and whitespace */ skip_trailing_whitespace(instream); return fscanf_newline(instream); } #define objective_t int #define objective_t_scanf_format "%d" #define read_objective_t_data read_int_data #include "io_priv.h" #undef objective_t #undef objective_t_scanf_format #undef read_objective_t_data #define objective_t double #define objective_t_scanf_format "%lf" #define read_objective_t_data read_double_data #include "io_priv.h" #undef objective_t #undef objective_t_scanf_format #undef read_objective_t_data #ifndef R_PACKAGE extern char *program_invocation_short_name; #include void fatal_error(const char *format,...) { va_list ap; fprintf(stderr, "%s: fatal error: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); exit(EXIT_FAILURE); } /* From: Edition 0.10, last updated 2001-07-06, of `The GNU C Library Reference Manual', for Version 2.3.x. Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc. */ void errprintf(const char *format,...) { va_list ap; fprintf(stderr, "%s: error: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); } /* End of copyright The GNU C Library Reference Manual */ void warnprintf(const char *format,...) { va_list ap; fprintf(stderr, "%s: warning: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); } void vector_fprintf (FILE *stream, const double * vector, int size) { int k; fprintf (stream, point_printf_format, vector[0]); for (k = 1; k < size; k++) fprintf (stream, point_printf_sep "" point_printf_format, vector[k]); } #ifndef R_PACKAGE void vector_printf (const double *vector, int size) { vector_fprintf (stdout, vector, size); } #endif int write_sets (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns) { int size = 0; int set = 0; for (set = 0; set < nruns; set++) { for (; size < cumsizes[set]; size++) { vector_fprintf (outfile, &data[ncols * size], ncols); fprintf (outfile, "\n"); } fprintf (outfile, "\n"); } return 0; } int write_sets_filtered (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns, const bool *write_p) { int size = 0; int set = 0; for (set = 0; set < nruns; set++) { for (; size < cumsizes[set]; size++) { if (write_p[size]) { vector_fprintf (outfile, &data[ncols * size], ncols); fprintf (outfile, "\n"); } } fprintf (outfile, "\n"); } return 0; } #endif // R_PACKAGE eaf/src/eaf/eaf.h0000644000176200001440000001422414660712342013243 0ustar liggesusers/************************************************************************* eaf.h: prototypes and shared types of eaf and eaf-test --------------------------------------------------------------------- Copyright (c) 2006, 2007, 2008 Carlos Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- *************************************************************************/ #include #include #include #include #include #include "common.h" #ifdef R_PACKAGE #define R_NO_REMAP #include #define EAF_MALLOC(WHAT, NMEMB, TYPE) \ do { WHAT = malloc ((NMEMB) * sizeof(TYPE)); \ if (!WHAT) { \ Rf_error(__FILE__ ": %s = malloc (%lu * %lu) failed", \ #WHAT, (unsigned long) (NMEMB), (unsigned long) sizeof(TYPE)); } \ } while (0) #else #define EAF_MALLOC(WHAT, NMEMB, TYPE) \ do { WHAT = malloc ((NMEMB) * sizeof(TYPE)); \ if (!WHAT) { perror (__FILE__ ": " #WHAT ); exit (EXIT_FAILURE); } \ } while(0) #endif // R_PACKAGE #include "io.h" /* If the input are always integers, adjusting this type will certainly improve performance. */ #ifndef objective_t #define objective_t double #endif #if objective_t == double # define objective_MAX INFINITY # define objective_MIN -INFINITY # define objective_t_scanf_format "%lf" # define read_objective_t_data read_double_data #else # define objective_MAX INT_MAX # define objective_MIN INT_MIN # define objective_t_scanf_format "%d" # define read_objective_t_data read_int_data #endif #include "bit_array.h" typedef struct { int nobj; /* FIXME: there is no point to store this here. */ int nruns; size_t size; size_t maxsize; int nreallocs; bit_array *bit_attained; bool *attained; objective_t *data; } eaf_t; void eaf_print_attsurf (eaf_t *, FILE *coord_file, /* output file (coordinates) */ FILE *indic_file, /* output file (attainment indicators) */ FILE *diff_file); /* output file (difference nruns/2) */ eaf_t * eaf_create (int nobj, int nruns, int npoints); void eaf_delete (eaf_t * eaf); objective_t * eaf_store_point_help (eaf_t * eaf, int nobj, const int *save_attained); static inline int eaf_totalpoints (eaf_t **eaf, int n) { int totalpoints = 0; int k; for (k = 0; k < n; k++) { totalpoints += eaf[k]->size; } return totalpoints; } eaf_t ** eaf2d (const objective_t *data, /* the objective vectors */ const int *cumsize, /* the cumulative sizes of the runs */ int nruns, /* the number of runs */ const int *attlevel, /* the desired attainment levels */ int nlevels /* the number of att levels */ ); eaf_t ** eaf3d (objective_t *data, const int *cumsize, int nruns, const int *attlevel, const int nlevels); static inline eaf_t ** attsurf (objective_t *data, /* the objective vectors */ int nobj, /* the number of objectives */ const int *cumsize, /* the cumulative sizes of the runs */ int nruns, /* the number of runs */ const int *attlevel, /* the desired attainment levels */ int nlevels /* the number of att levels */ ) { switch (nobj) { case 2: return eaf2d (data, cumsize, nruns, attlevel, nlevels); break; case 3: return eaf3d (data, cumsize, nruns, attlevel, nlevels); break; default: fatal_error("this implementation only supports two or three dimensions.\n"); } } static inline void attained_left_right (const bit_array *attained, int division, int total, int *count_left, int *count_right) { eaf_assert (division < total); int count_l = 0; int count_r = 0; int k; for (k = 0; k < division; k++) if (bit_array_get(attained, k)) count_l++; for (k = division; k < total; k++) if (bit_array_get(attained, k)) count_r++; *count_left = count_l; *count_right = count_r; } static inline int percentile2level (double p, int n) { const double tolerance = sqrt(DBL_EPSILON); double x = (n * p) / 100.0; int level = (x - floor(x) <= tolerance) ? (int) floor(x) : (int) ceil(x); eaf_assert(level <= n); eaf_assert(level >= 0); if (level < 1) level = 1; return level; } #define cvector_assert(X) eaf_assert(X) #include "cvector.h" vector_define(vector_objective, objective_t) vector_define(vector_int, int) typedef struct { vector_objective xy; vector_int col; } eaf_polygon_t; #define eaf_compute_area eaf_compute_polygon eaf_polygon_t *eaf_compute_polygon (eaf_t **eaf, int nlevels); eaf_polygon_t *eaf_compute_polygon_old (eaf_t **eaf, int nlevels); void eaf_print_polygon (FILE* stream, eaf_t **eaf, int nlevels); eaf_polygon_t * eaf_compute_rectangles (eaf_t **eaf, int nlevels); eaf/src/eaf/svnversion.mk0000644000176200001440000000054314660712342015103 0ustar liggesusers## Do we have svnversion? ifeq ($(shell sh -c 'which svnversion 1> /dev/null 2>&1 && echo y'),y) ## Is this a working copy? ifeq ($(shell sh -c 'LC_ALL=C svnversion -n . | grep -q ^[0-9] && echo y'),y) $(shell sh -c 'svnversion -n . > svn_version') endif endif ## Set version information: SVN_REV = $(shell sh -c 'cat svn_version 2> /dev/null') eaf/src/eaf/avl.h0000644000176200001440000001677514660712342013307 0ustar liggesusers/***************************************************************************** avl.h - Source code for the AVL-tree library. Copyright (C) 1998 Michael H. Buselli Copyright (C) 2000-2002 Wessel Dankers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Augmented AVL-tree. Original by Michael H. Buselli . Modified by Wessel Dankers to add a bunch of bloat to the sourcecode, change the interface and squash a few bugs. Mail him if you find new bugs. *****************************************************************************/ #ifndef _AVL_H #define _AVL_H #define AVL_DEPTH /* We need either depths, counts or both (the latter being the default) */ #if !defined(AVL_DEPTH) && !defined(AVL_COUNT) #define AVL_DEPTH #define AVL_COUNT #endif /* User supplied function to compare two items like strcmp() does. * For example: cmp(a,b) will return: * -1 if a < b * 0 if a = b * 1 if a > b */ typedef int (*avl_compare_t)(const void *, const void *); /* User supplied function to delete an item when a node is free()d. * If NULL, the item is not free()d. */ typedef void (*avl_freeitem_t)(void *); typedef struct avl_node_t { struct avl_node_t *next; struct avl_node_t *prev; struct avl_node_t *parent; struct avl_node_t *left; struct avl_node_t *right; void *item; #ifdef AVL_COUNT unsigned int count; #endif #ifdef AVL_DEPTH unsigned char depth; #endif /* The following members are necessary only to determine the attainment indicators. * set - set of the input point responsible for the promotion of this point * promoter - point from a lower (previous) level that is also responsible for the promotion of this point. * remover - point from the same level as this point that dominates this point. (Point * that removed this point from its level). * equal - point from a higher (next) level that is equal to this point (this point is equal's promoter) * * This point is attained by 'set' and by the same sets that attains its promoter. It is also * attained by any set that attains its remover. It is also attained by every set that attains * any point equal to itself. */ int set; struct avl_node_t *promoter; struct avl_node_t *remover; struct avl_node_t *equal; } avl_node_t; typedef struct avl_tree_t { avl_node_t *head; avl_node_t *tail; avl_node_t *top; avl_compare_t cmp; avl_freeitem_t freeitem; } avl_tree_t; /* Initializes a new tree for elements that will be ordered using * the supplied strcmp()-like function. * Returns the value of avltree (even if it's NULL). * O(1) */ extern avl_tree_t *avl_init_tree(avl_tree_t *avltree, avl_compare_t, avl_freeitem_t); /* Allocates and initializes a new tree for elements that will be * ordered using the supplied strcmp()-like function. * Returns NULL if memory could not be allocated. * O(1) */ extern avl_tree_t *avl_alloc_tree(avl_compare_t, avl_freeitem_t); /* Frees the entire tree efficiently. Nodes will be free()d. * If the tree's freeitem is not NULL it will be invoked on every item. * O(n) */ extern void avl_free_tree(avl_tree_t *); /* Reinitializes the tree structure for reuse. Nothing is free()d. * Compare and freeitem functions are left alone. * O(1) */ extern void avl_clear_tree(avl_tree_t *); /* Free()s all nodes in the tree but leaves the tree itself. * If the tree's freeitem is not NULL it will be invoked on every item. * O(n) */ extern void avl_free_nodes(avl_tree_t *); /* Initializes memory for use as a node. Returns NULL if avlnode is NULL. * O(1) */ extern avl_node_t *avl_init_node(avl_node_t *avlnode, void *item); /* Insert an item into the tree and return the new node. * Returns NULL and sets errno if memory for the new node could not be * allocated or if the node is already in the tree (EEXIST). * O(lg n) */ extern avl_node_t *avl_insert(avl_tree_t *, void *item); /* Insert a node into the tree and return it. * Returns NULL if the node is already in the tree. * O(lg n) */ extern avl_node_t *avl_insert_node(avl_tree_t *, avl_node_t *); /* Insert a node in an empty tree. If avlnode is NULL, the tree will be * cleared and ready for re-use. * If the tree is not empty, the old nodes are left dangling. * O(1) */ extern avl_node_t *avl_insert_top(avl_tree_t *, avl_node_t *avlnode); /* Insert a node before another node. Returns the new node. * If old is NULL, the item is appended to the tree. * O(lg n) */ extern avl_node_t *avl_insert_before(avl_tree_t *, avl_node_t *old, avl_node_t *new); /* Insert a node after another node. Returns the new node. * If old is NULL, the item is prepended to the tree. * O(lg n) */ extern avl_node_t *avl_insert_after(avl_tree_t *, avl_node_t *old, avl_node_t *new); /* Deletes a node from the tree. Returns immediately if the node is NULL. * The item will not be free()d regardless of the tree's freeitem handler. * This function comes in handy if you need to update the search key. * O(lg n) */ extern void avl_unlink_node(avl_tree_t *, avl_node_t *); /* Deletes a node from the tree. Returns immediately if the node is NULL. * If the tree's freeitem is not NULL, it is invoked on the item. * If it is, returns the item. * O(lg n) */ extern void *avl_delete_node(avl_tree_t *, avl_node_t *); /* Searches for an item in the tree and deletes it if found. * If the tree's freeitem is not NULL, it is invoked on the item. * If it is, returns the item. * O(lg n) */ extern void *avl_delete(avl_tree_t *, const void *item); /* If exactly one node is moved in memory, this will fix the pointers * in the tree that refer to it. It must be an exact shallow copy. * Returns the pointer to the old position. * O(1) */ extern avl_node_t *avl_fixup_node(avl_tree_t *, avl_node_t *new); /* Searches for a node with the key closest (or equal) to the given item. * If avlnode is not NULL, *avlnode will be set to the node found or NULL * if the tree is empty. Return values: * -1 if the returned node is greater * 0 if the returned node is equal or if the tree is empty * 1 if the returned node is smaller * O(lg n) */ extern int avl_search_closest(const avl_tree_t *, const void *item, avl_node_t **avlnode); /* Searches for the item in the tree and returns a matching node if found * or NULL if not. * O(lg n) */ extern avl_node_t *avl_search(const avl_tree_t *, const void *item); #ifdef AVL_COUNT /* Returns the number of nodes in the tree. * O(1) */ extern unsigned int avl_count(const avl_tree_t *); /* Searches a node by its rank in the list. Counting starts at 0. * Returns NULL if the index exceeds the number of nodes in the tree. * O(lg n) */ extern avl_node_t *avl_at(const avl_tree_t *, unsigned int); /* Returns the rank of a node in the list. Counting starts at 0. * O(lg n) */ extern unsigned int avl_index(const avl_node_t *); #endif #endif eaf/src/eaf/common.h0000644000176200001440000000623414660712342014002 0ustar liggesusers#ifndef LIBMISC_COMMON_H_ # define LIBMISC_COMMON_H_ #ifdef R_PACKAGE #define R_NO_REMAP #include #define eaf_assert(EXP) \ do { if (!(EXP)) { Rf_error("eaf package: error: assertion failed: '%s' at %s:%d", \ #EXP, __FILE__, __LINE__);}} while(0) #define fatal_error(...) Rf_error(__VA_ARGS__) #define errprintf Rf_error #define warnprintf Rf_warning #include "gcc_attribs.h" #else #include #include #include #include "gcc_attribs.h" #include #define eaf_assert(X) assert(X) #define Rprintf(...) printf(__VA_ARGS__) void fatal_error(const char * format,...) __attribute__ ((format(printf, 1, 2))) __noreturn __unused; void errprintf(const char * format,...) __attribute__ ((format(printf, 1, 2))); void warnprintf(const char *format,...) __attribute__ ((format(printf, 1, 2))); #endif #if __GNUC__ >= 3 #define MAX(x,y) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(y) _y__ = (y); \ _x__ > _y__ ? _x__ : _y__; }) #define MIN(x,y) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(y) _y__ = (y); \ _x__ < _y__ ? _x__ : _y__; }) #define CLAMP(x, xmin, xmax) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(x) _xmin__ = (xmin); \ __typeof__(x) _xmax__ = (xmax); \ _x__ < _xmin__ ? _xmin__ : _x__ > _xmax__ ? _xmax__ : _x__; }) #else #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y)) #define CLAMP(x, xmin, xmax) MAX(xim, MIN(x, xmax)) #endif #define DEBUG_DO(X) do{ X;} while(0) #define DEBUG_NOT_DO(X) while(0){ X;} #if DEBUG >= 1 #define DEBUG1(X) DEBUG_DO(X) #else #define DEBUG1(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 2 #define DEBUG2(X) DEBUG_DO(X) #else #define DEBUG2(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 3 #define DEBUG3(X) DEBUG_DO(X) #else #define DEBUG3(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 4 #define DEBUG4(X) DEBUG_DO(X) #else #define DEBUG4(X) DEBUG_NOT_DO(X) #endif #ifndef R_PACKAGE #define DEBUG2_PRINT(...) DEBUG2 (fprintf (stderr, __VA_ARGS__)) #else #define DEBUG2_PRINT(...) DEBUG2 (Rprintf ( __VA_ARGS__)) #endif #define DEBUG2_FUNPRINT(...) \ do { DEBUG2_PRINT ("%s(): ", __FUNCTION__); \ DEBUG2_PRINT (__VA_ARGS__); } while(0) /* This is deprecated. See https://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html #if DEBUG >= 1 #ifndef MALLOC_CHECK_ #define MALLOC_CHECK_ 3 #endif #endif */ #include #define TRUE true #define FALSE false #ifndef ignore_unused_result #define ignore_unused_result(X) do { if(X) {}} while(0); #endif typedef unsigned long ulong; typedef long long longlong; static inline const char *str_is_default(bool flag) { return flag ? "(default)" : ""; } #endif /* !LIBMISC_COMMON_H_ */ eaf/src/eaf/gcc_attribs.h0000644000176200001440000000611114660712342014770 0ustar liggesusers#ifndef GCC_ATTRIBUTES #define GCC_ATTRIBUTES /* FIXME: does this handle C++? */ /* FIXME: add the explanation from the GCC documentation to each attribute. */ #ifndef __pure_func # define __pure_func __attribute__((pure)) #endif /* Many functions have no effects except the return value and their return value depends only on the parameters and/or global variables. Such a function can be subject to common subexpression elimination and loop optimization just as an arithmetic operator would be. Some of common examples of pure functions are strlen or memcmp. Interesting non-pure functions are functions with infinite loops or those depending on volatile memory or other system resource, that may change between two consecutive calls (such as feof in a multithreading environment). */ #ifndef __const_func # define __const_func __attribute__((const)) #endif /* Many functions do not examine any values except their arguments, and have no effects except the return value. Basically this is just slightly more strict class than the pure attribute below, since function is not allowed to read global memory. Note that a function that has pointer arguments and examines the data pointed to must not be declared const. Likewise, a function that calls a non-const function usually must not be const. It does not make sense for a const function to return void. */ # define __noreturn __attribute__((noreturn)) /* The noreturn keyword tells the compiler to assume that function cannot return. It can then optimize without regard to what would happen if fatal ever did return. This makes slightly better code. More importantly, it helps avoid spurious warnings of uninitialized variables. */ # define __malloc __attribute__((malloc)) /* The malloc attribute is used to tell the compiler that a function may be treated as if any non-NULL pointer it returns cannot alias any other pointer valid when the function returns. This will often improve optimization. Standard functions with this property include malloc and calloc. realloc-like functions have this property as long as the old pointer is never referred to (including comparing it to the new pointer) after the function returns a non-NULL value. */ # define __must_check __attribute__((warn_unused_result)) /* The warn_unused_result attribute causes a warning to be emitted if a caller of the function with this attribute does not use its return value. */ #ifndef __deprecated # define __deprecated __attribute__((deprecated)) #endif /* The deprecated attribute results in a warning if the function is used anywhere in the source file. */ #ifndef __used # define __used __attribute__((used)) #endif #ifndef __unused # define __unused __attribute__((unused)) #endif #ifndef __packed # define __packed __attribute__((packed)) #endif #if __GNUC__ >= 3 # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) #else # define __attribute__(x) /* If we're not using GNU C, elide __attribute__ */ # define likely(x) (x) # define unlikely(x) (x) #endif #endif eaf/src/Makevars.ucrt0000644000176200001440000000007214156576272014262 0ustar liggesusersCRT=-ucrt include Makevars.win OBJECTS = $(SOURCES:.c=.o) eaf/src/init.c0000644000176200001440000000554713706402717012725 0ustar liggesusers#include #include #include #include // for NULL /* .Call calls */ extern SEXP compute_eaf_C(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP compute_eafdiff_area_C(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP compute_eafdiff_rectangles_C(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP compute_eafdiff_C(SEXP, SEXP, SEXP, SEXP, SEXP); extern SEXP read_data_sets(SEXP); extern SEXP hypervolume_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE); extern SEXP hv_contributions_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE); extern SEXP normalise_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP RANGE, SEXP LBOUND, SEXP UBOUND, SEXP MAXIMISE); extern SEXP is_nondominated_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP MAXIMISE, SEXP KEEP_WEAKLY); extern SEXP pareto_ranking_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT); extern SEXP epsilon_mul_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); extern SEXP epsilon_add_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); extern SEXP igd_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); extern SEXP igd_plus_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); extern SEXP avg_hausdorff_dist_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE, SEXP P); extern SEXP rect_weighted_hv2d_C(SEXP DATA, SEXP NPOINT, SEXP RECTANGLES, SEXP RECTANGLES_NROW); extern SEXP whv_hype_C(SEXP DATA, SEXP NPOINTS, SEXP IDEAL, SEXP REFERENCE, SEXP DIST, SEXP SEED, SEXP NSAMPLES); #define DECLARE_CALL_ENTRY(NAME, NARGS) \ {#NAME, (DL_FUNC) &NAME, NARGS}, static const R_CallMethodDef CallEntries[] = { DECLARE_CALL_ENTRY(compute_eaf_C, 5) DECLARE_CALL_ENTRY(compute_eafdiff_area_C, 5) DECLARE_CALL_ENTRY(compute_eafdiff_rectangles_C, 5) DECLARE_CALL_ENTRY(compute_eafdiff_C, 5) DECLARE_CALL_ENTRY(read_data_sets, 1) DECLARE_CALL_ENTRY(hypervolume_C, 4) DECLARE_CALL_ENTRY(hv_contributions_C, 4) DECLARE_CALL_ENTRY(normalise_C, 7) DECLARE_CALL_ENTRY(is_nondominated_C, 5) DECLARE_CALL_ENTRY(pareto_ranking_C, 3) DECLARE_CALL_ENTRY(rect_weighted_hv2d_C, 4) DECLARE_CALL_ENTRY(whv_hype_C, 7) DECLARE_CALL_ENTRY(epsilon_add_C, 6) DECLARE_CALL_ENTRY(epsilon_mul_C, 6) DECLARE_CALL_ENTRY(igd_C, 6) DECLARE_CALL_ENTRY(igd_plus_C, 6) DECLARE_CALL_ENTRY(avg_hausdorff_dist_C, 7) {NULL, NULL, 0} }; void R_init_eaf(DllInfo *dll) { R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } eaf/src/Makevars.in0000644000176200001440000000132714660417401013703 0ustar liggesusers# -*- mode: makefile -*- # set by configure GSL_CFLAGS = @GSL_CFLAGS@ GSL_LIBS = @GSL_LIBS@ # Do not put GCC specific flags here. Put them instead in CFLAGS and # CXXFLAGS in ~/.R/Makevars LTO = $(LTO_OPT) DEBUG=0 PKG_CPPFLAGS = $(GSL_CFLAGS) -DR_PACKAGE -DDEBUG=$(DEBUG) -I./eaf/ -I./mo-tools/ $(LTO) PKG_LIBS = $(GSL_LIBS) EAF_SRC_FILES= avl.c eaf3d.c eaf.c io.c MOTOOLS_SRC_FILES = hv_contrib.c hv.c pareto.c whv.c whv_hype.c SOURCES = $(EAF_SRC_FILES:%=eaf/%) $(MOTOOLS_SRC_FILES:%=mo-tools/%) init.c Reaf.c Repsilon.c Rhv.c Rnondominated.c OBJECTS = $(SOURCES:.c=.o) export GSL_CFLAGS GSL_LIBS .PHONY: all clean all: $(SHLIB) $(SHLIB): $(OBJECTS) clean: @-rm -f *.o *.so *.dll eaf/*.o mo-tools/*.o eaf/src/Repsilon.c0000644000176200001440000000652114447270672013554 0ustar liggesusers#include "Rcommon.h" #include "epsilon.h" #include "igd.h" #include "nondominated.h" SEXP epsilon_mul_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); SEXP epsilon_add_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE); enum unary_metric_t { EPSILON_ADD, EPSILON_MUL, INV_GD, INV_GDPLUS, AVG_HAUSDORFF }; static SEXP unary_metric_ref(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE, enum unary_metric_t metric, SEXP EXTRA) { int nprotected = 0; SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); double *ref = REAL(REFERENCE); SEXP_2_INT(REFERENCE_SIZE, ref_size); SEXP_2_LOGICAL_VECTOR(MAXIMISE, maximise, maximise_len); if (nobj != maximise_len) Rf_error("length of maximise (%d) is different from number of objectives (%d)", maximise_len, nobj); signed char * minmax = create_minmax(nobj, maximise); new_real_vector(value, 1); double *data = REAL(DATA); switch(metric) { case EPSILON_ADD: value[0] = epsilon_additive (nobj, minmax, data, npoint, ref, ref_size); break; case EPSILON_MUL: value[0] = epsilon_mult (nobj, minmax, data, npoint, ref, ref_size); break; case INV_GD: value[0] = IGD (nobj, minmax, data, npoint, ref, ref_size); break; case INV_GDPLUS: value[0] = IGD_plus (nobj, minmax, data, npoint, ref, ref_size); break; case AVG_HAUSDORFF: { SEXP_2_INT(EXTRA, p); value[0] = avg_Hausdorff_dist (nobj, minmax, data, npoint, ref, ref_size, p); break; } default: Rf_error("unknown unary metric"); } free (minmax); UNPROTECT (nprotected); return Rexp(value); } SEXP epsilon_mul_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE) { return(unary_metric_ref(DATA, NOBJ, NPOINT, REFERENCE, REFERENCE_SIZE, MAXIMISE, EPSILON_MUL, R_NilValue)); } SEXP epsilon_add_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE) { return(unary_metric_ref(DATA, NOBJ, NPOINT, REFERENCE, REFERENCE_SIZE, MAXIMISE, EPSILON_ADD, R_NilValue)); } SEXP igd_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE) { return(unary_metric_ref(DATA, NOBJ, NPOINT, REFERENCE, REFERENCE_SIZE, MAXIMISE, INV_GD, R_NilValue)); } SEXP igd_plus_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE) { return(unary_metric_ref(DATA, NOBJ, NPOINT, REFERENCE, REFERENCE_SIZE, MAXIMISE, INV_GDPLUS, R_NilValue)); } SEXP avg_hausdorff_dist_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP REFERENCE, SEXP REFERENCE_SIZE, SEXP MAXIMISE, SEXP P) { return(unary_metric_ref(DATA, NOBJ, NPOINT, REFERENCE, REFERENCE_SIZE, MAXIMISE, AVG_HAUSDORFF, P)); } eaf/src/mo-tools/0000755000176200001440000000000014660712374013357 5ustar liggesuserseaf/src/mo-tools/svn_version0000644000176200001440000000000314660712340015637 0ustar liggesusers175eaf/src/mo-tools/README0000644000176200001440000000170614660712340014234 0ustar liggesusersnondominated ------------ Obtain information and perform some operations on the nondominated sets given as input. Building `nondominated' ----------------------- The program has been tested on GNU/Linux using bash as shell and a recent version of GCC (>= 4.2). If you have success or problems using other systems, please let me know. I recommend that you compile specifically for your architecture using GCC option -march=. The default compilation is done with: make nondominated This uses the option "-march=native". If your GCC version does not support "native", you can give an explicit architecture: make nondominated march=i686 See the GCC manual for the names of the architectures supported by your version of GCC. Using `nondominated' -------------------- See the output of nondominated --help License ------- See LICENSE file or contact the author. Contact ------- Manuel Lopez-Ibanez eaf/src/mo-tools/cmdline.h0000644000176200001440000000566014660712340015143 0ustar liggesusers#ifndef CMDLINE_H #define CMDLINE_H #ifndef CMDLINE_COPYRIGHT_YEARS #define CMDLINE_COPYRIGHT_YEARS "2007-2018" #endif #ifndef CMDLINE_AUTHORS #define CMDLINE_AUTHORS "Manuel Lopez-Ibanez \n" #endif #ifndef MARCH #define MARCH "unknown" #endif #define OPTION_HELP_STR \ " -h, --help print this summary and exit; \n" #define OPTION_VERSION_STR \ " --version print version number and exit; \n" #define OPTION_OBJ_STR \ " -o, --obj=[+|-]... specify whether each objective should be minimised (-)\n" \ " or maximised (+). By default all are minimised; \n" #define OPTION_QUIET_STR \ " -q, --quiet print as little as possible \n" extern char *program_invocation_short_name; static void version(void) { printf("%s version %s (optimised for %s)\n\n", program_invocation_short_name, VERSION, MARCH); printf( "Copyright (C) " CMDLINE_COPYRIGHT_YEARS "\n" CMDLINE_AUTHORS "\n" "This is free software, and you are welcome to redistribute it under certain\n" "conditions. See the GNU General Public License for details. There is NO \n" "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" "\n" ); } #ifndef READ_INPUT_WRONG_INITIAL_DIM_ERRSTR #define READ_INPUT_WRONG_INITIAL_DIM_ERRSTR "-r, --reference" #endif static inline void handle_read_data_error (int err, const char *filename) { switch (err) { case 0: /* No error */ break; case READ_INPUT_FILE_EMPTY: errprintf ("%s: no input data.", filename); exit (EXIT_FAILURE); case READ_INPUT_WRONG_INITIAL_DIM: errprintf ("check the argument of " READ_INPUT_WRONG_INITIAL_DIM_ERRSTR ".\n"); /* fall-through */ default: exit (EXIT_FAILURE); } } /* FILENAME: input filename. If NULL, read stdin. REFERENCE: reference point. If NULL, caculate it from the input file. NOBJ_P: pointer to number of objectives. If NULL, calculate it from input file. */ static inline int read_reference_set (double **reference_p, const char *filename, int *nobj_p) { double *reference = NULL; int *cumsizes = NULL; int nruns = 0; int nobj = *nobj_p; int reference_size; int err = read_double_data (filename, &reference, &nobj, &cumsizes, &nruns); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); assert (nruns == 1); reference_size = cumsizes[0]; free (cumsizes); *nobj_p = nobj; *reference_p = reference; return reference_size; } static inline char * m_strcat(const char * a, const char * b) { int dest_len = strlen(a) + strlen(b) + 1; char *dest = malloc (sizeof(char) * dest_len); if (dest == NULL) return NULL; strcpy (dest, a); strcat (dest, b); return dest; } #endif eaf/src/mo-tools/nondominated.h0000644000176200001440000001651614660712340016211 0ustar liggesusers#ifndef NONDOMINATED_H #define NONDOMINATED_H #include "common.h" #include // memcpy enum objs_agree_t { AGREE_MINIMISE = -1, AGREE_NONE = 0, AGREE_MAXIMISE = 1 }; /* Convert from int vector to minmax vector. */ static inline signed char * create_minmax(int nobj, const int * maximise) { signed char * minmax = malloc(sizeof(signed char) * nobj); for (int k = 0; k < nobj; k++) { minmax[k] = (maximise[k] == TRUE) ? AGREE_MAXIMISE : (maximise[k] == FALSE) ? AGREE_MINIMISE : AGREE_NONE; } return minmax; } static inline bool * nondom_init (size_t size) { bool * nondom = malloc (sizeof(bool) * size); for (size_t n = 0; n < size; n++) nondom[n] = true; return nondom; } /* When find_dominated_p == true, then stop as soon as one dominated point is found and return its position. When find_dominated_p == true, store which points are nondominated in nondom and return the number of nondominated points. */ static inline int find_nondominated_set_ (const double *points, int dim, int size, const signed char *minmax, const signed char agree, bool *nondom, bool find_dominated_p, bool keep_weakly) { int j, k, d; for (k = 0; k < size - 1; k++) { for (j = k + 1; j < size; j++) { if (!nondom[k]) break; if (!nondom[j]) continue; bool k_leq_j = true; bool j_leq_k = true; const double *pk = points + k * dim; const double *pj = points + j * dim; /* FIXME: As soon as j_leq_k and k_leq_j become false, neither k or j will be removed, so break. */ /* FIXME: Do not handle agree here, assume that objectives have been fixed already to agree on minimization/maximization. */ if (agree < 0) { for (d = 0; d < dim; d++) { j_leq_k = j_leq_k && (pj[d] <= pk[d]); k_leq_j = k_leq_j && (pk[d] <= pj[d]); } } else if (agree > 0) { for (d = 0; d < dim; d++) { j_leq_k = j_leq_k && (pj[d] >= pk[d]); k_leq_j = k_leq_j && (pk[d] >= pj[d]); } } else { for (d = 0; d < dim; d++) { if (minmax[d] < 0) { j_leq_k = j_leq_k && (pj[d] <= pk[d]); k_leq_j = k_leq_j && (pk[d] <= pj[d]); } else if (minmax[d] > 0) { j_leq_k = j_leq_k && (pj[d] >= pk[d]); k_leq_j = k_leq_j && (pk[d] >= pj[d]); } } } // k is removed if it is weakly dominated by j (unless remove_weakly). nondom[k] = !j_leq_k || (keep_weakly && k_leq_j); // j is removed if it is dominated by k. nondom[j] = (!k_leq_j || j_leq_k); eaf_assert(nondom[k] || nondom[j]); /* both cannot be removed. */ if (find_dominated_p && (!nondom[k] || !nondom[j])) { return nondom[k] ? j : k; } } } if (find_dominated_p) return -1; int new_size = 0; for (k = 0; k < size; k++) if (nondom[k]) new_size++; return new_size; } static inline int find_dominated_point (const double *points, int dim, int size, const signed char *minmax) { bool *nondom = nondom_init (size); int pos = find_nondominated_set_ (points, dim, size, minmax, AGREE_NONE, nondom, /* find_dominated_p = */true, /* keep_weakly = */false); free (nondom); return pos; } static inline int find_nondominated_set_agree (const double *points, int dim, int size, const signed char *minmax, const signed char agree, bool *nondom) { return find_nondominated_set_ (points, dim, size, minmax, agree, nondom, /* find_dominated_p = */false, /* keep_weakly = */false); } static inline int find_nondominated_set (const double *points, int dim, int size, const signed char *minmax, bool *nondom) { return find_nondominated_set_ (points, dim, size, minmax, AGREE_NONE, nondom, /* find_dominated_p = */false, /* keep_weakly = */false); } static inline int find_weak_nondominated_set (const double *points, int dim, int size, const signed char *minmax, bool *nondom) { return find_nondominated_set_ (points, dim, size, minmax, AGREE_NONE, nondom, /* find_dominated_p = */false, /* keep_weakly = */true); } static inline int get_nondominated_set (double **pareto_set_p, const double *points, int dim, int size, const signed char *minmax) { bool *nondom = nondom_init(size); int new_size = find_nondominated_set (points, dim, size, minmax, nondom); DEBUG2 ( fprintf (stderr, "# size\tnondom\tdom\n"); fprintf (stderr, " %d\t%d\t%d\n", size, new_size, size - new_size); ); if (new_size > size) {/* This can't happen. */ fatal_error ("%s:%d: a bug happened: new_size > old_size!\n", __FILE__, __LINE__); } double *pareto_set = malloc (sizeof (double) * new_size * dim); int n, k; // FIXME: We could use new_size to stop earlier. for (n = 0, k = 0; n < size; n++) { if (!nondom[n]) continue; memcpy(&pareto_set[dim * k], &points[dim * n], sizeof(points[0]) * dim); k++; } eaf_assert (k == new_size); free (nondom); *pareto_set_p = pareto_set; return new_size; } static inline void agree_objectives (double *points, int dim, int size, const signed char *minmax, const signed char agree) { for (int d = 0; d < dim; d++) if ((agree > 0 && minmax[d] < 0) || (agree < 0 && minmax[d] > 0)) for (int k = 0; k < size; k++) points[k * dim + d] = -(points[k * dim + d]); } static inline void normalise (double *points, int dim, int size, const signed char *minmax, signed char agree, const double lower_range, const double upper_range, const double *lbound, const double *ubound) { int k, d; const double range = upper_range - lower_range; double *diff = malloc (dim * sizeof(double)); for (d = 0; d < dim; d++) { diff[d] = ubound[d] - lbound[d]; if (diff[d] == 0.0) // FIXME: Should we use approximate equality? diff[d] = 1; // FIXME: Do we need to handle agree? } for (k = 0; k < size; k++) { double *p = points + k * dim; for (d = 0; d < dim; d++) if ((agree > 0 && minmax[d] < 0) || (agree < 0 && minmax[d] > 0)) p[d] = lower_range + range * (ubound[d] + p[d]) / diff[d]; else p[d] = lower_range + range * (p[d] - lbound[d]) / diff[d]; } free (diff); } int * pareto_rank (const double *points, int dim, int size); #endif /* NONDOMINATED_H */ eaf/src/mo-tools/libhv.mk0000644000176200001440000000020414660712340015001 0ustar liggesusers# -*- Makefile-gmake -*- HV_SRCS = hv.c HV_HDRS = hv.h HV_OBJS = $(HV_SRCS:.c=.o) ## Dependencies: $(HV_OBJS): $(HV_HDRS) eaf/src/mo-tools/ndsort.c0000644000176200001440000002307614660712340015035 0ustar liggesusers/************************************************************************* ndsort: Perform nondominated sorting in a list of points. --------------------------------------------------------------------- Copyright (c) 2011 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at ---------------------------------------------------------------------- IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. --------------------------------------------------------------------- Literature: *************************************************************************/ #include "io.h" #include "nondominated.h" // for normalise() #include #include #include #include #include // for isspace() #include // for getopt() #include // for getopt_long() #include // for INFINITY #define READ_INPUT_WRONG_INITIAL_DIM_ERRSTR "-o, --obj" #include "cmdline.h" #include "hv.h" char *program_invocation_short_name = "ndsort"; static void usage(void) { printf("\n" "Usage: %s [OPTIONS] [FILE...]\n\n", program_invocation_short_name); printf( "Perform nondominated sorting in a list of points. \n\n" "Options:\n" OPTION_HELP_STR OPTION_VERSION_STR " -h, --help give this summary and exit. \n" " --version print version number and exit. \n" " -v, --verbose print some information (time, number of points, etc.) \n" OPTION_QUIET_STR //" -H, --hypervolume use hypervolume contribution to break ties \n" " -k, --keep-uevs keep uniquely extreme values \n" " -r, --rank don't break ties using hypervolume contribution \n" OPTION_OBJ_STR "\n"); } static bool verbose_flag = false; static void fprint_rank (FILE * stream, const int * rank, int size) { int k; for (k = 0; k < size; k++) { fprintf (stream, "%d\n", rank[k]); } } static void fprint_vector_double (FILE * stream, const double * vec, int size) { for (int k = 0; k < size; k++) fprintf (stream, "%g\n", vec[k]); } static bool * calculate_uev (bool *uev, const double *points, int dim, int size, const double *lbound, const double *ubound) { if (uev == NULL) { uev = malloc (sizeof(bool) * size); } for (int j = 0; j < size; j++) uev[j] = false; for (int i = 0; i < dim; i++) { assert (ubound[i] > -INFINITY); assert (lbound[i] < INFINITY); for (int j = 0; j < size; j++) { if (points[j * dim + i] == ubound[i]) { uev[j] = true; break; } } for (int j = 0; j < size; j++) { if (points[j * dim + i] == lbound[i]) { uev[j] = true; break; } } } return uev; } int main(int argc, char *argv[]) { int nsets = 0; int *cumsizes = NULL; double *points = NULL; int dim = 0; const char *filename; const signed char *minmax = NULL; bool only_rank_flag = false; // bool hypervolume_flag = false; // bool keep_uevs_flag = false; /* see the man page for getopt_long for an explanation of these fields */ static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, // {"hypervolume",no_argument, NULL, 'H'}, {"keep-uevs", no_argument, NULL, 'k'}, {"rank", no_argument, NULL, 'r'}, {"obj", required_argument, NULL, 'o'}, {NULL, 0, NULL, 0} /* marks end of list */ }; int opt; /* it's actually going to hold a char */ int longopt_index; while (0 < (opt = getopt_long(argc, argv, "hVvqkro:", long_options, &longopt_index))) { switch (opt) { case 'V': // --version version(); exit(EXIT_SUCCESS); case 'q': // --quiet verbose_flag = false; break; case 'v': // --verbose verbose_flag = true; break; case 'r': // --rank only_rank_flag = true; break; case 'k': // --keep-uevs // keep_uevs_flag = true; fprintf(stderr, "%s: --keep-uevs not implemented yet!\n",program_invocation_short_name); exit(EXIT_FAILURE); break; case 'o': // --obj minmax = read_minmax (optarg, &dim); if (minmax == NULL) { fprintf(stderr, "%s: invalid argument '%s' for -o, --obj\n", program_invocation_short_name,optarg); exit(EXIT_FAILURE); } break; case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); case 'h': usage(); exit(EXIT_SUCCESS); default: // should never happen abort(); } } int numfiles = argc - optind; if (numfiles <= 0) {/* No input files: read stdin. */ filename = NULL; } else if (numfiles == 1) { filename = argv[optind]; } else { errprintf ("more than one input file not handled yet."); exit(EXIT_FAILURE); } /* FIXME: Instead of this strange call, create a wrapper read_data_robust. */ int err = read_double_data (filename, &points, &dim, &cumsizes, &nsets); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); const int size = cumsizes[0] = cumsizes[nsets - 1]; nsets = 1; /* Default minmax if not set yet. */ if (minmax == NULL) minmax = read_minmax (NULL, &dim); if (verbose_flag) { printf ("# file: %s\n", filename); printf ("# points: %d\n", size); } int * rank = pareto_rank (points, dim, size); if (only_rank_flag) { fprint_rank (stdout, rank, size); } else { bool *uev = NULL; static const double upper_range = 0.9; static const double lower_range = 0.0; double * order = malloc (sizeof(double) * size); int max_rank = 0; for (int k = 0; k < size; k++) { if (rank[k] > max_rank) max_rank = rank[k]; order[k] = rank[k]; } double * data = malloc (sizeof(double) * size * dim); double * lbound = malloc(sizeof(double) * dim); double * ubound = malloc(sizeof(double) * dim); double * ref = malloc(sizeof(double) * dim); for (int d = 0; d < dim; d++) ref[d] = 1.0; max_rank = 1; for (int i = 1; i <= max_rank; i++) { for (int d = 0; d < dim; d++) { lbound[d] = INFINITY; ubound[d] = -INFINITY; } int data_size = 0; for (int k = 0; k < size; k++) { if (rank[k] != i) continue; const double *src = points + k * dim; memcpy (data + data_size * dim, src, sizeof(double) * dim); data_size++; for (int d = 0; d < dim; d++) { if (lbound[d] > src[d]) lbound[d] = src[d]; if (ubound[d] < src[d]) ubound[d] = src[d]; } } uev = calculate_uev (uev, data, dim, data_size, lbound, ubound); normalise (data, dim, data_size, minmax, AGREE_NONE, lower_range, upper_range, lbound, ubound); double *hvc = malloc (sizeof(double) * data_size); hv_contributions (hvc, data, dim, data_size, ref); /* FIXME: handle uevs: keep_uevs_flag ? uev : NULL);*/ for (int k = 0, j = 0; k < size; k++) { if (rank[k] != i) continue; order[k] += (1 - hvc[j++]); } free (hvc); } free (data); free (lbound); free (ubound); free (ref); fprint_vector_double (stdout, order, size); free (order); } free (rank); free (cumsizes); free (points); free ((void *) minmax); return 0; } eaf/src/mo-tools/gcc.mk0000644000176200001440000000146114660712340014437 0ustar liggesusers# -*- Makefile-gmake -*- WARN_CFLAGS = -pedantic -Wall -Wextra -Wvla SANITIZERS= -fsanitize=undefined -fsanitize=address ifeq ($(DEBUG), 0) OPT_CFLAGS ?= -O3 -flto -DNDEBUG # Options -funroll-loops -ffast-math -msse -mfpmath=sse improve performance but are not portable. # Options -fstandard-precision=fast -ftree-vectorize are not well # supported in some versions/architectures. else OPT_CFLAGS += -g3 -O0 $(SANITIZERS) endif ifdef march MARCH=$(march) endif ifndef MARCH MARCH=native endif gcc-guess-march = $(strip $(shell $(CC) -march=$(MARCH) $(CFLAGS) -x c -S -\#\#\# - < /dev/null 2>&1 | \ grep -m 1 -e cc1 | grep -o -e "march=[^'\"]*" | head -n 1 | sed 's,march=,,')) ifeq ($(gcc-guess-march),) gcc-guess-march=unknown endif ifneq ($(MARCH),none) OPT_CFLAGS += -march=$(MARCH) endif eaf/src/mo-tools/whv_hype.c0000644000176200001440000002050314660712340015345 0ustar liggesusers#include "whv_hype.h" #undef DEBUG #define DEBUG 1 #include "common.h" #include "nondominated.h" #include #include #include #include static gsl_rng * rng_new(unsigned long int seed) { gsl_rng * rng = gsl_rng_alloc (gsl_rng_taus2); gsl_rng_set(rng, seed); return rng; } static double rng_double(gsl_rng * rng, double low, double high) { eaf_assert(rng != NULL); return(low + (gsl_rng_uniform(rng)*high)); } struct hype_sample_dist { enum hype_sample_dist_type type; gsl_rng * rng; double * lower; double * upper; double * mu; }; enum hype_sample_dist_type hype_dist_get_type(const hype_sample_dist * d) { eaf_assert(d != NULL); return d->type; } static hype_sample_dist * hype_dist_new(unsigned long int seed) { hype_sample_dist * dist = malloc(sizeof(hype_sample_dist)); dist->rng = rng_new(seed); const int nobj = 2; dist->lower = malloc(sizeof(double) * nobj); dist->upper = malloc(sizeof(double) * nobj); for (int i = 0; i < nobj; i++) { dist->lower[i] = 0; dist->upper[i] = 1; } dist->mu = NULL; return dist; } hype_sample_dist * hype_dist_gaussian_new(const double *mu, unsigned long int seed) { hype_sample_dist *dist = hype_dist_new(seed); dist->type = HYPE_DIST_GAUSSIAN; const int nobj = 2; dist->mu = malloc(sizeof(double) * nobj); memcpy(dist->mu, mu, sizeof(double) * nobj); return dist; } hype_sample_dist * hype_dist_exp_new(double mu, unsigned long int seed) { hype_sample_dist *dist = hype_dist_new(seed); dist->type = HYPE_DIST_EXPONENTIAL; dist->mu = malloc(sizeof(double) * 1); dist->mu[0] = mu; return dist; } hype_sample_dist * hype_dist_unif_new(unsigned long int seed) { hype_sample_dist *dist = hype_dist_new(seed); dist->type = HYPE_DIST_UNIFORM; return dist; } void hype_dist_free(hype_sample_dist * d) { gsl_rng_free(d->rng); if (d->mu) free(d->mu); free(d->lower); free(d->upper); free(d); } static double * exp_dist_sample(hype_sample_dist * dist, size_t nsamples) { const int nobj = 2; const double *lower = dist->lower; const double *upper = dist->upper; double * samples = malloc(sizeof(double) * nsamples * nobj); size_t n = 0.5 * nsamples; double mu = dist->mu[0]; for (size_t i = 0; i < n; i++) { double x = rng_double(dist->rng, 0, 1); samples[i * nobj + 0] = lower[0] - mu * log(x); x = rng_double(dist->rng, 0, 1); samples[i * nobj + 1] = lower[1] + x * (upper[1] - lower[1]); } for (size_t i = n; i < nsamples; i++) { double x = rng_double(dist->rng, 0, 1); samples[i * nobj + 0] = lower[0] + x * (upper[0] - lower[0]); x = rng_double(dist->rng, 0, 1); samples[i * nobj + 1] = lower[1] - mu * log(x); } return samples; } static double * gaussian_dist_sample(hype_sample_dist * dist, size_t nsamples) { const int nobj = 2; double * samples = malloc(sizeof(double) * nsamples * nobj); double sigma_x = 0.25; double sigma_y = 0.25; for (size_t i = 0; i < nsamples; i++) { double x, y; gsl_ran_bivariate_gaussian(dist->rng, sigma_x, sigma_y, /*rho=*/1.0, &x, &y); /* FIXME: do we need to use the truncated distribution? samples[i * nobj + 0] = CLAMP(dist->mu[0] + x, 0.0, 1.0); samples[i * nobj + 1] = CLAMP(dist->mu[1] + y, 0.0, 1.0); */ samples[i * nobj + 0] = dist->mu[0] + x; samples[i * nobj + 1] = dist->mu[1] + y; //fprintf(stderr, "x = %g (%g), y = %g (%g)\n", // x, samples[i * nobj + 0], y, samples[i * nobj + 1]); } return samples; } static double * uniform_dist_sample(hype_sample_dist * dist, size_t nsamples) { const int nobj = 2; const double *lower = dist->lower; const double *upper = dist->upper; double * samples = malloc(sizeof(double) * nsamples * nobj); for (size_t i = 0; i < nsamples; i++) { for (int d = 0; d < nobj; d++) { double x = rng_double(dist->rng, 0, 1); samples[i * nobj + d] = x * (upper[d] - lower[d]); } //printf("sample: { %g, %g }\n", samples[i * nobj + 0], samples[i * nobj + 1]); } return samples; } typedef double *(*hype_sample_fn)(hype_sample_dist *, size_t); static hype_sample_fn hype_dist_get_sample_fn(const hype_sample_dist * d) { switch(d->type) { case HYPE_DIST_UNIFORM: return uniform_dist_sample; case HYPE_DIST_EXPONENTIAL: return exp_dist_sample; case HYPE_DIST_GAUSSIAN: return gaussian_dist_sample; default: fatal_error("%s:%d: unknown hype_sample_dist type: %d\n", __FILE__, __LINE__, d->type); return NULL; } } static double estimate_whv(const double *points, size_t npoints, const double * samples, size_t nsamples) { const int nobj = 2; /* // compute alpha factor of HypE fitness: */ /* double * alpha = malloc(npoints * sizeof(double)); */ /* for (int i = 1; i <= npoints; i++) { */ /* alpha[i - 1] = 1.0 / i; */ /* } */ double whv = 0.0; // compute amount of dominators in p for each sample: unsigned int * dominated = calloc(nsamples, sizeof(unsigned int)); for (size_t s = 0; s < nsamples; s++) { const double *sample = samples + s * nobj; // compute amount of dominators in p for each sample: for (size_t j = 0; j < npoints; j++) { bool dom = true; const double *p = points + j * nobj; for (int d = 0; d < nobj; d++) { if (sample[d] < p[d]) { dom = false; break; } } if (dom) dominated[s]++; } // sum up alpha values of each dominated sample: for (size_t j = 0; j < npoints; j++) { bool dom = true; const double *p = points + j * nobj; for (int d = 0; d < nobj; d++) { if (sample[d] < p[d]) { dom = false; break; } } if (dom) { eaf_assert(dominated[s] > 0); whv += 1.0 / dominated[s]; //fprintf(stderr, "whv = %g\n", whv); } } } free(dominated); //free(alpha); return whv; } static double calculate_volume_between_points(const double *p1, const double * p2, size_t dim) { double volume = 1.0; for (size_t k = 0; k < dim; k++) volume *= (p2[k] - p1[k]); return volume; } static void normalise01_inplace(double *points, size_t dim, size_t npoints, const double *lbound, const double *ubound) { signed char * minmax = malloc(sizeof(signed char) * dim); memset(minmax, -1, sizeof(signed char) * dim); normalise(points, dim, npoints, minmax, /*agree=*/-1, 0.0, 1.0, lbound, ubound); free(minmax); } static double * normalise01(const double *points, size_t dim, size_t npoints, const double *lbound, const double *ubound) { double * points2 = malloc(sizeof(double) * dim * npoints); memcpy(points2, points, sizeof(double) * dim * npoints); normalise01_inplace(points2, dim, npoints, lbound, ubound); return points2; } double whv_hype_estimate(const double *points, size_t npoints, const double *ideal, const double *ref, hype_sample_dist * dist, size_t nsamples) { hype_sample_fn create_samples = hype_dist_get_sample_fn(dist); if (!create_samples) return NAN; const int nobj = 2; /* FIXME: this modifies mu, it would be better to keep mu and use a copy */ if (dist->type == HYPE_DIST_GAUSSIAN) { normalise01_inplace(dist->mu, nobj, 1, ideal, ref); //fprintf(stderr, "mu = %g, %g\n", dist->mu[0], dist->mu[1]); } const double * samples = create_samples(dist, nsamples); const double * points2 = normalise01(points, nobj, npoints, ideal, ref); double whv = estimate_whv(points2, npoints, samples, nsamples); free((void *)samples); free((void *)points2); /* Eq 18 */ //fprintf(stderr, "whv = %g\n", whv); whv *= calculate_volume_between_points(ideal, ref, nobj) / nsamples; //fprintf(stderr, "whv = %g\n", whv); return whv; } eaf/src/mo-tools/whv.h0000644000176200001440000000024214660712340014323 0ustar liggesusers#ifndef WHV_H #define WHV_H #include double rect_weighted_hv2d(double *data, size_t n, double * rectangles, size_t rectangles_nrow); #endif // WHV_H eaf/src/mo-tools/igd.c0000644000176200001440000003345214660712340014266 0ustar liggesusers/************************************************************************* Inverted Generational Distance --------------------------------------------------------------------- Copyright (c) 2016 Manuel Lopez-Ibanez Leonardo C.T. Bezerra This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. --------------------------------------------------------------------- Literature: [1] Eckart Zitzler, Lothar Thiele, Marco Laumanns, Carlos M. Fonseca and Viviane Grunert da Fonseca. "Performance assessment of multiobjective optimizers: an analysis and review," Evolutionary Computation, IEEE Transactions on , vol.7, no.2, pp. 117-132, April 2003. [2] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid population-based algorithms for the bi-objective quadratic assignment problem. Journal of Mathematical Modelling and Algorithms, 5(1):111-137, April 2006. *************************************************************************/ #include #include #include #include #include #include // for isspace() #include // for getopt() #include // for getopt_long() #include "igd.h" #include "nondominated.h" char *program_invocation_short_name = "igd"; #define CMDLINE_COPYRIGHT_YEARS "2016" #define CMDLINE_AUTHORS "Manuel Lopez-Ibanez \n" \ "Leonardo C. T. Bezerra \n" #include "cmdline.h" static bool verbose_flag = false; static unsigned int exponent_p = 1; static bool gd = false; static bool igd = false; static bool gdp = false; static bool igdp = true; static bool igdplus = false; static bool hausdorff = false; static const char *suffix = NULL; static void usage(void) { printf("\n" "Usage:\n" " %s [OPTIONS] [FILES] \n" " %s [OPTIONS] < [INPUT] > [OUTPUT]\n\n", program_invocation_short_name, program_invocation_short_name); printf( "Calculates the inverted generational distance (IGD) measure for the Pareto sets given as input\n\n" "Options:\n" OPTION_HELP_STR OPTION_VERSION_STR " -v, --verbose print some information (time, number of points, etc.) \n" OPTION_QUIET_STR " , --gd %s report classical GD\n" " , --igd %s report classical IGD\n" " , --gd-p %s report GD_p (p=1 by default)\n" " , --igd-p %s report IGD_p (p=1 by default)\n" " , --igd-plus %s report IGD+\n" " , --hausdorff %s report avg Hausdorff distance = max (GD_p, IGD_p)\n" " -a, --all compute everything\n" " -p, exponent that averages the distances\n" " -r, --reference FILE file that contains the reference set \n" OPTION_OBJ_STR " -s, --suffix=STRING Create an output file for each input file by appending\n" " this suffix. This is ignored when reading from stdin. \n" " If missing, output is sent to stdout. \n" "\n", str_is_default(gd), str_is_default(igd), str_is_default(gdp), str_is_default(igdp), str_is_default(igdplus), str_is_default(hausdorff)); } static void do_file (const char *filename, double *reference, int reference_size, int *nobj_p, const signed char * minmax) { double *data = NULL; int *cumsizes = NULL; int nruns = 0; int nobj = *nobj_p; int err = read_double_data (filename, &data, &nobj, &cumsizes, &nruns); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); char *outfilename = NULL; FILE *outfile = stdout; if (filename != stdin_name && suffix) { outfilename = m_strcat(filename, suffix); outfile = fopen (outfilename, "w"); if (outfile == NULL) { errprintf ("%s: %s\n", outfilename, strerror(errno)); exit (EXIT_FAILURE); } } #if 0 if (union_flag) { cumsizes[0] = cumsizes[nruns - 1]; nruns = 1; } #endif /* Default minmax if not set yet. */ bool free_minmax = false; if (minmax == NULL) { minmax = read_minmax (NULL, &nobj); free_minmax = true; } const char * sep = ""; if (verbose_flag) { printf("# file: %s\n", filename); printf("# metrics (Euclidean distance) "); if (gd) { printf("GD"); sep = "\t"; } if (igd) { printf("%s", sep); printf("IGD"); sep = "\t"; } if (gdp) { printf("%s", sep); printf("GD_%d", exponent_p); sep = "\t"; } if (igdp) { printf("%s", sep); printf("IGD_%d", exponent_p); sep = "\t"; } if (igdplus) { printf("%s", sep); printf("IGD+"); sep = "\t"; } if (hausdorff) { printf("%s", sep); printf("avg_Hausdorff"); } printf("\n"); } int n; int cumsize; for (n = 0, cumsize = 0; n < nruns; cumsize = cumsizes[n], n++) { double __unused time_elapsed = 0; int size_a = cumsizes[n] - cumsize; const double *points_a = &data[nobj * cumsize]; //Timer_start (); sep = ""; #define print_value_if(IF, VALUE) \ do { \ if (IF) { \ fprintf (outfile, "%s%-16.15g", sep, VALUE); \ sep = "\t"; \ } \ } while(0) print_value_if (gd, GD (nobj, minmax, points_a, size_a, reference, reference_size)); print_value_if(igd, IGD (nobj, minmax, points_a, size_a, reference, reference_size)); print_value_if(gdp, GD_p (nobj, minmax, points_a, size_a, reference, reference_size, exponent_p)); print_value_if (igdp, IGD_p (nobj, minmax, points_a, size_a, reference, reference_size, exponent_p)); print_value_if (igdplus, IGD_plus (nobj, minmax, points_a, size_a, reference, reference_size)); print_value_if (hausdorff, avg_Hausdorff_dist (nobj, minmax, points_a, size_a, reference, reference_size, exponent_p)); //time_elapsed = Timer_elapsed_virtual (); fprintf(outfile, "\n"); /* if (verbose_flag) */ /* fprintf (outfile, "# Time: %f seconds\n", time_elapsed); */ } if (outfilename) { if (verbose_flag) fprintf (stderr, "# %s -> %s\n", filename, outfilename); fclose (outfile); free (outfilename); } free (data); free (cumsizes); if (free_minmax) free( (void *) minmax); *nobj_p = nobj; } int main(int argc, char *argv[]) { double *reference = NULL; int reference_size = 0; int nobj = 0; const signed char *minmax = NULL; enum { GD_opt = 1000, IGD_opt, GD_p_opt, IGD_p_opt, IGD_plus_opt, hausdorff_opt}; /* see the man page for getopt_long for an explanation of these fields */ static struct option long_options[] = { {"gd", no_argument, NULL, GD_opt}, {"igd", no_argument, NULL, IGD_opt}, {"gd-p", no_argument, NULL, GD_p_opt}, {"igd-p", no_argument, NULL, IGD_p_opt}, {"igd-plus", no_argument, NULL, IGD_plus_opt}, {"hausdorff", no_argument, NULL, hausdorff_opt}, {"all", no_argument, NULL, 'a'}, {"exponent-p", required_argument, NULL, 'p'}, {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, {"reference", required_argument, NULL, 'r'}, {"suffix", required_argument, NULL, 's'}, {"obj", required_argument, NULL, 'o'}, {NULL, 0, NULL, 0} /* marks end of list */ }; int opt; int longopt_index; while (0 < (opt = getopt_long(argc, argv, "hVvqamr:us:o:", long_options, &longopt_index))) { switch (opt) { case 'p': // FIXME: Use strtol exponent_p = atoi(optarg); break; case 'a': // --all gd = true; igd = true; gdp = true; igdp = true; igdplus = true; hausdorff = true; break; case GD_opt: gd = true; break; case IGD_opt: igd = true; break; case GD_p_opt: gdp = true; break; case IGD_p_opt: igdp = true; break; case IGD_plus_opt: igdplus = true; break; case hausdorff_opt: hausdorff = true; break; case 'o': // --obj minmax = read_minmax (optarg, &nobj); if (minmax == NULL) { fprintf(stderr, "%s: invalid argument '%s' for -o, --obj\n", program_invocation_short_name,optarg); exit(EXIT_FAILURE); } break; case 'r': // --reference reference_size = read_reference_set (&reference, optarg, &nobj); if (reference == NULL || reference_size <= 0) { errprintf ("invalid reference set '%s", optarg); exit (EXIT_FAILURE); } break; case 's': // --suffix suffix = optarg; break; case 'V': // --version version(); exit(EXIT_SUCCESS); case 'q': // --quiet verbose_flag = false; break; case 'v': // --verbose verbose_flag = true; break; case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); case 'h': usage(); exit(EXIT_SUCCESS); default: // should never happen abort(); } } if (reference == NULL) { errprintf ("a reference set must be provided (--reference)"); exit (EXIT_FAILURE); } int numfiles = argc - optind; if (numfiles < 1) {/* Read stdin. */ do_file (NULL, reference, reference_size, &nobj, minmax); } else if (numfiles == 1) { do_file (argv[optind], reference, reference_size, &nobj, minmax); } else { int k; /* FIXME: Calculate the nondominated front among all input files to use as reference set. */ #if 0 if (reference == NULL) { reference_size = calculate_nondominated (&reference, data, nobj, cumsizes[nruns-1], minmax); write_sets (stderr, reference, nobj, &reference_size, 1); } for (k = 0; k < numfiles; k++) nondominatedfile_range (argv[optind + k], &maximum, &minimum, &nobj); if (verbose_flag >= 2) { printf ("# maximum:"); vector_printf (maximum, nobj); printf ("\n"); printf ("# minimum:"); vector_printf (minimum, nobj); printf ("\n"); } #endif for (k = 0; k < numfiles; k++) do_file (argv[optind + k], reference, reference_size, &nobj, minmax); } return EXIT_SUCCESS; } eaf/src/mo-tools/Makefile0000644000176200001440000001070514660712374015022 0ustar liggesusers#----------------------------------------------------------------------- # Makefile for mootools VERSION = 1.0svn$(SVN_REV) #----------------------------------------------------------------------- # Copyright (c) 2007, 2008, 2009, 2010 # Manuel Lopez-Ibanez # This program is free software (software libre); you can redistribute # it and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, you can obtain a copy of the GNU # General Public License at: # http://www.gnu.org/copyleft/gpl.html # or by writing to: # Free Software Foundation, Inc., 59 Temple Place, # Suite 330, Boston, MA 02111-1307 USA # #----------------------------------------------------------------------- # IMPORTANT NOTE: Please be aware that the fact that this program is # released as Free Software does not excuse you from scientific # propriety, which obligates you to give appropriate credit! If you # write a scientific paper describing research that made substantive # use of this program, it is your obligation as a scientist to # acknowledge its use. Moreover, as a personal note, I would # appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with # citations of papers referencing this work so I can mention them to # my funding agent and tenure committee. #----------------------------------------------------------------------- DEBUG?=1 BINDIR:=. ## Define source files SRCS = igd.c epsilon.c dominatedsets.c nondominated.c io.c ndsort.c hv_contrib.c hv.c pareto.c whv.c whv_hype.c HEADERS = io.h io_priv.h common.h gcc_attribs.h igd.h epsilon.h nondominated.h hv.h cmdline.h whv.h whv_hype.h OBJS = $(SRCS:.c=.o) DIST_OTHER_FILES = Makefile README LICENSE svn_version *.mk -include Makevars # We do not need $(GSL_LIBS) yet because we don't compile whv_hype.c into any executable. EXE_LDFLAGS=-lm ECHO = @echo "$(1)" include svnversion.mk include gcc.mk EXE_CFLAGS += $(OPT_CFLAGS) $(GSL_CFLAGS) $(WARN_CFLAGS) \ -D_GNU_SOURCE -DDEBUG=$(DEBUG) -DVERSION=\"$(VERSION)\" -DMARCH='"$(gcc-guess-march)"' igd = $(BINDIR)/igd$(EXE) epsilon = $(BINDIR)/epsilon$(EXE) dominatedsets = $(BINDIR)/dominatedsets$(EXE) nondominated = $(BINDIR)/nondominated$(EXE) ndsort = $(BINDIR)/ndsort$(EXE) .PHONY : all clean distclean dist default default : $(igd) $(epsilon) $(dominatedsets) $(nondominated) $(ndsort) $(igd) : OBJS=igd.o io.o $(igd) : igd.o io.o $(HEADERS) $(epsilon) : OBJS=epsilon.o io.o $(epsilon) : epsilon.o io.o $(HEADERS) $(dominatedsets) : OBJS=dominatedsets.o io.o $(dominatedsets) : dominatedsets.o io.o $(HEADERS) $(nondominated) : OBJS=nondominated.o io.o $(nondominated) : nondominated.o io.o $(HEADERS) include libhv.mk $(ndsort) : OBJS=ndsort.o pareto.o io.o hv_contrib.c $(HV_OBJS) $(ndsort) : $(OBJS) $(HEADERS) $(igd) $(epsilon) $(nondominated) $(dominatedsets) $(ndsort): @mkdir -p $(BINDIR) $(call ECHO,--> Building $@ version $(VERSION) <---) $(CC) -o $@ $(OBJS) $(EXE_CFLAGS) $(CFLAGS) $(EXE_LDFLAGS) $(OBJS) : $(HEADERS) clean : $(call ECHO,---> Removing $(igd) <---) @$(RM) $(igd) $(call ECHO,---> Removing $(epsilon) <---) @$(RM) $(epsilon) $(call ECHO,---> Removing $(dominatedsets) <---) @$(RM) $(dominatedsets) $(call ECHO,---> Removing $(nondominated) <---) @$(RM) $(nondominated) $(call ECHO,---> Removing $(ndsort) <---) @$(RM) $(ndsort) $(call ECHO,---> Removing object files: $(OBJS) <---) @$(RM) $(OBJS) $(HV_OBJS) all : clean $(MAKE) default %.o : %.c $(CC) $(CPPFLAGS) $(EXE_CFLAGS) $(CFLAGS) -c -o $@ $< DIST_SRC_FILES = $(DIST_OTHER_FILES) $(OBJS:.o=.c) $(HEADERS) DIST_SRC := mo-tools-$(VERSION)-src dist : DEBUG=0 dist : CDEBUG= dist : all @(mkdir -p ../$(DIST_SRC) \ && rsync -rlpC --exclude=.svn $(DIST_SRC_FILES) ../$(DIST_SRC)/ \ && cd .. \ && tar cf - $(DIST_SRC) | gzip -f9 > $(DIST_SRC).tar.gz \ && rm -rf ./$(DIST_SRC)/* && rmdir ./$(DIST_SRC)/ \ && echo "$(DIST_SRC).tar.gz created." && cd $(PWD) ) TAGS: *.c *.h etags *.c *.h eaf/src/mo-tools/io.h0000644000176200001440000000643214660712340014135 0ustar liggesusers#ifndef EAF_INPUT_OUTPUT_H #define EAF_INPUT_OUTPUT_H #include "common.h" static const char stdin_name[] = ""; // FIXME: Should this be %-16.15g ? #define point_printf_format "% 17.16g" #define point_printf_sep "\t" /* Error codes for read_data. */ enum ERROR_READ_DATA { READ_INPUT_FILE_EMPTY = -1, READ_INPUT_WRONG_INITIAL_DIM = -2, ERROR_FOPEN = -3, ERROR_CONVERSION = -4, ERROR_COLUMNS = -5, }; int read_int_data (const char *filename, int **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p); int read_double_data (const char *filename, double **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p); #ifndef R_PACKAGE #include #include #include #include void vector_fprintf (FILE *stream, const double * vector, int size); void vector_printf (const double *vector, int size); int write_sets (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns); int write_sets_filtered (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns, const bool *write_p); static inline const signed char * read_minmax (const char *str, int *nobj) { signed char * minmax; int i; if (str == NULL) { /* Default all minimised. */ assert (*nobj > 0); minmax = malloc (sizeof(signed char) * *nobj); for (i = 0; i < *nobj; i++) minmax[i] = -1; return minmax; } int len = strlen (str); bool all_ignored = true; minmax = malloc (sizeof(signed char) * MAX(len, *nobj)); for (i = 0; i < len; i++) { switch (str[i]) { case '+': minmax[i] = 1; all_ignored = false; break; case '-': minmax[i] = -1; all_ignored = false; break; case '0': case 'i': minmax[i] = 0; break; default: /* something unexpected was found */ return NULL; break; } } if (all_ignored == true) { warnprintf ("all objectives ignored because of --obj=%s\n", str); exit (EXIT_SUCCESS); } // FIXME: How to adjust minmax dynamically according to the number of objectives? if (len < *nobj) { // Cycle for (i = 0; i < (*nobj - len); i++) { minmax[len + i] = minmax[i]; } } *nobj = len; return minmax; } static inline const bool * read_bitvector (const char *str, int *nobj) { bool * vec; int i; if (str == NULL) { /* Default all false. */ assert (*nobj > 0); vec = malloc (sizeof(bool) * *nobj); for (i = 0; i < *nobj; i++) vec[i] = false; return vec; } int len = strlen (str); vec = malloc (sizeof(bool) * len); for (i = 0; i < len; i++) { switch (str[i]) { case '1': vec[i] = true; break; case '0': vec[i] = false; break; default: /* something unexpected was found */ return NULL; } } *nobj = len; return vec; } #endif // R_PACKAGE #endif // EAF_INPUT_OUTPUT_H eaf/src/mo-tools/io_priv.h0000644000176200001440000001364114660712340015175 0ustar liggesusers#include #include #include /* for strerror() */ #include /* for errno */ #define QUOTE(name) #name #define STR(macro) QUOTE(macro) #define objective_t_str STR(objective_t) #define PAGE_SIZE 4096 /* allocate one page at a time */ #define DATA_INC (PAGE_SIZE/sizeof(objective_t)) /* * Read an array of objective values from a stream. This function may * be called repeatedly to add data to an existing data set. * * nobjs : number of objectives, also the number of columns. */ int read_objective_t_data (const char *filename, objective_t **data_p, int *nobjs_p, int **cumsizes_p, int *nsets_p) { int nobjs = *nobjs_p; /* number of objectives (and columns). */ int *cumsizes = *cumsizes_p; /* cumulative sizes of data sets. */ int nsets = *nsets_p; /* number of data sets. */ objective_t *data = *data_p; int errorcode = 0; FILE *instream; if (filename == NULL) { instream = stdin; filename = stdin_name; /* used to diagnose errors. */ } else if (NULL == (instream = fopen (filename,"rb"))) { errprintf ("%s: %s", filename, strerror (errno)); return ERROR_FOPEN; } int ntotal; /* the current element of (*datap) */ int datasize; int sizessize; if (nsets == 0) { ntotal = 0; sizessize = 0; datasize = 0; } else { ntotal = nobjs * cumsizes[nsets - 1]; sizessize = ((nsets - 1) / DATA_INC + 1) * DATA_INC; datasize = ((ntotal - 1) / DATA_INC + 1) * DATA_INC; } /* if size is equal to zero, this is equivalent to free(). That is, reinitialize the data structures. */ cumsizes = realloc (cumsizes, sizessize * sizeof(int)); data = realloc (data, datasize * sizeof(objective_t)); /* skip over leading whitespace, comments and empty lines. */ int retval; /* return value for fscanf */ int column = 0, line = 0; do { line++; /* skip full lines starting with # */ retval = skip_comment_line (instream); } while (retval == 1); if (retval == EOF) { /* faster than !feof() */ warnprintf ("%s: file is empty.", filename); errorcode = READ_INPUT_FILE_EMPTY; goto read_data_finish; } do { /* beginning of data set */ if (nsets == sizessize) { sizessize += DATA_INC; cumsizes = realloc(cumsizes, sizessize * sizeof(int)); } cumsizes[nsets] = (nsets == 0) ? 0 : cumsizes[nsets - 1]; do { /* beginning of row */ column = 0; do { /* new column */ column++; objective_t number; if (fscanf (instream, objective_t_scanf_format, &number) != 1) { char buffer[64]; if (fscanf (instream, "%60[^ \t\r\n]", buffer) != 1) { errprintf ("%s: line %d column %d: " "read error or unexpected end of file", filename, line, column); } else { errprintf ("%s: line %d column %d: " "could not convert string `%s' to %s (format: %s)", filename, line, column, buffer, objective_t_str, objective_t_scanf_format); } errorcode = ERROR_CONVERSION; goto read_data_finish; } if (ntotal == datasize) { datasize += DATA_INC; data = realloc (data, datasize * sizeof(objective_t)); } data[ntotal] = number; ntotal++; DEBUG2(fprintf(stderr, "%s:%d:%d(%d) %d (set %d) = " point_printf_format "\n", filename, line, column, nobjs, cumsizes[nsets], nsets, (double)number)); /* skip possible trailing whitespace */ skip_trailing_whitespace(instream); retval = fscanf_newline(instream); } while (retval == 0); if (!nobjs) nobjs = column; else if (column == nobjs) ; /* OK */ else if (cumsizes[0] == 0) { /* just finished first row. */ errprintf ("%s: line %d: input has dimension %d" " while previous data has dimension %d", filename,line, column, nobjs); errorcode = READ_INPUT_WRONG_INITIAL_DIM; goto read_data_finish; } else { errprintf ("%s: line %d has different number of columns (%d)" " from first row (%d)\n", filename, line, column, nobjs); errorcode = ERROR_COLUMNS; goto read_data_finish; } cumsizes[nsets]++; /* look for an empty line */ line++; retval = skip_comment_line (instream); } while (retval == 0); nsets++; /* new data set */ DEBUG2(fprintf (stderr, "%s: set %d, read %d rows\n", filename, nsets, cumsizes[nsets - 1])); /* skip over successive empty lines */ do { line++; retval = skip_comment_line (instream); } while (retval == 1); } while (retval != EOF); /* faster than !feof() */ /* adjust to real size (saves memory but probably slower). */ cumsizes = realloc (cumsizes, nsets * sizeof(int)); data = realloc (data, ntotal * sizeof(objective_t)); read_data_finish: *nobjs_p = nobjs; *nsets_p = nsets; *cumsizes_p = cumsizes; *data_p = data; if (instream != stdin) fclose(instream); return errorcode; } #undef PAGE_SIZE #undef DATA_INC #undef QUOTE #undef STR eaf/src/mo-tools/whv.c0000644000176200001440000001202514660712340014320 0ustar liggesusers#include "whv.h" #undef DEBUG #define DEBUG 1 #include "common.h" #include static int cmp_data_y_desc (const void *p1, const void *p2) { const double *x1 = (const double *)p1; const double *x2 = (const double *)p2; return (x1[1] > x2[1]) ? -1 : (x1[1] < x2[1]) ? 1 : (x1[0] < x2[0]) ? -1 : (x1[0] > x2[0]) ? 1 : 0; } static int cmp_rectangles_y_desc (const void *p1, const void *p2) { const double *x1 = (const double *)p1; const double *x2 = (const double *)p2; // Order by upper (top-right) corner. return (x1[3] > x2[3]) ? -1 : (x1[3] < x2[3]) ? 1 : (x1[2] < x2[2]) ? -1 : (x1[2] > x2[2]) ? 1 : 0; } double rect_weighted_hv2d(double *data, size_t n, double * rectangles, size_t rectangles_nrow) { #define print_point(k, p, r, rect) \ DEBUG2_PRINT("%d: p[%lu] = (%16.15g, %16.15g)" \ "\trectangle[%lu] = (%16.15g, %16.15g, %16.15g, %16.15g)\n", \ __LINE__, (unsigned long) k, p[0], p[1], (unsigned long) r, rect[0], rect[1], rect[2], rect[3]) #define print_rect(r, rect) \ DEBUG2_PRINT("%d: rectangle[%lu] = (%16.15g, %16.15g, %16.15g, %16.15g, %16.15g)\n", \ __LINE__, (unsigned long) r, rect[0], rect[1], rect[2], rect[3], rect[4]) // rectangles: Two points per row + color // FIXME: Should we really allow color == 0 #define get_rectangle(ROW) do { \ rect = rectangles + (ROW) * (nobj * 2 + 1); \ lower0= rect[0]; lower1= rect[1]; upper0= rect[2]; upper1= rect[3]; \ color = rect[4]; \ print_rect(ROW, rect); \ eaf_assert(lower0 < upper0); \ eaf_assert(lower1 < upper1); \ eaf_assert(color >= 0); \ } while(0) #define next_point() do { \ top = p[1]; \ pk++; \ if (pk >= n || top == last_top || p[0] >= last_right) \ goto return_whv; \ p += nobj; \ print_point(pk, p, r, rect); \ } while(0) DEBUG2_PRINT("n = %lu\trectangles = %lu\n", (unsigned long)n, (unsigned long)rectangles_nrow); if (rectangles_nrow == 0 || n == 0) return 0; const int nobj = 2; qsort (data, n, 2 * sizeof(*data), &cmp_data_y_desc); qsort (rectangles, rectangles_nrow, (nobj * 2 + 1) * sizeof(*rectangles), &cmp_rectangles_y_desc); double whv = 0.0; size_t r = 0; const double *rect; // rectangles: Two points per row + color double lower0, lower1, upper0, upper1, color; get_rectangle(r); const double *p = data; size_t pk = 0; print_point(pk, p, r, rect); double top = upper1; // lowest_upper1; const double last_top = rectangles[rectangles_nrow * (nobj * 2 + 1) - 2]; // largest upper0; double last_right = -DBL_MAX; for (size_t r = 0; r < rectangles_nrow; r++) { last_right = MAX (last_right, rectangles[r * (nobj * 2 + 1) + 2]); } // Find first useful point. while (p[1] >= upper1) { // FIXME: We should delete repeated/dominated points when // sorting, skip for now. // Case #1: p is above the remaining rectangles: Next point next_point(); } r = 0; while (true) { eaf_assert(p[1] < upper1); do { if (p[0] < upper0 && lower1 < top) { // Case #4: p strictly dominates u and not completed eaf_assert(p[0] < upper0 && p[1] < upper1); eaf_assert(top > lower1); eaf_assert(top > p[1]); // min(top, upper1) because the whole rect may be below top. whv += (upper0 - MAX(p[0],lower0)) * (MIN(top, upper1) - MAX(p[1], lower1)) * color; DEBUG2_PRINT("whv: %16.15g\n", whv); } // else case #3: not dominated or already completed, skip // Next rectangle r++; if (r >= rectangles_nrow) break; // goto next_point; get_rectangle(r); } while (p[1] < upper1); // Also restart rectangles r = 0; get_rectangle(r); do { // FIXME: we need to loop because of repeated/dominated points when // sorting. We should delete them, skip for now. next_point(); } while (top == p[1] && p[1] >= upper1); } return_whv: DEBUG2_PRINT("whv: %16.15g\n", whv); return whv; } eaf/src/mo-tools/hv.c0000644000176200001440000006162214660712340014140 0ustar liggesusers/************************************************************************* hypervolume computation --------------------------------------------------------------------- Copyright (c) 2010 Carlos M. Fonseca Manuel Lopez-Ibanez Luis Paquete This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- Relevant literature: [1] C. M. Fonseca, L. Paquete, and M. Lopez-Ibanez. An improved dimension-sweep algorithm for the hypervolume indicator. In IEEE Congress on Evolutionary Computation, pages 1157-1163, Vancouver, Canada, July 2006. [2] Nicola Beume, Carlos M. Fonseca, Manuel López-Ibáñez, Luís Paquete, and J. Vahrenhold. On the complexity of computing the hypervolume indicator. IEEE Transactions on Evolutionary Computation, 13(5):1075-1082, 2009. *************************************************************************/ #include "hv.h" #include #include #include #include #include #ifdef R_PACKAGE #include #define fatal_error(...) Rf_error(__VA_ARGS__) #else #include #include "gcc_attribs.h" static void fatal_error(const char * str,...) __attribute__ ((format(printf, 1, 2))) __noreturn; static void fatal_error(const char *template,...) { va_list ap; va_start(ap,template); vfprintf(stderr, template, ap); va_end(ap); exit(EXIT_FAILURE); } #endif static int compare_tree_asc(const void *p1, const void *p2); /*----------------------------------------------------------------------------- The following is a reduced version of the AVL-tree library used here according to the terms of the GPL. See the copyright notice below. */ #define AVL_DEPTH /***************************************************************************** avl.h - Source code for the AVL-tree library. Copyright (C) 1998 Michael H. Buselli Copyright (C) 2000-2002 Wessel Dankers This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Augmented AVL-tree. Original by Michael H. Buselli . Modified by Wessel Dankers to add a bunch of bloat to the sourcecode, change the interface and squash a few bugs. Mail him if you find new bugs. *****************************************************************************/ /* User supplied function to compare two items like strcmp() does. * For example: cmp(a,b) will return: * -1 if a < b * 0 if a = b * 1 if a > b */ typedef int (*avl_compare_t)(const void *, const void *); /* User supplied function to delete an item when a node is free()d. * If NULL, the item is not free()d. */ typedef void (*avl_freeitem_t)(void *); typedef struct avl_node_t { struct avl_node_t *next; struct avl_node_t *prev; struct avl_node_t *parent; struct avl_node_t *left; struct avl_node_t *right; const void *item; double domr; #ifdef AVL_DEPTH unsigned char depth; #endif } avl_node_t; typedef struct avl_tree_t { avl_node_t *head; avl_node_t *tail; avl_node_t *top; avl_compare_t cmp; avl_freeitem_t freeitem; } avl_tree_t; /***************************************************************************** avl.c - Source code for the AVL-tree library. *****************************************************************************/ static void avl_rebalance(avl_tree_t *, avl_node_t *); #ifdef AVL_DEPTH #define NODE_DEPTH(n) ((n) ? (n)->depth : 0) #define L_DEPTH(n) (NODE_DEPTH((n)->left)) #define R_DEPTH(n) (NODE_DEPTH((n)->right)) #define CALC_DEPTH(n) ((L_DEPTH(n)>R_DEPTH(n)?L_DEPTH(n):R_DEPTH(n)) + 1) #endif static int avl_check_balance(avl_node_t *avlnode) { #ifdef AVL_DEPTH int d; d = R_DEPTH(avlnode) - L_DEPTH(avlnode); return d<-1?-1:d>1?1:0; #endif } static int avl_search_closest(const avl_tree_t *avltree, const void *item, avl_node_t **avlnode) { avl_node_t *node; int c; if(!avlnode) avlnode = &node; node = avltree->top; if(!node) return *avlnode = NULL, 0; for(;;) { c = compare_tree_asc(item, node->item); if(c < 0) { if(node->left) node = node->left; else return *avlnode = node, -1; } else if(c > 0) { if(node->right) node = node->right; else return *avlnode = node, 1; } else { return *avlnode = node, 0; } } } static avl_tree_t * avl_init_tree(avl_tree_t *rc, avl_compare_t cmp, avl_freeitem_t freeitem) { if(rc) { rc->head = NULL; rc->tail = NULL; rc->top = NULL; rc->cmp = cmp; rc->freeitem = freeitem; } return rc; } static avl_tree_t * avl_alloc_tree(avl_compare_t cmp, avl_freeitem_t freeitem) { return avl_init_tree(malloc(sizeof(avl_tree_t)), cmp, freeitem); } static void avl_clear_tree(avl_tree_t *avltree) { avltree->top = avltree->head = avltree->tail = NULL; } static void avl_clear_node(avl_node_t *newnode) { newnode->left = newnode->right = NULL; #ifdef AVL_COUNT newnode->count = 1; #endif #ifdef AVL_DEPTH newnode->depth = 1; #endif } static avl_node_t * avl_insert_top(avl_tree_t *avltree, avl_node_t *newnode) { avl_clear_node(newnode); newnode->prev = newnode->next = newnode->parent = NULL; avltree->head = avltree->tail = avltree->top = newnode; return newnode; } static avl_node_t * avl_insert_after(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode); static avl_node_t * avl_insert_before(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode) { if(!node) return avltree->tail ? avl_insert_after(avltree, avltree->tail, newnode) : avl_insert_top(avltree, newnode); if(node->left) return avl_insert_after(avltree, node->prev, newnode); assert (node); assert (!node->left); avl_clear_node(newnode); newnode->next = node; newnode->parent = node; newnode->prev = node->prev; if(node->prev) node->prev->next = newnode; else avltree->head = newnode; node->prev = newnode; node->left = newnode; avl_rebalance(avltree, node); return newnode; } static avl_node_t * avl_insert_after(avl_tree_t *avltree, avl_node_t *node, avl_node_t *newnode) { if(!node) return avltree->head ? avl_insert_before(avltree, avltree->head, newnode) : avl_insert_top(avltree, newnode); if(node->right) return avl_insert_before(avltree, node->next, newnode); assert (node); assert (!node->right); avl_clear_node(newnode); newnode->prev = node; newnode->parent = node; newnode->next = node->next; if(node->next) node->next->prev = newnode; else avltree->tail = newnode; node->next = newnode; node->right = newnode; avl_rebalance(avltree, node); return newnode; } /* * avl_unlink_node: * Removes the given node. Does not delete the item at that node. * The item of the node may be freed before calling avl_unlink_node. * (In other words, it is not referenced by this function.) */ static void avl_unlink_node(avl_tree_t *avltree, avl_node_t *avlnode) { avl_node_t *parent; avl_node_t **superparent; avl_node_t *subst, *left, *right; avl_node_t *balnode; if(avlnode->prev) avlnode->prev->next = avlnode->next; else avltree->head = avlnode->next; if(avlnode->next) avlnode->next->prev = avlnode->prev; else avltree->tail = avlnode->prev; parent = avlnode->parent; superparent = parent ? avlnode == parent->left ? &parent->left : &parent->right : &avltree->top; left = avlnode->left; right = avlnode->right; if(!left) { *superparent = right; if(right) right->parent = parent; balnode = parent; } else if(!right) { *superparent = left; left->parent = parent; balnode = parent; } else { subst = avlnode->prev; if(subst == left) { balnode = subst; } else { balnode = subst->parent; balnode->right = subst->left; if(balnode->right) balnode->right->parent = balnode; subst->left = left; left->parent = subst; } subst->right = right; subst->parent = parent; right->parent = subst; *superparent = subst; } avl_rebalance(avltree, balnode); } /* * avl_rebalance: * Rebalances the tree if one side becomes too heavy. This function * assumes that both subtrees are AVL-trees with consistant data. The * function has the additional side effect of recalculating the count of * the tree at this node. It should be noted that at the return of this * function, if a rebalance takes place, the top of this subtree is no * longer going to be the same node. */ static void avl_rebalance(avl_tree_t *avltree, avl_node_t *avlnode) { avl_node_t *child; avl_node_t *gchild; avl_node_t *parent; avl_node_t **superparent; parent = avlnode; while(avlnode) { parent = avlnode->parent; superparent = parent ? avlnode == parent->left ? &parent->left : &parent->right : &avltree->top; switch(avl_check_balance(avlnode)) { case -1: child = avlnode->left; #ifdef AVL_DEPTH if(L_DEPTH(child) >= R_DEPTH(child)) { #else #ifdef AVL_COUNT if(L_COUNT(child) >= R_COUNT(child)) { #else #error No balancing possible. #endif #endif avlnode->left = child->right; if(avlnode->left) avlnode->left->parent = avlnode; child->right = avlnode; avlnode->parent = child; *superparent = child; child->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); #endif } else { gchild = child->right; avlnode->left = gchild->right; if(avlnode->left) avlnode->left->parent = avlnode; child->right = gchild->left; if(child->right) child->right->parent = child; gchild->right = avlnode; if(gchild->right) gchild->right->parent = gchild; gchild->left = child; if(gchild->left) gchild->left->parent = gchild; *superparent = gchild; gchild->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); gchild->count = CALC_COUNT(gchild); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); gchild->depth = CALC_DEPTH(gchild); #endif } break; case 1: child = avlnode->right; #ifdef AVL_DEPTH if(R_DEPTH(child) >= L_DEPTH(child)) { #else #ifdef AVL_COUNT if(R_COUNT(child) >= L_COUNT(child)) { #else #error No balancing possible. #endif #endif avlnode->right = child->left; if(avlnode->right) avlnode->right->parent = avlnode; child->left = avlnode; avlnode->parent = child; *superparent = child; child->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); #endif } else { gchild = child->left; avlnode->right = gchild->left; if(avlnode->right) avlnode->right->parent = avlnode; child->left = gchild->right; if(child->left) child->left->parent = child; gchild->left = avlnode; if(gchild->left) gchild->left->parent = gchild; gchild->right = child; if(gchild->right) gchild->right->parent = gchild; *superparent = gchild; gchild->parent = parent; #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); child->count = CALC_COUNT(child); gchild->count = CALC_COUNT(gchild); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); child->depth = CALC_DEPTH(child); gchild->depth = CALC_DEPTH(gchild); #endif } break; default: #ifdef AVL_COUNT avlnode->count = CALC_COUNT(avlnode); #endif #ifdef AVL_DEPTH avlnode->depth = CALC_DEPTH(avlnode); #endif } avlnode = parent; } } /*------------------------------------------------------------------------------ end of functions from AVL-tree library. *******************************************************************************/ typedef struct dlnode { const double *x; /* The data vector */ struct dlnode **next; /* Next-node vector */ struct dlnode **prev; /* Previous-node vector */ struct avl_node_t * tnode; int ignore; double *area; /* Area */ double *vol; /* Volume */ } dlnode_t; # define STOP_DIMENSION 2 /* default: stop on dimension 3 */ static int compare_node(const void *p1, const void* p2) { const double x1 = *((*(const dlnode_t **)p1)->x); const double x2 = *((*(const dlnode_t **)p2)->x); return (x1 < x2) ? -1 : (x1 > x2) ? 1 : 0; } static int compare_tree_asc(const void *p1, const void *p2) { const double *x1 = (const double *)p1; const double *x2 = (const double *)p2; return (x1[1] > x2[1]) ? -1 : (x1[1] < x2[1]) ? 1 : (x1[0] >= x2[0]) ? -1 : 1; } /* * Setup circular double-linked list in each dimension */ static dlnode_t * setup_cdllist(const double *data, int d, int n) { dlnode_t *head; dlnode_t **scratch; int i, j; head = malloc ((n+1) * sizeof(dlnode_t)); head->x = data; head->ignore = 0; /* should never get used */ head->next = malloc( d * (n+1) * sizeof(dlnode_t*)); head->prev = malloc( d * (n+1) * sizeof(dlnode_t*)); head->tnode = malloc ((n+1) * sizeof(avl_node_t)); head->area = malloc(d * (n+1) * sizeof(double)); head->vol = malloc(d * (n+1) * sizeof(double)); for (i = 1; i <= n; i++) { head[i].x = head[i-1].x + d;/* this will be fixed a few lines below... */ head[i].ignore = 0; head[i].next = head[i-1].next + d; head[i].prev = head[i-1].prev + d; head[i].tnode = head[i-1].tnode + 1; head[i].area = head[i-1].area + d; head[i].vol = head[i-1].vol + d; } head->x = NULL; /* head contains no data */ scratch = malloc(n * sizeof(dlnode_t*)); for (i = 0; i < n; i++) scratch[i] = head + i + 1; for (j = d-1; j >= 0; j--) { for (i = 0; i < n; i++) scratch[i]->x--; qsort(scratch, n, sizeof(dlnode_t*), compare_node); head->next[j] = scratch[0]; scratch[0]->prev[j] = head; for (i = 1; i < n; i++) { scratch[i-1]->next[j] = scratch[i]; scratch[i]->prev[j] = scratch[i-1]; } scratch[n-1]->next[j] = head; head->prev[j] = scratch[n-1]; } free(scratch); for (i = 1; i <= n; i++) { (head[i].tnode)->item = head[i].x; } for (i = 0; i < d; i++) head->area[i] = 0; return head; } static void free_cdllist(dlnode_t * head) { free(head->tnode); /* Frees _all_ nodes. */ free(head->next); free(head->prev); free(head->area); free(head->vol); free(head); } static void delete (dlnode_t *nodep, int dim, double * bound) { int i; for (i = STOP_DIMENSION; i < dim; i++) { nodep->prev[i]->next[i] = nodep->next[i]; nodep->next[i]->prev[i] = nodep->prev[i]; if (bound[i] > nodep->x[i]) bound[i] = nodep->x[i]; } } static void reinsert (dlnode_t *nodep, int dim, double * bound) { int i; for (i = STOP_DIMENSION; i < dim; i++) { nodep->prev[i]->next[i] = nodep; nodep->next[i]->prev[i] = nodep; if (bound[i] > nodep->x[i]) bound[i] = nodep->x[i]; } } static double hv_recursive(avl_tree_t *tree, dlnode_t *list, int dim, int c, const double * ref, double * bound) { /* ------------------------------------------------------ General case for dimensions higher than STOP_DIMENSION ------------------------------------------------------ */ if ( dim > STOP_DIMENSION ) { dlnode_t *p0 = list; dlnode_t *p1 = list->prev[dim]; double hyperv = 0; dlnode_t *pp; for (pp = p1; pp->x; pp = pp->prev[dim]) { if (pp->ignore < dim) pp->ignore = 0; } while (c > 1 /* We delete all points x[dim] > bound[dim]. In case of repeated coordinates, we also delete all points x[dim] == bound[dim] except one. */ && (p1->x[dim] > bound[dim] || p1->prev[dim]->x[dim] >= bound[dim]) ) { p0 = p1; delete(p0, dim, bound); p1 = p0->prev[dim]; c--; } if (c > 1) { hyperv = p1->prev[dim]->vol[dim] + p1->prev[dim]->area[dim] * (p1->x[dim] - p1->prev[dim]->x[dim]); p1->vol[dim] = hyperv; } else { int i; p1->area[0] = 1; for (i = 1; i <= dim; i++) p1->area[i] = p1->area[i-1] * (ref[i-1] - p1->x[i-1]); p1->vol[dim] = 0; } if (p1->ignore >= dim) { p1->area[dim] = p1->prev[dim]->area[dim]; } else { p1->area[dim] = hv_recursive(tree, list, dim-1, c, ref, bound); if (p1->area[dim] <= p1->prev[dim]->area[dim]) p1->ignore = dim; } while (p0->x != NULL) { hyperv += p1->area[dim] * (p0->x[dim] - p1->x[dim]); bound[dim] = p0->x[dim]; reinsert(p0, dim, bound); c++; p1 = p0; p0 = p0->next[dim]; p1->vol[dim] = hyperv; if (p1->ignore >= dim) { p1->area[dim] = p1->prev[dim]->area[dim]; } else { p1->area[dim] = hv_recursive(tree, list, dim-1, c, ref, bound); if (p1->area[dim] <= p1->prev[dim]->area[dim]) p1->ignore = dim; } } hyperv += p1->area[dim] * (ref[dim] - p1->x[dim]); return hyperv; } /* --------------------------- special case of dimension 3 --------------------------- */ else if (dim == 2) { dlnode_t *pp = list->next[2]; double hypera = (ref[0] - pp->x[0]) * (ref[1] - pp->x[1]); double height = (c == 1) ? ref[2] - pp->x[2] : pp->next[2]->x[2] - pp->x[2]; double hyperv = hypera * height; if (pp->next[2]->x == NULL) return hyperv; avl_insert_top(tree, pp->tnode); pp = pp->next[2]; do { height = (pp == list->prev[2]) ? ref[2] - pp->x[2] : pp->next[2]->x[2] - pp->x[2]; if (pp->ignore >= 2) hyperv += hypera * height; else { const double * prv_ip, * nxt_ip; avl_node_t *tnode; if (avl_search_closest(tree, pp->x, &tnode) <= 0) { nxt_ip = (double *)(tnode->item); tnode = tnode->prev; } else { nxt_ip = (tnode->next != NULL) ? (double *)(tnode->next->item) : ref; } if (nxt_ip[0] > pp->x[0]) { avl_insert_after(tree, tnode, pp->tnode); if (tnode != NULL) { prv_ip = (double *)(tnode->item); if (prv_ip[0] > pp->x[0]) { const double * cur_ip; tnode = pp->tnode->prev; /* cur_ip = point dominated by pp with highest [0]-coordinate */ cur_ip = (double *)(tnode->item); while (tnode->prev) { prv_ip = (double *)(tnode->prev->item); hypera -= (prv_ip[1] - cur_ip[1]) * (nxt_ip[0] - cur_ip[0]); if (prv_ip[0] < pp->x[0]) break; /* prv is not dominated by pp */ cur_ip = prv_ip; avl_unlink_node(tree,tnode); tnode = tnode->prev; } avl_unlink_node(tree,tnode); if (!tnode->prev) { hypera -= (ref[1] - cur_ip[1])*(nxt_ip[0] - cur_ip[0]); prv_ip = ref; } } } else prv_ip = ref; hypera += (prv_ip[1] - pp->x[1])*(nxt_ip[0] - pp->x[0]); } else pp->ignore = 2; if (height > 0) hyperv += hypera * height; } pp = pp->next[2]; } while (pp->x != NULL); avl_clear_tree(tree); return hyperv; } /* special case of dimension 2 */ else if (dim == 1) { const dlnode_t *p1 = list->next[1]; double hypera = p1->x[0]; double hyperv = 0; const dlnode_t *p0; while ((p0 = p1->next[1])->x) { hyperv += (ref[0] - hypera) * (p0->x[1] - p1->x[1]); if (p0->x[0] < hypera) hypera = p0->x[0]; p1 = p0; } hyperv += (ref[0] - hypera) * (ref[1] - p1->x[1]); return hyperv; } /* special case of dimension 1 */ else if (dim == 0) { return (ref[0] - list->next[0]->x[0]); } else fatal_error("%s:%d: unreachable condition! \n" "This is a bug, please report it to " "manuel.lopez-ibanez@manchester.ac.uk\n", __FILE__, __LINE__); } /* Removes the point from the circular double-linked list, but it doesn't remove the data. */ static void filter_delete_node(dlnode_t *node, int d) { /* The memory allocated for the deleted node is lost (leaked) until the end of the program, but this should not be a problem. */ for (int i = 0; i < d; i++) { node->next[i]->prev[i] = node->prev[i]; node->prev[i]->next[i] = node->next[i]; } } /* Filters those points that do not strictly dominate the reference point. This is needed to assure that the points left are only those that are needed to calculate the hypervolume. */ static int filter(dlnode_t *list, int d, int n, const double *ref) { int i, j; /* fprintf (stderr, "%d points initially\n", n); */ for (i = 0; i < d; i++) { dlnode_t *aux = list->prev[i]; const int np = n; for (j = 0; j < np; j++) { if (aux->x[i] < ref[i]) break; filter_delete_node (aux, d); aux = aux->prev[i]; n--; } } /* fprintf (stderr, "%d points remain\n", n); */ return n; } double fpli_hv(const double *data, int d, int n, const double *ref) { double hyperv; if (n == 0) return 0.0; avl_tree_t *tree = avl_alloc_tree ((avl_compare_t) compare_tree_asc, (avl_freeitem_t) NULL); dlnode_t *list = setup_cdllist(data, d, n); n = filter(list, d, n, ref); if (n == 0) { /* Returning here would leak memory. */ hyperv = 0.0; } else if (n == 1) { dlnode_t * p = list->next[0]; hyperv = 1; for (int i = 0; i < d; i++) hyperv *= ref[i] - p->x[i]; } else { double *bound = malloc (d * sizeof(double)); for (int i = 0; i < d; i++) bound[i] = -DBL_MAX; hyperv = hv_recursive(tree, list, d-1, n, ref, bound); free (bound); } /* Clean up. */ free_cdllist (list); free (tree); /* The nodes are freed by free_cdllist (). */ return hyperv; } eaf/src/mo-tools/hv.h0000644000176200001440000000316514660712340014143 0ustar liggesusers/************************************************************************* hv.h --------------------------------------------------------------------- Copyright (c) 2005, 2006 Carlos M. Fonseca Manuel Lopez-Ibanez Luis Paquete This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- *************************************************************************/ #ifndef HV_H_ #define HV_H_ #ifdef __cplusplus extern "C" { #endif double fpli_hv(const double *data, int d, int n, const double *ref); void hv_contributions (double *hvc, double *points, int dim, int size, const double * ref); #ifdef __cplusplus } #endif #endif eaf/src/mo-tools/pareto.c0000644000176200001440000001700014660712340015004 0ustar liggesusers#include "nondominated.h" struct point_2d_front { const double *p; unsigned int i; unsigned int f; }; static int point_2d_front_cmp (const void * a, const void * b) { const double *pa = ((const struct point_2d_front *)a)->p; const double *pb = ((const struct point_2d_front *)b)->p; const double x0 = pa[0]; const double x1 = pa[1]; const double y0 = pb[0]; const double y1 = pb[1]; /* FIXME: Use ?: */ if (x0 < y0) return -1; else if (x0 > y0) return 1; else if (x1 < y1) return -1; else if (x1 > y1) return 1; else return 0; } /* Nondominated sorting in 2D in O(n log n) from: M. T. Jensen. Reducing the run-time complexity of multiobjective EAs: The NSGA-II and other algorithms. IEEE Transactions on Evolutionary Computation, 7(5):503–515, 2003. FIXME: Could we avoid creating a copy of the points? */ static int * pareto_rank_2D (const double *points, int size) { const int dim = 2; int k; struct point_2d_front *data = malloc(sizeof(struct point_2d_front) * size); for (k = 0; k < size; k++) { data[k].p = &points[k * dim]; data[k].i = (unsigned) k; data[k].f = 0; } #if DEBUG >= 2 #define PARETO_RANK_2D_DEBUG double *help_0 = malloc (size * sizeof(double)); double *help_1 = malloc (size * sizeof(double)); int * help_i = malloc (size * sizeof(int)); for (k = 0; k < size; k++) { help_0[k] = data[k].p[0]; help_1[k] = data[k].p[1]; help_i[k] = data[k].i; } fprintf(stderr, "%s():\n-------------------\n>>INPUT:", __FUNCTION__); //fprintf(stderr, "\nIndex: "); vector_int_fprintf_fmt (stderr, help_i, size, "%4d"); fprintf(stderr, "\n[0] : "); vector_fprintf (stderr, help_0, size); fprintf(stderr, "\n[1] : "); vector_fprintf (stderr, help_1, size); #endif qsort (data, size, sizeof(struct point_2d_front), point_2d_front_cmp); #ifdef PARETO_RANK_2D_DEBUG for (k = 0; i < size; k++) { help_0[k] = data[k].p[0]; help_1[k] = data[k].p[1]; help_i[k] = data[k].i; } fprintf(stderr, "%s():\n-------------------\n>>SORTED:", __FUNCTION__); fprintf(stderr, "\nIndex: "); vector_int_fprintf_fmt (stderr, help_i, size, "%4d"); fprintf(stderr, "\n[0] : "); vector_fprintf (stderr, help_0, size); fprintf(stderr, "\n[1] : "); vector_fprintf (stderr, help_1, size); #endif int n_front = 0; int * front_last = malloc (size * sizeof(int)); front_last[0] = 0; data[0].f = 0; /* The first point is in the first front. */ for (k = 1; k < size; k++) { const double *p = data[k].p; if (p[1] < data[front_last[n_front]].p[1]) { int low = 0; int high = n_front + 1; do { int mid = low + (high - low) /2; eaf_assert (mid <= n_front); const double *pmid = data[front_last[mid]].p; if (p[1] < pmid[1]) high = mid; else if (p[1] > pmid[1] || (p[1] == pmid[1] && p[0] > pmid[0])) low = mid + 1; else { // Duplicated points are assigned to the same front. low = mid; break; } } while (low < high); eaf_assert (low <= n_front); eaf_assert (p[1] < data[front_last[low]].p[1] || (p[1] == data[front_last[low]].p[1] && p[0] == data[front_last[low]].p[0])); front_last[low] = k; data[k].f = low; } else if (p[1] == data[front_last[n_front]].p[1] && p[0] == data[front_last[n_front]].p[0]) { front_last[n_front] = k; data[k].f = n_front; } else { n_front++; front_last[n_front] = k; data[k].f = n_front; } } free (front_last); #ifdef PARETO_RANK_2D_DEBUG { n_front++; // count max + 1 int f, i; int *front_size = calloc(nfront, sizeof(int)); int ** front = calloc(nfront, sizeof(int *)); for (k = 0; k < size; k++) { f = data[k].f; if (front_size[f] == 0) { front[f] = malloc (size * sizeof(int)); } front[f][front_size[f]] = k; front_size[f]++; } int *order = malloc (size * sizeof(int)); f = 0, k = 0, i = 0; do { order[i] = front[f][k]; fprintf (stderr, "\nfront[%d][%d] = %d = { %g , %g, %d, %d }", f, k, front[f][k], data[front[f][k]].p[0], data[front[f][k]].p[1], data[front[f][k]].i, data[front[f][k]].f); i++, k++; if (k == front_size[f]) { f++; k = 0; } } while (f != n_front); for (f = 0; f < n_front; f++) free(front[f]); free(front); free(front_size); for (k = 0; i < size; k++) { help_0[k] = data[order[k]].p[0]; help_1[k] = data[order[k]].p[1]; help_i[k] = data[order[k]].i; } fprintf(stderr, "%s():\n-------------------\n>>OUTPUT:", __FUNCTION__); fprintf(stderr, "\nIndex: "); vector_int_fprintf_fmt (stderr, help_i, size, "%4d"); fprintf(stderr, "\n[0] : "); vector_fprintf (stderr, help_0, size); fprintf(stderr, "\n[1] : "); vector_fprintf (stderr, help_1, size); free (order); } free (help_0); free (help_1); free (help_i); exit(1); #endif int * rank = malloc(size * sizeof(int)); for (k = 0; k < size; k++) { rank[data[k].i] = data[k].f + 1; } free (data); return rank; } static bool dominates(const double *pj, const double * pk, int dim) { bool j_leq_k = true; for (int d = 0; d < dim; d++) { j_leq_k = j_leq_k && (pj[d] <= pk[d]); } return j_leq_k; } /* FIXME: This takes O(n^3). Look at M. T. Jensen. Reducing the run-time complexity of multiobjective EAs: The NSGA-II and other algorithms. IEEE Transactions on Evolutionary Computation, 7(5):503–515, 2003. */ int * pareto_rank (const double *points, int dim, int size) { int * rank2 = NULL; if (dim == 2) { rank2 = pareto_rank_2D(points, size); } int * rank = malloc(size * sizeof(int)); for (int k = 0; k < size; k++) { rank[k] = 1; } int level = 2; bool nothing_new; do { nothing_new = true; for (int j = 0; j < size; j++) { eaf_assert(rank[j] <= level); /* is already dominated or belongs to a previous front? */ if (rank[j] != level - 1) continue; for (int k = 0; k < size; k++) { if (k == j) continue; if (rank[k] != level - 1) continue; const double *pj = points + j * dim; const double *pk = points + k * dim; bool j_leq_k = dominates(pj, pk, dim); bool k_leq_j = dominates(pk, pj, dim); if (j_leq_k && !k_leq_j) { nothing_new = false; rank[k]++; } else if (!j_leq_k && k_leq_j) { nothing_new = false; rank[j]++; break; } } } level++; } while (!nothing_new); if (rank2 != NULL) { for (int k = 0; k < size; k++) { eaf_assert(rank[k] == rank2[k]); } free(rank2); } return rank; } eaf/src/mo-tools/igd.h0000644000176200001440000001520214660712340014264 0ustar liggesusers#ifndef IGD_H #define IGD_H /************************************* GD was first proposed in [1] with p=2. IGD seems to have been mentioned first in [2], however, some people also used the name D-metric for the same thing with p=1 and later papers have often used IGD/GD with p=1. GD_p and IGD_p were proposed in [4] and they change how the numerator is computed. This has a significant effect for GD and less so for IGD given a constant reference set. IGD+ was proposed in [5] and changes how to compute the distances. In general, norm=2 (Euclidean distance), but other norms are possible [4]. See [6] for a comparison. [1] D. A. Van Veldhuizen and G. B. Lamont. Evolutionary Computation and Convergence to a Pareto Front. In J. R. Koza, editor, Late Breaking Papers at the Genetic Programming 1998 Conference, pages 221–228, Stanford University, California, July 1998. Stanford University Bookstore. Keywords: generational distance. [2] Coello Coello, C.A., Reyes-Sierra, M.: A study of the parallelization of a coevolutionary multi-objective evolutionary algorithm. In: Monroy, R., et al. (eds.) Proceedings of MICAI, LNAI, vol. 2972, pp. 688–697. Springer, Heidelberg, Germany (2004). [3] Q. Zhang and H. Li. MOEA/D: A Multiobjective Evolutionary Algorithm Based on Decomposition. IEEE Transactions on Evolutionary Computation, 11(6):712–731, 2007. doi:10.1109/TEVC.2007.892759. [4] Schutze, O., Esquivel, X., Lara, A., Coello Coello, C.A.: Using the averaged Hausdorff distance as a performance measure in evolutionary multiobjective optimization. IEEE Trans. Evol. Comput. 16(4), 504–522 (2012) [5] H. Ishibuchi, H. Masuda, Y. Tanigaki, and Y. Nojima. Modified Distance Calculation in Generational Distance and Inverted Generational Distance. In A. Gaspar-Cunha, C. H. Antunes, and C. A. Coello Coello, editors, Evolutionary Multi-criterion Optimization, EMO 2015 Part I, volume 9018 of Lecture Notes in Computer Science, pages 110–125. Springer, Heidelberg, Germany, 2015. [6] Leonardo C. T. Bezerra, Manuel López-Ibáñez, and Thomas Stützle. An empirical assessment of the properties of inverted generational distance indicators on multi- and many-objective optimization. In H. Trautmann, G. Rudolph, K. Klamroth, O. Schütze, M. M. Wiecek, Y. Jin, and C. Grimme, editors, Evolutionary Multi-criterion Optimization, EMO 2017, Lecture Notes in Computer Science, pages 31–45. Springer, 2017. */ #include #include #include #include #ifndef INFINITY #define INFINITY (HUGE_VAL) #endif #include "common.h" #include "io.h" static inline double gd_common (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r, bool plus, bool psize, unsigned int p) { if (size_a == 0) return INFINITY; int a, r, d; double gd = 0; for (a = 0; a < size_a; a++) { double min_dist = INFINITY; for (r = 0; r < size_r; r++) { double dist = 0.0; for (d = 0; d < dim; d++) { if (minmax[d] == 0) continue; double a_d = points_a[a * dim + d]; double r_d = points_r[r * dim + d]; double diff = (!plus) ? (r_d - a_d) : MAX((minmax[d] < 0) ? (r_d - a_d) : (a_d - r_d), 0.0); // TODO: Implement taxicab and infinity norms dist += diff * diff; } // We should calculate here the sqrt() of the Euclidean, however // that would not change which one is the minimum, so we compute it // outside the loop, which is faster. if (dist < min_dist) min_dist = dist; } // Here we calculate the actual Euclidean distance. min_dist = sqrtl(min_dist); gd += (p == 1) ? min_dist : powl (min_dist, p); } if (p == 1) return gd / (double) size_a; else if (psize) return powl (gd / (double) size_a, 1.0 / p); else return powl (gd, 1.0 / p) / (double) size_a; } static inline double GD (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r) { return gd_common (dim, minmax, points_a, size_a, points_r, size_r, /*plus=*/false, /*psize=*/false, /*p=*/1); } static inline double IGD (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r) { return gd_common (dim, minmax, points_r, size_r, points_a, size_a, /*plus=*/false, /*psize=*/false, /*p=*/1); } static inline double GD_p (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r, unsigned int p) { return gd_common (dim, minmax, points_a, size_a, points_r, size_r, /*plus=*/false, /*psize=*/true, p); } static inline double IGD_p (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r, unsigned int p) { return gd_common (dim, minmax, points_r, size_r, points_a, size_a, /*plus=*/false, /*psize=*/true, p); } static inline double IGD_plus (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r) { return gd_common (dim, minmax, points_r, size_r, points_a, size_a, /*plus=*/true, /*psize=*/true, /*p=*/1); } static inline double avg_Hausdorff_dist (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_r, int size_r, unsigned int p) { double gd_p = gd_common (dim, minmax, points_a, size_a, points_r, size_r, /*plus=*/false, /*psize=*/true, p); double igd_p = gd_common (dim, minmax, points_r, size_r, points_a, size_a, /*plus=*/false, /*psize=*/true, p); return MAX (gd_p, igd_p); } /* TODO: Implement p=INFINITY See [4] */ #endif /* IGD_H */ eaf/src/mo-tools/LICENSE0000644000176200001440000004630414660712340014364 0ustar liggesusers --------------------------------------------------------------------- Copyright (c) 2007, 2008 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@ulb.ac.be with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. There should be a verbatim copy of the GNU General Public License below; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA --------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. eaf/src/mo-tools/nondominated.c0000644000176200001440000006367114660712340016210 0ustar liggesusers/************************************************************************* nondominated: --------------------------------------------------------------------- Copyright (c) 2007, 2008 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. --------------------------------------------------------------------- Literature: *************************************************************************/ #include "io.h" #include "nondominated.h" #include #include #include #include #include // for isspace() #include #include // for getopt() #include // for getopt_long() #include // for log10() #define READ_INPUT_WRONG_INITIAL_DIM_ERRSTR "either -o, --obj, -u, --upper or -l, --lower" #include "cmdline.h" char *program_invocation_short_name = "nondominated"; static int verbose_flag = false; static bool union_flag = false; static bool check_flag = true; static bool filter_flag = false; static bool normalise_flag = false; static bool force_bounds_flag = false; static const char *suffix = "_dat"; static void usage(void) { printf("\n" "Usage:\n" " %s [OPTIONS] [FILES] \n" " %s [OPTIONS] < [INPUT] > [OUTPUT]\n\n", program_invocation_short_name, program_invocation_short_name); printf( "Obtain information and perform some operations on the nondominated sets " "given as input. \n\n" "Options:\n" OPTION_HELP_STR OPTION_VERSION_STR " -v, --verbose print some extra information; \n" OPTION_QUIET_STR " --no-check do not check nondominance of sets (faster but unsafe);\n" OPTION_OBJ_STR " -u, --upper-bound POINT defines an upper bound to check, e.g. \"10 5 30\";\n" " -l, --lower-bound POINT defines a lower bound to check;\n" " -U, --union consider each file as a whole approximation set, \n" " (by default, approximation sets are separated by an \n" " empty line within a file); \n" " -s, --suffix=STRING suffix to add to output files. Default is \"%s\". \n" " The empty string means overwrite the input file. \n" " This is ignored when reading from stdin because output\n" " is sent to stdout. \n" "\n" " The following options OVERWRITE output files:\n" " -a, --agree= transform objectives so all are maximised (or \n" " minimised). See also the option --obj. \n" " -f, --filter check and filter out dominated points; \n" " -b, --force-bound remove points that do not satisfy the bounds; \n" " -n, --normalise RANGE normalise all objectives to a range, e.g., \"1 2\". \n" " If bounds are given with -l and -u, they are used \n" " for the normalisation. \n" " -L, --log=[1|0]... specify whether each objective should be transformed \n" " to logarithmic scale (1) or not (0). \n" "\n", suffix); } static bool read_range (char *str, double *lower, double *upper) { char *endp; *lower = strtod (str, &endp); if (str == endp) return false; str = endp; *upper = strtod (str, &endp); if (str == endp) return false; str = endp; // not end of string: error while (*str != '\0') { if (!isspace(*str)) return false; str++; } return true; } /* FIXME: Handle "1 NAN 3", so NAN means: use the minimum/maximum for this dimension. */ static double * read_point (char * str, int *nobj) { int k = 0, size = 10; double * point = malloc (size * sizeof(double)); char * endp = str; char * cursor; do { cursor = endp; if (k == size) { size += 10; point = realloc (point, size * sizeof(double)); } point[k] = strtod (cursor, &endp); k++; } while (cursor != endp); // not end of string: error while (*cursor != '\0') { if (!isspace(*cursor)) return NULL; cursor++; } // no number: error if (k == 1) return NULL; *nobj = k - 1; return point; } static double * robust_read_point (char * str, int *nobj, const char * errmsg) { double * point = read_point(str, nobj); if (point == NULL) { errprintf (errmsg, optarg); exit (EXIT_FAILURE); } return point; } static void data_bounds (double **minimum, double **maximum, const double *data, int nobj, int rows) { int k, r; #ifndef INFINITY #define INFINITY DBL_MAX #endif #define NEG_INFINITY -DBL_MAX if (*minimum == NULL) { *minimum = malloc (nobj * sizeof(double)); for (k = 0; k < nobj; k++) (*minimum)[k] = INFINITY; } if (*maximum == NULL) { *maximum = malloc (nobj * sizeof(double)); for (k = 0; k < nobj; k++) (*maximum)[k] = NEG_INFINITY; } for (k = 0, r = 0; r < rows; r++) { for (int n = 0; n < nobj; n++, k++) { if ((*minimum)[n] > data[k]) (*minimum)[n] = data[k]; if ((*maximum)[n] < data[k]) (*maximum)[n] = data[k]; } } } static inline bool any_less_than (const double *a, const double *b, int dim) { int d; for (d = 0; d < dim; d++) if (a[d] < b[d]) return true; return false; } static void file_bounds (const char *filename, double **minimum_p, double **maximum_p, int *dim_p) { double *data = NULL; int *cumsizes = NULL; int nruns = 0; int dim = *dim_p; int err = read_double_data (filename, &data, &dim, &cumsizes, &nruns); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); data_bounds (minimum_p, maximum_p, data, dim, cumsizes[nruns - 1]); *dim_p = dim; free (data); free (cumsizes); } static void logarithm_scale (double *points, int dim, int size, const bool *logarithm) { int k, d; assert (logarithm); for (d = 0; d < dim; d++) { if (!logarithm[d]) continue; for (k = 0; k < size; k++) points[k * dim + d] = log10(points[k * dim + d]); } } static bool force_bounds (double *points, int dim, int *cumsizes, int nsets, const double *lbound, const double *ubound) { int n, n2, k; int size = cumsizes[nsets - 1]; bool *outbounds = malloc (sizeof(bool) * size); int outbounds_found = -1; for (n = size - 1; n >= 0; n--) { if (any_less_than (&points[n * dim], lbound, dim) || any_less_than (ubound, &points[n * dim], dim)) { outbounds[n] = true; outbounds_found = n; } else outbounds[n] = false; } if (outbounds_found < 0) { if (verbose_flag >= 2) fprintf (stderr, "# out of bounds: 0\n"); free (outbounds); return false; } int *ssizes = malloc (sizeof(int) * nsets); ssizes[0] = cumsizes[0]; for (k = 1; k < nsets; k++) ssizes[k] = cumsizes[k] - cumsizes[k-1]; /* Find the set of the first out-of-bounds point. */ for (k = 0; outbounds_found >= cumsizes[k]; k++); /* Delete it. */ ssizes[k]--; /* Delete the rest of them. */ for (n = outbounds_found, n2 = outbounds_found + 1; k < nsets; k++) { while (n2 < cumsizes[k]) { if (outbounds[n2]) { n2++; ssizes[k]--; } else { memcpy (&points[n * dim], &points[n2 * dim], sizeof(double) * dim); n++, n2++; } } } if (verbose_flag >= 2) fprintf (stderr, "# out of bounds: %d\n", n2 - n); cumsizes[0] = ssizes[0]; for (k = 1; k < nsets; k++) cumsizes[k] = ssizes[k] + cumsizes[k-1]; free (ssizes); free (outbounds); return true; } static bool check_nondominated (const char * filename, const double *points, int dim, const int *cumsizes, int nruns, const signed char *minmax, const signed char agree, bool **nondom_p) { bool *nondom = nondom_p ? *nondom_p : NULL; bool free_nondom = false; if (nondom == NULL) { free_nondom = true; nondom = nondom_init (cumsizes[nruns - 1]); } bool first_time = true; bool dominated_found = false; int n, cumsize; int filename_len = MAX(strlen(filename), strlen("filename")); for (n = 0, cumsize = 0; n < nruns; cumsize = cumsizes[n], n++) { int old_size = cumsizes[n] - cumsize; int new_size = find_nondominated_set_agree (&points[dim * cumsize], dim, old_size, minmax, agree, &nondom[cumsize]); if (verbose_flag >= 2) { if (first_time) { fprintf (stderr, "# %*s\tset\tsize\tnondom\tdom\n", filename_len - 2, "filename"); first_time = false; } fprintf (stderr, "%-*s\t%d\t%d\t%d\t%d\n", filename_len, filename, n+1, old_size, new_size, old_size - new_size); } else if (verbose_flag && new_size < old_size) { if (first_time) { fprintf (stderr, "%-*s\tset\tdom\n", filename_len, "filename"); first_time = false; } fprintf (stderr, "%-*s\t%d\t%d dominated\n", filename_len, filename, n+1, old_size - new_size); } if (new_size < old_size) { dominated_found = true; } else if (new_size > old_size) {/* This can't happen. */ fatal_error ("%s:%d: a bug happened: new_size > old_size!\n", __FILE__, __LINE__); } } if (nondom_p) *nondom_p = nondom; else if (free_nondom) free(nondom); return dominated_found; } static void print_file_info (FILE *stream, const char *filename, int dim, const signed char *minmax) { /* Print some info about input files. */ fprintf (stream, "# file: %s\n", filename); fprintf (stream, "# objectives (%d): ", dim); int n; for (n = 0; n < dim; n++) { fprintf (stream, "%c", (minmax[n] < 0) ? '-' : ((minmax[n] > 0) ? '+' : 'i')); } fprintf (stream, "\n"); } static void print_output_header (FILE *stream, const char *filename, int dim, const signed char *minmax, signed char agree, double lrange, double urange, const double *lbound, const double *ubound, const bool *logarithm) { int n; print_file_info (stream, filename, dim, minmax); fprintf (stream, "# agree: %s\n", (agree < 0) ? "min" : ((agree > 0) ? "max" : "no")); if (logarithm) { fprintf (stream, "# logarithm: "); for (n = 0; n < dim; n++) { fprintf (stream, "%c", logarithm[n] ? '1' : '0'); } fprintf (stream, "\n"); } if (normalise_flag) fprintf (stream, "# range: " point_printf_format " " point_printf_format "\n", lrange, urange); fprintf (stream, "# lower bound: "); vector_fprintf (stream, lbound, dim); fprintf (stream, "\n"); fprintf (stream, "# upper bound: "); vector_fprintf (stream, ubound, dim); fprintf (stream, "\n"); } static void print_input_info (FILE *stream, const char *filename, int dim, const int *cumsizes, int nruns, const signed char *minmax, const double *minimum, const double *maximum) { int n; print_file_info (stream, filename, dim, minmax); fprintf (stream, "# sets: %d\n", nruns); fprintf (stream, "# sizes: %d", cumsizes[0]); for (n = 1; n < nruns; n++) fprintf (stream, ", %d", cumsizes[n] - cumsizes[n - 1]); fprintf (stream, "\n"); fprintf (stream, "# points: %d\n", cumsizes[nruns - 1]); fprintf (stream, "# minimum:"); vector_fprintf (stream, minimum, dim); fprintf (stream, "\n"); fprintf (stream, "# maximum:"); vector_fprintf (stream, maximum, dim); fprintf (stream, "\n"); } static bool process_file (const char *filename, const signed char *minmax, int *dim_p, signed char agree, double lrange, double urange, double *lbound, double *ubound, double **minimum_p, double **maximum_p, bool check_minimum, bool check_maximum, const bool *logarithm) { bool *nondom = NULL; bool dominated_found = false; bool logarithm_flag = false; double *points = NULL; int d; int dim = *dim_p; int *cumsizes = NULL; int nsets = 0; int err = read_double_data (filename, &points, &dim, &cumsizes, &nsets); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); if (union_flag) { cumsizes[0] = cumsizes[nsets - 1]; nsets = 1; } /* Default minmax if not set yet. */ bool free_minmax = false; if (minmax == NULL) { minmax = read_minmax (NULL, &dim); free_minmax = true; } double *minimum = NULL; double *maximum = NULL; data_bounds (&minimum, &maximum, points, dim, cumsizes[nsets - 1]); if (verbose_flag >= 2) print_input_info (stderr, filename, dim, cumsizes, nsets, minmax, minimum, maximum); if (lbound == NULL) lbound = minimum; else if (check_minimum && !force_bounds_flag && any_less_than (minimum, lbound, dim)) { errprintf ("%s: found vector smaller than lower bound:", filename); vector_fprintf (stderr, minimum, dim); fprintf (stderr, "\n"); exit (EXIT_FAILURE); } if (ubound == NULL) ubound = maximum; else if (check_maximum && !force_bounds_flag && any_less_than (ubound, maximum, dim)) { errprintf ("%s: found vector larger than upper bound:", filename); vector_fprintf (stderr, maximum, dim); fprintf (stderr, "\n"); exit (EXIT_FAILURE); } if (force_bounds_flag) { force_bounds (points, dim, cumsizes, nsets, lbound, ubound); } double *log_lbound = NULL; double *log_ubound = NULL; if (logarithm) { log_lbound = malloc(sizeof(double) * dim); log_ubound = malloc(sizeof(double) * dim); memcpy (log_lbound, lbound, sizeof(double) * dim); memcpy (log_ubound, ubound, sizeof(double) * dim); for (d = 0; d < dim; d++) { if (!logarithm[d]) continue; log_lbound[d] = log10(lbound[d]); log_ubound[d] = log10(ubound[d]); logarithm_flag = true; } if (logarithm_flag) { lbound = log_lbound; ubound = log_ubound; logarithm_scale (points, dim, cumsizes[nsets - 1], logarithm); } } if (agree) agree_objectives (points, dim, cumsizes[nsets - 1], minmax, agree); if (normalise_flag) normalise (points, dim, cumsizes[nsets - 1], minmax, agree, lrange, urange, lbound, ubound); /* Check sets. */ if (check_flag || filter_flag) if (check_nondominated (filename, points, dim, cumsizes, nsets, minmax, agree, filter_flag ? &nondom : NULL)) dominated_found = true; if (verbose_flag >= 2) fprintf (stderr, "# nondominated: %s\n", dominated_found ? "FALSE" : "TRUE"); /* Write out nondominated sets. */ if (filter_flag || agree || normalise_flag || force_bounds_flag || logarithm_flag) { const char *outfilename = ""; FILE *outfile = stdout; if (filename != stdin_name) { outfilename = m_strcat(filename, suffix); outfile = fopen (outfilename, "w"); if (outfile == NULL) { errprintf ("%s: %s\n", outfilename, strerror(errno)); exit(EXIT_FAILURE); } } print_output_header (outfile, filename, dim, minmax, agree, lrange, urange, lbound, ubound, logarithm); if (filter_flag && dominated_found) write_sets_filtered (outfile, points, dim, cumsizes, nsets, nondom); else write_sets (outfile, points, dim, cumsizes, nsets); if (verbose_flag) fprintf (stderr, "# %s -> %s\n", filename, outfilename); if (outfile != stdout) { fclose (outfile); free ( (void *) outfilename); } } free (points); free (cumsizes); if (free_minmax) free( (void *) minmax); if (nondom) free (nondom); if (log_lbound) free (log_lbound); if (log_ubound) free (log_ubound); *minimum_p = minimum; *maximum_p = maximum; *dim_p = dim; if (verbose_flag >= 2) fprintf (stderr, "#\n"); return dominated_found; } int main(int argc, char *argv[]) { signed char agree = 0; double lower_range = 0.0; double upper_range = 0.0; double *lower_bound = NULL; double *upper_bound = NULL; const signed char *minmax = NULL; const bool *logarithm = NULL; int dim = 0; int opt; /* it's actually going to hold a char */ int longopt_index; /* see the man page for getopt_long for an explanation of these fields */ static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, {"no-check", no_argument, NULL, 'c'}, {"filter", no_argument, NULL, 'f'}, {"force-bounds",no_argument, NULL, 'b'}, {"obj", required_argument, NULL, 'o'}, {"agree", required_argument, NULL, 'a'}, {"normalise", required_argument, NULL, 'n'}, {"upper-bound",required_argument, NULL, 'u'}, {"lower-bound",required_argument, NULL, 'l'}, {"union", no_argument, NULL, 'U'}, {"suffix", required_argument, NULL, 's'}, {"log", required_argument, NULL, 'L'}, {NULL, 0, NULL, 0} /* marks end of list */ }; while (0 < (opt = getopt_long (argc, argv, "hVvqfo:a:n:u:l:Us:b", long_options, &longopt_index))) { switch (opt) { case 'V': // --version version(); exit(EXIT_SUCCESS); case 'q': // --quiet verbose_flag = 0; break; case 'v': // --verbose verbose_flag = 2; break; case 'c': // --no-check check_flag = false; break; case 'f': // --filter filter_flag = true; check_flag = true; break; case 'b': // --force-bounds force_bounds_flag = true; break; case 'U': // --union union_flag = true; break; case 'o': // --obj minmax = read_minmax (optarg, &dim); if (minmax == NULL) { errprintf ("invalid argument '%s' for -o, --obj" ", it should be a sequence of '+' or '-'\n", optarg); exit(EXIT_FAILURE); } break; case 'a': // --agree if (!strcmp (optarg, "max")) agree = 1; else if (!strcmp (optarg, "min")) agree = -1; else { errprintf ("invalid argument '%s' for -a, --agree" ", it should be either \'min\' or \'max\'\n", optarg); exit (EXIT_FAILURE); } break; case 'n': // --normalise normalise_flag = true; if (!read_range (optarg, &lower_range, &upper_range)) { errprintf ("invalid range '%s' for -n, --normalise" ", use for example -n \"1 2\"\n", optarg); exit (EXIT_FAILURE); } else if (lower_range >= upper_range) { errprintf ("lower range must be smaller than upper range" " for -n, --normalise\n"); exit (EXIT_FAILURE); } break; case 'u': // --upper-bound upper_bound = robust_read_point (optarg, &dim, "invalid upper bound point '%s'"); break; case 'l': // --lower-bound lower_bound = robust_read_point (optarg, &dim, "invalid lower bound point '%s'"); break; case 's': // --suffix suffix = optarg; break; case 'L': // --log logarithm = read_bitvector (optarg, &dim); if (logarithm == NULL) { errprintf ("invalid argument to --log '%s'", optarg); exit (EXIT_FAILURE); } break; case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); case 'h': usage(); exit(EXIT_SUCCESS); default: // should never happen abort(); } } if (lower_bound && upper_bound && any_less_than (upper_bound, lower_bound, dim)) { errprintf ("upper bound must be higher than lower bound."); exit (EXIT_FAILURE); } int numfiles = argc - optind; double *minimum = NULL; double *maximum = NULL; bool dominated_found = false; if (numfiles <= 1) {/* <= 0 means: No input files: read stdin. */ dominated_found = process_file ((numfiles == 1) ? argv[optind] : NULL, minmax, &dim, agree, lower_range, upper_range, lower_bound, upper_bound, &minimum, &maximum, /*check_minimum=*/true, /*check_maximum=*/true, logarithm); free(minimum); free(maximum); free((void*)minmax); return dominated_found; } int k; if (!lower_bound || !upper_bound) { /* Calculate the bounds among all input files. */ minimum = NULL, maximum = NULL; for (k = 0; k < numfiles; k++) file_bounds (argv[optind + k], &minimum, &maximum, &dim); k = 0; } else { /* If the bounds were given, initialize minimum and maximum. */ if (process_file (argv[optind], minmax, &dim, agree, lower_range, upper_range, lower_bound, upper_bound, &minimum, &maximum, /*check_minimum=*/true, /*check_maximum=*/true, logarithm)) dominated_found = true; k = 1; } for (; k < numfiles; k++) { double *tmp_maximum = NULL; double *tmp_minimum = NULL; if (process_file (argv[optind + k], minmax, &dim, agree, lower_range, upper_range, (lower_bound) ? lower_bound : minimum, (upper_bound) ? upper_bound : maximum, &tmp_minimum, &tmp_maximum, lower_bound != NULL, upper_bound != NULL, logarithm)) dominated_found = true; /* If the bounds were given, the real minimum and maximum must be calculated as we process the files. */ if (lower_bound && upper_bound) for (int n = 0; n < dim; n++) { if (minimum[n] > tmp_minimum[n]) minimum[n] = tmp_minimum[n]; if (maximum[n] < tmp_maximum[n]) maximum[n] = tmp_maximum[n]; } free (tmp_minimum); free (tmp_maximum); } if (verbose_flag) { printf ("# Total files: %d\n", numfiles); printf ("# Total minimum:"); vector_printf (minimum, dim); printf ("\n"); printf ("# Total maximum:"); vector_printf (maximum, dim); printf ("\n"); printf ("# Nondominated: %s\n", dominated_found ? "FALSE": "TRUE"); } free(minimum); free(maximum); return dominated_found; } eaf/src/mo-tools/io.c0000644000176200001440000001240314660712340014123 0ustar liggesusers/***************************************************************************** I/O functions --------------------------------------------------------------------- Copyright (c) 2005-2008 Carlos M. Fonseca Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- TODO: things that may or may not improve reading performance. * different values for PAGE_SIZE. * reading whole lines and then sscanf the line. * mmaping the input file (or a big chunk of few megabytes), then read, then unmmap. *****************************************************************************/ #include #include "io.h" #include "common.h" /* FIXME: Do we need to handle the following weird files? */ /* fscanf (instream, "%*[ \t]"); retval = fscanf (instream, "%1[\r\n]", newline); // We do not consider that '\r\n' starts a new set. if (retval == 1 && newline[0] == '\r') fscanf (instream, "%*[\n]"); */ static inline void skip_trailing_whitespace (FILE * instream) { ignore_unused_result (fscanf (instream, "%*[ \t\r]")); } static inline int fscanf_newline(FILE * instream) { char newline[2]; return fscanf (instream, "%1[\n]", newline); } /* skip full lines starting with # */ static inline int skip_comment_line (FILE * instream) { char newline[2]; if (!fscanf (instream, "%1[#]%*[^\n]", newline)) /* and whitespace */ skip_trailing_whitespace(instream); return fscanf_newline(instream); } #define objective_t int #define objective_t_scanf_format "%d" #define read_objective_t_data read_int_data #include "io_priv.h" #undef objective_t #undef objective_t_scanf_format #undef read_objective_t_data #define objective_t double #define objective_t_scanf_format "%lf" #define read_objective_t_data read_double_data #include "io_priv.h" #undef objective_t #undef objective_t_scanf_format #undef read_objective_t_data #ifndef R_PACKAGE extern char *program_invocation_short_name; #include void fatal_error(const char *format,...) { va_list ap; fprintf(stderr, "%s: fatal error: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); exit(EXIT_FAILURE); } /* From: Edition 0.10, last updated 2001-07-06, of `The GNU C Library Reference Manual', for Version 2.3.x. Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc. */ void errprintf(const char *format,...) { va_list ap; fprintf(stderr, "%s: error: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); } /* End of copyright The GNU C Library Reference Manual */ void warnprintf(const char *format,...) { va_list ap; fprintf(stderr, "%s: warning: ", program_invocation_short_name); va_start(ap,format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); } void vector_fprintf (FILE *stream, const double * vector, int size) { int k; fprintf (stream, point_printf_format, vector[0]); for (k = 1; k < size; k++) fprintf (stream, point_printf_sep "" point_printf_format, vector[k]); } #ifndef R_PACKAGE void vector_printf (const double *vector, int size) { vector_fprintf (stdout, vector, size); } #endif int write_sets (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns) { int size = 0; int set = 0; for (set = 0; set < nruns; set++) { for (; size < cumsizes[set]; size++) { vector_fprintf (outfile, &data[ncols * size], ncols); fprintf (outfile, "\n"); } fprintf (outfile, "\n"); } return 0; } int write_sets_filtered (FILE *outfile, const double *data, int ncols, const int *cumsizes, int nruns, const bool *write_p) { int size = 0; int set = 0; for (set = 0; set < nruns; set++) { for (; size < cumsizes[set]; size++) { if (write_p[size]) { vector_fprintf (outfile, &data[ncols * size], ncols); fprintf (outfile, "\n"); } } fprintf (outfile, "\n"); } return 0; } #endif // R_PACKAGE eaf/src/mo-tools/hv_contrib.c0000644000176200001440000000305714660712340015656 0ustar liggesusers#include "hv.h" #include #include #include #include #include #include "common.h" /* Given a list of points, compute the hypervolume of each set that can be obtained by removing just one point. It does not actually compute the contribution but HV_total - HV_i, where HV_total is the total HV and HV_i is the contribution of the point, that is, it actually computes the HV minus the point i. */ static double * hv_1point_diffs (double *hvc, double *points, int dim, int size, const double * ref, const bool * uev) { bool keep_uevs = uev != NULL; if (hvc == NULL) hvc = malloc (sizeof(double) * size); double * tmp = malloc (sizeof(double) * dim); for (int i = 0; i < size; i++) { memcpy (tmp, points + i * dim, sizeof(double) * dim); memcpy (points + i * dim, ref, sizeof(double) * dim); hvc[i] = (keep_uevs && uev[i]) ? 0.0 : fpli_hv(points, dim, size, ref); memcpy (points + i * dim, tmp, sizeof(double) * dim); } free(tmp); return hvc; } void hv_contributions (double *hvc, double *points, int dim, int size, const double * ref) { const double tolerance = sqrt(DBL_EPSILON); double hv_total = fpli_hv(points, dim, size, ref); hv_1point_diffs(hvc, points, dim, size, ref, NULL); for (int i = 0; i < size; i++) { hvc[i] = hv_total - hvc[i]; // Handle very small values. hvc[i] = (fabs(hvc[i]) >= tolerance) ? hvc[i] : 0.0; eaf_assert(hvc[i] >= 0); } } eaf/src/mo-tools/svnversion.mk0000644000176200001440000000054314660712340016117 0ustar liggesusers## Do we have svnversion? ifeq ($(shell sh -c 'which svnversion 1> /dev/null 2>&1 && echo y'),y) ## Is this a working copy? ifeq ($(shell sh -c 'LC_ALL=C svnversion -n . | grep -q ^[0-9] && echo y'),y) $(shell sh -c 'svnversion -n . > svn_version') endif endif ## Set version information: SVN_REV = $(shell sh -c 'cat svn_version 2> /dev/null') eaf/src/mo-tools/dominatedsets.c0000644000176200001440000003632614660712340016371 0ustar liggesusers/************************************************************************* Calculates the number of Pareto sets from one file that dominate the Pareto sets of the other files. --------------------------------------------------------------------- Copyright (c) 2007-2014 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. --------------------------------------------------------------------- Literature: [1] Eckart Zitzler, Lothar Thiele, Marco Laumanns, Carlos M. Fonseca and Viviane Grunert da Fonseca. "Performance assessment of multiobjective optimizers: an analysis and review," Evolutionary Computation, IEEE Transactions on , vol.7, no.2, pp. 117-132, April 2003. [2] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid population-based algorithms for the bi-objective quadratic assignment problem. Journal of Mathematical Modelling and Algorithms, 5(1):111-137, April 2006. *************************************************************************/ #include "epsilon.h" #include "nondominated.h" #include #include #include #include #include // for isspace() #include // for getopt() #include // for getopt_long() #define READ_INPUT_WRONG_INITIAL_DIM_ERRSTR "-o, --obj" #include "cmdline.h" char *program_invocation_short_name = "dominatedsets"; static void usage(void) { printf("\n" "Usage: %s [OPTIONS] [FILE...]\n\n", program_invocation_short_name); printf( "Calculates the number of Pareto sets from one file that \n" "dominate the Pareto sets of the other files. \n\n" "Options:\n" OPTION_HELP_STR OPTION_VERSION_STR " -v, --verbose print some information (time, number of points, etc.) \n" OPTION_QUIET_STR " -p, --percentages print results also as percentages. \n" " --no-check do not check nondominance of sets (faster but unsafe).\n" OPTION_OBJ_STR "\n"); } static bool verbose_flag = false; static bool percentages_flag = false; static bool check_flag = true; void print_results (char **filenames, int numfiles, int *nruns, int **results) { int k,j; int max_col_len = 0; int max_filename_len = 0; int max_result = 0; char buffer[32]; /* longest filename. */ for (k = 0; k < numfiles; k++) max_filename_len = MAX (max_filename_len, (int) strlen (filenames[k])); /* longest number. */ for (k = 0; k < numfiles; k++) for (j = 0; j < numfiles; j++) max_result = MAX (max_result, results[k][j]); snprintf(buffer, 32, "%d", max_result); buffer[31] = '\0'; max_col_len = MAX (max_filename_len, (int) strlen(buffer)); printf("\n\n" "Number of times that is better than :\n"); /* Header row. */ printf ("\n%*s", max_filename_len, ""); for (k = 0; k < numfiles; k++) { printf (" %*s", max_col_len, filenames[k]); } for (k = 0; k < numfiles; k++) { printf("\n%*s", max_filename_len, filenames[k]); for (j = 0; j < numfiles; j++) { if (k == j) printf (" %*s", max_col_len, "--"); else printf (" %*d", max_col_len, results[k][j]); } } printf ("\n"); if (percentages_flag) { max_col_len = MAX (max_col_len, (int) strlen("100.0")); printf("\n\n" "Percentage of times that is better than :\n"); /* Header row. */ printf ("\n%*s", max_filename_len, ""); for (k = 0; k < numfiles; k++) { printf (" %*s", max_col_len, filenames[k]); } for (k = 0; k < numfiles; k++) { printf("\n%*s", max_filename_len, filenames[k]); for (j = 0; j < numfiles; j++) { if (k == j) printf (" %*s", max_col_len, "--"); else printf (" %*.1f", max_col_len, results[k][j] * 100.0 / (nruns[k] * nruns[j])); } } } printf ("\n\n"); printf ("Ranks:"); for (k = 0; k < numfiles; k++) { int rank = 0; for (j = 0; j < numfiles; j++) { if (k == j) continue; rank += results[j][k]; } printf (" %3d", rank); } printf ("\n"); } static inline int dominance (int dim, const double *a, const double *b, const signed char *minmax) /*********************************************** return: O -> if a == b 1 -> if a dominates b -1 -> if a NOT dominates b ***********************************************/ { int d; /* If any objective is worse, A can't dominate B. */ for (d = 0; d < dim; d++) if ((minmax[d] < 0 && a[d] > b[d]) || (minmax[d] > 0 && a[d] < b[d])) return -1; /* If any objective is better, then A dominates B. */ for (d = 0; d < dim; d++) if ((minmax[d] < 0 && a[d] < b[d]) || (minmax[d] > 0 && a[d] > b[d])) return 1; return 0; } static int set_dominates (int dim, const signed char *minmax, const double *points_x, int size_x, const double *points_y, int size_y) { bool x_dominates_y = false, x_weakly_dominates_y = false; for (int y = 0; y < size_y; y++) { x_weakly_dominates_y = false; for (int x = 0; x < size_x; x++) { DEBUG1 ( printf ("X:"); vector_printf (points_x + x * dim, dim); printf ("Y:"); vector_printf (points_y + y * dim, dim); ); int result = dominance (dim, &points_x[x * dim], &points_y[y * dim], minmax); if (result == 1) { DEBUG1 (printf ("X dominates Y!\n")); x_weakly_dominates_y = true; x_dominates_y = true; break; } else if (result == 0) { DEBUG1 (printf ("X weakly dominates Y!\n")); x_weakly_dominates_y = true; break; } } if (!x_weakly_dominates_y) break; } if (!x_weakly_dominates_y) return 1; else if (size_x != size_y || x_dominates_y) return -1; else return 0; } int pareto_better (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_b, int size_b) { int result = set_dominates (dim, minmax, points_a, size_a, points_b, size_b); if (result == 1) { DEBUG1 (printf ("Trying with B\n")); result = set_dominates (dim, minmax, points_b, size_b, points_a, size_a); result = -result; if (result != 1) { DEBUG1(printf("A || B\n")); result = 0; } } int result2 = epsilon_additive_ind (dim, minmax, points_a, size_a, points_b, size_b); DEBUG2 ( printf ("result = %d, result2 = %d\n", result, result2); for (int a = 0; a < size_a; a++) { vector_printf (points_a + a * dim, dim); } printf("\n\n"); for (int b = 0; b < size_b; b++) { vector_printf (points_b + b * dim, dim); }); if (result != result2) { printf ("result = %d != result2 = %d\n", result, result2); abort(); } return result; } void cmpparetos (int dim, const signed char *minmax, const double * points_a, int nruns_a, const int *cumsizes_a, int *numbetter_a, const double * points_b, int nruns_b, const int *cumsizes_b, int *numbetter_b) { int a,b, result; int size_a; int size_b; *numbetter_a = 0; *numbetter_b = 0; for (a = 0, size_a = 0; a < nruns_a; a++) { for (b = 0, size_b = 0; b < nruns_b; b++) { result = pareto_better (dim, minmax, points_a + (dim * size_a), cumsizes_a[a] - size_a, points_b + (dim * size_b), cumsizes_b[b] - size_b); if (result < 0) (*numbetter_a)++; else if (result > 0) (*numbetter_b)++; size_b = cumsizes_b[b]; } size_a = cumsizes_a[a]; } } int main(int argc, char *argv[]) { int *nruns = NULL; int **cumsizes = NULL; double **points = NULL; int dim = 0; char **filenames; int numfiles; const signed char *minmax = NULL; int k, n, j; int opt; /* it's actually going to hold a char */ int longopt_index; /* see the man page for getopt_long for an explanation of these fields */ static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, {"percentages",no_argument, NULL, 'p'}, {"no-check", no_argument, NULL, 'c'}, {"obj", required_argument, NULL, 'o'}, {NULL, 0, NULL, 0} /* marks end of list */ }; while (0 < (opt = getopt_long(argc, argv, "hVvqpo:", long_options, &longopt_index))) { switch (opt) { case 'V': // --version version(); exit(EXIT_SUCCESS); case 'q': // --quiet verbose_flag = false; break; case 'v': // --verbose verbose_flag = true; break; case 'p': // --percentages percentages_flag = true; break; case 'c': // --no-check check_flag = false; break; case 'o': // --obj minmax = read_minmax (optarg, &dim); if (minmax == NULL) { fprintf(stderr, "%s: invalid argument '%s' for -o, --obj\n", program_invocation_short_name,optarg); exit(EXIT_FAILURE); } break; case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); case 'h': usage(); exit(EXIT_SUCCESS); default: // should never happen abort(); } } numfiles = argc - optind; if (numfiles <= 1) { fprintf(stderr, "%s: error: at least two input files are required.\n", program_invocation_short_name); usage(); exit(EXIT_FAILURE); } filenames = malloc (sizeof(char *) * numfiles); points = malloc (sizeof(double *) * numfiles); nruns = malloc (sizeof(int) * numfiles); cumsizes = malloc (sizeof(int *) * numfiles); for (k = 0; k < numfiles; optind++, k++) { filenames[k] = argv[optind]; points[k] = NULL; cumsizes[k] = NULL; nruns[k] = 0; int err = read_double_data (filenames[k], &points[k], &dim, &cumsizes[k], &nruns[k]); handle_read_data_error (err, filenames[k]); } /* Default minmax if not set yet. */ if (minmax == NULL) minmax = read_minmax (NULL, &dim); /* Print filename substitutions. */ for (k = 0; k < numfiles; k++) { char buffer[32]; char *p; snprintf(buffer, 32, "f%d", k + 1); buffer[31] = '\0'; p = malloc (sizeof(char) * (strlen(buffer) + 1)); strncpy (p, buffer, 32); printf ("# %s: %s\n", p, filenames[k]); filenames[k] = p; } printf ("\n"); /* Print some info about input files. */ for (k = 0; k < numfiles; k++) { printf ("# %s: %d (%d", filenames[k], nruns[k], cumsizes[k][0]); for (n = 1; n < nruns[k]; n++) printf (", %d", cumsizes[k][n]); printf (")\n"); } /* Print some info. */ printf ("# objectives (%d): ", dim); for (k = 0; k < dim; k++) { printf ("%c", (minmax[k] < 0) ? '-' : (minmax[k] > 0) ? '+' : 'i'); } printf ("\n"); if (check_flag) { bool check_failed = false; for (k = 0; k < numfiles; k++) { int size = 0; for (n = 0; n < nruns[k]; n++) { int failed_pos = find_dominated_point (&points[k][dim * size], dim, cumsizes[k][n] - size, minmax); if (failed_pos >= 0) { fprintf (stderr, "%s: %s: set %d: point %d is dominated.\n", program_invocation_short_name, filenames[k], n, failed_pos); check_failed = true; } size = cumsizes[k][n]; } } if (check_failed) { errprintf ("input must be a collection of nondominated sets."); exit (EXIT_FAILURE); } } int **results = malloc (sizeof(int) * numfiles * numfiles + sizeof(int *) * numfiles); for (k = 0; k < numfiles; k++) { results[k] = (int *) (results + numfiles) + k * numfiles; for (j = 0; j < numfiles; j++) results[k][j] = -1; } for (k = 0; k < numfiles; k++) for (j = k + 1; j < numfiles; j++) cmpparetos (dim, minmax, points[k], nruns[k], cumsizes[k], &(results[k][j]), points[j], nruns[j], cumsizes[j], &(results[j][k])); print_results (filenames, numfiles, nruns, results); if (verbose_flag) { } return EXIT_SUCCESS; } eaf/src/mo-tools/epsilon.c0000644000176200001440000002506014660712340015170 0ustar liggesusers/************************************************************************* epsilon: --------------------------------------------------------------------- Copyright (c) 2010 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, you can obtain a copy of the GNU General Public License at: http://www.gnu.org/copyleft/gpl.html or by writing to: Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ---------------------------------------------------------------------- IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to acknowledge its use. Moreover, as a personal note, I would appreciate it if you would email manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. --------------------------------------------------------------------- Literature: [1] Eckart Zitzler, Lothar Thiele, Marco Laumanns, Carlos M. Fonseca and Viviane Grunert da Fonseca. "Performance assessment of multiobjective optimizers: an analysis and review," Evolutionary Computation, IEEE Transactions on , vol.7, no.2, pp. 117-132, April 2003. [2] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid population-based algorithms for the bi-objective quadratic assignment problem. Journal of Mathematical Modelling and Algorithms, 5(1):111-137, April 2006. *************************************************************************/ #include "epsilon.h" #include "nondominated.h" #include #include #include #include #include #include // for isspace() #include // for getopt() #include // for getopt_long() #include "cmdline.h" char *program_invocation_short_name = "epsilon"; static bool verbose_flag = false; static bool additive_flag = true; static const char *suffix = NULL; static void usage(void) { printf("\n" "Usage:\n" " %s [OPTIONS] [FILES] \n" " %s [OPTIONS] < [INPUT] > [OUTPUT]\n\n", program_invocation_short_name, program_invocation_short_name); printf( "Calculates the epsilon measure for the Pareto sets given as input\n\n" "Options:\n" " -h, --help give this summary and exit. \n" " --version print version number and exit. \n" " -v, --verbose print some information (time, number of points, etc.) \n" " -q, --quiet print as little as possible \n" " -a, --additive epsilon additive value %s \n" " -m, --multiplicative epsilon multiplicative value %s \n" " -r, --reference FILE file that contains the reference set \n" " -o, --obj [+|-]... specify whether each objective should be \n" " minimised (-) or maximised (+) (default all minimised)\n" " -s, --suffix=STRING Create an output file for each input file by appending\n" " this suffix. This is ignored when reading from stdin. \n" " If missing, output is sent to stdout. \n" "\n", str_is_default(additive_flag), str_is_default(!additive_flag)); } static void do_file (const char *filename, double *reference, int reference_size, int *nobj_p, const signed char * minmax) { double *data = NULL; int *cumsizes = NULL; int nruns = 0; int nobj = *nobj_p; int err = read_double_data (filename, &data, &nobj, &cumsizes, &nruns); if (!filename) filename = stdin_name; handle_read_data_error (err, filename); char *outfilename = NULL; FILE *outfile = stdout; if (filename != stdin_name && suffix) { outfilename = m_strcat(filename, suffix); outfile = fopen (outfilename, "w"); if (outfile == NULL) { errprintf ("%s: %s\n", outfilename, strerror(errno)); exit (EXIT_FAILURE); } } #if 0 if (union_flag) { cumsizes[0] = cumsizes[nruns - 1]; nruns = 1; } #endif /* Default minmax if not set yet. */ bool free_minmax = false; if (minmax == NULL) { minmax = read_minmax (NULL, &nobj); free_minmax = true; } if (verbose_flag) printf("# file: %s\n", filename); int cumsize; int n; for (n = 0, cumsize = 0; n < nruns; cumsize = cumsizes[n], n++) { double time_elapsed = 0; double epsilon; //Timer_start (); epsilon = (additive_flag) ? epsilon_additive (nobj, minmax, &data[nobj * cumsize], cumsizes[n] - cumsize, reference, reference_size) : epsilon_mult (nobj, minmax, &data[nobj * cumsize], cumsizes[n] - cumsize, reference, reference_size); // time_elapsed = Timer_elapsed_virtual (); fprintf (outfile, "%-16.15g\n", epsilon); if ((additive_flag && epsilon < 0) || (!additive_flag && epsilon < 1)) { errprintf ("%s: some points are not dominated by the reference set", filename); exit (EXIT_FAILURE); } if (verbose_flag) fprintf (outfile, "# Time: %f seconds\n", time_elapsed); } if (outfilename) { if (verbose_flag) fprintf (stderr, "# %s -> %s\n", filename, outfilename); fclose (outfile); free (outfilename); } free (data); free (cumsizes); if (free_minmax) free( (void *) minmax); *nobj_p = nobj; } int main(int argc, char *argv[]) { double *reference = NULL; int reference_size = 0; int nobj = 0; const signed char *minmax = NULL; int k; /* see the man page for getopt_long for an explanation of these fields */ static struct option long_options[] = { {"help", no_argument, NULL, 'h'}, {"version", no_argument, NULL, 'V'}, {"verbose", no_argument, NULL, 'v'}, {"quiet", no_argument, NULL, 'q'}, {"additive", no_argument, NULL, 'a'}, {"multiplicative", no_argument, NULL, 'm'}, {"reference", required_argument, NULL, 'r'}, {"suffix", required_argument, NULL, 's'}, {"obj", required_argument, NULL, 'o'}, {NULL, 0, NULL, 0} /* marks end of list */ }; int opt; /* it's actually going to hold a char */ int longopt_index; while (0 < (opt = getopt_long(argc, argv, "hVvqamr:us:o:", long_options, &longopt_index))) { switch (opt) { case 'a': // --additive additive_flag = true; break; case 'm': // --multiplicative additive_flag = false; break; case 'o': // --obj minmax = read_minmax (optarg, &nobj); if (minmax == NULL) { fprintf(stderr, "%s: invalid argument '%s' for -o, --obj\n", program_invocation_short_name,optarg); exit(EXIT_FAILURE); } break; case 'r': // --reference reference_size = read_reference_set (&reference, optarg, &nobj); if (reference == NULL || reference_size <= 0) { errprintf ("invalid reference set '%s", optarg); exit (EXIT_FAILURE); } break; case 's': // --suffix suffix = optarg; break; case 'V': // --version version(); exit(EXIT_SUCCESS); case 'q': // --quiet verbose_flag = false; break; case 'v': // --verbose verbose_flag = true; break; case '?': // getopt prints an error message right here fprintf(stderr, "Try `%s --help' for more information.\n", program_invocation_short_name); exit(EXIT_FAILURE); case 'h': usage(); exit(EXIT_SUCCESS); default: // should never happen abort(); } } if (verbose_flag) fprintf (stderr, (additive_flag) ? "# Additive epsilon indicator\n" : "# Multiplicative epsilon indicator\n"); if (reference == NULL) { errprintf ("a reference set must be provided (--reference)"); exit (EXIT_FAILURE); } int numfiles = argc - optind; if (numfiles < 1) {/* Read stdin. */ do_file (NULL, reference, reference_size, &nobj, minmax); } else if (numfiles == 1) { do_file (argv[optind], reference, reference_size, &nobj, minmax); } else { /* FIXME: Calculate the nondominated front among all input files to use as reference set. */ #if 0 if (reference == NULL) { reference_size = calculate_nondominated (&reference, data, nobj, cumsizes[nruns-1], minmax); write_sets (stderr, reference, nobj, &reference_size, 1); } for (k = 0; k < numfiles; k++) nondominatedfile_range (argv[optind + k], &maximum, &minimum, &nobj); if (verbose_flag >= 2) { printf ("# maximum:"); vector_printf (maximum, nobj); printf ("\n"); printf ("# minimum:"); vector_printf (minimum, nobj); printf ("\n"); } #endif for (k = 0; k < numfiles; k++) do_file (argv[optind + k], reference, reference_size, &nobj, minmax); } return EXIT_SUCCESS; } eaf/src/mo-tools/whv_hype.h0000644000176200001440000000131714660712340015354 0ustar liggesusers#ifndef WHV_HYPE_H #define WHV_HYPE_H #include enum hype_sample_dist_type { HYPE_DIST_UNIFORM, HYPE_DIST_EXPONENTIAL, HYPE_DIST_GAUSSIAN }; typedef struct hype_sample_dist hype_sample_dist; hype_sample_dist * hype_dist_unif_new(unsigned long seed); hype_sample_dist * hype_dist_exp_new(double mu, unsigned long seed); hype_sample_dist * hype_dist_gaussian_new(const double *mu, unsigned long int seed); void hype_dist_free(hype_sample_dist * d); enum hype_sample_dist_type hype_dist_get_type(const hype_sample_dist *); double whv_hype_estimate(const double *points, size_t n, const double *ideal, const double *ref, hype_sample_dist * dist, size_t nsamples); #endif eaf/src/mo-tools/epsilon.h0000644000176200001440000001047014660712340015174 0ustar liggesusers#ifndef EPSILON_H #define EPSILON_H #include #include #include #ifndef INFINITY #define INFINITY (HUGE_VAL) #endif #include "common.h" #include "io.h" /* IMPLEMENTATION NOTE: Given objective vectors a and b, I_epsilon(a,b) is computed in the case of minimization as a/b for the multiplicative case (respectively, a - b for the additive case), whereas in the case of maximization it is computed as b/a for the multiplicative case (respectively, b - a for the additive case). This allows computing a single value for mixed optimization problems, where some objectives are to be maximized while others are to be minimized. Moreover, a lower value corresponds to a better approximation set, independently of the type of problem (minimization, maximization or mixed). However, the meaning of the value is different for each objective type. For example, imagine that f1 is to be minimized and f2 is to be maximized, and the multiplicative epsilon computed here for I_epsilon(A,B) = 3. This means that A needs to be multiplied by 1/3 for all f1 values and by 3 for all f2 values in order to weakly dominate B. This also means that the computation of the multiplicative version for negative values doesn't make sense. */ static inline double epsilon_mult (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_b, int size_b) { int a, b, d; double epsilon = 0; for (b = 0; b < size_b; b++) { double epsilon_min = INFINITY; for (a = 0; a < size_a; a++) { double epsilon_max = 0; for (d = 0; d < dim; d++) { double epsilon_temp; if (points_a[a * dim + d] <= 0 || points_b[b * dim + d] <= 0) { fatal_error ("cannot calculate multiplicative epsilon indicator with values <= 0\n."); } if (minmax[d] < 0) epsilon_temp = points_a[a * dim + d] / points_b[b * dim + d]; else if (minmax[d] > 0) epsilon_temp = points_b[b * dim + d] / points_a[a * dim + d]; else epsilon_temp = 1; if (epsilon_temp < 0) { fatal_error("cannot calculate multiplicative epsilon indicator with different signedness\n."); } epsilon_max = MAX (epsilon_max, epsilon_temp); } epsilon_min = MIN (epsilon_min, epsilon_max); } epsilon = MAX (epsilon, epsilon_min); } return epsilon; } static inline double epsilon_additive (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_b, int size_b) { int a, b, d; double epsilon = -INFINITY; for (b = 0; b < size_b; b++) { double epsilon_min = INFINITY; for (a = 0; a < size_a; a++) { double epsilon_max = -INFINITY; for (d = 0; d < dim; d++) { double epsilon_temp; if (minmax[d] < 0) epsilon_temp = points_a[a * dim + d] - points_b[b * dim + d]; else if (minmax[d] > 0) epsilon_temp = points_b[b * dim + d] - points_a[a * dim + d]; else epsilon_temp = 0; epsilon_max = MAX (epsilon_max, epsilon_temp); } epsilon_min = MIN (epsilon_min, epsilon_max); } epsilon = MAX (epsilon, epsilon_min); } return epsilon; } /* FIXME: this can be done much faster. For example, the diff needs to be calculated just once and stored on a temporary array diff[]. */ static inline int epsilon_additive_ind (int dim, const signed char *minmax, const double *points_a, int size_a, const double *points_b, int size_b) { double eps_ab, eps_ba; eps_ab = epsilon_additive (dim, minmax, points_a, size_a, points_b, size_b); eps_ba = epsilon_additive (dim, minmax, points_b, size_b, points_a, size_a); DEBUG2 (printf ("eps_ab = %g, eps_ba = %g\n", eps_ab, eps_ba)); if (eps_ab <= 0 && eps_ba > 0) return -1; else if (eps_ab > 0 && eps_ba <= 0) return 1; else return 0; } #endif /* EPSILON_H */ eaf/src/mo-tools/common.h0000644000176200001440000000623414660712340015016 0ustar liggesusers#ifndef LIBMISC_COMMON_H_ # define LIBMISC_COMMON_H_ #ifdef R_PACKAGE #define R_NO_REMAP #include #define eaf_assert(EXP) \ do { if (!(EXP)) { Rf_error("eaf package: error: assertion failed: '%s' at %s:%d", \ #EXP, __FILE__, __LINE__);}} while(0) #define fatal_error(...) Rf_error(__VA_ARGS__) #define errprintf Rf_error #define warnprintf Rf_warning #include "gcc_attribs.h" #else #include #include #include #include "gcc_attribs.h" #include #define eaf_assert(X) assert(X) #define Rprintf(...) printf(__VA_ARGS__) void fatal_error(const char * format,...) __attribute__ ((format(printf, 1, 2))) __noreturn __unused; void errprintf(const char * format,...) __attribute__ ((format(printf, 1, 2))); void warnprintf(const char *format,...) __attribute__ ((format(printf, 1, 2))); #endif #if __GNUC__ >= 3 #define MAX(x,y) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(y) _y__ = (y); \ _x__ > _y__ ? _x__ : _y__; }) #define MIN(x,y) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(y) _y__ = (y); \ _x__ < _y__ ? _x__ : _y__; }) #define CLAMP(x, xmin, xmax) __extension__({ \ __typeof__(x) _x__ = (x); \ __typeof__(x) _xmin__ = (xmin); \ __typeof__(x) _xmax__ = (xmax); \ _x__ < _xmin__ ? _xmin__ : _x__ > _xmax__ ? _xmax__ : _x__; }) #else #define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MIN(x,y) ((x) < (y) ? (x) : (y)) #define CLAMP(x, xmin, xmax) MAX(xim, MIN(x, xmax)) #endif #define DEBUG_DO(X) do{ X;} while(0) #define DEBUG_NOT_DO(X) while(0){ X;} #if DEBUG >= 1 #define DEBUG1(X) DEBUG_DO(X) #else #define DEBUG1(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 2 #define DEBUG2(X) DEBUG_DO(X) #else #define DEBUG2(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 3 #define DEBUG3(X) DEBUG_DO(X) #else #define DEBUG3(X) DEBUG_NOT_DO(X) #endif #if DEBUG >= 4 #define DEBUG4(X) DEBUG_DO(X) #else #define DEBUG4(X) DEBUG_NOT_DO(X) #endif #ifndef R_PACKAGE #define DEBUG2_PRINT(...) DEBUG2 (fprintf (stderr, __VA_ARGS__)) #else #define DEBUG2_PRINT(...) DEBUG2 (Rprintf ( __VA_ARGS__)) #endif #define DEBUG2_FUNPRINT(...) \ do { DEBUG2_PRINT ("%s(): ", __FUNCTION__); \ DEBUG2_PRINT (__VA_ARGS__); } while(0) /* This is deprecated. See https://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html #if DEBUG >= 1 #ifndef MALLOC_CHECK_ #define MALLOC_CHECK_ 3 #endif #endif */ #include #define TRUE true #define FALSE false #ifndef ignore_unused_result #define ignore_unused_result(X) do { if(X) {}} while(0); #endif typedef unsigned long ulong; typedef long long longlong; static inline const char *str_is_default(bool flag) { return flag ? "(default)" : ""; } #endif /* !LIBMISC_COMMON_H_ */ eaf/src/mo-tools/gcc_attribs.h0000644000176200001440000000611114660712340016004 0ustar liggesusers#ifndef GCC_ATTRIBUTES #define GCC_ATTRIBUTES /* FIXME: does this handle C++? */ /* FIXME: add the explanation from the GCC documentation to each attribute. */ #ifndef __pure_func # define __pure_func __attribute__((pure)) #endif /* Many functions have no effects except the return value and their return value depends only on the parameters and/or global variables. Such a function can be subject to common subexpression elimination and loop optimization just as an arithmetic operator would be. Some of common examples of pure functions are strlen or memcmp. Interesting non-pure functions are functions with infinite loops or those depending on volatile memory or other system resource, that may change between two consecutive calls (such as feof in a multithreading environment). */ #ifndef __const_func # define __const_func __attribute__((const)) #endif /* Many functions do not examine any values except their arguments, and have no effects except the return value. Basically this is just slightly more strict class than the pure attribute below, since function is not allowed to read global memory. Note that a function that has pointer arguments and examines the data pointed to must not be declared const. Likewise, a function that calls a non-const function usually must not be const. It does not make sense for a const function to return void. */ # define __noreturn __attribute__((noreturn)) /* The noreturn keyword tells the compiler to assume that function cannot return. It can then optimize without regard to what would happen if fatal ever did return. This makes slightly better code. More importantly, it helps avoid spurious warnings of uninitialized variables. */ # define __malloc __attribute__((malloc)) /* The malloc attribute is used to tell the compiler that a function may be treated as if any non-NULL pointer it returns cannot alias any other pointer valid when the function returns. This will often improve optimization. Standard functions with this property include malloc and calloc. realloc-like functions have this property as long as the old pointer is never referred to (including comparing it to the new pointer) after the function returns a non-NULL value. */ # define __must_check __attribute__((warn_unused_result)) /* The warn_unused_result attribute causes a warning to be emitted if a caller of the function with this attribute does not use its return value. */ #ifndef __deprecated # define __deprecated __attribute__((deprecated)) #endif /* The deprecated attribute results in a warning if the function is used anywhere in the source file. */ #ifndef __used # define __used __attribute__((used)) #endif #ifndef __unused # define __unused __attribute__((unused)) #endif #ifndef __packed # define __packed __attribute__((packed)) #endif #if __GNUC__ >= 3 # define likely(x) __builtin_expect (!!(x), 1) # define unlikely(x) __builtin_expect (!!(x), 0) #else # define __attribute__(x) /* If we're not using GNU C, elide __attribute__ */ # define likely(x) (x) # define unlikely(x) (x) #endif #endif eaf/src/Rnondominated.c0000644000176200001440000000610613627011751014547 0ustar liggesusers#include "Rcommon.h" #include "nondominated.h" SEXP normalise_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP RANGE, SEXP LBOUND, SEXP UBOUND, SEXP MAXIMISE) { int nprotected = 0; SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); SEXP_2_DOUBLE_VECTOR(RANGE, range, range_len); SEXP_2_DOUBLE_VECTOR(LBOUND, lbound, lbound_len); SEXP_2_DOUBLE_VECTOR(UBOUND, ubound, ubound_len); SEXP_2_LOGICAL_VECTOR(MAXIMISE, maximise, maximise_len); if (nobj != lbound_len) Rf_error("length of lbound (%d) is different from number of objectives (%d)", lbound_len, nobj); if (nobj != ubound_len) Rf_error("length of ubound (%d) is different from number of objectives (%d)", ubound_len, nobj); if (nobj != maximise_len) Rf_error("length of maximise (%d) is different from number of objectives (%d)", maximise_len, nobj); if (range_len != 2) Rf_error("length of range must be two (lower, upper)"); signed char * minmax = create_minmax(nobj, maximise); // FIXME: Is this slower than pure R? Why is R so inefficient? new_real_matrix (out, nobj, npoint); double * data = REAL(DATA); for (int i = 0; i < nobj * npoint; i++) out[i] = data[i]; // We have to make the objectives agree before normalisation. // FIXME: Do normalisation and agree in one step. const signed char agree = AGREE_MINIMISE; agree_objectives (out, nobj, npoint, minmax, agree); normalise(out, nobj, npoint, minmax, agree, range[0], range[1], lbound, ubound); free (minmax); UNPROTECT(nprotected); return Rexp_out; } SEXP is_nondominated_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT, SEXP MAXIMISE, SEXP KEEP_WEAKLY) { int nprotected = 0; SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); SEXP_2_LOGICAL_VECTOR(MAXIMISE, maximise, maximise_len); SEXP_2_LOGICAL(KEEP_WEAKLY, keep_weakly); if (nobj != maximise_len) Rf_error("length of maximise (%d) is different from number of objectives (%d)", maximise_len, nobj); signed char * minmax = create_minmax(nobj, maximise); bool * bool_is_nondom = nondom_init(npoint); double * data = REAL(DATA); if (keep_weakly) { find_weak_nondominated_set(data, nobj, npoint, minmax, bool_is_nondom); } else { find_nondominated_set(data, nobj, npoint, minmax, bool_is_nondom); } new_logical_vector (is_nondom, npoint); bool_2_logical_vector(is_nondom, bool_is_nondom, npoint); free (minmax); free (bool_is_nondom); UNPROTECT(nprotected); return Rexp_is_nondom; } SEXP pareto_ranking_C(SEXP DATA, SEXP NOBJ, SEXP NPOINT) { int nprotected = 0; SEXP_2_INT(NOBJ, nobj); SEXP_2_INT(NPOINT, npoint); double * data = REAL(DATA); /* FIXME: How to assign directly? */ new_int_vector (rank, npoint); int * rank2 = pareto_rank(data, nobj, npoint); for (int i = 0; i < npoint; i++) { rank[i] = rank2[i]; } free (rank2); UNPROTECT(nprotected); return Rexp_rank; } eaf/src/install.libs.R0000644000176200001440000000047714660417275014341 0ustar liggesusersfiles <- Sys.glob(paste0("*", SHLIB_EXT)) if (any(file.exists(files))) { dest <- file.path(R_PACKAGE_DIR, paste0('libs', R_ARCH)) dir.create(dest, recursive = TRUE, showWarnings = FALSE) file.copy(files, dest, overwrite = TRUE) } if (file.exists("symbols.rds")) file.copy("symbols.rds", dest, overwrite = TRUE) eaf/NAMESPACE0000644000176200001440000000174314373474370012245 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(eafplot,default) S3method(eafplot,formula) S3method(eafplot,list) export(attsurf2df) export(avg_hausdorff_dist) export(choose_eafdiff) export(choose_eafdiffplot) export(eafdiff) export(eafdiffplot) export(eafplot) export(eafs) export(epsilon_additive) export(epsilon_mult) export(filter_dominated) export(hv_contributions) export(hypervolume) export(igd) export(igd_plus) export(is_nondominated) export(largest_eafdiff) export(normalise) export(pareto_rank) export(pdf_crop) export(read.data.sets) export(read_datasets) export(symDifPlot) export(total_whv_rect) export(vorobDev) export(vorobT) export(whv_hype) export(whv_rect) export(write_datasets) import(graphics) importFrom(Rdpack,reprompt) importFrom(grDevices,colorRampPalette) importFrom(grDevices,embedFonts) importFrom(grDevices,gray) importFrom(grDevices,pdf) importFrom(utils,modifyList) importFrom(utils,tail) importFrom(utils,write.table) useDynLib(eaf, .registration = TRUE) eaf/NEWS.md0000644000176200001440000001410714660120646012113 0ustar liggesusers# eaf 2.5.1 * Fix Clang warning. # eaf 2.5 * The argument `to.range` of `normalise()` has been renamed to `to_range`. * Silence some warnings with GCC 12. * Replace dots in function names with underscore (`_`) to silence CRAN Note. # eaf 2.4 * If the installation cannot find the Gnu Scientific Library, it gives hints on how to install it on various operating systems. * `pdf_crop()` can optionally embed fonts. * Fix calculation of `ideal` in `largest_eafdiff()`. * Fix `configure` script to use the same compiler and flags as R. # eaf 2.3 * `eafplot()` now returns the attainment surfaces computed invisibly. * New functions `pdf_crop()`, `write_datasets()`, `attsurf2df()`. * Fix bug that made polygons extend beyond their boundaries affecting `eafdiff()` and `eafdiffplot()`. # eaf 2.2 * `col` argument of `eafdiffplot()` may be a colormap function. # eaf 2.1 * Improve documentation of `igd()`. * Fix errors with single-point attainment surfaces. * Fix bug in `eafplot.list()`. # eaf 2.0 * `read_datasets()` is able to read files compressed with `xz`. * `eafs()` and `eafdiff()` and the plotting functions using them now consume slightly less memory. * New function `whv_hype()` to estimate weighted hypervolume using Monte-Carlo sampling. * New functions `total_whv_rect()` and `whv_rect()` to compute weighted hypervolume with rectangular weighted regions. * New functions `largest_eafdiff()`, `choose_eafdiffplot()` and `choose_eafdiff()` for converting EAF differences into weighted regions for calculating the weighted hypervolume. * New function `avg_hausdorff_dist()` for computing the averaged Hausdorff distance. # eaf 1.9-1 * Fixes to Makefiles for non-GCC compilers and parallel build setups. # eaf 1.9 * Compute Vorob'ev threshold, expectation and deviation. Plots of the symmetric deviation. (Mickael Binois) * Non-integer EAF percentiles are computed correctly. * Various aesthetic improvements in `eafplot()` and `eafdiffplot()`. * Functions for computing hypervolume, hypervolume contributions, epsilon metric, IGD+, filter dominated points, and fast normalisation of ranges. * Command-line tools for computing the above are installed in `system.file(package="eaf", "bin/")`. * Online documentation available at: http://lopez-ibanez.eu/eaftools * New `read_datasets()` replaces deprecated `read.data.sets()`. New parameter `text` of `read_datasets()`. * New `eafdiff()` function for computing EAF differences. * The `data.frame` method for `eafplot` has been removed. It had unexpected behavior and the default method handles `data.frame` already. * Python script to compute EAF differences installed at `system.file(package="eaf", "scripts/eafdiff.py")`. # eaf 1.8 * Development version moved to GitHub: https://github.com/MLopez-Ibanez/eaf * Remove leading zeros from version number. * New parameters `left.panel.last` and `right.panel.last` of `eafdiffplot()`. * Export and document function `eafs()` to compute EAFs. * `eafdiff.pl`: Handle `--colors=`, `--intervals=`. * Fix crash in `eafplot()` if `sets` is a vector of strings. * Reset layout in `eafdiffplot()`. * Compute eaf for 3D. * Added testthat testing framework. * The documentation is now generated with Roxygen2. * Entry points to C code are now properly registered. # eaf 1.07 * Silence CRAN warning for GNU extensions in Makefiles in `inst/scripts/eaf/Makefile`. # eaf 1.06 * Fix bug when automatically generating a legend in `eafplot()` with the formula interface (Thanks to Bernd Bischl for reporting this) * Improve handling of various newline character formats. * Reduce memory consumption (up to four times less memory). * `eafdiff.pl`: Mention option `--legendpos=none` to hide the legend. * `eafplot.pl`: Add options `--maximise` and `--xmaximise` and `--colors=`. Fix bug with `--area`. * `eafplot.default()` now requires two colors when `type=="area"` and a palette is interpolated between these two colors for all the different levels plotted (Thanks to Alexandre Quemy for the suggestion). # eaf 1.05 * Implement `type = "area"` for `eafdiffplot()`. This is now the default. The idea for the algorithm to compute the areas was provided by Carlos M. Fonseca. The implementation uses R polygons, which some PDF viewers may have trouble rendering correctly (See https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-are-there-unwanted-borders). Plots will look correct when printed. To get the previous behavior use `eafdiffplot(, type = "point")`. * Attempt to deal with DOS/Unix newlines correctly. * `eafplot.pl`: Cleanups. (`--single, --output, --legend`): New options. Default to PDF. * `eafdiff.pl`: Many cleanups. EAF diff with `type="area"` is the default now. Parameter `--cex` replaced by `--scale`. Do not require `ps2eps`. Handle `--obj1=` better. Crop pdf before converting to `PNG`. (`--noattsurfs`): New option. (`--output-dir,--output`): New options. (`--eps`): New option. PDF is the default now. * Force `eafdiffplot()` to use a square plotting region. * `read.data.sets()` normalizes paths, thus it works with files such as `~/file`. * Function `eafdiffplot()` handles `percentiles=NA` and grand.lines parameter. * Fix bug with ranges and `maximise=TRUE` in `eafdiffplot()`. * Fix `points.steps` to work correctly for all values of `maximise`. * Fix bug in `eafdiffplot(..., maximise=c(TRUE,FALSE), full.eaf = TRUE)` * Fix `"log"` parameter in `eafplot()` and `eafdiffplot()`. * Avoid that `eafplot.formula` modifies global options. * Add `'axes'` parameter to `eafplot()`. * To avoid confusion, the arguments `'xaxis.side'` and `'yaxis.side'` of `eafplot()` can only take values `c("below", "above")` and `c("left", "right")`, respectively. * Add missing Makefile in `inst/scripts/eaf/`. # eaf 1.04 * Fix issues with only one point in the EAF. # eaf 1.03 * Handle maximise argument in `eafdiffplot()` and `--maximise` command-line option in `eafdiff.pl` * `R/calls.R` (`eafplot.data.frame`): Fix problem with main parameter. # eaf 1.00 * Initial release available in CRAN. eaf/configure.ac0000644000176200001440000000437314373500046013304 0ustar liggesusers## Process this file with autoconf to produce a configure script. ## ## Copyright (C) 2010 Romain Francois and Dirk Eddelbuettel ## Copyright (C) 2014 - 2019 Dirk Eddelbuettel ## ## Licensed under GNU GPL 2 or later # The version set here will propagate to other files from here AC_INIT([eaf],[2.5]) # This doesn't work in MacOS #AC_INIT([eaf],m4_esyscmd_s(awk -e '/^Version:/ {print $2}' DESCRIPTION)) ## Do we need this? # : ${R_HOME=`R RHOME`} # if test -z "${R_HOME}"; then # echo "could not determine R_HOME" # exit 1 # fi # CC=`"${R_HOME}/bin/R" CMD config CC` # CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` # CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` # CXX=$(${R_HOME}/bin/R CMD config CXX) # CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS) # # Checks for common programs using default macros # AC_PROG_CC PKG_CONFIG_NAME="gsl-config" PKG_DEB_NAME="libgsl-dev" PKG_RPM_NAME="libgsl-dev" PKG_BREW_NAME="gsl" ## Use gsl-config to find arguments for compiler and linker flags ## ## Check for non-standard programs: gsl-config(1) AC_PATH_PROG([GSL_CONFIG], [$PKG_CONFIG_NAME]) ## If gsl-config was found, let's use it if test "${GSL_CONFIG}" != ""; then # Use $PKG_CONFIG_NAME for header and linker arguments GSL_CFLAGS=`${GSL_CONFIG} --cflags` GSL_LIBS=`${GSL_CONFIG} --libs` else # Customize the error AC_MSG_ERROR([ --------------------------- [EAF PACKAGE] -------------------------------- Configuration failed because $PKG_CONFIG_NAME was not found. Try installing: * Debian, Ubuntu, etc: sudo apt-get install $PKG_DEB_NAME * Fedora, CentOS, RHEL: sudo yum install $PKG_RPM_NAME * Mac OSX: brew install $PKG_BREW_NAME If $PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your PATH and PKG_CONFIG_PATH contains a $PKG_CONFIG_NAME.pc file. If pkg-config is unavailable you can set INCLUDE_DIR and LIB_DIR manually via: R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...' -------------------------- [ERROR MESSAGE] --------------------------- cat configure.log -------------------------------------------------------------------- ]) fi # Now substitute these variables in src/Makevars.in to create src/Makevars AC_SUBST(GSL_CFLAGS) AC_SUBST(GSL_LIBS) AC_CONFIG_FILES([src/Makevars]) AC_OUTPUT eaf/inst/0000755000176200001440000000000014660712374011774 5ustar liggesuserseaf/inst/CITATION0000644000176200001440000000212114404105666013121 0ustar liggesusersbibentry( bibtype = "incollection", header = "To cite package 'eaf' in publications, please use", title = "Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization", author = c(person("Manuel", "López-Ibáñez"), person("Luis", "Paquete"), person("Thomas", "Stützle")), year = 2010, doi = "10.1007/978-3-642-02538-9_9", booktitle = "Experimental Methods for the Analysis of Optimization Algorithms", publisher = "Springer, Berlin, Germany", editor = "Thomas Bartz-Beielstein and Marco Chiarandini and Luís Paquete and Mike Preuss", pages = "209--222", textVersion= paste0("Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. ", "Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization. ", "In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuss, editors, ", "Experimental Methods for the Analysis of Optimization Algorithms, pages 209–222. Springer, Berlin, Germany, 2010.", "\ndoi: 10.1007/978-3-642-02538-9_9") ) eaf/inst/REFERENCES.bib0000644000176200001440000003775114660650442014105 0ustar liggesusers% References should come from https://iridia-ulb.github.io/references/ @article{Jen03, title = {Reducing the run-time complexity of multiobjective {EA}s: The {NSGA-II} and other algorithms}, author = {M. T. Jensen}, journal = {IEEE Transactions on Evolutionary Computation}, volume = 7, number = 5, pages = {503--515}, year = 2003 } @article{Deb02nsga2, author = { Kalyanmoy Deb and A. Pratap and S. Agarwal and T. Meyarivan}, title = {A fast and elitist multi-objective genetic algorithm: {NSGA-II}}, journal = {IEEE Transactions on Evolutionary Computation}, year = 2002, volume = 6, number = 2, pages = {182--197}, doi = {10.1109/4235.996017} } @incollection{FonGueLopPaq2011emo, address = { Heidelberg }, publisher = {Springer}, year = 2011, series = {Lecture Notes in Computer Science}, volume = 6576, editor = { Takahashi, R. H. C. and others}, booktitle = { Evolutionary Multi-criterion Optimization, EMO 2011}, author = { Carlos M. Fonseca and Andreia P. Guerreiro and Manuel L{\'o}pez-Ib{\'a}{\~n}ez and Lu{\'i}s Paquete }, title = {On the Computation of the Empirical Attainment Function}, doi = {10.1007/978-3-642-19893-9_8}, pages = {106--120}, abstract = {The attainment function provides a description of the location of the distribution of a random non-dominated point set. This function can be estimated from experimental data via its empirical counterpart, the empirical attainment function (EAF). However, computation of the EAF in more than two dimensions is a non-trivial task. In this article, the problem of computing the empirical attainment function is formalised, and upper and lower bounds on the corresponding number of output points are presented. In addition, efficient algorithms for the two and three-dimensional cases are proposed, and their time complexities are related to lower bounds derived for each case.} } @article{DiaLop2020ejor, author = { Juan Esteban Diaz and Manuel L{\'o}pez-Ib{\'a}ñez }, title = {Incorporating Decision-Maker's Preferences into the Automatic Configuration of Bi-Objective Optimisation Algorithms}, journal = {European Journal of Operational Research}, year = 2021, volume = 289, number = 3, pages = {1209--1222}, doi = {10.1016/j.ejor.2020.07.059}, abstract = {Automatic configuration (AC) methods are increasingly used to tune and design optimisation algorithms for problems with multiple objectives. Most AC methods use unary quality indicators, which assign a single scalar value to an approximation to the Pareto front, to compare the performance of different optimisers. These quality indicators, however, imply preferences beyond Pareto-optimality that may differ from those of the decision maker (DM). Although it is possible to incorporate DM's preferences into quality indicators, e.g., by means of the weighted hypervolume indicator (HV$^w$), expressing preferences in terms of weight function is not always intuitive nor an easy task for a DM, in particular, when comparing the stochastic outcomes of several algorithm configurations. A more visual approach to compare such outcomes is the visualisation of their empirical attainment functions (EAFs) differences. This paper proposes using such visualisations as a way of eliciting information about regions of the objective space that are preferred by the DM. We present a method to convert the information about EAF differences into a HV$^w$ that will assign higher quality values to approximation fronts that result in EAF differences preferred by the DM. We show that the resulting HV$^w$ may be used by an AC method to guide the configuration of multi-objective optimisers according to the preferences of the DM. We evaluate the proposed approach on a well-known benchmark problem. Finally, we apply our approach to re-configuring, according to different DM's preferences, a multi-objective optimiser tackling a real-world production planning problem arising in the manufacturing industry.}, supplement = {https://doi.org/10.5281/zenodo.3749288} } @incollection{Grunert01, year = 2001, series = {Lecture Notes in Computer Science}, volume = 1993, publisher = {Springer, Heidelberg, Germany}, editor = { Eckart Zitzler and Kalyanmoy Deb and Lothar Thiele and Carlos A. {Coello Coello} and David Corne }, booktitle = {Evolutionary Multi-criterion Optimization, EMO 2001}, author = { Viviane {Grunert da Fonseca} and Carlos M. Fonseca and Andreia O. Hall }, key = {Fonseca et al., 2001}, title = {Inferential Performance Assessment of Stochastic Optimisers and the Attainment Function}, pages = {213--225}, alias = {Fonseca01}, doi = {10.1007/3-540-44719-9_15}, annote = {Proposed looking at anytime behavior as a multi-objective problem}, keywords = {EAF} } @phdthesis{LopezIbanezPhD, author = { Manuel L{\'o}pez-Ib{\'a}ñez }, title = {Operational Optimisation of Water Distribution Networks}, school = {School of Engineering and the Built Environment}, year = 2009, address = {Edinburgh Napier University, UK}, url = {https://lopez-ibanez.eu/publications#LopezIbanezPhD} } @incollection{GruFon2009:emaa, editor = { Thomas Bartz-Beielstein and Marco Chiarandini and Lu{\'i}s Paquete and Mike Preuss }, year = 2010, address = {Berlin, Germany}, publisher = {Springer}, booktitle = {Experimental Methods for the Analysis of Optimization Algorithms}, author = { Viviane {Grunert da Fonseca} and Carlos M. Fonseca }, title = {The Attainment-Function Approach to Stochastic Multiobjective Optimizer Assessment and Comparison}, pages = {103--130} } @incollection{LopPaqStu09emaa, editor = { Thomas Bartz-Beielstein and Marco Chiarandini and Lu{\'i}s Paquete and Mike Preuss }, year = 2010, address = {Berlin, Germany}, publisher = {Springer}, booktitle = {Experimental Methods for the Analysis of Optimization Algorithms}, author = { Manuel L{\'o}pez-Ib{\'a}ñez and Lu{\'i}s Paquete and Thomas St{\"u}tzle }, title = {Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization}, pages = {209--222}, doi = {10.1007/978-3-642-02538-9_9}, abstract = {This chapter introduces two Perl programs that implement graphical tools for exploring the performance of stochastic local search algorithms for biobjective optimization problems. These tools are based on the concept of the empirical attainment function (EAF), which describes the probabilistic distribution of the outcomes obtained by a stochastic algorithm in the objective space. In particular, we consider the visualization of attainment surfaces and differences between the first-order EAFs of the outcomes of two algorithms. This visualization allows us to identify certain algorithmic behaviors in a graphical way. We explain the use of these visualization tools and illustrate them with examples arising from practice.} } @article{BinGinRou2015gaupar, title = {Quantifying uncertainty on {P}areto fronts with {G}aussian process conditional simulations}, volume = 243, doi = {10.1016/j.ejor.2014.07.032}, abstract = {Multi-objective optimization algorithms aim at finding Pareto-optimal solutions. Recovering Pareto fronts or Pareto sets from a limited number of function evaluations are challenging problems. A popular approach in the case of expensive-to-evaluate functions is to appeal to metamodels. Kriging has been shown efficient as a base for sequential multi-objective optimization, notably through infill sampling criteria balancing exploitation and exploration such as the Expected Hypervolume Improvement. Here we consider Kriging metamodels not only for selecting new points, but as a tool for estimating the whole Pareto front and quantifying how much uncertainty remains on it at any stage of Kriging-based multi-objective optimization algorithms. Our approach relies on the Gaussian process interpretation of Kriging, and bases upon conditional simulations. Using concepts from random set theory, we propose to adapt the Vorob'ev expectation and deviation to capture the variability of the set of non-dominated points. Numerical experiments illustrate the potential of the proposed workflow, and it is shown on examples how Gaussian process simulations and the estimated Vorob'ev deviation can be used to monitor the ability of Kriging-based multi-objective optimization algorithms to accurately learn the Pareto front.}, number = 2, journal = {European Journal of Operational Research}, author = {Binois, M. and Ginsbourger, D. and Roustant, O.}, year = 2015, keywords = {Attainment function, Expected Hypervolume Improvement, Kriging, Multi-objective optimization, Vorob'ev expectation}, pages = {386--394} } @phdthesis{ChiarandiniPhD, author = { Marco Chiarandini }, title = {Stochastic Local Search Methods for Highly Constrained Combinatorial Optimisation Problems}, school = {FB Informatik, TU Darmstadt, Germany}, year = 2005 } @article{JohAraMcGSch1991, author = {David S. Johnson and Cecilia R. Aragon and Lyle A. McGeoch and Catherine Schevon}, title = {Optimization by Simulated Annealing: An Experimental Evaluation: Part {II}, Graph Coloring and Number Partitioning}, journal = {Operations Research}, year = 1991, volume = 39, number = 3, pages = {378--406} } @incollection{FonPaqLop06:hypervolume, address = {Piscataway, NJ}, publisher = {IEEE Press}, month = jul, year = 2006, booktitle = {Proceedings of the 2006 Congress on Evolutionary Computation (CEC 2006)}, key = {IEEE CEC}, author = { Carlos M. Fonseca and Lu{\'i}s Paquete and Manuel L{\'o}pez-Ib{\'a}ñez }, title = {An improved dimension-sweep algorithm for the hypervolume indicator}, pages = {1157--1163}, doi = {10.1109/CEC.2006.1688440}, pdf = {FonPaqLop06-hypervolume.pdf}, } @article{BeuFonLopPaqVah09:tec, author = { Nicola Beume and Carlos M. Fonseca and Manuel L{\'o}pez-Ib{\'a}ñez and Lu{\'i}s Paquete and Jan Vahrenhold }, title = {On the complexity of computing the hypervolume indicator}, journal = {IEEE Transactions on Evolutionary Computation}, year = 2009, volume = 13, number = 5, pages = {1075--1082}, doi = {10.1109/TEVC.2009.2015575}, } @article{ZitThiLauFon2003:tec, author = { Eckart Zitzler and Lothar Thiele and Marco Laumanns and Carlos M. Fonseca and Viviane {Grunert da Fonseca}}, title = {Performance Assessment of Multiobjective Optimizers: an Analysis and Review}, journal = {IEEE Transactions on Evolutionary Computation}, year = 2003, volume = 7, number = 2, pages = {117--132}, alias = {perfassess} } @incollection{BezLopStu2017emo, editor = {Heike Trautmann and G{\"{u}}nter Rudolph and Kathrin Klamroth and Oliver Sch{\"{u}}tze and Margaret M. Wiecek and Yaochu Jin and Christian Grimme}, year = 2017, series = {Lecture Notes in Computer Science}, address = {Cham, Switzerland}, publisher = {Springer International Publishing}, booktitle = {Evolutionary Multi-criterion Optimization, EMO 2017}, author = { Leonardo C. T. Bezerra and Manuel L{\'o}pez-Ib{\'a}ñez and Thomas St{\"u}tzle }, title = {An Empirical Assessment of the Properties of Inverted Generational Distance Indicators on Multi- and Many-objective Optimization}, pages = {31--45}, doi = {10.1007/978-3-319-54157-0_3} } @incollection{CoeSie2004igd, publisher = {Springer, Heidelberg, Germany}, volume = 2972, series = {Lecture Notes in Artificial Intelligence}, booktitle = {Proceedings of MICAI}, editor = {Monroy, Ra{\'u}l and Arroyo-Figueroa, Gustavo and Sucar, Luis Enrique and Sossa, Humberto}, author = { Carlos A. {Coello Coello} and Reyes-Sierra, Margarita}, title = {A Study of the Parallelization of a Coevolutionary Multi-objective Evolutionary Algorithm}, year = 2004, pages = {688--697}, keywords = {IGD}, annote = {Introduces Inverted Generational Distance (IGD)} } @incollection{IshMasTanNoj2015igd, editor = { Ant{\'o}nio Gaspar{-}Cunha and Carlos Henggeler Antunes and Carlos A. {Coello Coello} }, volume = 9018, year = 2015, series = {Lecture Notes in Computer Science}, publisher = {Springer, Heidelberg, Germany}, booktitle = {Evolutionary Multi-criterion Optimization, EMO 2015 Part {I}}, author = { Ishibuchi, Hisao and Masuda, Hiroyuki and Tanigaki, Yuki and Nojima, Yusuke}, title = {Modified Distance Calculation in Generational Distance and Inverted Generational Distance}, pages = {110--125} } @article{SchEsqLarCoe2012tec, author = { Oliver Sch{\"u}tze and X. Esquivel and A. Lara and Carlos A. {Coello Coello} }, journal = {IEEE Transactions on Evolutionary Computation}, title = {Using the Averaged {Hausdorff} Distance as a Performance Measure in Evolutionary Multiobjective Optimization}, year = 2012, volume = 16, number = 4, pages = {504--522} } @inproceedings{VelLam1998gp, year = 1998, publisher = {Stanford University Bookstore}, address = {Stanford University, California}, month = jul, editor = {John R. Koza}, booktitle = {Late Breaking Papers at the Genetic Programming 1998 Conference}, alias = {Veldhuizen98a}, key = {Van Veldhuizen and Lamont, 1998a}, title = {Evolutionary Computation and Convergence to a {P}areto Front}, author = { David A. {Van Veldhuizen} and Gary B. Lamont }, pages = {221--228}, keywords = {generational distance} } @incollection{AugBadBroZit2009gecco, address = {New York, NY}, publisher = {ACM Press}, year = 2009, editor = {Franz Rothlauf}, booktitle = {Proceedings of the Genetic and Evolutionary Computation Conference, GECCO 2009}, author = { Anne Auger and Johannes Bader and Dimo Brockhoff and Eckart Zitzler }, title = {Articulating User Preferences in Many-Objective Problems by Sampling the Weighted Hypervolume}, pages = {555--562} } @article{ZhoZhaJin2009igdx, author = "Zhou, A. and Zhang, Qingfu and Yaochu Jin ", title = {Approximating the set of {Pareto}-optimal solutions in both the decision and objective spaces by an estimation of distribution algorithm}, journal = {IEEE Transactions on Evolutionary Computation}, year = 2009, volume = 13, number = 5, pages = {1167--1189}, doi = {10.1109/TEVC.2009.2021467}, keywords = {multi-modal, IGDX} }eaf/inst/extdata/0000755000176200001440000000000014412571546013425 5ustar liggesuserseaf/inst/extdata/README0000644000176200001440000000104413534247654014310 0ustar liggesusersThis directory contains the files needed to reproduce the examples described in Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuß, editors, Experimental Methods for the Analysis of Optimization Algorithms, pages 209-233, Springer, 2010. The script run.sh contains the commands necessary to reproduce all examples. Please, read the comments within run.sh. eaf/inst/extdata/ran.10pts.3d.100000644000176200001440000001256413534247654015636 0ustar liggesusers 8.075596533325871 2.4070255356042236 5.7900584474997725 8.660944458216182 3.640501439918415 4.449547646497271 0.20816431319298268 4.622754690859642 5.207141132875611 4.881432799420187 9.094731372977776 2.653138500755452 0.22997366985771173 1.1177220504888612 8.981893105113855 1.516436358882681 3.0793373131494355 5.521641101169316 6.081528410951497 4.587438533417284 3.28238204604303 2.3530968030921873 0.790551723688969 7.297223710722109 8.747545403381238 1.7157586196357748 1.033957674001333 0.587994749876203 0.7389118125403558 8.675789804506532 8.588487717331967 3.6978131307633157 2.909288653302772 1.5964887994915449 5.98825094023213 7.869613377381958 5.281236703887404 3.4780096885580587 8.007214670385517 2.1631595210668535 4.739443495657631 1.7922505090810006 9.579301384819974 5.792432363411047 0.805332100590535 2.858913413972806 4.49240941089634 7.243893099504964 0.9746867640001433 7.658936435498515 6.534055419285794 6.476482371060755 2.8124161966756023 2.9953242407751555 5.8451856377290525 6.091909643831176 1.2114682500160918 0.5317308719460216 9.732448290214514 2.1511984436077056 6.5282821401903135 4.629777696002223 4.283535257757999 8.440251145602728 6.678219699307396 0.8172385236404924 8.685017638265858 3.307870627999741 6.028213077429266 8.918113357333493 3.3898036403674174 0.9293221522074475 2.607641181852119 6.313098518029577 7.222042766439738 6.142351394610561 8.84959278039159 2.0837098947804673 3.2250970865541824 6.152283396875086 7.815278829369992 0.37731544764882763 9.022117521700476 7.7938934794496495 4.721204168412649 6.374719127366487 3.9894286449159093 4.610239315209966 2.2923199798311846 9.813639149596831 9.975144295633106 3.41528862187762 5.840388508371634 7.07633621832969 4.443854831157684 6.3946306361222245 1.5450725701160426 2.7181472478127446 8.006052032731485 3.0076613874076075 4.637098756802058 3.2817888067876426 3.4097651220298753 2.1136231027924506 6.487632603533015 4.082948779275862 7.695859178096489 2.7956119838975395 0.2901393023412995 8.322594122652102 5.876859309646966 6.323241427627681 1.2814098923074564 7.246005321502687 7.74140672115409 5.000663885951663 2.5672285232267407 1.5450625501794417 0.3830312233262294 9.946630068541651 8.113182843747358 6.455815967150455 6.538475290077849 4.434984522658629 4.1315064800161645 7.772226697700617 7.8685163591333005 3.173343470907617 7.357906691871562 8.686991427474887 5.31298269821866 5.19279715221906 8.758337308445093 8.988868850362223 3.572961454494614 9.78758588762432 1.4123827655944927 6.427305677038921 7.853441420989912 3.022190539811782 8.417418379305726 0.901706796640461 7.493769462486675 8.430161187001541 0.1747055597195173 8.890663430988944 8.922358124720017 6.163150300484419 7.938401212563832 5.474888116173653 4.104768524680931 9.678917821945836 3.93738426670604 8.579118682450876 0.35169752391560394 1.4493731767636193 4.9652583719732375 1.9435330516410834 4.284620594148203 8.17231096446568 9.769778530979478 1.1638275060136398 6.784984926701287 0.5638079644445808 8.061786891662466 2.718912135243628 6.943274809465109 9.397290557238108 3.41869650212319 9.384374667642259 4.761145502773846 6.454319548281916 4.060443879503394 2.256057566498885 1.1309630636314307 9.726454362756678 4.824054924439186 8.34008115019884 5.7069891876906595 1.2116034419419246 9.301370427932444 2.1432853237244496 9.958841791937324 9.695319492357159 7.2221252286508975 5.930624696677696 2.0113940991604218 9.387384421945871 9.488958888835963 4.0895251515646285 8.269917273689043 5.6896017947792075 5.193575918195671 9.430837249658266 4.328847902798756 9.306081015187335 7.694332464305761 4.014964357685522 3.3403539670375997 2.893774444550223 9.0098457086505 4.535908200774786 8.13026948412421 6.8425582492241075 0.9900878375955129 8.846919229882053 9.590345284259026 9.73980549839088 0.3668870724311297 2.793118580184671 9.730578754907608 6.1584756185786045 7.915767568015905 7.344009007535411 6.392053417149478 6.719702017859021 1.0685570659857606 6.7102429026645245 5.075854647328577 7.925112948747145 3.926695979357859 9.826811636699553 4.186464357058625 8.770482820044384 3.0469806674162343 1.4480632458110483 9.671189869200155 0.39467005160280255 4.936638226752783 6.209570742063124 8.981468056498903 2.1505417539739375 9.201280366129074 1.9133227860469653 2.6234983942176906 7.20701734250342 3.8381770196343252 5.939875435454276 8.401363142382205 1.322388443390929 4.3510208123598755 3.9462134812484058 2.844759593134457 0.792935737907638 6.4660541364494835 3.0049051695398297 1.5849888627033186 2.87955366508792 6.739667823745326 9.943327133705218 1.5018650337708794 0.7434825701623877 3.3093051385505365 9.88333405527131 2.14386622879977 7.046944669377279 1.8348435769055138 8.915052230973973 5.490272289337653 7.197279188094493 1.23306741620951 0.6510164008245374 9.423812130809253 7.921884118107121 1.3029144856969155 4.504176981643349 7.539297818529722 4.810156892044506 8.91432444750432 1.3582474223124437 0.6223027131455723 3.5694532411916766 4.206323126879596 1.3913956384270905 2.8479460274795874 1.3011355608587931 6.830412903586499 9.23146982658223 0.9287020455996275 0.8672396507619968 1.5859908886337628 9.520507331139061 6.431355372602436 1.0015356923806324 5.697775896323792 6.828978930106149 5.770930022029423 0.9644883471342007 4.925997256924397 2.704925186572346 2.465146637711475 1.2223439449845679 5.6895031075085285 3.1273859794431793 7.994669587594613 2.811225370890746 1.3907733489621363 2.127002885257127 2.43114173891515 6.997555157157489 eaf/inst/extdata/wrots_l10w100_dat0000644000176200001440000017675013534247654016466 0ustar liggesusers# Report: # Metah: Weighted RoTS, version 2.1.88M (#DEBUG = 1) # bQAP (0.1.88Msvn) # Data File: /home/manu/personal/2005-JMMA/data/qapUni.50.0.1 Size: 50 Averages: Distance=50.47 Flow1=49.26 Flow2=50.01 # Parameter settings: # number trials : 100 # time limit : 3.40282e+38 # seed : 1242309217 # num weights: 100 # Taboo Search Length : 10 # Initialization time: 0.004 s # start_trial(0) : # end_trial(0) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.716 s # Pareto: 0 Size: 33 5473826 6526814 5493250 6343474 5496176 6282882 5502448 6218950 5510780 6180946 5539966 6127292 5565586 6052860 5584022 6050386 5590094 6048274 5601432 6041098 5603938 6036508 5604250 6035400 5642958 6009858 5643314 5996484 5655268 5954504 5681332 5885864 5685066 5881662 5761538 5869308 5762428 5860318 5792684 5772712 5823414 5767558 5860734 5740240 5890544 5724424 5906560 5704548 5961104 5688026 5985044 5666152 6065866 5653804 6079994 5610878 6177896 5605006 6187024 5598184 6211210 5595258 6247004 5580700 6289572 5553288 # start_trial(1) : # end_trial(1) : Pareto Size = 39, Scalarizations = 100, Elapsed time = 7.604 s # Pareto: 1 Size: 39 5464286 6468510 5483338 6425684 5486560 6398072 5490172 6321560 5492190 6249646 5501474 6243086 5506814 6242362 5530720 6222704 5540230 6195922 5544276 6191576 5546330 6178918 5547704 6173070 5551010 6144084 5582976 6109600 5609460 6057996 5624086 6049322 5625720 5993428 5638102 5971312 5647638 5921298 5663048 5915032 5704138 5888876 5729684 5836944 5747252 5819924 5759610 5812382 5782070 5768652 5873978 5762538 5874272 5761044 5882830 5760430 5904552 5723300 5939924 5707386 5947614 5701140 5971320 5697846 5982022 5661266 6063414 5654264 6065726 5632240 6069364 5596736 6272108 5587046 6315974 5583950 6368090 5578316 # start_trial(2) : # end_trial(2) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.776 s # Pareto: 2 Size: 31 5459400 6391458 5479426 6334344 5495376 6334052 5499092 6252340 5504398 6186928 5525714 6168288 5547188 6143768 5559092 6086104 5587542 6070154 5587768 6045176 5606566 6009568 5645972 5973140 5659796 5967768 5685066 5903518 5700516 5884792 5708298 5837288 5786040 5816636 5808188 5810686 5827514 5802070 5836668 5767048 5870506 5732568 5892102 5721780 5924134 5705214 5934668 5677728 6004674 5669380 6027072 5659732 6031592 5638978 6044782 5637662 6082808 5609204 6092324 5603094 6253214 5575184 # start_trial(3) : # end_trial(3) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.548 s # Pareto: 3 Size: 29 5463102 6438364 5473856 6324104 5482618 6290900 5504258 6287356 5505584 6193506 5532676 6189400 5546722 6156310 5572324 6061118 5620220 6025180 5625344 6016892 5631372 5956486 5659450 5928660 5720274 5898402 5733618 5857754 5743250 5838360 5758642 5818112 5829984 5796312 5848816 5749614 5854722 5735726 5898104 5707610 5941982 5702718 5972232 5675872 6021562 5660390 6023888 5654430 6075856 5638782 6106930 5614914 6117966 5608692 6171870 5587604 6209836 5566250 # start_trial(4) : # end_trial(4) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.624 s # Pareto: 4 Size: 34 5462904 6447758 5471358 6403078 5478530 6374152 5488616 6373720 5489318 6286472 5505816 6207974 5525600 6194892 5540534 6183010 5563076 6147576 5575522 6129916 5585150 6059392 5589382 6042868 5605688 6018882 5615056 5998676 5639552 5966008 5646670 5944664 5697582 5934608 5698828 5934298 5701456 5917160 5707924 5882614 5730436 5861732 5740210 5856682 5789570 5781642 5830076 5746930 5919034 5725796 5933716 5669830 5953002 5668762 6025550 5652298 6065570 5647412 6098626 5606028 6172266 5584250 6277404 5576724 6283842 5566726 6349150 5563204 # start_trial(5) : # end_trial(5) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.768 s # Pareto: 5 Size: 36 5473170 6393360 5476340 6380998 5491846 6353018 5495148 6296226 5519062 6265090 5519812 6212052 5534358 6174368 5537162 6161216 5564424 6150734 5576744 6127658 5581700 6103550 5581934 6056392 5590954 6039310 5611828 6032792 5622246 6010060 5640802 5969970 5679068 5951746 5693260 5893258 5696058 5887714 5715428 5879502 5745114 5861730 5770308 5812920 5786984 5779996 5804950 5755002 5828922 5746320 5906244 5728720 5935080 5706794 5963402 5686978 5975454 5675910 5988840 5667338 6028566 5658016 6048388 5628088 6066286 5625498 6105872 5598794 6250842 5577366 6288742 5565098 # start_trial(6) : # end_trial(6) : Pareto Size = 28, Scalarizations = 100, Elapsed time = 7.696 s # Pareto: 6 Size: 28 5463368 6432452 5472040 6379916 5486028 6301162 5522330 6189608 5543346 6142814 5544048 6103468 5547890 6095124 5584602 6070942 5601820 6057146 5606908 6046368 5628534 5996806 5639754 5979188 5667862 5903616 5706776 5857700 5737668 5831240 5777824 5781582 5798668 5779106 5826374 5753854 5840298 5742252 5899532 5686184 5981008 5671694 6045318 5649770 6061648 5635462 6126548 5613592 6154312 5607456 6165072 5601942 6227740 5585918 6263758 5570116 # start_trial(7) : # end_trial(7) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.724 s # Pareto: 7 Size: 30 5468774 6382734 5498568 6304846 5499490 6235464 5517008 6227206 5519794 6225236 5525784 6196098 5527344 6196068 5540808 6134132 5556582 6114292 5566184 6097612 5569316 6025674 5618874 5954694 5630924 5951274 5672118 5947266 5677566 5916114 5722486 5867416 5758392 5846684 5777734 5787298 5833602 5779658 5834850 5755424 5852146 5754470 5861922 5720298 5963272 5698242 5973552 5695486 5979604 5679158 6001482 5643540 6020326 5626466 6050568 5595726 6154474 5589552 6209536 5563840 # start_trial(8) : # end_trial(8) : Pareto Size = 39, Scalarizations = 100, Elapsed time = 7.752 s # Pareto: 8 Size: 39 5487164 6387864 5493858 6347562 5495452 6314548 5503952 6288260 5508524 6269818 5520270 6239256 5528570 6207896 5529942 6147766 5560010 6132202 5562612 6101794 5593108 6081356 5615656 6047176 5630456 6014302 5633416 5981558 5662954 5916380 5701298 5893354 5715524 5884950 5727872 5870568 5739352 5858264 5772402 5823914 5780418 5818252 5786840 5816708 5830932 5790760 5834644 5764390 5869730 5762196 5875676 5737886 5889824 5732110 5917000 5719372 5919168 5710156 5933164 5696970 5941176 5687456 5968848 5670862 5988362 5641660 6088704 5635518 6091792 5623608 6106984 5599008 6195550 5585052 6297880 5569958 6306082 5553538 # start_trial(9) : # end_trial(9) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.66 s # Pareto: 9 Size: 36 5462044 6435818 5484260 6386302 5488498 6285006 5502622 6242846 5520082 6215464 5527790 6212844 5536864 6208854 5556500 6180892 5557828 6105258 5560916 6087702 5585718 6067392 5602506 6049554 5607700 6003382 5629368 6001370 5661986 5963470 5671440 5958196 5673518 5945960 5692180 5934804 5700026 5900610 5700538 5877378 5720530 5864594 5720804 5811566 5805576 5782574 5821954 5768060 5883228 5722900 5927952 5713414 5928762 5686332 5949524 5671262 6022138 5649370 6073150 5627932 6083922 5620382 6189274 5616004 6192004 5602090 6202578 5583326 6205034 5555302 6236032 5541288 # start_trial(10) : # end_trial(10) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.736 s # Pareto: 10 Size: 31 5464096 6302030 5512218 6157876 5539916 6137688 5540734 6109298 5591870 6107332 5594846 6081628 5609524 6056874 5612712 6016244 5635752 6008636 5643372 5967030 5672520 5958904 5673058 5919582 5698226 5915150 5736220 5870434 5747934 5865668 5782542 5832806 5783226 5805662 5825482 5786756 5833726 5774638 5863254 5740006 5900318 5732572 5912698 5680052 5958580 5673376 5974446 5670744 5996902 5641786 6018904 5628254 6068804 5618760 6134070 5617998 6147618 5611076 6154364 5585526 6231908 5570114 # start_trial(11) : # end_trial(11) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.708 s # Pareto: 11 Size: 35 5478162 6302532 5492580 6272064 5514554 6249728 5521940 6236398 5523922 6222574 5526614 6161368 5559890 6123700 5563894 6033748 5597430 6006592 5612680 5986774 5624044 5931842 5664846 5921454 5712834 5878164 5731736 5861610 5751760 5845224 5759554 5804516 5792678 5802622 5827862 5785862 5828000 5783260 5855824 5759194 5858444 5746108 5865216 5737808 5866704 5731096 5871804 5726804 5956844 5667532 6039342 5635498 6110914 5633938 6111532 5619508 6130620 5615284 6146544 5610928 6165116 5609980 6219808 5599314 6272020 5581332 6306308 5570008 6327900 5562564 # start_trial(12) : # end_trial(12) : Pareto Size = 28, Scalarizations = 100, Elapsed time = 7.548 s # Pareto: 12 Size: 28 5459306 6472574 5478000 6335576 5496942 6330424 5515726 6326626 5518730 6250746 5521632 6149208 5568464 6107872 5570200 6082650 5598276 6075422 5611736 6007338 5617260 6006774 5654824 5973176 5667198 5900706 5709896 5874518 5725116 5837692 5760102 5836974 5772502 5821754 5817124 5786934 5827338 5755606 5841200 5732114 5887968 5729354 5927252 5684720 5935826 5672138 5978816 5659646 6016392 5622784 6073776 5621626 6097370 5581836 6289038 5566690 # start_trial(13) : # end_trial(13) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.772 s # Pareto: 13 Size: 35 5491858 6403678 5492276 6347128 5501992 6321612 5507342 6314246 5508776 6279032 5510304 6163454 5525860 6120256 5554948 6119586 5563934 6106438 5580268 6089920 5590538 6069026 5598274 6048738 5622562 6037658 5624374 6018308 5629954 6010616 5634070 5971220 5670456 5921322 5684026 5918784 5703500 5903930 5736216 5844806 5758852 5828618 5771054 5807936 5824234 5754078 5830534 5747444 5850850 5742776 5858832 5728474 5924410 5717742 5946666 5692180 5973574 5665240 5982892 5645420 6057330 5625640 6132696 5606594 6179432 5583116 6310588 5581560 6357798 5565104 # start_trial(14) : # end_trial(14) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.612 s # Pareto: 14 Size: 36 5473616 6365124 5483300 6313064 5504884 6253696 5507284 6248576 5521370 6221830 5533570 6197372 5535110 6194642 5556436 6135286 5568184 6073172 5596556 6066640 5604918 6048232 5611088 6007282 5613452 5977660 5648454 5957486 5666660 5927316 5691638 5917364 5696656 5881888 5746996 5855012 5781462 5829580 5783374 5827822 5801384 5782180 5802008 5772632 5836906 5745708 5898018 5728342 5914834 5710606 5923260 5694894 5944566 5675980 5989300 5655444 6015852 5654926 6071484 5651702 6085962 5614748 6155170 5605904 6219216 5597388 6229872 5596136 6355788 5585346 6358938 5580490 # start_trial(15) : # end_trial(15) : Pareto Size = 27, Scalarizations = 100, Elapsed time = 7.58 s # Pareto: 15 Size: 27 5451054 6443550 5468206 6292932 5513040 6278006 5519200 6158560 5541188 6144916 5575260 6094414 5584080 6041258 5603840 6032658 5611498 6005860 5670768 5981726 5671922 5901218 5736616 5865220 5743112 5852820 5756044 5814416 5858480 5757432 5859216 5740162 5862256 5736824 5890464 5727424 5925262 5714692 5931186 5702696 5991426 5672862 5996850 5644532 6029484 5632112 6101178 5595104 6150300 5583016 6163900 5571306 6262890 5559534 # start_trial(16) : # end_trial(16) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.868 s # Pareto: 16 Size: 36 5466818 6467160 5484180 6308694 5490738 6278358 5512120 6248044 5523598 6150674 5557638 6093354 5557834 6088440 5578156 6068020 5596418 6041396 5615368 6002640 5629738 6001232 5630074 5987482 5647204 5969202 5675654 5931724 5698938 5862152 5771070 5837874 5792712 5821942 5798774 5821542 5816834 5811922 5837762 5767234 5861694 5766624 5864226 5762180 5877058 5730980 5916290 5709438 5964328 5692998 6004902 5681346 6012366 5680162 6025224 5666758 6030442 5657732 6049238 5626340 6098358 5618936 6112590 5600128 6172164 5598820 6234638 5580636 6276460 5567134 6391042 5560836 # start_trial(17) : # end_trial(17) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 17 Size: 35 5476496 6448550 5484800 6441964 5486666 6326926 5509022 6185866 5526670 6113278 5561814 6102252 5585682 6100740 5605992 6074462 5611434 6000132 5615300 5999414 5618462 5995558 5627828 5993486 5639274 5949160 5680480 5879822 5740488 5837192 5750178 5834752 5815454 5776118 5819886 5774184 5874084 5749848 5882244 5733082 5901402 5725664 5934924 5706842 5941048 5697296 5968522 5689110 5979526 5679058 5987056 5676004 5999960 5671618 6004028 5661610 6065500 5657232 6102992 5628946 6118938 5618594 6156916 5614400 6166074 5599882 6187334 5568340 6291410 5551648 # start_trial(18) : # end_trial(18) : Pareto Size = 39, Scalarizations = 100, Elapsed time = 7.816 s # Pareto: 18 Size: 39 5462092 6578838 5469474 6312478 5470536 6308272 5506202 6202130 5537080 6094448 5575758 6038920 5594824 6012806 5621804 6010540 5622548 6002610 5654616 5965410 5659166 5948048 5659856 5945366 5673952 5943166 5681424 5923854 5711768 5916320 5713990 5895934 5725642 5828812 5748354 5819730 5783182 5816492 5786506 5813720 5842456 5796984 5850396 5783282 5857620 5769208 5864936 5762616 5870328 5747932 5873652 5727540 5946020 5693944 5972542 5688728 5983342 5650576 6017740 5649586 6022766 5639208 6074832 5609498 6144096 5609100 6197054 5607916 6205762 5586168 6254604 5584254 6313180 5576628 6372986 5574362 6389744 5571078 # start_trial(19) : # end_trial(19) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.78 s # Pareto: 19 Size: 30 5477962 6305670 5502112 6303922 5518518 6285740 5525556 6240952 5529618 6174678 5572690 6112580 5583130 6105584 5592230 6066632 5601494 6052948 5632598 5993334 5635970 5952384 5653452 5950026 5656292 5924886 5688570 5892638 5728464 5864952 5768474 5819182 5792722 5795344 5810534 5775870 5823686 5753896 5826790 5748290 5901464 5711600 5953112 5694464 5964726 5681660 5993236 5633966 6091666 5620806 6161836 5619102 6187506 5594304 6207150 5573984 6329262 5572274 6444050 5571240 # start_trial(20) : # end_trial(20) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 20 Size: 32 5476994 6413058 5487532 6345980 5497006 6334266 5498226 6310770 5502026 6298096 5502806 6249656 5525448 6234870 5536278 6199468 5540218 6178268 5553554 6176648 5555558 6126162 5586254 6119268 5587004 6095478 5599208 6053264 5605482 5956758 5693504 5946334 5719632 5942226 5721290 5875510 5768950 5818234 5774276 5789072 5805764 5769564 5820410 5760244 5872976 5741360 5911662 5709442 5942788 5699226 5959804 5670764 6007238 5654574 6045790 5622638 6123814 5619560 6188898 5593504 6212412 5571680 6366708 5565044 # start_trial(21) : # end_trial(21) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 21 Size: 36 5471336 6315342 5491628 6284588 5501326 6277322 5502674 6262448 5508838 6254442 5513624 6227666 5535670 6176916 5538978 6162688 5548068 6134918 5552816 6126506 5563438 6099144 5586172 6060446 5600224 6032344 5635182 5999762 5660892 5940974 5699962 5897722 5708900 5857856 5769490 5840154 5787466 5817440 5804206 5813018 5826076 5772564 5827764 5771020 5831912 5761062 5847890 5757042 5867020 5714660 5982128 5681038 6001028 5672288 6010194 5666498 6045448 5663608 6050148 5658530 6052004 5652818 6084784 5618548 6155900 5590124 6259082 5586160 6349080 5580132 6415522 5571378 # start_trial(22) : # end_trial(22) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 22 Size: 34 5480036 6476354 5482270 6326440 5491422 6275512 5505634 6240896 5519850 6221902 5527274 6218344 5541714 6188026 5565924 6045534 5609560 6042750 5619128 6020164 5631696 5988372 5659906 5964766 5662036 5960206 5665044 5947768 5683374 5890356 5715530 5875230 5742592 5849416 5752076 5843532 5776004 5823888 5803218 5788098 5858410 5750908 5900096 5734998 5905468 5727668 5910454 5725540 5948994 5662558 6029008 5658500 6066820 5654874 6067114 5623270 6097022 5617182 6128324 5611634 6180012 5608960 6189356 5602644 6239140 5568314 6244782 5565176 # start_trial(23) : # end_trial(23) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.668 s # Pareto: 23 Size: 35 5477242 6497954 5485042 6418628 5488040 6388640 5498664 6385192 5499852 6361860 5504184 6343310 5504698 6224208 5521574 6149532 5543222 6098508 5577962 6089138 5593958 5998976 5626292 5972690 5668196 5941802 5688920 5937596 5700628 5910000 5730530 5897624 5735462 5852836 5754254 5848404 5759728 5832682 5763328 5822410 5773490 5803096 5839716 5770870 5877774 5768684 5885802 5698244 5966396 5685326 5974018 5673048 6001706 5658124 6013834 5649982 6031780 5643234 6073592 5622762 6080262 5621646 6111294 5591928 6210600 5580586 6278276 5572274 6359836 5571896 # start_trial(24) : # end_trial(24) : Pareto Size = 40, Scalarizations = 100, Elapsed time = 7.68 s # Pareto: 24 Size: 40 5483734 6527794 5484548 6401346 5489654 6362178 5500958 6348516 5505038 6288340 5507650 6253554 5514452 6205286 5527924 6173394 5553540 6154908 5563394 6124660 5570452 6037498 5621038 5981702 5629386 5969184 5662568 5938110 5674806 5938020 5680216 5915034 5703292 5884440 5741838 5833770 5771504 5824890 5780040 5816532 5797864 5805076 5810398 5788146 5813636 5762580 5836414 5750126 5883484 5745130 5898980 5698260 5931390 5697906 5958732 5685018 5965588 5682380 5979396 5677592 5995504 5672166 6033678 5668602 6047856 5643420 6102928 5614184 6126138 5605970 6132790 5601730 6182082 5583418 6231718 5583088 6261116 5578752 6393790 5558642 # start_trial(25) : # end_trial(25) : Pareto Size = 28, Scalarizations = 100, Elapsed time = 7.868 s # Pareto: 25 Size: 28 5479152 6370306 5483326 6346230 5485092 6251692 5517202 6222060 5535384 6178272 5536120 6170102 5536752 6143918 5554910 6108976 5567966 6106792 5569914 6051718 5605876 6040696 5641924 5993790 5661286 5968578 5662206 5967642 5673364 5935440 5716222 5855508 5773588 5831476 5785820 5823902 5823924 5749578 5849948 5739752 5944590 5683332 5994348 5671270 6017810 5634482 6109146 5634340 6117362 5595428 6208684 5586720 6269642 5571504 6271632 5552066 # start_trial(26) : # end_trial(26) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.652 s # Pareto: 26 Size: 30 5482234 6406148 5498040 6340538 5502866 6197636 5530488 6185752 5543008 6165486 5559882 6143190 5573468 6130378 5575658 6129774 5576584 6044426 5649386 5949764 5654956 5944032 5687204 5901440 5695532 5893306 5733938 5836310 5775554 5791398 5814190 5755000 5845614 5742466 5879506 5720208 5900890 5718980 5904184 5693338 5970758 5677364 6002442 5676588 6004862 5643736 6027296 5634274 6129564 5615078 6160288 5613492 6204154 5603138 6249170 5595702 6258006 5587184 6289434 5578930 # start_trial(27) : # end_trial(27) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 27 Size: 35 5449790 6360588 5497376 6317394 5509168 6243800 5515094 6221302 5517326 6213532 5543098 6150386 5569186 6098304 5575970 6095022 5583952 6042126 5612434 6036164 5617618 6027198 5619280 5993738 5628856 5992568 5654492 5947008 5691142 5916532 5693644 5910702 5705094 5872634 5744078 5846660 5758548 5830634 5794420 5805406 5801654 5788142 5864826 5726540 5877074 5726028 5919900 5710778 5929708 5692868 5931392 5681482 5947286 5674014 6002630 5630226 6087886 5623256 6145286 5612586 6146552 5612552 6155652 5609596 6179356 5600760 6190666 5574378 6318134 5567528 # start_trial(28) : # end_trial(28) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 28 Size: 31 5471220 6468532 5482532 6395690 5486656 6314146 5501106 6302906 5512580 6271016 5528464 6207280 5530358 6201316 5532944 6171108 5565482 6157722 5571040 6087264 5580004 6084082 5614482 6034960 5615832 5989788 5646232 5984510 5676516 5889250 5705932 5868272 5763350 5860400 5775828 5802802 5841996 5777068 5891626 5743364 5916262 5718944 5935150 5706706 5961250 5685776 5981954 5670504 6018184 5670042 6033064 5654170 6050652 5599726 6175722 5598556 6279254 5595090 6332050 5587276 6465206 5564530 # start_trial(29) : # end_trial(29) : Pareto Size = 37, Scalarizations = 100, Elapsed time = 7.596 s # Pareto: 29 Size: 37 5476436 6408608 5478444 6387120 5482118 6350128 5493142 6246986 5508674 6244768 5524268 6228466 5527382 6215856 5531182 6180854 5553874 6119424 5572456 6101534 5578762 6069204 5602250 6026392 5651678 6010604 5655438 5960172 5669662 5941576 5703622 5888538 5726340 5875696 5735524 5841520 5783990 5827008 5801634 5814228 5833744 5780676 5839964 5779752 5855850 5766676 5858106 5754604 5865518 5732046 5883178 5726642 5889742 5711072 5926030 5697440 5941092 5686218 5981268 5664032 6020892 5649144 6053788 5638612 6085058 5623378 6158830 5610796 6184890 5582856 6197438 5580976 6206466 5579856 # start_trial(30) : # end_trial(30) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.572 s # Pareto: 30 Size: 33 5475416 6416414 5494808 6322584 5494898 6277040 5507310 6249028 5510056 6224506 5545328 6170464 5549950 6140024 5556222 6098820 5564384 6082464 5582810 6056022 5605832 6052350 5611844 6010136 5630012 5988642 5637806 5970850 5650776 5954760 5670672 5933222 5689326 5906660 5729392 5896104 5747050 5831224 5763440 5822956 5785838 5813370 5796866 5811936 5825328 5715716 5924600 5680902 5967970 5675118 5981970 5657248 6022560 5627144 6122836 5615908 6173136 5609690 6174692 5598520 6229418 5590962 6270800 5589716 6284222 5565580 # start_trial(31) : # end_trial(31) : Pareto Size = 38, Scalarizations = 100, Elapsed time = 7.904 s # Pareto: 31 Size: 38 5466502 6446336 5467992 6390878 5479664 6362974 5492064 6326966 5492484 6322866 5499922 6291382 5504254 6167980 5556712 6164764 5558676 6126026 5563106 6117316 5572622 6083426 5591680 6053926 5606676 6005232 5649200 5973054 5649594 5903672 5682254 5896098 5733892 5875122 5738722 5867076 5767500 5843076 5800616 5783878 5823378 5762688 5833484 5754320 5850344 5737568 5873752 5726626 5970470 5675280 6006328 5671568 6006754 5651258 6013652 5649844 6057966 5647930 6087738 5613908 6159902 5607402 6173798 5605132 6175228 5603782 6187338 5600156 6200572 5583828 6204620 5582636 6280986 5573892 6412792 5572106 # start_trial(32) : # end_trial(32) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.544 s # Pareto: 32 Size: 34 5485682 6446206 5494238 6398914 5500454 6391388 5501406 6237808 5520706 6220172 5535056 6127840 5566128 6041192 5642124 5938724 5684194 5914826 5708454 5888878 5732276 5872608 5751898 5843442 5775094 5841756 5784542 5836496 5803668 5801326 5808424 5794892 5825092 5780748 5854922 5755850 5914738 5727130 5921530 5721118 5938180 5714496 5942532 5669070 5964712 5659966 6037352 5653196 6062878 5640288 6091350 5634882 6107326 5621856 6172602 5605134 6189200 5599982 6200210 5593368 6228116 5587244 6233406 5581708 6239380 5567994 6311924 5566262 # start_trial(33) : # end_trial(33) : Pareto Size = 27, Scalarizations = 100, Elapsed time = 7.544 s # Pareto: 33 Size: 27 5478454 6305380 5504670 6261120 5506744 6238540 5508922 6211710 5519682 6167122 5552246 6140320 5552776 6116692 5576682 6088614 5577978 6085384 5590356 6041578 5605824 6019908 5630326 6008634 5648488 5894918 5715008 5881122 5720832 5852380 5767266 5842926 5780832 5806990 5809546 5776604 5838912 5712818 5894558 5712808 5975678 5640822 6044740 5634566 6060504 5615632 6125704 5605784 6170204 5591392 6259054 5586726 6288594 5572586 # start_trial(34) : # end_trial(34) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.944 s # Pareto: 34 Size: 33 5487404 6505136 5488066 6469774 5491100 6468776 5494454 6466944 5496488 6265610 5505678 6203570 5530012 6199960 5540236 6179770 5540758 6120200 5569652 6097142 5594360 6094274 5605600 5987872 5641364 5965428 5642756 5906184 5660574 5904474 5668140 5893668 5714694 5892624 5719186 5857312 5756394 5824572 5800002 5814280 5815284 5788864 5830600 5772410 5845572 5759124 5899410 5739376 5913894 5707548 5932538 5692260 5942804 5650630 6067430 5645978 6099890 5634122 6102370 5615454 6185322 5602756 6229324 5581660 6383824 5575026 # start_trial(35) : # end_trial(35) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.512 s # Pareto: 35 Size: 33 5459624 6428096 5482434 6382876 5482998 6367468 5488694 6355134 5503436 6317548 5510740 6311844 5514852 6123142 5559384 6090636 5578092 6063416 5587144 6045020 5591742 6004966 5658562 5920124 5700632 5903432 5712048 5885158 5721200 5876400 5737732 5873206 5766018 5838690 5786404 5815978 5804348 5782172 5816338 5771742 5873988 5738298 5887378 5736068 5895956 5735474 5902780 5729986 5922248 5716432 5966162 5685622 6014824 5667174 6038912 5648196 6048966 5632480 6104140 5614558 6146154 5609348 6162608 5580476 6261536 5563968 # start_trial(36) : # end_trial(36) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.536 s # Pareto: 36 Size: 31 5477798 6449140 5479438 6395840 5483538 6218896 5514362 6175112 5549712 6164854 5559170 6102538 5593456 6053856 5609602 6020730 5619402 6010464 5631064 5979454 5649360 5912220 5713618 5909768 5714244 5884078 5748984 5845392 5749164 5836510 5750810 5822506 5820888 5767022 5834684 5736210 5860990 5724518 5938544 5708498 5938874 5691396 5981106 5673554 5987936 5667424 6015752 5667104 6043446 5656200 6049822 5640162 6073992 5636398 6087080 5617556 6181176 5614454 6198434 5575140 6346566 5537606 # start_trial(37) : # end_trial(37) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.952 s # Pareto: 37 Size: 31 5483532 6428890 5492880 6370378 5501636 6321612 5504956 6210876 5518638 6202918 5521582 6173098 5540626 6127020 5544388 6116352 5562316 6113500 5580746 6072986 5588580 6059712 5590504 6058282 5593166 6042970 5619372 6019842 5625578 6008600 5640660 5947930 5686584 5892942 5732404 5864002 5733668 5839386 5775534 5829672 5780904 5798060 5803422 5744810 5861676 5735474 5897536 5728874 5929106 5669632 6005956 5664968 6024628 5602998 6136692 5602388 6208558 5589984 6289078 5577538 6340194 5561110 # start_trial(38) : # end_trial(38) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.668 s # Pareto: 38 Size: 32 5475250 6377744 5475538 6300898 5489862 6254860 5514748 6218272 5520354 6201664 5521426 6195350 5522986 6172960 5551334 6075652 5606018 6030684 5614248 6018184 5632198 6006710 5636696 5947192 5688418 5918022 5695524 5895104 5714772 5887822 5733200 5877002 5755204 5855330 5775646 5829228 5804642 5803844 5836288 5778376 5856586 5764250 5864598 5753968 5903266 5723860 5914304 5666354 6011494 5659530 6062182 5635752 6065886 5631876 6102566 5611292 6181224 5584990 6262830 5569638 6319012 5568810 6323814 5559744 # start_trial(39) : # end_trial(39) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.576 s # Pareto: 39 Size: 31 5485454 6435060 5486024 6430600 5489652 6311602 5498668 6236122 5514236 6218510 5522926 6202370 5535544 6148218 5566686 6088756 5583268 6078068 5593026 6036524 5639562 6016236 5640904 5975304 5661706 5974254 5687332 5892614 5722928 5882386 5746072 5865588 5750716 5858940 5772214 5796528 5799536 5776254 5830698 5753610 5849740 5744968 5903734 5703246 5946244 5701550 5960694 5692208 5982448 5680232 6010916 5670600 6026868 5630170 6097832 5589806 6137714 5574058 6241710 5569848 6403462 5540170 # start_trial(40) : # end_trial(40) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.852 s # Pareto: 40 Size: 36 5477070 6381546 5482812 6343942 5497738 6250668 5500700 6195740 5529378 6187972 5547150 6163038 5569934 6106006 5570852 6096484 5578912 6085038 5587420 6074020 5596830 6067552 5630536 5974450 5685806 5954198 5689308 5919094 5708858 5905640 5714196 5871406 5744476 5841532 5755330 5835452 5807046 5800740 5856690 5780370 5870194 5746190 5873514 5738670 5887332 5704492 5922840 5698928 5958844 5684162 5994002 5680112 5999338 5674010 6028500 5659068 6028742 5656484 6050358 5637648 6097612 5617122 6124398 5613534 6160934 5610418 6192978 5591884 6234512 5579598 6310244 5574518 # start_trial(41) : # end_trial(41) : Pareto Size = 26, Scalarizations = 100, Elapsed time = 7.616 s # Pareto: 41 Size: 26 5475788 6343900 5500038 6214932 5515048 6185826 5560590 6165392 5569894 6079136 5593678 6050686 5612714 6033938 5620914 6032792 5628756 6031746 5639846 5985054 5649930 5933230 5675978 5922054 5697432 5898172 5716232 5834492 5796318 5794706 5818138 5785016 5838756 5749064 5860490 5712612 5891766 5710352 5968886 5692592 5991376 5669418 5994528 5630022 6145124 5603974 6173424 5586596 6189704 5572946 6340204 5572896 # start_trial(42) : # end_trial(42) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 42 Size: 30 5449910 6516530 5482336 6285234 5494198 6275156 5517278 6242008 5520934 6195258 5533524 6177806 5547656 6157390 5549098 6125744 5553602 6066752 5575196 6008336 5651312 5908634 5685192 5856062 5734570 5840310 5736886 5832454 5758336 5813940 5792400 5789752 5814488 5778094 5819438 5769344 5838818 5768270 5909692 5742358 5912076 5735228 5926230 5714812 5949448 5697930 6000986 5644570 6023396 5626212 6181120 5614154 6185072 5609036 6205964 5595802 6221808 5579762 6245078 5571658 # start_trial(43) : # end_trial(43) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.784 s # Pareto: 43 Size: 33 5466544 6398522 5494892 6398178 5500882 6389244 5503044 6274974 5510332 6249752 5529086 6226392 5535142 6185054 5560910 6114652 5579180 6074022 5592078 6073948 5607764 6060394 5632582 5996284 5642274 5962336 5648564 5953092 5682002 5915656 5685666 5848800 5758284 5811460 5769494 5796576 5814380 5744926 5914024 5719580 5916174 5704154 5930728 5684998 5958350 5670046 6008908 5669682 6023158 5641284 6025246 5637146 6070770 5625448 6139132 5615990 6149128 5606468 6201750 5599204 6294558 5589954 6318614 5587126 6340804 5574332 # start_trial(44) : # end_trial(44) : Pareto Size = 24, Scalarizations = 100, Elapsed time = 7.66 s # Pareto: 44 Size: 24 5479060 6323906 5493464 6293284 5499438 6235424 5511298 6183474 5550030 6101710 5584136 6095704 5586938 6055862 5597842 6035596 5614492 6032278 5631248 5997120 5641868 5986896 5676934 5938752 5680326 5925988 5689578 5905896 5734814 5859216 5740846 5802592 5826118 5754532 5923466 5720766 5928748 5717000 5975254 5660196 5992186 5638164 5992788 5600498 6162178 5578838 6248430 5576284 # start_trial(45) : # end_trial(45) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 45 Size: 36 5475118 6435982 5483672 6360602 5488830 6325710 5497512 6324620 5507240 6308316 5513970 6241060 5520534 6224638 5526728 6217714 5542800 6104526 5552074 6100120 5569424 6096892 5591314 6073528 5599858 6034512 5614934 6032642 5621298 6014138 5666174 5925372 5691826 5916612 5701216 5911134 5709314 5897524 5719456 5886088 5752630 5818508 5784840 5817870 5797122 5811024 5804720 5785720 5844584 5756382 5850902 5750520 5885502 5749016 5915900 5715688 5922496 5676638 5979614 5669404 6045820 5642966 6076674 5623188 6106024 5607856 6149702 5582174 6219284 5576156 6261486 5573980 # start_trial(46) : # end_trial(46) : Pareto Size = 38, Scalarizations = 100, Elapsed time = 7.696 s # Pareto: 46 Size: 38 5459832 6408776 5469216 6319674 5479890 6306962 5494110 6295862 5517946 6225578 5547424 6191008 5562170 6086730 5577384 6051336 5594298 6025474 5600858 6023876 5625786 6002974 5644394 5930874 5700520 5928518 5723406 5896046 5748694 5875660 5753326 5856656 5763352 5809096 5778430 5804910 5821536 5797864 5822536 5794462 5842722 5757820 5844752 5745514 5869550 5733106 5876388 5730590 5890714 5711660 5969512 5687410 6001494 5668310 6022810 5659440 6056304 5641308 6091630 5641006 6102978 5634714 6109212 5611328 6119456 5603826 6185404 5598770 6217316 5597634 6272906 5578808 6295572 5572830 6343222 5568738 # start_trial(47) : # end_trial(47) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 47 Size: 29 5484310 6379042 5486138 6360170 5486992 6321300 5496824 6219490 5559852 6130070 5572182 6079580 5580334 6029538 5613274 5991612 5649176 5948568 5669118 5919590 5742390 5868550 5746634 5822238 5770774 5805736 5788306 5800650 5819532 5776328 5831498 5742624 5913036 5740578 5924776 5721282 5963520 5692374 5967316 5674742 6014172 5664652 6034278 5641400 6068876 5627842 6089892 5621082 6119434 5618610 6120534 5605902 6188936 5589360 6257844 5579294 6349392 5565004 # start_trial(48) : # end_trial(48) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 48 Size: 33 5491082 6386524 5493906 6343586 5497314 6292866 5513470 6213936 5531342 6151586 5531430 6140404 5562348 6068212 5577260 6061380 5589900 6020722 5636914 6008154 5640672 5992244 5674446 5959134 5692866 5946984 5701910 5913732 5714692 5898344 5727630 5831260 5782382 5822456 5813058 5805122 5814258 5797414 5822176 5782362 5829800 5780682 5852744 5759450 5856840 5729988 5892878 5694074 5950690 5688888 5967508 5682574 5994048 5668698 6042838 5664070 6047582 5636692 6091042 5632098 6129292 5614932 6155284 5612942 6197560 5558300 # start_trial(49) : # end_trial(49) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.632 s # Pareto: 49 Size: 30 5465448 6446206 5489140 6341470 5501118 6254536 5504958 6161898 5537060 6153046 5553206 6124878 5585110 6050368 5595628 6024648 5606686 5992270 5621218 5990642 5627294 5989568 5639182 5959810 5666496 5937446 5692382 5896438 5737860 5862214 5754342 5857330 5764424 5830622 5787838 5812434 5806778 5798016 5867764 5727364 5927634 5712026 5933016 5694848 5970010 5671398 6020376 5669296 6039170 5628094 6100452 5615482 6169532 5608282 6185456 5607208 6222472 5592528 6229510 5579186 # start_trial(50) : # end_trial(50) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.656 s # Pareto: 50 Size: 35 5482536 6484438 5486382 6383442 5494888 6375004 5498638 6366008 5505878 6302736 5507980 6266538 5519780 6221492 5533436 6189274 5544996 6176668 5547756 6120880 5573564 6065846 5590212 6055956 5592864 6030194 5599438 6018218 5653444 5937214 5682358 5934082 5694082 5903272 5728906 5854022 5753912 5843180 5754612 5843072 5776162 5842502 5785916 5832296 5801550 5777502 5841206 5755574 5873810 5720266 5939594 5704020 5970404 5703370 5971668 5669228 5986858 5641268 6054778 5640784 6071500 5599518 6206094 5587078 6211126 5578264 6363800 5578044 6386942 5566400 # start_trial(51) : # end_trial(51) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 51 Size: 33 5473900 6306782 5492668 6290774 5514266 6255358 5525906 6238542 5531872 6222688 5536516 6182360 5544354 6159038 5550416 6127194 5569964 6095024 5577066 6049856 5605162 6043336 5613238 5988306 5632244 5983986 5662582 5972414 5681626 5965748 5693864 5879098 5733868 5838766 5748158 5828796 5776908 5827862 5783094 5822980 5808916 5793698 5809664 5734706 5863222 5712246 5927686 5673136 5946256 5671578 5970828 5657994 6025730 5651436 6057090 5629444 6154010 5616490 6206366 5609928 6217848 5607660 6220852 5567010 6305566 5553868 # start_trial(52) : # end_trial(52) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.72 s # Pareto: 52 Size: 32 5465582 6334692 5514064 6298536 5516134 6291048 5517348 6246566 5519528 6204940 5544126 6146500 5551202 6137672 5553666 6098906 5577814 6050592 5591588 6028120 5611218 5987740 5642512 5943294 5671352 5934848 5687966 5920742 5702130 5913216 5710238 5879108 5721414 5849820 5785902 5811580 5807766 5781618 5828404 5768192 5857666 5740376 5890242 5739180 5905764 5709286 5929448 5694686 5958946 5678406 5984364 5678398 6038550 5658558 6041636 5626112 6108950 5619228 6128228 5603840 6197698 5581078 6212080 5553028 # start_trial(53) : # end_trial(53) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.492 s # Pareto: 53 Size: 35 5461758 6354910 5507614 6306068 5513990 6228168 5527168 6183450 5529878 6180878 5534110 6173238 5538502 6152568 5543270 6150364 5569552 6114430 5580796 6095670 5621222 6000686 5634532 5942304 5670136 5941092 5671702 5933650 5687848 5930930 5705334 5926130 5708458 5906222 5714344 5898926 5737438 5846956 5761212 5840394 5770126 5808552 5806014 5781338 5848990 5738746 5860300 5729208 5936070 5706296 5944572 5701130 5961870 5666448 6008794 5654194 6028188 5649442 6079262 5640324 6095334 5596232 6197090 5592236 6215328 5588596 6242372 5572768 6357064 5564270 # start_trial(54) : # end_trial(54) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.652 s # Pareto: 54 Size: 30 5476094 6433316 5483426 6314992 5502966 6294214 5504902 6280768 5520120 6272690 5520528 6215190 5525134 6198244 5532710 6173442 5558176 6162014 5586534 6068136 5601054 6009172 5659266 5974862 5660480 5962366 5665228 5926736 5669768 5910518 5704168 5884704 5738140 5869620 5744728 5826492 5802342 5824774 5822850 5804588 5842134 5777860 5849472 5754478 5867686 5734400 5921346 5726214 5924528 5720734 5941594 5671454 6017414 5604048 6175234 5586422 6199182 5585184 6253850 5560294 # start_trial(55) : # end_trial(55) : Pareto Size = 25, Scalarizations = 100, Elapsed time = 7.812 s # Pareto: 55 Size: 25 5488754 6289834 5517316 6221554 5544086 6110098 5572992 6064846 5592800 6037538 5603214 5962172 5666690 5961082 5670690 5891274 5698994 5861472 5799914 5836116 5807160 5822120 5819888 5793938 5822312 5783658 5851266 5757120 5851538 5755058 5860062 5754402 5894798 5717536 5914660 5715168 5952240 5687042 5977674 5625162 6083192 5619602 6086204 5609238 6159308 5597580 6228456 5583054 6280858 5569272 # start_trial(56) : # end_trial(56) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 56 Size: 29 5479676 6437812 5481470 6293018 5486382 6264740 5502348 6202546 5540380 6186874 5563558 6142994 5564722 6076506 5595414 6058850 5609668 6026376 5615128 6010608 5629566 5999840 5654198 5995816 5660536 5927498 5687048 5911354 5690870 5899862 5712924 5874582 5738952 5833770 5795016 5798726 5799090 5756814 5866646 5720572 5934432 5709718 5951652 5692570 5975900 5670714 6019450 5636020 6054826 5604562 6147266 5603810 6178412 5600058 6194552 5596482 6265440 5570560 # start_trial(57) : # end_trial(57) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.652 s # Pareto: 57 Size: 31 5475590 6392552 5496646 6385840 5502416 6312538 5512492 6305956 5513304 6300844 5516872 6279942 5517666 6256382 5519348 6210760 5542352 6189176 5559848 6117748 5566582 6074554 5586828 6056692 5630576 6006828 5636506 5985270 5647050 5959454 5671784 5922486 5707360 5879692 5713660 5861914 5742864 5858264 5759316 5830834 5787420 5794878 5855246 5754970 5861428 5744174 5878364 5719470 5905854 5719316 5920926 5682958 6015936 5658294 6019836 5626820 6069554 5613684 6179354 5594306 6194946 5566556 # start_trial(58) : # end_trial(58) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.632 s # Pareto: 58 Size: 35 5463628 6435758 5493832 6377176 5495878 6332872 5503910 6242306 5520388 6237306 5524714 6213296 5543186 6202394 5546880 6153540 5556430 6100964 5575182 6098518 5575988 6066260 5587788 6055584 5629148 6023696 5631898 5966398 5653740 5952296 5654322 5948332 5656800 5947644 5673702 5935672 5692628 5885334 5716390 5885188 5745442 5853790 5767066 5812910 5802510 5812268 5809222 5766224 5850122 5763598 5874236 5726982 5912082 5713672 5940968 5694686 5971890 5655294 6043326 5645048 6044708 5638146 6125448 5627114 6148728 5625298 6149148 5599190 6208316 5563956 # start_trial(59) : # end_trial(59) : Pareto Size = 27, Scalarizations = 100, Elapsed time = 7.74 s # Pareto: 59 Size: 27 5474560 6395858 5485632 6340854 5493612 6283026 5518648 6220456 5523212 6207102 5525282 6145122 5564032 6120030 5632132 6036386 5643022 5940304 5659764 5934556 5682522 5912214 5698902 5888112 5733982 5854008 5749028 5842736 5796530 5807128 5826316 5777658 5838424 5756836 5892372 5696344 6003690 5653228 6005014 5641656 6005830 5636020 6032202 5623862 6160142 5622566 6162520 5604142 6189996 5599888 6263596 5571760 6407352 5567460 # start_trial(60) : # end_trial(60) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 60 Size: 33 5465002 6481596 5471726 6386242 5475780 6350416 5495340 6333646 5496606 6284054 5500628 6262358 5516462 6218108 5543874 6179684 5553436 6125492 5556732 6099658 5565972 6013326 5624886 5992544 5632518 5989712 5648408 5947896 5694898 5904464 5697252 5903338 5703214 5892674 5726304 5874094 5786638 5829746 5791102 5795992 5819300 5788202 5836014 5757148 5878658 5749446 5882628 5714462 5922790 5714298 5939160 5690696 5951404 5684138 5992874 5683158 6033112 5668044 6038378 5655578 6054046 5642378 6101142 5571080 6272468 5566180 # start_trial(61) : # end_trial(61) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.776 s # Pareto: 61 Size: 31 5478014 6266504 5490102 6208560 5539310 6137958 5551192 6104634 5557284 6095580 5568324 6079160 5611712 6012100 5631866 5956536 5661938 5908692 5672572 5908628 5694688 5892876 5741392 5822414 5775330 5807942 5790956 5795942 5822138 5794996 5834468 5775870 5856556 5768892 5860474 5759838 5887966 5740248 5899352 5721566 5931358 5712210 5945898 5702258 5983476 5666820 5998128 5645850 6014776 5633844 6042002 5632744 6123340 5626164 6168380 5621354 6199922 5616446 6204290 5616132 6210686 5567286 # start_trial(62) : # end_trial(62) : Pareto Size = 39, Scalarizations = 100, Elapsed time = 7.656 s # Pareto: 62 Size: 39 5467196 6380972 5480696 6285836 5508440 6280948 5512098 6265504 5529052 6242770 5531436 6212368 5534440 6187688 5540258 6123834 5566330 6092520 5593640 6065944 5605206 6059426 5606172 6024128 5618850 6014730 5623060 5998894 5638146 5990052 5663350 5938828 5667320 5893784 5721574 5889506 5742176 5880520 5749078 5871644 5753716 5853886 5798236 5812098 5807338 5809210 5821828 5798040 5840770 5772150 5884748 5766808 5890018 5720086 5940572 5688688 5968518 5651242 5984036 5650722 6050850 5636620 6091686 5628922 6095026 5627248 6125452 5620382 6137764 5607324 6223024 5594950 6234052 5592622 6247122 5577442 6273898 5548004 # start_trial(63) : # end_trial(63) : Pareto Size = 25, Scalarizations = 100, Elapsed time = 7.752 s # Pareto: 63 Size: 25 5464598 6433504 5479314 6195232 5520246 6189556 5564720 6120956 5572154 6109532 5573878 6085216 5586354 6079084 5587926 6035400 5612456 6014416 5645778 5950708 5694752 5937236 5698946 5879060 5722036 5847706 5774804 5797182 5827270 5768696 5867424 5747028 5915378 5734278 5926418 5698772 5942958 5647022 6052640 5626128 6065970 5623686 6118250 5601708 6169554 5598620 6216494 5597534 6253658 5562602 # start_trial(64) : # end_trial(64) : Pareto Size = 30, Scalarizations = 100, Elapsed time = 7.768 s # Pareto: 64 Size: 30 5480416 6430002 5497642 6308932 5504684 6291132 5508250 6264026 5513720 6225656 5529132 6173266 5569026 6149414 5574664 6049164 5583902 6009752 5610026 6006916 5631626 6004000 5639564 5983696 5678874 5870252 5717584 5845670 5816266 5816450 5842324 5801052 5845742 5741952 5862918 5730330 5917032 5721428 5922132 5712710 5944696 5690776 5988768 5681660 6014352 5655406 6082968 5633684 6127152 5610122 6171776 5600372 6197998 5585344 6209654 5582592 6289272 5574654 6365810 5554740 # start_trial(65) : # end_trial(65) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.62 s # Pareto: 65 Size: 32 5468968 6416326 5473894 6413872 5478708 6359672 5509566 6324538 5519888 6229030 5535054 6155656 5547080 6131462 5555622 6122872 5557256 6051876 5578914 6046260 5591034 6035356 5620608 6009680 5621378 5998942 5628560 5962674 5659194 5960794 5660124 5955340 5702758 5862858 5736144 5836228 5770882 5805096 5799034 5794766 5821592 5787536 5858458 5762098 5883154 5723212 5914300 5715012 5927008 5709166 5993930 5667458 6006110 5650896 6077536 5638750 6086854 5638428 6123248 5595260 6190134 5587674 6262370 5574660 # start_trial(66) : # end_trial(66) : Pareto Size = 40, Scalarizations = 100, Elapsed time = 7.696 s # Pareto: 66 Size: 40 5460312 6455396 5485194 6446408 5486088 6361286 5489370 6318520 5503130 6269836 5514290 6250400 5515332 6232638 5538058 6209352 5559912 6204224 5562796 6188764 5566544 6187856 5573250 6043982 5614976 6024658 5615444 5979136 5656496 5942524 5700424 5916102 5705276 5903028 5710206 5891876 5722846 5887464 5730598 5861410 5746814 5856040 5757448 5849714 5767566 5830988 5845440 5771054 5878100 5752176 5891714 5721954 5911926 5716800 5932518 5709294 5947496 5687160 5960866 5685388 5996914 5631500 6056436 5627746 6080098 5626634 6099822 5622750 6150232 5612714 6192620 5602776 6266676 5586888 6270068 5582348 6279150 5558128 6342958 5556580 # start_trial(67) : # end_trial(67) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.772 s # Pareto: 67 Size: 34 5474326 6366152 5492588 6278742 5509094 6207016 5524606 6166954 5554624 6150784 5555386 6141190 5569738 6059128 5585966 6053380 5610518 6040428 5617212 6034214 5653662 6002842 5658970 5974408 5659770 5967658 5673704 5958434 5713352 5869128 5737160 5865224 5752826 5841926 5767224 5808946 5788948 5792242 5835676 5746252 5891080 5744034 5904024 5718622 5914598 5718044 5945526 5711244 5967078 5683126 6001924 5626390 6076432 5624870 6077846 5622806 6114414 5594144 6210244 5591450 6250620 5585020 6307642 5583608 6345226 5580304 6348212 5566984 # start_trial(68) : # end_trial(68) : Pareto Size = 27, Scalarizations = 100, Elapsed time = 7.556 s # Pareto: 68 Size: 27 5478144 6386570 5480602 6316160 5494104 6300192 5504632 6276120 5519338 6141838 5550926 6109398 5568038 6079246 5594164 6054912 5648794 5981578 5649230 5947530 5658452 5894642 5708012 5891554 5725818 5883704 5751074 5864036 5756144 5830636 5818564 5766794 5833628 5742800 5893246 5728638 5897330 5686612 5940300 5669152 6007128 5626774 6020918 5617026 6065418 5611522 6096224 5611292 6168874 5603574 6243156 5590408 6301192 5575534 # start_trial(69) : # end_trial(69) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.76 s # Pareto: 69 Size: 32 5462164 6326248 5493272 6268156 5500850 6250046 5513754 6165380 5529280 6159240 5556446 6108636 5560924 6035666 5588718 5999508 5638334 5988908 5645030 5956136 5661456 5919796 5693514 5894028 5716484 5890480 5733426 5881628 5743726 5865062 5759258 5838596 5781224 5834014 5790256 5818888 5804706 5766310 5866478 5763562 5887718 5759004 5899744 5720306 5945328 5711806 5956892 5689300 5973974 5672676 5998092 5664422 6000588 5639134 6055536 5611596 6098306 5588816 6230818 5576472 6248562 5573362 6281978 5559922 # start_trial(70) : # end_trial(70) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.76 s # Pareto: 70 Size: 33 5460488 6376946 5475854 6375954 5476742 6371592 5483396 6289832 5494000 6230376 5548262 6145442 5569090 6088144 5582598 6067448 5598258 6040850 5611322 6036368 5617756 6011762 5628356 5969168 5647338 5951336 5655196 5942924 5697968 5939436 5700732 5896864 5702126 5894774 5718602 5858108 5806704 5789130 5838344 5769304 5847930 5758542 5860372 5725820 5890348 5712226 5948644 5692946 5961364 5684734 5987864 5655952 6036252 5649258 6067076 5616728 6102244 5616056 6127454 5609570 6184582 5601708 6215272 5583090 6284624 5549508 # start_trial(71) : # end_trial(71) : Pareto Size = 24, Scalarizations = 100, Elapsed time = 7.516 s # Pareto: 71 Size: 24 5477050 6368730 5496064 6302016 5511026 6191364 5537332 6181492 5558910 6049000 5595612 6000040 5604978 5958782 5657480 5954070 5680468 5920228 5709970 5860932 5732868 5857062 5799344 5796030 5821460 5770744 5903834 5723802 5947286 5722244 5954578 5715440 5958462 5696148 5964788 5688712 5977614 5663108 6036718 5648022 6086988 5619322 6159792 5586920 6281410 5571362 6350686 5555832 # start_trial(72) : # end_trial(72) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.736 s # Pareto: 72 Size: 34 5464700 6528474 5494030 6365644 5497884 6364816 5506114 6287852 5510136 6177998 5558264 6170106 5562792 6130864 5567458 6129952 5581514 6027454 5642412 6021406 5648010 5974468 5648074 5948162 5668926 5934700 5691300 5928346 5705032 5907740 5708996 5892790 5728262 5859518 5770600 5856878 5783014 5798798 5811002 5790604 5846830 5757568 5854592 5739936 5864218 5724214 5864468 5714328 5900992 5710292 5928934 5679442 5986358 5659972 6068092 5659494 6075854 5641458 6078988 5615526 6139468 5584168 6247416 5579168 6292324 5571072 6371470 5560498 # start_trial(73) : # end_trial(73) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.696 s # Pareto: 73 Size: 36 5475354 6428650 5492354 6412808 5493112 6315752 5494502 6310200 5500148 6290090 5506010 6286846 5509772 6285310 5513906 6182430 5551778 6135510 5555884 6095296 5582484 6091306 5595490 6077298 5602656 6014700 5648124 6000972 5650464 5967160 5669052 5953112 5670646 5946260 5682828 5914092 5710486 5898436 5725500 5888806 5746250 5860008 5784674 5817514 5789888 5807358 5800810 5796596 5806472 5784220 5830384 5759894 5846130 5758728 5856984 5746700 5866114 5741468 5907168 5687796 5983862 5637696 6083856 5626600 6123866 5608032 6152220 5603716 6184010 5572320 6252368 5553498 # start_trial(74) : # end_trial(74) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.5 s # Pareto: 74 Size: 29 5454154 6463634 5490482 6282716 5507430 6203042 5525664 6195938 5540138 6154536 5550310 6150052 5555274 6125872 5560874 6079382 5569198 6045718 5607422 6038550 5636962 5983844 5642336 5975832 5652444 5927128 5735734 5848664 5748102 5812906 5779328 5801092 5832650 5770534 5854048 5768894 5901040 5728146 5920890 5723210 5928800 5688076 5944940 5667148 5973364 5654914 6005632 5645312 6024968 5633952 6075024 5608716 6137686 5594256 6196836 5572740 6280456 5572398 # start_trial(75) : # end_trial(75) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.712 s # Pareto: 75 Size: 29 5469320 6413766 5476664 6409962 5476752 6344036 5493608 6272722 5497662 6257606 5517822 6151994 5551722 6130880 5552108 6052844 5594272 5990304 5644854 5946152 5649874 5935164 5659802 5934086 5713994 5853522 5740628 5852042 5756532 5838868 5785756 5800532 5803948 5798618 5858910 5772604 5876450 5707804 5930692 5685390 5992166 5679078 5995522 5668404 6008038 5661294 6053902 5645906 6098416 5632788 6126910 5618764 6179134 5593046 6182950 5572012 6204816 5563138 # start_trial(76) : # end_trial(76) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.676 s # Pareto: 76 Size: 34 5485454 6457760 5490278 6425434 5496350 6363018 5504224 6347428 5509346 6246268 5510024 6204636 5542410 6157966 5555312 6134106 5574338 6111522 5576086 6093956 5592650 6040736 5614938 6010262 5636254 5980340 5662868 5967978 5663018 5950036 5699772 5899562 5746614 5881552 5762454 5850176 5779156 5829832 5810850 5796826 5813916 5775132 5855002 5770966 5866798 5731968 5910590 5723422 5921904 5713752 5960506 5700622 5991638 5651668 6028356 5637228 6030256 5632244 6041986 5630364 6113500 5630196 6141200 5598376 6165000 5593184 6201016 5572696 # start_trial(77) : # end_trial(77) : Pareto Size = 38, Scalarizations = 100, Elapsed time = 7.752 s # Pareto: 77 Size: 38 5457332 6472052 5463250 6465554 5492578 6433362 5495374 6404182 5497694 6389902 5503620 6279632 5522874 6213106 5534812 6119696 5567332 6118510 5581080 6105466 5585810 6090602 5590604 6058546 5613984 6008124 5630320 5990814 5655980 5919318 5709902 5883394 5716624 5870026 5718188 5867890 5748298 5857288 5759822 5847998 5781916 5830180 5797136 5797480 5803610 5774140 5819014 5772860 5869860 5750884 5910642 5732208 5919896 5719290 5948116 5692580 5976216 5691448 6011812 5673134 6016342 5651190 6044002 5647936 6045602 5643342 6060924 5637302 6120606 5627390 6151504 5601452 6158362 5587806 6292446 5568816 # start_trial(78) : # end_trial(78) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.712 s # Pareto: 78 Size: 34 5466760 6424150 5486570 6358408 5496328 6251850 5507966 6207070 5538576 6197792 5540448 6151818 5573850 6130996 5577414 6028200 5623756 6007464 5627028 5997708 5660830 5979958 5698982 5939244 5708464 5863078 5747712 5855476 5762550 5854562 5773828 5835946 5801048 5770534 5821072 5765568 5826420 5759610 5854580 5745830 5886406 5735420 5903926 5732624 5919406 5714160 5919936 5707882 5930188 5702068 5947074 5701950 5971972 5695808 5982642 5667218 5989786 5646078 6114206 5645430 6128468 5613694 6191580 5607954 6241338 5575578 6285960 5574114 # start_trial(79) : # end_trial(79) : Pareto Size = 27, Scalarizations = 100, Elapsed time = 7.668 s # Pareto: 79 Size: 27 5477608 6266028 5531226 6194430 5558090 6072452 5598192 6046802 5603098 6015034 5643622 6012640 5644792 5993296 5657300 5941226 5666666 5927446 5708164 5889838 5741788 5843090 5760798 5840538 5778022 5839144 5795184 5801838 5823474 5789936 5833330 5735302 5917660 5726694 5934152 5698864 5989192 5687436 6005958 5687104 6010156 5670866 6074080 5646166 6085256 5637208 6110700 5637028 6156796 5595204 6178540 5594264 6285250 5573688 # start_trial(80) : # end_trial(80) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 80 Size: 33 5484550 6296790 5501980 6250060 5536196 6240260 5541362 6205240 5541438 6165416 5551132 6129872 5552132 6121310 5575334 6092282 5608132 6075904 5626750 5982336 5638410 5962100 5659738 5953504 5670816 5943354 5675406 5938252 5730474 5862478 5751904 5850722 5767092 5812378 5783844 5811702 5806452 5789178 5840184 5748572 5855366 5745252 5858754 5738906 5864798 5715150 5931962 5682592 6023668 5673082 6030068 5662576 6034838 5636752 6055784 5625196 6065512 5622464 6090672 5618150 6134732 5577598 6174120 5574486 6405922 5570848 # start_trial(81) : # end_trial(81) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.668 s # Pareto: 81 Size: 32 5479556 6401858 5490974 6346594 5497086 6342958 5506234 6272450 5507896 6202660 5538256 6179988 5542550 6168978 5543022 6130280 5545570 6057578 5600884 6019664 5615556 5972382 5678142 5918534 5731154 5869220 5731310 5837040 5757318 5811240 5783494 5797412 5817264 5758798 5866226 5753088 5868654 5733232 5929392 5727280 5945526 5717364 5962684 5697994 5994588 5655680 6002862 5652496 6039354 5649900 6073812 5645452 6091406 5626556 6110612 5614342 6147080 5608024 6172822 5601292 6198872 5594660 6244744 5553408 # start_trial(82) : # end_trial(82) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.744 s # Pareto: 82 Size: 34 5450774 6355332 5502830 6333424 5506844 6215278 5516598 6161452 5550216 6105516 5577040 6074582 5594858 6068866 5611082 6040320 5621096 5991496 5635604 5954942 5657288 5934346 5668096 5915012 5674910 5909194 5701736 5888328 5731676 5867370 5747516 5864422 5749506 5864198 5784302 5862896 5804278 5750166 5877810 5733586 5897858 5730572 5922752 5666958 5978834 5663910 6042562 5621662 6127756 5620990 6167402 5620448 6174568 5619214 6203782 5603438 6214744 5586712 6260106 5585622 6274560 5582412 6292894 5579422 6424528 5578156 6426450 5574884 # start_trial(83) : # end_trial(83) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 83 Size: 36 5484916 6490198 5485380 6357510 5486158 6354978 5506648 6306774 5509232 6262638 5518992 6235320 5532928 6200430 5538346 6180924 5568474 6102010 5568886 6053768 5604734 6004012 5676476 6001830 5680432 5966746 5684930 5893274 5732012 5859578 5755254 5849998 5758994 5836484 5780178 5827126 5780574 5802660 5809820 5787846 5813150 5755648 5813922 5746896 5901900 5721820 5917758 5713152 5938866 5711054 5987556 5704374 6001412 5682720 6003050 5656158 6010190 5639552 6067416 5617434 6149754 5602372 6185772 5601288 6234162 5587678 6250372 5582706 6256430 5577854 6282260 5574858 # start_trial(84) : # end_trial(84) : Pareto Size = 32, Scalarizations = 100, Elapsed time = 7.848 s # Pareto: 84 Size: 32 5478414 6434548 5481166 6364116 5484838 6330386 5496326 6269364 5497460 6237296 5504690 6141556 5560356 6073008 5611766 6036910 5615836 6023610 5621112 6020356 5624360 5965030 5668130 5948442 5715556 5895336 5716222 5892758 5738906 5852844 5755186 5839820 5764148 5836232 5771532 5818832 5789146 5816826 5800768 5797998 5824732 5750144 5837044 5748828 5859698 5714680 5938126 5704064 5972652 5693166 5989828 5681108 6011770 5659588 6041192 5639586 6081320 5632536 6118328 5608508 6137470 5607698 6186584 5555540 # start_trial(85) : # end_trial(85) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 85 Size: 31 5492002 6356810 5510636 6315778 5512620 6272458 5523502 6229110 5531266 6173464 5533880 6152750 5543686 6146102 5568222 6142252 5583458 6100886 5585340 6080166 5596238 6028546 5613604 5972168 5658212 5957780 5695940 5925982 5710222 5873394 5726434 5865926 5756648 5855220 5779380 5797216 5828270 5747234 5857456 5732762 5934696 5708502 5938484 5686452 5950990 5678766 5969558 5669858 5986760 5649182 6089080 5633912 6092226 5613798 6161880 5605934 6191952 5596878 6254916 5579912 6348614 5560784 # start_trial(86) : # end_trial(86) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.672 s # Pareto: 86 Size: 34 5467992 6460600 5485956 6431882 5493690 6242948 5501798 6191070 5527026 6169682 5528344 6157654 5546316 6105380 5596484 6025462 5635058 6009536 5635466 5984054 5641666 5966840 5669264 5956824 5684830 5928248 5699020 5923320 5700662 5908786 5726628 5855506 5779488 5834870 5798046 5804238 5799994 5795828 5844930 5746740 5863204 5730040 5904156 5725124 5909916 5705614 5930010 5701756 5936064 5688028 5981844 5679594 6022790 5664102 6023120 5661508 6034532 5643226 6076010 5636052 6141616 5631280 6175982 5613500 6185426 5582092 6282026 5568500 # start_trial(87) : # end_trial(87) : Pareto Size = 36, Scalarizations = 100, Elapsed time = 7.744 s # Pareto: 87 Size: 36 5477868 6402504 5484038 6369776 5500272 6295844 5509032 6286762 5516594 6211524 5523046 6187678 5546248 6156344 5555622 6147466 5565362 6070788 5591052 5983940 5642976 5962358 5669520 5950046 5675326 5935904 5678956 5933120 5679234 5910174 5731778 5876686 5746626 5869874 5763798 5835370 5774308 5778494 5839544 5772228 5847444 5761462 5854476 5756002 5880572 5712630 5902336 5695162 5925706 5683686 6029612 5669968 6036112 5668252 6038226 5650758 6040592 5634452 6079842 5620674 6082504 5615660 6131882 5607626 6193996 5606958 6221784 5585044 6226832 5583928 6267376 5583178 # start_trial(88) : # end_trial(88) : Pareto Size = 39, Scalarizations = 100, Elapsed time = 7.532 s # Pareto: 88 Size: 39 5478502 6455180 5489624 6357202 5502980 6274552 5520670 6216434 5542428 6188520 5547494 6179898 5557326 6128350 5568362 6074636 5583444 6065346 5595070 6053994 5597690 6046056 5598556 6014236 5621040 6002436 5625270 5996342 5634800 5974538 5666780 5943458 5677052 5943040 5707670 5911918 5713348 5909462 5727838 5865768 5744836 5826468 5786864 5819318 5818636 5798848 5819064 5757242 5867828 5727800 5875558 5721140 5916660 5716878 5965090 5690586 5971102 5663550 5993214 5648954 6017590 5640812 6039894 5635080 6074396 5623534 6098116 5617278 6119242 5613406 6153124 5609856 6213302 5605230 6240364 5592238 6242472 5557638 # start_trial(89) : # end_trial(89) : Pareto Size = 31, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 89 Size: 31 5492868 6372508 5498000 6349406 5499460 6328618 5514610 6224580 5523450 6106236 5572332 6079432 5580320 6058278 5623744 5981496 5660204 5941678 5661856 5940074 5664574 5904306 5687846 5874830 5746160 5822646 5806948 5771464 5845066 5755704 5859586 5737584 5902990 5703952 5924102 5702816 5934300 5689414 5962278 5668826 5966988 5652952 6037698 5648504 6067304 5644022 6074192 5636494 6148580 5621472 6171714 5612452 6180706 5610632 6209804 5598016 6266866 5583188 6319068 5578258 6377948 5578114 # start_trial(90) : # end_trial(90) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 90 Size: 29 5461890 6365418 5471918 6284820 5520614 6126610 5544470 6112240 5553856 6094568 5568496 6094058 5619650 6052870 5627762 6033048 5630194 6005252 5632438 5987852 5651960 5965342 5664680 5936712 5702694 5901038 5726144 5890590 5744134 5840830 5748428 5828234 5784032 5792330 5811624 5785416 5822858 5773158 5836774 5746830 5911874 5709780 5921928 5691824 5998810 5631104 6118756 5611290 6142242 5604518 6170318 5599014 6189284 5585728 6222258 5583934 6318166 5580420 # start_trial(91) : # end_trial(91) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 91 Size: 35 5479298 6390798 5483110 6340550 5494330 6280942 5504162 6212488 5534456 6165674 5535464 6097710 5587672 6024282 5597922 6017520 5629768 6004796 5636122 5961282 5655352 5941540 5676766 5930782 5703544 5885300 5747628 5837828 5785074 5824332 5794288 5821172 5800380 5803052 5815522 5791354 5821528 5777740 5855644 5744198 5891992 5712080 5941750 5706242 5966160 5689150 5980366 5670542 6050018 5669268 6080686 5649892 6083820 5611670 6176510 5605986 6177688 5601468 6207396 5594764 6290970 5594036 6297972 5587504 6303572 5574554 6318440 5569656 6322616 5567350 # start_trial(92) : # end_trial(92) : Pareto Size = 37, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 92 Size: 37 5478730 6463030 5486662 6358724 5502362 6311094 5525386 6210170 5533384 6191092 5540184 6182408 5556486 6126910 5564586 6085588 5577552 6085436 5610078 6020540 5621150 6010578 5638802 5982966 5644612 5979140 5667176 5951924 5667502 5937994 5692334 5918000 5692384 5895974 5706642 5887416 5724840 5874878 5770594 5824382 5796292 5804600 5814546 5743420 5866490 5727344 5899236 5727032 5921676 5723326 5921872 5694282 5966352 5687830 6022984 5668028 6036764 5667210 6043222 5665306 6046488 5649166 6054362 5634366 6064540 5633006 6075394 5599924 6224800 5588636 6244632 5584730 6296342 5575304 # start_trial(93) : # end_trial(93) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 93 Size: 29 5488044 6368944 5497632 6332378 5505636 6307722 5507432 6208806 5537302 6203454 5542134 6191844 5545672 6139488 5552012 6131764 5563816 6102846 5600206 6047434 5601348 6029668 5608536 5963940 5659096 5901810 5703288 5889904 5732212 5856916 5772226 5790646 5796404 5782722 5827702 5778434 5890554 5736930 5918972 5724142 5920334 5690778 5969474 5663226 6004396 5654202 6017904 5651548 6070660 5635136 6109818 5609858 6170324 5603706 6197912 5582900 6207254 5558988 # start_trial(94) : # end_trial(94) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 94 Size: 29 5468278 6252672 5521376 6147712 5560310 6145348 5575182 6059770 5594380 6047532 5620586 6025686 5634978 6020182 5664476 5999782 5671140 5955710 5699546 5918278 5700266 5885362 5727056 5862408 5738412 5831472 5794722 5821708 5798286 5799110 5872958 5737996 5911908 5701386 5985418 5677294 5994882 5677194 6013672 5652562 6049848 5648886 6065046 5624074 6106140 5622212 6135230 5613854 6143734 5609516 6171870 5608704 6172076 5606442 6234782 5588148 6292986 5585394 # start_trial(95) : # end_trial(95) : Pareto Size = 33, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 95 Size: 33 5460860 6459632 5473334 6379180 5487014 6320190 5487994 6315944 5514052 6254806 5521874 6230022 5527392 6161726 5557518 6113426 5574630 6085802 5578544 6085654 5581316 6053130 5589930 6032310 5609340 6003924 5619512 5992792 5656696 5978586 5678296 5942328 5708170 5921884 5710672 5860664 5766168 5841748 5775002 5812494 5776378 5795942 5789478 5772562 5833052 5766078 5836632 5741836 5958950 5661830 6002178 5657508 6026508 5636618 6039790 5609584 6147422 5607278 6157164 5602042 6157422 5585754 6292468 5580898 6307564 5577228 # start_trial(96) : # end_trial(96) : Pareto Size = 35, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 96 Size: 35 5467874 6375906 5494594 6327024 5497672 6314766 5506430 6268732 5516914 6169028 5529798 6160164 5554952 6149378 5573880 6051870 5608098 6033462 5621682 6029806 5640004 6015726 5643394 5979022 5647872 5947168 5672598 5922312 5695550 5902882 5696988 5877512 5709268 5865846 5749742 5842404 5770190 5832654 5808158 5775672 5840290 5759786 5842974 5757412 5877428 5721362 5921788 5715326 5927004 5701710 6001514 5676618 6014594 5655832 6029700 5639856 6082726 5632542 6098104 5611298 6150276 5608032 6153924 5595924 6246268 5578066 6278860 5567562 6335518 5562146 # start_trial(97) : # end_trial(97) : Pareto Size = 34, Scalarizations = 100, Elapsed time = 7.64 s # Pareto: 97 Size: 34 5487720 6352820 5496356 6318900 5499938 6288730 5521684 6236388 5544472 6128952 5557848 6128092 5566732 6103282 5575850 6087860 5585024 6083534 5601092 6053972 5621114 5988710 5643116 5983524 5662972 5942554 5673432 5922374 5687212 5915818 5700418 5902808 5704588 5874704 5747138 5855290 5762354 5836990 5790512 5791618 5806348 5783802 5840482 5763708 5853282 5752694 5865440 5711656 5953970 5702334 5985680 5657520 6043538 5643086 6052868 5638480 6087652 5637496 6142016 5613066 6153042 5600590 6156862 5591192 6299122 5573268 6399266 5571100 # start_trial(98) : # end_trial(98) : Pareto Size = 38, Scalarizations = 100, Elapsed time = 7.636 s # Pareto: 98 Size: 38 5472850 6484844 5486514 6425912 5493364 6326096 5507050 6259402 5510976 6250738 5520960 6228102 5536556 6194152 5555574 6146358 5555954 6137468 5583588 6065464 5605220 6061330 5612006 6014408 5633076 5990776 5647330 5962532 5671422 5958680 5680190 5928246 5682294 5917428 5708368 5904396 5711060 5877132 5742970 5871388 5771866 5847988 5772846 5831566 5780250 5823402 5786828 5822796 5793758 5799452 5805324 5781798 5850216 5760902 5875392 5734780 5913184 5703986 5920738 5686098 5965796 5685106 6010668 5648876 6021498 5642750 6087682 5628816 6103472 5624586 6142558 5618546 6163576 5585394 6280834 5557846 # start_trial(99) : # end_trial(99) : Pareto Size = 29, Scalarizations = 100, Elapsed time = 7.7 s # Pareto: 99 Size: 29 5466024 6363372 5496936 6204252 5523610 6147476 5559472 6130224 5581330 6112008 5593876 6098980 5594382 6045756 5605456 5990498 5621210 5980336 5658746 5948830 5677344 5920126 5699828 5897132 5704884 5856672 5712370 5853258 5745946 5830238 5823498 5777282 5863168 5728288 5866806 5715198 5980910 5700190 6003942 5679440 6034500 5665298 6080910 5615828 6097562 5614190 6127628 5611990 6133090 5609068 6137908 5598038 6190644 5585754 6299392 5581182 6301566 5578532 # Average Number Scalarizations = 100, Average Trial Time = 7.679 s eaf/inst/extdata/r15_dat0000644000176200001440000000636013534247654014620 0ustar liggesusers# Report: # Metah: Weighted RoTS, version 2.1.88M (#DEBUG = 1) # bQAP (0.1.88Msvn) # Data File: /home/manu/personal/2005-JMMA/data/qapUni.50.p75.1 Size: 50 Averages: Distance=47.49 Flow1=49.90 Flow2=49.96 # Parameter settings: # number trials : 15 # time limit : 3.40282e+38 # seed : 1234567 # num weights: 100 # Taboo Search Length : 1 # Initialization time: 0.004 s # start_trial(0) : # end_trial(0) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8921 s # Pareto: 0 Size: 7 5261548 5340738 5283204 5340630 5287522 5336320 5291202 5331366 5292270 5318304 5298876 5290408 5312952 5277832 # start_trial(1) : # end_trial(1) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 1 Size: 4 5246946 5368942 5249068 5328154 5277710 5321710 5280132 5281080 # start_trial(2) : # end_trial(2) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 2 Size: 2 5255914 5312620 5285994 5294248 # start_trial(3) : # end_trial(3) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 3 Size: 6 5254586 5341368 5265448 5336434 5266332 5329290 5278158 5328006 5293084 5304026 5316378 5285680 # start_trial(4) : # end_trial(4) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 4 Size: 5 5257008 5385896 5260020 5354180 5261932 5351978 5265120 5343482 5272604 5280450 # start_trial(5) : # end_trial(5) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.9121 s # Pareto: 5 Size: 3 5251436 5304740 5260634 5289432 5261388 5278662 # start_trial(6) : # end_trial(6) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 6 Size: 3 5260462 5303782 5309662 5298112 5338894 5292426 # start_trial(7) : # end_trial(7) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 7 Size: 4 5238158 5302220 5266616 5301604 5277362 5291346 5328374 5283152 # start_trial(8) : # end_trial(8) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 8 Size: 5 5259568 5344514 5260078 5323590 5275688 5304758 5295860 5299490 5321894 5280216 # start_trial(9) : # end_trial(9) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 9 Size: 5 5252950 5337456 5258962 5303668 5273430 5301298 5311040 5291910 5319530 5279154 # start_trial(10) : # end_trial(10) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 10 Size: 6 5255088 5362366 5260872 5337164 5276254 5307774 5278846 5302382 5287324 5301484 5290398 5284198 # start_trial(11) : # end_trial(11) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 11 Size: 3 5257462 5328600 5262892 5302082 5306682 5293358 # start_trial(12) : # end_trial(12) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 12 Size: 5 5255536 5369466 5265974 5314044 5276688 5311924 5301892 5288482 5319394 5278344 # start_trial(13) : # end_trial(13) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9041 s # Pareto: 13 Size: 4 5243484 5327056 5262810 5312496 5265234 5288336 5305096 5285540 # start_trial(14) : # end_trial(14) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.9161 s # Pareto: 14 Size: 3 5254326 5373688 5258282 5328368 5277040 5290704 # Average Number Scalarizations = 100, Average Trial Time = 0.8817 s eaf/inst/extdata/rest0000644000176200001440000065521114045207023014323 0ustar liggesusers21432.000000 170033.000000 21575.000000 163444.000000 21911.000000 152237.000000 22456.000000 144380.000000 23092.000000 131413.000000 23743.000000 123919.000000 24128.000000 118498.000000 23297.000000 124753.000000 25450.000000 104447.000000 25162.000000 108135.000000 25407.000000 106212.000000 25864.000000 101557.000000 26326.000000 99368.000000 27500.000000 92857.000000 26473.000000 97348.000000 27097.000000 93980.000000 28917.000000 87654.000000 29034.000000 86959.000000 29617.000000 85585.000000 29185.000000 86593.000000 29659.000000 85404.000000 30258.000000 84289.000000 32984.000000 76695.000000 34962.000000 72899.000000 33086.000000 76291.000000 34183.000000 75290.000000 35647.000000 71902.000000 34870.000000 73626.000000 38459.000000 67024.000000 36337.000000 70255.000000 38365.000000 67229.000000 39092.000000 65234.000000 42173.000000 60504.000000 42879.000000 59936.000000 44805.000000 58096.000000 43929.000000 58715.000000 44468.000000 58632.000000 48333.000000 53195.000000 49693.000000 52101.000000 50028.000000 50673.000000 51643.000000 50189.000000 52704.000000 48895.000000 51798.000000 49894.000000 55670.000000 46203.000000 56802.000000 45006.000000 61895.000000 41433.000000 60434.000000 42638.000000 61085.000000 42587.000000 61861.000000 42170.000000 67037.000000 38706.000000 65195.000000 39693.000000 64092.000000 39853.000000 63212.000000 40957.000000 67505.000000 37965.000000 69680.000000 37253.000000 68823.000000 37441.000000 70786.000000 36430.000000 70631.000000 36780.000000 75267.000000 34449.000000 76283.000000 34252.000000 79226.000000 33263.000000 79013.000000 33307.000000 84556.000000 31146.000000 89377.000000 30605.000000 86767.000000 31128.000000 94707.000000 29412.000000 87021.000000 30862.000000 95927.000000 29006.000000 97813.000000 28604.000000 104174.000000 27341.000000 102971.000000 27539.000000 116787.000000 25461.000000 113574.000000 25970.000000 123291.000000 24956.000000 118770.000000 25242.000000 135191.000000 23865.000000 140501.000000 23596.000000 143796.000000 23240.000000 147329.000000 23133.000000 147888.000000 22966.000000 161142.000000 22476.000000 169074.000000 22264.000000 21282.000000 178446.000000 21718.000000 160290.000000 21380.000000 165022.000000 22412.000000 138299.000000 22940.000000 129524.000000 23583.000000 121560.000000 23110.000000 128594.000000 24278.000000 116194.000000 24675.000000 113958.000000 25255.000000 105304.000000 25608.000000 104167.000000 26817.000000 97678.000000 26330.000000 99855.000000 26463.000000 99362.000000 27637.000000 92932.000000 28001.000000 92928.000000 28203.000000 89999.000000 28051.000000 92632.000000 28653.000000 88642.000000 29292.000000 88277.000000 29659.000000 85404.000000 30965.000000 81787.000000 31813.000000 79979.000000 33465.000000 75430.000000 34612.000000 72812.000000 35817.000000 71061.000000 37294.000000 68166.000000 38929.000000 66679.000000 41487.000000 62621.000000 39936.000000 65103.000000 43107.000000 59445.000000 41823.000000 62355.000000 43267.000000 59355.000000 43695.000000 58182.000000 47523.000000 53627.000000 47564.000000 53596.000000 47838.000000 53594.000000 52081.000000 49312.000000 51376.000000 49744.000000 53569.000000 47890.000000 55413.000000 46664.000000 61342.000000 42032.000000 55647.000000 46636.000000 52931.000000 48063.000000 62115.000000 42021.000000 57576.000000 44747.000000 63827.000000 40905.000000 64621.000000 39562.000000 66027.000000 38446.000000 62616.000000 41708.000000 65577.000000 39552.000000 69376.000000 37026.000000 72109.000000 35793.000000 70678.000000 36594.000000 75014.000000 34428.000000 78787.000000 33197.000000 80529.000000 32347.000000 79667.000000 32825.000000 86211.000000 31210.000000 85344.000000 31338.000000 86565.000000 31105.000000 89743.000000 29922.000000 94503.000000 29155.000000 90772.000000 29715.000000 97439.000000 28672.000000 99891.000000 28071.000000 101054.000000 27990.000000 112604.000000 26060.000000 110608.000000 26530.000000 116711.000000 25680.000000 118726.000000 25248.000000 121132.000000 25073.000000 134116.000000 24048.000000 142903.000000 23238.000000 139533.000000 23717.000000 146910.000000 22992.000000 153860.000000 22801.000000 158794.000000 22517.000000 164380.000000 22376.000000 169491.000000 22301.000000 21394.000000 173086.000000 21552.000000 165258.000000 21846.000000 156878.000000 22223.000000 143318.000000 22487.000000 142974.000000 22545.000000 135710.000000 23747.000000 123861.000000 23879.000000 120249.000000 24191.000000 115678.000000 23814.000000 120535.000000 25222.000000 106670.000000 25410.000000 104743.000000 25854.000000 103682.000000 26144.000000 100303.000000 26473.000000 97348.000000 26577.000000 97129.000000 26713.000000 96729.000000 28860.000000 89133.000000 29256.000000 86815.000000 29671.000000 85428.000000 28911.000000 87568.000000 30415.000000 84793.000000 33005.000000 76766.000000 32689.000000 77166.000000 34784.000000 74676.000000 32959.000000 77015.000000 37234.000000 69567.000000 36311.000000 70297.000000 35684.000000 71910.000000 37423.000000 67527.000000 37933.000000 66961.000000 42362.000000 60068.000000 42277.000000 60664.000000 41107.000000 62913.000000 43204.000000 59135.000000 45681.000000 57042.000000 45835.000000 56875.000000 44413.000000 58222.000000 44737.000000 57902.000000 46556.000000 56004.000000 48113.000000 52925.000000 49092.000000 52303.000000 51660.000000 49854.000000 47735.000000 53288.000000 49936.000000 51743.000000 52207.000000 48823.000000 53483.000000 47744.000000 57022.000000 44996.000000 56033.000000 45844.000000 64184.000000 39947.000000 55101.000000 46273.000000 59887.000000 43183.000000 64610.000000 39806.000000 64753.000000 39286.000000 61910.000000 41269.000000 63267.000000 40557.000000 66027.000000 38446.000000 68913.000000 37343.000000 67876.000000 37733.000000 71538.000000 36756.000000 74736.000000 35347.000000 72839.000000 35435.000000 77509.000000 34076.000000 78211.000000 33259.000000 80862.000000 32686.000000 82781.000000 31631.000000 89803.000000 30444.000000 88467.000000 30502.000000 90255.000000 29792.000000 91259.000000 29536.000000 90802.000000 29709.000000 97027.000000 28604.000000 99359.000000 28069.000000 103274.000000 27563.000000 108713.000000 26643.000000 112010.000000 26215.000000 117912.000000 25987.000000 113155.000000 26153.000000 120684.000000 25311.000000 145504.000000 23167.000000 141970.000000 23397.000000 150546.000000 22881.000000 153124.000000 22679.000000 156028.000000 22589.000000 169103.000000 22280.000000 173371.000000 22242.000000 21282.000000 178446.000000 21345.000000 171328.000000 21462.000000 166889.000000 21666.000000 163384.000000 22452.000000 137262.000000 22907.000000 130824.000000 23045.000000 128455.000000 24595.000000 114626.000000 24138.000000 117255.000000 24729.000000 112882.000000 25287.000000 105922.000000 25450.000000 103377.000000 26181.000000 101220.000000 25819.000000 101788.000000 27097.000000 93980.000000 27671.000000 93066.000000 29007.000000 87936.000000 29231.000000 87907.000000 28134.000000 89998.000000 30947.000000 81958.000000 30614.000000 82598.000000 31177.000000 81107.000000 33927.000000 76336.000000 32900.000000 76763.000000 35522.000000 71207.000000 34348.000000 74290.000000 36091.000000 70631.000000 39030.000000 66844.000000 36756.000000 69429.000000 37435.000000 68746.000000 40821.000000 63503.000000 41196.000000 63167.000000 43721.000000 59823.000000 41865.000000 61270.000000 44331.000000 57979.000000 43748.000000 59079.000000 44702.000000 57705.000000 46523.000000 55713.000000 47124.000000 54800.000000 45728.000000 56344.000000 47510.000000 53432.000000 50160.000000 51319.000000 51714.000000 49936.000000 50041.000000 51357.000000 49983.000000 52094.000000 54481.000000 47813.000000 52132.000000 48405.000000 55500.000000 46088.000000 57745.000000 44716.000000 58723.000000 43671.000000 61008.000000 42066.000000 63408.000000 40262.000000 64050.000000 40046.000000 65651.000000 39370.000000 67308.000000 37813.000000 66581.000000 38496.000000 73392.000000 35441.000000 72679.000000 35821.000000 65823.000000 38715.000000 72873.000000 35679.000000 76759.000000 33735.000000 78705.000000 33339.000000 77973.000000 33364.000000 81912.000000 32200.000000 80800.000000 32548.000000 88737.000000 30432.000000 84034.000000 31527.000000 93328.000000 29267.000000 89475.000000 30074.000000 100201.000000 28192.000000 102496.000000 27627.000000 109781.000000 26389.000000 108650.000000 26647.000000 110367.000000 26374.000000 116450.000000 25384.000000 115747.000000 25597.000000 130047.000000 24516.000000 139242.000000 23687.000000 140666.000000 23453.000000 143357.000000 23429.000000 146179.000000 22979.000000 153889.000000 22683.000000 159692.000000 22467.000000 167581.000000 22415.000000 177206.000000 22184.000000 21356.000000 175946.000000 21385.000000 173116.000000 21725.000000 157132.000000 21879.000000 155578.000000 21953.000000 151069.000000 22211.000000 143043.000000 22938.000000 131710.000000 23381.000000 125237.000000 23802.000000 119919.000000 24158.000000 118227.000000 24242.000000 115239.000000 25360.000000 104494.000000 26210.000000 101003.000000 26216.000000 100342.000000 26963.000000 96235.000000 27500.000000 92857.000000 27148.000000 95047.000000 27913.000000 90720.000000 27346.000000 93323.000000 28203.000000 89999.000000 28708.000000 88996.000000 28966.000000 87329.000000 31225.000000 80631.000000 30079.000000 84055.000000 29457.000000 85838.000000 30611.000000 83343.000000 33530.000000 76097.000000 32900.000000 76763.000000 34134.000000 74291.000000 35100.000000 73419.000000 37247.000000 68532.000000 36452.000000 69296.000000 38295.000000 66863.000000 36299.000000 70001.000000 40310.000000 63667.000000 41752.000000 61665.000000 40193.000000 63956.000000 43761.000000 58870.000000 44247.000000 58431.000000 46347.000000 55173.000000 42650.000000 60391.000000 47277.000000 54035.000000 50316.000000 50960.000000 51791.000000 49471.000000 49024.000000 53217.000000 49983.000000 51025.000000 49241.000000 51576.000000 55952.000000 45896.000000 55614.000000 46171.000000 59904.000000 43877.000000 56320.000000 45596.000000 61331.000000 42027.000000 60956.000000 42579.000000 58185.000000 44151.000000 63238.000000 40458.000000 63759.000000 39863.000000 65849.000000 38469.000000 67648.000000 37838.000000 67619.000000 38289.000000 69136.000000 37712.000000 71233.000000 35948.000000 70826.000000 36294.000000 69767.000000 36921.000000 74870.000000 34980.000000 78736.000000 33190.000000 76994.000000 34806.000000 80913.000000 32975.000000 79051.000000 33090.000000 82046.000000 32365.000000 83178.000000 31706.000000 90920.000000 29864.000000 84079.000000 31594.000000 88938.000000 30035.000000 100232.000000 28285.000000 96520.000000 28916.000000 98461.000000 28610.000000 102786.000000 27604.000000 104172.000000 27483.000000 109263.000000 26558.000000 116516.000000 25481.000000 123410.000000 24863.000000 122186.000000 25104.000000 127433.000000 24425.000000 140581.000000 23606.000000 144577.000000 23174.000000 146955.000000 22981.000000 153124.000000 22679.000000 162143.000000 22561.000000 174270.000000 22304.000000 21415.000000 176559.000000 21436.000000 170273.000000 21767.000000 157608.000000 21906.000000 150691.000000 22560.000000 141509.000000 22848.000000 136696.000000 23010.000000 132820.000000 23819.000000 122421.000000 23904.000000 117520.000000 25219.000000 106971.000000 25184.000000 109331.000000 25424.000000 105042.000000 25892.000000 103614.000000 26233.000000 100825.000000 26846.000000 96828.000000 26941.000000 96083.000000 27097.000000 93980.000000 27500.000000 92857.000000 28203.000000 89999.000000 28974.000000 87079.000000 28759.000000 87780.000000 30238.000000 84474.000000 29744.000000 85124.000000 31361.000000 80873.000000 32321.000000 79644.000000 34023.000000 75284.000000 35262.000000 71725.000000 34917.000000 72960.000000 36104.000000 69946.000000 38658.000000 65510.000000 40176.000000 63534.000000 41100.000000 62570.000000 44070.000000 57962.000000 43434.000000 58986.000000 43063.000000 59814.000000 46283.000000 55939.000000 49517.000000 51845.000000 45191.000000 57036.000000 51637.000000 50367.000000 48804.000000 53262.000000 49260.000000 52196.000000 50247.000000 51237.000000 51693.000000 50334.000000 52053.000000 49434.000000 54327.000000 47558.000000 56450.000000 45654.000000 56849.000000 45417.000000 58267.000000 44227.000000 59005.000000 43882.000000 60816.000000 42616.000000 58194.000000 44318.000000 64685.000000 39224.000000 62864.000000 41291.000000 64342.000000 40021.000000 69096.000000 37340.000000 68017.000000 37689.000000 65938.000000 38567.000000 74322.000000 34949.000000 73095.000000 35381.000000 76855.000000 34510.000000 83506.000000 32224.000000 78511.000000 33501.000000 86400.000000 31083.000000 83997.000000 31711.000000 84591.000000 31334.000000 87188.000000 30919.000000 89854.000000 30139.000000 89988.000000 29947.000000 94246.000000 29128.000000 98305.000000 28312.000000 102355.000000 27824.000000 109069.000000 26735.000000 107617.000000 26823.000000 115359.000000 25691.000000 121053.000000 25013.000000 120969.000000 25017.000000 125570.000000 24546.000000 130989.000000 24133.000000 141415.000000 23454.000000 145364.000000 23094.000000 153124.000000 22679.000000 156028.000000 22589.000000 172355.000000 22342.000000 177728.000000 22270.000000 21396.000000 172746.000000 21527.000000 168694.000000 21552.000000 165258.000000 21598.000000 161266.000000 22052.000000 153157.000000 22778.000000 135986.000000 22949.000000 134452.000000 23045.000000 128455.000000 24294.000000 119515.000000 24993.000000 110962.000000 25054.000000 109344.000000 25493.000000 106511.000000 25150.000000 109141.000000 25858.000000 100867.000000 27365.000000 94585.000000 27778.000000 93690.000000 29218.000000 87481.000000 28872.000000 87704.000000 29715.000000 85451.000000 28851.000000 87867.000000 29674.000000 85539.000000 30924.000000 83490.000000 29326.000000 86066.000000 31656.000000 80285.000000 33263.000000 76175.000000 33774.000000 75156.000000 36094.000000 71738.000000 33927.000000 74870.000000 35842.000000 73684.000000 36222.000000 70279.000000 36719.000000 68818.000000 40198.000000 64151.000000 38391.000000 66021.000000 39553.000000 64584.000000 39136.000000 65061.000000 44932.000000 57212.000000 42741.000000 60465.000000 45255.000000 56551.000000 46223.000000 55311.000000 46601.000000 54492.000000 48314.000000 53159.000000 51548.000000 49594.000000 47275.000000 54055.000000 50908.000000 50262.000000 50517.000000 51218.000000 51103.000000 49835.000000 54932.000000 46999.000000 55419.000000 46332.000000 60502.000000 42190.000000 56937.000000 45118.000000 62280.000000 41029.000000 64441.000000 39755.000000 61443.000000 41595.000000 67979.000000 37907.000000 66344.000000 38945.000000 68994.000000 37514.000000 70355.000000 36601.000000 73935.000000 35380.000000 73352.000000 35562.000000 76269.000000 34403.000000 70708.000000 36396.000000 76331.000000 34350.000000 80452.000000 32786.000000 81636.000000 32485.000000 81940.000000 32430.000000 84193.000000 31479.000000 84364.000000 31182.000000 94277.000000 29029.000000 86333.000000 30978.000000 93392.000000 29499.000000 95196.000000 28934.000000 93917.000000 29383.000000 96709.000000 28788.000000 99019.000000 28171.000000 107928.000000 27066.000000 104609.000000 27213.000000 109567.000000 26772.000000 121787.000000 25219.000000 129976.000000 24247.000000 129699.000000 24609.000000 133248.000000 23958.000000 142933.000000 23357.000000 143983.000000 23115.000000 159272.000000 22521.000000 167974.000000 22448.000000 172715.000000 22402.000000 178760.000000 22357.000000 21355.000000 168458.000000 21849.000000 154241.000000 21552.000000 165258.000000 22058.000000 148969.000000 22543.000000 142610.000000 22802.000000 133114.000000 23787.000000 121009.000000 23484.000000 127889.000000 24420.000000 114974.000000 25456.000000 105137.000000 26473.000000 98641.000000 25900.000000 102314.000000 26801.000000 95553.000000 26453.000000 100351.000000 27346.000000 93323.000000 28443.000000 92822.000000 27851.000000 92969.000000 29290.000000 89254.000000 28704.000000 89406.000000 29938.000000 85970.000000 30028.000000 84425.000000 31326.000000 81117.000000 32633.000000 78955.000000 30923.000000 81942.000000 33241.000000 77320.000000 33804.000000 74471.000000 34843.000000 72712.000000 35493.000000 72152.000000 36251.000000 70327.000000 34575.000000 73677.000000 39519.000000 64276.000000 37711.000000 67676.000000 38297.000000 65976.000000 43777.000000 58290.000000 40180.000000 63922.000000 41392.000000 61159.000000 44707.000000 57748.000000 43481.000000 59520.000000 43206.000000 60288.000000 44797.000000 57322.000000 47341.000000 54318.000000 49025.000000 52144.000000 48438.000000 52577.000000 47668.000000 52857.000000 53957.000000 47901.000000 51284.000000 50427.000000 55314.000000 46851.000000 57448.000000 44719.000000 56229.000000 45465.000000 58399.000000 44145.000000 62143.000000 41502.000000 57341.000000 44736.000000 61001.000000 42027.000000 64759.000000 39753.000000 63807.000000 40464.000000 69006.000000 37626.000000 67308.000000 37813.000000 65614.000000 39492.000000 71049.000000 36673.000000 75279.000000 34970.000000 76245.000000 34583.000000 72856.000000 35267.000000 81508.000000 32705.000000 76996.000000 34517.000000 77872.000000 33343.000000 81724.000000 32445.000000 82518.000000 31946.000000 78227.000000 33131.000000 86181.000000 31243.000000 91129.000000 29944.000000 88680.000000 30182.000000 93135.000000 29640.000000 99300.000000 28018.000000 97348.000000 28656.000000 99884.000000 28000.000000 109781.000000 26389.000000 114882.000000 25699.000000 124788.000000 24775.000000 129086.000000 24505.000000 133669.000000 24147.000000 135886.000000 23848.000000 146179.000000 22979.000000 146406.000000 22971.000000 155909.000000 22732.000000 159465.000000 22475.000000 163183.000000 22391.000000 167988.000000 22359.000000 173623.000000 22351.000000 21388.000000 170358.000000 21879.000000 155578.000000 22212.000000 143825.000000 22198.000000 145612.000000 22835.000000 135237.000000 23158.000000 129477.000000 23896.000000 117595.000000 24728.000000 112066.000000 25194.000000 108753.000000 25659.000000 104389.000000 25864.000000 101557.000000 26823.000000 98924.000000 26491.000000 99844.000000 27097.000000 93980.000000 27442.000000 93462.000000 27913.000000 90720.000000 28851.000000 87688.000000 30006.000000 85095.000000 29761.000000 85275.000000 28911.000000 87568.000000 31645.000000 80678.000000 35887.000000 71186.000000 33595.000000 76481.000000 34628.000000 75679.000000 35266.000000 71477.000000 37703.000000 67484.000000 36666.000000 69436.000000 38326.000000 66737.000000 37620.000000 68274.000000 40197.000000 63386.000000 45711.000000 55999.000000 41396.000000 62369.000000 45303.000000 56398.000000 46434.000000 55901.000000 47149.000000 54630.000000 48219.000000 54313.000000 51204.000000 51531.000000 47484.000000 54370.000000 48517.000000 53705.000000 52238.000000 49799.000000 57698.000000 45163.000000 52383.000000 48592.000000 54456.000000 46807.000000 59896.000000 43099.000000 60320.000000 42746.000000 64530.000000 40115.000000 58003.000000 44336.000000 65857.000000 39345.000000 64325.000000 40197.000000 64891.000000 39645.000000 66486.000000 38361.000000 70243.000000 36585.000000 70320.000000 36408.000000 68713.000000 37206.000000 77948.000000 33625.000000 73428.000000 35018.000000 77962.000000 33550.000000 77728.000000 33708.000000 81318.000000 32824.000000 83294.000000 32008.000000 79522.000000 33412.000000 86383.000000 30983.000000 88384.000000 30529.000000 93551.000000 29054.000000 91204.000000 29856.000000 98281.000000 28288.000000 101207.000000 27956.000000 103260.000000 27480.000000 114448.000000 26163.000000 118843.000000 25239.000000 125050.000000 24646.000000 144143.000000 23437.000000 145570.000000 23238.000000 149221.000000 23101.000000 156012.000000 22615.000000 161007.000000 22465.000000 172356.000000 22264.000000 176521.000000 22179.000000 21317.000000 172106.000000 22089.000000 150800.000000 21501.000000 165944.000000 21906.000000 156256.000000 22442.000000 140132.000000 22400.000000 141109.000000 23436.000000 126061.000000 23169.000000 127725.000000 24746.000000 112029.000000 24700.000000 112066.000000 25360.000000 107848.000000 25505.000000 106753.000000 26221.000000 100132.000000 26134.000000 101533.000000 27404.000000 95152.000000 26740.000000 96625.000000 27636.000000 93590.000000 28095.000000 90134.000000 28562.000000 89086.000000 29666.000000 86265.000000 28809.000000 88149.000000 31473.000000 80759.000000 31204.000000 81375.000000 32756.000000 77247.000000 33377.000000 75814.000000 35762.000000 70757.000000 33607.000000 75730.000000 33344.000000 77081.000000 35096.000000 72906.000000 35698.000000 71408.000000 37087.000000 67978.000000 41087.000000 62518.000000 41990.000000 60598.000000 38741.000000 66124.000000 41422.000000 61561.000000 43872.000000 58915.000000 43006.000000 59484.000000 47466.000000 54667.000000 45023.000000 58100.000000 41662.000000 60753.000000 47746.000000 54218.000000 49249.000000 52304.000000 50504.000000 50168.000000 48923.000000 52352.000000 51391.000000 49606.000000 52863.000000 48317.000000 53882.000000 47368.000000 57443.000000 44867.000000 60598.000000 42239.000000 61650.000000 42020.000000 60410.000000 42677.000000 60071.000000 43087.000000 64301.000000 40310.000000 67460.000000 37682.000000 65030.000000 39038.000000 70241.000000 37258.000000 69336.000000 37479.000000 72345.000000 35840.000000 80026.000000 32908.000000 73690.000000 34907.000000 81153.000000 32593.000000 80180.000000 32857.000000 82659.000000 32035.000000 94821.000000 29173.000000 89908.000000 29885.000000 91785.000000 29502.000000 98050.000000 28392.000000 105417.000000 27294.000000 108217.000000 26567.000000 111324.000000 26157.000000 113745.000000 26045.000000 123914.000000 24727.000000 119658.000000 25061.000000 135580.000000 23810.000000 143452.000000 23248.000000 142907.000000 23387.000000 146955.000000 22981.000000 158103.000000 22555.000000 159692.000000 22467.000000 162996.000000 22456.000000 165137.000000 22393.000000 178070.000000 22263.000000 21282.000000 178446.000000 21371.000000 174156.000000 21398.000000 167114.000000 21987.000000 152655.000000 22206.000000 149971.000000 22488.000000 138207.000000 22883.000000 132369.000000 23352.000000 125577.000000 24295.000000 116014.000000 23890.000000 119094.000000 25533.000000 105616.000000 25699.000000 102720.000000 25712.000000 102293.000000 26086.000000 99559.000000 27346.000000 93323.000000 27233.000000 93580.000000 28094.000000 91927.000000 27364.000000 93257.000000 28584.000000 88316.000000 31562.000000 81081.000000 30458.000000 83091.000000 29984.000000 84687.000000 32118.000000 79021.000000 32659.000000 78189.000000 34065.000000 74991.000000 34631.000000 72795.000000 36227.000000 69649.000000 35792.000000 70278.000000 37741.000000 67183.000000 39194.000000 64552.000000 41349.000000 61692.000000 42895.000000 60520.000000 43509.000000 59090.000000 46570.000000 55994.000000 43748.000000 58726.000000 48021.000000 53534.000000 47312.000000 54234.000000 48454.000000 52535.000000 48549.000000 52497.000000 49384.000000 51870.000000 50322.000000 50413.000000 51675.000000 49483.000000 54145.000000 47076.000000 53400.000000 48284.000000 54684.000000 46528.000000 57071.000000 44657.000000 57016.000000 45512.000000 58773.000000 43880.000000 60750.000000 42780.000000 61242.000000 41988.000000 63578.000000 40181.000000 60904.000000 42433.000000 63485.000000 41040.000000 64959.000000 39856.000000 69914.000000 37005.000000 65625.000000 38785.000000 71449.000000 35687.000000 75530.000000 34681.000000 75593.000000 34612.000000 76714.000000 33930.000000 80238.000000 32760.000000 79783.000000 32828.000000 79695.000000 32971.000000 87247.000000 30606.000000 83616.000000 31564.000000 91503.000000 29663.000000 94653.000000 29294.000000 90393.000000 29778.000000 97874.000000 28112.000000 100330.000000 27913.000000 111795.000000 26320.000000 112045.000000 26226.000000 119156.000000 25297.000000 128800.000000 24619.000000 137557.000000 23695.000000 138914.000000 23487.000000 147725.000000 23105.000000 153124.000000 22679.000000 151188.000000 22812.000000 162377.000000 22478.000000 170426.000000 22465.000000 179222.000000 22209.000000 21356.000000 175946.000000 21408.000000 170527.000000 21578.000000 164695.000000 22057.000000 152704.000000 22081.000000 146649.000000 22430.000000 138767.000000 22705.000000 136890.000000 23372.000000 127016.000000 24183.000000 120373.000000 24664.000000 112043.000000 24612.000000 112713.000000 25789.000000 101859.000000 25515.000000 106175.000000 26796.000000 98334.000000 26921.000000 96876.000000 26731.000000 99094.000000 27097.000000 93980.000000 28000.000000 90851.000000 28458.000000 89741.000000 29205.000000 87847.000000 28134.000000 89998.000000 30442.000000 83991.000000 29326.000000 86066.000000 31195.000000 81725.000000 29799.000000 84724.000000 31692.000000 79882.000000 35533.000000 72437.000000 34838.000000 73363.000000 34542.000000 74026.000000 36141.000000 70122.000000 35778.000000 71294.000000 36410.000000 69788.000000 37544.000000 67926.000000 38626.000000 66298.000000 42277.000000 60664.000000 40977.000000 62035.000000 43965.000000 58313.000000 42817.000000 59771.000000 43586.000000 58900.000000 48195.000000 53113.000000 47685.000000 53319.000000 49059.000000 52025.000000 52898.000000 47802.000000 51048.000000 50191.000000 53989.000000 47598.000000 52304.000000 48705.000000 55629.000000 46239.000000 57923.000000 44151.000000 56199.000000 45777.000000 62781.000000 40859.000000 60673.000000 42757.000000 61545.000000 41463.000000 62622.000000 40870.000000 66715.000000 38453.000000 65575.000000 39287.000000 67680.000000 38035.000000 72245.000000 36446.000000 70217.000000 36718.000000 67929.000000 37641.000000 72539.000000 35858.000000 73687.000000 35086.000000 76425.000000 34354.000000 78619.000000 33726.000000 77484.000000 33878.000000 81896.000000 32792.000000 85124.000000 31370.000000 82239.000000 31869.000000 84542.000000 31618.000000 89448.000000 30607.000000 85361.000000 31190.000000 90673.000000 29925.000000 96290.000000 28576.000000 99108.000000 28262.000000 101409.000000 27671.000000 108983.000000 26776.000000 113505.000000 25764.000000 115678.000000 25655.000000 128710.000000 24347.000000 134465.000000 24100.000000 142903.000000 23238.000000 138646.000000 23509.000000 147669.000000 23105.000000 153673.000000 22689.000000 155801.000000 22597.000000 169647.000000 22235.000000 165900.000000 22394.000000 176521.000000 22179.000000 21305.000000 173801.000000 21481.000000 165897.000000 21485.000000 165819.000000 22107.000000 150060.000000 22209.000000 144719.000000 22679.000000 135381.000000 23045.000000 128455.000000 23755.000000 122839.000000 24304.000000 117007.000000 24138.000000 118406.000000 25779.000000 104211.000000 25072.000000 109824.000000 26683.000000 98111.000000 25980.000000 101387.000000 25869.000000 102833.000000 26803.000000 96412.000000 27233.000000 93580.000000 27913.000000 90720.000000 29740.000000 85621.000000 29190.000000 86466.000000 31742.000000 79735.000000 30328.000000 83648.000000 30672.000000 83193.000000 32581.000000 77561.000000 32577.000000 77813.000000 35084.000000 71845.000000 35966.000000 71188.000000 36371.000000 70352.000000 36417.000000 69299.000000 42833.000000 60119.000000 44841.000000 56789.000000 39389.000000 64705.000000 41282.000000 62014.000000 43763.000000 59780.000000 44375.000000 57935.000000 46059.000000 56013.000000 44923.000000 56345.000000 50155.000000 51275.000000 47014.000000 54013.000000 49729.000000 51348.000000 49390.000000 51660.000000 50545.000000 49948.000000 54652.000000 46962.000000 54924.000000 46523.000000 59069.000000 43825.000000 55861.000000 46451.000000 60016.000000 42723.000000 59268.000000 43272.000000 62696.000000 40999.000000 65372.000000 39939.000000 67118.000000 38178.000000 64032.000000 40128.000000 66621.000000 38670.000000 68170.000000 37920.000000 70425.000000 36767.000000 70960.000000 36740.000000 69153.000000 37263.000000 73514.000000 35456.000000 72847.000000 35474.000000 74703.000000 34657.000000 76715.000000 34057.000000 80080.000000 33133.000000 83429.000000 32357.000000 85623.000000 31177.000000 83630.000000 31341.000000 87833.000000 30728.000000 88923.000000 30317.000000 93071.000000 29629.000000 89475.000000 30074.000000 94458.000000 28960.000000 95565.000000 28797.000000 101906.000000 27643.000000 107567.000000 26775.000000 106895.000000 26917.000000 116422.000000 25557.000000 120382.000000 25132.000000 134643.000000 23960.000000 144890.000000 23368.000000 146873.000000 23172.000000 153180.000000 22809.000000 158742.000000 22503.000000 165574.000000 22413.000000 175659.000000 22240.000000 176436.000000 22141.000000 21370.000000 167892.000000 22226.000000 145187.000000 22554.000000 139877.000000 23013.000000 130313.000000 23615.000000 129367.000000 23842.000000 120670.000000 24174.000000 117409.000000 25100.000000 107106.000000 26095.000000 101897.000000 25603.000000 102974.000000 26286.000000 99437.000000 26801.000000 95553.000000 27108.000000 94992.000000 27437.000000 93505.000000 29743.000000 85752.000000 28568.000000 89995.000000 30470.000000 83296.000000 30614.000000 82598.000000 30382.000000 83430.000000 30461.000000 83411.000000 32453.000000 78256.000000 33397.000000 76377.000000 35824.000000 71144.000000 33717.000000 75664.000000 38329.000000 67238.000000 36253.000000 70422.000000 35111.000000 71610.000000 36880.000000 68557.000000 40071.000000 63799.000000 39816.000000 64793.000000 43186.000000 59837.000000 43701.000000 58147.000000 46615.000000 54819.000000 45310.000000 56844.000000 49921.000000 51240.000000 49451.000000 51748.000000 49764.000000 51438.000000 50135.000000 51078.000000 49473.000000 51729.000000 53949.000000 47853.000000 56069.000000 45642.000000 52758.000000 48582.000000 54948.000000 47431.000000 60034.000000 43139.000000 60532.000000 42160.000000 60406.000000 42251.000000 62941.000000 41186.000000 63866.000000 40472.000000 65562.000000 39483.000000 63495.000000 40719.000000 67190.000000 38017.000000 69565.000000 36927.000000 71133.000000 36067.000000 73966.000000 35617.000000 75537.000000 34241.000000 78079.000000 33831.000000 81057.000000 32499.000000 83569.000000 31823.000000 81908.000000 31998.000000 86780.000000 31080.000000 89383.000000 30206.000000 95351.000000 28809.000000 97135.000000 28573.000000 97874.000000 28112.000000 98987.000000 27994.000000 105179.000000 27539.000000 113548.000000 26180.000000 117512.000000 25601.000000 122572.000000 25091.000000 137286.000000 23936.000000 143452.000000 23248.000000 152922.000000 23114.000000 138583.000000 23515.000000 153673.000000 22689.000000 162458.000000 22395.000000 168478.000000 22312.000000 165900.000000 22394.000000 178070.000000 22263.000000 21320.000000 175393.000000 21603.000000 171529.000000 21990.000000 150018.000000 21630.000000 161836.000000 22598.000000 137569.000000 22589.000000 138685.000000 23684.000000 122015.000000 23262.000000 127943.000000 24240.000000 117802.000000 24935.000000 109777.000000 25611.000000 103973.000000 25591.000000 105147.000000 26018.000000 100706.000000 26593.000000 98708.000000 27233.000000 95896.000000 27592.000000 93918.000000 26672.000000 97671.000000 29385.000000 85858.000000 27689.000000 92781.000000 28871.000000 88386.000000 28632.000000 88626.000000 30434.000000 84887.000000 31049.000000 83189.000000 30626.000000 84121.000000 30680.000000 83194.000000 32414.000000 78594.000000 32621.000000 77878.000000 34631.000000 72795.000000 34101.000000 75477.000000 34992.000000 72668.000000 35692.000000 71888.000000 37209.000000 67841.000000 36608.000000 69736.000000 39456.000000 64204.000000 43070.000000 59613.000000 42151.000000 61035.000000 46036.000000 55423.000000 47885.000000 53259.000000 47341.000000 54191.000000 46841.000000 54308.000000 53270.000000 48006.000000 50989.000000 50684.000000 55306.000000 46534.000000 52194.000000 48976.000000 54132.000000 47436.000000 56272.000000 45320.000000 58435.000000 44108.000000 60446.000000 42187.000000 57648.000000 44547.000000 64453.000000 39623.000000 66628.000000 38645.000000 65807.000000 39390.000000 68713.000000 37206.000000 70212.000000 36734.000000 70712.000000 36715.000000 74655.000000 34669.000000 75190.000000 34131.000000 74044.000000 35276.000000 76039.000000 33841.000000 79608.000000 33616.000000 84418.000000 31533.000000 82706.000000 32026.000000 85829.000000 30967.000000 89022.000000 30020.000000 97026.000000 28617.000000 96042.000000 29004.000000 103620.000000 27481.000000 101380.000000 27774.000000 108086.000000 26948.000000 111363.000000 26257.000000 115640.000000 25880.000000 121211.000000 25007.000000 136892.000000 23761.000000 136267.000000 23908.000000 146955.000000 22981.000000 153124.000000 22679.000000 155090.000000 22673.000000 167974.000000 22448.000000 173643.000000 22215.000000 21408.000000 170527.000000 21459.000000 166147.000000 21888.000000 151581.000000 22108.000000 145819.000000 22426.000000 140598.000000 22401.000000 140827.000000 23661.000000 122640.000000 23479.000000 124544.000000 23984.000000 116770.000000 25483.000000 103996.000000 25698.000000 102629.000000 25836.000000 102048.000000 26026.000000 101586.000000 26302.000000 99353.000000 27982.000000 91856.000000 27097.000000 93980.000000 27991.000000 90925.000000 28612.000000 89838.000000 28898.000000 87314.000000 29651.000000 86152.000000 30947.000000 81958.000000 30609.000000 83121.000000 32116.000000 78674.000000 34500.000000 73754.000000 32462.000000 78139.000000 35159.000000 72397.000000 36982.000000 69231.000000 37253.000000 68388.000000 38448.000000 66467.000000 40819.000000 62927.000000 42294.000000 60761.000000 40523.000000 63947.000000 47608.000000 53982.000000 47474.000000 53983.000000 44643.000000 57054.000000 48427.000000 53412.000000 48969.000000 52355.000000 51727.000000 49698.000000 49251.000000 51680.000000 54387.000000 46474.000000 54244.000000 47286.000000 57853.000000 44760.000000 54250.000000 47140.000000 58577.000000 43702.000000 60031.000000 42623.000000 60243.000000 42376.000000 61941.000000 41533.000000 63582.000000 40661.000000 66811.000000 38735.000000 65258.000000 39562.000000 67147.000000 38430.000000 66411.000000 39004.000000 67671.000000 37849.000000 69294.000000 36987.000000 75640.000000 34722.000000 72426.000000 35321.000000 74473.000000 35061.000000 78237.000000 33977.000000 78262.000000 33592.000000 81921.000000 31890.000000 86844.000000 30975.000000 83828.000000 31723.000000 89597.000000 29909.000000 90558.000000 29741.000000 97834.000000 28120.000000 94649.000000 28938.000000 100686.000000 27950.000000 108973.000000 26704.000000 103869.000000 27375.000000 114027.000000 26344.000000 116166.000000 25634.000000 123091.000000 25200.000000 131552.000000 24199.000000 133679.000000 24051.000000 129964.000000 24500.000000 146449.000000 22991.000000 152820.000000 22984.000000 158665.000000 22638.000000 165073.000000 22582.000000 165815.000000 22356.000000 177300.000000 22220.000000 21408.000000 171051.000000 21980.000000 152888.000000 22452.000000 137262.000000 22845.000000 132464.000000 23096.000000 130037.000000 23890.000000 119094.000000 25400.000000 104914.000000 25828.000000 102098.000000 26012.000000 101176.000000 26102.000000 100243.000000 26840.000000 96138.000000 26536.000000 97135.000000 27097.000000 93980.000000 27799.000000 92972.000000 28095.000000 90134.000000 28797.000000 88023.000000 30036.000000 86201.000000 30525.000000 83677.000000 32241.000000 78288.000000 34413.000000 73757.000000 33567.000000 76134.000000 36472.000000 71176.000000 34858.000000 73042.000000 37979.000000 66721.000000 40891.000000 62981.000000 39635.000000 65562.000000 43864.000000 59569.000000 42568.000000 60258.000000 42452.000000 60301.000000 46497.000000 54796.000000 45520.000000 56841.000000 48946.000000 52877.000000 51249.000000 50072.000000 52306.000000 49368.000000 50917.000000 50198.000000 49476.000000 52002.000000 56444.000000 45979.000000 54069.000000 47474.000000 53073.000000 48239.000000 53603.000000 47591.000000 55116.000000 46219.000000 57852.000000 44422.000000 57150.000000 45080.000000 62679.000000 40753.000000 60183.000000 42650.000000 64355.000000 39707.000000 63442.000000 40359.000000 69194.000000 37474.000000 63118.000000 40366.000000 68401.000000 38179.000000 65713.000000 38766.000000 69206.000000 37312.000000 69715.000000 37076.000000 71966.000000 35907.000000 71105.000000 36005.000000 76551.000000 34080.000000 78186.000000 33366.000000 77128.000000 33701.000000 81915.000000 32302.000000 89077.000000 30315.000000 89908.000000 29885.000000 89572.000000 30219.000000 85756.000000 30906.000000 88412.000000 30334.000000 91289.000000 29530.000000 96497.000000 28791.000000 94182.000000 29040.000000 101910.000000 27812.000000 103266.000000 27694.000000 113026.000000 26072.000000 111485.000000 26367.000000 117934.000000 25555.000000 121374.000000 25124.000000 133268.000000 23925.000000 122359.000000 24938.000000 136008.000000 23877.000000 146406.000000 22971.000000 154577.000000 22676.000000 156028.000000 22589.000000 163410.000000 22383.000000 21317.000000 172106.000000 21602.000000 160303.000000 21933.000000 155583.000000 22468.000000 138191.000000 23178.000000 128293.000000 23606.000000 121175.000000 24057.000000 119208.000000 24969.000000 111422.000000 25289.000000 106501.000000 25968.000000 101470.000000 25864.000000 101557.000000 26453.000000 98771.000000 27097.000000 93980.000000 26803.000000 96412.000000 28281.000000 90204.000000 28461.000000 88925.000000 27958.000000 91074.000000 29371.000000 86906.000000 29609.000000 86063.000000 30114.000000 84402.000000 32425.000000 78251.000000 32581.000000 77758.000000 34148.000000 75104.000000 34531.000000 74257.000000 35031.000000 72886.000000 33324.000000 75968.000000 36374.000000 70546.000000 37639.000000 67713.000000 35111.000000 71610.000000 39910.000000 64911.000000 38423.000000 67579.000000 40166.000000 64616.000000 40469.000000 64155.000000 45451.000000 56215.000000 43148.000000 59918.000000 43452.000000 59192.000000 46256.000000 55678.000000 44906.000000 57692.000000 47832.000000 53932.000000 48448.000000 53056.000000 51041.000000 50483.000000 53934.000000 47912.000000 51756.000000 49690.000000 52371.000000 49488.000000 54928.000000 47437.000000 58489.000000 44197.000000 56074.000000 45707.000000 61198.000000 41557.000000 59744.000000 42997.000000 63336.000000 40786.000000 63741.000000 40401.000000 65571.000000 38997.000000 65524.000000 39175.000000 69531.000000 37285.000000 67648.000000 37838.000000 66674.000000 38291.000000 72936.000000 35943.000000 77505.000000 33953.000000 75548.000000 34392.000000 74030.000000 34865.000000 82136.000000 32210.000000 82490.000000 32049.000000 85515.000000 31122.000000 89899.000000 30048.000000 89511.000000 30142.000000 91751.000000 29635.000000 89247.000000 30204.000000 93768.000000 29095.000000 102220.000000 27776.000000 104476.000000 27332.000000 107639.000000 26794.000000 116729.000000 25862.000000 114667.000000 26133.000000 122073.000000 24975.000000 134506.000000 23925.000000 125758.000000 24681.000000 148803.000000 22951.000000 142469.000000 23502.000000 153124.000000 22679.000000 159692.000000 22467.000000 166654.000000 22315.000000 172958.000000 22210.000000 21343.000000 170748.000000 21408.000000 170527.000000 21578.000000 160570.000000 21719.000000 158093.000000 22190.000000 144618.000000 22457.000000 140587.000000 22562.000000 139202.000000 23720.000000 121008.000000 24266.000000 116141.000000 24857.000000 112753.000000 25380.000000 106887.000000 25784.000000 102484.000000 25589.000000 104296.000000 26181.000000 101220.000000 27088.000000 95469.000000 27488.000000 93475.000000 26728.000000 96547.000000 27233.000000 93580.000000 27219.000000 94500.000000 28844.000000 89449.000000 29881.000000 85864.000000 30489.000000 83430.000000 30788.000000 81956.000000 34219.000000 74432.000000 33612.000000 77538.000000 31540.000000 80939.000000 34560.000000 73485.000000 35974.000000 71309.000000 37522.000000 67349.000000 37475.000000 67471.000000 39286.000000 65397.000000 40110.000000 64110.000000 44620.000000 57943.000000 44832.000000 57726.000000 42604.000000 60219.000000 44231.000000 58857.000000 46290.000000 56983.000000 48193.000000 53023.000000 46842.000000 56346.000000 50379.000000 50881.000000 53115.000000 48503.000000 50898.000000 50339.000000 52489.000000 48782.000000 54954.000000 46687.000000 53677.000000 47184.000000 56083.000000 45772.000000 58808.000000 43847.000000 58046.000000 44353.000000 61138.000000 41735.000000 60090.000000 42577.000000 63915.000000 40243.000000 63760.000000 40586.000000 62993.000000 40889.000000 65781.000000 39426.000000 71357.000000 35998.000000 67460.000000 37802.000000 67266.000000 38153.000000 73706.000000 35317.000000 72881.000000 35493.000000 76267.000000 34092.000000 80180.000000 32857.000000 78591.000000 33031.000000 81040.000000 32395.000000 84418.000000 31533.000000 87035.000000 30743.000000 84913.000000 31324.000000 88834.000000 30524.000000 89185.000000 30055.000000 96707.000000 28821.000000 91728.000000 29566.000000 104029.000000 27348.000000 103745.000000 27397.000000 105495.000000 27078.000000 111945.000000 26447.000000 110625.000000 26643.000000 120051.000000 25011.000000 119277.000000 25326.000000 126136.000000 24683.000000 132501.000000 24348.000000 141466.000000 23325.000000 150542.000000 23063.000000 154574.000000 22688.000000 155801.000000 22597.000000 164802.000000 22367.000000 172958.000000 22210.000000 21353.000000 178946.000000 21408.000000 172046.000000 21615.000000 162103.000000 21846.000000 156878.000000 22310.000000 150357.000000 22652.000000 136510.000000 23145.000000 128797.000000 24255.000000 121048.000000 23633.000000 121736.000000 23944.000000 121341.000000 24441.000000 114936.000000 25090.000000 107772.000000 25624.000000 102645.000000 25954.000000 100855.000000 26092.000000 100249.000000 27097.000000 93980.000000 27346.000000 93323.000000 27689.000000 92781.000000 28662.000000 88521.000000 28300.000000 92034.000000 29984.000000 85216.000000 31100.000000 81334.000000 29670.000000 86264.000000 30022.000000 83797.000000 32006.000000 81314.000000 34339.000000 75141.000000 35231.000000 72401.000000 33116.000000 76202.000000 37096.000000 69505.000000 35257.000000 72096.000000 34575.000000 73677.000000 35706.000000 71036.000000 37070.000000 69568.000000 39675.000000 64662.000000 40512.000000 63341.000000 40272.000000 64301.000000 43333.000000 59946.000000 41243.000000 62925.000000 44595.000000 57682.000000 44972.000000 56738.000000 48621.000000 52443.000000 46695.000000 54599.000000 47626.000000 53990.000000 49825.000000 51715.000000 48643.000000 52427.000000 48512.000000 52610.000000 55122.000000 46319.000000 50700.000000 50243.000000 57828.000000 44438.000000 61216.000000 42174.000000 63123.000000 41051.000000 60406.000000 42251.000000 62564.000000 41103.000000 63622.000000 40040.000000 65626.000000 39181.000000 69862.000000 36637.000000 71899.000000 35945.000000 69524.000000 37162.000000 68231.000000 37327.000000 71326.000000 36327.000000 72870.000000 35564.000000 77536.000000 34269.000000 79667.000000 32825.000000 88707.000000 30422.000000 85625.000000 31492.000000 87184.000000 30994.000000 87749.000000 30845.000000 85637.000000 31003.000000 92207.000000 29805.000000 90341.000000 29960.000000 96715.000000 28732.000000 97156.000000 28546.000000 101621.000000 27864.000000 111934.000000 26364.000000 114765.000000 26270.000000 111994.000000 26300.000000 131838.000000 24106.000000 116556.000000 25615.000000 137719.000000 23635.000000 135088.000000 24011.000000 141180.000000 23534.000000 147856.000000 22980.000000 157037.000000 22597.000000 161955.000000 22487.000000 165713.000000 22459.000000 176280.000000 22376.000000 21307.000000 174381.000000 21839.000000 157111.000000 21669.000000 159515.000000 21987.000000 152272.000000 22452.000000 137262.000000 23082.000000 128115.000000 23912.000000 120959.000000 23974.000000 120936.000000 25068.000000 109959.000000 25616.000000 102720.000000 26840.000000 96138.000000 26841.000000 95715.000000 27097.000000 93980.000000 28720.000000 87916.000000 29701.000000 87310.000000 28762.000000 87714.000000 29866.000000 84290.000000 30917.000000 82142.000000 30186.000000 83846.000000 34232.000000 76819.000000 32235.000000 78844.000000 32441.000000 78738.000000 35424.000000 71118.000000 34319.000000 75015.000000 34791.000000 73237.000000 36148.000000 70687.000000 38338.000000 67442.000000 36839.000000 69135.000000 41278.000000 61854.000000 37709.000000 68566.000000 40251.000000 63757.000000 41563.000000 61751.000000 42218.000000 60233.000000 41973.000000 61228.000000 44188.000000 58639.000000 47049.000000 54241.000000 46525.000000 55946.000000 48486.000000 53226.000000 46007.000000 56065.000000 51777.000000 50375.000000 49444.000000 52206.000000 52424.000000 48574.000000 56213.000000 45911.000000 56907.000000 45332.000000 52605.000000 48547.000000 61355.000000 42148.000000 60283.000000 42614.000000 61413.000000 41975.000000 58248.000000 44331.000000 67299.000000 38159.000000 65353.000000 38939.000000 64876.000000 39731.000000 67648.000000 37838.000000 71084.000000 36295.000000 72606.000000 35776.000000 70459.000000 36398.000000 72071.000000 35799.000000 77913.000000 33696.000000 79011.000000 33336.000000 80284.000000 32681.000000 78319.000000 33457.000000 81059.000000 32288.000000 83630.000000 31341.000000 88884.000000 30464.000000 89154.000000 30202.000000 89732.000000 30044.000000 93176.000000 29282.000000 99019.000000 28247.000000 96855.000000 28564.000000 99846.000000 28057.000000 107292.000000 26824.000000 114172.000000 25931.000000 116298.000000 25818.000000 118957.000000 25225.000000 125987.000000 24466.000000 138079.000000 23751.000000 144616.000000 23265.000000 147094.000000 22964.000000 146955.000000 22981.000000 151077.000000 22913.000000 159465.000000 22475.000000 161331.000000 22443.000000 173558.000000 22177.000000 21282.000000 178446.000000 21560.000000 164010.000000 21513.000000 167724.000000 22020.000000 151355.000000 22223.000000 143318.000000 22823.000000 134190.000000 23400.000000 128898.000000 23465.000000 126808.000000 24636.000000 114357.000000 25029.000000 109590.000000 25756.000000 103289.000000 25933.000000 103108.000000 26184.000000 102153.000000 26382.000000 97986.000000 26906.000000 96217.000000 27297.000000 94705.000000 27303.000000 94163.000000 28339.000000 89599.000000 29418.000000 86153.000000 31490.000000 80873.000000 31204.000000 81375.000000 34620.000000 73635.000000 33724.000000 75789.000000 33302.000000 76552.000000 35659.000000 72150.000000 37374.000000 68241.000000 36977.000000 68916.000000 41438.000000 61625.000000 36820.000000 68937.000000 43498.000000 59862.000000 40588.000000 62972.000000 44760.000000 57183.000000 45484.000000 56480.000000 46362.000000 55430.000000 40167.000000 63753.000000 47432.000000 53885.000000 46785.000000 54531.000000 47945.000000 52891.000000 48252.000000 52440.000000 51886.000000 49402.000000 52375.000000 49235.000000 55557.000000 46005.000000 54620.000000 48137.000000 55863.000000 45691.000000 60129.000000 42934.000000 62678.000000 40910.000000 64189.000000 39598.000000 66101.000000 38270.000000 63305.000000 40272.000000 66027.000000 38446.000000 69359.000000 37194.000000 67390.000000 37658.000000 71643.000000 35834.000000 75699.000000 34359.000000 79488.000000 33319.000000 75706.000000 34338.000000 80492.000000 32567.000000 85475.000000 31172.000000 87449.000000 30993.000000 87801.000000 30358.000000 91738.000000 29612.000000 97338.000000 28674.000000 93476.000000 29183.000000 102713.000000 27702.000000 105587.000000 27401.000000 114779.000000 25605.000000 115902.000000 25589.000000 126059.000000 24942.000000 133584.000000 24019.000000 148892.000000 23326.000000 151415.000000 22929.000000 154577.000000 22676.000000 152651.000000 22804.000000 166317.000000 22361.000000 181548.000000 22332.000000 21320.000000 175393.000000 21370.000000 167892.000000 22030.000000 148485.000000 22218.000000 146618.000000 22439.000000 138224.000000 23312.000000 128814.000000 24418.000000 113803.000000 24026.000000 118264.000000 24218.000000 116152.000000 25448.000000 105212.000000 25588.000000 103186.000000 26351.000000 99586.000000 26027.000000 101104.000000 26699.000000 97649.000000 27961.000000 93333.000000 28203.000000 89999.000000 28007.000000 92061.000000 26810.000000 96556.000000 27544.000000 94243.000000 29130.000000 88072.000000 28623.000000 88180.000000 30542.000000 84075.000000 30285.000000 84316.000000 30842.000000 82938.000000 32898.000000 77713.000000 32318.000000 79027.000000 31923.000000 79437.000000 31327.000000 81023.000000 33456.000000 75475.000000 34989.000000 71747.000000 37257.000000 68161.000000 36396.000000 70216.000000 36479.000000 69830.000000 36431.000000 69908.000000 38428.000000 66714.000000 37944.000000 67261.000000 37617.000000 67272.000000 40731.000000 62474.000000 42197.000000 61546.000000 42845.000000 59969.000000 44439.000000 58099.000000 44668.000000 57436.000000 44519.000000 58047.000000 48746.000000 53345.000000 45867.000000 55528.000000 51315.000000 49416.000000 54590.000000 47053.000000 53022.000000 49157.000000 56225.000000 45778.000000 55987.000000 45860.000000 56780.000000 45010.000000 56660.000000 45455.000000 60423.000000 42684.000000 61889.000000 41236.000000 64228.000000 40472.000000 60607.000000 42571.000000 65471.000000 38950.000000 61313.000000 42336.000000 66147.000000 38657.000000 64616.000000 39605.000000 69827.000000 37140.000000 70718.000000 36504.000000 70420.000000 36584.000000 70941.000000 36172.000000 77436.000000 33854.000000 79234.000000 33235.000000 78176.000000 33274.000000 83288.000000 31931.000000 87875.000000 30573.000000 84999.000000 31674.000000 94277.000000 29029.000000 93525.000000 29406.000000 91148.000000 29668.000000 100749.000000 28188.000000 101441.000000 27738.000000 108600.000000 26666.000000 116258.000000 25795.000000 118134.000000 25393.000000 133604.000000 23984.000000 124534.000000 24681.000000 147928.000000 23083.000000 147045.000000 23165.000000 153812.000000 22672.000000 152651.000000 22804.000000 162377.000000 22478.000000 170660.000000 22224.000000 21292.000000 176171.000000 21436.000000 170273.000000 21577.000000 159478.000000 22213.000000 146188.000000 22519.000000 141735.000000 23145.000000 128797.000000 22864.000000 132565.000000 23620.000000 125192.000000 24424.000000 113786.000000 25415.000000 105121.000000 25620.000000 103804.000000 25784.000000 103599.000000 26086.000000 99559.000000 26389.000000 99104.000000 27428.000000 94315.000000 28584.000000 88316.000000 27950.000000 91951.000000 28720.000000 87916.000000 28445.000000 88981.000000 29342.000000 86504.000000 29594.000000 85045.000000 31143.000000 81715.000000 32560.000000 77490.000000 32113.000000 78682.000000 35424.000000 71118.000000 34459.000000 73198.000000 34085.000000 74435.000000 37494.000000 67445.000000 35914.000000 70141.000000 35792.000000 70278.000000 39291.000000 64584.000000 40129.000000 63327.000000 43656.000000 58642.000000 42688.000000 60646.000000 43473.000000 59091.000000 44447.000000 58050.000000 45814.000000 56890.000000 46351.000000 56650.000000 48659.000000 52918.000000 48939.000000 52126.000000 51212.000000 50069.000000 52171.000000 49857.000000 54231.000000 47121.000000 54963.000000 46732.000000 54100.000000 47381.000000 57445.000000 44816.000000 60613.000000 42560.000000 56217.000000 46091.000000 59021.000000 43252.000000 61596.000000 41297.000000 64422.000000 40362.000000 61350.000000 41591.000000 64901.000000 39289.000000 66251.000000 38244.000000 67390.000000 37658.000000 67504.000000 37648.000000 69293.000000 37109.000000 71495.000000 36215.000000 71722.000000 35701.000000 76439.000000 34612.000000 73090.000000 35426.000000 74033.000000 35295.000000 81475.000000 32586.000000 78564.000000 33547.000000 80691.000000 32870.000000 91300.000000 29800.000000 90545.000000 30382.000000 84516.000000 31206.000000 93854.000000 29397.000000 95362.000000 28987.000000 95975.000000 28695.000000 96075.000000 28654.000000 106985.000000 27028.000000 119342.000000 25201.000000 115002.000000 25671.000000 127528.000000 24855.000000 132101.000000 24209.000000 138735.000000 23505.000000 144172.000000 23259.000000 158310.000000 22636.000000 155090.000000 22673.000000 168389.000000 22259.000000 163869.000000 22491.000000 174223.000000 22193.000000 21282.000000 178446.000000 21500.000000 169524.000000 21680.000000 158903.000000 21585.000000 160574.000000 22232.000000 146289.000000 22740.000000 137660.000000 22841.000000 134946.000000 23617.000000 127765.000000 23896.000000 117595.000000 25415.000000 105121.000000 25609.000000 103837.000000 25968.000000 101470.000000 25883.000000 102532.000000 26541.000000 99584.000000 26688.000000 96994.000000 27365.000000 93983.000000 28695.000000 89172.000000 27175.000000 94185.000000 27962.000000 92475.000000 29302.000000 87377.000000 28809.000000 88149.000000 29991.000000 84513.000000 29971.000000 85000.000000 29775.000000 86887.000000 31283.000000 82138.000000 31957.000000 79175.000000 32871.000000 77113.000000 33658.000000 74893.000000 36357.000000 70547.000000 37234.000000 68643.000000 37307.000000 68260.000000 40210.000000 64124.000000 41029.000000 62513.000000 42783.000000 59966.000000 39883.000000 65283.000000 44425.000000 58082.000000 44094.000000 58910.000000 45815.000000 56219.000000 46053.000000 56031.000000 50063.000000 51290.000000 47996.000000 54458.000000 51456.000000 49471.000000 56790.000000 45536.000000 58452.000000 44592.000000 52963.000000 48558.000000 60827.000000 42612.000000 59892.000000 43312.000000 62560.000000 41143.000000 61926.000000 41548.000000 69048.000000 37281.000000 64901.000000 39165.000000 67605.000000 38057.000000 73046.000000 35294.000000 71423.000000 35975.000000 68914.000000 37960.000000 69492.000000 36880.000000 74100.000000 35069.000000 72943.000000 35408.000000 79332.000000 33301.000000 81076.000000 32220.000000 84608.000000 31602.000000 82743.000000 32198.000000 87358.000000 30682.000000 84939.000000 31071.000000 89672.000000 29876.000000 90897.000000 29792.000000 99044.000000 28295.000000 101376.000000 28178.000000 107999.000000 26795.000000 111977.000000 26483.000000 119960.000000 25551.000000 114193.000000 25886.000000 112288.000000 26241.000000 132453.000000 24091.000000 131468.000000 24484.000000 136184.000000 23774.000000 144577.000000 23174.000000 146406.000000 22971.000000 155801.000000 22597.000000 175744.000000 22278.000000 21282.000000 178446.000000 21317.000000 172106.000000 21692.000000 158432.000000 21654.000000 161053.000000 22220.000000 147665.000000 22452.000000 137262.000000 23122.000000 128988.000000 24146.000000 120796.000000 24488.000000 114883.000000 24427.000000 116378.000000 25548.000000 107396.000000 25714.000000 101528.000000 25942.000000 101456.000000 26150.000000 100093.000000 27233.000000 93580.000000 27926.000000 90828.000000 29221.000000 86785.000000 29882.000000 85764.000000 27097.000000 93980.000000 29106.000000 87957.000000 30084.000000 84397.000000 30781.000000 82021.000000 31391.000000 80535.000000 33640.000000 75723.000000 33778.000000 75488.000000 34373.000000 74471.000000 35419.000000 72098.000000 38073.000000 66952.000000 36514.000000 69373.000000 42392.000000 60205.000000 41112.000000 62799.000000 43620.000000 59575.000000 43810.000000 58779.000000 43981.000000 57972.000000 46532.000000 56087.000000 48278.000000 53158.000000 48177.000000 53270.000000 49095.000000 52221.000000 48360.000000 53036.000000 51814.000000 49270.000000 51357.000000 50091.000000 54170.000000 48549.000000 58041.000000 44403.000000 56935.000000 45333.000000 58242.000000 43664.000000 60087.000000 42626.000000 57718.000000 44753.000000 60001.000000 42925.000000 64187.000000 39814.000000 66339.000000 39124.000000 65142.000000 39623.000000 66050.000000 39216.000000 66390.000000 38937.000000 70109.000000 36681.000000 73192.000000 35321.000000 71340.000000 36224.000000 72971.000000 35970.000000 69729.000000 36962.000000 78787.000000 33197.000000 80516.000000 32535.000000 85948.000000 30870.000000 85057.000000 31458.000000 82612.000000 31819.000000 92655.000000 29230.000000 90745.000000 29887.000000 95483.000000 28749.000000 101989.000000 27704.000000 106111.000000 27452.000000 109334.000000 26608.000000 109928.000000 26605.000000 111889.000000 26590.000000 120051.000000 25011.000000 123092.000000 24844.000000 128051.000000 24297.000000 141192.000000 23680.000000 146206.000000 23062.000000 147467.000000 23004.000000 159692.000000 22467.000000 163183.000000 22391.000000 170116.000000 22269.000000 21305.000000 173801.000000 21470.000000 170136.000000 21849.000000 154241.000000 21682.000000 161542.000000 22044.000000 151609.000000 22527.000000 139802.000000 23572.000000 123441.000000 23151.000000 132205.000000 23358.000000 124490.000000 24194.000000 119181.000000 24707.000000 111085.000000 25718.000000 103170.000000 25716.000000 103236.000000 26190.000000 101339.000000 26822.000000 96204.000000 27364.000000 93257.000000 26382.000000 97986.000000 27036.000000 94886.000000 28564.000000 89525.000000 27219.000000 94500.000000 28203.000000 89999.000000 30240.000000 85489.000000 28911.000000 87568.000000 29747.000000 86033.000000 31692.000000 80391.000000 33409.000000 76366.000000 31040.000000 81484.000000 33559.000000 75881.000000 34356.000000 74711.000000 35164.000000 72804.000000 36327.000000 70688.000000 37016.000000 68721.000000 37631.000000 68330.000000 38888.000000 65439.000000 38645.000000 66270.000000 38287.000000 67354.000000 42253.000000 61938.000000 42466.000000 60393.000000 45511.000000 56708.000000 43746.000000 58840.000000 46006.000000 56054.000000 46351.000000 55621.000000 51561.000000 49390.000000 49129.000000 52686.000000 49413.000000 52241.000000 47589.000000 53648.000000 50468.000000 50740.000000 56381.000000 45410.000000 53058.000000 48294.000000 56326.000000 46079.000000 59027.000000 43723.000000 59233.000000 43165.000000 62114.000000 41421.000000 59109.000000 43205.000000 62370.000000 41253.000000 60075.000000 42646.000000 63212.000000 40844.000000 65843.000000 39310.000000 66027.000000 38446.000000 65321.000000 39647.000000 66813.000000 37837.000000 70612.000000 36622.000000 71281.000000 36157.000000 73709.000000 35301.000000 70856.000000 36524.000000 77771.000000 33735.000000 79989.000000 32674.000000 79213.000000 32860.000000 79932.000000 32814.000000 89804.000000 30377.000000 82730.000000 31699.000000 84556.000000 31146.000000 85765.000000 31074.000000 92187.000000 29918.000000 90071.000000 29920.000000 95723.000000 28672.000000 106203.000000 26979.000000 101726.000000 27592.000000 111700.000000 26235.000000 115132.000000 25727.000000 118130.000000 25392.000000 133584.000000 24019.000000 131078.000000 24286.000000 137044.000000 23699.000000 143054.000000 23292.000000 146179.000000 22979.000000 156171.000000 22585.000000 160892.000000 22540.000000 165632.000000 22356.000000 21296.000000 177406.000000 21461.000000 166837.000000 21626.000000 161831.000000 21951.000000 150365.000000 22748.000000 137371.000000 22407.000000 144147.000000 23367.000000 124823.000000 23455.000000 123745.000000 24455.000000 113823.000000 25038.000000 107951.000000 24469.000000 113358.000000 25998.000000 100775.000000 26317.000000 98596.000000 26490.000000 97618.000000 27505.000000 94329.000000 27871.000000 92676.000000 28203.000000 89999.000000 28421.000000 89230.000000 30173.000000 84564.000000 29674.000000 85539.000000 30409.000000 83774.000000 31264.000000 81329.000000 33324.000000 75968.000000 32900.000000 76763.000000 31836.000000 79582.000000 33263.000000 76175.000000 34319.000000 74428.000000 36585.000000 69648.000000 36660.000000 69393.000000 38166.000000 67004.000000 38844.000000 65841.000000 41630.000000 61615.000000 42539.000000 60244.000000 44141.000000 58215.000000 42150.000000 61214.000000 45961.000000 56602.000000 43954.000000 59420.000000 48475.000000 52987.000000 46993.000000 54245.000000 51470.000000 50613.000000 51637.000000 49751.000000 48721.000000 52290.000000 53599.000000 47685.000000 53038.000000 48389.000000 57027.000000 44975.000000 54476.000000 46854.000000 59237.000000 43360.000000 60615.000000 42192.000000 64105.000000 40370.000000 60981.000000 41883.000000 62408.000000 41470.000000 64866.000000 39514.000000 64405.000000 39635.000000 67460.000000 37682.000000 66872.000000 38072.000000 69398.000000 37520.000000 70826.000000 36148.000000 75190.000000 34131.000000 81741.000000 32631.000000 80183.000000 33271.000000 83507.000000 32101.000000 85637.000000 31003.000000 89355.000000 30874.000000 90197.000000 29957.000000 102735.000000 27861.000000 96287.000000 28631.000000 106419.000000 27073.000000 111247.000000 26239.000000 114197.000000 25897.000000 118627.000000 25654.000000 119107.000000 25532.000000 124683.000000 24979.000000 138176.000000 23817.000000 139743.000000 23492.000000 144559.000000 23272.000000 156209.000000 22989.000000 158320.000000 22512.000000 166176.000000 22311.000000 172958.000000 22210.000000 21730.000000 162812.000000 21539.000000 163126.000000 21434.000000 167667.000000 21965.000000 154995.000000 22203.000000 143755.000000 23076.000000 132087.000000 23411.000000 126068.000000 23251.000000 127553.000000 24773.000000 113510.000000 24284.000000 116372.000000 25255.000000 105304.000000 25176.000000 108541.000000 25975.000000 102015.000000 26424.000000 98408.000000 26251.000000 101847.000000 27219.000000 94500.000000 26649.000000 97263.000000 28238.000000 90921.000000 28003.000000 92680.000000 28452.000000 89191.000000 29919.000000 85396.000000 31113.000000 82683.000000 32767.000000 77089.000000 34245.000000 74800.000000 34989.000000 71747.000000 34952.000000 73456.000000 36346.000000 70085.000000 37049.000000 69465.000000 38054.000000 67184.000000 40204.000000 64057.000000 43222.000000 59702.000000 44276.000000 57973.000000 41948.000000 61171.000000 44082.000000 59102.000000 45325.000000 56538.000000 47041.000000 53620.000000 49263.000000 51931.000000 49997.000000 51564.000000 52302.000000 49574.000000 55171.000000 46664.000000 54299.000000 47589.000000 53641.000000 47644.000000 57605.000000 44875.000000 60438.000000 43084.000000 57044.000000 45187.000000 58233.000000 44276.000000 58980.000000 43769.000000 65787.000000 38932.000000 63841.000000 40431.000000 67290.000000 38024.000000 64299.000000 39892.000000 69731.000000 36951.000000 68231.000000 37327.000000 70115.000000 36395.000000 75190.000000 34131.000000 78021.000000 33399.000000 79367.000000 33236.000000 82138.000000 32319.000000 86457.000000 30862.000000 84079.000000 31594.000000 85763.000000 31197.000000 89563.000000 30085.000000 96481.000000 28906.000000 91064.000000 29600.000000 102359.000000 27701.000000 95182.000000 28974.000000 99052.000000 28033.000000 115410.000000 26055.000000 116232.000000 25695.000000 115434.000000 25727.000000 118826.000000 25482.000000 124196.000000 24771.000000 140757.000000 23554.000000 135814.000000 23811.000000 144059.000000 23322.000000 148664.000000 22968.000000 153124.000000 22679.000000 158310.000000 22636.000000 169074.000000 22264.000000 166550.000000 22381.000000 176436.000000 22141.000000 21320.000000 175393.000000 21404.000000 170811.000000 21973.000000 149794.000000 22213.000000 146398.000000 22265.000000 142174.000000 22761.000000 132447.000000 23361.000000 125534.000000 24091.000000 118967.000000 24183.000000 117299.000000 24828.000000 110580.000000 24518.000000 112581.000000 25775.000000 102404.000000 25711.000000 102933.000000 26695.000000 97381.000000 26382.000000 97986.000000 27592.000000 93918.000000 27097.000000 93980.000000 28584.000000 88316.000000 30251.000000 85114.000000 30360.000000 84664.000000 28445.000000 88981.000000 30673.000000 83196.000000 33243.000000 77906.000000 33864.000000 75403.000000 33793.000000 75675.000000 34435.000000 73599.000000 33988.000000 74887.000000 37427.000000 69433.000000 39268.000000 66352.000000 36591.000000 69600.000000 36195.000000 70937.000000 39491.000000 64834.000000 41282.000000 63543.000000 44181.000000 58092.000000 44333.000000 57767.000000 42638.000000 60105.000000 45658.000000 56633.000000 45926.000000 55179.000000 47476.000000 54331.000000 50279.000000 50935.000000 50190.000000 52127.000000 50423.000000 50454.000000 54121.000000 48237.000000 51097.000000 49683.000000 52833.000000 49124.000000 54355.000000 47891.000000 56789.000000 45717.000000 57564.000000 44858.000000 59030.000000 43454.000000 61691.000000 41956.000000 66496.000000 38850.000000 60272.000000 42793.000000 62690.000000 40948.000000 63237.000000 40501.000000 66705.000000 38050.000000 65195.000000 40311.000000 69290.000000 37380.000000 72218.000000 36129.000000 68920.000000 37510.000000 71342.000000 36181.000000 72584.000000 35958.000000 74950.000000 34590.000000 74761.000000 35098.000000 82488.000000 32162.000000 84556.000000 31146.000000 83630.000000 31341.000000 89421.000000 30064.000000 87863.000000 30608.000000 92784.000000 29379.000000 93645.000000 29170.000000 95212.000000 29098.000000 100644.000000 27870.000000 98402.000000 28398.000000 109993.000000 26877.000000 112434.000000 26168.000000 125602.000000 24912.000000 116109.000000 26002.000000 121433.000000 25070.000000 125877.000000 24549.000000 140409.000000 23436.000000 138300.000000 23624.000000 146867.000000 22972.000000 153812.000000 22672.000000 153370.000000 22815.000000 165522.000000 22391.000000 172902.000000 22337.000000 21409.000000 171103.000000 21754.000000 155808.000000 21942.000000 155549.000000 22895.000000 135357.000000 22882.000000 136714.000000 23877.000000 121962.000000 24248.000000 117881.000000 24871.000000 112154.000000 25476.000000 107056.000000 26096.000000 102244.000000 26125.000000 100144.000000 26379.000000 100088.000000 26931.000000 96432.000000 26810.000000 96848.000000 27631.000000 93388.000000 27973.000000 92235.000000 28798.000000 88121.000000 29328.000000 86433.000000 28788.000000 90636.000000 28971.000000 87344.000000 30791.000000 82445.000000 32417.000000 81409.000000 31124.000000 81964.000000 33751.000000 75229.000000 32984.000000 76695.000000 32790.000000 77977.000000 35789.000000 70729.000000 37104.000000 70158.000000 33644.000000 75733.000000 34843.000000 72536.000000 38011.000000 67675.000000 38340.000000 67598.000000 40651.000000 63430.000000 37583.000000 68409.000000 40038.000000 64875.000000 41913.000000 61362.000000 40927.000000 62719.000000 45164.000000 56487.000000 44861.000000 56791.000000 46177.000000 55122.000000 48405.000000 52721.000000 47639.000000 54098.000000 51164.000000 50657.000000 51212.000000 49311.000000 54439.000000 47610.000000 52736.000000 48797.000000 55566.000000 46421.000000 58215.000000 44297.000000 60602.000000 42508.000000 58977.000000 43816.000000 60590.000000 42738.000000 63809.000000 40145.000000 69040.000000 37728.000000 67794.000000 37859.000000 66804.000000 38769.000000 72541.000000 35480.000000 72183.000000 35571.000000 73293.000000 35185.000000 75096.000000 34370.000000 80104.000000 33080.000000 78691.000000 34109.000000 83833.000000 32255.000000 81656.000000 32344.000000 84130.000000 31375.000000 84516.000000 31206.000000 94010.000000 29141.000000 93388.000000 29602.000000 105474.000000 27256.000000 99804.000000 28044.000000 102672.000000 27724.000000 112572.000000 26192.000000 119240.000000 25480.000000 127776.000000 24423.000000 124045.000000 24877.000000 134733.000000 23917.000000 143038.000000 23506.000000 145968.000000 23245.000000 147888.000000 22966.000000 155801.000000 22597.000000 160653.000000 22480.000000 175164.000000 22272.000000 179307.000000 22247.000000 21621.000000 174190.000000 21711.000000 171735.000000 21976.000000 156109.000000 22181.000000 145201.000000 22598.000000 136287.000000 23423.000000 127391.000000 23671.000000 120482.000000 24409.000000 113944.000000 25164.000000 109429.000000 25600.000000 103406.000000 25220.000000 106663.000000 26419.000000 99593.000000 25944.000000 103006.000000 27770.000000 93085.000000 26574.000000 97398.000000 27295.000000 95544.000000 26577.000000 97129.000000 27374.000000 94290.000000 28908.000000 88290.000000 28910.000000 87414.000000 30650.000000 83060.000000 30206.000000 83563.000000 31177.000000 81107.000000 32858.000000 77863.000000 33914.000000 76098.000000 36119.000000 70664.000000 35293.000000 71914.000000 34935.000000 72158.000000 35325.000000 71272.000000 39586.000000 64919.000000 36187.000000 70108.000000 40850.000000 62192.000000 39919.000000 64543.000000 41883.000000 61326.000000 43846.000000 58347.000000 42829.000000 59917.000000 45488.000000 56723.000000 46289.000000 55857.000000 48118.000000 52879.000000 46766.000000 54662.000000 50299.000000 50728.000000 48732.000000 52544.000000 54638.000000 47165.000000 57234.000000 45894.000000 55191.000000 46576.000000 59890.000000 42987.000000 63932.000000 40376.000000 65076.000000 39218.000000 61495.000000 41732.000000 58825.000000 43828.000000 64189.000000 39891.000000 67277.000000 37804.000000 66927.000000 38625.000000 68405.000000 37414.000000 72112.000000 35834.000000 71814.000000 36086.000000 74124.000000 34532.000000 78455.000000 33901.000000 77826.000000 34327.000000 75187.000000 34502.000000 79989.000000 32674.000000 79421.000000 33700.000000 81527.000000 32188.000000 84685.000000 31368.000000 90492.000000 29795.000000 90333.000000 29861.000000 93662.000000 29374.000000 98818.000000 28359.000000 100864.000000 27832.000000 94499.000000 28924.000000 104405.000000 27237.000000 107982.000000 26808.000000 117940.000000 25479.000000 114779.000000 25605.000000 130486.000000 24493.000000 133863.000000 24243.000000 124476.000000 24687.000000 145199.000000 23404.000000 148284.000000 22902.000000 159692.000000 22467.000000 168916.000000 22345.000000 165987.000000 22435.000000 177206.000000 22184.000000 21282.000000 178446.000000 21345.000000 171328.000000 21743.000000 156080.000000 21899.000000 154534.000000 22247.000000 150114.000000 22292.000000 142002.000000 23261.000000 125192.000000 24359.000000 117883.000000 24519.000000 114531.000000 24680.000000 112594.000000 25600.000000 103406.000000 26193.000000 100809.000000 26287.000000 99392.000000 26745.000000 96950.000000 27840.000000 93256.000000 27074.000000 96443.000000 28203.000000 89999.000000 28723.000000 87850.000000 29609.000000 85798.000000 30775.000000 84044.000000 31561.000000 80839.000000 33116.000000 76913.000000 31014.000000 81633.000000 36364.000000 69884.000000 34397.000000 73635.000000 35926.000000 70981.000000 36620.000000 68996.000000 39232.000000 66203.000000 40990.000000 63310.000000 39428.000000 64210.000000 42671.000000 60211.000000 42022.000000 62428.000000 44188.000000 58177.000000 44921.000000 57213.000000 45219.000000 56664.000000 46658.000000 54877.000000 47642.000000 54030.000000 50575.000000 51077.000000 48877.000000 51779.000000 48357.000000 53222.000000 52182.000000 49195.000000 56767.000000 45444.000000 53768.000000 48526.000000 59012.000000 43348.000000 57180.000000 45161.000000 60205.000000 42987.000000 63778.000000 40318.000000 60510.000000 42500.000000 62178.000000 41129.000000 66569.000000 38582.000000 65290.000000 39091.000000 66486.000000 38872.000000 67296.000000 38092.000000 71445.000000 36428.000000 70147.000000 37001.000000 70419.000000 36593.000000 67999.000000 37505.000000 73685.000000 35234.000000 74996.000000 34743.000000 80940.000000 32529.000000 80056.000000 32946.000000 78591.000000 33031.000000 83089.000000 32104.000000 87836.000000 30544.000000 86422.000000 31406.000000 88697.000000 30417.000000 90558.000000 29741.000000 89732.000000 30044.000000 90842.000000 29701.000000 98759.000000 28441.000000 102323.000000 27648.000000 106854.000000 26760.000000 115277.000000 25831.000000 115755.000000 25749.000000 120994.000000 25088.000000 137719.000000 23635.000000 143254.000000 23201.000000 147137.000000 22984.000000 153889.000000 22683.000000 159272.000000 22521.000000 169647.000000 22235.000000 21552.000000 165258.000000 22631.000000 134339.000000 23339.000000 124447.000000 23131.000000 127508.000000 23473.000000 124391.000000 24066.000000 119314.000000 25807.000000 103679.000000 26384.000000 99446.000000 26053.000000 100010.000000 26545.000000 97288.000000 27355.000000 94100.000000 27840.000000 92955.000000 28444.000000 90128.000000 28160.000000 91407.000000 28173.000000 90339.000000 28748.000000 89055.000000 29822.000000 85329.000000 31214.000000 82140.000000 30084.000000 84397.000000 31512.000000 79864.000000 32185.000000 78475.000000 34616.000000 73912.000000 33107.000000 76362.000000 33638.000000 74953.000000 36227.000000 69649.000000 37130.000000 69466.000000 35548.000000 72232.000000 39124.000000 65914.000000 38847.000000 65957.000000 43537.000000 58954.000000 40045.000000 64214.000000 40321.000000 63532.000000 40593.000000 62715.000000 47720.000000 54913.000000 45474.000000 56284.000000 42837.000000 60190.000000 47398.000000 55088.000000 45731.000000 55654.000000 48771.000000 52697.000000 48827.000000 52058.000000 51583.000000 49837.000000 53636.000000 48407.000000 56598.000000 45656.000000 60048.000000 43029.000000 57684.000000 45170.000000 63440.000000 40502.000000 59777.000000 43872.000000 61283.000000 42459.000000 62089.000000 41031.000000 65970.000000 38977.000000 65941.000000 39318.000000 64480.000000 39696.000000 67701.000000 38553.000000 67768.000000 37799.000000 69096.000000 37340.000000 70646.000000 36522.000000 68935.000000 37544.000000 72139.000000 35837.000000 76246.000000 34600.000000 77699.000000 34021.000000 76690.000000 34280.000000 79740.000000 32862.000000 91976.000000 29853.000000 88589.000000 31150.000000 91580.000000 29993.000000 90965.000000 30070.000000 84280.000000 31197.000000 95914.000000 28893.000000 99311.000000 28093.000000 98835.000000 28214.000000 103204.000000 27567.000000 104259.000000 27277.000000 103035.000000 27657.000000 114363.000000 25945.000000 115299.000000 25839.000000 124525.000000 24799.000000 125974.000000 24407.000000 143983.000000 23115.000000 146955.000000 22981.000000 154724.000000 22785.000000 158674.000000 22672.000000 166788.000000 22377.000000 169722.000000 22308.000000 178070.000000 22263.000000 21327.000000 169236.000000 21705.000000 159728.000000 22025.000000 153938.000000 22327.000000 144934.000000 22666.000000 138581.000000 22848.000000 132421.000000 23136.000000 131548.000000 23887.000000 118504.000000 23782.000000 119324.000000 24957.000000 109955.000000 25748.000000 101865.000000 25513.000000 104091.000000 26279.000000 99293.000000 27767.000000 91990.000000 26319.000000 98199.000000 28417.000000 89804.000000 27332.000000 94754.000000 27617.000000 92293.000000 28967.000000 87494.000000 28762.000000 87714.000000 30875.000000 82621.000000 28911.000000 87568.000000 31577.000000 80999.000000 30171.000000 83847.000000 31119.000000 81851.000000 34558.000000 73044.000000 34309.000000 74041.000000 35313.000000 71747.000000 33513.000000 75852.000000 37337.000000 68837.000000 39800.000000 64858.000000 39111.000000 65553.000000 38674.000000 66222.000000 40807.000000 62805.000000 42840.000000 59583.000000 44787.000000 57364.000000 45305.000000 57152.000000 45563.000000 56654.000000 43824.000000 58325.000000 48252.000000 52948.000000 47185.000000 54568.000000 48804.000000 52087.000000 51768.000000 49493.000000 54370.000000 47106.000000 56492.000000 44942.000000 52756.000000 48624.000000 60181.000000 42319.000000 58266.000000 44414.000000 61491.000000 42084.000000 61165.000000 42160.000000 65260.000000 39207.000000 66995.000000 38877.000000 62912.000000 40759.000000 68790.000000 37644.000000 67887.000000 37797.000000 72067.000000 35588.000000 70714.000000 36700.000000 74932.000000 35075.000000 77199.000000 33488.000000 76673.000000 33899.000000 80747.000000 32759.000000 83537.000000 31801.000000 84985.000000 31487.000000 88347.000000 30392.000000 91667.000000 29641.000000 92799.000000 29297.000000 104288.000000 27481.000000 102528.000000 27695.000000 110367.000000 26374.000000 118618.000000 25227.000000 125608.000000 24517.000000 134952.000000 24073.000000 140647.000000 23634.000000 138622.000000 23831.000000 146179.000000 22979.000000 155518.000000 22953.000000 162458.000000 22395.000000 164175.000000 22387.000000 173643.000000 22215.000000 21376.000000 172779.000000 21409.000000 171103.000000 21718.000000 160290.000000 21763.000000 156016.000000 22432.000000 141631.000000 22109.000000 151668.000000 23024.000000 133625.000000 23103.000000 130074.000000 23665.000000 121469.000000 24714.000000 110159.000000 25820.000000 104771.000000 26022.000000 103249.000000 26175.000000 100530.000000 27108.000000 94992.000000 27226.000000 94658.000000 26980.000000 96006.000000 27506.000000 94462.000000 26382.000000 97986.000000 27856.000000 92763.000000 28546.000000 89459.000000 28883.000000 88946.000000 29170.000000 86559.000000 29277.000000 86312.000000 29964.000000 85051.000000 30292.000000 83176.000000 31171.000000 81440.000000 32711.000000 77984.000000 33916.000000 75503.000000 34898.000000 72317.000000 36539.000000 69317.000000 36822.000000 68790.000000 40097.000000 63570.000000 38565.000000 65828.000000 41634.000000 62587.000000 44923.000000 56345.000000 44082.000000 57992.000000 42945.000000 59586.000000 43817.000000 58042.000000 42845.000000 60035.000000 47454.000000 53429.000000 49267.000000 51952.000000 46482.000000 54397.000000 51660.000000 50688.000000 53409.000000 48060.000000 54518.000000 47262.000000 56849.000000 44960.000000 59632.000000 42888.000000 61035.000000 42794.000000 59491.000000 43861.000000 58265.000000 44479.000000 66007.000000 38616.000000 65890.000000 39378.000000 61092.000000 42283.000000 62967.000000 40707.000000 67308.000000 37813.000000 70481.000000 36596.000000 70015.000000 36761.000000 71993.000000 36186.000000 72426.000000 35618.000000 69676.000000 37095.000000 77451.000000 33468.000000 75196.000000 34584.000000 76392.000000 33945.000000 79816.000000 33267.000000 83529.000000 31993.000000 87634.000000 30753.000000 83630.000000 31341.000000 96683.000000 28565.000000 85206.000000 31002.000000 90897.000000 29792.000000 98594.000000 28380.000000 101339.000000 27757.000000 105054.000000 27357.000000 109957.000000 27012.000000 110317.000000 26470.000000 114557.000000 25812.000000 114408.000000 25907.000000 125348.000000 24865.000000 144833.000000 23169.000000 147094.000000 22964.000000 155175.000000 22753.000000 161383.000000 22535.000000 169491.000000 22301.000000 21292.000000 176171.000000 21489.000000 171747.000000 21726.000000 164086.000000 22030.000000 148485.000000 22394.000000 142142.000000 22520.000000 138317.000000 23474.000000 127355.000000 24140.000000 118719.000000 24507.000000 114719.000000 24620.000000 113355.000000 25611.000000 103973.000000 26003.000000 101898.000000 25738.000000 103240.000000 26874.000000 96769.000000 26177.000000 98921.000000 28281.000000 90204.000000 27233.000000 93580.000000 27913.000000 90720.000000 28793.000000 88131.000000 29599.000000 85798.000000 29277.000000 86312.000000 29948.000000 85034.000000 30608.000000 83137.000000 29744.000000 85124.000000 32250.000000 79918.000000 34457.000000 74674.000000 32291.000000 78851.000000 34817.000000 72323.000000 33136.000000 77430.000000 36844.000000 70739.000000 35918.000000 71618.000000 37813.000000 67760.000000 35084.000000 71845.000000 39233.000000 66761.000000 40601.000000 63459.000000 40081.000000 64334.000000 43323.000000 59781.000000 42785.000000 59946.000000 43773.000000 59173.000000 41642.000000 62518.000000 46234.000000 55445.000000 48043.000000 54298.000000 48581.000000 52623.000000 49980.000000 52313.000000 52275.000000 48739.000000 52174.000000 49078.000000 55973.000000 46690.000000 53706.000000 47516.000000 57670.000000 44965.000000 58794.000000 43421.000000 62363.000000 41021.000000 63203.000000 40535.000000 58345.000000 44372.000000 63654.000000 40425.000000 67086.000000 38620.000000 68648.000000 37755.000000 66306.000000 38823.000000 71084.000000 36295.000000 74356.000000 34491.000000 72071.000000 35894.000000 73203.000000 35486.000000 73153.000000 35610.000000 77984.000000 33730.000000 76039.000000 33841.000000 84861.000000 31656.000000 81393.000000 32796.000000 86853.000000 31037.000000 91135.000000 29646.000000 94602.000000 29117.000000 94626.000000 29099.000000 96725.000000 28568.000000 100336.000000 27890.000000 111699.000000 26204.000000 119812.000000 25689.000000 121594.000000 24955.000000 125467.000000 24510.000000 136737.000000 23933.000000 148437.000000 22976.000000 142439.000000 23316.000000 148511.000000 22894.000000 162458.000000 22395.000000 166861.000000 22391.000000 180856.000000 22331.000000 21320.000000 175393.000000 21331.000000 170471.000000 21872.000000 155811.000000 22030.000000 148485.000000 21902.000000 150967.000000 22222.000000 143856.000000 22797.000000 138613.000000 23116.000000 129295.000000 24446.000000 114989.000000 24928.000000 112117.000000 25216.000000 108931.000000 25594.000000 102716.000000 26053.000000 100010.000000 27573.000000 93072.000000 27364.000000 93257.000000 28143.000000 92643.000000 28212.000000 90203.000000 28738.000000 88701.000000 29533.000000 86887.000000 29885.000000 84727.000000 31585.000000 80622.000000 31776.000000 80188.000000 34325.000000 74256.000000 35084.000000 71845.000000 33112.000000 76152.000000 35967.000000 70832.000000 36922.000000 69105.000000 39273.000000 64874.000000 39231.000000 65441.000000 40693.000000 64148.000000 38764.000000 66179.000000 45981.000000 55952.000000 40724.000000 62800.000000 46708.000000 54446.000000 44892.000000 58026.000000 45767.000000 56365.000000 48329.000000 52668.000000 51486.000000 50825.000000 49470.000000 51930.000000 48580.000000 51991.000000 57215.000000 44953.000000 55546.000000 46249.000000 54872.000000 46781.000000 55658.000000 45956.000000 60243.000000 42376.000000 59289.000000 43922.000000 63541.000000 40418.000000 62705.000000 40838.000000 63835.000000 39946.000000 64877.000000 39743.000000 70463.000000 36467.000000 66251.000000 38244.000000 68746.000000 37479.000000 78064.000000 34060.000000 71343.000000 36174.000000 75061.000000 34524.000000 75190.000000 34131.000000 82213.000000 32237.000000 86551.000000 31182.000000 82219.000000 32054.000000 86673.000000 31043.000000 87263.000000 30551.000000 94199.000000 29290.000000 95301.000000 28749.000000 94672.000000 29199.000000 99340.000000 28010.000000 109328.000000 26633.000000 109038.000000 26730.000000 115037.000000 25851.000000 115689.000000 25642.000000 135020.000000 24006.000000 124573.000000 24564.000000 144464.000000 23203.000000 140437.000000 23591.000000 150284.000000 23097.000000 157512.000000 22768.000000 158794.000000 22517.000000 166176.000000 22311.000000 173054.000000 22270.000000 21317.000000 172106.000000 21980.000000 152888.000000 22191.000000 145533.000000 22296.000000 141566.000000 23788.000000 120671.000000 24504.000000 114846.000000 24732.000000 112976.000000 26023.000000 101241.000000 25524.000000 106200.000000 26695.000000 97381.000000 25616.000000 104404.000000 26919.000000 97044.000000 27364.000000 93257.000000 28490.000000 90019.000000 27703.000000 92411.000000 28762.000000 87714.000000 30029.000000 85305.000000 30533.000000 83320.000000 29894.000000 85895.000000 31618.000000 80189.000000 32718.000000 77339.000000 34569.000000 75192.000000 36722.000000 69964.000000 32432.000000 77904.000000 35075.000000 72638.000000 34890.000000 72796.000000 37555.000000 68419.000000 37378.000000 68740.000000 39871.000000 64899.000000 40750.000000 63246.000000 40205.000000 64389.000000 43158.000000 58980.000000 44408.000000 58312.000000 48628.000000 52809.000000 48853.000000 52729.000000 47545.000000 54338.000000 52898.000000 47802.000000 49346.000000 51803.000000 51165.000000 49706.000000 54060.000000 47347.000000 56732.000000 45773.000000 58045.000000 45267.000000 60657.000000 42681.000000 59524.000000 43465.000000 58497.000000 43661.000000 63944.000000 40307.000000 63487.000000 40411.000000 66013.000000 39235.000000 67700.000000 38110.000000 72430.000000 35868.000000 68340.000000 37561.000000 70686.000000 36468.000000 78157.000000 33332.000000 74331.000000 35548.000000 81385.000000 32878.000000 76671.000000 34271.000000 85006.000000 31119.000000 82589.000000 31768.000000 87798.000000 30843.000000 89732.000000 30044.000000 92287.000000 29704.000000 97589.000000 28756.000000 104363.000000 27146.000000 100898.000000 27665.000000 105390.000000 27129.000000 110825.000000 26365.000000 112160.000000 26306.000000 114833.000000 25961.000000 129667.000000 24298.000000 141476.000000 23666.000000 145505.000000 23227.000000 146406.000000 22971.000000 159366.000000 22547.000000 158939.000000 22769.000000 164279.000000 22416.000000 172958.000000 22210.000000 21384.000000 175168.000000 21408.000000 170527.000000 21979.000000 150525.000000 21889.000000 152708.000000 21814.000000 155569.000000 22865.000000 132067.000000 23291.000000 127292.000000 23687.000000 126617.000000 23930.000000 119158.000000 25201.000000 109768.000000 25835.000000 103263.000000 26197.000000 100853.000000 25880.000000 102819.000000 27908.000000 92106.000000 28203.000000 89999.000000 27370.000000 93947.000000 28122.000000 90535.000000 29122.000000 86836.000000 29659.000000 85876.000000 30685.000000 83531.000000 31293.000000 81436.000000 31852.000000 79137.000000 33207.000000 76638.000000 35296.000000 73663.000000 34345.000000 74706.000000 35747.000000 72411.000000 37038.000000 69308.000000 36177.000000 70882.000000 37073.000000 68620.000000 38550.000000 67135.000000 42215.000000 61525.000000 40113.000000 63751.000000 39629.000000 63923.000000 39326.000000 65027.000000 43625.000000 59200.000000 47857.000000 53929.000000 45691.000000 57232.000000 47514.000000 53932.000000 47342.000000 54253.000000 48632.000000 52527.000000 49675.000000 51208.000000 54114.000000 47424.000000 54169.000000 47194.000000 56098.000000 45733.000000 57361.000000 45405.000000 59645.000000 43416.000000 60186.000000 42906.000000 58480.000000 44345.000000 63122.000000 40651.000000 61837.000000 41972.000000 63330.000000 40231.000000 62511.000000 41066.000000 65757.000000 39453.000000 66258.000000 38833.000000 66793.000000 38487.000000 68599.000000 37590.000000 70420.000000 36584.000000 70748.000000 36574.000000 71425.000000 36288.000000 75669.000000 34744.000000 73474.000000 35115.000000 79006.000000 33227.000000 73734.000000 35095.000000 78140.000000 34116.000000 80219.000000 32901.000000 82644.000000 32017.000000 87644.000000 30682.000000 92213.000000 29560.000000 86743.000000 30998.000000 89146.000000 30192.000000 93256.000000 29517.000000 91568.000000 29679.000000 100644.000000 27870.000000 95258.000000 29116.000000 98408.000000 28490.000000 108702.000000 26611.000000 116283.000000 25824.000000 120722.000000 25066.000000 131028.000000 24337.000000 138699.000000 23807.000000 145992.000000 23104.000000 153812.000000 22672.000000 161142.000000 22476.000000 166176.000000 22311.000000 174036.000000 22258.000000 21282.000000 178446.000000 21719.000000 162559.000000 21533.000000 163052.000000 21471.000000 163967.000000 21749.000000 153990.000000 22265.000000 142174.000000 23222.000000 128467.000000 23892.000000 123512.000000 23035.000000 130816.000000 24130.000000 116977.000000 24175.000000 116751.000000 25252.000000 107666.000000 25980.000000 103275.000000 26281.000000 98702.000000 26234.000000 100475.000000 26047.000000 103150.000000 26844.000000 96406.000000 27588.000000 92629.000000 28552.000000 89715.000000 28908.000000 88290.000000 28457.000000 90632.000000 29455.000000 85511.000000 30362.000000 83070.000000 30448.000000 82683.000000 32503.000000 77445.000000 32917.000000 77086.000000 35101.000000 73510.000000 34061.000000 75424.000000 35262.000000 71725.000000 35852.000000 71055.000000 36257.000000 70367.000000 36822.000000 68790.000000 39625.000000 64150.000000 39585.000000 65925.000000 40452.000000 63241.000000 42972.000000 59632.000000 44152.000000 59234.000000 44549.000000 57937.000000 46234.000000 55058.000000 48913.000000 52642.000000 47525.000000 54072.000000 49793.000000 51744.000000 48296.000000 53040.000000 47039.000000 54867.000000 50930.000000 50064.000000 52576.000000 48497.000000 50855.000000 50131.000000 56211.000000 46110.000000 53351.000000 47750.000000 59907.000000 43272.000000 57955.000000 44272.000000 56554.000000 45229.000000 59943.000000 42755.000000 62443.000000 41211.000000 63318.000000 40891.000000 65993.000000 38483.000000 64613.000000 40166.000000 62574.000000 41021.000000 67308.000000 37813.000000 67004.000000 38225.000000 69070.000000 37414.000000 70040.000000 36757.000000 69600.000000 36960.000000 71601.000000 36296.000000 76066.000000 34245.000000 80529.000000 32347.000000 84402.000000 31431.000000 83793.000000 32340.000000 94532.000000 28965.000000 90775.000000 29930.000000 89363.000000 30235.000000 93099.000000 29343.000000 99212.000000 27966.000000 97874.000000 28112.000000 105654.000000 27031.000000 114426.000000 26220.000000 117235.000000 25516.000000 122485.000000 25350.000000 124573.000000 24564.000000 137042.000000 23999.000000 143681.000000 23303.000000 146910.000000 22992.000000 153812.000000 22672.000000 160653.000000 22480.000000 170886.000000 22312.000000 177300.000000 22220.000000 21282.000000 178446.000000 21317.000000 172106.000000 21575.000000 163444.000000 21819.000000 157333.000000 22418.000000 143032.000000 22062.000000 146658.000000 22943.000000 132840.000000 23234.000000 128440.000000 23814.000000 122318.000000 24410.000000 115476.000000 24431.000000 115368.000000 25288.000000 106495.000000 25287.000000 107513.000000 25962.000000 100780.000000 25766.000000 102517.000000 26383.000000 98414.000000 27219.000000 94500.000000 27045.000000 96005.000000 28122.000000 90535.000000 27637.000000 93453.000000 28503.000000 90217.000000 29944.000000 84495.000000 29744.000000 85124.000000 30022.000000 83797.000000 31553.000000 81940.000000 31848.000000 79389.000000 35263.000000 72488.000000 32271.000000 78845.000000 35489.000000 72383.000000 34792.000000 73894.000000 36207.000000 70534.000000 37094.000000 68613.000000 38451.000000 67008.000000 41195.000000 62294.000000 44368.000000 58450.000000 44654.000000 58373.000000 44952.000000 57092.000000 46368.000000 55262.000000 46104.000000 56209.000000 45635.000000 56395.000000 49244.000000 52931.000000 49709.000000 51468.000000 49454.000000 52295.000000 54314.000000 47126.000000 53758.000000 47228.000000 53505.000000 47965.000000 57995.000000 44304.000000 60736.000000 42245.000000 54832.000000 46989.000000 57061.000000 45083.000000 59439.000000 43023.000000 63541.000000 40693.000000 66027.000000 38446.000000 66554.000000 38426.000000 68958.000000 37105.000000 68122.000000 38263.000000 72349.000000 35965.000000 74150.000000 35025.000000 74299.000000 34915.000000 74715.000000 34887.000000 77103.000000 33747.000000 81269.000000 32512.000000 81240.000000 32704.000000 86534.000000 30959.000000 87801.000000 30358.000000 88288.000000 30179.000000 94191.000000 28951.000000 92379.000000 29569.000000 100048.000000 28046.000000 95674.000000 28727.000000 104405.000000 27237.000000 109613.000000 26598.000000 117933.000000 25435.000000 128314.000000 24722.000000 120446.000000 24997.000000 116297.000000 25599.000000 132944.000000 24433.000000 143689.000000 23272.000000 146406.000000 22971.000000 148880.000000 22962.000000 155801.000000 22597.000000 172573.000000 22321.000000 178234.000000 22278.000000 21508.000000 176497.000000 21728.000000 158658.000000 21657.000000 162315.000000 22450.000000 141437.000000 22207.000000 143479.000000 22845.000000 132464.000000 23051.000000 131616.000000 23908.000000 123172.000000 24707.000000 111085.000000 25838.000000 104047.000000 25598.000000 105448.000000 25842.000000 102738.000000 26801.000000 95553.000000 26658.000000 97655.000000 27704.000000 92424.000000 27097.000000 93980.000000 28584.000000 88316.000000 27926.000000 90828.000000 28500.000000 88789.000000 29044.000000 87534.000000 28911.000000 87568.000000 30485.000000 84825.000000 31175.000000 81426.000000 34140.000000 74162.000000 32410.000000 79013.000000 32930.000000 76674.000000 33086.000000 76291.000000 34898.000000 72317.000000 33545.000000 76030.000000 36493.000000 69788.000000 38246.000000 66469.000000 35887.000000 70376.000000 37612.000000 68787.000000 41202.000000 62376.000000 38664.000000 65572.000000 42435.000000 60330.000000 42768.000000 60158.000000 43071.000000 58759.000000 45405.000000 57114.000000 46042.000000 54984.000000 47546.000000 53763.000000 47384.000000 54355.000000 51018.000000 50330.000000 52333.000000 50010.000000 54011.000000 48250.000000 56219.000000 45376.000000 58681.000000 43644.000000 56105.000000 46178.000000 59592.000000 42790.000000 61510.000000 41778.000000 62305.000000 41467.000000 64520.000000 40734.000000 71805.000000 36280.000000 66840.000000 39524.000000 69799.000000 37189.000000 72575.000000 36240.000000 68841.000000 37611.000000 74389.000000 35105.000000 69899.000000 36702.000000 78755.000000 33240.000000 82098.000000 32327.000000 82903.000000 31783.000000 87148.000000 30893.000000 91921.000000 29389.000000 94761.000000 29109.000000 92901.000000 29294.000000 95255.000000 28994.000000 100358.000000 28001.000000 106865.000000 26865.000000 112781.000000 26368.000000 107659.000000 26801.000000 125702.000000 24824.000000 117591.000000 25638.000000 138424.000000 23799.000000 147134.000000 23338.000000 135200.000000 23822.000000 152710.000000 22752.000000 161007.000000 22465.000000 171860.000000 22183.000000 21292.000000 176171.000000 21474.000000 170620.000000 21839.000000 157111.000000 21613.000000 159796.000000 22790.000000 137479.000000 22256.000000 142717.000000 22950.000000 136014.000000 23045.000000 128455.000000 23335.000000 126036.000000 24556.000000 117865.000000 25421.000000 105811.000000 25795.000000 102549.000000 25575.000000 105377.000000 26457.000000 100674.000000 25858.000000 100867.000000 27446.000000 95550.000000 26622.000000 98115.000000 26801.000000 95553.000000 27926.000000 90828.000000 28832.000000 88894.000000 27965.000000 90692.000000 30240.000000 84130.000000 28850.000000 88310.000000 29671.000000 85428.000000 31000.000000 81945.000000 34433.000000 73537.000000 33037.000000 76541.000000 37710.000000 67538.000000 32987.000000 77051.000000 36585.000000 69148.000000 35476.000000 71221.000000 39448.000000 65708.000000 38741.000000 65804.000000 45099.000000 56662.000000 42309.000000 60879.000000 41029.000000 62988.000000 44788.000000 56974.000000 43977.000000 58951.000000 45816.000000 56378.000000 46790.000000 54302.000000 48329.000000 52668.000000 47631.000000 53378.000000 50520.000000 50832.000000 51701.000000 49828.000000 51294.000000 50113.000000 53001.000000 48878.000000 54709.000000 46854.000000 53873.000000 48014.000000 57077.000000 44991.000000 53628.000000 48223.000000 61915.000000 42138.000000 58983.000000 43532.000000 64148.000000 40127.000000 62146.000000 41367.000000 63118.000000 40366.000000 66868.000000 38882.000000 64405.000000 39635.000000 68967.000000 37742.000000 67210.000000 38541.000000 70373.000000 36705.000000 72707.000000 35527.000000 72994.000000 35408.000000 71807.000000 36238.000000 74016.000000 35101.000000 76092.000000 34518.000000 80650.000000 32601.000000 81449.000000 32398.000000 83424.000000 32095.000000 87016.000000 30942.000000 89421.000000 30064.000000 93635.000000 29251.000000 89190.000000 30150.000000 92871.000000 29300.000000 99340.000000 28010.000000 102785.000000 27688.000000 104592.000000 27316.000000 105608.000000 27082.000000 115548.000000 25725.000000 120399.000000 24999.000000 129562.000000 24603.000000 136431.000000 23971.000000 137026.000000 23932.000000 144438.000000 23191.000000 146955.000000 22981.000000 151415.000000 22804.000000 165208.000000 22520.000000 172593.000000 22414.000000 177776.000000 22200.000000 21446.000000 178062.000000 21451.000000 170981.000000 21553.000000 161491.000000 22030.000000 148485.000000 22312.000000 144457.000000 22319.000000 142028.000000 23595.000000 125116.000000 23387.000000 126139.000000 24579.000000 115197.000000 23966.000000 119415.000000 25144.000000 106750.000000 25764.000000 104888.000000 25716.000000 105195.000000 26425.000000 99467.000000 25967.000000 101198.000000 27500.000000 92857.000000 27175.000000 94185.000000 27068.000000 96072.000000 27617.000000 92293.000000 29217.000000 86951.000000 28143.000000 91555.000000 28995.000000 88393.000000 28732.000000 89766.000000 29866.000000 84290.000000 30586.000000 83580.000000 31084.000000 81600.000000 29833.000000 85234.000000 32422.000000 78585.000000 32718.000000 77339.000000 32843.000000 76718.000000 34184.000000 76038.000000 34649.000000 72474.000000 37480.000000 68327.000000 36391.000000 69972.000000 38882.000000 65938.000000 41332.000000 61886.000000 43880.000000 58811.000000 43007.000000 59271.000000 41842.000000 61772.000000 44307.000000 58059.000000 44098.000000 58650.000000 46550.000000 56125.000000 44319.000000 57467.000000 49297.000000 52838.000000 47210.000000 53558.000000 50208.000000 51581.000000 51005.000000 50128.000000 51593.000000 49681.000000 52067.000000 48980.000000 55181.000000 46760.000000 59991.000000 42630.000000 56110.000000 45680.000000 57048.000000 45109.000000 61893.000000 41810.000000 62637.000000 41618.000000 60462.000000 42620.000000 63422.000000 41356.000000 65865.000000 39166.000000 66363.000000 38485.000000 68290.000000 37756.000000 68884.000000 37348.000000 73951.000000 35697.000000 74357.000000 35627.000000 68546.000000 37669.000000 78780.000000 33346.000000 75592.000000 35079.000000 76556.000000 34628.000000 78532.000000 34038.000000 80385.000000 32801.000000 82781.000000 31631.000000 83246.000000 31537.000000 87832.000000 30469.000000 91955.000000 29722.000000 96759.000000 28481.000000 87192.000000 30793.000000 104224.000000 27545.000000 94604.000000 29195.000000 101702.000000 27690.000000 109330.000000 26758.000000 114302.000000 26251.000000 106131.000000 27124.000000 121979.000000 24892.000000 115897.000000 25611.000000 135514.000000 23950.000000 124893.000000 24725.000000 141603.000000 23637.000000 142280.000000 23486.000000 146406.000000 22971.000000 149568.000000 22955.000000 156028.000000 22589.000000 168478.000000 22312.000000 21431.000000 174768.000000 21504.000000 173100.000000 21583.000000 162347.000000 22009.000000 151862.000000 22236.000000 142708.000000 22624.000000 137739.000000 23239.000000 130477.000000 23914.000000 120368.000000 24138.000000 117255.000000 25201.000000 107396.000000 25622.000000 103410.000000 25858.000000 100867.000000 26102.000000 100243.000000 27460.000000 95545.000000 27040.000000 96410.000000 27064.000000 96383.000000 28584.000000 88316.000000 29034.000000 86959.000000 30167.000000 84208.000000 31050.000000 81828.000000 34290.000000 75680.000000 32462.000000 78139.000000 33223.000000 76308.000000 34736.000000 72924.000000 37800.000000 67898.000000 35792.000000 70278.000000 36782.000000 69008.000000 38205.000000 66465.000000 42059.000000 61668.000000 40616.000000 62886.000000 41287.000000 62600.000000 44503.000000 57966.000000 44628.000000 57306.000000 44150.000000 58615.000000 48164.000000 53649.000000 48347.000000 52821.000000 49103.000000 51834.000000 48840.000000 52051.000000 46916.000000 54988.000000 53097.000000 48232.000000 50245.000000 51553.000000 51856.000000 48936.000000 55700.000000 46394.000000 51609.000000 49427.000000 59320.000000 42989.000000 58140.000000 43913.000000 60915.000000 42036.000000 65450.000000 38795.000000 62743.000000 41077.000000 62491.000000 41370.000000 65235.000000 39891.000000 68924.000000 37800.000000 67211.000000 38680.000000 68430.000000 38105.000000 70107.000000 36532.000000 72264.000000 35875.000000 71558.000000 36518.000000 74703.000000 34657.000000 79608.000000 32934.000000 85699.000000 30930.000000 88930.000000 30116.000000 92890.000000 29687.000000 91819.000000 29771.000000 94826.000000 29105.000000 98100.000000 28501.000000 96635.000000 28868.000000 104279.000000 27331.000000 108219.000000 26654.000000 113010.000000 26189.000000 115683.000000 26058.000000 116229.000000 25767.000000 130250.000000 24405.000000 127115.000000 24446.000000 139558.000000 23639.000000 148405.000000 22990.000000 152897.000000 22687.000000 162529.000000 22661.000000 168389.000000 22259.000000 176436.000000 22141.000000 21367.000000 177906.000000 21462.000000 172577.000000 21980.000000 152888.000000 21690.000000 156033.000000 22273.000000 147328.000000 22301.000000 142116.000000 22878.000000 132494.000000 23883.000000 121534.000000 23989.000000 120444.000000 24662.000000 112887.000000 25135.000000 106382.000000 25876.000000 104877.000000 26086.000000 99559.000000 26069.000000 101389.000000 26177.000000 98921.000000 26819.000000 98782.000000 27405.000000 94569.000000 27926.000000 90828.000000 28584.000000 88316.000000 29905.000000 86599.000000 29223.000000 87665.000000 28797.000000 88023.000000 30565.000000 84072.000000 30823.000000 82948.000000 32160.000000 80238.000000 35303.000000 73732.000000 33954.000000 74589.000000 33947.000000 76155.000000 34729.000000 74204.000000 36869.000000 68568.000000 37162.000000 68063.000000 40424.000000 63267.000000 43363.000000 58761.000000 42193.000000 61983.000000 42256.000000 61288.000000 45612.000000 56521.000000 44737.000000 57778.000000 46396.000000 55774.000000 48198.000000 53061.000000 47456.000000 54113.000000 50269.000000 51417.000000 48604.000000 52541.000000 52969.000000 48091.000000 55794.000000 46276.000000 55084.000000 46913.000000 56839.000000 45275.000000 57096.000000 44655.000000 61857.000000 41769.000000 58050.000000 44026.000000 60673.000000 42937.000000 61324.000000 41899.000000 59625.000000 42954.000000 64333.000000 39968.000000 64325.000000 40197.000000 65604.000000 39153.000000 67169.000000 38017.000000 68852.000000 37155.000000 72387.000000 35562.000000 75190.000000 34131.000000 78995.000000 33428.000000 80529.000000 32347.000000 79027.000000 33030.000000 83612.000000 31955.000000 87700.000000 30543.000000 82977.000000 32206.000000 91208.000000 29762.000000 93138.000000 29278.000000 98337.000000 28487.000000 102898.000000 27536.000000 106668.000000 26912.000000 105458.000000 27309.000000 111511.000000 26238.000000 117705.000000 25451.000000 126883.000000 24790.000000 122825.000000 24794.000000 133991.000000 24098.000000 148803.000000 22951.000000 149175.000000 22922.000000 152424.000000 22812.000000 160336.000000 22649.000000 162377.000000 22478.000000 169780.000000 22372.000000 177113.000000 22285.000000 21307.000000 174381.000000 21485.000000 165819.000000 21889.000000 152708.000000 21874.000000 156050.000000 22034.000000 148809.000000 23116.000000 129295.000000 23453.000000 127729.000000 23492.000000 123755.000000 24151.000000 116582.000000 23662.000000 120402.000000 24967.000000 110634.000000 25711.000000 105419.000000 26125.000000 100144.000000 25975.000000 101540.000000 26545.000000 97288.000000 27947.000000 91734.000000 27097.000000 93980.000000 28095.000000 90134.000000 28378.000000 89463.000000 29620.000000 86114.000000 28623.000000 88180.000000 30538.000000 82937.000000 31021.000000 81600.000000 31762.000000 79587.000000 35101.000000 72143.000000 33670.000000 75598.000000 36065.000000 71599.000000 34595.000000 72885.000000 38368.000000 66457.000000 36399.000000 70749.000000 39119.000000 65400.000000 36848.000000 69636.000000 40870.000000 62504.000000 40132.000000 63274.000000 43778.000000 58184.000000 41226.000000 61966.000000 43096.000000 59974.000000 48209.000000 52771.000000 46322.000000 55959.000000 49107.000000 52445.000000 46987.000000 54773.000000 50723.000000 50939.000000 54324.000000 47954.000000 51082.000000 49844.000000 54531.000000 47080.000000 57939.000000 44309.000000 61031.000000 42248.000000 63740.000000 40739.000000 62406.000000 40799.000000 60373.000000 42576.000000 67674.000000 37937.000000 65734.000000 39204.000000 67640.000000 38664.000000 65298.000000 39425.000000 70810.000000 36639.000000 74869.000000 35291.000000 71518.000000 36127.000000 72057.000000 35746.000000 75958.000000 34370.000000 78214.000000 33159.000000 79774.000000 32912.000000 80113.000000 32596.000000 84369.000000 31549.000000 84516.000000 31206.000000 91537.000000 29585.000000 89499.000000 30227.000000 97083.000000 28765.000000 100842.000000 27919.000000 98072.000000 28412.000000 107865.000000 26985.000000 104193.000000 27772.000000 117424.000000 25386.000000 119891.000000 25078.000000 131727.000000 24510.000000 136104.000000 23867.000000 142076.000000 23364.000000 143894.000000 23119.000000 153124.000000 22679.000000 152180.000000 22808.000000 169868.000000 22395.000000 180016.000000 22340.000000 21373.000000 177391.000000 21499.000000 170467.000000 21872.000000 155811.000000 21560.000000 162222.000000 21782.000000 158087.000000 22972.000000 133773.000000 22854.000000 135774.000000 23139.000000 129499.000000 24041.000000 119143.000000 23794.000000 120144.000000 24245.000000 116452.000000 24697.000000 112050.000000 25507.000000 108058.000000 25804.000000 103584.000000 25994.000000 102251.000000 26229.000000 100057.000000 27206.000000 95145.000000 26473.000000 97348.000000 27160.000000 96357.000000 29052.000000 87284.000000 28234.000000 92138.000000 28843.000000 88170.000000 31399.000000 81541.000000 29804.000000 85403.000000 30870.000000 83094.000000 30752.000000 83192.000000 30931.000000 82320.000000 32768.000000 77708.000000 32241.000000 78288.000000 34302.000000 74359.000000 35342.000000 72755.000000 35724.000000 70865.000000 37940.000000 68530.000000 36478.000000 69715.000000 38164.000000 67503.000000 39388.000000 65721.000000 41137.000000 61518.000000 38531.000000 66785.000000 43911.000000 58884.000000 41881.000000 61337.000000 40285.000000 64714.000000 43671.000000 60212.000000 45076.000000 57490.000000 46991.000000 53593.000000 48132.000000 53047.000000 46978.000000 55029.000000 46236.000000 55177.000000 50051.000000 51061.000000 56747.000000 45508.000000 54553.000000 46994.000000 58233.000000 44347.000000 57463.000000 44548.000000 55129.000000 46659.000000 65641.000000 38576.000000 61893.000000 41818.000000 62057.000000 41471.000000 63587.000000 40276.000000 64844.000000 39579.000000 68741.000000 37573.000000 73035.000000 35511.000000 69826.000000 37086.000000 70347.000000 36803.000000 70463.000000 36467.000000 74949.000000 34851.000000 77146.000000 33653.000000 77618.000000 33605.000000 80450.000000 32677.000000 85209.000000 31330.000000 83630.000000 31341.000000 87746.000000 30849.000000 88170.000000 30596.000000 90775.000000 29881.000000 92406.000000 29365.000000 100145.000000 27912.000000 113649.000000 25898.000000 117568.000000 25603.000000 119274.000000 25296.000000 126012.000000 24448.000000 141557.000000 23428.000000 140891.000000 23652.000000 151265.000000 22892.000000 155123.000000 22698.000000 162458.000000 22395.000000 176521.000000 22179.000000 21282.000000 178446.000000 22056.000000 152100.000000 21511.000000 163669.000000 22353.000000 139602.000000 22661.000000 135575.000000 22650.000000 137451.000000 23049.000000 129415.000000 23227.000000 129316.000000 24324.000000 116352.000000 24654.000000 114497.000000 25226.000000 107738.000000 25655.000000 104696.000000 25926.000000 101993.000000 26059.000000 100700.000000 26536.000000 97135.000000 27097.000000 93980.000000 27631.000000 93388.000000 26614.000000 96979.000000 28095.000000 90134.000000 28900.000000 88490.000000 29992.000000 86574.000000 29137.000000 87296.000000 30948.000000 81795.000000 30644.000000 82765.000000 30781.000000 82021.000000 32454.000000 78037.000000 35424.000000 71118.000000 36193.000000 70438.000000 38071.000000 67769.000000 39385.000000 65244.000000 38445.000000 66178.000000 41827.000000 60530.000000 42564.000000 60082.000000 41392.000000 61159.000000 43961.000000 58856.000000 46008.000000 56474.000000 47226.000000 55105.000000 47532.000000 53440.000000 50153.000000 51424.000000 50447.000000 50962.000000 50818.000000 50757.000000 50428.000000 51415.000000 51522.000000 49275.000000 51328.000000 49983.000000 53488.000000 48571.000000 59966.000000 43230.000000 57783.000000 44772.000000 57524.000000 44955.000000 59530.000000 43563.000000 60505.000000 42478.000000 62153.000000 41641.000000 63287.000000 40387.000000 63500.000000 40322.000000 64244.000000 39886.000000 66430.000000 39331.000000 67964.000000 37843.000000 70927.000000 36332.000000 66766.000000 39187.000000 70107.000000 36532.000000 72881.000000 35493.000000 67758.000000 38064.000000 73976.000000 35171.000000 76381.000000 33940.000000 71266.000000 36055.000000 84506.000000 31690.000000 78743.000000 33167.000000 88501.000000 30339.000000 89363.000000 30294.000000 87903.000000 30938.000000 91299.000000 29850.000000 90738.000000 29933.000000 98224.000000 28335.000000 99217.000000 28119.000000 100123.000000 27784.000000 113828.000000 26075.000000 109107.000000 26579.000000 127411.000000 24640.000000 121430.000000 24869.000000 118713.000000 25532.000000 126507.000000 24834.000000 141875.000000 23506.000000 147433.000000 23104.000000 153889.000000 22683.000000 157264.000000 22589.000000 168389.000000 22259.000000 172873.000000 22172.000000 21407.000000 170523.000000 21494.000000 166811.000000 21959.000000 154516.000000 21461.000000 167832.000000 22223.000000 143318.000000 22607.000000 142385.000000 22712.000000 137512.000000 23456.000000 124194.000000 23627.000000 121046.000000 24702.000000 112491.000000 25594.000000 102716.000000 26175.000000 100530.000000 25858.000000 100867.000000 26059.000000 100700.000000 27097.000000 93980.000000 26510.000000 99196.000000 27651.000000 92491.000000 28593.000000 88762.000000 28720.000000 87916.000000 28316.000000 89591.000000 29445.000000 86697.000000 28911.000000 87568.000000 29701.000000 85517.000000 33200.000000 77205.000000 33762.000000 75089.000000 32525.000000 78670.000000 34427.000000 73560.000000 36661.000000 69761.000000 36589.000000 70280.000000 37911.000000 67757.000000 34123.000000 73673.000000 39018.000000 65455.000000 39528.000000 64723.000000 40388.000000 63879.000000 43464.000000 59431.000000 44813.000000 57151.000000 45166.000000 56759.000000 44574.000000 57321.000000 46640.000000 55939.000000 49274.000000 51818.000000 47927.000000 54011.000000 48564.000000 52645.000000 49594.000000 51304.000000 54739.000000 46893.000000 51228.000000 49776.000000 56964.000000 45276.000000 52405.000000 48889.000000 55323.000000 46141.000000 58951.000000 43521.000000 60020.000000 43008.000000 62142.000000 42018.000000 60668.000000 42207.000000 60634.000000 42532.000000 63075.000000 40588.000000 64317.000000 40407.000000 67709.000000 37842.000000 65909.000000 38650.000000 69788.000000 37337.000000 71430.000000 36679.000000 71449.000000 35687.000000 68650.000000 37781.000000 78689.000000 33357.000000 77727.000000 33685.000000 77269.000000 34127.000000 82589.000000 31768.000000 78627.000000 33577.000000 87022.000000 31068.000000 86413.000000 31667.000000 87511.000000 30752.000000 89022.000000 30020.000000 88451.000000 30214.000000 95420.000000 28941.000000 97097.000000 28913.000000 107085.000000 26976.000000 104668.000000 27216.000000 103420.000000 27442.000000 116322.000000 25672.000000 119491.000000 25212.000000 128324.000000 24333.000000 137835.000000 23849.000000 146090.000000 23322.000000 146406.000000 22971.000000 159455.000000 22574.000000 156506.000000 22721.000000 170116.000000 22269.000000 180435.000000 22200.000000 21331.000000 170471.000000 21839.000000 157111.000000 21461.000000 166313.000000 22215.000000 143002.000000 22680.000000 135676.000000 22545.000000 135710.000000 23170.000000 127913.000000 23904.000000 117520.000000 25164.000000 107563.000000 25838.000000 102092.000000 25858.000000 100867.000000 26135.000000 100712.000000 26807.000000 96243.000000 27219.000000 94500.000000 27782.000000 92485.000000 28917.000000 87654.000000 28333.000000 91489.000000 28767.000000 89018.000000 30913.000000 83123.000000 29966.000000 86438.000000 32241.000000 78288.000000 33333.000000 76308.000000 37526.000000 68214.000000 34093.000000 75342.000000 35703.000000 71944.000000 36471.000000 70394.000000 36488.000000 70289.000000 35327.000000 72215.000000 40246.000000 63718.000000 40573.000000 62637.000000 39884.000000 63866.000000 43202.000000 59015.000000 46220.000000 56203.000000 44704.000000 57730.000000 43889.000000 58318.000000 48754.000000 52748.000000 47048.000000 54352.000000 48764.000000 52630.000000 51331.000000 49672.000000 48534.000000 53079.000000 53570.000000 48108.000000 55417.000000 46632.000000 52088.000000 49236.000000 54001.000000 48006.000000 56479.000000 46266.000000 61262.000000 41990.000000 63114.000000 41203.000000 61529.000000 41568.000000 57698.000000 44839.000000 64691.000000 40201.000000 65709.000000 39149.000000 65899.000000 38867.000000 67325.000000 38622.000000 65932.000000 38774.000000 67943.000000 37947.000000 70651.000000 36224.000000 72405.000000 35680.000000 74124.000000 34532.000000 78740.000000 33188.000000 79345.000000 32952.000000 82317.000000 32572.000000 88288.000000 30179.000000 86029.000000 31195.000000 92565.000000 29568.000000 90361.000000 29939.000000 95087.000000 28775.000000 92912.000000 29224.000000 101746.000000 27754.000000 100926.000000 27842.000000 107100.000000 26875.000000 110053.000000 26343.000000 114869.000000 25756.000000 119778.000000 25291.000000 125924.000000 24782.000000 118385.000000 25526.000000 142903.000000 23238.000000 147888.000000 22966.000000 147137.000000 22984.000000 148284.000000 22902.000000 159505.000000 22532.000000 166176.000000 22311.000000 176436.000000 22141.000000 21292.000000 176171.000000 21355.000000 168458.000000 21980.000000 152888.000000 21987.000000 152655.000000 22285.000000 145611.000000 22614.000000 141439.000000 22751.000000 139178.000000 23488.000000 126867.000000 23782.000000 119324.000000 24051.000000 118216.000000 24708.000000 111658.000000 25450.000000 104447.000000 26077.000000 101490.000000 26181.000000 101220.000000 25687.000000 103104.000000 27767.000000 92988.000000 27175.000000 94185.000000 28203.000000 89999.000000 27913.000000 90720.000000 29109.000000 88115.000000 28623.000000 88180.000000 29792.000000 86005.000000 30285.000000 84316.000000 30379.000000 84003.000000 32092.000000 79455.000000 32900.000000 76763.000000 33029.000000 76246.000000 35210.000000 73233.000000 35367.000000 72549.000000 36226.000000 71152.000000 36578.000000 69598.000000 36672.000000 68940.000000 37519.000000 68407.000000 40499.000000 62856.000000 42166.000000 61450.000000 41839.000000 61771.000000 45445.000000 56529.000000 44442.000000 58031.000000 47372.000000 54397.000000 45685.000000 55396.000000 48863.000000 53433.000000 48932.000000 51915.000000 48985.000000 51666.000000 51304.000000 50179.000000 53955.000000 47871.000000 57055.000000 45106.000000 56192.000000 45568.000000 57400.000000 44895.000000 58457.000000 43759.000000 59276.000000 43333.000000 61984.000000 41348.000000 64023.000000 39892.000000 66411.000000 38771.000000 67616.000000 38449.000000 70509.000000 37235.000000 69498.000000 37453.000000 73148.000000 35507.000000 77270.000000 33834.000000 73643.000000 34898.000000 74655.000000 34759.000000 75655.000000 34037.000000 81274.000000 32885.000000 78826.000000 33481.000000 83379.000000 31957.000000 83042.000000 32231.000000 84556.000000 31146.000000 88129.000000 30633.000000 89672.000000 29876.000000 93991.000000 29345.000000 97412.000000 28538.000000 97874.000000 28112.000000 107776.000000 26861.000000 107929.000000 26796.000000 112363.000000 25936.000000 117729.000000 25335.000000 122967.000000 25121.000000 134236.000000 24009.000000 142903.000000 23238.000000 148664.000000 22968.000000 146179.000000 22979.000000 153812.000000 22672.000000 165356.000000 22348.000000 171860.000000 22183.000000 167979.000000 22334.000000 21282.000000 178446.000000 21538.000000 169686.000000 21548.000000 165542.000000 21883.000000 150866.000000 22256.000000 142717.000000 22558.000000 141440.000000 23072.000000 131712.000000 23442.000000 126722.000000 23914.000000 118338.000000 24589.000000 112998.000000 24792.000000 110652.000000 25569.000000 105302.000000 26371.000000 99790.000000 26053.000000 100010.000000 27088.000000 95469.000000 27364.000000 93257.000000 28584.000000 88316.000000 28007.000000 91721.000000 28101.000000 90292.000000 29838.000000 85578.000000 31225.000000 80631.000000 32048.000000 78866.000000 31762.000000 79587.000000 33620.000000 77039.000000 34174.000000 74735.000000 35237.000000 72676.000000 36448.000000 69965.000000 36712.000000 69247.000000 37754.000000 67417.000000 38198.000000 66966.000000 39410.000000 65522.000000 40666.000000 63332.000000 41354.000000 63146.000000 43509.000000 59090.000000 43619.000000 59065.000000 41511.000000 61726.000000 46734.000000 54382.000000 49135.000000 52290.000000 49824.000000 51131.000000 48344.000000 52831.000000 48151.000000 53886.000000 51468.000000 50174.000000 50892.000000 50185.000000 54699.000000 46875.000000 60672.000000 42439.000000 54195.000000 47072.000000 62100.000000 41264.000000 62679.000000 40753.000000 61478.000000 41501.000000 59899.000000 42925.000000 63101.000000 40744.000000 71279.000000 36432.000000 66982.000000 39439.000000 67460.000000 37682.000000 71816.000000 36301.000000 74009.000000 35346.000000 69685.000000 36899.000000 72067.000000 35588.000000 77825.000000 33334.000000 76325.000000 34619.000000 77693.000000 34141.000000 81835.000000 32230.000000 85350.000000 31254.000000 88443.000000 30295.000000 88687.000000 30223.000000 94414.000000 29426.000000 95083.000000 28788.000000 99774.000000 28258.000000 100284.000000 28060.000000 102983.000000 27486.000000 106451.000000 26887.000000 110293.000000 26582.000000 108101.000000 26843.000000 122121.000000 25030.000000 120456.000000 25108.000000 137514.000000 23928.000000 146179.000000 22979.000000 140964.000000 23403.000000 144207.000000 23182.000000 153446.000000 22697.000000 159465.000000 22475.000000 165632.000000 22356.000000 172873.000000 22172.000000 21417.000000 174551.000000 21436.000000 170273.000000 21667.000000 157624.000000 22291.000000 146917.000000 22628.000000 137728.000000 23137.000000 127777.000000 24010.000000 118016.000000 24655.000000 111558.000000 24437.000000 112740.000000 25714.000000 101528.000000 26419.000000 99593.000000 27405.000000 94569.000000 26441.000000 98719.000000 28049.000000 90320.000000 28761.000000 89226.000000 28771.000000 89082.000000 27965.000000 90692.000000 28134.000000 89998.000000 31128.000000 82734.000000 29493.000000 85578.000000 30759.000000 83352.000000 31997.000000 79477.000000 32896.000000 77015.000000 32647.000000 77778.000000 33297.000000 76030.000000 35308.000000 72448.000000 34708.000000 73507.000000 36134.000000 70592.000000 38019.000000 67371.000000 39052.000000 65408.000000 37162.000000 68063.000000 39039.000000 65446.000000 42238.000000 60808.000000 41201.000000 62744.000000 42777.000000 60605.000000 45510.000000 57280.000000 43681.000000 58779.000000 46699.000000 54919.000000 50953.000000 51435.000000 49163.000000 53030.000000 47276.000000 53397.000000 51473.000000 49974.000000 50956.000000 50705.000000 52977.000000 48207.000000 51334.000000 50219.000000 51857.000000 49055.000000 56583.000000 45452.000000 58779.000000 44281.000000 59043.000000 43862.000000 60886.000000 42382.000000 61985.000000 41344.000000 62709.000000 40777.000000 65247.000000 39594.000000 67257.000000 38173.000000 65823.000000 38715.000000 68958.000000 37105.000000 75138.000000 34428.000000 78906.000000 34217.000000 82304.000000 31862.000000 82211.000000 32475.000000 83475.000000 31633.000000 85122.000000 31114.000000 92643.000000 29430.000000 92715.000000 29398.000000 95127.000000 28900.000000 93460.000000 29289.000000 91003.000000 29685.000000 106429.000000 27554.000000 103796.000000 27609.000000 109780.000000 26775.000000 112617.000000 25862.000000 130255.000000 24592.000000 136831.000000 23727.000000 142903.000000 23238.000000 147094.000000 22964.000000 152643.000000 22832.000000 159692.000000 22467.000000 169647.000000 22235.000000 21292.000000 176171.000000 21398.000000 167114.000000 21767.000000 161195.000000 22190.000000 144618.000000 22661.000000 135575.000000 23012.000000 132404.000000 23477.000000 124960.000000 23896.000000 123976.000000 24117.000000 117804.000000 24600.000000 111888.000000 25127.000000 106457.000000 25920.000000 101870.000000 26448.000000 100281.000000 25867.000000 103367.000000 27112.000000 96061.000000 26713.000000 96729.000000 28437.000000 91838.000000 28584.000000 88316.000000 29096.000000 87630.000000 29717.000000 86659.000000 30205.000000 83949.000000 31354.000000 82775.000000 30558.000000 82799.000000 31565.000000 80625.000000 33658.000000 75436.000000 32462.000000 78139.000000 36161.000000 70595.000000 32978.000000 76999.000000 34639.000000 73857.000000 37419.000000 68547.000000 37616.000000 67308.000000 40757.000000 63224.000000 38495.000000 66130.000000 41386.000000 62552.000000 45711.000000 56143.000000 45241.000000 57059.000000 44864.000000 57850.000000 47583.000000 54075.000000 49529.000000 51732.000000 48531.000000 52885.000000 51133.000000 49717.000000 55504.000000 46255.000000 55037.000000 46838.000000 54648.000000 47253.000000 56288.000000 45424.000000 57401.000000 45372.000000 61198.000000 41557.000000 58878.000000 43587.000000 63324.000000 40504.000000 64878.000000 40070.000000 66173.000000 38731.000000 67308.000000 37813.000000 67246.000000 38535.000000 66118.000000 39064.000000 68712.000000 37549.000000 71091.000000 37060.000000 70620.000000 37497.000000 73871.000000 35027.000000 73379.000000 35504.000000 79866.000000 32897.000000 78867.000000 33335.000000 76888.000000 34432.000000 78156.000000 33725.000000 81591.000000 32748.000000 83630.000000 31341.000000 90215.000000 30110.000000 95617.000000 28986.000000 95795.000000 28868.000000 99102.000000 28166.000000 100690.000000 27897.000000 111193.000000 26373.000000 111790.000000 26365.000000 114161.000000 26241.000000 115563.000000 26174.000000 125212.000000 24705.000000 131929.000000 24447.000000 144044.000000 23372.000000 137127.000000 23924.000000 144532.000000 23125.000000 155284.000000 22854.000000 158901.000000 22664.000000 165632.000000 22356.000000 170116.000000 22269.000000 21346.000000 178221.000000 21511.000000 172118.000000 21891.000000 160129.000000 22054.000000 149690.000000 22322.000000 140978.000000 22649.000000 135330.000000 23141.000000 131510.000000 24037.000000 120064.000000 24868.000000 109308.000000 24164.000000 117007.000000 25538.000000 107394.000000 25635.000000 104677.000000 25858.000000 100867.000000 26086.000000 99559.000000 26504.000000 98506.000000 28122.000000 90535.000000 27806.000000 92535.000000 29229.000000 86807.000000 28858.000000 89678.000000 29638.000000 85662.000000 30022.000000 83797.000000 31677.000000 80764.000000 32241.000000 78288.000000 33443.000000 76208.000000 33616.000000 75728.000000 34759.000000 73947.000000 33739.000000 75626.000000 34361.000000 74489.000000 35111.000000 71610.000000 38583.000000 66298.000000 36973.000000 68901.000000 39540.000000 65456.000000 41880.000000 61453.000000 40045.000000 64674.000000 42733.000000 60897.000000 45493.000000 56674.000000 43557.000000 59764.000000 45205.000000 57088.000000 44785.000000 57736.000000 48094.000000 52855.000000 51146.000000 49284.000000 46823.000000 54365.000000 48715.000000 52183.000000 50808.000000 50213.000000 53287.000000 47873.000000 52643.000000 48713.000000 54597.000000 46978.000000 55659.000000 46098.000000 57978.000000 44125.000000 57701.000000 44554.000000 60177.000000 42670.000000 63935.000000 40134.000000 61959.000000 41587.000000 63138.000000 40851.000000 66121.000000 39050.000000 65960.000000 39054.000000 69318.000000 37474.000000 69344.000000 37101.000000 70407.000000 36869.000000 71315.000000 36080.000000 73408.000000 35591.000000 74281.000000 34844.000000 74356.000000 34491.000000 82260.000000 32023.000000 81034.000000 32363.000000 83464.000000 31540.000000 86149.000000 30878.000000 91526.000000 29974.000000 93182.000000 29381.000000 96470.000000 28624.000000 98527.000000 28297.000000 101348.000000 28092.000000 109954.000000 26628.000000 99687.000000 28152.000000 106127.000000 27051.000000 120592.000000 25220.000000 125340.000000 24544.000000 139646.000000 23806.000000 148803.000000 22951.000000 142745.000000 23464.000000 158103.000000 22555.000000 159465.000000 22475.000000 161331.000000 22443.000000 172873.000000 22172.000000 21282.000000 178446.000000 21398.000000 172802.000000 21747.000000 159929.000000 21879.000000 152303.000000 22405.000000 146915.000000 22953.000000 133672.000000 23112.000000 129598.000000 23598.000000 121250.000000 24672.000000 111968.000000 24284.000000 116372.000000 25333.000000 107104.000000 25795.000000 102549.000000 26448.000000 100269.000000 25962.000000 100780.000000 26473.000000 97348.000000 28720.000000 87916.000000 27097.000000 93980.000000 28095.000000 90134.000000 29353.000000 86551.000000 28597.000000 89324.000000 29260.000000 86649.000000 29648.000000 85815.000000 30954.000000 81871.000000 33599.000000 76830.000000 32392.000000 78782.000000 32943.000000 77197.000000 35336.000000 72887.000000 35548.000000 71380.000000 36632.000000 69684.000000 38533.000000 66826.000000 37445.000000 69073.000000 39187.000000 66165.000000 40758.000000 64197.000000 43434.000000 59196.000000 43287.000000 60191.000000 44163.000000 58472.000000 42569.000000 61597.000000 45421.000000 56377.000000 46540.000000 55039.000000 47846.000000 53534.000000 50101.000000 51219.000000 47660.000000 53625.000000 53385.000000 48084.000000 47056.000000 54326.000000 51915.000000 49293.000000 49779.000000 51892.000000 50220.000000 50016.000000 54341.000000 47529.000000 59993.000000 43194.000000 58245.000000 44613.000000 58610.000000 44058.000000 62206.000000 41366.000000 60304.000000 42301.000000 65471.000000 38950.000000 66582.000000 38543.000000 63406.000000 40478.000000 68002.000000 37884.000000 64092.000000 39853.000000 72246.000000 36081.000000 68714.000000 37680.000000 71760.000000 36339.000000 71444.000000 36703.000000 78386.000000 33840.000000 76614.000000 33931.000000 76570.000000 34430.000000 80369.000000 32876.000000 82941.000000 31981.000000 89174.000000 30044.000000 94024.000000 29143.000000 95828.000000 28562.000000 107549.000000 26887.000000 116222.000000 26142.000000 116836.000000 25406.000000 121294.000000 25034.000000 124329.000000 24636.000000 130804.000000 24479.000000 139766.000000 23875.000000 145692.000000 23102.000000 154574.000000 22688.000000 156028.000000 22589.000000 164802.000000 22367.000000 170537.000000 22336.000000 21446.000000 172978.000000 21545.000000 165995.000000 21525.000000 167607.000000 21887.000000 156155.000000 22766.000000 140255.000000 22844.000000 137096.000000 23110.000000 128594.000000 24314.000000 115695.000000 24989.000000 110926.000000 25641.000000 104256.000000 25656.000000 103263.000000 25798.000000 102894.000000 26131.000000 100834.000000 26826.000000 97893.000000 27097.000000 93980.000000 29008.000000 88109.000000 28548.000000 89056.000000 28232.000000 91328.000000 29418.000000 86153.000000 30039.000000 84662.000000 31272.000000 81591.000000 32085.000000 78781.000000 32348.000000 78279.000000 34086.000000 74011.000000 33074.000000 76640.000000 36863.000000 68682.000000 37639.000000 68113.000000 37828.000000 67142.000000 39637.000000 64320.000000 39723.000000 64074.000000 43133.000000 59624.000000 45314.000000 57302.000000 47370.000000 54613.000000 45540.000000 56586.000000 47481.000000 53968.000000 48406.000000 52901.000000 49738.000000 51616.000000 49950.000000 50946.000000 52204.000000 49263.000000 50994.000000 50358.000000 56914.000000 45289.000000 57232.000000 44572.000000 54879.000000 46581.000000 59226.000000 43110.000000 61182.000000 41864.000000 62119.000000 41257.000000 63365.000000 40814.000000 64691.000000 39738.000000 66946.000000 38401.000000 68202.000000 37490.000000 66038.000000 39494.000000 72008.000000 35986.000000 68150.000000 38367.000000 72732.000000 35478.000000 73350.000000 35186.000000 70474.000000 36437.000000 75068.000000 34482.000000 81902.000000 32498.000000 84556.000000 31146.000000 82920.000000 31769.000000 85971.000000 31016.000000 90225.000000 30150.000000 87618.000000 30873.000000 92600.000000 29486.000000 96772.000000 28518.000000 93423.000000 29295.000000 93556.000000 29242.000000 106530.000000 27148.000000 112582.000000 26167.000000 109796.000000 26635.000000 118214.000000 25482.000000 116113.000000 25547.000000 121035.000000 25194.000000 126012.000000 24448.000000 139978.000000 23460.000000 136295.000000 23859.000000 147925.000000 23014.000000 153124.000000 22679.000000 155841.000000 22654.000000 168389.000000 22259.000000 179307.000000 22247.000000 21383.000000 175116.000000 21688.000000 166074.000000 21386.000000 170254.000000 22020.000000 151355.000000 22182.000000 144302.000000 22322.000000 140978.000000 22545.000000 135710.000000 23004.000000 131760.000000 23574.000000 121227.000000 23794.000000 120144.000000 24782.000000 113857.000000 25115.000000 107473.000000 25615.000000 105080.000000 25756.000000 103733.000000 25868.000000 100677.000000 26107.000000 100210.000000 27346.000000 93323.000000 26333.000000 99178.000000 28190.000000 91030.000000 27364.000000 93257.000000 26473.000000 97348.000000 30280.000000 84927.000000 28797.000000 88023.000000 29498.000000 86011.000000 29744.000000 85124.000000 31336.000000 81274.000000 31512.000000 79864.000000 32589.000000 78196.000000 33276.000000 76455.000000 37003.000000 69061.000000 34140.000000 74409.000000 36772.000000 69488.000000 36638.000000 70666.000000 37821.000000 67846.000000 41438.000000 61918.000000 37343.000000 68188.000000 38964.000000 65629.000000 41890.000000 61493.000000 42584.000000 60139.000000 44040.000000 58271.000000 43437.000000 59417.000000 46664.000000 55527.000000 51293.000000 50000.000000 46959.000000 54191.000000 47824.000000 53406.000000 50562.000000 51119.000000 54553.000000 47086.000000 56585.000000 45729.000000 52328.000000 48556.000000 58280.000000 44308.000000 56809.000000 45365.000000 60186.000000 43173.000000 61282.000000 41924.000000 62625.000000 40975.000000 64454.000000 40191.000000 68706.000000 37250.000000 66202.000000 38420.000000 64071.000000 40486.000000 69761.000000 36904.000000 67080.000000 38050.000000 72551.000000 35604.000000 74540.000000 34714.000000 76923.000000 34147.000000 78286.000000 33489.000000 79058.000000 33134.000000 82770.000000 31600.000000 86777.000000 31023.000000 88286.000000 30855.000000 97773.000000 28348.000000 93717.000000 29143.000000 97178.000000 28537.000000 99224.000000 28185.000000 104222.000000 27253.000000 106565.000000 26996.000000 108944.000000 26619.000000 115846.000000 25541.000000 118471.000000 25289.000000 135625.000000 24007.000000 133787.000000 24222.000000 139493.000000 23528.000000 146179.000000 22979.000000 153124.000000 22679.000000 158901.000000 22664.000000 168756.000000 22430.000000 170622.000000 22324.000000 177385.000000 22258.000000 21355.000000 179938.000000 21546.000000 164768.000000 21889.000000 152708.000000 22571.000000 141039.000000 22988.000000 132810.000000 23376.000000 127652.000000 23574.000000 121227.000000 24579.000000 113529.000000 24638.000000 111503.000000 25578.000000 105248.000000 26018.000000 100706.000000 25864.000000 101557.000000 26801.000000 95553.000000 27726.000000 92192.000000 27306.000000 93795.000000 28972.000000 88337.000000 28861.000000 88626.000000 28328.000000 90499.000000 29396.000000 87213.000000 30084.000000 84397.000000 31885.000000 79836.000000 31361.000000 80873.000000 34025.000000 74982.000000 34314.000000 74737.000000 33469.000000 77119.000000 34627.000000 73047.000000 34989.000000 71747.000000 38759.000000 66163.000000 35262.000000 71721.000000 36016.000000 70451.000000 42853.000000 59701.000000 42302.000000 60399.000000 46222.000000 55401.000000 43329.000000 59043.000000 47454.000000 53891.000000 46975.000000 54611.000000 49427.000000 51777.000000 50316.000000 51339.000000 48874.000000 52771.000000 52178.000000 48690.000000 54137.000000 48327.000000 54615.000000 47255.000000 55278.000000 46329.000000 57590.000000 45422.000000 58112.000000 44783.000000 58181.000000 44528.000000 62543.000000 41026.000000 60751.000000 42824.000000 65251.000000 39438.000000 63429.000000 40280.000000 68993.000000 37102.000000 73665.000000 35233.000000 66314.000000 38582.000000 69841.000000 36838.000000 77166.000000 34456.000000 70923.000000 36378.000000 80529.000000 32347.000000 79583.000000 33103.000000 84857.000000 31549.000000 86566.000000 30836.000000 90295.000000 29841.000000 91377.000000 29759.000000 87904.000000 30375.000000 92962.000000 29564.000000 95212.000000 29098.000000 100294.000000 27962.000000 107767.000000 26760.000000 111976.000000 26260.000000 113335.000000 25978.000000 113200.000000 26095.000000 127253.000000 24358.000000 121475.000000 24906.000000 137719.000000 23635.000000 143591.000000 23231.000000 141349.000000 23525.000000 147094.000000 22964.000000 148576.000000 22959.000000 158794.000000 22517.000000 168389.000000 22259.000000 176187.000000 22226.000000 21320.000000 175393.000000 21617.000000 170489.000000 21882.000000 152941.000000 22186.000000 146643.000000 22349.000000 141165.000000 22778.000000 134046.000000 24230.000000 120133.000000 24523.000000 114535.000000 25927.000000 103637.000000 25514.000000 105632.000000 25757.000000 104569.000000 26086.000000 99559.000000 26190.000000 99472.000000 26029.000000 100462.000000 27463.000000 93577.000000 28034.000000 91040.000000 28294.000000 89974.000000 28461.000000 88925.000000 28989.000000 87773.000000 29627.000000 86533.000000 30077.000000 84774.000000 30227.000000 84483.000000 31769.000000 79908.000000 34074.000000 74403.000000 35353.000000 72090.000000 36602.000000 69714.000000 39523.000000 65620.000000 36803.000000 68724.000000 38005.000000 67226.000000 40741.000000 63227.000000 42376.000000 60434.000000 43676.000000 58841.000000 41977.000000 61191.000000 42594.000000 60267.000000 43927.000000 58667.000000 46910.000000 54688.000000 47379.000000 53707.000000 47973.000000 53493.000000 48422.000000 52942.000000 52715.000000 49048.000000 50031.000000 52059.000000 52557.000000 49303.000000 50916.000000 50561.000000 56288.000000 45424.000000 54654.000000 47688.000000 56893.000000 45273.000000 57913.000000 45018.000000 61824.000000 41840.000000 59784.000000 42978.000000 60676.000000 42257.000000 66128.000000 39369.000000 69374.000000 37561.000000 69776.000000 36971.000000 65887.000000 39465.000000 70857.000000 36323.000000 67504.000000 37648.000000 70166.000000 36560.000000 71946.000000 35954.000000 73372.000000 35715.000000 70416.000000 36433.000000 77275.000000 34079.000000 80529.000000 32347.000000 84398.000000 31410.000000 84003.000000 31438.000000 84707.000000 31259.000000 91514.000000 29832.000000 88700.000000 30337.000000 93305.000000 29086.000000 98186.000000 28382.000000 94880.000000 29011.000000 97999.000000 28561.000000 104463.000000 27397.000000 108025.000000 27164.000000 112373.000000 25934.000000 118124.000000 25763.000000 125175.000000 24720.000000 143662.000000 23189.000000 147888.000000 22966.000000 152897.000000 22687.000000 157478.000000 22598.000000 166317.000000 22361.000000 170801.000000 22274.000000 21372.000000 178308.000000 21461.000000 168111.000000 21489.000000 166059.000000 21686.000000 157389.000000 21873.000000 153736.000000 22444.000000 139251.000000 22943.000000 131455.000000 23874.000000 120618.000000 25056.000000 109720.000000 24435.000000 113505.000000 25392.000000 105112.000000 26288.000000 99642.000000 26012.000000 100016.000000 27767.000000 91990.000000 26977.000000 95315.000000 27631.000000 93388.000000 26536.000000 97135.000000 28670.000000 89233.000000 28356.000000 91576.000000 28955.000000 88478.000000 30439.000000 83957.000000 29277.000000 86312.000000 29593.000000 85876.000000 30628.000000 83229.000000 32382.000000 78642.000000 33086.000000 76291.000000 33979.000000 75173.000000 32447.000000 78327.000000 33677.000000 75958.000000 35186.000000 73277.000000 35722.000000 71219.000000 37438.000000 67406.000000 38516.000000 66814.000000 39360.000000 64456.000000 38644.000000 66405.000000 41633.000000 62482.000000 43663.000000 58724.000000 47479.000000 53600.000000 44064.000000 58600.000000 48488.000000 53358.000000 46712.000000 54486.000000 46517.000000 54928.000000 50933.000000 49917.000000 49789.000000 51675.000000 55328.000000 47175.000000 53444.000000 47847.000000 55912.000000 46548.000000 51057.000000 49696.000000 57876.000000 44707.000000 58308.000000 43964.000000 63716.000000 40133.000000 61386.000000 41737.000000 62735.000000 41163.000000 66194.000000 38749.000000 67894.000000 38112.000000 66363.000000 38485.000000 69670.000000 37097.000000 70550.000000 36469.000000 69392.000000 37129.000000 74960.000000 34826.000000 75502.000000 34675.000000 72323.000000 35956.000000 77073.000000 33852.000000 76428.000000 33949.000000 81501.000000 32756.000000 79743.000000 32801.000000 84104.000000 31628.000000 82107.000000 32081.000000 91291.000000 29898.000000 89022.000000 30020.000000 94679.000000 28932.000000 96502.000000 28682.000000 107053.000000 27080.000000 104178.000000 27220.000000 115833.000000 25590.000000 122749.000000 25447.000000 132357.000000 24149.000000 137719.000000 23635.000000 146955.000000 22981.000000 153812.000000 22672.000000 164671.000000 22343.000000 168389.000000 22259.000000 172958.000000 22210.000000 21317.000000 171511.000000 21944.000000 155234.000000 22177.000000 149537.000000 22223.000000 143318.000000 22545.000000 135710.000000 23082.000000 128115.000000 24170.000000 117728.000000 23819.000000 121733.000000 24928.000000 108946.000000 25588.000000 106228.000000 25763.000000 104707.000000 26796.000000 98334.000000 26059.000000 100700.000000 26117.000000 100020.000000 27097.000000 93980.000000 28203.000000 89999.000000 28584.000000 88316.000000 30308.000000 84158.000000 29879.000000 85290.000000 29277.000000 86312.000000 33381.000000 76620.000000 32636.000000 78629.000000 32934.000000 77092.000000 34627.000000 73432.000000 34843.000000 72712.000000 35036.000000 72646.000000 34110.000000 74572.000000 35928.000000 72137.000000 38900.000000 66541.000000 38236.000000 67815.000000 39750.000000 63893.000000 41911.000000 61893.000000 37935.000000 67918.000000 39631.000000 64852.000000 44029.000000 58017.000000 43626.000000 58410.000000 46076.000000 56048.000000 49513.000000 51351.000000 46991.000000 53593.000000 48038.000000 52852.000000 52975.000000 48974.000000 50781.000000 50562.000000 53515.000000 48272.000000 53721.000000 47354.000000 56816.000000 44710.000000 55530.000000 46329.000000 60344.000000 42405.000000 62027.000000 41969.000000 63942.000000 40110.000000 62161.000000 41208.000000 66287.000000 38845.000000 65307.000000 39613.000000 66554.000000 38636.000000 68119.000000 38416.000000 68721.000000 37099.000000 71971.000000 36043.000000 73293.000000 35185.000000 74532.000000 34971.000000 79964.000000 32989.000000 83490.000000 32326.000000 80216.000000 32708.000000 81076.000000 32449.000000 83513.000000 31710.000000 86124.000000 31113.000000 90338.000000 30416.000000 88976.000000 30713.000000 94191.000000 28951.000000 91919.000000 29544.000000 99156.000000 28385.000000 103117.000000 27650.000000 116198.000000 25966.000000 112900.000000 26060.000000 116356.000000 25548.000000 119986.000000 25415.000000 132613.000000 24024.000000 128184.000000 24582.000000 143983.000000 23115.000000 146998.000000 23001.000000 156595.000000 22603.000000 157264.000000 22589.000000 163183.000000 22391.000000 176436.000000 22141.000000 21373.000000 177391.000000 21494.000000 166811.000000 21669.000000 159175.000000 21813.000000 153765.000000 22157.000000 146629.000000 23213.000000 130578.000000 23116.000000 131612.000000 24710.000000 112389.000000 25705.000000 104038.000000 24469.000000 113358.000000 25500.000000 106648.000000 26350.000000 100652.000000 25864.000000 101557.000000 26559.000000 99404.000000 26831.000000 97463.000000 26600.000000 97669.000000 28203.000000 89999.000000 27289.000000 94088.000000 28627.000000 89675.000000 28674.000000 88856.000000 28669.000000 88909.000000 29866.000000 84290.000000 30410.000000 84235.000000 30715.000000 82632.000000 32560.000000 77490.000000 34282.000000 73768.000000 34558.000000 73044.000000 38119.000000 67557.000000 36576.000000 69750.000000 35558.000000 71458.000000 39350.000000 65226.000000 39932.000000 64389.000000 39256.000000 66360.000000 43117.000000 60252.000000 42944.000000 60499.000000 44828.000000 56859.000000 46490.000000 55825.000000 46788.000000 54371.000000 45858.000000 56463.000000 48549.000000 52603.000000 49846.000000 51876.000000 47409.000000 53429.000000 50851.000000 51460.000000 49409.000000 52008.000000 53462.000000 48173.000000 54387.000000 46474.000000 57202.000000 45322.000000 61487.000000 41688.000000 62057.000000 41471.000000 60942.000000 42253.000000 63686.000000 40143.000000 62671.000000 40954.000000 64617.000000 39548.000000 66563.000000 38634.000000 65698.000000 39231.000000 67438.000000 38088.000000 70321.000000 36704.000000 69894.000000 37368.000000 73999.000000 35258.000000 76720.000000 33908.000000 79505.000000 33033.000000 81092.000000 32640.000000 82155.000000 32238.000000 88501.000000 30339.000000 84339.000000 31680.000000 90839.000000 30003.000000 89501.000000 30173.000000 94233.000000 29087.000000 98987.000000 27994.000000 104336.000000 27274.000000 112450.000000 26087.000000 121129.000000 25638.000000 123736.000000 24836.000000 137174.000000 23755.000000 145603.000000 23106.000000 147094.000000 22964.000000 153585.000000 22680.000000 156028.000000 22589.000000 171860.000000 22183.000000 21282.000000 178446.000000 21527.000000 168694.000000 21839.000000 157111.000000 21771.000000 157848.000000 22264.000000 145858.000000 22679.000000 135381.000000 23022.000000 131100.000000 23267.000000 129432.000000 23568.000000 122314.000000 23574.000000 121227.000000 24480.000000 112966.000000 25904.000000 103251.000000 25519.000000 107370.000000 26102.000000 100059.000000 25926.000000 101993.000000 26473.000000 97348.000000 27097.000000 93980.000000 28090.000000 91550.000000 27723.000000 92390.000000 28095.000000 90134.000000 28774.000000 88761.000000 29254.000000 87050.000000 29924.000000 84543.000000 30733.000000 83390.000000 29744.000000 85124.000000 32641.000000 78204.000000 32256.000000 78615.000000 33918.000000 74772.000000 35786.000000 72089.000000 34469.000000 74479.000000 37311.000000 68363.000000 34794.000000 73810.000000 40014.000000 63303.000000 38695.000000 65566.000000 41227.000000 61966.000000 37492.000000 68257.000000 42777.000000 59822.000000 44065.000000 58690.000000 45753.000000 56919.000000 45124.000000 57351.000000 48951.000000 52535.000000 47576.000000 53857.000000 51581.000000 49393.000000 46610.000000 55484.000000 49049.000000 52235.000000 53274.000000 47927.000000 55202.000000 46748.000000 55681.000000 46086.000000 60419.000000 43197.000000 57333.000000 45056.000000 60859.000000 42740.000000 56371.000000 45675.000000 62581.000000 40971.000000 65845.000000 39223.000000 65516.000000 39549.000000 67929.000000 37641.000000 67460.000000 37682.000000 68710.000000 37298.000000 74992.000000 34478.000000 72818.000000 35889.000000 74090.000000 35100.000000 73305.000000 35133.000000 80519.000000 32906.000000 80907.000000 32780.000000 83630.000000 31341.000000 89540.000000 30380.000000 89127.000000 30517.000000 93785.000000 29460.000000 94679.000000 28932.000000 98313.000000 28249.000000 101931.000000 28096.000000 104124.000000 27529.000000 115628.000000 25801.000000 113971.000000 25961.000000 118970.000000 25176.000000 130014.000000 24946.000000 135717.000000 23729.000000 138138.000000 23723.000000 146697.000000 23219.000000 151946.000000 23046.000000 159692.000000 22467.000000 169647.000000 22235.000000 21372.000000 178308.000000 21493.000000 171082.000000 21739.000000 163104.000000 21970.000000 153999.000000 22096.000000 148903.000000 22419.000000 138562.000000 22914.000000 135686.000000 24025.000000 121636.000000 23541.000000 122527.000000 25415.000000 105121.000000 25287.000000 105922.000000 25737.000000 103415.000000 26529.000000 98203.000000 26047.000000 100480.000000 26699.000000 97649.000000 27053.000000 95322.000000 28203.000000 89999.000000 28722.000000 89769.000000 28987.000000 87726.000000 28169.000000 92429.000000 29602.000000 85919.000000 29859.000000 84711.000000 30720.000000 82603.000000 33096.000000 76520.000000 35105.000000 72912.000000 34334.000000 74740.000000 36527.000000 70212.000000 34602.000000 73132.000000 38511.000000 66663.000000 37136.000000 69281.000000 37090.000000 69563.000000 41682.000000 61520.000000 41231.000000 62381.000000 42795.000000 60289.000000 45434.000000 55741.000000 44706.000000 58371.000000 46060.000000 55263.000000 50383.000000 51103.000000 47844.000000 53731.000000 50462.000000 50987.000000 50852.000000 50495.000000 52704.000000 48717.000000 54511.000000 46953.000000 54881.000000 46800.000000 56989.000000 45322.000000 58441.000000 44369.000000 62353.000000 40820.000000 59858.000000 43332.000000 61479.000000 41771.000000 60797.000000 42040.000000 64497.000000 39781.000000 64449.000000 39837.000000 66500.000000 38634.000000 70084.000000 36521.000000 70699.000000 36450.000000 71153.000000 36228.000000 69907.000000 37293.000000 71396.000000 35944.000000 73682.000000 35059.000000 71169.000000 36066.000000 77872.000000 33343.000000 77816.000000 33980.000000 84010.000000 31954.000000 89781.000000 30064.000000 84894.000000 31132.000000 85908.000000 30930.000000 87762.000000 30478.000000 93365.000000 29254.000000 92483.000000 29770.000000 97599.000000 28498.000000 106815.000000 27014.000000 100267.000000 27892.000000 118865.000000 25209.000000 113698.000000 26148.000000 115469.000000 25854.000000 122251.000000 24888.000000 133836.000000 23953.000000 143176.000000 23456.000000 132499.000000 23996.000000 146874.000000 23058.000000 153689.000000 22774.000000 164886.000000 22461.000000 170187.000000 22396.000000 170537.000000 22336.000000 176436.000000 22141.000000 21292.000000 176171.000000 21408.000000 164244.000000 22242.000000 143419.000000 22628.000000 136875.000000 22878.000000 132494.000000 23242.000000 129181.000000 23925.000000 121309.000000 24353.000000 113989.000000 25559.000000 104460.000000 25659.000000 104389.000000 25891.000000 102564.000000 25894.000000 102100.000000 25941.000000 101664.000000 26385.000000 100828.000000 27346.000000 93323.000000 27913.000000 90720.000000 26821.000000 96192.000000 29217.000000 86951.000000 29455.000000 85511.000000 30356.000000 84750.000000 29594.000000 85045.000000 32648.000000 79124.000000 32711.000000 77276.000000 31867.000000 79527.000000 34723.000000 73234.000000 33694.000000 75762.000000 36225.000000 70342.000000 37291.000000 69187.000000 39088.000000 66209.000000 37964.000000 67924.000000 41234.000000 62617.000000 38115.000000 66896.000000 41760.000000 61511.000000 44961.000000 57858.000000 43152.000000 59103.000000 45310.000000 55884.000000 46659.000000 55331.000000 46999.000000 54906.000000 51660.000000 50520.000000 50612.000000 50564.000000 47913.000000 53310.000000 53270.000000 48438.000000 52098.000000 49385.000000 54026.000000 48098.000000 54659.000000 47182.000000 55728.000000 46423.000000 58837.000000 43783.000000 60170.000000 42732.000000 57255.000000 44568.000000 62116.000000 41516.000000 66194.000000 38606.000000 64884.000000 40087.000000 65629.000000 39556.000000 69146.000000 37204.000000 68683.000000 37375.000000 73643.000000 34898.000000 73099.000000 35196.000000 77872.000000 33343.000000 85214.000000 31529.000000 83154.000000 31728.000000 90170.000000 30052.000000 86311.000000 31125.000000 89241.000000 30735.000000 89338.000000 30091.000000 92000.000000 29744.000000 101582.000000 28062.000000 97847.000000 28792.000000 114314.000000 25920.000000 107594.000000 27149.000000 113390.000000 26065.000000 118173.000000 25673.000000 124005.000000 24761.000000 136373.000000 23825.000000 138265.000000 23664.000000 141425.000000 23404.000000 146206.000000 23062.000000 152204.000000 22879.000000 153311.000000 22791.000000 168110.000000 22602.000000 172958.000000 22210.000000 21346.000000 178221.000000 21444.000000 164797.000000 22304.000000 145343.000000 23046.000000 132120.000000 23719.000000 120801.000000 23801.000000 119346.000000 23698.000000 121347.000000 24940.000000 108881.000000 25714.000000 101528.000000 26879.000000 95758.000000 26029.000000 100462.000000 27926.000000 90828.000000 27097.000000 93980.000000 30523.000000 85294.000000 28819.000000 90303.000000 28851.000000 87867.000000 29575.000000 86498.000000 29389.000000 86824.000000 33479.000000 76579.000000 31640.000000 80022.000000 33767.000000 74809.000000 34569.000000 74339.000000 34612.000000 72812.000000 38287.000000 66734.000000 36119.000000 71698.000000 36747.000000 68705.000000 37178.000000 68303.000000 42692.000000 60846.000000 41561.000000 61410.000000 44201.000000 58475.000000 43217.000000 60072.000000 46637.000000 54796.000000 49615.000000 51411.000000 47041.000000 53620.000000 48094.000000 53209.000000 47454.000000 53321.000000 45792.000000 55484.000000 51331.000000 50010.000000 54649.000000 47366.000000 51652.000000 49336.000000 55779.000000 45710.000000 56390.000000 45427.000000 60324.000000 42908.000000 58079.000000 44217.000000 60553.000000 42803.000000 62935.000000 40957.000000 59858.000000 43007.000000 63052.000000 40816.000000 64916.000000 39974.000000 63482.000000 40295.000000 65910.000000 39429.000000 69067.000000 37281.000000 70182.000000 36958.000000 67813.000000 37777.000000 71331.000000 36658.000000 72607.000000 35421.000000 73643.000000 34898.000000 75190.000000 34131.000000 75153.000000 34668.000000 78890.000000 33102.000000 81546.000000 32915.000000 81697.000000 32443.000000 84272.000000 31278.000000 91305.000000 30040.000000 98445.000000 28799.000000 91009.000000 30124.000000 91622.000000 29593.000000 95485.000000 28996.000000 99884.000000 28000.000000 98856.000000 28411.000000 110301.000000 26415.000000 112020.000000 26259.000000 115726.000000 25856.000000 127364.000000 24639.000000 132742.000000 24072.000000 142903.000000 23238.000000 137483.000000 23875.000000 146179.000000 22979.000000 153585.000000 22680.000000 162458.000000 22395.000000 171860.000000 22183.000000 21411.000000 174338.000000 21979.000000 151994.000000 21685.000000 157337.000000 22103.000000 147327.000000 22610.000000 141715.000000 22777.000000 136970.000000 23101.000000 128216.000000 23791.000000 120527.000000 23928.000000 118953.000000 24749.000000 113490.000000 25360.000000 104494.000000 26230.000000 102039.000000 26047.000000 102237.000000 26926.000000 99072.000000 27033.000000 96821.000000 27369.000000 95908.000000 28207.000000 91379.000000 27828.000000 92458.000000 28558.000000 89460.000000 30025.000000 85426.000000 29195.000000 87721.000000 29547.000000 87555.000000 30355.000000 83135.000000 31948.000000 80856.000000 32943.000000 77197.000000 32456.000000 78737.000000 33369.000000 75519.000000 36005.000000 70687.000000 34771.000000 72337.000000 37691.000000 68959.000000 39305.000000 65160.000000 41271.000000 61772.000000 42349.000000 61217.000000 43235.000000 60760.000000 45394.000000 56175.000000 44189.000000 58902.000000 44332.000000 58249.000000 49589.000000 52021.000000 48211.000000 53605.000000 47048.000000 53825.000000 49004.000000 52805.000000 52419.000000 49456.000000 53439.000000 47880.000000 52236.000000 49464.000000 56272.000000 45895.000000 56488.000000 45424.000000 58392.000000 44584.000000 53675.000000 47453.000000 54955.000000 46744.000000 64736.000000 39656.000000 63450.000000 41088.000000 63483.000000 40721.000000 63494.000000 40521.000000 70491.000000 36960.000000 66336.000000 39261.000000 69123.000000 37401.000000 67968.000000 38607.000000 71709.000000 35774.000000 72237.000000 35634.000000 78229.000000 33765.000000 78859.000000 33023.000000 81881.000000 31989.000000 85093.000000 31382.000000 84682.000000 31837.000000 86819.000000 30971.000000 89022.000000 30020.000000 93714.000000 29089.000000 99212.000000 27966.000000 95242.000000 28949.000000 106827.000000 26914.000000 109760.000000 26571.000000 117288.000000 25370.000000 118920.000000 25187.000000 128199.000000 24564.000000 129321.000000 24459.000000 138626.000000 23752.000000 136588.000000 23790.000000 143481.000000 23193.000000 146222.000000 22999.000000 152937.000000 22744.000000 156028.000000 22589.000000 166890.000000 22332.000000 177385.000000 22258.000000 21353.000000 178946.000000 21408.000000 171051.000000 22012.000000 149225.000000 21840.000000 153071.000000 22545.000000 135710.000000 23012.000000 129755.000000 23671.000000 120482.000000 23802.000000 119919.000000 24827.000000 110007.000000 25287.000000 105922.000000 25649.000000 105368.000000 26102.000000 100243.000000 25256.000000 107115.000000 26545.000000 97288.000000 26801.000000 95553.000000 27261.000000 95380.000000 28095.000000 90134.000000 29736.000000 85847.000000 29703.000000 87650.000000 29866.000000 84290.000000 31604.000000 81745.000000 32503.000000 77445.000000 34123.000000 73673.000000 35812.000000 71462.000000 35235.000000 72150.000000 36194.000000 70427.000000 38732.000000 65347.000000 41218.000000 63601.000000 40301.000000 63622.000000 42845.000000 59982.000000 43853.000000 59265.000000 43711.000000 59731.000000 41479.000000 61504.000000 48470.000000 52759.000000 44233.000000 57752.000000 49210.000000 51509.000000 51283.000000 50675.000000 49555.000000 51225.000000 56313.000000 46043.000000 57873.000000 44317.000000 56975.000000 44728.000000 56598.000000 45440.000000 58677.000000 43820.000000 59263.000000 43247.000000 60342.000000 42849.000000 61479.000000 42170.000000 65432.000000 39365.000000 65779.000000 39335.000000 64429.000000 40019.000000 71624.000000 36058.000000 65865.000000 38533.000000 70736.000000 36389.000000 72093.000000 36038.000000 73643.000000 34898.000000 78599.000000 33376.000000 76904.000000 33928.000000 74124.000000 34532.000000 80755.000000 32474.000000 83118.000000 31604.000000 89908.000000 29885.000000 91077.000000 29878.000000 95351.000000 28809.000000 95565.000000 28797.000000 96705.000000 28558.000000 107736.000000 26746.000000 104616.000000 27284.000000 107622.000000 26940.000000 114833.000000 25787.000000 119108.000000 25207.000000 120016.000000 25110.000000 138268.000000 23645.000000 133449.000000 24007.000000 146867.000000 22972.000000 159366.000000 22547.000000 157732.000000 22676.000000 165263.000000 22447.000000 170707.000000 22335.000000 179907.000000 22214.000000 21419.000000 168233.000000 22216.000000 153074.000000 21605.000000 160778.000000 22264.000000 145858.000000 22452.000000 137262.000000 22323.000000 140772.000000 23329.000000 124701.000000 24414.000000 114284.000000 24828.000000 110580.000000 25453.000000 105418.000000 25864.000000 101557.000000 26012.000000 100016.000000 26317.000000 98596.000000 26801.000000 95553.000000 28584.000000 88316.000000 27233.000000 93580.000000 27744.000000 92186.000000 28445.000000 88981.000000 28797.000000 88023.000000 30544.000000 82934.000000 29503.000000 86253.000000 31353.000000 81534.000000 33254.000000 76369.000000 33893.000000 76294.000000 33959.000000 75147.000000 34867.000000 72569.000000 35106.000000 72430.000000 37398.000000 68369.000000 38621.000000 65987.000000 40450.000000 63998.000000 37049.000000 69090.000000 42310.000000 60753.000000 41589.000000 61674.000000 43644.000000 58945.000000 44724.000000 57786.000000 43325.000000 59411.000000 47765.000000 53364.000000 45904.000000 55733.000000 47679.000000 54975.000000 48391.000000 53252.000000 49726.000000 51368.000000 51414.000000 49471.000000 50691.000000 50553.000000 50232.000000 50685.000000 53025.000000 48432.000000 55614.000000 46476.000000 58089.000000 43865.000000 57933.000000 44157.000000 61443.000000 41595.000000 63710.000000 40512.000000 63753.000000 40383.000000 66813.000000 37837.000000 70560.000000 36347.000000 67308.000000 37813.000000 68431.000000 37298.000000 69498.000000 36892.000000 74729.000000 34775.000000 77262.000000 33723.000000 76341.000000 34761.000000 81378.000000 32057.000000 82002.000000 32025.000000 88288.000000 30179.000000 84304.000000 31308.000000 92273.000000 29901.000000 94269.000000 29327.000000 95514.000000 29216.000000 98756.000000 28098.000000 107305.000000 26859.000000 110630.000000 26398.000000 112738.000000 26338.000000 115231.000000 25859.000000 118393.000000 25499.000000 133224.000000 24188.000000 125923.000000 24883.000000 141573.000000 23518.000000 146406.000000 22971.000000 152710.000000 22752.000000 154683.000000 22746.000000 171860.000000 22183.000000 21292.000000 176171.000000 21370.000000 167892.000000 21472.000000 164019.000000 22022.000000 149463.000000 22247.000000 143521.000000 23046.000000 132120.000000 23547.000000 126750.000000 23655.000000 122441.000000 23662.000000 120402.000000 25334.000000 108066.000000 25843.000000 102059.000000 25718.000000 104772.000000 25735.000000 103542.000000 26486.000000 97899.000000 27219.000000 94500.000000 26801.000000 95553.000000 28842.000000 88467.000000 27975.000000 94410.000000 28203.000000 89999.000000 30035.000000 84829.000000 29744.000000 85124.000000 30469.000000 84155.000000 29523.000000 86708.000000 32685.000000 78668.000000 31512.000000 79864.000000 33711.000000 75783.000000 33338.000000 76687.000000 35954.000000 70458.000000 37533.000000 67504.000000 35292.000000 72235.000000 38610.000000 66046.000000 39093.000000 65876.000000 38131.000000 66865.000000 40820.000000 62548.000000 42045.000000 60601.000000 42892.000000 60301.000000 44631.000000 57410.000000 43808.000000 59013.000000 45869.000000 56062.000000 46940.000000 54184.000000 46554.000000 54761.000000 51232.000000 49840.000000 47041.000000 53620.000000 50354.000000 51080.000000 52924.000000 48629.000000 53866.000000 48552.000000 56698.000000 45422.000000 54828.000000 47047.000000 58749.000000 43996.000000 60647.000000 42284.000000 61817.000000 41740.000000 62597.000000 41295.000000 64254.000000 39766.000000 64187.000000 39814.000000 65232.000000 39386.000000 66469.000000 38860.000000 68531.000000 38238.000000 69681.000000 37487.000000 70927.000000 36332.000000 73028.000000 35664.000000 72130.000000 36007.000000 75208.000000 34810.000000 76816.000000 34102.000000 81404.000000 32220.000000 78857.000000 33023.000000 83395.000000 31881.000000 88288.000000 30179.000000 92734.000000 29480.000000 93955.000000 29214.000000 92458.000000 29896.000000 99485.000000 28245.000000 104957.000000 27148.000000 102364.000000 27549.000000 109779.000000 26724.000000 116793.000000 25655.000000 118031.000000 25362.000000 134850.000000 24151.000000 121103.000000 25287.000000 137719.000000 23889.000000 144691.000000 23532.000000 147137.000000 22984.000000 153124.000000 22679.000000 159692.000000 22467.000000 166550.000000 22381.000000 174130.000000 22380.000000 21370.000000 167892.000000 22107.000000 150060.000000 22452.000000 137262.000000 22338.000000 141907.000000 23274.000000 130042.000000 24446.000000 114989.000000 24646.000000 114846.000000 23890.000000 119094.000000 24930.000000 109301.000000 25771.000000 102878.000000 25698.000000 103362.000000 26135.000000 100712.000000 26807.000000 96243.000000 27364.000000 93257.000000 28281.000000 90204.000000 27097.000000 93980.000000 29428.000000 86912.000000 28719.000000 88609.000000 27952.000000 90584.000000 29822.000000 85329.000000 30043.000000 84477.000000 32110.000000 79070.000000 32503.000000 78569.000000 33127.000000 76760.000000 34898.000000 72317.000000 35361.000000 71575.000000 36726.000000 70015.000000 36970.000000 68903.000000 40696.000000 63088.000000 38993.000000 65068.000000 42204.000000 60648.000000 45152.000000 56968.000000 43504.000000 59274.000000 44694.000000 57815.000000 42656.000000 60202.000000 42771.000000 60136.000000 44660.000000 57884.000000 45653.000000 56243.000000 47780.000000 54180.000000 48571.000000 53212.000000 47045.000000 54393.000000 48869.000000 52668.000000 49523.000000 51495.000000 51128.000000 49892.000000 55463.000000 46492.000000 58440.000000 44892.000000 56605.000000 45124.000000 59603.000000 43380.000000 57078.000000 44908.000000 59028.000000 43717.000000 61329.000000 41883.000000 62433.000000 41653.000000 63788.000000 40745.000000 66821.000000 38460.000000 67167.000000 38393.000000 66721.000000 38559.000000 68713.000000 37206.000000 71994.000000 36038.000000 70916.000000 36828.000000 74724.000000 34817.000000 73666.000000 35271.000000 73912.000000 35034.000000 76889.000000 34117.000000 80282.000000 33162.000000 83476.000000 32091.000000 83993.000000 32003.000000 87485.000000 30535.000000 86886.000000 31239.000000 90657.000000 29975.000000 92635.000000 29449.000000 96013.000000 28765.000000 98985.000000 28455.000000 99763.000000 28027.000000 103823.000000 27710.000000 104133.000000 27425.000000 107160.000000 26937.000000 122894.000000 25280.000000 117351.000000 25607.000000 121481.000000 25305.000000 136067.000000 23897.000000 143452.000000 23248.000000 147551.000000 23095.000000 153124.000000 22679.000000 159692.000000 22467.000000 170801.000000 22274.000000 21446.000000 178062.000000 21512.000000 172584.000000 21748.000000 161111.000000 21918.000000 156296.000000 22490.000000 138545.000000 23008.000000 135822.000000 23704.000000 122187.000000 24371.000000 117119.000000 24895.000000 109925.000000 24480.000000 112966.000000 25109.000000 108494.000000 25447.000000 104782.000000 25965.000000 103022.000000 26463.000000 100696.000000 28085.000000 93789.000000 26766.000000 98048.000000 27097.000000 93980.000000 26879.000000 95758.000000 28873.000000 89005.000000 28134.000000 89998.000000 29185.000000 86593.000000 30206.000000 83563.000000 30531.000000 83272.000000 31906.000000 79103.000000 33213.000000 78322.000000 37360.000000 67956.000000 34585.000000 72809.000000 34245.000000 73536.000000 35507.000000 71800.000000 41110.000000 63059.000000 38861.000000 66309.000000 41346.000000 61778.000000 43620.000000 59849.000000 40471.000000 63173.000000 42274.000000 60721.000000 45752.000000 56317.000000 44796.000000 56804.000000 45850.000000 55973.000000 47632.000000 53229.000000 47485.000000 53650.000000 49044.000000 51959.000000 50390.000000 51223.000000 53615.000000 47953.000000 54349.000000 47395.000000 52203.000000 48769.000000 58282.000000 43600.000000 55973.000000 45938.000000 56275.000000 45370.000000 62811.000000 40706.000000 59196.000000 43167.000000 67863.000000 38115.000000 65498.000000 39221.000000 66050.000000 38860.000000 66273.000000 38812.000000 68900.000000 37123.000000 68311.000000 37723.000000 71354.000000 36346.000000 71979.000000 35892.000000 74124.000000 35215.000000 78171.000000 34001.000000 78504.000000 33384.000000 82064.000000 32443.000000 84514.000000 31653.000000 87662.000000 30800.000000 83118.000000 31832.000000 86626.000000 31174.000000 89174.000000 30044.000000 94779.000000 29031.000000 100096.000000 27982.000000 102632.000000 27677.000000 98451.000000 28368.000000 110215.000000 26376.000000 100258.000000 27932.000000 118264.000000 25639.000000 120246.000000 25185.000000 117579.000000 25648.000000 124606.000000 24884.000000 142903.000000 23238.000000 146406.000000 22971.000000 153673.000000 22689.000000 159465.000000 22475.000000 169074.000000 22264.000000 167979.000000 22334.000000 179222.000000 22209.000000 21346.000000 178221.000000 21867.000000 166278.000000 21398.000000 167114.000000 22052.000000 148018.000000 22468.000000 142939.000000 22906.000000 132251.000000 23719.000000 123278.000000 23755.000000 122839.000000 24776.000000 111446.000000 24765.000000 112059.000000 25315.000000 109712.000000 25796.000000 104411.000000 26108.000000 102629.000000 26287.000000 99392.000000 26187.000000 101474.000000 26710.000000 98506.000000 26794.000000 97255.000000 27365.000000 93983.000000 26844.000000 96406.000000 27767.000000 92988.000000 28316.000000 89591.000000 28847.000000 89196.000000 29464.000000 86607.000000 30199.000000 83628.000000 29830.000000 85046.000000 30355.000000 83135.000000 32741.000000 78567.000000 34449.000000 74546.000000 33194.000000 76818.000000 36503.000000 69622.000000 35103.000000 72656.000000 34812.000000 73119.000000 37209.000000 67841.000000 41438.000000 62850.000000 38938.000000 65298.000000 40239.000000 64406.000000 45348.000000 56371.000000 43253.000000 59275.000000 49118.000000 52248.000000 50433.000000 50928.000000 48593.000000 53733.000000 46880.000000 54295.000000 49196.000000 52050.000000 50838.000000 50414.000000 54099.000000 47648.000000 54954.000000 47229.000000 56161.000000 45908.000000 52790.000000 48448.000000 58285.000000 44212.000000 56860.000000 45176.000000 55289.000000 46202.000000 62679.000000 40753.000000 61947.000000 41382.000000 65154.000000 39497.000000 67322.000000 38004.000000 64354.000000 40170.000000 70364.000000 37077.000000 67190.000000 38017.000000 68081.000000 37510.000000 74771.000000 34826.000000 75228.000000 34462.000000 79650.000000 33082.000000 78607.000000 33743.000000 79199.000000 33289.000000 84236.000000 31249.000000 83630.000000 31341.000000 86468.000000 30899.000000 91191.000000 29935.000000 88452.000000 30226.000000 89475.000000 30074.000000 94310.000000 29196.000000 98890.000000 28199.000000 101281.000000 27702.000000 108577.000000 27109.000000 105080.000000 27399.000000 116484.000000 26106.000000 119069.000000 25235.000000 129288.000000 24189.000000 143591.000000 23231.000000 145992.000000 23104.000000 155544.000000 22708.000000 159692.000000 22467.000000 164279.000000 22416.000000 170201.000000 22307.000000 180614.000000 22274.000000 21380.000000 165022.000000 21577.000000 159478.000000 22014.000000 152890.000000 22490.000000 138545.000000 22940.000000 129524.000000 23325.000000 129101.000000 23568.000000 122314.000000 24443.000000 113430.000000 25591.000000 103889.000000 25858.000000 100867.000000 25849.000000 103007.000000 25564.000000 104672.000000 26319.000000 98199.000000 27126.000000 96750.000000 27175.000000 94185.000000 27834.000000 92566.000000 28662.000000 88521.000000 28890.000000 88440.000000 28281.000000 90204.000000 29392.000000 86415.000000 30392.000000 83091.000000 31489.000000 81179.000000 29744.000000 85124.000000 31021.000000 81600.000000 33894.000000 76322.000000 32029.000000 79077.000000 34670.000000 73654.000000 36112.000000 70023.000000 34069.000000 74084.000000 36825.000000 69288.000000 40843.000000 62873.000000 43960.000000 58899.000000 42544.000000 60193.000000 38229.000000 66201.000000 40685.000000 64004.000000 44763.000000 57720.000000 44803.000000 56914.000000 46640.000000 55161.000000 48040.000000 53844.000000 50992.000000 50548.000000 53659.000000 47754.000000 49760.000000 51653.000000 48833.000000 52778.000000 49416.000000 51684.000000 53209.000000 48394.000000 52717.000000 49200.000000 57628.000000 45050.000000 57108.000000 45252.000000 60962.000000 42458.000000 56563.000000 45300.000000 59939.000000 42735.000000 62593.000000 40705.000000 61694.000000 41342.000000 65030.000000 39038.000000 66610.000000 38549.000000 64784.000000 39948.000000 66937.000000 38395.000000 67308.000000 37813.000000 70977.000000 36352.000000 70898.000000 36716.000000 69498.000000 37265.000000 74549.000000 35027.000000 74130.000000 35028.000000 76762.000000 34300.000000 81806.000000 32981.000000 78692.000000 33037.000000 84679.000000 31576.000000 83178.000000 31706.000000 90609.000000 29680.000000 92683.000000 29547.000000 95252.000000 29002.000000 95022.000000 29375.000000 99311.000000 28093.000000 99376.000000 28021.000000 108177.000000 26718.000000 112135.000000 26141.000000 114250.000000 26105.000000 121558.000000 25054.000000 121502.000000 25160.000000 130829.000000 24200.000000 142903.000000 23238.000000 142132.000000 23327.000000 145758.000000 23017.000000 156171.000000 22585.000000 159788.000000 22538.000000 165632.000000 22356.000000 171935.000000 22256.000000 21365.000000 177663.000000 21451.000000 170981.000000 21990.000000 150018.000000 21819.000000 157603.000000 22415.000000 141895.000000 22452.000000 137262.000000 22919.000000 130561.000000 24438.000000 115064.000000 23896.000000 117595.000000 24408.000000 115573.000000 25163.000000 109316.000000 25360.000000 104494.000000 26053.000000 100010.000000 27312.000000 95436.000000 27592.000000 93918.000000 27642.000000 93154.000000 28387.000000 90171.000000 29107.000000 88764.000000 28726.000000 88799.000000 29866.000000 84290.000000 31225.000000 80631.000000 32425.000000 78054.000000 33978.000000 76243.000000 35029.000000 73200.000000 34134.000000 74831.000000 36169.000000 70812.000000 35388.000000 71340.000000 35030.000000 72608.000000 38406.000000 66211.000000 39060.000000 64965.000000 42970.000000 59700.000000 42477.000000 61726.000000 40981.000000 62113.000000 44985.000000 57599.000000 43705.000000 58528.000000 45241.000000 56877.000000 45217.000000 57027.000000 49075.000000 52517.000000 47425.000000 54659.000000 47846.000000 53383.000000 50359.000000 50276.000000 52498.000000 49185.000000 52637.000000 48404.000000 53984.000000 47785.000000 54395.000000 47571.000000 55827.000000 46075.000000 56189.000000 45620.000000 58975.000000 43341.000000 62843.000000 41005.000000 57801.000000 44421.000000 65186.000000 39403.000000 64405.000000 39635.000000 66311.000000 39276.000000 71997.000000 35741.000000 66178.000000 39343.000000 70797.000000 37223.000000 73685.000000 35320.000000 74766.000000 34896.000000 71067.000000 36384.000000 76806.000000 33744.000000 74217.000000 35010.000000 82304.000000 31862.000000 79606.000000 32702.000000 81879.000000 32541.000000 87997.000000 30392.000000 89022.000000 30020.000000 91837.000000 29746.000000 102097.000000 28119.000000 94066.000000 28980.000000 102950.000000 27538.000000 104655.000000 27162.000000 107567.000000 26775.000000 107475.000000 26808.000000 114821.000000 25800.000000 135524.000000 23922.000000 121119.000000 25063.000000 142993.000000 23310.000000 146206.000000 23062.000000 146406.000000 22971.000000 149199.000000 22887.000000 155643.000000 22840.000000 169788.000000 22285.000000 178115.000000 22251.000000 21385.000000 173116.000000 21839.000000 157111.000000 21889.000000 152708.000000 22057.000000 146916.000000 22468.000000 142806.000000 23422.000000 127109.000000 23145.000000 128797.000000 23776.000000 120411.000000 24172.000000 117744.000000 25044.000000 108641.000000 25397.000000 106423.000000 25580.000000 105302.000000 25947.000000 102998.000000 26348.000000 101294.000000 26446.000000 101008.000000 26499.000000 98771.000000 27075.000000 96566.000000 28203.000000 89999.000000 27923.000000 92305.000000 28720.000000 87916.000000 29028.000000 87211.000000 29745.000000 85663.000000 30728.000000 82700.000000 31634.000000 81575.000000 31708.000000 79621.000000 33373.000000 76066.000000 32503.000000 77445.000000 33378.000000 75871.000000 34560.000000 73485.000000 37120.000000 68676.000000 37597.000000 67334.000000 39933.000000 64596.000000 37876.000000 67216.000000 38572.000000 65999.000000 41955.000000 60973.000000 41919.000000 61412.000000 45333.000000 56337.000000 46464.000000 54724.000000 45809.000000 55976.000000 50442.000000 50464.000000 49752.000000 52329.000000 48663.000000 53074.000000 47212.000000 54595.000000 50394.000000 50886.000000 52367.000000 49569.000000 52538.000000 48161.000000 57153.000000 44856.000000 58640.000000 43694.000000 57845.000000 44638.000000 60229.000000 43093.000000 61029.000000 42055.000000 64377.000000 40013.000000 63775.000000 40365.000000 63275.000000 40555.000000 63234.000000 40587.000000 67308.000000 37813.000000 69205.000000 37779.000000 67104.000000 38457.000000 65865.000000 38533.000000 73227.000000 35270.000000 71449.000000 35687.000000 75248.000000 34635.000000 70474.000000 36437.000000 78214.000000 33159.000000 82067.000000 32095.000000 81613.000000 32434.000000 87075.000000 30683.000000 84840.000000 31462.000000 89027.000000 30115.000000 91517.000000 29761.000000 95593.000000 28634.000000 94066.000000 28980.000000 98760.000000 27977.000000 103370.000000 27500.000000 107762.000000 26745.000000 111445.000000 26288.000000 116418.000000 25606.000000 127870.000000 24617.000000 120609.000000 25030.000000 139195.000000 23692.000000 148115.000000 22958.000000 146406.000000 22971.000000 159692.000000 22467.000000 166176.000000 22311.000000 172873.000000 22172.000000 21282.000000 178446.000000 21355.000000 168458.000000 21658.000000 161293.000000 22453.000000 144843.000000 22631.000000 140086.000000 22754.000000 134023.000000 23549.000000 125655.000000 24612.000000 114490.000000 24185.000000 117670.000000 26053.000000 100010.000000 25624.000000 102645.000000 26822.000000 96204.000000 26424.000000 98408.000000 26700.000000 97766.000000 27756.000000 92904.000000 28062.000000 90428.000000 30680.000000 83922.000000 29185.000000 86593.000000 29972.000000 84858.000000 31176.000000 81067.000000 31420.000000 80836.000000 34998.000000 73288.000000 35298.000000 72006.000000 36616.000000 69663.000000 38720.000000 65518.000000 35913.000000 70918.000000 37901.000000 68004.000000 40502.000000 63559.000000 39312.000000 64616.000000 45289.000000 56099.000000 43961.000000 58053.000000 43398.000000 60062.000000 44041.000000 57895.000000 47484.000000 53951.000000 46080.000000 55452.000000 47559.000000 53597.000000 48388.000000 52744.000000 51338.000000 50210.000000 50700.000000 50376.000000 51015.000000 50296.000000 54047.000000 47481.000000 53263.000000 47858.000000 55627.000000 46123.000000 59273.000000 43917.000000 59945.000000 43128.000000 61787.000000 41469.000000 63303.000000 40845.000000 63657.000000 40158.000000 66941.000000 38325.000000 61589.000000 41948.000000 66175.000000 38426.000000 67504.000000 37648.000000 72842.000000 35497.000000 73757.000000 35311.000000 72488.000000 35779.000000 75190.000000 34131.000000 78270.000000 33657.000000 81564.000000 32221.000000 84364.000000 31182.000000 87521.000000 30990.000000 89022.000000 30020.000000 85325.000000 31175.000000 101365.000000 28074.000000 96072.000000 29207.000000 106142.000000 27164.000000 103377.000000 27695.000000 111134.000000 26235.000000 106688.000000 26969.000000 115753.000000 25677.000000 127632.000000 24414.000000 146179.000000 22979.000000 141662.000000 23404.000000 152897.000000 22687.000000 155801.000000 22597.000000 165632.000000 22356.000000 172020.000000 22294.000000 21373.000000 177391.000000 21444.000000 164797.000000 21620.000000 163027.000000 22562.000000 137915.000000 22526.000000 140721.000000 22961.000000 134030.000000 23082.000000 128115.000000 24031.000000 120698.000000 24350.000000 116301.000000 24710.000000 112389.000000 25450.000000 104447.000000 26066.000000 100784.000000 25992.000000 102331.000000 26234.000000 100775.000000 26577.000000 97129.000000 26382.000000 97986.000000 28361.000000 91426.000000 27703.000000 94538.000000 28965.000000 88490.000000 29186.000000 86919.000000 30388.000000 83427.000000 29306.000000 86602.000000 31282.000000 80889.000000 33292.000000 77080.000000 32421.000000 78387.000000 32560.000000 77490.000000 35894.000000 71365.000000 34503.000000 73439.000000 37408.000000 67689.000000 34219.000000 74204.000000 38914.000000 65808.000000 40473.000000 63086.000000 41909.000000 61999.000000 42496.000000 61079.000000 44837.000000 57081.000000 43697.000000 58877.000000 46257.000000 55277.000000 45988.000000 55522.000000 46524.000000 54997.000000 50937.000000 51729.000000 48370.000000 52941.000000 48906.000000 52027.000000 51266.000000 49485.000000 51859.000000 49409.000000 52590.000000 48493.000000 54679.000000 47292.000000 56828.000000 45950.000000 60853.000000 42407.000000 64042.000000 40073.000000 63246.000000 40436.000000 60090.000000 42577.000000 62839.000000 41250.000000 63243.000000 40638.000000 65719.000000 39639.000000 67308.000000 37813.000000 69268.000000 37493.000000 73300.000000 35257.000000 71130.000000 36203.000000 72257.000000 35992.000000 70276.000000 36851.000000 76099.000000 34307.000000 75232.000000 34491.000000 79133.000000 33472.000000 79632.000000 32972.000000 83092.000000 31939.000000 83515.000000 31573.000000 90286.000000 29972.000000 89330.000000 30038.000000 93503.000000 29275.000000 95374.000000 28819.000000 101499.000000 27759.000000 102482.000000 27641.000000 113169.000000 26018.000000 106259.000000 27036.000000 117634.000000 25577.000000 118721.000000 25489.000000 129804.000000 24399.000000 125608.000000 24587.000000 141142.000000 23563.000000 142776.000000 23454.000000 149142.000000 23091.000000 153124.000000 22679.000000 171860.000000 22183.000000 21282.000000 178446.000000 21327.000000 169236.000000 21576.000000 164764.000000 21640.000000 158966.000000 22299.000000 146851.000000 22683.000000 138683.000000 23218.000000 128962.000000 23404.000000 124483.000000 23568.000000 122314.000000 23473.000000 124020.000000 23879.000000 118579.000000 25357.000000 105880.000000 26084.000000 101300.000000 26269.000000 99500.000000 27617.000000 92293.000000 27097.000000 93980.000000 28598.000000 89618.000000 29188.000000 87019.000000 28898.000000 87314.000000 29095.000000 87231.000000 30396.000000 83637.000000 29859.000000 84711.000000 32593.000000 78418.000000 31605.000000 82085.000000 34239.000000 73842.000000 32802.000000 77412.000000 35061.000000 73299.000000 36333.000000 70370.000000 35470.000000 72044.000000 37087.000000 67978.000000 40136.000000 64005.000000 41232.000000 62059.000000 44826.000000 57718.000000 43406.000000 60244.000000 44680.000000 57779.000000 46081.000000 55311.000000 45848.000000 55354.000000 52118.000000 49414.000000 49054.000000 51625.000000 49639.000000 51097.000000 51954.000000 50213.000000 55226.000000 46635.000000 55351.000000 46278.000000 56043.000000 45871.000000 58992.000000 43566.000000 60578.000000 42156.000000 60200.000000 42834.000000 61833.000000 41926.000000 62663.000000 41592.000000 64583.000000 39955.000000 64990.000000 39102.000000 63353.000000 40703.000000 72136.000000 35657.000000 67333.000000 38346.000000 70815.000000 36232.000000 71959.000000 35813.000000 70254.000000 37320.000000 69592.000000 37993.000000 76288.000000 34479.000000 78568.000000 33436.000000 77387.000000 33826.000000 82018.000000 32980.000000 82060.000000 32667.000000 85253.000000 31315.000000 84300.000000 31737.000000 89602.000000 30404.000000 94007.000000 29191.000000 94458.000000 28960.000000 98622.000000 28481.000000 103543.000000 27503.000000 105291.000000 27102.000000 102745.000000 27537.000000 107903.000000 26729.000000 112166.000000 26262.000000 113552.000000 25924.000000 120925.000000 25334.000000 133784.000000 23942.000000 151103.000000 22895.000000 141483.000000 23339.000000 152924.000000 22770.000000 158320.000000 22512.000000 171795.000000 22253.000000 177206.000000 22184.000000 21408.000000 172046.000000 21591.000000 164116.000000 22058.000000 148969.000000 22661.000000 135575.000000 23574.000000 121227.000000 23897.000000 120458.000000 24458.000000 114034.000000 25789.000000 101859.000000 25852.000000 101337.000000 26600.000000 97669.000000 27355.000000 94100.000000 28590.000000 89006.000000 28316.000000 89591.000000 29490.000000 88058.000000 29679.000000 86614.000000 30494.000000 83657.000000 28790.000000 88767.000000 31676.000000 80401.000000 32960.000000 78217.000000 34146.000000 74220.000000 35075.000000 72683.000000 33426.000000 75564.000000 37152.000000 69332.000000 36557.000000 71326.000000 34878.000000 73185.000000 36698.000000 70279.000000 38899.000000 65732.000000 38274.000000 67002.000000 44001.000000 58451.000000 37172.000000 69150.000000 41415.000000 63073.000000 44839.000000 56870.000000 41967.000000 60968.000000 44757.000000 57570.000000 48911.000000 53126.000000 47791.000000 53259.000000 46300.000000 54915.000000 50092.000000 51244.000000 50987.000000 50873.000000 49211.000000 51744.000000 51315.000000 50079.000000 51637.000000 48902.000000 53231.000000 48881.000000 56498.000000 45988.000000 59006.000000 43972.000000 61378.000000 42086.000000 60459.000000 43124.000000 64577.000000 39437.000000 62685.000000 41361.000000 64445.000000 40848.000000 66813.000000 37837.000000 68239.000000 37476.000000 70115.000000 36395.000000 75125.000000 34772.000000 78262.000000 33430.000000 75643.000000 34344.000000 78353.000000 33299.000000 83349.000000 31874.000000 87388.000000 30537.000000 84205.000000 31230.000000 90084.000000 30001.000000 92436.000000 29527.000000 95209.000000 29091.000000 98529.000000 28799.000000 99127.000000 28396.000000 100092.000000 28025.000000 109851.000000 26580.000000 109920.000000 26418.000000 122378.000000 25347.000000 126338.000000 24826.000000 133230.000000 23884.000000 141927.000000 23416.000000 146309.000000 23210.000000 143824.000000 23364.000000 150541.000000 23026.000000 153384.000000 22939.000000 164944.000000 22453.000000 169780.000000 22372.000000 176436.000000 22141.000000 21315.000000 171526.000000 21809.000000 154200.000000 21901.000000 154132.000000 22130.000000 146148.000000 22810.000000 133240.000000 23316.000000 126016.000000 24320.000000 117106.000000 24193.000000 118242.000000 24881.000000 110180.000000 25584.000000 105911.000000 25659.000000 104389.000000 25984.000000 101808.000000 26053.000000 100010.000000 26629.000000 99900.000000 26807.000000 98594.000000 27097.000000 93980.000000 28203.000000 89999.000000 29509.000000 86377.000000 29165.000000 87333.000000 29744.000000 85124.000000 30159.000000 84903.000000 29061.000000 89209.000000 29674.000000 85539.000000 31906.000000 79103.000000 31825.000000 80204.000000 33014.000000 76606.000000 36706.000000 69379.000000 35112.000000 72146.000000 35740.000000 71649.000000 41263.000000 62107.000000 40228.000000 64003.000000 40275.000000 63316.000000 43952.000000 59163.000000 42526.000000 59997.000000 48414.000000 52414.000000 47992.000000 53215.000000 45834.000000 55355.000000 49534.000000 51329.000000 46641.000000 54829.000000 51867.000000 49332.000000 54904.000000 46674.000000 57364.000000 44891.000000 57257.000000 45145.000000 56600.000000 45634.000000 57419.000000 44757.000000 61322.000000 41893.000000 65972.000000 38895.000000 61684.000000 41385.000000 63122.000000 40946.000000 67434.000000 37665.000000 70024.000000 36490.000000 71190.000000 36245.000000 73331.000000 35440.000000 77552.000000 34247.000000 78775.000000 33445.000000 75025.000000 34491.000000 82264.000000 31922.000000 81898.000000 32483.000000 84516.000000 31206.000000 93522.000000 29912.000000 88451.000000 30214.000000 97633.000000 28597.000000 94686.000000 29003.000000 100592.000000 27957.000000 99804.000000 28044.000000 110340.000000 26495.000000 110884.000000 26324.000000 112946.000000 26169.000000 119120.000000 25300.000000 120211.000000 25288.000000 121974.000000 24877.000000 138469.000000 23810.000000 143983.000000 23115.000000 146179.000000 22979.000000 158103.000000 22555.000000 151296.000000 22947.000000 160909.000000 22452.000000 168744.000000 22338.000000 176021.000000 22330.000000 21327.000000 169236.000000 21839.000000 157111.000000 21986.000000 150292.000000 22353.000000 139602.000000 22139.000000 145614.000000 23081.000000 131038.000000 23818.000000 122548.000000 24418.000000 115892.000000 24441.000000 113927.000000 25357.000000 107573.000000 26668.000000 97471.000000 25987.000000 102199.000000 26006.000000 100486.000000 27097.000000 93980.000000 27002.000000 95968.000000 28750.000000 88378.000000 28287.000000 90560.000000 28995.000000 87095.000000 29868.000000 85219.000000 30022.000000 83797.000000 31600.000000 80350.000000 32592.000000 78771.000000 32558.000000 79164.000000 35106.000000 74192.000000 33380.000000 76915.000000 34236.000000 74326.000000 36698.000000 70014.000000 37419.000000 68419.000000 36723.000000 69927.000000 41325.000000 61831.000000 38173.000000 66918.000000 43958.000000 57700.000000 42834.000000 60316.000000 43254.000000 59443.000000 45812.000000 55893.000000 47616.000000 53929.000000 50974.000000 50470.000000 49942.000000 52450.000000 50306.000000 51400.000000 52529.000000 48607.000000 51522.000000 50318.000000 53971.000000 47913.000000 54603.000000 47207.000000 64928.000000 39260.000000 56697.000000 45082.000000 58355.000000 44244.000000 63932.000000 40500.000000 61691.000000 42457.000000 65548.000000 38936.000000 69918.000000 37110.000000 67308.000000 37813.000000 71595.000000 36015.000000 66202.000000 38420.000000 72541.000000 35480.000000 74332.000000 34844.000000 77994.000000 33657.000000 78974.000000 33003.000000 80716.000000 32472.000000 82730.000000 31699.000000 89421.000000 30064.000000 98936.000000 28232.000000 91978.000000 29676.000000 98587.000000 28940.000000 100294.000000 27962.000000 104472.000000 27567.000000 105495.000000 27078.000000 114406.000000 26200.000000 117956.000000 25432.000000 116088.000000 25701.000000 124798.000000 24807.000000 121161.000000 25144.000000 142903.000000 23238.000000 140436.000000 23505.000000 152311.000000 22927.000000 155944.000000 22593.000000 159692.000000 22467.000000 166703.000000 22397.000000 174270.000000 22304.000000 21292.000000 176171.000000 21781.000000 165498.000000 21824.000000 160546.000000 21881.000000 152988.000000 22654.000000 141554.000000 22307.000000 142379.000000 23347.000000 125444.000000 23985.000000 120864.000000 24295.000000 115673.000000 25795.000000 102549.000000 25526.000000 106350.000000 25611.000000 105339.000000 25990.000000 101955.000000 26303.000000 100496.000000 26382.000000 97986.000000 27309.000000 94709.000000 27182.000000 95886.000000 28380.000000 89536.000000 28584.000000 88316.000000 28298.000000 89663.000000 29256.000000 86815.000000 29711.000000 86736.000000 31367.000000 80859.000000 31178.000000 81952.000000 30502.000000 82649.000000 32560.000000 77490.000000 34857.000000 74191.000000 35028.000000 73291.000000 35112.000000 72146.000000 34887.000000 73297.000000 38317.000000 67686.000000 36755.000000 69814.000000 36353.000000 70568.000000 40582.000000 64206.000000 44058.000000 58981.000000 42101.000000 60280.000000 42838.000000 59221.000000 44286.000000 57784.000000 47213.000000 54638.000000 48754.000000 51930.000000 47351.000000 53357.000000 50665.000000 50837.000000 50200.000000 51396.000000 51338.000000 50175.000000 56197.000000 45680.000000 54888.000000 46969.000000 57325.000000 44965.000000 58423.000000 44185.000000 58121.000000 44438.000000 61118.000000 42153.000000 60187.000000 43254.000000 64201.000000 39822.000000 67277.000000 37804.000000 70630.000000 36939.000000 71796.000000 36178.000000 70742.000000 36520.000000 70826.000000 36294.000000 77526.000000 34361.000000 78462.000000 33503.000000 84428.000000 31213.000000 83856.000000 31787.000000 90350.000000 29942.000000 87836.000000 30544.000000 92117.000000 29710.000000 91831.000000 29779.000000 97660.000000 28309.000000 92211.000000 29408.000000 101381.000000 28125.000000 105457.000000 27503.000000 109928.000000 26569.000000 112016.000000 26338.000000 112313.000000 26191.000000 118612.000000 25127.000000 120239.000000 25066.000000 134539.000000 23960.000000 141467.000000 23436.000000 152433.000000 22909.000000 159029.000000 22635.000000 160457.000000 22471.000000 169647.000000 22235.000000 172873.000000 22172.000000 21526.000000 171544.000000 21980.000000 152888.000000 21566.000000 164960.000000 22452.000000 137262.000000 22761.000000 132447.000000 23492.000000 123755.000000 23574.000000 121227.000000 24303.000000 117682.000000 25287.000000 105922.000000 25392.000000 105112.000000 25705.000000 103740.000000 26091.000000 102278.000000 26688.000000 96994.000000 26595.000000 97868.000000 27383.000000 94352.000000 27973.000000 92235.000000 28584.000000 88316.000000 29217.000000 86951.000000 29256.000000 86815.000000 30558.000000 85678.000000 30593.000000 84156.000000 32453.000000 78785.000000 31320.000000 81113.000000 35693.000000 71527.000000 34255.000000 75074.000000 34036.000000 75694.000000 36648.000000 69752.000000 37317.000000 68524.000000 37845.000000 68060.000000 38252.000000 66555.000000 40033.000000 64282.000000 39480.000000 65321.000000 40824.000000 62133.000000 43551.000000 59504.000000 44989.000000 57475.000000 45294.000000 56295.000000 47415.000000 54207.000000 45653.000000 55718.000000 48614.000000 52551.000000 50395.000000 51239.000000 51383.000000 49663.000000 51307.000000 50496.000000 53884.000000 47748.000000 53456.000000 48812.000000 60799.000000 42248.000000 53980.000000 47258.000000 60022.000000 43120.000000 59349.000000 43139.000000 58173.000000 44687.000000 59048.000000 43761.000000 60292.000000 42884.000000 66076.000000 39334.000000 61775.000000 41541.000000 64966.000000 39982.000000 67100.000000 38758.000000 67774.000000 38160.000000 66185.000000 39100.000000 68539.000000 37085.000000 74886.000000 34567.000000 76394.000000 33860.000000 79621.000000 33052.000000 82964.000000 31663.000000 83630.000000 31341.000000 86559.000000 30730.000000 90892.000000 30120.000000 93058.000000 29379.000000 93088.000000 29207.000000 91033.000000 29679.000000 91006.000000 29814.000000 101426.000000 27801.000000 102620.000000 27587.000000 112690.000000 25993.000000 121276.000000 25101.000000 136946.000000 23923.000000 123652.000000 24963.000000 139545.000000 23720.000000 145696.000000 23214.000000 152082.000000 22802.000000 159692.000000 22467.000000 172545.000000 22188.000000 170801.000000 22274.000000 176436.000000 22141.000000 21849.000000 154241.000000 21370.000000 167892.000000 21641.000000 159354.000000 22751.000000 134708.000000 23376.000000 127652.000000 23169.000000 127814.000000 25075.000000 109327.000000 24887.000000 110000.000000 25194.000000 109267.000000 25727.000000 103222.000000 25852.000000 101337.000000 25603.000000 103751.000000 26624.000000 98688.000000 26287.000000 99392.000000 27834.000000 92566.000000 28203.000000 89999.000000 29725.000000 86083.000000 31193.000000 83035.000000 28890.000000 87552.000000 30008.000000 85198.000000 31434.000000 80723.000000 31512.000000 79864.000000 32560.000000 77490.000000 32113.000000 78682.000000 34660.000000 73092.000000 37779.000000 67741.000000 39028.000000 65949.000000 37681.000000 68546.000000 35417.000000 72583.000000 41929.000000 61763.000000 42442.000000 60548.000000 37998.000000 66783.000000 41960.000000 61702.000000 43913.000000 58513.000000 45932.000000 55577.000000 45107.000000 56775.000000 44706.000000 57907.000000 47851.000000 53575.000000 46392.000000 55253.000000 50295.000000 50924.000000 51344.000000 50523.000000 51903.000000 49506.000000 54315.000000 47019.000000 52189.000000 49155.000000 55323.000000 45984.000000 57732.000000 45103.000000 59988.000000 42599.000000 58675.000000 43504.000000 59856.000000 42996.000000 62175.000000 41079.000000 64746.000000 40094.000000 66440.000000 38821.000000 66109.000000 39013.000000 67079.000000 38373.000000 70646.000000 36522.000000 69078.000000 37278.000000 71133.000000 36067.000000 75085.000000 34525.000000 78179.000000 33750.000000 76102.000000 34375.000000 78859.000000 33023.000000 82000.000000 32284.000000 83229.000000 31739.000000 84912.000000 31311.000000 83630.000000 31341.000000 89276.000000 30265.000000 91603.000000 30059.000000 94517.000000 29309.000000 95959.000000 29143.000000 97019.000000 28561.000000 92211.000000 29408.000000 99817.000000 27982.000000 112186.000000 26159.000000 118822.000000 25631.000000 126527.000000 24863.000000 122851.000000 25043.000000 137133.000000 23695.000000 146955.000000 22981.000000 147094.000000 22964.000000 152897.000000 22687.000000 159465.000000 22475.000000 167536.000000 22467.000000 170201.000000 22307.000000 178919.000000 22283.000000 21282.000000 178446.000000 21461.000000 168111.000000 21946.000000 151844.000000 21732.000000 161093.000000 22501.000000 142348.000000 22780.000000 132548.000000 23376.000000 127652.000000 24095.000000 118729.000000 24114.000000 118562.000000 24269.000000 116630.000000 25803.000000 103836.000000 25822.000000 101408.000000 26175.000000 100530.000000 26229.000000 99265.000000 26626.000000 97362.000000 28203.000000 89999.000000 28127.000000 90525.000000 29587.000000 86660.000000 30446.000000 84828.000000 28966.000000 87329.000000 29846.000000 86237.000000 29707.000000 86510.000000 31517.000000 80380.000000 33369.000000 75519.000000 34379.000000 74969.000000 34536.000000 73818.000000 35095.000000 72317.000000 34197.000000 75100.000000 38404.000000 66966.000000 35898.000000 70750.000000 39059.000000 66157.000000 37701.000000 67510.000000 41357.000000 62775.000000 42912.000000 60246.000000 41957.000000 61567.000000 43487.000000 59100.000000 45323.000000 57523.000000 42686.000000 60937.000000 46396.000000 55167.000000 51146.000000 50212.000000 50311.000000 51295.000000 51212.000000 49311.000000 53836.000000 47955.000000 55166.000000 47033.000000 55357.000000 46733.000000 56198.000000 45923.000000 60164.000000 42755.000000 58082.000000 44343.000000 59002.000000 43800.000000 61197.000000 42322.000000 64805.000000 39431.000000 65137.000000 38902.000000 65578.000000 38750.000000 63135.000000 40721.000000 70981.000000 37126.000000 65837.000000 38538.000000 71516.000000 36794.000000 71715.000000 36131.000000 74064.000000 35282.000000 72748.000000 35554.000000 72999.000000 35285.000000 77977.000000 33256.000000 80529.000000 32347.000000 82512.000000 31967.000000 81989.000000 32089.000000 83246.000000 31537.000000 90813.000000 29916.000000 95546.000000 28744.000000 93768.000000 29095.000000 97184.000000 28537.000000 105847.000000 27391.000000 114526.000000 25961.000000 113156.000000 26423.000000 109152.000000 26649.000000 114779.000000 25605.000000 122825.000000 24794.000000 138268.000000 23645.000000 146655.000000 23313.000000 136296.000000 24005.000000 147094.000000 22964.000000 153124.000000 22679.000000 168389.000000 22259.000000 21292.000000 176171.000000 21634.000000 164843.000000 21760.000000 158120.000000 21956.000000 150098.000000 22545.000000 135710.000000 23522.000000 125677.000000 23776.000000 120411.000000 25137.000000 108381.000000 24895.000000 109925.000000 25247.000000 105379.000000 25864.000000 101557.000000 25603.000000 103751.000000 27219.000000 94500.000000 26771.000000 97860.000000 28142.000000 90905.000000 27165.000000 97343.000000 29172.000000 90389.000000 29612.000000 86474.000000 29363.000000 86483.000000 29866.000000 84290.000000 31967.000000 80658.000000 32629.000000 79213.000000 34435.000000 74841.000000 35362.000000 73022.000000 36849.000000 69390.000000 35704.000000 72545.000000 36382.000000 70589.000000 35884.000000 71637.000000 37453.000000 67977.000000 36903.000000 68797.000000 43436.000000 59575.000000 41308.000000 62252.000000 43531.000000 58919.000000 44129.000000 58710.000000 47814.000000 53363.000000 48676.000000 52484.000000 48159.000000 53145.000000 48454.000000 52954.000000 51849.000000 50715.000000 48776.000000 51983.000000 53036.000000 48492.000000 53812.000000 47674.000000 55589.000000 47164.000000 53788.000000 48095.000000 56082.000000 45743.000000 59041.000000 43511.000000 62320.000000 41347.000000 61930.000000 41352.000000 60610.000000 42238.000000 67431.000000 38145.000000 66035.000000 38860.000000 65363.000000 39414.000000 66679.000000 38715.000000 67671.000000 37849.000000 70194.000000 36404.000000 72248.000000 35422.000000 71173.000000 35917.000000 76793.000000 34018.000000 79845.000000 32680.000000 84364.000000 31182.000000 83630.000000 31341.000000 89704.000000 30440.000000 92458.000000 29428.000000 92249.000000 29712.000000 93714.000000 29089.000000 100253.000000 28223.000000 100523.000000 27806.000000 103945.000000 27522.000000 106370.000000 27126.000000 114278.000000 25856.000000 112230.000000 26213.000000 126423.000000 24522.000000 135442.000000 23949.000000 144616.000000 23265.000000 142408.000000 23554.000000 146699.000000 23229.000000 156955.000000 22767.000000 151874.000000 22944.000000 168389.000000 22259.000000 167752.000000 22342.000000 176521.000000 22179.000000 21282.000000 178446.000000 21409.000000 171103.000000 21509.000000 166489.000000 21756.000000 158115.000000 22529.000000 139215.000000 22724.000000 132787.000000 23660.000000 121992.000000 23573.000000 123921.000000 24392.000000 113791.000000 24943.000000 111027.000000 25489.000000 104686.000000 25610.000000 103216.000000 25369.000000 105529.000000 25930.000000 102716.000000 26102.000000 100243.000000 27488.000000 94005.000000 28037.000000 92451.000000 28361.000000 90612.000000 29787.000000 86399.000000 28456.000000 89341.000000 30038.000000 85660.000000 30128.000000 84791.000000 32113.000000 80002.000000 30418.000000 83733.000000 32538.000000 79035.000000 32767.000000 77089.000000 33793.000000 75258.000000 35721.000000 71302.000000 34585.000000 72809.000000 38982.000000 67216.000000 39490.000000 65007.000000 39740.000000 64969.000000 40256.000000 64642.000000 40306.000000 63936.000000 45013.000000 57569.000000 44607.000000 58090.000000 47187.000000 53637.000000 45854.000000 55767.000000 48176.000000 52885.000000 49090.000000 52286.000000 51790.000000 50340.000000 54021.000000 47518.000000 55900.000000 45987.000000 58173.000000 43977.000000 54179.000000 47379.000000 57883.000000 44493.000000 59297.000000 43568.000000 56874.000000 45177.000000 60851.000000 42318.000000 61938.000000 41343.000000 63547.000000 40530.000000 67353.000000 38353.000000 66340.000000 38950.000000 69249.000000 36982.000000 68153.000000 37992.000000 68876.000000 37586.000000 70686.000000 36317.000000 74006.000000 34736.000000 79860.000000 33114.000000 77404.000000 33658.000000 82440.000000 32175.000000 83630.000000 31341.000000 87695.000000 30907.000000 88183.000000 30704.000000 88288.000000 30179.000000 93130.000000 29336.000000 94952.000000 28845.000000 106823.000000 26902.000000 99939.000000 27861.000000 109037.000000 26750.000000 113674.000000 26034.000000 115257.000000 25886.000000 118430.000000 25385.000000 126190.000000 24531.000000 134063.000000 24152.000000 127721.000000 24365.000000 147094.000000 22964.000000 153540.000000 22690.000000 164515.000000 22626.000000 172958.000000 22210.000000 21282.000000 178446.000000 21458.000000 167288.000000 22067.000000 151593.000000 21461.000000 166837.000000 22130.000000 146157.000000 22512.000000 138303.000000 23974.000000 119887.000000 24427.000000 116378.000000 24708.000000 111658.000000 25981.000000 100805.000000 25603.000000 102974.000000 26229.000000 99265.000000 26388.000000 98676.000000 27364.000000 93257.000000 27952.000000 91759.000000 27219.000000 94500.000000 29531.000000 88839.000000 28461.000000 88925.000000 29779.000000 85661.000000 29694.000000 86512.000000 30113.000000 84371.000000 30935.000000 81987.000000 32238.000000 79142.000000 32232.000000 79749.000000 32286.000000 79038.000000 33086.000000 76291.000000 34863.000000 73035.000000 33468.000000 75681.000000 37096.000000 69515.000000 37413.000000 68129.000000 35889.000000 71204.000000 36066.000000 70037.000000 37977.000000 66999.000000 39914.000000 65442.000000 40081.000000 64145.000000 42029.000000 60852.000000 43821.000000 58232.000000 46501.000000 55819.000000 44664.000000 57259.000000 46953.000000 55516.000000 48953.000000 52004.000000 47780.000000 53264.000000 50682.000000 50874.000000 52580.000000 48436.000000 49124.000000 51598.000000 58138.000000 44431.000000 55891.000000 45646.000000 57486.000000 44937.000000 58674.000000 43559.000000 63430.000000 41037.000000 63480.000000 41014.000000 64092.000000 39853.000000 65670.000000 39482.000000 70174.000000 36779.000000 65573.000000 39580.000000 68892.000000 37354.000000 72214.000000 35732.000000 74740.000000 34625.000000 72601.000000 35428.000000 73937.000000 34727.000000 73476.000000 35325.000000 78639.000000 33394.000000 84658.000000 31407.000000 80145.000000 32713.000000 87524.000000 30966.000000 85709.000000 31016.000000 89743.000000 29922.000000 98068.000000 28566.000000 94893.000000 28973.000000 98984.000000 28205.000000 99852.000000 28190.000000 112604.000000 26185.000000 103979.000000 27454.000000 109922.000000 26476.000000 121090.000000 24980.000000 125484.000000 24761.000000 126669.000000 24653.000000 133402.000000 24167.000000 150396.000000 23050.000000 145653.000000 23194.000000 153395.000000 23018.000000 159366.000000 22547.000000 166654.000000 22315.000000 21472.000000 170302.000000 21849.000000 154241.000000 21997.000000 149785.000000 22318.000000 144311.000000 22541.000000 138401.000000 22405.000000 140136.000000 23242.000000 128577.000000 23696.000000 121553.000000 25271.000000 108728.000000 24999.000000 109899.000000 25704.000000 103217.000000 25352.000000 104569.000000 25980.000000 101387.000000 26317.000000 98596.000000 27097.000000 93980.000000 26932.000000 97076.000000 26518.000000 97586.000000 27780.000000 93679.000000 28369.000000 90096.000000 28623.000000 88180.000000 30270.000000 84722.000000 28514.000000 89780.000000 29975.000000 85118.000000 31742.000000 79735.000000 30292.000000 83176.000000 32560.000000 77490.000000 33658.000000 75418.000000 32590.000000 77401.000000 34898.000000 72317.000000 33037.000000 76541.000000 36730.000000 69192.000000 36412.000000 71602.000000 35453.000000 72297.000000 37087.000000 67978.000000 41690.000000 62197.000000 39528.000000 64211.000000 40469.000000 63213.000000 44274.000000 57711.000000 43520.000000 59186.000000 41313.000000 62423.000000 46484.000000 55589.000000 44979.000000 56671.000000 45574.000000 56063.000000 48584.000000 52892.000000 50651.000000 50122.000000 48636.000000 51994.000000 52042.000000 49537.000000 52821.000000 48477.000000 54477.000000 47111.000000 53462.000000 48108.000000 55358.000000 47078.000000 56606.000000 45468.000000 57655.000000 44833.000000 62241.000000 41347.000000 63341.000000 40479.000000 64628.000000 39525.000000 66150.000000 38320.000000 66998.000000 37896.000000 70203.000000 37133.000000 74777.000000 34663.000000 73293.000000 35185.000000 77024.000000 34112.000000 77621.000000 33710.000000 74655.000000 34759.000000 83155.000000 32121.000000 83420.000000 32029.000000 87293.000000 30571.000000 83630.000000 31341.000000 89873.000000 30350.000000 91193.000000 29798.000000 94261.000000 28937.000000 102452.000000 27739.000000 98987.000000 27994.000000 111668.000000 26200.000000 112934.000000 25921.000000 116936.000000 25797.000000 124958.000000 24874.000000 128362.000000 24374.000000 130447.000000 24369.000000 143662.000000 23189.000000 146406.000000 22971.000000 155890.000000 22607.000000 159465.000000 22475.000000 168007.000000 22359.000000 173643.000000 22215.000000 179907.000000 22214.000000 21305.000000 173801.000000 21317.000000 172106.000000 21849.000000 154241.000000 21718.000000 160828.000000 22256.000000 142717.000000 22940.000000 129524.000000 22683.000000 137135.000000 24462.000000 116096.000000 24488.000000 114883.000000 24828.000000 110580.000000 25754.000000 102555.000000 25498.000000 106272.000000 25836.000000 102048.000000 25967.000000 101198.000000 25864.000000 101557.000000 27097.000000 93980.000000 26644.000000 97980.000000 27592.000000 93918.000000 27974.000000 92331.000000 28278.000000 90505.000000 28286.000000 90452.000000 29128.000000 88726.000000 29242.000000 87658.000000 29919.000000 85396.000000 31750.000000 80446.000000 32240.000000 79371.000000 33886.000000 75485.000000 32684.000000 78093.000000 33580.000000 76601.000000 35424.000000 71118.000000 34631.000000 72795.000000 35190.000000 71982.000000 36148.000000 70896.000000 37592.000000 67738.000000 38235.000000 67454.000000 42795.000000 60645.000000 39153.000000 65583.000000 38484.000000 65756.000000 41670.000000 61496.000000 43707.000000 58953.000000 46196.000000 55951.000000 47700.000000 53742.000000 48840.000000 52051.000000 48147.000000 53545.000000 51443.000000 50314.000000 53994.000000 47730.000000 50563.000000 50940.000000 54521.000000 47322.000000 53396.000000 48042.000000 56130.000000 46204.000000 56529.000000 45481.000000 61401.000000 41928.000000 62593.000000 40705.000000 63902.000000 40394.000000 61767.000000 41662.000000 64141.000000 39989.000000 65063.000000 39078.000000 68901.000000 37695.000000 72685.000000 35469.000000 71660.000000 35831.000000 73643.000000 34898.000000 77247.000000 34226.000000 78186.000000 33366.000000 84556.000000 31146.000000 85829.000000 30967.000000 88763.000000 30490.000000 92655.000000 29230.000000 95496.000000 28672.000000 90361.000000 29939.000000 98286.000000 28199.000000 101979.000000 27752.000000 101455.000000 27968.000000 106170.000000 27129.000000 109167.000000 26783.000000 115151.000000 25655.000000 117737.000000 25608.000000 126802.000000 24935.000000 132133.000000 24297.000000 137519.000000 23737.000000 143863.000000 23210.000000 145913.000000 23104.000000 153446.000000 22697.000000 162458.000000 22395.000000 180421.000000 22300.000000 21343.000000 170748.000000 21773.000000 157642.000000 21879.000000 155578.000000 22353.000000 139602.000000 22953.000000 133672.000000 22564.000000 135811.000000 23785.000000 122393.000000 24544.000000 114032.000000 24138.000000 117255.000000 25287.000000 105922.000000 25732.000000 103736.000000 26059.000000 100700.000000 26454.000000 99249.000000 27783.000000 92054.000000 27926.000000 90828.000000 27097.000000 93980.000000 27642.000000 93154.000000 28796.000000 88735.000000 29191.000000 87140.000000 29807.000000 85028.000000 30341.000000 83549.000000 31533.000000 80544.000000 33814.000000 77066.000000 34573.000000 74292.000000 34735.000000 74098.000000 36251.000000 70327.000000 35965.000000 71152.000000 35111.000000 71610.000000 38181.000000 67156.000000 39601.000000 64922.000000 45422.000000 56631.000000 39158.000000 66294.000000 44438.000000 58189.000000 40277.000000 62779.000000 44580.000000 57437.000000 44031.000000 59521.000000 48907.000000 52442.000000 46372.000000 55063.000000 48406.000000 53650.000000 48546.000000 52490.000000 48465.000000 53450.000000 50870.000000 51267.000000 53864.000000 48251.000000 54286.000000 46856.000000 54238.000000 47480.000000 59102.000000 43970.000000 54704.000000 46738.000000 63691.000000 40520.000000 61776.000000 41516.000000 61687.000000 41885.000000 64364.000000 39933.000000 62728.000000 41200.000000 65865.000000 38533.000000 67041.000000 38510.000000 70646.000000 36719.000000 65781.000000 39687.000000 69134.000000 37937.000000 70689.000000 36380.000000 75587.000000 34329.000000 77604.000000 33427.000000 79609.000000 33001.000000 83455.000000 31816.000000 83380.000000 32318.000000 85299.000000 31575.000000 86566.000000 31034.000000 89035.000000 30299.000000 93263.000000 29687.000000 93786.000000 29315.000000 101859.000000 27733.000000 105584.000000 27163.000000 107290.000000 26925.000000 113864.000000 26417.000000 110253.000000 26434.000000 117102.000000 25634.000000 122638.000000 24884.000000 136294.000000 23886.000000 141420.000000 23498.000000 146867.000000 22972.000000 153702.000000 22748.000000 159788.000000 22538.000000 163591.000000 22513.000000 172958.000000 22210.000000 21307.000000 174381.000000 21760.000000 158355.000000 21879.000000 155578.000000 23185.000000 133183.000000 22830.000000 135186.000000 23508.000000 127211.000000 24539.000000 117743.000000 23574.000000 121227.000000 25806.000000 102399.000000 25450.000000 104447.000000 26378.000000 99478.000000 26384.000000 99446.000000 26171.000000 101945.000000 26699.000000 97649.000000 27383.000000 95694.000000 28523.000000 89222.000000 28812.000000 88003.000000 28134.000000 89998.000000 28378.000000 89463.000000 30090.000000 85022.000000 31500.000000 80654.000000 32383.000000 78845.000000 33549.000000 77285.000000 36761.000000 70443.000000 33550.000000 76367.000000 35035.000000 72610.000000 35498.000000 71545.000000 39668.000000 66447.000000 37209.000000 67841.000000 41372.000000 62292.000000 41817.000000 61558.000000 40256.000000 63643.000000 42596.000000 60294.000000 43151.000000 59284.000000 46226.000000 55162.000000 49249.000000 52204.000000 48757.000000 54067.000000 51337.000000 49987.000000 51517.000000 49608.000000 50395.000000 51027.000000 56766.000000 45952.000000 58110.000000 44351.000000 54234.000000 47622.000000 61329.000000 41762.000000 55674.000000 46002.000000 59263.000000 43533.000000 61311.000000 42131.000000 63767.000000 40422.000000 63939.000000 40111.000000 65494.000000 39121.000000 62764.000000 41180.000000 65628.000000 38919.000000 70867.000000 36670.000000 65865.000000 38533.000000 72213.000000 35738.000000 73057.000000 35295.000000 73912.000000 35034.000000 76673.000000 33899.000000 77883.000000 33844.000000 80267.000000 32929.000000 79348.000000 33248.000000 81715.000000 32032.000000 84158.000000 31862.000000 93265.000000 29384.000000 91355.000000 29748.000000 95394.000000 28992.000000 93211.000000 29539.000000 94419.000000 29146.000000 99178.000000 27972.000000 104324.000000 27449.000000 110860.000000 26241.000000 108994.000000 26917.000000 115667.000000 25507.000000 125918.000000 24780.000000 134795.000000 23970.000000 144172.000000 23259.000000 148119.000000 22998.000000 155283.000000 22683.000000 161007.000000 22465.000000 166890.000000 22332.000000 179750.000000 22195.000000 21282.000000 178446.000000 21345.000000 171328.000000 21839.000000 157111.000000 21810.000000 162369.000000 22343.000000 142472.000000 22256.000000 142717.000000 22631.000000 137451.000000 23142.000000 132035.000000 23466.000000 123670.000000 24080.000000 118574.000000 24164.000000 117450.000000 25105.000000 107342.000000 25578.000000 104587.000000 26330.000000 98935.000000 25864.000000 101557.000000 27258.000000 97209.000000 26473.000000 97348.000000 28720.000000 87916.000000 28170.000000 90640.000000 27926.000000 90828.000000 28316.000000 89591.000000 28851.000000 87867.000000 30186.000000 83846.000000 29730.000000 85521.000000 28966.000000 87329.000000 29288.000000 86672.000000 32098.000000 79015.000000 31630.000000 80101.000000 32480.000000 78438.000000 34286.000000 74322.000000 35472.000000 71717.000000 35313.000000 71857.000000 37866.000000 67485.000000 36563.000000 70400.000000 37342.000000 68634.000000 42449.000000 60713.000000 41058.000000 62657.000000 43628.000000 58977.000000 41488.000000 62515.000000 45684.000000 56342.000000 42775.000000 60355.000000 43809.000000 58374.000000 49056.000000 52086.000000 46265.000000 55333.000000 48344.000000 52954.000000 47449.000000 54054.000000 48295.000000 53546.000000 50040.000000 51095.000000 50908.000000 50488.000000 52442.000000 48916.000000 56420.000000 45540.000000 53230.000000 48408.000000 54025.000000 48323.000000 58251.000000 44105.000000 55302.000000 46324.000000 64055.000000 40065.000000 58014.000000 44816.000000 61038.000000 41919.000000 62420.000000 41809.000000 60814.000000 42619.000000 65976.000000 39252.000000 67772.000000 37764.000000 65515.000000 39511.000000 71717.000000 35875.000000 72976.000000 35527.000000 73643.000000 34898.000000 72641.000000 35696.000000 73568.000000 34993.000000 77997.000000 33876.000000 74746.000000 34848.000000 78529.000000 33742.000000 83776.000000 32096.000000 79885.000000 33127.000000 85739.000000 31213.000000 88535.000000 30199.000000 90393.000000 29778.000000 95531.000000 28848.000000 98679.000000 28505.000000 99548.000000 28498.000000 105357.000000 27170.000000 105800.000000 27067.000000 106340.000000 26963.000000 115743.000000 25654.000000 119647.000000 25150.000000 123606.000000 25028.000000 135580.000000 23810.000000 124720.000000 24615.000000 140365.000000 23538.000000 147171.000000 22975.000000 147888.000000 22966.000000 159465.000000 22475.000000 163897.000000 22412.000000 168848.000000 22367.000000 179574.000000 22337.000000 21396.000000 172746.000000 21447.000000 170780.000000 21839.000000 157111.000000 21694.000000 157268.000000 22123.000000 146196.000000 22439.000000 139518.000000 22813.000000 133892.000000 23598.000000 121250.000000 24489.000000 113046.000000 25456.000000 104067.000000 25220.000000 107048.000000 26292.000000 101654.000000 26759.000000 97527.000000 26369.000000 99520.000000 27966.000000 94014.000000 26330.000000 99855.000000 28584.000000 88316.000000 26801.000000 95553.000000 28281.000000 90204.000000 27939.000000 94439.000000 29696.000000 86610.000000 28910.000000 87414.000000 29840.000000 84755.000000 30310.000000 84159.000000 31225.000000 80631.000000 32241.000000 78288.000000 33486.000000 76129.000000 32648.000000 78255.000000 36290.000000 71299.000000 34480.000000 73682.000000 36583.000000 69667.000000 39171.000000 66845.000000 39937.000000 64018.000000 37352.000000 68692.000000 41082.000000 63090.000000 42400.000000 60612.000000 43749.000000 58597.000000 43917.000000 58496.000000 45354.000000 56488.000000 48842.000000 52004.000000 46753.000000 55021.000000 50030.000000 51696.000000 50792.000000 51264.000000 49570.000000 51879.000000 51463.000000 49918.000000 52327.000000 49550.000000 54671.000000 47981.000000 56338.000000 45682.000000 59103.000000 43494.000000 57365.000000 44633.000000 61611.000000 42033.000000 59139.000000 43281.000000 61648.000000 41612.000000 65096.000000 39678.000000 65328.000000 39249.000000 62993.000000 41339.000000 67769.000000 38333.000000 68179.000000 38207.000000 69450.000000 37484.000000 73789.000000 35148.000000 71425.000000 36567.000000 72095.000000 36326.000000 73240.000000 36118.000000 76523.000000 34296.000000 73600.000000 35291.000000 79456.000000 33228.000000 82109.000000 32632.000000 88404.000000 30415.000000 89174.000000 30044.000000 85765.000000 31074.000000 91197.000000 29792.000000 91378.000000 29660.000000 94120.000000 29183.000000 94703.000000 29158.000000 104363.000000 27146.000000 99423.000000 28312.000000 113685.000000 26060.000000 115256.000000 25597.000000 118008.000000 25284.000000 111014.000000 26564.000000 123092.000000 24844.000000 138268.000000 23645.000000 137044.000000 23699.000000 144438.000000 23191.000000 146406.000000 22971.000000 148803.000000 22951.000000 156028.000000 22589.000000 172705.000000 22299.000000 178070.000000 22263.000000 21317.000000 172106.000000 21839.000000 157111.000000 22100.000000 150283.000000 21656.000000 158527.000000 22877.000000 132312.000000 22845.000000 132464.000000 23045.000000 128455.000000 24248.000000 116697.000000 24193.000000 118242.000000 24443.000000 113430.000000 25514.000000 103643.000000 25826.000000 102455.000000 26125.000000 100144.000000 25941.000000 102308.000000 26587.000000 97943.000000 27364.000000 93257.000000 26740.000000 96625.000000 27112.000000 96061.000000 27219.000000 94500.000000 28300.000000 90814.000000 28694.000000 89060.000000 28934.000000 87962.000000 30854.000000 82102.000000 29817.000000 86009.000000 30389.000000 83440.000000 31355.000000 81152.000000 34575.000000 74549.000000 33734.000000 75130.000000 34766.000000 72875.000000 34898.000000 72317.000000 37042.000000 68903.000000 37978.000000 67580.000000 36641.000000 69106.000000 41100.000000 62918.000000 42922.000000 60212.000000 41340.000000 62207.000000 43153.000000 59942.000000 43814.000000 59198.000000 45051.000000 57325.000000 48148.000000 53791.000000 47412.000000 54652.000000 49764.000000 51365.000000 49452.000000 52286.000000 50153.000000 51205.000000 50683.000000 50281.000000 55181.000000 46470.000000 52631.000000 48553.000000 53306.000000 47871.000000 56995.000000 45678.000000 59336.000000 43233.000000 63891.000000 39948.000000 63053.000000 40937.000000 61042.000000 41974.000000 65849.000000 38469.000000 68088.000000 37979.000000 68992.000000 37318.000000 74095.000000 34901.000000 72136.000000 36159.000000 73160.000000 35666.000000 73264.000000 35554.000000 77167.000000 34206.000000 78252.000000 33540.000000 79826.000000 33285.000000 87641.000000 30598.000000 83630.000000 31341.000000 90093.000000 30480.000000 92149.000000 29458.000000 93853.000000 29331.000000 91111.000000 29825.000000 94661.000000 29059.000000 103979.000000 27407.000000 100416.000000 28100.000000 108785.000000 26776.000000 110740.000000 26204.000000 123174.000000 25129.000000 124186.000000 25036.000000 129763.000000 24217.000000 142076.000000 23364.000000 146728.000000 22989.000000 153447.000000 22726.000000 163410.000000 22383.000000 172987.000000 22375.000000 174920.000000 22297.000000 21345.000000 171328.000000 21630.000000 161836.000000 21640.000000 161580.000000 21877.000000 153460.000000 22430.000000 138767.000000 22534.000000 137391.000000 23423.000000 127391.000000 23837.000000 120985.000000 24565.000000 113632.000000 25440.000000 107117.000000 25998.000000 100775.000000 25858.000000 100867.000000 26286.000000 99437.000000 26794.000000 97255.000000 27266.000000 96355.000000 27913.000000 90720.000000 27433.000000 94305.000000 28062.000000 90428.000000 28500.000000 88789.000000 29485.000000 86787.000000 29560.000000 85322.000000 30419.000000 83736.000000 31605.000000 80126.000000 31769.000000 79908.000000 32927.000000 76650.000000 34694.000000 74437.000000 33734.000000 75130.000000 34771.000000 72337.000000 38792.000000 66012.000000 36548.000000 69670.000000 37493.000000 68566.000000 38481.000000 66091.000000 43559.000000 58861.000000 40877.000000 63660.000000 41674.000000 61877.000000 43376.000000 60071.000000 44602.000000 57589.000000 42209.000000 60408.000000 45833.000000 56121.000000 46095.000000 55264.000000 48623.000000 53151.000000 51920.000000 49179.000000 51003.000000 50594.000000 56160.000000 45858.000000 55374.000000 46679.000000 55984.000000 45892.000000 60792.000000 42533.000000 62340.000000 41288.000000 60900.000000 42153.000000 58923.000000 43645.000000 64227.000000 39875.000000 62458.000000 41095.000000 62668.000000 40949.000000 66333.000000 39430.000000 68244.000000 37921.000000 67232.000000 38348.000000 70215.000000 36506.000000 70107.000000 36532.000000 75753.000000 34257.000000 72223.000000 35763.000000 72987.000000 35753.000000 73340.000000 35194.000000 77491.000000 33517.000000 78229.000000 33229.000000 83560.000000 31857.000000 88530.000000 30547.000000 88825.000000 30218.000000 83630.000000 31341.000000 89026.000000 30103.000000 95099.000000 29171.000000 100862.000000 27866.000000 92211.000000 29408.000000 104178.000000 27220.000000 116295.000000 25586.000000 118070.000000 25355.000000 118810.000000 25243.000000 125923.000000 24452.000000 135468.000000 23994.000000 141461.000000 23491.000000 146728.000000 22989.000000 158320.000000 22512.000000 172545.000000 22188.000000 170745.000000 22262.000000 21282.000000 178446.000000 21500.000000 169524.000000 21669.000000 159175.000000 22553.000000 138850.000000 23003.000000 133764.000000 22778.000000 138784.000000 23772.000000 123093.000000 23113.000000 130984.000000 23782.000000 119324.000000 24164.000000 117450.000000 26017.000000 100551.000000 25450.000000 103377.000000 25974.000000 101419.000000 27090.000000 95646.000000 27991.000000 90925.000000 27608.000000 94982.000000 29110.000000 86679.000000 28727.000000 89469.000000 29277.000000 86312.000000 31271.000000 81049.000000 31425.000000 80701.000000 33565.000000 76284.000000 36549.000000 69567.000000 33746.000000 74738.000000 37547.000000 68067.000000 35764.000000 71181.000000 35111.000000 71610.000000 38371.000000 67449.000000 40850.000000 62192.000000 39617.000000 65468.000000 42221.000000 61899.000000 46689.000000 54549.000000 49130.000000 52063.000000 44802.000000 57165.000000 45898.000000 56039.000000 50117.000000 50675.000000 51601.000000 49921.000000 49685.000000 51844.000000 53117.000000 48427.000000 54613.000000 46744.000000 55964.000000 46054.000000 55614.000000 46171.000000 60900.000000 42341.000000 61339.000000 41675.000000 60412.000000 42562.000000 65757.000000 39528.000000 63008.000000 40659.000000 63655.000000 40216.000000 70164.000000 36865.000000 69938.000000 37186.000000 70256.000000 36720.000000 66935.000000 38208.000000 73682.000000 35059.000000 71043.000000 36505.000000 76015.000000 34093.000000 77567.000000 33856.000000 79831.000000 33118.000000 78758.000000 33382.000000 82651.000000 32124.000000 86598.000000 31131.000000 84913.000000 31324.000000 89918.000000 29979.000000 96839.000000 28414.000000 93386.000000 29366.000000 106907.000000 26999.000000 98248.000000 28262.000000 106067.000000 27051.000000 109522.000000 26552.000000 117570.000000 25644.000000 126843.000000 24898.000000 143591.000000 23231.000000 144246.000000 23197.000000 156171.000000 22585.000000 155801.000000 22597.000000 166176.000000 22311.000000 eaf/inst/extdata/r50_dat0000644000176200001440000002336113534247654014617 0ustar liggesusers# Report: # Metah: Weighted RoTS, version 2.1.88M (#DEBUG = 1) # bQAP (0.1.88Msvn) # Data File: /home/manu/personal/2005-JMMA/data/qapUni.50.p75.1 Size: 50 Averages: Distance=47.49 Flow1=49.90 Flow2=49.96 # Parameter settings: # number trials : 50 # time limit : 3.40282e+38 # seed : 1234567 # num weights: 100 # Taboo Search Length : 1 # Initialization time: 0.004 s # start_trial(0) : # end_trial(0) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.9041 s # Pareto: 0 Size: 7 5261548 5340738 5283204 5340630 5287522 5336320 5291202 5331366 5292270 5318304 5298876 5290408 5312952 5277832 # start_trial(1) : # end_trial(1) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 1 Size: 4 5246946 5368942 5249068 5328154 5277710 5321710 5280132 5281080 # start_trial(2) : # end_trial(2) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 2 Size: 2 5255914 5312620 5285994 5294248 # start_trial(3) : # end_trial(3) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 3 Size: 6 5254586 5341368 5265448 5336434 5266332 5329290 5278158 5328006 5293084 5304026 5316378 5285680 # start_trial(4) : # end_trial(4) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 4 Size: 5 5257008 5385896 5260020 5354180 5261932 5351978 5265120 5343482 5272604 5280450 # start_trial(5) : # end_trial(5) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 5 Size: 3 5251436 5304740 5260634 5289432 5261388 5278662 # start_trial(6) : # end_trial(6) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 6 Size: 3 5260462 5303782 5309662 5298112 5338894 5292426 # start_trial(7) : # end_trial(7) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 7 Size: 4 5238158 5302220 5266616 5301604 5277362 5291346 5328374 5283152 # start_trial(8) : # end_trial(8) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 8 Size: 5 5259568 5344514 5260078 5323590 5275688 5304758 5295860 5299490 5321894 5280216 # start_trial(9) : # end_trial(9) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 9 Size: 5 5252950 5337456 5258962 5303668 5273430 5301298 5311040 5291910 5319530 5279154 # start_trial(10) : # end_trial(10) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 10 Size: 6 5255088 5362366 5260872 5337164 5276254 5307774 5278846 5302382 5287324 5301484 5290398 5284198 # start_trial(11) : # end_trial(11) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 11 Size: 3 5257462 5328600 5262892 5302082 5306682 5293358 # start_trial(12) : # end_trial(12) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 12 Size: 5 5255536 5369466 5265974 5314044 5276688 5311924 5301892 5288482 5319394 5278344 # start_trial(13) : # end_trial(13) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 13 Size: 4 5243484 5327056 5262810 5312496 5265234 5288336 5305096 5285540 # start_trial(14) : # end_trial(14) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 14 Size: 3 5254326 5373688 5258282 5328368 5277040 5290704 # start_trial(15) : # end_trial(15) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 15 Size: 5 5251220 5334532 5258622 5318388 5274694 5318056 5275588 5299916 5307866 5281706 # start_trial(16) : # end_trial(16) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 16 Size: 4 5252238 5320246 5297660 5319870 5302690 5316084 5305034 5293474 # start_trial(17) : # end_trial(17) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 17 Size: 3 5256636 5364154 5262016 5294988 5264892 5269504 # start_trial(18) : # end_trial(18) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 18 Size: 6 5228108 5347760 5281796 5327312 5286788 5320758 5292364 5312668 5305786 5297640 5319554 5296596 # start_trial(19) : # end_trial(19) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 19 Size: 3 5258012 5349460 5262532 5294728 5311364 5285878 # start_trial(20) : # end_trial(20) : Pareto Size = 9, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 20 Size: 9 5262846 5351252 5268224 5332648 5286336 5329542 5291024 5323824 5291052 5311388 5322204 5305956 5337348 5305340 5338120 5302878 5350520 5288884 # start_trial(21) : # end_trial(21) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 21 Size: 6 5257942 5373498 5259552 5357156 5267384 5330886 5279304 5315890 5286088 5309012 5287040 5284718 # start_trial(22) : # end_trial(22) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 22 Size: 3 5253764 5351678 5265558 5309298 5290820 5295606 # start_trial(23) : # end_trial(23) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 23 Size: 3 5243858 5338614 5261776 5332340 5286980 5290820 # start_trial(24) : # end_trial(24) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 24 Size: 4 5251984 5322490 5293588 5309414 5295572 5298376 5313146 5297746 # start_trial(25) : # end_trial(25) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 25 Size: 3 5238488 5294964 5265768 5287358 5274538 5282446 # start_trial(26) : # end_trial(26) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 26 Size: 3 5240112 5318798 5285086 5296794 5297420 5288042 # start_trial(27) : # end_trial(27) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 27 Size: 3 5253562 5315656 5258408 5295302 5297444 5294720 # start_trial(28) : # end_trial(28) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 28 Size: 3 5243092 5314062 5243248 5286716 5296000 5284678 # start_trial(29) : # end_trial(29) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 29 Size: 4 5254042 5338584 5260876 5330882 5276202 5313170 5286874 5286552 # start_trial(30) : # end_trial(30) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 30 Size: 4 5249126 5334774 5263022 5312306 5281242 5309470 5284318 5282482 # start_trial(31) : # end_trial(31) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 31 Size: 6 5257878 5347536 5275036 5339680 5281738 5334044 5282030 5309294 5292442 5286754 5305288 5276742 # start_trial(32) : # end_trial(32) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 32 Size: 4 5262822 5336322 5287408 5314374 5288480 5303274 5297530 5296626 # start_trial(33) : # end_trial(33) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 33 Size: 4 5262302 5350178 5268796 5320690 5287784 5307578 5303060 5291696 # start_trial(34) : # end_trial(34) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9001 s # Pareto: 34 Size: 4 5255158 5363060 5265740 5316854 5280842 5287822 5295982 5271860 # start_trial(35) : # end_trial(35) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 35 Size: 4 5236920 5323144 5275658 5316252 5295276 5291846 5320036 5287242 # start_trial(36) : # end_trial(36) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 36 Size: 7 5245320 5350028 5265846 5346862 5269172 5329214 5289792 5317436 5291128 5309678 5300432 5300306 5320356 5299120 # start_trial(37) : # end_trial(37) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 37 Size: 6 5256692 5369864 5258244 5351398 5260990 5318888 5276810 5304172 5307654 5301888 5349612 5294114 # start_trial(38) : # end_trial(38) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 38 Size: 4 5245000 5402680 5261294 5355072 5280504 5342928 5281916 5279952 # start_trial(39) : # end_trial(39) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 39 Size: 1 5256756 5291420 # start_trial(40) : # end_trial(40) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 40 Size: 3 5240372 5339244 5269234 5300968 5292588 5291350 # start_trial(41) : # end_trial(41) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 41 Size: 3 5238810 5321212 5254626 5315172 5260078 5296038 # start_trial(42) : # end_trial(42) : Pareto Size = 8, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 42 Size: 8 5262120 5384314 5262892 5343884 5264312 5331836 5279288 5323156 5287766 5316696 5288662 5313878 5299640 5305808 5304502 5281312 # start_trial(43) : # end_trial(43) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 43 Size: 6 5251856 5339406 5260988 5322928 5285486 5322566 5290320 5308872 5302434 5302166 5318698 5289714 # start_trial(44) : # end_trial(44) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 44 Size: 4 5235812 5381636 5236334 5354730 5270128 5301072 5305764 5283634 # start_trial(45) : # end_trial(45) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 45 Size: 2 5230660 5301340 5293106 5289332 # start_trial(46) : # end_trial(46) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 46 Size: 4 5228398 5320810 5238488 5307248 5282654 5305988 5299924 5287560 # start_trial(47) : # end_trial(47) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 47 Size: 2 5260116 5305420 5269468 5286560 # start_trial(48) : # end_trial(48) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 48 Size: 5 5249848 5325302 5296612 5310710 5309120 5306430 5317752 5305550 5342704 5304442 # start_trial(49) : # end_trial(49) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 49 Size: 4 5261944 5309926 5288296 5307688 5312776 5304054 5327484 5298724 # Average Number Scalarizations = 100, Average Trial Time = 0.8765 s eaf/inst/extdata/ALG_1_dat.xz0000644000176200001440000055775014127067155015505 0ustar liggesusers7zXZִF!t/⊻]K hio&wm;B8`+s|x)rs]feu>#p?yrkՕU$] )Yd 1|z_dIhjqAFd5Lú>†_*Ӌ(Ŝs⿏`veYG^dvЀWtUR,h:XS9g>RVWi/iٴ9W;[~qd+FBocBab@JZBI~m?0<2g _JXm\%BXyhఽ|[mOQuAYx:cc?\'=" q$`x%-BP fgԿ9nVߛ"U2H?i& m#ޞ0vJ1xehFG,e)eM*GW |I")X?ls1"V`7Ɔh%Vf }$}cA͛~+~*i7 ^1GWlBC R<s_3͂Wm-tA91vZ†N%Z.9ꋶ9x&0Q:±B 5R/b|D7Ю=AM %-1)uÅWKZz$Y.qjW3f^]P !3+ t9}b _ͩWt'᫆E *sAڒ>i AQ3p4~8ueuW鑭%|q'\}<瑇~-O7Wz1隵n Y"#׼Ϙ](&j:哅EQJ 멐a B >eo#C >6eR) rw$H? WfY6p~͇OxӤv]VMޛ$u\- M uE@J8/Ijp߹HJDdnEGµzժTsskxص+C.`-Ob)9 Y#;Bzm}Y! fz)k)P8'xW@mSa:7ߩ!)P&$J.(c'^%\`(rIRk&ygyccމG'AC>]L.X$dBńz~[q¿w"PC}n[B3љ1um!`jzSSt:x!cXI9Jo#_vcMv F2@ .-iA؉GՃZ1F;9k:Ν% n"TGzwDHY8;]v,+* D@u/2o+>GSC dSoFo+XC'۹lWtay- gM{4a!/=v|^br lvMFm5I{S i$BaOۥ20cu)4o @x1=|'JT q1,'9Jql%HG' {nymX)S7j^: ]OXOD$ [xJ7z]SٳuRD u(#7ץWB.}eb~i0kٜ,17-'ܩσ΄ׯȺw\&b$uI`tv8+<̝L {ӮDd`i, {E }XH_d(p~Sz\]]IA 9ts;DNf +<:9^2Kl.qXV ls1'ED!->nX`5/=*, 9 AGaƑ[V pcz1."qK a7#9~.%b!ODFw@=]1ĐS[VuIpza)ݲG n#TV{Ve ŖA/AgtMq~`y1zW]L᷶LRF+DHgpW#wVàfO(;EtD<#IL|H<;tQ~2tvđ.v93Cz- pAa=zy^] bjV!H`RW^kW9*J?ƱW>3iӄl@%1vI7-~ӪdJ*=QLD㺕6Y Og?)pBGkaN@DDZ$gBv UAX=D?Ieq | i-΢t7[S JAE; #Tt^f^L BG}6ݭMwh{ɮs̴ ia3"EKm:4Ekaqms S.mCPm<9USCp۾"͆DGK2Y^q ).+8 =H68~% bЀ"??ySkͧCy>aX"m),)d:3yTFʤ|Grzp<CmkdcUrnݤVG;GJ{~PKnvQܮYLXESIfn-G\ƔДtvu1C1Y8UB|,H+$aF6  6áiY!!-q X ̭᥷]_q0t3lNHw9IG|Izޚp,ԘF`2C}smaz@ m ZPf NM$՞?i V\ LoI=i/% pr|G0 DCx"W=HJ`SM1OtBmHwlFD09sULg|4(/5' ;5XF1Kr+FޓmO_%oiX`$KGin^[mӢȣb<,8#dP/jlЃʼn͍mQT_>89:гCŽL-JJDYj7!еtNHfhCῚ\4si<FxeImwѪ V);T\As#Y<,5IC I;s:"35w Spb>ZH^ JWR0GDֲ[LPҞ H)!׫Sbܼ!]<:d23k4yPzdƿ]y\"]eExN*PF:B!L}d @P՚°j`f]7>h67mYο].T9&S`t,̛>XTf?u;$h ILmFo8h)SH}xE\NrW aI.i`Z{ǻOgЩi,eaO P"bV|\a1/S҄[oZn~(I(9K%lg:Ϡ0sm!c䭎s樖=Rcg$=;i@[Bf)~@yc"=sV"1T8]'lPN"ӟfr!iWGhTfi93wxH-K#|,S@Yg]Ŵ3.l kTPlQZ@6Y|o:@UnmםƯ{I(Y 4&.JYMcB TC-$n}%&Uk߅LP /s雄F>Ya&Wlj5Mkn ܮܘyhV{8/:fӌ\xeXjr[ K.5EnJ9F-m=b|ᤆi/=E̼`p6J}ૌuq! 4^U:{-+y زEۆbX*>`.g> rup-ߕw8 GeiSStfYÙ}~x)BԜ7bN : @..x\|K^|>GVlVxYfjtڽ;1Sðl؞(a4ucݍhcb^AsUU UOw\Oy 5&]]`e,@J[+ni Kz$,MQĊ_>9&S}6d@v J΢&8t#ͺ#P'~btHB6dG]ORC7ro+`3o[)㫟l,A.@K.Gh„`FJz0v$&Qvs)fgQtg'aZ(X6|*w 2&b+9b_i"~:fz Mt2khbm(Q5\~b 8x\ זHMڎ¤"G1Ǯ<,]AEniOf>n:|͑b~֩0c pB*975:X=&`h(n78*:ϨESh/`KǿdCqcZCCI")#Ԛ_ދ2A}³~cˊ4ifX3c4vQ;6OnaXOJ~k,^`DzMBn 7.sk56z1我KիѿX?z`;iەks(Tu,wYb]|Lܒ* ]11l pG2U A?;(* GtJ}B0 gU 8/O;}\Y}Oilg5czvf>;Hh.&8%"BHt>,"siJW-*u1I*\aSE/iZKcm6tXe_}{/}|LC{'مT`XˌKk-a}`WHPp4" U:ů?ԥ,ÜNQaOyG ` Ekpom?KnQEvAOv2 l"{+uV'm#)ؖw""%A>厾ЄU2 ߃>*1ѮWd}{3_Ql \^~񒯌ɖ<rp/, muvIɹQ B1AfڀG{ J+ 1n![#96k,}rBSLoqR {>8Bh< 0?f3g#01"3zg 7R-ɝmޕ t‹?+LD"w2]U5^ wiN X:+dmݔՁ ɞMi£u[!]&:kG1,CF |?rH8 F `=F9 QQhWnsmvHwx&ׁhokDkuT7`r/-74=Q{4OOMnSC˘UQ&C&)ɋm+2]@cO8yXj{klOClfan>+^nI֦7uY+铪H LB$dK_6UkM;e@*\ިw]2).g fPZ5ĶR09>!U6cT3R k(Xm$$aϹwsM05hO>lG&p?qQ|]%&3߾;3+ź&ȷkb?dʅroN> cƗRqMmh⮴ƻx!If\EyMVkZSݬ-.[3mR nSpfvR)i*bqi<3^O|?t qlif؍rͤҘS!>|)YZڅC| |\a1ng?}4ܥ n&#o 8h *CfP{lF;HmWW$XbnP:8 3 {tW =6oq,|Yo% o8AC`^6_d?}С^MHݏB_`59'-|GT.r>WEZL {>68HQaZ;)MbfaASkJ)0/Wͱg!YY\tJ_.&Evv g]ҽlm+i 5EYwej8Aiu3X~ +{ʍaE7S =~ܻqq!')j{pXhjndܗf7c{\ VABjykؕ%1L7*ApRSBy# %HG K[hK`4="Ȃ:MK?-n I0ʖ@XkޙA*ʳ#AvEFl10tڦP;\8p[ A\cmgNv .3ēO`) iR^2̣gnL_'tל+[#(q&C8d3:&7Z͑8o+GQF.G1cDbR6gC*ԜOu~̖- 'NB[ /& ۫7+8{wCs]b;\YU1f4_֓X+njx[E|Z K.Lu"!ؖ;̿{j+d3*W%CUHoewt$ xb_gm[5]BGJ8/Z`lDQ!w|ø (3>c:9iNF (d6 #!1RY_] ooбgێ~#դ6dhOVw9ŶV0rn+$7 KkbKDVZE| XBKaU R{;I[=TY-?`-lHW?lkKFKKY9Ud~̩X\6p*ttRZT͒#&1*qË"#\]'%lFԉF{/f{}aJ|Yu0 ! 0閾@mJ@տ9sNK B$6aJ෕G{ HP1341sJ\a1?{;VuoMC%vtbꨙ|e-*0F'@6 ׶C(99nGN}c}@M5 SZ.u!fF@kHDklHČ:`kOIǔ0dMa죸~d 1Ȼ@|7${OQ; I],gTAQF~%@ibj"j`/v^K#7*(U@T~Gh䮅:i v}| 'f@'nlVߟїT%εB'ާϛ$;($h{mͯq1p2їk&Xa&g[ ujVZk+6SSVJ"S fFtV+FKe_ i ٤^:|!h 5/Ok;>Bj{0lkdhxgց="sf 5mBr4904D['-Ο;*Hf;kvӝs*\ڙ햑2XIgչ/@ZEKB&*{׷Ҵ BAX ߛ!!5BJ,1s{,,7TroEpN+7:ȇ-ج;X ~UԷL"WjG+< VPD_|dT1PEcoԆ0րœ 7Isϻ<_#!F{ԩMЉRzĶTTTړP ҩ}׫[#Hx᠜b\D%٥15wdJ{ fD%C ?/"O*ڇ9}m>s*NRYj>,ZwpC''(TQ`T>O CsP<0zAYWf`+ $.꡵\{x/TMDz.@?+,M0aU8$03ҧH5D/x F{hӀ 7Rq ]ni"КX#@/4vl Ii_E]#~$Y"~\2{VUd[fnp^*ܟHcuIr\i }`w\R] Z{](j|<Ä.$ԾfGI>:iWIŶ")#Y+'cZWUZ@T̑>8}/9 re:Mކ_D<2+h֩@0@~t4-ﶟJKg0s6iզ0xL>4 |S^$ZX|?\/V<as9 yBUZ9*M6[n媚SuΎ3i4h=|aI236Ѩ;u)ߕ3Ϗ pC5&MpA{sOvcqv>Q=$15#1AXnaJ$dy<4؈`M^☖18rItTG5P7l'`4ู]aʼn-,)% +ŐaTG O[ۋՙmT{'΄H))hEr'ani].'s@ @⡧ 5? Ӛ|_-֚tI m-Ɋ Q&GKMp%/pwBquW0N?w:sPV%0.0_15Ik[i(R[lBu3Xu`Į\׋˒Gl2oF {9-Ǫn,by"="Uu*!A%N@CNtKɈCjW-15H4m,M!\f#XӹeBoJ龎`翎Y@a5Ac,|67q <~=oF1?TGe=[|Ug0ӃQ(mq&رIpTaX-eO|+81f5+HѶtmq GZ(TG*uI|$ljB䗓c*!z`G8vI1ٕĹ V?d%) <=d_C˱߽~5pFkc:'2ֽxzO{4p0-:!{~svOW! if N!E*jې.<|Տi ֭lZٱꃼF38V"\hV N{t~-Tb #T)ηS11Qfcw/uV1mƏR`h)0Ҋ/r9qmJJG [ F0p%Pmz nm| ɼ亖lM`;6=5] ]-UhcvmK>)Yy]&P8W{f/,5T{jċHK(๬($Rt'%.9 OLTk<>U6&sm㻸lMUuیs\Jγ-709iCK$Hbs*Q%eZqb2i'}J]0aT  JHcj aPIY6og }} _|BSѾ ( R|_Zrgat@\ @+ {bZg/0i'6OS"wa(QfO c6ֺjTPIQrAk  ":ue/\_g 1m)VϿbC(yAhj>zO,A3, OUKKnwD 51(^| eD2h|8?ۄ0*>N,@沗KJ {9B4A1@66E(: za }%ՒݨLجXw޲]60.+Y.Cħ*0뀎]1HM6D1S-QAk+ 1Z[~&,Y5k;M19<`ӡ=fv5P,BJG8!V!]!l%q_ԫQ}yQ)E̷o/ *yu^5g-WXi]D(ZݧSU;x$qs8<DmՏ~zINGŰ>kVu:E 8;>Б` @FIXYȑ}saZ |ۘ  Αr[p o-d?75\"4ʫ0Kv(j ~6[ R<磄z S'FP`q3rA =~#o! %^S~ex3GT- qqVZꕚ-"аRt0XlvU~nE[l􍽢2rk-GhOIbrZe8c m˙0{_TrO) 8I?EEmcֆ0)z2ꏥ5ƵC 411029"T^G\I>ajP:JiJSwAxicQKi{jMBňh:\ S+p+r.xЈ:µkc\,¤lH,Ru۪{HHNjG_F:Hӭ!1pX aDPQ6=VfGK YMՄ'? dQ<fݣKj51C7TXK+ =uڝ2NfhQlG9݅WJO%DUñ_z5pɈ M4z5H"Ab 6b`PjʽORi>5b{b6-l@-2EJ@rnu@D Lݻ/" 0tZ䭷nxumۧqA]# #ܚk$/f m;Zu/Á=cn|lD66Kcol sE2G5+I?R+Pv{Cu.Ni Dpquȏ$J'-fkVj9uíblӞu5^(Jzgc5[y'dn5' 6wʹo<0.S~~. Y̦3DV/5 gŇFm]u=6:V/6,L0ot1 T?CG dPN{r.P%--qxA^789ra o^ f&m?btP/EE*jS<0#射:9So%%Ueڶ<-3>}T6 Ri+y)M>3J~T'[S]! >e+'KOQ+!)aD'Aii&NC#Ga`yH!$۵7. x5yyEG8fAk4>5If84<_2a֨eNm~aT<.{Kl*cUbnnvwfj)D#{\9LkZ ~vb~VAvA} GzHцnx$r&9}x{ |NHe p)b3?A 5wSqnF-3_-O `D1kL<А[|Ws3o!ܔ+)ӌYqD2.~A1E:ܣPye;0o4h>ⴎgVaHEm't+֊{-D/ADV(O#tR!1諄B`:EQ`1[l:ܠH904BviRz=>$sP,Q,9GE*g5Hw,ZՃ>ռL͒xʲ ^TUs{vuu1y,%EhMzѸyA>\?w,UX_+zY5oũC:|:(SsE7T{Z 0d&7L\̓ N)Kĵor<pB"̈37%gU莳l`P*7^QϓAZEnZ>.Z~1tD^Yۨ3:"حYnA)RVSZVn\[xf{0Vlž1CiX ڝ `'C\ oQ%93&wNX˱O?bXv-Mum\h:U{7tG7+B,g}z O:K6'ebi2j FEm|ezG @ !|=WV `O_|^$ ~]Bz*u(]28rUj.#i0F ]ZK1WZشwILՠ˾Tpn)EnX֙S~sKb{~.Yj5_*X|/rɍxg;T@Gm*8Rސ[? I$&PzgɭmS?5z]:gU v>ll&JŮH$2] "I-wgF¿^R;`j`GmoL@J 19Q.m!'s'^?pÐ4J<ıU9yBVFZ-Pe;=H |&0~ d~X8y#1AG~${H;k}V}J[,R9<=2x) wfC>bz˝Zh$y|C&fȓI4k$= E.38ZTB_Xa}J$rc,x % M0];S䞌IEk1NGn^071g/s!ZuM[ƹ·>ƏU ;3LN0jK4"iI}?c"<;};=xR?iNs :6i2Qd=Ҍfn׷M^3CXG52,38܍nS95fO|`(f1p%fR=f5?n%Or8Io,fuoC{ٵ{K칚Y5Y͖oiVg0uJ'I|T#D 2 Կ@x f㥵3'*ID2ڗt gڋ+̎#Nhtd3Ma*oLs/h_z/'}Q;ae.V挱O!_9EJHɌyxl\e$aOI"VpY汀QUb9i@+Bɥ#"I(Ͼ2;jZc#%P6kfHuBCj>/p#fIIjA"_`ά L;heMۖU[W^ޚVMzJucoos &xc-2'Zgb7PlV*#]oD'g>nʥnpѲf]x+D{”[ ;1==z{2LAצ4}QvcУOk*5)j,PD߉ickwf+9en{͉\XKTiZno84la XU[UٿiXLIG; ?ƆV؁DxWJ .7R4x:;l̶yyF'j,&X/ JP}|gyTO;KdcW `&N^HYdoo(3(˓2kɇ;5FI,VDLJ|Ǜ>TW>Md9٥a3- i@wk޷>f#)Sxyp("Dʗ6*᠎m~ ŵ*r=!FDeOQl_8:,kg+ N=lpEvF?<8EB.{_`E:@Q }*XMWBhml tJ-Ue5~±A"I|kZ.W$L8ǢhA8f^N$}.j}qNȰGuJ'Scvk?D/ۆ@{}oHk g'7iN9k3j"d4WYn 1jkFv&"ĸxt6a~}kbM=Ť$nJj"#n3bXk㕏#MW[leO«i vϜ"[=7y۬یaG_Ш`@_T]JyplD^QDgEjFP>SqABA ľԭ 1Iv"|ȁ)߱3GB+HH(zӶW̫;ZS,![x=rV^M`f)U Ps4*]=F9Bԧ˗I2{*i~.Ǘ_"h#Vs*1M<8,z-Ui@Y pYvlJ @]cL<{)6]Jd-^@H$P=jenV/cNܰd^+U {ID 1g,̐=fHqY :nޔ 5 4ƻX*8eejx,L0>UVYK3r_Sl&$I{xo9:- GگDotlW%,;*pDb+VaX+q, 4Rvt&.N4Yc= PKVCqҚ6nuYSuժ,ܖ24M &I>MWſGu="BIf L%떜pQl\ 8/U/'Иf˦xhaH3 "_ZyCE r;<[?F:h ĥՀ_G q? LA<3A9>fG\K۶ 2 B ٭Tfv%)dojik듹8H'KD~% '1>usj77m밙=J17L1VAbmr[VݔEѽ(±1u1s.,AցGSc7BlO%I˓iBYu՛oA#WMaS˛- `r& lE~ [嫮2FymxTXWL>21 w/.t' yUHZJv Y۠?.~ ?O XJpBR6p,]TFᕦQh7e!q =@JUMR֊W9̸kخ52}vXM f)04n/V?SڋsUn-AT 첕h{ѝ^ =N*Z5q|7~pbf9doy @/irsyK=l;e`Z$E"_Gn4'}$Ffnǹn )*IJA јj;)N v>`Q@BAA wHW?oZS U @gh#s7}Tv0&ZLK ¶whQKwǣq#S.행<ꇳ\zfZDH7ݙ35ORjy ?ڭwW5t4!-j6^`V;݌|π4;~7߹|] :&FQs~uh-A yB)u{DNrd.ti ATX.בdWԚYRli f~|4'm 0#cx[Bf{ڐz6Ht+Pg]G_š9H bhWSfF}QH% GqdKN |@diX@Z ν{kh{S?D3ͺikkZŷ5" _7&d\j]0SDJhظL'%D;kX_Ehto^ac]=.`WC`+:AJM y OtPHau 0j@r.5bUcH`F 26 ȰIY*Y4U&,f &5n!tu8ղMadl_!h ;(-OO JS)+sIGlKұ{h艻ld6*Ckߪ"\6Uƾ'>a/j5~hἂt>myY1?p9L,vI=:'" / K>8}ic-J5Ajb2P^.3 2ǙUW-ոչ(w{=o g~tOyuXoODŽ5#z^D4\]}.<(@Z.Ro^:oЙ HFU~c CM&̰ab mԕql9#t!<4"BT-9 7dpL:r吮22cTxT OZt}*@(\<$T-bX*fu A.ͩ!-[*<H)#M3c-rPӾ MT|r SU`'?HMYbr%*,.F?#+6o*_{ b \esyTz2bWsf,6 wPԨ1q:KexsgJX,2 q( _fpϠomMNpǟp`6=V7)ͣ5<}`p |E7rKz34k@_clDee㱌PrU sTyf5Ejq(u v6:LTgCI68usxbtd DF.RE34$)=j7<+Jm}΀Zd gc$cgL+}8ė$y`8d(NmZr,P{8w+H ny7().m/3Am1w#+R0I#a"߼]j.d֒Fa3[!Z&R#+/aSr"積 AzO3r!Co?Kp'F+aU.yN#^2F PIaHJfWNd,b9F(bs6Jf:.3%fhg]HH֔۴[iL_;mn'j(2gÝq($r2!0G?C3oWv^Oz~X`t_Ph(F?P}=ϳUAf2I @SAPTLz犄4ev5xl$؉6<0J6b{4X-(]:kg[*'?Т롰4RC<_Sּ RH/=V6ּl?Y™K;dP5t$,7ܝ|T[2ln8-XG\R8Ⱦ@'/Ś:.l"6XnEi"PdZ+y. 0Ǘ^89툨cHst2ष^=+ )[ߠ䡘 uyqJ٦FJ֋-hSf@ +ҥb%y<0yt`N,:~T LN Cb&:9*O~)j%7O` )t'M&)U [\ }CeC8B:-[94innm_L ì&Q] AM_NzpG/O[ ]$ Վ+n$pIGpՓd-1''rm `i~JimtV}L5!%)9;aCtDeU}-5q!c.-@ Zɷ)qkrUmƷmf{}H#u>dnShyܮ3J'rOY=]Ť@ꋮ^FBY K5oZ=iO_b->8\#ݕ]*W&Fzr7N09[|pAw4^O6ZʯYSNylkZX8#ꍷU]IHcƐ')J3zo7m&MI24{ӯ x~Z !N@c8[׮vP(-$MOP. 3qogiYº' œ~hqn0LVmڭ{柁32Re,l-/@K~B!)|4\#*aqnZպ#즵 Ø|=Crn'}3`k|^ h|x)U b@OͣrߙA}oX@ZZY'e|ndR\Dj~$)XT"vnWm<z4@.:%oiF?㢢{=Enn/Ef#G| 7nQF?w+ 0-nd~3ʄ lfa(V'gP[xך>A\)6Oֶa|ģn4vT=w;ۅRTZRp|]j̓$%*FӴV*H Ek"O@ymHqII!"UjjG9ö?M٪Ukw_c!շ9(<*-Gǰo(XpTE3;l= ?gBu613BZ׀bʓ<~yv)>Gc&3mb!9[i 'BGX߰:,@Mc@q,IVcF򔸝{Nm_?N:a+9,{$s o?L5,i=k| ]EQ̄ KI/r?Soy8YOS-\ݫ p)1"Hd+p^*HwĨ@SY1o,hwut +PI^UcZ$Kf*(g+j}G7!hs4E^'qdcݏ ~G! \'Ϸ4pTaqW|8>0K-b,f&3PY1fcS2N7Pb`q;5dg2(0>sydDJMjGPꆟmk&kR_KtW_ybސ'Q^?}jtۑ:ΫB@BП^B~Wz\Ɗb=4yEXM{ISLCOj۱|mI TCq8&zyQ #E <Bɕji״B&(ulwOrUNRG0o]~9^y{1$7hJ4on_E i+\9#Q #ɭT~ ǯ< #Mg֨\"ZG&(t.\f|"rF# k,r;DZD'Wx%8& }5l\233x@I<U.S$cX ."01ΙS)frnVE棯5`I4JރL0ZǠʭkVBOg)ֻ{g}ObyMΥbֆ7sO4tt{-&r}P l#?vCE rLI !q,cY9>ls$eFEPlY nX /1AqFxER+gѰ﯍ml \ Jɑ'O/T34rz\[ӊ* %j~kp|4MzG^ m ~M%u9a%]qC))Bb ALտxVM{ C颻1$@a~qW7Գz0mnII7髳f/< !ǰ~?v"+j*3@bL;(EçH)T,IiryT78Maauc|<>`,9iR Cc+.pO;<j6$:94 ~Y#)w 5@yVe|H0xJ3[?ks B|=^)m;K.Yĩm(U2>zۂr^,/yt^ עcQ>x6d%%Y6V }ox+PcxxOɩPS*j_vwկ*oP\Vi"C\1Td֫Lˁm[PH?ݚcYA1*xG=mhz{LLj r^gy[S : 3)q:+`qgԄt+0Hf cZfrכFqSHZh6m[&R;BJEQazrFp(䗈S(LwV3"ڒnuvZWtZ?}V?!$)nam/%]S )\1ZeE:ܐ aքF2(3Y\2t iB"A<|,+>e<]Qd\Z6sw9#~VGU 1&!)EІru6f{wWz o7MIg iF!_wo$; V\I2/ rVHc`GsaK_A"Vwb'z${rE\n,iN;DE R36m,U-?c_JJ5`~1mD %ͭ-Q(N-d hv C˥u|5+tnJޙ5?n7`@73Ė1&sxF3M1Xv}I2({L-\#;_pT_ij@s$rp=v 7n=\rSP7Uo7 . 39y0vuM7퓢)&]@I?Ʃ硎qebz# py6#$̗]ꬹbPs2 hTh2ĩ1ЂssPӒgɢ+ݖѳU,cVks[Gc>SX([[lB=:'M(CL#@K}&[%i>0bj \WVh­[-%;77y<[0{xˆ [ S{)3Q a]u L6&taĭ.,uFf_f䔕W*|^Yg$_pX2$C[g+;>RT?$Ģ)H,6\!n.˰m>ߠXg6տ=ZOCe[jJ 0oE19byeUbj*&6#fҀ8Q/u#%\-yC8j<4lIRHZ!Afki;"ùVI3Hte3ٔLGmqH!E6HCGH|f5vFwPD"!rыcwP/3EwK!*ܶGH2@9DEk%x೙gzӄKtnirxڱT"H+ jep^d {0s|@d#5HP,I뫪m`mdłĄ~E K5ܙx!4,l|%N GI]F4/-T wd&Y}:G,QhV#ĻzHcb8^I,P\Ҕ] &"bAd@LB$@؈Q"DqIɚeǥMzơnk2noO9sv3Uo鿜[-5WfM97T3h"(s9iฎS~Eu*b ҄aeO{o&7K*qDJ0^)i%Dd=8ˠ:+gS j?f;|9NM3XN}BeN7x*Fڹ.j| I+p#kuژ2%H;[^4DžiE}AV[fN..$\L?as*dPSk=Ȣ~[r;FAF[cÆ cOܱJ`K& *N^A-Aպ|dA_MH~5Ρ8HSleIV2U#ˊ#bb,h2uXfAH{`Q6ļ0~Qȅ H34%5kgSDBH&FL6M%:{˝aTyWdffaCD)TMacۿf0^y6W?0i]SpخG/Z$)`C'iݢsJ--|ǝxJE]ȧ8JFS x&]&:P?:@D PҵڗUԥƼC|mRC-9gN >Z?N@Ma*g!tyL6ַM}s^~2V?j2?%P4gsDck"Cͺ⼶7dI%$O).r*~#/"b]у0՚IHlmBTBWjI}lܚD">s~EGf{4cq/pbǁɕ;H4Sȁ#m%F?!چmIgCK_%T`m ဳ@q )/m%e UIrYľW3#[{|L( \u,8ۮgg&Vd.ϛAE">b6`klPp[MqԥBDQ- H|hD9YM0GQ1^*2@ҜnZ @F2Y$ ʧ(X8,xbC">#?Xd-^JU~ ySKrAŨ(*kIr>_ NAS('V4Tf-V+KF\.e (ؘg)W MTϤe )[;gAEY?s>p@/Ku=qϏSEkRx"EqC5Gg3,LJP)4qE9tw6u@g":'ipaVvLXL*)q +p+B, *6V > 04߻U0YQkfk(Hο e $hzQ`-$m懾 ?gŦ"<UOt>V+s3DxY@๪r)BT~?@nNXgqoAm=J7"%rz[@SG?$^*q|}cq~W6Vɤֶ#ʫ1x}^cF-IޕpB7=lɩcmdq9)*WK"Qq36/OJZf35Vxbd)N}nj|;q*=TcL2]VO`Q~Pvc-Gts篽b\Ő`]t_dyJpW=!y Ӻ̺P /$ʁ 0 o !Kz gǂ*3UGR(Qi8?=ful?nٷb)iO^_?J!S=;R1g<b yCʮb ټN 1W˺ H $GFP3%S^7|nv(*L5BmIgARv@̤ƀOm3՜ rN[1`&l 6ͬ6/ ]'W""?S^Ⱉvu((MHG]{)lgV "pnC~$۽<ȁO DYorN{v(ҁrKڸL}:p(X0~WYr#lb )nsWB ?1D*u.۸.$aToWVȢNF>4x1OC7Pe-*T~B0E tW7723q)#sܟq.G)UR)q^z=AȮ$`?oB,nj@_Fsn5s8( k9nlV׌.<ܖtQ2ϼ ]L z:g-gQX9}td{!NA/3m2»Qe0O078)a)]R]:Ċui4JNsլpNQXn҉l*T= w71r;B`@G1Kwvq|LfuGskxHdجgS,5 Փ$+)0஦+E}c' U`su*4w\]=w+@]lX|_J2aň-^.Fhp``$2yAww 1.$ s%<>%(\;7"2F qf )'Pz^GnncV5'T{1!gSGfkpYL P>S%"Oa䔯•>̓x\\ <)׷^Eiz#Ԙq4KUɒk{da ~_r26a ?nRf.^brt bQ&r8TmvS2 * >2M/Qg5`mMU;]իlg`Bwy&o# r7o"0/K)6F6[)jfӔ)&@c<ԻRy\_A4 0quK0/Ia"f}Dg8Mg](H%˾>A+ӊKF9lx:g`!toަ[Xa\cX݌wW<8rcEؒ/ݵ i oRU31}Q wyDa^#&#' PR{Z VY1>e(ء/BCGQgDg[Zkf!2GY+96-tɌz|.vDP3{o+/VS]C Nr-F?kIʴ1k8Rqv&u軚'.4y\q "|*d#x7MU^ږys/$" s'wWDCV(H_@:{P"/ Ao>x5xF k{ݽ#Ie<*fu[䞠=Lk !􅆇χױ Tסd|ivK>O{+vśpx*pA*QvPR2*lƄ_M*[,_iٔ.`{2JOQ̿Z}ρ]OY [o=o0Q3zb2)D9ĘluS{u:dlY!+9\M|3MշNn'./?F舜&(dBklqZ*Z/QSMmkH84uPj;q@ ""5UIE#tqIe+ܵW:[+;d N!p/dξbWQW[ 䭷G8RܐXIf/4|} i9136BTf-Kd]f  J9[V?XP[`]"`r^'͚5%+0j4toRDnqը (Ľv}&Ehd xT8¬62ރ*˒ n Ά[pK+4ކ $pi ØPƿ Sz{˧{@,02{}rܪqawpZO#l$ PS=G N| -CK8Ϣ߂ms;r qZ'w 8$Ji?s Ez _dwx aňr&X*orEhkq,94ڨ5}eu4[+ PyXf%Ė .{+$J/ E&wb̙BO1zbcYۆXw$҂XF8 5ޡd1eqG-E H,72ă'DyVZ۲!-ީ9r< zp95n-O] -TK@@U'O??3pu'KwP.7+^cvT@Hf*7+;nI@!r(2Xݡi.\HFӶB\bny}zz{R[9[k$(~.3xJb'~stWBo4&Ii 4U`å *L,d -D1zRp{=*E;ܨ(7w7Lط׍/IFdUq=|/Դ e)RyHZ݀в_5[i6I5W*chnn|!_ P\Yl2%G(lU|ܑ:+}~(˫Vh3wᮎ%hq㛔:[cά0Vl+-9N-/B@FTWϦ=P0Gk@p!5&2G9 b6RS?cqGG? a2b@*1'-U|o(GI܇e/žau{0n j{ڂBDnxFHip][u$D^k˚w"YV\?wѣB l.p:]_qN~G@&灲Rbm|2i 5sY2lmC6@qN6 6^_d,#obL\N_VG`dØWc(Ϝmި-t?ƶow^L0@ߵlЕ #!MNu\I39}#7ggRa샿30wҗ:wП n3M^YxKY oh2#$4پ'\ߍmpU6o!W΁&ߺ"4ǍtLpo9MI ҩjpޝzuExaCźԩJQ* &D镪=NʤG]2KyXr,qk!nkFvb08'/hcXGS\E}:sTu$OAaOLrr) _].v?PCF!3'G`0wk̺>-/bkCYpn"lj`cëZJ#طT Fbm:: A2sg7.F֖ F?'9#>Dj˚^6 #ѭ~9d U4Ǭ >9}f+=9Y!C _,<Athbh X;(1hwBtJKGU"rw֎ =c%!}Cw*D]F7Ȭ :)^buq@p8bD `e"!0&@; pgnNy-H Kbj*s:N+uq=pATCHS{*|K;/(X!ڛ`*X_cSA:n3w2Z۝5=CV3LlÂvთfUzLԄkQ?)DuVܥ45*rܣo%n T0m:~m%#VD¿]GwӇmFo,M?5D}7Xw﮿kl@u<i_HcQz eYGM\RwuW4#rh]%).hwH+v2PD^:f̍s_׀ooGx&$;{WK##C9O>!5s^RyS(RJPgjyQՌ< #H܉07<6ḋq4~И08ll3Fޜe8(CÁ"D$#hweV̺TL[L6Bnkj 8sgŽ S-_FIrD?6&d]Mp@2G)ݛ6xw}%#zxXa~ BMߘ2(8H.?ac3ОC%/.VYΒ#/axc GG~J喀Hav|H4(ȒLk^~MmFYGOAW঒S{x9iZr"ίVDOjh=t̚nڞJ5,X`f݌LrHf]pn+.7% bP :H͡*5Aάe6 =fWi*IЉ#2.<*k'߉Eԑ(yn~Dpom' U1WziR_g=r-T(1*yH4 MZmC$u?ARVoѯׄTǟ!t۵>ܹz0N`ao\g{Ey2nkm3Ka|@?Gl#}{ywT! LǻbB橑b1H\-R\mZy?)r:03TӠ-(+&''H+ `AM5Th;ssݓP4Cф%FFG|HÄ@a8/{WܤZolV2e2 9:~SStrtmF%$jŻۘ_S/\n{bNi/FA};I$1 yV!F۰Yd@}_Bp3,ѐ]0RRĒjI(%ƬÕ"?oT c<ԛ]s/O*?ޏX*҃յJ6:Qibt/~|TXuFp9-?>*"=LBF/=Jc,$ [^uBK^͑WH3nMjMrdf!$ʍa#V;a="O'mA59U*Nd.Ņ`w2nEyXzէ~2踑$ݓ$3OS u!p>ooS )e\ꉿ okkTVQG<& 'eʮvXM/5c<eow)l/Ӱxyޫ@&k,#]H5 t}tm~)k x=Q-Jlci*,SO|C_ܭ^J]Zpl19h>֖Di&spʁr]!p=YbB`Sp׸xnH%;` `kJ="$ ?lfj[ X6ck8ِݑbM?ڬq+S׿Đ.얀,x@*VMxW`8wVfݰJLL.ʬE/ ~|89pi{4>Nγ"XTFE=f2V{Ϩ ABTVFǽt=z_(BΠ7V=9nRjruSe(ʢYseF*Gr0 y]KZjv3*ԦtPht$ʁk+:9 0Xc\)D-;ы>!_}$G ChфXi:hTjt7b p{f8NejV5t1sـlSׅg;i[u m߫[ׇ a]uYI bk q}waG`dS^e+>טwx#(?!qb.ku4G#r@Y.`)6m]E1yzӧ,p2{ ?eޓd`Zi82< [UCZ-?3:+~Zf͐,થCHmiQ2>bц/ʬ;jHn?iZ{voZ9-0GB4'@83  02y$9|u0AEǑcLWx.$ZW<9v%N&"=\_Uiouf g6UB?{/ڢ1UkmYU2Q Wj~P**X4eSNv+)!?3N`q\<:܀8j,92wA$5=D5D!f)}&ϰ !S=ʇ(15ᗮeβȂ_{PŢjE#[P;ˤh|qx(FjU2f) $V?\)fix؅.K#Ń*ՌmqUgg|f9T&Lʤ lgֹ^ ƅ531[G iVuѣ-z)Ȉ:ɉF<5,R]0ϺUY1"*ҙ" p=7B5k0P&9tv}`hcse1߭W~AA#:wD}(H8yb1i%΍kkS&{T|ڃa4u"پ:k5p$Z,XU*ިAR횙ƀD;ƍY\2+Xo_b]=R ͭ;bqI=%V<àьicO9J L|vf40Ҥv'b>F!)]=%tt[ȗ$'1FR@%5woܘ72{Fh8 p~BҢLeDV3WgIz2syW:# 8S*g*#FRxS3o Oaj"=˭8ϣUifpN{UM,]V3"ج}¬9}\XeT*TZ{`J#`-pUM9"=^vP{IFMk>X' .gcD%9"ģ .?/g1UI%e4nc\ 5t7eq 98ʜg *OS =`39^j[QH-J@x[7s=?{qŸޮ4 NU](P7#oV5qS{ ]a:cf1t%† cɡl\4Dt8k7bڂMeϋ9IQJ$uei 0AI!?A@w6#R"W;1y ?p^~Β~J:o=Ĭ(=F ip%h9ljdе|:;hUi߽SY9L|S6s,<{ Sb{͔iA(sv| 6Wa-7[NoH־P)0#U$zaviQ 0P[mXDCZ[`TL)x*$q>UJh֌֋g'FEaR؀)F)3*jP-NZ?3) ӽ|6rCB(:Xٝe wѵXԟh&; gX)'*EEmqճ3]#捳~:wUwC ,+nZ,D Kx6^Y\N.:{0CE՞R$^R?< !zό }ɈuBUֲۖھDvX`3I>j=+E;*2ᘪ3s:Y2.{ ]u(ȩ)چb10RһpD$= TxN$iZK@,B-v?0qG4ZҪrT-Gu<'00Y K9Gp^HٖNk `<1F$$J_NGhϜ95}=oّHErsXs5I^orE $abǙj_M;UY!%Gm e{d\:B!.Ti.5v阻UYQ4-喾V9~5/d=/v@UHhEӹ+[`4 t+L T?$wES1l78nHpIy}_&=\6r̤xCqNiLf%Ecq*o&:l-3z?ރ?fŸ#lh!!ʒQ+'LÞm cY#sy bE3Gg fu>s26g'ULC\Gvs0S..z qII_ǧ/b j[7boʧl-T2t;ކB4m.q/)R l#5{CB5;F6iGySܦ'PN{&#h Mᜋd6c?|Q ^+{[CP[ܴ:5: _s:G}Ev3_W%o}AHZp&eJF&a$tmZltQrԕ~Gwv~2W:h |$-QzyC"W~x\]}W!rٝ*mVT'D26a'FZ~9H_-ohE~,-LoD.gj.w˛Qg{e׬-l,]z\q85LM⚐O}i̲kiCHŒ*zbdDE!Jqt`ˊ:, 7*:=zbl2ǡ١n(_yxJXtmQG4QunŻ6v,uM1M[Ȟ[PA}@ysϰtP`~{襙#G {b4|z_WQB8j^KZC~,414I*.ɆűTpKڏ.!rd@O9"mYktL tF[-xHDVQh:Uˉ)Sp./IXS3 ݖ3Dתpnae%oќ(I u/NI" 0 j(?MyV Q#zƖW1Tþ2ĀWӀl#͚;EЧ^UKx]!BqI]8ҿWL 9e!5zC{`eRRcZ|it&vOw4/͍ٛ." +̃5gW<&^ϣzd5(nPLrYH1A\#D؝W jg%I_"ws\CsTB]LJV&ڪ:o* A`_2dU5=B4o׌%H-O:?@a0㫇 )Ao-puwUc|[~+'ahI$'l0)Z؝pv͎>ѕJAХ=GcP"VO!:d(.g=I!>eXm]hJ"뗋U3,3̥]5d1͸6EqSvV1%P1bV zVys<AfIڊXso%حB~f_.Efk%ѐ ǟ0r3 Cn-Js(;kzOGK-Vt{Sm5+>"ݾWHbLfVj/Ai4}vGY6aIN޸;I n6a+{d ,/;c$hκre "|͊$jx(/:;{yiɽ4 71  B%h֎cmi I mfip[<}3[:x[ 7IֽzLYV. BdOT`̋X !wֿGQXPKPul+PKr>Ya&M#/F;M}7OB*ON'DRZЄrmx|z^O=ZAA> htO<-QӿV,<ڌOښA_JKz#0 s\oӨ'?CөFN 2ùB?zFڑ@KMjlA8chJVM`ÔoNU&vK((|>X9,cK "' 1kDpFYڃQjn$Gf`k#={my$ZMjˍŁK t­SAV髤.$p4m]olS\at79(ev%+ iF3TAXrpu= YB>\9Uݒ!OER$93Ӌ=Ec,} RJE7WC<ߒMmnH4y+ԎTvZ,V8&K"?&ĠA`@+M\YѦB2%5 yčJ%T -,fM ' KZGX%F O[`K'9awBo 0D4"@=Gsm#h8%2]弔Ҕ;#uEk.䘟Y]:/는 NU~NИ^Ñ2<4+éΐV&V 1♶pL0mJ6k*#džʅUe̱w,x)P`߳IQp ``w0,G}"tt?u6KzP6cֻ8;"Ƶ#bQV%50IzJu`~hbu|nߦG^3roމB -]$`Jg4 !yZ ҝj5_(a~r}[n h0! Ji7מC`;(eqo0[R7L ,ʊ I'!b.!ZC_N)+*Sл062,>2V,u;XCCFQ3=e OX,8zM6,A t QLz2ݙiT(ճY0Yq62iy@(Lmf3=? bcK~pɛt+0ĊG9AogCkTb()TQ}8ƴ'BF!꼳dwߙBYa[\⫘cXx&`׬kgn<bVeX1.IHK"Z .D >4ߙvfw#JtOX²K]Xb{(Ln(lMŜyP=h\gᙩOZB=̖kAw"lMRݒjF_A{'IyZ_`^7DPx7^U9V8arL~ /UW;WylKn?@;׀أiIz'֨ٗy2&w-[W1fylбmqFX#9ۜJs& 0VJKaraڶ^(ח70jTT=2KB8 t^m)x5|fFEH(\4Q[X7MH޿)2::(Z2fuRT !V󵋉VVf\2kJ1@r(@AKgjvnm(,Ou;i?!tm_^qt'#T3J3~ݙqMϛv8@!7t*YM8iŠ1;<Ίd R,AB+vPvQT_eLVօX[Nud0ɌO=M)"G(tPcpm~9udYǝ6JSrySQmObl%!.0žЖ߷$6PdYA:EXY4\VȫPe0O\L w~HD 2[>M!$32lRYsyA(!De3IJ\b u%#^I"u-+=/ЯRۃBۇl(4^~;#HRwrnm]".s,rh 400UV0'0R9B,q-wq X\KSlk9\h)Vz9l[S>z#ܻ[," n_$SB~&2L*itc%悺5S i*<|ߘ_}iAZpYo.w$Uk\.?-sKlzCbVbmRp:tcgp{N89)ztk[ EBQDjfzΒp+ 'xț`>xkS`ڴ'îFaq'X*QfJk-֌B,j]][.FJ͛5/zusVHe^҈*/Top9Y7O4Up]O1ŔYFPJ$Jo }}t_lP]XJs ;N@xsO D*\LS=,z֯;E݃-zL Ǣ+8ђb8ϣP >̣-4]߇VŰ3%_X""U؏CQ F=K`e IbYxoП>H)*1,)vzuv-z\ H=s3mϤx3YƵݗIh{''-'Cp lʮ9CzJݲǜ)9<:a`+N^.(tDwLB VRDuB#)CP!Wچ-ZvkU^s89&ncujtSV a*Оu/x:գ| MnmDN_QbXٳWn.2'6̇"{V{* ސjz *iH.Gl%[n, Q;% A7CRӸ?ZCb2fdSsQH}m ppEL'I*wӯV. LmdNEc:CD #h&r1Sdp%L+ҟvc"a&2GM },0hPCQ}zd%8(QoD qZo iEvL8ck=Cܡ9e߬mH2V0,cy.-TMqw)ViXGo$Ĩ1V2-x氼\r45#֮oW7(|tJ?&Ʊ'jhLJ'hhFۻg!׆Uwہ)3CIu+]ʐC A Ɍ ʍir;ʼH\j &;D^a!w RV9zf7s w0_J יRBRcoz4";Pd/mfC.XT])4vs-7RM+%]g Z]) 'J.UHN8%9zMx!SuL{˘s(pʚMV$x+靿~qٴڏr,v4bp א]_,unJ ֡ Ew!2EuZڕ"X]' ^Hlڸ=xK^sV60'%;bC}/ymc@c+ܚ2y;6D:R>B»Cй`PJ_*Bon0tp{KNUWO%5+bZMl#g:MB~L{Ƃ9;_Gp8(y9= 3&`bX>{#S (ꀝeYO G͹kM%pw˜~;y:9(`Jk]9mPF|wJ &pjK{m\LхOU7<ڶiy)τbFt'"<x\ `$%bUk)f O?A}0Ц_&8LT,ҋfXMykBEkv> !PD;O NX"zK;iEE?+1{1WQ5\]@rEמ<ׁdI{-i~4``;DiLjT%xeܽUg|]35؉+@Ag_T6 ]ƟzC$T˙]Jp}A0ɢWΧ%]O:E3Fjw* K^g 0sR@LA:cqfBJY{cߢ|K@r,>,HJS!=mP0\)4W 9Nh $r2+%I~kQi&ih_6}i+(1/}sZEV/4bk9?|.4* K//wS'-Rꠁ{alT]GG9:z9j/Vza!t'l-[~~Z3C7.mKnOtI.eo\}PyO +3cÒArfԕ-@K谏 9A8OGl34G-^gX6łt<*n* JZ%VeE4]imWF# Gy k%b'4O]`]"ލn2MR @~E@-⛧k4>B+c8XFߟsxy'p|[˕ved yd=&hqLl0eȬy[圏E3:X f޺E^#E䋅R7z+6 Xgvt5aދ Y݇XѢsv wO@lm3>L^;09 I%'_kbQXyX12_pU-8iWuٓzz&q,װ\]aВ^mGOo"iinhJ lݗc ()N]8W6̟/!mQ?vBӤ3ۖҕ:97xcNB*)Hbzл݄c{! ױr:?;s) {phDlU.JF/wdFF-E(OcX6S/Y8r ] :ƷܔҏqB>7ujA^̰>tl:/\ f\b̠J?F[ɥJT~:>U`wd ܖ!q N 4HʂZ/򂆁C//e<4GI+rÌ6wcM }d;W%T5T4K-81D@!x\hLI}m' p(A-BtToMAAxMϮD_Q6L)zaȕO Vh*RwZop48qr,ntC<} ۮ 'o &ηa~G&h:!l@{%mc">: .^Oy?N3tkּKkI Ô&x|>O1x~gqG42:(:bID.=P|&+93?4+ B<_ڎ]0jUwWoɽXګ+|!gӍ۹)N_2?a0^%HQKny=aXK ?WjrEЕx$93/+U][گh)bK)-Ѿ1{|ZVrYv:9LXc貴]UY:elL;)(}߬Զm*Jґn{eq.1 PU=zrdޟoTJwKIr`y))cn߉W},}CV`5WZ\Ȍ7L/'= ]kxG⛉E2W2U6 8[;k򃳗KR8$SQ?֏gCiBTV 3m_G>nE\3m& ߱K87`LVw=5`XK:8'4V{ <;.^R/Zʣ `aTt̸I(dQ}u(Z1 9Э}H쾚׎V\6 G$U6cA()`j0B3w4FN$1=Ѭ4yyjB"n;W*+.Ɠzy3Tez,J|ǏudNs[kvkE lモטbv&ZRkiJQ ;5hFwNKT񩕟/8e.Ȥ~3ؒdكХ-+in9ҏLNhWS\8{pr>'w! P70KjX6EP%k"y]e|=HշطDƮe}45z}X4ҭ , EgNN]lX#)G0t(bs;UJ/lD\7cuVbtRw6CiѦd_ zܞ<(m\ i{, <^B0%̾޳t,>ޞ5Wl݅=-<"QIR1aK3a*81()>%ǀdp,:&g4Q\%(/kbȮ yoLΛ)h!  hnlM.[ZX4s g[#~:7ڃ06ѡqnU~p0ZrA'.Q(M>5-LF6={탖 iDh>_Y&&(R?p.aK3~狞/ iI`͉Z(7~'C$<Et1( i~ԓ&(M}h!y=gBs"zIoQ|50۔"Pck}jHK ]sۯ:A (v}L 5C4%o(pK ^D NO ]ŋ^ec_BO](B͔[&;U8UFh?/b~jmZK CaDs$SX”\[=VKXe[es3Ti~Jalm6`~md H{S.@EwP]}o͖AǠ\z[%'>¢7g3כ{J]z!jAnS{;b3k4|Xj7TWgdg()&VHv𒌐*cv=姈KT:,NɨkFȋ\vJh!U67)il?9qMK~^QſgS!;.)✛M^GxpSPZ))AVnY8MwVޜYa7xZ:!gD`[א45ZAG}3YfV7vEc^҆"E5 i+INsjHZwk|mEXm8Ssvk2)^jQzNMY=V#ڪ_QPxi(y@EU7 7̘O딙$_,'mZDyK~㠌iM߉,>Ҁ;N邦.+wr腘Pk 5A|SysWڶgï N o k w~AhL]Bu|򷛖{ A6B)R理SѡI|Q}<^1#w],J=QFɑ(CDナ)ֿl>ڬ5]nOD`Mj ιKK]90v'-p\FvL-7'VrǃY9`>coA9<% ~OZ(Nþa:hKw0P}@1"նJK6i⺉X .Ҿl}+n:9Ad2 9d@;bF-rPwi bJG=IJY_=l'N3t$<:Wӻ!96ŝy凥nL.Zݔ>P ;T"> X*@< oWݻlq<'nI@E(X3 H[ zry9j[sID TP~: q=ZD!}l,>Vw ɄblLlMR̸ù"7=KG߬noZnrvWl9lM1E,xpvSozt[bKV̈(abuYmE y hdơ5~ƗE5#5 ޅEBG(U ʯNznݵغk7_wZ^6G&1}! [sNqYp|dXߠ,VF#[-$DbOOI@׶$B \gOk>H{ )nOYW_;ᘸ2%͋*a[?01j~&<{[~JW,cEwN a}9PR`1x'PҎԊސZprMJam|6Ē ?97q~Ë́Z٠e00z@ma(իfS9Qk#Ďm ?V?^T=RA.ݧ vyi+R:esW" rIS,w="R(+ z*YQ)cMrz1ϏsF-!$Υs@ajh{]>lөr9t~ l#ҋ{B}~+%ObX([T9] 7BO6{bSH2M5 3n9f':"b_*m˟OAB7qM1[Fߟ$-m~q 5^^-l)l]lQ%d!DxCJ mmyBMق<UEdϤ?~@7;{nEyP=T\IN|AХw-FX,Њpgx:|^ <N#G k7/ )31p90 m߇)|XqD+$KB2Q@)cn {Vp<,d )|-~bBE\̴,tc{ӗ M O+̈́F6^gw4GVI[.Pؽ϶K)ù@CiP򟚲{s:cCN5Tqgv3SkG LU:lg 5Nd0CpmuD5<,k"hBO/Vt[ԭn^>DBzMЫuVdř60eqaj.rgn×0 iJn·Zyz8Kާ7uR#ғAD4 <Ѩ 0ǘ1@7u~\uV鵏fJL$e+'4_]]c.E9z{"2 a,%^|ei<6, jEQ s"gCg@NnN7 IpWcAG]n@Iٿ\O̴evF^Ý F"0 **l#=i>wm䲚1QhvcgwMǿVʡn2PmTCj{H7JAJ v虄 `s`r_iL!+~7e!_OM!i9 3T !gF%N,ӵy|D,ᕗR=1gCXTuCܦG.:m9AM/F:V.%RZ @,?iV;ZۤQd!=:th-)pמ'BE.PsAػB4F]D?h-FphgAn9&Ա30.~]׵B[q'.flP&% `m7zQB @ pvlmi$0ziKm1lDޭlPO髅WY^tF㰜vU&3j4Xteo*&|p}44kaic^5|,&Vk,0gXЛ0kxnd]EdN\6UNbzd3irAfsWv@3|UmkfA⧧v8hubtB%i?JqZ챨)K3t}d7?{-*FY\䌾]s_`i{"ϼY. 0gV3p'Zj<r+ܗ}AˎD̀Ay$q,4!TpUp\(XKWr,z~D;?@FZ=pE(6-X7*֌ =eiu 1eudZvil }L}(+SV{~Y@R =s}ڼ:{otPO)R5'ϐNe$tUaŋ\;zgV5 "u(WbMۧXN^c8;G@^ .w&@β] E[d>Y3ȏ0}:'0ss. ާ@u,E0=p5攎ϲ^UW~[@A޵P@ggcp|˳ʃ9M 6^;%bوM!|O5_>5Fd<'Wi!q܎' *'I{D`yj!BA:2hs]'raӠ>T`s4;լ+9љ(#@!Ed; =\Hg!\2)lW1gmr{bE!Z.>mݼVG\UI: s=~AƵ~;r5?H-@!oXZ]ݨ̞^50"d)Fu&X歱BɊû3SF*Xvگ݆<nZ~فj@ !ƓTz?vx&nBk*/3` 48~AomvS76IRQSڿz}5)݊œykD볏Iǿ_s4-AaJ :Ԯ~3ŻǞi2(Mqѵ`FF(XvA̤*@vm;sʹ4ALvaF `Hd5VJժ*]?kfA:K\wpbi5yqTݪ6j?WƨMncvVI ]҈J>m+ථǩmƒI/ 剛^-s/̓XVi }h^cX>g_gaxrq0jU($9ݗ؈,}jBGϿMŪtn,9 S$SDV="9a]BhMݱq QL& bFHAv]szcX_ǹO8pzu0 ^sSz%/ 3K -{vT.yg#9:"Oq=#4-[G@T;R)1,YKS0>.nʿ|MXLMm`ZB~y1Ҧ9._EhWŕ5zbKmq_]k EB*-?0<+Y]l UH`HbFKg]Bf*-ma AT1؜R9:]fU-A~ 'BH/MZ)܇Wk7?G[~p~ P b|Ymo!!&"g"VHJ."s{2i3R6d`djg[Gr ?!\JrVBϏS U:o٣ee~ G: `mڞY%ʳ̂LlMV."5IP% t5RXpdf+q|R6jllp4"dOȸjHR.EsY#ph`%AaX*8";,-z5GDAI(wnX${x="yM^} ;A$kO%) _fS!-v90m?SfK 63S3a۔yaeh8:%U/K7#a([T9>0y!cy}cO,wn@di]sL5[5!p%oD9]7 dj\E,BʀȆ2f,Ƞ3<#e+,upQ)=j0y3F%=_]I,TD^EnpNOhݶAS˟VR |X[;~#kPx<9v.pP̳9]\j1$h&.mV&ܦR8{bKء. "RݠY3+3yS,4TFm\o6>fEX-*V­$T92ؤiC$TM_rnTp 81ϝ>8+13o! b㬷PE̖Q`GHtTFV*}  _ tb2|N]IDɢ@ ҫ'h4EݘF*X'凕^",mEgyVSK|E3Yr@$R%hE{XK|5X#A%:땾&_}2WD-ǭ4W 'm,>dBT@W)-]*L_{'CyN']_ƥs% %'Y,>?ű-v[$@hsu҉³z6npeJŦ߃Цf_hh\ 0M1z%nϏCc>C+?rl˛$!TS)oT{*ɷ$HP_$'zC3hhwe8R#n9/u4"!3cw}%r ٵՓ7I*w+!^allAH`{y`EnU,f4gyVK o263f'AlU:~Ucwf+g'SJLӾ>poRԼ&V¡U~tMv`+&GQWWiX '@ u'xT9v ߜz&r)0xGyN6¹?t4 /܈; 3-(Z9U*3(΋u7X/6Aƴ*(L МV [b#_r^ȹ%x]7\eI: _#ظuyOX*HP"5}ؒ.wh"RVLH_! Q!P&@MP'١ĴV2yfl gG&H_8rsL@W|Ć>ĠLGLu>*XpldSFX:QDY{ hgp{}̠G׳Q-MPrD2ܰP4(%`t𞆋y?Z\9 s+&¥7GfpLFk ^2R|_`+hGF+*A.U/g~Ù#m5 5l X"c"jfq1siE&nc?-vwsFaݎKvϯOF* ȋQVuXaSfa^99\StL3`7,E~_ā;.Mu4T`,O+<2FCR2ܮ? >{KN4R-nBG.pz~"ly-e0~Qg) zh%p]Ÿ#QABBbDn󣼝#gC>8*PY߫z+gcoo@fvUyْU]/^uX'[f*&Y"8oT?iz} O">$z/Rk4}LOjnOьduɎFsܱ\[O_0+=x1#].bRg|Fa^ w 逖a.PcA'*0̊]]\?5O pu9U }"\G Z9)ķ q2NpRϑe-:6BmΉլ\/PP}&dHRoaNk)8^7p:r@CV⫍zx?+mOՆbz$4rLhNEf3FCe! n:K 'r0ԋx[i PP$ Ү9b=*&nL y1yPθ$y& 5Mlfkt{7BB;̅6.\z=UK0nO3{`k03.qW0:0 女FnusM'_pjV23H)HH**|">hy < ѿ>8ay7%nl6ÅT=o"<^Rs^Pl͊|>8OPK9=eD'ksi:44RZdg[$(̐j{1#n綛ȽONs&PiQo:~?܋ 3VhIJHTƷ5yxx;xAQ]sNSg@OJ-﵍gffStT~%<7ơWJyWQ+x?y0l sOW*.1/qփDwl Lp}`lsc8 ~J?ѢI@,!S݃ 4,zɼXu!ڲ5 Nѯ@9KA.-@xV|ǬpjztGir-뱏& O zH#Z2uv,so`Ә;6`LjPG>blMQ-0>T&{{;6`W_߾9k' _[`WRFUw؂V Cl:|Wd%/0awB)Q)2<%6%,fq="N'@ʍ\ ת}5b"-}qq=rvo~|g׷F͘T{) E?q\L gQ(F(?;%ݘPLKj\o,(ñxؐnrB%U3On=)-ipmgL6!EͳV(edx_|DL AF :M{`Ca*@B{Bg\z]0{81Mڐ|BA8N X5w>M 4UwDJ*`O o,ᾜ;.Q03hg}-J|jrڙ@"M^9iQƼ#xC3y{u0$f "ii򱺣ॲr<&XFhq v]FK9MT4 `I?L9I\*?p9|'&\^{ ;b>rTՆ)Ū`rf0,>#11]ek}c%(֋ce7ƾI:Ļ[@8;vLg?X?wncϳhdzȽ7R_umF|z?DOi7IƈgooU8U8[9HaQ ԣ"H*x a)niK l2>'<[MtUZߙpšbdHTv+=|qpGT^yOM.rM y,Z25ғB W\UMgx ؄ 4oމ&7;B ڍ4YeH>FEFД oO^vGs߅qD e&:EU^QkF>bh]55rHxgM$Kʕ6[,DA!egU*ql+Lwد5Pi`c5i6OxBx=:!iNzةkktÕoc`aWRS6E9ၯd*1i7x LUUu&nn12 R.3"bWUYOݠ#K09"orVKcp صUa!"ȕu{! 32e f]M=[V>\Tˋr" vSW^i jCkhT<E,S8.[kEHeWQ4A0 !SG')6he[}z(5Xj:i p>˨DWH;ޕB$nB!y@CHf Qd-P*&]LMxi;_DxPjrɉ^E%x J`,0qa0\Y>ґF#W6fц3GߠYU#EwB:7eZ_y.q琵_ '>=c\Lg&SPT=ˢEO&ywK>6;&$LX9o+{`N zbT-)lu{&:`D \W`^!cW\GWjMB_\ߙh\[e ։lȬRFB\[:>fa<<@M"Un>sc^4-=Y쯪ֲ;qqXF$Lv1:(5(ˈ_r̪#nAڇ0( LaXM|! ;Hfqe zEQ)WD HA]}B5q.[il98 :׬'5]:}KGrA]Er1,FY:'j=q`ㅮLg|z̚2-oEA1Ŕ!8CF,G/Cݍ% U!9KA A24c"0P¸=ądؓ:/(zTq+Rac3 Q_*#+*\&ObRlL;9I4ER]=Њ_Cڭ{0K`+c/PA  ƯO@胮~k%7)nt"D:f2W'Iyh$(;Wq\0drx+Nw6B p=#vG%Hֻ>ڑ܈hQ[wQpoIO*QS.1Uރ^Lw.I7  VW53HEq#hByҘ}d 35Xt:A$2[nA۪^$^I5D˧{}UVձWR$6aDR9+O|ƸERBh"eƚjIOsG=ҠB+})5%|,% Q?q(}E* | [g>SZUh ~\4yt8hfiykeq4釀(xD1o-'Cd!0cNA8 خ뾹e'q8 T@ ߲5)U` 6 |Ld6B1NRQZVǼ!g&1Bi`g(c;'$¡9nN 1/ K1s@)iӚ`Msy'VǥqEK@`Co#w͖bp`d ZPmWd54l)0eqJ/iaDT0dXzNͫ9e 0_K!fiPW3HmV  4EI!v RypV0gl46GH 8)߈YshXus+ѐ [G%1Mƒfb|f}̳Ѧ;(: Z:hV|D!MPmB5q5&$=?Y bbaASJOBaxf׭ 4_%x~FBZ,^Z#|` @Rt,i5tYM1+VQଏHg7ƅ/?0/ *$0bJCE19#Ey]ԃ޼ \+YQS`XȂUpB c8[)lIRj8 ւ-](( (;l^L^Y,r匷C*F-7ۆ4 1SKO"y k\+*>%%Ne4sf@xZA6 %F&g@uDACM8*n{@7nU(#ҞjNp;k\! 1!b!t*a֏~>j>T ZmEk a:tz^IKtq ̰$a JYwc>MV(SL WTh"w+Dp>N4u^Zg|Tot:b0äα$ty!BhhLWRGܘ+)C"(TH6ەƁ)igUg-2 |[4Mg_rkn@!w MItպ;^,oV@AZ58.vMej+>ea,^f8h֛dw5!־+gb1"Qie^*{N0y<3t2=g߉. .݈+G9֒SA#9xYg&" I/1͓ GF4)C R+uy%be4(θмYK*|q9͑C[~Ab9 x5ꘕA`3&f$M oe?v-݈' q= QLuhݽ7YIzkO)@4cLtJM8D (*5uevpfēҙ7av$K>'.d PXYȲ:;0TrGT%ܲ:}O=>/^{ƄPp\t}2Ϟ~-uÍ$lMQ9F陣Hp-'N0TR971{ ;*IPFMYH" :69 +6p)e14xhރApNv ! v O?LB%ncZ) P@N\%EҮ͇?nT|Ahi8xEwsb R٬o\mCavJmrƐ=kh D2jwqn$Y=,3vN pVc}mџΨⲸGGFvn= ?dբ>)=ovy]/B7fu*`׶`h-Ep {^cŁTLi&@[/6*x l')Hv>_ߎ-b7:z֚h̉-&22jX5ɮ Sq@ V>5%*y/UB|H`R5~b\8!ȓ*&jTGKe'O k*-i#22OϓpRK?\5=Ey},i&&>MIt$]aj2Mdd qڵj(WD~/8Ajy rhX*#I~;T99>!QS6YRXT‰EE| ,W%JY:(TK(h$seUH fVXUaV\R*ThQJR9FS9ou& )3u^ /L8Oxv_U%}KuT?Ka,nOa{,1gOpΠ(@QgOsh)x+SiE='^uZ"ϔ~N^.<#N)C~[e܊][I RY 9&խ # j2^bK7T|UBdsQÆ ˖KZ/7:9M2O./:LaDjf3vK*Zl]R1A1E$#H%і8kPuyA#XeȮU1p̏zc wӐYr?_oqPK_3+B}@r%t}. ѕyXrs -ĊNjmJ11L<Թ"!r\.ר-J8=8F%J퉣<^݊17 .2j)]==9uktϽ.Ȳ <;E~Iᗐng JE&tn6 `HjCnGK,7*TA'!*i?拒ERת9)&Þ'pR҇la?L8uRBvõa g_O5E$\$;$u񰗚> 8cJrj?7y“"0#Z'ǐP˝#q μpb`EnQs߮ūY 'Ayƍvm:pTn7vڽ/0<+ιטdmxB }_q3 h544C$W JSNd['r R~U[FJ%+= -ΎOn*ֲ[iJԳ=axA!(e)#CQSQvѳ0^-uRO[ߙ@C#fV*O v]䈟˃;D~jz 2;uF J7CI.?iʂɆ^Xo_sLR4p t ]yA̯Cqmwcث! l xʞEM"E cJB_ Qv| ﶶ(>B|Xyt93/GAFQ4^/^8BM >gUwq6fD3zBC} %y޽f ܐKHMj45*#Ym!$XGM%4h~+@&_S}ӘuqXnÏYۦ.]r+XAllh4KL$Y.E`qN 0  :n9e[LΔo6{DǫO3]!{XyaϺqŰ{r,J4i 0q &Kuf9s,[? /9XWYR_azڛ*58P-Dh嵂5X/ yzնRKۂ; {sjcȅn 3hB[:4Y D۰CԵ';x@xji?RKgif΢n9Gf(%.BS nS"1?m/RN팳;e'se,2RLF).270$Udvj:vn\_gf\UQfz { .s?B]a`{2r(Mv؟.7~HC/'QC.rmkU5""alH^5Xem_cV̈́;`$-p'AMP)Cbl@XvU= rR-($ KÓW6 {P!`'KFQiM\e,Uwzt4{VoyD]{OmQi2 ͩ!MXS>ddNSEXzL%ŢQx[it% MNt'd!]4 0-M4|!6Cb(D`:b+)ד([$'y6p6ӛ=8c"'˼k6/hݹ1ן68XbTY%[zMYI \EгFzP-)ɝ GpHOwG:@FD0^OIQ&Gk5cD֬ DBжXr/Z2mow!K&]I-򬈵oϿ~@(qXU&n>cW\8nJˉ4̵o9]$Oye`dnL,\O1,UhJ}DkEeFqQݡ~Dz A]!ӈKykw.*R! 6r WR]GOy.XrH2G۽ا8 ˞$rYQYOPӴ63QE''ay e:pq؅Bj<ǖ*HZ?H˔W\{㉩q %3br+&qqN<8jЉ F}r *ϣJEX뫫eg5dRԧkט(aYc?w~;%PlAYх+_ҹҡO`ǓxR* ]@#}D' R@WR۬p6Ui 5JiNq 6nӏn;|13y ]P[ yJ+HfdnC4$5+7{3>;6fvGn/!x >Uמ*d0P.Sn~vsp5|#FLM^]LĠ{e/d|lGc\$EDELldAߜ9(qo'NP9W2n _Z5fjaLN g(T5(U=|@[gHU [ ">aș;DI1t쇝_u\ق1f Ҫ b'h&@HxTfdTw!-A|!"GLeǀzQ @2ׂ Ѹ,-/Y(V2ALx_@k 'Pn ="-fJ@z,+>ds$qa*.*"ϣ'~9155kP[GAV˃OIc *+| XԄ)H=VLЍȃM#ԑBqJItpȽyjAo9<m@Hw!jJe#&ӑ#Մ_1Sj7?od$z `a D=~(՗XZj (pT[~*C0.k"v[p2N{i6n |1Nꩱ@#K 2s*}:FjNBPO&GllUK#ۜ!6 | i2J1>W kP [òyHIRCSXeq9@0Y 6[ J_CQ{:h{]!MHS,  _C7wɘƞҲZz1 >^F* Ȋf 1܅AK!D5?¤'naRؾrjN0ZA;ntԹl}A+.=MF>"s O@z7LX6 2QhP3hZ {7e ev2"+H~&sԻBv8nK@AQHP2'++$ZJBu'UIթ%KբϢYb8g, 5<Ʈ ᴘY?w.f9OυdrБ\:{ܣ(!rV~$*LpisB%"t <.@hL H=Ho]׸ 孻Զ`hU@S(NJV1kusy ͭP.X iZttSV3KQ:ҟ<|U\Du '}Z8W9$\.\Ҧ[g+}74>3m[E5v rw .Ӕx Ce 8@GԊ~}R JopyJzC/Q0GYw-)O'{pkItYƶzO_MWa"|S'9*sg(kHi.) K~L/"00#0>rd4o| In|V#+X3Q+߹kOѼ୵Ľo{ѫ? YN; Z:̴Әlave 5'LՖxaWwgYQ44LzZ~4L2nͷ{ }>̮qDG6P Vz8(EWiK1bdtZnwxx 歱P VIFADǽLV\YL#eJ1Ka+4E}qpR^mI.1|F!!tIz*@b6/Iqhҡ sk k˯0j{E KY>lF3JsQ&PF |\\Y>Dj CMʩOA^VmvF!si6+A,&Dˠ uUI!0@<}ZwAMXB%RLbI3G(*$S?xړ:|MBHii>UL ~l陃v _"ad+&d3JLXKk>St;[N^ {@cs \0֒\㒡-[#$zd2C$@Ԓ;ӽC<] f+rVoLg MXkѪ q+ST"w~yPa4R7I@K@[L +*]$iQf[;NfUX{OVܲ"7:K{]KBc m銸!n D?>2"=ъ.7l\CX9PeaOH#W a;VItFHj%#vwx,ڌda ߓ!_WZ7%/V?*-SdOY_ra24G%7֍Qy-,_Iw|w4(H>?y]UDXcGNJҩ\m,J_h:~:r&bdƑ UPU xmTT7^&gw*0WyyAd+FG!6B^D4r`HUUAh\..7!qt! 5ЁJ6XeDh:?n=^$>!c@Ki&Lɨzq. /@(m .ME}<NrZr-::;LéB.(-VWoJ^wl *7E lƚ5aWHpӻz9} 7}R 0chʎ " fUhЉa&.8Di[Oɖj#DFZ01lԐV]"nq.kKY $uTP{R1ГyTFT;ktoPZ8iws ̂axqK9zs"Wd1D!,t8v"vjPRcr˽[|m@dmɳuN^f?z.ZJz$`si9t ped$8,jeԕ׊Z&a љK<@mƐhˡ+zL~{;4F i%>Ij,P[ &D#1s\HS\z<,Îϐ_Z`U]8JܢO,Q[uAIYUq*=0F[gi=x1 $| +ܱOa[v'gu oxm+fĽ$ZLo)dl8-(2 +$jGifm'4%\E;9A&/m9[$ROM"3؟؅A٧dudE&8JpNf"oZ1x@BϭGn042 (/,koq Ju}uuDz zqXTA" \[޳]>FuxyFF,5m2dF ^-GnG;oHIT\+Q2>}UdXoCgSCl6РsӪf% bMҊv[p:-*' ,=Ox \>jiOD՜ҐA%LSX~%EO2@LxL(VnJg@q9_Cv|"=&^Ia915R%D ]}/N*OBlحY JD6rv[wne=e hTrw<m'C}} :yq7'*wSPdP%= %D n:6ylo w l5A!LGQ.4CvM]hy=ͱiA,Sڷ{6*DZ[p#CH @]!zt,n1ie:p4#$AF>1O"JŻV߅pAq\rz@8?װ!?0 B%2?UW2ć/JǕZqlR@u+:sAV`G5 2 Q{Vp]@ړW pռnpE˘T $U3X5)wH% b@jE+M@ ߑg@8Q۞9|'Eo"W~8 1"iXPRzyfy7ff(\Ў}i#.Lyc$ӶzdPoz-k{cs#&:GjJf]=otzKq+DxqD Syeq9^~qxFEHϖJ%湭NNJ)k958z'GS~9Iye&٢{f 9 +E5 cTPLyTz)&/ Κaj!?pW_K}i Tm{:ܠ/=ف`(AZ; J\b{ {~Ӓv`ȣS0n jRNf<|ޯK&U`Ly4Jlׇ|&F{IV-*뉶( c" `&We8J~rAuUFGGbV FJRQ ~C1Gv"o_?X-}Ke5/CS3L? }xR tDV .{닂@VZܜҼ<K0H;+p 곉#TcV#h*`w7oh4iBYjipr[mGLDo#$2U2G>%Z-C`C1\EH*M\`_k.!4>qU+n[U;Y|,=R"jE޹7ꏣ^xݨW Ohkཻt叴ɏ:WقS-i$ķVAt`s)u{%xwZ' Fod^H3XXQە׫X,>.Hmz'p~$bH$a]DID?Ք= 8A68>Y/ҹ>*8K06 |dWs.`7rV)<8.3 (\6LM`f)VhL jrep} >nB`fXRB'{6))U}I[?ӦԱ:[O"=aCT2 (LQ1OYy `|̤m̩{r;aggY YٜQO" !by"a o}l l*JLaC";.P='h)Xp>T?`1}<&1,RnU$\ė09׽MDM d;i B4NЁOs 6ΆRX~?[NifѥpSqkĎ/ELX/^ӗd/[͑m?މuX{:#{?i#?JiC|w_7bʦnz&0e:Qwc!΢]1q DV9<7uݪ-?YDJ+Z*<4DcCC =a)9K6C_vU/ Q85a+6rg{c :]Ve~ q)Z/:h p,pԋa'n >J45Og^NB JOtu4IlF}K p_uT Nzq1BB'u _ՈFrLwg-? }23Ձ'vmLZDD'wxj`t]idEfv&&0#gtUiuo]TGQtTlcڣ^> 2]#UkfuTv~uG;%N=erat{_KIm(nZ|Vt \§?^/ipaYWTOXMM."2jL'IJc93⿟,dq:'ݹoo/E} #Cy._Hǂ`4mϺY´!Qefj0Ǫ6Z?"2ZaЖGtƟbM*ud+!IA(tψE=:۶ 遧#_a\*-_t%1$9coNd, .,i TG*ÁNώțcO>6̃z6I\K/GAq|#W}FB#@©`a&2;4wp b-%W>j8MKQEyWEU~q߭& BzQGwAl U헠O ҉p.@^QoiK ,$Mھ7+Zymz"Q[Te`~dqݯB%”-1}ge`Ƙ5~5x+tY>:dSГt W5H 7M-MyuniKqN/sV Q7#7:WeR2g /dY5mFcHGDpg*yB&$/.9֒ Zu{gB pC%o׏s,VJ2\KlGsmz#P$^h'X'fLړ2U{:KHow ia_lR禖qNiV1N}r6?4506f%U|o,ɬ όJЯOmS5?>BH-fc/YZԷI e0.s)>>s>W-حY뵭Kҝ$ErGQe<xQ:w o՚Em#g`$ Ev~CI8.k퀩V<@OxoX[>mVt*Έ3pR *Ѱҳsr4[qh39 RvxӋ)}fiʉx߀KfDZ(סO>,E>1T $ ;/t=͛QΛɨ-( =$u.xjaRv.M0 '**YJ~Le9e'Ky>zFIEP2EwQCɨzgAL.M +Ķ-#ݢ# >.J\^(c yB O"%ț}LXMCcm؟2է`-c2YD.1rOXቫ(;~ŠMD=S|]h7 t-t䵚hSu!MXӵsyW ;\;yMIin/6Q;GL07A zy0FLgo*A%G0.bWFsQD7i`z"o*A~[%:fgs+eaC[{ªgc)r ;()=0} 1$OOW=lc*zZf1p}UQK<[=ղOd[+O >B1҈2hƸ" RB/dwܝ eF֗燄D!?4kf!I(닥8\<9AOrD>]Ҫ+:êؐ]a!61Rp1m _.dH̭|0t@%ULle7eUeQS^G~ұn`5|#N>W 3_]A9Am}! N[~ ,- cڗKW2'1$avLN+|Jz[+H?r&Q&Ҏz\ yZѲ#c o> uB.h^ɐ#%Oë95+h,g͏VJRʾ#~yIܠ8H][m4#?^6-]C*HzQ%>+o\^u'LrC'B*m%JY5܊Fsv{ Y~ŎޭkVd7HVukAu@`!gp58wEh(}7h%DL㮯,Ն|j\tHn6O|.T0?"Dlq=yN-W86rٶՅؓ9U%'Uҿ)6OH\ zxWp\dR lhznXkL)3oUBu)Q4׵ύ4CkHJ9hDky%Bgup bE5F0H"Oǚ[wKLI!˜G H%Ed%Hb9;y=<`yJ~Stx+K^63,,.^'dlБ}@꣮s;B- .^nNhBtHX NreϦ 菙iSyU%SGJ F$<pes@&LAwo^<+ SЉ1[\"a_Lڸ&WV| g_ zvQHN)aRsWuaB]$(㑍pN{Q\w"ԄA€w߄QeЎb:H&FDU3:;[6/+lshN f{N 5qڨj ~5>܂鍋~⾈'CHʝ $N1L&zuB8%mIC_`@b4>29PWi3j]5قzkrpΠ-j0kEJ~uIч󬖺4<5X<z>uf 盒8PwmSCEx{ƺPh ӎihDmJV'E ӥt@{ N@.WLb^Y}a|c83-v]9A5%jgJULP+B)`;OW ^8P !w*tZAoYN_Pwu#I"wHcP$J>B/i֓wa, oDR$Mi0z-;բea(*Gb~vv]xTpzC{m9=w@:c(sN4n-)z33if׌ {4D܆)`|@ j 71s]I!7Et"7+S5+- ـ#d8b;#:% 1H+z冣ivyok^U)^!fRK3t)sJثMzڹo㠠˪xy/> f>~׷g!;oq)?lw5=71aϨ໊1 ZZ'F)ࠃ*+55 XVNwSS7I-v?aD0R3#7^-SeS (f^b-oT˵E)a 2;ՁiwOƇ; [\9 tniC7qG"WG"-@{p-LG j $%/C-dsflg.m(1dZށ}ˈ3{ˍP(u @e둢%M^, FTnXꄕq@WV}ND o9:RKo[섪 A?N}'%9r]]{G TALo/cST(8C_AcԺԅ} ub^N`kZ)IRU\DH&uS0)D6X?{wLe4MLQ `$tU \`ʩL8mzZ<]u@NR[ ؠe4eWI7U5} b|R^9BYD*Qccαhc xB&VHc9:s3um#*T5AeXv{LMt %=*R-pP)57{4:W p]b. .Q,wf+}`'nfz4~5BpȤ "KR~dӓ5 >;QS-N]z1#N~Q尟=0,4Ra⽼׭ e V[ĥw,x'R78>f9K_rF/~4,5upݛa zV_IXfe"n"W u8=ɩdNɊh(vsm&We(v#rc'J$ε]}?/0+j< %.JwI] &( ]XwP –z-P&Nxя௿5~vrS5埾0sd4Q ܀NHsI]R㾉UǁVODјD2Q0F("aCd<(ǧ_Q%2vOsjKNܵS5wrV H&Pory.gWR$Xpvm[c5 ̱bBf!E۶ԽRr?p 7 ; S?R1!67 7,l 4\XM0%/9H G_%p[;G=ܟ%0c_1K+|W62Bg yԯ|RCd4`OU;SJImU FL eiS(ixwYgO[]mVE,]Wc+{df@5vxd}.@iM[qx1/-9OP$5 q`ddDwٳ2>CO.bxe~.J :=U(#JZ1~Z-tEuCpE?{s+):U~3 κ^j~zHYU%In̷I*y? [](3 C$zt! nW_}b.tTR(|Z%nVhZ>-HLCU6)s 7%! jș Lɛ"ڕ~Wo+4Ɯs@ _{LABzOLb2o$n%E<*60&P懥kO:|(7e?`ۛRjqKտqtXlƼ~ArJobVt7L֜sHR㣺/g Es PONnU\C"yթG#q,XE)õpC&_| ?Vt\ZJZHlΉc êQXb |8O+RWDTM T<;Ɋ87ڤV\6IaճuXUѳYmFfm\qRyHҠȋg]z2S8DS;5betP<;/YEDJ*YZf,z 6Ȗ[~fVA#0awklūa,'ם9h&BKtO]t&I1XĦLKqTX>RUH0SKCq@4榖C3jSdק"@c7yM?_ӴxCIoY"ðo`;TY?\XUT!M.8ٸ+3Tp8ZQU,=4c/Mc^ss}e[ kdŪ2li!2Jѭ*'h(ݚ% 1g4S3K2> HxOZz<WEzs~?G=TJValKPnQO6wqƕ7+-㹓~(˘ ]HȤ b1$' n?Y2ˤ/J 3!ݺ 9. 7ccQF>< P<d,pP⃆J֤g \_s ͮU)l' bl~ݍp׼CHӿ85%,2N R"׈})RqUMo_ތNpcWsqcODx?u$| ţpMyx9ȸ}VS`2*O܂Be4'A|G靿ýN @:Ό䚹0:B.~ȁ{L&߾~u+y;}Qz JOb%Q(XE\Ȟt`U#qQI|`q4NixP'Re4eT ggS9vNXi{8Xd]ynMj bl ID\ (cBBhQHQ. U,OPW*{ Ed`nw8TxJdž:Y|} |!G?=Mg] o b7M~Xj6mIR2RnVvkf -*8}:t;ꤿȋ3;FJh+1}GŤNKO":#%@0%?ׅp! ~*Nw6 m3{u]Đ2榤޽ol{ʯP<28u|[GB`Ä|\ -Bmi|U[1C!fln 2{%GKv4w46.L?h|kF!Gr2UV4[* ?/XBO x4YVt)_ߺk^$;kڣW:oe2WCkܰ#5ﭰ>W>"ۛקc.:oNM>|S묘pkB1't%i}pk7R_D޹EKt;h9By]2;wu#YxGر* 9 6C ᠦewҘj"Vvڅ NV䓹s+{BsVV>j+ SNJQc/_4o=PQG$|CCnf|D̖kR֠B7]zlg@!'lTY۰w8̫;QF;F[:;OIS:sp_(N`fP$BvwQ|-NVr.0wUB $meacL.؉/kˠ3g5gŲBc0 ꛪ>`ض\4}NACe,"W}N.ǁS\qTebL=1 dMbdtr'Tϖ޺0^]56I~Lպ& ‡%RЩ^2e7_޺KhJ|GSRk:eQ0o(R*NwYddpOH*9!4U$>d$ PS=CwD& Vqv0-}$={>Z?p1WPyigZj?g,@sZg7 I)UXUqRɔ)}ܬmK71ngf $ʤ*f=j93-.'=\U{m쎎M bv:_/| Or*e0:o41qTOgĻ>%v_eA 72Ϣ\Jc@u 8Pc9gL|Fp^y R70{K&qPv,dW 8Ƙ.RbX]A,o [Ò! VWGbkGmmM<8K]+>D֍ tTÃ+maxgsj} tr {fbMj U *Bh"`gFS2똘\Cej6)2]_C$N$5$M"ZE rMzRk|lDzL]W2E⸑pWYDfG"W:¿-OLۊ?O$j0Qhn I^z?i*x;P`4Jmp晙.b %&B 1SO{lJx+Pw9L=\fJ+mR\ioL%̄! 5Χ>fպIjF@KO1/V}qTfK9ʜL |?_!< ZZ6f ԴcYn3ۉERI^dT2 o˰юGYx˚z^>,XLl/1LSi|"\SsB~K7BЮ3¬>w(vgyv,Ln k97ؾ{X/?M""hSmC醊!"]A6@ 0-Ϩ )D>3!+ٲHhUF3Ј ?J1EA dʚo&@ >:F{O 'ȧYbfV1x_{!0OQB?('. ES gDshirr)p8b N#e߂xgXs2i:܅.z >)#nXB'jЫ5QO*Pq*+x˓ؤ:(=|DUf\"5ɌDlpp ;}5@+ً(>% rM!|\?U^'z&_ l8pOIݞi*޹9P> | %a WEbr`3K&݉[x@t2ȼc_dX~tMO%6Ré 4"F<3{ܞU)6G{$ kF㣢h5Ux`MVLfZ:*4 v- 7ThA**a&{'6x[A)할ɶPW Q5B>LZt8iV^{/2MUΝ ]tky=phI_(9),{9'Uik0컠9H&6y&%uܱVb_qqg NJLN%f et!S1`i~޼Pmvt+^]^&}O$8j1 vuұܪX dMEq;YcRK]}MmoȵV7 5乃 H%R\WUh# Fyn<7P b+sZTđJsC$V9 4ܱh`>]Z XY 5"x}T'@ݲ:e cxZLvTK2iaq;?(+NZ4|a2 ̚ΰCcȭREOA2A#SN'5tHp2~lgXȋӟjbGk lҐ%V'AD( 1&YL&=&sp6mDUh,GMJv{ohR:@?Wj ѳRcvP8]1e-xxNg5SY`*esRe̾ Fljbq̕== Q̚ֆөQ\ݎև 1y,z&Б$qWgjݣEgp4[ àmM9,̨`Ztٌ-"FD|yYꔴP bp3Knt3ega +%bj:2b70ԺqFi-(mVR5h ZgL`]Q@1隀RvG9>p{ ʴwHE"z琖e>˳6Q"# JEz^(5$MkNy ,UI [Un&'ɯ%wrgicwL\;&pJf[tl,Ns04eLrL?kYcWց=9uSه @dul/܍#X0ޟ)8&@vÇ>3յ8a%,X&M#f~ 04hٙDѤ !iiڭ(QcZ2 vNӪ_Xe͗$I7 2B]$V j.3ݸLĔb腿Z@V t)Fnr}O3FX\ 8a9kv=uA>Dža2wZ m 9ξe0Go)L,P/|O4. V7C|n uu%?i0ܭ2Чgݯ_zх킛lMM-y.ՊlR#@I-L XF,Xi]g፩0%1RMKQˁSO`Jy02k$Py&.ytmuҒ$cV({Q3 1$,9,\G9pCIgs~i* nؙZ\6BӶġ%3BAu#V=?ZS? 19+^sa,dUE}64'l":X U'+aֱ. Gu07!޶. oF |m׬ L-X~\,QߖPm~ ᢫-i&ZZl`.#?⠍ʘ%/i!^SHCJۈL}* ςĈYJ`H*Uf~ŎQgazG'g€],LExY{n:ȉZ)QzmJ<ʔ?҃1~hmظsV6+\ˢn:pN)Sޟ 7șM H\t^XL9|?KCߑ@4qcuGYxJrsӪd1(:#yUD!! PltFQ"K;9‗kQ/? m?clk0SqN/nݫ HI)\kLYp59<=quCOb5 ʉ2):lY *u\:_Y;복Y ul0;K6!#S+!hxޮ7=3%ԐB *𫧸s3`)`V]haQ-ea(ʭ#rxJʜPc;Wtp]BSOi'ku#e#4ǩVw8]lX7RdZ.%?:AޛQmď>~̦YĶ6/UְFkG拯ȧZ Arھ|Ŷ9BeI ¶M:I!x X0yT'$ Q$Q t`grQP⮪+Z[[*q$(&XK]!aC{'d=׸.]h@-tD\g'KI*1ueW{;葅_̤J4Oֈ i8}`hLqC9>.sϴ2N^ܻAzkI`̇p̡.W* !^"*d^"Z: ϶!u` C¥-X!mU}*PfHs;@"isf;ätRG*턍(pb&SzKzV6p.P4WYֶbC(~>QrTT*p/:KޥF3E]ޮ|?W9Y,hW kCc[j, dN}tfY؍ knei䥩ƫirjέ{?v#7ėd$ mܝoF72Hd04#8OZ]ys'sRѴ _>./rcOom7-1Q{ bO᠑\fvWsBU"_5&厀v"߻J@B9=Zf3*B,ٳ2T;a[MlB ?_~V%YFt5`8'􄄱t'Y{OBDƍK[J/~!&PIeBъy^3+Unx* ~4"FM(O)y4S45rk$'z4}#$cD[5l1Z `~W`G9w:]l[Q!/ Rƻ;#P$<+{ \ȮC XW7 4o)bp*)Є@M'-4 .)MclV$}BAcCsSL^Yڶ]Z{,RT̝E+ԯ") 3: `]ڕZS9ڕPVbSDyv Oc' ENjt9I<ڣ8k!p%Yv"uoewKZ3U_&?9=XIQNe< sYy52+*j] w|riBXPVO1V];tT;6֑U NQ,j#*#iaJs$cR Ѧpᛲӵ\1jX! x~II7@-T"뺑eмD+ˁ3Q:A+)iŒGq+ #Q>yP?( ׊,RJoS1) E_ɜe@>C,G)v8|a1ZJx幑(vf{~ĩ/H8")KLP k.M║ãi.f獇EgxB̪{IH|s8O0ew ;n;.dvέ.Fj#uUc@F)8m7ɚ:=!}rjap7HwY0TmXyg J} ]v؜H^qMiXIj %ey87݋u$I119bC~BvGQ.n+&_X5dɐIJYwV3i3Y B3LU0pLOM@_Κ8 p>S^95HX˓?9žUH]ILp$B|0VXdBɼPmA?B0h7qp,'Qq@6҉#&DZsKPey@|{%&ib/KINZc1ZO*ϊhBJߍp!"ufZIxwF*:399e(}٨$ qz>}fR!'r,p8iAX/|D_ba&ҿL{$LL {; |ݗg73{7WU. ˴4&B>Csp!::GE^zBf/5w26 Ex(GO&0NYn˻b\*zKB@$sˡhjpʧ> +8Ү݂#;ir-/Ph$@Ɓyϟ=JTu l"IAHح\^YȞwk0cg W@=(~Ao ,0٩/JtmAƕ Y,W60F?dx;Ɵ規:zU"R3Soiw\*ZJ~]U vLUi5hXb9AJ5k$B%I|7eiǥöyBq&TN _7=I$2By_ֲSz'@5W9+Pl;aifpZPPked؍q- P]Soj1)Y\^͖JLyI uz^_Wpx|6g< j%_E~YsYtζLUȲl4 q7Be(`ZlvN2e%jF>\Ep=nY>I8h?~ٹJJ؃e#V/OpC| \BC9ت|y?N(wo!]ToR4sNK WhwZ]{wbަ}'[@Vn~E"6(֪^<*"vRqCnd?lXMOƄг)^BaR;pX.1+u0 {Ru<,:pR[Ƙ"x[qDmpvuf`H+(\vhE |y[i5|q"-|D&OM|gBW'{^rꡏ?M(݇z\"0ǷƐakrY/B[@4 [|璷9z֎:tY{H[|G/U'7.h4weoS#c Lb"_AKfEGI%6K'{/CBMq#'oj:aF` |% *?ҋN6R{rD/~կ-0U ,3XPo֪0-JO,nr) mA,EX}CH _Ҫ/}aH{8ݠ `wZu~W,gm稭W82Ak~ סL˺3|ٽT3Yp`*w0&z۞e7ƻ\YH^y/rMKX ʈ=V 14sQURCH,(oU>4Dˮ+vZ۹m-v;_Fx+F]:r l F7mCTk 2 S ϽGE#‡Pѝ/ŸjLC[Wz(\#Gz"(=z/lmE4)fO6}y.]PX44[Bis?ьM;>Hz+ # ^jn_gT'%y;gM)yj&K.`¶8J|mmM $Qnf^߃U Zr*rv( cg=-(1r̯E^pzRFYn_g!=hm2Cž"MugO=\хF} GRK /?9ifxlgFT'44, ̤)q|Mˆ|f"M3iDʙ9qX-{2w%%#=I?V8g[#hl `3fSa$hViT,ډ:)='h4 c|2kÿ|eJ?6G-VcKyzBCy? d烀-I znҮeQg6ȊJqw*Gd^F%`:Eٽy~,[s,+Ygfj(cjH(3_+|T1%6¶%p(Bhc6Y(?"(ī6TKJH (mihXBg ]/kJrɸZtNJ4L%rMYX)DȁceYn\ލq;y|k D,]yWR\ HDcLB|KdPGnN܎RDB+?ylj}s-ۀ.SONS$~W1t!VgBn{8ގb5ٰ;9[:?4ԇ Cݻ ! * @&;=>Y+`4nl#j;ͻ!7i>OP߭XrD!̏0H(PrSBLVGa΃W >ʹlt1=Yw|mu[)hOъ.eđu %sM0=\̝pm<{o-OSl XIL}πvI-ezr һ9 ԈB;͞"DL"^ P ȉΊt*=nW%?68 ڌu6 ,xT~w9(39.,E"(QV +tJNp,{HuDvb~۞䁃] D/o0.x>7^'7&ԪĬd7'ډN?3F-V+g-6I[[j@fw3`qL(G{^D N$guA=#jO@;(D]V2f)f'?){.[gS\ x."Q`_ =DɊ[n,.V=v 5_a }-3[=tXdr!G(vF+?DeLW,r -F!B@EDnf G ^IYU1Ʃ7*= o]Z2Y5!X1$q܌3k߆E3[ W6M.HnZ뀼N\OIʔyubA eÔXD]=ecV)=r^ZT"Z5%#H'_(FSR"XݨlQ{Fi8 j?u?\?,^2c2+^٭|pܙ|IƓi|Ù`U9hfrB]p64wgl<0PWF6_|Cv)`WaW[H[Dʽ-%G+pj9xG.p"4˧aJ3\Jַ`N #dk"YtO0p_"aؽ)}:x(zm6>/lFcZ'6yJ'}͉i{{ #q]I9#:NұdZU ";1Ӱ7ȫʐgi310aW?#`pte%dR2W5;=U H8FVlii,]> )-3H0;mыǚ˒!oYR*Wr@ڼB@}8۬lb$^?~ol*0%z|]sFikЎkH?3mQKWFNU@I`l ߔXHf۹{ڐsY͆UwSrܸq2)^{춮dፒURu5K<Ȋ fYJ?U H91!ZR6&/@2GH٥4YPK f7_v9+_CU4b7M'FH N}J^&-/?6 TihKC b3JA(:$vtҤi@gm# ?dk'3~wtI%d;z2j`sMugЭDlXo-\Ј醾4[]RŢVQ9 Έ||,%Ics,Ʃ8Z(|.۰>oAfĩ n ɘ2 bOyxW}sm諀N;c\ PFH'3%9c@//ğ?|3h 㦓C+JIf|$B]J"!35DiEm#4 ;ۘHaDO[~`Wo b!|>j)ˆK7Jۘ?2,ck$k+%f^!9nKQ&Pno?iPqUXY^2}eNB^Cb#Y (9γ<_X5 4\[4TG 9ŸRv$Uh 0W9j ?$|3kӢO(5/fSbr*fޫ~IKiMS`޴0u$ۑTxY)fH*6 s+gqؒ̔gIaُVH?"PR@GܧwȖiN,T&qҮjcx2ѐvl- 2V^LDR24/٭ԁHKN,&a?TQ/ YhAL6)vYdX7Y}?Sxs⛐}<-}Q_qJ Yg`Xr ĥ0<~r9Ĉ 7,݀4;rҦT|O[9<$s]T=a)=l@) U4J,J$/RN{Ol3Bj6e[TOgW߲;jspŖu5_1eaH fhU(䔓Gu뿸4,egxb*: ýdl=I{x ?+hEN:LT]aXfR{>Lk{Fu"%T R.Ɠ0_+,8wx. AW4l)S2yy O#=;MA2]gG+x֖O(X]~02?;uNYB_Jz)lƪ16~!Quy8eMx,iڽӆ\=J,}]*WhwP[́OF'7'!\Pq$xH rJ(E/ diȥEA@uoL3rt3q}\[7Nڿ]a]uȼj\K*͖!Yra19lV[{H8Jr^΂fS痚 pzpYнxD-T*hVvҜB»4r-Jf0J߰, nq.nÁjC*0~r%k'Z8GE-Z(1~qoц ̉dkm1|GAywʂ>%(0.Ѹ'^y+˩є~`H/Ck"w{Vf\E%nOr;y }פsmWF#ý?1 \ IJ?`i/ǭp<53`}>ns͓YN%K)06BFb\ ХӔHqazN`-ʀ3PJo+i F~4wgAOɟe aYH-)Ҝ lKb&7H՟H7q7_K0.HGer>McEBhbl4z j$d@7BMOٞ+ȭn8`85鳭4$׎n2􃸧L bգ򿅷5?_M Ĥz+s-0и b-h rP_B`mz!72?XQSjzȇ@ѪpEHPEInKMWjYFxq |UY^0lco{9rlj  Jp յ՘@kc&[<&+[iI"F0#171 Xנ0%} q"%jH?xcӽ\TQ-=wda I"?e펚#MZz ueHm0DIt-K*/UpzhzXgd#_uv>zS:P+/qң;M./ 96oYZTХ?E#Rq]Ӧ(|8eL^& x4shHj 6ήA#imw"_a~57ozi@-1-oWt=ӈѻĖy`3C^Z!Qmow"v2TP=wTޕȌ2a/MY(0^N2N95@.\ \8GS9h\uQ%lTߩ/J? 0PسV52D,bg>̯L u'w쐀-e(I C\"&;IQ)5:s(ȘdltO/S mqg  bvfSXa_HbQ޵v:!ÊkrFAhtIRBg6_`'h9\KXО6 lɼdpVPhQ/Ur hwsd 'V8: {aw o]Mԩ|Cŧ[IM#<^RA"}" cùDgɻe MniQyK|4\& &bgXSJGejA|] oL ozvjـAkx^-I2X.wjQ/4pxt?CBd :Wcx-$#4|Vcd߳9ݸ+ťک2 *+R 3B-ōN!L#v3V0*`|]R%ڣ 1>RU]rMqPn0hMQ<\ʂe8c0nkK2e%wJȭH9<+aD(+@vM!qNFAOkWy?z=i7"q~h+Nډ&JZї/ ح3*%^q0SJsc:>8)kq-\*bGvHT7o~(4{@892>D^v[$b\sW _ZzP' baO*10 BOW*퀿7?G wO4lyqӗfc7R5JF,BK/ #a㷆^~ kdIr<WSFte]"F$?9 KD \}Y9sUQZ9c %{̰2Ig֩KN/<΀|flҶI.(Ȣo]FILf;SN@]KM_{ G].&Q!3-fR\~y݉/=0%f7ex,#oxⅅC85tDr!5Rp)ȯ\1ARj؛HKe/=ƌm.IeXET &5 1C~AybM?)}=jX=FX{o1>Ŭl=TeL }W,Q28ʴ@a^d9Vjw햍JX5ʿv!6U, -4p%7aǹCܵxooIsz8CX)T.:b)xR!x^qÔ*(89~Ix#@anLG=! +H0tV 0ܢmRFj@?N-CNHWv؋[$ (Ɖ?U^z>n|tl .yTY;`;Q%/41RBƩrE\G^D-msxI( Chr&up[ tٺ"ӖyG̠;S[7Hyf+)~ߴGX2׍OW5;{3ۺ>.њDzYPrk'ٻkDuXq.<_J%1O%w݋pSCn_uy-ENǶ0ğ `&-@lJK@㖧/aA~4)J-癳U9 uMx ev'[kqQ}cC?L\%[$mᷠ.WKdL=YGwXOtT(!_EM]藆R0M -]Bǘ paFҏ6 9[%p1EPp?l4(/lH'}'̼g%C.7kJ?Lom{Y,cfgD+z|*v  Rq͟>'tyWD$Ϛra-i _>Xy?لf$D5\c:w(&*]k蘽K)4Q'ݺ+9JE Z}LEt:AeF+gxA?Ӵk^ܙZOPAoդ ʄxoPI @m.@hLw)HXΚcH~VCU2Vfz"Y\ +ukH+ET2*Ѿn.ܑSoefJ*eQy"?qBUaꘌѱ^V o$5`ܻU #zLi![c[g& skG@BܰMU~ [zOg3t<4u[ ӯ LL>$ 5}q=O'6 gf/c̟=PYD![X hBona0=YcDԲd- P[wL;`-Q [r&!xmR# oW -|WB?^Ʉ(MeZn=ȵ2&8B->bەx,j2$Oa*=΢.r@'"23 2nx@2YdOՖ˴wX^5/!Dll('yJa̴UJ閪 Ҝdqߕ-~D/wP$@JAXWɌް2$zLPfx*FUݯ![YKaB0 7mMrxp&ZU]ij<=e$J]MÌ^ \ : X0bI4mܺ׀cdUA($A)W;3c|9}k4 b'P~ӄ5Q% ܞP[~qe7;7Au=Ͱ+ΌÄ 2#TZ#=j&p.>+(N{į=xEx)6 qFx$kŮ)RyRh˵ u-:Ɔwuk7m(~N 7žLdE"NTuAst8QXtgG{ xc t/qF<4zW.o=y{JfuԿ([gr-Pⷿir!`W<˔ìdz5S enMMlÖOB y%FK6+y m n0I #26;o⋏=_c.%GPX`e+q5V$3od/q* ,z]U>א(ǧe:lDX&2[I< -2*bNg]7Bx6~A5Ĉ.q}T=FjRFweV,ic Z$w3-ҕkVF4?YS`U;?ui(i>OPACN.RZa9U 1Mptݞ,M̡Mk[O\O-4QDˑ@QM0Y|tC3})U胯Ȍ;.X7% $e0I%x:~V4Lrk%);Og `(>}R-W 2%z4+d#~WKhHM)>/wq[Gf3ysyt"+:y47-~2#*N.rsQ */.pȦY:n=dBJeZSgj)̓e{/)NSDK8fΥC.bE^ R9)w#_I. W>ȁH=7S\s9b %>rE䏵J4VO70\cp/quwyXɮ TSK/,)vٟ,aśDe*z? +G_x^aՁm S/WvL*N ޜx5ޙkj>)еX2=gt FeR|pL7}*~ $6HE*%07^*FI9-.s+G4U0t泴üp 䫿QmF`R|I3֒S0o]zMn-arR!^Df9(7YgBfvJ.02Pߋafi03U:]&KN{TYHϨ A (D|FjRh$`((3o T!wB&2 QgP:>Ǿʑ?6*]߷6WcX{S՛G'kFם;!mSb͈g/[Kb'9s,-vN>ajj2F#fK_'_^-MK-m}ؠ9Tv5jEi#Ty | 1|^#o6dJ!}1NF ⢭_r^x]Y7!4Vw:~>H{Caz8%:~ j!VޜvG/{&< 0paݴc5Ľ2V9z2Ps@ ,adnV @p(c^Tا#fqCfȡ-Fg7)]$E6^B]oO@`̯u`~NaS R=e0Gƅj_g.et$%B5rYpD%b&VnXa00*i?t 7* gv1]pl(W+0N}@ `i9Ku#n<; ԧ8;q>[dm1psBpM9m*zM xԇc3M*Y _ cc{'Es6 OC^J+d#hNA OR+YǢլHY-L*#@ݘhb >1mJ6-"k"€.&4ax5=Et!ı ڼ/+9^ܒk߉g^ΫuW ĆT쾵=SyIZc~cԽ a*fi*Jstv7Wb:8] qC(m1xwsɔͿ1E`$o!08>z7squ$Pl3/9K~nJT [HT 6g<-K'JMM49i:4p.-[I?#ĞM_'q[pPT*kRi*XuԮj~ F5E0b+#2Z[Plih׆`n{h )){+=݂ ԡtA)hBɃo}bH<'-niOūq^mymq_ n-;-\O\& {Āe\Ʊ(򑢇D~/ 6V !<\׌C={ (}(iǴ#%m#eK~,NV'B|h(LoدG@8 ڥ©, 9*T֊LDC(B  E]nVu=߫7^8:y"SE*5;F7I?3/+f0:2ex n/$-2{sC;r!NUEq\JY=cDė-rZ.^ōm8 H3m5ԧg3g]y 49h/g"ZIuS? أԖRdY%Q]|+Tc(Laϊ U:H դx~0;Ǡsh.O*SƆ5+Z&Cl3roHô74ՒxߘS#.ږosl&m]PZ襞k巚hnLkoLx="Zө\B]Bw,mvl!t,-{/'Z?nA_^iCw `ʲ96=-~ Vs+쨜yb!ޅ':s*/2گ$3~}TT߬Phe`o& 1Ļ{]"r5'D6YvHmV-ɫ_4v3 Dt-I5(H\ܚвd1E"=RPAR" $ K$M?p&2EH:y#a/68S QprVx AB:q>L Q3v<]#EuBoʰ]+5JXqj+!quv9## KvWP sB"i& sS`o3cQ` фxf7"-U0n+ijK,E.؍w,إlr6Z>J{VCX}*Ym8 lV_!R敟q]rMaVE~CK0vJ<|ob %pÃ'!X=JPܨ[O.eӮfQP \9N?Jؿ[>,W*b)gyZl hZU#LGxG:FiI>Y) 8G昬KZ3*2^~W1fӀ6[^9a]YjYgXu^,T>VID<"E6.mppߓ#C3ΡUC((`#<0<2[)_p:1ƋK.F;x!Q#U'ǑAG%]NiMmq'6^pwh#zJ_ 2٨:f٬-X 4sijз_?ž`P_H( nΉ{7cə%$OrhO6/a?_ JqQ/k0֦)2ִя&.`/yB@[RTkT|!/nN+)B0EhH17??NȻK8 X]p!: %[uU'tNm:`\ >_ԩ8|^qm?(׌3 1YC;U5-{ y'r?s3dzWn>^4Ca$#]Z/kh.R{˴{Ec3ǯf:ٷ4`D1)ֻ fxܘ=5$1D[&,s/fG/üWc(}!Jm4Nu@c6(W|Way1#;͕Lي;DGEuglZ-iDxi*ylF_+  AZ8vd]YJ9/׋&h.! O{=@c2x Mon69U&}̳Y2hP34Z-H$O =wz_^BwoHaUItRLspclvQ,65i /Fڅ{Ma`K"NMUx+G JcRP`ma,`,y<\:*,KDہBdм蓦v@ڦw7]B$>ldq[{깡ŕ$Džcv#s4Sxl{n`?5Jz\1}fF3 U2֥kRXplZi+㬆8tKE:w\wv4JrRQ;``{=C&Ƚ1,B{խKNk#\ ̐sxW5%aMѥW8PZ㋆ay~\|B\[Ԑ@6͎y.UaHf"4Crq QդiS+t `^miy6, K~"茠 p/q@-C͆8c Dzߦ JSJvGSa1^ 6BjyMyl*꽶XmA>KB<)v)BZG`mH~G32ڟGzX)q"҄nor ޾D;ZZ&=\ɑ:"Kt{WO֏.Ãkܦp™ = LߥhzXH070 x*D1F9az UT+[;꥛c^&6wZZ 'J::eJB, 喙?0# _k.ljɢ+>ꄳBF؏zi+bSɺ&iTt8fqRF(iΠR}RCBpGbdA&2y! 2mπEgc\ sBјfkE3is7|֎N̯ me.t {i7/_H[kq06AqY;Lq.:(Y1hR\p{ ԥt&[򙒽0&~2(_^5";dyz "#}c0TCVS2۬;^x;-O@dq9`?ҁ,j\D#׮q̡k@`FCϴ i(ᓴ$lI3Vý|w"㔋#,0jBL%\ b=`bئ+pG}9}.sa\0"'7607#SsѠ|`ęVbƃzM @/Rؐ8keo 5qq m2vtc-ehpR!~sWx͗O1l%b0 Cȁ!j MO:_C{aX\j|afIP^ҵ?dz/!2&><)#5䠄i@pآ%Ot[8k[ʨ<%Bzj^|D"Z~Z4S@-ϛμG=MjlwBmTUsRL0DIE:rZ)薯aX\0L-Mχ|K1n`TvQ ?؋} 2.CymHl;W + 0!Ly*& }G(2Ϥ6a/}an=ٛ|MNדG*e§z >qqhN2Qap[7 Am/bx{29S:'9'`2SsGb ̏].Wu!Q3de`1:*oFbu>L)(B4BŎ]z/IxpPy?ƊdFS3IRcU7\R 21\؟^no:șXBxcP'4RExbt\fi̼Wb']=cv|8CcՊHs>-wf ?$݀^[ 홽ڍ@ z&E] Tf>E7msy$RGǤRM˹f(Dpj_#Lo*弋S_Ƀd ,5Uro;."ņUw\^e%t'V1h>WG$ܰs{PGg=]?NŞrFbʝPK8/yok1jV n >~ILGt-y~G^3M35H>6^o;zª,<#vJz'Zn60  ffHix,s8q|:jNU0G\[O8J-MvYHz$s^EAd2=I U ]2;/QPg\=i[ &v!t.hB`TBB摸;(d$Wg!x99i}5)_!'?<$RẢPɖc3{kjwIS>Vغ+sI?Z}f70W0aaSKjp2,&h>zfvi}:XezQ%LrHElȺ%9Xc!: qln"X l΁l R8wFd\"2gh 'Ty [%0qQoeAdykJ`l_brG?\Qr?)LUCQq/ql6ĉi-C{t :}31zW1}Q>@e_}lA+(І쟇)=_C;f,=cEeqчVE B]uZ&d$DZ!p¦CMqݳ Fhfv&KgAmBL+Kq/-HmΠB l]1oIF'$rzrAS<X ]C^'i 4]z_ YBl!cH~Y`s2gFa<< CWoȿd~iV"#giE #p%״9=*(C<)B&*ֈqgxVG!*y|6$MvCqo939 -ƭbKoeBԅJݗ{xD!, phNNyٛ͗G˷Rx/,4],v纴 NE\Q\كz\;0OZA[_z(9_L; "^Dx.ޘvQ5]Q"l P 56vQƺ!VHF%zi [Y "/LiabxW2 IO°ZE@c+^&}4ލ6IF :/)^ `i;%_bU#=3;ͯUL܇[^PeO ?ߏ7n +`lZ/)m YH#F+FZe|3tLʘT$,3cmsb0gU_$%{u~3?k!TB2n;a[^ DsLo ?H @t!%rl(r kp8. \|Ox"!H\&>/櫸`*_nd̼mM&$vS18a'u4l:1F^n G+xj`ѕc6&A8z. Hx8'|fz#p ?z箏pT6\p"G;iVɽ;w|8 S"Rz`aA#QW=z,r xuO|?ԙ́FU ;:7Zd}˯,>MDLeG6 Ǧ{- sZI0FL1LR`rƄv8E$ɺkG.o : LlXlMZng4bo!H‘Fݿ WRʏaII^tYEJp\kD~d(AENV5yN'TB&QnKE=%TΫ\z8n=HXOtn,ѕ.Cc"鼴Gb߼ 5ج&/fIsS?,Az5uZ&:2Xe)MA`#^0]sNQ-5\~pLTE]Opf&p 6IeU`Tx_UXcwY]e[ .җH`S7D$Nf.?^atAȈì5D9h# 2Rs~; j-#0M)+SƠ "w>DN >_f&L4 q{M:v"ibs\62~?wu|%!B 4 W lEF>p4$w.+yQ]J<>/#t} qv Jaz_CeFdNӢ/ACH){hÂR0yvr\{ fg)!j~k&EBp'xB`[0%H/ٳ%wߌ,jvGqy_L󿷚[10 ^X8 RБ7^;0>+~rt8Gș(TGџ#N `5ۣ ^JfxLiB]G_߸@A SSlDyo*T@#:rϿP9aDlY|˴YIGj o -?ynNY۫9g8{ۙ T%Fm5fӞrnny "Ee ACDhΜEk6upFS:2 WrU3#TU,dFċÒ(ա(Uu"1f'H򥏵VE*<5kw赎%q5Gfw@~]vF-Ù U__w:^v]*:(aAs؊hZV< Vy3f&;NQ3OsUVOS ?L2J*kg#:\P5{Y?]0 $9'Z(༔!K>|_w*>X^)h9f6S~bkZ,/H/25K2"T4h'ey`0 E'G"ϰGbd-#* :!bpOmbҸvEFגygW&8@2TXlzzA`/5پHKo*C†46D+JLC%~i&]'|?U?64Ywf 6 ȅ`:^F}iZw !lp:f{=~ktX*D$:-)yd nq:9vslFeL/=3jdDB˗@q1{DƓ$;1@NX(Z7f+[,ɂKP8)E򫓫"2B?NO_|><=.[i rvhތ6ݿ꽽6W"Kopa!בb^ ~AƥBJR\C;Q hfv|\A)beTyƍS] fB;)f?b4r啿`Um͍bmkxZ/C0񝩑Gq|'%gb^0UwI|7{[a\—놊<9~h9ʚQ/6dEPTz8Ty+(;}QQ+ aLjst]kn^V^c^}*4&T'Fb-BϾ#RaCs/g(tp PGLg`%Dfz*{e1 %R' Xw1$ۂBf[&OK f7֮dBEc~˹ӫx6-/l|C*bk_UT (8sMGĈg*Jmzn Y: ޾k8FaΜC$i'Q1+~"a">S{ͮv! I vEmMŢ!'uօ[Ť΄BN3(4 p(:s453vDvѬEQ-8M|/krت5~4.գ]×y֩K2tBl0!%YPN%@̖0@O͚8D>QS6AxyGsa,TG=S#JEr&#q|-M7<7-QXByჺC8~y}8[OŌ=pi#9LC#n3KWQE/) ^M?90}M%!C̊`O~bݞu;֓^IR=WĿgNJ)GLJΘ O]"Qkn0# mػp>et%o$H{1F+ԳGG (]+T}Up[fى'KIP,$JuY4}xLrpy 2?F&}l|<!MB&w+O,xF?o[)sO ]k9%.[5@ ,IB~Jn]N+&  FI ol +C (F7#Y$;!R162j '*p/.𪎄ù>zkCU-W>r Zuf ›'6?كjs3"4Es1 rrԞ%1>ۏT]gjAy`G`ur+Yј&+D*4- NZLUE&}SΙG)ͤV71T!>64tخ/?)*|S.eSHidVhQoXIY믧nIey#b&wՖ'\Xt {m[2(睐Eb7G]TѦ%_S8&ڋOњ2t`EYE/*O"b5Մ>, .LsCpE3$2ɭU`{2D4`4rwS[37V%18ы'Dq|˔Dfcˆ96u"x!&izbi"j g_)QtaEc s >y"}!ks}Cq2HɔҢ#Pn;3 [>JdT6`[[7ѫ] "JCB7oh-=ZJLzOV$?aɹ#HWJ՞cdWr65֭=EaZ΅-WƵ;k!U̘o[~Ԟ|ƕN>y7q'EkDFOdok@CgYPYmAoy# L< s!mmbў)"FcAq`s׊]pr>¼7Ӊ|@oI+TOZaPH(1FrPH33G" ~S.JUra~YTC>hB=J rt zn=X)4gX8iѼ*b1'H^u/Q :sfھޅ&Ozu!݈7ףC"0&O4`QD>;tb}L8C?;+މ0E.*q?}MDE΍you؍)0z(~3:>Mi(_i \M/E8g>{_A5n=wR7D^skVOxp_&/NY1t@3OK: 5յ!Bx-4/ {Ԧ&Go_kfۿSi_l7+XL~)ﯴz(#kAyy>Ʈ|֝ kH[_UB3\ظb!fA6p ^B1Q6G2f8d*ug !{yͧvεB-5 LJ˟S0gչ̚9.dj xh,+FK  poxڅqO1! donB(ǥF.a$TV&3d#cN1riGχkt4"LLMHon0+ff#>a/l|CRDoE^^W(2qAa߲м3zsz^u̵ٲ|LCLͩJ>>l_anIz|ʫJFmb7p*tK.pX@ةv oO5ti&AnOjh7lM 1w`h)͂ʟ^V7D(^-pK_@`k8WY3x$tr~q,ޢ:s QO1W*enR$:8qfשЍ]8i>qJ,2timX.x_l@#S:D!>U5bF}/,bclH) |u$&$*ܩ8ۅ*5qiӰE.6v`;!o;*CoL?A) Jw"8GOXhS1!T/|GDžNqkz{ȨJ1ܦ8*JnNmtcRv:_&e,6~JaS֌ˊ&ȥc擬zo7Z:'=DQy=,}>m$q*ڛX(W."i|a ?ʺuMrW&'96ਬjcq- !2懅E&~|k-qĚF5jp7-6w+EnE9?$WՈn+Tyɏk7FoR˒0>H7jJ .ļQ|U͟b|$_?Ԡaf.ATZw@@)5&<>SՁ_H k|~cTS?eψwA<[#j$Mk`r nU (m1{}QX3TtWQzS"C7*l`& [εM ^iYQ=XNn'KGbUzL,e/ATplӵ.„u*k~ŵu 4j5yDhPV$ AVX)Cx?3g܈>vBvw ]ֲfv|ipaSZ4T[ȼ_zxlO}L6tH_`w9n\Oaz<JU|D)P9'LQOɅ sx &49/UJKòy250,DcP2)RO}mPs!-@T)\ +vz84Sn4]wfrR"8@ X)9fDZV)vO"@%*ӥX"6ԵoC^_YcHh%~F>N}¤ކ{wp%Ufk^gb-_cӚ'BIXV/qN[?.rr+|` S!FDtFD{I۳TilďAʀl%D3eʧWsm̾l*#?F/&*#, O#>)|Ƿ߸v[5Ԙai8;jv YrVEQ (zpjae*b0VPW۾-՝I8 ^SWvi/۰FF 54lB nĦNLdYga< yne}{iJ~._%SA?s|0?QFv!s'~InI~tCyk8596fRpcLWdLkRuܺ(} hd9:0?8}!?Fxu?&0TR!qT aMܹœԠž/xDnmd.RiK*㔇+a]Zb$9/$_Ǵ;_fnHDDO.+3sfW%ל<#>|7葎V#UeSiu6Pq:i_"ɍHnKf{hxB-?gz'7UU&?F[wn#m-hS1Up dl_E^AxLPKU9!#ߓ?뇯~_1lD " u+wmmfZ[-PU X=4IQaRbrȜj)&ej}[a_(+KDf4aySz]NծА m1o`=2oCx *rt͂Lb8H= LQF|~H6i>jE^9gU%M펶!|<Czیqg{9|OH:+bih$<< 2Gn*#Krk@|ǿYݮ{1)=<-WME4 tSUm\2;Hz'ͺt} $kp;wBELpJF@3g +dPj9@e$ `Ye30^]1l`IAbqP~\7@P%kKx&jKju%YKoH>9kwCxX眡y|Rb#zt i^!ut 4SdImfOWbi.N)Y@\9R1tM={hp2==$uͮLH01/jpTARx=9y"3K- %GB 1}N=" rxVD|"|E @LW_ZB?x91D2?\9Q۳+$B+o\l/LE; Lhu-8w*/]/xi:|uXPM{ez]mA$W*z~*_cYElٛo*/\S$)ꌤ5; }#_Ky՞i%Kcb(v%4PX2Yn3B^Q5.C GEWq ,F2Y\+qB-t6hZ6َz/s6 VnQU*Ϭ.mRCr2U{B'|kW>LKeo<aZw)plR IԆa8VBa{NA"]_sIrQmtfa& 𲅀fTR+EU4dٟ^o[!.\!])OP<0iUwߝ]9ֳ. ,1q1W}784{Mn-V"{-º AtC_m'M>\t(g?Nm#z &`bK7^@L{Rw &O>rXd'BvrMjCF|$ _K_Ȋ_mQzV֩> >bv%#4'nc{r[u0e|0q< eVk9翇,0.v$TÄXk3vQ#T BgU?kbBb9 Ui -˯.cI }8 ˠhD*Ҝ?3pJɭAP^?VQNdyD>=2@Վ8ڵ*"U JBnuRw`EG ծhh,>q{^Xm)R/TȽL;r 9*x; S]ڛjy(1yQ$owi@ e5wMYO3r.~O˨2iX1/FG~ȬsPaXfAzflHҋ0e;ȟ|^qܩjO\7avH/oRsf$zIgHo$hJl#$[*ʗkӥt#X4]D& p[B7rƻ4iՉu+ѦO-]8(:cS=: &+ hpMբGMAD?53) s~33V[a9,D i>a=x6{eyOԁ .<"nCDhw"j h›ߏE&VBE{ooV' naq ֢8e[ю(dO 39M| *L [N&O}]ɬSh|zRA;!l @A QR&[hk͈/mu{wjS!YcS1\Hx 8u@^jy Q#y($^/]Xf.2JX^J'{ Ų |&2T;qw.@k2#d@wǗ ӨG3*Xl~ ԓG^ ʶ!\K3YY-81eޞ5?.W@>H֬plQvxfr uV0"3$~2b ^Q1ΉJұHi#M2kͧA9E)?߿^,>&ecj<=|w(vm- hW7 fb1)惒n/J4`">;35CeZׯQH%qBkReQJ*/buz,dMW.miYN˸ٺ⣊ܔ( >ߓR5k [)& ONg %t9mcrp̓ꗹe.6Vu9OI.I)푥J#^dw.;et v 6A,@깺(2oe;TZw޿V&O: 16D ^fg0x tߵɓ+[(5KeNfHJ ~O s s[=:S׽sPgor. !y)OcG]P'1uuŗqA ]}Wc3TԉX]#JZc!$#Y.'c1(U˙Qc] ]^<[ c:傪uzpdl=h#2:#N\i$3|6q(rpJ8; ^wԂG?!_bEmc~έ[ \/jgNCzÝ|VoEř&j>SOGgIOG<w t^,&5sw{jB4Tkf84ڀBASv09л M}q!t XPGaRe@]9{hu  Xk=1ת DNC_R6/v&[~}Iў/VqOYw~jδ ׉TFZ}3X 1Fe6 yBU ln9%)VXA~ljq =eE &g0Nm8via= 6)C Ђ)Eƨ̾kXĊP|<45yrdD7c/7\==X2YTmK_2B{+ HQڻ`H7X;<ōgrfdm)G@>3IئT >ҁ''l\A᎜hPz5#h%:V D(RYH抦އI I-`gv:,ep2$W+v%DЬ7z ܜ[mg5'E*ߧ޵]cimcy)B`ܦ’rA1rǐt"w 8}?37 3RfЬw5?GP/xTZMcV1bwdszD$dv`ſfPBJL\ ѓ<95d k9y^7tƬ Z}@iZXk<u ޚ %CH}4_8*fXJzD=9O>Shyfg%B5` PV3 _WXdWd9N a+ۨt打>L ) BNʒpYmpk0g/m ™QhZUbF/>oM#VKC}- :@eĨL/N;1r'GЬ%WݱÒ1p"mPF. mD 2 JE! )Ag(?,HmPIQl%acA}7.땋uK DXЋ '̼2~`d(l+]KM>wyD^~$ow_9h䧿U9Pl`ª[FЂJ T?XvOOWYljǰt}BLJ೚2V9Ab "E_O$U!IфD"29#'6,m^eZsز¯xX_\2 =Ⅻg!}̷7m;̠t}!Po)w$p=ˉ5;hdɯareߪ8N 5j aK>AICU(; ~DqfSyD 19Pm \]s&w0F/uL}0u9X|Ʒ"wAIx 5[T}D?%܂ieֵ )~3hE+6E"|UGF kEզs2o0UO2r֨ëtr+vv2n~-cX{.K eN7gfA   䄛>UEKL?"D˜[H;:z W SP2g d4>{QS9v-X*B6C6"5e]\vxepY:*Ac[w^0~]ieTï?;k| );߿ztdҨXqd!kT^1l>q-z-k|sC׿} 3phv,T!edak({ٻ3]MR%߄'2j砥}̒+FVR YŊC){4ͼXf <,'ֻlw#q[yM&9Euӯ݈d!4k~)7e.dNxg^ÐUȭdY{μ }OH+(~~ 3)m/vJHCy\"#CXc#eOh%X|ꈅK2ُnW:">et0[@+# Di!`ZMeDPQxVBAa\e PJ7"ɐ$sO)~e}?Toy:`xsԚj\ X{2y06M'(α_,Mn9-MP\Vd!JXe"VǰX`s] յ-qݍ!l7 &` yk Ӽ n!,f6k3/N>`j!c;4a|xw/J k70}4WQC }LteO53lV^la$8f<N uޠUOmʑ!=YtܟQPם缞0B3uX+tn\lu3Qfbo?Zi+% ?g޴4HHL?Tlj94I9⻠Vq\Ctd 32ePY_+qкܺ z-++b`F/̔!zlL>l= cgFAɧ 4_d㝨~o*v2R'\P̾aGGϷ u &H ZXQp_h-%.UtͼtV:̹8V0L9Qϊ_Ͳvf?˼DGr?Ed=fi" rdP,n+?A >jxt&oŇ֙􋗤(&ښ?ĥ$TN{Y,}̷KO Č 9kUOlS,*W0.5'lH;=cὦS39^]tMx<}.Q̯T5,; qt`IF#Y_ml/)AM[G)Sqpk() ZD)"H]``eqxemx-UcUrxwk#H1ֱ@[Bwo_%JZW+ͯQ2!\ }\cPHn|JZA_;*:&Y* gn Lh_ u޿Jb^4Zd+b&D߃(-0=Q_Ewow3}kz(J)TD=".Z&kRҼG W2 \Ʀgo|V׸&}/:-uHrF;ߢ*Fv(pCu/MƘ;YL_cDSap%65z .ojg%T ;%F΀VP_y[AO"+pnԫڦY$X+M9m/c.dQ(2q ?mUBg/] n7VYilnREy ?XR_荷_;)rGAZ&høOPG-ES@!jA 2d匸uѵ7fXԒcI%cv6ʌ5AVA,96? HD_X;r߆=cA-u@o?\BpSU.Gzl bn-]dg ORبg [>-\E}\^NyeD`%bgdFgMVo_?ɨ_*Ѧ:2Z^ i>Xa҉7()hi0%,(*^m ۛ?L㺠cQ "xظ4M!-OoXe~x/ B$=1mi3/kJFjow2e4WV}Y? JxMGDR89 |Rjc,m NLLEnRC !F͌.;ƿ ,,jpAD_r!́v8qZI_#0  6l(uxOoC\01 nyQ#b%C8=`۔ka@̦Ƞg5$ZyFx'hYzGa2c'xULq{gƗm`G4:D48%?O͔[ZM[;[(c>pMj=GBDb@ͫD  -px m6jO~AvAG2<ۢj.8]`EN@(1 a)S5"JҴg3 尦 mgGn ?O| O 㚱&@蠲[heG l)Qʭ?kz<͢ .?HYSwL$aq`#pAhg"[A.5C\! $| ,_]zMuKPp@Fdp6bfnKn2.t~&V aQqRzAa_gg 9M@v1LydTgỲ;ʴ/3dVqɡT0A5H}Gn7G24_)3a}-.Q']J9bMChVZFs"R\AϣarEBs&b>*Se^?X+Ve FwzUv\2XPH5?G3In(hB<Xҡz}n ?kƉbz=l[Zm6DtЊͼ,;K{͂pB@:>"rVъ >:3hcmR6/ p8 ELG(+> t$bѢK DRO}ߣ"e'VhjC2un?0܆3nӞ櫋O;[4i uv@vإl@YW;K׽eO+ryWm8`RVEj IQq/ʨ^.]:rO ) nT`>76cK٢(8aZhQkȓ=2Y ՏDg. ªnNS )un#;M3妜hȮvHdY@<F]=Mm^&f*זL8I< ';MӞ<~.N@V[;I.+;=zۋdUFE r}DcUZ[\È[Ws2 pah=UzVE4+pJxAi -* 0IR,?s>uAjkM6gz͆^&/ͫ#Qe ^bl+V/WrcvjB-m5rJWȷ|(vQ HM"f\تS)ʤEJS]SrV“r|N;Ñ6'Fyj+//,/!,zGQTH7B߫f!#\za$%{C  -juLUl6Qɵ0IrPX@W/敎H@*M~Gt8Aء5 PCY< J=z +#{v,VeF_~qΊT[t'#KoK: i/!H?y`EfoYm )+/ro~Y.Yt,MX+gqA: ihe=g^):fJ@N<})bWlچ>i;\"m+ %xHu EY&w5< k5m-J9EG-xh#w%1 FFw0TE7=g_"Q#q^㾒!)?I'q"-ym3 Yh9zV0Tg mNwz:.f كzB38+S\ ֐'<0KT啷}g9!*k0ȦG|E.p=av~'3d˱ei9>{.< 4rZЍ1n$u@C)fV}Mu̮^R-Qod'JzEAy5^\^4G0Mz bmd Fi.r hncF [~cUЋ ) z A(l[DFMhZLqTiz)*4ۣ172I U&M}ۉ'NjIv}QIrgIfU o 9g6WI8DM g1r$(Ye]4HεJ|q7TW:_3Qܸ4Z݂Qt1.M%4c?nt|%m[xaAnF Л()!$1yYlԋ@,qAy>SJw#vB` ӜY@bfJsUMy9VW+ 0*ySy RВn9uyecƪ$O6PօJ%o4 ֢IQbB Toy)3.VR;IApw:fK <춫, cz!x4z05s2 ŬE\S7}L;q R`pMg3v;5I׈ FQ+a`Xgg54ZSȘ(LğTeH1,O)!ܭhK]u̪)ꗇ`N9t?g~`Uz ]{7PfnQ&1dE#"PdowAsKV Ţ-n`*!_/;^jlb=C;j:Θ+*HF.%irdZxVZ-_b>^d j m(}.(:oD"  #!K^bfPPybf07*g2\F1CKYzx@B ׮ū,ȶ v]» aQwĴxWZsӮ/4d)J/\2OX {^iH_^ \&O$]es gL_Nf7@3v,~;:ϰM8uihzbBv?~x3E>48ݰF{PƏ‘(%fb,$*R.ʩȗ5JtXZ?]uwQuF grk0mz)SD;Mf^aY%646VuE&R.LD]zlMЎ{K]C%;Y#=EM% 0)-jgC2MNu/*dMI{cAqwiƾT1tbɬ{[*{ CjZU/Xi8^PAUXTTa 4__cCp<02)'drf>]9iq'4 EaЅ~*&TpP(7?O,LX*=VN rWZjs}?C `RBayyzyпIi&b?$W]Cv'Ȓ0;Na\ U.$7xZ[eݭWV5hMFHl3.0|231zI3'B99]D2@}e |qH4(< l2,e| hL^>n`J1{f jY\zss% U*0i [9hVRͯ gE.]s;A-q0m#\4m~悬[L*U"* RLj+Ø*ME@w9e S5۫CJ(%xbyڊ;?qI1ls&Iy͉+Vš0׸TKMn,L\]w@x6@6 @4WɍMسQZ~7I5@ RD&5^h.cR5T⒬BgB UNAJHpDK AiT0Fv\A-HG3a=l- @{=IUL⏳fI9|.R#Or!EZB/Et,/θ'As 7|dr,Z uýK:xE#Qt2V OB Zp@QC%\1ÃXpe VN}yhOg{yn[ Iĸ"hhD{ Ѐf߮(;9ddFɤ'LA$jW'n_E(@p5IsM*ICә.0& Y/I` -w/pR,o]HT24OCbhsI#(vsX vM2SÍ()rŅ3Un!T=eE+x۝G,%H2}yn8c~:2 <\ Bu.-VYPԊ;*~}ɰfq W|O"E0^ZKki#LuKmtc e%OsHlcEG51;mPTmIX{ﮣ:߶|Kп'`4. @bo\]K,d屽]od8&`稍Vn4Mt*\O^wIY .+9t9/2!2=.50*قĦ(%%COH-eF}U\ecM@:nBTLo:9x;T76JADQߘlIUA-; fݺثZؘDVy_e7E~p(ѼD|b`QDٹhQ߂>cMwW_/~RH{#4ߨhAn,+}G%[LvpГ%Q`SG%ͺj 5Klo!`KW y0#OSZn~}oC0/D 'Xa2h}e)TzaySª,Zo"IRH)G|95_fsC<jP(MdUeUN/&"wG@/8 C"7h (tEscN-]hPS7d=`Lf81Wh3LsN`7X6Q5TaUԧ}[YTm#\K acK#AO@9j{x[;k"*SP}5LFfBJu"1X2f|"E~6э8% W<(%Vq.M@,o"/ 2ٷ.&!aNJEɢd4MdNlxiI@,~~sTnbM 2V47f tg^9/XOlWuF{Xy ]F]$aьݹ\Fqe}?!V1M7[(xi= B}B0"/Kց~J=k%(LcC+.bP^x˞pүO0j5%eƃh)/}^88Վr} `] p 2ģûr6c7{8 ^ T\v*KOc;Dѐ9ݻjWkۧ>a8ߪ{%MOI92(Z HLQnwoUF89#'Pޚq)*XX\]YBxwਸ+|<@5>mtɉY̭/SZs$S Ha7x+?l(Z7$cyR}O>k s%? |tpwS&~;bYlٞJ\?E9cߔ8' 1^-J_9y3ʷ~R)lgFGYJP[Vb"\Ēncݮ=r{ ^+PS4Cl3]jގ 5tjtxw]FY"_pj %\|pPԗ2K#ˏ dcP)ƏC؞w%%JXUJ1t پ2NVM;܉d!løجrò+=9CjXrٮ\vJ]\ =49}.gJ8 Stۃ72.6jr ྜV%[epg)O;K<8$.O ;2`p( DRN0gw=~hY3Qg%'.52GLR~[enœ5h ',J MK ?-rJ01^c*}a㰮Y-jجdGEZ.B﷧/(EaS›ko`@P庼i!Ӏh5g5IبgSu[/WVm"he~Bs(DCtK Xk]n*Bk;[Nx6-ħp,}퇈9{G?ڻ4g #w/%d)@+ls $,!dKa3s ~@*a\?z~# ̞Zۑtw6\PTv[<~3ƋUr ȉ]O Rx;2~.þ 5M@yƭv$sʭB?{i BQ;;}qѴub7:{{c=L]ۀ=I>-9~KiԜk{~.]}CtB~XfؠS Jv!,]_|-ܛf'-H!aǶncf< _(VrkiZack^竄81V'R$h /K +E/*:W,xL0ƘJkew!Dæ>C%P9sUjN4;+H=h4$N]##D_TrSYaQZK3ėAҘȏldL`{S. GSV.VgTM>uCi-Me_u.CZVgR;=2HLK=fvcvqicaE_5c/z2P r$wZkY'lM%eӔ+- Ѵ3Y$)cf_6(PDYT_' @kD_!4iOLʧM+QxKE?w,bnz5Ml tmB%ӱw HP{t&2J*M 3 ZTY0; hiN\W cN$r{ #|LN~ZovvկBu)Q{d0>mn93Mu\^D$|$p>E% PܣJ1pd`[an꼒 5^#ذnV@%:,udKkCIq)?Y23j0~vg%du9[b,KaZbx[Xj@MKu7רzd텖ܙ0@@fs))>&P%m$޾(?>k1>9Z]^F{!Cd/wT[ c=wm\LĺڧLlWŪ5:+~ ;Ll>pN2 D3X"hT2@C> ]ԙ1Ռ? <}rݚOP9w D\7>1&xT6.!|U(CxWf^s!l=K|%}4z3ƫ*< VK`F8.9aQ)gc<ۿ#t\pdUS.<:n`82m6%G:w=_#;X!&> @#V'NY%IZS? aXҫNlo®~xsƬKܞC7F)d'\/ܛxe GoIDNkrjCc]n=[E'IB:{߂>bYDfb'5cgKb_PUMvi_nMcgmNc6f97CйP GPLnrp?j{]HMvl%WHРA>C*-Vvľ+J,[.̑$ꑑ'ID,J)2~xȢ-ĎGK`: OkBm7spj s[r+s$!3&$]˷q](G'.6c|'CLjD{IБMBDDo@(u]wR}6꜑ EEe[0)rjGx%`5PVg7`Fg`lp"@% [f5νoGTwMz%=߇Sc/qD=5u=g}=[E;'Q]'3] fRr!ֹfZqIQ g^V%wg-SliVdV+#7TeIMt<(ʠD@`!ˎ˖{UoWlN}#ʝD 2 uU5z$u3Nú 3g65dzy &L&`P+ B" %̀?U9<<V"CnX?WPcOUG}0 [JErƈdXXg.܉\Ul wTX$gqu/הU|¶czr6o9&*J~;~{/ (ֈz)K9 ;l:|jDvx+@W`.bc<K#6̢ obIslc#+' Ic%p~h|_68dmL(^,Qf-hMDOzX4L@b~M!9;4&dm_2fE {5@jr/ja$_i1PYjT >ȳ-~F ok0R;勏nQЭ*"cdʦ/cgr9mp8b邺(H۽ TQuXV `H ;ii}4ɀri~aox,+9K{bPSɰeIvŞpf̕(zcVL-1llau^-$i4o 8Q`}LCHc*4+NY?ѵU+wcA_o; %?Z` - )w;2$RgM4p;GRIA&Pcԣ?[!v؄DIy,0O]X"c;Y.Vuʁ;'B~(o%?%z]׶)'fzތ-%:̈́뇿Ld84<}Qe`5Bl~ʶj#8 l]D󼠸(sKf2TX`ft駹8+eՠ&;$IHExYpU9DTqn6ʵ=bڶ e\xJ~/̻I'1h7IiՑiҍ! ͨn*nhğ72Vx*OM$awJ:gk(X\#5@NLٿέB;1q1w,[( 1kp-~+c Memr-f+q )Qh0MZ\i+^'ʮ^ܞn^4fҠX4,"}o B . oo{iaTsתY$P+R"2tBv tz@ݟT4uA8/YKgПn3^ZV({Jf66]ia<X<CDEt2,&$ZYdUPod X)ݕVb08ܗQ*{F@{-FM?FV?3S@+(h3G=\-je땎rxbZ71)RǶjꫤ~yu$"Xl01 f(M3ⱣFBm\&r~]D4,Vr4A&?!1jI;:݄ee]|$ҳ͉lƞ|a/ʀU, :OSi#6ܲw?oܙ\~LL4d'%Ԕ gGotiwճ;@SdږI Jܐ7RʟMLnx>. hiI(X?vz@5j"iM-#!;G]ޞa}WB^cr8e10~\>4o,7:|XnPޕm `v#jÖc5`aDNcX>i`:~1{{_QJĨOM֧1,lehhU$B}K0EH[Ou!XیM]^i$xb<9%nP7 O^%q?wfn{b?4j_2~٪MS$x=N298FKV|o6mRU DIN>Ur5 *8M9ck/nM 0:שd@ Ns7ݎYNaI@̑ Wi65/)KbQ4ZW\ $6 v4v$[yWeLzN q^߆rqj֏$#-7AV,O> X.U⟫8tX5uRCYcFu~v?8ƶUm){{<`-+X-Ey]a%~m5Yr;P*I^Ïf9]dE2`8޸K~n %UuҪ+;ܡ.+=kww+RԒdC-ừ oEIv\BLX_6 (!*)YJ&(icN_Ơ:O׸w Z]=%O=V")ZW:xs*]++C[+˙X; _΂ %ԋx)csՈ:/ٌdԺ%\1x=j tx]$]$ %0&BD}SX\Q(g/jO&ʿG94WJ\+!{(Az?\bcbjPꔰ.L5(]; Y-/Eoa"C/щ3{}h=,4Bu e׋c~/AvƆMpOLoUԞb?Ջ1ȑ &Z髼jF5uݹf/\bAa|4yCc&Kksf 29(u|[:1=Xn򒞍jc| lFy_%41pBYznprVAeȴ.j_# 2ơ[B؄&83"W0-)'@r1$@:.Ps|o /y@@訠MRT/K4PW2Ez 0}ڭj_FXQKx "5CefCӠv0Zr$m+34zԩ* T3;RGF{d+m.BS%j {ehZY4QvᲹ72CFqBi[-]%Դ7 p#`|*LC_u ?WS.9h€Wm+ӟ= R?1bDg-1cq{&Ksq1F%cy"hOV^KQHmU֭hbsҋfnjX U(<)+8^!>,,`Zg~ΒnB8̧*E.L_l^,Ig(b(L0h|arh¾.M?O7USYBoj]鷩VꚈ ѩ0 ޱ6T}k-M7]}_MYF0!>5%;xݷ5(a-0O|n3̛1l5*q|8ְYS-)?!uLdэW)Ι^ nyϪ0\ʄxYSËꉟgEW\0|!# S~|􄭪Q+?Ǯ*yJnfzg[.TmRUa"]vLTϠگ4Q^ZG:U?b3?++S_?29~yiU2fpN㛗rJa#*ɍ9W7/BCLRR6 VO4r-f#jR|(ݪE"HLZq-$1ڪxj\cg-`!B@vIKҩFE /Pk]׎n!f0E\ ; jerZt"N|`'@Xz"~ٛ2ftJIu4`" QJ b/Z* l=K:l&OiU:k _+\a 4 _ U LiޘlGlMhxcuƔ|]:c;o 3{r3LSfV_>hK֏2zȆ6;f]C8oz0)aeoR9֮͛. VGN*DcUW_alXP8ԦQԔu; SߤZlϱ kT)qK;=P[A$ 33Y0;h\?^[&{c$iݼh>$2pMչ; ɻ|#ĥMWقqa/v1QKIyҕV|AyeI)!ݗD?`Sjyun?-6\]9Yu|rm)ЂzZWH]M`jSc. Ըy'X)ɭK,^FX\y*Yx]&8x/@? 'ۼB2oU^ukoz" +bG&4bO/Љ#L7[Rwm]I*ǫV11e.mkZC h>q#өq -.Vʜ #q* !> Z"TW왍l٣HE%r}kZ~NyS5_r1 ]P{-.Wk}B&ECI˻:~67[E4īX 4Ge&^(M:UVl%DGaa. aLW.ҦͣڸlEx"G4r)sMn&5[u~DN$$欘^%d D`Ә%VImv>yN e|8C ݞ ku mAQR14d*+8>k K-CZ;Te${7aK_9t/Aݒ:Kw7ߘX37%goF!DcrLL>ۊWr| _${?F+}eRK#}03썄u:|%?Z ⒅3¹gCȏH\/XOTA}j.ՐbޭyhTu[}.c^X ,~0x'"d \+Ol˲a]5|56[h$mC9{+ 3*wOk^-}KqW&A9zPX < R;%F8[paH-~OyQf'[R9͜y =h|؉XyB[g$|V| TV0H5r'smE/}>b5!7nhWZ6lZ r'uoEYìMV8P:Ly>䑋vP]f;Gd,Fh$?GHa>ʒAՀ92=8bJqR~lif Pw' ?1u5A7r(m6& 7ceuΫrY53@*Jǀ~nCxKtZlq*ڜ>؆__tZ٧|A朳Lje/ʑvs!IE &aŐH i[woGȄNJOb)ۅ+|tKW뀚C_w@m]҆kͼE `j@ L5V,^@?_g'f(d/@o "CNJzUc3Ѧ+/D;%VgЃo >H&$@dIMȣ-SߨdRY<_1E |n^ZFFuw򽕐]<#]mTaO"Q;!~$c~Tl}y"L6ؙBLJ{}٘yV?e:WY8LovPA%D ?%5q@DpQ=qhbFew-7Ll H(-2$7XrФV.[TT4Şw.gYWx#6IwAG;,69 K2@9 u*5Ee ͪGk8LyprЪM7bt. W5 Uò>ۘ_.v/ r3D\cZ n)t^+q&}̨~xU",K(7G.e8 5}J`2A"I;=;ZD +22Suʢyh4\sY+eIٸ+y3]OWr6>3)EuT^3C6Actgdaت&8v^Qeǣ|a7T1K,KEe6 &9gSتZHO@{6i\c,D]HYpTcң鯢JZD:h59L0X)y+Hf͓蟟_TD!U<pYl5U"+IHhrt{ή}^+9} Ͱؔ J fRqEFv )JƛLyLOdhL F?5!I7.b3{LtN[9/fO9Z%X%9hj¼Fߴ iM5QڤK1*"cF A#9_~*<w6L.5x1bL]޹1Gt5&5enIc0I5J`r3ӝSt/98 n0-Z)rdN<5ٶ=raYGFPn@X:Q 5IM*}' S-GOE.M5F`Q1oQњ2]R[I9#rKb~V m +أhlBTbA2!Uс#N7,yk]d|eA3 "nێ:ODU&Vb]ZF3J״rmOH0@02Tq~pdY8sgʴgƲg`E C-j_f,4W-g^ë9đ2 OSdٞ@O0 Qp =CdմQ9WP^RQ1W$4Vm}ɴM@'Z3y%e$ʥZS̈́†IJVv^K- @BӻRQ^{0%!k7QlixL]>m~gr p ȲuB>CK3D4e/\_KN"(f'|/j~ ⯖6zE`E~%SBMDxx{>/kiޯ(;/>T/9 v-cDA|E`3fV2<,R?'(+FNH}1k8p^tĿ ֶ)gYZeaf/inst/extdata/run.sh0000755000176200001440000000304013534247654014571 0ustar liggesusers#!/bin/sh # Reproduce the examples described in # # Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Exploratory # analysis of stochastic local search algorithms in biobjective # optimization. In EMAA, pages X-Y, publisher, 2009. # # The directory containing the programs eaf, eafplot.pl and eafdiff.pl # must be in your PATH. For example, to link the programs to ~/bin # ## mkdir -p ~/bin ## ln -s eaftools/eaf/eaf ~/bin/eaf ## ln -s eaftools/eafplot/eafplot.pl ~/bin/eafplot.pl ## ln -s eaftools/eafplot/eafdiff.pl ~/bin/eafdiff.pl # # and uncomment the following line: # #PATH=$PATH:~/bin/ # # You may add the above line to your startup scripts (~/.profile, # ~/.bashrc, ~/.shrc or similar) to make its effect permanent. # error () { echo "$0: example \`$@\' FAILED!" exit 1 } verbose () { echo "==== EXAMPLE: $@" eval $@ || error $@ echo "=====================================================================" } verbose 'eafplot.pl example1_dat' verbose 'eafplot.pl --best --median --worst --percentiles=25,75 r15_dat r50_dat r200_dat' verbose 'eafdiff.pl --full --left="Algorithm 1" ALG_1_dat --right="Algorithm 2" ALG_2_dat' verbose 'eafdiff.pl --left="Algorithm 1" ALG_1_dat --right="Algorithm 2" ALG_2_dat' verbose eafplot.pl n75_dat verbose eafplot.pl p75_dat verbose 'eafdiff.pl --left="WRoTS, l=100, w=10" --right="WRoTS, l=10, w=100" wrots_l100w10_dat wrots_l10w100_dat' verbose 'eafdiff.pl --left="TPLS" --right="Restart" tpls rest' # Cleanup rm -f Rplots.ps *.R *.med *.eaf *.best *.diff *.worst att_*.p?? eaf/inst/extdata/r200_dat0000644000176200001440000011346213534247654014676 0ustar liggesusers# Report: # Metah: Weighted RoTS, version 2.1.88M (#DEBUG = 1) # bQAP (0.1.88Msvn) # Data File: /home/manu/personal/2005-JMMA/data/qapUni.50.p75.1 Size: 50 Averages: Distance=47.49 Flow1=49.90 Flow2=49.96 # Parameter settings: # number trials : 200 # time limit : 3.40282e+38 # seed : 1234567 # num weights: 100 # Taboo Search Length : 1 # Initialization time: 0.004 s # start_trial(0) : # end_trial(0) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.9121 s # Pareto: 0 Size: 7 5261548 5340738 5283204 5340630 5287522 5336320 5291202 5331366 5292270 5318304 5298876 5290408 5312952 5277832 # start_trial(1) : # end_trial(1) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 1 Size: 4 5246946 5368942 5249068 5328154 5277710 5321710 5280132 5281080 # start_trial(2) : # end_trial(2) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 2 Size: 2 5255914 5312620 5285994 5294248 # start_trial(3) : # end_trial(3) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 3 Size: 6 5254586 5341368 5265448 5336434 5266332 5329290 5278158 5328006 5293084 5304026 5316378 5285680 # start_trial(4) : # end_trial(4) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 4 Size: 5 5257008 5385896 5260020 5354180 5261932 5351978 5265120 5343482 5272604 5280450 # start_trial(5) : # end_trial(5) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 5 Size: 3 5251436 5304740 5260634 5289432 5261388 5278662 # start_trial(6) : # end_trial(6) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 6 Size: 3 5260462 5303782 5309662 5298112 5338894 5292426 # start_trial(7) : # end_trial(7) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 7 Size: 4 5238158 5302220 5266616 5301604 5277362 5291346 5328374 5283152 # start_trial(8) : # end_trial(8) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 8 Size: 5 5259568 5344514 5260078 5323590 5275688 5304758 5295860 5299490 5321894 5280216 # start_trial(9) : # end_trial(9) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 9 Size: 5 5252950 5337456 5258962 5303668 5273430 5301298 5311040 5291910 5319530 5279154 # start_trial(10) : # end_trial(10) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 10 Size: 6 5255088 5362366 5260872 5337164 5276254 5307774 5278846 5302382 5287324 5301484 5290398 5284198 # start_trial(11) : # end_trial(11) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 11 Size: 3 5257462 5328600 5262892 5302082 5306682 5293358 # start_trial(12) : # end_trial(12) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 12 Size: 5 5255536 5369466 5265974 5314044 5276688 5311924 5301892 5288482 5319394 5278344 # start_trial(13) : # end_trial(13) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 13 Size: 4 5243484 5327056 5262810 5312496 5265234 5288336 5305096 5285540 # start_trial(14) : # end_trial(14) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 14 Size: 3 5254326 5373688 5258282 5328368 5277040 5290704 # start_trial(15) : # end_trial(15) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 15 Size: 5 5251220 5334532 5258622 5318388 5274694 5318056 5275588 5299916 5307866 5281706 # start_trial(16) : # end_trial(16) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 16 Size: 4 5252238 5320246 5297660 5319870 5302690 5316084 5305034 5293474 # start_trial(17) : # end_trial(17) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 17 Size: 3 5256636 5364154 5262016 5294988 5264892 5269504 # start_trial(18) : # end_trial(18) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 18 Size: 6 5228108 5347760 5281796 5327312 5286788 5320758 5292364 5312668 5305786 5297640 5319554 5296596 # start_trial(19) : # end_trial(19) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 19 Size: 3 5258012 5349460 5262532 5294728 5311364 5285878 # start_trial(20) : # end_trial(20) : Pareto Size = 9, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 20 Size: 9 5262846 5351252 5268224 5332648 5286336 5329542 5291024 5323824 5291052 5311388 5322204 5305956 5337348 5305340 5338120 5302878 5350520 5288884 # start_trial(21) : # end_trial(21) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 21 Size: 6 5257942 5373498 5259552 5357156 5267384 5330886 5279304 5315890 5286088 5309012 5287040 5284718 # start_trial(22) : # end_trial(22) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 22 Size: 3 5253764 5351678 5265558 5309298 5290820 5295606 # start_trial(23) : # end_trial(23) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 23 Size: 3 5243858 5338614 5261776 5332340 5286980 5290820 # start_trial(24) : # end_trial(24) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 24 Size: 4 5251984 5322490 5293588 5309414 5295572 5298376 5313146 5297746 # start_trial(25) : # end_trial(25) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 25 Size: 3 5238488 5294964 5265768 5287358 5274538 5282446 # start_trial(26) : # end_trial(26) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 26 Size: 3 5240112 5318798 5285086 5296794 5297420 5288042 # start_trial(27) : # end_trial(27) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 27 Size: 3 5253562 5315656 5258408 5295302 5297444 5294720 # start_trial(28) : # end_trial(28) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 28 Size: 3 5243092 5314062 5243248 5286716 5296000 5284678 # start_trial(29) : # end_trial(29) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 29 Size: 4 5254042 5338584 5260876 5330882 5276202 5313170 5286874 5286552 # start_trial(30) : # end_trial(30) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 30 Size: 4 5249126 5334774 5263022 5312306 5281242 5309470 5284318 5282482 # start_trial(31) : # end_trial(31) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 31 Size: 6 5257878 5347536 5275036 5339680 5281738 5334044 5282030 5309294 5292442 5286754 5305288 5276742 # start_trial(32) : # end_trial(32) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 32 Size: 4 5262822 5336322 5287408 5314374 5288480 5303274 5297530 5296626 # start_trial(33) : # end_trial(33) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 33 Size: 4 5262302 5350178 5268796 5320690 5287784 5307578 5303060 5291696 # start_trial(34) : # end_trial(34) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 34 Size: 4 5255158 5363060 5265740 5316854 5280842 5287822 5295982 5271860 # start_trial(35) : # end_trial(35) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 35 Size: 4 5236920 5323144 5275658 5316252 5295276 5291846 5320036 5287242 # start_trial(36) : # end_trial(36) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 36 Size: 7 5245320 5350028 5265846 5346862 5269172 5329214 5289792 5317436 5291128 5309678 5300432 5300306 5320356 5299120 # start_trial(37) : # end_trial(37) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 37 Size: 6 5256692 5369864 5258244 5351398 5260990 5318888 5276810 5304172 5307654 5301888 5349612 5294114 # start_trial(38) : # end_trial(38) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 38 Size: 4 5245000 5402680 5261294 5355072 5280504 5342928 5281916 5279952 # start_trial(39) : # end_trial(39) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 39 Size: 1 5256756 5291420 # start_trial(40) : # end_trial(40) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 40 Size: 3 5240372 5339244 5269234 5300968 5292588 5291350 # start_trial(41) : # end_trial(41) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 41 Size: 3 5238810 5321212 5254626 5315172 5260078 5296038 # start_trial(42) : # end_trial(42) : Pareto Size = 8, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 42 Size: 8 5262120 5384314 5262892 5343884 5264312 5331836 5279288 5323156 5287766 5316696 5288662 5313878 5299640 5305808 5304502 5281312 # start_trial(43) : # end_trial(43) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 43 Size: 6 5251856 5339406 5260988 5322928 5285486 5322566 5290320 5308872 5302434 5302166 5318698 5289714 # start_trial(44) : # end_trial(44) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 44 Size: 4 5235812 5381636 5236334 5354730 5270128 5301072 5305764 5283634 # start_trial(45) : # end_trial(45) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 45 Size: 2 5230660 5301340 5293106 5289332 # start_trial(46) : # end_trial(46) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 46 Size: 4 5228398 5320810 5238488 5307248 5282654 5305988 5299924 5287560 # start_trial(47) : # end_trial(47) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 47 Size: 2 5260116 5305420 5269468 5286560 # start_trial(48) : # end_trial(48) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 48 Size: 5 5249848 5325302 5296612 5310710 5309120 5306430 5317752 5305550 5342704 5304442 # start_trial(49) : # end_trial(49) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 49 Size: 4 5261944 5309926 5288296 5307688 5312776 5304054 5327484 5298724 # start_trial(50) : # end_trial(50) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 50 Size: 5 5253764 5347418 5257354 5335486 5259120 5308196 5319244 5299520 5342200 5282958 # start_trial(51) : # end_trial(51) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 51 Size: 4 5261206 5322822 5288592 5320284 5316748 5302208 5335480 5286420 # start_trial(52) : # end_trial(52) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 52 Size: 6 5247862 5344898 5267480 5338488 5279426 5311808 5286042 5310946 5297888 5298750 5304450 5295776 # start_trial(53) : # end_trial(53) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 53 Size: 4 5242284 5315430 5299172 5300900 5342822 5296088 5358172 5295926 # start_trial(54) : # end_trial(54) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 54 Size: 6 5235754 5344592 5258078 5328266 5264712 5304666 5280648 5300618 5285308 5276622 5310290 5276322 # start_trial(55) : # end_trial(55) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 55 Size: 2 5242082 5306670 5328674 5299828 # start_trial(56) : # end_trial(56) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.9081 s # Pareto: 56 Size: 1 5256734 5284984 # start_trial(57) : # end_trial(57) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 57 Size: 7 5242010 5369404 5248032 5330344 5286322 5316662 5289386 5307442 5326316 5306350 5328532 5295078 5341172 5287608 # start_trial(58) : # end_trial(58) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.9401 s # Pareto: 58 Size: 6 5260496 5391364 5262604 5351568 5263442 5324760 5277952 5316794 5292546 5307408 5304486 5289422 # start_trial(59) : # end_trial(59) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 59 Size: 6 5259588 5363620 5260464 5334398 5271884 5333010 5276300 5315924 5299660 5308920 5326834 5306774 # start_trial(60) : # end_trial(60) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.9281 s # Pareto: 60 Size: 1 5234320 5262976 # start_trial(61) : # end_trial(61) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 61 Size: 3 5254722 5330798 5258722 5312162 5306164 5277030 # start_trial(62) : # end_trial(62) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 62 Size: 6 5252284 5385672 5270528 5327488 5281022 5314692 5296408 5305058 5318856 5301588 5330258 5288516 # start_trial(63) : # end_trial(63) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 63 Size: 4 5252048 5332752 5259582 5296404 5290924 5292414 5296594 5282124 # start_trial(64) : # end_trial(64) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 64 Size: 4 5254176 5344870 5264204 5335046 5268688 5308428 5275096 5304396 # start_trial(65) : # end_trial(65) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.9081 s # Pareto: 65 Size: 6 5253734 5350752 5266398 5327920 5274224 5324300 5281920 5313874 5313554 5307624 5316664 5301172 # start_trial(66) : # end_trial(66) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 66 Size: 5 5266576 5355532 5269280 5344320 5276966 5342668 5278770 5314612 5315252 5296102 # start_trial(67) : # end_trial(67) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 67 Size: 6 5269788 5328620 5273672 5324206 5287004 5315594 5302912 5314092 5308178 5283444 5347098 5281286 # start_trial(68) : # end_trial(68) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8961 s # Pareto: 68 Size: 2 5250266 5283778 5291518 5274832 # start_trial(69) : # end_trial(69) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.9521 s # Pareto: 69 Size: 6 5263826 5354972 5273308 5346828 5274692 5341542 5280736 5323828 5282256 5319488 5286150 5286728 # start_trial(70) : # end_trial(70) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.9401 s # Pareto: 70 Size: 2 5256726 5303656 5291596 5289432 # start_trial(71) : # end_trial(71) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9401 s # Pareto: 71 Size: 4 5258136 5343598 5269662 5334022 5289226 5315086 5292162 5293562 # start_trial(72) : # end_trial(72) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 72 Size: 1 5248776 5290344 # start_trial(73) : # end_trial(73) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 73 Size: 5 5218454 5334926 5260938 5322806 5291370 5297718 5304592 5287938 5314982 5285268 # start_trial(74) : # end_trial(74) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9081 s # Pareto: 74 Size: 4 5258702 5360220 5263454 5334720 5275412 5330956 5291384 5277334 # start_trial(75) : # end_trial(75) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 75 Size: 1 5245122 5270788 # start_trial(76) : # end_trial(76) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 76 Size: 3 5258602 5325318 5290268 5311812 5314862 5296934 # start_trial(77) : # end_trial(77) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 77 Size: 2 5241944 5296114 5282260 5280460 # start_trial(78) : # end_trial(78) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 78 Size: 4 5250786 5332162 5280702 5314016 5290956 5292046 5293478 5285544 # start_trial(79) : # end_trial(79) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8881 s # Pareto: 79 Size: 1 5244758 5281034 # start_trial(80) : # end_trial(80) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 80 Size: 6 5244094 5358484 5252686 5336058 5261452 5327250 5281694 5319124 5283896 5307338 5304106 5265076 # start_trial(81) : # end_trial(81) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 81 Size: 7 5263662 5380452 5269740 5337070 5285200 5324712 5289394 5324456 5292320 5297070 5320574 5292384 5350206 5284230 # start_trial(82) : # end_trial(82) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 82 Size: 7 5254466 5343314 5273292 5327148 5273646 5321210 5281792 5318952 5297958 5308136 5305154 5302466 5313004 5296520 # start_trial(83) : # end_trial(83) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 83 Size: 3 5274740 5318122 5278544 5301430 5362482 5295038 # start_trial(84) : # end_trial(84) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.9081 s # Pareto: 84 Size: 2 5249768 5339684 5258262 5293812 # start_trial(85) : # end_trial(85) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 85 Size: 2 5256640 5315028 5306908 5297420 # start_trial(86) : # end_trial(86) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 86 Size: 4 5245982 5344194 5258992 5333040 5287224 5324826 5288672 5284450 # start_trial(87) : # end_trial(87) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 87 Size: 7 5255464 5371998 5261372 5346970 5263790 5322536 5286590 5321710 5289168 5317450 5297930 5309896 5307946 5278906 # start_trial(88) : # end_trial(88) : Pareto Size = 10, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 88 Size: 10 5262622 5400986 5265912 5382320 5270982 5378326 5278382 5371032 5281176 5350530 5285532 5339452 5292918 5326392 5294868 5309878 5327076 5306252 5332918 5296722 # start_trial(89) : # end_trial(89) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 89 Size: 6 5249178 5355160 5258192 5321030 5264166 5315014 5284102 5310674 5292936 5307192 5304938 5274502 # start_trial(90) : # end_trial(90) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 90 Size: 5 5251208 5351068 5257866 5344442 5266680 5319614 5273044 5309560 5331924 5291808 # start_trial(91) : # end_trial(91) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 91 Size: 6 5235292 5347606 5262632 5312126 5275892 5306426 5298398 5301830 5325094 5297634 5334632 5281888 # start_trial(92) : # end_trial(92) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 92 Size: 4 5250116 5352672 5258824 5343600 5279978 5309544 5295378 5301240 # start_trial(93) : # end_trial(93) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 93 Size: 4 5246462 5310508 5291544 5302102 5319288 5299960 5325884 5285786 # start_trial(94) : # end_trial(94) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 94 Size: 3 5252000 5302482 5293538 5300674 5303910 5288250 # start_trial(95) : # end_trial(95) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8881 s # Pareto: 95 Size: 2 5245366 5308014 5256896 5298362 # start_trial(96) : # end_trial(96) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 96 Size: 2 5256672 5307198 5260802 5304284 # start_trial(97) : # end_trial(97) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 97 Size: 3 5259914 5376072 5261922 5352874 5266982 5285696 # start_trial(98) : # end_trial(98) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 98 Size: 3 5260882 5348806 5263884 5318024 5270396 5286306 # start_trial(99) : # end_trial(99) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 99 Size: 2 5250308 5316120 5252958 5293300 # start_trial(100) : # end_trial(100) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 100 Size: 4 5250390 5329390 5261540 5328954 5289164 5328796 5290310 5275050 # start_trial(101) : # end_trial(101) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 101 Size: 5 5253072 5361462 5254608 5337038 5270882 5335940 5275714 5298076 5300910 5293890 # start_trial(102) : # end_trial(102) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 102 Size: 5 5243478 5344086 5267936 5341394 5279958 5332910 5280782 5314720 5285232 5275010 # start_trial(103) : # end_trial(103) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 103 Size: 3 5235504 5320670 5263384 5310056 5302036 5304832 # start_trial(104) : # end_trial(104) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 104 Size: 3 5227330 5330544 5240298 5280132 5308070 5275390 # start_trial(105) : # end_trial(105) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 105 Size: 1 5248426 5277914 # start_trial(106) : # end_trial(106) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 106 Size: 2 5255756 5317174 5274796 5273690 # start_trial(107) : # end_trial(107) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 107 Size: 5 5244958 5357934 5261804 5337972 5265596 5314642 5295872 5301766 5302656 5296712 # start_trial(108) : # end_trial(108) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9201 s # Pareto: 108 Size: 4 5265300 5396848 5278934 5355400 5286066 5343848 5288282 5277112 # start_trial(109) : # end_trial(109) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.9241 s # Pareto: 109 Size: 3 5248312 5313382 5278584 5288376 5350914 5273140 # start_trial(110) : # end_trial(110) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.9201 s # Pareto: 110 Size: 5 5260570 5366182 5261138 5327354 5265384 5319300 5276072 5315454 5320900 5292374 # start_trial(111) : # end_trial(111) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.9241 s # Pareto: 111 Size: 6 5259020 5371016 5262886 5316222 5266652 5314362 5268656 5314344 5287836 5305634 5340968 5303026 # start_trial(112) : # end_trial(112) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9201 s # Pareto: 112 Size: 4 5246474 5346104 5263294 5310064 5270142 5303812 5272096 5300444 # start_trial(113) : # end_trial(113) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9201 s # Pareto: 113 Size: 4 5263220 5378332 5263998 5327640 5267114 5307732 5330296 5307354 # start_trial(114) : # end_trial(114) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 114 Size: 4 5262548 5402950 5270176 5345758 5275424 5318398 5276992 5236250 # start_trial(115) : # end_trial(115) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 115 Size: 6 5233790 5319090 5264518 5319008 5264536 5318920 5276542 5316952 5288210 5298584 5304666 5292444 # start_trial(116) : # end_trial(116) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 116 Size: 4 5254910 5338252 5260136 5318360 5290766 5300026 5334682 5290058 # start_trial(117) : # end_trial(117) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 117 Size: 3 5249998 5357374 5267810 5305306 5297790 5288126 # start_trial(118) : # end_trial(118) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 118 Size: 4 5246196 5351106 5255360 5314966 5265678 5297074 5295686 5284642 # start_trial(119) : # end_trial(119) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 119 Size: 3 5262708 5311982 5269482 5307826 5305344 5288686 # start_trial(120) : # end_trial(120) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 120 Size: 5 5271874 5369380 5277576 5340570 5280818 5291898 5282712 5289454 5300780 5280476 # start_trial(121) : # end_trial(121) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 121 Size: 4 5248424 5335144 5249960 5331024 5256802 5285296 5298484 5283738 # start_trial(122) : # end_trial(122) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 122 Size: 6 5256520 5336596 5260378 5322566 5273802 5311874 5288902 5307538 5311962 5293074 5323786 5288510 # start_trial(123) : # end_trial(123) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 123 Size: 4 5258636 5364368 5259878 5327640 5268400 5303050 5307924 5295254 # start_trial(124) : # end_trial(124) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 124 Size: 4 5237430 5357268 5265556 5342644 5286146 5304570 5325270 5280718 # start_trial(125) : # end_trial(125) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 125 Size: 2 5262556 5301992 5304798 5287750 # start_trial(126) : # end_trial(126) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 126 Size: 5 5244792 5329616 5302508 5327468 5305302 5316252 5320352 5313348 5339836 5298872 # start_trial(127) : # end_trial(127) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 127 Size: 2 5259772 5308780 5278412 5280542 # start_trial(128) : # end_trial(128) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 128 Size: 3 5258142 5333230 5284148 5329706 5305316 5292932 # start_trial(129) : # end_trial(129) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 129 Size: 2 5251582 5295028 5325122 5292932 # start_trial(130) : # end_trial(130) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 130 Size: 7 5253764 5377948 5261100 5376560 5262886 5348078 5268516 5331016 5284602 5308580 5304954 5307342 5350956 5306594 # start_trial(131) : # end_trial(131) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 131 Size: 3 5247364 5341168 5255072 5309098 5257812 5293934 # start_trial(132) : # end_trial(132) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 132 Size: 1 5248088 5300746 # start_trial(133) : # end_trial(133) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 133 Size: 5 5243774 5339600 5260430 5331044 5261064 5317618 5284230 5294324 5309232 5282052 # start_trial(134) : # end_trial(134) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 134 Size: 7 5210172 5342470 5268604 5332856 5272310 5329524 5287224 5313622 5297324 5306942 5297552 5295804 5319088 5290708 # start_trial(135) : # end_trial(135) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 135 Size: 4 5237578 5320140 5267828 5311316 5293642 5289788 5315048 5287112 # start_trial(136) : # end_trial(136) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 136 Size: 4 5256000 5378382 5265996 5347036 5272834 5320852 5296750 5294544 # start_trial(137) : # end_trial(137) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 137 Size: 7 5248054 5337248 5271552 5336002 5276270 5319376 5282786 5318792 5289352 5307728 5299360 5294498 5335696 5287664 # start_trial(138) : # end_trial(138) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 138 Size: 4 5249970 5351738 5262156 5329990 5273030 5300160 5284834 5268814 # start_trial(139) : # end_trial(139) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 139 Size: 4 5260472 5322856 5267366 5309662 5294148 5305270 5356184 5300892 # start_trial(140) : # end_trial(140) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 140 Size: 4 5247614 5319096 5255140 5297600 5292146 5295294 5292856 5274260 # start_trial(141) : # end_trial(141) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 141 Size: 4 5241520 5324764 5269646 5323274 5271470 5303358 5280230 5283868 # start_trial(142) : # end_trial(142) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 142 Size: 3 5251808 5307900 5319016 5306842 5325528 5302748 # start_trial(143) : # end_trial(143) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 143 Size: 4 5232352 5331690 5273332 5316496 5279668 5305118 5331000 5299232 # start_trial(144) : # end_trial(144) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 144 Size: 6 5256082 5351070 5270108 5341410 5271946 5331824 5289960 5321778 5298824 5298102 5316372 5297098 # start_trial(145) : # end_trial(145) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 145 Size: 7 5240608 5349646 5256128 5346218 5261404 5345828 5270440 5328984 5275350 5303866 5279460 5299088 5312672 5290524 # start_trial(146) : # end_trial(146) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 146 Size: 5 5229068 5331358 5247820 5319718 5279928 5314066 5293434 5301422 5293870 5284408 # start_trial(147) : # end_trial(147) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 147 Size: 4 5265888 5381896 5268672 5311472 5302546 5299700 5336824 5287200 # start_trial(148) : # end_trial(148) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 148 Size: 5 5246992 5371468 5266244 5308672 5276688 5302090 5315516 5294950 5319938 5284618 # start_trial(149) : # end_trial(149) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 149 Size: 4 5241468 5358336 5244606 5340366 5267342 5297432 5332938 5276904 # start_trial(150) : # end_trial(150) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 150 Size: 7 5244244 5376114 5250468 5354044 5278652 5340352 5281488 5333600 5284324 5310560 5331200 5296610 5333906 5293128 # start_trial(151) : # end_trial(151) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 151 Size: 7 5255280 5352872 5268406 5343326 5289330 5342400 5292076 5336504 5292286 5312784 5301596 5307448 5391774 5307228 # start_trial(152) : # end_trial(152) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 152 Size: 3 5255694 5351886 5271362 5307726 5283454 5285084 # start_trial(153) : # end_trial(153) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 153 Size: 3 5253714 5313704 5263676 5299808 5275022 5284336 # start_trial(154) : # end_trial(154) : Pareto Size = 8, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 154 Size: 8 5241616 5362236 5255426 5346276 5262784 5332708 5269108 5325460 5277288 5323876 5277498 5307024 5310020 5301512 5352002 5293254 # start_trial(155) : # end_trial(155) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 155 Size: 6 5252906 5366638 5257382 5334862 5258428 5308712 5303022 5298936 5327690 5289806 5339530 5283106 # start_trial(156) : # end_trial(156) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 156 Size: 6 5214054 5387936 5244092 5333448 5290884 5324472 5299138 5315958 5301466 5313770 5315072 5295644 # start_trial(157) : # end_trial(157) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 157 Size: 5 5251526 5385648 5266708 5365138 5267846 5303184 5293826 5297860 5319616 5295318 # start_trial(158) : # end_trial(158) : Pareto Size = 8, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 158 Size: 8 5246382 5364572 5255166 5321574 5287178 5321104 5288952 5315294 5289520 5313774 5289734 5312258 5295552 5298740 5320318 5292216 # start_trial(159) : # end_trial(159) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 159 Size: 7 5255790 5350878 5270496 5328194 5273050 5323448 5283064 5322406 5299868 5311574 5311458 5296820 5369294 5296484 # start_trial(160) : # end_trial(160) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 160 Size: 4 5263060 5345028 5263346 5329268 5263630 5309538 5270548 5274536 # start_trial(161) : # end_trial(161) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 161 Size: 4 5249782 5343552 5278364 5331734 5293258 5321236 5314122 5294300 # start_trial(162) : # end_trial(162) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8841 s # Pareto: 162 Size: 4 5248654 5311618 5273862 5309422 5282368 5301892 5323902 5294724 # start_trial(163) : # end_trial(163) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8961 s # Pareto: 163 Size: 4 5242876 5337732 5272238 5304110 5296404 5302756 5302736 5300562 # start_trial(164) : # end_trial(164) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.9201 s # Pareto: 164 Size: 2 5257106 5322472 5257872 5291056 # start_trial(165) : # end_trial(165) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.9281 s # Pareto: 165 Size: 3 5246412 5301200 5257102 5296406 5282938 5281232 # start_trial(166) : # end_trial(166) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.9041 s # Pareto: 166 Size: 1 5261344 5278434 # start_trial(167) : # end_trial(167) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 167 Size: 2 5207768 5285096 5251774 5262174 # start_trial(168) : # end_trial(168) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 168 Size: 5 5252476 5341930 5259994 5339162 5261246 5300000 5287272 5296960 5295622 5294608 # start_trial(169) : # end_trial(169) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 169 Size: 6 5226264 5328500 5277464 5326176 5283500 5325496 5292540 5307144 5297542 5293280 5302886 5289706 # start_trial(170) : # end_trial(170) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.9001 s # Pareto: 170 Size: 6 5258608 5349086 5262004 5348740 5271162 5328506 5278050 5304684 5298656 5286344 5351610 5279252 # start_trial(171) : # end_trial(171) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.9081 s # Pareto: 171 Size: 4 5255400 5336540 5255508 5317544 5266526 5311184 5295340 5285696 # start_trial(172) : # end_trial(172) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8961 s # Pareto: 172 Size: 2 5250304 5297874 5283074 5265846 # start_trial(173) : # end_trial(173) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8881 s # Pareto: 173 Size: 4 5210334 5328068 5269816 5306036 5311530 5305230 5364628 5302930 # start_trial(174) : # end_trial(174) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 174 Size: 3 5240600 5302258 5303732 5299116 5315600 5295118 # start_trial(175) : # end_trial(175) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 175 Size: 2 5245444 5328246 5278910 5297264 # start_trial(176) : # end_trial(176) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 176 Size: 3 5262744 5333626 5286060 5321404 5303996 5286016 # start_trial(177) : # end_trial(177) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8881 s # Pareto: 177 Size: 4 5266860 5381622 5268472 5326842 5272178 5318748 5272624 5286186 # start_trial(178) : # end_trial(178) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8641 s # Pareto: 178 Size: 3 5252908 5329620 5266834 5322330 5271910 5286698 # start_trial(179) : # end_trial(179) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 179 Size: 3 5262210 5341652 5286860 5325636 5290370 5281614 # start_trial(180) : # end_trial(180) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8761 s # Pareto: 180 Size: 3 5266766 5332104 5274192 5325700 5290394 5286536 # start_trial(181) : # end_trial(181) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 181 Size: 2 5223996 5264934 5276944 5259324 # start_trial(182) : # end_trial(182) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 182 Size: 6 5254596 5376180 5269014 5329152 5274636 5306446 5297442 5301974 5299942 5300198 5311514 5299176 # start_trial(183) : # end_trial(183) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 183 Size: 6 5261394 5354636 5265378 5346184 5268934 5338140 5273124 5334504 5273154 5318460 5285648 5287704 # start_trial(184) : # end_trial(184) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 184 Size: 2 5244120 5337354 5256384 5285550 # start_trial(185) : # end_trial(185) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 185 Size: 2 5262862 5302662 5277674 5291722 # start_trial(186) : # end_trial(186) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 186 Size: 4 5255174 5330402 5276800 5312808 5293146 5279082 5346592 5266638 # start_trial(187) : # end_trial(187) : Pareto Size = 7, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 187 Size: 7 5246804 5400388 5250178 5352570 5266038 5328910 5280858 5320198 5290784 5316988 5309158 5298146 5354416 5291594 # start_trial(188) : # end_trial(188) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 188 Size: 2 5259684 5349314 5262814 5286348 # start_trial(189) : # end_trial(189) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 189 Size: 5 5247922 5341922 5267178 5329290 5271752 5318494 5291980 5306488 5322930 5301076 # start_trial(190) : # end_trial(190) : Pareto Size = 1, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 190 Size: 1 5234970 5275712 # start_trial(191) : # end_trial(191) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 191 Size: 6 5254424 5378850 5255612 5369634 5260926 5349398 5267362 5338284 5273240 5303014 5280820 5289176 # start_trial(192) : # end_trial(192) : Pareto Size = 4, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 192 Size: 4 5241760 5327686 5274282 5324544 5275572 5308086 5275822 5287264 # start_trial(193) : # end_trial(193) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 193 Size: 3 5255512 5333632 5267168 5322190 5282082 5279046 # start_trial(194) : # end_trial(194) : Pareto Size = 6, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 194 Size: 6 5244070 5360390 5244866 5318190 5268138 5317572 5289852 5314910 5321016 5314668 5325172 5302966 # start_trial(195) : # end_trial(195) : Pareto Size = 2, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 195 Size: 2 5223050 5316882 5339314 5304744 # start_trial(196) : # end_trial(196) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 196 Size: 5 5247650 5360362 5254704 5324760 5263442 5309510 5312364 5303634 5316266 5295334 # start_trial(197) : # end_trial(197) : Pareto Size = 5, Scalarizations = 100, Elapsed time = 0.8681 s # Pareto: 197 Size: 5 5264462 5341904 5267506 5312252 5268108 5297324 5294678 5290524 5304892 5288808 # start_trial(198) : # end_trial(198) : Pareto Size = 3, Scalarizations = 100, Elapsed time = 0.8721 s # Pareto: 198 Size: 3 5263722 5332598 5290170 5327584 5295962 5289366 # start_trial(199) : # end_trial(199) : Pareto Size = 9, Scalarizations = 100, Elapsed time = 0.8801 s # Pareto: 199 Size: 9 5239548 5364766 5253792 5355244 5265338 5344000 5272150 5343382 5276076 5325734 5283462 5321062 5285448 5299064 5290246 5297754 5325178 5288796 # Average Number Scalarizations = 100, Average Trial Time = 0.8809 s eaf/inst/extdata/p75_dat0000644000176200001440000000171213534247654014620 0ustar liggesusers5135812 5243284 5140074 5229348 5144684 5222706 5145894 5216534 5173608 5214510 5176788 5208510 5195842 5196702 5207490 5192790 5208892 5190844 5218064 5188896 5147518 5265236 5149316 5218898 5171074 5217750 5174754 5211460 5179308 5201654 5199856 5197832 5208262 5186322 5127934 5234548 5161846 5234456 5162030 5215038 5171866 5191222 5186730 5181428 5125664 5184942 5154394 5208210 5177510 5198250 5183752 5194550 5197658 5189582 5201380 5183990 5222100 5181752 5132068 5216458 5152244 5209084 5163024 5205342 5186208 5203138 5205994 5197212 5215552 5193370 5220304 5176884 5145886 5214274 5158668 5207026 5186406 5191022 5197744 5179936 5147460 5265768 5150028 5225772 5156512 5219102 5164804 5216732 5165238 5213334 5166634 5206474 5180040 5192158 5199806 5191918 5218488 5186842 5142982 5284726 5152140 5213308 5166352 5183080 5178724 5180070 5139080 5273722 5151008 5256874 5151474 5227392 5165650 5216376 5172008 5201778 5193266 5188896 5206156 5170988 eaf/inst/extdata/ALG_2_dat.xz0000644000176200001440000175131014127067160015467 0ustar liggesusers7zXZִF!t/ ]C:YN| ;ݨBCwڮwc_.Y,\E[{f8'-æ%_%AE1r>uim2h \Rcg5YF Ϡn7uRe_k(F廩 {%y( vۈ]Г /#_$\1jxZO믳4Śijlʓ[K} WδBƻ˨!E0?+@rWܪ,mE(}(eNjkmfK 1)(;xf䭷t7ܫ.oZ(Ь3rnDSLPi'rt ʜ01lF b%f0/3,d9(%0%M|Ŧ mG d~:X/GX2lʉ1Ӟ$mц;GIƆ p @ p1rRSMס> y1V Y՘zgVcr#[b0>Aŗ%K41fhm '75#EipC̞xv f^_| =4v x$Y_X?e++喭N<%ϥ7[kMKɈ}ܥE-p΃^vgsρ|@lĎ01p/7T1T9(\gV$FGM,z&'RMF5.?ʩ3.9u6Nք'v,5jZ)ֵP#L(z8>\-|ϞgۀϓS]9N 1x^j)>h4OnQj7'OJdX,6I*yM7v3*0Sޢ3C0ϔ5U ) sBf7a?+4X~υS7u2S#}nEޏsϊ2[$@T;*S S]\ajJƏ}8HQqA,Gӑ+zZv`e04OB%~l/U^&ZTLdV9E -mk34L3Ai7*?@fj:~Nӣ"*a($-q#SM)Ej]@l8 'd1[yl8 e\=QÓK#=Tr,ʴoA,SEKw e >oV00\QNJBc*ax:(#J[Wk̄>!Q1٢8RyUzoQj1\*!+R0cI-QP洄 2gQ² gs÷!VmK2l|[…碥X Bo)UJQ߷3p}ɴM5rm6ci|=)sW7 oɡj*J$l ,Z}Q$R8BŒ=q@[BUُ%rb.{J>L p{"C2Pgβۿ4&KYwNɖ'هh&ҹ:ƐPP握*~ #}!#z("DJDpNWr9qґQ2Fc#ڤZubc~k|v0hv]c-n̝}]v3W}I0 q)(+ e C/y8GO<--[S[u#+.&IDj>KW8; _.6oY4%64&o֮aPC"-Ѵ5S(^!iHLG(4H*鴳FkM9: =Ւj+¼@7 A{ S2ZMw\R sn)Br?jߊԕy5k;@;uELE([w8[ i-\%/Mďj}hm71Y|w=UTyY$[ !yfV(#= hܙbn8y' EDH$qL{$F#>4 _?xDeK=w,jg0JS#r:jt]a~ej. 0PB"+})Sx2قܦ8@\8OxꀫN`*꿯ɼ>EhpHaf*2ՠ`EqjǺS}u! 2C@{dv>sKצ [nN;w^*HjxRz<`@q "Yjvq& fuY1~*om8*},25r]m.*ي,zč}gL3^0G*KJrs.\GC*35{aHSAnc{A{FZ. q:*ʃ˃UֽuS$7}fq͇]T.viB@)+ ;; JN&M;dk್!G΁`8O܊{ve@$N- h뗇݆/usLfc-/#oq7t/,1K#tdZ&sp5kW+ZL[ &_?_ي;e&,w3fwLrQ#p)Og=bzėv@+Ïs-.I;`]ye7]} 8‚rm;uj9)C0|inc}h6e/:4'3>ӂ# .e~?t^>WJe'U@&]:kJ4~ ȦCµvPӈ$I1\tg[(]0 nymS +3PQ1%= :ӻ5 8N@U{*'"뙎(ު2p!άF+80'1;UV\(}Fz@;!Gȶ}kR̯l4zTM D`z f33zY#%x NNƭqr%14D%>-;%i6њh0aq4qk&ڤX$33]ZLeHŝ&K@3_į|לkȄ)Xa[w']6|q a*slG_GܛR1csPyo:4/{~]R:-:$vMgt)>ÙWc) ˏ‚RF pð&CypJWm>VG-lORD`f0 Mn4CFysk|(;Q;% xsp*g7]#&jquZjG^1 ղ"A <(cv IGH~%Cի0c=nbT m|1]V tb~uBQzo_v8ZO&'ܴqnwVFDxj.0fMlW3=u't-4upPU^7EaMW/v'2)|VJ: r(KޛMWx?9&&/ԂO>=T]&-"8e5DĦ@nAdm:p g3{S#iAPt$^6qB:F4+S>_ L4y!0drҠVƮ90mw8D'B(\|jE<_O BzϢ~E A0W׸w[^޾b &2P$FBWHa4{c=9ieg,1!q8/({/IraT}K W:l$%LB_թIwk,D~ړ}*>m)64qSŤ|iW[?j׫WLM|ug 0YBa$. t U*+ٹHQX!f74xэ!I)Vq'g(k']v>=in<cVK^۩2X ,O᯽A|Cgt5ϳ&)Q@X DFj=MkѰ,J@W@Of$`ʿgWC$ 'L Z~dɱ\ap[Cv_!s7lS:A<Ew?! axx VטSU| q(aѩ >ELCJlr<%C1:N+.vt/(E7eИ>E;; fe߁Kt/],8h^8՗sE٦ ǻakfVp*2*(dq`#rǰ'>:E._6)e^l & m*1Ḥ:a'A,8dGcE.e@[mx;NZ .T _8ڨ:(FЀG{&w=O@= ,LpN3]- ˆ\Tӧ:~i^{lر)^־*99Zn87i pIr+1#ÿ"i"~5BNy7FLI Gٹ7}ͳurrKYV^K).%_{* Sm)2n.\m/' #`)Ly}Wjl%X=YI T& 0V蚐ٵ-!M0A 2Tq G|雋j`'̶M'B˖*S)p΂ԁ!1R5~FVt\J<_<|;U1S3{QFzdN Ō|F08 qQ~*W]\ւtcv3Hہ W} /x.'R`vNM@IASLj )uuHx{39n>Nlh4y[,Gp^V^S5xb0ΪV- ].pOXSI, }gW9|cz GMW8Ks(f1hzp STno^ƹH`v8f/YaJ9t}Rt!?D/!5d8I_ϤXL*øh75W 0 ևk:b Ou@r-{ϺU<_iYc[C1]x:{MNDu ?bD;|QZZ6&sP:L/hx/Fֶt(Rx:3J m;7>):Q Iq y |ձڳ߀'Vzg2Y¶weHcwqvF#H.޷s^':P~Z2y-Rޤ #EAs-߫ۺm}^3؋%QQת-ߡ+R!e]9s}m_@%邼i~[aIB1Ue4*nBJ=͐}fn^Vry/0q%=qYNuEw\/{{ d8o?&0,;!"?>i8 S`v )IW"O\xX_߿(9ON)FcTEfv 1oZϢlLB,Apt=d~8'tq A}v[^DtW9!YoOAiPEKǹl[3aSrCrx/ 0Y>~= * igک׌lZA @&lٴ07&J-vj;:ɸU9plYO?Wq*WMh'ٚd[ +tړ$|ʛxX_B,:iߜض YauY aI[/%3@s`Ov+!POZQXyoφ:Ig! |Dro0 HϺ*tRM#Q,[\DXX Α#e߱hہ85) 0הDш~_մG"`.'?R>HҒ6UQ * _ ^ّHJ%X:ʡ`EF-E+$Ksgd^"&;Hl$^WB-$_]& A2r9dRkxԑ+$Π'bUygw蟘F- mh##Lmq\{| 1H }›d`2e8IF)+:Ξƻ-CGK`G5;+-* x6 &ԩ9tdߡc+uPcom6 w{ !,0qLvC@A.X)ЦOal'6{-2;VծV<`҃d?O9Bq/>h&(hEE~{#~bەMִoJCHU{p1$>Íhd< 5kΏ PaZ͗Rv%H;Qw[טsq]\%[EAold} xHf6X.Y/ښmnMvo*mTS(mp+X~ei?Zam1ok/)1!Kc *m=[!б1KZEk\LBgI(! V3!k45LUvw)ДG\}Yо (C.,L`LLK< 5^O^e4{a9lZTq+;jMFsi: eU+H Ys AU7gCVYLՈOi iELȺOt9]Ng34EQ5VX7 &Ӡ#TuLڨޑa}G5XpN%U4 fw/$- >u1œ ]Ri=GOS4jqrOAֶ]][`-_rjTa|Is7#`'ӣnP4@oZ@PH_}E f\!;չ8JҮ^#[5.{%E4A,R:zM0Ez.%+E_dNh]JV Tbs{`ߛTHn2# EvވBU>Ҡ8O z_6sUq8AA_OwDGxGP3ѽ1Ke#8Q|s},)6@uN;c{_LQS L\(I٪f4|c֬}ϻ4o9{ }ku;Yá>PfAo' :I!OpPe Fvk8$Mᢗڢm,!ࣜ _J?.Ȓ[E?a`{r({Ujfζ߷΂Lzޚ.L m?Z^ޠ_vrVƚ{xz9^S iN`tN09>mW ,seMC׳m)IPm\ܚ bK1^*@Q*;r_h4nqЪM =k>zY^Uh!xDB+Є:^0 8k (38^U| Q 沼?!Q_X&ΕYp'M|+ ƚ "v]r' 5x PXO 5@\"~AyEgx nmRh mbm 7ͻpDpXLoOMY:2~M6#< ]"͡Rd_/1a[XFn灌+-uAKe>w5b8*Q7mLfB 1vo=J&6`/럙 C LxFFi03 \$hq&^;!`<+~q27Aaqz?w;(X8)$Ue|q1߳ʙ#m OU"}NXBt_KqƹG鮈ݍBY|){QEtl21Q@ٳcmD=;#cnXS 4FK(n`-uё3b0/X'v2.㜜҄?u֓ ^VwcxЧ8HE.ՙMt :Ta{eV?k1x3E}YNi#JufvX\Sxd7i@y)k T7*U26+Yޞ c#ӖOx=a3kzb_@'>$1ŅC*3jTG6s4KJ|-98Dk1uϼFSaLŅI8+ >|L}hU7S\qCEoQj\ YGs}G_@}Dsv!=Oc^8--J͈V $İw'+Gy?)zry;Py|)jӈ3t )e>)+U%G3ly<[ K;K%~|-Q\@TnkQq|)%ץbA [E>l$#/lŠwa;Nh3w, ٢]h@gw *T磣J{O,!&f@4>fIzAZg/Bi ~q»eU=3 *V( REtFppY٪U5F=3"з辁u`m?i0>Hrjߩǩ9ryY8\+@ljFL % &s 1V{G\ $;zlTm.|\)xD,V],h̰t,8S)$PMyR@'z$,7 T܈_h;<zф9&bV'i{7άK|,蝝>|GK?Iх,wu S"3:5u l@9yݿ~2fhsraӪ%)t>4=XcȤZj[nM[_⋫pԄusO 1(WUr~%).wqajYJ}U8o3B\?ڂ()ɵN^a, _"E-@ooH0oI8u^!@ / } Pc>W20*C1[3e͝>f4覉+,ۗJ|ѳ "zl&w?%۫8Y%8@H?6^J<5 JښpWLޗ-Lqs+5)pYtQxBb1-%jx(r$yؖ_aԯ:Eq*E)SύsH40(xm-*`(+@]2lAW>z7'HL{W&RУ)[Sd ˃q-;W IW! ]S# _8uwboPJ>Y$~%^6-|LQ'h_WeVOJL3<1jtݭ=9|xPb|lCF"պǼԴڳ#=NOU~.uyŸV`CqXMgu4 PT!E8GD1%=jVQ4 b+uUj ̨ uPȚ_ױQ?0 dfyȪy-CmWDSd2qiOIjk\]! t۟2Q'Ïq)7/jQk:$|^R=zl-=A>3ϧm q늫)5y0_8\ͤwq/EAl\WMH˥όU<%A},G8A!ed8a^0ra^Ȓ Ϙ{}ZX;Di_Qԃ1zj[GKɑ ̓wE9ho{a_znQk4v#lba~Pb[g*u~uܺ5S/9cW3?yGJoޏ-YGr8m=ӌ9wyě1=Wa ]މ󤰅_JkNaAyLj"W; Wk2YMuB]=(GgnahkG{Zh& Y7K `v~_y˵n D,s[V{||mPbn?B?rQ~/Pm>xX`;58xbͿD5`;` v qq~M>VHDFС[G@q x\M)+LUwLD[Q9~R-cyh\`x-/¿Ө4l v^^3 ?%c{)aG3b0 X y>(%*|s.N w^=FPaaZ }f`CIQ1<3?E l^X=tѕMٱ#X[/Y#LJXoώJ)0 WJu!eAf4uELV&;= oV.j4M%}"n}b.Z:2V@@ ɫU/}Дp;[c tYI4R[O|2*5ͿN' Żc4 )7MrtT z8Dq00j IqqBPG~3ʖq>ϪLIbC|Tšϩ-. sn[ -J44E0IV[}(j Չqde!y|v Y Y3f[@fr/9F8%1n~Y!у{_ռG!U+U)MnDz)v [IfJLAr0Rs ⥧?E9x5.&Se %O{\*`Ts*kn2Ay%r/e Ia}8:Cc4ʔ,PHWu~VHϔ_ zlHͤkb y4ZiSO lڳ,Swײ%؟陼^O ?G?:~3xL+9EC*'B&D ;M)҄ *CcDeKȫ !LJg3gGބ1r4 4CbuJ˭/N!Ճ O߹(9ٍh U@jEM_7u>fuTbrv{OmTEkBōJ(C ))_A]'qz Ug*$8Ca yAUg: "ٱkUQXQ}^a4MPÖe$2>_NBk)$Wf=m>4f8vpsVRkۑapirLp|VxO#2`$Q3xs^C)[ ^nW/g7*QN(~!] "hc˖ȿ7^h+q{!n@Sj/~. *?SamxNaX)CSe<]o纖j8"Y;!AQ>_] /v!50nWn}u)[k5eʶu:ybv4GSbY8Gͤm =Fz0;e z$Yոq(vfjRBOqy9G.%Ç.ww ^j<{e=8N G145Cg"Pl6etR?801&QfDy:;N6ءNdFcV]U>S\'*z'2=R{4{=()VZ1᷅t6 ڐm_XL+:LGARvÚjjdCy(O{;] HJ>pNcCu7Ҩ݋QxFҹ =BRmL:Un2ni:M1Uͷ@!9fVtN#iJܴۜXڵj"--*?.ݫ#Kpk&?U/OFWrnmN=xP~&*﫺bsWܓMB2gdrQdKl_o#d1ͧq qv&^Ħ5CgJK,oxX萙%Dx*W1A6q$i*=Uۢt$ߕ%6fmNuN@/C3e~-1UYtfR3F5bli2Jhmo+h^ϩ]#P_uENdR^y3Z@߯x\0p/LٱP ɊhPg=uG(YšH*7e_FսkO@]c.kz9#9_2[5l]xw:Xs]K UJvۺ)*dm.:W7Nnd?&_hD "70f#fi<*F} NՎ{KoB- )3c sh"]*ck0vK*i>k= 7`׸wcS(QEA& 5,WV)?2s=X֢_pAJZ't;e|Oˮ:lO&%ńu$1Щ"bx.G{Ɂ 9d ͔۫^n+,Dblr&ϵ9;aH\vmO0p/&rtA[usWKcϚR#L ]Fv3dߟjn7`J$VIw)B"'͉(zЏT9 NP6\ d.\9.#A7@4͕!7}6N| PQxkwsr5'WkdbNl$)k&z ھ?x*Vػ+|ҞpuXm❆JZYZDaP=ia(`>dg9ZҸR9b70Pl O'aWaqL$;nr(C~k;p+##4lRqd:Q딖x( _5N]+鱷GA;k-iF*xTf)QrjBU+o4+`.J{pI)F\}vbiU}-k /g0,h >Z" *˓ 8K^Pg˄d^yIC`ΡKlQ[7G0X(o9Q7/^ EMoIj6E*DNE#{Ah(gϬ7N=oT[IU?u9MRqŖXA&enY,qJW~8|qot}7 [vLNU*:!Vy4hg_V<xPqDJ%m̞S)_.WGgLysQ}S]d!qqK 9_fx>D'Haf9zCᠾ.qH{J8x lTgjNS<hGhzAGMneq)>^ {i1\3dIY4.if31H e ׂzxrU0x Kg$Y'q_ P7dX4n9H1'8ڦh5$mx*u> @fOM?fEhфj$ r#4"rru`IU49W]o)9Vd b^_ E6!\l0:z `_jJG<4Cr<>E5N]29颴Ao!՝hnCl}%|v~o5_o7$Q7 ϯ)Dt?L1)kN|~LLupGpnCBt] 3ԍ)G-*iA^R NIJK+N^z:3''-?P=)˝ v]X)<J=qI5;ơ5mGx],^K[ŜĆm9TMeRcCN;BgM=.lB"7WJ=Neؠ М??|Ӭri,S+$+?ةBO"cKM:Z7䕑oc-s6E]>ݔjdmE ^ ۚ9w 6j]՝g+X@6oytRɘ{V'tђ_ϯF %#ɽuNifeG_ЯW?"! x/,3}{\'<lo%lL)QR&Կ2#NaZHbFm*fyz,<~` lU:?Kd!NJ~0E qm:ZDLF"R>/8+iIX.89D](izê(]X5<*yjމ1~4.J, a&|uM -*2w'yzt~Ŏ3xB?&kQZ׊:,٦[O9+`r=H5@u][&^զ*EίfN+r2Df.ޚ8/41ٸ lx2dͱ U9+ N Y ͫezѢaȏol30 Ck6%5&>5atlM窟^6:?5MXLړJB9z\ܸ*PWzGǹnx,s9AYw}0 ,i 9?f`H\k1nyV;d<" 9<śu=<D""SWuNPҏkB.u S7"vŃ@+2`w @5wt@*+x eg9cL7&qˑjy^﷡`N-oVi^tf [^.kN Жچ/L)L3Ⱥ1ak;P2ɽxYCȀRbd M܂D}KT*CEO]'x݌?skeϤ/b?{ 9KD悠:Å۸𨼏dȷ|>4x8݁Y?Dجvb藢uDεh& {L;\&5&:xV EFOE@ߒ-qIMK~3EIM$h{ C ӃY"D0mJS*BimiId(G|<}{[ӵUO@7NokJ ͜ B_i(SXda̱{/D;b%")u4G 7q{L0T-:o UțsLX(:aę/Vg?mr ȿf^#'v/kwSﵵKIW yGDFm޺ZҤg qwtLwro>$4WV2 ((ж>f[;cBI]")ǖ#ńoQ ƠtCٓ`*6J[i-ǂ ^a"M,;Ky/%h/AMU(PvaY;!UL(lԗ򖷝y/>ILLjB{hyw ?h]VXuHYxII ';-Ehl|x}ד9mAWUMlt)Lz@(i?5vO|d\D1=%g깨eES;"6UվUǔ)aaMGG0mC켚1oph|X#ᔼ2ݖ<ˁ$aA`ϳ[V^ \ Z8)PWl.φ[!)ō8^:X2f?ϴj5wY@;`нR{ 0ǽhd Uq;7ۀ$ڸj 83Ͻ,s v_:oȌq/mbHr? ³B+73W:,$?H#8}kNPե}XWin)& 3~{T˴fYq/W^uFڄ)"ς0Phj?fƽJjn1DLgiTJ9Bq8LS\Zr@o6UNLc*Yb\"?ٮL{GobsMX'b>>܏{s2iO@\Rr#)hC] u#fy ~*nǽz*q|0 8N5i!7Kl`ˁ)ROv]KKwLu"J 4sl& xpUQõzqߔfR[:aHDYJb28%zN[,RHL4̪ʇ,@sj(4%쪒 'ېczgjd]r-EV#>T9LxX@}r=|ziے10\xW{C20(ϠG/@=箹yR/S>֥CdCa-RpC0cM=2, S/EwVx D =n* /ykؼ|J ޠkSL}{n^l+t֧Ԑ{D(;_ĩ)~Z} h 91Qբ-#܊]Y| UtHtz=8BUkiZ~h!ܐD R5(jDϗZzjh4ytbMu)nGLS'Oc6<;`7'bDhwc? U6.n d B&zʄ@:WL9،M:+fR8 5ZO_\ gi,;.u<Kc%R -]\}q44'_Y}8c2QL)x\֔Z4VKq 8ʃ6"_j5{g~ HLpc{㧆9#zmyIgªiJ#(}qqX E: t2it$ؖ`HG;,f5Fu=nP&bW6]$5axO^ !o⋶xVHOl<P5`=J0܁U}~]DƘiexQFMծܺybjM.P^M'ecW 2r%!~Tbvg($D{Al3MyVEjДHEtoeND[؈Eo {٫0fzJT:yݿ/55 +Jݖ~*N{{nnOJ{¨,'s^gBhk_K|rBrڿ@dvsuE 著'|Z:.J]NlaZEղk:EQK-xz2:!y!ShIfj:}N*g@nIr1XjU 6XǦLvO7Vh{u?#r {[HU/s*,703,xB(- 0 G_F;NTy x} #ˋ~5R!-PV0 `trZM 'x-E`sزQ.*00eX/+EàYH7$q+GH˅A04r{E X# %0Z4Tx %, tP0_{LFF[t$[&H TA /6iYWt;r4z"݄o|f\5< d:t 2eި9@FWŔBɏ=1 Xo> b$^/IX;i,2([Hej-D>3+K9(MTVTc#@ F5P^\[ؿg`FmŤ=ō5n$HYXt!hQ5ԇ H>};,C,R7A{aLFs9ےH@µ0cI8X{qىɀ&9s[1o/T`.׋a'IqfNa|DZ.F./L>aV$0nϔz13Hӗ r@\ơĦ-֨j# JU<{ꭿ c -*B$ڋW\3Xss8o&Y64G22oHbRI(4jWcf~uM2fߏXr|m;{. XO [Q֮&i.jQR@~v]ޱ4uzc4ۗΰ+alOIު~V +0`uiMC6@^{WūMl'!+ߕ( 4G RFYƗPډP֖٩O/F1nlH1zJ+=}BCNH AևRG5Q^G5㫀)f%1oW}77쇉2K.-od.eqX;Nd%*ΕZT| "^,7w5Fś_Ûk42_T^yZߐSѦtǺY"^* w6AG209( :r(5%<~APrRv_{:L"/~t:D`7,E#<l,>QڥPj[ t&.zb1͆L ZfGRLJ!4{딗VLNJDJ[n~;ys6?pqV}yfK(`i[h1ϼ6z+*U ދFsrk$HjIzacu^KV ڐ&H C˛]2*jBF9:;5~ _X J`yDĴ 4N4GTrւ$;,RN$4 A[*x;MOrXU=[ %NQORK ~/ljf͗2Q3374N>-S,|/rF v[Gd6rE}XMgz5$0t_VOrHJiiqeʑ %LX7ΠVDg)-E؏Cr)/_V(¯-mHܻ c;;rK'Xֲ<#=/{)D hr5|Ňh2ɝ$tIČ\`,) I:!Ik XȃAбQ}ktlFšR\þ pO lš. kNihUS^\]bT5hl"/ !cyya1\p/ /*$,p̯Gs1?Y`Ugm5V tE^bd,>n*DM>4L9tGpa v]Z\qhqV[X+$_...FU+yVWt#t7c9/\ 8h)EdY79"{8J/EhLd}_U >PɊ|q^W֗b 7}T[mhҶ_;=O JPT'p}ZFJ2QY[k~ƺmхIH=Oqf mSZҟ-d& &8I`CJ?q,+A$]ir@:q!ɍqi??pXm~=+f2cV˅S##]$lQg |@@!46g8B^_XOlC8Y`ޅL3g/$'#Yt{ kX!+GVvq󘺡+nS!s:p*Jy$m9Mn>k԰WS}r=mE}7ޗJ㟎 ==Xߐd}tuŬ{j y;R(bF$K rCllB4Xo@s":wȬd1 s, shB}(RBzqΦ'S|2 u=n0S#zro[&X I;W3#(=U>]rJkAʌ:L~i0v 8^ΦԪˈ̗Lȟ%y%kIfDp?6l$ #pǁiZ; XZ|TPPE{ܰ:FPɜJaM/ɢ _VK=TtRU]ާYfJG|Ix]')GWVĄywZEAMtw* 2EpsHv 7,"~ur| )6n}鏈,8M1+n@eZsH Ù|u1厯`g oy7`p=Cgy\#wT5SZӓnВ%ж]lkh k*蟥=MsЕcȃF $"x!edP{D0=p%@?Wk.)tN)1{& zB ˕UU%aqE iW+|t$1x GW@-ˁ8K>ltkF9ZP,7xP8 8YWP̚2sKyDh.LF0=Ϸ)Iv<|R䃈OE C>pK{,! q8a(:oV!6/G-ѱ xa)Erں %m>oVMV@nt} ʅ鵂l[XXfv䄮! S~RC#@C22Ry.dAzǗـU(FS3aPBe]:CZ] 'DBC}J;ŴNfCm|׍FqDWrtP&;B,(gITi,%QBnFMZ׌x<i3' /~byT}v7"X6|Si@ 0F9ORPw҃ofHY}ظѯ*1:v;?:2'#LS@#n:2Bk`J*|1艡<.H$I'Ug:kp P3X'/M=UyD h-Ӧ9/ӝji-PNb3+BrPIgȸ 3'ḩޱ``i EYn P2m<.g0) VC5+[0K+?GIq*순>G[ b&l'ibbQzTV[Q52jN(Fb6 \Vp.hr r: ι黏=i gsKsRu\&A %lн\.寪)W'5onhS!%NsiVԶo~gQ H99Щ_ҟ G &3UMV!pLtC0( tE,Z 'P}{0H 4t|H)eG@C vMH@U)hl$1uf3̜5X4sxzE ؞ ڢ 6m^gG09$T{ O[g`vQ3ŮX皵& ֢ ۝ۋ#\i0ڊh&Ff&=wa^X24gҕWu2BlM_I|h m|w5sãZf?9SG$K8d![tP:ҍof?yqR'l) "X6_Jͱ51P v՚6dIs|66  <_{DX3K꒱|åVO1@Maؔ gjBObmYi,K$@V}B:3Zt-W(5qyYb2dz)ηހAc7Cg1hݨn䰱-nq9; kC*2Ѭ'֢ɿƉNW>6Kn bϱe]KX18ƞ; kŴw͂EWxG(ut#j\%lKm/9ow W6S;=^ Gi9D6Oelj޹б[Jq=Cz>rxRоg/3_[ww T[2EݿVÁFa(hkK._7w2zS"r`6m"x4`I>L)x WA{JIh{*pxQ s"*ifp L}DuSgјC&;%Հ4sW2`GU^LQ\"m\fܞ PL(@X8mG=%w\kFo(e-dyzKxO'pCr6jQ(%rVIC4qe #d0FKYY/kgRI7`"& Oǃ电n?(żC\+ШR; F o\|RjPGKgHa$WI :51Jet(e,C6#GY?5{]ީ. J+'M9$ q# XM8?GD,ŭ3|,OARNyN-^l n7܎Wa5 LJNF}+a'|E\:+Ak2~"Ν,JoREe ~;Gxp+O][𮚏-̙EMpMmY:A9c¾;EMӗ9Ղjt8 mbsyq/gK|['!X'jvԬAˤX R;LUKh,J8"h_M~Ę$pϷgDw؝0S| (@)c(+^}*#z$픫֫摞l $YB7nSM`<)TӃw lF?b5CHض~b ,U-|+lD7XsأvZfQ?yR Gg;^T/+CdE*faq<|=.PMZ*M5W'uRx /ƊXRqeUK@л6 ~N]rbyu׻85Z~.w1@ =5>aWBHjiA A,ԲMREų/? \RUdNO81mמA`x-ՇB#1F\1oe[6Ơ6&!MqPz|-A{W9)`(%m~_ Bb c3G B #ly$^qQ~r+Dz"i>D/)Pxz6ϛzҮ%lSh҉]mM:X >6!2ƨR#ژSYYV%s5Ku᤹F^Sd(c~Do eČ,'?Ԁ p0ü^ I~G;e>^ гOJ^CA:h:dIQ|zjM]`a? CZtXbG䜘u1'd<:7p[VnaB36W.IS[5wM_R}PWƼQq!1:k0<8D-ξb @AQ˽\ycŪנc@iC8R7B} oN﷡Ձ3Ù[7rWzlZzʡ-=Mij4kqʹOBR1(5YW7AVάhm[\ t0:P]F=ORePQKΊHy ( :FqִWwo[fe*Aw1/ i-'w>g7mS90)%/ h Б _$ <0h} tn:Q/f&3#َYWZRJzps:>< rf+qYꦜ@67*h@/ e@lE#RH] 8 į2 Vk-gG(-uC,v߮rGAj3(J4IrB"KI Ӫ=}{L΀:Y"Em^X$/6V0$̾ƣ8KN 7}qki0a}_wpES$}k мT%h\R-^',¡Uʭ؅ʩ 3>9C6cų1@8:xYSb;#LäMJW< i-(0ٻԐ9qM&t\Zgl.EÜ~⽅o/p*y<$ á\((цgX7~eMRHd g(Dd `n4$W(ۭpR$Wќ>yrm<hy~˄WҥD>xY>;NW3uW.0լgId}J>)ѵ# :IJV|hqV h+NuOSF;G+묰oI(D| =.O Twv Vp״ZI79~~ G{N iweJweh_ E)֫K2KZ ,y9l@4b!=d^L/qg]ǦƗĖ G~`@݁ ?Vf&`Mj$]Լij@mݰX'WHLT}d sTغ2<;O1G]!t>sH ~ :Noj,]8!T0 iDRyUtMYf;2\,8l9(zbsUֳ M3jGǨ[S@Ȅ[C%iT'Ğn,7vo<+ig#iviLΉ8yc26ӞKЃ^R3XBQ=[2mVRzIUBV:K9@*zn$} 3FlS !a:lj] >="G\&[L/[->+|V-*YHH3Jci›Y|G-3 s2;=Ҳeȫ :^e{,9IGMP8 u*}gΩJ̝%$Ѿ:1m$bTt ;3eOj'K?:I]DRZLNar_M,х(k)]u/-DU9W27CZhEt)5#Xv/޺1d,U$ky˵?GZCxsu5^BrDnp knݪC<ߌ2P]["e`]:+mۖs}ˏ]`ha781!8y@α@w #j|R5_>ojcBUP 86#`<ս9ło+`XO{;> cgՔhnZx;k&&^kߵϰ$ ZaMciOx9`s_Y&GԞQD+PLvn_eok>cuYY]hmo4fz?e@a4Z@]j&ۢoc`V1aNZ3i9n E37E=%t-PG.8Ts6ftG(n*#05ʕE鵕=yꌵo+ TNBpAVKlpR⦱KL-JJDWIǭeH?c6DZIKO8!q/0[7: RG,fYB+EDiiTGi?<#K#'Z{ *M&BL~9326LW ެ>S1Cij+?O<c JcmͺUd)31Vv?;wEk6x_`? _1ȡT2%.ȇxFb `#w-+$,;+#кE=CĆk";ӓEoϣ-#5B6ÄLY9f!p% (]{`]&F|Z0M3}2Y{2G$gZ`&1 xw 0 !3YKJksPlQeH6;Qp1Bx e-2B|,Z]̱I|b-oma0х)XC8ZD;yħKOl0A>,Pݪ ,3 |a+P  J7Z:ȋ -w{I= h iLAJ&:-8gɠJ£R7(qsv'JȬnSn%~9A/Q[ wI)6ߕҕyv ޼~%S[&6,u1}bL \7=_ @SHБlPT?cux7ky"@@$t1f%P6<`^\qxհf㾥?XM=2~yK'yA=N zX Zi*WͯЋ瓸.trA -i1ȭi RL1|:Ӿd'~/H6's6 is/K1=A&X D A+IɤàreT?r%>`Ep)ޟr|/1hʵQ5QOC?UCUKRKKl1P JmƵna1t@7^~zyTvLo\w d}n6N7U4w-RA;^}{tL "'.8DOE+EwYq^e]LG >!R.pq0Jz̕_hey(`|uM[j)xlQX }H*j#EWl,vڼx^و Ǔiyx J/PrT+J׉ <ß=0!@eT,hQz=>=ıc'W+5r::WԚ.A^Kb̞LiλK T6DDa14v.cɻ'lM,}-1 }6x#MJ#19!uzYid-\lXqj YUo|DRŘ|3V( ѡe'LRgvGm,8$uf,A?aTC[@!]k(%EwXd=SIyGr ~W֏/7/B֍R_o橐W"U񇭭 D93,BZNLZ8ݟ.8cRzV@zG۔KjOKb`>VbfgXQEׁ.w}H9"% St2*\kB7a3 dfB!*0'd131x6{EߥU ==F޿SI-!M1=J63[aAYb9h]*'7iMjq'p 0'{Ld@ 6*}U9ĵk|GNBdzHc pBT a\F_h]Sps@(D-` , HJzԆ}:ӳ/@TOjTȊG@'~.[0foוZH P4z Cɒb>]~t@S)"ܚ-)n"whcBEDŽkxL4m>;".{h]x ;z.t,s#;?į柎hZ+@7T3ƻ (͎n[ZzK R *TW"[WŹzaӋ:'<\ߙ ˑl<^Ւ,xq`707NbPei8vs%[rvh@bmo2>CFЀ6)ZM/)yqC5[12P$AgL8h c6*j#޽M `j9ʞ)8K0ceˋ J:/kv~fjAW~a~.U[LqCX/vk^ּ·M^_#LooT]4o.K`>OB/HDcVU(Nߝ[ͥO>fXF`6c(#՚JO8%kCr/kGFB3dZgusw^7G >1>HQ]m'8Y>dQKIO#y#S!EJҚ* 'Q4e|+ r“8(i6.ޠڝ%tW@Er9x;>B`ì ?SkI1zӁlK` $j/zb)eάSbm4H~bAu֘2^STeNvv@T?doP6KTi͙6PyYOzh?uqH&}ZbskO'kjg5wCIQᔼGBO3[rlu@]UvF^eO:d iDa,6ov<.YY_}nHRR-v0E\Q:&F.K+bH~F~, '\]piNg+|u.7fxfWGȾWԳZ]CkD]kV"0U'ލUKV/tp̼OBh ѳfSɴz$^YhyD16"BlO!EF, .E LRJ[ms K?H~Y ke2#iK9}0[m^ڟ@^I4w>jJu_nIԛr7KH$QJA[uEh=Zuc#ZC`1F3b1܃A%8 '#a~Hz;1r*mn_VQγ껇20b!t]TFP>W[MD lj/d{rڎ~jX%8O8xV.N_ ]Z?o*`+ uT |Dmr{R@2! ;⟀5PW5]Ec|z.USPa L#N^qviڀ$e$u/v-,_F]g, 8{*eѿW=jǘylAC6u霳h$t< qQ7$M٫Սat|dZ{+C<~TE3OL Wc:oC$e5ۿ"̡y,S>ʭݔ="s4b2w=adu0zQ#n罳)4 dYoMlaƢ#g_A;c(hw+Lغm l.H.:ͽ ^5K)RˣGQ'W1)]4'RXJntt5ZկƢiu--ȫAxSbR9l˪A*^V`q7jk-ee]"bO2:?Ǘ8H.j˷*y23ܗ VhKx_~ +H V7cHGO:y*~h %o,c$ެVeØβlWUN? Lu3 c]#Y%!-%KQD3I-C!Ȭq_Ķl Ra͆4$[ dSBk9\͖^/=Fgʈu?>6n XW cdjo]Kѷce_ρ#w`EZrJr5l [/_ʚp({+5:-C7Lhs6wBf}ld"Lyc.GcG) ׋nEMAS "(VzfY^_7W&&Sq14e[nvuF{3Vd +^6Zؘ٥Ǐt٢ .ghWxMNLF!;=ܥ 20XfQaW t*b៞XErk1e&o8!"놧7Uf牾5AO[޷ihs=`Կ1':qj:dX<6S +yD-ґ즂b: 0Ԋך!?Gӈp![iP/9)na=GgG3ckYEnҕj_<}1s@wk[cy2CҫK5a#vcmn5yVLs0|0+.c@ѓ{b@vda@m+;2x#Xdp,;ynO(>%ej[;{ Iaez#g;!l:V[]b̭d_ty[/?^M5Z@"׬`Zu{NNIŽC 7#պ.3< V(! H X@%t/EcBj9:a#}^ӂ.L EwwJDN*&8o9#Kn}"t7LIe9fW,Fэ;Fk'l3rSGF`uܘ l}R<+e(Lo/7%M=?D67VϾ骣c.SCc}!^iixtyj[pd+ݲt1:ƕg B(ZNNlw #\֢e|5ɽ"&'T(^v +$/dx43oG9/ Д#& Sѧ 5)3Q |SbyqJݢPߞҝoYh*Q~mͯd_\D#@7^]QAzq-85LBv)|c&kr]d{qʧӿ&i7Ό"l^+> 9ng@0n­W*8*P6gD*j%4db[tDNdF,RU;_}=`ی߹QsZ1KC{2 :Y 3'\\3U9-Wg+TIO,U:"*Y~7x@붿Xi. $Za"bʾTM0({ ʫ߿46C`W7<{ ,'<3G;-lF-/ͮ$G:z`^}r;^8Ak34d85+Qîmg'f"&}$Ne4ˋybE\Uk0P>6aZ KY6qÅTC={uSugQ&qrfX /gmeFlk^5Y,V f,c|= @W[Z^GPL%'{hp.g~#!e;I :R$ '7X+o;M{3 ~7\'Ɂku \#u;J ƈaq /] uZ+3lٞFZm09coUﷂekGZLn9sP=mʬrۈ)c/` S\hA>*Z;<;.+#0אDa]JFK׸H$ BW~VHžvGnQn{Y7֋8<r9*p?mp3?xHu܇&ja/'l0HqK&u]Hc0W,/U@ +,>OǼN  15Q6 #{cbU91BώsxJ6߲6f%zk?~*8]-&֟x[cF? >,ON.tMuw&m8RbZLf MZGBYY8Gl_vu,bnOiRrZ@$T i{ f=9VA7TIuKcմgR3\Pv ]0w mU1:$h"7i/nZ\v/߯w[iveMKe {yEvU7q TNB.ˆRM.SI)&~B9]P3&[,2 xEt`x K]%sf7[ԭ`N2?0=Vޘ(!i((>B?vK놵; ULxAn^^dEd;@XK栄"F>zt̒tG;ar~`.\ lse!{mxSBxGq}osłhh~G1!j 1B)~7YΕh@:=GVmpV%%[# ZcM}yi8NC.<%E\KNQɰ]Ä9B>Զ̗8Jɞ:mP=d:Dƹb[ՠ,@ r?w9WV,_Qvy]wBKzMS%“ 458 KE$祷]ߺtOiZ.EKe*'GtıfSOKOJv$ڔ_|9yբ}~6(rسq4)*e"Lq\h LQX}<.( k#{gcbOF6u#<[3. >- 'oa󐍄]rtGVbML֢)3ڵL#ؑЅȺ(&pK'o Qz)GhYF9ܥR{Ӕ^.,\*I$J@ MO>HCb{0U0x#;3 4­Z5ws* nU_0ʷtw>U٦@<MKm&Y2cUcRiAղ'3\;!n}1 L8ʰ!?5f;*~[;r-I]OfͺYN""O޲ n:䜹)%%#e:RmhL.v/!I(}ޣE&=u ('cC쀼"݆!$bl txܟP( Q^'dԣzK?&RuWOB"'ؾzE|ŬWцpܥLq$ Kc!\M YA Ij^R\سL֖|p#8|倣kf}`QUi`zdղe)y&F>}ZPFJ ]e׾ ߖ鄉S~4lGQT 8Q#E*egodT8QA2$͡>N Ţ:n[c4%X4u#Ɲk@,cp3boɤ]6#:-b' '3IDw"&h U=]ryOK_;4*ϑᐨJOֹ&s]h)6n]mӇ;ӂz\']'̹ Qo>"<ʪ˕LaIXSX G07Jl_/bz]o%z;%Y\og'\XGhjQe`W6ԐFڟOtG ̿z5'S1'n՝5܇e,Bulz~ lp /SRCpk:Jc"xm·Txu >v%$Wiw!a^U/7v53!K(QaWk7r&Мÿ@X B;BWpoйKwRcm[IqY8 w\qwߏ58c$ ? 3Ah4`neLٺjޮ32DEj`{J]lDcԍLu$@,HfUGR&JSay%+s7a{Tg,|d}unx8$<}AjTOSQacKJW=yd{q_4/Wה?MwL_  03|G" ȡkE6#=E^ס~Xg'c_+r=]I M ɦsrF\TB tp{~`K Yoa7Z㱎$3۫-I蟥;)ύf+cYyv ~'W0(@lM^>xe}Tw٘ nɥ2ѝ*Qyecwx546ѽHʗn ':{֘ූ+Zx ki,Ju"7-WZu\bH1~XxkR ~0yeXNm\W5ŅPF=Luiڐ櫳T3z¤/ +'e LiέB; _W'l*ac%8k#ܝa Q~Z>;_Szw399FSnX{UQ*)_UEYW-Zd߸8k6 ޙw`.P?prXf9 X94(m1j3/"^E4%ߴ%2ULS })(/P\p)4u4ㆱ,r2vזr9p%d;✚oP/mbKfPZEÔ򺜤hKb kɶ{Zdi7T’ Y`JFȸhmsAF۽Eil;Ol+>ȟa$Eoyo "I/mkY̶D7O ?mu~(bebJv=W (0F? verڟB rʬJ$*^rܾ-vzt%EEAg돲[ԒIAxWUn߅v\ Z+Gx=z:u݃]i8 p`bEveOlZ_j@DF ,,a5C8ݐYzfX1/<}Y})8{qq.U @;5q;hT0D:(-؟S⤐bF0ZeAt, :JJ0\Y=s 7+֌> AI`~@.45FN~,RCj4uUE^s 4TٞC 4.,4749XՁm~SfG6^:W5씷,ӽm`NQq½Q#C)Lz@{;1dp JV )DD -E!ñ9~%S+PǨ`!N4Ik5 ]0/xClMNKZ=uqUP+_rȤwѶJE6;_ q l'V.?dMdg[Ļ"g]Bc>=2+raĺ,j ZAcV~$fI9,B1$qcݫW ak^+ѷMhr iMR\b^9X x=j*m];/B5ףk)aF !< $gMS7T# n2kl1 >f&0˵t2cœ4H6 7<h2Վ[9 ֊ &Gb: h#b3͂>>: D$]&XbB$Ʃ)XU1 ; ]u$LB2I$sMBZ`3uM!gGDz(ڲ؝Z\'JWb%cV UD֩42bk5u⛅R0>W-_309%0x!Mo8vA5TcB͈XU;Hl֥F*uIFZL4͔U0N՞]L]J8jØ5TUVƈN5 \_D 0a5,B;ENC.d'ļ"f|$rR:w=urTlLMIJ *_ W7'ԥֽ&꾢 3/< /lko~#/x`*ygOQa"{d7,,׉ҟ«f_.cih.C;G/HlLF02ߩp t e OF1¨ 8364l_b_ H |o. x|t%?Yf8߆pH\\}~T=ν,!Rg joW s}^mBK7ipSqXf7s֦qT;Jk %Kؙj/@\Fғ-;M!z8 ǪJ;+ɻW-2͎L AA{www KEt!H6}szMD\i{1(q,/{+~?Nۿ8\sjU\H9m Jck߰G;qsP;(p44s)N2znZ#NB"! eh iB29{X ,- f&`T2Rc\u6QX/Eم_f;dNUf$L /<8FdFK? Xȍ+5[oQ`ba+|8 c#:'A X7i`e7vi[Ɍ!f9FKލeai?7V8Mt܊rm?*8 [B/28d/Gx/(- B'z性c>I>מE]*7>$ˋZʼn{qhXb1DYE4XjRl- BUgz]C"Is+%c c< Z0v3˻ag-M:?H]TAŭ=G "`x5LȰG|Q/\D&Lݨ \EUJm+G5Ep9w36I5vk]^/&D[.WG^35#SSH~ǁĂn(WcH4Bytߩsm:o&ȨxSoa=π7qg-R5EN9aVֵc#!J1G1ڢ_zѱREY!HtᲘ" .D{ դ~b$^\5&>fhaw]PEM&hg"w,h: B5̜t]8'% NmH3#Q%LkjhU Cr"wwbnݺ`FE.(#qZBjM+kɅaBVfIE6D)=ROYROBY{9G¼S>՗LaDwka͓w2 4z)bw#dSh x%!D=o6qvW$|1s]v{)-G&o9vI~/{oDrUۍ1 _V?ݗBm-Dm=Uh)pQXQnd|9`t?Zyr/7Fq77`Y~ ,(dE"f'j/T_( Q͛ʁS" 7ZYOjrDFX#5b g⡬IJ`TN2#w'T fdv:z]q{;2yy98ϖAYU^̙IM +U}g|~hz-䯕x߾}@=f\-$06ЄqR C9#U}E^S6O^z?LZ@Ȧ?'ȃTqgnzЦL[&wS9cjhUb_)0ŷH𦭍eI鱭3HS܄~Lk19NɣS"Ɂ̯!`^[A?Zh̡,L+92II߬o}<܀[cxs` Gl'[SIk샎gC'㉼m]A׀gSĠ)e/Guݎc?eO { ")̸҄Gݤz'Q O쯞P8NUK۱*e6u}*Q Y~L0NwgFʛ_EPi?wb/+QJ,K6U> >0p$(JЦRtޜE\;? p=]GN)awqFـiǛke_fFKI#_3*QtݕB仐XBV0|#YP8iRcyO->%"GA;ǫ_s'>*?h86sfٯb-]"iOf.(=ޝ N>b6H#Qizb${d?mwYl ER]~NG1;h_v:mL'dENA7:xOd`B7Hh}8?$FynKѡ$.ݎr6WXө?Ϭs0W-q6*N 4lzrbSڪj>&c_>MnsĄpc|ܐ5X)Ʉ]۷!%&^:5+9t 4Hڟh悽CBI*֌~l0µa-#s4uy ᆕۯ26HਬHE|_ysW"3N9(p/jv:$cSJ|N6Affcm4`SQNmN7}ʈs[_f2,I ;/|dn`zfU#(ZvHMUEms!RCa<׸4VXd:uq!"v{چ4apBK|6#4knd>xۚQpMJs{mz:QȜExi/ b3(7A>vԄp ~C{~bFqx3xS4 O ;7Xܘa`k;xC!)ﴀ KwD^#V^h"-c9 zƸ 4!O Ve1'W8N6*b4|;: UEچb2h0m'mX:|]&#u(wkB7j@|3ݐ^L`s)E|sko wqTۤy"m}~q(׊lГQzO N{RMR~֏]^rNURfLml2I |'`||I3߀@0U.x~a¥O4gZhwkm3mtSC(LnPYl6r*"ѐsU.Q+F::G__Cd[M0.3e/M5;ydWl4esmOqW3j)a0o2U"`U:7I <v KNà 5:dK&66"ku" n97;SKjC+z0P]A\ 勴"j}!۳TY j8TÜEc(DaX,Mr>t:[K٣/ia5־d ۃt1JFTG,R\;`<\!D YOnjܗ-]N=b Kq ~"ᯞMnKU¢a[V(y H傼olP:y-d(;TYFɠ): q{KN̝vd?9NBt"6 ]t=*vjy?i0t'tvC.*5}Ketn"7:>uO>!K ua}ܹu:;zEHE# =swWfĕ=T>@98mSQ9( K #&x ʥ`0 @{`[~]@.竞ŴV#I+U3xWX#37LZbV-Aw< ;X*,<.mKFBUf7Q.~燩7E2Y.Y!xyɖ3H'+aBq=$SbtuͶOT܉K~^/?"d2`1E*/W=R… Ϭp{Qea2X9e'AɨHJYKwr:zI<l8ETPb{"42lΌ~܍OI:W M"@7D&/ZIuG>ւgJC|}x"1y:vm)m] ]B]9۝$%fⵌ{C"/\5p.k#Q]c|W?#>UNC?礵Jj)^^UnT}ǾNp1xr$*pȤgD( '-AB+^: <(b1ol Q P;uM)!)V V ݭ4j}1&.g78Z&<ݛ.S4y& Jb7.S$pX߆5f :ȥVQ{U睈"YeW t %s`Z#|Y1e'(zƽ8P2*z%8|d?th\e``@%AK4I|ʉ:Υ۫cŌhT1Jr mֿIx ڍ ~mSnAat=Δ)`BBsnLʯWRATj{H2$2퐢0x NF71dhX|SAoչ^K G(H6<-B܁E$foxS% qV MǗ]9n -ݲɠEBp&GAUjtGj,8ܡLT:Gs-͌b6d A?D?cl%mI 7zndKQ:leF\*z>' `C⬲L.FD~x#uLEVrY9RblQBlj!TjymCUx́9ݶVk*Bg$ 8H<{j,?j;Sv@4YK||FOKGA~^/sj")Fڷ` f y@]xN;mIxM. avlJ&gxc| hE߯ Pj  b` [D7}je9+"+psWJVp^xX U#?ڒGZr \GB_poe͉'+qRzK"%ZvxUi䀙󊗐M߬ 4t+͆~_!w޵OÉLߌ}̶2%BU=J@_$s$ -?P>h$OOW<;Hz ij">!m^R![` *rjovo N.ox)|47܁zIjU(.kC/U?|.ĸU4?E_yrS?ac9vQJ1KnfKiَ\t`xqF'$].K6 `$fBė#%q8Rg;3Ch8#B܇gksx`V,*ϩnn eRa~多CpΡs#]ڡI_vB|҉W mͩ5aׂLR[n LvsЯkJ0o֣%tDЊ/gx؅՚ʣ /81'jWщHf<%RX&rŅ=a"ZJE %yoHJs\ĜTSp# ci;N%\ޱft-5<.d)I[-.2<clϱ'QhB0Z2 :Wfn"'Ȣ_vd%u&:mTbYl3 }Ibń"(_QIfA KFATsKu5~P<7 HhuMAnHxm#Ӳ蜑rR&!C&^)t>3o_vzC4n}s0K?f]WloTlB"ה6 bC5_mWZ-];Du֚ 8"<X^dUb)vnMfٖ"`2bU(M-+lr+EI>ΙrT]S` ĉ 3p +{Q&O.Vk}8OaS{ R'۞jREA155F[Z2`;š5&"XàKuqG 3/$m8bHаQIz=٤&B7Aeȴ[. +Ц_te9b c [X U2>p8>YL乜^1RQr8*$h;[tϚAkvZqWRs(Wg?}ݧ{ R|ǰTO[PwF ٭?sŘ"[ QfD*'iUYf M^*$`w*<\ZO8bց+d ZsR??mtH7R#gQڰvw2ԭ{b#HZ *FBx.>UInB¶$ \pvQ{ЯwIeH 7}-#9sS q\vfw/ ~67f@ 9P ` @]p]a M;u~ mMc.}L K:'H=9Tn U|N~j5q0^=\jI^ke[Eu\Ά}fNJT%)rβi߆6X+HNӔŁs62U_,+t>p@:wb6LaSt?gN}J_VtV;0ۡInT?}:7޹1Q ?ޞ7:΃ۥ eo\Yp$Dc+RnS)"{3F'U9 if]<^\=K<68uXHE3l.JJsV\:0#'8LͿnچH)j8-k+&ݭ#<ٯ0`;'RApT&3L^ϖ_)٥m0g.m c`G*h²9~;w[e5ȴ4' q!^.)A|w/ 2Mޛ̍Tp2̨R6R[\2Ĥ0ØOpw3 _s"n8`g>0=μkO/ 2n٩.RQ=ZSMd*JcVQP<8G2Yg~ûC{]4_Mt!pZíBPB؊dw䅼5ʏt7 L8~A'НRJ,z '[ ǨbQ :}%k)`s.G^*5öln廂n$h pFR6 _0FxYaJ"n.*WG"F>eg9Bu# h풐˘!O;K\~pZFM'|/ቿCOyO běYZ3R {cWPe7QH'U]+6={KҖpv1OgcsJ~u8R8CkUUWC0Q쟉~{}+H!^$qW'| o0{ɭbח}89V[Oj{Ś~`PHcٲ@f亭 :qgDZ"uA4l.BLj2sYp`|ߡ>ztHE|{1 BG|ˊ_{.cdwGeu8}11>:Ȝ B$A-/CW+KE}Y(X%efus'^ Uڅnm7"?~utь߱Q ?4%MA|p.{G;T:- UL&JU7cLЀ;RDu8asۛ7EMLzCۓԝuXE 4aj`\Feج8< CLz-@ 46Ԏpq]8,/m,@\X2oiݧ&镅=At;mvk=3;&CY۲خB QSq KO32pdNœk3AZlڬ/dra.?0*Ӊ&egC}붐1ᖝXw =?r0k adړPG}0jvh C;<%r`fA[⦆88!~*LDh3w%Zc PZ.7-I9;=QE4our2UҗWDc L⭿MH~3q4:7^6c?aZ U ?csGE><㬣@[eX48$->'w5ayJaЙ:q+GZPdϳY?[j(^]lp͌x] ]}%wv-)8sb+OS)f8;iS!_&NT =E7Z$I/p[=bUvS6k0VpHUĢkg+?<HMZG%P^aU .Gy3ӾvUFdWR;PqXIyө״PLN;ɟo{FSRĉzAlz -zuAIQFBŰqj&V5D]!5[p_k1amIAw҈];ȹJ8. 畃n֍/l%}W+ةu@8M s@ovA 'N7[8}jYY{~NQ<0kYWIۓ[#Ql y6 4[g} Ҏ}'=(( 2 gg*R#fCa ru[=X^yZ)\TǼ^7n&S:mM}Q~OPk2}G)ɋj"|/Om2gC\onǛ&uٸ/{UU'lrx&R#5|*r͘D[J[4~էƓe`i\bRϝS FxpU^ᱭ1?Q^)YoE$mYKdifRyׅjfeY;x#]uM%{9?I1UKO} ?C8%hVo]e|KJNNQqyӝVf%P*A]o?aiCH9ڝI#C߈Rh!/{?!_Ve< ks =56u 0EIԘWm L1"`ҹOD8gW`>WO{D&_!3 %{UyvVfjF XI Ctxq%Dǘ~Z&c>۶@֦mx\{RUag$thtNMьv`Y3yi^mc[D@0rb&n.f_Ar.ױJ~`iv)韐0HToK Jk ;}{ ^0?3/lJgO-y CetKT+łv򤮅]oRʾc|\za\M@X?Z5T0G7*`ٜ}# H<Iqlꪖ0j^ew儬Cf5EcF\͸ITZOXTzcb>Nd 1E@J2_BרTbhhya}tSd) W\N+\y&[6W-4уŦݣo#v3~k(uij\1fO9j !AA%@N%v3bGK0=6^ . -@M"/8G!pΡUY*1N~Ǚha xe}=4Rd󺾿qDG}DuK'-e)[mn0=P'7&ŝTLeҞ vTZחRf,zPXpYulq13"R6jTO>`]{j.սjD$m㖯y6I'LAl;<8OCSd,-Kuдy<$ɰ$NMVP++HKRx}9E+}U'n<-keNok.]xP._q~%خǖVZ&:p7dl5N:93-e\ i. Mڗ' Vޙđ~oy1ؓMQTkAEY?$~%h&eBd]6S8$  f_ф;Ӻ^YEjM>+{}y30#[V8 .l~Ǯ?9&'.2KyPI= ' Rn4ӔVw^w߰DU#lW!d1hMqJÑ(9Ï]~+{_$ 9 K R t4M< pn)7Gzb U{7loR)WnXljwJ FV{t͚,j-B!/qݚ (>q'Z9|h)vMߜkMQboί~O-j*𫰆"穴"9HA9!q]۳Pwe#U)"O H5&ݑf3hg{LD {|F&w-,LK oU,՗a^l!(. uVvlENϱ|sXt^47S=Ctt϶?0ї]1:nϷEKbơ@d v^4ΧObKdEU? ěg +f۬"^nE'֭r Dz~^_lSo`# 3^}.N~؅' +NF;S9!wMֲT׶V5df˓wBo#ỉ8ã'*;:I/#ǹr[s`@@)7>j'D1~v`g]<ZrAsEp]Q`ZKŚQ_qX:O33Vw˃a=P?ڐkDGOg0*ĢM0*MreBZ߷vI2Ń a *82 Z= iE)bt2F_6 nIijuXw$BPiU ΀ xa>X~htH{vTӗX!"d_k>/k A>3o'<7c4W7X64 A'u%wKkB#Do&` p)<¦xlj5Mhs+rT1ZWV9s6U+8dI](營&fAOf>ID lMZɛ^W!>ERqĝm`KK}7eaEWٜhk_y\Ku lOWujXG> [:/R+rI =mƲ`qt(E('i`K*V%oyYSb0y#7->fdMILF [OEmk;P<0 2`&.$dFn"L#,u3tZFQ{GZy+Nh#:P>/*v>H |hȼp+ri22M2eNĩ&&:mL7f,},$])ҮoRmFt`yK;k7J1;(;Hl[ O]Qz6?dc:.e`5#:~~%ܛ6AK q>k"xn.H%IX`mQƕޥ_$VJy0ߗ)O? ;CѱFwDCfR 49e)J0䵢C~" t4$6 ğmΌY]b yEsaF==B,.]kMn}i#:wElt0rR9'@5,9 `.Wpa_'uHJR|+ϧ4ESkUN p#l1̟@#gCUj'JmCfxBd*eL\?':p@bAt5'0&WyL,8Kݶ-r}J*dQʿ@^̘N!jz2_}Y"O l-]r`nuV_ `' A@$i8{0:+۠ ?S@c8rBe{RsϮ1\W1nJ};3;Ѓã:Duy[fKi[0mp9'5DcKf ?E|"BJJǮk>  (e WeM~8WD>)dҟ J'1wpz ª(ҼX֭##ܫa7}]u7(J7*b`} l 7M3{辯/]gK4RRg=bQnFiѤ@ kY9J3 SW~tݩMlwm@*v2p!mS:WedÉA+~RlNFa(' ݖ®igQ ޒ i3:Bh7OStuҥFjX!q#,s,&oXI JJ45`ٱ6Y/tb"3tJP?7ٓl9P됏+wCPU1wi/ gP.fwtM r':GGd_d9A^, "/'WH9ٟ$XΞsxn4ꄙD |?ꅩG~?}:-Zfq ]cޛĚhI\tA4JBз3/&BO9uMXhߙ~(aW[lJS[{ Ea'ޑe2],Q+ taɑ@L>p A,RD=ڍ}1"ٿ@ˆY@= E^3XAW\Ya3 /' %bV ;׈q&dZ77\( ^P2bV?ryHG^7tn6,ZoPYV1Z%nz #%'(ǽߞ)KoZɮDN|br4?QhB=5,DR$ոu3uRtxS0K@y ~=^2+(ÄpV;1":͌_8V' ƺj n!C>KzR %(CK4$r(qxNIܺHzށ)̈ -ċO)gOe ڛPhO@}qD#\\[×=@Vڄ^瑕kTrVcreOkbOΦ#v]5s gI? Y:J,@9#PeԵ6oZ[3\A49/E/O]ͅyX꧁V^W͜kՠFO &+~:_]qjhW $/2ܬ$fh#MpLr.3",\S6_:7ݽ>yBel i0wEQ Ri8h! I^21N95[^ޝ$I?cٖG]hdmOnRxp/1Bn1՛ц7,X/g &I=5Wz>hhIeX5 9Sc2ۑF$vquzK]6xpoL`*rMϿ8ߴ,iWf% D6#5kdN.Mbh'DQmX}bQkxW/\LŊ<\$dg[/j7G zv. i4*PfjMU0s*z&N:ɱi8Wْ7GxR#1 cq$F$1Ӎ!0bQqrΌ[ %(#z(γ?F␶ȴhuɗދ5#j < p !ZW毶̲no9ec4Hz]&Ԉ:O;c0 8o4bryS`9|[) hqgp8Ab ݫjЅ1aK 5?G&BzvI<޽C\wrKhƨ ˜#^=Rf |vvhā~8'8R\0F[KiMlR$.x5ĪN8XOnS8'L6?^Yj:30dx̤ϘoE{[Rw؉ :6{(#'Ύr(,[s6Pwt6 R,ApdO8xo XN RF$r7讑8]!LLy}9{deK?g5;LmuC@o1CkkCx㏰ѕ@*?t.jlg!yzXAR+˔qFEn6ɰ&tsM?,iW0/W86vԧo VA $7PV㭾/8kJK6hCW6j3pEˠ"H"pxO;vlZsHSo[5U9dA+cbK˱Gm Q@(oyęӲr}_֑OaPL ^H" Q&~&qϨD-RE5H@,vK@}e4SDZۑ!c">V Ӷk{=!cu #>Bjmxd*͙KgO34z 3q` 2H)uNmO]beQ/f''G-B`L~%q9*ďd56”m.XBkYyţ[#@ i@7 ѷ4x-Yӡ% <4'hB9ƂZj:t%Ƙ6ڰ68]d6nS>5 QjS,ZI}o #6\m/cPߒ7׫DϪ%,2h@ߣj4Z:%-TT2WTei+ MӄZPG,(9tg2.RkH؎!WN-ҨR?Bm\9X9m\8JRk/v =3Dܢ$}#T'sc۬B6)0O[nAS',Fc2,JߣF #ZUe6 EEnt ܱ=IkDs IͮIrv|3T +3eh)OGp8&s/'n(ow Q"X{O&hDhY%Q1~8Sp#zr]6/+6#+܇*T#|DVCwnB*p@H%GKl>.nHE}F@/ɋ䂓ڑ2p?'%4,3x~N]ELr_ğ9XjfJc:<̖bF|q@FG>5lJ-̬z 3uIBYkYk trDo" *Fƥ+?kkl/mTK>dFViEtG߄]b"Px8HLaYovE,8+ Q;H9K[/A?+CΥ|K C*g4 f,Wq@&?Br=YRiW6p{6Gµ˫6]*W!vhr:_\2֕#ZX%!P ZZJ\HqZ .rBe҄Vo4\HbbWdă9.)h7+ e~PJtI >K jO,Aك|S濷[hf#Os:+R a8+2pSfNnv?7 {sozWeı(Wv>ۿ]a{㺅o pzddESV0Cu4%h v5*FMK`[ SdVp-l$/ d?U.:k++e}"bj|F_MkZnP0>)4žbP[Ƶ;ΩL!e>\OB}6[2* qᤴ㥖fٙ8P}ڸ{6uyAV ۚ"_T<9V##l2K:7Sg2z./Z028Y596YXe[SE-cDE8[Ꮙ:0D%@QK_`+~ѺwȑL2E#>,/ߜ6Iza0_* Ǚh(d%b]<~:hhZсn-o MBm|d|-鿯lCJޤ37JJHrC I$Vn!tTp=SEVܥЊDA4w9ʢ (Fsx6%go0;pbOĘzǗO#: }em8;S>nM4n4 K|`IW 4/:K+W՘U%`q~u(B(yގ55(Eѩpֺ->XZ9<SAnv.h4/֜PiKbg`^+Lh#IФeȺ )%7ϴG);fWa}/`提}}1:aeL͗uG;۩F[^',V\4>~7}.W;; 'K82#o62G'u*U'QymJ/W .!ND5CE43қēE#jμGguTTq[K(-ٶsuDdp$lOٶIBADIE׭oÒK7f&6qw<ٞ]D&m֝'r f0 h6=<=cӻGM?S$#c! iY ~kՍ5\R.V(@Nںa~ ?A >fHC$o[á+ʞZ 7'F&Rk M#q%"\,m,>x'HqV34&UjghIh ޅ\SschV'P!WtOd a9dfW_8=,"^qߡe& WJY-}H̯뇛Xb" sW/.u0^@I-mtapG.n}9˟d)%_3!$FZs<]xLT?Lpm68^hh#ߌ:G`RO,<> sKnRrg>;,L B̙$jd-k:f;BUh%`"5] mvɒ_-; }kI|[qNy.Kee QYz~-GKU- ~>( 7?7VM;۞a)hDڜgA?bFm'@bABρA2wC6Hong$NB ߇(_5 .>I1KXSpO fvCg$  oTZt9WLj˹YeDΨԧ3j D5xsNowŦ4 g: -[m]2Q8fQ?!8~E']jUBg$686\ktВ9`4w1@A ,vx@S# xa2Ի|JZse8_Q13!-aOd6`uX#WBVys ;ࣦSdsl% ̂]I_xބN\lsF[\+s^n)] MtY%6h^j>Px4sCw73a+}?/i~࿲mWuyiH 9 hE4_*,Q߳J۩Ghn0@X!7hqZ&B6:  >S7bW#4]Jf @\_gf:(qUtaw n"Jm.k5]nאt.O%pP6mSMvF?0#Y_x< ֦>N \*q1z1K|G̴5frϰfyR@:AB"jRD$rwo8 [,jhAjv6gJ;8(n.ܟ\tisLjK۳`4ktB"}A%1"dk.PFddsd5,sPNM>R+^:P5Ȍ NX?,gƓW! vSctH̐͂j\HbK/v<˚ŋޣ՗{ՖH"T (Y4so16ŌYo5ZTfT=/?jxЧ6T<̿CMXezxA@WޡBnߙSIH.ܷ;Q3;#&߂% FzHr֏꒰hZ@+` #>% [ E@ dABr:ƞ&bvDKWXYZFki*Yiԥ0[ͭsܱ%rx.d݈qG/-mj&J]+g jY[Y0$BݒҘ_ba c]Q7lA`7'*y9[uN=Q" e(.w oʆ#rHjExbzTX֊xKۏ .Mj}\?651GqԑliU5YYQܪU_ K%4 @Q` F}ȌLGlj ,S<:cdI HB(*`TļQ8 twČ ?a^ hڕۂzȁۉKZUO CyK8,G}.˽hGgYMI:93Ɲ=܅kC$] `2 i@jQBc]zQ0 tw aY&-kpei҅&M UF48p-̠iYWO:' ݃٧VM9"$"4yY ni)f[^dH-Y&! '+ Ba77Yy75 12GJד  R @1ci1'^>( P y_vnfrwu0D\ж~ί>%^! "JU "-MKܤ`WZv"⇬rwU?^HOL1Kc ]=uT=u 2_I{kSRMy&$uqqo߂y- g9o y?t{g- _$S-^4f)> eOKRuu礑 ]jh/Q0-j^K|Kc"j9 Bq0eAUc ,QgOSi',($"utU޸aF&Bf{!/@øℊVj#$Aŭ٦l?>}6L-䞑Koī~*bRF mDwqސ$1v8@ =p7HiE.̺? E0ah:2۰6]Op[=Tl{ rfʓ*5Gf3*^ T" 5[W3NsdŞ$̋뇹e dNO5QȜ@cJ%֞EE2ɏl7g8^zinSڙkO&毅WyyW; Gd))j(z\`paX>?XL/p="{/3WqEf% c|)~0H?k7\-}So;Tn'| _5aNh!y )5.ɺa8,I)5"N F#6Rܼ;JMWXnQbY`WK+fhJSݫα'WJ:aQۦ@".{a4ׄ9EQ^F6Bvv`>^ޚ2?kEINfwxz+荳2A4s)3yAE"/aRT^0fq^e!jnӸ Ru8b=Bý:Al?]J*w7kx8: 9;Nk5.~C+}ؿOUE=9ty[y,GmS?e .%,DpPKrAˁ;RJŋo.j7IQO1Rp: {gǵ4 _WId) >םu> I61G i(HIދ_ς~^ ZOBTڄ{5bu '͛ r68Z.IJ5RiYKy<6vߓ,n4?.B(12Uak.3MГk+u] 3J"2M:*:Zwtpa x£bJJ7by2?ǜ:63(T~]t^27n̰{ 4Ls)uYH, ɱֽE^'4D. 6&27jNB mJ̣eMx-7$cgT 2J}>r~,z@ xG#|īl0$w8]激qhAt 8j Ě1\៪ ѪX}3Vz_Ն+EYeu- a:ki x貱|ZpU9w$V8X2eˍ =F%Զ̻GwD4tj7a'QJ)XJ&߷W<|:4`ȇDy\9M9(C-l#{2Y#W5&4Er^*%)\OѢ=~nDKq5_{@{ꇁ"j!ϯ@ =2S5̦G s0BPteK 9}0=OCAZ ijOn1rHJ$,(%.ag-|EM H18%Q G 3!`0*_|{._HЬ4TQG2rKaup!`ΝGѼ3ٸtgYe;9j'[! _g/ tp%I ` !Oo@C^4h8O(}3qz[KW#Я⍦jz&Ę7[s~Cw!͹Z>#l$,n_+̀u448u.AL"DAWPٸuVce4Chj+WپHC;N4X2gz~unLbf@.rI?Fg() pm3SZg5KQ8;Q@GM5L_5WQ egMQY5*14| `NL<42@9?,%`y?ك ɸ4 /knU~ǪZ\\3;2q_yciXz'1?~qWY%KY|?s}$ 5DͻPpc%&X[m,x 怱«9H9t.IJ?؅╺Eq%͛vnu ^;w?f("*6T_#l6PY'!Ϥp44}ى}+iۀW;ҰɦEx5piXDŽ`H`zQ.G7IJGD )ǍXcUժayݫNsQZzȅʵd%*Ȉ)Gr4i/h!׍c ̄6lia;ˀ0nϻ_N}8D:?fmH%(2cx4ލy φ|2˻ONkr9c-&3:>A+4T"PwYY~ΛFO(fQFXڰum;n#)lDI<_2XK!G?ԭ'ܨQ*"1uSWlVB Iingj'2l(SS )3|R($^ƯMv$Zס`9jL%THrL g Xpt.9(-SZㅡAjqVj~3yӘ[]VC:N"1 n AOH+ nOJS.bシA:0#œAj i-YOq^kJH ZiDbRMp3v*=;lg@ _)iOV^NTmbcyﯛ쮋]S m7ϳ~:3V9@YBV6KjƢ˼&{nν- ^IIpbrʍoTQעmo;9h :[*V8dUvgI0NBJ: >wiwڦKǚYZ΃ $> tnX .*i :EqOͥt}N {1@S+i`.Yh3RيM/. [+{Q Y3S/:;# JyADh=|T/3Y'j1o;]jz,w;}wɟ皚Mo7ŎNP2Q9epsjf,:(« $k7/ vV{E37 [A$ة"n^| jR hrļצ$~fRbc|LybM귭zу:(ſx9<¥ мyhnek]E⌺$n]5/2wl]1*MAa6'FuǍbHYkx섐{m2mJz>a$x3h<3<6\?@NՇoA<0IL lTݦKPb=t97 ҫc[##t,l +n=FlٷǏzîpby.&&÷u%Uu Qzj>iΨz\N8! g;x!4A*|Ea|éi/7`H7NJi<.݃nvqImQ*+iqo EcëJ`w7uLaT#)0pKtXIIi+0WRj^0hܹfɱEX{"[W xCaPk.B3+& 2u\Ivm)ebi5)%YX՗sɦޅyYlcS GO89a#,Wʲ' cwE>ɿ( K4L8pk^CJ @*pB\ l?uNh21^逊dŃ-68۟k {#v{B-4B[٭SС`wR3<,q~tHpU@J53fa(}ol;ڔDͩtozGa-+78Ym-y63 Z0GV6%#N8Tr\a:PM'7=LvS[(ү,ʄX vbLS :VWuQ;dowzGM 2͆5޳ֲ c]/?>/8[!u6ro^, }Rv܏!UboYf.Ѫ {Ϧqqz/i!OhxqMM!kvdGn|aIfD]FAGQֲ;a:Vl_h rmoMc/ @-R5Ve_||pKp[4;6U)G۫T[' [`36O`E*N ^rnn+Mhy  HeUss˨$4 |?/fVZԁlHVU;\T=vݷ>RCRʮ{oǀ%ٷ)}Q:GB2ļ"wFMF%9vj8rD9u Zce O:y0 SrgH]ppp<ؓKD44gA?W3 c$ksYԦRV"yHƐ6F+퀰EBr۶4>tWpW|W=u<So A+2%|reLdf| ?ޚZOAQN?>rYnjYnwlobО@ES'xtq|!K|F E wW hݣhuwh*ySK;]ka gӵ3 8l a4fmGH!&^[[w[`aÓD |8y7=:];Ƕsl?K75]%FA83Ttmށ<E!v;(M6}9Mb$T ^G# 9ߋ*!w 8C)uzӳ!rC{t$v}ťXDK6(] DjgywtWW$bH">7G/+ZVufj>+8szt:xD3! EGIqg,ߝ4׼ҎZRN ` SW}`{0 .=h6%cɖP\-W׿ 訝FhY;=GVOG>t4{Oa@c@"f`x5GWL3':m+WյSn\-& -2`S vrigi;G-?t}c,Iv"YzL6W.z ,)0btCv` ށ4{T؁,J8@1\B% i2c:d?OU Z4rF 2=wu؄Ϛ}\,m3L5Z{>a6"?4ݗoG.3lJҞ9Ncԧ UÚdw#( 5X}_HqvE8(`G $"@Yfr( 6]^][O;Ѓи.!{s1T& xm7 4jz#e,S μI;27[T3i<#If8)(mt>[VLgđT g2e( %.c;0K}i Fh -7AHfW^ؓM푩*|Xf]z+\b͛y&Q1Cjc D_|ssMg N +c @ ߢzK>.1k<`'(H$?> Ssa`2%l҉R$Ѿc T*Gm |Q!jCB &iI%KkD:ڽ&#7/r`BF$>6ۇ<[`Ro]%-MM2r"ǒ :pW75yL;72邪W%Dc[;5sx@]p0S=~!=o'}dO~9%e=YJk[J-_}rp3VO(J;{y}EH*Yw-mWAkg喳,Uwgs2.Ze#í(;eO]iՈi[Tq@1Jjy.'$– ,2cs[ތz գ-G虦F0xfѓcizАN}w]U8'Ƶ]~z7;7݈ihɍ#I N>㾼'E.m5c\Jmz@ HTاH-HgE1#vZ\"|_FjAl!.6ݜ\ 8fWnwN*-1U. lKjwuF3.Y7[Yer̾C"d\`X 3jρH NNhRɽW>c:ЦZ=WJNJ\f v.ΟD-yRaJw qƫ?~FxlS`߹ $ oLT ޱ _A+nDr/˱􆂨R)ҵ&%g= \ x7CwH[ ѓ, bD`{!6aQq9mDl8ڡlzB׎um8OpQ{Ҟ%H |O!" 2ժO01lh@I6,ǂ+Nۅg(+ࣰɜ;,6&q=?I dJ|ǢWc:^7TDtU-X[khsEN7PD+Jּ "m~vɧF jwJ20/*n2[RFrD%3;#@PSaUf I:L-C[$!vv5IV,ReX׋gɛo# zw.2fHEt'yKtjhre{/{k~1ZrRT%i)^Tq\-RǙ|"'b|3Sg!?Bz%p+ˊ)M<ͮ,'Z3b|] G9Ȩp]$\-jvyO]ad7=ų:^7y)p6*-yҞT1^;P߾Xސ&O/qEÖ/Wa ! -TuWh+'Nc3bWΗd-ͫJW籾H0O)ٔ.6Ρ͖Y$$he;+-}%|WM"Gֹ}nO6EU/x`5b^,? w-G<:3YmԎE g%T$KU-cCYVVaid2FcNk<%' ]Ig@UÃd l2$X9ߔ i* `9 0 B^vo^6u`2H'CA 9LTbΊU5:5wg- l-ǯS"G+sP1%s5mp~`"wU1xy4xR5یetH ݲVK=bCM,ً rO/@cZFSliqYpwXX!O-.Tq(y |[d̩S'b5_Brڪ̲b-.,QtyBl$TTM6T`Ю'"k9"!-o v?qB;7lg{\@5IZϿSp]]Su-Nl*9T[7@--ЁD~|ĻWo/~ƅ,U%!hw=oKQ`rH \JĀ0B*v(jnd6o{WpFeR?wY4D!h,=Mp8Y b"]ha;0kHl/e8kO \0̡gr8ыjͻoh+5CBD&ؙCf b}{5 FNһJtPD K*^ mj3gD^6I0 %Cw`Z4ú~[uG7Par;|.ĺO_9FYA,~wR <ߺܿNV5YJ }I˽o`|$ >L,Ãbz'@#>&0z\~[> S%ysfڤL?D= w[ӓhH#J*HNeW2 /':y)lɺ9ROoP=sjA=<#^x[GmE#M&~J`9!EEb?S)?¶G/ocҗOֳ񗂒tTȹ;Z{B` Go߳n, {TkwI<_4w 5h:3:ul>-uKz]EmQo1rje|luyC3Bo9U}rUO` d_FkN!" (zR 9m`&ʤ>QqQofoʜqGvƖa~R?0h+$7ԯ}^~PC t&=@;tR@4ŏ9)\mZJMT ABW*] IhaaX@sYc"=/ILXdP[~-oy*V_w>RhԘ &H8(kL8 $hUE% 2ytb1o8S9(J02#+ӵ'Qs,0Ǒ_uQB4Ceg8]=,|䇇0QcptyVG\;/]L/yǁ&w]:=w3\FqȂ\OAi!̴$ű`YJo(GbYֈ d[̝!y[CVI yUt,t{ѹy{q :P0ɻ8HUD~hN`w2 R?}n &Ņ|kݩ`t$!.*ȚTZC7JPx3tqym~r'Yc9{XQ*"+˦|'m)'d^$,BI"鈪&@cMکvYfaӬUʄ>qW2]VYbR63;D RxScYjӶvq_:IQLm2t4CheRC=]I)"EZ3*69Gxɲ$KzHsՂlǾշL+NbEy v}~JyZInݾrͿGꩿx'ꘌuP·}ww='o)-ɡ=; ojac7ٞ­cv#ۂT#'1b0bwLWʶϓ$Ң1c+֬ԜJ;~G P3\:^Zi]0X0V*Qoc 6 o-jNd ,,JUT\`Ia;vC$f)O 7vB4#f͢1ɾ^ i"bG6V{N9z^CBGo_C2!@>>z06i:dOמ{/rs>yʦM仱*TWE*oKnK8_1pA8+J#^y玄Vi+0֠׌lJoKPd:9‡F 8#/a3^Jgrza_9J+i;Пz6P e:3F[F#^h~Úg:0ٽؘ` ;UG(ՆU4FB[3֤J\INUȆ:6QrMKt; v`'y DImv7<@!@[Kh'*TQ =[HuMNvtg ےMz i#PФmQ5JU< .FNx%sl:pӿjל!]8rV  xMaЭC\V/Ҥ \Pل =:b,/T,+!GaBD8cSOsFjb>A+zaU5Ph3}4`jbx6>x~_Ê MM\rz,S" ƖXc;| _7c8deѕ \Գ$%T5vc<@޹2WP U5 `c>Q2| 8/Sm;]*| dO݀փ<͏<<@sTx}8OꜼR E>|뫽c K෈`_6;OVѦR^D[}蘃@"ʿ0CHs<4AI淡MZP-2E(E=a6L>Eh>dpTG3ϑdwۀ>cŘ~ȩ$-HAXQbr "v|ݭOӒ\y'6cϴ/SRpck!(*V̜7eO92RFϡQڡb>>qx~n)iqbGW*"7Nט9c@8{" I-|O1 tPIQDn(~1Gsu ގ;/s"lpΚ[v7PdDBCa0є 76 YyHi1Z|E-⟁_< Sy1i`}`NRRŠunb)p(Buـ۩Lҹt ~!* 0`W\gay=}_w%Sz6 *Gg)DkfR%JⰤ'iZ# M#lÝy_jO'\@b֦@~A5,ݡv`D೩>:WXe"ǰ:KQ^j?gP $,!8ōğXcs'oLvB:m;LY"{+_Yi# a~n$$-IlWh~EAr~_&W׸齈bѽuiy!2K%m&\0PgZ|k[L9%E|宮uFdьlX&Zo29ڒNў8`;L8Ba<\kzJ9Bd u69eu__@W%Sܗs8IzoH),$V(GB"Tq.l*ΟޒS3dĭw cp[10w Ys&c2g~#O[vGܵpKT¶C$9MraZ KLj~=Wۦm\WU$-§mz{v=+l^&j?CO/' f5y7HזUŝq@&M~$=Lc#MMu~Ȁt8\oSʒxN{<[6:XeoGoBw"&`Y2HpEZȱdS][k fVa.n{/|X8tRtow/WEy,nDx|ToΏژ-ޱ8a呵 dOd/ǞLcgM2)dK DXfYά*kTo`#E9;X"yMBߏK7R@pEgõz7k|TOրJ7S6R~ k}x0f7*ȣvaw{~VZ/DG(7i;}g*zS4'}i:`@2e=,9z$ e̚l]hQu4-/ tR{Li<.@rX.3ۡzg"/iV M \B0]nm@nVnLƳIġNnQr`4%i] cQwiȵcV,蘳 }oGW'WA$⎇)P\_P~/66R9W# u\rP{ϙ,-Fqa5HvgCy^Q d_*y:J= : kDY{ߜ2~֥ͷ KB3 W% EI<eM$f=;ln8Q1mRoxN*?8)ۄ0nn4T˷עiO!LW:TeTsv|ca,Er ܮRɵ4ӻ@!dLa,T\I`dr d \Msh2&&qWX(En)822)(0c>j3,[:&=y(h3,_ⳟ՞"Z't?29eiH L6e ytyGEʉ8fJڜg5Jd8i# [@8^#{| ag.߶a[ߑT)fӻ16 "붗"Tҏ# %LԠx+#nZ_P I*N8 H>4qJx:vtpQsqdp~eK=70HOZ֭u$KBWI70fQ Nvg>kd<\ J (˘xLZ)h)Ļ0)St~BoKCrSMRjҁa 5PVMIcX,}UX?6Lq#fH9&78~FEY S0Mr.lrm؛a%R1,߹<@m=Y9dS*`jd/0l{X^ckN =hBc M'Yӱs<_V hE?Uϗ-hSVQϿP^uWw ,d0/sfLٙH-+_CpJ,&a:,YgqMh j&^XxQz8(h2 rT0ssA[r6+8z:0\k/P*'))mۨ")p}f½?aqf:ܚg2O tg*(ZsGbmm"MW5떻]-tXh0ח!Ȅ[X9ýS%tjB>ېKK,;3IPa &].Uv TS۾FwDj0֡ovl96Ag.?kA#?{_ $9ve"Eђ{܀4]Sl0TP@ oy5]Gߺ4mˤ,5\`Z+J39 η9O½F~@b[ZѸ$NJب@^7Z.E:DSv$]t!S9jkUt`bPrG!)Fqx0gv)+Qw/<#{'L'V~ugt鿳htL%VKUi+2˩,Ueu-2Oťm;P6{B }Ym`nZ)?1q'\ ]0kݸ@Jw8"{Ǟ2CpCC{UϞR:@F]aOŠy)q5@0lBQґ'D6 9*${b̳Wd:R6ItXlavhzE+h\Ā/Tkxȝj;#Gt=:Nu\W>LYqQkG'bTwO 8Ųf|wl58؂Zݰ]ޕƗ,O}WX-c XBrlyw] BU iΩ)euH ` vF'_YDEV}UzۄAIE>Vڈn]?X:{? 0;]E$W UR(~//XxX}WIjçՙ%i ɍSPܡԔSni%Zt;0>m)jfV9inudFq5na'8hHYHy`9f>q~F+fTbxvDwP$W4[uUm&9:B;=ڽٸ4 z:?'S%x6LhG-Co(iGp>ʷJy|jfYW運Τ[Ji^!37|H-V&GgSAZw& H -L!AH/ BcRT7M8rSı}Mf-ecW4nhKxJElҀbY$j=H-Qpz69|D Tq:޼0> p+#5wjΩJpn?e.ųS{XiNYL,StȎ]eqDnK%&f*oy53rןj} u{nʭp-kevPi#]^ID.ޜ~3gʏL(0 i:߱KKT$ude9]vw-ɸ yĀPa>*\bQdB{Y+ShDv?JaloC64 됽JoT,љR5GeX6ψI^RY%VMK@:~򨚠>t }iJZ9b tV*"I!M;歟W+Ϧim[úGS#;d3xȷxjQIQ*T7$>պo%ҩI}+`L1+r&hk/uYΉс.w(e6P3}L~a5ƶ?Km|6<ܬRy:VJjr K8{&T} cj/!aѨD_U$K q3j{wQ}k" 鹄a})PڠϭP|!U|˞Yhu' *Lռo!3Yemw%.^R%u9R {aĆ>B3r> _kQ/MՕS<%N++ppS z0i(/]DX-0umC]u/gz?P9ɀ MtSu;+LG])3,D]5T칕~;TV0E H$P/^\2V1)op fʫ}.$0Un Zm嘨nKE> ξ7 $k-\>C W6 /Z=ltbG;Ff7kcwV1٬#͸9& ~jOJ GtAOdz{m^Z /(LXKx~e3@G\dvkboYd%dM;Q42՛LCh˟Go2 DϋU/ZCDx\Ǝտy1X&~hfI=k$S2m%E3MmZ-Buxp@Z;L[ҩHiNiM0ır]?ѥ2CƝuTe${ʿܢ8Ph|aJC .GIwDNd-o*5()gډbu{jZMtEsP˦)x4 čhn2qSZ-@ B.so>[g zQE ) Td."RZ!H?VC˓ !Lc%3{`?Պἥ2eȕRz?ۛP}j(iHmF'*e~ŷ_)Đ6̌3_<#uE} ؚ,_|:gJ%fr'-@2ToO?WfQ lUQfrJM\ jt'īJ!@)tcnR/cEi(5n;`fz$]>S`פo("n=CL 7@3-I+r wYrj=<q&?Y6_,D#FW!mK@ƣys7Z1.K%X6̘{EciK+)a6T7 k_kyD穴6@'V2T}|!)9z=I][} ?&;:!V\+vQ#c@lVdz žnsh5FyUt͌潟4?ra \Tآ]qCfqMhzd1 Um{L (9wHzgDW+{M{,b':4!X|{O z':`xaiM$^c=-=70 g>׃W7ʸr~T L~Vj4!5=!X//Qd1X;NAH)\,BnLJ+6/rBGxJvX 5f 2(Ez$Bz]!!"ҸL}rS+^2Gk 81 eRB?I7<8a&0(_5;D;Rr ASh*a𡣲9{E7:Nȗ_<^pSȦa׉6d$j>  *E~5wN_{dї$ym$dyؚ\Oă >T8#%"~V9w #5p4IP KJGkyK'hGHV6[+pG-$ے:4S2We,b*L=4Y(V^>RkonQ7j33}t[-@V ?,UBtOE) E:9ŇMz![VCh2XS=P?etlIrkԌ{ԡ"*mGls! 2"1՜^ V1;g1$d\ή\b6 wb3aJY.rASW ܁Z)ixd̀b 35l$_Ͼtk ʸ eHLIB$V0CnOUW;ĉ S " ]yq(z:L<Zf6>9a,4ރ۩fݦP.hl F3;P]ћ_i 9}ޙ'-5qTKܯ "f|7kklUlm i"_N3h:N%e^]dUSh|ސ#}ܢ嘝W0J9'r}TK|jh Oxv#ۋ72f4go¢o l?xUfOv>Kw}9aS!9xɪL $0]PI^.9ӕx*,O҆)WEz$Dbҍ%o7"/2m{hYoGq(:a'uJۯ%M3-aEW6N;S~_FH|5#`:TI2 eˋ~aT:X;N &i bU2]!- Og;HBJb9a?Ϳqx^9 .JA醌V)Ծ=G&{{S&NKF3M!L, Xh`bI(b0bKo=q `s.JEܒDJ$CћG];n:7&NSsM)޳[;!Y?a^wĪc5CBUP,Hv۫[i%Q|;aX Yt%͂z)4㝡9;4BW2q-f} i㯡Zqi,Na h4/ wЙ7#{n HeGo9w~Em2ɗ`2krAy C4&wС\)ֽF ul \VEU8:M]pW䑦Ipɳ}lpǀ J6w*Uوe͵{kj- 6ϻ(2[$Fz-7Cg'/>TE聐b9JD~ 7TNݦ:7g{0(@G [ *S7 b٭-q{kx$6<8Kv-Y%^}?}-`9^ 0W 'Pb 8fdYb6 8u4o851~Rk-~ >qRJC9*}D e&l("w* aZ+x; 7`+7բ #ʽX|:f&ۛy[ núk$|O <351kN=IUDKHhn1p@# SxÊNVK<~vFK]Ut@ψC=bRp729:&M,B˳㼎Zx?[e (|JĪ^i>]# ֑و[ߕw4N=҃DkZ]4v. -}5"b0h-B s9EHb&m)`΄aZ%cZ4 'FٻhG^ָԿCKE+U@T;3.v!ݼHҸ> (,|-_S)6P0*@B}tCdrYlF1'ȳ-(nmjS c{M5R7C"Gza#,H!%@Zqe6Vr`M2VDKLZI}aaP+I@! d6\ }˨AE޴M8nxH@7 {i΅Dz0%֖L$q[-7)R-iJ<^OyΜ!yǎV0$y5`6ygLL k5dS=ad UM! КK:>7-roQޫ1n]׭S_. -jL,k2Qv} ư,8{%٦beWdKTIյ;'T֭ː7G:J0@&t22cqMQw{Ivi~'vWNb$GZ%H%C7wX>=;)dI;u^򊦑 '3'6ZjoP{]ۀJ@~ 0~wzZq64vK쾴Nxywۈ,>@ 9csO\4ZzS)+ъAl.VF4 :$+zB/5b<~ OM!-Ew|;ΨJsA#t`_tW[kzW9??kVXĩhG̚F.-xkR_C?RZ0}~ 1k=ZCWa9HJ;H>*<KB7~gUH=9XY]wD砃AA 6Cۨnw!,e|RRVE)}܏jᜡljzE,`|=]{B]ukU1lM+R)Q\/_^cXy*2z[TqYY-`\_ 2b4 yHyC0MԖq ;7sSH)"HES[qzT"aB,-=m^\*iwx#y&Bc!QUYUM1\oD{w@C5r: 6/HifIhP<zxrʖ Lir2oh]$TtcYQ>b=jL5˷iq)TFB^! UT-A1(­Q ?>V,~I?kj^@hboi72nC?]]C䴞Ohr.4gz҂W)θTFLY(M=W{Pؒkȣ] ?9=@l>_}S%>ˈ\IG:tɂc񶑄F:`(Ĝ=*RѴlOz+ܓСnC [G ͻ\M"@NSQ@f t |uAYc3Vt-^c`%PʎAAM;T8# 05}.Yzps9Rbs`pEBgk"yI!if̣C7dڔ NJn+uWMYn =DT\^iҀNNwk\ ? ܅`sܬte2^wUS$47q>)6tl2Ō.b'ĚT;5T06XLЦ3+{YΕb )^K&h 3q e ]3TE{vN fV\sh?KM4P4 $5ƀxWee9&XΨAsC#Z![89ӣ`O>Kՙ؜F\in(U?<2ꠦwR#p/ue3I&fEjnoE&Rk %q<_]*?|..5jdx]YRm/dژid#|r LNLbi\0 h2-m*vWr꺀6ԥtEAd&iJ#6ؘ(Gv~\{"Ll33z4U>_NοtSoFǜ&Xt^|ŏ?~IQ;E|Oiq`D˼{}jnalbwo;>_YO;́wX!/xx=U<ގ="9f"2fgCaC^|=hβ4aͲn/Ӗ t6MCehmRM 1iEC_c;9ͧ`R)a n.P|NN%0/,@H H+M ΀9HοĄxEJ{>yӤI$nA-͛~Ƕj|0|U.O>2gz2jV:jZ,ʲ>C İ`A ZRْ"͆7nINoz[2wscE0c޾iHUR3H|^krńcZRTԯZLyW-ʫ3Q^OHoV8a N Vbt[rR||`[E dmWHÔ"D=19 X![˅7⮴FDdVtb %pv1M-+2i-` QHvfxd` ji'*cVqiis9 qI9:OAh"Jt7Uvp)Fq?mxZ>KX[`cAi? S0c'1++$#tزѓb۸1!M<+= ȣ(b=m"iMcQJN "۴cΤ$HAb}DS!W/Y@h#t88 jH7`}_^&d_D4ūKh+[|ӿŪ(ItNw/!3OYNbz8ܺ-J&u' @ si9;uְRԶRZiC)者sG ^%4SMBcSl"<+ݪdlF op*#Mߴ2u# e,L?M`:`8:Xg0IVO8wN3RYҔ- ޟ iIJĄ}5EҨ T}^ 𢌡O%Vv>Z#o❗js̺y#n-dE!־ࢠ]f@E [m""лJ4:P8g8FRUXdSlu N|r}Z*PPj9uNX~d#gIhnxx5kӢlsB#k0j!}Ɲٸ5TBtV0򄌘V 9^ ?ېaѤx⭀ #,v;K$Rm+Ovbi0>2vyh>"9jX #+悬y#0E P'Cy;'ǶfK`AϾ aE!=gJ$91f*Bѳ9Xvw`%bƣoG,C3Y&@|r <U^3HyNLMaat&^L8Y.z)1$l.\o ~wu!Ŏ9mm{)~pjeki/aqWXvmZ{#c jtASd)gcvz7Ak8"{! Ou_9,~]6dH:#Mh>X'h" LۺMk^jj3N>Nw(i$9p iDi;1=GՌWP]{7S /\ M-$6xz{&v3$AH\зgd9Z05(`}ߊ#vU0?Mj6'( qȕiTHkuF~^MMEFV} UWb>#@DƠ9[HQMtsfowX .`e6[[ij/5zQ]AZMavjd.ñxZi;9&6K^˷ "\FPKiJDEyM1W8>(U 9_L<˓:ՆX[tvUV PEnhsY֐A{x2xw(dc(noDfQ)KABY{\=6;\[jk>-M4+^ZgåCT sntl$NEӬGdUꪜYMkK}~I.3i0)Ь EfnYr,^K(U20"i>Ewz b ɾ-]x`чX܋ŝH>fze>g [rN:Il"`5Q:%>K- 64^QGDx~VI7BMd|(^tg%hHw=c6f2+ȇ4ɪ ؝ %>Bu{ݝ!2vG-Wg#&/S6wX)հFRZ)qwjܔe/ [ONlxG63A/(xpvW#dW hS`n!K;Ը#}շ OЀ7oX2O C:_1x._-J)XwC=\O * -hd2+R '-`n5 odȚsRe5J;jvFQLI͌W_ Q2JY3&)t4n-+60$nICbj)=ACTQo/}*K-!+,C}-s-]%< EjE"^mbVvHeݓ .kDeq% W@ EJzˢe=MP{5X/V-KZrqW1\'/eol 'kOx(^pCF?הnw䰾|ry*w3ngmVupvÂf+A@ IV7:ܱUe,;h&"1g~qǶUIS|]p:^,#ÉdJ$CxY]qPg=;``3Ѷӫ5oj)Y?1R3)@ ܳ/ ѻ1U$a ?02VrAWŒD|t*Qx8?ޡܒ0S#oqMVBޡCC&"WĩFTR>xfAge_rS=.fz!< df]!(F߫,Iżb(BE=\iB5㮭[ZaL9d}:Rkʋ7M!p3R0BFuxa"gB+.8o&nD,Ivb<:D۹rׇ 'CyeYMjW$-ӭ+qꆙ= BYhXJ_<ٮ2  X]^K/5%c*yMM.-@RHLSLde /(KM@-D0Tۅk]5*u2@ق)ȂlXxxDfcZ܊=B|gF{l–1e{u֥ώ#Npakij!43qF#&'rӬ&,|9k?ğY *LnnC}l YeIH )6N珲BZm.q:SkKy 6&~ȷ?Ӈ;3e |߻:J|hl},D$t#(,bZ]c)-8+:WwojT) \?4g@82gp>0 Z_̒^GmQRTXf8V.~l @[.j?lӤf>AH8a@+6UxuEDru^@LDlk[ n4ʹ!&.ߥ7'h'(_Q͗",/#)zs_1Q`,|8kdhQGhNYkLMB: W0.\YOD0E bp7fCp!.bFx>C wpdV\Lޯpݫes[} Zeh7Eӹs*fi['x> PWj"iMj>}GP6ɫ6{`lK%--",di iU(=}#,c ? Ѩ<& Rc #:xώ6gRH^.f4_q"TY. b^ۍ*ϳuHo7 L"-a}Rzal37 z#C\|1K_ELp˯&o{H o&2GxT _+S '[t#sfr+ꎓtZ49Y9[$qh.߈ww+)X},ӷF*0ԁU#{O]@doZ14};o#e_X-^rѿ85GHxuDw5Gr$=1L,8XߩT؜I&IFgs,׳556AZr;!jk[ 4S(iIIՋC{6YM$SgU^:,֞z&`!'B 9.|4idf&Ųy`^&:4*q2>!T.A(1t Uc ߂0#.וӣx+$~&͙~*i:qhݚqFFA{]Rf[nƖ5<')i9B;f@Ë&W\Fs\K=6V?Å;bM+C5-xc,z8r^@cu~Wላ#|'#ҸZEL]1!hנ2Z^n(/( LW .pE 7MO3C̡G=@88}:r4'izmc{+XyGXȄ9d]NUH5?z Tў_.\/%4_ 7{Sa7P;&HDƖLȯ.X.azG;S~y]>zyAd$hm"Nk3=vѼH)t{$f+T}׊2 cn0 ]XUU&+=bR7>^`RHMRI`)m[T,lX[& L28j+JRA+y%ʔRj*"odaMP@z Б.̡C q3H㚾XjB*_F7(fKKDf%-)*3 0.}eV@Nrp0؋c,dۂ*Ndc h"iۇ(upc}yW >]qo2??LJ}̓q{zx$_gL5:N7MV"FȄ?О)of56 FuXR3#*P4X؇.kgha Er BU6obi'_HRZ7CK3I:!jG! ~,FɿFN*>uq mp., }B31s[$#usB׹<=2TUxFSLʼLLU#Csq-»>$t\j(3RpGpC L`|< b!a>7#+r4Il8jTe@Eft,Yu7Lw߳`v )z?)Եa k?(:T =#djKߦ8_Ӫ(oՁ;)ZmJ\| ݐq$9@j/{KpCYҏ*%˃Ƌ&gXk_jPZ $0)S6?+TƗ<**ѓcAf,ڞ5`&{$: >' Gǃ+KYd,"U5:nkmDh(t&0 Ҭ_!ZUBŇ5Ϙ2r&e_#es \SUI׿a<%O2:X¦u팥ka7J+P@JrQi1<+t(ݷs\):̔5uxi5Y QF,bc1kdw4>:t S}sCXi:Fa!_W]E 3$Uq&Wn~Y1x1 4(ִ9.},pn?)šz|pyIr\&b:%]is=;wA6*.N1ծ+O,NCze"ef2QypS (&;M+Tv]k݇1n|wH*M/M%"f?U!KNָGR4wxaDkG(39""DTq%\!m_M QS\Rk|c!w!e2Ma`W2'eRRc5_~;zoEs96gdOg+46蝺Ypt4qi\2붩/X]umpBנ\(_%!#^KVskan.KRw˓KT~&CzX:^@kJԃb98SuyW;dt"9@UH@~E."2 V㥭0 {u+X$.sݵ \-"[sSd.F=l\*/ сDW2N;^=/v;6jRbsVcG}@||T~<+?a|1ʸ.(aΘVu(pS`^_'`Ѳƴr@I-:BE7EkԖ>^6V8GWxf/]y4S? 4 &)C.'Ŀē4_CrE,I',w3 L dzj}7t(z44s2"JK̮1G* /ʺyrgShf{TbYjjnP!t!ng63D; -} 0L.@a"vV h#-adƎVSQ{+ԧl 댟D(ڂG,4[_C_n&NtAqf.ݾ~ᡭO*4 ԈLv_,qmH|&-,mH/8%8Z FAL>_!yԅ?1eXbNOL_] gnvm& &g sA.+(7|ʂyђMTaS#]/NP"9>UW&%TRcL3ߒ86!ϵ~I`>g˄C1q?Q ipo޸~|~岶tɰ@d2OKoI<@Cf ablrD 8'YLm>YOr[T3}DefB\rA7%n:^:%U١a%Itp[c$+K{y@73vby5Rßz@OWxm`#dqRʝtevI@iϫ3cq_c^(O> |VvD׫Ӌz:T${ϰ"ꠕ;A07pUhOfmv; 'JWԐmٷ)HGu2mZl`rД1.ꁸ{poYqx^dl͵ fŘZ38dI܀Za$=w2 Ơkg/^4 ۆCW!"YϭezW- 7A7}YazRUmeK7xU.c6wWye6e"4ك Z] DŽa!;R3B䥛0Eb% ˻I 䱱;KM=ZI mQ$oe-2$DE!髣%o愳db h:E %dpYk4wHe&q9GQ~Hs^_Ru+'ޥSؘqXCBtt%_V`39Ur=~L7ːg4uc_h?"iͦv&ĝ[5\ٳcƢ*_+!R{"P>T-Rm:ww);ը0<#%j %]Tha\tk߮qq^p Ѫ˴M,tԆ[0݋uH;}Y5*ڴ:f[7 =&n-]\5!M5Ij"L}J[ {?~= -s BqXCcE6hZ@Fb'8&z#?9sE4|h1^\%(==WW}@Wc_Zʺ7 ||Ju7(V-yXkfȝqBhiCv0 J'nIvT݄9 9ISTtR5*%vӣM^FrQaqcbF5P.!&Ao ,=y\q4~g_+2ﵪ8}iWpkWara]*)um 157퉎I=u|%!oȸ|lL`x [Fn>56i5^oR'BؽX[Twx{ABm3[dXJ:FRv 7Ѽw(< CcϨBpؗO<]w.jW8emO%+M sxYZi²gtpv>W Qb5iyȂJ6r8+f%{E#D9?(.Pj|,|O߬йWb-b7$Zy @${g|6ۀ\a9_9!kݿ _EŲ,bz](jw{:xnCo~w+͖D4ЩdX:M +q9kAhqR&jD]H4"7Rd,;./pX.ؗ\L_! Մ4X6@WXjԗ^dvw3݆wkTXKNI\H 2WS+^Nllq_89?ruD ѾĄYVY*Dvԙ*70 +qL2|U[89NcufP&.\lE\e~7)Mܾ*.G$=ףygLK,rE|):8+'e(I˿Ҕk;'MDri 4Nmuu_Ѩ JʷTndd< 5bIai&RTQS-[G5P#ӦJ{lqn&ms_>A>ufC%cΕ%y-u1wgR1GE4,ec)œCR誺[ l d$ ._cHlGYo[4SC'sNCydC4ŧ:ҵdQ)PWWmgDEu[CL9 M[b #NJUi.EMēnt?)=C#c*8QQ&I2g8iinĂ@U_DҹchCL7?l|1 HnGl1_4ƕ1ȔX$  &&bR>XZ-x?ogFB"J0R+ 9qW04>s/wdn֙~9btʐ0xXH@Ovzthtx>N كuu 毿LM:KҸޟn+tUlZ_{ߦ|~(#a^03Y*Y> ?+9HEm <k):)~h7ן)r!b.%>W1.-npn"ϟvO羥?%Զm=捐§u!hel]9)TnxSa Vrh  +l[5Tt;0`bYR JJ`yLrPc`NG'lJP"N1$l3*f{;D^|M t&~ϝU}&V=|vPP.:%h;͔o:- "~XJ:GdG/illf h'X:/g2{r-<&/X6_tTvȆ +ݖ*[0iN7!ʒ7 k+yz ;O8tۈT !v m4HŸa컱$~9fيޓ8݄Z<݄FV`BeuJ4,ѯVNoµ)533㯝P>U%8:jFnT/F<`3Ol J,[idD;kg^t7i`Z\k"Ц5#d'RK7p4-򏄔t`=pvz}·GIk>vB#ҽ?h̄! il^+ei+-Hۏ# r@<ȅZ4L'>*rB#}u""rƴ^ӟVFM.rp*I+z$?TBݰ׈%"%wv{:rLzN~2#Ə*3m4בK|LZLfas, E[ 3(-\koqv뷘N/"@D(L8)-Qȯw6x?Ѯ cui&hx3\ ϛz݋̴jNz79_lN&.*{!5[*999pRu?'l.asM9ʪ,/}u=߷/=?f/ RZ`FLɳH;]WQ#eW52{:\7,U'I:v<5Q'a`h$JYFe"t3!; :$$5U^ >ؿ{0x3iS`|S=!*Kϭk*nڃ+pW',["cA9S$aS>5OIB(zPAaP)>R2i?tkc<3/Kcl89RaCd)zVUs-fiP&8k,NZ; ӏE+y1z1$Ew^eNRM}鄞EkZvV?@|6^ 4nݪkt8̲k ;`>r bӀɼ;c-$ w|4/p#2af% ̈TFȆ 8˘QnrƉie|*Pl l[U= 3ؗRS܅-9X wd@"G&e8Wۘ"wx7kSe ]utsA;!~dn曷C3r x}x۵|nuO2⑪Yh8Ty"!+4۲j`4|ӝ>:cuJѐȯcD f4TfH.)c#Н_C]6i2@X},|#Fm[7H9uK\VM9y)wDvq$ 0@HivxԿ΂[6 z@zJِCSj_`BS'WsFzI~ۏ h'З29mF#9Ȣ3epMm5rծQZ"}hM߾,.<5b;T|# i4.b&T CVd7G%pUg%P<"-aε=^"mZR8"H^ ٔj]/GY:O-`&O6- ѼoG]/?zsPcDkeG:O1iXLJTϴqhsFHRW"pdLMU&"(>R ^-?H đі k--OSaQs)bʓO .b[= \&G/j͑AgdjC gZoW{MyK pJ?Hgm(2*ѴI=G3世P<$/֚FhD 7Pu?/$ӢÙBxicB$03u(yY6pjJRAr:tK@Uh/pϘB]]e$WN{F;Z^_V:N)J >U(E8x3vb;N_ 1Yk͵&^뭛 #h6im7 bN6[ƩnFFLR1ug֏?>~LjIi:)tᶺˑE5wx}!3dA)|ѩcQTэ zιD@aG,5v^&;ʘfRXNFare~94] w%u`HEZtA 8#A2ss&wGHOkB&ė|",/>#+>`>d,F.T).k wnyI8kֺ(0Oc}I  ՄyHK~;L8x TӀ/b*|o4Ux!QiIFq/Tj̰( 4P#+] ]Se.'Co%J#ȓOb4pqxhZds<6Mk`ڌZF9U!,$F;CRQ sAr[i#/8piD7. =AsShpGKRpwJP,'HTT&3b3Q2 [2vO-uQ dh lOr~OS3_.i).вF6pЅj9,᧻Ql3%ssCЍG14慀w%t{gc߂%7:tشVq3KZdbk/ JA} V'gОMEtbއE||U(G ΍}A]o`(U0`?7m3ar H$$݋%/6(Ŧ؟QզKO!DQyQDƶx1ABS3=Bo?ۯukf^pU]/lo #IWB8 Ř0Q<7>+"T@78JO8 YEfjk w ʶab$r`xQYC1;qm>&eV!usk9X6ITCcw;eDHׄϛ7Õ1F|?/XF3ۇI7<\+=\Q*.FR0]uNyH9/Z&|;܇Z,Om1ZߖEɰ2n@Kvb?hO*gU^KݪZ7y/9'%W_%+>ˋV^ƟxD FqɎU5o˃NA  K2/2n$ߴ{ŶK5a7tT[ 5I-@˕tȶb;X\yZ QlC7QR5dI/{4K9mma޳'a”9=^-oSfyN#XTPxgB:|V =Up}}12ަ3Z]ѱ5UoO1<2XCf-㥁x&-DD=O[&CrA/rk$݊A58ଝjfrÀ7;ŤUf.E0ˡh̝P-&ex|B*Eqk iFo)^!Ç:a"mɇ|AW3y%>X}xB0~v{wܷE0'㝑n,Lf^ms˲ T>slEC7U:_+OFƖNBvoCL~ͽ Xn_2>#4&ٲY^?{$CS]P~τaڨ B@w3;ӵά2΀*e\Ș(su @cR3p"ЋcJ {E-Lxm=| RJ(YXz{3߹)fm$$Zp+Ƶb^Zϛ*n q`ǃGlj2Ng?9TrTSUlI`<#'|4ZPٖR> ŮZ<ڄ!Wfbyd${<_>O"9#ىcjibuQȡ" 3rl;hRmD,&aAռox矟KRi:aR@,To?-x\^>Va;*LhYc*$D x(]s"xJղZ|L %r+K"Z/*qRV5ߏ{V6iIB]z9w(/yR9&9jp H镹™464?D =GefX{(!c2QA;9ʎ&hF;cwlli^;T_V^MM@QJG,?] ;[kBı$U9.ri!! '}&AmGꜿf ZPο𝿉[Uω8ב"`$dW'>kTC 2'x${);fc":Y;`B3P8LȪ:(Qrˠ+~@g9ecIOyvÜA^mO࿱SA7 +:|JMqFf13Odp3?!GvRo34VtwjΧ"3ڿgp΍R-|#R_`cKp^;+w /Խɶi)OU(؜X)wd4G9ʝkQwvt+H &U>9c5}ye4:8/#5KE-h V$4dh)8ep)C,r,ԻFgB9V?W.?~\ }.0쮼-yT7K*CEu|Lu`cTōףpqAuf4)`) Gko&,v9.g[NW/>>)-iwy JF\mT AoB1~L)|71 p**ѷC#)gM~  zGwxRTEUnjw[5C{DS2vPy>f2QHP7,,>*uSSQdJ:Mfm1wq#cmԠ/qUpŽ[=\9̟ʋb'7Kh2=0"2nP>f/Ac3<:jΆT~3lvL,g_֭oa:V\5(~;"} 72:%8ٽ l ܡq'jk  LS#K UMr݋}vg4y 㡥3z]j HޗQjT-rœ:_1,A |U`B,CξеleD@/uyYAOal!%V7 "sC1Yc;dlҶ #u2Hf=4MOi! hY6>p".٦z R3/0r89 qyOMF!\n+-hf S( ,RT8@TՄTO/`Dxe /ڰRh]6ԑc% +ߴ#ZXK(GVU[&yxBtâgb&uG˹~.)L*'3G$(tHH;S,e*bbVT%ExQv@vИ2GKOzh{ 7&VdRjt~w|gqӱJ:^摖͘4O{|0|q Fp@z~Yca6/>8s#OPeՀ?XWLi 7 v~:hIй(aNP %w{Ҧq7+ojo6e76S)hrgVuCv_ "$2\D/v{C H鶣uCF]4<4TjZlIZ W({YJ j{l[AHn @9r;0f.ܣMnOsݞD͕Har7UwJfz(ْ%>ehxG~Dqn 晠%p@BnBOL7+{Č`PQfA L5ķwRz7m%FGފeZv gzh˅WT+P%A2h$@Oi$Hk'0fNAbQin+5JXM7y:N@ )D@. Ć@er+ u 8Exrg;'jZIz M2V1KW!KwEQF9XʳqRjR8$];ߤBYTeYq>}*MBJ~} 5~)Ch>jEC=GdY/((^ $_ٻc[7EbcI`եv[_ ;5=qٿЗyTrCdp ?3iD6'>%Xg;^Ľ3n߿L$(ΫJ 746-frQY3\Hw>93ڤխ;f^]lœP`2@eZLN7=ȑ$+5Gc}㾊'j8R-w+`,SFc\H:bqdMԾX{{]=΍}Ԓ*{M18\%=ۄS>˵#ɽyZ#&tBe@ ô l9xϕb{uK0R1 rb|ѥT$e^'B=ea?xI0dqc0p>8OA?M0h*jKݾj2 ԦG$de;q,U)DM-9 =qSaz0 1њnʫݑZrQGRiЯf;C#aH7_\|C{rF\Hho#1)L4K3KSyP_80U(w]\Z!6>@e}l[Lhiz$ ZM3}”|bwrz^krZU9w g\k =uP}Py**2xPX };;ug̀o`ؐ*21y+>5fK-cd=-ł'lxPoI gr砉8Qs㔹PSm7fz~@:%Z Ym ckHe-x{d5l!?JE.giM4xɼIVF--ԗ}qHdvW1H}8+l$n>#Ue_^j&fްx+yߘnOC`FsUM9/8KǢZ}4*%BVIC;ǸN4K֍8 O{1̰LvMN٩ݹudwy 쾚M=?Vka%1a:e_%IU$+rCrx;s$~i"ل, _<}5N [K5f(6^"u>N?=wkxcb&m '2B:m%2ҰZH^Va߁+1p!ӰZlPZڨ<0 fbIYp}c{Ǘی1޿v jӬ5 =qlܞXS:?(i4 $5z:\HMJ~Bǥm(/\c*FdHFlB~? Ώ2^z1@Dۓeq`†gGvP@ڋ$]qc:o@qWj~.ft#13N{W$fJ9mDQZxn8 C7PO;{z|OuCXBߢkW&Z*whwC!+~l]}ה_vǚsA{D&,E"9a8Lvi}(ܥ3C $^W[sdr²xsR)_ (I N3HP m餳(-!8=1j G0A?rYuAG.ƻ.#W^mzAүʈK+4 xK%QlߊA:QmU}XSKBST-k'n?dˣ NOKĝTt0g¹$]JՇLm\wCAzAQ+.ߝ '))>OĻmWHqXHRG -~ΰHDtpߎu$gmx=kZ;fԳ81zqm[ϕ1C,l౹n@CW?+E|":anxv dd|)o#)d%x?+Ivm0BAw*lP!okh"Jɽ$(-:W-y0$VMCoM gTɭDi|[c7ڭn?;$F# XV Ix8}Op\ܭbu>rx gr*mb_K=#`^! R wi (TH@. J1I(,+o K6L?Le}B*HJ -~#j1mKDcMh$>_ /-HD*>BԩyNCz$wː0~;H>>P!#+ŵ[,tcteBJzJ0u :9P]D7Lן{/w BʴFlL{1ԊʊA8о>)1 ;uXFm 1ѦxN~}Pڼ&H!o0L! 5J=WT pk//mLbKV(*de{iNGqySۡJpL=| 1 4瘌Ry!!/t;Hk6+h!0|dע%(IH~+A% Bl py~ s56m.GcT$m I+|}0*t)TySeh^,yrAy8޹l9VN+ΟAnyZ9s>at;]P8_i=,+H!V!LxKx,QMnu:oEߡb#]xsS-0ZK pߚjj\N]av :.Ah(?:\SE.U^cfwb ar ݷy(%.yG++%=(ƵO7Z'YOrߣK%kpҮD:WRZQKo2Kd5j/]t۫)'HXkŲu❈xxe1U WUy|:B8c`wyBoVl=Oݱsu(;F֐ _O ΆJ +<wl-/U |6+-GD,AfA/S1 $nE"zbEuCvW }nv>GSg7b$rǒxZO[>$F{TxOYOWC-m I[1a֫l5*{"xfb2й/_ⷅfcnî(K+ʃ~.)!w뎏<|&4 1ky``-mDZ-rshJdo|S'aӅKgXWkn5.ݯZ (e%0U`q%ҡ-wNejb(gǢ\4٦JFH_°(OIЊcyȱ&PB6=OP@s/A) KyqUjN!Z~yÔ+(x=N8Y}9eIzkޣw$ݨq;wW-})? i PY_ީ𩡓.OUFp=yO!)VaDv0ՅN$5Cm 07}PK VJhYn0n07h܂tNjpB4×LzۆIۭK|HKcd2N&n}V"  ɪ6ݧu۪U~r Je( tvʎwCGmN" (e9ݹT[6T3Dg_•9?LFBE@;zeoX uC#z WfMv? (4fɪ+žDg{D6xAI06+QJ@ނuN {4HF zy[CVJ\NI~.wCLJ 'VgN+m,;̏`Uyic.[?PH9%@z^X u$9e^}:b8\Z^O#2{Ug> K2kIqieʬ4cfԫ (ˆmӣNhzD.,=Yyپ^0UM݀(<#RGo08fU,1, <Y؁v^If!nw3`!Q~o^e۳I O(zpAP{8ڱHWU"o,#NCbճ4fIӄ]SްфՅ]і;LA&wgL7Hi:S<4*9ɘL8@g4q?q`G8A e؅p P.n(Gxo + 4T ܜ$lX@Zڅ:2y:Ͱv;#j)/(Y@ 1A]8D 2*9 .f-3PL6_3i4*xI,f+6++\$VZ]0k/>DV߭j%["OtZzxC!v6%ɏ0F3v\W&$E(v6K6[}JRFx 㶚ɝw@;JMyz?uRv3uQ+"u-hie"i;v5s^[  D Z_, 1X̭5h6 8<&"tطEEXw;bQ^5 5}I uE€!L(cD7IìH8LS#̏2\Ep/kxANeBt[ؔ(.|U mYU]Z:he3:XXubHdC|whHԒ*>: C"cjRWA蜛X0d kXu+w NFz)&ϓ+(qqDjRQ{ۖ =)/vD3>&+ga3Q5Q!I$R8|<iE3*~{kjEBcڰ?oOT=o"|4 އB˳YN hJW-a{k4by- wSwox[[&|l jvWLJlz?_7yC/"m6^cc5pZJ'x3ίF|)&qڎ+\f[j+*wssk;u2zwfiKZ1p@,3#2N53)WMA<-9ucUd6CeoQE6zFT}0$og{"t 5,[?XNe]4lN/V[Fq?&ahb@#G xT` IeIo>+3km?y%QzAS/r=dƖ#\ĕW_ZOb壷ʊ5Cv.k&kS蔫H~cznWɚ?鴴#@ #w@vܩ)Z!jDo0 66&PE7˃r0Ì)uGR;NN #!D>)i*[;w=gju:2W{b 5$@CJ-[]΁!@ V֙Hg..e/4iɋ C__lp'8E$I|?AOyF,&Vk w.(:i .u(ÛҤ)ͮ q~ÂVҡ$Λ 8^Dl+b'q  (dJCc^8b(񻜦8 #~kw=8S~!g7073py9⬞$,"]?h;v Lm/U/C>e`ɩfn޵ʣۥG;keM\4u-&p;%P9EO˾1REM|Z$"Iw5Uʩ</g14].ZOgővɜegp(~zgw<.xJ,i# b7}Bya39' o@~ ]fYi C6 pRQnBږ^whd]A*dl =`C) S+I}#2(4q5ēnH4OOaO}Uy7#|n !vd6V0m3x!lRV^k%߄\d]0^;gmDaf?Yh0)0SW 󃒘7EBf  )gX;Ua#3nZ XbBd\Ť!`#%\\jÂ{{F@ӟ>|z^IN  U(wټS[!4x a2-A.cA$QA-&)N+v#4?֕72ZzW̽FxSElߍBν;q -H/Rb_ށؼeE~ AnOpq1j{ZE63tWX lllۙ7i3[.t,-֊e=}VLTVo^ڡ.w)D hL.%8T'6zG!1L@ˢy`nTʯ,-MwbŽ6P VPb;fEiI6ˍѧh%__ &7qaxJ@Μ$wu_2M\'*5Śmo_4FJ1E3A@=D3AȤV}fsO\EYGbd\ 40 pg!aArw/7^;?ڰGO>6oU RSH!̗<+CRΐMI%ʍvA!j *kZ>u f"MJDm@#?<\gX`Fe a`w&R;Mƣۉp!S}Tǫ<um-76ctS꬞64BK̴-TGW ̗c2K17=!9 ۢ\vJ2 ">\HlT+{LV7/Ѣ{5+#44$TAQWv)6ڐ>Kп!Ȁ/GRYI|pNnB=3;ED^spU؉ q`ꨗglcֈCtjA5ƈ?0f ^|Ԣ]4ok^yoV.} ͈ꎔBNߙu2{*k]8g?6&CuNo)x| !Iձ-a3.菴2S3 Ky1kRx?C>>,;pia:'*=NճWTC~}=c#S>RMd.wƲh^ 4W0o\1 j v­^[[b *{)gٚoqO O∋(v%b:VtϷ}zR{,# R>.nsD!jn(qY˜<-Dyk Ǧc郑ϩ*KI1 9S7,lh?Bm6iXܷD!;>)9ϞV|2'πZcsZP꬙  pU$}XfW"-ɹsL9ʻpv=3#])9I-dcš9,rwZ7eGD$7v&BM&qmk>1(JaRgMK?tIZ㶝e] Ч_=!P\Y*# Ƒ-cH~qU "ZXBoUޒvQ߃4JC^D`48PZh0{GM7$)_k7'ãBYg/Gt { v.?;QXf\"w-oYX(4b14jQĩ[*i!t=sq4?-+}S_k⛆Ql<Sx&l#R={%f])鈳Sz,Ls+Dzm ݮW)n(%v#*eaGkU(lm^6`DGαB4][I?Ьͺ Pt&A 9к*wYt9Zo,~][{U}h@=4xj}R^R7L4`*15jL)wid~(>IUwhlZY~QKE}^HkvZfD@KOYҍoc$Yc !XUvљ8OOd\Kԃ%BtnGGږ!;.mN-ۡ. ~gp? >"-89/|H,2" N.SKd$'x߁fX@.;2vAQ&iF p5;HqU5^ ؤUw(!(/ >_`UG;jv!moP.?& f1xL t6k$#]iMw`iPD GC$K{&ea-,Dl2e8.LYg#: œgK!Nˆ72V.PWOr|%΄LNtrqQ56t{,nX~~}-1Dz$I`̡I[Nw2+zf!ebevu/Y pCwZvb(FE"?GƞkX/ASҹڶQKn@N#d`~8Y/mG' w|d H־<;kA7]#,Nc1wQ'4E8.U-blNKg_F*=>c*X-WR<_OƗr)ySfHj ̟, l?IfϹW5yݢ.״| ћ͐3b`/{3.Pko@rTy{KB1/;nZhB)]\ewKUyB8PU8%>4~>>L#e|q^ c~29$l>,&$RF ݹDF eQ Wd77J]#AiA6 ͆pWv,'pqV<.`ϻkJ"u'w1(x7>!uzݙjKھzҸq1k${i8#dK[p@A"|lk*~8 +4+>D,Zf&;?a/̼`K=59 -fH u&g33OD]X1ԖxkXPdxO tv<0'vIU] ]qR_L`]@oU O>2F:t[ឆ1=B%|b+\[*aErD`w2gR9 SSyk!z?/C)+:1260jT&sS ׊v3Yv$kPF2ґ*ŋxS2¦m~0at Gg䙻{$EWyI[HcØ*=zDE0#w@×QgHS%.=rn9hX- ) [WCv=A=U_uá[^3QahBdݾ K8aG3tb|hBh¨p*Aèb8 0XJ)IgѪ9 u%[I_5ۺIDO!%|Yd,>·/ 3-O:;qZvw̳ߤ2LvBU "aDȘRjxod6hZW/֕>P$h7$OzJ#7'#06dsH5XP20Ru:6h\n|#L靴wp[(鞐=midz zTQ|r9L'8&d4C^]GyUٷBy Qe I% &ʖ] ͺ nVU 7S8JzK`zo"}S"v# lWZu|dvUw4)@J Bkd%0I|;mHz\ k? 2/ޅc,e0Qρi1]幬vSrpHΏlCD(_ /QWnO;EER etptPd斅SȮD ^^ P"E2sy4:s}rQ"~a1r BB^=t|xP*$Pc7Nk|jrfB ӀmU_Nw1W_`v*gNRe9HYuᇞž\*{wLLh]yĜQyjϫGH;Ty0&Rdxe{E:WSMm]|'Vr\"ru00…4B VنCGoh/iNeDā]f؞:qH1;!djnE#bk;앛x ɛ ةXetc(6N1 [7T VW#)ZɒJW96FFyqKd e (_ZzLj0=!^gÌ)ݶ/\Qrް)݉k*>cKb"D@aب1~!x( 8B0}?[{;p9뾌h:YG"%Zd#. &{_4wCh{vEd3|CP_U0[[uYlܡ,0Y-֣Vڐ Qlp+)4 xIQ ~[13, EKN%vt.oFŘ(6}WGDy-fևM NL#_upW0a<\[LVuNH^ո_ åȲnIbDYtHzbB*@= 9JnRd_1r7Id #}OeJI{*Ƴd=&xֱK|>W*ԼL25ྯt)Kw _泻Dڪ.FH7eDNwc^"T A574b45׼{{+CrafSѪ*j3./~̑w.ڒ"Y@ /Z=S،ĺ rq}nߔ82&C+Wт$US& >wϊJ)+[ ff] )0x$,G>WF2u,lJ҅=ƀZR 0;9V  ֭.u+7Pi;ݲ8B\M#6"kƈ 8pSL4]%;'QKSRW3|g߭kT+O|#X:4;U:FWY$̢-~%YmC RCFm kmaA9\(û=$r2@6k'ti=M =l ai U D ztˏjk-cR<%@BAV6YiB  Sd窆ӎu2!%( G kdUU*O rյPaX뜖?c&ԗMu1]l•>Jcu}-};a`zP(_fF٤0üi̲GǴ^qa)l2J?8ϩNiNj'+*KMr`!\g:X#zR1 o4KY?D fHQD85\Yߵ.>b\ i[d7۲Zj>VWw rkbȶ8p+->c'hvȓϷIf(di1Av7uqqbP@Uh C-|R3ۃ1~7h,YD%izdxk\;nG_r` "TnY? Lb!o!'MP^O]~U(~I|Bج{z!I:B]$vm9@x,uZț{,U%R.6aR:5^dY/Q~^UcEkP^mFQ^t#,(OOw#k |^/"3oiݳ(O Sj fxuUj5lH{ t ԓSHz=aBq}WK#=/򲺽~͛ pԚmovS%}|O\ڒI1uq#_]75B!:)+XVC},wN[}\jh#í̤RP"72YG-NCl1f1T=MKP_PK=e~dDKR)O4w2Ze>8 9L53i7wT109KuKE`iWZcQ+NRsX?n^v\S,Oa3ˏ- ij\% ODYdAAc'zD.omkTә0nq ˒;I?'ΙVÊ5Q@_oݲqI8c G4\bH0N[t8O"J;( Y334MuEy@:.cbLӨ`ۡBd^@Hͺ`DEGcvC2%|T%@[@ u#nD |#z^ Pa)s둭q6A.,X[k|NN 4zMOͦ<}IGx/&mȯʺGs:iGP+_T(c !ǫYᬐv` ~\XNsjoND KM][Eh ;0os`|(N\/}%ُy;[욢7Kp@z}Qs#7_qacUL(c@§-[jOdjS6[pyiկ$'.!*j2qf⋘ :ūA٥IR;mpuU?`-Ya3lD%RO6=3NGwky9SLec%^8e=Ok_5O3|Gׁ 5}0lfHXA!"O#kA!Tp8yՖOKCEMV2EZc@"38lh8NOɸht֡:d=1R!r=n7Rϭ&zng@gD|vdd5^j]X1*h\SGynu lΞU˄Nl k> \xuSY/N<L oc7$[ lv:ԋ8.('v\SVH??$?vj~lrow:N5Z_دK5$_9 @q1r+4j0;ܣCW-p1}/`ω|I*8֍έRNQ:aGgW:J 3A m cЊCG?7$mukYݕ&j4Nq {ؙM8QNddXL<)NtRyCb^^Fe6(ޭTlT6@Q.xOJ&Q/.L)$F@UQ'gh+CEhv1]ćY7tùm#bVF1CSG~>|tDTלk$:+Rdҳ4Yh'E|D(oy"KaPrgwں`w=ťg/AZgx;b݆Һ/f0Ml} v(gSn}\OnYn.g E)PRkH0kX¢ު y{d.S";UXt/QlRX(=SBCeCeFj KܳvqSa+K+_(Dh/[Efc}&h8ZH;*y""l T5@x0p_"CuV SBM44GRq!I4dӊ*wF::7i‹vv$J܁K⅃Ssk˺=SuIzFQtVeY`ΧbG,O#N`s1!.0k޴sYsGS8lz=4XWe,#|-d%]Sx]!?"M/9n"*ABB\ vR_H_5ւT#x v sD(}bBWOASFtMS|đK6G*Xr[]|riё ˄n#ȳ3LȣMU VN=.oڣ0~0ػ6X#$+=ӑZT]JkѸ X%G%̊au]f@,rH0Xv?ݱ\Pr-ZQKY\69O'cQ H`E I]RkʪJTkd[zY hc1PݼoɁ0m_6[:E޺^XK* ZBr7].pQb9EAƀ)Q,m\iD:/ X9SE ~;vlت.]_B ㏰;BOp Lh?}QuR 22x}c6bJ6ڜ~ƒ$kR z߃3笲WS#ԑ 2yƂ>3 >DhȖ;kO&obQ$bc+ MLdeθ6KZjzAyq[\zƔxep\LvR׋eޟA J\@ԍP`OE .*M%=.]_Cx@'!h/[#[h`qۻr\)aV9 ~ؤ̇8qӃ/cƌQ*>lS!5ƄQBȓJ//,}7R $s꧊J!О}YI2A#Z

}wpBMg<^d@G " $Mrf <8p "FAO&Tr-QBȃ,[cyjU~h(2ރ+^2,fď+8jc⌕_Tj l`fщ/cd{U3֞2AkG̈́(R'NIԥD(u[iAVcR|tSE6~ FцR0?+J<D_XDnjC2~<LX/7πz O!(0DT\Y셿m߲ky~UP55rf0tc0p>[dF?AauAk5_:X/pxO09Joz7jr^g91΀m옡 hyB =`_/@O!-"O~!6ؤHWYY]O7uȡVR[/iݜS0I=h >ڍ.9Jpe +,s ~=>@a"h[d ]n˴|_0i\iB4{ÿ'&N=5+-֓&DEmaY, 8kT!#bܿg}sv,c tPeu5'ʹ ?g5G)0wa&|Cg$pn@#a_{.2LXwx˨_ȋb$cgOSc+G]7ܗIH8eDɯ:hL94yVJgb#EX5< .E>-1 wgJjjWGHE]&WJ*Ӛ~b+dr5_*qy铓 mAȞfuρg b~y 9T1GZEHZ1@RojC,^2{o@[:8tF*z\fq}Y==Ny"%P7O+i<4so+YCը%.uP5O+)]EwI?m'Fp׉܅-EHOUFJ[CepDUv#w.8X_)l 8ynG8I$Yv1n""jaqs2~oЍלּY.5ԟi 2&"<{ӞsԻmPG&Sg=0營6:Fj&vmK4W~R> ^p&sy,1_'l}D<8?hʵ؇ A߬J3Hz؉~Jn@(0L#.3*^T0v+D1օ62WmjrPNVhA'3yGy'L~whd8ۮֳC+\o5xm.7:ksipq ۔˙[8E3R,Ld+ nYgLgw hT ֊`z!p+ 4K1pa/E#pnh3-Ĉv4PEiܾ`0+A£Fؚ M3_#06soY#@%M^*Еn?B3~nԤ2f0ZwRvغ(E7"IgɂP#h4\b=`8l >ڰc֞TX*BsthiH,uL#/M) ڕK s;a~lkO1qhWhM$&ڙe3|-Lݞp([ ,vin>TT~a7`eQ{s1CZAa+r {ez;݂em}IL>m"kytjTbYBdi 4DmShҼ>q S{Aɺp$8lm  1Ӻw>!~sCڇ Pߥ[maޢL׋`tJLܬt$?=ກ.0ΣbN(e$l) ״>S{eţ:!5adec@Z0dAQ>@8O(=]@wPwdbk+N†??E̜QJft |0&󜵭.wF HM]˜3Poy*p4ZW̻iz yB6DCK+V]J"'tQ]C6tS$#q :z>*\7sh,bw'^\/|̍/.Dώ|Kwɿ.Zvew+"L;b7e# LzqUlL(Ѓ P?J~%z DnNo;ᷟ}=/-h,ut<.B@f?Lzk$5Ȩ}_hhB}vEmxw*WǏS |mHvt1kM+*"%5!AQ]_tn$"ݺj*}._ }MVQCSGV wO4z=| of q#gyq]FQ}! 4l% prэa)sȥ6m'qX'9eMrM V6% NhC`Oe̪!Ŧ/jsM*غ_1i=+o>K} ;f(%]ĥSZ=t--rV7ΕN|򔍞- Ɯ ֻ1N|y@l.J<~`V7~dž]LpUC^ `#AzV{E;7c.Dd pDJLo̧!S|mZ,mv;|ŠԽdm~CMgz#a`TRހ<'7ɖjK %s39SFsZix [ LUbT3A~HF;X&ošOj$2$esEz*C4!}& e@2-!"{_]s@"/J}S͹JZch[+Csx琅'ddq|<Yg lXa^l_L6q^{̤\`Wq[e-x٨@%&6釩dS at@+oڃuqs^UxƲP7izpkqTu4ʓp)ʬ}@S8FGx RDXI^RyjA P=DШlGMuاw8Z0@2k7%cd;P%,Μ4q _w*B=~%)F Π ӪK.eTVxkVS *jۀ<g?u,޶koi7 `w旬GJmet[*aІQY\[CxQ)y_tpqKWsDN\W^<ˎ$8DU46 9/h) >Q-*WB ^Ⱦl\A Rky S=X(sݛ*ҒƆafO n{.J0 G#c7ɖ使 d X(Q7`o"]ԐR[(TK R4*Oʿ)G9/Z&:~o {rBUQWٷ}1DIւ!H`C`o6RA6ǚdNJ\:,{F9"4SwmQ^T ZL|  {s8G-F[̽`R9ߦ08j_(Ԕ E!SDo{V{`84r0Ìf.׍N: J '31^bDQn-SI0V}OB \&|O({sič 1TَטlL't2LrH!yx@f`J:vk-opG]ԏ~oeBTY\},#yK2SzQ;@ͷ꣌Vx󲜃WwDRѾ(ƸK ;& |ē!]>l0tc}qݴlj$IDpcx/m o/]P UUbK_EN-~]8' Z0™w ;I(B~hK)2R9g] suhr |҈*a ϐ ߲}կGTܭvN x^̓S"]Eez(9{Vޱce;RțOtEd#R1I_.FwmҰfa{:9a^ (1!CQ9h3(j$90[ڊxʗ30MSh]ķcIE]C&e۩?ES*gyr$+5i6α$ }+y] wK2w&B@kUHy`hO|l#pl&kJEB 1D iv1%PUgrcvp;M@ƭʍrs[}}|m>qÆ ־Sԑ5!A E@c$qOi6|#pH8MNR%L2*/Rۮn$c7h5Zh^IUud7}h%?MOo WU-gCh\µ2ſ$pKcKBwY˚R¢O~zA aUt]l!Jc|hXyFYrcWRJ# 74pIj? ,<]:m#'"1$Gbd= ]V3/UV[<1"oi'9 1~\lDL"#2%C*QC<@q=G"1javT]sDh&#d(fmH1r 60[YB>k sh)-*'+<ܵ@7c6k1mS{I2Zq4Gu !r ŲCT_,!&9qүm-,a`r3I~b-[PzV_9rATVbOhEQ\ }ólLC۠ڽksUC#%-Nj5Z'OS}+u^Evsy$#\^6>&yeCPzz?B@Z0L)b? "&n:;,&fG(z'[y}5iFUMeF쥮0Z Ţԧ/7Ruf5LXa}p"IL4.J1{∰2)I:O27x5|irye@9wؖĨDSk򷮾qT?]}. ?u?KƄv嫻MGu KZG0!3e^hZO!m > Kt&3nRAܨ睠bAϰPGٴя-S'Fy_{y0kdnTx٘^OK>°\Q_LJIb>/ /sa E `"nP9S<X3]62y6Ib̺eOsf XhҺF&ь!|WxO4cΠ3Ǘ5f?)U&@6RY*瑚$cF ~hjb&yJĊ"/o:pRIa4#պ2 Š7|r4 }S0Ӹ&͔6 &˒޹m[۲'[ܞreaWP~;zXY8K(/%L,@Ӻt9L2/3%ap9-`ѸJ- XRzNY 07u2"ZkF,ҧ,doIOH8 h9&A&=GE5W͞sdNwT2q Ta׎ObPHvLu*ׄlNӉmŪ]V&_sbqAmkv#DN|oO'xO<4+zG5P1z>A4Jƣ!"NȾ-4&j\|YcKFl&ܙϕ" BHGyG_@f S3džU^dʴ&uyu]eGu&EH);e\ ȉDb@NT}ujc!@'}@1.֗f hhd:>3Պ35 U;]%B)X}詻ܗ8CƒeȑmˆW/$/-Y4^Ÿv5O&VP;3⏹9^+M9&\w'Ue"8 0qm/[ 7]NK[ƨىpy nP%&ile@iF`TCcen/(]i&)fÍ cdDA@ |8iv":뺭v|(lttlLg p|NFXq ۹);xjޏ&{H5*̞OH@ijWsLOF]% W_G@b6QݰL@AO,y{E^|pSHG׭&_NAvsbC}ddc>j䉮KҽanL7SuioDۿR{(+L% $/[uǗ%M-t텮6"b?-w\ ~zpi|,cl'.|S' KRcZn}sOEY; #~xO |=>W)uf$-D=ׂ3/`I<f7#G, aa\nZo{5) S>\ KW/π~1Y.4%V[0A6@>UkAK{^ToE)sULC{XZ^3+jKƧ QX|ys +2$to5mX:4"YT+\[ t5m=&(^C=D-P]c a9 j <s4-F8 @6OAd|ISǃ+lHÙ@\+Să)Awt>S(`m7pJSHEv'K3^Xۧ+%Hԩ<7"BY4.jK?4B0k`q0Q3\K$ze/b D?]@h׮avGVb>!Ӽnwd걲E~ }2acꎮs<mxR fzU"P 51(=%B-|f`즡5/HPt5s|Kw2asۮeHipɣw;oim@yC۱~!u͋b8Ju&T f+0?2# ZbrXkQPc1y~]j,ruT\5uz %Ę!a!@#Y5|ߗ}vJX)RI!֘΂HgIRʈ:P ~^wƆ-f5pt6\RNܚu_[X-fp6}V^M9׆7Ch 1?s7oXjD!KfV YM5vtΓ>G^GMIkaD|cz+nđ[nhɢN嗹s'ku6;4d79jY g5.#J*˔L<<+q "}ȳ6OZhn}w-T?CURw8sA`A<^uWT;xJ~b5[>9*n&ƣv[2V5*ILA ^l&u7f@:/T˕7"y5ƺlt C FuddY*S7?AT[/-I0 ^d^֐R:-Gc`I;S>4+P`Æc $h8~I7W\a~V%pΠ?T$>jBz2x,roTal(7G,pL!-1="OQɈ/]3+c9NɓK1J@VpGŒ3Zrt[ Ll "3h-,k3UIW0Cعd="fsט?Ū!B=9^@؋nJx0vVw[Q{ir.w¢5'YIY'q{L9{(Kq-v$tu +F{fzQ 5nZd.qONӎ[N_wyu% 6G(f,1)n379=vu%B:Rt2諱o0c1 UoU}[HPM\]- sf>=0Yiw= (%ܸzpŒ jͶZ'NEvj662NcEr#(0I(7N3XVW[ h.X Ad1>俑8 :&d7>[ 9 Qjb̪ e+V1KY yt)V_#1 )0܏l(<ﵑg4B\S4"'wYp [37{Pu(<;# 'gk^ 1S_,C<*üzy-Iw,xح"p)go`bU`Ϛp kdKU?;{Jf#.tnʦXo@gxvlJ- xq:-#H;i|z1=| NۯE$K^X:ǬnmM/CVhΖ$"lR;Z } 8SRďڏ8FrXG;(EXbf&a|y+@ئR({.m JO%nSA{ىy燚MpȾ`M"%[^sco\O@Ox$ g0dW>_ZUTN,Bq:$Aoe bV,gjڬ][18j ^%?׫  lV6O; RoMGs-#oO";of^ƶ;5Zycw;Fe3֏q!5̖f}h2J&l}c/R_;&CPQ# "ŕEѽަČ LGnI"*gfnAjk0%B`?y*a׎G e /W= /U?<&;RT+A\7ehJ2 .-}=~b`IK5rqK@\h #A[iD^DA-CX9fEfsI =Hyx^"d+ɓdh*B/ZT4ɬsTL ߾ufcZTB>V dQRGVh6S^t\!ߗam l*  ]r@ ̼i\ U/4 [pSps'˄B[''_r2z6zJzĮL;elAwhJ#ځ~[z;(y>Tc(H!y x^ͭvهT4%DYwpܯU9޻i'[{k Y?ʼn]~z/ځʾ(o<75#wE¼HrEteE9"> ljR V1-0M~ fx=>4B"걢q:#~[tK>͢ӞF5t V{$Vu-5alL6;~} 㞔DUw a pzc/l3'!_mDjC4";q|t&:Hړc=YmÍ>އ{vd)cN6,m\˓Z'f^b{¹TwNYlQѹ02/2dg KчCވ` aLE8A&R]!1Xh ka5З'Pl;ä .f@ް}:Gd("р:6ߺCvn*0WM!@Ξ!wo¦Epɾ Ȃdxެ OPMAL;xݞ3r&9Mhg`_%GyR|j)TԵXt7%ޢj@Hd> #bL]8:a;/HV?3w(Bb:jI*5%9;^@oMAXT㍁Uo}ʮpZe ;݊=쵂Vvrk3TF!z!ckom.!uɜ"\X.)]:rhn*M oBC98MU,=fSZ(B7C%ԡ|7# hkG}GʌHzšg4l*hPjgoc'݉R `vOε6S# 9kaan$=чno!(VB4X0jcҷ ~ҽJX#]NU8in/}8BKup4[gKlKuq,֔B@ V-"c2{=Rϭb|"w62lļ}f{dsފTmoH@_T[HTdJ$t:)H2.}(R$1+Z3=;VO>ff{u]+ׯQc5.^ixa !_I^?2aU~ijl#8Y ÀEw?d cml>` i)?I?m!ECR=Rr(?NQs9c]M3Ks%8- ,_U!dPB׸ +W#DG%7AhnD@ %)\xC >g`&=U ];eb/>aI^ޅ7* nV9TDO&Wt 7)SUl */Y@:EGsɞRcA$8ڭq o+oUzMN7%%; 2?]"P]GiBx e]O|{d8H^ȿGkM8}'F)#v(b+nA& σQJδ%f)D0"Ȁp)JW?{L ?u~mi}3z45Dc]ͩpNЀ֝篆z~ -^;ڰA˗d<VOndXM라p,oqRP1lD9(-_Xƍֳm| {!Pk߀@8#NF4"ɶF} @@g_tBV;]\\; ݦ o}+K(/'֫x݊큻83*r٠ꉨJ OϖtP ! uwU%YGTIs;nbt}afdL¢iYjsöv#k\{2FQ՛,,_q;>tݱ>v¡;^YN~F,;hb^Wu%[1v +yٲtJLfyO~b{ɮwAwkoj%LP!3HQ@ g DYBj:5)K䊷i0?ČӏMՁl}>1dpo1$cӜQv#F{mS#`4hyy%@/"5f؅:GmLrN{n1y` F1[UXbx׳d[Pia7::k8,O=)XD.˶mٛ u{?I;C=Ң pɿPeXGUױ7JNC<,l/(&SxR3ZwSLF\ $_2GM$3lLM4 gT.@1lA@v:R#c|\OeuQǾ'4[3΋Ghꌮa.XY(!YloDG7=~{bUT ;#`ξoP:($a$3 E<*t ->$K'ajAxxHcQ!,S0.7^K[Yu*nKcG|(na-x[Qx\z(F"yB9qL)sS}7k m3[ {VsRdKd-+bEߗI"0X26UyKcL>?uc@vh(pyɧjkbfS oҟ[q(mg{o)JQd)`<'qL}L 6a?>\~ R̽DZwP踤$қz*X`O͕#E!ز7 4  H -'7-7kP ~x q0{>k>wRiH밡lq*2yG(Y:U~i6_6~6Ss0_ൽ)Zr9)ЌuܥTlJIT_QҪxM=a:"G.ݝ}eOMaj`Nŋ*}hqrj^2"G m'F@hzөQ~ UGrD0 qHDS>qʃFe-B'v+`Q[Q}=y=%duz\ @y$XqBA[QʇK_"d|2 gÈbVa-Lv2‰Փ6Zxd1u=t@smN/ɾF:B}mr`l6*q5}? O`4r#g/8ݎw"ozƟeM9xQYm&J/4FS+Z At,u^ %sD-|}%C>e$W8 /!+R1O'`1 jvbH?|0efɢ7 C#xh]o@&XxxBb=!{QfG =>ksgQ>uO l(MVLb6՘8rpHb>b=P$$%ϋU- WW_%!Qv5_$HqG 8$%5901K/vd>HA@ m\HЧa*] _4`tR&!#+ B}SX865F<5Ee@'ȼ,s$ {ȍ*k߿`Fbx+q B$Lzۡ"i@fx\o+z[+5`;N8NȆNƃ!U+ #dMJ"x]"V9HY>7$q?acm<`)_{ 1AuΣD&>FU[uHiG.q6 jD`J&ZÒw)gS@V$L }s\?<[}Bf!T'X::{xw/ѻTќ*(T1Ѐl^참S޼9t.?ð7῜ي~$ml4pD[ֶk(ӻ;A"=hx2i|;6CSZ_fa3_BmYޢm*qj'mwq?\7UďS-?jٿ<9SIR|15{B+*i.KϘ'- ȅ܇cʹ[֨-^2)!b3ifS\#"q/+ͷg 860ǰy +tCbP)ۑ0q"X,c?ĽC55d"*KR:xDcQK )]IuYxl__iq $èv[hey--:CWrBaghZ-ctJګֈ˛SCeJq&!x_,$ ȅ]fh|QBίvw?|KUu%!t"EǛ 'dxx\Qq ''$_G*MN N&vМFIi"践sւeT ֖A*d;h#GbNS`])6;KG$ɨ<`7`W9Z Tǭwn!J V>;NÂWi|}LhXSo{)esiIV)*&.Md47FIRփnf h#hj}oTfdYXѾFȘ]k|={,֯ y$"H|jN@H҅ ۧEU5}U> j)Kk ix8`_LdԆO>3`BSV@1)NZ:EWryFtWEŠs{ 6"pL n\ټk ![;:U$q՟' Vh˱>`K4J( 2Аe[3Ry͝g_ɤ;=ŽE šU=G ;(,Y&)4#(Qqc:P,+} ov><ۑl^p5A #!`k7DѳMA**̜45_wdY@>Z4Cj,Vl9*I--pKGWmu{OԶԖxQ\ 20{z3z^j[9]RoO(,3߂QE?R(HL3?;Δ,yOUTJOdEֈ{s3%]P<0Vjb?0- Sqы$},I*=؏U梠@0|eN}Qlb& 7zFL(?Yo7}5РG(R,)Y["᜻!<~q Y_D\UY}u*7U7@as@;_~>^>3{Uh|r8,&#]no3Y]ƹե `[ִA[#3dWF6nC5ᘎ ss}PIx$*g SQ\S*7V4G_aܺ>`#'cBIYty{_.#G |<8l x/yM=w98*Ei;<ɂRMt`x9A>ޖ\A8w5u-D)/h>CX޲&%jv8iJ5 Iȉ-Nkxu =A7S"b8Aʴ=k"v%;q-=iÿl>1[@i#M)US\ݔpEb=H4g麉ef˷ōUAeoÒfpL48 +_uڲx %-7ijih`CêK a8#:Fφ"ܬQ"W,TbPB*)ır1uσGApz5D#1*(\׬}Ca0Gw?],5;5SR k RI? 8aNtH24 . y)ʒ) ,(P Pʶ5h x$`Ei, g+ XzvX8kМD̸_']i< %)oF`OB{&xpp/o[BkEֈBI\JO^'f.L 1\d9"mJVmmSCjMH\yj^Lysch`UB6*p0|q)mV]=֕'L|]^9,йMXabf&8.O,u(eGk$A8Jw-;V =  WqHѳ\'5TV k[Zx0cIzSuk2C2 u[Q\œ)aU3thq?n3\Smmޅfv5 ܐn6T""@+oaxdH}Z~sRnOɭ?.sc!̻C%I8[Rf}Cې>"yQ!߽D o4|SX3^ORUjߕ#D~"5;c[jya&(`P6.u԰yc:[F!n.2Np n ;)oKS IqP𖼀\\$a%qV֋.ӏ dIp,OfMDˬce F{{xGPnҀFu}]?Ɂ;w˪]qv wśAnw;XRS'ORT ]گgbe3juA˹s mX:iYOqSNFeꋞ|f%{d~(eS!mHvKkoƐG2ambw8i~w?E^b`v"NFR׊ ­P}8 b&m<?yˀn~% ȅU$-/x98qo+˩@E~O\̗Zköy'r[$X 7nH@]G/]U[C:䨳AR|bVHO!hn0ztׂ2KbZ&HH1Ϫ6,&U}k ͪR4xq "ȱ9JFv Vac VwA v+/%֍4;yXuHH;߲UN85vWq{ܢW9i?TAI6G]ށVj 6Vħ_St$^i oI?b G[UWڈG{AىdpCzvhY°0ȡQyne{>ds0zF~tD`Iqe} P`G>1RY]I)PksyBry丮14E^ܣM].,VOC:hbdl<.V?:F Y{c@;RŖfkƭ]$p.}C#b\K٘0YRNQ$!.dW8ahvbqey||DP";~ti!zh%v}ٕa+%MS8|Y)"= |@_NXQ $#/ns]T9oDAfۻڙRl: M>sFd!R3-<cg9Ur-nm 3"EE#'X5%xyKt.,3GL;43CACu/H^nQGc%a'lt f8]mf{skתL|gZ}*U.Ii0r\AoY' vhKuϯ"9yˆxUo8pL3}JF=5Bek{du?MNVF#̧::]j^]I/\3tS=7b֡F<؀Kv D_5[ @RO y[WdZ&W3uf#?uNH m{jHJT+;;W2l!W/NG`BLRC;gA{-(L_HVIbkIw+y潦gRӋ xs`][NI b*\lK==h!wZE3xR/==|5NlTd)y&2ᤱ`di 9!7x>Z=R pa$NBzJ'MVB~'g ya.m=Cw,P9o )Dw5$-k5 mgniUx+L [:Z݌$k^XÄ[V9/&33 е5?.0(J,&<?{BG, UaNCԞ_z\@_3/̿H9 /Τ A#@R)7[|u+?UE bHj[dg"+Pj¬OD#/% ! g\ʴc vv):f#!:X)\-DELRŮt~Hqs:3ۅZw]\̓z$eL9 D1XaVtyNj#_O9wua(WH-\FFuja=(~tC.xUV$Ÿ`*I!|㒲ssSX@~GSGgOU):'jYS^Z}(D8e81)!ds^+*Gh!!`ϦRyظ^64 \UEDXҏ6!2b=>-P2H>m9vg@c†%A0STh";5(]\q<b7$jz4ߕ/h "Hh.%y3aq Ӟw]?7U s/R&O<.%TyEM?EDeY5X8#VI| B8Bw$t9R:&] e t9ەJ>k6@cIqyۉ= P9T.xcp8'OHBctg*EW @ n W: 0ȋNJh [#&7tCùzzsN 5Z7gi= TeӶ!~T|23c:T,<:54&{/;C\pgS,$۰xLcHnC?Uw* .%cQNkMWqBh8i#&`؊+8m.b`Z8h:oq 8t5G) "tf #0RJƊD~p(Sh0V9eĪu&V-x &>5Yn&#) kqD3{:OX(v$uҡ*n4 B/i< `ٴo;2ff{5=QII(90)Y.ZE5v`(8m$_r& tۦb`.5.uo7} 3( ߲7n~]|}ഹNYNh7޽m55c ų9/<&y+{21Y9ǚ5Kj&oA3feqRQc*dJA]&!8:ǽ3c¬jir3ֿA٨D>^L$)5D\yK3Jsq̧9DN6KZ&5.)IkwO_^ ngt %|("p5(Ca (%veHfYmTY(1;E.q`T4gi[T$ 2 6Lijt$'w|yS i3SIu2U ܴJ%.>*|cߡJdz8݇dƾB/x&SE1>)xթ`0b3QU䃵wG*_rKL+NN7S``@t${IFdt]@LS^".j]<#B!)LF8i0,X W8T|a%_hs<|lMIXqGgE̥6 j:T@_㡘v~MMq/xpY{`Wx\;} sĝЊ&m@[N"(P8Yrd5sZ_q~vʨwv2`-$N%/ ' ,Ouva&ify%-mgc]$RjYm{lE>/5 q}AV!)A0tJ|j);ԇe}6(JGez@v["@yg]@YMώdVCH؛zZ0:;YDMXD>¶3w?̣< CsN kf\s+}u.61ؓaXLu ̇]lXOH*Lm㳙?)JLt'\@ҏZ.w4~ͤW GԶ+ p9puޟLoW IS>ـC膦\I7/ xrV0i OD7GcKnj_ n0,H+MAk5Q:3Im̌e\/M4%Bv#5,7ߚ}s$IJR$[ЭfJF;( %]L {g'cW#BxeXyS ɾo, W RWhtD5lvj\iNm+Rzy!pӫ_V( t뉾"% "g'ɨj/Ήr}t9-k2E|m7"bY;)@'^@US?: %~ Fi=4T0aas3<@V& E2\g[Lvq* ݛ+'>uf#s+7篴s'e!(]¸HncVXvw[*.Rn9ddy/I(W䰪~j%/qa!8t^e6Jpj9aV͠a8; SkeŏnoxZ`[.RedבN!QyfvhIh{s_Oz¦  z(",-.{G՘AL+Zc'}}0Y,:dRknw<-HŕriWl: V~Ak/:֭S|inr-{/V"'=D:ڒrh:D蠼s-#6Hjw&K#y Dboati1PQ^\1Y3%:/L2,HQazk0u{@Y]ۍؠL\6 v=} H;+5YůIu@t!D2>ą &,SyZMb=pÚxdE*,Gïv1ֳ:ք϶kւ&&X -"ֽ{Aص3jaYp02ba.:WiLju!~B*.vT̥I *2"ɟ䛏Ye)c'?,ȌQm2n)i |2-54\*LPgՐmE:M4*GUDW#5[Ϗx +yRNws(RnK`Cti@Y|+*IqM"XqE8@qًTOs.a iEy7I-d(IieL%@F$>I+V4p!h.s`XMD +?eQlshQCvbyʶgJkb׶۪W1/9p๕.('DԞNHV,|ZW\lsdB&y@W#kWcv߃Z FK"jgIW,Y EG_Z fM'~p ("Xy)ʠ׵0Io w>b<yenu6 0OB1QnzawU1?8X"[iɳmHÁ3nq;;X!Ǵ`B"ka5Շ^s ܎e> $}4{]x3qq~:(&}{yGW* [xOVwzi 7@Xh;)h`nʖ<\ w6O8xlyMgk̅iR*h3>OEPuąׯ$} ;{I:34OvՃFPjjpcԙdon~2b˜t~h%^i& S먾f&÷xCdTᄓb>>3:u?\2S1_A >H}$7jT;"A%ܺ!8-VB1أ&%N%tpIJ(OnFzl{Dž8Z>)ͫd|&qSցq*q9zafo !~} <&1Yh+VkU(?˂WyZ qC0QڔK/nJb Ϣr!I4+ ҉O?'Ȇࣩ`¤0}Op|.qSmVpF]-^JQ&ދX~a$m6ҨvSi]4m$Wu: O= $9d,kgUwS6 9⌕ I5~To of`dΕEtXKiR'('%CϡI (PVήoƨFwIǢ4z63rd !S|ohedJ1g[`7qVwёH|Ξω쫉n/oH I;z}'$'` թN(c*OgvE '/MQyu?Bt@hQ}'ZRQz o1dNxr5mDŽY (qay<Zu$rf%XmU#7:uf}?aQ)P!rFz* `=f7e6ۀLfnnnJ#/x}w# \*N쯱Q!TDC$.&Tp\C7VҵW¹X=[&y| jp|Z]=FL̮xcv |=70CG_D@CBɱ-,$ "lW0KdZg?Lfn -t)ݖ*z?A_Ytnzd%Kqr_b1:R`pKIl)G.6y ̫o\Ft"GЇ`| mSI#y4XmU NKgniW9%=̾y8u")z ˹VH9TNeр5~WEDԥsW Fh!uAw hH<ǥl(zVjTRݩֻކeO,),A`4ړ$Q1) :9~Tv>dt׃x SSWL7 9o,EtӖ_0/(bz&CI̭!N>P[X}FFp{:.9񼑒ǜl`D/5nq]C q*6cGԵ*H0 q0" 9N)296Yr9] \\G6@=@ 㨊#Ʉ!aE%(Ksl|щw | n/Q۟0$]z^,cI\1y Je]=a%xq5V(2 ? ה=⚍p7RsytafH;|qz H=#q wQ_P,? o{$g9EfSGpd3LJTj6,G B%3ZSt)yŌct{USG5+OmQlu„ggvqzZn03b񊼯St4 p@}%Bm,>55z|P̓zr'/L7Eb,q֐p>5 ~иN<9C#KYL~iy){"*Y7|? &j4Gxv݅KUBkaZe%= B4+E3d\/kqLTF?B?hvSk)O~:URVf*]j= pj5l.t*4@-OjR;hS+G<' <ЍWaػvCebm gמ9||U0yA"ae@:if&:0@5; tb%/خ w<:<d.YoL2Rߑ:nt tiW6}cxp?o2v3rBV^&|K]GA+5G-4}fvrK% rϤik̓n ՙθFZ#fpg5) j||R_pPǘ=3#vA9LG?eטE8"Aޭn?kkϤܡ`4=lh&KL3hՐu#Vn%?2v[5 )/f0g?+E5xǏX$+gR(R/2C o٠PFzs }x'ѠՑDK:ZȝK .'J򪳲]|]Ptcm[p7͛~nTb]p)^C^GrՕcMi͢c`-=l)N~GjGYoPA i>|x.wvMvs4Q2h}T@ZOp;lPﺶUUH**|lD*!pcKɢ9*=T6Lpz/Ŭ;=LZ*l=$+ zb3.贑FX{ S{hCjB;UV4RWS9_psvj0#lHUknOmlA0WIRÿ3 ԙ|/qQ1w*d0:>Ct@ ||/ƏV HP#dJLqFwnO8HEtW9ƳLI%Kdh' [u]M|w=?7P"0 VݤB ie  ']5gE^ڄ܅@!g7mK *A$yYsQ\C`S՞L"Hck$g,PծrHk[ny #>3*1eG.r.iؒzH*~yJQΞCn&Oؼ̎pXX WM4 WZ\g60gIt>2DF.6pGHSmH^̙֩ H(4'?1)cl@8 I9_ժ3)2_yOS!4ot;~/x(FOכvVi#q@Z69:0"| L> ݘHk(B$2<:2rJ0#?9I0uR +Nh+^4 e(VExe;D橽k]_f@ sQ Ԇ Qv p9(k/kw`@Y/ P1V"0vB6=*\^tni<}UQP G,1N FM޶^vݘ?3orQnxCt漒`eژ1 C갦Ѥm Â8kX. ʽK/6>(r:y/mq3*m.>veyњ:>O7P*=h,޽w?9p w`՗r5{JUٺf56^to}Hԅ@\$TͿc@Cjx[1}Ե.2X F᭄Da=/J9 ~/lX˨7w@IL9yK 1}İx&kA5φMg1vYB IX*b3!sނa_P$jrAǖÒ+Zx(4l dr,%G1{fs5\|5iE'بN ۛ !--bZ5ګy\]nkXIaL_zoS4B!%UHw]1",'b- I /VDD4/>н,d{ߑC ` imFQfF5yQ04Z錕Ebya%V`_v$W@GU/'`Ja˵7$ q[3pg[Y+nI>8QCʳ_끣`v)fi$2^~C7@.R3aΤs[7c?095 -z8h}s&o{e^dy` 9V]QޗZ8$w̬Za)ǓSJz=T%hZ ou 4=ģo-h<< VQ+ÖG˫R+҄ܽoGO-ozN-[J(?%DAoߔ/dy gwf.~Dv:o(7rk3WC{憦!Naߪ*-dH 5`gu4VvӫuGF(@@'- mG%X!ejW_F{3Tޯa'h ~5#bZl>W} zf3U'ʳ4XX\4HWj"sԙ$}~AAAq ZY܁ε{wjk40OA2S9Pɞ2\xvWo'֞ҏ 0clu5#n%#~oΨyjy;Ѕ{c݊P}yd7/-W;QUE+4CȎ!f$2!_)]saҩC$OG?^v♲s$ޕŞM _jqd)Z9v@o {@w>Ԃ#/gȥDѭ75y gp Lv Ml[  y#в:8{Tn59(QK$=!9QM{bw/)eLkȞ]1cyF Քz +l:E= e=ҭX^W@(6Am 5k@S?\ܙCGi1tz^Mc:7j 1%/vIW; ] 7uP]l|s> E%oqQgT/Ȉ4跲ʤ&G^x&0󼾲_Vh_KpNgo?&DDyӢ,滶Y)oqcV5$ A6 t7h, ?lS|~^&̫o0V nd,!Tj8cNr!&c>}ꎲMb99eB/Ά"S#œqky\T]#qbU5dh`5faloM# Z<fXl kj.2r#[j3.VKy.e@yeDP砆|_] }xM0g#:ȧ'y-1~?ꋨtl޼?ۑ_MT8TIl,l;i_h>2uj=I|q‡J۔c g_yr:BpVX,5wO [l#7J tIOE;6KQH(C,J KяÔoxHv]mTqq;FY*6׍Iu;9OayKm[7-xPb?[L|g wTZ8`AT5kLM3.7N6ڕh C0=/ dr:gdil ^rFs⯢,/*TQ-6}|Ec/ݻll?٠d=œGNJsdU%X+S.#Rƍú+~(6ƴAy- +h:Z¤P3 LO7^nntZ}USσ2%EM T<ȵ'ii鶒_?Eov<OS5ve+@^:>L=~Z[V-cę 9,C%b2N_8|,,m jK"Թ[SܛsD 6Ru31*RmA)?ى)ԞPpZ><`(7b!LJYkm,.+4xeU{ft;U9$ h7PAE8QĂy3 crk1MکxS*h3F\x&}v 0X(x2rBȗi!PLRӆvr~cɋRko.ۙ*Rk +t &XS5!IKte4K!OmO?Xqm_SJDUG ٦p̭q؊÷t5?Y{:ֆ W E@sZ-yzzc| 9`*I>PIdQc%ә_~;3ԴQSW, nRWW_(IEB͹뭯t#˪D^zď7 יձV, }cYW3=nIllm "4ᢰMOjJ 0e^QdWt9'O.vH=krz/BneGߗ$mLFDʔW-\*稡eY,!#Q 2[{iiOF0/k4sTk4 wS6FGolzD,:4wj4%LVx22p=(u ~g&bFd1t=ޥ65*v53S ڧWͿ?@BÌz!Ϲ_ը?S炕m&;7Tv%'l&vY@H)1da_jCƲ7Wݝ֩%wy"a1Zp$@1OO$vomױ"#&yQ[c$ȇNe d>iy/ylhFEP)YM61ΈHf@l>sQ kL3Tzt?laSê$|jqBp,0YzK<FUI6dW&0~w [ b-&Ώύt8s4^= He R[`a ΂y+nB"%O+r~>0/[!]" DʼqҼf[+bClס0@DHzF Tߪ>iVQ%McF|a .QG7;@#ǚ |~ VI%e&!8 Ĵ6@*4R2zl!R?? ͓L8k.r'^ή[b252[(wE׼QJHV|>! 1iMQ"wWa>a8ϧB¸Y5~^߀Gi7it&FeS$OM4L#cLȝ@# QjEڵw~>Ȭigg8?.$zQ} ^l6)k@Q.qLAx8|>F0ƭCJԩe78uv}P\#h}@.,N? =&"՞EigD H GmeIy&v`OL4ngZ<D6(AO ~ŀtg DCi`'²Pbk9Xی9u2 [W1CdU9gBErWԼHG&5ӡDĒ3\N1ag?&ƁZȎ^oqY3^=@>Y@wxhwfhd3iy&MPANG?* Nn9*\ ?CެQ0H@Dӏzɀ<2%cQ+JaN{me0z=Y"9MmfO1$B+w]做* oh [&&?|_7_Xm1#яtДLhoe>tՌy>o f|)J=*naJ=jUzJД6 eao=NuwiGA _+Pߚ 0zQ}#VTEOaAkFBO@CLN?L9?nQYucu'ۭ6`#K$Nf7EH!%]F-4(֜6kdxv )%D+Z%tG8^r*(=؝!e3$gJ#g"|C˩_'1@PV] \YDt DGWr39OY2oUGz)fp0M:8|9'f hcx^Sa{PtAIxa !\/}8j5h^֤{H-oZ=c43 94կ={ϮFyP7zGK.j)4rcxa4|),qز|tbG1vi줼U )9=8LybZhX{h,ַGBF9+ $jǧ;H|>0zԕᯎH'O4K%r7EѺ%〡J-x2Uq|uG}F.Z 8RagWȡ3}0˹l NXQBSɏ-i}? I ix@C~#3)×d\W+dv*REɵP9G.mzK=0|M;AHo=@yp7Ges`10A~~LîT["o%msx ,_JD>@pL%2ÊGpFi?$cED[n'#m 1bYZy}뫗Utb$IrغYXT^ ?Ht/QEk$%L*&y$u8 <AmY54^HޜOq''s}T/XّD$`o I=6KNr*՜Y 6MC  };`9İ_1G-x,*R-[ݵblVmU{4;`Y~ؑI9ȃTjcgz~8) e& i bC7gv<<"L LE׿}2Ô6/8앣 J bk7ӌRRF`SbS恺(2R]N1:Xm"5g_eW dX'Rbh=:C+p!FO /wIp%(l6c Qz{Q"P!SB*r(&F h»'`S`1#b|֫4ӫb"8\[>ishi:\ijIQ$hGiR+v  MWlq@X{$vhq2CBwށ %;?0d1T0|C㚋(pUy̙\?.09}иۤֈPYl:"~o(H5D5@Fkh:QGO@VQϡuNJۡc~1'|\=OL#~'&&pStXJ> iU21t/>m9?CF~@ksQ+E؏׬K6vYksEQ7[U\r4gAnl$A\vPL= Cq%jvRyCIPô{r.ULeP/!bS/MmI>zF5r殁;sTYhiE)1oC/_٭"un8Q'8N/6o:͵G PF'/yJ/Nlq-wR6ʎ\һh57I`u@c4Nf1]`76Hnz4ľ)3{gt{`{^;i SE4(,];3LϹy`Z>~M^ Ռ3OA ^G~Z<ݙ,ؤ W&YϬ(Hkt6jlթԳԬ70i&%+D,tw%*T}Ҥshv"WK=?VƗb3Ś+&9&Bhacg(\xC^ 5Ks]vaPz,WE>/ ֝gm0txruLٕo8UryX1bL[۬qmT4}!"uȮ]-D+,AB}Sԑ}h٨{dʃU2ryWSVWLA-'U` &7ө1+=ڂ5Ң͔gWLĭgqqlq!HԢƗe-gym7\ ZU9!&6φf.OxP4:hݰ"r4`2< /g:}ԣ+{nv}m.1:QE<{yziQ:Iu]y} E fWDW_1C1QİΓ"gcH%9MyZ*p;`+K)5m-?"IXh-Vx:R 5h|l0$>HIȪ 9ɡ;F(޸Dɶ}![΀G%Ʌ:o U.㸴U@k)o$\#C ҒT`0'Pӈ~RA=\.Jc#`[חO;M c6PQ%ߎ64v<ߥ%ҒWgEț!Wx>dU%%z]PG"o/: q <%t7QCT51B>QdFo;#KW]4Qbn!X}vG<i;#.SsuL ]yKH  L+>魋E`2Qv)ˊ$ᭁT/y$9K-ѭOH`{a%3rBh2bt,uX71T+Y >|+"e كmd8aӯ=* ]xitaSU׀hr[Ǎ0ɰ 4E#5jQlem$q`w1}NR)@w<πq:o0锓dÂ?kN^l#=LMv`60u -&-Zr9W_"2f.tl+-Ȓu'gYZ0"N! , ne08i[{Vy̦4mgs^ ctE~ejӎFưA3}3\f8ԱӐ R&l]+ o` * œþ\$#:XT2 X> Ԫ:8hPr /'qTA,MKEzbE*@tD2ȡ dodW[=jMFKPgvj~Qx6Gi6$/oS?ӑ.:  {fmr'T4wmaU'g8ro5%tZ ց피,`=+}cN;&, ,N|Odn{UcN^i.ӉITz+zjWMaʫ^kG}"tKL `ڞW"v<J<ޘQSҹh\;J͠5 *~ yPk= $LEm34z+;§I6{Λ7;nj{"0N,r_]:Ew c uUakj$l Χh$ZɎB#^89$N?Xi8&#m(YʎJ"D2zLAS07E2AqV..FNl 8 pAd[^zWR{,}BLӨ{{ %oGUrs _WZh687$2L߁μHcfHc\\LH/֋LW#Փsc';.u>EOZ4ܹBIԔ n\#|6!OqXU6~`| "MRx=!xڶڍN\Rh؂xjOQgw%E27I_)q#[M:R ݘjFU;oUԵot`Xe'pz6݌;񛠸VimX:u%hgdƓ& K*SX#W.CrWj]Dzr[Bȅ͆l_ys.}2͐N S_ѹ#gY%՗4E<1-lk7skGfvۚSzbsϗ=6g3μFsPsɝcm8cOOA\z9qp-gƺpXϠ2h'P; )~xw^τ: Txm5bUZ$}E}"%.BT,O9,IEA}4DQ<8x6=b5s GB?R'i#ܬaƣ2EkIpß6tnqU̵U*c,X4G :*$inI!}B3PY2Ooa F4u׵3DLzu\J0fy!M$ZfD7yƑJHT`EBOpdnn"gU@e?(h}`^!N%Wy{l۝N*/pFGoJx^m&"_MJŲ;bQuS{: ژ1f+vʠ{]=Ό?GVN87ڊn} Ta>AbIPGwR M3Ry$@X>63/[vqM@_t=~ZHS!ȕaѣH4jNdcyHi#1gn=;ŸŴN»UbteFʠ.gk&=^IrQ rpheqY.}0'>/Ʒ&RF},.CDu`Ǵշt-!߰SM_y6ʏ%[ G+ zPRͷ=Tr L3Grf(3-tVK=ڭ}ȣ:AN$h]7qM3"[4Y9Jb~ހ%,_w{ܳ9)li"դ!:3sqO Y,T6i)f<`qM*uUqӟ+? ;oS+5""/9]33Y8G@@ I_$7Xwa=HX;Fz&&u;dZ(PAvxA-Xw'R&7JJ͘ܗg`Fz+ޖyoւ[K}$IKR8]wdwO*ΞO.u ؇#7 5xNDsTU XP[|?)@3s,dWdՌ?t z ;1Pםۘ& (Y:}wfi]țepœ톧SMP _2#$Ojх/`Wy:. 􉐛 HY=:`=}9fq) a)!HJD=`Ym(Yv𢀳{g)7g% (9B"n6uV 6Ð/ dD [V!=>̼M;  cɘyP x{I\ЉMW˵Y^}Z\;H/7w/fL=i)a-7)5̅k  QgLאonpr1:gnqf٭T098ݑtFc%$Clej>Ux/Y[uˢ*ĵ4`NZd/F\^ͭ6~lI'SeeTՙ]BjNZJ>pK@'Sgg&| ua|N.~ HڮrJ-Cy|^w9D,O|Mv=+%xL;ɋ׌[pZ2 +>2GpR=eu3n7U=ؚv*+OڜŒm>7م^L(z=et:kh-6%ZM&XywAIUKKwn ;" /*D@6D6d6鋋 !Ts_k v DY-Wg`H?Mdu_,yH&(]BC}Y_J9Mn}n%w?P[};M?0:D~-K$7i-ILjDQAA` 6C[+db3 @ţKP<Ƕڬ̯DS7Ij5\UpLmB$I,nM ߤٍ2eװ]ZcC5/1d ?)G8JO*i~dPFM-S+ 4S83߲r"AA5] E4 ۇDz7&V9%G=LЬubǼ2Rp#)Oj;;_hĆ&agbjUJz̈́tL'm]#$V |22 #= e vs Px}d7ܑ堫2IqϏV ݃7k!U | M-QDQpnK=ȊMVA YRZh*`[dMvj }J~an∲,BEa)Kk=?, bf8ht^Ƅ1f L*d};@GP7T  x41˫4sX8[5i`~ HSdH{2٨x(xfbxgxysb ⾳Eا HP\9߭IxlR&q^59T&_⩅`FŧKϡRxoU~ФpGt!Zw'a_JrEVBoh\HE \\/A㼏v/ 2|x݂5(l$,#"_Oʑf0>b)Q$BCIxU=JeY0{ӤVKٷN(? bequkpZQ=@@=Y!76KfԾL9Bx#`'DW|A7,H"֛싍| x Jm{:T 6T'`~Q ){>  ,['rb9CP HUr#*|>:~B_*o iI ^ād|jJ!J̅6 ?V8G>Bz\w}jmZ0LT`Lãn|ܞ A/GZm&ÇTC~R.  9bK 2.P,)M$RPu?TOh Ր'/SggNsGM'5椔M(Z4tLQr*jbNV3R6 s fgqtt\{)=) /kԈFɱx@.1#{c fMT mtbVZA|T8@ޖGD t*-dT0E^.g!fL<{1nLt + Hي=U*!ȵEMؖI94xҶS\(03n<ٔ{ pS/+*jb(6PQth1yw8pFYLx&d}%jn2(0>~<뀮|ٖ jŅ$` C 54kϦz@iwܬ_;`7@ڣ'L* u9+7 x:dd"N9 zYV@:5}vzƟjigI5PCBxxdTӶ~S4dz4$.䂗R D|g)1⿘|d5eѿ ZG}vƈ|ѓBHٙ*y2aEP4tMa@ x\~Bx'9g3Gs) IrǓdݚq辥_RJy'{㢊.$Sj~%aH{^"ƢTGF ffm -S=9|%Q fg z~|??8+C1Xn'qYABFN/zprvr‰]|vȠ@V`e%8ʕD\.)hPG*ppJ{=l>\hh1{U^C sӒ'cgX3]U@"NpƵEG*mwSw{?$)kQz}Y­azYmvt7c*\<6?.+8[$:xsO-uR9w{4 j+J2 Q [i?АØImָ(VKwgy}#$d+'Ib4& 3}(>?Ky'ny%߃pQ±v/yoK,ϛ= vπxjkVj j@wP>Lf9&T""c:ҦVx)etqdfP8wl>@ѽWôCIG'+M[o,_#Y nHK"mn..Ț3Y6-E]?GRqĴ)Qbv-uD%qZ?Yf09):"謎Zꣃ:Өy3F5ct*, 7\˂<ھ{:n-vypg*BKewE|1 B~ `ڝIbWp5bNM}/{ e0s82k]X^.ho 8ˮ]/ScoB&IFU}dOj+o8諄XG?Ul}'&kxA Pﶸ44Eڒ8r. 7-%dNQ d˚V?l]?q.ůZ+LHLhI w>Y&;'0%c2}"4Ka&Q$Afڻ١,pu^j :Cg:b*l;"݃N` 'iƐO3)bL>lt.(/߬y|+wZ{A,7q~߉Jm7b3|FnEɁl Ll@I˪1gyrp15 |%,=MwhD#C9H+1ޙF.3V#B׷}Mymxp~0(20CE  yUQu$NJL_G`}LY?GN0P +tb I3w)9'̴rqͺ͛F-.ĖYE7a0y[X O(^cIK9D,K#[9`Ñ;pViEJDs;ȲYLsۏ[.w&ݬ,c`?|wJ%g=G3#OfDf3bA5 L") o2ƷΓ!~x;}*V^J Ԩ iOjM:KՐ)Yb|KkV(a1Z;Y-,hd'6v*P aG Pʸȁ-2kWl*ik04|4y᎙1&8NA4䈝hm* ζ%Tb2GyyUb(ž'~y^HsנC.Σ~E f)˶Lġ-+* AĘ kǼIV8Ӟnq vdmv O/n }R j#/)Y=Bק8ڀcb<̣\WI&sW?*MOG|-K)﯒cH70H"AAeũfD)LFcAsH nw@ ZY^ 9o4L smQt(u<뇋6N}=A8{۲QK33A~Zgm^5KZʶ$^3]\WɵP>ioc vɹl =b︐{+vjA<.EFu O$_װtr&2, _6%x2(򰚕"[N\:&: JtIV;Z\ N $^(myJu__.qڦ:x%8n2+mHaб=?A% 1m>Yqbg_HmYCœb |vq+>mތ r8IA{9Q'g}<bc .+1J'>ELjf$ΙhU[dT-?"TcD.IĚ%DӴL9ڀUҾ>p u8EL jw3]$rrhj.aF[`O? [=P1Ĝ "H|4[z&߁͢\䜹O#D؁mfHSEe[|!6앃\N%YU|JIKAj|BG;h?)W%cL~Y@0͔ـcmd) c&5\UݎBIEnb!QԄXhq;YOr04oG؃WBJcK 9%wU3)Rntv)lrR"mKs& J=Rʀ}}t2 Xgw ;r`0=^)=y&+VESr3%' ˦dGvr1jf"DQ@XԎ CC4U_1iKY9˸Mn$5녌xԐMX(F5AO$IMA;j[Ǧ0CfuM}m!BJ lLl3{Hs9$m!hޜ IQcƝ|8(U> ¢gkf-5n~ b +>annT9Fs: FsN0թ)dl+XGj gSWW1&I٪AUM DȣXw iWs a,!ҁ~cZr,~}n+ +֐,* įH@T.0΋d vOڍ d!Eiw{tF3zDר1jT}h¸W|-b !>)ظ3K.$5zp{wHmGߊ#:ݒCE)%;Um13-+W"0$JҰxac|qQr5G^4vHjM^{1R@,*WR~q:y:$FA7rs[(m 폳+A pϊ)H=͆[0cPn4a!ӅlOkdQso\u1jG "g/;BrAh2 AZ7"4fmB#k ׭@8Q154#i@HAYm먛W(4O L:? g- ũ~Դ9qG/˻NEg7^V?VEi.ݾ@+]}r , |_PNvK:3k]f7 vx%> ^YjI&#gg4帺%E*Ҁ+;zu5xE"VДz@I%uO6%{ZY`;sv0bf-䂭+!ލ?ps 3 coq$#̸*#@_'MCǵWũO@5ΔkK|^t;D.RobXՎܖclw\&SGfD]G#ͿJ(_ϑx5r4lւ{H f~ kT]HDjv%qā]aIx? ]KTakx Sc<}B~4pPBG->.*Et_'ܼؑnEե]썡T]Nn84 ҼSpX-=-:?W+֦ ǨbݬAhy1CZQ4_mpDyRl~k"p8H73Q:aQ>έ||i: +>X.F;~ APA`0 |]fi@g)2^M*Hg~_SӀb5{DUk{ń?=l'U$,U-ӠyUz  1on^̨E{N[ԦS/ݚ,qʤ1 #>H[`KvC ^ UdAO.~ĥJU=i=< _(QmcNߙ@dnz8CK^o@nGګ~UW{6kNL Po`RYW&βRQHkPy::^hNkLH@q&&]'fEL># Cdg2bIОFvi( -&J]g-L`TbƊs{+fwѥax+}z僒} 1 dH(.=x C{S`9Vw b|sF88(o8կ)$?upkF$U`?ۡh9 >c Z1Eu! B2 &zFr|M#^%6@&]$\˔4N֌~qoGO<?T98Ω9V^0 ֤}BVseD28w4MeaG7 Ie#s+!X9_Cpfҥ'.gK~r*EtU[Mt,JӰ i޵; iwR/Ɏu"!9k»vq]be6.P ZIG򊮾"W}|AiJ Aϻn!?gZvKw}rM00;H(EiP?+:7rx.X0*SC[L4j=s _M nxOEhY0'qG.QW[%G3uM&)Ѭ'2/O8J6\}7qxO1/͵=J!hs{SA%Rh{.[(}Dd@FĠ !;ܨ(>lβ}e*Ūk1% Ыq_#r #K[j G-PTZ x36{ .Zxud?5DZH\y PL΀[` tE)͟M?{:-$] 5 qvydtWqx.t"mDP3e&J?-]SsP&\|@X]K",3"ɛ nUwחqh/1{X!Z+F)0;_Y ma=ǘ\B.*Ŧw\+!5KlYs:2aMF-XeApn'ҝvby}Xe{a{#~$tʾSLns>11pݭI@$p78^}%>}t?Cv`2rf_gӆU\8YjRLDȪVOi$nn\pW5!ї < o';5 NRSv9.PѨbh53b _04LM?U4a*7.mHp)Ϡ)&%jSNxn@\RKXy'ko86mo͠DAEbq*n4(M56ZG Yt:y9iߞ6"~zQns"8S,m<3sogd up;M1AV/XLvjC\ʶ "F/ ;Tq 10~y϶g7ǓIksiE?tcyk-0ލ;A2EC1$>RA#u6tZPxF %EgmWgPfHK5q 1QCej?A9;>|/*)&5Jy,G ?~ӕwz]$̇yMc~C3VL@ء[ltaNBk'2:w:>|1?Ԏ4AhE}eG0ΐS^f srK^Uy ەR8So0ݣ~ /.Ijޖ) M~M(n&3A:C-i#T1,$ĖP!y;v%luBEmOSOQurD.lv ;~"8OpTd2Q3we _c d3㋚ 0^Φ{vX4 ÿ:Q7S|JpLRLs]QěO9;2GR0n"C]˴ 9)m|V4 tǸS&(>wTr9BوquWL451/orho 7XMy%p͸4jo-M¤f|WKbԾ.~QrTM"'SШcWsd;m wY׊g"i!I!ei99,&H0 ɍtrco-<o[;6iXgDй2`3ȏW+E47fdD` ډmCWI_wSLYqȔ0--;*aj2 Rxy {!Wvg[ni;*@Luy+6}WQ"GO۔%VN,w˜94 _ J^|]/ѝQCߥ 29NoS 5\Nqzwd9or l֑^_OU+~bsxFqVU[ӻǰn 1n&8QTy5NE3k`!!7]LF6L*>3|/mN;C<w,Ȑ`=38~G勸w?b/!q0Jjjw=tI לisk5-'w˩Be6cԀbH?ElKD;l)[v5M8#ԖjNx.yyܚC`ؑٿT>;ጜV"]n&$F<;HBV=8#[šS@RމOkߋz25Ґ=כ v{;V35j ]V]Py~BwOn$3| if~qLN>Yl1v+X,CRS$Mp*A෠ 5B@^f_\/ɮ4 W|,͗@"vut0G~^b6M(!+"Dq0/r^}({*/KOz1rDKD"NOw\l%y*٬"qRTp֨Z//&q]%PۻoT&6.фHo@Hf7xb&&_=5󷶍ȁ *:SsS~5"f!opiT!?4Y2A;Uim$'^@L|yWJ7ֲ>vSCv/N(Zkl"m(o}<6,&|5%::RsTk5~*P;w9սP]6zd^E:tvLX?AkAIGĠjASzR,lpw}pܳ aSRim("oovrKs0:K:BcND=Hf8 q+8HͲL>!|wnQ7/CN,5 <*).fd#n/ Z̈́YƗhajف4o"z82I7<#!3! IuIX_Ql465+m3ިH l?Ls^ T> 3?aV{uEgs-TՅ5tB^-Xw7#nĒ;" +&O x"f6 GgOVjI]g(!O/Z%]`x7B`/w{L 8\%M1Q-&i ȃ/⹍#p&8Otv瘸ۻIj8﵃#t,ZׯޢPЛiql+CjHkrAb&S\܍b!3S߯% In%BYmzpK~+BQHXTҎl50;x Á'cB:/7)k]7V3f"%;VKת,{HX_3SSnL{d(z =_1XTT#:0j[t|PwŎ5 o*Gn)S. ~K(B/| /OQ~ Eˊ m}'6BU\$eG0kܶ-ypB- E:¾'d3IEF>tEF5Õ")&֎9-͡~ǷlYkr$#6Ih3GoZ֝Yo<6ט`C 03 @8ָ ?P@۳9 FGOi7!Kf60]: 'XG ;Q&t fQOTq7Mތs2 ̾k8\1zlfF53(ݏm+dEDvCh6t9d⦛ RY9 b~ |.!Q }&;х/ TP\?;D% [jz;\L ?Xut^Ix5A$ɔ]/rw4J(u͛+>! =w,A_\Vt :w5+U'`o ub%fcWam4tl638 uz-]>ӻ*'<Ì?Qc`jHFI% a w!ݡ$uFns=^ FWܕ[@bt/¹(B>Ӻ G&BwR<zZ4sPQ3xz_?#j3Ψ0f흰AA~MyE(Һ>"s$6^I0C7[G|k=J)Ӆj?_Yj:+}Zm<p-N޾p$|6}@>fJ[>n΄t=8q9=0JU:-cŪ?p,$|)ӱ4MdWa#mGnxmf9kU8%ܳO>KK9դ|ۉ.C=H < pC<^cSw$P(#ІuJm D&ݢ`Mi̚a=( iO>O7[L7ܒ\ȸempAed"L/WMƳ'o^nd5XrQ 6ZlO(Xt\Sr2r8s[uf ]rt)m3vj+籃榞}?todvtkH<x )9 [`T!=OvRaB;\6渕_he)ƥ ]aᠰCw45Dyc!bv՟0Əu _V>L3HZS!ª8RN4?Yl^zX[=)ڬz_E(4yuR~2XKъOO!p]1UV|rN AB@GkQb8,AHl.֎ (qМM8'i5k;^d iקL0h- gU0p- cFCU =i?Q$uͻ^`wo_fvݰ/3m, ke'v/7=TW2k njc3Xp儠C7x=v ;7CLD1E<C}"ɡ ; ):,QHS <^w\4.E~{$: IG}U 8b7ӞWFy]?L(և=yS x剋;_ J:%p76㤝Y $9/aw(vPdB(yh;,3^{a=u^$ܴu*M:$tEUNr*(*dtCUfQ'T@:YMxJuV!>GM?bI'啖>)M *fy`C#5Nh=xSv#iĩFE_tt` ?solא^qUJ: 4 Fni[֫v5([~z=mi0iNYCK.w'O:D1cnMBbAQ0nz4ײ`jcm1O5rF{w,j?= 5Ĉ [V:GZF +勮KVcƣKP*&. 2P> )J4%Z ^c({ǬRcw)\I1&$oS&ܺb݊;ep v6V%@]tҵ[{@[T< ywi6-2J@[ە"DZWiVBϡ hKƌ[!PMtmo2T#Q>*eUEx̪B on澿s;t0=<Л BT̀@g cl26 `z%e%*/ZMo [P4>Xi"XC$gI G/m? Q~94EJs 3ZŅ%D<6^|$k}+x2P*RLb'v١E͓fqbTs Sjo<7{1݂ NF ƽvXM딍m*'*{j&G&hBKn>p-,n>+^% G \hCf|}S}Kנzy~H&~ZS7L"]t{%K< zz% phʱ[6'=3[l!6@ãGR *i&` 6Fdo=:*a?~jd92sCD6 ܔ0j ͩ q-&/?JsQ:<( "-)xMCUvZT;l(8sKd)B0MISM006a5_a"7 dtL ;a~L. p7R/4P*)vp w bL۪iPӒ ;g)~joIb)/@K(vsՌYIԉ軗84|"7$\J>re/TfIZL 􋛂4czeZI+g]ī2 D(PUwU czTXdĭR0)v#O>wH @gU "~B.k;`nX4[gK6y>:@\DWi;0Wd ed\_pVnETe*2_U\ix6P-b!|"s0{^2Ҁ9eJ%hT' s0 s%,9`+ޣ0X"d=K΢!h4Zi)?qH7͕onwοA7u*b8 ر9)94>thMC4[ LDX =+"&" taڕl3:UB݉VqeќV⭄{{< yq_e g 61xc׿KЖ#Vh{<,旉]Wp[]ŐݺnvuéPP<|Й7U+|wGWNi%gy0V/VsPK6 oH &=dEц\5>e1bq:ӼeEEup{uSO[&0A3!s~& +[TdWxP5(c a]xʂ^eͫS,XzI~!Ƞ1M:wsPG=GiTPľ* O.=[d79s22pM)a6 [9D:iwX3]CU 5 bV*C|uCV}F֟0U]mx)܎B:FKk0]7%Qڻ>@Lz^*BɈ\xI&Wa3Qc{0 #׃7{ja_D^0 \2&bM/yzvqE/gQO_abpo|2D_VHTIU8w A$ON6:Jzp\YuX&&WŤS~rrp$l{Í>S'&i/'1$P+2w*y׬'6s#R;[ڼjAz06֘w ܾ;G,ݣk^qHo:E* ad$)R#W?Y JEpjuju EZDԝ^W[)d i5Efm#)q_a GOvWz|O&h5wC]gG Nv=3Zhl8㫿ߧ敔}" @*t~D 1tx&>>D|zTQv+۬7Ѻ2S]Lb/)7Ф6` Pk,_d*@S|S8\QgtqFV/qE&C?[ȠvM3JR.*S4yStnO~`k"(ѩ&aAYzs+;V1ĝgwF,`&HUY7 Ҫ.ǗMljd o0mD ٫b9~32Ybz!5ȇ$dh'mmp7"$o!Cg5*VXS1c--G"q! kRJ\6 {ƕ#c+~A_Fl}ሔqk^n7z,6.vZMr)pgKˏ銊ov;u`崹=gV SU_]B[Qf"yl^FC.-%Ub{/! u Fx'a(5E&)]w|Y f9Q',%.L1*RCjxPJnc]6eխ*a4O)(^XA'TY0Og6@Z+/;uQZ5g?%f"q>;xsftkkkm[cm\a3]כ^ }+ai@ϡӘ ?T0FZA BI>`E2m;ަ!Zd먿ը㾭2ؚE\؈k{~t<ɨCn\_ !tX+L@,WHI컟4`%0i =Mfn4Nl]W Kg `ytBz (pE{Z4tQ,6O*ard# 1(/Q?S}Sy}YTz?Vf I<6 O^#HI&]&:m=UVpKoH1T;ipKo(YR)&Zhir{"G8]I}(%ȨM̍v}wH-{W\Bkߪ#8Dk`~X14z+I:;;*` 8cJ`AbhyF:4@^[m ^0kl_ev(^ZJ{d:t׈ReySN iA 4[Ԁ֔o7+oz{h8ȣj-U0@ # bIbmPbw7*O\6˞*WCtC~a@f&zkein|$gsJoRrd\a]O)˸͏ke p *ߎ='9nmj5c^[0|84*Ѭ]~8R_5Ssou}iQ63GCf.A=$|WcoHy6s^o]K}#NAGM/'pm^u{s$EdO0`ѥAЗǾ:;Dkk&e;dVdq7/?d D0k[P ]:ҺS@<;Y@Vsh`)bP{ _e 8|<:Md!XrMra OÇxߛ4+Ύf*!H.ιcoL r057ԕmX yFm_^'Qm~%q5.{ȣ|4&F[@)r  /% W*&&eAkEQs܀hTr/0J5OIdZ f^&yB7g.)%$P5.KxrNMS dx֭v4ޒb$˥8Bc= #J՜ >,|E!e^7ⵌnpI3{KFúy_EW`Zα :( ͧ9l,;F ^Jġ/7F*yOs\])bTEN$f1=ps_=~+=XcaN]ZH rD$'Y;͸/c'uϽA;+>1.Qzq ia\mim`b7'o|]_{H5网3uy!9 P ѧD 7hj>b؜}E3qE؆9km}Co6VlE3I/w"ՠڔBzR`1Xz,?pG+U|)P-%+ "g=x3:uk$YrcAELl5p wMQ)K[rpJJx0GM1 /In((kd,^\RSP@nDra1Oޏ.px t{QkGA)`AQ$P“=ZiQHNp&غ-X# :;;ER :vK*&|S::w6VüGl:vG J_1{¨;&3o)OT?B6-F/JN1@eζ%A} `˳=ROevOMgƺy*dN+>L"7ڑ Gq6\y>j/'lS6 ,Z7  щazaS9&R(0d=+` z芎',ww``ԫ5 @LTcxB~?^"')zIMJ:fNG3: 蚢d.ݩftV^EeIm9FSȫGec1plkQZUH zx礡}ze[0l X'8}%3FB4;OE>Ր8"ʍ6L0++WSOVS}aBF*m*YH-.t6; BOsPZP"[څ`TmǺc`es w_F,)V5٫Ԟ F,kBD˩{&H$v8ŀfaxoR4ֆǔV[qDc 1 }xB#=_g C&C5MTlt҅jUŒ\kHO4qW8$AF5@m? BŭBqtD5[uZe4E, +v3w[aQY)ߥc_A ^=/X]Xژh 8+`6` TnJl ΁O}MO}I&lSnnLC#K2 W PcH4Gu_*ZTq)+(MjL/pjfW+)l=K\»8HP1Lơ]v>0q3nf"SS9a/#މM3 \:kt|2e^$,br1C$(?;%&>J<}Y_!0wp-(Ֆo3(gۍ|PŒ?P4Sz@@SZeS|m(f;B~$o>TtE. &(–hJcj&pWG .Iܳ׮)Vr+hgCCǟV&ڶRw9MRj6k\]E]slv{07@5 - .u[iTw$GP".PռWKȖR=u\UϏ^ѹCai#p_4Vl OHBߖst8,*_KmmGO] xq?5`kkw[uN0@/Rкq;U:HưXke$YOꘒty6-Eʪ OeBۄJ$VsɃ{ݝb洒bcgm;.5H3;s8SSTd+Mh_1ӤZ^ H^,]0)*34~ܟIV/fc&oNÐpe؈yt@XqBޠprL6PwBh5gDO5StũleYlY$s 6@wV, *vr"C%ceS3m[FB,L7g)xxrP➲,Ke$[wm <#pٔ(35˙Y N=?)nRFeMbL/4$,.RMV.r*OTsۨ\d7(wx:5JB@KyKtb|h g~[₩S; B3Ť_| Ƈfjg*SAٚ7O;VB5X >j'Ͻ--#MZ)pB[V+ BYϙkTKD]`&vJЭ7G *F-6 MX3Q}~+Y`daZ‡W֢o;~Y~[ rQ!;!0b.4KhG?^nZ3B9պ/"A v2-.ug2>g">8W:Nn] 0H"AnN/#tvBf@ YKZ -m}}F{:vbMBMXAM+ţ& zetp43ps3Y- 1o!ْ\P}~R n3ذ.BveEc9KSot# YA~n%eɽ.>x#fa؃}Ϲm\$oRMsИ1䯁b@Hj(5b0,b@b^ *H5VVl[!X&VlUv.S<תx |PnST8-J(hj=Tef}["D!r^0@k1p*`fߕ4^+Ő۲o;3#FXjؔeˇԧCԅ<ՙj عv}V@;{q56_O2Xj''BZ՘+F\^+c{hf\tR0\ GUR%^MY="D`,2)m{2nI6M! .!U%7(7.#;'`.:2lFj  ~UOe0&,@&-">AoRUk?tf,3~/g)ǣ`'v]3YfSD(_ؒ[hC_W]3Kcq\1E#JCJ_j*9pmwmJN/As:$Du)aomA _ '6cU h#`)t|Wϛ^?w}u]0 eN$+BvrջĶ:ȗ,R^ ajr |΅/tC?-. #lzV7OL3u;GSL(S4к߅4 /QDJ 7:@w;18Fa \3K5ώ}NӽpfZf>0#1pU]UjUB" n++5.,vި#(ԭ~$b1k キ/sҕ^٭ͥWbR m>d[5 ֋$Deb˖,rNl #|e6 <A]\$\_P{"p/EˈQwUK-LM!ǒb_576fl ]ϩ,R@+t&'5:Ȱ<$R^+g]>vA>Q›tPnc0X㥃K왴h8Gj MG4 jm@4aqk9]T$xP#{a>g{5`ﮞ= =Es G Zvv'7ֆ3/q\s.d5F2Epe:"98 3QA ,j1 :Q1L* }{rH%y^*Pz䰶@UNxÓAxRTZ E_yA?+e*6JzY36 [q?$MiCރۊ$Wh? "R ڃ-њO:dO;̠]NHWٜOL}>>WHJk1+oJo}BYށ8q'A{eJvib( wPK g8+Dc+걹lw w.4j!=S8k ~cn%]hj3N(hm~!65q}bpMܸ8V⃧Ay7FЊ16VGP;Kdú|fGH!.' Es RiZ~3DߵBk ̬$hU[ԏjMCEUw%L/t:~f9'ОizFYwiמ!}C*rSS^qHL5JV\Z:D{Zyln[;!Xի,>'¤O9z_./9v \طiPշ5vu׸yP-?:Dmp[AMwE]CM b[f6gS!61i}/Vq@%x'NcKIv Eiz@뎿Пhφ*,vr"nv̔{N>ۤq` 1PbK:%5#K]Xv[a)Zraݘma- Lv$Őaxi/g w\w)QxF)$DM*85o y99ځ٘˒4g;ұ lS~8sX1 6[ $Ec/"wgމQ"~ie0DҤJo  O6GeBT3:ܢ_laȨaRj Ch @*}RǍiciQv̫Xwzx|Cc/#&bHM)&Rgݥ?)ߛ_'T96; uUepH&q6< 䊲fye&D4|Gu~!9,еy4T7Rd!BLE=;R`^dR!4A%3<[eb>~IB@-+H(űttyLÓ}fἻ@T=ƾ^t]?}+%ȓ*Dk,rm 2[HgİߥF֑CQ-knA/Eޔ@D3ա4Ճ*BlRZwYk#* zn}5 P(Xa3W#w* =QXHlo禎h`q Z&Qf‘:  Zt顷_2i+)2jW`b "ݦuk)})bI}82k$A~ d>$sѥQ,5i+fe}U27K z !o1WK+FF.Bh# L.dx&=Bɢ)/hzKNdni,g+ʕ39\v-';2r [sq <kecg71ߩo` 1*RRz ƝT\#46d Sn?snBl BWKyv-`-rT )|uOO:jNSj Oo. 7ݼ 'c(1TAҦ:G#1)cfzCq̲xkoRmc"2Q6c,YbSZ2^=m V,|%;Rw'/pMhWwt$y!N~Djn` bn rBeg9ŚE7WEpjR1zĥxfE b,zfļ0V7 `qb8@=8Uf5a£f')$+:N~i%@?C43s$@W6Ӌ H5, #G5X)Iaf/ ^J@Iif3H#Mc O'!,Bv6s"O^g.Z\. Z8h9#^M/e8,(eq?46J `!HuNufoS9-m Đ*8г*sy<$L€&CBUq-t}ƌpBi&]]A䠊bmX%ĨQNME[2Sms~\bEO I]f#qF'$}Ĺ`#'G8{w;cPh=(o|bu޳"mɂ_5w%b(biQR1*4ԁ߿Ϙ\w ]|lH~7t"C(rK ܠJw#Qy{&vbq@_ghV=GAAQ*Xc+9c];vojwG0jn}PThMgsNy&#a'NG)PA|IE34Ǿ5}ڵZkoRz}Q79ǹLJC3C: @@ YSb{QJaU]T,J/&D[ ˕׶Z @Hp]%czh&[fz${BxA%s},T8лcYt!3|,${ !!B;Z~(`ASWK`w)r\{e^l9"qxp{α`NJ`B_+UpZozyw3_#AשNh~?@+':դj,'%9'|56 .aB[w9v!q`tAIg'4='c$iv?/3ԃ+TCۭMLrvE XBu.蠱,3dxB>5 ~;$$@U[!P=T_AiVyin%4s] =G)XF8٩Ja$FiէKE(y7֑B뽾ce)ձ5-aP9f*bԃ`JNl;?]D]3)U&;Վ[q 1mkűQEH L[ e1apVA:j+Ӊ7;ݹ޴dw7!c5c~{neVE;($T۵pƙ12:#2!029[Edi}yh96yY !'̢ ( i7-J`MJÅȦi.ܐJ OF-.c]AבK|fV;*xcqz)[EIB>lJts6gpLC.IRov<7|#s_WeFPѿٺ0hvmV^WO7DR_( #FQZ-gkggce[]]R9lS@5uFG6|6aY1'.I/pıAN{ UI؏ߺwp݄d X@Z濚A ʕ9jNCE:3ȹ.z r΀[_d>5ڟ3k%.lۨp_pnPBCiŐ"OGQвk-+qkuIpXRLgA`xr3k;1gj`]d{}j`yjZ +IS*X-,- %M馠daCEhK6N q#rӰȻ} QNwo^y1)>H}d^` <+~N:&>YgJ%y)jqlYbh?< |d};|:և52BeZR3+[]G7RbzT^MuXxϓrDm' #cKg'T֞!"V_,sX5N\qG}qkB*"4/yӭaeu׹) _w\eSyՔrxCO 5QBʡ/;غї!Az8+g<j(8oxx1^s^zsƷ8Q6@*Ҫ4_/;`6%D~k.vZ.! g J_K_>LAQEjWxu{n. =]Kߐ:c3Qz'4q{ёjXa_.wNG ( `#W<~wYQrhS̨䮻LL.Ht#u8{f3&RHhǻD/Mtf-oƃlC;XF05wb|Xg;gFn`N㴴gқ AZz00V#|(G_#4 IοJ,9#D2 l}2B^`u:!c]oJfkksoeJ1Z#ׯ@mSxf,N_Qx#Q.OCKk;aPiJ>|%RA-T>mq7,/,GHT")i,%/S=y$\AUDy/P]y ß LTĬQpܷ==d~e,I!OFǪ\2wQH :hzd6y=9 ߞ}~h աIhj>' /jLY+1د <'">T.5D6)Qbt(( jiL|-m-}*VZDu$DoMR`  * 1Y٪o ۑyNd`w3b>R=7l*~T_ؽYr4 9p&2$]D}LSk}rS`/ν4]E챵3Mp!wKm|xx,5mD4BCgdk@,~ LLcoDMXSTMUF @IW%҃o*$`lxѤHhn)PMsڤEw!9Z +^˰a[T 0 ݤmLm~/(7Ӌd*$b.uDV㉞RMIL*Pc),]]-r,%dp'd_W#œAVcx0דyz6Mr>dAyU4a|6 ̂.18@EwkÍ$ <FJ1 6 "=w$C"s5Φu$}jx$a3[ 02 JuFo9&p J,GHD) $tqQ%Go8Ԗ'E5R= ҁ.s)+cٶ>_I0>uVU1%l2n2 ڙ]!D&H3=vQLXW7'/&{۱\Z?y_w/I8I oj1!)%32sEn Ew~Vaj5u=)\kFo@3k<G"cXn%'Eqz Lm)@|'y&sw[JѬס A@&~#i,ֻ){xˍ!(3pmd[?ZuNbyǼ a`"/G vbeΞ# ?^ C mܹ'=`@xkP{n,yJ/$͎[a?WB4#|j s6z3wԷh4.=F?qy< = ףx] ZL$^<Е2؈xn jYL @ꄅz:k^_9^vwwSc01w?-92mԼOOrG2TՕCj7RQ7U Лc;6>f/BSIc&Y 22Q({ `W):$y^!#e}Z>D>prFч Yp8ͱqSw몑;'MRx`VQs]6cKOCgtjx|u#Jzw1S#[U$&}e=nYy@J!_>l;)5וǁ0r8]n?8b3" 04in=h6+LtݺA bxYxp@;Z;ڬ}E{ >:Y'g N.@=b1rI|*~ψ9 j}SsPgTG V+,J< NBy&xQoȝ8<ㇶ\/ik4zo'tNsϢ2֛ y Y˓ƣqXxϫ[G*1UʭUlfs̠nt4tFg;2{?+@_}|lօ6(OҒ̫ҧd VƄHrEX'QV;` ~ o&hkI# -h `z) 1؇ D/OjR $hr"#z/Wai-pʩ:!Jο?g(VVV\ WKk'xhk0݁n^&͌bʕ9.54չD}{Lʩ ;t@Nf/ ½ 4z<[6|?nnZ㉯ 1C['HUu"gs 6WPg!/`Lפ,8|pVx7n>&bbB]t e4Q&g[h|ѕ)h=":Cķjf7g 0>SǗuf'd5I2nq!#=oܚ5#_J-}ŔYf!85꘮* 6UKCHnEGq7ʵu}ʍ=-"2xEou1쇋B4lQƆ%I$ y"yFdޥJf;f&9?q=r+bRGBHw>MP͝fQ6xM3D#zϥOfVn>o۔CQ>4]?IXl9j\0v]UD/*s*tke+A3#ρCgQ"BY*ĦCV|eɴ2FŒkcݰ:Hw忯G0Zdb68# zfyBk]\wgYK1B\ga :䯔ì Gm! ^A&8fv2ܤ)ԣ4E?7~ Yk`)]i6q|vnk%| "t2V)lf<gbyl:_\qz9h8f{psJ9[Qӕ)F/cQ?^iZc6ozڭQQ%aIN}{Hq kcDzv!kdͥœR=":xc:S=;J~< { S{(°lHT8"WšM3|Mgɣ|dۛӼQwtJo^R A~'U/};k#(T!$֊xX!@Q("L lHúp>e74 W&F&R_i>miܐ8^ zIO]Erlw z~ļ+"\$'^Vz E90`ac3Py׻L3qyI,coݑf$M؉\\[5p֝9MxZEy'3YUQ(q.-n>f|WiY[l#;doF? bzk1(T`sCN{+06 `Vju9 7R7 ='Yۉ-cE "AV.9jEaĊQ~)]:qEyi{U=Y&u[xeڅ mgL٣IzdmP(BWVɍ0~HJ͙;g8wUk)`VEx(ˑN۳B-~g0// բ /^ { r켝$?煖ۍ0<j%hֽY_'qY# /NA/LTJ*Y(Z)RN3{mo3Q`#Оk,?>];ܲM=R{?^hk,Α ].A55DWvW5vJ*L'{9p=eb. كW+K}wFit UB0lɝm5&>Gd5vvK|rVgv8֥ÞI9"{Ǿ'WxjU>`]f\TLq+<y>N&]Um\*a vHf]\bbMޜzo5ޏ"!Sv! ۮ4m{L% yNP+$_P8"ﻆUa8]e^f+ӥޠ^{|,LNáb<'qPkD5nv"/ =?{OP < ou#xѶ&HiˀDd99 ;8N%Vb-n9)G`( i{$ oO)LEوwףa6*!tivS&Ӽ5ȷ2ylv@7N "G7o_ҽR=C-8`;]QRB[ Lqp%)/4 .!yUꄍn;y3?qK?A9} @ H0 1'@]MCSʸ@S.2grh+bcj* k1)VFP&E?.Jǃok(\ate@=3Ɠcf~B,d3XnZtX1I(f4]eSACV5[^>`Ƅ*%/} (4^Sonb 5W_>q(@t(|],}6 ] !~VYCM;(_f&uriqgâCË̚f{nU?OvW4ehOj F _b~vNRW/^ `sŨc gI޿\F,gsJǓV jnf{x6eS$fp @'VDdhcTm' PUewpz{Q@SW}Gt:BO&="uMkl uٵ5}{KfTEٽ:7\Podu|CgϣOU ]bƩ-9{ 8Rd"GЁ#,ƸltZͦ.>Vř1K&U:Gz !<qWC%X8LG91i%ȓw?@Z0dtS'?_8#Y:t#Hz$|t.ymG?IJ-_=Ԗ ΰC\.zkSK LwihǸE _ [oH: `p^3p h{S""Cj"-XEĵlXؠi-A'fWPx\jk9)v7ơ `q~ 86|1$Qm'h`Hڮi61gEy1ˁ1 u;Fb˸JmM~ J9bEy]i|2pa PL –8dHBj~VRANJ}NΉ@Y\| "=eUI8F*נJ}aEU'*8k4Fև ƒm:^`[Jc6j1kTNSw 3[#e ZMR+bZGZ}N/Hp w9㮶#_=J՜4w: rBmE.V)iU:{'6bݩl+`v!.VN U煷 I|Pv:QA.m" gUF{U&'"!bZl_5NS=QF&>"ȼ[j:V:sT#'p:;!"ن}GTW080fL:w be.ŗ 흽!>G8S8FE_l*Krx2rWԓBj<"k[q9iHzR^% ū_qkƜ{X0r!͈̥ȚcqfHLa8UkH'9%o[?FrX4*.}8y;*uhn}2Ӳ[L6cݞw6 )_Ъi_AfK 1A߼>od ^.9(ќm?9ߵ*^]ۛAƘ&j A hb-_",QJ'.\ޟX$ 3yX~߱xo@ Ita' &ѼX GŒ-DSW07w/F T{&5aX],Ξ"1Y}\Eu' o%h785Lm7 0둯["2v qZ#lA"KmR8NJ:5O ۋiDt EM ==19"R|ψ4Ю`Fcl H>@҇/ %ޜ3s PEyҽ>U!}`hL`bzD^.]ߙ ZI&p crU[C@*ɀh+"ǘREa1Vm8I!&\ p(ޢ;=Dk4{n5ey9~B+Xg> 6ϠC{ۗ@Ř8'iF_!b)q5HU}5S(y_BBçNBm7% 0~ee{_EmQ.R#|#,A^@?YCm)ni C7*Uu!Ȳ/}bC=bqWa;CQ@c4K}!*Xr 5hВg.Yfu0c!-C1Y uxf(E{0@e8-"`ce!MZg`o6IZUl vw9]$IboQQ ZwbWʗ©"/_'z]> udBܘI%ҥuM]B_WO'Vܷ)sƂo;6Bc?!dflHP #lY`Vp3ת }KMvdZ) O`_(DHC-4;6Iu,H)ⱨ* fDϰ.JqjTyyϘ:P׋Y@IMڋ{s(K$uM#ver=dvOly1"nV#HƮ0-%A42@`i9xMsH+ZVrѴqMj4QWD^9Pfn#3fm $#[xEGϚ?Ww""5?i%a%76'Ԇp]x3y!ڿ rG( ڭ…c$a.yCV[Oc(:~1?13 .iN"W$]{h:.beý ETI%?o_51.!("(mDV} ZeF9,+܅'^)!Lԟ&% (VR-Y$Ԋ\4+ OOK8%GF*9w:1ٗooQv>8;8 LMO. -6<œۺPAIiנ "QN4tP Ȉ*sQ$@JuA;bȩBWq)-qm7{?ok{}ٯH$: 2B;6/M%g5:|;Vm"z_FhűMLwo)yx?PVF:2+%"C78*lL,'mѕ4$/ ѰFMY%֟vRoL}k2$Sg1 ٱ0j0ϴ=E)_Nϓ.i_/~Q8\[x7 S+|S PKsD/l)5>7GYaO1TUх*]|2d$_&IcgeD5n&؈5/ݝD,maNs@E*lP6w=(@Bjyx~zDR%X&ֲ\ƶ xC"QlV:ZsX,^(~([i_ H"+v!N-MFQߵYVCִ18oO*zi ~Nāq`Ӕ%׮ϥ(3 *=1ZQb#.}+\C4TI&m-@D/KVN_'cƓw]liJcHeIAgMɄ8b.Y!!2X8}D\!'u)$h_^'hgɳ4!: yv\ajOE#}k*l>7}ʓZ'*~ |{5~1Ah12}B >)-jjX˾H`D"ʶI hl̆ؑ,җ@VK蹱Qa5#/c//|>U*v_* }eFʯ_5^ǿ\v<\?L{)22Km{ l#f3)Ǒsi``;<7_cɘ'̜a?'[|d2Z=Xo qD!"TQʃ\8(i5ՔV"p>Mx|ift/BjIXM6&a n S/%ʹ}3k¡Ȑ~>e&`wb T P5;XQ_N8汷K${7kj~kMNI>"PF҃3㟳 mMh$еACQ߀{ >yxueO4DiC͒k3P). z iX;܃ BaaH{g%eDFbr>n@[)g#dB98_'0ekH];xv$5Wr1LgJкgGs7:u p dpcҟsen>h. Yp5éӺv D[gsDOpnX*|G> )FSp30;>N}8ȓ ʹ?h,X3٣Dΐ|tKk;h:^nj|\%ANe8ѭ=_MpԼt9a/*4ŷʟR!߸(T7`?oyBmPA1BiCK tSJښM#C̰h]%?"~`#yv66y4kCyܩ?e4у٬[tql֝| <=ҧ84$et ||KmJc1>?I$ :?ݖP& 2 u7}Z0gkwk=$CI0?Fi=σְ=Ynp54b͢n<c֖U;'P(PaRҝGqŻEFK)(@De ʰb31'Lyxj OGnv:R.>;uA4wv}1lѱY_v pTl.3Qg6Q ,:w(!h]=4oYi;ދZWUWrĽ^/',}rk(<)Y9?Uk0̽r|98q壽b~{oٺDCu&bw, i鿆b|Q[g ݎ -3 !u`6w?@[yiC椂hYCSsٮeT(u(^/ G對Y&aqF(4J`A?;ȼhdzasOv7Y:ۇ&Q_b3ёL =\"cI@:JMh3 38x#VQmX܋ nhЖY|'Pk/uZ_VE? CDD{VvL8N 3 ;@ $~ Ҭ8\nsm"rI*|ԈA0υ [o~Gc"!  MUxglxJo$镻?~B54ggU[=5+V01n@wrӸP9mrZo?GQ=}# Ev<%BM e\SEM]Ly >zX`l\ ('Bdc!̔z>qc~+jytA/2WPMO ى(n dM6}n|QĥL ,h/J$ILY̚tO[}?b+ p{J片\_Uq$wˇUƐ %{;$I]ꃏAxB_FqJ Lv+2~CtLV/'Բ[oU橄_J54zqNjr4@lSS L"uPψQ8 TUXلc] ;EE>GP`>_\ܜ߻?uץWAd|K`bz!bb 37Okqj{chIƓNlЈ?^\:7GXV]v:cK\ZOORP.wsAj +-+hv;kjOvec(gnZ1zdh}c~2 <%dODJ#0O!P\QrT;(J  O]C,֌ɆľCѵ dz9sz| Sàh  #3l9)hyAnJ`RTB]Ymv>`fkK" >*fL]WF(ǝ 1̶|aRn#ў_v4Fzь&3; ev ȣ:;H Ԣ$n>'Z11a^ʨ%435dUR`8F[$ b8](Kx^'BF/tp|V&=Ǭ]@ךZ J+:JIZVmv':ep$ٕ??mcb-/)q,EY;ni&h 3uyWn`g 0 VX̷{p?@P7 KM&=%΅k4t*G ry<+'V҈S`ױ-xF H~^B1PQȩ9'vu_Ťvn.—e鐂UlW_x'&fc~b]a9SzgH:<0znm.1{ekrgv9&>Ι! LDHWc2'R-n-׏Gu$||L=@N &;alJY@/)r `MxdLn- *IJ1}u9.u`\ԖY)hv[9넗seJbpr~!Et"Hd{R9*pm~4MMп"*c5E ͓IS'G7I ovd 61 23vJq(j+;led % XL5n㸌nY18˄t!#Qǵ>Z:eUV6aĩ#0sq닭vLǤp #e8.#[7\%-soZf~ !ڥ"30ݪ4x vTd"cArieuKzq_i_ɛV(ɂe7kEGok!}ŦdVU,[OQ@/ ~?[[TVӏ=^y=;-5]6TI@3@]fTr}bj1L;BXÎh5Lи_dYorf}ycX157l(¨ .^FB.ׄ6 O%'A\N]&fK} +SkZ}A* 0r1W2+gأ!oxCr+Ssm9FPWy:vN_ gvf2lDb%Y:nT7I*pJ"C 3͔?^:#5gK.Ue B?[v=V|$tM鱗Z.:QeJ&"}z- 4HJZ9׷׈m,!mhHd,RS)5p45NdMycP77-&?Ѝt$iеIF1x[օfYxܽUoaF:I_ qdzYR~ : &:f/=,lJ gsfk~ku@heLvicb?#GG.Zs:k#R\ϳ8dX.^ga|PF9+4‘ vB?e@1 4ؾR'} ¬w,ii?19wvŹJs20 ᪂`&7,yeeJˎ/n- c+.]v݄4p_5:{㾷l|YRMg)dp}亩ڷ;}[,Y;%` r|Rn|_7e+σ u)AewwI^=][S'ٚɐ> 6hA\0k ƹH/c.-1\ôVo-?j7m12}Wkctuy.qѵ- Ux;@x'ZNg4Lb?3CbңV?c95h3J~'ۘDbL'gaB HTFUoԒ[H_)J?A'}O!.(=xwEO=ZtV"Y`\|GGX.ut.jy]>w4ۅLJ]"xM ͏S֦D] yEh2%*jnʽ&S(`(Ch_:@N޼ߓUnqM?gdzQ<9]k ls6Ul# "e|07yg+j/(~txDG6S pXjJMs zրQDf>bǓ8Anj܍#^Q L쵴t p WuO谀Htiv xXwFN`'Q?e 2ɛe_\6[Ktv l=9pA'4~!oZ #QhR3k8N!C4sk_ aMmE2Aĝ!UmBM7iaxq,?`ڦmDq2)B0t޽c2vM_?*ӂpjEpܵ~e*]`.ާ2kfbK%7 #f^CW?1\]zan-L(?lʏNtEbPm3UpcͼPf~Bxp>:\WC:_f־F+-^V#6PmsPO[MZ64"I$ WC8@z|L r] ` kօKJJ6N - V4g8ΙmΓc7;,Ycr/aE&yAv1MlCC7uu&}>]EzMYU.oUӱw* +J?L*Uq2˂MU5&eBmG}_k""xshFkDNL5g55A7U\a r#8;9+'%ޤڪg~eGJ򠘉Ț/@]K0 7FߔZخTV/^|Nb-X\n(L26`2~WCXu9)3ATOJɾIAJ|ȵ^fYVG9]_+)ևnN2pl[J  o}-aQוֹ~&WZ{xNNDnӶRI]{"TaA8#QD`Q>{8a2[J~Ӛ1խf Y?unZj6OĒHD~oC_漂6Wt-I *@{QHU1!ɱכ݋ KAU2w wW=۠{on ".*5z< /`=$&6xT(lU LbAKraUwr1^ ܙ))?!'o5~nn t{ _gtx4{| u5Zgx1$8`!Rt8}[IkTq1YAM|Iu+l4EWK( TßFA@a]dudxrg[Ips#k^O)^ZЏtm/wWc.0\2qZՓjGx%݊Wվיeh"`_`e\p[D.?FA9i˙]:|(@3I=퐄qv#W\I۰Av~2~ a)@3tcWa9J}S$h235ƔRߓyH& =y&q?hhӟPėJ*CbH*Oiŝ/At7e/kCI}Bǃ3 Q-(2[oѮ&>RBOlgİnvy=hjhJld+$6ZV_x-gB :_t@zhF>N-i轶;:vn.zդőE4?k67?^O%Jgwoa\/_&kLߖy[2o @tL`ޯ2R}$cZN짦7pk^Us8@;xc&9_|5ipn' R mFJLQ>ag1krE}tVczNw 98Zsto_Odcf(=2]l(G;c;|:Wf~|(٧ִmAoKTE?ߟMw蓪R [ọشmVX|=Ķ-aDs(^){$k3uF̢@^tfuHˊNnԡپ>8I ߟJ-ZB),ZitiÊTx vXU)CyUir0OS];el>2As}i|Je-!ez\S.q䯦 W|5sث^/Sb<=_KYHПSu1/Sr,xR$ W*VLeBCu[k GT Y#_W=Lx'M)phX[b;W rgklT䧗3{{挌Yc-Q"ݫL(]9c [ƿbJ"(VQq GHw4nKwDg LH_= ѱ*/.B1.k'PNX,Q]ؓ\:ٵUj&j ;rjt.1e+K4 h[h֨ekͫZJ CwrtQbe<}@벖+;#>0WC dِitZFm[J#5T9 zxȶRji.shǵڌ c5N&/+u*hj7 慁Ǭ@L˅DR4_p5zXHs٣gjpx| 'RsjxL“rså:WՄJrZXlmSrHS^E@wr^Ss 6 '/,5zE>)ĸkG,[3!69%RamE2 ׯcxc!C۔(*̄p-gZ@J8H;5{F>78C5ODg& &Uƍy}BE-9XìuZt YXZ0oxX6o~elI8w$C0]\:C> 9Fœ(v٢ eTt4ZV$fۑLb. eYRD9 q/\dZ7ĴrtU~T=(W5T+e81U Da=D]FǟNC)8:$:Ǫ"p4%N B߄Ǽ]JpR ٚoUi>\ɪDׇ9;O,%>tF2+M\]8C"Nj'Se2f,3\9D:,Yߕ#շg=i\l{"GZH0 x,& 'FT"]T[cSA }FhZ<-!c܊շ2>hPyLް`ÕpǑEk߻;K-8WE1^m.zsB DFE`Ho7Xy~=Q36ԍ5/9PXjYC^}9l/u|f1s: 7eYݢK{\:TmSJn+tR(k h6"v\CL7k4{b&_ju`itM]THJȞ#-i甀~]|l^|'YPL>ڰ$\s<}[xvG^(]譸1Ri@T5uPO O:y,M!nF-6ڝYW2ɚ[ѓ}Ej 9!&xexE{﵈W 8z/V'Aȿa oӫ2R i[$e+.ICc.½Fv} 7@ XD:D,ۺ7J G .ni, qz7]u(uUX-7%txQY6_*il ꒈŸ$U>7?G`{ f|sh8Rlp;?V ,90 vZ_bP$y.yU!?ߕT0 ".?X6wP-T5kgII"FTB5,@t]ف<*= q-1dXܢơ曀MkZz;Uohm$gmRMǀQ-@R/R^i_*JDTtˡ G )0M Gizѿבharއp>*dN.z M12HQJՍ*Hܩ A ^o` >$,QP\nɾee0 urq/45ZnW,2Vbyߛ0 p!>~N9mR诟Х: * fNJo dE7ڛ]GTmP,bYձ:ժpJTnk*nNuuK)#'79 0^9Pǘ%f =#`nPXEQ2+$XaNZo6 l 6ڟW3GR8?A9GG0?8iz3&]$U:+ 2x! ʃ>_ %PҶRZ49GC'#EH~ѥ">Nt aa#P@Kz{)XO yZR1J &eWj U''4vDxjG(K8D7GMfYe lapjs>f .F""WuڑYKneJL fԩ YוS56 s4'*Wq~N`:E- CA}%\nu9 h>ZL &%4qTWTl um7;gqpũ+-t:%ldTK!0)-54hoFAdT{F(b\KG$”d;x% k-P,᝗R[0KcUj6&f-clXX]{j8j@+~ < CsʈO vbEg˽hgQ4I2nc:ZJʎÖ= PlFͬo}}_ZobJ~7nԗt07}rD^IЙ} ^%[/襪Ÿq;vW3fv|qFUU.At\ '̕8\O7$򉞒S.NfsL{-{KC6U<ċy^w| I'Sms[M3HH SpH =mah`].P{~B//аɌ4(G|6+Ɗy.:8| Rqa2SiS7ޔ!.U~M=NC95Z Lt ?ib efW{gqi?0e_0"[O#Ԯ1.,KgEtncŲ\ N2Ot@wn$L ؉8C],&7_%d'd3نT%qeӜC(~ݚ%PlN~R%`AR(e^N 7a 9QtέU8Zi w- l@+=X,]ip}HN%i" ,"Vn@g 6 .,@BQcjK0 Mkfznmq-ZE ٌb?y44i*2{n;s.3P)| 9sP6~:>4jKd5N+b.]f݅GHUFM{Ȁ@Cy %(o؟ p%kCCp7X*;)Z!F2j}*-h)*~/ aj1#߃6:+){ JFͣgM!+E.ʴj٦4eÝXv;nBZcYm{ Gpш7Ke=}t?ybnٴ h2ds:, ِ{ \SٍF43CM(϶O՗fͫh;G\S]"nXLzh m÷K a>&y!WT .y]Ң60٤=D8\ @vl7K}<$W8bgZ ? qSGi|Ns Yy)Dq21$;IRZK >OT1Hr"hh Խ9qjo18U;gB߈ I+JRZAS k8e@Z]!a<4=D 8:0Az6,v o4uPf+/LMeo#I8Lxx\TOG"W;(_Qzp.?U#@)A b5 ֪c W 1L ?W ~ N'Q>b~sU73MNNue(BE]Bs׹RNX/HĮJ ^ QԎugFv~F^:n +X&faB D+T0}?20׾/|tfKZ,FnKh$dے":~|d?S1D>X ȑhMe&G?,EC~Zh U]5&MJĥh ;> ܿtK4P2v2D+9:tEzOYѶ͓ŏ硴|/,]-Tho|!`r7>8Ekecye%LbyhxtQ+ƖWqOz`khieđ(39o!NT[.u?#50EK֋ g7 tsh _z8`j:l Y=dDX$Mdr{J{"n,o&`N("E*Pɽ}vCiUp+7‘R=7M!OŊaHLQ vWd\> -}z>8ȷtNW:'?ތCVNNbwƼ6 Od9;pفA7 |_ZD L z9H˕lEbtp['iNG`Vn]gx)7 YcO/hb^;+6[u\jçwi@Kfޯe|242>mGmW3̋S#vLRcœV@<xjf=3Jf }V&8wrf̏HF0#:KD+Gw{cJTCT?fO^g"oT&_SD/n2 [;Cb5-W|[ $I}qP]hDcej񣬷6 8 qL?p-um {οҥ.ddKtSQ-#H (UiF2}t(>{PeBC@R8~1?/m4ļY:&;mh{Kҿ'*Y*VH=h /iАqm1OIAjW@io0dl!^ @PXQCyT)^R&!Hp:IN—*op1C,:)ڧD&&%N2-p RaH?Z|6O5|xK6#^ 3X!P/|^bKpwdO88M@ܔSZcZX@Ҥ_[Z&9 F$eh+a)lX"ozKS)O8FKVrX& z$}〦-nZRTtz_[X#}⡉h7Ef8};ir5s"@>OJx9PVYs fp气`&[wD4RAǬʣ a&Pxaf=Pqgo+A /  gIc$@N ;^*xD*Y5Ws4}8EH &= PXe6 =P(G˙4SS`* F)*dzsJ=x`2:,_H:`nb)ET-Ucg{oSl8M|5KAU+hysh0G!mLx~ dT!BfpƼ4B_I-%]X%즓f=gd"9TiÚTאItd9 Ɍ;ÇQDTؗ}{:IsG% Iݲ8(*9Af83RMXiەe~ x- nfLT4F<8 & RGm񨛽~MʖIAO|)S.s.h[I:Ǡ݈lzFB77hqM Gb'yA{8-; (@QI`A+-GuX-'#QqyPd!OĨSxF' ]+f{I?G,s+~84';.iB ZQCܽo"F.'|諙q?@sЫ+ӪPmuDHZ`ƀy mM F`3ƹA9!|nR:&KY8ud3P`{ 5dyhRm 3)AWI"~x֚꜍%.92$Vj܎%&^czk>"_.GQn`7/;v'imi.={6+Mڥ{(\-ccł񌉲Ĺh_"?*Yl ɛ h#Ր{$9򵑼 Iq]#ppIבּCBQ ȕ;4AeO]ج@!:09]ccL*0X:.w?>7U|{3bL=PСz=\odm)_B,Ne:.)7X1 RB-4} ӀgYCVv pA]@{3 |~W? TZ?q 02%>GQ/[l ƂtΈhLT@s%~LN38$љ> wДzFf1ӖyNr8l%|W T0u|O[r 㨖3oUʋg8a=qUj(ڧVX7wg1g`mX+ ;J(gᎏKeL⫐`=JK⏄N2ɴcuuDS @1frN Lèt$qZ,Cll-5wY'Jn"؛'^8:h m-u1#_sxЩAWXi˿N (Q5- &%!:Iݻ]%|L&5TdbU#B/zPmd2@o'|~d 3M5΂eTkM@\:.ΒDl upkH{(VP;O|RY-_%%;L &ZTE? "uOZ:l+dpǴu}OdU :Iհ2u؜0^AQ٤넢~^02FR ۶l?[q\*10imy6__57HڝF*ńhe\5ty5 SxTڡ{t9i{\:2]Oӕ |@X [ PI܆>N+ȳBaWTQֳ A1Pʽ; E9fµ.;dHUO.]Mg_u%!ٓ85c/4u>7f/e2*pXĉGMQC }p|+|/J'7;Q7fHHr/ `D:]W4r`q5FO)u7x'-Hr)<XP8׷N)Ӄ߸*L}yLZKvzE/qU8-vτU!|S;??[YxϾ:W hWQM23y;jk ̐P,P+Q/ii(|`^<]YCyBʶP81G R@UdIa"@8|@ ԌXD-][I>E`Wn&=_JF=Cċ2OJ!Yi]) Yk ;|fSxH#hs|K1E,^^Nk/{zq,. Ejj6繰p11dbWw)eP hΊpKHSr6MN01B{! e6DPNhTSƋ DZT3Mw4"- 2FK.[UB:yBw TC? `!@H&8@jnP[>;,`#ͦi#~pUT`8m<1pa 6GEF!FDy:h021F0DG ~bܜ Cf}m s,PB_kKB"},ϔ(g^I)V9*#W)/>OM7q6>0Yq tS ('YRɻ"f/[wOĈY? yH[ڳ)$>җG2RP-kHWFKJLhg-zZ:űY]7!CCdIͿEUVҧ< )Q2Xzw nIyJ2pԊۃSAJWBrs#Y>x ݰ/Wu V/o(37!hJ> ]bc/)'U&A u1^H/芊_ W뿓%FGǞьEˋ7_/uXyu3bd^Y3 UqOe <NM܅l!ʥɼT8T._Q$2rsUt"NCA5qOm8Sw1s$+=Į#'9(+z?Xluu\2}vW|GKZ觀ZOz(H o悔DasHTb kXJovl0FoLd▌l*e['kBGlGJ3 I>$P6_AdDśk$Y鯶4~IIw/%V0W7Փ>Md[Ykr .#y$n6{(Zs9929 5C5F01w C*I)My.PP/ J柬2M{o AMN0ބ_Þ-5MTCM%)GDcz'"&1K5áSJT<2(5y5Ӣ0h+-Sَ@D&@,*;I l\)t70/֛#WdDFHKX:s(Ќ}ꔚ`f 8Htl@md4,<*^ۨǬLP"f]cE>GrM36TJ)1Wy?W aC yRmf^:eȅp>rcAo,A cIFfrs7,Xw)jo a7w`>7K߹ /75ZY[٘mV|$J~ioJ*(z[R{ R;?CJ8~صu@<[|z@5q+B}yӯ1[ȳݬMKaڃ p~o`gXvG R+*"M'Prt>$E$ ?Τ7\ `Fj'z.Cu'".Oek冰Lķ@[kyHoAUznSsA@{T+m ZhYwf n@#Dۑ5vѹg<`LbD&?nKϵt$I%Gm^.X%@kEe'%O )|jX3`Aa$3N$ßooM摪2 $# VymnQHSqׇ`a;8*oor0{xcqiX{X?uLyhIVze0|MF'|$T'Jv"G0n7<#TU.0 ѫ_}f sA/Y͆M3}@E4{"|B nV j})\S I"會@ )ˡC*Ov&h \U@&6g6npF-iuƱLg% Qmɞv: ?qA6Du'i/p/{(/ P,@jqJnмȳqEɡǨ$'C_brrBDHE.IC6OuY3ȻYSQrU-{,;:'W}?m?̣ntT@SneOϻ ܱhojEq}q'V.XyRH6Ex?gG|&j/ē n`XgTK Z㽩S+5 Pv'R31.t3ۗy?o@ϳ^敀ՁdujM)i%R6FyeL,fPjQJNv= 5{jsA;Yt31M$glFgHCZa¨yuY2=fA1[A cXǯQԬ,&@$LGEF؊!:]'iҲ&n U̦ &fڶ"MeEi"u:O\PxzmRR菔59jm5q)UYaȤN5&$y.܍IL!hHgg cWvi"P@x#Q=v#5tD),'B_Źfcɤa 9 ,9``~\T۸t[ޞR!xgdͼr)}$bD#sJ#GntQMk:"Fl :zY9Iwۨ.& ]w#4?ۊ0Tw93D=\= ,r]1h pYTNRVnDL$d< l\%=pUز5G Iי0-$rÊC]?*x [Hc=#L0M^Oj]߃0Ag-֪W i[d &ick3FI{1]HQzŒs͚ |AoAbL#$3;!RxRZ] W-EY)"p2G4e$GPy"dT'?Z@[X I̗ zcEpHd(YBl:F]1bZ:0nv߫wb Qa?4$?9Q?C w-825>0OcjQW6H-\eQӯ pKY@F%3 :p'DZvt YC2`ǁV_RIQ(VsI,bs`z{(y($yէUSŅb[IΥes䆅SЕ%'^unXS)Qݚ枲2plN -vЛkz(e8%9x&0qڐU3{/׿(Ņ+[oY;j9hHIu@)v0V"1v\g9)e?ySy,D"'&+p} N6r( ~"iT(#YCjS[mVUkк\*㿄QnyZ/0&,s[QMH25C8l8>aqs7/ IO\KO95NFXsOKڲm)ѣ؝%~s$:ܪLZ)⋌w?H#(谫 K76G?b3XL䊃rM¾˸OՌ6Z7pzMbMX%R~]7!@V>#n~ Z]5gj2vъ0<(_8šz}&Wf@~FF\tnNᙻdq31D&ﴴªE/j0ZB(fZ:Hl_ C'u =jȵƋ(K U!vc*.7XL-Z˰`Ƭ8LKZ98Ȋ"}ޯq 蔔K%w~/ܲißX1 `!t4Öc;yNBx?'ZQ&W > m(ID^\) U`z7 $ixjEv\J)lWF\2gNj? QvmЌGD;&ӗ7y jB$ɤ7pq" AUγܡW$lCGdI!h&|˒j[Sh;sZ1[zY*_ee~inĜ#fiND!yʓ'<~0fl;r @hja" csd9۳'`< Vj3v9#SDz Z?CΔ6רy9EI^'ιYywwp2(pɯ#&_ 'oEn/IàjXp"P `vf'scPk2ʰA }PH洞0Ѿ?Sc)yN2fs0i/T04wÞ*izSP~{n]wL %1;)Fۿ yÇۮ]Âj@^u>A gF'\8>\ݤ=nBv_7kF-J8` k;/FʼkL2ɴ#_Oɽ"fQRVM;g`((66_fF f Vß~VCZ^Qo'Iw!*>,>s{@=4m~za ]s(p sh2 |:_nA lj)[i۝_2+*xR1oϓ?o69qAm@4wƄbZ@v>p{\Α]j-:ؤnwI]|s;OhwpXhWP{7,9ΒQIT,6[`9UѳPlpӺ`N|x8Чr}) cp9O62==We38įyH ם;Hey|*q =U4ih!Hs`߉ݠ򜫢ߚ1Zf2Xn1dPsnFϧpTJ\dyB'20BN]o!_'+G1 z 5Ǹt_T7e/e:1?q r]K ķDBj'J{5ҳ:juP:zһbb.F 7E* W3O4HThZI@E]QxWE߁zd4]Z1DɂIn[bINT&v49Z ƨ}8 ΔlS;g qgPLBwH@ECNZMnW]Ϊ;9 o[LHқ!p=kcZŰ"!̗q.8zAY{ܣɩ$n!ys`R:qG p/y!Y9G4|~ ]`a2{Y"4G:Ge+W#w7̧bz)"nЀ5]`pƭTb_63,w9t)VO aazTR; "S4c69MٵCls kZ_y6Z$#WXDof ~ {Dd1{ێ.(g`2us4DI'4k5X9/c﮸<* +7<*>姍0xc4+ 3cJcתSi*b>`s]>H7yqZ[$J #8Gߘ|ף,]2߀mm<|{3&Ȥ'VT}J"ѬS#b~ lq%d1dc2yɔ}2nsdųTf1Mku|UY2% ])Jy_*q3oy98+W0ewhLZ}"!n'F(rLnϏ"Of,2;լG&TzϗMq"ctl7@cUVw_R E(nJ1Ab}@5CA1zH+"zB67w#3+i[wjC6;wlŠ݅13'8i8Z+|TM ~h>1s3(6Qk|,В}^͚o&͕E] `iY>-30DnC ;d+G%-b(d2N2L*flK{Ҋ*z ̑)>Ұae!zs_C}/yH?We+JwdkGm]Mr-+XXbh8isrpA=4(Lc纜zG\ WIBidE5t}*BwnHt"0bJrΩ0~fu7=3%\/<}~5U\Kd9Ͽe~:j覼#[PZ ?I`~\><^cieԪ;?3@FI4PS@X >? 6ݦ0 tE_Bˠ^GVּh֡\Y_&9P1h9@Oc_yLz4'ʱ F%2(`hY!RVr5Mת0sHS[}J-["/ְ2eCS/cQ\YU7ޮHfF)kK+F:?K:@7M.U|=K]3VFLv -ըŕ?f۩# W 8O_%P@q&Cfs}҄ J&= ns ʄzGgQ VX7g,ە@c?9$&d]@(PzW_/&R1zєkCuIPUy2[Ӥ9`l;t_~2W秵 M "$oPD~c/X/]vtxIHH TI挩ml*%@+2$HxI/ifq,fmtש$m#4)Q>y:}YC)4Cm-;]{aT[SqW+B&{Hjry&LXz/ʩ,iC:< ܤM"ڄ 0y`T e2pha?KӰ]Ѻk`.߳xtO2H\`NaGccl1I~:/ <ĖK{X;f90 :(wr9ST[+`#Gz#[+t?WuBr$=k z\BOǽ=F;"CƇHJ.)E)tѢn˯?=}iOԎTW42b5+zר=3`) ͙ԕ߬{zPrF8xx0Yc: L%1dv:N2 EmS;59K;:6fbSE^ȓ yzo!>O8]UAV\ok[׀=j"]WhӬ1[ZS%+TJ@Y52llID1#AcH*Ab瀈ɭwUu&۝ZtU|Mrpwv:p7 +1a4KkTQy5 "FaG(z*ft%bF8ޔ {]Z'{o$Ens<2k[Y?vmȜa/trz, ] ˥4dL\teO_irRqÔd|h!HAWȧPPwd,y(,ƌ:md&Zı=jkbCAʮ5_wX(ZIw헿\ucEtJ[RC˘P%+!!'he鳒kȋTN6̘ Y^YC4>Ga 8A і # .F(֣,WF=O~1raA3!lE.̕Ei\5GWXwVj҆38k47Q)3ρ!׶U{48դF ,߰BF/yl/ o B, uO=L5YC%Xe٠n$(82GG6n}Jx~oPZ>3y_9 =igw3)6+}CEO4;4fmNjn-[, aZckX R4Ȱ]o@' b-̽#'}sau^;,عWh-^U@F}N1% &QH5Vp6P7a-=d yv[aoj5xkR„&) gdyrWȱRX=m)5:ݗ\hWX!;{=e4&/HLx"5#UZnAfsWGP.{J&q}L+ݮb?J:Ē1]ZT;4eS>m.d9\0YYKd[BKÏw;FC965t/BSz_prc|-kڃdD0{b5y:ߏ/zxB1EVטu~QQoπàACe 2(,;Ķ!wUA~wZh ('?:\#փe2 a{;GEh<˰Ě6-#5a1Os/(j*NWMxlxaV#| f WI5~r-"V>QyZQ:_{ Vp*=Δ0`)>lo3lӋ7]߼ep?*76ӯC =6pY ;)M ge7 mzXL(e\S/:~3+N1 <{MJvj |慓XO9nP!)Jص4e|Y bq{`@v|ŀZjՀ0k`8=Q02񛭯- 7wpzDtkwpHVAfK!RK譚@,i #&8(UH)%mˉvF$t?eZTmtZ*7[sL2bpCV T'ƴ1mr$C} tiW:#bXQTY۱u1 &:U[#gRzlR@b8_T .lS?rC[ h.yrvVš(+{ّ4wjRcVa{)O܂c^|Kbh;(BiV}xxD5DH=&UGZ׃GƢL k+BDE6\bw>NuO'P;ҙ'JRa{I=y3n3a_Y%"#?fU,7t0^ġe~N*ReA -ݳ7 `g;GF[pj6J{ʍ53Y` Jdu󤨆l->)ǥSkc4a1#mRj'uMômON$ Phm %LJD7w"ۼtssʟЖ 3 a[nˮ@y /LJ{XC v)ě|DP^3&eqnzPL_8>(BꅝДwں 5ymh>ڋkE7F;Cbv5 oXq^6>: 9F/YO,\\HQqECJw&?"(Т]C$(zɐ8rAS\"VE1MPح6ɶeqrj }Vӫ~a_Wm34F:^Meup)Xzn P]L0( =& h,.Os.ڦl%.a|:9R)/qŢ:#n"@#x"+Mvǒ૷@u(]߷Gƽ4lq?r0N0Mn@y{}ׁ6#M4q H?S1A\#r7TqAKd?vRd>tMdKҡ ~Ҕk"薤%Kq*TaP^'cTiE4aNڀQ)p ۝uh@p|.ëR&n:VwyU]^V-)Ks^~4[[Խ|(ugWk𓜋:YپrWijI K:&'F@I|e/@oq}2US2" uv낄P:\K2-0j߹='>Յd A=˄BNS$6u| Od7>ŒƸ 0s)n#ȶURk;u9_!"Ƨ\T"_ Un޼YAg2s4pw3#G 34_[Ԍ(X^MBDѴ zƜ> 5wt5ד}~SR!Jb3Ϻ^$;ZU/?e%1INI=$kt`>効b YvW&* `wkimYfl{}.UORI 0rgT"«:/7LªHb3Ō="9iod@Çȁh\lr?$ z6]I-y4 ΢|z~_'<z" n1Uob.8N.=SA;9⬳n'Ym5aκ J 9 NH&Y=۾,QĿ{Z sL"DJU wѶaX]0v.AaoT 9<}<"7cQA(x6bTan(~3_wjb7^>߫ b&pUX"3ScJCR$VI{J(El=4r)[~F|k>.+^)-[( vAÔA3ۜՀ6?0E?jSIXCYC[:sR8p2̇Po+y6#P-`w֝8?Oq@wO ,9/̓OQ޻Ns$"> 0^"-wʌ*OZc5xQp9jk]߉d3Xq}%'CF@l77m`c(>gMl"bɻҵzky@:[LI̮;)nkH>YgE\AFP,~Vl9/@ފEWzT.O1!uST޻zWdHй %O\z&.hI.S*o"hJ0^^g`% %c;s1MkK}݀/З 8)<9F+t~Js 6 xmZ|杖$ {9# XD|ɬD."]Z(:'c7a:R'vb&K:ܧA s% yki^k+J礷6}Px(OX$&h%iAۙZMq :p1.h2ߤ_0_k9niv`V_D<2o~xϵ; NB)W0\#eolFIЕf͍j'ډ`^MXyͷAő񽥄aBgw3ZP2x /7~"pJreu+# *+zJBR㉅ g؇?]ZަbW:y5М0Q-Q誢.s=CM2VeBќȼ7o>mI'l^R\u@m :*F?!#Bf. DWM6ֿ fc r1h 2{&?c߻]7(3s7(^* /HѼ#v1bY'Hm?8_X !}tî"6SLr6CG^KMr6&Nb%nk,ZKhP==y3`\b5J j?X5lb 9u<] N慩X†1yiVCAGm$ql5o7cR0]_ԓKw>/OWJijy*˳ŝ@of5]C*qhԅɳ\Yo2Ĉ4NOVdy.`Y RHdsr@:2P$ {$}h2"";v KE|]ᅲY[8E ӟ?&RэԌ}`E-]nH8}.:V@NCBoݢ=OƸn G:eSAI"'=xT+g>yD^1wP33{}f8gH_w敞Bts+`zL"xb]L_FL| i+KUi3>sb074˕(E?O~3!H,,s5TRB-}oYYɂ{֑<Ч'>_$eDDc-#BLͽV8ih`_Lk* /]AE2CIrױpNP3֪7n56ܥtR jmkzx4etH[Sg<ŚjX'qBvHF 6yRC'0-ѺIgѻYq_pMIRqZ}WP3ط#h]%8qcTR)\yFS<bxjaZg:!:Py4 $]ڽ?@|,,V|*,z/Ӹ41Q&44 KCͣ]A`o#cq1܈bۻFw?/}Nz9-_wԧىTRHQ7Frǐ= 8Xkb3]] gOMjo6z a p+Zfﱥor7Gx{I}#H,v~>^U1BwepN&oGÎz'Or pd 8:N@ߔr3TI5Jv{vz 쁿al(D]Gv'寫#k1u#TE_;W 啦@FOY5jsSYH6ZLceHٞ I"CgSh|AEBۿuKz#S_iaw)Ǹ;/9( D3Lu@"X`S.cY 2!FJQ܆jTeR#u0C XG=I"pa-J/85bL\E w~Wvz1y315P]kv WI2jC751a13ӣ2CgNy:ê\Hy/d{UO]1gdڼ1_ԞjqHozq^@|MGKl_h6._6y#%48x,'ՎF&l|1]zSah  qp|ը{kϬ/}C>KYdV(M믙/S02Xg}y>bƓk~y%aTM7Tki, N`g#$IvICD*>D}Z>wϴ8["9Py>2,vgOMiG1=N7Wp3X,CKM^1?M (t/*rHh39;:pm *G[6d`9$C%*wa+×~kcV٭T[z٘+0Pɇ"_ͅ\rٷ~ַM!'62N;"\`?uwgx W&a&މi: DRrɱ5Uəwgu):v TْQylx)hع_"(Ea) }N{|xZRkn@Q(@?,7OwPP&a]scv7Ҕ$\{_4 %Zn"UL}}vs^""o.IEthXǕ& }5h mh];zoRy^S֢fDHDᐁN*FhF=1k ֘"vkO ݧI<.Rt:WeG&*Wx~d2wX$VTҌGSQpҥِwBy-}:OY b*ءja߮^,UrѵFN2JI1ֈbYk'M)pږyYXޣjm>R ~Wʖe{P g6KTcBBH~i'zܵɶfNG]{tDL8口”2tn!a4Ҫ1H_gL Π'!B-,pԫ V>G&R2ّfDZ%؀ VMU>V%-fxPb=׻4T$WMjTiSq럾dw#AԥܙfhKe ׊kNOF ]B+Vc3\4&;s*f0 C+oA Dp~oHd4vm3(ތ:92e S 릜`e[p;Ka|L 8Bgr}BGZ`fdޗcKq3[V#O K*H|g0qRs1}l=Ju//`NfAT wMc[{|IyWܽB%k ,Fy$xsvcyy1mLJF`j|stFRC bৄWuX;RU>=/Zz''aJޒOD+xjRΏUJ/%Wj#|TfK.,X!B6Q$C}H2 >F'Uϳ *H"  L@3_{F7T7KL;Z~bp!&>9C,%ٔe?aW[Xr Z`~GX8"B*^v9^lYZwgݺu^I+~K]~,#9(ἊY Y! [,RADnօ.oc7SV- D-J#+rpeRt%NzԣK}^2 K~xu2I_D' 3_M~v)v'HA/֎C;_% 3hĚzgpG P[JVKΑQ1Ա́KOSq B/3j˳Xh6?\@1Zu!CvTKiV7"nvU Ck`rWC6of.Sm-_p_N+],X ]TCM:. Tq Ϟ4 l{@1Jl(tAv'q PPևѥqE |JZN377r[jP$k^  ,]+`\-]^0 MP>an&yEr8uVU/R ;|Z C8:5U7aC2ߒw9X؏ڷ!#hݹv(+əV uc;di5w"xF** BjgJʃhvZvI\ɆNRB'd4LZkάȊMtpG >ғ%SUbex559!;9nsqE>#USo픳WWH|uH8O*"Jk}E;?<\B4rjkIH .%Kg:sbVDA~^,wD~0.Hl" lz6:XHS99Dy2TRGA\AXEb`TAz4?5z;&^GRY1:쉴"?\P |ql1bҖqo|):o oz3baBL|,,pINsRf`7D%?(u;W++ 2k[5:v2UUP|[sKnd:{1cS?jf/!읛)9)9?q߸>**ʬE";lana]u qN x//\Љ|tdOXǻ-!0uO\ X|í+سh˴C썼,|c̎w왨"4/J\Ч )RPC֟QLxG9({ hɾF1;Zz2}ւҔ{Zut Ҙr.]Ya-C 8UWg :BA|" 3xǛRڼ3}ܼGі)Zi%Z4%Da:C u%_ʭ;CsuyzަAH@iO)wf]>D*VT=xz2AޖIS} X4Ydr A)'ߊ"Wcz#j_9U=$..j/+ZGKT+\p/Z ,,sL62,"YyPF}ai^Ox~0"ԬE6ZWeF ^jvOX whi>,~e0VA*91-75,K-m+rv%DB6ٺjdٮQyHDyڂAzx ̐s|O 3?>}{TUQE [̧Z!:ټms3~8ăT59ܥs>ƜRԳ۫RB:+2/ҰSJ;kuZcDO+3ڨ΋t=h;Qşa;93W̴u>|{M;UΌUCRN:fMO΃/C^_z^sؽQAUw?8Ot lSQ[[ߖCV %ϠK$h4?9ҫyp+m춒jLTC)zr(Ĺ{sC}($cSkl/߃a(K Y'!}x^ю_̲6 ~7=+Txz?-7FR!i+N{ R~~晑\txc~)'Cד)`|8i 0g= +Fo%h# с (ހ/+-nK"MG&Sl=ޘQ88B1ҫ}%hL^{VƕBDD_w!pŹQy '+lP\ IP"l9=-RX` RehT3OYj Gк& Y%-ޛG+-G- ;_;aǀ;f4;{)S&"Qb7OD4iiIZ8sH(#by[l1c`蛽z{ߗ Lnlm8/6&kM!T L,Ȝ/&@Jp֭9xm8pkW:mv&ﴓ0 /xD':(rKck,sPuB~x!.C:@ rI}tQPl ]2j4LԘ10HH2;R ON]=Ӷ%eu}6(h6W1|VlNg#);ߏ-:QxYB#i#ؿʎ lx|6_bJp_.d/9P~+EnMG :TmVj\"8Du*ZhDG$c=}%̰^qRgazh=pۘ^4kmܚC&8ڟv"Cs5tQz a6 VƤGh S?]jf B," 1FM$.|UDCQLF >w:/j%G[*0*t Rf c,F8%KԿ$a-hHAIc?6 .L =)ۍS!X9~ rTPo&[D<ȬF"2eETR_~. aw~{ŧLb#Cs&c5Y F_׼ 3O'`h7/1EgC 9IAp5Jy>LQ8KC1lQN>+[5b4>gFe^ɖ3&, a e{RZ/nr-l*Žzhoe#-@q# 5$fD \] y z9da9fIe+Մd[P0K牟+h \}?\zAa) ƛG߈nfo.1Wׇ_,&.g^$< oFoky>oF5lX  EW%STL'~?Lu0DUrzOX!&_-vDeEOn Nw]qU+/qv ;!}Xۄ̺T{xpfpt`zvH~k@a~tnЧ mkQ, %wN(Uu\<\\pf,4y7V~:'?K77[_eCbab(2x *F/-VԫA-8*Z 6;5k͊Q5ux+;.d@!b5%G>m2(R2/ 7 wVP<^>B MDU{hWP3 g.3p@ ئUr=A1-=8.{bQzaR-LOZ#@ݤR" $_3%{ xa0=$D)D#ol"L̜sW.##(S `)t$Rs1;:$l{o$6lbRF̗sF;G^p]fV=T]`gÚ P0ƌgS6%5XKe~'hבeӆSK/&E0{r0;1H#S'tgItPk1غ$[]9 Vuњ#TyWdtt- PAR| *3i>3QX҉Hv:U{ B Dhw> .@VɛX>R{ciI7]Q*rz֩j?LE`ŭ^oFȭ8%>,EIH= ?"0u ;eh>'Dyb9#=g+qM}!ɀqV|+gOޱ`.9KMMz׸(ʅw,/pwۑ<|N\'r{@5dft~ri>(zK&𰒺e֦2N0K0~DH4p-q{ c]cQZFjqUf1K ,wbeNj/5y>z)zgX hVRhv|M~5  C eRzm?YQO\"C)g9`M4R?$ JlV? f=}oSZ j &o=? A0?_vD>k [i5SG.p]NBC*׻=PUtOeDE78*N²arEPMei y\g+C>[B,ݑ2Q L1[UCfRm&U@ kd e&0J[`aAft5a2lXPf%O3ơHqSIǂo$~ڸ\3^k/=ݴqh 30JGKA7JD  xía y#v10-{0 lY1l9%eQ @(^!=;@M~jۚ_o6}ķE6ٽ̞V7*cq$GDBK/'΀8iG?ۏc6D/!4}}'wt J%J'V9ȴ-!AJouJtagW0Q2'O qڭl@%D^8`4Cٮ8F;xvJ;?@T i 6e (B55ykYsPe0Qk}ѣͼ$'nhƑر3 H2X%~ѕMaix ?sꭙ[5'^J>lzEK;yqB& nnkN(aABhP 4R2ұҤJd/w6ˀzYhEYC_508昼GE`3ʼn>02E}\y,_~[_i4 3_ {s-rFRkZʲ[t% \%&LwE5 qFV c i‘WǟԔ"Ey"VOG3τ,A>"_JǦFOU qU0Q@spiev~VS<(;V5V]& $ ޶yt В_wzUnsdc:9lh]#8ZBcXL3t]\}$N&{#Z,$rz̫.۹󹃚ql)'q\5ZVD%cvrox3^?](>Ws5۰ Ukx [;_M/o϶'#&80i| MԵBx2$9"[TB q2~l_# Zh3U(Ohb1;F JY P&Py?bxQ]eڊ8r8Pc0 ,*oNson%: %Ƣ:B*?rUB*V Q4 >O\f0!sf:;|ꄄҹ+2u̐+18- -gբ :]|𝁈7ʋHdi9N,W†A=”u6̷is5. ׏JHX\7Z,9aƋĥyc,*(3qz~e5}Њ<wγ+]O#F6TW0; wTy魯k߾37K /h"RDĂkN,NDā9}?Hx|;="ꐘ\E91ǐQa\ٵ.6 M̓h6DE#2xLidI`2O8UWB j|t 8 'QkOr}u .ۛcMG#+K C4#@bZsT"1Y 5LU.@:o3rZ&T,ԺXKcSG3慊KT1.UoQ|ElgnJ|VcH[1`/Ww} ;!m!I%n!(@^m竨I3ԑZI`Ll;Bb[uH^>EY8S[lh(lٴpnSF=Es ;wꥅuRMXtA#֢VFb~Ej?Po eF8X nvVAӌ槎Ph|Y?_ _ro6WSvd|bU"M%X{Gj8Ss2tEcd4i]yCO  }Muޯ ɨSvN$3AB4 gfW/\biR8/`&`CkPVdx]NV&LS >IJ YN^-T/=&&`bPTa'٘H l9U%%: i"}ޯprzI=Y wI0z{rZ&IVe' 6{/['&/A:r{zb#gUIK̚^Hݞ܂vv`j|b(#HjUH>6F YoBL*9C v_\tiw*ht$PyB#&}-Q1IZFRm[疿>>4[C_4Mn6+m=j)UL(x g1/DJE0.pCnzt * o+ ⥣*"'!\E:n*!=b&ec+缜!qr;\ǐ%h-uPJL:d\i R,yT(9Ƕr~im>Os֓_&ZepO@ p>[ҹdHM!A&g!Q;{9ٖ b|cIIFmSSĝ";CCƷuhh`< 7fOb"p(s|wnF(`3iw~? ﻷgT  -oNS ΄w?Ę 70 N[yWZܖ3HzVR ϒV _ͪ2l~g򋍏ȓZq^hJx}@C؄a@ҿVMQIO.!UļDK̎4Q7 \)nߡV`2>|Ӧ6X,a m׏NޏƋġ1fF{iT'5>ܜͩDIJ4$aCO6IZ: ecx:cPAK'JdNVkmސe{…z qyKkyg,!ۭX޲,? r DxTLْ:["wtO 4j6E]SMp[2貱xË4T"I+'b@ω~aZ0嬢Yĉpލ-IƐœ yΡ;~|օfGH}+* & *P ^jSm;"E[eDu亶r/rבsP9 *Ь{B06\I Nw`_PH3b߯(/CB V·"]8qGd7%,bSRп4p>纊)SZ#w?9܇nD(Y,=~ʩ>CB`&?>DT;3LKLH)qQZ9SOG Wsӵ"FYcU{H U#7Uh}Bx9hҬ'e~+oMJLSRù^Pf 05ws,z.|dTEH_'kh4 |ٛ F"I֓?j0Wmj{^hO90qIb֞/is/۫ckj!>vSXM$Pn p͌A/ W{qnVtqP:N~;?rH+}tП \|)5`r78Hd9ߕ ?SZ=t`s{cݡ*`L7;<4`@lz϶Pg Y! G,Tna\{|ђFž #kSuVs烦!oЪ)^e׵ޅpU55fjSqp{yƯBw^0>mACc JK얹va_wv2$>8oP6uPgZ~c%X(5G^R!{d@+iCψ"hXo7L%d.q.~e&myB5X9b8JN'#-Ro Ѭ0KBbQ)aÎؕmHJܣ@9N]U / Q |"sk{9%n٠%X>'?]&TbwA*1#)GQ<"9~p6$WwDT{)L,,s̒k@oh"-xq.q-(}ZV3tjв7@ea+y6|)ѻ&PHsLitSs=,n6)z @{>ظ ھH,_'䵎HwGetV KBMLv.`I0¤9٠%f 0@vxWaU[wc'FioxYiQݨG{$ ~eCʫlh3 w9<C?}R;v]JHoٓ=k eesTv }\EL9@REGFPI 0]}?o|iaL`^^Oٓ(0FUeF[+xphP'\10l fb/m NF\H& hOK& =i#D :q8&DXΧTr(gM[p6G:N Fcb EC(EM*ҽZ B "&r4- ~;!/eEz-G,DNWȭq z[+ABh6Cu3[3*H/(6 \zP4Lb& '''+0(MV.HwD>I^@l>+t"+?fH&A)O8LOAleWɠMJ׋ шHz5m }YC ͨ쳤Y@Ԍ6/H!% 'ulK~E)mlz7qEG#p.L,'cx @-BiuIJWٳ.tx\*: تQL+%\bΓ:m ͈7X:Bxq2t =oE/aBJQsKeS/h pswٙ?[;$CƟ+T%$tNH{&%"~F/hs7SLU[נ(\[tk,>+4 (3 i5Iu8w샍(e V:;< .Q=O?4' S Fp^:eo >[x,e:>w# s+fnr 4 -<;CY^zp#]l!8ɥ썝*Έxub{geJiC\@/^Vw}C w7}HYpG#%,Ñ6;.=IdMk5y#kvtS8k˴ebt[);Y ]E,ӵ3AmvohAĸ|]DHթ_h7 8gm!c@R!b^N5yE})P%^wkv+aak.܌8@"`cȽ &(Z)04רeJlfEޤh.>DŽ[О汤0f!}ad𢑼Q+)jۻ?yȯވR8UѰ\Ї~kI8+^_1Iv-utȜ rW!{ /ўJxQ. !15g~*+H?L 2#= f#zW= \䙟u;y)z *=$ T{LƄm}jhl/`$K[K{KD|B #nM0`>0kEUh"g8}Xzq! ZyC&UadsA#h6B[f=`lOoΔw(gppk9`uP1ϟlD'ȨٺMhP1C-NvX.d~͖9K2 Y:᠏ʜD0y(SgVIqt1Vo}#-`~嫇so!u#jaE㡜{7YT7_w%+}1Lhȯ} x_]Đ Y3ix(f3wgIr9YX97 >@9dJ9ЪbuQV_@%fg/Ƈp KdM, e;2~cLv_+ߑi4A7km_bf5$\#. 8χ|?b ˤ[(3qITpâ!%:M ٖ)N}$ƓxOË bJ'3G;:1{iڗ\;<{2M]Js_Tx ̌y$B"Zm mh&3QoG7  u&y Ӑ5 pL4QDkO.Ju_YAh`v!T"x,P쒐Nc%t-]j} -v-Mչͫ4w~6pt ٕHe=T9u+Eo 2;` ͊ LtӮz |8=l=תquj {JX_ cckFv$[/IOpR0 "pcV_Z*rO!B=Ϊ~Зщ*vtR;b9k*B>ڱtAe?8R{qf /t-Je\T(CmnhG@LQQD-by/0jG{ENV>,ˑMGz$.'7$xzx2< KusO!:u lL :jh1m^0@"C8uڤ^V!Og\L 77s(DSX7U_-H݁ch4ť&>o(fP :K{~U0hnxtRys^Jni}c2`ë~Ă_V#C7E"HjǬAn$:R\qXY} D}%X&By> 泈eLJ"{юj:#Y!D]w!|w|_Zx2L=#V}-Lng]BPsQB!-WA'-U7.F) 7C浕z}QL1_[(1[m*v)?;ڶ`Q<_!xɩjֺh[ } ¨Y0ۧ*@)|.4G\nǑNKL /ːrM06jcκC/.[%qeW? j{ğPzt> YT٤;7s"4?19-.]{N3H(3m(dAK{ϼq_guxM TQT; f.G62ХΥ+[$B+):M8-ƖKF>YCt>>=^#WTٮ)v@DQ'|mKN=x.s I3V y6=HUbxsH̝ $݅dzMv?={X/d?ᾢNld*m>ˮ($#+Dboo.D9I2w7V.!RJ#:xR+*8bR76!2.k&U$zw- χlhg`:'*6⩜ LS.r:k [ Ւ[g_ٺ-6;vbqFYMR#g?#w1&<࣊Q!d9heu+7d,Rn.N'M7_~A#-ǩzƻÏirmǂgB+͍,GP{* bla źY,Ǽ"c.ry  3s]iBm l=;-27LIYTxߋ[^ފKm&WV.u y3$8&רmde`4㔻/x-u|GjmyeMC01'E_#U:c`?rSY,t~Л:]x~b (Au6X0`dx R8Kuʭ^iE' ?'uSm}3g/ao S*'V)ϮE '/2iJ{H9L۽ .qrb]9py0gŸaM?E qTTzT%wI .u0x ɉ -]UY8BnKrh%&V@Sè_ɽY2lx1 Hh!j;b#xwL-?C_ϚdKї.ڨPI_B+a2I- Aptw+H!y* 8B%4l͞Ӕ,g>FxN h?u[8C0ׂ =sح inEJXދ9$#[g/h4sÆ~0JM[`b΢rRvuaHc4%2q$o$q#.WުoXDy #(>ְHB,n ݨV<3>@ZZGREwA>ҾͧPLOq)"6/L%_3w4Yl' ޳5[oT: -;%kP*Zx ho_3Q4J&܇ @ lRb2|ӚDlX]–h_ƒ^&~1m< ]E"'ZT9DN+RŬӞLE^H3t& 3O l6bpi>٪|w./Rwll_Tp u_qn#xv)dkQGsz>}@ F-+83 qNi RM5y=h}=rS[M<;E1 uΒ\$)gB9x8I= =|uο9Z2P r}Bj'ӉShrA_6D]*Ҍ`p0bC48j Ť@zAhC5=^<ۼ]r-%aP6GDef fýB"ƒɳ ][fY}^S/2ii׿SI|O*/|4%/bGlG |`CN9|> <6$Yp,DFoϭ#W.&&pJsiLRb>/0 ض՚9ay9̭r+(+:=KMǻoMxX9Qc?q"txKD1'CDAе+WzaL\}O'ko ' rYu&˘^ir._ ڞ)ƍ}r9ˍׂQH f9[2]JtHչq34;貏N\VgksIe.}:˨0ڭET?jH~2bG.6[C%Ӂy9x PO$hz.EV"4q;L6.="BU<k:~Д\uQp"8rc}{ƎnW-@a^ϳvGA1|]x >?IDohDFWI عK~ HYU6-vi>Xi3w@&گȱȹ ֹc $`VE;GC螕AnCjG1:7QciN&FNR\ds%NXX8ʽđXx83~]ˢF6W`z 7o |DC-ZOa j#ttܕ:NYSnSS|IkS淬 -b(TJP)T6ЅϡeBrA`c7G57]֔րu$XiRx:")gTh6=""$o0C da;CQdEq,(77E^/Y+=ơ?ܑ6֩I\.F7aqdP,d_}#ϡ ;z \Vuբ?^0ވOvϝ r.FW*!7WЌȂ7r_}wM%r=њ;-v&Z:l:X<ǀ&Q}+xqdEX_+dVoᦳX_KJ`UӞXHЕ 5eHQB,^%&'QLs=qt^NKOp~Lc"MSk_][MSi{tgt{ ˏ\zbZzo+L@mQ$s$su!HN_U&$`#fkC:H߅4;(`@kϮ>mY=s6oⅡ yѸ,l̠1i"9]wД$y put0t,hŇa|+Z!ggoJsr0?d!F}x+MJÈZX&]p$^}⑪IZ?M >!̪s&0]kZf\W&UM9A,z<'3T0˿NzH#|jxλūy'ÁYɸ'^%N)vh.0ܫx56p7 #z;qpe'I菊[S /]dX·s;6TM# `d 2_lB=2#VzXMp$"AXt;p qu?65t1A4,#2;n I✬^Чe"PU⁽|x|2FD | DhLؗ+Fm_]Al"X&荂}03,;d,2)AEc$.I`MWx_ThIU %Z^{K+J!;cb].>0,G8h V>O:֫>Q'ŹA!&/ioxc"vp~᾵s`+$v|^˞[U50hqVܖR {__"꥛|? BjM{#Pd~ō锦})G9οVe=hme w6vQVL}x)P2SU¼yrwp 9k B˻&U#yH]4DZrl }Irqc%b&֧yz M8 [ :jy9 e W'N( onkf&Fޤ^ &N,K\AgƜA̔4?!}re ʸm~qy,ߎݮ GkE2C^^TS|~W^h c$.iZnpxdqvtSNfslAo+fOiLR(>lQsC[-8_5k(Q'rs$߅u0?h1{:C#eq:FQeWcy|u h!Yg@׆;Ѝ%PdQJGb!+sx #뇖^0HţvK{a-1/Aio9CAZLh.h HԸ! _rIA%'8QX]Ͷw\5[>wz%uqcX[K834PNp4w i E7-jgA0Lk갠UZ`j<¡?=>8~tfTw(%Y5C op-0/]ثIDjI%=}b+h6KO[~/d>a]  vsoj<,EL*j9 /+w7egew+faO/cģOv,7mߠ5:Bm#ڛ?9F 51\hexNNNӉT0ɇ~&v$E%N2g..NRBn9 9u@y6먅L^~ U?!r:RE QWȁAzQLaDެ0¤EGJt.>\I9ʴ?8gBDeZ?5t(2A5TI _uƫK# z '_jr=OW 7q|o!\Z07:lGG(ƴ3dKH.(CE"䔩$ۧa6Aq8%Z8[p" ^L;6h,~i[ Y.tˎ0|p3'cTkP&q^7}E{ւ+J›:B)Υn`5DFwɈ%-e]a]>0=?Ӟ\յF:A4^ !MRslVܔXā;(w^j5ӭ&;D"Sj0Wq5{E1-3ƅzIj?\dˏ{㝾Cl#+:ˏj"7e_u0Θg0ْw.pQf_'6i#!ՔѾGZPY[qsnBm7fyMyX]MClCQ1|% E(C \ƮFƜIv|'-6`Uq{+!!g"_[_pNJ]TA%JT˻]y-lʋP/l9TmNq7d1/\&Jyn(hKyƃI팒*9KˁZ_>;~x?U| 7-RVVC4^^V͛7M[\prN.'wٺ v͂Ac. ?F"C[2ʰ;Q't[+bUwV{e:;ϟ[wb HDԙ`.LyɫmXOG ? ,Wm̈́l}GB3_5q Rv>D+ ʞ-!v\P)*gnlmz|3Ջr͊GZ"kF ZPt*{Y/%otc&%Mo%דtJ+ap[@ȍD{k]^krߙc^*5U~y!CG6ωRMkPr3ſGG!\ @D3[[iD'榷Sܣku)?T ݴY){.cxMnJ@7Eβ彪u=(xYuw]s߫2ȥƥlY-/Kg9<Ƨz óؕ [z]M W=t`}G2qXI'Ԯ;RpGGQ\e+R Nv|ˏᣕxN2]j_9N,vRՎՓz!;1?lߨ%hk~mNQQ3|d@lVZ r=kqf!Nnf%{u kȝfB Gh u9h |R}T]2bԸ tjɄCJ.O/\ru\D2օxDWFvuCBx]GOh\oN |>'J]#`n S`^|ۮiB9yW.No6_EA #4ގJ?t8C33FRxx<-pR1jeo^ 3E+zY']$U0e;yxl½w_=EtϯCNJlyt0d»dq?Y`e޺vJqt;Ux >S42$Q-6=c#*VKsՐe4:'̿q-BsKpbrjZ>\Ћ3*BP͑|TR @{4E"0pŜid[C")?6|!z)./f|IN`ylB<}ܝN\i?4d "2}͚uЀ tqIЙ#iȿX %zw Oj `F|#^Eb[j|"\Y8s>} ͢:xñH*w9wڧ{BO͌"/kD[!#jzW pWR[͠(\[{T1o=߫;N 2&i`#u@kZa$CJL*OMo*1[HГPUv:TjSNZ5 2`}qrĽJJ&)Q׎HJٖ{2my%إA蚴Euqv0}9`0F`dۛke6yqCHQTgh&Yx5m jz/0\6!#[$w"YyӨj.0=iKMCb~1Y~Y*D[a ebsKv:MDS{ApQzG;%ASR"E*I/o*RL,,xVX4DBBE =/缔~H~HfrAN~'D 'Rߪ[AJNHX̱{)~Boj#R43:]t>oxhXz~wWn潹R~Hw oz=A9K[#+},l#ܽ6Sp*l 2-SPAq^da{4_x<,Nq>m(٫i6qTMY#:LG_"dHv,8 i6R^#x2M^P7Wl|T_硕m2x:>ޏ;@R"`56rrh1 bXj F +s˾Gѳ=w=DK\6$1=d}itި;tȤJoÈ=vm^}δ467g57|'S"R<]WQ1$Ʈ6g:a?CwN=> 4{?]t6CHB]AmˊZcrO2YβGrbZ7-fr ׌ާ Gq4,m~3n=SS3~[^oR?a2Iq_FH8|v.!A#+Y#/r(A][h0¸d!s^0Y3a挓\y2X`5w"hl{xBe8SI1Dj#XU%% S`SڣKGIo^I=~w#<7VndEO-X)w[xNOtǗő߻vS=-LGbc/-{COؓ!uL062"Fp~p.:P,EؕhDE Iyu L"l^zf ^OvjQ7_BAF16%4psXf]K@ه}፳dԠ[6垭iqdp*VG竭X~^ݓ,MBz vg]mߐ¯ hkx<8؅3"c\ mT Y'҆2,)?Hf˂<oh?,p!PV85G"84 Eq!>~2:ܚѾiEՉ:`xt(;/z?t73lԣ0ҭ6Fc9>prlUq,sЁR`^j@t)aV Htv!匾33;ecθJÈ_d= })AkcBgOI_lrc~u0MM'J2ȼr( 52v| j40ʑEBxm(F{|Y1@rl6sw,([]+ e痏#K2reJ3:;5鏅bewdH\g|pnre%Gt4j1ZF:GH=yecvbe4je]6BXRɨ~ Elj.G*+.-Ud#2_0KyIoH`~pڗia)5d4|'}㪰^{ e]jSti!FB振$s's%{[۹QJV^{)c8.ypRQ3[EE:7oԖqxp`/C dN&qR4%DN .+u7:3 qath sAܠǙw6ەԲ;M#Ū` " T׊؏{|@lzZ,a O^` rF;[cSʞxP俬k2d( uLLAN}Tߒ4ɞћoHG愂J6̲dz _arZb>Cs.opENFBYv)3[B9iUS8zŰ(! M3ǝ/GlaӜ`X/ڋ>H +Lb|z!R i<`I޿ossr |G*Q'Fӳ&!|\6 McN]>m2,W1ގLoH TތMݾ XT$5Xl _B(ך͛X$M|4+;fAfwgaYs=Et~ZšBAJCEJ2Z/o%K!ԨX~7c<+uSi$M qH~pGELy鰛U~>S_ i w[;lt.7VP^C2藛8wiqT7`wU" ҄EjOɑ Mdzhv ߌMǟw֭g1 ej}Y,,iࡧ#k(uJ6P^( @02k`<բ\p5t:`'[Gjvgqӡ]gޢM 2gBy0 )SP Ar$$>C.qƛ (edUD_G&\^kk wLW8\.e /]ҌO%~g-;bq:45MQ`+ 4n"{*O:.%ϟ*@@ymM*fM!?L`lȘ > )nnAZ$iGYZ!)HF'nu8 %"D>QOZPxeb!&{Ʋq-$O 5OZ*-YLWZpl(Rr/ 4cl ۂ9.BxDJ6A$]>!%G_، bd4U&Fʦ\K;G>GnJa?;n8iNqfrIfCMuk3z_mmk?W|`RCwHd53Br*>(E>o{tT,&9_:d|T~ψ&һRKwl,~8\366JӇ۱Kn=/UA1.?LUI1P%C &C@>Rr$g욳 fmYN0_X<ֆ" !tgc¸PQ3Kd@{2O1Ҧ6)Aq4ɦdPϱ@jތ>`$MJu_9L8"eQmQ`d%;3q/ͣH Agc&T9KdߞM_UyǥA ˚~ٸPaŧu*[e2AnE2E41{lpt d6ckO{(hGy[Aimj|<- e VAP.,݅ݓo|.T[My94Y:\D%۷8CuIp` M { r;+yjX&\+|+/,Fg_Wo= p<͕4SI[8U=JIӹcV(> pʵ9&4RxD$OBq-!^ɑR/Pnt2BQN̍ɣh f<;);j"@0յN`SkHQ){e c,vTf'K{P2]y6 F80x1,h5#z`Y4A]mWB#z{\L<p "L">IzLǩKrNAƘ𨧤̩E</U]1lgPcn|8Y ճrJW.^Q@"2ȩؾV&@Z ! LDIT?eΔ.. "$g 'PvS] ٦}p'XZX9q#8E2li 2jrޑi]2yMJ Ꮥ*Nn3l&=J]g|0VeK;ғ3dbǻ 3 p[m"lV&e=3E⨲iYW3-UKaѥ A˜j֬3}Qiɋ+٣oB4g'΅~ٛs(;!0FK)-*r܄?)Iy qt cˡ_iƕlX{x;ۚjQ7ljTnCx.z"9W%Jq=+ʉ$7FdR QO#NUASԽ/[+红&H;. cW}=xB 37UǟJy%^:j-,̊.YeDˌ p^Q>7 S)c-Mcc.R[|BBw洩*ua˨zKDd8I9A?7ooAl1n}Ko+SR`K4 )"T*7F+> 4<oR%g4Fo4*a.t?gWy| uaGM#|sFT 䮣/xpXz◔}ǂ7JbV HIZ+v $w00ݻɺADoTM<⯭ */Q4O?0xqU ]mzAsV'.H6@ݫhD]fS nRwUw0L#pv?M3뭌t|^U Ma-O@)Sd֝inM!/%ܪӇ\xRhT3DTp7E"=UxUJN ?cLⲛFL*^/`Vc!yivkqqѸT`5֛^ )NG`kDO›e2]h¹;z05a eCG2~T 352^/a.!;^T:fOK| 7 ?I5x?-w6ZX32ަh?P48AO/V{UrƞA~R.'N%ǛZEI.7v'Vʽ$"^ {*-@L+5~qnڒR.e*LT"{}M&^D)>6~*vG<m8 ֕)gĊx=Of#c&+xt>:?j~ws{-N>1mNVSxvZI~-u=tnYĥVOrJ3Rvۙ}*䨱/odɘ0xE|ܑW`^7yI>m^ X zM/M`5Rl-Qm#TަWǘR?`X:U<,9i37/pJ7e x/}\sJǸxhZ#SD_Y8VsP=<_&B!@[C)EnY^&M;Aon g#Un!kr G= 7Æm 7A&,u ":gyuca7U F{RkK|2'ψIȭN/U /1"Z65/\a+,MulQbC{B>vMQNt p=chLNr㧳KB[M,+Xqvf\vr"WB xW{5aBQa+ʪz'0! \O'". 48ӧ7oл.Nv8!n֋#BpF^I8%961F!ަ_59?ylg&H)v1,E:>U$<,3B#Eà%/yfo_yE+;e~H/ $h rk=&Å=j{ T/kZy7J=;}x80VMS~)`ǵ~68̵K?ʺO{]^,܂eBlsQI8ܻ1& ,fI?s8]rn$ubӤzXy7{V?q~qXmGg4IKQ)zZݦi/6rӜzBTf|L/FaT?U%Q.Bsے{`6*<_Q$~ӷ''(rB`7CImq/8rzǍ4vIXp[}CWSWGFяrLCCxŀ?e|Nho4!`ŊO~^gczbGUPYGd ^99hs?m>"c)FJ" uTyyC1_a Dq0pT6)!tfx me_qCޓ~Bx{+ؽ%z?]aW6dCGY+a'UIyt^Sy#YQBWE =K/!{BJ?D Ik]Ro\0_Ie/f#We P } 6la $TXjlee C0 i,ЪmOrIKj>Y2(&6߱)DXiT o ׄc"X 0WPk1R Umuu."(ˈ+j<@2Ǿ- B^vs:DA80G kZɜP&@pA@Fq 3h/tt*Ya[=+;,LqjD {$9Id\b92s$(K1Tpu%x0A' ?uϔq]hmrق*Vw[f,ЯLF7q3Gx< 7cpIȗ8R5ߏYb%} %$_'nl9vWpr)IIK\ {MB2l'i`׊ An1W5:gYo_L5vsBy 0ZD.pův-~bdNY8Ee?4u%`3٩҆KWl #ӷPTA:]v`*H²jz*HN6G%8pUF*kZ i<-BEwۭebb}]:>-he&CQQ(Bنj:NW-v` ~H­V-AKre:{Vh v\U ΡEILj5 ս/_?n:Ve8g ^#VȂ۞l8$&/]ml۵8&̃yrM,!2BUo~2QKRQgl$ e O8SlsZtuj7x i/ݸ\:̂j=w, h㙀|zH[?[48. |_@7v1f;83M &B1iwwx, 6¾ &![z$!~t3_e>NnPL۶؞r%K~8.2j y/7['ٞHgkEq=a0M-b`;H8d At1AU1,v+9Év=lp ^ xɑpF4<CnXPgTuY)2)[:v`_hV+N8ӑ2 LiY1oY|Ut=4܌_}ؒ'^vi8?Iu,,)K/݆c!ۉv/;pY!?F.[A DA֮zE W{ 7cW EX0cc#@Ї !1-ؚ/v!ZNY ȼf]pSc ꬫ/~4AA/ {%!N6yNɝR,5>lQnCEŷe|3/%B r[':i %TK-<. ,!o΂ǂQ+I*6 {H(UG'wդJ<a]%8+''_B 4r=Ks/*j.H(pZX.knasH0&3:"FҕcLAʬt+HG :˸+EQ']6cC 8?Y/*eft?u {mؾ@KRhvFh4}kZ-DI8ruZA&RTj2hfXJ2X'_WE]\5LAyx iW)J+@񴽊ishONL3zF26dkkr\ޟr!wW>!; V8@}`5 E3)H5L*褑~K]dXQS3GxDxp2rv5G}ksv7_XMjDC{!tg6hr)tG`1%fNK+D1e!zNKuDqt ynKp0Cuȟ`ym\  `Uȶ_0E\\#o;'4"q+:d tLP$4|+axIQ6̤Z`i'/**βzh3M)(ATyV1zJ|\RL]dfz4 } oҙftUݠ8ÄkyRB4 ȎMiNQI{ߞ#Ck)6zGoc6<շ͋M:(_\{%o3J?qXO}peb}Uko'~ =$+s~ڰn ڗF5xRp~E9'ѴfL"!d% E{Sc'pN\&_(B6%)ēI‰bVDh=/@ 87񁴰`_^Te~[{Yg00Sʶ`YBq!㧗γ}$VH!Si]bsw>!ğӠ$,DXӞ.@0fi\}\ג'NqGB~F[xVd稂 5@!$! #ʭn*y't^8٤^˕HbMm rA5Qz 99v;w/b[ g"GG <'c$ZD15Eё@8kHˤE=U6eQS@9_7=2 VXDJRAoh2]oXʧ$3:ghyvէ!߲Ć^!G˭{Rl> ߞ(lyzƩaZ'ߩtaW (e#_ Ӎ(fGUP=~*}yTVBb~Ǜ̂ͽ^W9CH_~ 0VbAk \rcKr(IgÂʞVxZLؙD6}%\AgiNͿN}"옩\bIͅe5!3"{pmm31QKZ#gN3C@3PAIiWimyެO9b{/>`΀mݐmɌ ' D€%HA?mtz[$9S2T[_!HaJq8w3-ڢ)#Lme18j3)hPhP~3> ޅ&gMȥa+~,.ERcS9dLc*%jYj]2~с6GU45@ŠQKf% ^F/ ᯸)mi#'%>yz ֬7v&!4[wAɝǎ| +qOA+vH~(-.`:xF\W qCTvԄ0D ʆ%D&2/d$ v '\nv= cCu2v-|LZذ~g,Y9UH%o ],o*64Ujך WpD mh`sPyf8&{}Ii*@a $9b:P/[!/^- 5XYr2i:LO\?iG=<Ťd7Z< ld e2F?GS$k38#yH$Q-uOATf ~&% Uڑ몤/\1`t֭LEA|H!4̓ɥ߀x|:T 5"vEBϾgF"Ȅ5_{AS2Vú' BT:qTj$z1g9) *fOdD.ك/qfL#11Q~~>rʅ3;Ý*y`Μ*?@倈oE=NDEW 4cRmPvO+2.=2cKbHMŇߏ5 p۰(X~3|8B9g:7Kk[=aU׾{EWhN R>)'*?6*ֵ:=o'յeSx@o8p3]6,#8f/Ϝ#=^*A&b0>FCq hҷ=aq Zcd7v~cOK_i Z2}h{ :FM| ®bqs$*`9J<xA☖L[!"ĭmIe_[|GGe\N N4sE( #I3nrӪ]"ʈ[vq<' 7ܴdP^ _`y5 o}k zFˉ3wͤ>~%fκ?K`&ŷxtW3H*psa7a)B0rƞQPNJnuvfioO$g[BlSgu#'igr ˉOr6HX襤`X`3S󤅑,#wvҴȬTU,*UzAuFsO:{53 (Ftj _"z-y˘DZDڊ{Ĵc[LOP~1Qw^:7^j_,#6 P%#JЫ3V۠EFXxϧ|e˄#*FH)aܹ*D<{%$VUg,F-CVDksCFN2K ^:݀UF߱8S=Es"s3 n FE{S@G.~,;Y4/MYx\hy 59o~/ڜl I&Aa9>;ef  JCFL{A% B*C9qz5n jf{XC-z8:3dUTәې81Z1bp9N.w i +6ĴD9\  -Lbvh4hGoֺQr1p5הvDHSڵ̉[U6n3*M;z\HP+ JVVtQ[":M@_g{%gY&  ؿqJ!>aD0Wx6j>wzFV{Zj;4>BfrOmIG:] 5GKrL(omk3w~* "W.ZNuԖ$.5g.O|E}l_R2NJ,Ŗgӛn b$hȅd XQ9{EzP5,ҧ\j= h[xU`~QMMw0煋hRk]2J EZ({ o#k(#ʄ`XxssF N%P] ƞ08@3  I/ H?OSMCbgo,0ycNJGevl (߯7m+zV 7#ka$ewyX;ߘK R~fQ*xm7\/eh=oqU(*f в|J\"ؙkhW>?K"p{>,i]A ^;|?8}gw(l1G#Իȿ|ù"6j .44r8&&?lC|u.2ߏ *G&M=pOƻ@tWGrL"X ; ԝTs`rr.V~#O-P{Zf4Eyg`.̹.%jB뵯ɜ۪ZO4G1ϔj e֌?4rdM ݅E'DwМŸn:!#M"@G7e=~od c%% Rd{#A:߰y){*N?cGZl5.v7k D>-d_vNqƳ-4\8>9ٛAC~@ހmw"EQgHRsDƯg/V:Qn5!cZX{@w٨M[ig7S/d[8[F/.q[籨o ?vvs ʸIn *Uo_h(fT+_8̸ KX,<Dܴ7#h6)ϕ{1lqBv53L8*:3&:IS$fSmAlT p`rzW<% 7>=[CrJ1aj'j|:NUkA WDk#XKo$oaѸUIXi$-Y1'Gɒir[a`k_QWBtopI.&+#n}Sެ'# 6498SRc"lJ-rЬt}o#HS ;mĮ6]ݢfKZ"#~)RmJR)(@G9_{4 ,쫲iߕHC/mB &y81 tia+ +@+'d4;sVX=e.c"dhY'=D;:$f:1K2w$i?P,ZZ>qP-F++>Ϩy̔Ʀ7oMn1~2Po9 E36=0A,{3Ybl2n]㥹`(j09Ӹe|-Ӳ)u6d TG[ZQ#wKSn~}M0&k.r#@+ 9-/XSnV> <=kj_SoZKZ}qxT*W80,Wic8aңw6΅F0X*1E[dۘkGR60aG0{Īg:`}Z@nÓ7 -]agm Io§dfZ_T3-yZ|߀q>oGW S+RKIUVzcX%|ʘzP}4<Ew03@'Y׋־ޖ6ë[VRuܴ4îH*`gcr$V^|Y+j ŇzTT L"R2j8Z'nusValLǜ5=*UG~gJpI>v^ΤlcUCXxK0H+Z6&.>8"(EґWJEס] h;^ΐ Ѱ%H⪣Sؤ_#a-օ&p/˺=xK> PiQy(1aMT8L1rC 2?oD!L-3k,rUd=evJ2IY%_&9*Zm<Ԏ$!+#ɻR8y!X@@?hCsoe r$g}+kY\Hሼn$Z(WF XnJ/;vu^E&.goCf Cȡ4/iyχnVT ó^KfkӑpӝjūId;=ARC6oF&8zCBGj_w`""cZF`Txňؗ.hSکvkE.Ov?[Ȑ*萑.O˓Cϻi%CZ:] R!ZwjʵuB ?4vl THyrg= ^{Id\+|.dVkȌ&(7D@S^X_, G#UvWwR[zԪ'$+زG=2o⻕ETg^ ;K*6̫v"H'ҹ"hIsPě׶z}/^ҳӳ[m€\`ώC9"xA<($ V[$Pa_hߵlo} |~kZ!$P5W^)rw<f4صI@<ԊnH twNUV=fg\Ca"(lQnMI8aZVEbs~)/}QEB3g5J&YPh* j= $]iٵFk%/>'B9iC#ć0tYuNiB@Do@!:r7^5h1 K [dj>jEv@&b8,3ƈǩV<)LdDԥ;aKqHE"̂=q6.  %"d>RSqu's*OuW֬4 H n>.aziU^phL{-V;F)=e/Yj6 8{Hֳ}*n@,Kyj<:O :#0Ѡ ];ג ՇjEc|\66ꎨfê,v OK}LFj3Rn6] kR+ L3A72N6|Ξ6:8~HS[v]32~n^צnjKeڬ5qޯGx#8:;E%DzA g@mv̲ɂ,{t~ߴY>ֹ"(lrx%mVȩS0]m{0(``оN8i[iʏLۻ?82+]5c1'!55rb]kD'~'+ڶז˰֘JSYY6󗲗@K|5.Ȳ^ NoQPhdޜ#evFߣbw֯i\S8^*zb]&_qExe O$.h0~x7UtK7];jDZ39_`_k/d)pɑ9S F j-#DrYI<߰mpC o(jd$ѣ* vK㬋UQ+pPHшbS!Je]Cӈ85u4N6m?T@?'T' 2ӣ2,P0{6%A?pX~ˎoa.HaEbb=L[ᰆ0~(Ũ >cϴ]F|[W+!w {yժ"$Xdb%Ӭua$/޿gw7Iή22Ŝ1<`ʠ@ Ե 7woAe驠>.5]AB%]\1>! m$fdEU Bh ?6K?!j:IaZbq.hxuq/~ %ˬBZM i-l3|v_ 띈n,+a2/Sۮ _yO~ 9+E& t7ڽ%#;$ $=E9jd(=9A~Oe%ݕ?UcBD"A!0Y-%"бzv v1 -RN e2 vf)#4zvfG-8]-3ɗ b+WhzUљiy !1R>EN(n iqTɅ&}@t2 T+nf Lb lܳzt W0uh<#ICJ*z1j|$YUG(@w*r5T8)b< ؗ< Y/ x`#Fy[OvK}0 |8YjwGy;I_+um߮*Q2[?h iY>Hyݼ&u . Lz\Д ' W5ºCĨb0޸{<ܧ%-I! a :<+Ӑ'yPE}(3VȮBMʮ&D|0_LGse@ DKFj3yzg6"ΎCN-9?%mq?80!jKdL51 v wct]}<4ﷆS: _Rn2޿NةswT[8Q^^Q,ak 0Ȓ킕y H2 W#Ek8?2.pX1{<.Y 9}xFQ5:՛cZtd.]W.(lØ/ĂVh8'~8=@o2szF#nCF:^ y xЩ٢_IghݨD PCLkB}3~jYz.t q-U1Sxgw^>a""RMd;:тgS*BxW7Cmf;b6w%aubz\g76`2eES#e$i-Eq.èbsԒ-15ׯKjF(i`?)d?SPa?VxXRM!A̍|j'}Fȳy?q'*FEK1"pnoEؐQ˄1@G%2sčߟUxm Kglc ,_Yjqx9!vicr""85u\?W\9뵻 2+u0->Ι*b5ChV-L?lcбK˷ A ZQT]=Ph}[ԤCK}*9$^ؽ3KNf/HЀGNx>X?381|K,X=?RjE Oa_goMַv/Ιm plBy?WHZi bs<’T5a > jYz32OcbvC>,_[f\ggjNpw8V{@ƱËٽ1y\`H.t kxE:6;]{^k]SC=2)ۺM= <} 5D%MV}-4}1]E &ڌҺ1i}B̙4pkfx29Joqٱzq?zCzVnr|6-?s=+yT,O8:}adC]|QS{ f|qR.}Tn!q'þQk((yUWP'`pǜ oX/6cwm*Nc=KAe_#\?g>QfMX8t堉7XB)!-7͈q~AXQo284!Ͱu-JԫDDf(v/@T~t1ӀCjCS0OnYN6I@PD5xW:jEnBƫ|EV!=zt@(⻙WQjpaV7NX|Ѵ&8 VG~¾[qs _DB\`SYY!Xx @!gWp&c"9 so w^ uq gzν_G8='o,A/@þ>NYݧHIu;xEb➃qđ?dYOAVfeKMqY!qǫt.$?8'! ddhAœWCIp9۶dtMu<}Dٽ'VD'ʩuoH4_.jHM~;<O"`M;GF U'V&_'K0{lނ̱ C5!&'guJ~)7k1:#dqD%OW =}o5qs LnxC);S@ {֮NsJ0>ZM'kCr9ۂ/(zIVQZ Dp"$xTg_$ ~]~*Lev3z|uh*CqY07:u%eQA)/Pae3QҲ~LiNcȰ8P.@LqSX5Y-dN4n 5Tm_pU%&\ៜ>؇o_%}g1T%DaVU;vdk6iWUvEJ8V_ e 5NO%0dDzVwf n=`RG%c|щto*N 8 n?ϥ,-:g wpm܍ [3GҽK>*ܠ$"00Fzc-ZV {q0͒S>{@XImSe?%ᶚG|Iѵ6!WTǶKj{CH)RY=J@'/XfxXB9k '3R4! ~Aܲk*1`ICnᕱ6=Sn@׬."@dTDV!7KX[_S/k6u_]J7@w.|`֌[Ԣ,!圡4 d1w_4Ĩ f$#DN *bQF,UbBwl?h4G^ህP_Jt$%G>K$6:nf]@t\j@44 mz1~0J&FS[cϳ 0 #dK nP.sÈD'fM1&k@qxHs3c&Mݢs}:Wr\d=f/&$HY ( S޵(zc%`MqBt0SњXGN&,q;?xQKb7\-q̞Pc SGV=--T4WkΝϳ$eP9^gySȚ;s:*h&K~Cdc>@j8/zˋ )aM:X=rN\H!`˷NҖ@5 $#ظX|qbD@|Ov,RRAv>R*P4ׇ9ɿ#抟VH|oB2=߉p /_!'.:P!v̭b@©l,0b#h Md ׸:7lLL/G,*թ| )c^dǰ!ϽzUG煑d!ĉPۥtid65:@JŤqZ()Q٘B3kaEkOcAE(Uc<3/'q\{h{|k!)o8cy.TQ~501EJS]lL J%Blo#4:mm֕budO⼥zDfC%励"xח]˜;T'8saJrq #(%yIF:?!X?"x;>L:<6M"ws_/D݆H1t2(gХ1fq׈8,~u<T<>MǵhdN1s2_N᳥mr؛P>R=%iy97惒1 (]A +| W굡II-f7yԘܰx!8E7!_gc?!(G$A=ۊ]enWr#":{m\TVhL?/Z v@ucdiy:@91ٯaN)ntyD֠ïO]=0{TЈ mJ~;/8avC91_qRv2l@!L ,6L 9o鑣 3 (Nz!A~6 @`F:U;zq@9}u-%z]>GOҟϽ24l&ߖW0D7@yt>npz]ۼt!?G'` ,֔(&^Y^'E ݰCB qW!)wiiO\TG@!ILM9;@~}GPwŦ `o*E/gM) b4ÕDRErvxAS.ߓ3ƛ@ﯼWC%UδǽenMl-R] ѠOpv2 2+e( ^7T 0ˁN3^ _OCz} p©㽌xfw2$Pc釞 @80nϵ=T>%yH4lK5:g {#0oiQ*"w>e,o6ybvIYwz͟+v50*Hl Tь|__ T:bq8>\⯲znn-T#b@56u&Z!L~71: N\ ]bCxh|'R;1>;3!jJv.3\Pos |pc EVqچ/p| .hwvrWq{p/nܤvqh7\mCe-bk!C*#d>' ]*nD#5gO5թ#&~LQ:rWqLA\܅ȴ䡏nhS٠|p{R&ϯ6xl6R&C&C[ +L Cq*vRH>sW|T_q*4 r&Gỳ<9;' ưt%h1pՀMw}\QPf=T/z h fqۭ͐ e $PW" jcGޅ%m17me{ d3۷jK$_) +5.Nc n]>=wYʰuyL Q*&kD] FG&Ia-ڤ].gO"oQk-@(18LRW'9@}eIJ+٤_mrJPzŁծJYdPJBBN.R]#*BHIJČPLVw&6^!tHr.C;@NJ[V E#9@`j;\~ 1nU>.2xqG>rZ 7YH#l4&B,t\@Iބ3I8$qTsh=p@\ӥas%O6oO vFԨU W"Qa+9+!W,1?`HOgf+N,T #- TVX=`Q 覬F@Qv6t>U4v*'ܗ!.YnіMhׇ.:Ȇ]D ȥUwk(, ^xz($PCǰh* L՘82UȂV@@1. IqIATגyzaD>;SU_;(ޟ*C|lef =&@ջAFM?CBQl&w[CglA @exb;#]3iZ4..OQNJtluIkO 8숰0gr-Jz{o-˙tHK}ڂo}8uziW,A~\"G@CG:`7l`n?g5Jm]a 9j{,8\LWEV9-0:DŽ)`5>yH冐Wx]HV|˦aq2 { b-ȷK@@)f+01Vv[Ple|B 9ZUA.HD(,D/W?ANPlQXNÌ]b0zEwtNSgH,??>pN4y9Px1-UImXF`P V?^. Š*t+DkVjӲ;rrgR{?9*V|vB嶃P9۲9x{GO6a;oa2bh;pEk)Ia2Va0#' s.αwB8O, 5ɱeVƅ5_)ز>  4Gіo@˪LdbuC5A}-X⅄g'|7zC{27 LuD${xD˒iʠĮo;׼C$!r/_st;v446\:umyS:[ x+/Ofxm'oƪ&T* l'Jf^_"2̵2wbP0m(眪`{Jj3l.#@j_:IdbFg|xaFưp!>dht$~9UR=׎RA[jN'Ϝy09.J؇xD\s-62+`T'%ɔD a_& :V`Ѫ\tuV^OxMyl<11w*_}$͜[,T#ք5K1NB.w'B{ѴDp0@ּɑI=gPelTos5u0OQ9pFDO@rrc.*]?`'0fqw4-`DIwA/ۤ,ꅆL}Sm`ޚ-3'DB&; ,y׋DNHr$5Lq'0!}.!"4Ky,!b+ړJI{j`(IŃ < @Az+x88_ ~,m뒜>čr3 'P$t+l[X4Mm%W}.=0mIP:@-궮폠HR ]-cfpMQ$,{ R};JX#?1u2;aUxFU̕z - 䒱{1cÆ8|_#@);H(@_*V& 9jg>aپxNn7ᵜ㡮 ^Q`|n>8_D,շ䘎/^&Pg&ǥ7q{qqУ4&.w1DrbLvJSvG_@eN`ȑW-\AaDy}4մ`轟Jgޓj@n$ǚiʸ7RRHct|HmD "}exrnpȕBrR"N‘Ib?©ıvuI)lX*v]YYY}*7 J*cvpB+3G4%K ĨԀ<>m=ف~C`Lh)$KspsmzFbՁgmml@7ƨN;P9H^.x,֓R5sz((fsLCݚZ!MOl3P:ޭ|F7JHP`Z|1tG~E^)r5'$a9BSo}4GWi9ӬP}͉O!tjN~Lm?U^ r)#;&2T58)0ؾNVhoܞJap[C+Fp_FT*N0G콓Q_ 0H7B):5Z2k|s|^"i.z%/oN1܏:(ȩW=cB Ql=R$ėrivh~~~7kF>lLA^DaP<:kk'O[L0Jm:Ҋ$(UM'` 4n֊^sF2A'LlXV,}-S-:*'QWAķOIި7Mz # s(R.Lj'8fKm3Y=e 3' ~m` ~iU~Tݻ;N@nShy{'yj =qD''V秐N]Ȧv __]L ,ҟvg'vy`j&Njϯ1&.ڧIpM@yg(f .f $2e]과9~$bT% <˹ 'hG8Jsis[D0N 5UӈXu?lZҊm_ ݴgvP Q.Yf6< j'z񝯯35sd\VHGx{H؞9x;J 3HHd7'wqW[']g")?Ķzys,mpW,wʚȧ:Gӯ6HVĿA_1lmTG1Ʃӻ*Gk3iv0}׾i1.H`^Iݔ:{40DQk])~PJk&uY}CSѕS #Vl/T7"yΞcwQUK;1U>jyfM !W7{;eȈ%J*fMXa.hT{Kw}/ޠ(oAk#x(R!Ҡua] ś\aB[>pd"H잩kI S)pϐ&+i6wj2ĄTKvM`ɵNtoXT)|l֫D*IsbRцIH(fU<Mg&&[/-uVBZXz7j+-,!%4+ I k:(VtFΙ8\4ᗯ*7h0b˛SUɩTH~"uY=ٜA^SEvr2p<,\`g{2)?1w3SmN Qƌl?gy3W 2:{}]TNeMj?Ow-`#MrY}X] 4$?CGLW D;w[н 1;9<24e//S]H ܗUs|DpY` jY.'ma f`T jmQwUcIHY 018elFODeg("C7>Ҩ, fP+}2Tz~f,"Xa*ʜm`h7@i:l9ml$ 8~@nDjsq[94rہbWz"讚m/A.en*N!@mgg1+{!}A=3VNu@6HX7FOl 8|>@|^6 *g$`iTW)֓i]c E@_NoR^E>ЃKR- e pPēڎ/1LkȮ$z5}/"pؓ8_6ѻ|N^sE= /П}N2|x)"$_&$aCLpg?esԳ0;2g^sNotߓ<3֍1D?,An|gV38Fpj*l]J YQ+`{=Zɢ+Q<7".h>z"i"9cF?B`rwE-~Fa(ʺ]蜦GK|~:vb-Ⱥ.REtk5OSj )$ϯ[c6iD1K^nsO?eVEC?Z+іN<;rhn$ьOq\qgUTȴDo:hdՁ+m_3{A:HHƻyԩXX٭#Ҹ\(1h#uX,W#K0N돠RYdwsNCdWJ-`bEhqFۜgKuJBkϲz;rja^i{#m5r >ۼ?L0vO^vv%kKq? "柦^6Q)WdZ.cX}/fkt2OH_\A>T( h*Ls .l7Ͱ㦥XХ±!xa0Wqy M0Vq^؄voo.ny)ҵ{%:kҡŨ=Q|z)󛱷q41>mz{3yN[sj5#}s꠲m{ʑKiKBD UK2aCՏDaoppڜՄYݔv먦ta q/Secv=HvhKZyb{ۥ8[NCw3=JR@YX GL_$p؍Cz$Sz㷶/>匈^9`$ J)KSIIWȏ=^^?SNC\}i'ObG\HCel'@9f}GL8Yҗ;C.7!և9u+ӏ̮VE #x)ymv1E ꡭ`c%kV#⳺4і1Q&3,ѣljpJy} سsĕjR§2X!/;*@Z̿;rTKLnNKm7AKX9 V[̾ꦊIgsAUB锅d˚-jRC +b Zl_1HY]SA!GM2T?պqRb:B[-c*װ~~֑*|´-..:?ؚD$sԦ</\&}|!%Nmz1 K쩕soKY reDHזXKbK֦i"vY4՛mբwra Тti b|B|Čmqȳ*/T-Y6sAQt;sh9T{ ǫRIoۊ#^d,Jz8Ç[<7]xo.1*dEgM%ZUv]V Aּnmc?ak7/j5= n#V7:w ~̹3+S:MXbZ*edɷhS*nQ9#Ҏӹ_?; T*W_hGKא_@q|Z8ӫ]Q"g<+ԳT Wg_`XQy؛5+5G:5R1w]]yxJEf2W~W킡&q?B1S;p9?7 x:_8vS#FT_ ؤnx*TXZfHB6j 5 [NH.`kܿH$[|`sab_~-pԕz.|]vx7 /dr# 3Ȓ5p 0`I5OX$Z @P m.ht:_D^j+`nhel|*~p-@-d&t#4Atö/;|'R•q=ru s!cULmit,5&@ʔ< C)i@1o\"sv4&n|33zQQ|W3QZǗ %`葛J +W#5lɎ9oϿOIt9e>(ѫOlP lIkpWMҀR4N:2߭5"Ҁ\mn A yJ , x-c0X.FSXqӃ>:q9bN-9L"x<fգ oZ"Rɠi׊ysBT_iss+ՓGa97 }%'H| nQtf "t=gо`T_^04O1Ƃ = P櫣QgVsU}xMBVte_-9V+Pv A@~/S>P'ҎO9M> +R!]Xh;eBջ&N,W p r\>. <2ۥ}FdQ,p-bj0qH+wEª {kMڜ]اX6$\O7x1/\i2z5ZWe"w`_ՙ7͡흍@Ʌ^t(ŶcPff6<>oW TG}^D`S_Nŵ|~g 6$ LMPvQU b5B^5_%G2818.j{)+ZG::MfH95zx#b@R|PLngۊ|)Ɵ'},/:;j]ld`7E=-!}@ @ލnrO_ dX'~Ƹ?ةдhQl5memR?%XXҢAR02/1vů{u7 m޿ ;TƲ$S$~dݣ9XT&B?YOEZO/ONA{^& 9~x:~ޏtUX'|sv45ahD?rG{[yI[?ugxˎ@ׄ (U+oXcK20R#J:qhc&L oTs6xt r$-&rpu-5|Stfocd^ج^]\r=??usNBN98Ύx plÒA;&5u3ӼK* b+@/U('S ڠW_&ƒ)08œ?kaT&ޡ#GhT3#f[fw]'Ǽ}S(J0 2T>ÚgQVs?5W gݞ$F3j@|epfiEY]s~YGpK<XڼwcR2{Bŏ*ĸq|h'%}ϟ[Xƌ#sq {)2\=\PVD^pk7?uK[FD*T>iJrlYcwT֕jlk~ߖŸ: E`&(o6MŎpH*}n+^f#NW'Ku}͗}fK1B(dx z]L*-Ofj] ozhZ()q(`.&ZuIM>o]l#g+5(e=CɒPh_E{K @.@M|v8&] 7Y*Dw<|v}f)Aeh,/E# T \KV{@Ȗ\9EnźDR\a/,g+;PCmt6~ڠ_`5^R9u4|E] Zb1 "G(Uiq ZBk1ǐŹ v[h}\/ysf=} C糖.1r,o2K1oᬥSӛN#(wRR $:ֵkJsޘ7nXV8IO//ڴ#b찟[UR3370kTaHW '6>TEx̉)0,@=`C8,SU`!A+g0q<, RQӴ+FWv ӊgݞoH.GUjzB[!׸ ~O @X޷8h@2-L*O{[ {Xzh eyS(n5sɬ4 {I !l s׾v]hvVt[:WrF KZ b$ߦjoBlo٦,Hz#EGW*ʥ78 VoTЭTP/ L5E.U՗Is;B a AٚMD<нdO`jTކE#y 0 }Z| 6!]S"`ɡS=*XFTYR%g5P ${0·&lǃ"ksCsvk]5h2e/dg]- 35-.|F…jP6sVSToB E91CH~"h5Dg,<F~kt }֊KOD[$HDT3~-4^[[8Sy'\AmL#eQy6Z] .8[?HʀsAFxAl!^n0ҖnM/0{e=A[V@P'Fëk[#Gej3{SP_R bny'7u\z̊ZgJiWF.r.d80ŚϺ 9\!1BΓ,vWHpm,79zޥ&xzxbnuq40čkt氕;BNLZfsvAEVx,x2v6Ϗ/c$9IF8Hp6i%{¯aZ:PjfpܟEYK kqJčHKxzM]lO"RgMmBH6LwO{zATME$l nMQ~}fq2.C%5PYKT*Itxި:OʉÅ=TzAノ+"!Jdyy%)IQ2b̬i S'?<8PJ'C+o4_""$>qcw_4,ۊ-')Ǜ$ P!X>'3J׹]1Ҙ^?쐙9BlПE1Z,E,q'%~pU1CDc@ǾZDQGҵ?V 1:acdsr;YTP!vڜUȦoݗ0nj:a^{Li!-/I[N "#JE3s!(<װ܈{Pmㄒ '-N+oSӽ 10O&IEOQӇ_P'X M8%/׻;wWDsT߶n/綧AZȃKDTSAAQփ]t,aHKf|Pq ^S(.S/7 6 pRN@oç,zj H䖁#x*)+}nF J.~&U q,qD \:WT?pW#K2M:M閍,n_|N '_X=A &91l9v|WNtI pIp@7_ScRK>&[. U$flX+Gh6/oQÇ䝲x ǟ.Gc9Au:;pt>t$a v㠻]ͪ:ƛ$G,M1mh4Cscjc c]!Kd10ϼ I9i.gVRHC)j知. F+vN$* ^a$-C7)853u)@ߏ"Lv:)Fue!i6[o t%=F]~3YQUA1$׵iN-^fxL]Y6<430#?,ӆiB4Ww!}"dw4ݼXЯELgÉ݌,AMP-0vrba ޫ`A mSpPyO)=BQ7˄eWA|AT;gEJ{?A !#M “\߄ $]tPnI_tVJaU;{3GeWU-&%Qi@6-S=n*q-2pVY/Щ)}%iB[@\kgz~'1.(CK2ǩuRm33Q&g~B>^'P)7pY,TUB(Fl\|Ѩ{1QGyN6tr(QP!J͆-u%"K IKw#.(J.2yRݥ{66l 0#H $Tlg ȀSJ^>sX̴AS&?QfbmWn"_<[唤HR|NŖo`luqM0~Ef@Uy)BXVo; Bb'L!_"a4-1C=&<u5M`,9q5 }cxQJI7R5rWa<p'vz g5?])ip/OiSwRү,!:7uDŽCyqmM#zUfh a4WkCI3|JkRqz5UH3h C0͎*X}sĴSq v%?bj ?| Bp>& Ȏ4H'2m?DD 'BB)G qPܵaNpx;M`v>Jx$+\囯7F'-.~e ?nϺHFl>W4h#lCAtč.h}ON*$LNjN+wfQi5 k\w AKfC&xx R&o5bKvA ob5BE8>w"kj`5yòlR 0T!eRb.S4sC'NwVy..gЭ/ÓIvH?vFEIv_؋! #xZ4h.pJmd4RH2oN6VD E:l'F 4lN_mtxwi?=T"v&[iw Pb\[SYaf1Q/:_i"w3#ӭZ.$,t$>s{{4ⴐ_ ł9;{]A}V_52yR-E"o7~KD{b) _ަ`$#nZ5 nh%8 amo GǽRG ֱ+!~16c^,Q59Lsg0M'IVҚh7 >P8 qzV ]E8arv[sZE|2E_זĴB1Wi?1ӢS|ҝȶ;фjl-IcXw@L@ԑ#=/=3٩|ji\S[ hbH4vs]1 ɳ@DX)Uv#@f*f;_{? &t9x{j8(ο40p1T/i{xxDO]IKY/ƛ97 6JBGuSȰL=.!LS0nЪ"woo$B/b_@ۮӷ5FYTg6tB2o@$n-ݢ k]uX/A81#J`PAFʇVICD "NUA/H;? zw!rAZ0${ՙogeRB_,|W(T=^˥:ʚ50B$Kà|D"y5iNސ_)ɔݱ:5!#I+7 @-dBCC-q44 PD!J|qQ2-NJhτ0nJdˊe7IJx9|Nv舶Y EHMmV2P;uѷ`XV#abèG[dX %X;кF0U_[e7 kzW/L SV U d.UKWGtGMMuepwㅴ;$ާ;q، er=l̜Mi5B30E T*D%NRF2ᤷjQI^?"0<=y8j|hxmg:Z@nZ2 'ևaꚫ#j'Auȸ9C/I%rm3"F{Ü{<#S5/Ԕ GފxŬJcg(Za(,N'SNiY0ԃ>DYД{jޚfsQ745m+ @['{c Hr~Eo%Ʌg=v,ȉbUXGrt!t]5k&grl ,qf Ü\3 >̡}$h;[tt_7ye;)C2d)!*hk|j)xzBmFc@~ZS2[' GB{M20:)xz7#o6y^Tu$!v,.>lS@#[rн2NHgPo80yXWDrUtM`\lel1<菞Rq͠kַv>+X?KT=Z'Ku}g D|H胰/N'LmF%ڌR&2#л7k#X$_9:|m /9(ݾIo9\ ِy):MVAXO)9VQ/Rn1~v =Vl"m-Qj  to= bLH=Q ay=ely'6{g}CKupE5w}F$*MA)5MBZ iye %/t܅7vb(:娲qQH]A|c>. $rb!)`qSuNl"֚;VinK*E5w<ɺE'ر[ * u 򥫡6Vr1s)YL9 ^ JX [{k@ &6Qw.garF|3z]|,@8Qi֒fGuH!Fuhp+xDu@ ,SGWAB\wPu5)IU]{br}π>Չ.FC9L*{,/XgD6Wg:L|ȟԁ(0MB.1|tu-lpC5w$)>]{ BurkXy5^{Srt _UH@!?jUIuqΫ`ןVkd;qF]Ab+va&~* j-< ?bVʟb!% ^c:l^l%X̆ @~I<$%ŻhnGVz X+)iBl5=\ggu>IT4XppݳZR.5̆8 ]ܧiFr"1cq>3[3c#Qi7fϡh1=xјcXS9 5Sa9sC/3my||"*BWoW,4ܟ׷xgA^ sլGaT4,ɜ'Z7&r%[b"ABga+j!Y= 0W+_wL'ld^LJ< ‚N!BHYDӅ_Nljj"3xwu{Hөݔ쌁^ύ9U 0&EJBP͗#G]Ȳ23>@#U(9mEI6D}Y!=S)F9YVT+~AiMV=-Ԓ@U|Ouo\; bB$&B '*Lh%Vs.tZ qۛŏ8 /4k&ђft,(o ; tIﳀbiWv|.}:!g; eA<_ xZ#^HO9&?hN#G@ξV(W&$˅*qա $ݡԁWpa۳/=# ^LbQO2aч 6¸dS b H A}K!?m !~=aO*|DӮ@q᳣m+5dPpZߕD|LuB3zb:~h:+|]oE\_j'65rմN+MpNۍhAmŠ3׍{!lךGM脕ܗӫVPtO8bX7C2"QlL<ՓgcugDDQꥇIj; /E庙7 XށјӁ x9oJ3Q0td.y'љqRcgOuP e Ƀ D[r,?xQC0ҦD xs_qҤh: ' {RL.ľl[G@6auU= Br)Lr mXrqM Q 5Qjdj3˙ VtJU RdjW/=h0pe~+~o - }kqoւo2 2@N0oi,ͯНL0;;[H.'GïrJDIr%7ZѾidpG/,tMv ueT1X)r#ГUhsC-T oLn݅#7Mޞ UryG4C!BMβV+ٕ g;􇐖 U=N"X$S^j+>I~f}TK6xLQC -v-{l0% ^Uzn8,` V]`gN Tw(c Rv@H :="QrI֍ƎT ;gzk<;G)$IlpJfVJl@<&60rn*+B!cO屵?X4.[רga'v)C^:S~ 3cW6S:wPu5 otvj.]?ނk孟'tLA[el-0$j2о{0fAh^bY5a7,fhOzPs8k<*M3NuQy/S-+ӭWbTrz|+ :溲U$`[[#% (Pj7}v[*4:zџOk(ĤScU >P 3"s)+'H)OBC7 8F;Zln*MT-y|2)( "J3@xɏfAҋ)p*;mU5.=D1LRA |J#hq' 2qE:ޑ="@&ؒ]`G)vwQ!ZGdz&/n)/`*[c/QZ*@d"xWq&Y:홸FĩcgW0'>+H,"oZiywbޭ%W rC;?n"D^2ęэg؊g1rsWosgS(DW/ޞJtsq&V`l n^Ǧ^7?XQT\f&+͍}S!@rĉvtV 7D]>WdȀhԖǮ &(fCݩ2KavY%wR>>L$7+~ ZA'=#j G$I[.Vaiy; pPIw @W' b/gM*It`",u$x1E||Z`3f5qʔ9T`*%; a(:^Pu%ܧ_֋D\8svqIuCNUL P v"d < )C|TE@X" 6< 쀙lޥiC 3~LcߢE,Q|>}G'Btfz6f}p|OV 9m ʝ7vޢ @BFicA .d_Қ|UwQ#Pn Ȓ熀 ݇[c@a dޛ&S.1Sԇ+ͼ93IjćS^)NFٹTw]}6$;<,UzLꈭqm4 dt'D64rnkA/ы+յW=Ҭ75u_Ԭ.,1|5̉ĽY;}a5)z{WvĨ!ߧUFHT(^Ts/HDEpA`u,CagJϟ?36x(+R8 ~ $dI&3/̫!Qy2 8SD˿ơ|"mflb!?ތAٍ19H㕢/oԌ4ǖu'PéblDm[#ٞ\. DJʰ#WJk_Yζ.ƁⶉLT>6o|$З2 n`{BBzA%-D3u+X]֋} denُ՜DCQN8(b{/)|YF[o+n;s (Naip!b"I,n2e5m*W(rEzkɘ`~4ƴ<ݵiKY^i, x5!AF솳Id*͛KStyS%{,"~2u6f v)U=nn9Iz07"$kJLǹ. \eAOܭgPt@ Ϊc7H*ݯ(?,S\SqtoͳM{5%׍F൮XiJ7 q/y }1;o72^gtLr'!K[؊H7J}'dG }-$ ӬK#kI_Nb/NKBϿ)E$zh9 kI+|# tjT,a’Jx<*s|0[iq'ϔ |ǹ)Y 'I|5 è> O7tpӯ#GF&Re(,3-M P-a`ϛ-Ӝ=Dfډ"Va"/h:/nZ Cd&LHI" 0XEѺgº)r;(op)lMoU8/߹E% Nc9%O"\nhonWYퟫ$A^JGHi-8"<,_ևc«HGvĚDQh_gcpJ}Vy-S@iJqzԌNN_8 %MRkE 1Q,#F.]In$QtPJ:I]aB9p0ɥЍ9T {?ET,!}|@@sE"cIJp[o8%UY QAtNP"_SMuer~Ik8󦴑^K^Hl?U \i.V<^7FjpbgO IyvC SI:]H:+' BmN{fxEQn\I]?ȩ(=x3X@ L`W,NHX)G!ٖMޏM/@ɸ}'/IcZ]PWd틃B$GaJ=7MB:q7Jy#8091o| }Q籀 4) fY`GNI!ι< a!ևyuMhԴeUWM-$5hx=l'=74\xQLQL @DɮZamsYl{ruF=f{8b ㏺R.XP#ekprIMӋ#Fdx2 .)NuZwt mKy%[o2yiKP֢Y, z]IUu4S)d]W3pɦt /i''_=K0?Օ ƂT+.)XLhlnybey;msÆRڛ^r?pHXݬ/{960߸adsd78Ia|"PtYws9e24X6sl7{B[[iF-n(f(XB6Ɂn.#Jm1q:VjDp)M%E!aO0` ;-ƣ9{}1@Hn-]%hFE CS)4 T2l5E֊M!N!O֏EJ[v@㷉 1P9vE^Odu]))O`P"NO>2kEQe08Z)#THx׭ҘƔBw~#$LkQ)8ΐoW;Ԃd1ש5-pcFa=%pD:Zcg%/t2kClޠA  #WAR,@Rv0{a,zD 3p,ND CL+8& ) WJPL^pG-kO@.N`ܩS8'pƌ VKT@ngx2R2 )<sE- hA[jmǐ'D9\А1H.C RHڑVklZ៚G9µi1P'se;l挋l/s-5C+g9sp+!f͗&іdCvcbpAlrj{wN@n~g`LJ2 4]٦#KnUₓǰC Sksi9x?DYc'"=V@ ɸ{@YXLqL娔[[),/ -Z 6{_GǘԙN&>T:e;#ٽ3&]"%v](-b=s6n/\m.qڈc%㔢x/ \;IS.]1K]`MAɚvF TlQolTBsνU::kj㵮7F]A,6I*zP7ߴ./}ivZX$D2X &N0#*aГNk0 <2$3k];wpQkQaA+O|K^|F۬ |Z'Ȭ+ F6SU;w(Nr3SgZ}$Q y dTg:C$JeD0e^/Bjxfl\Y5FX wf k M%hz/&o @[;&^,v/vE&&mtk#Mc;=eOap3v-ck8Xf4\2;Ž♆``M&RffěUg 8Ġ7ԁKs֔4C3 <@/}Z,Icח+/\c/=1[ֈNt{3@ΰ":PFp%0x?'l*.=abwD5@V`xk CuK /[7M4\civ!VLN A3ncCLTQyq 0LzqgDZQ1ufOKQ_*Ш.)u'lbcN92/Wθ;';ݩLHxbYM\ ޽ |*Gg2a1$oUA`AGH "8cvb^})4â0Mk -!d 5-퓍&&!O_ĜQqPK6*LMmf]xu9j`7W?lF?AR8JPqELT1tU;¶%;P!?>k#4jtuܷA"?,`( [jGRq'l7|mu&(bs>/cN/{o ޼PS"lI ۡ(,{͒tr<* j%қVg<-0=RṳOLq@0rR( B&ꌅ~cyQVHN4>N~QjzLBXP-T E.氜T3|rj$R3𐏢Eyt ''7ԥCGs~RcUG5:}NW&ޙܿFY6q`8"[%FÃUmSy@*n ") Շ,kհui6i ^~XY\M <8\'tTh ۯbb(ُ]9]ϭgA0qûkk :Y|EmRWx$į 6(XG4x6#u&TSEs0|hve5#8b`k?ߟ vYsY~ N'{ ){!9"‚M]rԓKi3ٴsS!떼A;.- i6\j:CyM,©_r5Ս54)/1G _3w;^zî*٘ qf )+x^nT'` P4OqTL7 ^1jSN6A cӎZ 6f^Z$p \6|Y!UY3D`7P&=C_C.XdȚGT]>$RB!6{="i};J,b>~3rnra_p+[ ty!; ޸tg?A{K`F?@RȈCgA!y۽a{˯}faURa-Q͖D{^:R*kN޶MJ@@TKU`3Տ2cA$ʬ~Ǡk*10Y(%7!~(L{~Y]y8 sJI$,LTofR-,0o[t–Imj*űHM[B߇^.pPߠ q4i=JEb>77`-졂|p 2!fN=/JS$dҪ,0k5I.1RmJ4ճ 7yLOrKް]-B;hiB|RFwT)#6cDlj=PTҠڣR-Oq5GUDr~Zl9C8iOkVWg/WcF"w %# Cٙ]X/C)U?m:%W UUG͐y[[t6v A$J=b? I)In%I¨7:`hI:bAyf q-K|Zt#@ݺ3 5]@Tn_vٕ!?@NsM!W)=cf0tAk*:iPIű"}H;I kA|kc# v '6ճ!Sa/Ne #ւ^D.=k=nC^l*k}ح^ cӰ Y0i-?a(?a/-δSD}վEsů$0;%;qE'W c"˯ƞ[enOED i^ ؇Maޡ5,DsnˍɌރjDm2!w2'p{9~ A #Mg7iyd75p(6TBB"9wOIb[ݞ5󭿒3L: ݦ9~r%9`YI{MI[Rr5?l;?t9&zweXnEoFgoȁBG1I|EB4\UhwA׈4G4̞<'pٍ8zK-F6 ${npS &|(Z\CtJD{Rt6ėo0vx~M\EdޓոN֕#O B@vG dI<r TqоĊ )ߏ.8YSt M>20du_PO[zϐŵ,LnW,Q5h|'9H_#5UDKZ!3y7 >p=R984 k\WWh\K}9eā5!HȉsZTYÑH/唆)ۥ0U@𱻌ب=?6k$XN%KbF^VV3W\G{!ԟLM.ULF\Zx(ǯU^g-菱pͼ}SBdʒb5ݘ  _6z d֝?IK\d^n! Ke\o6[a?ɣ;YaBeASU()4 0yVL>FBߞIB7*J~U? 7- !`o{w~HFiJ+6pYg-LL |t\AP/x.u{YoJ wJ#yϺL7%ϳBTp%̽z*.(Qn%$7,:ɹy؋  ˆncڽ̧I9r k#|2 maW U8%K{Ņ8٠Q xT1kvaw0U#1iˊ&b}7)v؊{<:^dBv釭 ^BmE,'E?/Xf$5P5G Y*j&uqɏ|"$4Xl0jamc _t F IajxWq(|r^_ ].P2AU}PZ2NGJ‘ڰ mƎ`>1(/-HKiKM [2^VH립<}?J$2+~pRS=(vهӓbQaQk׋; % ~,?KPm#\1QD0U?qe֥VaQiYS::`7pĉkmQ}jy̒{]Y8⃑zmef/25Qn(4}ٕ1 +@84Z^٠E6ҹg$ K<۳_vgnbtđ\W?-dq3$GQHiwF2bkIzZo S[ap]g@/E9%R{)2KFo?KlO GŸNqu2 9AcFVZ9Dtj2Lܢ*=[t?Xk (#8).P,-D!5o3i'0}=/ Q qF)#82oe򑒑xIт}#QÑh^ =jI |aPX[mr6#vbN-2NѨˍp!z=q-]KmqHï8XX6|%!q9%̷q(nj]y⠄GIg0<"uhܪc]kE}(xpE- c_}ҝyTKJ;% FԴxP_zSB2Ae3d`KR B@ݎFar<_obU`7l8Ъ6픽@@>kuRҒh)pcfO#W^b+WfHyLwçA^1,K+dP5c]Šn"|Z ,IJpLey6 _z~C{}%FV~R@fĊ3V &GXbUOH UXLHjk`Th,xҰmK۞/ux'{VMCG#n9=Yp~NU|tؽAwbj3eG(w]1܊E\uK!nK?/Œ7$(3&Ë+dI=kދ7#Xodajڹl>~*LזV<.w-B-0,MFhyѳXoܽQQ͠>3i]įnP,@xV|l >:zhHOvI.B ;9v u괶FK~فBzYDS"΅1jlAIEF{8 t;zhm#[MʭA .\ O;%X@\ܧnzBi.=E\}h8_a4koUM-zn I@05vgu:4Za#})C2M{FY=I1yA x3%0\ ?*'{~ɆBT0TڷM 58nD_kY!@CDwLXΨ EL5h.mGe! ! ֪݋U[QО"lwE&pZe^kaHiֱ&bi~ Ҥzo H&KIӽ߫*xg<_% mwÜiwo|~) mnUD x|u}CTPyH#{yHߛy|o dbxt_з-ƶlN0\`/lRa?j}ٖ7Pɶ MmqTg TP@drVihp;B' ,E5tW39 'M(*(_u~ɊAi`Nl$X|;6vD *i]=vXԙ7ƘsChWEckxGf\lY+|2w_)f> SU;wfk^gW'@(p>jb_t>S4嘳Vbh2 Syu?1:g.go.Z0)`29JCpñib28xrys7-V-SB&$"rKI3i23Q]"2GZ|~vjJU*B *N̂STT(a~C~EauIؼCU*3c.ʼnP o:!`YeLbݔK9,`+3֦kZ:ZG6`Sz>?^R4!b9"&@amr+W^m`i9 G@_!3s_`8;t *r$޾q O>*ETXykYR7'EϫYBvfQCI=0[ZUrOƮL]M[ N+~vކi n-؂ulM-: !vk;H"O Ca9zCyxU2#ybr_]T uKo4RbXP|̿X \b` Rq 1_ʓ䐩GGS(XM &_t $CM^ ]U[ҕ#L.OŔ8PnERhSu8.>QRd3?7.> M >;ׇ< B7L?O*眙IpwoFaa)Wn0\DEN1Dp;dڴqz{oV=cdM O)hb/UR0%L^8\çɔZçz^L7ӘJ2?fAǧ].XBcV|Adtf\U<*ǘO#m]?yM&'Aռ x,->wU?4(Ǹ#tG7Ll_6ROzޠQF4R4=* c8>u[}{GULfKgTr27\$ޏr#SgǹG]'zQlZ`/(lM'$ *7h[QXtIC-VW\7$x"twtP22"S„?HSǍɱ]jf8z. ǢIW[ lwW% [ΟT]ךGϽ{QX_E! |yf[ 2#Y|YPܨ)T\ҔưO2ҟ_&&Uܪnn6p&?(oI)3t25kHYPo_-o2&SѪ!j=]!U=jj1XCu֛/n>v =}+9*ΏyH]k%dCĤ$ihk8ABs2':Gͽ92וqڻQۆ!?/O.vSLmICVl=Ye}JʶjH@7{mB-X ٌfbJ$͡Lus<=(~A,챜.)≏=bx' dd sįin~ܰ~.'=(  }lRF;ːo5 ܤҺ1-UW n-"PF4! "Nv8Qf.@ ꖇ@ErXRU4al ;v@ R}Zg$9ȌB P_u(\8NneSNZ|o DisW<z]mz|ƣIQ -#VC b(8tlQI'Euu@aڛ4kGՋߑ @u;Mw)eg}D]ѕ?U67e&1"SXUiO3r@+v1|bO;t țWD?uưn,فmT9>XZZ/ :ьT7챔Pj¢-n UQxVN' %~Pfw1  =,r3 z?jӆW}ugM7YXs0W3Uۆ( eYDY-!x4di_uMF T(`ֺAcus $RR6V~7 ؤa5:m6L(.HݡZXi_'g^R9hYT$vi$>O m +NAFS`! O7.X>q"T' .THZSKTlaz ^_̋zPދK s/eM=%c572s{VDŽxt ~F/\s l}U@RQYx[SrbWh(At#X}ept NI0W5,Ax׀'ְHH$ʠ_88Dl{~n!yk@s/`A#RpvL~XI?҈+WO7-)< ԏ"tg)&""1pUA9 킈4vNHLT^#A #nbYᙓfrn;HMUT-(J(HѽPKn*女t)+ Q(xP2>!f}[FE]XVX D6wnfӞ 5 -TF\' axgRZxgiCoxn)h,#V)]1<KP"-U6u42Sfjv5.9@hFT`z jj0d$/>rXW`cp n0|Oez5 Z mhu@P 9 TQFtg J{ U4F[hC̡Tt\D`ujBF=‹TׇћsǛӒMh 3&@"kŐK[ c|O[M -uSZ=S#ª 6I2H f6MS״Tyb -Gn" |t\ɍ1g&Un91yJԏjd,PeoF),B &?d`qKr-7&.CwՅ_rFG#}Gt6nN1N:2e RAo/W,H5,N-P_w6Yоv"} JOˋ-߃ǘ#!bs) $;Keo3$al$)i?dG!xŤ採sQē;yXnCPˆ4ִ졉d@s@},^P[:r)jzK.W&j4ۯU=wC^ ޡGg:8+RTEr,088,:w;eM(E*?Em_~EoQhQ /y.b 溱bʥùxq5 #AL2c.+Yˡ08c2~iqꝇ)XߋNvE.@ʎu yK56c&?Nb+ٮI1 kvI7hztQ21(2 DvqO=Wm& ?q᷺]qwh|4u"IdP}VW=|4Դ,jYFk2,S/QƵ'[_ޟy<`p[MR~ ]h܍_I~Zn{HPS]HTi΅[q>ӵ~ob"Vc/B}'#{Dlw]hCbpCc7rc&] lgiUzy3 JQ9R_L6<?JSC$7jUς̙\y}A6bбEa6\\vMM(&=jl>6}TmۗG} @?I&x Y̻dҍ3$TdZ[sHg58h^}HYgzK'jw(g#g-gW$_~ ~]D8*L 'D*)Tͱ%LQ=3SCfռŗ (4 nn,~ XDrb  %$=PY"Y]L`|MU;KmCȔ8aDkfkQ*sV|c(A # cb"8Xofמ t5@zlK'EhC3(\ûlJ:a|$R̻X5sC0(I!u"D,PyF}eL!Й픇\$hYBez1c+7ΌYߎp@|[<#kg^P-ʔc'8!$%2JՃP,)Y-kBA3D Bmx(eyRv&Pw|v.^x͖'V:X ~AQ Օ_N3h}қti'v]N*<#=# }.c~[ϢCw,a "P"E/&1mQZ\TI[|t1?F`u7SstvT'imBխKU篘xadzӌ h'}G0ŗ.yzPoE8{[-򀎲V1Q/.nC5Ƥ%25=Z~œXV#F@̖ ZK*lp+fϐx Qfz ϥ{ g ԺOD^#/~q;.;=2QK?}z}Yۖ) O)ߓ P*y M-6ścʂWkBZŠx c $3\V#Ms'AQ-|59yqMFZpEhYI 9<`+V'>N4{R.nx,݃!\.OZ/ceTRuݦ@Aet~S]suEFAkj1.Ղad':wp[c;}?ae4I-#KhZ]ZRnSx|z12S;г ݲP\ם$ELr (Jy߇&fZIxYyqrmj)f|XoY2g[ٯ[YEceP%U(BMwFh}EsbjGA~|WR9Mu)Ҽ~89zCT՛)&F-WiH\$PdzqiGZh 8memT hن n-i%OӕӮD\e_,N렖K}Jus|ESD\S,4 yך"\,Ɓn06%/)HbTS+ŀY Mϟ (S;X)H7Yө;`9W[NX_M[`Y/RSFhT -\)&'fb'P߽etnxe:c<V KG@hx^xJq)Fz򇭕Ov{]s4QnV+m\Nv HR]=gS3P!]ڕNO3-j>Pi1l Ua33G)jh92i+-k 6nʌSJb[t~˥;9of ._YZ.m z!S{bd\<,"͌ԛ4֙(_p0&*N!4y,}|Еy"ŧkS f 54 pIdL5PtWN-VZ;#'uO!m-dfb3g&=kk(柴O%]y ts'8bfT_by2-}mBUaՋvY6XS\-'J1EMN>~"$VǛ"uw!6ЍEbm4[#a^V%eݐeꖖ7 wF( q45}AZch.vN..qvd߉s!ZyڦJW!`#D:%nӲa ] nb}Gz"e6n&)K%[P4hFlEr@k35:0 !CD#)^1 I%rR!0_ެZ\A; x0 UuNy2*x׻Dr bkf]4Rq\#da#o[1Er_R9[X8ĔѸt'b&WdiL#5w,:J:Mڨ)^C:YB%Ҝr0-=WND %Iˬ/G+Y<2t`>>‰8SV3> qsy}u}$AS4*H+Hۻ@'&R.ʼ!!xa.`0jP-0=D~L F'۬G7dqjNᑻS}-kӃL}Z]WN -~PuBr#jvD"hO1J-)f0uvؾ.AڰX"y\{:qx `exFU ]jѧd|ps׽Z16zwOy vqһ5z6OM) =PFh-s-+" z$_4tS Dl0r旲fՒZ̯`NWgT3;&( +"ƬPnAvBqi6O$ k!J/tGI =BƇݎ̡ |(E7^cy{j]SuIm poY'#<z,s(fYސ~>~hxWN66xqv+Bmx@d ]܌^B#BRj#I0BoA;٥]DTs!K屚DoGHp# Tʛ@>QgZA:!;'u_KنNd{&p+ݠn2I EZ?ϸ3Q},8ȨUzyAuBns Z޸Z^((v;;., [kd8+ M(*d6qţ #T%^/;1sX 7YڶSM;.0[ -@G< V*oI)ɶ2g1WO*x+q`4´ kxZm0kb'rM6Nu@(թW뙅X׆}[dhH _fm.Zb1m]!]`GC)Hc qg8{ L.A`aFpj;1k>N<,9t_$r=X̔*ɠL}lD/Vokxp[dǼO*ca$ #~d˭BN*.ٝ\&Q%P/?I:^{7jN.pQv%*Ȏ&?bуal+ yZ14Avlz&B ߔb$ճJbw Dt+{c!rjÙqjAv^ofҠZ d/|?M-(d'21w*9gt쒺$l7ȡOLoѤ33.NGd%|kޣr)8wQ3Smy<}fH SX=)+r5~n)f%؀Or=:g1y!H ZhAfAnD?\ТGGܓ'OO9q`@\.ÀI jӡ֛d78uoEH%=SQJ uFfxcSJEZwP=`>?t=2L[Ja,L桍-5#3v=Wp;/1N㇘/m HVN7ە1[EV3|{noj/ {6{,-Ӓ0t=_/uneRCN vh،bvdH;48!H_)mcG>ZR^G?Eitu-TL%}TZTVo>ryZCy{YdU)a6n û"Sok43ui+b>D]m똃}e3R4AdF cK-5D&x#;EOYs M>3tqHNepL|Q{UVB=Т; Xq#wT9a)RLb5p7P4P-6 o 1"7&U@>+s8*xu29.\trYިNd~I<-ǀUGyS*&*WF5VD @i|nϒ4%ğr/h.3l|eD@gbhk zK`j t?(FmRnuW_XDp^Ųld+CU}Xd|\!oH7}'e$z,wN^ ";g tOϡb},$r򝔡ͤ6I׼9h\ XJALsbz+c hŊ4T9[x{}q—X?xb8<,\inTۙ ע!W09 I8#؆ 8< ;"OC0qiDS47+Dήئo!O97#$qQla ø~l4d+SxK)K (pGALi8ɳU`,>V魥LM|<~ة }mObjvgJ@S'# =d_D9l'U@pp:*]Z}l={Ƒ -=+㩠۲{>Q<80FP$^󊶹l)/F?-߹.妘~1ZYjIkMQ~a.Y]v{Ĉ 9ј&qdAf/}F#)i:X \[ P0_xSndQWJB!jzWu YM!ڈ鋙yi~)eA24ExHvɹi}}9cJ䚷/Yi<,*z9}C+ t]O@vEe{B⎒4Favs%N%ť> TpdM_1I FiED I(sjFFvHYV$mtX-)k:,C}/݆=D쵥|f.,x\c*,sh+sOfjv^y9MZde~!~u U&QBȘ€?7D b *eC|B-j;s𥣼SƷ2n+S(;=5j_n(ⴓ_`O.6ߝti`GN \SvpK>#]H[ᐡ9NiP~B6$:ܷ̀ǐ:ηWLls h {Q7#@ [qhL+fx+Pd-o5,%x;#:"8"H;RSNHpj!h 09 똀gnAh(|{_l%wؔBՙSXLN zV{krŮOr|訃qͩ陥*;RV]2i{jbMU#I3$L$c3@ݏg#5h_j$! /\ sżG [ ʀmMusGmnsj}fDȴBKޑ5/z+Fhhp% XAl|'ng1_: )Q֨dd OMni  ?|R[8yΜ#%,W7.zޠ'3-G u|vrIC~kQɃfKo.OUWȲ(>WSeQ`v yrF_Q TpΤ@KݽKyݪ'zZox.!H usƽ JBh.#n(Sh2ڱ `Qs6mg8U?zYp*x]Mx~䡯KsyB?N{UWc.sr U7{G(*bvb]dsl96F(b(YGQ1eM}Y>bZ޻9|S[ 9 M@oc|w QWLvX"<ہhW>`y8A`p^a9ɺ&%*/C\M]8%.ek V>}X %VLuJ~1DdGnAZ݀l7|Lи8tGo;;]C!Z%R`7"B7 cYSQk[xg<­OMZa? }o>#f#Y:"rY7TԚpi 6L^m|OgnX}NhKT{Z0Zs"LL)7MSe^C)ң!N{D˹&q% ؀ORe=?;ݲ"u*3V]s]N-m3)ݘbY#i1*u䞾?p&ÙͥloeY;PfdF#XCafL- a2׷9 q"o)ru ];[lv;c?uCH)R5{8%BYSQgwэ&R,٩vg!wVsyL\mw!"|1jƏpgd,8t`Rgy"l~+eԩ{2~瓨>$bix{UdQ]}T %g#=B{!@dMa<uL34Ce͋REH!HZy}U%Ψ%8et}vN;?ǶNKPżRLM;X}zIED˄IVQ_b \xF5^=}JT^ӓh ͳ/||Syn'jHdw]='BP_ujԸs3IC+>DCG^'4UMx@tAuuMM6;>nwG4F%3 h1 Qq:4sNvzɎ}6zo#Bj i&b, Yj:V*X,V1{hzGً?r/A:Ͷè8e2E;x*к|$ÔJ٭fO'dAW%UXx 꺷-gNђuD,bUU a+G]+?: r2O\YZÃxgYW:)pU>.9-hEL;{jOsSO s l>9 $29 O4 ~&F*2[q.`qgQ7`O9&d{qǕ݇<6"B`|#=~`c~5oK npd-킚}Gת2C*,h2eB ;F I:{\!J?*zHmm]M(F@$B)Ģ 8WxS3 2f.iP^% |W5w'ܣ/p0|7Q<~vFelUh"|56L)YP!Nie>}Dk%'ǹ#·n>5%̢_3Lsg:T<%|he}6_ߝ_^'I Rs'zRV;iy|!{|98p'"Bkg.@Q[Z)6hSӅiFA0{ǘQd%1C` eˡhޟ:L<]|#JR%=67gūnhf 3{ $U*B̻ 5no#Fo`J; LPus9} {;*h>+n )Npq2L֢z!'Y]5˸JiQ+uhm"\<%~>mN~_ +{Xye(֫: ŹNhly"p*VrV,{{ԗVnah#H*9#>:g/V\]x#0| *6V 3ɳgؐYB8Iv#8늩>!KzuڬB| 77ݒaʦS]Bq7"mYqg}NT < _o h^Tٻqϡ2V-Li yO>?.m9zܤ_ԉ TS  *}Yj-}BVÛh©CDR ; VӷଐߜM'nTHNğڍ* kʤ $A$[t@m[LS/׊p8Xۛz8 Y3m:>g:>Ύ6d [Triuo$w&[elKCRP׮Bi+ks6}<+=ώpo_Fd3} 0.bO국VAcr<_: ^"2[TQ?#sw((QcJgD3SQ|%,qRA$&{\Wzh6yM #A:,k{De(6$Ŗy { -t9$ "|#[P|Щ}A >'/P)I}5L{g.^lN3ٶDP/O" 1\vOxFz1iW5~d.f3(]}4V|xS/_-[jc஛n,|ZOQ=$w}"DmkX'Hi(dIR4|jyD]se||[]iU3;JI ! n?Ă/|0 ׿L3轅^#isR "A0ۂ`O o,)BE`Ԥ@HVH|8ZV L|k5MLI\&\go%{\-nڦwoPtz붻>y85:ukgjOȯL'8zx~^|IX̿ bJB6JOkV 2N!#u<87b;~J`%q3fz(>o^!9˺U16e4{BIV$KCFs/q1%xo~PԌla|;V`H~݁dRbŪJQF JnK-0kpPlΕcSW.;M|(ӗMTV׀y`Rz-^ım[#a+[ֈu3е 3H_U4[ `EܰjS?ync4 x R¥m=1Ȣ /c_P1^ea2v1hL~Fɳ! Q *.h xSC ѪO;+ZIfWs=/tԲucԴh#gS{rel'݋;я8g,z҉J(D;MG}9V3ی>h6z?'[~E4иlLNH像$P7~^ kwR&TK滧A~!BF 2 P x=߶#mcK&x1V8 EP Ugw'Z I9 6A5K*i뫘-=;şz3v%^@Ƃ2N*P\roz|*:陕gGW vK Ăՠ. @XQسh*?P._,kM*)jvu٘B(i9/WfrJnAhIH;Z>:٥&JJpW$Q͈ЊX\ ?ZnԜtD NwaRQQ"퓾Я+ѨSR^W d2I[I^5+q.xB ,gc_jp<+Ӳ"Y&XH ­= e\,y$j(/E{ " MꇆvWId~^59 ٲt)noЀ^%Mtf\!Q"䙳]֪LÃǖz2~yxECؚy_`SPUj4P]ȳq>m&٧"},EKѱX|# 7* ՝s0yQ94;ʼ44b= +a$ 'tg|" CnuZ};pYGIDk/Ֆzfj- U41n5T(5D<\{c]\?]<* %#Gΰ4bNBUĘwl2mbi~e=Mq8:*S䩴|("W:DCZoopW {=E5&U)7*ZJ0^p8qtj履`4 YUMcZ*۔Y,f'rHuS5;%MW qQ 2vLcҴOTa |71G% 9}ˍ8=w-sujUZơmxH| jֶ@hnW;hňt;]MpjXi4JIWVnn<oǹI,")uD/c &^akӆʰۖrZqs<& nzch辸ඹ8>2.;UJ\mW xH'1䪒:s8iM6r>H!2OjTB)}Tq=A gmXMB#,־p$\p: kΓ(|Jǫ<$(ܹx2;:\|C=Y`Gчm|%XLq[( r?|c$l nYUWeBc-Gmv1x bcU'IIF)_cװRqF ^i~X$\geCȱ*ΉV\_ !D[ #p;rɧD}?{j2H=]q†k_[ITȬ\Y1$3hO؍P$Y Qdmɍs홌L0yF WQ?ղxx:嗷>ԧew:#꯽[2S4Q=+ يBH}̊5e"PpDX[ o‘LΨ9&c/!ԻPBelY \R\K\S1v ڿlAw=Th@tH`{5FM/_g{Zwx!ś(Β`_F>]6߹&A"eS%u .\I3./:v9=c0#!-`6#u8(޷Mѫ5*Y% @*~N^)D B_3xglgnY,Uv9jܺo0>oۼz$LSNCBz濹rM"8H/v_Ghabm%eghT83PfRs 'fd ƛik CVjJ7URX,ٍ д>HMKle`R3"0{9H&lk Hw%~g^o2Ӆ[Qa=gԢ4oK&+BZN\?*kes eR勍ʗ_xGdq{y9IB\R)[ZuV*O wCg:=H WgYXSKY-RGF-bs7r0 GiIG`.|tJ;'t>jw@ #bYH.AE i$m-;v 8Y(YLG[S^*'_'S$ ND_QU9>)xˏZf]6VzN)()-8,qz%L⼔]'(ZFyb(i|,P3M' Sݎ^gM$9FW&~$3Uüww)鹻0vL4ˁQpp_69xӣ]4zʋ ^N * e Z>Ȇ].=?+xC%] y|ajt`ꗴv53U6]Π'$=al =P:0)lh(g#l-TKt8 \N+Mr-4VHTߏj%D x:aءH ZB]jM.??ZwfU3H|hA6Gw~^H*9PNK,o籣1HʼnY{\-Gaտk[mV\L#huUL %iퟡ*vHOe`D70+H'KUH\vD/cǐܟFn!֭dP5+<>0gPݻ:7"wdPu Q&,kѦQK-o$+n'Uz(˦d2#?zj=œM5Vў!pjLTVȾq%UZKv@n:'ej F]bHؽȖQ _^Y %NnGs=EsN;&i2^|U;Cb5Av (pqK^mݦQ .=(wx6ښ0+us< 6wϐX^w_b#) Q\t^C"V(${rmodL &]ۧi烩z`o /{]úL&w.Z0Qc*a[>i9 ΞphH97e;@J#.A@ qDCIaGvp,Mc7 |snA@Kvg[F! J> VbݓQ2Y@(} #Ei@BQKZ*}t 3z( ؀)]t~S·QN˜U IPa7+#y'ޗ@db 6'*T±|OQ57oO6e0C:4@Fqcc]X%{5̫X 豀K>Wm+92럼|ZYXƉQځ5is~HXZ‹Ķş9zxC%*fXWP͙URBd% Y“t mgrLXy}I^^#Q{Zʦ% |6ԃwOwG&ڌ .TZ@p^66]Z!a3i0p+D;.X6۩lUj5K|xpA}SUY]3dt~|gZDr@ }R|KA%bI lh" leX^V(=rz.D#uJ/Yͮ?!6veWY̗Wtc jϴ?@_yj^v{:Pd4Q:#+z˶~,dES<$[2;- ^N𕎿 v>X gq8)psP aaoTojH0㟯P~a,ŖK `3[p60bO5vJL.aSМpAX"6$F69[=^k]A!|WѨie*r<^dziU3:<]*w*Qh2\1B/ۑh퐍fO4vW9צ 'oA{u5\\J?*A*zQ5CwFsCVaec|ǟyNL'PI1S1*߽pӉq]7r_<˶ϕ펪\4 V )9n-uDiP%ш\A/XY 6z<(q_D_hYD E$ ֦I#-AL+"1`LtǐȄF8lEJwe}Et(:4otM5^7u=ԙf0=M#*-#N־0xts6Nە#B:8T&eHB݋T E?%ۊb:d=P84nThN5\R$OoNnu+w>Ȃn(zh88(| nGlr OG2?Eì2|NdYP?ae֦)Ro=_%;nJЗ"ȈT:R3b MIf:4gsf(Wrp`І JAN)H˼ ;=Rcn}s[9eĦFCNj/R혁t қTaH5ٙk뼗՟ToLMfiS!9pJB8*6Uywuc}r N&Nb69rqol. $`XEH*FqRPcox|3ohPB|0aosc2 ' ǝ4ԻtՇ~SvMع5H9ŒV`kUW3dT1_̀;렲-;NT2\YHeI8 9Th8myv̦iҋ8//N',?! 32;^,~޽V`v%o:+>A\. j@&o÷VK9;V %tʅ81&r%R,0a_"|kn{C9Aq]:yvObG|NBKY%N]f3HuK_F99gPԧ}#lӽuv+zNOxǧ-Kꁠ*P}ֻ>)N{>'x[e(0%/m$9l i6 %:Ҳ?W![ X$Gֵ`2lLCbY;0I\|Q}ݐ˕JT,*|_X{g,:d3T N8T{ı`gd89]Nc8/12 cE5T%H61~PB*[ %IS!P/X=O4Kcs~|NJfʒcFK鍾 g? eG%Ѝ5$HYKu%%> 磻]/wy?.Q X#X=jJ7ܽ/4O-D[H  wѿEեzW XԔd2ԈU1Lg~@wAfl*`/ DʌR ۽jveVaS+Xύ壋vAkc9ED[4Vÿ[fMQ3^AJalHplj+~)P^LLbݢJ_44YG|tM#B?ܕgNqaO"K2zdht8هs8-#Uhy$[wX_|53ޔ=m ։0lJc_S)^Y/HC=yѳckH"jPN:>$kXȠ~-R||Yj:u Zcy2qc{>"Cr+Յ~PkKନJo6EjA5K2n\m'uA 8UpUPDmXk()x}~=ogIlL .~ԾQ:.A8@FOUtEݡ9spk9׾F)a?GGULe YD0"V-|!g#- 6{B"``RPnΠe%n ( KZiwTsBXB#L!)S1YՇ%Ԕ ,SV% hO?tfH]%WwyX@5tW3ֈԓJX{E)*Ry{z8Ad .?U|W(Ym&wGp÷Rz5AeԱ#t,DLnf :ytm}l4Pmq4{cO;T |m%bU:8]p]xy#pf_;^W}x,&+u$lǎ:zk\oVze1lHҟQB{6GVF<j{YIvAv75( ?MϴfﻊTZ8~>..YC^ǭ1`hoʖB}U5=f}=*i^^ Dܴ tM?FPa^{T,vej@Y 1hl_=ys}::wrԾA_\"T7< qcSY Πt+ͤwXNaonY/iuK% ̩ۡzSjPK&*ْq6G2rcKe( OV >I5jX0ཛOY Jz '|i^1;zb %AVV34{qCoƴD;UNSȞLbZ'r/XT?z:~_ 7J *:AT`#LH!Fp{Ք,~c1QqYEuKQ]?ajGaz6jW"0]e~mma.ق9zݩb.QߚVNEP{SO6OPI0:Zo41o.^SMJU ldl@ 1LX>ajKd}nvU6{d24%YUՏJ慗}2hjAM$k3si{+Ɛug TS:-7xLKlН_r_˯#BkI*;U.x{WsYOkx`,$|CK|ށM.ڇ[{ԭ[fv~nu8wKQl', 7D]$z}x!B-ۆ*PMt+l9נ+_:|[,mܦxlm^׍X.Tܻn+X?Xt|+rՓ`-*Zh2?'OqPw^ %VIq9tDM8ĚJ4u΁0|0рJ<_8Eڜ'-{l>}6A2R[ 5:QOϤnm'X^ QMSvݨbDMy*$>z0~7:'9qSP5׈q.mY!i` OF'Jp 0 O#ҲWI5o[po @egH_DU b-9ĉFg-Z,g{'i,N3H& P 419<~}FEҎ0G_QBնqo}u|N7Y"} j t⇮>:4\}`)lrTZփDf~@˲ ]#2 ,aѳz[e92ӀX^0@pfjHB"oCE:b]/wYq{*d/n4\uƈ #xu9RZSD^RdnOsݓ؁ 20ji.ab۝loO _GD)E񒝂_QI\E+ Kljs{!t:NWX-h⤺/d#-Rq˚( UQ ٣Nu1Uu0 #NRqz^oN4Jn.kuZHJ&x*A+(֥ʯ֋CG[S.P܇9xӴٳ-c7"q4'~j@/e8~}>(g& 7J@1P;ih9 9%1 >,\ GEPOQA_N\L`~ip7l`D(%JbV6h WŐ?_lͩԻ~mtR0{\X'` @@L bV:UR$7 r35m"#r4̝jUs.b"c4P,:H koCNbⳔbA JN.vijϻc": ES!UAUiXB?#Sɥ]jgVs~Ij,K&WbFvGAVe(3<҆)/8G @?t2xޠ'J+И"AS&\#"aQtHð wu @;MX(K4kܙ&0ӤKXd_3ag @UcqKI=HcˆRM\_}] 2Dr¤gHh>]齹&L- ~Q_&/(h2%HZL ]R1olmHC` $sImOF 5pn-- (; @_/zFߎ9Hd{h`Â} /{=PGXmתgCHN/5kwQmp7ӻ"r\O "3("j5%_HHx dn2gJRʫ++C/Zۙ b"f0'j؅W B!Ν}b©fqYRkk$o*guWVcׄGH:H}r˾(rKV4o9!pww̧ ,{ xPWZ؃7pg=+.2ŨV]͍Hq\^gӂB P6M\mrG$.$MF4Űԯ0O ؼ<{lcrG$a\ *5;<ʕ$?i]R{yTSsK'$7&n4Irv_Gk֣X)oQiVQ_{ nc!9v'Gjb痮IbhzS: =:_FYdlPBB]\h~V6Ad-'K_iQ#}[]h1eRɔڐx L*d s`{,2@=[Bu?fbHe<m߳ LGD6E4צ>l;ЖsAcR[-ߚ3mpIItW[u*!E!-ٿ23" a%QLaze(9&_Me!H8m$haryc6MH,%=AfCw"0 V@q#S社ZhI ԰Fr_ȓlR9&-vy n2`ߡW9z߂k@zƞ&wmiW|.#yvx TqocZ?٨{Ζ܍鈋F}8 r^:1NTe+DQ{g(fҷxTƅH¿ A0v+s _ݸAٝf_ Գ?ᅊ=vZ3\k1t7"=g__}t%Jiݞ"QV }VS0:N3I$/dUiQ'cK a("07ړ"߻*NJG"ɉa)yR/z^ I˿_xW+hyN$INg>ST(TTqĺz}5- (~fI1Ήg%{:N?U"h1yH/;"%۱~&.yW{g*l_yX5 ʷlsh%XNӖ*r6c̦kap)SvweCCPLE%#h{bVҦj6}%(pO9`5V&C--ELR1VR3dx?Kٍajɿ^jS! 7|b`:./r]IIo:q7lGL9Xs^46rJZI R g@ V7U}61:]]nȰ=iom qU{(cSЅE?9Jxֳ,p6]ଦ}\aV>!x;x&eʩs+=7%-HxDW`JHt{`93ZPR1V9RI™a%6Bjj}8"2ovmwRU&<<5;=N{nfОRF{'ןs0¬=I0^{׺dn84ꕨ ܦn v)q[)ǽ:(O JԨ13bQr*SD8lY}/1Rdy&оysW=!Ό/+zS: hNq R4$Тx݂{KU:Oº(UV셈}d:iØxMz. e:)/^iwgLqQ ,m^Q٩^oRKpVO|1} 3\=b:lk`t@gK(JMrym+.Zx%5.HT8y#GrI&c3oD@c`Sc!Z+rBjb;`+*oᰂRW:3&>m]Y_OGȢc=aEWVJau@ ;RuWT {cU=_I+zס4_C ԪoUϧ֪0, :e~wΔNRQIu[w-m+}S*m!D%QQ\p WE/}8k0슢ڹKf݌R.)^6R5gf)y#exmrE!RgT=_GZ?~1.i6+8U/5Pi{y!%zFHd[o9yLe$iv\ZhGth{~M%E7dq:%!?SaF3xU ĮfkΞ(nh.7GD!]bxVTMNq g>g9ٕ{u'ڜh,r3}fwI.IU N+\"(|& Kw|8a,1 EhCbiD?I]?#U2{/; qJinf e](.hl΂n8w^AAt/ eƈ_ͣEޢKg٬DɅ;0,X> e0n~s(Ob5(tOlP jni+jR<-1&%vn &}eu Ծ$p[#OZ>ilГwQJi[!w%A#8(Yz}4If)*Yҵt<_RΖso@0AXVG1-ꋩqv{28 @Wį9hՇF;*1ZWp>sq|[rT$Ϙ`NL3bC!87.MꞬIJKKm xJR@;(a"8Cx7^E\/#ltFGkRnRʗ_i^ B#TG72|W FBnkp2O ({N=meϹޤ‹OQ/F:';`$yG t<߱!b8z^RެlӔ{@ 3D3(. w]sG2dFҪ1`3gy+_tVF+=Kl~ǘRyCRn?|7 Xޑ1<<ܰCuhC1È6fkyI3*EG4{.s_L˺U'aZ>RB!i5_ˆ"}בуg.Co? >^4JĄbt,q'2YJǧ'd${n'ȂEP_,\-sۿf"A+.Ze%|U2`)! l1"9gz|bYPl]ɬ MK೤vIEGJej`ev2'ʮJY&J< R,_me1wW!S/ߛ]nS 87 -QGQbLzͻ&{(|`A6BV\Zp/:|蝁570]23$u(`ISSjH\HwZ^{&f!̚D<g-IRЙot.]F;Ԏ^ + Ȉ8b%^H%UNt#׷X媑{EhVZH;:5PPӧ\c&<-|>85UNEDiBMQ6FPcؼTD6M^?ܩ&uOh%OT7|Ǻ8$1qIzYpx%ؐEk*@ŻQp@ӹIUmI6F>Rj+AQSO in͗Q3ٮ5!|EJdĪs$QKS ֛̰|1;#mm5])4P1,Dҹ#ϖ=V[# kGW5ZF1ҁڃyC'LθФfs]T]Sr4ʉ4**Dطn7vĭ~s3\z/'e NMh(0.9EH۔qR"M)H Z'RX'`. uFS !!YkZës-޼ثk` -SMB/뿤YiulD 'J8Q Sp[&v^"u =ks?+HjdFcz{fx[q.:4ws&`5\٠ҮWJYd$w%E:*(V&sNk/LKftbClg05B2?W}xׯVM4fU#S3)cMxz. X+ 3> ŦeGŊ\.-HG32{" 2f)A6)(4U_wV8zO+ \tׄR)iw7T)F҇W@ζɪj 4" oC;L1(˪ixmHوLK?-)9&E5d`)\] T}4,d*xD6cWO1GY؊\ΓPv"C.+o5&5$xdwBFP&5/n.櫀e5 B1Zo5One|qN¥ 8Yk7U_ M>rVF9t*~OK'R2g><:F;De+Crl ?ڟ[fҲ"+T-) ,ۘŇTk ~4޾]%XUHެ'-n`l}qRJ4^K6٨X˔$BH+c $S 0ܤf%Ol~i߳AњUfa#Np+YWpBz2Cf]f2"J+nrmn I<(HnP>2o1M&m+ˏ,Âzq)[)c)+{4:c0|zP |t?<#n~ˌ>I )6)T Z}AD7METX\ח0/'B1B`Sj֪wPB@_-5w:*$:[im曼m'-f{|oCAg(PGsKK,IsC Ѹ`j5ˋ8 O he3`dzxxgbXL4~RstZD+}QB+vo(7B}w*`ht ȉkpRL$ k$AZz|E9ܖZ1gT\a*L;CIdpgXSӂo "yz7 a0a4{yDj1~A0dyN@`a<:ɎP!?{()3I^\jbbnasTD4zߟQKs]&xrxHfB;gUs'$ݩ)N*I;] ;1X.%9hiЖhܜ{6:/[m1TQ7BȎN\N"چۀfc6p2v3O4_Lm膠]4y9P ZeӮI\hE]HtNz'M #9O6ou)'תDUKL$%ěԗ8Sf~Z3[؝ 8Ģ0O'UW̵svv-BEWD&{ `!F,ĆMcBv7FRZm$Q_ɡ]{8*"]D &8zYa_zh!ÇK 0~ [f/C6ˎ= >==,+Xe jb#ThvhƞcwlN`sFƍS0#;8O N&=HŰkr _ x# #_­ ofP\ex"%IvHM2b_[+M: #x6&x/:>ziҚTeUo~Tq]1v?mx<1{I* (iġ;r<<t˭F97{my}_ۇx{?g;B11/ BɟCW,{_?[/٭%:0;I)/(@9tERj`mK`9"#1bJǠv ii2>tJv-d O0A͆UBI\w~Z >2s5ݻ6:?g}*D/gR KuR\sHʦˊG(G'bX5յ$3HU/*_Uyɫć~:.LjD&!4g_(qdտ]5w 4D|T=\A]7!NnˑD A]~=̘.@2B ggWrs`rͅ_V=:Ac.'e/Vk>_QsKVkWi X^d5FW" XOm.^j1>i>?A=$*@:]iin@VWbQrZTZ眇;S:\;wxǸ[/%#vxD{AY#.Vq]>b`z?$k`XPb|ud/ɸD+AK\)|Ic"R;e3Ēe2lh0-a[hj=ٲ`Rɋ4VeIMn\H&/ځglk!2(:2韁p3 U+^>"kd=ޖzTCN:d,qpzMh&&9*rN@FcW\_E&:0ҙrj0cfL\w keԒ#ȥNbZBJEs슕_CYƦISH 9< dPVIlތvAed¨[d~[;LeFco#Y;&9.5D9ZC;@؆hh ( cP6@V-J)0g=B6ݦ.o,p_31c"^%)% jhJN9q+C+xtR܉ [|*N)h C^|tX3ٓ=$_ɓ$ f?FQKV{yݓ.>jokhޚx̘E5Ձ1pֆ`G7]d$;x0~` ҍ b4|Y${Oq^q`-=e P%FWZ@% ) HS>7ŝw%L๢P.3E^7貺\EuqYŜa4"Ԁ3"=>u/ a0.aYܠr>uv{hcHyTVxA1nsgJėlVW8ޙ aYe*4R$",,ݦ -ORHꢩݖKBV降ޭ~Pk+~xYA4s~!׹= 2s!Q D6 h5[Rcq4d{zk= ReޒTfL 3'<8եs澑E [Bk37a BJYSٞI{ hGΟ{.6ۛͧ!e˫-͕Y fhI%wnöԂ38$k‚&ǞK { vwOۼ"<ˊEv)Q^0UӱT !?=/Om5Pr*̈́h`:ܨtCQ8w5&` ?NO:-Y8tS?[Х9UrhX)1:)W)/"\NXb-'QDflu*pн wp%}S}!9vYoXle%/hcc%55.m(~اu*ׁsCT(~4*jFSa',Cg`vUlL{+E4&nX5:݉J9֍`~R/[&Me`A2v_:/%f,ԦG&S!/ j]דw:T@KղP! 3yy)U77H{׍o8NB{<_pݧJiF f0ĀN'8: or t񪾦dU_նȓLSr yr)"\bL4:=GH%9lw\mH"Ďd hv0xf4&APhs$S5[oDvU0,@\<@?vVoF =ו2Ϸ~wnɻcCe%""'om<RhaPY(v '|IMY\8KX$[k~ Iik,w$$̀SoxpM鍽 gONz%8͊Pm BXH(7y9髼^̤_fGKǐɔmLlkK=jl̏˿ rIߞEo;zF;h7E4èn} [E>Cl&vEb1#E~=(b dP1n>gꩂq;U*>I0{0 `QNHW#9ȢK>ia%I/K6Vu `6%Vxh"C]ަ*IGȥ > `. 5)=RGzn*ZY'r]ls9 Nٻ+1Kѐ WFM۹=lmg:Ր B9ք5J[aR$54>ph|8]!&of~d ˸P(.XlV8Pm]x jnn]Dbϛ_j`&S_a-Pp,u J\E9cKVcݺ7Uݼ C6nq*܅ȩ]Er~wbIp']{ w'Ԏ,lĔVG/z}"m4豳zFX~U/7;0نtaIdzy}KC2g-@4Tަ伌f֯>χa֝KQ ڪFo ^ r-b֝Н˥:dc  v3՟ElBfχlĩj:Og07eMyvBbRa}Gkp9,E.4= CD /oԅlߤ"rv9DˏA4fm A/(i?5`F}d:vL>͐pϟ#@ˮơ[?&)Gj[`sG `.$" &%/n=2֎^;6X)Dxh H y޹ e` G?uR "cXMǟ{:1r1%7 CC/񌖪⭪v{n +U/ 4g!oG7G'?w tIr7hyԧEx*. 4-~]2]~2k, 6r_*vU~0C!Sx !83iX'WYwOo#q<#_"54.MvSCo5ePrŜ=r8rrD5 lí',[6zW֍+u솽J6Ԕ@#;ؑK7X5YkN(Ҏ}FgKΏE@wku M>=FԹg|`ӥ5;AH;k&v7[㷭r dWLj`^M}p;-X^?[)Kuc+\".9&ms-`PtleEJ/Ɨ}V jenu| ӵ5PS oɲڻ+8v-:Ng}CM sn2M~.)Nm އ~{ (v ~.ywpX6d?eBUIOCC-,k1$ ھ J4} SlVFqHw}YvVx3 sk+4q7 s\d=;I/=u|k%͵2URuջ!]?`HC\-f9r:,<@(3|T)u9C~!lDŽщ/݊JۋڕT*gtlp׉im7r|ئH,ib8l(+]6[8pgee2PFz`A" i J|f 1_ p,nJpn7,.X]Gv,,2tyvugV#3ẙ*/J:B$/@37L阍v/z$UFߣJxԗ<ǁJDڄ7F.P68XWS:0|?-P _ r~B{Jy]CwBqj w &xk_Zô۵hąxݱ9A-=UɸTYiYzڣurqǹ#ʐfOs'bpݬM脟SH"fN@iؕ X=B?,YJX")2TF9{XU5frW -LBy l8:X e᱌2g6-i6t~&>XskJ *^i/#hđVA˴Fz^<*HMt Y[ J?gp=}Z(h:6)b5Yp6rtm`"RY[h>%oV5 ERt?eǐSC5y`;g6P *)T'_f(yH <rR`Z?\Jt6ߓDkcv7F"BrB^K2OؘM˒KLǩ?ulq$Ix`ø.̖D.HgJrLe`X@^fͣ|͓J]fh%%'֠]$sD+ [{/t%Mjpt"XCNnS'¿PAl"5[=,OA\6Fc/4R0:bQ>U0G <|v! =>]mdȝ g<$~J ]w,Bd˦f̜V~ VPe9!2v`pёcEfkc=K&Çs.%5O3|^錄VGndƫgQ> m*XHK}Nld1m5OL:4Z=NZXfk蕁іPSn<78B:V_FdzEwXG1tuQqsPHFi0zv[cul(`;Xg%W4 կf#WZ%/UΉwb.|A^T|5Dhƙ(V"hTZ9 TR2*Y;z8N刱{T1Q.́tX)/t ]'MtHXȭԯ0"ˬ=U䣾dKhs`UOQxX(K>l`'~4j/4ɜ^Urf9V¿_y" vXل|rȁKdg4c5bj[jO_'|Z#)[>z3^ӿ`_UZ26˙;> 4@cY涛.;մ_<ZH,OGX8OIDj`pjKIJY]#+tu36(KxiPBkT& []UEy~vޘZ5~d37FH\КmpV]T\FRxDYx޼ 'W&u_B9ATm !Kel(酑װ\Qc'5:IP 1_"fW~q |%C>txyo%-UYw i[ )AP6.Sp8:0€7ku{)|w LJ ; "}DD?Hsa4bn3^_8dFIE,s!Ch_ uÇ(lL3!ƢFo'#~T΅IevAʓ72x$ӛ*Bi,ЁtÚB7Nt ~;x13҇YrϬd"/K(X orCC# Suh2\,z^p+5-,=/h@T{DC$P"6o sI |G Ů癚7d?,X0Aĺ^LXDUdt7S~'D ЛSqZz\=ʈ.ܪY֠R,lͦR&ܟQߵ2L0ٵf¶3ȹ<!r[4U? " N/~S!3^`϶TobN,:)O%?L'6.2tVsW\ ;-`0o;OYqH/%**oD-&Lg) D0oD#lcӨ q'Xq.V"*s>< YNRpv@|3ds6SyKb~Ww`gs%w⾙Pl@nx-N܂K` ;jO&rxWzɌ;=!(9db[,_Ϩx.kfQ_`G ,Ȍ?e#P顃ݸ8#G+̨*s~723stt8$OۛunM<Ǒa6|oj_fUuh443̈{T34t{qv$J=hׁo@&7۬P8E=֍mFb.Q&NF8^iIAܻw~kkJέEkKNUw1 &jlzYrM|3-=ߦ[2Gոg;UQoѨ +hdpqIh|Ķ􀽿Eu7G³WsEhރcqi֐zYs_s\W@Fp`D@H"U!M]:a%iiD7ъd& &a>:5$O .Uk}PBaWaed KC&qdVjwa,K؄Zp!+ \ 9ޯF$1{Q)h߀UgRu/4ak74&E'"Bi=_HJ$ _$3sY.O ] T"P3P* 6ݯImyWQ`dC\Q qO>z)᪽+z;9l@ qkU̸:ivq Ûo_MHP@R#7lB*)!Qɰd; ϗp׍A^PdxO-.}l.O^=Ȑ{Lob&je o%Y9QYKId+Vt@*k'م5fq>tMDnۺsx}Bn3bW`97ټbuLYv]KI+>;R{B_nO0rd>#Pu>rBCjρR2|.;}rkIx K-P.^¾t.,Iti[{L]$#;UW@5n_?4 [mR+')*D][*{ܜ'9G-IV"׃K{RNlCtѼor8q}~-k9ii֥VoUqx dg 6 <,C/ca4KӧMw {[#[ҁm)\E$x]XB1:sE?w08n:.N4s$pf 7`>bk4^ 5s<P.G[Y:nb,iҁIy\߭h'Zi=$F3UD#i2%:SUPSP:0!h*}4>OΖ$æUF>4V Di(9"KZaBJ#VZ eC:Ä|%YVOpoH506 꽭tѕFYl^3#gt+qjI[Y;fWk.{)N?j 5;CgG$²#Mc أ.?\=.+%腣:Bf)0o`Z]?ʿYS#Gj(R81Ő:И=u~7K+9yd [~o{QHpx)qoSFlf<}!HH,W BHoGt _`2lJ$lqmYQn/12Z˝ E DHgvcܘ^Lci"93]8kkݚ(ŗQEI( # Jj0_v^{K(".^.-_|++7?=p7 s24*rs^m|2 "׎kv]4QK<'ƒ_GN6dtufV8TlYz$ըF`C=4qK䱠= ZX캙G'ՉٌYO"m>;ѥzU%'\M8ǂ-ZxoF$jgQ ~&W9.ciF0T&SXG\stoKW|O> 0/79TbI^&(UC>hjAg*e%MU1)2j"LЏVtϱn}\*pו= U^H4$ؒeT߮u Gh՛[k Ե'@s@!#ф6zL|/'3x)8MW DLK"^,9E$qB,J,PL;0Yk@"u0UobCL%&ү):$eZaY*?ӷ/N>t{ɉipnJ+g8K>oF.eHQ9Ah˶414(VQd;f<8e1 e`Ffͷ0UtWc_w_`6{ peέ`ԪѠFOFЛgu[N"Urq"CXZDOg0]o1QyqW%SqNbV:{mؙtXkf(xc7?biܛ{k^ iA9BOo\:?/n1>6=$ʊcڪ[:iD""]Ʉp}r,p!Ltu%EF M|BlUK1<#8kt~-GtKJ6NO,?];ǎB X(يNԏ'܋=|lovrV Vx L&73FzOnQ:! "qƻ5ڝF {-%gsh\(gm+,{OI?*^^my 8kET敨लzPXo`wIR=9q\;2f}.ܡ҄rLwW d+gȵlNHՕ,l6N N"hi;?F`}nʠwTxct =gT2\=21Pئ Ԯ &S^'HU [ӁhuzuWG#Ж2\ԑnP)p(~T&AgzzEB ՠUueZdžw139;%wU-$,|<w#\ƒШ<+b\ T4{9,Q|?3 E QHtRu.`ԟ/aY# 5?z 0R) 8ueucJ19$ ƹHۛivUuFk"M}a9q@x_Q|㕲X쎉%^Lc.9-sg8pv2SBQ#%`C͡}23`meݚ\r 9lm ɩ%?߭D+<}~ykR ,pާhVls[gu:ly̒y5dv:98^ \t24zl_7F7T'L/oKe ICݕ{ӁKAh.v!y=\2A.4VѷѼQZkSqusv[:k筋'HرqhY?A88f[#N8ȩaԔd4@&Ag4*Z.SwgPOۿﰴ!jd:28bi!hNM"!_J4@z"2lI!=!6Iqo !uS/òbj*[*0ݶ={3W`wR (Wf7Yu)UЩ|x;%{^2*c?4,A?Q2ZSdp{=X[?L}Ft[UarTIкmq` ^`-21yO`ɒ4hoaR~h鍯@a!^J^)y j~1oPưbB:Y"ӣ$Jun [T[GC0n-2:*;L y;jo٭F)}^U1Qy}E @Q 7Mih"l8Ď7JH_4% K<2ª /@2KO\jZ )F_4lb86lK׉YMsgJeXt Ej?CqC6y8<w_?? )oqorʏv=Q;i>,^ɣBԁm#Dʿ`פ- fX1͙TTXC8B2hVŽCl`tlYtrH։aZwhP b=_)}f0 U#qVdzx#JOm^+җsK X(#. !Ϊȉi$2MoZ|>SI~bWWgoL-2E#'7 |);pLz yu8X(db{$*i%BZ}Z0c@TὟ* iz$: *o.]sf6omU9\Y E,[t T66pWdStZNJ.1&PtpEjӄNFs3X*&W!Xd-1ahkʌo0m|㓀Qi<8i1={p dE}igUtEϡ#ﵹ)Q 4":m۽E%飅-Z] ~lzhnT =>~ū%g'2Ø K;/2󮿀o:ZcUGAG2˟w o<Na=b6 aLZDmWYłx^/N̽J*fUu@.9UpA r}I*Đ˞:"|/d\z9vdz+J|K8Wqwٶ-@v&5n*;1[n#Z ,4 堐A~| 8z6{\*Iz\VaBX(;aݧR?VZ`WxH6$cdY]5?coJq"0A ڳ :G(2g H{XOh'MuTC7J"r`4gub!fKNi=븚 s& .uH> ߔ x)"=m9TD;#j=i"DdJ>[!~_ ڛ2T:nBбl\ s.6WBQXR Ѐv{"<@4n >ɞ-tѪ􍉦4x$: $O˱R9>k'J."(f֪ă"C*~ ͳd/|F_ !nM%lKn[Lk:BO шBuWJ c>M%9EXӋ+9d;7>j2Stݳ8I x(^1/p(7FweeQpC7׷fku;KOi}E=jIs<"7TɄ"Dݬ"$Ŏ:}S^n[St?8v,RY{A/:XD+ N'{IJF|E;F9dzj%)e Sw £^o|3cl^FAJi  XvǜBz:QfJaNw㏱|r۸4ʢwJNeQziypqp04b+aoJ1?u_åe8\+<:iQtJ yPa5$Ρ #&'}.T͉㛨l^W\nahX?oK .iVH@mHJ7, %nV⃕a2 `:mkE^R8)5s>9/> "-*](4T)u\qjj&X˅:ؔ6Ya&/=YQ>.ghΚwYQŸbsLQu| I  _rJ~āvḐ/ |$|G+ 6 Z8wjk iW=M!gfU 11zxA>3m7(ЅI¿P*Nj$$Gc:4 Z-SOkU-[Z*Eb  *R`}? Վ䷃VmN˙_].W 6Ăi}0gqՎ\~Dq.T7J`SyM,**mL}rm2v>D qnqάVK%`%Ώ:+C\N,Cэ~g%:&_ASҁݛW$-=~oL()#,Pa淫zռ]?T]۷=8vؽr=/#AStO>*T7߹=hNÐj ўo?r3}bvT'-\OÊFS慏O)Wmk+M#D&Lw]2@^,l]I+G;17Rf94 D"5BH2Lm+gѪ2uDF:k5ژ&jIlЌ+*AdYmͿnME\C4"k9#+ -[?!BsR%_O:rEi_O/^8]iyHPs{./W?Y$7LPe(GZtOΫ`-:$?"KT9;djOǁϩ`Eqi\uCrǁ{1Бg}d]NV;Za,WJ$=c e {CVOs\x0^F|mZmQ;Iʊ™|cg~@MX\/rm{>4 N*%+vxz<Щ1oWd2s}_ǏhhZ/r>1l 9`;"Vijg@?< ~4sRL=b!BJ6 k0#8Kh߮_~Kƌ#EoSeL>EMNOA$z9a9CVj<~EN[D WKj "i0ћ%mLYEȉ3;Lg^(@r[cC:m?$ʬOikI<,ȈyOPc:ʝPjP)/SggZpj r]N{BhjMP;gUײKs„r(7kTsae^Q(Z3V7 _6PЀvfELGWPզ|ՙ/Ŵ?cE! NMuwh<EJZʾ‘xtGk;c߄Lک3dk"z˓ *6ד`lV{۱ku%O,W2v ^y9{PYyܮghbMȇ`s GqcbcŮ?G7"ƀfbM 7ѭ`% ҧw]DWG3#-(\Ctл4g@chۦsVlnQDQ_ /e|A_0.dGI7_E>>|j(b`|ejc&2"hlE)ͣ2s_L>V3g/؂Uljepp ud59g(d :-gBƭ4_(Go(SAi$hIM@&3c1-$yǪ*t!v%z!rV}@I*sg g"[.юjkj'hƐ¤ ҉9M̝* kL=oE#,,qT1MD jgݨsZ\59<=Cn0e}C>dӕ*GV:xS$y i2i(i,%#6]H[QӍ5 ۹垒SvGor3X'&itڈJ뺸] b!Ǭ'T2k OkF*UVFEBB? NY+`b-nvJu:,j~;k\Xm2G2к+Lɒ\r-Ղ2IvDMz ̩5$|*IԸ@sZ\iϊ' lFp`AfmX=TNhi7fHecP:CT$O)P.^rm_%/2UR }$G܃i×~9nh+x̰!7EWlo䧕XHb FUP!'O/@) wR+ z~H%*3_UakNО9]`\xjG+@"¾ v3 YeJ7ڙxajk0 0 GW.o7Ӑ~Zmc^F.5On؏ȦEu俳 GrXӿ>ałW##]ΰj)*\FR߭@4y,W>Ą`29Prz _ĮfZGJ`zJMT?[j+Q"2 OVi ++a-=R6\WZ>}g2\v4gkx?;n8?gjr kҨ< @a(NN+,MRNI4gƿF_ (FN@,ּxh߼dMÀ3QSE6U$!Mڄ AB.y/Uhf),! uOBIi7H6X(o~睟UF} 2< afnT\ yi ߺ=~.T'rX4lӾ'9S\eO;s_mz 0|=%=Hך% l`U~_X^ ꐜ`2t{8S`IovJVwA̙#xS\e:`hK.gΧͧH^jp'x)R>7YAhU&SdGNj;_`YDS̠~olԓB]@g맊M`MݪIe5-Fyt:]26%zg+B<{o$c$g[I\N|"HQ|4(Zlhu]0u@H}uI FWc$OFU{6ƘitbkJBF4ٚ/IYyDI3 gEF\`ħւ`#LFzHW=aUiFtNm[q, I,?DG*ˉd[@݌% +qum=DM[yѪ`TPC +k0dtl6{^㹞"xC#z=M{x`|8)C~yн<}NK{$s 'qu"f~Jp,vA@|h E1WG $C;Lm4Wc򂍚o⊎QCڦ?eE:3,Nh\u!p4f׽W:v {OMʢj:tD}5΄5L\5&x۲gWaE<)8UvBh#L8v$+V[T X%f,RQRG&';ua.F aޛ+O]HN~6o^Pia") ~>(B ; Qn0ov=о2L vƶk[5& 0vľ/JڪdLNr+6k383/utq;E .O3`V,-4ujZwLMrԳ,/;  h1n0E?&"cύ pŒfQh0דžzZ5swٛ7t# b7_V 4ZRIW1%kK. \k@h",L;{2+<&U W41N,|ؕ?kkN bޝGm%'{3=y?|G 0 hocqN>.Kjr}7,k@`v ATUe~q X k|H(Z5oKyJX B9"hQ"+n.fe´%"aowި!D+BL(ߣFE{! nP <1-@K_/QO$iCF dڕЖ uk-Jubсrd,m/z]GFfh2XDH9n*1zgj:g_ptW=8GfbgIC sl+tHɻe E1V{[N  F-XՆDwjef#!mP70«}UX o&. [M(xV["<@<Ťrz9'nH ۆCt?|l|;ٝᦝ2m}yZ`ܖAȂTP'v[mF@T4b߶ Iiq:3::+-˜DbY: DOG-`t;UGǁ@559SZ Y>ݾ =宛0rIdE,VS}ĕ]=45Hs oO+ǣS+/?NR}ZB{@^CȈ\&ףK0L9bԢ9Ȳru)x>|NM?p%@Wϗc}8 IX%qtL=„ EYx`I!9uYG6t]-~+3{ZmJT,R*ƚ^u B@&͑Ww8׻iX\S;D."UvOSGfί+^Ap h&MY|yVNu!#v;kvsC;t>a4`rNؾ \/Sr+LJ)4l"189nuCx|wW$2Agv>8ڙ_ kkH޷?gn|>d!{Ch@Oi qa_*W+<)ke԰,-Uy'u4fWߘ!#"8Cj3?WxF$i%w05 Z6g`ħLw%5Ġ[Q G,AP=`Pe)M` J?$A5uʬ;wxQsky2z_BD"mH%wE"mkBRMEށ(" 5x P^Jg'}n߳΃lu˓ɐsmԈ$LeC8/X ьQ3<;-K:%D@%O疀>ČSPKv蜃%l}J[VQ>4X^oGID;$Ϫ4@ 'fb*9a[sap:<Nr=@R͖Q],|ȿ~kX ^I4 g(|m (_qOZ{iv~J{תՆSAc?;v͢.w jy)b!(Ȋ 0wpjo-My̧wnhz3.;[n\Mّ_>0E")Yqp/%21_Es.:Ev"ӐmkYn)I4oYwU#!+HN`+OE G_,5JfЇJXt!ƾ`x{&vE  eWl:rt !wT.pIDW+{'F-&x0UYxᔱ*//\{{}:}.Ʈxr(-|: gnS gVN#Qq+EZ: j*U^$_SvlU+) ZzoV׷$\:E J,HbAxF>qjU䝭r`s21 kKgL_w=ˆ_S@q9֭|חf樲T/%ʱV }}@C潷a U:mn{92P Al|~R|%ei8 &>\" G]V/fzv[2B`/$6̫*B-Hs0#K6G7a Tf߭JVINy4*C&A]"dnIJSX,҇kq:FXx?kPan}m 'Jys">|`hkrq9 )!xfR84d5NI(-BPG ҩ&iOS63ǾtPO N`EW'U/۬K퍜̴LJ%?.cRQ|B$]qClpX 3W2|thT$ t&b}WPYw+q<ݽE~I=mIɘC8uuԌΝ&ޥU+M=(&$ᛉgfA_W@̘:~ f{9W`o 3u1u}_2G&k%HG5>Y^r=̙7\3HOltqf u8t38#{2Ϊq{Kb Sc Or.@pd 9܎ 3t(/4 l"ݺh`2ǤXxˮN^݅{A|lt+_鐲\lQ]uW|[^¥WG4dh X<"†"u$}j)(97:;Ɣ* ꧛K`i&=dG>я Rlr. 6'~Ž5 >/Bu%*,Z( zQ@i1?]ICV!ZܻZI6nXܱBk2XSpVbӀ>oY{Dn,]nDN[Q kY`C|qJaҗ(; JYa(KjWnQ'QoiCl)OIW;s>x}I7,Isul>fF,~]. ̴Apb';>M05O0~.ny![D!RͤnRM-9Cm>^\MbTx1^6+m(5# ė?݅\SKrFh_;TT)C[a@Ղ(mоoɧ)3g -tcC|heu 8#PL3·;S4CPCbU, o$cvXuڤR~| D !wr(fZtۜ&ء)NZq%p85&.q|ӠJGiSMY5QU_]MR6ʞ6OX_ooXx@g~XqSaG13h*4-N /Ӊz ?h xpm$E֟j48 =9v?ѿ42Ox(8[ov\R`O4Y^(yyū$WkBC x=T(V3_Xu@YسyE5t31gl# )Iv&k"SjE0 rҲj)i=&Y>DO5 n$;q;L|?Fq~7^Jb;zkF,d!hP Rr{tT|L4$\kF* fOHF\b ߺ pL ɀWk81mRYc@v]ʜ (Go$*!E5=/[(ps@)`mUw,ygb]`z !)ь>b: (س16M'Ҟ4{K5 ܘw7B6?6|;bC0(s@mmUxňDKh 1;7sW2csCC.ʐFQyFT1#(1*?OLdsO?-en-9_ȱOVfu?MI;odG/:̥AٹOokT{be?o8_P"ct9&\/ { PZ?pUWCqS)9:*Х]] g7xBԸ }q<6+n4RJ%t6.̂`媏K@M:DQ0ڲGRQGy&NBIa.萸Kʪ\;gK۷ȵ@{:/dAj?Z ϮPPJu'I2tg*T%`:{*J~w|Mo]2jމ<=>ZzYÿQT~(޻Fa ү(~"IBr@5U6ФFI$Y_AU W;Z2-~}EY:P XVpXX@RS{]g!j`5tv/?"@Y$_XX~x }~[l*Ziw54[.3׷j{ɏTSⅥݿCN~ڵ"m8Iľc!U-0jMRA.['ig\1ybQ>U<2__|;0_%f R*1!}"h)m=9Pb:}4<IM>:r]V'wh⏂jY7{=v|S}$2>Z:ee%o'Б`v![߱Nt::ĸKU7X'tNٗq4 kCa6rhqޔ8Pf(*CL\U𮚭itgTҀ*h"L>ì["بLux N/]F4>iIk\}cGD$'͇h$7ud2>md(Z=9D_6my(\^?Ķ.#YoB]^q^FW Y_?7Jt\)fk\]b{iLXs1Z0֊\]SM}8 oN* =~E%9Yۃu(mky\ DyjllrX˃+HF[qJ'?f!J)-MT`6Hn4Q Q[PO"+~z QZʰM>z0C ;rq:A9["*ԃ>&|-"\ߪk]Jb_F{8VDvdڎ70=H*oi-"TJbb7W6\-8ջ1ߖ.ZP6 zv'+SabX:JUP ;"sQ``.&- M $=͸HbHOA*K|z@ڕ tyG;N$/U>S rPGFKe{kNNBOeԆv/q2`g,28. f5amko%b,Қk* ~K#hC"Ȅw0F"YPfߕaCc:9W/" BOGvfa=eD}v7Kĝjx/u; 6B5}Y'ŃԸΙB@jL@<I&vs_('ix gt S7~ *W~pۘI +(^3jgU e8_;U w&{<;A9YcN|~B|0gL˺9_QzUfu}3Lt]2ZH!zwkCVrb |[5N{TRܑL$0G]60-׎Vlskt *H1A47q V1u!ǹFƖ).CPڤ);u IsdQSnA /G>2b~>Gaf>튷vX<ytRڗ[7GB'f^~NCA/l0?(j6XڻB% U4ˬq<E_)]> ҭJofy3yusy-CƘ̪=t :ioh|W7<+uey囔x{tsI^$dp~BN7&Ulg볈ǎKETt}xc]~HޅILi"yI<8]vQ,S%snbN71 Qz. ;=E#ϻrs3~g1Ȧ4˷бt{-j oS/K+l>]ʺٹؗ. V`Ry?L?>ZVEbNzceG Yb^rd;(#Gñ(@(5Ptz?'J|baߓQ BeQjVYi$4adkFx*ȓO_W(cn { H$ ԟ4~߉.EhC)y]9 &BW*鈮%91? m1γb8L;]mGS~mh^An~!%iaΖ#C=4S/Br# 'dk/@-'Q)'L tKRET16?g@mjzvҁR}i -˓SqJD@I.HZZ}@"=#~T*‚ocAs[ \L(Hy8}e27Zj]Bqu]2oHɺS=38Kw""+q>ύq3C~ϝ3AǽגN&kZ UZkGMB&hd3lqDRǜoqg[Y}䵙H`_"`d3tEH̨փo=g0·[9qD0)Lo&(fA1Lv3=% c9zfQ^kJs< K'=/(PivZoȢF.sgDvx%D\k [e9'sD/P^ 3ְ!=XB] w -,,ӈݱzy23 ~Ek&QR:HL{:M;ʖ*!^T&(:)zղG' !PC N+wCd@<L'л vmSLmbĈVU=[y5q* Xݑ[]<yC25EęHl#[բuD?Dh<3[JH73l`P@^M&Hx4].ܒ=6'#*}LH<=@ #2%6<@n9="y,-CG**] dOhg=' *!k#& h,5Yaґ*#s{ XLhPsNH9MLQQ{cSf`|n[poȘVВNaG{N&ќ[h9@+4.k\x*bT:w`s#Q3q<\A5MƬ>#hd&ZGZ,v6n@t(1G- wOZ@ 9vAJ-ӤSiPb AI֋?C CW qV):pS@o wGəKJ,ljv)@Qk# y 3Eg4'\݅=Am  KWBXv΀ `aZaV+TSZnJ[KȪ:xae)+ai*9˘wN7?~ș UF^ʚ T'?=綴=zm={7494W>R~Bah-Ag놟OM0A:`h-I'ԮS1/ϑ֓8%H2؏L|JIGxd2S0%84WɚW^Y1wizNxǮ* x`?2;ۛLdPruP]s.W)͠f4*Zs<ٮM#]]$7A#|7LpkqW2HH=y)l="Vk{}?{׋WKZ+ԣsB ]{|P 3v {sɶDBE-{W3nʮ-eҍLp P;Lq-=j\5ٱXrH,ڀ|KхLvH}-˫]愮u=W(5U fHDGUQw+~X٬"(5ng+%t,+RŚXl M5,S^@M+)0|%Oܺ~dFjy>%=Sh eAv=PQea +VrT͞C) 2J;]r6W2Ugoml2t1儗/:YAu12wVa?JaE^QNdExt+#G`Ֆ\`B2\Gf W*tH$nP`9Oַ+o!G~"_ѬXwV|胶P!1kXqLONT q yAmuSy%al a=n`J-}4BtWplK>u`p,Aں5eWhB̟RеI2(ܲ﷡} y(~6'>eө%z}'$uuOFH,dk6ȀѦQw۴xfNIN đA7uOR9q[bYPVR㋻Z/;_!7E dv77V8~jkT䣥v'h?,8x++m`\f𒆌<%jYãgB> FIoA[I{t-МJpZ^$@UA M6kn8"įzޤ_hN%̗pyf'S:VPܣK綀~ ;#XNCװu^&{]BpV+u$0Yǯ&n8t 7煉Ft%fS^3/vpԯqg5VoTEnOtq [S^Ț%&Lʝ4WdRU6s)$Xh%7C^rḠ]%$?|zMN0+A1{ [R35)gCY֜G$O: "_ 6o{Yuفw! ccm9erBG:+d63qM:̷RBI$EVP`׺ j$麛_ULVܐӞ<2|=uSel:.=%?{Gͽ $]xNU_o YBR !3jz։ Z7hicSsё_,W8=ͳ7(lȁmk9;0͉^HI9Ū0MΊApwMuA}Px?qZ~ϣ> eީ.P+#SjGIOOh!OBy`OcwJbs7B6tnɅ/sb1EUv|J*cR+0pP=%lQlCAO6LPr?-4E*L"۞P)6(I[joPzTQ)t} lf%9m(\c%C+F$:7.tb'ؿ$[4Q )ܢ"L`=/@N>uT P챥UTh?ţ=H=AژߪY t}S4?&4 HHt,[,1k|"8WW z|.&]L[2YZX6l,SI|,T5`ģ;JD,‹TUR"j/cp,j8S+nדNfꭷDUm/+6iJDrlq5s{Z ?Z V8(lBli r%O`BIx%dCs)֔B`VzX= tZm|Ʋ?X)cfJT6wPAei ؐy Y>{{2-d=ytqϴ ,^;Et8a;Uh`Iy,Wba i#V.?٠ktIXaqd0*a皞LFl2z*E U\߼_r~FG*$ϵ?Π;0EsKc\]D( 3*sFrܢd%{_if LhgٰNSKKc=X  T4AM\q c&K"0$Ȃ:谷q j^?E]MHb 7HA] J&r%z7*wZ?I(OE[nJW(Q|I #Rb}7soj'>nP>װAJBg]?6wABBP@C3H # ލ`!. 8y,G].BYv*^/BxGmܧO4C0KűsF%I\]_"h-MHӽo Ԟ8m?[%;h/ދ쀗ޯaYxDPs,LY This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to (a) mention the fashion in which this software was used in the Methods section; (b) mention the algorithm in the References section. The appropriate citation is: Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuss, editors, Experimental Methods for the Analysis of Optimization Algorithms, pages 209–222. Springer, Berlin, Germany, 2010. doi: 10.1007/978-3-642-02538-9_9 Moreover, as a personal note, I would appreciate it if you would email with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. You can obtain a copy of the GNU General Public License at http://www.gnu.org/licenses/gpl.html or writing to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. eaf/inst/scripts/eafdiff/eafdiff.pl0000755000176200001440000004262414660712334016777 0ustar liggesusers#!/usr/bin/perl -w #--------------------------------------------------------------------- # # eafdiff.pl $Revision: 252 $ # #--------------------------------------------------------------------- # # Copyright (c) 2007-2014 # Manuel Lopez-Ibanez # LaTeX: Manuel L{\'o}pez-Ib{\'a}{\~n}ez # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You can obtain a copy of the GNU General Public License at # http://www.gnu.org/licenses/gpl.html or writing to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA # #--------------------------------------------------------------------- # # IMPORTANT NOTE: Please be aware that the fact that this program is # released as Free Software does not excuse you from scientific # propriety, which obligates you to give appropriate credit! If you # write a scientific paper describing research that made substantive # use of this program, it is your obligation as a scientist to (a) # mention the fashion in which this software was used in the Methods # section; (b) mention the algorithm in the References section. The # appropriate citation is: # # Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. # Exploratory Analysis of Stochastic Local Search Algorithms in # Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, # L. Paquete, and M. Preuss, editors, Experimental Methods for the # Analysis of Optimization Algorithms, pages 209–222. Springer, # Berlin, Germany, 2010. # doi: 10.1007/978-3-642-02538-9_9 # # Moreover, as a personal note, I would appreciate it if you would # email with citations of papers # referencing this work so I can mention them to my funding agent and # tenure committee. # #--------------------------------------------------------------------- # # Literature: # # [1] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid # population-based algorithms for the bi-objective quadratic # assignment problem. Journal of Mathematical Modelling and # Algorithms, 5(1):111-137, April 2006. # # [2] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid # population-based algorithms for the bi-objective quadratic # assignment problem. Journal of Mathematical Modelling and # Algorithms, 5(1):111-137, April 2006. # #--------------------------------------------------------------------- # # TODO: # # * Fail if any subcommand fails. # #--------------------------------------------------------------------- use strict; use warnings FATAL => 'all'; use diagnostics; use File::Basename; use Getopt::Long qw(:config pass_through); use File::Temp qw/ tempfile /; my $copyright = ' Copyright (C) 2007-2017 Manuel Lopez-Ibanez This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. '; my $progname = basename($0); my $version = ' $Revision: 252 $ '; my $Rexe = "R"; my $ps2epsfilter = undef; $ps2epsfilter = "ps2eps"; ## Comment this out if you do not want ps2eps. my $eps2png = "convert"; # this is only required if --png is given my $pdf2png = "convert"; requiredprog($Rexe); # Old default #my $colors = '"#FFFFFF", "#BFBFBF","#808080","#404040","#000000"'; my $colors = '"#808080","#000000"'; my $intervals = 5; my $compress_flag = 0; my $flag_xmaximise = 0; my $flag_ymaximise = 0; my $flag_fulleaf = 0; my $flag_area; my $flag_eps = 0; my $flag_crop = (which_program("pdfcrop") ne "pdfcrop"); my $jpeg_flag = 0; my $flag_png = 0; my $flag_verbose = 0; my $flag_attsurfs = 1; my $filter = ""; my $legendpos; my $xlim = "NULL"; my $ylim = "NULL"; my $label_left; my $label_right; my $label_obj1 = "objective 1"; my $label_obj2 = "objective 2"; my $output_file; my $output_dir = ""; my $overwrite = 1; my $scale = 1; &usage(1) if (@ARGV == 0); ## Format commandline. my $commandline = &format_commandline (); GetOptions ('eps' => \$flag_eps, 'png' => \$flag_png, 'crop' => \$flag_crop, 'attsurfs!' => \$flag_attsurfs, 'output|o=s' => \$output_file, 'output-dir=s' => \$output_dir, 'obj1:s' => \$label_obj1, 'obj2:s' => \$label_obj2, 'scale=f' => \$scale, 'points' => sub { $flag_area = 0; }, 'colors=s' => \$colors, 'intervals=i' => \$intervals, 'full' => sub { $flag_fulleaf = 1; $flag_area = 1 unless (defined($flag_area)); }, 'verbose|v!' => \$flag_verbose, ## Silently accept these options for backwards compatibility. 'area' => \$flag_area,, 'save-temps' => \$flag_verbose); requiredprog($ps2epsfilter) if ($flag_eps); requiredprog($eps2png) if ($flag_png and $flag_eps); requiredprog($pdf2png) if ($flag_png and not $flag_eps); requiredprog("pdfcrop") if ($flag_crop and not $flag_eps); sub usage { my $exitcode = shift; print<<"EOF"; $progname: version $version $copyright Usage: $progname FILE1 FILE2 Create a plot of the differences between the EAFs of FILE1 and FILE2. -h, --help print this summary and exit --version print version number and exit -v, --verbose increase verbosity and keep intermediate files --full plot the full EAF instead of the differences --points plot points instead of areas --left=STRING label for left plot --right=STRING label for right plot --obj1=STRING label for objective 1 (x-axis) --obj2=STRING label for objective 2 (y-axis) (labels can be R expressions, e.g., --obj1="expression(pi)") --legendpos=none|{top,bottom}{left,right} no legend or position of the legend --xlim=REAL,REAL limits of x-axis --ylim=REAL,REAL limits of y-axis --maximise handle a maximisation problem --xmaximise maximise first objective --ymaximise maximise second objective --[no]attsurfs do not add attainment surfaces to the plot --scale REAL scale the plot so fonts become larger --colors=STRING,STRING colors for 50\% and 100\% difference (default: '"#808080","#000000"') --intervals=INT number of intervals (default: 5) -o --output=FILE output file -z --gzip compress the output file (adds gz extension) --png generate also png file from the eps output (requires ImageMagick) --eps generate EPS file (default is PDF) EOF exit $exitcode; } my @files = (); ## Handle parameters while (@ARGV) { my $argv = shift @ARGV; if ($argv =~ /^--left=/ or $argv =~ /^--left$/) { $label_left = &get_arg ($argv); } elsif ($argv =~ /^--right=/ or $argv =~ /^--right$/) { $label_right = &get_arg ($argv); } elsif ($argv =~ /^--legendpos=/ or $argv =~ /^--legendpos$/) { my $arg = &get_arg ($argv); $legendpos = "$arg" if ($arg); } elsif ($argv =~ /^--xlim=/ or $argv =~ /^--xlim$/) { my $arg = &get_arg ($argv); $xlim = "c($arg)" if ($arg); } elsif ($argv =~ /^--ylim=/ or $argv =~ /^--ylim$/) { my $arg = &get_arg ($argv); $ylim = "c($arg)" if ($arg); } elsif ($argv =~ /--maxim/) { $flag_xmaximise = 1; $flag_ymaximise = 1; } elsif ($argv =~ /--xmax/) { $flag_xmaximise = 1; } elsif ($argv =~ /--ymax/) { $flag_ymaximise = 1; } elsif ($argv =~ /^-z$/ or $argv =~ /^--gzip$/) { requiredprog ("gzip"); $compress_flag = 1; } ## The remainder options are standard. elsif ($argv =~ /^--help/ or $argv =~ /^-h/) { &usage(0); } elsif ($argv =~ /^--version/) { print "$progname: version $version\n"; print $copyright; exit (0); } elsif ($argv =~ /^--/ or $argv =~ /^-/) { print "$progname: unknown option $argv\n"; &usage(1); } else { push (@files, $argv); } } unless (@files == 2) { print "$progname: you must specify two input files.\n"; print "$progname: try '$progname --help' for more information.\n"; exit 1; } my $file1 = $files[0]; die "$progname: error: cannot read $file1\n" unless (-r $file1); my $file2 = $files[1]; die "$progname: error: cannot read $file2\n" unless (-r $file2); $output_dir .= "/" if ($output_dir and not($output_dir =~ m|/$|)); my $outsuffix = ($flag_eps) ? ".eps" : ".pdf"; unless (defined($output_file) and $output_file) { $output_file = $output_dir . basename($file1)."-".basename($file2); $output_file = (($flag_fulleaf) ? "${output_file}_full$outsuffix" : "${output_file}$outsuffix"); } if ($output_file !~ m/$outsuffix$/) { $output_file =~ s/(\.pdf|\.eps|\.ps|\.png)?$/$outsuffix/; } die "$progname: error: $output_file already exists.\n" if (-e $output_file and not $overwrite); $filter = "|$ps2epsfilter -s b0 -q -l -B -O -P > " if ($flag_eps and defined($ps2epsfilter) and -x $ps2epsfilter); unless (defined($legendpos)) { $legendpos = ($flag_fulleaf) ? "bottomleft" : "topright"; } $label_left = basename($file1) unless (defined($label_left) and $label_left); $label_right= basename($file2) unless (defined($label_right) and $label_right); $flag_area = 1 unless (defined($flag_area)); $label_left = parse_expression ($label_left); $label_right = parse_expression ($label_right); $label_obj1 = parse_expression ($label_obj1); $label_obj2 = parse_expression ($label_obj2); #print "$progname: generating plot $output_file ...\n"; my $Rfile = "$$.R"; open(R, ">$Rfile") or die "$progname: error: can't open $Rfile: $!\n"; print R <<"EOFR"; #!/usr/bin/r --vanilla # # R script to plot the differences # # This script is executable if you have littler installed. [*] # [*] http://code.google.com/p/littler/ # # Input: # label1 = label for first plot # label2 = label for second plot # output_file = filename for output plot # legendpos = location of the legend or "" for no legend. # # Created by $commandline # # $version # library(eaf) col <- c("#FFFFFF", $colors) intervals <- $intervals filter <- "$filter" file.left <- "$file1" file.right <- "$file2" title.left <- $label_left title.right <- $label_right output.file <- "$output_file" legend.pos <- "$legendpos" maximise <- c(${flag_xmaximise}, ${flag_ymaximise}) xlab <- $label_obj1 ylab <- $label_obj2 Xlim <- $xlim Ylim <- $ylim full.eaf <- as.logical(${flag_fulleaf}) eaf.type <- ifelse(${flag_area}, "area", "point") flag.eps <- as.logical(${flag_eps}) flag.attsurfs <- as.logical(${flag_attsurfs}) scale <- $scale EOFR print R <<'EOFR'; data.left <- read_datasets (file.left) data.right <- read_datasets (file.right) xlim <- range(data.left[,1], data.right[,1]) ylim <- range(data.left[,2], data.right[,2]) cat(sprintf("xlim = c(%s, %s)\n", xlim[1], xlim[2])) cat(sprintf("ylim = c(%s, %s)\n", ylim[1], ylim[2])) if (!is.null(Xlim)) xlim <- Xlim if (!is.null(Ylim)) ylim <- Ylim output.title <- output.file output.file <- paste(filter, output.file, sep="") if (flag.eps) { postscript(output.file, title = output.title, paper = "special", horizontal=F, onefile=F, width = 9 / scale, height = 6 / scale, family = "Helvetica") } else { pdf(output.file, title = output.title, width = 9 / scale, height = 6 / scale, family = "Helvetica") } eafdiffplot (data.left, data.right, col = col, intervals = intervals, full.eaf = full.eaf, type = eaf.type, legend.pos = legend.pos, title.left = title.left, title.right = title.right, cex = 1.0, cex.lab = 1.1, cex.axis = 1.0, xlim = xlim, ylim = ylim, xlab = xlab, ylab = ylab, maximise = maximise, percentiles = if(flag.attsurfs) 50 else NA, grand.lines = flag.attsurfs) dev.off() cat (paste("eafdiffplot:", output.file, "\n")) EOFR close R; my @args = ("$Rexe --quiet --vanilla --slave < $$.R"); system(@args) == 0 or die "$progname: error: R failed to create the plots (@args)\n"; if ($flag_crop and not $flag_eps) { my ($tmpfh, $tmpfilename) = tempfile(); execute ("pdfcrop $output_file $tmpfilename"); execute ("mv $tmpfilename $output_file"); } # FIXME: EPS files tend to be huge, so sometimes pays off to convert # them to PNG or JPEG and then back to EPS. How to fix this: # # Option 1: Find the proper settings of 'convert' or an alternative # tool to do the best possible conversion. Multi-platform tools are # better. Choose either PNG or JPEG. PNG seems the best option. # # Option 2: Create the output of R directly in PNG format. Then, # conversion to EPS seems easier and pdfLaTeX handles PNG. Still, the # proper settings for PNG would need to be investigated. # # Option 3: create smaller EPS files, so no conversion is # needed. Currently, points overlapped by other points are still # present in the EPS file and take space (and time to render). Avoid # anything that is not shown in final plot. If the points are at # exactly the same position, we should be able to detect that and only # plot the point that is visible. However, a point can also be # completely overlapped by other points in different positions (since # points in a plot have a nonzero area). No idea how to avoid plotting # those points. Perhaps there is some way to detec this in R itself. # # if ($flag_png) { my $output_png = $output_file; $output_png =~ s/${outsuffix}$/.png/; #$output_png =~ s[/eps/][/png/]; if ($flag_eps) { `$eps2png -render +antialias -density 300 -background white -flatten $output_file $output_png`; } else { my $tmpfile = "/tmp/". basename($output_file); `pdfcrop $output_file $tmpfile`; `$pdf2png -render +antialias -density 300 -background white -flatten $tmpfile $output_png`; } #my $output_png_eps = $output_png; #my $output_png_eps =~ s/\.png$/_png.eps/; #`convert $output_png $output_png_eps`; #`rm -f $output_png`; #`gzip --force -v $output_png_eps`; } # if($jpeg_flag) { # $output_jpg = $output_file; # $output_jpg =~ s/\.eps$/.jpg/; # $output_jpg =~ s[/eps/][/jpg/]; # $output_jpg_eps = $output_jpg; # $output_jpg_eps =~ s/\.jpg$/_jpg.eps/; # `convert -render +antialias -density 300 $output_eps $output_jpg`; # `convert $output_jpg -compress jpeg eps2:${output_jpg_eps}`; # `rm -f $output_jpg`; # `gzip --force -v $output_jpg_eps`; # } ## FIXME: Do this on the fly within the R script by using pipes. if ($compress_flag) { print "$progname: compressing: "; `gzip --force -v $output_file`; } unless ($flag_verbose) { unlink("$$.R", "$$.Rout"); } else { print "$progname: generated R script: $$.R\n"; } ################################### # helper sub-routines ################################### sub parse_expression { my $label = shift; $label = "\"$label\"" if ($label !~ /^expression\(/); return $label; } sub get_arg { my ($option, $arg) = split (/=/, $_[0], 2); $arg = shift @ARGV if (not $arg); return $arg; } sub format_commandline { my $cmd = $0 . " "; for (my $i=0, my $j=25; $i < @ARGV; $i++) { if ($i == $j) { $j += 25; $cmd .= "\\\n# "; } if ($ARGV[$i] =~ /\s/) { $cmd .= " \"" . $ARGV[$i] . "\""; } else { $cmd .= " " . $ARGV[$i]; } } return $cmd; } use Env '@PATH'; use Cwd; # FIXME: This should return the empty string if not found. sub which_program { my $program = shift; my $cwd = cwd(); unless ($program =~ m|^.?.?/|) { # If no path was given foreach my $path (@PATH) { if (-e "$path/$program") { $program = "$path/$program"; last; } } # Try also the current directory: $program = "$cwd/$program" if (-e "$cwd/$program"); } return $program; } sub requiredprog { my $cwd = cwd(); foreach my $program (@_) { next if not defined $program; my $pathtoprogram = which_program($program); die "$progname: cannot find required program `$program'," ." either in your PATH=\"". join(':',@PATH) ."\" or in the current directory`$cwd'\n" unless ($pathtoprogram =~ m|^.?.?/|); die "$progname: required program `$program' is not executable\n" unless (-x $pathtoprogram); } } sub execute { my $command = shift; if ($flag_verbose) { print $command ."\n"; print `$command`; } else { `$command`; } my $exit = $? >> 8; die "$progname: command `$command' failed with value $exit\n" if ($exit); } eaf/inst/scripts/eafplot/0000755000176200001440000000000014660712334015111 5ustar liggesuserseaf/inst/scripts/eafplot/README0000644000176200001440000000514114660712334015772 0ustar liggesusers------------------- eafplot.pl ------------------- Perl script to plot attainment surfaces for a set of input points. Requirements of `eafplot.pl' ---------------------------- The program has been tested on GNU/Linux using bash shell. If you have success or problems using other systems, please let me know. The following programs are required: * Perl 5 * eaf R package: http://iridia.ulb.ac.be/~manuel/eaftools The following programs are only required if the corresponding features are enabled by editing the script: * ps2eps: Filter PS files and remove excessive margin whitespace. * gzip * ImageMagick (in particular, the program `convert') Using `eafplot.pl' -------------------- See the output of eafplot.pl --help License ------- Copyright (c) 2010 Manuel Lopez-Ibanez This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. IMPORTANT NOTE: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to (a) mention the fashion in which this software was used in the Methods section; (b) mention the algorithm in the References section. The appropriate citation is: Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuss, editors, Experimental Methods for the Analysis of Optimization Algorithms, pages 209–222. Springer, Berlin, Germany, 2010. doi: 10.1007/978-3-642-02538-9_9 Moreover, as a personal note, I would appreciate it if you would email with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. You can obtain a copy of the GNU General Public License at http://www.gnu.org/licenses/gpl.html or writing to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. eaf/inst/scripts/eafplot/eafplot.pl0000755000176200001440000005100314660712334017102 0ustar liggesusers#!/usr/bin/perl -w #--------------------------------------------------------------------- # # eafplot.pl ($Revision: 251 $) # #--------------------------------------------------------------------- # # Copyright (c) 2005-2017 # Manuel Lopez-Ibanez # TeX: \copyright 2005-2017 Manuel L{\'o}pez-Ib{\'a}{\~n}ez # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You can obtain a copy of the GNU General Public License at # http://www.gnu.org/licenses/gpl.html or writing to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA # #--------------------------------------------------------------------- # # IMPORTANT NOTE: Please be aware that the fact that this program is # released as Free Software does not excuse you from scientific # propriety, which obligates you to give appropriate credit! If you # write a scientific paper describing research that made substantive # use of this program, it is your obligation as a scientist to (a) # mention the fashion in which this software was used in the Methods # section; (b) mention the algorithm in the References section. The # appropriate citation is: # # Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. # Exploratory Analysis of Stochastic Local Search Algorithms in # Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, # L. Paquete, and M. Preuss, editors, Experimental Methods for the # Analysis of Optimization Algorithms, pages 209–222. Springer, # Berlin, Germany, 2010. # doi: 10.1007/978-3-642-02538-9_9 # # Moreover, as a personal note, I would appreciate it if you would # email with citations of papers # referencing this work so I can mention them to my funding agent and # tenure committee. # #--------------------------------------------------------------------- # # Literature: # # [1] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid # population-based algorithms for the bi-objective quadratic # assignment problem. Journal of Mathematical Modelling and # Algorithms, 5(1):111-137, April 2006. # # [2] Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stutzle. Hybrid # population-based algorithms for the bi-objective quadratic # assignment problem. Journal of Mathematical Modelling and # Algorithms, 5(1):111-137, April 2006. # #--------------------------------------------------------------------- # # TODO: # # * Fail if any subcommand fails. For example, do not even run R if # the call to the eaf program failed. (See execute in eafdiff.pl). # #--------------------------------------------------------------------- use strict; use warnings FATAL => 'all'; use diagnostics; use Carp; use File::Basename; use Getopt::Long qw(:config pass_through);; use File::Temp qw/ tempfile /; my $copyright =' Copyright (C) 2005-2017 Manuel Lopez-Ibanez This is free software. You may redistribute copies of it under the terms of the GNU General Public License . There is NO WARRANTY, to the extent permitted by law. '; my $progname = basename($0); my $version = ' $Revision: 251 $ '; my $Rexe = "R"; requiredprog($Rexe); &usage(1) if (@ARGV == 0); my $colors = "NULL"; my $percentiles; # FIXME: single/multiple plots are a mess. This is how it should work: # --single file1 file2 ... --output plotfile # produces a single plot 'plotfile' from all input files. Labels are input filenames # # --no-single file --output plotfile # produces a single plot 'plotfile' from input file. Labels are percentiles. # # --no-single file1 file2 --output plotfile # error: use --suffix and/or --output-dir. my $flag_single_plot = 0; my $legend; my $output_file; my @output_files; my $flag_verbose = 0; my $flag_eps = 0; my $flag_crop = (which_program("pdfcrop") ne "pdfcrop"); my $label_obj1 = "objective 1"; my $label_obj2 = "objective 2"; my $flag_area = 0; my $flag_ymaximise = 0; my $flag_xmaximise = 0; my $flag_maximise = 0; my $flag_best = 0; my $flag_median = 0; my $flag_worst = 0; GetOptions ('area' => \$flag_area, 'eps' => \$flag_eps, 'crop' => \$flag_crop, 'single' => \$flag_single_plot, 'best|b' => \$flag_best, 'median|m' => \$flag_median, 'worst|w' => \$flag_worst, 'maximise' => \$flag_maximise, 'xmaximise' => \$flag_xmaximise, 'ymaximise' => \$flag_ymaximise, 'output|o=s' => \$output_file, 'legend=s' => \$legend, 'colors=s' => \$colors, 'obj1:s' => \$label_obj1, 'obj2:s' => \$label_obj2, 'verbose|v' => \$flag_verbose); requiredprog("pdfcrop") if ($flag_crop and not $flag_eps); if ($flag_best) { $percentiles .= ", " if (defined($percentiles)); $percentiles .= "0"; } if ($flag_median) { $percentiles .= ", " if (defined($percentiles)); $percentiles .= "50"; } if ($flag_worst) { $percentiles .= ", " if (defined($percentiles)); $percentiles .= "100"; } sub version { print "$progname: version $version\n"; print $copyright; exit (0); } sub usage { my $exitcode = shift; print <<"EOF"; $progname version $version $copyright Usage: $progname [OPTIONS] FILES Plot the best/median/worst attainment surfaces for a set of input points. -h, --help print this summary and exit --version print version number and exit -v, --verbose increase verbosity and keep intermediate files -I, --iqr, --IQR plot IQR (25%-75% percentile) instead of best and worst -b, --best plot best attainment surface -m, --median plot median attainment surface -w, --worst plot worst attainment surface -p, --percentiles=INT[,INT..] plot the given percentile(s) of the EAF --extra=FILE add extra points to the plot --extra-label=STRING label in the legend for the extra points --obj1=STRING label for objective 1 (x-axis) --obj2=STRING label for objective 2 (y-axis) (labels can be R expressions, e.g., --obj1="expression(pi)") --legend=STRING A legend like: '"Algorithm A", "Algorithm B"' --legendpos={top,bottom}{left,right} position of the legend --xlim=REAL,REAL limits of x-axis --ylim=REAL,REAL limits of y-axis --area plot the area dominated by the attainment surfaces instead of lines. --colors=STRING,STRING bounds for color range in area mode (default '"gray","black"') --maximise handle a maximisation problem --xmaximise maximise first objective --ymaximise maximise second objective -o, --output=FILE output file. --[no]single generate a single plot. --eps generate EPS file (default is PDF). --no-eaf just plot the points directly. EOF exit $exitcode; } ## Format commandline. my $commandline = &format_commandline (); my @files = (); my $flag_axislog = ""; my $extra_points = "NULL"; my $extra_labels = "NULL"; my $IQR_flag = 0; my $legendpos = "topright"; my $xlim = "NULL"; my $ylim = "NULL"; my $do_eaf = 1; #FIXME: Move everything to GetOpt above. ## Handle parameters while (@ARGV) { my $argv = shift @ARGV; if ($argv =~ /^--help/ or $argv =~ /^-h/) { &usage(0); } elsif ($argv =~ /^--version/) { &version(); } elsif (# For backwards compatibility $argv =~ /--stoptime/ or $argv =~ /-stoptime/) { print "$progname: maximising y-axis\n"; $flag_ymaximise = 1; } elsif ($argv =~ /^-I/ or $argv =~ /^--iqr/i) { $IQR_flag = 1; $percentiles .= ", " if (defined($percentiles)); $percentiles .= "25, 50, 75"; } elsif ($argv =~ /^-p$/ or $argv =~ /^--percentiles=/ or $argv =~ /^--percentiles$/) { $percentiles .= ", " if (defined($percentiles)); $percentiles .= &get_arg($argv); } elsif ($argv =~ /--no-eaf/i) { $do_eaf = 0; } elsif ($argv =~ /^--extra=/ or $argv =~ /^--extra$/) { my $arg = &get_arg ($argv); if ($arg and -r $arg) { $extra_points = ($extra_points eq "NULL") ? "\"$arg\"" : $extra_points . ", \"$arg\""; } else { die "cannot read file $arg.\n"; } } elsif ($argv =~ /^--extra-label=/ or $argv =~ /^--extra-label$/) { my $arg = &get_arg ($argv); if ($arg) { $extra_labels = ($extra_labels eq "NULL") ? "\"$arg\"" : $extra_labels . ", \"$arg\""; } } elsif ($argv =~ /^--legendpos=/ or $argv =~ /^--legendpos$/) { my $arg = &get_arg ($argv); $legendpos = "$arg" if ($arg); } elsif ($argv =~ /^--ylog/) { $flag_axislog = "y"; } elsif ($argv =~ /^--xlim=/ or $argv =~ /^--xlim$/) { my $arg = &get_arg ($argv); $xlim = "c($arg)" if ($arg); } elsif ($argv =~ /^--ylim=/ or $argv =~ /^--ylim$/) { my $arg = &get_arg ($argv); $ylim = "c($arg)" if ($arg); } elsif ($argv =~ /^--/ or $argv =~ /^-/) { print "$progname: unknown option $argv\n"; &usage(1); } else { push (@files, $argv); } } @files = &unique(@files); die "$progname: error: no input files given\n" unless (@files); if (defined($percentiles) and not $do_eaf) { die "$progname: cannot specify --no-eaf and any EAF option" . " (--best, --median, --worst, --iqr, --percentiles)"; } my $ps2epsfilter = undef; $ps2epsfilter = "ps2eps"; requiredprog ($ps2epsfilter) if ($flag_eps); my $filter = ""; $filter = "|$ps2epsfilter -s b0 -q -l -B -O -P > " if ($flag_eps and defined($ps2epsfilter) and -x $ps2epsfilter); if ($extra_labels eq "NULL") { $extra_labels = $extra_points; } $percentiles = "NULL" unless ($do_eaf); # Default is best, median, worst. unless(defined($percentiles)) { $percentiles = ($flag_single_plot) ? "50" : "0, 50, 100"; } $label_obj1 = parse_expression ($label_obj1); $label_obj2 = parse_expression ($label_obj2); my $num = 0; my $eaffiles = ""; my @titles; my @eaffiles; foreach my $inpfile (@files) { unless (-r $inpfile) { die "$progname: warning: $inpfile: cannot read file.\n"; #next; } elsif (!(-s $inpfile) or `grep -v -e "#\\|^\$" $inpfile | wc --bytes` =~ /\s+0$/o) { die "$progname: warning: $inpfile: empty file.\n"; #next; } $num++; my $basefile; my $inpdir; my $file_eps; chomp($basefile = `basename $inpfile .dat`); chomp($inpdir = `dirname $inpfile`); my $filedata = $inpfile; if ($num < 10) { print "# f$num: $inpfile\n"; } else { print "#f$num: $inpfile\n"; } if ($do_eaf) { if ($IQR_flag) { $file_eps = "$inpdir/att_iqr_${basefile}"; } elsif ($flag_area) { $file_eps = "$inpdir/att_area_${basefile}"; } else { $file_eps = "$inpdir/${basefile}_att"; } } else { $file_eps = "$inpdir/${basefile}"; } $eaffiles = "\"${filedata}\""; push @output_files, $file_eps; push @titles, $inpfile; push @eaffiles, $eaffiles; } # FIXME: We can override only one output file. if (defined($output_file) and $output_file) { # Remove suffix, the R code will add the correct one. $output_file =~ s/(\.pdf|\.eps|\.ps|\.png)$//; $output_files[0] = $output_file; } my $str_outfiles = asRlist(@output_files); my $str_titles = asRlist(@titles); my $str_eaffiles = join(', ', @eaffiles); $legend = $str_titles unless(defined($legend)); if ($flag_maximise) { $flag_xmaximise = 1; $flag_ymaximise = 1; } print "$progname: maximising x-axis\n" if ($flag_xmaximise); print "$progname: maximising y-axis\n" if ($flag_ymaximise); my $Rfile = "$$.R"; open(R, ">$Rfile") or die "$progname: error: can't open $Rfile: $!\n"; print R <<"EOFR"; #!/usr/bin/r --vanilla # # R script to plot attainment surfaces # # This script is executable if you have littler installed. [*] # [*] http://code.google.com/p/littler/ # # Created by $commandline # # $version # library(eaf) filter <- "$filter" file.extra <- list(${extra_points}) extra.legend <- c(${extra_labels}) extra.pch <- c(20, 1:25) extra.col <- c("black") maximise <- as.logical(c($flag_xmaximise, $flag_ymaximise)) legend.txt <- c($legend) legend.pos <- "$legendpos" log <- "$flag_axislog" Xlim <- $xlim Ylim <- $ylim eaf.type <- ifelse(${flag_area}, "area", "point") xlab <- $label_obj1 ylab <- $label_obj2 colors <- c($colors) percentiles <- c($percentiles) percentiles <- if (is.null(percentiles)) percentiles else sort(percentiles) do.eaf <- as.logical($do_eaf) single.plot <- as.logical($flag_single_plot) flag.eps <- as.logical(${flag_eps}) output.files <- c(${str_outfiles}) titles <- c(${str_titles}) eaffiles <- list(${str_eaffiles}) EOFR print R <<'EOFR'; if (eaf.type == "area") { col <- if (!is.null(colors)) colors else c('grey', 'black') # These two are unused for "area" lty <- NULL pch <- NA } else { col <- c("black", "darkgrey", "black", "grey40", "darkgrey") lty <- c("dashed", "solid", "solid", "solid", "dashed") pch <- NA #lty <- c("blank") #pch <- c(20,21,22,23,4,5) } data <- NULL attsurfs <- NULL xlim <- NULL ylim <- NULL if (do.eaf) { data <- lapply (eaffiles, read_datasets) xlim <- range(xlim, sapply(data, function(x) x[, 1])) ylim <- range(ylim, sapply(data, function(x) x[, 2])) } else { attsurfs <- lapply(eaffiles, function(x) { z <- read_datasets(x) z <- split.data.frame(z, z$set) z <- lapply(z, function(y) {y$set <- 1; return(y)}) return(z)}) xlim <- range(xlim, sapply(attsurfs, function(x) do.call("rbind", x)[,1])) ylim <- range(ylim, sapply(attsurfs, function(x) do.call("rbind", x)[,2])) lty <- c("blank") pch <- c(20,21,22,23,4,5) col <- c("black", "darkgrey", "black", "grey40", "darkgrey") } if (is.null (file.extra[[1]])) { extra.points <- NULL } else { extra.points <- list() for (i in 1:length(file.extra)) { tmp <- read.table(file.extra[[i]], na.strings="NA")[,c(1,2)] extra.points[[i]] <- tmp xlim <- range(xlim, tmp[,1], na.rm=T) ylim <- range(ylim, tmp[,2], na.rm=T) } } cat(sprintf("xlim = c(%s, %s)\n", xlim[1], xlim[2])) cat(sprintf("ylim = c(%s, %s)\n", ylim[1], ylim[2])) if (!is.null(Xlim)) xlim <- Xlim if (!is.null(Ylim)) ylim <- Ylim for (k in seq_along(output.files)) { if (single.plot) { output.title <- output.files } else { output.title <- titles[k] } output.file <- output.files[k] if (flag.eps) { output.file <- paste(filter, output.file, ".eps", sep='') postscript(output.file, title = output.title, paper = "special", horizontal=F, onefile=F, width=4.5, height=4.5) } else { output.file <- paste(filter, output.file, ".pdf", sep='') pdf(output.file, title = output.title, width=4.5, height=4.5) } if (single.plot) { eafplot (data, attsurfs = attsurfs, percentiles = percentiles, xlab = xlab, ylab = ylab, las = 0, log = log, type = eaf.type, lty = lty, col = col, pch=pch, cex.pch=0.75, extra.points = extra.points, extra.pch = extra.pch, extra.col = extra.col, xlim = xlim, ylim = ylim, legend.pos = legend.pos, extra.legend = extra.legend, legend.txt = legend.txt, maximise = maximise, main = NULL) } else { eafplot (data[[k]][,1:2], sets = data[[k]][,3], attsurfs = attsurfs[[k]], percentiles = percentiles, xlab = xlab, ylab = ylab, las = 0, log = log, type = eaf.type, lty = lty, col = col, pch=pch, cex.pch=0.75, extra.points = extra.points, extra.pch = extra.pch, extra.col = extra.col, xlim=xlim, ylim=ylim, legend.pos = legend.pos, extra.legend = extra.legend, maximise = maximise, main = NULL) } dev.null <- dev.off() cat ("Plot: ", output.file, "\n", sep='') } EOFR close R; &execute_verbose ("$Rexe --quiet --vanilla --slave <$Rfile"); ($flag_verbose) ? print "$progname: generated R script: $Rfile\n" : unlink($Rfile); if ($flag_crop and not $flag_eps) { my ($tmpfh, $tmpfilename) = tempfile(); foreach my $outfile (@output_files) { execute ("pdfcrop ${outfile}.pdf $tmpfilename"); execute ("mv $tmpfilename ${outfile}.pdf"); } } exit 0; ################################### # helper sub-routines ################################### sub parse_expression { my $label = shift; $label = "\"$label\"" if ($label !~ /^expression\(/); return $label; } sub unique { my %seen =() ; @_ = grep { ! $seen{$_}++ } @_ ; } sub round { my($number) = shift; return int($number + .5 * ($number <=> 0)); } sub get_arg { my ($option, $arg) = split (/=/, $_[0], 2); $arg = shift @ARGV if (not $arg); return $arg; } sub format_commandline { my $cmd = $0 . " "; for (my $i=0, my $j=25; $i < @ARGV; $i++) { if ($i == $j) { $j += 25; $cmd .= "\\\n# "; } if ($ARGV[$i] =~ /\s/) { $cmd .= " \"" . $ARGV[$i] . "\""; } else { $cmd .= " " . $ARGV[$i]; } } return $cmd; } use Env '@PATH'; use Cwd; # FIXME: This should return the empty string if not found. sub which_program { my $program = shift; my $cwd = cwd(); unless ($program =~ m|^.?.?/|) { # If no path was given foreach my $path (@PATH) { if (-e "$path/$program") { $program = "$path/$program"; last; } } # Try also the current directory: $program = "$cwd/$program" if (-e "$cwd/$program"); } return $program; } sub requiredprog { my $cwd = cwd(); foreach my $program (@_) { next if not defined $program; my $pathtoprogram = which_program($program); die "$progname: cannot find required program `$program'," ." either in your PATH=\"". join(':',@PATH) ."\" or in the current directory`$cwd'\n" unless ($pathtoprogram =~ m|^.?.?/|); die "$progname: required program `$program' is not executable\n" unless (-x $pathtoprogram); } } ## See ## http://svn.collab.net/repos/svn/trunk/contrib/hook-scripts/svn-keyword-check.pl ## for a better way to read from a command output sub runcmd { my $command = shift; system ($command); if ($? == -1) { die "error: failed to execute $command: $!\n"; } elsif ($? & 127) { die "child died with signal ". ($? & 127) . ($? & 128) ? "with core dump.\n" : ".\n"; } else { return $? >> 8; } } sub execute { my $command = shift; if ($flag_verbose) { &execute_verbose ("$command"); } else { `$command`; } } sub execute_verbose { unless (@_) { croak "$progname: execute_verbose passed no arguments.\n"; } print "\n@_\n" if ($flag_verbose); my $fh = _pipe(@_); my @output; while (<$fh>) { print; chomp; push(@output, $_); } close($fh); my $result = $?; my $exit = $result >> 8; my $signal = $result & 127; my $cd = $result & 128 ? "with core dump" : ""; if ($signal or $cd) { warn "$progname: pipe from `@_' failed $cd: exit=$exit signal=$signal\n"; } if (wantarray) { return ($result, @output); } else { return $result; } } # Return the filehandle as a glob so we can loop over it elsewhere. sub _pipe { local *SAFE_READ; my $pid = open(SAFE_READ, '-|'); unless (defined $pid) { die "$progname: cannot fork: $!\n"; } unless ($pid) { open(STDERR, ">&STDOUT") or die "$progname: cannot dup STDOUT: $!\n"; exec(@_) or die "$progname: cannot exec `@_': $!\n"; } return *SAFE_READ; } sub asRlist { return "\"". join("\", \"", @_) . "\""; } eaf/inst/scripts/eafdiff.py0000755000176200001440000000231614143307125015414 0ustar liggesusers#!/usr/bin/python3 from rpy2.robjects.packages import importr import numpy as np from rpy2.robjects import r as R from rpy2.robjects import numpy2ri numpy2ri.activate() eaf = importr("eaf") path = R('system.file(package="eaf")')[0] + "/extdata/" alg1 = eaf.read_datasets(path + "wrots_l100w10_dat") #alg1 = np.array(alg1).transpose() alg2 = eaf.read_data_sets_(path + "wrots_l10w100_dat") x = eaf.eafdiff(alg1, alg2) # numpy.asarray constructs a view. x = np.asarray(x) import pandas as pd data = eaf.read_datasets(path + "ran.10pts.3d.10") data = np.asarray(data) df = pd.DataFrame(data, columns = ['obj1','obj2','obj3','run']) eaf50 = eaf.eafs(df.iloc[:,:3].to_numpy(), sets=df.run.to_numpy(), # It must be type float. percentiles=np.array([50.0])) # Remove useless last column eaf50 = np.asarray(eaf50)[:, :3] def select_side(rectangles, side): if (side == "left"): rectangles = rectangles[rectangles[:, 4] >= 1, :] elif (side == "right"): rectangles = rectangles[rectangles[:, 4] <= -1, :] rectangles[:, 4] = -rectangles[:,4] else: raise("Unknown side {}\n".format(side)) return rectangles eaf/inst/WORDLIST0000644000176200001440000000055614531101326013156 0ustar liggesusersBartz Beielstein Biobjective Bischl Cleanups Codecov Coloring DIMACS EAFs GD GPs Hausdorff Hypervolume IGD IGDX IRIDIA Ibáñez López Metaheuristics Mickael Molchanov ORCID Preuss Quemy Roxygen SPEA TR Tabu TabuCol TinyTeX Vanzyl's Vorob'ev behavior behaviors bibtex biobjective cleanups color colormap colors doi favor hypervolume libre metaheuristic nondominated eaf/tools/0000755000176200001440000000000014660712374012157 5ustar liggesuserseaf/tools/create-figures.R0000644000176200001440000000164214160050741015176 0ustar liggesuserslibrary(eaf) extdata_dir <- system.file(package="eaf", "extdata") A1 <- read_datasets(file.path(extdata_dir, "ALG_1_dat.xz")) A2 <- read_datasets(file.path(extdata_dir, "ALG_2_dat.xz")) # FIXME: How to crop PNG? png(filename = "man/figures/ALG_1_dat-ALG_2_dat.png", width = 480, height = 240) eafdiffplot(A1, A2, type = "point", title.left = "Algorithm 1", title.right = "Algorithm 2") invisible(dev.off()) a1 <- read_datasets(file.path(extdata_dir, "wrots_l100w10_dat")) a2 <- read_datasets(file.path(extdata_dir, "wrots_l10w100_dat")) # FIXME: How to crop PNG? png(filename = "man/figures/eafdiff-color.png", width = 600, height = 350) eafdiffplot(a1, a2, col = colorRampPalette(c("blue", "red")), intervals = 10, title.left = expression("W-RoTS, " * lambda * "=" * 100 * ", " * omega * "=" * 10), title.right= expression("W-RoTS, " * lambda * "=" * 10 * ", " * omega * "=" * 100)) invisible(dev.off()) eaf/tools/winlibs.R0000644000176200001440000000067514405131641013746 0ustar liggesusers# Download GSL 2.7 Rtools build if (!file.exists("../windows/gsl-2.7/include/gsl/gsl_blas.h")){ download.file("https://github.com/rwinlib/gsl/archive/v2.7.zip", "lib.zip", quiet = TRUE) dir.create("../windows", showWarnings = FALSE) unzip("lib.zip", exdir = "../windows") unlink("lib.zip") stopifnot(file.exists("../windows/gsl-2.7/include/gsl/gsl_errno.h")) cat(sep="", "Downloaded to '", file.path(getwd(), "../windows"), "'\n") } eaf/README.md0000644000176200001440000002553214464161076012304 0ustar liggesusersEAF
   differences between two bi-objective optimizers EAF differences between two variants of W-RoTS (color) **eaf**: Empirical Attainment Function (EAF) Tools ================================================================ [![CRAN Status](https://www.r-pkg.org/badges/version-last-release/eaf)](https://cran.r-project.org/package=eaf) [![CRAN Downloads](https://cranlogs.r-pkg.org/badges/grand-total/eaf)](https://CRAN.R-project.org/package=eaf) [![R build status](https://github.com/MLopez-Ibanez/eaf/workflows/R-CMD-check/badge.svg)](https://github.com/MLopez-Ibanez/eaf/actions) [![Codecov test coverage](https://codecov.io/gh/MLopez-Ibanez/eaf/branch/master/graph/badge.svg)](https://app.codecov.io/gh/MLopez-Ibanez/eaf?branch=master) [ [**Homepage**](https://mlopez-ibanez.github.io/eaf/) ] [ [**GitHub**](https://github.com/MLopez-Ibanez/eaf) ] **Maintainer:** [Manuel López-Ibáñez](https://lopez-ibanez.eu) **Contributors:** [Manuel López-Ibáñez](https://lopez-ibanez.eu), [Marco Chiarandini](http://www.imada.sdu.dk/~marco), [Carlos M. Fonseca](https://eden.dei.uc.pt/~cmfonsec/), [Luís Paquete](https://eden.dei.uc.pt/~paquete/), Thomas Stützle, and Mickaël Binois. --------------------------------------- Introduction ============ The empirical attainment function (EAF) describes the probabilistic distribution of the outcomes obtained by a stochastic algorithm in the objective space. This [R](https://www.R-project.org/) package implements plots of summary attainment surfaces and differences between the first-order EAFs. These plots may be used for exploring the performance of stochastic local search algorithms for biobjective optimization problems and help in identifying certain algorithmic behaviors in a graphical way. The corresponding [book chapter](#LopPaqStu09emaa) [1] explains the use of these visualization tools and illustrates them with examples arising from practice. In addition, the package provides functions for computing several quality metrics, such as hypervolume, IGD, IGD+, and epsilon. **Keywords**: empirical attainment function, summary attainment surfaces, EAF differences, multi-objective optimization, bi-objective optimization, performance measures, performance assessment, graphical analysis, visualization. **Relevant literature:** 1. Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. [Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization](https://doi.org/10.1007/978-3-642-02538-9_9). In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuss, editors, *Experimental Methods for the Analysis of Optimization Algorithms*, pages 209–222. Springer, Berlin, Germany, 2010.
(This chapter is also available in a slightly extended form as Technical Report TR/IRIDIA/2009-015).
[ [bibtex](https://lopez-ibanez.eu/LopezIbanez_bib.html#LopPaqStu09emaa) | doi: [10.1007/978-3-642-02538-9_9](https://doi.org/10.1007/978-3-642-02538-9_9) | [Presentation](https://lopez-ibanez.eu/doc/gecco2010moworkshop.pdf) ] Download and installation ------------------------- The **eaf** package is implemented in R. Therefore, a basic knowledge of R is recommended to make use of all features. The first step before installing the **eaf** package is to [install R](https://cran.r-project.org/). Once R is installed in the system, there are two methods for installing the **eaf** package: 1. Install within R (automatic download, internet connection required). Invoke R, then ```r install.packages("eaf") ``` 2. [Download the **eaf** package from CRAN](https://cran.r-project.org/package=eaf) (you may also need to download and install first the [package modeltools](https://cran.r-project.org/package=modeltools)), and invoke at the command-line: ```bash R CMD INSTALL ``` where `` is one of the three versions available: `.tar.gz` (Unix/BSD/GNU/Linux), `.tgz` (MacOS X), or `.zip` (Windows). Search the [R documentation](https://cran.r-project.org/faqs.html) if you need more help to install an R package on your system. The code for computing the EAF is available as a C program, and it does not require installing R or any R packages. Just [download the package source code](https://cran.r-project.org/package=eaf), uncompress it, and look for the directory `src/eaf`. The C code can be used to implement your own visualizations instead of the visualizations provided by the **eaf** package. Compiled executables for computing the EAF can be found under `system.file(package="eaf", "bin")`. Other useful executable programs can be found there. The `eaf` package also contains two Perl scripts that may allow you to generate standard plots without any R knowledge. See `inst/scripts/eafplot/` and `inst/scripts/eafdiff/` in the package source code. The scripts use the **eaf** package internally to generate the plots, and, hence, the **eaf** package must be installed and working. If you wish to be notified of bugfixes and new versions, please subscribe to the [low-volume emo-list](https://lists.dei.uc.pt/mailman/listinfo/emo-list), where announcements will be made. [ [Download **eaf** package from CRAN](https://cran.r-project.org/package=eaf) ] [ [Documentation](https://mlopez-ibanez.github.io/eaf/) ] [ [Development version (GitHub)](https://github.com/MLopez-Ibanez/eaf) ] GitHub (Development version) ---------------------------- If you wish to try the development version, you can install it by executing the following commands within the R console: ```R R> install.packages("devtools") R> devtools::install_github("MLopez-Ibanez/eaf") ``` Usage ----- Once the **eaf** package is installed, the following R commands will give more information: ```r library(eaf) ?eaf ?eafplot ?eafdiffplot ?read.data.sets example(eafplot) example(eafdiffplot) # This one takes some time ``` Apart from the main R package, the source code contains the following extras in the directory `inst/` (after installation, these files can be found at the directory printed by the R command `system.file(package="eaf")`): * `scripts/eafplot` : Perl script to plot summary attainment surfaces. * `scripts/eafdiff` : Perl script to plot the differences between the EAFs of two input sets. * `extdata/` : Examples of utilization of the above programs. These are discussed in the corresponding [book chapter](#LopPaqStu09emaa) [1]. In addition, the source code contains the following under `src/`: * `src/eaf` : This C program computes the empirical attainment function in 2 or 3 dimensions. It is NOT required by the other programs, but it is provided as a useful command-line utility. This version is based on the original code written by Carlos M. Fonseca available at http://www.tik.ee.ethz.ch/pisa/. A more recent version is available at [Prof. Fonseca's website](https://eden.dei.uc.pt/~cmfonsec/software.html). * `src/mo-tools` : Several tools for working with multi-objective data. For more information, consult the `README` files at each subdirectory. Python ------ Thanks to [rpy2](https://rpy2.github.io/doc/latest/html/index.html), you can use the `eaf` package from Python. A complete example would be: ```python import os ## Uncomment this if you suffer from this bug in cffi 1.13.0 ## https://bitbucket.org/rpy2/rpy2/issues/591/runtimeerror-found-a-situation-in-which-we #os.environ['RPY2_CFFI_MODE'] = "API" # Tested with rpy2 2.9.2-1 and 3.2.6 import numpy as np from rpy2.robjects.packages import importr, isinstalled, PackageNotInstalledError from rpy2.robjects import r as R from rpy2.robjects import numpy2ri from rpy2.robjects.vectors import StrVector numpy2ri.activate() from rpy2.interactive import process_revents process_revents.start() def install_rpackages(packages): if not isinstance(packages, list): packages = [ packages ] utils = importr('utils') # import R's utility package # Selectively install what needs to be installed. names_to_install = [x for x in packages if not isinstalled(x)] if len(names_to_install) > 0: print(f"Installing packages: {names_to_install}") utils.install_packages(StrVector(names_to_install), repos = "https://cloud.r-project.org", verbose=True) try: eaf = importr("eaf") except PackageNotInstalledError as e: install_rpackages("eaf") eaf = importr("eaf") # Retry after install path = R('system.file(package="eaf", "extdata")')[0] + "/" alg1 = eaf.read_data_sets_(path + "ALG_1_dat.xz") alg1 = np.asarray(alg1) alg2 = np.asarray(eaf.read_data_sets_(path + "ALG_2_dat.xz")) eaf.eafplot(alg1[:, 0:2], sets=alg1[:,2]) input("Press ENTER to see next plot: ") eaf.eafdiffplot(alg1, alg2, title_left="A", title_right="B") ``` License -------- This software is Copyright (C) 2011-2021 Carlos M. Fonseca, Luís Paquete, Thomas Stützle, Manuel López-Ibáñez and Marco Chiarandini. This program is free software (software libre); you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the [GNU General Public License](http://www.gnu.org/licenses/gpl.html) for more details. **IMPORTANT NOTE**: Please be aware that the fact that this program is released as Free Software does not excuse you from scientific propriety, which obligates you to give appropriate credit! If you write a scientific paper describing research that made substantive use of this program, it is your obligation as a scientist to (a) mention the fashion in which this software was used in the Methods section; (b) mention the algorithm in the References section. The appropriate citation is: * Manuel López-Ibáñez, Luís Paquete, and Thomas Stützle. **Exploratory Analysis of Stochastic Local Search Algorithms in Biobjective Optimization.** In T. Bartz-Beielstein, M. Chiarandini, L. Paquete, and M. Preuss, editors, *Experimental Methods for the Analysis of Optimization Algorithms*, pages 209–222. Springer, Berlin, Germany, 2010. doi: 10.1007/978-3-642-02538-9_9 Moreover, as a personal note, I would appreciate it if you would email `manuel.lopez-ibanez@manchester.ac.uk` with citations of papers referencing this work so I can mention them to my funding agent and tenure committee. eaf/build/0000755000176200001440000000000014660712374012116 5ustar liggesuserseaf/build/partial.rdb0000644000176200001440000016640314660712374014255 0ustar liggesuserskpɲ&$&(4 ƒH &@AnDUYՙY >}3jMi4k&wL&ݵ6lG?}l3=2DDfM9P pDWD~ OH$?/q K1u()F18⪣lPKKV_S6O''Udž*%$yW+Fn7ףM-AC)v׾!8JB9fMϚvo.s__.|]prtޚXˎ:2WkOWGת^\S'sc&GUe}s/fYv-6}]}ǣg.WjQty:&axo?}H_#/tUU?BhA4,C[TeCM/5BHn=(~A|8UEQ89(GE8 ,'OEUQCJއ؏tE0OT" 8Dr0oC<? >APdH 5L`)vH -R2ODyt#o5DrS^٪ SRɺ[j{1Xv=(QH?nnf3 ;`=8'wgæDc~L.':!3}wBpO'e;T~mSWU ;D:ahZ)v0'6aTUècQݳZӱF}=JtBTtZ]'4R dtw:{jQQ-S#G=Hy4jHRː`ZjWSz!#X4<5c'!z ?fjߛ/vւ4k}vQ>Q tM8!2tXgͲa5Ge~t!R}WHUweCqgiӚA*ukfp(;JCnpg“4f,\&;T+opxr~yivny@͏^E*oSV z_ޫ'G_545;EZQ{ͬZ" 4mfŶc Nۓ##cS6Suj1Mݞ^.{ESK´X g3l&;9{J9a<Όwk oii<=Qp(8Q߅bM G_RƧIx;iRr==:JNh wz rweq),LfڧO?1rsjВ'&awQط?}GT*Y7'o])+N옒R =:\/|GrF?.cܼ"Wmi(딌ȫ)TTW G|$[efz.F%v݈LC"XM=T S]Wm8p 8ho]W/EM]34US\hƫ@@| *|C. 9n!TXQAZ\y\?T7{u+H_E}tϵGO#}:}oFDz0~}CHIiu-9 [3Ƚ4H.ëU5פ+gu(dMiQtu\7-lxwΚ_xrGuyZ?)p&CjCt <K)1Lch5nVV)O+tst/62yzt3R/$:j?B] ُ5?Mx|>R1 an.p.&r]'KX(Mv#QhPP )$s):Elձ)ޯ/**][ T"E3IJ+E"ϐ~&]9+:ewRc2"t6EtpJi'SkgT,Up9,aMt΍tńcuuLy D3\Q z-WAKy\]"4Q:9C] -VHqrYqG&ui0^{= A| xﵥL5vBD#͆CC#D8em7_ܾ#U?_^9Wݐ ;'>gsM/qה/p{ |Vlsn t׵2jnqc--j/`z^:^E ߾]s= ؗ_.nɵnֲyJff׍V&۪XP;(Zo2ٍ̊5hypPr BR{7 QmVYEx4_TϑжѺ|YuJ&@[CtV֙zfpޕ>#+foZY0m=7vL9ҐJ6ZfSCEmU~ a/;cǀn<գXf+!ݴa,ҖCwzto$k U¾5Ъ:-_R<]2V6]66 i@#c-l&}; iFQe` GGAӁ]2&-Q No_P h`[mz‰@M~q+kUwZ[yh ڲUA'ߪmm={Wmf:dkx4AZVOzvY@OQ֪zjVw!ay7+ T_kKhUJ<6rliji vrqo?7AWb };/d/=d-.s!FqL ;GwďL2vϿ:Uʂl;aj0 sە?_[*6[_sG5jK]8!G-ѵnc/4gZNjP6PXoH߭kƮBfEeEY^a'*?b~<"94ӑձ ]q*F jPjJPX5gD4[->s(j8隅?ڊpJzsiEܭw@Y筀Z*SŽQIZÚfk[xB+w*|wE[vؕM7ς"B*#!n̿[^xY4m!`0^~8Z2*Dw'W'G*]3F6*,OgGV-z_Q9{ԇ<:j5n 꼸^J[O^QiC'۴|BբlڃäWBLfrNSzn[nn7"PRfl4}o*:6CKv}Mg7FKRm9Th4Ahn vvgV_J!J TGiDkv劳JHfHh[cm]//eںm1_~4zۉ;^$$ 6q:H 2F m+ CFL5 m qoI"lgsZgftS5KZQݓC' _>tbkF5t6m7jd6~WV|x<]|,VYr$ R/ m0\ak;9:֐^rf92qf>V3O1< t?%JPc:ƵoΟj7FӋTÉF5>mT;pRUPB"ȿo/aq>P͵εC b·no?ZhTyZ8b\lBDh HƞCF݋֚$ioם}O%Hd;il)A9 ,U"AZDC4IAWH֏P$iH5L{>a(mi ,uwҎ!-RB3ODB^xpܓy< 1 6ޓ_ 2$pyKִ^gPɍ#n(+gNvgo:(\h; -Ac˳׿hV kQzMz\F2oፖBYդsxbTU,7V# k/Dz)DzP TT'tjS{^qf"<~nF=l:Uv"Dȼr-c?_^ӰcC Ǘi PUˋ`]t\?}ӡ\RdkUkD)Jsyti=PbDsGZTt 5$|yZAOڤ b|=.=+H_V'd|gz3Hvζzl 7?k/BR`~٫Q%|lzlmA|$[T=A!(2),ѿ!::cC3(~:F lĽPc 7_hTjI5qF8:ڶ!z.v]Ğ\/kq*Rx4g)Y>KBA|"=B]|yCP7wY>>څ %A]?1l|sHL],ߺCqTۤ.93dtƅͦGiN.L'DECu uG9OhzlralY3( @`UH%w9!jAߥrCm?% @"wq M"teXL6M}7@{f J4%X/octp I+VuT{x0 AB +B(W/+4U@r,݀mQuuC5  c-mgl֏w;4C] Qob@'/($M~t| Gw Ƞ1_WS|+uN; Smr=G!SS]DSHN a,£"Ѯ<-% ("%t"-RΝ4-!(Jy=N| ґi8rmCJ&c`ON`l)?9>y䤛DONPb|qO~YwK;5kħSarKƄD:]፽K LuHuB-6EVa1ė,c?cūm%WK|Qn_+/[h%=B}|uC7%bPi^;oVaMd~&pH 6Xad1וc>IWkgV# *#EY;9;[+/_=c8fɑLYd|W@f@Ӻ#Y0)LU3)B*jjjJȤȭ g%n:LJa^b5ӡ#Vs |7tR heh g3.+HC6Yﳬs,%]15i7tg $PTZhy>qcYK&v髑;ۺ^!.mtvpi\&}n/.Ѹ/wK[d>QܾN{F>yCllGFvQȬ(.&)cBe;$+_6nx|>;a=#-NΓYr[>ʧpdy;Na#&5V(n<A%ۓMU&0jߓMzb'rO6A]? $ÞL}eCM"&*{ҏMR$ڥ_;q!h?6fُM~l:A;T]+]؈H`Iԅ36ud|X%4&'J߫s=sպC%Š@P!^I2^xLn@'lkN+ !A {ζWyUogI=rk2~kVXlJk&bv!I yY 3As!yVx n#H) ah%xشD`AmgղJm`see+H_+~ 8` U %R| ) oH7B,]@pN|jsGPW'CM"~񏾗=wi >f` {6j ,pҍ)q􉠛u|]궷6DMoST-C ] >E.D2G b"AD8$ls{fm8>x3|s0z}Ex'(zA|0# `Fe(!lq'9O7Q6 nT}r oKZD4MWZ^?6U|pyi9[4y57`U6onW3 n6c O;pvS\ OY}WZqA~#y}xW,(~A|g~;/s=r BAǖR)躪rO&9ҹM~"dQ]Wmx,7 Fy7w#v;1oC p<~P$>3}8KaHRNp nފwM ʔ=^C:{ (!-jǻG/ -݈ב<] %{46A88p|c0 u0Ž;L "-o+ %8 K_?eW?WAħl|i 8MxcY|9QVBBqB~!fZ:š/t>n3OCBzJ~>Spi L#>BQU&AIx+2GcМذZAKKEWGl3^tҗ"iH'^Gm2=G5H d P|A|"}_^6AP*~;C w1uD@WRNsӍ!mb%tѰ}/\7逪Nyo7zwVd9i#H۫ʿ8Ldbz=+q6M^~'q6HJPu Ї8@d2V67VK[A4QKCEi|Bʦj)*MZ~5v;I]JّnGt@ b1ލ؟m[c&&QĻR ^!B3Hg"kCyw2p&%,R: w1(gNe6ꨏʂIJdV)jvEWuC!j e 姹5J窘*ނ x"<`@4K,LUTBʚkΖ еϚxThtˮ(8&oupn},3bMMPӻeVovmݿz:oUuqsTC|fWĤE4DqE3"\wgG@>qw@ҷ{P|rݲj*|‹HZY!^CtTGI߆x1٦x1?dҐZ٪>PvP t0óZgl.f:Yug0՜z)=~ [Hh%R"үTs.tuGcVױPOᇻ^L]_"gxUM/F*ʼnp@/Or˪*V>uȞZO HSdxM7dH===\\V6fLvrisx:s+ˉN|ҵ )҂􀣾 !l92>Mۙ$_-/NTQvڴ6F`N锫򆌎@{j0暥*o\~c.$T끼YubolSdҳ+v7`'v8cJK1kW8NK}hߘj\ȲW[Wu;eoG 7Z2e[0 CuD|iuv+,.RRR2 k;!X[}4&s%uS5rwb; ^Zz74^@M.S-peH[2Mղ\'THphk6ZAjFa>F idꅒbY)嶞?K8#P-&, RNփNI2 4 XbqF:S֒Vx: 2 8@sRuJPF[(>HjQSCxRP+A J0@G혖2V;!a1KO)Q_i\'и͍:2WkOWG 5e}2>vk"{{hY1F]ߖi[k{1ǪBjQs|iR4a:D-j|@'bظ2|iiY0cI-Z.J_~wej^85awKߚ7 fN&܆\?nR$˿ __5eU( p^6QK覽b]T衯D+_Ⱦv=A%(DqALE >B}׷'( UԼv7/a ,^PA#?2~+<+ #(] Q(T5l6',ZG$7k~mSHf(q3..E^D:S~6JL17+) 2uDT\ ~H\{5ۻ-hv| p2x KLDQ6jEl5pi׌N:s*6lͨgPSA20h$(p dUqM|0݋Qd|k^a;f%9x~AU!kt9%"+˯iyzP2 `ْQ C:i#r;CW44N˲dǯX]{>33*'QZ}H" .XjW@=ĕfT>1y=v;,{fR**."d^)<ڑwB9nx8Ho+(D`ef ӰSnk;%*Ӏ(b4S aJGdpu\*Uh{8压So"}SɐMm4.QH ~3ձ9"kgQEMa#-Юi!1O3Ϊ垫 fVҐn-8;pihsk%9 >-V҆j%ackzE8宏{$9 8A@,W'".ƤM '#kHOF$x‚I?_B BFUlj9rIׁ~-fۜW^LPvJ#}[Y t+Kͫ?!Ed AIq/mEeF9jS&Z瑞_U,sȊiNWi'+&1A n@T|zlEo-U{?\C!d{^*. ]+򆶻biQ%KegDZȊ!i7|498# ƠCyp[q " @,"CmBQ' -ԁu\"i˅ DGz=8Ђ@2'o!}]9zqiF 䫒4C-JsoU)L] i2M)֌ ]%BMqT*rLΆCjRmp7G=nC 6ý*UT&qFuI_ 2.{0dYhaPM>c/}RwH ¸ߍxS3`]5Uýp&;A\Bz)~m2|A|ul4v@mEWX㍤ㆥTJRQsņh5KGVӋakta$ F9F=2 'm>(݈ !>80۠'SlI F1xË}G|G-`A|" )+ߡv#E:S!wUw|,O ZjAc>bVj;p|q i!qRLzb;,1Cvv\;g[WSHG͜3ͨmX -|ͧG>oP\?b鴴63w4Qsti0?=π3\A\HRC@H!-a^ s+EY>-!-?r2P3i7L`-9 Y݈}H Y1.GݲFqA|"J$W:E~KH_a8L\FȄ +4`G g_Pu Ͼ>%0&/L̼p6%_JsbښSĄpðV 4Y:J{zbtG>Y`׭`4INhaw3w)P$DTbmY3 V ..DqMx}WݹgrAZ謍oΡV-OotTݑ{͡=Nـ>(nŁu"-Z`Z;js{p)ͫP,d*^ y+3CǥaМ1֕MTߕ X{S;(82$H]炐n eM$::A] vGeٙ~#>rnRݎ^xptBACZl4[ˀ{1tVo&H?UM @ZM* nU|LRе:69pquiN g unDspa7t8V6MvS unvCmDxH A[)/XjA5)+o<v 4r\)[Kw TU3~ hVr\>m,`"b/Ƒٿ@Ywy4ôf;vr0%L-&Mlۆ6;M98熾8L)j JjqLile_hNh1"kÌ4~˴:]x񗿩G~_Z}sit=Z;,SH M{ۚ*ǚ6\BJR7{>ʝ}">F./Aբfa`oَZNCdmca}ld&f?z8$S5[tU=ɼfuil#-]@=h5yi=Nk$ Ij|V{#߸i®hkbͦl.ݓq=ZGq&DȜx6<3i>hn\ lϐ!Y"גdZF1]pvAa"9c٥FLwT.1"__og|N]snD7xoveRcxUo>V2sRgP2c_iBG 8Qa@m/"́T͞۶sfω6;/53Y~{|ٺf=j?K. gz,F7P/l9=Ɨ1 s,&͚3J/c ;dPxbk,暇m ";x 4{} zEpvBב.Š^_a(!P)yշ_n(vQ\}v=}g?)NdYlw-o QجiX{x~QUϙ|ΏprB72o;b8K%ŨziAt,9 F*KպaѮ[9X62wk#0yŁ=އiiNX/,;_j:ALQk$竖YQ~aV-CA+'SjU()̫Jm2J=%S{Lk^l<'ǨeFF\*|M0;UxohjIqfLvrip]IK:s+t-'ԜN&/)$I4)9NŞoMkc4;^pPW:bs8 =5 sR765՟Œ(f5hmtgj@%F>m]K9c?={%Sr_Y_iwZꨶ~C@3ԯUB:xt 76qn4 N-]˸$^.zq%쌹C :|kh]#}\z9 >5|}+oCCγRN-Ux'.>#a=ŐSwkʩ=jD9bs*~]pi{uP~qV,k_Gie.w#-t:͓_!U{T65_wHeAi$۪lC!OH}yDڌLY? (w?#s7('mU!L*?$$,7Z΂/1l3#HG#5+A{J(@w >IfWO9Y g"ߡ< A| x9ROj'-ww/=D}bv?WN2LړerMY̭ݚchY1F[o/#|-t}ma&#u);;LH)I6ӝ.K9q *l3 9ĀK19GR6݈)$ć9 J,ڱ@~ >+=(k!DL'j0%&!.[ZFAțk`-b|({xBD} pn~[܉hBp3/ $'P }? >mܠ!H_n;5rrQη oMR[v Di]XDW'N\y sȓ"xK |݈q |ģHlC]|ħ2C{,F$7Iۀ)og7(Trr^o<^ҶRKG'n'^#-dc+YRV-H;M}?{ '75d~GL<{L H"HadfߵCy񉹏O ,MxZT6"^ϗ^VZPwe8 i>;@{#>1/_ʚa;/+'W<ϐ:SPQěHG nD?v|W> TJRU+-o`ڎ;wYPQDi[4`ضvh~`2moG؛CFt(S"(wگè">0-}vs;v'^Ս"yB݉AԝB7QOn&$ƥS4&Vzqxip0KT7<(w%iH\@GZfiMXE\Bz)wy&#\~Q_"-tD&r.# - {T_1ODam :3kX ('!{Fu$7C F7_#/2~K K)4 ֤ D.{)0w "݈b׃/BH$!/TK'Dc ~SpSF@E%K_KA+ C/m.nnoJc7JwKu.U3=..!Yg(QmWB] Y`]Jg: F[G-e't%--ŽiO;vrx\JIEYngs3t@Y_Js}Nq#j6$kgKeSŬB^<|D@yCVHQLVR\w;O)b+02SVtJ3)RR33LtV#Z|w D KLN>.W'7;(~taE>-Z*uk'jPK15髙a~zme&[2ђE/fˍ>$ڦpE)*IȜb&TS "UjRufjq4y:I20w` Mzp&Ma3fnֶUvÍ2 \Owv_VM'h_:slq{ t|[yVNz<@wۇT>CLqUrlV-aKX[@Pm.Ž5żzk Dnћ(D͙w sEP[#˄s] Ayឬxss|yY"PY-B&xT{H Yt=|\#+%-EI5>댷pwȶ`r֤@xy_\ɑl-xy2=5Fac;ڦ M(Gqĸ]Nmg+CkSh(N?';2+չb9 7:y2ݙiROD:`a! G|K] #8ey½\YC|$W^ dQyyz ؏tpm/Y|[/cS,ҜD9j9HwK7>Va뫾RMp C}МRu-gjYF5"ZzH9s?L~|~@|aiBp~@-儳YpVQ  3CofxPl~]9W:CMH-<@IDipϻ ]j!ѴƩpALñ#b'SH7d 씝bS 'P~膓dI+Q~fMct{^Ys=בέcY;q+:*\6|v;KJC Gq1mI\TkWUuJɪ4 Luڝ j%WC@Fe''"Y)5M?9=4B,h~<A|"Mip8z< '/($D$KT(ȏUEל-I25WX: B t`iqEJXP0DՇ4Q-C9*(17[*}G>%Rj'} ~wJT.ym|uʕe֞̽.֔حmy#+>ZҲH"uBvn 5exA|:({#-0S V sp[apKH ? > $9N)8p/ĴkA(ң =DAfδ_hP|A|ֵ[v.=8!M>2 9Y1N[nXfbbTT@+: uS e8dThv)ۥK=A]:"N%5 2A!O8ycknQߙc3(dݢ:μ=MEC} @\@zAZ>S!e%&0L bR6|_`q}#yr{P|A|cHW0srvфI,T 퍚Q}ϡ ^4W*dMMc*ɫ啸_Ǹ߽EzA|F?(!τmz swlwV^ڠhE-7}*LN<<_QRؗ]1IQ[w#/8h/vc(}KH_;0^FrCħl1xYBp2x d;p|'[d^6N1OD+^4=ü+CvY Z^Aq"}UZLJc]*V} _C#X%$7`!2d.EiIy\xs '8y Q@b}wm@] #={eفqhgٝީ J#8v Qv!7xiybhkR]uw-bǫO#AGz^G:(d+6 ղlOoR0-ZiaEy #I嬷Ehv9;m;9ϟEDz0ŝCBZDlhOSWQEMjpvs?0&JyT"ϡFHk!'.fi`'3d<])ѡ T}J:fQ(qsBh"4k?wNW^LC.(nүگPkd#T7 u50t&2U`iN[{.*n0w3d\JwcV7UZ-Wt`]l8p2LPtrtqf-.헬lUԠĀ+ K!FZ~XBr5j݉4-bW+ǎ oMwqJF߳=̛GW_EؒFp˨gW:.冎Se'TapA|$ejEqJ 'B9N"=LCen}-gJq$4`5ɶۈМW xU89'6u0 f gmJjKesߧ%ƾh:d;6zC`n+E"t'5vR5XӉi7p"Jo[!Rm;,$3)2\a3.M[H)B?xJspMdFby'41n }MM,_<O2kt}'1nu N#3lI6H["m릁&wIւm}#l"1?w6CLӟ'ZƉ =s5=?79qѵ5Kt-~ƐHfljCV=llD.E޻X ѩ<Ƒg)7T\ЃGcs7RPfnڽkp4ZV7e'0G~d޼G%J'P|rKYv~:ʠ}&t?~C",C5V-g~Q5SPGU5諙wbQx%z_ޫͲ{yI@CM:+Dgd?b +r*(tYhj<{&OM20Xt\~`xfbT2k۪mQu1 %vyFTcV}V;UR/[}{` jJes~+;52 ˪)]@@r"ЗQ߅.@aLIXׇ;^(ZOMy\TM{O?1$A@ެIB'nЩ6Kw#{JzإߜzS"ʏ38gr`yC aN]͚>iwkնbں۱v`x%푻0TwW^ȷ[m `q%\xÑ,GN.O>2UuѬP~eYl֠4q~<<ּ;v1l_a;sʨ9}&T2S!ISiL3+p] & Xr. .i-Jg"d =G5x8`Jד9QJ]RH=,h. -@''nM +@U;&GFL@ӳPtN>/[GF&s#٩Sctm|[6fmgd eg@Cp`GѲhh~ضoM?79zB)h&z k~9{J(<&qpJF}űgqН> dd6VF!7]QI4] ,:X6vF'Oc;s2VZRW_G"(tb,u1 ܼD8c c%p1L xi(y!éoyLE[5 IGˊhPL>ZS;<$MF dmX滭 M&[pJQ V3CIPt|_~werhW5oP@36- 3o*G&=Oǻ_<uѩQ_saؚn5inkFi ݴ'@m^x/XlyԜhǚAɯ].gH&2wA7G9(+8F<}g*f7jYZ݇؏tE0OgEceb?BmX꡼kJÁD=uXcH#>dKaM"(O 9 Hn.@'"S.Z!9wl ω-+v  `=XZnGw!^dq4Gdl vA|Es` ~$ey`uC HmOw1&09YLjZ_pG ::HG1.W!e]謶\@ i3}GUc/oXmHg9mC\@ZlZf?c7ෝc9_ӈråO{$-$ dDm>Eͷpyҏ}Qw).\ղ>l9+X𝹉Jt/hIvZT}[)rEWʆfx~ZuEG#4OfFM=c^;[}G@8D&R 7MIpme .Nv" c8ƵC5C,j=>Bi!~Ң<&%rqiAÒ w׋9 >1JA kc^D U@rGǐ7+YM!AN[d7xi*#T^c]ؙA\BzIACIAļ+wЙCǐ>@iǑz~z L"x䭪6p,Ewqiˉ9;wħ bD|W?3:< >@[hMݼD) W4U۸P; wOZݶj`t[X2+rASZU. '~ @f)9bt5A?B[7dҭ{ AgPQ, b&8iSon3\Uz1DsA|b ֟_ODgrݩ(QT&ɢV% {3=t˧,'_TEӃ.6]FO%-m(A|n >^6C䑶A&ɺeɷ^4I2p eϖdJ:5%wG0DJRS[ IS(L.E[vfe@E?7D1&fs Ș?Oώ5P()&S#=dDB1aVE7l6EڌBm3eM57c@Ɣ~bzz]lgfҊI̳WJ43"L6=dT6N+O5c^7ygjsoZ^1ì~֖H9\W7T\3,3"/gٜ߱ATBrߨݒƚٱa2DH6#xj4!wIpW9c١9FnEίE1`tCF2uwnӊa%r@Ecmv$j̹ey)tEjَV9nP9l8%0-Qi(7ʆ:3*냩A|u`6"4ƀgai9VǫYHa~^s'=I܎9g91)aTv:=7ϐ;@r40Ns>GG jZ5ii@Y_^ +$[/}~Dn`Nedj9Ro s)R7/K@ƭoj ri1„ <H㷛²}ͣo|-[ܞ+ >{d&a`O/a;K3V1e;`$ifت/JQf"fEѾ՜TlN;j?&n𧻓Ks-* sƑ7^Ŗ*G:EMX4bLB\V N9MnG:uEj٢KK+YPR䵶)J[U֚g:dmjmւJfm[m@ө;fWKֲbYCѷlsuZV75mS5 ,;_j:A&^Ɏ,ϓK1lN6W'"GZ&8[nJn߭=&5S/MpdFFc5X\x nh' [~@ OݐFv!ќ]].;l+B^%Ũ~cCO9=T# k/`(BzY4=ި%%D-ITcFR{?CZ~ϭPM(/@w番S2CkP}Wղۋ9ZMxwW>#JO` ℔8>RO0XO-e~N(d;;}?%:~͵uʕe֞̽.kdn}D(nǥ#|W?|[kMiJ*]"nkC5rӤhtZDagA Č(f_(`jc:&[z׼Q0Qomӳ]I xrkSv/B%.W毺jԞMmJ#vA||AO5BW!bE!(nϥ YL#fQ`#hk?MwG>*QGEU ڏbG"'"0BaF<Ȅr0o*K"P!|V$7?z"]79WtM !`.}wĎc(%jnG{i6M1[JD^#snZ /6gM琞PA}˟;½K3 u``ei[GU̲9$cٱ1b٪6AM4E[:es1|9l[ 6]fd_(7¦x43\@Zh@ BߥRT79s7C̕D>PrZD$FDz=K"B!Xx黑IKxG,3 H/DXlHb>\d=BO's "CXzu#GHncN!&NF֍{bn"IOHlѿt.4Kl1 0ۭ)gd%kt'b*1IK&& t<$ pQ 2f^KFVSqYg#lS ʙS? >qVfղD-1MwWSCPܡ~~`!І"+ͣXSJumI+0tmIJT46҄Gf[%R(Se/AA|2T~Sd4Ř*SewpRW3^ۧ"-avԥX5 P 3t2wcڼ wv]~s)vi9Xs;' DZCOs229S焖U$qQ~`M &dص2Mf!kAe![y; '&#_<hw2OLC[흾u;Ob<ӝhp#Nh%f*^Bg'FwFl0^m޾w pI؀k{PUS~-H{֧@QC|"j{*w>:(\hb?AV.f\IS,F!E顿 "x ,rBp of{,:'/-B S"RНo_:f1aMjv*DTd='FI;nXY},{xmorC ^G2k܃yO:(fӱ4fȣdOM"LmI*]WnĎd.$;v;4nr雑ե;oU4suM7oD[ XbPn6k6c=@(ݞ 77L b>gUrH+@Y(r| ᣜren3d|քH8u?FtsJe:(k9S''*xS$;uְQ)џϥ+qUݽ"prR"O3)4?Q7 }af-ee vO#Nh (Ry/v0U&;9ltJ0iD=2ԷiLi2熾j`HA)*㙦og9ziȚ0-j~:Ikb HPa=澅)\Y Ɇir ,[3HP7B27&TCAX̘en۶  *[7]x[XOv;np)~_2iS5ҰdJUqS*3|m!&%g&twx2>Bt]oKAfQu~lW pBg)E:‰ꓻXo#XPĞ3܁.lC@>ԭy8@wTl)q; }hg٠j5 gQHѝ C+oB'G{tKIv"*-}0,C#c8?'i$83Vis`U=GXDumLjM@c dyA|5+]w! c7ψpbOd#ZΚ_6PY#)HP  A|"'[t)9gp.%8BU(]?75'lҹ8lζ[nP8ʭKdP2YYƛ;w"n?o"e\<ʏf_2.еPShR;?VҤO5lZ9rjR,;W|!"` Y"4)QI%GCew} 9xi$&_?yKwD@(/"}12֦0"8Ъ_0h (b錰\!³cH˛ CdĴԞ.Gr5ү r"o]Wg7ze%ƴn^d3 ]wgݏGܗh(;K4j4O3O`5M߽5=@?@%t"{< >M8$yg sWlq4Q2`f !īH_Koxҍ%~FWҠ_Ix5 D}Zo?~ >f[xF3v'nrNj܃/qA||us E$_(|500xiѷe %嶂8ttE I[HKoVBo#N#-oUIHVWYv ~4oU)„] i2uP ↮Tqo&z! m"TB(6i5X# 5#5 TDw $XZx F"n{i)Y0P0(Xj_^6^{CUNmpe~p7rAGZp 髺f ) qi&jsE%CX꡼;̇h)i,gP>C|zc~6w hKۜ[ޮlG"!"(`}O(ȭղ3bWp[3ׂPE$>ĀHUY[NiBewMJʦJޫ 4yXF`M*a^7r[%*G[w(~S,/(R˦B/LoТ3rۅbl-V uCeEscӎ}x;;].&::&C] ʍe't:3t=f 2hsٽsl RnZT6"AH"0 Cn'[J<^ pai~WWtzU{ݑgXU>WX;6jXW<ߥHv:=EfH!ȤHf8]6 AZ!麡aed"ݴ}`#6 !v|jeTS]8=C A{g gѩH\ĦsɈVU+LF lc$= FnO$jUFacAj=~aU[`.YJ6`gCxMX[ۀLϹ) P52Nup`?ta~~ ͦcVJg_tCF3c===\\Ŭ%a:͠gt6J%Lg'oψΛu 7) wN8;S h2>MZ$_-/NTQnڴ6F^ѐs1VբY\175KUԢU9kfՉIB'nЩ6 TnrOiYOS/cUW%yv5~BUݎuڑፖTGLÀHӸ-y&V`PVJf4\ڽi1QnG8#X4+/_+Դ$w>3X_@-v>O? Z qEAL%nTe v4xe T4jLNFW l깁lVBfhdC7Cq%^1{U+bJلo:)х4#8J+;v9qON H6skbd$Fz_̿vWS?ى[t%'8V#M GV[yՖ;^7We1:k 1ǵm tѢ]WDwW?tb?=kvE~@3fԯUBVvF'7XmmQ"IVFYDmՠo`A|fF(SbH/Aa_1'HG[=<׍xi!ņa~%' I'SVU6C*<ߕMA|$[O8DL&GfBzG MLEP 4,o!%a.ʅCJA nW &ў+UdZ!=V-xƕ4eձo ևx cԐۊ!%Cb lPj'D2̨`2Es)m-Zա4kFf ѕ.2Gc!K]dX;? ΋L? '%W<5\S \N<둓?69E(Pc[s;}t[fmӧm&}Z6}o6F?1O|N&;ƕ>-;M־500M&-}Z&}ZfE(2>-Y &}`#9} {7}``4Ė>-.{i)6 }Z (~iJ֮&!}Z\7[?&5//?yդKN.m9⣜H{KU&N.`ֆM'ҵ. 3qws"0ÑufK;a:y>uC>>6]el؄/6cr/w?O?TLt#F*S}Ic*;IюHAHtPy5 >gi^6PBw9 B׶aMz&5,m'%e0.4aQ-g1zmgM g{XmF۝):V_HYK&iԪ 8Æ@§xUC ծ0U.S<AX>EV?t34j}Wc ]Nc-OC:SlфOT2pbsk52ńOW.hYbs5ޡTrs5q5l+& ]-K:&~~*)n#&d+Zub{#K[Ȫ7t.kCug6XJ$| #B۪A-&.Rd١~#>`*QlhT2ғS$dFQ#RHNA2dKÉT2WS@i=%ZRɴk`S*)(4L5kAQn\iVKT2D=DK*yd( @&Hş`[  3>T29IEfI-~Yd[M$E&{iZ؈u}1n[+e x `2io?m0v6^BH]3t‱OӇPt1Q%(MQ$q`ï9&9Pp MÄn@ 6]vH jP&f6şa}.sA|" escTi5;h;D<(sJ:~@lJ$)cSrG=[vBcC"/>6\ltT#McEԈZ|i>vHsYM&XRi{3΍"JftmX@=A] #8er&?T&tm`Vaՠtm,tmDZ). 9x.ђMz $=׏x>ђM+ . ^LkD6`*H%][Nk (1hI)DH!P ' ]`#Đ G|hI&hҵzڤU<$q)?C n6J5kq ђs)tv9KH_8 x˝Á8^Áaҹfq i'KoB'o#-444%&b ?ku"v2Bݜo>K&+ n6` ,-Bt'@qN}4qhW?gI%_\wJ%_i``j%<-8hI`!k< O"wBo#N'Z 6Bi;&Z r~l£~DZs=CJD<sp-g/I:aP4@ ?UK*lA&n4*cOȚ%0!C'jqOȟb5pBtx(nhݓEu]Oa#_WvQDlO^l^gϑ~&x{P QOz }1!;K5 >R%0w,s\2,s8B|e H˧$L滇'gڽA5ErX:.3QXztDiZ O 0W5Io#? H(7|\cJu6+NA|"RtP0(ңS#lBYA;yU.,i?66XīGlAF"֣n5j0u2җc&("I$e;^Pi#.+tfħ x{Ғ:<|i~o'fb`ߣVeNeIbJ@#IՍu#^Hc*a{GFAHȺA K%~ͅ3dnZ ,jAn[]ex6|kEU1jOC;<ޮ :73ٟX"Ie !r*] 0TW8)o#0#}l>^0tアGgi\3,3K/fyx i \v5ү%ŽM 5__GQ>FAfQ[\G4a{2+pQ)汚ȊQURu?+=Dmҏ,r xhIq(_;LDZ.H}}(yCHuXF=:r.#-Z 槈F{vDڔVi3;-??"GiNז[eUq4 zMv[X*p3i|Yyr=7) 6kAӍ8[`%ƙJ6 U5 5 ? lmoJAi2BUi7>F%+u7 /*^[ AL7WUQV+ \]GAz$2Eۖa-+(윐U~F#}= / yEŚ3U Aou-FBȮB@SG)mUR육u_:UvS!|V QHo]!iX&/=LaQ 3^;v/RߍO! $kA7$ғ09;5[Mki7w|Ƅ9a '+wx@&vwqk[2-)_hd~6as2x Kx?4<m}iˑ'*UqרF#(x^: а%]T p+`^BZ"svgM\?_Cmw&/ҷ,[s9ůofp\DZ m!HKf$-`˪QTAʷH)?5ʔo!MEʧ34 8|郋HFYۅ)`eq u N#-qʿx2:|*8|#nZeX"AN >ѩd)y4\BZަujCLG/- !uvx 33 >Ȱ-S("C⺖ĜTt߶">A42ͨҗyi8#W?ᇟF1'Zpiv2җE]\hE$!B욹gV C6 :JhS !gʎikXZSގ!2w%wvsr䵪/*0in,_OoI]OX_l. SNm9 44ӑ5KbZbW w3]6ER.yQ#%xϣ7+39qs1ҏ2nG|rP$ )+j(1q\$g8 %j gb(?P 2BVղ [R6!vmgZp .N)Y#TG P)AptT_jj.84ۀCZ"kxhF~K7aY[BZ~3cz .`0f(ntls4jDg,oL^xϰh{FFsP*]l05]3~cnuG}"῅c),*[{C ųGs AAZhkM"Cz02-\|G|o^IzȚZP@a6~ٴ@^Ͽ@dekZo;sl7M4:<&,e=bDƱK%vH E.Pmy&PU/. -uBqyUhxθ5H߈]{4D:s;PveUV-l`q1s'Ld2^>>1gS[N!SK@V6bPgtpwTm[d]w#ǽZAB9r^a>Ft JfU/RBj5՛o|~)Gj[c)VX;x:Cx8=(XJQ+P}Ʒ̊CV*Y `XU}#ӑZpWX+$c:]q_#5]]bS*i0)`BT5u0qS1(܃7X0uIZ&˅*ou*|iumGu:WbbUu\{Zs!Hc>F3F{ M"܎6D1ဵ9spP1Ǥwzf68孜\xBg3Gjx 'm%FEx8p( `A|;n 4𻄷#>{#7 0.iid6ʤ&ST/KL*N`39:nYۙWUXC[U6T`=FKGvY gA۷0;"j1RoWtIS䝮نjC w)[-_s"ˀLOY}'vlXZ1iyjqr_)frc7f7,e NMw3ٴ@]G#^rjaf%@#}^ dpJr(C]ݠkcVdTޯf evp`5MeZC[U%޿fTȷ%́*% 4(I_BI";`tI΂ո:RI1$Sem;@ rxf_4om1@3S[TL>&O'% Pvpauvs.6VKVa!V7ed0}e.n{DzR~e>Eh-Ț锘VO[SPM`tQr.pc>['lҪS sǷ;ǏXl"675E׬P-d 0:#`B}@ՊB5Zejtj敢*냩A|U@6 d} xNfm7 ?' ax5J~^s&t%s;r缊V#|knKUbԂD9 NtBZ>ؐ׼AD9}ܽ@MբY F4jҥe_!7:ln;uM7p|VG#)'{}F654 d 0)DժH1Q3d"e_=,hTnn&%i&? Z*-@;(r{,ۛ]j >lAYv~›V|GU}ꊮҗ!:w?@@z5.up0/z>ijE4=c"ܷreԌx }J%Ũ:Yo*_VߧJ,+6y@]QA g 2_hƬm5낂^Xf d!?;c6;C߉a(B nd7m}M5R{>{r#|˪TGGxuN麶GheI۷GF&nK b NN :VY1>f5͞'kTJfo4j"fVCPh]}ZY{FZ2tdPuߟ9E/`J:ܐ}tHI+vEFF*^ZiZmP߹4Ԧ&`Y䐏kMe9weGW߲fFF юk{z3HdJ,YT=6;>nҺ=fKyeC8\jKRE&@^t_/T R_XRL7:_}eGܰl7cSkdյ Ʈǚ&$bȌLrgtʦƝ)f9bת^,U*\#ă4Sʦdvj^3 ќ ;G4D~!?N{Az Y7i|MG% #°5h}a)2Sf{prّ\ٷgtmɬȗTI׫o[^S{mf)piN=(#6H-'bӽMc-{&`V.!>H]+ҽ0lhOfoOZ.lfjte\\v|2 yzp`3os98WWe+Dw:h:֍l)5x1Nۻ֛_鵛24mFZ-dW;{Wp /^;Tj3[Cr I-?WLPҿ-# - |K] #8e?O/HjK7FdbCv#9H 4ſ`(F6Y4=CK NBJA i܊ d0̈2*UdZ!=%$#xƕf.lN1}!},2䩁PP+AˠZVQm[==m%ҳMꐺ_ Rpf6T#7M^]9AI1a#gAÌ&T}AbH-W+F0ס?5][zּQ0:l{3af_=WMjowxrkS^RbmJ.j5nkFjݴC@.m^x 0/بF^b>Bgn-jUqOڅ,NKzP(ܤ|a̅N7iO0!a(~ϴ_4P' 7Dh(CyEהUl}"%(,D$PcEPHd~)5,wADrCZXA 0t‚GPX]e'47!H6ˋto)RViec3q'ME&:VOߺ٥>$^ "B-FF@O"p1.-tMIN-eaqvy%u,8t_R PޭC0ognN!G|d`.U׏x })5 _iCdY]&o5.`f;dີ;">Fq 9j9}O~A_`vq[G!xǟ8~Ov63ODNnn@$E$H(H~" AīH_L.}\`&85 '5,"I[HK"{PmiJSR-A톁MU:& ݮ ~\>"]3؎[3_ɼA!p_W 8JF'wR5;fz umpߤ?QVvʳQLC*UT&=CJפV4'? cm/aev*Ȋ")6a [[sI7Sl`&fh sH?1džBz351CH- +tBV{*cCCE3F|s ˤH0BvO0x8Q[EFHu_"xh6(9k)g!AϊenjEjpJx>OK;\.(!ZdЃS)NwVs~!^AZh7vDZh▜A!īHo9$fP( NCeːI[/[}R[dnk=齋 M=([i7|g=Hr݈g\zeG^`A|:>A^Db#/7x KyˈiҮ 8. n#tXݨK#WW^Lׁ?G_!"*-ߥ pIRJs?joFq rU)5!"!WHW{ׁmFoo#_!g]^0OܦOz.kum( >վ/Xoa/Vw9쐏 >=Gޗ0G6n G9ceWᶯa{EZȭo:Z؏~z9oMR0ӀB5xM+EDC@Z訛_X)I'u [' [wPFT >BQ{r1BeK]P"<#QuP|rs]!$/;7:47JVeQTߩ#'tϧ(Y/B>MR(V]x1e)E8{w-8BP >kZ5ށXnUE'UY?ԔE2-|o@if7Z(Sɿ!P h'ŊRx.T-Z=8H*̝!hiRlS]+49)EުtM,b!˶tZm~:הѬ|kg3*S_yuOJupJ5I~Jgtl%#,U)&v8e;j9 H :k2F&1B7H( Upi H-E'tväF ʔkjNO{Sk-cҜytAf[A~#iLwێ%n ^oЕ[gy#W/cqòEMP|rSw/;(H_o5@UR0o^[M? _^unp翹e]12O5 Hc9h;Y0 U1-/=CL1Q6yQl1!FMmTZ󦔐ᬟ(,u\Qk$竖YQH(U E<J=cjU()Gfi8=&<xr p2SY: F<d'G 7Ign3aqeDg"dїDM&?6z∖(Rq;Jwh Kmtgj\h.]OO^q:dɄ$GV_idfz~cתq! ЬvF'q#H ]&,uaݚ 3Xw2Z"*}0!#?%&ɿzOO6pK0Y hZTl1v~ci 84B3 #Ff Ź!x Y>ohvY(M|IolmKB9ĄiF,߿!*R1OD9\Q,1W-x)CzHh\y :nsA|"˂q:HytpILp-lqV%' I4$ jXj 6YH~B #(Ce''l245UU7K~^[23vl^oc!}12QH;7:vG6AGDC >CZ,;m#r* Ӎe%9FQ8*cqMڗSx-bCCҌޮ/ꅹ̷d ]PȽ3x+4'ǽmoG!і1N!=ifvq[Gq&BYDKf!)\:G|"-3 E$BqM'Qo$Z2 o.^Md3 DOdS02 m'2 ;ßF ,$Qg d䲃8+ԉBl H?xf!/(P\I؀B2T# 3Hh/f9xgHdj9xiw&" \D7/EDzPZ{k$3x{@29I'#-,Sdf)ct2-Y$mħHϧsbgS9O.J9Ȝ ŭg du=3H7½pvO##=/H (6ITq+IDgh5{;{XjjS#Ŧg/('`X?:Co(A,;!Hʠ94z1'l@}QL Hu:5Lpi{9e83-ȯTc򞆤=}յLΰ7\;FucISa&a[hhg"k$=ǓDuI.ɅY4.,йSZأC^~mZlx1Ϟ~ olFqF7Y pTRC]{}z|FdDvH\VH yjwe՛"kUh w|ضah{!C߅~QR;e(?`t^ki8i ;D jTFݫdfl3KŝAAܩ^g*Ö;* H.#@'u<$p4'c!y FN؋tods d1Ac}HԎ' VÈgw_Iz Ȍsא2aj.ӎQ:UhL{_wXA-l:k%*mw X>n }#EӃ2GȖKZ.|[PS\3ؔ8UPYYJY-98x5 3 $#Gi~jT1'Kr:JPԁI,hNRkgpph284wz&9jN4vq<"AyC@=;n_"-4~Oa>F#tE7-M̐5u*lhBJD\Q@f#EF{wK)!-e7N\.2]ҩék-nz#ggR."`>Fm*lvPH)@|*FRv+/]u5YHzRu|K biƆ2qɲ.VV UXW6<:xU/ 3Fdvnw TemL(A9S:gCd|~P/dMMS͓SEREk)2K^XԨK2Xo=EVȒXڦ-Dsv=D*zo+7Pa2Umvl tk[Edz# N%mrF׈R8^Y,ϓ:؊I&-679q~2W676Gt^k4:9ɮZyF,:?ZiuXVvuodnݚeEc8碩07l{h+ؾ`ΆGl>q$h0Q_=/;^+[QO}aW{>\T*YY5<#A'D Վr+TwK'b2KV`Y'3gγ%jԒev*K_R+jT⒠-8V1x'hșyV1S|%eC %gqY'*}'f6۠m!JJ8ĥI)f 7ǂCYں33RXV7, o9y39r<vh{5n.qmއ|?yRopKRݛTb]f !aBܒBT@IB]̏H,NüVVҘ8ny2nepj)X0?785.ZTIjG=k 3,PxWƱaq(<2/'`<~07ĢHr?-ԋ \2עp:P;dwta!C$4yL$t%|F] %yNugs; yIOLX"*xGI"28<6T_(pʂbSS^ƀǥbĔy |Z[5iQX z"%D rTTE=.BQZFo"K 1Ժ$A<|7NOs+iAM2GQ'rtp.ZKSw G mݶG!Kz=hWcO@>!CBO_,;G&,mt.}-oroɻ=*mq%MGnt=oT&FM=/W=!R1KC>K2,)K|\Fuz\Zu "{;ɻ;*~C\I^vւ(m'PxQuDcC [.VV;^*fx 8<Y~۰reBJ1g IF1''##Rg ֋!#RӐOOXmK.[NgM.߆>~=YfKefSnv>04+`H6 m 
FdEeaf.7SԀT5"Vd\VIO 0c(6>Xq*~֔h5m.]͸:ꃄn5wDf0\#{w|E{?bw-]ˋ`v1 ^|1gC\I8ESp #FZ:dnh pwJc]k*J >Q2Ij SaZYV}jxEu:D8pBy4ש8}T.[bin=Zȸ pQϨ٨)q!7Պ]ڮE]:qTӗtZ7"O=7~zwmS&O5O[_G2Q|ںe6*6-R;F[5)?F3艪?hM:zu_VsPn7 v/9xWJ!.MOT/Ý}nb-*xAe՜e{J'-1_Z5fEe}w m.1XX{zZ=6=;&g4DAlM Cޯʺ]sD٘ $xxumz(hox%MwyIY{ş"H0 RGԜ&5wg 5xC"EU.Wsl6::_޵͜#b!nCBuM<ڥ־~Ő#M$ˀoCۊ9wDf!gQdKY]#NY)byCE/a^XΙ+YͰբğ}uygqdcMcۖ?Z2oB:{*߂-m{qɎB6;8ĥQJ/5H!Bn(=^XWl%4rzl\h qp#,qr3sgFfK<><΢ :=21ܒxmhJ.H R<`Oi5Ӭ>]0}ě͌[ӐՃ폒pG) #ۙ6E^״:f"}g&<ÖP@px?C| =%о@utTbc' r*n^h t!ڋ(+F5onC ג)br 5f;lE}d ;c6 ~Ҕκƛ-a7u3O//Y.;ϼc]>YEl^Y߅wf)L-}Pm얙4PyXtVrFk Ӌ7]RM6ɔ=Ϯc9ʆljXx=x{X*2yK0|<:?7R55&''GG'Ϧoo"R*{S|Ǔl-e(mZS8Aqij'8bvn -TF~a:׍`[\j[䞉q}E>Y%  1;}1.A|7Pyw[Ý;#G46I[xaE<]82;fRj6n\ګR{xd k%( O^5T Ҥ : zd'Sk˥7KD"w52._w؃WWe!D\ܹY:McwqXOYWm,ٜpF1oiGӭMЎKu{@ٵH'?gG$?x&ŧ,5!=U6"3KrҒk 貖*o߿yS7h^2fZ5L 3l<5!L$s ]QΕ޸|(kvp![}=ĭu9t1R{dg'9aNѯd=ܵhH Z|AQR>_ 8<Y66zKg IF1''+Rg ֋!+RӐW{sr׭bmL(\"H.߆ ,%2ao:aYxГkfhO.Uˮ\opX3mNB VQ&G25TAt!XnZ*~ChE ؚvۗ 5:;!K)ʧԭ:X"jL5bXLC>܆>?dYR}1<9!0S,]_ip\yېhSƊ/%c!?TVGROM~8*S + 6D9R.]pn!TaRŤB>}7|T%{]ѡjX=ɏ9W4Blg'\ Nd噆TҢpetJ U ".Tsr} xIe33̊VeJ>qO^NART~h|dOŜ$J iU\*mxwwYQށ|GE]H HMW!)g7:f+l&N:/Bζ-{$MxMI45הu}XbGoA S #zXk\Mz˶y)Wbm`rF<"&/U) |m+\g5|lbxCW~⛟`=ǟzLӱCf֯\a>O#[PT,W -Ȗv%J{äQ¾%CaКf!J⒟ѡ] #p`6|kS%{mOmdE;}V1Be X BBTMGC:{9_0-ͅkjՐ&+b!%cTedg-NIWlA`%%i=n !G~w5Κn\&?~e71ckl*~Tu9xTFcd_Bv#͑o]3q 5_k31L4;Uf E';T#F#DDx*>NZWoCӁΟT!]rJğ3a@0#4p=YZ @&|p OvAK=7GOxLJ֮Uy 0bX(6OG` \e TRhfB.0&ZFTژ!D5,AǸl W%Tb#Zy ,l'\s%g [r&ǨǛyY>@c,l"5i+M]ϯR"^8vgp?~o/-o&[ï$;-,8oOyΟbҔGĀe38}\l eV)'T{EJLt*1 Z+!/۵bf]Εk<=/RƮ^Td+U#^51X5G5#=Yo~}A(<^;8T743kSq)Ӛ산r&\nQ6z߅e73Η\k3Zoe+$ڣr:{łS4]:p%ɏ2߱/(guygˮg;J KBLB5h!@d;eǍZm-Χ04_.:˳NOO +ЩKV2-،љx*-'MLCDz|jtt"Nѫҷ᛬'tJKهY750&SgǾ0)z?S;jZFvۖ=Fwt`ۼiA]dt#>ۙ _9]P~rkc`kS$.D~2 r}yghոAqֺܹmNmyt+jF [κK9Gg`76d^;-ZvP[|0YjJ-`EC]f|~_tq+ݼ~FeqoRfPei& rKS\rE>nODC\@*:áfhCORܒr:}=<љ7@;SC]n ϶7ԨrM"^ GcFal͕kscK slzɉcpcl̏Sas~D7륛Jsΰј[RkVvlwg0ݡ5֒YpO?)Z9v4~|oǏropJ֎ 9ǭ~}:cO;OZXsO2y=[X) {Owk\sfq*!7}yΆ;??eCOeaf/configure0000755000176200001440000025315014660712374012734 0ustar liggesusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.71 for eaf 2.5. # # # Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="as_nop=: if test \${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else \$as_nop case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ) then : else \$as_nop exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 blah=\$(echo \$(echo blah)) test x\"\$blah\" = xblah || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null then : as_have_required=yes else $as_nop as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null then : else $as_nop as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && as_run=a "$as_shell" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$as_shell as_have_required=yes if as_run=a "$as_shell" -c "$as_bourne_compatible""$as_suggested" 2>/dev/null then : break 2 fi fi done;; esac as_found=false done IFS=$as_save_IFS if $as_found then : else $as_nop if { test -f "$SHELL" || test -f "$SHELL.exe"; } && as_run=a "$SHELL" -c "$as_bourne_compatible""$as_required" 2>/dev/null then : CONFIG_SHELL=$SHELL as_have_required=yes fi fi if test "x$CONFIG_SHELL" != x then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. printf "%s\n" "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno then : printf "%s\n" "$0: This script requires a shell more modern than all" printf "%s\n" "$0: the shells that I found on your system." if test ${ZSH_VERSION+y} ; then printf "%s\n" "$0: In particular, zsh $ZSH_VERSION has bugs and should" printf "%s\n" "$0: be upgraded to zsh 4.3.4 or later." else printf "%s\n" "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_nop # --------- # Do nothing but, unlike ":", preserve the value of $?. as_fn_nop () { return $? } as_nop=as_fn_nop # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { printf "%s\n" "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='eaf' PACKAGE_TARNAME='eaf' PACKAGE_VERSION='2.5' PACKAGE_STRING='eaf 2.5' PACKAGE_BUGREPORT='' PACKAGE_URL='' ac_subst_vars='LTLIBOBJS LIBOBJS GSL_LIBS GSL_CFLAGS GSL_CONFIG target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir runstatedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' runstatedir='${localstatedir}/run' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -runstatedir | --runstatedir | --runstatedi | --runstated \ | --runstate | --runstat | --runsta | --runst | --runs \ | --run | --ru | --r) ac_prev=runstatedir ;; -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ | --run=* | --ru=* | --r=*) runstatedir=$ac_optarg ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: \`$ac_useropt'" ac_useropt_orig=$ac_useropt ac_useropt=`printf "%s\n" "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. printf "%s\n" "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && printf "%s\n" "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir runstatedir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures eaf 2.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/eaf] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of eaf 2.5:";; esac cat <<\_ACEOF Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for configure.gnu first; this name is used for a wrapper for # Metaconfig's "Configure" on case-insensitive file systems. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else printf "%s\n" "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF eaf configure 2.5 generated by GNU Autoconf 2.71 Copyright (C) 2021 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## ac_configure_args_raw= for ac_arg do case $ac_arg in *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_configure_args_raw " '$ac_arg'" done case $ac_configure_args_raw in *$as_nl*) ac_safe_unquote= ;; *) ac_unsafe_z='|&;<>()$`\\"*?[ '' ' # This string ends in space, tab. ac_unsafe_a="$ac_unsafe_z#~" ac_safe_unquote="s/ '\\([^$ac_unsafe_a][^$ac_unsafe_z]*\\)'/ \\1/g" ac_configure_args_raw=` printf "%s\n" "$ac_configure_args_raw" | sed "$ac_safe_unquote"`;; esac cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by eaf $as_me 2.5, which was generated by GNU Autoconf 2.71. Invocation command line was $ $0$ac_configure_args_raw _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac printf "%s\n" "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`printf "%s\n" "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Sanitize IFS. IFS=" "" $as_nl" # Save into config.log some information that might help in debugging. { echo printf "%s\n" "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo printf "%s\n" "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then printf "%s\n" "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`printf "%s\n" "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac printf "%s\n" "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then printf "%s\n" "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && printf "%s\n" "$as_me: caught signal $ac_signal" printf "%s\n" "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h printf "%s\n" "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. printf "%s\n" "#define PACKAGE_NAME \"$PACKAGE_NAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"" >>confdefs.h printf "%s\n" "#define PACKAGE_VERSION \"$PACKAGE_VERSION\"" >>confdefs.h printf "%s\n" "#define PACKAGE_STRING \"$PACKAGE_STRING\"" >>confdefs.h printf "%s\n" "#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"" >>confdefs.h printf "%s\n" "#define PACKAGE_URL \"$PACKAGE_URL\"" >>confdefs.h # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. if test -n "$CONFIG_SITE"; then ac_site_files="$CONFIG_SITE" elif test "x$prefix" != xNONE; then ac_site_files="$prefix/share/config.site $prefix/etc/config.site" else ac_site_files="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi for ac_site_file in $ac_site_files do case $ac_site_file in #( */*) : ;; #( *) : ac_site_file=./$ac_site_file ;; esac if test -f "$ac_site_file" && test -r "$ac_site_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 printf "%s\n" "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 printf "%s\n" "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 printf "%s\n" "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 printf "%s\n" "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 printf "%s\n" "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 printf "%s\n" "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { printf "%s\n" "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 printf "%s\n" "$as_me: former value: \`$ac_old_val'" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 printf "%s\n" "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`printf "%s\n" "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;} { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 printf "%s\n" "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`${MAKE-make} distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu # This doesn't work in MacOS #AC_INIT([eaf],m4_esyscmd_s(awk -e '/^Version:/ {print $2}' DESCRIPTION)) ## Do we need this? # : ${R_HOME=`R RHOME`} # if test -z "${R_HOME}"; then # echo "could not determine R_HOME" # exit 1 # fi # CC=`"${R_HOME}/bin/R" CMD config CC` # CFLAGS=`"${R_HOME}/bin/R" CMD config CFLAGS` # CPPFLAGS=`"${R_HOME}/bin/R" CMD config CPPFLAGS` # CXX=$(${R_HOME}/bin/R CMD config CXX) # CXXFLAGS=$("${R_HOME}/bin/R" CMD config CXXFLAGS) # # Checks for common programs using default macros # AC_PROG_CC PKG_CONFIG_NAME="gsl-config" PKG_DEB_NAME="libgsl-dev" PKG_RPM_NAME="libgsl-dev" PKG_BREW_NAME="gsl" ## Use gsl-config to find arguments for compiler and linker flags ## ## Check for non-standard programs: gsl-config(1) # Extract the first word of "$PKG_CONFIG_NAME", so it can be a program name with args. set dummy $PKG_CONFIG_NAME; ac_word=$2 { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 printf %s "checking for $ac_word... " >&6; } if test ${ac_cv_path_GSL_CONFIG+y} then : printf %s "(cached) " >&6 else $as_nop case $GSL_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_GSL_CONFIG="$GSL_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then ac_cv_path_GSL_CONFIG="$as_dir$ac_word$ac_exec_ext" printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi GSL_CONFIG=$ac_cv_path_GSL_CONFIG if test -n "$GSL_CONFIG"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $GSL_CONFIG" >&5 printf "%s\n" "$GSL_CONFIG" >&6; } else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 printf "%s\n" "no" >&6; } fi ## If gsl-config was found, let's use it if test "${GSL_CONFIG}" != ""; then # Use $PKG_CONFIG_NAME for header and linker arguments GSL_CFLAGS=`${GSL_CONFIG} --cflags` GSL_LIBS=`${GSL_CONFIG} --libs` else # Customize the error as_fn_error $? " --------------------------- EAF PACKAGE -------------------------------- Configuration failed because $PKG_CONFIG_NAME was not found. Try installing: * Debian, Ubuntu, etc: sudo apt-get install $PKG_DEB_NAME * Fedora, CentOS, RHEL: sudo yum install $PKG_RPM_NAME * Mac OSX: brew install $PKG_BREW_NAME If $PKG_CONFIG_NAME is already installed, check that 'pkg-config' is in your PATH and PKG_CONFIG_PATH contains a $PKG_CONFIG_NAME.pc file. If pkg-config is unavailable you can set INCLUDE_DIR and LIB_DIR manually via: R CMD INSTALL --configure-vars='INCLUDE_DIR=... LIB_DIR=...' -------------------------- ERROR MESSAGE --------------------------- cat configure.log -------------------------------------------------------------------- " "$LINENO" 5 fi # Now substitute these variables in src/Makevars.in to create src/Makevars ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 printf "%s\n" "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test ${\1+y} || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 printf "%s\n" "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { printf "%s\n" "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 printf "%s\n" "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`printf "%s\n" "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 printf "%s\n" "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh as_nop=: if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1 then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else $as_nop case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi # Reset variables that may have inherited troublesome values from # the environment. # IFS needs to be set, to space, tab, and newline, in precisely that order. # (If _AS_PATH_WALK were called with IFS unset, it would have the # side effect of setting IFS to empty, thus disabling word splitting.) # Quoting is to prevent editors from complaining about space-tab. as_nl=' ' export as_nl IFS=" "" $as_nl" PS1='$ ' PS2='> ' PS4='+ ' # Ensure predictable behavior from utilities with locale-dependent output. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # We cannot yet rely on "unset" to work, but we need these variables # to be unset--not just set to an empty or harmless value--now, to # avoid bugs in old shells (e.g. pre-3.0 UWIN ksh). This construct # also avoids known problems related to "unset" and subshell syntax # in other old shells (e.g. bash 2.01 and pdksh 5.2.14). for as_var in BASH_ENV ENV MAIL MAILPATH CDPATH do eval test \${$as_var+y} \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done # Ensure that fds 0, 1, and 2 are open. if (exec 3>&0) 2>/dev/null; then :; else exec 0&1) 2>/dev/null; then :; else exec 1>/dev/null; fi if (exec 3>&2) ; then :; else exec 2>/dev/null; fi # The user is always right. if ${PATH_SEPARATOR+false} :; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS case $as_dir in #((( '') as_dir=./ ;; */) ;; *) as_dir=$as_dir/ ;; esac test -r "$as_dir$0" && as_myself=$as_dir$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then printf "%s\n" "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi printf "%s\n" "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null then : eval 'as_fn_append () { eval $1+=\$2 }' else $as_nop as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null then : eval 'as_fn_arith () { as_val=$(( $* )) }' else $as_nop as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # Determine whether it's possible to make 'echo' print without a newline. # These variables are no longer used directly by Autoconf, but are AC_SUBSTed # for compatibility with existing Makefiles. ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac # For backward compatibility with old third-party macros, we provide # the shell variables $as_echo and $as_echo_n. New code should use # AS_ECHO(["message"]) and AS_ECHO_N(["message"]), respectively. as_echo='printf %s\n' as_echo_n='printf %s' rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`printf "%s\n" "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by eaf $as_me 2.5, which was generated by GNU Autoconf 2.71. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF ac_cs_config=`printf "%s\n" "$ac_configure_args" | sed "$ac_safe_unquote"` ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\''/g"` cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ eaf config.status 2.5 configured by $0, generated by GNU Autoconf 2.71, with options \\"\$ac_cs_config\\" Copyright (C) 2021 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) printf "%s\n" "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) printf "%s\n" "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`printf "%s\n" "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) printf "%s\n" "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \printf "%s\n" "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX printf "%s\n" "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "src/Makevars") CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test ${CONFIG_FILES+y} || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`printf "%s\n" "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` printf "%s\n" "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { printf "%s\n" "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 printf "%s\n" "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`printf "%s\n" "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || printf "%s\n" X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`printf "%s\n" "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`printf "%s\n" "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 printf "%s\n" "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 printf "%s\n" "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 printf "%s\n" "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi eaf/man/0000755000176200001440000000000014500025511011551 5ustar liggesuserseaf/man/eafplot.Rd0000644000176200001440000001546614660120021013505 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eafplot.R \name{eafplot} \alias{eafplot} \alias{eafplot.default} \alias{eafplot.formula} \alias{eafplot.list} \title{Plot the Empirical Attainment Function for two objectives} \usage{ eafplot(x, ...) \method{eafplot}{default}( x, sets = NULL, groups = NULL, percentiles = c(0, 50, 100), attsurfs = NULL, xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL, log = "", type = "point", col = NULL, lty = c("dashed", "solid", "solid", "solid", "dashed"), lwd = 1.75, pch = NA, cex.pch = par("cex"), las = par("las"), legend.pos = "topright", legend.txt = NULL, extra.points = NULL, extra.legend = NULL, extra.pch = 4:25, extra.lwd = 0.5, extra.lty = NA, extra.col = "black", maximise = c(FALSE, FALSE), xaxis.side = "below", yaxis.side = "left", axes = TRUE, sci.notation = FALSE, ... ) \method{eafplot}{formula}(formula, data, groups = NULL, subset = NULL, ...) \method{eafplot}{list}(x, ...) } \arguments{ \item{x}{Either a matrix of data values, or a data frame, or a list of data frames of exactly three columns.} \item{...}{Other graphical parameters to \code{\link[=plot.default]{plot.default()}}.} \item{sets}{(\link{numeric})\cr Vector indicating which set each point belongs to.} \item{groups}{This may be used to plot profiles of different algorithms on the same plot.} \item{percentiles}{(\code{numeric()}) Vector indicating which percentile should be plot. The default is to plot only the median attainment curve.} \item{attsurfs}{TODO} \item{xlab, ylab, xlim, ylim, log, col, lty, lwd, pch, cex.pch, las}{Graphical parameters, see \code{\link[=plot.default]{plot.default()}}.} \item{type}{(\code{character(1)})\cr string giving the type of plot desired. The following values are possible, \samp{points} and \samp{area}.} \item{legend.pos}{the position of the legend, see \code{\link[=legend]{legend()}}. A value of \code{"none"} hides the legend.} \item{legend.txt}{a character or expression vector to appear in the legend. If \code{NULL}, appropriate labels will be generated.} \item{extra.points}{A list of matrices or data.frames with two-columns. Each element of the list defines a set of points, or lines if one of the columns is \code{NA}.} \item{extra.legend}{A character vector providing labels for the groups of points.} \item{extra.pch, extra.lwd, extra.lty, extra.col}{Control the graphical aspect of the points. See \code{\link[=points]{points()}} and \code{\link[=lines]{lines()}}.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{xaxis.side}{On which side that x-axis is drawn. Valid values are \code{"below"} and \code{"above"}. See \code{\link[=axis]{axis()}}.} \item{yaxis.side}{On which side that y-axis is drawn. Valid values are \code{"left"} and \code{"right"}. See \code{\link[=axis]{axis()}}.} \item{axes}{A logical value indicating whether both axes should be drawn on the plot.} \item{sci.notation}{Generate prettier labels} \item{formula}{A formula of the type: \code{time + cost ~ run | instance} will draw \code{time} on the x-axis and \code{cost} on the y-axis. If \code{instance} is present the plot is conditional to the instances.} \item{data}{Dataframe containing the fields mentioned in the formula and in groups.} \item{subset}{(\code{integer()} | \code{NULL})\cr A vector indicating which rows of the data should be used. If left to default \code{NULL} all data in the data frame are used.} } \value{ Return (invisibly) the attainment surfaces computed. } \description{ Computes and plots the Empirical Attainment Function, either as attainment surfaces for certain percentiles or as points. } \details{ This function can be used to plot random sets of points like those obtained by different runs of biobjective stochastic optimisation algorithms. An EAF curve represents the boundary separating points that are known to be attainable (that is, dominated in Pareto sense) in at least a fraction (quantile) of the runs from those that are not. The median EAF represents the curve where the fraction of attainable points is 50\%. In single objective optimisation the function can be used to plot the profile of solution quality over time of a collection of runs of a stochastic optimizer. } \section{Methods (by class)}{ \itemize{ \item \code{eafplot(default)}: Main function \item \code{eafplot(formula)}: Formula interface \item \code{eafplot(list)}: List interface for lists of data.frames or matrices }} \examples{ data(gcp2x2) tabucol <- subset(gcp2x2, alg != "TSinN1") tabucol$alg <- tabucol$alg[drop=TRUE] eafplot(time + best ~ run, data = tabucol, subset = tabucol$inst=="DSJC500.5") \donttest{# These take time eafplot(time + best ~ run | inst, groups=alg, data=gcp2x2) eafplot(time + best ~ run | inst, groups=alg, data=gcp2x2, percentiles=c(0,50,100), cex.axis = 0.8, lty = c(2,1,2), lwd = c(2,2,2), col = c("black","blue","grey50")) extdata_path <- system.file(package = "eaf", "extdata") A1 <- read_datasets(file.path(extdata_path, "ALG_1_dat.xz")) A2 <- read_datasets(file.path(extdata_path, "ALG_2_dat.xz")) eafplot(A1, percentiles = 50, sci.notation = TRUE, cex.axis=0.6) # The attainment surfaces are returned invisibly. attsurfs <- eafplot(list(A1 = A1, A2 = A2), percentiles = 50) str(attsurfs) ## Save as a PDF file. # dev.copy2pdf(file = "eaf.pdf", onefile = TRUE, width = 5, height = 4) } ## Using extra.points \donttest{ data(HybridGA) data(SPEA2relativeVanzyl) eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") data(SPEA2relativeRichmond) eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(90, 140), ylim = c(0, 25), extra.points = HybridGA$richmond, extra.lty = "dashed", extra.legend = "Hybrid GA") eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(90, 140), ylim = c(0, 25), type = "area", extra.points = HybridGA$richmond, extra.lty = "dashed", extra.legend = "Hybrid GA", legend.pos = "bottomright") data(SPEA2minstoptimeRichmond) SPEA2minstoptimeRichmond[,2] <- SPEA2minstoptimeRichmond[,2] / 60 eafplot (SPEA2minstoptimeRichmond, xlab = expression(C[E]), ylab = "Minimum idle time (minutes)", maximise = c(FALSE, TRUE), las = 1, log = "y", main = "SPEA2 (Richmond)", legend.pos = "bottomright") } } \seealso{ \code{\link[=eafdiffplot]{eafdiffplot()}} \code{\link[=pdf_crop]{pdf_crop()}} } \concept{visualisation} eaf/man/igd.Rd0000644000176200001440000001377014500025511012613 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/igd.R \name{igd} \alias{igd} \alias{IGDX} \alias{igd_plus} \alias{avg_hausdorff_dist} \title{Inverted Generational Distance (IGD and IGD+) and Averaged Hausdorff Distance} \usage{ igd(data, reference, maximise = FALSE) igd_plus(data, reference, maximise = FALSE) avg_hausdorff_dist(data, reference, maximise = FALSE, p = 1L) } \arguments{ \item{data}{(\code{matrix} | \code{data.frame}) \cr Matrix or data frame of numerical values, where each row gives the coordinates of a point.} \item{reference}{(\code{matrix} | \code{data.frame}) \cr Reference set as a matrix or data.frame of numerical values.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{p}{(\code{integer(1)}) Hausdorff distance parameter (default: \code{1L}).} } \value{ (\code{numeric(1)}) A single numerical value. } \description{ Functions to compute the inverted generational distance (IGD and IGD+) and the averaged Hausdorff distance between nondominated sets of points. } \details{ The generational distance (GD) of a set \eqn{A} is defined as the distance between each point \eqn{a \in A} and the closest point \eqn{r} in a reference set \eqn{R}, averaged over the size of \eqn{A}. Formally, \deqn{GD_p(A,R) = \left(\frac{1}{|A|}\sum_{a\in A}\min_{r\in R} d(a,r)^p\right)^{\frac{1}{p}} }{GD(A,R) = (1/|A|) * ( sum_{a in A} min_{r in R} d(a,r)^p )^(1/p)} where the distance in our implementation is the Euclidean distance: \deqn{d(a,r) = \sqrt{\sum_{k=1}^M (a_k - r_k)^2} }{d(a,r) = sqrt( sum_{k=1}^M (a_k - r_k)^2)} The inverted generational distance (IGD) is calculated as \eqn{IGD_p(A,R) = GD_p(R,A)}. The modified inverted generational distanced (IGD+) was proposed by \citet{IshMasTanNoj2015igd} to ensure that IGD+ is weakly Pareto compliant, similarly to \code{\link[=epsilon_additive]{epsilon_additive()}} or \code{\link[=epsilon_mult]{epsilon_mult()}}. It modifies the distance measure as: \deqn{d^+(r,a) = \sqrt{\sum_{k=1}^M (\max\{r_k - a_k, 0\})^2}}{d^+(r,a) = sqrt(sum_{k=1}^M (max {r_k - a_k, 0 })^2)} The average Hausdorff distance (\eqn{\Delta_p}) was proposed by \citet{SchEsqLarCoe2012tec} and it is calculated as: \deqn{\Delta_p(A,R) = \max\{ IGD_p(A,R), IGD_p(R,A) \}} IGDX \citep{ZhoZhaJin2009igdx} is the application of IGD to decision vectors instead of objective vectors to measure closeness and diversity in decision space. One can use the functions \code{igd()} or \code{igd_plus()} (recommended) directly, just passing the decision vectors as \code{data}. There are different formulations of the GD and IGD metrics in the literature that differ on the value of \eqn{p}, on the distance metric used and on whether the term \eqn{|A|^{-1}} is inside (as above) or outside the exponent \eqn{1/p}. GD was first proposed by \citet{VelLam1998gp} with \eqn{p=2} and the term \eqn{|A|^{-1}} outside the exponent. IGD seems to have been mentioned first by \citet{CoeSie2004igd}, however, some people also used the name D-metric for the same concept with \eqn{p=1} and later papers have often used IGD/GD with \eqn{p=1}. \citet{SchEsqLarCoe2012tec} proposed to place the term \eqn{|A|^{-1}} inside the exponent, as in the formulation shown above. This has a significant effect for GD and less so for IGD given a constant reference set. IGD+ also follows this formulation. We refer to \citet{IshMasTanNoj2015igd} and \citet{BezLopStu2017emo} for a more detailed historical perspective and a comparison of the various variants. Following \citet{IshMasTanNoj2015igd}, we always use \eqn{p=1} in our implementation of IGD and IGD+ because (1) it is the setting most used in recent works; (2) it makes irrelevant whether the term \eqn{|A|^{-1}} is inside or outside the exponent \eqn{1/p}; and (3) the meaning of IGD becomes the average Euclidean distance from each reference point to its nearest objective vector). It is also slightly faster to compute. GD should never be used directly to compare the quality of approximations to a Pareto front, as it often contradicts Pareto optimality (it is not weakly Pareto-compliant). We recommend IGD+ instead of IGD, since the latter contradicts Pareto optimality in some cases (see examples below) whereas IGD+ is weakly Pareto-compliant, but we implement IGD here because it is still popular due to historical reasons. The average Hausdorff distance (\eqn{\Delta_p(A,R)}) is also not weakly Pareto-compliant, as shown in the examples below. } \examples{ # Example 4 from Ishibuchi et al. (2015) ref <- matrix(c(10,0,6,1,2,2,1,6,0,10), ncol=2, byrow=TRUE) A <- matrix(c(4,2,3,3,2,4), ncol=2, byrow=TRUE) B <- matrix(c(8,2,4,4,2,8), ncol=2, byrow=TRUE) plot(ref, xlab=expression(f[1]), ylab=expression(f[2]), panel.first=grid(nx=NULL), pch=23, bg="gray", cex=1.5) points(A, pch=1, cex=1.5) points(B, pch=19, cex=1.5) legend("topright", legend=c("Reference", "A", "B"), pch=c(23,1,19), pt.bg="gray", bg="white", bty = "n", pt.cex=1.5, cex=1.2) cat("A is better than B in terms of Pareto optimality,\n however, IGD(A)=", igd(A, ref), "> IGD(B)=", igd(B, ref), "and AvgHausdorff(A)=", avg_hausdorff_dist(A, ref), "> AvgHausdorff(A)=", avg_hausdorff_dist(B, ref), ", which both contradict Pareto optimality.\nBy contrast, IGD+(A)=", igd_plus(A, ref), "< IGD+(B)=", igd_plus(B, ref), ", which is correct.\n") # A less trivial example. extdata_path <- system.file(package="eaf","extdata") path.A1 <- file.path(extdata_path, "ALG_1_dat.xz") path.A2 <- file.path(extdata_path, "ALG_2_dat.xz") A1 <- read_datasets(path.A1)[,1:2] A2 <- read_datasets(path.A2)[,1:2] ref <- filter_dominated(rbind(A1, A2)) igd(A1, ref) igd(A2, ref) # IGD+ (Pareto compliant) igd_plus(A1, ref) igd_plus(A2, ref) # Average Haussdorff distance avg_hausdorff_dist(A1, ref) avg_hausdorff_dist(A2, ref) } \references{ \insertAllCited{} } \author{ Manuel \enc{López-Ibáñez}{Lopez-Ibanez} } \concept{metrics} eaf/man/pdf_crop.Rd0000644000176200001440000000415314405736001013646 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/pdf_crop.R \name{pdf_crop} \alias{pdf_crop} \title{Remove whitespace margins from a PDF file (and maybe embed fonts)} \usage{ pdf_crop( filename, mustWork = FALSE, pdfcrop = Sys.which("pdfcrop"), embed_fonts = FALSE ) } \arguments{ \item{filename}{Filename of a PDF file to crop. The file will be overwritten.} \item{mustWork}{If \code{TRUE}, then give an error if the file cannot be cropped.} \item{pdfcrop}{Path to the \code{pdfcrop} utility.} \item{embed_fonts}{(\code{logical(1)}) If \code{TRUE}, use \code{\link[grDevices:embedFonts]{grDevices::embedFonts()}} to embed fonts.} } \value{ Nothing } \description{ Remove whitespace margins using \url{https://ctan.org/pkg/pdfcrop} and optionally embed fonts using \code{\link[grDevices:embedFonts]{grDevices::embedFonts()}}. You may install \code{pdfcrop} using TinyTeX (\url{https://cran.r-project.org/package=tinytex}) with \code{tinytex::tlmgr_install('pdfcrop')}. } \details{ You may also wish to consider \code{\link[extrafont:embed_fonts]{extrafont::embed_fonts()}} (\url{https://cran.r-project.org/package=extrafont}). \if{html}{\out{

}} As an alternative, saving the PDF with \code{\link[grDevices:cairo]{grDevices::cairo_pdf()}} should already embed the fonts. } \examples{ \dontrun{ extdata_path <- system.file(package = "eaf", "extdata") A1 <- read_datasets(file.path(extdata_path, "wrots_l100w10_dat")) A2 <- read_datasets(file.path(extdata_path, "wrots_l10w100_dat")) pdf(file = "eaf.pdf", onefile = TRUE, width = 5, height = 4) eafplot(list(A1 = A1, A2 = A2), percentiles = 50, sci.notation=TRUE) dev.off() pdf_crop("eaf.pdf") } } \seealso{ \code{\link[grDevices:embedFonts]{grDevices::embedFonts()}} \code{\link[extrafont:embed_fonts]{extrafont::embed_fonts()}} \code{\link[grDevices:cairo]{grDevices::cairo_pdf()}} } eaf/man/write_datasets.Rd0000644000176200001440000000135514531102060015065 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read_datasets.R \name{write_datasets} \alias{write_datasets} \title{Write data sets} \usage{ write_datasets(x, file = "") } \arguments{ \item{x}{The data set to write. The last column must be the set number.} \item{file}{either a character string naming a file or a connection open for writing. \code{""} indicates output to the console.} } \description{ Write data sets to a file in the same format as \code{\link[=read_datasets]{read_datasets()}}. } \examples{ x <- read_datasets(text="1 2\n3 4\n\n5 6\n7 8\n", col_names=c("obj1", "obj2")) write_datasets(x) } \seealso{ \code{\link[utils]{write.table}}, \code{\link[=read_datasets]{read_datasets()}} } \keyword{file} eaf/man/SPEA2minstoptimeRichmond.Rd0000644000176200001440000000171514010304644016636 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{data} \name{SPEA2minstoptimeRichmond} \alias{SPEA2minstoptimeRichmond} \title{Results of SPEA2 when minimising electrical cost and maximising the minimum idle time of pumps on Richmond water network.} \format{ A data frame as produced by \code{\link[=read_datasets]{read_datasets()}}. The second column measures time in seconds and corresponds to a maximisation problem. } \source{ \insertRef{LopezIbanezPhD}{eaf} } \usage{ SPEA2minstoptimeRichmond } \description{ The data has the only goal of providing an example of use of eafplot. } \examples{ data(HybridGA) data(SPEA2minstoptimeRichmond) SPEA2minstoptimeRichmond[,2] <- SPEA2minstoptimeRichmond[,2] / 60 eafplot (SPEA2minstoptimeRichmond, xlab = expression(C[E]), ylab = "Minimum idle time (minutes)", maximise = c(FALSE, TRUE), las = 1, log = "y", legend.pos = "bottomright") } \keyword{datasets} eaf/man/SPEA2relativeVanzyl.Rd0000644000176200001440000000140614010304644015616 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{data} \name{SPEA2relativeVanzyl} \alias{SPEA2relativeVanzyl} \title{Results of SPEA2 with relative time-controlled triggers on Vanzyl's water network.} \format{ A data frame as produced by \code{\link[=read_datasets]{read_datasets()}}. } \source{ \insertRef{LopezIbanezPhD}{eaf} } \usage{ SPEA2relativeVanzyl } \description{ The data has the only goal of providing an example of use of eafplot. } \examples{ data(HybridGA) data(SPEA2relativeVanzyl) eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") } \keyword{datasets} eaf/man/eafdiff.Rd0000644000176200001440000000374714160652431013450 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf.R \name{eafdiff} \alias{eafdiff} \title{Compute empirical attainment function differences} \usage{ eafdiff(x, y, intervals = NULL, maximise = c(FALSE, FALSE), rectangles = FALSE) } \arguments{ \item{x, y}{Data frames corresponding to the input data of left and right sides, respectively. Each data frame has at least three columns, the third one being the set of each point. See also \code{\link[=read_datasets]{read_datasets()}}.} \item{intervals}{(\code{integer(1)}) \cr The absolute range of the differences \eqn{[0, 1]} is partitioned into the number of intervals provided.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{rectangles}{If TRUE, the output is in the form of rectangles of the same color.} } \value{ With \code{rectangle=FALSE}, a \code{data.frame} containing points where there is a transition in the value of the EAF differences. With \code{rectangle=TRUE}, a \code{matrix} where the first 4 columns give the coordinates of two corners of each rectangle and the last column. In both cases, the last column gives the difference in terms of sets in \code{x} minus sets in \code{y} that attain each point (i.e., negative values are differences in favour \code{y}). } \description{ Calculate the differences between the empirical attainment functions of two data sets. } \details{ This function calculates the differences between the EAFs of two data sets. } \examples{ A1 <- read_datasets(text=' 3 2 2 3 2.5 1 1 2 1 2 ') A2 <- read_datasets(text=' 4 2.5 3 3 2.5 3.5 3 3 2.5 3.5 2 1 ') d <- eafdiff(A1, A2) str(d) print(d) d <- eafdiff(A1, A2, rectangles = TRUE) str(d) print(d) } \seealso{ \code{\link[=read_datasets]{read_datasets()}}, \code{\link[=eafdiffplot]{eafdiffplot()}} } \concept{eaf} eaf/man/read_datasets.Rd0000644000176200001440000000446514154006207014662 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/read_datasets.R \name{read_datasets} \alias{read_datasets} \alias{read.data.sets} \title{Read several data sets} \usage{ read_datasets(file, col_names, text) read.data.sets(file, col.names) } \arguments{ \item{file}{(\code{character()}) \cr Filename that contains the data. Each row of the table appears as one line of the file. If it does not contain an \emph{absolute} path, the file name is \emph{relative} to the current working directory, \code{\link[base]{getwd}()}. Tilde-expansion is performed where supported. Files compressed with \code{xz} are supported.} \item{col_names, col.names}{Vector of optional names for the variables. The default is to use \samp{"V"} followed by the column number.} \item{text}{(\code{character()}) \cr If \code{file} is not supplied and this is, then data are read from the value of \code{text} via a text connection. Notice that a literal string can be used to include (small) data sets within R code.} } \value{ (\code{matrix()}) containing a representation of the data in the file. An extra column \code{set} is added to indicate to which set each row belongs. } \description{ Reads a text file in table format and creates a matrix from it. The file may contain several sets, separated by empty lines. Lines starting by \code{'#'} are considered comments and treated as empty lines. The function adds an additional column \code{set} to indicate to which set each row belongs. } \note{ There are several examples of data sets in \code{system.file(package="eaf","extdata")}. \code{read.data.sets()} is a deprecated alias. It will be removed in the next major release. } \section{Warning}{ A known limitation is that the input file must use newline characters native to the host system, otherwise they will be, possibly silently, misinterpreted. In GNU/Linux the program \code{dos2unix} may be used to fix newline characters. } \examples{ extdata_path <- system.file(package="eaf","extdata") A1 <- read_datasets(file.path(extdata_path,"ALG_1_dat.xz")) str(A1) read_datasets(text="1 2\n3 4\n\n5 6\n7 8\n", col_names=c("obj1", "obj2")) } \seealso{ \code{\link[utils]{read.table}}, \code{\link[=eafplot]{eafplot()}}, \code{\link[=eafdiffplot]{eafdiffplot()}} } \author{ Manuel \enc{López-Ibáñez}{Lopez-Ibanez} } \keyword{file} eaf/man/whv_rect.Rd0000644000176200001440000000533214243211631013670 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/whv.R \name{whv_rect} \alias{whv_rect} \alias{total_whv_rect} \title{Compute (total) weighted hypervolume given a set of rectangles} \usage{ whv_rect(data, rectangles, reference, maximise = FALSE) total_whv_rect( data, rectangles, reference, maximise = FALSE, ideal = NULL, scalefactor = 0.1 ) } \arguments{ \item{data}{(\code{matrix} | \code{data.frame}) \cr Matrix or data frame of numerical values, where each row gives the coordinates of a point.} \item{rectangles}{(\code{matrix()}) Weighted rectangles that will bias the computation of the hypervolume. Maybe generated by \code{\link[=eafdiff]{eafdiff()}} with \code{rectangles=TRUE} or by \code{\link[=choose_eafdiff]{choose_eafdiff()}}.} \item{reference}{(\code{numeric()}) \cr Reference point as a vector of numerical values.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{ideal}{(\code{numeric()}) \cr Ideal point as a vector of numerical values. If \code{NULL}, it is calculated as minimum (resp. maximum if maximising that objective) of each objective in \code{data}.} \item{scalefactor}{(\code{numeric(1)}) real value within \eqn{(0,1]} that scales the overall weight of the differences. This is parameter psi (\eqn{\psi}) in \citet{DiaLop2020ejor}.} } \value{ A single numerical value. } \description{ Calculates the hypervolume weighted by a set of rectangles (with zero weight outside the rectangles). The function \code{\link[=total_whv_rect]{total_whv_rect()}} calculates the total weighted hypervolume as \code{\link[=hypervolume]{hypervolume()}}\code{ + scalefactor * abs(prod(reference - ideal)) * whv_rect()}. The details of the computation are given by \citet{DiaLop2020ejor}. } \details{ TODO } \examples{ rectangles <- as.matrix(read.table(header=FALSE, text=' 1.0 3.0 2.0 Inf 1 2.0 3.5 2.5 Inf 2 2.0 3.0 3.0 3.5 3 ')) whv_rect (matrix(2, ncol=2), rectangles, reference = 6) whv_rect (matrix(c(2, 1), ncol=2), rectangles, reference = 6) whv_rect (matrix(c(1, 2), ncol=2), rectangles, reference = 6) total_whv_rect (matrix(2, ncol=2), rectangles, reference = 6, ideal = c(1,1)) total_whv_rect (matrix(c(2, 1), ncol=2), rectangles, reference = 6, ideal = c(1,1)) total_whv_rect (matrix(c(1, 2), ncol=2), rectangles, reference = 6, ideal = c(1,1)) } \references{ \insertAllCited{} } \seealso{ \code{\link[=read_datasets]{read_datasets()}}, \code{\link[=eafdiff]{eafdiff()}}, \code{\link[=choose_eafdiff]{choose_eafdiff()}}, \code{\link[=whv_hype]{whv_hype()}} } \concept{metrics} eaf/man/nondominated.Rd0000644000176200001440000000474114240473451014540 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/nondominated.R \name{is_nondominated} \alias{is_nondominated} \alias{filter_dominated} \alias{pareto_rank} \title{Identify, remove and rank dominated points according to Pareto optimality} \usage{ is_nondominated(data, maximise = FALSE, keep_weakly = FALSE) filter_dominated(data, maximise = FALSE, keep_weakly = FALSE) pareto_rank(data, maximise = FALSE) } \arguments{ \item{data}{(\code{matrix} | \code{data.frame}) \cr Matrix or data frame of numerical values, where each row gives the coordinates of a point.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{keep_weakly}{If \code{FALSE}, return \code{FALSE} for any duplicates of nondominated points.} } \value{ \code{is_nondominated} returns a logical vector of the same length as the number of rows of \code{data}, where \code{TRUE} means that the point is not dominated by any other point. \code{filter_dominated} returns a matrix or data.frame with only mutually nondominated points. \code{pareto_rank()} returns an integer vector of the same length as the number of rows of \code{data}, where each value gives the rank of each point. } \description{ Identify nondominated points with \code{is_nondominated} and remove dominated ones with \code{filter_dominated}. \code{pareto_rank()} ranks points according to Pareto-optimality, which is also called nondominated sorting \citep{Deb02nsga2}. } \details{ \code{pareto_rank()} is meant to be used like \code{rank()}, but it assigns ranks according to Pareto dominance. Duplicated points are kept on the same front. When \code{ncol(data) == 2}, the code uses the \eqn{O(n \log n)} algorithm by \citet{Jen03}. } \examples{ path_A1 <- file.path(system.file(package="eaf"),"extdata","ALG_1_dat.xz") set <- read_datasets(path_A1)[,1:2] is_nondom <- is_nondominated(set) cat("There are ", sum(is_nondom), " nondominated points\n") plot(set, col = "blue", type = "p", pch = 20) ndset <- filter_dominated(set) points(ndset[order(ndset[,1]),], col = "red", pch = 21) ranks <- pareto_rank(set) colors <- colorRampPalette(c("red","yellow","springgreen","royalblue"))(max(ranks)) plot(set, col = colors[ranks], type = "p", pch = 20) } \references{ \insertAllCited{} } \author{ Manuel \enc{López-Ibáñez}{Lopez-Ibanez} } \concept{dominance} eaf/man/attsurf2df.Rd0000644000176200001440000000177414531423377014155 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf.R \name{attsurf2df} \alias{attsurf2df} \title{Convert a list of attainment surfaces to a data.frame} \usage{ attsurf2df(x) } \arguments{ \item{x}{(\code{list()}) List of data.frames or matrices. The names of the list give the percentiles of the attainment surfaces. This is the format returned by \code{\link[=eafplot]{eafplot()}} (and the internal function \code{compute_eaf_as_list}).} } \value{ A data.frame with as many columns as objectives and an additional column \code{percentiles}. } \description{ Convert a list of attainment surfaces to a single data.frame. } \examples{ data(SPEA2relativeRichmond) attsurfs <- eafplot (SPEA2relativeRichmond, percentiles = c(0,50,100), xlab = expression(C[E]), ylab = "Total switches", lty=0, pch=21, xlim = c(90, 140), ylim = c(0, 25)) attsurfs <- attsurf2df(attsurfs) text(attsurfs[,1:2], labels = attsurfs[,3], adj = c(1.5,1.5)) } \concept{eaf} eaf/man/choose_eafdiffplot.Rd0000644000176200001440000000745714531102701015701 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/interactive.R \name{choose_eafdiffplot} \alias{choose_eafdiffplot} \alias{choose_eafdiff} \title{Interactively choose according to empirical attainment function differences} \usage{ choose_eafdiffplot( data.left, data.right, intervals = 5, maximise = c(FALSE, FALSE), title.left = deparse(substitute(data.left)), title.right = deparse(substitute(data.right)), ... ) choose_eafdiff(x, left = stop("'left' must be either TRUE or FALSE")) } \arguments{ \item{data.left, data.right}{Data frames corresponding to the input data of left and right sides, respectively. Each data frame has at least three columns, the third one being the set of each point. See also \code{\link[=read_datasets]{read_datasets()}}.} \item{intervals}{(\code{integer(1)}|\code{character()}) \cr The absolute range of the differences \eqn{[0, 1]} is partitioned into the number of intervals provided. If an integer is provided, then labels for each interval are computed automatically. If a character vector is provided, its length is taken as the number of intervals.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{title.left, title.right}{Title for left and right panels, respectively.} \item{...}{Other graphical parameters are passed down to \code{\link[=eafdiffplot]{eafdiffplot()}}.} \item{x}{(\code{matrix()}) Matrix of rectangles representing EAF differences (returned by \code{\link[=eafdiff]{eafdiff()}} with \code{rectangles=TRUE}).} \item{left}{(\code{logical(1)}) With \code{left=TRUE} return the rectangles with positive differences, otherwise return those with negative differences but differences are converted to positive.} } \value{ \code{matrix} where the first 4 columns give the coordinates of two corners of each rectangle and the last column. In both cases, the last column gives the positive differences in favor of the chosen side. } \description{ Creates the same plot as \code{\link[=eafdiffplot]{eafdiffplot()}} but waits for the user to click in one of the sides. Then it returns the rectangles the give the differences in favour of the chosen side. These rectangles may be used for interactive decision-making as shown in \citet{DiaLop2020ejor}. The function \code{\link[=choose_eafdiff]{choose_eafdiff()}} may be used in a non-interactive context. } \examples{ \donttest{ extdata_dir <- system.file(package="eaf", "extdata") A1 <- read_datasets(file.path(extdata_dir, "wrots_l100w10_dat")) A2 <- read_datasets(file.path(extdata_dir, "wrots_l10w100_dat")) if (interactive()) { rectangles <- choose_eafdiffplot(A1, A2, intervals = 5) } else { # Choose A1 rectangles <- eafdiff(A1, A2, intervals = 5, rectangles = TRUE) rectangles <- choose_eafdiff(rectangles, left = TRUE) } reference <- c(max(A1[, 1], A2[, 1]), max(A1[, 2], A2[, 2])) x <- split.data.frame(A1[,1:2], A1[,3]) hv_A1 <- sapply(split.data.frame(A1[, 1:2], A1[, 3]), hypervolume, reference=reference) hv_A2 <- sapply(split.data.frame(A2[, 1:2], A2[, 3]), hypervolume, reference=reference) boxplot(list(A1=hv_A1, A2=hv_A2), main = "Hypervolume") whv_A1 <- sapply(split.data.frame(A1[, 1:2], A1[, 3]), whv_rect, rectangles=rectangles, reference=reference) whv_A2 <- sapply(split.data.frame(A2[, 1:2], A2[, 3]), whv_rect, rectangles=rectangles, reference=reference) boxplot(list(A1=whv_A1, A2=whv_A2), main = "Weighted hypervolume") } } \references{ \insertAllCited{} } \seealso{ \code{\link[=read_datasets]{read_datasets()}}, \code{\link[=eafdiffplot]{eafdiffplot()}}, \code{\link[=whv_rect]{whv_rect()}} } \concept{eaf} \concept{visualisation} eaf/man/macros/0000755000176200001440000000000013645042056013051 5ustar liggesuserseaf/man/macros/macros.Rd0000644000176200001440000000013413645042056014622 0ustar liggesusers\newcommand{\citep}{\insertCite{#1}{eaf}} \newcommand{\citet}{\insertCite{#1;textual}{eaf}} eaf/man/eafs.Rd0000644000176200001440000000417214531102701012763 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf.R \name{eafs} \alias{eafs} \title{Exact computation of the EAF in 2D or 3D} \usage{ eafs(points, sets, groups = NULL, percentiles = NULL) } \arguments{ \item{points}{Either a matrix or a data frame of numerical values, where each row gives the coordinates of a point.} \item{sets}{A vector indicating which set each point belongs to.} \item{groups}{Indicates that the EAF must be computed separately for data belonging to different groups.} \item{percentiles}{(\code{numeric()}) Vector indicating which percentiles are computed. \code{NULL} computes all.} } \value{ A data frame (\code{data.frame}) containing the exact representation of EAF. The last column gives the percentile that corresponds to each point. If groups is not \code{NULL}, then an additional column indicates to which group the point belongs. } \description{ This function computes the EAF given a set of 2D or 3D points and a vector \code{set} that indicates to which set each point belongs. } \note{ There are several examples of data sets in \code{system.file(package="eaf","extdata")}. The current implementation only supports two and three dimensional points. } \examples{ extdata_path <- system.file(package="eaf", "extdata") x <- read_datasets(file.path(extdata_path, "example1_dat")) # Compute full EAF str(eafs(x[,1:2], x[,3])) # Compute only best, median and worst str(eafs(x[,1:2], x[,3], percentiles = c(0, 50, 100))) x <- read_datasets(file.path(extdata_path, "spherical-250-10-3d.txt")) y <- read_datasets(file.path(extdata_path, "uniform-250-10-3d.txt")) x <- rbind(data.frame(x, groups = "spherical"), data.frame(y, groups = "uniform")) # Compute only median separately for each group z <- eafs(x[,1:3], sets = x[,4], groups = x[,5], percentiles = 50) str(z) # library(plotly) # plot_ly(z, x = ~X1, y = ~X2, z = ~X3, color = ~groups, # colors = c('#BF382A', '#0C4B8E')) \%>\% add_markers() } \references{ \insertRef{Grunert01}{eaf} \insertRef{FonGueLopPaq2011emo}{eaf} } \seealso{ \code{\link[=read_datasets]{read_datasets()}} } \author{ Manuel López-Ibáñez } \concept{eaf} eaf/man/gcp2x2.Rd0000644000176200001440000000356514010304644013161 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{data} \name{gcp2x2} \alias{gcp2x2} \title{Metaheuristics for solving the Graph Vertex Coloring Problem} \format{ A data frame with 3133 observations on the following 6 variables. \describe{ \item{\code{alg}}{a factor with levels \code{SAKempeFI} and \code{TSinN1}} \item{\code{inst}}{a factor with levels \code{DSJC500.5} and \code{DSJC500.9}. Instances are taken from the DIMACS repository.} \item{\code{run}}{a numeric vector indicating the run to which the observation belong. } \item{\code{best}}{a numeric vector indicating the best solution in number of colors found in the corresponding run up to that time.} \item{\code{time}}{a numeric vector indicating the time since the beginning of the run for each observation. A rescaling is applied.} \item{\code{titer}}{a numeric vector indicating iteration number corresponding to the observations.} } } \source{ \insertRef{ChiarandiniPhD}{eaf} (page 138) } \usage{ gcp2x2 } \description{ Two metaheuristic algorithms, TabuCol (Hertz et al., 1987) and simulated annealing \citep{JohAraMcGSch1991}, to find a good approximation of the chromatic number of two random graphs. The data here has the only goal of providing an example of use of eafplot for comparing algorithm performance with respect to both time and quality when modelled as two objectives in trade off. } \details{ Each algorithm was run 10 times per graph registering the time and iteration number at which a new best solution was found. A time limit corresponding to 500*10^5 total iterations of TabuCol was imposed. The time was then normalized on a scale from 0 to 1 to make it instance independent. } \examples{ data(gcp2x2) } \references{ A. Hertz and D. de Werra. Using Tabu Search Techniques for Graph Coloring. Computing, 1987, 39(4), 345-351. \insertAllCited{} } \keyword{datasets} eaf/man/eafdiffplot.Rd0000644000176200001440000001567714660120021014342 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eafplot.R \name{eafdiffplot} \alias{eafdiffplot} \title{Plot empirical attainment function differences} \usage{ eafdiffplot( data.left, data.right, col = c("#FFFFFF", "#808080", "#000000"), intervals = 5, percentiles = c(50), full.eaf = FALSE, type = "area", legend.pos = if (full.eaf) "bottomleft" else "topright", title.left = deparse(substitute(data.left)), title.right = deparse(substitute(data.right)), xlim = NULL, ylim = NULL, cex = par("cex"), cex.lab = par("cex.lab"), cex.axis = par("cex.axis"), maximise = c(FALSE, FALSE), grand.lines = TRUE, sci.notation = FALSE, left.panel.last = NULL, right.panel.last = NULL, ... ) } \arguments{ \item{data.left, data.right}{Data frames corresponding to the input data of left and right sides, respectively. Each data frame has at least three columns, the third one being the set of each point. See also \code{\link[=read_datasets]{read_datasets()}}.} \item{col}{A character vector of three colors for the magnitude of the differences of 0, 0.5, and 1. Intermediate colors are computed automatically given the value of \code{intervals}. Alternatively, a function such as \code{\link[viridisLite:viridis]{viridisLite::viridis()}} that generates a colormap given an integer argument.} \item{intervals}{(\code{integer(1)}|\code{character()}) \cr The absolute range of the differences \eqn{[0, 1]} is partitioned into the number of intervals provided. If an integer is provided, then labels for each interval are computed automatically. If a character vector is provided, its length is taken as the number of intervals.} \item{percentiles}{The percentiles of the EAF of each side that will be plotted as attainment surfaces. \code{NA} does not plot any. See \code{\link[=eafplot]{eafplot()}}.} \item{full.eaf}{Whether to plot the EAF of each side instead of the differences between the EAFs.} \item{type}{Whether the EAF differences are plotted as points (\samp{points}) or whether to color the areas that have at least a certain value (\samp{area}).} \item{legend.pos}{The position of the legend. See \code{\link[=legend]{legend()}}. A value of \code{"none"} hides the legend.} \item{title.left, title.right}{Title for left and right panels, respectively.} \item{xlim, ylim, cex, cex.lab, cex.axis}{Graphical parameters, see \code{\link[=plot.default]{plot.default()}}.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} \item{grand.lines}{Whether to plot the grand-best and grand-worst attainment surfaces.} \item{sci.notation}{Generate prettier labels} \item{left.panel.last, right.panel.last}{An expression to be evaluated after plotting has taken place on each panel (left or right). This can be useful for adding points or text to either panel. Note that this works by lazy evaluation: passing this argument from other \code{plot} methods may well not work since it may be evaluated too early.} \item{...}{Other graphical parameters are passed down to \code{\link[=plot.default]{plot.default()}}.} } \value{ Returns a representation of the EAF differences (invisibly). } \description{ Plot the differences between the empirical attainment functions (EAFs) of two data sets as a two-panel plot, where the left side shows the values of the left EAF minus the right EAF and the right side shows the differences in the other direction. } \details{ This function calculates the differences between the EAFs of two data sets, and plots on the left the differences in favour of the left data set, and on the right the differences in favour of the right data set. By default, it also plots the grand best and worst attainment surfaces, that is, the 0\%- and 100\%-attainment surfaces over all data. These two surfaces delimit the area where differences may exist. In addition, it also plots the 50\%-attainment surface of each data set. With \code{type = "point"}, only the points where there is a change in the value of the EAF difference are plotted. This means that for areas where the EAF differences stays constant, the region will appear in white even if the value of the differences in that region is large. This explains "white holes" surrounded by black points. With \code{type = "area"}, the area where the EAF differences has a certain value is plotted. The idea for the algorithm to compute the areas was provided by Carlos M. Fonseca. The implementation uses R polygons, which some PDF viewers may have trouble rendering correctly (See \url{https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-are-there-unwanted-borders}). Plots (should) look correct when printed. Large differences that appear when using \code{type = "point"} may seem to disappear when using \code{type = "area"}. The explanation is the points size is independent of the axes range, therefore, the plotted points may seem to cover a much larger area than the actual number of points. On the other hand, the areas size is plotted with respect to the objective space, without any extra borders. If the range of an area becomes smaller than one-pixel, it won't be visible. As a consequence, zooming in or out certain regions of the plots does not change the apparent size of the points, whereas it affects considerably the apparent size of the areas. } \examples{ ## NOTE: The plots in the website look squashed because of how pkgdown ## generates them. They should look fine when you generate them yourself. extdata_dir <- system.file(package="eaf", "extdata") A1 <- read_datasets(file.path(extdata_dir, "ALG_1_dat.xz")) A2 <- read_datasets(file.path(extdata_dir, "ALG_2_dat.xz")) \donttest{# These take time eafdiffplot(A1, A2, full.eaf = TRUE) if (requireNamespace("viridisLite", quietly=TRUE)) { viridis_r <- function(n) viridisLite::viridis(n, direction=-1) eafdiffplot(A1, A2, type = "area", col = viridis_r) } else { eafdiffplot(A1, A2, type = "area") } A1 <- read_datasets(file.path(extdata_dir, "wrots_l100w10_dat")) A2 <- read_datasets(file.path(extdata_dir, "wrots_l10w100_dat")) eafdiffplot(A1, A2, type = "point", sci.notation = TRUE, cex.axis=0.6) } # A more complex example DIFF <- eafdiffplot(A1, A2, col = c("white", "blue", "red"), intervals = 5, type = "point", title.left=expression("W-RoTS," ~ lambda==100 * "," ~ omega==10), title.right=expression("W-RoTS," ~ lambda==10 * "," ~ omega==100), right.panel.last={ abline(a = 0, b = 1, col = "red", lty = "dashed")}) DIFF$right[,3] <- -DIFF$right[,3] ## Save the values to a file. # write.table(rbind(DIFF$left,DIFF$right), # file = "wrots_l100w10_dat-wrots_l10w100_dat-diff.txt", # quote = FALSE, row.names = FALSE, col.names = FALSE) } \seealso{ \code{\link[=eafplot]{eafplot()}} \code{\link[=pdf_crop]{pdf_crop()}} } \concept{visualisation} eaf/man/SPEA2relativeRichmond.Rd0000644000176200001440000000151214010304644016074 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{data} \name{SPEA2relativeRichmond} \alias{SPEA2relativeRichmond} \title{Results of SPEA2 with relative time-controlled triggers on Richmond water network.} \format{ A data frame as produced by \code{\link[=read_datasets]{read_datasets()}}. } \source{ \insertRef{LopezIbanezPhD}{eaf} } \usage{ SPEA2relativeRichmond } \description{ The data has the only goal of providing an example of use of eafplot. } \examples{ data(HybridGA) data(SPEA2relativeRichmond) eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), xlab = expression(C[E]), ylab = "Total switches", xlim = c(90, 140), ylim = c(0, 25), extra.points = HybridGA$richmond, extra.lty = "dashed", extra.legend = "Hybrid GA") } \keyword{datasets} eaf/man/eaf-package.Rd0000644000176200001440000000662514373474370014220 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{package} \name{eaf-package} \alias{eaf} \alias{eaf-package} \title{Computation and visualization of the empirical attainment function (EAF) for the analysis of random sets in multi-criterion optimization.} \description{ The empirical attainment function (EAF) describes the probabilistic distribution of the outcomes obtained by a stochastic algorithm in the objective space. This package implements plots of summary attainment surfaces and differences between the first-order EAFs. These plots may be used for exploring the performance of stochastic local search algorithms for biobjective optimization problems and help in identifying certain algorithmic behaviors in a graphical way. } \section{Functions}{ \tabular{rl}{ \code{\link[=eafdiffplot]{eafdiffplot()}} \tab Empirical attainment function differences\cr \code{\link[=eafplot]{eafplot()}} \tab Plot the Empirical Attainment Function for two objectives\cr \code{\link[=read_datasets]{read_datasets()}} \tab Read several data.frame sets } } \section{Data}{ \describe{ \item{\code{\link{gcp2x2}}}{ Metaheuristics for solving the Graph Vertex Coloring Problem} \item{\code{\link{HybridGA}}}{ Results of Hybrid GA on vanzyl and Richmond water networks} \item{\code{\link{SPEA2minstoptimeRichmond}}}{ Results of SPEA2 when minimising electrical cost and maximising the minimum idle time of pumps on Richmond water network} } Extras are available at \code{system.file(package="eaf")}: \tabular{rl}{ \code{extdata} \tab External data sets (see \code{\link{read_datasets}}) \cr \code{scripts/eaf} \tab EAF command-line program \cr \code{scripts/eafplot}\tab Perl script to generate plots of attainment surfaces\cr \code{scripts/eafdiff}\tab Perl script to generate plots of EAF differences } } \examples{ data(gcp2x2) tabucol<-subset(gcp2x2, alg!="TSinN1") tabucol$alg<-tabucol$alg[drop=TRUE] eafplot(time+best~run,data=tabucol,subset=tabucol$inst=="DSJC500.5") eafplot(time+best~run|inst,groups=alg,data=gcp2x2) eafplot(time+best~run|inst,groups=alg,data=gcp2x2, percentiles = c(0,50,100), cex = 1.4, lty = c(2,1,2),lwd = c(2,2,2), col = c("black","blue","grey50")) extdata_path <- system.file(package="eaf","extdata") A1 <- read_datasets(file.path(extdata_path, "wrots_l100w10_dat")) A2 <- read_datasets(file.path(extdata_path, "wrots_l10w100_dat")) eafplot(A1, percentiles=c(50)) eafplot(list(A1=A1, A2=A2), percentiles=c(50)) eafdiffplot(A1, A2) ## Save to a PDF file # dev.copy2pdf(file="eaf.pdf", onefile=TRUE, width=5, height=4) } \references{ \insertRef{Grunert01}{eaf} \insertRef{GruFon2009:emaa}{eaf} \insertRef{LopPaqStu09emaa}{eaf} \insertRef{FonGueLopPaq2011emo}{eaf} } \seealso{ Useful links: \itemize{ \item \url{https://mlopez-ibanez.github.io/eaf/} \item \url{https://github.com/MLopez-Ibanez/eaf} \item Report bugs at \url{https://github.com/MLopez-Ibanez/eaf/issues} } } \author{ \strong{Maintainer}: Manuel López-Ibáñez \email{manuel.lopez-ibanez@manchester.ac.uk} (\href{https://orcid.org/0000-0001-9974-1295}{ORCID}) Authors: \itemize{ \item Marco Chiarandini \item Carlos Fonseca \item Luís Paquete \item Thomas Stützle } Other contributors: \itemize{ \item Mickaël Binois [contributor] } } \concept{empirical attainment function} \concept{multivariate} \concept{optimize} \concept{time-quality algorithm profile} \keyword{internal} eaf/man/normalise.Rd0000644000176200001440000000271514500025511014036 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/normalise.R \name{normalise} \alias{normalise} \title{Normalise points} \usage{ normalise(data, to_range = c(1, 2), lower = NA, upper = NA, maximise = FALSE) } \arguments{ \item{data}{(\code{matrix} | \code{data.frame}) \cr Matrix or data frame of numerical values, where each row gives the coordinates of a point.} \item{to_range}{Normalise values to this range. If the objective is maximised, it is normalised to \code{c(to_range[1], to_range[0])} instead.} \item{lower, upper}{Bounds on the values. If NA, the maximum and minimum values of each coordinate are used.} \item{maximise}{(\code{logical()} | \code{logical(1)}) \cr Whether the objectives must be maximised instead of minimised. Either a single logical value that applies to all objectives or a vector of logical values, with one value per objective.} } \value{ A numerical matrix } \description{ Normalise points per coordinate to a range, e.g., \code{c(1,2)}, where the minimum value will correspond to 1 and the maximum to 2. If bounds are given, they are used for the normalisation. } \examples{ data(SPEA2minstoptimeRichmond) # The second objective must be maximized head(SPEA2minstoptimeRichmond[, 1:2]) head(normalise(SPEA2minstoptimeRichmond[, 1:2], maximise = c(FALSE, TRUE))) head(normalise(SPEA2minstoptimeRichmond[, 1:2], to_range = c(0,1), maximise = c(FALSE, TRUE))) } \author{ Manuel \enc{López-Ibáñez}{Lopez-Ibanez} } eaf/man/HybridGA.Rd0000644000176200001440000000140514010304644013474 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/eaf-package.R \docType{data} \name{HybridGA} \alias{HybridGA} \title{Results of Hybrid GA on vanzyl and Richmond water networks} \format{ A list with two data frames, each of them with three columns, as produced by \code{\link[=read_datasets]{read_datasets()}}. \describe{ \item{\verb{$vanzyl}}{data frame of results on vanzyl network} \item{\verb{$richmond}}{data frame of results on Richmond network. The second column is filled with \code{NA}} } } \source{ \insertRef{LopezIbanezPhD}{eaf}. } \usage{ HybridGA } \description{ The data has the only goal of providing an example of use of eafplot. } \examples{ data(HybridGA) print(HybridGA$vanzyl) print(HybridGA$richmond) } \keyword{datasets} eaf/man/figures/0000755000176200001440000000000014160032557013227 5ustar liggesuserseaf/man/figures/eafdiff-color.png0000644000176200001440000013135114660712363016446 0ustar liggesusersPNG  IHDRX^ֵ IDATxw\ǟ, RE""j[jV[jmZj[Wjqֺ{v HB +={rsb$I@ u@ :A@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@ uQA@蠦L%m}s`s++.Qnho #j("Z ?QۯdDI9p߾ahV E峖xPD2G,P D 54P( is/8x4l=wL|  n״i:{&6 hǛ')f6]BrSeYt0uP D 5U&%u~/G|~w@ʏy6_юOZdQ#{/ƧC?yoP/p'Yǣך+q̯π7."#G2ƹZj%x7>]?@ j}g^mqn6noS::a hr 2=74RSM[ 9<^pz\AwAP, ^!7+JWr~{@Ƿ1^_k^VO;e7S Mb(MBQxBsG 3K)tH}fz q]X,¡z ߟ#G }8O$ww*l oN?GMKbeY?ׂSrn_v=S?`R)\ Տ{ h׼DjoxSߠN<N@XQ#O4_gfsId:\*@x-ǏC^kPQH}ebVקF?0%MAզo0I[Q[Y3oWͬG DmTfe8<` Yc="XQ@i!@ 4("N!@ 4("v]8`gH՟l2s?h"mM7:x/"D$j=*H^raS/謷UW]5aϣ:6yy|ol VשM.h/NkubBP(Jz c<>:xё1>[T&k޼yQ˟U \`NN*E P`NC j}֗QϢCa(QM5-Zj\W6oܱ#=l'Kjke}] $>C|)r9|t|0NRRWE7'q?.enP o5r s@8FNoP0r9 e~2|weҮq3,6Ωm^jw 6oZx0SܯSۨě!?2g RwiIt@dIҧW= & R(NZ˴=ͩIS~˓R.}з\Ր$!;0*ՔcYZ(XTu!efaMxsl{|q337 $Ir\FastMR@Ν׭[xpܻwƍ@u֭ۙ3g=|@ 68e@  >}fTtuS.2}lٲEժT*ӻ͛7XL4 ~ǀ.]0J&/dth4͍yyyl/((pwwp8jNsuueKR'#SR ???_(ϋnݺ1nS+l; >xT(ll333 cs\.$ qEEEl:!l:l |>-s}5* 6QX8 ( lDA`7ꥆ>Μ9Ν;2ӓr///T㸧NQsJ/(.ː@^FsNNNl͍9㾾l}||d2csWWWLf{ѝlAaa!csNG]pd2J*;Vd2NF' e2YIIL&31dRT(*J\.Hx<ŕm%]\\cP(Ό322up20H$:.00L&+** al^\\\TT\8;;z``spHܹsgfp77UV;\؁033bpp8sÉ9uqN Q%A(iMG~`؉'NPB˜zA=10%Zq7 13xNs^oㇺXkZVKSnnnC)8bbb.NNN\.^WTwlnn7c|777>\Tt:www?T*D B!3KV$(((`sd2yum(@  G }"8H$Hp8eJ+ w! T*V Fs!!!ͳze`NdZZZHH3sAAA B`fNDvvvz@VVs\(Zl:8::RW1ٳgqMNxzz1p8ԓ.3secƜys8HLkK ̍8'44j QG l^f899|`-D"D塁]~P-[v鶼ܹ{wR\mtdQEi?$5?Z&%v !4gIHeFk Q*kB$aŋ7oT~T=$9h z4yDŽE"_A詿:URߦ-N;}ӽ}&zaas@EiTe)W[ M֚csTRVkZ69Yf`^^ KL_s2"͐ ɫa!>,aQ!< pueT4FY؟|i([@mYE9 0]ъ+#iy;ϲ}-2y&&݉"`Pػ *w%Hc{(kAC-p04eրZ_k4,,lŦsK(k(kU wEUB;|u{\8]|ByU׵۳]mؘWnR@8|O$(5%߿o[kצuvxy&POT)njE5p~G(ee5jxA ?6Sߺ.z q0Z(Ȁ p2 r$q]4ex!mذyYѤ"^Oo_MVs_8|#1qOoz楥J߼qffs>YJYn*Z@1vJdn)? |xۇ eAӛ72lOؐ5 iyŐ$UC4FkN(Ăc/@LF 0N 5_j >.p4ڲ󺰰RJi+ds-ۑ8@ Q?9(k9Q{ z1guJǩ]y[#dKb;RܠXܕNNN΋/~VZ͛7'.Q6-D"if+ KoPz͝kk򚯻ܡťηRR]L΍#עǒ bJuuu5S2 /^8d0lƍvEY՚5jxA*>9a`H={@vi׀TJtG6k͛7ydjjFlj4Ɯ% :3_.;oS+@a^Qtͯ{YR_Q,rOGEDD"Ν;{3f o4Ƽxg?-^؉MHg>Q0 AK;$^T% س ڟ5JMVRkTtjQc"] ?ai4]j1/YqF}||ݩEYl?B=xA40Z_ @ uB_"' TQtAc Vl5m$ѹkE$/6ǩPkfR S2i&wD0Q6T0LH6dqF:1A5WمviS ($@No4PRrjMʏTkt)_Nm?HNK~U5JT)E;Z(r=*fϞ=n8c\$ͱ1vDhxAuv oZQZtQLLA p%r H qI,..ϯx񂮉)bX36/**J `ZZ``l.d2cs؜$Ԣ/C7^ZXnAaa!2rDӋb1cƌ3vhĉ>d$ak氋MOj*pvr7QH$¨ZђҌF+ɺu#m BaIHeF_ZT#iP IDATpOue34r#F F٘GAskXD^#GGGfso߾~iy;odv/h^ m8$`2(7-7@[ @PPСO^zvOPhF ((A(&=eok׮?Q5ܾY-^G ԧ%LVSبߏ-s{ﵭJ2>S,77RN8qͤ$jN88+5*ݎ2oѢEXXU`TQW8ppglT*]]]26H$>>>yyy]\\?%sBJuĔӉpn9 ٹO/?(Yfmm-yrQ!.#vgPj5U(77Wbx`x 򷐆AawUyWݰf1d ww&+djlذaܸqcǎѣ5aTvLꋝ(."H$ Sϟ7o|Ŋǎ;Hao^@Mٲe1akſ&n-ljB~V]Ҩ->r\2Iu=G_G+F1 {>| @Ѽb%a111]t5ZFI"7+OPXhy?,,G6.5F٘'k~U_~V1|3ĪvxgO/ڲ}Z%W\{1<q=cq+lڳF0L2^,B{=>8D1ɆROYeTь,ͬիW/^8!!>}``MzQ Zdc^~!Yڭ?Obš^{֎ 6\4j$008 Cq=[(]4ZQVkԗ8֠rmF-*eVkՕܹs H(@I]4Q6v[k>aKA玭2ա؄3LeuGҨMFt7m;ƸiT޵F)_nr K6\;$"i;%^vמY)0JiԂ a2`k.60Ν;s1?e9.:iyE{4_VTkoHxͽc&PB[ܳvp E%`dֱcGA}oݎ- iy;`-0;kݹ}3MnrpAr~HrNrfffV2B 玫G 9"MV$ɤ$_uСݺu3ft6#>--bs}GEZZqɋ./nA7]^I>|Tg0- ߋVUe>-[Tnh}cǎU\P(d2Y! P\#5cf7Rtw1^mUD_4.{ Ӣ}994>Ԑkb]i5ph/f:vg F:ÇW\ڥQ6/5Aeu;POmZ\&ZiF\\\4 AfTP֍iQpp1RP@#ԣuz; ZT;B̥G?;: y *w3^ zܕ=KMwҥVtF5:b^t  dҲ1 WQ#.]*APzW}_cc^F/heB]9Nub_*m5ÁF\wO/u&MQd Fȇ%8p94.m(ke1S֨-^S(׿~h+jԧm(Xo=;;օ,;;;++tNK(k9f25PkW5Ju^lڴť-[ 0x@j5FmzP(RRRLo(Q(ecnǬQ Z!pawmwr6J}YnZBzz~kF;w|ܹc#iݥ-[4|Z`~f믿f.w<4j߲eˎ#6ݖGl۲EIKizj"&z;1M3.F(9r䈵; M^ ċQwwQF8pHKsl̫݁7{fV[B`ء.ٵ֨]v:M4}Slll|||``L$(i4;;{4[]L?㡭55==$9 Go1)vrBIVmkB$o$cъ3ewVҨު9圳ku?>F?=ZҨJyf<>v'G Wir^㸅O?HE(sdqE5B^OLrammݺ^-4h`ڛ7I_&+MJNPIeEMkҫ-0ޙ?nG0aѣG+רIBX$Okr߅Q$1 Z@Hj %y gYk=>IlkBhd%U \CҚw:heܮ2-&(ݚݼm</qf0cm"y8PG3ņ)¾jw ߮Ol-6{d|Aה@W /q2yХ5rǎ;dȐ[ngR~OBzžhРA ]t&"""PU idNWRt[.IGr_iޝ[jc*ҭ+RәJ<?2dȪUL8o͕$*p$˟ګY6m2C ӧ5mf iI,}-C=q iH>g=a[iu߶mRܶm۳gZnM3E+ݻwo7m6U*#5A}Hԡԡٞ$Gel\۴[``¨.K_vWbe5 oVqtfڡK..\0 Æ 9sRR9}aK5:R#Ko״CY)%[@QzV/hQm'F"RKtZl9u3%$2HɩLlpɴх+5:u\jj*m'gfHQJNNNo'NݬTj^IlG.???NaSȂd1~z-J&O=&nf5q ž5gh}xx/[9#64Z9U_uǸw0UbVOHHH8d!)neCQ$1g+;^ЃJԏ7_hCq-析[&T*AӧGm:G˜ b>{A$T*[otm":N26'MsNRYKij/]{DCS J23f̘1cHh42Ʀ7o^\\l63777???g߆p9R@linMTj^111IBV1eT"6?//`006W* Z_"o\ێ}-v&AQ;ow魢 Gπ1킝ԩSEprhPzǠA>x@㷹Msie2ZnΜ9C%a60Ѹ)G4zn_|a 4j30LM+CnI7}{nJ-:hEBBB.4T5U } d w>h^cdN DQz6Uԡ%05~V܍}2{EU7EH_gLo&yЪUON2E̫]EY?~|%k6;&/8888Aʮ JI6Fm2_uyp3DhMFYl5 qo/j[QKJY5#''P"4\"KL0zIh<~IHec^]Ҩ] _?_<x䑀q{FF)4کSvOmf͚գGD(ZRk⌫+zuhӼe/|nu?ɋ0ߜo5woG\^{aXVVH$AP{+VܻwOSʺ u0 4hPrr?]yb8$$'555117 ʰ['r``fbJd`aXFF̜E$tjNRvb'IR8<$ $S+3܏7d;}gQY%l_|o+R\LK46u$I.Njq=zTu$jI;OMU/ HP@ T?Tn$\1$===I$qBh<e˖$I ꔴℷ7sޠkN؜$I+ csOOOߝ$I@Ɯ,;~{{{e5Q e?W.ރcPL<-fƌwF)(( [*8. _9;viذ!%mo߾ȑ#ѕ7H%J&M<{lΝ9::*Jk2,;;R8ofAtח KRd35vQ3W4%:Je|7wiD" s!‚b?o)8kwBPRO˸^Muw*ʰf]BSnޕ]ZTnS t:` ǧ 0, 44PNIOOOS ^!02 gΜ_jUϞ=OA:UZgusRsiF~?'kIC' I"7ߴ ,9996lX`СC% H q ۧa7 .cpܦj爩`L$GZfYHReXVfa~~>2r,5^k MFmPO*JTRV޳gOlllϞ=@Io JeҍtgFFTJ;ԏ?>22⚍7BzzgZcv! 8?nO'o~/E RsO|]léIkz:vļgY+Z2 ge1 /]w[잕YqdA>o[5|}}ǍSL10 %A#0 we19fbdRS[m#[Ylt)6}(sk%m}֨zGhB<7W.x;q8k@xbOOe˖Yz@=* ՞5 j@(W<[0 sm՞s_hƥtG|MY5{ř|b>EDv Qs a;|׮]ve$\4XAZ(=kр tzy4 0Lq`>-azF~nAоP?cƌ'Oi۶mec^3F?V=Uk#/kڽCӧOlr9EP87*6[7²5v`莝m—Q[1x{8_KoBꩾyyy\xq%DMPOt/Sq0qQrEpJ:ԻW\ 3P ]@n@Q١~%]5y^\='0wɓ\ZE'''77۷o+ kK]EÛRk"y6hoFBpɰ0-e q04@Qz6աf8{=|S>} }'V`'ip###{eq)i]r%..Hgg焄k0FlǏϟ?_q֭[m֢| dmxk>q?ykFQ37*uM)l\p\yS7ϙ?-\ݽJk />ohЪ۹7EqLp8ki IDAT`0NС^ֲ~n"?NmDxT2-w ,ڵ+ -1vSehf9h! A?;_{Ĭmz#I2##ȴſw޻wZ\… Zx㭓$)m68jQQT*eu X&[&>mE CZZ霯:zM?1E;KOn-ljB~V]aڴiwބәA޼`ZG ;HR,>=<;vزeKUQ/ׯ+o[|٭營Ą5­C_3јO_:;w=z4ZӤ@} Z~@l5 dᩅ[w*g[QKJ]k D2oSqxdj.6ڈm<\H {mjw^kp.1 s U.,RyHS{_I͠mTufAM{~t'2/iC{&sCm<'(((8qDPhm5Tr_h2g navy0ɺ9!ص~h$8*q|Μ9ٲun1G0pz7(VW.5F-L4;^_~uʺmjO_l~(uć^b׫ z,_J?TyOS4ZӤQZH[#1A#1>޾i{\rQgLn w5J~R8:xW4JMٳҥKpta7)J<@ VӤMٵY!N9$"iڤQց^A!Oɱ#<GH;J,s ww~lqKC d' ^`v#Nփ=cHZ5`OK&&&^\WK:ԫ0LAmǯY-;qLߦaNU5Uo$%:`p+=@P񲨆M\3[2~Ya2If^[e/&sݗB}_,+ZɵV?=6)с>A^nfLe"l] ,n~NH"##Zm>}vm\%ׯߊV40t[j[0F9M&8{L1kF@$}k)KU)u '#y)Z7綜~/Eu+V b@]U(h|kk:b=2a7A˅k 3Aq d@#p0pAjPC(CBHE(@<^ Lo^Qs7s=o͕\MƖHW*Ԣ~I~AMT*6zFCMk4N:Q DwSSS6mKT*ok't:#$kYt:Ri}&Kkמ+2ߐ}#2A `Da:^%$IO$MvykkƵhG߅o gށw!'\GYSR_]:VնQI Sr g?//,G`D"1x6V`Msa=NJEp/9A@P9S_FO5yY,/@>~w60V4fPQ6z֨tQF9r}FP_ c7 @<JuS8Z lsFL`"iy;Ve/h&Ks{}7x“ =V^[5kvs̾k.>~.o@[?eH0P(ZqLyfҁ{oCh͛7o|Rixnj v.AZE5(1}0 YYYv 3iСC=ã˻8`c@zApW@ 8kA NPJς'P:E2yYrB0101%h1ks~41z{Ő7qֵmi ޢuNd~'~FM)VZeKHH_j^^^&M [lYRRғ'OzEabPk aC=a(Lo߾MM+u֙B!+99_t€t %PB p,/OQegaRׇab/h&K'FSͻmo\Ms񨝷;wVQg@XvL#U!UAK.*U~޲eK@(V\M(Z|nֱ֨c&8zBY |ՕIlk4JA?^0 Lq-}H+92mȏԺhUSSZ ɫa!>,}&ڻCE +6J ?{+@ۡ _gyZacQC>svtc_'(M!=@B@ 8Iw(cYce"]kP:ޡY`*BW~[{<ٰ H۷dR5VV&MMJٻEj.JwATwKBvҨɈ5klݺ*j֭sNΝ_9P_F rD勅tdH 확#{Ƭq1m.P_T>Bok#B dյb\Y>!cCaRU[jGP J-<WP,${¬B){_y;Je/h&K d{N>zq0F?tTfK;|u{\8]|ByU-uX~ƫC{6m+!͍FGGW~(5ǥŠ)Fظfye[Q˥J_OQ3QQk-XH;t`u6d@uy4P n)mu ZtGzl~pc>hs@ /|nK>QxcP#HPާOJ.HFЯpavqcf;sNl0ZVJZtqvs/0<$J@$,+%h)-ISH~&IuZe/uGQ}wnݴM!C(RBhKE:RR EQDD !m&gcel6[93g&wS2L9!2a4܎9Q!8RsNlakn:@!u[&Ge5Ss_~[,}FwXI0y6eX];ӯ;3&򞣡ݧ0B W6^5f=5Lm1I._<`잜`>7ׁrz/ hAG @D*B %! DkA2#,h^xjF荽p09{r۾>+[BK/k)1^_9:^q#;=+E#٢V #<#5* W^k.UׯowsK@ФIW֯_(M˖9F7$INnŀbbbmԨn_ݑ/:{ -dǏ_Wl@ >|…:uh4TEB(Oaq7ip&L49 "hFAYPmm=ب={]Nn>8zWzp9ܳ^&gQƾf -_*w rvG"1S޵k̙3k 7شiDE6lذas( iii&S9H53k ?k֬ݻwj[C c?&@C1 "&%i,$8Jd#Ȃ/eB\ޭ[7LJ/^j*W+Իg/0LB]sL]|2xkp`l1 ,+00ͫe&Y:.+++22Cd̆@ `CTr0EQڹsF`R(˿1y?[B8 aDmx7paB$m↟)ÉX,6l6۳gt-p<,cq $S?emڶX,Pؾ}36;!7Nrk;sm3miolngB)`㈁+-tA=Ù =>="J .]T(b1f2Qƭ 6]9$K.%$$X,}N:d21CŇ "H$,3M&z1, :OPPW'BTf$=H$Zֹ7RfY x&r외lff/fl6 6 %L-6 B ‘#G{nҤIjt,iK֖#{f~ HvFG>~@:=~<رY#,bܛ]deeu cD"@ (,,43N燆z,n4JohZ>:w.J]0n O cFh3:z 7|cXye;^+dqǰoGԨ\.g)9Xnݺ5f̘m۶EFFٳgԩPاT{|KWJ5B^M(sj!h^p!A}QnnT*p8Y䔗5)HC6"HrA,R`"2&߹sÇ;h42̛5B999 ›5B$ LR쀀{a=Kv!;4sj+& .Ꝡ^zc] H߹s7J+6~ڵ""JB;;7F8++T*A$ݾ]Ϳ9}௧}u̿3t+N5~%ꋓn;pfs_%ߢ,TU ssa#?dOĝ C8B b  )DҲẽ0,CY}N).ѥK8Y_ ]C?~|zzzJ 'ׯ_._^ k v,97=Y/B-Xv#?yI"'?5a[?V+h&-g|Բ;@Hֈ;9g*DBmm& m_+jچgӱmq\4kXmddСCws{ k3x>`ᴑ]]ᮙ#a}V]9s;ﻟiQ[8{xxz…wܙ5kmcR}4iRllllllAAAЫgu6Fdf^ g=̎]?jݜ&}ʹF]-$*ӈ5qd(%(46J @Z >}7K9s7m[5k֔>G>Ԩ]d 7fZu[1`?d&ݴFDڟNJJPJSsCtZnԩsĉ TV*TjԛWHQK[RNmSҟK'U> Jl+Ի[՛νAk>A*݉42=h>07 `s?x@!'g~b !&OJJ{lu+Jmֺ0P_=텇IaN}qmiҢ1}=ǯ뗄7[oƭqh2{tsmpٺ.6XSP_s€f[.er5Pcb DVX9Pę˯}Ԣ7U@P  ӓp 5l\-Q3򂢙' `*Ѵʩі-[?>!!!,,nמ3.,:'boٲeqqqփ}^K$ҁ+ lQVhܵpyz :"س Θu" ~hȌg5LmUՉ 9uTBBB\\=&9~(=èFaH E_70d|G> ԨCd=PgTW* հi:Ji@Ww.&!]ōЯqpn^i\lz?A1 54ݭ[7rmm!xTx-(l6w9??{f3Z.v{vNսg*HW:`]4Mq:Bd IDATpEG4y{y;?B%Z i!o/ocm/yt~}j;'3I-K@-p!zK >9::h .@Р  8yPs߄{R]^_)υ~*e\2Fb D_>g22ө=O i& KeERRjqoQOۆ0PM9yFߏ_ [=sOJA1?$k  T30>>>>>>vWjjC&^Ъ=т?wZٝzE{Yp… ♙F2e+Rp9WjYnϟ?ml-x$rhU*Śk»ojgfMǡѶ=Ӝ}SM+m8m@=kԡ8ϫ1*6v:Ύ*>!C>}M6D`cIa }C\ 6REf R\Li)x2HJaa!IzzOۆ~dځ5QIaj?UH+g՞mݖ1aMZ4{&&tjs YR&8"s?A4#"(,{gϞ'N+nݚ2eʚ5k{6%;WԨhiX {_FI:ykl0,g?{e7SqT2I8UPoΝ;ےu㦊Y,X}veUVZcƌh4v  رcBBBBBB~wP݅kFN;ɵ\S\ޙ3g<|ˡgu ϣ9 ##ue8R.X41t,P9yA`c AaŜrRvf4<1dogϞ ]t8q^w}UPﹽp0 /uz-D lʊErjXYq ]!!5O>rի!AsyKzfg˖-.]ڭ[7/۷zfE֭[o!5.5n-5k֬Yyk 6hzh4 2L]nFr&. aGhz t3ZрiȠ*R9r-_ӕ9_9YTM^x]vLQ8`(oGV\  ӓp7uRtκn^Wr5eиq㄄-[t֥3ׯ_o>|Q^9{ʠF=& RPNM7ֽc]'oT̖\͛уq; jDC ܇X!je F!3x@ɑW,gjb՟mwF0׆捹{:߿O.]WrWfUTCѲ?qDf{ĉǏ˳^1%%%44]c{5ieXEf(gRR6{Όhh)LPyhAOubQ'ܜo.6sFToѲпv||-_\CcOmtd!V \ ,0$"B |~C ܟ_Ə>*^&w'1/c _Xz> s 5uxZdɳgv-"2LzϞ=KVes &tDqj[ ];ZtwCRVy׸ks'_:q/!pެ=~Z@ w5F`01$C2.eE?i IC(8Yk g <'kSk.j6v{rдC޹sGP4MQ޼ysÆ ,L"YD!-)cGk,ОVS\0=}N+WXf͚9ǚUI^&2j5j1cƌ33)))44s֯i޽{ϙ3-)+lQӣG;?3$''~Lr"_g#רZ?;wDEEYhνrH1X,qXpabl'](aG !@H4A;f{={~rmmP(t,Q?! nVR(  > I$Yf,+z]zFӧ9sfȑ&MrK5㍿I5j[n-]!9LBKom/f ih4ZGX5C?7oNJJ:y$ӞAI6MaƂL,1!%\ Pcgz A$[I} vN~w?IEY_+-+X |Ԩ-5jkj䌰Qv`wAH;tbiٲg 8џfKUAO ^垡O>}ܹQJ"Hcf.j^/~*`A@ &Iaa>N$X|lsǏ|s2Levrrn_U@US^FG3Q+Z۷Gb,z&&&֥C۷/j2򈺚k9TtZ5lFKmDp&^&)>6jS;BŃ>]diM&C~?LԔތ>254{E *.z]^nbל%Gי(sGq&U]oY/ܦ_-g|F[A̚5'2cPs)m26Ec8f>L|(dnmdddX,Zx^^^vvvtt&22RնkСC7o$B"hɓ'j*22 iad@౸`x, LJuūc<=P |TЃ>9]iZӉbϮ.J߿hm)L&ݻwO3ܽj\ǢEYj9LdWjj* q*Gug8W{]/$V*lϧiZ.{T*W(^a0uرDTZXXH}.\dɒR]ʯd[֭0^ --9ן'b)+ \l#,3HAĔm2̦c5shdnX,v\|bϐfX Um[ ܹs(o੡B׬Y̜@(ZVo1=3qPVy,PL c 8x|fAs//Y)BQe3>e(KxE;vcǎ;]X0¼X,̫<: dzuCu Ri᱙@$G  r9(8g%Y}Ri 5jM$+ ̔k4Ph5wōFbaHoTڶm[>o2h[ٳ |p힭;Q"B 0i!BbO rdXf- {Rbf3rh4Ey,P{RЭ[7MJE55[.foD¼V̭ 몲g|>gQ] mhmi\|yL_{ M/M;p߿/nݺ_~۷/W [ONNr7hϞ!3mq:T*-0ajeNz&661+NvYl9/(EK%F[噎maNr׃F27UU.:AصM7q 6$kW^||o|rxY K.ּy󀀀?z]ibQǻ\5(Ui5νF]WDWu]JPąf ,P(a~d:k0_}VHv^,WmJդIFkhM25:ר-x]_wر,6B!a2{D}Nj>}HRLT'$$۷.O[i\tSN'N\߷o߽{5j3k.Ws:HU :5j \`XNJLLlܸ3X_B֭_!_0h z 8XLn)Akn9)Lyd=[ ^|r{5ݻw?~5-jRf\zt 施qR'ⅅݻw?qqߴiӍ7} mVPPkU_nw=_ڎT귓>Q-_[J?6^6oVV7RCh4ZZlZ>|3N$4rf84@wj$Օ/,(9" \$X(9ۊD;K[;w>|piENNB$WgggX p]#PfjY|לwڵ[nn;vu[v!::fO6]vAu w\QԨRܸqѣG:@./[̶烾XA!Bg5 J%B7 " h&C 5&A"6H6Hte¥ߜ'ݽ}Ԩ4B2j$0ʕ+vj޼פRѣGWTzʕUVT X[&wR#vfp[kо8ר%T]&z05 `:ur">lذ3gԯ_J5l۰= ӛ<q/ Wx( r@J)ezt&& AHgf!@B@ 8x,-4RT=G\jiBڔWJ?**ʉ/{ oSnQx=qrhFybV2#. l6( 3*d ʃ")fp3DP `bAo,5 {TۄSu~OG ^nrֶ=GGn&U"~Ff+lQ<ۡ]dŊ ,HOOwx E" q&kDEEXK.7oLLL,WdorA绕 58$oҼߛ(ӧoݺU|ppϨNÓ$*\/ 0,V\ȇꔢZ"4SJ|J .?vyp S| B/Q/ a Pn»N㿻5 nmjwI?rHԽ{QF%`ɶXxUHRcjie2P(<{ŋׯ>hC$D>B+~(Lb`f{ kjMFd.e٠X eb!e\f{\^h{*siqAo<"%mw]Pw;5.׋"$#h`y͛7izO9>ÇNӴ FI(ެYK.1?ΝYvm\a)BQ= ?Dt30O P`3k(hW `ȇLva} IDATOk /n3jFX-T!6lY=)ŴjhуT,P9GWDt0/xVkXF0#>SZC7QJJy Ϡ6mf^m/BeBV >5ȩZaMZķ*_?5Z.(-[˛4iՃ ZjRlٲu9ڵ;p*ByzS^AQW`zx g֭vRwiR&JhO"8h aS"C!@S`14 G~L_!@`@7? F.F߿.^F+^==?fz%9tZR$[N!Q JO%ƍ+Wc;vl׮]+}WoܸqYz>jq5ꫯXpWggg׮]{Ŋ%"Pgh43ǐG 7"N(X6'>֌k" hhɌha4zƞ^:Tp S5NڰHgf baFˠFׯ~zɓ';\{w1({w^zرI&z}hiT[j>n?έ MMCh!ƅ;́6`A 8)P[ϳ{ a cv PWm@'K":m_Z5O}^RQ+W={mk5Z{zNN׻(h!7yVא򋸑|42" Ff~<_lUwX>Q/+Wp 9#~‡䏷-i dOMM5 P\]7ߟyRR:t3gμrZv}*øThZZZjj*wѣweÇPHZzv6J$Ʉ \H'J4OׂDX6{u3e0{lqŚgpʕvr^-Tp >Ab{@>{/(G,Q.Rek444g={6n@ɿ f3J4ѐJR ݛ16w5jߜ9szu[nrJդI r0X|ԨCj rrrr9Ͷ%Tcǎ 8n! d(\{5q̻ e/Iզ@`; j'}%+dAcKap8vFS*^[2rvG5xV{! sۺ}m1{O/$]'4 B&c9#G$5thd 3f*d `B+}x% UPo[tj w y4QHڢwfnݺ_~CA^4UX2,۷{g3foذ믿v251 cƌp8;vtF|h ֭[?3@m۶ҞaЮ4 L:VV(b$K!y0%x*dG)RZBҌKXl@w%Pp :YfNVӧd r0UϨ'p OR62B$3Q =>= 0 |>$IU.ץRBӴ7Z'0y0bĈr]bo栮Kz`*WTp!QE9۵7jZFT9&zB7-lP8`A`҃B3 k~>dSNq \]<~xjjZ]bQp>*^4#匟EQެ1 Y'Ntr;v0~Zv. C2#+FE=c4@Pzo IVV7`RCh4F&94>}]N;w˙h0fN}};t,>Aidp皠=D"Ԍ/T6H @8ACVǗ0@j_?MJg$IJ$'Onذ7dAÆ ˗gggX p9⌰Pq32Lڵ+ؤIwygǎqqq:BBkVTTD ,ktǏg5 ^vsYS / NވH~.t`X\~}^1dhh] = N' c>v3 )D cCƅ9| HE "">i3s?&_*(V$***((hϟ~ɮqYFOwFH7M- 3g+nݺÇsܞ={Μ9I|Wר7>#fNXKYYYJe@ QàNY,\mLTcq ͹`adȑ Kw,XcbP5=Wʟzzo/ӘZ3f)N|nX?eAaò=T*޽+333 P*nm$''$xfff^^^z</((]vNNg&I$Y,t:H=i$k$3Lv4Mo۶y\nAAP(txwӿ\bn׾}/^`0deetH\]ܾ}[&T*]ݛ|xǎ/^t7ء$I;v̮b?~|vڹsgі>I5Z>5j '^6l H  o6;ŧ/J2HZ 5Y}|ƽ,guϊ קtaaP6ݩSׯ_}ҥK{/_$QhԩS4M[;3g0FsC_xy 999 "sזxڍ;bs4;t@n60 l111111vt?6}hd^2Ci iԨ]eAAkITpo١WOӾغADad/shyJP?px01>i I[+hB& ɱ:i hӻJ0fês_G@AD'ܳl-[Ԯ SV&e(? lDߡ,Z:%Oi\.lM\&{&y$HfZp>uh cf.'ڿ?ѣGmRƏ4N[hY{bV=Kʭ?xrJ){tu"V ~C_v{FTsjtgΜq"^PPмy-Z6 )S6=ݷuڃ;DYvɉ%DLCSFXhL8gMS-HldyI&c_N!Qh$h`` AXA߈f6L4 P@q! GeԻr.]tKF0Ԩo;pRH$xb)((`,d:p@JJʝ;wf̘7|7bXVoڴ 3M&S-V\ `ĉLaf͖/_eرZldɒٳg[[_ !PA-<8BڔWJ<|ӬЗk2rGyC:,ɓ~ej3S.\ .~Κ+{Q+A`Z C )nA> M0$VQ`DF$P Na^v0`p#X xD t (b/&h!"iI75}&a6;udM🂧3B+nram[{|y,s꫏a2LKzDk׮Ya.]87HD^x6޹a^6 2$f*BP-Bt|] l,PP2K0B.bpyH1D~sbK$tFh%0L$" " Bڴ4 SF]Ai\.EQjݻw7ͮPead/\AeBκ a:w@0^2b̤x-'ꨖ^7NHH(7ҥKϝ;W&Ճ=4@l >'hJNE 4j]GMeh&@xBJR`ܹIRp*4Ž:C WP|x^EKﺪ2wj\̯ͯEx:F=QB1qremMQKm*"""?NorͫyAjle{.,mٔIQoKuŋ8{n&{9cLA\ԗ F=V@3y˅`f5{jd2YgoG:FIt1W`X,ެ;x_V{wU , >Ep#$s#s fZk.-n/J|E=WTA-LD@\U6aaD`f\9wsΞ=qo4͢¼ʿ~z;"eXkT#4Xb٠4{.zMs_ 4qSmzP*Lbں,|})ZuDӊ:AǏ5\PB0999 is;EZb֨6N5563MHK5MZNC~֨" i/BK 'Zr}֨6¬Qm^-5kT J4]cWWW>=՘ؤJJJv%\/..JuEEE\_d m2BmoESf"T*r B`ale5bى\NOG|F ѨhT˧zPM5j? ~zh|L^ʱ J{ߝ{}ЖėygWNrH{0LMY@_ʳFPhש$K: !<+PBȅ .]7!xtIDATTI4kN ٺu###׬YukQQь34kT*c͚BF̎͛7,;yd͚K$ǫDC ٶmߟ,--###5k^XX{5e=9ni|,/) +se9qtޭ8zh',&*ͽ*D'FlXh;/tzK.DC@|/$B4eC|???g B[[[ggg066׸9KBQ /4^\F(:99iecBQ.SB%UiɡbbřޞmiE@;z{;yrS< ֢ !ңNuɣ]_m-ΕmwXwx#{l7|x(;d(eӓ/f1Y߅LQ v |-=gP?]<.JSʖԡc⤥nj/9w,4\OL3O+(Srq@_c(SED_W{=Ǯ8Ҫ(+)GO)ߏ[4Ʊsؼ}wO{FF{zMMZ:ֲK~ٝ-`Ģr?3TNkiHiHiHiHiHiH@_?Qy}Y}vd*X(>*C5.l6$DNձlk,M]"訬  _WDU3e_vz[yQ͍-:Zv sCBa2LKabl,:@'}NNZ}||^ߙSbڝ4fx#J!LW 6w᳷ެDÅDض)\YlBhEz&E_S\Y1na3]OwwEBxCû]O(xN?B߱); ޡڶÇ F̟Zd6gB_~2&x|Bmq>}ck.0{gY}MW;9G<5^?6Be%ڹBۺ =f ]ܜT9eXZ[RӅ{7)+vP6֛yc݆M|#w>1gtE A"hK۶VrZjy˒N|BYl\PmqDA X']et3G w?r׃̰wg mm6p"nu!(.mPv5Sz雕m^ w}ek7|zz:L{ Jqٳ7{?v[tQư,:ĕQݘz;B]7K%+.xOpd"MI޿sj6,E^y~ KG_urIol/$<?mL`A"^V5!D}y6QsG|&-?RF=]eޚULNF@826nQ/H p )rLM]0'TASaգXn}4/}$Fs whF B|o ><[)B#7LF5Ѽ31 &Vo Kzgl5oSVQi `jA" QA$%9:يCΝUwra]N,V &]D?tPKO~ƣ߄e8"KR\5zxfTZ)emlxN {f]q&n`h/#QJn_J;0Ȓfż7X.d Ώz \;yWb07iҋjk[ EtRWw{!LM2IT"M|u^3L]]-yޘk..j]&n W ɔ^}37?&x;/)O}31ԻJH=gn uCo !Ӣy^BI1o ]N;N s=)÷oKǐ.̼}TF5m-dBUURB 9"hJChA\jvkQ7#{`C h#X}Od$WP"h}]/4/HNNכvt7e W456UzǥE Kü\;xs֖I+dAoRc:2LR}bOq:]xx4LfcŬ`taspGDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDv ?v$?ue>ުn( '"8h4NyꟇة?$$׹gETY`7^2pw88λ+],&ّX קloܹϬL Šw264sF!9NKB--gb>8~ݺ{+z-Ĭ J7|azMƐ/J lN#[A /v_r*ǤFͿX;tcū3M۝%9EOLu_Ziy3|_Ƭ8ZާWGn^|4ymO1`Dat+I<5  ~qpoo*jYC͐$D%2;六v4Q?R}9#h@28`YwkϯEqGMr饽4!:IlхaB o,=TW֚XQmIu" Ҏڛ3Jka`XK?5Ƭ!l= layY%g9v+]fpݾ;,aCyr qZA % tC 2Lo*K+Dz0D0ݐfC)| XK88.} ^/wa:O;[}@}wlX D"T=پI]-bֿv!IgNWaJ| r垗ZgС4bճeL؝-a _:@UcHSf6"m;lh4ŝk&t򐞷kҚ01{^,Ll!x#7zo \jեWT;h'W1=MDPDy2P?3C7y P~IсvMt% L7u??mm3Ύ,yIPp 2.Xq)~+"r‘Q;iD&[8͊*‚ʔM a]}BTEYìXpc\άNT EOw[ :MP6f%'t,>i6,jxydӊdN{0/aD Qu'okEr8w^- ,>Y-E܂kZ;uig!ed.Ngz9= V&f#V]}߼BTxeװ%gsR>ss̻\[Q\s%S,v qppp)i:y0Ui:7~e[p}üu5Ft}m-N&mc)(mZAf_}o=<<ɷ?{eac Lkxɓl/\pmlKOOfnݺBlgnl 8q"6C5mMXfq^{'{Yw2mp8lY,fd2U c1 KWUU{ʰi-mZ:s4ejd9l \DӦ~%C'{l]5\ }KR^y]HBmqppp6c-ق&Zsbʿ"RTI `8888Ck6G_W+IȪ){v+h3,Y*`Id2$R}-d2aё\РI$J8N^^Lia&` $Ir ܤ@ H$˒\ۢBH mG&!PgG"<Jb(ojn?Qfd$%e԰DMs/ L3 KԞK.֭:D"d&٢UU\YǏ\9cƌI,  !@sx<͖|go޼9000$$I[#U/N $4O}}e[mmOUUNG&Z*++1*E{я M&t@X]Ch23gnܸ:zheee&&&H -EEE666Ǐ?v a[ Rkkk \.-d٘D"+++T hh``sm 0aUxH&~ _M&$ iݼ|ڵkht: 6 055fV߀L&#Zh4'PX]],={-ǫV.nhhfd2Y,6[r  TVVbLfmO>>G(DP@{/^#SDrrr &e|BD"5E(_@-I +^N {A___R055zWBݻɂ8JTޱftD[\.H$T*$R+FINB/^z'!R&*d2 &[bUVVaUTT`0Tb+FPCEGw g=!&o޼A^x<^^^y9oqzFjre;rW/<] ˅a?}T:3`ee8xCE q)\vѡ ^'P P5(|.<;aoOJ1j틑 q[-PH*ZARr,1FF=, xl񉟿YAy{{qہ*J 3hjaTYVU<||vY^ʃeGaɂD2cTxCu#!chyM6|yM35Fbo 9'd!77Wq*8Hd2H|V|\ܕYUۀ.C Ѫ嶷0:t1T&y-;[??ǐ_ ða0Ƚi򵌇8TܨS Tmdg?  CvG$chA6 JZ䰢 EɆ8Tozt0̙3{)OΝeW~ yѾٳHv3dMwm|4|nMN6?@ŗVGD&>T*Xv$!h/hQ5Ex mHk?up}֙M]@d]Cfoܱz Ad&D"QJl6ƍCV:88H#Zܮܨɇ훬dG577W]T(~ .;q+SEKr筝WO:L%#3L6KƔTǎ;T< '7jffUlqQi'!chIc+.{xxo7~!bC 곶Аi&(顒 qt?;z_BgG}J~G MhH>owZ=!T!###<ġ:"~ -yiwR|`fj?gL +Onqu>UՠWTvvvAWWW6 0b+y EG8T qLV>̜:b'G}4eZ.<|O<Ѷts1T&Ѝ _ 8K 25*ʫmbooA CNVР(U64??_J~YhWZr슐055-((PPvhn?Ah:/sH(HaKGHVgkk뫪T磬LR1RlCKKK$ógdڵJeל<3ɮYοj9txą:tɟ*XZ>F@6UY$Չ&OmkXsmMUERnGleFU|BpQi QchNBK>w/}Zwppo#"NFW#5qJ,  diJ@dhhl2@ee2ˍWVVJ!%%%.h4}-3LV:c+Tϟ?z gΜ5g0zAGw4߶$kO!۬#{=ph-ݓui}7iHY"sÍ']3Ȩ褹^ٷ/wԮI_ zUr2]x͒%K~g}-|}}}5HIs]]z6bY \.y8QY! ,9L Cՙb8 bIcc .4SWZݻw <o֬Y{%UC9((H^RR"qM65YBY31v֭W^g"J8~nCFMd|+h%OG 3u;XCHfXQBs3Thꥉ% |:i>oѷ}md?}tjj#G_$WM>}sV@itxӧ]$ eqqq5>|=ܮ!SVV잲t*TV 8|O( )]Gw& 'O~z,3gT$xG`~/gճ0[Q"꯿4hz$.--MrOMMMZkqZKH_k2}?e8PHyyVW]] x ^-d2Yj,ݾ}T9 .7:>C-u(:2ɝOt YxaL r_hhhbbbeeرcg͚b,,,Ml6H6H$zDOJFLf(8ֽ| @TWYVnՇSU,Y9v؄dTرc|r݆8apCGmSԅ/rȵ~S# JlRR޼yK&O\ZZ =+6&RyJXXXcQ+QhqZ;rbᅣAж#hq.1ՊD֧o1T>͝;w„ >|XhѣG3??K.MMB mUn{ ScjY& ](@7o*YƲZCC|kkk嶸tG8Lu5N~Zd4t\:a IDATg|WOHH@#@h#Ēd}K! k괙MCPj0f _pK.]~=P ks^nɓM/tG8LzQ]1OϘ-<鋘&,@_-d;B*F!7.^ h56 &ai =ǏvW͛7 &rQmhh(@?4CmhjY&Gf뛧jd5>#ٳ m&k! //OH$aZ6$-RѧOL8VZGP(?^__ժUJ"7~P"…gqNq4DWW_Anb%vLjUBf2Ƽ8&&&"92bgq |X*Zq{J[ⷉmtt4$Y[[gee9;;+6=T cerc߆8DʼnɔQ.THꄇu\.v*ޟeBJְ>b{ L6gaiYYYݻwOQbM4IQ:mYx T }7*:3f_~ر000XtPJJJ>}"G*tR___䧣#$w!T !/2Qyib/6κ]`_#7kq7V _;Sgձ?&:Q(7%P DnT)Sܻwoԩ[eFPsDĹsJr.FDP"րn0xN!+_Pʺ ww#9R݃mBEÇ̙cّ!Lj*kqC-}ŗǥ*Zr /++SϢEmU{)C<цt(}_= ]tQdCmA׭[ 9Ѳ;p8=D&RM=ā U8n]]Ls7%hqHKydb%$$Çъ100P4GyY8::JmCCj;Lg0D6dQ+/7pmIy<ͦh, % 6mb0ӧOOJJ DnQ(#FH'H$r/^066WTVUU5zzz5YC zzz*삩)BşEwė2ac^~;gMNTE,2B_.Xz/ڛ/55X,*1y{1{5cj{qvD*Pb`g_Tf0dw=zwީSLLL|}}vکSHmp8&&&ME$ kǃF) TVBee%^A[( B 浵CKKK1 0ё._,xh!C`sVPa|- _>yM35n"55 _Ŷe}}} 0 # H@XhQNNׯc߿\2uW7^YY/,JAPvD"aBT*BܵkעDd!''C "(֜p`JfnDCqZw4Fbsﲝ޷ }|!LIߞڵk}<==d7!Z~9I+bPGo aYߢyB^}ɕ \~͛7k׮3U

!2}3(* 4{*[I}g+u5w{8 %" ~YKC*ΪˍH$/>PEu@)1h^ι?zƚQMPxiwR|׿0{~Q+vu{@ TWL&Anݚ4iU~~~N<I-š1ZkDnEk-K{{hC_D"mܸQVRdѶ:~ ÔJMra1b ϰqƏdv/%P|T +R/ B> $ $4H?~%Ȝ-[&kkk̙>FQ8̤ؔ(`2l6[.~eFBVX+7:l2<&LA[g\nT}[Y1TSg|ʊu#3INRf|7C@A _ Ϛ廼|տW} .K&wp"""-\nIIk@ ՌX[[K"<(.wӦMG +I`V0 s\l"ck BP("QŠBa]] +W:tOZ&)~)"KUU\.͛FR\|YjS?5 :;tq'=$?h7Rfa]6͊@Yq'wB#G9sQbbb^xA Q^^J&HΜcjyzz`9!qqwwwo֭ۖ-[d JbIˋ:<'oR$ZKD":bI7005k֕+Wzvڽ{} N:%hq$PUflQRğx` ~L5)-hѧGgO^#p;tv7YKh:ZqC YHP <:22ĉT*ڵkt:],@P",),,>}:ZGK{غuTnxqqqRRѣG 8 =RNd2'q4#޻SAgBnL4I8?$eMK!e3vȝ~~ 5,1>|ٵkWPPЂ dw 3gٳGqٿ4`ڏaubPKۗtBV]VuSC7^ 55uuh{R.58H$Rý !Cp\#B˗/eĉr111r/_|rZZ*ŁDHh0- LzB(šF3, aoo3i$#w"xԩ>}0Fu&r=|rrrTų8ԷP~ Ôo}4+΋w P(0^Oas.We8@`0Tƴi(R#\*?֖?~|ӦM׹=8P[,5)T:dBJZK!H$hӓ Q (::ݻ={COmX[[vP}~ Ôۗկ[@ʛQ*ۧ{r;UõVؾG). A0dqH}!_>ok?2SO=uĒ,h2F[fĉx!CL<ݻwbYUFU]ȍbcU+P=uG/QEh`$ "#byzz>r["#D"џV!ā/YXĒ nqĒDB[-5Œ/^z~H",,,PY! d2!ZN:!UКkjjb(Td2BN:1ڏau_A?}5]?_ǭ9ʽ21-071 w++dܸqx-]pEEWr2,PV2xݺugϞVg%4p>qDG\3s͟욵;ۜCx| pm&:3˦m!R z:T+o 4P҈r ~ڄ̾&7>$$ʕ+G (i 2wbKd2D"z l:::bUUUt:[s#Z-*7"u kJz0jJ3o\ S$-XZZ 2]J䀀@RRRFF"m4| OLL~LLL455ڵ+l!$QSPP:/U=3ܰ$Tˎdd-"W)n}Ώ 8:-T(qT%KܹYhѰaÀRQ]] \ti͚5rw&8Էmm]I]f]}zc/SnBa9?őgjYC׮]133KII|D"25x܆@ffԚĪ={'Md(R|V]Cv-i)Jkqȥo޼AumܸqgT:uĉJ2Jff\\C}f$Ds[@2>vcPyB_%~CyyaH{͚!_շoF@pppRRRdddqq8Iq⁁!y5t:[nǏr'OC2PET^ZihN!ߜ`9/R$٣ơe@HHȜ9sƌs)Ndkk먨˗\222RKlɓ'߾}ҥKo޼ gqiF0:L϶0jEağCW\˗H6@hhhZd"+99oqzFjre;rW/<]DR =!CjkkH_׮]x{E$''?}TrJ}Aط QŠOF_8lR!kHy 03*,7M Z3bĈSN8p@);GGDž ج[nʕJ'hzH/<ġ-`cj{?ivY)9}\ !^@dK?Z?Z4ā@ "##GSPPAPPPPBBBDD+++355\6 1111(( ð/t277/***z̙3f̐766lkAǏAZMh8`<ΦW/`PDPPТE6nxMwwlex) ׮] @&Ur!ݻ7m (00P:tג>yɦ ;vׯ_seq̝;WV`$RJnh_}E$&ѻBC6?.;($kK)M >y{56$EOLIRZJ>x`n%KbB ꪪ>}憡ܞ={Ju; IDAT+>!!!B Ypyw :{2ȼ[q֊O|QC9'**ի{챱illDt磌srrccc}||,--GmCOOOO<M HkqfPǫ ;vd'pN>'OZZZ-ٳ׬YcllkqZLx$fBS#e}t^{ &iB5j۷ocǎ1c;55NG<}TSSѱ7))IrHϩTjnݤb}83?9(-Z-$:::_lۉ'$Jr,H$xXm Z`^]%dh1lyX |||VXC>IIIՏ?.++1c@ (GPz%D%w0&~P%UTQEVIc1`&<|pT1Wݻĉ+TiA/Τ*P1WlI^.yIp..0!:VaknCӑFtd#o=z >JZTD{PVǏrr]u7t<:0W7: UUd'=-a 4.^ZM\UV's鲲2j|@SSDX,2}233áRGuv JWW7??NBD"@ P(h 500(--666R]D"Nm*z/ijj2, 5N}^~fa<||||^6\0776mPWWw׮]\&?aJ9tZ7${]\JJJd?ǺuV[[K$A" l6D"!Sf4'H)ߙbDEEua$f=n\j % $*,A8[$lM-GT`;v{4 }RUUϟ_pRZsYj*Pl[btn=$i;\ϟ̛56PyUUb믿[ȈL&Cð]ZZZbbYH$H$B e===wwwq******)<A >|PRg/8Ӛ zzzGvqqg0oڴi&Lhr͛L&A?Ӌ/V\)%dꬥK>hoضj;L%'McL)W7Xq3,?_=z(((#B%7n֭ >Dccc,0 Ȇ)֯_$4++k֭q ܹsΝ۷mTD+V~:߿իr\&yuhZfpvg#XS]y}:p۷onj3bĈ7644[DL&333&//Rv\7 uj=z@6ڹsgn  *80زl@#e˖egg_pAy.cccG9{lwdCʩ9sk"kyE֫g5n!1.]<}lذa>|@tG<⠠ ;;^zYYY ˗/?|i_+/Ê ͛檳UJْH]6,,͛wR[nD555UUUJzpQV q0v ?56d+a}m4YEOrٹ.!ŵk޽۷YXX )))|>㥥[XX$x8 =z4dKG;oxxqlڴi۶mSGA_UCj;LmL˙'3kdqA;PEqȑǎtRLLСC_~Lӧ@P(ϟ?q۷og0o߾2'11ŁEZdX[[]v=~`'OA{:uT]]]WW;ɉq-$TabpCC!s݆7TΝ;2eСCCPC_zU^^n``0}zKKKKARWWWIٰl]]]U418$ jiiϳf͚1cŋ/_!M+ hѢEԽ{jii:u #!VPa^l>2ѱSAҥˡC .gڵkppppp!2F޼yɓK5 W|QSE(`r,`2bɍbnkhh2P,::z˖-)))G6UɓZZZYYYߦ)1v"7ڦƬ-Z 8љ6mڴiv.;w|[[ۅ >d>}WSSS<3P("k * 1ġQ'CիW^cǎ;vl||}tPP֭[EļzJ__޾({'FvË/9r`dffvkĶmgTQ34 x*++ʊ|XKN8hnnN"TɌdaaa۶mի;JґtGh$"<<|޽b$Dw\G*Gѻ" EET%vKb]l1Ec&(**&1*-b(]­qvٙ<'Ovv-_>.. ΍QQGw-^Xm–v۵kW9sn}Р 8gk8ޔ$=t ۘ}l]9gD"q\www;wX[[{{{=p+++oo BafffVVÇa6L&:Tirrr߿ [4Pm]QT),,2QYAa:$k= fN6~lܢ TFV\\\TjbbR^^fK*qu}WQQQ>>>#F0u$$$$$$$D$88LfkkkXCBBK(ʣG@ӯ_zzz9svY.d2MUWW'Z'> 捍X X`T"D"M+ Cf===CN ~/tРAP(0 MRݡբEʕ+GaaaѢv333wqqJ}||2$!!`baqǎ#GT}5|piZ. N:6}t(?v+HZj=FcX_0 W^gx{{҉(1Ц@KDDΥwLulON ~a$[A0'''>>رc/V.tttl3}UUUbbWvvW_}eii9}ɓ'wގDq'%%ṴM ?DZt H$H$fΝ,mД'OH$Y ,YzRijj*,˗/>ѣl6[(¾0aי>,qT_ʿt:`p8&.^wuַtF) R&H @XXf=1Цl6,yB /*t (^= F|}}]\\"""T-^ݻL&sʔ)C imecc)44=ddd,Zd4?0,''ɩŋyGDFFFFF^N-w=/o8Z`bbү_lq…l6O>K.P(UUUʵ eڴiYQQq…CBwroQQQ;CRa%Hl6[u> wwwacc`tX  lz:ZA+^.w\3(N+!vbƢszm\VVV⢢+V,]tʔ)m̶Uoss3urrjllܸqcff9ÇMLLWZSk4P 84CISS{ h4O =xgʟ?zH:UFCCC+++);Oj666bbY핎oP(l[~~>J555JLL$b833L&4F޿U:Y4Bavxc͘+d^O `QDYņ>,G\l8*ꭩr """zժU<)AEET*544tssobՔt忕aaah.iFh5̮✁[>,\+pCMfᕆ\k+cccsrr^}w;+s޽ 3440aRMIDATൻV^f'Ԋ.1n<3s!#^߳㞜a8d ?ӧ^:|p??1c8;;c؎_AUjuuuBߜ:uɓvvv...{ lhhx crF酅ba1U4vqti6]{GI܉cT>bu鷟0h>Mrqhɖd*/ؽ{wJJJAA1cƍ)WЌ*=^m۶m۶#G\rp8WWW:NRq/...--h0͖X,NOOWPkF,Xٳ/_VѸ1':vo{ &U!(xqB-4XmBa^^^IIIVVVLLa`````F.ܚԛ7oX,[[ۀ6M&+++aE]]]~~D"Qm 422R֫yG'FhQ*'%=.)(^!!}m #G$&&fddԔ~tlccp:28v3H$Ǐ߾}ѣGBؘD"UWWq8 ٳgoz(J$iɒ%C jll'DӈM7(NQ{|k|>?//L&>_VVvp C__ȨEPPk{%???4PE-tz3xL[]]\D"Ӄ0|>T) > (>>vXejjP(v- ߼iDI(ݮutX.*.2.Rnn500V8&M\%+++UC52fTZ;747U1Ym?R|uIHHI={ *5㵵l6SZPR0L,f:hX5\eN.*b G[ZZX---/`F:q1ԔqSSSssH$xqh3D666i4#H, Y,FV,Ҳbqhhh[H$R[0<bY XYYNq)ܹs\^ӧOìOy3ӈ.Q)l۶fbyyysssvT*}91[@x) jq?~<}"oM+Rz-Umذ!55󋊊َ3F9%3.[.;}tb+V fo޽-tuGB囇LvѦ@ HXW8%WVw4s{0;qQc_2@ :K+?!?rN> ]粮N@ D&Ӿ@2bc8ǀ XW|%z9ti_)9hN{ʰbk9 @tݤch@9WvF2?!Ćƒd___bcyTJzzz{&`]T*N{{{hL&͍X-F*"Zt+߈KxZ)Z8ͨ' D бIRNIctiEU¾%C7M!L}Sb'B3FӦ@c 6j'[2?!La]ӟž~D9 C O6]қ =OEfһ˼vy'Ё \?d tis7W)VcK2`+!}UǴ ^yS\e9EOcv̘3@ OV%\fsFD$?"sB DWӝ:av(=$$+?|& c>mkfjw7;A%/6ւe?y{w^ntk5ݹB 芤o4#a{@ 嚙7XqT$~>fԾG2Q9;ɊZ'O.qf孭؁;՝عB j!=bd2z0C:өNlskWK y)5 绫&Kfc?^`JeشFN:W7e;{*W7b[~%YuJ"ȵ" ᡒ H(xEFj>/te͢NU uK3ULm? tݜom'W"sĆþnźW[kF}8Ifvp@Hb0Hz6<$7 F'6o_9\_J 1y_N=nsGPp;zjQ\i*U߿x6Ȓ Sbfan1icgIEJ["Cv%pc Wlfpr—{z^9*HQJ v- WV &t;V#[;.J9Ipy͟!a^(p/g k~XBrA+m_BVvnKielwzlDvsOk's<^,n1~αISĺfir~Z`ڵڝ;.!8tFS]+.)[kfx-}Kj9xщgŦz'5`K/:]'0^nlwSms 5c/)QVCPkHBQzF@ F  4@(HBGA@ : hQ@w3IPgv{,,{Rd@{ȗ7l&}F h݂#s;`;0@]z { Z1A{m  /~<)pڞ:xSWئl!~|*(^|S/1Feqa^l[ e4foV\}㢕ߍf=QAֳb~Jh} Y_0cJx. g,~v2`f(ڴ˲}R:=U)ۗ@}1;0zLTwq7g[Jh}{+(~;n4}θM$\I{&;3!7F\ǯ6,3d>? 2h.nlWj|`7o3l/3azDޒcO@fs ՞c z.680j.+UPQFD+`ռ J \^QVW2j%ՇVv2ƀ#qֹ}>ת2Q7~W"P]7'nԮ=r,C0Y察y2!d}~\ Q Cx8?sћoqZ _)l?mZWB%phq捜>Ʈ " Y>V7U6$vT!6,9z? kř#\ok97;~[LbqjǷS(n!όsږ^"ԕ)pQee= Z?3q]^زɮ@ @ tԃF  4@(HBGA@ : hQ@#@ t$+>0LL:LT&5?XE$A}l؝I-Q/]&("z?4o w39BCt$Z+s_EKi7l7r֭-ȊWYw=U*X>gіCT z"iڪӥ vlhI;@m/bcGE.Swa 'f9 [q+Ȕ8PTsFOCq E/tӱu{E.WqpǎR͍ř7P7uEl =p`{cv]!јi>:.Ou >&uA+D^RE=Y˄Ģ7{[C h-xP0iÞqﵸ3Kn[w/(8Δ諵>Kvmfrejq'va5! }#^??FYs3YJ#yVjy%maXڳTJtM]FOB(.~}|W "OSMhM9ibyξ4 ;bqO<UO6vñ#$^~ڏFYp8V&9ted_&ZHX&qi*' ߧD7ொ4# k.?6M֪;Fo.8=ۍNw[_uz@O?xv)&KN3}&^Cª+d;O7C ||[(N%YP}<R)Œ G8?$Cc# L^MB%֍<ܟnc&UVȳcbe<.~9|N20'aY/KAacQQ mcIV?onLZJ$R[7JKqWC^%:䲾H DiyV̥g2Ί㲇}HqSMȶg2/_57礙N7*bEΊ0of h0zv-EOBVP=j?ݟH塋N '11jp{PyYUwHHs6G>9n 9_]=6ӪΊސsXS ѩ+D|9vo޼y[&ՠhL-w36| `$ܽGFsw]]]!o3<PO,31 aTC BfPZ7$|f`@"ԃ$ @(HBGA@ : hQ@#@ t6 e = 9/10 < 1 epsilon_mult(A1, A2) # A1 weakly dominates A2 => e = 1 epsilon_mult(A2, A1) # A2 is epsilon-dominated by A1 => e = 2 > 1 # A more realistic example extdata_path <- system.file(package="eaf","extdata") path.A1 <- file.path(extdata_path, "ALG_1_dat.xz") path.A2 <- file.path(extdata_path, "ALG_2_dat.xz") A1 <- read_datasets(path.A1)[,1:2] A2 <- read_datasets(path.A2)[,1:2] ref <- filter_dominated(rbind(A1, A2)) epsilon_additive(A1, ref) epsilon_additive(A2, ref) # Multiplicative version of epsilon metric ref <- filter_dominated(rbind(A1, A2)) epsilon_mult(A1, ref) epsilon_mult(A2, ref) } \references{ \insertRef{ZitThiLauFon2003:tec}{eaf} } \author{ Manuel \enc{López-Ibáñez}{Lopez-Ibanez} } \concept{metrics} eaf/DESCRIPTION0000644000176200001440000000332114660742422012521 0ustar liggesusersPackage: eaf Type: Package Title: Plots of the Empirical Attainment Function Version: 2.5.1 Authors@R: c(person("Manuel", "López-Ibáñez", role = c("aut", "cre"), email = "manuel.lopez-ibanez@manchester.ac.uk", comment = c(ORCID = "0000-0001-9974-1295")), person("Marco", "Chiarandini", role = "aut"), person("Carlos", "Fonseca", role = "aut"), person("Luís", "Paquete", role = "aut"), person("Thomas", "Stützle", role = "aut"), person("Mickaël", "Binois", role = "ctb")) Description: Computation and visualization of the empirical attainment function (EAF) for the analysis of random sets in multi-criterion optimization. M. López-Ibáñez, L. Paquete, and T. Stützle (2010) . Depends: R (>= 3.2) Imports: modeltools, graphics, grDevices, matrixStats, Rdpack Suggests: extrafont, testthat (>= 3.0.0), withr, viridisLite, spelling License: GPL (>= 2) BugReports: https://github.com/MLopez-Ibanez/eaf/issues URL: https://mlopez-ibanez.github.io/eaf/, https://github.com/MLopez-Ibanez/eaf LazyLoad: true LazyData: true Encoding: UTF-8 RoxygenNote: 7.3.2 SystemRequirements: GNU make, Gnu Scientific Library RdMacros: Rdpack Config/testthat/edition: 3 Language: en-GB NeedsCompilation: yes Packaged: 2024-08-19 18:54:52 UTC; manu Author: Manuel López-Ibáñez [aut, cre] (), Marco Chiarandini [aut], Carlos Fonseca [aut], Luís Paquete [aut], Thomas Stützle [aut], Mickaël Binois [ctb] Maintainer: Manuel López-Ibáñez Repository: CRAN Date/Publication: 2024-08-19 22:20:02 UTC

67tG9Ds~AJ]|E9ɱzI4' hNt7?:d`#jQ8]α -1g`(4{لT&WcȦ(*/Idq\d6[+Bڿ&іVG9Vؑ0<ںL_mmWsj;nn,gtsÑ?X+Y _"뷾׵}>7-+ohf=9(g}v!&kf5b}[s#ܚp1 `[rM\CvzVV;[-|nR?sdG2a~t3K)P^P.:.ir>'ïr:]) t3emޘOP+h~).'L||d~vy:_ &7m[)nWP+.2o&?!q:tmn0ĘZ+wл$MG놺^iz=p1o|t?GP?3= ݸ(w7nޫq37n\eƊԍ=>cGRucwiTgm~zSc\,c\1Ns:`au0heV :$?H݀|24Gjs}aߺl31%kNܙK>!y;vKw=%agvo Qj!+2r3`zfwJ3cRMhd]kk^z˨^MYHnI>s&ßIY}Ekmz'o 隧,i?oZ*PG-CuT7OQVQFU绨#P~(së\~#G?Rd 9ΩVG\Ϫ龜h<6:9ڳzjBճ#ӀE'j<'VyUdЩ+X;ǃ3+ SA33د4V9 n][_.ioQdݳ._TU.U׫|&s?n)4a9~|/f/s^Nz7C:^8Xu+ʽL!{n;ܟW[:G۫NuZ3t)ϏքPy+<0>s(={U't:K5O'uk&Gyׯf^cxWVF1?>p׽8@:Wкa#J!!lV[ߺ}75ԓ^оVWڙSՙ\#APWr\+t_KѱGGnØ֑ۖ '}E^HW/#ϑN>WX]%,ܧrVW)Q"!OžsxNgauGOEpGu!d]42-#b2xO\n`ed;~bY7.k:YT,Zrt=]U G/!?{{6y]dmkY&UI:pw l=Ef I/o tE@?W+('UߍW,.{ƴ-'g3?+c+|]M׃"$ d*=q6{lE`ƿ_u.K}&zAKQ0 C2cDG: [a8zc x J/,__+ycw׈/?W\>})5ww;Jʽ7zfc9BW߹!cNV t|ru3!#D5A{qdK+ۿ[0' a!(g~?V_xq$g>û=&‚p3oD?́0xՏFߐ/rz,Q]hDtc:p1qBq0+,kX4"x н *u ֕7o<6_pzv}3yz!] 1 vg6vy: ij Y ֚[0? ts.} | ހ Q^/>YznL;|u[ xk>_r߀NlgTG>vfyk}Z!N6ӻ1o_Ub{0Fyhs}`<~@Sjc} Ъ};Z>.a59^<ĺ7^`|}\oɀߎm峗(_>/rt87TfxMɿݲ8OMyuJc[D?9>}9t!>{j P|| =ҙ,>S޺~hm`\̰9 -ЏMOK\Ǧm, TdXqH2_"LM;77!Egɞ7t^u̇3$m&\yIF{#Q_vA}՘*] ,Ok 5wLPyvn?/{ߞ?1~={|~AtGzy~UF1^=/?~]< t Ni$1q|+ў<{l]"ȷ{tAGfc4M ?1 /:#yY>|tp(㛶`?zm_;,on/'L||e> ͛s`y}pB?|>ϣCoeP?RKp~/Ўg|٧"}A'ݔB|Ք om&OjJbdWR?&g![5c}|jr[;sRM@+'%D9`&;V}[=DGc^*@2 ]\e:qJHw  R>=c< ~|x/(L3)px|N෠.Yǽ7Y>~Ph?JA?' 4ocRX~/}xyɢ-FydB,/q/O7A$w?lsy{|羄}+yDI8<G ǟu|\ B| {E{>Zy_ps)T .^Q!I>bg$7kN^d7!A=@ q]/cɷx :_솢JHD5ǿxǞ'r>~kا/, ۶փQCkCqVw;C;#E'{{p;q(C g)d wXz¸Q 9}wK>u'~r%|?#[{5%~>Wt_7#W)_j߀mS@~a EE]k8yU̗8@H`u=O>^Vxy<.m3ehf!Ooshr!~?6y|ҿy*_Y5_O[cR*7ϩ0Uo _ZmYm5}ZMIOW\{=a*Ojb1柄_V҅8'Y[vB)z sfצ ׎Qa:c \xDŽ⽢yUύ첃*5/E8wBu{yn |Ӽ@>8˪ɮv/"Hb'V/ۘI.?o?f5o@gc ? b1}nu1{9*'CU'܏A4t-u7v*v`,8|~P{جP95uu-_= gTWlXP}0= :W O~5UqO[.MeK%!oEdċ*Cv-B/;( :x1̇$/( aN(D>+t N#_z GLޅ<=IűDߎ^G^anQcJ.auX`[}{qwTG!4\륫_`fus.z!zY#Qw>ηX;`+G^Q SNoW9:%+KҮcInun#{:dC*{oN@Rg=+Jv$Eg% Eox?ԉv`5E8IP0{ ,y"RXݣM-3Cj ^us`΅_[i"Q$ûʻ9-Py 3jW&2z[mcf} x+կQ Tޢ/;F?=sse mG]ݚ0 ,NiZc1̌*w.ÿB)w^ :l<|}u"3wX]g/S;c:F tg382qZE~'1DQ݄GCBÞQXb3@VX.s@L,y.ϱ2CYiN|a+9"_unLKj0w!\}5xb)!?{'"nB}}p2G)B(X)Ձ>O!DĜx= ~'6%|,/W̃:>*dZ˯>_/q&g*fO(wy򧺊4Ks+OwWuk1?S 8}eA(&f}%y6X Dn|ʼ})Sq>"\S~8yUo,Uvj,m%n?2ՃKL5sa|R|rʟ4 x8cr<¨ioKsMBtyM5G'mJ9i m*'yrwBzP%MŔ_QisD.Te6 eJv :=u$b޷Q㩁t5ؗc^EA ._#l^WP2OAu0̫U:WCx_OɬN;stV]`.O7],zܟ s+tO6(O<^~L7+#F%^&?{y~O8R {_rA~lO~Kju!Vbu<)ɣ,?Gj6ȟqMt]qP@'3 ^!F|a#-䀿7!Ey)>sy☿?#_A{7z5w]X=JHo|ݩ՟|D^2o]H@|݃ioT?!,=SX=Dz(u"8/@:aK2;"'}׊@,8gOկ9H+zvNc^ab}ϮA~EdI"tOM&*[sJ/ +(%ՇJ|X{K/gr+`O$΂9v癦[84Yqx=v;Oiţኒv&A}0J{h|]꿮;?`C fӣҥƾxfO:Uv+{.i9 c')ua X|խF̻v|ի:.@Y ; u_~~ܿQ)vjd:??:ux/O<ҨKy }-<]ns-_P9N{5L|=gk:?VuM9zV ;tZ߉eƬ51KE9]Xo-ȨBt:Y~u?AX;>=ӀKg{ /3i\se Va]=w|cVa/&ٳUgud/N ?zX)-j_}YX糨"|x;"A#C:_vO`kd}IXwCA}-vͨ{S줕7jR*쮤I= 7Ik_z= ۟P35ˇ O[te{M|ry>-=cqי 9]ѹϰ ϰzuY w PIǍB )8@վѿGĹ3wΨL3B~ j:'X=eSFuV2νUFQ u Ē12 .nyAqP@WeCvėk)6ş:ިbo:`o1 _Oa2qeZW7ɟ&PJԳ:JY@TO[PO(cI]1l".*.Q2èr:qz˘݀=r(l^d"*{#agā$k*T?I_V~pj߮o"|OkDò Oח{d|օ{P  $ynVK5C$ٕC׽4O0!Jef1j'2{~c]LHҿ.ʱ~1tVhSV/B 6/hXiث].gy;x^5˭YnQx{QښET?1zQ~ aYoٷR[b'k̀ߒ5s ufi< ?x4h|7@3i|G9>v:j_՛#G^vd9:Ch`yNwȋ酽MpQݰzan[' ; ~к`cW܍yMȟu\H'_tAczX +Ez~_Uէ=vVXxUygU=|&)oOgHkg|A--Wuuãu?\A6!'qSuomFvi*^އY['9ӣ \n]6AuX=Ԙ**n`~#O{;}Xo_+_Y7枃_0KFy@)K=-Ȏ`tK]3OA毿S7-.i/C׼4P#s#%՛K~Sȇs)]~cQf"?"=c'8Fu{/H"rT<"mo7SPyeCQHүX/+:ңp](THtx;9iauӂ!ОM7-^{c3Գ: _G\\9=+cuTR7cr:jSYv-Y)lὩmW%}o.ژ),ӹK#(,ar3DT2׵lNzeu{\߲RX٠V?-[2릿拁~w{N/=;/`1:WHRt6sNG%J.ڋ65 {i\iz쏊з uY2y5\_Z: _7 ;`ZBgh_UAuԕRoBXk;HZ>0v&A ܈y7tP䆄7RyK:Ȯ}Mk^1Ezn>lv>)AߘqBm( :/]-߃cD8xM̓ݰ:so@|QV2qzl3--mWZD57pFT}9Oyb=HII}urW@!}x@V'^=ydW[}q;[OH(+-t8Ή)d87{`thcF*b03C>S//)vA/ԛ'u^3.ʢC 'eLwffc:U`x?0_wtE5qVd0 _]8=V_n[| JJ!Qb^~ ͑T|!t !>!,y`ԟIKay\״ܓ:ܣ{ef߁'DtͣzTӡ~ѡ;G+΁:I񩔡diO9%^B~'I=ާ/~L ?Ӆ0_S@nԭgwڃ6gž N.ס[GT>04X=: N hku聢-CaDa~Da ]``*s|]ۯS(pX& m#'OrzvI-4۔7@#v&~׭w7QҫB:=~z1O'.<[io̫M@e{)+o*x˓qlYy/*ʫ(%,xro"_eVYTS=]rLo1#+>gOӳg'(kqY[z@kR 8O s=,2ЧG܆`O!}ZHS=3{U/>mLuicztUؗdKuΧjeoܮB1]u]-xXYgbsXo~z ;?=2b\θ ZWOG[/݊tۊa{ \XP ::%./,)Ow)^Lf>ןѰ_ ϡ B1;έR̡9+\"\V#W㒀Ӷ 9ERyd79@h;ڛ"bI#J1{x+f#D1+ۜ>="k_ʇ&abȇe(q㈫P G %x"Šk?\*|Y1(b&\gPK-ͱ_@10c+zN{ zu;@^%yo t {_zVgur =+,>,<ڏlIdF~s*,kSŷ|@/\Qr]ڗl%SnT˴0߻\o󴶏NHG7 7wv_!]+ӯΦ}Bz~",~8_#ߧU? q5eg~BznmLnTeyn})zYnݽQ_>6qf2a<!kuQ:Qط+kؚ lQ,оA]jנO}8FX[C,2;_w ң+`!S+བྷzw'|;py9t!˦قr~>rRPP7ˍ:BһYӹ!票kCձ۱>Wm گ2ԷOWOENճY{*lVfup~glյ{8{}ZFu&pW(MÕ~~α RHBw8WfdO!q1ޤFQ?RyUޔ˨^rpHIzQ[˽PO׾#^??ӡ~:`~[:4?zko|=y5ՓփQnLW ʊkzȓc'D[nFyX6Qo}9_?qԨ8}~aANI\ؒ'K<@VFo&rϘ~eiT&ukyi,4&CR;bݓYp5Y*gs`h=i8Jź 1{R`= _g`'8(/oLwޖtwVou0s=Ak_Vtw6[O!e?_Ms$xp 3?9cZכ (r',vƼU`Q"o.(]фIOxE_ȇU@e v h.dʹ8\}x~9DʌSɘ/|cmV{ :KF}3nXE[wJUŠ%f}84W{փt! .SZZGK?ս%}G׿E{F2NόjDX?+Iߙߡ}|*B(6t;72khE۠@6Rا}e(T*3wާcݗG-AޓB^OfcaU >BzZUN|?9>h;(Ƿ7*/2C>)$>yd>RVΫ c? " ax/ti+5w )XEVkLXW>C?i{Lp^h6? f~~?i./f\? ["n ^`^xM>g}?[#wdN=Ъ{]G\ ^s lAݫ, 왛v=u8w0o^<_0n| Cyd)D-dV[5SPrq ] bU6CչGYw9]Iw}4<.nB;cO<?";l<኎󠇪<:_~|PD 26 !!F70Cty6@d[( % q\9ߏCU8Hk~$E=nw D|.aݭ؀Zs>_3嫆H;a~_?_g ݀ߥ<}ʍEOkTwmKq]/G Ǿ'5B^{Ngwl|=nh9:;_Wo<ׅJa["*0~: j3HX z%=EvwKr}ݝoq>\dIW1/3' ZP?ydQ =/7$ N8d `쫑  oƺ 7#lJfKzq#߶wmj׎tj_Cߐ ][V2GTb.z/$׿f?I= b~/{5:ߎ~Dt 9OɞlLT|Y7o]!H׽KqR|͛x>6`H.ӾuKokk𽧯iGkM%)aїEJN|s&ّ>'=xOBT֗XExӃ"\h 5aBBwoyb\܃xWSs+zI0OzZDs}w]B&yqGN;Y BFs"(aF\?Ρ*qC+iV< >8aي.zz`\A`ʹ8wne;8,Dwv5V¸-xly 7zwT^:ye?O [veǨ|e %㸁5gst@A^%;h2jD^ku7?ꚏP*;aw3nj'q 8W86@(Px!?Tt!_6-c 9{gux{"ퟰtQ:|x~%[WJ-odݳzzh.d 3RCxGuY/zS _a{bN=ĬNUi_NW9`??Ќ#EMN :OG7 T'3՝ ҟk&4BObÙ{ [B?zTFu獞8'ӝzR74 !@wϝf޸Q?7 Bcm؏}v:|;҆pLƷ.!Gi|sL@|:u޼yʅtՙ7oTof?{&${*Ww!=!{AyS K9~'Տߕf98e3YdԳ:ramOWz*h#٫yUlU+4axGv1%P8 kU`_U˾bZvcղ^do[~Dj,{VTq~K?%;> .]UNBjI0\qK z_Ņ#@~ *1,N-_֨NKa: tkmQ CtuiV?֣ C{> ?!=Mx#e[VtX}ZH.+}iʣקY]Z6 И>&Nd.8:iYtC8fCmGq-(bGct*9|zCgnD( 2+,ži\Ԉ0|\|rq?7*wA|\\tYqi|rd䋒R=Og/w ?$\͒>E31o"yϓn[I{0<-tc|ܨӽYk7]h}f)ϼvwNC=^HS]DG1ow?[&4o||űKXV *[Ɖ<}^U!{+a'_;j LNn7q:6{I1& (kq=f(guy¬^{:#9Đk>?V=NSæ1&隬T:)N ]ʨjW5f iGls*͘uV#NBe/}xI?)isA~rMu}-B1{tʏ׏t׏~, E݉kvm?zAz3&%c?kciN[RwBKB@@QwiHBB\ޓlg{7!]fw>M#k7·+^͵i=wkVx>}{3VK?Gdˑ|@sP%*MaTN 1y~FRļ}[~CY(CF:w4 )y,M.uMUvTnbZdWkk2oCȗi.قb~T${q;v]춖 SPnj_ 6##ȳqJ?/{|'imOn u).zc՚._3 G5R}{T.YVb~ju4ʼ|swB.I׳OV5m7݇?m<;i#>?WTSW.J5 [5u`J]#NDw|<-6,|{L I<;˯ PcXWѭ͟Kk$s@絷^tE8llW^p 1b6t1lH1v(Pq8Kȟƴh(~y7I~;by;|9O~8ǩ^F?v1q^a0s,"_Əm/.`r1v o9V܇p$]lyl>9kAQGjaQ|&qmq&i--xTX߷3f?㰾PlKRJOhy&?߭[Ͽ2uB^ |wtbw,;4;ӡ )&Ap_) w5@.wd X߳)`paZ>?x!݁ހ91፱3 iL+GYJ˫le>7\CNHMA1ya{w\p9 'wz'C? ߿Rc*9c am׹o~sCF}FPv]k"W~+P}aEn]4_\.1_LxoPv3s O x>b{hZ0$Ʒ$~Au6-xu+10==繅VOm%~-9 o<1zv\RqT>"y 'z1\ԳP yU9LYqɁ(6Z )+ˁgl2|m3EA F@{N(V]Ԯo/|3R㼒y$8"`y?YQvPp*wAљPL#)&E}z9bɰ\Px$n7p;tNֲv77r|^F; 6B(J\+EdkiR W?}݉W~[(3/,$K: Eh7=u>5yF5C;dns]"(fB2:W3114ḭ>KPL-x^sXPw~LZX^g'^B`@ UsPfZπTm#\lc=?)%'eB9##Xƣ>(~䇸`GEx.(u>  `\X>6~_q`- rzC/->'q#=xbp#/K_y11䘈 Igz{}F8Նx+u>a9ryq][=7oim^.bSϷU?g+|qۣ}wO+t' jS,qy?:\B?R [p'?e:scMO!2W`';Fc=@s磂'`Ӿ2u=0+?M,s{{¾ffbr/>d3|\'p[]eX.q#g(&2,3=iװ+Ⱥ \tmq]uwz8|ZWþ8Io 0gOKbL |M')nxi@xSjO)KP,o2/<硝3L91Lڏsg]˺q^qN%,;R| r ]2%~Gp?,v%²Y#2>U_=7_>~^Ol@~Q/Ks;c?_Ck ɿv:'8˯_ٹ)CuQ^].^k]uk¸T·]lAm_xn,T?5c].4}U//FI,uSy|N3dqʒ DzxZB}ᣑ_teY^i^~׮X<}PTvX޾v;w=ˋnP[t _߇ryovҔ~z<<˧gN!9Cף3vRm@[-iNRTV?ف<4o° t8 _2/!Vn~~BD_,{KI~MX.׳<=ϳ$/ʿgn<&"a|>^7`P]*ӳOȫq{<=7/:<=Ϗ]YX#xlgԮ9eՕOq1g(cOx&xT΀Xh8k12VJx]sYǯEPq;ť8>ט֒C0N\cpj{Q }5 ??$=\܄ voP|(gZ0uo ewl&nW3Yhu gXVmÚG)‘11_Wx8Yfłޮ[U1j̪%OY5<-o+*fev9YO3G#{\.B7~oJ\4-/QPE~z~rtXۭ2nWbn">xjdnѮ^<#v|_#y>F㊠ܰ*"Y~|7;7Qf" <\+Ď"/y{O!vOk0żo'wPLpGA֞bh&+.*d)x#[QUe_Q_ycl೴|`$՗|KF{}Po} >g݆vD,W4<(n/~К~;>6ȫU| A% Jq3x~/Bylϥ"b<T-v#z9{q]>>W<Qnw|ۣ^}d< ȳg2<ûP߁ a2+Ie_Ծx\/-<}܅I|Hx݅oFZDt #y!bb!z9瑫alOW>z<..ۋ}.ucGXΜpy0g;GU"A8aQ0("ˈ<|2xqo܏d{/e.C]B. 9oQg'vNn3'"3\CxEVD0uDW0,}SbbQ"cQw8׫n^탸rUyX^F+k~hT5ߞ[Z'~,~oAYڂֳsC}P#օ"OO0UOTb1~z' b"v}oapG%TOṏ'Qz[i;e y\HW\ .:di9%6cq-BhRd}|#[^q~|iF?I^;gB^ߒn[A )1cDH|/"DU@{ǥ#F8γrQ~D^/±=ˈp,bB~Ҽ8/XQ<:}[71N!?)Sޣ<5K7ފIx Џ8?]f+c~|!^CX|_W(:B{8o[es4=߁YrBdydמ?yyk;qb㣦+^b+/ʴ|se$凯YGkOڂ?aRPyb(-5]c~p\׾p. q`:wW(h/{p 6! 8$/8ˇmb|w*Xyn[t1 )vu17y_碽ok޶wB>{Dy/klwFvkm ?,ڽjBl aCJ6?l0fC筕ޯ/q֟1|!źzf<~qVlo?UCv@Qcyv^^S<7޲ayu|zs/?H6˧˹rX+9/ ͇O5ӱv?6 )CsNB]jl KV[pHixHEy=csksw#Sh/<ˎo?8\,'7rY~9{:ܿߝK=&[KN(g4Y;@LO5%yi^>fܟG_1$28?P_bΓz‘T_z\2̟ԃۗb>N!}WdzyoeX4XOgw_]5ȣNp~Cs|w9.,]}KNyhyhgߎY:PG8|\!/!_yyƁw~SBq^ON<2߽!!,;y]-0nmu>Y.<I>y!"+:eWv͇d lGTgf<;{~.c?s^.dכEBc_ec]h'Oj^[S_\e},\yb@UGO{_6/4}ySm>ry8R߰Ւ|*e!?lAY2^_9E6/h'oF=?p⼺8ni/^Hx+ۑys/'Jr_8/O |8O.g?0}(/sA>_0>h,rye}Yx2 m q{=呫ȸy&-#GD/!lLv8sB~9$8,+//U/w+埻7,C;ZR ~Wb[Gr yQLd~},c@ckҌi#0["t (Gס p^p^X~Uw|w{89@y;+"VbÞ|M䣵G`o ;z o3q<KG>wa=-zūG-ﲎ`A<7I \ |`/3x"'ཱ3s@y⛼c&n=Q}S`bC#:D/i&f}*Ol'BGpM^]v2UԨ@l+D"~xD89sq\3Wp=\h\C 1Kɾ޾շ}A&}gC6x^Cg\G1 _=, ,.5xRxԴ<ꋁQ{ 99 cgr\1b!/OG=sMKQ/7 Q< A?8ޠbv>5_R_=/~X_(7.TydKWD>d_(~=~@zsDA;w9]9C]Mu$DM21?) סEv~{@z~uXOGaDN7I/v:JQ[Q&a9s'zy΄Ka39 boQȺ)dIokyxe)2O=s(tGRtY8HkGGxnDEb2KеTpH/c{=LAoI<Ɂ|ށn&1n:؋nT}"EAym(u$GGJQuX\1yL8w=9Bq#j"/'Di,y}Gjs~{>(N,/, Pfyp_|;=a,U5c!bYO ygSTQ}MzjQ?(jbj2Sl^bt*wrE{ w?+LD8FQ È(X#+X.gOS?h8Q`W(|vD\B72f?{Dhv rv@Y?{ $@ȳ Kό?QS~tG~6~/n@~m բ#a-*[~۠[|-j@~giy yX20?bXkv 5;f<ٔT5}zŠ?9P)w,v !n\s~_r+ȗJ_?{?xv=tF;ksfۡ(ysr!ơa.[{m|svBv"?X_u8.L^76;@m@Is(Ӕ{ϱ(3WcȟJ~"oy;x¼?=Ś ;ʺ M-{ ]90mռx+<œNGU\LNW &v,\/y6~p_9O1`#o?P%up'%BLp}C%>|(iqҟ{I\JlF/Tj ;W<|I}T sn߽l{?Jǖem9>^q=/8ni{vVAwq}w] }Uw/A'Nߵ|K\pny}NBs#*h}##ߩ'qv& |L/$bKF7%D0<2=CQ܃~:p_ϟ͐ẇO\QfA{g~/w/IB}S)a;z!#MYLqy]RtBZݷ8/}"qFgX|sJD To:?Y3!o߻:Kdj¸:bYGfMi3߁;PgSRgNx"zn YZ2sy=nVKw<4n 3 6z`'Pv<* `!xO*O<3@*Oqܪiy^̟fRxd ϡy (5 BICa.E"b*ד8Y?"*u(̗@)}_CԷŶiX6hG!8:ܣ '̛Ayʵ֙gp~'̝^_('3ns(c&_k]%ruԣ,o:̡ _IdT$\rjpbTv~{\5R=I?c\#")QӐe6'@2_w'<.QBxVƺaX|F 5/#|8sDю7?˷ _}.Y8 0nHj_!v87߫wk\zXgѼ3\oE)|_ME~œds q=EtqmBSs b/Ƈ,vSX'E]<Q(zߌ+0.hts\r9Beg\~jX!˭C?M<ؔƦ1bl#ax^Zo|b¼ ؞.!g!w9kr#w'|g%C7)5y>E`R{ s !ק9> ߮ЮKƛB;a|6|TNNbN&b?:8ChI;FʭQ{WZBZ4Dh ̓tru2_➗ɐoт7i4י3}ԙ5g25J|Idt4bO"8+ñ>$gOOm p+~83^r0y[Y Oo>`b+#%(&-(4Dc.IȺm/ڧ4E$rs:3ʝw(<)S* Tۜ<'W_xD#ScZo-O˫*2iQAhWS Ջz^ysYOL}0>u(ߋzb؟IO,u&GRΛ ߇XNz;GR|siP#p5"ϛdjwb<;e$OROg$u$jPz%Izu̕=B^F֗ʹQL\ȓʍēl|ו0OɨC$v$VbESҏ07"EN8č@K?\Gr5ƕwE~?#\ϦT~&ۓG )I\\O_@M%dwp)lww[޵KcW5z~ǮwrP<@~cT^^ʳ:Q'ϛS SQSLs_.v9"<2u5'b+O&˹PӾd}nIW患 ^i2;YLv\9 PV8FJoY9B?{qDZs$=ä8*SN,O!8oQi7:M.48NOEqRŶE*\s *yUgRy؍$۰k0!vbecݶ.陇:v9"'X;'Ğ#F\MQm<-'k ~CېsݏAien2g]gDywz9 791&FW[7rF~9Ϛ%<\[6,W;Įc3u[<yE2}ߏȐ %PFPyKu4nQ,΋%#\.,k]w?qdΣWO8dyŦ_E}A 쟜1{7 3nXVż -`Hpz(^:?F;9QzF',/y"}V{|Dp>ʉG#_&>V̄8 Gnu⛣@J~A?"v <ǮP>-`&SbUQWv"s sgaqIRF#G'ڡsa9bGM(&~"$'b4O`n߭Og %NԠط XZԄ,D\ڋ=D_=!Z^}ATzYEAx_g=u]8̷BDor8&}PN!]1ess+9\Gt4=ssely!O, 6E^J{s ~sGu !kB,;G(2Ŏ}ȟM\m.g<:{yf_zHf|9p< 2nc?+v +$)|BZp ~VY v +}¾teNOXZW;|2P}X73Ys!bM͚SEf *Tڻk[S W 7Ҭ^b n"^$sGl::b]4DT! aލ8OLu<&E/9 'ĎDIՇ {7uQ4~%+u?I H½ !UXZǓ?GU㾲.a,|(KBWpX޲VϺ6\w;kQ7xzppDu.\L-Q?؎<!Oc-3~tb]Eyn{y۝ 1sƌ8 y=0Ny!cfƸŇ +V2P3CG;U!sX0w8ozy9<`'D4'Ev~:?q sbH*O}~N}]Q':0x;a'=ڀŨ?'QG:z QGȟDyڪ) bB ䷢Z~2u2#2q'#/j,u}Ob<1jI?D^ ZڔE?5x! `^CiGC=k| nC5NU0o6|o6q(s!7xnC5J|@Jȕ ֗qϰe<sW,x ð_,y1/EGԋ=/QV2=Kaǰð9Ƽa0aSQ~ΗC1W﵃ݓS(V@/?=_d]<3a낓S5;έomBؚ!Xn97Ddԁ|Gjk|" rdy7_K<Ȓr.dfGWR;?b<_?uād_E9(y!vRPx}߼HLO,n7܈R/"v"yKR'›Cp!߰}ȅAX~a#O5z~s" 1߉E;yjHNJ'|ffp\= WvJoG(S&C{4.#cuEhHuj(<],zĞgSlK]7nr_5Yq]YW^Hx0oc-<%%ױVpi՞ޯ14:yXyq#$5M2Etrh9MƩh'T 1p_kQ75Fp<4l4~X_A$ sD9l?q+@:{18R_\(qZ\ЌlzVݳn Nygzx^n|6wCg+/dzYq"B<'`>BHlzv|I慸nK,v^9h<y/gM'gH_kNP}Ǭh1ͪ!.WY5 cUwwe0կTa,fehgB+ac1'4#~ /$vB1BvBJ}9 \v,u@E4 MsƃNn.{'$v9Kyb{p)ݮY޿wY꺶5[vG{k955y1\s\3zzN_VNGcsvDYuڇ|.w]ϕ뻦?l|u\u^'`;{Wy:/'=Ptʅud Y6s4d6ESy*{`Ð{er'Zj*Blq_!&EކL)uf;W3KK ןr^cn~YswͦƔL/ Ah ~)`q| =ŢSP?j'{3Eqzrj؞LΝ)fg|Y`#̗̋ e9ov5f%Lߺ]"Ybݙ_lZWiYјڂޫZO# .l E0ި 1Zq׌y7\#NA_c$g)e^J=|Yخ󡾥E?bg\YVh'իпO&hAmQ%M\0g8>,Zx$sbV;)e^^l@V˹0c"/t^Ryc3EaϨ<W7c &v`USxBDK=X"P0˓f,5'w@2,Ͻ8R؀[~r7@?]i.w.Ƶu‘2sp~~_k[2j7<'HέOlz_K>x;6_[ۚMukb6%^-Z<nˎn9b9j:IjQ̎K;)mriߋMwN۷*~lʴu[%oW׆E~zZ,ge!z7.@XEZIZhZE򗩜 h\43h\#/qmiTQy QNeiyMR,bstωZJdZty~,_5MƼ=[;RZ5\Z&s,ukI*@][x5Sc>V.ɱEX|ڹw NdI(+jJfQNS'Wkyqȭ(6J¯; @}A\@Յh@-S'[s*_$8VNjߖSU؍xv̽صqjr;'Gz/Ճ(?x?qީ?/5/.7Bu>Uuor0Տj9Hݑ|vwK&sP-qARÛ^#ǫ5㹼ҍST%༉`ߜl)' }F:F_ݢȣK\_cnq5[Ru ~YR~(`W:3o/!}qNT_0%3zb{p}c4Ķ# .Rc.naGGpr y9k7gvr<Q,o#Gkl؄ڿzq=^oc1P.ԣ9nL{ 3\؃m.;W}quoݖgj8Kz3Վa=s 퇵?vJ{.*ITl/s[%a>~%G*,Zܒ-¸^X2ߺɊBa؏y߄(cMλ+ػ5Kq-ժG5c~'99֫9>~5k{v3P_feϷ'|gD}.O>ehz7{cmCG+7]7=q щo&iWjit*6y/%]i eܔ3Pa\xsauyJ=^_C;<\</< 嬂߇1gʓX/p\_Ⱥ0u b*<7T(ډgǰz>4>nθj?}^nh7t8rOg/gqQKg86?ͩY|bsg !)g̋hFF'kH|x]}_]_Ua߱z g:أ`x}8ޏrgu>khoĀ~$sLy,~.;f'vhbz$%ߺh-n˓OO[syS[뉽ڼ]䋬jZZ);%*(gXog뛆bT .c :qtߍ\a ]G8׵Wރ㌮yCb[k4՗]Dۨiy>5y2#%=]:Ar=wٓaVl:'iеz\]Q]Ӄ@30o~?N ?_p1w?DC>_5?9;#N:qcsl>\5e5ib͗dj4<G:6}u#j" 7_v`{<Zpru-K򜘿PcH NO=5+uzO;b'y8;K$ϣTF_<qG'r-{ 昗96"_`+S ,sɏ|WRWzFpt<7w'koNFmxzKb:K]ݸi3P\=] ]_M{:\rn2mxnN ;a`=[.r][<kb~Y|yjDgud 7ʋ؊Dy8\'6{]0Odz!VbG}yʼ?;);.G?/|?fr,I%2:!3;^b&ۑ=.ag}J|iLsTN%<\洈0S)r >'[a\Xm8&&\ 4l_ ogۭ-(o;+Py.m5Tr!/斉7$>GVζhy۲~nK3m c֟8/eα,.o݂s%P/|:J>}$I+qnbtWq>݉w8| AfoͬW&=0f7Zg2c]p20̲<Waf|2s1셼b'$5a@cZ-K^Z8h@Iۥ([bn.fwo5a>ƷCf*g}jpw}OW|IOIEZH(TsLT֯:e[|yo4\+{X/<_H jͥ0{yDZRҙEqF(;<7 <׷`9s@ b>yd\Tr/L'g2w >}_:=}.b Ԯ\ 2R̵#څSBpԟ o~N}>B(G`WXۑsKkr[v cYd[^)O?t$@lx%>[&'8Nbyߡ:!떬JrN)}R[ȇWuJKp8->b$VBS▆ĸ-%WbN]WJOZZIl䅸>(~BpBc|[8o'yOG--=ᴢVDKv  h ŧ!j5%ԁo%#\%U8h$撔z$?b(XGJ?X;;#2-jӆa$FU8Oܑs,EVT@{3 o>,oH:$|T[' ? H8a>S옜bϴ~Y̳>ηǝ)q{mMLc7+ ƞ$4v1.FN{sŜP<upƹ{O#_b5 ϛ c[RS .GZ^SzMpSJaj5@R?m4D)ڵ\?ংQ)>|-TzT})N|uy#Qn\~ʽ?b#wOU3|͝}R;~Y6Q<>>/WG͜CIY:oLmz\pX';Etki8zhmԓܧ8>O#v7/ Tyy;as7tp{\SB},u a>&]k%NF NKS%^Fp(sb}G:eQC_D?/졸[M_ic -HQg6ꕺc[y] ַد\I1lMl\q7I[^hsiK.{[j?N8_P^q2Xav.f^:ܟ;r,[uι|Xox9ݺ8 ;;#D3Ӊv6.bZT/ySx"7ve画OC)^Ȋv;w~wvNvNqManc $~e68_4<%a?L\%}Y 5a>{%'ƼY? |qh~I^Ӭ4Ũ\ ~K|JENSgX'w~ܾ8=8H\5W@օX@d>r}ԁj<o ć|)nF?·c,dȒ8Ŏdr~Ljs_9}zG;]nȿ}[\G>:}}vv5e~9}&vQd|Kݤv R9L~3Wغ13~o7< s0|Nvr<*zGfͨш<r5IV\U7:co7Tu};_TZ{S.>g ŕַ$k,4~"q-.`<.M|aS UNS 2򟽊Nj3-$^eu! ne3-+bw"&6%vq(8_exp~(x[9/G]h\ؓ4k:[J DG6@@p$b?"zvɲb=kNעgʋ0'ԇD|؅dvHGa.Dܛ\I18[B, ́\̈́98; A<|{Nd|'"6v"!gЃX}"gpj7ȑwNKT%ϱ!-~7Q>w7ļy7u&ԯMȏI܉7dcvz'OZ"ءXO,v'"o ||_][]ߵv܂.{PO,Ps)g:@rS$J6@KAFDN|oֳԋ܁0Cͺ[G.| eNPfDW&%S zbPz/7ډ=_`JnCҵoR̊IC4B!f(5 SRjcy b:u/Jɓ &db}w.;YzyDTvy&Ɋ?ŝz+S,O¼I`ާؾ0#1F~FQH Ŋɩ1_P!п>P>{ y˓y\`?J|Ŀ챻R#E/S̉ F`9s~ϧG yw ):޸I>̓xىzYW"$א6̜H(؇]H_vN(CE>uxčXE6Lވz"cv#o6_z7@9Sl#q~ڌ}X% 0o6z7h3ELMan]ET<ڥ-IiQL>1^jH6i}NGM޷tM˚cs?oIֵ,oS}sdJ8x^Lr%gb冹ƥ((cWKjbc@֩XRz\Rn8Vpx`s`S>:Ѽ&ca ]~+RAwSM^S U#_$YsY(eg ˺~Xޣu6s4K}Qh3E?w*Ep3EiaN&:ռ|N aEֳ7$ϲҦ9K=v+w*z5o/#O碝 ϫt88mT>dS9rû"|bgr̡b:OQX𜣕PNj"\kcq9$DWos#m[hMԮDs髣[,/u [/qtYsQr627yny 0+cۋ:xQ|ƿ_ PUG|DR9qFrˈ|?W,j@;Zǣ#\3㞧!u=z:pt=?r?So*W9F"3Aܻiܝ(f1ȇg|rؿg`{78;\*,7,EZ{CqvK3oa3+ޡE?(ZC]aϢkQFq.T`̄<.4  Ho$N8h{S;Uw{*E^.Jb~bjO'M^OT:(muSꠜ^`"+uQr`m*(]lO\$ =A)FK7BdhQ\wyn+jV`-<_d+*FCɕ.D%p~n,ubѾD3%% ,BYIH) W6Z ?x{*)~T|ZoI8/MUhM\G;'c:JI<ԇPXu/$sc/TI)Q3F<=e^JZ9iZQ=o5GXrEvz"dHwzlKCKz*Ҽ} E͇sI뇥z$GX$vHgd6?cDc;+]/k/{kAe-KQjԨ_x~`=|; hCQQ/<}(<Ӕd uxE 5 8ţ=PٙEvC1n_K} 6C&Q}?;KP}TzJ=c(3r㿊}'ljrG{kЏn _a(HVG{[bd=Bu#9ErlGRl参7a\6,&? n'ǡMXKtZ룐}$#yOU-QeOy"#174k=DbG&d#*޻*bm^h_ OE\d?!"q<)p1!/{Q7$~I}²9kʈ~.R9POP5M^끞!*@bs?UJϟr?Js>q{C=s*oͦ؎ySn ڽIߋb:o0?v=8G|v=QNόoP;}s95H)t{Rn֗:v>1*{chhno3:w3{}ҡױ^w夞w5-s;ϻQ^x&;WoU _4!N8<۸'8ǫS3{<)-/GqI@s|pq.qJ >{8y%A#ݟ<!>ΨlljT0vn(w+$?;$Fo3,Oθ:#hԋ}ۤ9)yeO7AQ>=1.(q?oѨ}g,vqVv>q~= %yV yp닲ǵ('5yAF}\xNTnʍ0TA91OypS D0t7SgJyc+SN1cdP\$%0糰 |s=i|n|ĎFϼm,3zW"Vx^EOԥO}]aVZw&\grğ&;rۜIpLxյx]|\0h<-E#;1ע_[sqܨG =F=Kcnƭ EYqP˙hSw!u4qLSCggs8c#ꕜԤzr,~r<.De$އADn^8z G/bk'2&%smEn' 6"3 nqᔈJӃR9GV~EW_~ߪ/EP\m!"F y;}?Y'CF v̇(u!bG8Xa}[9G{{~~ݫޮ̓?] Oo?r'a#A?v~;XWGn@Y{8T!QQ91k]`C:rlP7xn#Fb<|hk yc=4`kR}7s}m4/nx؆Ũ\)[]NC3,uiH|eLh4s_Ouaix( ;KЦ<6Sn6jKjSצ8Z$"4ŮCsSaB&^9I+$I4Oy$Nub߄h;'#/ l{Mq?DsWEXU_0+')o6rhEys9Ga4?8 X=FC3rʚU\u:MT1ܼ_:u@Yˣ^#SG>JΩ~ n(Ѹ^SQ};8b;{c|u$sxu=?9Qsf8.u Frې?C(:՗q]!գ󖆬:F#Q2I˺Q<7wB_T˂Oabzy.\*XS&fm\#~Pdn%/hu6Ɓ1/p0 E";E cNWz@}2hl 7.Mݵs4ƥry]yt˱ޔ(_q|՜Oބw0_f(;.a^Xm9_rͿو}p\ fgKmVoyG۳aYMsmC9mgklgOL[\~T3btU n9mGqC,gg쓈HqNWNS/{iK(H^pnx}KZ֡0^^էxz(/>t~`=osi,ggNF#޻ݨSbm `w '%4@O#TCSv8^g)Xr2s]Pמa;(q)?.(E=T1gܗibi5;9}sM7CbdsK-z[kN◴#vKg"/*Zלܐgcg}kԴ>FM|IԤϤȄ|t2zzS~T_a3?y|,'(ϱ|cw5a.|6[Up_U%Qˊ$砒?Y\ a!ոx=-Mލh9-N#oѢ|]*LN ohXDuR 9&0K% м_\/%vq?ɜG1O~ :IuQGZ 峎Ry,lyhLe1?CfxΗsTCc =U[G*wU"Oebn 9pOY7sRQbeA} <|X<j),x#sOJS=Po{NV:#c):%Ӛ`;iC a?acWQ{ bb7B?LR)؎q g߀cC>Ca<0Hr?Ð~Ghf'ˏ Q}VE146CB56{dh6u ۬H߬[ӬQ*ETK9qF1VE_mGY |WbYX&`Im.*WTVug6\Xn!Oϰ?-^Rs܊/)|FQ*wN2igt GZQpO1ϭiu;-w=TI{91ߔ%wQ:Wtw.@?/r2n*\;Sl2˕.m^CyOmLkq<+缡Pvzd>JZoxCw,LQ?"sM3΂<5u=eYT;wuN!):5$E)s,b&SRĽס5Z(Lȓj^_!=\s65ݏ3 h\OD 䤾78g}}oQl$zc,bo%vVSVnܟ=y-mx^rorQQ,dCK-iFxk߽wqcU8jOoG(~ nèuë6B~G;{'9 9zow@HxO1uDzr'bh 7"Dkߚ#qE}\1q<)BvB1Βx/J1 =O(1м%-7/i~?167T9|ɨbq3+Pz'մU\ 㵦ɤFyӓ]TM">@E}(viSK?N86ՙE3muo,^nLcӆIhYnrK}Vf"NBydϊqbN+>+.rj#b\Șl7]\ ^+]KSy$ia6y,O3ӴMN,eӓ#ͯoc_A{0dXy?%;*vQ:(> %vF=&F{ڵ\|#S>YϢG0htA01On]Д1-A,Xrk1ɑo e~d Xe0x y fs?$;ԨV~[j<=CSbݴhY ,y*w~|B=6N~x,h"/9iy?P} Æ1a<$=S3/1q# UB%9t +vKgrR@a\'cbnIWJSP,Wr+q,[h_-IRSʰ^WsJaqJOJ Nɭȹ$Gbx/ JQRĺ,oR}Ƃ/b'ST.za|J߾65'ȹ#o| gv<O)m<>_Kȃo/ӫ17-'07s~$mȟ<˦IQyy"Q\_,gzI;Bci)BlsŖڳiyuT΃~QIq]t"%G5~=0R4>ʂs-'=1fss-r`[4ع|DQƻ(u.#_.w~:*⓺4 s0fEGQT5sRw#_G_`v;11ő=-Ph]RtS#ToWx~[!Tqy1fqbO0'#1SN&p,_Gfs;:Uc8EIp3a3Y7sD3v3lȎG*pF[Ŭy:^:9O3yyg7<|ohfF=|FX/-~qF5bWྐྵ?yW=yv:r]RȓH|͡8Ng˾g?޾(.(vf~X_y\ׄKOeCgW9loV<шbI(VƸī-)u+6Jʃg)Bq:s] s,7wB=ϳ)?b)V7/ 畦񹙊<"zHg'g*@R}gX!~`\a _4.~:u&_ALP\/SJs~%%>r/blA~r˩qKx'e怽XofW<8Qմ b} SaXϧ5+Op4z/{]^aop ny!NsʂZۓsC8C0N&qDӏ@ &R_Yjt~ '|,u?K7C?*^b~ _s<$7r&W_?ߜ͉﷬n/j~yyG3/[ em+ORNOmو}͵xw'|u)g|Xi>zb} oOzaȶ x Ux`u\ s5 R/3;o/#7 1]G9k}Llя5Ze7y6G _{:Oa.QzMh+cOә)th68xr0]p= F1ü߳ı<عܯej~S+Mك(M^8o1N&.oVY׼ͼ73n;mhB^Sp4Uu [sĖˎy;7A`gg/Cϖ;i/#h~Y^s}L\@>Gq- ϽW\j^ c`>Qp0̿S -̧6 24'*'ۇ ϧ=ʏA^Fq/9kn^: ЭDf5˳,|=]Fx`d 4N>sqz} ) yL7Sy"3!"3Um3eNO1}g|xd?(V|PݐLzy?v5o\0}M.;+}RWslyFbzys{ֻx h]L߄ !vsl^&{Q]%zO%z'_w`Ssiz9?XB8n_9\=yW>BK|kZӃ0P@}$POb .n{ߜr8J ?dpm0R8.߆a_ֽܚX5^"';fIo\ 0ʌw}9꽽)vB$EF|v(#̍4FF8^xIcu8/7 x~ŻoX-Js9a):GW4}HG8{$ĴT}{OIy.Ɔ{Jʓ x~UN9S97j0ڋ>et/)}=StQԩxxbZ$nEƫ4u[)͊Jޑ(v,̯~6+4cyz6OiaV^Ƶ6η{*?e~A6s3?3G{~Z7ÜYY!幘ÈL"Wўy1{ؽKXss/_GY^F$n(j<È /b__y5N-.)rˑL2}l_^b6pW]˱ugJEz9Xi^zS2c+Ĥr4X., {z=1BB< Ϸ'rU7Ҭ@:2>@zx hk8Umj2_)-/jiR{y{㌪Vh˻Mt\`9nexN,3/{4-2Ks3Ln8\(6G-n ':C/{L ẞzcQ=I{x~q;5k@;x^\m~}yR s3'Cd.bs08G9)v>yܳ95˙ymZՈ=hQ0es_s5:% 3ƼgFgY?cy[9+Q \yKgs|yWˡ|P&wqt^+%;P, ۿXh" !\p(5닽$ռ2bW#;L%y ne>Ƌrm-܄Wk1د9lWVW94KxcӶ#ʹSs]8)X?׮/z|K7S}y~IreDؔ3~ 7gLS7R8c8 d0epXkB)Hd#62Άk>g<3s2WAy֎oA& 2oLj]qqi$8iq3YvE@W}.)y{]ȣRb3QK|6s>E֛/=z"z[Ru &=_؟L+JBRg&DQjl^y"08סD˷6}[[|Rcy7FjNX\K/_]&_.E^=WQ/h1@t.yOqIw,5"y l5\F _'581X0M1?u>7lYaSS F?uvca]hZj߰:}ڍXIUQCwbM'U_^)'V3?(D#0;z#I%9r1?"FlElDx>R"A"g4˺y0'0/J8ny Ә8Xas~kt?FbE8uw͗_p\q~DZto+q(qa=Gsg#XIDӰVyW&6yr?Gq$5[9 <$b1mΧGTUQÜssj=jno dA6xaQ +5, ۑsraNwn`:4s n0Oyz{kxnA?Ky3I^_ԾICEn};Q]4+)gܷi꼏bMG&eK_`>2eA~Ux^i0:$Bbjط*s.k2b^D{Ku0bkIG7kܧZTv]N,n6qb3g,aRҮ=-\@mQ߼ko#;>>}]~5[yx݈مSV |@\=2Z~fvtaw'Ns?SoC/:4;]hoa+q]d?t/wKĔ? #p__/tue{3ߐ_xV_Њ[Pf<1i":ǣ|B1 ={T}Bd/y_+b?[>яx?_j~ %O(RKLЃ1~ |l?P1 ${~|B9\78?=ՏL:e;,1{^~Q{q=@^= }y=E{p^_UØ-iYbsڲyگK~:3>.W[u :좘{(gsyTU@^\5UJǩzoάDz~~Y=2_5eclþ[E<|+̛+!D[wU8V\3/Y݇5ej*}XSE,c q.~߉95?~F3> SѯQho|[ 0{5|듩ys$~ʮ SK*U|g~+gwx?|KP{~ 3{ob"Ť>ƽD>gw ø=x0NqRߖȯղ`D޷O3VT8/*1GYb~(q/::EpP3bm5U] U"X7/=鎷o8O#랾kT>~*쯭r;N풠8CRD~#3zO+EZ}EK/bGgo%/z}]juhLǪqXQ:,|G|)^ lZuDgrinn`Kc_Է|J<n*ogM gv`WPn/y5{dR̷T"Esrd*Dhp#xV@x)TNnW+dD;@=}zq /Z~"[pQzHW?ʼYDj>m+xhxbiLa&Ņ)KB6oO|Q|HQ\diR Sy\ȷ{WDUJ#kG?gO%F~~$>$u>jwYHHH$|>#ï#?1<|za~]0ԋ|;גCWTwOglj󨷶_sa>CD},˾K~CoG-7nkX3 _0|>+c=R>(>S?{R{"c@v)k9 gGC ;D1cD=#cQq;ő1߷F~}:bsm<Ⱦg+D^6Btȋ??Z$uRhX?7A/|/)mHb'|̄ۻK]9Y;8W3ƾ "ﯩ=>/>)!0M/1/Ė L|6!_3߯xoF O?L*n6GWA;mz_QXЮiz'4Գzҭ`X=?GyX ~g>+;_[a>s7NCpog}Qpw3_N!1qoD[w6Y]j*@~%kޤrxPC2 h𾚋g{{[_W3og硾C{4?Pf|0j#2 TI\ BHͦ9R)l3޻(h<]#ǛJF)>Eq cz 1ɩCϗ&yzE쥛y2ޟbZjF`#qT}/ߵ /M?qGWc|1`>?f8x,0ӴR̠y˾>Oot8N۴Э~g #$ؗ'Q]5hq"K؇ԔCsX̛ L9{Δc 0mѹ#kk2/]h~ϭ߂f&v6i^Fa>T}6fRxDE)ˍkRKSH ǡ*45zlcRkQEªT:ޗc<tk1mǑLq>%O4Aĉ7 0u"͂p> `hཆ*Pc?0|Q̷4#i>4Z$/C GT>KgIo(>w1P/c'_%jWSKi[ok1~L/ [Ma_cUOh=P:~jQ꿚vV܏νPc)5ߖy쇣Zd-ou^j.=q< gU\[GbixVO[o𬘷M1'zi#csaK䧪)*"(';/hVn(g>3 ,/[jCٿ$+U*3ݷBH_)>%O073aݢOJmB҉Q6w%cЛd)m !ߐ_;E޷;3.ȷdODR-A]υ9~(>oߔ~x}PsMj3jf)EGiG~Hxt &\b bp#Lz1xU~~ޡޯ*G1?A_S_1Ձؗ:Rܟc ?:پ/ Y/KǚUZXJ@; L Ygy,nϪzh[eߖ.Xbm֠}[]c.1_c;oFmB͟q<-Yro1V. [FY"_֏,GJӲOKGu3#'x_5[53x>fXo~MK6I93H Ϧ?ۥD=E~"R_&dԖBе퓲z/RCdz ͣE1?:c:qvBޭEP'E=}eTO*`߬旲O/c];9\]vƶ8?7ע*tZ{Zu_՗?"gei<6W_˿ދm%%O,#okJ(m9pФ57kk}}[VkRߖOh] ~-8ːuqX$ɘ)g=gC0`8[y4nH!P{ťTߛ 'q>6@ 01w8^BǘoUg1y?X<+|csõ?|#c󎣿LO6~2{27&ZQk:/+c~UR>}c)jAa`Уd7sѾD}cy~N ?G絯FFc,1kוT7k{A6fn#;Ev_Ͻimڝ.摒|Bے3-,_~¯c7Oc>0UFyչ@gs^BU%2WLr?þb\#꾬rx̯FKS|@^D}ǿ=zA:ЇXg2 BOq) u<|[ub9t|xU'IRC-no_~! }BFR_}Bː/k8bGGߑpy)ރ-oOwN:9q]?τgfa^;su%i#׳.=7%G01}MѯT?:ۣCwrw9u_}6gԤ7I{^ʓ+bF4_?5w}Xy&5ns}ֆCjk4"w,ྠOp__e\};w ]oB}D s@} DWy㌿kyg'kM0X˧ ČsfΈfsrg?xG>A87pхw+kxgVrYģ՗s:`&~YX۟3_>ޙױԧӮk]=̿Sbg_dSm̧wLMǸĮB9>K57*X_[zWtiߎgS)}o8CR}TnMe{iGN~ ~c1mpJq?~~fc߆~Juoږb^߆*y?RK/]H ~ jm> jD> 1}b'Upx V_׬p| qCo泩Wo:O)Wd~1 2ˠp|y)3L31oؗB/FWO_gWr}>2`AD>h?&de K)ĤۧKߠr2+D~q#?i#~W׼/a~U6W3TAݜ̀#<+y9³"|*7|g_h[g;؇94xNFS_ԯԛ5?@<)f.Hi5:oׁ?ƾIK|;0Էts㍲\܊L)<뱖@Xc>w|;~W߱o'$|2j BOF2;ww`O[J/&~31/&W!= 2"yR |1OF\m 'cf9fCqA=YZ繧PZԻ^ir]b\\΢gQl[j_wvYYzi|0t|1Z0`T7h7#dNZ1sF K/]dKׇ(VKQc@1q]2~a|}e}&](ywoל5)K㊧rNe8Z =KG gCrWjwO~7q\v(K^0Sj_M9=2s-bu_1k~&~x~guMl?V1׿};^mG;&Bϗ|-~D7 )~ϱG?fv?'? l>A>s)Uƙ02_1^τKe~MVWqA!.3(DˈW< n(wQ, D9.*s\TPb1'+jo 0zERt@m)1:G3 7+ʩLS.=DŽނGM[ςQZ(NCANcYͯstFvש /NW ٿcou> OT9̗q*cÉ&=F_= v78x@T0BpwhqP|K =V>t_sT}9*~;|9ߒDr8OO, y?G>/5 k ދ|5|5/y8\_ͽYQiNHEu)VCw4g QCe͵TaknvMX#nm*¾#ߦLV]1M|6gpml>6W5AdK}6.GEVm ݡw)pxJ7 i{8\QZ~U#w\-:NG(.+cG<ѮRK#ܮf)U0ZW>05!{P3yƿYytcV?LLFB/ru/ {靳1;V(}/#7F 51.h?O*h%t/o|Iow[V_Gsa33ߙ淩\zAęr 1ygDN "NoEKq˱'slx~{837Ӷok(PJkaK<пu_S{TY`Qfr^]C[5 y7\/b6I )ͧhm <9 31sD3>|WnV1~czPC[쿮0͟hqc9V:gD.K 2L &oY e?6;`\ۼ1͑5f]w i QH؇0M}!m3mv|c^H9(^ikx=V\"O8ΟD>m4~K=;b?`G#ʁfzJ=c oϡFy:1O|>Bߏ9eK:>5٧sx_pFwa/'[}8Oa}6EˑX۟cJxt4UN@*%v_SoS0onSL| k:F=~1毹xhxV1 Q\LɴV yt>f>LwS1QDf9B2Lo]D_  &?]R8naѯ̤~7y3m&a?SCЍ,WǍog1R%S32 }_鿔_~Ke hx:7xka~5_enTx~S?l%s~+3)Wby?=T杨Do>o^ԯ;-jw2D|iLgiTؿV?73sgE>^=N%8 6"M]qg5ukj+)O%0?ɗ +q}KKJ~2r^X+ ekJ|$m_x5?I|}$IN&~(C'JO$c*o, f ? :@+6x_~/Ŀ4τ0_݅ /Sϣ JID.0ȱcdȡS5HBIfyD?Q8'C#>yq$ŕ(vgtϚ鞺nLyݣ<P3Sv@Y0?I]1ݤcT=L't/#2G|t{3B'DD_b-_IBc0{#RJG'}$jyC(|$R߈D| Z=<^kt.q}!D=HT=NO1Jcn#>sR߇}p7cZhֻ23G}KbcVԘWi}c1 ٦8@`])0{eA5t 1wPyN D˸>`>4Y0~#F>w+>e0V_cx@}jx?hh5Lke0|'` ~$kCQ) n:Q=_m壸tͿ ~Oxo! iW"S}1Zr󱉪h<}NҸ\l.Dc3~nC|M*Vk&RBW|Gn:)sQ܃⿉[;\'|?{-߻)Ŀqa3ɜ{OȻcRn lͯyn]o_T:Ǟl8g|ѭ`k#=](>룭랹8jז15cD}DH'#vͼ{E/DU^8;Wy>%qrkklv/(uqkS@-C0 +ATpjOK+yk)Pf]ZH!A~AqfVR$$G۱/fpX8Bp'I[s;ͤXetZu{S8.zxhC9Y,t<VcxYě5h!Z9V\y݅װ6y͌30wB< SpE,5"Ǘ'f ?[cQOkSQ'bߕGk&t8/ N ݩU! A?Zu:C,.{`E޿{+|o-3Jç"Ӻ4\Xxkոp|yC\x`2fܶk8.þ|;{ Ftڊ}="Ls-[ot~ .z,bBܿZor[5^[6%vln5Zk㳥8fߛBQ]w8*6hw'yAsSsy 27uHSKis̆~J5TZZN{K ʸhWl>Ztt%'yAc:-"?3(2zg}.p'}>쪼RN:nr(|tJw2'//uI2ZqQ}_ZEk<3v3N6iq:gP \ Y )NqΎ9FZ۩v^/s*'/{I̿Lon̳Q{*We<+WB42~x-㴢ЫXr[B/Yzx/s;cܝ]Ag7j=W߁n{W 2=WxX]quVq\֩~Dώzr!ZymO0Oqx/m[{hV9ۺ{.!Z2~a02^8hl-7 ly[0Ӫq٣_xY\WUvڏͼR.{ -泖rJR>+ⲙB.l:]s,cyAA/A.lb_6Ӏ7p1GQy/O {!q܏uܨZiEoy.}ku.;/ ̯NWDvpt/SZɖ{Ze^sZsl_pYW fG\ˎs1Wgc.<#;cu~*v- ꫝVˍ*;_^v7 8=[sǴ{YBs\o5ژ5ZYW*0/v63E탸*ec!yǸ:D-BVh';D>}sd^wyrO;'z6gE|(؁uoB)z?w2Mkqݐ yh}+'~!ɚd>YkʌSFʈ.R?{}|yi.\c'E 1y~)zI2SSpuü0NW.Z37:9◾8_-_CoWU1l8$o~*l~yscqKW2<>3W? ^rh/C_e[/sy2U}H2%(qKWqJ%y)"8n*6UgEhܟLnOz?y!ϸFƕ|nCy5pdX77y R?G2 40qlcJ`_H)x)I-mVy<P24w<e1J)Fq {>{p2~7Ew=CTnڳ@3z{[*FF[}8A?7zoq烃_{e%ڵovrVK\eo2 'Z@Gtfj.jGJwz^_7'nC|[CwLX׭gowyG3qVMo7U9鷏q~(+]j9l/śV9 %g <_F="鬳PSks}&cqPpTTZG>|O~ITU o3RQt&E͆zlpD;S 1z!'K"֧,4Ⳍ>8Z[O) 8Z|وc_mVb|P5(7YaC1s-k4+lcxP㚸5r75|>vxQN+ŁGEm bP~8`][p9VǸ_\8l IC5|i-~/rbUj,Д!K$/x̕V+FQ\^bowjo-QΎʉGl6kӡ/=V[)߃ʕ;P<q+>]+\~8]i,Ż, D<5)|>\JG4 оԵ G]p0Bx^X >,HIs_.`~^TI1f}(fD1=OW1x8_s3L*\Wy]REˣ>mobB&$PN4DSKe8} #"ϕœ8?N9 #:EZL~gy{#*&݂<;afl.Gfءxج#H27gxtt/R Ƈ9"6ZjrGT RĻ?.t>Uoַˢ?ϭz޳[Z2ϯS=B. GijE;owWgk،_ݼ ec_JavͿtj#\Doن/sm3y6ϱujƩsT'm.z[?uL3cwU+z.\aUՍqu1qj!C\Zģ/߀Zʥw}^3[?5|ZK i{Uo/-K?=<+qg^Frk:]K95VϏS=~3':7~~35@7/ğgJEqh )Y}Goķ?n[ml ~fӿJqZr4tmO梌Z?U'N3bw:(3~z NGRy*OmI\MM^A|Uނ5]`~5 y1W}υsexBaB^`pCGq9cy*O}4zTqR_l/zofؓbg\ :̍e~mzKB|Vxt >|yY?rq}̛EeKr\ r0gV"aԋ1*&x.ŗ϶D;̌/oeȅ~[xwf ϟTH1t3>2.T=ug̣8߭ǡlhg\asFRT[T#cخ%rU~̽Uđ5m3(qא7B9 GդNLix9 ڍQT9Ǎ 1nmOWב?,G/׎/vE{t( "PnsAߠ|->x&AjЁE&GZ|`ci;0w/G9|;GIĹCKFqυ= y|UȱEmt&ϻBW ܚ(m&pSӊ}(}ة27ܮOq s7 4pJTӑʝSFͨOoHGK']Cdsü8}xbۨO߹Ey_Υ;말[}˛˫s_E4&CLqqƿܻw߿8t8bj<^ \ެ™c3&.ztؔi[I1ƻ1Ck y@;~Qr?EϊwjkKe'E]+rē훎qD9Ow~kFzF(CU>$CﰏIdνP|9 9!sy؎|WɵALz'"e,?o7@w븶V]#!kjƌ ͫ3. 4tП32,>y2K[ps3n@1O26c?o ěw#yG v Qnmcak":Gf8@3+OPjxs﫵sfz T9p<1|uG~;"^HPw eysa04xO(6Xo #"nzM3T|"^Ò (X +8-N5,°x2~O=p]FS}+cXlߓګ,q_P/?S|baќOs݄y~-;q]<iw׺qS)s0{y4~+_+6:*X1 UGqwuɨ<Εq׵j\6vm UNX#y!">nIx,2/, enjㄿx mص<Аpi\C\U9m܏q ͥ9\oS><$saV"28_%\V7{EPfN1^p&E<."'YTD[UsyX衪ܭ:yxtlۥ/P/xr7ok-׋| |la'TaSGk^샲|͸ Y}z)!oz-R:/uBg.aT,nqM,k.bč!د#d;n!APِu{iWq>:<~7;/Ĺ~!-p߳ K7e{By Y>s9yh8PxWXpi1ѿz JEΡRLx`*eqAyG@w>Pϩ8Uyd_W4~h/4/|FY]\>P:nh0 ;mhAZfVzfچ]zA3vse9WЍߣ9Nn8~mvT4_<┾T߯ݩQjWUnة0cei\VƎo;O0v,2:悟17ΣcRDs.,c2Ҙ q/5n >އpmff{=֯1 .˞e sٹnḳ*7}Le>7mcGE_+kZk*xte{}`|٬1w% OrC1^t^a)Yn8 [@G$>*>*$ŗiu ~k-慾ˉ|y>:Z>oǁ.+\c1ܟ3@Oc O >kR}>'RpR3. J|Q9q^>ݻR}M;??l E|UqP?=zES?&":'<4woX=y9g.އ$䝓 r1w(^>/8蘝'GRi.y{Z;9OY;:wANsEE< gxWjܳ3_Y+x*ͨ>XOy|\gfp ekqM~`5g7EY+T双;^;4 FY;n_?Q;od|16cfX)*6wMp Fc VRAnjg7O-fH(65ѱ]'+)U?ݤ/ ϟ 5%kq< Hu]:9C8gϭEPp-b$NGwu]s_wAvbZN,]\C}q>]ݥ <:kt1!Dw;:eiW,ѥAw.v:) dtPuѥ^A{zjZ{{9R)$4\ط-M,%'8ϭ%]kYS"?A.r1o-G'ʇE}GWolXjs?~eIt$q$?6S\Ipv3'I_I:re ?qs̟؃x6-O?z{q9q8.w>y2Gr}kf+.@¼;([3nqy4݇SDzD,Κ/kxo(f}Ÿ97_Mqj&M7B}}MθN7NccMqMޢ 8-"r|ߕѯd3 ^mMR>6oo3}m->*hiAk>-SiPkf=~Sg^_[Zo;5|22woo|0y^k}e^F<[/sփ<_.xy.zm&QSË]FkC ^%}Iw:]ڦ>95ϧ\O3.x̡#;O$+Ό7kAÿ~Z:@^_vS{M\g Ŧ/n;X'یgwzQ+fغSn̸m(k'Bq"c!V'qZ&"'D=q@:(/2|.ɭy 9%㓃W@\HW־^旖r+JKd(k啹g[( }?e -2{Eh!"وl|]yr/5$ YU6Ѓ#~&sQ}G=ZC;cݹ:U < .Z: oaw7v1Ԟ$}.ny*qS͜ŠTW''6g'J9Wjk1 䙗±߹v_|J\Sg5E<zUYkZ\L1'C>c1ŞvA)g㗢:*'A71z~Ы]QoA~!r-m xc5~qx:K9]oK71Zl&lgA3g7_ ?olQSJ z4yQ65Z>xm\͜d译<.C/]|˻@Dso<}Y@wSp.Ƶw?pr%YZ9Vx?DlX'oUij,Xž"84^ȳ&,=zmc\VŚ=57L4S|A)SxSڝA)-i}ޔ2%e'ʠ}Q]5y~Q| _☇XO)s!gb~ie2'6r1="&Ud&WZ61xϑO{zOȑgSׅ?u>t*.Fϸ 8Ͷc?%nun}]O,3jx_rR=gL觕ìA2Y%=c)9S2 ">_.i'3ӻwgD\Wܟ^<*9d#cQ1;al+UF̰9$^B.B%sxϘ[ByXE]y)701cmA̧A6Qx7tIs9? Q ~Pf\q ߳x>3)bttf S?=|.x^z\.Q+[ԫj.;9Π7;DC38Z9Gl~VOO /ǣlw/f- cxe4pҌ>ӴC!mէWPFE\$O3\we>q$#|.shCcU7a>$8aD+PlQ` &_g4s=NuM # *8~ПADc_A BC=V B2$O0rX"~8HB>r%BN¸H~'sۑЇN DX*ի3)(j ]lL27k`~S7q?T[y9D`7!Bc+b6wp1۩!ܤGXz_?gb O`mBĄ )BiR x'0nC+'M\ $I8!( }YcP\ *xJ$x .{;གྷ|0~oԯt=?CxW,MtOD-\2zg8g)'F1x`WVx)_amʡ\tu`\";O".'x.&օiϋb>|#%%oH%0-Cץ8,)<糭 5lk} [oCͶ7@qױO]C#zWu];x~q^Pp+ڼkho;Z?j<95oߎqo -Na}whmgI)xLJ"#yq C=\G@oԼcJ?R1wC7 k2a^sz/Faܬ1(d@y_Vwxpy_yU׃,=gw w$G>zȏCozb߬N*߄[{qrd.Xsv?2y"d 7 dL!:6dg;yO!;Wqwc0;%R !.?qY.SM!;B_QfJ?ڋJȣOjI7=;]9xth q(y\ӌC;=;xlϔY#X́tśxc.5Γx x}e2 i+DQG/Ͼ ESާ1~oc\hCj|huY(͉|H gLe\xN^DCXE{ĐT~m)ģ~77}[37|ӛ!Ɨ#o"'Z3W`' ݼ魨sx=Q/ݜyǭ] ? i5 @8޷ekϩ bݑiuд4|ͦ7P3m IoӾƘ߷mh*e:V=~#ZuyWpzBw1'yq"ݝʪ:w|zHm /G`;'^nJ1Hlj]nb|u1~QL?h]|;8~W,v#tQI6Wg~*3sF=v{+㫷[Kgku#ؿSf]Pw_`'n1-2#V8:_X]Dk~tsKrKuuAy}Wy\4"]\^?3۽# [=CU_Iyw3EYUӷl~չEvTNr)~Ն! ]T]e.?qh>^T..ó7,Lz4(N/qo&r|k%ߤ*M1)tLɾ!3UE=ˢkٵLT߼n5Vnя+пW_Ήyf6[+4/]<Qa>wNe^/g:yh:zxլW'on&ˋH7ѻ5ܹ&|~b] j:符s'JQ^{s[[러_tl`ח8W/ {ezJrZ5ӫթiGn^gzt q.]T8}>siɤQӜ.B$;W(:5O{ !]hgh DwXw~>s#sɽ*1[M0{c^!ѸF/`r{\LnwsHg^Kz:\.ҡ]H~EoάЗGFKjx׬33}ʏҦAY_ΐU8l?#+!ϜlP?w9bmWJ0=9W蟳.eV=oFO=UY]{⾪YO|Z2ӑJ?֪bkĥ*|F^xٺ}ܗdX3Xs҅C=)++tⷳu(W֏=?yQy :fyWO|eyAe fCKGyHՖ7>+JB\iw|Q.-xǼ{Ð8W'<=x]گT^ґ<<]{St tJo*{X> UD K7שG]֫tD;[{{3,իeգՕܰeLc* 8&gQKitLK-!x_. >pur5}\])Utg&|߀cu}|Z :^޵}y.{yw1^؉BOZ8\\B8I<*zzyq^$!^XMggGQ֪3= Ґ 1\}]~o^WQ׿,/u{!Tv>j:O؋PG˓2揑ƙr:;Gn#=bݤP^ +th?Jj:\m \!eub3*f:V}_G@H_f2'td0ӓtc5R}XoD!Mb=lig5}8uoz켞|*c2#'~ߎڗQ_=Z:tRth5H5(k՝-՛ V֝EHWn#Zc|뇸VXlƉg59J(u~j:ũQVӗ߫CXm.MG\:~ct\Pt&Sc_3U}uB^wy]U-Wꧼnҥ #j8 zq G)n;_CӶbŽWQhWoE)]v[^x"}6NJ=c5jzV_EzjxuוpW5ݵAhbnM]mzlB鰶E ,cCn-W^wm:7W?, #걖갳C;ǎ}_"פd+wZ+:@usOQź+Y-U{wvyE:뱓^OL7-8ڵ2BoQyREYrzH']*N:,+~ RNZgiKNZE(} tS^ Y7M("}}IoxcÜk}mw' sfPOoT?t5VN/n;ɍ%o z/뢍RأQk 7jTL0=4VazfL63eNԧp&׬k~ 5EzyHi, ׺B|uKkcߦ[kػ[[Ǵ~b%Oj&^kN?zE^ TG΢lQ/U%e=2#8]RMd:$/:b_vZæC.u>둼itŖܲ7*~-Uz\t-8- =gCI铼i|JKLd#b=qlE?G:mzQNO9t#]?ƍ\W鑪R^T8}1&3Rsub*9ؿTu%w^yy= WoXd:@LTu@~ugJ'W服h4N42- 5JV_PDS@Tۿ~jz;֬5ܑx/} Ykk xYwjk#r'pL .Spێ:㚫iۖv֣5eݭ37_盧vAS9lN<,Dۖdn] S-ށv5= ]؋2@:f}n0qLwk` s(O6J#f8C_nmu7z!%\1bhXs_1 DHW[9ƉtߥZjj]&*zj!omV]Z 3}f AIC>Yg+8#~vB@(߀K`柿ʭP*gϟ._ܯK{S}+sj`s`v;=cz`tݺ(F "O~!a>(_#$JRyL\{ژg?pU!/0(ylcɩ|4bg]{ākc~bLd%[}peަ{q^LԪ_~e:0M[:5p%JN듼.^%s>I*tI^Zy$6>&뒋6w[4~ o@?-8K)nN[;| wi\ _e9y}S5Vo*ɵkPu" ibEet~Qy34Ngz}}9ඝt|H)mEuoIzdDoݚu%Uy#:%O[ ߯PuINMT萖ZuG^gE+v51V]ZyUץ[M_L=|X&|<vYg wzoN JRܔ;-/C36:\G17z#PTu~ Ydf1^d&3O=CԪkWlr9\<85G"R5NBҹEYs&zg/z^ؗf)w]Hꝼy;Sڵ_oBNKu)?!N 70韃rAR=yHa<zgw.JN\enGV{nPuN5}Soh|a*[kzpk"g*;;pS=r^9>Ȓ?erZ L 2Y _hTYpg.'A1xN_~]S ^lq.}Pl+jwDFR89Q:RTԯ-U_y _ƸQPe3]5u]^Sj_w멼O`YG7 p~LWUSE:H?hX:P?T7eztR^e6tP^Z گNh♞ʻܝ7<+_iߑ})BqپQ}Ob^[닣|)]  vM(1RVM.0{Ʉ-C<s0_-AR, 11.o(?u /u_K> sڃoY\XyBY.A=6 ޺ך}E{D68zCcE~ht7qӽX }TN޽}P6~7wF5iC*'붮Ң޵P]#Ѿ=)߉Ͱ/np~(3t.~\Q?')^b't._Ruze/Mc:^閙V~I3=ZM?;#C;ӓ\ 6<zE}(֤ ^Qӈt^0_TbaQ.iy_5yոN<&Ť(&~[=}7ME xv>Gѝ4s|zkX(We(I_yR[wkչy};-LNX>MV2=!Tklc5ӫG4apOV:ͤg^tj߉.8W,W1?[[ܢ2]أSHiu[:kNa. mjpUu:9X}ubݸԏ6Xy}yEzqPK~ uG~xe/U~$ɼ^fkҗLi&\VNϓJ zuO\evoŨg}Qo62;,B5N?7G?^bB=Q2SE|sB4 曻@#[Su _|su>_JG'gKe[?=,/ŐQo;_])6ӓ"]:~k)*_TqvYOb;>qu&ߘNLdӛ.!_a 눖Lc:^&(,.(;mv.W{/=;έ!V]nBa.6˵jiʺ$BR{g OSu"rL}z\Jv/>0NwW:qp u[|K_Մzڕۯ^EZ'x=-|]d]*4o&U}R]M}V~ "_z_uL<}E𗙭c.ݒ+ tIsu=Rb>), B8ݏWxRwnwy6]@1-~uEP^/ ŵO1~.UĵO~q.N qЭKʵSbH%QN89y {lz֏(y]E>-_ %[ O/&{ꀃ&C׋4 UjAtp_}^`>Ax81d?z"Sb}#aK0OBЏ:mV=kVC4SWHT'ԮN+z.B_yֿ銖OG#>`d=FA ]$i6>l?l#)l'򾰍' Rtw66B1{ 7EyB!/(-W1b^u;鑼~)j_:cC 5Ru@^Xu͏},;T}AKe/֕0^#To~VUOzwk~ t-g{cx3>b>ѦvE^&P~*sï]ֹ.G;ӻ\*t/"!Xl5LqW}s?O_p=/5Ks ̰v#^#/~$Թ%ҳyu:OXUNu2~5:U`_wIB>Tjq: AZuEcVf@'(E1Ys,\,҃=oz  "= bg4>bU<0݇=LuqHa:ݝQ8"kNPf:M+tm5~ins(|i'md. fgKz mQ=!#"Vźk]( ӕɆyu+WfˎuY(=P>0͌ ylURlh H/i?`ߦغJ[GaIx߀B?aH/9(ts$Y5Dzvq5L8[GϹ?#mbWDFY`:y'R#DzVĠ}^CB%0=@ ]diZG7>i9Dk!"C{'bw,oTLS/hܨI_:tX]="ti̸NucQzZ'OK:vV'}V†{S._]շy=('"ݤ~pY(:ؘLuء$}cP6I`F*]XӀϚ>Qyj.L_gyg ;R~?Ck"V~qbKH: hMwľ^V:/^r*G n/#t=+ .'E~(qUP<y]'zAov-<&:z nw'0~WV:oMy;I"2]3e}:ZvUdžHȺNQVu+9k!2]gvsPlwړz+ص ]eԯo+b͈-LgTt,+ÆE: WɈׇPt|VX5kU2mPWyq4^* xPW{Jrsn_-icyhEn؀0.lmL_Dq, hS [Qx$ ,c,n~W̓e ̓ELO$3[͖G;ֲޢX?LV> ;1+<~ ן,C^bߥo|XFGk|oqsugQΡo~1a*KBŵfwLxlӞcRëy0a?mËb| /Fr98Jc0i5ȷLD#=@O2<Ճ Q~)x 3ó0eD $t߭t?WD:A]V0}Du?v"go rqUut{R%! I: OKAG;|QD L5eC`O"Gw\W-}.ѯb~ߟNS,;I`(w/).y::- /w`#o}Cq,onUk6_bsU&LD^yud=w8xs٫~u&#tFPo)?τt2"?ƺ}2lH ]SKcLjX=e]E&/_=ļ'#~}> Nhw0g>m%&2k|N#gN)su{Vv>(G~BT>o2<Ép]l!%? uta>s\?uZQo-}u9%;tؿ2d( ehS{ ͎dHo8'! ;!VGV.5ZUQ#RCHK/Gnw6򛐖W+ˣT޷L[?,=bn[oczfӏ.N#xw9#Q1g[5g5e+g=kg]K8Y̠r{\_@j7Uh|t/y-gރ,_Ne=+Nʘ JeU]TxS[wGHZyBҪS5z}{gU tUj(g'SkяӟLwYw2W1W^ ⛭KUI`M<:>pIk8L>vX[7 - 2N˄hȋIYaMS e:P|AgWa|Ծ %ӧB7PnP@RyA~߅P/:2|Eߧnt"~]ܿ"f g.2o_/tz㫯* }!JP_, Ň^I4paPj1+8/(XP<'@ckD=_^UG, ,e9M8c1C tmy?daB*2ORuq?:SQodf<LDjm:A_|b߃n% 9b sRD^7^yP?a ?2IjN2K2'R&w a.&z.Py=Qw|##=ksm1D5=fЎtzHh{ix~V#/#2]LpijWh)V`?~o3Za:E>+"y?ovzE7WN[ܸ_BuU ^P)j)zW)źE;7'J^QvXczlQfh[󚛗|㟗doCE~'yYwFf9 6;cݔqh/-w>Ͱ/qs"8M1~ӱߴY3nqc= aKg!2`2:KѼOH`yG|Z^6r4"4;`|"^eQwsvϏ_|>\<-W͇YބsETis3p^|(ۿZ[ a`D]+O.BkEt|uCrY1;/ʲ9 CiJUtOKZw)]c讳"<晪y升mCݢwAL]7DYk>)#߶('/O)8=0J'|>5ku9M94hn4>y_x8oODyߢ_oR~{h߻]ut{#Pw[\Cʫ>{c~>deTVj?ZKvm?ќo|ɯKߙ|X tS؇jyױRj>5<."G=ϯ'$|[d_n~O''z:IaW+|O~3ӽZHc|X^'w,q({u\Pύ{yܮSmnn>'X67Ϋzh}2S;ʥb>pUsyv1O ?</=Ex&6ױpW>>X7坊|Zyyx__v gj/2x|ylC_>|>UGT9 _b9c\Xrf);_E呯A>3>'jMhuxWVq?vz_gd}aSʭb\Dנ 0(TvOt?'k|V-e+.|lCi\X3GqaPl#> NSNjݴw oEy2Џo(os\~,mo P&Y=Կ:ü9Rt;yt*{q_r*UpWq]~U/=ߋ$(Uߞsx-R|^+R*yjzYjif /'KOu==S!9|$f<\E~OtpAؗ4ȯӠ'Gtc_90?hij_ك>si`ߙ(w\ڤqZfK{_Ozm͸lhIPHcƧI}HM=@>+7ษ/RN'p/)u#smJuj/Ƨrʷxfy)Q͇|H㭖?%/|^x|ܛCqVۻ|9ךu x?"oR Y~۾t\9[)P-YЮ6_CY(/,W{dx+zNϹAgߙ'3NBTˇWE#O Z1ЀyN(CǩAY7Z^),]\t]f`8];{8:7Q9~N1:yϦSٝN`=Ӗ7T#;WA NPߦ}Mn((a+Ke`N';qAN'D'c'?vbҸ !e]D N$vҨ4%}(yƝB`?ԏ̀cd~z[TĦ<I\)6 Gʑo)pǩ\ŦxSsXl*/[[ڢ=y̟uJ=&bդybcXU\ ģI}(~np=vl'}$##+S>b1Epvxoyz|hתDB>ێڛTI6[/QImO9ra(t 3uȬIzH阦 T触z6[\:^8 NgCxqÏj:J՘Sra݀BWI&bQIq< w ; zu B߷PyF^YNW#L j=x\cK~%;3F~k,%^;ƕQ;qy!hTUl}(S~m~^6 1oa_3Yx&;2y<,+Á /t<|8?sDkc?s9_^\F+*Gs8m4t7aAo=X?*ln{_ K/o^ži7wß~cZY=_ꗇ9 Ko<7QF*žuPtk]vhW[b0E:vngu?c>SS<EE!8<C ;Pc;7KL;o|D~ob4 v?s8t\xH\Y-?ޕPfygȳBR?&3{7-3+{L,d{|ҋ]1O#/邡TۉbTrՏT.?=̛4DɐW' 8$Ks¼gT|o>*|5[YOgVTW,O幥?+SGg`wy&+ F"OӜ_'+9m$qt>\/ ^d'"IJxX^x}V+τKz"O /ܹ/w~[q "ZP3ҸqSz^8%|ᅮ:QtF|`F?@Zpwe>#8"7 ^󪜟o!{tx9O@U[|eN)¼o~QJUcLi{y|^3#|3}u-x9y)*ϣ͟/!Z|H-ʳj-̇7(Qб.|hM 8+kr~46󣾾яϓ@k,vy,'ALm ΩqVϛk2˛T Ԑ,/ޓȟ7m7) |Lx_0/jvȋ| BgeWT2w,sNl5r;sX~p WOz5֠;c|5O![|Dׅ|>"C|>517}VEW`m=ǗXw}EJዎ]>7]Uݾ8 d1Kq8r0=sc?—; by<MsissHO[SGW[/w{vAo<_Q&=a9h]E|>G,:s i'Xq,=y Կ=@G~?1 GѾM}4l[xm<a[˯vtvh$sѾE[Ÿ-y¶[xosh4 as]0Gr. *緶]\/zW{j9}p=9p|y=4`}y=z.|^W{N?s;t\¢Qosj闗{y}=YO*E뽾S0w_)w]o[;-~^W{NgNMq>'X`n8h+9b~Ž_o-}~R}O;ֈ( )f>@_qܹ,% >Ν*^O-/#s|F:``ׯ-}b'}57?NG9_`cY~ ~''V/^u77AgVDZ<#yOD-kq^wt.Ot>nK+_uo`_ݦ{)}M)%s0={nc3uQ9(fT1i˿_˔T/|lCsa]_<;*}q^* ;:"ӓ qtTZ;b28J#VL4ESϑ4t~yϙBX|sz.R{ԑطK]!ڗA OQ,by+ا]Ηpt!`#RZ"}Nyýgp7wo|c8NS7FWԂ.NXWi8NCz Xo8U./~J2Cޣr=w2 'h8i0/|Ǽ'Nݧێnmċ?cؙ,ayJB#fcݼ erԯJ?WEIbOQ)GP,b`ǔgrI ,=6Hqd9} Sq>5Qt5{̡ronev7um@<]yT+%>?~;_ȓdgIS_2.Bּ0K)oI DQtl?gQm_:yZuc8r򄰅xo0_ |~Х9r~n31G|=umRQ.~Gm߸!rzMʭP9#&;^nݣvzoq>ۗ_BX2|Q[;$ƼƮ@ +a|E7?A6>x 5{vTn2{};-z,HȯD~y vo0=[5/o>EZժA\U,WE,1TVN}W527i|h5 YT9EMuG_a?E>tviް3.Q~gu(:gF:Ӱ3h3՟c^>Rˣ:|9byTԻQf(s&.7F7y(67I2AW͇{FA(y6 Q;;y|g6 8>Z˲bښhOyS3c SyƸTo1s͘OuzzTSP ~7z|H #c7)siLt=}6&*!dޠ7b`a,g8rnA|3.w67>XާQ^} 7/g`Ya~s~%{LX8ה >_IDyʽjYro~*-FƔطí*c=71nCۑk]j(NݐcOTߋ0Oo ѩ'9%'YHyշ)綏8ٶ2 '֣7LXr9y\ޮ+GG;߳rwnϏrn|[)v4Ͼd]~yo\yZVde IeS>(_G[^Z^|#붼Lx CK_|4Mot"T<ҸoSW\ >ƧΏV痽A^X߼]._7O7w~nΓ|~>do|=3cϦeYWʣY|:2y$G.X_.O>||hhwY̍Ҽ|[A|շc}Cga/sɱ}V-qU%\tu7.18iK{볜6b}*崟=3Kmϱ߲v^U\?j7:)k7$n{n_jG@cy̭SԩۤiNq3%yg弚xv,=W,e^^rѯ. ,e9'5GnX\vqt8\~ݐb [45Oy1u~\k2in'd[/]R<8z\"lFϭK.q;NZCz̘gݹxW7)/>/WǸy090w &ە})b0|d?Sr/{W.߭ok4~墆.Twr]1m]﬘M^|,M:>oW[1zتV ׮<0O[14IYEq=Ԙ/WߖgO%ײh)Dٲ?8kwYa>?94_oO{$?gO]ڙn$zxsV̉x]>Ge(E>ŋѧϪ zżt_cWPsoSw0yf_svo|lkn7xMku75]˱~k>ix~}Zy-iKOKsQGX* 5˥yGϧf~-}/4uk>ZYUNrZ#qKץV>n{qteI|Q1VŜ7iTPyn8>Kοmhd?s>,e9Ҝ\U6O|4qޭsђ-.;Y_Z ӜtDՇ~pSzڰ.͈';%О<63ͫWxXlQ:M8)T_>/uvַvv]-WOٚlNs~7qdVd%u2WߓfOՅߟ<.ˬN>>=uźE=%%7_vM]?cbmuк;¬>QY_յb=VV:?_4X:S\||xcE?\򾅉?j'0&'r<𻏧f''|ul~9-L8y^|]z. K_Lכ Vq ~1OK~mz:U>RJ*֡_uhpS+֣_Vmm|>c?eDP.d Y_K8欟熝/gq[[-Vgoz5sී#WY?kVp]o(No㗴|,0km[lwX~vs];1_pnjOɷ=}d~~ںڳtzM[q[8m;>[&y>U'ˎrav_'8}xܴ/eۿsozg<{,.}^[]?$I$I\ׁ[$I$Idn3#Yf$I$IG$I$I$ݩqH$I$IR6$I$I$I]asI$I$IW7$I$I$I~*$I$I$IKg/$I$I$w}HB$I$I$Y־mL$I$I$=Ԓ$I$I$IbQ$I$I$I9o$I$I$I$ $I$I$I$Iv)l$I$I$I$IvTB$I$I$I$%%I$I$I$II$I$I$I$?2\ I$I$I$I[7T$I$I$I$&w4$I$I$I$I!3e&I$I$I$IBcL#@$I$I$I$IvC'jI$I$I$I$!{XU,$I$I$I$IsI$I$I$I$I~$I$I$I$I$IdI$I$I$I$Ii?$I$I$I$Ix&WU7$I$I$I$I#b!I$I$I$I$71K-I$I$I$I$Q=>&V!I$I$I$I$:*$I$I$I$c2IMI$I$I$I$Ir=:&!I$I$I$I$H$I$I$I$IFdZi$I$I$I$IGdV$I$I$I$I#1u$I$I$I$IrcӛԒ$I$I$I$Idcc"$I$I$I$IUB$I$I$I$I]dz&$I$I$I$I]!1I$I$I$I$5,3I$I$I$I$<>qI$I$I$I $I$I$I$6O$I$I$I$\kI$I$I$I9>nX%I$I$I$I\U,$I$I$I$ܚ&$I$I$I$;aqc/I$I$I$dI$I$I$IĶ$I$I$I$ɏlkI$I$I$~H$I$I$ɮn!$I$I$IkPH$I$I$KZ,$I$I$I#ư$I$I$;Kv7$I$I$u$I$I{s}2”$I$I$74N%I$I$Ikwe&I$I$ɍi c&I$I$} $I$I͓b!I$I~ i I$I*i"I$IsuB$IY K$Ih-I$I2$I$IvBr$I$iL.$IJNM$I$qy$I$_.@D$I#I&4I$$߇A$;}yITM;@9[9*_UU[}lڪZryp}'^8!PCDCu"Q1_;Į cPeUH}!̀')Tj#]}}Q@ ILq5"9 dC?WticC|Ot_ᇃ7b^r(ڠpdC_ᇃ)pĞtHxF9gb tHZwr;vs0QۀZ Oqx8e[CD)("O3xs:up3b!Cs]"A(Q 埒Ya b^0b#"@i:% nQ ;D C S0}p{eVv :!-$167H bT@ʲσ 1"c *&ǖf_$>#O@i%, \Cd 0u%9D%;s>H>c-("PO~5(<Rj@'WG~(Mi߰*kܿ +^wڕ*1SL#qV! ,*K6$V6߆RȢ 8^JQتf+u[+~yKx2Q3cs} +Fj7ƾFd:`T#2ŕDls}J@/.ʝq! j?RSԚOf$#F8vO%߆(S hPt o⮵ÄZ i;rs8kqt k~pNyk. E"WmL. '}^aƒGZХSXk\|~IIuP\"x)>ɑ[.H+r!϶oK= W`*ME H]4im0spL4<~?FA 2?V3p?yhPѿ _ӫ[y뫦Az2N_G~#QIZn& 1*/$_;=#x-nT1K gueaw͘IjPwᄤx9t1.d-kYa#*-g6ri㭟ԀwjnW_+(Sk\MhGh|O\O6{w”.=EsMp" .61VE?ƨ|YP/MIQE`|u՚$06|7`\16G߸:]-tSF:׫8g0XAr#J.+z*ԛHM7#e[E|v ucڈ ?o_ȃD@;b 3dt a䮻wi gC|4,:sKzZӫaX8Aʟc2}.ӊu!nwAO.}YTtlT}ƌXk]*%g>OtY67 tAf? |cԟx] ;$_RDz,/VxpUiEC/ʷ:OA]_XɻpYiEPJM璅/_x`qSHnʐ%da H9g8쒌Bl-+vn-(=ae|{ޘ"Aǽ}%C60]2 ƼmL *fܲc\?t t%5hBAX.p.{; dC̛T 0[#`Y=U *gIڇ^{ hK@A|6Lk LG(WN˾aQۚ?VvF>7Bpo kYF.vyH<(F}O<f 1?PuvP~^rWz۟.5Rys<٪w>Xl^ HaYl@208mK# 9VL?`IAw-qUW\ hlԬ5,`F;ޞ6C-Eˑ-Gv.=Qjfe~f <2/<(8arϵXCvTkw®fqjUU`kXqEFMc)`3u a?E YJFuqG bB6tM؝V.K@Xw{b+wԆ֒ȋT,7O[hx Ok)s8: L옝'C~ *ɐc_&f)\^_HB<ܕҁb/JHJLw=^lj0]YRӜly  |T}Ŋ-]534ce(/V"!7>]xe]GuPAzңSycqːES#gcb@0]Z#hjъ~ƍ/B`4-쐊Oyu $[P܂{X$Fe]0@7CYJAM@e7DrAcVU]OШa7NcD|eq[52j*]ҪTޜV; dfOW&ۆ/!Lԯ8ʘ`e>R0< 4k{[.=!}XTG<ȃ(<]vJ&;q ]f76үq%/i>hm0sFsu|tahj#1s߬k8L^B-y pW>n$}lfٴA^ws]_%0NKx`S : y!# 7!NM C .7.չB1" GRN(Ck:Y4ږ̀O}^?ʖ~;XP8g+G _H~io+*iXv@LWJWpM"RBI,v̀P =<YnvF0lH:[㰖^es}di.9&5-?(|hJ?N-<0A#` 4ΉrV dnP=]3L`1;|"#An,J-'z? Hx U=^EBpZˤVC=*5GȧlJHiv#Q&}2~ qF}_(91ꭟz/(XT7nYnrnz[TBcߞK8u] y$I?>5Z X(mF= GU{{ƾt+a9c^G0O^{oc)q2kQzQ QS\0; u4W89lOkXD;ɂ~FG:kHE+$\s ;* y2vהdEzb~4 'nO7 KBNdOZ$SIVUnP}[i#Gmdǵu6Hc.cQRŭYtkH)>J 4nWh.X(,:l$H T_#*g;:^.tYa /8'zgjY`7,GC^.x&UlrFG|O~gcf1`"0i^`,{ ,,n*`nR/k'%HjVKAb[ 89y`~b7I-(QDLY2/E{\{tL%a 9: Y؊Nh5/iI0..P%҂ɽ9^ 1JI ZFfU+f7GL}l[wwINM+JszNcwՇq .͌gON+-==dT?+v&D+emg12dLȿ9zbTDY <-ٟjVo}>1)?pT"bkTǐ.u:=W1!x˙+:xfNJ%sOFM( ,GߍaPLeM繆 b`-vt p;:V!ѥ>@9\)9\)#Jasm\Iw?;J&IM~& g4fLqJw Tukzeo|(Wr*e$]Gdl1 G @U1#No1N V#Tۉgw>ZpjA<_⚜G)tGhי2/͹a(6x)J;\52 Iﲗ!+ r{e'"o7 e<ܐf*%X 5uӉ/fS `CM4Mku'Fjy4}hIv:rX90,& Wi(@#]‹i\ 纣n#50{  B8výkSn~T"+Aq's~6Nx? w몲7tT+7CHKW&'Ll+mGK(MB?"þo pir8J‹2Mʹ&mFS 4_x%/ji {q5rXR iޚs2K`Ywi>M5seH}26f@_ۤE`.LxJt#KtWgbH6 DsD=χX_LuZw <{mJy-&Si!Q{S.uG8 l5—_mzdOߊƲ-W숸ɗ;[](^ՌNZܴܰ_=B 7wi)>NW>xRPڨ([W z:2 KZRV;[l$Iݲ_3?Q.]*n .O?!dltzэrY;u9%*TzEn$-FYCt$_ |c9NZyq0pw_>YrzV2},%Kf#NVk5}' 45R4&ƆKS 5֭JAFWKX$$}Tv|[R ˑD)ff<<{g\ 7-rޱqq5/]̎=-tC.;յ;~y[;Vt㩒򌀳wVZDԭ7ƈ$R2Lgk˔Қ.%"72XTiە/ځV`=U5ee~%V"UFOPH&PN,k:;aὄU֓JN|"ߜ` 1mE'Z!ȓqPE)u"k} Wf"b)^ KuԶe.7kT,կ*瘫lvӲͧ\P3, >Ӷ._R]5O&տfhȥ B 96ÎdkIR /ڔp͉|G242Pv;&>dVegQEL>k.xc^dL^|nXֆ%iuSF7)`3%_,:N&avs@7քQ*ȧI=SƚtrN9? fĮ}Bsùl!CyXF.",xylRqRa ,O7I8z[{X}_H"x?s!bqoš)eu̓| {%2ȟ\m ζԧ?ܟtb"UY7؄/5T/>HloV t W]Zu@a=bTg)2†.un8!{Jj50Aq6 YˏثT`oE6c9lDw|<42k^ }J[)~hy~Lb+yS/ d.\=}86;U]T4@ɡW5Dc# >p "At0afRoCl~w!gg1l(YsB s䬼T`2qLoL܌q}ܭ>7{.i%f=#Ty،nlk:4sO?vvO> ^"k³lE?nkz!)o\bJ:<83dG,E+E|`CJ65"""f_vh>~5٧o%d5<-2csF| P'hD@`$pQՎ,s倝2;D"ƯǮMk؂}Jl)w ]:|pc{䳥lfwB >f`!bqfXLh3>N.ttGD;ηpw h]E-`Ȣ6k%Gȇo-HFM7Mxk  Og)ka[Dž<, eGRXWyy9Xɹg{UҐ6?)3Y6{oQ%No R_=DⅳQPPpu\kغuc,}V㽷DmV{}XN /ggVV q'5Cbh?Awu> .#$2ӉٞF`B7LRZtAz\E/lw;BN#]<;en m!6Y>|gpN'0:,אw_m4X sYQ5Omxj&0 ^ =}6H8jJ]s#lS8e1UZC.͈L=滖wKMVߋD/69BVh+ ==ζ1SѣWp@kakJ" )΋ܝFy$PY}Ua,khT|=6R7uہX3wDX/q4/$TAP55#S!&G_ijQrB(&^%g=<qCt 139gKaI4G yuRg݂m8A"ĈB Yn~qէX{aZ*?{yW]}L#q'hI\<{U,)Eb/j= o {6߈_^pLCŪ4:+OCkucL+R zz{4 l4?hFB(2O\Zy|JpN⹞m j,AJ́p熺!5Dw 1@mU}ŋ)ΑJ}CW&sjjr.(POJ}L6( b$UT}`ˏc?KpP ԸTa's\` \oi_֦̭N<@"D^M".hM D9q֡WnZq*nJϕj QaOr .r"Td(xRm0/W@A4 JǦA. n~ٰeEa'0#|^[BJޯAop^GLQToQ S:rW939kevjui\FqɒzC, Y nZvioF\ [1>,ף/!ed*iozUϜ-wIxAUs6;dЀkMwݤCBE)4ZOsԍ'BM#KX( &ė/x,444 =vd+d@Q>cS?> m7+U5Uk@ / ˃BW x hSecxj$AԉVfm_osE5+, 3&}/>SO7n"/U=djW;VF3#!±iZkǜ8,zv]DHs3l24hjW _ܵ61t aIld: bgB yUR)&rky>t{\ʼn sȄ$) 12xTL1蚹Rp \0PƗcajCI-fCY)>Ȏ\<ٚ\k50F~[#߯ر2Z=x$PaݰGKt1ͱK fi{+Kٯ+f;FV|j~(g7H{ƻM1Soۉ6 $=*FX y1<^ >Į9۪k;j?aP H 'I^W% X#6I$8XIEr`K5]ud ?JI={ -x&h9w=jipF;p<,C2qN`䫯C M˩}yayS˞sm î[̕]Js SQb{;ӳk Xh9g <[a ̌kVqWmk]Z轴in]<l_ vպ6) '3 ~><0"]. \(.[b 0rEdV0pJ1~9Vbo}( Kt B+kmKd{M-MzMT3ݗ+PROɃY&Y/Zk=؞%! oژ$ٍd^ڛvd?UΌY^_U"'xsMؐ GIzSEm-"9z++VdEc}&IdZ~UIR+TұnZߙq(`]lu/:00'4qn󯌎toi(޲,/H}Vth'I}VR?8Dcƞ9|pE䧢'5 -2f~A&,kVm|v ŠF9\d̪ŷBo;o-()T$Grn8o+0i\y. z_򔋾UL*ܕ[)>Q|}'*1LIa_ ^_A6a; s48:k]kPPu4o0.]{L48Q])_vo3T@> G0"W5wH] qO~NCYT~FK !(o| HigI+/2-p$,f_uUakϙZْɈ "RI%37jH/E55dPOEԣUo :֨'JT5nn6F2CquJ3ڍ7#ʌ .A7LϛW`NfZ]5p~%.rWΉP `ٕ^NZ+,%&#gU׵TmlvT#एqt28_;&'Ii'A9/8R3uݹAKpj6LqlV;-d҄CX|3sg(L,v3pRf;PNbˏ9V&8qɷ!Ԃ5>=| aI޻ W=߱na N2:ZBNħw9Gk.LS)_' _M:bTT\8ei]uzkD2~fPկ3pkgol$/奤`Yz!|jI |0T I2~%2ɧqv>`3ęKMC{ u.s|0j+!|8Pd^9ti)?9:seuą%.m@ gi֐1|C%Rf\̙2Csa3zX,JÜfʱ=rOT G-ezrpSuSU~T1Zz)hs(]9u!ښs\p Z$ L! 7߆ ,M'#xEͯmݗ/rUP]WaߌDO4f'rSa8d!s(d% Xs#`9鈲v7sxw,JH]KDV4&Ԯ WN(*wk~UϙK\ h%z I7,oL9$uH#]o<~o>qRgÞdv 3|-m}WCWi_b \F 3P@KSQ4=F_ hDn taAtOĿ,8/˭c|ݏ 쳖#=Tl m<]a}? Qr]竕jD]Kߤxz)ѸGA*HxP!+`<,ysJfZh@G3UtwҰr!D. m}JZp@WgWh|_AB3ڈ\~Yr՝XJ Ž?Li6zy[q4I֬ߠEW5aä @Ʌm}lӣ®e y #@蕌IE@zo,@xA+Dw>i(׬dҰ.bLTh;"jÃ>պTa(+gI [ZmlItt xÛ.cB/y}kϒdG?7ld RF`j7Ms^y Yz(a9~ޗmd X4Uw!ip,nt!$ڇ \bBBhj4gBC81R3l:VfS;!NN՜ *[Fqn ei1_G; rՒ^:`B#-"64,:)2 /"^ZZT 鰹?MӾMiԎ R W]6 {dC÷'>8scCm_(=y"d6< 5g3=o5)_{Q۔2MUp^MpsA۬G kClr3m0;*#_x:ե| 39 P/xN)D\t˜-]Vx MY_VFj˅?$;\e{ (.D5x@⇇vW\-. F#򞻫stϑG:Swx{<0ޅPM2s`FtKG9 { M$boScT^ƽNIy5dL'}VA)&.XA)!缁D lsC4*Ϛw"o:>M7ٛxlM椈9MK5CrUxy:msK=%L-X!CSZ睐n셷S5M'[a WY{|ڣDs@Eމ )]AWilT#~*S v $O5B4OҸR\r+Qq_ע`4)CFԕ\T]PqYElSW@Y1M 45OT)`1iML{өsƐd[i{f o2洈/W9M\xoӍ?P1}dstf\ 3O~5q϶(Q 3RFϹ3wEd@Ʃ^@֏ή!u1K f9~+&9&4[WKfv2vX%tY\>oFk]4閚sEWYx̴XgH:hj A/qQu1:P\N ؗ!(\p`="WʷD8/{S*^LW#TQ?R-eڰ鉚)v}rJbj)h뒋 YbZ{, Ny#E)7{EJi3D1n@,h6}'2)$,yȉg|#N(qΘB=s1R;FSog!h,FJػ( Ż-C YABX=գyQGV:\4y$WB ]|!qxƋ/k78h5~@B)Ʉs:Ԍ>>*Үg>ےh+)q*+@2Poi 24aK:9;b6lڣ!{ܻxyEhvGGF8&\2x:H (M#s'|G4AQb_XcV`z⁔ ( D}KTa̛ E &ǤuX&kyK}?B3SƩ4}} hg$b:))X4HmYXm5-Yp1|[ݕOfwN㔀m:z)"Ȋ9U-$`G'B) :ZJBɼHiG!D$ݩn$\f3r 0> Ӧu$LAa_=$1Jf-`6jHB6YN,5inٗ1{=`5xs63¥Nz)O1A"k`UE5O9K*FRx~ iHXav%;u16O&WNG sơlsK/5"#) !^dFnQJ} 3]q3dCqurϢ>ka~Mc g(̸uD)M݂~|/J u6 㼸;4TѦu0e  .j$e9PHndQSF[ѐo峙pN\,W:'PD\ Ҙ^2šzJt"x5. q/'ُ^N-nUL{U{B6ӺT<;WѦ1[/~ g:EHľ<)* @yA8h t" |ÚnZnh '/٠Wئ&W:oCv Au߱xt܊q}Q#2>tBq*F6Bw"-@QnP2CD-%pagbf^Ӄ%}WyaǫyLdetIXo5e VX`_Lq\,ttP.;-53QԊA_;ȲPbbҽ5MkR,'yȫɠ5}t BnOف"\k%U#m;B@+iUMU&uqI w (gFjcc-!b N "jM8Z-6 ?]r΋Lk^%/U58߆ڤ$k3,tsYO?@u60aWUOA- "!;IYLRfbVسf3~2Sr&k}w%% nċ#>CX)ca'iDڎ`35pFD y4^5t՚ ֳ[R!Gzצ>o9mR/EbtTi (CIC8H<Fs$SUo 9,b 4cR>! fJ8,vF )Us \7U @WA%έ $ЈB%ϙceI}5P.#0 '‹ ;esSD'{R;YV'wL8MT's2 *p1ʆoa14B9}*z蹔TAU&'Rb,lp[esn;ɦfG-$prDܤrP.pƿ@ӞVk l\_ *GAT( P݇Ԇb/!"g=b\ \7OJÐNO+@݆.Y}>лTh= 8/ß1dƸXWؗҒ#`-ª6W=#yro7apSb3MJ|M~8rS\;BTJzvVm?CWge!mj3}'|$DtG(q#6yc`-k SMO{[AG~XrP+0Xn0nw}Iݙw40V[nRhoҤ>yAuhV>"ȧ0(3!ũ,DuZJ_Ajˡ{q@`0Srۭ; l 7 'L5r1+ MO]Ovpۜ3?JΑIZMd$Zz8LџI3Nݙ#ѐH`7d9/4GނM ljKHsTꝡlLo;yڬZX}ѺƩfdxT”]N!*"aZJT2>-sfC;%pgܞVU:zp b"N6ꯋ%kX{ ,Br1Qx`Z;@ p._ gQL),ge-7C &͝hH}#OJWSG/ pj*Nl.|T&ӞY-lnyR#k ᔾiw4:&Od@DmΨ"H(!hunI]s̶.٦$_d UcSU/eV ƨd|;X{ӤcȜ3іxvb tzF2t@n[LYn$r7O l.Kw dOn[do2[3Qzz4Mٗ 2VR%lkV(( W̢ +G)0J3͸ ?`2. - ʭ 2$\ا_{41~`r3Yz<ꪹc_!V2Ajژ+?$n8JVC+FP E*%؂ r)iG*Xmm5D˘cAV+xA}t2QA1iq!v펖Mž7$h"+c˜QсldK^;~0r?,Lț5Y)ȲD):vcP ODK`$5:H˨n\eet҇oCݺ gz7;~(=Ipd{gIUk#rLڬS;'*Cz4`RQha' ^sI"dQ pyhɨEE~_,w~~M'(.ʬmRR}$#D~[Pf{fNcjzMG.1&A{IiaJYla9D"^gH-Q¡?0_䮰Ai͢Mbg1SӰC{I'`|5w'p8[XMBXw2C\8?Jay1eA$7xXod5 2U'dw>9$E?"[Ɲ%ݞW2vs;Ci0nz 'Q:5l{[cjUE\/۷T% OXxgK2( Ճh'kRyy0'zr+DZWRx'8pG3a4VK>{œاϱ 71YOhUhKn!,2Y=k:O@sQuxj&⤺*] vō|lyIFy?:=XN"(Ӕ"36^0}NWEFyXR5A@bA28%h2M W6?c]ЁJM_%ױ:P˙> 3#CYWxUMȮaNaVgoKAd23b*;]@ r*)QurvWy_oR2 # ';85e[=YDc n"V~u|LW!"bm_2ӚK`b^ 7Od$bg , >]ŅjVq \IU\?$`3+]۬:XUc9]`W61 QȄ)̀/_gm$G@Nnxn8$LO/bCOV)Z*E; G6gZS̰xV* (¢IH `O?5O5ͦH^X\)@/>DIǜvK慸Exv}de<G;ke89!M{p'3|5)02#푉k@K8 q&;\rͪ ueT= Cs`}cO8kתƆVj'Xg$B7lbmgAnxk'y(0/|pձ@%;#īS5N44|s3nW-_笕Emv$A&ǯd_<̀K*iĉD3ԣ %h~vqBxdL8ƈ823] JsSv22 D7m|a)=60J}aHԐɄ> 9ֶTc_[j(<j=JLzu}.f"C ^O*F}<7)BhSb5":\i 4 MT l7cOOǠ[l)R/\T`r%=8B0cD{QecdŒ]P9wXX'mzNVoG(g/ 3v4`u|N^Iɓ#[*8E& $( ͯ%S##2|U_(:$lf(+? 8a#r#t }u7g*IiRGB[e"v%PRdޞp15+֚Hr.wo't9ҡWn5duȄonW2& LI)drGXע"MR:PTnhp@ 1 Z+INڏȵWkkHyO=~;QdS@ګ_0e=ʗ"1|Ӂ ֿZ]sBD XKğ'Ns@ H΄gI]Cq0^^|Q~yT_yokXZP6^_񢉯lH"~!q^=4jW!\3y[Uȕ"OƤ]saux曽)6UnۊnV XdQ_o6aTioNxK~s%[:*( 5\PiAsw:@z;^qo⫛jtaqn? jDb= z\D0,u9w^OD̎: k2bVꨓ3-~[~F<vI;\1t_0 ڹ? .U.v5v'JA)\Mv\3la40rɝ\bj~~ *zdZ4J /:5k fZ`(:F:_T\>_/4yaAqܘ?r\| YP8%>ƋY)2L%/}S( -FI$~;"6\yL/fx26ւ6gAVSv_U[CK AAHlS/X>,АJQ@(gV@ta.ʹG<Ψl;^;,+ o2gJ9kPsTngSqȮpܚqR-Ir7Lr%]ӄ1mx޿EHG<͟՗JxP_Aյ!f~0ٗb;yCx}TVLlꙮcF`*q_ Pv2 9v:rl .W@^*?Dtop|/Yt#qs ,pBR^">pH3AK6=YU@]-m}C:1']<Mo{q6ĥvRYb2OT:K;0CʻL.[nf)lsD Z 'dHō')->nO"]M"g|Ϡ&D@*4RVhHٵͤ)(s'RG| <;)IeS2#\]h8Bn͔߃6X%t:wof']TPKŗk[ǖp^ e+  [&Bߑ ; PQP)5{~xۙؤig UwZٵ#7%b$v{ wv=\ur"i=ߠE)*R01&wԃ<|ڋwcZf5!*(GXLJR+ = _ oH35Q%s3ےUڈ}<>èdP#"s ]lo I^,Wf#vLz$HjN7w5 JYoh302RFw?=;z0//-Jt2I tDHq &ߥ )qpowD!- eIVʩF/SvE h;o+/z4+/lO'0MR1ߧ`ⱥy}āW%/6y 7XWl{u'+\XJ2Zi$SYf^s=ۜD[*[WPTmmҚ)P5g¦;) Y " ` 7mXx-VO>-b*՚lG ?g+!Hdܾ}xgdB#V@["uľXסNя;R1  7mjm΋{>;jt|8{ DI8mr" }$\YX*M0 %.TO[uMbiŁSGLSfEv4B2>\mt??hX̬qwF}!Grr! gdf[xҔdecfy;4bySиiTs<&;'zqՁsfЯ]dCRobVR*f1$~Lj*.Ԍ[y]C+#~y2Cka2`:4mY?4F9SSy8O¶ʺz_\ǁ *0Qn5oA֡G.4C)EWCS&bbJ191]5}aʪx18֌~(FF-k|//^8μԦc3Z /Z'p=;qVp`u)w$#?r'_:a!}2`$}qGXMtu=1u@_b,["-D{V\gYߴ4b0~O~Ф'{B?RyTz0潽#,Mkr_KclAVAf>fUM/86^C_-҈[:rD^<5br2"]ᅫc1bhA/dDF3ex+*EL03R)~VtNES )bBGNϨ$-.'M2>iX .ؓ8x Qmh+I{lbWšlD@D`?EUkVRxؓ/ tpk+UV5w# 7fk%2mT՘N[CvJD?g`v|=+q0&bLNitX,gn}vw"r=mȄ-cb82 ۧ9b9rTH~;Rdk^TvX~="'wyY5̷7#"Jim  *j[ᛥ-Sk,f* X 16(pezeu1SIoأ`z\dۧe+|\M{ߔ+`zDvTe1WIp8Eu7}ǧqv4-c (2{дԨ& rN+YkbUeׂ?h Uz KIL,HU& ĥh_!`%Im2קC $o=3dl.CZ^wʺ[fNu<:?@:A'f/JE[G@>,?L+o}m/_m%Nv)_u10,‚S%OQ5<ǤE]m}[Bww xdߡ+4`Չ' K%vA@@[hT3X{8="\](,$ї&Yg׋̦C`T+(ɌWeDB.VT0X+۝H UWgg\UMF4D] iO X/#bne?p^2&n|qAoL/[ڬeopV )ZV-e0'XIw{`rj݅pc-i)sO{[~;+siz])邯_ՙ:e!8ʶjA!Hc&?WV\2F XKP#OނW87 `j@ 4UsCgQ*ڒ=[`lX$@DTөc9LDTKW7s@l4 =Vaذ,+  Uw4!<$MePӥQUWf3)7^MFm};~gc)ڞЯfncCUBpVzuMr+G2i]3CB6rbKJU|u-hwל<o餞+ȰTA9viPv%7^Li&5炂kQ4$`\ed&Yb=a}ŕAnRl#gŽ3 9b:~hSH>/ F˺\}qՠ1-zi=/H3J8ŕ#, nYl.V2#D )ߗZ,iuPdI@BiӶo0³/(qOU,hC `LΗdѠ&0ԭb/=p-Yʀ,"qeQTTHd;QWU?Y"C[a`w.ztJ4%Y!a1ZFЧ8oT4g۱vJw#\kqU?P1zŽ6g5 *)Z/N}akn-{ REb8˄&$+]wx6ep60moJGLP5 |+@ϬßN梩s]v*4漨0m'XRȊzJS`qTo2~L8x/]4M&"/N\]K_Ap*WS#`b'tQ4>vZj 7%W]4m/68ːfū !I^DY޲W?^9tZU+[GH#Z dvyK:KA]mZA7=D/\X|\̚l*CGP/n7A"tJcd;@2Dm?Wa$$Yu[,ӦWQ/ptqA:O/%R`e ЫZ'v )q vHݑQnE4"tݱݵ&^:d8W-c؀[z|4ULN.)Nve>NgK û'jY8!\I2p֨#LԵZ),@YR$d+.ke$;6$6J^hK!d0fΤ5MD3:EiīIZ$tȦ";5Hx&.6_5e)AAwvbi0 uP18 M6ĨqxUI O2~MfB22\95pD@Jǡ|i pTyyݣ>ol ғ84Ќ|jZkX8E945oBʯ5Iaѻ:JHÁǸ { ]9k^[(bqQc)l\S y:. F1|]Ir i%a!T!1]t&$xQV>e&.O}Kwfc)Ukى(^ Bw9I^`t FKc]3XbN?JO\u2QYOLj^Ŝ9^r*z49>w(@YnѬGƤO,#?Nt[r}tgΐCMyݺ< S ``YF֖ ~ao4t )IHyc1C@Bz峤D] OLܐLtQբ]{X([$vTpb#hnFf!/`8ݜfpH9%]CxV[*U05f UD‰ר6`gt:']~X~x.m:A1lVLLo;PÒa&S`/["vQ`.^nш.}3LhB6 0r,DCJWgśTU_,xr b'C ﺡNz*Bw/obW=YV-Ed<>8#jl@l-,R[TrK͛E*8#ď[cׅ:"Q6ZjCOt*A , c徨ZAi4yŢ0C E;tbfJy$H*57R5 W7ޮDhb}Oe$.SsjJٵ?V66҉[?uJ.5^kDDSqz `ar2CğvIXEWnр=\Q:[T[%¶M2~uHBn vku*(6 B׷'hLoICzc_CLLpuvSԵjGPYV 7Tpb98] 0i?b|zj~wf/Hjs0OVjՙV o[vZS7b k$A!_vHP*,R^,8&N#-L;N9G[ϸ>T v}d% cvP6fn0ix)J++`a:?sр>&klr5g]PhIAqдaȫF. ./mP{wzuxPD# Rk=@k΀z4Ag cĞ b$7l5zJ@TA.Q-L:\-}cƄ73T`Y#-533H(!,Fi' H3a*z"n+:sh֬Y'QB(/4*Q][]T$2DAVǏrMRB:D!vF5Ik,.EnO'_Q#d\:T4L44ĕhDsi:Ԧ~t&;KFGJv>bLYߣ s|o;?z{ZAiد!N걆#q4SrdK;YĘyUM\|.jȫEU6n9ZN|a}HŽ)|kIFzζ cIj_jmUZH=UC )io/;F䕏P|^4u+&HS 3Ɍh1bֈ/}dn+X-81E/F"-9#KW>4X2r K?\{|hCwcy27W;VX'6\eϋדL;rnA% VIwG:=w|$wk}k(,hRn3ӷ#c7!qQ?666ڹah=e⛻ܺ_\͏"۹dHSH:1?Vіz1\u]M6+<}m jia7wdΪ9Ӯ/0]ԓr7Yz re &]i@"Cp^{IޠP~[Bk|ҳ 1v|aNdx b34Xv+IJ}`*6}LAsM% hX> `$9Qzԏtڦ5~d@m8tD)1cFvȍXo=07. dEڕ)ǭ;BWSѝb r /i jk<,mg>t@ރX]`?:72S䓽I)uD '!ޫF5DCLć3D>#rh~,+v`|DBp/3ڊiT7ܷ`jYۇa*C}I4z[p9zm ֻRv[<Iڣ塁Q,A44§,71뒚ފp$I0.؉MpX4t)_"Ѓd?IH#F󿃙v _,|-qYsLGZb|VvF9^+băw/_R%s%Ll[,>Y-m2rj嶢{+x;# t R=$<60@)b&KfL;׈͢6V7!6rȩw:mc%/{$4؝y9[¼l:63*#^% r& )x?B[1Jk,QO!?bOr涆GY?<`0A,iPN64 { q Dzj ܹt4TՉh\lwiq-=KY%3\ |ϦIQ1V*6׬2|nY& gvǨ%p y*¾Z'YN7[gť3wlNra} UVyY_etCkum*F:c?kNdQ◿z茛N Sa~Š ;ex5 ͅw]>8?&nO&S[@ȑyy ʫ (b>xZ'.zϵEܭa >-lj+P_:Ily&;<U.v?uY88 wdC*RSs%K:Wj~ ],UaYy}'bWlTia37HlȅM)^R!nRa%;-/ ;7.{3I-C`%] "d/|DaΈb?##/)P B-DV"]dIwH} 2>jH᫮`s a5)VsF(9MJM Qk@5갌CE}6"*A>1T։&&bb) ڃGN+!(JL ShZ=a붊(̹ch\u), 85ך%m-]6]L @SÉEEKRH=';%b?8[fe" #|C ULጰP*JL$O8̅K_r#ׂHod?Զhk\G" o$ ""RSiz4#odwL$s@ܛNՏk/Ջ1+5c&#]J~_c9V${FE|Ls9wՙf>ΰ(ӮFE }UXt x%\P{#''6XSH MH@,l?7g@@ۺ?رkI؁t4I@1h\vc@A";kY67 i·d>72 vJ|T8t&iWG(qU7+ޕmɯ_8L"z[mO2xb(-a$e7݌y Z;f2݅ 'ָnzoCօQ8"}AF- P&Bb[&_t{_t5^K-T#8frA i뿜08+{:=abZ yv1\QS ?;"\!"YCt>Oq{' b}q=&QR2OwS+ Hv h3]q/w>S>T9./ _I$hA~W J7)梾|h 5z#P٫GN50ƈ4m&@4Rlda %\G4/Fر)uvNЀXKM .Uw\ Ne>&×|F"'./J{&uYkupRj.l?X2{|RMqVOBAeH8"dـzc8VpҕJ)\EnxPU..,uZ B-~KA :%e/(zqLVKEj4#ӵՕLAIyhhŵ&34l׹j'E_TbmPn `b"0_'[,{Bk Ѕ޷xե9W|// @Z@LMHEKmv[.ramIGER^";ωe$p5B -__ oz:ҳ~v{lԊsea(mĀ W6hbwE|Dj\F "HuT:<{T?6"#+Y.[mn2]2u'$ zI10/֣ӣP4MlDwi(k㋐Q'F!4NzjO?lDD .T+uXo9ڥR +Ճ*! >:O2];$!%-"TA=2DHmt`&e6D8rN `60q ؟$s? b'guH(z 3W2VfcEؤ!oRt^.d}HG$uEs(PB4Eb^"d߆_UXf0]#VǏ]QnXS^W4y;LZCc/Ai>{!n9kHPvJP Ɣe}VϳU`ݫo ^4sprQԔ:0/BXlo-<iwx}ptm5K&lҩYBӴ'x1oa, u;q[GNl4b]_mZ Ȏ/-/(OUSU9OЁW:?g TƎ#DC4MCnϭlkqICl`C )d^M`9 :>S\/uҁ\|"*_1'gkH#+QuHK&/"]&4Y7Vl>iW `%o sg RZ){/kufJuT}f Viˢdig t6ADתy/^Ļ XմM KGn9\}ߑ47C(d74yuѳRȇ ZvV2)`dejӷN_e[*AnL^`Vq<$BFaC=el[CǏ_@h*ʙWbeC@:%"qA\*ֹlexh2JNxSW[3q+d&n ^~ʩuOTMu~Y:E`D%xxT ?~TzrE t,I:AYvJ,[9GUt_}>,]Ӯ0wY*&ѺvK:۰]gAHYcOKCzcF5+'5|;h{[+}r #0RClQb+J:牟y|Yvnt4V s&Og͌oZt]&OQ?Ɔͷ?(2_;_)Qb"4 #i! >_}BAZV2B[8+[~H.X]5\ŬW/pzYLD'-i?8-wH>^"(Eܛa&]. hdާY-z2~sOb"pGF6-JGuTAɀiɴ 0Lmp!Sv D/ӑ0cS?ex:=a)%OZ+[[֚ .ʌaHڎ0v Th,C6hK]$+u0Ot;e"kc畗-1h7O ~<[,|Ƕ#j53'j-wm՛;8 7* ώsRz)?Yj=Fa^';F3o 4K ;b盼Po~ FEMYO<֚|4 F"e7 f5GxS*イ#GӬ 3d5pqynwK 姘PgNb<0ea~_Ggެ 5PȚq[~1_m8PbϦ5|Ր֋pgֶ$F4W&HruR(yɕ?d!1[x;cZL9n2xcW u4QV,.|yu4Fqvix)ˤ(a5*;--/?ٰ:N ӂ}fOD/Of M#'/zr*HBpڒ)q)R55mSd()rd=čڳf]v8R"`u>evz(QU!<dPz,vB2)%Ӏr\I8c=:@H\Wu#\ u CZs7a9?o4BWח0lz*P`yi*P>߁ ( fJM|11ƑO!Kq")ޱ/l/W{ AMbpsaESf:8\տO])0q+ͫpYzeb7,]bxZyIi&X ; $?q(n髑u`(;ʌ,eoQj9@t,qSa> "TI^ŊXqմ\0/O4FXVkGtocCNhjA8^baTpg:@K]@՛WÞ-e^D,ug2sz3'2PuA/dȩM Y 6xH#=swbb6pМǞAvJ#V?z';duk'&Ry歑F#蓨vt=Po5&͢gnR[(U=3lC߰Ԯ)KW5i6m[O‹+508Ad _WO.ek-]n4B'sd>g72J'0= g7hL0|%gDTF^= E,p'Y71dr4M ֗\qR |ے[>Oj`9q4 􋝝âz1J5$έ110~0^وlZ^CGngFPD.UJ=PJ4yHP?ʶjeyIQzt_=Pt^3AV1= ޠ9Ƹa[ |*8!pdFEVPU?mY\>>yt U*8M%O4cY*#n'L,PrpCQLdK-\srHs䨅TRQ{tIKVPsZ7`yy8kgr:ώ%Nɞ~1tjOytR&FO/߈z{O `lޑˬQb1p_^{+hϜԻJԾmi44t:E`-ÿ0y4Ƶhe+ YeǕk ˠiVT8#KJ%Pj /d/0@n?—O}$쥜 q0+<=/.m6UlX!u`dqm jl5/ә#ڠ:nK+3tH,@݉!E8vҒ6M I~iH3KT2_y`CRG;BdزPr"YAT N? `ݳ`H7uч͆w}VmUw-PO5PCGWA7_;X&2~ap܅ioJΥm1ތ=Y\We7kVm[G Iz/ʎE_a {]8HRbݤװT@xd"Y*%tuߔ!AH| 9`Cx#xVNX cӒf,̙,Q4bʮjdnD؍$4w7 FiIZ YPPj3yȡӳW_u1&V҆nJ6A1,/ccOU ;aPڄ.՘CgB2lrO\wijL,bP6NonMͷ[XS_;dha<(Vk(+dv퓡{ JnjZ/FtI4H['%9:e~^l5*yUBu!W1YsG^IQ 66wн&)ww7z=XrŪi!=&ֶRG,iJJ53zHيN_b 7!d^0>wō#3r+ɕ;k_fsZuW8kւ,FjDzmvIgv6IM%0cuEB))mt*x{JIo~Zz0RPQP!rl=^ z'kΐc+auzɼL3Q4Q [^(d,#Tܥ” seg-8bD(@Fg7 :aW'VOP]i8Ε-Vn T6wS5RbbʨcW{vc }rAWxNyYLDyػߊ^ UNi@IUv08Kv[ Q^R1lgjBb\EinH{54n߶-Jg~TbѶ%$RBzkodCG* F5<I<3xfnb!Z~.Jȑ%E- o=5'03 4Ñ'Z,%} eDξD^b22A b*]8_"-c63_%O1J #t׽1u"=\ nO]- Ž=3dAYTBW]DjUC#;yCT`h~AxH>Ԉ -XRC%DUaiK#I20VNFT5M@ҋ vT?rDfiFL-9Ɇ@pĺWUBx u+T'y22ֲatm/i[{pI9VXȨޟW?yR7^k7JJbG}V;Hd%dpZ%RzoyV4UVB# Hg )}$ϼQk^!#M0B(D̪d], b (0 Kdm(ad>gwkV\@5F$M|Q nfk9Ca.HO+谴a*#Jb@ƓGE-٫y'H-pf>oO}K 8Q$޼QMqjjym`,H ֬" RLSZQyq-*,(\RN k&&jBJ Rܨ@F-k Aa 췇e4Ze(F.R(jV4? /(c1:ȯ.~siiҺsǙ{LBEǕQ'mĝwx?Zb`?b4RH0] >s׌h`>:Z\J}5a9JFJ8mϊ$dr~I&@gxAyzsHx!! U$1k"NEĹ:mEl@6~3%kHM@9)#܀Z4 .5ƔAA/!/"#E*@ޚc>0X<_f#;rڋX@cKN&eSX^uxU&;t>Ƀ_NfOR2BDW;FD&pl](wލG>w_I(μ1S] rO"z4HkDnޮeqlP!co&:e|hBy\$j|;YNWNN<ָ*fi㵝R\c"a!m,WpΤӹ+I#wGȃu}:ʟ5M虻IyM\WX[meN>C<+pY'ԖnUe%҇z'.|v?"mK 95 iUns8@>s6? Gkv{[{;Q{lkfTٓ =%&E'"*;V @ 3:Ad7M4BU!k$]R TKݬM%䟂8pMPj{U˶?8 ;Caޙ_}ʎީ}#$cR}/9>=+4Gu0 1l߀U6aXHqAM[qo Hp 3gnɕl-+n9O60DUzHbZ^IG檊BB6p_Q뼎/@=fBZ Rxa Iqi>O@506vX iMw|om%F<Th\z-ANU5XT Dˣ A$FK,+_ {OSǗ1PIJθQ)Jec]: Rs$}д T<5ťaxEsB`u8_ JY94COx!{٦'˭0VBڋ0H-C78͕N`đ.v.tziA_I^ӈȒm`URe6ܱ! ttfin)bnT$ S].YmBEy$i4oWoq +oF?J0i?IӞ@5jj[jgF 'Y"3芝bUJPau1@ 36=\ץZx\3, |]mŸ0*ޝT~)wVl|%/˷4Td} ;K-Mm;!VĠ^i_vV\H;\kRz, 8rx3\%vBR<BFÑtJZp,ʇ[kj-|w#mJbwOeGMjN]D<9Ɍ=j>rJF%e "/#A nP xaQ`'W}:ŽŸo.!ؗ<=A"G(뱨=fGl١ws?=Dgz>\JC7I"sQM̨5uRjC7y F(GI7mO-Zc)wG6 z禦f}t,'`ոEO;ǽ(?\e|(ނi`D5\LWAzGx# J8VλQJlЧ5'yd ߽o2IwD]$3 x6e!&=N䐩N6a06{D[EvZ0[##:B<#=_dTIXSw@7x:%Th+>+Ոpk{ȼJ=GXZZ7D0)BIru3D2y%nO%6,pm yMFFX/6eU**G Mɳ.xesq&"9+‹E;l[$%Q/4 ksa AcOڝCc=(fWs9/ڿn!:eՆCN aK{M NE"ۣ ha[r赻Xex~qseR%nF`Tux +xD` A "gy@Dy+DG.%݁r}%YNbޣ 3: \s;M_c&ű WhWUb)L r.pV(?9_[bt;],ܸFtӎad~m`p&Z=-R$1{KɕQY'_]Mwpqڑh6ؐ?i <-!]b)K/Ɍ)p :5YNЀ5O(#K|s o4N1Y_z!Q OɼέN%'t6[#q !})_5$8@&݌`c{ȃttd3#1ꏞAzk(} /sJPL7ঝNDCltwaQ z3̻F+ddcp$OS:ś]9Nk Zat fXrԝ5ٿ]DCS62﯋k ca.5 "^'&.ݠa1gc b \:GY4D&GOb-]Vh,vh({1 |`BamBINovLvG/>u_IsFX>ʀ W$5,sO}<뀃yi'It Kޝ/ss$~2>c {yX rv,.1OKDv 2c^WeFC}M~3iEuFxm윹x*utԅ29quFnH;#2%qt0=/$gQ4O]ƼDޤJ#3͢=v^ZYV7$>hCQH-%cwwSYeX%/(m#K|ڽ!#DUg}hQ;#@4J{ʽ7u*L*]+& erӦ(Ά^e)2^S_=-XeD=i~(?quT+0@3ie0*Sm){> \`((7cIwG|`_0Ag#G+YQm-I0惬*X&_ǰ ºAuڲ~4>ʼnrR"wuxb/ꌙ95ě׿ض<8M%j5#UcPJ\&n]{tD́45eoYXkjRl"| 5LR|)a`M?{'g ϛ Z314~8ĩ+&E ㇩2aI""2@ܔL1r'{oS*Wp0J:Ì^PuǰpP<bRKH6}},-“[xaGĞ=^~Gj$ļ}w !OiA>4!:qt*ZLUt[8Dž -4F ydll;U+ PF^b!3tMsCV udN_ oMB[*˴A~HX.wpuɟ5%F@_XIowp% dĺsN qʊhZPXx֗z`p,ރ廐qآ!C sFȖogBZdf|Z|{g0\19UI+iyQ7N=^ҽŅ8 $\ g'NW`9%HDhq=a^OՠisJm 5*a*lU^E $Rjѫ4`H񝍖b>kQ}K$IȞx'h{-s&ޝnUZ  B9]8M/. l,~ d?۸QAHk y_L8\ )U\ƝcىjE¤Bx$ ։ I`eRQ5oO}Q<_5,ҟ>8qfY}q&.$Pgf>YV;R 3dފo(Q9ZiV >6M/ S±--Dj/Pj|]rC΍ݰR̮F[c:CfS%_uRr7:h,1yV:c \,=Or8Vl{܈\Aɺ19ز,.sykf"M_dG]Mm\-c+-Vlr qM+$ eEtڷHcWz.PcVe?Sޢ%Uw]wZ7QyNmD1g1Rnnݞ?gFT YNN[vs*f} LRdE6#k2Ei$+'}o}lI.RH2yi>cБʽQ MvH]N~\v_*Ct#+B0c I{B̬p+vqҶNjZPYayܖXUG?GM;o'ٷY&wuy)S\i!H\v+[(\W`X=73Ög:<]b7뙕1ǕKAQCN6,+{ tqEu]ᲈyA!EP sANo~~ـh&cŐyQ.h߻D8)4 bL(8^ 8E1",?ez6H,UrYqH"q|>rg!{E'U2I}Z[ȿ;k`/sh14z hYF>U:5|4V;n+Yi!k)Ɉu)G@^.(Qe|Da[0vpB؂.Yr85و>թB@m- /gX6,'C 'Z,Rm63%$Ƚp0PxF^꞉l[2% Qq*FݣxKkZT3=FщpGR>a ^ W%+͎A{xM<#xXE3cϧ ?>Q|R_hkJo笃]0ܒ$-m7/t}n]KoQh=_Z8e5vq1w~XzR2fV!J=`G;Ùz;s P!H^u@5#ϒi,4hc;]NgGD]{,dD4RAbz :Ga 6l9rߨ49LY"&VH4\OILлr4hψ vU,^[M^5gLOmx nLg!>ޅ ?'1w8㡵tL2 ! ĚmhVK }x)rE7*|~p)ZY]H4WgYZeaf/tests/testthat/test-hv.R0000644000176200001440000000246414405725511015536 0ustar liggesuserssource("helper-common.R") test_that("hypervolume", { #skip_on_cran() test.hv.rda <- function(dataset, reference, maximise = FALSE) { nobj <- length(reference) load(paste0(dataset, ".rda")) return(hypervolume(get(dataset)[,1:nobj], reference = reference, maximise)) } test.hv.file <- function(file, reference, maximise = FALSE) { nobj <- length(reference) dataset <- read_datasets(file) return(hypervolume(dataset[,1:nobj], reference = reference, maximise)) } expect_equal(test.hv.rda("DTLZDiscontinuousShape.3d.front.1000pts.10", reference = c(10,10,10)), 719.223555475191) expect_equal(test.hv.file("duplicated3.inp", reference = c(-14324, -14906, -14500, -14654, -14232, -14093)), 1.52890128312393e+20) }) test_that("hv_contributions", { hv_contributions_slow <- function(dataset, reference, maximise) { return(hypervolume(dataset, reference, maximise) - sapply(1:nrow(dataset), function(x) hypervolume(dataset[-x,], reference, maximise))) } reference = c(250,0) maximise = c(FALSE,TRUE) expect_equal(hv_contributions(SPEA2minstoptimeRichmond[,1:2], reference = reference, maximise = maximise), hv_contributions_slow(SPEA2minstoptimeRichmond[,1:2], reference = reference, maximise = maximise)) }) eaf/tests/testthat/test-whv.rdat0000644000176200001440000000031513706402717016452 0ustar liggesusers}QA0KI!|'D@IljO~XMڙݝlMy @ " *=HLMp;\3*6 \Z:Èab>3V}yt>u|Oxޯ=?zqP6` 1 $".Tu&:]G7ZUjoUM]Bo ] ?ڊ^W=eaf/tests/testthat/test-pareto-rank.R0000644000176200001440000000124014405725522017335 0ustar liggesuserssource("helper-common.R") test_that("pareto", { test_pareto_rank <- function(extdatafile, maximise = FALSE) { set <- read_extdata(extdatafile) # Drop set column set <- set[,-ncol(set)] ranks <- pareto_rank(set, maximise = maximise) set2 <- set for (r in min(ranks):max(ranks)) { # We have to keep_weakly because pareto_rank does the same. nondom <- is_nondominated(set2, maximise = maximise, keep_weakly = TRUE) expect_equal(set[ranks == r, , drop = FALSE], set2[nondom, , drop = FALSE]) set2 <- set2[!nondom, , drop = FALSE] } } test_pareto_rank("ALG_2_dat.xz") test_pareto_rank("spherical-250-10-3d.txt") }) eaf/tests/testthat/_snaps/0000755000176200001440000000000014405736677015315 5ustar liggesuserseaf/tests/testthat/_snaps/eafplot/0000755000176200001440000000000014660742422016733 5ustar liggesuserseaf/tests/testthat/_snaps/eafplot/SPEA2relativeVanzyl.png0000644000176200001440000004256314405730125023217 0ustar liggesusersPNG  IHDRݡ IDATxw@gǟ[QTGŽQĺ޸kjշjjmZE:Pq S6!ȸ{E/w _ǭs!=wE!t  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,W Ќ7n^G*|v.p*EQ2L 0`V_~ܹ]X'77ʊ(\E-X 00iӦnԩS 700;vR,--YQώ$ɂ v\"\:!!!-Zd,PǎO^ӭ fΜ٣GV;woU+1<|5|]Ap8~5r\2gXB!;.;.abU8tP.]XpD"kBvD$IK)Ejquue5f\,.vDA8;;rNNNx<#;.^F pH5QYRvq\HK)l,[[~ݡU>$=KHٰaǏq ҤDB2ЌG8;cm}\8_`^AI ُE-_<22;& Gu\vcDʹU \xb`žIg*ٳg<0͛$IrHdaaQy"??$I>p)D($ܪ֑H$@*qK(277/((`ejjZPP ?_$ӈҦĤ@&3WN?:8[yU@!*Ø؏$BLMT711Dnnnbb'.tťEZ(s!8[b :r\zrvvfphG۩{Cn3(p[/Skkk.k``3wFqA.8|\|>ڕ'SNOqoPm-}Θ7-˥箷2 5{^'//۪) IgϪ۷_+ :tU\4!IKmRҜ^@BQvF(D"Qa$%+:$;ѭg^)(q>AEZ9Ϛ$ Bj]?y{Z6oͽy\ e`````z}}%?wNF<+ouM|N"qbB{Cw3cC.I36n.N.QdCI {1kwoX~GL h^nn8?dFjHMt3jDBpM6ŸR˖~W\)9Ajb-Q}8)EIl0`QXHV6V=ekcw 8ց~Fm"!H{Ϲ~zRWWׯ__۫W{xxP9?lyElcYz^&\']c]O}iT[[.f6$Sƍ[_w+[{v%j ݌ťHUƋ ///՛WGоuKMNޠ ogAqxR?H8bmR663cʞxX9fkѴ)Oucqnι{˓UHBI|&)'";TuH: 7l0e\,.-F˜>^˗*r8;X1p'ʽa~ve DdO.:Akx3ɗ45cSO?ackPZDqBa?pn`c:wp\ex$Ĭ` -,,iEQ˽ȴK#lll_^NQTIIbp}042"B 8@A?^]g5B$I[K$;Njg]vG?w8ҮI>߿W AHջgXfff,5#!k˥+A+j)EQiiiLފűў^<<#U^c{$!D~LY-\yx3SBtt꿃 fװt6 JݿΥ[#)NQF€Pmd[,zspChg2PΘ s W"VV*QFs G\lindA_m 'O1ghr.bf:jW$9R:III4Ψ9$ŽK&JiiiׁW$B7#! BK"'YBEg#ׯ[n͎E %d 8 .:`w:et݌& 5Cg#! B@$$E~t 5Bg#! B HHmhHtG~f da㐠]:e*GӴ7"ai jnFB ąU$ԛO{+۷05Roy#,b <wvy8U1Bőۏ _+e4"fl$ʣHHMLLLLLRC\R_#ĉ  K EgٸXZ8s"^D+R?KHe|XRETcV?32Oav!Dٓ &%H}ǬM]lܺݒ?qn-9W: ,ɍUvmmif$..-F³gφIҨ][F`M Yd.`5C܅V6zK+}ZxeFBde9c~mE_LGBV`cou2:xŜ)rrGaaaY$$IR1C|333>p]U0DPƏ \*&V^f͚!B(j% j17O1fsE&~szrU)ATWZ.k.PȲ޳#vءI u$Yqvw;^D Wk븤Ri!Uk´C(~pe9//^<]]3CsϹ%lܹÇz~j#s;/g28S&P{k:;iaQdΑmQ?uXXfgw?p` #\~b( GOoDnZwJXzhb][ύ A8*bű|," \^XXhnnnJg6t$Ԃ^BW9^X8.,\RH ^/쳄…ճ]  iP3t<9r\4N$,<6ԼT^}W7B v^Kw?ԛ}]Ry-ionj]io|[ ro>7׋YH8f̘~b}u RRYtfԨNL#%d#]807m Ci˿xX+ DBpсHr㏜E$`x$|۷oq1%r xtR[_AoQ\n2ַ(.-E[\1C``qgϼ!^洱ݣgL&7߼Ŭ1n2/'6'BHjc{s@ /Z8efÇ\>qC GnE_]?~YYYv]IׄU=0^9!D\:+ 9gR!gK xU{%}#{}X,.X\_.#*~p|ҋznW Q]]t<SObp...7 [B'NsPP%KIJU|2l9!r?{.,9!IWD~LڻMC7oވ!w__z3!333333;rcxuvo#Ŭ`x$X%%%umӦMaazVll,k@oVo@CE/M%܇68A ySH9!48u&g;KEɑfMPѭzuq)״oyx5n/m2x$Xe7rv1!zeCLq(׹Wl>U<(lA_m  /&0nݥA67qrn1xvӮf%A\qײo/A!Qf$d|pK)9LF*38#\8㿟8V6w5(aASqcBrZlj;TKشYg5 BSRdaAm ]wϠuGB@&E_],Lз~Cժg 1;Hw^śYp1Y¿y#}v\.0zA^/x$'VEB GBpKo"ay2GB\ YHŋ/_b}uA$ȥ DBp"!M jGBpKDB`x$ bR f "!& 5C#! B. qDB\J`A$ ҤFBJ)&UGBpKDB``=:=rI܉y]Z/= ~HP "!F.0_ߦ5gkzO `}4|GBB] iR "MTBߴ'_ĵ2A-սϱΟ??WJJ\./..NJJR:U"OTpQjiiimmmccsQŢ?{LB(!!gϞ=||||=?~Jzb %%JUCQTմ!;Bw{43!#G_?Ğ+tZbsxD"|bŊ0\.r'.DWLLݻwIp8<oРA>D.Dl$%IttU=|޽{!~&rss-,, / !))),8NZZ .PFF= .T3cƌ`OOO`i<pkʘf_uP{l3-+\RU(1ZG[\ޕE.KR:W}D7I&M4QT$??,lGB]#!ӮiWHbe`Ɇ '>ŭ_%( [:&D B.,\BmWAA9 .EwA(jn`?ǟn%d\xD"kBv\"RK 8J p^BԂ^B鍣|>7F]Z\4G7VE޽=zĎK+ nȥ  HHi$WmsA$d \:HK),L#aLLѣqi}uA$ DB4z츴h!0+X EY4KG\ iP30m. Qm*ɊK!TwێCw5~K6H.:@$ȥ(bU~In?')H=rHv\ZA_] iۑPzv#-憞8rfϵ3lM F† =zVM 23,$,Lq PI1KMSDBp"!F.,X6C_,7OacgW~lM FBp "!Mt;;n4drKWamJ4d/^ DBz J3du45"F˗/ HK),Yمݬl\}ke^ O2` Rb \ZA_] iۑL7;!F6h%dmJ4 2ʂ%qrm;wN L#!t#RT,s?}ё/7j0DBv$ kmn5mcW}V۔i$A(j "!CN8ɑo=[a< Y)HP "!F.T?Kۡe-ji$A(t& .5" L#!j "!C<Ò>in(ہnNerX[)0T=CkUCի,XTv6#pzϯ)i$Yf 6qaHHݎNcz8"TIǬ"mi$dsu͘1c۶mWZ5cƌ]v1BݸqcܹE)~tŋr"!Mj<VY44JY-5kX{F}OB̮e~kS5.[Ztiffŋ7lذz™3g2BuS. IDAT޽nݺ3f I۶m[z5C.@/!F.T BMVzb5,2"Yw7z0fl3x:99͛7f&$$HRH&&&'D"EZPU\\)J^|ijjJQT*500P=nnnYe˖UXܹs7nݺu_\nVK117W*:tԔ9 GGG\Ys٩viV43,M4iĝ~УIƦoNlRK8H`U -GU?IEEEEbyyyU-.Dѱ(''''''//ODfffFFƳgۼyG=zɓ'eO>H$M4d WلW\\3eIlqrPX_X"ԁR}v{'ޔPudOjn}Dzcrly?y%,((hȑIJJl4Pui 軒ª]sժU>>>fff=zذa_={ 7o6mI̹h̎$ɔv\2,55T*MKKSN```ll,C Ps乛?qXC79*"ѧpoO7+.^Y3pD 蹾h6>i/!Pl۶-**~ȑ...Ʒn:xPwl>x`֭gΜ133[hװ&Pm CY^疦}H#43;hBdqnjB{A8?PKڽ6jbҤISL133۴iANRkR3pႡaor幹 Ú(PȚB~"f*I}^2ʵQmGYʪ_ܵellZtnՊ Gs8=a卧vF L#!t& KNOzU[(#2٪_`a4dׯ_|,u3!<:ߔo:5-tֹ7 :G1r)ʂ5HZxq/3 b}4 :HH*al96ۋV[g U\C\KR͈3ֹ_|X :^B\JQ˯E&cAﺢp꾞)HP "!Mj<!in|ԃ#GF>|]h؋F)K.,\K* VɅv^IoV۔i$ bRꑟ}Ƭ^1?q-]{ZL#aLLѣqi}uA$nGB{.2tAV 6%` B+& Ber^]9}aZ4푑]'ndmJH.:@$ȥokù,S W3P[.q& iۑа[g+}m;M /-0m. (bU~In?')"!#RT,IDwwzș>ΰ6%` B+ "!Mt;"$,Lq PI1KMSA(h!T?f }w~޽m۶%%iNEHHZ -\/\{ܻ׿ƩDdAt6 .:,%====q@Q?+z'Oke2X,~=5+XhQ:!!!xϟ+6:6ƍcKT ׅO&ؙ2eJllUBM\ubhLH=}G츾3ao-K[ik[ꞏ&Կ4)~՜*)oIKK;}ut|s$I&&& y3gΜ0ajX,3f__ӧlΝ;%Qaa%Knݻ.]9y[/^sjsXfMZZիWZA__U%:ujpp' P 9I2Nٿ>R]3n~ȨMW\4}ߙ2vk$,uUK9 WnnL&311Q&L={Af͚5|z 6 !lmmaЪUCq!<Ú웿K&xzǁ\ߣONLfF5H 飗1#aLsѴmQ7"!S j%zs޽sl;ohTk׮L "!CT}U}8%O}f-R^+44ˑ^/CZz* a<7GkbH i!`\BZ n 8U,vW͠055 ˞%&}wve'Siݺu;xQ@$d;R DbX̴ "!M 2f "!;@$^4ݍ DBvHH YH i!0+X a :@$ȥƿ"! BA4H a ,\  G/cZGB DBv^B@$d DB DB%HpCB!rrr/] iPnn޿['[n{? G¬}&&&*~> ѢK/?C }XguZP4Ƴ׵nv{tkuQQQ$IL& +OKR> !?fffYF(33sʔ)bQ%:dbb|ɒ%wU,Rӷo_՛^Z$]zdHԣGvYZZΘ1#,,YL&KHH I EQ\.Ã(vիu\.W*))[644D)v(H*S+ݜPU MTb}P*&\T*-TLsB[.ggSN ’(>d``79!MsͦZmnA!2+%gjJT]:uZjUafddL&S|u WWWXzmMZnݫWZhQϯS%LLL\b___###":n޴iTŜ´4 D" +KD8EQ?l{{{ϏrE)~zzzzprEeee)NbsP(J7oNb+&&JJJHtuu-i'N(..V=NNN~%H=`g:B("s>pSkكVN^^ޗ5 %'O۷(&&]vqqq̹M6yyy1튎r劚+$$|;~:B6r9 ccci*XnlQx_Fu5*i57ַ7t_}Wrr#GN<)̐i#Ryyapv\]]O:UcF?ΐQgM%I-%*K :ɓԄ^Bf`A$ bR f "!& 5"!*C"!M jDBpUfϞ=~~~ #R0+X U5DB@$ !0+X EYH.:@$ DB̀Hp8,"!C`V 2cǎ_Y"!F..D iP3  DB`A$ bR f "!*sNuքHH\ ߵk;.5H,DB\J`A$ "f@$. YH.:@$ȥ DBpUH@$We` : DBp"!F.`V  iP3 20DB"!*PK), BPGH.,\ %/I?#-US{*\tHK)l,QԞ>666 F+<>mv\tHH̿"Ygڬ Wy6yܐe.YmWTT^afNND"AQ%|~剼<>.]pQp<޽{\.($\nFڷop/fR4lAO&6鑴+ EwNч|?B]xrvŴij/%#RXPڦr?8;L@/!4^BqR 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)ǼŦ IK}gSB}A$ Ҥ6DB n۩ZsSRfNę3gryqqqBB҉i}\R:!teggJպ(Jɉ֠XA>~/dtsݻw^'))Fm+99I)))d2Yjj*;.TzX5,NFr8.@$Im!=eCNEA/!3`K.@/!F.a8.@$I,\x 2,}3DB\JÂq\HHG/#rA$d&?Ù3gT ( !Daa1U.X,츸\n-T&%% sݥxѭ[7p22G츄Baq}qĈ޿?i$v\JH l6@` zXx<F. Xsq8?.}u)zCAA.]Â}  l6@` P< %|ֶ}5D!$=>ׯC.*Bʺag h~әR0*[X˲}dAϐ<&}[{tu䭄"vtTAŔKxUs^[Jנam6\ӖKm,Xv_~C_`qkj{oIQE ー־QEܞWR-dEQEL˦Ô+`?[!W婮6((0=9Kq!{ݿ҈BKrsGEQ%:Z-c%^eeůKzCAw$ZpQWNK. 2r>ȆpWG!Tk68q\{yKkl&ɐ !D?m\J]LeO6tpqXx]1c.2=mUI]ofĦR3#Ǝ?SpX1s!q6¿$;}q\\L&K黐_9-`YD^fO=!B+ k~yOcHllf8H̄**,]l&c.6̩Ŕ,2pmtǴ'Zޝ>z 9C.J\XTpb fnfxc#,'gEf<;Qڇ|.3.g=ST<!B!*C_a%{;13!Aڦ܍LE U" nS˔gWg9^"c2;lSRJ`}W?'F9w(ᥩM-&SH {1divu0s\97z6e[ٹǮ89SE枛bT,;⻎a3rW sΌsix2AL/ pbK] GKѿ ]TD_9ǂEQ};XYmoٙ>\賷IHRycV vX+*f2*[Xq} 88TE~]v6M-+Q¤ ?̸ȝ;wsi?74Zq<5+W{Gϯ/>߱v9iͥ&?kXR` P(X`,]Ȍ;ۦt7;64at@,M]oAGOfKP-p[Tھ1~~+>: uj `SܶFYT[P^v >fJmmU+o}fF$B[ڑv s+nvf6,` [q\t aҡG>]d/}CB : n6c߃dL%; ߿A3@! 8ĴYhT9ibS]!)DB@  ׮}vX ȔK$Bo+}X`` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l?,ROy&IENDB`eaf/tests/testthat/_snaps/eafplot/SPEA2minstoptimeRichmond.png0000644000176200001440000005257214405730125024235 0ustar liggesusersPNG  IHDRݡ IDATxy@eCC@CCE@S5oQ<+43,fIefyGE(b !7,{U\aYw<3/ϼy!hF7pXX a`1b 8,,pXX a`1b 8,,pXX a`1b eC݁m7ڻ0.M=iZ09gR4M!B0 >"d^v!yur]uŞ!S&I_"˔/Mh5 BN8̜&mu;fTѦptmH? MOZ "5=dXK YZ\N#d# x\v\=Z ..[PY"\/*>TBQE{V#l*"(Ya?YqC7"l _]J3AEG^9['l)%zW&s,d1s4Bu'B4YMm×~et}?!o^ k`g'lƺKŴI%^la?G{G6ÿ8+ ϭ"ui5|Eb'm򯿥h60 @h|z,{Xd xh2@%p QE%TL>\Ö )e;!5t}.D|ξO\^k6Jw:W_=)// "{ہ# ^!O>b!%Mkv"[n$<[n*$yԎ5wCyAv[yCM{ B(ojG?)!WrtK^b>OThZ /0bmcq8,F-U(wNS3Eظwq8^I8_ݥ/?)͕^ ^+^0>^1sc+w6fOL^R}tܓ⚊l>qE"${MCad4K[fѴ>.Lʓ3xb"c3ei %Me' <~ i𢌦Co5#=Ef!c$hQs7}P\uܡM+?"d9ͳCh{)/_N.޺}OUm*cKj$׉  ;%jFwMQ~ѥE%$sp|q;hۮ]vmC}m+%d%'O BH:`C{>="$MjJN.M Z#$hC(D>}NQ𩢫e>µ}!{f| ޹x!uAspr1Z06nI, =sWZ:tĐ-f̻}B=䃵/YǠ `d5MMnʛhiٰN3oljN'"JFH/&'GO׺iow3LQ!W{G<Q#,Gu/__u?#t*^8T(i޳Ov}N"r,~ƟKY<]v?y"콬AB-QG%Ȑ"Sy?̯5B!D8?o:DʣNBNj:לFw`>mܣOevE۴![w_#D';dnVwk#@˂q9U'V^ŘS](j6-'F+~x35rH̻M-.ݦ[Ưx+');dtޟk܆'5r UB}4)GrZq̇VWGy^YzX\am 09swvYok.lA. y_iދTn9CFul B`}>pXX a`1b 8,,pXX a`1b 8,,pXX ,,jaaӧ<(|#I}GfPj|>XiZr~6lg0uԩFEE?LR$)3J'%%%\Zd\rd2gB\嗤TVVذ~lҮ]v/B[n\t ŭs KV+ qlR}{PU^^ΥEPYY^h86Hai4Jűъ -* Mr9שe25R(GTr~IB&soۛc[آ=M±c=K/OIh$HB|$dHBI Ih.<]z8xyڏIBai4F#4ZQQȥEB~D$x(SU5Zw#V\"##K]dŊUѲe˪hNNN^^B֭[:HBL$G#OGzu->:hРs5+&^?L x=AHTEU͘Ǻ:Z&I7dYY=J[[[.{X&YSVVҜkoA!*ک[,5]\\ڶmk]k:ǰ J .OndNMMxCO״G35!N}GxnܸyGJ͍tHBL$l>ԯ7oT|ݟ<M6UڪaaaFwq.#pqI܍S&DǼ>L}/5&w] v30ѓ&:ХG z? k"##umRc_uޢE #V]BC~:o-twϕy{{ ][l?S<3Z ; ybiSG |ĵi8 Y$!&@ȩS>.--yfէ%%%UJwzYYqo!nLmYVTɫ>>eee}999vvv:W_}5f]y7_uV[PPj Isż<G4Muw9/rWz&8xw?.J3+&cg͏RR~<0vV+iYbywy(#\BG.\]oiWv<|)rn3vɪ5i_|n0YKojii2sM} ime+ڜ5kѣzo[B/Ե_@scsT/f;jj_F?̝"qN.y] y^Y٦^ I$`QL0qH$#eggc m`wY SQ9/H:oܹ7~{jN#ں0d מ ]^A+PӼy0v%!MӮƽ~x>|>fc#okXeo6=vk9T*TLP%oEcz fXn %!LŁOѣGbbC6 ~/igF;wx^?OΨgʛ7o޹snݲ=zȧ5O(!+JI\1Lm ^֑8 sX, ZMGUTE5l7nhݱÄ  J SE )k50q~%KEUTTk׮[nV]|2L`Zo-[XQ7qug+ҿj<>^5zG i{?aL'BH{島?ioS3#' w;Rzln,V@ѯ`w-!Bի.]2~LIIjcc3a„Z=v\r)S KNնOGW޿:ʎ|8hNpAHi_Ͼ;A.5g` ;amc},aq/ juvv~~ϯT("8 %nژ+~UZ*)OHo^X\In3s:7&Cm{lB4B?*DeUp'z_q;2!f0}pɒ%5AAAוe2nƛ0qG,YR5bP8jץw{%UC?ԫ˂ł޺=QxMR!͕ $t_Yެą-jUε`aIݻwϟ?!pQF^UH$o֍>puvmW>.Oi-BB±>~b31w sX"><'zK;5Tىٍ`*a$IR]0f2$!&@-G+]}]]s&'$$:u*===555'' !!!˖-BLLLZZZ{X 4ͥ;?(WpCېRG'wJztx'ml|{IҦl(4pBйFO%_0X IRץ7r ϿzjJJct u;߿"CwEǾ-$$-oݝo2Sn}ןt`+u/y[gqgTK%3y-!D 1aQB}y÷tޑp:)i} ls`gjkυ./dPs^K1k 1ak uuuxG|{L}{39o/cp{M6ݻw1A^^L}Q*<ϊ)BhO(>oG0UH4JA9@77!d.ܹsnѢEm[$HBŨv7kƐs;$}ri Ϸr<2pĈHHH mڴ vi^xoi܆ mp]^G &v͉Gs+s8$In!$|]zIhօGծ"?IkMg*gQ+JZmccj%HBLX$ci6^.^y^?d0##ݻ5Izjvv{$ĵF{XToJ ;ߤ 34Tʮ$\bENN=:t蠟N񅅅!I fѶzf5EBγnu4e+cW2t uKKK޽;zhwwwXj$HBhO̧ɭĔ+7nܛ.%"##i޿zzzZZZ1YI fQ%zH?x@&999q3 K?O/5(];mzuPa;qT$5~`ԩS}ѯ:uj#8 8j7L;Hzݗk s9 D kx]O>99 !k2(Rk[Oٛc&eP"1DС%HBLX$4:n3`N3V\QBL<⢄ƷI|Тբm'l/SXK *IB6cW ~H;ld1,v%O?_4I Kwkhرsr|dԛ.ٱ(իWk&lXvD 1aQ rkS`hrr JHB 8 8Zm VܿCDXEm۶'$HBLX$MX:ntNB٠[I DIh| %8G 5JV:DQng}(!& J "*Ws]zm&RXPhZ:w0  1auPs[oeWI: C, 1V' 52=cnkQjѪ1/I KF5u~ -8$d{#IOOoҤ A&vvv\Z4$x3$!NuXdFf=6 yF. 7I(I$XK XK [K(j麐lIRˢI(HBL$Ą%JBCZsO5 +Q*stt4+7 J bª tX>|wk>&g%JXVVyfPfD 1QBLXU0fu,?Зq9%I"##;v$HBLX$ Gp'eI AOtKsXά{+ 1ah.>6gH=I(:mAN=mZA#]x&vL{@q):ÕG(!&^cqQBKxϯn=xkK]xRxwO',O T~dM2~rŔjTK%3?/!2e㙟=}FWqS?i'p9-*7b뤏F'ωVE+/Oŋu8 8 8*5WU-\U+∆cbS!/߱rA銠@>B [KSP* \055uO >|T*i&IBqq\.sm޼G7Nip>}$,V %%%\%IJKKZ-FLi?tI1`"oj>FBwxO)F)->kw4B,"!J9%7PI#iWBJA\. 4M뾝 jZecBn ޽{4-˙JA7¥QrH$hee=g*Mj!T[T8\T_h#T cC!Ti\U4A;XG\C`e- ƁĵJ’cs|'Skte&}a$lMB$l$ 1V% ,q .\u2{g(_$N&ٯ $!&@bª$!BΫ%]'/AZVT,#.M셦[KP6f| 1V% !l$.V%Iq>}z_$HBLX$4OX GsI DIȨe>2QL<Ǻ&>CSSj\9ρ(> 1lai38Ǜg>nCS:.3KXl/ ^V ۻz;Gvu۟=tyUY|>z_$HBLX$\pO5BеKngdEN4iǎB V' |JLy=*n&7ewV$5%IfK];.gt~N:͌ᝇ Y43ts!) ŋc/@b$!&N"}ڋWvz^}ʖ>& HIta HBl$Ą%J:;K78x\7\G]2P8 8juXtƬ˒x8?ߚvpuÙ8k}!k k 1ak y Sf?Հ$4 mڴiĭAz\@zLXUzꗗJBTڀI :I(5WܵK#;{ BF͋ne ;ws_$HBLX$4{KBU %FF tR D QBLX]Puj5tr1, ͛I DI^^BNh 6$''c/`(6`(&nh=VtvU'.<;&=且 JF2$HB!(YƩo>=?ޖ?ys'N6+ݮL˓O^|9I<$HBLX$43tErINsgu N:>GGDui*;1t5 Ju)S4V4M&^MWQBL@%/>aNVV}>ۧfl¦ 3[{VE姦+BH2?H0P:՘hjj}Mn[Jkp$I2dϞ=A?f$U*VݱcGΝ]\\$r]3~:8aqc!$y@]A"9VuGgFo?:٫sX6|::v\X[N~V8SL TAHRN40uȑ58uT^^IJ2''BiiT*-((vpp(&`QŨjg./y] y^Y٦Jf+J؈n%D 1aUQ"!]B9s _<`%#KB2e0au˘8tS:&b&b'ZXz%\nرc9+V2?+Jطo_.%D 1aUQB13D (!& JhXX:%!I˖-͛w5n $HBLX$4uJE%$$薒pHBL$Ą%Jºt_tQ~Yof\m?e %?H[6miw/D 1QBLXbиe~ɟ(t8EF 5Bh>߽{Z]hѢZ%LLńuN}եge6 HBL$Ą%JZap+--=#g6G7~ݫԩMI;`zM+--EI560q0qV5qT(fn]2ՐJwfĎp`->0q0ql1"oj%!*TD%mJŊgu<c7] ^gqg'`|Uv(!& J K}9n]A <^ v&.VK\\PG1G=,۰N~>g>N&G18JȔy{݇xQ$!@$!t׫/~v1 $ 1aШ"CZs-a/ QfѶN|Т=MVKBaۃ2em]frO)rmL$!&@-%aݵWSF%ttq0qTIho{J^!6[!HB"%D ͖awQ.$$!&@-ǰ&,zs@Znfo$xIhKpddPoooooo/w0I G1 `L0j̺,mvpL 9KBm۶z|@b$!&NխYzk ٥sν{lI }ꔄ&xי  1au$FHBL$Ą%JBO&rp?2e0a`m5qׂZBLZB6@ L@ 6IHBL$4[,lz%.=HBL$4[,l?HBD 1QBV@s,:Y}_cMm0q0q8qֶ:KntuI`ƒPFh4VߥI fKm=0"!›pw/ $$HB~Tމ"ڴ {Nļf%%HIIyI<%D 8)IDATjBs[oeW5z$$XIL0e{L\6k/ Юk/oxn0qTIh_Y,p̓c;$l/c1}ci;$$!&@-6PG1G͖Z%c]j꼺zHBuڮٽ\{LxF!L?7R*1<I(I f ޙˮ{\=vaWc;)̟Iݹ́MYJl'qHΒP4I Kܚ*M\`øot濈8G̜t1R]wuG#|DD_e噯%|I<%~,.JXkh{QFl4ܖECoߔ@!wvA銠A| 9@.$ E߾}nj`(&`RkkĴa=t5{厳KeB<BC ӾbZ.WaB"r+WArrrII EQf()))##cBZV#+ӫ vvvf(ɸ4J g+xzzVup #?IڏCee%W<㿗e{8~+1jԨ7+ZC'0>ܜa/ObBVeJB$6tIGGGjM4! gccSx>>%%Ą%%7ik BIh0 Pٽ$@%4[,aA } J -ꕄz l/ ^VyI((!& JhXX P  sXBIhX$$XIL$AAA/I$!@- > 1l6IP`$!>@2zXBxyHB0IB#8IL6IXRRTZZ]I I8HBL$4[,aQ}@b$bmP%HB|$d@  sXJB]I IVP`$!&@b$am(/-ݟ]h3c"NKGo&/OIXJq2/*{ʏ̟I\oWooo#-D 1QBL@F *sB1͎;`3bT8`Pbf)&Jn2}^BWE{wa|*$&b&-8,az=!WbMPp-++sttbee@[(LEPYY3j5I/C1<k[K?8w\NI IP$%%999M>'$HBLX$7k """{D 1QBL@;BIhX$$XIL8HBL$4[,aQ}@b$bmP$HB|$d@  sXBIhX$$XIL$$!&^/BIhXÂ$@ L@ VP"%%%҃$HBVPJIIkꀉ(!> J aQ}@b$ba  k+  b"((%҃$HBʎmKf$IcPYY){Vc jZ x<Ό$VE"7+TVVb 83hHQ`և޳0nU?YY*Z[paIf}֦3`1%>>guѳgO-.Zٳ\Zʚ8q"ic+\VMhb&14AjZ3TTTHR.- {ZVpQ%i?:V%9W^ra`1b 8,,+pXKqKgWҡ Ďss:9.-]{:8X->HioמͮEFw~88ͭE;1fQq!\\E/;OmǖQ So8Ȋ'>jaMӚc\vwCOUUd|C/ QhWs QS &R4hШ<mZzOmf}f_{t^xH~;*c1ñdԠEu`m?ذdE>f-\Z۞iV 05+ٲ(9i'=+wq#EifDȖ.Okk1<:ջti ,5dQ~WhhUG6즖dñeԠEi~pbɒl¦mQT~j"(4B–9+ٲDC1)B B㝳[=i5{h(wܹdߛ=^ l4R;zLAȫʏl'KV㬸KdñfԐEc"~pb\K%"$R{Z^) U&ybOg;;x٧}oA_zgχ"Sgܕ_6i=Qm':O󶓎}oo&DH4v\rp,bn?.nDk4YOk=d9I*ٱH׬rST琏~Y]5R%hZ[{i~'zPTŭ#}Wh>?;F Z~j3:1 ?qBA_o_.)tLL?HEHdق'헞dl޶K+DFHO~ن5Tֶy3mkj $u]ر:fk?x'ME_.kjX7Saϴ_$ ۃtLZ\ra"bc$IFe64\3~I C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 6u=IENDB`eaf/tests/testthat/_snaps/eafplot/SPEA2relativeVanzyl-extra_points.png0000644000176200001440000004256314405727004025736 0ustar liggesusersPNG  IHDRݡ IDATxw@gǟ[QTGŽQĺ޸kjշjjmZE:Pq S6!ȸ{E/w _ǭs!=wE!t  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,W Ќ7n^G*|v.p*EQ2L 0`V_~ܹ]X'77ʊ(\E-X 00iӦnԩS 700;vR,--YQώ$ɂ v\"\:!!!-Zd,PǎO^ӭ fΜ٣GV;woU+1<|5|]Ap8~5r\2gXB!;.;.abU8tP.]XpD"kBvD$IK)Ejquue5f\,.vDA8;;rNNNx<#;.^F pH5QYRvq\HK)l,[[~ݡU>$=KHٰaǏq ҤDB2ЌG8;cm}\8_`^AI ُE-_<22;& Gu\vcDʹU \xb`žIg*ٳg<0͛$IrHdaaQy"??$I>p)D($ܪ֑H$@*qK(277/((`ejjZPP ?_$ӈҦĤ@&3WN?:8[yU@!*Ø؏$BLMT711Dnnnbb'.tťEZ(s!8[b :r\zrvvfphG۩{Cn3(p[/Skkk.k``3wFqA.8|\|>ڕ'SNOqoPm-}Θ7-˥箷2 5{^'//۪) IgϪ۷_+ :tU\4!IKmRҜ^@BQvF(D"Qa$%+:$;ѭg^)(q>AEZ9Ϛ$ Bj]?y{Z6oͽy\ e`````z}}%?wNF<+ouM|N"qbB{Cw3cC.I36n.N.QdCI {1kwoX~GL h^nn8?dFjHMt3jDBpM6ŸR˖~W\)9Ajb-Q}8)EIl0`QXHV6V=ekcw 8ց~Fm"!H{Ϲ~zRWWׯ__۫W{xxP9?lyElcYz^&\']c]O}iT[[.f6$Sƍ[_w+[{v%j ݌ťHUƋ ///՛WGоuKMNޠ ogAqxR?H8bmR663cʞxX9fkѴ)Oucqnι{˓UHBI|&)'";TuH: 7l0e\,.-F˜>^˗*r8;X1p'ʽa~ve DdO.:Akx3ɗ45cSO?ackPZDqBa?pn`c:wp\ex$Ĭ` -,,iEQ˽ȴK#lll_^NQTIIbp}042"B 8@A?^]g5B$I[K$;Njg]vG?w8ҮI>߿W AHջgXfff,5#!k˥+A+j)EQiiiLފűў^<<#U^c{$!D~LY-\yx3SBtt꿃 fװt6 JݿΥ[#)NQF€Pmd[,zspChg2PΘ s W"VV*QFs G\lindA_m 'O1ghr.bf:jW$9R:III4Ψ9$ŽK&JiiiׁW$B7#! BK"'YBEg#ׯ[n͎E %d 8 .:`w:et݌& 5Cg#! B@$$E~t 5Bg#! B HHmhHtG~f da㐠]:e*GӴ7"ai jnFB ąU$ԛO{+۷05Roy#,b <wvy8U1Bőۏ _+e4"fl$ʣHHMLLLLLRC\R_#ĉ  K EgٸXZ8s"^D+R?KHe|XRETcV?32Oav!Dٓ &%H}ǬM]lܺݒ?qn-9W: ,ɍUvmmif$..-F³gφIҨ][F`M Yd.`5C܅V6zK+}ZxeFBde9c~mE_LGBV`cou2:xŜ)rrGaaaY$$IR1C|333>p]U0DPƏ \*&V^f͚!B(j% j17O1fsE&~szrU)ATWZ.k.PȲ޳#vءI u$Yqvw;^D Wk븤Ri!Uk´C(~pe9//^<]]3CsϹ%lܹÇz~j#s;/g28S&P{k:;iaQdΑmQ?uXXfgw?p` #\~b( GOoDnZwJXzhb][ύ A8*bű|," \^XXhnnnJg6t$Ԃ^BW9^X8.,\RH ^/쳄…ճ]  iP3t<9r\4N$,<6ԼT^}W7B v^Kw?ԛ}]Ry-ionj]io|[ ro>7׋YH8f̘~b}u RRYtfԨNL#%d#]807m Ci˿xX+ DBpсHr㏜E$`x$|۷oq1%r xtR[_AoQ\n2ַ(.-E[\1C``qgϼ!^洱ݣgL&7߼Ŭ1n2/'6'BHjc{s@ /Z8efÇ\>qC GnE_]?~YYYv]IׄU=0^9!D\:+ 9gR!gK xU{%}#{}X,.X\_.#*~p|ҋznW Q]]t<SObp...7 [B'NsPP%KIJU|2l9!r?{.,9!IWD~LڻMC7oވ!w__z3!333333;rcxuvo#Ŭ`x$X%%%umӦMaazVll,k@oVo@CE/M%܇68A ySH9!48u&g;KEɑfMPѭzuq)״oyx5n/m2x$Xe7rv1!zeCLq(׹Wl>U<(lA_m  /&0nݥA67qrn1xvӮf%A\qײo/A!Qf$d|pK)9LF*38#\8㿟8V6w5(aASqcBrZlj;TKشYg5 BSRdaAm ]wϠuGB@&E_],Lз~Cժg 1;Hw^śYp1Y¿y#}v\.0zA^/x$'VEB GBpKo"ay2GB\ YHŋ/_b}uA$ȥ DBp"!M jGBpKDB`x$ bR f "!& 5C#! B. qDB\J`A$ ҤFBJ)&UGBpKDB``=:=rI܉y]Z/= ~HP "!F.0_ߦ5gkzO `}4|GBB] iR "MTBߴ'_ĵ2A-սϱΟ??WJJ\./..NJJR:U"OTpQjiiimmmccsQŢ?{LB(!!gϞ=||||=?~Jzb %%JUCQTմ!;Bw{43!#G_?Ğ+tZbsxD"|bŊ0\.r'.DWLLݻwIp8<oРA>D.Dl$%IttU=|޽{!~&rss-,, / !))),8NZZ .PFF= .T3cƌ`OOO`i<pkʘf_uP{l3-+\RU(1ZG[\ޕE.KR:W}D7I&M4QT$??,lGB]#!ӮiWHbe`Ɇ '>ŭ_%( [:&D B.,\BmWAA9 .EwA(jn`?ǟn%d\xD"kBv\"RK 8J p^BԂ^B鍣|>7F]Z\4G7VE޽=zĎK+ nȥ  HHi$WmsA$d \:HK),L#aLLѣqi}uA$ DB4z츴h!0+X EY4KG\ iP30m. Qm*ɊK!TwێCw5~K6H.:@$ȥ(bU~In?')H=rHv\ZA_] iۑPzv#-憞8rfϵ3lM F† =zVM 23,$,Lq PI1KMSDBp"!F.,X6C_,7OacgW~lM FBp "!Mt;;n4drKWamJ4d/^ DBz J3du45"F˗/ HK),Yمݬl\}ke^ O2` Rb \ZA_] iۑL7;!F6h%dmJ4 2ʂ%qrm;wN L#!t#RT,s?}ё/7j0DBv$ kmn5mcW}V۔i$A(j "!CN8ɑo=[a< Y)HP "!F.T?Kۡe-ji$A(t& .5" L#!j "!C<Ò>in(ہnNerX[)0T=CkUCի,XTv6#pzϯ)i$Yf 6qaHHݎNcz8"TIǬ"mi$dsu͘1c۶mWZ5cƌ]v1BݸqcܹE)~tŋr"!Mj<VY44JY-5kX{F}OB̮e~kS5.[Ztiffŋ7lذz™3g2BuS. IDAT޽nݺ3f I۶m[z5C.@/!F.T BMVzb5,2"Yw7z0fl3x:99͛7f&$$HRH&&&'D"EZPU\\)J^|ijjJQT*500P=nnnYe˖UXܹs7nݺu_\nVK117W*:tԔ9 GGG\Ys٩viV43,M4iĝ~УIƦoNlRK8H`U -GU?IEEEEbyyyU-.Dѱ(''''''//ODfffFFƳgۼyG=zɓ'eO>H$M4d WلW\\3eIlqrPX_X"ԁR}v{'ޔPudOjn}Dzcrly?y%,((hȑIJJl4Pui 軒ª]sժU>>>fff=zذa_={ 7o6mI̹h̎$ɔv\2,55T*MKKSN```ll,C Ps乛?qXC79*"ѧpoO7+.^Y3pD 蹾h6>i/!Pl۶-**~ȑ...Ʒn:xPwl>x`֭gΜ133[hװ&Pm CY^疦}H#43;hBdqnjB{A8?PKڽ6jbҤISL133۴iANRkR3pႡaor幹 Ú(PȚB~"f*I}^2ʵQmGYʪ_ܵellZtnՊ Gs8=a卧vF L#!t& KNOzU[(#2٪_`a4dׯ_|,u3!<:ߔo:5-tֹ7 :G1r)ʂ5HZxq/3 b}4 :HH*al96ۋV[g U\C\KR͈3ֹ_|X :^B\JQ˯E&cAﺢp꾞)HP "!Mj<!in|ԃ#GF>|]h؋F)K.,\K* VɅv^IoV۔i$ bRꑟ}Ƭ^1?q-]{ZL#aLLѣqi}uA$nGB{.2tAV 6%` B+& Ber^]9}aZ4푑]'ndmJH.:@$ȥokù,S W3P[.q& iۑа[g+}m;M /-0m. (bU~In?')"!#RT,IDwwzș>ΰ6%` B+ "!Mt;"$,Lq PI1KMSA(h!T?f }w~޽m۶%%iNEHHZ -\/\{ܻ׿ƩDdAt6 .:,%====q@Q?+z'Oke2X,~=5+XhQ:!!!xϟ+6:6ƍcKT ׅO&ؙ2eJllUBM\ubhLH=}G츾3ao-K[ik[ꞏ&Կ4)~՜*)oIKK;}ut|s$I&&& y3gΜ0ajX,3f__ӧlΝ;%Qaa%Knݻ.]9y[/^sjsXfMZZիWZA__U%:ujpp' P 9I2Nٿ>R]3n~ȨMW\4}ߙ2vk$,uUK9 WnnL&311Q&L={Af͚5|z 6 !lmmaЪUCq!<Ú웿K&xzǁ\ߣONLfF5H 飗1#aLsѴmQ7"!S j%zs޽sl;ohTk׮L "!CT}U}8%O}f-R^+44ˑ^/CZz* a<7GkbH i!`\BZ n 8U,vW͠055 ˞%&}wve'Siݺu;xQ@$d;R DbX̴ "!M 2f "!;@$^4ݍ DBvHH YH i!0+X a :@$ȥƿ"! BA4H a ,\  G/cZGB DBv^B@$d DB DB%HpCB!rrr/] iPnn޿['[n{? G¬}&&&*~> ѢK/?C }XguZP4Ƴ׵nv{tkuQQQ$IL& +OKR> !?fffYF(33sʔ)bQ%:dbb|ɒ%wU,Rӷo_՛^Z$]zdHԣGvYZZΘ1#,,YL&KHH I EQ\.Ã(vիu\.W*))[644D)v(H*S+ݜPU MTb}P*&\T*-TLsB[.ggSN ’(>d``79!MsͦZmnA!2+%gjJT]:uZjUafddL&S|u WWWXzmMZnݫWZhQϯS%LLL\b___###":n޴iTŜ´4 D" +KD8EQ?l{{{ϏrE)~zzzzprEeee)NbsP(J7oNb+&&JJJHtuu-i'N(..V=NNN~%H=`g:B("s>pSkكVN^^ޗ5 %'O۷(&&]vqqq̹M6yyy1튎r劚+$$|;~:B6r9 ccci*XnlQx_Fu5*i57ַ7t_}Wrr#GN<)̐i#Ryyapv\]]O:UcF?ΐQgM%I-%*K :ɓԄ^Bf`A$ bR f "!& 5"!*C"!M jDBpUfϞ=~~~ #R0+X U5DB@$ !0+X EYH.:@$ DB̀Hp8,"!C`V 2cǎ_Y"!F..D iP3  DB`A$ bR f "!*sNuքHH\ ߵk;.5H,DB\J`A$ "f@$. YH.:@$ȥ DBpUH@$We` : DBp"!F.`V  iP3 20DB"!*PK), BPGH.,\ %/I?#-US{*\tHK)l,QԞ>666 F+<>mv\tHH̿"Ygڬ Wy6yܐe.YmWTT^afNND"AQ%|~剼<>.]pQp<޽{\.($\nFڷop/fR4lAO&6鑴+ EwNч|?B]xrvŴij/%#RXPڦr?8;L@/!4^BqR 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)\tHH\X 2f "!#R0+X E4H "!C`V  1r)ǼŦ IK}gSB}A$ Ҥ6DB n۩ZsSRfNę3gryqqqBB҉i}\R:!teggJպ(Jɉ֠XA>~/dtsݻw^'))Fm+99I)))d2Yjj*;.TzX5,NFr8.@$Im!=eCNEA/!3`K.@/!F.a8.@$I,\x 2,}3DB\JÂq\HHG/#rA$d&?Ù3gT ( !Daa1U.X,츸\n-T&%% sݥxѭ[7p22G츄Baq}qĈ޿?i$v\JH l6@` zXx<F. Xsq8?.}u)zCAA.]Â}  l6@` P< %|ֶ}5D!$=>ׯC.*Bʺag h~әR0*[X˲}dAϐ<&}[{tu䭄"vtTAŔKxUs^[Jנam6\ӖKm,Xv_~C_`qkj{oIQE ー־QEܞWR-dEQEL˦Ô+`?[!W婮6((0=9Kq!{ݿ҈BKrsGEQ%:Z-c%^eeůKzCAw$ZpQWNK. 2r>ȆpWG!Tk68q\{yKkl&ɐ !D?m\J]LeO6tpqXx]1c.2=mUI]ofĦR3#Ǝ?SpX1s!q6¿$;}q\\L&K黐_9-`YD^fO=!B+ k~yOcHllf8H̄**,]l&c.6̩Ŕ,2pmtǴ'Zޝ>z 9C.J\XTpb fnfxc#,'gEf<;Qڇ|.3.g=ST<!B!*C_a%{;13!Aڦ܍LE U" nS˔gWg9^"c2;lSRJ`}W?'F9w(ᥩM-&SH {1divu0s\97z6e[ٹǮ89SE枛bT,;⻎a3rW sΌsix2AL/ pbK] GKѿ ]TD_9ǂEQ};XYmoٙ>\賷IHRycV vX+*f2*[Xq} 88TE~]v6M-+Q¤ ?̸ȝ;wsi?74Zq<5+W{Gϯ/>߱v9iͥ&?kXR` P(X`,]Ȍ;ۦt7;64at@,M]oAGOfKP-p[Tھ1~~+>: uj `SܶFYT[P^v >fJmmU+o}fF$B[ڑv s+nvf6,` [q\t aҡG>]d/}CB : n6c߃dL%; ߿A3@! 8ĴYhT9ibS]!)DB@  ׮}vX ȔK$Bo+}X`` P(X`,  l6@` P(X`,  l6@` P(X`,  l6@` P(X`,  l?,ROy&IENDB`eaf/tests/testthat/_snaps/eafplot/SPEA2relativeRichmond-extra_points.png0000644000176200001440000004634314405730125026214 0ustar liggesusersPNG  IHDRݡ IDATxw@?Y p+.Y:ZU8[wumm9n{V*(PdCvHG4$J>w%ryQQE$|ҿ1UT*Ra% 112''' qHl`}nݺAZ BsΓ'O"w^|YQn:~|mmmwՊgϞǫ>z(""BrĉZjvAAݻw `!@wޥ.>*++ځl6"E\.FRQ(TJUT*E"aRiyy9aA8. IkzHeʕ'Oh$IT`8A kJv`rr={nbَ*qqqZj0Lgƍ,DiVE/|///ú:88חx rMIŮ"TW@7n\6|ngɸqt.3g6nܨwE\B‚$DV* JRpYINfzÉE(>]jP3=>|xuggg1 D.../p׻ $BI(* JJJtW}l၁ZiX,$ Z/lll5S** [`EQQyxQZZJ'7UDP(ɽRF*zY/_[%LA(*JPQ|՘&|ڮb9}5cp#Pb6Mׯ_GF辨]vE Pu5ֻ$U O>in9s-~~~;wlٰaI;;;jxzzU"xInj~^^$!驺ۓ~|}}y>>La!}D}tsƵaJTe1\#L 5}CGZ/_޲eKpOHH [\.U80"Hu?H.UP(B!a%\.'=SKjTQ|omf  D"H$˔x[5J_~% AHv&T1 S X0[cƊ¯J|eUe1ZK(_RI}mn{w8 ` D]]|J؛CǷ${v p g:C@Ň~ofΚ{U.8^\es$00aÆz7K%%,..)o߾9%%EskRR} ŏ?V%#X/BI%>uhȃyZ`U@Ofs!8:"ZHeCm8p:Vw-ǷB<^|8+EUwT*+w92nܸǏDK.. }JddzVZinmӦիW;,XUVbmfŃF yQo{Kl;D:ැ[G{!g/%<~t㯱 vVxÓEy\###IO`,!`nVtcyw  w={œՃNa%Gι!;v1| B?t;};mjlQ* uMR*:gowyoB.JlrLv9 7lÿQxrn@ p9Fް IRIuV͛vMp A%^Oο6{?ߕ\?NwZS"bbO\mopmi7o5xfz_P1 +Xz7K%4XBnUO?rYP7r3.@Oz&o:Ƚg))-I^G IBp ) kKhy%\B]BV^aPP* j;wVKϞ=5jlذܜڷoijcIJzLw,`zC$4"R$!IH(\\BIdٿr״/YhqIȰE$WK@ZlQj*)lNScn@:$ᲶcZ+l[GQsyB˿rxۺ^[p!{[ƶnŚyQ;'>]A!zzmjwW>>X7oB]ѩw '6w ;ΤxxKs$[PCGG5cw}hՇ%! ť Ϝ9s1:PTۓV,|۽S kJR&UTRjbbG5=6BICڲBbٱB,By']?5[*/*t~u8s./^sհC!Zު'\, TwXNNNU jFF,w0a>w U---MOOСeʕ&`uU k*IHz<O $NV,;88c}!e>3ȍPY曼Onܹ)}<ґ%:8, ݱxb3,v5 k].^_>HIn䪐 Qkžgb\Γite r9˵= /Iܱ/NP⒐a \Bc:\BpD{X~A_^jy7lٯGg~Qsi96`l_BSn!rgz9UݤgA%wJ⒐a˲PKȔ0XB:`ePXBIX)0й(%OX8Zrz,p uPVHBcePKHQX9^ɾoIht^V.!HBKB|zn*fA1!qʾYu7iSj2o% Z\KJ)a%dןyd*9?۞ׯr:{vf?!# 9dz,}Yw6 !B$iXYQp ) kŵwppppp͉Yo "$})TIŞA=ke*713~Ӛ%!q':&''kybcc3fWXBB؛WVu Yn~ȶόh3S gs"7/,t5 :/BY& VjjfN8Ѥ4KY@A}j׮]IQEo25ȝBƿC_ +!G JX՗>[BuA?l}XV2`Q:%e^fٲe˖-#%eB[c\ Cυݷuu>,!0zcY\2`Kh ZKR$]wl_r~8 kNZm}ӄXnÖO{;}Vifi,2`XB]`,.V# y]6Ѕ_x(ٛwGxkf"TMǯ=v9%e==Iz@ ՋPٳG&K@XBB$9hDήNv :X|$J .1$I(>sM_hݎw]7BPNk~G."~^οdD_c&kмM߾:8.,[X)$IP_S~{odʲ,霽r&*wp uP )V\ʻ7w!p/}44w-pP_ iwCBx;ڰlGm^IseE( .!}ZK(U !IK[͉+G0WΓv>+, s̒^~sBD-czy7rSB٧7 fnmo-1)B\./_pMW, ?#ꍼOoE{WL4sl p ) k%B;v|! ~C Bx1?qn!:*-?-^͹IvJ>}[FjgrV\.aC@Cwn ݤ_hhS.&)~~bv%e^˪?ήj-Rߩ8(Sa;[:ids%lPⵟxX=;6:Ä;qQi Go\ݝY!ay!mv]l<.ן[N%dX~=m7x[,8]kiKp u1Kj-ȰKꪔnGDS!rYn^cG>R ׿jG~`}߲!OZQq6|LA_Pc4[p[!eQz,TP5QIY0ak58p| ϋ4oB"-ǏÉ'1 dz_V DR>2 qT5 ' ^B_Bլ~FNKK#=|^?J@@zeee_RTgJǖ")"pLZ+v5ٯ3$LL&#Fיʕ y q\<ӓ 4'?T^Ҡ}+ƫ4Rء^󮼸w޻w®K*:~a]x׆={*Q r<*3-ԬYFixynݺ݄aح[bccn=vٷoBlߵk֞ on߾/BD)))-RԤ P k2,??%%%"999JRaN]6f`8}'P>[V-Am9%W' +Y[[XIHy %Qv.*;0oS{UY ?z4gratnZ'dCI^}wA>cNieFﰰ3V~}%WRhG--r">a%D!N~}=^Cۿo [׳+-6w]_Qף~;Mkl}h`_+:~#fF# (7d@_GPTϰg: /Cs{ehG F匣 ŒT8J"8qY\LwhwUusa{YYK{:[색?7K'!Gشmgi6BqP{?M-& k9>( B9hQ_)RG9:wKG㨲Θ=pbKH}⶛ɁM_t@l[w y0UD?z:/U3'KB-n|Q ʱf3wUhB,?]{0Pq)P+J{{{rÂ$IX1Cd d*.lMY?t;}Hljlx:V).Bc %$|8<<\wGIE1iҤ 6hЀ òE(`Q‚$D >aA"+ +Xt8 .!}‚K%HB$!Pp uITu]cE(`Qu HB:`ePKHQX$!$>aA"+ +X.."tRIh@K@$Ih*J­[W&p HB4~E(%dJXp HB:`eG%(,HBK $DV* V%\B]%D PKHQX$!"',HBdf5qf$!IH%\B]@"+ +X{ѻ \B.!-B.!EaA"t΋PKH JBKh0$ M\BcITI(/|@H_쿕M K $DV* ,IM{ITH/7wv=_3.Bapp \BT%ay|ϟoo탅Bi IDATAb!LΒ\BITKH]6-%(08񹫿c̘'XB9Krr!c^<} sݣHl p ) HIϷ[G_Ya͝e4$PU`:/B.!}‚$DV* +)X'yn8`kK=a/"n͗˯ BHvsm9&-.Bapp \BT]B<{y"^ج}Rvigs_ c꜇=d>e\o(Ij$T$ǥt^ԧ=!yEBx~vC`,.0PKT,Xܐwxf)~t&զX"TWʸ\|ߣκ/U2b(ϴ`FJB25"JޞܰbkU*_XU*2ǎ"J9N"*U*.ɉܰc3හwԄ xeħYłN/"Ou.. W|˗/ꐙ) 0Lu_6~1xիWWBP{8]v]p?Ckk׮i߻wO1)yHcգ]/ X2TJzR  #>/ D"}L&Rm/}Q3m}ՌJ%%%< W(G `u78 ݺukҥMSL955{BQXX͛#F0)yTnqwwq\UM^l6MGYΤa|^˫ҋPjQ1!KFtmӢE󏴝kj>}СC SZZJyqOHH5OB2ADTT>w|SNiDDD暔[~~ٳg5[D"~\U(*H$/Y8NzX*.fQQQiiiZ;, 1h==|j}6Uܴ겝j7s4E. #\Bgt 9ϰUx K.x<ҟabһbQqa- &/UEq g6YS~sFfZj&TIIIZw@$'':w j a|2߫={UM{&7hOsOaePXBBQT:kעE./=?7-קn-n^NeM:">`,bqushkh3,BvVqZйӧOZ&Lْ~K8qD[(tEVq;,uy n+) %4 QM!D7b;!k }f7WnzXBZ A,IB;[ppWri5janFS7OrXv,lU~g}Çݫuc $!i!XN.v~Ve?ђXp ;;;Db@oomذax\B‚$DV* a:NѻO# t,I:UW̕,qүŋ7mڤ]sܹ.\ݻKKK;tnYrettIbCw8 Gv5<]oܑ{KMzk:S)5}X%Tg8 3"+'tѭێx"4?>1P: A|άAP!1s az^fM/g# Blyqrү9‚Pd,Ȩ;㨖'.!Ea%DVVXƟ)fDH4,s槅TFGGkaÆiCeÆ *u A$JIhMĺC%;R! %(,J] ®VݼK{m,4g~ZXhPw]+WUKh J Fm\iHl>\Jݨ4w ###5U^!,tEV* +,X ۅ ,-6̻[`[ bE(G>ϸqnܸQ}U??UjN:oCTՕݻ7(( i.!J]Bi<Ύ2Q={ݫwn!N|Ei1ch>ׯJ ѣ'O|E7k6//Oҵkװ0M-@[HT\\v/^GveUOQt'.>.>ƕkO-f,a̙GTyׯgQqӧO8lL4i… 4"xe *Jғo߾sΝOŞ6Do]B*‚KHQXp QMs BH~fWsمZv^VγS;̕,Vj躄0㨥‚K%4X-F}TZYڰv7 %Ƃ.}r',tEV,XW8N̜No"M2Wnz$\b 3R$!(NӒ{nˍ=gvjs Jœ|4mTkn?qRaA"+.sA &o߱'cE( ܹs;(aq(RIh`l]*SN?k?ldӁҎn]BRwBG(Ҏo$K;7&Q!?n9͔>,( 1 } jbbb0  '?}ׯ_X,5zhww-ZKX}@) cx|{k..}$?6WzXP~[VRɓ]v_^O||-rc l?wҥK.D"KXM@( \X;99AbW2iXPM QM,--|p nNk_Lj@玣Z-sOU.7)3H@$$ϷhE:Eْ3XBcqĎΒEEEVJ%! }$a&Mz٢.aJRKX}`,!fGUXB‚$DV* +|}+z}.!XpzXl8,\BqfY3~Tbjo9یk֬Y`fKӦMպO&m޼^zFF;{lLLL߿s3V#آD&{,W,qT 5{Oچh.f7o~T*1 S% ܹs@$tQcǎ*J8 Gٱ[<-)?$7uv$odduLL̨Q4ݻ'Lݻw4iD"qttOOOСzSNEGGO{m\\bXshӧOSRR(X AZ`|莽;f*7``x= x%RK.ZG\.UrB:BK8ZKh`]Y9JGE˹w SA\4cw{[GgWW';{G,>jz4:w%%$eQ t8j1(eN#=iҐ:';sIg O6mUxswlYhGmiȁ呟2&\jqTs -RPaK.a {.?u9us&:nigz\}Ҋ߻dgF:KBlrK$!ip@o.p8jc+u՟ ÆnR/4}q?1;BL $Լ֠qtԨQ!!!! JJJ;N0A}k@YS?---MKKkԨjIJr8)T sIЄ*0h|y_ղ\Y=_Oƍ/K0}>cgǷo~\ٳ  Żwt_D">B0LnDZbѠA D"W_}UY~͛7:~bXP=|bxǞ)x ѹB5mѮKO캉݆%TcKzݬY3GuYKhO>'yzmO;6Ae~BƟ&uBw ?hEc <GuŹ%a. KϝLi6 q2|Tצ 9чIBfIfIi- 4yձN^+vLlP_:KB%IY$G)?7G.F@gIHXBDR^OXP8j$$gx:؞;QLJ$8Տ[PPZ`OZhF<(--M9^mHdR=qz2UHRJ>ó0L.>HS.lOZ:. qLfR4 &3 ? o%d83ߖj8rJGmmmy<ޤITogΜi&SN};s8:u2ׯ:qU?LcxB>fPz VabjΑ%c o'N*XjP3!Cܿ?)))<<\bgg)1_5PuaXNN1ځ竟\5 D"qrr2|D"*P+..vuuUKB"2ܘ*M`xj6*~ՀK"!!cǎ_u7_pA1c߿ʇϙ3',,0{ݲe E.!(E8LXX@ P=i666qΜ9#4ѼJ=<;;[6EIX,:\raPlR>7LfI8* I8ȍD"1#ŋT,:KBF,gff[H!u2bX<é'zQ-5ASUqUA(ʊ-7n0\ DBEOr.KswLFJ ]~T..0.]T*d&.!.1K.!RaGiXB8jG%jϟ?oܸsB`,GLXB‚$D %%j$aݺuΝj< -. ֭.!E3FjvkE( ֭CavbӔcׯ߶m[k. =JU.aS uu ) k䌣SNTyl6ܹs;vطoz+A'N={Ǔ'BkjWt-[>|ʇ=#GT3Vz8Ub֬Y#G4OVV0۷ټyBlYn>W^|s5͖ٳg@ {fKAAT*5)1Pqa) +I[RR"HT*IKŅU(JKK#*%L%.!\B:..G +X4w a,!MŒ+0 HB:@gIc $!RI.!d.GLKHQX$!$>aA"+ +X.."p 逕IBp ) $t',HBd\B\X$ HB:@gI.!}‚$DV* _yI^.."p "n͗˯ BHvsm9&-+R$!IXEe):a}/2_O?);;_޽{q܏/BaEB$ާ~GEk///.kkkҤI LJ{zzjH$r/Bqq1WK(J$SdBWKUayaJ>3JBEJsFڱX|gvNM۷uA&ۻMU~!}}} 3a2yd}4[<==۴iٲvZ>oR!!!-\.Dn@>/ <==IOUIjRUC^ãҝ),#ȎF:&(W<]ݭϦtLՌenxrӂM>}С1uNtcqr\UE$i.O T\* PHzXD"I[VV8a1 @ak;ͽ7;@Y2n\(ϴ`.."p +Oo^ՉEl~]\71K \ͿIۮ!SW37sa\Bc\B.!$ Y$ %IBKHQX$!$>aA"+ +X.."p 逕IBp ) $t',HBd\B\X$ HB:@gI.!}‚$DV* V%\B]%D+R$!IH, %OXJ%! 2I.!EaA"tΒ\BIT2`K K%V& %(,HBYKH JBp  p ?be\B‚$D %! Y$dXPp uKHLKHQX$!$>aA"+@&~$!I@:KBp $!RIȰ...!X$ HB:@gI.!}‚$DVw9{ IDAT* %L%IBp ) $t',HBda \B]%\B.!2I.!EaA"tΒ\BITKK+R$!IH, %OXJ%! K \+$²2qyLLKHQX$a!O.ѱ{#I5֒Β\BITRƆM[9gXf\(3[\?қeB0p 0%,O8{+짝 mhfm0_{%[?b&233(,,hSu^0P+S b􋐖Fz}^TIRB(**2@(~i>;'XmW۶m3OVV)Vao߾5Ͼ}O]vi퓐6//ۚ-P(4)7HRPP JM b T\Xd|ÖD"(3*.B5OTTTZZVA ÞD5.bWQSNug}Y! K%`hrz7n}@? w :XBBQG%qYiQ+,XK.!R $!%(,HBda/]4|?wx,?Ad2W>|>pRxr -Rl3Dap-rjB"888PB,ۓ*aJ瓛\.gٚ )/:?/iݺJIg)ѣ1 Dzϯ^K,y&aq'=,׽{͛GzM68q#F#=,6##c5+X+P` P` P` P` VXHbl6׊Pcl 1aP(b49a1 +//7uzJvvvta Ť ɸ\.`0RH``X$Zcccccc%{ytNߦ~n~!_nJ(Su+# [ٮON_o/4x|ŔVOݭ7jMZmIէaov&2IJ1c=owOVC_U$Ul?@`3ښ=[ E ~BﱍfݐQv.N HD A^fu_L D"Xf0ݽ(V/mrMi-%3l>$#[T?r3R7ƝHU_.Nms괌  dLmIUWOtUXY7 mVI`o^V>X)÷Yc/ec}QѵWחF&=yS [;Rb!QS<՗ͱ߿q|w `"𷇢QeȖۤs& _=Q!H DjXND,1^]덉pYSrrku*7Czij^a a{"$}uzG~^۞"1?,Y#ůg;o/,2vO_tp_uѰ@L/XF k7?`cgoDzaDbz1/tSF6v\=ko LیT S Q|gȶ]E?4>څx㧻NX~b/O/2`r_/=Lo{ob&9>ڽz!ճL O8rNr96|^? 6V BTe?q$;E*KmSKJ*BHrN.M(<4;82`a6m=Лr\d#cƶ!~/b\}bI!_2,3s/>] C 9kD]ۇryi:k~S"_wg!ۡ1BP(=]OvY [jao{jfw_Uk?k(00ӤOdbWSn?_1[AW7jMکmGډ).hɿ ?<.j]C,M}ܽ|?gHU7`o{}`la?%!5(X0(X0(X0(XyonؽsF]^w]5(X9[y^Ĝ#l˪qjЭ0D6E} ,|ݝ;P#Ef(<=U+ŵܰ+ !dey?PvpU-Ol8j@C/ áSOz!/,|1Jj] "l³2pLC@p.+=0ޗ-gJmt #`^8^g슛y @'Bq~iͰaG                               a}2#IENDB`eaf/tests/testthat/_snaps/eafplot/SPEA2minstoptimeRichmond-extra_points.png0000644000176200001440000005257214405730125026752 0ustar liggesusersPNG  IHDRݡ IDATxy@eCC@CCE@S5oQ<+43,fIefyGE(b !7,{U\aYw<3/ϼy!hF7pXX a`1b 8,,pXX a`1b 8,,pXX a`1b eC݁m7ڻ0.M=iZ09gR4M!B0 >"d^v!yur]uŞ!S&I_"˔/Mh5 BN8̜&mu;fTѦptmH? MOZ "5=dXK YZ\N#d# x\v\=Z ..[PY"\/*>TBQE{V#l*"(Ya?YqC7"l _]J3AEG^9['l)%zW&s,d1s4Bu'B4YMm×~et}?!o^ k`g'lƺKŴI%^la?G{G6ÿ8+ ϭ"ui5|Eb'm򯿥h60 @h|z,{Xd xh2@%p QE%TL>\Ö )e;!5t}.D|ξO\^k6Jw:W_=)// "{ہ# ^!O>b!%Mkv"[n$<[n*$yԎ5wCyAv[yCM{ B(ojG?)!WrtK^b>OThZ /0bmcq8,F-U(wNS3Eظwq8^I8_ݥ/?)͕^ ^+^0>^1sc+w6fOL^R}tܓ⚊l>qE"${MCad4K[fѴ>.Lʓ3xb"c3ei %Me' <~ i𢌦Co5#=Ef!c$hQs7}P\uܡM+?"d9ͳCh{)/_N.޺}OUm*cKj$׉  ;%jFwMQ~ѥE%$sp|q;hۮ]vmC}m+%d%'O BH:`C{>="$MjJN.M Z#$hC(D>}NQ𩢫e>µ}!{f| ޹x!uAspr1Z06nI, =sWZ:tĐ-f̻}B=䃵/YǠ `d5MMnʛhiٰN3oljN'"JFH/&'GO׺iow3LQ!W{G<Q#,Gu/__u?#t*^8T(i޳Ov}N"r,~ƟKY<]v?y"콬AB-QG%Ȑ"Sy?̯5B!D8?o:DʣNBNj:לFw`>mܣOevE۴![w_#D';dnVwk#@˂q9U'V^ŘS](j6-'F+~x35rH̻M-.ݦ[Ưx+');dtޟk܆'5r UB}4)GrZq̇VWGy^YzX\am 09swvYok.lA. y_iދTn9CFul B`}>pXX a`1b 8,,pXX a`1b 8,,pXX ,,jaaӧ<(|#I}GfPj|>XiZr~6lg0uԩFEE?LR$)3J'%%%\Zd\rd2gB\嗤TVVذ~lҮ]v/B[n\t ŭs KV+ qlR}{PU^^ΥEPYY^h86Hai4Jűъ -* Mr9שe25R(GTr~IB&soۛc[آ=M±c=K/OIh$HB|$dHBI Ih.<]z8xyڏIBai4F#4ZQQȥEB~D$x(SU5Zw#V\"##K]dŊUѲe˪hNNN^^B֭[:HBL$G#OGzu->:hРs5+&^?L x=AHTEU͘Ǻ:Z&I7dYY=J[[[.{X&YSVVҜkoA!*ک[,5]\\ڶmk]k:ǰ J .OndNMMxCO״G35!N}GxnܸyGJ͍tHBL$l>ԯ7oT|ݟ<M6UڪaaaFwq.#pqI܍S&DǼ>L}/5&w] v30ѓ&:ХG z? k"##umRc_uޢE #V]BC~:o-twϕy{{ ][l?S<3Z ; ybiSG |ĵi8 Y$!&@ȩS>.--yfէ%%%UJwzYYqo!nLmYVTɫ>>eee}999vvv:W_}5f]y7_uV[PPj Isż<G4Muw9/rWz&8xw?.J3+&cg͏RR~<0vV+iYbywy(#\BG.\]oiWv<|)rn3vɪ5i_|n0YKojii2sM} ime+ڜ5kѣzo[B/Ե_@scsT/f;jj_F?̝"qN.y] y^Y٦^ I$`QL0qH$#eggc m`wY SQ9/H:oܹ7~{jN#ں0d מ ]^A+PӼy0v%!MӮƽ~x>|>fc#okXeo6=vk9T*TLP%oEcz fXn %!LŁOѣGbbC6 ~/igF;wx^?OΨgʛ7o޹snݲ=zȧ5O(!+JI\1Lm ^֑8 sX, ZMGUTE5l7nhݱÄ  J SE )k50q~%KEUTTk׮[nV]|2L`Zo-[XQ7qug+ҿj<>^5zG i{?aL'BH{島?ioS3#' w;Rzln,V@ѯ`w-!Bի.]2~LIIjcc3a„Z=v\r)S KNնOGW޿:ʎ|8hNpAHi_Ͼ;A.5g` ;amc},aq/ juvv~~ϯT("8 %nژ+~UZ*)OHo^X\In3s:7&Cm{lB4B?*DeUp'z_q;2!f0}pɒ%5AAAוe2nƛ0qG,YR5bP8jץw{%UC?ԫ˂ł޺=QxMR!͕ $t_Yެą-jUε`aIݻwϟ?!pQF^UH$o֍>puvmW>.Oi-BB±>~b31w sX"><'zK;5Tىٍ`*a$IR]0f2$!&@-G+]}]]s&'$$:u*===555'' !!!˖-BLLLZZZ{X 4ͥ;?(WpCېRG'wJztx'ml|{IҦl(4pBйFO%_0X IRץ7r ϿzjJJct u;߿"CwEǾ-$$-oݝo2Sn}ןt`+u/y[gqgTK%3y-!D 1aQB}y÷tޑp:)i} ls`gjkυ./dPs^K1k 1ak uuuxG|{L}{39o/cp{M6ݻw1A^^L}Q*<ϊ)BhO(>oG0UH4JA9@77!d.ܹsnѢEm[$HBŨv7kƐs;$}ri Ϸr<2pĈHHH mڴ vi^xoi܆ mp]^G &v͉Gs+s8$In!$|]zIhօGծ"?IkMg*gQ+JZmccj%HBLX$ci6^.^y^?d0##ݻ5Izjvv{$ĵF{XToJ ;ߤ 34Tʮ$\bENN=:t蠟N񅅅!I fѶzf5EBγnu4e+cW2t uKKK޽;zhwwwXj$HBhO̧ɭĔ+7nܛ.%"##i޿zzzZZZ1YI fQ%zH?x@&999q3 K?O/5(];mzuPa;qT$5~`ԩS}ѯ:uj#8 8j7L;Hzݗk s9 D kx]O>99 !k2(Rk[Oٛc&eP"1DС%HBLX$4:n3`N3V\QBL<⢄ƷI|Тբm'l/SXK *IB6cW ~H;ld1,v%O?_4I Kwkhرsr|dԛ.ٱ(իWk&lXvD 1aQ rkS`hrr JHB 8 8Zm VܿCDXEm۶'$HBLX$MX:ntNB٠[I DIh| %8G 5JV:DQng}(!& J "*Ws]zm&RXPhZ:w0  1auPs[oeWI: C, 1V' 52=cnkQjѪ1/I KF5u~ -8$d{#IOOoҤ A&vvv\Z4$x3$!NuXdFf=6 yF. 7I(I$XK XK [K(j麐lIRˢI(HBL$Ą%JBCZsO5 +Q*stt4+7 J bª tX>|wk>&g%JXVVyfPfD 1QBLXU0fu,?Зq9%I"##;v$HBLX$ Gp'eI AOtKsXά{+ 1ah.>6gH=I(:mAN=mZA#]x&vL{@q):ÕG(!&^cqQBKxϯn=xkK]xRxwO',O T~dM2~rŔjTK%3?/!2e㙟=}FWqS?i'p9-*7b뤏F'ωVE+/Oŋu8 8 8*5WU-\U+∆cbS!/߱rA銠@>B [KSP* \055uO >|T*i&IBqq\.sm޼G7Nip>}$,V %%%\%IJKKZ-FLi?tI1`"oj>FBwxO)F)->kw4B,"!J9%7PI#iWBJA\. 4M뾝 jZecBn ޽{4-˙JA7¥QrH$hee=g*Mj!T[T8\T_h#T cC!Ti\U4A;XG\C`e- ƁĵJ’cs|'Skte&}a$lMB$l$ 1V% ,q .\u2{g(_$N&ٯ $!&@bª$!BΫ%]'/AZVT,#.M셦[KP6f| 1V% !l$.V%Iq>}z_$HBLX$4OX GsI DIȨe>2QL<Ǻ&>CSSj\9ρ(> 1lai38Ǜg>nCS:.3KXl/ ^V ۻz;Gvu۟=tyUY|>z_$HBLX$\pO5BеKngdEN4iǎB V' |JLy=*n&7ewV$5%IfK];.gt~N:͌ᝇ Y43ts!) ŋc/@b$!&N"}ڋWvz^}ʖ>& HIta HBl$Ą%J:;K78x\7\G]2P8 8juXtƬ˒x8?ߚvpuÙ8k}!k k 1ak y Sf?Հ$4 mڴiĭAz\@zLXUzꗗJBTڀI :I(5WܵK#;{ BF͋ne ;ws_$HBLX$4{KBU %FF tR D QBLX]Puj5tr1, ͛I DI^^BNh 6$''c/`(6`(&nh=VtvU'.<;&=且 JF2$HB!(YƩo>=?ޖ?ys'N6+ݮL˓O^|9I<$HBLX$43tErINsgu N:>GGDui*;1t5 Ju)S4V4M&^MWQBL@%/>aNVV}>ۧfl¦ 3[{VE姦+BH2?H0P:՘hjj}Mn[Jkp$I2dϞ=A?f$U*VݱcGΝ]\\$r]3~:8aqc!$y@]A"9VuGgFo?:٫sX6|::v\X[N~V8SL TAHRN40uȑ58uT^^IJ2''BiiT*-((vpp(&`QŨjg./y] y^Y٦Jf+J؈n%D 1aUQ"!]B9s _<`%#KB2e0au˘8tS:&b&b'ZXz%\nرc9+V2?+Jطo_.%D 1aUQB13D (!& JhXX:%!I˖-͛w5n $HBLX$4uJE%$$薒pHBL$Ą%Jºt_tQ~Yof\m?e %?H[6miw/D 1QBLXbиe~ɟ(t8EF 5Bh>߽{Z]hѢZ%LLńuN}եge6 HBL$Ą%JZap+--=#g6G7~ݫԩMI;`zM+--EI560q0qV5qT(fn]2ՐJwfĎp`->0q0ql1"oj%!*TD%mJŊgu<c7] ^gqg'`|Uv(!& J K}9n]A <^ v&.VK\\PG1G=,۰N~>g>N&G18JȔy{݇xQ$!@$!t׫/~v1 $ 1aШ"CZs-a/ QfѶN|Т=MVKBaۃ2em]frO)rmL$!&@-%aݵWSF%ttq0qTIho{J^!6[!HB"%D ͖awQ.$$!&@-ǰ&,zs@Znfo$xIhKpddPoooooo/w0I G1 `L0j̺,mvpL 9KBm۶z|@b$!&NխYzk ٥sν{lI }ꔄ&xי  1au$FHBL$Ą%JBO&rp?2e0a`m5qׂZBLZB6@ L@ 6IHBL$4[,lz%.=HBL$4[,l?HBD 1QBV@s,:Y}_cMm0q0q8qֶ:KntuI`ƒPFh4VߥI fKm=0"!›pw/ $$HB~Tމ"ڴ {Nļf%%HIIyI<%D 8)IDATjBs[oeW5z$$XIL0e{L\6k/ Юk/oxn0qTIh_Y,p̓c;$l/c1}ci;$$!&@-6PG1G͖Z%c]j꼺zHBuڮٽ\{LxF!L?7R*1<I(I f ޙˮ{\=vaWc;)̟Iݹ́MYJl'qHΒP4I Kܚ*M\`øot濈8G̜t1R]wuG#|DD_e噯%|I<%~,.JXkh{QFl4ܖECoߔ@!wvA銠A| 9@.$ E߾}nj`(&`RkkĴa=t5{厳KeB<BC ӾbZ.WaB"r+WArrrII EQf()))##cBZV#+ӫ vvvf(ɸ4J g+xzzVup #?IڏCee%W<㿗e{8~+1jԨ7+ZC'0>ܜa/ObBVeJB$6tIGGGjM4! gccSx>>%%Ą%%7ik BIh0 Pٽ$@%4[,aA } J -ꕄz l/ ^VyI((!& JhXX P  sXBIhX$$XIL$AAA/I$!@- > 1l6IP`$!>@2zXBxyHB0IB#8IL6IXRRTZZ]I I8HBL$4[,aQ}@b$bmP%HB|$d@  sXJB]I IVP`$!&@b$am(/-ݟ]h3c"NKGo&/OIXJq2/*{ʏ̟I\oWooo#-D 1QBL@F *sB1͎;`3bT8`Pbf)&Jn2}^BWE{wa|*$&b&-8,az=!WbMPp-++sttbee@[(LEPYY3j5I/C1<k[K?8w\NI IP$%%999M>'$HBLX$7k """{D 1QBL@;BIhX$$XIL8HBL$4[,aQ}@b$bmP$HB|$d@  sXBIhX$$XIL$$!&^/BIhXÂ$@ L@ VP"%%%҃$HBVPJIIkꀉ(!> J aQ}@b$ba  k+  b"((%҃$HBʎmKf$IcPYY){Vc jZ x<Ό$VE"7+TVVb 83hHQ`և޳0nU?YY*Z[paIf}֦3`1%>>guѳgO-.Zٳ\Zʚ8q"ic+\VMhb&14AjZ3TTTHR.- {ZVpQ%i?:V%9W^ra`1b 8,,+pXKqKgWҡ Ďss:9.-]{:8X->HioמͮEFw~88ͭE;1fQq!\\E/;OmǖQ So8Ȋ'>jaMӚc\vwCOUUd|C/ QhWs QS &R4hШ<mZzOmf}f_{t^xH~;*c1ñdԠEu`m?ذdE>f-\Z۞iV 05+ٲ(9i'=+wq#EifDȖ.Okk1<:ջti ,5dQ~WhhUG6즖dñeԠEi~pbɒl¦mQT~j"(4B–9+ٲDC1)B B㝳[=i5{h(wܹdߛ=^ l4R;zLAȫʏl'KV㬸KdñfԐEc"~pb\K%"$R{Z^) U&ybOg;;x٧}oA_zgχ"Sgܕ_6i=Qm':O󶓎}oo&DH4v\rp,bn?.nDk4YOk=d9I*ٱH׬rST琏~Y]5R%hZ[{i~'zPTŭ#}Wh>?;F Z~j3:1 ?qBA_o_.)tLL?HEHdق'헞dl޶K+DFHO~ن5Tֶy3mkj $u]ر:fk?x'ME_.kjX7Saϴ_$ ۃtLZ\ra"bc$IFe64\3~I C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 C0 6u=IENDB`eaf/tests/testthat/_snaps/eafplot/SPEA2relativeRichmond.png0000644000176200001440000004634314405730125023477 0ustar liggesusersPNG  IHDRݡ IDATxw@?Y p+.Y:ZU8[wumm9n{V*(PdCvHG4$J>w%ryQQE$|ҿ1UT*Ra% 112''' qHl`}nݺAZ BsΓ'O"w^|YQn:~|mmmwՊgϞǫ>z(""BrĉZjvAAݻw `!@wޥ.>*++ځl6"E\.FRQ(TJUT*E"aRiyy9aA8. IkzHeʕ'Oh$IT`8A kJv`rr={nbَ*qqqZj0Lgƍ,DiVE/|///ú:88חx rMIŮ"TW@7n\6|ngɸqt.3g6nܨwE\B‚$DV* JRpYINfzÉE(>]jP3=>|xuggg1 D.../p׻ $BI(* JJJtW}l၁ZiX,$ Z/lll5S** [`EQQyxQZZJ'7UDP(ɽRF*zY/_[%LA(*JPQ|՘&|ڮb9}5cp#Pb6Mׯ_GF辨]vE Pu5ֻ$U O>in9s-~~~;wlٰaI;;;jxzzU"xInj~^^$!驺ۓ~|}}y>>La!}D}tsƵaJTe1\#L 5}CGZ/_޲eKpOHH [\.U80"Hu?H.UP(B!a%\.'=SKjTQ|omf  D"H$˔x[5J_~% AHv&T1 S X0[cƊ¯J|eUe1ZK(_RI}mn{w8 ` D]]|J؛CǷ${v p g:C@Ň~ofΚ{U.8^\es$00aÆz7K%%,..)o߾9%%EskRR} ŏ?V%#X/BI%>uhȃyZ`U@Ofs!8:"ZHeCm8p:Vw-ǷB<^|8+EUwT*+w92nܸǏDK.. }JddzVZinmӦիW;,XUVbmfŃF yQo{Kl;D:ැ[G{!g/%<~t㯱 vVxÓEy\###IO`,!`nVtcyw  w={œՃNa%Gι!;v1| B?t;};mjlQ* uMR*:gowyoB.JlrLv9 7lÿQxrn@ p9Fް IRIuV͛vMp A%^Oο6{?ߕ\?NwZS"bbO\mopmi7o5xfz_P1 +Xz7K%4XBnUO?rYP7r3.@Oz&o:Ƚg))-I^G IBp ) kKhy%\B]BV^aPP* j;wVKϞ=5jlذܜڷoijcIJzLw,`zC$4"R$!IH(\\BIdٿr״/YhqIȰE$WK@ZlQj*)lNScn@:$ᲶcZ+l[GQsyB˿rxۺ^[p!{[ƶnŚyQ;'>]A!zzmjwW>>X7oB]ѩw '6w ;ΤxxKs$[PCGG5cw}hՇ%! ť Ϝ9s1:PTۓV,|۽S kJR&UTRjbbG5=6BICڲBbٱB,By']?5[*/*t~u8s./^sհC!Zު'\, TwXNNNU jFF,w0a>w U---MOOСeʕ&`uU k*IHz<O $NV,;88c}!e>3ȍPY曼Onܹ)}<ґ%:8, ݱxb3,v5 k].^_>HIn䪐 Qkžgb\Γite r9˵= /Iܱ/NP⒐a \Bc:\BpD{X~A_^jy7lٯGg~Qsi96`l_BSn!rgz9UݤgA%wJ⒐a˲PKȔ0XB:`ePXBIX)0й(%OX8Zrz,p uPVHBcePKHQX9^ɾoIht^V.!HBKB|zn*fA1!qʾYu7iSj2o% Z\KJ)a%dןyd*9?۞ׯr:{vf?!# 9dz,}Yw6 !B$iXYQp ) kŵwppppp͉Yo "$})TIŞA=ke*713~Ӛ%!q':&''kybcc3fWXBB؛WVu Yn~ȶόh3S gs"7/,t5 :/BY& VjjfN8Ѥ4KY@A}j׮]IQEo25ȝBƿC_ +!G JX՗>[BuA?l}XV2`Q:%e^fٲe˖-#%eB[c\ Cυݷuu>,!0zcY\2`Kh ZKR$]wl_r~8 kNZm}ӄXnÖO{;}Vifi,2`XB]`,.V# y]6Ѕ_x(ٛwGxkf"TMǯ=v9%e==Iz@ ՋPٳG&K@XBB$9hDήNv :X|$J .1$I(>sM_hݎw]7BPNk~G."~^οdD_c&kмM߾:8.,[X)$IP_S~{odʲ,霽r&*wp uP )V\ʻ7w!p/}44w-pP_ iwCBx;ڰlGm^IseE( .!}ZK(U !IK[͉+G0WΓv>+, s̒^~sBD-czy7rSB٧7 fnmo-1)B\./_pMW, ?#ꍼOoE{WL4sl p ) k%B;v|! ~C Bx1?qn!:*-?-^͹IvJ>}[FjgrV\.aC@Cwn ݤ_hhS.&)~~bv%e^˪?ήj-Rߩ8(Sa;[:ids%lPⵟxX=;6:Ä;qQi Go\ݝY!ay!mv]l<.ן[N%dX~=m7x[,8]kiKp u1Kj-ȰKꪔnGDS!rYn^cG>R ׿jG~`}߲!OZQq6|LA_Pc4[p[!eQz,TP5QIY0ak58p| ϋ4oB"-ǏÉ'1 dz_V DR>2 qT5 ' ^B_Bլ~FNKK#=|^?J@@zeee_RTgJǖ")"pLZ+v5ٯ3$LL&#Fיʕ y q\<ӓ 4'?T^Ҡ}+ƫ4Rء^󮼸w޻w®K*:~a]x׆={*Q r<*3-ԬYFixynݺ݄aح[bccn=vٷoBlߵk֞ on߾/BD)))-RԤ P k2,??%%%"999JRaN]6f`8}'P>[V-Am9%W' +Y[[XIHy %Qv.*;0oS{UY ?z4gratnZ'dCI^}wA>cNieFﰰ3V~}%WRhG--r">a%D!N~}=^Cۿo [׳+-6w]_Qף~;Mkl}h`_+:~#fF# (7d@_GPTϰg: /Cs{ehG F匣 ŒT8J"8qY\LwhwUusa{YYK{:[색?7K'!Gشmgi6BqP{?M-& k9>( B9hQ_)RG9:wKG㨲Θ=pbKH}⶛ɁM_t@l[w y0UD?z:/U3'KB-n|Q ʱf3wUhB,?]{0Pq)P+J{{{rÂ$IX1Cd d*.lMY?t;}Hljlx:V).Bc %$|8<<\wGIE1iҤ 6hЀ òE(`Q‚$D >aA"+ +Xt8 .!}‚K%HB$!Pp uITu]cE(`Qu HB:`ePKHQX$!$>aA"+ +X.."tRIh@K@$Ih*J­[W&p HB4~E(%dJXp HB:`eG%(,HBK $DV* V%\B]%D PKHQX$!"',HBdf5qf$!IH%\B]@"+ +X{ѻ \B.!-B.!EaA"t΋PKH JBKh0$ M\BcITI(/|@H_쿕M K $DV* ,IM{ITH/7wv=_3.Bapp \BT%ay|ϟoo탅Bi IDATAb!LΒ\BITKH]6-%(08񹫿c̘'XB9Krr!c^<} sݣHl p ) HIϷ[G_Ya͝e4$PU`:/B.!}‚$DV* +)X'yn8`kK=a/"n͗˯ BHvsm9&-.Bapp \BT]B<{y"^ج}Rvigs_ c꜇=d>e\o(Ij$T$ǥt^ԧ=!yEBx~vC`,.0PKT,Xܐwxf)~t&զX"TWʸ\|ߣκ/U2b(ϴ`FJB25"JޞܰbkU*_XU*2ǎ"J9N"*U*.ɉܰc3හwԄ xeħYłN/"Ou.. W|˗/ꐙ) 0Lu_6~1xիWWBP{8]v]p?Ckk׮i߻wO1)yHcգ]/ X2TJzR  #>/ D"}L&Rm/}Q3m}ՌJ%%%< W(G `u78 ݺukҥMSL955{BQXX͛#F0)yTnqwwq\UM^l6MGYΤa|^˫ҋPjQ1!KFtmӢE󏴝kj>}СC SZZJyqOHH5OB2ADTT>w|SNiDDD暔[~~ٳg5[D"~\U(*H$/Y8NzX*.fQQQiiiZ;, 1h==|j}6Uܴ겝j7s4E. #\Bgt 9ϰUx K.x<ҟabһbQqa- &/UEq g6YS~sFfZj&TIIIZw@$'':w j a|2߫={UM{&7hOsOaePXBBQT:kעE./=?7-קn-n^NeM:">`,bqushkh3,BvVqZйӧOZ&Lْ~K8qD[(tEVq;,uy n+) %4 QM!D7b;!k }f7WnzXBZ A,IB;[ppWri5janFS7OrXv,lU~g}Çݫuc $!i!XN.v~Ve?ђXp ;;;Db@oomذax\B‚$DV* a:NѻO# t,I:UW̕,qүŋ7mڤ]sܹ.\ݻKKK;tnYrettIbCw8 Gv5<]oܑ{KMzk:S)5}X%Tg8 3"+'tѭێx"4?>1P: A|άAP!1s az^fM/g# Blyqrү9‚Pd,Ȩ;㨖'.!Ea%DVVXƟ)fDH4,s槅TFGGkaÆiCeÆ *u A$JIhMĺC%;R! %(,J] ®VݼK{m,4g~ZXhPw]+WUKh J Fm\iHl>\Jݨ4w ###5U^!,tEV* +,X ۅ ,-6̻[`[ bE(G>ϸqnܸQ}U??UjN:oCTՕݻ7(( i.!J]Bi<Ύ2Q={ݫwn!N|Ei1ch>ׯJ ѣ'O|E7k6//Oҵkװ0M-@[HT\\v/^GveUOQt'.>.>ƕkO-f,a̙GTyׯgQqӧO8lL4i… 4"xe *Jғo߾sΝOŞ6Do]B*‚KHQXp QMs BH~fWsمZv^VγS;̕,Vj躄0㨥‚K%4X-F}TZYڰv7 %Ƃ.}r',tEV,XW8N̜No"M2Wnz$\b 3R$!(NӒ{nˍ=gvjs Jœ|4mTkn?qRaA"+.sA &o߱'cE( ܹs;(aq(RIh`l]*SN?k?ldӁҎn]BRwBG(Ҏo$K;7&Q!?n9͔>,( 1 } jbbb0  '?}ׯ_X,5zhww-ZKX}@) cx|{k..}$?6WzXP~[VRɓ]v_^O||-rc l?wҥK.D"KXM@( \X;99AbW2iXPM QM,--|p nNk_Lj@玣Z-sOU.7)3H@$$ϷhE:Eْ3XBcqĎΒEEEVJ%! }$a&Mz٢.aJRKX}`,!fGUXB‚$DV* +|}+z}.!XpzXl8,\BqfY3~Tbjo9یk֬Y`fKӦMպO&m޼^zFF;{lLLL߿s3V#آD&{,W,qT 5{Oچh.f7o~T*1 S% ܹs@$tQcǎ*J8 Gٱ[<-)?$7uv$odduLL̨Q4ݻ'Lݻw4iD"qttOOOСzSNEGGO{m\\bXshӧOSRR(X AZ`|莽;f*7``x= x%RK.ZG\.UrB:BK8ZKh`]Y9JGE˹w SA\4cw{[GgWW';{G,>jz4:w%%$eQ t8j1(eN#=iҐ:';sIg O6mUxswlYhGmiȁ呟2&\jqTs -RPaK.a {.?u9us&:nigz\}Ҋ߻dgF:KBlrK$!ip@o.p8jc+u՟ ÆnR/4}q?1;BL $Լ֠qtԨQ!!!! JJJ;N0A}k@YS?---MKKkԨjIJr8)T sIЄ*0h|y_ղ\Y=_Oƍ/K0}>cgǷo~\ٳ  Żwt_D">B0LnDZbѠA D"W_}UY~͛7:~bXP=|bxǞ)x ѹB5mѮKO캉݆%TcKzݬY3GuYKhO>'yzmO;6Ae~BƟ&uBw ?hEc <GuŹ%a. KϝLi6 q2|Tצ 9чIBfIfIi- 4yձN^+vLlP_:KB%IY$G)?7G.F@gIHXBDR^OXP8j$$gx:؞;QLJ$8Տ[PPZ`OZhF<(--M9^mHdR=qz2UHRJ>ó0L.>HS.lOZ:. qLfR4 &3 ? o%d83ߖj8rJGmmmy<ޤITogΜi&SN};s8:u2ׯ:qU?LcxB>fPz VabjΑ%c o'N*XjP3!Cܿ?)))<<\bgg)1_5PuaXNN1ځ竟\5 D"qrr2|D"*P+..vuuUKB"2ܘ*M`xj6*~ՀK"!!cǎ_u7_pA1c߿ʇϙ3',,0{ݲe E.!(E8LXX@ P=i666qΜ9#4ѼJ=<;;[6EIX,:\raPlR>7LfI8* I8ȍD"1#ŋT,:KBF,gff[H!u2bX<é'zQ-5ASUqUA(ʊ-7n0\ DBEOr.KswLFJ ]~T..0.]T*d&.!.1K.!RaGiXB8jG%jϟ?oܸsB`,GLXB‚$D %%j$aݺuΝj< -. ֭.!E3FjvkE( ֭CavbӔcׯ߶m[k. =JU.aS uu ) k䌣SNTyl6ܹs;vطoz+A'N={Ǔ'BkjWt-[>|ʇ=#GT3Vz8Ub֬Y#G4OVV0۷ټyBlYn>W^|s5͖ٳg@ {fKAAT*5)1Pqa) +I[RR"HT*IKŅU(JKK#*%L%.!\B:..G +X4w a,!MŒ+0 HB:@gIc $!RI.!d.GLKHQX$!$>aA"+ +X.."p 逕IBp ) $t',HBd\B\X$ HB:@gI.!}‚$DV* _yI^.."p "n͗˯ BHvsm9&-+R$!IXEe):a}/2_O?);;_޽{q܏/BaEB$ާ~GEk///.kkkҤI LJ{zzjH$r/Bqq1WK(J$SdBWKUayaJ>3JBEJsFڱX|gvNM۷uA&ۻMU~!}}} 3a2yd}4[<==۴iٲvZ>oR!!!-\.Dn@>/ <==IOUIjRUC^ãҝ),#ȎF:&(W<]ݭϦtLՌenxrӂM>}С1uNtcqr\UE$i.O T\* PHzXD"I[VV8a1 @ak;ͽ7;@Y2n\(ϴ`.."p +Oo^ՉEl~]\71K \ͿIۮ!SW37sa\Bc\B.!$ Y$ %IBKHQX$!$>aA"+ +X.."p 逕IBp ) $t',HBd\B\X$ HB:@gI.!}‚$DV* V%\B]%D+R$!IH, %OXJ%! 2I.!EaA"tΒ\BIT2`K K%V& %(,HBYKH JBp  p ?be\B‚$D %! Y$dXPp uKHLKHQX$!$>aA"+@&~$!I@:KBp $!RIȰ...!X$ HB:@gI.!}‚$DVw9{ IDAT* %L%IBp ) $t',HBda \B]%\B.!2I.!EaA"tΒ\BITKK+R$!IH, %OXJ%! K \+$²2qyLLKHQX$a!O.ѱ{#I5֒Β\BITRƆM[9gXf\(3[\?қeB0p 0%,O8{+짝 mhfm0_{%[?b&233(,,hSu^0P+S b􋐖Fz}^TIRB(**2@(~i>;'XmW۶m3OVV)Vao߾5Ͼ}O]vi퓐6//ۚ-P(4)7HRPP JM b T\Xd|ÖD"(3*.B5OTTTZZVA ÞD5.bWQSNug}Y! K%`hrz7n}@? w :XBBQG%qYiQ+,XK.!R $!%(,HBda/]4|?wx,?Ad2W>|>pRxr -Rl3Dap-rjB"888PB,ۓ*aJ瓛\.gٚ )/:?/iݺJIg)ѣ1 Dzϯ^K,y&aq'=,׽{͛GzM68q#F#=,6##c5+X+P` P` P` P` VXHbl6׊Pcl 1aP(b49a1 +//7uzJvvvta Ť ɸ\.`0RH``X$Zcccccc%{ytNߦ~n~!_nJ(Su+# [ٮON_o/4x|ŔVOݭ7jMZmIէaov&2IJ1c=owOVC_U$Ul?@`3ښ=[ E ~BﱍfݐQv.N HD A^fu_L D"Xf0ݽ(V/mrMi-%3l>$#[T?r3R7ƝHU_.Nms괌  dLmIUWOtUXY7 mVI`o^V>X)÷Yc/ec}QѵWחF&=yS [;Rb!QS<՗ͱ߿q|w `"𷇢QeȖۤs& _=Q!H DjXND,1^]덉pYSrrku*7Czij^a a{"$}uzG~^۞"1?,Y#ůg;o/,2vO_tp_uѰ@L/XF k7?`cgoDzaDbz1/tSF6v\=ko LیT S Q|gȶ]E?4>څx㧻NX~b/O/2`r_/=Lo{ob&9>ڽz!ճL O8rNr96|^? 6V BTe?q$;E*KmSKJ*BHrN.M(<4;82`a6m=Лr\d#cƶ!~/b\}bI!_2,3s/>] C 9kD]ۇryi:k~S"_wg!ۡ1BP(=]OvY [jao{jfw_Uk?k(00ӤOdbWSn?_1[AW7jMکmGډ).hɿ ?<.j]C,M}ܽ|?gHU7`o{}`la?%!5(X0(X0(X0(XyonؽsF]^w]5(X9[y^Ĝ#l˪qjЭ0D6E} ,|ݝ;P#Ef(<=U+ŵܰ+ !dey?PvpU-Ol8j@C/ áSOz!/,|1Jj] "l³2pLC@p.+=0ޗ-gJmt #`^8^g슛y @'Bq~iͰaG                               a}2#IENDB`eaf/tests/testthat/_snaps/eafplot-list/0000755000176200001440000000000014405736700017703 5ustar liggesuserseaf/tests/testthat/_snaps/eafplot-list/wrots_point.png0000644000176200001440000007706114405736677023030 0ustar liggesusersPNG  IHDRݡ IDATxw@`H{) \uQW?h:vhպjn Zօd@ dט@ Ɂļ.7޻o}yEP@ Hg  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm  `A ,6@@h  Q@ j4XDm P`bEQ2L`J BAjjPJ5D;v,gQ3{ʕDzzz;pׯGDD+ϝ;2w\7oPP(<ٳׯohh jj@Us8bU˧^xqDW(* |P(lhh` &5tuuLMMb@ @Q 3a(644tUYؠ! (JшmB APOl$|1$O8F~;.5 =`aG|lY(sWxo(mfya {Ox7U+-[6i$ldJd2.\X\\,8뇢hii)׋VVVb]9hStjPH`+**Tϛ7س;,Pu}}N:rcƌTUUݓ0 Bh4bUBW&AmllmP>=%l--- ڔ󄾖&NA4m`iF?b76 疄:iF~{V{p[W ^vY fP#H$D&W-"G/!Ld@t:Wg$_~w;v`Y,l>Cs:=G=*fIIIF>۷###Ï;VXX(,17,^#FGqF^Sor%UYF1!/ viϘNk_f9O=[<TxOt d >Fɭ gXїӷ s7zNjAka7+8w rsssss ڑooʫk2tinVVGW?K(\#BUS╘jCCCw\ٮa oR6 $YeшQ}ɘjÍDx ke|QCʞW,ƍuڍcwIBtߌW46VE/6+.لnoO&SHU2 F 塜Kjժ `YYY/Rnt v @j΃蛺?v8J{'nGl.1ƢߌnZF5 q/0p^㯹;{ZtF E9b566bhii$k@j}|4꿒C۩! Se3~p:g7Xkm+\CQAv%$f,£T*ƍ}aa!Á.!!@XBY`>p۶mwݾ}@ xKHp,!!뛘 2p,a(J4!5넕G}4g .!!@DUG r.e֮]-;;;{yygIIIee% i dNҞjبޟ iuEmP%4h+meeEJ]BB@Ղ<{ Vk@?v2`0:ҁ(ʣ47+"\A&mj §,̄|WިF^+hc~VNS&c6PD ?MbZ:?r}--7ޭcAP]=Um` %$SsMD/G݌ǞJӳ3Fkg+IEWeo1cWy]Nը7II˼s7aïŀ`Ӵ7^g ̺n?qu{KV62 zCl"IJɫn;φ$L&=%$AMJիW%%%D"pe>ȎfGX)B_oW9a$7-,l>rX4xsܜ;АpzB9-,,?$ V: ;WA$lCmY2њneXV\*Z@άZ,nw\շq }HSՋ -Tt! ٭My&/]|D;'jkkXlL%%TZ8j C6X60nx-r9bn Ie@<bBC iO%a[M[~hQBAnVq%9^sW3tD~y,'P=Jhdd$UaF8`PVug5/`c邕m'?Ŭ:'wDJvHi|޲k/Ȅ k>X/iЦ>QY3wZ(*gq_ Tg?~<\WWwɩ+++??|0x4V5^Er\(_~~f4whasY'/y)x~'011lnnۇS[[hѢ &XZZ*veU^x:tȜ/J=Dd]S[g}~vSdQ} 2իgϞasR`9(qy%0JHP5Q|鮴-+Bk<գ555R+GaPu4V@ 9NWۣ;"~~nNfz:F&&zfN'o~cBˈb mDFF:tHeQBBXհ]oڋ|oݹVH$jeEo *>naLPSS(2 pttܼy#<==vQBB竖O,~G_3@D"iXO7S5$H$Y]P7Xudff*v&2vNYG\y2w 숙3u %s Y,VMMMCCeffba2RDO?9rDK|VLȪmOc:a?8:8sޢŋoA}\&ܽBѴ\Bmm7o`eeRKì_t AT+X^FC}ąM `E\2?s5b0cWӛC~x?$ԙfnN7{܃SWjj[fY渂 yL1c`/[ţE wܹ`nٲ`c6h[ NQNOgi/QF3㹑#ޖ._wdСFg_G9u R{5eo4+97<, 8<&9|abQ6_cSkW"㯨? (a75 zt *ԖW]]K5662e @GGֶ~Z$jf eQ}ӧOr^*AxyGX`î'U's&?KK.灤 ЯlSת?޼" fm_vr|(ϖ[PB׾L.szx*tz0qTaڑkGy+~rG1\4dȐj}OsTw}]SLyAa~'2Br*Օ,NmfkYQk5F 2mIm?o޿o9qV}y{: f~[^ڝ؎.1yDepKc %üdniZ[Z^WL͍I@"\h?X?{Xq%qi^nnn>n=;y5={g ^h^HTKXPP-(J}ײ#s񈈈~)q0JHZ8o/SC=NC+dV]gj Zy{d{At; XqbE'.K( {vJ"r ebcceeee_};t AcUñRt˪͂|͕򴈚L&kkk ݷ~k.=]]] kETM=_|` \^5ԜggEH+g wޭD<x l \-`_+f+**tttlP,WUU6ؙVE񚛛 lP$X,bdm"A.-hoB! VUU`EEESS >]4J҈J`oyA[[j8iQG4770}1cƠ(*y?#ĄB$RMdOW[[ܝ1WZ||(j :SSט7oOUp)ОNfMx}=DЙq%MBbA/_!CCC=z$Ⲳ:\|󞩆xL+PL},|AR)h,JT}W +_A5JX%9"?➇)zznܸ?ֈ+Wbt:{xx`~r{ ܹSX0JH$'Ǝ11_a7;e+F}5kWKϚqߞþ ~pq.cyK5d;ժ;A&>,Uz %?[f;vaÆ:D&BQ}ܹ8UKPl"*VBqTZIFRxu/]H~7F9@Ъ c|㘌ZQ^4PA;|3'F*RH2</;;},--kkk |VV?L633j N?Z|;_#i0wgԶmêhVWTq]=ƙU ˇW^FߨÒ9'VB$ibee655mmaVk(Z"DW;|FEDz?KM:z?=9=WB HJj,(f6k^f46ͰҘY3W gᕗzlw _6WG+b@,Fƫ5oV݇tW5xCb+ѱiO5ZslTc@_O6j%Z0rFe+3BN[[~L^DJs \nfff`cc ;^~}ttttt-[222:|k]BB@ʖA?n X)L%f-\2 yS5we8CAtaHRKhbbR__С6w177J8HvyUy./#|,Lh<0ʜ>xjuf}:36goi?uo2 ѫ/6$4ɋafbj8d.;o43t x_/R\Jk OaګCC..appCTdX+)) KR$Hn.!!iRPPmjjj[%_AgddeaN*:.{Wuz']F:3/:3ŀ`Ӵ7^g ̺E O+XYpvh{bS0M TʬL^utٗXy_&G3{F :yK8%pʦq~ѱ2dȥKcRi)0qzj,Sr v..հK~ĄtC)W^8nv5"vpfI{Ӣ⪻o4:3.Ϲ9w!x~մyA5溜-x\j.l^?]ڟ`U7s\ ?QmY3G>~Q$":{ W"*eee~~~W^4h&333 hnVx<B?~|` %!O%T(wʕBE۩ ֙!8vCzaPz_Ӝe;o-goW,hVc @-ml#Lw-+n*7XBgȑcƌjnn뛘U\\ Mњ7oޝ;wfVHxVX2њneXV\*[:jճw sQWne475?2DtIں(!R^fܹNr) NNNBd2y޼y ]ƍ~0JHZ2{aufIhO1+w0ɝ%Q'}7lut 2a{š.˞ϲ{HwZGYreEE灂nB^^ݻ٣+loVTT؈}|ӧO### |;wDDt͖{=N"Ҋ,--CCCr&nP=ɉ༏*tXr%o/XMOOB444`L&5f?عs'QKK+33A,J7<|E `oǔG tjf:::~B 11_ .##زp„ Ag 7o^zuܸq(bzNLpPL7fﰔKH"<<<|||Y,J*{Q竖,'{e^]]ݙ1ϝF AcU2R"|`#011AQTHF }||6lؠKYM&m3pHlΪ$휲Q'~eDD"'%%[Y,DB t tmTlP3 T-H\WZCȪm$XfUuB t 塺Khaa! ,YnŢZZZDMM]BB<ՂԘ+ĭvZ(ܛ- wjNqp (h-edC5b0cWӛC~x?$ԙfnN7{܃SWjj TfPS8Vs(z=___Q__O&`zj&)gFt:Wg$_kn:6%v%2z㎊(<q ]\\"(FDD߿b\nCC!>Kp]bz455xxxHn߱j cHz6:^8vJ a OTΙLNK.$e؅ؠׯUfEUW.7bR *BPĵ/Sxg|_wR%QBy ijjb2_5fhAחᵱIK<?~wW#z2%66rtzccֆHY,ܓ` s7z3COM X0ftzi>xNO'!\^ l4G܎R_(4 O}f47+#VBp0J(t:Op744455ETUUzꥧ} ,Zl(X,VHe=I5J5}<S=N8RHPԎ3Vkv': @kѓz~~lmawN$1=]d=P28̛ H斦X..B`jnLF_ו?3eŊSLaPDK.\ CCC dX,~!.T8JրlmH?]ܵP/ yh~h *.~w 'x\;6^>wd;cHNRHX/Kk\iP\=RVx-âjVaɒ%$%%ٳGj_|{]ӧOKJJ|> cƌ|zJ%DV ~ZrhzI{DфBKTTvRX|Qt U 49竖K(>'… ;ߠKVZZ$?4V5K(,DtY'ꫭ[qs{ΟEꡮ/%P3EKMs̙cǎI%?H$X\WWwڵrGG^zݻw޽{NbUEW-53XD}cee%uKuMMMQ-++~qVVVPPɓ'#"""""e_KK(ƍ%TY__.///222;;fĈ֭v4U5 k믿$RӦM~g4WU'x,`\p#BaKKKaaasssKKKQQFovѢEqqqؚׯO2%##ߧϞ=ּxyyymذA)9&99 ~666655]t)[h4ĄFI5rU,P[[Kluuu_&Blii'A ABp&Il ;wnAAA5Z|yeeett4|Ŗ=zdR3̨w~G|>֭[bxĈR|Xi{TUUYXX8WnnR[UUeiiIXU-}NJ+++I0?8jgg`9sayUWW㮙VXX@ hhhJMMMOO9rDNܐy ShlL3U(jf"qp(ʌ3&L`hh Ը&%%^z„ Հ'$Je9竖nH=y$6*/\.L&֭[ɗ(!!hj%F ߂ ȃ=z>|޽{%2죭mZZZcc#^*$!!aRx!hjb%TV׍%8q)SFiaa!9/!NgXmmm*H'G &Z>jf%tpp߿DВt:^]]}۷,_~i3'BfZc#T ]B)`%0(zW^Ime"7X===E >|8n8lYceF P3e3Gݽ{wLL̓'Oo͛qqql wL7&Z>jfg3gLɊWDbҥK5$iʕ>|X{{~E F F np Gm633 .l}H$RBBX,s8pR oqX,Dظ*٭m|r0qjf{H$njjj37tppZ3lF AcU(jf% T*A8Wڳfjnn>wK(t %is *GikkceHo޼>wPWWN>=MLH3UG VwT*U6TGGJSlT*5%%Y>jAKحtKQTE<A[[f7442ǽ$ijJf뽸 cYPh/^iii盽#!WnTM=_|`uK(ݵB_-9M4L,\?ow%T!Z8G%$uw Xw0ddd`SVVVnݺu>>>`(N?|x(Zc %V%tss*~ɝ;w㏒CollYPPP]]1(@ Xynf:GZ>jf%177 IJJpdeA0EPJKKccc|QΠΑf.%|9f===ٺ}wO=<<ÇZ[[s8ƪ&A.,)P$IƬ",XrMMM۷d2y!Aтʰ l6X,޹sgdd*W=UD"UEW-qY͂wM܎lvt@ ŋPE-#bcc044bs666cƌٵkUBEUcOLpKHK؜uxu1/[}ۮ}uM?:*zv];tK./{r4|ڴiǏ/--U Um``pG-#DnJ.3puQcYYQXS۬d/}%<$ O}b666'O:thKK˗/Ui_ գGҒCϏ{-T c9kۅmWk_LUk;|ČïE˜tCK;}ĺł~%lCCC;BXYY`xF%''Y[[r=D|KH%Ey$d޼y3SHCT%$8Pv MnF- H61c4E{Eܬ⠅KY!s g #lY ]B}}}fjjڧO=="<}޽P[[;###..+)NBP5! z}g6o f!?ȸq/F9)dO|^.׊@\p'ôCA\AKK_[[bsW\YfMAA[[[A222;ynnn޿?^M9.!!KNPM'⯏OEwg 9.emrn??3p{wH`o0ᬓ{!!!O>YeeeAA ^```vZmmm>?2̱cw4S5 6J6:㐩kZѢ vu:"fv?Y~IY"%7n(9s8q͝}||̲_UZXX|;v|嗾F?~gP3(zjá }_Yn\tiפoQ<`6h˗/quuurrJNNy󦿿?N6H`;sZ>\.ށƪ=\5銞`{u}B fOKE+=al%2*pYI룩+0J߻K&/_LJJ ݄Y(}}j`>s|'H3sT]BY:d$?~4vX!Gx֝K-aDVViZ(iwP:~C1XXX5jkk>W{I(&%A;ǿaؚK5}w(M_{*|Q׌w2"HZ}F/?Sx (/^$&&9rȑ#)))x⨗iUUUD"۷uuu;p P 0J(E;G7j>Ot3=) 3͟O?Z"ALX`ZCOp ۸q#ۻ޾}޽{JmmmWPP^{U?yDrM@@@hh(`p#GH<,X+>>u9t Y"ӆ}ux,9j´YVfE,XdܲIa+Vdggce0[VWW',a~Ҫ/_|U5bX5556*:rHWWWc_xљsB+^sJONn+XWz~36UF(idd!gΜ0`GWWT*}500mYㆡ={ٳMl6977W HKK``Pn*}F|38S[Cڤ'Rׯ<++K H}bI{oooRH IDAT冉.!!@PQ]vdRQ; X|y>}/^x߾}RPxzzX?~_ORd1c %JCTA3U˧NBZ= \.EQlReBlr&da ؚ>}2fliӦEGGڵkĉcǎf {l@6ݙ1g3 r8=QW! O\.!Ox{ X\EtֳÓ|Wi_]bbNRRRjkkE"rFFF|>[r₂ӧO:uի .`8ɝlmmI$RAAJ-[Fn۶- @ ȞKGGG__@"Ҳ}݇ B*淡B!A, r\CC򄷷`ee%$tiCqt]6ib\V\YQQqyb(6]^^`06mhhhؿѣG)$INN.++܄*ooxϊQAMUϟ?rrr",8j6kNOIPPPPPaQkTXqT lz#Fk/r$D33UK+8*Kw,,8\2%ͦRg&bo1<==>|(;}rŝlA3U˧ UM}FxiX䪿(p8ӦMsN[d[mm컪H>/sy_> Z! P-- ~PG*qM|||Lfzz{Ǐ?iΝK5D*,,trrrrrZ~sDZ>%$ڙ=OJgOٓ]TGfD"QeeeRRѣ:t(;;}9s&o-g%$% !=CC*K?}yX_uBQh4ڣG>NiUj8 Bɓ'.[WW>s͛7c;Hsݝ喕eddt$Bt~PB۷4X%$Qi!熳N^RI(/440?}_ӧ{LL D1bDD"^ťd޺u+<R Yk_qBp %MSܼtZZZZZZX]BY+K-b[ͨKI7w` 斒}x}c'OW"UQ=vX_???f%l`l˗8NYYYQQVAA%޵z~5X0aʪ*t eQ3,Zbq8d5pcbQQQJ\dOP-^RkY3<۷`5JϟcS(oX,fXCmllij8έ[I$҃ oXiiiXQmŽ.a7s%luKW ׯ_FYZɗP;6Ϲs666BѣG rww/++{Ecccuuu/X՟~SXBՁc eQZd2-nݺdŋO:"[CMLL|iPPDսxONN? ^K(>ȊmrA>T744tuuw6zzzx], W kof,v cɒ>1HӧOD"c@@^jj˗8%T>f~V%KTVVBD,(H W8==$飏>ޛ̬ر;vYZZb,xbOOO###l %0T7oS#&vjK%S:$88 [x+++A,B '''6R={EpVPPYjjjMM P^y 53Xdgȑx>|7oH{>RVVfwB8pAA(Jcc#PȑZk.;DZR䨨JvZ{sX%%%@)‘#GΞ=ҥKj{ ]n@ Z'3$$$HUR999_ c?suu5nU/Zh4&ʢfK*GzzzUU18&&fذaR---oooevww*Xr% ..ܹsϞ=*+}H/? Žc 53XbxxxTTTkoby{{۶m:Af@vvWlll"<+1L߿'CjqK 4pmtҖ-[ڛzf޽'DR>Qzw^ Є{- t eQ3.j@KKKkkӧO%TKammÂ2LdS"z]]]d2HY7AɊ pΟ??S< 鍢(~}}}yzsO8t i.,^zdoor?.4h- K#`Zӥfgg;99EEEu{:c oKLLQGGm3go]9ܹͭsEKL&S(_矇{Fʕ+t@eHe(氞칄]jmß}Y Î; {d2\.r a "!!8p [K*k׮1QFOݻG dɰÇ #""^>|8޼yszz~߾ ... 6 PpD OjPaQG %y Errd2 jh4<֫uVffKllwMMMEET*HHH(**h@VV֚5kliBs IbiKmjL7vXV/9s44492c ”ܹSTTti///vƍP[@Е .!)_s L&0 ÔJ3͆?F$\.WReF2o޼l۶M+J%Kbh`xxP(,--D...0m04778. IZ[[%ٳg=F3l 544?bznw8,f~j|uXl6}?+~&NC-=r jr[h4Z-Ųq -R455U LKfddXEѢ`8t߿( q :jFqvv&K2F3 0|롮Yt$@侒e;=6W)[o5s̾nEɓ'o?qM&Ӟ={1 ;qĹsF1Ohē믿^TTK)dW =Q '#޽{eT*O:eoI OjPaў3frE%NĈbZ'M_tLhFFRM8J hz[Q=zD"nJl4W 츸8bW]],V 8FܹsCCC˗z>%%id(q5(A]T}޽#G2l0`N{AAABCl߾… K.577o޼.Fʤ|^/,,TT:n8S()qQ[Ѯ xb~~>\ob|$nڴ|ClD"+WiJpe8 6777K.5?&77Vg ƍ|O|||pp\.6lX/U! V$F2A!aU?xX9=4 >d 6DFFZ3d??ggg 'Q}ܹsDGG?~dr8SN1XTP(\{2 kqMGQHh vQL&Ά0sթpKmmZX,ϟ>}:uҥ겲2:>k,3gN.ؘb B===-BVn[455 BhnWWWKI-C=HW]__/U^%KZZoРF#b={dffڶ<|{~Tr K Ub Ç~ ]bEqqJZx_~rׯ_oqoqq^uuueǴر(h2rofffm9]\# b'-hkksvv&i-pꔔ[@1BBrUGDD痖9[lo꬞5|pQUUU^^`0,j- 6*J\.xyyUVVT[[FbHR 5HW]SS#JU_D(P(i4Vjllۃ~7x#99pgϞ;wN$9;;H$XGa4RAjAxPZkQB^RZ- l6{ԨQ ?Cbb@5ND&Mzh)--dF XU=`r&HF>l)E"с`<0^F;:22X^ќ9s&=====d2z&'^{z8,JhUuPPoKKRS:m!YgΜi%8j 8` mDL1cFG FQ.eff0I8p#)@-(q1($tꠠ 1vhjd2Y3Lwwwwww cR!ɸ\b}@d6Y,ŤsݻϩniiIOO߷o_GwG!-PH`t:}"B]]`8zԩS۟%SUIIInnnccdz.]`0l8,TOj-&EWUU!]SV+++mn/($l o/Z 'Nruuݽ{7*?mVVVN8# B>Q}WotzRR 'O>j&x!C8q",,x֖>b ĵFb W=eBa%--eb8???##Ν;R(&!ɚ;*(r(BWMM`uNE͛:V.+**Vmۈ-vi`6d@hLFJS\\'iV9($tpXyЯ^Xpŷir@cx}7N2m[ձ5QTRuVF֏D"qssd>2dqpUmKz?$Ċ]R|v׻+Rܪն47,YP R)}Y3`WW׬s)JLBC!$|:Uۦ aҷGJi%9ő/hYqײ CRB5\O$ݛ3gΜ9s֭[g„ SNh4 %Ye 3Ν̴}LXXĉM&z\.700ի:.##cL&A([ 8ppر3Bâ/*ÇSsF,`GI&8@߿ b1(IDAT{23((\//_v؞1)6+;?\NyG vݞsX+qýyvWEAmP[[+`Q^^ggg+5kG3ҥK)//ʚݻwy<YZ%*..&tjǡs 1Z6й_`4ҬYfҤI kƍ7o$&?𵿿o_ڂRC@ J#G޼yx;`;K9{ait/r+~N )v@|֪UƗ~{׮]c2L&S*ↆRRP(  >>^"tTF.,,4/?m'ZN;,oN`Z683jy?vR{BRBuS(/^x1@.Ĝjvx+ʋ/:;;0` ®1W>쳮D!a{zao! bMY^oS;/4JHi4ѣq8],[,TdeeFɤP(***X,fYiZbMJ\kr 4J9 8&0`[nseKLk@!!%Tw&ˇ*++נUՄ' JuuF w^^^ 1{$ZqﰘY31"D&1MjEUafFۿ7PQpqƍSN tkVQQV$ CBBnݺUXX 4W_}y1 /++S"(::Ɖ&M:@> ߮ZСCu}}}llɓ'nӫ}Q"iQb+WVWWٳPV,Y|>~o߾j*oo_~3骫oݺ`0sȐ!Ll$&&Ϋ7B]v|dt|Z%ƌ6M%QHH ՝G"Vq??u͞=&S(999AAA6>f2닊\\\/TT^^2NoIJJzF0EYCBTq/Pb Pu֎ƽ{º|^ZϞ=[^^ruu4M~~LeU*՝;w D"aFP(tuuϯvqqI7|&''߽{Hp8SL!%:_-LjThoE^OM7RBu#&9p@By<yᮏ>|/)))6lho6..ZTWUUl___oo &p8:Jbݾ}΢]k{qâw7($JypDڈN+x T*]xB ͈D"⬥KOdATT\.{nqqqaa!  n޼AՊ))))))=BBB§DСC׮+++U\U?BѺ {9XUUw]@hh(L&S&Xqm8a1^_mg(P0A(&&&o۷owE7}}}}}}JeZZZqqZ}6Fsrrrrr0%((f]uphVVV``]8aZZ]ftoPg0N:eȮ'D&MhZdjsrrnܸprrH$mmmW\xĵp"III˖-& К+v^2}t ݪjٹiѣv;a$B뽼F#)/H7h4kjjH4d2+**H4FAHT]]MdBy m0,^TVVN<9&&+rp7.˫!--qIӣݻ1 c0J.mCpɴk׮WxФ$jΝӧOqn~{5QXwSF:_W)N2^0±%<|dhhiiYr%qp\E[[ .0& be`477| p\DH1 %qիM6fTPPoP~Š x0\#555zUVq\@FCkfgg|[]!!!>ŋzWT|>78jȾaМ$1.v]5a08"|`& 8ZyHHJSR G!!i`g쀀xҥK_yXmp܀lEEJR(*JөjXL1 !cl2jԨ}۷oСYoń'=yO24JH :55.oÍϟoH$;v>|8Á:od2Yx۪tH$Z|ͷ_pZۺuG͛7'''wQBnfŜ`S%YՃJG($$G8}KKKHHh⭓Ӳe^5,EquuuGɉ8p8ӧOq?ptX3pʂSptEVװ6C:KJ9+:xܡQcG7 ~>h"P"8B!!)8^uiii[[[Mq\???ZpB"sR.ݻ;wvG -d _GfkxEѦL Mi2GK-zq'T*cp}}Υ7+j+9fpoY DoR֭[QQ-h۷Z>l"BNwK?ހ+ .{w>(m߾v m;Rp줒Rif0Z  äRi`` qpO~9e2T OIG诬 r}Zڳgώ;붶6BAn`.  RE5,@Y{.]hZ*Z|7oLݱc^>onK$r?=%%8QTTԭe2_=|׿eNi&BA{2:}6lxH\oeK$=M$ Bt:8[FGnNmw6 o-X&=nehjٔj2,R(͉?~]{{.!)PZV4=ǀ?WpD9L @!!)P]3 bANg4Or()(J;O?%Ѿtmf򙭺vpsZa_П*8"@- < 3`A tzg2U(Zg\z$%N@q 'Ed^of!=筵܉ P҂TSmT@dEqM3oP`0땓yDR }%TjrZv q;2bK՛C0{ dA %tPTEWm ;,J ($$V5 -@!_DT%Tk3 I&6{rqqO<)--S1 k=|AL"ˠZp8t:,F& ahPq82h20 srr" N7%ŠFaXt)kݟpFm^߿KekѣGlBqƑkpeee$$1q\whrp]:i{/UeHh*/.3fm+{&r'wi`l&V-.gg7^YBԿ:W-VX3(4NA4XBH߅c1gsA@4ѩjx#XoRtF݌{gԿ.ڷaajld{ɯ*ҿvJzk+^$/kkH⒗>qIggGKYjϤ<\Rce3uK}uB'!Rf+ < nI}+j;=E4G>'8?ץ>VݗiĚÇ1X[tBM]nmUY=2<<<<<iI9Waq%/`> ץվL}Vs|R:d2Xl';r2zwAҤˏg%v0cg`.5y}?끺S\xq{P &₇Atg(OA4&Aڸ>R WlKEWm&1Tfgk36Ns2]S|XNuj^%Ĕ^ ^|B#kW&i7(18SϹ=t7+{ XKvxAwn9+7*~0dm1~+NVź}~qmymBP5YV볏dLqW;@ Xh^ɃHܦl~3M1 +] p445Wf$Ea[%Ae@OX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2 @ (rX2WN[/VIENDB`eaf/tests/testthat/_snaps/eafplot-list/ALG-50.png0000644000176200001440000005203414405736700021242 0ustar liggesusersPNG  IHDRݡ IDATxw@ǟL$ C!FEZjѪmZ[j[n몳@Y KLHB#R $p!/W0` P tX 0 ``2@d &,LX 0 ``2@d &,LX 0 ``2@d &,LX 0 ``2@d &,LX 0 ``2@d &,LX 0 ``2@d &,LX 0 ``2Ѝ)$BTEwaP( y`&ڳrrl~~zTaqV{x/jn֮÷\f=,*YnL󗬸dPW]( .CCwFܢG˜08n{~ ]fSST!fjSP(T* JFQ(( :n'THBR'MDo B;r.B3z(.MR]b{M>y!CyBɗ.]Zv-Bbi6*ǏƦoD"hVVVL*jX,6Bjjj2“ HD9`DJo S9)l`ڹD_#37@j >ɓ'G0B\.*FP4t*AJA˗͚ydZ{yxKh*$}=m`/-]%U䧧.w4Ҙs܌aXK d2d2 +Jt:YBXlmmMt,H$rtt$TœT4PN1B8t`a͛SϮK.1cFOaǎBP lJ[4Pd2*UUU ^9>>AAA`  =zݺy<Ç;iw9q3:=|CB1渷jE>:>cﯯ{|QE=ߞԥ5w|s"5_pWg*2u*ZՅFVU# %s=<B$UƫJYe?c=*i^CF A`O8qĉr,! Kvڟ~ܹsG󺼼_~m.\=zt?saa#g\^:Jc3q.3No@ E?Qn42&ʯw]tv\aQґ!ve oxQ\ycR}&˔7VJ0P NQ\'/M ā Ɲ]g쀥Ԉ5H88s/kzyy566rPUUz^,t@fuZӸ vwDQX, BQ(Tkkk ǒ _zvGރ|4_-?UW^ܴ3jr]5 =xKĚחNP}tOKv6PPCgGB恣 C?͇Mcye;g\7/ !=UфI?^^^G:q9S?H= !htbڗ)!uMeXU}4S="z.%~Ω90?ޢ=x ,!BH.\B\B#Hn>0f\?M}ƿpe]:Sz}4(1уo_~+"?_?X-y糽ʀ)r ņ#Yh`."+QGPB7~ļ;8\a(^`(*kZ0!cN?K:bR*O^ }ݽn; ~/&.ԺDޑSvP{K=rP (E})dGf}&g|ٲe3gh5Hа(`gX%[1t_Ubis}s5-!Bx,Ū`Kh;R2RΜ z){}YBm@/fS8*Ŕi94߇ڀ,!^>d*4fY99Ǝrvls?=_"YBUQqP^0ڱۯ=-/kn-2O~b[x1E(SZCsÃl%jGݿN5`R^9lro 0hI}'jCǯ E(`.!^`.TGNHgܖjw/\'N|-;J =߾n\Kh;E=-gBV\XIe2(HūCVLKg ,TmL۳Gni"4FfzN1 RnQQ>leߜh?Wgj0~.c֞|@!w/ƽMC!U/*W!͈rf;{L(*lb`gK.9pq7.nKO?7́8ת7x,!.Ij wxمB\  ojBP̘sGΥU(7uJ&: f Ϝ9bŊS K2g JKKq풛O*{0M66!iO\r'WF^3j Bf.Tk8: 6~}C7׎,ÇW\9sLG p8z2Jv6Ykwﻷ};+hgk[  T j~5O`hׁ\.WgwWN[F'gO>4ihNS^25CYB,!. Kh-z՞M#0\.7+["Lg*֠TXQb(Khcc,!. KHj 2ӳj-aÄ_k.ZûXLaE(BNE(pPXJJK` e ?裄XB%d CZKHN Kh@ e )ƍmmm,Ū`2РQmQz(T0r%PK,Ū%%ܺu_ ` -V,>^|,!.Z XB}0%hT*Kh*` ,Ū%ZB;;ܪ*M` *$& h O!K KHN`@KߣG- ʪ o,!^F XB}0Q77֡F9;;,! UHb -7K:8 u| % d IP ţGN:fZx1eN*` k׮mb577?|P,!~P,>r86<===== ;8 ,!^P,>k*ΰ,!^F XB}0% 2 xKHBXB X2,%%-!  % XN8vبv;vLRdnիg}bZeee% %RAQQB\NDII@ H$JTz%d2YAA%%%|>h 1T;FhbYlYUUÇ r4HaX <2eA$B|>dɪ'U]]rdUTTxxxg@ VQ]d͟?ݺuDEg (^ Kh*` YB\.Jo޼:WyoGː%ċdI`E( 6vؖ ð}M6:{lwDll9%,!B`i`oo?h ú,! U+2LP(dX% XB%,!Bh׮]@k`X ͛%ċ(sRKZO:M[[۱ch4XB%$ I,,BZ}!b\]]WGGIPB8++ׯ+KQbSH@лO%}V ELd25C*tX,Rkjjrpp z(H$rtt$TœT4PJYBM fܼ_h6^~Hk2nѩS~SNvZ4MVc֕K$T!%4RdgcBJYUpPwkРA6mڷo_wTR)F#%aD"[[[{XPa"G=,eڏ(+eh]% d Ib1YBbE(^{6ܬjkk/` IBKh9ѫ==#2<"⢢N8z#CZ ΀% XBձ+^$ޗ ʛz!K7Fkkkɓ4$TK;|榣VƈouN|-^ziΜ9m62^zUVVy ,!^F%YМBǽg iž"z6`6,xKHB~kӮpS P{WUUz;XB%$XBZ D{` 5%%%/^lW^AAAO>l/fcIR-a %ݻ7;vlmmmF*ꚚG IDATЀ,! U,X~`vΝ)Jtt4˭rJII XB%$XBBKѣDZc f}bb1c\\\JKKE"XB\2'@KaڴinnnER߿/Hl̚qTy,aknݺgϞcbbow- )--~AT,>jx7RΝ;;|ӳo߾ XBY3 I,!,Uo"## Č=ͻNNNNNN=|xzzX (/1kQK䴄 cƍ |>!!!D$  %rZBЈ#?>k֬o 9rd\\{AD[/fc֌Pi uӺ⨟_MMD"0̰0x1f@NKB~~Ν;A%IKK3l',!IXBD%-CZKӧK,Zol30<<<((}/fc֌BK5`5eas8A}"l ή8Μ9LddsFF % Gb6f8*䶄݋?R{Dޚik $ٳg;wի-[:,/3dȐں:%B!%T>yX6ű>/K{jArKZxqTTԏ?ز2 O>t:ڵkK1kQ!%=&Ba޻@gHn B4-%%o٢ B7n˭.XBY3 -!=OL : Q{L_doi-!BN[[[(rww=|7` APm gG _BQlq  -a [nݻw/hppp~BaYYYwl̚qTm ~X2_3}^|~Mo [7o^bbD"QqJ%%%\o9x1fr[BuOһ_)%CD,M6/^A켼< ^}.*c;ъ[_Oe<1X%yWWXqNN ӓK1kQ!%@s9dλS\ZWS{{nBPƍ :mٻwo JJJK1kQ!%/Yi)w>9q$BǏՎcǎT*LVRRD t8_p8OqT*#wi?7*c }a߯>(u7,J׎7|sƌ*/B@ qtx"(++ !~zkjj;vULWV𾨪R(D߱rRIaeeeDKT* wL+NJ*//J㤤(XPʹ7\*0k3^$0jv˗WUU:ty>L6"%%EG,8[.00k4azRYx&$Z!2ptڴiiii4ٳW^zɂ,! F,aK+f'ڑ\ e [h8:i$ o>]\\T*ތ d b6;`BQi8 B444*Pq/f3)e ɃI[BPDD0Z[{:ޣGB\ -\x̙3v{ l̚qTHb M,`QQy!CM0?vbC gl̚qTꃩ[B ,+77յA^ #""!TTTԕ?XBP!`!deeoؑb?}ҥKZ$x1fXBNu [sbzxx$''%2nܸNw2dHPPPII͛7y<^ %-ꀀ^[ew ֿLx1fXB X%l J[hт tO$ifyx1f`N?sӦMW^}([[ۻw^z1 %y77^w3;;#G߿[` b6f8*$%$mYp.';;x1f`Pf?~\w㐐BqU %s-͛7uuu:9::feeig%ċ٘5㨐X2,aNJuttzر=ͽuV߾}u4&%X` 'O9r6 ;::Z(^|Ho9݀%X B"5} 7o^zzß={R3f MKK[Q` -V$ fY99Ǝrvls?=_[lYL>}۶miiiaaa:*k4mNNNX,67b1=`c_{Z^pk[e02su8fnժUYYY|MLLf-G)JttÃΜ9s}bU,6M]!=-2Dmտ~zz_d ϟaXYZuvvNLL4iRhhgϴb1q{[OGFV\XIe2(HūCVL mu떯)S>|z{L&3$$֭[Y` -Vb,!#nMtI]F_yCї9`h ې?fff1e{s i4ڰarss 2q,ŪX%D4Wg^|rs̆sY'dƬ:qzQ(xe `7o2ؖ m.!Jݻw}}}nnngG%XXB 8:N% YƯ/e[b799%|(/X]] G-Vb,!Bgta96΁f~p8o,a+|}}B2 UUUnΔCb1;Ek/T*LPvÄ-K؞sMয়~{MMMO>C ,Ūâ[s=B8tWVhHX,CCd2d2IP( XTvwss .--UA,[[[S555988=K$WT4uC1&ȸy3#'Ql8щָ|򪪪CpfaO< ݬ"55UPaCϟnݺ@"nj 1,]fՋF0+5` ђ%LOO [tiuu&L`iii]bUHb G=,eڏ(k5d 2p444 ԲN0#FDEE wd -V$YB+s 2fΝgΜ˗/׽Fٳ \nvvKt҂b1YQ:'2<<ydzzT*MUUUss3w\&}Ǟ={F\./++#Zð2%JeiiiW'%%i>iD@ހ!˖-9sOپ}g}YMMMzz#G>}jBxEJZ;[4:d {. o߾4quurvv.,,,..n|YfP!)qN*d RׯW*~m JKKsN3,Ū`%T>;jdz{taW/, KN*E{pZ%ԆnKJ:sss5܋51b\.i92XBU0KJ~Q>6T_81N6PZք޻wO.Ϟ=;++K[3cggwfbaNUCk7jSK؆2DG ;vl\\\EEō7rssZ I,qJ$#D\eCU)y:7WcpbWkJ4j !Xlee+=ɓ'iii/ݸqDPDFF=SZ 0Hܫ5;mKРoe1{LoQmMf͜T,&KJ?L!uV>SL&)쫂E( ~5}QffiӴ=qT*588xĈ'33A,! UHb 8](Е_P00@>}* CBBt~.%$ I,"De9yGs__YA`68u""""""B"_~l6޽{޾o߾)))EEE >>>!!!x4`KsR,6şyff =jԨQFVTTb+XBX%4(` a13goRRR>|`} I5-JKKbcc~` IBKhb=,j,a{4Y7GDDtڧ ӧRLOOɬd XBmjߞ={}z+Jݻş$T!%4Gai_^FV/^_~gϾzjA=!!A ܹsG`( UXBmBRoܸ1k֬SN1">>]\\BCCB۷?~h66ʜTHb M졻-5d2&ITj؛!bںM?ٳ:Jk{{{?y$77ӧL&388}gNH$2€QX>d a,wǍy8|}n`kk痛P__8%$ XB}Ke ;~׳ۼp 4|pV^^(sR!%4YBm9K}UV\V߽{WR2'PsNwwQF}wr W^` ɦBKhb jy :SLٻwoYYن p4 %ԆZ1b <ز9((h„ =zx[;%1kQ!%4YBmhCsss?khaaa2ݻzb6;㨐$KpES^/ld111AAA Aݼy$ 51kQK o^ێ7n֪j̓nJ"B(VVV*\^^0z9BP&}lRcƌQT۷o5j͛5oim]pA(*--%RSSHDw/ryӪ 9rdJBt;;nP(u8_(J+++B%t:JUL& ,;&Jlv6mdccaXaaaIIIDD B(%%F&?q]RDSx<wL"8;;*AB]lL\X2 VZZK/xx///ͷ x.@y,6)Kݳg6mtI&;w.--ɓ'f3 d 0,! Arr󳳳?[0qT K%Ԇe qA###5U*r]v9::~mǛM8*%ڰLK o0 222==0 Z ̛Y3 I,`.6L}.ak .alllllR,..JMMutt4hK/4l06 /= X` aPt:=((B<~~;~~ZZZ`0jkkl6BH&jP аX0]={򪬬|//STkkgϞY[[[YY>}W^ILL .T5,&j,aX溺 Ê<<<;w=zt޽rwݺukE X` P(+++///d?;w֭[U*Uaaݻׯ_߫WÇ۷2jWKhXL,`%XBTX,VXX[EEE^^^ZM2E"ܺukǎr\"!x<` kڰ䁣z% HNNm#bŊǏxjMBM4)::zȑsνwn $,6⥍R ɩ}N(IDATaNNgTTT1BѬb?8w\YYYyyyrrrmmK4oO˗/, 2pS<8B` ,6D%44444<77 XhQ:u*ɔ>|ɣGbcc5o)>}><""k1,$& K EGfflgϞ>~ão߾]r_{5PyyyX`Aaaaaa׮]3f 0 ;}t||LP,!IK xFx ;TYzX,>zhU f ` ,6BR}|||||\]]5Kx{{ue1*GGl n߾]\\쿶vڴi! l5k4,!IK xk<<<<<}://ϰsI_0`j +WL\g{D\_eKHrOOOwwdggڲX,___.8:Tb,asr_e_#OԮڶWIz;[G"%XB?G|||$T*mll RJZYYo r,!q{[(CQ,dPW]8?%d jR(, bqeeeSSZ)++c0,G]y%4E9a?*q:}G F@`Kh* ήƩR,// I-,,wsscnnn(d23c9Vp)Q\lFH(kK x!N:(*++ MM `ܕNߍ0[7r𳁡\RPz&/$ኧP` BNK h|WWזBRT H$JԤYD )JݣT*UW J$<# kHvwﷁi=~ُ3&` /䷄Q&z62,ďtyr]Y%ԼW2_ 477}x<Jh >HqBJcB{aQȜ|Sbj:Y4/ f, B%B*JVSTB/G"XYY}bqK8-\NF vvvD߱&6Mf{"WV>|w!0.<ӣN9d`(^`ŪXԈwttܲeVTThsj/d2&IZnnnf0 8 **JLfBq#5| cR֖P *zI1JER;Z8+3VeЬ">NQ+ɍ!{,M(_~SVYfͽ{Vy׋V;vD"!ZeСDKJCCôiӈVcYBuo-sŃi,Ĉ_)#^`>+`)%,} !Dap.N̻MJc,;Ǖ>ͅ0Нdː#*Sl{;-tNoƘH{'F ;R2RΜ z){/fQ{8,ߎ)T&y /4+%_MBJ]Dh*4*DW03;#UU׿92)~q1/|m_h 8BH*j TE,f%3w?ݦ$~h,kǼגg%Y6\Rx5_[IȍKN=`>o)ִ*Ic]c+!t;;x@!ޏ1.|封/)bܐ+崙~\7xb`V!b֨\YEMv/2xRt 0+`wI{lF[Ww4fY!NlȗIA J2( -\u-Hr!dYk]z ń?6ՙoʦKU]\q+z򉰩I,S]p&'荣'?M["ǰz*8 w(}F뢖s5 PĮT<;|ǥuxkQ5գҋ LKdۀJ2^9, S\2k@oo7w\8yɩ¼\=G:^*Q}2-:׷*5cZJ+2 ѢkR{(;K9y⸴wzUuBܜ]}NX?ts 0*Ky &,LX 0 `FCE ;Fz~W`4hA/sLKĒ%h=x&BHTr6|lʂ 0Ԁi3ZwO^4=ԕLZ XNzTSOgN|Ƅ5eftURC!, j , j , j , j , j , j , j , j , j , j , j , j , j , j-}<{,99h4J%~JR x<P(D"Gh4JT**7?7V5@ `@ B(db) ӧO8p ..ݽ{r/283 "9eE4iRiV\\lȁΝ;B{;GP@`5X@ P@`5X@ Pzgڵkʕ::t*/,r6 #F1BgcRRRaa@ /?[e%6,}`B@`( ,>I`($gJB{FY`$g}Q3 %!=,P3>( eQX( e~BI`( ,?JB{FY`$gYJD pBI`( ,(!=ÏQX\6%!2 p UBRQ)U xF%!=㢵񠰖.n^^ncF ykOMw܏#z,O<04sր "~r\fOZ=^uӐ~n\rh[j $g\_|J(& P3;ES?5yxPFNe{>_%}P3F  ?|EϏm-?90P5n5$LIP+$FҪS1;2WIi&\dZC Ft tqrshmgn0#DI`8Pw#\RdOZ|ФO5v_֤>78v7'/׼ߑ0J`oa rN-RmʩLg?%n~^B4Nռ[2<>JB{(!3~qʽIgf/.,wl3}$gsiQ]"zrɘ$g+lXJB{FYkP,=X:\.~q̐JME}ٕ}N}֤Ǐ߷o{yyT*RYRR[ s\x2>؞!=^Km׮FBQ^^.|w/n߾%pX̸ltqq)//'x<_D` kҨs3KQYTT;4и&yG ـ,㮵|q@m9P0\ GW8yomDDQ3ucMOvqWd]ȉIZ>!'J{;&3Kzjz ҜKξ> %!=*ӗǝ%~ON2(L goxIhdwT?ﻴŽG6dsGdzxF%2R8"jؔag%M1|&!!( -,Uљ5v龇f6o2rQB4,`c[>Kb>-$\Z6z̍Nk`:J(Y* {엄_Ypg@Zz": HpwW1%p _ƷҲ*5DS~v{EjBCg/g$D}@ B1cYDw{VttY ᱣI UQBߐ2ޘs̽CX[O?oP.e\6LǸP,'''3.6Mkpj۵#QB>F  F eQ7e3HhgzJBn/ ZX( e~&bQXS( ,?%gJB{FY`ZQXl,kFY`Xb;( ,3>*Z7,DY`^,0qQX8 `( ,.G QX3KIJLL4pe e-,s HBY`$T*2$˻u|Bh4D"quu5Jh440V~~~zzƂgggFm"B&UTTTTTdgg[ (|>ۛb X{?`72QggggggCީ`5ݼDY`aQXf, ?fX %!=,P3R%!AU`( ,BI`( , U!QX( ee, ½@ ZX,bG"0#ZX- ]]]koYz}7|׻+@0EY`$g( B"( ,JBeeƒFӝc JB*ee{ BfpQڐYՉuJw)pF!)/-)-(~BZhdpTdmxPXKw7/o/7WVFy1 KB-d,THykOMw܏#z,O<04sրfF 5z?UYFմx[R֊_G_5^qm>ixOC}qIȡm5N:KBF=aڒgNJJmy{yˍx{=9#{[wbc3- V"\[l>^qEjDSޚ9`BR҄уLSٞW >.bx4q=.gZi3W+Ǻ{+v>~8e+3cW>?qp@"hFp7ü{ .n-;` ,aG _Ntӗ|_ڀQ^EXG5IVH% YեUcNׂb++[<'By-Mĉ6q4w,-ãgPNJBЫszҬȄwh>h {O'x~v@j磖{Ƞn|>'k?y2i %g6VP飮sk?f3"WΩEmU^9ǰDEIFK {w7S^5C48 &>C>ǎpƽ7MwɬtIhYl0R^i/f6nf{<ٷ>;yoM^pިKBd5QH޿_w7vq?^Fwc8<]-B!)GJ9]1e{7;;>VzPpO ƥU_i'.%ԁv4߷n@7ZԖBL7ӽ;X YTݗ] gM߽k׮+Wl|q۶mU*B(((0D")** 2ۙ^t<Vƒy7ڜ%]JHņY!°Z4뜮QB0/[Xʢ"ءጧ`B(% #&."hբMu9g{wZGIh d)* y'Ooenf~k詛"Ol$3$ۍXU Ku!'&iAW\;*iZk [KTZhd^b4R$BfP:}y\]Z>Qr5Ѝߜgx|) 2|eo34"0u hٴo2ҎLn_-j;nm1*P,&Na96%r˅>n{ ,}X;;f5f}UM-t5CCŊeЙ㤅 cKҬ͹2Yŝ_Ml`~`)ne=45)~vnz;xN=͈q!aQB4̎6Ja)VB2o` ` ;'~7'mhx5ĻjrӮ7Jܴς`i80Wa<>s'_7#Z2zڴi{5t8[q3  l`u=,584};2u7V>q;fF~ԍ0z?@Y`Q4JUUU[Y,%Jݻwg],( ,KBGGG#րGfEY`X*J$TT:YQX,QX=EY`[(11@Y`Q]G$|A'F{C# ee{%nyC%4fMZ'p5X?ZX6S!!( ,+ _@feefBY`jIh dˆKBS`F tQ y1DY`QڪB~:`( ,B!JE"e:seq&FYF _ Y`( ,%4i,mи{Y`{+%%:SSSjR,++1@ P*EEE&Ǹ6е6zcǎ5x}DB/4H$2}?/}!HLߏ)?Ii4KIIIw6q?RT"p^\\n~w`l!1퇛[VVVPP;^8 `(tQB/nxeeof@5'`(ò{ ,;_4tP٤:P](kaa63*PX( )"%!m>=*P??Jº`c( ,)//oܸA %!8+ +++n4e0"X!ZX( _ߗjg""X %a} , b1Ҿ0Wrm!@( eْP/_ ,^4Pe\2 ,%!$4(ka$% !3-,T*8ê4 /㲅QHKKJ% PL 0D \"kǃZyxy{yz6㏙v( cƒV<5q}&ͻw='gX9ksL31(O&[`^'B }߼(sUtSdˁ0JhYpYW }j|fAnA#?P⣄/QBQ{&DfoM9,SٞW g.b3QBCƞ;wo"i ve}j6HfWXq^%lP(d^H.07xC&$jBVvui)Ę^ps/Z~oBf8Py}ǂ݂<]=<9xuٮ;0JXn%yD0-,M,U.B$C~6hַ2wGIXJf͚μS\Bk Ŵmpc0K~rrg2|ڴi{5PGjԨQoh"(_Ksl྾F+2'1l-a>܌XԂX39tȻZEF{ U;Wn( c=-Ћ4g3JTƆ1O .ZCKBB!<]-B!)GJO%ܹs;{D"qF-JBu֥mgxM *HW'L RO'_f~)$̓paGuw$HeV:cxf~ NgaN~[OmTd'i:[t6:v!<>/’v#DY]Zp^z-؉OOa>jnj+OLgת%;mClV'ro>3;˭_6|}jD'/qќ W,N쫋sߌw{퉺1A,Ͽ u{u`)**=c2YgPAǏQBa+{wN$My}?tG[qmlZq^A١rO:Z;I30Jh83.E]p!_?R:}WC[3 lL&x"'YRmQr5Ѝߜд ƱP/J0Ӊ#S ^mܣM#OzI36o\fCJUVVf)7@q~Vu]v:NO}3~-"++k޽wBqj5lJ0MAꥪ{Q'Nl1cIcɨFUUU%!Cxy(j?|ZMR$T$O\V(uŸ []ȭsPgVN5T?}޻Y͝&,>Yܲ{7M4Qo36qՅg2o_'xIy'2U?ݺNFc {+ u5mc/ gf'lWE7w폭C-'j?)WxǼos}ZI=v_9xiq 6S8.PL815gg8iD.J#ʭ}̉1} #7JhƽaQe8,(˛o,vV}}jD7=<,) 10| !TUU >JBayy{JJ {2P%K,gs,J% wsPqR*Ϟ=㠑U^^.ػ;煂͛%\Njòx.ql$>}; ,Kh[* %-ͥòv]/ӌ4p/qlo3BRvX( ,˦kڴiׯ%= %q$l-#լAF N- =ZTlTfޑVHRÞVaJ ,$ .Vwdr2_+ _tMIwqD$"|5Â;JԜ(z%%nS=K> mR3={}';\Y"Xq88ZYW ; ,BVA`8e"UIZZoOU/VѳCyRf޺uaEӍW+QHomm['仌78#jjW'MꔄJ+buhZMSN&ս? NE),,; Z%7_/8ٕ!I ũi%ivՕdK7?TIhlBIhQ(UUUq3N˴ `869JQ 7"eS}XýF6mQJB$4@%mBIhFCIh( م8( 6$4JBSQl$ոq˗۷߽{ɉV|>K/jjjD"cy^!D.;::}9rD"V/K$GGG@N*}9JRTrݱcGsn]jF\US'VR`b;ăW8drl%ʷ K<$٪,JrXXw>s?eG?h$[h43MS(svm1vʛ_EyFy^sSr;4U^kr Ijv}WL/H85*k) Us)3<'{!Ns$x傢 g?`S[N=yOu\iې6B ,}O#^*ocgs]ŗД]o/2y|z]Ust9²gRZrl$>3w(*.QU?ΈtME"9Ӻg;Sߴ2?F"4r,xn\5jCB瑵ҞV\ۺǫ Č1Pd};sz!^Pߡ~]Usn-9H+h 82"mb\>xa6'}GtP(.9EX)ߠ{d<.8+ @`xFv}Gɀa+`z֚U!p02N/~U>'''u4NY"̘1Ck"""maaa?feeqpY@!!a%ÒH$%%%ھ T*---UnJxJO?ʊeY\.H,,,d2YAA\./ u݀U~S̜cLVRR"4{]5\]]]]]+=yL' MLLLLL,-- !B.ԏmL&MMMMMM{=ItD 0Ko( Xǘ%7H 3RB}A )!>,`!%gH 3RB}A )!>,`!%gH I !))) o ԊRB}FRJ(H9iY1"j0f RBe )!PC#,Vg)!>D*M<`rI`ߖf6b+sǠ%iRUBJ{?Xopq!~R JKSvz̝ZcRBɩ'w̘e˻>5؈3&F]Wq@?`z8|,x=:{C!LCJ?Ko3}.<=?tn˦6[,ݻwF.M,k0t; N_JL#[;`SJ)\.4tal݂ƹKfz%ݧe l}debʩeTn L#,١Wgw'f&BYqNFc/:g*yRmyPD^*qѰWEMl(+RB}P vu|gWO]3۫)!>SK5x:ٳT(/~8%.6qΞ0U5pbe40Kȳ_yތS( L<&~򫯻)!>вI@!DvFi3ml'#_Xj vjhrQ&m&WÍ o^OBH &߯M%,l_tSQK7%tvv@CqT\2M,iAvvܹz )!>\=y"ef͚))6h*`IG( 3hk\nJ;԰[i۶m+=icc#J !<RRRbll,ϔ?TwUrQ(#{qOܺ`lgC!_@45[oT7֙ubK鴇6,h;nЖ?#& '/LS(0K4ezdsrmTVDe7ZhcBMrfŰ՗UZ/ǮRqqf PAB1>9Gwi=%-Ya=R,!YO4e_%}[8D GsS.=?$oWjAii~N3wX`2ewΝG.0wvTp@ij-h[Pz0Kϴҽ~3FX%g4PK]9D,`5$%q5( X%g,BBDYBJ( XH e. +A,ɔ,]G Gv4bS( X%DH 2KA,`a(>CJԠ,`qxR:m,]@K)ayj:?Vz299A.K'O ,TZߕf^yEB$ '{zK,,ARR:vˆ3VP >,`a(>,`i@Vy;KX-V״iS,%Mԝp pbnQ6R,a^^ ( XH eKݳH1QaR,!!D1Ka\w*{qlɔPbFX%g4GXM ^?#-ΗM50J$n*((V纜 5=@Vܬ-mr$G4uuU,a%oeTC>OfoXn>Y~o:%DhNB̹"SeyWJS\z0ط1hIDTզ%T-!` l7IBِ5k]d'0~c Ũ;O6VQ4slyRݧxF`Ĩ*FuJX Z;nшBxV~Y6}NU>9pcsBarΟl%V)Sªꮆ ۖGY=hlOSޫ'E=F'L߲8fOO+τ.۲1ͦ]X8Y 4G3f;Ƽ_[+C)pn>rw*X%tvvƢ-Zo]3<<| =f̘ 9"[qER+5pt!ho¢MdʆZt=rOv21jbnaaflb{̲E*_n%zHG+1.%hܹUS29١W\꣼R\^{`O3>Uq5jc%wj즷4'̑8w?^ {ȋV%.M%~E2]U2Lqti)hgе<}STV֩7e^\=uXlb{H YM#,Avl h]7>C=;MSb3 SuYVUj.l߾}IIIix# Q,aq!8ʳfğ?E\`4_}U5H 6♴1`|Big|ahTvtahUV6vty/@twO§OVz277W*BX-..fYH*D"eܼ~o?~dbvLmϸ_z=ȰDտ:**Õr劵\.dvvv$''N&5A-ݠO C 7GMhɓ%l,ݬ+,!ԅARR:*znpB? mTaI 3|GxXk3,# -[ֹ~ Q*RBPM,&cyW}~I}1`MP9!aji*`IGIP+>!gЬ7 @U.wW0'Jn]N0հC(PKI*4OSK>o_QZgK͊v,Bڢe arΟlaP,a+Bo#ݼ^@cmoY3egB~mԘfS~ +((055:͘a%4t; N_JL#[;`r4uEEE X1 @sDnA܂ )!!f=ݫ)a9YU=]-P8u2k7jY( X-m޼P01 R7~JX,g k:!T;BF )r~Ў+6 ],Zj p~]%[ИP0K( G wq,`5YBmsf" %|RB]Fѧ 7ZQ6ҷYBΗ;TCe )!>,`5օڂAЅo) fEt?j^KXncI$KK3glذ@V%:zUWf)`})t?%TG-(aaJXIyԽ2^jyhҔH ߠ)!AVl<%\nǫ_GQ޲,nYW&KO|^U٢ì^dl}g|KjEJ˿asmU>2u$,`)O Njoo_]qm Kc=gYBc-e p)vp_@ۺ9>CJh+QB?"'Yfsj'Ҷcߏ<>vloN.݇|~"!3_ۣSN]~s1E[n2=42m'%$ ,5F0:g``CIrBzXV\-|z, {wсcox'v]iK|b;ş+nNi?yT JZ4J.i>,Uh8>0˰[*Afʕ+UUTTTJ.oOڔ? \x<#EGw_];I=ճ8 {7᭍'f}zbv/,ۓnf1O.W>d"7ݤ}UA={633 BœP8{7nTmꫯ*ME#9MP747772d2«|ХCᖑqme[mMO޺Nsœn`h|׿I(nU{*͜{^LXӊ~E‘[޽M%_Q׶=8w祥uh}nw[r]3Q5WZ^Vuds` ήC3쿯%\\(߸ɇG$ wgmY~*>6xb՝>W8n'y֝m]%Ɏ 8x;)9[v]V{Z%3K2;}cD=ǂ7vأ O(vŕInT}d|qmDAOjAcޥO޼ٓ%XBb!-ZRkXkEiJ@ZR¢2y ')a ˻+Ὢƨ,UFwܿfy,YamhdddFFX,< Z-/+W\\͂N\dRe?ӀۯN3]M<^˧Gv)^f\7gY/f7@"4eKyJ8k֬9rdM_uBH^oƭUZ,aٞMO޲7 c`/_8a^FxFuQ[.[&ZG[YPo?gff8pT8 fee5k֌ZݩV_C-!V ( X8Pz. j 赪4yW $C,UOEԤQcujmYkooy/]|E%jJ ~r-S e#,)aFFF~,,,*5{?2P(|gAk%%zCŭw,w(akdgyZoʈn]>!#/<=Vޔ1'W ޱK'DrrV+C,hnCE,7KXf A9f ˋ~2IDATֱ=ʨڬƝdsS.=?$oWjAii~N3wKXePBVFsAgh`^͒:̜otQ. P-?37v_Ftbɝ#lgN{J̜3gNffÇvP'<-ZgmoY3egB~mԘfS~ WM^5p.Zya~~~&M{J&L}흄s/%w -ݿt0U,RCi =Mtٺs/.*LEF-~Zޝ*U\U-M,k` ndLo'+&f&VN,;XrS^^srίq}XC3dGyr4/=rCgTW%KX[[TQK7$=c^9حukvnG^dl6+wsUT,-..Vd–~RJ(kUaQ=$Jrd,kPtĤһ._\[/3OFO{)=jƑ qK½y䈩osUVU)fQ0Bݩ%;Z:u>! kb{Օ*~P6?Gkd>b3h'۫KY'?; g~\ꃟzTVAf_(V9g'+Xtۆ^c9Y8\:E,/o.Z5%|HTyD͊'?gd܉]yw78(jS:ȣɝպҁϗƝՎy:ݞt#]޶~U5P,M]ޥ("YyJtqU}6+?&Y0rGd;B٭_ ..:8ƼJ>7P^6/K7 n@#H "221 LڎÿMK9*{مj߾J@T;Xݎ{=}^rrM`W~󄷳% v䦽܄Af}-BƍO>w3G-7ZLD|,x|cq^=bG{Y\JU7O'FDHdϫ=]zͻo=YҮ%z*ҩ/V%f yvq6Hh=6HJ&j=R6CfWp"uZ+buՕTUo?;Ex9m!k:^vUӄ˗W[|P9/W{s|*UA8Yqck<N{ogd ^[W5nƔ}GS%pcMwt- |oS`1^s߾}[g~}Jo?>{lBHQQD"^lFFÍf͚ @Kmll8^k}sjrss/]D;|f]HHu؈G804%VBQ#וhxs:"T7,WÑpt{tܳ)#l9"޲LErZBNPkP ]X6ӷ,ӊ3Kw?ljm)zEET̗Th`|WWRJs$OΝX.0wvTU al݂^4tтS,I>mWsjPkkVϪzMCEAv/ǮVUlV/O~~x8잜m7_%/7-**bLV-vp_L(īZ2>9gψNn^NZN~nf2"OcMyrŐ;tjK$'g[k()2΂v6d]TlςF-!W85h[#8Lʋ}]_?sbЭ{SwiQFZ0 !ؕLYͦinkɮs)!'85T ]^<~ʐ6|B4#ҢbUV͜9+\^̳˫ֻٳ[Y []q?IM?yKY)0/6YЫ4K(s^׽*\QQT*huL[[ۊs,ӦMJԿpTzq߹'l",({I&׏.g?qWi GtܴiӖ.]JQ>MJ496br_3?s|jѪ*҄FJ r7wژzM;Sӆ7Jz*#PwT}E:>soe 5'Ա*nѢ * Gŀ)!'k~8`Q& %)a%H @E^s^s AJET rZ9FXM6]zuxx8!$33FFFaz6AQQ5,..622\5(J144AaJJJLMM9lȈeY p ϯ,' D"JN,Y7Cq j;5'8r:HU d2T*|S7333]n d\^+Gq}CqJ @j `5X@ ,&ck!!UlBwܐ:ף=Z9yOWrYi![ڶ{aefR7;'lTuU4Mo??й]z@勺sQv u z!N~aaaaaaQ09g3Qby~GŅw~SƲlq.'N.}-irf%E/D-j*l+i%J.}@^KO=)Mm/ʯ.JZ Xy{O9,1{xno]dgݱ]K)kj_$Xe$Fʖ&ZggeLNbоS'JbCչ]c^qYU7BЊ_-2!oZnYjl-..11kx')[\T̔П.银$WD [֧[2ĊGGVwIf&-,)IX6d/?yۤ\juuU-Zˠ璣G׍no*\:޿gjgmkպ^>$"/777777:ZK311.),R4MF&F V`i.\[~0i]#1me,Һ['YNg>vUh:}6=wB+"=8>`җʤFs}WkʳOy # Marco Chiarandini # # This program is free software (software libre); you can redistribute # it and/or modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 of the # License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, you can obtain a copy of the GNU # General Public License at http://www.gnu.org/copyleft/gpl.html # # IMPORTANT NOTE: Please be aware that the fact that this program is # released as Free Software does not excuse you from scientific # propriety, which obligates you to give appropriate credit! If you # write a scientific paper describing research that made substantive use # of this program, it is your obligation as a scientist to (a) mention # the fashion in which this software was used in the Methods section; # (b) mention the algorithm in the References section. The appropriate # citation is: # # Manuel Lopez-Ibanez, Luis Paquete, and Thomas Stuetzle. # Exploratory Analysis of Stochastic Local Search Algorithms in # Biobjective Optimization. In T. Bartz-Beielstein, M. Chiarandini, # L. Paquete, and M. Preuss, editors, Experimental Methods for the # Analysis of Optimization Algorithms, pages 209-222. Springer, # Berlin, Germany, 2010. doi: 10.1007/978-3-642-02538-9_9 # # Moreover, as a personal note, I would appreciate it if you would email # manuel.lopez-ibanez@manchester.ac.uk with citations of papers referencing # this work so I can mention them to my funding agent and tenure committee. # ################################################################################ # # TODO: # # * Follow this style for coding: # http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html # ################################################################################ #dyn.load("../src/eaf.so") check_eaf_data <- function(x) { name <- deparse(substitute(x)) if (length(dim(x)) != 2L) stop("'", name, "' must be a data.frame or a matrix") if (nrow(x) < 1L) stop("not enough points (rows) in '", name, "'") if (ncol(x) < 3) stop("'", name, "' must have at least 3 columns: 2D points and set index") # Re-encode the sets so that they are consecutive and numeric setcol <- ncol(x) x[, setcol] <- as.numeric(as.factor(x[, setcol])) x <- as.matrix(x) if (!is.numeric(x)) stop("The two first columns of '", name, "' must be numeric") return(x) } compute_eaf <- function(data, percentiles = NULL) { data <- check_eaf_data(data) setcol <- ncol(data) nobjs <- setcol - 1L # The C code expects points within a set to be contiguous. data <- data[order(data[, setcol]), , drop=FALSE] sets <- data[, setcol] nsets <- length(unique(sets)) npoints <- tabulate(sets) if (is.null(percentiles)) { # FIXME: We should compute this in the C code. percentiles <- 1L:nsets * 100.0 / nsets } # FIXME: We should handle only integral levels inside the C code. percentiles <- unique.default(sort.int(percentiles)) return(.Call(compute_eaf_C, as.double(t(as.matrix(data[, 1L:nobjs]))), as.integer(nobjs), as.integer(cumsum(npoints)), as.integer(nsets), as.numeric(percentiles))) } compute_eaf_as_list <- function(data, percentiles = NULL) { eaf <- compute_eaf (data, percentiles = percentiles) setcol <- ncol(eaf) nobjs <- setcol - 1L eaf_sets <- eaf[, setcol] uniq_eaf_sets <- unique.default(eaf[, setcol]) return(split.data.frame(eaf[,1:nobjs, drop=FALSE], factor(eaf_sets, levels = uniq_eaf_sets, labels = uniq_eaf_sets))) } compute_eafdiff_helper <- function(data, intervals) { # Last column is the set number. setcol <- ncol(data) nobjs <- setcol - 1L # the C code expects points within a set to be contiguous. data <- data[order(data[, setcol]), ] sets <- data[, setcol] nsets <- length(unique(sets)) npoints <- tabulate(sets) # FIXME: Ideally this would be computed by the C code, but it is hard-coded. ## division <- nsets %/% 2 ## nsets1 <- division ## nsets2 <- nsets - division return(.Call(compute_eafdiff_C, as.double(t(as.matrix(data[, 1L:nobjs]))), nobjs, as.integer(cumsum(npoints)), as.integer(nsets), as.integer(intervals))) } #' Compute empirical attainment function differences #' #' Calculate the differences between the empirical attainment functions of two #' data sets. #' #' @param x,y Data frames corresponding to the input data of #' left and right sides, respectively. Each data frame has at least three #' columns, the third one being the set of each point. See also #' [read_datasets()]. #' #' @param intervals (`integer(1)`) \cr The absolute range of the differences #' \eqn{[0, 1]} is partitioned into the number of intervals provided. #' #' @template arg_maximise #' #' @param rectangles If TRUE, the output is in the form of rectangles of the same color. #' #' @details #' This function calculates the differences between the EAFs of two #' data sets. #' #' @return With `rectangle=FALSE`, a `data.frame` containing points where there #' is a transition in the value of the EAF differences. With #' `rectangle=TRUE`, a `matrix` where the first 4 columns give the #' coordinates of two corners of each rectangle and the last column. In both #' cases, the last column gives the difference in terms of sets in `x` minus #' sets in `y` that attain each point (i.e., negative values are differences #' in favour `y`). #' #' @seealso [read_datasets()], [eafdiffplot()] #' #' @examples #' #' A1 <- read_datasets(text=' #' 3 2 #' 2 3 #' #' 2.5 1 #' 1 2 #' #' 1 2 #' ') #' A2 <- read_datasets(text=' #' 4 2.5 #' 3 3 #' 2.5 3.5 #' #' 3 3 #' 2.5 3.5 #' #' 2 1 #' ') #' d <- eafdiff(A1, A2) #' str(d) #' print(d) #' #' d <- eafdiff(A1, A2, rectangles = TRUE) #' str(d) #' print(d) #' #'@concept eaf #'@export eafdiff <- function(x, y, intervals = NULL, maximise = c(FALSE, FALSE), rectangles = FALSE) { maximise <- as.logical(maximise) nsets <- (length(unique(x[,ncol(x)])) + length(unique(y[,ncol(y)]))) if (is.null(intervals)) { # Default is nsets / 2 intervals <- nsets / 2.0 } else { stopifnot(length(intervals) == 1L) intervals <- min(intervals, nsets / 2.0) } data <- rbind_datasets(x, y) data <- check_eaf_data(data) # FIXME: Is it faster to subset or to multiply the third column by 1? data[,1:2] <- matrix_maximise(data[,1:2, drop=FALSE], maximise = maximise) DIFF <- if (rectangles) compute_eafdiff_rectangles(data, intervals = intervals) else compute_eafdiff_helper(data, intervals = intervals) # FIXME: We should remove duplicated rows in C code. # FIXME: Check that we do not generate duplicated nor overlapping rectangles # with different colors. That would be a bug. DIFF <- DIFF[!duplicated(DIFF),] return(DIFF) } compute_eafdiff <- function(data, intervals) { DIFF <- compute_eafdiff_helper(data, intervals) #print(DIFF) # FIXME: Do this computation in C code. See compute_eafdiff_area_C setcol <- ncol(data) eafval <- DIFF[, setcol] eafdiff <- list(left = unique(DIFF[ eafval >= 1L, , drop=FALSE]), right = unique(DIFF[ eafval <= -1L, , drop=FALSE])) eafdiff$right[, setcol] <- -eafdiff$right[, setcol] return(eafdiff) } # FIXME: The default intervals should be nsets / 2 compute_eafdiff_rectangles <- function(data, intervals = 1L) { # Last column is the set number. nobjs <- ncol(data) - 1L # the C code expects points within a set to be contiguous. data <- data[order(data[, nobjs + 1L]), ] sets <- data[ , nobjs + 1L] nsets <- length(unique(sets)) npoints <- tabulate (sets) return(.Call(compute_eafdiff_rectangles_C, as.double(t(as.matrix(data[, 1L:nobjs]))), nobjs, as.integer(cumsum(npoints)), as.integer(nsets), as.integer(intervals))) } # FIXME: The default intervals should be nsets / 2 compute_eafdiff_polygon <- function(data, intervals = 1L) { # Last column is the set number. nobjs <- ncol(data) - 1L # the C code expects points within a set to be contiguous. data <- data[order(data[, nobjs + 1L]), ] sets <- data[ , nobjs + 1L] nsets <- length(unique(sets)) npoints <- tabulate(sets) # FIXME: Ideally this would be computed by the C code, but it is hard-coded. ## division <- nsets %/% 2 ## nsets1 <- division ## nsets2 <- nsets - division # FIMXE: This function may require a lot of memory for 900 sets. Is there a # way to save memory? return(.Call(compute_eafdiff_area_C, as.double(t(as.matrix(data[, 1L:nobjs]))), nobjs, as.integer(cumsum(npoints)), as.integer(nsets), as.integer(intervals))) } rm_inf <- function(x, xmax) { x[is.infinite(x)] <- xmax return(x) } # FIXME: Accept ... max_finite <- function (x) { x <- as.vector(x) x <- x[is.finite(x)] if (length(x)) return(max(x)) return(NULL) } # FIXME: Accept ... min_finite <- function (x) { x <- as.vector(x) x <- x[is.finite(x)] if (length(x)) return(min(x)) return(NULL) } # FIXME: Accept ... range_finite <- function(x) { x <- as.vector(x) x <- x[is.finite(x)] if (length(x)) return(range(x)) return(NULL) } matrix_maximise <- function(z, maximise) { stopifnot(ncol(z) == length(maximise)) if (is.data.frame(z)) { # R bug?: If z is data.frame with rownames != NULL, and # maximise == (FALSE, FALSE), then -z[, which(FALSE)] # gives error: Error in # data.frame(value, row.names = rn, check.names = FALSE, check.rows = FALSE) : # row names supplied are of the wrong length row_names <- rownames(z) rownames(z) <- NULL x <- which(maximise) z[, x] <- -z[, x] rownames(z) <- row_names } else { x <- ifelse(maximise, -1L, 1L) z <- t(t(z) * x) } return(z) } rbind_datasets <- function(x,y) { stopifnot(min(x[,3]) == 1) stopifnot(min(y[,3]) == 1) # We have to make all sets unique. y[,3] <- y[,3] + max(x[,3]) rbind(x, y) } ## Calculate the intermediate points in order to plot a staircase-like ## polygon. ## Example: given ((1,2), (2,1)), it returns ((1,2), (2,2), (2,1)). ## Input should be already in the correct order. points_steps <- function(x) { n <- nrow(x) if (n == 1L) return(x) x <- rbind(x, cbind(x=x[-1L, 1L, drop=FALSE], y=x[-n, 2L, drop=FALSE])) idx <- c(as.vector(outer(c(0L, n), 1L:(n - 1L), "+")), n) stopifnot(length(idx) == nrow(x)) stopifnot(!anyDuplicated(idx)) x[idx, ] } #' Exact computation of the EAF in 2D or 3D #' #' This function computes the EAF given a set of 2D or 3D points and a vector `set` #' that indicates to which set each point belongs. #' #' @param points Either a matrix or a data frame of numerical values, where #' each row gives the coordinates of a point. #' #' @param sets A vector indicating which set each point belongs to. #' #' @param groups Indicates that the EAF must be computed separately for data #' belonging to different groups. #' #' @param percentiles (`numeric()`) Vector indicating which percentiles are computed. #' `NULL` computes all. #' #' @return A data frame (`data.frame`) containing the exact representation #' of EAF. The last column gives the percentile that corresponds to each #' point. If groups is not `NULL`, then an additional column #' indicates to which group the point belongs. #' #' @author Manuel López-Ibáñez #' #'@note There are several examples of data sets in `system.file(package="eaf","extdata")`. The current implementation only supports two and three dimensional points. #' #' @references #' #' \insertRef{Grunert01}{eaf} #' #' \insertRef{FonGueLopPaq2011emo}{eaf} #' #'@seealso [read_datasets()] #' #'@examples #' extdata_path <- system.file(package="eaf", "extdata") #' #' x <- read_datasets(file.path(extdata_path, "example1_dat")) #' # Compute full EAF #' str(eafs(x[,1:2], x[,3])) #' #' # Compute only best, median and worst #' str(eafs(x[,1:2], x[,3], percentiles = c(0, 50, 100))) #' #' x <- read_datasets(file.path(extdata_path, "spherical-250-10-3d.txt")) #' y <- read_datasets(file.path(extdata_path, "uniform-250-10-3d.txt")) #' x <- rbind(data.frame(x, groups = "spherical"), #' data.frame(y, groups = "uniform")) #' # Compute only median separately for each group #' z <- eafs(x[,1:3], sets = x[,4], groups = x[,5], percentiles = 50) #' str(z) #' # library(plotly) #' # plot_ly(z, x = ~X1, y = ~X2, z = ~X3, color = ~groups, #' # colors = c('#BF382A', '#0C4B8E')) %>% add_markers() #'@concept eaf #'@export eafs <- function (points, sets, groups = NULL, percentiles = NULL) { if (!is.numeric(sets)) { if (is.factor(sets)) sets <- as.numeric(levels(sets))[sets] else sets <- suppressWarnings(as.numeric(sets)) } if (anyNA(sets)) stop("'sets' must have only non-NA numerical values") points <- cbind(points, sets) if (is.null(groups)) { attsurfs <- compute_eaf (points, percentiles) } else { attsurfs <- data.frame() groups <- factor(groups) for (g in levels(groups)) { tmp <- compute_eaf(points[groups == g,], percentiles) attsurfs <- rbind(attsurfs, data.frame(tmp, groups = g)) } } attsurfs } # Get correct xlim or ylim when maximising / minimising. get_xylim <- function(lim, maximise, data) { # FIXME: This seems too complicated. if (!is.null(lim) && maximise) lim <- -lim if (is.null(lim)) lim <- range(data) if (maximise) lim <- range(-lim) lim } get_extremes <- function(xlim, ylim, maximise, log) { if (length(log) && log != "") log <- strsplit(log, NULL)[[1L]] if ("x" %in% log) xlim <- log(xlim) if ("y" %in% log) ylim <- log(ylim) extreme1 <- ifelse(maximise[1], xlim[1] - 0.05 * diff(xlim), xlim[2] + 0.05 * diff(xlim)) extreme2 <- ifelse(maximise[2], ylim[1] - 0.05 * diff(ylim), ylim[2] + 0.05 * diff(ylim)) if ("x" %in% log) extreme1 <- exp(extreme1) if ("y" %in% log) extreme2 <- exp(extreme2) c(extreme1, extreme2) } add_extremes <- function(x, extremes, maximise) { best1 <- if (maximise[1]) max else min best2 <- if (maximise[2]) max else min rbind(c(best1(x[,1]), extremes[2]), x, c(extremes[1], best2(x[,2]))) } #' Convert a list of attainment surfaces to a data.frame #' #' Convert a list of attainment surfaces to a single data.frame. #' #' @param x (`list()`) List of data.frames or matrices. The names of the list #' give the percentiles of the attainment surfaces. This is the format #' returned by [eafplot()] (and the internal function `compute_eaf_as_list`). #' #' @return A data.frame with as many columns as objectives and an additional column `percentiles`. #' #' @examples #' #' data(SPEA2relativeRichmond) #' attsurfs <- eafplot (SPEA2relativeRichmond, percentiles = c(0,50,100), #' xlab = expression(C[E]), ylab = "Total switches", #' lty=0, pch=21, xlim = c(90, 140), ylim = c(0, 25)) #' attsurfs <- attsurf2df(attsurfs) #' text(attsurfs[,1:2], labels = attsurfs[,3], adj = c(1.5,1.5)) #' #' @concept eaf #' @export attsurf2df <- function(x) { if (!is.list(x) || is.data.frame(x)) stop("'x' must be a list of data.frames or matrices") percentiles <- as.numeric(names(x)) percentiles <- rep.int(percentiles, sapply(x, nrow)) x <- do.call("rbind", x) # Remove duplicated points (keep only the higher values) uniq <- !duplicated(x, fromLast = TRUE) cbind(x[uniq, , drop = FALSE], percentiles = percentiles[uniq]) } ### Local Variables: ### ess-indent-level: 2 ### ess-continued-statement-offset: 2 ### ess-brace-offset: 0 ### ess-expression-offset: 4 ### ess-else-offset: 0 ### ess-brace-imaginary-offset: 0 ### ess-continued-brace-offset: 0 ### ess-arg-function-offset: 2 ### ess-close-brace-offset: 0 ### indent-tabs-mode: nil ### ess-fancy-comments: nil ### End: eaf/R/epsilon.R0000644000176200001440000001104214531422643013004 0ustar liggesusers#' Epsilon metric #' #' Computes the epsilon metric, either additive or multiplicative. #' #' @template arg_data #' #' @template arg_refset #' #' @template arg_maximise #' #' @return A single numerical value. #' #' @name epsilon #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @details #' #' The epsilon metric of a set \eqn{A} with respect to a reference set \eqn{R} #' is defined as #' #' \deqn{epsilon(A,R) = \max_{r \in R} \min_{a \in A} \max_{1 \leq i \leq n} epsilon(a_i, r_i)} #' #' where \eqn{a} and \eqn{b} are objective vectors and, in the case of #' minimization of objective \eqn{i}, \eqn{epsilon(a_i,b_i)} is computed as #' \eqn{a_i/b_i} for the multiplicative variant (respectively, \eqn{a_i - b_i} #' for the additive variant), whereas in the case of maximization of objective #' \eqn{i}, \eqn{epsilon(a_i,b_i) = b_i/a_i} for the multiplicative variant #' (respectively, \eqn{b_i - a_i} for the additive variant). This allows #' computing a single value for problems where some objectives are to be #' maximized while others are to be minimized. Moreover, a lower value #' corresponds to a better approximation set, independently of the type of #' problem (minimization, maximization or mixed). However, the meaning of the #' value is different for each objective type. For example, imagine that #' objective 1 is to be minimized and objective 2 is to be maximized, and the #' multiplicative epsilon computed here for \eqn{epsilon(A,R) = 3}. This means #' that \eqn{A} needs to be multiplied by 1/3 for all \eqn{a_1} values and by 3 #' for all \eqn{a_2} values in order to weakly dominate \eqn{R}. The #' computation of the multiplicative version for negative values doesn't make #' sense. #' #' Computation of the epsilon indicator requires \eqn{O(n \cdot |A| \cdot #' |R|)}, where \eqn{n} is the number of objectives (dimension of vectors). #' @references #' #' \insertRef{ZitThiLauFon2003:tec}{eaf} #' NULL #> NULL #' @rdname epsilon #' @export #' @concept metrics #' @examples #' # Fig 6 from Zitzler et al. (2003). #' A1 <- matrix(c(9,2,8,4,7,5,5,6,4,7), ncol=2, byrow=TRUE) #' A2 <- matrix(c(8,4,7,5,5,6,4,7), ncol=2, byrow=TRUE) #' A3 <- matrix(c(10,4,9,5,8,6,7,7,6,8), ncol=2, byrow=TRUE) #' #' plot(A1, xlab=expression(f[1]), ylab=expression(f[2]), #' panel.first=grid(nx=NULL), pch=4, cex=1.5, xlim = c(0,10), ylim=c(0,8)) #' points(A2, pch=0, cex=1.5) #' points(A3, pch=1, cex=1.5) #' legend("bottomleft", legend=c("A1", "A2", "A3"), pch=c(4,0,1), #' pt.bg="gray", bg="white", bty = "n", pt.cex=1.5, cex=1.2) #' epsilon_mult(A1, A3) # A1 epsilon-dominates A3 => e = 9/10 < 1 #' epsilon_mult(A1, A2) # A1 weakly dominates A2 => e = 1 #' epsilon_mult(A2, A1) # A2 is epsilon-dominated by A1 => e = 2 > 1 #' #' # A more realistic example #' extdata_path <- system.file(package="eaf","extdata") #' path.A1 <- file.path(extdata_path, "ALG_1_dat.xz") #' path.A2 <- file.path(extdata_path, "ALG_2_dat.xz") #' A1 <- read_datasets(path.A1)[,1:2] #' A2 <- read_datasets(path.A2)[,1:2] #' ref <- filter_dominated(rbind(A1, A2)) #' epsilon_additive(A1, ref) #' epsilon_additive(A2, ref) epsilon_additive <- function(data, reference, maximise = FALSE) epsilon_common(data = data, reference = reference, maximise = maximise, mul = FALSE) #' @rdname epsilon #' @export #' @concept metrics #' @examples #' # Multiplicative version of epsilon metric #' ref <- filter_dominated(rbind(A1, A2)) #' epsilon_mult(A1, ref) #' epsilon_mult(A2, ref) #' epsilon_mult <- function(data, reference, maximise = FALSE) epsilon_common(data = data, reference = reference, maximise = maximise, mul = TRUE) epsilon_common <- function(data, reference, maximise, mul) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) stop("reference cannot be NULL") reference <- check_dataset(reference) if (ncol(reference) != nobjs) stop("data and reference must have the same number of columns") reference_size <- nrow(reference) maximise <- as.logical(rep_len(maximise, nobjs)) if (mul) return(.Call(epsilon_mul_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(t(reference)), as.integer(reference_size), maximise)) else return(.Call(epsilon_add_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(t(reference)), as.integer(reference_size), maximise)) } eaf/R/eafplot.R0000644000176200001440000011553414660121134012772 0ustar liggesusers#' Plot the Empirical Attainment Function for two objectives #' #' Computes and plots the Empirical Attainment Function, either as #' attainment surfaces for certain percentiles or as points. #' #' This function can be used to plot random sets of points like those obtained #' by different runs of biobjective stochastic optimisation algorithms. An EAF #' curve represents the boundary separating points that are known to be #' attainable (that is, dominated in Pareto sense) in at least a fraction #' (quantile) of the runs from those that are not. The median EAF represents #' the curve where the fraction of attainable points is 50%. In single #' objective optimisation the function can be used to plot the profile of #' solution quality over time of a collection of runs of a stochastic optimizer. #' #' @param x Either a matrix of data values, or a data frame, or a list of #' data frames of exactly three columns. #' #' @concept visualisation #' @export eafplot <- function(x, ...) UseMethod("eafplot") #' @describeIn eafplot Main function #' #' @param groups This may be used to plot profiles of different algorithms on the same plot. #' #' @param subset (`integer()` | `NULL`)\cr A vector indicating which rows of the data should be used. If left to default `NULL` all data in the data frame are used. #' #' @param sets ([numeric])\cr Vector indicating which set each point belongs to. #' #' @param percentiles (`numeric()`) Vector indicating which percentile should be plot. The #' default is to plot only the median attainment curve. #' #' @param attsurfs TODO #' #' @param type (`character(1)`)\cr string giving the type of plot desired. The following values #' are possible, \samp{points} and \samp{area}. #' #' @param xlab,ylab,xlim,ylim,log,col,lty,lwd,pch,cex.pch,las Graphical #' parameters, see [plot.default()]. #' #'@param legend.pos the position of the legend, see [legend()]. A value of `"none"` hides the legend. #' #'@param legend.txt a character or expression vector to appear in the #' legend. If `NULL`, appropriate labels will be generated. #' #' @param extra.points A list of matrices or data.frames with #' two-columns. Each element of the list defines a set of points, or #' lines if one of the columns is `NA`. #' #' @param extra.pch,extra.lwd,extra.lty,extra.col Control the graphical aspect #' of the points. See [points()] and [lines()]. #' #' @param extra.legend A character vector providing labels for the #' groups of points. #' #' @template arg_maximise #' #' @param xaxis.side On which side that x-axis is drawn. Valid values are #' `"below"` and `"above"`. See [axis()]. #' #' @param yaxis.side On which side that y-axis is drawn. Valid values are `"left"` #' and `"right"`. See [axis()]. #' #' @param axes A logical value indicating whether both axes should be drawn #' on the plot. #' #' @param sci.notation Generate prettier labels #' #' @param ... Other graphical parameters to [plot.default()]. #' #' @return Return (invisibly) the attainment surfaces computed. #' #' @seealso [eafdiffplot()] [pdf_crop()] #' #'@examples #' data(gcp2x2) #' tabucol <- subset(gcp2x2, alg != "TSinN1") #' tabucol$alg <- tabucol$alg[drop=TRUE] #' eafplot(time + best ~ run, data = tabucol, subset = tabucol$inst=="DSJC500.5") #' #' \donttest{# These take time #' eafplot(time + best ~ run | inst, groups=alg, data=gcp2x2) #' eafplot(time + best ~ run | inst, groups=alg, data=gcp2x2, #' percentiles=c(0,50,100), cex.axis = 0.8, lty = c(2,1,2), lwd = c(2,2,2), #' col = c("black","blue","grey50")) #' #' extdata_path <- system.file(package = "eaf", "extdata") #' A1 <- read_datasets(file.path(extdata_path, "ALG_1_dat.xz")) #' A2 <- read_datasets(file.path(extdata_path, "ALG_2_dat.xz")) #' eafplot(A1, percentiles = 50, sci.notation = TRUE, cex.axis=0.6) #' # The attainment surfaces are returned invisibly. #' attsurfs <- eafplot(list(A1 = A1, A2 = A2), percentiles = 50) #' str(attsurfs) #' #' ## Save as a PDF file. #' # dev.copy2pdf(file = "eaf.pdf", onefile = TRUE, width = 5, height = 4) #' } #' #' ## Using extra.points #' \donttest{ #' data(HybridGA) #' data(SPEA2relativeVanzyl) #' eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), #' xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), #' extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") #' #' data(SPEA2relativeRichmond) #' eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), #' xlab = expression(C[E]), ylab = "Total switches", #' xlim = c(90, 140), ylim = c(0, 25), #' extra.points = HybridGA$richmond, extra.lty = "dashed", #' extra.legend = "Hybrid GA") #' #' eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), #' xlab = expression(C[E]), ylab = "Total switches", #' xlim = c(90, 140), ylim = c(0, 25), type = "area", #' extra.points = HybridGA$richmond, extra.lty = "dashed", #' extra.legend = "Hybrid GA", legend.pos = "bottomright") #' #' data(SPEA2minstoptimeRichmond) #' SPEA2minstoptimeRichmond[,2] <- SPEA2minstoptimeRichmond[,2] / 60 #' eafplot (SPEA2minstoptimeRichmond, xlab = expression(C[E]), #' ylab = "Minimum idle time (minutes)", maximise = c(FALSE, TRUE), #' las = 1, log = "y", main = "SPEA2 (Richmond)", #' legend.pos = "bottomright") #' } #' @concept visualisation #' @export eafplot.default <- function (x, sets = NULL, groups = NULL, percentiles = c(0,50,100), attsurfs = NULL, xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL, log = "", type = "point", col = NULL, lty = c("dashed", "solid", "solid", "solid", "dashed"), lwd = 1.75, pch = NA, # FIXME: this allows partial matching if cex is passed, so passing cex has not effect. cex.pch = par("cex"), las = par("las"), legend.pos = "topright", legend.txt = NULL, # FIXME: Can we get rid of the extra. stuff? Replace it with calling points after eafplot.default in examples and eafplot.pl. extra.points = NULL, extra.legend = NULL, extra.pch = 4:25, extra.lwd = 0.5, extra.lty = NA, extra.col = "black", maximise = c(FALSE, FALSE), xaxis.side = "below", yaxis.side = "left", axes = TRUE, sci.notation = FALSE, ... ) { type <- match.arg (type, c("point", "area")) maximise <- as.logical(maximise) xaxis_side <- match.arg(xaxis.side, c("below", "above")) yaxis_side <- match.arg(yaxis.side, c("left", "right")) if (is.null(col)) { if (type == "point") { col <- c("black", "darkgrey", "black", "grey40", "darkgrey") } else { col <- c("grey", "black") } } if (is.null(xlab)) xlab <- if(!is.null(colnames(x)[1])) colnames(x)[1] else "objective 1" if (is.null(ylab)) ylab <- if(!is.null(colnames(x)[2])) colnames(x)[2] else "objective 2" if (!is.null (attsurfs)) { # Don't we need to apply maximise? attsurfs <- lapply(attsurfs, function(x) { as.matrix(x[, 1:2, drop=FALSE]) }) } else { # FIXME: This is a bit of wasted effort. We should decide what is more # efficient, one large matrix or separate points and sets, then be # consistent everywhere. if (!is.null(sets)) x <- cbind(x, sets) x <- check_eaf_data(x) sets <- x[, 3L] x <- as.matrix(x[,1:2, drop=FALSE]) x <- matrix_maximise(x, maximise) # Transform EAF matrix into attsurfs list. if (is.null(groups)) { attsurfs <- compute_eaf_as_list(cbind(x, sets), percentiles) } else { # FIXME: Is this equivalent to compute_eaf_as_list for each g? EAF <- eafs(x, sets, groups, percentiles) attsurfs <- list() groups <- factor(EAF$groups) for (g in levels(groups)) { tmp <- lapply(split.data.frame(EAF[groups == g,], as.factor(EAF[groups == g, 3])), function(x) { as.matrix(x[, 1:2, drop=FALSE]) }) attsurfs <- c(attsurfs, tmp) } } # FIXME: rm(EAF) to save memory ? attsurfs <- lapply(attsurfs, matrix_maximise, maximise = maximise) } # FIXME: We should take the range from the attsurfs to not make x mandatory. xlim <- get_xylim(xlim, maximise[1], data = x[,1]) ylim <- get_xylim(ylim, maximise[2], data = x[,2]) extreme <- get_extremes(xlim, ylim, maximise, log) # FIXME: Find a better way to handle different x-y scale. yscale <- 1 ## if (ymaximise) { ## #yscale <- 60 ## yreverse <- -1 ## attsurfs <- lapply (attsurfs, function (x) ## { x[,2] <- yreverse * x[,2] / yscale; x }) ## ylim <- yreverse * ylim / yscale ## extreme[2] <- yreverse * extreme[2] ## if (log == "y") extreme[2] <- 1 ## } ## lab' A numerical vector of the form 'c(x, y, len)' which modifies ## the default way that axes are annotated. The values of 'x' ## and 'y' give the (approximate) number of tickmarks on the x ## and y axes and 'len' specifies the label length. The default ## is 'c(5, 5, 7)'. Note that this only affects the way the ## parameters 'xaxp' and 'yaxp' are set when the user coordinate ## system is set up, and is not consulted when axes are drawn. ## 'len' _is unimplemented_ in R. args <- list(...) args <- args[names(args) %in% c("cex", "cex.lab", "cex.axis", "lab")] par_default <- list(cex = 1.0, cex.lab = 1.1, cex.axis = 1.0, lab = c(10,5,7)) par_default <- modifyList(par_default, args) op <- par(par_default) on.exit(par(op)) plot(xlim, ylim, type = "n", xlab = "", ylab = "", xlim = xlim, ylim = ylim, log = log, axes = FALSE, las = las, panel.first = ({ if (axes) { plot_eaf_axis(xaxis_side, xlab, las = las, sci.notation = sci.notation) plot_eaf_axis(yaxis_side, ylab, las = las, sci.notation = sci.notation, # FIXME: eafplot uses 2.2, why the difference? line = 2.75) } # FIXME: Perhaps have a function plot.eaf.lines that computes # several percentiles for a single algorithm and then calls # points() or polygon() as appropriate to add attainment # surfaces to an existing plot. This way we can factor out # the code below and use it in plot.eaf and plot.eafdiff if (type == "area") { # FIXME (Proposition): allow the user to provide the palette colors? if (length(col) == 2) { colfunc <- colorRampPalette(col) col <- colfunc(length(attsurfs)) } else if (length(col) != length(attsurfs)) { stop ("length(col) != 2, but with 'type=area', eafplot.default needs just two colors") } plot_eaf_full_area(attsurfs, extreme, maximise, col = col) } else { ## Recycle values lwd <- rep(lwd, length=length(attsurfs)) lty <- rep(lty, length=length(attsurfs)) col <- rep(col, length=length(attsurfs)) if (!is.null(pch)) pch <- rep(pch, length=length(attsurfs)) plot_eaf_full_lines(attsurfs, extreme, maximise, col = col, lty = lty, lwd = lwd, pch = pch, cex = cex.pch) } }), ...) if (!is.null (extra.points)) { if (!is.list (extra.points[[1]])) { extra.name <- deparse(substitute(extra.points)) extra.points <- list(extra.points) names(extra.points) <- extra.name } ## Recycle values extra.length <- length(extra.points) extra.lwd <- rep(extra.lwd, length=extra.length) extra.lty <- rep(extra.lty, length=extra.length) extra.col <- rep(extra.col, length=extra.length) extra.pch <- rep(extra.pch, length=extra.length) if (is.null(extra.legend)) { extra.legend <- names(extra.points) if (is.null(extra.legend)) extra.legend <- paste0("extra.points ", 1:length(extra.points)) } for (i in 1:length(extra.points)) { if (any(is.na(extra.points[[i]][,1]))) { if (is.na(extra.lty[i])) extra.lty <- "dashed" ## Extra points are given in the correct order so no reverse extra.points[[i]][,2] <- extra.points[[i]][,2] / yscale abline(h=extra.points[[i]][,2], lwd = extra.lwd[i], col = extra.col[i], lty = extra.lty[i]) extra.pch[i] <- NA } else if (any(is.na(extra.points[[i]][,2]))) { if (is.na(extra.lty[i])) extra.lty <- "dashed" abline(v=extra.points[[i]][,1], lwd = extra.lwd[i], col = extra.col[i], lty = extra.lty[i]) extra.pch[i] <- NA } else { ## Extra points are given in the correct order so no reverse extra.points[[i]][,2] <- extra.points[[i]][,2] / yscale if (!is.na(extra.pch[i])) points (extra.points[[i]], type = "p", pch = extra.pch[i], col = extra.col[i], cex = cex.pch) if (!is.na(extra.lty[i])) points (extra.points[[i]], type = "s", lty = extra.lty[i], col = extra.col[i], lwd = extra.lwd[i]) } lwd <- c(lwd, extra.lwd[i]) lty <- c(lty, extra.lty[i]) col <- c(col, extra.col[i]) pch <- c(pch, extra.pch[i]) if (is.null(extra.legend[i])) extra.legend[i] } } # Setup legend. if (is.null(legend.txt) && !is.null(percentiles)) { legend.txt <- paste0(percentiles, "%") legend.txt <- sub("^0%$", "best", legend.txt) legend.txt <- sub("^50%$", "median", legend.txt) legend.txt <- sub("^100%$", "worst", legend.txt) if (!is.null(groups)) { groups <- factor(groups) legend.txt <- as.vector(t(outer(levels(groups), legend.txt, paste))) } } legend.txt <- c(legend.txt, extra.legend) if (!is.null(legend.txt) && is.na(pmatch(legend.pos,"none"))) { if (type == "area") { legend(x = legend.pos, y = NULL, legend = legend.txt, fill = c(col, "#FFFFFF"), bg="white",bty="n", xjust=0, yjust=0, cex=0.9) } else { legend(legend.pos, legend = legend.txt, xjust=1, yjust=1, bty="n", lty = lty, lwd = lwd, pch = pch, col = col, merge=T) } } box() invisible(attsurfs) } prettySciNotation <- function(x, digits = 1L) { if (length(x) > 1L) { return(append(prettySciNotation(x[1]), prettySciNotation(x[-1]))) } if (!x) return(0) exponent <- floor(log10(x)) base <- round(x / 10^exponent, digits) as.expression(substitute(base %*% 10^exponent, list(base = base, exponent = exponent))) } axis_side <- function(side) { if (!is.character(side)) return(side) switch(side, below = 1, left = 2, above = 3, right = 4) } plot_eaf_axis <- function(side, lab, las, col = 'lightgray', lty = 'dotted', lwd = par("lwd"), line = 2.1, sci.notation = FALSE) { side <- axis_side(side) ## FIXME: Do we still need lwd=0.5, lty="26" to work-around for R bug? at <- axTicks(if (side %% 2 == 0) 2 else 1) labels <- if (sci.notation) prettySciNotation(at) else formatC(at, format = "g") ## if (log == "y") { ## ## Custom log axis (like gnuplot but in R is hard) ## max.pow <- 6 ## at <- c(1, 5, 10, 50, 100, 500, 1000, 1500, 10^c(4:max.pow)) ## labels <- c(1, 5, 10, 50, 100, 500, 1000, 1500, ## parse(text = paste("10^", 4:max.pow, sep = ""))) ## #at <- c(60, 120, 180, 240, 300, 480, 600, 900, 1200, 1440) ## #labels <- formatC(at,format="g") ## ## Now do the minor ticks, at 1/10 of each power of 10 interval ## ##at.minor <- 2:9 * rep(c(10^c(1:max.pow)) / 10, each = length(2:9)) ## at.minor <- 1:10 * rep(c(10^c(1:max.pow)) / 10, each = length(1:10)) ## axis (yaxis_side, at = at.minor, tcl = -0.25, labels = FALSE, las=las) ## axis (yaxis_side, at = at.minor, labels = FALSE, tck=1, ## col='lightgray', lty='dotted', lwd=par("lwd")) ## } ## tck=1 draws the horizontal grid lines (grid() is seriously broken). axis(side, at=at, labels=FALSE, tck = 1, col='lightgray', lty = 'dotted', lwd = par("lwd")) axis(side, at=at, labels=labels, las = las) mtext(lab, side, line = line, cex = par("cex") * par("cex.axis"), las = 0) } plot_eaf_full_lines <- function(attsurfs, extreme, maximise, col, lty, lwd, pch = NULL, cex = par("cex")) { ## Recycle values lwd <- rep(lwd, length = length(attsurfs)) lty <- rep(lty, length = length(attsurfs)) col <- rep(col, length = length(attsurfs)) if (!is.null(pch)) pch <- rep(pch, length = length(attsurfs)) attsurfs = lapply(attsurfs, add_extremes, extreme, maximise) for (k in seq_along(attsurfs)) { # FIXME: Is there a way to plot points and steps in one call? if (!is.null(pch)) points(attsurfs[[k]], type = "p", col = col[k], pch = pch[k], cex = cex) points(attsurfs[[k]], type = "s", col = col[k], lty = lty[k], lwd = lwd[k]) } } plot_eaf_full_area <- function(attsurfs, extreme, maximise, col) { stopifnot(length(attsurfs) == length(col)) for (i in seq_along(attsurfs)) { poli <- add_extremes(points_steps(attsurfs[[i]]), extreme, maximise) poli <- rbind(poli, extreme) polygon(poli[,1], poli[,2], border = NA, col = col[i]) } } plot_eafdiff_side <- function (eafdiff, attsurfs = list(), col, side = stop("Argument 'side' is required"), type = "point", xlim = NULL, ylim = NULL, log = "", las = par("las"), full.eaf = FALSE, title = "", maximise = c(FALSE, FALSE), xlab = "objective 1", ylab = "objective 2", sci.notation = FALSE, ...) { type <- match.arg (type, c("point", "area")) maximise <- as.logical(maximise) side <- match.arg (side, c("left", "right")) xaxis_side <- if (side == "left") "below" else "above" yaxis_side <- if (side == "left") "left" else "right" # For !full.eaf && type == "area", str(eafdiff) is a polygon: ## $ num [, 1:2] ## - attr(*, "col")= num [] # Colors are correct for !full.eaf && type == "area" if (full.eaf || type == "point") { # FIXME: This is wrong, we should color (0.0, 1] with col[1], then (1, 2] # with col[1], etc, so that we never color the value 0.0 but we always # color the maximum value color without having to force it. # Why flooring and not ceiling? If a point has value 2.05, it should # be painted with color 2 rather than 3. # +1 because col[1] is white ([0,1)). eafdiff[,3] <- floor(eafdiff[,3]) + 1 if (length(unique(eafdiff[,3])) > length(col)) { stop ("Too few colors: length(unique(eafdiff[,3])) > length(col)") } } # We do not paint with the same color as the background since this # will override the grid lines. col[col %in% c("white", "#FFFFFF")] <- "transparent" extreme <- get_extremes(xlim, ylim, maximise, log) yscale <- 1 ## FIXME log == "y" and yscaling # yscale <- 60 ## if (yscale != 1) { ## # This doesn't work with polygons. ## stopifnot (full.eaf || type == "point") ## eafdiff[,2] <- eafdiff[,2] / yscale ## attsurfs <- lapply (attsurfs, function (x) ## { x[,2] <- x[,2] / yscale; x }) ## ylim <- ylim / yscale ## if (log == "y") extreme[2] <- 1 ## } plot(xlim, ylim, type = "n", xlab = "", ylab = "", xlim = xlim, ylim = ylim, log = log, axes = FALSE, las = las, panel.first = ({ plot_eaf_axis (xaxis_side, xlab, las = las, sci.notation = sci.notation) plot_eaf_axis (yaxis_side, ylab, las = las, sci.notation = sci.notation, line = 2.2) if (nrow(eafdiff)) { if (type == "area") { if (full.eaf) { plot_eaf_full_area(split.data.frame(eafdiff[,1:2], eafdiff[,3]), extreme, maximise, col) } else { eafdiff[,1] <- rm_inf(eafdiff[,1], extreme[1]) eafdiff[,2] <- rm_inf(eafdiff[,2], extreme[2]) polycol <- attr(eafdiff, "col") #print(unique(polycol)) #print(length(col)) ## The maximum value should also be painted. # FIXME: How can this happen??? polycol[polycol > length(col)] <- length(col) ### For debugging: ## poly_id <- head(1 + cumsum(is.na(eafdiff[,1])),n=-1) ## for(i in which(polycol == 10)) { ## c_eafdiff <- eafdiff[i == poly_id, ] ## polygon(c_eafdiff[,1], c_eafdiff[,2], border = FALSE, col = col[polycol[i]]) ## } #print(eafdiff) #print(col[polycol]) # FIXME: This reduces the number of artifacts but increases the memory consumption of embedFonts(filename) until it crashes. #polygon(eafdiff[,1], eafdiff[,2], border = col[polycol], lwd=0.1, col = col[polycol]) polygon(eafdiff[,1], eafdiff[,2], border = col[polycol], col = col[polycol]) } } else { ## The maximum value should also be painted. eafdiff[eafdiff[,3] > length(col), 3] <- length(col) eafdiff <- eafdiff[order(eafdiff[,3], decreasing = FALSE), , drop=FALSE] points(eafdiff[,1], eafdiff[,2], col = col[eafdiff[,3]], type = "p", pch=20) } } }), ...) lty <- c("solid", "dashed") lwd <- c(1) if (type == "area" && full.eaf) { col <- c("black", "black", "white") } else { col <- c("black") } plot_eaf_full_lines(attsurfs, extreme, maximise, col = col, lty = lty, lwd = lwd) mtext(title, 1, line = 3.5, cex = par("cex.lab"), las = 0, font = 2) box() } #' Plot empirical attainment function differences #' #' Plot the differences between the empirical attainment functions (EAFs) of two #' data sets as a two-panel plot, where the left side shows the values of #' the left EAF minus the right EAF and the right side shows the #' differences in the other direction. #' #' @param data.left,data.right Data frames corresponding to the input data of #' left and right sides, respectively. Each data frame has at least three #' columns, the third one being the set of each point. See also #' [read_datasets()]. #' #' @param col A character vector of three colors for the magnitude of the #' differences of 0, 0.5, and 1. Intermediate colors are computed #' automatically given the value of `intervals`. Alternatively, a function #' such as [viridisLite::viridis()] that generates a colormap given an integer #' argument. #' #' @param intervals (`integer(1)`|`character()`) \cr The #' absolute range of the differences \eqn{[0, 1]} is partitioned into the number #' of intervals provided. If an integer is provided, then labels for each #' interval are computed automatically. If a character vector is #' provided, its length is taken as the number of intervals. #' #' @param percentiles The percentiles of the EAF of each side that will be #' plotted as attainment surfaces. `NA` does not plot any. See #' [eafplot()]. #' #' @param full.eaf Whether to plot the EAF of each side instead of the #' differences between the EAFs. #' #' @param type Whether the EAF differences are plotted as points #' (\samp{points}) or whether to color the areas that have at least a #' certain value (\samp{area}). #' #' @param legend.pos The position of the legend. See [legend()]. A value of #' `"none"` hides the legend. #' #' @param title.left,title.right Title for left and right panels, respectively. #' #' @param xlim,ylim,cex,cex.lab,cex.axis Graphical parameters, see #' [plot.default()]. #' #' @template arg_maximise #' #' @param grand.lines Whether to plot the grand-best and grand-worst #' attainment surfaces. #' #' @param sci.notation Generate prettier labels #' #' @param left.panel.last,right.panel.last An expression to be evaluated after #' plotting has taken place on each panel (left or right). This can be useful #' for adding points or text to either panel. Note that this works by lazy #' evaluation: passing this argument from other `plot` methods may well #' not work since it may be evaluated too early. #' #' @param ... Other graphical parameters are passed down to #' [plot.default()]. #' #' @details #' This function calculates the differences between the EAFs of two #' data sets, and plots on the left the differences in favour #' of the left data set, and on the right the differences in favour of #' the right data set. By default, it also plots the grand best and worst #' attainment surfaces, that is, the 0%- and 100%-attainment surfaces #' over all data. These two surfaces delimit the area where differences #' may exist. In addition, it also plots the 50%-attainment surface of #' each data set. #' #' With `type = "point"`, only the points where there is a change in #' the value of the EAF difference are plotted. This means that for areas #' where the EAF differences stays constant, the region will appear in #' white even if the value of the differences in that region is #' large. This explains "white holes" surrounded by black #' points. #' #' With `type = "area"`, the area where the EAF differences has a #' certain value is plotted. The idea for the algorithm to compute the #' areas was provided by Carlos M. Fonseca. The implementation uses R #' polygons, which some PDF viewers may have trouble rendering correctly #' (See #' \url{https://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-are-there-unwanted-borders}). Plots (should) look correct when printed. #' #' Large differences that appear when using `type = "point"` may #' seem to disappear when using `type = "area"`. The explanation is #' the points size is independent of the axes range, therefore, the #' plotted points may seem to cover a much larger area than the actual #' number of points. On the other hand, the areas size is plotted with #' respect to the objective space, without any extra borders. If the #' range of an area becomes smaller than one-pixel, it won't be #' visible. As a consequence, zooming in or out certain regions of the plots #' does not change the apparent size of the points, whereas it affects #' considerably the apparent size of the areas. #' #' #' @return Returns a representation of the EAF differences (invisibly). #' #' @seealso [eafplot()] [pdf_crop()] #' #' @examples #' ## NOTE: The plots in the website look squashed because of how pkgdown #' ## generates them. They should look fine when you generate them yourself. #' extdata_dir <- system.file(package="eaf", "extdata") #' A1 <- read_datasets(file.path(extdata_dir, "ALG_1_dat.xz")) #' A2 <- read_datasets(file.path(extdata_dir, "ALG_2_dat.xz")) #' \donttest{# These take time #' eafdiffplot(A1, A2, full.eaf = TRUE) #' if (requireNamespace("viridisLite", quietly=TRUE)) { #' viridis_r <- function(n) viridisLite::viridis(n, direction=-1) #' eafdiffplot(A1, A2, type = "area", col = viridis_r) #' } else { #' eafdiffplot(A1, A2, type = "area") #' } #' A1 <- read_datasets(file.path(extdata_dir, "wrots_l100w10_dat")) #' A2 <- read_datasets(file.path(extdata_dir, "wrots_l10w100_dat")) #' eafdiffplot(A1, A2, type = "point", sci.notation = TRUE, cex.axis=0.6) #' } #' # A more complex example #' DIFF <- eafdiffplot(A1, A2, col = c("white", "blue", "red"), intervals = 5, #' type = "point", #' title.left=expression("W-RoTS," ~ lambda==100 * "," ~ omega==10), #' title.right=expression("W-RoTS," ~ lambda==10 * "," ~ omega==100), #' right.panel.last={ #' abline(a = 0, b = 1, col = "red", lty = "dashed")}) #' DIFF$right[,3] <- -DIFF$right[,3] #' #' ## Save the values to a file. #' # write.table(rbind(DIFF$left,DIFF$right), #' # file = "wrots_l100w10_dat-wrots_l10w100_dat-diff.txt", #' # quote = FALSE, row.names = FALSE, col.names = FALSE) #' #' @concept visualisation #'@export eafdiffplot <- function(data.left, data.right, col = c("#FFFFFF", "#808080","#000000"), intervals = 5, percentiles = c(50), full.eaf = FALSE, type = "area", legend.pos = if (full.eaf) "bottomleft" else "topright", title.left = deparse(substitute(data.left)), title.right = deparse(substitute(data.right)), xlim = NULL, ylim = NULL, cex = par("cex"), cex.lab = par("cex.lab"), cex.axis = par("cex.axis"), maximise = c(FALSE, FALSE), grand.lines = TRUE, sci.notation = FALSE, left.panel.last = NULL, right.panel.last = NULL, ...) { type <- match.arg (type, c("point", "area")) # FIXME: check that it is either an integer or a character vector. if (length(intervals) == 1) { intervals <- seq_intervals_labels( round(seq(0,1 , length.out = 1 + intervals), 4), digits = 1) } if (is.function(col)) { # It is a color-map, like viridis() col <- col(length(intervals)) } else { if (length(col) != 3) { stop ("'col' is either three colors (minimum, medium maximum) or a function that produces a colormap") } col <- colorRampPalette(col)(length(intervals)) } # FIXME: The lowest color must be white (it should be the background). col[1] <- "white" title.left <- title.left title.right <- title.right maximise <- as.logical(maximise) if (length(maximise) == 1) { maximise <- rep_len(maximise, 2) } else if (length(maximise) != 2) { stop("length of maximise must be either 1 or 2") } data.left <- check_eaf_data(data.left) data.left[,1:2] <- matrix_maximise(data.left[,1:2, drop=FALSE], maximise) data.right <- check_eaf_data(data.right) data.right[,1:2] <- matrix_maximise(data.right[,1:2, drop=FALSE], maximise) attsurfs.left <- attsurfs.right <- list() if (!any(is.na(percentiles))) { attsurfs.left <- compute_eaf_as_list (data.left, percentiles) attsurfs.left <- lapply(attsurfs.left, matrix_maximise, maximise = maximise) attsurfs.right <- compute_eaf_as_list (data.right, percentiles) attsurfs.right <- lapply(attsurfs.right, matrix_maximise, maximise = maximise) } # FIXME: We do not need this for the full EAF. # Merge the data data.combined <- rbind_datasets(data.left, data.right) def.par <- par(no.readonly = TRUE) # save default, for resetting... on.exit(par(def.par)) if (full.eaf) { if (type == "area") { lower.boundaries <- 0:(length(intervals)-1) * 100 / length(intervals) diff_left <- compute_eaf (data.left, percentiles = lower.boundaries) diff_right <- compute_eaf (data.right, percentiles = lower.boundaries) } else if (type == "point") { diff_left <- compute_eaf (data.left) diff_right <- compute_eaf (data.right) # Since plot_eafdiff_side uses floor to calculate the color, and # we want color[100] == color[99]. diff_left[diff_left[,3] == 100, 3] <- 99 diff_right[diff_right[,3] == 100, 3] <- 99 } # Convert percentile into color index diff_left[,3] <- diff_left[,3] * length(intervals) / 100 diff_right[,3] <- diff_right[,3] * length(intervals) / 100 #remove(data.left,data.right,data.combined) # Free memory? } else { if (type == "area") { DIFF <- compute_eafdiff_polygon (data.combined, intervals = length(intervals)) } else if (type == "point") { #remove(data.left,data.right) # Free memory? DIFF <- compute_eafdiff (data.combined, intervals = length(intervals)) #remove(data.combined) # Free memory? } diff_left <- DIFF$left diff_right <- DIFF$right } # FIXME: This can be avoided and just taken from the full EAF. grand.attsurf <- compute_eaf_as_list (data.combined, c(0, 100)) grand.best <- grand.attsurf[["0"]] grand.worst <- grand.attsurf[["100"]] xlim <- get_xylim(xlim, maximise[1], data = c(grand.best[,1], grand.worst[,1], range_finite(diff_left[,1]), range_finite(diff_right[,1]))) ylim <- get_xylim(ylim, maximise[2], data = c(grand.best[,2], grand.worst[,2], range_finite(diff_left[,2]), range_finite(diff_right[,2]))) grand.best <- matrix_maximise(grand.best, maximise) grand.worst <- matrix_maximise(grand.worst, maximise) diff_left[,1:2] <- matrix_maximise(diff_left[,1:2, drop=FALSE], maximise) diff_right[,1:2] <- matrix_maximise(diff_right[,1:2, drop=FALSE], maximise) # FIXME: This does not generate empty space between the two plots, but the # plots are not squared. layout(matrix(1:2, ncol=2, byrow=TRUE), respect=TRUE) bottommar <- 5 topmar <- 4 leftmar <- 4 rightmar <- 4 # FIXME: This generates empty spaces between the two plots. How to ensure # that the side-by-side plots are kept together? ## layout(matrix(1:2, ncol = 2)) ## par (pty = 's') # Force it to be square ## bottommar <- 5 ## topmar <- 4 ## leftmar <- 4 ## rightmar <- 4 # cex.axis is multiplied by cex, but cex.lab is not. par(cex = cex, cex.lab = cex.lab, cex.axis = cex.axis , mar = c(bottommar, leftmar, topmar, 0) , lab = c(10,5,7) , las = 0 ) if (grand.lines) { attsurfs <- c(list(grand.best), attsurfs.left, list(grand.worst)) } else { attsurfs <- attsurfs.left } plot_eafdiff_side (diff_left, attsurfs = attsurfs, col = col, type = type, full.eaf = full.eaf, title = title.left, xlim = xlim, ylim = ylim, side = "left", maximise = maximise, sci.notation = sci.notation, ...) if (is.na(pmatch(legend.pos,"none"))){ #nchar(legend.pos) > 0 && !(legend.pos %in% c("no", "none"))) { legend(x = legend.pos, y = NULL, rev(intervals), rev(col), bg = "white", bty = "n", xjust=0, yjust=0, cex=0.85) } left.panel.last par(mar = c(bottommar, 0, topmar, rightmar)) if (grand.lines) { attsurfs <- c(list(grand.best), attsurfs.right, list(grand.worst)) } else { attsurfs <- attsurfs.right } plot_eafdiff_side (diff_right, attsurfs = attsurfs, col = col, type = type, full.eaf = full.eaf, title = title.right, xlim = xlim, ylim = ylim, side = "right", maximise = maximise, sci.notation = sci.notation, ...) right.panel.last invisible(list(left=diff_left, right=diff_right)) } # Create labels: # eaf:::seq_intervals_labels(seq(0,1, length.out=5), digits = 1) # "[0.0, 0.2)" "[0.2, 0.4)" "[0.4, 0.6)" "[0.6, 0.8)" "[0.8, 1.0]" # FIXME: Add examples and tests seq_intervals_labels <- function(s, first.open = FALSE, last.open = FALSE, digits = NULL) { # FIXME: This should use: # levels(cut(0, s, dig.lab=digits, include.lowest=TRUE, right=FALSE)) s <- formatC(s, digits = digits, format = if (is.null(digits)) "g" else "f") if (length(s) < 2) stop ("sequence must have at least 2 values") intervals <- paste0("[", s[-length(s)], ", ", s[-1], ")") if (first.open) substr(intervals[1], 0, 1) <- "(" if (!last.open) { len <- nchar(intervals[length(intervals)]) substr(intervals[length(intervals)], len, len+1) <- "]" } return(intervals) } #' @describeIn eafplot Formula interface #' #'@param formula A formula of the type: \code{time + cost ~ run | instance} #' will draw \code{time} on the x-axis and \code{cost} on the y-axis. If \code{instance} is #' present the plot is conditional to the instances. #' #'@param data Dataframe containing the fields mentioned in the formula and in groups. #'@export #'@concept visualisation eafplot.formula <- function(formula, data, groups = NULL, subset = NULL, ...) { ## formula of type time+cost~run|inst, groups=alg if (missing(formula)) stop("formula missing") if ((length(formula) != 3L) || (length(formula[[2L]]) != 3L)) stop("incorrect specification for 'formula'") mf <- modeltools::ModelEnvFormula(formula = formula, data = data, subset = subset, designMatrix = FALSE, responseMatrix = FALSE, ...) ### extract data from the ModelEnv object points <- mf@get("response") sets <- mf@get("input") cond <- NULL if (length(mf@formula) == 3L) cond <- as.list(mf@get("blocks")) groups <- eval(substitute(groups), data, environment(formula)) if (!is.null(groups) && !is.factor(groups)) stop("groups must be a factor") if (length(cond) == 0) { strip <- FALSE cond <- list(gl(1, length(points))) } condlevels <- lapply(cond, levels) cond.max.level <- unlist(lapply(cond, nlevels)) npackets <- prod(cond.max.level) panel.args <- vector(mode = "list", length = npackets) packet.sizes <- numeric(npackets) if (npackets > 1) { dim(packet.sizes) <- sapply(condlevels, length) dimnames(packet.sizes) <- lapply(condlevels, as.character) } cond.current.level <- rep(1, length(cond)) for (packet.number in seq_len(npackets)) { id <- .compute.packet(cond, cond.current.level) packet.sizes[packet.number] <- sum(id) panel.args[[packet.number]] <- list(points = as.matrix(points[id,]), sets = as.numeric(sets[id,]), groups=groups[id]) ## MARCO: I do not think we need to care about subscripts... or do we? #if (subscripts) # panel.args[[packet.number]]$subscripts <- # subscr[id] cond.current.level <- .cupdate(cond.current.level, cond.max.level) } # save default, for resetting... ## FIXME: I don't think this is doing the right thing. op <- par(mfrow = .check.layout(NULL,cond.max.level)[2:3], mar = c(4,4,1,1)+0.1) on.exit(par(op)) for (i in seq_len(length(panel.args))) { eafplot.default(panel.args[[i]]$points, panel.args[[i]]$sets, panel.args[[i]]$groups, ...) } invisible() } #' @describeIn eafplot List interface for lists of data.frames or matrices #' #'@export #'@concept visualisation eafplot.list <- function(x, ...) { if (!is.list(x)) stop("'x' must be a list of data.frames or matrices with exactly three columns") groups <- if (!is.null(names(x))) names(x) else 1:length(x) check_elem <- function(elem) { elem <- check_eaf_data(elem) if (ncol(elem) != 3L) stop("Each element of the list have exactly three columns. If you have grouping and conditioning variables, please consider using this format: 'eafplot.formula, data, ...)'") return(elem) } x <- lapply(x, check_elem) groups <- rep(groups, sapply(x, nrow)) x <- do.call(rbind, x) eafplot(as.matrix(x[,c(1L,2L)]), sets = as.numeric(as.factor(x[, 3L])), groups = groups, ...) } eaf/R/zzz.R0000644000176200001440000000016414531422643012173 0ustar liggesusers.onLoad <- function(lib, pkg){ Rdpack::Rdpack_bibstyles(package = pkg, authors = "LongNames") invisible(NULL) } eaf/R/hv.R0000644000176200001440000000761114531422643011757 0ustar liggesusers#' Hypervolume metric #' #' Computes the hypervolume metric with respect to a given reference point #' assuming minimization of all objectives. #' #' @template arg_data #' #' @template arg_refpoint #' #' @template arg_maximise #' #' @return A single numerical value. #' #' @details The algorithm has \eqn{O(n^{d-2} \log n)} time and linear space #' complexity in the worst-case, but experimental results show that the #' pruning techniques used may reduce the time complexity even further. #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @references #' #' \insertRef{FonPaqLop06:hypervolume}{eaf} #' #' \insertRef{BeuFonLopPaqVah09:tec}{eaf} #' #' @examples #' #' data(SPEA2minstoptimeRichmond) #' # The second objective must be maximized #' # We calculate the hypervolume of the union of all sets. #' hypervolume(SPEA2minstoptimeRichmond[, 1:2], reference = c(250, 0), #' maximise = c(FALSE, TRUE)) #' #' @export #' @concept metrics hypervolume <- function(data, reference, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) stop("reference cannot be NULL") if (length(reference) == 1) reference <- rep_len(reference, nobjs) if (any(maximise)) { if (length(maximise) == 1) { data <- -data reference <- -reference } else if (length(maximise) != nobjs) { stop("length of maximise must be either 1 or ncol(data)") } data[,maximise] <- -data[,maximise] reference[maximise] <- -reference[maximise] } return(.Call(hypervolume_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(reference))) } #' Hypervolume contribution of a set of points #' #' Computes the hypervolume contribution of each point given a set of points #' with respect to a given reference point assuming minimization of all #' objectives. Dominated points have zero contribution. Duplicated points have #' zero contribution even if not dominated, because removing one of them does #' not change the hypervolume dominated by the remaining set. #' #' @template arg_data #' #' @template arg_refpoint #' #' @template arg_maximise #' #' @return ([numeric]) A numerical vector #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #'@seealso \code{\link{hypervolume}} #' #' @references #' #' \insertRef{FonPaqLop06:hypervolume}{eaf} #' #' \insertRef{BeuFonLopPaqVah09:tec}{eaf} #' #' @examples #' #' data(SPEA2minstoptimeRichmond) #' # The second objective must be maximized #' # We calculate the hypervolume contribution of each point of the union of all sets. #' hv_contributions(SPEA2minstoptimeRichmond[, 1:2], reference = c(250, 0), #' maximise = c(FALSE, TRUE)) #' #' # Duplicated points show zero contribution above, even if not #' # dominated. However, filter_dominated removes all duplicates except #' # one. Hence, there are more points below with nonzero contribution. #' hv_contributions(filter_dominated(SPEA2minstoptimeRichmond[, 1:2], maximise = c(FALSE, TRUE)), #' reference = c(250, 0), maximise = c(FALSE, TRUE)) #' #' @export #' @concept metrics hv_contributions <- function(data, reference, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) stop("reference cannot be NULL") if (length(reference) == 1) reference <- rep_len(reference, nobjs) if (any(maximise)) { if (length(maximise) == 1) { data <- -data reference <- -reference } else if (length(maximise) != nobjs) { stop("length of maximise must be either 1 or ncol(data)") } data[,maximise] <- -data[,maximise] reference[maximise] <- -reference[maximise] } return(.Call(hv_contributions_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(reference) )) } eaf/R/eaf-package.R0000644000176200001440000002063314531422643013465 0ustar liggesusers#' Computation and visualization of the empirical attainment function (EAF) for #' the analysis of random sets in multi-criterion optimization. #' #' The empirical attainment function (EAF) describes the probabilistic #' distribution of the outcomes obtained by a stochastic algorithm in the #' objective space. This package implements plots of summary #' attainment surfaces and differences between the first-order #' EAFs. These plots may be used for exploring the performance of #' stochastic local search algorithms for biobjective optimization #' problems and help in identifying certain algorithmic behaviors in a #' graphical way. #' #' @section Functions: #' #'\tabular{rl}{ #'[eafdiffplot()] \tab Empirical attainment function differences\cr #'[eafplot()] \tab Plot the Empirical Attainment Function for two objectives\cr #'[read_datasets()] \tab Read several data.frame sets #'} #' #' @section Data: #' #'\describe{ #'\item{[`gcp2x2`]}{ Metaheuristics for solving the Graph Vertex Coloring Problem} #'\item{[`HybridGA`]}{ Results of Hybrid GA on vanzyl and Richmond #'water networks} #'\item{[`SPEA2minstoptimeRichmond`]}{ Results of SPEA2 when minimising electrical cost and maximising the #'minimum idle time of pumps on Richmond water network} #'} #' #' Extras are available at `system.file(package="eaf")`: #' #'\tabular{rl}{ #' `extdata` \tab External data sets (see [`read_datasets`]) \cr #' `scripts/eaf` \tab EAF command-line program \cr #' `scripts/eafplot`\tab Perl script to generate plots of attainment surfaces\cr #' `scripts/eafdiff`\tab Perl script to generate plots of EAF differences #'} #' #' @import graphics #' @importFrom grDevices pdf colorRampPalette embedFonts gray #' @importFrom Rdpack reprompt #' @importFrom utils modifyList write.table tail #' #' @useDynLib eaf, .registration = TRUE #' #' @references #' #' \insertRef{Grunert01}{eaf} #' #' \insertRef{GruFon2009:emaa}{eaf} #' #' \insertRef{LopPaqStu09emaa}{eaf} #' #' \insertRef{FonGueLopPaq2011emo}{eaf} #' #' #'@examples #' data(gcp2x2) #' tabucol<-subset(gcp2x2, alg!="TSinN1") #' tabucol$alg<-tabucol$alg[drop=TRUE] #' eafplot(time+best~run,data=tabucol,subset=tabucol$inst=="DSJC500.5") #' #' eafplot(time+best~run|inst,groups=alg,data=gcp2x2) #' eafplot(time+best~run|inst,groups=alg,data=gcp2x2, #' percentiles = c(0,50,100), cex = 1.4, lty = c(2,1,2),lwd = c(2,2,2), #' col = c("black","blue","grey50")) #' #' extdata_path <- system.file(package="eaf","extdata") #' A1 <- read_datasets(file.path(extdata_path, "wrots_l100w10_dat")) #' A2 <- read_datasets(file.path(extdata_path, "wrots_l10w100_dat")) #' eafplot(A1, percentiles=c(50)) #' eafplot(list(A1=A1, A2=A2), percentiles=c(50)) #' eafdiffplot(A1, A2) #' ## Save to a PDF file #' # dev.copy2pdf(file="eaf.pdf", onefile=TRUE, width=5, height=4) #' @keywords internal #' @concept multivariate #' @concept optimize #' @concept time-quality algorithm profile #' @concept empirical attainment function "_PACKAGE" #' Results of Hybrid GA on vanzyl and Richmond water networks #' #' The data has the only goal of providing an example of use of eafplot. #' #'@format #' A list with two data frames, each of them with three columns, as #' produced by [read_datasets()]. #' \describe{ #' \item{`$vanzyl`}{data frame of results on vanzyl network} #' \item{`$richmond`}{data frame of results on Richmond #' network. The second column is filled with `NA`} #' } #' #'@source \insertRef{LopezIbanezPhD}{eaf}. #' #' @examples #'data(HybridGA) #'print(HybridGA$vanzyl) #'print(HybridGA$richmond) #' @keywords datasets "HybridGA" #'Results of SPEA2 when minimising electrical cost and maximising the #'minimum idle time of pumps on Richmond water network. #' #'The data has the only goal of providing an example of use of eafplot. #' #'@format #' A data frame as produced by [read_datasets()]. The second #' column measures time in seconds and corresponds to a maximisation problem. #' #' @source \insertRef{LopezIbanezPhD}{eaf} #' #'@examples #' data(HybridGA) #' data(SPEA2minstoptimeRichmond) #' SPEA2minstoptimeRichmond[,2] <- SPEA2minstoptimeRichmond[,2] / 60 #' eafplot (SPEA2minstoptimeRichmond, xlab = expression(C[E]), #' ylab = "Minimum idle time (minutes)", maximise = c(FALSE, TRUE), #' las = 1, log = "y", legend.pos = "bottomright") #' @keywords datasets "SPEA2minstoptimeRichmond" #' Results of SPEA2 with relative time-controlled triggers on Richmond water #' network. #' #' The data has the only goal of providing an example of use of eafplot. #' #'@format #' A data frame as produced by [read_datasets()]. #' #' @source \insertRef{LopezIbanezPhD}{eaf} #' #'@examples #'data(HybridGA) #'data(SPEA2relativeRichmond) #'eafplot (SPEA2relativeRichmond, percentiles = c(25, 50, 75), #' xlab = expression(C[E]), ylab = "Total switches", #' xlim = c(90, 140), ylim = c(0, 25), #' extra.points = HybridGA$richmond, extra.lty = "dashed", #' extra.legend = "Hybrid GA") #' @keywords datasets "SPEA2relativeRichmond" #'Results of SPEA2 with relative time-controlled triggers on Vanzyl's #'water network. #' #'The data has the only goal of providing an example of use of eafplot. #' #'@format #' A data frame as produced by [read_datasets()]. #' #'@source \insertRef{LopezIbanezPhD}{eaf} #' #'@examples #'data(HybridGA) #'data(SPEA2relativeVanzyl) #'eafplot(SPEA2relativeVanzyl, percentiles = c(25, 50, 75), #' xlab = expression(C[E]), ylab = "Total switches", xlim = c(320, 400), #' extra.points = HybridGA$vanzyl, extra.legend = "Hybrid GA") #' @keywords datasets "SPEA2relativeVanzyl" #' Metaheuristics for solving the Graph Vertex Coloring Problem #' #' Two metaheuristic algorithms, TabuCol (Hertz et al., 1987) and #' simulated annealing \citep{JohAraMcGSch1991}, to find a good #' approximation of the chromatic number of two random graphs. The data #' here has the only goal of providing an example of use of eafplot for #' comparing algorithm performance with respect to both time and quality #' when modelled as two objectives in trade off. #' #' @format #' A data frame with 3133 observations on the following 6 variables. #' \describe{ #' \item{`alg`}{a factor with levels `SAKempeFI` and `TSinN1`} #' \item{`inst`}{a factor with levels `DSJC500.5` and #' `DSJC500.9`. Instances are taken from the DIMACS repository.} #' \item{`run`}{a numeric vector indicating the run to #' which the observation belong. } #' \item{`best`}{a numeric vector indicating the best solution in #' number of colors found in the corresponding run up to that time.} #' \item{`time`}{a numeric vector indicating the time since the #' beginning of the run for each observation. A rescaling is applied.} #' \item{`titer`}{a numeric vector indicating iteration number #' corresponding to the observations.} #' } #' #'@details #' Each algorithm was run 10 times per graph registering the time and #' iteration number at which a new best solution was found. A time limit #' corresponding to 500*10^5 total iterations of TabuCol was imposed. The #' time was then normalized on a scale from 0 to 1 to make it instance #' independent. #' #'@source \insertRef{ChiarandiniPhD}{eaf} (page 138) #' #'@references #' A. Hertz and D. de Werra. Using Tabu Search Techniques for Graph #' Coloring. Computing, 1987, 39(4), 345-351. #' #' \insertAllCited{} #' #'@examples #' data(gcp2x2) #' @keywords datasets "gcp2x2" #' Conditional Pareto fronts obtained from Gaussian processes simulations. #' #' The data has the only goal of providing an example of use of [vorobT()] and #' [vorobDev()]. It has been obtained by fitting two Gaussian processes on 20 #' observations of a bi-objective problem, before generating conditional #' simulation of both GPs at different locations and extracting non-dominated #' values of coupled simulations. #' #' @format #' A data frame with 2967 observations on the following 3 variables. #' \describe{ #' \item{`f1`}{first objective values.} #' \item{`f2`}{second objective values.} #' \item{`set`}{indices of corresponding conditional Pareto fronts.} #' } #' #'@source #' #' \insertRef{BinGinRou2015gaupar}{eaf} #' #'@examples #' data(CPFs) #' #' res <- vorobT(CPFs, reference = c(2, 200)) #' eafplot(CPFs[,1:2], sets = CPFs[,3], percentiles = c(0, 20, 40, 60, 80, 100), #' col = gray(seq(0.8, 0.1, length.out = 6)^2), type = "area", #' legend.pos = "bottomleft", extra.points = res$VE, extra.col = "cyan") #'@keywords datasets "CPFs" eaf/R/interactive.R0000644000176200001440000001534714531422643013664 0ustar liggesusers#' Interactively choose according to empirical attainment function differences #' #' Creates the same plot as [eafdiffplot()] but waits for the user to click in #' one of the sides. Then it returns the rectangles the give the differences in #' favour of the chosen side. These rectangles may be used for interactive #' decision-making as shown in \citet{DiaLop2020ejor}. The function #' [choose_eafdiff()] may be used in a non-interactive context. #' #' @param data.left,data.right Data frames corresponding to the input data of #' left and right sides, respectively. Each data frame has at least three #' columns, the third one being the set of each point. See also #' [read_datasets()]. #' #' @param intervals (`integer(1)`|`character()`) \cr The absolute range of the #' differences \eqn{[0, 1]} is partitioned into the number of intervals #' provided. If an integer is provided, then labels for each interval are #' computed automatically. If a character vector is provided, its length is #' taken as the number of intervals. #' #' @template arg_maximise #' #' @param title.left,title.right Title for left and right panels, respectively. #' #' @param ... Other graphical parameters are passed down to #' [eafdiffplot()]. #' #' #' @return `matrix` where the first 4 columns give the coordinates of two #' corners of each rectangle and the last column. In both cases, the last #' column gives the positive differences in favor of the chosen side. #' #' @seealso [read_datasets()], [eafdiffplot()], [whv_rect()] #' #' @examples #' #' \donttest{ #' extdata_dir <- system.file(package="eaf", "extdata") #' A1 <- read_datasets(file.path(extdata_dir, "wrots_l100w10_dat")) #' A2 <- read_datasets(file.path(extdata_dir, "wrots_l10w100_dat")) #' if (interactive()) { #' rectangles <- choose_eafdiffplot(A1, A2, intervals = 5) #' } else { # Choose A1 #' rectangles <- eafdiff(A1, A2, intervals = 5, rectangles = TRUE) #' rectangles <- choose_eafdiff(rectangles, left = TRUE) #' } #' reference <- c(max(A1[, 1], A2[, 1]), max(A1[, 2], A2[, 2])) #' x <- split.data.frame(A1[,1:2], A1[,3]) #' hv_A1 <- sapply(split.data.frame(A1[, 1:2], A1[, 3]), #' hypervolume, reference=reference) #' hv_A2 <- sapply(split.data.frame(A2[, 1:2], A2[, 3]), #' hypervolume, reference=reference) #' boxplot(list(A1=hv_A1, A2=hv_A2), main = "Hypervolume") #' #' whv_A1 <- sapply(split.data.frame(A1[, 1:2], A1[, 3]), #' whv_rect, rectangles=rectangles, reference=reference) #' whv_A2 <- sapply(split.data.frame(A2[, 1:2], A2[, 3]), #' whv_rect, rectangles=rectangles, reference=reference) #' boxplot(list(A1=whv_A1, A2=whv_A2), main = "Weighted hypervolume") #' } #' #'@references #' \insertAllCited{} #' @concept visualisation #' @export choose_eafdiffplot <- function(data.left, data.right, intervals = 5, maximise = c(FALSE, FALSE), title.left = deparse(substitute(data.left)), title.right = deparse(substitute(data.right)), ...) { op <- options(locatorBell = FALSE) on.exit(options(op)) eafdiffplot(data.left, data.right, title.left= title.left, title.right = title.right, intervals = intervals, maximise = maximise, ...) # FIXME: Avoid calculating eafdiff twice. DIFF <- eafdiff(data.left, data.right, intervals = intervals, maximise = maximise, rectangles = TRUE) coord <- grid::grid.locator("npc") left <- coord$x[[1]] < 0.5 if (left) cat("LEFT!\n") else cat("RIGHT!\n") choose_eafdiff(DIFF, left=left) } #' Identify largest EAF differences #' #' Given a list of datasets, return the indexes of the pair with the largest #' EAF differences according to the method proposed by \citet{DiaLop2020ejor}. #' #' #' @param data (`list(1)`) A list of matrices with at least 3 columns #' #' @template arg_maximise #' #' @param intervals (`integer(1)`) \cr The absolute range of the differences #' \eqn{[0, 1]} is partitioned into the number of intervals provided. #' #' @template arg_refpoint #' #' @template arg_ideal_null #' #' @return (`list()`) A list with two components `pair` and `value`. #' #'@examples #' # FIXME: This example is too large, we need a smaller one. #' files <- c("wrots_l100w10_dat","wrots_l10w100_dat") #' data <- lapply(files, function(x) #' read_datasets(file.path(system.file(package="eaf"), #' "extdata", x))) #' nadir <- apply(do.call(rbind, data)[,1:2], 2, max) #' x <- largest_eafdiff(data, reference = nadir) #' str(x) #' #'@references #' \insertAllCited{} #' #'@concept eaf #'@export largest_eafdiff <- function(data, maximise = FALSE, intervals = 5, reference, ideal = NULL) { nobjs <- 2 maximise <- as.logical(rep_len(maximise, nobjs)) if (nobjs != 2) stop("Only 2 objectives currently supported") n <- length(data) stopifnot(n > 1) best_pair <- NULL best_value <- 0 if (is.null(ideal)) { # This should be equivalent to # cbind(c(range(data[[1]][,1]),range(data[[2]][,1])), # c(range(data[[1]][,2]),range(data[[2]][,2]))) data_agg <- t(do.call(cbind, lapply(data, function(x) matrixStats::colRanges(x[,1:nobjs])))) ideal <- get_ideal(data_agg, maximise = maximise) } # Convert to a 1-row matrix if (is.null(dim(ideal))) dim(ideal) <- c(1,nobjs) for (a in 1:(n-1)) { for (b in (a+1):n) { DIFF <- eafdiff(data[[a]], data[[b]], intervals = intervals, maximise = maximise, rectangles = TRUE) # Set color to 1 a_rectangles <- DIFF[ DIFF[, 5] >= 1L, , drop = FALSE] a_rectangles[, ncol(a_rectangles)] <- 1 a_value <- whv_rect(ideal, a_rectangles, reference, maximise) b_rectangles <- DIFF[ DIFF[, 5] <= -1L, , drop = FALSE] b_rectangles[, ncol(b_rectangles)] <- 1 b_value <- whv_rect(ideal, b_rectangles, reference, maximise) value <- min(a_value, b_value) if (value > best_value) { best_value <- value best_pair <- c(a, b) } } } list(pair=best_pair, value = best_value) } #' @param x (`matrix()`) Matrix of rectangles representing EAF differences #' (returned by [eafdiff()] with `rectangles=TRUE`). #' #' @param left (`logical(1)`) With `left=TRUE` return the rectangles with #' positive differences, otherwise return those with negative differences but #' differences are converted to positive. #' #' @rdname choose_eafdiffplot #'@concept eaf #'@export choose_eafdiff <- function(x, left = stop("'left' must be either TRUE or FALSE")) { if (left) return (x[ x[, ncol(x)] > 0L, , drop = FALSE]) x <- x[ x[, ncol(x)] < 0L, , drop = FALSE] # We always return positive colors. x[, ncol(x)] <- abs(x[, ncol(x)]) x } eaf/R/read_datasets.R0000644000176200001440000001005514531422643014141 0ustar liggesusers#' Read several data sets #' #' Reads a text file in table format and creates a matrix from it. The file #' may contain several sets, separated by empty lines. Lines starting by #' `'#'` are considered comments and treated as empty lines. The function #' adds an additional column `set` to indicate to which set each row #' belongs. #' #' @param file (`character()`) \cr Filename that contains the data. Each row #' of the table appears as one line of the file. If it does not contain an #' \emph{absolute} path, the file name is \emph{relative} to the current #' working directory, \code{\link[base]{getwd}()}. Tilde-expansion is #' performed where supported. Files compressed with `xz` are supported. #' #' @param col_names,col.names Vector of optional names for the variables. The #' default is to use \samp{"V"} followed by the column number. #' #' @param text (`character()`) \cr If `file` is not supplied and this is, #' then data are read from the value of `text` via a text connection. #' Notice that a literal string can be used to include (small) data sets #' within R code. #' #' @return (`matrix()`) containing a representation of the #' data in the file. An extra column `set` is added to indicate to #' which set each row belongs. #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @note There are several examples of data sets in #' `system.file(package="eaf","extdata")`. #' #' `read.data.sets()` is a deprecated alias. It will be removed in the next #' major release. #' #' @section Warning: #' A known limitation is that the input file must use newline characters #' native to the host system, otherwise they will be, possibly silently, #' misinterpreted. In GNU/Linux the program `dos2unix` may be used #' to fix newline characters. #' #'@seealso \code{\link[utils]{read.table}}, [eafplot()], [eafdiffplot()] #' #'@examples #' extdata_path <- system.file(package="eaf","extdata") #' A1 <- read_datasets(file.path(extdata_path,"ALG_1_dat.xz")) #' str(A1) #' #' read_datasets(text="1 2\n3 4\n\n5 6\n7 8\n", col_names=c("obj1", "obj2")) #' #' @keywords file #' @export read_datasets <- function(file, col_names, text) { if (missing(file) && !missing(text)) { file <- tempfile() writeLines(text, file) on.exit(unlink(file)) } else { if (!file.exists(file)) stop("error: ", file, ": No such file or directory"); file <- normalizePath(file) if (grepl("\\.xz$", file)) { unc_file <- tempfile() writeLines(readLines(zz <- xzfile(file, "r")), unc_file) close(zz) file <- unc_file on.exit(unlink(file)) } } out <- .Call(read_data_sets, as.character(file)) if (missing(col_names)) col_names <- paste0("V", 1L:(ncol(out)-1)) colnames(out) <- c(col_names, "set") return(out) } #' @rdname read_datasets #' @export read.data.sets <- function(file, col.names) { .Deprecated("read_datasets") read_datasets(file=file, col_names=col.names) } #' Write data sets #' #' Write data sets to a file in the same format as [read_datasets()]. #' #' @param x The data set to write. The last column must be the set number. #' #' @param file either a character string naming a file or a connection open for #' writing. `""` indicates output to the console. #' #'@seealso \code{\link[utils]{write.table}}, [read_datasets()] #' #'@examples #' x <- read_datasets(text="1 2\n3 4\n\n5 6\n7 8\n", col_names=c("obj1", "obj2")) #' write_datasets(x) #' #' @keywords file #' @export write_datasets <- function(x, file = "") { setcol <- ncol(x) sets <- x[, setcol] nobjs <- setcol - 1L x <- x[, 1L:nobjs, drop=FALSE] col_names <- colnames(x) x <- split.data.frame(x[, 1L:nobjs, drop=FALSE], sets) append <- FALSE if (!is.null(col_names)) { cat(paste("#", paste0(col_names, collapse="\t"), "\n"), file = file, append = append) append <- TRUE } write.table(x[[1]], file = file, row.names=FALSE, col.names=FALSE, append = append) x <- tail(x, n=-1) for (xi in x) { cat("\n", file = file, append = TRUE) write.table(xi, file = file, row.names=FALSE, col.names=FALSE, append = TRUE) } } eaf/R/nondominated.R0000644000176200001440000000653514531422643014025 0ustar liggesuserscheck_dataset <- function(x) { name <- deparse(substitute(x)) if (length(dim(x)) != 2L) stop("'", name, "' must be a data.frame or a matrix") if (nrow(x) < 1L) stop("not enough points (rows) in '", name, "'") if (ncol(x) < 2) stop("'", name, "' must have at least 2 columns") x <- as.matrix(x) if (!is.numeric(x)) stop("'", name, "' must be numeric") return(x) } #' Identify, remove and rank dominated points according to Pareto optimality #' #' Identify nondominated points with `is_nondominated` and remove dominated #' ones with `filter_dominated`. #' #' @rdname nondominated #' #' @template arg_data #' #' @template arg_maximise #' #' @param keep_weakly If `FALSE`, return `FALSE` for any duplicates #' of nondominated points. #' #' @return `is_nondominated` returns a logical vector of the same length #' as the number of rows of `data`, where `TRUE` means that the #' point is not dominated by any other point. #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @examples #' path_A1 <- file.path(system.file(package="eaf"),"extdata","ALG_1_dat.xz") #' set <- read_datasets(path_A1)[,1:2] #' #' is_nondom <- is_nondominated(set) #' cat("There are ", sum(is_nondom), " nondominated points\n") #' #' plot(set, col = "blue", type = "p", pch = 20) #' ndset <- filter_dominated(set) #' points(ndset[order(ndset[,1]),], col = "red", pch = 21) #' #' @export #' @concept dominance is_nondominated <- function(data, maximise = FALSE, keep_weakly = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) maximise <- as.logical(rep_len(maximise, nobjs)) return(.Call(is_nondominated_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), maximise, as.logical(keep_weakly))) } #' @rdname nondominated #' @concept dominance #' @return `filter_dominated` returns a matrix or data.frame with only mutually nondominated points. #' @export filter_dominated <- function(data, maximise = FALSE, keep_weakly = FALSE) { return(data[is_nondominated(data, maximise = maximise, keep_weakly = keep_weakly), , drop = FALSE]) } #' @description `pareto_rank()` ranks points according to Pareto-optimality, #' which is also called nondominated sorting \citep{Deb02nsga2}. #' #' @rdname nondominated #' @concept dominance #' @return `pareto_rank()` returns an integer vector of the same length as #' the number of rows of `data`, where each value gives the rank of each #' point. #' #' @details `pareto_rank()` is meant to be used like `rank()`, but it #' assigns ranks according to Pareto dominance. Duplicated points are kept on #' the same front. When `ncol(data) == 2`, the code uses the \eqn{O(n #' \log n)} algorithm by \citet{Jen03}. #' #' @references #' #' \insertAllCited{} #' #' @examples #' ranks <- pareto_rank(set) #' colors <- colorRampPalette(c("red","yellow","springgreen","royalblue"))(max(ranks)) #' plot(set, col = colors[ranks], type = "p", pch = 20) #' @export pareto_rank <- function(data, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) maximise <- as.logical(rep_len(maximise, nobjs)) data <- matrix_maximise(data, maximise) return(.Call(pareto_ranking_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints))) } eaf/R/normalise.R0000644000176200001440000000350614531422643013332 0ustar liggesusers#' Normalise points #' #' Normalise points per coordinate to a range, e.g., \code{c(1,2)}, where the #' minimum value will correspond to 1 and the maximum to 2. If bounds are #' given, they are used for the normalisation. #' #' @template arg_data #' #' @param to_range Normalise values to this range. If the objective is #' maximised, it is normalised to \code{c(to_range[1], to_range[0])} #' instead. #' #' @param lower,upper Bounds on the values. If NA, the maximum and minimum #' values of each coordinate are used. #' #' @template arg_maximise #' #' @return A numerical matrix #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @examples #' #' data(SPEA2minstoptimeRichmond) #' # The second objective must be maximized #' head(SPEA2minstoptimeRichmond[, 1:2]) #' #' head(normalise(SPEA2minstoptimeRichmond[, 1:2], maximise = c(FALSE, TRUE))) #' #' head(normalise(SPEA2minstoptimeRichmond[, 1:2], to_range = c(0,1), maximise = c(FALSE, TRUE))) #' #' @export normalise <- function(data, to_range = c(1, 2), lower = NA, upper = NA, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) lower <- as.double(rep_len(lower, nobjs)) upper <- as.double(rep_len(upper, nobjs)) # Handle NA no.lower <- is.na(lower) no.upper <- is.na(upper) minmax <- matrixStats::colRanges(data) lower[no.lower] <- minmax[no.lower, 1L] upper[no.upper] <- minmax[no.upper, 2L] maximise <- as.logical(rep_len(maximise, nobjs)) if (length(to_range) != 2L) stop("to_range must be a vector of length 2") z <- t(.Call(normalise_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(to_range), lower, upper, maximise)) colnames(z) <- colnames(data) rownames(z) <- rownames(data) return(z) } eaf/R/igd.R0000644000176200001440000001722714531422643012111 0ustar liggesusers#' Inverted Generational Distance (IGD and IGD+) and Averaged Hausdorff Distance #' #' Functions to compute the inverted generational distance (IGD and IGD+) and #' the averaged Hausdorff distance between nondominated sets of points. #' #' @rdname igd #' @export #' @concept metrics #' #' @template arg_data #' #' @template arg_refset #' #' @template arg_maximise #' #' @return (`numeric(1)`) A single numerical value. #' #' @author Manuel \enc{López-Ibáñez}{Lopez-Ibanez} #' #' @details #' #' The generational distance (GD) of a set \eqn{A} is defined as the distance #' between each point \eqn{a \in A} and the closest point \eqn{r} in a #' reference set \eqn{R}, averaged over the size of \eqn{A}. Formally, #' #' \deqn{GD_p(A,R) = \left(\frac{1}{|A|}\sum_{a\in A}\min_{r\in R} d(a,r)^p\right)^{\frac{1}{p}} }{GD(A,R) = (1/|A|) * ( sum_{a in A} min_{r in R} d(a,r)^p )^(1/p)} #' where the distance in our implementation is the Euclidean distance: #' \deqn{d(a,r) = \sqrt{\sum_{k=1}^M (a_k - r_k)^2} }{d(a,r) = sqrt( sum_{k=1}^M (a_k - r_k)^2)} #' #' The inverted generational distance (IGD) is calculated as \eqn{IGD_p(A,R) = GD_p(R,A)}. #' #' The modified inverted generational distanced (IGD+) was proposed by #' \citet{IshMasTanNoj2015igd} to ensure that IGD+ is weakly Pareto compliant, #' similarly to [epsilon_additive()] or [epsilon_mult()]. It modifies the #' distance measure as: #' #' \deqn{d^+(r,a) = \sqrt{\sum_{k=1}^M (\max\{r_k - a_k, 0\})^2}}{d^+(r,a) = sqrt(sum_{k=1}^M (max {r_k - a_k, 0 })^2)} #' #' The average Hausdorff distance (\eqn{\Delta_p}) was proposed by #' \citet{SchEsqLarCoe2012tec} and it is calculated as: #' #' \deqn{\Delta_p(A,R) = \max\{ IGD_p(A,R), IGD_p(R,A) \}} #' #' IGDX \citep{ZhoZhaJin2009igdx} is the application of IGD to decision vectors #' instead of objective vectors to measure closeness and diversity in decision #' space. One can use the functions `igd()` or `igd_plus()` (recommended) #' directly, just passing the decision vectors as `data`. #' #' #' There are different formulations of the GD and IGD metrics in the literature #' that differ on the value of \eqn{p}, on the distance metric used and on #' whether the term \eqn{|A|^{-1}} is inside (as above) or outside the exponent #' \eqn{1/p}. GD was first proposed by \citet{VelLam1998gp} with \eqn{p=2} and #' the term \eqn{|A|^{-1}} outside the exponent. IGD seems to have been #' mentioned first by \citet{CoeSie2004igd}, however, some people also used the #' name D-metric for the same concept with \eqn{p=1} and later papers have #' often used IGD/GD with \eqn{p=1}. \citet{SchEsqLarCoe2012tec} proposed to #' place the term \eqn{|A|^{-1}} inside the exponent, as in the formulation #' shown above. This has a significant effect for GD and less so for IGD given #' a constant reference set. IGD+ also follows this formulation. We refer to #' \citet{IshMasTanNoj2015igd} and \citet{BezLopStu2017emo} for a more detailed #' historical perspective and a comparison of the various variants. #' #' Following \citet{IshMasTanNoj2015igd}, we always use \eqn{p=1} in our #' implementation of IGD and IGD+ because (1) it is the setting most used in #' recent works; (2) it makes irrelevant whether the term \eqn{|A|^{-1}} is #' inside or outside the exponent \eqn{1/p}; and (3) the meaning of IGD becomes #' the average Euclidean distance from each reference point to its nearest #' objective vector). It is also slightly faster to compute. #' #' GD should never be used directly to compare the quality of approximations to #' a Pareto front, as it often contradicts Pareto optimality (it is not weakly #' Pareto-compliant). We recommend IGD+ instead of IGD, since the latter #' contradicts Pareto optimality in some cases (see examples below) whereas #' IGD+ is weakly Pareto-compliant, but we implement IGD here because it is #' still popular due to historical reasons. #' #' The average Hausdorff distance (\eqn{\Delta_p(A,R)}) is also not weakly #' Pareto-compliant, as shown in the examples below. #' #' @references #' #' \insertAllCited{} #' #' @examples #' # Example 4 from Ishibuchi et al. (2015) #' ref <- matrix(c(10,0,6,1,2,2,1,6,0,10), ncol=2, byrow=TRUE) #' A <- matrix(c(4,2,3,3,2,4), ncol=2, byrow=TRUE) #' B <- matrix(c(8,2,4,4,2,8), ncol=2, byrow=TRUE) #' plot(ref, xlab=expression(f[1]), ylab=expression(f[2]), #' panel.first=grid(nx=NULL), pch=23, bg="gray", cex=1.5) #' points(A, pch=1, cex=1.5) #' points(B, pch=19, cex=1.5) #' legend("topright", legend=c("Reference", "A", "B"), pch=c(23,1,19), #' pt.bg="gray", bg="white", bty = "n", pt.cex=1.5, cex=1.2) #' cat("A is better than B in terms of Pareto optimality,\n however, IGD(A)=", #' igd(A, ref), "> IGD(B)=", igd(B, ref), #' "and AvgHausdorff(A)=", avg_hausdorff_dist(A, ref), #' "> AvgHausdorff(A)=", avg_hausdorff_dist(B, ref), #' ", which both contradict Pareto optimality.\nBy contrast, IGD+(A)=", #' igd_plus(A, ref), "< IGD+(B)=", igd_plus(B, ref), ", which is correct.\n") #' #' # A less trivial example. #' extdata_path <- system.file(package="eaf","extdata") #' path.A1 <- file.path(extdata_path, "ALG_1_dat.xz") #' path.A2 <- file.path(extdata_path, "ALG_2_dat.xz") #' A1 <- read_datasets(path.A1)[,1:2] #' A2 <- read_datasets(path.A2)[,1:2] #' ref <- filter_dominated(rbind(A1, A2)) #' igd(A1, ref) #' igd(A2, ref) #' #' @aliases IGDX igd <- function(data, reference, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) { stop("reference cannot be NULL") } reference <- check_dataset(reference) if (ncol(reference) != nobjs) stop("data and reference must have the same number of columns") reference_size <- nrow(reference) maximise <- as.logical(rep_len(maximise, nobjs)) return(.Call(igd_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(t(reference)), as.integer(reference_size), maximise)) } #' @rdname igd #' @export #' @concept metrics #' @examples #' # IGD+ (Pareto compliant) #' igd_plus(A1, ref) #' igd_plus(A2, ref) #' igd_plus <- function(data, reference, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) { stop("reference cannot be NULL") } reference <- check_dataset(reference) if (ncol(reference) != nobjs) stop("data and reference must have the same number of columns") reference_size <- nrow(reference) maximise <- as.logical(rep_len(maximise, nobjs)) return(.Call(igd_plus_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(t(reference)), as.integer(reference_size), maximise)) } #' @rdname igd #' @param p (`integer(1)`) Hausdorff distance parameter (default: `1L`). #' @concept metrics #' @examples #' # Average Haussdorff distance #' avg_hausdorff_dist(A1, ref) #' avg_hausdorff_dist(A2, ref) #' @export avg_hausdorff_dist <- function(data, reference, maximise = FALSE, p = 1L) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) { stop("reference cannot be NULL") } reference <- check_dataset(reference) if (ncol(reference) != nobjs) stop("data and reference must have the same number of columns") reference_size <- nrow(reference) maximise <- as.logical(rep_len(maximise, nobjs)) return(.Call(avg_hausdorff_dist_C, as.double(t(data)), as.integer(nobjs), as.integer(npoints), as.double(t(reference)), as.integer(reference_size), maximise, as.integer(p))) } eaf/R/vorob.R0000644000176200001440000001743114531422643012472 0ustar liggesusers#' Compute Vorob'ev threshold, expectation and deviation. Also, displaying the #' symmetric deviation function is possible. The symmetric deviation #' function is the probability for a given target in the objective space to #' belong to the symmetric difference between the Vorob'ev expectation and a #' realization of the (random) attained set. #' #' @title Vorob'ev computations #' @param x Either a matrix of data values, or a data frame, or a list of data #' frames of exactly three columns. The third column gives the set (run, #' sample, ...) identifier. #' @template arg_refpoint #' @return `vorobT` returns a list with elements `threshold`, #' `VE`, and `avg_hyp` (average hypervolume) #' @rdname Vorob #' @author Mickael Binois #' @examples #' data(CPFs) #' res <- vorobT(CPFs, reference = c(2, 200)) #' print(res$threshold) #' #' ## Display Vorob'ev expectation and attainment function #' # First style #' eafplot(CPFs[,1:2], sets = CPFs[,3], percentiles = c(0, 25, 50, 75, 100, res$threshold), #' main = substitute(paste("Empirical attainment function, ",beta,"* = ", a, "%"), #' list(a = formatC(res$threshold, digits = 2, format = "f")))) #' #' # Second style #' eafplot(CPFs[,1:2], sets = CPFs[,3], percentiles = c(0, 20, 40, 60, 80, 100), #' col = gray(seq(0.8, 0.1, length.out = 6)^0.5), type = "area", #' legend.pos = "bottomleft", extra.points = res$VE, extra.col = "cyan", #' extra.legend = "VE", extra.lty = "solid", extra.pch = NA, extra.lwd = 2, #' main = substitute(paste("Empirical attainment function, ",beta,"* = ", a, "%"), #' list(a = formatC(res$threshold, digits = 2, format = "f")))) #' @concept eaf #' @export vorobT <- function(x, reference) { x <- check_eaf_data(x) setcol <- ncol(x) nobjs <- setcol - 1L # First step: compute average hypervolume over conditional Pareto fronts avg_hyp <- mean(sapply(split.data.frame(x[,1:nobjs], x[, setcol]), hypervolume, reference = reference)) prev_hyp <- diff <- Inf # hypervolume of quantile at previous step a <- 0 b <- 100 while (diff != 0) { c <- (a + b) / 2 eaf_res <- eafs(x[,1:nobjs], x[,setcol], percentiles = c)[,1:nobjs] tmp <- hypervolume(eaf_res, reference = reference) if (tmp > avg_hyp) a <- c else b <- c diff <- prev_hyp - tmp prev_hyp <- tmp } return(list(threshold = c, VE = eaf_res, avg_hyp = avg_hyp)) } #' @concept eaf #' @rdname Vorob #' @return `vorobDev` returns the Vorob'ev deviation. #' @examples #' #' # Now print Vorob'ev deviation #' VD <- vorobDev(CPFs, res$VE, reference = c(2, 200)) #' print(VD) #' @export vorobDev <- function(x, VE, reference) { if (is.data.frame(x)) x <- as.matrix(x) if (is.null(VE)) VE <- vorobT(x, reference)$VE setcol <- ncol(x) nobjs <- setcol - 1L # Hypervolume of the symmetric difference between A and B: # 2 * H(AUB) - H(A) - H(B) H2 <- hypervolume(VE, reference = reference) x.split <- split.data.frame(x[,1:nobjs, drop=FALSE], x[,setcol]) H1 <- mean(sapply(x.split, hypervolume, reference = reference)) hv_union_VE <- function(y) hypervolume(rbind(y[, 1:nobjs, drop=FALSE], VE), reference = reference) VD <- 2 * sum(sapply(x.split, hv_union_VE)) nruns <- length(x.split) return((VD / nruns) - H1 - H2) } #' @rdname Vorob #' @references #' #' \insertRef{BinGinRou2015gaupar}{eaf} #' #' C. Chevalier (2013), Fast uncertainty reduction strategies relying on #' Gaussian process models, University of Bern, PhD thesis. #' #' I. Molchanov (2005), Theory of random sets, Springer. #' #' @param VE,threshold Vorob'ev expectation and threshold, e.g., as returned #' by [vorobT()]. #' @param nlevels number of levels in which is divided the range of the #' symmetric deviation. #' @param ve.col plotting parameters for the Vorob'ev expectation. #' @param xlim,ylim,main Graphical parameters, see #' [`plot.default()`][graphics::plot.default()]. #' @param legend.pos the position of the legend, see #' [`legend()`][graphics::legend()]. A value of `"none"` hides the legend. #' @param col.fun function that creates a vector of `n` colors, see #' [`heat.colors()`][grDevices::heat.colors()]. #' @examples #' # Now display the symmetric deviation function. #' symDifPlot(CPFs, res$VE, res$threshold, nlevels = 11) #' # Levels are adjusted automatically if too large. #' symDifPlot(CPFs, res$VE, res$threshold, nlevels = 200, legend.pos = "none") #' #' # Use a different palette. #' symDifPlot(CPFs, res$VE, res$threshold, nlevels = 11, col.fun = heat.colors) #' @concept eaf #' @export # FIXME: Implement "add=TRUE" option that just plots the lines,points or # surfaces and does not create the plot nor the legend (but returns the info # needed to create a legend), so that one can use the function to add stuff to # another plot. symDifPlot <- function(x, VE, threshold, nlevels = 11, ve.col = "blue", xlim = NULL, ylim = NULL, legend.pos = "topright", main = "Symmetric deviation function", col.fun = function(n) gray(seq(0, 0.9, length.out = n)^2)) { # FIXME: These maybe should be parameters of the function in the future. maximise <- c(FALSE, FALSE) xaxis_side <- "below" yaxis_side <- "left" log <- "" xlab <- colnames(x)[1] ylab <- colnames(x)[2] las <- par("las") sci.notation <- FALSE nlevels <- min(length(unique.default(x[, 3])) - 1, nlevels) threshold <- round(threshold, 4) seq.levs <- round(seq(0, 100, length.out = nlevels), 4) levs <- sort.int(unique.default(c(threshold, seq.levs))) attsurfs <- compute_eaf_as_list(x, percentiles = levs) # Denote p_n the attainment probability, the value of the symmetric # difference function is p_n if p_n < alpha (Vorob'ev threshold) and 1 - p_n # otherwise. Therefore, there is a sharp transition at alpha. For example, # for threshold = 44.5 and 5 levels, we color the following intervals: # # [0, 25) [25, 44.9) [44.9, 50) [50, 75) [75, 100] # # with the following colors: # # [0, 25) [25, 50) [50, 75) [25, 50) [0, 25) max.interval <- max(which(seq.levs < max(100 - threshold, threshold))) colscale <- seq.levs[1:max.interval] # Reversed so that darker colors are associated to higher values names(colscale) <- rev(col.fun(max.interval)) cols <- c(names(colscale[colscale < threshold]), rev(names(colscale[1:max(which(colscale < 100 - threshold))])), "#FFFFFF") # To have white after worst case names(levs) <- cols # FIXME: We should take the range from the attsurfs to not make x mandatory. xlim <- get_xylim(xlim, maximise[1], data = x[,1]) ylim <- get_xylim(ylim, maximise[2], data = x[,2]) extreme <- get_extremes(xlim, ylim, maximise, log = log) plot(xlim, ylim, type = "n", xlab = "", ylab = "", xlim = xlim, ylim = ylim, log = log, axes = FALSE, las = las, main = main, panel.first = { plot_eaf_full_area(attsurfs, extreme = extreme, maximise = maximise, col = cols) # We place the axis after so that we get grid lines. plot_eaf_axis (xaxis_side, xlab, las = las, sci.notation = sci.notation) plot_eaf_axis (yaxis_side, ylab, las = las, sci.notation = sci.notation, line = 2.2) plot_eaf_full_lines(list(VE), extreme, maximise, col = ve.col, lty = 1, lwd = 2) }) # Use first.open to print "(0,X)", because the color for 0 is white. intervals <- seq_intervals_labels(seq.levs, first.open = TRUE) intervals <- intervals[1:max.interval] names(intervals) <- names(colscale) #names(intervals) <- names(colscale[1:max.interval]) if (is.na(pmatch(legend.pos, "none"))) legend(legend.pos, legend = c("VE", intervals), fill = c(ve.col, names(intervals)), bg="white", bty="n", xjust=0, yjust=0, cex=0.9) box() } eaf/R/pdf_crop.R0000644000176200001440000000443114531422643013133 0ustar liggesusers#' Remove whitespace margins from a PDF file (and maybe embed fonts) #' #' Remove whitespace margins using and #' optionally embed fonts using [grDevices::embedFonts()]. You may install #' `pdfcrop` using TinyTeX () with #' `tinytex::tlmgr_install('pdfcrop')`. #' #' You may also wish to consider [extrafont::embed_fonts()] #' (). #' #' ``` #' library(extrafont) #' # If you need to specify the path to Ghostscript (probably not needed in Linux) #' Sys.setenv(R_GSCMD = "C:/Program Files/gs/gs9.56.1/bin/gswin64c.exe") #' embed_fonts("original.pdf", outfile = "new.pdf") #' ``` #' #' As an alternative, saving the PDF with [grDevices::cairo_pdf()] should #' already embed the fonts. #' #' @param filename Filename of a PDF file to crop. The file will be overwritten. #' @param mustWork If `TRUE`, then give an error if the file cannot be cropped. #' @param pdfcrop Path to the `pdfcrop` utility. #' @param embed_fonts (`logical(1)`) If `TRUE`, use [grDevices::embedFonts()] to embed fonts. #' @return Nothing #' #' @seealso [grDevices::embedFonts()] [extrafont::embed_fonts()] [grDevices::cairo_pdf()] #' #' @examples #' \dontrun{ #' extdata_path <- system.file(package = "eaf", "extdata") #' A1 <- read_datasets(file.path(extdata_path, "wrots_l100w10_dat")) #' A2 <- read_datasets(file.path(extdata_path, "wrots_l10w100_dat")) #' pdf(file = "eaf.pdf", onefile = TRUE, width = 5, height = 4) #' eafplot(list(A1 = A1, A2 = A2), percentiles = 50, sci.notation=TRUE) #' dev.off() #' pdf_crop("eaf.pdf") #' } #' @export pdf_crop <- function(filename, mustWork = FALSE, pdfcrop = Sys.which("pdfcrop"), embed_fonts = FALSE) { if (!file.exists(filename)) { stop("PDF file", shQuote(filename), "not found") } else if(!has_file_extension(filename, "pdf")){ stop(shQuote(filename), "is not a PDF file") } else if (is.null(pdfcrop) || pdfcrop == "") { if (mustWork) { stop("pdfcrop not found!") } else { warning("pdfcrop not found, not cropping") } } else { system2(pdfcrop, c("--pdfversion 1.5", shQuote(filename), shQuote(filename)), timeout = 60, stdout = FALSE, stderr = FALSE) if (embed_fonts) embedFonts(filename) } } eaf/R/common.R0000644000176200001440000000706214531422643012632 0ustar liggesusers### Copyright (C) 2001-2006 Deepayan Sarkar ### Copyright (C) 2001-2005 Saikat DebRoy ### ### This file is part of the lattice package for R. ### It is made available under the terms of the GNU General Public ### License, version 2, or at your option, any later version, ### incorporated herein by reference. ### ### This program is distributed in the hope that it will be ### useful, but WITHOUT ANY WARRANTY; without even the implied ### warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ### PURPOSE. See the GNU General Public License for more ### details. ### ### You should have received a copy of the GNU General Public ### License along with this program; if not, write to the Free ### Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ### MA 02110-1301, USA .cupdate <- function(index, maxim) { ## This unexported function is used to handle arbitrary number of ## conditioning variables : every time it is called, it increments ## the "current" level of the conditioning variables suitably, ## i.e., it tries to increment the level of the 1st conditining ## variable (the one which varies fastest along panel order) and ## if it happens to be at its maximum (last) value, it sets it to ## the first value AND increments the "current" level of the 2nd ## (next) conditioning variable recursively. if(length(index)!=length(maxim)||length(maxim)<=0) stop("Inappropriate arguments") index[1] <- index[1] + 1 if (index[1] > maxim[1] && length(maxim) > 1) c(1, .cupdate(index[-1], maxim[-1])) else index } .check.layout <- function(layout, cond.max.level, skip = FALSE) { if (all(skip)) stop("skip cannot be all TRUE") number.of.cond <- length(cond.max.level) nplots <- prod(cond.max.level) if (!is.numeric(layout)) { layout <- c(0,1,1) if (number.of.cond == 1) layout[2] <- nplots else { layout[1] <- cond.max.level[1] layout[2] <- cond.max.level[2] } skip <- rep(skip, length.out = max(layout[1] * layout[2], layout[2])) plots.per.page <- length(skip) - length(skip[skip]) layout[3] <- ceiling(nplots/plots.per.page) # + 1 } else if (length(layout) == 1) stop("layout must have at least 2 elements") else if (length(layout) == 2) { if (all(is.na(layout))) stop("inadmissible value of layout") else if (all(layout < 1)) stop("at least one element of layout must be positive") else if (isTRUE(layout[2] == 0)) stop("inadmissible value of layout") if (is.na(layout[1])) layout[1] <- ceiling(nplots / layout[2]) if (is.na(layout[2])) layout[2] <- ceiling(nplots / layout[1]) skip <- rep(skip, length.out = max(layout[1] * layout[2], layout[2])) plots.per.page <- length(skip) - length(skip[skip]) layout[3] <- ceiling(nplots / plots.per.page) # + 1 } else if (length(layout)==3) { if(layout[1] < 0 || layout[2] < 1 || layout[3] < 1) stop("invalid value for layout") } layout } .compute.packet <- function(cond, levels) { id <- !(do.call("pmax", lapply(cond, is.na))) stopifnot(any(id)) for (i in seq_along(cond)) { var <- cond[[i]] id <- id & (as.numeric(var) == levels[i]) ## MARCO: Removed the possibility of numerical conditioning variables } id } has_file_extension <- function(filename, extension) { grepl(paste0('[.]', extension, '$'), filename, ignore.case = TRUE) } eaf/R/whv.R0000644000176200001440000001724214531422643012147 0ustar liggesusers#' Compute (total) weighted hypervolume given a set of rectangles #' #' Calculates the hypervolume weighted by a set of rectangles (with zero weight outside the rectangles). The function [total_whv_rect()] calculates the total weighted hypervolume as [hypervolume()]` + scalefactor * abs(prod(reference - ideal)) * whv_rect()`. The details of the computation are given by \citet{DiaLop2020ejor}. #' #' @template arg_data #' #' @param rectangles (`matrix()`) Weighted rectangles that will bias the #' computation of the hypervolume. Maybe generated by [eafdiff()] with #' `rectangles=TRUE` or by [choose_eafdiff()]. #' #' @template arg_refpoint #' #' @template arg_maximise #' #' @details #' TODO #' #' @return A single numerical value. #' #' @seealso [read_datasets()], [eafdiff()], [choose_eafdiff()], [whv_hype()] #' #' @examples #' #' #' rectangles <- as.matrix(read.table(header=FALSE, text=' #' 1.0 3.0 2.0 Inf 1 #' 2.0 3.5 2.5 Inf 2 #' 2.0 3.0 3.0 3.5 3 #' ')) #' whv_rect (matrix(2, ncol=2), rectangles, reference = 6) #' whv_rect (matrix(c(2, 1), ncol=2), rectangles, reference = 6) #' whv_rect (matrix(c(1, 2), ncol=2), rectangles, reference = 6) #' #' @references #' \insertAllCited{} #' #'@concept metrics #'@export whv_rect <- function(data, rectangles, reference, maximise = FALSE) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) stop("reference cannot be NULL") if (length(reference) == 1) reference <- rep_len(reference, nobjs) # FIXME: This is wrong for maximisation stopifnot(maximise == FALSE) # FIXME: Do this in C code! rectangles_a <- rectangles[,c(1,3), drop=FALSE] rectangles_a[rectangles_a > reference[1]] <- reference[1] rectangles_b <- rectangles[,c(2,4), drop=FALSE] rectangles_b[rectangles_b > reference[2]] <- reference[2] rectangles[,c(1,3)] <- rectangles_a rectangles[,c(2,4)] <- rectangles_b # Remove empty rectangles maybe created above. rectangles <- rectangles[ (rectangles[,1] != rectangles[,3]) & (rectangles[,2] != rectangles[,4]), , drop = FALSE] rectangles_nrows <- nrow(rectangles) if (nobjs != 2) stop("sorry: only 2 objectives supported") if (ncol(rectangles) != 5) stop("rectangles: invalid number of columns") if (any(maximise)) { if (length(maximise) == 1) { data <- -data reference <- -reference rectangles[,1:4] <- -rectangles[,1:4, drop = FALSE] } else if (length(maximise) != nobjs) { stop("length of maximise must be either 1 or ncol(data)") } data[,maximise] <- -data[,maximise] reference[maximise] <- -reference[maximise] pos <- as.vector(matrix(1:4, nrow=2)[,maximise]) rectangles[,pos] <- -rectangles[,pos] } return(.Call(rect_weighted_hv2d_C, as.double(t(data)), as.integer(npoints), as.double(t(rectangles)), as.integer(rectangles_nrows))) } #' @template arg_ideal_null #' #' @param scalefactor (`numeric(1)`) real value within \eqn{(0,1]} that scales #' the overall weight of the differences. This is parameter psi (\eqn{\psi}) in \citet{DiaLop2020ejor}. #' #' @examples #' total_whv_rect (matrix(2, ncol=2), rectangles, reference = 6, ideal = c(1,1)) #' total_whv_rect (matrix(c(2, 1), ncol=2), rectangles, reference = 6, ideal = c(1,1)) #' total_whv_rect (matrix(c(1, 2), ncol=2), rectangles, reference = 6, ideal = c(1,1)) #' #'@rdname whv_rect #' #' @concept metrics #' @export total_whv_rect <- function(data, rectangles, reference, maximise = FALSE, ideal = NULL, scalefactor = 0.1) { data <- as.matrix(data) nobjs <- ncol(data) maximise <- as.logical(rep_len(maximise, nobjs)) if (nobjs != 2L) stop("sorry: only 2 objectives supported") if (ncol(rectangles) != 5L) stop("invalid number of columns in rectangles (should be 5)") if (scalefactor <= 0 || scalefactor > 1) stop("scalefactor must be within (0,1]") hv <- hypervolume(data, reference, maximise = maximise) whv <- whv_rect(data, rectangles, reference, maximise = maximise) if (is.null(ideal)) { # FIXME: Should we include the range of the rectangles here? ideal <- get_ideal(data, maximise = maximise) } if (length(ideal) != nobjs) { stop("'ideal' should have same length as ncol(data)") } beta <- scalefactor * abs(prod(reference - ideal)) #cat("beta: ", beta, "\n") hv + beta * whv } get_ideal <- function(x, maximise) { # FIXME: Is there a better way to do this? minmax <- matrixStats::colRanges(x) lower <- minmax[,1L] upper <- minmax[,2L] ifelse(maximise, upper, lower) } #' Approximation of the (weighted) hypervolume by Monte-Carlo sampling (2D only) #' #' Return an estimation of the hypervolume of the space dominated by the input #' data following the procedure described by \citet{AugBadBroZit2009gecco}. A #' weight distribution describing user preferences may be specified. #' #' @template arg_data #' #' @template arg_refpoint #' #' @template arg_maximise #' #' @template arg_ideal #' #' @param nsamples (`integer(1)`) number of samples for Monte-Carlo sampling. #' #' @param dist (`list()`) weight distribution. See Details. #' #' @details #' The current implementation only supports 2 objectives. #' #' A weight distribution \citep{AugBadBroZit2009gecco} can be provided via the `dist` argument. The ones currently supported are: #' * `type="uniform"` corresponds to the default hypervolume (unweighted). #' * `type="point"` describes a goal in the objective space, where `mu` gives the coordinates of the goal. The resulting weight distribution is a multivariate normal distribution centred at the goal. #' * `type="exponential"` describes an exponential distribution with rate parameter `1/mu`, i.e., \eqn{\lambda = \frac{1}{\mu}}. #' #' @return A single numerical value. #' #' @references #' \insertAllCited{} #' #' @seealso [read_datasets()], [eafdiff()], [whv_rect()] #' #' @examples #' #' whv_hype (matrix(2, ncol=2), reference = 4, ideal = 1) #' #' whv_hype (matrix(c(3,1), ncol=2), reference = 4, ideal = 1) #' #' whv_hype (matrix(2, ncol=2), reference = 4, ideal = 1, #' dist = list(type="exponential", mu=0.2)) #' #' whv_hype (matrix(c(3,1), ncol=2), reference = 4, ideal = 1, #' dist = list(type="exponential", mu=0.2)) #' #' whv_hype (matrix(2, ncol=2), reference = 4, ideal = 1, #' dist = list(type="point", mu=c(1,1))) #' #' whv_hype (matrix(c(3,1), ncol=2), reference = 4, ideal = 1, #' dist = list(type="point", mu=c(1,1))) #' #' @concept metrics #'@export whv_hype <- function(data, reference, ideal, maximise = FALSE, dist = list(type = "uniform"), nsamples = 1e5L) { data <- check_dataset(data) nobjs <- ncol(data) npoints <- nrow(data) if (is.null(reference)) stop("reference cannot be NULL") if (length(reference) == 1) reference <- rep_len(reference, nobjs) if (is.null(ideal)) stop("ideal cannot be NULL") if (length(ideal) == 1) ideal <- rep_len(ideal, nobjs) if (nobjs != 2) { stop("sorry: only 2 objectives supported") } if (any(maximise)) { if (length(maximise) == 1) { data <- -data reference <- -reference ideal <- -ideal } else if (length(maximise) != nobjs) { stop("length of maximise must be either 1 or ncol(data)") } data[,maximise] <- -data[,maximise] reference[maximise] <- -reference[maximise] ideal[maximise] <- -ideal[maximise] } seed <- get_seed() return(.Call(whv_hype_C, as.double(t(data)), as.integer(npoints), as.double(ideal), as.double(reference), dist, as.integer(seed), as.integer(nsamples))) } get_seed <- function() sample.int(.Machine$integer.max, 1) eaf/cleanup0000755000176200001440000000056414660712374012401 0ustar liggesusers#!/bin/sh rm -f config.* confdefs.h tests/testthat/*.pdf \ src/*.o src/*.so src/Makevars src/config.h src/symbols.rds \ inst/doc/*.blg inst/doc/*.bbl *-Ex.R \ src/eaf/eaf \ src/mo-tools/dominatedsets \ src/mo-tools/epsilon \ src/mo-tools/igd \ src/mo-tools/ndsort \ src/mo-tools/nondominated rm -rf autom4te.cache eaf/data/0000755000176200001440000000000013627006324011721 5ustar liggesuserseaf/data/gcp2x2.rda0000644000176200001440000006636313534247654013546 0ustar liggesusersXTk}0tybwwQDPBJJBD|flppK5s8vKY "2ɀ?MMtVjl)OP+ U31bĈ#F1bĈ#F1bĈ#F L?Ϳm_F1bĈ#F1bĈ#F~ο=C2bĈ?/#gHVtwF1bĈ#F1bĈ#F1bĈ#Fb ی1bĈ#F1bĈ#F1b[H*aeEV k-QXٴTW=fFS#FaTF@mȿ#G1bnĈ=, g{q{nĸ7̿=K6b_ߞ'g~FsP#7 >_go>_򟠒*H2݆ ٕ!;#TE3vGwW~u-emSO_e/鯉G-ꯎO}'_ [O_i{;_a+EOc̟;Ej{m|7kW{8JJO6m{ʿ{sZ_ʭ2{Y.J}]5ٻRGT=ӍtA_7ZyѪkՎ>cuKMoNUPۊV/kᓔu}y7gvVߊfi:,}Ƿ7xwҷ5?`amC kcsz<ȻzzjX>~]ٟԓaXJ_x'7{Xϔ2wuΞekƞ\Ʒfvưxܦk~QX- 6)QopjSԦ*>8zN|ĥl|aHO:oGmrWö'ZƋ{N XG2k>JG[wڗ8vY6VԼn橺1a7ǤeZv`;|C7N\¿ ?>VZ־7+$l)Y|N۹3\TQU^7 mb >u]Փݭv+L~9Z; %خ2IxDVtWs9xkDhm髎`  6uR}Wλ$-lGƷa-ɩa&\e誨dnjk]X1{={/O{Nc+z^@EݨѮnE%o;@O=J= F_?yvN~́o=qR,R\_iPŷ/ҽliX7,ʰ9/`3RFh% >˾t[}?;G vɖL'62oz)>-KOOoX'j*۾TG|8Z.LN[L`'}ʌ{krg o+9AufX2`Nɟ?@ѷ³%I\RY41ĺH٭pEU&2vRu2"  X! X-uq3 x)p1[jrS䀗r"|qvP.G.iȗ ^x+>OvrAbݴ#,d}rr!qnX_U_^\3:: ϸ{(aze(P{qҎo ^(*xK'/a5`6UQ٬{q>X*k]vAKؿA+5d\#HQ_x:D"kL 2> N4*o=94B_ޒ{gnrlCrI]9]~+%+₯8?_Tk_9ںj+*ꌣ"9ñetz\jOqta q(NDfDI't*OcJ:=)b9d}*' gC*Z'P]N2o5\q[y|3 4UQC3)-QTwsz?d/\ĻDx燚eC*n9&a{gӽ_ѩ>VW-sWmɀT/y IݠhG> Pٰ@|B?UoQ멘y@OżNO_zՃ'䃲WmGQ[&(*/Oq*OiQgVsUԕ:\Q>'3P/**矉(](Mrv Q'n4kD$dpyQ`4FpPq*MۼgT2NV MÚvNV{IXf\OX4eyq}Ξw T=թtK=bSxcM ?{8Sƙ":WA$*mwؒG6;5䁂!'4UYr1HM?m (}b2xea9Vu4hVsmPz[sS_a?Uazf>VB)EɃ7*Ic-|`Zpz*rGghPd?NJFIuᓲiMO2fg~r>"_#= Wz $(sFcN,?r!0Cڡ%b1u_uy'҂m7#T뫴`ou/e]ggE=+Ye>+gEשQRC|*Dxqr߶sՕ!b~6]b_Yr_|aG:|Ɵ\}y UQg#<{,aQuOUQ1;*GrQ_GEsTǗ**Xb~bਘkss=U?o'}k|%?@ _8/s<=NѓE<1>x}؇?GgEɃ!H]oo7EܿO:Z|[^TΥwTTn,`ԩCi5tľN8OfXi;K{!E4AGմ*Y?պ2OM STTn3V9>UT 7JOE_Ճb.֩dc^8**9"('==%=+*sD9%)iU۟:!*z*)ZC@bEW'ecOm:'s|_udX?=}Oߺ}bqT4VjՕ ->'9@yن)*K sP94Py>q^QQGQĊ+ߢ9N|v?Ǘ8I=:Gw߱FOžN5n6 F-*:iCTɆhykjh_8i Z('|E%BENI x!=M[s9u֩k8 @u偺6X)EփE-stzPG}z*<(Z=,e5z+c՛LjU_qD?zvU=zTܟc<ӴiUca Q׷l|Rt*WO =)ƊKm?%u|ZJ+?*'p+Z=GF>]}sA".<$/E\Z; !n'C}"Fcb~մ=E%Dt1}QOYvN]_Ϭ;8N_ CE?B3L?n<ҽ z a8c`+,&;$?iǟ(S%M}vW}IC/_w]\fX7/1Ϗﯘϭ=@q`);􁧋~g}v׭<֚{G#OEK#5v?;~Z t+Odxؗ+Gv\)[4T_N5N<>Mݏ֛]0mz%ΣG 7N ӿ xG21q{ͬ\}Eg-L?M ֎X)iwc=:6xCCͥ>~౧_*:ѶwÇ>7bon_Uh jBAG[6qH3NfȨ6n ;(zF6ܙvi仉'L1t//qEmh<;V+H{\fݧjR8T?\= *m#g `" ήnE68Ȃ&O9Y:lx٬|^Y"9~O}nxeq^{mwa1_3(놊9uw u33(}id|\ҁOƣglg*n7nM a^՞CY?M#7 𤺽SvrL3z4G_SzW͹.^)osTn~Nn]RPWYŁh[F_w.+ Gߺ>uGnTRcׯv^cDd+1$Gv^ ,ũWJv/ k`SwBq̋'kws̫+;q |pljw5eY˭w@m%)rȾ0/R--pqEvР{ԄCֵTs²] *gSugIٯ%/Iݝ⤖g|ZZ},#qr.ɫ}_3ƿɏ_ ޢx Srl-A3/_ossJ=zW pq}N~tcf\){_՜Ћrt;+s/5rBOQu bͿƑ:]]4]_K{rdS|Nҭy;x[5)FYsAb&Zf}MQ/Oe(ҕ7qdnS')z3>}}2~TА˫^(;+x-~m7G1Dѯ NSŷq_/CDs>`[5趾%}q ]ץ9ܱX}ةG`Y7(s 9aݛ=en˗;UN7=ϱ=w}cgB7ݫAѰ$T9!ݳ8M5EqR۔\/vufFIvHIm8j0pspl oI.EKM6>]/53='VSuN>m$N>S@5|zɇ*Aw)/2 ┋eϹViU|V%Fպ W z(pSݝWh j+ޚu>vOD:l/rDfd(vىU C+<-6r-rpęUo!d+ր'V)z%r`(pR*p+]g? ?s}04y~ܿn8q4"!:Ԗ>X,Ӭļ'N/:^giVs)79ސSCׇO=S/E$݇{lxN(,eKNcΔr}>P*E2p)_:?gtM[bj4tA本 )YQ6/ty*&̞]|솹߹UQG9di^D}ڰ=UG|kt|ˆOz: 9~6ЪWY|@w9@@65fܻ*+%(= pvfgMS'թ+z`ӳ8\֛~?hVwSVVZp4QUa?Qbӈ*/a\%7]"G'}t}TC82Ў3qdĥ 4ꊛp5*\%Wz(ݓ8p}ѹ}9fq9ދ1./hMFӣCO:l1wzN஥Nc: 7yHEE]W@8tP¢R v9&ZQ4Q+W;/Z2s)zO_|WT*DOWZ^r/>S'66n5Nr8ߝDN;91*}ջV[Ǘ>L')Br:p }sRKm8uOT<< Jgron !);W#$u$XeRǨl9mjqXw[ ݻJ?1Knswx"Ljm?afK̆hW_Zub:cvk4Efڲ◊f.1X̒2-S4|U.KOKͣT_4i-G9εZ= 4j/E f7W V\4&#&5kU=[|[6`h9RޥmG+!%r2$4[Rw0է7a7R`OvZtzU.;?Ut3Ub*u|ƵȲ_:&Qѩuʼn[r Q˖$yޔ Nv[pZ,r֗/O.69&qjzek`,|%pȢJi@tQou‰o=0têz*,<~T*&7~Ҫ6#a7r;Mys4G-u!!'}3{W{{]de˴H9Wy 㠯LёOʌ#p9rL/ [F^m_w-(9_~V{e)>9*CcDZyۂezXrJ?gӹsE?W[\s\ǖjƒ.YY:?5Ua/]ZQyl5?#GOcz4YE&]ǢHiud7cKM +4!=O_4>3Oq}篰8y<*T8.0&U3nhL֝zWT4v:b>ox43+ )J.}η<qBDžv *T+hu|ᒠ}RB]޴/~m %ZeyZSZO.ҩ_fp|;]ݖc|eZ)#C>v/_#=q _D|ufJr|mÁY5ɺW)fQN}&8Ǒnk9u&,JӃA|=dӄ;zu)2oJo·8`)x4#4ΩRN_cZtsD<m+Bi'7{,˟TԱ\=8B*[YջMW~% ~i+K H8os>in%:u-tO5nZަm\/k3֥ӑ&=;%W[>bA5ECIo}sZOb[4ھ2plKKusX1ߋ~L'/BqSA 4"?Dq[!yӝC}ҨnӈʷG Nz898pF/>qz"cKq`Nw NNіrwCWܾ_c:_ 2ۋ7i6%9^|֜L>\BR/hg|vS8Z)aCƖʨ9(:Z=kg9:inͺ&4&UqTnLR)ֶ"Zq̐7NA-eB/3s!͜6nn\CK_q,oql9Nlh+~41aS:ϗjĥ-U3 sOH/4xg+6:'\l'9VV/‰/~f(WSK|\B,ř/IG^\Ɨ˃|P7qʓGs=C_(q|gN~ૢ.KmMO?NZCh#]= UA)=wRqjˇwfǙ<;b2kiwJ?ԇG%T.3KRγtWԣɚ^뎗Nxs<[ʡ{cwi~fpO<6rd-sXm.oX60 ߷}[U?s9}$'~].88 ώMT#,#Fw&K1~j(:8S夺tzl|%U{A4hr9(*o-V4OV1j5rǞlWO&ogRX8CwyO[=~.46r,!?7=bc]zk;!jVۦߩ=w?T֝~OEwU]ꅢ>Ě۳o|ߜ/IcG9LbePrrM'_|FfrÏ)r[xSTi)h?PbZ"uni5]Q\->[mKY|)U>H guY ?$5廪#^7xLЫu}] ûy!LO>2sM_1^gIipk*[]MK]7/y79mߏ76ȗI&ޒY}1#A9`vw5PwmgUηɳyĉ/#4l)/efRxݥlTyT^^VηMVig~㭜TEϓH%,< X- y<_O/~SM.EN t=9DjßbSN ӎ3띟#et[PZ=t$] K믻֮^<u7oU5|尞Gm8F-z\)Pwc> ⿹D%YYj9yduY!B,qc8*)2Yڠb[i㔡cQ>W+qJۨ]q;ģߍIߡħi|ku:N3:v^޾Զ<&IMX)IwoHwbR rmɢ.JytOsY*Uem/>}YlQ" گo6i[butsۿ,)"lt~;.Y)yH|i"L1#!o^&o<"?mfgu'7rPGigϓ ;å1҉!z뭋SFYͿi.Nk=m>1xr, aZ)|Qw/t`^qyg&9|9fm砊հZC6~|rIx=6w^ӎrBq^Wq_:L-;GyG3E~%gc;}O&MҩmDd%1 0Af2d @ @k2Q A+2P T tSwkZp'SU?4h2 S_X^ ZSy0 H'EjDLH9Y@f2˝Vd֜!3!` vn2;";Rtdvl IdvJfO+`i UqQ ih,*\"6+1,Vg!'Zxt'tc'Kvdiy,k$˚e8A_$+dOVf] alJ3,ɴ<dxL Ml!؁vܰB]񻞰מȴL$LG99=t2x=d.^{{bXvOj{? h2=מv@p ܇}+dT%a?%.3p9L`&x%w[͠KdE@1Rm9F`)~8Kgp0wVM`;G1~BI:3?t3Hv-Bf^Òia 2\iu4du Isi @7^d~ YT! ,jkȢ Y4 ȢC[,f[d9,:dYWdB=cFؚ,@P ~L i`. .pAO0N :Lw~"]0L=]bgS zm@2N70(!^ڀy(@Lq1, iCfEWdVz!oEfY5d1@LjS%N2Bf]Gيi`c 1(JfGT"ϵz2 V49:[+4 Ťi ;˽!*d^mM=w1 ꉸdE@ A?dQG)^6+PuV cIgd6d5D k@l Γi;W'c$r)f s%PLȗ8N.q}"T`MUoHkVzIQnl*ꤲ+oڠ/v618L]wjlq/l>v/=@_ ^P#^_'l Pԃpyȡx3|g7I?? ^QnƁQx84Й4nGH3k<qlBQ2v<"E|0L[2w_A滰޷`߆=<&7ȢDhiQ_ !>1J'J6D:Ci `ڡ^jx5t{F2y= ZHRYa  y.۸1î #dyI>\#H5j@^< @U KjiRov.^`pAЌ~uy @670L5&tHG\67'}[-%Ai2݊cnCVAOt"ݨw#2 35^zUgP DlukGȏs7N#ӳ0G/珚 @ @P d8пG;2>eOWT|%,w}{2}|L >?COeL j/_MP2)Ra4o=}RY^D/`̲4@}ov5!` OB}@,{j~(ꂢk^W:\Ųn`$%ubk ާ W]g{{z [ERmcկijXfbW04S2ff%vEIt@=t83Yr{ykx!ze Z5זAO;i&\ܭ @֍'N')x|2_t1Җ ,PZd1y;8N3\bC6"` Y r${d37H6d3:e'uxp_dah5% l,@oaa `ɴ#bfGbgu熠)haiWpW!x!tJ^|kc)p)|p)E<;Obf/W:܏c PDvjzA܍ #U,XƯZԡspԖ1ɐՓbb P8XC}2jѨYӊ  ЧE[ugdVqv 5 Y}*Ezv2[MfPC?7Y k焢MBM|ߑ4Z@LҴBlm54af@i|`cNE3b},]hY,-D!"gdY E&+d9ۃ,tm}Aړ,ܧ Kɦ ٖEm:]gV&CD- zx~otuX̂D&*C45ST~t2 - @Qc"(z]uss8vڰK(%2e^ѱ7ީ>Y<:]CK'e !\݉-|Su瘗AQ\td26e?p*?ϓH,ιcm2@Y t8t8g:畵,+q_$Qs19l:IYd7xM2qĹ`r'j7=tVanou.X 6 !tVdzGjG0vjRls!<Vkȶ&SӋlk1m)( dgnp \' *t q ٽ޼_aSr8R! 99 %'n;@9 ENepFno9LΧeT(:e\BϮP{A0Nߟ#Qb Nu\ϐC+2g9(kFʜweM(sRo0\Qq"g~q23[v/E :O̡BmT?֋ƃ`)XO@4xLbA2Y/W;<oz#hh dPl2d dn]oX[pbd#apsk.9:_@ GrcwXËkAQrȱS{ $Buȩn8+(2qJ^p\LN)sIP28n':P(`/8 )emEYRV\SF-h2\똂Zm}HA;ROPu4,݆#l@u9d/|&GqGAK}|{{LVp$ɮjz%"Ē]}J6]@8$F5ykЍC?HaNd|$d;m'&Ǹ`9&R{1*9^р8 NSQM@4 ʁ $/9L2'i>酟!pp-;9J }]rv΃0^sʠ9Psr<\RrI :`,<)E.OPB)P}ְ t(e ([ӔHsІc- ݪI{ʽ)Ձ RITtsz*0ϔl֡^ooagldo rڠWmd1֫X"2vjUaXp` :&L!2|$/tgɾI7xEˁ`,Hsk` ֓|UXQѿ`rqyNG~L7mn.toezTCN[Dmk)sywe6}Fks5)ϩ-9ӕk o`E*x N{Q+d2IB6ꊠٸE" es0L$P{ ָFz) u6m gg3G3 P?%;6I@.r }1' 2Bd?ٻ# \cǥ%@%ГF#EidKf9\>8ɹVqʸm e F.uWKҬO.smI>rp xArͥQ2Mٮ(M4#A5rF9])ct1jKfP7TF?*r/*K;K~P !P@)W)ټE{x[d~.?kL6gs jpl;AkNStep x`Vr) K9eIwr `99O+HSѽ?@419 )-9۬9Esѡ`,9W@`3@r*,&52ij k>,ہՔl'eO7\}<)>gqx|e$Z\ސkJ-r}4\_v;xAc:P(}孽좼oR VTok ST@; Vqȃ{ZdvU$XXA6ye}b'؅ jm=ksoe6ݳXuxwXt2@KW{^ 0 3 |LΙ\Z j)Yw]Br)Kq &od[.9}3oͷs6k )y+{?@:l=;a8gKp>1aۺ= ~V8r_ێ?XҰ? nö[}!l!zrvkpQ'pW^{{qX ]r. ǽu?>Ѓubk)Sp/}M_>r/g_M۠C¦{a5?fy:_Okkð薺|Ua-vawNN4)ӃGz?׿N nl_a8mޟ+aI/իx蚰 7ϓ}$l:yMOyo~)l–~*ly=ufޏ-w[>qQr-~wi?}Vغu{mup䛞p+Gyzp]tN ka<7a'\M,î` }ɕp>(C;Q/-geo[˹53}=x>F,yi–{?lY9L7MÖ)l)G-/3K [/S' [-l}Ǫϊ|6l;6閺^7~~~‘?xpv!zx8.?^gpMNՃ]ѧK>==ؓ=VO2{o0l3{ֶac^<a7p}&{ gkUnouִ 6pCl,͗p'6K|U_  a8kí?}~OH/Gw濮38-!pNg8!Rgn o_ 1uzq9ߏ-qz\Ǻ^z\~v-Jϧv;焰=|\dzXw+ºW7†6z!ݿ-7 ߒL=O_tkpЙe_8ν5?5/.Ž9}B-ɏ>}/)kM.gzoy }˙'rg>y;}9|3Η=!lq=p\'w[  Oozzu q^[yO)!U>i}F}N/W_W_W_W_W_W_Wbcۿ?G#??G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#?G#7&?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'??g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3?g3_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+_W+o7vP_uiz.Y0GHzVTH~¹Gz^#[õ]s;[w|Z83CtGGED/;tp M:Gz^}G QusUg'r3 6ȽD \-?_.nkTSθQzq{{{\QGV|z|=;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{;7{m){;7{;7{;7{;7{;7{;7{;7{;7{ݾw{ݾw{w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;w;o6????????????????????????????????O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?O'?___________________________________________________________________________________________________________________________£uC#]uWSEՃp=Z'z^7o]O~rݿȸ@-:JֺkE!]t?=DBɹ@/kfKu{ѵf︁nug˹;.=^V9{/[utNyMu;5ts[z;;H/w^w5>/5tkkx׍])rw*..gzVD=]Ӌ ]wCZ/ٻֻֻqNsw]CizDgla]kݮyzzksN|:qzyy"z%rI{1}Zs==:H^U{[5;_uW*٪zru^{3>}D{5V]|kmԍMLyn'5gk5t=_]˵5׾^q)k]ssɚ3w{\^׾}r^^:{o&{u-r{/gI)ƟoQ=.,h*(#4"c+̦| "pPcu.b\>s8w##AP *ʋvT?Յ^&iқ,IzӼp.d1 ttW& Ǿ_W7jɬ A8B^3H?[EW@Zj 5.)!Pj*h|6NoxA7AcS!~/>zoI:bKWϛjݛ -| B jx ?u'=Hz*p/ȿPy2IA`Oa\&#hSYEw 1L;2a}ʼ<%!oxz&*_ƍ>}SHM;n o e/ Cj^%hv6S\P >d9k[ݸZHa4#R"h_W wz}Gs΁X+NN X?DP7a~a\K?ָHa%WcAױ1h^իBuqF s7/NaD^%W#6`_H:ژi@γEldc$yt)MUq 9?BTց1X ĉ~XZwbx>7ucݚ>pt.6/o 0OpoY$ W9Swd 귰O[S b3ͩ1,!НǺ\\-k*>t{ᾹKkxH(&3JM }я< 0[!=CwU6K 'NX^; 8AoٗGzf%Evi^aEJdmqpחxV@oC:~nxδߪ}BC^ގ:덂RB_*׳<<Y2 YjE^k*swk^^)},B?dX/ j&B+}u9`7Ѿ|_̷e~ÑC\ne|Ǔe5ӵV!\>rlx˃p*˝o>"wzbB乣4_u >?yod$߆,y >u?ώ_> +xTAF>ד8?0JܾH;?'gc+{*xE]>t7<b)rqnρBs;ѷٳF h#1GzN|9fpϘM ;^|Q5wn$J¶Keq۾{J477-щ Ew=}]xeaf/data/CPFs.rda0000644000176200001440000013102213627006324013203 0ustar liggesusersdi ۓɾ:0۱/)% i-I*IH& Q*RD(/TBYB" I}__a 3|>63Gˇq񅙉i~0wĺqebt6m]?v [@C ΘO[@r( )MB&7iкS4?e1fa bnHnwκtC\hLiZxg=:˸hRvق,Q҇TT\꺠$6b^g$9ux/uGL:vL !xELox%wz#+ a3'ED̎{yg ~NK nm07&#B{4Z:δrD3!$ ,!aVN_n~9R$9@训9!U*Կ,' OEhfTZ0ݕP| %7 I8o_,P~~v>B`+2CSOz9>x)se) |-cg7]ygp;s_DPM+>LjVkmZ#X؞Y]L|2/W1^zR72e4ӾK`ɶ\҇1 o{؀]90OHi֕;@Ѻ湽W{i0e9dH|q BDX,v!^}+&U 0A =:JUW 8!~x3 _e䊗O4[y:GP 8 F«)eJT7=dg떴,KuVgL'$ oQpYD/Fn?4kۏŞj8$2k[@m;SR{U"DQXVvWfD=楽Nmp lrk~=)7#((;y)m: ] [bN`Z%1 B6\2?-엷 1O>*C{R?@CD+ EǏq˽KBȠ)ne{҄z4?󃾄>mRץrzUva_2wc?JŪRA4O'̈́&*3[&OqU}w';zdڭug5m͏{LRA-4"eBQP_at>{,{mCʃ@PhJ o!Py8O94z;m 37"ZnYr'Cی#dZV c]Ck"L\߃pߝ9F]{jՀ,:G:;kpY#i_[}5}bnA73%`g&.]@瀕:0YtxPP{]z#@ ˢtZ^s./>3rwp!DZٻS|T dNlAÌ:(pDN?)TM~g -ZWs qW2h<8-\0rr:1*_体u@#N\Q3D鵰u^Gl=CʝdB<\%Stnj>%wuDkԜR5vgWWF^қDޑ-62_G^97_]e2M Hq9`7+J%٧h$rU߿7/Bڃl;Ok9D0=7Í 䄗ށEfO|83_g\A&;"Yk.j5rzYwu,`w*>Bʁgw kQ8yIML&mYeu~e%C=ԵКOt|h8%7߼-_XP+R!4NVS^.HlFkfCP>n'=_H jo5J'y)q}}bݠѼ! u>GC6hEL`2L(|Պ#< Tk~IEJ\_D_Y4jZi5K[(r)ێܠ-h|p&A߈ANiT,~d*⟌'= S|Yh:t>Sp K3gAqԂ՟ Tt@Zj&v~PeT'Q(&JiX@%[|G)%V[^&[l^>[C)n -0UA]p ?v.Ilz\|Oo)U X2_*sWxiI!bZaU~Bާ:iWpa2[z&J^c](}qW MP#߳evTZD!Ey#ߎ@*g{or.P0=8zWkHqnpQxr ~G{"Agy϶ưuG]6wB4~;|( \Xvh0vgqaʃ#"+h7ߺ|d(ƀ]D7r}8q'M(׽&M\nl51\oi@}yS'nzQv0|װOI $Ƚ #|=ӆpx` -32_Gp{4|R *O8Cٗl_{3 }v ̢kէe{Jnc%~&p^e}W$;X ?5]=xk {@\"vnA`[ ZNeėEQ6~ہk'}O;x^0v˒?w?VX8 Lşow TS&Cc%EZC$R4TF/+`!ADŘ*<D]6GOǿu0uSVVPҹec|K- @xSN*X c1 b$^gf~dNBa ݬ-Gw uX/TR>SK%k$~Hl95̇ZbxBPnSG;^*&$XȆcQ齥wT_ND SB$qC# ErqώzAꎈ~>.leP<}{Ut"FS7!2/Lgv(/tE p4.*RǸ/"AmKgig>Q{L|ށV<u+ySnm/_D儴6+4/ōƐ%e?m(O%[Ԓn1)1U%x yCJԣwM|~Iy-u7p cj28uPRȗ6Q_Pu܃FKnI㏆BkPnKU0Iϧ޻i4|.m EV.3EYQ*T>ł *]z<:)/ O5mu IJW68 -͓lE>mFqkpjQwHEs'I0/O_![~ڋV??-Db :ˇkG~/XّrVֽU"ryQнXsi{%/( Q#(RѭTuq,|mᅰt5܏sy,z