/* * arch/xtensa/kernel/module.c * * Module support. * * This file is subject to the terms and conditions of the GNU General Public * License. See the file "COPYING" in the main directory of this archive * for more details. * * Copyright (C) 2001 - 2006 Tensilica Inc. * * Chris Zankel * */ #include #include #include #include #include #include #include #include #undef DEBUG_RELOCATE void *module_alloc(unsigned long size) { if (size == 0) return NULL; return vmalloc_exec(size); } void module_free(struct module *mod, void *module_region) { vfree(module_region); } int module_frob_arch_sections(Elf32_Ehdr *hdr, Elf32_Shdr *sechdrs, char *secstrings, struct module *mod) { return 0; } static int decode_calln_opcode (unsigned char *location) { #ifdef __XTENSA_EB__ return (location[0] & 0xf0) == 0x50; #endif #ifdef __XTENSA_EL__ return (location[0] & 0xf) == 0x5; #endif } static int decode_l32r_opcode (unsigned char *location) { #ifdef __XTENSA_EB__ return (location[0] & 0xf0) == 0x10; #endif #ifdef __XTENSA_EL__ return (location[0] & 0xf) == 0x1; #endif } int apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *mod) { printk(KERN_ERR "module %s: REL RELOCATION unsupported\n", mod->name); return -ENOEXEC; } int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex, unsigned int relsec, struct module *mod) { unsigned int i; Elf32_Rela *rela = (void *)sechdrs[relsec].sh_addr; Elf32_Sym *sym; unsigned char *location; uint32_t value; #ifdef DEBUG_RELOCATE printk("Applying relocate section %u to %u\n", relsec, sechdrs[relsec].sh_info); #endif for (i = 0; i < sechdrs[relsec].sh_size / sizeof(*rela); i++) { location = (char *)sechdrs[sechdrs[relsec].sh_info].sh_addr + rela[i].r_offset; sym = (Elf32_Sym *)sechdrs[symindex].sh_addr + ELF32_R_SYM(rela[i].r_info); value = sym->st_value + rela[i].r_addend; switch (ELF32_R_TYPE(rela[i].r_info)) { case R_XTENSA_NONE: case R_XTENSA_DIFF8: case R_XTENSA_DIFF16: case R_XTENSA_DIFF32: case R_XTENSA_ASM_EXPAND: break; case R_XTENSA_32: case R_XTENSA_PLT: *(uint32_t *)location += value; break; case R_XTENSA_SLOT0_OP: if (decode_calln_opcode(location)) { value -= ((unsigned long)location & -4) + 4; if ((value & 3) != 0 || ((value + (1 << 19)) >> 20) != 0) { printk("%s: relocation out of range, " "section %d reloc %d " "sym '%s'\n", mod->name, relsec, i, strtab + sym->st_name); return -ENOEXEC; } value = (signed int)value >> 2; #ifdef __XTENSA_EB__ location[0] = ((location[0] & ~0x3) | ((value >> 16) & 0x3)); location[1] = (value >> 8) & 0xff; location[2] = value & 0xff; #endif #ifdef __XTENSA_EL__ location[0] = ((location[0] & ~0xc0) | ((value << 6) & 0xc0)); location[1] = (value >> 2) & 0xff; location[2] = (value >> 10) & 0xff; #endif } else if (decode_l32r_opcode(location)) { value -= (((unsigned long)location + 3) & -4); if ((value & 3) != 0 || (signed int)value >> 18 != -1) { printk("%s: relocation out of range, " "section %d reloc %d " "sym '%s'\n", mod->name, relsec, i, strtab + sym->st_name); return -ENOEXEC; } value = (signed int)value >> 2; #ifdef __XTENSA_EB__ location[1] = (value >> 8) & 0xff; location[2] = value & 0xff; #endif #ifdef __XTENSA_EL__ location[1] = value & 0xff; location[2] = (value >> 8) & 0xff; #endif } /* FIXME: Ignore any other opcodes. The Xtensa assembler currently assumes that the linker will always do relaxation and so all PC-relative operands need relocations. (The assembler also writes out the tentative PC-relative values, assuming no link-time relaxation, so it is usually safe to ignore the relocations.) If the assembler's "--no-link-relax" flag can be made to work, and if all kernel modules can be assembled with that flag, then unexpected relocations could be detected here. */ break; case R_XTENSA_SLOT1_OP: case R_XTENSA_SLOT2_OP: case R_XTENSA_SLOT3_OP: case R_XTENSA_SLOT4_OP: case R_XTENSA_SLOT5_OP: case R_XTENSA_SLOT6_OP: case R_XTENSA_SLOT7_OP: case R_XTENSA_SLOT8_OP: case R_XTENSA_SLOT9_OP: case R_XTENSA_SLOT10_OP: case R_XTENSA_SLOT11_OP: case R_XTENSA_SLOT12_OP: case R_XTENSA_SLOT13_OP: case R_XTENSA_SLOT14_OP: printk("%s: unexpected FLIX relocation: %u\n", mod->name, ELF32_R_TYPE(rela[i].r_info)); return -ENOEXEC; case R_XTENSA_SLOT0_ALT: case R_XTENSA_SLOT1_ALT: case R_XTENSA_SLOT2_ALT: case R_XTENSA_SLOT3_ALT: case R_XTENSA_SLOT4_ALT: case R_XTENSA_SLOT5_ALT: case R_XTENSA_SLOT6_ALT: case R_XTENSA_SLOT7_ALT: case R_XTENSA_SLOT8_ALT: case R_XTENSA_SLOT9_ALT: case R_XTENSA_SLOT10_ALT: case R_XTENSA_SLOT11_ALT: case R_XTENSA_SLOT12_ALT: case R_XTENSA_SLOT13_ALT: case R_XTENSA_SLOT14_ALT: printk("%s: unexpected ALT relocation: %u\n", mod->name, ELF32_R_TYPE(rela[i].r_info)); return -ENOEXEC; default: printk("%s: unexpected relocation: %u\n", mod->name, ELF32_R_TYPE(rela[i].r_info)); return -ENOEXEC; } } return 0; } int module_finalize(const Elf_Ehdr *hdr, const Elf_Shdr *sechdrs, struct module *mod) { return 0; } void module_arch_cleanup(struct module *mod) { } ?!h˒ EfF)w2:9TJ9k" +v3eF c)xnut~rǾpW>2.:Ô^u4ct&,OBLjHqÒL·e4ojFhWcKct$Ukl gu+G>gz#PeHAG'3X#)#=@C҉S 9+2]])&G9ų7"-l&%])oJ')D-FZO*]_i؎lSW`,5_e,1|=/|̰y!iF׫RepBb8nK*x?@7Il8((kdg<3&q.)#U< ai}̑Ui4&0ئ(_,*."z5?S30Zk9A鎇fpKpv8ͬVQ'R'K8z q۱Khp`vhdy%]ca5#qZO2 5%-m -)Փ5PW=ȉX c >T2 1E3׸Jlh?%fQ<:" 5@BCSP d$Vd*/  / ?)YGR!j&r,ϟ/Uj*F䵺1b+!* +9Ab:|mVXCi4@1IZAxZL!Bz3;ĞD_4*[+"Àޘ7ne>H>y#4 qL]0FXsՂ 19Ȥ(ERω| "_ !٪`ZR(yidmXό' fR^2a֘ jݮ'A: =Rga Qv??IfuV zlxqd! ^}{*# }(R#U f8_Ԩ,Q87Fֶq(BҶ fnWK(J rvRRyg3_CVB`UC  ٟYDnAjVv59;jcJ|+)cSq3Qp2"6Ù+ܗwUe#D%?±=͜(f=̉SҎ5KiiT~5}|+pG6cEj$bVpl/>fZ v|߸[G?M\N={^0:<;\֪cTQV!da~g2[TZ&aAGW}U0YrLj:W 1qK|J1>i?KYJcp[aMCgz~+]= S$TEz_+y(^Z6ǂu;xyrww@9;q픓/pV+C9\纩HMqbAy@$WLED_8xM8_so~-jOf-r7i56Pڴ|A2Vn#fq֠\ezd[8jOBzޤ*- y"7I6MlM`c'SA"*Fn|ܞ:=y: \j`R$iu(0BMA^"Gxez[  aj[&T!iZA׭Cadn#M0q*ձ)P/Hpd;L&~aC+8ׁ]Nƺ^_Dm(N“I 5;z7qQLQ yn&#,5vSjܶ]zƙ[0: 66I7A˰Ek@Hlaӓy=WC, ;3;;|#\?8|ٹ7Yhc 026l}9AL/42] լX&w>RJzlB! {T뢠:ڜDwJ)dpmx{4aӃyk󢼇p*38հ,u)8j(+ȀME攻-jͤVd[.}@MK R~zM( 3jdtߌK#$q4'(#B?GY&J3ZJp JT>RƑVi_1 p\ knĹyIk]C^TCY:RSɨļ ,\B?: G\EO t[RMwj)uQ'iCҪ_Xfz_|hzg=؎txiln隔|S?0a(o1e1XqEwW0J0ᒩd[<^ Σw-58I /$8r'-U$&XU\ 0#A \= QJ~;=!W&h k\_9 `3EhLMⶖ9Ww5+ fMj&ޖY.!І^~rR%vJ#뒼C(FXX]<^.m OlO;7NC-Dœ/G%"i':RP;ﱪg8* *&DgDjA$x0li-jKp|>9]y5Yبp 2էm6%m:74HgîTX-?iܴ|DFR Ny=KOP{zm|ݽCTtL<#'BMU!AwFL(wς)=ًDiCtUx!Fdp~w+d;d\,Eƃ)ϐN "\X(P@-Μnʤ#nB!T҂ߠs'cT51 gwIp7D-v[`/>KNKxd__dc'j&8ZHKq;fd FK)2ߍ lOP^36Vvֽ[a Z$n](tX1\Fk3Q7qwSn eClɃOT63 ,䬩UDomNб#[>>yUAԐ}$1'vշ +ˉuKN[t:N|lgF*3{o9M`Q˶Ѥn\p+]I:H!ꮰqُZ<0ue op>} 7yn&xdV*\tWW@;xP8, K7I_>?~>f}iqT8q?TAa>Kn}Ѱĸ%ބeHP|<^l⃍s;Ā ItiWp_w|.R`: FJᡘ?YC@`;b,(ׯca M:6 wJ12;D8ΌP|t>kzRChjv~?jJ0I]T2vnG,No'MBw}`#3c}@=ŊR}ۄY,m]}rLJPt+!OFv2U@Ii!@&K,ފ 갑i_vLk_a* ! Șǥ-?+^3HK<?}'=͢dҟ^Fk6{oYkrqxLˑ8W`;x7PLZ]^7j@qļ:}ر+ 6{Z _sQ[25i_,ض&~6` z#Fs 2|>'^'|p7/EG ߚ1z>]:nDڳd_AzB)<70E|u!W b{Up[pydC"O!ȾW }FjǕ/8߯Zfv)- pyAs v{$ O-`5pd y$A5LnT]HðUq6W΁IMZn$~Q62$h$u?$dEZD%H7 WIQ0fzi" J06 fZ:&C??#@ SY_zR:(%F~wHOJzśjeMv'O4O9Ne8kPriT#L&=b(۠< պcTh@c_ūعzA!Fq.\F|CPC+i+mFtVo[(B4T "ɌWO{~">oi+Y&mW)ᐌ3,vܝo;o^K){Xx"}sVqx׌{Nx75~& "1mnM]O 74Rf6{Ԍ6 F p(@upe8g~zQ3-',"N"O{EEU3bЗQM '8 ^&iuKhY$4$AZ,k[)_5#HKK7!{^(Ȕ56̓%O<'a" ۹VZ"M6 +H wX§k?!SkCBOg "3X4R5&HdI"k*|=H?X" x}|"X:cAb;oZsGМ!"*rnWCy^D.̇HyA8 0?7 S0#T M\c7a9S]v;e6V57A$etWNDu{-tx0?7>bv\NQNCo V/!jE\VH&ّͶ6y&B nnIMb s6ȸRnkS˨ N&²RF j SΔ$8widTS(gWixWp+!`_A$=d{t,}rLtd{~3#zq\wҚp1ioAwJ8"Bn4-OV\#5J<=Zsi<'}/GϜ<j=] #dRO})779*;f6@B7R;z G־ QIc:s{agނ*?i3*\/MF"(=Hp~LP̸;$>Vy*Z>MKMc3CMy[ 1Ըօ?%b sO+Y p{{gP8YP}|!&zo]q`*X- =yfg ;oWL-~:Vz;%[!Z ¼ZoߩM]M_ -1Y{s}* >|'N8.It3~;HIW9]ǀ $U}:55JǏN@x|eJ4 -RFU+df!F(itDn\edrd $מ)T' |B|}#֡<²ds4Xs]AHs] ϖdr_5B14fz2g.'UY&>&BlSkR#6F)$VFbz߭0]z{EN`*u0w8$W6_;1Q9Bwus\ҊyOVf@m=/%J8 Kڭ{_eyM/ƿJr13qN:٫]Z#fC4畁rY{Cbt ٺ0/:Jvj`n's*ï5RC.+x頶‰)A@EVPrk}@C\YC!xf!oגnK$3M n䃝+m;sqA`ǐ^_ ڈ=L>ۀ"G!?^HBl)lPvF8]J-V#WVR-Q$Di턬."҃w-"褔x"DJ.x1Et+LĊ!r贷e3.)^/>CAZ"Iy)?\V!z zi*8ge\?pH )& TIEz+}P bB$'Nh u—"!3KE!X' #hj?͜曷&tB鱓M8z}Y= Ϣ@NZSEA g33U1]& Ɨ;xSdIIąxԄbeG_"܃Nq I,Jχjc roӴhQ)DTM$RLi}pM2HX(.Fޔ+sjՏnpD34Xf,-iӂ{ݭ+_ii".޲3 "Nm&uTN.vV%SdW)%י= "6%wS SA֗pN&;A`#1*'I[a؎ k0z඿tz߂ʙ' YJ&H [-{TFg`o7"3gcy/j  t2؜"lB5G̪IwǪ(.0"pgzU oL{ =@eL' St,y\)+?TL3l.K>(K kM~v(ک^jjby쟵*uJv rHxc]Ap@) )x5{8/ƭC7~^= ZJPawB64<P:5+ˢt =٬b̎^>) n)ݶ JBsw#^=OYNZU(ear,X=G?M@ʫ 9GؕB݇opJ_C?&!ޫE\oQ H\SWe)rBt wBu0xۢmᠤ4?9!edglsHv}ZBVl`X}pe/xл:HjU`ɶdYa+Orc$d["ߥ_XӦL ?|rNWb~g~4] .^A]jg+4cq c S]fX!s Kmw`>ؤ0Vk [NVa FFKF)ƗbUóQp[}'w"q=o\W^Ewq\0GWB5:\*&!I2JHwC>!q@!I k\ˁYP&Hg3^`!F>%Ș;f10]V!ST# >RwнH~%vbf18d)>-L3m8VtݚsH-bhu}P wE lٵ!„UxU#մ_0O0%Z7 s=+՞MN} Eo2%?(_H6$סdTL))ꁑ@ ="B8k{,|a\Oͬc֨j> _T'~5\ȨgHZkL{R] !*S# K٩ЮߢP`4Z~ងumUF:3/Ez`ꙸdJpO1Dp~z{RCJS,Cә/'qRqu:ik< SGcVrΑ##߈|g1O; ]{7nK,zQ(oe%e`M; \A-g7$3L{a0qC3z܉?t+*LtSuasw:׃ۥ8:$S]W=*t5gѢ#O}tjkm5S*і+<򍰭2pQO6!!،SЌ_Eny!-YB`5sN{Fe 1oxwq8.$ߨ9EՏZ"r /#M$?I#*}=}ŢUp ) ec!Ix7QI9W$c>3@%;v<ׂ wƐcRᄊ/":ToE6-[h+7ULJ溿n[ \ *P%Uy%@?Eo7QU:nZL캾"/]-IsP}LA71ƒ|s2\vpgBvgd"$}Xz3{ ob=ccO#1:@r6W2P|6s6G.q'5,Oz6IRmQ+zcUY!nđ%HmS8oCfled{M.!P]ʽݰlJ#5;@ סAH 5G Up2]{䩴VH 6=f:~rz}q6|L9:p"]OY S'p{bCݲޑ|}ʏ8FQ&'ghyl9ט$yXnҠFԀOGjNHGʗwez(Z*QR_2{ٚ2"Vp VT@$9޿f/z*F 5: ×?ʹn.Ct˂Թt1)EI5?^%"doc%3-" .ZŶ0V\A >K_Z8q< )f;eETv^./u(bTEmEٳqmAQw|eOdp)@'mCNeGMpID9b8KTiڃ{AaI`%~o]ؓ ƾY3Cnak(ol X\rx?]D P; (^Ej .*$ <=*h칯il#cXtHZgb6}]מ^^Qajg^DQ-?]fм&Gn6wOw8/X ރc ^%QrKucv^ <Hl?bRDRO$JɁz|XbVOnn;$J*j )x:S,*кbn eXZGY tDXli^>tU /Mj֎>AtcbBXK RԕL~r`eA8&vG44F/`+A^LN9Wf]vO5`^ЯٴMrX# ˕t6»jWCOGZpQpjvw " ;>ƌ$嘻nL])3wN(\]HnëKmYi>ĠFL ls T"WYEXݪ#,`Ç!Ǥu~iakء[?MyJEߧLK㽭1U]9j~/AWxsZq%hvZi'd#+WUG9 7&ۡN6\]yçr=S6KQY1I_/\̔1y%%""9d?emCGŸޖNC˧0.'!)VQ$ 7\6zȜR[F'&f_㫁M[w BOK!a[4G}>@K^娺*ߟ)zfrTKPy %PD߼C|S^A۞tw:9rÇn?G0dEv}߅~ ["⸷@"*#'cop]fT§>j#/OZڝ7ׯ|CVh 02Yw*=L-SԵ!S`HM-{; uy_,J( 8MD%#D:t[ߋm>_[V[x^п(;kZ#Smv@Pƽm.U+ن؋{%&<6wL)lLCauuϳ*mMyta00q*qj\DKsk@bQ\9&DȄR  CiT¬#]=@[\B =0\7?zO33B}euMڮr:r 㤫ƅ{OqFJ;j0'nx קr3Ըn1^]BM8Xw c8kD j&-AΛFVQGo%K_ja6 [;2hW_ism7ZfdTe# KE \fJClär!Y`LUʭ*0Xr .s qjd\[!7R>1ıI\-d fDN b%7r ZlF+TMx(`^7Y00 hz1|}')#ŋ`_P$R ckK QmJȯNk4BOܰqToxwI_^BGV-:с # QĶOR| 5,QQ٣et@&x/>dg/"76~tUuűTZ;:oOx8s B;r&0҉y%X$mfНԧ6B`#ܳe`܋1 !bgh7 n(w66ϛni]b =nuoE돞Xxz5sC0 _ '92%vrQu>2^ G `loz#N1T=Qْ,1?>_!dMyQgIJ(殼U+B4/L4gLK*m ?תnE~Ў$ѯ9T[b<9.{;;`}mDqeNHp@fOd>NVձRF}`Et+,'cwM2ު8O bPؖuxe#ʛo\'%{ƼSѨc!fVaiYǟ6/`lz5fF&`mpJ4 {ivʆ-]$ikN=I|6.!)Z:[D/ 0!Yž_| +?+AX w좧ߺj![>48<}d_54rCBpӎ^xBvC9B {ޙ3_1!y2Bq֠>Zi㩇_U"Xޙ+arcേpSk 6>=B&x!ao^+U<;_k~jsq2l y (;q5Ȋ,V& 8zgsr!71 MXİV*P:ޗ#{=au[ ER>O{Oh)te9FJ~C[-n 9IBCl@]~糖'wUWI/SN֋qѱoo(*%lC/зft Zys8KwfPz[<K[&A/xœ=XXaB#8ֺRPg뗂?e^SNu/HB_ҙ5"<NCּA3AQ̳|P2w|VyL{\: 6sK>j)߉@52||o.¥3Gy qTWe{؍_b=!i͏>1PUc']o˞o*} Q8($gGη&J^MT8pL,$&z*hUyݿqB1y_jr_:ӓR L`֓1ͥĬe89GiJZLryDRȍ"|:\7*B=-Wm1 >8+~f$Y1॔YJLv<ʨ*1\sWG&06yպǭ)DK(f$cR-7T% W)Ȫr{cK1! ha(_ipEl[6W N֊!2Y$dlAjʲpG\I%i TROvS_)UW\l{,+Tڢz  qeW1'e"uǓtAfwQeȁA?vwnM^(œ\6(m(%6M3$H V-Ŷ\~iG~гB_2X鴞Wa\8 Ig$[Ə ϿE+jg 邔1t'p>KelE)NՉ3 92ܞ͵5!lӀTwۚ3 AS [zU)dB~'ӥO%y46KlRz +hΜ,IɤȢ0mg%؊1K"lkp׌r3D!5ZHaK7ځ놯^cj *SUYAN&Gu#4. t[#'eA /acq3"({N4`BT#q҉tQF=ZQGg?m](nrLzPRFW7- J2dMʯ;.#ETN]QR1ZQ[3#y ;[NʀBۯxU)qW"!8Z8 ϔ 1,3YAJτ燱A3(tW :; ^_'1.^;C>-e_3dcz7o|9tY>FA~1{0wo+z;&eȅLf|n3xkYkߢ rH怈0HmMY(^d Yiuj\f Az-L]^=sL긁fT0*XBF9dƂK:С8aݼag*^? 2ܠPD |yޏ;W&ҾI;[ &TG `e2+:|owsBM^蔩|?|A`;}eea3gE|v)$ARV&HTZ$,(Zs:" q"M: Xy˖CTW (k.A:=&9V0ȼ(2Dlm~՛2#{ 9mҬgdueV gG-ieCh1(L:]Y'^LsșpO*ɓFьBSCňM!S!XVͯ0z2[ r!#!_Iak1 FS} jq#g0W|[ONDWIo+ .n+er%(þMi}\=V8|Ku";QZl?$㇭br>-Cre&>UCmuѼ`cصlĕ[;b\2vlN "XpcD9r @A|/{*W]L/%/=j㢿ҫ[XŦtI\2 \2vWl=p{Hx ?y! Z|J[|ؠ5KQBeie>-x6NiTa_V+.9GnxTg% Bv_˦Ra me]^٩ N)6 `,k:fUOP-aWjPWq9!s_->jF C wR<kՋ LM!=x3d%LNl׭r  MQvs^38Uoۼ L4Zjs>@ޢA[XLӝ|8R+Zl涢?$~bS$*=sv֌=Э ꃷ*; JܾPZ`.ډ*Mp2@=-6Ov 0Ej*GuO$A&YSG$lN[Vgz0'.6‡~ٿZDprWW7N|psVƠiz0'^l^i{!}ep;(lM=.Zfqҵ8:6*{=6&7Dw+ 8rHb0/=M|[vz>Mn}Ў)w'm?1?6a 58IY|??6h* Y,Aؿ#PYI ?2KSu} `\PhҶUCxCMWI|ҟFMQNLS C1dF _?n+pUy 5*%LCY0_+8(o'v3XK G4b:f @d&[{nY6eH9]{065|#}Ie{(o@.M-N %5KLQ` ؜%&R c7@)Y v; ;j7,E:Pw#A?d-!8c*Tr*mLy]~W%&_w`f!xg/>q뢑XNcbJB7; e𥭷N&Qsrm!r4xNQ>h}@ȯa2~q]Ok;8[x|='60^:ջ\'p`1kZ@:\wWkbVb};+1R.N5ZaW-WFgvSϔk٠ #7pwSɂ '$`p^6n@=)rc$KǓ]!6!7] x^qTK05/}&۪z+|8IPߍJhaJL 49EU"Fg'e wnw95/ w'+)"vu'gpauٛ;ۂP}+#a?$} Agu"7B#eFy}nsl NHRAq" }>OŃl#xE\VdFQŒ,]Ks WNPӉk|5! g`eZpjʉ1c :5I&:c*QyWaFuz K2u9֭85HǦi\#sZ39q;+ޏͨ& p5D͌WP8Oqd;F#T]?)>ح4|I:b4t-Tz,QO‘aN ˨]Ndm`ǬIy~taKݓEQ, [[V# -HB6O#:yQw*^3eߣ*<ϔ*Z)i)\hhf=S7w0X7Ŭ%9mKo08u04gzeYzg'lGGs8NaU2e~$􊙝|7m"5 NkzT8r*dΏV;dKKizl*Y  Hy\n̤0Qkã=?$|l˔ 횕 Q=/摦ntwQɴF:ff38DsIkr`:Bg=(*5r-5<դcV@~# \:YOmGˆ HΆ|~yJ*V bcT ZZvK4Ri۝$[NIꯙNEmUR:- >̂ENx b[ [\Orv1G&W\Cg[Mi;EILU02 t jhj7꒷Jg rG~M`)8҉[p6k NoGN}~]ƛ!5HאҊNnW8/bu]9yE&Q"Nտ따xz w Sxr1T<}EI;,(@IJՃTo66~@P"dt {^lPhքdd 6r9.!A4 X;SB]?{ph`l%t^JN>CcCvN{Ўўʆ!jd.^:qaCst*E! "/ 8@R mg IU'_{] 8JTc KB_NVF)5&C໼3}<*簙Ʃai$;`-˺VǾzpi XfK:T7֡Gky8d~D?Xir{ȧqEj`' d,R͑ ]ZڋdB8١04 v-R2}b$Dy(ddx*{K(^$-.jtmH -:x]nBwok 6\" )=gm#%TshL7_ߒ DVYAC92?4B0@Z`k\I0qN ʺiylV9]34kXcFu{x|N#uX2l[06 NDcޞrIݠC}0ӢYN]ML:*'B,߂, RKhR@5~=\d~"2*miKGM}1e?Zqc6J86 YMn߷ ǥc4>8Sꦵ, vhWu ^9ڲ*:g.]OTgI$ԃ y y4u"Pc22& &Mm,HCRr٤~mB,+դB#$I!Kr+}vqH;yXtE"]>#a{kA>71M18nK٣Ui -,LںB7ƷhkocQdwUl-0s8~VV#Eͱ oC[ecӯLu䜂, wɛ7-"|SpNx߫. & Ɠ.$Նa'*U,ݔ8IaBYq 7q_3 V~jf6-K NuhFSY7g@|֝Õ f30I͏z׹.?bK"l9,bi`=>נ B@TQ x8] d<1"Q) "?߭Llr"Dbe5{Niʞ팘 ǀg\įYZ +rv^卢 >(R2됎}Mq,ZK*)vВn?b<ۗ7KF'u<#Xu~'*k[ڽvޖ _Z@BY]1i0 TVYJ ܳ@y=#H oZP۰Wk*yF =Cj|T+',No,1^[[Gp]w.iG@,a[avWY!)"0wja<pB%{6v ³k_nMje [XϫtbYb?]4܃!ﮢEl#dT ܌Zeϭ 8> B5uEG4}}םSe<(4Uv)#Cd)h1NB&%(X||ِY+'NTX~aQ[Дu _F!IXmc,{0a5kٌ~X<.S[lAbC_ Qޫ8_8KmIXTl kZrhȩ!uTT@}r԰~J&Mx-᧺ pT'J?A#쥉9D9NVn8x@͙q}eI\={R%tEsU}㦔vy={n>|G^Pa Zq\YZIL |ۊ.T@# .}q /ږ|S:V2 Ī1D60'[%))| c\aOY>Jzi1&]0phoP8߹ef 9a$4vx{G_clf% yPr.l**`5&-RG4E-@3$nץ&ʃ2Cw_!7 Ӡ"mjr=?( ٯj8v{TǶ43Ƶ8@Dͨ}Q]2Mۨr[)ut.#}ȕqAUꗜLЬ m).E~}g(c0l wF 62 1aql"G<(Pw9Qbk/Sb)̓ȬeǼRPU8W[ IJv,"1`$k~@zxRnFooO/! 91eV`y@&w`ݚ:ؿ%Xri?Eg.ϕNlHϰ(+A_Nؑ2JVؾ 3DyS*h.Mi2O(Ӎq5"$;[?5,'(vɐG;lKr|KXUݏ/sGVv01Q#@^k>OȢ~ڷ Gmxf:p%Dƥ$-˿ AQodMoucNQDmb%3L;µ+3a7JRŧr+_=eS{ %~~Dvϼ境12g{,]BeFydyx[$`p{)S$z4wwfW]L1W-랪@;}l®9I4w#W{WP2d kb DN3!SؼXzŕ̪vki:v^ J(#S3V$\h8vP4'S@xl:-ُG. `ɛ2|o9k&W,X K[',2&M5SE{!pCo])הV7bڎhGblWN25Q-&T{8q%IJilXZ[Ԉgtz9箈jp i"Qc9xOjhsW~W+fnaq0_m+%9`擗W|5%ږU)m ȓ{!;$ Y,ӬMRϬt&:T+ `@\Bs}M~ vxyy{4MfP 12}ѲћWL%KdttR{wTt۸G\|3JC{WaѮ\!*yTǐkO9 Imqwwٽ3uUc hHŨ_9J2gUp,nZ$BzO’D ~oG4@О"PK)[tfXbhwd0WO7.OeQ=U\hCu'`u1H$8 I!jG@ճ7=<܊+OZѠ[dgYɮ=d Sx؏2Z@ngB@Qut@*SIQBњ>%F>+n\WU櫈zZːmJ0ԛVʆQ qyӠAtwZ a%J\ }iZrB m-ykQ,'I;8%P_b-]%-~m*@"[40,羖W jxۯ].ߗ":юV_qs| u @3UP؟mc}rEn.<K@t/y OȲ$' 芿4RM}.T\)纹bt CE_l&(F*gBjJIiUQBΆSFp .v{.,P?*haŚ{h|Pu@p Ǎ%) ݨnN۽(p8%ɑ'{FGϛ|5֩HF?kynol ݝmsjUCMH$!ލ@t'xP 2~/xkgGƯ~==򘿕 V^V6SNJrο½ ޛ < I7#+`|4PUGxA [,] 4#%M>9jۅ[sѝa!!F-Xڨ8tY`^X1#-{_ ͸gt]F\gqQ]Ϟ^iy4výy3ր̎.]9k*3{ue6-p6gV4n^WlO$Ѕd }0vtewQ`%;BBŠ#'g@B}۰=Clydc<'(JS:WD‚_(dcuVn320 HHdXmOϓ'E+eNn}6 a }Ajz)8%l)ԬZu"&p 2B0)xSnЅֿRHe}//1%PVX{1Bò2lS:RS܅{549L:Ù)lb'Eг}VیWoy ,<Χf̔}zAG,ex[1C93![UkEH*!=A8ZфMù`@lQH>MpY uV/4.snJQ`&?P--NNۀ^[3&lL\I]{454P(c?Wf S?{ Xg)#A?O,_ݣv5.KDc":)^(MAܙSa4TEa/T?n9DN^ RRˆBoʣL򎦊1ÀQ^&U('RUKVe4,k6"{Wbn`#*;8ʞu{K]E+FYA̮퍎!ۃ W-43>ԱSb+$`[X0\2RǓI[T{֕EduY4RMZ%MnIdɚOj1:% @ U{$54|CX::իT":-~Vh#1855lBHck1vgv5)7s(=gG%ii}#-h Iot9CL5-~sD&Q/8ݛ8 8;4@ l(fmejdJNnmN=j_{Yg;dGkb&}5g2PqGQa.hejOGWkQRhx-RctfEf.1ĢM{.QJ ևW }+߽w!GbqbdlAfAGH3 _Yn5lJ4N衆%t2-pڟÝuĊ)2اC\k4)̯U:h3W_C-ix ײ?yuGGRЛQY#iO^7T ocTo'jWĂW1M!vqhft~g[DUhn~4Ͼc>_erx2q ^ѕpqK Zݜaѡ^݆g)q5V?̏ƆCwpVudR saz0kE,2x*omVTҩ& KuknFUYNYi"."Ido,jO3E5|Ë[^ɞ>k(GGq?e~-N>9ẘ.*==ٸk#js:r1t3 !{;i(S̔h3D>QsL0 9꩚ޏךޚ1~gݯ|=sy6)Ѱ.o*0C9(1}7ƕ^=&ߖ0>Gt.y8VI`MW5Wcϡ*7vw +9L1HPMEܴqcHK$ډh4VW2=q&2\60 O.y\?ztA.DWyF<fZ&6>:,Ff/G ݂"Ul]<}{"IAj~#\Y7/6{{!:u gx8u؁u,q8b]"FJ#[I1F#ܬv.Go,l"N,jPޖtkwQfhx>BWDKkBɗ.<3 S~p]0+*)$ j!#Ja$1d4W@ ]nXIyozv`+>EWE_Y?'pZ)eN[-X!$ nبc -m/jt{)h/S5p;?6 rmzǧD[þ ʢ҃dr;I/G]9:?"BR ' o}G:f>fLT5ϱʹE\xaۄSfNng-iCOAo?p̐~y63zK*UiZz^?kҁ7o;^2 fs5d`Zg) TPtևbS\*yUjsŬ'5i%L"![(_,zcWtX%t9MB[8U֨4[Љ-^>wAZ6M7(Ӿ_URUs$Ϸǔӧʾ!@|z*OK"K mEL8c/ KSo#`F|>UZ- OMQc#>| A{k$r̫SB&R'VIv '&oą{;MU )G9K_nAƙkD1c#=ݺZ: du#=CnaC*6|COݴ4e7 ï=;5JOF^»HAPS=h=zxԐ %Ōg }Df:.9T^vWsRl-qڻLu:sݽdWY"DzT"6BȧI -bp9CѤt>5mdNODdCGeYtн2Grw&gv?⾉NkVV2R}1M9&l0,Xr[zP-zR4?|Hl=,B-X Z}J"д+/ Ű5]7Wňi."QN vbM}}Z-5gX 4 ':ەtzE̐†QaM҈GYKu[  r"oIVB`Q T*3GWbؿ"$0TqLz`J.@x`P=X #̑O% f o_(9/VZd+ƣX*I]O>^#!B,X{:%n{'fC$Pn9E4ZZM\,j(P+T\u(hDu!֓SKk7"3Q0:"Ea)d/uȾ+w8y)|rh7*pfBfR3}xs,RTuch&= Ucx07O{~o3@;:\ a&:!__ `}ONq{I#` FWmj`'>94vKb9^s`lI&:8+C::D:#!{LS~FʕV;>sBl%ACjNng4V>t<#D*.pv bB jr iqi+z6tJf FDYAu 3~XKH?_k1Ʒuu ~r.:nM¢pQ(D\􆵡<sSpSPCjq2vm9'&#_>SCB4^/’6Y;/c}q1]Oח⏹݀ ͨXp&2 Ґ|X*7Bt ȼ+.niԫaݑLManX/gB7=b_uGHE5"HJXӸ^М,8i}Z1p{:.&AHA-T9Fί W*VknX 0YWtJ}^(HV= tpʹB"n;H} QvI4/-| :q5q3`+Q"/Kܳ[TRs5ڃ`yH}3OzV `9L`k(_}5<^K mE&3a KW p;4e"G:2CƱynYdm5+h#vE"";rG)oF ^J*9V8z S@$#C<~`&X7FUҖ6w]-0T,pl\'l1.&~.E Dg:y?Eodq}&%ǚ%;wx@"5H|C)I`QcI3JG z~߈1(o!L.j.BjK׹ O۵ELΚ3hK(Jgk  ҜǬhc{@_&Ka'w=qx7khſ*xT!P) @i H0b΀tu8<ծg[:qOu8HVR^|2}6?@~?tNq'U@S⒙~9S.AS9֑|˩EzG ->gKdHrxСOsdg%~ibmr"K*H [N|BlGL]1h*4na: a \YH+eTͷ@P5:jSP/`T}~:%_7 OaBHUXa`.}D,<]IvK,'4P-OBmSkoqĐx! ޢS{ 0 *#‹G m'0t8_ Y)jĕO- /32Puj_ix!t(gԢ=qʦw=4jXU5 Z\ה]-9|z+/*HlڃIxç*#"_QQ!D#-޷u.0:T46vk[ܰ% <щ4kU}:k*Xp@ ;su~ Lֱg5˭vF0.#clxO@ڿGM("]RY)4L2W}L^`ކip;mUBZ}@UDP|] Fq KCI-Ym}ڐ6*P'`ML2אXJEPu Z X=_8ϥ+d6sMcC˜~X&+Ebo027E-{E^ͫEGO H᝽[y6jV$pmV˖ϜRnRыm' |%S>,lzɢm~? ' , 9N5g+!yx<%h"USx Nlu/FA6$+;sLH@!T3C4Ua"^π ?.yqD^{O RyԒ_j}q1 %1ED:ߣX`xd 7oXYs3JӉ3r^]ǹYӟ㾪SVŜ3 @D$:u2ުԃx:lne莶fb4"v+Z9`,:As7ѵ靊"uQ?[U?Q_+7Tlr_(V686}P%fv?T eNg Ԫ"&BK0B<QC!|ժ[%a'sZP6o@DFKQ!+ xqct_ J&W>ڞYiDkW@{(h@_k"?ʘ Bۨzc5=(,>/ st6MШASG4ӷb 1w%O%}0n]9?'-pRKqoh,U@ڔ4^# "|mr'q@ K#YApw]5)|xsZMei^ui5\w]jQYWJ+. Zp|J} >'{'km>Co@wFG,D޳baI?sXJS0rDSނW>ŧ :t{ϝi <ڨe_}Dn!ZVJ5f}Ԑ"KgpIq^Z, ;]SS4E ~a,<惕fYZvԜ*eUs<>/jM)$\uHK;妿{yCk]c@)Y@f(.kOF4|_!f󴩇X5%'uÙ",OTr4.\}B|lP`D* \+158a!(c9E;ôLJz z}W%u+Utld>?Vj-vm۟] М:xg(QO4=ҞaP+[U7D[^O]}_׹B#FVj%;?0zԑ~^KOl9-CAnL8<{ΝH](-E|$O3dMR>Im0 6ю5\QZT38A։J &o-u^*H2-zSponzֽW< ~(B49dT^k. mJ,UگԂ(}K rA\j50VY%~ZX9/3zL)VƱ)}hwrB뒟7u;6[R /tMxP)%XABl?LvlYY HR$oDYk2ʎN1]#uYXr-}>|a D,S$~Ӎ6S}fB^* )7fѩYQ9slUjaHkZ'M}1j+Z/-]D^(x\6j88Dm݃Q:V~%;+,!2{3kbxa]4qg_]m8JN_`HU'LiBM 5*%";$yw{$NG[Xw;8zWAVB^5h kqfߋ|V@5}ZWȥ=8*)1|ogK!$,Ɣ ~- h4lf8hn X-#Lcqq;YxW U*"WP^q`yC#-ߵ[+W ]TV3r\1$lm0r!q\u^.Xhlj:۾+!y<*ųaFgEqC"U٥ 1D)o7 {}F~V-Zmy0Aydi;T< B&D 3~GTuD+K,^,s C,P]+^ Z>Po_嘔{SujԷvN@E>Ab:A=$XPC'g˴y@<:}*j V0q5ǟ~8)s)Ry+yʿM#-cX}!F|9 }ܐb6z)m6x5tAsH!v]D)9_H"~QQN+,B0[`vaR_:}ZPp[ӦRf;?n,7܋B̭PXO>k3TInm$1&1L-eC]Wk7Ug|'-v&=!_ڶ44u4=uFb;trwslDANMc3/͓L]y@2`USĜ Зɰ&3Zuٴ7h]lx $--ToH|[5G; 1,HJndW:K2|uC WVʃ֢ɺ[vExA(+(-<ݟpWQB\Zy:0'snTRVz'&s~?Rkۯ6( IK?m̃Mֆէ[;CvTnQ>NAsYQ$1+P0X%zvJFTi9;cZ,mpmgp/QQD4dH;&)%U)AK+D#?h@6e+ނ]킀tT\{OYSpHN``@ݼx|0~ Ҧ'['MVkSG \N5|$55 laP 3+үa?Hv1FSiy|To'=~S%Kt$raGR*g)WLvv _';棠A !"*~ΐb>kx,8c[H3<ɍ\S &e6''Z:9DfpLl: nIpUrB:lab HD!{rLA9S"ΗSȾ=% $Yoj׍ΛmgrL0G]"cX36[͸TU$$MޣMqirRb=!Aɕ g8q:EnwY?(I_,h[ѭK0o5cFj"7miѸ?ߪy]h_L"Oy ޅ7hx#& λohZvFjO`6ϊ(יXpٓnAEH&y jN TR=FwAHSGeR덃\wY{O hZ9`y@Q &\T@Z-bj {E;VFkeY"7~zIClYpyG=hMգ"^onZM㹓5?' wAiǗtVu4?%Q|INSF!麱CUwdmKΗMch.#@c34ő`A1k\*˥oPL陎s*:/l+]凬qݻg>L.S{l gg(W(`u+؈f\J#vaF2ZrY*m`kg%H πbE0;\ =*ӕpj7)E5l SOL7aRo.u/ZlTޚY]BԬE\Rfb&c|ݱ; aȱ}<]Ptw5f$ e T=Xp˜nVzBIqR@9J|#HO; &w ?,V7&B." E_Ux'QH=R5Q=e nyTW1?sEP+w,pWQ=$ųp#!o.-zx9y}$G'~=1z,Iݺ.PCiZ2S`BDiJuQD\Кeڽ˖- +|7jr S#B9KC؎3RmR"7( Z\bT=uFǼԯx3!%1wĉza8녜tH:iG,޹$(E.Йy&LCΥ@[ׅC;JWiOR3dؗsG2ZV,5Cl]-+%-ß3D wY=o3F},;s. Jn vd%5+$i9dAj@q.}Tzq8}2!-pZ}4϶W'ԷR1Q%5'c0>+k#'D?U&^ݣ_Ǖ ɦC'^%yQ$\H+~F?cB7\y޽`nAI&3YV22 u::cp P$$EH{ P_ɼ TWUoI!(ӄq]<ҭO(>K%ބS¾k59)Wu?zC5l |7@s '8n+<(IW$cH>赖{ע[cq.Tg (cÇAMF3t1p'A9?xD thH0 a^=+IXЗb27Ҧhornf7 TG '{fZx Ҩ*S{C%{Xu8B< L8(.뮪ҪOSJ9ѩCD{ !> fZacAA@(זnՔW>(95EQ`>ql3c=% 4-)&WHGC6L>sz?TMcFҨF+E1m5k&>siQ8oOj)HX,W6.lTr_o^1o)Pru(8dHk‘v]>^ (S=E֨9ʋƉo|[ S2/gRnyx#<r%n VOIT?{fHi4 =_¬~ VS`wJyy+_:Foh~d;=I2|L,498}[H5ۆ'5p g3a! clgƾ/783qߏ>i"UN6]>99y"t[VZ}u2G E͗%.lo0oxEMC8zG[ ] \"bBgiTA‰U.N3v{5ih?"uֈč ɶe= úu"^$$T4k e[pvn˗VE椽]?q`Z=<z=w(s'NǿM\m1%Һt fBB$K u+ [~qi9 x@ZAl=ixJ|;@[Bd:?ߴ(Й \,l٠%eHSe0Bb=:$ŭqgPv3֖ Ȍ3 ^ sH1ȫ؊9,MREC g;'3Y.%Fޕm ??Ђ'but#Lѧ㫶dUn!Ϗ앳0:cRy kG@R2.;zc'Ca*~!oqUѕ<36umqahKKr8ɴ ^6[6v^'>םВ?/|.|i\Npޭ`c.o]߾u(\ DrۼQ9=0&]:zbHb5AU ^hsmhF $HVNB<CtJH`5N TPG ߁WyS jixp*OG l3pєTe0,>Ʀ>˘| 1 TM/ r0jS\]yQ2s IW/l9t[E} 3I$Eɳ~L+ rw:dQRRA3ï_G2|\fdzW~ Y˰#6-%WlXN7b4]zk9-3_"Ղ9lPYɦ< քO[;Qt/:Z\LxU4޾j-Y\/!㡀pLqH 9а@>A=DTK/:s! e`X7q0@3*[Y!rdtxppiROWwBy5WNдXγKrX/xlRjX0F&9԰Hi)џwrXGJC5љlR&Z'*蟮_uJVlí\/r@44=N5iǖoGFcwlfhiRtJЉs!{=Q_@AEaɜ'cŌ !K >d [D Lb8nj~I%39spݘ S\>?=fOnP cdkAs1eNgDǽ; bLzUA &sb45ֲK͂%.߽{<#eчy`U}'teX$swX.|E>\nNV={`Ć:9alQbHp0бhnk&NEX˲/_p`r|=' 7Rdkc3S~K)Bac:%c=pW|,-nŘWh5מ_g4[jrk`e.n$-H 9˒N_EtFX>f2xRjfEck.Nʃzqe[`/?!dkY{ wgDQ l%G 5")L\8R ܄KЬn4iCCx.D "8i-׊)ܲECAN3M67H(9%, _Dx ʭBB242"|?=<}ץۘM`y 0r+ggPVn(D47F戫Xl@ +Fjթ)CFEz`fV|Q =6СF6@:}N]ٓ.Pˡ`ǼϔholhCI2 w I~P.zPS/CNA/Cq.>V6뱕DFlh%2j- W+e䎻8"4F$``ԟJ>/]> ٹJ2WA]~dwqRer+y}c Ka}`[cu*4M*OS^qŲMZm9NڮEAcS\F'g$D)YB}S6joZDHM s]ڀ)V\B<@ {5] -s3;_*OxTS8ZcÔ ӗ`5iiPݘÔOwYjP]!RJD8M!Mۮ`0s:QwZy/Zp8>?<:e,tdK|ԎCB޲kΆY6ȑ2#$zrH[Ӥ_B&ZnX\"8kpσ3?*zh? !:,1v$+B=0ʴe?f]dttǏMɲA)BtFq:Rdh+so HC=:xs. ʈhdL&񰯑wh3S!hd6: oyj~f0g6=|HsTHn`m@^+TT# L|[5sEvʵHl\lP03yfꃥ Pڄ|MN 39iLxʙpLڸƸ%rv ޖ ;o<9?߿ɀtSv*4u?jK_oݻuLHp4_~Mv!"A-hZB1\y# nSמ@<\*aQPC=lE%^~<140Yqt<щF7%IܜXű,/5,X`渹"A60P3,95{ƽ hhg$3v'\[wzױ'}h']:#1aZyX/Ʉ\Dˌ;v>< 7Xb`*{ar+pD07ߵ]{As8].PFY& T≅IZ"C[bi@@{(ǜt͞TL| dN iq;$7PcM҆6ܔZf HS%kHq$~;fvoV5fd[ ˱ΒQ&c친G6r,B1ײɳ\Od A1htu_OTΟ?B]P_,x}32 4' 3> [*K:Ͻ+%:?z^'' *O* 6x)|W-KA"eYIZ H¹͚IVV-Ί{N_ <ލ4,w*HYby]3(T@Z[Zf%^IbFEkSـ'E!W6]F3q]%Bɯ;9&kNf~LUaw& uj*7AGۜX 0?娳Wn`b*lәb'j$].gvVCցcFW/Hٕ@AOKnSFYt{||lrv.jU]FU/qW#Ià<.Beh_/clD Muf*bzm|=-}׭)r[lUX"SW3>S4 ٕClR[>V 3{`x=ber2IZc5dݟ\zЭwOmffaD3Ad%npԱ譐rO$JaNټwvtB hd 5|&DȟN+C'jX 8߈[` ='tn~MH aQ^?'E2dzvC+=\˷5lojA@f1_x\Ix{n wANmW*-) YA^,6Q5,]vWnkK=0!n^1 QGd CW Ma=VnuX'tي6`/x*˗!1YUʣeלeBk$Aߩ3CpJ֮pld#qjt$j>f_}5"x8&a\St́ o7 p +Y1#(bx;<$M\/<`MMF`!s7קy:NRqmYxix(qvФ?lũ>1/Kay<2qis;ڞ%;w&WʜBU|ۖ<~k?,M5(Lkv?@HM Icj)dw&>W2||g{x A%! "ӉNL!˘s5]l7>0U@[ ()arslK9XTuq~9-ÁQut%W9B0k~y .24!w`À9jmYڳ U>-P(px!BBt+^deSfO9ERi'zY}A>V?ͅoFBDGNnyk)}]&og&yK/3˫_Tҏ)ZUHTe 9Y Ym^q#%&jPٝv zc WG`ou\ 05 }Kg^tg ۯRT`\)5u}4?r݅ZhVHENtxZzg0y>{B-$%# bgc;ad#[8MS2xBŸoX}dIM4q;` Z#)IX8gG`unvi9ca)n}-ti?2F(l"PSx7ö ļDm@