* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ namespace phpbb\config; /** * Configuration container class */ class db extends \phpbb\config\config { /** * Cache instance * @var \phpbb\cache\driver\driver_interface */ protected $cache; /** * Database connection * @var \phpbb\db\driver\driver_interface */ protected $db; /** * Name of the database table used for configuration. * @var string */ protected $table; /** * Creates a configuration container with a default set of values * * @param \phpbb\db\driver\driver_interface $db Database connection * @param \phpbb\cache\driver\driver_interface $cache Cache instance * @param string $table Configuration table name */ public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\driver\driver_interface $cache, $table) { $this->db = $db; $this->cache = $cache; $this->table = $table; if (($config = $cache->get('config')) !== false) { $sql = 'SELECT config_name, config_value FROM ' . $this->table . ' WHERE is_dynamic = 1'; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { $config[$row['config_name']] = $row['config_value']; } $this->db->sql_freeresult($result); } else { $config = $cached_config = array(); $sql = 'SELECT config_name, config_value, is_dynamic FROM ' . $this->table; $result = $this->db->sql_query($sql); while ($row = $this->db->sql_fetchrow($result)) { if (!$row['is_dynamic']) { $cached_config[$row['config_name']] = $row['config_value']; } $config[$row['config_name']] = $row['config_value']; } $this->db->sql_freeresult($result); $cache->put('config', $cached_config); } parent::__construct($config); } /** * Removes a configuration option * * @param String $key The configuration option's name * @param bool $use_cache Whether this variable should be cached or if it * changes too frequently to be efficiently cached * @return null */ public function delete($key, $use_cache = true) { $sql = 'DELETE FROM ' . $this->table . " WHERE config_name = '" . $this->db->sql_escape($key) . "'"; $this->db->sql_query($sql); unset($this->config[$key]); if ($use_cache) { $this->cache->destroy('config'); } } /** * Sets a configuration option's value * * @param string $key The configuration option's name * @param string $value New configuration value * @param bool $use_cache Whether this variable should be cached or if it * changes too frequently to be efficiently cached. */ public function set($key, $value, $use_cache = true) { $this->set_atomic($key, false, $value, $use_cache); } /** * Sets a configuration option's value only if the old_value matches the * current configuration value or the configuration value does not exist yet. * * @param string $key The configuration option's name * @param mixed $old_value Current configuration value or false to ignore * the old value * @param string $new_value New configuration value * @param bool $use_cache Whether this variable should be cached or if it * changes too frequently to be efficiently cached * @return bool True if the value was changed, false otherwise */ public function set_atomic($key, $old_value, $new_value, $use_cache = true) { $sql = 'UPDATE ' . $this->table . " SET config_value = '" . $this->db->sql_escape($new_value) . "' WHERE config_name = '" . $this->db->sql_escape($key) . "'"; if ($old_value !== false) { $sql .= " AND config_value = '" . $this->db->sql_escape($old_value) . "'"; } $this->db->sql_query($sql); if (!$this->db->sql_affectedrows() && isset($this->config[$key])) { return false; } if (!isset($this->config[$key])) { $sql = 'INSERT INTO ' . $this->table . ' ' . $this->db->sql_build_array('INSERT', array( 'config_name' => $key, 'config_value' => $new_value, 'is_dynamic' => ($use_cache) ? 0 : 1)); $this->db->sql_query($sql); } if ($use_cache) { $this->cache->destroy('config'); } $this->config[$key] = $new_value; return true; } /** * Increments an integer config value directly in the database. * * Using this method instead of setting the new value directly avoids race * conditions and unlike set_atomic it cannot fail. * * @param string $key The configuration option's name * @param int $increment Amount to increment by * @param bool $use_cache Whether this variable should be cached or if it * changes too frequently to be efficiently cached. */ function increment($key, $increment, $use_cache = true) { if (!isset($this->config[$key])) { $this->set($key, '0', $use_cache); } $sql_update = $this->db->cast_expr_to_string($this->db->cast_expr_to_bigint('config_value') . ' + ' . (int) $increment); $this->db->sql_query('UPDATE ' . $this->table . ' SET config_value = ' . $sql_update . " WHERE config_name = '" . $this->db->sql_escape($key) . "'"); if ($use_cache) { $this->cache->destroy('config'); } $this->config[$key] += $increment; } } q#T!UD{x(,mj-jeJ`jA㑒mQXցR'k԰-=QX$ZK 7Y7=FD X]H$USQQjnʟ-Q_Tc w؏J9Q܂b)G\lHs9_Br#kdS8A<3D#[⊐NI1<6q5Y`XA^O٨~X:_e=]1Es`*lUo N^%WߜjI~vqr(e˯) ;T#XpvDOS^_r?9T'0pےXj| :Ѐz ߷BvڏvX8œU[<! +P$h~94hP9Ľ-h_rtBLٙcT)mDY4J&+XvzM,Lx \Njlg9qxw J@Ex'lR ݲLKdTGO' ن1&I}~'ڻU9)XJPE<~X&xobzAvz?Wb8:l !gBr aԘ]ܐz]X:cr Q y͕zl'W:JXu@;$/5=c,Ze(\;Qq*e0.VA1 S?ڎ\L,0|pɪf(.YہhY@1:ݬAe iמ>[J h /[W%☺Ilrڻ%LI=;g d㡀NI2 `:KULLܜNvettU* znLZ/NRhDž01bK}y~ w!'N3t)֏3 | 0D܃[띑K~'-Gf^ r,Z-Mco!Rגu-k$kkLHd> !\[Aa"̥'3Xy.+/@U'LONbχ)ݽj~̭L.<b3$<r1mM,; `O׆њ%l H EVgf ?CйLٔܗm&ynt\">3V||]"!T712P#zPl~\iFadLmi@ǫG|jG>RPftAL1l0lmN&xM{?(!FlM'=5~&Sǯ;d_4͕6[׷ ;~# o( l *FTpdw]$|OTް]S#V~ :fY-<ڇ$V<䡀 j+>5ߞKwQ}Ws8cM!){cw,>:|DN5|D;sk)y!D![6ec`6D٣N!v~=Ahc$ jeXӖn޻+fWO؟0ķ6 E{OG/Az{ސIik~;=v@}P?ܳMmey:~@2dzZeK|Cv̀.0PR3슸Nt'%k(b W#{SK-{ɫ<,gh`/ç$ FnYz3VFMla`LIFVt%I6rl!F?)@K]h!8" !I$Ϭ=c7rops[sgW6B).+3dLj6-ԏ@=nd- (9hefsat}Vj,[%)o*Z()nc&{-:.. Moe2v("VV[ЫI5ݶG1$ly,=ppUbz4=,lkٰ oxt. ?Q_p`JV,1ךU )`zH#* rE E*n;Wq2Kw’Îӆ+][ /~ $Q}P]r%탲Y8h0.4ֺr@NTӄ߿&kI"lZӵg)L}3-\f/IK0ȳu?cM.S]+X]ľZ&ctEnBIB[n<vl Gb YcN ɻc"hr( u3AF`ʭ)jWKβ aT j:T^عdP †h QAɤw87.Gl7'c'0p\b&18S"h!O0/l¦j-O;07t%Āü>ƍ2p)p/h%lj%7=6BQ[|Gy>'|x&| a~ wueL!LCZF>j,T$Uwk_T'H*{iL}stkHFm$!) ʎXkԨը*p_tm,l`hgFl&$SQ&;|b;,燭p?Ŕe-\zߘNZx@<v^ET6$wT F$?ͱ %m,؀zl}\LZ5}}j8j~krJ|Ӂe/0m|Dtg xg/8{=I8ev  ojGcV'1PP8٘zp7"+& ]{7 EnO FHX,Vћӥ!ۡ"`Awl;>Hwu?s# Į o3mTg6rTY0g1 gYUȅS}% C) t%r36@ч=;B@'X"^~ I[Wl3<;0DɇT[a͠-im}tذ <9V :)S2IB38DJ2%3)jb5sMWF!ƌ<9@(L0, c$@e)ץK^18(-j_W- VctĨ?l2iCR8V9CAh7 'sk>W mkY+M`~ ;!Tj`:7V'CAsG[FT hAd|< 2EIՋ ) E(|Ҭj:S ])&}7 +)F|C~cҘW _ipTn 1\/Ua;6kkRIU8Չ;`[ J:xc6v`F82>{A}\N -O}Z_c. +%)Lp>f\}-wKC(|%_s> q9 ٜ0A-#TȟoqKP;Ic"RK#tG:fY<z*@pQJvIiivk}&Իm,/ ZL WΥ2.|o00zy~(8_I)^<nX(1wąkk~ 4~`Qnf9 }苖!]xIv@+&G[L X]<ǃ1 $y80nXM@7׮m(B(*,v/8=%n׏:(i%їx "!;ZA"R8{m#}V/j"tBӤjue )y*ߟDHdEO)sʧHFlk򨭭kިI紧EhC.ƅv--6~:4ȫ֕zYĬqI 9aX3?Jw696;8?TK {1u=Q|04dV~L+DN ZT'DC"TWR5>dԙH%g:*LA}0g1&z!uʮ5lUTl*bR4}6r(ҹ$9IJ~Md$zÄC BΆ Q?;eFpC,ccg"4F+B"wWÍsr .? 04"_FTT׿>e^ Xm-L^]124?5YZ߾51gq9p_䆃|ѳ$ƒ[,^|52]\q`0\TH&Yq4<\7QJ`TQ[*a-MG1L%_ G)s(+lejWw,hi7wI9i2saSvAA3OZ|L,=!q uV[pTѮRO=9v a/+/1]Vb|cKp;Yc/&",şplh썂#6%}ma+&MY\]Aƙ0 8,S􁊲!k,49 S-!/5hڟL +_(w1Βh>йWFw uU'FXmpSx3-*"w,PF٥sV&y9ĝyH[&Hj,c=\SfOX2i]G ٦Kopl1z,#J,QωIIMJϯd5l[p !Ey ZTu=׈Un J4{5J{Nh@67ĤH[)Xī 3mXDjP]~[B#TUz\΍8!}1iz=Ilė lV;Yh'`/V[m VN. á} %T%^_K*TZ #!7nD-,x:uꥶRIqRvF.h<6C%)'¿Sg7DkO r1W;YrZf34ᠹM̕]%3>'xkK{vMe%] !jC['gN"vW6Bl l0piN ʆ_"2[(ȹv̻ԺiJXsso@N Iƈ1>7 eE gԤ.`iv%;`Oz-w&ƈ;K?̴/d ttŔos \-QK~]SB6a/#\l`xA=kVwSPU3FcYp.mNYEWd;{Rzi N42P9Te8_1\2er@dHl[]lm#PS>AԄy9VPn5{Vh1~hLr1 8$^BpM-8S/ :7!e3=-u픻x7*1h#QI~sC-c\񟭬YۡgI\7֓-ٯaW4 B &Os0'{ B:=1\ڊ XFAgL(г \d"6R$S=])1]~ _T<[ė'Ky4j2ԕ33 |t6OHKM }lSE6>"1&˄>-uC&G?t\?^MJ-t$ѣ<8(dxfgGS]輭f8(-rg0&:)yEyo?s\Rޛv8[ /*Pbd[0L+.s+jMw)lK[[2dn3I[3e8:>ʋ#aIG-qydcl :Z$QUx](ZB,XӸ \jx, //LíqSj]?~0( < 2,9Riw*Gg*tfȩyc4X6Tknd7?+d)] !U+Z&+Ph}12f^.N䨆DyYtN bn/rv XYy8L"\S(!Wcӓ_lɽ1oPOe4X%ia1#n1y(g f\Q⛛i/d!b宙hĕ G9rum+Zp-}^nTَk(M/Kv+t\EkE:jrqJ< &9udl?L2X`֚]ƅ.XhT/KDD{ʃ;ڒmV^t((b_9g cH03v|2=Z$F_!<_-%4(K(qWW\^HUHEcK5؋4RTwSOn HfI *+m%B=Eh2)_̧=rK:xԜXGA"7{w Pοm %Jo^- :x+÷;WkIYs7F e`zV/,OVPM[!f5JDÓ66ߕ`\T7dtj;Ɋ$1@gsމuz iR{:L( .aK& zs-Y; YFm_Go'fȟ u֝,VԹGs_O?srGcS||SuD~-2ʇJgnqrv$u[Zbu?б:=9w-:zcicehΰO HnIx=ODD4 ž(YIjsr'p~ 8Ќ'ܮl~ҌÔ=/?"ٞ.ZEh?uV $ 5\[1 /¸:Jd`!wgg@C\ 28̮Vq(MMѱ͕N汉٦J5UIw\}`P"F o`ÅOQ=22'w<2[G*^ۃ·zZӉC'WȗY[kI :lFE v?94̸_7a6-7tø n_+8ti.a&Fcw\ܷDcuJ{ߊ+i P:Z2;۱.OΒs' CU?WL Xw鲶H:> 1Sw|?⭊X*^Y ȶM/Clh>5mko Cōm?P)+['\u:RASօUEgexXBx+, NZz<.6H%v Z)=T˿SVc7nmTƑVɑ<+wpS/G\{Uuۼ6?S!D 4/w89&Ǔ_@lJ`FnTʪ$!8kqDLHYqwC+6KY\ԇ>в ٙ{G%@$*?)uTO dc"I6QLqX#Vo ao+wEufy@*c.5m`;`:J l[@%G 'Q=+ܪR8Jd)7ӲS|삃c bxd7U=25OHU&"9#I_yU4g19Rlk|GG z 8<3(jt0] ӂ%# s;u1 3QXCRV T[3PLbOJ +Q{%!O)[%D[v#?@'4b4GwmB0lTk&Ոq=uԸ,EzC-664r4,.CM,bP WmU\Njضl~;CAIMi3Z4ڙwz8u)!! P!I[וs'뺏b8Yq){11NŠڗG%%;L:e.yvph#K\ vPq.<E;jW;adSpI!PvO6K_j`eOlŀQoX5v7aF̟s~ӟ-PZit G =321sQnw;mfxNtrt *MHd#=jFݥ)sEK ƏRJg]QIl ")-Z:T#Dk߫ n%8R2`a E6kډ :Rl(͝K"?+$8;9oGϨױ7ۿQ8.ӾfGT?ύZĊV 7A¦Z h-~6TȖ>z9 yo5n8S̞#KכfTAAy{C6׼sbW7.h1$22:4Z.c(#!1C T ,H.V9$Pcj 5`m!+C-8OWssRDGYW*ɩ&x Y @"5֢|u4z5hCj.*\c$QwF݂y)\l:AKnvHB^mU%)Vsyv,î_Pk$fAh~h'Fܘ i# / oOc>_uSЩl1OS%3|+ p%fxUX,N=% nT0h G\};ȟ``ikΆ,PJ =s|vl1?u.k@ 0 M1Ђgk0DW.teBopV&퓸|@˂"Q &, QT3])ב/{ ҺsiF -! 2.GܻZ%~\7EjZ)$LՉ% @OڲzET|lQCǶ%c \Io&ftŏ+P9Mxpο!= R(Tы,$uSmȩO^KK[q R)H#ֳII_t؟eʾ0}9*G<-걣E7? aCw-ڰzm([AS Cy݌jKG/kWd#?ƃ1 99'O|?Lu ȄK<;Z9@MA?N A)aw?v;Uw>hj]>-qx+}'Y8#GEPx '28+xU5E~U-\k,t3q1{uWx "uK -6(BBThA '~vTA  ]!I +:_EZ]zfS6024 \neju&! S+XY(#Z6]@aۋ>¢k7HVw>(7"P^wd[_a{\C2fbgN(Mΰ%&ݧI^I>LgS}ma%i72ޟ8Ld9дblz%w l1?O$-,.&/1 f70gQ?ofwG,]Dx-R.DK`b595ON=H.ˀ\Q`^LR9Ki z*}<p-yz5ňsJ.GHi I܈VlђM5"7qEd70f\7a6s<姗lT #O:9/"1ziwPq&9IƭyDw+W]F{"=!DBbL@F>{ D23D #p}vFqT!=z5k\ =IYoQ؝:7 e]hpĽ_EF#{  N:y3aPٓ0U8,1^s/IT{~~*. Xia/PZ@^Yu l BQGES}2>8 S|l "/=W*Y}a}YA qPah3abN-!Ygo4 ZQ\LbS/K+DV1`i SqWnALVxAR3nJ\%t& Nu{O$r+kSn%} 4S-j7'cbA-)YvgWT!J-b{id@g\kffְ qN[,2bITyk(FBg#AEcp~ s1ұWJI`86,c!qvIa*V`qU‹ ѩ`DG\ĉ]㽜mJ}GG&~0 EhU =<{ a7Qr:`6XAW,Ui]WE@?-wdP:qRӳYH`H L2=(q_j$$zvlw9“h]?ݠa[N"/ S $/k1@7_s `5OKHs?Krsȕ"<3krnUg[+h<-Ty3eo?@<NCj$g!N[o݇!5Z>H%Ɯo:ރA?c"5[/3 ,D/g=#굀I8%,dsq>oJS{>iz{x & 3&pd@[ f˴C--B2 DZӔ7tP3+x/ 7yyH`"l/XJf:L.P;C ӵ_?](fU/( pXt??:*9QCmNK #h&e,;xx}7mM'w}jXsI3| ̯lrǓFD# 8\lڬftPu -80ϊ ;#9ku9ۘ9OJCҷw~T^R>ב| {M DeKwfͯU.DMEaϊn<䱌AKIb?vFr+-*_ ǝk:UE3u#~aX~FW)UA@dIYk^H14sA_ ',UtZ c PAŰ'?~2\"G%(dK"QK#85(9W?1G5^!Pge qö\77)&ұ S[abfնʯ<_?@v]o1c$MnU%+%6gj棷6D7dPø52øa:[Z z`qBteۤJCpd&ZA#I =4>ULE xR3VpJ7CKa0=M[lF+=q`v:u0YӏTTz෿U?c]H&}k~(@XIWs ^Y!SomYzcfxK G4Cp+*ݏbd0+Q)'w)jJn(9< uN]S5`# avY(ƉKVWsc4Kala+%b>H\Љ-jv Ng"U`N l_%]t>ʵO-]%l룒-ㄕsAb}W_q}o$Å׋f?2+ _VzBŦ J `cl=Gh2wX`ϓ9`.R:Qv jE3rYl oչ, GoV`%l-hLQNR/qBݨ 3.Ph)Tĺ> )(z bȝB߰w]bgڕ|@ķ!|6eلhP''չ+a{ed&%Ug)yPa@XAYio',it j'~KSˍʃOQQ3~h1诲-+=XA|3ҁf:R@ bx?x,Rkc 2tW{7nQ6gj1s ?K4H0vE&H *p CfQZFN6-kLeWFVzRa*8{D}Çb2JERdȪ{/gOGoPM4MvBjBQ$֙DA(g0Sq,-|w8XR x&=ijo ~݀&y&t׹D X6BFmĄ`+ U^CyG=o A41 {*yk.3SA2S4> h-yQ~'30ZjH nF_WV~,Xq܍߆W`^E#~_C1G7tb->DnTWCZ.odQwp2Gڛ #/_W8鴌(o ɯg2Ȼ)iPe#$*nA?*%3N\[|xt0 U[E]Ӕ!0#.\prp̳lSI΋j5ea47ȱˮ]yD}mbfT}3s@ +I}) |z,Hu3$Lވkک0_]'߫J^J4,) I t;>82[zg"^) Ia+C~@:3{wQ>u1,H[?lY}? -O; @Gs:M8NE n| krLnZ*Mblhbm]@N*XZ6(eP>F8 ʉ3o,mAJ9|G4#xa,! u7fJq{[q#-4MݝtP ]a=t։j7 Wfxɗ>h^iwԸ7ٳ>y(6r!{!O #{O%c(ѐcRwHЇJBƈJ]k VoBpDH?N6 )+vh-9A'J]sV !P'gi?n->  ~%ULڻO1Gu Ns|Ey=}g:#[5<d}^K75EvCx94RIډvaEzu1ZF|kVM;E{^ಷ!vbD4BW@܇Э [3!'nAmˇqӞ`.ţK@~i6ԣŗ%jmmY BOlĽ$nAeCO%O<'#ļ>3K$qńhRֻv::1ASgxN,rTb"Ȟ`rꎛh{zt\p~nL_ZowvV֓ab1-AE<O*,H =ʹSb_;:jS֮uzU+&Tr*pfT7{M1]Ӭ0rݷ!A%gA[,Y&#- .Uе$-?C~,Ý]pTA;"Vj3+pydc ?jK[J;`kP[JcuxoBOFMygh+_XaטVM0l_/=2cVȲe3(B9;5iV7s(QĹN{ϻC'7 G%Z_21SYDZ&#yq$=p4mKQDnQ?^~-9J+k!!::=]@uC&0d]AnZ֔Zp[!Xji=Q.&gk 29ok@[蒣S /Q3d8 +&XŢ~*~Ǘu"$bG|{(`OSҼyM#ѲB1yYKCFxjla{UU2b/c[c iƭl.}Rm~( `<Ռ3vӋ mP5PnY< T-<ԑvqP+qRG(/VwmgWi{_֥ݮt/d{dりaZ]cd 2o%^LK .8D֭/GIweϐOWkPAO"*Od4QǗ/w+2Rfiv ߹!{т`~?.M[A4+xhŮ#-Mfnis~Ń2_[u"Z!ɿIa,'&8x\rsKs6aA~$~r`e[ϪCYrW 3OdG]5Mf$}ߝ>go1B<ȗvA!"`/5Ii7] jRL>,̠ڍLstMUOaW_{up8}ohvϛ:1NT`X ̥.%h̅1H^`s34|6e>: -{.Q/\|BvF!t*vBWUF0vBW߶ qc/0n)7RJCG C`}D6L?s+'~lLQ7=1+xAw1<~c`b& 1WjLb  }ps>;X%"|0%+MO٧'x ~!vRq%Naf2pߡMʋ1b/ܪ ,Ox>1=;*Kևr 4rhMwP, XÕ8@s'P~1& b(ф2a%@ksKP ^(4Kxm3*c04ts }S񸼗{^0N 2֓uE[1<%"a%̇~6np54Cdg͊@3LpS$cNn>Y!gvHW ߠ?3k!;C@dxU(oGB y[6nl6Ska6}(ztutIOsTdͿ&A/_)?s!Z&9,LKt9wt9KDWZ5]qde?~uC\C @C 9`9lx S[%+Ȉ[on_pwJhqƽ?.O 08U@-T UZ.^tS kE!Ը͆(r]V|Xv;MߢƬMGNjQ?s"a4wOj9)#ceopکtmgF=KǮFq = z5~k ;HYReZB]FGm4d'&-YujR"U7. S+{RZ Jʌ<+gZ_ `z_}PP7lRx)"( 0X9u 7ɈWVP 01.2S#C̑u*$NbO,sfֳ{+6 "ՙH|&ETbJRgwH nW5,>!3FH )B +T(jbS ~YCWLxgO/ fNK,nԓ UE&1}Q"Q ZjV d2%CЁ& %_B?oI]9b/O/)S HO_ˎH)$RtzYsHh뤘a$ ^9Dn1;ՁPI*U%9%sTrʡ{6Ҥ >[?KzHYUi;H=* `#ӍzuΉB Z77ʚ/V2BɡU?ם8hy-fơ}*GyS2" exJ}Gp3Mwo/fuuO*8!T{WCu7S݊~pG` +Vi(tYvt_i.Oݓ|J_xP}z^lbiݍ LJK;,ϕtW1D/Muϯ9RHSX}X]ۖ ?0v{齽4tLЫ،s:ms,vͻx OzAP0M,~*'vw5b廑 0.&NjIF%`30[6FZ,̤pj|r[ⱿmMnPTG4 |'\_JvS!ߺ3L\[&ғ5beƝ*h<=/pZrϴ$II`Lڣɡ.h;@0<y_6y9X>hkXxeI;;<:;*37af2𨣹TpWD1${[YPm+iyX7Wa森`[ecC ۨ׊-_x4=btp զk5s 5x(Kc'+Yqtzy:/>p!,,p FxڱbYz݊ Ut}Ϣ2{(@4hy|ҽ6 c+ӺXuO>{*aS>b JEU4O֥Xj^7!E=Yr4Vsx"б!A TՔe,L5KAN=w-Xr6y#óW.h%EڟrAzռb[@nO&A7O()VhI7H ~ o#?'`90Fdkqh)iK) .|%`r)#ŵލOi+1ٻ] "Gc0F]!R蕍B2P.Yf\a;zriޱ ipea,˫MCA9UBKW*jҏtm0ǘbzUҖ`56iH5>7:+ L)^طd$ƺzKʺIə`0 f̮H8CUɶzuD6;CIdρZdM㣽: #/oDY.a3@%B R"⃛UPB ~x*~l}(So1x-{ɻ|+>rloׁXr{LGϐ?ts5^uğPjg" }߬RƩ]vL_b?CI-|ѽI]b H;WNmMTg{PÝc쇛3٠؆^61 Aq%bJzn OoCv:}y<5;j̷̎6g'͚wo]xy#/BBI9_tj Cfw(ݑsNjyXl'^*OW!ռ&VkZ xHƿߗ gnBY^~S(Y F0xg!qy?~2 SBG_-6'oΡs;=m{6kspYbg*`8-M7흶%3g6$n!U|1J Xh_þh>[H.A8.^?ڑ۱w uEk12Oip'.ZFLrYmw4˅I>xX'Jh0.c˸Uy,5؂H4S|HkO^n1ND2V,(ߚ+#pg[K!jV<1˿XxcF4]/HFvJe*M`>PTXƂ䋑*'c;>*Wt{Vƥ7 S1 >F.tH$jN_1XKm_2P—Ƿ˒=q]+ 5IPg ]۴dfN6$n} prRDؖEцE~:myCR^şgx5jF @= :f`E{ miYoyET;(vELa?D",hF|6$ b$(*/v1}KS+(& MwXǜo)챟zgInc~4gй8GK҂P{nv|4 f%*;$hr?oC(=Ɣ~G3́D﹗-a w@kq.k؜$L&m2}f︩U*+W*ءZQlƈsd ˥R{EN3= l$}E@h/TpWo[ЙGcb\: kE't஢WvF`Tw4>8l])ݳH"D׀B'OOE1Au)K5 $q ZnCugSà~8ۡ m=FRU͗Wj_},SI@rWY:c󆌪‰}:gZn9weBLݨp#o L5^O̢z3pMX}9kV3B=A Wc&y`kB{иpXzU1o$M}"~᧥AnoƧevN];z7rL\ 3x\g .fBiXiH0ieSXRz ;.qI?'zځIq0OV׹9KhHC*S^,;XzS{)Eg]@9P1+5  "*]t:DI ЅZ.Xz˨85Ajg7U$aG,'* EW dD@h73<]NZ$-T:ѝ,==7of*șVehoM8o7X6c _4ėcˎV<,9!/`lapK`ݥ5BouӶhH8P^8J*ЭHG2hA&4b4s1,O+PIH1:&@3Ip58~UWn ZWh"?B^ y5=;PfWOlw=hjtb;4}l%8(8?FԨJ%2 ^Jfm}[4;EsIu,uCwm$0* (^% a=F,lf6p?Ք|~]g>pæ'"yגR)B^~{4Dd^w%;f50$V꼽 [thۭ=sԤK`08@|:cbv:ʟ-Mq*]?ٵ*>l^OJ9!PZI vɾfD"ب2$ߣ3ȝ\e АqBܿm NpBG[n\eG/gP7))ˤm׭*IY8 VI6oW] #GIǭAs?Q!wqa>6 Lq+ %Dǭ~qb H^zcthP(!!"-{V82 : :k\0 T[,G'P.Eq "=x9T9jT}nfDz[ m3EOQ\ߨ, 橱haiYw"W/k@8; \ _I%OvgFG]z=bDԨFޅ,_ՃH0zԒ'PEdsC|8ӧsS;gq_gJ`F]z)?qސnZ;Z?]be31Z3 Y$q{I  [B|m~X{>ᒈaչu2gnjBnભ&7XzWLZThS Uߺ6b]H%[>Ƌ@A#h=4e;dq&A2Ҳ$JĞ.SRL~A¿mrMQOk*6J20éF#D^(0ĿuWz]hP#6ugQh/s'~\O +jУB ]ܺ6ش@19Qx^ Q@/!EO6t rcS靹@p23os_Rdh~T]<s]هI Z6C[l(:ҎO.`u폖3f a?`FZW8nLYe+@.īUG"΁7 Y"tZCG5"ArtZP" 5,-Ը,ū6ۡAFDC& yf0*EgX0> $˓]d_1we6L X7y|܄g;YAcd;'rzMvQ9xe-"$+rwZp) )>|'[[g&/:+HkUBLxu;38GXhpCb,j2L4wM=kv#zϧob7Yʈؑ㉤E!&Hn|QJa`GÏdLQY:R d? F=}Zۖ"mt4rLFJOl,Y un-/:p-H>^lga<<i(U[i:C 8 _x*&r?a~ei|5kt[)%BAa+F;h8,}mGt¸#C_-y Ϫ k6?}ڨnTXp K"y(f\EI%) 婺]iވ5)!}cp h#:+ɕBITS=/>N'!&uX}{ ݑgZ)!v570d4Fu Jx 9-"{pmCQ d0OH`CR g ֓ |#oQsOțD8^@EJ9;Ko%≜Wp>MtLp:WُJ@y @uƥWt-ncæ"Tf} P*J)v-XW 2ZWVI],OF3eZkNa{94K[; h_2!Mm\3`;nW7 ~N2)Ciivz/ѢtrRNw)sX iqzK\,!sBEF۩[m>;/>.TB]cf9ze A2DLT~M;iX}1W#pe_^[,rkIIrjER<:v{ '-V06_a0%u@Q]Tpk62#. .η"CPuEky<.{\=XvR)O*( qC1*Ƀzr!mƱdPgCk Dc9x5"+zLnv?MVe[g ^l8-1(in+o%@ DД{wd^X.2oi'$c𖬬Q>to2=U@*qCRUtv[nʂD%z-@;5 @k{81Y9HiR|7a$wH$z.ײeC~Td,E{>IɉЖ0=5F 4,J ^ WN&tcτ'Fikrh<;4;\dJDgl8 *Fro^&wݸ.BHiEzkF mPyXuv0ґ]0 -A<7#lw2WUֶG𙩇zYUMf\,S{/YG"DЪ(t>C㘘WbHքZػtZ54"yHypi^h0BAwt wlj;tVQ ؛] ID*,DuQ.Bĉ֫KqS~s0ц}VН+3;goo.]ܱ&bp>h3rRB᠅pW>*TZuc[۟pu@Dhu \\$e2Q7QfKړg-M}^,oV(]LS UP(1Y0S-_hkOc!URCuaɤ`[~71)&Er C.ԝN 9gֺ d _{ob曞bʃb7[h.,(::L{fo"uJV .+ܷ} Պ6`HK!݂\k̴ٴCa6_CXU܁Ҹat9e30:aoo#aA?v{$:WQ[󻈁rWGnvâ0 5̸  Bx8tVd5k}R2=4rVe6Ijh&,U(a @!GF]W欭2U8Y0ˎ8njVHZ~. ~p=C{dAb{& $ZG!Y!=glZ 6EG{/KM` LCJ=5a>glAESÌ满`<{4%f $~SɩXMvnuRovR>1cE'z.8o  nphվ02a;F؍-y/nVH'-aNBs"ٌa2D{DW[*8%~\Y ^E"ҕ B]{j:(|ˇG3q-ab-G"쯒Q'fC2kz|)%xؗ-Y |ktл8R2ӧD'D%kT)Z[PAi2hQۦPҔ#C}Ŷ]"y4f)-_5ʽ 7;~TIlͧ~i^76>'/ɮ>;A/'s٨oS IVsͤ^"^x{v0"(iouς+U@`jI1\HՋԀ=-'uIHgذ-:l:]q{ۃP8Ƞc|Ef 13%lS}Ta>7 m_Yx4HWϞ)"zch+alxE_I5bkT&i17@Fy0+Y սNP=1 AeN譌O 5-m˞O,Ro!5՗j]>A)Gl.@d>HշW'Rwʽr7 | \o~׺B/ тNJX.RRMUs($ٶގKݛrmdL+6^k@ҪݼxNf)1]#'p hަqYdknHWc-ף;L -j tOy M=DJ&a-zK /5WĵW;O3kƊ8sA| @vQ#TS[.>E VQil)Հ)P.!䡰_2㋋P5;]~p@*5|ˏ s?Q'h7stX.u~aO`l_ӤZC'G!:} p #a9;@6j&o'T 7OR<3oY3lkY5ngdHjd%pq+4ñJ_v !kĀAeEY&gNpiHK&pa결 ัY75W`d6<i ,4AD(z(e!/0 `}^7x{Njȓ.\zh8T>||:Wzblm˂DdA%ͬw^M%>quvoEz=knȫ]s;ՍPc{Z?,G*26Det)~Ć^=%L>nʬJo'CJ4qm\`Ʈ'ha,&[fr%]y:{v#M,eÎh) aZ^'!>l!F\Fif&MA_"{mV5iW< ].SI@#pA=֬Ifݦ|9\!EhޠxQwP#dWqؾ̚|/zV.,0$>&ENJ}Vo) cHF"n2UQQ̨b'ƻ !#nѭ0A1>8Mu:#he!,o ĭb""Ld*$N}v'e_ Z7>\-hxz4,b3sjdut\O?6c'  蝓!ډ:m8Bb`Q1=t^'+I-|qOX"C{?R 5\VWO˔w.ÓN``|U2ld[Ƿ]`gc'-~ۃ;u1[(אj .>|9K-'Inιw \oސ4N9+ޱ~17/BDWxR*ٷ O#pn>2' j0xO2 ]%5/TK\^{K_7|NUzۤ2A*[Jc^nEt uǵ *6G[TvÓ;ʯZvYRio@eYɠnqȵThk۱_kLxo:EǖfnVz |$0j=3_ ;%hTJ)qqzXcZ6fUŽJO5FƂl$ODA)MOCԅi3O g"} #X|CY uCOPڂ{@tW| t7[=ֳ7i.dG`mkNZ!vs| +c|C+@1kQ2ށM/K%(raI0oU:٥F/^{RED_ uB, jKc(Ef)"| >M9fPRLz: U6Q Qj&ttUq~uHlQ MRve%2;؜R7 _xJH˅$iVǢQotiLO|bؿ*Jk#^qDag6rDlZ9sHAP$P絈9gfL$,Ϲe+4prH?vI\mKe;bo{v:UpڕVšW?Fl a| u #N$:E /IGAAO C % 1G݉tђldžbG{Wݨޮtqwxt3Em׬t8 N}qUxyA\O];'w ,`[R]4blLچ2~- @60#fwGxw mj"‚Ȣ*\mJ V.)_Z.wbVe8}Qvg " H3C)Xk)Ww+&*EynwHvs\Ո:(nNƞM2 a;L, }$dasɭhm#o&JkfR*R V!z ,x&t%x(>=͖>?Br55/H@b~b [T,HmVf?K3$,HdF对Iq7I Ka6Uܣ㺗GI}wW .yůJkX&Ҕ{ 0Fvԣ\YhwP՚X$Aڗh Ws%\$فT_-<U$߹}}Ntj w\6ˢ^VR%£` wOS]dI[XTJ}?y0yZw]0:W`\MWnK\t*pofg7Mjvy_C@[t ֲ\J~!y߶'"+J6IB8ejGMք҉Z֣t|aZEk z &ψQ AQ,|Aà%$3hMnϗ\1B!D= a.]@!H{DP9V'LvbNwI8XU.J46T`S+k&<~"Ll)<[[rË`SK #u?JM>չu`6نM uG{Ϭ =Q$g{#TbQMq."D]_)KoBܧ@qTBX`ː|fOP." j Y dGm+ͫqiT-V 2~c*x~A+.~,r2JO2 ^'ú\bp;sq&; ZI4LmԺP-8Xѿ==, B:Yi@X"Iz)0T(2jiY&MW}z'h3bK] ()c9{OzWXRaӆ ǃjkWueJa g!1n:m}~y;0Auz!6m]9 +t'>؎ݮqpS!×^%TjAȟOڔQYYVwBkeϷ2hܹ0tr4x8zMys {s@F[Jk,9n#bA q NUH#.Ƴ4RP jZ.ک`=DtIo?؈BO9WrMC$ܹ0!Jy.J3ڣڄ-خW W(`sќ _GЩM'*d MSAU,N/ trm30~(:Lpz[:?ޞ1T^)(.0F{k`ri lϼѯ-Nok<i-[tÿ_s+W8Sy/N5Wj H1%݁O-[|Zz,#IF~}rGޱrp*fEߨ:pj\I)GNvP3c5}9dxJ8.?ܚpߤٍy/K.+SY39P9w~6tWec`GPn?lrinxsY0_Jխ|}J5չe.(8jn9}/%T Y|1Mev*y~O6U8PehzL]tȱAY#?˶\3l2o_?XT@(s_Athk:ՁZqgK"G.:/qYP-r\aGX WBby%z "xXbh!-zSPρ/Z֚^o7`zC^Ex[",ee5JkF5=`gYJFm{roELDwۆ;_^ӱ!۠ܙG1ozS Ùg!g-9_tOTN4Y!~(\šS@agFWT pGlQxвc W9S~1Rܠ u^u^O8_j@W2/T;`r2?Čf+O_H;Y}D]4CՍ`Կa0 iiHI16`tzP/;=ÙI_g}~I"`ҽkro2Bvv-ZWNޱ|kŨG|N%eAmC >/d]lD%N:6$𵶤8MEOkZ1LE5ޙjGgN \R!펞$Cs榹pUj9|-߭:eG_i?&W3mqJgީ? Ooᷴ'FuN ; uXmETK@JB'Or؅w{rI=C;Fc j:0qnHޞ\T(# fsa7X*ݞth;@(A^=xp\7FLh# v;'scVBnh7 5hMW> E&=NTHY@BB*0H6$6h9Mdت=JOrqWD]+xp9a |7̂{t}/¶IϧrҲ4}kYEت1zD66сڌh~ ,ẅ́=C W+aPeX̦]TjDX=3JgX5G*Y5cFPᄡWq?oB\Wq4Z dzbtt~"ءJWty,l׭QYQ\C7nR\ք_]Hp_feH7A3YCż@0Hl;_eh{JZ+g$]Z7hz%K\|l >%)c%7>ZoK~ 6<Oʃ1Ƞj8O-Q4 p¼l{.D#eo-RKY^tAçd6aгA0wl(P)zCrvw6d `vλ< Ys(z^Et&!f4n 6_jAlɮOw" 8l*?LhFL+%k-lcO (n!ISEȔoxV$^;ԍ eO|.;d?=a+܃/4IRqҧwu|UJ#ErkzER®G̰&&'hZ11$[">E"I)9[}n'A1FLYorN 9EOCOTO\XO4US5u}e^Y3iɭq!Q+ 0=g'||Did> 03$20k{vK cJbv IF2{yu'?̭I_F:%-9Ie{G|p硅@$0I"袼]U&[\sljʄQn⮕Q3F- PPal4Kr*i*KڤRSto_>8'`F&I8)b$Ht5^Sg E^K7{rLgz@qrJ{PH_E1#$W"GBࠜU&1!bjkl) [}">H".TX·}o"Lh(qi!TBȸ^5T YÔov\ML<( ,8 No l ( ?w-%}.͑);}C`7Ϯs.dF3hG1~f1EӜB\ dJs9 Ř GygxztuqL/P)$xq\AFAϵp$piWv!Tf<Ŏ*+R>NZCkuPs6}s׍YuΞiLƺ<=/06]& Y1 GHrՒ\-Ge}@qEc&F,S""lT8I]61'IUw񿐰_Ě%n4ۖ\n*t"tU֕+ o0%fbS8z"G{jJj4&GHHMjR?SA_(\qV|='joܷK'Zt8o^,BEafĹϣIB3}rԑyՐ֕.1vq0 *)zg1wt*߂ZAJ H6;{d?iAIV|2N "wd?oYtԕgLFcte>{}D )鮛Z\<эQIz'4GIKHGzm']c #q 0hdН##*xvubDz; t ? 6s&I_Զ0FeRiW6iqc#'|zunq~eiC@ܻDʆ[@g;JG]n^R@?_A'hyω8ʄ3[ֲ!Mgz~YLBց&'"5]BU s?_䑣!Q&r^k8xt2%k Dx 3` 8.ExC5Elv܎Hцqм=H ,:sE;?:T8/⭯k|j 5}5o !gyd&\(uY&*̪9hJPdNS03&AmN2u__<Cnvkq™tphm߱2g6\8w^0fQ cmAv1)텬l譖W ͞8 V:_6`=pASq @w}aբYۛ/Q5XWylU3`FU$b n-5F1M^}fNlV6MlAXK3ûHF a8r`-x'wu}H 3K*$"H&`=-:p׷!ykv՞y89,*0h Kڌ71?eXRo^7{ _86j\ph2oӮM|&"5HnHgrRk;!0Y:)yX7TZ-k*(N;)A-@I[lSެkz?<Z_hs> -'dpŧ`y[ ? z~g@/Ԍ|V|R/SLsAJ Қ/2c Jά_`q04U,:n~y. s'q9C=]eݶmT&"&Y.Yd7h=C9aუ0 ?ml-Oލv]zrci"p1/J”Ğ#CnkG̕J lL'mRhJ""HA`ͷO?GYXM^^[`%Lld܊jI?jIۂTiny,1AۓלMfr*w{GvE '?( auJGepZ 7f C؟aV3zZƙ;/O5igwP%ojX*?;aC,0㤈MaWLOG96o49m҇[A $MaQy~݃nA}JtU [cVE7dVՋ+Bޥ2Ǧn޾7w4V8~a:ݖT)xP9 tsLNyt4d O^: (PUR*# fCLA6zy? ڎpNXP{(K9L؉,⨳F 2)guf[׍ 7~Þ-X&l*$ԛHlPpp^.ζ<JcݻAFƽ;(j!nڎN:w˦ĚV5ATԠg~R^> {FWI| =fG1}* ѱz(OG8jz~u&G.}\9R1LZ:e䈄UV-HӺN 1~```VۊBn3wZ_s9heS.y>(AvD5 R z<Z;At@IkW3gpxf#7vlbuٟޒ r^ܒ݂l49o*p$yVfz9tR$@#p:P+i:?`MqGX5wE~ۺ0ENl2L:vn:IZ``ںiCB Cx\dbC c.?+h OPJ-4Ņ `wt8b8f]7L2ϜOŐi3pN EK濋._ENdJݚk܌GBHGBoɸkC*!L1OАa 3%i'Vt46 lrf=olLP¸}僾',2m(M;tB|g4R1r /E "u8yd`vpwJ]F`.)dbKj Ml(VU&qfR)h9Clp#kNדYAK[vWd&mX ozH7t?goQܓN<ĈPID᧝\՟C5np:\`@y_~Aͤ2_ |y<НHAHqa?ӴXjKDbM A'D<قt՛5*bY/V8]"5JFYa^|'}Q: x̃e vU\B#hvZk7y鮹Z&Hp)@!n]Y}1KL5Wr"*1uCy׎b}qf͈r3Ct佶2'3KHg(vxr,_cZz3Й/T%P,CkYt\Tga H<6Ȃv:iQ<ħTfg.U̺-*Y͊/._u?W5?Dmw.+ M?~cy<6*GV=Kp~CG@/pLN j&P,0YM b^e0^ZlSYM`SLz9cZ6ArBb7@sS!3!~S͊ _|=#x=`5!ߨk"7ԥ3bLCNTعdG🉒WeNc 2Cc)1^uti_{w 6fhd(ȱwv.>'7}}?~6DHJO3a Xs55 o"kUB(>"3#)[z6$hDuAGdS^VʏBTZ(6gׄSamyy6ᶔ1kIlS=Ѐ kYB"{d$w