Entity/DocumentRepository.php
author ymh <ymh.work@gmail.com>
Mon, 27 Feb 2012 11:45:38 +0100
changeset 79 d98ff44275e6
parent 74 901463f9b11c
child 80 cf6a88559482
permissions -rwxr-xr-x
Added tag V00.05 for changeset 130e95ca5049

<?php
/*
 * This file is part of the WikiTagBundle package.
 *
 * (c) IRI <http://www.iri.centrepompidou.fr/>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace IRI\Bundle\WikiTagBundle\Entity;

use IRI\Bundle\WikiTagBundle\Model\DocumentInterface;

use Doctrine\ORM\EntityRepository;
use IRI\Bundle\WikiTagBundle\Entity\Document;
use Doctrine\ORM\Query\ResultSetMapping;
use \ReflectionClass;
use Doctrine\ORM\AbstractQuery;
use Doctrine\ORM\Mapping\ClassMetadataInfo;
use IRI\Bundle\WikiTagBundle\Model\ModelException;

/**
 * DocumentRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class DocumentRepository extends EntityRepository
{
    /**
     * The cache for the host document class
     * @var ReflectionClass
     */
    private $reflection_class;
    
    /**
     * The cache for the wikitag document class
     * @var ReflectionClass
     */
    private $reflection_doc_class;
    private $set_methods = array();
    private $get_methods = array();

    /**
     * Find one wikitagRepository by its externalId i.e. the host document id.
     * @param $external_id
     */
    public function findOneByExternalId($external_id)
    {
        return $this->findOneBy(array("externalId" => $external_id));
    }
    
    
    public function reflectionSetField($object, $method_name, $value)
    {
        if(isset($this->set_methods[$method_name]))
        {
            $set_method = $this->set_methods[$method_name];
        }
        
        if(!isset($set_method) || is_null($set_method))
        {
            if(is_null($this->reflection_doc_class))
            {
                $this->reflection_doc_class = new ReflectionClass(get_class($object));
            }
            
            $set_method = null;
            if($this->reflection_doc_class->hasMethod($method_name))
            {
                $set_method = $this->reflection_doc_class->getMethod($method_name);
            }
            if(!is_null($set_method))
            {
                $this->set_methods[$method_name]=$set_method;
            }
        }
        
        if(!isset($set_method) || is_null($set_method) || !$set_method->isPublic())
        {
            throw new \Exception("setter method unknown $method_name");
        }
        
        //set value
        $set_method->invoke($object, $value);
        
    }
    
    public function reflectionGetField($document, $accessor)
    {
        
        if(!isset($this->get_methods[$accessor]) ||  is_null($this->get_methods[$accessor]))
        {
            if(is_null($this->reflection_class))
            {
                $this->reflection_class = new \ReflectionClass(get_class($document));
            }
            
            //look at properties
            if($this->reflection_class->hasProperty($accessor))
            {
                $get_object = $this->reflection_class->getProperty($accessor);
                if(!$get_object->isPublic())
                {
                    $get_object = NULL;
                }
            }
            
            if((!isset($get_object) || is_null($get_object)) && $this->reflection_class->hasMethod($accessor))
            {
                $get_object = $this->reflection_class->getMethod($accessor);
                if(!$get_object->isPublic())
                {
                    $get_object = NULL;
                }
            }
            
            if((!isset($get_object) || is_null($get_object)) && $this->reflection_class->hasMethod("get".ucfirst($accessor)))
            {
                $get_object = $this->reflection_class->getMethod("get".ucfirst($accessor));
                if(!$get_object->isPublic())
                {
                    $get_object = NULL;
                }
            }

            if(isset($get_object) && !is_null($get_object))
            {
                $this->get_methods[$accessor] = $get_object;
            }
        }

        if(isset($this->get_methods[$accessor]))
        {
            $get_object = $this->get_methods[$accessor];
            if(!is_null($get_object))
            {
                if(is_a($get_object,"\ReflectionMethod"))
                {
                    return $get_object->invoke($document);
                }
                elseif(is_a($get_object,"\ReflectionProperty"))
                {
                    return $get_object->getValue($document);
                }
                else
                {
                    throw new ModelException("Bad reflection object type");
                }
            }
        }
        
        throw new ModelException("Unknown accessor $accessor");
    }
    
    
    private function getColumnName($field_name)
    {
        if(isset($this->getClassMetadata()->columnNames[$field_name]))
        {
            return $this->getClassMetadata()->columnNames[$field_name];
        }
        
        $res = null;
        if(isset($this->getClassMetadata()->associationMappings[$field_name]))
        {
            $association_mapping = $this->getClassMetadata()->associationMappings[$field_name];
            if(
                isset($association_mapping['type'])
                && ( $association_mapping['type'] === ClassMetadataInfo::ONE_TO_ONE || $association_mapping['type'] === ClassMetadataInfo::MANY_TO_ONE)
                && count($association_mapping['joinColumns']) > 0
            )
            {
                $res = $association_mapping['joinColumns'][0]['name'];
            }
        }
        
        if(is_null($res)) {
            throw new \Exception("WikiTag.DocumentRepository: Unknown field $field_name");
        }
        return $res;
    }
    
    /**
     * Write a wikitag document given the host document and the field list.
     * @param $document The source document
     * @param $document_id_column the name of the source document id column
     * @param $fields The list of field definition. This is an associative array [<field name>=><field definition>].
     *     See the @IRI\Bundle\WikiTagBundle\DependencyInjection\Configuration documentation
     */
    public function writeDocument($document,  $document_id_column, $fields)
    {
        // get document from id
         
        $docid = $this->reflectionGetField($document, $document_id_column);
        $baseDocument = $this->findOneByExternalId($docid);
    
        if(is_null($baseDocument))
        {
            $baseDocument = new Document();
            $baseDocument->setExternalId($document);
        }
        
        foreach ($fields as $name => $field_def) {
            if(isset($field_def['accessor']))
            {
                $accessor = $field_def['accessor'];
            }
            else
            {
                $accessor = NULL;
            }
            if(is_null($accessor))
            {
                $accessor = $name;
            }
            
            $value = strval($this->reflectionGetField($document,$accessor));
            
            $method_name = "set".ucfirst($name);
            
            $this->reflectionSetField($baseDocument, $method_name, $value);
            
        }
        
        $this->getEntityManager()->persist($baseDocument);
        return $baseDocument;
    
    }
    
    /**
     * Remove a Wikitag doument given the host docuument.
     * @param $document The host document
     * @param string $document_id_column The host document id column name
     */
    public function removeDocument($document, $document_id_column)
    {
        $docid = $this->reflectionGetField($document, $document_id_column);
        $baseDocument = $this->findOneByExternalId($docid);
        if(!is_null($baseDocument))
        {
            $this->getEntityManager()->remove($baseDocument);
        }
    }
    
    
    /**
     * return the list of a wikitag documents the tags label.
     * @param DocumentInterface $document the wikitag document
     * @return array
     */
    public function getTagsStr($document)
    {
        $em = $this->getEntityManager();
        $query = $em->createQuery("SELECT t.label FROM WikiTagBundle:DocumentTag dt JOIN dt.tag t WHERE dt.document = :docid ORDER BY dt.tagOrder");
        $query = $query->setParameter("docid", $document);
        $result = $query->getScalarResult();
        $tagstr = array();
        foreach ($result as $res) {
            $tagstr[] = $res['label'];
        }
        return $tagstr;
    }
    
    
    /**
     * Update a wikitag document tags string.
     * @param DocumentInterface $document the wikitag document
     */
    function updateTagsStr(DocumentInterface $document)
    {
        
        $tagstr = $this->getTagsStr($document);
        
        $document->setTagsStr(implode(",",$tagstr));
        $this->getEntityManager()->persist($document);
    }
    

    /**
     * Search wikitag documents using the index.
     *
     * @param array $values : key: the fields to search into, value : array('value'=>value, 'weight'=>weight)
     * @param array $conditions : array : key : field name, value : simple value (operator is "=") or array(valuea, value2,...) (operatr is IN) or array("operator"=>"=","!=","<".">","<=".">=","like","ilike","in">, "value"=>value)
     * @param array $fields : array : a list of field name to include in the result
     * @return array [["id" => <the wikitag document id>, "externalId" => <the host document ids>, "score" => <the score for this document>]]
     */
    function search(array $values, array $conditions=null, array $fields=null)
    {
        $em = $this->getEntityManager();
        
        if(is_null($fields)) {
            $fieldnamelist = array();
        }
        else {
            $fieldnamelist = $fields;
        }

        $rsm = new ResultSetMapping();
        $rsm->addEntityResult("IRI\Bundle\WikiTagBundle\Entity\Document", "d");
        $rsm->addFieldResult("d", "id", "id");
        foreach($fieldnamelist as $fieldname) {
            $rsm->addFieldResult("d", $fieldname, $fieldname);
        }
        $rsm->addScalarResult("score", "score");
        $rsm->addMetaResult("d", "external_id", "external_id");
        
        
        $score = array();
        $i = 0;
        foreach ($values as $fielddef) {
            $i++;
            $field_list = explode(",", $fielddef["columns"]);
            $column_list = array();
            foreach($field_list as $field_name)
            {
                $column_list[] = $this->getColumnName(trim($field_name));
            }
            $columns = join(",", $column_list);
            
            $value = $fielddef["value"];
            $weight = isset($fielddef["weight"])?$fielddef["weight"]:1.0;
            
            $score[] = "(MATCH($columns) AGAINST (:value_$i))*:weight_$i";
            $parameters["value_$i"] = $value;
            $parameters["weight_$i"] = $weight;
        }
        
        $score_def = "(".implode("+", $score).")";
        
        $conditions_str = "";
        
        if(!is_null($conditions))
        {
            $conditions_array = array();
            $i = 0;
            foreach ($conditions as $field => $conddef)
            {
                if(!$field) {
                    continue;
                }
                $i++;
                $col = $this->getColumnName($field);
                if(is_array($conddef) && isset($conddef['operator']))
                {
                    $operator = $conddef["operator"];
                    $values = $conddef["value"];
                }
                elseif(is_array($conddef))
                {
                    $operator = "IN";
                    $values = $conddef;
                }
                else
                {
                    $operator = "=";
                    $values = $conddef;
                }
                
                if(!in_array( strtolower($operator), array("=","!=","<".">","<=".">=","like","ilike"))) {
                    throw new Exception('DocumentRepository.search : operator must be in "=","!=","<".">","<=".">=","like","ilike"');
                }
                   
                if($operator === "IN")
                {
                    $in_parameters = array();
                    for ($j = 0; $j < count($values); $j++) {
                        $parameters["cond_val_$i_$j"] = $values[$j];
                        $in_parameters[] = ":cond_val_$i_$j";
                    }
                    $cond = "($col IN (".implode(",",$in_parameters)."))";
                }
                else
                {
                    $cond = "($col $operator :cond_val_$i)";
                    $parameters["cond_val_$i"] = $values;
                }
                $conditions_array[] = $cond;
            }
            
            if(count($conditions_array) > 0)
            {
                $conditions_str = " AND ".implode(" AND ", $conditions_array);
            }
                
        }
        $fieldnamequery = "d.id, d.external_id";
        if(count($fieldnamelist) > 0) {
            $fieldnamequery .= ", d.".join(", d.", $fieldnamelist);
        }
        $query = $em->createNativeQuery("SELECT $fieldnamequery, $score_def AS score FROM wikitag_document d WHERE $score_def > 0  $conditions_str ORDER BY score DESC", $rsm);
        
        $query->setParameters($parameters);
        
        $res = $query->getResult();
        
        return $res;
    }
    
    /**
     * Copy the tahg lst from one document instance to another
     * @param IRI\Bundle\WikitagBundle\Model\DocumentInterface $src_doc
     * @param IRI\Bundle\WikitagBundle\Model\DocumentInterface $tgt_doc
     */
    public function copyTags($src_doc, $tgt_doc)
    {
        //remove the previous tags
        foreach ($tgt_doc->getTags() as $doctag) {
            $this->getEntityManager()->remove($doctag);
        }
        
        // add the new ones
        foreach ($src_doc->getTags() as $doctag) {
            $new_doctag = clone $doctag;
            $new_doctag->setDocument($tgt_doc);
            $this->getEntityManager()->persist($new_doctag);
        }
        
        $tgt_doc->setManualOrder(false);
        $this->getEntityManager()->persist($tgt_doc);
    }
        
}
`VjOdLLRȑ|zB‚z\M3JP4,2\ҝ~YYYomUpP D(8MBUFNpWRj2*7DM~$ e(S`0TՎ XT+5t:')ivB'qusF7n7h]!UUB3Z`!CPB#T6'99OC=DHEvcB EGQȼ<긏TDZj1q4*rHs/EWʌ*|^%^, /}$4%S#,,1J !WO}7#*\NqFXXaaa`F$xɡ[x8J%*Y-I"Qp7\]cT+8&dW=tacUK@X h %-vS.cy~\Z2aB.]YNxB:'$!4_x&dZzFH&'sVOp&M[®=4$Y[E\'0ϓqyiԇ~4ToHzSa Dӵ(h~5ךpa']O[Wu 2x6GE P 6׎#~4cfb{:d&q鼠*6aoi6-"؄| 6NBOٚRs:m}bJ[PM^NuLL6O|d\Gd9g*E0 #ꦿm8v?3whȷ7S<9\m"i[ qn*FPQdQ&RuO}*7Rp# #s[s;V´c{3gWK}J|€Ne|S;'Tp+i> 曏dq%ecqJGj;QH;GTxǶ9F:&|.g|̾õ|9_MUNJyRb5'TJ)I)-B'FQ!b B XX&hh$ՉR7Qv9+2T9!l5A<9|X&Bn<#.c(Tn2Tj;F#18yƨ#F4e*WՏ8VL98F Fraܽmx绺<"~ o?*db`Vf"{c8#8WO>O \\.#Gg ;y[)Q\PVEXM;1xM meYMƠu{t_jbSQU edeFQ-Zՙanm ѐF U(QC|IrnUdzBHT q#H";E-Z }e2uxxƌ;8ɉIzGE 60T%>eaJv%G!.R(=QB@!`\T NdLw8ۑ%Cʪ-|ܜ|d3M:Jwhfd8ѶUDz዁G:s:>db`[:2@F J'F=ZOjbbu Hݬ1h P̣ (E5~p-읓IW_KXn1i5M&I+i%evo+rBJ32EXH;ۖQ`Ugh`ק ̵ `6CD#FF5.QZFQ5Q,j#QҖQ*03:K ,@GlI'ԳJ&B9k,ș_YTs U⡈f"B)t @)iATj%ң$})?VKF= xz|H$ zAtFX/_0%|Ն=},v6{ji/?^4}V/3ijnyT*E59&lU!: rj>2ijLKq8.3gEp*!$F"Fq LP`!2v&A9Pى#!&HRb4 0 tBlxIEb*$uz# ;`:hNhdЍujziٯbd mK ♉vf%3X#!b(0XI;UR2Lږ%=MڋT)4.s{9\}$ nĚx+8n67RZbQVjRj22LH#F#}p^Q 3fCYA)[h*2WZ2}7^k4LOrwMuN7&4{08p"ڌ,½Sdm8LOw)n222811G#1#ڏj;}@ʤ~=Ϩ/ I?-ߴ*! 8h.μo`DŽw;!; GB` 9qdf Ndʆ]QjFʣ"jU!m7&FQʜFIp&5N#i-č*#B0' -'<ܥ&b9.5] AciN M GH2c蚣Qi5F#Qٻ©{>+ڞi&F` p]ШwET22HfJjQAQv˼ T(/ "*@lt\)zDєo`9/=05~g"Iġ uF<;ō6,,hja 2'e6i6)TCƌ4džvADչ}ڒW'Y>$dw`B>dt͛Za{hXې3%W9b")Z.Уf[LcKLو`2T2Q,"@ $#,/i [Uaan r$SIv##SUs>|a4\q2tO115Q캤N#b:2ϵ4=c,1$-($,)! DEB#Nb:zJ =ˢ6pۺ/ 20Ӳ3\ʑ2y9G*71>>=jFRwCJh, ddbdaUgBtg=fb,\(%"b ,<&("`3#e4$`ZYdH  Vl- Ffw8H&;F>8Hs@!WCfMT~Ip%wAHS@a2ĵj*rD TSdWPXXnԒQtpފxip/?(畨B_,@(QT:~bjHH3(`y!C$",-IH-1YJtU/ 6͔~±212d]":>Pn.Q]n0FTj~wc~4~dddddfp&QRqj7G߼.D I)Q<)špLb jH% Om"=oߧt*4tE~AʒwLUsYQ^9a12U[ziIsfg qdbd`ԗF)ddiQ 5 ??-  1̱!JUvڃz@8{GD`ڛ/yp |ϧȶݩ51 @^#!n)v¡DI'| [ 0hB!A&%ι25Ţo8#!sk~ Y$deZHXPdYddadxB 30@O,,,ߚLG MnW[9i9QΨⓚL?ZjIbm5MJwkp3),2daU G(_~q (:=vAE w(PGr1111111111111111111115ye}`F<Ƭ \ϐ[GUʒ%@('33̌&,9tK0v9'E>[P@A(vj5Fj7o(Fq-G4nF-+n}?zQn ,rʕJ2BŠ'q@0V&Q|2#*22OOf%Cy],%XQv4 aĺp(h3t-B]c<'. Aݔ+t1xTm]Ci"Tl2-jjfˬ@H2 =4@)8aYt֫z(K(ԟFU\WnV[^9Zy&ʎ:FQs1wcsGd읜0Ffj:6FQGhcq9ucsGd.׏ 9]%/bfC&pzL(aHvΟL0nUJO2KeG0ʼnOLLLLLLgS"/ddddX*"/~]me| ȾU0ePd2O?E ߂xRI?VΜG1&Na7C:m]C,)J 4n0O|\?m/ gK; ECEȊꡞD Sn4<-L&|ruF\G,I'>:T@is-Ը#Ih(+$k6O۹/A !o| !sy{Ͻ\3z Zԡ#F6'PTTtʨ[=/F]=0;ŝw 8B$/)DŽM( }UN P; KZ6[ m6^WfR*+UVҁ V31ÍŽsڦ'N/t׼v mkT̋4y<箐&ݺqvݵvJWX!lQJ 'EKTHg7Ë2 Tnuqzc#mۜ[]ܫ飫ZۋZGb;C@.nɖ !c5{yQ݊M ѠufC,i#,(ӮL(SwwdAJʀƂޥѪRWC\{l٢ALs[JʜfUk +Y-{w: #@B4 6EG!?kRdg)Q}*-yoE5Fb9# Ƨb4U7d𼀬L*Y&TUc (#aQBb2$$i>wOϚ#?a5)!5&L!3 "QBQ,"lȜ$Rn0)"j*%%*y_ր壬Zql]) `xBr!@ݴhY1Z7onj9դ+Xh3 7ǷN嗛V~O_GhP4 O z `*^<+4  xSv FѭlQ@Re@(8Yř9G"zoFko"TDUQEQj#l& 9SN Rh_g?LS([v⟅S_񵍷>S~-ro# 4g5D;ym[ɑ]Fa;m%KbV 3^B~dv0w Ʊ&Jhu:[Ȇ'(q%H)G7%aF FP^KmۻKPPqx){?K9>MD"gj!G x"y:^}mv/m~ ㇮ P$' &h간H=Dc)> s%2 ;Ov?7t  R8;tS827Zg*q1Btu`D7O\-J`B1Cr4#9&I:jM'_O|>f?w 5X (tLtyEԪAٞ@jc5;2¤LE@LuyB!C^ZU3Q ;n1YaY×)0JS9.fT2ĝ\:Uț. 6ESFfbn "8JX&BR4-5h8J"ف(~s"B_gh6CY5yxs'!j] ^Fkr(=Nxz24sO$!Nq$L`OU49XP."=d?эwkw vH7F!.à LbqDD~!E⩜j)K:@DF4w:un:qD%Z\&$y)`!jQ&#Ӕ8Ar-Jލ#"0m0ӎhnʔOBfu-( /nM”3<~q\H0>T<Ny|UBXҍ4s: W0/54%S\g@9%.rɂ{פ)*Cc2)a姺{)- wM2Qy%mLHRIozoId) x8L:j5nar{C%qnz2'#uR NK<쿞zĬ>E@Bxb co=V8ݫg8sT!}Ebb߳S Н4Hފa5ۗGq1:6|Cs&bJP' @A/nWK'5`Sݖ+)Kjzm7|v<$ӿG  (}'6q{Q'id4!87I^)f Ğ^>Ap"ns tb0p#/O?Wz~GDU2Qkt#ʺz%n:alM#TF1f\x 碊P!EEGM፠邡haEA>BC !DQu˶<3\ǰ[$< S@!Bg(Ba@(*Q7$18뺿s&*":ql^e"}h,ܴ9?& `lT@$jIL t鮯a/IӔGfQ R6a+U7Lmj欥Bydכ纷|"}9h/]:GPן Cwahe>_Dh S$YfB0Դ-Q̞yw7OgNtzc,s4ٓ+W4fơUT{1~L˚*ñ8Kw,Oqd{kM4ВqGǖHYQB@嚀#r {mpPJhid`dOm #Xr{X $1;=ny0r H9 .R CD_./PFG~AaR1Y%#݌PzEA(,F#zl_,.jg)huCm(T{ ^^Ce=.-eaU06` 4g9eٰ_AcvqNnfM\B#xۖ,5>|ݫ) sX=ڟܫJ,3|͒/ӟO)@?/GN:\TNʚ^`#Sbj}&D?xdR}~l~w}u&vvʚh֟_:nDR?IIx+ov?ab cTO:;\_I_} 0ր}=. ~.?3·E+Tng֓³RWlٝ+q9ǷWH}nzuwO5׼`](, j"ܾ睪g:זQA rG~U8ߋ< Ϊ%Ƕ^$EKv^gE{spIm]S!znF"D1i HDM/D=1ҀnG UyR1 3 uQ D[ݙ"X==prB_Hq]迥Th\ x.cjoUTbґ!p8q"Z[6:7uqze;LAj@'jn&VѬYe)gG@)Hizqy]ݨpIJ&(BGwFmˍP:F M}uU؞&`t4&%_(5 #ֲ#%o!0 ( ́x#.0 "UfAsbhru29eWYۑ*䔇cT i-\zۍ ogl_ h#|) 7.PIi(Fl8 w! +kS 䈕ph.% 7#D̘˯&Qvdplq 5NrN.Zw&f2[0ŭv-M #:..l.va\CќL3t&,& *[º;;d n>p_񛫯vfalPHR4^5 I 0Q?yt=1%e>_5|2{6)''iLD {6 :t83Q-sϋ򿜷XxiK> )7J).+E[>K=[0=Ƒp[7h;#L+|/ s*sZlE3|% T.yKÒS70ӧ.+Ŭs_[=:C᩼a^i iH8In$0dgBpQ?A-EA=m!xΉ& q''aZ5b.p ħ0(-;D;pW|G' o#pѮrݢشR#iii!D#khŘc[WAo*֌ѼDF(1yBHٳUs0 HcDj)'J';yXOdral J)xvHO1D ӈjօ3NnB7Gt#G I>]6LCgÿU+$L@/"ze-<;Y2C$Oj3 =vɼRvs]'x6%׆ {W;CO'sŏ?7wh*^{ 15 82/>5r' ᰡ`5*YB:훞xɁ4!n$ ٸDTj n{2Fs@xM* ) 6P4P+Ur!RhU) %(q IQqxv"NEz+IJ@$ꪔKs55Ψ eQAK@ Lso  /(]}^gyl(}f6],$DD3C>rnurY?udkV8\A뇜<"vN$ Rz7nP\aH\RFz<ЦJ10&kMeVn';y c9,q381`MoekKBnT;|ll#T"!~]:&TRbn}:^X%~w=rZ,z{ck1fLtþ voY>W/0}k.⡍$AAZ~ '-4P_hXFY !28!ݥ潔Qe?W@1HNHعnCOt_mmk\{?ϋrEQق 3+nM]o!"mmy2rKw>Z iO{G;'}jсN Цjxkz,GM;qQ[K5L,ui1@JDrCv70tĜ;.;9=M㕟*HD)&RI]k:ĥM$_MtH oqMSm/.Ay d@uf޲d C'ǁw`@»Ls Qo?9]4AAicNvwBGa3X!}3ܶ(%싕n&!.טb! ;FLnc$4&;5 7^3WM;lA/ >u{H?=1r[3*'YV^"@p,Rlr:AmZD]=^ vxUjʛo^69To.2%a&*0!G26$9SzYk¬ H3D{ y XѰwh*ooU5aP$QH<e"^,% 0/؞jϴ/n1/bjNhER"#V&9J1Q FXMR9U9"(% s+rUԠ s &rMfBp]8>Gaʪ"bBlF/ܣ21H3m5DF<\yE?De}~lGTwR'խ^8y \}G1JʽnY[ FM|,zVxʄE u )&aM} #=;8>gci.IG7tN!{X)ZEkɯT`fqѮ+Eʖ"X23[F4no7 셽Zf ab fxa={nؾL,Sŧ_իJ=ƽfƋ VD[GŪ1C%:xcUwNq{G 5§۾MHզuQrX007@e:0Al>-ͳmp$Xyr1w -zyxw7śI/3nݵN$k-~\/pb Y;MXǷvo`>ωG}Hr nKZ?)7Bmc Ora`$f:ӸgƓx;)ztwAHQ4̰Ypd닅 L]/.?V"X! =s毼hVU~ʯ0G"zܮ:Ƙhw""!W sI[f"Njr)4F.tW~1jOpU\sR4t7!.ܰ/URK3wNXoWuQic܋1gٽv'A'^ d烶;5A*ݺ<Ayk/1L.'',։|YtS:.L` 6vy_|iQ2 v$$[UJnZ;K=G A@y՞*&R#oz,Bz1q9qF<) G|CrV%f@=6'c$}>FFQǣ<ǜ3-աY#\#QHfP-LjfI_~»oGvd_?dz܏Ȋ2잲wOznO=ɒ}ISOR'ԟ̝Өd?642LObtNSޛNi1:'heI-&*L i2*=*"ߺHy%TC+F+~+>y+%jix,zU=Ͽۭm5Bq2d2 ( |e0f' ߢHGF B#".!%q?-zg{GY$;<\ʸ-^۵Ѯge]X %\@Κ 沓:evxRFBN44 1q*-[EXZctZ"扩0/͏K\c1yp %! Z#YgSW3P9YeYHRMD TY8Y+GhE@=uݐ~mI|' ]"+;ؠ! TZ& iN[&O^{~~לC?<ҊnX{+M~S@Vri&d̢2`tCt,J$e(2wOxpyQ>QNH룿Eϯ;Q`@ +0EW ʿPs1G}$@RTiN;B,P!S#nQ$o)?wgzi]neي&^k 5A GRPQAKYE~D# =wSe.J<"c LNAL!e  JJ ;fT@5Ca; d!!=z@E,l8;~i,b5hh`Ă&HE` c[Q}8_~ζ֥9|m8b95KYav\,EKd%vYNM10Dm4v b" LZh|ZD_s BLL(8!RzįuuȁdQ) xD5ԍ顐sM!zq{RxuKXMpCAމ(N@=}5DNY?t)v[.Hèb~s\{#CSB\UsX;z)fn1>-mb(lj;Ĉ%Δ6(hN8-;x0D" ޹g_SBB%Ƿ@T.]/⼱ 6>R3qnXNjv頂#Ps=@+) H[!nvZ# /wַܷjbQ7 奨g7%w|2N?]yx8x=~^߻򐯨SMlA طEWRN;xmCs'=T9U Bz ApIb>}smG`^At_T&8Jy5,CEOwea@?"5^ 'ITxm]+€xa3CO֯E9NtK5̌ޣ2 1P [! ;ۄ`5,pX鈦ݗD2 :~^ٵ?ɛ?Fw'&py/̸P/UE*"}t}aM.*[{VUerR73K1U}|zE^j('j;(R#^":׶xh5ӱ4Uw?'h9Iweb8k_0Aqr  ^Ͻ zÓs.ya f͚Y٩XԅZ<;m=7= .vUnJ›7S)T F?$okQ [0&"K`wmeTRj"DP$Axp]KIHR;4`V;$A4<2y,La9f`|d;L, x`wED[aiNIHNwl$A eȂ-P-h$j%n{Qdcd6߃5Km%BJۿ'5D[J[D*-/lK-'d53 ?ѐ"oL5AY eġ@>tz7A>G䔟@ɬD3[.>{.+J(q4)w2ᣥQu@K@4izVI@,OǾˇy54]"d;FWߣi6n=d 9r'}MOF66쒲%S|AjftMWЂXڿ,sVg C <-BP,ծ-϶ У$wU+7N q ȸ-YDhdE\;Na+E ećR2)bJn(A~!F| Ifwq~)o a/yP^9C 9_zOλ7ʝ8}UzÃGҹb0@0 ӐCbb<>׭_pP }CEaаqsoت~Qdiտ[`IvZ1Ҕ!3QG_8om]>aT/ l%LZ$i:4FvuU00(H3lѹsucNfuBinOwbPkf!ECw}~_?'؃G0##LONl&Rqɩ7Yq/ѥm]>l#J*w_nwD?:?~riGFUet'$+\I,NS p&ReRԝ)7'2nMɹ8eL~]渓$b&& LLO "/9Rnе&IRs&I8();K!\ɒu9MTMRu$tx^I8N㓼.*]& >rnNjL3 uIW}ZUzIrM/ O&Ięj'}mOڪJt%B#FL(XiF"}wdLUoplH<K "4LO={0!gI37ɏӶʄņ~P"G*ucqW#-KA퐒X &f-j7.X ̱ܙp8@VO>2ujV:՛ %4*!)Ĝ ܙIi14+INS$LNSbz'44{wNSNi p'dxi?؝NhV>i2$6vOdN1=1:'d{MӪtOtOrtM&'8N8OrxOrxLO:IM'DNSI} O=4'D2LNIrZ|IbؚO:|I^I+I8O4{ӲzDNSRhV'4NwNSbbbi=StN} 17*=SM1=i;&IOTm<=yNIjvNꘞ'8Oi;&'z&&<7'19Li12N4 ' :&I:ɩ12Nbri✧)69O4tLN듄8Opdԝ$ꝓRbx蝓Rb|SRi1 44'DLO4iM=8O9:&i4St20s`s`punX4J|)֞T4OjqS9 0s=x zSʦҝ)O4ӥ5TMTLT59NiTN{֞)e;STS8LLOrbp> m4SNꚓpODz&2MdM'x'tOrb4<8N".h*VQEW`ت$%_ɤBctVJ&J zO29ZOSÄ}iQGBPP I}U)\P|*mҾTJƩݺ{e<)fHySOI>H+ ݄TEuث5ZR^{m<IlV%hLڏ\U}$.>vfyO$))9@ZT9A9ɸIgBn}(d[}Wᚡрcdyta#Ef?ݎ~ $Lid3ǾLB0Dތgqy#g9;&8]9{|:pTyW/>&[zķpj(ZZC$eF?P zSvxfnGp1(z89c2=j1d'mZZ~ 1AjknCgUXv槯cu_ Haи *|gTfN= CS}/nSx}މ溷lbT'۩{ܢ+ 7~~;/hJ(N4X39wKL s]' \Whz rpPyo/Гeij{T<(;}!)"Qb6N^?WγgM8% Kp|wdPP9tO ?ΚNI9LNSS)bx')IOTx'rILM&Rm4DNN=蘞ɉ2LN6I8N|蝓i1>i9N䜧=N1 wOdNĚLMt; bm1114:' m=wNM6 ԟBbr&&&')bi;' Obr+4+SBI1616i6JuM'֝IwMIbm6Bp4NuNɩ1)ܞvO6Xiҝҕ zrx;nSʟN){SW™O:e=Oj|ڞt֞<9֚|e:SUN)e9qN]2SOu:SO}:ZeMSNi8LM&S|duLM'M&M'bvN;'nOr`>iMbx'hWdNɴuL:'=SRwO'??ZOR?؜I}i?&IU)\BbtNUR4I'y;&m9M'iNʪIr(\¹"8?W咇hOD+`HEe LJ'¸BHG j㎓D q'!~FLLT} *&Ibbe'+tBԚNSr&'ؚNSB'ޘ+Q@`&ٯD!dxZ j!14&&&'i_145Is'LNi;'jLX p4'D6E{I14rW)TeIUJWtM **wWi۠`^ }T~$$@hRQ?6Xܫ 6āEf|\)&F&vpv:'/cU82dm?jbb}~zw}_4syN'Tbi14L}&ɴNSӔSӄ'MpOMx')x' 2OO&F5s O !5GTu?Ę)d5UkG} z<%f+UrI7$B_Cl0b~xqٲлYg[ϊ|6&ipO~S'ieUuGh##ro/v9LbҸV_mb5;me} U|K0ȳgdNIMzh9U 檺ET\ihb?Zm;im?Wj4^AXl5_$C5Y$ТMg5؍Tɉi1;Im14&Rq']8Nrfhw#ԚFVFGwO115Inm:ISRi4NfIOuLLM~>I>6i-%" ݩ3G4b1lٛOi4GwMB$({-SxdABQŒ?R8`Qb<ChInH'h0ZGMC8#F#############3IɉFhGcNG*6N?F;#>&T+]N3;b "8><#蘘&89CA~6i!fֲZi5z'tiMm6x{U GO$+r ŧM/#V VLa;ic -XMaܑNqEiA+sS:k7'] @_G{X%`fs:p)fWcPl<g#oj>5Ri5'؛OwM)t>ߓEN2b*E2DvGr>F@np꾊;#HW:;' iHD~wKU5QO6[kNB3i"dJڥn,7& "i4m6;D|1SDI0I@ 'v}(LϢ3R=o# ~)7NV>y.LXF#FG֎b?Rirࣚ]ԽH)옘O~tIm6镛Ymi=plG#p5_Lj>^}1:FDzĄoq,^'&I^+AGW=_qr {RӺJ++&RtXV=Ȧ9Q(ʄLĜ)>O? :IeӪxdi;Iw{[t77ޱ[Ѳ4#a#_}ޒt'/I螉tsSa>8F#'o",Ӧgd 3"-r%PVH1#~(9Pe䌌GϬPMiW#=''K9nݤ%T&s[?1##$y#ގ##2=7br z! #ܖGI"|r.R)FhS&{KZX(@od`fBu%;5(G8ǵwȘ)5>Y֐Gձ6ڀG"ҎnտƛN$M~;i b2yp\0e)+2m6%F xR巨dvGpt9Pg#J}0@FJPF'T!~%ߍ?Ȇb&\l<ڏj>q"cXЏIR%ϾpnhF>?Gaz (M81;ѾIX b[؊H+Væ{ޟ i:8OOЛNڝi4O'Di11113O)LLLLLLLLLLLLLLLLLLOaʫ'tܛMi-ZSOМ&i}ęQu1 =UUY7[⎽% 5B9XbW٪0#,̊iĬЎmTkv\rQ+@G#m8O=$iĜ'ښ16)6&&s')pB&&Ӕ7&$읓_bϗMNi6&w/Θnd<2HDH vڎ*HbUVѰ}:<1b ' +I:&INbt$dddddddddddddddddddddddqGh{`!}0t7/di8ܟE!b1g35h uMB}W2Cg\i#JP&(wr~uQ~`ut/p Z4owp?(\Mkfm9#`F~1~LG$dddddd}OXdyZ4#H<dGzPdt|rə}eȎ1@R=I}Tp*&o7S{g|s4sG }TꞪ6Mi>}49NSitMAu.GbE6o_"B<'(:ѻQЎdddddfbbji1111>Ubdv'h!璩gK}MܥfV)Selvˈ}b3>=p.zUwoFY3p sa$uts\H%/C'>˔ɘ%[GYȜn Cb=w;$L@n8!tƏ"iHW^BY ƥ;S UT$G0ĥ 1fT<n-f' |g1>Z 2_PP$!U1\ 8DeS}6LLGC|4)w|2oE^:> ZD0}ћ`ۍ|g?*Y&"S$Q&luxY3y}C+;|k-}V{' \^)Y$}A;fjjJx8"wGKq5U7rOѵ Z0`3Z“|2"+RUW4h*"f(9$2d2hW ,{~J6UkP2mr9h Aχ5f̷FUUUSUғT3f-<PTTTqHߌͺUdf Vi  3fy\Aj.F*9F3: fѝ& ;ff+CYQpa@(B=ECMS}l ?mP22 YTLUXSqU' qNUTf9eU&AVRd10GX~^ʏnG0'o8*&Ӕi4'dԘ'e&i37' 11118M&Iq&Rm6bp G?h!C/`XuAI B0ʎYџ9>'#PDPƽH5:D Fc>Å|dWuwzdP7nQxꁠ@9=ވɐSQW`#eM倆Z Dp2 "@FEZ>_͐MQM E0DE!#G0C haz (a@Ё %Xa)VJ@aBIaiY*JUhd<s@6`"J#I+#ހS{,UV #B7,SP@ "Z; 222ļzr0>/d}bcE+Lٌd #8,jL?2bbbbbbbbbbbbbbbbb~Tbz vlA|Gky#H4A ZLLLRLObbbi14b)IVhY&A0t.H#` #ɷ[)=GznHFFUWsǬ*O=S>7bbbbjM&kYʅx&zʴ+@HFG~[>wz*Ū-$%(P'yph‰vY&vتLN e*&&Tetg9HGqG67A#w݀*䨳3) Wȥ{MINrA䏩RELH&TAzJKTW9'E;0!33鈟Ujdg 2! biГ!2L=rI2ip&ԙLAhiwگimn6.ฌ>FTD\[blw b8:G࠾QK%vٶ{3:F uf%x.e:' +aqOiy|I6Vj F%%5";ݸ` j,*mvUjC*`JB0u0#!3U9̀}Q:盇B#ᨇGxEF&cٽ##{m8Gl`dKjt6kGHaGG`0HJa @䥆iR;QcbxP.!h&1YT8b'w2>T/I^ҪVRbo|[>71 Z)fZSHPfRftjL EhZIYG LGBFI H1 j Ԙս[Oya|jٙ/|SWyUpixck;iAOՠr1PE"pR222222bbyIqqL͌'P 5njv5VOj=`G`61:&Qy;]5-Ff dS|F%ލh/heoEED#>$Gʣj `F`FTfhj(%ah&% `)$ %j(BFFS2U>Et$(v0` Aݘ#28 ##i p#3 0 s7.`֯Xđbi4222222222223111111111111$dddddddddddfbbbbbb~["+ ,XQzֻlb111111111111122222222< ЮHF5><ɩ1<9W|KTT vT Ñ;=']d*-U/\Z7G2,L}Q9݆- l)LQ"gM1's\:*7b1I#*Ło >ʾSy2be12 Oa .l.B20boRm2M&&+i+ݔV,$ˍSC6U׊2yqr+Zt&G!Y@\OUᇙYr8b6l3U+ozm[&},!;F۽ElF6+[tƎ)G6C3m'YFGLm Ľ? G;ڨи@K7AKUXs&T~{tj~}kyN$%ykfq)tۡJWTC@!!4{>j/Z'QER  vmFFF}/Ǐ(`v ޯ@14JATHP5UINk>P'x4a)wImtnm6Mn)9Vqxg̫2L`ddb Fˑ# (p KGڏD^tþpȢ?D̊ˉO@}AR?~{z0 %2v~|!{FT$ddh:תCe'?r#E|:qU%3N O/H{,;PmE@3[v v(RDE^ヶhFr NcE'g#fc(pba)U QZ:a=LJhp0#0*(h9#eBFGh8#H&&Ii2v$gI2p0ID2Mou:RI, |?h^ m:kҌlPµ( ""dc+C4 q o/ ;|ߍE68/,D.NG8%wK6tIVf! Fۋ}k5Id&Izɑ<:甮ɤc_sҍrQ`Bo-Sm-bEMNSۛc&1jЮ,#F#jƶ_sY`aWkѫ>egxi12"C+J^ AUeP]fi4EuUI6+nLg}vWZ!>dEI 4%*'na;(aGh2t利nOT+&Ԛ[t 8RZ(z(!6#hLLkrI*yj%y1T# %)Ja"(Z&DH *&*BF@``A.XM5M&i[M&&iMSIe$U"TPB2G Va #ЅL-C$(H9B=#### ]NBsFpT.wmI ! B.04H#$m:リrJbY'GތLLLLLLLO禓)bbbbbbjI&te4LLLLLLMӌ8L2 hy}!kB) ("hDh%y'FGoj=0B)R}ʫ$֓D;UDz>`G>x-.2zHV;OT012HSBH i j[ m0뗒g8?0eDbG>?މ5bg :|ZjI6餬~Ibd`x2j! ?s9:ؙfj#Æ3E,>?Ia$?i,_\@#ÈA?Rx~WzbA{n}qy*aXWF;Q% V|qu:NH 6J!1F @sxm ̜-DHOPY FT$`Gp0D1Gbb5M%mZN0GK?oF:>),1&*3( bh,pjaD2 FFT VRaj{8p8f!'Uy}H*wrnD #y&)7]耼ͱ+y&&&'T4YfiiUwVII`6hFLqq.] Cl*R !a_PK%ʤېt⎅UvNo*Rpවwm:F@ /H@4ySa dv$1p &\(* a$l"Ud Z$&+d'SRbd&4LN2')12NQB~^Lrr"~!; yq4@ɔޓ)12MW&'W5|ʼn"F;@ ya)j9 S)e2R}tIo2}}Ai|%khގn7Fc`sd MCϷnS-p9 VMt;e!w$Xž2M)_.~I.$!YjdRJ|8#H였JB( YBVV <}?TC}}ad& XBNɤeҥnLNBa>Ā?I!tOdMI[ \Ղ9}obf)G7N' T'H*"<V?GF#ϡi¯%ۉ C|]ϒo24JD11:ev) '?JB!EF $di$d`Dh&'[OoxI.VYE,PTHU+#)415&%i1?#=|< fB>b 5hETBP#\4DA1MJ JB1 (BG>RPQ4K[i.\ S!FB㑲2?Z>@8~A/ՙ8#7M@ @P%ΐGڌFFT$ddd~AA@\o2R%JJB`F)hT4*~"^HhW)0X+ ؇Ƣ XY).a_&&IMT|>'*9jYZdV&2L$ܞGFYP [[/[L}zjH>P6@GrqiRs h"bC: Kh[ }I I)0o$5C uON 5aJj"JPE'0< =^ 5L 3N ((#242S)bm5[PaˍX.  2<#B6TqeXâi$@!y  z⟙)?id=:~*rs1"L22#=) Vt]#\A5W"!"AIG~dN:miH,e}82ik/./~ mV$A .|ӯg=bGv7!)aumjѰzqźw呠H<&ƖfjM' pM7|n:"!ăyAa#GF`$W>w DD=9~sKXH~IC>~pMǼF{8``````````v8'V@L Q4"U!B22e@DR-aR +H + d*&JKЌ ճ E/ >gƏX|P3"k`S0hcGF2Sb#c50e`eT,E"E3I@TӒ &e@PHB )B[{n(Ƚ{lSF! M+-1Ya HH&gև X$͟"$i: B@YN6☘Y#͍C[0e#ԹtPlFñ;&o3TK!܂",$Hu;۴X&a qFy @ӟ1;m < l?D#!wa ȖR e30K nye-{ޤu00#{~(q"Mm6~e2Ě&e2MSv>مONYJ0)20 $##220;݄qp<FXǢ2ʫЏG:ᙏ$: !<;5}3 0MMDO5P=mXeBPKfXd#jձ11vFX`em0kC-sZ7 $$sz.ah;jƘ#de 5Cܝ~`&nM;mWd;Ӣr'"IN8M&&u5JIvFIC4Aʃ&3Tn#bpNdnLM&tNbbi:'Zv]i9NN&I\h+CVLXI&W2 JO; 0WvOnL&IW)bḍ00J@q7}߼8~w.')T0)# 3yOQB;Qډo}<ǔ^%:HF`VFdp">aM) E7(}owxI2ByX7jt 9& ~!Y' NSp&TLI' Sie'dvΩԝ蚤9M' eI4+pN6&RvNɼNYs'v#)QМBJp#$dUyDM+d@H\Ǥb?͑~$rA! !_wKLjnGGp{f)ŕSf% jtZ3)&ˎxDC؀s:,PߠU'MM&&FH1PH4Q.*頉&D0RȁH2DIG&0EvGɑbcbdV&&I&bjLSIK);|GʓNW-v}7'g8%:Y&}xԆGqԘ-k4$ZHB0HDM8JDtS!QۻSUlK4HnXEzD!~xyiX۪]S[ӓT`Ǩyܳ<`*0FFA\FAs؎p8k㘑 *TVIٙ _Z}1S @Tk'T&==gg7Ci/`f}# tUUE,Ʀryj[H]RxV%2L9[gB=b@8?D^fDŽddx"TOu'ƧL4g#ARG?i9S!D:؀# {DG7QxENxTPɚ4޹L\,! kFӘe^hk a)b%NB$ Lag8D@D1Au`@Nhȁ( ܘ2=]p^SC)i7$ozx` xfC* \)DKd϶j+yjMQ=ZM]54Lg qaJ4e)U[4`Sxr D"DTPV2Mwgz'TO&0F'-ZPT;tLڪb`jMU5NMi4HK`t4Kt:fNm0iU-&Ib&$X+jMU5NڛMh[BhI{1#M, VGGJH`%',,Pˆ8&##2;ilGC膶C7L mM H`@DE ̡NށM殫]\`j}J.{1XRdQCS8NY9m8LM## # f1L*jfJd`de /jރJ(ЎޢT-]s!B">x^K٬Ȝ ˠ8OEfw%7 zꔠT쩑mFLG JRQ @RMBʧ%J44JL$dP$`DCE (W90& Ҷ{H'jH[ i oO<|͠ڽ,} Dpp`0ԅ?,HZK vTi1(@9 r]!@vYa $ za@QKt+Md#aH!Vh4P FP8!d⸸" ҂Ѝrd@`4H#$Cpuh@!Ќ@aYEؚcd¦1ٚ?:"}pBtCʥy󔼠o"6q*<@}YSxrm`JP ORI'*jiNvjbuMvM' z:Cyႆ,j<l`3x.@F FJbdSƏ5{$/4deB<|/jUfW?tS:#8b8SDADT3_PE)c$P̠e #0C Č ʄ #B&C`be2ĭ+tE+tc$N|gȗ'8?%OcZp>G|MD.>#`Fb#~IO? Uw< "JɊx7R~Y&&T V2QPbP ``#?\ ZN$MILL*LIr1/ǔB A0RQCPBt 9# Pv{ksd3(?WMI7 6IdLLSGĹL15&&')-IM#re:p>B<}\3sBi"tL'LLLKRx<.u0#1,A%#(HL@RʪFȁ`v}GDb1~"jf0A:iތ \"8ty>ϐv⩤hW@'PV#.y_?)97>3D,PQ+,.&R 0vz|MA$粈 mshze#vvS=H22¥VBM ZM&&JtpFEiLV*M?F{DxHt9C|GVyU+wB_ _90VIXTR}Y&EkRje&7گ5LL$`s`FGWs>@'tD I%Ԕ 22{<LC(1״{ItwI^ \ṽ:<|`%.}_T!Oy堤c@`Dc/؄#>9T2L(V_U%E T;G{AlGTQ%TD,@1MzA>Tf$8Q,M69 B֝pEH?!. t|`RH>(PEEll*,<|>`FҚ4&&'Di7'd6ӊjMߊmb'm2LLNnNt6MɪɪԜ>4#GaĐhAZ,l X x6#"+jcٌ% %At\IQ+AuO)">AJq&BB12}?xLd̯rN'd1:W2q!R"B;t[.Ba2I<#mW^UQ^OI> G* ժbnL1MSc|0+1h(JA~bFJ>L+2@HČgR" E(RJy x#z¹6ga€zQrhxG UQDG6`  sN 90 -LL15`&&&RdH] 0 ̤ PG"b`MRdV&Q !f>3+V;SʑF9 ٭sVtbYe{ӘX<`T'Wר*]OCũKl\!~AlbM(a5ʹtM&CDzL5Hix)I"OD3€xuhe]Gsusf^mƞy+Urg^Cȿ , dSj1oWa{tbnG^pmkþ1]3x0]-da=(Ur . d7'dO7z׏cgiMѹYF!1bkj{U$7R&q +2`G4l6M&PIdI&RtO9:RnҲNS)6+)7jӎ4t?r Ǟ)P(ZQk)gr|X+I'm>0W)uM&&6EvD:' 18MjONST<lPJra0pYmE)L.+*ՁVP VTW@Ւ @(rpaTqX1e41G` hJ:eCz4Iz'i:'2M'x18LdSiMm4iNdNS'tm=SRzrLS4E^T$e^Q4ĔEڣ#`#Έ$\RwIdd % 0Gr=ǹr=F#xqU䈱v0 A,B)ah}O()t[DdPtb};&y(jSYkv@UxɌJhL)kh8U &<'2Ch8`8`8fݽUT !\><}ԭI<(Kd av;6fr/9SPRKg)T4k0FP$b-&J$`H8  61 Ҫ#112QʦStԣMoA46Hv;ͷ?iv LLLLLLLLLLLI2>v^ A 6~%r3ۤXd䌂=ao[}6ԎG@UU;6N.G6uURz L<PVke)i_=8^SIbkJ2LOdN,e×nt4MSI4Nyi{$_9HP $>BG!%cYRIUjJ2/l/i#7XoAǨf1֩yp_l:zRJB0r WqPdqGpq\Fh[сGd`qܸenԜM0GfPN CA?(˪:c=^:9RHJ'߸A!ϴSTNnYYX|_P[k>[ꟐW؟jsu{enN6~N{*@=r2pͬ&[m̚T+pn&Y)mNV[>[7UovYrB"BXK k==OD1Rr{ jrLM8֚|dr!bbe'ꛓ1114p&Im8M >Y'TeU A0uؾ#xn!SAIDDD/.2xq^w۶:IGѲB !b j&"$R0jjP(dt#:MBI2MIjU-QnLLI6QzSi՚7&&Im6MܚiL$Ԛ' LNg 9H8BdxG1^[؏/\&&'Dbb4N+,1111>+8'*҈0"il7cdx#G$`7NSIҘNSIe7NSUbEZ}i5&IjJF#HXFBBI6|&&LM&IE8ba'ZaeR5jab&(Ja\({ ThA9s:$dD`B_{" jdG5j?V47[0K~D7:7]4e8ɻkڹJDRsַ;WO,LJ!ϯŝ[hf] Mp*nڈt_>|g")4@oQEIxة *+.2S)3ɠڛNSpӔ4GNl<rqSI0Vv" !Deddda$(#{;NX=$=2k 8L$1:xJ b"Ȟ%2LL«hYvT,OpWTBB!<37Ե*8F.0G@HIBje#HFPȰGeAqG`LMȬWeS{eWWRvCAoPE{7P{ ;J!APH>G4X8*"$IOvF#T9pG&= =¢J222ߔ]G< {aE:)`GE#ٴ`69Z LbE)a.v *(r XUaVjb$AaFP'qJщ& )]F"#eP#ØV0rCHIt0&Ibdn/OO|OrqJ112;`2Ubbb~ڛ|㖉 \Jv P&m2K.uRqeEs>?kX;Fe *(N~YFiRi5 " e]0 ?ףB3gN{RfIa132m؎###00'P`k>'XC"b0㑅?ưT  L2%X20G@G,F#iAxuMƍ sGAtr$Qi?jiM)bm4M&Ґf7Pl..yXb " %Q(j)Eda FP`h&E"!N?ob;&q?l-uET@ʎ O{-b11111112222222222222bbbbbbbbbbbbn\'O[+R?dFi:awɝ!I5flf4م1ʦ{|:qYK k3N]aR/3nTֵ IoZ%]Fg$[5 B$$߭Az-aF4 `/ŠjɒjMSI㘀t#~@ G0$jI(ib@ ZY)!  T !#7"ɼLNG4b#H3vjz[/x9lD$oiW`N WUhiynV-j8S630d0L9\ [t;'/7)Z;؃F$9ܘ}^Qeͫ54齲&ҝJ-f :ti-S55PUL+ekYc)>aUG14` }?rL+fnO+qrUaI _<822Jc8/vzv׍