aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/phpbb/controller/resolver.php
blob: 1cc8981105bef3846cb5f6b6de3e3e7d13cd0ea8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
<?php
/**
*
* @package controller
* @copyright (c) 2012 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

namespace phpbb\controller;

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
	exit;
}

use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;

/**
* Controller manager class
* @package phpBB3
*/
class resolver implements ControllerResolverInterface
{
	/**
	* User object
	* @var \phpbb\user
	*/
	protected $user;

	/**
	* ContainerInterface object
	* @var ContainerInterface
	*/
	protected $container;

	/**
	* phpbb\template\template object
	* @var phpbb\template\template
	*/
	protected $template;

	/**
	* Construct method
	*
	* @param \phpbb\user $user User Object
	* @param ContainerInterface $container ContainerInterface object
	* @param \phpbb\template\template $template
	*/
	public function __construct(\phpbb\user $user, ContainerInterface $container, \phpbb\template\template $template = null)
	{
		$this->user = $user;
		$this->container = $container;
		$this->template = $template;
	}

	/**
	* Load a controller callable
	*
	* @param Symfony\Component\HttpFoundation\Request $request Symfony Request object
	* @return bool|Callable Callable or false
	* @throws \phpbb\controller\exception
	*/
	public function getController(Request $request)
	{
		$controller = $request->attributes->get('_controller');

		if (!$controller)
		{
			throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_NOT_SPECIFIED']);
		}

		// Require a method name along with the service name
		if (stripos($controller, ':') === false)
		{
			throw new \phpbb\controller\exception($this->user->lang['CONTROLLER_METHOD_NOT_SPECIFIED']);
		}

		list($service, $method) = explode(':', $controller);

		if (!$this->container->has($service))
		{
			throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_SERVICE_UNDEFINED', $service));
		}

		$controller_object = $this->container->get($service);

		/*
		* If this is an extension controller, we'll try to automatically set
		* the style paths for the extension (the ext author can change them
		* if necessary).
		*/
		$controller_dir = explode('\\', get_class($controller_object));

		// 0 vendor, 1 extension name, ...
		if (!is_null($this->template) && isset($controller_dir[1]))
		{
			$controller_style_dir = 'ext/' . $controller_dir[0] . '/' . $controller_dir[1] . '/styles';

			if (is_dir($controller_style_dir))
			{
				$this->template->set_style(array($controller_style_dir, 'styles'));
			}
		}

		return array($controller_object, $method);
	}

	/**
	* Dependencies should be specified in the service definition and can be
	* then accessed in __construct(). Arguments are sent through the URL path
	* and should match the parameters of the method you are using as your
	* controller.
	*
	* @param Symfony\Component\HttpFoundation\Request $request Symfony Request object
	* @param mixed $controller A callable (controller class, method)
	* @return bool False
	* @throws \phpbb\controller\exception
	*/
	public function getArguments(Request $request, $controller)
	{
		// At this point, $controller contains the object and method name
		list($object, $method) = $controller;
		$mirror = new \ReflectionMethod($object, $method);

		$arguments = array();
		$parameters = $mirror->getParameters();
		$attributes = $request->attributes->all();
		foreach ($parameters as $param)
		{
			if (array_key_exists($param->name, $attributes))
			{
				$arguments[] = $attributes[$param->name];
			}
			else if ($param->getClass() && $param->getClass()->isInstance($request))
			{
				$arguments[] = $request;
			}
			else if ($param->isDefaultValueAvailable())
			{
				$arguments[] = $param->getDefaultValue();
			}
			else
			{
				throw new \phpbb\controller\exception($this->user->lang('CONTROLLER_ARGUMENT_VALUE_MISSING', $param->getPosition() + 1, get_class($object) . ':' . $method, $param->name));
			}
		}

		return $arguments;
	}
}
2?,gB%VBY$M4WM5܉%XkRLj^[2R28PBq ֒AN;~[z/@W*fL!F" azFQG}qUB,'=7)hͲ7x -CemͼX[.̬9e vBˆ ^G"`06 9dYľIɔqd'9dtzjMnEFr"t~x&MYDBxf$ sw]xPBnY FhҕM+WQ(!CNAwzN5sb]&O=.h,T+BbwJ-2H֋*ɗ4k"2<33 "i'6"5w${5€k-JbH{%ow~lm2|}-Dh6C\.qB{ K^=="IںLaI$M鿥t5슻 ֯.--^Ę|qpej?}_+(E a|RU;lZc&TYg AޞԤd!*'1,|;XNF,bm&Uʋ0}BZ= C.ۏ !ߑDI$'L}b/&&ƁA7cgg{*@V6 ZsPpXKp #DvȱP ݨv!v`N7 2Sm󽡿M[xg Ւ^|* ۇP|oɐVp^JZ:[k%NC_ƿEGtIJ;bFr4lEXCDq̏$ кdNd2e5=r.Z1@!"LU^sWߵ3i0u[5IeʞV8hIE3:o"tG %> .^' E$GLw{"RBie=^*WPӆJ\@oX#!|l$AIdy:Y##Y2x#w OcJ&95ΏoLwF~b?dQ#L=j"…0=/kgy&4774/~9KzʀmAWňzv̢ }z F;fqjLl׺[bɒ@^titQ\I/3 -owOz)Ѳcz xS)>Ј|}" 6a/t9?pQs``*P}>#6sb$u!Y ě{ZEyi~Yb8A 9GH*yײ!F {io'IdF_ݪ\q Kw8!hv5 gp^}ze҉IekWv>k +:@T ttՄ|Dخ53Q$ie#M\$b#qW1dv|2Dd\UqHcT -U#s\uAKSMp*5'~BlB}]/ħ;%/E$5Y0|Q>*2īH #aI4CR[^o3ʠvkzX$uV]'u21N`R?d uAޣnr17~/~ƛY@_oAZؠ|܉ ]7D*^©s!/۪mݷP :HKF)$>t3m;+3Kqya#Ij&?;Qg`G27O^AyZ-^u]% ;"eW_Yz +Y9*-e-A]Bk8f*#B -04'q"V!WP8y9!A?'#!5Q:Ʈr\9j=0L@,\mf_ 'JTVl!B4qz~ɟn8dC90C=Zǧ:4x\*e@ץ Um,CjYaIpfq"XrxL}xF6ma:Aϒ@W2#P]g;Y~f3U <'Blz[F iC 56wm#ANf$hD0nd!N7 ICJ2ɌSL\fj偄Ѷ]; aʭYA*D``leZmS\=Vۖe))"[15y=W?WӘz:ǔYRz9~~p(b~0~KU,Lp)TO:m€pJfPMz4Uw/V]0J^ज़8L:]ML_Q{rV{6,D*>=Azsl C-fY XЖ~z5Jjk0aFeURUߜ;?s j7+tO˙?D(vOnUĉrڴ.,޹_sz̰]IJo`G;,u%mx%?ѷ:$75[jrr$CL5)qma1Uݺ’`eqP}\7fPx^Xe+N.(2 #=7}˵ohR7ٛgZ жSo:OPJ%w7D>I s7*s QʍY.|jO˽\V#J0CU7-e4V_.Y7 :4 :pwcRFRߣ<#;06*I:e\$Թ~rN>Y|1.ZWK!T] w(vAX;.yw*=jɑE-rS:tVvUaľ^92q Flo Y{HWox ^ib:P(.{ %:NYe%ϊNH 6VITx PAS9!a^HV-Ey,>qs[#XH}-p:{`ŏjPI:*6|XdMAj"ͳ A˴G+-MI,樠oyw>z;v(NxN}[N:a׾.タa)cp5o^ʑ#x/XY]qGGTWRI{o"幉SɊh{Es̉=y(jveʸ))!ԕp$TD"3C{&Z [ ׌VZ!POjh#]SeHF٫`dU繪o *>+Hm>nx^D<@5>pcV<6/Wp\VOk'O9[Ymx=GOS5nsLz@Ҹtf}Rx 㼷m^Q@V"z?@HK&_{*ܬ|7g+c-i;nngk1Z.QՏt'=7IV%=#%cE,;Y-N;+o_=hk׎(Σz.Jl[cZa57kzx 87Nv=H@FI:p!g8"f: ~WCm፧3CVOEH,;"hnshMO?ԌLE$%%JT\B48 NgzK)̭yc/i6ѶVg٦ K/]:w9sFV 31!aUDTjxQrn+0ZUTFh7`| So)Vbbknd=udFxpFӃ nU{p( Tq6T?,?jI7s 4|3ѓ,DŽJFvF܍HT^2F]O B;6Q./(3QfE3m!Ha%) LZݱdrP@%p^{Pm-_˧3PX_L ĄUCr폵Lw7?ڈW܌"Ux)jݽO^vr=j` (86uEԟl%13\1G2>@镾;`C9*l}2m(ShVMf&;IX&}/$о_ jΣr΢iOwq"IvV#N-nyqu>e4ڕ L֞R4_inPc:"/ѓ m>;Kgry~3b8c"Pn=Q>"DOd UxBJBu4 H>? G[6X8 a-ӟ_Nvc~JTtMؤو{C;`D՝֯x}FnrBFqJr:AMҿbN-a 퀇ְ f5>pd0];_`a=MT:" &g_[!z_̈́s jhwgww*P)i[Ur?B3E[Mt|a[&~M[#M}?c$Q%>hh&D#8Sv>eM<(>Lk!axN عjC+FRulGxѰLNd5^Ѿvw;)&W'q̄IwGܡ H>BiG(|纖]+W-}n˾/HEdBWؾD(:۝e3U&] [^!|6b[XFY!u[2ar@߷g@`mjƎQo>BRafSjM `H5Xĸ p&~ C/|Ɵ9aY6ߙ6-8qIi|8^t\sЛ<)'4EP7\-S^w 7Iy |d#Q]iyI\k DŽ_6M^[$ CKp\oK@%f\mWCF1ż!5@`垈b$xd m$B!zO 3k叻5d`t)֚2ٜ(" _~Ca|l ӧmyvI&4wLʮ4:M18sw%2[On8LSQ[p<|ʷh =נg>]wE:;N_\Uoרl %c8J|G"v/*|WϙA)B{g <-ݭw_~GlWj,Lȷҗ H?ݡ\wV>+8Yss8j%qR< gdiA'\k)I&|=] b|E1^/3y -Orºr{ pDFlQѱF7fE`EOm'9⎥/6WCkjjG[ՌG#47߉4I"E7r@.T#5݅8[p@uc>:')XjrEzˡDw[P9+hݎ@\g%ΘZ|l4NR[3s/z8 2\h`@g#A :teXCN2/- 3J֘[)7þ2rh_L)&LJ{ikC98 |F6K&(aɕx1b9Zs1 F6fyĦ {;L't#06D`Y=9 [C@#۷9l^\ׇ5 |ȇvBM䣏 Db5MNp t{>$zն%5[؀7٭T1x1@12S8h5N(Bxl{^Fg7'Ă0#axDn}3h =mo-?D̜PMoS v5Apޙ`[htK7jJZ޿:M gY++g{Y[ "7ԁoOwzp;ϳ o]ņoU!\7-]UgX֊D R(V6nHVՃ)؈3E@͞PnL|AqGC \7422 BlJҮ56%",ßUvWZ V%D2D*İSh ̼F@dWYxeyH E%TKzy%|I6?)i( v0`A9L; V. .FQ%~1'kJґF.eRa}*z%?ض֊pC:O<51ih,teFakK?undad2W)ݯ𲜶,M!PFqU&/--oXd<' NYz6!2o'X+<'iNO0FN*fvhS`DѧӘ9I5 F?V'fC;Z3$AeR4J/mt ,mkĜ^ Gz&&jj[ %z!ʑ+ uh-g_ \[ Bp^|ד3FucdڱVu.\l9-ZcK`] e_xq==7["dx*.WHSVGZϭʁCO ]0C×=HS/e7^ ̄e[WT58 W g'-vb bgʿ-D&ϗA 7Zlj]w=\j(wg~/зfk¿zIAhy 2x2̷9ܴ?I8.-lf/XFPwI8&orY4^~e&Hh~(Ӎq^A{'ﶴn5خ}IX;@(5+#IT=~m3PsE3wtR{\+^7UM?8Kc6-fVH݌); Ll"rүTV.Ii<EZ[%&CFXcz) 7t[n,DT>EHv! S4XB%"x 4s *20tj?VcV7Nt31uh.)#MV+@ZHʹ%apO4[yWdnuYITH{)OaNaTa#%f2ٔ DZtz8ƑFyer+x`.ĉ=wؔ+mgfHB|Nd"M=r%%䕒6 g7:%_sǭIpGi SMAh'T:y$7Ł; 7_Go }7I>26%;ܙrl9E RA | #,-U ),dvP^U̾!\G?^nwd#Rm0D!4x-kP.>HP'  ˊ<ڽ7c1Qz\B.U6*ʛ zKp1F68L%K*tgȜV9GT|?& e%h#]RT`=Ph#|8eGrn 4cz~4 ؚUq0=ggq<&"[Kab@*Bϣj'ݴ#u!v .f ǂi|7+W\k-u`š[!"ͭט Í"(=q=y8Df+D" Zm .h+{KO Rǩ">@k)Y/:8w݌|+[ͭDR Jqd0QG Z8FD/AѥuBuVʌI Ń }i{ fA3PLdE1{LΈ`{Ks:R kb9m@(u+O5hbGdr5С_R-V=>J}PDw `mbOaznwu)BD-% :W f ED8OGhY>%,yOV!^E?4 3 S~q#;36N:VD^^oT!@Z 6o[ܟyx+2*1\.?HUv8la>>HdOo};hA@BhL(b&o@< \F=/=[3)Pd܅}q>HʿQ(Ej@J$i*naKϺXOi$߉rBR2p爨T+!ә=zCs4aTMa_nzϏ2Ң P1O^HLF 1::x'GG kؕYOEvN"M)O*j1.= GQҒ&t[/CٔSB {B{(m^wg-7AQ7W|Jdu$< _$<M7%FTVLObwl?T{V{^6o)* ♩dLsЧ f֤$WfaQ+rĎ9GW?&=/fTe9MG|v}*#ء\(#ʳyuD3{P"!%._O1B ]坻ڵ)E_94`7":{w\ - =qkb ڻ[g ٗۛqp_X^P(+COi:v=Zl}R8][EjqeÃ{IL{".'!3+(]&*aʍOEV5X].q%$q9{IFh愿_V4ƥtM`ѢgÇd/="D 6V"l#aB1g,cd 1 s8@XGA ucVV)@ >l|3SHRvxP pKňݘKQsT})o Hf{Q?s^!Y-vZ.exỿc3RKF%1tݜ++{d%jӆ͇6_b"[@ٙ֏b`F,z)PL]ch~Y3M;QFJFtLJVaml@0QdKoi]&H~~ʡBtzxze\15ZEv~Cː[HV$}p)|\/q)UQb(0k@f^zipB!9)3)@M|AR4]#ӣFg=t^V i(#Ű3$r *` ۶|fvivXKy/ʆ1Qh9@LxbqqAl& ʙÓS p IOianx)tVEjv'*;ܠ5QMxjx{ύH`+a q(&SO6f{ND` DU;g6iaП('X-ۢ}~H?~1@nҷ M ڥ77ULwif`֌4*'@ڬ%E1%M_x[6{a Z>s32˞0O1yrA\̺oVRmX+$S0І\w߾1jo,5Q|צBQR};YMĉHrAєWaK=d3Ռ #iJ|x\ZGJ2_ uTť 7$Yac\mOURetӇ͐WIWdD*e,x8lOit.kX|{ xh1+dz$IF'A[LUCAN13#d g@Qg6 ݹSg]Oʍf ~Pgl%4~[@hn0+~g<¬ĝ:~I@6L - [!Be|Էσ.5asÐ5R_vmg,7z̑FupfJ6I*12kdוh?pK?r=\oŋqb  [`5֖1` cĊ NL>/-8ܑoRL-Sh;.j|>O$hgPuVۻnЬ0dXn-Az Eem|H8չz5r~7̯4+@@$wS 6ʓ`Ws Uikqo76iAkACrnZ&W]4>?i=pW?_ELSNfߟ=#lhlE/puo''dro:*YoDoJ#@~Q7ͮ~lKPCʤ(r{@z\d$UbqݷQr|>ILri=/N/lOobɗ.S -TET?.xVR HR'svZGI?2?cȔ<Ob-TEMvj2x.f-ct.g^ heR$|Xw-ڕzdB4q7pg2Rz4{J*l_uȾ ,4:4$l!=d(Єɲ=*ad6gǎsabmW-@h/F-U۩tUX߾il+52z I9qF+α\INzrf̠Hrg.GIXD;:s+ ޓ7%Q@ũ^[|1HݴL௭ly4${pNj 3>vuosQy5jmLcc/^)QI;0 -~z;~9CQ8K"J R}JX S?q v`!m) r/=w(|͗=c@DSZVzo&vKq6Α $pczp jw=oV ݗ!clᮟ6Ň0Xaw fk}ܰkVctZo'hGAZ2kNUPg'R4 Y7@fkWHxs@czM{i;NJ;{+@.Z-oKCFn]1>u$Gw qh0Zd n-…9Nn%i[t q:=`x{Ruf6@KZ u| __`Oה7'jQpI>xHT;ҪB_`ܽeKww?gA#C ?3Mͮ%= ->M6%%> qGcθr1(ͳh'F  jza8*+ZxYCl\Z: 0ѻ[ s)nN&oH*-2_1!dQ5pR֞DExĜvc8ZR7?uGlGO( , !zċo eP,kQ6"ٌmQ+Y9 "s x3HrpX:Kyɜ - dc r !G}(OCԨl<JX+^QLWglf,5NњDҨ1@n3[0%G->;VЉp()2}uz%QK PfڨoLdLj%> .Й&pa]B諷I95X6{R'>^$!X9 n9 -r>c% $P ,G}&EuxsËqCĂb Q"Ԃߴv~dڐqDss]mčܺAD/ǂT(5 xCZ0z436ДY1]0zԡz╶67>結7`ge4>vRj_{M1pv@?Gظ PfTLzz% cz鉅ͻ}ŔnOw"<‘bE}I5@cNKlPm&a58`zV)g<4~b{ؗ U[hjo~H$!0Z ujr-}fMa1PnvӜ}\EGsc)bh^2ϵSN]x辧,hoN':!ŨbFȮ^$C(6@dWZJuLr[ b @?K B^%HJy25H$-ۇeoFؚ]dVf̼B_/W |quz+ͅ=7=O~bOұ0$'V>jZ_nO3/l=TCGr!D^50澰ۏ8$M(.G9Z[+ct掳z;M!G߫=J9h(]AUS*lIvFR9 &3HF"L[QAu8*.gD7D >a-ÖN(k^6֕*s|:LVK}^+)PܞTfWuNj"]S,,uC4(a63>SMM2~}EvąU"*~M͑I^jahw}ΰҹC# [eStY'r֒-P̈Y-@4g[܋rne:]]i]Jꆴ(ُTy8T-Ҙr qP#d/a*eYxDHXw#d䮠]9݄,LQD}rQ.0k*Z~PEwq\iK.dUf*o+gΠ}oCnۆSey#~XRhj[q<M,[R,oq{V$q57ڋ)9,pN=? 4;h2 A pw}آX6p:ӻ3!a;*_@Ƌ!8L;NWH'65odE/X\M-+ĺpP-Iw7zĞ5xkqR+3h!{"O9$.3;PʼnNS+>lyrcUJ^ȆH!9'&zT9kzaz|&Cw (4Lfcr*7<e鞭+G^}F@X<4llrG6!J5N}X5,Eflicխ%tStX\.??M֥v+1l8f.A F6}KQkm6D3 ^^AyF+k+b[C_v@~5)euD8.YIK7:x77G__fܿKh>xml(--k)D?kʉbW duwi8#4ؒW RG]ݕJkaI (? A=D3hN $]-uހpVH˰wgܯFwÇx_qn%"fM9ڱ snRad/-Nr%MJdC& vᚳt&1IE#j.@$=VZ%q4,J ݭR5A=ڀ,2o"|؜@<> 113BX% a`#.0Cǫٜ!&ۗlJ >Ũf%g'{^%'4%}ԩ%' AG%KĆơPCzQGR@ܠ6? >5%A ěn>T$을NʒX[S$(7|QOi X! wbS|o^\ГPW |;VDsz]Xm>:3JrNBf ;-ֶ<4N+EP :OUƩaʇf- 2E%Л"߬ XD@M%k<^Uv׌Q>Y:vѱt^2M}RF( +qte@vH]0eqɍldWxY/ɿYl)sNKq0e[G:Ƒحwb 3 A9YkKu_O-oP!>Ѩ0,b4ZZ[v86FhUbI&&z bJD U5l&#֭bq]z HIJ3Ӱ̔򓔓N3*wRe>]S+cEHKtH@AeҒ9:.mW.򚢐$(./w5rpa}sr ]XMvpQm.C )m膿$?~ɯD_] KX+耟MXAMCZ(eJct*Dժp!>o5 < ~ܡ=Å * lY2'9zth d!bTH}ТdwƧL[X0!Gf$ Fwx&7B\jwF5;jS܂XRZEWٟ7D::åX*>|.[oM$[K-@'.tY*qi#dy[,\nxprM?Þ4 _7F9:/EK f#U#+hΉDnlxu^TC5rVF2GtX{:b5ּwM~A]:; QrfsSL8xvNKe 6<@0j-rJOB-GNh07&$2dHN /}zm?ml ڛI~FHM1%ٕb>\-8۪rĀٺGM\n6 ښ g\eQ(}î}򝹹sgN $8s+H͞aծk39n<5)!ͰbwٻrOQ}͍ρ;""tZd-Os;sUkGI8w35A*`7 '9؛_d3 G4N*E2z \i[ Y62dd7i3{J8 dS)$QfwO3״Y}rN_8>dr@\A=9p}BM+ME=F>>'3}ʌ}2H\F]T;{o>!pAH%2* gHVE,*9nƘp;3ZDhxmPy#I(Ft-ΏJ6wB]&=]8w1!kTr+HU{֜ ,ebVL9<"l8%j"UCeqp($TtUhcݮ"jq9rem9[@h`cI/N)Ww }֠~㱆7rrWEg4ՙ˃Ft~5oCp#=ޅ *G ۜ WC\޺oΩa]p*l%NN ~ uMm ZY @*w%maͺv Fr}3- UX1.djGKȡ׼<鰕PHb>3ӆcyu -0[y'\ iP(ə$x : : -S!&! 8 Sv)6T~le)y xr-5qaM1G'_L=r Yԣ4Q}# yu+ֲ>@R˦ӯ雷25kn'hd,%btYxrH")!K 7݁TiWIG'ki}bGz Z\@Wsjf[FX*tFS1ak <Ҹ"R.>-Fml&E29bi8"7CH`!4EG='w ef~q5|++ZWUJ,CG{sbS$NJ7Q?HH8@>9Sfm,]e:[\YN{.Sb]F렐9_c3F{;)1,htYɥ{+#ҩKvEE/[t33@^W-Pf!-/`NA#g,o ꎁ\kCs$^7b]fxd|}NL"խnѤ+/Y>FS J|4p18 //(fe2۰}>]JaϽI`',s)/wK>/lG0rl;dFXT={-O=v+"=koْJ ,݁E^U3.bjµ5|0zR6 _"|u? %)1Vػ[䯿t&UXY mG,#)R)H#o%;\UVWÄ {$#gN@ ,n9W_F 2oV9'rD w]| 2ҞL ^zK&BDU[iHhB53G``^QO}s)ﯪ&V/3z1Tzo{&a Zaxj9P鉸msvy=8I$75$~V$7x#SMA^QaMRĜ,Dd *sU=f[ˣbbJ 7/] V uͣ.8"KEQQCۍ}6Z'iFe՘7*HC ū=DGahhCآzo  _#$U ˀ7XQܮH[}҆?S 54 3FjPb+twb^16% D֒pȯW?$yfxD\K?8Q}*TUgݞgRq0MAQyxAD't JVr>C e۹Ru77'UF/bfH<"z4I .r҄ 5M8s&VAYǠ'ۡf!7H3K- [ĘO*'w9@ l75A.bNZPgGQ]V)ȕ{v&4wJSFJ97R@xgْb{W8DY(%U N:mdžؔ1{#a]Tn{hln gR="sddaTqGLɵ<%Ez-H,Q= R{鬻'2shCE._K@שE}ƧჍ&A]gvaBe3Fmeg2 K M| F/yW]WVyiވ2Ɣq(Ft|[R&3ٶ"tA`Ȯɇ ߈:!& PT cԀ"xkH Lh;uޱp|b5Hl{,[`'зaNw hzU1u0>:U#Z\cA,%U4U9o.hM klZsLj1t)o9tIGM|u6nVFtU{e& If:Y$q!̢vkX a oYp%eɋt<0Cz<vJS)-ʅgRZH XQr @z`GVKaEI=P,!ViGӀOpl][kM?9rPQE8]YbƔJ=%k* |eI`M}(io6p ٞժ[h ċgB y}ّNʄ;ŪՆϥ]ql%{ @47lP-w^vZ1kjEڗ/S=Id>o+@=WFJa3L-)~q``1W;S,DfTqaP*!=Kw/ΐKCL`]a͉ cMY~%;7Uţ$}AځL)Bǻ ݅MA>ΧoDlt5l]BuѪ*~Xks Ζ HwұDQqTml{E̵N7,*$n6]>]P%bͫ v%X5`ۯzr0aa r4C PVHctΆ\b_P4ɹke3!Cٗ4To,*6&E2'w=1h\jx!_Tc O<:BqinH/zmS,:\}(yu Sxq[wR#Ma] %cw~#>'o;e9rF߽i;Gtg%ty ;UZQZe^Yp׋4M&q9|WHHTҡ}.P8lD׆D7n^]aB4OvǠ79Q>[-P ^2_m`p,,} Q$pfF{ыМL"6JB|)NN5@x1:Y8l~p:mI|eTc"`~Jkr{<H0= ovė &pGMP|u*Q "!_V:QUz ʅkD*^>ف׻-#$$e`$3nl; C{i$_T")(Jz&QEGHHpwt9,bH8?%Y -q'QI-r7K$F?r:(7Bل$;2h,B ,[px=v}huaOgAyfNHt*1lC5sd\}kbX:[%_9d8[,XRLYLN+_V [e7g6+q#B`q>⏓"t4ك0p>b.7KJ]wo("T1ج+uN#tUȼ:]eǦFkcnp1U/7(\TIly#6#ȻUk !;Iw 7мX|+bgU YuΫQAlvbZG^~XgAJ+\Fcum('y~int{L?U* *C%7F19>l~ T&1/Y"$w)" ӱwWDO X@tԎk.%`6OeAk5a75 La4_N שB#Es䦮;{!%~6"iGD8ZmF|XW3Jn*S褗G'R$fD \T ],k2͆폳{CQ߾CWQfSZ@?*[xY Լ@M,6' 83iguE`R»{r\D1JzYܠ_kESY!Vw4wL0z?\S g6PʓlG-}RC >֭EM1et\`}iHFIS^vRNݑ.`⣀)ClhϝW~̩_nl3ؖл=>ߏ`6Ң$|`*SƻL R7BӰ iE |ɁqhEAOU­( AXP'D6Dm TA`fwnr*kCS4aB$`2Tf$B:Id(K<@ PQ5ЀYk՗ Ey&,hc[Y`!4eT>xl7eZBA"nwQi[61Ү-8צ0^Za\[L,Oc%%PDݣl^æNvSݹ'I̠c8݆3T,(\b3]x0|;UKO7烙JO"v\!d?\^}|A}KtnF#mH(Pld]D:d6k~3- :KIF0'/ͦ0.yv>ij.z)¢c-{ ow OCpjo;pdtPVYq-t~fE K|=P/Tߎ -6"j@X.wdZ6 a&Ezek' #Q/#<dB!a`] cUɘ Ta)&G ˘:ͭ<]&$+~=y֣rKI6EtJhG`˖FQ̝̊Ẅ́q V"%|zj͜(P0Ƞv]G2].:N:mhkƦy<6ew:j4'8N& ?;5^0 c+f,G~whA(2mՒ?ًT$Tsbr(Q6㸔ٕ yXџ;'\ 0+HѰNۛB C,l)MI]rAYw9Xj> Df,@(f((8#C$- (2%qY;B-Α5IoWbC3+"e-v8pH|1l+ivq+E`YT+9i; S&WSJR$UT\7}(vwbPQȢbDz O5!z6sœk/+BwqH9L\*Z]$҉~0~>cAT1)vᖗ_w"EwncYjGڍƷ:Ur(SU2x) ļ%Ne'/PwcSXZc 1RDmtef^2K)k7\Is~ hiւEu/5O}oB@(ElU3 t":8>:,&?9Du+[>/B6^oȠ4DW@Sc'ɚ;pkwtr7˷+tR\B:"L~TR$YqCƑ伽nUGjޏ{5EiG~ I E1 -fzjinƜ bM|jX+"t⭠w/)G;(0ELj0{1V$!B7t]zs?NGW8 wwP9_vX~EGsY~@&ASdt*#hK !sc|(5S?b2q'ַ,:{?cl_Pq0Ew۔u1;{mjsDyfoʸ 0i`v: N[ h>~d8;&bμQޒEN %8:a3r՝93q\):q (X-hIAjݻC#ˠ46[ݡEr,`"WEWᙦi~ {c+}w8? &7Z!LS#hdK,%~vڷEmC@O(}ޘ=4jnTدw~!fKXZ$7|K2!nl% lSEqD۶u[?li"yq{J/^+mHEĠ@֍,҃_[GYBc3u`LD} xuyFdž8vtwүndo>]h&4L}%ߜm2i&[߳XD4q8C.YqsOAP:LR9mYn(Vc8]d%Gߋ N{ROCO(v*]@r@w/[j@l箧Vsc-`eJC[iuQ6NMP nk侊_rUZ&42(0֨z"BҌ:trqO mV;egZju{˜@r}!hMD he 87MI%_ѯ_YtDА Wç*ėe1 4B5xl,&>Us3dfȴvL]ԍ=rd6wg2ɸȥD{˯RX-xn`ټB lojbn`ua}1&eMH;yG'hP֪ni˃*d$Db@7M0PKJ_Ԋdި8+<}ԕC2_>ALfǎ!`8. ˜:3{FMIß<4#|!>8wb61i8 tky RS?h8T+4Ny5=Y%-dm>1~/k=쪵(fjZ5T$Vɱ r(FDǛro(k @[_?9/dy`ংY$?@j_h_3F '3:KU"$w#3q476_0g:~sV0 4[<[l~y1}_`U{wzЄ?!ȑIcW?tJǔ}*abXFrMJLp5ï_1iT gU#nw^CĠq ˻ob+4"CMY:o()HF5{sGd$6=&C5Pȓˡ 741 Z`]w'ZR{oAy܆2@ Eu턐к)qȋ10,ɐL]p?BzZ^r~T@wfdI ٘pZR;GPe11}\4n],[n1F>7!ѶgW@]<:/oz 0P7V,hͮQmY:r 4Fn}# 'v2N ߔL;(JW?v[U3?-D-_@Ԛ kk04y:O=b.VFՙa0.br~63ϚM7;W>@2D`&vi2k%4Tח]@Bc%?_D nز1U]% k*>MiZӶ TiC=B=|<5r8e3bh[]9nEW^>yQ1`Ee6ĞGh)R5XaNa(90Epī]Ib]i]KC\gfW6Sp5B'+b\c8s<֚VjO(olaL6yd 8wYG XS؂e0F|ȰGo!I\#*) L>$Vظm }_QOv#F˸;9~׾W_MlWI9 gb=3ڰIwDN1ZsME0 =cY./:b|8cjΑUAb-P[v D|eo+RPxѰO~;f TC->(r&29b8R0;rbǕVi  Thzܲ!8Fb ZɌ:۵v_p寞uбjq~盓H:9+qﶤ1Qni!?~P1WEҾ㭎>iFcmDEenUѴV#uwR%.`isOh )M=QZtVٻy=j;?8$4fەC+)gS#v+c|E-WI\Qc BoE9&7a ʟyN+.g{If4bs.C6GW'$K(QqaՐ{8qae}UG>6?h)3ס&;ݼ,USk| Q>J{n-Mn2okL!&ɒOi T=%cB f+%tDA'5`&/p0#d8K'HL̺W *bI&/GikN<)2Wuyqg䎸#&ۃ3~8ڻ(ntʁH_U)BQ2xA @)ۃ/E EvɲC^-0(m'HSu5ݸ~D7w/ËNs"$S$Fn}dl%}% h\ܸv<[bg&&"ue3TF,0rƪk" xK$%o5M+/_D.+=0=Ɲ:& 2<1@M)  S"8deQԛĬ߲ܢ1 $B$[8:\MKSTaإN HvLH ̓`lvʩm#X5x Ws0ȴZ٭t ~9$\YS`=XZp׼LD*S?⍢_BӋ*P< uvps×jOH`u{]𩓰n6v6v (ҧ#ֺkB糔}| 4"Fٸ&•~0 gސm;!Lκ>fNv=fjvWʑu6