3,}9hm}*<5*a /=S6ٱCy_U PuJoYYtqw}:' @un1y:W0 pE;fϑB>-H %^{jG;׀#Ovww}3=ĮBX8_}cg9l *,zk)]> R3w=LjJǻ2̐,<#nwkҪHosvqO *hTV0 vh:@ wQh>e^;Gӹ) 8=kyQ{l7}NAWuU  zd(,X} iJlﲸv@'ʲ|l5'x*>{h,@DW} +ca' |>xg|>p|F>A=PgWc}ܷ5t7WyFmEn2,./ %}0><(CtA X54Owr/i>GP]D`}|qyc=}ERRlig{mfGpaٷ o7UUgŻpc%-sT|L+Ns/8xف}zyyY` n{oJg`{}{(K}niqi0z^pl O3+n8Ϊν9UYٽzS\ o :=j}go7S;yP>*oEVFO%7w}hB;g*NnBx VJ+uZ_L4JW@*QlQJ CH}t_p|Rywqwx4ݻkFm1vXys؀nދy<}J3wYVV4hd>*-Uwi:,P6+k@֮ 4+UN6zPwWޤٷ}#pgoZaL j÷>^w(կ%: %n3nw{Μċ|@2mљz<ن̨1kKR2&UwA|y؆<$ŧϊF׃}<)w%gw[U79!Em5y]|{ dct@0[m*{}UnY]jK3{}}swӞ L}]+!Gl#f/>W=zWʹ+ng[mܭ6m<>DB(QQl/ 2DT{ BdLv= 9mhrΓYTj׳JGt0q6Ph)S6*o|pà zS艠[;Q9<݁(lPx 5Ui.H3wk{KnXV9yCU.auFnmhK%zފO%z wܭ7<*K_J{E<7{8yj(dck>R|U^6-6XR}q<^ *w„'^hh*$KFHURRRDUwls8, (HͰ"IR@(*TP(DRR4E"BT6lH(%T ()@TRU Q@U%QH(U UbA!EPJE*--[UUR@EI!JP T QV @$)T"E)R0 EB((D*UA@A)SMPT ( $ " J)DI*R*PP(*PTIH*HJETE$A R@*JURwIEP*RP IQA]4Q%)TT(HSmJ$ PT%DRQEBEI!E" $)P D4PQJRE"R)I@(%T )H$(ITJ$@( UH(JI%P*!E*DDQ(̭YRiPVhvM L` E@L!LLF4hѡ $LLC@h dɄa0d@B@ a 4O@ɂdh44@M5M`$dF4diL"4c JIA!4L4@Ʉ L 14ѩ䞅7@Oz @<&6*xO)M2jyOOi=3SDb4bi&&0LF&d Dwefu 2M `ߘwo1>WdBr.ɲd@*ӲT|tgdwVad=h`WWgik8_%_f66eֶZNf˚>~FN*GZ#B5 @돫ٵ3c6* d1DQ9r6vK9"CfpF蘢y"!%" PyF㢁X&~EsaJFgrg@ro"v}?o_hRraR#7ȨxFBV`Q3c x97rzu.+A / _/4%G)j?譩rW w[vS;nFu+Q :mnK_D,^K8@ k$ (j\xg4'sBa<ѴjBzSYTmg*đHH,$TF# XQDUc"2( HbbF1UV "QVHI""D],AF>(J[Qd!I!BY&l2(!47#[m$FSC(A^*Oc! 6dJ!Pu1nI`i7=}SZ ii4`i`BfC 6 Q'tjl\C0ڶKffNI}m+0A.lmjt{;#Z=R{!_ٞs"G8̞öQ`v'jx軾s!=!(h|yA~ij/r}c4K;( V{%^N}u5FB5qْGꁷQT>,!/֠&d1y8m-^w`30&SuE!\̦]\(˶D=[dbNZsފjfNf_5(Whh~z|\&"A1Ui/ b 咓Y@CDZfBAx@5X( B M`wLcy#7wD "$;&}u]ȍ\f\.B$BY`/`8,D&/@ ϰ5Rq%8P~H-%v-(K5'vtzxZ0E<F?TT\WW3%H_%vYyku3,xWl<z@{z q~a6t/Ym%uվ&~K].A$Ui!7"fۿGa!_r *|Û}r^uu eRd?[q|vm&4:Fhd:2w'WD}ydk>m^ӁctɃ'\Lu4j!_6e$ tI܌QV!v"%C߷)rh9WGΤ<>> %KDhwLߡĞ!$:QecÕ,9ݬXq  hD6Ѥ9Gwu ̄G/J+E /{"CCV!~@]y6š{׳}V)gJ<3צz9Ɓzs4B;|n7=MBw6:*{Gmw~2{ܱ=utS^(< 5Jb,\qI(@e:isi^ dӒĤCǦCbhKy@է`~P2G#92&m@2:}zp^?(77f؛F3K@cbyjΦFeµJI;CՍS&1,b&y1{yCA]9N")膣pҼ3(Dww }$>x0z-j4/ b#7~36BY77Xɟ1`lNɳI~ԗ(h ~vǝs>| pkǪ~CAAB2:PZA="P=F܏{zJڬ΀&l2mh~`4d&fOHC"- H$ M]Ik۝*mc"@fȀK0`hP@4i5]SA0wy7{fe6wI*Xfy]zKʚi~k ! Н: -޴Mеb>$N}zُoNƏAoG?1;"7TM #B۪D˺93{Ȇ&^H23PzṖyC̄ z=ng*8ՙr){յIh0Ba،jLz-[q@20^Jo'ac6_e~>9.W= " + #0b {06"TTj re'2PlvI *I;Z =,!|CkIX86%W4|g58O $fOfïU+ o8*䯵p&3g+D)HP+X`|/13&!CFjxrQ7HI:3)PAҙ"ԵЋ5gC9D?%0fC;JXLЀjPy!<#U=9JOo@5rC|!{ZlLNy1Y?߻I``1 `pS E FѲ+-sBI-?&$DPR DI@EG--T)tmDUEPNm_P TF<TBT$5mKd@O>.'Z @`JPk4|"o 6@[*js}|4 ֺ5"R2-vo(z31T.>4eӃ%zUv{NJղEA=j P>$Q}zH1)`04:"La1uVd~n@o$y5յk}==Mx&S'ԉ)U3HEO6ApMHRPDd:dK>&gRX嫝ĵ$s<'k҅+ּAw/L}3aTw1cTt BR1xا<ƐDXhF\L5+<;$7G(<ME\.L`[٦ 25!|mqc)>Էj9"GdwdY&xړ05쇳ĹR4ltLqާy#d q[(ivCuT.ݝ ;k(W%]Kp`'L;ڃ*GO.34 cu g?_p dAnBs˞h/@gRЛ}@8|q Kй}?29Ao庠hHei f]` # !P M\.cn N|˜T"#Cm>$42np/GXlbIV9Σ;Uܚoc[Orn/gY{˘`. @8ɫ1l"6 = 0-y:zؿ@W{"]/^%LZwՊ|ăf"Dsא4:vDma1QN%= <Ť/sV7w>8o-e} viYJvY~NbnRSBN $ҁA 43B#Iq@QƟNƅLԗZ] @8TS1IhFmgK}(Xzӽ~K!koR~7#TU "EDZ"?/'gpEo$ U&\ 0EQ|m:gυI2g,; PjmPblsZ~ uI :J); 2Jq8ϫ 3u \ȈTx #1|ȼ=GS{>Ypr3duY2ڗq\PR04 i(>Ռ9qm@?- `ȁMu9 n\ a(u~bN+K cf][D"1sAy1I7v ބ8T+Vwa{NIu+Gsȶ{81e8w,(Dݦ'ZwQMx'Xb7Yh|B\8d2~`_)!D ѶꦎOxD̊rdҹٚ3*Y% N_eKzv~3ziT7:Ef`vjtl_c`ʁ6JwսN7짜gpS̨ B`bnSNKoXLi 'S?;{Z UKKk J>[|JdEH"# AqY^`CE_ 07k.tCa`T4t% hc&daNzf&^ګerʯAKJ,4N忽Y&]lv@w۠! 8d͜'Cu; dTN0BZ!" `Z |@N"_$d[ ExA;̄4?ds{\[9.\~ nHJJjy0ha2$@q" d[ fd+|KŁiK 3[un6 &~[xa ǹ_Vӹ<7-pǬ~&0! .Y[q-Ce9%Gf2 fX_QbQ2 6{oYSqR Di!•~vWwxBn ]IDq腞t;pLv ^-]ڌTQ6uV|]#Uzy =$*(ASH*SdL*Wi vq9, n 2wDd+.&zfxƷxCgܒͫ gtme[f_ tԙgTZVtR`#Xfخۋ%dîJK% H RdSB` U{m2I-o/%_R~E;II gR!"}ߺw">I;8b v"ZjuoIz "- jH\U+32TD#{7Z@Šd$ ]١MNJQ'y}#Ua8f4e2Q"<@ (dOV'N 0@scm( 5 BO kGSk.T_3_{¦ʤ}-A,`b[1!2潩bIG[_/R־L9gR'cbn+ zKv|kP^ݫNݨ:#;bOpEBn1ʢ۟"bW$6f"pi*QM[ bW*mM֟Ȧصۇ$9=GWx }FM=IӴWߋ; Yʎܭb+|R%=wnx7+FLi CPH$/2DM/4EA NHUv?J}GxF6F1}(FI|b*GCvypGj !Q:Ea`hXt0O"1CCpb"2,Ab@op! T (&\؄|]օ U qd;,E4tK$~ 5W㽜jܽuDD5;a^hr`D;pz"Dߐ窃f˾~|MFd:T9t^d8oLԂY)؃H`״<Ĉ2Ⱥl"I'LYЖp㳦.i&ahcpݤSw3K;CKK j@o"'mk]jLw ,ujFTV H!b$ԧtQǎߋN0$v "* A-0EAE#dY:sF|C$5ES.!$\UH2)D|يΘ뿣v?- ̥s}xm,3R2X Wa=T!0E6kQ18{O{Y!tݑg$RTW>>bmFr.jƆʱ{V:9Xؑ堡Dr {ߡ+_OjH)%@  RB )d,d,(d01`@b$(Xl0dJ@$!  Wg4 AH(g=PbI/wN:wtg|ϖFHX!"F* C0#2p>{b"FB](+˭p`u|I~OUɹY>ks87C(`E2VR3z{qk#"DH HBb(20Q2$ )#")PQPb ,AW{%@>QZ$$*Q͂]j=@7T"<)dҲ-B (@a }ECZDtĎTG2[ l*XIY}_˾i2]kߕ߅lL_ u& J B?zkZDXDǙm;ŝ-rhFmag<U- ~-'߽ʿ*6[$=r)RigIi;=_Ѝ}JYhU̷t߈]DA?Stsꎉˌ݋eàsKU=̛C&j07H82=>lwe'J?駃7x8\cêmHh , 0&PZ|PL`PO^3w*8DY?:c(^y =04 ']ןup#Y'+ =SkC97IW[$AjcpQ/>×Qs3,2邙1AR> ^t<7ˀ:A)/0ʖ0z> 5Ùv' I G$jE\rd*ՓkPe ^Ȯ3hv5R? d`Q DLep#zxC3MQեBLpɐF3H^?Ӈ[AR?TTE&+v eTWa쏛-Uch/eSE'"[޵bխcF[1+GkDpG0-FS!{1 ~UQ6 T%\ ^. ?ȼr?Yֳqm] TB"KW5M;:kZbA_Y UCSf_sP| ) r>͵G<ƚQi}(#UXpK(AmfKVS1.6l!6gH 4NtgLh|M[g6$[ntH`!рmE*`l=x'=3og#D *aFMԄth&nl.uy҄pA,Z5QKpHhHԯ4 `t! uCeyU;tW=e |]:BJ  vN+E]s*3q&zu y%J̔n @nV~j5AƜt+\zB<8=ڻ3GE.= S7z-;-ڱdOwi2o,^J!v$ v/:\ #tT@v"O?O \xW u㋆@}ιqʖ 共ͭ!lL1fvEl809*dˀn;Bѡf؃/%aӿkbgM\3mG2dmM~m_b {V@h MuΈ0:bI!ҮByX0>``-QZH_{ :+۵3iU 9x&`pFp#XyG8r)^*u(O:jgywJ!fx+͒<$]8JQEe S1'/y\y/a}Ď:(ͦ&Ad[C3UYޅA7E,UӍ +RzT`5_R$deRF", `c_݄&0̆ CC <7:e?Y@@0fFIH^Y).#'}<ӂPMnO2e7[߰H,404CѸUCeaaޕQ)>_3شd2 GgLtnrtэ"pYl.\0ƳdGFł#";|_PY  y!4;ϳ;))+nFb6rσiH9Ib=Vg_[E0>!tFc`6SV_%-Me:+ !N0U\HgJh&U6q֘/ SvG@+41]&c͒\f6&F3b ,z䱄V;C]} ~V}Z$` ZU<m~FG]/7pc4b^N)tY-$`]& 迃ȱM><ċS0:S H"،N%ǫ1{X +U1܏N!agoD_ qbE"?űvAPl#C;b<>9( ^$uoG~&9,)K8iT?fؗsTe~1P6> Jg6kl/Yd Y3>ִUѧ&[bDIt-8Է87I҅Wwu Pz4zǖ`ؿ2v7`Y<]ӌwju{ebT|/E{hfX.Q{REׂ 7ӁV*cݓz n8Ǟs,> 䙻 4.fԪBQvБ^.`(EO .΀kQo\k\ک 6g٤!3<>̖t'IyKYȗk}NwyC#Ƽy[~^cܢ;+ DwaR)p{SLlR%jgh4#ne0V?Gw^̓ezM=FbirEk7hDό;f2A̓D@T1wj:M1,!ߣdf'[3c8.e0F<>b[:|wEZ~ƗEvdF i, p#f -;yBEB EHEe"D99 OL WS@ {#_,LMt]i6I"h{]\P|wߓN.ޠϦ;x%j҇r,KQ=vOLt`Q:T:bSP] 6Ae(~!W@"{Ȋ/H.\pAMG. E\6URB"6C1$8 @6I X,DSt#۲ 97`o@c$ tm?B"(pZM``t{̻29@Y  c(oYB%S ÍdqƩG`YP" c t/I{V k#(V8 ˙tU<]ʈZt7ُ6VD2`T?FjBWzSB)%IEd,!X* C4i,bAH"T" E#,7`c$!bcJI"H -DB D-PEDApED[-qAu0M$p 4 {s/כoc͞CɕpF T),pcggڰ - -ϧ-Yh r48E,l,~Nh Jh2e>-M ΣK,WpJD8,.s:[oWm2+C`!!>tS+O;5fW$D$ddT_ PT$P+Y ~ِ1& ihQ㢧 E~}ߵSKt }7 Z<'ΒsBS[lշ)-)A6̂aI|(͓Ԥ7q}.r r 7e~79/L7_F:%=I#c~̀GO _YԔ-+n1~v0P;xURD$BG^ ]2 ^g4(;ȔFȑu:ɶ|t.}7S,S 3G}QB$CxU0עÑ5~goSA9?:;3DP``>3:l=*a p3򥙫J lTPAEt4QmF4\~cI8kj*\g!@qBXppb8L4%`)g`|@A#*scŅXQo38dUK/5 (5oÍ#ǒׄTtra`" ~0 U`US!͊&H6x)@gjB7I/u,8+* ;v]2T%wk.GϤ|q +P*2$caxwtun\[7v46{'OEz^MalX2U1,-|Ծ)?^/]{K2RPaHP] A2BExV|rR'DD6S d&= R/ P@_`7἗3%P>c}eCiZxS*(fk@@y=?]5,]7``8oijkhiL0DYs }xk l5sQ1* 6ҽ.eo`Ebn_r"+/xDnړ$$o+yZY`ϔe~\Hp@!J%$a *, %9)]Ht*n#}5%D @"mC-}'oLwZC,o8RN^BE0 4H8S;9l\fIZйsIKtasPF6f;P4ۥF?d; $6}_H@a~;͟&ɣ Є0mR$M1PsVNcN{E_: E LQQ#fIx^@]H[-=kC䱕si'n/Q/ ~ycS_=] c%,Cpc|O rXD@8K֨\m*G@_Qs 7^*c#;+#hTK891uf"d@V &gTsn` ԷաaLֿxՏgufɸ>!F%%%B\#l'hفeSݰD>G>.Ir"qtĕ! _u?GM,`+[W2vb_P(WϢpl;>?=ޟ}? ^iЪ;>lʥ\ 8xTa=' t$E$g3`$3{:gZ;2HE2 `2Թ?e=+}3kqevۏY]WW E,2qoF򍺮2Hc?R^F+`/yzV< y(yTMNȎ*멦 b I\ wEPOKH) 2!džFs!qنn$:SZP_!%N< 02{?OM,.KzzAF$FsIm7)3smW$4禱2Q7>j3H83Qi7nr]Ԑ =-=Lzd4ԆL`fNsEkŗj`{mnn=_rzLgP˥r#[ZvrS}Oۜ5Z}=TC OZޚXK\P{g={察ݔ P&QC~BzsSY45w[FZ0›rZ]`n|PhU0A"!l(w x5te{=y}z^M$E3.^W WRa Go+.l]hwvtL("E#6k"ݧoaj҇ػhF~]+x&^Ǜqy_t&&NQ,%k6 E1Ug`;p}x,;r7?HE?:ѴR@қڞv|XJfnS)@)GUbx_u_+}mɋ-#3)y"p[+(vi^T3%8TMDIEHx:A@NusnT, }86.}>@Pb$8ɗ]"56JMWYO{w.s#""dH>4f'%/S!aBb7S*5`ZuABbz&>"I@m>L:;Oh@Π"I}i-$j͔5p~c1ytAsey6o s5P2tȃ3}CFԼpc$ayu5ʋ}`do.=hkxđa"LxNɣZ~=RqITVE5Xb$aPVI'VBc"T+ "0P)bAXX + Y""A ,BJR$W] DHF*$ IB~BDp 0DRUD$p0) gFZ&!>w-GBy;'- §7R(ID.t0AEusP#|LgqZTuŬ|M)_,<-)<_&1Vm I!A;R"@+w*i:Դ̆Zle3a>E;i&PWݓ ic":;?Ų`' + m53? <יP8ל_H9 ;ü E)'ՂѡL;2 D}wky Oo`y [_]b笱DfIٴZP G!KK5}|j[-;CJ.xϩN])lΆҗhoVaIcQ?ɗ!#R%cv惯2qd_O_[{UH#@F|٪Qӗ2l +DWW>[koάt` h^If;s'e{_TpWz>(ۢ(Qp*[ݷFMC$e|>rgPpI遨m3߲r<({oCcJ}\Vj,fcA># #ȶWd>_Ok5g^XÙ<șOI#">3LAg[ |ZfZ&DJ"f! U DbW (@Wnvs2}[{~Jr1v :ǽڇ 6ȴII۫;Hr﫵,T'0kGSف̂E-8"|1NaͮG+|=B] @qJh""#$T0S`q1bhq N 7 jIR)5ŰDˌO0lo2c'ϓRt,g0k}' kmaw_A|XQB,VhC{Tba4\^@9;NԽ&p*uQY^jomeC]bPO5=+Rs׿#;;ȕ` # ޔzEh@b$9quVaB}tی]thWGȭ$B4Nk_wqWߎCl @jBjQ!jԥk9URV`BY?=U@Ue=Т49ܴ@.E"AӤW%УQa3{rU 1}&טɁK@W\@#$Dugh]!2x2ZR=DrsF;! {-dpZn|u̕z@A7xNlxuܤ%:9)*viPQorGc8.p91Y2BWnK:-@ꡇ͏Bb[g5ԸA#Wcm} ˪u_zÊ>=Fud0ބ', {==?4$ \e"&dU@/O'HF\',D tddIT5*LAUK]T`*\] [LP\PUFE!| -OW==nQZ~ŌTF$Rz D@QUb*$U"R2A@R) ( @#$`"HAE$*AdEADVEQFEC@u%T[D ]p/-ES ]TqYs(-gK: $9t$@fGgTnv?Gnx?2͗3M>\AdyLayxl a25?ca@;L6)i_ &zٓ<Nvwb{ƥ}&Ҳ4_/0rXK"Z9f#uㄪ@ ׏P³c8v[( > 0wAoWՄ2`z_i\hJZ S/lldM0!BB2" V(DTDXP!,2"E,DEQTBFH   H,QE,QQ;(|`HI%d֨ HH)猨hH ݄aT@$ PO//P@JUo=Bԓ`#:Пt i 4"3s.؀vlP3h"XA :ވlv@攣y8hQΪOd5 j F9i63;,ApEn{{zJS$+h|*R D:wB'}eW`"7|f{~ oӣ^|F~b{YTq3Z "P pن%ik@NW\\*^;\Ep'qJ .y,[y2;wR ئ@^y+;?GB$}tk&'Կ=cVPfG\w`TDc;gIo31P&!i*?&.[Qs2*wDJ]SKD&w!koe#޽YKcN>px lId}ۮcS0:xDco0-FG^łfPl#e g4ggZiEҕ:Ԏ%d)3ZAGDW@TRf\%G +?!:hjO"tKcPu:ISDNćMiLdȓmLmWs:*j)Ǭ" "WqdÍ"ԝ8k%#cO?$zY>R66:N}Px}[ri/vȆD72yżn` tb,dcXP/E9aQG_I " ( "!*U#$H <:w$e-d'>&@Ɋbw~R/}9^Ol<;`w^r;?Ѳ:.:Ԅ$I%UAH@-, E0%-i`#c (lZEjŢı"AU`Z„P,`E)JX(ԲBH) $ "Aaq( = Ґ@]}o?^˕^C|1O8bFv﬩:Gm.X%nM)ƘI殻Zeuk=ήZ`  cSMܝ@@ԣtl0$U|f"}׉ =w@Y.n?TN]gPDۆSE-Z#Ϋ>? b _Ӟ0_&Gz8~A@H*´)Z,jK-EY*QMUH(#_/I?oYDU[hPL 8 Ub  DX ""E(Ş D"`HJnvI/-^*邝ڽ,w.# Kx-{?^eݳ~e4d?{KL^b (EPX AT$1F2I!a]@X(/FUC Æ||SIU >˿} V~GJc4xEbnqr;0!e~LQ>qDZ7/йbt.#ژ:tNQJOϗ0RZgkMX2tޣp EՇib\@)9F/\__2 >rkPb|Zo_gdˡ jHvzh#GP?D 1 q86?\(>{=G;x SC_&O[X:@tc0+cף"0Hgz9oFp dYjN Hjgk|LB*OgT3=~qӥ^dJ;Ͱ.{Re} LSQc@n9u1Wm~D^z8:xQn"9^'[E=+ׁkw.)%뽥L!PI,l%'LG/ⓖr^f=W&ݞYoѥ }.oT-FD8 p~߂qcԞ-PbZ%&w?>7,"@FPQbªR*UDXЀa"b"B0#$EA H,APX =8iAB*,J(X@AFI- N@$?$AT_[ y5> WYUJ6YkI%D]$-2D/"y}覉&B7PqCYDAl)=MxPUX$pE D2"ZC>\HH$dVUEVHȌA@)P:0 ZgU/t)|T :HOY /(~>ÂHֶ({}-]gOWʹȈ';O"ZŊ|n|bim˷*m~ 87HrL*D_D RQcĮ`Ao~թv~ٳX]4G%N)9.!Pba(;s:_>yb @;H |tU1` e1Q`ҹKI0dċ" {YiňRH6Y@">rvEA 607ևm|o9Q" ${bJ*66mTyJC9'Uouؘݰ>LYe4@ún`ź;> 'O+n-N=xOl|ko*W黂"fdDjK>9H6ѮC2@N-۝ۭ\.Tm<%7I*]t%p9$.at`f:6滱܍;Q$)Ъ UmtA>eC3}k{T7SSRS@-V 0P0HTY X O3{>O/|O#Kg$#e"=tq~7h$]rvTf3$71µg\(nBҨCT*Rg#"u8w<nWsYwFWXe(|Y|ВtA\^[ hkP.ަSE|IKf6(UR ߛg'Z>}O؂#d.*+:-WYc6S5;ߑԣ"6&8[ua齬=t1c'+r2#A9Ӥ6-Uh=6P Q,A".=*ddPyAK{A{>yq&JܜKmwuM_hS[%3"C+bhX_C@0: D40]vؖϢ ',~zr6U:?~wH|aYz_)I3w&cHL 1Rm|_N6ʨ 6X #<=&Zq*Pco4XC^r}oXd,SxJ S.@@}A xh1 xN [|;8 nXDD@-v=OsU;|z"ka KEz.5_eYX0닇RvI}PCAUM`^k$cE HAI;4@BQV2!;LWiߣ3+5'@ . )l*w < #<R>?ɚt] wf^vlԞկ2?_dPP;NUٞωY|8FjZnهFsx}wD(T1>rWKϴg s;|d M\HBw>tTw\ cGt @v"0D! +"@Y` M`TiAX+Z6 d($  `*$Qb±H11 Q`,a"?d3k_%T! Lk 2>L#UDV@n$ 8YMoʸQM6͗X\|_q =;될>c6A"l,#t 3ʗ?.t6|WA.H@Ђj)U$ 0@":Xk`$"d̓tTLȨ*|DџI'{@"Ȣ`$E^|F# AEI$H#TAdY!+)3, UN]H`q f*>4p>nטTTώm&jXHGEnQWeOUE UO-wJvBBn6L@J9l5!:R @<+dOHjM{)v~ImAbdP;ѓhpόǩ{¢u. 神G(|~mib=+ɀ cE/ ab_Jj)A%J,kH.eWڪgBޙ ?~v)m_.U W* \L ( M(z& ^@ SOA#4#&~%^ᓭz C͋{W;e.p/{&8zqÏLиu6*0ihAUWJJmv4?*)`9ed/荵!2B؈"$g1FxI 󳤂; jOiwn54] o.21U):8PAKN;zIL :kLkbpl\*?B`oOAz% +;eNjԴ9W Mi,W JP F( DP,"Ha#F(5Ta F a*,"¬I%`E !PVDj DI$Pd PXM n" ETBDC&#%FCJ/-D o_ћk|>?9lxKcW">O=AZM[v逆pIY =w6F웷f4hѪ B}<* Ǐ@x3QJXj{%Az+Chehww#<}t9z!V˧T:dC1oo\&r-_T,cZ2:{oxa6t-kmVE ul^~cS Bh$YmcZ|%v!DVu6 /=Z7 GUD2MUV'|b,A~'*ZoaiQ-,I]ɘgX@*kzc>@@$`aFnZ'&9raw^@r@7iܢ{@s,r&׵huDJ}g3:9 3?5d( 0m߃#xO Rz$׽.Elb 6zUiXӮu=s7BFs?,CjV^m1 a8lvTK>' ;+(h3`zDٹ&ᇎH篪* "8Nl3!"®{`dj)#?= O?x Co;;FIؼN K^5'!/R/ߪML"#m.>cS"dQauD3cm'aHK&NYO,@@12L)tDdPCrD?yD_:8v7 fO_蝁XlM&u|0AEОhV{i#$P>QU-* ".)Bt *QbR2, b(ATPȬQ"2Q6@ږn)_1_:ߒ^W>h@k~% ⪚*iG4p^H@LIb Y P/rE?o&웰k!P$ "ldªbd#"D!$DI(dUDPF+TV[dTQxLHJ$#CM hO(b }Wz>tȌTA?5N [Y*H"@OS|$@O ({(*1L1B@^ ".z|/ϾO D}6lyn"$TNd$T>gYV),+ 00X"$ *X0HEDT",I#$F)Da"2b + "$! By}"IDUoeB!mEVHV/@F+=mY֚~~ecomPyq} 8㴵 UŘV.)- xl\_ۦ0"أ3ckUgSݥ ﲑ>J_Ds7J aLAw1`k2SSaq:JStpCA2}[=蜠bJ:!]l!Qm}u揝  '8nWvzySzo haRd XA*( "+" `EdY%8S..%H|wfk,+2X"/u^^rU~3g.- ZCq g× y'i#~J=G?Yxht6Oqk`(nSo~A}r@_<6!?@ֵ0k҆" 펋,jJqzMi h 2"]p͐?O՜ş?F=LMb|AHobG{"uFi䟈g8|'/DkȂ!be $@Omvtn\2ΐV.˙; y9$f7$@o"@1ct` VUursN=l77ܹg$N,:ܲNm%L>E+v*_X!bV్+-jKK>!qÐMn [5,PRNp%º(^ìTD아M __cC*{}Izu1rWlaR"M]u 9 9k߃3~^ڛܹfmjf*":ŠZ$s^5 sw D{|=,p2((P_0R"}| Lp q-hSE6CL=SerL!;PM4&eylHtL:fD@M 2贽(*fٕW-8}%˺eOWmo1_HDYs`K-\5йZ9-;lq)>> ~ %"n (AZ oDq0_adQ>lDtqVGCO@ڂ|. eZ$ Ш ̐PvJ?d ڽQyODDǗsAeLGPy*,;޽+b _!a݀uhdFfG ɡsE2PW>"dYE3maU1xؚ-}3Y|@;Lɏ}+mA!K;bKȮ][#ldGB2a[nx$[԰gj꺻*gbg*.tM j)`)TOh>L^z/ڀ`Y_P=TnvU셇KIتQ(};گ>%G+jU~~Q.Q :%*I g IgS}6/>q[->яd$ow)j)׏Ɉ574߻՟[Z}ގ 'P uI# |QRT@ӌdԈn*@5!"H]I\4X2%fF `ЙPnM@%N[3t8 !'L,fA8 Cͭ% Dl[yƙl^ }O/t@ qCh 0IAxRȗD.Ɂ] `RBE$Y,g>oykBrf 'SAK-@\tKD_D**.RpԪ UE#$)YMCL!ˍ}V@DE$B@C VC2"SP PL@1䄨$DEM)]Li\uRLq(rQ2`_*2 "M%o + nH(vڶQFWeF@ A?7#AAZqu+|ܴ}L+bP{3|.}>l1PjE  0KMATwEg/qD6N*R޲CYy$S眉Ҁ0bQbUF?[:ۮUEd!,3oj^d,p6Ce؎l(ZG[4{g.3-]ܧFAhl\lat팈8eqx^*`1Be2HV*& T,z'ō#CZ͑W?~GsTS DI*@ 'ֲcTD0 tҝt򼿔t˭qPA14 ̈nO_{U2MLgf)}O'$3+'}O\&q̋( T*5ؙ]H"罬̒NÖ6#80@!JZ~A Id^17=+c.<֑b.r0ЧL6V]G3`һVLʭ֦޿v`w<-؄ >m/-Q)toAP3Sw,~~c#P|1ȷ8 ~~n|X|8]t4q20w-r|^@L <3.ԉ!G1)n77ߨqS=* o >=DX) ,<]r3HTWt8Pd>u6}=E__Q 0㤯Q?PP) l7hZN LΟ;  f@$b9yݠ]Д F~$ZI0JʄP@L%ݺag<9]޲ ߑY,dlykеHĄg0N06e7k;ͯOV8px]>kkTR@MD>)hAx*|5䲛a}⒒AB1)uY$ಪ("*B1!1e2F΅DȈÒPͫbdZbx2ovUXX/I* pGl 0 i:1?rKg=FCߔO!=MfȈ)!fGYO"AS/}(v}7]a@"HsrBAA@ @DEB* A!c THB,R(P @"h7K*&&= v6hw!c 0PA},mk2?6!B*lmuznABBbXcvShpȊ $糂D}SE@fQ`2 /ֳ[:Dp,s9p~Ȁo"濻S^ؕ>U3M.Q«\q:bK0F;:><<lr6hs6z~v`U""n0@Y S pD Q( ̇ގ*JYM8` "ȤZ/LftzWޑlGOuԑcd'Y~yN,?߃y\Nrjxh `3$&MoO _95_"p+o೫>0N9 UJ` jZMvog+46ilkoaM )~p(IA1 T~~<m4/ .[쎔r-C#|%jt峵o£>:Rviˍ>0vnյcqDqqt͒{>|V/~kkSp5J-T `KAX9`j?ȷ 0wR {]}A{'E}w;OM L+cP9FmIp]z׿lV0" 3ۚGȌ"HAJ WCp>>~WQ \֛qIteх0RdA7ýxT @g֞:+Z@](ЃY#R_W\wEe[@)Ô ] ={:5wM^{VL!Å r F( $Do:&EEDdudFdR2 V1EmLtTD.@rbeDDIj19Qr8dVϾB%D[V/s<,^I+]CzWwrPa/Jfr@aNnM¸IB{UIV![K@d컽_Ҧzjid>Cs ?8Fv6WeBGq{DD RdXXgT_/肝 F÷4wMNV$IȩTA&2!`0EEF "'BI!鴱IQYQ`ϊ .?fF &\E=Ŗ3ilܫU|5ᱻNp^AFAcB,@I {u T@o`#B@aPXKbc%a'kY!RNi9 2D5#& sgHb@Q(h$  pXEEaY M0;w4Tr)pa"hptO¼\pVAm v䪹TUYnz420$%߱UH$n9u4cw8M2W&3()b b}d݂@D *嬮`>eP/gpĄБV?p!GV٘LR}2߹bgYA1=2j&[n:! M!\B$) (:t2"+ޯgxW&v=34[9ƄD@szm]OcV+ЊQ1$@XX $$ET`Ń`(B2 $E Ȥbb X(0X+#"#V0PI( dV,Bgp̆& qȌ%Axt3 H,2dfc(D0HܺՋhAO0]buz 2<*^k?^GOΓ@Nw3=Uq"w[[n3nQkϵzOLg筓+Jк_j}mD h8wDhnZ퀥fP+jfbAU!$-& "`B EXHE UH"*I"(H0#a0X`*c"EJQ`%E""1)Y"$UdXX V-'v|HE~߃` j o>@CCVU4H|A(H)P *pPץ62@4$ (%V K[#%3T}.p(MB˪c_+ ?6b'_|nXU]wIFV^f5H 썻's~c{Vd,X.%n7,\̊Y4RFP9̢f@_s o#u U YOP-0.َٺ(Sp>oۖ0JU@]Vt>`jÙS ;?wF2e0A0F@ ]݁<PYV¤ToR,d`eUY Xg@C(i;*JnnoI]E򢔁/͈Y='YYtTT+ς:m-R#c^P|13oU*Ο4 G\dVŹB!wlLZWvސҟ?Nȃp~E,C|Ҩ !n_D K\Yͼ4jEg"wkH`N4h^-6&KEY%}tCq NLf$p D]#( ko*jgl1輬>YPY992 )h"fq|15d<Qq{b595wBVHawJ mYvzl% B˜Q@i 3eK{G4xd~#hZk S'2֣-Kן&B”f@\j]oݽ(ϋ\>ˆ Et^HԁbhOlJ&=@EHK. kҐA/` v,C_q٥hm_7ģVa̟xPP=.j^dQ (dKE7_dƨ-Ea['˛y\AJk(DEqrܢ8*{ɟ͂ Db[T1w.Q# 9crKg>WhYo'~u ҉Eea:9cE9wmMT@}^` bV(^i ՉN<ѥڧ8Q'jsr}f'SD3mch%ըa7%˔vLNg>UƇ9tAih;8 D X: *5W&ƞwV ß'[_;6K'Ɵ[3iA1׫K˫w Dw2:g?줩4]+5>3 i=iS*SME;B'0I}}39ҫ+&Q+bG &W?Oi ֨W[S{Wlp̺S5uqÌ>u/&̞n6җJƤ[ݘq# xE\|/0T?.Mr|'ɻDC(([3 @jߗ0^6˰(QƾS%hPpc"|att Vw;~#t]~,>@0d e_j0G!FLh'v# ?N b$tEV1V1IHc" J릒nN^ rfP{?hz=mU}w$a/!k2nȌl386I7EK>15$M઴_|]^SsSSP>lk='-nT6e[IJE,Id"0FAH 'Pc3.$R, T*D@X 1$Y 1Ȱ($$H`A#@I%E@$Eh/Ik!"JQ|fw=ws40aΦ$rV$FPidx稀G qt3;U~yÂ@82"udFQz]6Hj "*"|+_T&2`7J녃%G-nə gTao71~3ySgq]aU?579yi!Gjf4'`ooNRp~zw霌$̌`6AQ DHIEdA$aD(;s}o97i;8k{=Jr&&"Bk NtK"H( ulK7P[4~t_05,uoSk+vb cx!hRn[]ۆ16[sIƁD܀ )Ĉ9+a!4u7mFfiK#YmKEu!2t'?a3Glg?H_#N]>P!\ { $8{0?B6|.{%Z]̓gN\c?#)BYAC$]pYQQ,M|Z6җ,LSM0LKuHz%{zoT_n̓/[~yELQ)iE7V\ 9LҰcHL8n}p=鲒RFx2BӿKrI#"f2Lړ*HY00 ,o׈;h=x_W<*)cnc^&!ncw#d"?*.ׇucT~7,DtfQ1UtbX&zLo]Z*`2ZefȠz  e![" n/NyNyu@ @%h"! MXɧYOmҗXYcM4nnIhŇaGtO4mK)-F9np;._l 6Gop@45֕!i)! `tP H).$1*HRv!Y16mV͋!_क6t6~û\tFFE̪T"5{{?{x6z[{'=ÒE2%iMF466$T+_ܿ|L] fF+ A#<kA9 5M"A5Cvzs;rc-k7WnMvy^@j荗YQWJ L}Nom"՚;yflj\,$Ã{LYp5R ?[,fTe ل[4B~{6N*TlURmsNtț4=?t7X}%魑 itltyI4myi$HpQݪ}A(P8t06J1 J).c袉ʱRVG;L^ckH)@+Ƣ $x(`Ƅ1 m :Ճy.5$dJ!<x ɦ|/9^G;0`!`U:|'yӻsQ.񃷬`C귐C :mN 5 *s^ߞG@?(XF I!I$eR%6Kߧ.`n"iб>A83"?aydž=ߌ[vmygS-7aH"?묥4Dɂ""k$bA""0 YcRBz\<ܽ7p_ӅC/_ ۋ+дuā= 9, V:4(,ETTU 3'cK;V~&ے{WP]*P.9.}EE/k>\,eOІ =tx'1B[<>'ksJ k5gmvҳC_SLFQ7g\;P['I>X@Th8jW'A||K y>'勃SIrznSX&k`ʫ %j%Mw;̗?_ Xqa 890yV@S"/=R* H#" 0 ɀ]*+QI_ >t/z>ǒhК5 "`ԣ[TdX٫*X QJ(Z6 `V,X= ]BT  "@`iU*dF! T !$%ǧh[커Sr.ɤDi4ǎ^[WF@RNۡ}\>.R*uaj9rɷ?5^0ocq{meu||Ŭy$*iv s]w0R/1-iu(.tze?&Mb…{Dzm  BX-YlkЙv>y'^ p|^^ ȍh\qzHy{g" = qePMWl+]D}d wWk9 姀e"Qq"pT/ wlI8bN?;>ܓY*l r:f> v=\uY $ KEYSyt[H0Z4fVǻ'4-ܢQ$mgaޗQ=C .%Z&4-4 ل#,P,D+jT5U5p&VZYu(X+ ,: xP3UgT`w;'`9 8r\%n&DUk֮]oR_jF#P -J$֒2 '\*m$_>(Jm?هΔ͎]n,PƯ$&0i*f}ޡzr ŋ^ӷ_;C'ț-H4_|uv8ta핌'(9WGwJ;lGU~>ne\FR 3إ )y/+N6LyLAXg'tQ.YC /_f>ei+t ^R5"8NѮW3E}zU[p^&,2_4$Iw`%U=F.t"$RC(-lGh5(ϒ]73Ap+' u5܊ȏ<u4jox7EKZ(^Q J"3\xGt}~M+1,2]iN-?mR$o{ϥ|o]zBސ kv3NSHFc3\pT cGmz|('i Bh'h9""|>*jQFYiQM`%նTa] $  оRhy^:HAHDdJBU`A` iFeAP. " W"o4Bn#vPf2 HIrIH1XH);TO? a,S%n|IUIѦ@??Eh `aIάe'g2*D 9WDM7ɣoK]ft& p{7B@!|* cYznDyl4&%lm%UP@$%n9.'{kKsΞZ9HVˣed$1̈0C@;K]C@lx)ߡvwǪ۪@t(ŝ mm,nZ^oE= |{*H(϶YΠMc ?K2j74^?GOSO<\[]]M$ A@E9x#SE&pT"@HQYEd@A85-')- #LQ^ zC`J( ۀԂMd|hC!9%Hx,PƽHj-]oxx MVl^[>?UF2m rG+pA;O2jKY:ЯD">(%ИDx5~gyJ)0/ZɳM/ȟ!~L#0ܧ3\"X8I>JjT3Vp<klК2XVKD7bhg.7h󑍮_& ヿ`E64C>Y&D@ԑřsU@fQ[=Hȟ$Y.C6,;,P,!܂?f'vbՁWtt5e4op tTGV~'l,#Mx"KW1JkuQJS|%5B Y.}~:#:s*uܭbz(n :PzugPN;r~TkSׅUxDwm{pz~hBgm瞱?$@nao;5}.ʞoV>4Swvy=wNKk̈<],Z|07!ը,u\tv@)DTZ؇"(ڝ 0(Ä-#@VuRLP$q7`&Zrf S0CqߘG8|[E^si%5LP~֊1^W=lt= TJC`bDP}ityAm7yR%xC;wC*ʾX`b4E ٺ9J `7ܢ4vC;,&AY.q\Nϗ5ܜx>[H٫{)0eYghOG} Mi=,2$8`! Kp3@ԗxvRd4@+=<6ܽr<&JH\*hvx4E5tns|USqd<l!ӹ}ci"@#z݌$e:b^֔cFsJI]NEhpZGa&<8ɕs%enr6ç+yY%R==$zpTDTfIɻ_߽4=MoLYlGlx;ۍh%ʼn^S,BJMeAzbqI涹ݏ2‘$ߟ5,WqZ=3kj5dkiC1' )~qXV<^kX`a0a2AB>'Zk͜;GkUQwJҹTW>}nqֶu^#ϐA;~N*i?&g)ǯw+AMzĆ{ :o_k$܉'\&)'oސU=4,D%,[,g_?%(*&Qo{}kb{D0l>'ٶh{Eŝf/M%1י.9'5~|PSAE\քjN_ 8~zFt:|e6QwG`Tnm[|Lވ{5V{ PZDS'> gND0*c^{W:7a c#P2+I.@ zfIbta ]X)934glq1ED X2jKj_6AB "7rsg덖j;nRzbEzFD0/b=@ˠ""/+ݤ,xF8`1Tɏ q̼V}[st<_V.#~ @.#&Wb$|A!٘r𻜞@ ):- V?ȲJFo%(W3E"Ŭ-4cЯyxdO "׸Y>Eex#V "e(k/8~eh#Ux)j o~UKrQ U`v*V38v,ᐤJel"t+8ˎe|#3B92X,DewVf MB 1Q 6QRHC;G L P2,o'_eQ:Oa!3r?óų>wfZaE =G* V<@ &x/H`+`70w|w߅*udU 4$$F7wl?#/~?Ej슋 pT^-D4랦7禢0SĎK{=wG5sh2f@2/S@\>0MFY¾1m} EVxZWV78[8-0nL)\X#TQXh34$  hts}g9 y|Fgӥ!υh%9z@>o2 )naD"F6&@XZolqNK ǫ2ɓ|;sF\jc-EǪ ^ F ,.,6p _}y8Xa}hD'f|Y߳ę &ko<-' xI&\LP y< 08P[`ܹJ|e>2KBS1-S$0\{Gl%@{3K̷*N8:w͏8';beDKs5ܢEwWC;p+|.ƨZ6FµjVq Cy4؀@KZGt1c~TyZzT#G8!T>]_-񜟰%3 Y_S^/y968skÃw BaAL0Q{CH,T>'FXMd(U7ͽ,ve"Tjƙ`Ea3P))Mw0{̐T4Qrg"5u N*T'%谻T@tZE+mH(y:+隈.̓ܶNɽkC*ǿ4΢I`K 3ёIbwCK-D^. ۸bݣnHH| t:?|ېfd9=qœ~fu5!kI¶#Y9_wqXLЩ[{(XҶ|dXYd'.6)ZmE4*=*H2 _3? QqHL?k"# hp1RT3GE8byj yB+Re|\541<آʏKw?ܝ+AȴhV (MywFf{ة]eF#W:y1)Id ae 驻q# _r #|7Z`;2λaz}7Qn $uu}vRX` %!1qK^¤ٍ.)v~F9[ܷ{w' dMQ_?n񰊏Y\^!Z '%>IgaKKIXq~軃ĭ")j*iܖ5UG [#i<'*9B L x;D>ԡt%K09:0qY eti_w@K L {?ZhGw1K銿i{Gx*gɶY|hgbr MSxKN:; "Fr weY|#J~%,)^u'e^(0z-ϫT L'TC5" qYx|?InUcB5[uGSK6EƮ'XKa?E;{~DoW50 DN c\yM/*2d"XZ醻:C6h/+ul3w,?9t6K.U̇gEw5 ]>|@$'Qcy5i 5FgEk|J?xJ1Izi5ݷq9wj-"{v}_X c|5:R8E[ۜB:cҚCBiӫzeFC57áfο^<117"Oub1!sܹ5 N>~wFD_'.ЩnM!q`)-ɠv<ˊ`͑F .#.V?!er Tzep<$};Ruim~|Hm޺Ks[FB9Whhwl$u)Tz70!-`_<:f0xΒ9lrYzFĻ۳ov0p P)ff2t0릒dY4ިC =6xद֭CfM]t".c>_t.^~:T+FrDdruk5G.`.$^8Z:`:1An \Y@ ~\™9t0W"SM`|<&~)@V KPx}P[.L٫ߐF<11"9P_t6SB{li dMP7I4K$BcQ+*T B#xJF"Œ1~31 4;vXDFY8 $fD]3/ :zm.^*,n;Wg:hW!ꇼ7>-55~+ڝ9=ń鮥m]"@= F2$(/66>*~}\0dF @DcPJi: GW8p`RiI&V+!+ R,+$:ADQdQYT"^^no aeC⠂f D VZŻ]E8O_5nnCoN(dA5L&AupL%J.Ts2~!f==ޟXhS5,*Hx)hfM37TcV[aN;3Ztf  02PQx]1톁n{V_Z:P}OEQGb$Xm'Ĥ|Sl}$r=VϷZi/֐q(3Mֹ6=/.^s6 &3'Zъ>DJ㙽Ok'LդyvCڞ}^8hP[&+*SõfUk1dzJ 5(|m'Ck"Hֻ7L Q{\˔Kba]9nyAζ3Q/>OHjAt@%}!ni5 鐽?b &OgRb\1xFI;'Fɓ (Q?M$ qjջ5X[-)\L8^\ b\l֜AaYcu[RE 9PT}EPe/ZzpfWo}pס^s4"E+wmJ(fRUk+u4O E%(?{bH s86gྎש>NH0is4̍?:TEcOK;;A> KC/,&kam*p97imOG"z\kQ~)ėbkq˽_]HW=-yIH'Yٞ2ѕg4b8d+{ RR#JO@ ]U'!EUF I!$z^i('fG)M^`Wx4z~z/oߥ7yY{48*Y>Iշ<…MD\V6C_4l~Rr9O#ESG"nj; eMAofr_s2 ڍ&pDʋcw䅨>,2ɏzj+cv KWqY'5PeE2whHEv{0޿gX%PtbD10k|,'Ϟ^ֲ^n v 70_e^lg?}X5HP@힓j@3`ϣvw*=Ѻ˂@b}H˪BF@d'zZ7+zx:APX)R 4Y"@cUXQ`OlQg,P2 0FD*~/Φ~N.y-jٮ[P]#*cFMXASIMDæoX^Dxlt?Ӵe1u̥&`O^k ɛ3deD` u;/둓uts݈NuF>zpnm J"DDA@(0c"DaaD@|)_aa|[,]|840̃ @ YsP=Dq!]4L!%3LLwN?\w>B׫p_xw%A N:\Th9ȇ^b̓C=B|x_H! @RJJTfd{'mvfO֧\?~ 9`*kdbRm\[pqLP3Yl0P6eEQ@R̵!iČx],뤓|>g{Zܰ 8B  Xو fDs$ 1 qQ~D "MD1N 2.2XbՂXCʄ5+2H`ti$ u (DU.Ȁ{)7= "֔:*. 6jcG!Rc}ͤJC$(!Q# _BANVg!"Y K|pQz}Doj͸rIm^eEP$ޡ6O6 [X`hJ`(TGu *&߶}K;3P&kS"@x| }󴜔Cup@U =Ge"ATDPqO &)Atb0$_9\WuWj|QB"iXV~sTH@C h7A UWgߕKi@gnOh'bt:*@QUPe]Gש'DYWt5u"x?!$$f^vB%iS2CFÿ@R&Ņ6W"TRɜ'޳`.f(/XzʭJ$oU@(%(+V":yAePJihMAez]pݾ4#GCgD0q 0" -۠Lt T!:ˬٽϤVS~d\2&5pcVKuaybB_$Wd/5 =[%`DX{7Bvg=uQz .!CwI7a'_Iu;{Lq9|;L=li+$N7<̔IQcvt"۹ۄHw=[_4tsFMJ҄-#IFiJ3Lͩ'Ub7 >-Iy0mcjOb\C2(2hsi";"垴wOLg[#j(PL} D .#K ʍ;m>_Ne;v:FW鈮Z:( U(`Pdȣvɩy/,ϐRJIg:9{fH{Hӓ~zkOї5xvķ\XP>!,4F͒ [J݂֞qpsrra*+63mx_ϲv Lj7؄3T6l#f]!A2١ߧ=kϋmpYɵ!Ϟ{ܠ-C5?mӎkIv;2"2~o4H=ѭx4o0ݸi<ǶC5Fkٽr+<ڟj̕>)nB=^S`P6w~McWvN[is < Wok:y kDn7w'I6۽SmDz7L;|n|٬k G <}snfWB,ptFQ{؜Z>uX٠\~v\Ɛ : m㷷ɍ^<%- % $Do큓\et@:D v.˭2/Ɇj Vc!|A`a\yVNw = wSk7)Z;(|[y D zpm>d !DBf"djYo]̀mœL;دSqA4tdDfM\cdh%vmM&pՄ@)'I!MCyAeP/>T3A,d󵧍=yқiw ;Mp rt-]-VwQl94x #Vx>#ʆ'1xSLu:VA a\zhA>aP9vo&O~gkȈg.7w=ڿjlzHI0K)Y2;~3F75sǓl,ѕ,iN֏X5m[]V6hDI!?g9I4p=/?pOXc6/%0&L#:-?|7u~蓲8e@]l[hS`iv-̴)Oه}}$||x(pL#'gٗzw>NG?=5gՕA.MT]_#̵Q8 %H%BJ֭$`0l=ϿBgvw͵Z0I+(vp)U+#pݹo~/w֖:W{޵v:8*@ OnDew^gc90oҊ+sd|ܵeud"  klg9e@Ћ-sNX J YLN7$=] .1m-vmfepܰ1)s-4W)Q GD y/$DL 6/]߅ueX7NmՖt Aup4U@Dh[适U S~ԀhBBEQ* 5ߴWofs}Î_lv3Gqv̩<ݿ\S?, ᖱH2 ( $)"V/[tAXaeh́={J9F-8:ͽTTAae 65M(>χv>ո6^4˯h& !}FvrmzmoC{) U*w;QgSkts) 8q0 Km{p R6a!)YXfAOF5CBnq[uwpƽ1S;qsj.xG=sr̨YB:IȃtcKv!̊-;ͮu5gдwts(Cs :$'`X|JOP]A{G+:Gye'`GDDih@pF,RNo+z%~Ъmߒ;\Zf<%k8 M|Gq_01K;DMSBfM[ҎI5^ 茻k~2E+F3uHP}_7{;3>J9 n xÓhzc't 8y4!SXIb4BMSG&|v 5"W˥l(5#oV6գ&.e ;CaNJ|̞oc+nc ^)&OluiOww)iݪ]ViΝ%զռ "':ugG]\ިb+6p􇫈u3ŔntݠZ~_*.QZt;+x->=tv̐^?Cvwvn.~{[q>0]5@y̓?!=}n4;#p/Ŧ~WBhXk{įBIx84p 2^ V4l,턲7nQzY<Ix4 "*)[HbΔJ%6=Qb2Wmi;I %jn!'/lHĐLjMV5roY,X*ZnYp5c+D&{QZrBNOLge-|~WQȠb+ԏl v}~ĆjڬwޜMEm4oB״qR7.VXU:Y^b[૨;[?6[oQLnRAU /,IC3ɮ6:v+Y*[Mo lpzp gw/FlȻZc8YٯE`1{,۬܍8>VqJ HoP1f3\X_FYe'dz/ 0l2k>KlRM<岷sBԹro!yNm ZNX^$xV0Ida߉8 d+i4|O\3\ b/iGH-JT -c Vrcz7$8.}_D.eQ !.O^>+!&FYuK5 (IdZ2BhOEQdžJv1x<+,!]dʜ=w{5dŽ‹~9=TXckk)_d|3t"םKB8)2N0|׋2=X(o2Qe}Kl/?U" b\1ʢleآ]ԓ*ZUqmem<"ԮÍVRܦWt+2Yo}n/v9l{n. 0$3Da[ہ5.oj\ĭS17.C"VklX{A^y۲`(!`EYs(n9|,1Zj)ق%fk8v2gGSHI)%kZQ]f`٭ " Tm2~sj%Ie 6ZiLE۞Wq)ti**Sv6JAK-oz.u{؎p'&,F"" C" ` ЃAʇt%^,"aI_N3u Q8;|RM`>Z<-^HFN.T xnz>GxƔU*=wrAs5LG-myT}8qGݤ)%[[A)Qڑ5_;AcŶdBffmf,osvPi]mQUQv$@M8_o  [m@,WfUK⧲CZ;:){'q5A"'-8gg8mt3>>4;5 :JѸV_@m<<此H0ӓvGQfLxmRl7+݁5₵h[V).1X3Pࠀ[;l]׻ZG*Y$3IA-9ˡk` c#P y`h垮J!M̷ߗ(N,v[7rzVanXۛ4Xiyw&uϚZrE3dXgsb5W0(+04$pts?]͠BE5ex:ܹc|aW\+K+ͮݼ;J3fS իR7| =pM}SDvLG e<爁5'ZxPg/"!%9Vfs# K)%M+bZK@󇊸B!%L-,a;=c,4vUpSM?y,,ȤqՂ⁣2ض#k6XVp& @'Rkկ}lp vsAz<}w (Jyv/cRح#8_jl`[fu{4n`%4n(Z#.~/Q$SO;KdRzl'lu,-PQNf$ws.N!G AB Fr LX0,l\R7OFgm`ذkgS:&ҵͥJ±YڢW6yF< IQ8foz09t͖WbtFv-!Gb#X}\dW\|ԍLnYDi4-q9B3Eo'fQ~>[ - 2w$`-fb`Њ 7BB Ws`ǔoU+mXČ&tHcX6Xַ.}uUm %0 `TxVƜBQF;%mtW1ȳflk13.zCpi x|W!f p *c7a'4+ᛙ8,%7Ǔ\,d7>iޔʹDNv͸p<]-|A+ǘsF+ Cwgѕij mVC )AZswrq  % {eF7?.v82)%;v]Z'C+53{E..KEma ά8*hcЅir7}[N5B\aiIm7y>HѕⰱW.xDf#C-bCrEmfj 78IÁ|B 2!NvMS!wux/{2;PUN[uӓ~n^gDn D?zw;-qtq1Zwd.#[&_;6MR,]ߧÜrպ Xw #q' 2'X^z6E _ HÊŬTr 4V5UQeKX@7m #Y17~@T}|N]lV2EQ/2{y^w܆+j!ҴR3Sd_o?us=1TU\Iɹx8G+x60l&m(iuǷhH j5GMtgn|\Y}3g$ŶeG 5Mť1Wb۪vlYm.w\v:nQߧX7{٢[6?1($m)pOkl\8zB#o$DpJ^f^+މ/!a\^ :;!l ^' W6xp.e 0ŃfRX29u`Lujiu,sڠ7‘X]cqaeáWk )xs Q+ڴig_a1#X1_ !Q;IgW!=6qp) SOfYkj;CHɢ0|ޏ^VK _R+ew j/Bz;Ztxn{UǑGhWlI9zqOU@ lbab]!Y͡;<1r"+e} ߳0fVJѤ :ͫtkujZouh( I7zw:Dg+kt+vs9.a\y+[fݹ4] Cʄ^+;a+/ڈxּnlC kNΉ ֔'WkEMҢ :K_ardyB9 #4_;1Xܼw ory.3tVUkVe/xg\`, dž;e.jdg!~6ƎT3rc}.ƯǢV-cΉr=ag@73.G_ev\'+?ivR?RQJe5Dƭ66L/j3-d v i] s<9V{j^L`b@ pG<qm6I-%PdcI DvY f٫71Uy/lmuDo;P//opvLJCP<4\珌0riDڈ}^FmK![07ٮ·ɓAq8V+B3(+.I,YhƌA SbKB[J@G)CUPKe كKhH[u2P At5(F9T6 7Td,s UTq\YxДFk(dʌY{Np8iUËo|9\-bL7TR2]cVk(^Gۇ-Kkψ. \W9f0on`]t ( 8YҦ$aqFt= 'CۂݨKavC* )Ml[[`3E7KU;ƈi~+yVG l1Axm[cfA&й՘,[HTmTs"o;g_+"*tNcJ˛hԁQ@^c3^mN ;DpGb"e,0AVe2Zvr_ ׀ `e{֧) bsr%h-lΐDrkޚv52Vm`ga|5+ƾ,/% 84($\m}-IHO/%ί?H~a( <9wyZ .㿫Qj:Ze ɡiD3DxHBo^2vBKBlm8t6y%K-]^2^-XThFgm#N77lL&Ȳ[)[fbReYDcv^< lN+ם#%{!mT,BYR5M= եL$IS2; sG<^DzGU&əEm5yצ@.64ơb!Yzm p۶i\6? ypa͒bTلZ0hX<]  ˡݑ^v2e,P^l0fnjdb '37} (e. A-üTɞnĈM)hx3mU؎L>#0-qu) mZ!fȳ *~| Uu {;l1.eLg)D=PIrgY(AIK/ڔc Vb1uY5{u+8NkT6" ID&iG%A7OQMTsZiFS4Z$us Ԍ6,]=Bv@V\0urjZ7iZ 0EOhnC==6:FzFl`᎜sUG#鬄8p}LEVBhOzC<%dE^_q 4yeϓj ״"حOEG+,5Ėۑ2.șgzfA:*ںz9 ϩ):p #Oyf[7~եxf #=;χ{%K;*CʪE55 dsdV т3))~Mn=[f*cT2wȱ9hQ)( lÆIu2j4*6*-+9}Z3͜Nrnc0Mmڰ)3XȄ6FX̪Xv 嫦;{"{V`*ӗfkMc o0ξGUcݍTtmL] m1ifWǒW,-r”Mz*%C%yuS2pXFP5+bы{6mos2_T9e'}f\[Drv;^@U8c:G{=ۥIG|yHxR(HE *E@4ȲA"$>rqn\w=CWm"Ns٦ܐ# ast!N Xc^s@tq70F' _.k.]K>iovrV)mk+d.}Z@ =["6 UK`ck2jеF‡sqxgNkd #g'a2mns,!l),P0|KNTe7 4h4HXyRJ$-QHL8ru2_Pl+tWwtWCG8:5z-MH F읞ƽ#>ygUS^IFSauOP3CBRuo R^x>Vڶdc?rw-ߵPqK#;w2D h_N x_tl=uȉJU45v7S TmBF1Jx`O33D_Nm]uU蠔D'Ѹw2ٸVm]t+G6aT($"h4T\aKChE\3+(5&&4 tVP8=]cB3Q+™)<*J]+;q-ZDf]u љ](jUė m#&1Õ--hg4\f0fLB/(;DF`yM22~YJpri2Nu idTc@z11ZXgevwh+rmS]20aheUê>ywMCE%]#nV߮Tp^'c}1MKŒ:YKPmmw,m. }\ܭFr)vTY Ȭvƌc½}-8CN'^ZЫi&`'W?1zAnL"qLI.qt BT0$׷snl1'5KöT&i(amA,oku}}rnYή~6Y}܇=M֡CnX48FKgjL@CՀ vġ4T \ %8GD%(r-i cSgmi}% p=<! Dk`Lt@ YɡD5۵)%7fָ_tsFj+#)KpP6_tK QCnFVݲ_9~W ~8fn9WlO.L~ϟ˦UӸ Jjk@@Klh.IuUU[m.󂇱<̹KBnb9| #YkZ؍l1ybu,ԚJrfx C\+9d<c ҬIT8s4QYfTN=\kqH>+w:eIJ+C.{ OfB#{ y!wpz|ӴH7`P,~a y-uvX*<ÿrg6m%5O=3ZxTL5]!(&b9t4Y&`8᥯Yr4'溲3nu2s]Bӱy"`ND!hLP@*ȊM>~|L;'~_ʩYL{/򻾏_}~3)a+V"(Q&.M|Uk%LC1 ?)&/YgO rzCC):E:vjl]#4/;n'2<*q. 4x4d_`G]c K#PvU&G .3?N:4c/TvQ8ͨM%!Ы JǙ>U[?vV`^L~q<.v*m;QW3EumZMg?ވbrgːE4VATlxi"ķ.Evw+ ^Ug܆}7M˟TBm9Co߮zGG&"'@]ĿtR{(ZFl}|TC4;{dQ?JKt,'DʮN8q_<9atܪᨂ_*ҨP 'KD +cmrN+My_^ܑB"E _*> e..9u=KH\0Yz|zJEpc}cGqze,aRZԌA#\qqOǶA fUJS^WMq][<]VGݒQReyLDU a1" ,@~2?G :er+ |2؉Ch1$`}爚G&Xoax6:.T8 zsjl844D)XEs!:eLSʆ>튙vY&X=RTbk09LE%R`)iVf\M۔$Sഴxq%ZW0CZ,>H?k8N(dffjR3?񞢺89{ZOW`'*XY0<]4FZ|~HH3am u^ oӪK8n';-pvqk 6YT.z~{~B#7F:͙;ނ8)>/]G{N׹xICA=|j2HI 8 ETF1b A ȳꒌ0|/`] KdÚK"Ȋb({Cc$!~_F2rGk4c{ 3mL $ Gu r[=߾B];8x\{\DN~ȬdAE]gXA/ҡdS|E}JjO3 {sb >ŕJS.uBc4ڙ_?$ ݹaj*:),{WfLx9}90+bh}+Ao֫YOȖ(TD?qDWdfPgsdhG{K}Zj~ܛwZ^p?^t>N{@! J _U<O4lOpKgHszp[ wgApEZWj%ړ!jָcaQHd4lIYXhVUű7iq9Т~$$*wiA8KLíq}k;jS.۾{";ɣ E%btt HJJ_iبhľ@j ,$ʝ;XC% /[j8wPsxl`7>":lhWHb<\ҏE2uB9{ja &FSQ ^؉I#B^AVZtySt.lpO܄'8znx|M7`n TCaE`a[qё|0P" {E$Y_BÏՈ!W$j?Pȹ;"<5&l0fvV#w>-ť$_{ua02YKs{n_zvǑ~opT>4¹s$QvEty吙 )^y?J ӝ2윀zTht'e~f2WSnrj%I5/.6¯튟"0Ap좢(/A&_젷AW[梿LJst; qÓ}_:󈐄b8 v͍ z1zn`q0Oyj&/ )# W:s{rcejyKN=)Y vsvf2aFq7gs9ٵD7+@_G?Gcӻ6|o8 ڑ<$*Hn`)Q>ĺ/[X@qQ[X JHJT+ODdd IP < 83pgɗ,`cMp$Iw:h5˨-GC sU562 +$R1R,K ]vo_zB+,c)ړ$2%B)蕚sR$cAڗMaٻ܅d3y Eg`U mp ,2W<s iTaTWM1TAD+(LQT1Y ! Q`A^" ,R~Ԁզ4VSl15r$W/puۀuab;?ɪf~JT/,b&o胮1Dt20f䭿vvF%Y%tD[>*DZ4Y[%Ӯej`0i*Kb9O0>w3>fs4ƹsC,9HArMfIhFa߮<|ZI>i*3nQĚ ~axZ(Q eCp"1ts[wԖܔp4*׹ͳӬmx Bߔ)&%nC &R]n`*~c,IgO|  jWOe>3βkȵw+.Hjj%QJ#-=D9h ` ¢@POjь"H `YI%eur!pHBd,#$ ҡ"#HA~M~_~6R/rt>uNX뗨L\;B8reP 3!PeR'"96Шc٦<i6#iMzߩ6OT* @@qMU0O'LRco_E7Sj_%,-5EߏZ|_d}=3BCT8!#34>"l3›v3-jRl24ms6LQ[n)^|ө$+R 0$D־4!EBQYXE@b7>A42 A[Y1@N2E0C@`/Dxkʜ>*M/)p%}\Xk0f̌&~RpN&?H|C8b81i]lKnA8oeX(Ƚ^j`@ 8"H wf,w2BPˋ?k`>cO NaszZ Q|^$*ܟZSA%(Afr֞fD8Y"uX]h#dXHINXX , ΢yqS \3S 3KQ;dC}(uw1\춵r26Ŭ," L Xi_Sl~ɑ⮄miՒ$;y sy++]en>sQ>z@cBi422C7qiW:'#m#H/Euc8B o6K_1v"-ҧ7ҁAPvr.#' $Q #SGo=dIJa'A7hKf`.s/]?!ia2D;t7=VPU14\ D=(*j/00F5uyv)̽C[&rwۣT*e ڂp>hR;8eo,Fd\pژVdQsnfA*Wr6A,'Rܸ0U&XظLц wT z&T&8F܁b~bUy?9hC(٘s;a8A_oac5@ؠ UCajFw=qbL]5%%jZ0``=~ hb^t0k|t?caIxޥjP5_!uV+e 0H*$u8~3Lԁx o9X4g [&M;]?~q$&R''/ROd>)#y> }qO ֩"-!,.9X?,[M僨uk_}b̎x4:É̵HŮ\,耙PMq*wkq气=߭g%k|!H=B@b_u_f- z •9sZͼ bvFe?`NmBm"VA; TgK\q@ !*ɎndʁbECcWx^ Dǰ8(}c@U鯒 LD,;뜬fI(Q@{Qp8eK2+VߝokKqJ&ѝ5e>"(F# 1ӖpeܴcM?("+OZq+!>6ؤ NIXN+aR2vrbCpmyղBo8yٗRfa![ه" :R:jy~W{I8 Uv=qޭ/,3  ɤ(ma K p4@9;48FI׍c^50J IF5Q}9S dgag ±d!++{  D]LH'O%Geq_ 3nK|LuT7CZ9+ -HP/\D7Xl_0i3_oo}aUFCvr;?=K?#neK+[QŠT8 5@5E<7GVj&]ԮLi!db& Dxۍ~/ybEYκo(Vм9P U5H( O-JCӞ!ߊ%_xL Ա|5l:0Wh&dd;ߌ+_LWyG E\8wb߫AܯA"/*&ezwn@j}zFw-J偝=63,#\K't2? gD#m 6?ֹ_`T'58pй`g`n2 #;O5n휽.B-] 7idsK/H3))H Z6}no~sq=C5T8Q"`rˈvA-Q!"\Z(1t+2\V^GLKF֬ڹL.[ }aoY!V*&/ca1,#7rwOVyˣno~dL[^]|s3M)qƇ|˳ :`;_dTtd-rY_tttdGuL& "g*ђgSWIE 2|`8ɒ^zW}s.H`ژF  ρ6ad 8؜Ǒw(/XI#͞w®cWmGsXPa@U V2P`?Lȵ1-bHK+ h**,f%X1F-@$B B" 0DNfqo&R(`>6*fZ!$(>LT٨c0F t᫬pP.P PSz?[ރ0}w}<{m2:!W*YXb@HFEJ$~}}RNKސ1&\Iz5mS,Μ4ɲFXE;=Q!=9ߩLaO.|Zo9YP!*%lC&M)v|6.㿘~7FJ VPxDskSUΞ +;[t} d٤3aj3Ъy 9 Մ~dQk3u By/Yz@)=s42/¦{@eϑT&e"!7PKPƶ[#S,:+Fcg'nHp]e"Ez6IdqЍ_ۈ5%--Sjy6]zW4Tp!ŭ!\/(\ry #!2 e)⷏ptQ?o(zawww X{P  B: GgC·~@iu/PcDBDoDm,xlF<5Saf/SږX} Z+K>E7 p|n|\\oqvG԰ʤP5*ZTXHm,p2r_X9ПJNH],*&ؠuHU+Cϡ(՞i1si+Um95hґQe7A+tw\ǰTOofhblwrrϰ =w^Q}ea Kb3p7j-ۭxn21*/@e+V>8L`r h7yX/)n nPz:W$]HE QUb1 7ZRG蜡b}SK7N'Ѹ HY73c"l+pv(L>yyػ}`!cSH//%J ^B0>T=i3zsWHlGeCZX5rEn!e5/Lpj)$JkbRg-}>YఓC0Z:HhCMDdr|P:()R0 3h ^ COYRӥ|{{.MdF観?_JKݧfwocDARIBtϮdȧBlY!Xli%- ݒ֤߱7ro_Ȩ$Q`X" o3`|cf1'#@BH; $x`lzv=b39T/+gT:<Ԩ:Hh u )]|}שs[ `E2V_fuA<2s1XV !aMSCkoeC:`<[nnp z42=^ZDغzTnszf<ҟf9B2߆v s8]X!wr8&g944$!u,'}Gqncշ '<rXd'QQ#Cpل.۫%rp ĕp?~Y|77=Xp{a' Wuj,PbZ#C#R bjkaE&Q9>[äp@Duڂ%(BHҀDA\@<J4՞Hզl8q vߏ啘Y7;FhouS+T 9ͫOY'2WU=.*5z!P P}N|էxBS{TP0\yjˀˣozo1ӽ& 1Y繤KXc34$(@P3NFU7ܐW3h :Kw2 x/u6$r'3q;Af~H8w\o"iijtWwUqk F~_(ji{;&|) 7!`d_FЬl݁ż<(|i%8/ 8* *)4.D0!"`PE"YA22=~ $?O~8q]xMoJ%xAzgy4 d$[}ܻ{0r1T "ĺ@n ( ~͌aC~|fiiW3Zet4O?V<>Pn^fV;\xu7@4pwy}te1؎kֿ"k}úxEj ɓ'H ̹Pbwھ$6H3㟥R!FAy e!k^ii77,3QP.\ލ} ą#ZTl[WXIJ5BK{qٹÀpPQ)shBq"pz[wnXB=T9b%1kBrşV?_c_WZC=?[Aj $ C7P L ^@P'{cYu$$?c溎li=4)B%2~ wMS~\f^.bZPΰeLB =ё$.'`)ALT= B\2B́8KE2$wm)~rKKJ4\oQ:NxVʅmsg֤m>WPPffOP&*MOk*O)t c/X6 u8 nb" t[E| Up)?b{5+yӤ;M^5Ic&X\Rܓ秧jZ/iߪfîoMP?V\LjYnK"l ́rƴN8/[ $ώU"*iSlmZXKEATL'DEr$q*;Y1 -W,SE ua[3loP zajΣC5:Z1M2,$/Ɔ{y\L bb b+Z|]nGǁAω;3" #z-`}K$7xwYC NQB9M1ĉ<WwCnN|L@v0;ֺLݖ:5c=%v&lf<$~!QGvlObSR OZ 0>Fgq@\8-wܸ:Fk͏6LL*yB=ys"Dp}o)S3KL#,`ƿg^dža,0 15p*{34I?n#bDZO]$ 6 1{hHE$dWcҧJđDBITPI$,)&INnD r4ظ2C $t0RlߩaٲErT3x+~7'^[}Գr>SgY*P5>WSAw6dFM)>RTQ2{γ fXR9ㅁ}ѽeyE1љiKB~]sZv {ݫx:5zYC ^R 1Nc1nAa`&IKC/}|@CnYϔ$XhZBg^]T>v>6z8 {jp]SD"$Q ER #dX,TI 6"# 'TeW FY Ẍ́ ] FF"dA.!C#9PD<&8H Z FdA 5yXTKEoe66x{-r(?U7=In@c:5s{_?ƖJӮR%]WVdf9_p\4^pE)|M @/̿Vج! Z}Ly1*o}V@c 3f6H[S%2Ŭ,%e_cK4Y%Yٲ Eb!t;jYߣwLK) i +^ =ł|saKP Gza fJvI%NTmvsdKD&0ΏBgL%G2te1Oyi|挲,z.{R_rV.,ѷĂoЩmBH)@aa#z?zE?qK`3몕?2/[T߳KW Qsmpx'Iz;}wIi9,Bw hGхY;b~#pݰ;&.59(!B:>{d0E%nwS-$p im%a'dP2p'^DoӴzwSKP!Ocfz|~S2 lFGd1DG|R,PQQ]Y[ f̝ I;0A1əa Ř !0x4IT G٥$oKNgC u TAI)X'e:ǑZr Š:"!g'Y@ls:[a_9 ) P!x u1 z$!OwF!W8#L,o-HX:Q0ʰj' o0[YTJʉz?Ⱥjd/%*+ǘKp2a{26|#EW*Ц@>֖3y7`pnw(mPBsCޗPFXQzs m=Ȱ™i6JH7,1pH`q0*oSTyER(rdu6֧RMZU@ZG ?ʶ'"?+_`Iby?0ǿ?8]82UׄClc?Yel.](7!>npՆގJ|z5/4ƴջ~HFoi@i!Vώ.eX.{ͩdXre-)Ź n PiOT<8aѣG+7la(xJ+':*kd};ԿAt&A  <='#"-%P+wA+Nޯ B{ɏQ*跴JZɂ g̰̈^n^Ww!:Yg]-Fd?)/MDv_ af>?lrHqWFxL5{:2Q9m\Rk݋*y~9M}Qqm YTџѭi)jB;l;OۚV}rզ6BAuu~Y%x]]C tڰfaS>"a- 5Iύ[cɼb 2"#"  "ȉ "Ua+ nX0`FDD  廻Q KmYr#/~GbO9%2&Bdt̼%Fb!JDR %ϱ-l-I 37vZ>! NsٹuLq##sU|[z]ɹsV.z >0"z [8:x]ir[/Un]'c~D_fͶmy^әr~]~mly2_>\/ }Ǽ+?HS寕)_ @P2F+df2yxWM^ QU"/#g2eKѦ d+rJ^_M9~f"{esaW1rw]a㻭ǔi=GoYH+ 2,o;3àd$ $6/X^Sȅ-KKs^ ,^(;0#DdV-Tܑq UJe:@'kůE=,Q(a$|O&hݓ0_-Uj]ŵ.O~^d뢹Q/LZH̲m2_D3V"ӂWhoO!6KíU\_<|RI!jP[+J֍GZ넘 $/p@/_{,Q%.Y:1¦`.?KjOxMqgcn[U/Ub!1 G) ᝪM);=ƾ͛z: ,C ҔZ͝_ j ,rr#biv]i*L?,ʢz=our(MdwpaEʚTj,alF]NF WOv]񦷼cUϦho}3I7]TH\6-ܦka%&aniC%]kbf4-_g2:S 4#6xWDA ?ڮr"(V; ,ڨCZ~N_,eNٮL(W<);r 'l_mHt58lo+L0b l3H  &>c^ 鹞re:1n-\'mC6j4bgWf;߾` ;q_coO~/o6QX*VBo@Z]xk/@ޗ*|}'L{"}϶[#`tą1{ %6ШĔLB ȤXɲY)bT]-#S7vMק~nvq loפb1($2OF-xK(@KxDa)?a l6e{z) @Lؒފ0y1'&-ꅕ\Ikc1DVj+rd]N~]&0Q)R=mu% }hSq AZE&(!Y rHH$lGTaABcj۝۶X<'͠ |lۢGUf*xwTfo۬#m'Ċ#gli_~ǥd#.6ց W## (_*aPp+Yx#C~6ʊ'gU{"$*e튕}J;-VEEAXq :;(I>riB(*n ~m4)RGPI-Sǣjp蛍Mx,Gu,[ŏCx_ɅL=ΊA9yۛ -̹&6ڑ, ~HCnm<)@-NΡ![A5 /4W~ltg)@$B3'@Ϲٔm#tN=FҹlU}YOuQpI~.*sWhA 3)ɳȉȫI(ݺ 뼃N' $QrE$^ZD0CnAtD(M!`  5f#D< Z Sj+v; ?v;JnT7q>*IOg+y(i<7Qs2W8G񛝠 z!v#X/ZIhJ4EƳTDjɯ?T۽ibuo}NƋmfWޝ_𙩟O?)ea׮XSj`~&b#ee$$ [I{c%2Kz M'LnSrW+RaDu4@R;NZ~ kz+([y ;Js+[H*~!X&ӷ`cŃk0l~<{8io3HaD|Y/=ںԤA GNa\A`p_ H $>]Zi%X[hNѲ'{ v V]KNtL ٠&Q&4&X-ۗV0H0DfA&qCs#!Ag3~LyCX]y}{{ӋI $zHQRGp@YҶhT0I= Q}0E@@dˏ lDX620hB(/߀(a#'&$Ҳ *Pd@K,F1Jr,* BB$X(AR)*AaBAiXYR0dxt=]d))TYV>$j:(zȢȊ)|D lRC>I23ޢ/ʲ9@-*U lFs@( $VR ,HPU #)2"Y ȃ"EEFPTYH(Y*" #"d_AIPY AT"$"HȲ ȢDpMթ@͢$$O _O7@fgC;l|OKlz| [YaL=*@Ju1 O)RԐ##M7kͶkp>|cڡ'.%s}x#KM|V^vY_V< =%IOΝ5Yۤl{Hř H(#"򨔀NԞ g1WorK}O~g|K9˛dEF#"pUGI.PE^K\߄ÖE QG"VPD.8 =he׏ͧ.IfQfVc@k $K{@f)|0HJV&Dq8dZoqq֔U&nb(߻n0焗aVcD3u|){f]`߾\AKk}gefr ]Uѓs)7 sKSS+sb8V <`,eM$Kd*nND[RWwf*3\#ƬPNukh^XoX7HT=Z0CS¤6Ol bhOk\*)RY㔨ZJV8`H0 :cto4]ug:LP\xi j+#ܣ 8tHP)@zcc+*0-#^@4\Q}5ML.̪z欍5acZ_/il-7bZz0A^Fċ fpZ1I!tjnXD3*o}Â"ջPlFDk2Y"+Ae/ɅP]{YvY7¹Fo0XG æxLFF`U]*By03a{`Cwt$K W "ʃ 7fF1nqd3kIb/~n wwʄ>WNy gf2C8?z+Sgt[hGf+źp_~] uziUZ70)2_a ļB"{o\0?G5p8hBzXz3+D "}6J 9`Rj P(T"[]5oJ>۬wu}vm=jE@X}}pJB{] \]wOR?poh$@6,2|+6 MprsxFcr ]EG;%K7fIE[^Z޼填~+֙\h-. /e\S˹6e}.XC.sdTBaX_-osR0?SVV)p*:Uvܹ69\%m*!umx`yC.13J/ 9Պ6ȷVX:Acu|%e=~>|Rԟt6̸)Ī3wogQi7x {2i}BH,F"^̔&Her,UNX,͵l,ܠZ} ΨNKFJkdtӤ+CS) An+HC-Fy$&pWӹ2$pd#D̘sQ@Ťd+om#YW%T~mZbN;;r̈8xWzP p`_h52_: N}~aj TYMMZB^Ne utU!y8u'>ءl.囩& %! > jS5VZN  r`D:\a~Xd d&xH*X( x P!DE0=|lk < kg T:B t+d?y"Ԍ$\S?=S)@ ŷun buaT'Iy"n?ٲx8{a5Yq8'' s % d%E$I@ "$2~~8'ԇ$9L1Pk <;JFV䓊eDNiY ?@ϣ >|GF$uD`!t*  ! tPDj*(FPYDI @ JL &d`y@ g:+f-wgJfnF |]_7Sh1u@Uմ&E&/L933_b? ^ţ[+ 6Uvda*$R4랧bVxs>A;Jj[*U1b.`ZX}<@h,AQǒ%Nda [D;4UQM <[N@m3U/DxHP~kƁ|{~]#J@3s 7DVȖJ4Z| ;x>K{ ZL:07^Ȅܽݲd 5iZ#"d M7A1!>_ʽ]TDŽáLi=`e+DSb]<̲%ʳb6a%ʹM):@GC (b+bmg;T~XăI;]^%-yS.ԛQT~9o;_GH˗Ad  Y==m02P2U~闔qf\2xv.P>Tɤo1㨸Y4l[cỉEY2Ncf3mI=[:Z6n2&^?3%Mk_|Ʃ}a0+_鹫B)TLj Sg5m{[brO{\ Gy,^~lL(i̕%y.8ް2w'x,LNS] QzU5{x5_ǃL|r&C7&of@ṇ퀠sX!J;Gs.-K?dU 1n#L$6.n THOpP9*.x#Z~p l U-1uq)U,>wK;mC"7UUSF* 97)01v :8F}ۜ5Xfd3`]~S'qyx&ŀZrLj ìC/8Lрu CZ f?_7UplVLT7}'n9ߊ*A;윢iqI0tw/t|ffzp:gxCSY idH%f9jey%ϩ}W}>lHVY8Mւl}~i27Ί<̘(D$d   d~RA@`@ I20F1b$!d @Q%d$ , 0(DF UvH|6O|ٹܥl|r [BHxm0+eåB ӮL(AZT "#PR,A'ҡFBc*H*<\T*"H@SwŠ(.&~ڡAdDoD@89fko|"$?y-,+{{=c8~W!z| 'l5|%VC(]̟\lg$8fѩxO6oS mz EeMP(խl( jD6n% v[봍@/noQ\[:y/ML!h&>SW;$0D0w@+KdP,ʮl^lLSIQI>D4U" !-"blibDCm忑>z{!YKS,(%6&`P\ jPl&܋[@`挆b:K_ V@BWR9><7Hw:xӑ_Ǹ,~~#?U(mHny=,vp]y?ow|vaϳ?G96IiO' '6øss8b$w'79s*ehBޮVې73sזtb4%g|d_^ʔYǯh9z.jX6*hrGduMCfAUpUbtk?Q˝GHJ75:}JT6DHw J]WnY!LJ;|7!t*Ž;mW(~:kIE[8J |M^#և;Y5 P0+ðwUkW ?KΉ.ɤ]0>Rm% ;> >(z\=@_`6ԞЕ+dw\;Тx3v}.F. UP8LJI6-uioʀ#OUՄF\}e$U=Te9uBO)wHGr1jIfjE~cVQL))MeSêkO"AKQvTл!S;\)vkB[G?3/' 1؏y qOf.Zׄܿ`@]r?ƆY_3m :ˡL^{Zy r3b+!yILdVW5WbO1~g7qk~h׻m j [ijK6X);[X"дp̂UHc>(fs` v8H!O9Oe tsUAy҄`V8G;^b!2ꔕ1'A4ŸֿBhB6/sޖR27)ֲu9'2`W?_6Fv|&$K6>3|Į7s n j`2}A/9n̿q\}ya|tHv_z BAIv nֳDK'splYHF~ʐ\֏W qDS PK't#O?%Z(8z2y@vRa'ޭ_A]nY?& To[3͆BP=6h'mlC$,H=80[}/J4]CҖ,:m&8JRTJX^@ T,h0>{aǗtL0-k`_C J1ߤ4 oG7^XP@9:9QW#t)2X`z߀+ Qvضe$p1Dfwmƹ{Wg.++`rWA%|-F%eʂxHtP5bR$я|a⃈dn܆rSϗţ0'qx+* RDXUz|qnz{4MXu8q=@+QRDI;-568DM4 8_kZ oFG[sn̮a5:kn Llp0fZ>C٠ûY6Lz쐝(W ev?Wz~&ݴQ8yWy[Zq?N9;X Nǁ묭ۂexB(P7*%ւX@1!W?1 e²fQHI;Ru(Ayzgq)AR}̢pCR۲Xd7B"gxŀtFQ!w-`֚!)E[g"z:FwV?&H9*y sLiJjfn&{ CRGB!bȏ97UuB{9 0-Wep|ЛGXuAٴ΄_ 2rs.w]ޥ( bEFj@ւJۀڄUo虃_i Rژ@jxΧZ)aLNmO;N A?VjP!+F OR#G yeYZW-10D$y{ٔ |$XA~]1-E֐G3Ԇ6sphd8W\UH}[E!rx!(,@]|H\;iӗƂbdfSΝ2AanqWF0yޭT ܆JvPdբ/Nv`'ʷɞ_@ 0ue?D) o\V[;d1+iVC6DZՁ4QlVdh tY#s8Ma.M_F m|UCz:iW'bpq4V3BrxZ&TddvK[r39R@VD\nL-Pf)Y/hz{l{68:X5]c/|:f(=FعB46|Q_>‰o9WmTv:4^Exaؚrp+9B%~BY}Rn% h(Y bDպSγgf`FK@j?8sx,HU'@Q _|Y^z G`H95Qrd#r5R^n*oVdtШe}Zcw;±Xl,sL^ o*wGc#/`[L"% ت˟tyT8mq^gHgH!% ;Aj M|sc7_K8|(P~{9;i_/ӣĈ#ʼn@ޫxR|E1`[Ttf6nm>]D!1]֓sʀvuNZ`M'eLjrIOz@WwM6!PM8Kgor9/l<7S]b\_bAfXy)>y`6F,b13ݼBi(B4J}V"!;_tYuGn0uSߑ ݉hi+b?JQ7Ԟ%eQfb:W> 75mcr]VlϏn1HX<[%:θ9 h?IW*We~n8^HFB0a߸dpNsn'|804CNM:% MU|1fW&Q@9I<95:IMxfi N>eܜVa0uGMO}Dv E$(I=~w;4k˙B 1eDbR~o3ǧԠh:|awM 1UH-a?} Njx'sڷ@)`[=$bhTE@3om?֒$q F%&,x{:earCH C`ھS5Ka$3i w(i IJC7TQ!DI[:͗'ֻ91u3 j + {kQT h~')y {p8]yD% #lKŎ1e^Zlv}U1*l4FE_=/iܹ\#BBх|8]㰄 $P=QB}J!L+Nh[d5ؠ?7Iք"qx)7{H%r׾|EmXz帩_ѽ",!W Ҧ,:b-%mA(^gp[£2Q\ª#:x,sp:+ /7ދ̂6Pۻ}]C>e2 >yŠ})#AC>5QEzzSѳOg2sqJH -58DniZ{8I:ʥ$\j-lVJ3@(i&Q/K0B@لH411!̛̂d?$<FŦ'ϋU6RGO|s%wH'uZv{x3I4BO;0/+*t{c]íة27(eAGdR,"ب Aꖁ=ZNb"GA)-72cH_v9qt/U7berX1 ^ Ioi,\nXFNnc Ŭ*?}z_/ooon`6m0PL (X @8 kYmfezا( V `ؠ>^ˤfAC~@8󁾻 6iVCG+L@='6R'xyix_X[?lʣ*+c3d>=_{@D a6˺|F,22pH~eblh 497} ɉ w%`.bFA9iZmkFk22 Z1TܸnɃ 2!(B5ɉ.`# 0ܩe< ?s d W]6S! ?MgU$;a3h4kTPbx=v -w?PA:(6rsGH2G'bHS)V~\DES[ 9hI% H[L`J`xw|Öc*L8y~2_?QF U (Hgx"\GYP$EQS"$?|1  E)E{)~won!y`xήlۛ:FiMpdTb03`5}1[ [T#Ӥ=КӚLJ:^^hGH'?n3¢ Hbf0Y!X0P7 ^~Wm(o!n |^ <~Gφ/ovd:8gԞ6(d$50@K*?[=Y34/z~ \?WW7ZG$Ku5j㫚DF,(sJ!b/o~2 9Dxdk*>aICHUH 6*Z+]; C+HA֭ۧ`:7p~5s]GKZZM/G[UCjj\"\Ĩ9Si}"3 ZH/(!$C+;(5w&гn1m"i#46mL̨I fE~#,^ rtW˖ |/_Q4A=<_l$;9+BRk U;|uyr H+d= \'{pa%|!Їel(*D Dib93K(2H6 Qk*+˷xHVpx!#a+v&l؟)W(}dGmd$mYj/`zJL]Nɤ3zdKd:<͖ g4wd+MWR,YI P+-\B,3$ bm8Ǻ2ȯ/`u[qb ts 8$#yO!>~Ǿ~rmw.4SfqhvwfOݵ'"ZMX^o٢/N'te4cD4h NEn}! zt[HnFLrGPzw(C$<,5C?r(:4M ed[{ bbxX@?ހވS&#h 8\uax^U2qNsUo8g1Ϣ>d:MG>\nD5_leaC~!\O!Ɓb \ٛ.qnm=Վ "0AS.i;;اb!STNpO ;X hFHIv!!I2c!S7N#\ݹvu!#";1 Li"*$)źrg|\ʏZiuyu|6i6Z@8RZØh; 3$}jc JB AbF:JX -PZdP() 4E!dE-jz J i̪C-HU"\,-舮*!?8b:sOԚ#5#$\ n|k~m,Γ]!7W(&e ,fIs`.ϐo^ϊuO/ProF^;ڋrAp4(TQj .߆ɥާ1Q4q|3og{:^.TSvf? hGx$[ Q CkBD3*jȖ5K&zV#lGkB0*{4lB ~R Rv7vH-ڢ$5>`.Zɒ_Fl=[ƳC?Ac),ܖ&Cmt W(q-QR V%(5 ##P†TL̾'wOrxJh_tJ;RcVJcSxq-:'}tT%Km'wf_@Y]kٰpN!L;w1Y"=6I,Ln>t9|'qgI7[Ȃ * !4`ywqJ$}"n tp+F@ تtPPd"AI$Y "E"!D$`$$PDbPPDaH EF%" $@0JDVBT5!QV,RV(, I'ȤY"FZ0UR"UJXbXQ:Rlz# QHAHf@H Qb¤JT-B㍷V`"@gX_S3}kaN@!J!yȨ_lUMs$E6K|"KN9|S}CGAXrQpu- "Mb\O #  R2~_~>|SgM|1B6d'd ݰŽg&Q:uuXN"Y3)R1 HaJÑt͈G>րNĩKe,!;q0İFVb.K N +  "*bA']  X FE!#*((zlS@ﲍ-MpN#*5HLcB2Xjk쬷ZVw:/ȁ5ˊF CC U䈀U D# P H1GU>_e*VԞqriHC)ZЁk_|]c̓bɼ|^sϐ"Ga_ !H3 R.á\87/qć71/máB#}<6NHrv~BM-߅ wǕx?7>#`!xp1&F -!21\]p|7m;#P.ǿM Jg/na޻Ǻ ~_ke& \?An#9R%/NT.PA| 3h.͎-%ZO]a &AHL4qWjF$;FW&{ۺy?j^ Oe~=5 j/=WY+_9f#>MoQI99!U%SխmmjLG)?ۏtbvv 8(6QzC]C|n+Y? I#'X1- yYNlGB7 `:5aCw 9CpLS|ZM"Qt_tC8 "4 8XFUÚ)#T -E5-ZbuxL YU!f&{?̘a/LW5Qy$@nduSs\.vN>in |4隷F܄Bﻜ)/IۙFօORE \9t,L h8;)anes6}#cͨ8P4xGζ+X4 ZI W ^4_d,Q []+i[KhYr6 @%(UN:v=_̟!٢oR%'rN$wΡ$*gpA.} FO{Y㏁"|Yn5 rHH8.^Db*D>گAYO0il;鿱*7~g *4}q>Ǚgޡ`_#sTk\]C8a o8ll"SM!Ӧh[<\Df]I![>^";jsp:聞}5, /t=/tě_oN*"4;^kİ >%&I >˯Cv@R8l~>'-%G(駷&1 Il͡UHNouvNW``dfgycnU?"Ҽ!oѽFa+G H, && 6& XCAS(HAiX,DMB'm-걕/tg{1҆@^8!.ZsvfxIJUeBH`rfS*98zcj<ڤP-챱Sm "r{Dѱ$[3`(48< v7>%#CrbLc Y PC4FtkwiI2_rѧ58@y-Bz`v60}/ChMf-DMwKT Pq{uX$oO8P*0\\w#bZCw&n(VԃaZ_ 24u;+s<{Ԍ|bn`6Jǝ\mw~T12KDC?WჰjŚg疶?Z'ADۉݔ {ixtU ?7VdUrW;$hur-cYb 18ԙd߳;Qǹ'khW{\+7GX|,lTM-ѢBV|T4Ԟk5Cŏmdg( )鼓b( ȀP(g53za$0=7Ϳ"E+RC#'M3; g[16K( 5ADŽ#P{72ܦZH>gzvwMb<:%4$&eM3Y{_:}!LmEg'8ٖMO<фú( Eú0T7}GG"i?ΟR|lnw !hFwZ& x#N'6DC)uh=2hT,JkNtTȝb'tW?a9!*(Y#qJ+0)"ojA(=3'^Dm%y^*3[EpZXV wq[d0A0\XG5ѡo%ZѱN+^6m r)f%0hB!Q9ٱGD{I?LpEW_tpšpI{0{Pb(d"e(* 16D`3FvB.PSCR+ (`t~#~}ZESJ ev$ߑ" ܚkD Cjă~WΚ p0[?}Ss(> ,RTƌBaV@RQ RHsY]3;,+]@ 1Jrd>M%q`'Q[ӤK bLQ1a!2A=9g`Ęx^K]Л0W9GHq4*g;xͷ3+Z7x&7R`3Ex 0]#Y$, @2]2PDM4\+0{uMMezNHD$@}3< r0iL $V!HEp+@yMQ`)-><'6{DD'XIu:7 ̐=3/4xAAWA4`c^GWo:02<甃`z[~q>tfG dv,¯^ZI\]\ޞHB ~4(w`^7RejQcVgysYa$@wꇖ?ﱺgq FyzWg=, ` n_ D77ҌMX^7:Pl0Prm{z~@F*K^eunx@&H_e>w R*> e$p% 9ذ]ZBP/AZ `4X#byiֲqkcsFM;V.?Snwv*Ct de5`G>B' Cv;QI{a7Wv_4RTG8 -g'cUOFzsXVR/u$TzY\-]ה;7^ޢ þ b,9A>Sr~EoN|ynU\S!fuCiY9fUh"W6ճv0nzq@E[n F7d{ n2.dDr * Z]m}6,jƥZji~/5Kݵqe|Hv1%k\.auoKKeyOP0f4d=izGh""uc8 P'yT?3;כ}lgP@Z UBA)+Yd%ќ)zآW U B\+rn#|\N'($%ԗ$!.Uչ\F,Qﲑ/!޻>j 2byt\FOϥgTGUy ` &YJy[ps zK=wM`_Ni [+`@6{>0LT2N g좰PeӍ"8$F*g %NX)5p6,ICACI$ &Ijpm2vn2c@7ӣ|Mt]XB70a h>qz|7jawkMbi1uBBbSZ6\wݼѕr@sb,$BRF1By' %q3F;1eqq;> c:-4OpkI#Z!E7Wv ]#pv3mu*Xus\'y @- ߩ'= @m]w˳Wsmm@#0[neؑ  9-' Uin_`AAi]\s{v{~?n H(Hq8?Ducc kyEanxXtulrMe뫘n!l֔@xI;YDևx\UH xșHK-F*?x8{!Wާ3U UEڧ0&E`\t5[PmXSVn6cjo]cokC֦tH-$bRۺ%ӐA˦dM5#l hp{̗\Ugά`9x Ơ΅wLU =-H2?#y!%60&!x(=t 2b{$HtJw`GN-;&U]1%U+[ %fpHզ񟳑Ħ3G3N[wZ[xߍcj[xI-f<ùfzKE$D/Ȍ qkOj:dىF,?!>çG:n$.;ta*9֏4l=q˰}je!1/hLⱷY!E)-@rm}z]gilbw\$ ],QU [W̯`N n/HmBNܘ_ 0DP "&UmM򠈃q7'a`%D~Ybm/aidoƬ"w?%2!$8 ykZ0JfD4 N&-̍>` vAz VYv'>&Eqj nf},قX)2TI^!1i$4(q!_U ML9T~%1&7c^zTIk`N~n *Eplڼ#R0~&}RȂ"_|-EGY|uT|`];8H@~,@j7j%dP*H,$Jb3zHbA$8 J  cT"X0$P  "CtX,`hVBHQȜĴPM-YuC=rSa,K< G[EtahC,OIg[7d$cN 3P$Q8>C:ۉ`FImn:/ȄճِDXNsp*nmO8@2(v;ۜyJ%U:@ 5&ok+D H.NǍ峟kfv5$uF@Pu%-E`h[,2A&h@c>^?A]g,7KIO# L +lBoq"$$c c}/:nXdqV*25[57ԏͣ oYuL k]b^TU8D85C6~6]|cN [TNy&N YNjϓt@%lٜ'j!GDsP&順*w(_4r=/4&Y2a M%7V>~I Kk:Nփ4 xu2 u6[؇naӀ3G3wFQAe` D#fl$?6OJ 4MjzVɧ=L3fW}I?UT?Oe]^仵a ?\>Y.=Fkt /ͪ~2)Sڏ{1 {3H\w\Kyӕ l$EBJ 'ove;u}4oI$DLO./2m꩘6kkb+tWS5%׭aYq&mDZԈgZ_r$G ppg)AR]Jo{78 2G#ߪ6J wI+AM}~N߆3{s_[. NY߿αGWlbs8wQF0'\9Ϯdx36jE+E5]$tSZuıUmB_ $@Ƌ@mE&^~U۞&I{,TPqQo$UtN (4<^z9=]؂󺰌/4 PFpz YvJ䃍A/xik+#47cYqUBW/l A6 Yx="FaY\ٝr)4?OgbDv.Yh6ӻcS뱨?2{&\ANX@E9FQ0Ĝ˃5:mFR^fZm.tLb^=& =^ Cpwǡkl}M܉ `fUEw ySg&dC]dƿ[OV) _s!DMټ1 7Iz=Yߢq>ۍ۟:E~&P:Ǝ8* rԺH"5<ːKU<3䡱9Z|M W'y&i>e c_.i,:{88$&s-H 373Nip>rV.;wݹ?O@iAE5~m;h%RqDp(O|(riV0s֨ 6&*uiU܀0Nqcbӑf@ZBU4A%Wީ[࡟t?2wYf6#9_Q@֏ER@E?c&`|s;ʭ  HLhS eU";C"w@ȮgBzoc@hx E k:T v4iM$ &H `lJ!zK"Ǘm{|ExS@;A) Xrd)'A@BIi<:.N<9W 30$ (@6 !dԠpPC6")2hHTA)$Z?.a >y#IE4=]pw2m@(6-顭R)"s~̹% ]}"`p$FK?ȅbAxtKmci{Y,)@rmx11mlqo5||GfMNVnVq)uLA5@*oi\V]1G[-nSaSCxmw~6x ? yC?΅|t7JMo~N4 8"2oABH\4@?Rs/sHN;3~> M[\~y*GokGOIIl{`1&`/^gjBL,y΂`n[>" \>y;!JrA ohNMJL!|#1nbXd"ec_*6_Ʀ W0\_Bd h1F B5ϷPѣ]f` A k 3$bdX4H@1Og} @ZHBaV7WԉJ1H" *GdhBQDW>e̩R ɂ hE[A.&\E@AUPV")GC CBAEUR"ϞϏ꿻;F?W`Mȼ*;ޅ=_ '""@"ڕ0عOFJxxKˠ-f D8_%Ocٞ!nv'o#3`qK`h_SDy Ssz%9S{hEਖוQ^f78 1ÁiE0ix8؉ @0\%^c;^+D,Ԕq'n/\KҘlKbGDǕ'%uN5ww _km:V%"?{M3u,42N' ;/#B_-81wPxS›6?qbMim2I0W6suX + ftGu К9TE$a@1|ߖd^=@{ήqVr oFOZ%E6RXMĄǏ{,4GRP8:c*-?N\zNWwWW84f;7T@0E2j ؆HHrzf󓌹]r?WkHwaxONxz5>9fͯ&JIYZO^%﨡8s@W[{dOKS[ػuy^ }+P~nڇo1 f zV?gR2@'O Ąx41v R@εl8V$&841 Oͺx|+y]=_$ A RoN?ex ^a؏Q$y=IX: `O7j b3>-I[C{+IZթS^Ak+]T$p47dƬ]xU/7w/{bwڰLO{={\EfQ,R(T ta,0m]Bfk*.861?;2S%ZR3YNf3iG$9C';g+1.#ƽS pQ $pCyHh$k,NOW1`R?gCHr\ھ B29,t&uHq,n2 \dJEHQPe#"dE V`Ov0BAE.ҒvҲ Oc*Lr***t@yH8srG"0AP]T |4;>ʽ9ZSƝeymm !5//-< NQwmzcL+/,,t﵍[fe@Q=$4Hj.Vc;P6t(* 3_,Bz S"Jp_ѵG:SyZZ;6ap#y?EMv(6L^/ÖAl F$]켰Up%--ZU4YlhQ [*[`[EeEm(B,1DQUAYDUd"VXA, Ŋ* >K(&! d$ Id!8 ݐ Ta6j b( Bb5,$QKIEEE ,#"Y,X() ",X#A(H V#mQ@$Ŏ0 B( $DHCe8 T!+ &29ELFIdVqt-~AZ _Z5MnZuzPO6yC@&SAˌTI bjaUi(\*$ˈ>Ґs"y׎ ifʵ,zo@s0pnUQw&C4cϬOB9!Ws[tDU_}lgC$m\ %c[ClZ^OJ~VWqπ01JK/U:Z.7LZ_#,@/DݸS#Ϭ[lRr}Fn}-COGPf'= Vu=eb| Nxya6l n#ȟ4 3b|ԙ/79@?o.nQ\wW-N3_RH2ጘfz<ȵLAKp; kBnvX%6/a$a/zި>K{IfQ Kd[FnӷIѻi>#_7L/:??tWz7X?'`bI/""E)`65a? kSkf?NkP?V=r|́tZ*J?+d,;gюr3,;O_B TG g}M23#Sv!LuCijH=ƄCxK?ܩƤf`M =YT~zɃ4nYP(.\72i 1By/[潅:z73b)EV-8~K+R%|ƽ d)K5k1=IDA,&ԁ\ɗW=\MAACi+,pQtH ,4eڢM˶vdQ;q_NͽV9n(Ui`сȮꁤW&oZX%j u@c Bk|iX50EEMC5WL_/ο|X.W}cAٺ.@՘V !qIi*-)@@[W&2OgPHP',|忷Pt% FvZLjk` ;]6e'jhz'o0S٥wF* $Txl&)rP(2 {֦ҍDBjZt0tW-[(\K&!v-8܋2SFil o crcHj􀚋n8%.NOl׈nx󾃎Jhw[ґ{yThP 9\!,!}+BlpЛ̪"'n%ŕ=Dҥ`](boa@x:δ 15v ABMGT^w/+~|{ XZ/dQUć{T1鑅L#3{4}4ny*l<~Px'^%k34ͷGPΝM?pzs%)90Q'~JuF n}Y{w:o|ΌWg! Vf>0YCa͟b'͋͡&@WgU,@r IL," vXrFƞ 9@ rTj<^>ۂLpBJpeLsT ;7oӦ}X!t-Ī 3&a*n3H孎mfnJh ko~w+)Mel|_w`dB@"IŕI? K0Qp йC^QTmuv+D+jRpCS`=jP@d5\\3)i7$MwɈ0Ē[#MAd*)e1|eU>o|@s;*Kx2{am/ɹ=''e~s$n6~%/|8>&x #mʾj6G{0=<` 9ar d4J5%NwN}f85OMh_?PP棊?`[,u}ߋ C0:RL;፟_-̪H-M#0)5W?s9 DN后TT"5Wǿ:6=k2ڙhx9?Z^F}dn#I-0.,3|P:c<FBi~N/-Nu3O|O 6:m*k\ #TEpTpT`}op:o1r(uK_`(Ă@DŽkr(Dr@X );;CL8` &2q]V}ć>U6y= }c}M[21i &B\t$"BRe(‡*GQ/*3KbOYyÉQ*Z$~Db6C%% ՜}F{cXt7@[Ŗ%6c|TAp1(ғ-mjQn+EV޿qC\Fh 2L/~.p޾v5UYt-{U'\9MgN),Y 0h͔F$A+m9mwR1*8Xn0G5Y7#9':EM촖V=&Ōu=RS$x2Aw46Iӏ Kft{Kڽ$ h2ß $8B+MCg*0hlԀ麷:ǵl[U~i$ &-!@(ʐLD@~Z$QӮ]LsvP/W"JB-[jӊfؖ r d@EN Aq-Ěe:=GK6q$Jf@0 !!Eଋ ~3m_C]$#j# d$_(ŏ?H@;.U-6A.[/Sݯt l`MERfhNv.h{ѼhǢ3U3m@(_o802QpY6~!ݢf<.jڱSVSh5SXrYɜq %IPCt?iߴɔrKsN5Vsǡ|m-q U'%0c^O[ѣq1h'áNzjuLc93߾mAǶ 4ڷJz/ܔFsI!)R~IѹӪ\ݗ[e{+hqg{,Zm]'--m)n s2!r'IKE^ D:Θ)h'Y߻^WJ|ʘҪ cIdY .Ie} 2PGw֮]O l}F/>Uoݦ9pZ"ff\Ɓ[E.AQ4H̍0 p{BIȞKM.Q4Trޭxi: Ξ/|LsȞq88CN-iD@fA+巔W *cIji'7W^#"msR "_/Ww"M)\'N#{w/nurakoԼU!3w~/QsA:x誑Yqy;l-ۆ濽^:e|;UY{Ůs]~XQ@I((wh]Ռ*Hfv]`ȍfvaur*\z»֬Ǣ1(RXVq‡ 5FHnmS3hCeXFTc3j'b7hH&b,t:ߨIvI!=2xy[r5t+g~S3mvT?> /-Ipx מ{vmG g'uH_EBߧ9-)#/и8Y$$x6d(B_:qfA _7{c>knmfS?/$8 $swNKnm<.\e'q!@  ` / f@\b}g`|pS^<ʐ]o{D麼Ƿ:HVa%<8l`ܯwwXN D) .J}"o֮gі\m?͸q̰Sf4LBJ*] 'VqEU@D 82T;eUDb ,( -0LY70@H!Y?~d ';u6 VNАg.'T"H@… cCDAߠi@>LÛEd '+"{g}0;F οup^bZUaG*Y73cG?Nr6Z; %v~ W՟%ZMrOTٸDݑC`ZDI)|HL0+P`YP[Mp >XʱR*ݟNšWqu1erq֛@j#%n{2 !NKso-UԻ9 "S[5]ce ytKjjN$*, WbFߥ/?E󥾗]3˭{1{ 8;_(! sQ+ _D  HI$I2DP'B$P!@F`:jȗ=BKQ:ۅVC|04o$ks>u}̿p 8F ׌+y;;\'3l \ ' G#r;vstv}I,9lAVydI'OFp^9'D""$$BF3X}ltE%t&Yճ/ t;-kuu%)!ӫ(lOM&A6]k+,Ics) S@@p|id+o O68yt/sD/þ/*ҴZ:U| 4r 8e}tqUfb֘s=lNuDvDUOCziCB 1Y?1I8V\(8YxQN`[3rMRi)V}*0`O@J(yomrn!7 5鬖\pv MZX !Zs|+HC r8ZqÐaO:kn9nռcAu^s2*}(N;#)ƂB,R/ >ՈUYXOs9i M9kJ<*fLP10gj>BnҞ,f!K^W=wP<%>o'(2W}O}u2,Z&p=a$D -*( ^19ѴQcK@P=׺Rg@$sT 9 $$`"`XX1dPDdVYj"+A TP,E$*FBP%eQHшZ!1*l)* $W޶I|c1ŐLbnF AQE$YP]TB(Ff`$PP+&,0-Zvsf,kq)Kס?5yÀ` ERZ&Q)/?GDW3hy|b|tT$5r25eGtV?#=qgcJ͏(<Q"%'*4>Z`=}DYYZ7nS<a9 5LSȨh ߖU™(4+i)F>GIbDMIw9G7aXdac2FŎbon_V?x6i(uuI0\Ad>7gAx|OK;{x(K vKR P(2:j)@O]ˆo p212ZD*mC'cBBDϊ'ȈB gDI^-\]#ã:>2{< ]Q̑JԹ#)uU kE U%嵶hQ[D;^u33iEDfȏM F> tYYt(f}=Q&(UEHl %4 +_6@m$XQrR0ysvm/נj`B.>I8`9\,b  cq$Iq-r@2C[8R7dLF'{POMY ZĻܥ15A?}eQt'x!YHEi%NZ~]RGZȥ~ щwK!eUpx/O[iTh{}֙=k"K"/ÿC$iF)ojeYmɖiXW!ˍ`ukRQ|3n'A Wa1x5HXU04VjihE?^C5)qLpM 1ۃwTL`.7n.OOoց]6>ץ\ *y ꢚ0yT0J3#豖d >],Vu~ wLLǩ!_&@& U?KlÞL+mQ` Oz..2= ?E􁮀o'-#! &8#$ROT Te*tqErt)CF~}َ{Rge3x2%#c HV09Chfe[ ( jWcFWt=5D+BH"ʫ|=a-p)HEcABF%GvC &XUsթ5 /  w ؗ⊙vH `gric,`/B4t[g=Jڹ v,Z ?zmI7ͫs\dždjxk3W~qAMǏ96,?_Lr >&s} rmH[gͻ@0wK@QPYj*'% k)-M"E:֊01\B\ 7ԇ4ǒb AwV/"&@ 1ey߿f;ljl9IA'_y-2jńA?+{_~REz D۬U܏/yu`gvjB6Rt p!5||Bsu _fk]o="{ؗ~1ߥHg=ѿG$Ok2`*f ig/=0bӊ?Ўi=Oļ%yccn~ W*ϜxDv^K/o$FP}f,PH#iN\N0J&k`=/#+m qw >wb%A'v0 aDuKmg͘sZe*W݄ |z 5ɋUa[W"C+br'* JtrJi+*M"E-x-Yxd$9H=kMbϯ-H"iى!  &>x^^k0jS8pz&ǔ>BȈgT@ݝH( vc$+W=V~\bh݇MZg6K}ΗkB`W~V^_ v*N%g78+yL8JS]59-G|r9.¬#{õvZjk鱇k=bHߡ&tDl5oВR= zrU_.//Р& irIyUL-w%`,lF-sPD"ؾc3OzQ`7d%B}e{#.Hf?4>gΚ!XA l%L D煎Wҭ%IcQ) kvbس뾁v]tfOU)u;?-{M"PM.cu*gD`lBmtYLX&/8ͅXF?]K7;8\maf^q"<Ot'NO9}51**N;] FD <\TE|u9S6=?ގg|CnU[YD|M, Ed !uh?ɵhGJ'U\-eyVz|R UaF2)Y*M2hY&41TkV:GoM4$VW> ('AXKۗhF ]1Q{8͹Uf;E]CZCܯز& w ނ;\ z[Gs@%E{~+Ы2&a%!hf%Da .ϑD>e7 #ƾSw;uvt7[]T݊d1,מ" !'笧OG(n9>U:NgArP(U &M &*Oeɠy%#x>c}&[QF* aŴ>?Hmepjwmҧ:uǗvř-w7Q)9-ܫ+JIpVƵ=?? هA,-YECf`` sl q7LkgN ?䷿Ρ}.6>Dڱѽ^KI! qJz7xH$tӵA/A^IPd(*ߺf : ᡊj >uX _a` \h%ĢL>@ xO6:QȢ@s&eZc@ivz?g%#47'ϓ3_6-hT*s(3u [!E63~, ġ -5\W-F,GB Ds}LIN*PT>+'o09=V{A-I==}1}79jS3֟, 2PW3?ğ+#{2kOiľy7@˝zhuMɱAȒKCh-_g%XNVRt\;v7ZoSA!]/L$n97e-xF = jc@EMKʪuR! CAd3(E N;Q0xt͛Ō6+XsE![;#@0fEU:5ډa 1yNvKw٦]ߙrx3Z)2~pH:3{5UH ]e7λ$^p߳a[Tm0W+bMi{cS4F Z*:f˾Nj'9 ^H@A%A`"*2  T AI+@HJCh( #$!A@R"0cQk0&̣V (?Jɝ_}}~Q>o2e|TdE]EBQP?ԋ߿N!f'Kl+8`ƴq:`wd #NqJ *.;h*! @цɩV1,@A T(Ѕ[Ra:uMy<0z4UNOr-Veޭ~;0:|`x2aX</G ` rÅ/bҊlzRpe : ` zV=nݮ'^CnfX |N4VȽU!D X .i3_>?t0@!+<(P&hy]L6"9PR@BH(Fޗ5$xѮO!Ӣk {!l9,QIE(`vNHQӳ +u7+7JGP8ݯ s0i}?!g 0- PI-p @@-D D@VEE.@*m9&D s0_ΚsP[|!1+Ȑ:/MB0]fD [] tO_#Y'`Sդ,eUy|g: ҁ.ִ ݁T#220a`X\i|bmM$Z8ZOɮ@;"ƟN.q wee-okăl4е,5i<U%]܆;3MHR@a@ B+e }ɽZ_/* T@%;i-/.2䩘9ڟ:+4 ;ݦЫN3!V"uҰщvZ,]ٓcNV -ꬡtyxp1#azf CkUYw HA+rI%&b>5[s5]m Qp{ij6i|<ݠ?* {˹ǭ'T]4O#jk)FJf壯o&(fABY!|j2mieǷ/H h?ljK!7cV;Oxܿ3!mD'ѨjrfxvwO\oD7Wdc::&gRjun$$Ȋ`Ȉ2ϽK\frWpN,'nC?zmn^ÝⓕR΢=+uOg>3`dŷ8@+ ow/nLzTʢdcfs% YBҫ04IPaWcx8)Q%Ԧ0U΀E\Pbbב[(WwbP *G 3BjbWSzk[TAi7AhXkoTK<śT@cɻlƯ)\؈ʯ!wV2[M4H̀Vak@q+@2x"QG8cJtޖ!- #فZKJs `yXDP2y"0/ 5h|nL 󳌲.5@Lh]@3| hb'C _ZYY8 x ZrdJmΛS/_+}N(hU#fhZ? 44#`~:a"A:L1ᾊ;Nۄ@|d`)k]Hu%'P[(V^V+O'ܑZL7Ui`GR;Xo0_ `$I.-tU7o$ $ƅgUvI!fJdR'ankl\f8@%*/rmV|lM#6n7;mH.kڃq>gkMw ̖3vlF-{D20ۓd]- 6D)`YS4o‘  9aȴ?F*q?j|ZC?G%sNά7@d@C)•#9V}񲹜r1W?ƍ>jj)ԴרW,j>}/Dx7$ފ-r ]b O>ݕbKHypɴ_:^ϡ=P=FJt)V'SޏD/hᵛ{zꃉ7ZRUu %擿E.>oH6[?+h@R#"%x^n&P8au*L|sz#_ n|~;],;7;ȳIh-<IE#KsvٻqDU/(Jφh˯:f] q[&<[jcH+xr( H1R(7GVt9t1HP.֖S7pV觾Ōyvp,W`BkOk}?brGHعyc+6ECb({H%ӺSZ<m73y3x`!_UʟʴR;3s<J7A2FV^X<3|a@x"s0"yu[SF7T5ޚZ'FF/vYկR"ܟp,(b3Wy#%FSAֿi<,b?u<'{'~ߟ91.(a% Ų>%U0f@d_2\Xc7G^_pӂx90w+P' nѸ1ie|W1~ӹDhЯɓSZZ/3Ɂ9MI!|/ֱ,6 y&mΫ9{[(I\ Xxr4X8[Q9i$ET$:IGr?/m=9 渚At\CH0jhmWT3&@Q,:`PL{luGNqb_hSy:"q(󎟓BC׸e/vwBuAI uJ&}H8!W ߁1\=}dj [PV.%[W4c~M09t], h*kMؤ_"`=BۉℝHwDi(C ܎k&`G!P'i=>"Me=U ܖd)q ˴;?X2$H?< B:P. 0PT T OɤGxoْiFL͟a?cj7.wW=^|G%3k0:2%I1t/`4;l B p|^/'9ϛVŠA>sl鴆#'̦˨/Dx[C+\ZО~"nS%,Kޮ,qViCA@}`Yoa̻D:5֘#mvNE"<҅4b舺Y7hOAA߈=cPp6ߖU#Qpd@ 2(01GEkͨ^Nz)2|j*#,?9uݿIjĻ3oJrFhqYo*6D7f=$ICP歋ҟ"*1lWO zחyAJ!ʾ6,(.+;OvY>5_1GWl2fs@@s21’@,Rȃf4E ]C/aGc% ;+1@;U@¦VDءJ3zȯq8Rh09oS'8w}6=vZR?Ȩ@;1TzU߳л:Ը! ImTT~OYO / )0AM`z9V3_dO z  % 2$W힜/ !#41Ml2FKN&hKwh⛶WO3SkPGƶʂ`~pcV0!~y\gl۳WtΎ{!3꿵)v4jl0MKRMQ&r5f鷨ofnva'sejJ ce<5@ٝvgmLF3c.u#egkHgW}L/]&(酈}Αw#v޽DlwhC\VU Z_cɹ.+9O\pLH畂ہ7\M2])ul S ˇ/yO-Y+*!z ۹Iڗ U+PbJ$]:"@aQc5TmUT>"̖"Q)CiM <S[Y֫N.8F5Yyt'wq^)n K øX:ΰ9 B!b@t^佬xzPYJMv;}!|CΔ)KpFSgڟz Kt= }`AhFЍnm?|eNa76_va mB*rdQ4Y^G=lv` _{ےB!&&II,g Tw.O7Z_[5g s=~}<Ǵeo71{Dg ' E S<gMhvVٟWFgKIJ{!cg|!2)pp|6vEo@xw^Op,moE6 ƭ%|QҍC7Xj0Ffxߍ ج`r9k7NYoJTꂑ2al' bmmPJ:N=-ﭳ\2& ٕQڟ\P-(P+h z7VSZ.tP ̆NzbJOXZX8kf\+Tom;}ޮ=l-6٦>q‰| H(2}J@Q8"ѻZDW:B!jw4յD$`DĘUT D̓ XcTUbMMM*ȗd,x2 9#`29F%.G}p:U7:6\Ht,R&]EG 8,:ày1;irɀ2mT S= ?%^^Czswhe,r`BFELO%FS<΋(\&aq85bpM7麆ViQ<\Ջno)VMqI_s~t3͇J)j{=Yyea+AI yMyQ,FYVϗT99z{$H#8wa{G%Pn(-j7&VVұ`ШHcUꖉZr V f@]H' w '=㠉"(On90PȮb\3ao|CTɋ ãgW]Arp d.z?"MFOxI(B?2;fm]{Wzx(%wU}SDp5D@jߗ,hix4yB6 [ZO2м!<t_OQ[nVujF=}柑;WVۮΚuhU_v4B hLI"˦Ciuis8TڃI#:Un+Y29 _Dʾ.{NoR͵yHd J1it͹\aVd`bK~y^dn\()-b4Ẽɇs|f}.OXMƄ<%;{!A1;['ʼ8_ӇuWߒuw}-x:;߂OE)鄥2{d43TXTL4ff?].|i/6:o@Z뫅oG!?O dy OA,HOL[ Ԫ, ~y%n |M]E FfHB/I&-@n6ʫ]r\hI8N!Xִ@eQ:^wܲC5Up{\u2*nTH)+O_H"8-xvDR+P0R=t@$`I*D/V6- %Q4axv q۠]!xY՛9&q%y0iD[eEZ=&?c~v9 !WI@ M=)fI, %(o"M>kz+,1#s]A{Nngi7˦ϟ5f]yQŀX쑈nDZ14Il풀t.T~v=:<=" ܉QaET/u ͔LHV6;@(h)E7mKC2'0P,$[VӥQ.@P51gy #Ȼɵ Kb SUH̼pM&{Iqk)D}P}o}ovPS0r>X_}N.D\D&0*6׷Th qcKa~tۅͨ2`XX"% oaFkAqsMQY ͳxD.%@+NڎD\@$JG "(r,QDFtDFpg)4wZSrBNF٦ɪRA $Lot> cZ~99}]zwOwc!.4C){Ғ>)*~谶;,e1Haj&W=6C`yt J|vyoVrޥ{QlɁO""Ȏ°Oj^0&IHBĀ%w~w.^M'w8މL1>|x?d3RlrȧOJ{S/&ڙF,u<|Za[׵_lV:#z% Cn4TT A%Z\B%*{hTf2EN= 260 pWY}(6.N_82Nwr/svgHlqQ0,+lIJVgc=,[2)P!4tADC_̀ycb#BX*lc$dr5)vp9|~tgn 5rn 4 !3Fߩnq=:C[פ=hP(HX /%b~ٸc~F9VQ K$cW 5+@u90w׋QJxtx}6=@oJ KL⡠ uנZp}7٤vV׌ sьI39/Qhh{TGxF\o_jWɴUi/S 9]ykyu%ϥqw9!wXjWTVC7N7zk-4|OmB>Jpt@J6WRr{1o68R"vXADЋ"@yשׁ@`&n?~5c_~BHm>БH DETV8[7m'n~W. C$l!@8qYCX3Xha|Ӷ簳(阼-"9VڢIs\+? 3E xHqHx~7uWCf"yTb@Y/? mc>Oۂ#˂p):Ĉ/K\⋇NY"(&q$u"*0D+$uF5ΜȈ1"7_5w, @FDg=]Ue[Ysˊ7A'Jl?,S!Lm@8_ϙ\s &z^g/6?Fm 鮮-(#5ۻAK;Kgqi1UN[{4ɽ* w9r=G ΏĄ3w)Ѫ_ݓ]v%xT+;FE_"A{0B3Z<1C;j]a=="^ҍdӟ8,oNp_=+Lkf G|xѳ Ol1xm%}/ go}lc<7Y2rd|<֯ bUU4]{\P)}(dЂDDŽ;#Ou۪ 1ضCM1_ |cckdS*JƦ2FM&ْ@pfx|Xcٰ/²1 h_+ϕ0b1]1pqԾnY.uvyiZFʀX,? l}j*w㔳)=sB嘻č HD!a&@ bdsr\t\bDaڡR}.(Aڴw[qU SȘJHb A_7Ǥg֦PO1 ~=QS7:IA@V,b($! 2!$E QYB)0Ԩmpb|oq^O?1Zo;-A8£>0'\+˂D&͐@xo`? c;K]qd5/_DG]-΂O3)dZuYn!ݒ7Y促b^ jiPTA*Bʋy WV\N0Y5mi&C"k DiipG!D^*T(09 ڂ.?Ţ!{n1".>и?TxW7(H?uO_*4wIrmE6Y~n4r-9|};?坧(PC4/ v;aR'DdR DT& #~@!G)'(/8y%aXĒN# pYFAIa O@uL$+ cAubDAd@TX%`$0*hL=,ch~M>)pq5 r%wO)Snz(,9 t/]sbYղ\.H9trkV+b)nO$|hBE00.~j>Rw#4N8:(*b߷D㪴{("(B M w\WlCsP~xd_^$W5j7=.,%C=j<ۂx_;ŷ @!"DU*(-Us]gbknu hT.`F,2bnVB X 9XD,Ul,H`L= Ɉ )#{ D%dcU;qy# q~" چV{3Z22 ƞfcAE_8֕-`]*G^0{H vv X@vRc巈 H\ +v&mDg%oe{堹q`epp=rxE! yDVg}@Z0.7yݜ$D!H" X UL20`#L&y*bPuypܲ{R$AezF L:v\Х'Kݱ/tv PduYCc*LQb{r)ձj@B%l'EL*ZnN.3r& r|y33þ36wn_ K#8bԪNL\fK/[ jNK43ab5r┈DAQGhu_)?ҿ}zZ?-'T)Bo@ \ 6\hK;ߢ)/XUb>?oɒN"`¿J:Hz@.>ig1pj0)4BᏪЋ:?~7o<6>JgJ~ۘr)Vq qyI =koQѷ UNw4 ɪȫ1z]:^/_Ï_y=DY.pFvwWP9݅ĺ9!_{5qOw&([hO@B%2W|e3#]~6: [Nfk bWP?3;FŊB {/G\ slhuD~# qxSv"UF}s̡FYe!.8b6 2E&\I~&hucTĪJZM8ϊ:I[daZp@uZA02rGѩ HM2g y6߂[޶O-RH"YeL~U{3>`ٛ !567GbG_k!Uً&=嗙khmzMm`w=K~`m1l}Ae>k'=96F2u-}bo:E}1~&.O4$hg@9C}ђŽz M~aV\+IJ *_vp 'O^zs8PX9;IOgF[ir y'@ۤ)(Ϛ=oJF) "S?O~^g# @{2%2o}}Iw[z8ߊ>sTlRNTR  BI׸TI3WE(vGi[a5f{;r?y="DF gGV D"DQ0>zSQv]%?`r)3λ_l}6 +7|J /'ʼsYB R2HjI)SLV×yl&8f#أ٧wG~ [Ni%">zs@ Wh$>s %}qNԎvtOlK+6X1) *q ߰h2P) ^c"b >oEŲ E>S:5Zyy[4bJ gr܂+}Wm.wDgT7rfۀH(iە@#2J]BTiANZe`s=\Ų=z?MR[o~NQmdvns$9mE1de B7SQ3тy^fkn29ko*EgP+ᙯB+.'Lw׶f}E$[QR&SK)-P ._í ´d[F^]ou?f)bD'/|îm~4Wѩ0 (4 pi+,i]Y& wO_) ܩ[HV2[9AVr㡖X9V/TW0:'[*'D.2a Zoe:6Al\8rh/5]Ea[4$\a~%0i"QW03ɩǦ8݅[ê[ dwT o`bxܝWX(7qtKCSqD^ ^>"K'O% OT'i,Uwx;BW=uKtjNvҥ4q@ w㲩JWw;eј#PD"1zNZ뾒fk$Z #y39B͈^}B!De6 6‡!'$t t!-Uy@SMEB{tN5_X7 ~й $ۡPyem0ϑC?ӟ7!0W&&(|*,W[Y,1Rѹplk5u3ݵ[rq= *>YPoLk`dbN2L~I,pST~[(t}PWJԲAЕL;E40R[(Sh pW@I}Z3r05 F#a)]8D(ʙveA(U|H /Ғ HI ")cmFp6xJD2 eH,>eGNgtx%~2Й|۵CԄ׊g/w$~;~FAd(3#ȂC<MkH~p{E7=}a^ɂrju*@>RFv`/6Ј GW~"V5"AicW DH9DH>V|3?z6(ƌ-yt:0tG::Q}P߯9H8N7F\!uحr/߆JP}gÂcPE% AI;-n_o׳Ci {C2-o,H䉞3; `0`$TJRIS*.~͍ynGkYMN.%|vnt"db"HrNu>Tѣ~~iVb0f>-kg\+Uo r6zu-𝟜59 JwI=D%Kޫ+eEQ2*k6,n[,,_A_yj Q[%1_HޙGzG{)B]ےH/zmws(EY+#@\n'D}-869BΒgVX^j|J]Va-%y(t|k}ʥW(kdb *ky:'}>t! b{NT($`Fw7*<7{Q!Fx>Zzrp[ӫeLT_2#><^™7(p1@b0RáC2?ϨOMWb59͟i+ϧ?ǽU!>QߵBi" 2rp$A#?| fi.A.l>>--ʅ]0{ ЎD20ۻf[VpT>iai*|32@$$%/7 #!^qWB'shDU01 nJɈ@좀J֢Q Z6Z!d_AwzXx؀Q'8~)`7"MXK(ɹIc[**OjߎϘ'BO!CAz8Gi (&LS^ &I07&vħ/noz"?w/'<>yV+/( 4i/=5>2xk(` bCzcTIo;k8uߐ2&<@wU`2hA'%=׻mê|D[ⴸ5-Br0j(lH}0.5)A2hdcNH>ߙ%`Fѹv? ˀ`4X k4Јqk_)A(3ʋ8s1XL[ z58]e( WZBzLɩ)0k>gt/bj_Iتw~v>31AI|s !0وcb`y`9Z[hOv6Rȇ2.=xz\"#<ރٲF W'М$\}(D#Bh⎊N@(Y35]47^ 9y~LI+%`zu_@(*5 3h8`dRP[4pM&XZuf*JLӒоe]sH_Ip֭ԪpE߂zUN{i (d_D\dz9'Fl 8ha'!v&UhKIy1N@DG7m)܃;C)i՜5V 85UcDag·b!`Ϸe?k0jvXwVKPWY/r`gFB7vo:%#IMCc Đ$֔ΠvGnkU O'[lvw+v'_[>9n CTFƜ2̑fGrJCcr)F;]ӏeJAQ4>~o0#\bSH9sb siˍ>ۿc̨"ax4H-Qq|à)Z Adm3ܜC#K+yFFr% _[Ŝ!SO+Wౚ֢ +&ߵx?9J9ϚhmI1ZؼA q#N3̭Ǘ)Yqdʜ<<儅҉lD}ڡ@B2_}'oSmPleLNJV$ ?إJ9LϬl ȺWpx2dΗ*귴ξɴ 3vÓ7)-ϙq6*"(|X;u\ (C@> AI>/h:>c8p\-^^\~ @1 (({I& AI Hi$<ܯf Y"&y9nJLm~^@f! H@Y'?,:I`HY }!\k ((c)Փ$!P$X@"`愕 S)a6dc$!`@AJԅB( X $v$ 9>(@&2P8d Cf&nK9${3orZ3J-`8Tb5[ ';p ו VZ{[cl czX1ZusoJ炄v 7§) (ChȆ> fQ Ǧv!\XqK`qOzaH7`oF26nf?72*2t0EmkSĥ\(,;-Og5>r)R<)S`_kIpGN4lmLr7T_Z5p"-;{|j60\h{[- tnJe0kr+&ApozG<5? Ze_t~LPq,uBp_Η?*RL&Km&3whƴAoBu闔͗o:>p)8h}uK_vTj$&wBaO+qgwЇ'q:r8 * B~vM~g#1M-LJuSPGn}mA.^Ae{HB"~l})$KDةOE;&T@. ?GЀQU~ NH!'5Ȳ* weH(1X9yA`C!*$FA6n V C~J&!`~ȸ N0ϫBC*_x~$x*}| Mxf(ox.X3;sG=÷x>.ssw~˷`9a8/2{m>n1T<\eVF -$;P gr~6S~=l2X=/m>ȶ2BE أĵy=aǏI$Ì}@r%-Aa '>LHiJ,!\܈Κv>#L|\ @a<9jYb`:Lpx:̭Y5?˖.02^E)=b6~)^"t7+ . + ǭQI! ELv?,e>ϒYm# l-.6T4.z~桶~WwYq7軽6?D [lt>b]@fA:8s|pg{MSОM1"Mmjr$nmf,Q͉ =7Ix@xoSvYe_k Xd巃RKH (^H`8ˮ4i6ZN@4 ",H"TdwB 3 7IH AzmX6HB@F D* J{J;894`fH$Q*j,PC"lwH'Ỉ( u]E+qq@yO $K+B zp\^82Gjƹ4$T @Cl!0@ (m t18`Zi> =_&v%)L ,g#xpj(Q MƌV#F (BԄ B| U.iAEBFUb~7Jd:Gykff' DdIҦ#eǿhmnlo:V Eu|۲R<bO+ݸGi/x.o|EwnرkyDOٝg9IOk e&KmSP49|P*cn)Dg ZϢOs&?T~~Wd3v$Q 8IJvv=N~גv&(|{J+ 5q(8j)j&(8gp^W?Qnw.dYƳA%I 0z|,B!ea *csl fP1p9L6!an1c,єŤaM-i6cuGNI/HVܣ[@\&8j2;Ռ`M45'O>Qǧ^|YNaxdVàGegQ"aDAH.dۏ qb[%AǦ,9 K CC8:PGIʖkT'n Iy` 2]Cxzk4GNi|v/6T?9y_بԮGƃ:3~-"TmђRwUZnuLqQHA;pYi+AqX*C@֐Shv6ε+`d ЂWK?qE X9Yz 9R"_xv˳ ;2o:2o! M,swj䤉Eϸi&]owދfffgVX2r.'avcl1~jRAngXċp*>-r*(rt ȗG}2$5 杰“yFD7[=BH#i!{>s~H~=޾Th[D2Bmj^>ӣw_I9 a!nu|FO]祲OGlZ'քx޾tV=2u+0*}*@5Jxm+jx? `f l#R45lfN'}\݌,9-#~KIEI`,Si_]NAX%ttm >n % ff"i%B98]3n'?Mß"p QTG;a?Clv_6*SaA?Jj1"(shJHB ̽h_a $I `xH'eЃ^T~0ReismMB: HʓvW~Ӑ%᭱Z;Y*I^XalPh 3xJ`EDjSE];ޒTA՝gÂ6UcL1AF!U+MK XDPդka,@k\Sg4v<Gpd͝v; dAdVX-(AQB 6@ݐ k$(ĂC4("TUb롓keB1 (I VdfjQ"0QAUEaPbHH2Dc""($w35壊:O!YP=~ u{KM+b`I٤GJK7mӪ Nhw*W jz-2C-R0~ F[2Ep5ekPv4&S_7_6`?UY\\Ph1u8r"?E'i4I͙[\0>[=0/MV)nТ_ Or͆,cKK+Q@-F۵+ Sn#gT>Ӌ~/*dCX},Ű>Lk`L]x B'ȴk'(5_dVq `ZJfMܒC[ykh  _=_\׺ҿչWrw?1.ṏeyj!+&?> Cs'G4}]e%olk hV6 Vb)o:]+[;:쒭MAo3A @ CH`C *E;kS]QU H`YUweu_d3hd:"eƉ"LQM ABPш@iPC5Sl1ͮ-`P7"aͿ53j0$QB) ǂy[XO1| HHa$d Pߤ(1"1V, (x=L7N #zطTDh8 {_1I!!m3 PS w44Q:k#c\ޛƹWΒЕ Yml LarV6Q7QU-̤ ĥ0z4Az^ػq!vT]fymc0W 4A`+I `>8 iMKORy E6VZ2)aM$5EHHH]/^:el[TjY 5̦8".?ꗠH/E(*k[%_wtcWQ6*UJ:Qj6!3c *l/ةTM-*FS=Ըz9u|!볒g ?|6`8bixZp׊-_ mWMH:*Z  ZZ`W."景~JZt vn33QSzsZb);>W yHλtFMu|}wizwt;.6W]My^dsJAA0`(x$T---p(J!O=^UV+qQޓ7:PU&HS$NܕJW-1taKu^s1䀑 @$h0=-iPYfkɼ LB)W^HLLVtK&_0tJ!:0 '$[#4)61ra''kܼBQޤct*rwlbB6`zt>Zϻb{!fO]5ҶZ_,BӖu7FH0fb(+C8D tQި["?@(U +꽕Z0^;~۷LmF,@U~_۞QDvKV?ntӅ{oI8dvOMHgMHe*|xG:-0HOb%ߝXy8Q /2Z.cF1 HwƖPRo\^yAI$@'i,qtX<0xR]\ONBqftYӣ6d,shFy=-¾|3/|ޓ۶ "2 `T)~~W@sd9r j$d˫i0!@ \.k$ q:~v7'WQEF,UoLaݹ|[A2Lswsmk, bMI;Lb9.fD/Q,)I$4n8jJpmYUv{MTS+Jt~Z`I9yHƧ?f`UHK# Oz;]u^<Le|}_N@_nhZu5Ʃ4n Qf`XY$]BDH{G ]W^.J  l=ZLΈ(*hmCK5 OYGc*)R6z)_ЇY\4A'/LD*ܐq" ]Ry` B3]7p:&JiU[XHs35ZQ:h\Cq(:n[EPY af7nbڽ 2;L_3'G{No$624xڇ,[lX>{n#۪HϘL7z9+ Z[K|?D! JRE `3\r/%2240&9Mjo+OXs< _=ǣ{Ѥl*b;, OM28: m}Bv!،aA^Js@yXlIl3pZG PTdG¢? eB~M<,lw^watD9[:8S *c֫6-e7́^&)M`8("!D"( hϳ5_CB{ϿX;3KugU#0S?ڡAw˄p:=M1uḧ۟LPpChѡp|+2BlH0h<)sC5_K9#v9O|{! 9xþ>KA4gVԶFY1ڻǾl^oψQ6@(͔EZtSUظnQfXM4l~RX9eUOSDYk i.A{%xF HzE/D|ݙNmHw'dvY&&J otmI~W1-t PQ5*<˙B'("o/3E}ѱ;w7 /=!1D)>ST" e>*JSJ+)m\0wzs$?/\|\017[Z2 ,qvH{4nl"3F阿M&{J/|Eq˭f]Ol5$XHI ff&qx/x59S oev]|W,&ͰW!.ZG*MJ J]1e͛޼kcӉ/&3ӁY|Yfgl*/no zfDb"@fS Z-([ kœ!դYMV*~x0*|vU n0}NUk0cYT_벫ՐY71E+jcQ( L,-,%& ()hhY2J2Жl J PU$DaVj ,,V ēTUD"0RVPP( PKt6Qr9N` @c(F E"Q+d""$I"vxxi`u[Gih(hs @oЂjF(IxE]nϝUc⦐6.tE@+h> GA)_קvU/yލoۄcT{π%-2xAL)s6}!x#6_KdEiT&+\Fu^$$a/tPIaD-èaX(o+%`p}(Y;6yW)[ds˓ D]o]~dV K#$dn*T@X H0 #aI$*0DaV|DXAD` *T -G~Km*  Q @.QEԐEF G-ˆb"H:(H @`x>g(1XPQ 0HtZ 2 @AWIy_}=3NH86 89T1<#uMW2,#s_'d`5Hmt ~'zn1KQNk=x@c)4>|PN"4&HKBIġh/MeI}:=A%9{sȋlJ isn,}§E rs‹,eA77/ NcKJpYTg-dQ ogWy5g^vSNESFʘ3\՞^n[Ȥ_IQyw+ewq>cBzsLHLg}Yc5JYkB]t]8d9H4 w+y谯J(|UO& l9a9i;u9 vתEZtP\ OkOb?{L?t㫪[Ŀ*,{t Y?Ҳ8LC_5?bxce} ֒v>2B H ^ ) ;s)v1uTzU5]>PܹYtobݟ7+4eˇΪqtSLa+J2LY9 v xьV}}F-|SՠxkyBd`ޮ'<&H#:3@A> LWl?M`m:m.QU3 TKt{Z1~K)F^{D~D96.!2s^V.yAn<9: ǭܣ+21F@Jڻb㳹6 ]q{tZ\Bx!DWF Qw"q J td.wK[C pc)zOkJ%7b2w|=ߴUs}$5YʤJ-MD!H$y\28!Vfg>Hb;FA{qYu+aN ´L,;_96:'7`1`)aCjL ɭ&DD>L\iÐ$@;n)_/0A@nE8^˾JyHjeP,DN9y<ļ^~5yE_\GB/l,Qlɩgs~+ p}ENj7]9̘)7]XûT>7,%P`%R IΤԛZBj>ဍidKD+~H_FJ (Sʼ , Vy\ V<(xK!UņK! V4wQ.A+5( o F\ӧ4]̷M{ƑMZ9n!gXbI7R(bpT#?۩{^oW^ 7';)$""2;d'JeqbK}N <$SppS 8#t &\hrz;/:qd,OWfA$=dM )MK'h;KG9 ќq5ylN& k{ G t|@?lo=!KnX\=˔J洉F",%D{,=@=y5&X:]7L< 4w+{y&}:6#PfN'IQ:imr\;xpM1t DZgPӋMFUR?2{SFk%=Nf`B00d~9o28=]ݪ>Ze̔A?7O. 0W >n{@2o83fӔ1H;ZA6-Cm6 fֽOGC&fkZ!_F7EN/08?TG龇Qa#*JŠ04 0DpEjBA ZSXm$5h*p,>M; 0ol ڼOѯ(ĊFC{\FR;2N Fr{XPK)ke&RE*$)6IH1Ex9!@~-ݤ6!#\!@i^Mh  ƒH9nrmTNG= تN'>ppVt;?ә.bH" I6!$>;d26蝋WkӉPadU^VQ3~-VC9K""@ҳˎĔƄH.0WqKZƩi j3NmerZf43AD:S :yˍ[hb3DI[!kDM/mL4ovp}a{pShBK8)P 1b}TQ>f=Tq5bN8oܝᅎ-Q0"֨W K&o$a2)a}"0II*dj+Tb1iur04L2L$êސB9h! Ô2Hkf,]s"I-/8E@%lX~kߏ*d_y}`;DL}$[n22Zn1@a G{O$*{ɱ0"Ll5_,40?/[i@9ۯOc6J>ۜ*u%?ݟ߼DO $iE$ڦ ?|df whײ?0;'_wڒ~1J$?2GMT []/ {H?zlH48 zBȹuKn^<1_Dק){)vo?.CCN|4# 0>)qH ߥjTRoўIg loi(O-eyl" ՞px㡔?׌ Y ] (]V'*g,yz * JgQPU?*NA`GJ[ؚ@Ni8EBRj:tl]HU{-{x;f&A0wzt?xb#o1-Qbi[y_.?/6fa6h2D ҭZm`雗e DZ&H+:yկA2eq9`K|;I$v7ndMƇ"d =_4ab$˜-- &,&_F7U(&|AB' _cRxi G}j h@A ۆ|ωl.mhK "C|R۽{~Krz=@(s3b~$yzӦb/H]EDef!<D}gv=il ?J?v< 8 {ܘhDVCqd,ѯTƷ( 5.Vơ34C'?P{e HƝٱwc<>l_o7t-#y ~Gn}{NرK$nĞ^}W- nu؀oV*FsZ 1v4cN G:Xb2s٩J=̝}2:*9d.[{^H5ݤiMt=>u_-:ލ׍-aÏ -!+jT"~n>P6{<4v'z' n(SrIV= &h%y1VI&s7Wpܓj ŬhR+mb2ºpiR9#ѻJipʯ vVf_ʭ^[HO\Gs̡J{PJ'ۭ<;~ͱ!YAkU8a)1SK0AqE(QFeA.!ŀ3"E2&b~`r[[XLTFtGPDd"$"ArhiŒEҞ S*m̼,K9͇Q'y7jXDj{ RݗK+ y)jR~δ/IFA$`j5 3'D)Fr^Wyky/_`1!P9A 2EIMh &{8{^,?X)\G ?x T½xOr{]@V욡9,,sPΠMG V@4oL<;,aÚ*ێO:lCg58PF[V(4wbMv!g@ @ <*jHY g)9Kri0 ߈]AfX ee{&S'ϧU$a6񊌍TͮՔJ*̃z aJS33jM A;+_%)8$H]UX¬Kd΍ثIq L.U"9or[[KM;|v:XI ôij9ٗrh;غABV2>z"F:o֑tWQjYcY6+o jHēQb,P6l>8RC$0YG7`xסL)ps<a,ebC" }σ}Nd9!B)yQ*ӳ!MT #~f|LLh?` "3&HNl.c g["FwgO8zV8O 2/hB=+/ U*?<'鋃wLYaFO+x֩-9٠Ov\;N vH?^TD{՛.I+gCj=dPLkm4#$&>"@w|:YRLS$]UXӳv*b8sE.USkEgGQxc܌Gt=\ C"v,2MΝAӷp:,_8<-\ dʦF ܲ@?K |t:6({|~ƹSl 9ׅ7-(AnL"gcO[C uBNNm|Gg%sS͇IPhOh7u&~ɓ>O_w =[U^ Rzؖ8311%<2`bJh +*OBOqΰ唢N$m"SN&CxVX}/\Y;-8ft=n O nVq#dґ)!ԶS(0+psj&16UÝ(^qfd`ޞZM.ikM#nCi$  1HIf8J}_<x8\=⢟tF-ۊx} 21a#2Z IP@7`+>n H*M'pAjGn*A6}޻-]+;ϖ녽Xm+H-ij)nNUI006B LNn4AJ^ B߫1l f$8 YDRE;Uؑ9'5>cDc9^,͖_G|ƎZgEӹ}wqA8N)7=|zu2D9N({dAbvPAY+ށD_hxd~׃ySi`&~(4 %zo&݅ 7Ub+EV?Nqק=X~^7rhY !Z?[% s];.y)W|ov[j9n"f ?rϮ$2Ruh.vp5ZGX*y IҬ#O릒ũx 4㏪D7ЛI:=zI_ZV^, hA64 X{ec)jV U$ zf\7.3.|Ec~Kң+yGN.pHc4x{8$*RSiL"v 4 B, 5z|}z,$7ʧ KOeŢ'!!yͽꁫ^1 "=G'ʢCN ^B/ȄGIN#,5cUAh87@C$ˣt8S}6/~?boSK<(HA8. ;"]՛嫦0Լnz0,U?3@Fo wژ'd[^\=4mˡY+* @(8j\_GZw×ȏl.$PYdd ts|u"0}lIFw:؝/kwɮ"뷳 2<@ ,bX,U5* ceOp6l]0(ha.cb&AYaϛׇv~&ႹYhV4^[G2Wc3SiBsYJNf-s'e=R_k]-P/^D{Y(W ۢ@FQYmx{CN٦.nBn7٢0K}^²'fʃO43.i{VcO&GzQ{@1*}_k,V?~Vw*> P=U6 UD8FFG fٰ̗e}1Y*=m>!rYIRVVߋ!{?dQv @;A'"fӫ,Wl l4ނ ^-Q`bz/36^<"Y/I|^r>23_:q>>C=dfƁD~6LH2f}Fos͞gq,I!T`P5!PA ?o~,`Er!`X6+tиDϳUb`R0 ȌQ dfdfWU|Wӝ_Uui6Ի+|qO{Ν!8z'wPɸ7:U}ޘǹO=$A;<{~ޙ2a)u'EF [^&V&: ʱ@,>Z:5Abhݟ}@.msu,Żˈy<(;c0"_!iok&.L@}u ĭiw4fb#v5 P<egv4 ^IcD2M TpCFq]dPAqO8 1VC\ rub)uJ#YS6fANPuC7̭2eVٚa٘'ӽ:wPk, ̕layDѬ[6eSVkH ؼ79K=k5JǂNڀO!;!RzL|I3fo5hh\M_U6xag炧ii&'|dž33y3}`XHsjt+shݣl*ZL>|۸͇'+SɌ< ?Bq@Oë}b)CS2P¶wpCc憪8ܫ $}@GL-?$qwڂ;uVl>֩'-W*ΩH!*SI` A C^8CH("1^Gr K "s1|x́kGGs^C'V.0Bo*j01D`#Q`BX TNȪadMT7\bb%-K:v_{ʵA3kNoTܕUچE4\| 7 my77?Y i O-~/;"u{=Vp8piI落0CK]J' 3hr2{cR,!V换3L?_?ڝ,U ̊[#οg73tqYB >~#v)@(8",P}(NI qHNL X I$ I0V8#{_E=otPD}$$ϦgWA`ז!^ D&7"7t.f*M_HOgb7=U66Nm-k lHoolE fA2@%w-P(~RPi4cQսNc|X0]#Td`ѡ߾m"p\o]qs+F~Bؽ݂bQPXRIR@B*X$GWOCuGqiz=}POeERuO>4_BrT͎smhQbUH9Q3bDY""Aontnl0+ DIUPo&:*' CIPߖ^b Cy\v;1㭞<] ه8Ѧ,k@e`)d6G 4=rK9d+;EFd&1O&2 q-wJIJllzpk8#'$|H$;[Ҭ^vYUNJ Ŧ\(}n4Q,1m#mASFdFY4揗fEw2CoóɵEtxKwPe3Y :f wvJ(;cK졇CR^D4{~X@yjpp?_j86?]7}:Qzl03g8[cA2#!yUd.((xqE edyU`QBZ:; Ă5OSRݶ顃+JP](f4+n4+O`y'Ӡr~9oܠ+ Ixx ȸ򟵕y 4v9Gg>UIw_]!b` ~<!Z?a=, qG.vAAb^1~vIQ`ag(L;ʻJ{,PC SA\ȏ/ID>BW:Tx12;SɡL?_h? EYmKK&f!~mb0.Xdmy:8 6,k+S Ҷ'a86}o@76vۘ_ZZ\toq}F# G:d;_Kʍ+ s^OH$P&֪C[m}LW|<>3"!O^)hLa>ܳbQ'~<(kh*9lȇd}CYn;u)@V%ib 0JM{@_NV2~%>/:. |;9 7// RZZĝ]R)'Q?wZ/33<ҖMb>޷O|0̽߬ォJ!n>e8"hsPPj92!`n :H 7bUb@QØszIFoNgGnȗ: 2](ӤhY2N*kiě# m)h+$H(_ '> DIaAN7~|oH9h/mudJtŤR@7K:@/AI# \З_Xv"S`OYhd "Mh"u-W;~ፎ5?H!)qaa.h5d~?xjmr-T[7* ӧvfy>~:0hT[Ib+Ъ,2.ˉJlNFX]΁2ӽeE^+7"zeŒ& -Тp]v6w^oGEJ6 abt-aLBDV&U&#nhmk}ABhG.Ql&ŚY[^ivzeqJK١ jq"JP$K#| 3Vw%ER!ŸTi(`q1?O(ɇ_yk!vob{Piss\0"#c`? TsKpGˬOcK6dQt;!zAPWm9άCM?BSmV~Ӎ_PsKF+N{A>m,M=PGPy"h̠#ǴSӢ\9G)4 zdp9R`BBiWβ%/;#}A5A:si "lq\ .SrL NvN/[jFUQ u2Y %[o#a%P(Ƅ%3Af*8sYJ I5ݥGz,lA5-g[3@ sjs/A΁[Q?툷9xqHˀia~Xr"Hњwp 련AY0  SKG VIQEFEVY"22H$"ȤHH pS6;s4 [;x.Y m8 @@3Ë5Gna yPPX-ê7.KG'& xp?FɲUCڗۢix&Ԓ P1U +ΆgtT~czy6 7I`L'tnnޠ[ں>[ |*&>:hX/. H.3B`p65'Q~Yu8$^»؟29azv{zYv ׎2%ħUd-qRBsb8wMn6'L9)a7ަT]e|"')܉D(X@,:əeYYH h C ֐X"7^$D5EGXT:! t4UJ.G,{Ze  H( 6$S]|T]65>-O /;Hlr%Z۩9B D,ϖjp=^5PX%iHԴc`R ` ;p4sXDTK{6Ot)LYKt^{K;9Ůa/{T΅y~s -)q"(sw"]W$[4]jBP"!=^矅2,D39gq8ۯn}rE-\jI4(TQgq_J`1=+Sx7޹\j8E{Q9_ɱG2hv_e|ڇe&>uI{cԷٽn`Y{eE*F#yLap|jP܃.ۨ;l@lZݛT/~յ 16X՟_E[8Xt+}Һ0<{\ ~ծR`35:)49l2-&ٜ`b:KGȆ7` TԘ~pe` ûWm=Ē9؉n{._ .lB)uq]):ny*o%kԏv Bi\谠F/ӕ|PeMU~:J#RLtCn0(=~4b_bħ`tu_`Hh%rj$ssѪ`H'B>@B?Hϱ*JIʴĵ+ ([Aet_|:McD *e*mʂ fl" \p5@R1iኴ$6@4jYj)"'԰ wRM0DYaQd"&?*AaDd ࠀSs #Bۿ?@ů0h$X&}<¥3/y2Q闓xakFdU!QI,V*;m\9>Wbjc© ܷcdЏј: JAĘH{ySOvV1{ T<0A1Czhz{1&wdchDU:S蔪tWTx&v{;yAEK+Ή,CW (1$XOղXI$ ,fcoz{絝F6NfhnPѵ{gVTt֌iGz/BHq!U`REt:U L5*ϓ SUx8Wc7cd،s٘!J %DAwK'ba@Rzּ"6\B![  S^)Y$54"h,JMd$'¶)ga_ը>K.!!dt "TUrj'F>燝P#0@?6&3-{,ȃ# yZVء$DN DqqSj&|JHR-|o_cQgX[Pgw2MTLT cin*t}7\nA70ER(M$ LD}逸 yTl2`dwrSը;}ӤQ@)τ6lv8-Dtո;t z>1Y5 :[J-n4,UL81ˍ?awpF䓼KHb YKݧ]91޻G@QǺRX[\a EyWkyҭtĽ)bUa-N1ۣeA/o/H ZŭʆV/JK`0xBYnlVxؔ_v#Li\ ~ g4Fv`Q$fSf/X xybU lùqY8[ZȨkE?]t\rTS3xq$/m QR|VX\&;?r¤3Ez;G*Flj$d~͋%߫Tx,yEZLs\H#QF=^WyO#Zz+@jZtk"pMK_~4t 9#*;!ǛH(c!T Ksoa;N08E KgE%rW% 8peĒLxW3;dPi${&V4%` H.^(^BKz=e⇦U.Z*%ٻ 3,S*F/6v|Y]pƨNHŽ~lM>"0_hk_y*-\.+Az@ U o rvL<^Іn vQl ߆Y[ӖUrӌb[xlt(҈Y(UX&I9$6av AH" X@RBI@<Q !ϣQA8\c,0fbEۥI]g-F68VqKU `ݡ^ЎorHr/]Eaik]}9@4A*C>#H#SgP.zk9ʫ7*(S#H$lQYɂq=7IEM/F- "iq8j^j `h+!+")JA }TudQ^d݊p^'@YR)X,EmPA)(# EdPQF VV@B1d}M)4~BRH#Q$#"' -ټds SP1lpnlD w*Ͽh]OZI3&}EԱ }7&X?#%x45+8PLvrW6σWy { I&!$P + oD\bTA;H6!O(ExqL<edbɏxYsxs)8n( F^}CR+$,YE$D"Cer (!"B #", p!$"at$" \TuA\$bF7kdfϻC 9W-[ E_4/Dk;ZG2WyXXIе$Yp}B_֎&e狊wܴV%)"3ɂ?٪=&|"}Il҇ƆCQz E$=g^~gk?p񕙲~~d}84Kd /ņoŏOB򿓬+UQpiةrmp4j\e]'ud.)?7z"cozj h>C=X튲0z*6ovTͧ CY[>!F.EuGJ|Y,P:O8[ERX7&`J5'E}thGzF/Ν?4 jވzq/=2= EH~P>#ܙdO3"joB!t%]g T[y0DmVC6W,5ū=Q̧z5fy2U;Ky-̩'ԯ]+פҡRt'z1ѦG%YLc{Y͂@K"`2?h+"Зw(_Gb 屟"fnBK!rѧ4xe0/eޖ0Ú?_X0OP#*֍m܃Y8.KLiᯯ^}s7^Gm BqS 3@'PFgpbcTN OF8g6_a@315gR]wo$Ÿ{%N8<>҈|P?HE5Qd }mX~H"r d\jAClK>OߦM N&2]hE:(eD CU5I r[g$tud2,`T\Dpe}@ԀaW=e jJVcsSJ+\Wߛ(,*T_}~ĝi9qlS$8-!Oh@60<'Uiaxj 7VֵZ{@&b7\,}Vo:׆3I6:wƚPtU=J| 7 94=C{,=׹-Ur+_!wt]gʷUd ݠAfOi cj`*` 4IqU`םб0UB7E}QCbp+3=hJBS1cιzzp*vaН)v.~ˈAqus,Qe&"~mSFJr{H䝬TuSϸQrqfTXz|NTB,3Uͪͬp_>0鏁.]V5G@m7V痎RZ鼐pօVvܝm I#G;C;vZ܆}zj|Ҁ_N[GǍ@1?/Nؼ|`?Ck/}"$vjQX,Gq+ 7HH('mg%.%i<ۄ'Lmril~[+oucET%aCGO!0h0+-ea~&OW}:탭Z? 1}FĚجIoomp<^KV5l%q' ? _擏(1[ȱa!G0kxq 7L":%7% 7)X)GlR+VAƮnb K:E$~%!n_T qvv1U l7>q|N.$.V#Q:v,Jd?4>[`qW򢑐bd@;X, U}4-(xx,LQև&7(` TZCQT NfUlg04|WϭP$iw!'CW"~|7Okh暌櫮䑓C#t<(.  dQCsuKDc[&ί'7`PAPOkR[X<=츘ۇ!zx4yI SBI3 dI0:]1)h;d; DcA?g؏02 t+`%ﺣ󬮗Zi 2l+ps0ڈ1*-7n6U FD!uq+QQPYI栏~ɜ!b^ªE+(GKNH_MH ktQ+m&AlMi"IAP!Qw4368"Ֆ: @(XEYIzp73e1Kl߲ɀg&h'HdBX7PKB0MZ]&l^ߐl3n8K@A·MqݤxV_qb^/@&` {YvK`L.wLU&LPû@ݢPęqXlpDK{eΗ%Vu'$A6%J6,{lѢj_£5X6B7NxI%* MZݿ '7)M+U9Cp lb(H(PٓG~)/Җ*t }׹)oo ^՟315fh\5lLI܈c1mr`&D-n7&qZ&e m,pNAdFix2 $0$WBBԢS6 h ؐPXb梍\ua3Q@9O"s5M`PQf ]+n2%҅{T |&GCL܎#j^Q\]WD?lԁ,ԞGQ+5H |]gD>*-EXi@xV?a״]+(Lry'n=O)Oɷ7[o?Tɡ޼~N 5e' gr طS[ahM&O}1/1u9/D+*v6OK@(:=q u y7:3$y ?[xapGpU3ɓMG"$x}QO>20h 5YiI_XCz]DTOziо""x>d;\Hg0 OTN6cOHnܚA˶Ta u,)%HČTN  xwac ; dM51@߷ǹUR@DTN*qpAбC1ᄛZ)xǖM 7rokBN녺WI.HCg4ַx>jUθrlK4{ ,4ۂ0"A.i, i@'&O87u Z Ӗ+tyrKa Ee.@/S l?@Q< m1dUs29)3<'rvWZ+Psv 2RN&P +{XPo/ -4 Ws-Х9tRYk SFhF"KςP1G*D4b%@iK;fO7Q^b#[CV>yJ2/\{Tp Oҵ?UzD2 iH,ȼ[TkJ=:aA]fuVNӑ7h ֊{ԺV0/5Qu 2OXAH-4FK UEiT4TY+-5{W,; [K>xq"sS;-A&;S?0>-x?O|?{'$]~j3Yks$Bk<a[OWq8in2RA- SvÂ7Z']R"}dde )fg`vTr"<؟'x ]v6k/=2 ײʾbuP͉Rlz9j,[zA+7~]>\UE j_tȍ>k)^!&ybu].e(wꠎ (?AټpTd.nڭ Wݹogޱi{kpyCpZ ҹku :D EF j|fglN{= QzuK}gVII֞ $IL8S^E6\0+!YKbO tuX,w1s1ڪ W }v5?>C[6&ā. ҥy/N9 6C=*؅pDcP0TזU6;9pyeF~v.TBY#5Iw=F+ _F6z&NK/6b6`,C%浯[ounV?2>ʇqAm On d ٢u8z EM; _v-::BCMIwZ4 6.y; *ya{M:3:,}z R!" ѳ~S |'{Wμ6tA=Ĕ[E)JY`)z$'I-=(Ft7sN(I 1B )Adr=1 9j|i@ά ljY0Xb55yA=oOcBuw=bhuM5m|B/ ix@fS-2"x|C;'Ϝ9g$9>ZhNOQQF,DC%;UʠSyCHb)(p!/.B ؾ.+{wZQtH蝯,bMFdGl$;gCݱ/!6`)ٔ0gLPmLwi.7|7URo6f6Hlp 'A%= x'YʕrMebIAOSu 1k fq&->(K]<0@]i8BD%&XI$;pV,5XdY۲`A],ˡ eW15dۼ"n:;TC, #$VZ% V5)(j e~ R@B E!P 壐J#/8.ehJnDJ8+Q+Zۡh7r0/qkmP ^=Z!}7zb-&`͕>n k[J6uSV"&v7XEll+_0@zrQd)",D$76)FMRghA/3ayaŪpK5E8K/,\&ZՌyepͣ2q)yFY{<>#oPF3IJ([KBo;vq=S@fo5&(0q [ "6'mOuر,=CDLaȂp$4ʐJRf2)[, RIFc& :xy&sfò;jİ e,9w}zuSUvUϜӋ 0Z,g&ٓh63mrݙ쪶EbjN Qe'p)Ȫ;;D퓷@4;8ZP >E݁uJiqfBkUv..j5nvdKÙe鹴d/]xЇ<-s\ዶְps 9 G@ Hօ T(C&C4"!؇=݃:x9$_*wWK 9L y' 7_`,"^M3zn =h0+Z":%l'&)Dt@PPR!h=z\03ckBo?ϣuѤu_ej^72,z3 2.aD.f3d3i `@73B|"wSv/:Xk]ByUﭟy2^=r}59)%r6.cos,jGH:?Gy0=7rxҿ_]1_tlSzYCWN&̋p-hg>j^->%BzI։m2^tDo:Ʃp)&mT꒡;#BsLiԭOH@Tk2Q~q8(e>RͰ5;BBP+7!72u:iľ7ׄI'$|Jgȧ㯽wvy)w2Ev4m^=?Қߢ5R${M2,*}|Sn)kL!}!ZNq*zS}tTӂw/R S#E>svk*Х'"ye-PŸJWGϬu%v ZÛI  6PeWG8Ew^17/< E'3o34$ $F`3E`)qY "@ j0*T YY?5̀biɌ1@Y1Bb %` Q"! IPbbDHP.@a!#$d|W^htȿyzI4rQF(þ62.g,[}ò?sl;uFmtx K@USL"|*,fQt NײyOcɖRiS 7Wa6Īƿ9\}:&@x)+)c oK򅞼 K3o[ܻs,E,(ۦun#*T9:'B$n?__VzI0"I09@OXlrgs.[ֶX0QeC=E 98~u_o" F(;w'bM3϶]ACMV L/`=T"ȑ32I!MIC>lM[Dn9ԪW2֫ȋe7/;@1On}z9A ^Lht+~{{WBsڝ_(<|ABI)l  3hvd&6~NHc*9V*]Ubld?Êv)XryꙬ_J pmXRj&gN[]TSwuzZ`SE2\R$//ч>h7:I/;yƈAjgP gZNȥ]|| P<0^d1ÃUv:V#V r] %|[aA PAL6ӯy]jA7EV]mcUt8pݤJ}EEa/[χZ&K( YE3TzfZ>}hpˡ(Qɠuo-ܾǀ,ȤT QlC T8u2^.3)=y=N!|qEFm-R;4vR*)4I_{Fo 䬀]3f(ďE .Ѳef%DV}6mDev2*[ ZER Aeq@l+Y#hi5}G( @lwhPʐ`|qC#~(0Ba@T` 39QJM0&mYQB]j]ᮣY[Ƞnρ?Q@naa23̝eAgV@D<'̎_z<]tnO0 ݫZV gm%Rzދ8Gaۺ7 I@ȶ !RTUȈ"RSN/-CB57[yl12 e؇|!_|h-XhKF!؈FHa7xl[5=O]@瓟c Mjs6Cc [mW7 ۳H+Л0 ,30yDeVL,"4m6Q@5DВ|qomɾCwD;9pY0ƼO:n UkzDӁ34g&n]K[=G.,"UXdH Yϟu'MzQjhD ZI& cgJ!'Qd uZyx*M><(tuw >.z.fQZ3HN ~ٛEI=,/\ H9u=yXk=٧%ğaBQ?ṭpKڜ%%O'<B6ex/¨m 5,ߟmz`D6 +V_Z o lL )ݺ_c.bdYkXÊ._?Hi=5:g#/)Fh)4JEp6sMiY62 'n9ħ ^`ԟwb0=L~: t|捖h?+{iKJr_*Àxw {ixЏ CQD)6wd[T3łaA !43@,~F?~otj~ɿ%b:k.I-k{Ox]} ߂v>`1J@Oj!`~ܔ-0psf{1^AR(ï L( "uI{:/S@@ڞZ.@'8z~_1 a3WTckB qLe-33nYw@TH*,[ p(Rf$lRod;^OgM}eiqv |s~W.<ڼoC!vĀ1ܞͨ# [| |I8\ َS;4!:~??zsohW<:z]X^7 *o) VGpe+d[=uAlLJr+8M]M<㦊+ћ= y҇ٴ vK[~p,tKn£!>룄Pm'ԋl7kM,G6wo4.=#偫C%q^=D:Q/zc.:}Kj<ȶX1 Л ᇙ%Tӻ3S6M) Q~V j4^L>"`Pt>a`l9Q3{"1M''H=  QB1P{ "@Oa'70ʎ>ά f(tYH3I yQbvOí^2F2-́Gzdz>W-e\[;+71DPP3an߷·y~M.='ʝ}fG \xiP4pN:y> *\0K`\O+&jB\J7)(QS̵m̈X7p)`4`Եq)iU.[TCisr"Z5Ғ*#߲qD  a͹TYu`Q<؄M4lNGnþ?hP "ȍO׏oo`5Y~ hYˮ @Ck+`Re٬.c`!cMjjhٛ?8}$&"<~{mqFv۸)_BiLc{SJps>M@%/=Oi1LN_ws6$Coawci6;T`-ASqG(%ܴNNs$ByQ%!9C=^N!N1wO %aZwј恎ǫN3Mow^p+9zh:ѱ,f%}@y@e2CHp#RLvZmБYLg\sRd;sK KVW-IReI448s}o,ۯ%+FŇ[77nOtn74 a.kUܚ8HG?pS,±yD %$jV:mz ,M } /jJ͒˘w4W_sѡ^y+"orqckR?9{^;" tJ߃ Ъ `k;8%Kĥ mIK:Ze t+Lg-V[Q_F9fuXdJOumH@mf5OJG0U^ЛmiX~qjW$.(klv̹v#LCZA7C|v1+5@w<9cUBg6-B&wA\t&fjWexߠ0yu)܌Z94'>"R砗x*i7JTo܄^ĸ g_B }hZ#AP/p5{hn?Duϭ&չ6#nϔ>-΂i;+~МAf,(BpRh,M'tk`٠IOD*AJ |D9 fNT$]IE0UjeyY.٘Ķ(^%L.&eY EQ@dac\t ނ3W^3hL Il,\qT8:K 9xVi~5š˪m\0LՔ$VSHreCM^gi1ծmN!X=44dY9 (B _+<+8RH2a, 0DtNLo\PSF#5w4NId4Sj٫SkEhBz%,7pد *I\kmLmȳzUl.UM\7Jk!QXBHVE$Lbe`Bl9ۢuӃJX<ĥ@ؐ)C/*TX߹G/~a p>A*ǔ51|)-㨀49ӯ[>sTW:^~{p9NT/QZ a `[4e7m?ereVBha3{=ަzc'5uOFA043[h6jﭷEx&'$?jאJ!0+I #-2/+VSU2_7~m4Xt$Y8$qˆFCXV0y+vOa1'&¸4X3My"s- 5Ltkerx.5v׆Q[2vVX@,s^yH˸r>@ LngtS!W6&s}?ih q* 1m6 H W((E*A{O ɓ3v\`ME$8Q vq!m}q o~}lԝmV7檨 %H#kK=ϟtPK$&031xbYaTPr'[@qp"ly)06 e :h Z`K/!&  , 4JHB T=,ökKرkpZ5Ml 8/HL6+_f^K"uv5&Sg;lf$D|#ޕ| /LItL6F-- (]'IY8&q%r+F"1 d`ly<` ͷ@$|B@2~8y}43|v3"/w>f:xޚM!|Ǯ=uO{ k80]oKz&kFKe1m3ITA\rrRT&c*,1Y=u慛ԝ62;3[YKXk@:K*ӴNDnPv̶(2v9Vh{~;cXn$454%3nXiTJ狆6D)RɂC ɾq],q"`t\m'jy9lΉ¤KUfA5qM9廮{ `.!s" )3s ;Lk5 XT ]&ġ9~r&q # kX"t'B~'(Uv*I9>|@%Ip%]㸎L!N`ridfyu:a"){] z'C/>`ꝠِTJ0[ؗnϻZ*W,5NcṀb(þ,`lQI> 3~njC{QlT9V9ɒ}n;g[~^}Hj: RioSi$ey3ڝ6IÏ˰+C$'UlNNXoK,{l}*b7WO~yeܓBJ@"E[ӽ>Ʌh? BM/*64f'+bE.p]D~O7m59euDDwBg.Ŕ{+фZSgaJlG}A4L8G&EGVJRv\C- }[Xd2"i`٪lFIz,`aNXcZیO]a;>&I^vB).\axa@#G3i.w3 O+i4j>%dEa?}~H4]/PD @N~f9Rق}aǎV UPEA>5(X#HǴ8Pӹ)kR H4 !G0-2d-ѿ9'd9Wcb%; s&-'VdҬnS[` [/~p$#_Q`J!Dc

֊03~wa]u`jA̤mi;4h $4ByAh<]ٙ2wqUb)tUH-d,3 "4Ѭ2*?$<A ۑy_+a QNe6R{Tk ЄuPckGNHd  ~[x-3{Ȱmw0fځU2`FLb,TVմ̣u7U,disMgř{@TRaQJ$*1 ehOS':i(~}G",ʰ(KO[cP̉z?w7b{MPd u;=q\Л qd@_ @ qT1pBK 'D55N CNs9LJp=->")`( h8gq`ȋ }ݳJ5R}/zZ =y6 fmeJ! wBa>?P֙&M&fh 573n~j}X[6A]ؐ! (њ{R=Rۓ<<̋fL! $_IFHK[+&[*F nl;pb$>VɓӅc07x|vcf *"/0S\=DBCE[EP gtR'8Z?7OD"9''[vEj{Re[mפlѡ֒R`\<[` ߭At RڙE ۫#oB'r D3$HGUE\U/ n;XsݗkBo^_=o($)0P~d&ĉl x>vN)|݀dxʘgMuglE+U''>q:z88 1%`pq% nzMۣSplHA)c0K( "TaVkca 1v18ŦTf1 f ,u.$XHf`\ Q !2l5lzR 6+-EǖݶͶvðݵMB|ҊX +tX 3tЫu@E&Z у& .@s8lVtUudT4-'0L"`@h, gt Hq0*#Ԏ8  :2xRFy浸v#ϛ8z'K0:.)4m!wsLF7, r'˚X8ˀbh.9݄iA.Ȥ-1$C"9 ] uG=Ѯ9i q>(Ø"_\vlu344A,;FOUQEc7 K@,>۟o '3yC-/E882D 7 )QY<_pk#~>EDֶC+R +n^tRyGbpBw 43YMl/2$jR20T!~ER`XM)}XYK.N^](x{m%L"W*AK .6 qyj(dV 'UwpX{3"†LF0AMoiBt2!Lbƍ= mEi| Hb$l!e0V"ȭLjB[!Ir.ǰM谩++LyAKe Rj+֕u` pHy=~ςw.t!HCCݠ4D{gkHYg0`Y!3H]ps[TTr`PXQ*2ud ._KݿNvQ^NoM32L=PD5$ђq`NF`A=y痯qZz]^0wyxx;tReh)њ-XhzBLf`q7nYxem,{M8lBNz-6Z.Sa|R9&$dL7`ϓAQt^dP66GutߔD߇gY 7I$IA/?=lk}/ŪM8BQ!SA>ǎd6iX+ uy0l 8\C. B*9*z\ܴm<Ҳ)Ú jdҸ'37㢻P_4TS)VZ VժpiǓEha"y>ΝH}+ *J [;~RuhȌAs5l$;i',F<  , e76.Z9UqP@2 T|nnղd$N/?.A>L?=ҘZaVÙd;\f>=a]Սf4sk$U4i:574.o6ρZ))m3*vsڠ'ڹ+lA}5n?G^٢knMꞽU0^$i &`l}7jJx[ggL[[Va1xv< M}L$Ŷ]-l= w :n :auD_7X=6$YξJ~[rsFwlgL?.sɮ"=?Wꁿd#YAPR d!PXEbE` #`6* BEiRX6)E D ,RՖj4 lE"Fh[Q"QEOʾ On0X86O͕4a` nG0ط ]'F"/MS}w`= 6j^:k0NrBlY 8@Ƀ1]݆rGCya1q li8dSG& gnbD rzf,$NL8(]^*#& 17TPXCY&XDbd٘b) a+JƔ R% X\`i Ji(V 86|}nif`U!u9WcQ /i:i7@{{= 3uiUH$XIb+BNCJQEŠ `b"}ҋE} Fb!XP?WhgY\t0!) k)UJp18&!2nlQiyClb`?Gq*rSg?d랿aq~6 a bI }s͍'e-_?N'v D!#`HȄI GG RŹ?;N~n+, "L3NDux3݋{!|;EJ5:V"fV`mR-ǛʸM3DN9L]Hщ:}KshD gpON i8 /|½ (PN: zy1ʶ8 u56jj~ *6p"8J{OZKWn0沚'$3VJH?{Ơd$eX,Icn%;sjٚ a=3`n[}) 9!G1)<԰]co=ZꐠՄ!t2>o1bN! AMVa"o 8D1@GL R0(B,\ZH),XkUbuh=țl F;2MЙհLMBl8m`$ $1%`"s't?GOuPsaȼ O}kx:`7qZ> ;\N 7' O &,%CٲUŝ2qd[ e\΢zͦl| $WP2r9 GV^- (rϰ^qs֭o)sHQ0"sIDc tH>aEd x_qI^T&,:y:9#"AD OCuMFM" Cee%$H"%s&c8{VY(dbX(2F@-tHв.0%@=k1 PHi ju>l7QwP0!МSd^Ia;IiJPib2q2QN8p;i|MƱW} yʇO$|$:W#%PIcsH"o)v]ynX%#}e6]ȿDqYDPPMU7yuA:<悁ss[1][~"s1^n*U͉~'rp7#;d'(#$"u5 t58b}奱խ&l{{^2Tg%9N m| 9K9 D@WsFaK5ޥ&v~Q7?hDOhec8~UP6`❼JjNs?F5M@"X-sƟh-e?jj 4U\' @+%g͏[)CWG@1dUyIIn9r J^61 9qܹ.:K >܊Έݬ+{E|N@"%5zVeձPW}J70{Ӫ|]%;,vzC+ kYԑ)p9eˢSn.]YIĻ~i)Ԩ tlAP::ٻg}emWp,|/Od~b/#TTs`(BPϣ~@g㠀FzkgvQ LJW<g]}<~zkK oKfIiivBDJ Lev6Fk˜kuq_f %_Z@a AQY}#"DIo7V̖>rmU)wJIYI޺v_9>[mEx:!Pbƽ%)4ŖvG. Od2`>@0aɆ49^Fj͸i!eDV`XTd( ԒlL+56i9o& P%?~c1Rhjl n E;~?7Q[v ;̤a|0˿)fR/̏}֟qh"#2[q˛Hy!( Rm2ONg8n4e4m~5d~KjG|*Ðs9d$nOXex&WOc!lZ.I I$rn=t тwdTb)b%uX2m7Ӈv$3A?ٯ_숆Gő@82 HPZKP@|T 0 " UT  "_R * "90 *8!t-rTA`Bu0V I$ݐ") (H2,$ȫE E"E"FQdAQH"HA"$Y(,'hC  Ϭm+j9fRnz\P)Lr܀u~lh?{6_]gP 9r*fy+&NRoyer3} !J!6UoUpyuqs5R;ܪwVA8=HM~嗢v@¹A^i:F6.'~ڀ$򢹐ao"|G9{g:}DVxu330 5i;t Z2"hƈir"{ gB~1UDЖ<>*!eE0D@ʈb_>:T"]Vڅb1bł2 HRJ JڍEMi$$R2KkVm[kUPQm0TUAHa"Q)eThKJ1*Yj4j,QQEkKeZ6DT2ФR&a Q,dm-],`(D1ASN U < PF@U ,# ,@ "H)@~M<הkܝG@+Xz`Oe`q·D_j9֬C9ٝӭ|))kK0KNZkW~2fEVe_״ܿhٗT6 8f@JBOk Dp&bNܷg_/r7(E BC"Y:x"*30f‚P K Vڢdl=bb !+;?\=frR)?d>!`w|,"Pd(AIzxdp_m1Ō99gn m3\ 9NdAsNsMILp #" T< XRz8]w9lX?LSe$Yi|JX~Dy/{15;} t#hGeXl&BB#9:fE ^W[s型M ^7OwfXeI?-;`{992zȘ@!̈́ Lrw0fAl00CI: "\O:> BFKh_4to`%sPL 7Vo\xqv"Mn;0z̽Ï Sp~F:A0Rǥm *߽-]< ۊt{PMb6zz[^*GOI_7!DrL)O3o_bc*~mN ;y<^f%>hC4иS"_U1PPE7@9߄19מtl"J/^m8 @7qf׫ezF2cq,i΍HDXbdE3P7ۆ)ħюqZ J_un.å/ i~r}DFMH(j/e=c^Ғ4M"&G(iYθ&[Imt͑"m%[i|*cvFjSwp" O%6V.Ze[Q+jCs55AYލd7܅~XwGJniB44yh+bRHeO$SrY}#;mfNXQFwZ'.mLʈ<:)qS SE ⽃V[(7)Vh0~'k_iDx_ia};ۉ\9X9wT[u&GFPh @`?1 d/g[i1 d~!͚Bto[{NkmoO#t3 mk~9Om Uؔr8E:voLgv;Ff54#7?L S=;})@0T$I"v=ytS@0ik02*ssqBm\MQQx[m.;A7Rr:N1vLzGS>xwRB.kxѓPi>)Z+zNٛә};:]?EY-RBl(Ub"JR*1Z6ʈQ(eֳ%ưRոLHZ U1[ +R1vaǗB:HbAPfv]UFV3-}x}_Fm†6׌3=dkKmu}c `.'r3z"%NeJG~ @,pJ@JY𓣼\;CrJp"Hg~;}LjaXS9?:DB[2'"Pסӽgʿ 1N6߃8UǟhtypDZ|*GTWҬ-h~p<ds|g Y;o6x2C)#PL"0+>Mޯ˽X*5L_NrFfO V,0kiDcԇ@Un>y%yzNSQ= ^||RbA&T ӥEl8 jĽO(1K eH'8$ӌ/~7CQHVְ|[q;]RDŽ='fH v=^WX#o@'@%B,=fQ fs0B>l_3xQJ/r( CpUsjLw ;yK B2,Q@Y"襭I[XNQB;cޯkgo@S[H6k.T!Qv t%tڐ$j6|IFc"*R1A`diaQ "Ƞ%@X,X HInړg+)e ^9u V{q:Xtw=&a1V,TT@BJ$l l MZ񥁋 YR<Hqop8vzo#=G_G" D|OU^/Rq@m8n-!(Cɯ ^8}WirdPߐrt#a2P ?1ZP}'}1).ҹʘ`^]pc H/wS Oy:D BXpKGH]b9կ -mxPlmr `ƭOvy(@iC]Y? tpQܦp"*t~C1D=v3|tmJY<&K$q JS 1:b Տ̏#ݷv,jDQp{ Jcym ~x< * /ĸkd]l!wu]WDЦ&$|-i/wC(ޠOkkPL.`0ݔ0noY3չ4rQCy1r L {^k;nTܱ/ %(pT< Γ0*Xc%RԘ#0VƤkɇ%Q%B CShX(A"+VC<717!MS$:vV[p#첗NՏSXn[@fHkaw ~E\j1o}&?R'7S,!op,,;{;FRZiu;f dm1/ + "B;/?ou?(|7{^|H28xۘez#@.ʎpgN}mxxHCCmS N֑ ""?aDK%Gpn_oMЈ=Jt-sF7W 5ZRL"gJȂ}LP{*&@:CmCdU0دқijdtѶrB(  24hmJw4!mtduhEH"+%-X CofW-MK!!>!A~@P#*]:R+|/<yLQ/ L%$ 32i0@DMeo,Ϛ a-ē4:J;w DkE}d7mYSmeŽhי;Nl TQ| H,"r7bIm3U7C 2.Ir-Ք9}FA"(*@]!`@ܖ}^v B$K"TQ6s(nyg"C_C! @{|Q('$ި( ~֧`8ާj@ugv^AD-N`v{x6ʨM\IífgM- 4m!7q^˪Pߘ~Q l :#3!ZϲIt[?uym$Fq-I*v^Sly׳×d`'@{& nYm IvpddTdA O|Qv3̣54"#4R' )Y@0Kƶx󐘊KV@4Vē0܌Y0&`!# 'N[sΙYɌ8 \ ̷C8lֶ̦ jI{ '}a/, +*J",$HPiHC_MsLY T[ Qɘ?' .4LWߥ2Č$"`>KM0\ݨ nn^4sr(<9Bۻ̩-$h9p˖ Hmtwp衁n1w~8O33"L(C作&w Px!XS4;52&=nOKCd\Ic ml+<,[8ξ[hPIaӔ'&IT ņ>\z:(vK]/0/ GӗpZ!BFWK{.tվأH Pɏ:ql $:t6n @h$" 9O EEv9Ӣ[;ͷ58 {=vXD 0Yˆ75`£Iɵ9D~֖em!v2=ؓ]!0.]XN%jj)-"sEZ' .,ϊNrvw gm9-H9UpAےg" QlD wRŶua)ɡT`56T 1 -H·Y[(KŤ$\o(p`TE /i"5g(4pIc<**ص4fAiE`! k9BhYb nړ+YG2 a : W @TT`[M ݇Y*l&Xq5|/!|Aq ;UX+NY^ہ؊ePD]Ooۨ޸Y2I6o7dt!HnGLU{r4(VMݝ;lIuT*"va6Lݩ[48Qav\>8}0s0IյI1%d!ԓݳw7{^0h .$ܛ SٌRN2#;TEXU (z uya"#HA$GlMАrp.)jkJ:k4֜Moo!!"I1E)$,1PAdQH`)21H)eYHE PP dP)(EŪsta0@?pw%+XC#9w~klovL^C9_ONK3[xsܷj*@Il#r KC!PrNU *nxxoM<&&R$MKc !$d$7!d"Hy Paˉ6f$"mdb"DkDaU@*+}QkcrK0268"n.-T (|Lv>l5D S'&Cvy_>p& M͊ekl]8jQ9UцFWvd`ͤ}j249LO+ߤ705~\}oѼ\^ "p aX'mT-QWpϿ7ϊl0O-Vn$Ђ_ od~Q7Cگҝzp!6pvPLg3Qګ=?YO$3~3+^x.~26KscрؼVI|#[&y%8*xE,<{pxwBEEBB-sR)[bŪJVӗ) Ue^%~ +qVq!!;Fg<OY]R'%SUL=kZ#.5ЮK:՘#>_v'-[meŏ(54߾dFS]k ~vkGrDGo5? R--ڤ`\L ft{C&ڵ̎`D?}{^W{f黮XF*aDͦF{*'b`Ts]=FUμ\ Iekǀ!yqPI>1Ӡ\@zo#r 3bE^:^_cV9aMjFStlMH><\\4c{ f`3BHSp6i-.SL bL[h#P5oɒ%CKȴҜ])N׵yGeO%]\84P$n?'s F9z AexZWE2o,u$vC P8>qZgN.8}XgøQGݯ5^zR\谒+/tއ`#QiyJŲJBS~HbmM~>3(( ?~-750Wh9C|O!m:sgwi5MM'!YP˶0_dV\>@ ,>HP%>}ߒCfKHKϩ v8 sߨ?~YnAǽ}"S _'Y[KQ?{nK85xSrq$Ʊ" kO9o =Mi|"*-dY;z3eg6CEr8Ljl\#|u :1U^存+ vOWL9ՠ|1 7ҙ hd S_[Bx2Q3P $9_|*"/ò{Jz" /lz2ޮSA2fTS@r$@F2$`?|frӬI(0e-Jhq,F@MB * o]n/7>_~3s0ۡ"]8rr;ieSdlv] xԩ0g$H~fHpH|YQw/hBdA|X̏OM2Bx;VHM=,4,ה"MjثZncF+>،@QjzM( 'zJeܱ+iP~f@18_zOFwyW33KoA'^T<ZTHnNpJS$/X,V͓[YAߚ@d߫Q": D ILa+T)q_oMuVPCL˗18, v83ЉJ$ znpQˬlMf@gI3k\nxnZҞ.%I5h3}E,;/d<$'CCݪD6ڔmإq8M#Ox}O/߃<8>'i/mz=Nb`$ɮ >wS2#?ͲFt#!u31ty oEži6'LfdsVe%7.d5aPG- X|XYTq26;v r&D" q^0eoMiwvoysMߖmx6;j2 }H!&}/oMyH*}5*>J ˆ}Y# e;:ʧ$AFi|AJ2x[e$F?bjq4jx $("_86 ʆ̉,A_L,|/|~D^0+KqZ@[ſ=NsVR3zn`rw+ROtT,xMؿee X@(KZ6Ʊ"걯є;̳V_6ܯnrv\}qVA]nƗ(u]/}>sOuhh#z4=ݰgs%_\ H#  2WǼ;-m'{\Dqe;&T*>_6bfk||&#WMeA,7=s #vKe:J)9⚖Y[3-ic3i̯]Pm;Ќ}.zrAsATho֏}Jë[n⣑ڴpyذ̝[}K}mG Ȕ|?AOrnQPb }>jn+lߡr\+'&^?TY(arI3qd$IM&\j4 Da2?~W7v/], ~6U@j^l]vkxd. ;W'^KĒN$>֐N?e]՚aBBÿf@E? ,=+uM2?nRΖʆ 6E龨%-V mmJ= 8!;h%|VNG48\7^tٮ/ ?ae8gsN+%Fؕvpg08SJӢ8݆:F]ShW Gjr`seg6)چ`06n5?4r+0C?;ѡ6):Cybf𞺿#$Z6N9S;#c8~XïC~E?cij7*B"P,KSiS]_f?=ydILіʃ'M Cp_ x,Zu3/!\/s h9fX8Vtr! A8GMepwgqfs ÉzZwo_+D9qè OMd}-yп)@`ř $MmO#w0P^ fu/lJ@Eab~Z© M^tcijeҒ9@_q@їgedSr|KY,JqЎ`d& n HQSE6 B?O$Q -ix{z;?NY9Pާ/co55ڴ347E 4{ ֨!"h^& 6qkc^/:hQ2ŚDh_>QYlP y_*1nQYUp#Ri.TJ;F= f|Xi=sPE?N` tOj;pɋsp|ʉH:ux",ZͰHE?9a+f7 hkK |FI$X U!43s+yÕdq9M! {b1ΛWF}5ooL, QMfMW {Ɠ5[%Oz7y6Sr͆i\ˤuEr.NNV ! S)G'hM%c0"*ܚ`9|Je^C:$j9xywT~grgk@!nr6X%S<cӇOۇk7EEO#ȅM9;Gl3ș0@90$ f2Eʡ(,5=I ٣֦3z]PGw9ll!浃:L19d ˟uЊ';mzcL`F޲twcڰdqS ꄘC[P0c1)ɣvͩuLp`c+4bMY%Lteƥ66dLqC25?/IQS;86kRa!,9%z! \DĪ8C 4#JNQ ~0Hޢ3vn"w!|ŹTCb\6td;J864CgJŸ67!XZC᱈ >>W|>rߪ?7N:7RU|_߂5ǯ? 48ZsZ >8|m(<is4RHX4B_,ΆID#s֧7(:؝zUMБ E*(Zd?dZ\89sZtqÓK_V_:Wb#PldEb!}L^2΁ɭ ez,*˵mlDre2kS ȘϞas<&IĒGBˤ diM^?~ޥG(.ҩ?"`$6UIp&v\]oU1oZ9 {J]\K 8 C-Um0gW;^=>Gym_Nn_2 ufdgN^u4Qߑd ج:,$0J !ZdfU4ML[r; SkMϑ^^ ~~~?\vuJݹmV# IBg!()8_%2fWkp#>j~I}W5<W=x1f/,B,׼DAnuwk|Kt ]? d]i|zFKI^yL`I27j+k5{,υ5g9\yW"Fnmvc#b ʚs )h[=n|·,t+f&E7Wa\ms+(mJHR1 iGԌO}䎒cv(OkۢYqʧB+) SPLP:"ʫm(_~UWY5?/&R&IQ19APbx/rϔ fL4fP,Pd1UEIqfx'KCqP=( Hv/]qYq-[0@lN/BXtGUoc``B - aⓂaAf%JUHZi B/ J&nwQ$Gqѥ!OL;Q__=^p nlo# &}nN7vCEUb@H PsɈ/Dkq9wXAdת \Qš} (J&'n̞fMإTǼq*;N%:Ibϛ9&\$f!|,M LςLAiѵAN)d8)*US&2S~J_]$(MҤX/eIW! Q(HWzھ>*>ÓW}o=w*E7 u@z_C<cf{v4Sij]1wU/Z![M݀im܆3,4iɆB;eᓈɞ)LuO#~ ˤɓFiEwO;B,ցO93/ 83,Um+D@ %ibK4w8"0} gutz+[}n3oO?&d։ l;)&_;32zUCB ֥=1j9^?JIH0z UU7vUO精һC骺ZJUlV5 bc *HVRZ*!uM6 i} ›Tb^Puߢm9zv7PBmN5 ].E_[k-.zNm))I^_"f^sD !ߍ>c]|k*amIAM[U#z{M ~pneTg$a#4Lړ~=lpW#Z $鋹*hRs{x駞q,U)L^y%?X?-DK:y}OѥOk^,KɅݶ7R1Wg$b˲!lȟ\OBj,S.wc=.t ۀ$\3*X>GXw(NˉwI{Qa^WlW̌ wEWJƊ{G6g^|ͯp˘cH_!ฎț~qpqi(ONv3ZJS-nTlЮHHGԬ8ni_̪P[{æ9p;c< $-FU/I7_]w/ U[} pe*CWWP 5@L%ٛSE }ttQ ʦˣٷUE@uE.v~C~g9U;:+ZnU ܞwHX[B#,-qŜ5yW!{<kqFe8F Wq!)Ims͆Z<^Eux_6za~/-mBoK4pg]r (SYT`ژτJ]+6m J1q#PN:ݍeYvji3APDЛ<6sI BpViee-cؽ]] eS8a86ڙpkt54nDW3"8ֱٙ]ekeƫ-UymM4amZ ;:\`2X/ңײm5c۬^82adYOI]>"k% gh{n-2Ӕ fV Ĕ#* >3 H'!H6"A 9UOBD{EW7qNN9@B5 o}Sw<)f`Ҭ{%s"mXy:ȧ ."_Ra@Y7/,7Iq@+A0`"aYTXe+*@ܰ") \J1 dHi%`i4ˋ$, E(W! lMLJ͖wmo5Ta5= zC!@L0=y? 8eㄡ(`ktX:&Hh Hm\@kc7)DARO좈#%"2 E[E6#H"o0LH 2D 㮏o$6֗{cERI%}'-BFEAb@ $+$ U؁ ż)Ϳv=![O߀f9l?L'yϗN)9Vq|b! 0P RCbI,f2T$"(M ` ({\2*(`(BjK_]8}42sߟ]==K&~'O:3hܼs4̺3hF2ܓ6&ɴ3q/+M9q, L`.݆>/Ж1 ;a6Oz`3?Q5u1;]'qσhHp%b=$+|icn0Wеxami`+)jz֢q j:őt53/rYsZ  a5jhkbo4Car`(F!Y BAb ),RH,+TvS n 2j7V# 0ķ+rH4ɂ3FhӅr*m-˭PiSY mhJTYi6MK ;r)$ +1!'ol!Q6*Sx* Cbd(} )a)Ý1ߏPq$3I4Έ jo4B4LVX XfFDm!l'd仐2J,;R"`kZ  `P!ZB o܂ 2ܠ"k 7H;j9TLʍbg^{oy&@䤀|E}-T)(r3c.0h@-mzTJXsOa+p}a`6t4#'@j6Ɓ#kA#f| .^޷Ķ/!u|MXrPL]B~m|gfݟYZr+}U澸o_9.k!P oӗ)hT`؞ZQ@0@R? [>KAcܐ=uZ6Dũ䞫r)~uOH8mrb wh`|$Zt? n!oZ`!xܫn0%}MLg(?SʪSiZO/ a\lзYVHFmz :UGLH8jwTvYͅ $-ֵ0Mh$(4i]g ;$=!ZqDBk}* ذU(+)ܴ/KLi:fflD6S^es(WoB\? Ş]g_s>q$Ug$>$\Z%og6hٗxy-0S!d0fd 0s+`={2:*PYj$1@bB"Qhc'C'LRim(}b1.&JedCNu1 u@nf3we:ؔzQ2gQ  S$-P䣤E"89m68d{0EdVkq2@窠2';iEb2,B)! Q@J LOU xk,jwNw.Rv6qMCK!yöu'\2A$[k R[]V^71PWy'j$Iѥ 2_w 0axyԝn 8O)ic&бb>Ipia:Qc0ERADVD`,C)H{|4CHw @S|kמy^rz]^ ȩ"HH* "*'1 Ӻ_hUQi`qKL _WOw&"O8Ӂȯ B+ jjpz$s0xs'58DS+U]ʯ.+벬~~c[9h%Gj )L} 9n07`JiuCbsNr^u:He\sW@TNVJBakm/DG3/tZ 3mq_,˗H 2 d aP!"J(W4,?Tz _Hk'6I<^d:5Ri+SD`(|_gun/)6<'DAEDa |#\rt6WȊ]ΪBdf̮"22RF!St öT !K[V1KKP( @A@(eVT"VTM,k½’DQT$d=+ HVYݣ,A7ҙr$fIsgPr6aаTjCaE"Fٟ_ =6 N F{H=0'c;G5)YngS\x<}?ʧDfCLA2utadֳb!%Mr!̭Ğ{'#9sRDH(E) bAAEPb(# u)reyBF,vA6p7 ^bAȓb`ד1Y$AI*JCtD Aҳ2 00v߯pD"A)޴2b߆ Pk2ۀ1 y8.p/cd Lx9 'aQI>aRA29.[y8-]WUv3 3> ZPPm,2@dd h `#Ě |#^7?㍅|VM\GDe$ Aƒ,qЍҕ <=J <4yTGOY&~b^~\^młSEi +S Okgƪ,˲_`e1B;X}5z qU*[ 7l9583trW7HU)>itx96gLi(1R#4`1̠&$"t32Ujs( 4ʢ**&a{m!A9k#+a HĞobCoYÞMXUZ n\be,b@ρT0ȲV1\ݓ3!K@T2 mh H , Y// ܐNau{g@l$930i "P- rZsJjIm b24RΫK6%QD&f$m/W^mKKxwa"Tf]I K/w@,ZV*<b$U:El E"z2 v$Ġ E`pIYoVKgLbL|`مSfGBVi=me82 L#'2qxD Υ_>E"*F(*$ ӓ4aZ .ZSNMY*Xo52cC3Ap|SP h=# :CY!c,*bs{G5Itُ|XurN"|o[ {P'e ( HRg] [Ȥ@ (R& N0 sIMȪd=Eۨ;NHzP AV/HRݓ}Sɝ*a*{ٛK62fE] .dFXj!uځgkzb96Co>FMLLTdٍ ~cFaH:Ȼ5$p%`bz* 8Z,#۷ũwB-"٬ #1HG)Y8vneԪu1&Bľ9iRĀ}B.*f?EYﹰ"&% =So{㓁)5[oqC94?w{!$ rN@J=ȊHFQ?L /0й`X[d65)7kc{Uatns <3as 0B:ʍ"iDw>3xi7fs=i>jjzW[|Lp 0QgN')ᇷa "鴐SjȹބxouJ\]0 clL98 Yn'L%I!#i~H@>H82_kVA#=,'`$%95:(6>^K $|S 2[M0ڱ8R+;kr](0`[<#c_̓4sxY_["s.Okn3.9 p!uW#vAaX @xßu^Hk/QWh I VWVu%r)T3 l U@MV5*&PixV 4a+U*+!@A%Zt(6ڄ1!$X50$ GN~HĹ8Çg ߻/"꿸PcL$ B ,mWm:ۺּNe b21=06pp*1_ۉ.;useAS[4z Z~vF _kݽu~.ŝo~4k2-LeeCB юݮu>"BWV]qJˬ%TUwn? 8SGva4< ?sS&lB@-a!k&3Zɧ=:EtfڪTQ#q<!Ϣ)_ |X8ՙ۩ĹNZTOY [3B+RJHű|H4E( 5%K7EYafR6( 䇱Ӻ[(h4.޻N:PR..Z3 Ig~CL,vY(!diCTW 3\ 1oY5eg[L$rK))O/duNC7ٶ|>#)k'xWWxJ+DJTW ⢢*EsvM3 # $LDr继+? )fNR,((|sq p,*̣RtO3  zdL+8TX"=" x.*ЄC5ΘL#|S~5`8ْd=olm’a _6IC< o?[g]ӥSH@Ĩ ,Aok/ n8'`(v8!&) w҉u"=ވ|/eGTv ep ',n{>ӏl[)NXغ>n7~k?W柢qh 36]NM:zO׽z  eDroo۽HDI`%L=oQg7 Cd,S::,8u̓MіӤ*J[&ňVDjpB tIhxmRD<: `'q$H9.q(?_}FurEgt>++F'hz~p}$Ԁ-uO pTyȠ9SXx+8l߫ SCW<6wuᠨ.R͸{M1599'P5XDhW 7`!F䅡Mo@rn|[6M9"HO"81Y''a2BL\)LqC`a|#avh ŹLI"@aM=tR3SFxO9z)Nn>m *w4! K'k;p]}<1d["[jvWv;PÐsq)8vдw[`̀fxPuf-Y曲'ctOt @?)GG8hV Ѕ$)@:=>"aH1p\!Vg6jcO-3mKo_N.s$Q¸ث-BUU '?9e4Wwn|H,6I+ |SU!/&"(ag ^a|SEvF`;˿ 툟LS S%9VX-i.>vu"!րA@!@ ;-`E[g^3$M#0hܰ>9^6yupen`[ zp`y杸 8NEÁ PEҽ/>ti[ie$}'L2V|$ G!2*C0!A<i$3H߁l4"׈̌DA `xrZ:H|DD._<FD΋ νM5BI' @8Px|x'u Ӎ=}\ϓxvx+ ml3 1bbi) 7ӓP>i.Gqj82{{ %iTRw]|C=F@߱z7jj~05ّ`$Hdd M(X o^5WY{6[_N.8(jx,C-qsoӒsXљ_GO<6\H)Vű@c \,W8- D *%͕F<*+G[xPvnJwU> ߉wR[xi^kxq뗎3c݅N%g`k 6b(f󅈻(M{IÂM}s;,ZY %s~gC  f$EPAϗ&ˆoė4jF6kmru N@- Nss0dN(/ĆD/V8]â~\3FKI?QgSmH?4(sԙKG^;O>ZNL-Sx})mK-&L="N%5ޚ;搷LE1Р<0;~஍W7:cz`~|ߣ3WGLU6MiviN2>ޗ=)Àr >qWN_phXu*(}@j14_&_uo:Gtn=t`|x^>}"`r!-l?Wm{8^1\@ t-;\{]4av_CxnU}ql"MX{2y&#ݻ}?7ۗ WX.5[ޥGEm&&r<(=#&K}:6-y0g2Y)LӜd B0}x)c$m辪aҾ&%> 0H|œ""Dx$ln./UY'yՅ-_tz[~ \ʌRZ2yqH3'f>pR&ϤyYܛ#;g!V!YA@=_&$#q׏$(qΓt7 wfH ָnwk5[gu]`d WL; l҈t&(\ʟ2U d]T]MX;:, zUу~䛙T?ԌeB88)N87~--h Uh,ŮSv*7},Ħ 򨧓")F(.CB.ڹ] BΟ;L\CnyRi0R tU)~xRMWAvӥùҴLIOU_G*Xwϓ4&DQ#Aބ\I#mؔ$A-(ED爖A{?,qa؍5WF8`R& KMT~x7s3P 2[+S*F/xffd#]κw1'3%i8_ Q=t8LmA{L9پ0eh&WF T~x9boKť4{kit|>9/_O_AB$# ۜꏍze:q=K]~Lɲk].nBx*qz0;a[ TR^Nj ;i^(Ij63tk߬/?Gw1-Ym6~6Rstw`ȕ]\[\ qSAg@_Y /0Mᣛ?nJ@qsP9{Q#?$n4Чy('>@}Gsf'xw]+mŠbxKcxeE8zC=yά/ǢƎay٣=Q@[}ܟ\@H?"\ ā-,5VƐFs MzI ?55gbR֝n$ɮ?17] $ᙗ`3VE}[d?Xn\WG%S1q zcF,<t7X$Yq"a@p>gŸ- eJwJ?E33/ TmϿe!>UMӦrl8t8/?V?bH"&4~ޓtN U{Y]83dkAT/ء_? Ԥ(ևxdCPap"@Ɔl2KffFfN{*?5)r>[&v"|OD7ɳPgfs#o\>-wjA"0Dy $*M~vAڎ)e.61GhmKXtqFY"2ZQEH3+[1%ZuYuFj aS dc TC,h(SJZQPY`[z,9Y!}dEAƪL1a\D±HŭE^(U7¢":dGfUYM2?I`mڲdE=&%A,eF KVEI&W.td=)T-%%TTX FE ( QwkG1FfH&[H(F+T)o.iL^ ]ؿ,#ojSZm΋W;T'6vc}G+)^5>/B?Nܞ'u;KH#P&c( e[kd7=OgwdP7) /6^|M'1 )+6f™,IbKpogQ'ާfk+xׄ"&`FBX L`{l)c-&!ӳq\MLů^E|ńXy;4aKDFjIgJbd\?Қ|~% ezu{2jG}j?\\.mw<鋳Kw֦Q^ax,EP]mnLم:Zi% #nb,$bTRK(̔.N nTs4j-Q I@bKPpSBH5\P,4HVB[(a)hmы' *1BQ0awz5\@"CcpRkV(:/XpUM~}-gx1O:,z[αaRH RAEYtixi8v\y*q@D@yy˴+2G?j8|d3r|+ I@$$PIPUn b)$!NI!pS,h>?k;DN!'TPbC=Ïücڽ aӣI2;1*jCA0,C rǾ8h9~ɑR'e_<ܸL{& ! AI0-|9uNPa8ulc"Ee,m!*eh`,Q; >N7`LbE&ϩFܾ:u=;:ef_s\Ros0R]fl#M!Dc(ZdLE29\{*Fld*f7[6͘[GlɖkXTqɡQUUjM єj2atf)]јj.z_EMlJP-~*:x_ ;)PvM @6r!m2bqvd gf,59$YàNˁPAL9v!ߡkZ ]{j"_H\@=]D BD f C&0S,- O2p{}`@e^wC)ԜކN&|9re:,*bv_Cڻ(Q`qdǬ`'ul+g^6}+3!v7A@<"qPsHx{vx{/2.j Oi)Xr@PSeꢏFe^dti c#cO&qv4ϳڜ$dٌ"'9ʂ=_ɯ,d( ~Vz_'/#cr*"ps;5s$v ov 8Mʪ9r<{$X`29z4DBG%[e(A$M]Sh7mmd;O9@/@.\2#+A$ؐHC>"ŔB*RA2s1߿㼑LK@DdcMfy8%Dd.GJr?M@7ˆ~{C8tm߄>x/Zz $!&5^ ۧ%o^8'ꅠxKlx ,BT ll# N5+Ä{D:% `L:}džd Ā*X"#F("3o-\Bqc3ljA` *BҒpa!&1X9=iBvq9ٰ^$MxRT3nDOknJqBAL(+wa*@2fJb`T& dKE(. vt99H{ly Y?)tgz^nw(@$˟MM=bhCA阢ɛ? D|xG#& ;1qo({-kGf"+5)X3#ImSPA/\);aZ^)ΐ"2!0"E " [TbZundyy  $%`BBH^rr'YqODts'C5:_r=t`Hv5 ņ#s8[=}ou!rn B:ɦe]'pfsg@W*-!SԆ8[ֹbE=r   ]&'m % >ci-3 }':[]|!V yĨP|c? =JVV""UTX6U 1Ukb 6"Wd|Sx7 p"0`1\l=}F "=\hH)ߛq itwU;bH\p4PB:2:E7hW(ԩ*Z5pjhlah-U}t}%7eGx/3Cg8#}P8BXYj5)Rjʦdۘe0h]jcjgj[XR4L0@ _㚖-tM4ux CDŽ-$W!i5QHf_C&'K׳KԝT>ιt'929ÐbOBpڪy&m?lч"C:P- 1.X ؙ*8^ct]'"U[A*0cX.KŤ@JȟM W e@cx G,N{E]5qUYsn2^u,#EY(*X`L 4:f)ձ:νG OڦpAYgu0DLգYC"[HLp%P2@Yb&ʖ:[ Fh+W#d#]X+gT,́ , .7*LjЋVR Em45̪hcӿM5 `WZ\{gkϔQr[.Q L*@%Jd4EFDqyLpugrLTZDrw"P\dI X p̷[YaBnmMTMMՕm73;V9W!/BIՌ>pduYᙃ8`KCe`=N2($UDe:'!g2Aa`k ~\!sqB_a%bA\d2:RD \)AYtvum:!g%QK .k&HkmN6\Bp,k0z33]Z FԶ"'*0j\"Hlht@'txVH(2,15 kZr[tlu{nic׫b1);.lei Sl,Ik0Y +DcsCrZSz3ճ=~B?w$g&9q|S=ARk-U'8&X]tDJ̄yNvDcsFUTϊь4[%r(V^o :jIb/,Z T*DʮƔ#HجK]c$PVɉ0"΂I ƛuA3 :7;kIfj*Tj46QB%ٸɦ] ,!6n،"e*)":D0PW>/bρ ʍpC:z P:Ұ;G߈+G%uRV׹UֶEu պߌj jʶ[読CtB,,pQSߝLP!ՍuńMR=Q'{ "V\iW:?KtY?sl M# BW?erǰ''Pǡp_ Mr$O!CXd¡9 W0DR Pr;V ²qc{{k2pA Ȥh`?9ݚ.'CA5!Hr,m*~kp(9#g"SboLyd5dOR1et ;<[9?T@`g2WqƣĠ;y:TdmijÔv9q>b#-EM,%ݍcѰ8,%!k`UڤN`V-qm:Ӂ50v;y_wr[bp:ȏe DD|ؠVW" |`y Z4]Eѡ3y%qps]%b^ϞٹTG6G' (;*A6/ܤ@6^60)GB7=׉}gOOdosK5@$H/J(}dkSӹ88spD~tR "ྟSŹ;|͓M z8Q ϛ=FwדGUtHB(vlM,aӆy|G04TTހ‚y/FiL3l7N*{!#Oa y-oR6'ja=#=o|64rd8 s%g xM1E 6@׈7 ܸqd=:OZTvyqOmBp(2v;9SWggOl=V,<k+2u/N</=^.'l;"$u irQY_w3[8lNk˷+d6jPPgpN O?oa`o"PMS8͑8 84@E#YnT5w|vyDuxBs!ϡ9 5 -]W0kl7m h[hokETIdBPL!^bv%@"ҳ8c9Mmsg  ;ӆffajlftIeq&ߐ}LM2בk%:nRGq60w 'ǷNy!$BO-u\ Uk5"2ȭ0KDː*NQrM]&ߤ ͋k:\HA{ob0,L$ ~ ="01TI/ʁoz{&8AS]vՍN) -T⦨&ÊLǴ):w~I vdpjy/+{dvF.㊭^~1)i#ZsO͗wG7ƸEchg 0+ ޻n6XC/d w椌0I{?LQmH񓑡8 g>UJhD4Oc[y'jtH3Lc3zf{eRk=þEa*u;ScEp_( lHNp`jn}>2?hyJAuo? 'OVy97 :YRCĴh7h4=g?WWP,F( h:>?\3ؿɈ#=l7Bc#};\뺭XInŎ]x$˔QL)^gl9#oLde?F# U>w %W,,2`p0?̭I kpK:$淑o+E|(@io|کM*-E~xc)`l: TK'n`AJMu1kn=^2Dn҂D5ͥoɤfdXTNZ&D,i\X aG",ai`L?@Cw7ޜ8Z8qaww8ԮpP<+| (g8НK!W:_T__vݨ%Nf^Y?0@+ Dͼ"gIx#%ˈyO7R&- }хG(fAV@Vj/Vj{;(%-)J욁Q94Y@p%RiȲq"+zQUA"5O&4mzll4f [Y``cY<, uH8Sq`+GBWFܸѾj* gJN,ޅ99vEMCF"vVb*ƶ4D @%-ZcY(@vZ4`u\cGI AD,fVQ(b5XUJM$1+-0e[mbE(6R©XA]Չ ]Ske(X-bjAE*Y"[h4Et@s-s'Y>bYqdd)`kV U!%U@K1P."j ' IʌA`5@ 䪭,#ZQp.*ʒgB&V&j*vr' l \:\ BJjʌ`PIDPb LuM#z!pm K3b$^#֑T9*R3;޳&Eq> AGP|ʏ{!mc6PV;V2گX.85,Cs<[ocQ<7 v#>ȄM.XQ͹80[Z2wr;EZ1"xʱQ&8?@HV]eVԬ)(?cgߠ!I<~xqQ%Qg$֎yRX;`qY QR>\ƒ߃eTe|1RV͋d!) ὏Ly?P\IEB QB"e|jz (2`"ZT#06q\#! Z?tOw|<{[H%Bcbq߾ ?]+N}dw_ 1~zg=>X {D+.ݡBJ2 ^4&@>|cL.nXTgN쿫tEh_CAJ>LR6Z .Y]9]#wdCI8Dbqʋ b ;|!.d\@'a'N8|z6I .d4ڐ'GDGr_%%1NWF֔IB0_snľg(ՑZsmJ!,08a3d5BrIAՊîf$PYXC`is\xo¡\1/ 9m(WlՏv5n'ǡ D0с#f|ߝ<d=C_W~сq;LT.'}"hnitzreLRhgŘyʺ.vp~ Pkp鮤A M9x( cD3KxdU/;/8a&8+ Lπ=v-<I'k|Q0d h8\ӟ_g*Lp>~?F3Kg Ku4e2 /3Y{#e~58jf].b.Fc|}˄M FQ uUYٱz;\Nq^y 2AEbIO_溸t=w84HR(ZRjRb8NMYlP@ H$4uXYDI;B[ R2I4&lcK)Fn\eѱQQE,QEa`F(C17&vRDED'35Fin9e=<Ξ&`AtUIWV%Axe4;364;]%Žںkn!::Y  aש^q٠VD/ q}zw?hzp 6!$fAACׯVfN AфI$kBa C_RWdv^W" Ȅ $X1%AdP**Q$d Q'! E$ 1$IMy!80 TT)SRf*›a?Ζz>s5[kRD d#${4`B$NË 8pFa(m&bC'?" DbTwd $!5$s &Q]r$ 6Chic:_eК9N:D ?sv;j4,: IӶH RQ\9ID٩uvAsuf)@"t^Tٰ*Z AK&ɍqkke-3Y35Nms.bYL6vMllkQR)E4L0s!IK3Yo EamP٬b u4hjֈMla\ݵ2Tr`Pě4.TWX.Zb)Yܲi4vނiG[(11(ۉ.X.ٙ`[{n1ɉE#rLmkVf(AWY,6c\|vBecnr2èqi8# $ $H?|zqB2!h/tNwz\jZ! d q7SI/1%-d &7_ r^b5~) pJ8Q56p,9IX d$=Cq6D`bn\IYZ @64q-ݐ7H,d1 ,pT0p'g]6YGlӆcHDmRmNmY_n\ HL&YXlPkCd{>WfNó~|ھ4mF]DiO: /J!i5>Áp[1@~OрӥQ yDzvXe7kmL#Y*+H],Jٗ^- "\A{2MD6 +Gw[k5k{8lQǡ1uۻt=^fJȲT;k8&.Pp0O Q©JR3?p4K6ehK@5s5qoFId21B n"", " rɽg.v;}I;~p9fdA&J$I0r3ܰL]GﺀDK[[VZ%WZ̮S:;~H\d 0Uֺ4!t5]63ouJrV 8=)MpZ~=Kɋ:Rڱ*j3DrDAۛTO%EM$;|Y'Sx*$N?Fy$e?DSmr*⳯R]q{GjN]+vNΥ@U%/+%SL!m۫Z"#XK7GޙXſgfcJg v]*L]lҲ+p|ީS)Oe4ip_]0tSly],(n&T~QF!,7[ĤF`Vl}|FnkON^m ʌUƚ-@3ͯK1@Ч@?%29>6 X/aElu ,%ulO$éJ~OG@ ӓ3PԻeI1}k1c!v21̶\ܽm('8+߯f{ ?J4Ӭ!7T5r۪?zVq(C u }KGi߮ Vۻ9< z k7b/ĹmC0LZgnY:Kz>;w;+8p \zjđpDr%8? W R;yW܉*>Fy]NHxrV?Hi T "B3T|8зB`c 2$@dPddT">+Ŝ2l"XYOM|K`Ci>Nb%)\EzՎ5#¦vbi^oo)T ׶8R7&@$@L߃t l H1iݣ mCn;_v<,FP>22t/͟gt;t@v[Uيv;u.A됿8R04HG{T)~خiXHùӨg3i:AsBMٍn~h0ŁbQ%|_OmU#QEN}+gf2V y?,t'!,ɱ}ũ A$bly'CR*fMs!<%M0|duAMAx:S>cڧC ScԱx[LI߆D~4`,:5{}yhd@iR3oC}O~O{h/Di=nwk"06Z;v2X@iA}1Qs'"O{ ڞأc.\'WI0} /2y;&4>C|aQ36]rHxhiDnԪ6DNݖ<RE]^~|L\_/WA,8ݩZ nufl[xPw_l؂pW\h:au6Y#9'xM.1#y,7=ǜEsRi=K+,]D$TB+9ܢE}G`3 y^w8v[gqzU#v0_oWk `އGPiK\pUsoy :K@*.zpy҈[}/- E9DgfNZ< ~O4e ~%`(bSw_<"/6.jRW >"6r+ O,J G͛1VAOBuLW&s0p (c.zlGŨ? [̢Q#I R1n0;5A*$ g0A^:+G"'QD _"c5Hz@"@hJsyxWfWɍ Nx7WV\qt*vDm V= qgϼkJ9wC"{1杙ݔ3]4Ɛ"go= w[p>\L`D[DƉjĢF z]5GM)yP-&WBuuaV,Lƕ-)ɰՑξO-?"FT"Sn@D! KlDX?dt 5B聘{8@'mo`YuS\KDޞG!JQD<[!E+-j >.ڔJ2iJDJUU PM\ ֧ʂ)$eAa~ /GiDf!yP5SVOqllh$$9OiJE2 b#rZH? 88 e`XJmd1::?Mr gHᵈhrD$ΎNxo?Τ&d#fr %+jCy\HOd (1bF,$T48[jV.&*!Ղi(.`HK,W;𮲏󮖌GuZwM=bL8 `0QW0?AYk}g1\r x+c[\a322"֡Tu9|ze)$Q팪TKSGbl_WBo~jǜVs@/Go& V0,xi |[֖s*P_״ $Q2J-wkSmF+rEۏRy[t3|-M G)x7vFp`w#.Sh~ dx:޸C/'Kz?!PT#fE/pY ĭ7Y_\#83Ec{TR]B$eMrT#yЗ0_?}TR*!+.Pjy-s+s{RC.}-s=~trjb'EBs !Yh"Z ڧ>O;j5(|vyR枆"ҴY X&78(\(x)N?R^̍8rpPCa $q+h:ߨ|<+2صQ[ I84!' n Pu$)ja̺5 s;M^5MBp7Eg>XF'{D zL$XMjTўE7Ĩeӥy(LGË01N4FkO ~D`h\`l rt2t"&|}"gu h"v0}X c"[p\4z )BJJCj[uKJ!,xτ_ %_y !@稽z]eS(;₶oV,' #m8>Ӵ -{%E aTuiCV0xpo˷IIÍ&uHv-Z( ˀ4 $ϒѷ-b_Q?|5S7~WxXx٤Ije R1`QƿoKͧh}׀ 69#U(8 ޷|5\ ϣJR->jѝŻ幂e%s?0o4Fd`Er)UQ$eP$mHZ/pW;?~LtgYM!FvIf3-7,SdXUIZȍO 4`ܐ~O{{n #.!ͻ#{_R4?뮱.G/l*eXƤash{6a]y@Xہ&=ߟoPeWcRc]Er+D2o*++D{{H{+370 Qa>/qeLH@$2 !cG!-7_e9mqʸO@]FM>hٮyK%>]?Oy:17ZxPb z%HýSÒM2qI V0 z{aPg 7Yg /o&?gn/Ĉ ! :ttNjI@+!*W%`C$qotZ2(&aR_83yL2[7 88Hkm,#ЙHOZ=rXX ְ=cT` IeE`_I*,h=~'N'dA0u~3 Kt I Ɠw;sGqRD}\p@k()\u~̮,Gp`.F Q nVd5^je, a#˿os&ߒɩrQHf}5|µK&*lf'[AU?{/e® c*N4h5@S^u۞Z|S Z&~oEJ[k^ݦ-g&!I. hC4=HON`o :C+ ځqLS+CPia#&FX)&,2 D] %%*:Vߢ#U>M1$&MlǔJũ^k7>e` }'nu,9)OkL0U3VF X-]P!UlZeـ-Ymgbo~>Q~nH^${m:hcP.LV*f57iNI)?ǩŁ}tp^vEK:R9a1Jfߐ2L= ئyɓ"<#d(Zս YzD(|sX> 3̰WV}Ī+"A_$&4~y4,tspn&'CCn7y^<ۜ3-NBH|c+7X`PIdfa;*AmO$yiozćXRL#}]27ߋl Tce:B^cI6;|t(CwgDOGBPxP/䁓: ~/V RjnϢB<ungN ȒHQrJ!D0*-SUVt֊o8A s: r>;ix<1[mE8ۢ5"_j ?te{tOH{%gv!U뢌]Jw hG7d<3@7?"8}9k^Ak2Q$@!{nEw_^_{ .s0P`2Ǥi\Z]B|9^ROZ =\Xx0.mcJmƑeT)lx%ǓD-.1o/O%#_7ڢf(Ws@nLir6ìn) ʡR[BheYH0diٕJm)m TPZ$mq=^[TGlz V#'$yBlCw 11 @X` 'cloۿS~Ӓ&LvY];$,ԿK]'P+A25p&b*䕋Z9jDFcJ39ܔ}o?ju鬪$c [04 aR鹿[<~aT>v4"EhHɂZeo-MP)bmV=PM~(-8EANmݸa::H=~ }c  *Sw :ame,yY܆y5SpӍ$A4ثvB8'u4:S ytI4wڕ-տN@FN_gbYXd*5F'M$<{fG1wh?bk07 7D/$84 _U/^ >)Yh#o'KQ(9;u(FF\5rޚ^` t :$A__kbߺ6vfhaxMiTp5[tX̮U=?{[G Qxz@f_C -f*16`KzFvMEdOETW"z]Maᄏ:pҨFm}o{ؙ15 D j#queaj4}ЈD;&DVa"1$UOsHN a,HPTOYPS:7n/*@*ksL]:TS0Q;%Ҕ$H#4?VU԰fł!C\ꈈZ${ֿr%aiz`J\Y% #Ԥ0,=ZE]PiGjݯC]T@}V @ŪG IqܕmiUv)ԽO Bo`;0XA$$iTDXR#PB(J$#DXBߓp]O ${w-uSM˛p 06M9ecI0oirVLˈpȨph֑BN#E(}W GfiHAM&BWLNث}` (x!D*fDX@e,&ЈHDFFEJ4j+DedydY:iANx9kS}4eU(i.!ig npvë8cm4; 37M `ʠQ(+d*r(Vޑj`"q[g Bq@ (]郘#w),SN+ o5&B`$\=\} qV[̈́Y*iL$^QIbH!?CdA.$dҍUXE=>b/~LMI70L$_X,X:==|:X̃Fm-{/p k /03tuA.u 2cVF@F ! !`R($THqNJ{t4c8KK&g" ^|)4BPJD!IAi𵫗.1⅀ 7'+JpY&lUCqCJhi CQuM*rfJ#GY&)XO4o-M}YlX6a~mxv[i+">bPaY/ǀM""BW&e18wagPP6+(vkyR-O&`rȗX#j̈́ӍgAa^^mʟHrn{lq*!fȯ,Fׇ ^/ݥ*ND"jah0V 8{? Kv-#0dO ي/׬b[ǥnj>Nϭljއ 2:mN?i-vQpU&]0n1uM!p 8l 㠂0B0E lPC:x8}\܎BA M_*h*VC0a0>O▬ǁu,2~j^ŮWӏkoC``դtLg$;k_'v]ݡADa} $)v1HNz`vTl>yb/FD|1hg_}84TR!<ϷN'g-Ȉ4Z;>Kn;8`:z[ڮdτ5.3ѣzV{g;Pk}* 43EnLr> ֌" _ 5>y:^KSGO@RklެLdHT5]?&Ny^k=ؑ uû/?ιj⧵)*¸s/Z#vǝ* QfO }tnjO!I\5]0k`\jTrMi}wqrNd@:Po+s|ܴ!ihߕ*7}\]b~ /()@9vO p';RfRAz@qDBC_r7R?[)_aBCְQU 22)Sds+L)E)k麻n@tJfAWS{nrms@I*3h}Ք(b$G $㉮$6- ..|4V@Sqg_b$A ZE*?/e𑸰Kdw VWmsl  @, b//'n18Z~;gqEвa{-*OIZߕeu fl@ӴzҚ3қ UL>sLW[?j]7<,Q%C/G W@"ukPHe8*}ٿao^?'zt$+z<6UKQm eBdE<f >|OЖt{+˴ə&N W9g^;b@|L2\ d<1Z|筦1n9^ۼTq! CޫE&\waHPD@Sk|M#9˴1ߌ`b@B`KbhW 8QA5G4tNV]_}j0g~׿{>Cy0_Ef2~B8&H)յLcf]lz"('CIaSrʎl4q2Hff>^5#Q:d@]aY\~nǗ̺4Z:ZCZcd&Z{ȌNҿv(/PhkQ_4OS%}$C2ߑ] '8q_ $K@Sޘ!66PژN 8f'`ad^2`/`r0-|8,#+iA鉢nǂfkBo0 {!TN-΢7ڃDUPIiߜl ZI M^XC:svSCF9$9K!rea)gZejm2{tl&Ⱥ5,DwbTh9>'|*,<|JIq0(.^^V/+ R0*=}xQg|֗];+=t]!_ҧ!ȀM~<f~|2[ahPˣ_xX>v֓^#M%.&Di6oSlcPw7EX0WQґL kѦ*=7fdX,eGyi0弱x'pD>YU:À d]h.n ;4$v\~9Γy5Lw)l{ m*dxGt#tdCϬ<̑yDfƚ)H k'Erhy`ڿ⤏0?13 ٟ`}u۷75>/lm+nBVly)kefHaٱ؈@eqC8<" akT*ɽtUnKPFn UgX% ixu97g" Cfh\Zi\(A/;=?(['񏾺 fEE }{,?dOcsp6\NmZ _llV˙]_nY04BλYiYP%4@˯ ;u>:}Ol|=рF@{L-sf5ˑ١t݃P%u$SJl]>F)!ʊEr L H E5%/di<@Gy|n HD7` .m)!u󬈀#q-5P8^nY %819`"?MFC"I4+p!QH>eK8?/?JMv뫤m"ҫrRoH2^{NX -v!e1׼x:ۊ1F83hn^}ŲZ) N@#+f!7DM*μF2,"zΜ$\WpcH$SjdXym4%~cFVWvsG ,PR3nS;i`p&@\ sw۟BY;!yf1keP>^OwЌ22OTАCBY0MlT!Q}:^R}o񿋡ygtP?l^o;J#O+ @ h@X(4D@B,dKZE %EJIc8A$>(̐_uԊT{4*3ZВEQ+*|EdDqVm/$1P:zzgø4T~ ua!! KwC_y[uը눨46pDf(T*DD-Is|븬?n+4fX7H*%2ܹ(~v{Q_oYQ(-Tz25z AF 4G{}w;3_-ҳͫf41ufv.1KJ ڣ6F4KX'?uHWK0:<>1.Ed,CBYY9KW=sg,yrXd"4L: 6vNC0O6\->cy\ /j&\1Pdw00"`r`?) 54AaEtDV r#"q7\U$>QE(q_ O鷫-26uܯznIdHO4>yԫ]gJ0e(tC5x-_`~jrW2 |RL'>h"q_8[~j5+ &Я/B+~޵uiP Ryb$E^Cm>Q+۶,րYAV\sme(f Yn `r%W[/KP 5cR!ץeNƋk<[ey7>“!xvm+@%pT S}N*K1#`3#2ٲn8.sG9lvfBAfXu{}t}A2_zA5cRZTm֩pR02&z˒hS"u!#EC\=3o~tx+pN&; rX1^Vc[?B:@XaRO9!>Ets)/m6-+fQE!W8YX\+>vsʡ1ܼ_X;!`?TW#‰ʍy󼐜b}yJKiakBhr'yv^3P)E+ynN+<4bQa wUuw?Q[TGԟR4|o{S4 e9݈m3DO$jAFdsa\+3u* Dme6F:`}d$YN]I'>{i݇M7ҖZRū>{_d*ۓ45 ~ ^A+5"abz`|jK0ZLZLޞk]=u㿽0@õe\JAgdnGcſ檈'/,3)a B.,pƻ.;mϑ?ts>Si6,GD-"qmr_vH+Q-i +؋]ܥ@u'[c.nhccĩ!}&[ޙ5y֛|UP)&"^YWpzӕ^tbѪY,4!Fk kZbt' /{d2˓5%xcLPIi$*=U,=clb8$p_p-ik2t|O ˍNBi\v8$<&nKLXU_Sׅ}cڬyʮ8,?o="MQ))FkO B>9'"2l-4 {`,B:ǎF5F 5InEcXQ++]#L|'dX3,N)ڸZxހ8nmdz2SVxF՞S aPXW+J@f\5K7w[JX`qxdtD[1|ݓGO@|B>tB8(>]J_vLyIYx\ "4skC~Ϣt՟1/U'2/aH[Y;[g,~I:pNM*kaETSQ u &TkIb%C($1tҁm%8R9尛}2s,PiRrbBjq.771Zr٫f6hWf8-Bc8锆q. ;Fm]l-6۠R RIQ@I}4J/b'ᔖǺq!e_&[vwc|y@Z w@E Ȟ| ҄{ YI|]U_Cen[;ʨ%wHiL iR}qQ ȿ1!cO&%w(.ȃfk'2FuO&U4,$ZO{Jl CeDUT<7q Q͍j~Ś^nMԳ|׫1(ԈCi  &3/M,8qV=ftU |#>F\m~`ym,X51Fk;&@{9`d#hvn:؉n]ug;p@H ׬YDW[*EP{2z}}x?}ahqpIn[&@2Jv~b^y|d41D<[ 6tvwa48 OG5HǻАR"bR@T21ip0Pf 5fL WGS^޳\/sE9OEzJ?_D0ΊGQ|~R6{;#zԻG\+g$BZMSnWT%PczF2JDO6 ǝ6eZ5XÚqCs~YRBv ? .Ǖ1ʔgE:yp@86?&NCN*=$P *ȃ> 4DCdv78!Վښ3FL${a'KH ,E@994Ohqoᐿշ0^O6 7jX=uC.-Ge-cAfkv=H~"lJT&gVu MQmǷ1۠ڸ˧0[ZD5OHGRj$컴8+K1P#P{jNA1f˶`Ύ#g{v-RL2rt ᮾʅٙ< `}>Yn XeA+/Y5t9I0%UsmPq/7[ N,io.^/u}eQ9.ӡ(&۵dPw.#^ nG@ܣב OZ߃я^2i (߄&p~Nz((PV訿jaq݉t"ܑi /AZX_0, aξq*AP%WcUf*$-mΘqJ s @$s*Z jtG5JtCV6͛@oI`ƀK(ȧC|[+D >R-X ]F\3Pj9ƌ_GA]<%TfkH0gC͈z 2|UԊﲌ5-C"Gq"KgʸGo=+23Q;zf2q&0mڏ$][V>*-{Qbb*疺pCZ= {X-pY턄vg^ XYȦ$LuI<ĕ<{jTwDV.Kd!''nb,z9W̫܁!`m.Gs2{o".fƞJL&h "%zR=$p>o ڲ/({4!3/ @@zbcR_6w^-:X|ά31OenX6' 6̙)3WZIKBc.nˏf"0W?tE怋ܾo%~!bcJFZdG@QӍJYA#&@ݙ%&~|>}l9~_ 4#Z@AA5"8ڢi>z*'7c1yPSu2(G߳w52.v-Yէ!Br>rԀ{7*RO^ʵ5)``^G J E9 pP0DY)w\֊'omQ$Z [gMYH? w.w rX"qRK-c~3eRF@e؋$F>e?}AOEܫMg0UN#}5RήG@ði6֠X'i瘑3a~M}.KF!d ?K3:CZ"ʾA{0 봺昽#<Ӥc19f`hZ"awa7>YFË%[6,}umfdh`_d/=D @>t1A 0E1OBi:H``[ _8.v+R#Ǚ@n<&<<-O?7I 0(n ?WA+.i(^S\ qP7~صi!JE_wL𓢞+LpvD;i*Ϟ)+pꢟG {Y`NM|207y'/>jP/HnHTщje;h EʌR8<+Ԉ{ڮ@O3 u߬/7R̸Cd@G l?:6,qtT27{3gA{j ÷2;SPӌe7v!' >ԗ%%_ƖzAOͶܻ RC^ZcV{6R@dqJY `JL@*٘C"e9 zXۯߎߋkKL1mPM4u3K-!^M73ZyV$)6bwPS$@}s~V-5fЩRwx}iSE"[˻$~ Ia(D|p^ۍ ]XoNII+r'bHՃwI{uMKiWȫ %]Y%nhPo0wH&{\% ao;s|҆:`ΟyYͼz]á([;Lܷ>=s`LjHlmqr`h+p0&xbx!qdL^5o3lZ=) cgu&\vi ެ:]?A%2P3FQ|P#Raz'EFYҒ@m2a$ρ(CM|P$DZ׊6=3?/[ DYV|][H" m<4GU=[xI_uY&?%~ꌀ!23eݣ]GM{s\mיPlRvuH5slO" F|0d Ogadtl#-橡wU2koD.Xc`l~ x᥏oE\--g84TL+4PoTʚ{tFJUcX+ Y$~&J;7[J ^͔M񟜳2;1I%zG⓷OlVݙlņ=``" O"2.mw5 ka&fBnt8θNO@~On5})x˩bF9 [ȄIn\fL܋H,~+? F[0hLPk3vc'S}`Q5[L gO8镹<<OƘzVKZrВ EJKynF$g !Z|bPw 1Cn,*ҽ^3^f.) =FE8 eCbaO.V)2_b5c 6`σZ"8dF" d7p#D'u&"u#dɦI_2$aL#>{.BçHԆ bUd  ׮uMw!ͫkJLKGU@AZ<2WGT7Ӌ(U kŬ$:X rJ6>5 ;ސW?SO#TT)5p30WO nY4.*")[9L]^jc{*,F7cRm*t&'"?JZfv'd.%72-(li\xİ/6( > .zn^qFF#FU)V^߫`V" +Bfbst|휕& yyRKl$r PÉ2 @ģb<.sxFq_3Ҫ,v3'TwEjM y/`x8ݝyfP Vy@ #Ee<Մ>p='2JlF#ޒ ұ6B{NsK8e)]$`tjPFkYCIP²/Cs~`g4Fa`OJ& $L1sdKLE%WsƢ=DVV>]J䉄D A&" X#7Vz*Y6ix=( " B +?L'+* HUWkr,l{딋`~?t?j HY rdQ]X~嚠Gs+|Oҟw8_H~r6ЄRSrJD 1 .΁)]XïqNrOLvФ .#9j+GZai+NFGC1@;COR8"nz0TkMRW.{Zyzu-HC@";׈it&V+=(newQA-V7**c;@jRBPPB\Fb<21Td)#*p'* 8W'?Dvַ$L&,{u#,L|ȧ3#VlW?RO1>!:1)&Xa RȤ*Wp1)`1 s3!l}% t?m<*BČ;ןCI۳NvXGr3k9}fļQS%ea`y#V^ӯhnG6«HV)^&̸IiRreA)l[{^ '.JB|>o& ̏8iQ}Ռ9 fug/XH!:^1s%S/ +s, _ݮJ8mDh8X6 rWmSQ =ϧRfZ_(wy?$ڋjYѱgE0oog}I^#(y D{XV51-YhJڎdDy#g(i4tMh%gk}1>X76@醄ͼ(H۞diͩi A !*HZ;8~e3S2ZE{گ ң>d1yU;mP;o hQQpAeN+d({|~hr>#6nn{JP{d#)gs#:Eqh5`s}y]իbF')? 7ģ ~AȄ >yZH?fX!ig6!c.HJ!LZ-})C॑[B{oPׁmKHBo_H !zGL6ypH? ߢQal1?tJe94]ZBiJ%L̕?yMV8ImX "ZI=gJ h,b6,+SŨoaG97E==tγOTYt~ (Z^c#gI 1ZE#hf=UqW-aQ{t[qƃ\kpoAm q к=pWلZI 2Z8Bӽ)#srDe7Hl6IFuyV&6 143˨1w>KXF\9!ocf[0[,D1Xj(&z,QP8nNùJd`la1n\*Jh22J[/X:~K@g*Dʶ:A #`lC6]|;fE2[j0'PO`54RR82 /[KkZ΋{P= r F5I:97:P,)(m͐_ zA\j4eu~okyśqsKs65Z6[n[% V϶=S֜Ewav7QSѱ 43M.nTF]C *av!To2-ٚS6$44=?' eѲDv܂Hʶ[(O@$H #OX&贙!2/)WM%ϋBą X2rJmu?52to G>⼜ܢX ㏰rVb$,ޕM^eQ^'|snWZWԢDp 4wP& RM{\\C8уO$`g\S'ԸpH;3+%幍/sy`Pr=(5틺ק)^(~ʾL~VH2 83.ҽT6QV֝dWgуC{@ʸ{<͔WkqI"=W@DojIy}:W:*x`,f'DvF-n\/0aJwOު.DC\dBs8ሡ𧷪SOc`:H^"b@CAXaUsyL) i v:2q*S`mH\_GOMOIJ$>JΚWm7ըfi5|úb~A*:=C<ضI15:GDz;[7('5aaV!p30@iFӄZWOHޅsJdcV1`~E; h}?0_=QZ6YXLG(C::RRqB h\/GyheUPHdk0?X)VG 5ƶȞkZuT)lOX]Ӗ nz֐fI*@"ew}|Φ~99? P1D;Xn"D_dD Hg!{ IpTmMU=U5]PL' "}vg'OV(0 rVV6bk[^J7 M?|+?R+O[>jhd>]VSDLmv6M,}CQ'#sDI0Frb]STW 7KhHcgAp^6M FtTyr\#Ih!{bJGQyɚ% 9'PXyNPpJ vWn *.U28FWS"A'z^GeޥV?p &R4ЎɱԳCx55 U[ tuj((!(c {j&ilP>(Su<|hH˅J8 Lk <Ɵ})@Z$ŎELh|c(p㴽eR oW o}]"O '~DI `jeP)5Xv!:߽ݩ!&$v͵7rP&Ϣ HuF(i keQ( $f8cU1o}hxT4^e즺?`CA , W\<B>~`@-QczF~ kk u'?w|<=!^˵"vx;o8d^ҮΫ֥N3ɩ,1Vkys<9%3v/2kFغt[3Kv=ydq 6+(/h/8 *:akR3֣m X]EY=" aW%d@( |PˣIT{6L:g0 =^Rh͢D%3 1waf֎͖m>a{ ܓ D^^I9HN^pe" "<~M?Yxu1MZӅJZ:,ca;\+xM?xN}D@v[ ^~.H|TzԘ.ܩ3sA%UDk剦<\\zI5GC*vE_| x.R[ГhF~"t91~m1otZLNFSije75so̬pmܳ,KÅk'i+S$iv_+):|I v()Uhl`ֶE' c9D6fWG-yw :wI>%k]otGmU<׮tSF沏Z̞t}d521];dvf$s-^ cmAT[ QYkGj5?'@QᦞT4I\9xE$5^vEe+tZòeFR9'mSUE(GZiiiQۊ،I|n w^{6&|0kքgGOA JfMt5 GP1[YLC>8Q>Z "B{Yc_`n,7$9HXZ;.G5~$$!bY^а&84 {#+.|Ӆ"+^VҁλXXH N&B`P,VIvH&MNTM볕Sև%fLYO҃u(- : ";qQ Yp}w?4SA_T9U@WĬڪQDMF>)/eKH~ψU3&-zõq"OwÓljgԊº(|/^;u/4חE~FB^GGH$^evUw @|neٻL+/fe"٭rOD` ḯZ[H)RS:~[Ǖ+tqEB_ &2&,42pK$ے}Gg?Z&Q=GabB:^`Wo /X4)%ѶcLuq1aVwhNU"S8L B p g1_x݊QS &c4(aUrV4I*W`$5a]6GW:pٚXeݯ vϝۗWdT .ĿG= 2NA27a3FޘO{ Oɫd >Ɓ({F-=fm|wxXOuoR۫EdP 7fsYHܓ.Źl5˸`!&[׹i4woQ0$ij'4<$Q\5v{k8BcL ,Wإ) ULv"]0\Yy}H}"wpbw y}m臤 aw{iȜ\yE*fM/YžYW.,GO#EIXHpQ3c IVxY?"*NKhh5M1Bl%6-xN{ߴ )VUQY-#`q鍝q}bzwm;{]/Ti؂սʟ[M uc  1 l[M\XRQA#$ s,IO)(`Uo ,(ZSZP|7U\aR=ϢK!M&]mmԱvaxoObTV  ux͘QlI5e_On/"#:|J{"lY~ߐWP3d g2Az۷8뢘Gk'e<4fR%:ACSs, @:N@? !c&k]9@;9D7zH|y*_+~  ?xw1D zdQM#՛1jӧ7}̅Ճܭ{+KT%4k4}U{.tiy4*0%h=o͟u0g+XuAeJs9 +R#ȢwNeA R|Dr{KgY[U4 u(wzR?)} ڢ>_$Cހ΃ :i 2e;u& 1`3N;MTΝ݉$S`8+|ĉNTc$u!}u^M.8y<%{'q,BЕӳ^vխ R2n3rl ,";ObTR4Apzin! 2soӠ? FcKW! A33V'F4#z/eTYĿV= } iNd"Y@}{zDžxxcsCW.u* m|"?Z| G:gKNtr#~ZB*ƹ< yIQBclD6 8;}ʃ"04F47j #=R1{ngl=cB|]ɹndbr$o?J%\2".8Acƺ91CkWhw'>#vR.Q|$y|/Fw @2sFf {42F 0r$^:{6Z\t䂾R>5YˆIXsrn[ulN_d#r>L_#`wfӒ&KSЭWNS7^K+m\ LkT,=lɲ)Fx>e^<^KD'tl!G ~_oDiiG Υy1 O$%>í'NM=Jś#@N!?骥O&l2vI*MclᘲGV4&J8g.%Q yM*/bu :V0Mi#^si<=6nR9O"6bSis|O7ЁA Ώ]"2D6U{ԛ3 )#5:~Mȫs GKź_e pZ(U75"ql][ܲd5iLFJp9.UP_!Cவk؅$ep&jv_Hg1FfVf.;+w5i9R+2vQ ") /VmtCឱC't 撯տՆt*gLe)gQ~!@ @6` ߹R!7&S@xQ0.NR?C)N,D  ʼn d/}Ԗj?Xn_Lfھm)NP8qD ×5ޒ#Nj@Vo)PF %RxˢN_7|R>ʕcrG|im5޶?2SIc|a_, {ں7w/Z?rU^ԭGy zU 4]:tNrPɰ#|l×@. ?RjG1< [aRV0S<]|A( ni 6K {d韎F-S.GWT]SHKô@ -_%!movj̺bj!}dt1{Â~0 rH4J־QOI6͗ۙ9s⏷WxP^Ϳ*[I"lm=}q `6ve1׀ d(uS<VF~mEe_E|8,%㷎𙷚:ࢩG;ٿaBTa OjF}},KF0rɽW/I9I!WYS2OֈC#tؙf! I}-XuPf{sGg(qϳqy[{4,W\Wh5fZ-9 嗯}O$ـxV;g}Q |j4)>V@Cy~xZ𓞄%0h]jb'CdۍT눾?D62s>-sOQ H 8$_V?@t\'N+O0 S}}X_xa$˝oNZ't`/`qOPmM?|dpC9B% mt=4|8)^SHT^nɮ}]tE P=2-%BtR:ܓP0Li[Z²F=s*w 1| Ni6|M,bw $m%$jۗݞ:ڽD-"Q3c㉅B4'٫c|U5;x\vwzۧɉl3k61󅱅3; m2%u $~?U(HY,~I1~p,F }sx/})oG+ȭ:GM_ȸ^-Ӆ[C?2}sRl7w`i{W/rf2gCZ%v۷/&rðͳV_A`ˊw*D M:2#aYێ;!un ?_{ϓʋNʲY}$ YŹ!2rϛV$-`\IҔB BNqVf?\+y9\Çmn[)_B>QGD%7:_aToijz#~)v߾[}1m_$ ǜ~FR;c:?(;tJD;$[4T,e̡ia#НZz"׾:NJ(cpC\Nyٱzb"3`R맻,ow;OuL$(,ꉛY3%ٲU13nQN\ -3X.tU.2o"z3OeQ8z`ÐVyJl/AB1" 'KUz%%E#ߋ?]l-Fh64.,ěS w`Vjmq; BPܪk,J i Kδxu6S?X몧Pk^{=4B)H=v*^u܋ؤ%@;(CWEHk!ztP^F\iA'v{@ ?uʭ?#PX~1!Rdi5!ʬ8AIDs YLlv=^9Q_xZ+fPt\tEOoͷ.a o?wśRgR[;@ fXoZa:a}'-<ɺK7s.+Ӊ.6#߿Wm&38$ËE7pj`@ɗpɐgxcDW5WgSC"cO:꜔{:$qļ^k(W!&K]J%5 n&_<; ML6` Q=V|+t5[Q蛍0VnTq ӷ bZ7: p][YO jG]-V%ϭއK1ey:3@QfSoX0切 )jo>(͵[:@Q>mOUZ4v5`)Ѯڑs#RL _o?cuc +Պ s^t\S4S|MQsg]v3zlDi=A{O_Gug%[<:!CZhIhow5ۗӋOqtl$ƮA}.6ǁ2sF3ڡ& oZPM8eG ^u WW)fkHDYNt]$qc%POi_ |@VoH 0h-ǀ-ЀyfrE͡3ph=uV\Uͫ{O䱳a))׫ 2?njX X|,9|t?S*67sM҉DϛzѤR26fMqk;yU>/'pi4dǞMM\%h==2SɎ[0g<r%@P|ك Z up#h1K-M7UV%lPdo蜠6f}#:VΪ,=)"Z@h|v5pJ!:`5{EYTIjVw,YPb|GÁ>O}u="I}<r e*pStz/ifGQ(Sa/>7ۗğx!YK7-˖z `WM: .0<82AY7RjUI*zn1s CV>,3uQUW:.;gT%2'!'x Yݱ4[:<Gəm(tMU=Sxʜ(uRԼqXR+gx En7 $F-E%e)5*!"EIcYa? Ҏ b[F|,&k)޹D‡TꦏKrۧg E$4Qx8ofݎCгG"7lIC}\@b|̽5R״3/?R%u `XUKؚ',0}[SqUblX%OLr.M wPsFzIFsuȆnZ!ܭ 4`T0&K.t3`l >̖o޹ϺSNiɝJSe<:V-;;"cǚ  ODȖluu9~XZiP~.%WRHM?hTTWP82A@,pnst Up+Crvou>3/">5xfwL\SֳXQ3jy݈)G q_Z/w^k|%ce8ar/>3˅H?q{6;^wi Kmӕyqs Pm*!ͺ[,4N7WL NiȗI|~U&Y/кbnQxycCyeQV {Mt?rAx3ʋ-aN l]EY hY;iHXK d$#E d`ٚRKC5$gf~>RL2#amdJ.N7FC!d_0wy2(`qt`=1$~}Rms3%czۊ  Ç&*7,K8gw᠗z[ rus+!4vt~2aSI:f;,_:lDBr^<_7 -fC7BpU= #ךǁ A,VtH`1@Oi97ZKԆ? ~x4~l䆒F:mrԔTUdi LSev}$;,tt`POY{ܷhM$sDCsӉe!W:s" zI%*ԭĵ&CX?-D]iݜ4 Ƥ(ozC㖄c,,z!??hCg/Ury#]YLI ?PFKLE5' |m~lgド&^NVaẍ́:)U®G\:Wt^b6@97,ʋ^'qI\4~eYyM,>l,՟ "]lƸD$Q!7k />D8M HoPfBUp.fdjO9p<Әr?C5ܧjeN^oeYr},Tdz׳II1-i2Ù?&Ҳ[S&58zv.?XM{9ŸjHM  1Pyt@`hZ./Ft] >@}x6r^2aU|0{ǚbá^7ju7_g7Y2<&1Ğ`{Odh 'Zvt /ξg[Sv|AD`e{XmhV𗉦xQG(T姒Fu6`M4Q(2t!l^z2!t20J# (KQ|Byrg¨h'.8(< A3tE~[PA.qͦrQzQIr==%ȿ]c\DydiBiӱ须o1f!%CҢ=ǖw54jvΫ`Vy׆e4JJJe2yLXt~HvФ,VRv^ьgS8[?"7uOљaubMf)[R:*܎xv=EN[>ۭmfv1[x)N~a.coUMl:O{ 'dT?\'y;\8 )H]>eP#,a^A"$w^NuФ?tf:(-9E=!jWECpu(9'K <ҊԆgD0a[#v;8] M͈D$^ 1JQ#8gX6uF]^SSGvXj\RJ{gPlI%j8M ^_WJv{Ȓ\M^>k@/gm[z8盯Pw̑~7(ϴVx/c ✪zvOď|=W" "!-%=Cx5M'mox]3+,*\vJ6Dv3qr)mM[8bBN)9M%Qd,}G۹ _?VK^V#; ,Ӳ7kBj8kMӒ#ɴ?uR? gUB`oFG?ɕou 'gVHȊuRnU֒yt-O[ThH;niw̢29ZR?dK9>)s ͬh\YN8|͘"S% 8ˆVMsR""2بHox?8,KgD;|#Z5^lȕhj cu*)(px+H? ^V_,U?7û#7WyNyv35G%f؞ 4D@JNSLcwgӋU7B-5 hAQl(ZZa*Q@-+DΥDKĴX`'ɂqBuY~h"b!Dq\\׈Zdj,}$ayS8E5QTKEn+x'a{B#`0a!e{^/ibmLtd*sc!ALp3`hЖSl2N1eU5&#FOH (@Sp?`U]"z\5 $VLDm‚?(SˏB<\3;)n; TJ%KCC:cK$ KOЈR*2v+ l$Tut]|bmZfOkourȟ%-Zq0ۈթ>o˫ `v%h%`JݔhUv M)~| Wt.Y:ɨԁ< 8![4l?xJMm(JsEOk{ny+0KKKz2h6 x _?E@TID!(at" 5_GgKN`]U! LI~^(O@P 4!8?m< JeO^.7ɍx4xnw-L8pRm^ s!%o)  ZXM{^DA&Y&nE@HA׽T#Cgo$ B}Ua~^Wyq?{]=: =wFB&ђx?I_TG>?.NW Egh2ɷ,9kU>F{V/v:dͱGhw]D [مN5Vm*z!gR!UflkU|lz9E1B f_X2Ol^Ef"yK%ur6gk!SeW`S1[ά.a|9nTG+FP>F&i9hקa2>,gLf`\H/\}*{[.*x\p\yi \zp+ҥ@Ax';ɍ{IބM̾jd4-s?.M:YCKxÄש^?]i$l8#dV V1~x$+"`qb /qφg4>_!i˫(v.r#EС9xǚ"aefax3mz6GLNnWGt*hxThdETQԒi&n96IBlZ/J Y둢o?C>z1J%+ r@WリeKmBnw2&B 94?l.~h)IGHdN0,-SX@2uz IFa Bs^Uc~!/߱5SϳᵳQW&Xqo^!"M)CؽJ"@(#i: uOm{V΋~7@ K2cUkۃᄮABCX0#lpؾwhOGd 7c%LK@ch#YўMrqc'ր 6b eae3"*'2@Wbhh3:s9qk]3@Ӎ"sE(T50.=6rlmX;{)Л8RhǗ,KY3n<3~Bn C"@%jQkwK$ GgєC`'C[MkzÇ\8bc+IN@"@Kzzy@$:-V:ߟfP sJL<M5)LٙL,^Eʣ)Äs֭|\&!\cD箐t:MH>cw_ο(m0㜚2fN[Yӫ/xWtp/Ttw©=DKjޑ"ѷl='^mfj_*N 8{8N{`abBޗ@@ e.A8жʝ\9 韞"X6뾩:a=1#$Xxm."-PxLKDj)Ӥ&t}L.7d/o8.^(wׁgނUzʩy1( ב_?G̏nwKr@'Z!^3Z%v! eλ@/hR V&bVx8F:?Əy!Qߜ_Zk<102X㤕`k{oPEҿI5Q8w# L&٧Lx\ÉYJ-T ._)t? -bEM"{]t@p"8j%γT} ,MW( % ߈s c8o7`)b{A. x  ajӺES5`{%({(38cT$/RBKC`o%vaj;|NǶM[uj|~("ЗS *Lj9OfjR=^q'Z+{ "Eڔ;\y̕bGq+S.<Sѥ&+ S`=^GO 1C֔у vuW?ڦbS`Q\x;ѬtG2OΏ<ZNQAτr"oNFݞM[zdf+I몔!2s_?cу9N,/b#jNߠ : k;u!EY;>c^'Ben}O^?>B~%xORJ 4";6Ƚ}W }~zQ'uGmYoPVˊ ?e=߶U$S=oqM}ٕK:.-ʢ 3gUbF _vWqvvJr S7ˍT2Ҏ[i`-}x-Ӭ%T8MY(Ք(øf9 UTȁVE9 ^/5BE;ҥrPPK<.gK|; x y٧H?@{h|﷉]y]]<8}A`4 @(, 5QӪNOr"[CNT-ƗE~LBϝ-!趾J`0*i_Ub =5 8=o yr?QX=}n.i(~kΣܟ:hd.dLFFP ߤǥ| -Qa;vq2 2: U&+Ij3ZhŮxhOw@z);]!Cuۖuds\FDZ5Ŷ(&„ 8C"iu) BͬoOknۉJаxzfdI{9"ɫn[tL^d}:[iˋמ`3ic%jc6Ҿ qsjxR"yOw ?V9Vy&6@w2fi@^aZ.Ƥ5i͜@[=Dއ l?[t+Qw$>  +oɺ|pNNb-xX(%dP wVGE e8% V;(޼}U3 Noh[]Ĕ0^ӢN'lG4~\U%6WKk>kRDхb04>6 Ϩ%Ϧ4\x7_͙ܳ%=D6Hn~Y.ۢ+zQWl(x`y}/ʺq K*-K+@t<òm,jXiMw, *Zy8K-\ l-pQ h}UO]aKkyvǵK<_cgXlÞ#'VQ8rH+3ETP ͆5yZbD+i#'k(!w|"JkpK-z:{޼IL8 /Ӻ n疸1nD/g]N~ذ\KѫTo@! ь`X)P`$,"BG`,.>luk͖.QG auIQSGb*K &72!|4)@_`mO {`L._{U>4T,IF9pͧՎKTW״\wO_HZfax? a:iӳDcO%~I$ُ(w(\^(pgmO?dt~-7Oj, ZJ +SP0N'[zU@'Aifo^`n GĽKuXNu\ m6.E#2%WunBM(]29p-;4a' |qvH61EM]Gt6"8Eusz8ױf:?;- k4l\a U!|;q\0]D;OFLutB`f}-JqB- 8oNR oH xDP^I(,g%Z<{pGI#2'd9X#wnS$igƉ Ӽ'qʌ;;mJ>'eǎ;+41.UMKwxׄ>%ye붶d2ƃF*nR4M=Rc1EQU!7QV"UBygۻ;hr<鱴W}l$>[gP^ʋ:)G 4#1bJȥ%[+N':YMC0ӃPoS FXvyJa"F;xW}1 >ZE87&WlB{䇻2.e1{HQD8geӂ_{Ӥ>߻M0ZizTg)ch,&՗^L"CӼhmFV6mʕYkC49v;C_Ю/苶s^\cۄ'.g%$#7/{>(@6 p4,2-8 S43O^O sgļZlS])2G-+ el..6W}6 1d ` ލ"_)D]jY]$XAޚfl{9--Pm`L'AW:i#-+5_.0m}aLr{GuNAAk#hӯ]h+բߺ-#Uv=gW9|}v.& JMt* SP{J([ ry< Pۣ I աv:ez+Qə8`u|Clvb:< |YRQ֊0kdV=1B>On,~@Tx8 _W,W>*,sb.eS@)潮?6pgyzE 2SE*叧4Co.]d˕{(qWL*'uS*8SV>vJwC<ư}OolN^Z~?e#=`Ti\'bGRzoHH9c7+;_=Tq%y'5ʁuQrG :^^dkzČ0!Kl%ϸOw^ZmY@ ?qnJ"F Zeۋc*5{|/":RZLC4bL;˞{фfw:>/@Sct [ t0:m) &s L5-Xz!8[xKpMkl0򃟟&elD Ś OkhϡSpXFruE=7^CfaGel&W,}kw:2+}5}֖F] 5CԻ椆 h?Y}w:Arx0kL͞rC0No }h+o7R\hI%ƪKɉWo+6Y!/ܹ WW}(mdI1) '5|\' H ;-^k&:?uy{|.ȲN);3ѣV9$Ϝ<;p@lEIhi B->Boרn?*ōW.j3"RZvm]q1.=ڷloZUx)~*v7]0 )\p(@}1JM͞7SY/}E6GE:?;èqV3g|Jx~A.H[H9](U^t ;}̸pqNEXCbpdҪ7_-ٽŪQN#'c ՖncewrIܪb'Dp^z]1~YϚU{p;ɱ+ʷ|ٔ?xD~}Ed~Hgj%ul5Gc {PFR]޲Y+ŀT-V_፿1uT5s,Yc)B@Ζ)ˬʓH4utU5ZeQtө@#de )ڕ/f-12:0$eiT.Ij? NWWٓYE"}veN71FA_B.F? b JqF\'bVytr*6VB909^=%Nv\#tSyL- \DB /iot]u7UKT5&x6ɐ`);R1~]&֔`GWkAj Df F3(Ol#(lza -oyy<WZwk`vYLi<p8d¿s8IW*~-'~fyT@'23]\ɒ;Emxn#EG./)4_f+[z?WKђo@& ORj|L3!TՈ I'NZgJ|-L9THbW2B/^٥E~]M[[R<˩+j oDq&~.pc `H䩘~9ku@ 7792^?)5C6 'xm<ڂJvqo%a$Q~8lw>v Z񚟅.W;]V俇E_Y<^{{1a J6fpcg79@ c(إ?G8$Z[N.c/a1ss2{W1_&Ю:u*b`jmiVzV)qTٽ2:M H2!-d~;v0/;NDyʲ*C_L*p[TsH$"YL|푫0T iAbwjz+^T02*_l3 %_0IwS{<44ԧY\l?`1dІJbR|%);nYpe$ВadOܦg(qOo a^p+_8$w}3Vnƶ:Wv1;QFjdjUm٣>笷ak #9W%>8"0|1f5bL5ڇ*y"23U,ؙ#̘ X~?XM҉ !1[NNIM깛'$9( q[yUyL)poKAa<عŦ"GϸvwuSlst&cwj@?)?$4k0!6^_ԉSZRʛP)Z?HkOv*Ypc yxtv l/8VHS hr 2 {ˣ! {Вm&54:h`򝭔Uog=1j_R8eΜڳιD5!0/Si6>AWkjͫŮŢDM.Zoblϧ]+[4`>[dU· tY`J^%l$|ϫ4_t[b;' 0A%d92,L<8/eC@z;kmi{&%C#,],q$-+ |Ϻ%LIlYO?'~6x`onJ>#ݘ[O ̺w8H\[Q.ևf܂PX-N6iR))w_ zLʓ8XyJDٽ(Lqa]̓V;{skxRr:iaBUtog^D^*(-gwggm֘Nۚ7+|Ӷ|6ޅZ#wuCS΂`'mPN>1qE%l?Щ:!md[=) IU,\ 'WwINMV(9TT{GYOX gy|fl|rS0AmcaݔQ6ךTL`yJ@ "Z_>܇ԃ&b_2.2}=ަ5G q-BYiVmiJ͔~awD҆5IVqg H 'ڋޮz3o3C =4ЫcRJ"k,o vG}w|gk*{#Z㬣:;_I<ʸrRѬ~6c,\^EYX ުU=6)~6+_D#yDjSs[YD12!IMz!EW笯o<# M.]Zİ֍O漭z!qˊˑRhK@EUy? Kr;$tʿR] +%uo!O '@B|d#7ͬ ۻӉO漤 1RoA ӧ Qxp8#@+Ϸ1%LfF=aG fQӀ7>%R̚^ :MVfׄIaڈяՃE'\OrA$Q7zɔME*zOT$xZmpw FOTD]pto,ȣ\v*uEj73Ŝ"IP33w\Mի&kaMhucqn^OLŦˍΔ&RYBם=-^4)64*@n 9a28KUXYdN,gO#ۧ$?^Vݗ9s}@)Ȣ7$FRbF!)p-xl~j814D?T:#AmpĎi_5D/DJ@m؋nv`t*M ?Fjf 2'3B9fma@P zjli}4>|餳nD;wP>_I,z/+u=MNsM>b*UV'iAM; @ -)i pox@S\ˆ2p QMmqM֨2S lriťO3 lr\z']!GKGASn>~*_QH.JVgdxUA`?޿yz\쿆w Lr{9OWz*nrHZq9E3iM>hll#%rM.CEJrRIo]qۇFZ^(Q_hh%ڔВm1IYՓق W 7d j)Gq*Ds e'ٶ2FΕKT.R27ӣޑɚ_/|*a yPԃt1"y֭dr:pUh i\67jO);[6P Y Uwtп-I珕C4R@~$U[P. YoP|c/} (ְ+ eB9c؃bC& eX,SoU~UL=Waɇ,80Ʀ*T\(.gPV>s=!YTa40󱨷DFևqBsmpUGb=vnajmw&N&U't/Zf')?Ƽ0Ѡ<0`xZ+N Sۇ@0{&.fdsFL=Aҝ^\<%Iy%cb z@;/c:K\e63@ԨlC3U-[ |HZ-傕1_$E󻪏 ``Z!PȊ?uT(8hqsƤ6ߚc(j8_yOw~̪aId@)Y5w ՘цrOE߻RFw)QHク VȊJђAgR_~"'<ϙ4a^xK`[y ;*5C08/:Ǧ%>!1~ğe2;Om7XL~?:0m%IzBcvQ.ȴ&돴fcGMY6qv9W1xyK&P&v|GIsy^ZM 2%Oc٘MO_Vq<$Ʈ7q-,Z*UCꙆ@t5xժJzLfdK^^$&aE$ZJ/-'kBH*ᄇ\ѪfHB-VZj4JOX\HK7x>Xj!-,u?o< 4ݱezt풣jW0e紷)\3G(MYj㹥mb7Ön:J9R7cA; `gh:zע~^0 ܶ4ȼN~YzمRA%i sĿTb&-\FjptQX!SpZ_iuݢe lyŮ>OU*r5_,IM?[+d{o4͸ܸL0p:&KѮ^ٓx! 'GIPʌad q~9AdMT TI{ֹm/'O\/#h.HUPs8R yHZ.c  eW5G6wq%lzu|)8&mm JJXo-e;^lvre3S47.~px֟Ȋߥt2";HWf R9z MuvBʆpPAD_ޒIV1>jW9} VF{f8.:8]Bȳ)Ԝ7GL`SiˬTfE;66*~^y{Ѷz>qmOG2L3֞X#c[rr[Ya2]A;Ni ˵_}N C*T.{48,SEr6Qa®'%gw5PɱuͳZ8{][pp>ؚOCʮtܗC/?'B=IrCA&S80xjbZf}.[eNV"A>sM~ _aYmBFLC!E@Ywݝ4i?~94bWL N"[KϺXQQ1:Q:!OFk.Y'd!|%jnx#ƋVmo|m@Bf7Գ˯Gy8jvWZ.8u7 nĶʴ~ `6dZE#CCg^|OeVfpe ѾG'^ 5%{Rz颋ݣ؜ZlOWU/Ӭh~TJKZd<V,o 8J/gGu &BzaEq%sIS/6OBTjn$ږu’UTgЉ/XԜV9VQ vCMsB_{jl6Su9JEtYR)X삄5ghV֤!B,cXgm)ޮeј&70 JX5a9r[ƶNUٍnniVK> ҄O>39UY$3E4w9ή_dQ}On`=cjûRIC'̽) Ě|>ZXT&ީ[5Bpn:hi5Z>8&"yF_%K,!>p$(*GLaI24ɝ|$ MAtJ"M~Y΅b]O nn=ݯcoo>LAҭڷzݖM( &(#R)3Q<?j./)Mi\ԿFr\+`z Ca`]/47#_gݓר4~Dx؟f@qBu|{pSAIY8+ -肰*04ËH) CZ ~a9ޫ=k=҅ @h8M? kbZ^h \PT\J@x qO %: tK&IV쉟`q%4/ Gee ?$V'qtf15rH-AYZ@!h=j>W|ubd& S/J^E-LKm6~>z&siB?tyVTtDRdVond7s:G}Y}0ziݚu%ذd(v,W: O Huۨc\3=0mU-#ɡ y-r/6ZWCQM5Rk%5+WNyby7]: P;kv ] K śxh?D"~9" ~CQn<1U/`Q!0)M_x׫'cS[$n\2ɰF~Qb,s:>u:ݯѯB'NzwqS~;F $L@l6Ro/.Ѯoc:LjS #OGyK;sWE3 8p}'1thj&>)𡯐,?U@PN;0ޟ2.B$iTk| !u] Έ<>Ap\IPvjn[x;;ȸmSߩߋ!/B{Df>fZF<3S~G={mawa1Kn$^:n@s@|[8 ?!,𷻣'{3 ܭ5e@*|b PDCՊ4n% lQH[& L ^}^=ޯ9Z&,(9'[YVM5vΝUU:9_04$(X':?YMḺvd| b|1L 3Ĉ.L.&O~F<א`KДm#[k )%O`24g#ыIzɆ>s(?UL\5zZ ބykZo=Yiڿvh-I,"PƲ}K)'T<L3%g11#9E>oƖ@=6+tl̀=o>h"ep66w즯 sH knDgҿl`pziY0t5^.jl,)?ߎK`i_'zfRW-==qG$&ם͍7 zm2LDy遰m/F%}Zi~s,k]w^}g2(T k)ukj:_i;`HPo~RZ՞9o,Pm:`L7,ۿrkT= õ0Nl2\Lb[`a9ZŮ:Ֆᦍa͝YSX7K'+_Gj/(`tnm{iDP;]C>=n{,0c9}d]cӘHZg~o%<џzT@~CU⧺y[ ?pULyѾ.˞D =Hr4#hӦV<7reUe{PeV(D!+ y>3L&)*\}7?JxN5*yy6(trx"_q_* FQ;[$hHqU0 oꈳ8uY~"6P?n+Vc7]C;r! ax@[:KbDrS+I;5`voP)q%<tT㵔);S|,zhH(ޒYQ5ik ٤YK*`ox94wP/nۖ*} 9Thbш xqocOuP$!ӳ~WF㮗EQr&aqΒ, U 1θܬ dXc4/'&]vdC۰> AT]`܂#bav"d=D]Ez}>A: ĈVXaqyD,#QB!Ȑ/cߣ}JB?@i\nÂW%.U7w.Ͳ͞% 3KSx Nި *)*9a{҆E>`OɧM(K"F譀 fTwBb3hgb;B8ߡҫ2r19DjwKů]GKHZ&6i ~Mv>8.p `gR+Y%@;PyDhtܮ4Kb wj@-]1VI"?-py3IV'O!`?Nk8WvhP?M@m:)fsƢOmaЈY)m% x{K`54JߴsMI™C0Xt5xZPfِ۬5JIZ0vr$m2E዁5t?|e# X>q@~R13r +OeE)&=P_cWO??]:֊pE5'$jPZdQΐiG`괵ު H]&G˞^o_.vi%;7?x"$3eJ&4%"EO km0LO }YO7M(#$rɟ 9U>~s>*NVagӐ;dj &ŹnmĢMc m(!i %ŠM` HwHGګ0FU@JbueUF,b.l6KMr.5 YtZ3jK7F6%p{[%͚X$*}"R7K(@r4ԫ'6QkФ~{%6J%cl;&Lsȥ2N%QIY gkX<6YڎvƑݭ uP%[;?[uJADBb/"/^(WC?ta[K6MsA-vrE q2OVzfԯm'Aq]x+њWX! %'r#)x;97!b&ӠsDKȴ4m3[͇ɿ*獷4K 5ѩ?ՐA+Η*ɂ2B1)Ӟd3ٳ.>بԨvXE{nۂ90$݆=m޵oG2B亞߮64{IU;L-x)c[P* M[KcZ "in+eOaes[ߩ"KyC( RR/49ʓ"[|R=aVzjJ7$݈OsUFD83n&[,ħL?ۚ<>$y BAW4˽~ßF^_^r ʒI?C7b'<|\ w*AE6yT.ܱ Ҳ-Կ`G~AXI:vn=OJLKzkg#e߱E=?!0<=]a PX PKhv"(/d˃avS 5җ8mNa^4 \Zc5i+V˿@\%1̣oQcJ>c?d.PP8|U0TOS~bŲ=9=}?aڽ Y,H_\;9%J9\| }^ rYbsEriU#K\x3~ȶwboUndTە l*lrD+|zr}w1 ZgzۻPu%,=ФNx\I~ҏ3^x'ЦCM^_`)v4+umg c֤u2#{T2 >d Ƹho#L$}mFN a٘f$~-Hk(rJY: Q8+ ]z NfW5L/3bvy{W{Np ׉[!Y#Qs[.zr!Y"]-r!Lln>yrs*ŝDK*dMW"1!eAIu!2sc}W%HFIC<&)oL3QrpV,fwjv \i׋čT!_`2U3u-y'a)m*chǟ/&a*Dy"ͅb͛`Lr wE8 *:{1Z7zF#xalyVB2HtC?YN"S|GfnK LQchN1[kfhș5R_YrgtoX?Uʓ!= hD Wq ݆n^W{AK?k(9m@_)Nwf3!i񩿧JN$&|칂p@WDɣKa8M 67Yw[$ܭPE ]s̼A[M_Ayuħ5䧑^{5L&҄wQr[~5ozYRq$VoFБ~@qPbڟaL0#>-U(!zV¾0XkO^hѵjwUeBNU̶'01*>:5y _6Z(4؈2 BόH & rpgơu+gv-08 G>&cIPW~{VtΆSI0GJ.i'#Խ?c h项_AJ4f{V;/ (*U֪Q 6&N|d?>z[V/xZlJ-Knf.M!GPY۟LS,SmJ`i7nYwj`3s9jsF=v[Fc\&RFW0ҿQ8_*QHL$3"GWsOwܿÕ$[ؔe?ήn0NX*)ĬCg2$ȕG? Ѩvm!wybH{0|aGRAFP282*ViII%r!F?TJYu(fxY CKƃ >sג~R]xy$0tFWW6)U Γ|ͥ?dJpY;/N"3J!9 5ps?;(T9yc_UFnDFAUu ~d ,ͭ)\Aٞ+ĸ"9_zjK[JAYQVLι`Y-Gu G=+Y/y(.*Uo!ݭHD* jκr C7nDnXyp;S1`ˬhfGFyYo}J7pqqB #WTaEPqɩG//\ɗU便Ott qC˕w?kW.glrE2Á"P^^ׁ[q2ՂEz"^أt6j&tYG6ň]/Tp0!9j;xrx/_E?7R\m]:-;(\Q(@^AtKͲo\EjX |A.b Mϻd], Y&^`KNcSr%[,=ћSʹ(Ζҽ.8hnP@ VPqn#Xo@Cw | "PjԯJn/$e*+?2;n Tuw`L"? Ntt<\?JQa9OqX: UksX{JM-cU_q(q8DwxCsCٛ2z'{K}o_0{J>k0zu4&q'K 6HYo⣯SQ 6qXW6r2 嵚s Aa+Q+O]2B.@xVZ<>BzR{+L %eVB-u7C}݈Vswr8DU0jq{Ԋbצ/M8 Bi6' 0Hmܝ4瓫!Y[]^CB?)AuEwh ,-k[0\&~)GgıERwwESCuPJ49[^AD9Ͻ"@gB-Ҥ@_HǗ̅'US.cBAN+Սʋ8۠KxM&s~6:iWtc#p7t)μϝ/z+]yWX/oƃo_`z.2nKoy,5^y4"lL8 oŃ~zc4sv\,*>>d߭gU.+2W:0S&^{U|uC5g :El a(lb_#1'IH99`W},F4fI1&!λ;"J?=Jx+˫xbI%d 6pZpnJɃE{d%+$lig0{xhȭ⹄B3'<5H"LqX+=rL`xmw_;{{6: IAJoJh|-K. 5yb@㮠vm?˱.c;[a6jrZca cг ̄IS2kqQ8tѤSddiZ FEb[;|vh"ãlq%cjZY0Jg .3╛}hƳpcX") y43֘#+Ǵe{J 1X*`}ւwJbf2i,Cvjˣr0d նAWBMi+h]NmTgZ;M'ʲRhfrTmF|B㽰.;o!qD=&1'Dd`a6Ka5QYnhOLUCuNLp55j`ʽO&!Vh/P@9b.V^[~J~QfEl5zR EDimVoWz:gEdC4oL.Əij.:ae'^|ΦϳѺnP'0#@2ILq E ݵ$v"ĵmlh<]oD‰@Ԑ["e2`Ν 'f/oP Ա(4CHZiǜ#襜"9m̕ieDz1V~,g'}Ji4{|  AaC"k ŲM zC^2F\4`?'1zE/X\9f@r;#0bYoNgY|p>ViԗőE@ }ŵrDSOvW4 _+9a+ǍeĂ S4ҳ(l=nO~i7X(øqM+pc&酐AzU51ăǔ` Uyt;N:)Ky+Vk ETֳJw`&\T 1gv<2}yuLuq$@ح|nJHcEs?adaFY RpOr.ּ髧z=U{ڂ@jߗ? tV*\쥚 p}N*T* n-BqZvļBى3 ^5dx[_W!z's؛# O٫= ꜻ zWy$ `Ȥ_3#_.TD{?&l^,L08 >ֶBFTbF]~hT\>W"H95LS\o Y!*;L} B^͉E߽ Dr1UtYġy@ӻBW^iaİ11[f1wOi4Sf+/~e3qI.Ej݁F4w yۢ$g䆷|f{sf!J 8yф[DA޲.׶X G> 'h{@LOgeS.!DsRlpި(KK`l2qPFc3b>à֟ή alLUS1tDOCۑ̘/9LB3 ;޼hl1(W(#sKD2!@xs{Z!X .p' i{teJT@d!Cejw/2@m.+5N;-]e0Eݗ5`׿ /m)!d( h$s,\$5!(Tn\H>rú#@ɛuRDN(+s*ԏYj<?Q,2f(,L x=p'ۑNםJ;KQPw 5}]ƌUV|՞DJrh)Q g}@5s0!),t/ލ:MSdSŭ>/OL|KU LMvoE$W+Q:'6,/A"Ԫ! 'O~DZBS RWy_NGZx[uP2$Y؝@{ߢҌU+fP!nZgR6Ӧ?:hW`7ߺDNgK}ͱjzXIb HØ38d˚N|Kr8{|v.Q2ZWr6a;y>_A.nT5+B.3zo|昑&%pψ̣c^/k=umO>Şs'oÜ ܌TڧeۧnK į?2>U6M)gɒaZ]%xv=ͷ%ʭ?a:CPڍChyZz8CGM o]PTD6M^>rq m{.ƼCT^Rv=&M|//G 3ɫV/ x_"r{("}STdL9_e3٤'}ŞنJIE Q(hdcIUTÿiUƊ[&j>s ~pqZ`|y A*Oxd{ʯ:!b?3 -%F\VY}1>0^1˕fO7rYIӁzGE㭰A4kF/K(,C标$YbKv#on \]z*_lilxpΗ R@,k .Vtt"tt,⨾#!*mVu.s'~׾-ԕؼٰXJlIvBR(H2x3ߪ %`.YՑxh0Mp@}4BWbziTAlX]Aqp3}Im@Sk5nYkUpw6'Lc%r eȤA\AK8$ LIsl\aϺot.."9Շ-,ۚdyjfܑ5qG4u`+o:II+b 8^$}=,*I>tBVijI,ɮ]qOYlMP3 EOMe~XܟDϻׇ »hH]p Q0}2~-!Ϊ]wvߑon=Jn\0rIypy֥#IEޯz}5兲F_$F8䳰b1 +n!JvY&zE:&`ιtpd'$d0'kn&υ_PҠ/G/?qdp嚵|B}at,d~Dם޸__Q5n$y!ɲ0bFa>q_=h5~a'U7*3uAQs1=h߉)٩B7}{Ŀ?}7xξ s$> +L|}f_\ۻhŷIBNvƠ,t1U|" v @P/6a0w $K6(@圢C=䵖,<@N(ID)mCQx` D`ŷoaCR{$<5rw[QH_$*R-owPȱIb**h$3 /UsIasTPs \ U<%|+d|xT̿Hf~υS Z}C:"xѿ/2l'Rj i H+.зk>όJ˺ia4[PXe7i-Umc-c?9(5`k?VDHo]3llO s\3+B;h8F{M,~u mZB@~_aSR@ĹJ&ʟ'O-z. n"jtDx5̏t&]A5"W@cט ;#&^!2M׬%r4}[b:"䘇nC(ֈwHv[Dž$j^KCGb\`vUՕWOwX|<;o~[HjC ';Z*^3@\*R}]l}3|=3=􊍺~e jΏx4;62Ǧ1GYh>a [F4$W1J}"#MBWYI?rFXj :4fX"Q!dIݰ''st4Wys+jm߃ Vط8.]Xlj]v _}̮>O#v9Kn %-[]Ӹ]kRu'GEvP&AMhw}\<4VT F =P.2.e9_4iJژN=ToMӱŌLTѢdԯd6)Q J%rpcx=&RCGNM R_XgRpQƩx±S!2#aERC :MO.mQDX+t+'>XbdQX9@b.WBmXd3iʾa`Wx2O"O8Y*o.f:8q4[Nhu1N EndT~:}gS9dk{+؎FeQ@"bAQM=sVZAo%(.s<5`x]sZe aϘWT_0y4{45k_.RJZbK鮩){/"S>=wwDd'}ɽV`tf3Q<4լl^ 8wrW֥p:ݛ},`)B8i#" b8RcVRq߃`~aG.%LPVWK}0iZY<j:Z{"IUǎ94Gґ5>L pYj; Ha\sNvr8 U2p $cZ#+ϽJw;+isJm$jT}?pM` v%U`.PEHAK31(sv1ȥ(Z0/r,7Kxz˹GB;"# WH ͫU^$J/*y17a~{ڭ, 9uv]78 rfVM״B@ Wxu"ɹȘs!5"|tޘ13?- ~֌>1̝i'WV])@<vBkH@>\} ~ØBk|[\Ŋb8$,ᡴŝF|g))|،v3bWvRdbP0 w/6+/A6^9oͰUַW5,WxSDv!FH1ɹk)y;ϥE A1ԡ2(|*Z5k~OeZ4֞9KTGsGJ'.OZ0`Dϯ6Z9>x#k䁏ZiDB!k>`$)]ɝ!\ɚctƷm Y>|"7W;2YHr ~~I8;],Sb\u7ϑtWI;MsU@R('%K%0 2%eZ3"GNJA7U>3uQڞhӷpފH'ˣxTҬVItvE2jՌO)B_Ѯ?ޝ+W!q_0=FעAdWz;T, x=ݑPgo䦷G~exSrnab+C|>~#DxpDb,6qQr!sҠQJ2o^]o̢#lÎjaREKPLaodmJ9 seoij=^왳9oSiuBhdX wgJQ iϴt\O$q<%auih}mu"M%Wx^ rC>/-oeKvx}}yTs7@tY(nQr0E.cp]]o]fo `E\)z(k!aކU#_dk#_q! 8K\. V_U*Lt^ADqt+2XE 1YtBׅh1g%Vo,fp*06'kÐhCt~68Pp;q )٠YveY!_<#c n vG@y{V<ܻSxm#ԫLPl8j\473M-ޕSiQE2GA$[(Mf's(i?g{Qi(=-Z&=~IϏI5N;܈P Fv9:^X4s"qFϜߠ> :0[vp~: &(`}mN*&lu '^aZ)I 9cG ('x5wҐ?ZsҼtQa+vA"REɱՁ}ہZ0O{*c}=sK$6͢Q )PaP-KKr! c{Ώ _-7+L 6aPuPS 5\-#s2=,̱X~7K8,[[8j\kr{sN ~HQD?Eb>vd•{R4Բ$ ,4xe"Q>T5QaȞm4#Q rgĐOJdY1r&NBD 5{^&Dln돃H(оB o)ҍӡ\)}͈:%wtGs*p-i`h{`1ΞvkgyKva|;7{-$f+! R&AN(>V92f<'W5Z&>EW<#C] cOk t{fA"in@w`H74"Q}鰣[xvH_>RJrD5*UӍ?.ː"8$Ub =PEfgЧxS-^]FUao|J䁛Jv}g0`D?sD\vbtZMKgD090(jE445}A.74{) 5.e gJ ûBcĎW薽0}sLJl {v>|G$4q׍f:Յ8-t}׳lGK]YL'8Xj ~|\K -(#+C$7o񯖆鐢s$T֬WG[4 |NqJ$3 )PckU> {kSLL_ȁ@?c!ZLdRE-o9׋Pํ]s> %x(o_?O[275}C آ@J heWBb_{LvV>e s"I̲ sWm>%KŇ)VCĠC"2; NXm\/E)#Go v7.gF;)HaXLe^$xBd@z=+nj$ohg@>./orHʨ^3E([C\z^xdA ո;ӓBBg($$1/YxR7#'6IqbB4KCR$_<)Tv"}K5k"Q>{gg`z h*dA*i 1Ե8xdm:&_/qE9~X[FUs{7 JŻqU7xF Kzt@xEf%/c.!g7؂+)[H)[?oMotjyv= y߱U&QYhMvm 濖v/BG%\vľ ƭ&8.=&бNNq!Z3'|}2ܲ7_gٖ?:_ۓ5Kuo8~͝.w|jC "P&鹎h7! w:*Q>)VRQ(C/7S 4>fi"=VȎ(o8~fRCۙ7X^^R.þ9#)$Xmu~'^f*3!H\?nS7'dZ$/W_m7ihdJE4F\Gy6;nYcj$T}ax R{zj9v= =r(8ѩ$N`(+zb.徱jKM)@WNW@ZAUס#8e(R4M E8a,>lOC\gSCֆ|^dSrAk̏ʁ U5mA%woF',,ϩ&^%LkF9:BEn8[a:̚j~ف{-S4J@#lAeb9= Hr zj%ƛi7xPDkW29Q;D>.Gh(9+@Ve|x/"Ucb>-JC#cVP8S1*!u>cyޗDMFG1_ f[a7w%aЩײ=ԗ~vIS' wJ|jRA[o2cxoMV ~|4Z@v:I'#\dF(eZT|%)a08'{G| wTj!j*,()3anl^H'ȥj-k>U)t mt}~ ̸.1*扶C pe4Gq Ⴌ!Qw䨬5w9!3_>:օ.` L* d".%Rڿ՝J ut&_z˚ƻ[+>~);TїH:G|MB>;R#-&=ȨGFKTaɃ%8*^CGk%tUA5/e94.Z4|Ct! Exx&&JˈS&K M69'yoK|1V(9m߃ʻFw$&{ma0"mEQԵ:7>cnbƼ"x#&->`^<Euxmi;*7*wNKqG^N:J& J^\^TAj9ǿwY8qm1>]ߌuT&- z+f>:` :[v7"'EΔwPǠp:=5F<A7༖mWa N r>K#}z>=E@{eRA bלo%Ö Ť{o=Z@.@&˨YQVXbʳRALX𝺭@np* Kb2U|'25uNg{FG3$A:H`AԞ.BcۤvO>tyg yu$=8ۡAV7u퇑TkN턣f_#c:Նt"ʙoNk-Y0xR=V׉&5K{ y[2v݅.QxE)xm2A/YmR,_.Kt}bbH.gh =N~?yi_XM0S熃BEsXQ^Պ$ZFS]hHlnp0% 3Do\P 'xG17LEfl$I-ƒR^Wm<)AΝF!0ڛjst_u|]ּP)g8:ͻI^[mi*vESY QVi"&7{C7Ǖwn9Y4h˟,w1)wc1}9\<]Rë~C10{|ijnnu -[5?46Abx(0iO@|ʌ}9#NpdTay.9=ƸK,{ݣjln٪ŧX_īfD{XǓ:ь:g: 03Rr.OlYYcߪTVj @t2"C8{I+t.v?knDX?BZY_9&GNDģPlFze*棚]o16=$WUr_ Q4_7Zӎ_"YSTbچ$wng??9[[)flQVŸ*kJ/UZwtLJϛF0޷eN_`lv`!W@Ҕuoa6}$}Ofj3PnɲPƸ>g՟c<6\R~/J|o/guQGZҕhaw@39vOߖ>`POI |#m:ɪSuD!pƊ0ήųeحt@;y- oЉ񛭺U]F+S]'b$^| 5,ƈ|fr%†}xOSG{y z"6Ig?1 g]dC/fP4vlS <2#] -?|;C-9|ZMů .jfmG y֋2^"1$[;sL}w1\nOlsv&KC\!t=N! ͧ4Cň K9!IE#q 3ʍ Q,~4d_r܊$!U$T`VB}EKo_~t+aIb3+hagw9?+jHY(!_^RvyAt3A S՝P\4o˦Qf;4dz˔/V&vLs_4c5&tOK'B˃ɚCnsq*i Q@T6XgߧiH- R[z55R/xH&Y7ި|AzFC'\яS`cvN" 0>h5,pI6c,bP+6jiyoT١ ?wwȣI`4I$[Ƣn#l% )k@|Ϸm^kQvtj2LXg-fNZŎԻgn%g8!~]\D-s.\n>pE;Ђ08.Rp8/_ z^֝M2?6pj]eTll>D T('Mcn\'nzPMe}Ԝ#fwkzdp0Ŕ ?[;a=dh [%R0&J_E  !z 6tnVʑ/y9/|&ReN`t_g!"LǼ_)f/-*Y"NM(Z4c)k XU^ K;arP¢ś^E|FUI&gHh 괮R?VN>h.bx P UcGZ@2֮,wtdž d~eX}&dWy KX4X>FJ)5O!I:8M=ߘ3W哒Sۗ%%D`1|:>o؋V_]nW]J֨a5H}^]l^m&,OS[AW.SAUx[G>݂ 7YF?2nDǞ_{ogbB`(0,(.>3Jv' \3Py_6xMO9n+"a+,=?\_[#[ZwfԆ[)7C9!ej"UO5xlVu*k/FpD|  ƊbfC#t9v(vPZy0 /`?M73 FJCNwF w(y1g: yz98m֓OmPC{BRO^՟B78 Lw[ ^:,h/gsfDZ2paᄀd;!X颬obM(8';\zlyӧ6W >z[K Pvu(]."ε88jAOATRxEOe1\ Sjt —bipD {tmܯ>~ˊE$~A̳-S MiOSAuON $F7]ጷC֦\T_/OeJerWK7#߽Oa4%Gڅ|!bN 9$T|ݻwBX@AD7U#)mca+A,&y  iCCzڂ?M4!o:鏳~Ԏ AAE5͑咍FRC_`幊vQHO\V=,v͉RE 0 X0  >B@j D=Kaϔ{Mm },ڸZ㶪w^?C-' "5hoHl-qѓ38i{O\ WSm6b*CegQe-* bH)f[C{JI†$ޟuj7\z\U%9_u5nnimGeyw'J!nFuAW$%0' B5o֒.BNτ?$^"W)3p+.T}o4xߴʢҗc% = iev6&7*ܑXID Gɹ1hjkͩבO@~7NdmvpFKtT6qah`{Pi> sfHje_VYV8gLQo.~pPN>z*.jQ Fm9 7('ZJ6l1EZ謘& IaGF Tj&yh,(J:T 7 >WgO%-OԂ,*d ':){< N2 1XTjxڇ\2|FxFbj5d5ERxkW/_" S\ 4}[8}?IK素9E7,Or F(cbE~LˆY*dX+L7, Ա}-'/.4 [67P{$ ߋP^PUQ7~7=oeJ;;d'zUЅʷCy[w@ o-g, hhLƉw|"pU<6HD9dmGH˰7)4#Sk9ߘ ߹lv&Z*Hn 2= I4kIƥGOQ1't@ԈCz72G 4qߑ(DDXUyߌ oO67#@"}ol{£_!װ y&P2Hq<NkɣtXow8..Ф˒txy{e@ CIBv ESY,)u6kDi& ɤ2?V6L]up'}/YU +N]D[PY,Y]EB[fm]"aXczEi^|e4{lZIҗ QXwֳF;[-Zf}n҉AYޔTWjZ#;j1d*xXL>~:[kf+oY'a5k$E!1OR\D֎B}i Uw:+Z37<:Hx.xِ;LY gsJ>x'9։J^.b/ s'G-Pd)r*{"APWY4q^9v$ vcF 73`^:`')Ըvߚ%>[;}A93Cq r](>S5*w}10W+H-v1g<f!aj5?$zmZZc2|Lu>C'XtS*0|.@dZ-Ǵ>46cD.xX`i=~>M6=9er>rW([cJk\ P6PX1 ?7X'[mkEtb(F;Y,fۿ!CK &T_ef; S6xΓ[7/f{{tQr%JQ0H]vIU}wVloI|8}Je>IM!+6䋶|B\p='!@sm^\Ӓl0j \N{ YcCXRw z8wΠ6!70C!藤c>{kH.*RjamF0޻;mą(&73\K7fB]ZM?.l\OhӻyllMD KdH3?VA8TGcR]\ڢ녠sv674g+{k>M{G}ʫ%6\ D('"f\,#FAhG3V70ٚ+f{&\Pw 9]Y˖̺l2܃#;{LZL+fVh\Y]7ly++3aBmz&eMGFjs< jOo}V-?;LHs0fUnv=n-OiGun&xcұR//w'/Ls`tlYfty#z}x33Sn.҆!ݿ`sDfؑ$<8,ǺnnB4u$^MC,-u˓ŬV [c-h%_ [m$ͬ YcPl0R!j2Q֭a{F;r1sVY\WLT&Ђ;]'\TH:#SXW|n27)ud EKͷ=UeOEשԖyttcg^7S &-Sxhžkf L=i Wy Q4ye@B~ٸMs`֫#l?Гѱ_ I/5o&JR|oUvHjv!y^v=~b.kLM)X(P>?E aFxI>=kjBG/)at%kszXPCDҁ_cFV6LX8;@Wwy6727O:j3r׋I?v1w Zh7Ӄ75#Lל0#'QC+NyS'ޘ*b^Ew#Q ?G:a+DSgUAϒ S,쑦X5/bWa?WCJ_'ߍp=m5'H箂=J{7-gfߒ mYVbvt.Yo HfA/Zؑ p:SH5Ƨ4~9z^}RG\xiu XV.f(Q,f"n7VD&BLrk,WEPr2 ?-!q9'QA(VUF%- fFb?Mmt-hVSGzW#YْMήq[ϧ]'Avűt9P9d+w&ΥSߩSD)d?0/}]\si\Tbf4$%W87S/P_C<b[/N*딪n5˻9_xQp&NZ "(eyt܎ e{l?ƙQ"5u2f0~8#6(SOrPq`=m8՛WZ}w]tǔ W1샆#tφqj6L]+{yQ1T>ijAYb;q痫LQU^![S0RdiC,J ;@8%󙿃7ՋQ ݦY2D(eXKqfY% 4 & EyJr,9d(P` Y(p/JCP!OPNKلͲv,HVf\_gmMJ9y Z qMb̏c1_RxA +VD0=[3AH}{h}9GzekDF強zߧ4 W0)." A>4WadHسk>btET#`[h)%c{jFVʷZ[9rε_)DY#+~*2/T9=|T ۵d|C1>HyM 0* BFIÿw_){4Q\sD7GMVOYWĔdJ!)Wd4+0'ô8t͗֯1Y):Q~?zc <\Bw B)[YH /ܓS#QCB/-hyUݠ}Um}K1pj$3ZjE_]tyTvWaV؟$U=-馝X~}EhA/ 3>*l *V{<-9AT.b2L{\|lsTXM 5 (IgʋHTu]OSp fMx^BTӚo)@:%Od#ﴑH(tvAxtvH~7h4Ta\4C|L! >tj (BLoʢo޴Ue"oJ)3ҍe_%OvQH4o.v@UKPqh>ev((XLU :0GlC36lkdNgR퇒[\ PW9ȱ@Jc%AB4dCr2s%bzI`msTN7i|% L/=TyuxhvGfkkAn0oW?_2!qu@47;K-^ ̹$zX:#(rǾ=Gaԣxcc0~ŋ`+ 18"̇m~Zi=IWA8F!#塚J!jm.5 9$*huᡓѐH1ز*{U4_&D~vkÙ`I?q՜X/BQQ|˹o+in&Tԝ,$~?[௺WwXӟlׅ) QHpY\xʶ?C~)@7úoqqN6<Pk6| 5;vvv9ekCR:r;/NN~{57}L"ӝ+/Tӯ2D3ݿ ,~%o85bFZ+"x"a3jDnQu/cZ,Kc63sB$|\ȽrClr<ӑ9I,uS(rprMVCz덾s"#n{0ݪ%Q_^z(IׄeđEE{-/%%ܜƌ޷ig5)Ya%PxA쉄ĨR٦wD)(yK,jX+cBo[9 :~,8o;QgIr5'Ԭ(ҏNT>ǐ/E9Ȟ*!y]MOܐ0}|V3s7eDeSzO"%i[(qX'V+Z%g )!=;S4蹾'hr2yڳ{|xxy[ȵBT\ON4eCg |ֆd}V,C^tR16gQje3#)5a šzS6Z1? t[6ԠE͎fco* I_MOM6ѿ:)J`'61q w"SVg42Ȋ y[.C=ωKi5K`Ǩ*Nsvjd6|({ 鲵CY3GLn&M"9x~ Ѱ,W5գ?>[m>ǫR}GsR^Ai^*g)WȲ/zM}O6 8PxzǁfK)r5sV oOEG1Grle,V'XLؔ ]5;|/jiDBJS^JS%vt%Ө63g'= L0B84З,=pn T0*Nj`=(d]d+KP* KnpqI2 Hi!S) 8V^{`Z`Pl?M5R}N&u)b@TB ^2G]/4Pd*_E4ZҤIo;1IӰiS~vH1,I\NώJpPCg!iotKd9Z/?fKy41MoBtPCN?zr#܋:,A213tE^p(mO&qPEޜaߔ 7{ h?5 )f}׍S~ڣFƭmcVdOZy]o#Ojr )dIU ô{C}Zތ?@;OkH *|̽F'ذq1Tد /2knSRVa@K5'c>SxccJXp`Qe*}K/a7x׺]6'ǭE,#ɹ8 A#j6sIܰ, Jhǽ"r@zI =x6٢n/CD[2&bYe<]!Hp(6CLL׭eޗBHLeQEi9^ݾҳf;MPM"2nx$*fҍM:b@_;OcC-/#~./۹ݶ ~Rvz˅tC'.jO<:Šq6d@Z8RsepU4NvpS2{9zQR- quWo"!$hHt>u:Ȥ_]DAQy?~𡵨ҙsQVH1ڼ{\R\SBE6>, "B8NO$(Ëb:7P9܋8SZ Dl~*j1 Cti%+x. әD`NcCH\[c?۔~ܱjbHVRPQ9 E1%3 Շ>Cʨ `xe#[2;5yD–nt~94>y+:yȄhӪ$fn+a "Z:/ٞse`vtnDHF@`tNIcnLSnRaƔgÎG( 휠g겶RkD  xiltbvV# ~6jn褎Ve/xL]3(8d"wZT0o -3VxIdW蛏}p5VJMutK ;äTfSƒ´F3G"یaZj0 AY4DLtM{4踱"ZlUZOW]@lQhax67X2 g~jSZp;%J:˪3 KL&L]@$O㼠 x Z^[\!PPm(=^\o/'@`}$l}r_[Z_Pv)ъx   Q&yǽE1XWλD]D$US/t| 5֏&/w*X0a*=.g5'Vf0?bNKtFDݐM_/-\ }$ӵ+ԗ7 lm_x5)Kگ;'x.SMS_寔6>Z&KkY_FFv 9#G+GUzA޸IN3>QMɧXmIOe'NU^/38G {tJQMl Gδ?+@_ 2t_[H}6O?㡐G6mbUR^~s|e? ]+nx0J;䜿FSkߠ"rm{W%/JyZ sY<⨅%(>[VQ ysB>-E wş^^vI#ZjM)8Eov J q&ڦN$)|ϑ[|PQYHjT;e)܄ Mm̥]X~ =BZaR|3}+ hH빅9 nJQ$X}]v!:drި78q$D KD("B '2cIUʴ" Ֆ+F:(iV`'8\!#sRڑ#[7wlc^eꨚx/3>.m?<.GHr+ЀD 8Dk_cf״d:(͚UYą}t7]UIEzX@(B)Fۦ PpgsRgtkr# h+PLfaTnM/>(HENU?Œ[*ɺ4MRYG>}FF/ڮ UC-;bnFS9ҳBJ EF~vM68|L+/,c@YVHYC8Ć~ovƘd șr P!?yP#$"尕]_߳-l&kV%z} -ZCDYɓΟ]kJ!X[k.Q^po-JBM&k5nj@\ﱡ|:7O atf>ffPz욁SZp>Xd7{PJ^|Uhq%0j(z̶ھktGud߯&2K,\B=#mh0izt|ɕBoqS,6U> -ܪݯ̞[ُTcWXu˟MD4֌hq/;&\ T0]<#*x1;qjV=*^Ӧ;6Lk=.MjƶƩ?x}-CшjSb>Rq}Π2S~Gz?םH\rQ^n#0z'Q!̙CL6"LEgfOzoe~v8W^6R+)G?g4DQ<*>R"wZ^E}J?_H%=_O(؞eJ 3]|Ǧ}#?5YEݢ= 7[$ma+] x!'=k>.|5=ڲR\,pZSlj팫b< 2*#.N9uFX/q伝F=]-*WΥZ!2y?e;VSTٚ,sl DCOB-#Ȫ>Κ ҟj9i`A:- !aŊ%&uÇß'L|Ϫ6U70U=_ x5q1T-Cƣ|XHĽ=(Mb<p#Lω.XPfE 9ASOi H9@2fr}>OM_HRU̶RK CeoE{Bi1߸ gDs'ǯahUg4ԒuAVo:a~D(\$ eT|'Tye/tDlǥ>}ԁ#mn7d=鴹+JUa> 6-Ȯf҂/!dL|d-5^ń**A-34GGt|Z*u1i.cvhR Ƈ@Y8oef_N=ǭXy ^>I.sH!%raN^^][X(KR:uEViANMi:{x$y]IauXoF9!sЇMU EĶcŏ1fmY9h!hgКfYHI*v"Ėmi:$ŗl#f{ cXGϛHQ, YP'us&W3izq,i+Bu$Nsfee>%L%ӥJc"o+C") h6@k@;䅱4&snZ,t +P]s8XL(M+ !z{I{ QWS, roq( g*GXm#oɴ=v,19I$E_iǹC)(}n˼m6ZS*Zo "2H [$#}%}pU;R<ܠiu[Mx:t}L>%"+j=mJ[ `9;߻( 2H窱sls̉)S!9+s0ml|ӥۀ7xH7`͊`(ۙizA5E@?)կas+ *=C@7UbN?^>njO4zC^&$ޓxŌ K+?~ʴStNaQsI_̋4˳5 oF8R`rs3|=^ 伋ұRWɢP:n{x^@\ Feh(DŽ`J rKR.lap8RK?bU1e'{ -B#H;:&F: 8}Yu&cޟrx"X,*R)b69&jxIq)3ϩ"`x^u/`ߐadTr' sϤ k=b_=D]>:%w ~ }Ŧ'TQe;b-_F7$x)yÍ\6T&+tb 4醚QƉkiYfS ʼnPZ"b9f}ZgIXnjЭ1I@k-+&I^6K2=Z[G`_F7h15:L#UL׎Pp䰌.%mt O?lP#="0Q+ nhP65,H3_F|y~gOo_|_Čt$+GpTΰ) /0lV9MX`alj?>!r Lͬ#Bʖl-]o/kt>eh@rY $B^U92{oLՑ*"JоJNB۫# d̖ȗDqc|ОgِEHƥ?{´ (PQ4؊e'sΘhQ R''7?('D+MȖ)`} 4`)E վkg)QRG roF'o"(i}HbзSNbk-L%OkF?q?Hr}'|6m E7 s pԗz(F7u <; e{UO`{sUGXHd{k#nI( g@raMQ]bԵtZ 4*QFqKJ(<7~)jcUCBNLaHYnpA_2Ƌ.& "/>zHjyw"w8DF\OFVxXel+: (8ǍSm82s W'P4&JD}=zW,x(BǒZ0gX3b(gn^祝ݭ]m6ziT( @pVܻM LĠCFS>l1_2#68&btA2 G{ ˭,}iy;>iQc-׎AӰ׽Ȝ ?:pKxe}R oWtgvu$GwKVsG>(6q)n1gN7> F{)60B![Tv<3@lk| $J 2c}M;r?O6Ӯp{9rZ(I${_P36L.9`?ȧeisӒ\<(K-kI5_VN]_to˄pQƙս!<~'7ˠtr_ ,5?FztSۀOhi|}} v~mH-ĎK bD "})=NK$}?( {j5@MR $2`8?~Dբ{OB!$^1hr兢8t@9 (i :Ro@z]Ψ$#JXHO o|R\c߮Yuo9iC YG2ۜ 6N QڧqHp6Dӌ*ZzO7LX=Ҹ-̞*6\W b9*u"׫ \Ϗv|gi*$Ϋsj+,_tt]J@Q0觖cb´KEKA\/.Jy{R8vu$/wSdҝFAQ:"26ZҟДuǂ`G)m+ |UU ̉ڀ;ny_WDja܀`7-.;=ܤɆPKm5$D0F-m<k |^979XOWtoOӀcչ-g۶. }POf MU4I8 {(|TCDZߏKRY!Ng<1YEhG.GL) {ǓiNJFlߊ`pܒ#om DwcT;Oj[ΫT)kYbE DB">*balIRa_SiTs)֩Pl<ȈsrЫ=y3< qmNg~Jax`2-Y<4@e1sn8>λ4Ơڂ!tna[1UpI;=oX2np6i}uiQ yd[UQ:GvP( zW `ߣiQ&/(z㕌Hb]ܖrqw(,JUobWicc+ϾLŁLE—NНH(H@؀-KE2[dV ( e}S r^X\ 4%Jw+OLT`1M,r = tb!\IX]i:O>ʞ(<V$5g=QEng֢YaŘT6Ւ[˿T&\'Sq)-CiW׫US:~;>{q٩uչqx_AN1`M )E?^g]fXB?3kGy[=.dߚL`--MAůZS ]&wْeZQċ`H8-?;XGn줊 $c'Z% zyd1V+B$3:jҹA#qbK-^[l:!փ- G<7tM{E#Nl}a#`׊{Ts,O[1pe!a NLo;+`m`Gf@ МIdi{vvt8k8$N[z]&kؽބk{ t"#}%%0jF E2\/9*ɨă&%r Mta5!O.ԫjc$HR }4ˠt)pMGMm$V3g(s_.4z0n F|b@'>ԗvxn̍eιqH":%S8]!ĂA`̔<?qIfz7$ɢ^goMg;~] 'CWKz y̍o8t:+kͳyA*°yf%<|^U_lqJ77̈A)q`tvhÝ)b#:.T}`^I'H SK['av{Co{^C2IrZ,|~V]Ž1IŋԑQ}l0D,$2TkG >t:un(fy #pɪ`cNl󱝟pH{O4h{r_YHwuSfx"rWNZ!C7k yY{[H⁤>l2 Y=<4`^?`ݨD_-/ٜ;xd!p.Jas^$|:Q(R8?P^hfn*'g3kPl)~5Q.T`;NEGP_'Q뺆8&[.AL,#ɊZ@G"p:Fc_u]0?&4-ÛoVTb[U?Ķ=%a)-b>~ws`H{Z͙c~ Igeb8?~)>+h+[$6E<6r4O'I5X^17NZuyn plZ.|#æԛ!nΠC fA(tՉj6lYYkDŇ(6ZccƧhj ۂBPg׾K%g[ѣizŖSG:YVNK3+eY_0+lQ ;";_|Wʖ8]z;fVffY)9P:!:!܇>.7hӬt >.'tRBK#y5 «d×R4jSw4#zY\ 5yPi5= _*`M`E-z_YJ!vg*:u U|%+EQA)u^>EA>}ٟ%2뻙.|3M, )5= E E-Lˊzߤ&!/nYhi^zQPzmњUsf?2ޣlvc ;8g!^ 1NM #{< >(]Co # eaP|"vScui\HMVѐXb ZI aDS\uI>. !u1|WQm4PS5"tl R «_B;Ō5E"I2O.{\Ǽ%z/ګiNb4ս{FtpQ7l>X3 mhsaZuTJg⪵ Ѓr~+ٞ&GG?ǻVVVx no!-nɢ$ w1_⥨Cfz#UdA1/y IY"Xj_ ˤ4% +ZSkJiE:Pxou}VZnm1c>İ3]s b?OشRɇ){1n1[N|Q J!" `#vM؄H.-,oS~^^7Kfxwz;@Š*kG۾˅/y'Ԫ̴k+7jc?k+O=>w(ABnsò6ҥ=);lO4?T|*S|6>ZYZ(}l@SJf'!2ӯ~Z+#|>RF:vv /ĸ`^6)0[bz AS=kDP'ͧJY lnd@4Ge}?pM #f\y[-_IÇjgY/`5o&uU~f>_,VDӺg(b 8n{ Qv`o˒8GnZNd쁖pL1 t{|t+Pn5^,:?UG% /%]%1 Xb6j.ql?=Y\FȭRY㮢x3G~Vꚣ_@TҫBƤ[s̼S;ڕ 8ux0ܝ1%D_Ũ8*rݣ? *2[CMo'UDCHE\lv@tA]y j*v?ޫ%\pzGkxtӧ:I;'\ oLn{}l=")=wJ_WVc#ƊE, +NF`6GIY7/QF&~[#)fx!P} 4^doe#KZ52,ƃ5n߮V&/c 5kX&jBȩ9 !'ɬP06v^dEhxB;GHFXQ~%0^XN DT$7 ۴m/P/y{e?Ԥl eTf/\> ?zo)fy/Q8ہwGcC]P d'1h :X:M_vu2ն} A#1f7$TjnB[6]DŽ$z^Y$`Gز<=@gLV[.xLN<ˢӾUyCv3Pj請 7Zr0mf`(IAG$ocޘPj(Ӷc}4fo=—MbI|Pi2MU>NhNLAN*i@gs&ove3I7q!VzȚ4tܧC}\xS}Tu0vlWmOoĢL|mM<~7T*@~bgQz,м\BŊzgVnJON&1ڲMl LuGp 8Y5dlap $7͐aBQg=yd1BHc =/)܇ ANzGoh!X`-W_ P 'H3-;a7$\(*bƥT-U;DN*#4nq$A&yYUl 199(\w[ XaZ&} ڐO@+P+Md}+s [(X#ХyF-\ꇩfXi ^g",yޮe[._oXY0F,l&,*W"3VM4{͙Rz ѶGLuT!oG_wQ[~5.d q !lS IJ'CC$WsLGֵ1 SA2]qF'h<6oH6lп&YE-!÷t<(>*HtRn/¨gkخ>c9H kƥ;MlNS|o5uQcnBRS],+7Ua(?KS&Y\j?D KI؞-~D7 a23wdI(򟁁!3@57e6T7UMPr}|j7W=JAf:vE BG>{Z' a5Шt3χutRq 3pc,U}a.LESctH\(go0>ȞK_|ǣ*4?;tT% Q{"F-C׷~QZ6\~ˎUpGw".LcܭJC'+kof9{'2:5G'Xũ7c=wۨG6I _*5*\ 7Ņ j^OͺА -Am4E 15<ge}țJrKD%B>2)7\Vs'0ĩY(,&4y8W/wj06x۴VZ~r4N؝PFj>4nk/%=7P%򌴺7w[*2ER 1fmnc2ulc0<~Vf?.?c_2 BCP^ d^eÍ#Ӑd%)9_' co6.-5:q,1E0?k Һ$|,׈DKSy$ {>yJ-=az}6P_Y';ak$vdX [C_ Sڎ_#YB+G9w aay!/Fo$l@rxD Ԗ#y,:h$_ r{z Yv~C'}23Ai,ܳTPhWvh9[*#<$]nIЙ 0&ʲ p :8!g)xc@>^dt[Qk8O@tڭW2BaqNZdd@Vҏ8,|}_WOE+bi t?qe5SL8[MRHir-+ui`+>]y[1z皚;Ǭz~NKE^!(B}q'O"Tdf߽T})Fr4@eN.O` )(+i' hC1)&WZɨ:zOBzȒ<+]Fv?Ո/j& hVfeahݏGmv@+@](B"7Cw[//v5 )5M齫q4wUsP9+P%a:F!-\kͻ\-EL5 %*B_>:>  ESPQ-x!HRByu-~<>< 5\N_%q.A(By'qԗP1}/T%ZC)q4/K<4w[ -y|_9}"5FkdIvΌM*S.(v7IP4lΝ3o|\XPj=b gZ)Q.?qR3Ћ Wp8.o^'?Vb$KjǻX 3"qn;Pc`=b@5~> RCoAݐ' a< fZƭE*K 4x?la%<hY,-UB'GLmu-!!J θ75AR2vF҉r)oVy IE R=L,B^)<gTB-tċ1sU}gMCRp2IűfX\ QAS.sÍr(>qP鞳sJѝ  {\V5nZ_iea5ptW*éYo[N|+  ͟KUe<])4+ G@]a8Nb2 ~A9=qE,;B"ʔ{BjKqz@rgǭ0bYx>U5_Zו%gV4W"{E!}rISMN6k!A,G"tgW ||} ކjQ@oRUW67!Ն#:pub-Ҧ"({f(AD\zkOZӮO[1͖?EODś_G|߇#@xif]uˬv΍J<1%]d|Bb[F<|jsErQuK~ a?FkQ^h<$9_4 БtlIi}c(E3?da6Eg\@767ku e]L=nTiGEN1t!n?Q{/R c.vDn"*8e ɭ&COݻIƪHi )= OuɁRg|3pF#"0~xA{}DMZPJ8y*)j `;6W]WOZ>y_tpмJ@8vwMT A azzJOUnm9ɉ2wj[7ix]Y+D}!Cu@&xO;y+CTVI/V|;4KӃ[ϋ\kۭQpBMk*q`iR(=WbHĪyn_ĸz=co{A𷋋@i <̵Ir$  ^S~C/]\ٕ^GU⢾8{ ?@bxK/΅h7֠އ۵$S;ʑQVvȗAٝ7*󖵩i‹X)#4dH֍ACYz<}o=Nɳ{O5Fg4iXF iPP6@l6S%|UD`%W$ڀH\HӮDLL@?ElȞ(Dkl |G앭ޛ>8oSI^~ 1=JYgbWXӉeD'I )AިFxE{#LN!iV*v=JMg?Qҏ2)"⡽`eĽͭ)/K&J=E*+Hl_ǀvUc3O| 1xsGAf%w^2fX'=! (od8w- ߇}dbkr2iզ0JGé@ٛ䆨&Kx NadcRV`II\\'=63Ђ^t\~OF[o 7jAY-lri,^7S56Z~8Veåh '"[by@C1-># C e6)f X4k?*l,&:yXoPG%_Pֺ{QX&qZ bF{v! @=2F%d Tvy}wJC9LyVe%4o IPsTn1e[h)5Ɖ!Ti^*dͦfHF~ti]މUv螬$u38(`8e?oz? q5 Hel/Gh.xz~p'`~^6z[ [kەGWeq$ !D bhw 01d$j= F! pJ$z6K\РY'lsnGVnF?͜s=2}j oPw)X6P}PMie¶^:F*TTZ#c;2 g`[𭎒ixq zO/mMM-qccJ@ZGI(]8r,Q WLP$q@)h4Hk(GUJc.Ӟ1#q!Tr:% T,Vי+_4M'9ʱ؝AgՃfW'!H1T\\?>&:Nɟ<֙D}J=eU&q67mqc{aL: $E 8u[[NbuLl9+JЎ7(C=)%0KH<+/s 0UwVݫȉ9+lYyWFt,N$9np;<` 6ݡ)Xn%Rt~6y]v c0EnMkб;fWU%O.eyL?-G kKf|.vӯ0"q4׼ܒ uS6BVgyzxȳ)^=/Ŵ]*jӮU1ggU)ͫ؇ ` L\*cb'+D8Y y~_@{Tyr3'QR]rAؑ>瞴N\ȲϜm1ڇ1Zv0qI0 Q({~Xn$iX)mxao~csjɱxF}7x+~﵌ߦo<|e"e#Ezw;0*+Z zVPX%a`U(b7\1/;K6r}|>Gލ"QtՃҞF/K ]_N=Te!F! L*ț괤m@gQGkejeǚD#yIHeA-.yUO'ym˰wp'iIR@s;#}P)7e >ϙ\Ͳ)AovY( ͨTg k:h'ae2KLNpfmBPD0 #9.0;̊ |W3B6j[7̴s0J3u|tl$H ]OG._Lc*`R-M ֕P3/;WP LoTՒ1]n;㚀δIρ|p$VB(HA[OHv,ٹk5_lbh$u.K=c}INn"tBӳ-c_PH`I̮펋l)M(7{Hp b;OMvM&(Q1zE9dyMD.|#wj i>`nKiR="B|sǸ $75ŤϮg i&fgs>V('VL&+k$L\Bȝ]ԭ& }M=8/i0*G'GqPJm4ұa,빅P".VJ])@ļ^|L{0x~Ay3RPfNj(7|}3Z'*vҗaq~/}(jxa_ #Q=j gDǓ|n-=L EVq:<׹)CbsJlE>bq]RY,^KΏD=<~Y@ +ba@{t5 ;U3BHFdF@zbp~Lֿ+X.Ql76N']CV#39$+ 4;߮n_k"p&Lu,M|l0tm%kħ*K [g G9R-xrJ3 B)2ThVIptNϵ>1Mz#|SޔDk5?_qJ\x 'vH,PA)F ;il(3Mw Z$v;%XI@6I%qRdڙR:wgʅs~ (1~wOyI,G5COdt>G?UzʢF`7+zY~;i?L2(S9_4 \P ɳ[ІU Jum@?tF~#PO7^8!l2Vy1+]@@h% >ٯtVJ!B[h'q`\y-o 7QpO knP|ƂO}bfP6&v$?50O^D[?nųFp3M+,CbK%3* !xwz&I,a`K FPF>6cY#2⡧)¿TG)0JOʷ6x˴;xgiorqZzL(n-@p?\-1H@M޻w>~mgFX&`_WN&JMz : Q7}; p4(T!|w~Bf~+&=$Aԍ`n"ڒ:pbt;Ctm}Ghj||Nc4 H~k?F^+dz{ X {AT{*J," @ѝ< ݟ:33Hͪ N>&z:9zMetL!Vb߮У{6U^tTtHy݇OSN^a4 2 pܔ԰̈sWOȨؐBt9$ukPP@oDӐK%v<B[s])~Mw\4V /p=?i'l'0x p'O)?x[U (ik ?^[0}cpX@'?u~_* +MP'mf9%+ r yjXFkM`ξh==wndh. $v{,Gta'H>yNs[F2#ۯW)OzM̵ݱ&ᨩE*9p9o?N[x^0 $H@rz'?5zv3pa7{7kF`#Űλ.@+aWWTjw^Zjݩ;Ti:8ެKÜAWj%w?95JK}We&ޭY>aejEc'EA^T]C{,,Ԟ?qhĔx[F{N? g벳*4O.FHß]єRYfMƥysi+aēB EMz|3oOxh66YYlx`aƄx$捪ܨlh {,*'Sp{'zӼ@O6 e/MlL}( qG2 1GjF['vi!if-7^pX&~P,_٩7}[rN~ߍ=~U3gȤ0悪.i#@Xcxp4bq>8PI4EO1M3l܍ge+VkpYM"1-b*v=Xy`B"6<>|S>Bz6b1CssH{b;5Aoet8.-S2SRAzV(!84ME>{Q39WWŖX!jU%bSl>3=N]`_4#'2X\xpo8]y[bypbcmOUpQ̏B{6z<4ӕ"T6r7ϫϺi{*i olGxO *4'?1QB'C{I%(Qӗ;*C:dp/%XGMjXPF rвyrn5e1ް ڴy@084qr,yAte)> lE(1(.8|+|t 9\^kcNƚc4Xp4콞au՛dus: `lD)Xroz p&V\%pN̘X S9aUAEȪ}ڨĴM3p__ X& O#] ;5b~6U`%\/jT>U`\ԥm`Q hO53(>pP3TXI&jl(GPUP*|i*i]B?XR0㞡"G{ 5{CNS!Bb;)ent O$JCH9#W4è wLC`h׬r Y9)nw/m)vgť&2 E̼OV2Vp2 B]C}̷V}I5ڼ8ZA{K bQv< T i^ EYs.S3cG@ZPmC4 nڱbJڏ`X0/yuZB|[4%䩢0{r=bZwӸs$3rޟFH6Lu-w$j5@Q/}gx=XUp_^;ĵ r]"bK.󆮗"92qc*G}Į']1kBh{{.C}5 ܉J`jgRM<oe ;0աShY)i6WDB(JHt?Hx4TZʓ~I tYnXc6vVېmWbcNj[H/ʔY?q)?dFj!bf~~Db?j/Y:v9;GEX.T72cgSor K+D3mpkL] ϝ΢1p]^6 ՅRD+j߅eg͠x/``˵I4ll/|ݳ ߧitZeΙi8‰Eb3"NXi$+f?Z&N s'Hc>̘=~ogn)XNstat+1J` 2  =Nu >9})y0 袝_-n aRiMPՀyN8:}&xS(hx%շ1ic`]5*Vg/B|?įd6>w]ƖoouG7OZ!qtx&bl9gG'{M+E}]Nj<.>+oUk[ҳpڂ(S4Z+ztSU >T_6\G6[ odTW c\NAm6oٱC-}/HKΐc5(:XRo.Ds [coքɻĮ(pp8*i,2jͮAuO %Yݮe2k0g| p_}W;el6LG/y5(X6s#Z*X*gYlP-Nнv aHPVn;s5p&-Em#'A#s%J@{bEsJn4Hm} $'Uז~Q~uXSU{ UYW%ZޗlLZ#Qv{;2|_c#F*@ #$k|?m6g7\Q$Fɺv .L$Yjjbl}oL\!)V"ۥq OfMx#X?2 ~)uTC:UNYqוY`)I3,32dw@E]j7Us 8SgMh-=pL6S fk=1Nsgr ̏cVzQe#DS&w j}8$!M='d쮷?C`1D_22!\q!6ugƤ;VtW}yuT;~-&"DǠ4>%D{M7%F1HQ_;Tي0Oom{o (?_sd (of npU { biXU\0%$H nb^g8'*5>rVقQjB1̍USTJ\dak _ʖAAʣ}6BBh m{Q>.ktiA?VOSg4 rv30m~j|3(̾S _M˅ˈТɩq̔x7y=g#2IlQl pftq!g:;e|Npګޔ?'~ƣͪ(VYgl {'1Fq.)dq3^-HO" pV߿X (fZ$D+aѠ[*'fl6[ae.,8Ei NbܵjS˄Hbu)8: 43kdGVE73j&2\ب#s3aWř],-*4&O$Gns}!`%j0˙۷ ) 5 H=a7@Iθn2kDFxPlv;%UWxD 9K@~P9J 6}f;?|lƻw9SC0gNs3Bm*Dɜ[ `:6 j|.!`4 na'@Wlq97`\sHXd~/weŵW4uC `glmcEV ^ \ S>\!djg#^}4` /[Y X*^S -^'"n=A Fcc"њ} IAa"}2N"P;Z ߛ 2|̹&;ĻQZ񕘷#xCo0YаZw bStik Ҙct^戊-)t)z%bJ"s uy1p' v\Fˮ*G.hmb|4XA%o U\%*䍮 ԝxU)f\)6?~qijoA AAlifCnFWgz>G*q;PBliUqWp6dIрsy?Px@Q^Bd~J$1 ԦoX{c& ͹]+4OR2c瀰FK aB|Avqm84eON{#@Bb"H\:78UmA)d\Cs%Hwa>5n:ZWIZ rGS GvN ۣՊYa.x0"{t"aFLObIA"G]>1l2/QGg%Ez QxH82%z~R1*x] } !F?+9C>_֍q$c_ZV o%|"I9]jkUëS2񾖓l%? `vqzd*l @O>"79Eb;S2*F]Yd&,_4fFybu5'pV]@L{Bo]6]zmul5y$pl~Q> h 3 99ay2ْOpJ \y)on##i|e^*uwM09mgZv0|BG2|QR㼄{HWV,MO'] ŞαW3C{-ѡ5#h\Tp.A4Ow=R~U7}cP B\\ !ҐUWʑDt1 +>"'oU5(>[4 DS3RN~ U;f(/i2!@5Z?? Fꂹvq l նOGwItpnH^sPD1(}b\-4~~G*}b[(ޛLZdE>Re&K,6>1#RZc̿ͭn0+P/ FWݥs cH]L"B/Ҿ.Pg ׵OOX#JsL͇WgM|1fLjom]HdG˜w!,0xk % kU+OwV-<%q ?#Wi2o4bYL9n|]]+vsJ#`D& ǿ5z"ſ-_w|]8j:l]Ȅm';@d@]vy>_Habf-ɢ @35 Ggh[ 6S.*"g&xwcU':[D=M3 Yh(''?&I,Ξ*N]-Wb,S8\%>4{I&H+YN7 G); X᳕r#"$pM[BqZWeY;t!>73"?L2)P {DDy)})9k^b+; $(Ej0Rqer ``zwL+#0v 'h(Wl5EEh-#n|IOR͉)Qgh. h1< 1ĸXn3BjQ+~+tmP@"hf\Qؐg @7GM F)jd#Ge.egjR98BM]} *#x^ړFX2U^>nMA-q_)v|pb)`={QbYj֣Iz8wَLFio5wܲ륽XD~q9PG9srҪ1^i?NZ[WõtэN51mA2n;ARg?NU:"Z^̼(6Rv?5`1֐J䀞ύ8y̠xbaaVhNUe=AĿzHKg sB,JcDCCDnGP{i4lE=P=zK`UA*9RZ wt0D? 2z]g8N g_k :aPCװ O&Y}Ps!{%!O+S-at_]k.@g'w躷d,K)3XVZYhS뮟Dň#yOSbTc^9tI!W+fn`W2R)ȲCꃢos~5*$9#5q @P~x&vxcKKpL~5^US+"{!{bF z[qL$1gsdCgm:sOz !Fd\ <$4.r9?2na=ppWzꧣ{N lO~߶;ՐM7؎$LYPM:l@֕7"]3U🦒zADr\I)ownHGa#g՗;L&9D>Ǎ6E y$10E_h X+PdŠc3{dY(jEFE{kve?݉=юh͸z%#Z@Vmx5l vGje# ?+XAfdu& v;V51W0c:îW^ 31J=67WLә 3ߦ`DB}nӎÐ2Oщcq>HfWh<k@tx MqQ-<'GTU}tS,ge4K\HLVOW%_^b/xaOXa;b0F4-w/fuz3Y$,Vy%uJ r(4>}BnY e7q-r:xW:,ҥ(?W:VsdkMŭf}LMT"~ƫrrzvgaƾ'=SczH#x ;Ȁ',SݓNxZ[o,Ψ!6MkιwJ7dQͿݒ\{-(=;†֪[-dawɡAĢK[F =r!u Qm93-Ùxe,a3Cš|xAfU{>[;>R JxX 5+^2>.ahqu~5KRi,I.MM.{SڗrȚ"HǮuF s(2u7mK O.QaOn^Zin+t\R9Y 4ꙭGc eeV}G*n8A K^!'gM~Yp0SȠmJ.PKjO=|!c.y*X=*O.c_oزyEҶ圬"H. F5JX[ۮEyi5U[BN)yXtޔz~GY࡝H "2pL4cѠ洋} N?Sw/—tO"0.(6=]{ *n/ޛnjI$+ 3,k`s5~ %7R ԀºRgHj99n ?A=et"HH P>8xlP2ZXb7BvȂ~pt&9~{sxL'ѿs~9BجFQk yE}[tXІv/%.br/'|{q]B2%!Sӄff6@ ԅ;I/!ˡA /79ILy`2M2bCKԨ;GSm\n ٸs/f[qlj)/ `yx_'MUUpKl/ys-e}84zuw_呋DP<2 0lRM-S3seTן|eR%VOb0VAh|0ɓLigZLG >t5tHF{xM;5"rXH7svi+ S4;P߀ߵN9k,-  -`^py5b"sj-JAi"wX~eg+Emwkb$Í^4%^/U8TLvR^Ƒ_+jL9%4_1ct%جr>ia,uyq\Rum)b+RHUV٘. #3@?uⅈbRH`6 ,Ag ™V8>nz啲YձjL`JL:p<*`Φ R"A }<-t~80%AYmݺ ʭc,Fxo6rԂCUCu$2CUNR/I># 'lzIjJj> D^@ _Ԍ׌ۢUp B!92Jߞ#u,T @B4R9~ʹ+jHJ6͸o'nJ*OV߆OTڎ9yB&a(m=<^q-G PP58_+_N=LeJI7bPp˭h@„'ŷ9L @?>_4ŝYz22>=AѾI;JN2rzh4خ6U،aD(;a}4 mB_hk ߰o ·"h>&Qu6MaګQ ّ3 +<PGGsKXFM ٴZH7:ea?ͬnNg?.(>(mTTH:~ L`//C l%c;V e1\uOGs?}"e<2?Ir ݦ:&,UPDAn$#x-@೫EC~GTTTՑNjs|\Lgs uy'B%/bG4@f|a=@]K$ @Lwu0wz F7 p%vQhSA]gBcE0sй~ߣ4͇=zy`oR6n[Yfk^.Wzdp.3F9[M<_7R Xʐ[< c5AAV}s-Us`oN)<+$c|‚8|q?gK1H-K 9TEٯatyXFh%#%Dz'Óĭ1i=qIۄ±WW^` Q,%]ػs"H 8\m<}קD>@ @g.8Y;WCXbY9fD_i&.BQMXe҅(D gkjFj4_$#Z*2l~ ^\ܑdz蝦g$B=fHKp)ޓ'TG-#:u v+ "vP9Eıt} A\p?& aU@$#PIgH}. 4[)/22nvdeZ_k~?l 2yz8rjB&+Yҥ8rHCіBXy_GBtSv"ʈ!<CUe]GzUrNὪ>T37@B1Xk\QL5>{-7Wbwf3Gi5 BᔟB{s{{;d73./&>,#㷜TQwdzb@Fcr-0 :u2ě4#qOqzvt0%tͤ ⾍/[D[udMd_! i8s&HS!C-z}O^>ۀh$ b^#@ PT T -=֫ jfg]>t4У{_v_]y(U-O|޽vwos:Ž}}]{w]Nnݹ#{]m *mj>S̾^1}w4[nt{2Wۧ{'NG[womt'}cV]=])|}o5ޗݨoERI$cBfsi(*=量}lk^gOx|O W{`S4ڡ(uQyn{+z=\ {^UzaT>AP=݆*}{5cz^fkS.fhP-O.>}F^C*z CȜbTPrn{sp6@A٩TSJq^m*j@Dhy*:@@)|x{}z :iz>yki(qNiF}\Ҁ 񣯪}e{;\ǪfweP=}yޤǡ>=h@n{QUҀhk^`8wCjk!A{s9C>Z3cP΀tkCMJ̝ "QJfgM %T>o `/| OZW=ԟw4W\{]GC+=Ch:7վÈen+m=]Yݮ6mԏv6wcm}w>ylD*u}^]Oye:bzֻh K{OְwbҚ/}/ć{i;s^=]KF{k>z]]뽏 tkZg*Z;ųnf9z.۽}m{^oQoޗlk -w'Zf g{ v]UM2{NR9dnjnݻܹo]46{+/ݗqrY%J̈́o7۹swT;Fw]V FUWvo c6sfRޯvom|w|9[(/:҂@IH5HI]G&mֻ6wEO[uZUֻoz*wUyeY*wq}>{9QL6duw:}o>>Xwdoy;n{u췾%_f5{={o̲GfukuM {z{G[ޜ]mqE$;\;]r4=Mwm{5Mi u@˴&2_; ǻ絳y kw{ڰe 2-'8 ]JÎ̭}PݗvsMٴ֕OA\3uwztsmg_OzNg^n8+kUxhISM}}x56pUYFQۭ}{|[3۠b__}ӟY׃{;[;].E/^햱{=kc] ;ҕӊ˹}8S٨oN|}{ܾv}>}bsk^q{4:=I;לUY>ַ8*O; ==% @ @hLzi =FlOH%4 !zd412`ɩ{TSz $"d M4?M65=J~)*z꟪~fH hOD LS&)?OzSzƣ~FDS=DG F4hbFxMOM1b1FT4ODmSLz"oQ=@@!0C !#Dтjf$bJy53ԏD Jd+Sщa?&u]?sOٳ/Yח@oWS *{Hn?{M i@[EoƂDTQTQLOEȂJhi"(`J"O3NٱȠ8 (,d$M\[Iwf!JPdӎa0M!%13,b"(Ĝ0e* Y$9,""0G ͬۧU_вЩ'R^"dֻڮ,(׽%\{T0Rr{><|'/IL* @1Q"DT"QJAZ Hy14 rB  ! Xhh" h )$TQUASDPIQUUEPIRTU%4DHI)%ʚi~hQP pdKHDUHI.oǟ:j haXXfAFYawkZ0sJB:hn blTQ"w CTc1P"?~Xm!Hz {wI 1sWǿ/Ξ]ȝ=K,>OFaF,wo12_U+ a&H` A0ESL !U1BAKU4ԕP0@CTTE $UUDURDTP4$UMSL&bqB$(()D)"*d( d%7cPA Unr .`LkH`j&&ebaQQID%2@IBE2 J *&i)) I)h )j Bj*jI*"&&Hb ("j" RhibJME4QD-,DRUTJESSQQd4SQ@ T10dTI4UE@PG>tj,Jh)F*"fbAAUMF7QMSMdECDI@DTаHLLQ%$STRU1Atا1D1Aa$ D,PB0P҄1Ĵ0Q1Q!,H 3Pjh 0&i m;$2ATHЕ4Q,QSQDM %I KDh! xjJ(4QpjH&1Ȧ*"j5@,J  R-(BQT4I05(`1 VqqdT%!T! 3Pґ,I3 IIA0ą!T !$)%14RK@14 0 U$Ⴢ!5!I@BRH0T BACDAU5LSUn d"h3,Z1V0 2qh3!`(L URH b " j*)HhJd*& &f"YR!9 *eGTs@BĬ("E)QY#DaD98msđZpJb54KD$DHH4 8;_9 S =`=Q@ۄh?¶uIvFr ֋((p+ ɉ3ёj0H`aTRnɂh3}qX7tŏa0iEeclc'~1{d%Ojyy6`6ۙfլh˙ PdP2 lw##bpA] >qQb;ְf5$O^4'Wl2f ^z,"YFeCsQzsHu8:sWYPȤ!`"`ACf0/NQ j8/XkHŲǠH1hZG^G:"ux25nrZ"iIbBSHNfpR# Bzpjjj&*j"(I `*Z"JZhH(*&)b b(&j&J"jpjfyj (b"e( ʊiZRSQ01%$BT USS 0PuR*!DbfJnEUCQ5PU T5IL0QQ1 !Zb fj $"? JR)&(hh$"jfFF"j%dDLPK$DLL1SL4THUEI E35LT1QDDPPU5HQ5TEKID$K21BLQPQBDA%LMP5PLD$LPS!|؎$TKSRDTI0ĐURIPıMQQMPMC DLSEAACI3 "(fh*"!)$ *BffjH(! 7BY iHdb())i'5#BYDDP,Mf`DQQ%U$?8Bj zɢ"hj"T$1~&3ADD5QUBDA!X0 X c,X )1'P%A*d*"a9S!:4 Q0)C%'2 Iy֊)H"" (0)#VP<EUATDH HU$SRI 2H$K@!*U0%33PT#DESC),LK-ADIHI #b!&CIDADD\$ Cd`R35,-DSEPUʤNcTT! TLMZjP( b@*HX $ *bIhZ()&h5 /25-%4["X D$&"|霨h*&(!hلEP\UTSPTD M$C11ELCZ(~^ hIVRBQ)Td)ZUHi"I *%HR__/~r83mbq\ZgX1g1uQL_zzT+\#"(t!Sn*wwuT_yQ827x1t̽=iu*Hĝ*~e+ErkTQ[Ce df\ܐF#T6_xMUď\hڋM3s\XMo;ڳ!\X\ B8hlw\fH˙"եíZnfZ5eYnfkH#zpd{Zƞdʊ61ޜtֵƳh5s86ELy3,[k\M* V]yHJ͡^:PdUFu#a")t̓$i5\`\<ϟlsi,x+E)MjLSKڞLEQHh bKN21r9 Yc\0cF3M?yn,LUwӘeUmtR7éJК,f E䶳g]&͜:Jr!߻3laEQ6MkCywu~3s*fKjeJ4 O1#5-C M_,jVKLֆhq$8m(lFd͗Y_2kxDwL`.gt?/[K socvzRX?ma${j schNs;M`a5 Ԅj꫽m=o\nnS\@o8"0Zw I$YÈRS*f: uť]*0ŠYĬlQ@a:=MZɊdzϗDh14D.]2:B m<%Y}86 9~/ I:F3t$b)L8$j0\a28!5˛ qsetuCۯsL#֯^+CcANIA(faHEEXȪ5a)TYB`t [٧|oUA{+Դ^5x|vKs)֝H}7[Y[ɓJ{K2VsWk4wt $ w :T3zXDx!&T4tR 7OJj[+#o $oIAEY7g>C0-ŰxxzOVXV$fSovhz0edyxA rFrS NveΚ5ADWf$EpGFdDf8g4r m71F+mXtZ1:xHLo TDZA1>BF3{jm2h4㴏eF.m#hcL(Z}6o!|uj2.Lk.ԸdY&8f# Z,x"F0R!o90ZwfsBlf`igi nAx p7hƱ.aPV-=K!90mEfcl,Nƒ3avV/ɭl%( Jy9z56 Ce4챖\445Í4.hMM5 A.\ifC3HS'z?k5zȥ"IJW%DQDE+ =]J댒*Pe BQ^3l f JȤc&;liP&ˎof- q vs"ctf'5-+nXFefY՜f6\}r6YNXƨp2cJ f:4ّ\sz ZT[$)Y(ua4GW׳"cc]^ߜpSWR9Ģo5>!Gl>QAjVR2M& [~?s?ذlj\G<5MYWJ{9Fm\2L ׃+)SJH锠V{D0 HW I{ԓqAn N-:L,g YkaD! ݁n0yOaZ8ͰuF-[tT(*BaOt,' fBb܁ǒұISe2dF:÷8`bԳ}rCmlZPsZiQ qܵd7W fFhciTͶsՅfXfHj6 Ts9U2l \klmԵU8v;󢒹# ib&ݨԔFXl5-ukvTAd`NbJBZp 1E΃xћ~<ԍTçuVM6F8^n;AY= Fic+σ2 ,$ݶH.Ÿjp0̫ :AY;>7Dc ^\xVR3y{ڏ4t/\iȍ&}fQFWӽF:吣qnsm&Ց8>HI1p t\9Ag! 1c7-2H6I}_dKa͈ F =9!x Ww [y͸F@mџV0"iƝ8ֳY4EE0ՑSDTLְLfBd3MGQ%eL!YA uHDs;3}*EL͠&F8 8)Pݍ aї1c옫VFMWX9Jv`hLcMm9w1vq嗦) iJbbdUB7R5H$@P-k0(&(QA&@ͫ' sAEEM ıUCALϊXNAnu:g6}PQ2X*25,T'3Wjs,,f9̭@feQJ%&22zѣ0۫F@j,ߤ-3:) 2 ,p 5.J E/P&dёjȮws }Qds.(REUIN.$ܿF'. wm}g)ހs '1dDh"0#+ r)L'1s LJj&@ȣcHH9muA䔹YcPUguTTfM Yղn)cnWlN#3)W,) \̊**JĂ@Nf1Y B $, h. A|x T2u#HQaSD467*a4D[?q}c7?.4gEP՝&( T+)|/,-kȣ\ Xc %h 2%7ÞSep305B|l-#g1BF˜`uP&ctFoIJ#on;:CHHL퐕71@VaՃ'7](@^8d!]dRDf.Ej0yMTMDU!|bHC q \̱h2S"*R I2X89a;{Ny/(3+zQҚv&ȞzL߾!/( HÿKUE1)Zhbrf3weT])g_egʈY]͓_g.$ijc4{iηmfyZ]b0j}z:WX>k[")WNi|Xc͢aZd`R&dCw`C!JiP !'rCd˜˻Mm'UiͶد=d_8f^%|xsfĺCx u'(?[>O؂pUlVDtFR VZS>d'7V[RIX1)~ƾF5DTY'σ[ wƏy6?ZT9I?^R fOSg/NIƾ:(0SKK.Ms?Xlac3hSŪsZdՎ/u9zm1JEݴ-|FeFhm̊[b=;'їv7P^%cw-H=>_dKLWB7d4-W{}^~GӂV׳־oc}3$Y;+mm+M6XƾSlшl7Ӱu|>-}{[Ahō:40<4͜[QbC Q5lnsx΃}dF zQ>Ԝ۫ks;n}vWMv(67]cI eO)=9Z⾿SճQK9c0m6Вc0)%"*&"ѩԅ)E0UC؟`Pd[׮I2 7|_CO7CbWǿn؇gG 9 A =\ w{ (2oGuJdɫ czٌz;*(6 p w)tԵ00vfD]en ĞNaϫZD'b>Wj: ӓG$(&o]YAJPf CcN8vU!Ka2d [_o㬆N<|^^ޜ!"hJ] о|8Paխ('g%Ic ԃsJhsek6o @ i܇! yyDKTȉ-;tx#gz's (!zJbzq6ےM2:t4Df=3m#r. a3MaA樉/C 064s 's;_ )X A`Zޞ'ri*r~J"sz$C @ҺkBtNVD= !jQkDC "73pdQ; *4ߔRPgHBH4o!#:f"WBzx=G%9-<ԭ^'Kt+@i㿥QL5gh] A;^^@Ad8kM^;nhXKEL\4iiq60WMB8tҡх5hR&4wjِ$8K4۪_s8=XrkPt,11jT7s1rw| e X9 b_HĄBkKTiPI5xMk~Fw0hn8mfVLsx񢣮dPf:k <٨ ~Bhݳ=O& /ƹP][vyYL%;!.xe"e8;Ӥ%N!׃3h$$!3Ȼt}#izya/y} Ķlc+15F&kn36iP-rI?3~t>V =RC"F*0!8t>$%!eHa'B}ٷIjBy`H:)7{$DYdFI頻(w e s 3_.<0c 0&(0"(^ 8CSԁA,6VU( 0lc">G^ 2rccg_o̙PN$AJEQQ1Dv#( 5e<ZTPm6Xc(၎L >b]$:6x5(^w>-!厁0O?bG1B '6 )O}2n=!3kZu{YH? ` ܚZ޴JGd#h/LDj$D$(eV[3tXCS4H> r?7qϏ' D;sH i 'urFK G 9#ޔ) KD;lURN~FνUN7n24aӏd?5.5,.k|lq~T@amyF5:|BCЙ sPrV' i!m}\+#CK:10jQ8Z9Og(MuX?VVÊp ֧$sJ^'[Ǵls.{4|9"Rq{8s~t55?xdv5Ny 'R,ZpҮfcO VSި`HdhoAώZ?\9?zgv;j0aJAkB43g+7JN^zGZokM7ѫ[95|խ0?0골-CZAE ITM #|#G='^0f`tGb `TTGS1bFC["VBm%<R~5B/v>5׈M~m('|joMV>囪dlxamXڭM<⭊x}8z2ɓ7 $ٮ%UUq0`3u?5a R "3Ʈ|yMSe~((79SAfdf$bvFxq [e2^_L.x3|$5+DKQ,=U $aS5PS D "d n @*r{xeq"e|{QpsfohsrXk"->;ħ|";Y'%W@_ÜƇ}iL:0,mq?M?XcHO"͆z]@~9"PU<}=RITsaH`Ją*c%)?L /iZٽ]FY*W֧L75} Ңr,(O&.r?r~!&"#eoAy: p|0㩝7r 0^xe!$rsFG4o^F:. rݐ_?УR鸃!#;!hw5Ks83 bZְ} 09$IQlRHR%5mމx㆓鍽5&?>TPOAXrqpyqv(=h/5+0pronek 3+>Ԕv0K`^&qcWٛ 3Mо}|-ϥ $ɭP@)ݾl%8;&DD:0gm]׮?9͹I2кK~_ qVF_x N@LDsUESOφGdd{Jftg/^DE;`x?.ӌ(EOc (2Aɷ6ۜU6 A3E!xE1j0!gy 0?D_"Tddߢ~^wgw-}&"$r+ru=Qpi0+h&Eq3z]7QԌ1E 5Q QGDC!! d6~J'U*}$S( P DJrohlhȔq/e&d7Ue[hG|MaƑ$)zV̍oR5Do2Lf;$n&eJov i$4O SH̨() J3ƇP-;):2< žpa r {05&)iV?/62FgJ~m+y8gH\wfJm)hć$9ˇag!k"\" u !36+L24=?q ru\](K{W4/?|(RёAMྌ*/yȧv%h3Dxp;+x+gdp zpw/:D{72t}G^;/ASsLD6@P~&־܄<wHo L:EU[~UW. 08:t49$LC>R(?wы2@P>{8q C[$"jxEG0mpBOJ}4}uE|M4 458<{R/IEBsDs߯>b吤NY("H 5Xp_q6U@R!UBUTQEUSUJUA"I4l9kfKoAňp<"*;+!D#N Dd"cBId("D)R()_~xy঻!é"dx$7dJv2,p !_!EA9)::@AgTAۓ A(~uXÞXcG>O'gnV2KT^Gw<>F2>d-14Y>edJ-E2ZWK'=NjǶmR|_ѵtsYU5l (2wGD.0 ȴvz18x'܎$DZ~kì6KD;V ߇BQ n < J&@ L * Ң"&Hѷse98K´d2lP?F<;qkր |]il?aaW?r q(rS0X?jO^g_g[̿M6HI F˞oDhc 2iW*(a~PuS3T84ru~ֵn % |2>7 1n?5wYE1 <գU_ۖ҂HsңGʍ ŷ9Ϫ4ԝ$fL٥2#Y lѹjQy<@%1.y.Ziف}).xs~mx1Nly;_xaܴ oCG$Eki˅?)8|Ч4)R:$]#툜dʯM ./5G`=1B8?AqӎBH|۲S:a|W`(>nB#6 Я_ϒpdb-PA钧wx>gO;X2Grմِ )_kyyPD,C$?F&Ȼ_xifTfGûYFBK"C_[cEb~\)=\z xb?(ҟ$T$C !_Vm;_ )oa/{ceTR DnBP6-4C̔=R}lCB T W0]'/:ʚ(5Zɱ݉uT|sLB9>R̈ Є%n|u M'\a Jgmk& ȊB`%۰IBB )s(13sw9ErFN!S!$pq1NY4K$Sfcҹ a8)95udvP7& f E0XҠTgAnLGA1h?ےick{HG"FT*rGiCI 2 ,D#if7 8A4PS upq(K0?l1b.Lg&O|0z dZYR0GSFuZԆaui1UF6r)I6&R !-I#w|54L,ȿ9:ꛗb[\w~aWzb ;i1nGd.|q#(1 ̖@'sqh_|~^umA[){3Apu=-eR GOY;XߊQm&65]Y8"w-6C ʘpU?iqH)3 L _3h(OÁ珘0Y`>vE6)[D>,aLݢ\+S}&= nGK⤄# ˾*,32( miɧJ^ vv~ϨQ>W&!|xْO}}noċt}73GU,@(._L0x";#t߷8zz3F~.^Sglbka>lW,iʱpzMm/wE&V8!6iuG8G߆ce6; vy4Ai] fDԝ&)y!AKx׆fz8;j+rZ=8I٭g;m\4`P왃S9=ůێBn Q£Ҏ5vzw.u J(M"56Km[" !+8P.(I~ H&AN ̲[erC=ݨZid7cS0?3K8>Sr~#kf57lwIEPA?@n/[qЭق ۧ' ʙYO]{EBZϥ;S*m|NHj⨰wȚҬF&5?L%N8PͺUWo4:=E L>ϣT# ԏɚ8;o.* Ǻ=O׏(OW ER&̕5O v{Ky{Z׻qEMK[_H-ZH!0v[X`{w\?g/mlÍ,6z {!Lf2Kuek/ϸ f0hcDpj.Mh0]@~Zd@iyVt8o?6Hv.Yk4GqxzQKoW=eȁtUh$~ϦW* x[pi8?T-<~a2.90:?M5bsg<)fĭ,q F˷Pbsٵ;+s.-56f:]!\jѭe7q%tUجPU\6~ʹ۶!U\չUI;~Yh>4,=u3\uӜ*_6KTY{ +HЏ1ǜ0^)LQJxt{~L)#Dn ɽl2}wL4C&PLK[akuhGFwoN( @w@1};S0iyO/%]luD7q`Gmۻacb7e䤒{DV\$c |4=o2 &J.;R^50=e N\B.HQ9z1;> 8DAs+X#Va`/NlhqBٺ);%\>+=N!O;l0k6 g0ٛy·U$< :8HЎSPĞ0>^3sҜvM~b6:Y*Zԏ/e)cbozbU>Qw(ЙG R#Q02g ]88E}nm/۞;wob]8f)T]6o`(?Gn"@h&Semdw@2/JS qȤ SlX`B!wuOer'l_{;4 Lx!;!2=ED(0L4%󣉅a:hv]B S2ie91b}l=]E9dUE]|[w樢]2&ʄRDTexY;w1~'_L XCƿw:󐤀Uzw7VVVoo櫛C3S4ۋOdUnģfnF]>jwP~julkѪ@(#7~)u|r2W\.XC%W(/ۮsz)`s*!xb#9>RDLh̗??Vv9{@ (UB^Ғsj= ]3g>p:z gs`U$ o?{Fʢ@D"FOz R=윃"zft,YD -+FxNx p r,a ڢg%n#I= 06HaրFA&"\sH."9AEZ CAv\5ځ>jNL#oPc=Ic[Scpϼs0cfTy.lhKUMU0V%gJ"{􆣤8VB#cGlO|8{Z |@88˪Xw]hH8 Z akcdeaF}WhrQ3ݽ5g&-0l$"L2 6AÆ]qZca/ITTlmP#p\:aFt`%TBooSp|\("V'(DÈ]rDƙ;y#>^Cw|~U n![C"359<d$yo<ʪ|R73Gxcbod`PЉd7AU2D#ؑ0tl5-)6fF_Ga_S(7Exyi'9zR]U5?Rb:;D Y9hSn}Rk|iءSϋc8ЈLaŜ-d=~0lλ Y@ƫqv|6ԇ=sW֯b<[Sdyʦ=򑿨K[9sv#9kj_8ow@3e=ymgups}J5{N]|"4ΘZۚe#w>:%>[9xJuӌAۉ9YTm1-*&L3\)6y)CԸϪ{tE3W-5%n r_e,TSW'4nStghFx˝U52dtTWV_/}Wܾ:'EQOSѫ!u@.DKhnJ~ލ^:AP2*eTU\D+yѵ|KߑS2:Lq3oglKF ^m[%R\q5է"->mS4!BuKEQCU=j-U!gN}s+M__O- ~f)50v{ϣ5.Ì23F&|FF&p<=Djo9U9?5Ԣkx0C캅"FnӍ'Suƈ+G p6>l~ C'R ; ?Y~TBgGIn`,?'>(rtMCP g:V ]8M0;]lvL)QvbiуҠXGSrzԎiA4\v;5];L?06O !B(G: 'A ~RTen1?31|3xrFȄۋ˼H}Yާ=}s"GZHiַ7Ы-C-臲iPEC$d7u8[آLʍ6lvYǫ<)vGb^%؜hAJAĐx$ &nIbqtYQAfb*=쎜T*c:wPy-$'`4{?'7ܤTE,m`U﫹~'Tn49 Oאr,';LbHq h@C!e4Rb8rPr6y& XQC筌6YU.QAq%,Yٟg\soObe:hQt(If26xℒ$jpR>x'eZMw/sV-rUeYZ5AL{Kt, ].>D$K%ul澛V7J%(Qb9: ?gwUI6\c-;ٟ >-ϭǡDjf_Q P*e_M?p?]]N]PQT P4Pwʒ11D.ac ?!ė4{dQ|3':Uwe~^$93e?fC8n0uQធͻ& o>uC9~A>l5R\l`zUMLCVh(c{>6Sl%⾛B-4YC>]lA>,o։L9xh-hrd,ˣʨI:b'Wwx-OG.)pٔWwp8sj U$e‘JdA(/QTsKKGxhFB2IL,]w72]5]WTB(ʃ"/wB|䄯QUͳ~Z841)CMETƉ \ hw/$_>&EP8 f6X5D8`5It340/dI Q2 B?'?iG9Ȅ!m={.|O6UM zx,!,#쌒j2S!Zr 3 H&!0prRՈRIp B" ZAL#{l^@`;dIL{CA jRr6h`1D- h̢X6f@տUzNK!.0V~-uk ⁿ7 0 N0O8@Ah: S]e.ԛt(-&~Cvţ\ {ƨ{-~sb)z\dd?$em/zYqqЄZEj] //BWC bΩ.Tq;0%ZhCA _9]Eg |dT#Vf":@XY<asaHTin-n;O>{v7 CD9y/;#6]7u>Zh S Z?/+ǮV_J~vx@A̛g#l5/0` TFhfӫI#6F 3UO' 4ڜ  :5XۓpbeDF`fe';JFFub]dTP@٬,Y䄋RH{.1F ( 7,G#& E*8%.эK B{o3͈4éy4m|‹ @&_~^l8kzCbK|T̗7ϊ C8cvL 0zlVnȏbxOG}:)bd'+V|$ aGZ`bcTp|aTO:|_x6hK/X"njÈ&+OLI1Oc ENJ1J`8LC:bd]X$vgLdd͛eB&Mr "l K^Goب那̈b$۲p\hQନ%P⍣#h3a՞~&ȂTD 6.DeA!;B<'~ottn/kVfHe)N TNteo<)4-rDa D\\CH|绤0cgqgC4E+TgtgY n!2LN8C \l?7$MyZnn9_eX8WGuS"~_(=-ʸ]>}3^brN } O=gQG5va jF Tuo* 5Ǚ_22s ?H,O$I`% 6١~h ~=<[g2]4&; 8wYC^j?$B= b# f`r~Jg!C$P:*;|!;c%.4#qTRZ.Qi930}mU %XS c,y2NvxKsS(T4$U{?,aP:pA iPP\+ʐCOnopq|Ytt'_&kVw9w:~_L=) $32Z:.QTaRgƮZg/æ^ZǖKh gc6g#q}˿ѳ~NԚ{冷B) a=ss:M1hjkeru4WUI78l}}""աȒFkyqZm4@+HcoüW2Fo_)GJ[΋d2%*F1&BiћM҂1YgajQ0},rBHv۰U CRixbe#%! sjsv v+H$*6L:.ȥx29~KW$nf77rx8<_ޏ1Mow٘@&E 3ք]:Jq\# \ErwQbl5OMї<=ߜr2qVs.&~/:b,hƧ/@']E66j35sUeD}ִ֮U3O[dFȊݎ-e̢s >i<۽~s߿ qx=k:FQALT$ClFHt~Q™9ygy-vjtEꇸbtxz_E%R3d՛joYz>ۿه5[=q ,*S4oF=.e{fwdFQK|NvXx*495ّx,aqtkuX7d٦Q>p 3wL4OsóvΪLZUBhѴ.7b5R8 {U')s>Mku&KVXiZC92Ȝ۴MP|#24R:2ɩ]h#6X E#x8 5|-᳅&Ƒ5V@bbL+2ng y:/K½mDFgՈ3L3d .W+pzmB64Fv˱l2\Kv'5&aII8э#-ל'cX?>zm%X(*s͡p?ZnteUS-Qk *ž˦rkEܹJt F*!E>r Ϩ3پ=ݭiy ̵/(p> zl~3nuw^Fb$M IɱhwU޾ئ%̎}r.F;竣{GѩaWj:FN%ӖY2.BFś⛉ds˛pj:k? <`9o^ߧ iL|Ky[dcc<)Z7;OdK !z̯ K-5Eu+8o8$9㔺~u W['vl&2XћN.Tfmٿu5F1ϲ=NUY}|3Iz 19`2 Pish#s}nf?I$.hi顮ldEUAA6J,^5|Fv뚡38`2;|`rψR:!zspHU`BU8~أ9Pi\J@XF5^$ς֬ݎi)XQi"ʡef?~tʆMS@'Ugʈ/0쑟|TUYJ OǍ uKw]xω*Rs;r]gR}7eUU'9{${/dӦd#jn!bm2A}:=$H}h~]_>}y~?2P~5bT|~~JUAM7(wD$R\n0; LXghq/oz?yDAku/l~= _d&Y1~f C221akQ;a,SVh5^ɴ0mDl ffʊiĖJS QkY~Ά7|;c.:yw^FUTQEeGN7Sy$0HA{A1IF4ʻI0Hyd!P}CH̟zS$ @ll`6eUUu7ř9^yE:9 II~ƥ*z5%74ڊL"zEۃIzUE_ܧr~ǒ{1GJ[ WWfR+uC Oőӭ͛|Md'aWʱh.%|*IW̽؛&BsCC#I~OH/Յ!:Z$D@>`msZ62E%4'a> |  &"2~M?TSyy"B_;zjވ:4!A>?z=(l^-A$t-Ndxx{*s3aQUEyCF9 '1Pw G0$b`R\<$k!#c'F'c}DY'r" ^- hSu ꚥĀ{yr @@Dԁ־b> C/A/kt|a9xpMa!BD~]TD7HqmL>x@@q8H-ww:;o?0\@(lm'BP^T MY36i@6i+P7¥iW%EOoPGӜ,/(xMʓKށ6ЂQ(; ,{=YB ·(mY\7؅2{iOFpc9̷awdE!j0#mH+HOdM"glT!&b3cYeoQ9a07g_>ϵf|kZ<if>$N6n$<߇k>cYl;{p܇CڄeϸK'KCpiûx$ܣ*R~$SfH9"*IMڣP,o7>{N:H75՚Ly;#ֳpot: *Ь*s1\UUUQUe(oR&>~E(Đ$Yda<>ezz~~6FV$pƪuJdsTBI˥EL2d:3<7"ff-Ё}!VB$]\ؽ(tb}鮥Vj5/㨲a"R2LIJ&3 MyęJ!"UnP(Id(iR !J*i|߫tW /?{$bMPY-D{5_:1Ά!к^L Pd9ޅ!ć$6(om_.w!t0D3c#*iZ ~ua)Kղ<1oA2Ctyx{U{3323*c> V*j!ODoؽ,"/Br6c+m{T~]Nl~ a(t3=V !`iRR"L )}7znR>ƥR,qOgV掹zz-Զ>\~ּ ߁ __7%H-U"b||qY›wlmӻE*SbE6cn'dKZ7Vf+-g[pҶ{|U)6,%"zk^~_hM]NMN K i:LZ>0L~`DW|fu?N+(w r t9J U;&2ϟFHjy3[amyU#Gy#%wS\nTRfgXNLRI9 a Mz?$ lQ*D) f=טE*]j>efQ6x•$X**qE+zٽ&[r|~n[0]Jw]^/).sUUB J\ⷾl\cZI:sMCJU]o($ ;6dK"U9{{gCcmGr/)Kv1iWh;b݁|^U0YqEZG(,|_1.M_`i!ݤG5>iZ4sl|lWMwa :pw>GW|1HUz AX`M# B7$P_,qt ]sIu{e3Q=Oӕ ۥw2N%fQ,־+Cy0Q:rWC4klRyHu5rњԘw0GۂQPIJW플o!the2lPqVdAB, V{8N ȷyd۳W0=d(V*6HF-(:! rbOfBemȺW5v!wIً9|Lܬ@dxUl]NarEn!5#0!=g*#0KMᬐ}ϧ AOc*(-$;+oNdGݻ8dE:Cd'w2٭IXsfj˛1]5g9ьv  ltYw䅋75S]z~D([;ykj<ig3_`۠4RMLң .xQ^ jY[ .f$(z0?=ѯ/^(zt4 %P)tArf\x7њn&Op# asx3_Y7I> |;"28N|<d6@\7ɺ'U<=s땪jH,8vunU,kTӏ~C9S#c.ðZj9|*?eͧ0]B+z|LӃˁfHSB+n3 @JXr׸DLD>j2yh9\QYR_Se\T1Sη#+T0/gX(=?v"d=*.ZCaǹ!O-:}!Xm J Lq'H+){bVʿ?SMە74_{IN(:yeab%QTZ&jU_4AiwKAOm"ҩMTK# JzvSږnjtkX( ˧J(ZvZ%da ƶ/2own=̅B\%=̅cr{;L+aXav6ek枭ڢP7(S{quML#S<%K? 3PV=ˆEM7c|TҨSp}Qn+P]DcfH^YAI_Yѵ!T&tVu62} ܅DG_I>^EC5ے*s+ҒRY΂&Oyo} ff>"Ǣssv}OTR L~xo<^C)n|lky*ը}yf-k{O{3kz=vgkKբ1Z8F(i vvru!GFǼ ]Zt$`X #pg@uǛG)ȧTU!XiF+g~Dhÿa{85 {mm2sQuA c4=q+ dkr1@6Gl^m⊴&*y6`<{\P #{=YZ,8UU3C+ )]7K5-tS_EIq'Bs{kD3K-SL`̆rgt12@q%u5Yzمea1߳lIH1iMHCFӥHefT`×S@-jhl9Ɔ_\N~J6YC8!g55dvG p(S[Rz3; S%:=>$-!<&RT Q@)Eg|VoZ+ZDf=kMKo[nj:tK̔aaٰhrstM5Xn{kB/ѷCR]~x19sوSӪQ M=ǯ6nsVf03m \C*a4֭پ[0͖ K&J4P" VF ߗKAV %!ݤv iy-RhP3Dx^It0>3׍_δy= Bi977nR7904u}8{|I7I*fN8[2Jh6%nC\z@vNLxEY}ukdK e=j8NikcN9vk:cT|hK+%;Zbyt9<^[pK["dlw'`]QtM4UR'Ӑf5RdtUtSgǾAL\|bC8r")Ge'#Ts;b zU^:AӮxmD0\~E"^1|Q#3ERH"Rx VE͵ 6v/!2 bUF]$ ˵uHGcz;sFof$s$ZMJ{cXjRuڼtTPunۻqnszJ &w;粄zE wF@O=_hS)UӭT8]\Bx{5meGRE~m2`R9A[t.\q1;c2S6Ypl+_:vpm&L~t{<{[Ec4E!"\oM_DxϲDYVS fm=Q4%~vCK1] Y8$,$#dyK#9)6`ɔѪ{-dE(ԨTòdD8V8\kO3 0H.*: */RR'b\_scu΄%kw~oVz^ *s+"hUP12ɾ>$(Hreܼ6y:xo߰E+vzT̈́,ivVsla]QU6_T ѴI痢s#{82V |3u0^.b 5o'^Bld ~uN{kcǡvP)A!sj!D)mN&=+Qad} fӆDBV퉜R+ |he36c%+eWUE.Ј&4(L&4&kbf`Vg6sAՆ'<^+DNqȩb;YNߴu9,M<8q7v]DNq,FH*dy7r}k]3C>'UvzQmNvfmMJk8M;ojoR>;`yg|B)$KCoH=[9kgy8_ɺHdl ~TvQsVa莏^[@s<dF/S}W[+k9TogV%ݷâryݩr[:k:)tT8h/@,nhj3K<LaFfr-=s e#dctHPE~M[\|JF<{.JP`(. LEyu60[Ql 2 KÂSo4B3X\fsZӝ ֶۑD_E}Jڊ(?wFQW]#(p)р1CHS=/1T {/PbHyziOi+RuN(M@0vKMBt?Tb b=_ʿUmQ.h07dt # )Õ쫚utiqƜI " u)3 2Z^E#5J%K*ynhΚUa`nr8r[>n WeѺR" P(_ހu%u~CR3[n n;$a|C$>أ96pBzM}_ڳ;|vKAI=53*:jM}(Fќ`m[̪nMTE6cQ[K?3=8NCdlSxF~ݷ@Olb"$"=y8`U(CʤA@¢*"pONkA+(q7,lZ}eO <[\o^J5jZΘELW' $]քK'ODQD6Klܣ׆Wi) eWq"qR:D vJ7z)PU-j%w;m\?W:ҬGJ3$byC_:|LoDX1A 1z2 K &Ͽlұ-7-QSnQlBvM3F16XZ0Tyd]~JyyՐo8zb,.=ؽl.EϳSVl`p㵜A{F[k5օߨ}]1\.,ulFSv7usTf4UG(aq9Zrq^MA3ßEG  "^8h̑:|iw5"OZ\G*<~jz.on!z9E6OgM|S 7Z@kJ5}Bp ~qXf;S5SL>Ar}n"Ԉ712]N:g4)_"x 02~\P\ ӁrR 3#< ɭF&a8Lc8aڡR Pj ڨӘCzcQCo2 Bݿӄt"5c$Ơ&RɔLMGu(d.I "UֲC+L#e^7Rn(Q,F,8r/ z.)lC-|GT]48?5 \Ae!F c#oFsq+dnF89K<΁KSR2OſtMnP&uRS.ȵ\mJ2 sC 1%}G55X]H6N=a~^7PS@Qk(i4|Y|->f'^oQu:Qztx[EgT |Ru F^y[Hя,+fӞ pK?Y{MoXN2X5\Ƿ8 [_ZћܴoG# 3r;I@TG ktߟ*\#OA]Se&FJ`O2uv +^h48fXl bUwDR2apDIE;ICkdp-ʰKMȝYY]j/.pqT(Au$yc 9w:u|'fNo UW=UHػz^c73#ޮ;]g<Ϙ* :ʝ:*@g+Ľ:pmj۟R8r5?'rXhD߂!sƀ;  9gAk3pE}`kTŞmdͭRUoavXYc$[讱ٲѹ́]}]&X[M=8Щ N@Ek1κ跾db{U L dlOilsk=qelȯIuLD{GJc0uJP-Toe]rrCrw< LԻn%C;q')7W cxziٽrOz6!#AɨXC|LIҏU,4<8^2bNKyL s._^nfp]!O+°OgC{vx֊v>"}&oÃ[~#i|{֤7˧af hHiT0V55"@T -Z3mo U]PQ lޱ-̳=pOf8図'ňKOMk5h LL$9nL綌5>I2iOՖ"yt)2fFІYX^)EJ#A?&W69FA6@$l@YL _5.9qDR R!Y! uieX_OEGs˗/N"Radi1ύ0A%J-0(BQ'_5>Wf7J{KHpZoRX&Q.$WdSqEPE=0(b'#*&( ⥋*xQ\2 r4aFw[?wnTݸ ¥`{3w:/=ʆpMP VƼ⑻_̓og\amOn~=yt;ף[0e7pv vb=ce o}~4ӽ  v@xT{ѥ1AF1n~:^',jUE_q1;}>ZS [¥cj _jO $??Klю>2b=x9G4o$obƍ?;)5|JROdDͱ% |>1|[8&`|͢?vM\z>OѰ㛧g;߳%#2 Fd*)I;}w NSѢ] @CiOM`B.vxz'D||PA2dbġlAۦf7)6ÃȠUF4%qyIiH0rv|- 4]+m=ly̎u Cv\͂u!fWX)s9׶D䧽ˡM'Pgv}{)ꪢ/=*괣2w@AݷdMRg٥'-gʖzf 4 DCmfݗ\t1J{7soRʯZPaԐ,] 1]$R%KP(x4aIcü1pfx>zfB,,835^{h#tHNjwz_qnKz"3n'|41纭^ۉY$ā/C_\z\҇PJQE)Em%ri-i[>~¤eg>ڙ(9V sNu0c6!ٿpNA&#lWMh:QU%Nkgvʂ@cUgo.irvs)KüpQ|E@< z 8z`M^-N79Puͫs{M7)[ޝBY{#yDQ *#p{M_)ϓ!{(XuSP[N1^N IEӝ$X3W\M9櫫c(pw d9S>e"9~FcŌq(E]K{$[_[?bӫ*7brᆣ=XC<󱾝ml 6'][|jdY%7"#;Tx!!f+kЧ-xQ8᩶REn)W t#Ȉ\b X = a4fowVz7A ?~jIt wh\M]U.v$='d7OgUIk-^J&KS/+a1p0iu*RԆN%)@c}(9!uxZrzΒd(8ެFj@\"qy45;+lP`ePё> t@D; uխϕDMtSQ TNznwgIʺIz>z}K:2kgc ^c*>ϔQEUd6INeRWݿ4yu/M!.`QV)WzmK=sD;Y >"G[Q`(NPr1!pe)CE/rӡx~7l~`M|Yq ÍC tnurg"?hȱ {;vד1YUUUUUUUTUU69u}UpaírKHG)%^.0|@ (߼ZL\9D&|IXyVq;X-j!3/skG~׫ŝlsQ`כյڷx 5,%P2.4!xKH>(9M.=t@TG; a73:{G`Gz<3߾cu ZSb#|điu3(&LWחObbJ^xFԟ;Z,pbt_S*a enkQ]t7OAexSvfI ZUγ|'sSw|(sd0Y?7<5.@P] p3z E!% Ap)$[-.zf};(u-f>o2_l]9"[}^}ʔp0]+Er:b\g'hI{ix;iNL,]O>5+ѩ٭iӖL**~5(} H}5^#s=X*ȁIT``F,a._o3 a1rawZ#~yL:(sȣ*d,#InL#q"u'k ik^ʲp'=Gl7 II4omBɀq:&4FLp%c0Pᛖʬx ( $u#ɗđ9 XXEhq ue,+/#`F:=L[,X ʴS*57IVv-ҽFv's_UQf8͵le3gL_Ht;5x"Nu}N*Cv XZ?lO(iyf qTHW3b[sgjTs\2@NO@+}FhᵋeqQYF1TUo SrX/w@5uѣT7eCqtScQF }iᕁtnDXn6KI8FC4"(n^LG#BgqZhh [7\ qH W18Ht8li 3{=BoJض9ok {k9Ϝl25K'f ʍqEo|%(+jvP{{R!~!'~٧f9:g)<> ,`*ʓ{ ry`Q^ D O8s '{,M싟Ǻr PFǬ(u1V' XfAv;Ѥu,Qi@Ϋ: q94Ӯ>?ɦūz >w2]flf*ݵo)]F$s nPhNI B$S?_{v>$Ul+& v/ҺmOvzߛ2cA_p1 }TjM5dybbq_lƲ-CŸg;YaPd.Uķ~ F삟 LV/40 v vaOٜDUA>xmM*!.UڒeJ/VCɲ8zr.-ΑKŊ%5+LFpo\ ]svDѤꙣHΞIw~j7b2QOeQm)1LKmbdpbK:rCX@ mq#m6mSXܞ<;`\wPP T"{20̳cZ]k"R_sׇ eKnh/DŽQkrj9lj7oU>`n AI2YÄ[[ImW4>F<%hV5M2ς͋a'f)m9Y ortVzoJq//IѾ?ctVΖݛl1(駶+oY=(wwToJ {1BCІO^,=b]wl=xfji&*.Iƌ.ՅmkQc]0{7m\m!~0󻟄myI"*wZT{9] O&$BUygW|3$ߗySQv%+.HU$GiƈZB!{|Bsl;0f,UGOGʭK,Ω3&1{-b.Ι2aa_z-ڏN9A;md6 dAuq|Q?`ɯ׌!9IᷬTDG_˵[ dCrJ(,_5ftW3f.Je6l/jw]8y.if֮6&yJ*pK"# \^?!V Q)M;+{34N1/1W?Q*톝o?O5H_Ŷq.CɅG9/ Q_^Ul=vz)@2lsh;,F߹XS57s ؄ J_êmz7_X%a-joΰNjżm,.A!8ngZʈXw ɡ.eꈈ;l!ؓ*:D-lC9$ (^jM5/@ӿ߾Ymր%N O= jOZP;Ԯ:*\LPm{Gy J!iNӬË'C]0N IH &7v<%ZY>żͪo[ֿUk Y;.Y C&R<L6[]Y4ujsav7ص^"~k0\-(׹5rzJ(3"D❀Sb`p3nH`!HT.8v|]G@#{Oֲ4w:W+ȼr>) G''y":d#Q+yk!s36tErp|!=ORp)ΦCQ Ge|=51{Ήl;lSDyQ tg9(Za"~S̞PgyS`\:Ų˞[OL&֠`gQU|Zk(qC=_c[(˭@FSo+1^~^j~Ģ}SF(*!G|Swf= 8mW 5l 426UR-,t ӽͦLXb G (ĂeeExLNiG~ 54QN tV|f`Z_4jly~26Se-by~rݿ~_ 1boa"}ٝ*pN{(]ҡ ZJ]'+jNiI1FMֈUF!9z (jG%(Ak}^AEa$,}+̞mE@)GSDl yz9JZJ V&i)( 0}ђд%:LI!P/-F\!PKB%]BFJS J+Pd)J"Mf#JTijǦkos|]Mﲝ=fr3.Z!5pyC8V~kI~h5\z./\<#AMY 2 dRZkܫV54:~>y K]%:RH!4&cӴ?@$b 2ZJ@Pa!LM0wcbs=32_dQ\ZxREvCk0!'ݪ}7i1dfT(縍q: ʄŘ<raGE`.Ι);BO>z}4Ο%(ષ>ߊgd7;q3 {Z!b^}ig~hr^3t9W2xuKn}9fh_vK|.'3Q~̎Ahչtֽ>?"Q6V:^ 3-wDȸTW\/?ڛ $gӕlR tF>|@CTDRd eib"&("Xh$gw0=9`-p"s.h]pi*h;'柦֟ _uWؤnȸs4ZIk<* 9|\HXcLSC!O*2NTwBn>dOD'<1Cy39E>|_G٭'ߋ_>"}=x-{<WzKo*<>65/d٭w'O쁝UQqkCunv -6zZqyUk  }&vqEBOc>g&۫<[e|7cpqN P\-Ew3xςOnN_SdG3hH?uETTDM/dE'G̖{?/mC5y>]M_OW8259U5|]ή-aY>)>cacZٷsYE\AXETԔr@Qem~M6TAB*|:ZΩRîܙMZ_> 9ԕ'([ z.NYuYqƵLTVUV*cmѢ[a5Wf>nr:Ֆm쟮:Lmf"ǝm^1`{+u1w0*${7c)]gvjT]5ӥ(㌫#YbYV4]qUK,oKjǵ:m|LYXh<%}ߎl4x?wdr4qgZ>*JP r3cilGՎ/$>y6M0k_Ġ'A~$gefi3װÏpnl%0ȇ^'7 }fQt# ˬ,缒w#idJr sT˿PsG˦Uv0 ІFŢi%*Y5y=vx?ꈚ_>2OQ:0 ݡTr=p[wk3gװHv/Uڹ;zس:yǧMVZ~JT8Zoi~vFjéf;O.{#weJtEGXF|q#ר2 r n5NE̙3sӡ!a9}ut {\E!UUcP<% g_0և%fTsJ9aLzs2 &G!|<}`y5G `>_HXOJx$= wt'uݑI[WNGh

3u,B 34$@P% MDA:C A!b!HJT|^?V߻p~?r{ߨ"2"GiEQURn?rY?wP'̸L&/My:7#}h?TѬa]?<߻{-{Sw7n7L r8بb9JO#ò&\ACEcL6b7}˦=_pٛn]c7 i5OG0+9 񝣩XBD2n. ?5Diʩ9fGj& /Om(@wUz~<6A|k<4ieFI)+5Tp=4.ie(_ƬΈ [" (zTA>6zW?E5YO??]v[㻗w#GՆ qa<f뮺)JR,,⿯儼z|?_?: 0ήyuA鮺kǏ;B!* gJR)/eqT'8ST>Dܹy}]>9:qOTq6$`~DGſӤ8 4GK2d߿о>8BBO hSB L@m>oxL{VFS1?YY=e_]wހ`-K䌉˪:2.~/ϟ?ѷN x~uS?8_>+>SvfB?{/"S}/ pyRw\ϽG1р6a,1EHrJ׵{P~BF#a6 [=}$;qlVonYd_zftˑ!3"`GaUVxLޓo*8ӕSLJ{Ӗ *d$^pH)!%Pb8-"e&6יsdqRq՛2R,%:;p3tTfk3TDN:?ܔbcnj64[e#nx. as%魾i'Mbpd^=(R -ɆG5j\#hS9Tw5g)1Sa3`ҙ$Ac]A]Q[Ç)sxɶ 'rDJ"пWe_8.(ފiBB|Z?J br5Jv0.DsOuseho,('U j758Z=twu @^;HE=||`Q1q)|8 |k^h}_7՛)"pN9}U+T1.Ú>* )kb뛸 !xC9g6,E"4ۑ.\|ZN{!7Unұ;z!04W3xf(+Ol7 4d2tNLh~uVCb[hLUEb?^'8O8<;SuO+pG!գG%^84*f>chn:L]寂!#Y5߇V5=裇0(03yΧ/$m'$$$$$$$$uo8(YQEQִQBBBBBBBBFܟ7x/y |0=fT@c~LP*pu3dOЋ΅$@!hGrB  #―ex#vN8·>2 CYO^Kky yx=\.`": pմC;@90'_|!Xa / 㫿21>܉C@W ~L‚HqAh#hYMA .LTtC8qfScAHxV$s@J} zЛHxA^{{EDYt?@w{H[`oNc]H@ hAG8v [R g XRBfaݖ<{^)x<ŷ*o(my/Q 4daL8޲Ջ"M6l ߵ?"{(x^B&4Otr$L1*cQ±tsf`#-sB4鎬샻1w\wWFq۝kس~-֚ 8No8wedjaDq(E-Hs//B(w"wzǯsK٤v #GI1 -Uǐ51v~}}ըzF : [ݽLŶ ́@Glj[%sd[LHC- F,О! *[<٢BiOJiX-BgoM8ȭ2)d9L1~|{!AuN;lG:&&7g@T4~9.cLic#$IUfş@p0 2( N5ӷG^Ol({!xq^Zœ'is-]#BBT(i)OwA]+ ʛCP &:="ޑ=ìBTC,0oxt@'8/^oFok@bˑV/tΎ! bK391~TmzxhOif[.aјBTF罇MAYs%4$>ZIӴAcfWG펵?&b:+;ss`ؓOAeħ`@RU<̋12f<[Jf3)rΪCŁl?X!kqdPǖ짇}*$vZ3el) @jcY |(\ƀ}I/t[~u)$M-ǣ@Pl_9HTDGhinp2=t@ϔZh?z]u'zx[~iA`KU>z%=<[+8"%ӗ}TxXy@M__c&:6ސުD&0v ^q'A<&S֧?{4ID{":=;7!ɻ:{ :x:s6$})4(qG/ԯ7/gom? .qXˎ;THmvOD7Ar_7x`#n[RwXd(/]M|`M@hJ~{ͅP>0'.gC'6O.]˵C $y.7xiV|^yj^)ԾLbau,st/ISa P5I: 3TeP{:偑y˓\j6ҽ{xqhHwVz5SDK'WICD53|\9dx8!:yI;ptl聎 a:ϓp~ `Jay[k~c4$iU?ߊ G4^c0~gF&2ZI  Rĝ .aY]:nR4^׆Є 3r&c+LJlTt]\Yz{_ >: زpoOq}={کny<5\oS\`=8=S ȤK>ߏ0\ 6or;D<`0 >2x7O9~BB?'p\߯ɸ*ޕt?c죨xi'oޛFf-&4UXҏb#]Kxϣyt#%SSz穝Sm8WȖO%WB?4H4y)Ǡ%lRY2UdiiUpsChjm TEC4 qqpi!Pas  h KqcB1ShT=?.}6WԴAͷu3Xѓ:a M24:5]ϟ܋Jc3 IןtZLk5сNIxOx>C$1l'-unh_۹{1lJ)Rǵgpj?4ʦ{Z:9ER ecBFfxj*gxW yڵ?o7EywlmufW7#w6ӭDz?P]OUn :e>_!jVO/՚ }t Ma\U+pkLTwΈw]/ ^h@ 9m(5Ha)JJyD4=[Wm˸BmֶX7d$%u1LV\z(E ݧOthzm4dzKӊE׹5Mv[(_˹Vx竫NxAvAvg 41LxSe?<׏\k<=o ym""Zshj~ťzTܝj,(3/8g5Iʹ xYR[y!f?ZP_U~J#]<|"@DNu#5?'o :<*jtOE!l9沨sAѯE7;J6Eg-.FPs0K?yBqؽ{~o#\1!=雰ǮmiwZ'ﱐ&TAm9f=ßuʾt` 'Sq `Q pFZOңL03wi|\uth冼̮6+cxtIZ>R9QcNwNfL˒CtM~kVu68(u!&QƉ9cbhȰ^ kKTǎ1ܓakq 6|= ]4ӄ-RײF !FmUI-Sh~{dke.H[_sj~ yd]T6FODxt UZ_{Xs>Nk:9C)^g"oop%QeA$@( 6%߮OWIc:M_ *ԏ]#OtdZLU\ԽWhyu|(jN=q^q_͈}<ނzV̏rc9F7Jʕ TKL7>^;PKx s8v]ytOYՃƈ"j Š YZK÷ i75i`LfA&v$Ȓ'l" /~#ojw +3Naxⷳ|huZCXfIfY2=OJ=D2v^-`%JMdNh8eR#zqōn(K#]*XUV:M>m-ۼԋ|کÜI{,TP}8(?ײuV(my˝70>'W;tLK3NyoaX+U'KuygzkC i~Xg=ޜ(h]SMC2/*ZClu|#9&T(J|0(ׄߛ?sBfI^j]^bGG%6׷u](p媜lM V}f IWՁg,Oa;T;C*wI돪ⅹT`%6tH|蠮)8ǼpyO,8Bnx)1[%'q(w ܞm }f#1@glt;]iVfx y`w 3gIe7(՘T'asjfK궷+v.;Wct6jzn͛˚tlv=kDg}x7U51U%ZTn3; 3em0];>}3MsTLP hJ) 6ڭwOg+nل4WNQԯ,;s4+th[\OӭZGєϮBR$BEiTLU!Fզ(j퓩۪iůBDp.OgZ/q86\huз訚vszŤ2zP35,עbl"OR`:nϝz*7StIr{JUV_C=[jF{MX1m m&J!gMBg{o.`{ЄbPR %Z̅_-MR5hwh!RL1z:<4{}ƶvn&3]N4+1uOK1xjŧewR7<}Y;2$Oj b<^HtFfg{٣ د;LPy⶷O "_U/(4șY>_Znf_ -z[ 9RiƷ.;9S@9pr\޺3e٩O_ _ȓt-n(z=ڕxWI1:ֽxz߃MsD?lzjF@ fAB cG f{ⷣ-_ߋ5nDߓ9oI=0{⾖PNTuz7{.W ڙPt<+T:qPe!?J~ ~?ddwݞyQr^TAQ3C-z;~UK[痆Q%ԴnV\]ںf \({WlXJdx)4^̻»ʗ}GDG\lxwǯ6Y C<a+cr{8½%̌fcpᖍvRCkRFy! Rx{sà)Ǒqէti]Uݎ$,l-h2VKjfj{Gut&Lfb{b5BE?G7O甪rgL%`W3v,ా $˔]muO\j)tIb6.{FR\٥~J1׬֤&Ľ5ɜxBVW/m?nl/qE#8TJ` JvQr>L4IL| Wɖ7ch-0(S&"͑7=tEFNmj`jb;qk$ 3ے,ET\LFbiU5j%!jʫ 'd Zd$4W;C5_]3oɵf\-My&7j(`oYSS6gS#͹C,΄v+]=Vk9 ?uyw&uzr tPJ8P]-L[L2\*ncB/R)A Xe2BI׷mnB*)T[^$^E/](ʊi z&k}!oB /:>gmiݜ!f=:ˆqΛ#BAZG1F"wU7U?^r־sOʊ602A·I#TҖFƝR(ϋ FDnXPV~i LsQ$:Vl΍ %M6%9/v.k^U(KE"w mEg"m|sϡsG:{9h}^zl~~~\(F>ҽUf~ꩥDMV\g:}wh=ѡcwJ>qųՎCx%yrӶp3N$~.&`;PSl.l"0xXbTB R$m&T+J,'w6*#o6I<hsnag%3a!٠.d}5)V^j-ʉ]3IMJF+9sk;Y@/;>Df98a } Q"SVZ]@60.(Wim o RΖuґX`hUMBͭWHlof$\廾(י3 Kwi)ZL [k|/-=zwjӳ_n+Zbj~uTx56 ݻMۜ5(vS8\P1T"Y_2`ǑY3n-T2QPϜ.>ت*MB\[)l xhk|R׊y)-AU(gY!gi\5_l7w>qk+h)|{_Db(PһR&ӹM6uCM dbz%೭'hD83)V;_*/e/Nu2 .w^" O!lݯgD0[f]c9J(8cݖ\^>Y\mʓjUJ(l4LlXhse(OU'INeh{+SFzD^ٯhAE;4 Tm >gIʜ&f!k{WǝC*؞fl|CwZ3 Wwsj}DGy=2)JR)JZknT_יmIgjϟ<)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR@f3Ln KlxLsQfÔ<|\(UTBҲ6=|S}SGǤ݇lSLy{[lOV­<Mo4eySO]ZxfaZ|u6N2`iOon{̍H'"&H*`*uf)(dH(i$!%E(%GgD>k@7hA <`p)x MRFыZpu"!0κ/F6"!)>ϾEN2T>D7X#7uMaf!j|p* /D*xHć&V);!۷Zb &XK&ɐ:Yv$7<;ST'_ɧ_x6du~<('.?Qy$zgb1" "&U=gdLjksIqm -NKI&yv|D#[Qq]i [Ny;X C̗WpN'e W܀mcE |5WE)1YRp{{N=)Ɓ*]y` 5^I&K5#5tɍsJKIC,[%f &y&cgrkws{"BTKyГkZ d7P1cƲ.4UAA}hRjQ1'cV09ٺڷN;0(u&K8x~ٹ |Ic#+/_w\ӦcƩ[Gz0*crR ( H-@Gԟ6aL24'0 rqDNlʳ mW 5֐QHwT;BuAmWcOYC~րZ+T a6"kH?M=+l*-iMQ7x4E$Qcϲ<k38y#汙2*1mTSum8m %?7A\iw\VhU'^JkN0TQ`d |{H;Wi꬝X8kCMz:P.C^ji:shTfP6O/PHxxҫp]ܬX5/Dt(:>WQ}1_;, TRYz*A f#w{=*yyδ*Z.Uf;?.|<79{L1gՏ`D́-;f?k{kU :OrRaHgD򢶎k]TTόSx۵YSdR!w̴w"}(P!u3Q%NN9?^c[j":vжmZc:O}ViKHzO Ѕ{1ЪɯEdCuwy,ʊ*-D5jQPMVd̓R==&-ia.#gBljp] :z屾lr N%Nâ9N@oYԷ]=Y?Z:;+rZ>Ns{|[1GfS9e6'YTJ6DN6**#zq߄ajDux"2rVԤEEɐY/̑QUv|fӶ\ :a꿐krZ"OCxzrpQAUPӿ@T6OAck6t&Neʓ~c^ۛ2#*Rd{T:՗bl)g87!e>ȇ!ٞ:8l -411v /͸ `+H ϋ^:XfAo-'I)EL@벌~vm7[19/f5z9 O FzgjOkK=D>ZOXo;W1x|Cc8Zxc|uً1p,]ТB֫#p!^m5m{V&n^x"m/)T>ЗG_Q9&!A>1bplXl= !8BHsA9ܹBsEX Spe9υSASv|7%ZZz=h րܙ$u=}\nOkx׎WOYLG0lkßu N`#n(ro'w Јu׭E[Y|kr1pԺHg"s&zgȔ"[1tsO̞Som5qWEG;t+R)J|6A ^16T-SJ@VQWUxU ?D0KFD<~6XǓ∧,"Jd݆~=5YېQJ þS\ BX8Q,^n+ oː[cwwu^F_|t{AE ~;;CLqr70~+x>}p 総'g'hD hb=%4 $RtͨjUS 6Z!m [C<җz!HRn{*' <Ъ*}5]^g{j5M8YzLw͠{2Т[۱Y>#ό ۪'i)PU Y4/\&c|}ҟ6 v?WBM1=[O[1K*9[Nl!'UrJ Ƈ@ݩ8<" c^TSmsNcjƁTe氍h{]96\[Fݝi2aoKQHkAn'IZLuyT>wSm73M/گ8<Ҩ]ϛF5USU B\EwL+y hΨ{.n\=o۱֝{#vTlRC2@2@ rI3AV}}3{5e,X{`u4AE6TJ2kXV<6(`gI53'q#t-'0Di Z=M!dKX¿L_7giXo+v,Pn̨+,K,$rw.\hHE/ҫTC8F>y,07Zu]IXcy@jVFx&CY $zL&2p,Qó=Tr4q %me2{=?`>jKm>1Nf~~ΗoH1fǨ?\,1.ɭs5{> ’@XQE]]8Ihl`hDg78mSΘa"t] ixQN)`fr[naO: eyFNIˣ3 xS#|^c PouEH9T58  򯸕0>T\3$`n+RblSЂS;#y/ݦ婓Q!IS>#bMx3P\@z@垀ptaDo3Wt`Τj/.)2-tqol~Do1 ɻ6 JR3U^ HJW)C [&עq&fq[+R ʇ=O%#8*0P#h %D"`" $1լa0D$MhT15 H$dH1H ~cPޣ*koG,SX=Dg溂Jz QIix7:042Up$!43faN}=߇]c1(r͖D㓙=:OARBB|< s+ o;fuy<_ OB o9yb!?G}1gPdҾyƕcB5߻9GϦ;a^jB"ϧQ!4F$O+NQ ĭ׼6ILCJ40O?+ W:9 cU-.~# {`PH>ճE27LhXk[V%>ozBdQ~Jq@;,%T!sH+JqmQnvҵ ־FVOIG~yT\.bBy}x p)mb-潡mI|"KO sYҒ Q/YpSx.bGa;?C!xYC O$2Vd&aG ,@Sh R4& "8TG^bd!J8f>`md 5qhc~qheHjdJ;85.b=!n #HۄxqHA76,8PC%jb\QҙCo+ 7ZQDJ0zSh V5^nt5;Ad6*@+ 0ۿp>%7O)5@׻8vA"-blj! ,Iw0a2¸9$ c@@l/4נf !pvyzQY 8It9]&<A"c7*z%D$``cO"*FQ-EƌDʃp  eV7xC, ӋFaĎ9q8<`)8]&Ȧ.fx9,!]$|?1'_܇ʎ.>v ;5ۡH'{s?=_*t(ݛ)nvzFB|@ ' ~[|d1tI\j"/|&ϘeAV3Cp7 ;z4n Xnqe[ hxtr`64|<]}^ *f*r='aͷ9P[Ddaiן <rUTs`Dֶn{`$<5];_:ɪ;rq뛀3c[kj^ O6<:8$xLSJJCWHКuGB53Zzz!P&R,ň iNU#ti_4jo'8 UURNXҋk#BK_nm2i]7ZaЈkc_((a{کϋۉVۛMKo1h>tj.u#Tˣkko.VZ= [[<E&{vF"hC6>/L&0lCT0JB߻-}+M*J!'fL~3yBjpƍ8\oWQs_.^ZPa B:˴*= >"TuJToUXi ;yS zCHFZt @@L}6*MGMǹ.Rsֱ]%=o3t͟^T?Wo"6x^ѫce5cqʿn6MB|)p[=n+|^[]ES(f 멇_b "Pzgvj㳾f] 5~Pe0~si tg:n@glIE< t4$7S^YzkJkD;eGH `/~Qx !rOPG;p$ D Sa=&&_{~{֎qq>2˱u"d3Ao24mi[SE|нn"_cMj%m}-Tƌe_#M~ut,SjLEߐ\ h۲ ,=^MOD}>3eۙ54#I0uS2r0I_R\#:|&O%@Ssu]uy웞FR>TR%PSs95L-f_aGAެQpj')]zbh|^Wj"~݉SD6j}P@hMiUM,aE&/]M"{:<&xZQ$wx?K``'.t\=UCSz K@R1PQ?* *)5)? qvÞsOON)S_l֕OvkpTuPUNIlD؍ ]7m[ѧ~btE 11ӹDwͪ,b!6#fs7|]fԙ/]|;7uXxVHQM~O6NZ{YTV?z=?{n~Q*Vs7̫>l_??ӕ2aS^GӎR-h䦥 tYH78֣D6Noq5YxCԖ+Ng606\%f*PQM7Fj>E oKH lSaQ>]:+M)U'* )[0EQ>-eCިa1A\ g_q!$ C@WGk^1v!@+ * 䕵Ń[,Š=ͽ,!t$tޗL2 x-Z.Z,UlaE=f!Rļ".3WbdJ+;֊7`+MhUAo-3oI/[.iL(Rw@Z9&b.hN e_^)`zrōuΟ냙l1!\n%|OkF(}|1_Ulob#b*92"GvOocDSM1/3gkZȩg5!84O]V zz8{|n(lj}[qܳ;k+ȵS:r\iVfz>T QxL#)H&k|ų Y ?َ`{ؾWC),rd[ U)Г5 ZZ * kdCwtM%BǶN ђyu~ΪS{U" _,nUز```)LU^ojEZuaٛaOc cY%&gafwls#)TAZ!tYGUG^̴<G3Ρ;^ =S @-\'bkRS(_"͆9lQªI~Xpq2æ4Kͺ$/< ҊJ*"AM S=݌럛6Ϩq儢 c33J@HTJvgP/dD킼'{JzTS(_2[g4w W\]>n{C+J@X*)߄zudžo#' e"c*b@ْ+@aNK׶W!Q]J3vA"`VT9 FlhFh!MJ;"KDŽs:l=Yj晌Q-uQ7~E͍K`܆#oxglEmeDS5b$CE nߗnpeҶBg?_%K^"? ϝ9WDu_(ּͷ;_<OlRwnhjJiC(#eQJ7W>zXn7[Ah@C%4?qI\v7y6=1ܣ!+9%*g T aZ T#' 0%PR v, !a S&n3rNjgfϖf7??Ζ`q+Qo yfUrrgPaâ8"3.zY.zO.6FknG=:0^;dѶUbgڦt(4<T9sT!@_ҧ4 {5QSOV '3DG2e)YFXIN!7`$J}8t%(H/j$ d+P2:NPjޚR*fiS#74'UW)) 9Vk\~${;AB_dQMH-ПĄ#ŢL򃌡<Uw<iul;Zl=]Ќc_,+BAqrS y:=F^2ltp'˰[}/̫|̀΄g"iiyOF/5gtigYMK՚|v?Jۿ{u ^Qg~QD᧏?NqI_ц?vqEd_l+y|YlapyY B{~y >3A&!!6~Fk IX0*Fk4TTJ{Rj`}5/\=$:{m~60~N:fB,Ϋ亅qC("JkfwfgYzi}VzrzޮD5Ru~99*$^ Xz`ԳŴFbk&CyxEWot y~1xHjP)3^@I4*{>({/Cr*JSӄLx9 _xhHx_'?sS QLcCh<_z!8O껡sM_Ӆٞ"3sKc)HXuXFPgئq'ZHv;D9leXz3}62TE20|shJ۶\ Vf~wKT+=: TAk.Ȃ ?ᮌ[--Ruk9:u:/)&WBg#9" .@Me/ΪW:۶LtUoWzmz-miלtkN_7c?eٗ;p( /xݽ45Oaֳ_ȒrmxeT_uw g*&-̓*oE `=V*xlخ:[8Z!dN̡K3Uw2r 4[ABHSqG#?Vk8$ggu蹑hk_~3-e:K!}͹L83Pڨ5l-ꕒSIB'B ݿn!2k:<4O_C_3\u`aѵACJ*fEyɮi‡*Qٴ3ѣfjjl,k致 '1tӺMDOoGt(_ʽUnʬR5jj HCHIU2u XL_ >1I*xcS U9n%5]M9uaP_va*DXȘnCpRj~*AHbS EOl _1dL>X=^hi2픤m\-ieNE(,o5rEd"Hh5Z3bA {y^h|O`ew9f:n?IC5|UMLHMIsy~ G^̨ );'3{LUG,baN2Pd嗦+Ws߸΃ rKAX L!~`)}ЉuYd3 هIh w,cJ(xݎoRa3 ~m X|W> OZ]:9B bKbjOw6_frOkoЂUG9LIv@P9۽ݦM19E/4H |@wxCG{HlJw`8[ $"y=W!QiزV׵)`lx;%^Qnի`{R6dLvzJl dAE!zzr\暺&[7i{M>;g)c:G?Vo?r^d&*X񹇹Wo\݄?{;b"ݕP!"zs*7% "R7\KT:ȼFyG4PTԋdF]5fY7Gvˊ 5Wu`OAX; 0VU33d:vNu =K{t[e\mҭ2ҩN+C,GU\HS nde~F{ %Q4 ?>J(1ǎEQHF0L+_7UUUH[B)3ftPS⵷;pkS.lX3.lC_GYӟnUmnZS̰yF6#"vWNN{kJK.gƿZ6o] `cB3co$Lvzi*ɬEZ]yQ^;UyП3v{[2&烑<}*1Tz绔zPz-8j.ŀ߸%+2f0TCfX"/lt/GX;E@˪VhLܙ `4ǫ5pȑ=tt_zk$DQ~C<<[x \d[Dm:WԄ" Q<6"b!E =ǿ|{{kx,@'o-OY3472I;O2P\ډeVMJrhGc@#a/<{\=1RXi MTzNœx*́tQ&QMu59t2g淌[g#zL"_O&#*>9.oWJ˄|A⏒kϏ"""#Uu_KÍm?7hT|b&-gUkXU9yTfJ&>,s*d̈́ԑIFt3SNŏi{3{wdῲ__q0MRZgm'P̕5WM8N(1[N}'ɾ-?Es1w芨 /w]ߩM6@gmLB+Sy\vz3DEy6?WQk7:cpO`g~+椂5f֪rg6aLg^H譠V ZKok~g" E DJҠkӣ>קBOq_IznP"R=*a^F٨j\"Vf[dUft`S5JT45o#*KisFknvjh"uM(,nJ:fekf :Z=22"m:1ǼA4H2rț"&y1W0Gx~S[5}xI5/B7B0(WR_TAJ M25Ma8@K;U ?-i n 쾽|`g̬(2= v3K6`r$q?K򇿲?q$_om ϓY1$"6pގN㕪2-V/fO9hdem9'9, ^33333̩|+n6Ăk Wz}Vn3h7M^QP^<'Z><ЋCs`ȥW1!+#Qʉy5 &{n٩[mM™i.O\Es",]T|艿N Hkm˳_ ܦ҅||RiVMجbShKU$c<"5:8MJzhO?d3f"y-e1k5ZoSWC=klLՂK}iњz+c&J>ffM1;~V][&+'t9y7՚D 5nER[[ ƞrNz<tk|&\:artafȈ"B6}HTtoTɢ8`K(GL#%z_Gy4*汇 )ri݋ D ֺiOncŚ{aKݲ-\a Aw>AR˧b+LE3CuMuR ICߡ,=HFgl<):$ K;e_K D_ 4h~}eSN`v{gz߭ 3nlkgn;[1 Ӣ>u)Mf^1iVbțxO6:Cx~ymQtU'(Frʝ+ZKLcp(4PHBg]|VfuS{]$Ze/6(ɵ0~Ι˼J|_Z|xm+60he*{͜nQC7[3_jCA6S$sn3g۳%KnJ3~v%m|uOrxZM-No"B}"eD k.mzzN.WS,2A"iuȧpO B->=}a6Cj}s탣]B10Dc\eS<#ᰙI('Χ#ʚUE a]M[ftu[B"df&9Ly}&Ma ^"ðѫGnĘA N6pӯHa)qUCke=wſdaZ0xuar =jn psiUgu6CF4~Z)'W1^dnpDkm,s/N(des:ZcZ4 *hoc]x宨)d?蘎>-fkERS>|Q\*+2 鼱)2L~ _TvDžĝtKGQCՏ˕Ax #/6ˍWf|Wu׿qɟSv e ovö0&Gr0|,I'U!6JZa[<)jv? %L)g'zbM粂^E)_iѬrHW}>IZrYÂn`~Dnjպ+3͹a .`0Gὶ:lnT'WS#an8眤v<0J t`E#jtFLs|A#s(э6un1(ʼG88Vx s\,.J&}(c~=>%T n3QD:dVTQ[[Su# Y ԩ)ü9&Y´o)(˳6Hb`s2v&#qSl:kj^[ ,vV)I!HZz}#kHLJZR_bhVotQF/`t=E{T^IǎCX#=1\=l%kU&)^HGc.<]F[M uj};IEvahZAtJ- Cg[6P$}\^[I缇NHQؐ3Ѳj=i[Twgj3Zam3|xc3߂4xYD2[",>] Խw{<ݎ<-U9AM̏.9nu4E% P?\|QOa9LJRʓ۲ɚŻ8fp5L2">qGT2G+?+f=ݭu AV[|&q ja?x\n{y֤usmG;߯|~UStf' S,ϕVs^Q+3cLmF^e]4ËWS5=c?RʨFrhȍ*X Y%Lg;u,q3ҁRZ9^աƥ,y~*Xuu ax37%2(yϯqBb8b*qQ[ߓ l94˩YW NӧJETٛ2[N;i^0Nf*LzrUKYBNPܣכU~#Fu)|%MN:CpG҂~%GT}iX9s#rܠ\ҺJuڶ?y9ΫC+GQEO.T C eCNDTc!IJJŅ;ŐOၛ^o:Û8RB#dmxQw .iѕ5 2#Gy5K+MƯ ;X5 $/f"4O19Mu\h3޵XΗxߴە·RV{I4$w96VQUzl\eċvA?1eÛoOv=Wln&bL 'Ҍs Hʴ|$΄_;zʛۧ¾B5=/Dڧ\DiH|=evJa9i44zJҚX^g4Zʛf&Խr=z滊z翉ih`-m[i9lj KM֧M :,'j_ l0c&[~&t6#Zrb8Q[.CAJF^ݦ&g3.ԸP#z>;+2N@إ>`z,{EdT QwN+Ggy)Иt]qVgSsU20ho5u Bp*P{J 0^rA&4qx& {wo`(!9q'CR8TC'!( ,^M ! JV4f8I=Txxk߫ pאr2ʅಃvH+Q M '!H2hm֞ CD.%#Yo@& *F`K~)Y Gr.qS-H""`"$_V;@D"C/N=bP~!soQ UQL)xIGx!lˏ Q^ۅt#Tq%rls^$Pf'mo$,'\۠h.7tx_-U>H{b~HH QO"J"\S?7$#G?WUа'#uJ'y^sԏ|}73="na>31 jiZ 8Mi}b@D)ܬ\sdf Y諟 Y(/KP$S=%1!& &Zyyl^lsz " Ҡ3wr\Eo'ty9ϦꉲlF31pb f74㱴eEYϐ)PQ/jĢߥTc[CJ?*lr'aq7՘~|Dx0@rD0//"y[0G17=}J!35 Hnm\sӝ^ T-H7a# X?ڄq?MCvةtCj(oym=rT y0-aA5w.jeho]B"eۻ`2P{hM/pȫ098cAb{Y .=ܬ~f$$yĠ^ A|];v.q:zHpEPz{Iz{; 9S;{@x91tE |@ 0/Z0xfb SPᶂ KG{"$v & Tv 5K!Y1/|P+,NsZy$. a.liI[a@-ݢbT>Luy0c#78 uUTky9~ [BMP.~ EٟT"c1g̃"0Q?K n~ srIhM٧!ucF%Gf: B;ad&-T5AIAIAIAACTM$\ah  J"r\ HpCm%V%+UTUUUUUUUUPUUTMU%U]ǧ}>E ;QI~l ңa$CM?. VrCpK2:W"@!њ@t{ɑD QA->n(c .',wt<_.;R C!u^C <&!!|y}ʜ?& bτI*S0A S2UUVӄ"'zw?;MPUCH.G>: "((<+v⪠G_F1險˨ G#F(ZCkKJaOjѷJ,dDQwg~74 _~` =_fۓE?  6I ݝѬAa⇋G!OM\\~_ϴKW O~K*R~x" ACzsɶ9_a>[sIꐌhr wൺ!^~$oH0>(Pbh0q;V!ȉ)r琤9ː ~Nٱ׷Z!1Q6?^a&hҒ`G':dPQ9BdKx4CM [ޏV_Ľc5|V>q~p]Ŵ[ #KQ#uI;Nw܅P2 s!br2o|$ FAI .f aW [ L8:Z0:w#J!=Ё"O=}<[y#k>T= cfXЧc#Grsod8W !~Kep9͎_O䰙Z X´`LgCp}f}Sn n80KFL0ab7ٹaMrCe;I@T!F:7׍,"ʃ{3QHl9*C u&Å"hNQBX0]X~[s%uk}uZ:CWsp鿣]CH?" QQ}fnZ١xǰt7$b*2Jӝ'ˁz_=т+Bh!x cW6x8XŒ6-.0-S-, Yj*_/Xì?AG~ f(|1&?PT}PQF!힋,h[)l-tI! 9z-T='X78z ʼnl.Z7%uoMSś4 9-E?1<4a$?޲R7cc$YkKRL6"W07M22?0D_"R~|7@xO ٰɨn}HShz=! ZE@(ѭs60,5"C#,<4~i鍝E483CCOL P#~b:TC`]}=_8_V,i JH[.UFy都(\1]t 4N 䎉# ca pP_g6 =,3P"DLL*cې:mpe"ڂ`ϊ7MIBC*l: JCT: 4.:#qtRhH}^?\'B`" doDTzz -QRxv7ܴG0VGjHJMGMڄL&dPc%9;20YTc/j'>I (:H8cG_??h¿ˆXӁd?/.zauhm![o\ue9-aޙa I`~|("#lxy6t9lO;P>> _maes^q{O/O 6d)6haB6j!8!Ž,a"Afb a?fVVUH#q< ?k)ig&>Հ!$HCmpn中y t6Ӱp8iH M) o!\2d8BA VGUnrVl[ì"5n!bVL$3؀ ?o_7YeW],(mimmmmm"'E7MV~QLeammmQMmmLeQMmmSE1eE4Sme[)JTM1eE4Se[mFV[eeE4SmFVmSE6meE4RgQMmmQͻ6 u$ u䏯CD)z"o]r@UCrh& K]h;iDl)BPQf:]^y,%I!(nvo4:'hNS yX1"[ %(aYa! r06(J)K rWA@s{S (i.`@.,h #cDNx`pQ 8*q p>)(i$7o)3P{Jxv !Ժ>%TMDy#*&*+z(flTPSPjc!6BSLv9R+Ç!9í/P1xWEH3< @EJP]Q$_GBF́I<؆'bWza!kD0!Լ  s4Y.9T9u%ToroddXIEa_YP?_0_"<%$>!VK+9A6m܌FcߡM:Tqb;*KdA`nD;L&V.! QIjwݛ9Q6J" NE-Ygey"u<#Fh)x"дxyQ  tD~އHdXyo膭9 :6THm҆\Q鐴:C&`8=N3Pv(iLAkDxF]}N2ᏻ{~oF1fqF&#8C:%ms&"%N#@ 3o ,&B\DPs=A܂댄Ժ|Nf/хČR7SS=ٟ܄ r>􈎆~B a%TNa}{?ꓤRD_ᲝM *y=+;4;æDlB`T}4|B:@p!݂CT!cj`q\~(k_f}'ʪJT6 J]0r~w5 gLw݌Ɇl4aWy%;/T~KJ<}fGx8xp@ Z9!zKRDݽ^ !ؑ!P(9,40!RoNM9 CăxWQM i F찑쭶 h$/ ; za^`w|L!GC;;(Z|d(e+2&{$: vP!Ɗ@;Poަ&a Y}as~ Y֐ "rJ( Ib[ ..P @o' ״C*B^ç䞢x$R 6\$U$a@.Ei9ؘ7g-;:@ Bp҄0aEfwt )W 6p0u1cRba(a,JZPݭQX߈~P< )hgۨ ΅<Q XL:czDShA LD5ɠA;}>'j45iM;$P(z%&rtIіx(S(7J^||CfY!cKn/y˒ Rd.!_cQv96+ V/wxOF~BW=TM:8~Z!P5i3}& 4"mL5opǖ:qσ~tI Pv vs8N{W* Aa`L,Gy|L"[uDC2'lgi&ks>hp a-!RϸD&z{ !Oz?xXr9!S#>] I_Ox['(s/qQSŒMP>H'D݄L{Nxa!y7vzq\@uMP.1e$b.% .Ctf廪ZG*U==ry$PF V GA, e`Q6#GǪ ?\QE3&y9O$}>9:$,1Hj;fiC}Z6M v$E@1CqZܺ&`4[H߬AAJW(9 :ÐۙBP[FS,iټ?Ta2mG'$;D? >$f*]rzxpa^`\DG?Z}-BioD0HpV:~%cY΂n TU_MD UW!`{哻P|Py$`0 "S-:|{1׊΂gjqxG/뷔.FI2_8cY0D@1C:imTq/d}п8_7۪Uɓ{9`ٸaN7aMC}F0+̔,FnL1fM 1B@@cM]wNLNNz7N\U#}ź6G /_͹\ `FԡQݪoY*h.`( 7e`?! ~vg"Ԡ@9dHuE\#H%ΡH3d _,ѽXeP!k7z6;жYw!POf6"t ))"M)Moۋ|P]6<~W4 kaA xY^DB o Q;KE(ZOwv!rqh=dKȪb@{I|A#.,'Ht]P:8Hu=~N:@d#<0<$  &l)9H)D)rat)R`MFlC:});q(&ZDD\JbC|iOn+6t@|kf+d LRrD?uIV1U$"\w*=n *qX}p9V9=VPBCߌoKAnSω/-E_Rx Z!QS467%o2/=/#dnA&Y/P0_RZPB"*=onԼ\½G7nc QtB\vd6ԗ: -GZ๛MB k;) Go㲹08l?}GDF GYAXA5/g4֏p}š :7}ĂD6(Fal>S+0ٌT U.7}O4Az,41F݁̾.d>σbFH1A Zg]L@a$,:rǴfhh: QH GPj(tZ׻ ܪ3龸-l!xMnʠKx>mV|M$<@U:ҒRCů= 'Ұ!ymw`9l L1l `Ao,1_& yi63 Li rCܣ < s "fS7*fՙO Hv]JD*$Ah1ɮ3v:1!}, &^{ b8Q݆e}?^_)Fyλ$+_̄58R[^""c~d?7ORY)Fow _gphݕ ;iv5$\J Dy[-r(~LÏ 7|gHX"q՟ͨfwsAvǭ>_7Qۥ4Nʪs*8-;c:+C~?QԔZFÏlG9XtdLih9./ְ>~V8x8Yg> r_,g?n(R3Q_zMS5ՙ,Z 2jU,u8~Բ<ǹsON[/Q6c#=2&0"6 RY!ig7źO7Սgs6kLA4*>8NV}S{B&K^!]|%0!_pܰv'/P\Nvi1 $=O ؘc׫/b֨=P⢋y,vԯ4/0*__zϔNur.{楰^D4LR,jTLۥKf|3x\Ȓ=GKGV7obu*ǹߒ7X)-EZTӬ%mcr |Pn3h5r^zfuo̮HnAWk^##*V$d<,6ʖmǕ{]Kk& &6NƙQ}1[N]HyNTxka鿛7YL%T8ӄ.hqL.wHrKwTjr?sТ7CӺE4 Dh4-b1;fhWv5< $OGBEt#0E;|=au=ee{Ǟ<#U6;huo|bᄶ6?D!$ !2"ܹM8t=ݯv3>!z #a{x~Tc6=8û$_<ߴ_/o'&B ]!;0&[u>ҪY$r0~ q3^iSՓhkDB 63vKNW04vdcVHI]8虣Fihgw:4&w[Y.LU$4]kN)De4(?BʌkaGSу*T72F@͸6+bS?bX -t٩݄S`: 9_L)!!,P4C ,IA!{Ÿ|fyp %VŽk*q lˎk|Ȅƙ P":hŷ5LOU5U<WUUuEktI,=1v;z@&Tr\D87 =L5 Hy?ҴjȾB*R G%6n$^l/$m&]ϤC2RsxsNQ0۷TZG&̗@DS,Exv={@$WY' A)EM<'UP-Mz7" ^0>1d7klP1*9dyeH3ȦQh)j<lfm9rGډ"ݣi-tNe=Ct`́s%H^ԉ׻ۻ}HBo Ȟ,:n1ʈYÞJq;"3p!"CL͙ $HcҦ#'|0NeVJ52VZRS/rOF"Z(Ia&/;ÐIrH@0 nGA&" čRk=*e*ԙr툛jbmq4" \ { aQud|ŝ8`.ѷE/kr~sHDb4 [iT )"TF6q#Q/?@@2l2h=# f  \;͗1F\65Hq]"VA4,"@Y3lkIz@q~jL'9 "o\wXCѼ6w:3%IKFN7 /5__B`yP~rw"ƽ\5㩨py 6ys x DWV%19&C?ݓV'c64ݛ&& C !)0w{s4zāo9.Gz6j -%>/s͇'C-JeS0CNp)csg]m&}Ft$0!Ihf2T"hWH(L !2SM6 ЩdL}K6CQ 8 4.{]5C $D`}I"эƏE$¡CCJ bba5BTG$}nw 1;pd"d,oNysͣtvBI xGHrCw'Jw{''MD[&mH& 3aOZɟ3`fǸɌyhhaZA9EkxC(vLMoeM,bp-[ O5M$"e5043dqo1 )&8EEV59l sqNVYjp7j!b;!P[[@t7^IF98_*1-}$34raLl Ը&+ fBBt a^6Lh|=(j㻫xo'OBHR)b""";>)J=f榨 8uTo ;=M{Yqܷr!0 { #F!@i1!teQF^ BMlcR!Ao,dЍ.!pvfD\4X@4ϛéڰ\'NKujYQxH ԣ&"!@v `|MRCԀi>]AD$HLv tC X'<Gқ<eڙ3B\t.ݧ851t5YפUV / b&ië"EOIתTQ=4 (Qim;h0٩Hi#=GBr=$6î0Sv,}aUF&ɏ02o`P"BF&v!.ۚj7/"|gYѾkQaI)njkO]\LV3:%F/_6kk~X0$#Ѡ1=M}W nABQF%D/i߷% {Yݾv !s&d'd@47 bUۨkCD,!-CDYd|-os ٣[K]۪m:(h8R2 ;!Kbڴ"Ii 8w7 !}y6t %wow!.Er0&RՅ]=4M (hr ͎ lfE>6#cn&EE3nȟ,VÃTvIg(.1D:`|I]GzE-Qwwl`#|PڮV7^I$C=^3}x乕BH5R.ƉG[ EѬdȺ!9IU7LGA7IvɆcqu16Ofy2AzyDƉ`(5+ fg-sxd H&CtC7 "2!#6 7 Gy H`I$! ,1[@hcIٯ\Ӷk(<\]:ucYiBf2Tp !eLKy "F UXh `@.yDUO.L4:4wyl=>P "bJ&N UGU.c``"1D{挣 *.=:1HumrES"l罡g3IA6КaݗV^B<7"xq&0n{۠oM ^KNB4 ^CN^=_'aFIj<@ڗFۄFtNM^3U-C{GHr!$d$D8Ѽ6!&ͫb Z<ӯ߃Vj)VǷoa-fkk۪V1N Mb)QP `&9wI@w84옂,#,Z%5Gɡ{]g ~1܈w6ǛX~_i_/<&&yl$0lGEFA.ؾXș$5 Qos5L <.^}؅OQ)g/TJxiRS*x Ogm2@} !!q}l{teh@}]'HmHb,[L"{뎿Vہe@7E8/QC&o=b h!hQ!o&G# SoK]'Ǻ=W|vLy>Yx Bqh(= Zni84fHtӊ QGR"z"b^]|E@ `Q,`uqt%a̹%ɶG2.~{Sd_|LR9,|VoqCq<>KX WDά]5ǽbx>˄b\44ǝ(=cK=IgBHJ"h**P"PQEEUB:y]eJ)ȵUfhh sy!@F2a,vӖ5lϿfnaԀk Av 19C~>|TQ^7?s`P|^ f nTƘe勉" Q(/zQLˆ(+^ȧ(y?yo.r68(rS fE?>5 i^!H2(ll"q_t Bme|~B=#J6,WGQI(wOo'?T- A?'(Z3YH8`Hft:kv۲Q)FhCFk?]`bfid6RW?Y,N2' z/nGr LAUlub쎬FmkѮjdOTv.Ղ>)ZY M@'d}&:#>f0!-$щ H Da:]4WaJ($r@ۻyy&p!a`=P` J5H}b(`ŁCRl2aF73lţ[s H˸BBfBB0Bs\@CҬ@- U.Ȱ2ԗ?t\1ȩ|)9 ڄ {&iE"* ׳ 2,U6B6F%" g{p qd< 7[tsB"no^І]DuiZfFL,f`;rb)OI29־Λp 3MX(Ak;;şa{3v,"h jB-aw)9grfJkvbciAx%riQб)w1c˩[~G#ABYdIƚuy\9fd QO(x 4yiD̐+P& 11l$fdSf_2<$I{>O;>vgRWqRE~,Z.r9?:j>6I>ٻ&8]E5Ղdk].ux;524E2aWF?eU'<l="q`Pxt!9xvE.dit/OlځfF9 "Ùl?{CH0%!Ʀ%( II{WSU)cāqR??,a̔'2`ݭ{({V [G>bD Zݯü%T^l P㚔,O.X|ZQcq==dX! .;(9ت3}E'J[-933"2 MPw1ISGu.>Y\@/x"l2$0\Ձk1',2fV )"@JR$BR %)()ZB!"dI*f)d PJB!LӉJp_8J,>Ohyor3 뻹sY`Rx9OG\t a!˻☄)E&)d{j0X(2[ql4rrPDU0/ndͦo\0B31Nr SD%(g`9 ZS )w` 8&( *11ܝHP vA > ;QH:B6r_3"Pۣ ];$!bF_o??$>'m$IO^D; Y{%ŕiAQ R@Sߋk 5UKQWч^|@œS=]6aя;ABP#+ JD@K@ЃGOLP#T3$I7#呦C?7{IQK26-#|tx1 UX&IC, )d1B =RsYA<\'i;YeD1luu)\|5ݓvYQ ![o eykNmyaPF@1u<\CkNхE0 5DSS 34wuБҭXi<o-?# C6 e(X B?~V߁7ɧ?VP`Mz}sθ!BZ T*f|5l&aJ2u*q 0 h~gH`ǝIm@6$#qC8f|םJ?XTFGWn2>}ƈ}4< XDC&"J1r`whY%9 ո.jiTNQh@LiYd%5,ʩ)  d# Q ׂ8L߫NaI3 Dca,~S|;od(O)>4ߡf\g̥c!}^PĈ$Τ(5 M_|;z9Z!@|:; >-b?達LB6ap|OQ?NI\qނ_3w$P[ 9B")M5p?ᶺ%FBY,P8BCRk$SCZ밚krC":3-P@ m9WGEF`1@p왏.ڸ/)f%c5hg  ҳ42!D,e8,єYA D?=lcZI G8F箏_JM8+m\MK0"B<Ry+C|";Äd\tdXFy~#Ĕ/2_Jw) 4xFMS>NTAC.LO`'r'!QJd* OUH?4Mtd8Vhr*Dk#}l,$r+hs7MxiHSaM$AY4},3:iE|/8!֒H'@IjB x - [x `)ɀa̺U! 1**vbOj`DtvYLh]|ѤFQ3<3/+Z%>xaL%&d 6`bl`̖j>S\|P{l56FY6Vcnr!# A!O ,f o oq묟Q~Wqu59瘶6>5E_*!MC6k&*T2x5.Mgu:f`]oo9'q]1c t ?R"L.~p! vu)(""hH\BLB9GgOFTD{X}]pZ;z(cl|3ĸ(%2 9@ʈ%mmu.RĻ "S"l'9d\ ,=(rlz^EzC;xISxs6,IgzM~-' $҇zy`(R5nQ8YAA1\d e /qh[ 2=t (}Ql`y5Ca ;_ԐdՌEú)2CPNi!Mݵ5$9@m4(nRÒH[3bȝfA U% %YzM[娦`5xtE_@yTC+J!wź~Pxx| J Ynu Qv7B|dcCcd%%%'hA iVYHU#L2&籞A6 F 6"ՍETR؜: ##ZzZ _A~<>ۻ>Z!C dX30 5~y(-.TCi+5Gx C3!>öO4 TM0@bL2aG`K|Gc'@i~nۖmܶnYf3e1+X`̘Ҷ-"$0`BG""*}dFURU@o33̬3iV)B((())*XR$UUqF?򞮥u^Lxk#AV~_j3w AIaj!Xi͸ɼ"ķ-DӺYFtĒ iAoyļSUPHaۤ9a$j8%p4JpS\Q  ZN``"tKo z}z9QVP7rCƹ1#laTBV~#qhb15_`HA!X$""JRzyhA#MI7+ iYʊEK,H ٚл"ք" V$ g (d%s4A: !20 41 y&S QћA dnqȘ\  07S炎Gdѯ<M$,ASsd0]I QDt$&/9Z"d!4{];14= GAѬN*{`O9+TFss'T59FhvH.PPi僬9<^]5*SUUYG-!0Y_wM}&z hfjȂH&bF3nI8S2I}")/\;,$P57^D#5>feA(жR;PV d,h)F4j)0,YDD@9b4 0ĨTM"3L45[#Ld$pH86&ۀ!0#[c،P-*d]a Y/l@'qF&oq5&'pmbFwvm  7G+ 9MnLҙUUW=~>WC4Jd= ͗{FeMF:!{]L`0^A =GA9D;"y<4q&{hGf9: G$nvP.n}I!ԁÎjO0ـ֬*&t C=! "c+3ot!:ҝ2 ."n-G>8Bb;׀oA&A04T!0p0b 3%e =E 0\ fұheC-ITCbb$ǩ~SN{\4*9,T* LFN]4ā4`d@' F/=DAzӃk0)}ewv#ܧDAcD`VR9ؙSz:`r.ڦ}=R USK%_=o0^)7BE7 iǨIm3-2lF7ۘq@1W=Xн$>-\ ǧ#L5(i ,00 L  !0"I#]H0,H)I@ȁ$@ dYd0B9FYQbdEHk ӬF`3,t^iċҗqV5ʱ $u;P Tto7@FRHKQ$I;dYJ91%(DۄK –Ymz?d4'#Ԣ< "eZS;G>DvD@T|Q8V0o<'xI|J{ůpš"P>^s!I(X(t}ZבVl}?[Ę4ɨFi&*Co$qiL5)ڸ{i5Ǥt;GGU FTcׂŴ6Hlxt0S`<3B:5Lb,_*8=$#T"&:2Il"BQ7Mt_icz MAYI A+YZ[#dhl(L=3tnt~[mц?\p7J%("bpwچQ%k89)XƲyXHWzOd1'F&)㭡9iso?E2ɩ3$^qHH[^KP0ey'G;LV HA]|g{Qk85n)Qlu:NN˺ALzLKhlb31 tr0Qi.4,Hyp=$]Wqv/rRθv)u=AFBIЍJ 4 :qMLmm )䓏3dZamnX$%,[cM2Ҽיfa\:\R3n(W 0{6֛iDq!&;혧-)ָw[-Ë̚C.Hfg+JɘN, gRarZ c%+ g}l5@ٚ':8DF2H"Ex5 ǦxIy{t ĥDq|Gz2$I`g7(3Ҋ @%""1$4su8)WHnP np3ϊ4w5f40Ýx_N]Ll&m$PBC=zlQk46Rœf S\^ p`yUHF&l6)\j $VKRc#6#cP.-fk(ֺQqK ! Ti"pou 4&7 hq9ckwnf^;Yg./tHFjZw j);] 'Jq)Uwd5WJV*CF"v[l)|ʖg% aWqko„ {kSVh%0I5CAbRƷE.&sp< {:zQ :ug a1@`6 mvӈo.+!x G # 61e#,^G\# e-+H$y~3-AD%8^X""N<,B6~noІ:g[SVȗ]ҙkN[z뮊a@>|>U5MT..ÿmSi=uTG XP ) LV?'hsu[pck 1ڌčoךwx=[i[5xyEhϣ xN \m;YbMsw^HV8; C,Tdo0m{il0]D9{ hT"ӂ^$T(QoM1٫Fͻp^͖Dc衸'q<&a|Dzhʌ}ږU- ?7+jǢ MN}a1 B6>/ 1c[JhOg޷!|C6c=K˼wYkD0<{.rWZ{ZtS"q ~y^}Wp"/RvA R̀z||9eA`! =:} )*bu;ŀ F )&H%iFY)BQ|{' ( +" "m #iA}\vc $0gSM!P*Rd^94D `D`ayw>qK\POn˯.n}`n\!rm8sR3r-"ⰹ\~!DR*ŶR6xvWQSk~(h|=,weQ-}ڑ,,0Ն0Zhܔg  |*ǟl3ϧ,d͆r=3ƍdO ng~/8~^eϹzO:UYrp@%/`~*&gxy(؎ Fl^OC(B=gH#kwaqz\n_h' DB$%EA"(a de?pn?gͣE7|T?Q_b,/o.?>/×? #n?>1vo?? |?U?մG݄~??m)g BdNꭘ@~<_<(㺄6y`oKWex6jHgzu׻FWxZԂo\ BmR&ؔH@) =Hr|/5X9?gF9sD] ;F0C@D ‹}JH8r `(X;Ł06#ВSc%CD J2lCPGuq0#(ߘkaf=ԏu&Y~=8 x"W/HD͐:v6%壖j >(x@YW٫iws˒Lϔ0ܢm| DH4\|'b%t0`" !elibN!B˜ꃅ CNrhnՄckGD3eFU{>ʄ?Jۗ|:Lͬq 1\h2 if&ދ护HF4"`*ŋ Bй봯̶UôDž:: Yݬܑ]Kܹ-Q$;FMAƶ&oQ@y szNkJWj][h@8w53=S gal s4L@CdXgδC,D\7lZKe[3[Vdu"M)ٔqEїZ猓i{tD\8ja}qWEf,.z[1Wł5rrd33 q` 2VKIk8]ݑYb b"{ 2]Y<\:՜ngmp5`׍tw"h:!39pH/Ţ@/}(ߕYm C`AS8((0Kr+ ݮ`<${PLLt#[X 175 mYAtFlձ!0 hX| ukOA/'(\MN`{L ;%ybQ { raJL 6T;0 ȆSM3RiG&虠tOB3Zqj2/u.d۫YYLa)btF^ۗτGbh1Lx4&7Vo/u$|یYs[/H}AQmgMAѴ=,;v JH`9x aXMx8=0 YuaY2Lk]L/+)E5@N4u-s$&˥!L!9YތN:m5,mhC ɸ<7]bRUsbG~tf 4wwik;3$mqê2]ue :QDg@( .0_C^bvya#%5#{ mu^t /Ե%ހ;T ]JOSOD瘈iq_a~Gz`xU7zX}~74Ry lawA9BTwb`|J` ӐB,I7#˅&]&Rru0Gݷ6"@hkC(`bvbMkjFtL8՛63f\B!l&qRvarn`yv]ķMd&*ÍbP4UFt>Њ5oef -k Y8un[nmttN&m::GݍH+E;KGGˢoOba` #8)pr\LƿRV>׷pA]X% úmbD,-Ulܱk*%;L扎M/'rw&ՈJM[q7glٳf83j5zRƄU{7^FSR:/ cHՌL\GYQO[+Q⓱7kt+}Yvx֯n0Ą CCCTU q"g$YowZW{xєi{Q"Ֆ-yN1y* Z6{0 qCnc&g<tNa'=ͲFwaM|FK`#4EB&zhՓFb{X̦xf,fӎ ^k;fa>+ HoaV%=]6W)J1.8˗!N 51 cHkJih+oB8fLTt$nXF|rB8u8>%RƈqRi wa&z ]ҊqJpT! e*(Tb`ɷR+ 411Kfz)= @ɄqaXte;w$ y}t CS[[D Xs(4][Vv'W:Z3fJȻyơZq+,vxf/ 3|G5iA $ LaA!*x00*lyѓ\b#psMFn=]$' w P0kpњ!͐ݰ.m@ jvo.<>HC;&I&fۻOK0G(q#|?2il88njA@ZŮ.VW#+,Wt8,;` wwwwHqV0]H0VCDP(R!P 9>=όkx]m1v:\@? ׼2Yf굒/0Yܳw[|\ko}^IIDs:J=3gsq10b\N߃ H@qzm3N:fLim#,blwr#x d]]]6ݤ9.͙̭,y9($b[(_]̓^4sœAQS mˆGuӫQOq:A=< |LU6׫ 0-cIb_0"`V\aɇie.7I2q\8^ΐXsԨ}dϯl] .~L*. q`1(#DoV4FdmV뼵o]$330Ѯ'mjlV!9ȧ0(z,O䡈&iR-=UY:k86*ڒu[1cghˏ.jѫ NJ06™*΁Dm0DPΕo #f.܏#)<2tJD 4-A6{l l_Zn0B!> bLS(D)(EUF$׳z*ݿ }9+fG)/N'{tS_VTHMUlX^Xq|c J 496fC!L4liK$1=ܓ}2M&kfD=Ȉ!+?a:g͆rF(&dl4"P\3,RB@r/"n.; ^'l3B Sw9&Zj7`8:,0INzq ڙ1ϺNΰa˛ᰋigqOi]Qa!!|oN=6g$!f* &b/Ãj"Lo<ڬ@ֳ 2+8øtiv9%Q@d]bDvv|zPPb)‎\X AgfQ`BC&f&4^QCTH# j=l\0>Sp Wv jP N@6a"/٠CrBBG{63I~gߏ9wl7=B) .cLJ/+ {4 g?zE:bm /V@)e3 2&A, 5pG#fsֵmA]W".JWP@ UO0E(h恑euYAjq':'\vy(v|Yo @jv_d?yPT>ero!4;>Q0}h虆#7M0lØ &8sU2tlT1]p5/`kIm͋ cU cHam /;%ww ibbI:Xʦ0d{f@TOZB]Zs6%NlV]`TjvU B~\(;tLtS307y>!H9LT.]<͟(c P[Q(4Zł&CJif0BSw;"}k#kӋ\d\`uAM@YE?g@ Pl5L(kuPzvI6X^ra*Lk]S!~c8|0P:J9Ͳ+I},*,ħv!ة{oyX`L0g:,5RRQ\JU&woʘ`g|llFZ1f =DKG Bb=A.ySHBS NSDxQzTv!46W뿐O4P(MB!63+`ba" UHBS8G|WN]~~ k.OB!%voZ 9;| HO QGƛ1 p2HD(G@ d}Ox3.\ܮ'<Ё5ALZL`&H3Uh0=ʀw{ _tt'L r?.U:3G#UU^<ߚ"9j'x{DX<|`!\ &{ϘKY8aQV24I߻N2 Hg?8Q4CM4CRE~LӦL)!YHYp"sEJSD\FHU#25(*CG9!GfX>yyHC$YgoRh 3[1 i6:Їݦ <P5yZ ֯*$Bҡ=\ ?1ٱ]9 ;ysf #RD^lej3,wj k*SԀʍHa,2CLθtlїAUzf>34YJܖ݌e0G` %SuD@BE$C0Ma!,HddHC)8$֍"44QAY0)' ՜zc 14̇PxLIh,H1U)%zةL<*ЫAfRb iqetp_EŰxC :jfl^wnYq`Fp !jJ`A$𝆷K U jG؈唩L`D8Q=/6f5)/)T PX5 )=}+0%NlO! ITQ 6| T$bjI1 -~^V};Y'@~I6y'!Σ`j&zS4=3!(ivGz>\~bR)u "(<4kp{Q- P%4t\mx Au a 50'nV6ARAF\b P6\`b8o7mLEp& j`p(IM5i BـJ ^uh. [ )RaVy"`cOr>S$ ; 6?GNWyi&sF-Ϭ5 B(">R"nYujda.e! X[$32[c9M@Ыg\5P6s(@\v84!'L@M4OkMR`AQ~| ?U[eT+q}Oإ !NJOԺjcHw3&i0Yn/gݳ,)m8Rs<6H{)^I}gձ&,Lwxp9ll0l d[OĽ!90~ tlش'MH9)`.w`JT7[`'פ:!uK||1"!@`Iߒ/32RIP&bguřUO0]9ͺ0;4;:Kg5=HHn, Mi(ÈEu!ʁ;tK7&偡.D2NhL+/LF;k @;']?V< KA6["V"+H.=gfy8z)f;f3D;X8^P]&q:\0J .րM"2"~~tq*PܩzMR$=%ې|x="e v' P5{0>rFe(R86֍ϿWID\' (*2B10q&1zu]C'!A mh:N45Jqr{qI3\lA䃾`J>R!s,J cfԗ=dp?2]ˑ,c򅵘&sԒ3^6,둝&R_LDb'+TŐHH." )h$щ*H #T'A wۮE/cdUNit0_PYȤٲCҨuOwkc))0lEeiA7ܗ"J#bQfD#lNJ@Ga}_(:0X\эUעq.b'(Wmg\Y_E(ޫ7--a96{8YJz-;+P$n(Ha$dS=lt:6h2m93qw32`N': mt+Cm$uEeˡZb [ q 0އU O>O=+#utȝ.GS{{zu[2)_}RʰXw&jC$ #Or)J,2$c#&sX1ЏiX&DIW\2d1f4Az2n`Pl$ 0#cnLDƢheIJb {*u$U}L8:+bآ"Rb C086Kr6=edaO\ssKG;RǙ PtXL` 4Ph"!+&`n9僳Gzh-*e08z4 x,ok pbbzkO_hD#DbJRck 5i68bHS|b亦Y0Xӭtn;!9af 4Dbj1(@VA&_ܡx/NNdba n1!"S4A9Ō˖8U҉~džQw@m  {}^PGiy&;78q Υp[Z[hDQ.u$S18BaBFIAay[%C q9 9 8 8.X(tzi1Wz5@m4ϵ$(?;sDr>,gr'*EB4{6AT)  \;L9V'; 0 Dq%' HHz!Ԉ!!$36gX?F&Zx0}9&OA9g\>,rɱarۖ@}"c2ˠfj@/~&f"&EP.Q$SG i:2> GTN:J^MՆ(٤Ε1 5أ6H8 *GˆFmؓ8@'frk E!5.F4j12%bnDJ5bGC58J(.EdDfPUQBҔDf9Vcuk;{soҊ ""4HDfI8d46P܇+V($zp`8޲fIo醣TC Pݿз?}ۙvW$ M:nv`i CDA@F\ u׎ٲ@ ܥ<; 8GC3;=(uñ~"~-~U?~TXO='7mv74upcM/SңŏFXP(j‡m{"k#ooc{aV0nHA$dxfb!}4 m X$7%Cix~f-J`G@Wc;HiƖˬaѼޔ$- C @xQo!*}Ûd >-HQB >Aw\ *C? ȩ}Ƿ߶+X9TPKn=$KWW\^=ׄ i"brl{aV$n剶ѩK,>dAW[ }&{/yeLY9TTU LTQPPQR{ú(sBṵTt僣ѹUDknF0u.ZI^@W;-g2DلyA&}LM6n#SfzߑfD߄|N[] L<2=F-9Dwڋ|5Ftu$۰'BHM: F ne--#̌ {fd`XQ%tˣWu& 0ܕЄ[2VmHE@tn)3 >Ǣ4;*=eBF E:?憐qf";_COsU>o͛7a"~RF(=R pou CHh6w4~>i5yZԛL p1+rhɆHiY(5iE@k̦dcn卸L7E:fd^5q&a QZpF3a(CS<4mm a3"uy,"wmJ*%g4yh\(Tiޢ* Zdkd҄DŽFc>G|{!lAq6 3pj+/$&sgA#nb̙`$ǒp-OLۃ#qoNI tӝPToC1؞r1pN{MYn7#26-PO(Dy뎝C'Rou= 5gF~-09WA>d;"O6TAOQ 9^ ަ"RMp449{P#AJ@{>bw֌ J6FI \0S**2?Cs?c̞jI@E Gp]*GsBc-C8Ed>kx"fDM<.RvHI~$ LȀ7~ sEG2$0* !CVm ^*m4˫9m-KxX˼PtyS5N@P)t8jwPvJXHBQj'- J ]w7$N(e)RD0`!sR NwF]Z00q |~aG lG 1ڝ T,VF6XI2bW1gtߝ7 'Ri{|Y0]2>g;xрlp}JÍmf p3hWXd]$66sJ,0Tz^nDex%$wK`Ms{6Ԑm UJj?&ׄc\Џ|ݝ]&<xWKD{dxߦ'}fߋA,rF.8"߼Cv7 )KvQ3$b4PZ5bf|l | 6f{w1)qDTgWqBu, (rO)9j ns4 :{`B304MaTdSHR'&0m buk֤SR*kzQ$0 >pH茕}O$>!0EEz6V~O0uZ1R3&h |BpIX aCdWL:4>F@b]'g3YI ed ˮV?xGvrx9m!D&E- |%DF* ;$Z8PM. )6 9t&ML#27l!"3=4J6IYEt, a!n1!_g LXW{Bt6NՈ(K%r%0Dp =. n7-N-fMQDTk,3 M h zρ.fC]Ujts"NX7 L=Ar[㷱v<3 ix1'giI2?]GQSʓFHjdk0l[dLEףTĩ`8xE ̭&{Ue[lM6^wuR(tB6PQ%hk$3oFѕcӜWW|phƒVFFE^2udFޱSKT;0"œma Iuflarpְ""#PYXk" 24͉2~VI?y+cI47fCAY Vee]URi;A."7MYRDVy~=:ٹ+R$dتHDH1NٝzF(Q.CΜ .&wB2"4jJAbG 6@  hւ]*CÀ0)%mbb#B]#" Rq"F ,Ky~ T\V)wtȏhNKB`}\ )RJ")2 ĢB4PTBM3QBQI PB2./;P@01zPIχ'E0}b R2F, AX$2b: `"Cq3Cx_9)岢9%[nt1{XGXPrt^s.ҌJ 4 B4HP4P-PP(R*R"QJdHPBD-D#DA$%RPR554JCB4P$IK@% hh )HF$ (bI#U=xz(&P6ŧ.ڇB/`UL H GсAQ1$ @>D{?ZCdxsɚ<&p.bQe"h-ha!>-Po(ۊGՐD0bH-)@-DRǰg'FP`G8E賊\!7S\gg!r*ßz:$v?o#RG$.NC#: O!)S,]""*&! "h%)XAhR!& NW#|M $.{7zek#*℁ mܡYkh$K$u? Z/ɲ6vJ,qK^HoZOA[i苚}"hIdϺִl2Ϲs?$ʇ \89R b5D"|ns< rEcs +wsE~$e=⌫"v's(ݓI ]#;TJTG6%^G43$Js1O3%IŬ0kmbǜ,^oDzH2o7$/C2G/KmTMGdzjF* Cqt6g3J?=G`hO :OSfi`O-Tr #Nps Y`GA|+ |̌ p`j8~S.DgQ`:s@ `4. ݌ bS"^A9z:Xza?0tch"%UTBA;-<:- LP#[t}̎z=߳fO'"}P*4:^#b>!3KQI -uc]E?x?W-Ma 1w A.zl DBD)(KHrNt8aEu{ DY:*#~?9}9pPK J j!@QI( Q4taH\Y_eh a|:\pvEI[T6&00dユc\=G dO{ʹ {q B ;OUT4FZZQmC gyDi  @`8FMRHQۘ, 4FYs1>D{-Q5H牄R!䎎(_i* $Z&=>)vQ?#_4xpБ~^'Hv (ؐ 74~&=H2 DB*QQ` C S00r2D \ZXihNҊvq- $R){ lw#zWO9D^sdԊغ2#Bu"wgcN[_a;=R3B$pmV N`߿) >o_d/QA(2(vH9[?hS;KX3zCG|P u!N 7Hȕrś#w@K ,F@@g=n!k< EUz; 9̚7BFlAs\h&Jo(Hd;كBd5pbkR˚-C2v8dl͠$`&! _IOKqk>Ăi@Lc*_.Gau34}13ѕX"|*9ـ8[IkRkR$cj`d1n:9Av0'-@l$IzE j15*QA5¢5A &Y R %JAqG{vt| ~ }{-NCŎZ:O/vuiD:D_nQ򏩆R_Vvip0C'A;["_`ؔ TfD`¸i.HܩV2 +>M ͂[":PZ #Jj@$/* []$nR'@RTV(&)Yܰ@n7"wrn& !VٴEDUEUP8ZN4wso2,I-4AD)Bĥ_`hl`xHE甛;FjQ]E4v3&5l-m4`F`2@ch~rzRc 2FC(4FO.6ي9FIL6 iz 3#c_i?S.Pr> dސwacū3󈕡n ><L;i2i8l:XҌC,p< Un}Xk7}qOݩR!PWNs SN1 DuITHAI]1\RH$`2i&(J  Pa*&ID hy1pP%!B % F5}NPp$'մӺQ^(p_wx?1>Lyj;Sh@QQ#){$͛JeCH(0 ^+}4T I}W$4_8gC$O'S |VT0@(j@0ՈʚJB! ܮ NB-,$ 2˸@2UsUd<Xسʑ :#Mm8Hޞ`?wb;5PE/OECcPc㣄LX/Ԭ,Z 6ui;0:f6D/5ԨA \: ECgf?T9)pgCpd %"SY `u0 7*+ d&{ ҿeT8qJT EQ)IT7 :\k pt{,s 9L&PKEY σa3ZHx(릠7Ica(?˽;v,"HrEQ)x%n2=9OE)llN4m-u6lѡ tQFnMF 6`*f!-p&"3MA*]N?<C`03]Ǻ!ճM0$"T$1 %1*#lҨ)HL@T#+  UU_x׮ IXc+? V~*cI.~14o}*Y3T&cwT FR{ @oI(f!:K\Cp@_ǻ"g'?Р)8^"B ;`,埖ЫAa"G9LY7 Ko4্Gvr[y؀!tL M|{viz:,*zHԱhyī[Lc5SOw kn8*)0FôYl[ZyS!O ya<r8PF V@2Ekf0TA `<0L.Y#NQH~DG(!> "8?[|m>8P.UҚy9g{_>LTE0^t6|{'1A|-ÿˢu 7JOD>MKƸ\_MV"AmiCp>/T|`lyxAa>7aމ1)0yëhKWo6 fO]Z35"v\k&,quT1-z#=̂~>>lU*ik'1"{H $#"GBbރ/ۋ7̧ `(O&s"MnZ>AabPJ:c&;p<zJS^D;ꉲXyD$`iR 4ћ*GIB8R*YPdhkFq QX1ajFffsARsC QpLaG[di&1FDx[uf⬵ Iyͺ&phAIޠZ2֚(̰@ldR2 BU+ٌ 0l κlma *+o] 3@xυ׌a=gc]]94B }$+8])Ppz @KBc)%fZMp5U2: iJ NPS)lcu]Fk16)PV  JՑ!4m4hO]9@&ʖ3~lTU{$MKK"d{z{4aDvٖ<8_|iš&ܮDHd)uoP0ql%BGws> TTVÄغ"YGb^.6)R6F.f4WX!? ~Jܤ0?;@ Z@KhVscݧGWÖi=Uf^lf'M8411PsLB$% tFc򺞅8窮l*z?Rzi!Jض64T6Ѣ%a*M:e4R8h"( T5&CB{^w`yKBd:߹XsEA.&I-٨L6C bdփ5 }djE "m!rXсF8eX +lƨ4m1t *!#&z]kFT{􃖋]0lmN jƚե PciVPʂ64x"`he^eKm()qbPDBfbx)d0q2)x°!VH3$f&@1j#[mNi6DĚx00``)$,j2 b+%eUC" i6ʕ4CnssnWM`;)#&dɥ$\ʎr(H1Df8̊2* #2Q)[qi`ZF5JP5fC 4$XFt"D l`iҗ`0b`!2J" 9ɝahtѯpB j8;AffGV$IS&Dņ0c~7b;㰀G}bbE|b/x )R~#Hǐ'tllN93lls ]z'0lKesvԠ3znpG]PITs”i)Vފ _ I1ByFX/nv:jAHXk猪On21OurZӁReY`R-%haU+CICabPy"ЀjR A37էWջG~tf'i!!s(uϙYb=LB7!hBnl! @ PLP<6żS(xpybPMАDPG7bz~ u3 e o>P_s0Ip=3dm > |LԈϹ@(A毜 C#AvYy9.='ݤaTZs>s ]c U- 3OR%n&5H3밹[]5Ń]g6}fW"רImDǭ ۾|#%^4@ hu-WF_sʬL0>γAKi>p5Jg b_'YLQ(|{ޭ̟L (VOB%))!DN_TUKXuّ l{aeFdΝvčL>M?Ljז6SH/ y{ZRfj^wG F.b-[ؗ X%D> F<"]R{Y6&jb*tKM!%ɍZЖeQX4Ԯ&m d(I .IH  jWO&(Eb(Zd"gLĿ_ߧV$C,`@fk<?)nJ #f401`Z~?p Mh .LL<C)ޔ[6pisҡwşWBdX$V8HALJ큂IVDpp(F3# "V HьTO! QrcHF,D64a'1_57nb=$_ňļxy{/^Oxz`QKR F!ѣGn괉hƙd}2q46ң&|ь뺡rxs+$Y0lmK/ F7\UU>ɟBSIH:$93i9Nubm[ s;˷"ԥ3f.f2׻ktMA*@ǔHh-弑0CѣٽĚZ6)t Q[QU^ưi1mص/fbH)> :hQ{Q"M2cg!iGJr1,GΐёQdE_`b'B..r xXp!~zUWJF);P4vA1D/uU"u Νf|?hi'90wnBu26)Ad@=9 Crr]|ӗ Y`RKx. .85F 3Y7oηܖ $Z\ŀ)Cw/d.F@qU!nZRImc0jdn12()ƙ1㇪d`99pU=}ބW\Px裧!57N` /H6\:h?U5کA^Lx/@ } tg|vU](0=쌟QPdX*z/)JRXZTATpyCCcA[kMZ[yD` 2 bV0=Te-JwU-|bX57`qҐf6`_@B^? ; f#;$h\!2)֭L?B#po `RϷ3ZQ 'f ה`:N2QL$:j3Yi cv%|;2 zNp~xwjm0Ukz-GJ yjH@ˀջu2پۡy'OlQWy&~\G`Waqk{;a!RIII7aOZ YO /*;T'u Yxh/pke(J},Sp86gxp1(&oѸ[LKLIJu@0nwgNnt*?`Vqe9Ilk}t>E_>`θ`w]@̸٘BĀ40Hm DBHc!) cef`>iw חՏ<K7E}x  x+~(p0h"`\R"6jˁy.VAD8!b6_9 #Jl.&4l$JHa}Pb pn\ȡǿ8w-Nsnd42cz p;IZUU@u'" j_kdD;C )ADubfГ3ǡF zF'jeB}kBJF_$C aa tճ *26Zcy bCa6cM˜%%ԒwFf[.d3ՁÛ[ɭ8mCICJDv cg[. &`IѢ ;EC bŸYFDy󞲃J ξt5"'<EobBCH7 <۩2m}[^Z9z~hO>dѳma ksˤ c927JIzDiW6PUѹéШj9)/{TsY W?oY3Dqn L̹0nUV%\%ͫIa:Bq14 u9@@"JT67C<6ݰSP@PcC5`ҍCP3(Y:]d3aI~!͐4šF4>\fO/d^*?p]r,C25j P0w[BC6p}qad.BRHF&,y;G>s}p_49d5 ޮ=O{tMN`u] KQu !Uo0ۗCQ;5u"n*!r[V<@;>{'BEb0c&:_ޥGOd>枅IL5Cw~8@5?[޶W1XevFdmTـpLj2Z3)9f#53Na_a^Vb8uwPT$<("o,\i5?At޿®#b0{Aa"%z f`co˄8.< 3cRn܀PɂƑKQ \<.0.1r &h0K2f:g 4'$lh0f^1h`(-$f4ӛ\VL 6Z4b4b9&c1d4=oz3P=V Q$DA$c#i-z70VŐ;`SCƦ B8C4f\ի#zt%rI ʘbo q I#qb(fHCb&B\+V8AW.C3tVÆGq6YkEyP@5ZiPWDhFc`>(A! Ha#&Pc)W s3*3WY*w8S&IRaܵMϠ^ֆ۔(4A2EFj1޹ 0v`CGanBW@ DnȊ5 ljŀ1p3Ca:2e,3b4Na9!i^cdO^ .)>& r.+3HSِBMDĹwr|1 3Pp^>GV/{F Ɲ["H 1>-JtHG^p}0ַ݈cQŁ:7tD A&y!:4=y@e4Dm)- <̌!L#PGMHڄ"iKFlx`C,cmP*k`}0ptN^qB,]^ֵ bĖL'QikIICF).<"º {Ɇ=f`KԹE56rv@S\oi6̬|vlBY# ވ=:㫫,PQ 3C:u>>:\ql \zoq6em8 iIUTl) 3CFc-ZGx1,=i i|n1) 4huƂBF#P)G *x4-c,:1,\M1Td<)3 D56&Fd/ѸJ4 " MGO +fI0̈,PIX(F%bbhGG9/>ECmaWC|6f$*d>L>rX&)%ɓkΜtͩ#'l͡U{4SJKv90B3RUta :piݠ!U+pYz] bO&ƃMaP]>JJ?K|$%?`LYRo4kz416Čy\98?E8Xa~JXhqx3GGO"d ֛L!Gd N9sA Tbt\2KbaO&nsB9+,8|m*)ѭ 3m $SġmuՊVjZꁔPUy:֌թ5&O7$A  ٘SHdTf4 9$w(RD.FF)JѢfR6eh DX&(73K'6i\3 $v:x /ҫ˥ `)F )Cہv֜sJɲ@ hV]iqQ T@DLR-# H+aLvLZ"{C [ ك*u @Z@rA$+!  #3-i#$*"т8}@sNDC;k!*(@&ݘَHTט LMTH :kf$(Af E.ozJV 0!g q1 G,5ĜE  7)*Q2w ,4VѐfTy}ϰw*#t'@fvxO%BoJoAor=yl;|wJz)$ae4ӆ6S .'ƐdF.vNްzz'OF6!}ysu{7D Q|p({-' r, .I0 4HSr|ZHʹ `$`j7t"EP}(DC0i'sGŤavHHa$ W#!A!!'(eb$ Hb3 $58UD 4Ą) *i (e&b  (f fVbH*fe H I0 ! $bT1GFF  X >e@wBQayv碬YuogDcG&Id [[i־)D&)[dVVP a"!R"$ qAj&iħF]f"%ԅIPLa4 !?E؞Ǚ?94+EEl8I qxQ p# N /_sJU#m, KONV:L1ӃIDsÇUAǓ5o!*(ud{ӢRtUDh!π 9>n8ui\K$̺>nڦ!-zG2#Wͼ*/P3: -:)>`D:C2ÍhE2BC 5/jTz;kLJ҉HˏF#?b9ax3wo1ڑ#?XD]|ǵt*{ n % ~;=Gi ќ ,q_0i] 0 LjJ XaP2R.ƷgL4 Ҭ0$=K)b@d6ϦMǣ΃fTwXF ¼(P(ЄB`s E$ @iI\c@:.1w0adw&;xkz' }Ns@J e;-#LK%TNАfhjDW$5@4K@N5j:3 PS.CS c Q5D!@9`ҩ@ 1qWD2FRHd,B4"D%PBaQ8Hc-h4TF MIJY-sl955d3f!X2 [t&P8J-r'V"TKP2!=J4p BR% -Ixw$)&!epRKhZ 6"ŀ0((a ƄAE8&DW%#UXt 0 Q\8bfc u5)r Am!1; C7i(v=Qr!"⣪X&%QX,d^QT%.2.;v'"EbPvN6Ҽ@Z=4Θ=Q&$cP:W{07MH)tBFfU1Iz4ZunC "B\<d@ Yqሡ 9AU4{9{݈"e 8=0!wyru=K7`p#U-@3\v>Z 9 }5ĕ4c Y $\iXFs{: @~Fv6 ~'.cX I^ЇqK\SE2|i%˗)b8bS`2g hN 6:fx[eTa|8lI20"f &0QBAٽMx a &䍶"eNTlmh8 uC9ߗ5ECd kiV &ɂdL1U |䋉w5A,ɘ4#F- #lAY2l-S܆`@ErϖftZcNfn Wh:żq "d; 49F16-4Wi#~)Hg\B"#LDVn $dJ)^m gw5mt/Ó>&Gi/Re׶,,].:\% \͉bm^aynnL\ J}rsŃ}Ua哎#KoQ-UDjͶݽ;2tտ?ËC ߆hokYrOZSA.M'"Y0B ⃠` %m.&l ܹ 2iH~ }>]A9"D2WhbmyM (֓ig9 43ޖMS24X UXdh KGl6jG%w3 89.2q"JT&j+1EwuMxتd( R":Y]4wÍҀ8Ԓb6G9}~*H^y9!‘$ H#Jo;2)"T9] LD\b*B/ * ˛BS*S02D@-44JH0Hd !{̀ Ȍp? r@%t@Æ1&$T1VDIE4r3DchLbk8.7dv6F'vqe*%A UP@>q}hyҪĆ}0<J~IrPjԜQ<4<!Y_MkAo'4-4nw3^l"47}S L1!D3J(J`Vy-2I Bbbfp=@s&؈%唠{8a>"1J䧓 x:TGOi3V_DrhVdp;p5b0 2JZ  T&bF 02ځI8]]be6}W>9D88# dJ*J:GBͥHKEUJ\Ahrg$EqX'632 5:#PI1CBR)Q:4Q5MT\%D  б:84RJR"Sm T4DR%5QQ@SElr~NDb9)APE/! aatôF<:0f&Pޱ&¶̆*b8=(SO C(`˙0FbGyȦ;fBT!g !"!΃hIAJPG D4~|!dIq(;3 !$_ F}O#&ZcӇ p`9;2rRdu1e#A|oLȗ8Yy6N55W<8R (-l @(R./atB21 '7J8"D@TTtTD=Ӝ{AP+"Dt8qGp<~{}hVn!6AFQCHU!X "[XcD4!H2@ 4VYXkmNɧC&05'4b=$h&E4C3H<$`9u@zO_=.u U_\%auujh7ni;f>˃N|l|ٓUO勂%>xU?uZe`~VcJB#VL:Nn9އ* MDM  4{7aH8”qDP1?oE"{lL\kq7 iВ׭[!G=6b͙b HTG澭A]"EA:5/v 2Z8EA$iS$=#fqoQiaҴ2lNʐOP^0400L` 3LDtԧw}07a"$& Y4W$Ed P $'݄r$Kz<ݞZ8t-⯣仅PdB RdgFy!0b)hhP풞 >3@Q0:6ebŖ;DQPA16Ij Ɖ 4+0Œ.N$D0 mv#g/y&Xd-I`e19.IF !iy!G\[c)sb4LDs_oDe!K@!$ &E|P12"Ús?ijcNA !{'g3Wć! 9csh+`)0*`L`0|S4oLx6cřv$ֵs"/F :FT4GygXe,b=-sb@.6_y8< Hg)"yňִ2|a}f̀kLX5lFdCUT22V4٘@:eyp>s>#s0p0o!_Kvk3 ye:s&υ!!$"PvU[/.K(gQ(YaG\ݭ#'t3oqcbHmCtNQ|(VVAܱh 53^BER@g#Μ/f1!9~@Q:o6CRE] kXRV%6fN35.JrP$`!=vah3~kjemQ۰ޑr~ g a.3Ѵ>l}`Aʾ_+4bWG8o0L@PWJcKL3T⣆x#I BKHq27@=?#ct4Fk[ $l8qaR|QtK`u'hj0֭cMcb H {ZK$ vj^BLGIIY1 `K@ *P@H}Tl_Z{xft[@Gd7sQB`i[-FUQNB쁠P kL崃"kĺ`NM=u\>8BX(- -vAlck \dFط,hHG'N7m4ȣ J/^2VeQT"\10jDmF31‹\5!qV"Bhs2kBj#FiE"icD L nAw= KBB)8`֥y D[&ZW1cKa=֚rHpoXPdLY"j&;1i8b4b|YthޜdtGA%ZT{*R!: 9t4yu'5 bM A׷%+Q!rCebKPP5G¼>"HLmm c_8|DSF2 7YW}3&~fD6u=tcth/M@uu:Z4DPTDs!r: #"msݧ+F"E=8{iv3FQhʕt]Y(z #Mrpmk2D]WMf M$eY䚫Ht@00B Z!`Iϡqn8 @H*.'DNʐQг) QIؗ\x|)c+K-3DH~՜ :~޽{Z}:.gcFa~P (jk8=wLSIO>?"B{. N{(yӧ p汯]`*p e@k~C`dB?V%j~ k6m_di:wg]F,p ls{ S꼒 1pţ)/oI  !4HI۱@BD '<^mTK]RbaE5 VZ88ԢTۧbJ 4!hLbT@@ f+US{qϣ6o IXaVCY%D`y ZF ŭ$DeeU<X4|ZѥzZqG!ѬUM j,b5 VG!rjq Fvԅnk4c2Z9Lf7@fWc{8C.5EO?ʝB4`RG ?.L<FG*6 Ou׊b4\VjȷB<"Q\ْҤJ>> JU3W`xd>a󄼨yA( D4Χ\zOI3sbQ-YJ.ڽr-]ו H=}E)4F(>LC J( |h02"xI4>ٺ6ɫx  ip jЏwDHT$CaܺЃvu8>B69$^+O{Izc۾OuQSʂMͽ$$[T'^w,IbdׂQu ϛ<:"D2 3 JC X' *hCO6qe>!uHTo*1lٱ}F}On>Sͻ q(S=kMO+>HHu- K&]I>{>O8 1h,0jr1!G<$ \E4F8iCz4("B@*d! D*&!{cǸe}9ߠV⃆y2m l(y"6XIh)%v*.5NBkSͳ=eRy m(˕*e 0<$BkjYa٘{boǜJ jRue^:ȏW(W. B:8HTĀRh(%ɺQu0[pH.c.a[i/հŘ$j!TH K:j 4 ~m؄F9ksYf)PG-b6{ a*TaVi2 ,SD&N%pIG T&29"*7ӘG ]8aQB$M/# 9)s 8OUiG}O GHH`II &^`ԩ !$@I`P!,>q)ͺGe&jޢA/že'!CwWw5@{(~_A|<8{A?ui"Y(= Nod:*BhZB۔6\>NtLz- 3"p 0les2U XMR9E+#% jDʣQMn L@DSeo&CbnG- &HS2$c֧Cˣj Wn 3/S=Y(F.; a啱 9Mvj3]}=lcFwpL`N'AF8ncFH`u&I{[JO&=ũ$ U2,?P1{zQ쯆H/hDQ 1w쬘]nǞ;¶G{m.a7e| ̵[ft.vs@$ՙ'=u!2 s^u{ q_~+\n/W-y}!g=saVg`PI5v00C$&HysЧ[Q/mMiѯ 7d;c@q^Idz拍{$e] :UϲD2XCy2a I$YCyDsw=MGbJۋ{Gn]aMq-ީ]$ h>+G ZNWri[w/s@BJ .ѸG㭑ǤԲ@:@Jh8Ö-nBqn!6MAIt!V..p6R)̩ ͚aW4,D`N^cGuwYȒ9R[phM+qE7"9;I[Ʉ3Go7;{>]Վ㔗aB2gLgljilR.7 IqѬE\d˺mL wck׾S݃YEe쩺32`թdP[ IlaM8X1+ dLzuҲ!jG5Z߸`l&+ ]v`Ѿ !]ʼnq`\#Ql;\]f2|M4I{e3s[#HfK)WKN4tc:楶L@uGwwvqy[!1AW뎔tn6s{?j!Qcwq~nb[`VSoCk>ZH8qYn1rwg͔m~M:WESLo1xJS\զ1=`䬨_p Œ+2% D}8Hol21*4uۑ;~h ZS(81QĘuq83DTyMo._>܂9ФDSmr6\S7hЉZlo?CY(46m u)P>QGDi5kտO(((((= wG9؆;fbOM֝a"m+q&""'lʰŋ13 PRW3[K9EX>d9ne뙅TPpW3mn) bl1(CZxD3*.O՘|Eޭj\äW 28XZ6sTg|j1':eWuѝYѬ* b[1޴!O1yEwab ٘@GP[2dq+:BI 69[$0=hC}dEsBOYsr)lb 53)4Q/XqmO/G{M==b}srI O-9LS9Wq\X{ċ.ҭˮ mo29˶V1jiNp>,[5̲D9^HدWvk[dFBOw \PuDDNDSG$J[(d$yaNt|, ]0Sי8vۄ?,d`@vfk2ri22ii k~ M4YԞ'JGLDX޾40Kl%t1} 䏖PDKu[&%;V+\ЯFCF#&ㄢ(v<~GID1;4C/kd77%KfjwCF͉ 2J33F>-uR('eUtu* q4pYSIۡP< @miYlG 4hfKYwypɾ-c(' Nrq ܶp.1!hޱi^1sX]aPYlkbgLdbBo6N# 84 %q38[j 7Ɇr<.02hf ᶾȲcZZ+'&MaZ@tS$1a$t7\LcZQ'qT6,zs bq!N6aHB{;BkPulm-Z/krzq!F圙l`Aަ w H3BƎjnFe+ciHR FxڤPCAi1 R l QHd- bgHf6&"4{AMHH`NX3tsxτS ts Q>nr ;I;擧bظA_1$k|*5)qN=!RF.B`fV!^"vLfdcu@=!jK]`,TDE!x^4k]|Ht) lңXBh"{eZp83MfeOdn6JQA8e؉Io1eWp,geQ?dɉ̨'^e̱:ΐgPpk"}r;+b]=gE8nb %Y7!;fv%%'&J~ -4mdrB yz y18 (2 LtMZ(9\Pz &j"I {cCE"8Kc&z=^ &$wPĩAYIJ0Er +$#4wHYOF+2`sNxdrO#|fa=*)Wk=OW#: d`ŀB:cg<P0c$#2$o1+n: Iֳ-,R$B$jP1w W Jp! b{ŎBi>h ̰ƺm(@:jC9( xSm@r. K@bZ6嘦kރ c,om tI\vAL &jBL҆]V.߆ysUktb5 0lqs½X+KFө4/pMQFOIJ0cLOhRD7 ݍ8@UKQM$3K!O iAYٳ0Ɠe5A PJs] "{z!"R"*#$BQ$FM08 ci@+v1zr–OdQt//zd#3D x3$;&/=L&کX!mo PLU@i}d\62aNR ēԆ)h9 K'x~%g췖e/`l J)d)h),2#2W=;b_|azu IlG@GtzQrT84@qA}ރ"|*Īe ;g =ݝ6iD W8c;6gcK%贝2=jڡӧ|0vQm'F≨D4"9{ɵc &&h4 xe@x a7DRhQ0`28Xb1JD֟"Qnzb@1l=6TFzb|& D<ôwIhQO X'/]Fl*(B@DiHH< n!c-lhc5stzX_0 дь|h+FEvHI<3SOYLM6M괧/OX - *lʓ6mւƢo8њN4=W54 nlK@')n#Aʹb >6mƖVUÉEP֢ fֈvzR=7#bCˁw 0]@w VMz h6؄D<~ҋfll2O0zgM $ /nVc+z3s32օ8Zn&B /%"(Dkmlԧ W&кr>gs%7g,j3x@]SAAAaUM@8@OCv"k1 wM-5)r:e`\ bB00-Fu[ME>gOh@׈%WcM<-0w`|m jQGFA=A BH3g%7L-k?"J `pP̥)g1iq)~}BZIR#JڵHFTƾbi>j^|#R~eC3 ! 6a8x*m, 5ak)&)`u3(a($&Gz HU8 n$$=Df[„#PAa(Y(﬑D$PAqCT<-X_*C{aD::ǤM@a0Lj2%!(b# ""#3fZ4֠¨{b7p_ƽ9FAcuQkpOֲlmsr28G3{A 87a4RZӁ剕RVQ "Llo,͝-kcڕJUQ,*mVfBH)Z!BZKHC p=iTn"uuMC fHւFfIN(Q4o{p{sbhXdH 67FW>6өf1UUI\" FoPpuV1Bv68R8upBE1VZTWq(ȰJP QR)eaYaS$q6[JWlM ܜZ%&`{!,З]!!4A\yFF_=2,?8{D9C-G*ʼn. Mag>oP9C>lQ>,k`맹9/-?`)ax$OqEI{|BO֥RXl?~ \ 31).,(@CnH>R,u MR7`L|t@JprɴN{rǣraskJ/+C444EQC6ʹL@ǣ _o9r5f YMi36'Q4 HxG*TkLPl ǓJC3Rcd#h Њi0XQ ܇[w &Pdžu㒨f\ kcÄ윽uȔn: ;viW7Ig6fG1EdU&);; -!g{9c9,ȋK/$D.Ib1&=De#̿đ^80Ûܸ%ݥ^xPX"=ij쵉͕1aI :̤`R-x 4IQ?Ķ?:ҚiB:RV13Da|!hLlqq6QY1_p3n=eF4ލ11dtbn Pɢ6% x"rb͈GLsm,]n7j6p8k3 QX[hbǤzҍ*K<t bAg1rW$6tC!mF[inLyY:.MeAaaW!?c(2*(|Gb$`3o|MH֩b"-qLEZwCS97`فh`$ja*`j1])郍vl[bt^3Cl0o>鲰E}DE @|| Se&!/A7X+. [)يh |ؠƝ6 /@WA.uR1jel`u9֦9DMUTN :XINAHNʤsPimbp{_7ρ9rV)Ep&@2I10;&DgQ3sӭT%$Q, /sXӌ@K5E0wdJx~0vd"o n7]WKfsrtbmL8Ƨ^ͱyXwLMµROeH!oNVɇyvL"ki:oV6`a.Yea&= lcR]#Joh9i67;`#d64^2Ya;JۿϫFXG|As61;!XQBx"݌srmM߂#MqȨejf4m7FFO51f}aكsahw/B[:J+;g%ABh,hv̋ hP^:M hi6dlME4p PһF6ՀĈD A_|86%fؗ54r1.q[ ŕƷܝrq c,#(kPIj'B*!_}٬ogYbD-{ڐpV 1$&Tv}Þ mQM(QNb20{P-3' لsj 1ygF UTQ}РX:Azˆ|f(t΄m8;'hԽHqΡ}Hj$ЋԨicA_wnLŝTֈ ẂՖtCb5Kq :?Uޢb(w@W."ɘ%mqvGĊFIz)r>=N {oL:TtAF)b֐u@!pĜ#ABPR۞xX4aCjĻnjyrJȘi@YfAf˖Ix24 \SL$<'Q$ɥF#ks.me u\D@ԅ F,jAkL{H2b 튺TtFȆ.;Rhmh:aXKXmoݭiG χaV`R^E Q 9KipXE˱Kġs\'70a~/:Nc+}^Yށ;ceR|glL*˩ā8eT;3y.nY^&ZfPe#$59jXxkW!%d ]&1A1SxY :nsF MXAưlM4vrH"a`3TrZF HٶCRd f1ˤd8hNa89 9u69֨ݎ ]-- 21NCXӳF<ӛӊWbݮ);r-6Af4od :AʝyS 0$ū1 [gu÷8*9e"Ի&hg x&o482&3Y<a'f-w>ThMLZzP;I;CJ/3" ]yGfe`HcюO ;;DAG 郵hf\utNG(匭ʼRPY?`%>fiv@1aK:xghR] BHsxonvGJCn%ihr(2ļKPU d7v(,;P%?DfjUڤ y*PXeJҪW3qv.8~S\-SOy::,fxWviȣi-d`SipNW)?:i 5'iغaHg;L3E( bx') yA(SͤձRNS3 LYɠa:.)rKP""ATFwv2.}m'zPt/1ǰ/B4 NॕBe$Ёbl1ٸb0w&I4,,-E1,u?U<yf3/ng³ d.t_*M$W#FmY6l8lyՄY4lLI ^řL#gG)cHl0ʦ/0~ܶ$ 9f5 -Kfb` |8n( M1W<5QEf`Վƒ,SKFEMI})Bj@ 0+F0lK7\&0 X 5ٍW7ŵfC`( &:مaeYc9E6b Eh@5]C0 I<I,p 0q*0v8cHL-Q=%fVYNp '@4q6*ia 7."ycSTݑ 󛉧!mO)$C&*S6%~T2ēVT̰IƠ)H1c69Y.]M[MGߨ;~FI$ϡ蚁 R@eƼYj֒@%"=thm@v@ 5.PnW#ʫͮ6`{$ pA8)J({Ye獯oqemdx2/̔(>m@w UD2(` A&l<'X>Wk'719NtwP= l(s B,@x5 @8y<0oy TvsA!t?ճ0aL`4'p-cDdk3VYoLݥ19BMc%1؛mNASDY9KP- a\#E I$@N@w]ը`NN[x EDjJ] %XcB3!#aB\13q9dg o2[ )cDAɚ:^ "N O*!Pd5fX%6kFsOkCFh bH )XV$?nru7Bj4u}J>{s О.a3"{WQ*4ΰB1uu3*b&b H 7$PvˠeDڑ~)@ִ9N5ܹy ``RI-{ny5aJ%(C({󒪅=fJ$⡃}~<ŃvD6H0C^yݛ3$ܝoחGPA6&69y?q)Ws>AѢ#D,aOhҧ+x0+~S@DCYJ~2]ڠ4HbP`mX!, u%?ތ?>n6D1%'2F덙ddePtjbXF.ͻC1UQl F:LD FȎQ0rA| y(W!TzJ/ԀJR uD@L*o=2D00LTtww뿕ZbմRhTh捂o1eA eUꚑ<tQS(!؟v}*pW7P3L*$o eC跁"C{ mXKOahMS*eL@(D $p-TeÎ$ͣShwq13#Q<'ydǠ6mav.Gtt5 h+gr WސIVrmkO[cLy=5Yͺ"$3"Z֠4a΃(`^%SMNSkxRG8DAed\F aS N15f "M7];D ևcF1Uq̬ 4jGP+C0]lѢ7HLfuvo,kVUR14BE[,ۃѬ4D @6!2<9 "THdCtcԙ&P0a<"g(3ݒUDDPDqdJͪ;5}Iwfa 7u-!aHG qD I6d:AJ@Ħ]Jbi)#gձi]~=( yJ#b^Nmj) >x{+–S+~3-rSHa?MXrIڡXE5BW&i@$Dި"\i(\&Д31E @ 7N ML&ɠ$+h"&"@ ONxjE%=^ |ʀ{w !S "*" x^d (~ȇtS-ӋeڸKR&^g!b a].փkSQ_GJߍ; 0C$4xz=hK*sl"$|_̤V KQv+$kxn Zop8"@P W[rOq,gj=&g"` !b)Yds̪c0UrBރk#Z0eH]@dbJ!NX<0u`֐!LE! Þ )次$4{Osux@"!!*JaaQCE4_#`` |z sϼ,HlH+_tddV?Fag(WXdIw,G!(ihb"!9PA.d7~GI(r BC=hHD$ҩ !AD(D w$PxlNǢ˼)~<+cF!'Y"[" z{d@(ǩV_4C/,62 ?1*!!,@*NjCwM#QBpN4ྺ(ٝu~xHKw?$}ڜ>l &u1XHez4ЛFq5 Go' s_*.ߥa=Z*'V"PMHAzkEnj]F Gd  A%Hvv U\_k@n_ >^:@/D1ga'˵Z6T! +)GA'9%At5aKRgBG8xqj" tʾ I(;!5!^G-m ALсQ-%N,Rfl(Dy $r?88'`/F) yYc\4nn=0\K9MZyωDULnٶ"xB³06{!TXxkr>iZ[B_xl8bՁa3 -j l֤=PV7m/ҙ$ @Yֆ 0svF͞f#juqM!H>&v NDQiGj(_5t371#CNR: P r'3bQCŸaAid 3NIzP׿7Dv!!)j(bL#2pMAE3 'RlI diFsT @IIHQI%4H "RH"a ={.쩪%oJD~S}Oew ŲD=uI^+n,еSRq "(\= "dJ=CH\|+#&`s\k i=UOw/_E;TD@01JH /}*Y&N7#2B{i/5::3Z+N$U9Lg4AsӏAȳJ (Zfca_6&b=l;;|rGvf @O&$*@G, `ɪ=$x4}"\W-cL 7]=A |!bI-E ʓ! |-30kUg͗R8U0qBlK⢃a+0 mՐn2z_r7@Et2 b{v[0p/YibM &_A- E ;h(}|4l%-!EHX$ cVyV٘!E!"k^H 6[s|8E­ml숖薳nͷ'E(D*37OL>-bˬ-0mtӃ`$6CFRI02L3¤"&J 22"#lϕgE_% b"ܪޘ*d{r4tҋ)UT.CFXQaD5,DA'vbF! uƓ/ ~;c=aZ0V$S'{ #,oJ(ݷ\kZ2YA69B(< %)/p)L!HhÐD`oa ,=DwQ38]\:xy…B6}T6鴷y'M?$LG- 0-?ys@z:Ǘ5 1}C[eQzH}xvM<.0qx|ᅜ>Ԇ|z cSHig`c\{?= L *dMF/Vn.4NGt#; tdk1dLl/%BCyiK;)2'׌Jb P2Ao[+1J|!R'l~8""CHq }u%GM^bRpR(G'<oɸWA$D 5"-?ּ;M?Nu.6`8* 7z7kӍ1Y#*6'!pAM4A(N0G1 9~֥ف@?0b[&gbښ+=O}e@v ԃRJ.u=P_h|x<'Hj= #!0Ea@%_tVa0foR`!7G̟!*CĞI_iO^ܪbMjylfOd]iN7b3$ Zn, FAcpQXg3T)m74[nEvcqB8q t{ [t\ /DZr $$,XtNiI2,gif\%[;XM̶k*- h7bq^\dm^`༎+$,A.htV,FVOM\n(:(dUW£6`]ӧߟEFG$s6 ] ,4؞-ȋ B @(u \XΛ u҄g1pY_ ׭5wt~;ZE6C|nnN#Kv8I! Aa&Ts5&{n":2#[a޾k#A+j`8AFbF@R#qջgc+],;/Abm)dqpx\=2el4j wəb *mǎ2kVJp te4bp܃c(Y2\~7Mm(# ,h=Zs3hq;D>{옏^oV.gs(;d*b['F;F1RQ07   (,]ϘDvꐰ`Wv:MY6:v)~n$Y z5BtUJGt"TEP$ ah"b`ZAhR}*j(B9HvhX ZώJ@A{;eWXZ)Z ZTN_%*)(V%o8FiU販Od0$+ aD33#q9 0F^'c?;|?K5r~G?ՠXO⠢MsK:Xw?J|>($ $%%}W_C6*jj:o@#*>RdB96ÐdVԃ ʥTɭh,b؆s24xڐҨu(9ٍ(zeme:"s& Dua2i送@(9#HQJ'MpH&O:A#?m ;Mh B_/N[?ak @L"Y殃`k < fACY fUAG8{'`c$a!ek !$=L08yx'DP.sGpEpRx] )sDmo =?q d((RJWQ,(P"(bLGҲ YT#a BK!YlwϺ{gҔ*>`'=`4 et+^` JܭbCXe۷untw˾RI:ݺ;6]7PݽWCm;;/{iflY]ucݢþkWs.Yvjo\W}=bosjЩcP|3 rY9${U'}\=p{ZuiSm@/Zy޾Ed..鵆}}><ϼK[2zhiZ*N2z JU]fPc^f]J|F{{hw}:u Sj>P ﳑE^r@vʕ.{}(ۛ0RQmZn:th'k`H ݮ}zWcAoZvT咨tkU%)NnNYHJ cI5$Zu.$Nç ۞)@: D J&TiȢ ^:4P{:+6;Y;. 4\'mֵ(>n[==/Cն;W{ s4z(@ r@C@2RS_Mɬ]o{7}9@S}VlC(o;=elk(PR +>{ǻ{={77jLh_vq}M^s{WoS]wۧ-1`>ݺu/To^v[}r3f:j[mOha[5}ǻVͼXs㎭;UM.bמ]j{7m|=k;w ܫf+rywF]ӽ}neфWh=Ek<9-냦EtnX[_9|Ntwͽ׻Ǜz y}9u3Y<vd2F=VֳޞyH| KSPz۫ۺqo}׾uyvel{zd/zuc=yw]X̮ndϾ{"mm6zΫ5{zy΂Ziv鷻Uw`+XxnJ:tw[UϡMwn{QjIqYwhC:Ҋw7m{-F;wYTНVk\wݜg=mv].^ꎻ[\P4P`P* G!y{3;q'ݜI6TnZJ%7ub^}|pз@uzwln{^}xfnumHJ@:;ޚݎQAK8u- wLpvj7;ny= nɶ6^uάm1Y͇A{nhh4(Um&mҤUkwxᄀl5Op/n57k t'q>rvۮ%Ӧ8 +wgEPK]6Ao/w -;;%۾lS>}PT[Vs9;۬íKOE5N]ݖn#vݷ589Ev`!pDr^ҍ )ugwsf[yJSSeۃ>{npB_t;ۆuww[q֛)ww`wFrdֻdΜR} C왣FwXm@@9`^s{N2ۤP;p{w6qt0nyrlmC3UӸ=vslvvm4yw*Vu\uuJ ӰvI5nzbݸiףM55\wᦈ@2L&4$HzP5  & &S26zH$D #BiIA 2 # yS駕4IM6Ԟ1=@%" ja4OM)6CI iOQ 4Phz*"h Ib2 51 &T=C=@2 4=AA40CѲ6PAzQM4?k?77?hEXK2ȓ<tvB7Ū޿8Mod?ZaLl DME4Lʎ*+k4 X~*ظB{"ʧģh{u [ R4* gv MtT2D@ ~ygϺ36~vV18|b1kn'75rͼH<D\4 6!D`+9q]F %1oSQ{w|\,gbL"b1Ws4 y@*71w@(:` ޟOr pf]8\?2 vO1E@S 8 $t_2 D!$ D4D@*P* Q@r@HD+ "D9 B H'B0IQPSmQ \Rٖڢe!ßD>CsYTUOOl䊈iULO3#/l^s\ίG۶Ĉ?Se>e%|փjy…T#vu/ͷC{ano+XEihw?u9MiԨdYZ.ӆq=V(n68g \] SU( x^}߰e+Fo\/՟ϠQ:̎utW "^QܨBL]oنHFHTA<ΏNX 'Og|o$UX*N/݊7]M,aͰ:J^,b~S'q F)F3K3x`q/1uzEqY%(iSt综&y/ )0\'znd5RrS LMQ@U@ Jik r8%Z0BET[PE%Qv-3F wT\ُgU~ t`ic44E,ÿýynVG.] MĥG ӞWz!ʦx2}v}D8G6+绶b2A$`oxgwj|@SXdCI"Bϟ׌|~gxs #O~rc!̡K*R0I))BF,52QZ4Ml*AJ` 8R ѧZ*͘ F"$itQFӧAih(j0c,TѡD 44TDD$K4AQ0;G)f񔛕x2UTF6D!6(a4$8BJ-&?$D #DZXm1d1X6G N `˵ \rqv~D%- 34DQ0P0Ts@aISO[+kٍyz# 0DADsqE%3TN6Iy}'rjN|`@X 5z%ݙw2:^4% ]v+_h)M|5X&Á°r2jwzG`?sݿjdp3QTrC^.HMPoA}fԇѭ8g|T[ ǸcVypSYN~yzX1(~"-D~]Ma'zi )RJH+dU;P+p!RDNz' [w?n{mصb 9I@,WI{ u}ϨDi``O]3~쿑 yS07ح`J^*>_Na~ EDSE%Di \@x];!)igƊ"/1sDԄ'DO R[2&!xa='9dxw\U) vjar:OfybJdhaVӤ8\êF$"lI$l`>ECl(mlkhԤd1s00<6hi$/\E2AQA[:#jb bKݸp`ib֊b"cA\[M!T4LS-%S@bc& 9(Ha"J" І&X"$*ke&.^Q^;lPe=P4D4ĭSEdgvQDw\11@PN,DPB11!A12I.0Ý"ik.sR8LQ]U;&cuCU`h&9Ʀ"h?EDPnᝋ47#ִ%B FZhqN~!} | bƁ:!HDrBB]"TM 00IE! 10h $I,BSCEL44BI @1hoi (4bb 5KUXN8Rl3gV mHGGa*E%U3 P=Y8Pt91-UBF9BhtY X~BOG"IQE1^M<*wx$Ѩ|yS}9Hm2TEM"D"ƒv~קO|=qN L1 @*@P% 4ld@KQJȆj4bB(G@~ά(Ds XnxEm??CAVblgA@J  NPD]ԇ&__fMK hXʱ*2@iaL. &iܷJ+ YrLWh4`kcge(v>zDT 壵1 ,jN}YP-jśn5}rw?-U% I0[ 9 C{=gjW)`28,m>D3[B&ETUUCcFOjqdދL,%#Ѫ5,Fh锭sZr^+h-D @/P"x}}2Ukj,Wlc[7;:7c| B+ncxArdQ5VW]f=_Tm`l8&Z|m)8}pbmi`}KWHY~9 `* fI vx.需v govN6g}&З,N}W8Ls~HSj\NeѾL⻨odlmsDvB1J;j01QG .s_~n)t#XX9ۉGvlikAynЯ<ǑڑK;doq_WQNXS$ Hq46e8K h(FY \5H9l]Wz(2<ŹT1r 4{ѪDkg41~-C:QR"Gp~oR9SoX2&;!V ,T4*Ӣ*ׇ%~gl8 V|bKatnrgq͎JR.鼍ml1Nܹ{w^WbP+|k 2'H8.8n#V!liulQ2d%08WxmPCW 6 eemvkff|&9'FsbnV1bkLvXDɤ57a&1*uEVjD f# alky4C$F4fv?}zz̈1GKJ*%9גmن&jS!Eipv|rzKp(ZIGn=oA'wG"l^ M:y z[wsUm>"E)sI݈_*?R:=lc&ڮd "l3մ?#dZ?o -i77*8%UWkpϙ $ q(fvgz2"."d`tro+~ >Oؒ1wre髎1*ifi61;IO0+ۻmZ,)ͱRf"1(؈`qG/R^c蚘&hz9/, aCc:Yp'DS\khGiQUVg]L%&YH04hc̄~R*1[Lm#ߵѵ]"ňR JKi\-V 6ch+'֛,$Mi|)0`ǦL”mcR'-QtUUQw/8$Ɲ ۡ 335o7CGrdhRJe J}p>7`gX5^YO$j|I b"đW4ѳFenGQF\!ѹ$Gk,$H mlcYnGG8417JAgsAz38MI7Cb2~G|9c.lqBUaa&BĶd}qD3ed)M2;˲OY&FA(,@H=. Vy][FlkeF}{]3sf"f%KT("ᎃ܃ade'FbEL6 xJIaFES-p|\zMS@rm!SMTTU#HCϩ+CRacpH}ߢv 츞"pzg`@RgPZaQOn&1WZpga:#b $ʸ6t6lc8:P9'Cr/ly'|b3(~\ksdĒbb?f3C%z+m`ߛ՘/֨d\#;,1s[?{v>\_-9s)cRv˳%8׻Κ8|dٚW!i}k!b 1DT♙P`aE%ewX\|^O? ό$X8\G:Ut -NWDDQU"2'CyUC@j=!G8!4't.Qk,|F$0X?,GF! Z_ MX)93P4~zO|ƾlm>iX!Ų_;1sm$L(~|ܵJ5 V N=T*U^;dul* b4{=zyS4]LM^iCMRWAjom"cOڕͭUYJ#s)a&l2RA`j=e"#D8C*K!gw/ߨE^9[KW'/'Qq[55EThU@SD5.ݨ16eO7Aj;3TwrGG Xdu:)<={W{p:ϣPƸ5(*܊i?\Qs"\=^|t򫶞`f)Dm!9 %yr6C1BI 63=.Sm",҉_u;7v,?qO2w {qǙ8A igM1E͹4sgU_bv1";r9[aŭ8,X؍+`hq7UO>HK"1pj_1n\ A%HvS b:~+i2%2Җ=ʞكzi6ƸIZ=KҟL4(q67Ø)4ɔz֯ PO=Y9U&Zaa A &_0ͻueCHnUUBq~~ʹ8 O2%vm6#cf;b+l#+Vd!2Mڭu(14qt`FC}q1B5U0 r*bJ J1)y%)bi hDv0Ss RS4F,M+LYH%6&թZ/CdQ(e]ݲomN`BP)(IJ (`*ƊFYh  "fG?$6y\CINOMG->t4 tlI12. ,lԤ,|-o떾,We^PDj]PI'tA)tyE8 'UFLZ.vwaq B4mih9nw0s(3ƾ/3J(͔O^9JV ^kAO ҍcS{ fcjRtn/rt;aq6|h6(A2!($Pcio" ٥MPW u5b92꤭Y,l1r_W$$U&]:bjqv0A.ucVӍI1[ CiH16cb+Kr[;pcbP֛ӵjcֱW>i0Z9d^}aOՎOou֏tׁ* Gë'cb4 %*mקՊkH!H~T/E4;9*rQ *o y05 n E%^/^~Hʁ9\U61.eKqǟ>ϳ8<3/z9OdU+3=nol&" d;X{PX+;qķz}[ymR'l4)*83Lj.#_bA,ƝN!F5h6RXoqYpu˦uO6g oyc'LduW>4|:vE#Gf-<vϩ$&pzExrc`(CqsYJ""7QA)q >DQ״eQ H{:Ğs'X/kkh8xt^- x [ܙr+ õ?4EPJ jD3YQ&ʝVu䲶CЪ=0|wAλGK}]*F}iMb+Gw׮j!txs;܍o(OKWW`1skQJvx(krFsd1\aQZYZhUn4 {_B ';m fq%/Ҿ/h_C9QU@QRXM ֺ:+ #A!&&ye_O;zq!kBaǵ&LhS I_"IrSe_[tBά\ЀPOSʨvssPEs,U!㮺1Q wB@'d9??~}H8"`^}5T*%i,Dޜs$}TTԎr9G/8ATP,ZeUډrvd]L'@b"i]^g|OuS I8Q'so5@ߔ,t4̆#QQzR4uш3ld^|y O"'"itm>>;sPbkT2 N3^##GY8$x \ ì1@?.7wɯW">'d#Ot&vW @Lp`#&];c PRU}LG{i CcuzG|ZfWe-=a@!Y`e}3"m8Coe2i:3;dH<`ť/7U"< |#NHT'T5M6:tіS}TQ- 1@NWO/*F/ ǥeG쨁Ku9D8^~I?Qf9rN°Cq_4ݹkK#v4m`||~5oozMVKA@%\~q?^Mp; ?`;F$_#>ӯ5O#[JU+F,:l{˾uZg1wOs=煸ǽ$p }MM<ʧf#GGk/L\sQyw.xe, xL*`#+ǿ0tx$I%r5' R[惍YgKY36tBM9^nc?䋊8KrRc+n i`1uq/&g3rOyBY^-nziYdLI~M[9ɨWX\nT>e}N&U*Ú'g(eO0T@n*D 6Aрz+)M^ĭ±s~LSl7Ed *T;O%n[wSM? B," !96{5Vq BF00'_|#u;^{f}L{]1[b<ssH jA4q4#$3*c18-tHNJǧfPJKDsل4}&xH| ޛ&Q|Χ6Wܟ]8x-fd܊>l {pwRj!`$}(\EXN6ȇeoYL 0*_(|#j,~8v:.YD7IJ"1Ho9rTMOᩎl)` `6vmu:L6Z3.q %`qꨠG޽#n@'F),(m{p ,E=kR%O_o}rh͘ 3>.X+Ԟ &ȢH~/O+jc-\.YǴmV L"PG p֬I4 Nx/BG!?d.@ 54s:P3tT~t@?ZZp-2v'ޘKk堦ז ̓)邳qV~/9lКh:ǎ5wuHb̩mRoX]ߤ{~P,2_"P]Mq)8 <(ῌfn25"$c3m3 &gWBbM˶ h}hyUƚcYբ05BQclգjHo8b˷.scjZӓB*P 0qejW}<; ֵ-8qgM1keF~[ qH&tB)>Px!eW'jy$UH#+4v "ƵxLȠDҨ_]?YVE;TQN:hICzxW 5,Qa0.|j۱Ub3i08gr{b$0~yDv\Scյr6^1{NS 09=^.qsZxxcjzeM5,=0&EA_z%8@-]/nI$%/HhB ?K݂BzTne~wсߏyچaUEp.URhX}=qa.X)"_=`IP8i|Nu^y9rJ??.T3nOW#U ':xv8>! nO7z_eI$jlj" |]xyw4*quᅢʼn_\(ppܩ7v0" 2M`$ǻw9_wRcSGO<|[fC!<K1[O=﮾vj4vU4*/K+-_h%''O'\-h H]*V~jyU ϊUC0hYNq~;3vHY;Ϊq~sft3A:ݙِHw:sCAk]Y*UWvW .D-F&j#=W-1ݎ.Owٰ\T1` EYJ*Jnig͍acZ|5NEuZ\@<ظcC͆$;+QP`#uVlϊcN-&|x+Â%CLk9wn߯?K3ˣG3d} YÈ-|YWZFcw\+Lο8B.iXU`յ'C oT,0Ȣ7RJJ#jIXm$A$kjm8BAE!];c:i_7_V8h_*viE\UKi+i)5QQUMUSUUUEUZmUUU\6jp~6y7$I,[ Aé&V YORCL:NLA=v Y@ EŶ1MUD5:c61bűXfWqcA Hda@itI䜗Ei>"0v. RSB4!CڂZ(hgj"ہ"S[[sRK[m/ЈH^.@!&āYp fD 3" HTl?fpr 1"" @[@CASԪ?Fzpg>H_v+H51 k)م\˙dbz]͠,ǺH"~$$a.|(_eT~]'> \#"Mr7@Yn$5Sr(c Ș="|BqϏhoET?+]BiEPW!BU% Gߐ\?vim) crmFfR9̡KH=(MQ)r#69b50S2ЂҨCU E J%#MRDBG`^L#Ji?Ōm(?̥ؑ(P4+a2d(ծ6#QSERPA*H bLUJ)1%L4 2C4J0P!JĉBLx@(%jacHW Brt8) /Ӏ4ABC@PBLQ4DDG !M DP%?ބą+MAHDAJDE,Q4TLPE%Q%ADQ 4ĄTMBDD1PQDIKRJELM3 4A-4cj)*(Mf$!fHd"6!KC)PБAPCTK!D;!*j(IZRb&.ĐT@ԤLH@HPD1"RBDIDQFTTR,KL3Bk B!"P)$%F*("bBRbJJ$J" )Y.#hV"=cD M/`4C MRLHHP(Q@R U  CDCS@PQD%3! d43C,-Bĭ#r+p; `()$<5~/yqP(]Ogv:b05;wz9&hiBp'i-g)^fqʛ0e QG]/1\!,c6)l+{+Db"0Pi󕉁MꓲqpeMUQ~zCy1PE W08q0y`W`E= S ԥR4E D1 SJH Kt΢kxɺ䀠 ZOgt4ʼnT{]{$vFy[o`vvOJp^ O" '!^?d:&- 8,-saiUIa;o 0Sw4?ߗx wO@R B)KE|7RaV7bB@J%PIM P AAJ4^Vi(@qWd4?*rg⾩xD?S b%b,/Qb %2QB)!؇[“{No(. KhT) B-8Pbʄy 2$bG 2̗! ayI2@*|ܐ,GVǧrO?+(:?p)ThBO?MTGy IΉ$%>dǧǾ}1+ȉҒuL2Pu!# Å~KTg#?49v Bl0, xal.{6!TaaT$]FɈJDlA%-BDeN"*\i}RP sn ?9:/y?89S}`Kog!={ÈQyp4F LC\;d! Rʷ@1*ēuш=m@JD% QIdMDd(d rΊ2fZ"1[*(d̵Y%)hfx6 DITpAcs6*h(^o5T@ƈ7ٸA`%=5X4_DzTybp䕑FeF`[E2L)a0mgGpeAebz%a1Ym]ţD"htTrhk^+G\h 4#6p8<'RrJL{ھ5&0Ob+~`&碳ƌb0 `W|vo(0IH7)γ!T|ro_ͨi]Waf8I&7R:گ5g)f %J eI?L 9c>?IVe,fA@ јP%ЁJvK1[ (l63ynǠj"^rajߎ*3[I}㋴*:LsNjk_HK8΂ĹL}iI׷f:5åթ[ak'ъ@(? /!/"{d6~PkD(aiqURu5_;zt6>_Ǔry4癪_v nW K'̪rFR\¤2J^Ty6p o|6^,;Mٕ)L0'>s_GM'OѨj DN8}| уetO}$=(Q(%j~_拿9Ns9s)JR?;R/(ya^>ylh(/ތ?yxߏlj>֦\4tV8JGttx[,W Q9+H FD,9IF{~߇~:g+î\6D OΒqШ0{uLJ.yOOT9P=$|C8 Ls.) S}󰫼T;xQR c.!fmfJPt ͊@O,N#wUfnJ˥-pY {0 |IJŎx=2_%?/ [7Lz91lv/@WbRCE #vu{} oP({\T (4,,?ejvY^>\u߀}G7nL3BCׁpGm@t'> / =)da հX#pz Ap;#@&؉bX1$b`0S~CDDG* Lc`!?',Ahdފ=f2D LlSsW0is35L̈́mރ#tS *&,Qjӷ@e޿n⟘4MP+g4Ti4LrC0 H$??O W+˙yhogg=aq $ӻ|HZA PW2F(j!lq]0۟9ݠ!,w[5]/92"c 8 AA J"GeB: ۅ-Ω $Vv{t;U%%6#ܜuZ{h5O>G:W4-t9vY9^;$$"gA U-KNCn ԫ" 悋DOYp#+՚L3vǕ؁Ni"`@_%fNzp 3x| EB~R!"CŽ7)}PwKI6Cpx=M7 $%ey_~N,=3ç՚H`p/گd$LyO.A잸RY}yɶoO>뒎<^??#9wv}O>wd6=ajnjAB\:A&=N`0owph Ad<{nuĞHvnpnC=qn1G|{3&6asg\WçHx3Dֶ/%;JfJ|q5q6DGDq`Tets)*"ͻaYPqpV- <)3w:/Zel+!l.V )Mb3(5}#P>wdLPt. z.o}^7ߋe2C $b &}e$ `OwgKv`AsHDPue!#%#H Z1OYA`#jA!778~'LR69ǯ puwOt#_I.6z! \tC_+暠ݤGZ=Gs@EV(=NsrHH9H%n{MJ$nCBjB ̏x *5:NWiji)|[7E.:5JrELU9M?vB ?/U^% i8v?BIC v+8w5Z] z &]XJق""n俾14_ȿGns I^Ӌmڜt_5R3!`ٮ]7`'8BZL,0:` Q].61ẠlQ ۙEF1 :I@%`ǻ>>PIV|h֌P;y$r ]n4@|۵1iN4iitLԴ$>ϣ7УH '%*C V͛mKWi>!M~~D>GLu#ÉF%D*`~Y54IT%O Nھ&J+n㘌00b=y?ry!rԯϷWu7`rt~H:"Ty-w&؏1o!1@ Sl%w| Hm6;%(.hkZkf0^EޗmA\QOsc|*v]( 0n%nk.\=o_SwC7to"8o7X|a]ߩt"w jfVúӺ*ȅ>I*~4^QsP[*]UuvFEEzGc֏8G\-=?;7V]يrDB TE>?SKp0B #GI:aSL}no'JY\ߵS Hgajuy5PxlV7;~5r*,.z0 X˶2C^lk|3 =8htvH#]h$<=B6`d>1uar?8//%n4/.ަ[k@DN# q?JKV}7H|8Dġc<|y1ʟxI=]+ƤZ`BC"ͫvŵ.k:rR 4EK?Q^W܃沾oɛP%3V{#fe%Bk8QG2O\nF_& OS{Ltb;O?*jAt;߭\r.#e:-oQE ᗯ뇟^PyHɫf>ܞ'Q|V~792rWxӎ$!/ij׬@,)_l~q1ǧ/;E/goݿ硬_1k[g=g ^~rhB)%M#{G?5z||3s(UV"מ~kqk$X2*CyQUa(DF+;#5:@<[<3 c'Ry~-l;lK̖* wOR2׹tkJ!ՀͤXOrgUhg)F3)X'HW_ߏ4eԀ?gt6_ZLgMLa T X0;Ӈ=98?CƓ`~@Ѡ0cD ?V|z;灮L5䖙_v h zɧ &Uyks{> i@wqU9'ilLvLJg$i,ܵg8{cZ(\[{|!"$[8bpY T ]E2s:3cz f=.|bGj_oC[\wI酣% j6j :1Թ[kƑ _5: ,"j;<{S'j߇T5E ZJL?ۘj"?]8qI=oTo{ڸ:zZeBo ]TT(G)"ntV!U9~Z;4M5O?xNy{M (,?7۱38T-#ISo(|]n)SFv%Boㆸ&PJdӧ8` ~b؊Gz`pZN ;D%'5UR[$?ž|=@/{qʡsܱ'US%Ta\{VR"C׷M' ϢXP(]/3Zz[Ș:-B %;+),0g@xlmͶC93{F1TIv9B4>t&ʑ+<}uvƔGi8 DN=k_2О]-mE=j8l#iq*QP@(tbݜ˟{鞙"?p=jɤtN$ ")~!@3f'=~3g{AMv˵/ lNӠ}6Ɵ`$?Q938;= :W]U^ NU$?B,YS;3n kجۆykg k#e#VvB2\'ta{ $/1wѭ3|~.#X9d uZIB TLAOȧ/dbګst,U{uڝB}<jX,A0*rT2'mrN+ rlT!FZt%h7MR(Q 0$IF3 RRit4p$." ?<f>6_$f%5\7O{c dڣGՁ"oެW9X )[*Vc,aIk]OK8~] k"2mJd>RoȇG@.>~`sPf?cc^cPE[Q22URs}㛩db1rdp'a($OZUͳٛF( jP}-ίy, >^)!'qH$$CB&<="֛U-Qn.a LbȟMy'pB>byPLxnF+הX:Cxx$DO߷e;R*0,F;`6CB g|uzHu?"(%HF_T@c\-QރOaLCH.&O G !RK2rQ֎8CK㚒:1Ɯ v>6M$ٴpLa` = ՀùaWzeɝ!dd_^s( &#X?gHkO'M9'w l5~hQ Gm . .ߟȂ0>~b.*ljUC?ƌKt{h/s}u?t&yB"s)m`S;||^"oLֺm}:'yv` 29 {T ]6@ٚl(P#7 " FѷU~_Jp" Q$@jK*A֥~#B7B75H*NC ?KQ@HzFhi^d0$ Y8]J0~(3r4~_gղ"UcQ0p"nE|C06luX4YVe\" eE D:b`ۮV4y=@ t'/6|EE@o!O( ,bAmf;$iqwr_h.A$ޖ+B=u,j=Bbm v `x80 PdKr4ė"NavgYP^0/=_ ;? G"Fˈ4 苀b`]n4`2=7`1]X~Ħ& ÿAݞ{} R;+;^QT,TP~Rp(7e)7?$/^m9`ϼ0zD42Oul$2{qć ^fH5{xaqnm/<4G pp̌PYZ UZ?_.7Z:'k ۔ Q5l!l@.VbI`(/ß &?qڄ!! % H:z;8aݤun ex/$%r/A>_# >~edGߛψaCx%2W LZ sOT~ X^OgTߏg~SgA*aHw=[\D/o:j`S b 7.Tl=dv !B%4T@<(SeWjatqtG$"NGv>޽c[jpE9(o@<" 9|8}AJS|n. (~oWLC"@eMH@q C)k\(3<1o?u& I K(jo^$pBc*$ַE$X`k56$u NjZYUq=yӺI;Iıʂ ~XAGŅ8.,cNRGb?k:OXQ/EfLjmKY(^^WbB]]:RB M}ҎOusN%VLkٿ STjOFغb$ΣArHdm.%_wv/ la/f#һ㷈p1,X'=~/.);3ݮ,cKRgƃɷ׳jKubڂA.#_]xTEu'ʝ yj aړsdeَ1۩cz&# <aYL-Cgb ت>GF, Nl111jҔBtS,52kyxkܡR|APR0WnS28^=ݖ'M@QUi;{?{*_Xscޡ[ tv:$T/0CBP3 (` 6Jkn/[ٛ[oxX]WIJ8Hڜ4Ya8FUbyi<%Pn#b#Tb7vosXEJL0;4$x76!mx~@$4DarpC<!vݚo&91+1 hKm5ݫ>6,]LαM|]?$?6;Ua;vXKdaʏC-3DWEi.1)0W6!;1;9!z "D٠iK=}>ӧouNӋlK\!.rhu6 8 `m:)t[,{^E; # 豮ypԇ6Ilb]eBs8YAr3Gi|}k Ss&UmEFE#xrČp<\%/KӗR.8Q!ޏ\BG2'pf\2Z @JspўL9EK&ۊ1VE=[iHl傄Z,5SJcK#UUtCD#c;) eGJ<6YҋbLZK`᭡8 7&/؇.Wd]/ffaڥ]D@QY L$ȩU/b;KbjF{MX-;?³xӼ0s.oHRm?c")/LCC& 듈 `$i=GlR*Df5C: m2ɞ)SouP9 pbV)evB.3Mq2v0lM.|E#~Guq&a(Rc`lYi՝duES`{kZY 륢" N#Ђ 87',V36>( 3G"ݭdрHtqwʜ?7C?8|g,̽őK$DA7sQ@:)~^?s Y*(7/Uu0TʄVPJ~÷A0$Mp`E<2^Y8}9dށ:_2`Q+Hpd+ 8y0)IǤO_'pwx惺% 9Zem?V:$I!g9RN rxGB!CߟbP@ @@8Ç@G S֢\Wq.@ `Mz#&x IYז- -AHJM?|>3ҳsIdZTwO~g<Aa-?)yG6דg(y߻p5gUUTˆ [u1V+¼ߗ>'0'$d'c~wg^exvHdAE@@Xtg<|ߕɸ{!Nna${iPM$Mp'"Ł$"$ddp"mF''GO[SC@ #Sp_pb q'Cfg<}%3K&G %ϗ 7~;gja^ʄ LBb&K: ßz9ӫP6~/G$BWS?Wg"GnUڇV[h<%@i+~!+hPAw/^o\\T}BJ,ebQΘ/D Oo*+q'yfVFc: F+y$Ġ"b P@კk?q(T]rùb#=q*o^upy/ҵ 7:ܽ+RB~@]TN6* 8^+e{ mCuUAU+翼" SXj66#DTRT ?uØV9pUPdzK*|BI&LtU6։?^ ЕK"0tE;o7K'e|s3e]z0p|jD@pڊ/!7 WfDSK;8eei\v)? )}lҫ&Y{-U^%."? MGTN_%9 }3?Ӿ7 Pm:?Ƿ|s_]qbKՄ4OqYYh?NJ,I~]uv>TPb$-b`U⧄%?ȝb)t~|>wI݊NI$ $%zH?C3 /~Ap}!@j&txֽڎl3_E =?ukL1hOB !`kvYFO LX*"%ƙ) e &~9|dElmc̮>~w6]l8*5? ewِv#<|Yc Lâl#Q. eپ;z|ڢT*->ޗlҿKKC`RϝȊ !>yՂ FSP{a8x"CH-k=!O~O\+QG(,\?-hRH(OpȬz\%W/!4`L븗k*Qsۙ\z}5esgF0ˏۼsGq NW,yT?قvAOI@փxm{$z=K>}D=ɢ?qC$Ey=$ * `Py| w`LC%Cf09.RUE'Q δNzq$J}hC) hOzAТ^S֕yz\h"O>> *QI0J~* @'b"J}IqA1fׂiĀ?WV?|y6p)`ò<0{KM*)4C64tOGqeәw1YIaլdFϩy?&R93s mc5q=a% 5>ݹyNY:;ED:!~a8>Zw o~3)h\'"~6sIǁ{2|w 8LoǙj([MT?kݎ>4{ 0:l &BB5X#r^! K 'P}ϬOi <~ަ' s4Hۚ^'8 ~" ROa,KYQr5W6lkMmp0Pmjۖ^]ձllQmMEh'[0h6h_kƌgmbLcM8˞ dsfT;BJ*h`ZRUP~g8ЩO u6osu 5 e2X "}T"~|c#>x^wW='Nz.n/uKMXEA߆ic@ӪHp^cbp53t⒐<&/o&at`L!0QV|U.&"x9Cs@ ҨygJU(Rzo\R 7lQ`uݪCZ]FSwN>;1jC|`F#3tޢT-P>?|;z1<17*UgM͒BX){YSҍ+PɿyngE[ydj0S2]`); Lto(پܼw|`kU&&ry葷zYE s_|gԜOa ~Ǹ?$ :>nϽ6jlޔ?6" Icŵ{Ǡ+, @qLwrR/;E^0ܛܠ܃9afzնmmڊvI$nI$)Q y~_߽e}<֡\"c'OÁ0wLu>{88(_ yc4soNd.;u2>[s૫vL Tfu;"NK0cMPf[a432r_vuD&r3qxlZ:8ƗyNoi{γayM8kF!≠8z%I>[k#eG3FsRk.BQN3$ 4\ ;7btɯ>*D6-uzygwԗÀ P+ ]?L=_wLJמ`n~8+;qS0x eг|ɶ؃uS}jte7Wv{<|ڢ]$iN>~GEJJȗ_V}I "xFZ^ EIdeSam`)(=]M(:)MS~H)uGU7N:νg:YK keNhPE_]X«e\*7A9Q^_US _9:jB>x!,07W901i;<3vVlO# [(lrNd>_~uțIs{C Z>}W<<=Jf/7_ɧ937{}5~/d-\,lqFnyt#̡ڞW1G;}j[Ƀc#Nwo{c^ο7R0a@ KxY)2Ǹܥ;]nՋ~Kt~MП6D)t6}? uŲ빹ߪk]?l$ JݴW-MW7c,?\r9"," nO;g"WtyOE7 M_ࡱI Q`ױ͑w+vJM7-X5GcZ(u\mi5X -(U2*' 5znt͑ێ-DL@CqC pK csAZ"vm]5hӭ\g{m!10ꯋRLF@fP(y:ˮdʪGֺ2O̳l[ v-^/1pjL9"kad\^[\}u;%Y"8f ^}3v2!Ρ1 >;v43icrG3ٌs'|ў;A8ˇ&I"vBh{~'F٢޲䈰S5zڒۦӹt%ۡl>`ɯPJWm|~VlCq$%#PuTѯFHvFrn371Grˋ0?x ;jC2,fCø 1CXؾ,Ȅ7=zu}ΣuG'|}svGK?9]YeQָG% ElPBPt&6kC絯"2[uҾJo$ܨn(>R6Cb1I֊@vT¢~_ffpۃ$%9&s<8SlpQgZj U@YkYl&ZR+'ă ӖZZEHn}߶Ӭf?.< apRIjs7d{TiG^<6IndHg۞%S~@D6'APnt?Ԫ&&24RmHz9τslv_HÄIXJ'9)I^7htg:r} l섧xZќ?TZT{"[ ).B2c? ^vps2jyֆczlƣ4f֘Lnjd)^Ϳ,hG%Lѯ 1z5{Pԓz1܇W4]:f0V2cWUvJF45+2bJπ 0n&UѠ[+KT{Y|뷪Db4M5AHE" dJKQ>ͩȰps??Kx@E69psxV""?xˆ-)*m+z[,/uֶ&9DQI)'EV3/BBxjg"`wUe\JIwAOe=lqV Qv LZD@~3|r_/(7uO]Op@˘pX,6awxwD}jTk';],D$Cs؂\S}?׫0ˢJv ($4=V Cg;Jju*@:„CtFPۿ,¡xQ{h*SnehA(j |'d!IP͟kŅ-iK;y;T onڎ?sM4M44M4M$J9Cp3M(DlzH?R[ɾARIh!Eu! (T@AB,+(FYGZS_9q8'OP<ܽٺb3C;0 PQPMWupaEYf(J/4t8vW -yr BW2áF3J9j{hz;[̺yR4Lt3{73+}0ko:]꣼QjKIűX({%/e-}-F+Fl'cu\gQPÿx#\ڭpa sX? _ Wr f $VYO7wusGzQk>a:`.G'q~L˟GmA'ͣX9fkm峋M>:?ItCt4d:|NG7AW>*$ևwN u i3 uTt9 ē\2TOB? \SI| XI.9% TQ b(2 `.5l]bYʡCGR?Gcؕoy;opӥ\Nxi֬D1$[2|rg,7tCTk/ v>*CNYF}v-ax4T{s J fQ8p^xxE._KMm3UU\]1JUUU_;UUUUUUmUUW&y򒽗%Y4G՝/L$&}-q #u u?8~Arwxyti5q*!OxaZEvʾxޑu6 X*ֱ0Q7 +Hl"֍flضC!a׻ {hz-&F"^_Qۭ Hh$!:[XM+uDmkL pL@0K*lU%z 7M+v, 9 9cI9)m)*Rn3Byx%Wq_OHqM%s*Hٿ4Kq#˷X7=ņB*d %x}m2G kKܾ8mʏ*.DK$0v"ÙGYAX۵n~xk碯K 156X6?݋{CT6p$&FHVhVxIYsZIuq˱Tf;=oLU;p{ qECHr\, H<8Lygqyg 8Yr"XK;:UV}@=P<_3X\I7OwVA3d{9͞+x2Q&4K%tшt5YQXSvqgT-8qqa :%Ba?bQa9yӌS.f:&1{c<|p@U ;qZ6hO>Myα{d̊Kѩ6S^YHa)%όet ZW$56LO8.ߚuCN!u]hٔi=F2;hAyh[k4[(v~N%3Q<ӿ|9x>`RQ(6+V7ܧӘJ,ܷ]qk B)T(p#o)q|Jtz\>!З>&OZk;L 2Pn Cc'w (\-?ƙB>*"CAv@+j~c>j]EkP(F<&WHuɂ{$IR YQTP[6璻F fkcDqW&>{ȑ#c|rt@pdz%#EoUEa"v{ddJITz!p2+Lz~/S1W﫯6j+lOo\u^:B8vFˠ?5y]Ml~K7ZVnWQ"ᇋ,'>+;GœWz]H9 u#nLGI0f0*-Rs V|E.K3{LfInv6`amI]]_:/WYưY֋SzM6esZyVwt;/OOBISN)HIQEGybP*.OdB(EY'~UiNcFIs {>Fɘv׍Be%Vq<{(=Nχ >&mp +qliQGmo#DnjUd"(]Be$ϳ3bv V9#;+sHN.ߧ]1˝!߷ B=Ӆv\ ||Mohp2Z;͎nsXDP|-n=Ťppݤ^܏tDG)Q#548b+)3a]abpe)6]?ˁB =Ƿ7Ufާ"_궨^ҩ3NO,{NmΎ`.@( U `^^\r}9 ~:hBaswW:xpqHwRY w-p rn.uauۅRphbQIsgwz}8|Ma߄+iBøBoveK(E*ζ#Z0aQ%$#`~ _@d&/# \CĆ{h%VG$VCBb7sYBtGzeh#+!F َ(,>5=Nfu$o}dE ΪT em=af^V(Wc[X{0<~hƅ7QTExb&m~/v5[, )2qTlF" -x"JUEgsO0AmCڽTU%4RtMVFMy. ]̶͊S1^5oae ' {Gu,pP zAęL4O2s@7Jx0ٟNJH"7Qbs۵sry;!as5ºekoQҾ sCAn_=l#G m.W9rr5pǛ£tm {BjG!N% fcd &2!`UqlƠnME? UoϰwCwlAZ(臅4K-<ޡ@>58퍎ԃC6y8qqoUMw>w.=-ܥM+wǞ2N!C#bu"d~u>̎&K&m K_ CFHRyFRE>Nŧ5ׄU}ʤ 2nuqhct,, ^XWݲilCcqXIG1gats $Ďi:,[M$hF]uuӃuwA-c{=ΉߖB^5+xzQ֋L:|`P34]AUbFH |^xCΟ/Н{`q'9Fc [M1SA#7 Me^Ѓ Q.J,ݲAEӾɼ Fbv N- dZN|{jj)g_, hP ]9݃QC*O]9lco\PN09FE^TlXܐK uKǽ!l0l˜$~{U @E( ΢0"=,-ScK7&g?\bh _?NtK֢Y|D;Da\ Ƶ9EJ1(g)9?>Iza_\8!R`R;ʇ'䧃zzaR" @8)QC7[8mWjS(<F=$ozB뛄Hd,Ctg/C)3IdAIUB(ͳ+ǼZdi 5HRXʕzaVOu1t@s ~YR#?ȧ5yS432kSͳ1rm?_4 Ge1sJpjE9=ʆv) US/kg߾X\Xc^"w!Ԉ5QMcf׿S̭]Q8]=ޠtÎ{8kķ8̺OX֟rzH.^89nQB;=d)v~oH,#Nu%N㴨|=y^מG2]Wr]q)1X e {2 [`3P>5xt)a2~O1[oJ2V(jDXKDrU}u"8]xX;ht=(D ~EW@k0k|DUffUVfeUݧ;/~PQrl`37Ibf\ak-s_6eUWT3SxFQKaZC]vi*&b0RJEnOM{rh(9"q>o4UM+ `RS U((Gߤ3O}Vf-q%1ǂ!u^դl_8xr^&nB@8ؒ~T !_g.%wABf ;Ćߺ YC~|M8a:}NA"mKvA"ksy"]ҧ4-]J$ϊa@y,['weoE1 qY5nuF +mN,-ٌV$ * Cc5.H'V|sQ2>?V_cw 5N+un-,~ьPVʽ*_'AD3SX-Nx8c C~e΢җUt<>QH%;4lВ4yޭK7˲# ~O?]7~ͩHigtQѽF_]{BGK<H"K3fICtcuӒIwN( #*~8yOHi{WkTR!JdܝAE&}{su[pr [Ү,&s2" z(JF>T^IkL̓x|b&!B5dDx(Fim;5GSjo?ED|3xH}Z>?CTn\Ep"!oKR7p|x獾=L2_k{N:.g` ]ov| c >cP2[_|G`~̘N&spR| !R=}gpm;7 P*ƶe]CWO 136 l=Xu #LñLk|C>#88~x "Y?vPpЩʦ |go?3<{+w*! jf} f[#, `k6mt|rYM8e$99g!~ۜX bەCG@M G\Nqhb ÝH{ IJaay#Ư Tf Xd:I6=hn;o {#65Xå1 =]/8V &J*p>_NT=?6#/߯e\!ppaZ I+MOz|xso[3#KDn 1wpEȫwpQ.GE[.=U9sbYhg<ċMd+HeÕop }bmcĄF P:Iy{BQ<5QJi¸ΰOt;8yd\Z>دgTFq'2Γ._35su!ݤ2"W:Au:YV Kpnr-1}mP\%ʪ"GZ\Gv4@豙8%ݽ`^fﳸuH ue,Ozޮfx˻n p3h)X"%À R4`_DR 8_%=!L`n協HP̱% 0 c;Pd"2 æ=aVncOӇd^7D"d]4JqʹK$cwaG,s3ߊqz!@:tˬN9׳g̸xijXl,(y  9\ ?E=Y,sy򅶒0BR,@БN Lm蛶Q. ѐӫK̰Y:\+'O[?S_[)Y6k91͟|h6{A( ⑎3ZQZ+tt#&5ц?_IؑIs vIT)i.A\5 9ČAwɳ7/]!&.;r-;yeP%~-U|6Z`GSԡ o=O{cHa,TL$฾-/mlߣW!;lǚzjd&e BUl x=$@%ǵO`wZ sq#r_ (9zkY.WaIgxC[2T}{'Ў$0ҁ<$^yM%ܑ7 ㍓20h;R˴Hgs("sh>nWu6rGA=T̓E YRXjTeǧ2Y쫌^xnhYCQ@kƎ*!;#Ծ&?S.pg>T4_u(d#xygFndC}p}Uu3D9 2dɈ&sX5&qP5OSݯ|ྮk\-Й҉⧓1+HG|mZ=M& I H dO4"ɝ12h%ŞXlS>>C ERpwBn*6]%w#Fs-Q)kQcpXQBѺ)G(;Umt]GCMԾD-p@Y!\5T=]o_i~wuPOE%J2=͇(5_}L!@ 8f&HWqwm( N(O88j􇋏DJW@#vZnrzgZQ`.#76SG/,ܹG;_d+ワo3ywݨ?'满x{ũ1d)h(=͍Āݏ(sۂ>0\?r57S>7stI dq)h.;`;xø gGm,Zi 3\~xgRP/agY?Jgh  ~~|ȤzHz>x_O -^K (Q0tGjY4yz`) s r<|7ea<c𔉺OX Iа_pֲ3|J|QM\t}rNYk&(h 9g*>j$OIϖL@.!ߌeɑ 6~% B>sxa&:M:TIDP򵘋]ܝxBu8hh#` gb!GoH EFbXAW]W kIGm| 1~ G=,jsqs&Sҵ5+Կ{g>sUhE= h^folk mp }j3l&GϢ5ߢ/n0/6S>#g$RkT 5O}f%fl "%G 3GKK80͛ߗٝs'aaYɪ-Ʒ=J=<(߷xfc Uih Y%N{w+/mD<S~PqEh=~H0~ұ<cgh1֫c#?-@TDkMxVI n)]9"$Vj D,J."GaH?We=#.Z˹[c:kM[w6(K!fdwceY^MTa!? Ozhz-z2~^z^4mq%p2k}O?U9XLK|BeE]Hܶ/Q T^T+t3jeuQ _*-__Uq+HiPY't܍ᇀ-?0&fvfuΨ'xA|{?rUZl2ZFP?PP^]9Ò%.10ͯ IXlxBn+x!Z<ÙZ}e_q'To"t([k aPoڛ }'E h{3ag=eS-.;|E6,Sݶv `";ߩqbp= })'o΀%BU ]7BredsT8v-D0}S&sF}55Nϒš})!9*(|Cg[ΐEQ/PJ"wpwixPt pOйG <6輸h{ ?y^\mu?)g4cn02Ͻ5GJR1G_7BD|b5ɹg9Ht-/i EF0ǧ0p6!\MǹHS pou`zc,ybI vG0H<>Sn,PZ-e𲀁%K~aFqIxcc_XB}`=^g:ws*_o+_JYM))Z&J*|t:=$=Ͱ$嫾C޳D8paBN}!aD.,MQGOWp ` 1:BxQ\l>53$.-OxVN2ݛ߽:эBW|/pZ߇^2EhmoEliUeqDX76 JPHi'  77sǼydW ~>x9qEBƔZs.xfWC)EOir;CyǏٯ V@M&pb ˆB0x%1yF9ƲqsAlD۶xx``_K=󅦥TnHsrLiGj ,BPq}^Z \n躞th{nW0y2Zʺq([SaYgt1Y*b/TE;qE.KM]n}Fe.5B/m 1GJ, 8fQ;M3](hJ2%Bj׉RK% Setr š oF`6%.Pa#`?dţ8ۖR2yOPTSr[B+̜@S/X2{,\]$dR\f&[EPs*B(M矷G O袆D2p@x@HX34ڞQ@B}1lk$@"%I7 s<1 SJ0 8h>`5}%}uQ! G[]t{DKD 9(uk7K;*z'L=:] +0nb `9 \J6P;[JW-PyD )f?  析|v4L[څ'kn?*ʕHO m npQknwP<PTc(ϖ`Z$0e@{R1W+ Ѳ.tuz囅Ц2ҥk|2kNw:D_QP9[?0x$AWԄa.oyDyqNu[0{}v "@w6*%D, ű 2nWRrS#/P˰|t-j&rF-@%v":v gݏ߲06Z߅M /*+O{ %uhŽMZk\]8l ۚf jXaaج4^.dA">N@Wz&/úJݗoMG8%9^\ pnFeNog;ÔZp_AM+ח:׮wGOQ*M'FXڞx_üQa> AU=jj>W_ vRAV yʛ(oU_;v,Ɋ8bT.=Y@R#D1 +'\,`(DD!i)Qb$6f={GGsנ񐲨US6*B-B$"QDbH~U)QV 1 `'LguHz(F4G@ڧ ] HzrqaRj;; ^Lw^#T<$>UGk,O~/%ylpOQw_pȋ:ѥ!N앉 #?9^2B=aXc/~xE(n=#/!ƛŬ]Mqwłֵ,];L!C ~z-8 D%,69_]VNG<ZQ:S tq9oL3y}+g0m~":x[Yޚ gy-^ ^qnv5n>/|D"u㈰< Fم,꺁h,s޵̚av51ߌw Ì135Xٺ\=M>aՌt@fnߣs/ݳ4=e޳nE}1ܙ<7drWG(TW<qTr)1:QO8%a#sdp:xsl4U"qYKD_Oy:\IGa];7Z=worn&y}ԝXMy=Z7Uno.V8;vM1(fiїhM_80_Hm^d0`U1|Ů֭^`έ6MXeeLr[)(@rƹD^?)d,H jְ>ϛ9+X˴ÈE[xXjx}6 W7lq>i>^Gԓ4Ƣ҂}'ƽTψ0GB;tڜ2<Λ~3nfHD^jgm9Pv_|e;Mǵj3_yd9nD)TمVxRpij:ɹ@x^kZ^ ‰z\^qOh2Ee2EfKC;싄K5$l2dg Kk*fKq63t,400.ۮ}Ѽ7qǵnK%>"9F76c5]'Q<&:/6gj<,Ofg#9h uTYS˔D=XK sJw'4ԸKkwߧ}h!GE_\ :B款Dg[&q==4>Y^~V76r0y{prb<y[?m9%4xŽbwob@!b@>}>+\P[9IkI2-o5OWՆھWjXS`e^5 .|oP6ZwhLctq]!Wlĩnd]YHyx/j>rsC` 432I8\N0 \#冨r8> l[cֲC_F*"4ig,^HY4-Xצl.R{|{AD%ש,cs_Fi㱏 RݵiDʹA^V 2WhƋg,]EHCi UZm5gXBȒl)OFm.O4cfT{9{.'3#ǺLA 4ӇzwJs.^Eфe8^r٘|vͳ[Fk1}X6;g4qVG艥<3P|>b,6"Neca,L+Yms8tf6*g033# ulS:nmF!57x,BƖ,?U%u<*: C2'Ŗ+'`\$oPV\c!bH[l>!ΐ4YU' q|kGӺGn'C~_cLZ.(IY~X+1uleM;ZSB޹;oડ|~5Rʢ7%#rŔ4`bTyMrGs >6IcrTG>Mq78㠨mlhFD0ihoќ<#fKr84 #2n~Q\>M ~w]0[okW*g70i-Bė!-Aؠs`Υ85Xc{Q!i9n8e@tά~.{ϣOgP^Ua8Rt/sRU䗔DACno`qDԞMrzPһ]tf9/${E`U>YjqM8?^7Kr^Lkw'%Clq̝3:7:F0V 5n6O9&P9Ā's]q 恹|UBBXm8zzwTMtZkSћG|\}t1E T" W/q9%S? |Nl4D36l9)2syoċP-Sk%*g@AK'|"ԓe۴5>lylXgMJ c`ZOiӺJՕcƴ|Ξ# %cXbb[VJ2Gsba 8/1J[vKS_/x,/;.}w$9_ۀMA)5(b!3EU-A*ٮS\p6Q"H^Mgw DYTy7<~@$*X!M!M&=$^a8>Bb(`A.lB;F>BE.SsϬ,rGnI'lր>N+( Is'I!3IrsL%O,Ęm[Z^5 ݚկ4C `CUbx1I\q†~,>hKB\b4c u}W2oӚb1oºOݓC>χ3웹=L7 b/dšO#0+(m<Ԙ!D /[Uƙꋣ΁}?n1o}ta7jk|Y45pcgT;D*w;T'D]S|LIZw&>,_NpD!IP׌ W;2?%`ʵQL_s3 _9SM̷d#X>9^=S)g>n#_U/sD4JPJQJ(wɢ5lj+8…GxAw(2}!\}.w;w_уϽv^<#D*@?;$!@׊` S Q Vw|]XHR WT,=؀ P]VT(hdaY QJ)ΥOTpm=Xcs+QGM;couwKx'CL:G{e4c `2lN;E9)’b2YҝijI6exD-a+=/ܪ*|uSzflgh>3?N2bss>B䇢q 0bQ03X^CgwSg>lhIϡ׽F"4:֊|&M䆩Z:i Bg7H^<=0HaJ+A DZawҷ|cJ'kC{2>OL~;['f7Luފ@wd(qr)¿~9`PVO"hx[^Y^7AǼ < 8~)9`K;TQf?sԿJ† +qy-1矊Q>yDÆH($DB$ڡ@v2?ZK8|,4p:GD;Q]G(Xo|g_'O"2LR >t! B]pP_E=BYϻH cfQ':I ^6.ϔvr0Wy}?xAx=wt`H$Q>K쟳 ,|[V}Z\EMI4&{4&MoCOr7U#M*e!t)[F?CM>Wo>?ł QIWgeLFģA6u~ L)>>Nv%QA?ZChmMOb1!,B>lDKqN?Xxߟz ; v W/ѡ'CmPn,<7|Oh:mHtٶPB}\K;#l-hl e4խ{2aO$lE89#lwvqR}7\cGNR)8_̿}I(5jQӿrH1"yI`މc*vĻF:l+xNy Clmݞ߉O5P_`YFHDb9A(,_bIntgMsipxî.$[!Lq!g [gt?}ܨ5!nFnU@F?1||HpY`O'G D qևT_}_woccΕ3}w` @joxӷU5< qwfg{b*#vm!w`'WV_ nnي~A ˟b篫? o/ODL^!Q%G_[ 0?!0}#PT?(Wpqp`۝4| d)*J5.p[45r&h{67,5cj`" #y)-9J:FhKQX"(&& Bpc 䯅d.4>IQ@A)> ǰzIu#?1O_j$-?ff}Dgfca흂淃@ hš9i7ÁxGMY򝸆N}uBؽRϮ dQ!(m!t]х0!ZHL(0Dhii ɬIQp6&՗ȔUąDH@ 2RP a} wwo7'+&;_` I8U4Y sR]Z(ME 45LUhhK2HA]4+Q!rRz)߫v_ʤ*z-ǕP- h  0xgڙڻ䐞)oImOst{5`!I6?KYyܥTcA=L8$xa:OKD!k:$R'` H2O-_rmY]~wOjT/#la ;3_.O>>r>V?&)>w<| K@G"(]|4=w:i`GAdHoDtGZ?~Yf~nWw65[oVO^ŞL{5ʼwCִ$)D{2~swi *UNKKi(XF_{u=?/?g!6I@PJ%;rH`l@wWWf0d^(BDE/gd{X~/k [B" }vr?27^7J= $F\xW+wS!wO8% "^ASl@T:[Øq9p(JAi OsJQwbwv$4y qp3BlI@: @„'TzWLo}en[R^⃨)EΈ#z6&vCmü,%1 Y>ڏvMaIP/庑Iq#y]5uEbﱉ BQI0T#DDpQ}OFM1cOc?VCWûڼ&0-{|IxТHAχӔnC;oIN s$ '7?9g ~r/ۭV#.Ffdl0"g1WDº#7o)3Rnf%(] 8faz{ i=42q0yqseߗ1&ei~AUDH<b~OZU$d$ã<7cߧTgw^0O!'D7CC`>ux,>䱉T9^kb@#9rmG&JgqL2376<%VYE#8kŒ=%]ѹz~s: jU7 ) U(+g)wdaD;᭏ \~tq/j9_ze5ZgXT< cC4>?}oT8D !| fP+?Q `b=l C3&gm!F33$cC<粫WAyg-$1+@Д44>!e*v${O@#W>ct0$PJ>O)tdG>'9]aL]h~c F߉jl" G~<j\vn|_$GiFMn٫t9 ʫ)HQ @ {(Uy8Bv*p(I6Axud@x9Hd@Jt S:`^D # A?0`Bb0<)t9f:fn3 ~8?6+5?/ȁ+k S^APj֋٭\8.i4!CAN ߽ z1ʽͱww_02G pݩGѓ_9ek%~ɂ CFf3FW:LaYΝ4,/&C#,4EPdƢN0"P;rT+DUQ?T)X{: 1%v,D2Ӈ~l kTW淉eP)FɇOy='޿D=\e85<ݚ= 1ύ[J2y&ytzp7aR/I qUHX撎xxNd:tvЇNt!!3ɁkwFmԅ;$m 1j0tOZ! aIڟOvPBCTuƻq !H;y:h Qٰ"eBA*r8CM>x6=?iF{jB8vܮ C=tYe0s*zz)8y]S7qYHv)8kA HoptNxtX9`+C?s֤ v6g$ Kٯ=V^sTM =s $YRta"u~믍x,ӟ}28QPUQ%3ϗCB^=ON=N_3hx:U @AFdÒ>%g~KaUt?nz4@y0jIorq,i8>̖&,v&Xkb(2(m, 4`9&$ m 1p`j"J׊ÿ <  A ϤGEG妟2O> /O8Y@!ә1ٍH~Y&>+ms=O~>;& f:"\NU3^ $!Kɠؿ d>!?I:9&(%Xo-|Ֆ!qD ($uY 0LBmXN` tEo 4 C"DGo[zjCڙ]q٭)6JB P&@?iO;T|`@oPzP `m'$1CeF.؏pY<˝>/Hiԉ!Ph=!vO4%yyP񅔂OZDto{y$` Z*4Y' K>SȄsԨ8? 6*1s7Pv꣓d<ژ7sc)7Q&[]( LR>3ls҈kmw\peyLn\)ߋkz#^i>^n٢Ugo !,Ǎ6eZ6c7I( X/QhC!aIˬ~].t[,45iwOո9r 5wksKEUG| :|l<(yVmg |:9 1pNp[CUj8ORG-êR)#R\cWRc)%g֝-wNqPs$NX v_>mJA#Qla-F 9 sU.#U5;Gba8tDm;?*ݨ}T{6v%e7Y|鷝Efx smdI7Onڷb|lhY׋Ê={'g.ۃ77JʞdP9CO49)}:Ǔ@@!rx!='TsB硗_l1H20Je x_ !q_w^:[:ݹ^+3z2`:Fl\<y-d<;﫲ic6:A<7X?#0o׏c#-@u.Oz# {!7xy&AZ%T0c\zve@L *gX<گxtuEoFR=D~Hbw0èFCȢ3O}:Ǫ\3})@6h--x.=E& zGTܪ:s7[~8x|6~S`71 Vx_"~&!~h4F#;a,!p(ͱZ3wA AAg͐rc `poɏ:\d;vwcz|wՄg1 4Egb)r{aZ=(u)}ږ0ۺ˩kl.2(Q/jf;S|z! @@;ن$a ;h:w8łt@[T `}8vMǐ g~;EQøL-~vu[}RApM 3[]T! .gs%G@Gz7VY?Vʍ{FS >#stz{7ˢBQ0`e @e 2?^>p3voWa85`'Fk>j(܍\zq8G|x[=}yn;iYyD9 aBqa<ᮻDtbÆ7: p".7Njww٭x7$ C `%l~Ynr -L00.Fk GQۂ;vx|H!yޕ pD@,ug Wll=Լrp〈js&}{ *]Ew>z"szH\xoOsQDm-w}Ec`K^ ;m׋J|k_K{ 7g pl{;o7wLŕيףDmv[7ҷkcO?2jxw?}H# |d)Pjo1^ei}6㶏IMikdŐhJS;9߷;F\"B,g5:GcY/U`66ɷ#[cӘ)>O.8xtl^ V]%";]cwدu+ָJraHԳGadR #oD4Հշ͛YE ls2O'&vtW?O6U:\8ONnpn1@Grd;秆|Q kn?":ck}Te4sS*yڳXyl_Iz}BϴEBcyRsuAA~*;~)5PN(1C'p}>W^G(ͦiC5 |l/d*`b0x,xs^3>9>F?X^9ʤiU.G#B*)Ϣy!x? g_˽:9o#m}O G8(,M.pB?""_7oɂž Fr =JH%XpJ(EPl aJ,{p-wԿqǕw8@>ᠿDgigb@!z_O.J{v8F;߯=z} }d}KA x~Z MwFu G4\ԝIǂ竇<-oZZYC5ݧH1ՎYp18 Ug.HW+mABAj虐J;jFtdDǂ>7ݭOˑ>˭p\ΩvChsՅ%jj\xö ra8pMRK*aO{1 r5n : 0`Oiմzjg$uTK}R"h9jvnv7WDZ:EL,ּAߒcl.Ꞗp$$'nu|mV.Bk h)T$74W4u0~m5eμW $rzR##;8B5¶K/f<0w5aF-kYVSI(ݱqꛃ1 :eM`d0,1~ -~qֹ?p#l쿐p~+92;oU1#["ݝkm݆ /jD뿾.yÚ^S',3% X>%f z.W<`Y+`ư}2#kG*F\F o>=F|/Yle?|ӀXuK٢*(xd6,XՂ25 +WtQ/$ = 1gnNӃ7͋ /s9xvMnM#{]y2qcOЏ.x:7D=[2Od=m8;W) Z0s>Q9ZWO`>9;6u!7Jx`22i 69 $꠻noWtQ߇os;x0LwȕUzSCuw+h*.;H밅V#ésӛcR=6\xݣhxsV\8OS^lj۲tİ>״qk# c,I(FCEsA1{6aikߺCLsG"qYag a~ok\_f9;z|Y1)B*3FċRO޷Iϓ/ vVCj/}{ǟ_j}_OgUUQTUBI$H% !OORiBꦮ y,`W5瀢*=;wa τ,aO8s/_#^dVOkLA{߶PԾkE+OKNeҭ2Tx:ׅaVwd(0۔4"ulQnfn+wji[DӞCUUQQ@B6!CHӷ4B|O )s͸֞IиixAvw/tpJuYNnʈ癍 1AQd94N]uc99 0*XoTUS-y>abK{; o }cgE~'EG\κnKŗecv~xT\hu|=p]z K_.(^p_a lsu%-y,$G/ Y"&y\%#ɷJn W뮦 G^~v@0q@ h!ƽcJG_f8䘓Ô Zd6}5Jy=fxl`S43~-W?ğS+@sd~1UAJ2PADL, JK%$DK 2S0C4A#DDBQPBT ?4!F ^@H6.kjIVG HP*G'QZa2LâF{Ľāc&& Rm)Q1 4aCD”HRBVء61\tr ,T%yH1#1.gPZ :Ga 7 A -CT@\|MvV=F"7@ÉfjB$ l% @Ɇ95182Q!;"z9@%'1M@`reȐB'lB=91w4YZ!PGpܿ1 D""eAYͯղ#IDL!Y3$>lE%h8h֙H#oh Q>>`>,6I璦$M!ixX#*Hδݒ`b0\kvrq b1$M0DARA덁sih5Y-$|_Ü^CZjњj(6E"*q?T'ͿUvcގ PPe@#e֠/X!BvS4Wgb{R\9Bb%uJf)US8ЛI @KB+r]7^O@ #f_NA~cʫ" ~זv2;0UF`^LLԥP @~L_B Ϝl!_`G2! (ͅHĔ|NT:%C25=Q@4%D,B>rE1--JP*&Z((,D=JEm‚%dG4CH@7f/?^|C5܂ʗaR̓ځ(<*N8pيT#B\ .n&'FJ* F8 -\!;R.ԔT)7fV0 k t b5aa*hWʀx4`@7oM(49BuK{i89??ݪ` RI5M5x*8^ЯqD*l~9>uc1g3`At$iV6c!W\ gI5|[Ǽ.S3o_^uo~c]fKauYx9AIyFvwݽNb}Â!^b p0MK.::slײ K#NII%B" nS9Vu#mo)$!$̿Ck-hj(X*u3v{[lZΆV(ku>N qv"N;yN]]"t'YA[&^i eêdOui+us幇I}`(wMǛXC^gPXb1<ϧ^Ϣѐ^(-V|RrJ O/azW|TFGLv^GFc֢rNƏ'G}]G^Zk pkN1)ɤf0[5oz74mBe d$$ aRgZJWSFζe&o1fcn#wW55HiHMA4-MÙn=s0wIRIoC!2s@a24\)HrS~'$ JAW@0Q>7[cc:ŤΓfLJY*cfV㫇B!Di^wdLZE*+0 6!Ush›#F֌AY/DM3&LmӨ2 L 2j(m DQд7NiVVehcF̕c%eε#dVd5xwѣTF Zc-iUNhIgT5 I˵U &Bij3ZtH`! r kL%s09Re곒5(%흇0! 8e1b̳XxʖBΘ-F ӻbL0+hL:Oyy9#jTb687Ob@)QE 5S r=.CBy !1Ax鱜s*=iKɨNjpQS}EV㯈S]^irs?T.lqqr,FBۗ<* $/c;o7eCa~un՛-d<q\!O!`#i%SǙp=jmW8TQWYI0qZ`ۊ"0)yM5>2$.Ow2+<[Dz"}8E:CAV_e!ܻr7)d=])8Z3--+K:u=|evOIF*ӷla;#5}K3b|//Xň`N@Z|yӲ|Z1P9$IV_\qvʖm,4ϋf@"$U+8 Y4A)aJt)"Ba!"m9٨tYdž}(GoJx"yhʾJw MUޛ \* /#yO/F6,6Ү!A ͨ; Gޡ 1j<@] |y(qquNii$-P Wkesw<0QfDm'gw]s c(0@(9H@+_+o pҥ<v=amǜXxiP.Ac9!$69:vLJ&f*[xf;prYn68!!7+yu ۉg{deݘp g9N@ Y=&΂f(sG21~OG؀"x !i!A=aĦ̏߫ :+pd凩%8`@ Cx㣅r18:JT#dŨ:;NB&uqy8.tb% &]M0DJ@z7f[\5&k=gway p؜0i=×oMhx|»x@'<ңʐ)$B +(ת/C.E v]è^8l~pBb";M¢SUxYŧC ,s**^h:'`H gƱ6C7b"JW!_mO؀5eV2WT|6aj@  7j#B6xl=O[I#F!yooH:G7u|uX;z8t8sA,׵yWV1p~Fgor HuUMqpTᵣޖ@q~CLvǨV" 6xQ o{\"";w=rZmB>dm ckzwi7 -$$lL6?Cа&[Cn (%.m~"u f^s|pȑ2<0r:O9`Guʈ}%JoiHkq3ۂld>R_/يZ>2lt֢0t p.rxXUsmx|7础׺Hwν[s,1sokJ\}_;Vc\P\Q:^8DHD+ >_7ӳyV΀w9GH`@-bp *3с?/ǮȽ?sܵt[4^i)R4a5vЪ.x4$qgpp:a{km)gsjwY Na3K7/VW]QYLac/,w=nR,ow>6 !TksYQjGf{ ~{Y˟c0[b.)T>;Cp?l➶ͪvM LiOVK ΁$;49ѧKP&{WC폻n_gJ%:qsǃ+Ua^ x(v!Q""#r!+(['f>~OA!x!ԥSRj*1w abyNj<ß|O.W芈w_16VZbD?z?kC a$ RaXJ("9{o>5;bL/Jjw_/{[1< |S0dG?%DW}K5\ӟ1L%xz #Ouo{Ƞ<Π.c<&,q?os .ϻp qK\rkےIQaz$=wv]ỎT3GdNtݤHUzŁt|K߯{0JI}ҝ䐿>0Kتsq0 a4!>)s8glMNVb&a}xjI?b}P|Ϙf/ɂ 7&iTSL$Q:~!L=z0>zEcte\,ƒxo=]0PlC.$E! 4RSA+\A|b9 _nii.q9WZN]c>OP蟏ď"F^Fl2ˆA${oY*M8%As;rp,D!Hp [V;- }B |tDghI_?#? bsԄn=,|MZ\ZBUd5L2qKޱQ$SzC߉~0V4E") #r?L"qWN&N|:PBs!A>6?ɭAvBvNߑ3.j3cd6랳H~M}]s+SX)?A,Ё<&{=­yb;̙颍G-J5$í l]xb"mԶ869a_ވolޙ7qw'!E0uXgs)fB$ P>YD#xQ4hDK:k+dM®,LCw;&X o!lԾmk:qxr;F\LR^Oﬣo߳s _hy^abSW0YFjcǒɥ XU郝9Nkd^#Y<^` [!xW&sw.Y9cR|;`; @|,H5^ :޴MsuO 3|֋tmdu mg攥_a}Obn]ojz,{zfE],@4_[}O!uXoYCnIӬS NOڟ׈YDVm sߧGj1$ PG/dA'GJ( H _"U<^=Nߥk:  *? 5iS7A (vMP(=)/BYf gs#CfʞM(aAKqĭWI~ȪIkxnbQ^BaTR#0Nի_{%DN5Zvm\F&7dqD/ vk2.Rez 5=,1–@F"G_彡z:lfvwi} ދ̢4sn7ޞsrWgW&u.>Fm+YnXDg/[[)AD/D.sv9S27ee-N넅OuFZspeQety8Qbfb7,ׄtaь/\o_ tggm$v{lt-`k a"ej<ޘ@ckB۶M/tV׮& 1|l ^n7aD[ߏ}U+fe?ZS(GͿg1`Қf|,煢փKբ{oI4Ζ葙pvV8E'v<Οޖj7~7WS3KΕDJ ],,CÉJddI݋ٹLYxw36 9EC"e5 Hqs@sg9iBCF:0_W !47SQE" ى'7z;3m`|uwŸh~?Zx6*Q|=Norɦ@aU&bhD#eJk ,Pe\@g 5E pV84_TNmF΀lƚv>!xy x}4=V\8)_=!lz|I~kW&<.Uv(9ٷ?g{KPn{rC{><}u!` %q~zTޙ}!w7Ňw'hЍ#`PcJŔʊ(TWeYW_Kv;|Gٶ_}_]; úL}CIoqMETh07.?=L`;Y ywBNlsGg>^4Ju1d=zGMy;WsSdxal]w䛄$# ) sFJ";Ԟ]O:ル$ɾ(?i3 oCEF FPRa) S !^ޗuetFFDMCh0E~4(af!f u>q&BRogHyȦǿyl@:N+Js]Q~hPLA^!0"8ɐ/r&a0![/A>cL)C4L23 L ~]x۵2+UCH@ISq(=j0* "8P%`NhW>l}'~q@3 DG+HR /6:J \6|FjJuu3_x9k1`B ȭI U00u[x\Œl)X##bbBk*2A@:B?p"=؊{wQKo6oRa l S—LiDžzCy,q -.` ɩZQ%Ȱ6N9! e`ꕲEz+MLS+&׌x&ްVc(h=39ܢ(goQwtަ*o\aM( qS#dA)t!j.^!iMc>;ox ;+}޷~6c})΅|bn YX;9DOzncN'aSluyU"kÝ떂 ;sh;=UCGʟ~}0ȱDhtM[#5v6I\H)S'!#~#^6fC.J)ۻL^ưXEYMvH?TU_1C~sL~O߽^7tM~e߻on_)Q!yĒ1YE u{==*D^/gjj`^h_-٢ޚH{n&;?-46y>$%=px lkiDX 6jOź0LOҹ҃bʁ||\j DEJIg(Y$9!x]E]h0dRIRBn##rĹ`t'Đ2,?w~~M+k"s++X_䳿ۮ T Wjn4O]ދ.I04A1+j5]A3$7yIPכRP@,xh 36Pԃp)(PPȰJE ?PוN~N?LH|%e%0䆠Z፺N|6moi2ٶ[t7RDo<Usvc6ow!TJBu:w1X]vbd"OG? B#q z}IL LW("g|EH"pglL_.V[R$WT(`xQɤ\`Ȣ"Fiup@tAB`]pɳ)BDʙcB `SSc˿1˝!H64c>?;P>I'E 1=oLɨdw&89JG6tc9jPv2I=ξ}TiB6LKMf o 1Y9Y&aңJ7D34uB(ۧ3M#2SaNhP찆Gm@7o@ d?HȘ@a! @kj;a -ѕ$J\JP:c(;~!nB#dG0Yr<בBς2-1tlNԜu@7UCbW0 R J^ ̏ S TҘd) !*%G 6M-F9)B*@,2@H$eZUCMBSŐp $ID,qLR% -$^=oƚ },= B0$$F+󇤿TMֶ剎rJ `-w3 zěg-y@_HpٳgkW߂"=)TM$QʋXpaGqB,B"z(C9=Ng7]uBO88Uz#?Z,@\?0N.ߓT`>rCWӇ<0B?WD˺W)%z+A.'V JRoGP s5&2+~fS04-0n'6wd’eeV!I=I+&}gϯCQ]WN&sPsnx(CHDdItWB/"d5GolO7Z-: .&A374wogo"N]wpD؇Iq@[D90`ķ,ރ>p4 ߺQ`݈~$k߻w5qnj C=#!59Ece~c_g1$ːd5gxPh ӿ1*P7/6 ɾ'b"w&?}x>A>e^ d>pU8"EF^E$^y}ś/׮w0F% +k}uDr!AhzJ nBQrp"V]ﭗF.h㫷kv4{SZw-k0VACDړn@f:j-X`$E UT+Ê]kH 5l#{I`aq_ssMN.ys"]a=}ޗni{==~%ًn褐{{˲IyIqjZ$]Lޞ=޳e˺겖% ̎PosHOL6.wL oȉS#9[twΥm:BâN~z R[ b;%zơ𻁺p C棢qO13rC,=dd#7yl 9r !p AYΆEw S2ԡI>d8t霤䓁;X &թL&%L# Yzqlǿخ{qAW;QE_۵DAJS0%3b(UϞq0Rh{%Oę?~ R BW1Hb䙭APE4yv+x<\9\NSt4:OKuj,`Nja+p^W\oc ̙p3urDtā(yA_NZ,;*>=w__=Ui(Z*=k꺏9{`s7ԿCdjo~Q1}TJ> )湓K1q23׭kVe2>C4.R~n9bro}o1vyx)jL]!svz/w q4S <{He}ݠ`vrF f@֘h'0`0e3@Q0[Ag9_Q+o f=OYP_ = r*8{ϴqT`<[UeRU~B=OW /!q#P %_z;X }E"J D0|;& vnp6ˈhhѣ4Nf) [.E8w0=2rЉ8?`>? #KyW@Wc&撴ׇ좖JޅJ0h.X1\.^( 4Ro|"oId~~; /3Wle`@) -آ7y﷏âYz ,pƟˡ!0f2[0U@\-IEb!#ۼ {xX/Ss(Vm{{F6Ae ;6l59mH -5x#4nf:1 1dBd>8%HH  Ȥ֧zL >y$ѓY讬@MKO.PM@A?ݚG3ƨ눉=LӞy9)Be x`@0)d܈v*0@@kmɅqM@~9gfY@w(v nQu-.e t^ G͠l 4D1鹴 otS7i @P 8zǚ_R轨$;86~-7o;H94U'Y'ԁvz;=c?T0 G҈='Q =gtѕh fΝ{1\'L` @+oh{q$hڒb&gHrPߺ(3qz4;j ̽Hİ{')vkg~\aH̀ebb.Is=]`' ! r3#aA~lA@-qnmӓeNs=X(>jL J1;>MS7fhi֍3z|; )ݛK?Gc6%zpD;+},5N;'EH\*9(6E$n6oRʔ +=oR7yΚZ(xnU1y@^ʟ{ r@>qΊz"3q(H;Km!V* oTs@SnEĥ"?_Xt;Ql"8&`oF Z}iކE[LS8e'љǵsSp/ctmox.cʄpçgN-xZ@$8jE2T]Ig/1ˊjr" BFM~N ̮@Uu*侢{r'Kاi cMSeshw@șp_#Z_D/ؿI'h'7k Fv x`^0[XQ6xƐЏ;` ;v(AW}|W`:Rg^oֽ- Ӆm]r~{=[5 -~5J]5'~tUOxEԋA-q >Sܲ^)fWѭ,"X8EPY'h>k:HkzV])Y5*Vn+4n&m1sh%;)DlÕ3 ̀9ʳok T _ [Q#!ȯ=N0 1_>TCV>ڠnO:C/a鲊@=F~?%*quvֳSG(@׏w]G¢v5@^) p _V;sٶ% \vw킇/RH2CT  h=y>7ogMl! 0wo˿_/qxwwbuYꨞ0'kp*i:maPviOJ0p-uL9͞0hǥL$8w" T~3S s8j2_W޺' Yzoۜ~lc)ߣr;r\VN(¡4kl40 #'qu!Yk;*,KFodNoB2֮B:Ԗka5KBKf`9Z? aKb4ddփFVδ򬪋zQU9Lg2^+V'~߅ `=#-O̢AgeZQe'ʢ(̈́pz=\)(Ow/R7x^l}&+[+)5/KMyƲ10cX@^~+x{۴罄|QC07X.:vt20mBf6GShm+C ; h6ۆ ݎ/s刐uF\׻ @أfa"1].8iFLcϟƧ22k AD;9)>8| qi3 N)aii=_nuWD >?if6^4b"]lQ"ۜ*%}7 s*NE$pγS,>4;'#xpgHB?* ;CntXiѣIh'`֩*LVcY+IveLD䃸Hҏcu{vB5'bb,8 ʫ#d]Ic &|_Є ~M å \ْBM#@qدGjL?vC<07(a:b<֖ozPd)z)k:[p`M,y2}DΘk܀Y9q'mTM4# 0i p9 Ff?S4K9)H{鳤Mpc͎ LT(hxQN3~l)Qh.wjCDYY!I͟Ht`5Ni,M֪(6ýVh# mWuуuyXO aSH3p %6LiI4(jM(0LKr1Kv # MzSȩȪg3 4}5ܢӦPqM ?sL077».N'c19{9]:'Fx3atC[={䒺8NI_&!D3C%{+ޙ e]0Kw6, ĩ@0zj@%Yϩztn∶ɏX{w"~ꂎ<>^xy8RR8Ng9y{ 4'Fe2j<,U98 Ns|dMo08b<ji{"G#c&39XXyG su]H.#0Q7?ůhH?G29m]hZ4ЌLIC{NxJ?`v"epO  8S>r䒧b'9o 35MQKe| bɛ,H!v$Pɨ&_o;/9g%q~(ڻ$fC֨ @1ѻg.+"DNQR VVOׄh +)/g%3|6nN Sj{V(!ώ ^Jy(kЄ ƐIz4QZѤ-:'dC1Ɵx̬d;dmYP 5Qo6T՞20pb]R'úOde1Pzwޓ).@ЄA|eF4or ځjN$yJf QDQ̦8Ec.Z @y*^5~O'7^<#1ٷE:NV_oi;2whBZ!]S2q⑍TzsimqV3>hw_;|q669A73۰}*QVuazpbL x0qw#= XhqIDJ?՞h m]=;OvBrɯ%?v?K(s}t1JbCdM0POV.4i<#q#< 4]`+xMhWXmX+rx:E=e)QZuS[\B(.|&Vc7H Zmh(P~ rSemRy*"1$C^e%:`:^#s0P`5H (>R9̈2ꕘIFޑG "Σ~(0CEQTj~vR]A lNc)aErìgym͡-tB(`g Rme;Onb.Gޝ@?IQ 'lB2y_Y)n}p֔gѶPm$fD)wDm/Np[d-94\IتPQ)H; =ng aO_:"'j-7BHK'.+}s}. qP1ksczd8Cߙr}{*P,6]|pl$%HilX:@S80z]`  RqSZ(TE.s`\^SwFZ+WިRu}ۭrnj(D= -ĐVk vWv GK(LD0H_ dlȕG&nq.V~t{%ad4$G+ldSi*#\i۠FSqUZ/֢Ү.#"z>8(tzy[V'8+y@ϫ8_5y 3z()"s~=S]'6Hy6|U^îΙvl4#=|\[R\A:+XDX|(o_-Br.Ed^/&?,6^UDˍ v! x[{,#u-nn;ENnOn'"uZi[U.>.xKq3JU㽳$vǩ %RwΩ|ب!R0Ȩbfk p[54a h?on84p"[fR=Q<< N;"\ݭU:N^fZa}p \{x;nE] ӋqT=@" ]RR'C#}~'Y<%Tsy Ka Uw @@zd~a)Q Ч y՛ R>=Wq!GEimASǑb$y^㛂IdUwJ̎rPz#∽0`[W~~GP3쭥=] dv(QaJP41 -(veyعDֿ>>_]!sU`v:A`rT+ey<3γWWu[OAݫ=`6\CNunw/c g387UY(v[.Ra5Wz:rHCnSsSnۛwG!*T9@j:&iV6*, kvͶ?o, *qJg\whJ+۸]֍cRmpF%oʚA~+1m!C^Si~.c*0o>hZBp"gm[VrD 5jwY#(ݡPd̾246> ׌yFlYT 7 cl6nVCB^r0]85HDP*z{ D-Ԣű ^gNAQ**b ;R|ѐA2 1.oh8fPS"&QHM !yR+ؾ|`> .o?.2;˲׻1 zA5L0 3Vl!׫HT 7c P?.{}Ày5gcOkLqG>=Q5B9 $$UHI#\}bYk>%(x6{ qcSעz6 Ü2rMf PѠH)֬20Qq5EqEX zMy|"`ֽe4RMT[?JiW2Wf=TvF\^$<`O# '/DTHۯ[=۷T\,"VU`L l->;,[Jy`h_̥joeBGoZ=a3KsfjE![s4V]uۤE>NU 'm* ]/ ܵ_"|ͥCA/=9g?.L>P/ m4y_#Zkte ee쯳;Cw]EDFC{jEV6@1{hphОtzqZY >ao@C$ 'Q]Ԣlth2gpu-7|}|{6NӞed28zw/Ngϳ]ϑVv.w02@rXߜa`j._VJYÌj[?O~ 6ڶ%. HsE]7jpٞȾmwN7i(2-WMɅP-f+v֮7)՘C%Ng|4;2*"eG>X BiMc>?眩%c~a <@:} WDoIi/dn޼`q! Y@;dQ`of j;=n -Q/jabG// >k^kh@DtWs Z:)@ FiRݠqÏ 6KH, (4PE/yo1;** (A5:x_oQ_wӝqgw5b7(a=i·{|!Y>QB$U1DDBU$TE D Ĩ4 @zO9G5Ctܔ!p>,u$ޮ˽*!v1Oy $Į=R!: .1.^̮hzNÁr?t?1FpH%9 .Qz /}sxhB@lK"Н!p! o\p O:Njp)&""BjB*Pzù54lgQ/C=ydI`1a]D3 D G$;L`}%zvH| 䘂xPbq#lHwf0cs?)})OdjM\P&X>=Ixr>jUR~p#^BybJpSXA=Cs<焏ۻmD֞m>J8d4@>m={/^Ǹ7a\ w:F==ڞ>m0*hMS#D;0CHv~C%p@*eP#SFW/zu {2'F4ցz~d#lA9[xC8vuTW~}]""zz_~HG%7*9 p'Ü_}9{(\uᭇ\9k FuD y7{I}~8W1ɩ81pīLL:FiF"0&=)-~}Ml!g}2U$W4^=>̛cz.*{65_r (TO:~tnpPp 7AX]v[$@0P5tnz;nLP3o Aވ}7:T(/O< <0'5ώBSSuo.'e^u렼#sypܔ(jH&*>>?LGv`U6؟}੃&[?6M }_4TH>fS?r Y˖`^DlHg.ESm2s$&E.09JQŁGy gIJsw?Z`;M u݃qS- W;P3^@*q}JjyNO.-UZ5EªAHÀ2,> Մ3Q884Iw o;^v0.9 jC^H@)GYk 'o+8zD:|v<Dr>E XA0\;ؽv2.PG5dKN_rn5-QcPJ*}%?[V=Z?iAJJXD޾"`yt@mG~|fq7QhE2)m]eS?|Ee.f S>Qڣ)/DQ()(>!7aٱw)w⊩)"BK;TǣȚ9LcLē=D(=?)֩?⋽;]sz 7[1YUBtaҗ;(3q%Ckdt~#`xFr1!LbQBҬ=q=ߋꟋ㪣Xt9f%dY/BEkU?=\~<` ~t3W7wH xV;*'"?.N90CwㆼDO˵b Ӵ(!s?yުzzCer % 0g LOCd4(30&%O?MU7k~ՃB ۟>7TmTyD㶏Tcr1~sij֋b9NrP;9Ca^bAw Q6RJiUwlC9EPɡP4NsQCAhz(lP8|G,vL `M 4ARvgӭ 4ӷ]I6Ft#:>%}.@;.} 5ÌwJDsz @FAs yV2h6;g>àr?mߋ3 >nGx0yGvA>Ioo ySɇP?Jm* - |PX &9x|'iFJĻP9@M꾍A"!YH_2_f.|_R;=K $cM@ XG8Vc?HNq +/aok }dV~JXF}hۋM:]~Bjq4ffя͘&o+ aHrr~.W=As@j n0ޡ 8)~o-֐;( TF`@!ϋ#18iѮfxhx1rͤK?&srZ7=>S<;!1u Fѷ3 |AMܖk"zEQE̖iqMY(7=x ^6s|S@v`&4ugXD(tw^DlIBOۍAc0I^M_,0Q; $2˷wyary=vl`kGd?^qAbH'x <0l( )Ezy ԝz2#1?nZj&$<*CN)8@<vYs|`y7ra_!N4o 'l+Q6RK ؗEHҐGQa 00hNCa;1"h{lCss$4:,>Vљ;Ԕ4.dى@O  1O1=q4 ;i(Co?_QOJYW~*gX 4/ʎtnLD34W2vb baĞfUC!Z Jz>G~{D]6}#تy~ /{`>o?V8?w?%Sy<;d:AG>Oy`Sʞ*ys/6(QOVq̊zGz=3XPPAoMϪ£O\O+]D;:QD""]"s%nf3*( >ʕO.psչ!/*CJčHYaŤ|.[3It3όLSz Pi?cy4cje2YCl;S7Qi0J,QT0m tw\C&13~T<SG~=*(Jk :ӎ{,_`ɪζtwƐ6}mq$"ls.<͵ Flg|,̻^Z)&h}> ) sVP8v F49j3yr .r9s!D LD2w/ _ '埂wks'Nr} 11Qm"fjֶ-3u@%>IƺMp0 ɫ`x]vz*&}c=2hs#ל+RBHvW>?f!!ׯ̴@nVwQkW)f!*v]^mzX-)~BؼixN6cH:I9%q.' f`Ă'atR0ÓQx~{aܑH@`e@lvff~TwZI7Nr5^ȪƋ&afgqR1g!&@Mp*;$xHg u#!BϾ&ѐ {').C<VsǍUdy^=MF%eTL2=6 ѣ[ilryPp_Ha` q#ok|I: }8$uWθ T e]ɑXXgӅaFH!2rɪVȡ ǥZ̍O/PlS"X><.fqj`j$eZ6I1c inǚ2|¦fƑ -adپRD)!Ґ=ᘶfbo"Sj`Ї!ٕnr~ Ä gȏ6h~",VMMYC6~Mi{|\΃&T7H:(@*"g/le| {|+!!jSYqp~3ivap&D 3&,_=͞64TfJЁ8; 5t ;CAf81G?)P9?IbCbϥU<rtDH`ĠZ`>5ĿrGV&0)\`pU좧2mAI r#?naI׼y85TD[0O:hOfi~?Z`R>It]>'iov:z 0?'<ǰ4'?I@N~!FMXíyNCKx1ww)| Caȏa1!$Iuz00oaG6΀R1!Lmo#M"qhKpa~҈c@u IƋ 8CkƞP*&`g ?B[uACU14 x-kk?n,Y$c 49!a@2(Gvن**m.'x6ML?6P@A=l7bc0;!+ l&\2ְ4 51lt7',nuNfƊWMʟqxs*vd(l'2.S(}<ͪTtHg~ S楉 ˪fc ‹`]g\-!X(@!z?7I'$)?!U 0ֿF6*5?2%& @8z} X``/B^p)j6jME UC',3$[(RwHCT[HiDBFJ. KIhsG) znxa;&|S7`wؔϪ6zEo !D!" Ԕ0r0Q%,JJ)@,|ELbEgݰF$0<|1$x8::T8yx&xS܏0 2%!K[5Ŗ+ǣU_C@PEm_GP< 0; `Y̦ɕc " C < |'Q?`fzy?y{'tTLeSp ;>(#TR@Cnrd 0$$^LOH&н1LW#87cGI$c˶H`rMlh*P.q!K7A>s Abxd2xQ$菾ev]uSkaA)h @*퉻`wn8_#Cg/[" `A؇Gd0>*c(xN{#|KDb >=>T%V]6]ϯDisQeڪ0;t^tlޤDɑ FnZc8u&I4_I^yTzqcqA3wmXRZ\]A6`G)2F5CZA} 1} +|6*8`_]WqI:f)J(J(fMAy!u'!OfD@tc!~ģMHu=H?IN0=C .D??#8õB2XVUF4h(ь~a6tDDєQOɉvC`O>RvVv۷S`,?pdTx'~jPSVq&n$`v<ڋ.5#G:A_b6[W @,bL9P՝(@ΰc)jW:dzbs<œv"P{(ʹ5Ps?Ry*۹s #&C*'eQ; U\:A<T|JǴ|P@;s8V yMhƒ=n\LMQwՠD(҉}y 4Cli+)IQ +mG2|q/!=SNE?xz.GYpC0;7Iw(Zl #e  %Ғ6JX_+ @2:E})U9 rr&@(AaNU{,\k]74*]1kOgAb1SOlXZ^Q?i@Ȍ'x I\ 97j$OL&GκhzPX*Ga r qpAHAͳUwSx΄¨&8SJc6؃Zq+4%"g9*s_qr/%0C?y;5%M*AE"B""M*OAͷ_vMvNCSI8ruf a"Y$ #{ 42BC/c(+dW/h&E&A` M Ch1ɑȹbdypi_Pߴ:B]؄Tt ve92 yP¨]>XɹZ@qJ |#1%u41!koHFUQ킣 M9SoP+ȯ2j)bWޒ' ǠA?~C$  >dA"% A `o~b&71*Xa;9v)1|91э%G*p<}i&@o%p'V.㬿X/+z(Q`BzX{T$>D)DB/(S@J88SD˦^ELP7>UHa!aCC)'9'Z(?%Ѝ% FOδP<|vI&L(0 !<{3 XJT4Mk= #iÍ9YP]r}s rP|0: ~35/ө$]Lu.bmffVIra3 Z@PYFvbVф 13D\")gH8dn9 0}ӓŧ5o0'NSNparV`cF#hàL?/燇=dc^f da&VPpaz>s뜞OxgĦ,~x>/Jx0c!0aB^K K)~D3v"oAf(t$+mٶM&-[mآglm !INJP)DAI MM4UUDC0!Q&KXi5NT;G8DBrT9ЍMHRB>8j'K$$6h @A%@ ă1T3PYi@l]m듃ATC31oDʉNGڹ?`l8 =[R?|``ܞex'v PXH«OvaE$:&%l|!5I&CI9Tr:!8gW33%Tna$tD@7e7!d HN"0*猅BI+J? V`ht "D?7*8(pCHa0D,f%i㲆"cleW\hPAnIY5|æ b(a{M L0<2yM6{d>lL<*` R'\{Ğ=E"f>~)/wr7ԂXy*ɥdzh 0NS {9(p&|:<A{%"R Ęr=*56HП"r;d"B(%x10bS`~#`FeO]ϚXR4gQK>YޣE wAx$]HzFp%,p0 ]Qԛ8'|oLBmD &O<Ş[M10 6S8dw_ ,jxvl2XCpKo3w4 HqNȇB5Sedegzb/(ptXJ8^ڮrPz6)֪$58ű)7y0rT1F{CTrjN?+SI3k'dpe()ÖuOcC WYΖ+F# kʵ>7W~-{t{WQE(OGu(|B'$ ;E/PSD1g?"p<]q'd$_ 6&D'T3xnuLQ(|SĎkdHl%`It35,> -#+5Zf,M ]50Ec4-;T:KmEVphldqx7//( 5i%%fS$<ӌgHZX/p~U0V73JI)\ N1雼 sQ< H"OɱHke4&zjCBʺ?n.H}>M%El8tA`ك* T98fMGnRdd8>ZK~!bHH=びjjYYYVWSˌ8?330h;{0r3K ]HZ8`;!P`hMw_p/g S͔N$:9Nġ=D'2$H& $\p6LrAՀxJ{f y a1 2 aP)A( $]$C9^7>bbX`D½8?.2`dt @{qlS "rFaŇH#8" }VIǝ솊T\; 1ipPCt6* hb'{άbLyԱm.!}{@"TUg\@XnA_ׄfTTZ9 lLIIS<98 b;URPcM$/ rI&dl,/GDm@{ǁ!ߋNMtaS%S`"ŀt6̍\H^ A\a^!٨hjĔ_XCI5HtI\|~Uğd{2rn4dS[tΰ}3n|4p(HIC@|CJ<Z0M )ܐGBb ‚P,13N_'"XI/몣nyvQ}" pLp3!r&(^hbE-vw=xX~흳-mCa׉10>-pjޘagS1Tkbaއzk'b6jhʞWؼ8B| >}4NdͰz7y;ahLMYՍ +5t8=;$w `I^w5F)i8}&Neʖj ("" "hKbmquGv&tС2L|]ۓVYa{js=>M+ u- CÁ kEC0m~{6It1O'6&ȑ]N$lL~b@BC I7U&ќBjS+< 'ry[Q˛Q+كAF0 'rvɼE`[VsMsP<ܜ6NSI߫ ޙ^[uujC ]$pHߩx*#{@@|s#˖}5K4=8C0[eNQgB@|^Oqa`1wty?ҏt4S$} #`~W~TYpH_4 MF bdL I̱Sp:i&1-΋]錣 ?&fnNU%6!vV!~oaؽs էk dIϏ:%oBT-Px'Bk!> ]:̷S4S3?8W}W2qt,OOZS28R ^f3r#K/sslq03ku Rgll; m `)-jmo:`WCL`^:hnd.\ 6G[=p-3=+$Ӂb1!M5VT54"q 03ey#MHG 9b0]!ƚ,vXdtsFbt߸7Ԃ{N*4?ۆAuE͍~q,2DbqZ!j< dCjiqy@@DA@X:1v!01fEOTU`uyM,CMWa綫Ѽ"=}JPbAIB^cDvQMۃLh=J &=a4zQnzFbAwH"hPd!P+]iCC` N}nho&5E ~m#hn33m[,kM6U4rڈD % mwt; |7&f'9,@E2G4\v"&+ *jH*2-DkTUX!;FӣQ]Jf3mm/(r'N^Ԡ=>bb(*JFNZSr|!@P53GIs'j^r O ;_RL̴{ G c"D8D+%!l46?6ØkX0Kk() TNo#Scx%DQK/-fش/j/ehŽ4O 3b|0~6|DM=Ys_*b8?tMJo~dqY%`ՎRfrP38y̼܀rJ2  p$?!7ŏf#كͱ>~ Pah@ H ,tXt?BQ00١t4*dߛ5^5XC>:eNE'D9<9('O$S|{/8rp2\p]KYV`L*hI ʼW4 |Sz?H@] ~Sj'; ^͗^s7J'D b BDВ#Q@!"FP/~f /#(PyXNh! W ==)%A|*ڞbm&{wOv)㧃MTi7R+,vr$ f$'A(寮5,dt1y=`v,a mC9C%˗`5Tѓ$LHK# '09#8Nͤe)\d+WT 1W>l7ZĹ3d 14oUI7p?O1hذ'n*8MP^G:n37XQj/k kz2ƨC@S!%SQI5^!?*PoqZB :kј~?HcZzy()B^a),(G<6g0dXaJ#T?=p/Hpr8Zc[4}\h5vmLɈ_5>0` @'$q^ɂ ?|p_'Z 5 <vʮJ͉(l5d)FuO|1נ,spuӦ, APs0=QEu -le>pg\K _?7^pr?U9q()p&))8ۯ!n;e05S0G]n!>yd/A(@$6c*{udyM a!||0|F X&k0Dt<:S׀Ctz^a +N_XWaF%-)1DLLdd=trr¦_zsRAK_}vbVcSI^-$H'>r :Aʙ٫@)ϣPQeODT嚡6F`(TbTI",^P㗠x'HyZd./@'C! Vh ӱgT.8r#!wswtY/0>yBQ6%MΥQqk$RBuBI]5` Tbi9 ݤ;uڞ"qNƁ􏯻d=a0@"4͍ H 6O?3~8G0 F.r0nH l@;Bo #|GvyD_Gi0|*;jiF0.UAC/HW[G˱gL@+ܤ) yo};Lѿ2qS;Ďy HEW}㟗־`; ,cވ$;{.{BYД54|6i,X/;1alo6S5z&ۡf=0p'؜Kx0$-؁JoAFZF|&!?=8A=}჉[wM0(3K"dT F~aJG+r!renq/mQ.1:B!z۩߂Uz} l:Ŋk tI$xs7බt -L츈4Jw( ̂ .Ah2H\q)Peף?,eVn^YNsX$p)ХI@C?./$Mue6BkՙZYpt$lHd1ੱnSplzJlOF^xuyv]ӬC1 rPY&E31`hlv3<[Pi2WiEK[3)54a%*^BG`ZDc1ÕsJe*7IT wwQ˙AEj>i wtFF$ Ms N()!443JNqUC%N`9 @& Za-28yCZ("} r 1E!.O!؉lthNFMF@j6:pz:wjplhCހuynFcxA&6fC]pjUFUEƛ?|N@;г2bCH :uxL!q: Nꂊ?`pwU# Rv|پQl{KbSՒ֌^z0;6Qѷ=uEYam5黿[ݝN, x$뷖Å^;m6V#{ eTcӤq`5?Ծg<-7&L͏k" aA%H53UU g-Le7~ 'w'=G::L#԰8N==PCI&D^X)ҷ! zXY:,Ou ',Dy倀d)!;:< 7;2j0y^0Fy#'6BFt,$40Id{B-UGNI%*Ys1zaڳ )Td @G Y>֢N?ǜ^TCd*"&!@[<'l}#b) 焇Xf'83$4!{@C=<v06fwUuȈsMP"d$u.~]G䜹&@FbIpu@ꢬBGiY[^aw퇸]ǫ%ì$FYf3u~*1Ua@a{jo/iݿ!?ɚvfr[vna[ [eR=K waΈ\$yzxOOZQUUTI**Cy~nP 6v5Z R ŕHÈh'vstkife6'U*6 4 M9Kt3^/~mw0!Y05js(ʹN%*z6&i.k7 3Dl,'P8#yR=e /2gr GyO`!JQLA0ܜ{Gq2_ ׏w8՛ӊ] -d&6rܮ cfÒw3*zϓ3'wfp+599^K -!;-˼?\x0{;@Fd"Y2[@ S7TZX4Us0{ ͆ZAŵ2(_E̎|`kk}=aXz&:2N:qX.ſn}kQ ի-Z)ٓa U/p=/nF0Y QGS5%PO"ho<}>VO.IjmP`7Z ⟫6̆Ror92RH֤b>Бs%Ęx.z%(ƃt~!tt$͌.z=PiFJnpÒ31:Y;6Ń&On^D !&(WCy#5:7L?X"h? X IWrbH"y2'vM"|A "^ĒIb$qr)CHBh -/mN ]?%`440", 6rC|go'A9| 'r@rM、020p ĚT<_0 ω k7u;0^X&0QTDPPnWX!VV!+nـ9C(M ;@r=Šh.L< ed¾#C25%k` =>G=y>soqe 7tUUUQLGt[m09h&IhNwF S矇8dž(Z8]8c慉A[A hDa jhRo[AIDDr~p{$!Xؚ[6ӌ*/У^aU'.0A mS); - :"$"i?p(vRh+{" dh1d8y ChsZ4%F(Kah,;׸wfAH<6;]B6JKfd q~ۗwj?*t14ң2G׵~@z9$$ "#4 tX $ŻaM$$h+ % ^}5O&yFP1 U5rW2a7~<zQG`1AAKh`*hllqM2qzKmlB97Oeģ>_6oPV8T.J40%$>_=ۼ+k+4S-1Eaν٠Me*NhZ YN$g .Jm\pXpc T7ctlz>g f67ArZfvz -M.aFY ҉YͭbTo8H{|7"-<6qYޞY+Ӛ!"̰ƍ) mh)>iՉ :ͷ}rҍa &- ;bnAɗr< q< Rd%l|+`cle@<5/H;~Hڟ/9a`CBf*'wơun\+gLLxxn 4mQD3WT`s?`.xS8on0P:l"lFS_LƑ&4 4JE*? cicCB hb#DۨKE>ngNǯѯ|uDzsPJ >wxDptȟfSy;rD5MUR]*%)Ր0r:3FǼy\& yO:ns+)s3׿HRqW?O\IH,5DD#IW!S;! 1DTb1$Ơ ` a@֎,aDXIr#53,Cƕ-<$(i^[U@R!_\d_Âp9E[<@dQ~a6U4TPCK &+Bq,i/xϔ xaղ0DbPþC c,`$R.5Qb4%CI<5#C'\`Lɀ!< ) 3tJsr:wa9RÊyQwrq>Њ(9!Fo?ݴcmdƒG GOtBn IL)م9&R 6+DZ0'MszGRy_YD/w(r~ 䴼0Iۏ`:{5}vvP/Z?<#Έ~y̵AQK 4%)eS'Me0Lc,P_G Ȫ\ܓ6@Wl6n>V4ZUT2%SmT`?L+9XK'J1j"& [ehzܸb,qh!B:]Eadҝb{mz(1ؠlDg%KW6FH ͫ. h>OZ'"B!rpT9"6C)h1sɹb9 C V9̔ ~Ù8X7>|>Ua,B>"njE?l9;ICL$șX:Qߔ7!,1(f)-̵ $NabCZOGj>h^k4nA!Zj5v9dz'Lm^wg$p-3@h1H6?㪦)}n?0|80ip{0ϻ]CΚx@ % D= aX4k(I,1}A6(=H RCFs[5ĨN!r X}k$2$1Œv|#B  ÄX(Jb UZBJ9NN݁931">T4^.s{z^˃C9EȅfB #$"q!Mo D#5cmM(FLϿiEhkm`PNM*W4'\p=20Ң1n2!޵*ǖ5_!dy]'PPym Ҕqvǣ݉$} dEppo)NЮGmdҧ#,8aTk /tP0{I\Bm$8b 3?2X";G:kYtSbHhC[37hCkF|#Xᡢ Ĉh:( cO>=`i ӥHJM,A6"@$a)?iN<^>OoWP:僔JMS;'(~3n&dԢТP95jtl _"?[[65\|tWp:{ '1PkDCREZ`{|1!̓kYEGTP]sHȚ5i^NnKOIIl#GvkY%$ (@qK2M_NRg N]~Z{IzsH&KvQ92i'ٮĘSgZ[j&1!IóxY0v`CoJ)T(5 -K%a|e܀C?*JA)B(A(b 6@4<'A,0hY)(($^x.:E*>DA:!b3K,CW(%"] CI̸?pC?qAAACAAAABPs?<^' $Su^\z:*8pC&E|X#HVODm(υaZ4PQ@ 1#L@\2/kP6aO?g pb(2'HCmcDGNJ H6Bu~Lχ"b1bnäte up><%CCc|F&te\bIAۇ )j DхE eY1!~g'&#I;x#C>:# f,R e U)9 <ؤ9&)߯K$@a`Ć$p~Cȸ!0AD H=|ċM> ?OG0@G#:Bj&j(}hnf;]SLH<"eN%مe (0AFn.VR2Iz lwNl*HjG/SP:HjMmĆae$9v}>z FCCvf~D0 ׶1` 5@p<ӎ eM˷zz AC%RjPЗu9ȏXgůAO6Nmv")?L|0FpHB6]ٗ/q+I{bH!kI N5/\ʵ1T煬AGprl @kg$~'ok-m-4I,DZD>Ec* ]KH]zm kYvko/g1ә"= xbX8ӆ>,l2~gF~,mh1Oÿ08xaNa7K7 cɈ|jGxbxi &)`IQÅxC@nAB{ $r'%KHp7_;}4h]YeE)gNlN6Nt3-FYÍ%8r ϠwȰ+\BʙWc|[=)FCQ62l4^dH׊H,Zga56J!Ǝ>Vf$0}=Ct $B$nM4TB#PAȃm_d8 z8I LD( ) %16l=)*}ڗoo^(=UcB^B u - o5kBs1KEDF "P⋲1mH1Aͅ\`<:)N~c!~\X &DQg:tX%Cu ';t!*wC_0i8Bm{ 4, {: `[d;̐.O4JD>TM5!|hA1Z4&iGA>U@bT;PNSEݰCL3`OE3_`1ҏyCt?ރ[2RC!7d7%^(HErbr)+!,Q `kz18){| x Kӏ$4Id{rCSQ7;{=GL Ü1-0i2>aL>O*LkvaIs*|nD_mBZ.>ѝv5'$Y>T}ĉ"韧%VlDN÷9vؕc"T+4y:qWJdՒM-PnԠKg݆Ptݿ 80Pȧ^'WnU]`A -u`q\&ꩤ"iٱ\1ХG$2Cʬ~FJDP}.eꂌY&Iϲ383C aD+ß ײVUw6Cg")D"C{"jrgtAXQx_`'s}nz boE -TTDHğLbȎwQ(DD__*~Smh)*!$5EQ38C.0yɞ(X}`dwpsy-$Dkzl2*jo50ӕ3AVmhK(Oh?F!Z~9*aД-BM i4DL:^P 3pvo% 7fVRH~zyS#^ppcMNq`BU3]NY. 狨Cm y bJ0IEr̷Il$Ru #{zb1bm{`YY mv{fSM,t9l'f{ Ōm(ךp oc7H#pqtp> ! C8gx@ oi8Lof3e9 vD !Q0VfRE]&#T \$ 4$@9eDJ s%Cl :1R ltǝޱutk'ukge;1"H1UC ulBѦYCL]R#nW#x&\plHe!w0tPiqwjH6N#K= C#AAC8!l`L[T2t}*aIG̘1]֜5Ӆ8ExJ18b Q:#{ (ài<րa9Vpc۰(4\6N.11BLl &A#Q>b8cbZ#!Ʃ-a͐`@Jh7XXȓMgLC{E>ԇaLOl jjF&ǪPm믗tE:_{wؤ9_[ڣl7־AscRd.AqC1]F5ڴKv%뼰rr%n[\gf(&C`(m\1E#0Hh㒧$)b4OssYuV{ؽ;Մq! $&F>G_丛-1danW5I6 [Pdx8MM*1ec0[1dxL|EV>!toH*{7o B4He+/`qEC0UU&h0a;RGo ]CgI:EA7cH[#Ǝ2noLX>"+U$ccaZ F5yƖ˦\gM%%rV=@g䋻^:hzܥlq"NX7 wcnt9p}`D44Frɲ&f 3:(fk.srdipv%wM(",ц3{C e=#/*ky0֑AF1nه/5ofSoU %9l/Hn0D#,J0;2,a Pn~]FB~؁L,Eٹ0d,D2.BýU2 'Ȫ1da)%̿43CzU|*HJ1o ᣈ ?Vscrϒ D#<zWwp1ת9Ӻ=װe%X)݄UO-O9)P(DH CF*8$ae! +[ae`ڃ!b$Q!Ra(NJsmHOl ȥ"hXA󰡒"`Z8vۢ bubXgϱ]v`dHD#z ryL)a!Ӕ>x1p$;K\qg|< GZD 1~!\ GbCP⇳=zR)CI2e!4m#/x4.ϞO_$z@r"\k'%@mD. y &l!GG)xsdEv|rB>%|b\MME%UIx-r+TCfɺ;l;y-} )rCv-1QTpڞl}{{j~cȁ߇@âYs*jŮQn=B*-Zٔ̚ԟ[47kHjrnl6!7I&pPj` Jp0'3މ'gwzu4d.TL-)y- !)nG3n oO*G\J n_N{ $#']AC(0 L1 h H2h )&M4H$Q>@o9˧U Ƿ(PSdlU0%J)H1'C'|+Jp5'5huAoDY"SafRÔG&*~\D[:W̧js8d!]h)cy?zH.]a~C95@)*jMX+D{HbPbil @S_卢??wx?_BG??^SOW?C?Wp/~30jD R5PT'AX?nsW =oҫá+,4 L@ȧe7ЏuQb&"\hwt$p9 C'3*d tItkϲjo:^\,UGq\ %&=:)-'/db~(a7<亁?Ѱ0mcDI1M ptCpA+S@Ruq+ϊg;Fԃi-vH:c+,\/BFzZzvnm#zzF_fsYhkeA]]cRr8!$ԣ *!*0hSg$p@Շ2e'LÎMw&<[$ǏE^2)_3m2saoF n%z>JfL Ccؽl0_C'Lm0i+FၴɱbJf ;#y6.lNwtDMq}`%ctl!|-`!܅)@s3zku,㭏3RpPq ZpN$,Ƴ(ȞPɒ=YuK BtrNidX-bt[:LsJc.Ch|;-缷L$&q-n黠DXa9^cu,7=2Cdg3BjfDnP?wFhhWɕq)IK,DbH(DPPcRP/f:rTЙE3lqh7*.!b@a` 1Xҽ"*ؖ@w:y}a>2 p#9,FiCްUH!2B'/ߝTCdmC\1o D.&z9llR!cX,d`[-1q (m&mll8:Y6?m} 4}wB77PzEDQT*pyҽξA"hNY m [ dyq$Ŧ?\"bl@:ݢ6`MA:5 psR$qJǣ+N!Txr܏3^~䯱ʇP")b((& S0'݁׆.~p`"at(bSk I"j9ﶁt2:L@f |~ݢ UUU(f(C1PaAl;67뙐&B5eHQ3u|ƑHDŽramYL& Bf )pȲ93TEM,K fTT(U9rIf5C&ia! eܬ+˗ ;IxӢ8Ƹ}:hl- [NSN6pOg0`` ޢYE7ds]DKw eN;SZ $jamB-f|;S(CWa8a5o3 .;qb§n%( ; bd0qhFhn=ff/l] X689,8Eh{"y (sɞ0ͤt#-3:a݇G8C0eI r6^0Žϭ<{0D e:^E_+1EUwӚXcҽY2ij5W\gmt&fv|gClo$;o}9ښ{~w3vd!ק3rG.v98ИiZ8Eӆ]H)NN'\hX\;󡁉1>wΜVG8e5f_#2^5M!iYbmL2678#$TODMbx0;:q-e߃czb"R+;ag0&yfA|,y4GTKk<usφfK+M,2Uٷ\HV-cB+W|i;ƵjWzrxZL'7]v{QƜ)34xy@ee1n%n7v EqՈD]|z@c;"kkV M'9 vb]i҆Zf ´D9FŎRU%M`sE最멆8sE1q:;xv}M2gI8<#mA [wjg`e20mEvێ.k-6s^s=pPCuR:;q'c;Kc`@v PC:˗X6Y?Hfn8ɀi܉3lG8rh,b 뻃u   u ]tr!q1{ɡBf%trI`BJ+! 6=.*W=-Oi 囎\+1s.v2TLp~]c$&#<ָgMrGiaSz<v![rI).|]7RkkRCMj<os홳VP:c%LĴuŇn !tӫ`;#<ƹ39Zm8t,UmKCrJ883FJ^_)O:o9#$ȶLm~TS8wgotjN!IU{Q繽Z!Q2zʁC#9qKF$n)6hTx%mq/Jc|!xfSr! 3ݠAc(ۆq6錦GM|CVBh۰_ #DvXֶљo gG;'kRwFHMsLE:by):pQb3(3344t=^wFa0l\t/D-^y~ﶍmehxۅf0N*%VT#l6Xrt~ =Wʮy}1ݝ`,W*z3*1 syty\4ʡ"$\=m 3v-b'c 7x)rNݕNY1Zɴ#'Mg3J4ʺpi|AN= JcA_.4Byзbަ@+E9΄6|scNֳ Dr C7 K홬q",[i,f#H1E] 8%s kNQ9:]1*&أLH8 RK=o\5ck2^3Dg,3|Rxlm2O69ശ7ΰL.QOCu27w<=9hys^\w0Vw!b`~~@)W=j#ܣ4:u{0"!˂LdOS* CǍn8O v&R HЕ:UeCX-\$D)Ȍ@"jYyj8( t-H%tmnȷq S-c\ $*14@X- \f'3[F9]ppJJ}P:6^땤dnn噠ṫ,-Ҧf;u3renkX)03Xِ[(g0VZÈ\n'dې;UQx㮧^\pv~j,8UDrjuۙ33& |b$틻}b ŝAF"=a-ɱ:,=g41*II9O {N(óZ|:M Fj@aJK=@tcWq=rRՓW74r3)~/ ͈ŒzN9 c.pp֥qژDp=kd֞Q38lvuP[iJ'`ۖ"J&"H6A˷}f'97 c&xY#vb эt+8D &QLN\R)2-|c0Νy0f7 #I]E8yiuZ?iRkѩ)XQ3K Z$u]8%,E0RL cCvt%-5<ƩWCbXڍQp% @gw<*AP1CqS,`Em͏CB hAreGy8HS_w |6t#d<2xXXϘrR]Fd1R)/;|'Q."C$:DP#$R?$\pX9OQ*:RGMkd%UWFUb5U#6j3[7[{Iە5,݀Ҡt2S` iwy'xT9')vr1 $1gFlee8I(4xݪLJlC-AnTj@`,{d5Ž&N8v.57&T9\|C&Lo/ ўzREY;Q4K#h[٩lD-=A +Q_iš()~hǎ}Yn9צ`kj6c^ݼ!|V*|u޼ߍ*Q 'HC-,ˬ Xl:aSGusSHUS( 9׫ޝף]>_õ[1Y sByTW Z q\V3Zn91Z%ϊMn[}TvFߧ 3`%33ԗct,HEzIbu Nsp`Q6lA\bHB28Bw6>OXCSOOp^H^ n$4{ Ju~h2@]gVqAm~(B#d"`)Z]6,AL[di> J~?C8LѠbRu/&&M<^}lq@P JI&'9 C~b!J,oPS'{*o)D?S ` 50!Ϩ`s2(Š)%6'kA1D(ATh 4q؁0D`0#4+J!) PE @s↰IaJx0ۤ2$E SHS$ ;?aPE4C1R@ARJSE40DBU$Pbp4ro0ٴ:$! qPAc'aXS5Jޝ L@rF9NpLOFͿ,[-hM.2m( %Yr5Uʸ+40zC6J@θRR9w%ERMPAMQ@OA#q>ՠk~{]fWI"zFjugaߦjl OrH@=d202֩9#XHGY(sSA٦~_4?eJ+E a<҅!LsFDW'!O 8T"e(CMB>cM4{E1,ОZVbJGthN:0DGݲU\Z15p{*&;'aUն 0B^pjj 298qZ >&3&`H ](!yԣ!**CRd&JTnC챵ט`TZ9ǖ((h)P$h J1yve-L__?r$w!)*&(~%>e^Kh&#VU᣹ˮ1qI 6PME) § |Qa\}ƐH(aO^SxFb$޸Yf'gisUR7t||Ui@- ] V!4C)JB!SeJQߎyK}?x}~0)GFUHŲYX2*OdCC *ڑx~snMU7 Ǔb/P # O6^/Aq+aM+ȞMXO@!lU F+Xע9`xzQEQ7aKaY'Z- sQh*0ş:i-z>'9j͠W]PD`DFi/̒FT^=MeƸ#uԁgz _P'sCr {BFP@{#GfvF i416zbC 5O/id(a  i)r)A:u]9!9_sD*L8SġXhDMX*LhFGlfxTlI:9M/ X DlDS/ Q[bϜWlt nWA絼|n4a s=a}\S6Ca 4%\\=p^t^:׈n`y&PM ?lvg&,qČw)۴Bfh$37;J >ᳪ^"4pp ɊmHu=Y3c,s 9gh lí#5)YyirP&xܑ"+dzm&FءRX`Y:D n+0խ 9$P ˻=KDLLL50Ic 5S4{lm}&; Gف,fǠu ttCD ~&hͫƖ4awSx X\MqMEHlFwk(]  (!0Tn>\rz`i`&C Jx/ppE8h\CJM: NyP8a<dPچNcc@Ҍ y- ^y X?lŖ&Xd @1  4PPzpn\(dCT*8qDƒJ]n(4gG}CNSu}@ qtL%]ҟTprz g <#!>peIyTܴ(酇i߅fIzak,IÆ_WJ[C|Z409k5ӊqċKd(˚e31;y0YoXb-#P\|t)r@@J(B `N$YKa(ne㒁BA)U_R2'WPS gs;¼[;0ZSpujoϼI͜15؇!ܚ;_epqb9R`"˖ eyx'x8/G^ 췱Ǿ۹@#D{o>:%oz.K,]h6wdzcԋ)5F3~Q%h*h=2JAΝNz`7n%xbn]_ػvhi >.QC4{u'֬iP0Ct*wP* @9pQ 1Y0A@vJj(9`&ўɭq܎<^NAAڨ@0tD PD KHL`‰)@Xp F <CU FqҦϿf^Z`ppDK#y SRl 4L0ފ졖__(0RB B DTNsYpo<CGQ0qCbiݍs!!OŠ8ZO'5YªPy[ΕjLca7i m5_[ 5 2骯hEѥU`gLTqI2c].^hf$\`60Ft4Tͣ_ӡD/>ĞHS /6ǐ'ȯ9úvKZ4:ގp3fgJӃEd`&-ݻ7E "c HPBSɈe!#ょ_@(.Y78xʪ>~3"{Q?8Oqח9Q qA< 0!2/YgS'!pp(k;CqȔıNY \%'82@ !`ٛzcN:?F c8Htd4v0Q)CPB(RA $T)(JQ)Hh(ƨ"T7d=s"sT~kԏDAàF NH!AJR~w!U7:yjB!BC!x4a?\%%%%+ILMQAd~&&(?]q#YXco>S D}v2 BW1 ڄ&w0#F /IQ|dp+PI9% ȐI#TyZQ>% ܉L I3y$ݠ! {|p^l²a34KG@t%"$@ɂ8n U*u+@qj54Qmb̐(1 rakgh;f ˍ[bߵlJ&,~S^g;;=IV (!l E-RA',Ux:F&bit`m4M84H9xxߧ jMp!fa9!Ke#UƭwpaED@,G`b % ڬ&^ } j7d$i hMrjDE2E/LE#X-Ď'-a.6JE Q7ղq o D|qh'd| 14J8 NjM4oFM)N!hE&T &&iti 4Xt 4*9F(Җ6L()b El)vnX ;wINٕOfܚm@☭jFHnPͰZcgX=7&w 12ć>L=Aԥ.yD5WKi p$s ;%PQVXrz'I?˓$ni3́"YG;ibZ\qၱh'Q!pV́p/x_ObbΖ|( TG9Q32[CWT TKs=YS =-ayuwl(4^hAI Hm|pW3*"` )vQM84QBD@.la4jQ9cl?OS:̏ ZA DPĄ& }Ў99favpX)G1_Jb3QӁXPI8ʺ/ LBpr<FӖ-:|z]`%Bܩ9F_mibRO7>2$C48-_(Ag&E?>hSؔ|f裂yy kuU+]\v5=?\LJ{N89|ryt^]K03vDB;i AIQST̴T %LQ3EPTU#*UIMQETDUEQEUDME EMQEDRQ(*J2_X6/u?^@:Fc4 C^-A9zɃ53&=po/`@,Zg/>T8mQj혇.>c%alEjfѾc~ AJSQ>S'AMs;Т]UʡqT|`Bf**<\TLxjjNm&'%@TZS?!5AkX6^EB0?/Jx3Q8ik's*?,3lf`ۙj0ĴK+$nAnK$cs&7qyL'Ddczd.9$c aiDq}par'Ռc<貳m~QBC=,?uh|W>Y1InnۛDߐmZ'Fi6q>7?p/KܣPooJl}pE7 =94XR 2e)Wl4Uqq~}L[Q>6x>4s9]ƸJRHu Њ w!RU70RIwvCA9++ @44 5?@:_~Ք-Y^߿W>rt:DŦ1' RxI!v I^,0-y%˯5.@:|l8$۲HcIC@Q t|NԨ!m @ =F*5_FEKT(1 h*h@SsACLC6ڐ6Pq.v5!ӡݹY=Yx]4tB{Y=*#8k>KfeI1 `12B$" k̘CXt+!LdH $4BCL3ꇓ\ A=jW !eyI!N `;8y@i L4 %*BL 4ц9n%m$'EPQYT HCۻW@.]{t6/Qqؘz Iأ *;@=$N7П5zpb/{?{]{=Dq`(:l;1*]LyC>OP!FP44MP*ϴ8Yx+f tW?yF0Na8=B\{) dbD ?6G hZ6M!49"h$Xѹ#6Cm F!O'AEUA@Cl#S%'[ 6 [H)_> o_ 0! 3ɗ$e$e͕؆?ދ ZGa$N( lܲ*R)"233{,{͂2 *k $B@&G!LBb$ {aB,!; 㔙_cp['[r@U=w֔d y#&FlFPypH H(OdC!TJ ´@͝m T<~<0D@SM(@)_BVJ)()J ()@UD@J`h(h(H ))Jbj` T*R%U PR@+4 EQQ#BLHQK@D IIUCQ#MT4%)@RK)KbbB%A"hRH"JZVjF~%t5 JP4%TE AHLD R S2(D AP1Q4DĴ D#AH-4R@L$@4,E$BDP4RP"CEJ%APR(ICH !b B?F;Q2R>u:1 l$v8mb%KӌX?1 RP)BEP"EAUIU*NY尩St8%8MP -κ&3/XS0n0u^fSILdrN0ߧd.@i(RZCE.!"63QW^}DʧH5J#û%';UM4TR469a`S}I$Tz5MMT y{ԛQHqİD TNh6= t֝K)mA$ v3~ڈedf  *bb(*hba b "J "Y  &H!{8̫a$9Oov$xæLMZ 0tO*yjO9ri HrJ| )4wٹ6%lJ'=s3dΙ}g*"ՠjЌvpX;ܔOBZDpxT /Q!JD]wr Ȟi@!dG\=N #9̆\ [ .r:E&:PD7*fN V7iWi>dgÇA_mu6PPQBJÄWJŤ(9:?M4qdœ+P";[BP2RDr8n$ a![M!Ga,r?/xl+ 7>4^腰j~@>S"uNE W]u? ">z)r wc~"CFuAѢ"o78LMYHpHm3 @`(x/ =IY<{ JFDmOxaL\L1FF04(U OOUɳ%cԷ"gSG"v! r$$WROLdK~m-k$ ۃ3Z:]40CCh]@3{4؉v-[:x͘40QFn8;&`hѱj㟎 o瑦$r yv1ŀ+j6,Ad N#C:p򂇸Y&,$; B<xu>cx߬V%!y90IC4DD;9`xE@"K 3wڧ! !{]tqh9~,J>I@\⬝4IM],`"Ab U~ iZ@x蠛""@/S CxM;^v$/=t> 6c𒄵p|8CC6 n|Ɂ- .]pxƬ^]RD1PJyǫ5#-] c/Xw./K`GJ>u;ȅP f0 1n@?qVՇǯ\1`yrX8дUU%P0̳11HDMBDI D@ϛ#t5U'm`S;}A"EiI%V\a)J!C -gk;KuM"Lh*y)w@Wz~^_!;:ܛMD!z3.q$ KLo `Fєy y<mTt8& /G++&Z1s&\xKjL, ZtE,-1mݑhڬ٩o-NiY Ln9M6A$Ō)H X6TPDK4X .+7Hj1H+a S m띕4QD[Dhk,4F;{H4TK>ZB$w bKVhREpf73"cMo fw٢1E, Aׯo͌o'HԁxhEQ$DBb3%`b9UguwxpL͎YX`6Ƕ4"j1эvH4=8uV6uq7N.9p|(rD#@>!CgBq2e\IR" ҎW#dKYhoٞ]0sM!`pm>T8%3a, R #qcJ3$="J(?gwŸ!JA4\0"`п`)(̿˔!ʣ$}Le范A`Dt!BP:yz#0KfRIPpH"z,<øW |"dRtR*!>2H_A^d~yb%C|!=H=IJ'"'l.E2҅A9,!+&) 9H3Ўpj5AM1(P4+H{E)M. `9)Aހ+x=!e`z0Ȳpf* stPī@%CMDLI30D DT6 @!rߔ).!4H;FaGϩ0h$ɸSQ*mi*ԗHiYXJOB>fl'e4X)4`zdh  ! r-iL`6w3Mm787B2Eڱ9yg>AOhP)NHM 9-!>W0v )Fl.b 0^QD-5waoD\q9ѨϦb䣉zvq H0yNV0YNyiMF]6yporӘA8fŸE;"l_@xNTjH@ 쉚( #{*=.HE PH &e4LZA2>DyS/~$N>" d߫|t7B#|Chy1;4،Ύ6:Y঵OG%:$kaAN {81ꐩb) YD tM70 >3 ">b;[ 8g Z9=846rDA× 9q*n¢'y=4ZDgQa8H񬈹k-]5`g?ղ=_rOf=A,Nq+[]94kC.J^|̛E1{%aXCH/MSmE*H*:ߟ/G]v{ǩ tZM'&@S="vR ^; w J^f %>ķ}ٝHHz;ꋷ %ݶ\05T.vZXYӦÿN]!Wɇrx$Y,c(Ndԉ&Y^kVy|tgsQ|Y\6Πg1(<=w9w]_Qv1]zC3ˌJdxF>hp9<4CGd?w=mg/<<*7˪|F9ÿHySeۅ0]~{^%x82yR89}(q ֤@C=xpVu41nq/,OPLiG02đٯѳJN[n>dWEJSEEHuˇ 4v>G; Y45+_z 4x5 ʄeh)++c"( Z,(a @mq0A0RElLRFؠZ #'&*fBbh&b) (`YXY i)f&R$Z R`b  )"bf( T㈙1#"6)I440CNHDI%#M1PznAU8E4AheC.mBh V@ Jip8fէ6wc@4 lt_[-8b8֜tWQ kUbK7t뇣vdn]]ϳ Es~8bjIX1+S=IW{} =pONa?''~>98ǘ=j/5#4#'7i1!@4O y5rnrUS||;0XLd3s5AU5/L)XgL֕Cb mM(pWr#^o?Ⱦ̰r`ES*28{!SEueCI:0G$r,vʙq)~DŽ=ȝ21yU]aӰiT:զa-eD9=;jOpL]a1GoɃ!Μ܊#B1OpO @zQj*IPgqe4x#(c.@Ǥ0ϠcˀS6 倥( fR&yQK (QXDXY$*y ,qAKNV ҉Rʧ 2PK`XDK\@tlI/"Oϔߌ?cRyV˜ '%0.9 iPBx5AԀyypMeQ[I: .Kf&AS I"4 R`@H`CaVi9`i$;7cj $'KPWmOY4BF|ZMېjG(!/}ZH_C|zX~,8O>ί\ \ 2bie0RB s:ss""OkSQkVSTM.I@kMLWYh]gp@,¾gnaߪzޥjɌu Bf\dcyS1!j5YzȮ&I6LeDg[ 1S.J*hGU{"(fD7[#_{.5A3Qj\`vB$Jv.1fi⒲JQg;kFDb1Ht4VҬ^$::$4m;1La%>5xbKR1HZ&dG%PN0$i-_gLyyZԩ8|p:PP.'R8`N®F@٩r/,U"F`6 sI? 2蟕d% PHA! TC) xxI@j5uJ s I!X`"ĝkYԆYgCɐ=ҳ1Q=iEHh]Ԯs:$XI(DAi^ u*`8Ƥ9bCzG8H&Cϛ˵ݘRũ=8_EG4vChDK_m:wqmd< ODhvbz |;h4`<:nrl֠%h%LU&sWf7üUE;Kǹat"pbxeoPa jP$xi+f>Z !,ȓ8dxD[l| vpʵA7noNɡq݈>\9 ,Wzz5L(xF&ِnQp83ǫ'j}p4Iٸxg;cA"ܨMjRaXǎtܸx0s+7"Cf͹4A9 e<5ḏrk DOc&$Ϝ0ch`X\8$*.Y.LgA1;%̺CUP円(r8"$r#(6AceJG@R-Nl: i'rxs%uHXKծ|OfFgMa2Gvzbmn!,EьmM%![0!͇${ S)9r0H(vB:Ԍղ^ F6ɄQ˼@HMz. L](,M0  xŌ8 IQr ;s={ yO XFؤKhzοlṿռʲQĆJ7jĂRCH'Iy'|ni.;8FuX<1( B ؋DD ^9w^%_o7ئ\rd W{r@cbFu<5ۇ8B2ymH&|k$=*!sӋ.|_Wfg(q P0g4P^B* BBC%ѥSP-rsnFl\v4SbEƊ0 :p$yӑ^2Ksp&TrQՍ8JJ\ i)}@(sp.i=yq0j#Y ,o,Dr;"N4@'0e[v@l+A#ԉ̫$6$J $|1jD}\X+I1g1Q]|j#lԖ=)!:S6LICLr&xٓc8M~Ÿ:!i)$CŸ)&2us +pl&e6@bxqh8k uoh`ܱ 40888$,zyQkFQ57BVuKl ;{-p2G'c•`4$(fUn3 08F0zLI PBN(NȚj`jNzE >e`P;`v}v!" 6pgRBDRVӬD~C L9"?d"\\iCI{bZ(oKyW~dk0 & 02#9|g!=UҌ}<|ݝf4G'̍vˤ=CrCՊĩV>=m>V]P%Y=7(&/=O>$=Ι@0i l(o sd0K!H6IE+2཮#Lsy;zQw|9)b [¦/vBbV2#>q‘[r2XhD*.v=|lhdi=Os-p!O,'TE@5DN-;ibeWmzǛ$F;T$L``Fk D+V1e(R˗n%4#ĤD4ijSDTU!8 %ZM*BuADLF6KTOaʸqCM(pdFM.qԉ; 34ا~4jc.O9P_QE揟άp_ßSf΅@=&׃3eq%g h slȭ*]řL䘠 6 J8s߳%oI'$,X$4|xj%CڡDQb'YhdQ=$r+Ţ QQ۟1墧y$^h@n1;Q</FmRC ^6`6&U!A!DT2(?6?{|ѱG@{ԅva~R^=ޤg[,MB&b#Bpaα~^1r5S.6(ƮQ@+nkP40,6mAmbJ5ƙ+c}"e lnҖhA7|ՇAYI a9醙ZvrbWA 咬|hsڽ=ϜcbI(J̔`A|[!ch%jam(فGkâTRf-c"P{VKCbK8;-@D-JLKR1|CIbفB)1~_%LTp}9 =ib9V#V[b6?dqFzpEILu"KJug MpԑXMD 55ałA` J`F p%oeyI:CwnZ/a~&JFlHI+A?ӿi* <҄]Q^ 1VL&: /gPɉfgLmnN.}WQF Be1U Qϛf0|"d=pgȺ8֊tw<;>4 {}'|] Nj~}(dEKtt~5Zr\~zak䒊X~CuI:鉴/<q/~Ra_)+eN2-&!IH!Z2ðn~_/%YYa u`| W(%˛9c#PuUc Y Rl,C? ҿۑƊ=!-@a  I@~XYs(PS>)F -*z X0Ǹ{ y[#6(s:X`"%}cD3]O,I&EQ1 A)n m,وDFVJ kB$M:rl ;@LoV9cGfބ# (tN<1@o)l16 GV }xy5yJ+ u\QfGG<yk^٨au+kSB_bzqzRV1E?^ :)2j,Rޙ>,b*6#'Ǵo6K:ސWUv.@gw`^Q\Xb0m/rG>/d`r5FI>X2Єc~y|o| 2qlƭmb<*xw;~[͏+]65V78)0N!9BRLIu*Í:JS 'FkP"ʫFlZ+#-4V!8y7أx s)'+ Ұ4u~Wb ;TM %ils@RVOYͷ똓WSp-MY]ݤ"A.&glK Vx5/" ֐1e'+ܼ?Av5a)H8ANϝvI١\NKW9${w_)5KV x(YfZo7ּф,1IQF<ר,@x(=n2$m@kN3@oqv,Ќ:5pʖ4f Ĕ0pmtjzvj6,pdddMZ71mK%  cnj֒V\@҈\R FaGJYC .*bpk,$#X ٽ Q)]Ua$#bjh- FGSnV\ ٱk8ğH=jL؄ F3lFx)B YFb&4@b4DSB11oP(j ǚFBͳ,L`يޏbjf+YYZǰD" 4 m2 `bCSXX,+J1%VBY͏ m Hsm2.f7r"D4IE7㣁5n1b Bjyaʦa!PJ޲ZRid`&4A%-W(0ztuZPi f NhZjy a(7t"d8[sc,v> .h .If"(遪AG%ܛcD΅.l\ۃAj]o&j .G.9޸ r 4Gָ/#Jۍ]mpj`榮\KHl8-(bV5MiG]hemF#pMNϮe,Fǜٹ**ldu6ć?kLƷ +Fٌm@hyH+m!!QuˠV(T~xY1 dbqK #mJeL%u [B<377PE<0s(D2(9T@D|e5D/fyxL(tfC%4aV#kHm-2b=NoutsS9/c0UKeiiWflɿ\n CJYR'e.@Cj[Gѥ5Ʋ%lt":M I$FV(JV |]Զ&@j/6.e)]: }%jh7^m7YD2yqČVgbA,A4܁4i64|~97Y9 ǞuԟV2oZ8tmDҗfÔ= O Kb;e[>]aqˈןKoN&BR,.B.97ᘉe,켒b$^"eDHSbrCIǤ]fM.]2~+갑E-S)91$@ׂ'@Е%JPr0$;""x4vZ yPrm}^%KIZZ B.oi4#uQ`J(PT8mFx%;S^IBp91lX 9 Ե;)#l !2uxg׋p:(MI)0dJÕ!pz2\"\ <q<ۤ 'OhB`>NjpPcAK侈=K w=I9viJ%<@Gg)upr4N!Í:<vJѬG5c1N`$md.kF̕ʫ"mE/99 1Ǒ=(|prhKhime¸8džGRiPM0˶ @H@`DC(o y&S~$X QhD2,`~JKAJJI@U7%|cs!'JΨ=U4*Qh'@T;a<5 R"GhS hq,V(t4LK>}6`/{TJ[64:D5'Nv'CFq$S:L@HŴuMG 9s1 gF^H"'!b61cdP<4l($"-$'`}'O "F D1U1%Cl3bb8p5 JE҅J@X,WLx[d&/$@뗃ƪQ"#-%ITq|;Z؀ǘ< _*:}D!̸x grT}>j']tH9dvZCHN@OaRy A _y=PSOx@nx6 ب{@2xaJ,@IP[ NN,=KAݿ|\<i cӗɽ4vm\CmEhA `e@qmO+syQ!j7U j {P4"E$P.J).+hQګ% 1V@^׻g@i*dP%0&~:e )z8L|T9@4D3"ā? d&3@f$ \`,bP #ZBIB$ J(k$`⏾pwA ʃ0DkpF.%DD 8ˆ#A@d+g&&<󢼆}Zyj4- xกALU c8hDZ'`*Cs%%kX%72'c(;! g:E5)-$J ]30A"hCQt59t3e"2tBM ;*b!  ""CSEҸ(.&76@l $;rxF`*"ØSPp؎lp 8P1خZ6kI vWd =ɔ[`ҬZ(N$hA8%[Y VhǮcdltjh,t&Br`zCMB9s5^nGhx$ʄ<8$fC0Q 9%EBCgi}9p>%^Jy7A 12rM@DCLZ @BL/;ѐRG`GW܏;3\Ӈ%pBCxxHJ4!P1)}}HhD*0X4i% PN%sK@RO{ k>f t.Z"7:DPoRpQξ"Q645;>^xPhZG|=JD("Gh+CC*C)'hvA*<|A)1*2FWI4R-{#({ yV۩xКK9LqsM) jMSg&}r[CkOx_g;f{p@Bψ~d@rb0)]~MxaJ2%dQʨNejC"CHb9犴wT=M,ATH?w3d7D/[Jހiқf*kN=,WvW#_|n|duҌX&IǨj XWeFiaH!#)$@Mm88puBMH۷7{К8J+2"dy @`z5ٲR kW 1 a SI7[*H;;w*ԀK$qМ,0s7{x&rN-1aX8L!55 05tƷ ."BMMhnZأL$=9Æ3EIFЛhN|L3f/'H8$tTP>YSļ8w q |.X%0v;D$Dcv>di:o\DO'U}|eq rPb`H%xpf=@ҋ;Şa8¥Q DϒXC`r7I y}47-<2u!D~cèrx eMDٰl0p8O!1u~| fLg AȻ0=8 a"m%L cDTgny"n>Nr$; mK3K]E1 &0`^z\;1{T%x?ӡ[ AL1JA='ls Q|Lln}I&y~{n.vMN")IRO۳ \9+d\Xpmr)03 )Df&`4@#9GY/T:+k~og=ppy!HpH;K?@^;j0/ 4IGv Wء}Hf?UHX^4*D<`0%@sUߐurD_a(BsCl6%e.ؕ&1 ٜg<IHY!)6GߓBd*$Ba2(( E`EiF@X !QQX(U)AVD '^^vʽj(qxQJ% $9&AyD0=r!vߎI䉉d&Ŋ.~#>W{RHP"hNAbBe:*`` ABI->fHRPЅ3G ]![g (4C!HiGpH~LqK7m`i d(O\E|G ۲;H!]A#2 SϿL `ďz5Yؔ\ ]S5 @v`<1(^8C!|ݞ|b";1A!i.[01"U=MV]~ﷀ#]$zuoQST(yTbOPFFɠR0aW@c9'&9;헺T(uLzH>t +HpL"DbU Tϩ'.q3 BjPh&Pnt _lP8)Jb6ڝw&Af F'〰8p>8uJajj):_y~ C$)F$4e(8TĚ<.Ҍd $JN(cȐrb}?i=A0'G8]I2kY -bТDy*F!v8+挧w͵!( i DDĚM`0H0=2(% Ho |߃yj&B14jfuy;.˭pG 2y҃.1)Q""RDVU ("X88Yw !M SB$=BdYґr?N 6E_jkjPs\4a m%RfSS4}'LImz9!rA^hl|Xp2wHĪ  #K=91@tI54Es9"M FbsMO׼Fl*aR6e%k\<,@rpsE _fqQ  gPS0TQ E$UPL?-67QIs+kõdą+ST(?v 0HF N`£eL4 }3`Ȣ'8 h p*zշR9#&TF!{.2A $5"c.y!ByiPl/FI94 +ĂPҷc5x%ͪ-4Tp}"2/ɻ] m dz8XOE0Gsc`~fl?H|eFDy9Qȃ )/o Dh`w:x=q?P54PS B#R#QH4RGŰ b/ˎJE~\bES)tIER6NgD͓Z)mQ[O_"рÉRP٥0 ERjg$#V"%D;?PbŇׇ,#2)yOnz]a Dc*~Ki ~߇с/FЮDH ՛mkEdakcf41516W]4W#70ŋf-PyeƄ8YLPp;R2xBϔ4pʧ :Q&X&"&@ b(1@H#kPw@mSxIOdgpPDn1RIAv%딸&ck$kȱܮTv1$9'C+b" &v֌HW^\>}>=""9!>@9ĩJЌD#]tpkiq+L9lAh!%oMYlu ){Gb8S 4k٢fؘrToucNRzV}41oBp['nW0tsmpiF-+ 6Tzq-s-`QN}B)r;\Uc=4xx7DDb]O H BR'pUßTG05.z@:l#p g\ 2굼f;ն5eѮ vkf*::+Ȫ1 C #.}pΟzWx7fD?NT=ˢ; `xwCcײwIּt/PdPg4QȜ&>Mnm! h-BkCc!^* S(G)t~V!Wo p:oA;z)(z_NbOe[Ɍ{tnil]@-ɪhQY=e_WR> BG _Ͱftv{Hh@ 84T J b vQUN^I )8wGqpMaG2*J9P?9`jStz-S<@~eemD{è̒@F {ܚF@29X$:v&aۋXj)w>eOއzjz.٘z42K~"lR)QQ'cɅOq 1|5nhC!2i'z1L[nℓb\Ђ%:skC l;~s3 O4RT'2w[K4pqtKdch"ji6(x="RD? 4ҡT:?Jk!Cȏ! ̯.B!) N{A>0>X)"%?4 OD@8MUQ9+CQg($"}d7fچ޿$9Ȃ O% +S~ghAHG滨$rE*IC l'M遫QTڝi/8DZ{ W cB9}B;קMkd6"içN:>}#(>cݭ;5G.mW^Cz~̞ )4! @_+ .\QI0o&d¡dmYJlIpąP0 #|k b,!p$5@>WφhySfa%>Z:ABH}hQALTUed"㿓gxE-H(+2b>.j򔂺R!_iԙ.&}J@gО."4RR}`0Ty"=zL$-P}%N@DAAC@|цvv>5"p_(îR(&sÝfq^CB2,aLr;)HXDan܉vx\ͲH ٵPe*䔎$-{4mdA6)ѬPS6jvg])MIB1L0Rth*iwpiJrpѴ6C$Q4B_]NYI~{%U;Pof]0X 4:ܻ7' bHH/rg`bH8Oj" NSpjrJK p"8sB{ٛdZΆ4bea: tQAyG1$. "`;ms;C3 Q>]DV ybckT{ppU9~ '=\~Pl{4Fq=DV|~j{ { \h AJ(FMy !uM2  2Rk[urں9jY@Ʉ̌7rܾ4l{8ǩu53䄪 ta2Ho3s1Kki:sH0@R 9L4i0hm!2 X6SvP)\K+ %FU2t o=)*xGcx\{Fp&JKDS #.d)iykQO?"i $ Zc쭁aʃ4n`{aR i]H"0ht,J.ȱ|t{`"9Wxr#B' Ϸ_-8m(m'$?Az66tR"p~E) @1z/E5$N7lpwrP8X1 zXǚ;Ws/^z@*fY&A3J^<>r v4DHQɀZ db&"aXŔF%`JEi$ၔ>`""TM` + UDUskjHQC+ej4 7ݕ*B2`D UE덃f<%=G 7.<56"Ho0:PKNaQFm GdwQ%@ӄm-dP1UjKfvR{9ӽ q1mCj&8dmm1I=6L'^zd|r>;Hs!͵\D㼎-S}4?kF0DT |Y+=U;?s2>I֤PT4y'i~ a7{.靾ĿzR:O#D>B's4̅#+@C/W& OQ;K HS+xVԓ2cL١E&p[),B(IyJ;$,z6>4SZ JIHO~1!@i%Ѵ.xbW 9HHQ S4KA0T, LG@Q91ホ/z|u쎈O x8o3@ҨtUK0 ȣ$BW3ٻjr#qqOY>i2zC4Ds藨?C]*~CaEYhQNSC~^eC &y8#qx#l}q )3p巣ZyjR,d?-,&E AAC@A!E$0A4j;  { OSD GI~%5B+E& }jX$:c/@8 B \ԞFD'``rmih$>IfWQ bc*[(f7s QBX$ @s>~wJh0?4l-2&xtimF* CN R.AwvYaX7-F~*r XtԄ<.L4NY6֨4G[ۜ-Ruыs ]ʃ_bZ@bpVVuO(VpOucg٘C3)`ՙi[# rH1 (֢"M-&<~Z0P`R4д^J攙 <=ฮAR"ȇ?6&xc{yE)9C 8J2- 4"7 G(O#><`y 4"?@Kˑ>OPR*Ҕ$ ۫N\ZX4 ^w*ED#JcASGg:wWaװ9 14ƌ0!lÑ3^@H?D'S&#I$Oa4cH>3LDI 04RD#ޡ=΢t Ry'?莂G3'6w ؇#XQ$p7c]Ñ 3Ƀc/{ç(e*"VHDg ,)^|LIq3zi _&Uip䁦c<'JD~2X'I)lf#wihiCe4!CCٖ8N&V~1T~H `R9p!!BpyPѵUP)7 C.5D LEcfE$"Zh 8lYPV)PQC 6h*1Qeؒb&jKHfhH) r`DB!i"P & %4*;=Y)i ` $&0'yNLA0̑!d>71ܨi!lQ .ouiPCS:IOwHTN8 T2uLJrq1@I]3mpcZNAhݶ+!hR:*+ 2-q"')`"qj(bF%0}G.<(i)dVd*Ii#\2ďc> <۩c|KgANEMʫTZdV9vq(PE<w>2 2!lM-˷'I=^;2z7?V:T뀹<^mz;˸$IMAp^V[KQ3&:vB UlƘ)W.V5 xW?b=$V=xN0S3VVsL.VHo}(f,3|v&kq'b;yw c=`ƞōj ew2_ xmF):5{mS31sq*b!&jsnF j!$71#"NJNstw8kɦOat!v8>zVVJ=S;5}Gb|U7#3 Eqm޳xeqbۋqU|k{x87r<$\wdߦ&>Z.m&h@;xH\N"HM)^gKeY)EؖN$i[ h={GBOTȄAR=wECPuT e>҅[k}vR4;py:cW%Y57P܅C7xV2yɌb=F~x q lN=7-r/><,"!!%S+]f*5HQ[qݰK.o]NRaR~XdEVF)W_?gNNL}Y'U;kuIFhQd W% s>Lo~N|ȱlM[4" ;+dѦ젮%T*WSa*+2:_" |˷th9wgg5Y症5 ^sZUXlW Hx3̋Y|e&aKX2@;1bjdqw R)7zgn D̉nqrU kEG*%OWWpߏv9 HeJupL,:h xs $DRqͨ<(L._}߆c,ktÆTvD4ܛ: Mh0Cd4&H{Ü(mhTE0VdM/~.U*Nf!NY[vmJ;F*=ǚfƾ<1fw#b;:;Q32-k[.8zzV)I)NmwCC&1Noh_RЇg<ˈ@xAAZCՂD(̷6JS[S?dEjW;DߥOGmV1(JIZP~x+km˱ƦΟz7WooO[(`su9B<1=P ^;g|L]#~8ԎRB^h*86qG"gH"~xlH]Ϫ^t/9 ܜ?`/\rY%nxi&L) h!m~ YCҒ 9W>%rE4-8},>$)G$4>֛Z`3eG[ Ц{7p%/koOAG7%;P"} sϑm:OȖqqvMyg}4zSx+3<)w\r;>m瓫V[s٢ Ɨ VYУgķ!zub|oqzuK5>+aX׼32UkI/p3_ Qƒb#:09|vA4.oZؔ~ЬRe[G`q(UT*$wGYQl$yG]/ {:SWξa0է >J,#&p(@ޏn`0-*xfG1ߪgA}+n1]va4{=csQ޹Ť6)o53CFٗ|.k1>=N gw)Ğmu<Ɵ1nIAGě%Kpߘಫ[LdL[јYFm?,93v9{my '+=w'Fn㉷bɡT"&dS]ܒgo˕#*pOy:3,B9Hb4ƂZͦWGQO%]׃9Aaa{6T.9*s8~Gl !2')aΫݔפk._ZTgOÉ/]Ҁݜ)z Y9FW=~Di6Ic/j#CuDѵ(^aytJrSϠL)/Ӛ5ȩ^6Oiflwᛘ(B֙_9OiKv=LîpZIɉa4]/E+{;ΕNѧثx6CޙNl#D HRj=Gz-twG4$Qљ~F;g,o'R䫈p~ЌS 3(9¢D3"t5܂c pnlX3qDqɣ)eM$ 18m+ɯY˟H0̥ĒC'HoY[M$ttT" H׉א7ǻ %IgCȕɷLg/bGK{#N,6dL~\$U%Xmu_ˌfGi9| Lvfz3\+J<`FwYOF9;TŢ"EÙuTfp3 U͵ mQOuYfSqcu$0&=>{sX{buAcl`u1&y.M(VHP$՗z[Pp4om|Hn" aJ Q %5jT~Oz<\w~Ɨnj5(XHٶȵM& c\@use;bM-<8=pp8{/(aqxO"TSxaMeN #6?#yI)?)KHYT=W|WÀ2АDʎ>|@K/#F]ނ짌<]u<$.s]9޾L≡Wm"tFrP>A?F}*.3mvHͳͧ:5|'u2"TZ)DՂ @I#W6!1L/f 68-:cc/ ! 3y̺q8RA N\Wcѹń~Uȕ=Qh)Qx_ģ4pydӊq kqLA"c[QhS! `,I9.@R|A ]C.m :UcPQ0D$QF mKBm((e4SΉ<1ٲK:QPS-4QI&1x@))M PTz&7'4p\I̐YDBLĿHtl: 0@+:TdS3p0 QAUz{3Φ> L9'ztNlK<ƹV*1j?nK/&jFќDC&@S6Jڿd/p8A4*`rIvݎ[< ϴy7DRw<0q= b&Gy6AIHo))HI)$X.9#|]%M(efj)UhFЋ^ =*R1I`[잞;}8j N-CŴ(D!ف'MP T$rʗ }sҎDQV"zаz;$ = ZCMAA!n ~'_2Ŀ\ ; /`"o6~1`eu@ i{iXhNȱ&(IR&MBR$@'XC, 䏘ig+A !P TF&B+ Xe%zMjJaPEH( !2n4nL %(5Bs m$L|}FJHCX~!#ICU)M [7jPU$˄J,Flσ>+bqbN#7 =w*J$@8bqICRPC-ܚB`½VɅq|wɥ8*`muisRڅKOx3( :^nT&=||?1ģH*0r 쯸nf="`u6AOXF3&1L.x?$Z*(>0 h9č%eG# T+T 磡wƧC 麰N^'_j*Gm^id9*+30?6$78p(` AMav<#՟%l_ґR@K!DJV@90.4:+уûAii:[c O+C=󔟙?r'S, &%/b۞(ސͼ52b9B PGO  8wͧL~Z;>=zeP8{=a:'@a %+q&&%CML2]IDTT&#VFe"*xiEu@:p (Y q$Lм/ߢjJMM]'JB!2,Z|2u8~C&C*$zImCAB%zMA=UIx!,%R"nT>`z]Be,%CfEy9; WOtH8ؗ] mz&2Ͷԋ.+A؆ tX%bwU' "g^zEWn (hB%JVdz|5sr÷DoPuޡsvI@`*yyۋsE$cj`]0cac 4 QDW|O 0y Ћ&/!%(/PQ2sT.A)J5u{(!o@گnPBGpyn1L%84Nܑ>LӎI[[>$Pؘ' j|e(/V͗4z [(Ny;҄E`&2+$;8q1z"O%^poD8x19s"P#}q  iO D.L됈% e)PB=Ƅ&y /M$r_hX<#̖DgG [F.XIJ*0SjxWPPGgo7s"vlUaDX)͂>ږN&00ﬕq F2ĉjK1:2-cv+ptW" XcM 5-AWX,<#3!"c2ۭ;/̨>Z̀ǣ9Jbsә@c'> 8=GL=AX[\dɠtW;D5IѮ7}_#Ŀ'5#g915[{vDAg_I?h*5-Q49%))*|1X!cdNC\Y?=nCEw)vaX8 3vsˋhunrRpE*;u."7de8@"I=WNp]gN8[d1ڨ{'hԶVˊ`ZylՏf &?bs:Y4Gٺf@^u]OW\[yZ- WQ=FZXu@X,atsGKdLIUiwiy :ba㎇33LX:aL3W#%tֱׂC٬I ]8[,}j%fmv:!ݻ.xeQkçjzK1h A{p CCxv azX*O.J& NŢSNԉyuM( L)&ӝ[ A<]Lq!شr(euQ2X;SE NN{Ta9^OxYO;3 Q@B$3+-@yF>͒DN9XR'2)207ѳ9G j"&b&j(*""X9HWSÞ"I@KXN\@r("A5$$ DIB$ ZO'mBvD_HNW pY\ٖ7θS0Ilv9 163 "u}& ־k%XVFSIP13/%@( o:l%;ܜ`Ժ4󘷒9yt@j<wbfX?6tH 0QM k'" ]E 3$,rAF+HBH&1\L: މh/!}Rv;tڇZO&[1-U& m‹ JPRG{'9ӁDɹIBtfјj^ڊvJ#F݇cUXT ~jhD"d/-#b^֗INzVSw^pͷlÈ5P%**X42"oC(Ut*tLV,9GgCJ{="j 'W$A !SA}Xk&`/:"x MqR >Q†*y,Y"&;3IڽkG=r㜡"ȭ"2iR.+ࠝJ@S@@мtEHPҡH*tGJ]?Ҝ(H@.(RZR) I #CCJ-RBj(i hWHT\!WR#H tGeGhm2u+1Pr] ]j\R\8X@M٪:HnЁCć`W 45B -ff197B nMe@\KBAIצ pނSn:ˠSAv@›0t " F U􄨔 *z=OO &4sI(TPǯ)vJ9|M ߻8aٯ*|ib_Ddh 񦿟?E+`x0`Wr==s/u]IBj#5-,K޵S$nAW f [fr"f"}83`G mR52:(D%&#|3d۸hIndQsGQ{KeU8j*PޥdPl6,ryn8 %(DY IHZNhHR* fU>'IccQYl_9JMfZUplP ټw XL%1Jo.TmC <ɶL5&Vت01"V`cCm1 9.o aplPzc Ot9JZ*JZi(Mb ͭ B(Ƞ$[4ɄBWdMdÉ⵻T`3NTښM΂ΨR$)tt 悹JHB $ d/!ضˎ6m uࣱ C / FmMgٞ8aQgS۠}")?>tO!C㴶@1*GZ"+NB)JP4A@PH!ԑtu)+ 5_(' F.jҽ*rW@@t!JbbM)"ZJiiOr iy:؟u2F U'=C<)6grJ}[oK 9qPA2Jy|t7s+2`аd4Ms2DJ; @1HE(WS׊{_~Ƥ ]DD)FML9Ib %!yȈ'F4057I>)BV(w(|M "eF:kc, ̱B ^sbDRfr@wy"n2BF\,!\bi4x&5 @;ء` c;fL :,gCFm!57ŶUl0R?7K2Uq'8 k3Qzo:+1E2=~pX)` "D8yT PW"ʇoH("wPHR(HTJenإ`DJDPBdm: #d/s[uyB8.)l9|t4P:,^\'|be{TS#$ +j \@]qB|Zh,)2.V۫zСe޴5_\{'qkك6^m9b8|Ų[Xcu0aBسZ2]"Qhjksj{m:s(xwfJ٭.R"8r'~joz]Eˆڕ 4Kj[FL`1Ʊ沽5«!8P܇mpdfDGp隼c1#5Qt| K>8 8 %R-Dh6,D1*n6T B<ڀi%V;̓A7Τl-R E~DFd'Jo4C3o9|sɏ]=d:COP P݅<G'.7S <9SÈ$#raa :3^G0Nr{ S'Uqۑ-͈[Klf>bmWu8"-F6JlJjfc 1gTԨVA7BrK bH4<)0 GOZtTDkf,pޗ}n~iJ# F`R'-. 2}N̪da,q}ȈY nk$4$B QHQ4/6*bE)a994{ɹ d`~$2BoS =&" B/tLD!Fw_o)dt|P4<҉%| 0 !@QG0bD H@ Z*8ayhD6A@ʛ8XISEҲ_-{!ēB$D^ayM u}EI6dz7Kj9)Ph)(TC'₻н$DL#@OFӫJihU! "%*he!BSlLF\0蚣B@=x @ 8<FU$W?PZHC"s%D8<UG y*QIBR*P(C)5Qna^w'dWS>MT 0i rCyzLtfX M*WvwfȐ|Q=SCA LS CN6 @AׯyutysZ{ H~m}joDSˁ:_!oM7O=l jucQ}jdR c":H,LFTQn jUdd9L+>u'O׃!қٻQ-atƍ-f6* n i"Uip%AmTL0d~7,̽$jIhu4W'0 p(YCaxQו@Y c62qˈp?@ݢ! s}tG05AH(0B&=9Y]q44Mr cL~ c9FGQnST4Z8]Ʊōe40[jL86K6~I2]eQH6 >#K_{PRAwJ""G*N1K4ؠy=P|Pd14}W WO܅3mӰҨSN@y4Q :*u k*"7((T%E" TI LJB}ؾ{!yǪyC<2F&) 6qt~yLiHclRl-#sIbxsth;Vu0bdcIU3"\bMFck@NMK4Ř"ض(+i,TD SAUE BL) p%7ӏҙN@8H."JSZ!9^DE4Cb !\ 0p7)TPХ(Ώ4`'pC<`CeJ?SΠE3'T,KZQ=n@7 nA¢fGN`e:ó>uf]JH\? *|EYpBs#drS[6G&q*]AI'(8 aKkʄ9}x|蹵2AȕИEDA)4JSe]:/C 2b8hZKDhq (~p:+SG\͒Mº`By eL% O#>) msg4VYKX'^ =m˞s5hqGI3 lO`lV 0IQ+hX(9$`Lw  ֊PtQTDAA0$Ǐm~ز4yDOLP$J }?kk5]iZe`JITnYDekRo䤍D`Dfs`%x'Տ٢>yt|J}+?\v[Ca$< V$,Γ|;g Mڶr76?)0CA H(T*W VK(58brLBDOSHp),ǧ "aE< _ &l690JJP x1D|8vI`8w© >]u& 򂼁gUUUHپ;;Na C1Tخ÷9S10$c)Ub3ĀȭPY9љ :~E)gdP>RB@m^GP_oLʖZ?%}Hcs3@gp\fK/Bۦ,,fE01X`"].Hh &PB`&Is ΂FcA5HOw;Z=:1yq=A(VCyh<"`C<V3}@I  0,1ʛ!,v ?yd JE_k =@?Sc@ Cq tʝ/?\*4K~p4 p3иEC UqСQ; y*EH0 Dh"2~%Cy趝h߆ <Ĉr@P|uTLVה8DSf#ta#g" P& ei%Bpg)TVM;"=O*=}肟v $eHjr͒s'!)S P-0sﯵe>a_Abu'YlJM=97ҟ%'foˡRy1z9=~"!5 4+SB reVI(1)IBHxjb@Pwʙ?<_ɩ&" 2Pю|Is@P48uoF䳁M_уln9Wr'>f^`OVy)0^ I HB5Wŏ^*+_?ʛǰʯt3x.f ̜8YKEozTԙRȣo2 L1f? S~ɏ᝝1dGc%ƪU LYș?ȿIP ?8^DGu|oVfZqDx08 >}I,7OaؽeQGHL(<%|3d\186#*#~` $a ՗mTaF@0 2cC?`BWˁ;kj?K0o*}hm([d?_gH,tq!4gjDN@r`I܌'~TJJQB"HJ`}*)ad (@w_"{M?yKԅ=5*뜋k+4ķ=Go;t1)Iu)M4CE;K#C4,c h7iH6=kpp}S%TNg!LJ}ɤtgmSa M 񓭇}BG6&^_;h8嫸TQ94FV5:ڸ0}1Q&G'P! c6w슺W5\h jSLXeͅ]oу}TZ;ѡC 1_"5ԠB$:O4 j~EL*俋ȅ@yi! EHy;P3\k%U&\ާUA=HxPMj!2hI1I+/b?3Et|!Y%(#M&JytL4d<~,׍HD)8J(xrf'{Mև< )hCPh{Duiʆ:EG tM#|)Cx{&BR?,MζaP8͈2t%Iq"I>k8XԐ{NmNePxy흇0!fQ`&O䆨 phDH44 ,$+ EiBL N-h d\IT!"DllL CEDBjJ22#)$IiPQ5LD2PIT$EDRE L!BSQ$L3 A"3!2QE(UbK@Ҕ'4@C d+09c# c~&qt"Hy!3 SQ3F'2 ہ/?CKUC@ cBqbRABP 12'D~ߝ>OTG  7S?'Z{1 O%sr'#0E% /d;(ᢢh))".{}:++Ohc!9"==ɯvjZĔ4(ЩJiWhI$!?8J(fܦ$ QΟñEXs;f3Z_ Jip|- !;w_< 0 LsWo"{L\Ͻ`=N`eŶ bQ1PSJ i8;?pHԍVF+X,@Sf޵ia[H.vJ$5Ï c6cHC U~s0DHa iծjci&y /ԓ9<$#k?W]Zgv ٌ~AWBbLE !@0 @ _K =psnp|% *zݟ{bs> f;RFݵw|iR^wt @^}\si"TDOqSHVJu=vvϾsРU(iT!&(ݳ}*w$dwU|ck}). ]ݏB5 Tξ^&+w o3%w-LwzAyۮ| ;Xؠ@P/hݝӭ_l ˗^}򣦊h`>/=sk[zqeǯP((*W`!{ J($Rj ()E:{TP(Zn(`QR4digցFѓ@)T*! 6P{P$R( P*JRJ_fIXAynRP(wx< J(_ 系w)mv6l @}Mzq7^qIQv}ݬ{}VS@7'>|ݝjvǙM{ݧ%g@`NSDL@@bh"b3S< HB M Mi SSi=5OLLS2<=@MF4jdIFMM4 dzPCFAhѐBQ$Bhh&'T꟤e=MҚP=M!h $  A&#SɢdiL)LѡFPhD@DlD6Ԟ{S&Gizw?aO_eRW"&v<UQ_"0YDEz8 Uʡx"OP UY`8u+*Q!$*E*B""!a`  Vi iJhj{wl_e^˩38ʥ=uߺKI%Kb$d̺۫N8\:;qNj 6=k~wF$Q4 "% EḪ4(߄C4Ġ @D* h@-2 bAs!*KE-" *" H)4 PЋ@4)B !@GJCB" &Lg2p G6DT 9UJ-R&VJe(YxA1d+Ѝ !(Gޣ_?؀ Ui?ܷ?U\NǝpRA#̰FJ, T(J{,idn"n.`!O;J>cʇ2UU4^}`DMhPFq4#@ H5MJPĄQ%2,BDD#IJ4I <  " `#WcXz\L/k,rhd `:T7ZלxfPz4sw>.pf'^12T”zR0: 15ýxIjcqb@ꂥ ($1$|Lb)u㤡LFtIG<ۆH܎~}htÀkWCDT@hf? CHw҇vF`L VY]}#qX,J:H?Oje Q&D.@= ҌDCi (C΂(DDC JTJQDI@,R!HPAd3O=&!4- fi,A$ b%xJFI$*K@<#ITQH>nih GWYIih9X#MD'@]q;heT! &i%JF "BJPRCAR BċC2A(M AEIP4URA%:t SLQHhb%bhhO-b!B BD`"(VH j((Db "CC_U%R4PQIPBD% L,! DTT I@P!K5,A QErR T)@RIHT%s1D@LA 11M@5HDEV-2  "(D_H  ~aFxPD$fA}XqD0 Wv"lIAJD% U)TUCK ,CI@G?ǗR5lBj&D\ӵTP4\Gm۪RXRg%n!ÒpFYl03G!)kIț%HQG824d ^1Ȉ͌l Q|zLbciF}G7Șm)gT`*TQP<Pw*8hY=DWZ#޽bS0qD|5Q" Ŏk\i$w_~H?_|@Fas2?@yTq[>m=͸11jXЗr01U%TIý/prTRUIT*TSz?z1OQU *X"!b T!C}7ɛ2nC>aAl"E+ׇ1LՑ*,x};FS5j$=XS ,&a+fT}235ȹiIㆤMHDAdg.+#4-D$HIQ;P)F)W`!ዴŤt("J H2 ?hxj*O סy@EB $=B*i }<0A /h!fU"T$0E)M+43F8,(6A!`d_V~#*j^nƒ*݊oի ͳ`a~3Rž@YXaQI ‚ok8VYT}R1TEKH;RyU'(-a*P@c\/|J! OkyUKXaFIRm52#Ա'ylT"7KEpjd l%C/2?-p@Gy*7&OwomV%"1bENڮXn cn ʪ"f1ӽR:C)5s #TUW׾ϻg/];nQ r4*T 3{=9>hJ)_%K}yGw}I灣m-sj!JSH\b7DE&GԼͨKOI"q.cy_k1VDuuk7U$SOa{gZͯ=y3iqС8"g = ^ݵ~N)lj&l5|CɒK=j8hM4s0 Z{I QNJB\35?5,ڶdPIDD>3:[Z=lw=dǫxYr^A lJ5kL.2豩+)(meF]r2C*) %H^Tia4:eʢ\<;'"Hh.j5e2Cn6mM,]|ѧ Pլp<)SoYpz̬ꑋhJ5M7E m2LmeH2S"1ql.]2RT#F ,eXrl{wJmmW횥3pnC2JǕȱ$BD{oAX5Ki1cdnjnL Fl.p'4ŶMʹo2-rƘVTѧSn;261[ `S45Lp6Aab홬'Ec6SnМK E=OҩX_3N(404>4Va)=ʮ#p?MLnV7Ubj9#}cΜMITU"TSX<~J5Kt%U*_{UQ.Eu/w}>Nyl3H{ʔhӹ`" ks_.,%ũ{3< RCWsw$+V[(mHゴ6\q~+ow$H S\qeޔ|IF jht5@`zޚƇs+T-MqjvUANK' za-Ū)E BA@J!Lrtq L\IF%4р C.%בC ŹS'rn6M ٨d!IֶͮDDb#5UI.Ҕh\!=)_(zܑjX3PZeX(ZQbEJ+gd7 B=Xi9ޅTE~ K 1bł*)z eZAjUEDRT6(W'!LD'*+ yD0e#y8J%ua?,GfO ` sjX=ѡt[8tDĔ6hibS$(3!++R)m|ƚ[vLѕ6mXPh HLDh%'vt$<`0SAUM=)5YrT+cY3cFv9C]~NB5$9Z?D'}l&>E#ͬu+6kmu0j /cj,Owjv/={t(ʽO9u?p(V4Y &5Qή[olW?xwzy{ Iw5cWA5JTKarg$`'Pɟ{ p$RL`>޺M&gS,,,Q= #W'ȬOei UNl~mc=wG<6hJ͸Oi|:etYMMqUmz\Sˆ:}?H%Q3l|I8uC(H~>>.P+>5IW=Yq׎)6ZG%4o6ptFI c'7nBi:$ ;q_wcMg-ш3!ӇaT)L5CE~!qĶs^uqP4F zL+穸 Z2fX#}c4󋫏 /j5t0DXq7BHʠxiWv#-h I}Db㉕?1vJ ɘpQŨU%HlCEت4c]cNyCmyB{xY)VCscְ_R3^7lo~yi[YgRS+n.dr@{L)i7OdiG+O4q`QFeB[6WpiɌMdJcTm h6'cva~Cr[J ,0UdN -I"sEaQ;Ճb V"1JjG6Ջ`$ddC4`!H)DF m\L$C(YREIRY%.-j\&!)ADŽN=7rP*Yʱ"gm~?Dg1DbgoVsȗ2j._nX=8҆,=dAt*~N(*U,O YnE;do' X-ٝo".Y>w8v* `k(`f;̼`c:M0{"GL|O0+a9j!C jb*HI"SP/P0/簆II.ya}Ny~g z/Z&X DR^PSs-MaƢ_2,낣pkFشY4zu猯7+HΟ<6XO6wSC!H(woke#='Otxo!01[fД:Gaa!o"d8?7dZsi+!=hI6'>x9=I܀\$e_[ĐJR m40dDO_B`у(!κtÔ/ ?_Տdon$ eڜa;VM(cԨ94:/A헔)qgַָbȦ*=gZkSʶhm#i :R{<#h=㟃+ѾݥٻU4oܺ5PYm_o?($C'I<S G҃ISI}g[#} %5 HA%O#d[PSݦ=70T bHsqL,f`"rF&Hh~Nj~|xV!*Y"rk&raXQ䅟JФATi^qO3}?L^cBDB!йI1-FΐB("tA|馰 qeȩY0V6"ӴL"م)&Bwᤤ xnrX?&dك;(!_T|]d3p^0>GTL²Z(mS[dm<0z Ja앹'}^_KjuĹcƃҡ;&!LShh(.]k/Ҷ'%rD 坦f]8zэ F=knUo_p%h)ɌfOqiRVCJ$l9ꩰÞ KL*ȫ~ߒ>s~ l[6A{ }4ڑ%C_7v *deQOv#&mj9sy?[v 56qЕ~6ͤtl= @݄ߔ3~'Hiwӥ?d3wϨo- ^1U?S?f̟ -DK۠sYau ccxwJבi/Ou*Xq-|Aݾ$&}:kYiO}+ k#v弙dTlJ6^z/H,vo&dc䌛k7R+%ɏ :c lGFg͚ eMv|#mXDAwBトzݒ XS9C9ˮ'|nd\Qހ}/ŸÇFg6IVcpoCUl?)Χtݞ"!RJb ynI BD(b%L cS34fC#V~FyҊŀ]"UD!Hx҉wtXj lz fvFn_g-wz=(ZZL mQ~ iQTyS 0\"sXD1O?_h@Vj BCEU)[u"V{WxIJBcrPDs].W(x.NRFZ;=q Z0ܐ|2_: B@Uʀuv-;uËi1f8CZB OuhO׹u? %_wPo]NO~6gKU'>i2"\ss+3Sݔ8䄔Ar$w!Аэ5+C8-6 ( ()h$ ?깢& Qkմb5Do& ƪʃ-|CeGpbϳ~Ðc6hpUϷ2 [o^&mUp:ނ!-N1% QDQ?@(" % F Rit4:Z@i9d%FɚΣ1\n!a)hI&(?9Dc`Yb|k&1HZnRrJlcۅHD+7PpHtgf??5'a9.E! (Z BJQ}yAD PSQEmIQCgQ*(?<"(*!i$((JJIXj$ =3ٹ 0f $(!HbI (h "VH*!@ b )%bEhB%NH!Vb &&`YZeii%T Bf$ bi`""&*B(JR>P bh`)(h ) " !Xai XR:Y* $@h *(H(jj((V cDJ ACEEC #( P CQPS RTQ4QAA DP1DDSS4QLEUPAUD0,PD,4! )@ @13MEEA!4P@DR!M3 A1TD$ D$ĠU QE,E Q DPDPPC@U%EC1!5%$QMIDDMQATR0A$CM*44%J(KUE(*D0@RR)T)DI0H̞rp*I)ԇ:V!((Y&*Y*#0 nERET004\ B&T"(h$쁤R*(hZ"F"iZ*QEHjX"Hf%IaDdJ (hHHd&!"h$H욪 *HaH"`bM. d "*@j )"ff"RHP$a!hHhi"AVR *f,0DД!4JPCCTMP-"B4- #S LTBHJ!CQ!g04BP@JU-+DDԔPPD!MDC4LQLLUPE I%AJUDDIAETGyK :~Sﯘ7_l2~ ,c5 fa}m[(HМ}O 9==?ߪdE S/hx,Ȱd(R q9؟ۅ0ܵp6?0-ݐ>oa|Slu`r9}6#9 ]c#S !}[sdt&íOo&6j+ 4cmMO_ww<80l۟a521_ABVީ\avAڛم9nL܍Ϗ sl;"lSO0Of`BXf_wDݣ*{dtm'$`"JT\0Nm>QȀڪv>P,'L QRw. a{hc!nS /r([ټ.wcS&mc [v:oN_C#Yo 6mgghjKo,'o8N^*j153ݴtVURyXN3KOtBĊ]s3)8(I AMҙz𲴞"Zpګӑz5s&XڡޙvT΂5c </ xGIZ<5d>Rc}m -v=`/NnFPDْeEQeMBc0@ uPҥce+p̒8mjX(qaA1&/WmN@^}VxŽ>9u߯.f^F _}tl7.-G񼗳)/:a"[ b:6?b_=viflrKAiY*?)8ApLdxG  a!"R )])AG!0hb2'rgrT:o%)O @'H;ץUh6P~G(!639ؿi 1ٶi;ߌ;ՁXkH osqwߎ$7At˄9&CCoE1☣->;r_8J^[#՞w 5ۃכ{0f :;&0^n7gŝ嬮YDHdͱxl궎gyjX*;S>>AhGdt0dfeSw2Wb#Ά0C$g' J 4 !|Ǩ0$i+J mWmBM' & ~όux`ߘ)Ciuh܉5"e )"H" `"b((*( DHߧ `P((TR" h >qVdJU h2"(AJ)%)C"hE`if"Sf冴rS/wX)B* "kӑg@{9K:WW?!C37FCq)ӱjR_k}s*`$Ogd1X " (oꕂ\p{+?#!Ƭ'jb/r K AC^Qh勨{q>Ң G O!3=892VcݯhOwly@)/{'HpLiJX X $I0젹>{NoJ^-Z?f֧7#7o ̬cXC mړWҷ'*]) md`vcFj3-ٷ?w??Kn7?Ƽ=@ϯ m>keP r϶ly-8X@9+ Wf^,iaM3{<^_ 6^-vڐYnºdV]huJ 'lXGʝy{wI9$<Q*I}wT0ҸE} ᮔ>a5b$e~ f+JkսG#F#Sgfl{?V܊]tL>M22h6voT,_f}vLWrۺkqY[T($ioχ?YaDIU>6I|_3h.GzN(zSx1u觊akʧb))9#L}U'Q]n })֓{Px `SdQoQ.BH JPȷuܩ]';5؆5}>l:lPwMz|c !z 9]UKOWS'vQON_2Ssr1qM{8l9rnAm.1k%wTt 1'G7 iܶ[ lƮLeJ}z=x,=1>RkQ߯PL/'6ȼvm~:q}Sř8~_ه(+"r:8U-lYt&@D0lP"C!;e)\zW|/ӟ9RmZ^{N[^֭h+ӝ/>\-{fnySĻd`)J#oFiF ܵio Q` žDf7"7jcE[oT(iM4m@PH#$m*n?v[Hמ]yS-bnRv{tSFeU_WSkZLD$hx:e%c$.On5rX2|S"˔,b9FϴR b(f`n15.P &4AX\bÙ2707 AbF$1%;ٔi0  E&Pm6LqbF$drs8 a+*&KwQ7=]Bvu륤hffi,NYZr<'qx>׭F8}603V@@+"WeU֗= bPkS*IL59LM#iLk9 3jF&`jLRd,a!0;G&fd>RffT"kwuCU{py.Vxg0\=L&kzqAqL n*I N($igj)AbD6v:A 54E3@E1LLX!v"g{3Eؿ'8?=A#/"t*R}jJPm_v0>`2(\`DI((T>*Oˍ`1 p!+:FJtwxlIN˱jNvb٭zMCjSL$ڮaMV`bVAoZ] $=3?vkQSL6"LP;mk{-CvN`bGpӧ`KpX\dLƅ G(Sq~(-~5hRԠ_[;jRl?j߯?O3dE抮5Vh!4C~?]-/k*ʔk{)Juε/~<{Q{2N(N9D*  )8?r!W5 ^P9VCa(5/ms+XͼO_Hx$Q!Y8JlZXFRb u ,/m&^fޞL(' a/cs(GQoZ퍘R&.ɿTЭxp {L^VcR}QPUTN vJ؜3& *91=O OfJR1n2}hyn~A?1GML򡾃5H_E- PGd8TDfr;go~zWӈ_ l7(bg@ޔv-3mi|7޿@|fxvy>IngLBftwޏJ*ɡqp6\$a'i-#}r?itw> ngmڑ:agh7>1MTZi.R1ܕ(Cz)Y3Q T:(N:hI`"A] &.iĴ:i(JCI$#1# LLCz8mont6ԙRtQ᨝s$!BbrkT?v0ˀt B E)h)a cۍULCDQ\J)&jR) "X$ XbXZ(BX(!䆂 4 m23f]?Vʞ~Yx/F&7&o.Bw.ub]AGKA4D( Q6~Ohc8?/]e9*=%VkU~ ^/ۏZdQba=j&Eգih M &E=$j3pJ tL4EEH4X3v,pځA72d$ L@  4O<>j.sA˱꥞ ? Ox. Xͯ O$8)BiY&`RGe_@>]u'ܹ *\Rl([`S$vm!U?Ѽ+vZPcͶ+NۛcB `mH(,EﺪLjM+#Ij  rO/fxI՞ry3mǽ%ͱO&GƘrԝ #a%ԝ:!:([5˦ᰱKp;L_Cϟ2EئFɵ3kz4ݍO)aN.w 3 Zq} y]ni 񛆜(7Z 2̮dz)=zKuN|Hwo}^1uEIåpۗt!|.tAѥ 'mjYw_E!&2[(|:#e[V?pP 'fUQ*feXaEdb % G4Α$TiVxHD1miT†EsFf g9[ ffV9'':4.8}!a-$Ob4GQvunDV_ݡ2J6`zAx Y30æf_q]Fl8ۙX|M&;K,Aځ$d>KӬ<Ȟa R+A>%-~~_r2/畢q[V/Aq҃Rqu"f5dC$cO m%%OH3uﴄ 튇߸Ȝߓum|iL:AyAئZ7Pd9>טo͛N 5P'f% Pk8LvM?3PɶmXe]VAb:~|=:XV&s74#:>)hX۶0tI3;S>ÕX4} .E9wk* }1͈K,ΛreY XV~9+Z\mX2|%B֘9gcXZdιJg4"f0^--RA\_,9iFz-Xd (WJd3Sn̙G<Y5Ŀ;,Mkq߱Dۣ6|aԴպ'Ene0VT]LXY[%NZ,MB*Nx>ȓ;(~ -!  VrۄCvMh g茇Ǿ|]^OP<ܯg=~~J["z@3N5 &khXG YJع'*[9J0@YlR2ӜFn oL~h]KmcP;l6j@RC 'vzpKy | D 1=>Vdr)0X/h!iCG|4VESK'ӯ' )vSyw[?nBhNJw ;f $/4!!qI$^vIğ'$ cJ!3pޙm؏p Պv//=$ 0' G޿چ`5B[ C& <L&kc,h$T8IUUUUUUUUUUW{bW,~\sOºs?O/,:H@C3s톟 5Qfz&c72=\YzNyh&z\0.`>4BW & IbO36A-<nx qݾc=>G RX@xiaY[x>:$.z7 9Ej)CۿwseUUUU|Ŀ5%6f7ODgvn !!",ZGmGɍGwSIJO8K&P 'RGC<;'49ZڪUJ5_\ATf`H$z5eroߞS**=H6OZiL;R"Boo FY*FR=M^dɛ!d1!ơ"y. t~YYМw 7';=4u*g=c/YnѿN>V˹d/Z2]"|CCp4\EDPCB@0`D͞IЇf`jK\=b;ϼi7gfV@{pbGS6C%6O'>ؑ ~ȕG G]HМ'd!3f^gԱ-Z,O/40zcxU$[S~5%rĪUlx)d?v<. ɘsHf=5;ti GC=PPH#p <&`CY7IhA܁{g"t۶w3XsGޡ19~AIJ&ZaO"L 6|Q|&np˥ιqHKvs"xd?t6iך9NW#& %YVk1~?o?*&4iIGDA`Jj(]GcѶlؒ–5:SC GURbgY8Yԓ#&Xˎ rs\PdTx$UL0H~)TU~&.}2[f73yGbOdzBS$z$9{yb%bpcJkNp&ĖZ8!2IjZ x-Ќv BD̛cD(يYʟ]遾9MJe[lDDLQiG͵~jطz`0PP~{~r_U~ V6>\cGvnt?㈤H~ y\϶JȜnfϺ!C_F=?X|ҟT8iLҀ i0Ȃ@œ p%]KZ@ڞ|" @3= "Fd;*JCAw!m0%m =_mi,Y spf{iNai'/b_08,E8>< 'cW@9O8̓C2Tl @z{@aUT<-wq' aiiiiiiiiiAAAAAA߿;y|ܶP$J__o{|;v^=^j*(78.8o3_z?fLzgO< V.2⎛5< 9$ JsdTO0C4U0Oɴh~-  AErd)H$HQGdX,M)S$SgkQ*k -NU0AdCSZ M)mxzRo}lHkچ$:fRB6Rv'wJd{a)zi;Rz=ϺYO#ōNxbgI%D">D$@qW2GG~*~*80GnDZ uRY^m:DC#yu953QޯKq Cb,:Ap?s2&d\؍ՉKTÍ FZnZYé.8GR0OGgı@oeV9ZYeBgHV~[Sٚ.6C؇CeJA`hTŋ $1 Px8O i )-KI WD2:G)p͍FhJlxcn&ݥhd>gʂABHP @ T*!l"%l$\V/BB0;NJzr1eMK(6gxd l)JxxgP`'y˧s~͏S>!m1J.zkIwu;sȻ"y=Z9T)',Ovm#Q߄-tF͂1U&8D2TOfRRkcRR4&_"H&K`<, L|``Rw)4'|ǭp=1&<)ɾ>H "JڤdGTW[pS X\$Oi-@]5]ps]5M d].:j[3v%S=áH~5/OtB)w=Z̜+JYRq=K`h HI9sWԑɃ=d20就Ҙf%ݘң!j)uӥC8C⣟-7WsӨ>syK]J{6ȡ ӑ#gWׂa)4{=ܞDzf(k%C, GdiwVqOAǞ&bV3qzrG:; +@XA{Wi;,(KfkTɑ0{3wN3HKV9L&-C$Q0OJ7ŋDOr/s `>'ĂUYٜ|iސ9O [k x*u5=;Lk63ZY7g.\evn"FKbzZ)JD>B=0Է)0M#qX~]7oWoc;^ew7.ϺN6MM[f`f͖6S<,ai䰛10dd?Lp"*|L@$]_/hR=9UWI[Xo7QL _ەK5oK\5gSߺ ϮPƣJ:<6  zvkϤH#; iʝV "5xu•-߫[(bx36+}ŹT6gR IvEp%A+/ndpJ;T WkѰ+gp~8g VR^3] ϗ["`!/,·7py,c>x]ʢHY<Ť>oga?$G56GpѤ:6D2IuV5LPK(M0ygU>gk}}% ;bXeۋzz݊Eq[ٙHNבּ Xj5:&>7nXf7&KTsn 9V*gS͖>mQFQ;oFWYï5!u\8S׮-^5M]GKfCUk, :D+HQPތahVR ZQx0f:6`)YxH_n:V{%([|ߍ]IrB僉T}mZ =Ϋ>t(}(tVm? x7#~8R!O2DSL/IsXkA3ѹL3x-a.$0;eV,'s_s֓}7J*Y@Ԑ2fO t$9+Lp9c b{zt$FbX)'.(6A4~8~wU&BY8؈A3 aǴbњ?}[ TA g ߽^֕ZF(Ãj% mswww${|4n`t 9WC?8P:=}dկ=)J2# (Cem ߰M'c7єڦ8mgV<;}5->:1 l;)s3o/e4ܧ{C-p[~%BOjOLl; h7ٰIɾ؁T{[yI"V&1fe|oZsoNHB|-KQpnLu*yLֿښg7q,%2 pi}ަЖюGiFf,d}eD4%5+ACrx3d-TFxԞ+ȶk|̀ÈL/7#2𛓿(jH'Uds72=2_-DӖwf*1.N:d&"~s=D"oqGs!JrHIf1W\=/~ͥ73m=A2pLOFd!o@ߥ>"o'Xu/Cz#B;&3Z7ݞnoa!uCl;a2>՗[ޝ!nj n7MZwG'.ųOZb>aBzvTb0UP4C-~-f5jnn\IL!I5: E…*:7uRe$_#9:GZ haԈbУ-m2DZTYu+{={]*9-ҖTmc3X sj)Hŝ77ApeѴ4w8CPw39Ш1j  a4jadg r\0I]¯ӛJDYyF0AInėEЏjX1uwv.s>;"/i/W=K-67+|MȚIm qt>fAOϜ &p_:a5܌AdQX0{lW/ cFdWd 4$Ȏc < /ckˁ2ժq&l]~㥱W >sfZ.g>.r0̒6ns١`'tz}ٍSu.HoyLG B8vɢ7`f.mZVS&R ȕb]k7OR^G Pߢ$LI'B!aPYz>U׬-P6ZvJ2:i5=|)1z#\4߉iȒyI>$We 7 ##PǠ6 `Vh[\Mվf*̪N$ғvOآ;L ZdÃۛ +R7`P8HJ`kEBHb"E@y;cQIď"zV tGf$2 3ݡxb*u mƅ}#Po̶HC;}+bm~u<dGҷ9f J@C7gO~~eNu4nZ?ejƫLR<<'}ޛ̤'M'>Dݹ*S-$"taMm^ H[LVTq'#LVmgD/q{f8ܰ[#9a\;z<=yi1{SLZ&Q7'zo֋A/;%U/IŪyܨ+dUbHv͓ٗΘ:I+ uxF[rԫyc/nUJn؊t"ZRsX_?_>ɋfFxl:ϙQtUd,X~(4JrgriF򛶸9=+^Ǟ'C9:-0[5m.L:da?'N#lBrGM"1$LqハЩ3#XA@p]P܉'X|^9t A ?SOͶĕyA^ xyG Cv!* \iQiO}f<֧_[GJ-’ܙi#vȘōI~Vnt z0K:&&l wݓil&y]Eye`~,-T']cZ[*̴@W2"yV"Y9vYbz'hWSXɴyjT:fQ8w|PXKY;g-7sћۄ,jVTBZ0ǍgX1ȱLS<.dYvO*\3dlwDdwN܊7D'asA2]iY0Ò&]3<>HR۫5ijmX2jHpٛ22v<'+W Wy9yάZgGK3;=KG^zۑN$)V@ <8T8hSC6Õ +? C@${d16HxG&N9SHQVR틐G=cSp}QȪ,JU"K :2rW9.O YvWCyI4sxlŲTc|63ҶЧtơW{̵7p" 2$,Fʘä]np3Գ&}t9Jc%ialVi%DL`CGV4WmG+,KNn,]D3(^Q1n6O|]#l,*1S%t1mӕ&:m5c!f`h5dh;qgwKS$m򉎛q[0O\Ԩd'2MI$'>uEegldSFdJx}d>JTj9nS·پ窇t[}2kP $Y_W|L{x֑L=pM[Wo /ɔ4u -DВl@qVm2AD2@@R$ړW!d5h^ev辂bWFMlZXiҏ/@ȇM<{6%Zv𿂕~Rj03Ko{'$4t"RZ Muޒt.k]%>S w,kp˜Vi$B_Jh$ p+J}vfTհfd"*\t?>' M{Jrѫ%7[k&m %=orIR#l팟-6n¶OFQ44Vtř]2!rxܣ "SȆh'\iվȇT0xJ/hĆ4Y驫?Ը0rdU N8BD"l~.U׏Zw0 1`NrG}C|FVLvY5%"H{gc='e:oDGĀr o{o8߾ev55tR" E>%ˈҴU&qof>#9FMUu;4/#4-vq'Szj)-kh6Z֓MB+W{?  +z)G9$MAJ^K]E:;^s sĨdGYh 5)UXH=khV<`6+=vm|OyZڕ%kȖ]93PO81К_3R@&qAeet5a c[1g?G"Z)՗@xؐߎ-9:nؕЫ=DH޸I5,țVpp:]F4+l47ʆT$΂z}ͳKLG(e/e,=7~edNLD4&m4 zKKMå,IyvaKB͎Z%aU0-"l)AIoìHM&תQu1S[q=>Z`أFCXua|щRWMN.ϪnO;sin؃mO/vap୚i& {u >9SŜLwg]9 'ݘFS1lټήYY!I27 4j9ˌnoہ〯Ξh,`fw.˛$|N.RMS˳N7jJg|P*mRnw$&Q=IޮdL |-;{g܂0bI!zi:Oɪ2GHc盳.m)MۼkX,@n.=_ϠO-%Nw.d?O^#Vg!gԀSD STrj4slj#%5wDbMki9$QĠϭuX1G;@=7>q!cY/I, u6rF|xl$?Ŀ58v0}=N|M60[aO1h9GwR,\ϱîRތ#Ʋ(Ws%Ͷ)+O|s]Oh0^\LlR_ɾhs}"Uvk^<8[Xf&/g飓Y|y!V38M<^^T; GIwxl.w?n1ޡUmҺ,,`CO Uԝj5Y D6y*OW}=5g"4'.ƥ61{0`e7(m{"8p9,a@' Mx5X:R0! Ўr72 {3+ &56pVYr G(ɱ{J@jz'㺼LXP AI^2GqKebɰ^%akF32bF$&ճ8SYw$Ҭlẓ= F(|b)K 6KYIM\$@;ώT}3IwYYE0LJEq'^y`c6u'ݿ l@.$gvP0A#P0۸CJ"tQ g/K*Q$'8 RΤ,9o9޷ `M2i.<֌`^b7RRʦ EU))j#BZ9;jn9Ec_rB} 7Ψř4NU(y<2C\DdĀ`_xr23=ËD==^- [CuQіx$XAE=|ObV_01N%\}h*?{lw)DjjM!!%"@UGP]w҄:||O*N7\<,as\ a{,} P^Da $8IsæL|?7rǯs$=?}~F5xc$b+|QX^ lq!W:Th^˽~L <ꑳ8KlM|EU:~=N{g0k;N&U8/ǽZy\5YTzRHla\*fO%Ain4dfoQho*~4`{fk1׽4VjG<'cg Mu6#mԓv+4r:+W\)6xKײs0c;`FJk !QfO(ֻZrӑ-6QaTp|bc'@u 8.O)SfCF= 1}JJQE.=Ơum #|럧|+ͅ.o*y> *Dpu-}g߹Aɂk Ɉ,  &؇'?@}:+]6_l牆UvGF]F>e:<1 γgabbcz͈& ٽ.Ù_78q}tUY4mMlѿO*xxq8_EMG,TƔ^P^PSZ&ȍ\#w mDgkΥuǧe8k7<Pk >=AP ~,agf:O{m̙Ym1FD'6xR(JCbIUM9ޓl9q&25iǷ Gg83ΒJLɑ;19Aٛd0 ɾpUy;I S 8dA8sXmˈ#p@=jyj>2.q&׆;FxkTDR.U$5bXV&X1G;t=M#xT9ytF`4eԠ`c#Yc!\%cN<^F9}_C#fYfKm xM w\$cc3?4̛Ie!w[`̙ͯ?<9H L}2^\cmKݚi1Xf<|՛'ЄXr2EbYB„w4ɺ5nt˩@hx:qZ}hwLqw~Ii#o\$hl;2N ܺ\Qgn13Xuч."e]ְS:}4E;םr\ڻn$|'cb0ߘ0ac6c3Ԙ nLrg r"t^ moZs [j 533 IA en (5I~< [~1…SQl[,:[P1Tves9w9'#\v\e= #";0qK[S ݝAzV3*fAO |!o&<7k"7$ҥ@m%)n3 rU4B.0gW:Į632)b[ yȋnFWRn hxFTrYUyF(Tm D͘ 8S`v,ˉa2 ě57"]\֓01f%.  OA#x|ݸƘ֧EɌ=6吿*=cK>[ z#amNe8{G{FcmpeA<- H]p ;3ڤ#`FHO$ŧe.:huo6[GY1a; m))e= R&t {^#\Z+Yt^êÉ*Ü;]π6vK< Oɽ#w-03[Db԰!"aˠQa0&ОP#aGǍtc%㫇d|9g^a!cCCFt2+skGl &B "&4('gI][\bc!t}&XMZQ4nͅT[pظ_3%Ī`F3HcUD~,t}ms򔃿f.'Fͧ%"NJYy<n0@gf:ɳI2QiX_ִ }S3m-W?8;pǦ{97&dރ*qO;~φ6{OCߛl V ,;UR7( p/K˪돞Xw f)' -U ?)܁ϊhg6ld#$zcw?ˎ0p错-@Irg^QOn~&n_!]qڍ-ES͌uն z#x6$'Xo.sU.]3hjmĔ::Dncc5o>)f. I`yo!ٰ؍! 6¾יM |Rqi[a"wG/)[$6&(~qwww:Ɔ[zrѡoR;e,G_dN;fy{\dz ̤=2#fQ-|QݚRwI}FϤs1Nk'nb ߇ ? (q8'!popy#H!"1Hl7h%$)zrԖSotk6zWّB܌F(ybAۘvVX HaъoUS5}-[ͺM.^g] Ē "ik?C_Kǿu]sj>Z<~A^DbDy[eBth'~c_307ԕj"LLC;$9؍8fm \sYRt>J6>k+p*lq su{yrb;s!ý[VNۓM=:! L .s՛{{=|\NB0>ɞzc@ڊI,M^v|G^{k{=1ÂύK-3Vni~k&e0h0#)YS?LN|M=-Kd}^ $m>Zl!V`ev?cջIVgLoOݾ:S(%B۳+T5L/A㷜_lc= M6,SQ1-m73ϴݽ1%2wlP2Rm0!ÅB2Ʒguefum&s'w5>wO86er77>=}yPVWJqyeIkQKwy懜mlcR=?Sê hȖ3;Iyh배ң[V*R@E+L:7k\9?[zIh\*݂E]8;+g+nqz}2 JǪE 4,oIfO!(wͺСuxF1COf O 8^V'M*Q@E!9uwL1KΦjjVhY^&‰N2̽)hc]*i+;uΕhؒAyIE*#S^ʍW%kX h5GMkҫ5ukݓdf a"v6_Ii!ZO c9UXއsz zVsĬ8\B=CϟbsfsD,B"O+5qVh0bfHrx|8lt長kVK=6ExUeLkMlTX8Ҥ4(9487n ׶"eu~M ]TPJӴ]>ȴWlʘHZU]0iK+!e='zXJ66mfLdؐN&F{ik])0PVraJ`3NgMҵ\ٮOqʗ3ăruKBR,\,l9I8Y؝iA'I:Za2+. X# @IM7\(6ĵXZ޷[C-;sF[vw֧ǩr~ȄQeP4Y4 ^iFOJ{λ৓ՙߞVKaf[xoz|6y~8\>-/(ٶ鄲ZI>cLMge+e )5$SԔiI#hg(2.Ux\w2ٶCWzfa:ޘ>80z*358PrJ>/V/zFmtzԔz̲xeFy ഥ,Ij=)ŰM#,i| կqr۔J-i(0qe1,]i|/9 Mj,UVP,(VL3&ӆ ],2* "5Cc{Q'Vtu/ܯyagaz"5. 20ƻ/]Z<ަ8y |gte z*=Vxr1O:Q aqqoaepa݉^9k05sf%1rHwb[ʩ$5>q ΄Ir-|&uP&1 ]w}|qY>RU|8c%66E[Tx?ؑɏ00 :ILH؝Ph/s9|DRt\^ˬ|-W.hZm)׫Icmɬ[gfiE/&AK})VT0Dk(˧`G N1FK,+d<*{ c*|qJ=y!gQZBIREiceGՠQ8:\d#]bfm_סDZ vJ@:HK*/5f~&\Naa^u5s8^Jf;. ne&R(ۣN{P4A#+y㦩if|f?ej*PgC!:N9M<=O#Rx{Ki'٭i-w$chl F?ћeq2gbe 4DBse:HnWhJ N%]*9#q MKr=F۲s\N09ghY_kSKtg{st5!KnjN8.Z 1C~\ze5!wIP>ѳͲ=aZt)_Px([zAn~Fjm#ka*H6ϭJ_ PD _Lrc^_~@MCia}e~i]PH"đ\ ).W99ei]IrFo~8No𳬌t['EvUY V#/ T))4"$s b "TxL9j,_NwwNԲ|\c L)> s J4gČXťߛ:*mrU|RorS )F$S enq:Cys\|_:S;9qdmbcL53ɕii}g9:,,#IH?13iRF–7w>!CCM;R曛Ӧw_p P0:/_o2Xu%:P B]TωJ|&4;j1&<ra8*|]Mu'-\"R+;Ye#Ksxx}aw?u;>Q:dky&5ϫ]_ګ0guxy6ehMͱd5y3asj3͚vdD` 7IDi=׬g=0QWq"ϗueW >٦}T];4&+; *Zm7MEkR(ZCCcw2$B%8*FlOwi {z! ?N>уJb(>P 9 A{t9f0+ U[e)qGZׯ]`4#T(TcsET#=\k_G @)0Ng~l6!ďn:Hq&0 `٘fSc[b_u?߶aY[,otVUq&rn a57*ErTwzJQ&7tэ7}KmodMtSbJߺ4>/'~؟?-#agӴ儳N輪W_;D23hZeMG8֍ zVf[XliL2ݲ믨lnڿl[udm4%Y]Pi?%|d==\2JkR2K.nڇ_ G즾軼˹1֘if鑁Oak>  f!e*4hPܖ|IKU |EѰLUTLَ +! +Md` !Lz> cn>]yWiH#$ o*rIg㌳oo5^Mr /a_?׈ȏW=/l @~_S=oSZ:ns|)ˁ9yfm|>b_Umǖ&Ƿꬳ],gYHopLN ma4'i9T]'ߟt~'?[; _N, !"%NLN ϱR>OYCzgtO=\?1?{76#dݱrߦ%DX)'Cƭdv0DH?Vg>3~NZ&ua?hۃccha~OsYwu㯒!g[̕NmɸF ޸ bT&PZ"3zd5cHR8̳ʑ[GIo5shoyTH_2X(Ʀ5m6NQ|6ŖJ󘃵^҅+Жd))&&PiM()5LPc+]-.cVxa|Ǿ$*xj@NNetC<¶WCb?Ed .XNIzB g qy17pI/fc[y6k>ٺeY~c򿥪k+O11-vm&) 2C$еQLqqЀt5ƻR֍0bexxF<݌YQbwT90#-ڈjz(I ı6/CCg<6Eˆ PRQ$BU1P0DDPGldɈ"j*@22!!+/yÒ2bgw$kpH1P1UT" `bT& .&ڦ'443DA?dgg1) 2L̟/v{rؐ*%E HR*.?A℡2mQN<&HC܆F } ~mZv"1nKTj /Rym}Sl_MnvHPpfbʤJ&=c[,{l:t6.XHt`5DWb K4}q[ˊqk.S*Plc5C7*CGPBuLA^˥]ϧ"ωjv֍J{#>G8ĚʉBAM1H$D0P-(A4H24P- PC(=E?< J#I)62 S) p44A2DBcCBD&BbCKo!: >suj J.a4&d?EhJ] BCdҙ`y )&Z9MKv LBa)j*P$4ChtKD#T2.`&s|?w7|vzw? |cOj4_ w{]~vuEeb8g1fZtS~_Xx~|M$˸ y\z(O ^jͫ.;^!M@Zs 8O/(s/@YZJ8?Ozz+慄y\b_`NsloI؊vClT0gA5oˍ^#33iu(N"ߵ[j1fiD<2m{}i<{&U Pі@tmDsco5+{oG&M@*J1Dm1=B&  v;R'z`>] 0 0pVH=Pآt 3Ü8SpUלi61QP1%Y6?EY ӡ ȱPXя0MPАS,yg۽=V1zN꛶MeF;bޒM{m|HM$;+CFHSӷdr܎ZLTHBhN*L(h -FrN^At~i][*i?6)r]|91kSKbi1re H8l 2qO,0wr{Uc+{QR&DnڛN)=8*& ĠZ uqN6c5q_STqįK:V`rjpk3L6Hי .]ht: :E6656/ S2x!/qMcI:ʠ_ M"sN+O] Ì"q7BLPTL0ܵ['l(nhhB\,(!:`ջdPHie"3f5jG;3uX2jFΙI$0 f6ܑ &hl$3}3bHY%`_MЧZ2(٨'Ƨu9OM;4 4 HmCZճuc`OuL[ׁAtPX@϶G;zjώZzFm^۟B3>vs'|Oōnܗ~}O|>i}$@^ 0K݇PR }{S8T[뗌&$`bT1  &ϓ8&HǹvVoA؏' M _t&>?_m; ;ІrڠmY <9vMe(hokw_nִwIt )E!<'2ٷß>7屣!՞;X}Cqfܐ6rol5u5*;1G&J_Zk$Ôy6@3_cGsh/@5R&X*1#>>;l0l<]# )Ƃc p H&s݊ ej_"B!x4@xN/IRqcƗ0v*2F@)'Z @13 :FRFS _N)Ԕ؏P/kqfcFy1uc=/0Eay=)MkZ==f~]C8]튧"5DV'ӮQmZGcl]:/q78CE @_oT3|4{Hz%J=)ucqzc>y1pR{{4LahAa`;٫Bu"JJI;u돎u տl;q@ 14&pz1UQ$ f=4' ̫#Wcn9w(Elw6vfqR of# okom6jNLZ""""k jg>A!1rTF.6S4#Tü{=3eQmH~ GlhcLK/w'D *ƚ 2f;u:;u v? ;v^ͮLsC\,r 0Pb>R;FH<em m&0%3}oXyL#7E0-:ljO" Wk1z ?NvM a㹁OycT')MU(Dgv [\kJT=cj2'>9pXax! < Edx8ǪT1tR$\+h= 9-Ѝ ;j':H=pnh& Fܐ&>Gd6͗!IԼ,P|@h(H/o?]QŏC80>7ڱڦ'Oυ}Gnȫ(Տ za_Ԫ) VDg=p7K]oc&)Ԟ9!tI35d0Іyl(6~|u08MnO#8 1u7d__a';16EgSiԇxPc5qݵ<m7sRdư"jHw1_*Mb)̃e#`vo@l n Rrc (oA{\2bRp$Sdjy>ޫf;gP DP"a"a&1؋`.Xaz91.ƫ /\&Hobki6&l㉃AJKciWHA4ޏ m,&6.6(Ɩ$ٷ8Sلgf5FFwJLGI6}q%.m`0PKPYq屝v vn5w"+ -L64c1 "?: 1E='>aί?IJ+qt'Y t8D_/R|c77vi:N$r}5k3$ݥ1r mK?qی43trʽLf/9Z H8ƩGT/\{9GrÓn^>]1i\{s.kd*ldv!}god1N)EFyŊ}MˏFm_UU(uR]^#2WV J њ~綕7,P.f_);oZϓ19{AW ޶}ۛI};%\\ؚ^=!aWcۍ'#wZW e-zyz# z^(9pز:0>[EL6~a>j;sDa,6{]G4:l1Խ5c<wvz8+&\2֥#vun(<9$b ~M1 =ښ_! /_ݔJ zģZLQ|e:)BODa!Cb"jø+5ℋՆ΅kPQ+E}]KXX%m\=oEs_%vGꑟr=M B\* JGYmTGe >wKyB)#g֞rG:*Q:PR]?iRG- |,U }$wvE]6~gvFhڰI7w!// XdL*?%^ítf$C7Ȝ/ՒSnuF,V35Ulr-(\uw<}N/-jq}~1B x8U4od61w>$rg@ C|>E=h_> g<{7493:<;2>gsc,9{~z>;?t#a3?@߿{ _!  O_v~1  B$C7Gh}X|ۨkl/?LF$рr7v2c窯av[~w-N>ChS,;_6t)f~47)aI9Ǩ, Gı4{;Mx[צ9I_53?'O#ײ~ES?X}t:yqR%~ߪ .=?^H=vsO=Ӳ.\]zi׆9Qk^c% 816gc Fz1ߋz /y[Ae>ObL m.$z-+~ٲ{tUW7/W @Fb<%)$l-󷺵=;\?wo>@=||:wsmql>$ٟvUS/E_ri9mPDAFF~޻vG6;p+0FЇd mġhlFU?x)~YI)m'xjyVmP\t$ /{݃jl@ofkoTؽJ=qD{4v9XQ'BC^Vx&20g۾~[~p{A[Ip>0N?5u)8J#S2ԗzٖi=rj*mNղG~wY#qeS]4y6bvQI9^Gl4#Հ,8m=oyQ~jlK#K9])\1iWl3߭'tUW"cOS=˯\{teǦnH<#og^䯫ꓲ~>\r;/ҽr.OWP[W ߿wC8XKVVG4/o9˞QS,F(۔Sk{{+=(5dwx#.|벝J1:G11^R)#O1凉3Aqn\WdN'/LJ{]r# +ZgPg=j$wp#U-ʗ7jm ǻVGPzSTVpr5$ :˙K{;>o랃jJ&4#_6$ xeD\2Y\af,`ͣrXР&w]c}ZS/gbVw֓j|Ps6rnzIM6n+tp ް[Mv.cskP+ӆ;;M8nvimٸ[h]'M,u|2gqJwr uWgP:^iwcЫԼt]߷g7z~wV{[=6jH~DbE!}=_-+mK^Ν"$|@{3jtvC`Tqtߥ9؎y\H'[\+<Rŝl#xuwO՟6ߣKɆLMָŐz9u%}H$Cp+/kE&]6CEQ@y }wΝKBQUWՅخƏ1%N#M4MNٕ**z:"w5)ϘjŜGj^y+Yl 0 (B'GD wu2:z/R;/_w $ۏv;w 'yz CBa􉽂>pE6v]@2 ;y>}.¿7ن|x;i31qymGӰ~_aMw4 x[hؚB7$1<_/u?N5%vޏ uwu=tnV7kBC"ROQ~yV\/O}^vyv>Lsy 4_bdM}Mdz<ו<dsb2T>^~=ƨ'IǴi짤x~qMA0制OWe$/Fcuf*tgggJf3v,2ĭ*+%uꥻ^d#2+C=2oKno&r1D;J@jZH ;3Lqi皖[ iaȿ,O~4;)_=q޻wEyrN(;5%~Vel)+^6m\KIi"!QV#~O7r5˶F|}7չEV $jI(O_wc Nݝxygi[oj^y,K'qn:շnvhp[-}հ^\޹+=֩(̐2%.uqb̄ %r\Q_ ?;`2$˾#픲 4;ߖwz=a/Fu{EDi>՛'dy<ݱ߇Y>OF)\[]OP~o_W_BR׷Íu=w{MOG_y)׽Vx=_)[:p{4揉X|xq>}\_:mIN8 +>"`{,/Lo7XWH*.hīq+AN$|B֔&vw%h);>n˕6rZinO;2JH 9|Ik|&zp靫ij.uW+_kխL/5͖ {+gg }Gc9*oR}y_g\(Gzp>;n z|Gxy_nzw[awyᇃٍ*NͿề/"26v3)YoU,;/ׇ,2e=Q*H-v~Ӄ_R>F͘"~\_Jߛ_ÿN|ii>/cv/E.,w z'[ Uכiv8 Azm`2@bow=ƓZ~w迳 7pHg0cip‡đa^m>q/mω-7M?ofWXُ s7~LyKgߺQpÅH}>N٭ua[u7lF{e~u}َѽJUuaNYvso˗U{1/+t^z[ͨSJ8Ĕ/NlT +vt>NS__hwFV)>HEmd}n5;|1V[4= k5f=YP[p=Q< ⼗>wz:6SfTjL9N#ϫ9^2G@O]3ȳ[uw=ΙK]vz%f?>ߠ9&H$hga/Fޝ)BӫB缨Up>u1$Лfc}bu|?SƆρj3 0_}h){4GHN P'IQCl3to>9)ղSHVD|qz'۔EwMovihyud*\:')~gR|{8tV?]%~>dDdqbc)ucB<&Ue$P| jCgu%{O T P:~(s XLlfvg"L)P3wI2 mM}gG<SElG˙X Z~? P ҦZ%B$A YQ*!`( &` @ J@X&iFZh(H`*$B2dD`pNtZN R * Av*EbZbh*BH@Ĺf@Cj5YQFև;8n$fpdi F҆Sh2+5[b4VFRAVi\0!Ta1:e0V6m(Tu,3!P*KLpcLV16eMeJ–V((AB6BHcUvE Z0MS[b1hk!Jm1Lf2PMQ1ŀ1 V ,d0I) ;K!pKHa-g0pƀ )"F Ԡ5ص0 4,34p#KADJB])Bhp,q((XJL&(45@bF64Kˉ 9#mʋ*f,pJ4H YsEZZ *UsqP͒$ҬS$bɘ1MX\Z-bF p iv,AZEF %Pa"V Nq5ki.J8fHdIe)E:q(i0lƪm2VuKim3J .4 Q"Dpւ ' -l6"`NCMs%`ړ6܃MD0S035pQ $+)s1:  $Cm7 );9 AABDLE,DDi,MdGAQE1MbXh'BDnd E SP4ٵT1hD3$@0[k rD52jtgbV4Ƣ Hk6EKm5efiKf٨H:KPmItW??J&)"lp~$DI6@R-Aj$RyoMz~AUV("X`(lbB4A@P<|` hTTX%$DCTDC0E DDPQUPJAS%C0 SU 4EQK@1 4LHITDA1DĊE A%(R2(E@:PE$A<4JBWy<0@2KYI5-Y1 A(ܕDE IΣtuz|:Du$;a);?RfJ()J ʃJC<%!L%I1 P `1&K 1N)El1IuM@(CqN8ƆC1 1Y0#(xHa;=r{1c/b 4bHS@@*HCSn{&RRcCmt"D#8cטL|<3H$I:ȣҒ! {)P$%Lj,B,M 0}PE{w`tJ'} A0иIٗCyG.~=FΌ$ܞ+،T!b; &!{^omVeU\s0mbv1)}?XӡI4! x=諜|Q*Q4dpAD{}'RL1xȏ,c[b?l1'];pg|52|X(cze?S=!A]< =!X{sy{:OKBN5Ida /%5>=v!?Ɖ=HR$+avV֕8Ғ'zRW _QIm~UЈ{=~| *bA͘2 >H{/XW!%1VE'o7k\&c,9K[|C(Rff%g3z4}brs'ɂ(*geMmySMZJӲAeg)?SՑ&'aCjH;fl9;6lik %\.QfQj\]:X M\9L͵nG_*ÙW()H~'#:Ұ,ܢ!{ݿ˹e%9HbF@QWJLD̞Zw.c]w @3wzZyF q!Dag:7th= ڃ=˧t>!|O+XBwׁg^50}u: Wxt@Yɻ;!$ 33MԃgtNS22M̉]GrfP(lDnw6,$L8<#b.v|r.--ssLg)A3uf?P3!3=6SRW/Wuk<4l25oʲ=+w]/8y}:^s0gi9L8LS|#l+niȿa5hB] R=;rü. }8V:wO6)~ʩ->_!=>N@t֟g N<Й@WlufP4m }4j&ݻ1?tGg$ݏEw?|8oUgio MA&lsY~9ἣ @LN~vU]nU]nEWg>/¿hG`5olfĥwA1f-_w=-*r{Ca&ͺIF4'gϧ&>tqS1aQƙ9i3<-;|ݤj713$ɐ!҂%kX}T=>u )F"};{ ?Ǻ[Qn{~ngF?{;zgTE>Yo:/g=_ۛj+zrIĭb qt)_"  ~?Th~Sn7R`ls<ΑؐbR rgywh|Zm.-d; -[ `D(z` Sa Tels |FZ-Xd!TnF!>qG<u}: vn5;IHvI YJŧCCg[Gv>ƪFIv![is"/_\Ls 3ǃd+ Oa*~zzRPSn᱁T'BLl"h1ĦWs3BC`DgӋ`b+1"k{l֡}M#IR!h'ojۘx9iM4??R %bv}N ;/ɓO-q^M/\2c7 <$3'5y; ȑK%=G<ǖ4DHdK7iSc3&3_;۽NYIj3ߖP;IN ⑚I#I8VS=qk:dA㧣SXwQqv:m[)01P4BfgHm5q8$c߻ŮgLMɴ”u8h*OS馝xH.>%; bm򹰠JkHTHv!1hMtx)&4n)+24tͯ#wˮdG¾'2S|`Wh ]"\#Zyb9ǧz?A+۹Kp(#OtSUʏ)R\Ї`iY8}uCGWU8u['O|5;ǗDsCsr}x '˧\]V-6dXsCӏll)%m4\v9@Z٫$J'cq(lLk2a .2mSfkj1itccƵ}pd~z/X>ٌ}ObpvA7WST'a(}RF7kLJc)Z 6IG8{;NՎ6} Hk ,^yO/Cܬ0"I3RQ1<^6sb׎tbMR#٥>g&#BsG m8o;Kռ72L͏eF=[MWm!6ҳۋuyfLڇ[LDf1c3@z4_N&۫rYUj 켨Kqmq:Rx#beE(Mާc4h{innFL%`N)0h{} ߛ~V 0*! v v{G?/g3%!8GPbCC"<쓚;7^s$hӈMh9oA=PΌ- Ȃc9@s@9IĖauMI?5G deؐ@ #= Nٝ{AfhMX:/e) s8q9;8 D۾(+<u SzT4 K`pa̯!<%7@8Gј%x9ȳ Be+Ŏ`urO_p',dA z`BcPoy+/mZfY0D}TyCB>>2LEQDRzX " a5 ĉ܎r-^}|Ӡ]C:de"_=l[kZW jd*Mðs]Y0ـZ L$ ͕ÆYHڒI`7RplɧK.HOS̉2!pOy/?sU_aݸw;z6S@Þ~Y=`?Gm:vT,K :[ n0(n[S2f*jh!o)`(m2 E]RU `w0lכtľ5TO(n͙%$i s+ll=*C/ݘ͘'!B'xIn?ߖ̿*uƨJ;ҳ\3'mOcBTکZ'Inll$xa&ldsbv^߿!&ga7:Lnѳk)&xEkYzwm%Vjol`1o6H13dۓokzv}Hv_w rdrfX+})?ervƷO^87k"btR üZ4TJ||' )3{; } _4Ia~>pL|Iwǃyn޲ vQJJOޔǠa }t1sjLr߄9>Nr\lNiXzq¶BK곝ʐ9.EC픳ߡQV7Q!G35=W5N5VnmT,_;=1xɞ+(G/sb$ՙ/[쬦Ƴ嶭/,-F8J=Ke^PRPa)nFcu+5ߍ+K8=h)("RuGwJMia}VX|ЋF>RZx:)^ c#eJ-[cI.*cLr%([}G*T\QOsn88Kg "~;Ќe-1β^X_k^0̭^IVi-+KzkXhZ-[٣y ͞R$KM%y8_;kET/ó%N8ޖolNi_V6Jx2TMS/9=$ks Of/wy9X+WHiL$9Jes8ڦZ?OFEs$۪mnWle%2xcws:D7m_\uKKcK7[ل97g3b&\f,~!Tx_N/oȭ7 Y=~sin0/RONun +s `+S]nS z:bUϞaJ<2/2oO]YM?YO2&?o;!H33`Z`f~&剈޽ ʂ'YnkK#aK<5=w(i\.- Wzs gބx?sO/~ MqVfWFVcC'yzѰ,D)`3V>]hQ\/ZQ~QxT}ݛv3;J}[2~֎l|21zGwjg:4Xַۼsk^|rIVog{:f~Ow)z(DK rm|]O.%[nuꧡ•22ycM.8T(QO>bl9 o|N? e#'o?RD+  HH  2JU$H@LH R'9@o>Ä18 hb5a$pؤZF SFULb 9"/ %$%DD ' 4''0莱GC Dִ2b0 ..K ]4K\̀s?ؔH shbcLFTuZsfHHxV  64rV`D\ 29FQP;sCI80Q QgSR"R<,hd&X0T#Z1f37%bh34J.C<ѝ@,`Ӊ4PPe 4 s `{ Nthړ)g"0w,xCXf((1bI{ćHrG^B"j≨Kl(*`R!v0\J<KA,(pܐh1Y"H!E2dJ4f@)e`a",D;HMUoGF=_ӵ '\=͇`|;onvX NIٟ~!_ŗ~`}x{Gqf`ST}s@Urҳɽg7qA[k5&BIi @4=F<甁ge򴃩e 7) ó^p3A΍I w ׺| FQC}M;D%1r/p$+%Jqm"Hl\^+65CR[5'4Oe6 $]`-Oz'H3>ʢNm&d_LL#yBP~}}#x*CxJP@PQ .uZ&iGE$l `䣚v5~txGX*a Au((X9-u̢Lzg3Sʔ'{dٷͲZ ,MnJjNqR7tudVP16뷸Tф!J 00H)BE0Hq8Gr*pɢo|;1lI+1{C$%`m pbE/f)'gO?/x_لpUi_Wk]Σ m$yYU0nx;1:xÓ!0E-yJKsE=TI%vw3tawU3g;aʥzY<,<-Dd d;iALFV"'8}P6͔BIC-jxNyI2*P[ Fvn pؘۿNSQ<flo[:P5byvOg9W o^?|<zGF}*k>733\dUlLHff{eخuTn(1E33pqtc@#Ay,̤Xぽhl؞*ua\xv1.Y9k>I,xqԠ-8"Zb=@m3յYV2Ȟl&neGm_Cl\Ƿ8ѫ^(e|{0Z>f&dLZ+ V]$c]_33l8"?yy'ꗁ.N@hDL`T !'p[QoMIHԛ"_pǤd ; ˚d͔aG| uqyU9+ÖvC1 f˙V;Lee&ó:i<nu7tsH~ɳ_ !Dz$| }>=2cMӕw:J`gN6eo=:k3k ϛByJaB*챙 hǰC7OF0gwwbTsQ *eo&=bjzo,h1243ޛyGv*A2 ذ>$(x6Ops*GJw`=#*IHZffe\Xȭ?} !%DLT4 Yeɇ92B/PQnӽlA"e{xP}P7=voݮGg'RN܆aseAɔ6!MiwPCxWk33{#aUPl,Y F؉C1 8az䰽j7deWK!vDM4-%Ls ̟ [qr%:r48h/fW*mԒfSk{Zo 5%Aʎ" Y]NBIƴk1\)HOzd/ki#ffi6AusQ=N!{rmQ*q'k0Cw3[JUKZmIg#9 &TBKNͷif:f4fwaL 8׎zpV]f%WԤh?#^\fB!oHdʣ˄dE#-PY%>kώƉI%^ rj`.g9 >Ht\L$v"[2EeADJ,aJS s55y+T~B"gakX[tɁI@ٖڹ3ArumWWO7xv%#nMon@csazń Vq<:ڔh70k! ޵)Hz&94lˇy}rt)$'Ѳ6Yf΀]/@xj0׋˲S)aOu9MZR*L̳`!K Ne `g˄i33Xe9汿~TM$02%V|3kvkh V2ᦶ; ȶ3 >>6b؆]]Tep6ffe~F: lo(RNOjz!&``pKiւDZ}HZS7o~G|I##Yfg;c$uСcLy^=>!wxw})Ll7T2*`&Ff[I-f36d[\Čz\La+sLZYڸj{'$Vs3".T5Z?3VyȅI+mR9|v33q=\o,T ffn7%f.NsPs1 f;ffdmvΌck1$hs7jn&r= 35 U"#8Be0ݷ\`'5A"`4;NySq#qBD (A=:Dv[TԠַEj] _Q-QU.ac:"3?8rZ|6ffNb!PC[&ʂ7XP$hI>'+ MP󩦭X9BÈБӯ##y3CnyW 礿? {1#}%Y~'?ߖ͛cGVYpؽ}Fϙh>o!},gGT# Bu_ 0RNgdF xr:vJ;HT#z]-DI}:읾tm4ZOzgA-[INbÇz0\ZEs%o8gd.ž^y}/Qsٛ&Y!0x; -ʹ0_U A=S1hӓI.Fp@L&q VFC1BbkܬXD|VZPhJ+c7iZ1kьsr'Hn n~PPVQ!/ 1[Zct4 (|iu۵v67Vo]z<.2׀vHa1Hp/ߤjZِwO'EpbRV١m4.䉾*;~yʛb4ݻg϶^x?ȍA/C#M7ϭv&8qwtYrGި9=PLhn[eD϶L F*;^ ?5XM4x3\GQ48=:oDP~eC ~ kSl.Nà˞Lq埝VvE6s=?,s٧/~2@DX>pl%7aW?pFѴ7 4|WMM0z$0"zϞ^ Re@䮼iuWE_Vif:hS1Lކ&R= ;zСr*Ӯ xL3P>Fy5xT0kF%D% IW!ZGIVmsQQ,GJIq|~pO[x ^dѻk])Yc1ty4߯ \7{f1gN4Q/|8v W&!rzyKN9v\v4-GfR[>6#E݈XSϣHلVqoda5HղGxuKhܗSQ` D3DѾ i%5f>VF66&FnWV~Qd2jMtw:ۭy?es/߿u^hKNo6zE;]HfޞO:f=g"[Me%^q[M ڳ$4mͦSٲA>|~ώ9yvKqވd-d4Ĥ>6s+Og ҝOGiMI5#{=gBXg9__NdI`lj932C|׾QKRzf~Td|x2dI|%\ɛ@R:N[Ӣ=qfŕR˳G#Y],|HCJ毎>1lMCҵ%7]Zx諲ւ@:_wΛ4َKA+b!#5\I9v:P#Uf=WGٜ׿CvK\8Rυ~syUFXil!VO%WmKFGa# -Um,;!H< |xى#؞oFMZP~?/76d}ѺX㬆.dw6\GQdIUN&75US;D9;8[ی 0vؠ%ب2kKDǒ(04$Oq^uٮ1ڧf7HOFia5o-rggldᨣ۪oep݉vqog_B0V$@=yS:ޛ:g"AeXuZ!?Z ^G|lMu, hkL(_Ϳʲ57ev3m#`xg-DB6M%4sO=oPuͲ0٘s@ovt*prӣaku76Grޏ=$R\3ɳmv=2J7}Ok6Bjѷ:L~q0|}. $]; '4w;&$ny]ƚv|)ђݏAϤ0&š;imD<n9 yMwQ$ ]%ey1hhK Y)b%m/j &[zRHB4DG}I=0< _Z8>NDn?l~zs8΂94=љ >aF};%[9ȅ{p>EqrA)$A:R@ToT Bo[K 0ZNP_?L3MRs$o(;$N"'<+O<}vHQj#rș%fs'F7B;y RG{oZGZ*Qieٝ(Ru6[IQ7MP2MM2?ˎ+>\R\je_'^i Gf;6ԑ oW1ҝGrKuR[nT*뾉z}Tʾ_7Hfnf0]\'᾽~ ;~x#&1 uM tK7h.\kRDډp[%bVَBݛ29mغ2^_urcyɲ:t㜍ۼ7:=cGr^5S:dف0~NPaɉSIVuj=4_}WPO %^-7o˦'&_Vw5vg)Q(%77~wZmoOzz7zpJzNb=O捙2xpD JTcF2EEqܲگ+ $9DTy:m(]/Y6(8hw3Dj["\1~q|ʞߑMR{ Bwɦi=[LDe Gpݿ0^{q%`5wI {aNh$qu>iqz_Ϛ쓐kӯS^d9W&!w~ =~Q6aO%Y.)_6=n@,GsI)J*s~0b[L@LF@ee֫&toh{R>4h>2;3ev̯Ao}`g᲻oOs5 J-rS~$iԷW&r H6/&fV;̫ڿ2ʖ.CێB<-Ǭ'?|'wTTO*K3JJ P HW8* n̲;a^:1hrC?9RHt1)l)燀EЈvo(0d?g1#VG3!,'Jrd'אh뻰eH" &N›VQ7POS5{!kKP #E)KDb&hQ#&D*),F1n15e 5&l4.]LiRk,2"mk6KuTJjl6Nj5ؗ[cQVKUC=C)NBїBA ;w:GY $$@bp ȈZ9|>'|ǎS= NHxGm @wxC7GBETۉ~mv34`О*HV$1R(#r!;#&H$CG~|)&d! X#dHmUHIz0`佄Nz:NqlE6 ~qz$:5QuCKI^O W& {N M"R!0< 0eGz'!c m-BZFTq&KJNǐc#נjQtŕ5J6a1*UK4Mc/ ) S 1l֏Lg>_rD"GRdOψ5N7f6L6Ѷ7o ӳ{CA)% $HZG@x@1ݚ,-Wom``fQ,Cv\]OoA e F{}=#xָrl-?;Up`$d[29?5('D-ԡ=(.LɌ ؠ3vmvPZ+q'Oj+?hMQϫjPX0 kgy;:]~ϬR. O+tF?[!OffvUfҕ, 3)Qo p Z.8Oş=a"?٠?a{!LOr6' #zt}uMieZUU"v?0\%Gwry^QUESDM۩ dXZpn r;x t/D'秜q%_KJwa1\zz ʦCgVX=uG->A :=^&V$׷fI41)fiL< =IrT,9x:">H:b\k E+XHj":>~4q ⲁ( {]JЀ]$PDTX$P /u?A!kun4URTJUA!5EmƪLE4Tc0.)m/:a iijJUJcЃO dL(Z ;"P{W*|!.ZvNbvp)-xnzΜ_bྴzX`.bу=}աԞ'ҽ")>.tXGk>_!:a^HzC6.b LY(Q"N$B>gs54I B+ Ng{|8zoģؐ;#i+w=}B= 9de1ZTUp>y}QѥhKuy~VW-ǁ̇wjף4ۂ cs>ׄ>$R^mCs5?L .2ҁES# PvK$Ș15:='Epy^^>ԉ'dr>Qqp)qTLMU%iJRU*㡯{m-6]NN'6"Bas }{dN||%gl;' aѳPXW= ;8{#lц*bfCwɒ{ơ>i7<AqЍGzX'Uy'·[;I83?Ff~Ǣh#S6"F4N 7ah9ˎyTJ4RФ& (C˙' 0x0c1Hl8kAN e=񣼫J:Yf$vq9hrGd'oNvI>J/J}u6 _ lҴ| "0a8`hѵ(K\H#ґL" 2.1{Gp>#2c?} 5?f@ N?3g)[rɄz4"0t$pEׯ>~/e͟!u١AB< ;Ai4.hWr._ 1="Ņc|@ޜ ?. ,?83ن+,VD2# HF0C9::8a]=wcyjxzCJCYU\HD5:Nd4;(ȝ|t`}ė4ΙH 8E -ku5b Tar "#=:f2*i6BtC3'0s;Aw'.zy9*!mdòbG y,g(@|C (%Q$^eZ /_wRW_=@`IpI{ gX6pjzg6'H/<=x,(,HTۿS#O`8AM(*XKqc{|.!&=%J|i]P:&{84"r*\ K*{qHiOEUe~AlnU+Uqɿ$9#`V odT zuct!^=ispH}HIAMQ@(>/CPgENfL}ȐnMFwiQUC5b&:Y7BǭMyt!' Nx#:UBsqO翄|OI4<AɸQR1)˄b&o'o'w(n˨ !!zza14m _A~$j5Gs''%<1FzŠ?4CpgA]1A^j?  X;RsMDzyt XͲi>ܐ&R ~G}Ԏ~?,7NOHc 2|Sл/D։OLNy,=#WU?5^D݅(s0{A3ӹ{=F) :n=(uCGOp{aGcreclCpY~PO G9@1C# $jmY,{I:j3Ks׷0B>)=x>hM]daۇBY> C黜89pg%N h5$_^>osYC]0I$t1=w@^+8)f?$z]/( ݋ R'y6x${G'IО>cOx݂CȕV. 512ŖFGWL#Rd9/}]idc4 #V)Ώ98Mmӭ&ƒ<*!O(0x0c?sa^e58=[ @Pąogx@aOpte D߁> 8;P$I6AͶ%SDX_S5䰮OFO|yv}a*},`X2%*l7G_@Ѵ~n`HيNՔ̟&#!!Z\LnD<礑6N]!/P 'gxw( _*t w^cө"F{^Ah= '>kEþYecQANM4oQ܇$3xǛ|*n#SRǁӸo#rׯ2#qu[إ(n)ӱLsCE1HO$m3nOٴ)IpOlI:n>3LJNxNZ[֫Hut 3rIolpöډ4KѲȰTXEDX9*xII2A& >K%Ni=0WdID&ȃ}>4v`Ң4ĎFmPOxL >ֶW4m<9.Y R(J j*Xٱͩ#n)0C!ɒ >3Ϝ W S QH\IDX&~G؇(x!ϸ&n? a/p}>b6f>ifJN;W!Q#b^d$#Ѐfy9Η'2MkQHy6F#$MDoUU Ø$R'܊B$HĬJRB̋Kigl*?MŚslty'!a-:O#2.#?8UB OI#>9蟼N4{)6c$s0 \+msUUcC4(y P4l1m<7>Xsd.N2jPcʹ\H"*"%*&I,,3f"aY1A;L\!Ĕ}ӳ0l'0~ Q1a3p,)4sFCIR<\9Y4UY7p [ J"v .x\z>ңF^z JzHPd$X}lN'2tQH;ޣ|DH#lm ad 3ĘJH'; /T4{a9.u'wŷ^3GʐjRj4lgKl3iܾϢ=9MahMjr%~XT] F4|JXp̣25KEU`^Kc!֚); VsH8|@p^eQeQMxՎbwklnhPSXC=7"O'=k1\d^gU\O:aO V6g2"BhЭXH-q`QٝI2Y/Ǟ<s#G-|X'k{"*q7O^ &3Wd%Y"ʼn*}k^B:=ߴ z>XWr*22Ğ|cotOCmpL3) &꽠jICnO^R榠b=\^Av&Il]Tx߰Z#POR֟d?AWG5?y{C r҅|4@h0?I4Z?ƴ$˓;/G9 ejϥ偆%aBY&C@Cu'9;Hʕ)H͠  rp9Ľ/f4$'(xRo(vlca G(!4CZ~6_BwAkዢ OfEU̬,bo ?WyvtFc`(0_CM=ɋ掖Ibj"rIS =DˎuLI, bb hK܁/6؁i}$.H4(?SIR̀ QH d"TiX|a A×4N$$xU34T& Q1Xf;{7{vGC9 ;e0L9@^q'I8f>Vlv32ȬX!Cj;!qC9C`9w"Uaz/T֢djKdUUTSɚv8<&R/~dY5|=΢dʜ x)C;)мA%̳x ^iX>_'Fi~\Sn4~5d EB+iLl*E!jJJF"q "wwy9Cʰ#,Z _!^} iFDХRi {gHV*"pb4nX:d;[0H餙R/n0ўPzc|z,:XsH'4./jChOt;#=L|ph摺hYd{aۊEI99 6QgJRZO.tg{, %#eo2q xU a*MC& 0-mRJmg }*Ƀmк ޵0v2XМƊHI [TCb8E d),d"O \}iŖE;Hq*GQ$1߄q:Peu1q*E>BnP;JTL%Z 84Xmj%.cɁLp")?;AD|UC @˯vOcZJkV S ׍g9]2QUͺz !;r(u2˄V_Xi ΢9$pya/yP=A'=SYnO0su<6l7+5tFDwųq[oh\|-s:` ?~b+aݐaE&5YzT='M*RS4)aaJaM`tPwQby!E LQ@PDDv| 4@uTο9#HdIȑd5'޵HY G?2D!0=> Q! Ptq8`A =AEUD& N2C'(xp!cD9T/!%hq#R#rBa} vdbԫly҇bMȏ7 kh"J0Ѥ ުaawņ(s$6{ mx^a(`Xj Z114DԘA߳t#piPVL,jLECHRYqX ' fB"b8"3"<F/&c.tpt;o=f6 Ni"sx Q",Ʉ7ě yHK1g~?&gĖBV0$&ND'Xsjq"&hN#Z /8'&jS{db)ȉ{:zlx2l@W|q6*hlLs7D&M*^0Fa^{UNf$wJYkE(\M/^'{ $b,B5ϕĝBC0Jm6@΀Z*u\0Cǀ˩u66;U;v3N"zPhKhk&j6jbj96E.J(J~]vaJ{Kxr aJWcO?L_uߤ4 C0C}z(OEj;݇QNAB;Nآp<bH@Sx_SQJCT?ΰ)/0.zxMt$j NƖmk}$;Y=o |HѬHۻXB+0)i===!44.3< 7|?[zd0; #N !َe&ч]IpL!$;Bj& S>]͊lc"'>88$&u$ELKr$@) fλCNR)#Cn$&PdOSG8Ed$pp|ѻ&Wo9 _ 2fdKnrsq9Y V!&J1.J 0##2zTNmzkY-A6DTǀ?wokK $xqNw<;;4Z?z^ҽُN3 M7'#%#:.|qr>F=нޓoyDp$@=ONzʪ;aަGl}@^V%(Y)AM{1BbKZ#Hibtbb>ds#|=^,bHcw$; R$O]QS;n}XyD'0S<=yrt1Xx䪵ijl5h}:DeJO\YLRj=1d(Nh$@ďH *b\; ~.H>pva͏_ۭ&[&(ѿYVc}?/!c/ P۱a& >Ԅ3MåLˇB'ct9NsPڌ$_D4!)Q6=SK2IS+.}l7pW4IVDoޕ#~D̈́']|zW ֏o~ OS9~2dtsSQwfAC_nvy~%%>Slͦ 2& 5׷TUbl{QfC].(( F%2Q́sf;3jأ8{~is}XcOcKPzI,za'>~7fn3t]<Hێs>RDŁ DK4`sD%&ݧ%Rw{&YDSK$"*bK۳yyO8s|ϫtOvl3 ",&`0Wd̊;9RHZ}Sܩ,Y&y!$ N([)l QawesL+65$g0wipSYZFZrH}6i<%F?/ڶ%D2|5ƷFؒ}]ּ3J+1%,rf?ANNZϊ}e}Qc'h' gIXD++RJ>odck} 3Z->*~YƼ4]Lqm2 &CX2i6&V f zr2ŐPi H4 aId-*r2wIdٶ<2jin]{uƗ]|SpR~FLVFU*ݣ4 NtOR6G0QQ?F ؝ ̎G05.U!C@aGHFPS*;zǃ&@$2Iz֘:^[ :6D?o hx<gy33WӮU>]~pPY:ÒP%*AUNС 5UA#Hk&A_י@Sw`d44C70I:U|6z h}=kCq $ 9) PGu_m17}'58yUżsVO\ 2R=ܦDDpTImlmw F<N*?>'eWgP]J6|I8N8A"B-oDmy D& LDvBq)xܟyïSQ/</w렦p_' @JKG4TzBއUU^0YM2d<e jS겿]ٚ?r=ZwMt\Dvo(a& 5PL̥7aJoR+STcݗPih`G -W_|'e;Qh cIZҚY)Ҷ[Ζo{os\>*[|kz;RfJY˾Qmih=z}Jμ.PP&"P*NA;[JQBa=ێ4r5yԊ<(!5xñΌ{f˦Ŝ2CÐ7̛ |MUn~ʾh<`ejzAjb zP5\ax1;Wv1ث]Ikո)FBkc9n橍,6DI(61{Xbfolgaa;F냜5ν\{ ~~ӟ(1v(~<ʓ#"f(Ѡ61"/z+~ccOAAY=g(x;{ÓNgpwb|EQqS0NyGy3DE *>!N Ђ3OhJpcS aL"En(o@P';<NS^'r%`HmOi%'cGAqל 31(&JVD;=|S9Iq9Yz&4wNˎ9foĜc"W޴"=>r>SM%T!x{4̞)N iGLĎ  逑a9/[A!gILk59O;"rfc4Cy8yj*mo8N?0'mh!P^FN.Ufbz'4yGLgnu^On$ OP'aֳY1 >s&!71q;(8{fiO^ʖ5ku@H ) q1a.ky/~ġD(_aB&ɮ]{2I.|Xю!"1Eͳo@{HP|u\ILx*GhDWJ)O17c]aBYf8|ְuI: K,He@{*=xv#y)/TY1#:w!^k)Gd ;M[6iK;c9󚞔o۹ʜdc@z4 LvlD\ VjPp?Qa36-'l;vO;O I}Ŷl|VkTW3n.)NO#Ogy.ŶҘQY}c~HcK+|wS;Sv8OmEu 23<:X^CU>64s"lEM; &e6;vo@y9UKљ!GVo:?MH(|fUI1HG jX[!xxMxm#ɻٹ99=3֙y!{aWFZ8F\:Ooae[l}'FA NI0\<ٚg)0?G{#'A޲OA4#c'C6O\!(!NݯuI( 'sb5 T#'p2HshbpQOY4'7F'E^"J N#K+Gq!xM0d/IL0W|-{ӻ)O;[w=OA[Tb 5>MAOWЧ**"(>@??rzyD<\̈MhwmEqFD2;BOz#&u\̜.͊/!4ܸL9,Kl(G] alV+M*|ՠEMf޶Ut]d ܪu*"1 A߹EtT5t {lqԇGlrVkM>tBxa^? ^@,l엥XِKpkr" $ƙ&A=/[ЂY*<>.Uw#|1bsBrt!q6`նo 8pd3 ƪ&O|Q dDM1L)SB3|VAal WR"Ũ"볘겺ơy'D^'= ,`GH”C2i;2շI(7ڤM'"&5d}5X=úg"2)Z`~#~eb.LAVloцۤ<-`>9hHHc-+vkzӵ>3$Kmvvgz= ox=YSxB10e,oa7":rsAmO|QDDeut{.Ɓa7SNJ hGȬARUIDS4Ž܂$:`zj:_p) \W`9MpI߶\StwZyaִE,wq $`i^7=hv˺Sľhk2BmTF0`}FY5o㿰<ʶIT'Ny7@OG=Wbn|q>\EYBGpOCH&5_HO`dEC#r<_C(>7VZ%G^:, r&n0S4%C%,Oce:ÄD:ea |N@׆+}HE4àѠ)[q8̸XegpUEQ0QE=p&-Ŋ OGWU4v$]f*翭K<yWD$}gb -mLOP5ʸǁ#N A%::6MG5OXӉȑc %DVFbڪptvrb:zGM*nڦXE/5OGmgN+YJ,@ %kz #[2"+ '`e[VX iwk "SAE &׮$pGg# 3MؘM'IAZp"j ͖vz6s !{̡KdnG,4G_X m Z1$^daL- ҇iH$'ނ0#X 9{Ӡz)}73\}".^x9N/27g9g<ϒ ;k~>9I)R7/yt#hբ`)2G+D@zDŰq&HnseP2t'ȑp8mE.ABLy hP9Q{ 5 BR7L<5PwHJM~!kvSWm`A^CV$N f>JT) Q*`討u$&&C&8!H#Ŗ:z yDzWI6ٔhŏN '6'&?ssri{&WOR/m$ lMo,y ?y;IDHoɠhE$C`+8JX#!l+OCUPE2XnUI-" (ar4JhfxNV(&D@SDˍ: COğ|:'xe؎Q??<:`ohD!.Wݔ|,eFјr$`2D "iIhPSPKD(y&#mőXQD1DB?ld2{7fltptà'M#$Kfb:ONo$L%v;]ʺ]N& ^aQ?Dh9A6SBЫމЇ_yzޥ&Hѫ$yni1_)a߳S>|Gbu4>1JNkY޴!Di_?ϓ(E?>x2bp a$e'wsUv}YwpN5I$$ots$~NʪF4!:~WlueUॳUCU>'Pή+ A^s$vn1ʉ "%Ґ.22H܅ OMZ/LfBy CA-?6cW -ajxdwk4sE0̡wA /o>~seeBQe?`9,'ʜ;#M0Djn,֡rЏwuo=E0cLoz7,~wOX>F|ntK8FF&oz $|cvLGQ 2*WZh@(~SfJ&l}56niXDxIb!`H =>wjbIԊ/C|*O0Ald*y8ϝMh3j=!l!:JAUH! _RaQR(p>_s%&YLG ʻ@jImD;L2 {cӑ >'qO@GuWVKCATzaZ0 QpUT ؊8C^%49Ŝ-4, xaJ\^smh-&>FT rcd] ([7ƚDY(beoiCaJaȑG4 ;hMl\4J aB{2y 6UjH>Ci|Cp?:*5fI0Ui9~}΢xv~? ǍX-$b 잩u*NTznܖ#z0Sφ&/"#Us.NR a,Rd J'E_&Px{?7']< ZJ|!8s1> 2H:to{cWܠ۽W#!Blt~` oQꠇ !PD!wg.mY**h>h*(z8 _8=1snGAwv hfM>NTaeDxn-ᨱDZ|gSDwNi]лMT%_*&Ƭ u*5Q-frNr'8wZ8$\* nQֈrǘOLP׈bOdouB8X$ xA JC4J:ӃO k[]R4HeFEg 84-ODŽ.<1iӌCQ܊$ 3[t 4C\CbA$4Y>0hG[:+ʲQ,Lf!Eh3/|r?@c4yƒs;%onqPD <˜a~?x߮ɕՏږ,gh]42KJdzO0vT4!/zCCaq]-dRG=2+&`ap?:&{fAuRW~DQ%d3JQ?"i=G/o6"`Nt&>a%'DcMF}(6<1ۧϋ&&BLJ!!e &5(i 7`~C?=`M Q(JR"I#t!@ǖ2Eb̘aa /C!4b c(bbL*Ɯ&"cv*D}'qo^0z8"'<:=,AI>x "i$:'h64 FObX) 炏u bgZvf3fv1oS} OA YtFRw>DhP ɜMHCMuM x{@=JiDp*!(14iBИ%( 6WE""5kLE X>AsC0t=IB,NP\>*QGh8ID@|Ü7F#DRH17dIJUu|ǁ KCtF)t| ]Yrʶ)O{|I֘?SBweN=Zgb7k^N4\Ȑ:TM\~xNT ɘf fj=W>l*c!FGVŇ|LLX r pcgDD9G2Ji@nd ʪC97Ɖ 3QjY&z^s8zpsjK5@@a\x }d&~reJ,9@{&Y9{ҩs-'d&4HYޏm)Kh^ <\>m,O8mwbXsZǔDEM t*K_ZXf--shj0 ̚cbhѨgDifHIIl:AܞT:F=_ԄҽDIЁH$'o$AєJBz49&~z'ե< B#5)\ r i?~ aK(0i-ģ)QE DQEDDK@$ QEQA@Ƞ (%X.UUVCxm* "Y& V%yREJ4K0w'b1zצkZ "ʏ|MUU tI3mVk|>VJ"d@Z)*rf!"3v?poV*;PwSw$@B6X81=u-;R[KJuUltkRZP`lQ$e6&n8PuzǬgf`$>vE(Za-Jp@Le,-Pe"!MT.|01(V"rx`J5DQr pYm[PLMMJL'E#QW:NJ3YkhRBap+ڑ [r9@i 9dh$NJp#^J$fY~WūL h_ , *ܾRIp|;z$CH(c;5[[CK(P?2O}!TfMfmNv=g 4ԝ{; $z5ck~xXm#ib H~>AK)Ϭޮ‹'q \!ɢB%RҖ!Dc\B Ys M׉undhD X$=ll;-)׫fINӻv8wOײ$/V3}_Z͚Ys'6i.?fpqcKH!3D6l)eӵw%puɯYFu=; v8 Ғ@jE~䗾~EC¥Ì Ŗuzx}56>϶鬂Fuf5ڽF 3֚ɴ;G|KcbȪ`[1S?s ֹdEI̕Fl0S~"xͷovyǖ8bfT~T klH02RMeԼ:@I50c?sưb`ԇD:g=5,ˊPgmPEIdcՠWmQGnT.{}27\w2VZEeJymf<{N$?Ñ厄 xHh䧥>2izfG2$+)H;#9|G= (JS:IONcDlf:ZZ!ȤcsOwҝޛ˹#&v,bz2BqyqSE"rDdדp(-嘠S&MwH͉sROQsҧL ~q>Ё~QzM6SF妏2`d3[siS|5L\' ]!ɾ*A`/X = %EH]v47t3PQ !h,$+q"7 S2gQ4J~Eݵ]RUUI*TFeJլRf:.&][]M&,  U%I5Ѿ&CaH瞻/=۵ۻnn;vvIH$ ˜4{ms6nwkmջ cwp -N(n<6w̼TUUWwueԻ6zmۉ/wfmݶ7A 1mhwcwt6864:Ut2S/ ̻2ffeU7H˻wuu*32񼙙wx+2\QB$`0c0m{n0wrʕy1f; ,eww33. fUU[U}wwmu6ۻۻ,1m UTEUUm, 5]Wם HY aif.ks׻Cuݍ|!1~/'0AN SIq`~,Pi{AKC=~2!IQp_~Y cocAIІKB3vs63Y9,4<! :欝r>kR<146 ŜSNP>2O1V aŜ^F1 )}ēi?ghrDuJ)pwKCa` nLrXHc B%y~(h,FW՚}h9 4Bwb7]ҵJX8;lxm>hSg㺆FDJx!1`+d9!v.xG?*ָ&/|R8FZq/ Qr0b[A8`˨L5pNA>8fk]EjM":e[ފF@qVYr86Q)@/$-}p1`9Mxh"\a4Mx0ߩ '``qB;” qQ3Dj$ +x5y җ]>k&>]-uYԈECNGL>g]sD,]z_PYQAX J-PA{o3 !>>{zޘ<8bѯՏ+O<2X[r76XԸ"J˫#O8vrr=[5e٬ALeVoG93(Ke@zh5H+ 5K8xmbϛ :A0)u٦ـ"L*P+GC\Zxd)ÖC!f,^d*#>dA{w`Zfŀwڡ\FӋ&K"r `S NJ%BT,k9$T= l \<jm12(Ё|ڞ%=!oJZ(7jš"k$(ʄcPqCnzs*0p=NePi"mEgG.L@{޻a-=z)ӎ]{pA\SuE5y`-Z +pbg|!5GZ1վU\Y)AT1Jj*Mfj̞Z9oD4RNL锗ZI3qv^dJ69x(.Y CCI 2_=θ;-Ԕx}jxRWr%M2?GTEIHs S6i14I;ɘ&AJC#3P2LB(6h81ܲX6\|1`i_>ecꂛ>v"@⚁ب#`tM.KOJq/)7 |H4%s#f<"Z`KSc=6vm\>mH|:>oiwI$vI$ucבd h}Y<3ӞL,skmՔ|޹W@GCkwb|d-~5:褷2S UcAp+Nisy1. V^!:i & pG4\-ګI\T qb4via|xuЩ |RM4ɡ{XCᤦҢi2130_Y(k- ~4~MVfM,ym?(v뿳1#u_Q(dyeSmQ v.Α;ICDG(z50;(8NjٰUdʥElj(EIo,t` *BLP1kJWx~GF= n"dHO<RQz|NPBPUBeh)>  Q@*?t# 'oK D08*;L#ۧ6ڥTBeQ"&RIjF,E>Vķ !H 54ʿ4 J"4`Kд~o?/fn:kQŔ٫Fu@9v5ÆAp ^ӣ뚢E"z#Oxpzi<ƏzCpp"ߠ[w)ŚEDj "/>v@􇣏>ґrHr@}R16Қք'hb I cp Pu umeGrL Lbե ceX2q bpQV-R!u3T4&Ė2&xcC&0;$s X6hlҝ{=ibI|_l-Kd,7ad`mPۂtm+3w_9.(`McaO'HC^ON&NiN؎$HLv6= Ԉę{H`ipltˤ9@g鷖4IC/~S }iF)'a?l,}۠66!( 䰖'Ъ|Sv$Z\FzID a** fJfj& "J-ߩg%)>sHfB>"ZJRHCB% >](4R:B4%"EHE4tA (~GO?//?s_+??ݞ7__G=I 1$1 ~ӨZ~LPК*(YHZ%:6}gE=4U<ͣCN`Z{[%(6WyRwgl?'ׇQ_3^c:'.yIZ؆0D,I@9{o>7SLshxmȬE"&5!>'PPU#9˗>}W^!ʹ =S30Uo(;g[vVZ ;%ckdӌdQJg|-;\T$zQWLd]{g1DgeU[M ne7x|_U {Vj:uqlDb^}))A2(4MURj4UBkk^WoR$]fB@ -!mϝ2 ‹=)ZD͹ op%( ͔I2Fa9@( .oTZi?$)4 q9L[W9PYP̀08)Ɇ-݋c[kB,c#L({ ׎q@ tJ*sz 4DDQ*aih) i5--- CYHLHR$i:`찍N]i^qߑb:[M'rZ*UTj=}pI֫Φ ۑ4 ɦbiu e`eSO71 UDP҆-Ljpl(HMÿG>@S`sؔzmk;%Qk.8mf,N'N` &2PP ɋpj/: U6XxNguӀ40jo>r9h7!ɖ[Gf箐1 zOæ&1'Fζ&!4h!6tVaE^ͿWwj<~<t:vs"'9`3m^⋯~ u\L Ym{_jI(u VO`Ιhfk8 c^y ~2x+;<'Lt5utUYfnw(y}qwC#]6u㼝Ƨ>}Ү~tg 8dsF9f5. S56bܼe&1S`P-3 ͥ2\FVE)!Ջ9!6VpYCeLxդX9CFYgT 5Cg=.= 7Y\40WKj k&іڌUZIԦ;Otxw #n2@F=0n{7Y긔Zdx<A;8`UH"OZV8!.)p!t 1m{qguwxgV{{51 k{gʧQ\2::{L{G3勛iw}^YjC`xSu-tlg?CVEyeU9_mQz|X b?<ǦO:nZg!PEnwU*CXK4_:o\RvF3k1f1sC9Fivf}9WUKY\23^9\- F$ dr4/|oqٚQcrg+VU`)qɄiQwA(}={w5Ywֳ>ݮeyʗn2Ja wEx 4EA GlMl6o5q&d#$Ab3 O<8v+칩@'&X4dc@oyIh4pO ߜYoiTѴRFX,qFѤv| VN : .pZM>4IL8`S$%^9ϗ ighǍb_aˌiydK~ |;*[GrQ&y^2jӽ'kzCઋ6u(fP*ΨdWYUZ//bێlJG XkU%YԵV:DvEN~OKS5._- EM7+o秫z4| Moh)o/n٪8,(>0>جD\зpg!~xj ݖhۍwb Qu$η=5.H@Q*=IS{fw;\G\R,)S"=Oh(lactW(vwH A *Գp~k翅 eNե߫W#Dk 7A ,01 {p\vVi\L+ASG;?YUoŽ"†454|7Ȕj5Ɠw:E/B%M H;RgMĭorQ| djYA:KcQii G|TKl1ftxɱqk ,4"&m [H L8#ȵ-z^v0i2Wkr͖cͽqT8沌Me) p[ZP[3tAnuXv#+Q(+JDKNVBH rjrsH+\}^uWVe9ז+&R:h6JW>(3'U{~H }od}{G3`;36%ͮ#o+)lQ+ vd.])Քs6&Wk\lG:S˦CRrSub0 u5Ύv FHUVݙW?)FZ8nV^kP[-S*-7KUBkW93ZJVN|23,C70k/u˼eHo`440tcmD@wTGgi&[s9:NKUK+3Km+(SD2CzcwtP# ׬~o(9C?PTVH2 qb6 8DÁAd3HS4y/3*""[CdŘa7ٳ8Nh+4!C$J=tL wbz8a6K~ԩuyG類iT)"<~ biFZP%'Q GH뎵P %qeNa̟mZXkEs*-YRCUzt88}gS?%>)a=1rai?nu??bBh(IV"h@ф:#o/eY%@J~t0xO2N.Z--Hbx/x PoQ`&9bP>1+2KÌ̓$]88Z&ŦAh 9G`OGNj%9Cko:u")"&-X,5L=!J I6XKr>@3G1ˌ͌QOVw{ޢQX7m)5ų^kugABrƩGAB}01c";Yw-Vj[ԇZѡ}C0c18 NY^2֙fm߾{VULb]uzЗ|1wJ+Kߡ4FJpN󚼫4EAd$Jc^Kz|v4׽X?~c+W6]w ϑ+W~3őx-5 ݮuabelgJgA59H,f,R4#RjPS?N(ңBKLxT4VrEMlh8B/?aM %럧jڑk0ъ^ Hadw#A#UPJz+FT[KEILA P-$@IS (3 A X_>ʯI;=mi KXn|)<: !:Ui8Z6˸$d hIwYT9i`/cd#CEZ;zWN"^LlB>};;մ`ly *;Ƕk ~;*ag;nW`g &q8'r+܆kb%Eп%ܿhCHD'J՞pjsaR2&1 QRPcf>'/{؂B)FH&$*Q&FfWo ف qC ޟ=\*W͘#l09͠έŜ3, !dR[ٿ7L7*g -ZUYhV^54:޻+yxUVy׵LS>՞[R;vB<ك=ufesG#EyX\euE G0l~ @w:s>;,65:h9j5^uX/'= (ƕuFMN;"SeeABJT5 y {XҶૺ%ovc{' W|4lFд ;Y6Ƿ^y9߬()mu]xXU\BG T$LpOB%6R6 u6zlՆvjrjY|$ݭJp0kz)rCPWW~ 'G G.8"E+ F>$<*(gQr6T%ק -:yf[3~ L_+*w=˘M.<LsE3s F3/WO+%' c 'L 'K]341'DS c5J:N;gA {[½ʾ)=y"l¥RT '{azǎb>}p3L3yr8ss3z8;b 2L?8z$A_~?=?lϻ=8koiʕ\S_ )*"an~cu=خ%OBp$e"!$N> I!$#Y.* PS;UJhLN0M@%4A1,$Bf `X`GdX  h U/6*i`)*_v)%#o\Qd3TZC $ `MH:@oX"c>o@WϛOH!0cnv{2!}>ML<fC|ȭIg$b/ |$-I-P* ڎ96'@fI% ta)n0 Y  ᖍ͉-rAfwXU zMnT҄8˫MSvm;JbHRIXJaphOqbg-*L4A,6huDgD8E@wVoaFAw#ӦcJ2J"kiL2腷X c"C"Kѳ,C! WMnYS m]` B81hf qב$#Jxsi"&yo'!@x e2 =;1 Qt*XŅd`'Kl#7^p !G Nc$z"W8! Dp$IeW74bvFWʼļܛ5aqO]M],Ȼ%- :BR'&=lI&IINms'sT&bb&s*r˒m>ץjI;TV (ZZi"%" NJ F!8=N?6cTy<8_|ʓe&J#@ܬxv/&!hL*E!bA*)"ar(~Np:=ncXCSIvõ;>cրt!BVc:dDOg#BTb`cyeU=qp{"V%RA(PD`!U(aU@X\@B,ҧ9vx8?ϸNAnh+mm+f |(f~ }? >H[B0iH$HAn eɘLs ᕚm, MD Z)= mk^1(;hm^=e&`fc󡙤}׽||,Oop"q+D`鮀),,R߻*?ͨN [\D RS3ď 2lX"}\Ed\j-aNmShX-&S D2*fd2Zڶm(jh8p3g 0DNq0ibvɾ\Rr딩\YAPJTDM Es|tG[qqBIC-R! U*БD415A$  Ӎd !#^O-1>N'̣*W}Ղuw,ݖkX2Kh=?~siP2J8]lmA36ȈA#ʂ"c4nQMr)i9~x|oM($G[Z%g~P;u'94KBDTI2bi$TX-!0 c&q "cgY"ghcyCEޘt]?Q,p'4PzLю|Db96#: w,T#Q+VG(P PJ3JxDA5s*'H$S,FY}A5Ld 536i7|rvNaHAl:'}Spτ6gYLW)Wx* <,}z/,*\mOY'Rs#$ϰoFՆ9Gxd9jy~BJy28z=7>2.}CC acL }΃G%34Ĭl3ЀWz{m|On9ާ8C :ϤrUSu&YGhb" '׀a$h:[!<;{]  a*lLÂa2ؘ`H&?>.N ~u„*/&g@9A-)>Bux`9/a{KG-35B"Hdb1X$D->A(_^'d'LHK@~XHd9hp4б-&g a0V'\.g^b2~kn T|Mt]գ`gXe_J"O2%''>tձ{ "hD5?4Irlm̗QΔ٧SÄȁFaB(IlE;f0q@PDJҦ_l>!18dpL%l |eŢ6WPҁ"VHfI F *( mT_|GJ+@j)R% *eG MI@?_hO4A/*~.ΐL\!!qzzP4.#CyjH\u 뤑 +h8a]N7n/ֺ~??=cl*T@ὥfMGzURڰIKqy{>` pB#H U|Yrcl$XDQN:@UU(~h+{BJxdkdh--iк#׋ }$arMMVSh!)qqn=\h/Q2Mؐ;tWaNDBt2&:TCI :l ()@:4Gc 2s;ޝٱQ_?,z<^*>D=W D7 Pxe^a:ԛ{{FDr'!Dh* d~kY pW QT_83™현2 [-شZV5D("V<0GjNZMaE$Sm2)Hck@U5E>CBN~kuz:*ұ/OߐEʯQFt=-d?. Lэdž6@}yQKP!Q BZ"l#r{{"!K$˭Jh`@DzƩi$pDŽ#H  ?I #nKa2ӣAaK~FwXYuȊ!Ab'I9=ncNP]:ш 1)rbPm /lpy6,CLDQ?\$$ a ~>|b۝7/Sj"C2NL %TAzOcz\p."yhӏ* v<~0'}EMRr1!bM#=NI:%V4HS듯|>/:͜$7h`$dB .Qjh 74 PrXg!(iŃÅV<2t<1qq, !'o8Pd$DVȤR%n`>gߖIRi;VMPC%yNj?%TD8gKg~?:Q) E)JU* æebTiMl AA,SJN; `jpKe:R0/J3=qL ãc,z! UiJiZB BQ"JJ"BJF! hP i())BJAXi(JAi h'̄djihb! hh(QDJ ZP(TTi%H )bJhZJ EbDR$h (@Q)%UB4SY#c_)JC:nɠdb Y (*F"J$RDEKP )ܯ7'7Dd5K`$j 9D b&njPB@l!\ᙢXi:e ZRAFqHq, Pv&g $濖NRRۢ`)@h)Wqt0a@UQPIC\I40TAELU$e&j)(Ď&dh H&H&*F"U(ADs, 䟐P%d:KQ4Ll?uO<}{ny,R~m`x!~_]=>qLx Z2La_2 | SC!'|ʩ߫. ?}b&Y.jf]N8xi:7CoN1Yw,Zry$\PW@aΊ6{_47u@R`xD[Nh+8ӢSa b(kD:̐v:]=$'3ԑFXW: Ht`v 5/lK8W{S>+|d~+'I6[o p H>r[!`dcd~O^Lc?pY]{'+8}hC&x<\҇'g gT^o$ߒƩ=tk#Nx 9 Q[[C7vT×wr؜@@'H4 64K.Zk~SR1 f $(4wGaDrp!Ra RW%G,I99w|t6QR 3"CBb PxBq p(Ze'9PЈފ z;y&z燵;^P+]|؆@0YΑİLe&yti@90m#G'xI=$ujXߴғf CiEh^mgHRi(uT"JuHi#*zWOyKP& .?FyIpbP5kF哉鳀こ8kq1ǚ©_ yK~1qѴICKrB .A5 2ZJiz>|?W[#IǫsM:>nd,[~ӅNe:1L'yuSzUj4%%4K(`ή`b 6 *(L$ l=fg[9+)L4P`e#X"b$d" Z" v6UMPDRD٦c0Q1RM,đEDLBKhuLQP 4AFى") MAsbYe]T-)i[:%"*XOAGFDX&jYt-LU# iB1IKDa(`%0Q-4TDM5LZ VdbJZHL$RBETTASLEU 7A$QA5BD3UQQ̚SS L Q4RTDUDG1Zh (("Q3DΥJH(BVeFi1b) sTED@R()H5F 9d4DT5$SMԓ 1'WUE" "'5d(}($h JHbh)"b6i~4!JwQK)Zp@U C+Q0>yHVϸi6`lIR* GYbď8)Զ6dd'S@m)SGgmLcV; a=DAĆkHǖdgAM|Qa' yVea%1&:u(aNJ<IHrp~N%(&PqH521aӟ)71u2xY ~A86P<+Ѫq n?O^i:%Zכ™קn>*AlAn>Fɨ]/09`}pɑ # }>)'g̟ntE4#kpFJ}q9Σ`.SGtnx({_{^ϭOT`b-I?Rʙ@3)ܐ=Dt HX,G JAyϦ"aFJULBtB2Y$Cy y}/~5jZEL9 'Na3Q=DDHރJ!d㾌Q%~!q~_ϓsuSLDJ{p>PP75 BbUp^ *;QHT,TS P@JDȈ4ݠNzŜzyMsZo9jƃ`nG H)EiQ@[V#Ԋ+dA_7K=OiIIa7a>H =B{'H;45F3{8Š"̎(Bix_Q]ߩߧ~wwNWzgpz>%(5kG3`Z|br=>'}:Q.g#y~}H t*:QPHIC~dOʞP+VHQf<ȶ0`oմ9_:\o)aL7ƖWv5zvT1QHtдX˪av(&.N o.a7'!TIΏ_4A 㪮ߟ[̛M};68 I}'TQH3&c5og:=vgB`H4OY_k3:YFDHdSAg\2xJcmRsT&:MZTKmלvU:l*AjSWȵ襞هK8mQ+[p誅L\Ž{_4Z7l@lL3rǎC{Qؔ/>6o$M *JP4 q"&<|&'P)alS%2MMyW`DT`^C_zڍ}!Sc4Me,Y'aL NGRȌ0LfCl-P5ɢKwN ÒpTth "E(B3˛fE;4$!1t8TQ_Øl^I1cF'Ӳ=vpyy$=K,LЃ(u @FQlmN(ZInӛze(1|F@4 qGzD{ˆl-(#`:N04ɦ5cJcHf4(I 1ӮⳂÎ5/4y48]1ThDC9{L[:dvTp%C8kdd fm ֮HZ ~އ%/ L@A# D&XI"Xh(("'A$"1++a}^āv/A$"&9L $0! Ê)섔8pj?a'! $ !/BJvGӃv0 9D c@9ȏ}=93_ P>~)^pH<-Mc>0D}`GoSbblh@FBCZ*%?IQL!@4LIrB" (I$R$*PJ%Jfbj B !d"@hdH"h34ADLRPPEJ#1PK"DAPQ@)DPM454E11MU 4@$2*B?%^re) &}A}A΀+ӆm-AĒBlLrYX{4АxE[S+W:&i~!o>n'QzPtPzoˋy<8~< ff/G\N_Id4Dm-sp-1k6˽Q[I$mCdLTUB= F6\2URu3$``:vUlB3j[6ڏcҥvi+fH, De}sLǨ*1jcb`fsk|#Rb1kU=m <} Sj~ L?olwRO;R[퍊eU o4[lmG Ӧ](h<<ËqÎSΪX1}ҦV 0Cj[>6b ͩocm*7'}Өq@8Q4h$$ "p9<_?=/% W2&e,"܃ ?~Oރ׌$4PvI bi! aZ%IlXD(ZD"$Dɠ1P% EEPL0@LMR@J $4C-3 !B. *r#@rG1BJ1-,S$м2HHP 1 PBL= nXr|##"B$pX!IDHL'p`4?%+A 7_g#CR0=D01TB>&6ɽ>I3wDﳬy?zJKh&8 F^ Vnj{[(>ɬ؅F[9)B4 5) pG Z- ?}ir *[[]Xȥj*¸Q 7Z3[HƳ5{;ljQd _l'[IH y8_ٽ yU4=^(?^ yܯPg?2~Ts;^Lsƥxy(peO(DF$O$g^ۆwQ[aׄRlW\zޤ9J-ϮҰRiiiIimYJ[ PKlW0yeK 2 =2PB,IN:qBNgZytO30!D(, " (r 夠6/y3y-Rl^)= UEǮ;a6޸yᅪ F%3"y|\2)$I9;*1zuDfvKqpOGzLjoMSki,GAK('FqA =yTʉӘHvq<7r儚mg 4Rjrzq")Jd$0BA)& ^>'N~LAZW1v JUn rLJyh-N(xQ'F7N( =Gezgl}KCKZ6n]a:f UΨ^W 4eb#h(x(yDZ;FgJmM4P+$&$" ,E \lIGg.<8> RŠjt%eH㷾.!4x*BA3Еcmh(J,+ :uxfh~;d=MzcmG6 B a3A((\6ҦU|>t_L]w,F_FTHĆz Z**{kėrHG賰GJS`i1ƁMhۼRt;WꞐ).,'1:Y[0;9m&?ѱh6Yi460I! 896nJ#rIV]jCED(?b< S; |tP}җܲhz#0'Xad ʸ{l>I\>g_Дz%1ʣG緇TwOfeU} gQU3w4QbƱQ8ɴ)Nho}+őga:ul޷O^& V磙KBҐ" >0<  N B(Sؿh"Q:+L)9S&&'AN}"Y9cc|c Nz3YI^'KT{e+Fm͍jiۋp{ YMm)loLɴu*Zi:_qݡCRٻWmFM4\VR(>~v`Ύvtp# ec.emѩh;vTtsR]xƐoWI@as1vyik#`{C$f5cL=@@/Mdt2/Q1FA]Rq+mk"t$;AGL*R:mXbD"R 968k;9Zx9QDhRלM:a^{>sg @1FDN"dH(8UDO Ϙ=2QI6ᚪ=d:V ?% )@]$ԚoHMi ẓWPy}>sOS#!CPTGn􋦔hرG1 zoPp!at¦RaB*V 1Tl} |TR32HLpst L$_0 撈^4dv5 Xt[LˆYTcKY*e;C F'?kRX(|@ 's̈? bO@"jVH7`ZK1Υ "=$Q\=-cƵYx;#Bo|ߠw,qC5TVQn1s٘sVyy8OؓM'T?~^ő^ߐ_!Kdb$"ECw!ԉN;SPk<v ~2LȤْf ZLx}D;(k{F70,hzat;Fo4] MyI&$ )ە~y@9Ɣ<=G^O B!DH"q ɱ#ȡV: /'P ==E`G *e_5܆r|j"9?)ͽ=p@(e닓*oLd[5" *d9VʨjFhpFްZv feu#9n=jGk[9 ÅJmZUR(e+l`B-0>[~EA5 }z;'"&D4ӈ|)$$5o΍Hŵp4PM4~欳:hߒt`M3R*Qޠfbb))^=񕆏~ sI7*4`aBZ2Nгz8]49 XP_ oHLʷ#7$c뀤 Z1dg5T+A*Vʮ(Nuʄ;"/0A-,q(³huI|rCJZ+ <6. U\(ͥG4q}EkhF;ĆI o+a{X?۾dp9FBkf#'loL&('?zw,rV-.\$^cǛW-Dߚ,aעvv8z3v4W϶A㿿tN.fy<A/α$7Tu W/"-k$?j$I4Kׁ`6PGP P##P^9<Il.ݦ odm wI M^lPG/ջ~$cG[9K!y3#-Cr㕑Xy_z~((AJP1"A4P'BED0DSnzhW'>7uk>}/mI=1 A<эslw*/SB$XLU5PCB}2h (M Oshi/mg" iѰ6,F8iqm$@FD(B0d̏NN13ݑ"aݵI% C(D--)$BPB4UAF'L-P- MPR%$ Q"q84CC` wvFkma;)xdZ3Sz@WEԁc bBV8w>(}ćC"'% pjed큡F%Z)GEA@4p$9hI.]N{0YÃFl/oLϽ9 CˌA,4HN4`-vѼ]H*no I)(G4reI{RVw=p.:$Y ǐiKEc5Op@7W- C Gz8ZCkێpF8U?/8up?{ a߀џ]0_~sҸ'`N™)(a'vɯ380+'ϭrOEv:Kk5`-'OiI?Ƞlł>2I`o.\duB4b-<ռ( +"th)PX UI#O(ׄ1ʓJ껰rh>2VӤi 0Wf/;r8OaQm!8jd% )Ʒ|LB67yaE0cmnDvh׏'֜dGGo˪5!Zड=/@(;]ׇ' ʐǖkѧ5tbT:qL9(XMv'LHOL"y"aR{FPu)͊G&.Qm2gB?C>E jiu<>h h1v! SOvH8&gI6ͺq[f**|p٧G,YT ꞌ}*b5@E㡒Z5EX sJmlIZSO'#;R:zcy; ipȮ؉3*]V^6N8;6օ0 ũ5f1!Y0(3RDuD9+hb:akF Ҵ4 4IV6Ţ13!MV6j@jqb$Lr m4=Y9zN\,ia yH*4 %9޴Nգ2Q-jbzK8;J%17t׸ '(Zq*UTA=!'xѪyG.E4p1V1[Ҥ*M[m{s O *dqײ: J2, T4ivkR{382sz1 JAǶf trL,%<V1 AۭҶad&iWC&KӲN F[<+j&"u wNƢӍK͚/!$ ,ObƠF+r !:tr5VFM0"ÀFIAOo->TrY#Fd3,]93ƪ\_q>UfRɀ;)'@CӵX,O)2d B`XfeE|)HrkƢUUP/״zC :J(M!b$+AI_ V t7ҹa=u1 Ya3ci%/iK<' m1wDJ/bjM1r98.C$&YXCëaRM{\(3X/@ ]n4(:8lX0tAm/xyXA *1ET.*)s%%%`99C/20J1 # >FŠ|iF'Dϛ;cm֝ ڲhX# Xnd56&NX~YI ϳُrxcw#O $nr=}®Ip^rѢ>+W2*T̔Dw'{ fxN+?u}pyv?k1ԥ2b[D,A(䦱FAFRD&v`>s^/5v0l_=i(lZK^qG7͇?#(TQAo҉@L=e_O(T}UTUQ`2P_=Cx%OP%-t.4Ih!JR25]FEMQF JT:yӪ<ƅ8xBª mc )= pAMBn=4 3tA}I}=AJE E(͈h&Кo8`$BV 4:C0|0Xד  yQce=xwλ%`%2›trpd` & $b Cp1%%#Hv)pT+T9xC 1$ DM$0$ t>0+pN0cC3H2@$A@J))t\U !C,_9hjV FA!"6BL STBLE367Tߧ u~t$ &H0;"Оq>ʿ;yPл b8w"N6M%d$q:"LTPF(4)j4FDAK-ɪ-M-8 i((Q:,cN""1 LF8aQu);dY bY `O/z Zb9!ŒUK/GO 5(n_*?{ȧJ A"7T$;j3LplaˍQ$8%,lT!I7ٰ[M5ZmnW}>xs6ćV,aߺg?K1{Zu>8O&81yڷ1N+_>=Bdep'fTD:{֕DETD[ ?÷i3Q>#DDȔPIJ`wU!DHĄHĠKR0HJ%,@ PJ4 q1H& (b I#CTU1$U oed(fe(H%tNQRkn'wb4N|Sy(W$udukpr]Kc!ǹsmS`G,My0BYE`j'f9:elsPD`Lb@hI!D BRb1>|7v@"-YEZ,|J"%(hYV$dLB$bDx=N(~j-#t޷g3Dr+2$H*glC ۙȔ~$pK@ ߭q"pԴ!h67;FFHmkUFA:7%|z M Uj]ӲAh<^hqum/,IVU 0`0 .~#;rZ{1$mc<RI$1I!& ?|G){%\+4Gt Bj/jOx4 v~t{?Z#>QUUCj˹HF|5x4 R_dgM[}Q2I112G猇 $Eأ㊁}5wJ,AW@A2T;#cK1:퐚$6N9y$c;;h_㷷ᣴlUu0JI4+H"%!b`d<s9<<ÍS\4- CwoZ֙*Ѭ̉*\[BLi& m)0O\ ko]Gd H ( jzxy l̪-{QM JU UQ~>C-%*vodNvz1pߊePsB\aĐzFa쎍Z$?I 䇏NclH3:4104=WJU+pƲ.qpnf`adXs6!6lhhKq1 @#<(ӈhYKsqh#\X((qI aB4!II2AAДˇƲ343@t{ pMRr1H%"P$A6d у+ dDTF 9!2 RDRē&֜͒ ac%Ydh DɵYu,XHT)4EIb;͚:1B&[ZYC#5Jֈrh Q qy aVˋRXh-iuVKKCah΂(d !YlaR`s"{JKH °-HR@ S8 z(p y &G!deL8!9CeDcc#9qu9NFVC~BBId8k]{ 0&nbuWVh!0!+`/w.q:qC`;[ȖÚTO:m䍿ȵoP5VCo>A BYiJMfO!ⳕ:m<(y@'tk4aJ)*Tp&0|# CAP29HrBb'1SG@Œ$"4=5_Ujc'~T|Q6BƑQѶ\ci6#鯕7鱖DUYMFCVM&* *ރsM#4%r)BH܍9$퉵ɼ.! >$AJA' ^1؋WC$"1熆 Ѕ PH&v5 "2r; ưToݡ"{BŨq"Sj/)G]9>};xʀv8<9o{ !$ؚl=hѺ"+ae-TB88*X*cQCҶeKh^0jX Im|Hn"(0X4qSmDeWP]Ѯ4i\jܬiTb\4ivKkC2ۮ.\Vsr1ή̬-2Gl;7#mfYMΩs5mnqSdl3<`hDTlJ&$"*bHY-INzUVDIڛ Yh=U׿nq?o]{AT1{_F\mQC*>V=ЋtÿpoR#m'bvnpG"p:J* ʠX6$1'"CgF,r,CGާs-DQR ?4 aj%D!)"9JDabaIOu*ɹEcd8,u"OA#4J3"T_BSyR9x^{?_Hч80 iM^s bK@DYFlipfC`ň6T0UAl醆!X%y f'ymbbZ"мN.FYN CvJZA@ؒtG#T6@8e?s.Gr?_s}u2z rTF$Bd)@(:SԌ>TRb~Pa86YOt3>hȂN&1R"U>tEU""JR#! W!85Ex:H#>Ԉ=眥a ! (*ґ22 yx~guM rHIl6&d`9bpJp8:Ei<{NYP JQ(4Qk)&5-I Z *2ĕWTIdl1\QiYlbJ4Y k·gy:<Dj8!)u%0 N $6=W.Vƈ@=jj,-o{HP|OpW8|_aG@†u$ ^i9BZq(%"yR !j^L!,R=%Cu:,$=?> !C-Nkq۪Bh RfhH& }P#ms;kz]H&tЋjT^JOjl!ʥ&fu2 6O|܍bdvu8p$Hշ$ 4;2aЬdӁS,m-U CTRCAey-̦@Qħ]I0CDLQ4;@4^ݦBqH 3YJZ!`NXY(uH1 MI(2LqcfXJÕ5*1,UDT5DUTQTEUUI&6&H& &"*4<g-r(S 6`:PшJAxTk(F? &{E*DJ#?Ku>?d+_|*S,`5tudv6٭Ā^rA4N[vն*:a F#ZO~V6}a"VXG64T@PK@*6@[PiTЭ)}=٩~ږ[H&s1Jk Snm`')A7^7W!ާqдH% 0'm!}u#{'/mY BsD C C@12A) !7vH  &XHdB2Ȫc nSV"Q2wCPT{Y4xWHv664zY yQLD+(I5 #QG;5*6UB3*Dzj:2A$+ji0ښub*MOkU}^ZG>;<TG !Vs+e"ziiܒ l[7\:ּMrsDF{ouXTy8ևs\"WI<;~O@v FhePXE\pVGAiܣ=L8dtJt,5JXɒ_ؚ TK mf"\`3:F h֓@o?`_bkYKѭSQL`S0D:JOXēFZJwԟ#?KD>ZHҔN% PZ[wA1 s s&EM>(T q RR88jӪA , ˄K'p{QK'@ho9wau''d6BNQ#HH(~hS'ڑN .Re/&3N$(%R>П4HWt_s2z oc\ͭ~aL"bHăi[`(JE4&H%(?68NC O$ I|Rf=[A80L)Cz]O:[JUNgH${#3T籱M#̐ИWjcLPCXwIzu$LDDܭ vAtIoe-IaJ0ݵf-u 4씃4&W%>6{vtfIYy8\:-Ko'@~_nXwվVH߻MV_.# 6fFݣ_d,P`7k\D<u$~@\,F:d=+Թ]wL.UKm9C Zg@BbMv>AGjZD5«ckm-Ћ"ZC[:"lEnOQs0Ҟ+)d„vèi9BPk–_ f<ΌXfm$~귇\" ͔vN HɈ6&f]d׃bR6DjLv&(~\J;h.UP/:Uyke/|y6 X>H?iG >ify Ϸ{ÒfD/\M#ϟvF(Cv)]Z-m;eXrMZKLylZ!{X/^LGkM0;8i\hMԚS4sм1 RF+6!/81޷fU E 4[x>vrLE3!|TT; ]{h3nBcFsqyc@&SdN5(L}L??mfGD7}{G@M Èc<%)`*ĴV"QT%BQE26%ğY?c6e4(9:w7 I[Wڻ#ևBU"Y+ZPEN3݉ cyϚq"b#ASRU/p¾Kyꇱ` &~4+ y=ۛV}͜4hNig(g:h W>NCsYPrpM$xdK̙]ύnA-/(Fy9~3`>S|# nNӖO9:9lX{{ ?;Q5v18m557#.O!@jO^% *@4#FcB?kG"հ}3,HDBr]đM !Sń=d(`GN3!CGHhGE6zUT'wQKA̐4Q:If|Ңj$a4huL8U8L )+Bu; gE7!T6 !SS (?v0 U2"q"ƓilSnV6޶ ŠH&vމV'"lT,ciͨP oT "!"@NSL:*/,)*VO) O6;n(sY`m ~w4l w@x!nvbb_F87*jt]u9<49CNe:~|CS֎vIezkZdQYn ңCSIne10ACz7͋lg^?ӊ.l;ך$iaE2Sg~/!愊/uzT9'8$A\9,#&4i^٘B}p '>x* ) zpOn!v*:QYK$fMdֲGNnq*S)"9dQ9Qh",*#H,g@U3=H)?@3u @,)(ZTm T*SvM|U2\*iAoO5nkW=H>L}ʧ᯺Ώz_Gd/0#]0dža։.IܡA>@DDAUdkuvdԇm>Tċ$.wyL1i}g81 #jBB?4-!AAy8G -qT7{_1;hLQ>ox}kD(C&&頇ƍ8DO"ۿO>64 Ÿ[;Cqmy`y._0IJsZk'CdCŪ{^u8~5 0|;M/J=OE䵫dA鹻#ÉXz=cHmHjI}L5ұb;8G4(Dg'gbESjcUq3&}_fc13NM\[$,ݍY#5W5F)fc 5=ZB9Z-A16kyV/ Ur 3vdIsuO2)4U-hɔps_ɓ0A!E"t0 4@"9GGĂ\ N,rȏDM44W(,3 {ns(*D*D(Ȁ5" Ф 4 %қ&{c) SDT,B7!7 My>MCD?wR,.*9x&xbSJ7K0 ?S un  J&(mQ$AKRg3G>zQ &*!jdK9AJy$DU8$O١u",`FDc}\zM+ >D5IT#EFc6,KF0\U *ŀfoUnOVrX+XB)Y%+6R=cp=#h-Yj֫eTރs|Тܹ32r~yI%ŖZ("iFfg<\! l$e8Pdj&N[I;Hٱi3~`?&C;/s M`P&;qN],kGeS 8=v*J)԰2u(-VRS% Y1%:WpHb1^_6/(㧮x5bŞfD_{o>??2 abJo)q܁Д{׼@ "O8-H $.O{QDTDiu#J-uj" c^8$t@j*e avC>9/'AM#2vC2 A3aw"R gtceihVɢz~ ;b%3\X*zT AhR3 J _ 9)c~Gע҇|ŝ!x7џ~A,9?w1 ,af[*QTai?Yf+t969M(Yx0Y(o4O5 5 %W8tLő8b&P\̑lw+ Lb%kNvǬMɹ~hQD3x!)ƾxfFZ_@'* XASr'hΤ?q0A#Rx5*~yj?hHW~QG>M鏻e]7G naX_֤Xi v}iHn:16G#0r!D<=5 $1Ϙ0gpΟwCZ-T>_˗70- `$a Th` vBjpg,"|QI) woDZrӘvO68oz}hNSς`}'Ö(XJ0I6^\Α}& r=[rnzfO~;dUl=3'ď >~?Mt?bUN~3a8g v9yh oaGzoDUSMQEyk\&ך)7֚D%jS/ᇧv1CeD}G7%MEN!XX_>z3Lbu܂ᠪ ?31PJiEf!JBj((!!"X)`)BA\S֐ICEd7bM /4M^ 1曼95GY$mC6409[o%Hl9bR_'mt GuH:e܀19@bTPU -THMDLKE- !Д:JP0- #b bbd .Fb)iRch604,lR!湒 b3 iA{ZK+ZE?R*<@QtJ| Pp)¨'ҪYSyuv"$o$Mwndic+)в:.qeb{`[vMCv 5݂pa~N/1$3#@RkXT A{!: 7?8we5z D %8-#/G"RN݂C:"GK"JH1pD" :ߟdSEK$Tk ~{q;H5 ݃6cs a ;КS J8%0DY Y$T4 ҃ D0086Y'"'n$?m R˜Y75Ɔv =$n"&+f%)vmI'jA情qR#y&K'T{ƑD;O-b!r5X\f7c49i n6'DtE,ԇ 1E? dOng`|U~4vAdbS{D$ ~G@R0yDmQk%#5c *ECHzf!23䐜ґvRB@CD8AiL6xLP IM#X^fdferXI&*W-5՘011)=#?ti,SJIiu;~wіېl>͏(x5)x5Cy|R$h(4 <&`:}G|ra] @טުWvi0T{+0$(%#e-h~#*4k10ׯA2HA$3Ίgz;.hX#S8wgC'wyǼ:Zfe,ӳ(: Z%$-+QX]i*3h¬zcM$$lh1@|7t4(= UӨdLOY Vt9' W2-2KtW2n0<5\YᚥjWTpspGSjiaHRC>3Fɇ[ifh!?cKC>,?UkT0ܥD 1*vHfaP~l#nMyĩ8=PyqtNJ뀈||Vn5 "HW -lPicbJo9?$A" nvm> c=sSaٲ&QRcN`& e{lL[ad:,{_K˴!R$7TbTayeLGqML>{J *b|~_h ͭbeͮ:RȕZd{:/LF|vl' 21A[K;CJ/&ï4x6-dvIZz}/d'p٢ 5[5͍]FJC7C ~4rrv@de7ݛb'˒Ӈ;ƏӡBɂ=:T՚sDk=Fg؁~#=kY~2U Ez[m08c€3awEfi%&>OQOttIP,^mHP'w-Qɻ}%:ak])퇳16̘/*9.y8b9NZ5?K"\Vu[IfQ>N 6WvlHBς{pKg4߮hƅjv^?l4p85=s[d6R: oq4x|p؃ҭ6qDm2FGiN˨qEY O*ldZgգ>N*oGzFE~=:+8g 樵t6Y<{<1zgc8Nwⷆ ް9C |iͳAXDXꐆ&[,F E!l SPOՠ֝4ݑN ) *ܹ-5f9>8Xexꑫ%-8cݶDpH:ٔCCjARp~?ݍ<򙬕""/G>SuJ)~O4Q _ei9;Utѷhzoβ,p2 41!WgiЛ{gh_8Cӌ@M6qL\dYpkǯsu4! .4 []#r:)*hQ lʬg+ͱٯUyo ^P6n]!a$:`tK86s鮃$r@BvRr Gpž>n31| -7<+;x%G+ؒgH[\ GǗ 4xAOޮeDy*1^[ƼQy͗ö~5fTG&:lCӕ(8 s{n"{®K/,$}Rk@{uhQ4YD } .ؿuBW4ۢM8gV]D,*4p!av6&QCWQ9f,Vog A88$LRikѼ0榦s!R/gB ?j3s^xZyQ}HYy9KF+TK ?(7:Xb+JZA>QBLxL,;؏ͲSyXr`}Up=hafr ȸhZl 1yFĖ ұz%oBS#Y+@g haAcf͝2-'^))'$b" &NF;A=̭U7'M!qc M^nB}`K_Od$<<=rJY 0#a2Zx*RJP>K~/,ݬ/scC=e% /37jF1;W-HԒ?gC ާG5lLW9q6fۊQZԯiMCCWJ/qW]>33$f7voaY ]Ⓘ g{ve3Ҟ\0O?F3T$l썂XjDmƨwN^#Q%|.EݞFN~Z~+I'a<. FtAJ)%%*(((R@{2Zdٌ"Io3 W\p[_n,.e"X$Q!Un_ITm鳓^]%:Dͫ am(1vǨpsM9s3W|*ZyoO"`A9ȶz(skj8g,"9и^54lc2A60W\J$- FAܯ =y.yO >&}eLCLӸ" DF=i#nNڦ@t/6zExsƌٴhh3ZɁ#1dNL D|@IPMe@$D:,ၽ%Z lg1O)FZz]9Sx10j, bҏ& /ңVLi$իM.{(lNnWh cU;D`s/j}̝7~q:r;l(,Sz:fjX ǁE P(4ZiCKIi lUQW]|D3㢱A}MMJٌCiG[hpO%IXYQ /o`3b5w63-a47Q{;"k^Pm(>Z(y#*I5|̲aBDCkI,REi"/|oVICh#ڝ:Tq,ho]=t&3h4cw~jb=΢B_Ѡ{<њճKEVIɤb-z|@p}<H IPı XUOugeQ瞞8nLbR`<9W:"'rZ/`қd 0cuPƈ=>-e#%BDgS쟶z+Рf׋UHuyK 7> /29mrqi&"h|=GQDŽLxXN5B8J!>태MP4 cBo4О "u0huW:\.@z]cRs>E9iѰ(QŖmX N^J]o&YѮ6̅,8rB.[э 1"R< `?Yi˦ 741_W㩥Z*YBu2EU8T>OsclDT5K]<ݙOq:^S[j)Hk^i\e'~=>zyBO|taYNd1$( Zp>)wD9FX5 e~v;qN?9Y*ŵ8ڌ$H^?U:d9 M0;;G{jJSvAX{Ő1^i)' sG星rT˗>x˪vrڡS5mk!VL_hf`AIDC!J-)H$PAQHr `F߉ޯ hbnXZ}DUz$/Pbޏa^Kz_9J%z]Ɖowەל1E3;0{f!h%Mj$a{SM!+wݟH%3L{6z:gHM?jxM#ja! zi' lI!@:GrcCKE{ykt'a~G\NI3̛^MDužg5";CP Q@Ímӣn֨IbLp]8yEu։{ee-:VfjK*6fL$ wbBյP5xPQc#a2&=|p٧K!l'!TZ2XA>f{@_u iOcW =Kߏ}o4R-z'~L-yW({rb?XnU24DEDI2FH!)!tEi) ifD"hJSh) ICi}!4){1 Q)3Us94P!HJD M4& ¡<fT=F1< &HXcS@o r 'LRO3n | R|zgRxϗt/OiNtr8bHSXfmmll8,b [fdc.YQF QQɏn5p&$aj { O1p$ 30Vd1'UT68ٺi+f1Vc&Lcr&nK')ɽ>ǔ(u7[ux}z Y&z}1EFYXfOd t#$ !1v3GIS> sye $&7[hzI (L #%|Kp>B2Јlcrb^ᵴF1R{·3@x^!F}E6skK d$\ /tBOnOEC&Sd !U7@VN=oB*"z4rcqxrJ+i=~ĭ׿ǾB[ުU,!iN@ CqsDъj#xER$@{SIbk5B),>I1]ay"ACht]ʧ]+4j0|ZJ""4R_6?"?At5SR!܊ '(G0aZGz9ށ: Nou2)0m|ыa|fc> #{h@0G7)"&:Gm'h=@Q;Os y_AG(WL:]H;yYXV!jyEMHN"K;7w3H שϊع.jX6bC;': 8Gv0^ό[ h#{r5sZSz٩xZ֌Ijy.'f2 ͛;thM1؋@ߛ<ӷݔ R|@uZaߍڱ ϲ CིQ!2 N5gX 078M.7 ^y.QgghO_1pzD\0}F[MaŰLBr^xsY= E.mrvQcm䩶 8f*Am 3i,(MB~&u%|*:;geuEC\"40rG\rvMF&޼<-14-ؓ7кd/ll"l:=DYu7r!P=+hҶדk6;e)ڍmSm}-! ph+֥{BtKۼ5up2ӡuT=A47\+:mbC=36Ӟhg:1=k8 4&n/Y9u N89 <Χ\ts!ѦUp{e=qoךс$ߍÛߞuG4n+<]΄tU qȭy< ګ;T3qgч.ۨd1U &lM cg<1CGF-{JSi^,E0:8.Y6A˓|k'&Wv%CB"jlSHMMӴ]Ws5l7"dgBK$OT0=`H!aEY@w eP4 ! %(" kʹ܅X ĄAa~۔Wq"\&iW /1sٖq)T'.:875Tpzk|=5%k͋#Liy/UבmU%I$m]N;qS 1B-Qf 뷁9Z>^ \ŭfRڄP?>q1RLiPW=lVj $X;>HI; C)sh^1K@esTuXptA*DqCA KGujE8\V%tJ*q=O Eg, A7*'σmݩg),yN#oz[g|q(oGY:\ֻ7;Tk|u9Ts,a6Ulѡm`8"j [(QZ|m9,=P5)n œTcvHJE%鶺MoЪUA;y ˩lsKN ^]rD❄30P׼*T yv&bg=^VNsq#:d+bUe2-32<$IX9T3&(Kj#KƵV?n"5EU(UZ`B3O=;官Qqg#|VYG zY9:m;Z}Z(np>MNPt Os%{b8JAR8RT 5тu$^ " &4 m%_ f{IA=p /l9*K@EQ$epǑ1D;.=Tt<[4Gv!11AA0TL$UQ@r7Myxhba4/p HTv␛r'@aӍ#[,m#IbO?~F~.p|:=Ycc̗V>M*ڼ)@yƆ Ji"d"Tԁ/vðoM.Zi.Rp\oJ{1LɆ]MU!R`{(y( q(*䊩QT0JqP_q%Z–Hٟ9#RXDdJx $lLBi!0O>-ðf8pXSsvH+Tu}**Ϋ`Qv\lAHIbA;Tb2w` P@t:a<]xNF)Z"x1Cl8(aoF )x , [B9G$eüP<8y 8p|OM" tzÔѥ*1rڱ/4A2CR'|%HI(+pa/;;Ia"d8d[q;zT43- ǛA$ 082$Ha`0K#I)iy!30{=Q2C.he;bYrʋEn:t޶f9bYeቴQ1TaQec/[om+%HeuL2ج ަ玤V|Nxl͚|8+Z8\kyt45uz=U;&rM[*A^~G)eSbyG\ǧ]G CBf# aKativ'}ϟx4%q0HZAC"!u(z5F Jih޵9 (^t&e.y\"Pc[2$ئЖnp6ki(V~ PD6}nyN:C{٠$s{>Yng]GYǺ{ ! 9bħ81<7#\AE!1E^,ȡ=y%p@p-w77R5 NAZ6nSo)5UJsvC *eqGXc)؍i Lg$aO$=K12L|p`^4$Y _ r 8 ش c2K& A Lz6,DjabZPa ve DMZDV `:3. WPuU n>53[b95`ca[0eCdl$"yЀR^]- -ĩ9(NAJH&SJtAS=~`;*ē gx6^А]!9ː,$;1DC)2ӴDRTq<9e2C1gc5z*TΏDx ]+>8 [9b41OrtL{w_ 󌴅IR*Nfb7R! iF=(ȇhG8~YY}8dnQZۚ0D ,EUU0 $MR5oXq' "1,!HmkNq7fϸwtwa}{ƒ̙NBia Sܯ<8=#ud|}kU>  $OX`JD)tiDP'B** h(V%H" "0UB%hh&B$)X!@B!?a쓄NK@tEF~D6ܵMqO9wk?B7$)]r|-]H~$1YWP@eC5 PaASH@5.?fIu)/ۣbOJ3doM> 2udG~]ɦ6 4AF YOmPEb!aoEAB+ǩYF6W}-qlhaX ˋp!]V;Dˍ8VJQ< DR|m8ԓ{-iQP}C@爎[eԨ7 k[}95g;^ptƗ7|<9R#<ǺaiK<4.2.%MIu( @C(!l5~ kCԱx[d(*OSgcPhi 4F2 gWxJ!"ݩ[[n;t~[_Z;Oܶh ?t$D9)ND9|Mb!Ԧ6]~b{~~;i (f%r7;I!W'wp>E:RHE%hzh*"÷u:kџxAANx /XB0Y+?`CJ} `Q؃z h:K6A^}rS8{-hMvk7\w=Cɱ|J~A&84GFE*`}\R zzZ^e|Y>ϤA$MfD8i@/̄,Ha; P:5Cz pV*O-8N~/I>7;ETcdH,@jlVdAPBjA?OoXDPĖz5wxCa'?dIdǓ=?ݸwHL"|HSCg99M|7QxI!!' *j!jΤLB4#OAԧ#(t!Sh ~膏~:5q'fc4c>9co=*?잴08k'?<-ON1 0:"%ia%EZAFCԈsnaÉpĒJh، z+$DFbbJ*)Ч) π?2UYf"aǸhP/|>'}ş aQ֍^k$b#G^'ϣDIvAJ rM}AMι|;s$qQG*vT7p!<fW3 ,x1`1I")*mH|:4H !LefC}ecjyvb9`pD2 @JpMeX)wU;$-!s?:?>u2r=s󚸝ME,Te)Im6:ŌtcmmGdBdht ,DriyO u;VF.R2 o|ԺAH0NBLfɐR$29I @'A^SdDx62Lxzuya}XSI0(mD1w#N`H݆tXcCUx,̖b'PSA trL&8a`JP @DS,MR*8طA5:Wk *pE>Gt@䪋(@IQ8$xDڐ5B5p7,zqt~QljV|Mz&W">/+&ڲqVc &]LN>G"C̘dI)3q r`FabxPL~>sInzRl8C `7A Čk*|ۍ@4oUt@s:)q)(bJho&`4DfuփZ׵f:OG/ȗJ~g,Į *t)Bl霍_PɖuXoov|%!Z)Dm}SxXel'8`'Q0!#_?G*gy>czA200DPm28-4b,t;Iq85CpFD(+.), cl 8ܮ)N ȩ㜄U&80A-$%$BK$)E!,rN >6u.P8,fP+?U 0a$bed*iJEky+)iHUm(4"rn*V$T~mvۊGf! fv3>Wȃ>R=>HRaYғM'WT`R8ߋFٍO[%l3S%la`4(-@j&Oy51h˻ 1+G[m4`dr;8}+bh R.Hz:۷.-(Lt"aM'5 C0ٟQ{*ONb֟bCpDа(pbLٰ˴4` ͸=`h`(Y3QSI@޳%kt/ OYK rc+sӹzmhk8;]&izU fϻ A؅:?@|!4mmZH֎eaAF:ZZ p¨`/# \ k#AeXy(]0  t% ?G P@h?$^( *!_syҰITXTyG%Uɭv%PH@eB` bEllBCz$_I񲝲YR!)F{ x{y-sT΋PɲCa9BдAA+HRr怜i55lkpx!oGaB+$S A& 4 }BQ>O2USJ*> ]v։*x*["&V(%Yj!|?Q""" R')' DD>HcK?n3I y*cBKHLS!@L4A* % T_2jͤ Xw GQ84`&m}j w2Dw.G Hؘ&CH: `""H!J)h"CqKVދN :yk Dxl~'sR92n2D}/B9sʛvObhPOGQ{e bTapwxEEK5M$ETAT UO#ǭsS8&154@ L*'l#'Hs XT9FHcg*4!@>1R_=2iZ\os3[D{Xz3i- 9F#6b)]w=c"І$H RMoQg{}f"E$̨Z-<띶.Ƹ7 .Nd\sfH4Dl{>yI]ϱSes?~ b4#* 2#]1^ڠFƆC&@*DD@}1A{Bv>$6zUg<.Ek;֝ޟV/#$ e2_:XX6ԡD3y,hcY hdBKJ.ۅT{c!;phH02rɸʫ U"b)ouQoFܮ¬0ŲCcdq$ql%X?kBl,ãago`w90WumC)$$4\sfb2ZYY3t=YΠ~B NYִ|ң3{d0֜4ۚq `!`r\IL[8=8jpEOw NW6Aae78ؼjph&,:4V&l>U[5LhVhwXB9b.UE*H#T4`r<(5C=uתj>%YS>4vCFNUQDrd&zɍiʼntX={fybja z Hȃ-D 5QWEՆiJ"qu'K{@e/c`VTp]>kvFЧI7Qym2|a {g{ʧ;nc5$BFӔP_CШQzI5;;#GRS9Ǜ(:ȁަwrv^˯ $@l(rrB*&#&:O~^=(HB"$2a0[A!o2oo #lfBJ:BHCc-lo2^?t?$hUS;B>Ͼ( F?k##clF37ژGF " MA"d &"#TLM$HHHD!J+2S+ 5+"@J&j$J%FHXNT , =[ALlu%1ڀ c81%,, B+ %*/` _eۇ?#c0RvB&'۝rL(b":jSX 1(mֱ8#p !&#a)4@h<PPWVk`.۶1+iQ U8BUSI(] nj-˚d؋ 8hB4ҘHŃ"!(BD$9vGv\TQ좯rL۟' f>9OHes*w93Y̱e5t$_DHNKdM87цD]܈ h$|܎${zFMnn뻤l}y]gwݛr0u>ݽȴ:wmUp͏7Z֕󮗯uZmo޷|` {su`m٣E5^;j P%{5fדa֭ovvvᏻ`&桬{>k$}VZG cB=^d(BBD @L{J*Sj0 폡ҪJoxޠB=`zl:0v]YA@R;2(UEwg!@m!]BM ;w(RRosN! ]2{B@@{K*tqrl]h0)COy:"` 1 *h)ܐkM =h`:mPP4PI%H(]˧U[ᄑN;{^^(;5{za{{wb( t;g[ h @^` @҈<>3i}@zOP+{JB@4:.$n$ڦo_>s[歯>hmK}gim;Ϟ/+ijKza|ѩ}8'jkŘw|0{X|]C}_{>2 yջ^z"ooUv9vulm}{i$>}}zk>9e{jW}zݮT0=@>}k_oOhh ^ǫ޹qv(v^)1;2T*{x{vT=Z޶Z!{f۹[ǚγ>ny_)ONrrvo-W+{v]ypZ;]wYԜ[{{]x=B<c/{1^W]b`{7c}=76+&uz۾z{zw>]ږf.7xDwyhw篻{wzOwK]ξglws>yﯹyo{}wul<{nw뵣y.z S9[ris}[gM47ѫmsާ{C5{ ׮z/y(Aeoθ>]RہoNs8}}o^lϼ}s7{nݎLۄRݷ/7=u>nkv-/uwwzwho}^wټ It W4 hPhu ^q@M"KxZṣ[n6Z:ý_}wHy}^>WքVwppP7C#M[-{mkJ-o=\W7{Ŏ7ns-[]G*n^{iYP]M9*ۻ\}rT-O=;vDiZbrox7 }B5* P+w׀(YZ{ΙwJն;;v{m/%]-|}2,}mz7T>sy}{m6vz V̟OqӞn{o}mB4moϵ}>ZbȮvݟv +Aws@=BTwi骢_uw{n#*sR%n6&ҀUc @[FWNT黗d&7tZo>u%uX#]m۞۰]nw(ү}}ӾO3\me{y־W{hRC@`i4Ug>}q'vI 4P ϲfPCMOJz kȭtifp^zm[|dl]zU]PիmӱWvUN|M|u>׭{˶">o|(4}Q lu]6ͷv=z;gvAެcA̻E.sOmp& uˊLO w{6w9ΦT=4Iwt穭2z;Jwu־z>T>L=|_|w]4OcNxJi  4CMLjz4CQad!@M ~A M'My 6d@4H$D  "y42 =MOOhP B@2h=4aU?4cJ3Q骞zަ)='=@2)(@b4D2MhI2LFU?=SњP P=1mF D2 U? &=?SMG @=@ /=OyemBRZPEUiӎR*eeV\&J}x][D͍ 򑨨#PGxΪ8zSRhQ@wL紛l_7Тp@YJ8ÉJ8ӂP ``A"([_+V>k楙*ԛ޵.I_3&hOʹy=;0!M TA P8`U@ʯw}bW׾o3)dtT8N4R)f*T5oK3RM\)u7[`3ޝ|aA:[+=,@(@ 2iDR1dUEfJR!PH"UF$bQ}ZZ Ԋ,E P(PJD#@$"䩄LҔҍ P#H0@ I 2B*-  #@ R PJ  aĠ @PD!CHЃJ+2@@4*PPH- Q #CA"D)*D/Tu*.B& zU1j*XQ`T!"&D ǎ* m%P?CLU+"U6HIE0ѹ1h\qo7UNBP$(AVAU]•H$RD4*& A@#?PzJ tI( {@Lu i8 ݐ_G( F<9B( CN}mA|73X$+iOWб -!sF!b!bx0,B4D,B4ABa @ D,B,@  _v?w[VJ]JUف Su|c9!v_|W;+YYdl]I P="0?'$p "(%#~ve) ՚LYsi$ҋ)?GEA%(`Tp"b(TW:b&.I JLRCCT"X`(4\,)*j)"* &$0aY2$FK3AILML 0$KIE41$4ԏHL )K)caa,~3X3(H!i)$ Xh*dq"H)3MUUCRP3Q$45E #TTTA4$L1S@EULHL DB@PQ@LEMERPU3,K3%-LRADIQDUA11 BI @1IKHDL$E- &7֒*2 1.NPTLVReI:A~86N_5 "(XTQDRBIMh"H`CWbHU# ? fbO m @jNU-EQD$MS A-&0b(hu9@2! 2D0A@D,0_`iyѣ$#D `DFAPd%g:yc2bbIM!AKS=rCX٧AhƔH2*R &(S3")JI$"\\,D $D + 0QOYp VGp9Aߏ.)8W2]EO̿ݜaR;St'L.P,&v/`Rm6|עfELsΩTzqW;3] nu3X8 ԋoC';)jY 0i8´d8&mMHqrlhl7Li}3)0'^\ɿ(MyDߵChMa-Nզ}CTQuI0LQzHPO;`˩@7;9$(r߮ BL o.;U ;^ӷq uX0}ɐ;vǧnh&FCrC[LiQj|.ز,Z: X~)4ȿ"+Dӱ"5&+ǎacE :yُZx (ؿ7 cfd C=Z1G8aZ,~@[!,l>gi&v׸a?k1Y[U4-Wŋ)zf Em=1B=ޠ1(RF[ƭ|uWm3!](ׄU q012És؜,Y)0R"U5φ$v_h $=Ib ěֳGߙ)|nwz _3G?qPNM2̇\?c,q0}$4&EH6WG%aLK'`.ZXCR1B#) EZ<:`ck *׺8oFs 0kM%$J0,g{d54ظL0d]U%B+@Wi5U̇22A:"DWr" 9| 8YH llJDuOB(Ьc9Le&(cX 61U-D3 aB՚Nɤ)|VKFԮV9IgxBK%$jKch$,LJ00q.6ٍp X n71k֓ɏ,ME @鹜NnouF ɗkϝa?ZfU xvA4V{ B%j"0[;(%=S!?2bQB$:6G7[O7 )Sd&C#X›MLw{Y'P4Rz1b R1hi^I5H:}"='<O8H<|oOWTѓև? Ѷ*NF{l+r3e ^m@(ٞg{0hD(@ ! q"hWا7)/@ͰW:zl T@QZng9JYAYG#y;#'aEbB]Ěs&Yͫ;u84u!z(ﲤDukD;&nÌݨmܰk FkA҈Y$Sz~ #n\>zz!Ӽb˃Bl$Ĺ;<ߏwS"cLT|bSrk Z9 QPCiZJx~EԈcG "8&DB d4iQOeg3}b+~dxOG h DUZ@]xYס!ARgtkaјtf̘7 fng1s+13~;T KFUgv㻮 ܣ5Z-6lKK?,D6rrEǁP^`Il>x²3o }Ѯo4oS KX,2&CFP !" PxU|TRD9^CjCLc-FjZhQa03s(GAʷ͵q{"tyZ P4»jM2x5lY1x24'r #PUa/؜4nAfUgT6UY 6YOLdllU^u8zWXLriiJ y 84O/;sr-?l|L a5HL̕@tZTK05#"٘\܎P?3Kt˰qiLq!8׫T*Q~~zR.6bRSUix~J&*rL\3ZL9|i$UИڈi)XDeV'N$ubխbP`2("cyi@ӗPb,?CX1B#Szixqɝ6 M9e~e6]/.h\.~-t:=5VZaӦ'0Gr<_ٍgӥx./GnZ,?)&~}6~d _ W((?:=*Q+ DQ2(2 2z{nPnm8G P,t)G91+vF f[np CiANS%YӚ0}7Rz5>{qeNէZ[ZpQZc(o|K9!#!kod@R9Yg>Dtg-Ls3Zۗq-y!-\c~ ל ^0| pH4u ۄpګaAHWa;Py\>q\?{iQ}:Ոs C-1pvy6"jj=bU:~=,δ8c!5_lOlR R?? M5v_##Xh"=Ǐ znHEcV$a秎"!hzNhA\"-a$#FRnU1?ϭh'c>5H{'vK`{N*% F`J 8X)0"~O>Mg-,dt_#\=E(dfLת_T&\!C]R'Lg jZ@&]kӴ(~.a8iE2Pw̭`,3=.Vg< qy7MLj4cWV,FMLL 嵞&}X`ղԑH!@֙t`HxaNq>%?/nkc90!tf574.d!VvuTpZms lǰ4ʚP1Iاl3Yy#FMH20gyys|V0Cܭ앍*ZSF۩AE)댊=2HmuHa֢֜J y\m)(/VE"mcG%!9M6¹蹅\6c08zqkV8 qM,ro7F_T|jBԥy2hb#KjJhL멪X4}M2,˂+jR}SKk) iP `Bdi4k1S*8VNh9)f$ZLsHR[_.22İHo(+WK ٞ 21e9"[ G d}{'za9{8=_Vr`TɫqaۥgX,X[~X3>L B"2{+_FߍݕG 8tfl:i|i 6GhY1 ~ꮯ¾6pҜJj(ŊB3@I VUdfi0 R3 )2Hl`ttJB֘ У2:Ǧ=5׀X}|w#Ed` K9d)d;:<㤣m$yX튌# !)zu,prU6(XPK"3.V05"!h,[Ĩz.uxteJHhQF̳3!2ṕ_9K/ 9pvZyvl32(~|ٶ$q = aDH(Qm݅]OP1yLl6fKh 4%$D.0X-^b^6FA \#O^z~0D~C "fArktqgfYj!eCA#SS8Du T 4k\/ɧ~:Qg`oz Ya1َӾ'd7MF*C<;I4!8~8q! Jd$HQJL9ݘN ( "X, fJ"))h0b@JkF1,KTbK˝bpLzdQvꨐX6tZXǭDww,ިLzC T9400ɓ!L}I/#'Ri?)G'=xqś?;*w!}ey] }V5Vtf܃4uqCCLh~k͓Mj|C !)|qN :bR$ $vomptw}Pց ۪AU3?cNJ+!ՐJ&9rx~޸e롴uQ{G}n߈aEG]S79XԘ Ay޴Dt_vIA'We/CUVO6dؠ{`ɗU%ji'FHe:+GmXw*JVHhōWFUQ[M8Qq{m (L2vMK#PIw?q@^gq/ozV4+LTLSΟ}3۽CAJ{sacN]m75?&&9f SwQ|59>Z9W z>k};5y;,;!$J5z?:PrRvuiݎk ̈́RNhNZV~%(&cƒw9(ݩ?L(m.y Z\'8*Hrk8+.sDnVZ{S{]w$x\#>OE[]>gRMkO\'>Ovv{dX,6Nc;eG8O2I[<ل&I >V_-Q`uTt QoV}z*{T5_: u}{?g!Bo*%^?G^H^kdE8Azf²mWw{k;-O- V钄:.J-Upگ+|FQdXnȸm'UD[#d?ܦM_)3$t}M-'gi0$݋1uR?Lb? ^[`| IӺ $ie0=2ڴAMŃ}0sAxSҧN,6Evf &4`dcc0@^EfRb|i6LT;Q@V-eieR I~/"&lBCQxX^ԕ4 G=kq]V+<߳߾m2njjalh^/aWDٙ#跶o^Ē^tDz8{aOgU/3q??)xYbI,XMB{q>M;"}Ph1)@?8Ҩ*R" ÿdhM> Ewُ&>*>!;^,HX|'ϯt `ON>/YH]Ys%LffboӍ5oj0 I1+#䶪CWOy*Ű% [$ʢ«,gHA{U"k$?<@k }n4î^.>A܏7:eE^/3?vgzd$A]/CbLTVN.׿Ox#q.]BRwL?tӎta~NʘЅ ؔ3tMlx=sΛm=U`r55Lc$Gwupq5W~NRڮxjh xƞ5r~g ! C1bzq#.ZSZHKt~xU@SYn Ti4Ij9}Swצgx8F(tB?.*Q/m%~"⣹╰o#my~WUQA8B!c8Gk* Ju20LP0d Q 1xWU( 섅JQ0:ND䰧ߵ. ^a4.=_iCL~m308)y/s01F(Hfh{ '9䁿N t%Dc늟iDŽpZT󪠨HbE־H[b_ek9HS_mz )1ڛiQM4;tuU: ˳ffMPFJo!~ؐŚweDJ*<!k1Z/Y7r_gD=w0A^"1֘|"{RLsK@a+pWMI׽qbNs@iȻѣpRѷ"(! db mGT#/uI$ sP)yKνÎ`&8%ZFm4GP)] {v+,S=I߅sa%ea-7}mtnCp%lfS9U^wWɝ~+'V adzo$/ |tyxeF 櫌C'ӄ_Wג`\2עMr+Gm 3sͬD1a_syYqX_׍P«s譔>hUJHE|^kIbM?-_3gE9O #wG=5hAh@"L˜{ĝz׿(F= S!`ʸ<,?NT>: oPah΀7igﭪ!*%bZ"!$C:6QD7T:I$!Ht7+Q"G@E^>Ɔ񿣍K*43"LIX1UUTceUI$!$מ_c=c[N_}/0kYdڦz fP0|z⛫ }) ,Ė yC<?m$1D0ՉL|SCp54BB$3chOڜ~I7m>lʊ$}LX-w}Qt9d,GkU+Afo:|EۢT[MyȭE1ful9#M5{Zn1ZdfaNjEuUUJ,5ӟDjSc+1͖^ӗUuIE$i52E}vДtI44aaeW`P,%I RABdTAP 5QLDSE$LL!fD!\5P 1|tdMGÁO=qFNYSoNavtGfU"G :=rpQhTnu:Yr  `!j8Ywq?aiDcj&X diSVϙIZ2Q-Dc&?UlGDE_ڈ \K?=r}F 02> C рIO^|f.XAA @A%f7< IAs$ )Z(()) c+>i##Zl`S"  wiE) Bb}ҸArA(=cx>DB!R@bO|%T@KBps0(J)$`$A$ V'B)xdB F%) 

d'F,B>4@((e beB dkFbGm-xs,b{Msc aŢ ze!MAlM ݖdU2 |~ O7#}R/ H@UL%Q zAfDy]da}rZ֖[~%t)#48h?VG ةi#U>EL }ϚOi!fُ|o@Wօ_ gj$ҡ?K%* 2S+LŌ#l+IFr2RieLu$[*M+`ˬQ6=oTrDC,.,*}x* 3eڛzV+u[Ý.%Pj YDEM [ǽQx. fbf~7l0.I`֩V+Z*Jjg/MunK<"NFpk@Qb !o%"?I E4jl21.hCwK Q1A!ް%ˌ?;T;Rw^{7_2CfJ>W<7U D?C=C鍐m!pG-?TYxs\Z]ocdtSy9(c"@[Ϳ~sv{;}}hmG@/?\!HHP j^>AA7܎{8Di<'|懿NA %6q*Ky.>W>գjPr c;M-XX# ͗&g*+3*"02q9"w7qdW \\ ٚ@ 9REjL2cRB`k3wIT*#YO?v枔FN4: ܶ6 qΝ3YۑysO 61 %)_Q-PH9oע?z{>n<P*uD|\$/ָ&I!j뮝5E"$gyl΋^ڋaϦ;i~C0߫PR$QjWﲎ7C}8p4t{h1>;1t!(gfe1٤9< {^֓ݒpӜ;GVe@9dp͖< Y/7&laM'/ q7 MpPNz!lt8P@??.HUFx^S%30ڛQq#CEQg#r@ɘ5b|~-n&O7ZfZhiZ//9\m,"7k6 umeG^QRO^IڂԓlL1ćq!޶lh33@tY4Qn74 1[(zȟ) 6P[x&`cOvߙ%|jR֨={+mrH~s條:xitԑr~LEYF)t" m>;ʹq}s IC'BA ƒuw0lc:THD \<ն#L+ _j,A^D3n(Bs7BO&Aj_WMZ>j0)dt}ryn6t [!:i3#az5n},Ӭ<͖Iw2|Nj57uщg࠳m_=1h]֫hXs81?G}(4CSDɒP(L$EſQ hD~LF,10 B}kjbkUg `5at$0͐{u]2&}1pi==co6m~Ty!J?\F]:8nnt:+cGc0TiF#A0vșD4&2mD[)C:ټ Iw9lb@~.4.v0d_j'0,f|.9[sȠ v`TaeǷ_4q뗰]"'˝CQ'Yh`" wK>^#< |d2L&bJ;Xryk `;ad$7aB_vǷp!LԸPg\}$t`vPR l74__ v6&-ʱF FaWY]%l{u+2xA8'>TeH=N.'acOY:{[χC6kˣ2C&̀C'YY=x/ZT j;#!=ѝaM \tҹo^>KJT]R|iR~%y*C4SM2/mrfl8XxO# g~q;6 \m'-K|e[aNO0I jcCadgVi&&>扶!7oF4ޤZcc/J" f{1}ˎ'K+Oq6vh78ేx!NU J c@CD;!I{QI1$Nm/d6$y (Hb&&[ң-5},ޝǸ9݆ z?`vrҜxl$=q:S|F'͈CQ8QP7;f`6AV`ڙ[~n cN7lۡb栆=(qcj2u;Q#4"y# N>]?G&;'dm4wϜB/<^}tNw_l>zՇ=9+IC?*#GcvăBrfAl/m'3k4]RAaJQ4JT$P E52P,"T5 S@Y)S4P"ߓCPPPP@% P  e.Ad8JX~-*jz?8!!u<S$u9Brk$|!'-0K5~74-PO? h56Dܠ)UH,Td)A%ӃZb( cb 75Rgk4T;ft3 ئ=˃مl--vY6?^C]T-"ԩ^/^!]EEX攅?x܉~pwCI9/8F[־VDq9 :gn*_#vJC.<6OJWވYזjЩ6NJin+xI(t9+QDro.C~k'cWJ 0h"/T+}Ѣ5%ne|SA,VNw;f*4T`WyHeFXJ%Sid,Ew=_z?>=ќY  F4IST#2KneίrquO첪7):56e_%k4O]xu@1k<5X1*R{SOnNDSuL*ho2(?C1u”PvP|=E{o&{a\wgGhafVC1m&WӢkE$`JRk%L|0]hQwEЀ r(qa@^ 4xlWJw"vG%XYm<EƠ"#:x[: #ڭ/^2+5ca/տAXy og 2ϛGFӸmO@D?[xoGn Ll{D>#ɨo' |i톰?vIX5Eƌm2e/֒JCzXڨ)ŅR-:!Q c>YdPg`#B]Tb=MvKL J;u%$ѹ0 FxpBg\7ɞ.P 4I6@zO])f]ΗZ bۚ@}CE{RɤyJw'Q!\Y:b!4i3^h)qQ5XJ,}} (zOC/F#W6RbB"S绬Q7\ۛɠet*?GYWeJ6ƺ&89%Y^3߷>=uj}uC#7bWlXGw;ϪM.Xym5<_l%+̮ڃ&1z]4^;\ƺ fTUh~_`! zX;!eHڌ?3x&_G#D%N{Q \HLֻ}/?wdC[kdXRsNGEP/I=R\l,BxX!V<_:Xr=i]-dq˥Tڍt͕I,{˦ֵzhc#ͧe^5S&_NZ+`8cfM jlhDG;_EPہ2 پ%U]GE!-Ýi ?`w>[#+r^ӅeMvn(&d#oZ[{ɍӏקyc}qcz*-bD*jjtoRS < /])Q4{ibc,=SY:owgj?HT4 |hKRD|#("Zb&$c Qy} t91Uu!Qj|ՈvXRj١n`~_vq-o?lO*ب5 ×gOcOZT7?kR/3]3&X La x$Vrt)Y;1aQxI2MHmi9. K7Gѯ&)T l&HBgow/W a C;\bmFV'qq'+33&93{],m>I$! Vͨ-i!8oo$o7rMvCNҲöfXsWs~r%  qtd}BƽFqM@6KRS!=uȤys}O 6,݉Q~]SrՏ~;i94L\Tp(7T 6)WTI0egʪ6UTMAQLURA$2{kk<9Yz!MPQ_V6.xml)ODƘĵlRP.{؆/_}57{V{IKV zk+++T"5IlVO7ZW~\'uak'pԂ EFĬ`7H*2p-}V3UAZ|邈 >if<cI-99!Rh%H )qX"0$DB1( r]Luht7$ Z2J2,!+ p"0q( Ac0 AcU@˥3Y $[45VW n3 , 00mMll{z0~и @)-!@b>eLM,IDI0CD44@%-*BIR+r5 &&BR(`L!8{O>[ǷExnz)m^^늖po>+J$ZR"U7t9M t i>|ڛXqsrtd6_s!b'2~W~}~RBq[<+Ne˔v}?OzNI<ᤵ^^(mЅOd#$<VC䦑fwJo/[٫xܗBV=cTnGzVUws?54*wOj #)k0ʝKYai{鬲slN:r5!p[ԯ٢<M "i0RVN2bvmQ;dޞ$֖f'>jjJݽq7rJ}Yp]L+^|~o-{&;m>礢xu'<+ӓWڍb4x\(Ÿ6k\sQպ/'Y(564tYȷxmb\#)DG#<UHK )>[q.svy;r (3\hʭ[-.-& 4c3ΑN)G+VW.O&sSSO2植e& 4{u"*JlRL-jQRѡ\^EZkb+"c*>6942M]F wUfVe[7_}zʞhOkY:I%jZK5<<EhP[{|TNyS4NSb}EEi UZi6!޼[h8Y>~ [^ !oEoF)yPD7CKP鮫y*tF{RRB$YS* j*,-\NT"5j fFƍ,Ӥ)aJ`"2Kq L2~6r"4~hba)Tv\MYVZ I& d 2g#1}^bNv۲V@@DZqB\GU~"9'֮Ϣm+JRf#43 /D<# md`YX>|/^<^< ,gq/)؞˞*J TS1O54!jtZȹ~#2=רqWvuY֪uQF(..K%GZLurm抇\+UCjfS*EVhoW]i*J4 JASfMj&&FUO9**#UUeM^FJT .H!ʫ8/{{"U1{yʱ*j-\J&5*mzRuOQ7e"QTjo^oV&]&NڬVd<ήUQdU֞j̘ck0[%>o'5ѭ/Wf+SSNߢ.%ա(yF#JI/-50(u4,{gɕ6Kq֜QPS虹^ee^73Ƣu"fMúq1d~.T9jKֲvZ'FUdVSj֌Owoa2i#-ݳX%pӑ,00(F_ xnN<|>`#ByɵbT֣ۤZֲ)[ ^LDȞo/VXKjuX-MYzNfDQdiCU: E:M$F*)]Cʗg4sUS)M^(໴BrHA)Q*E9JIUOOOW|>T5q3UEϕcW<ƧSz-+{ce79)ۋK#~ĈG|MkݢyNe-AjICLWzQ~ndE@_ӟ\{ҋכ[*噫[K{gOM{uo \>)kjEiɅw$x6WuVB'w QEnB9oA ,54j%k7n7&E&J5&LJɬ=: +NQ ]U><$T:ƫ y˟[ ߫F:=Nt*$H۴z76حh[$Nx,xmPMe+ |#Vɮ" ڌ3m^)Zs5Cfڋ;GW&)-Vې_d}g] Y 3ek}SiGaKjܜ]T#-qqqsy8Bc&6-6GtF'kYXA-h[Ŭq]Ks48c%ږgGza~osw J}uC#a>pk5}:>[#~p!{~`0ϊ K 2$4~&T*$2CReMhOtpk a IŨ]:4449x=MWG:zF̠5B1QCRq eg7[fb`b+Br܇mMW:hH!=nBh !l2D5'/N(1h㕥AV="aP\f@y:vEr)h Yq"%zMUū+"O}oSt#DxAG)0Ǧ@D؃dx˭ ağW{ox>p ,z!OG~" $槙_QoFLsTek 4ӈ+a3f60H@9%WZfi~~j>(l=kg٭?|0$Q|"v4ǤCv6V>/z8!S.o( 9+D꽛}. A-냙^pK6^t׭";a^݊$Md!1x7΋f:jzST+1ʜjd2Ĕ6Fɜc߅ 0Dypnh @DqNnWz L.E'Xm '@sf ̶U/mN@GBd~R۪%6m΢28h/H9.uM Q=&g*X;ygzej`v頒0K-zFќP'Sj 3 (k+)5c `قq0m8`RMk87>Koln <;O''`.^|ohJTlxIFՁ_a8Ed:Q {'_ZSEM6&y9̓\اoQH@Wt0[sGjM +jJhef*^s6avUKq´Ud&PbuxzLj4ݤ=\wkodjNeNMIIph0+ 17Ifҽ^nԙVȬ_?[ ytJD卒(7}=eo韌e+E껷׉>z]}'9>:9 /;.hז`km3XJG-w+OӠ~]kUσ~ n¨v\Dxsg`} i؃oߴkʡp*lrL# 03f%73`B;-3g63}<}6aw_s?h=o4^_ŃFxTo#M;1#aյԊ胧M!4FdH7a1X)i & '#fY5o= zn(o64z|c1Vqځ +?l BHwGoܑwc5e `!#Btf7ӵJ/ӏOw?i; ۲I3E\,:LA_ʑUCq ~ڃf.q)!R?LkG^ S#h@lU֩TSQgdb܏~ƣb*sӨu$8FcXoFJ]6옥hk 6&Ñ&="y>ΗfdP#3Ush<Zu&~YD};?A'7X2F900&h~m 3]tW 1`ݱJo)R 39uḂT!JA4ΧZϞqO ݟCg?4RUSWGWb(c jҡA3g?)Tc0-i)؟PNB -oJzWtyFD.;1֏\D090R"tե[µQP!;it<3SC+`Q;aZEK'bEhc4  Hؙ{*z 6)gfLc^<K-=6wx5&LU9hQEӏsSa[!'J0ryOҰ)3cXx _2m?!䲸G&2F FiIXh1SX*B,3<6yΡ8Htp9wRX̙GqDN N"c) 䴚!yϳ9Mk5!*[r5J=uvJަcsVjja"kܗNkcX;5!~ !ޞo??1ن8.8C\f(*LqwaNvj\YYX$EQn7N5ۺe {4&%W{ʌK7I_>)ċSA6N;OcT 1$z7GHx~/a@3 vQDAD'eg*hxõIJIKh:Iҧ?lE'w3rq}!}N",&ukUR 1~l)ޜ'd}ORy>ײ7ġԍI>ilR7+’6aZ_ō\e,r0i}4#ԄiޔQ (儡iAJ@QO߮>'&kx0+b?ƹE|'pJE1: ]li1Yr\VꝒU ,3I_i\k;F$GucīV>7fq%hfoL0p xSWEQmqo_0&La$ioWYWm~iY lnL$ ޤ2 džd~SƐ{QT1cDgay`;m rf#W~{zMiqv;#aEEkl,~aُU oL\I@xlYTW1NwwǚtYPly#KV\~cE m:g {DAm !( <ju<|D˚W,<,xJ4v@nR̤ Ui#`}|D"Tq[(cM3;>g\z΅k~!~QkUo؂WCDBІ]H RHdr:  G\3zld9$+8 ތ:!e=fJڦMi9$/lf{ʗᦻGEvɒ]UGVYqw0&fC6r4 珧v LA? }e}~;쁠r?,~A7OM_1@8Ɇa{C13{2mvL"WnMMHE#f/a2 _J[TPׂ$AB>zO9讂me1⌬u,qme8SCIAUi+b1R2G%;!uLBHD 9v_Dq. cLBHFu%K;LH2aTǠm n`"<Jíc2[xPqЕ}ݱjbX|:]| :~ z/{ h.My ^~gEޣ'aF- Pt΀tA~w38+뺣Sj},ocsi@?t( 3%$_rkOn{9@&łq{"$KBtGɭLn<SFЌIbGӍSΞvz@*g4 g&*_j>IH¶b'V$1O ~xHPC1y39vfr) OϨ9DP:X e}eSf;R2xg/9Z!ؓO!1DK@; sV{ kQ;jen_X 2sq8  2Gwl96mXrǖJ#3aoXh#h:KUElæ*{=]ka+#]34 Ć-z m ( 3͘YZg9_Ū"]f&rṮO_ZÙX^A(m#$?tdlr HR ITMEi'"pfY<ؕ 9#JXTNu~n7c_RU%Q=" C\eSvcSJ <--լaB&#uE@؈"$D.<^h_^ڪ &q fG%5 -?Ji O7 ﷍}!vvH*ŊE549Th#[S?>_)%zji'1fDxEfwpgwwqwF fL&A {Ϡ23uFVH[ۼhK:awWT=͞ZWŵBFϔlfcP(}wC6U3n h- awEX+U|}>U(ЬTڰiřp_ 0Wyt,h=Bewi[ZxGɠm6w<]rsI\Mj"D$a /j9w&Ll BίZ* x{ L?l (Heo76SmRWGe\ hGc wi7ZෝM;?G˔* ]T:xǔ"FVU\ΛS$TDE֌Z!:ǧE>3jS4 ʖ2iSUd\β"+TxҙzgY$VQiZHUIJEޮrOWP*OIEL)5 iNj %QSV*_O12/4y6Xf+UWǹ'2OX,*MV*ֳ2*U7ENXv)́eDU;ِqUO:TEXs ЍjLj51N%XΌd'F@Jԓ D ޤSҗz3O"#k­MMdqMғӼɽiZUMBbr]ܨ E9j[-*|^ɼWk{B{Op2jUF/%Gjxɡ鹳>7ܹ韮X(;?MݶTRHC>G∐">GQTj{=2y 25zl=S%.KBxb?#U?CXsՆms`aC\*ڃ↽ޫ1$u_64deP6B0vH7tPoF4=zl km6 ڨwխ7(VQ| &RN`B?~*UN;nVZikm?7ߑmSߑzܾ>ϞUQK =}AG|*}mUY7:ۧ_Ӯ>k79q;pn`>J|tW%]qiC5+yfAaVt^£s{ޫE!e//ɁO?N!ý򺫕kN!XYVo.3ϙ1s6L6ͯWڹhRf֙B/\3⯅W jҳ=X8}qpXS\q|iPq =R:UW 6kQ[-b;1Y,%lJ׃~112kZ@CFRœEsQ ƴjC~w-;b8 .%tejkxwŝ|o+Gӗj_ڎo;ݍ0)[*K !fչyݩ nd*!MŔuH;YPI=t2l۱j,2N~~˯;)<6SQ<^2;%p U6FY:}?w')ںI'=Dp2`iV+A֎qy~yP:gm_w]#ׄN|*3(̓|f B 09ڶ/-pC.@Ҫaqz\Hh%åN'ԑ "!&$TJ9&Jo.Jq"js1.%,r]^R}ܕ ⥺n)?[6:eI$owv !!}p+e3iq50}>GM&zuG<ɪi_[V K]1,}|nOe[vЍPуFl]:_ssVad ѾYuFb['P`&N|#NuP:ZO%򃋨z}"ra,'+rzumOkW6/%ue+|JrwMDdx\vgkUiW: ݩF@m5gӽl\nspn8-^#qOciGPxN40'-Ȣ٢MKO\jEAԹn>2D%\Oq^!{&ֆ09zSaʹlZM:89Y z/1@5O&JKp"fQqbͻqbj'dX'%^™V>|Zq"Y.u-$c'-2Pzee,޴ݥI|C6erG,FvrtmQ׍nj^GsַaG(&'F?Čd/9ed_֡sH٩^ ?DF$`M݄D`KZ*%Vvm9+F/_Uա4GB mY;-EZ,tx^7Y闡Re7PDY! h9qHjRLѱmSZ_&cE6b6̩t͞N=jIE֪W R+F7 ؝^ 3k3͓ZC^5l e9Kmwi(۩8Rt<,uVO\F)I0'QyuP?9JS"cKQ BaV$F4XBkQ֪㻗R=k( z_O1n"UY9v> Za܇5Tc1Es70LptŦCHp!E0(Lb`XbZH:v1n2~WI+VxNZ& Xl5^e.MEDLcoQEX6HZŽÎaH_5 N[i$eF)QS8F~XѮDh>o{M&u`x[A U-Ma+dBԃ#CIfk? BkJ9W7dWZ+JUr4Ep|6"ȅ0zwaO ƿ52(FByhLrjA%|#k]a;$kfJJQM10p5OvB,۬MYh~#MU`|{?Xa<57u+Kwݿ~S*6GL/q!!a֪?wĉE 'c!(z" []T,osxQQWBB[7ycEe 8%Y(tjkgݓFvF3#²:*8DxY _'eQkPd\0dw6g/jM(UE+Bi?(*HbX=s# Q/9Z{sXm%=(ReU* Of.VXi<'V]z}7{V&;8ݣy5qnV #ˣތ}A( 5<"2<ֻg\`;'$٦$C2Ԭ5f%o'JqR[279F`=olfJ=\ Y,-3fl}ruY-qM~_J>cDKg+.FrPkU[mKfMv]DEx)9qcO|A O83ͲՃ9BRa1e8ʋ.r@Dj@'++Nn^bh`얭QL^.#Nq%~ЎT&Vø H3gVc)sFMnd񤦃gt[ri7֖-7κ;wVukn0{JBa}9Qwτ>1Dj%9ZfUH_pwsmn8@!|RwH^`U0Rx.ɕvg3rmD}}>: cpL}l~NoxCQH,8 IbmQEVR7,tCTtFIMDb9CFd4hunQ'}/~Z۽fl9,S5Spr0(ʑ'aPs+pyKվ%s#y!%8涙W{-kՄ< 7't2ߡ^9$5RLT)S^vUIi?v;zQaBJ<'pyKB:limG;_o^Nj?m;I|uPlNf9=K_i*T@F_FL{[aZ T | l]knuq\enX,n,oϓR_mf捳1<}AlJ HKQ"@mtTQa[ >4%MTU.ɲ[gEɦС!QP9GEfsYKg!W~[ dء=BFeJf0vaU+V̏N Spd|~i0Ӝ j=‡>1E'hH G <MA0"G,9Ʉ\ؖ^_(~Qʭpʧivty$hezd55AZe [M&0X\Mt/䞎~q1; XO(}?eQV=p~w|z/ f棤?b]~nV`E&yqv& gpdeK3W*Ҽ$:\<[.wV^3f7oZuUdJw"?ݻ:WP tx\OWd)Ne(ZV2XL8EK}4BЎ oި)&~#] h7$M 汐ưʝ0M:9e{1%KÞݤ 7*(K8֩Pwy+&z YWvrZvL`6Fa&[G(j̱0y+^]?~Y#G8>BUcणr;\*͘ˆMth+zaվg:ڲ&΂7lq!# P`y^ dD>xpϚv'z[ޜYm7t^uY&(Yni,"q`k.0JNC=^A$W8`dp;1r9Ñ,2`Zlm2wMY7 [ +8lVs;a} k7πt>Zլ֘m@h[mvQMnBV0ƊV5zz@GP+'(*^~V7&;%*2RʼnӦ}[qEwO[)=G:W]ux< "5yҹ~†r;WF4mut0F {Iޏ GORו*" 찪PZ"L=ʈ=E W пqyGLdҧԂ*쏅eu}&[=&?J-~NoɛԵlT{j?B\wz>')˔%+_?b}]s7uSM+o0h!W6q945 .aղ&>Ye2>)R*u8| A>_j֪A$˗ct @\ҫ v+ER`8oD~߿?G5drR/_KlT(e]s b]|HF8Ecsn ȯhWeg/CHVQf sRA1_F1oSb|OW#uF)'T2:Ev}pr><`йBc{+fy\͆*!\[I3(&69!Ŕߌup)hB ,T%KjC~>K/J>;!35PO&`~rf{g3>9K#L2m9<1@N8NWwX(P]Z6<rjfEL isTFm9WN/;a8zG+8۰$\@&@|¤v}ǺƳz7'؎RVa``&:Su9;U.LiNB =龸(F|cp3i'%I %8g{s^;I) R,L=kjaj.(Ph:s5n} Ϯ1KGلK]#pַ/%fok_\ Bn& 9ziIT|A &$Ы"JݗBPSph>S A ɷWc(xBpdk))ū~UL8b31z5i|>]")vzYϢ+ Rz˦4JqL>y;iǕ}Ȝ?Z0V!Nt­[Y] ;2fq$[Uz V*t{\0fk>>CQ!>v#5޻>&"/mlIlShk2̚Vd)'D"$6UXS X(Goz;Klnϯ텐 H$KFi-v~xU˷q9 A$UM#3T&I3꣱jr4y-ƅ0Tn7T7 ݿOi}[[@UދiCǾ/5ν#"Vׂ *3š؅85j!]a8(+{o/;+>3Zl(ms,ݬ0Um*lhc|h-6ɦ}2ij/ߏ7 kSE4ca3yYT |Uɯ+$[Xg`h:`Am Gv@"e >y;TJ iq豛CSN,BeW8%0CcxN+^@P1Vj]o ̬5'lpݶu&DgU*-]S3%Mxx6xs +)&d*uy)F-ȶ2ެ"\!Zౡ7-ՔJ,TO؇6$URxzB \ tD9HI|^'/SC*F]WSsRu#il#e(fW"1i;:}akXW3j9SS zKMNm|#ioqU+z%p9K)Bdnrg k6s.s9Q^Q>:-4"X/C%FPjHÏsbꨆf+ch}|N'z)2>Ih#_l^uV(2憌˨&c3F4Ͱ|#W,sG MM'ɶh¡v7(黠,4E yg{UT#"ayvFkHgg,X(VuBz< ~k4CEDarq梅&֒KfnL34ր7@2E hTvQ5@nQa33x6ȣ6 D?*44sүrd#5((R ƈB&7Utj2@kO2Mև HFjɳi+`𺠪Zz'6 ys p/9־k7Q!:fs/c<\s:P 0:'r!m\GYLKau%*sk ThͰ5dZxg7Ŷ1TDξ}W $ ~S&>o/:]ث+<" ,AEidgOsk2fԸw%#Hz^,W˿ɥG;*& 8=7vNq?Yhg帣J~뤶'mDŽ|J lΡD760FUclΦwA.i,iAw*_ߢ$k{]u'+ at'!asї*Jh잾a1r?7n/ZD}gڧT,k4$|+%_LBTZJ+^zî'"wDWFPT<9M{&c1kl}~)̐-!#ȱWi.%%A3R}ҚxJg {]On}T2hfHUgfUH:Fo0~H_'pz{"<!\7}xMaa~#!6Uݣ%txև Դp}2Jrȋo ʐ7_ZgGL-9K;siAquQQ3wEjx-v葋up;do\Wg~tȜ;)K%#5j{=11{I:I`hhʏگ6^jl &d nڌ& ~Fk~,~߿D^sl)"&^)LѢ͙{M5}]q*eJax@J"^):|R4| 1:"( (R)KE!oѦH䨨*p VlBQXtܳaV̧קHn,|j|P҅óOiX<^ }4i6C[_k5SU@NGd߳Q>zWJ Si=$#ّus9!'eߪNΞJwS,8Η1eS \ x qS/{sޫ:h)gV-ٴ^BqIԻ:B/->YWc;VO]}y\妕j&Z)U)2JM5i3OԷ;TT1<ӌ[;[&646^ݐѱ?#VjY_|J>8Z m)Ś,qǺ7hmɬ)צDB 0S%gQ6@ě>agxvCu+%3m|3SD9@w\X4 ٜ&D~gO i\ѷ}?C3,|#z["bvm ǒw^' y!tX7E F@Dr$6h1!#@؊cxF)Le| MOy}h8ro1ݓE^[7*Ƹu;_&HM܁{ļYcr![JV9Q~ D vK\`?8QQ5hs!t*"d{Wmmw2N;(P̸'ڞ^Xpбu~i% ֔\׵o>:P8Bo9ڟyYؙgzTa=gGJ"aތ?Λ^_[ݳ!c?k[C xeT22D(M:Hg!sG&(mqW~e?2">/CewJ!b14X!|B TP{ /}G/qbMK+{%{Ɍ.32 渷l*vH^{'M[]R>u^ۯ+4SmP_μ-5[e eAPH ZD=ܮFG@qP4(,AT$%7Vx}\T,,^NZGE6+/\j[&' AwL/m"h*+h 3{H=EڭD$N8Fs1kp휨J~"y8 (2Y97+oD=LUBJ5m,3WUbn}r߹LQ>Hr(@Zx$0ۊir!_ս>~9;5K"`PW6Mp'iT0tR-wlxɣm!yYNG7sG?F8ޮ= 9;(Ξf.qTopj yq_N@=qj<ІN8q 5PjN4Ln6mU* #"9k88JiF'a0`HkmǗ7]Wω 1o7n]gW.BeZP?P,$g .AmX+8XzVXF~1ԩevN$2Yi rfA o,qF[mRgƐ5"ܷ=DGaH[kRW~MR 3OuhɖS"#3. ۚQ )ˆx 0QI܎MyP>dLk:? vˆH E&$Hgʤm%|\;×ն frzdX#T"DIY{lWc}I a(4{ىsBKۘ+h9I>3n P KHrA7e kH&YZiG?D{' 33'`0|Jnc2 5Frk PKЏM^0CR!3t~V.#r\#xo0r--U8G6Qyswً a#lmX`jgdn(@$m,, @Ȇ*h3XZYxAvdJܸ"+ '!IK^@h/H-TbS%k> +N/!UlF/MhIϳ!NA-虫8c(4D: 4![ar q;ߌXxB5cV\. $]i"{A]F$ &bpBM-#Bw֚Eb MZD(c)hN$IU4(JxzyUSk,Ky) ~8g:9 s]eG;s =0l>^FΏ?1p7nk<4d; ^ظ$yփ+ltWŃ2sFs=)\vqQ[|\c}~j7䃍oHr}UHjE%o8N:JN1_0モuSNzQ͗,؛m~¢Ao)`` ݪ &>{O-q{ll\L!ՅzU,fd!Kr*Ud ð__u.JX13P&cսAi$F5 g|v|0YnhA6h, =h=䖓JEA%8u?!2:u,i>D5x6o@+mfmR̈a4ֳ|F804Hb]ՍEFە}dly>{`F`3O35q2cGo>:viLJ}pMr 7Y^?53SV3X&l5n{(P2 8hHGBL6MqX4nvp 'LVώ}`: ud ~bI_^E\}j3e*v}]_֬jӅC1 {)V,&FjC.Np%ֱJd]$Vee[ՋHULc3ob~& S\ڠ?EA"qU Zjh}ٔ?n/Wܷ쏿ab=O<~Q-=n"r>CKrU붑fجk Y'hw3nY3"C ^sO 8Yh\:Ξ?(ҴBׂiQ?M:t_9V {wTWd <1UTE\,xۿ#5 ^TD3f/]Urz97'|O2֊y=y: fM4֔Mc#i'J^H^Ҕ+^H yk Qȏ ŢFC  K&.#5W;eaqK+/[[ʕ5X0IQd–f5jVsy]A5bfs. ̤t.1l/%5E,}xHqzU Y/xCw{tфlF e6j#BKPT_#q+(1?Rk"0Ή q7hCZ)6Ij1Cj  Ij5Q$ǃl7#3׬1uj;}h,'623g W9&?LHpS%&\+ty\ET+b09h /[z̟3 rDjb;Y9myҤ`qaN,s[rzBa~熈 ¡TL=K8 N}oV^n9 r6iѩW㏬ 0w 1߂A.H18N@gF9۝4f+EDK,3T*-( :!d)HT$kB;Ge_gNNҼ7%M%KO1U㏵aܰblU<7-ziW̓/c=/huHboۭ +_dbgtBy&3[91LAMQܺNΚ{&QC͡|uqLS`;.ʍv-8{Z:k+!(D#dӄlZZ];n l)NpPH+q))o5ϭ}<}vIr-^Iwc&lj幮GN1h.}?&muFEGECc[Y - ccbկ:y $~q-TT6&#a_G&s^Cgnh<杻٢ZMtO [U-8,e)B forr-!LzeG:nIT\_" 7cZnҚ+6HU>KRl5{l$7e<'#.PQ3.tM0^S>Sg{332DJ2yZ66)CT%6uN2IwQx8)#d\^|?&x5G6D HՋ8}{<;N3| uCPv'B*C4*[vrғxoߴX8PN@FcX̯s=`B)^|͑^wP …Yp_&(}3TK֎;׌9YO~ԻzvUݏƍ\.1ruhEӶ⟞ |UFJ7x5[R\s94ssA~yמ86ox9V wq3UtIův1y1X#$ߗ㿍wFFnoOyq^Df9 nyZ+ˬ} P3}yVɕژi4px ^m2AUk.‚:$'1+zN)|Z}x~'TU#jw&MrКk}{G钯^Ng4ss{38\l#={wwĕ1ɗi8dK D¤y7{Ƙ隡Kha:~;k&|^8:wYk6=},!ZSG>t}p=(ƅ~{#>mqK g ;m yXYbYUIjaώ_D|,?mQzA\:Q1숃6v}lOSz6WYGO3s:dpq^G䭿2Nmt-Y>+Ɩ<-Iq`ѧuj`\l>yvu_N|rޏe(l}k[,KP:= lyn>9^d<3)f>6LdB_IUƆ+&8Q[`>v!l>< y|۰/C壥ψëZ3_f->eA [Avrm~]XV6:ftUѰGFd{]|8skL(&Nm2'&_JzvO4F0E#g<+,lnGG`#m_\Zc>Sf\\8jČDjA!)CAQ48~vPD*P)TnMoò_"<2F>ŷ?|z;i.7gT kƼޮ~ZN ]~n7s P=~̤!wE&5t|){Hq67ֶfeK܊ѪT$ 0LѲ&u[[c秿L;+ <҆qy9eP`CǸ~ݿsJ{({~G2Y5Q-GtNO~cʋ~T뜄Sr>bt7˧^Tzz\}ӓ}YDqw~rk"χ ZFmjj%zѾh}i<aމ4Կp8]q ˡݰ,TEYg<,T-JéEU?mhEa cBxIˮCrTO]P Jw$8j, ea\Nr ]ʕCYևgbdoŔQ0l^ T߱^4t2Ʃb, Ѥ,<T a-+ ^g OQ}%`6qҁJa 0,:EWag=іMflL`dN7I[|_Q?ws ŒF?ut&t? AǶ*V?2Xl80Y|+=nIdQS}|`~GiMH*G>(RUUyT]=e@ejƛ&i7sdT*b -ȑ+|'B_2}}K89ר*)ʐhJإcQ"Y C򜸌XkِAq.!d\74>+j1b6^){xT "Y7ߺO0- NC3KpC6/ܫހEd쓳AIBsl]NrIU+ 1v } nr;!fi$tP|ب2,&/f7@n0!I:2 |c[*[sX*k/)bDRƷ9|\i?Ќk= m~C_kQ=N[RC|jF L"5lT*ҽU_CH51hYyjkWҢ1dH?窩;ڵ%X19 +3z&|ovNZfa/348.`4Evq9@_: apj "]D*1̺៉ßuZqSbqH3j)N::>샭>>m7΂>z[\s:Oڱ2;!eՁN\|O* 3-p:fu{m;2]D# s뽱T mQ雜rX Q {])mW.T3TTR) \MpN1ST#Ebx"Sw]}ؗȟ1C_-`ىR:>ah.U6sRU17:OHQ4|g8o+rj".ϟv|.Owm,IBV3 CQmO+^JpbWo P%?"E:q./Whi"G痢0@1#6 >b""E@Sц<_ kP:]M4l{mw;]xHOenpL\%l}(OCen4Q.|+~&AJ3f4WiǺ3jnjCICLߏզ{HCVqHknjR{k]$3Ӝ̔ dQ/*v^SUb}WmKVxq>JZozeB]ᢽ烅΄4!N\SEVY?4o}+v7c;KLзUI⴨R\wgѮȜS6SFP};!˵/^9! -LIFxO¬geJ*ݝjbzMd޼ogZxU$!wTi+wdPYÎ>|]kj$*R4R#eto5q樈*\ySF GCeG˟jgܿD{Cɐy1GsD˹Wxcop %XnhP{}\HVDv^&ݡl`E} V=TuCo2 u-鮯9Ha_Xnh0{5U<a7?tf"ETCaΊq)"Oz5U{u?| ޖʹ/++kbjkt-q.fb~esrs7E~ 5Nm⤁Kx Z]D.G3 :c~C>/ Q=Z8F*]1 7mZ((m+\wj=C{1"85ɈMn|vz T pҚ:N)S4p4|;8'X(Ӟ=|Myi:GCIc:N8 N.7ޗF*P^翇oi&:sE!OXJI$tۅ3KN+F`V5y$oj4︅j;ŔlzuK:6YԅL^Qɿj1 >cOoμĔ)fqQCR E)JD}4VJ4Ql4&2bmhTV&bkMIЂl&͍oc}LKQJgD5~_(}MnbFLCwz,,4(GGNS|,z|>Lʏ.zI7G18w[mXUOԩ?. g4;{~t% $Y-:,:Јֱ37,4HD'Q/GmzBUf,?k!0!3mmv32ѶDlj?u?.+""dX)l~ٍ 0چ7П4BA듦^y ,SJB3PĔ ?'|Nߐzיe\w2+!f3w?I?ß=ݗѫ~hy?+~:s[KA䆜DjΝZ^(YAa+~L#߇g;yzG|On-&'%`Q$?:V Bg:m4m3;b=ݦwzxY8ھ&:PL3E7ύ0=[//~DI-*E63&w]xUK#"3V@AX7=*  ?s?nsczJ,wQBD+SpϾ;;*HfV9ٓl]a@c`9oN|ZFJd\d@C = o @U /\=-&ӈLvzY 0U'ݼXddd@]T0nr %S@i^jJ4Bc"6 '̈h*G"îNJŠ':1@Q UDr" B{ä 7_UUq@gfaU^h`D1`DDA.91$ǢG70(%GDB0Kۡ ڛx뜠lB&kI6#Ē!1D&1j)NF&ȟlȨρ)UI:ܼ (o@Ãe.Eʛ3"${%omN19BDȆ(B I H $BA"((E)a!(Hf d%JhiVyBP23@9"J Y"abϙ:hǖj".䁸u`f*! k REHA4%ubLf h`0 D0f#v9. , %dHn a[ߺ 59\!/ͣ|Ɂ^9}͌%-U*Td<̲u7Ew4 `ȑdždߌf/1/6 ̷ϸB?ƾ? {-# g|:`3Q7TC14p0? r?TuٽnhLV&4R^nۭDDDy&"h +%i"A#_u06C1N֢JGV>u禀BI)YE 't$?{ +Pwt]A׈4K^&4/יR|x%o OlzL-݉!  ,v?Y!I45ҐkA@m܏]c fLovm88%>p[Sў;~VD>}L6\~d8Ln^HW&3XfF͠WPlc>WNNJuP j O1pz &Ol DZJ,Zl`;݃mDXNv!}DsqsUw^O.v`n4?\ Xgqګؐs 86 zCbHJ_fsŪ6(9?(Vl󕴓Y2(4=pO0g/)!@9~pѾ/Ym}D(k-w~Cs{|R|J R Q sg?L ~E hڷ7/[ Ҡ55c=fVkP|/h:FZd7<*fޭ,ttDfQwa3DL8\0,ΏRO)6Y X UMRHԈ # ٌpWFҺC'9(*(q/Pq6Õf $1}Pl~{^x=@G,-p74@o\ȧ?1]a?v fΏ`:,Dn/!z9E,HL6۳|^S]Ͳs.$ bSrYx>$5EiR("{f!=72]~EnGcV["xq?_+!S3Q&܆#?G`YAݭG)(8hUD4|v,Q* =ӿɁBp A4ޤѳ=$ޏ=DCN>!9uDLaXُ/(aSAvK/:QoQ㆙eՆi9ٙ2Bd!)ǤϬar,C3 ޠ}AQP4Z^% f "k:2FÖw.#=ؔIO{@!LC:M \${7j) kI{^ ~): !gp^!<'W10. i&726rh[߸1hGR3~Ԫզ2EEsAahy꤮8wYM^WFɸ M'CӈxX⯌Paхh"@n`2DIY~<bH:yQ؄f(Ô ѳr'Po$Jb`*KU]\byU r;&iju`N̑d݇$kC|oj0PN;d$I!LFFdV~*Z0F$.A* ;, wϭlxYZ:&$ڰuhAM5>H)|{CHTEoU<7h`GlynaD(-"rGs zZ#0~RyIrA&s$#ɸ|k3S0eSI9~:+r~dňq܀u̿ `gFj 4>NvQ2K;覃d.oeQxKކ5v1D":!I9n=! $+4 B JݑŅ"_RaE6zx3O1dLCU4Uo}4sHZ ip $aGſ%x:*~ Pc&~9Ly ;c "I"bd~o݁N2$1&o*G+v.=#FVx .^c;gkffaUUqY dJ#8 Y>B楌k+&0{^"`ZKL&c@:kM& ׭[рF&i:gB=|1qf7:jDd> 3};śɼwU?9*)9cQ ?_B3mpW\J!iqim5?5{1|ehUZFІHD<sϺo ; 1[:]y5-Ms!r:")bx[uׅw3WNKfZgѾsf⁹j_O a\B4oѼe:XR Qjjs&GαaED?"y#.P2Q(VgHɣH>;|q%||x4%0Fet  W\fvvYSbNTǴ`G9to hLOCyw3Uc{55[ٶ;`B(:4e(ژ*L_K44"G1#<]8o5:z^ P4vj})S҇7oKeSJ?I S?f,pg`*;{,a|e\{5Ѥ!+^GJ<;#Wwyrjf,驪&7i5iU;8=~3u `{oe$0biG'44 H ]@=T 61#(s]ߝwּ|tCDi dr;ߞp>PʧՎ&ufWaʯOm3&Ko6tvQP}d5~_&,>W{ThB^_7Au|(9^+4zz^_Oڮo5mj^M2ʏn0oѽInޗqMsQnriE|,sO./\JgaS20rΥ2:mW< p\e4A(?-m]&! d{s ֽ~K٫4*.[~:vkFntIrKQ7|c~}9޿AmŸqM| ,ѫ6#+;D(hM./{>adagq$?zu1:ʏ^_YwywOq`$wp]~0RZ(ݰ5l؂ d"nK:5o~gdFHBLZ{+/(3U%?O.D~eV\-?٣j t2maYQiaG< `nXEf<ݻ{H$|A{=mݲ?|2 gd_ ~kXv<9XUJBYQ@"ssaa+;nt7fX4Ϣtmw^N5`郳|.Į0M$P6)6*~ɕqXE I9i ec]~Q){ʌ%kÁZoPz 97At$zOrxiY|`Yqw0 eL;h;sIWma_=/fݗv)r6ofFcqCSńP:.a#Y鞻}6t}+仯Uf!ٞ}[ggiolv{fECqȲ#R072/7`h˫݋mj2F-~0!GNeU(6m̪:Vg۶6bILK`R,~-zmvM)3ݮCeՆ {=P PۻtH]unB}9guLlnwe#P𜻣F-rcle+ˀר~'ֻ~!&;"š1fI"-0*0w2m1o *A_ׄ$Ze+-Xy;>\}OY9HqN1w:7G͟}q2nU>n^MSWsRaߕ1n vI'Wy)d,d):Y=Pzy7E}o# ew7NZty4ly4t@{ieSnߗ[`pJ*!҈ 9g; k4t.w*-ϴȟA]ɑ18@ D谪  Jr6 cmlnQsfYH5#{h=ջv\&"ئ.ݐ<,0'V!WΗ&nrŸ]hC:cda؋s4`j@^0k?}«VtO/Mm!BPѾ9^J9VU4vc,5EvĀBFP?Ioٓ;ףl*眚C+ҍrC]"먾cv~+rVvYg*ZϧG]뉙ᤓtG"[9InQA7/njq $etϐE3*_!/-CU7!/M]e"~2i|ߊu?9ba&ȢG6W5AZ!0Y>2ʕOEE!g5#g_hl,ީ

kutieyF[_UWz}G*qMՋiy&uD0B!FB7уoʚ:x `T؝D4MY8nfymNwuX9΋kUX{{;9ڎϦlzr1|UN;ߋܜ^z.VˢLlU_I~k{Fy~]MNaZpﳉrWs8-i6atx'9͝ 7j]>Mn :YXϔ$Y?QcgWLa MEWVNPYAz2Q9wDQ-v-U1jHhO y( AuΉDMhY(͔Ezi>݆6 N(OjpK<8kF{(TS|o &Q945uA}-*(tPaD_],1N|oV[L$k4^كJ5ʶ1W3+m6aPwHr P82%Yځ_R PAb{;ɜi3!ZO)aY)cSoUmg:*eXfDg"\)|:Y@zrhVD"Ĥ}&s|v6t~_LϾy&+48^N ŪO^TX@SzE*IzIYWGqCMW3o!I[-jD 9H??"F|MEĊmfo[8 z'mr+,Hu(@7φz!~Y3&N찌+ĔJn xڈ98~? zePF9OBzK55=Ȗ=Ъ+1} |^j#ۻWYÅyB? h{wl 8kݧ1? eoI)Ժ*unt-R r]eb3 nכ O7Lms{yN!9#s#)ƎSX8Ht9-cuM Nk%5T=1{Mʋ2t%O,:(Rٔ{i؝6LF4DE{n5TV֡j%{U>&{*Q}r6kn뭓"u*S_ RUv6Hh #i{FF%vf-]tH-mRLQ>2}mP|%eL ʝCZYm +/$+;e%j\\<lli.f>$܁: ]Un)uoe<UeTxzef# jJ8Dd&&]Qp~ݼt|%d$[]3/(;$)o1G@XkٴyOAsUR!PIR6FDiYYC-]nukdȞW&w qE4ig 9ݥ{5C?+&A" w6Lqu&C F*ԀGINc6]mj!ԟN & V[ fp, 8wKK-Lt UAUthJApf,(6S"jgcyй/qM\Dm*2R3c+]4Zc'M+.m!mbƮEKuZUa]GGdGm%sc)*8ݢ?>6ALs'jeZ⟱N87DeL҈IKNtBrϒ9wBm^JΓas%t +_fbFbs*6Y?,aaxV!P/+3M~weL@  PE 2~d2IBWǿG*74?Fontw! 鰎*hk4)h-u{ >i8w/kK wez{u!47ҏ.b Ŗ2}ẳCEyy6&O߻_^ÛB( B&3Κ%!a%4bլʒ0 ȟdJ#Q4QAMo @$5FýFkN$N0K4@dɬ`Q̗)C5Sa&C2fbљ@3@@c\Ut85fd D)QXELdeo2dsa'5 bJETD 8f ;jNq3;3d2i8BfrTL6aCMRoF |0]`cc"C)"#@&l|V! 1c,,Fqy3 N9#8ӣNbj2ԤŦca2t5|f( "*̢ эtTZAiN y$lŧy+t⣶AICJ4H#O$Bl!_`8PXWH pH|}'-hJ$d**"9R'r&P @P }ˆI2P<% _" s'0!1 @% AEUK-4S C QSLQ HR4PRMU)E5@ 2 O92( *ZDF*P7*( @5Ed+lB> $B(X"n8p{_4D4vV458s'(G30 Ĥ h טaZ??#J7%EHxLNC t@9]\J91Qq_1VV4C E ң??̀p4HREbƐ>ݥFփHy|& Bd(_s@Ы3rL%0)of ԧr O< r}ɇJ :cc3O6ւch(}dgE7̿ ϩ vFƺ̘fXhx[jBb!gV>GK_2K|!ɶ[ܺp0XVZj(+*7?"DڅAFjˆ N"۶Adgxnye \s93YLxв. ׻W_$Km"("IwӀ7AP@fA{W]0[`Z>.؃ Cr|FLpC# !ßTrH"P% Bz8B% DaFG20#'1(A("r(O9"q(BDJ0` BP& (JDrAr% B r(Js9 B%u9 JD(N!8B!8a=~)9+x9k*Z<\]ȔGkjt6!RI) /IKyCcD5/}H$3mO+6[;O'y\X.g"B]`\F"굻f ዆؉cs0u׶ݍNd+M]G;_UaRmȷL,>睡DPD`gؘC9=M)2< cpɉ/kဲ5>::w :܉Ju+CrE.wc!#jQ]?9P\+?3pt@d&Ajm0:afڄέmN6U|Kgd @OzbZrO s-.$NzK3YjYH!R%A|$k6vVvk$Y/ FFǙ'l %37AoW[@GrAN4iϝhפ촁B-S,NBD艦mվmbkX5bW^;۲Tg Wη b1"'CI7Z|P[I4ȑSU`Z>a鮧9_/r͂c_cZ_4:9] Dusq{+6%U|lWǺaq%#ѐ0ed^j_,UHHOK٧:y 5 BȏEԊy"SVz:Q_7ҹU];*Dܓ%l`*u70 l 0jL>KsMݧ41ǁYvv \v-Ŭf53oHf( cl3yp{rJL JVdws@MEV%ҡv=}m6de5{3DtsJ\ϋJ&OfޟCʶ/I2\ `3>}m߾ϔ/5)f k^x&HHֳXЙSo6nf'IlIzPW30)RA9q~:N|.i6e_d,r]3cYGOV|Xymj;ū`x]Z ?lA6JTJ?xe~i<6|c3v3a: Ms1~}35[^XW1>/|U|mvc{ 7#@mڭthEwɟ޶'NaUq߉+NyyJGA9s\BOa\tE,Șmey=9MXTDF]t,tΓr/LM*P\Q'yrٍǮ&73ĪDPn늛UL`Frnbk]p2Rh7ua"Oʥvu7<45U8]6Gу3Xj!F;MXm[sFn6~ z49YI`&]ڸ=:/Řxմߟ.l9Y=:11)*ا!a`Mzuo=] ݮ;#]M,VGeG( _fG.ӱ N+u mSBF@|5HqV**TkgG;D}1h G}i }\}F bIoJb̒l} iA?7. C9GDR#EhQOx_-܄B/>qJgIӿf^$ =횭ۥu3л}־zSTu%) 001U8Ph2j n202 X#v ˜h4X̧cۨ0XSZko%rɾdv"Q9&a4B )PAAa&c9IY84<8Pc)Qc``^qLqUFxˍZ4Lt4¨j6↡(£pZ8t`*"o_ScMBz^hYlm| 1NU npHR*sb:TP=r7~i!O>ǫalÏ\ w0Fȥ7.1N0gª|?I9񣽪Ws1 -cgWu#Z߽~R6u;=vFSq#*74xI@H"ỎQ[KHWƒEwFPhюP#ջT8u<]3:Ǐɧ JOtiۦS! 5{6tQs3b:OM?r$/wDV==LR]U.E(}8B*]{a+'^l54歖]vj+yOܙS㍹J^¦a/2kr}3`Ue_yE q]ue\cgQ:c|;mA\{gn$k>YY WrM&PJQuywJcǟm]st^ګ,=wD|/SZ^E[1[8T˲n8_V!0^T]f742dLP#͛>O}K+)f;t2c2]UZ<;9<~n" I"mh;m3p.R0g&W_b"Sz{ g3:YY9Q|kN>O[9$2"y*(EK-x\>CVhC_Yuż"el*&k}R!qsW>{z8T(q_揅?(8۪]WTU`nTu=W+װ%S*m 065JeJ"D^qh~͎o 2Ljx9?Uo.5U>yj訪8.l:vW_vWl0前Ҩec=mkrR-@T8W>9tubn wG>QmDM2% 3ݺXuL,Ap%_L_wF~!ixq죙r.I^$Qø3 0Ǽp̓ yᢛ"pӖ%/kN`^Ϟ91.p"X b_>d~j`JdD7>dGЪ(&1$82?FӤ#Zmbbael6ѭ&6Q`轃YIхc;,EZF5L=D iV&"M;#n`ONٱ%t,өu˜uiCSNKnfy6Bf hbil,ZW ]!lִ,Ѵ؆3yG#PE1fVJFr\$,hjНiC ipXFp@֓!N<aF4Ag(mYh4 @A"[f6YٴC V8/ X읹r9wq݀IiphD5#c()-2fM Z$ 5QmoQ'53l!ž QFk%3&63Jkƣr&72XIɲP }؍,V& ѠXF4$e&!ф;aζ00cBW Dvx+1Cq\SEvNAY+ E]y#hwߌN& iy; Vj*+iͲK*t8!8+wMVk4?Vϡt8XH< djWd&,+atGGnѷI$CU|Z!AGE @r!Eiyu&lVZ~0BYQDVv /ncG7xfILMcmX4 SsE 9^Kk; c :u Z4pvg 6zdpfdQD)&?I0R\ph;?A"w_ Ӆ6j!t EXt JQq@*4rZǂ9,kj[˪%Sd$"Xlס مeK{]Cg'Gpȋ$JxZs!ַ@ 7*0{7oֽnM՞#ONM_IMІzHfH )X 0!ݯj{.Ca@ Ns#` -;ɦ-Iםf6f.z [i)]<~@OosŪ ]8 X#GvL\g2d25AAaB3A8-q*AAƒ0!biۮ ^ɿvvc  ! &pAqǠZh(O|z)!tu!n }@>c|`y@>k}/[ l!/p8<==Z9z4DQ "䙍'aKwgd{ݟvzx{D@JDa$ 5i#ǽrȟ}HwS|Gui>u<*?F 6D43TRJдcL9?5æG:Ι#a-F7K/[ҮCR6܂h -X &" O4*ŦR0͈CC+ 8֙5&;N 2H4;-(6 C3-UmUdT٩Y(HG5e4M?gl,Qc%n%!1yڍnnxFvPjT?_/|x36j0fP`$EFibq]U/0.?ώ}ۨT.Qeܨw^ײU.8ӼX8>_: ?.{.K>k3ˠ XjL+y=@õ$]=v4Iexj{Mn=2T_r)dMy+VF|II>Foդ?=}L3 Ӝ@uw "'EPrcoC]שAMÆǶ99kLr7TG:qqPu@8fMv+2vNWXx x?t@!$Jm, m(4m:@^ ?aX]q-b5E|hKBqCn AS@EaƖ=[C[X^gϣIs$d% Msۡ'@Z 2G6?1Q!b`  8jt:;N9R|㿧A?F. ie;d ޢܷŮ )1Σ=hjyZX| P0P,#șSu٫} 2dMaob$}Z qaT'oO7/բkr]ͤ xٹ?7]%  KsEJ-9?.O:0O0(_ ՗8.=Ls3y0|T E1|DȣP`DU>hѿk+;{;3|Y-R̜fȏy4Bʢwyha<8| yx,}{z;<<;}'q$M?=<T~?nMu j]J$:vܐPuPϿp>2ɏ#''f`KBp<\ i%ΒE`yE#đyE ة*@37d郄L~+Ò!Lffj!t-J+Jf;mFܽݱݎ8$4v0tEGDnͳ-UO0FXܕǭjw0maJ7%fD4-Ax:h?16:jD]\IID@ m7}ޓ\?*iڿ͑ml!=.l:/%D$6|NSPs|Q!=;w}ǗQg6U7a6QP*|D4Gv:u@afE0PTQDCTL|AȒA0$ʄ #x9Q  KP P@BLPDl30|[ys.["JңzF'6f=i&_1;?Xp~уژ:^̐#{ $>cPk? _QqC\T0t H2h5Y3?6=LF#VweA2*w&uoď)WZu4V ۾V֩3o{2zڭZ|xzQtMBF-X|QA7JRTBn]fM3e)osGUGgPُP&{Nn߈^Bo5Mbfs)˨8x2E:Qqu+fWJ/Ѕ5xh+Z aBSzPkeH2R27LkJ¨kr:wg1vy@gN1͋ 1amjOHࠠCcecH65ZldmOǔ"*i' d`^r&GlsJɒ8`N73 ֐M[+d]A`zy$PB_8yl)#Q첯lh!MgL2fV i@G2Hys%*+tDJ'WLR jrҗ*_,Iy ŴqQw;ijQSs)Ke8:.riȘ̍dVB|65DMdn>ZCmECDS*j7М sIS ,KtքNojRɍۯ\DpsWc'E13P\m0_`ZÇy2~{XH \g{ @@oaO3iKT!.D%A9 H2 p₃?܃S2;wjIR,,,`ލȠOO$ 9cdI^ (ˆ Z+!7  `َmd#  ogi{{L\^CO<zct 4shkѼ0jmm`kmٳLPPД3YePpr@N8fjY8!l؍]`kclp SZ{ncqU[zbPNkȔ*CP@q~*061õEIۣXLg?tgNԁa3ALCv^"܄o35)ҶxX gt(X!< 1J٭PfAK8AAT`RD%v~{E4AJ@(E8PSgcөO L圚цh|^[&sjZ#5%| u4њF4uO`q TpvpL 5!HP=~H/O_i93D(֫~x&q0Dp< `ނtu۠-UP&<|MTPPhcV+((M6PuĔbfR&ws<2),#JIŖ8;E&'"fII !xeCg#|BGk;w;I4oQS8BPW^>Mj8BEYv0oUw3uM@RcdU#KYt_oZu]<J+VSļV4Db4  Z)G4RPt ")hbh $-bh&oοO;rcH5JH7AT&b(x71CL}G "ZtWna!3xqcDjȪoއG oh|!|=/X"=(,3Qwr M S2h1$WfLA+zuKWjYWWb{m~컽+F$5|ܼ ew:UO."9eXNLKq+"1sNZӽD[㪷}eĺTuo =mZw7#Fx| 24oTDb4VO iʼo&(H+hX&pp44ĨS։w:꺗U2JLVv~K@0TZ5КY(~uQqxG$P"͑;ۋO qٶtmSھb"fNI KM$Xo88(mD/2ܛ%6Y ؘ' al$3fÓ2K #L٬0m0I 3$B&om[afn 5zSP) [^\pfY1 Tag[ކ5 daܳ(0[o\'ϮzC#OA|F`5cI,t{O/ʍR@rKoZmozaDh>2IgV@Ry՜ {,,^Ky5\%ݢLSg$l;X @oD]Dg\׿}nF{̿x$P'+{"Ri_PqgR&,"<` &Ĉ_#Suy8]ʵSE9Z14)aC3 rm<^ X Hz9-{ʏi״[4Y4Tg9S=Y1l۪F4Q/))#Ro\'']]vuPknSRe8"0((b!@ gs4=F%cf2Ow6#"mNy{#Bwe(A!%B-6 j2P9jez&0~ 8r !-k?3&384Dfz{sKM* q@STSrPwsGU4/Kq^=Ӄ{ԇp\Om\}֑}[$w,ZO%ZTm֮"(wwƲB'zنO*JOSIb*)Fژ"6bW!KmwȽn[VcٸNQs }+s(j7JQϷ~"q'wSwQO&ܧsIY'Қu #R\?Q1nd޴LR `Q6m.88䚩%ö,\Ke94DLJ*xO7.֧8>a6UjJf+n_N$=7JrNUYQQ"-6D1ECQpgx`L6LECN-(4CЈ@MG _bk梣yiE(POu}_q*w7TjIŌ9={ m> %2O&9F0vM[-۝4#21wC`.LbJ؆s0 Sn(̦1JcB 59=)#AQ@T 8ejj1r '` cjl5C ~oU$EV+R,W\c;Y0sćh61LzK 2(ğ$\ Åpv>u8QKO+kdd#| 9F]?O@#qOm뗯wn%{Wxuק3ZǥKyO }DwܓCtFjB&r,qINo C!$JI :trKץbGPb1:t$tq/^iRYTN>e8zW;Eۘ*Ju zd]);ɑZQ[خȇ^#fd5DHuOo*|}D*Ӿn4|Qx3&T-MJr6oZ{Tp)pNe>cԤiSFKya% t훷֢p3aLF %$'r iL4e:75z.n)Rԍ^C/jmcN]eΦ3EjmnwO S&do"kQ5 8#z\l&j" gxz Ų;Bo7Ǧ: lcQ5aci5oAL,1Y 74r6) f4mriʖa<3Tlٽ q3z!SYr)Fh0 f €-0j;,uNrgl16Q~u>ťOFCjJ (=㦨 ̐7Q!p3N^'>~\_F-w,&kdOP kvu%Tc7n91RSvbH+T@ONvY8ɤK>Of4| #1f| T0ɂOcIxF8.=:\t,X~W>bC#d]3Isgħ_X921A$A{¦BI] xe͞Xɭk1&-~u˼8XqgI#˧G>ѭvmMF65k8r[TƔoZˁuU\=ۥnk)TLB~jwW*tTCĽE;\b/۪w$J&xqO733n؟sOJlHsUs&Yb1EջNTZƥv:yFr6)fJqฌkt?HpUj7nz s`)5Ym-]2:ʕ:~"^Vk[+yJ)V]l~/{Vzg&rwQ6j'Eľju1!qKptܡM`9ʸKNJS6511S''>~v;>=q"㼨9=BO} $ , cퟰ&Dz*Ae_Ari^Bf>X䷣20~htlj6ޚCB5e6FFaG 1[q#`KjG8-4Ala QP[; $0Q@2BEQ-8uvf 541$#lb `fѹkc{fYlO0!HSdHf՛ZX-}KGCN1`C=2ӫuO_YVI(q)ʒ2" LT뭞5\!ƪI:Ë2BO[Md"7&Io2Ps^o_׿'3Pxx4#N.;h! "IT&b4rS07>;Ŕ~E{%ʵtӹ {<'[%.ЄʢJt6CgD3`@"B@p(,Y@Xӿ <|n3ip#qsc%-7M$pb.ҵ1N DH10+[t`àbE޳e}t]CY/:rlAE9*-Ȓv '!2I|9/ky +*T[D&D8ER2Ji,p2s NBzd!16K}}gc{owlcpw`;v5țHdH"qIHLL܀03]]=KL:RwNB^iJxIŕ^C}ƴ^RZsP)O.QFy>ʘg%Ԏc-85&sNf<ӉB2\iҭj%93!QnϻƗ)Vc]k+OqxDSIhno/jNC$_ƕ+X/J1xDqOXFKKzRs'rSss4${lriXM2DK- 2{s11|fV}q/(};^Kӭ}eUBێ8 xjO 2$pRRjRdT\ tD|ioHdmANJ9/ƝYjNl/Q/|wޝC+~XLp<FB$&P}Z Yxs4&"[N{~GNJ_j`GyQ X6ibp$E4&)Qt1=j3RѶf ~\ѣ @s pg+\h$m``K37S4M C Bi-Va&}Fky94 jfC3aUBm3=#&}f8VM  :xx$]r3mv&! Qi[+ÒNvEߒ-j;8LI- G79{ݐ yx+v'Y٫mlj(c~M K>AU^T}qԒ+5Zi4-"dI) h^N+ˉޟ2HJ$%UN浺3‰\\UK2EtIX zy}mf>Fk:50ʟq5/ywxV(۽\u[u i,zB$&!Ni2̐8svi*3xd6pj'vrjdSXP+ɫѼjblS6"Vj nil\-( 'WMfG:3Yz֫fH o9Fd&}S 1nefU9kefb =l07Ӊ3$Os1"'Aѣd $ ,ӮkG M l ֵh,wb`r6G97 xf{i f!4r,6!] cpf%Mal A Ŗk7gd*bXs 6`8tƋ(@Vٴ1 6@XԍśѬk˜ِAcۆhXYn $䁶ͳCiCpc;A%{>>lw1 1LesSKJȩ8D/&Y-\fӷKu< wFQ-";s[fu]TI44 T Y9lyjpCF2ٔoC@F{ Rub%HAItDxhN#iAB󪦂$u')A5DQi;6eC1kǬIa#d(hvT]p*(b3'g''~j%ER?{I~4<$t̨}L|Rk64, Dƃ?.FбtXP` Cfh\7p.]!I%$=Mj;{L 0%q#E)ܱ"]c>eΊaTPp *Щ2B=($AC杼L rTX5p16u3+krB a 0<|hc͚;s;( fD sl?r?tD3;7恷ݧT&YV. th ̄%`H=_,q_W't뇳ޑ4i a?r\<&h^Z>N[:TBD0 .i6ہ6nB7d2VTܘcڦj/ui5I/}ŗq/]#a,$csUҖc> ޞ}0<ڹv$)B_t7\:V.wNp]7@BFbt{g >h.$ݶ($BUђa>c"Sd|;۟M$r(pͿMMZJ>|GqJ9|w=X^k1NABMr`hv$v.̿VHb X# wjDPQ7Zh }#(oEtqc~$$`rf_gP =];{ֲSvZ{OJfY~И(;gt^i"3vN/c& m<~k(wjݲ {t4{G٠ =k wۿ$3$0vA$1#U~D2Ò񅺼_9yi\#fL9OS_᧢hɵAcBbkx/|mem6&36]; C7t!ڞȐ؃Z v oMIW`mһQ{$C@yJ|IԻ!▇zi~y&4QhRu*_R"Ϳ.A*O7[sNeUUd8nwp_|tO\Ifb**~_<=>ĆO!o~b PT]]> hq0\>MRQ$o%l -BÑ-3_ӭ+o^,QqX5H6}^}ĮpiOkL)qɻ*(=ƔDtho'9*=j [56hzV0YOC̵7oEc=:Cd+㞕H۾ȀGv!+r=/bIT Z<6ySkn'\w3*m[!W~=ռJKڹׄWXTfyza.}F-Dc66Uϕڡ_MaA1 @mfcu3"3*:R} {$%:;<Ї)#"ᆫk%2.M-_Ndl)k9(U^Q 6@;^7gamI?=&q ɚYpO~]ϪI-'D,ĵĺ]ᎌ1)mԧ,f5Ii6e֏7tV~ؗJб~h6Sn5nHDĎR.0Ƒ YMXUS_ev}o3N3%d.pSU?-xG^Dc0CnƫD]8EH_lƕ &8%^r㲺Vnn{!F,pFKΊCq4G9a'T4Ly;o8WF^csx cԴY绔xբꞷxÆetdنc ˢКDV=0o mj_A6M|-" 9ۨfE4ACa q[Wd` Nګq/DmۛI٬p3Ϳ g|B3n2VeE4zfTUR۩V:okQe_/g†1o&-O׺ umͻ&#f3=j3KΊlJnW_e/$j,M"u`N'(IwT Ƭƛ}?ڡ!lml>YyQ0ѧ,G4 ܹC63?Ȑ C$n*A]ߛkGn&;=GT`9s9lEcqΘ֘ 3Nȏ8tFæc3L]ᲶC`k&^jX ܉x5Ƀ[t>l4 &YZSy韨s[ptZe-e)-(dWF\;hlwJjp҃R<2*{Ii)׺(Sֹ];<-EEC JkGkipYl]W qd7B}Cx'aU}ioТͩߘEi oR+Xvydž8})^iZ[:t3=Ccsŭ jFo(\b,p!(U=l O!Ƹ#{K|2VDžCF,x'Y "&:$7ٲ 9=W%MOU}wnlz]V 9j>ז΄ƻcw[D%:Re_(WmӜ+ה7Bz%1[7oY\f頀cAkm ݫ1r!DywҎ.UV~IΡfaY[>!<67N3XHF8%K [dJ+r+"4奟MYț J] M c7q5ߒydȳiM>@j%&9Te1EEh׃;"R]{2' p{6=}Z&A&RՉ"0λ޺x~G6 I6 hwvAHu-*/ țbY3/cRB>F[{ZUZgNLp[0$WE\5ja 6f8hB='r k$h\xwC|H@}QI{<=ꫪ,QB.P@Q@1IǮ.ۭ.ꦟGj-&}h,Z$%64.0DPg =tIE9J^NEQNMVOBx]xنyguc&F{8R&7'ݢrwP_eC^3h)*UO7TU9N_cdi-0xϳ.w8|/Q8a}<*yj>2۰ъ`FTIynRkwV[pUN#uAv̶"zM"YdNOjZlgU(u\z띐%::{nop h47#WFLwʼU8Y6vҧnzHW$˒3AeQnAf]._MmTő1EWЇzy:)PCŻ$Zbvßm'F-8PuiȲD%u|淪{4YM.%ؘQ\ՎZh5k`}[mP4(("x~,ߣLX܆ LN̺VjOϨ;' ]፽;2Gӿ1/'ͪႯb=Zɧk*n; 밐 {!vѢ7AeǍ`HLf&4zBx`%~>j[nz|!o4*UNz yka(Q>-xŢ""E$A ITDTADD"P))$43&t/kmÇ*ta%^nٌzBuW:X'ph{S^`d*4@4D@ !Ff9@b%C_ˬ8\ (U?N7D_G ٧X9ݰdAB p_ <*$9>DٌXSIw؏  lD$D#˜pF@ b0LI7GpQh! 5,wqôR(P%LMaxbaA`ق~s eF0F>1"1TB)P6EU)HCeUVX0`aZ4 ( &$ cmXES1#JUcmj4c"c#‰)"(j`R?UH4W)5:mFغᐸP$M /:_R ,$,.swC=Z4 >`_CmMJc2EO?5bBAA?ӞO~4rWN͸o8f0UTH@X(PVRb :ONk'sӧ%]O2xq$gkZ{_NYM8vm~ `G}лeHP*ҋt}R 䯒,m㏖ u΍ zD8 2TQ(N;P~h1f8%eւ0vomlo ^|YP)E]"c~>ˆ@H?FA0AXE/??NoITjO~y'{|0tK6^W~ڼ29:#G㇙QCˡʳ1Fk$aJa F*vga;c& WjHͥW}$4Y9h I7zw )|u؎ߣ9mDna >%쯼 xzgRz?;_?JKy'L u+P IB@4@XPl=g=:WZ e Nd2=Q;7IYJ.C(pxROQ˕I~A>G2Jg" H*o~452C8n l|xs|ބ }9)&v*'krT*(tǕ 'p~EWWZ\ ɖ($Pu+Qъp 1*C@NP&*#54 Q{0r`Qf*?O<LaZY'`Or*D{MkCQчNI7eDU|(AljK&dabOAG(D=OQD!h )=^ω=8[@6|ħ;T3Y΀`z8͠Ou{9\U8# 0̐1{ѡ>ka uɞU;̇0.^ @$ $FηEމ*}9@SiL_p~KFș<|G{v*\Ϯ )O[Xc&%1.0>ރnP#QI:=}=y >p1xlьh L%LIw@dA=jK}^0|H(Hv0uB;!" q>/Ua #'9+ ɼ )!ڀgI>h8_!l[]ͮq{$=?@ /O @?>v r?.?}!?ՃꅅlFQjOb`001OC=⦅? `lȫ }Y>HVE >|^MjVa9>Q EiM4QAF*ց 8\r#X#|(L>;䐅 Vc4$~څ᎖\gm&F6asI1V鉈Ir wP x8E= NaqH$9о>Լ!pC"}V`K[6B@|b])/ѩw'a[7`h5ePl^/X~,36i>D`B>BtCOm I|=Ȟ_g\ #v=6p`b DL aMC!ܛ|B;L Nܿ͏/zʃ00LwSHLwK|'J !g3j0ip,o͕o D(y{GIV=.q:#]4RM2=Nz4>؛s5>\xfB1Dοɀw1zopp,|I`ǐ.nNh$nK??߰4|lGR?Jj%?70C01/`1:O\:vB@hfnPmOD:P/GI{L PMGQ7ؐ?z癝(>·no!޺#s|fjCF +F@x%اf^α$i"ҒG=<7 f f$R>ց%@yZQ ;ԔCys!f?ͼ~BpCT`F!̠g_vc?okٸm c%}NCTώ$polǾHxwvwN:DB8הBqV] m%g K~!K씰nsk:E%% H<{tpFK> n\TXa7&Dk!u iF yW(:8t>!@| <ΞC!ΧThPGƤßzH856 j = ;Kx(K6G&cpՑNG$8*L2}<(2 .HJS`L!-JyPO! <S_$7R_7zt$6`( g)9}(6AU#W{Ul6^4o,H;%R8DN ]Aw7'#H"!b+VQD U^OZ}:E${D|y14x^*#aR8 LtJ Ev*@K0M֟>=:P0!uBt.Ӵ9G@a S p?H/'<>=(Q "fqWB^J+A٭2Sb? m aB{X0 0QS(=5l$x X @8W{Ot'GX#yWi&`M*[ǰ4dP* \i#A`Z=%#n&ןʇz OODuX~6 ?_Oڟ-2L~/V8Ak "8t@?ܴ)$˘-dR AڕA: %QQa"ɀ{h Bi;ކ^BOB2m| xtsoID (@ͯE ٸΉ8;4 5C2!=@Ώ䤡مr0ʌ c\'냶AI@[0N`b 9N?t\<0=LD$?F=ӿ~§現!TɨxP ;+@=GOY6tC*22l `nM&$M$w$͙sM?pPd~54z$ S#HNxz 2Bh&dN+ ЏaH @DHMH#6( I5/$m2MEixgkhb8 {҆|"Ӱ UץJ%~8$yC5G ^][h ] hL;x #":{`u}pA)$0xHya4 Nܧ\D buHr9) HVRAj bP4!r@}Aj&)?v`VY+&T PdOK wfbR!1!&n@87TP-~OCpd|D1x~_35 pN~_ѯNA9uvb7& )ŢieqW*DӒ" b$lnfcfHZ'i'O'?(}F]uyيh>O17 >OI]Lg2X?yl-G7\fgLBah7ICIç$4Dqv?@V쒎$9/`~@<{Р Vz\= 8#Jr DeRnAN-;_8P`U_V==y6  cjgJ 2W6vvМo؁8;s o7s9mٱoB04"쟟5Z ~{(y/G Ly|!w"ı4v0Xp9LGDw@S`o{s|8B$. }ٝEWá<L4k,ZoDDDADDISU _3;I OI)j2(`P%B2PfJ#.XFćC!)a'-l/Ӗr`y@<i>6 D1 `qgPQw>^{x' #EuW>.9,.n{!xchIUHÆA̞Ra3T`*'1r#"vP.wHqRr`;CbPl|z3}9 #aPfuT*")@D'F{/I1z{ >4JKebd;atN'S/#zbNʉ>qpjEQE (F^4i CA9qXx8=av X,s0*TTsP < yNQ#,04QWk P҇ӆx; ?1sˮI6 94H&ȨEFI, If02!iD`kFUPWlN*C}o[w9UҞ;K⡩ b B)|؎6SoP38(⌽[]0Gsju=9a2 zy r t+ϙAzù? hP|s'(L[Q0 "!P$S#f4,`a CXN8bJNxgN=$IGh T=HZPʋSp~ys$B''8q_ r9C:0JmY* Dԛ,:;XD7†%_?^( RzaG:٠tB؉ASO~.M1 NG!URG @ 18t/ht 7 ͡pLۭRE yQ|#!0$bt|ڃ1OCfJ*'HA6M2udд:_Co`o6#4,M1(xyhGEmGb0b2U{\mʙ@8_X66L^G3I@8a|(S;A=ρIIP}}H\{7{#[ w27l nԝq9`SQ `<7-Sb8U y1vzsm9As /2t p aWޒ"Y$Hㆈ 1 q# # # %f*&uJ:hJ lb l@$LQh:KJ3*UX;$ >֦6Ӂz}L?8vl#e>EH C- g8 X{x> krj@c!.}C&H0H](GyQT WX0و˯Y.f#  09H:%"b]!kXa8aͽQL("G APZLhИ:P=%^zǖ|jyH83pȏ3\R sП<fj9ߣُW9&=b($0 3uZu HΓL:1-*5trY@Y2Jšɑldgaf\|zqJ$kά+sR؎U!ҥA`ur߀ܳ$~@!0N (dS3aZ!3AAh!h06!`z`ֻCjZ5Ҽ`!iJRoJÝC(8`b}#pߚPz=f6`(w>EN~@v=*px9PPT1 ܧۀTw4!GlW`t(t| 2f(ט0" Lgz{A`# C@G@I4{!h` ։(T@_$`5D>QO-=P'k8>S C|0y41A/Tl#]b Rб`r417E08Hˆev1:GB./+R1S|D/,D!5j(>dwlwghnR6i#pSycT}]y$xӓ7اy:i{4H-x6!csNbN7a!uu tAٱOΔjT&@;q5чyg7p*Yq5|ºg߽?p܄<詍`7U =o~=Gq Мt%f%'}Ox:ؘ~Hv3s8x@mWD[9g"C?kBG0;i]@$z^>ִ K%b$+&Y(f(/Lw9r$C h8ÕTdL~%{Ahp%B1?MNN.Qbr:NxADDmF`N''7Nt&8'yH=%iav~1"dJ>yh%8JM4C[eUdf6g>aokVv^=y98"$cțrTIc]wmӓAIi`e,% g&Hj22F:3! )䦁Nǭ?hC0j !PA?(/'zyFw1ٽT<*n1`({y M<|͡IQН'B&!PxDlȜ^G< !4|9=dśOQFhsdi]^>_ɠ﩮И42O0;f 'C[${+>=nםvkPi9I#BQM4/P*@ճpqrlQFH9Ik?/ 杁uٚgG<C {9[;g TF'ףm

u1~,)Pl%2!CWjdݿ? :@eXO|%kY ݜH?ƚcW`/NĽl 0GA9JaahH{K*3?Q@4 F!R@jd&w~5$sU2b~פ ::ϬҧW~WOk[]8tY(/K(oԧAtaЃ~Cl^OI$7gxewO2TIqs;4W(,=`ao9v m@ϐ]˜T"D4UZG%+woO׊xq`Cu|;t`c3 x@\:P (R'$I!L*s_ROnΰS#W!(iC!$H5T_#,OBzz S/r [#YW8oyUw@4.r i՚598Ϧ\1&z~90ci?K*xfM|fǿD&${lƣwƸT{ 0kb{I֠\BH顠{qѬl8?IX`g9ys p5j:[b &v(hi j&#xyU.}њ_rx$+͔Ɓ@j+쩄:浘%+žE(RAǕ4LP:gj8kmƓr] K}@Id5|s5ҌD%M,ʣ `[C;]OnC{lygNfnjY ^OKʗ:R |qU7rp>=Yc$D "Tpxuτ| 9R,W5jn`o%HPh6=zgޠڎ. N7ǁS 5_mK }aaGHI}XOo>e7ָ(@e 龽tm4:JozK~m|t?.MRXn0|\M8!ƼWYKyA1",+ UӚ|X`ermnUOu+ϦQ*ݺcj!M 7$'K^c[L߁VWJ?|N`+U%- ~(dffXK.kQl?rl/e[~SdA0A'``}]qPf~x:83U*Fjvq?DŽMSwn |#D;5.bus˔IS "ͤ+ij- +E;U#QV9T>X8l @p$Gp:DpTIK= f םQ:'wTE7) N4S'ByrY" (b B#sQ;(:&X'd8" u!6([/T:`"* N;ޏ/~ Eճ`Ɔfm%w5 @ܽ  ռjba<%=9eAa9K!#"Ndd|  v% nݹ1@z;]»׹7\UW0'CLd'$N3^ YXGa&ȴmxbJ/;]WOT.>m~`6x;ĸ:zo;cߞXNyjwSTپL{Qgs^*{9f;vG,+ Piߑ"G- |}CՍ)N[d+v#2 5 55cmyy-i>mO);;d|6(ȑ|~9G'qddShx#`;m7B(By"nO-vXs T;NdaAg0 -»,=v Ay=p9*{ovb| 4C|edʩEwq"uXj)Kz\ NW:Hgwl|)2EL8]śvrݍɲÞ=`@Av}w F8~Os >#3ptSgm54d́r΁@m.D_+MDwc?9)ԬPW$!4匔3+|LJ#ht @uurNo(=:ֻKb8[*øC>M&c'A6Àw>'`搓;$'W4 L$ܙcEMb paTb4$ Boǯ{8\pC;7< dԝBx )Є Nx NXO]riwv >/Vh%+gA4A63]6 kITtu$z3=4ivb2pЦvfѽk6m6k-jtMBU,x KD;׷Y2ٿN[y'G'ؿGTvsnFc!|O9wY!Bu t| ُ mҒ Å_20Љd9Ħ"ʫWʷ1ZXAiCRlxbĆ4 )1./Bf7[d)12)h:g4HobB )dkdr梚 -϶֤"*#),1ҨYN668;a VӠap{9f` }B/ tFBPO$"S PkaFwi(i0d.![I$JM7{-aZ̆az Hn`Y(66Jͨ&cWyRGQ6>(@u>/S2 1 [ãӅFnm/e4Wz#|(;f 8>i:;t8D.7_N//W֑3bBmpDg$4Ģ3EeI|R+b{1vаL~ohlkIOg;w/$ LBG0ߐe4Dwr2Mk?vd[\>Ašdj=M57 M$PC.V=́@D6zfPd-BiA$ @dBd ;'u @)1LJCGDpk* O2 O:tC~8  ضh9F3yxcpk*cUtkD kAqJ W-}D5LVBs{N9ɑ$~ 6b B*s2Btd_uɻGy,5IæT?7VMAk-r%!p}00s i+031h$ &r #$a&($C5Z/˚rL 50T35눕;;'Ef#WՂ\_:ja~N-%(@@&jTr?d Zu"0(J!!0Yf:5FXk(lp|A4b\U'` ER<$_Rgp*dPFs\~O>4ծ01(Bhm B}h8#amX*ى:`~oH,?itue R Fw 9ō3d ې{` D1t%1Hi*֟w<\=:|sWsw7cqrOQ@fIH)A`9L$H 13e=@h_NGXz-lO24rrEAC_6~Cl e=md\+%i6A5u8RLiOMh6(yPv/"|=pYV&l(I2\բ {Z^uU[6>ډ3=%pC3M96 o 7+yd<4mY2Q+MQ.jjJ5if1cA-ۼ{ &uDBCn7̚dm `m4l(TJ{(>hЇ݄&WHT$plI Tގ4DT ~CX 氼3 anh,h+f>/ m;WwPmˠ.P΄(3xLьUU@Qg w`:sBD<Xg]m?[J"H;+14** #5$%iD"VL-3c UG@% Kbֵ@X5mGC"4yk 144׮fh&G鴧_An,%@SnnNރ >>mf^W,c'j"RNK77v|i&OUMB#Wizc*\ط{ ;H6'`WȇyPDkJ"b`"b84U RDD̒fLfVfYbJEC AyܚCdR22Qq(Ua`DK e#0"Ҫ*"&yLJHT^Z<~AfYk^cM4~S2gQ =-^0:/T:$\Թ@, ᔵXFD Dnuj|$X1ΚTLdj@g /Yc^ DM,,a1dh" #7&}yt!.td1S0v C+*ScN^LI!T=& C^> t u @ } 78d 6 V5m_ }23@qG:6 YPL"v-OyՇqPX-]JEJJD:%0Yy3!Ԩ% S "D%ݡ**_b1HQPL)PsM`FH AT lCx>[=_Df&2 1h`tۘ$keiG!ݪb 郧?zo?ӰM.X_Q0_@Zt`uuk/|cݳ SEވDɥ)$Tf6aUώaGi?7Nt na*ߑ*ЋCєha[C Kftoy uE(̸Okq*UQiC$"@),"0!,=kY VHQ !Y XKaeD1RNvgM,5IQ!DŽt ;E6it@ ̄ߏ "X@GR`bYdfX59ffdTK%:I j3*8j>xE>vQIBzj!0)ir̻ 9XiFrsH MC$2l fg9C¤4#K4#" x&UDCmK BD .0:3"R ?kqԇon6-0uSP%̶hfOO fLT=O08cfj$eX HBA0H@o1G$:q eYI ,CPDDM'RĝMkn2iC@O9H=0)+ QT^,H $B\{=ǿMix1n]`"pqaTƋTC61˭:\&4BM 0CUޞ1T:uaBqrm`0E% Vs\F]uMZ3gdA»(ig4ݸXl @fX:%Uc!; ؅B'Ulp"`C 9P+(*K"b"덚6<VΆ:X98Nž0q;D4Hf́O#*wxp@''Fu'g#?{$ܒq%RUԯ" mfc\vM9bj!q+AzjPîA?1|DQ5ҸM>*S޹elbk#7OD#AkR6<XE G$YcTXM ^B}c6Cߒ;n#?Ɔ3Z p cH 'gSfv!Ш'r{{HV>|00? ="g1(LRo]Vh-( IhC(Ma1X~yD+2 KSJm#Sg.p 6'__T: Pı(Mpɥ2qN-XyѰW0f'hJ+ iXZ҉1 Gf:0TC9<)Lp7}؉ f6ty҄qo)q$aMc~HQpi3羡5,eɲ#ӗQ֪ vA)hCQ60ppގ0_Q b`D w;{E} ">?2O[< .RJbH~@aЉMa$r"h/ EZC[vQq#I5~F@÷o۳-C!`0X? p|P7&!J9$Ȧ SEӁ 8vS:PvlKIIӊ~B#qOFb}_ x; D<:4GmM&5-LP . Y{1Ȏ Q$Lr}YܐG]JA`a')|L xg>Cs6<耞D> &>$O1wMy}X0$bo H: :=!z:D}Xj@(@"&X"<i!|mwHf早Tvz./;#]C;Da:UY}z $65f-MwjQ[׈</_6sz"OVO^9A[uU8A}JR% 1RD')M$D D4 UTYE >C2 ,ŒKyևK^&4B Q=&C Aq88 NwKy9\H"8)6L+BO14@/ )$IkȀ A<@ӆzn l84(󀑄M@ Xz@&>qWG9xfbۉye$?;~>Iٓ,$zl9:%o pL0Ii!} 6'#s ,NgD3 h-\7oqv & 2mi^>td"yݘJ~Ǜ.KxVp?Q$0`H_y ц"&s}y)/ aw+0Wx77ԸqǏLRN;ضBZ]F]zMyV6Y =FOf Tn5EKHE1BBMA璺Op?)&H(D-en$uHk 5it>@ϑ4Lwyrk B),Y*|;PT14 =hY=zaL99(:L[``H ޾dLɘ S~Hd"A1p,@@ˬ$tc_ׯ#0pwP9$z> pQ#{ zH;$vGhAIGMرՂ 1B$)B(th R vhKa ¦j)$"Zx,y]X)R.9f LLbRk%y( , lpmpԴ#%lar%w)ab8dK,~isWUqD/h\`"ZZ߈I  :|R5'0Rw =8)(r  !{uboWq mewœHp; *{;aUb9p;S׌&(_ 񓄋|P)!=F0" D2B_48?c:KٙGư ~t3"!m,JͳfF  O\sQ!jS6ش})>kvhiᤡB)g4 ϪCvfֲ~i\M)" ,3CT%Gq7~Igh$5,}وGqǂ_3I@1k(b3FI]1+Mw<(R[.Qós E EאkVr:FF0d"rCB :;q ֆ<p Na&$A@T+B84V(XB h:֨Cwr@`yy)``s~G ư7¾lJB<ri $<Jh Xߺ uL("JXՄ% 4 i6 7Bǒ:1Ȣ)U.L))%@ 'QG} %'|*]q<䠡@nvnXq.4 =o^y 7Xz $ШH|CU6p4zЭR>_%%W1MP$ʕ!MON23S_@Ml,E)J\ -QRĆlBv3櫗vo-3Z@؋RK#8H6.B9&dxgm'((.g(?_ĂpxG]T fS,m& )c<4ڝ2Lے|oQ#GmEO%hH&߾qfþw֝ӭQM3a'=k:f@J - Gxд.ƚc9ِcKIiRxR/uz'.#;}3J\jb8PF^vB%2B0ԅhMA ^ffacH A%%4 vdFF3kFOl T'َCְ3݆NraXNL3k8F&Bp&C'bPm͑HIKHZK DK-Ve X,!vRV5BlQ ntvIڄ"Ti$N jmQocD7'|0/#u n!=hTo.XrR6 %pC6ZoqFUF>%bz!"DaqI5 dChf"FD0cb3"eԡ㻼19cn_\zWeXc@쯍+Se^vLiْ026"h*Oj$cKm /^'x؛FqNlM#[NeT,d՚$5J{+P!JژaK*gS2b^[tx OgazN$KuaZDۉVr֙W+hl5m&Cn6Eˍ1ڂ jafN7ՔU1l Lb+[8,T!Dh¤PŦ:,fz 5" V^(.oQδMi16'+JT<.*pkIw->S#&Ӵל4Gx)Ds"qYA ,np=AtQBG bDsA̚C^VF26e &a=Ž:Hd4s`:cAd]fq%fYlˣ%%N)\48..&kɵ"Lif/8[6qP rfZFd"<4\m\y ԝ8oiO>N9ڝa.烘܆ܶ?1linޤL"ݽXdxU%6`` һvF|C 5U8P1\CHYٗD1&t 6&4/(r3I(PTs:Ύr:oGU5WKj3K@)G*bkk[U":d'|s?L" ۡʖ%iڏH2ȗ%#Iى5څr(RdZS1rd(oTHiiM@Y 1C5K7/8&Ccuا*^+O7<ܗ bM]S";t`Dn Y; XOwtnM.AV[c5UbO6ijRhr|v^|(W;ðu3G9h78;)&x-4"a%O~o+ Ps&l?A"fff B\+c$FM򃟶;G`JD}BKb+Umb) @|;1~9c H=3e*%BŒ)5EIwwz}pvX\ܮr<mqo@8[uSfD.:1'0iP8qɔhhhYh )\f"%2b22_$$<%L`k"$!ǼٷZ(1y?fhXB`)U䜑 !!!D hH"$)B$30Ȑ2;#'y.>&K Br 5> RV^y8A` )I=U:CH.|'?J\:CqԉTAK)4HHVż2mpBBAaLg-}H7`} Z]µYJO~~ 5OTg5IAuEl` 0b S^Kۨⶖ< 3=p.r~xR Q\Qe A{> o ^l`R‹!;,X2'BC&I=*PlAa= &}:`^vZ#H1p23.N#jty6?*F4N9%Dzfkc7s2Ӧw;푛zkb#AӇ(,۸C;Cc+cm'(U (H?}aо:D`z4}$qTӚ5-6أA|6HS1E6DG,ofL]d}>ia@Yd^]ܤ+ު{~Ga7x`DC$ʓ ?51wލb,wTt'3ӝՕO%OO͘V1*ziHHV?*/Uv$(bI ( 5X%b43QCðp)`"t$L42DC(!|1XN$>C;"C# E+Vڽ2|G۷;YB?t'@IQi4,'qM+6 P{:@d|9='xLI"{F{ '#IAeS b"g6H\k=A]8`@p2؂$A3,]<x~ FFZPi Ey H%h) )S T@p rC"]+O?}_':/o_uW?_'_?wO_}W_AM??>`_?u/OJR `$J3ɀXRao1.|dO0%vbcG)O1k?7RC֣15zjdfD0I-qi,Co104O 0?6l@c-TbhKQhTe]'NVj Ŗp'%SG>*%)S4>f;:gku8O;}y_8::Ѓ=zO{ _* '%d̍iq9k@:3st.? z=eW[gA~P̅s@X;ϏU!oL98Dz"l:g @ϐWP4ۑ|s؎9>Vh%&LPVcTl5Jo9\:p7:|IrCdž*iUG*3ysxy0y>^YJ6ӮIW5txu\qJ"fIryNUNdhMJ AC:g~uKC[01-$WJJĵ^^ **͠iÄifsѬ 28 -@ME?xVybm: 9I)5`:h,\= T4#| =CߩRhQ ԍg].Qa$' az`w  c9ᜮn~7>h񭺟֮(s}uq;[%j>(p|nWWE7eo`|(7禐#g͖ o>H|G;Gf1`uno@v:')9bqACT,[Hׇ"xApt)S\7*i:{N |3<1'~#x㑵$b"Xc0N&(n0A 0]O!=vfYϊǯ\wvchσߚlO^S9={tqBC2ĤBhN`:{m#!D離1q,o<1>:Kއ1ׯflן rڈD2GgRy (8s؃ EΨ7Ʉr4dabg.QV ܣ< ;N\1!R=p2 L$q oO΢L͡0ݫUn Pć>c2D5^d38l,4RqdQ YQnyqs-צhmm# /H!nN s)' SQX BI0ޏ\?MͶtlj(Lvӈnz>(;Kor B{L΁/ <2u#GL604!re2 p7neqƍ:ܓwHG;(zackѮ'Ws(+A'%W0ODcy-\7Q{q5]V+lc¾v /e厽/S6pҘ6XSݹ|N1j4mhtUѣUK=+Աryum+ثjӿ pa$z%v(}pbK8vc\ 6 ):cvɫ`"cSvE;8:t? UF.[,87| yߨcfTCAMڏ?Ivo"}Tֽx֝.IC&]<{fzvw%2`8=D"|1Ww7ǫϗҮ9+Mϙ鍷5V9k%q;CHu@IBo=BnviOF7ȄBtld"{oq$+}sBY6M4 lf-!"8RP)5DL8JhW h7l([b6-(ggwnƂ^UcA* ZdhQ6nY[fw].g8/lTuq%^sۧV"BKWQ*4L Db1j^2fZrreJpS|2S;HZyۂN 'CTPnHt>TC0 YeH&ؘ4kf"Ԫnpr h&ks+-$"g~Sh?~ ;(ik^Ϝ?5^cM蜞.BMuTt"+,rA-E>Wk3gG\qӃauphwi>p1uѥJi-˝`ǽۗk034uɌ[jWsf:;,W3yeu L;h&x;9C: D 6wVFm(iC#os xR vn(q1(9zHIPfDkgbmT4qƙr)3ÖL]8U#}qxӶ<繙w39F7KV8ͯQG/quOcV(|-4ɘʞ }4`i~bɛ".b$8N.lkQK䔷G*kxWi&Ҝf,W7NͽHήCަ  $}"oڱw18tPM@&CC7Vdc_ݟOUrQyDJ@Q`L@H 9́aiױiQGLNf7 t盨D='Aպ׻u{KM1F ?dvv1e~|x~i߃Q'۴.@TN0Hቌi8+\ۈMzglF*!6YÎW8D8ơ{ u:L!2AQÓ'X%D!2e#j. 6!S]#\f*:w?o뇫E=qR?kE5؇% Z Qqk[I+C`A9 x\"((6a"vfCX=mYû8Yׄ2Aӡ$|A <>,Q,@R5p/= eElvZOptKGDՌ 66DIdt`9O? wWqí*Jz+ݮd`(āA'' _۽=oOa W]d'b<8Z~8?a)~Q31r):} Ƥ b "\: (SԁpK | rk슻oqijCM[zM&jԉaB)JG l":tӫX:U@o4eѠ; ąX c$)UB8`h`|l. 0kpfq쁡lڃ.Z:uR5>dX}oZGI+eưG^ fgoo5kU$yw9^AGKuρq(}:]ZXZa!3H s ਢzf5@SybeHbK+{;hsq\Cס4%,qpƌm p|y~۾a&a.Se+43i 'L? #pSȚp~؇\[{E OH.Dm'3zZ|ߓ6s" 6oz1CR2g<TH&eJ@`@$v OL,@EIy {Vs  \\I!2LNjkĩB!4 ;bME/ 9ӘD`XA1q4ٙ57vxd4ɻX38o*򱭊7% Fc6k. " sV[HQ젩nĜj& EdeY4yn ]= 'WS %Z hP] rPnEFf `cuAu(r&@ vo ?ڃL>Ҷ=0?]\ -Qbθ\#liV eAfP,p~✸e4c30Ӥ  @UP@[BL3]}hw_w>acttс~>a&hbpwAC%FC@G:Э4ȇKhH&ݡ}|\Gs/OH5 P:MV`l\oIFiRy@6}L 2#:7(IB.:|+Q2"L.] 9UHiڨs(۾Kޜ8czHQ4WQC:LqPrLYiXP ix΋@M7ݝJPsqtAE|R0t gv]O'H]jůIRڔ2?Y"zAT8tu7.O>z3*` kΤ<8Ջ@zluކU1kKH"4PFl+0c0r-6y7|ByJ)$"&@'1>262BvWI[:s=veE j&b\~p%B>tucgva[m&g9mع1P3ݿ^Â5!1t,@VuU< N<|_'Y( n!n7ǣWiByF6Oab+3@@8®8pq1\v*ѽl 3|p#y2]lɀp+5ΒP DڒaR@Yk24'b*$Fbdva\#խ-5zرc;՗o S3dji[FTVl~v ID(=j@T\PA7+#Sb#21 H `. ?G~ n}h}KAgl|i-Ѹus!ₑƭz*7 K%Ǐ |LmD{VdHFugO:691=n}Sԓ'zzKZZ9iz5ZҍO:k"pe~ŷW x=r04+s/.D w4y˼#mn g̕;O)5ӝ2w-q {B&E7o/;-g[ y07ixcۅ_F6j"kz*9/XxFG<.kקgA _G wܻb5c>u{8={E|3<\*( QYs>`LoÄj rUgRKtӭL7zkjUC 5\OFB]E sZ4nծ9k8M%2GacB\snj24ΙeB5Z'!;o$ xt+Q `y~+Z⚮\A*^C_`orDS* Jb iN|T>J>X>AUh2C'V0Q|d6!f"c# ӐQ\""B0ʪ HP C JP LȰʴ,$4$D R F1 l#ӇΘ\aŠ_>*T92!3L\3V[(a儠ӿ 1]=mc1c_>vOs $OYUp!^**$32+#o1$ ECZZF.gPПݜ^=rM䍉T ˨hiaB8vSF.Z*5 Z(7EV鸲WSD81g] lm=fV XeAu@QƓ&$.[d$p F^ 1R:W]: dMM$$=&a<f^'&te$FFVp(Ұܢ 1ó i&X8tbJ@J0 7%Q~) OA(NP;1r'dd0T:~_!p>r1vLډB8x']s P%2bW_lr~>p4e'IO}AY(is MHY97lᇨ疞'JGH2h|A Th)& {9vT|`4ty7gmDґ)1 H ~@`T?i7)@RKKBKt$zY - LYNA3[Pꀳi'ν=/!Ā0:Jխ2Ό"`yσK?uGid9mt?@s?r(:\d'[BC%DPM$fy{1ƌ\q@y(phx?`6os#BY0yc9Dr!O0~0|@v4썵"̭"e ?l|va[bz>А@kr3dVyyCW z'Sٸ~U $A@He"E@)H)$QaGf<\_X;n̪$u6nY˅˺-JL mwhwS:-d?P CgH.I[$( |I+s("pPu]5ɛedB!HP&. 3bWCq"rs0ȡ)xGͬ4bc!zc$^ `f1#"HMT,, a"k"Fk +&NClZlpJȌ}&14T.DHm w!KNIsġ8N'li bpk0  I# C]j*lm`e;GK &CX٘WYf9Sj 6eJBeUDf FReacaTD0h4.VBDI`dFdfBf2 HePJhDNj"jh"̋ H%?sqAJN=X( \0 )2dkHTEr!RC)AM畊,øF|u>.¨h.ԇA:{GmFEi0`8=NN1e: L9d(BcEc˝e˪id;6Ԓ.L$3i2DHNQ/I;tt AdXJ|SC(̛ 3i9p8$p3C=Pb""i= 4DAxF]< :Jʚ@GވH! ^OPîA (ٌO.t9C  z}"?XCe0q9.KRg͐hĺ.TDM G#T=/07#]Yϥ_[F>G+1.g)v}4 s[8ݸX3zsGt۳HBj>/#㑀K匆cjS&994kjO]oB@KNW Tt&y0ˣG `N|d#ټ/ߘ&H Gz'hNAҥ"d}"&wI~óPpȬÖ?zjw=#NgŴ3t Bjvfn#I6"lbY PQ`yHDE JFBy'BE% g 8D K;.L씰M.A?Cc 0I"G#^- u-~c-&.ûkA q#Iϝt@s,_7HͶYarQ|O`4f?8}E t^j^PA,05 ꡁ" ;GH'F8i'kф1'<6_FPG_qL$+ ިF`!TDt*r`W :adaTı#_vh7:bՏbL%0Y!rAL` B$r1 ?&Ph@(+ Sm "Q 0!* ^|zjM&B Dð 99Ѣ}V&PT{bm< qd(b2Zjnt35о9?:Z(ȁFnD6Kda1"#YӃ7l,BlxK0c$ҩ!`FQh #VTF pe.d8 Yo,Mxf5'L]6d!Nq`0ȴbkVKԅdȉL"cȚۘejG[ *LG g&i sRK- U*eݑБƓPDJFAh!h4[WvH- SJ@7Zt >;L&+nHB H0M6#\JiPcphO8Eˍ! C بWI:ͨ?.LEO9 Ƞ08 *pYUQfb ܆ -f{muEV#;RCwka:e-SL$Oǻ{XJ0# !7g+^@hxZQ A8H   6:4F@1?,] fTaGf_#܃*': vpڠi (y*т2Jp;>8kR"VT:/iV)(ÅEђ浚 GD9 KHDf4ODj Ab '$8qJn(2Z #էM81`{^D )ăjqHoˊĭ  t/IVfoJ^n'$@B$& (D$(B hb)hJ)ZHh( @) "hEbbDhZDb(( (ZDIHiG! J.4!T%-ICKH"D0 P)MDQ E !HLAH@PUQAڰVi(%ZJ h@")*hBH "ik,(H$(0<!4QI1Q2 Dkiux{28IgLcuS5!/0לC$01H@x-DIE KkFt/π\mC>&Y2fccVEQ#r&VBzɔ0p ?CdAj&"+ L5%d0n JU"B ܐ*TM Drruofh7BRRp覅8/cCWp>TZBfafYH>.ACACB= LHT,,D0DDE,A1LC%PKI)S$KB(1!I2Uf%+'t!;>Hǥ<@Эuy%"NP! =`  N{b>@k`N3>~AG(-I x|vB%JtfmMS6&DB{ ؆ ߄7|wX8ԫh_PFYւb3j9d(Hp=Ldns7?0qC#lF'|oOɉ>+q0eoXw2,ÈsId7ΊŵSӰ`ՕATb.\uRO9ہh,6CO0OF7Sz&yTRz6MpÇdfAϻQ坥v H}*>{תPlH]GP$R  rQP"XFlƊz)}RLO-Tc"H%,xE04#R̳fQQ #m@qbk  #b}lߊ'-Jx!{'AKwvbIנzB%}B܂aÙ3>L9HԔΛ#kGÌ30" 2yDNk95C-#" "48XX5h* ݐ(T41߀PB̹&@8jVL 2iGRDQM#0iń%#䀿)gzRj[ܾB?\w0Q 1!hQx]` y} 7/90_c}qjϚ*Sp؟GGG!׊F"mr:&ۘwXh5.S4z=87)*)Щ$' &=!FZê8A|kY& mv Cs6gE\]G#|8]sa]Ι]>&Д҃Djgl-ȞPԯu?c) %κ_!ہ; 3]=X.q0"c `$&LۑVC@e}{MP2uCt1VA@"#?KW4sv卹iK.XB7yHZ7!Ϝb͙/$Y$EDDAAK1"*14)1b\3a,Db?JYF1Blq5q aȫ?F #M62TQv΃T15c1IeK.0\hUM z$b(TQ6Zb4Ed1Գ}43@T0f&,YΝ,"XjqcyaaAE PD1A0BE0QE sXQJ:Jl j!fdPkI PQG;N2+;( J3"`䁽HY vUHcС!d$r0$B똑 F nƎ3+S5$E$AeNaYfQ6dKsesk{MBbE B",R.c2,i46jlw"`a!"*"K'"d/P w^J8\ #IVqtq(r(IcpciJpB'h`1$Z3!;zt pPF4!H&M*8bTjL4Sl}G<~C1\8V*b&+1knv~ :cJND;MP9&_CoꡣKAw=&ax32M:ɾ>1n"D3EEGj/{()xm1@LHjQA@i#j$~)xݘE'{"R^GUh|wQD콺, 2^.Sаx H(بU[fL/!G DJ °^_ӲW യ 5Fr[1bSMDNELM16Ve%Jo30]HKpu[ei,4'q<ۏ…4@cDK=I7|4%!DJo/]$?hn53ěލNX7(V&iI!'WK4MBg#ğё zd@ߔ49tC1×НJR^' LO-~Pi 6ꭴؤ~)n+h1ڴێ`T$WG.<ׇAhSl+h`΋:1u{@R6aݲc!@LJe~K "q25i34K` I|J7bbz\WCaJ.m fӭvEuJl@znFޑL 9Z5֐ԎXT Dm a's:;bo]*%u"ƛPΔioQ]P#LFpP.l6QAμq)q cQUs39E`F-PhMJ& 4s'[(pO4.S0~ `xtD%,"H`xB7"bd īOU+ֵif mL ١ǃ+7] )@K?͆IST>hJJ7a0Dz|{Hs?nFڢWO(NIF6ř`lI_>˗URo58X:TPa%ɒ Hmvt1LB!C ) %+HT 2T4_ "VHi&Bdhhr"PHi&bh(i)"( RYbfZ +Ɉ&b!(i$"Vd)heD!H J#IBC@4 D M+J |ԄGqisA8}#>@@Y4hZ NdϮ=3cD 8zzQXq:M F}br8@ؾLFӖ+ߝs&J>ӏFɌs@n'y [ }eGSf702~);D)t89yւ?Yn96( 9 _ϖYMQLYdiCo= ^sB=<'" EAK@%tνW4>5=쏑6pe/ɟ&f)bh+ ƈ''~څM;> & d1D$T=W9N`2Az uW&Hl$d< -GΫ0z51̽9qm$^G|r8bheYx(5נQRMAc09GŠmB-hP<#vÌP<8*c{A cۋ5 41 2j͋q;] A3JGKŝaafJ @4EĤ:L^˄'iB$8Ck#l=UE'6NC%1e˰8ؙ:oUZ ).ZQN rsN;PP셠 i5bdȠYC! E=h"|$ CGLr l@8bx]ԮA)d) HcY.狘1)SKXDUr ,e]?fQtƉ`PnR32, ɠGo= vu4Q`0g @з;Ahwj\$?tAHhe4p0H<)K@DuN7O;z6iAр|)Wnl8B-@n\K SRBs|*@fW~a6Jl4C&jpXD"xҩ߰Q/Uw@a+OTHϔ5Sc>Ē>H٪D qh3uvCn=60S/xمؚ.q5 r Z O&3dt 8\Σ$Z2x{8ֳ f1hFI[kC Mec!eƦxaanJbhMFc'UMљ;fiWT&܌^+ŊݏhۼŚw7mIB<b-FVeLp7ֳEX, -IOB@Լ sE7$ފ XQƁV-fX]ʿ̚b_9k7;uۿi'@^؆_J pb0Bj"I%n l("7=g=f' OL}P4T@4!:tXuH/jRRR@|a3D!u1 ;IpRy,'`)J`*>O+0~9T#|`dM}ؾ`uA ȃ!=%Y?KåwczO܂$nVbc*YLYdspm^gSU^pb0 1 `3<ឨ*=2A۳\MaKa C!(щ"64PUb#ˇ.̺ =$[q;C4H;8rxFDMf6@dX8Ń.EUty!;+ꕎ7 H1 ľngɃ«vkBOS+j2}JL~77|}^d-l K&ۺB')wL܂ G7 1zxHs{Ch$R 0z&ƈ< )Hњ*BI"0c$f J჎qc:5W`[[ 4 @kv԰"QA@1ӗRC0cB8%X)Gb9q;asiYa1PUJuMTv)HdЍP&bjr`흝h+$}"8CK$Gd*eb+@dIFi(8fga%kdxG%x^(5c*$hԵ "k6OGT*CAC=2ަ/D[GP9+`:caͺC~}U0h䒈C ] Ҧ {0'cAr={ghX:LHXh.h'm8 /t^SK1P4V㢀@s#Ab& ;~CP==i{8ԺмBӎ$o:fs6_-C'%Sύщy>) ]hyMsC{8f$"_`xOMV,I uZ! q0JkIA8`yA5 y;b6 ,?׬F:ޠIq2E ZXdIh0"u8Ѷ#(Qur ]1qޞ:@d,cbx O8GRNh@I0㛚9i7%Wl;;a6=#n5Gup6d& p%qrB&,Oٝ#CՑg0S|-ȰxMGd j)#JTʣXDA/[1n]6V@ˉ%–Ѡ5Qzה2Dm]d@Z} 0vqOzy]A6q2-&$MCe-`%JQAh","_ڧ.bfI uI(B=;7-<霸OtЈ5 ׭T;nf SMt:#k\8n~*AB {gH;TK"f{,#gir2.mZ jªV̄aD6oe[ Tj3j{#~ 78 QOej}3&xz \1pʌbG5׉*5*48] o@pE= ;d 6VZ`8t}C |cMVWS7![C.M2̃g ofdeZkvk[6ꎤbjEF68yu8YnxvCS~#ʎ7-{W vVI7 שs÷+IЪq FCd; `:~A0DNtVb֫q8JLfj:$jBRZCߣQV0 : s3)I}D c >bj'R;?S͠=:?_T`2zM⿆ 25]'uB'aP KSD +d'3 9+;JHmEt^rs1JC^:>;Gc 2XdtPG0!tL}vNQЈ;5 'm0b/j0"(`cAbYH> bKT2 Ȃ D5ZD";]DC;o}8'(9t 1f!^ev>WtYw&l()O?%9#&#l*BK`XQ16~Fs9I JqbVan$w R:0u`A' 6K3&A7|4 0qD̑ pm7Mc``CƝ Rb7,A̹-7Ql V!%(@pjqQF t1@FJ&\ bLX,Uq8̄@CLߕډ,sh PHnaĐ (23Ѕ  < ڋj 7$mCyo;kWId$<p{ )Uv;Ob6O#R¼3ؽ|zPiۭ s!c9!G1$)Ҵ'ᲜyYtf BkbU,ݤJwfO0l'`cusE|^6b~ݦ:9ׄ}ϤI&jIeϸDH6 b}+n&еa8T(mXl\wtgE@?T;xDIHQ銀v.bg}8WuߡDRLĜrD` ?jf^^=T>`_IaO])w;c6am )7Q䀱ze(^įتvp:8~_]ZoaĎ1OonA  i,m3sqePRI7O? >:{!.tCB Q.։,+l1ۭ AR6d `JJhH7P4l$kZ;@KP N hQ ٗR=_ndDQdLyB1O$bL0{$6CYǻk?5NGMvjvՂCH TEI46,HlG#Ig4"y3=&]Խ6QJ\ܫ? +,rM(VZOb;bHZÉi1kDEzڶ1tI&Fq!by aRij[jH> zNKM FE8rvaC05V}p3Tt364>sN֊h@}x_K B4;%(FOCu,+T&X G1 +h1+C.{)v1 FZVGbd8z{)0٨mZ44⭭Ԫ 'Xs7LW  DrM̔*nȒhƃ#uJK jj([&K*$u_>DAkC&f`isT)nLKl}Ѯ*5WP mfGӆB-뗊eJf٬;MV<|&ޟ a I0lSš?F04!{G^IR+6Cj|ibDwg2mvs:.FaaN*r/ˈ-Dp~s|Pu:]m9mMmٳ|w?t'a waXJ͢ˉ?2o~fzL)ZI\Y/8S|t'&@?!A'ާ)yM?o ut &I($om9m*Ak0^y}M}8 (bj:b`+`C$򚯡foԛ.Fk;q:VyW& I.\&SkX8P4uApOӰ0d XNL>!΁?.#\`Ҕ% CadNK#qi$I&F8Wub0vO-t꺯N* Ri~x2)p֝Fa톍s; J砊Rʃ;/Tp*76AA'דlno;9Fټ,Sm{n y><| >hg.'== gv&Xwwq'xw@%r'0!D}8"V𗹝Vɻk6'E2q!XCC'ҝFV0OqC'zK, ax(TlQ!!Al;$mgOAyP{xiRl0ÝB0x Xt1fb]݇[  }_F 'Ml@ `}*Z=^App z_5w'827xS^`Jo a ç|@Hw}8;JB_>fup@@6 K1~}B d>|,>}PH'vrR H.x6 7a V_Kr kFgSݣ"HF*ݟ]0ayB`@h]ϯ _3-~hwz v"L]X5#zշ6Vf8NIȞ<'\ +L,3nMᬧAIYUIS 1"20RTZ6+A$% LcNkJjEmXϷèߝ&w?MD$e"e!%孶3bzpHs8Wkz] (kנHktޑN`b4 &T'P}xg"AbXZbD0MKHffY$2 ήN U?5H6j:rBˬavYC `] qS 9lfB ڃ1eث!(U+*xp$} ?jԙZG!A<`A@B)K&?ھi(.y. ' BLG˓.B iGy=c0"vaپU\Sn50PWfXn[+ek0Œ1Քoїrm gFFFe)Pf4faZ|*" }m""1Jg kM$F_ U1*;lpiQ5VfD2. F-1'7QZ6{ $༧;@ 73gɠLȚqyZ'Ġ.ejݐa€!-s &Z$ii2p~-,CM66J7eSP~͋<٩ֺrPR. lhe1aRs2T%2x9[.'G h7qȋF vTBc(@V2蟬gszI f!_ ]mK -I.17.\i'žOſ%\~00cBwI M M<S,qD41pM1V/1bA\ j䑑m6B\a z!D&R ʛI .\٩tc&aVR&ə %i#8b=F"ƪz4cm̃W@Ƣ|l/bic o9!@)s1,LQqSIL1Zu:۪۵Gc}^]C* B')' l8?N*uk:Eu*]T#Zk -H:) . h  ՘k*<3~7#ޟvDRx L91{M<'bgZMÇPj{d$ "oFPM O&Im߻14D̢t s\~# @Ŋ+l"$PV]QXbnJca)pȒJfYfN@rZiOz%j7b*[h` 'ϖ5YUSD$ F胆+FAi TLl" bRA$FX7]2 I0B"r)xdqZ7pBoX%;A$$2 "-LFd:̍K?]HaSEĚ NMs Ԯ5JLuQ"Rj22M#ChNA8!܇GQ!ʐ64) X*@y [ V"0HldZ-1VH͵`0U UGf4QRVd 14DjmRH^gSQ $!$6!`)ғ(Ӊt>0L4M =A# ) @MMC7IB J/9sѩ7֍`Q:lƚ)}fdU R*jEhZB$d*" (`A4I#Th$4CVb( &`f= |D C:zfKc,D"Ć@$Ku!<#.Ӵz@dz1w t^0% @Ptv{SlN$i ?n2B C穣([ \'(ʼL(8֞<$䁸0{A 6Ahy~4 ^/!kLCT>}Cჲar@x7!uRe?6)Z =23ȔE#J[Xd![ahΧzv!DB~1d$ QiRpE D K4"ʱ HDD R8HKJ *4=㋄jJB A2PhMH~n@0& )C 8"j ` m_B"k@%ͬy5Ӳ؈(8rk Tzvģ+D_yhD00X!' ,̉ L' "ϧ -ca!L ЗԞyHJ( i"<`Du!MM!\Shv ZqOoHd!*;cT6q;baǀ:~1Ӊjç ̲FDͰ~3_kf01Sh}rgC L2M٠̨%̮G763P//K#o3X&e޸wWr9k7ol{tn#Q3#h 琪RhZe)&#rЋ~lv4&mlEO3GP@$B.{Ǹ*Px!Jbr=1zjS:L5X&&m-˶Ͱ;0ޑ݄jUSīCEb8 9ռ&zMPD)qsB,~c!`PC1R魁BRPRJQ @%X0B  wJj`YGHbBbȉ @ѱ>ꗗM )ASAsjPj$(LH 54$DE'qөKCdCsp9SADew ۶cI#p&U!Q$EQ%&fp2%aehȀʑ 0v 7 j3FV)1H Vvk4f8eCC4@ffSۡ+ F" 1GRLA$@Z `]P]\, 3a!Q!0܉B%MNf& ZBA'@ _`npBn",Y9_g ʨ] eZqC :LdbHD:͙\Z'NYYfPEa(xvr8YFkK#Aȼ?G62H")CrI>%I&.պ;PS6%EU0XB FqЄ01>ߖ)ьNY@d@%9 22XFIgPQMk`ZW)+ %CCjq `"`̤CASAd1.bf#e!Z(%5c%!o4HA&Wrh!P17P+(it(EЄN3SF@(z?0㙝|ǚ(ʇSyg*+JTuPPd:Q )(hbz eDx=Pk&]+I~3 B<0q8Bq>f"ZBJC4/hMD_$) (:& AN(О/:򦬼NlYZD!i?I#hOaNJ|*Y`ʐ!,JAν,Dʌ1].Sb7EF,Tv5xީlu'q E5>֣w{ui X8:%ۊj=r}:2Nf;S↷)}ix fto;ݸ5!<>SJBMaB8IjokY5 y@0@HPG$ ($XCuVIw:6܇|}5($bOTRx A8s) b)iVQef6z;O/) Ā\)'!DLeL$]Ei5bZ)åyII_;}!G=dp7tKwЀ}zXb($:G==&9jjCeب\QFDc6c8lƞMLP:ѴL?,?0(Z+0HVh²bRs)~ENè0/b,Rz/ }テ(DnAAVr3{OC25( (5( ^_Ӈ! -a(i D"A,КP} `MI HD+Pv}9~cԈ oVb-cnpGot'ȼ(Hf#HIM2udʇSȫDp@j1Fvq,p`ƈg'#XaIj 23Q++z$ EI!^ ć08Ά9f8)u8ELc e+JU=:fYJ㘔r0^X޲ JY5lL4*"uJSj*j{N#Y,9:@T5d X4w8nӉF4u\mzЧBHW# B O7ԆHqOPP~C΋iG{:i.= М@xRfb* $J@"! b怌4Ce>ݐ0ƒ3!"21Xv 3f*a*"p G&Pi|$âQ *hC8R0IJT'P/y毮]wTo ' HXXzh T#,P0ȃxkK&B )H0x!P4;~8&uᒤb "DŽh޳D`ac.3و.ȯ ;9y:Er4c @*hZcІ:~O2deaN!TPT+D%{R5z=*Q0laʖ J$L4H@2XHJ]h )5=\NsTE&dhp4p1O@ߗ`pUZa d}BoC ~^f )*dNi?+ПBCIEDDҵRTUTDTPҕ^LI:x̐faĄAFϲRg-d41f`fHdb!Ae^Y.9ALcHrtL"c$q0q!200ګ$ 1H"RFb~%, ^dA   Hd40BCHJJ=BDl#Ii ʞay]S dqvg#ZstXՕ\G(ZDDѷJؤ._6;_a=S2bYV 3OM9a  H X}G"|Mv{0ؚ'd(:"Jl fāȂodZh | B щ׬B)/|#1wE~k3 ΢}hمJi:FUM@"lWL݄No\jЄnh%EqMMAr}<à7cMxX|9@-;'>a۸3DΩ=bONsRuйȥc6+MR,!" BܤKƯɫ{6N$Z7h J*D u֐Ɯ4j}#4ӳ PX'vuvQ>66Gav,(ߑShf1tD65P|15*aFNnZeWl;ha/0[8^ /z Qz;邈,6\`)́ EH Z!"d'i hi'Qly!X\ C`rCLC4'dоNeN;t=wp|C,9"^pQAVbnb!5ojg A0HlzSe(X Fa6Gȇ δ`1ia1]8(W^u6vy[Ga)Hauz/8&0QATQDtѪe"I64?=b@} óth_QLt,/w~1 5Z 8{aƯ5i]a"zB>}!2[6sI G7 eCܝAt<7,Ea8V{]grr}ׂV,~#GNH|;q%m1"miF{0` 4߫5Ur`+bu^H \iih}:_2@ٽ'׬ό@POHh@}q'SqE'c(|J4wcpaH-al;D$}cR!0 Hٻ1m/ˍ=mfsا&#RZj龜g$MBj""Ciߛ2iȁpِ1|3KUU5"0sǐckX/S=}~T;aOUWbFW `DAdj@RSM [1LsڏGA اC1]ynQU'vHQ][p]| &sr=@B']S;H7 04v`z\-)҅aѓ-0oJS((~"G#jP`=5FB;ᑡ=F~I!p!eEUPЃf{ǘmE@6 -+;yG\Y\1*A6$%jLQxoãO b)ߨr 5(J«C'M(fUQH~tqXAT> uLINFay`7P94k2 &PGa[psPf3(i[2VPEBS12.2O N]qFVr Q'{c4C=颛"4Av1xHNfTSZN\+g\J"(l*+a'r=od`쓷,l{H •YaмQD0QZ]+9 )%)YPԁ4ݠQ``e=-( Gd8fIrw%H;ǥ 3qyr%>. wM<Mšb3 تl&TPX\ș4M 5%Jom8okzz36Ɵ[ zc{x ٤m"b&gQEzMm%&uhUlv}ľh{%F Q(:yl1DT͌Çlt3'HKCv{neEF r p"(&!" j )i?<5OP:h_;RU`Ѳ猓{a#fPS {Î ( ,7kJBsx o ?t`Ϸ;BRadj&F`J./{eU dϨK9b&] Kf$p`&f.?X L1%vQGA&G@&Ȉ;qhu -nl,^8DޠqUJ8P8x l7@: 4 b` m C*&YĆȧ2Nf;.r;zRp0Qfzs "ACA0gMqF\Y$ kRTLGbӨV>m祑@MtvA&{)c¦((_\*.~:&fz×DQhu4Kx@z& tN끉 հ x&А"QJ !NfcF 6f!CfGLKn7$2@:J(#|Gx>~ OӿX0~{byP2d(;уz*I ^X! Jxoh`t~Eo3 j.G#ߎD1TRG(\i-\qG"p| ?jB* '&>l4Ĭ̲uģ@9U'rNT' v~:AAe(ib\$cT'ySS%n bax? hM ]2RU~i_T&g{$00As M s 8HRL t*>2ϰkZp"+c*[:ɄqW & g]}6 C+ ϴ!9{~ih&BXh1H1"m0ZN%Hk0ѣ:Q!$H5"d !Q;` ~#N>D a ]BXx{?b~:=!I;Ipp*y.>C$0ɻG(sگ1rTż50 R*MiS4Ap$:$'N`:pHq UEHhIԒSWdKuN]EнF1;8ГP(4DD ݆t@cTDQd~VG@8*PrYY_V4KOkf˖`*" bJ)`>1X9 A( RHP0B Ű@wX0k{Z" ( :@}&Tz1%F#_ 鐝!:W7kUc+X>lȿVɀqY9ؑQMeApl̸0 5 D*d-%!ŔQ4-npb012A R,03"ݭOcѐk0mf@S%h/ r4 M >f1ټ&L)1$,Ȳs1'& \ 0u#4i$C!tlmOO轂Axo;PO7*hhw槠OK"3G#b(eM89 >r$%\H ʂp N&+6Qk(Zw> ^'l&`vH(kuq#}݀%T%8 pEؖ<9UO`pS!!$ @"bdd@iOw Ihi%# XO Gr4hdiN?B{+szt#r(dو$B ؄@AL؎USGx<( (V@(\T=VzA](:$R pH>߈&W+H!IE HHOyH&&( *H`iCn0S(qz Л]?Wп?Fr;G Aa`x|<xHR%}o|^&& z?M/OmWsff[m`Sn|x ysHf4\s܋&M_tƊ@С(N5%SQ";ahk ji='ītC2￧2,0+W؉E0H"R",0P J;aCF[# 20K04q# 0&2R (jrX|-FqXV[&S˞232?pRHD%mI|f(Ũ3 3 #)\,i" oјPZ2 Adj:( ,$ ohoP"+5#MV NozZxV;ϓu:$zubOmBn:ӳi8CZCt)E;\=%: v5wE 8ߠ&3ɽ_ɝi5R[\ }zXxXJnk{h+ĺPiP遟G BS?ƤN=9?}?#7wU;X{xo38νp˞tHS!^*Gyo&csS;nv/n5jx-A bv@CX!跇9F 4NyxuU+}16QhwH`9}vJR_Gq "d ݾԽQL.B9>6UJܩHQڛpxSy-#rx4i뉗@օ5YmfV-Ppz#%c$r0|OLU":mgRBk3mNjOԽE\ &CAe8=e) =NT}d#m+;;s]< rL_Ǧ`Y;-`c# %#pSCH-Ed9#F?FJ@prCӌu>:-6'TI&"2rZ)oC<'jRVC= {kn@vhMйǵ8i+!Vlm=[dܾ˺)PSknmImrX[n-;L,, 7ʂcO/ '^$ҙ L/L 4gJ( |b{Mi炅83ud`d-]t袍HH{DHI|?#|^ >>3u2uץp/,3D!8ZM.w&O:卐F.,%`)eDmD<mQ{ߑLӒ.̴%-RNܐL@i$ԅFH|[GIW բ`Nѭ9I[xssS*F=9ǣg0>҇d`4z6лTtuƞa?J xvwr\Nw-ŴJokEJ>ڙR kQ7NPKt QS+uKּ3vLRe1]+HMS]z\.dr#mZO >bwZlPxw^4k"7ʑn3etV].C},|~`aq\..ڈXؓ5+C=m"n4&:>U0+b8 F١v`&QJf  'h0{Ej{-F$SqsL`&RvNyى.U44FQݒ(e>a!?}h]bPE؟O7⻝}!};+|m ?>ЉQjx(vC.,;A EXvD҃#3jƸWf7'!Ȧ&ƚ>fgdvg}i#tchc>)q)hy 9 ۇ'Y3S1: l6YG5{qSPb[[{_cѠ|oyVzgV'eٿn-/`'ⷞ=9|4|fnq{fuύoCZȧ1-?Wqeʪw%mWh%E5J#\/+L?65r*lȝXHԪ_U7}0u]PCq9/C\Vͥp~UKsݸD#xьF8vGlY%뙫̆Bq$IJ{ bkL>e+ e1QvrDS2~iaz׮jp.M4,0uq /ìlX}>9_>i0ci$^O/󆇿yY tX;V*"&gU&cr&%bt4|9lѥlz~|f3+c}XOS/;WT'_JQs,SDxri[cETq&PYOe{VdA~)NZǭ5Իd~8z0$Fs35]{k^3{SO !YSn-xvzjhWWSlsApM9OU31::#ϔ.IGr:vŽ'?κ+В=6K07Bo"$f 9, @PDa5-|8 w73-A@fȜ9+bz @:7Xf۽ܺ-N'/{'v={ I1^clAMhv!2ӳY67> px$y/K5GIz +">t Og&aFXE\]FI2 {'*„ f6_\qS݄&@t;T+YLli#Ka5M;M5y4loq 6/>×?5AD]AFc#I 3}"?^ 9 'Xq9{/'1Sc$bLy|=&lįfcpH{b# 6xҜt r` Z%8)Ʋ0 "&`%)bM s9(g"=esyQ/ܑДM1/Y]CCO)8GFS4-xT"K;j颧E`u BQŏ3{a +9jc5֌p ?{y]Rv=']BR%CujJ*CD"@~@"'TAAG/{M)FOBbAB vP@AGsA6/ L! AQg5s}AؙN;B&Tِ(u p[#*f"P㣁2 Z~a&RĴMQT/ήtK=Z (Cd{Ƣ@`?9ע| SA.&gO "lAh_u`oUAFGWDj!q!V"c !5v) d=).VXsQg(:1P{G/ӂѶ`r!ʦ,ɖ+c ZK~bAMLs1SBcņЊrvY>j.TT\O,I&ai)u(d#Bfp5d!8J: iJr`(ƤȢ b*=}Ut@J}ldM$BSշ2%`nf(LBi:d J%@R4MP 狇`r`Bum"͸f6_(16Pk!HᆰB4*WC2jk5U94F&eS zvlkL\Ҏ&\=jdՆ|hz KGC4'K&6\0ØR,)ۑqv] fDIo]=}ȫrA(: ~1ke0>a$o\="ۛ/|=zx"|+<0rLؤ;Nق q'01 egD!Ss{LUxn𓷟͒#ş{}}ˇ,d1((Уc昝3"UׂihD%JFےԎF ; LhユB[aUQc@1s @l4kFq;RŦ[s@̈;D 1R?  d2q ĎuGaxh'6m=q5H.SNCm+& NHm >a&xx=-Tsއ{c[= ;#J8H)J Ώ hnK A*$QbF{bnyю&ޛ5@ovȩ&ޡ %⁄u Hxx#B~J=Cd2T<ٝfQ<6H`|VCDOIy(ttm ",>^-r p }+rb$5u8#'FT, /)R=-Ba͆G|' <(@OrX|RXMP< 8(gt1u-bp^`IDj6:_S҇Q3$jl@Dzxl jq]N<5QRub~G}9\.1df,*iӢci&4!@&R, $hb`:bFd 9qV6VLl " `%֐McCeA)4mw4ӎo6M/*K# R[!o+$zH XeVaIS܅33J=or d {^8I`HP& $ݥ:Zm=ugnv@D!O (ЅTi)}?a=5D-w̗>֒NGfeI՜ _lR桁29stTj]hFw @cӁlC#\e!l acHA1\QcdR :î6 tkܤ`&NI8Lh8ӏ&Q,77Mu#r=8b6HdJJwhAI֑0A!$;kVI렦J!$wO&x!HǡrnރL)83-u<öU3Ìin]Ц;NHcCdCfրߎJrۦ}ŚduٚqA˾I(.xnu WUfJR|pi>ȝ$p7 H+6ƪū,E Yp\BL" -* V)T G`ٽ>tHiR:ooRq5PP4a 'c68@ZɁQO0yN$ .NOY`׏4'o0)t`}IɶhrnXW\ͣqmܼm qrUbhs!0Z~q?A < Ykf1§M$h ĎZ6w9!mI."h -F~y*6&yiI8 llv%3GnVƶձR Lj]F}= ֙Sd%ӴsnSB&Xwp<%^8_szRUۜN9RbpHJg@פH`Lpu&+q^75ou  +vt)x2{/謜hY# N7؉Dr݌M h10,yz'Sdǒ/Z%Zʮ.Z:a 9`C2h"M%ɛP4rõ4vl#їTeKY>S"Ĉ 8$WN\g2N 9QWSԄX†5+N.\[Mx](Mc ~|'9%Vn]k;ԱkK& N !M ivIg*@!2WRl;`*eAB!ES΁׶=T{h}7Ln Vb]pK{ow﹧')LMY>vӹY6EhA+%̘\\U֐o֋ru˶p-L5->V$^FX5:AቌW%OcD:<ԁg9;%CCCA䇦S0CWcX8~vA|Ȣ뢉ŗ$Csnf=Ia^ӤB,ww3{" $xStl-jGw h9Fwk]Z'$Ds d1-oǚ<"o'vS,[VtD;E$IXmp>KTx`mCNwJm dߖsKL&]:^vL$|5g))6d&l@_AFY #{h(:8" @Aٴ pO]pE<*`_٥6C pqC8M`\D:O$)X*d:B;y"$Gccbb$C1x؉>Iq<B3<*gޘ1ӄҙ@dX5:uE) 8iB\6mEĊ%pHΥ呑i:JWP#\46" PmU5fm.3P/=1^!'3څ-Ga?Z9#̤?sy,ҧv/ i!P XzJ<B8ĕ-*,zby Lcp00D$rc VKƫna@GNi:4A`P5&baaA!LWZ}Ca @oX(ltw/*˝3bX(KF'+°Fǯ!Bv<_Bh2҇@5" F<`rWP BB%4 @2**.B&HBҢPdJ @ "S~4Z !NB=DZ 8ŀ5*l>8:hT=Sԅa^ğ$Tޜ; ĥKd>#alQX6#׋Y51@}i0va@OݫڏayһXL1?c&zh/y-/"ͼ:A 4r!b&t[2Kpݬ!'6GvݸApL'A[FK2:j,¨PZUc̐LxԊG1\1 `Q <+BLqB5єDF2B&AA@krFMABH61 GN6%u&{3qQTjZBLlk26ӑDwQ`c!ADi#l `]K!0 Fnj.s*Rs洸M!LƓ $`D F7vۍ }=93jݡQSW&S+^> `11X'*a,n04/pE`T؀EQH̐ 0mA(@a+IC2Ć@H}Biu!KB4};%a$BB/\q @!vH qrR5Bjwdn%0bJD"h D@ːpMd](~o v10]I,<@!goٵ*RFm`0b]eY9wwAQ ϛ2 swۥ%DtW_ 0=0#dR^=$Ͻ,t`!bD,4"!jb{څ QDAޯa J$(JBaiJf1r:0UEb"#!}Ł"808 '8BRy'(ciѝ >QC7d =7Bđ1r#SCmDʋ[}s!4fG,0+~-h>Ǧb\oSMTFa$p9m&9]goOG\ʡ Pw,zvq\>14\nrH| *Q08iaZ\2H  o0XdyH XMrdt :cX+`  FaYJѐr8ӫ@yP&u@P·6H»ץ;Uc$:8C(I*JΖIpCVwiQ0j6m+2.75eswq<+CUL\˸1D1pTɫ6g`4˒X;3"kO$#g=$v Sڦ8|:D$q*&jL;CXYp/ *9뉣lbϭǙDoihΟ=} XUPQU<.>_H8[ LV011L? {=0Py ?7@=FXFThAܩ@R"(P HI<{:x}BE~@SV@G쏟~fTPIDnޑ6:(d)L-mP2$hF**caX8A+oNl݉MmӥYR%d FQ;{L1R* 1{¹f?氚b%:k pH8WAd˶/!7(I!JnR3/lFw&'!Zh;ȧ%:A/{E[\P&\e+nR"^Q,\TzYHLر~edB63*#V*#1f܏KscPDECp_aM?߫ge#Y.JX-5qYWXZYy%ҔXLO}6f6pP<~M~g2b!&1&L⦠7aA% \Hi+ [0 CJ!Lg g%YNG68 BH#<;'jV@VZLiA!qH?X#eiQ b_KJ нWREp >us|r i`M݈@UEFzPMf$ P>PbeaxĨ}l$" 4~+ S;I C,$bbp))RBD"RUe?Gi5~]:R164ŒDx?2"h*O âO;P> r}agT!Ԕ/XtsK'aPi&4qO_~>C`oZjʇI3 $`9`?҅()%!*d'%'{1 k5#۞SfaӵC8ichq9Z5])Fиa"IB2- f4Av2B`;4xm 9O&" {6-A@[9$: :# ׍B0'&7b"(@bSC@cbI)i!i!Dd1SP 8w}|5}gy>L py8ᇃKa☎dKAY62B=)Iϡhr3< bZ|d9'6hQ} UQ z0=|ƺ3s.yy]Ǧ.}zu $!$$OT$Bh!02IV @[%Φ(NfnA$GB2s 'y8ókKPIDT"IdpQZBǓ)Fn<ÚYXдƆ%*25S*4M޸g>~4weDTOOsaU\C)1} y.{hs moޖG.j ". 6M ,G6Z*h2*t#3Nk7U5)fl0JOo$ e%i\1,""gp j۪`eDX-kY䱶5cw|7mR)kRݰjfbR__xQI^,^H̥cɅ1ہN(JrdR ɩuR(@Q7pWǾg)!(O~P'/y) RO„?tOmFTDs։n bҕEJ>33$e0Q&0F DPrP {,qT[ m-L37or5w{Z *+0@ :'E^y_y#0(2003PdfR^x+58TًcdbdVM%f$Xa`A4&AO']d03& L!0HJ5-Ph+MV<ºX4`GeBL21dXRݵ54bDAtXp4HLC鴄'9$RG>O|cn,3uWHb%L`&dH8H#C16ʀx0PB>mEgPtmB߯0ߵQb#j>@ME* *TfNۗo hq,d ' 'P$%~Tj`.$ yeBo/nx2m1hlY s=aH?a#ta=0t`ɄR grYxic&"y: cڦ t Иf.*&f= A+!cɞD7tn$jD3BLZ.G<@5%_k6ȇA\8(lDN7   #A(h:|*4Ca!KIAUAX䲀q!htof8D6HU!e!b𜝱fTU"6Ihq:A6H-U4*)eu Z& &8tƓ\.G9&~0B`;,X=ߔ ѠX Ԛ"cW@FMvmc@0B$RfbT;; +wZK*bV6z+a2xʽnM$^"d 3㷎Ώ![]>M@L3 TEĐCJE قaEG:S`:]INL fHKۘTC3R1\Ec4l8 !)pSK2$@Ck;aTmh,;糦N#l&6u@(gSNqvh0?C7 =q0:FT8kXԴA A&J&! щpNX oIYp(,HNPpĽY۶#~P3lI>-53CGD#)6WCB"/c ~1_KNa<(9ON^ICg3RM x})(RI"PrPEUDMEMO <:Nt>&`)ִeVXޮ~)hP"خ b~~O6vP О > t %JzM9wbE 8@L&JiAIFl6(GW0lŬqYlce"JK \lc.dslӰ=GRv zN+̦݃Q!4ћe&za=yLd>ނqlEhZ@pNJ/m6?7 #ɺ8@HOv2|4o{NX𘉀qh&ED˹2G%:db5|㙖Ff zӈb#ϖ|gq0`? f~(3H|("gT?YM&֌v\L)4o'ߒo7Q%a4m:D% aGm3VP4!NWEř y'yn,Gm;h(~(yPAbװm""u$ ?9f{joU vAwGr|4l=ݼ"`T:q5u51Ё% XbJ12Iȁ:|嶫nhMh <?QJ a?>T<g)'lvrc-@"YBש@FQvm1P} lMh`摚09(ɾ*7R ?(HS %Cf;8֛zX0@Q1`MN}(:7ȃ a f,Ӿt=Ƚ܍_4P=T(Pb WJs ֏GQq:}/wOqxxTް\ ѩC'D$h:pۮi8rRӸ܄-̔ґf\uEAE$*3}Ev!%UQe Hu%"E=zк.Xy~ҕsϮW"X׭0^DX0ܾ5UUSCFDǴ6pɘa5 5;ཥTo1,@.!zRN{I{y kF˕,y\rFE`545]:>:sU=Ӓ :%.CRhj0iHDƺh֍-*Ksya|P1.7H;2!ٓ6U蓜dn$.6^9hFb.pC"mvD:zf*34KIí}Bu1G}"Hv&aƄy۱s p{'qbDBf'8 WKȋPK5{490ۭ)S*rJb6#/;N3%QޡƦ3q rF 7NqUKJEْ>&p$JʓD2]Irr!E a&v>)uMCu1L&hީ.+h7N :7JMw%1ьz̴j$hS ( $P[v(>qnlP@ldk%aZa>, Mhl-2 vW̕|%C;q]2%KP1qk!xd&"o)cS]RH_>byDC>5"zǫtӥO$dP13H1Noq:(1,mc([0 SQD*No<Owޘ(qh")*\D?,4!@I(ZJB> A$"DF~X"=rCALh0C$Ȍ21+(D@Df(l{a?zo`r~0a0DBp*W=`·M(3o8c`s-9(IƆbh}Fa?^/ 39,I$xܜ^]bQB7'DI6/WׂtN*B*~ {I+ؼCd1i~mK_XNT!p0Q]_Ons֏ @K*)H  Na*AHP%TTDhb DI %dr0JR@.$BA,P.H`R+D@@ BE1*DL-RA&4A!8QT: $5(e`f*'qsC! a ! H Y YDA8lj @TX@)2?E̐q?3om<{7=[IU P@:ͻ&CY[M`_x3Pk]|^^newvdK,u_yQnK.Qšv yý[rowo(% t[ӭ 6Ϟkdk@lF{羵+}l{v=}ϼrCg7z$$كm_wNQ>9ݾR(}}/gwivE@z|N(XKUmhB@U =4lKE`wH@T.v:C9%y:@vzl@=ɼ}'۱7}-L׼]׻{5ožvMݺ^}F8{ˀ:hhb` R@킀7_vU=<*Ez(BJWBvSGW}>w p{nG7|OY\־{o f7}ǟgf]w=M|>|}OTϑ_x= }ftizJ mvク#'_/wMo)(iɤmkxNw>ӻ0W=wǝgeP}A_uoNܪ=|Y5wmGN}<=7fݶ|=Uw џnݷ׻g}Rzmsw.}y}>::n۲۸}׽y>']>ntukύ9ŽqyK{iy*{v7 u{:.6q63=۽x鞫! n۾X7s2 _^x[⯾3՝zzפlVεӴ7pOtnF^7^qǪy۷^vW<{7zLK{3_|(;jՀ}1(uE) N}ono6wkEukS3_svm7;m]  q܇,flkp -Z}tWf׽_qWsY|]Re@֌ A}vln/^*_].m>kwwN3oooZ;닳-{o'}%gq\^.jMP=g7u0NY6JE n1sϬ6Yp)ӏ1kn:ݷ/ޏ7Z]ԙlW^ls돫]g3ޕ}/hDm &z7Ͻ(3ܗvu݋kZҰ>Ԑ>:o/}PUc#BM.޾8Y9Vg ^8˕) i٤T0@*"=Bez@N)_ sa%BA)AZlӈPѻzT| },Ah*TV(^dL$ f%*(ZE)V*Ufd(`f(J)F!hY baeJbOҘ"L4LT@P1-1 !0D0D0~b{6m=5fY5EEĦ̐$RZFB)(D4D)D-AQQM!E )#MCC PL54 M#@ґKP4C3 ĔB1D2H%(A E" K& jrH  &warG"qzɵ')-lN ZIhmKaX&dIj򛾃b]֢{P{W:7;&%Zj#>3*MgͿ~o}7ϗ^֨͢ UVɐIN*qzOZWD4UUPYJ)Ue'9<=z߃A>3%Scx:khPb0,0)i'%b>!!bphv .,e($wjrD?CL!)̿u֓rP%( (#D0'b n2BJ_mUUa*\ZLS8d@e=z2dHjaBX% X bBJIP9*"  H4 ̌_+Q1A߫]#h- "bP0J"B(bV$"EVeB`(ddJV  iThI AkvkIZY0Ȭ }P5TLI ]vwbԢR 0!*HvU<|~/PfΪ"ղXZmŁGG{E_!$IX^@nJVDǨg.|iW#aW!k-Dq:v@Ɔ b)t"9 b3[5԰ Fdž㍐18dZd1H R u1$ty+Id/SM\lC $f׏34۠q{Il3Ck&I`UE.O[(`jc6,Aa /p4L~($>2V[J3Eiy|^4ԩV~oxw-g_小bRB4>~emqݏ3ڠ>iΥB6{eXgJ)>O?$_~X*(N2!xDHJ @!S!ZP(A2DN%79;/4%(m&)(ZRAhZMg yW{.E4E.m^f~vZBr lct|x!}:g~d,k&U?dOyĸDhMQ1=p/p&js\꘦&!= HwGcdiaZqF%tsDD}#k`\tC7$@tc DڛIl;w5K Gh$PX/xDBV2PChJ椯cr^$TyIDwl:`fMk tkߴ;#`爠;"\[V=E:Uݙ˛t V|N`}mzd$.Ram µF-aj(R]$ 0TaUP(mS,$S1 MtX::%_ƴ 83= gD|Ci 9{܁#˒<|uIR#gjS^;66i]pj׉u4uWrJPxyмT3+^ &HI0Ob刔(1Τ{^J^p_bzSJN#*R'xnRxic- 强%<7P95>K2"ڏSH>fUIZԅ~Oe$Sl8FhQTҖWQI1BTL-6pQ vrvfTO0q ;QCCDy" 0q]ed<G(6\C)1~4-[JUGVPJY$g MnF\o=v!gg~ށX:Sr% M:W]F2q[ tQߟEݠa!BlV,Ub!oV|혜gֹΜY'$) R ZZ\=!_v]O8x` b!ɉ~2뼛Ȯ=h~Sqʖp&e" Z9O|ޜ1RTAPEmR*3(~6]yE)z+&q8+6?'45BE1~eL쐵ud1הvC;Z@dx.BsK  Za D~}5H&CTM$¸r\̒-a j\ŋ ٚeARȂ(/&ƴ)lEPEV" .*vaY3? R= faV*b ((eJD$H,BP[$&Bhb .siNI % 1UQdDfIDTqePD0SDUAM-!ETRLLEEBQRQAu '&ۀj\%/tP0NFrNF>po.৓=UT]>&vE6tyb"zyAEDQNO{2fEL7>] 9E$ǠBimmlF4`18҂_9גg}{Ogm}X|uchp|0F,nbg8n'lSX *'MSs?췪/OT!1H3ADq!&kWkϫϜ=Q;rIyo9 p5[L7Ѐ>)/P;)t[<1턧)%\O_W ?:I%B Ur6UUo/k$dzzHΌ;3Pђjvz^ؠ۱xSVz!8E (q=A*yVvGXk_bBr$ ImK*:?i M;<QQ.Dol5W׿e~>{Iz/~|FpGz,o 0f0+V!N2 |Bvh }5Gϊ7d{N^?6MI7ٯMcxtiV) =n\ʬʗ ّ|}OpFH/z,=̇m΃vk}N_H:M" B:ooG5쇾tbdsu'Y]757[J N7J~i\=5M BR_5L9j ˤ9u&s骻lU'"fsm_uҲtGQ#8&dBdE@$_WFQBjzj:78*N{P^O_=!>u9~Z|1D A` zm.-Qq C-n?l_⋑bsJ>SjyJT N[TdJٿ1 #X9Cc)d5qjbdS>T#GN=j@S+=Jx>~Mt'~!Ŋ!EWglH+R4YޫrTQAFc?O8dVa"ж~3i"b`Aiwԭ,] DG`m"sٮdaUi4ݷF/z Ha$!!yۺW5K;yzq0㎐1NSׇ\Vd7ؚ&- W٨WQHqm!ңC HwsQ8CβjL?/MjW䳬?Z#q:wvtArtѴXW5pG]z!ŇIp1_+C )pY*f፯-ӪHU’(5hEB 9a85J(-wyHN7)$Wr?RLqR\Bq_3-$oĐVSÞU@Jt&_) ~L; cؕӼ9.AdyR~y?  +STǯJQNϾb $K 0I$Cq+/Md^F7jVEy=47%*R5_ P0uG;ϳž|`<(v!dR^u3},upa/õݰ C{6CPƵ4tIJoWbbςv.A')Q}5w:*<~,>yDT2'tRP W%F bVu9!Y @ +J &HQPCFrZ-JE5ק)4u\%(u@U"d Dv#HU  #TCKU@\SRyΏnFu|pQl oD|Z{Ipgja)Y֫l츶7:5/^W;œ.ÙVׂuFN-uᆌiEU%֔]!fu'ҿt'-TajUSձoXa ! %Kfi8֦|5L*Ix}zdi(P`q q]HoXqy{soT]ʋ3j5Ӫ {hv9nC1Ba[VГ0 !(*ZrrJG| \FN6N`68 Mޞޚpu͎JRo<|=IO`w5BWȃVK򴶑=Qڜ#HAD-(&KsfJHg#L0)QTDPU֗UE F䔊C:!_}9ռ:zNbfESEp2zΐQG(!)f::*d%Yh FEdDQ1TPUQ|(6\eXY-6I)U"&)7hr#X &?٢:hRY^_zM! $̔<10oe¦0-ZQKGNg( [wղ;}jvSܪoʇtI$:I-V'Ǎ4#w/{xaCB TYG"&]qc=/A\?'po¬!?f&tk_tuH2Juɝ\]jXX^GY}8 v=T(WcY VlٺEa%.1fxz, O; Cs_4x'dw5VC dSl I-d)Aj^مZE`)W]B.4~Fh!_PhN|e]/^o*t_~;zEW?VWFWٔSݯj[4!BPx~h9a y{.?g~|Nv޴7MqfI [ѭX[*o ݥ~ﷶjexcY1fȍ6EڌvXф8[jb;IGv(m|+|mϥ%u\KTʜ9TՕqX"+t(c^X!YM1xiu{j,PqΚX=-y&}}翉q9Sx8fL_3$ny?_ȷavߪL;æ!5O;c9 $'TMz-l2첬_yu;dWA !(q:w)7N<9#ո`'e$y{+sat~_Kx[ql꽽Lg`-WԯYR[ 'ox˪}NدA̜ARbp ~^:>;"a=:OGϾv^(eAd7A?CSXVF ]b5Å|>8 b >oQbejt{0:"bc6[ÅP"X~㘁|/:(#o~Qna}i,~e-{~ }1gő;$p#MlDfZc7d^Kix@iYEf1:λ;X̙L,i^FMIO_Õw!Fi=~Ç`YQ@0R] ޱyf=޾yITS[f;Wڟl$ x=>WdOW!R\̜1((j:~]>oӣg]*W)Z:ꌒoC`0*~vfĪ' eAd.U4&B9dIMz _ 5Պ&Y4k0if/);Ӑsbq=ZW\uvVìA$ h())JG"QB*<%h& AHRBR+1 R%,S ףMWϬR?F~ ?kDOEK3ER3 &cEK4BQ4ɚ (:E(""b Q*PP9LU$)CDQQB)q TN a2&(DbPbBBjBJRbB D"b"%"B"JF(JJ$%!Z!B`(ZUi [(!hA&h)!qYR(i h"h"RBZ!h)Ji*h")bR"Rf@JHjIc$́9)/2 bh]⸡*(@,IIHEO>%#@Рw7k%B,8)X0 f$CZCI i"AJbF * $ʐ fHb(P)BZN rHM0s)PP (*``$Z=eL&t˜C$2cB 9;(NxK ʮY_~=A@H103)^ R2`La bSQDE0Hy+VbaOݳ1X]Poiq4ot $ץn8aFi)T)EYE :}[0E@@L|_{~D7_]1 啨gKv\~exo,;/?wC@NH)uA!~okbvfGςNӍꚤ6 !~X:np=xDAY9bSFCI}{K\K XlVbL]  P$臙:6aϢп)UItCx3|>Knf2P##E*2JR4UII4Lu )7<@!̧@ 2e\!T*@N@򇮖 xmD!͇CC!%D(d/HT茪2) &Pd*QFy~+.2D7T4Q 5%VY-b>V!Fq Ь=yLa8drV(iJUh2qhUiB %o;܆oB(&!ZZ&@%&bd2JJ4j\Ǥ;9h$0ȉ3 HBJV$(bHT+IBb 5I+p!;O  Uth LD:@Dл `C R>!ZThAGu"PKQD4Q #[|t=\?`p+.ą[D@D~z2D2lTw $ 7SdѝL&QW%uPҤ :ulRmFkhcq;`m.ة$v|Q:c-OIRPV-& %F0ƻyIB@@Y9ЖYxz1MxfttOH>jӁv"~:Jmn7߻1T':/g]0Y!/;9%*N)2o]G!~J J}baKȑY}Qv"EN|?9&M[ 5\51N~q$! 3Q`tR;uy(txch7՛lw)n-(#KeSvGʇ3ڸY_$ݰ;3j0pƠ#_7Rk|F.za7w7-n93 5`pَZ&6}NTxpxS#kB^i*JR74u>M)s˟:z%T|J3q`Cۇj]},dͦ)k螽.i汏10YYԸa0½o o4#Y`@ 6HzZ um,GcTY@ҁR8O U5,STĻ`ϸ5 dV\i_no2Q,59 3x]$6Sm[h_Bc|Ů%Tmrg>;ΞCuxtmkR% $+dVd SmKmmW}zސgkW;t$@ɹ+%`8>&xnL֜.#L#dsO u{=Rv_f?8͂K*&bÎgP_]G~w@5ɿ~-)oMkϔ|ֽLhNKڨۣ&I%1)LLkd`.ۂ#RQC@0YFqˇ1kcf(y2*C;1k+`sܳfrbv]"6(wM4A6-'o彙s΄Ǻ灰6AL.dKgRoz(! \o 9Lv9Br ym" 86!{E`!o~i\n 1ֳ#K=,W' wGΝβ70:AʟD7'/WN=z8[ykꪺw\ KźG+)(0Ez1ڤi:4>w^HΔqC2H)+T> :1k5&ziu<1(fGب X)[K<@g₊n$!}ǻ|zocO24F6ǺŊHяZss#5|_~ʗ!b_SE,zon=KIEUbU+Z)ea*!,Bxx{3ۣ ZۃBe@B.4d0UP 4˜9n&#[,fC]ݐ:nb41>@ փ[w-7~'.ȫ>ZrAL(G%p>g05diBج#^fhb$HA09=}ω>7jSx2RV܇=c TWjF@N$LA'aޝ5= XwĽC̲quCb=r~pt:m+d9|9YKB69j-_^7XƂYX>Hش3;lh;ⱵitllÐՅ#v RdI19@|Q Cݶ 0ǡ9sڋ_d74}* 428kf`~&LĬ~ŕ)X\)ٕ& :]IH9v$ C"̐&K̎"ݙԬ E?yAMfC!^ `Ber"*5tNoXJ$N:_ϯ] zc O"+N&lBḵL:S: Zy(ݒ̺{@&SCz`o.=﫝JIʕ_dI~1>D:NٮBB$wI81۞_=|cM=v1Stsیq/n?iSi;&PF-w>'3 >#AG YřV/‚3\BjhkZ|'kdfձ" hS)wKۅ!e'iuz9?Hc6, ,'euT-aH-{V3#o`=>d?9}io:)cj'O}%s PwG(s`Gkj!#zxjyݹl6vMT15/+=ߪTWwboCсλF}0F(/dd 8P=~:e(+. ^⻰ q4/e}o,fU5::DQhݥZ-p:eBoyЫ<*/#_#MdquGhqV I׻;gbgbMAf缫]BBiə]!% ۨM4l,I,t AC(o<3]a{y99=2ɔh$t9NJ9|֒p'*1Sƾ 2ŭLoRCIm[ V4 @o_.7h1+CLI_/fYNJud2c;)ō7 .<:uYenMY+'2m{IIn%+S^x*?H ~Vt|0=J\ _KIפšzRn +N:B~v|ÚswW!QN쟠ګ"lnޚ@fxҴI$ cuCg~9T?'TwS&'#T]<u;нI]^4cd?N2@1h7IiӑáНp yvJ#P&b })S%!|KVy=yx霽Ҵ 1Rky|sDk A4nqz۝cQPIdP]VMWMݓ=r躿$qXJ<C|qg(( tÎeP*rUD2q GG"XZR_fuRʛ`ʊwˑ-(,TiQJX,dEku(1EE# Vef+B G-H[L.@O95`ot4PdzkK_1۪f e‰X*Wt&DQDH̹P@ن!emoGٿr'd\rEuR6vㅳ񍴋0a&zy$^ܣ:^l%>;…:,jA*b<Eմ:=]v]jr^_SP<,yy*yl0jBm"2zC؀bAh=xqT?ٙo_}ߧ0'-#uqkzEv|9jd/>]2l0W&d $2Jz_ = p#ՔIu#Nk+a* |jT_}9sqXxΩp%qtJ0tu`<b L QԄ#"1/j*Ӟ->#Pڮb~k:Kw羽߷8Vq9v rh-Sx)OO/VߞD(bs˯3U?&˵J."a"p" f"T)$":m9Heb"ehkZ^ ̆ysu6/FrY^rl  N6F#$4X<O坕I(4 E$_\C!R؋p)F743(]T^| v'8x cOæH52}eN00~MG.0[(lccLQܚR28NC̵ׄ)1jzmjQ|,:rl{WFtrrisk`QV@cŌL0'|I:I8S߾s>ur ?1'*?(/xE>W>MzT(FJU(HI 0!318>PTwtǞC Ї┑λsƴnb-skwtCM%}oox3%KOi.>n,\E_2agZ]rA'yğ\) oA/?L 4E n|5Y1"~}΄KPp9yfE,J+5#SwUerD GAh␡&uŸFӯs=M&AU7Lht/ }h c;qxWyҍA# |CeouX{f兞w@֜P tᔜ={skX[p_V/f6n wZL^&}(~I"&u),PI!&`RRCL3јb!%%{PI4ˍGyX;:<4J2,Z0=}}=6b6uqn 6|r 1C? 4PFݤ={0j,6,#ϟ[Ӈ5w]oקnssBQt%RU!6L. SW[ɻosC NWjy&f_4/6|?o?ʲA.aٲl]_Oogo06#`Vk+?ď=J |[hPݡk|-Q-CYю?_{<{ZQLL/C]Fڟ+R$f*?ߥ I]Tޏ]<|zWL~{N$G:oH7@a$s>Pk_L%)CkBv`L6٢ͦ}X{6یptBLJŐIX7d W܎|р=}Nk'aCQpzM 6u%98Fq(US @ J x2Y5Zb׬˔!0 Ja3;7Ң9C! `672A@5J a{=vfݘ>v+>'鳝Sl )rTvFgːN%ߩ9 TYN@ƒB[H܈'Zd+z;WHJWV*Jr{Tdps$\7yQq?:7& O] ټeSe2]3ȴ!J!غג$ uiXtgջo+!u7E)grnVHwL$#89v\ K*v& mia51{GY2t}i+kؕ+䓻EUbe3Ws`?tqyv8.7_,6<:c0i%>PTO!팧":5Vɥ*]X50b9QFnbu8ҌE)zFf#N42LL:u0x9|8Xƚ$hk$g:5|Zx3j+6!8DزCd!'/ 5 #M^:} "I`ٵ'm ڑG\~r˨ Yn+A q7`Վ6U4_ ʨw9Kǽ f3{̙t%0 1ߙ׿ldowgN8)zN7!c't)RմwG hd F`>y=ӭk>F'I><;q|`S6UMVΣ#чqlzzDn '~X@+0ٲ.эb)4B[υK}~msq27 xWf89@ղƬflv^)u涳rb0`@HA V%z_Py[o|6q>|I=v޽&85v8$8b.~9oM:ɉqrmֺw7>OSd[\t\Mo =4rNO;K[l&nc/3&gm9鉓5ox[l [z۴PS}8fڍWVTFS& $pE^>sܭ-ns&\-Jqnk]F$HJDHbl5svgofV]ׯ&+ 2`{?pcmv@|n>r̯}!!pkUU!k`b$5%RLK'/>ީ٦{ SG(bǪVBUd?dtCGz߱ا=>XG96MҜMjvs4vD"'J!Ө-$0+Qɴ$ƶsԡvf7I%ԜڴIR=\"mx[';RWL ZP& =QAٲ8;ȅ>` sǨ5'4r-IFmrLH׮&{iۭ 9(c@d=qqA%!L&9Im<}_2ٕ:ań_#^Pk^1E>1v&ቇO1o l3qުgm><hY, ֪"MF1^)'?n(H#C[Hӳ<[/0NZc 7%/ ؆e" ]/1hLd^z = %=Tc& Df/zȳz}\_Gc0lA?jL$_8S43k%UޚU͏PrŇ`Akj^IӌnASfcNґ7Dy>(:PRhuK I _#qf^ >Ã$Θ.j))$x31g떟>QE9~O>@)zbmؐS7B9}砝~8#R !*d:}L?=Gϙlٺxc MII&a; (@@=6KĦ8*I{sGƧޯ}ɭ& IWԦ%D/_"$=>_=Æ[\[i߅P*;R}ʣ0Gu::7X:uT_6]bip =Nf{`:M9s%zI'/)ިz$,r1"Ey?oa- LUU%LxQ4UPUU @QAEđ$Dab'(*:wp`r}}uNMwxJ/UFAW1_4V߰+> ;;pVyZ4V&l>B)#v*Đbb'ۭ_O`k(,0U*XX_ʙXѤS%a&CSa$ Gſ`BWt*=ʻيHCWdZI8BLړ8#7gjT)YޤJ]^sEM3eU7/N:/b8 4*kO)#[0)N(%<^QςC4KDAܓ_^3& ŢqkDz9e\1^2͙%o)ߧ?^x{;e^-9 e޽_*Z|x$$$v'5Fr(ޘ|;cȓn.7m1nVzu[FF"c] em:!`\g[Ќ)熄'dV@:QpDuԚn 6B[= ]A׹aIN5:4? Iv1 /5҃- ҁPUuD5M3!Q!A[b'y[t,1ai` Z[㴵;z 8Zf1GX w$:pˉ=<3pME'L>!dfA/X (d,H-VC5hTG26ۜY9Voh7n0 U gNMu0Wp%=\RX/G A(d:JKJU4M i` "D)/S%v[[eOX]0顅j8+'/#3PE!t3Apc=߻o`!ph(Q 6aIIEդȣݥꗝçGǝ.QN+C/{w9!!!!DD1V~?,ke?;m`ݳLC>!iTդ<2n 8M$'C$MTJ79():[T`T.p=Œ%g:1! b"O`5}ŵ8Ǜ{ӋnOz~g׬9s17 Abd3A 8õ NҙKj2C ڨ]bǨ"-0hE$\q22pj&E%TXb\$Fdr&"f2̕Ii"LJr!Io)%t8RKh3uҀ2#`1V2’F> i 귟09$xm{NFv"K$l B0B2tۘkۃ8 w| zJ`ܕEI8Mbh>L<1e.`.YE+M`Ԣx"Uo@?^5hГ :{8NI^al̾M '`~r5?_wTYX#7R~eo*IHrk8QgF5ш1Cڂ!mm-/5{0cwk_t`7._#R}3=Q;|x2MJu!x&NM/M; NkVOV $=v?~l!Q!UIB|n7e?j}LJӢ!(`[' #suj֌HdG;j[I[ꪽ.Vvڻ\j%?1xzA}Oڻf`lI];ne(s9| o뇶9nwMO!vvܝ{`Zme\%;UUUTU(m5so٫Xjdk55/mT6ZYJt]==ӂgDȦt&LjA4ov h~KKؤULar3hg+Hme~ќƂzQq?s=W0Kh}Ad5z}_1'\!FneKYuQ ۏ<=Œv &5agok4'F.JN-8!`~I2՝Su0w`X1=11H4ˤ 0C1(tG6֑Nj"KC3PsVOn ePFwں@:4J]QX78uF*_ 0JtQL]䌻7J]ᮒ=׸rAG vLNxq:Abpv Yݤt n<}j1Q"/X_0)g-:bebccr |Sハ9X $ik27>'#a _]t{:#=Y?Fnǫ!8vΧ:JEȍV2tWf!Wuל#):42r[A}jߟTmJ_?o=#1Hwv?T &uEْM2]]u~pR_k !S>pL?}39KV9q M 7R'TcZN ]18_?/א瞜64$eL#F'vOgB)V|! a_"40ُ]v'~ա ]_sX:Znx_Qozz)n¯o*fG[P݈) 8]9 U mxBeWe\*nbyuO/ tŋI镌 QTjF/s$&Omn*ݦU*YYՖLC3Ku).22Q;'6w_s@]2"BNAwӾ1]cx&ۀBg`"|>|O`r 9bb6D@pI=CG%? rzRCJ: ?LyX\ܯh) %=fg'~3v^#x-I5lhޛ~#}\}l( -h>9s>%ҸI@ܧXV7?{XTTe; ?Y86!f]{_/z_2֭}pw9΅1|dԨZZeGl.y|Ԫx6k$MAÿp8'¡`ft.vѳGI2CnfS:u>GxkfHTC+9kD%1oT4٬H^Uv"ˑ0-v07+&pφPlL Z'Z#r+)`3 _-J1O@_^ta.\CXwdZim[HPFGq]ԦUIkVՔkgTVjի.tDӹtI $I TTeyc I"-2E=t2:g#xZSj(sӖڊ(A8:%vM&Q2XTz XA\ 'k\W7L*\Jb1PkD^@FMa(t$:eoWtjS$d^9a>1E&{4D1#7VMuB9-wrMɓZH׿8ൖf>'0abHjbX{PlcXv5$;S 䛚ߕߡ4:FmܘL0 &lg>h&n8C r 0i*VѶU"M#$|m .->=`<bС}_!rm(:.*I Ĕs]TCξ{y flerR,&nU1Ȼ5bJn.**UUUAUATUQUV#9K8nr iČ߭DҌ CW)=ۥ8- uٴfCc{ks{_!=FfʒEʿau{m:_v{/>TMXV*3B93O 59qcJϿ7ja)"O))Ft6wӋ!LI;6@2F6ZTk!Zx٘Hvܔ ]~~#B[G'L'in`{Dc+D'+0`1Z[4 >ED…+-lXڒJ$#w1<;Hdb"("(((QFE3}5 f|( 5ߜ;}֡"^b;k_ݔ %KjXVC.wyޫKשBONyaTkrɈȊL6rTYv]ʚnBjQac?*MEú8\#kX s3"E讁kCked!-!='D09e-(WFt!PD%[=1_ u^l3@`5hh#Ґ78ٻz/ZH^)WG 3JX{#ׯz,s0MA<]g%žnM >G=ݿWdU} 1a⫩xͺﮝe)wB~'P?}M}!DHȞP7OF:x MLL\5H3]RR#  *f^"$,O%x@4U_JLڵaf ڂLW] UQJn `p@̎,9 D]J(P6ΧҵZʟP͝ {Gʪ_[}0Da 7$LFq و2&j5lq[7,e>Z.J{ ~q{x۰[@mf8u@na|8BjbB0kʮ҃c@Qj_j`^h]0*ubbTKbO3 }7+yn@{e22P_WRDđ2-fѢ媢H׮֧j'6vwc]mMm\k~$Yf*B +PZ;$d>5~lG7ېFYöRLs1rK^QǝMƖƆ"3u74 O~Ucp{JjiǕtSQU#9(N㣷N/vaWIׁ'4+A\U t dN(ҥY\<ʜ3A >Qm8=_aG{Ц%н 7҆},ڒ!).W>^njp+iZ:-# +&f˝a9'?ݏ)Q| p[xc?*٫F 6!].zBX:zWӹesQ~|,MTyTaV~~ =` E]<[dp34+Yw~Al`Cm UZNd.&N=ԯXyu&P/Y8l59>W0|T7eЄ(}n9Qy|U=4ң1DrD qяpO\?rryۧ(?ѭnR)Cd u]O2?l $lل8V*Q#אמְ$1Î[5zu1ԍ،&jIOL(F]UsXlRtbqCy@ + I2&Z9MjG[qu>8+"~ZF2wHzl5"}-"CܒWe9n{{]1 DXퟥt7k~h٦#RFr޼_ P^'E+}zN˯ئr%nձynu#[ӿ_sҶ<Ⳕ%UDXwGٮE-\hZ?:D&ݤJxP{jQ[>~<C+Y)a2a!&WN?I3~nE- 8NҘg]q~꿾5)2I&'c;YDumb$J%Z@"s#^esKfZ O\8G55)"@sLJJ,+7׻jі^GFP4&FNY'o84"u셅 DԏSO]lWr!tBQ c1@{Tdz4+L2CAULjGw]%v Y  s}%:'X E "6$ž,D@'C\fa9{_kG],bsV:yLtoǷF`"4P)G֬@ZH&qBA 'g^=5LJEŮuNoOJR[["OkGp ϫ%R:<2- L4g4*TgL\JLڈf HX5sgF6uXjt-Qu[}/!-'ТU8BkBgwJr(`=YcM/wڦ9ź^-QԦ IEp])`ze*wW-R."u\K$O8shOM4VΎFΘ19gY%oߟ.O'7ͽ܈.IWU3a8ԧhA,-G"j5*fGl>x'9X,N&H$tژz6;RNvv=?ÇL.}U[bhU܉"D? L?{5#/lVHa~\ҕ+%cEZZ36\-||91sA>G7iUnƾ}@uپO3'VU3O3(Y&}q}<| L3>%(@2ӍdlͰ29OUomE3DXBaƱK$#H *kz ?8%nQ <:m LT.j{ L(Qg4ܻ z32쑣,2:u&#-:M c,\$,Rk  n:=Q+zИDUp^z5M=7ջn,,$3mŃI!=vo0+K2&}r_04 i2o72룵vW@6Fty) *Mnu+Y*tqӛV"y4Pp%w[ۣ1̍JY9Dm13Ta!OWo~< ػK+O$Zn'5&15SKA'όqиܞ1k{k|#O"Q3,UUOq94wuqf$4'FYi]\`, oCi<rNNY [HSm< DL>N?4k6[9<."R4g.8~nj46n]Mjo֚iz:\ ofOK:T^Sa8AiW1R#oG f'~q Y]'gcTZ$H2ONJmwc#!8345p7 _ ٌ:LB#cV711':t9m->t2b,bB@Ƣd毱3*BëA +Y:]Gfک-c&/RۆLbխK'kL$ fufIfO#ߋl==uxnQ7SMM8jMcuPBFDg=H5EJh=Zsu5Xo>zo5>)_k3ޝq܌7Ѡ*6&HVϨF\|˾7|q: =;_*5Wis׏q&?InۏӺJ? ^xb9MZv/s+$E$k-i2öSl&'&CzyÕxnSxZ:; ˆA ]ޏ^6}Oc4&d4!KW&Ls֫"r]]79j -.3L-1SN”ɈQAC<ىשĈX>qа;/K'"fdsXRz:Ht=:J%3Cz8p$a Pv=d9/;>Vc}h7uj,g$ eC h)i¿KFm^ݡЪj)j\|6T,'UGx%,a拭h %ϣ ?>/_G".7EXӑ˓wlKSI;8j\vɍ0o7zWHL3 ;BШ5D]P!m,؄Q 72 |߻ t؂?bŮk L3Cltd%WzI\B>RN=LA<`qb/:!%yNB߮U- %ݕ- GU=uJ8TT+i&b8v ͸LKo=;4gCƯi884[w1uJ"\&WnB] ` \`߮/_?mC2y #&jFNs(44rhneӶM\{4{~w4Wg0$| q`ewT-QyKUV^Fb^twqiF4lݶFdxO8QwmVj {n$Jc|gi&{-//[vW1x]wdui86W2HlS}gLm[k]~i{1Bʭ{'Mc#~4kZ:'͙6cI6D51d8b^1V=ǴCB|ֻ9E "#ՆaBCwI"DߚuAc1k8|laa^\bf|8Wa=u44cGoGWPĎPک̌3ᕯHBJiǥԳ7͵v)xv&nsC~R\Bȳ9ǕG;>{s'Opw#1ߴ׶+j3:Œ2;"a Ӫ_j4XY-'l%-^ڃmq*vE[R WчEvf޽E!Ab~SsJ$L'4_L%UQINL2|y;iӁ憀 l7eYyWɩLH d,|q()@K{8̎g_"2y/ZWjm S햼tCwq@N!ćN^,LS]m+=Yl2RTՏ3i^W$ ''7Rqv}Y_#d\׎ ;sG{aw9 _<˛4-*6Z-V&t#Ih4Oxrg65#2*Oŝ]Rx2msU171JBE [i+VKSW\5WudU}UB:z^Qu뽳2mYHZgqфI$NX`Lygm$GRgن%}=uK/!ja;j^{:uyCh9sқHe. EU'ni>9Bfd:9zx | # *Q2xfdI2vvҭ>ީG1Mz;@vH=agmX PD?q촑YxEԔ=HQ01]^X"0Mp6J)5 ZB|CI$I"sz=ХT[el%wYi49?{!3T9(O-_5(WE ctK׾уʶNfanHYHά4 od*zVJ &ʼnQI~?oYyV$|IBӉ7⚥m<(!$2<寱I=Bl'0kG~[ tTڜhX[$}KQC%U<т9PP=1ZI!$,d}6pϵ㺳RtGUubHnd 1lv7&1-b9A[CVNDvHL2L7Z-ѿdzǼ?=b|xc.gkGvҩUU~_ ՁpŞ??7+ԯEp ZRM3-) |/vX3 ¬1u %v}0D I$Ne48KAydDϭ/n( >+4K?n;m,r"ffݶżg9 ڝ*ɂUOݖrЦZ'5AM⁻x2JG ~{7TbA饯`bQ͔2_+jR3̯]S v1 313۷n*ú} K;;$ ? r/Tzc,YbT䡛XFDNf I3* E$A`&vΌ2a@{`vp;ID^O'dƇclrwӝ>$@X%Ol*|LVc:U)ǀwvHXI[&HlvDx={EջK,VHɮ*P])$7?< 3>&s-U{ o"ҦZSm j3lk'T$̐tl*8Z:alMqh,P`,"QywšHUҦ OCSBmQ/QUdDTGJ X#}Q|\>r\ycqQut^X~zpF}-<(dy ݬfnl@juQ|mt=dؠj|{j3Pӟn굾#M;aѠ:G8F V&:2`O6W?WUokQiɠrv`z&q͈UH$֘/8$h>Y-4s(s3|747Vps6Dd`f`8ڃy{HQN㔈p] svV^]\+t՗v\}WBFD9%T1TJS) C LĶRˆ vM9 T:NL|yb_5?]$?ʗJtGT29/0\&P|i%v30SFcQqgi?4eng0{wc2{66js|L-\2K}߾!$fl'=== 㮥UQzx]۬F:{bKԾw)^|NmCk~+휮L[Bgڽo.?\?l¨ʸpRrd{h*z3xW8h=:xJY0Tb \i;-g^2~yTlpneX9Rׂah^sK TnvFTaV6|j 8`c/D%_Wx]5=Q/1f6y~XlyWyK03Q93oaf:mdr 'lPA$ZD{xhNϥ=G] 2?0F-qҊɛZ]HhlxVe'պW-3q'k2ǟ\瞦!S] zoy#>xeU6gSe'+jBrpgiwB,W lDHٟ(IZ+U5yd<HQu1ݗI|d.gM;u}ny윮sQ\| .BMlU:~^9Zh>#danJ~@'33S&n>%<nr;1vM(tg8:1xCAf<>nB!x f(ax˿]6~\kh~0WʕGzq{vڞ6('ЄuH_*{ˮ7Wy7SgPrn]:( IE^ھ- SE LTz򀢬ǘ~IU-trN"lpuN#vĩR qPJݘ狕Nʭ7c$ y:]w7&sK¿~~*0./ꠤFU^gr" zM7KԮ𬫧AdpꄭBof9ާ"_~< Nx^glNTwU_Ui z0WJҭld` `伥 /n|oYlRkVwC|T˘rL&d,TG֨;Ho{|yPSH+={{1:!fLq"C8=bPY(R \u:)lkWIٴhS)o M-t}ٮDuNզ3㊉=?1>YL3:~vs"=u ürEU%j-\=c_3t2t6 13fC:dٛg4XwR Idw8*񯰞#7ta0$mu%Lu@E("CTyI"RCq?-|oK98{pnC$40d X-ARRSJ̬It̰Uߊ,HqDԵ2(oԁ15o-꓿>9 m~YnM)WHQ.HB-]>/u{~דu, WT呜KјW i]F^`O||EKu\ur&Q_;ďpQx=^!擣!Lu#;A&/ﳮ^JfV VNMz.D>]8=TI%rto,s@!ܘ#QZo#ToT؀xH}QMp[Թꖪ'}k߀7H69?ؿ? By.;TØڣ;cl^숈aF;!WWAayQ}I J5Bg|(7Wwlch}#YУ'$Cf9ߪG;JȲ4&~a 흷9f{E >-X ];Bg7s3ӓ~vewOOg|RJ"~}DaOFn-̸|6.BXer~~nWɮkWk(Y`ߦg|v;ӓޣ8FgS;*8̹2T(HtC'ͼmUXl! a釅Y;GXՕɃkJ0a? ;̊..`,!Q&`_ھ; Si}kB"rdvjaƠй1Nd2 D Th,+!Zu&1M͗.)M Jo3sJOэnw7FkluFk&d۱ t _ Q-V`ȴ:| 纤DUEmޗ$!E46Ts<| i? g̺Y%* 5d(4C@62 QbseB #j2P`o= g :, 8p]Ùva܎ؒw`^J McIq37BC,2n.AV5c* I߿_9F>0INOg$(/j${J8(V $`Crw,;svRҵ£R)^V[څOPVz;߳.>JT;ҥ&)Տ pҥile%u)'xPT@&%rԯ/zi*ƭX'Uz$ǁ~sgۼk$y:SW>8:fҗ2K}K1ՔII>6ck=ff/T)ܠī 4DcO?hdo_p{sT}SJfon2xKk%`P^/ ae-Eggb4 /޾iPoښ"6Aƚ7+[7 ̸s9Lp/y5F/-'>[zz+ܥz:92e)wP@;xoǶ1ԹS9꭪;5U|{neMvmQKb./vc8F$? o$Vk|wjmy{7΃ڽEKC{<,)YvNWպ},ZC0/` [&5m=kc2e؋rk8Fě&t[I^r!ף8? 7Y5U{3<ߵStfZrojisřtUi÷,(@#dրZznr S{q? N9Mh^N}|^6Ge~1MUr,W|P?e<,P0`<#K>o/}rPzǢJ=HVkݘt^_Ø:v1xH7Svo[;,5 u,{>^MQXM9||[wVz[ ƦjoTgU\RFy~2;KCȉEKvUԵsӰ4,ݾI[AJ D27^jy=4iXz5>#cam 7mĸ½WooA~JR &HF~$Hu;߯C͑^UWNAB01oFXP02F3 C0?JjVDXBT>ы" 1p &aJ4&g"#cƲm&iC2/ֳDAED*&S$O ;bg:٘MޏܿӓV y{+ g꼌%t UZ@5o3QJÚrVZ 2Ԓ][>{w\7ÐmC-9jL5oH; }R:\̆H@-V;G)i)GєF)U*-ž4@_G@D0y(}>bڛ?/6̷[j=d_h;6h4d&?C5\6^o$Qt.~v &1+Wd<G?;=5kD֎]s&c^B3Y~(c9FG*pCRbft0jᗓF㛑Y9s:tp6njM,_cb߃g7cD ^;Q$JW02"Z JwCr?f E"];LԄ(yI&d':R "I\зmR&0V f2QN+"a mx'7TWm,hn>)h:aݿ*"Z f2I ݡUDbUC!R 'ɓ Q! T ߽2S3"BVV0l mHfTLB[eJñ I#ݧbJD&'YX9l/Vb-J2~XߥeO1dfً@c0F̆|Pِ!s< cz$C:ZUA!D#PFKd7;;/4ȩa% ƾo7B !4‚JE?( zi":-I H{2t‘1 SqJon}ACyکժH@ .. (CIGG?6o:r>^& b)$Wс)츤h*(/%bb'(n4/cX`QE<+0D%FZ1jK-#K0ʯd`t@aՇ'$8P lRs3(Á8aI7T};(RJ=\ !D34 !D~h*O>ʪĚyY MZ@跫VTDd:A*X0?x(Oz+@}l  '=2s]BBqGwDg/@C ,)9z "ylasM!v4)??HkŬO7È/J 6l"Jֳ=%!*Q傐H~bMVD(b8Ϭzy%a  i(uFF[ {]~-EŧQI0|;`_[-f[-Zd/\, ,l,k0}6w;V{8X~/˜JXƨa@Qxkh_(>zs 4&b}hE gA34 $L-#Azt;8_~^0- 1# # kkw@ 2?^F`6!69hwb4xTPh`02 euf }-\_qo~i(%D#Ҏmşwv ~G<2H v|e{yػ&ZW0=ݞ|<<ѧnj52bl 8' , Ȥ!V* I ~(HD$My-*̳hn+5N51lƔFFZDjma}× {`jJ{p3Yw?*t5|/鵘Lל%~~-Ѥit> ZOWD{/o~|~̿^w6Ӳ۳8Cswh|ޛ҂]tvs=t]xO#ӸPscPap=8Rbc.ӍR$G4D?Z e&H* e#M]q"ȓb;hd4Bq\{I0Q ;bX#bXĂdӇg]UcDB!}h1ZHWɄ` H֒aWO*B CFH`w`(cc'Hv{g{6zEi B_ Cpfd2`\ԋéۈCPE"RṔOx a V*(럙4B&;F\؜'Z?NP %M)? |b=\trMlC pEM$zV?5TH$1Z03} i!HHL(M+7ÐRS6}byyIC_&(:xLVg0,qCST)8U^?i w@v)*PjIIT!A@40g9G|5~4N RP 0 ~q$DANmVtJga6ERi _ǃDa{={ccKQ:Sd?LZ \BY\'h"{Cv,"T~L."VJtw D4=0bB}-B C'?Uv똔' Oxth Fc7fb S=%{yxW xÌe %$f`3OxĆg@&!)?ԂQ@U1aJO0>>x9IW aDELEQJGb`>ĽO|{%:B'!vw4O(V1f#ˬ:bIr+T,@R: M4B~iNk7iאŘ ,"p NFլS`(xjXz7&~OMz'K*pwB솁jp( g>W$9JP?79)rSg OaS\ڣ|-P)N  @;3$`@ځr1'(h3?n/%Bno3%̘1ѷ_ߘ.$ɘc_Ѹq_ L`;A  P>aX+/kCinAib&f9`xwf;op;ta!Fasпz$;\ⵆ H&iMKF?d>8+p1 04@Y'˯N;'䃽:N͇!mҙ ~?{χ3 ?i:2:7jwO0;О+w+gZ BRuHB">SgPtBS eLBCsHbGC%Vz :!|zt}4ǤRx@1Ma0A !˾Rw~\PR5Sin78}i3.zu*֩<w/9Ls!gaU#ʣ>uF_ҁpF(0E9A5Uvݼx^w}\ x?ǡ/ j<" #̲ƺLq= |&fAD]p#[~v&> "8'Prfdij7V5&~`h~N;6fI9EbSɄ!]FZK;lŔ2yڲR'$5~ؐ^-7D;һDԆt#"Od^fo5Y ,W.C1lW9g:YS0q}ρ:kNC_lJu9cckiयLw49udQXB:44BPx>foOJeǟp)ڔvƿTF`*FޡZ/'vFPLe~G_,昇¢fLka}[DTpM[ywFHNLdZ)T㧛Ǯs>QÎ+OuY k׳y0m=|p(-!:{G$V<o|ԔMݿ=RLLb!uW(5}/|9νrD sO^tFmat%[:|S`$zǼr D4EI-w! y# gfˀbY"1\{?&>5+R)FTQk]nfU(ml{ϖ79oK=/w{VӁ q9ӻvdWqOeAUF3yۜj"s\G;RH|:hx_N c;w㉬+u}>tb5ιm_:c8=,*=ڮ0j[^zېFS.+k:s:zSx-2wrcy{zC;_۽XF͑9:xvy_Xia{396tG;eXjPP@wn*mϠ~oω~c;GZO/=u;1>H$#k=_ J>V;o K+]ja [jZLMvư)edoH]gT6ӁiOSs]xǙҲrW=V)p mL$X1:psv$W&~i&>d361$ B@B樛’sYaf"Z~=u*X䮣*DZ|bZ}]\|~yѵΚݥz ǣ9c"vͪ`)wͮMA$s7 ޭH:naT)qo ~5VpmxOq0.f{3dh rQK@=M MeU>,1LQ5,LT$nfժ0:8`hUSѡL&qܛǑҩ~)ߊcY]uߣ y%2 bAjfbU@v<|eqͶ1~Yx{5v-UwܼËs{}dNU &O2#~Vg?ܡ!Y.hגpzswB1c1Šx@\]k+m*kI8uOX\པ;W%^7GҎLT.nͰ=pn Z_՟WNxȌa:gfG˻i??5lɍbs}`[tEoA>~Sdy7$BP洪\S}:8L0ۧhXDqɲw5iz\ŁhTUB#߻[Yc(+ o*v+ ƘFF/jFA(oDY,k5`.PVck+#9:g?ڼ0c3Ms.26X.->gܨnw&ۄ6e+])Bj[s4#c"LߧYyags?_qwά9cV}=~_Å6KŅ=#n!< *ba~O.ZY}<[ekdՃżk2ԑ_(>fw5A#ǚ_lJ5 wc='6_o7lܡ-i˰ر C9;dH \y.ߋ6߆('Bޢʮtue>dV_z;(KC - /U zݛ3LVmv$4>*%'8 ^Cr${"?`Gҵ"Z%$ {vez(pY$x@7t}&9~ѧ)|px#ɻON\ ! 8ˬ\S|k厁{3}MW N}l"/9|[W 4%N< 9d4F"v>~5jk}\=gAXWy(_-Et]n`ouxw!ȡuܽ:oV}~FWe-R)p q^_\sYoA.Đ3xGP{>*&[ '9G-y㮍4ywd:dPIlPYQEۓ$ArEhފVFtۡGUћZ ۞i?a9b;q'ZYWO^x|DzqG| .G~zO(#:UWVb<i7pR'n5(u-Ґ$}w+RazV,\ɵuT":% gt 8Edrt9B9;ךAMCVHK|<6s4n΍64Pێ.W7kT>n۝}4tN{_1jZ(&uu>ݡv KzK9'(v?'HJhQΧ|]"9kz#D-ݔnZ ($} `"t8,GG<ۆy<X'UGTm]U'z%O4!)VxB4Ba]veףi{TuzԝTr3{,O渣겼C!C:,>1WMU͎0~a;Ev0}BUmR=].sm&~ү]ܹ!EL'K+9&{#bt8Bv=WF'* qfB^quvRU'}}ruv]᫞u!3 weas/O̖EF4ԠSkXd 5!S(qE 2nSEFk#lTv'ZXFХ9QYC)AK!h FB0 RK7 W$K0̪I[ n4I++!1"zJ4+!Y9 B@氢B( $P%CcD$aMM!!+7t׫D$JRA&`( dR]J(gqN{?_u,|h u8"\ w, DߌҒ:K 咁Z?IK4)I((fk.h۪Nı8N}tm:q%֖g`7-amO$ ssZpJMOvm=vsxP|A`0 ԠwR/>f٘ DE>jɈj &*I2\Wp@Ҵ ąRJ&aJF+~P9Sp!'v>@ bi! `b R#HҨ~(A0 N눢Sw% 위,h2@ g0H Zi!%Ob BP!H̑< MI iA& g4HRR:䩒 ʚS0 ґ%,AA!MB)NHqh š0 L@<…BN [V5 dԨC$"I Ki#wZCJ9B^'t"N{OiGpH "R|OdM}49Ah?nlQDL{dC5 LSgkJ@u* T $͜ &h|⦡J["+B~w=yb5?wuw#6aљ`Qۓ?odt67[+?[]rma`noW[~7:|gʛH~aouzF$k3\} X0G$qk3rp*?2΄;+Lɔj:,UrIĄg<=hVZ>dwJ7MqQγXs93<cMtz|kC8Bs)X` ׏``x.~`{gT~mU1GBC 0ѧ):Q3_q*PZXJ1`7J6#G$"}}?yN`9FSب" E)<ǔCj,47G~{ xWj0r- U>+Jcl>zÆ[^}gǪCba-~+su@r8N2kvyKp/3CE.^=_|y;S;~8no |,ϛ87n@\r/Ps Ѽ@x 3RLN35U=&9 pfv6KAƚ&IF,_TIm%͚1Dאt?ߝbi|%CpTV/ko޿EeU˩yדeYllW s' oA':B̈́IWϯ]uos_~ΐ#icN4s{A]Mmݗ߻^I$!$0 $A)vHC,kV4en:b\x3"* 7 #kghDe#J 8bH =QݦbHL^ +bP<]J4e9a]6{%L`8um2}&2-UNm;4!'1o.(E1w]1Ǒx^%P8,RPlft]y%Sĝq)^5/{|^JEY܈pD44K bb< 3|TA+:Vf(9t\P&|o-i]ɉGP׫;ڡBT@pr2g#JD2φ2J\}B);J5RQINLYyKVǨRcP( i~%c^@8$G}W'TRy:Z2} 'A̷uZ$!2/iea Yن tjq!״؝k 9V }ڡ6NŰ~*;k4hx gjg↣TY$B4Ў<!<AWe361rY TG۴SIh=;>o\Z';~Y@}Ф|F}[~ʅ&—䟃Wv#lASZ0yj}@ o,ac=];!BS$0#xt㸥"-H6ȹ$(UIys XMxnňj,SxG-oWdkʋzu]w ҧլ){X)9zeiXBc.qb?~X^=4XkĜq=`ϟ_F >IQ7 ;ݧCgmd U uɰFJ[pu%s v[}ꤖ . FߣhI5[-u]'r0>& 6;gk<\ lmB珘E~Vm @ %Y32=2yKr!v{-xC W;˭I!|VW=]^0*^3읗I0w raVJQLߑy jfp E12k73}?\{xp.R&}0QTz=;z^z<1Fo7 Xe*UU+Zk>$\:s] \n^:݊fKRQbT?sv0| :D(y.aԷR(Q ;1NۂTHM$IL\] ALC0^e J "cN 4UI)H Q)v2ug?&}O1M >,٦`Yыo@Q~9Fl=? ?@[=KDS]&uJ")=ƊgHt-HJCzuNP?4&z͊cHA< @!QSqwL<~$&͙&=Ј @3@#Te]p$*̇鶿}D30812E)&egQ bp耝EPk~ k>f^3Kkg6&=C9RiP< Q,pd&EN]{01 Ww۞wҽ _.mÌt[t 4gNϠ0ifSJuߡaK&5*o,ӑg=D.(:ޮC|t2fS8NblncccIu;&%kK.1^ǑCIM EDmRI'زan Bq|ڕc U:}a]Y#̕HRQAZUHKmg}s<&3,D8Wt cxO'}@7ȅ@jE>Yj Q$LDYI{I~…ӏWs?֞H}Mn<'r(볭n>j@Bs^8i~ʂ9L:!ۀK`YY8[1 _1*Gڻy2N΍!UD4#.@JW\Y$VCxt|0Sؑs4 r?vOt!Cg BFлDqGi1$Ifkc xݓ!pb@=ijmm8UG}6A|!~͊† dhiG'˚J/qu=m.O3  k!_ܐ,D?m J^xΫi$sRwKY$4>oDེC0J**orW 7k7<1RX+'嫺EuѡO)x4d"\(8RIJv 8>Oc>[AAzb HF[:eW]*[ qtAJ!+̑cFoAr'o|zpϷ ڬ9|kBm/ڻ8wKjKjyCUwSi#Ï v^W侴c; 1!0Oqt{ 5PP=B̘)3[-jF0$f+00}Ʈ q(E-.LbUgGȠ=[Uug"_' Yg~P8(Kh-ѼԲŖutOBή?p2|կOif]o,- EJIq1=ySR+%Go{tO?>GS;} рKQED,'8/{+Zu=7|Á5T`q V@z<6oc@tnwavČO4X!P,8K>H%12IR_/+2@䖡YOlEX~b ?F[[49BACд)2eN ) Itg}c3>q1*1î+EQ"NZ#ow7+s #Ɍä du)C;sAXq;m1`~Cz"IP!ZٷBmZl v"cdZ͗x1G'DGq"N#ID:t:|}fGւH xgRT&TfHQFB"@z=@!?.qk&jq]yl_o?>3џ2NTB2 Ž̥i kɵoCxe5b%EuC9/58&2,)q]5T42`Wg!4: t] b,^х+sRfխ"`emy ŶjL&r#lbӠseF gw9 *cjZ»#IP,4Dճ<36`Z]qR{؆l[JZd/TdF0Eg /L9u֪vc҇9Bbr<cy7./ ,X$=GR#N ;C=~cE.5+BbbÁ"gq|&%6$ u9*$DgRwH1g7f-x?Ka 3 D(PY:Vu(O?nxV'6kYpvI&3tX&5p?sxd@0H@ZwKT FQ7 'wH(sZr=u}lrT0핢#û2_)n)4'N^!f=|v&>|ܙ!J_5PU##ߍwSH8 <@2Pa V>ك1C(8UAW;_dlz4ݝM5 z/NUDy?m(#`Uh՗FJl9;y$2 (Q:"QMCO$?2'8ʓʇUmWPK/n~~f-HB@¿g$Uܐh1rN:{Tz?'b!#ӼFoGDiUv~/˂l;v037QFq*(t6o]:}[:A)9w?4?@tnpRL"P@eO"=s+BLR!)M{B;aGϯ$=pQ^$M(Ƌ<c~r ޠ`,0z ?WXa?oL$iQ"$c^j`M,42Iierdl(Z X#FUUUJUEKj1ZTUF"°*QEThDdZ֪ )RVUUV9QHҤ2.JZ(JBiO}Fj Ex|] O.{RJgCl:C3vBhIB冶L[]RxwNTMnذՅ!&t2@^:So_-zPP<1iDp'>. xPWa&fp B4D<ûZXG'B<9դ﯒[?h=~xO&>f dVH lI5+B L%@ =P/ ,9hY )F+#8LB/UAjk7$>nv5%I\Bu US" v-QvϞ<'%wo `Կ*Ty 6f\G^[nd<`5~JRKΧ+a yamR=@42>px1ڗ_;c-ୱS{c AoћJ6DX㯺 qy=n&:ƩFay` s!…`q6jvHڛfզLح71g6oZ3-NŸc2Nc%rL] o;@m31 4}\cnE"^W-YDq=xWcnUgDJKEIRP|!(j Zbb )Pk$/рMB A he")*$)%w8@K0Uhɂ *Z HُPBWm*_M؅;ʩ ;k N0 D)G8PT 5$&Mzmohy8m9q濯/Hqyu6dvvמ08:I0@%?Jf ( Й}Z "7ó={jmncx(8_S~ffcc31zH!`()AE{lwau HJ:ƝBqkE*˚/#%}c6@2I{fPP}K*BTb݀;O勳$$>=>YU=uJo[ vn"/(t/a}Xk dߙ{9yce* `5U>g(o}&(c0tAs͑0_%f&۝?W=E~_ϯH%pQ]9ll<ٱč2jOYw X^ +-*U W;mϊy2*-tD?u㑌ҿ9>5k+Lc&ܕ+`|!LDyjR2g$kۂ@Mnvݳ!2G1˨l5,:fgm*Kqd `!~n<49_'ʁpr9##zɀD[~4`nUm[uy zyxҧ{4|3LI0a3_Wtx&OB~d|L4+/ꫪ#= pYn^t)IS8^ZGJQrڹfV)y#;aRĘQ9|5U0RapͲtE9||=E㩅o|m ɐ Ħ8C@*a UOVtρN=` {WIϬ`^:'-6>5tG^# pUNUeHUZ҅V Uo_WCϟmjv3P턨|ŶuC2/ʽnƹ^ޝkW}Fk:[J+0vYnLu վ;}%u11 2$Z &)ٳTr^;;;%=1q|v7qf"",e'cJt`dnd+G$h ߪ3|@ND}OϕxPyx^+Hv f nk)S fsp`ݮ+].9k9E䞻` M+SyǬhoyc~O(Ύ3Bf'F&} lfe2t*CFXXIN|gȢ@90v"6p?mgbnc=zWemYM㞰˰i7+,&ef{ԉqެ,@1ւ,P:M`[]M=;:vf +;~颊4{HbYap(z];6yt.u.x3> /Evl:ݔv*cQc&Dm$a gg]+jt SyxCw "\}mT!4RtGt׆w;m0,HA@,K(N?ZSl>uEJ.kBOWQѯlK;sOF'CHP0Пfe%c?R 8f$0Rw}&\\A#9LiHZ[iFI+7~*QFFM̽{XWZ+d"!QL`U*ƈ G%8ݏyD/N2{bət8[UY]t\f q~4f_bTHu]]ogT>St5 e<H^\#Bc??ΫW73FV%KR:]C FQQ"Q͂ 6K^ӯt[nY5^*fmCs e&7'}<~))ݲLo&ضaf@ݗřEFf+ <5tlty x(b>; 5?fi6|,2-mDkLXQީpp(*HRA"@M/7 n>Sf@M ñ"($N_;< yB7)!Vh[0YLvdZ;4ংLm/m;-*-N;135;j'I}~c|뻾>&]_͞vO0u乫U_ ;qI2gH"u R j@P@LRj$RXJMJy7txQtW[#M h_ du;fL$nXƯ*mJi_ s=h)~[Ǣ5W |r.6oթYjzyӚ]ÞYU;AHw<2MA^+|/~w[=6#}>=>IĻI;CY'A{Uȇjw։1$.\ 5U5UI 1${G'l.InTdɋ93tA $fFrM>k^>E4.v x96-HX!St;o(Fy>{3=ewܑt0vo}ezva vBRcRgNj 3fmzRͱuN-Zi?IU3  ?3%GIY*}LKi7Qs{kć9`omgkC0 i:0SxE(d#ʙYUXşuUZ,ϣX3H̬,8T$r} )Qߔ[p6׭WQRwW a^o>ڐJnp6TC|<ÿD&~Mk=.&ѥN'}8&q҄[PTR*KՅ<+54Lx>9atp Wѣ^k컶l7T%*錪vMinHmzȱy^Y9tz]:MlތnV;z yj Ne֛佽}2*HЄ ˢè5;m9E&jH D*G7lqj]m34.lNoeHzǶ~)Ux@Mݝ8G Evu6 ~⏧敕ѥ8'چS"٦9GLa؆0"-<51)9\2h8Qr3ܟŎrIRn+{t}4$GXB'AU=˨]J=kPU8mh5q }'op.uh׈6Yy5"="ʽwq[vX#BeQ)8ZG [,#ܩ ʧ3P'ͻW2-[g\GPMB1|Hi0Y'LIQcM- 򪪪I/_˛8s@ћ;)]OMVqv8I[h4KPqi srw ,87U#y_Ts[q{ {}m8EiNmOOT"y1|1E8Rf,~{EHb }y0zcrFukyECiЌKc9CK4ʚR*$]ZȬߔM'iHǯj`׏%Bfjrt]VY,N˰eq۟ӱW}^:X'7aZe`(%z|ִxQʌ{J!i!7wUl$@򦎎|Ǝ-=!uu{d`3 2͞7e&?qׅ3N#Bo {jC{&cC#?=GY٫wWƈ=S:yֹF4ٓ_ں D'eEUfze |VXU!-pwbYQOF%no_?ojqwjֳu-I*Xac|zps,T9;Mv WMOUڇas58һ3jeuFL,ׄn*qmߏQbVdUtXF.2ygcTN\ps8G:A7{q}in(1?Ox񼚪ˋ'm^4PBQ=d~4A%Ԋ@Wf3){'k>=~;,zW{q&f@>'ygW_WkoVy山L'G9yT3}x[3/{T( H b2[7c|Dz\ڷѹ-r{YF|]-[_@S/IV߿Jkp5- )&=xBE5ONMʬq}akL"~S%˼P/M*w әdd\UɉXBm=P0SCڛvñF7*gNN v~o}hd6OMYAlHk70!@gK0ISц]߷J2q3C6MAcU_D% ]qEiဈD8F4a&hzȯH7 {kc; 7&M1@I`E\4txߠ1{rT pOD;k;ϫW(NW:)UMĈ?\?`1&bMXF@l%7ĺ^=VlŐbb:W!C_/LAP91ej܈Br{~O ?HbHHS321 ys'yuW&LP.PuK"`Ў~Fu]dRALLV44A8BaqB$BHV`J,|0ZTd`0P'NPE@|85,T"1h,D|*nR tWY FHDPq7tS 7bȰjUbfmaR Rٚd]IPYP)' !!0o]ostFIB" ( 4UyF%XV ED8,BH%9:11XfgGF uoC豤X0yRZ"6flFu?Seܜd;(A^ "&*)e*"()ihVP BcJԌSh+H"T)[,+XA`Hf- $wgn*dTe2AB$"IX YH ʰ(X'!i ;IQi-փ88JC6#BHi)%8C~ӽp :%*!ӘL$ $Y pÎ-@>F ,HVVuiq1dpKfdhJbBX s0p(pZ 1hC!& 㦸) 3rL'GiBB-oX!IgމLiBZ`&ܺ!MJs/\v:= #!W4 i?Ű8;وod͗#fgVTonQ|Usg?yT,v{Dk?sh39\? 1*Iru_k|,DEvIs٥f5UUEx[\rY冧ǡЧͳ^uuxK89Y/z\:{L;TgL8_HjV8zP>? I!{ܝο"17aj%bIο,yixp2h.!6ҥїoԗtoQ[֤v q^r%&:̋EsJo($[3sOG0EJV^{Z+F;@$o!zVzBنO+c]97\<*zKաi *dFiZ%e@h a•J&'Ŗ!1Z4 9\v7Hk@}lHgc8Ѐ!Dff*^X6h#jy=3c >*AZ\]lc f/A/ k15|n]i<>e=ZFKRfYHjs96bP7N2OG6TQn~ ːj%IF9p _tGU\Ī*9B?uOʘ4RDE ̇8h%5F͆ $7LY t~3՗=VQDO"BJ݉xP_w/yQ6iɊBM1ix~z{Χl'hXaqL{1u'#&C1 ) >Dy~Iosȁ tnEC]xbOYw:X S=̌JJ*-<խkUQE5@TQ @u_!PwbD :|G>|U$a) !zK/$"Pns! |Sע@#bD BP+bHS 67< E_5~#36pBpb@);fp`^= Ql(EbC!r j"'(8v"<y{I: BYCCdh, x$T5Q~ϖk_o b`P{L;"oy?ڄ݇&L@Kq"olk`1҄h"q /|Y0;ل!5d}"QL?IyX?wVϛ詊-Bjwb?8@~w} S~,q7wOݱ_UUsh':SBk1 )QDIUL_b/Rĭ,)G2ԡ#bZ_ 0/W섑 X4Aa~ӿs{0?*p*h)qCCC,zsNy"K bOwsCā!&)  |ը8À*ԾNO!1w4&ܫd6 c@H<ڻSiף_T|wwZ;{a=]Yd\ȯn,뻲wѰ(V9X.(Ql$i }y[P?NF9To#<:Pl/">A5'?UWC/9 pO*%cyv? "8Rp/[kADs B^Z2vb$v Xnɱ䓦2y5|^푽8L)eigD(ՍETEUDN!ʼnsWfyaffw_3q$BI-% DP,0\qBЛvs&A@rqԐ}] 9 jz1d"J\X ub|K{刍89b\pwXsRInI! !804|'yUDEU~C]I=ȓӡ/s^r;*ɀ'U!_R$l'|^MA0Dn:;}O>kAh0 J:pp8 %Q,m bf2ѫI7ZAb`sJ8i={4Z {MQAQXkԐ`bBt!sV)6g$:Cܧ2JxEB"͋,q>dZ_J=F{@iEW !ѪfɩP:SUpMk59'(?hwC0?~掘$Ojn N8Ӈ5[xTN̡jkt/pMC3K ŭgL0)+i2hS#6ug/J7<% b-;n.s¥ُ|J[q;=beYD[Txw!R?ǟvlm7xCdTW[w$ A]tmN*O /4E 5:l&#!̱=j h? n)L㔻7 f &붑 rO;D^9A=( TI0˝!ڦbdd|60,|gj_J (gUU,豏a 2Y6BE_9m<*F)˯pD@6>'RCDL2E4@~J }$cePT2JwCqwy*Wn42Xl4`9X'LXwcl`9CA7uIpO mxPX1 Ix'=|+\Nد6" ?aI>_z>eT\C~2@}#xx–1GW9yQ].t/DCfKSv Ҙo!i<1(I&Aؘ:ýſ* i+|w2ւܓyQ9ǖ IBI{fou+CX

9I#,'ݼ|m663iL xx T S)*"jR R!B/t/qD=N90]*L5 OUn UؒF$A!=fL}/H Azr@'q`@P%56miS;S;S;S(6pWP| (R嚝> 0 )5A &W="쁀^`}"tMHrG[:CKso(V8't6I8 |ԉJ ʂǚ+#!)@3: œKD@5( d[9=P0+`J#8-9g'D2 cUHI-L@ h4 0n \?]Ț{ZN .C} RICBu3&C@R'GR~>b̡*( ]? iR !0G&u?xqM+,3$FP4Xp!@mwLF*&}9v,4Lf3v ߦp"; ?&g7'=K ?Ge~?UR1Hu&e[x'Uw2)dsYJQ cؐ8a C!`55܊t_`L0{ ]UUUbyD[?w{C؞J?<`OSqz%Al8]*6x1KG~V-F-f )CU4F{?$w܈LֶwQSm% Sls!WFQ߅GckiJgV;*,r0Tb!);80\Di@qNOX2a"N{;P?yCR,JaVa#NUt!C0I& "Z!tj}<>ZhV)(`aew~?#PANPUz(ʢ?a$LQ졀i10D[;8dKX AMК6. *C!DJ)*&Qؘ8b!(0Q@ E!aaن pQ;bQ'ALP'틭 ޞ0=V>`/e&΢H'H[yjAM+C8qSZlנƥO.*)<{$= IF)6R $ d^+Z>1q`iZ,L ( ~͊.&%3h<-"Ӛ~޺Mа0` 18S .w$ݿB9DǷ@3TթUkZֵm%Z]T]CSּ$DQS|? w4h5TO@ Q0>{} #>b6mwA0FDjZE /L~!Y^6K2 ;ޕS0=bRq)bjX! P D͒" N =8N5.(h0;Z}pȇ! `* O; CH;B z[lJyf" ,g=>@|YƙY:Ɲ8Ǩ#p_D  #jB"[vq;%p v "F >P YzIS:`y:LQ|8 5iSU RB;l$H!-_Is0$@Pzp+`A{ a=OuEW( c6A)=P'㭠GH ֌JC)bZ(Z*x(G9pR48k8p1ډ)*Ab Es0) M _aPyK]=k?`º`ljnc:kT0&ɰl0հh@ί>bj<Dzr'Mg2萬0 Ҥ i;}Xw@Wmgp"T Zi"(m1ɳ9͛ޒ i2N@ࡷ YfbXb"**XyC=!$pSc!TZ;q?g0N19 @ퟴgӃĿ3p֐@ tP@`>y͇  Gy@tm}9XeLe=K A)9q % m'IɧX&r4AFx9tDA`x`:~`UA("R9WueGDDiO#4J\33jZxI On8  y.wHT4t+5%-~3oh |/שO@!tЂm@hAqɐ8^bAΔYRL"fgVhtx/Dn[e( %Pv]E@xIYPd( hSHȪ#1VPDE [X"e;\(dr)Ъ@좈UA@O_Pw`h3tӗo ^v|$$|3y1X/jv?dM$OF{.je(ߢPJ%R*ЂU, TD-L++@F(PO DSʜ[@b@Ia Ԟ%BGw"VUUTEQU0EL=NF@)uy<4UlN2`.g5I/T<sb8 ps; 9׭f Ht]g]UA&.WG@"Y !5 OyY< sNn { >^ZPX&[?pI L~d)QH#su9vFx@p)|bvaHG˳8qA$Tj' obwt wr Ql>Ǐ[̬Ovm٤yGc..PخOIJ 2CpaxBԞWŲ,θ.3*?Gd|H>!RM-)j^dSU)Td Ak`l+2r7rG0{]gQHx3Jи/r✛2qgR{#fHP /ހf6^>}ф1“uEE?T srih!A8_.`.8,Cw#pk梨(Ս%@f>4?c@RI,;tO &>` P{&XMlB`?V#܃"HpxA+PY,(2&TM|[?>be8]:B.2Sa0/a'^tp>HtKCVt} 1EzoES\uخS@@„p 617 B*l,)uǁwp;pIkT=ݍQ{cg2 =&qdjPK b[puNϸ:,dۗX }:vqMn$P_ ]GhLJ;LU %<%Ti!""oh~^J'{!́'|׷\wE93ܻU2nBO(ʳmk㏺ma.@n3:Yz`.ϣB~xbd7e<Y\Ϛ6.=z ;bRX&{KxÚ>?"aʦepD8!9 )`}\岁8zox#ms8;dB$`/26ipcB70c޳>1CZ|s< -MaV& l S{* N)gc!pw%/ijk'$CBxBs!G6@q^`#o:Pon\TMsl?F)rD4CU)yF訓sHd~C}aN߾;B*6{n!c|=?zqN(!pS8  (nDEPb(߯+Rt^+&xuG06HT6v'le'S {M_ –@<,?$HA=ksbr$#aDEdfg2t@E9N 8 ZC(yQ>Їt*."sDL Kh`7U6zs:W[ m3kqKr%8ͪwl"Rj1B_5BDBu"ăDA5:ܡyQ!X1 "`LX;CxJg$3|>yV9h|P].bI Q8࣭]aB"s&Ѣ%"!!( d&f%8O80 @ 1 ӂ_8k@wq0[ہküRA8E{@ox`kgg HCp(n۪Q@9< ?ET_~l^7$EgJuVqO+z qNtax%׼C20g$0~U08D䂤‘RPӽy !_H#j NC8'Ń4TH?; بǠqE]]UO-GORsΪ`i)㣚C@t*F<TN@pMwRB"{662JR(a{9)8`݁tk@ID96`;Dй" `)N#Y͙y+TVOګz-ߴsLTGW1 h+) z/^J%\IgYSagع"`jcVf  o>82jV DO;IVlPg, a99EZ3i3p?50TՏ3/F~߶\rGԯN=8sC.e1>na)~-)PG<&5f ܰIXj/.!S;t`7B(R#7h+ׯ.Ma6ZߩId= 0v, atЕfj C e^:J 'OW$xQٜaaupA@,BAI5,{/fܻ:dbZ;[GЁ'M>q~6;QEU$$A8hko~ +Vֱ *jobx4_>DSCU|Ezlr^Cψ9"fk*Q|0=@gOjC":jOt9Q-)OO᳿qqErYJI%8g a\Es$ɒQPDARɉ !); 0HZ Q,L ,hUP8j Cv5!@dr(@q{0KRP`#u*Fԇs3U[!ȪH) ArF!2V qdG+9D`B!@U"i`yTօvh p̏:R6m`i%CQJ;$pZ4t|@ahb_]Vka*HZҨ= yθ\]H||wR{`}cžPF5ͯ 8$ߣZ HKm0U&*b8z63FR @@]h#`j0pߏҠw[Z:AT`cX DU'5: &4S/3} 9 ~rHȒ !a  L`\F!iiNY8)kt}_w++3o5k陠A8@:@X-}7'uti%(&165!{RQ^Q{xUPVoO`Y){rҎ9Md {aalEpv,JvM(%PZ6 l8D^EϜ`n!߁IezyxXG?8ː'j.e7A#M\!C& $CHD:r w0Dti|7Ay⻢Tꢤ;i4v5}P8H^鹔Jiŝ.)٤'2a|OTE{#U~aMǗሼńwaAP@+dMbP"RXH{ 'EC:= Wa@iP[/>:](!Y-0}i@8PfK .ې;t4薀p<ǃiP0 0:bMrѵwSVBLfQ>8q0S î9;sh%d A[h5UYZTejj+E(ʊ"I̓k` $j4؅"A5Y؟ijRA8=N:WA҅$f2$CҦ_>`JP)M41?2?3(qJ2zÓ BCXϥoG"Rݡp+F2ܟ?)ًStriNIAie[b .v^E*6s1$2E5ui GBs8⬇ןS }ۿ0ZsC)ȇSS?1#P-HR~ԣ<I|wB@(fV>P`~NTGCb=Dh!"4(Ҁ:b!ObM(]X]@bZ+ FeuN|moӺ~c2Ϊ`VJ4;_y o<)܇@=x IF(:{r׺:::Šqے @J\wIp/iAA sB  kiDol>~:P1FiE saFu<nrcyeI:KGx8$m(ƩY>̗Eό)UU?K'|GS8A2408ҁo1``I R" >~w_R4-)oͪQ܆+R8M&qvEq&hBbN#0!,8gJ$׺6ZҶЗJs Jb) x ȄEWHۛl^}+M0OA*7h y/f͉\c@f>'%_+|hrHt/ӄI'?`8g&g U'a؆<,cvL`kdLfnKqyS&Iul݅e BIy q( #L$Ev5O7xnwWѳmmZoS0l"Zm_xhXp!J ?3a#flF@o$E%C$lM#kD‚"=|zM=6Lql'ǂV"H`۝zCAwb=U5Q)ac{gt6(4F! ESEma)c9L#dtې"}q!8Խ [N₇$A5@r>KABWhISns;ƃ\8 6Bma''pB [TF6T( rOD3,KWd/%^?#*wHLϙE-+ϥ pg T2U$aکD=d|,_|BG>TO|27߭ 9EdA>wĠbHV ~D-dRfrUx~Pp LlՌ@C'fdSI )t *hy%tH\nI$ aI_/_N24!JO;ҟEiQ`k(|_O 4E/iU`'ۛ˫^;s5W??*"f""&bw^ʛ?T;⅖Vl*s{x4?дұSDDAI5-UPDRPR'l%qL\pd& a/L"2R=zB'U%%fS.-ԝLg&+ҚyDO"RsGJEgm_זss?4e5FͮDt"I%2ǍVLC=)?:1ڥ%}MT0\gp!3j$?.hoEA ;RN3kA$@;7J9c֏0AG)xd@&_?j%534Q*tTͥ,Huz~`*8JVLCxV2Un|{i9h]S'BBo;1يHi:,-Uqt -JBo?Oyc>UٕF37| '*#;߷Tu|Nf{ۻ7'[t8)snJ5$^?32!/q!F<:tpI9M5س D.+"Pû8,Ḃ5Ŋ?/>UR<b4A!oR[DMJW VkX=Muo9 m@w;fq "S&7qcĭDm|d܆IUZP -lL |G6g/⡏%'R7#[Z8cIs'eFHGO]G/U8\B\ 8KѤY%aּӯUXaDY]CWJ~5 Vr 0POG7M׷2yZ48q̶wn/Mk?أL 3NjOc?Yhӗo>e <ҭ?Fȷ]L3M  p"IAٍ+zAҐwUWScX^۾PWfOxb4?o*bj?AD#0lL&RTR{¼_^_Rw-UUUU\_'Ǿ RBe|FQ1.mU 7cEW`nހw'HuO z" '0AMׁNEqqYoGx*CB=@" S}lt1q̔sD 2+p.UƠJj`*Tqy|()J;Sm;;~|J~/9>?!({@! $J50r}oY3MPj4Núh vy6| ..xLnf9Pf x@_ӗ!6SZ}Na{q[ft|s|}VrFdr{zI##Bҽx]$8<&I"izxe%73D`!)lg5 Nq!屴fzI 7U[@.T5; B4=2@Gy1ċĉZuRr{՝9\H=?ʹTq=4wOyt~jȱBiZmuyWu~" õV+{LDRh84n6'IwL;źbfD"20<GH*J ThC,`ZD;Hdm*YļZT.m1ncKDۼ$!Y,,GX#!c5 IjW$Nte(8YSEFH< SH #w'`ZJEs x>CԔ * &%׉ORt?LTג) 1ʓʝ=455\"AXrFϳS}.Y%]6|㙸ƗfFq&p5;AUWTQYdoĻl8Bjm%m+_• g SHֱ&L?_9f IR/-7o3e0;@Cg8Dm(7=\ [v3Gt-S::[L}wtIt.8.1(OL Qh.E3g$J毗xwuE5Dx9z%O;]$ti޷+vlXH F) ):!|9i*$Jbƙ.8lc&IS6]*\}2l9&7*":P޸WQbcSڟ]^k+Et' 9 UG| f>:'wwqoxڦel[-gu R?)Ө;RB^kUqq7Pa%;J<q]#FOkkTN|:BUafV)tG|!  ASESQ` 3HBH[6tسBrh-%g>W 4f=P{~kb,Khѓ3)cOOP_fʪf݉s:an#˳斐K^a6?;_[7<{[zQ#6Sư$rQAy λ`ݳ U˼6YuG`+jm3. ; beɞ-#wHw/.wYط,9LL_.w](^ݳ(f `4,) C"χg K5u2eB>'~uNa5z؀X/,h(ChMʙN'5L%eU[Pi3gguu3SPPSS ڏ' ?z ҫrLVi3pP7y3tۆҲz[Эfjo K.'a1 [;P4-&&1!BRed™336e.(FLK.Ujt,W8hԆ"cT3e_nIrx-b#DimT- AB@R.pa!l7c0=0d Cw5.gM@}oC3'O|ĵ4/nf878Y*NS jěyǀvs t.N `?dPG+uI]ȽD!$H.@Ȫ((^pa3tXa w ,NUp'TIYy4쑩%4Ρ˸$pSc"^F&FBN@H%s KL|C6y yE&ƀ~.͉kZaRy̠6Gr >7  "4)&ivGa fcw@>;r HjAhhjK-7z:( muM5HaEA &q^Çfi zBD[󗤩U5Φ؞qVfXzGU-J;թ&_IYT'IˠQ-| {,;m:oꍛT /a7`ki`aIQht6FjL{0YZ먋b<5/a ,`j,p1Y_ +1z.$(اIw2|/uDDD87l$ގȇrà|YUjXS oےpe֕*#n-30 3Ot1Jάy7bnxQ(2N/m }@:Ahfctd 橥̡``с0g+s3(2v<"CX\E3M̀QM)Mp0` "Bb=5Wi\Jұv&Ĥ4,(Jc!jYIճ]SMp8j\g;8<l RU;wsO+N3+ Hv !OP(Tq-*[Yrqu^yMzy(KsJ4!BC.~~Q'r09ڊIiQ(fm ɤD, e(up Cr=|:t"K|/\7:2ODȚN?CbZTMLĎM7ވawh$ ӳUM4$p%wJ NȆ2:=!>t;ON8h|,-; ׯJ*F0ZI!Gx0A/1.%Ed^w+;h;VL||=q8'"$vxh$IT9xIxL4f;VmbQڗ0 $),r3dS7:^~'*7<(z3bnuqrFb9# {=JlXwx1HRDwd%v&N;;XW?+wLS"еvkZjL%+RUUZֹkZk0J%kZ4ƒEZ]U52bҫU9gE3QDd (.sSZa'뾃ffS9ʡRN"WkPfR*Q-QFٳKuuTf;f<jx#r̈́6T8~'yD:A{3Yf% dd՚~S$"R)`*i DF!b 90vk(;!B3! ˃ZY{(yae&]& xj2 Qz$SgO.ꝒudyJcYeAqphw*4stcu$Au*ƌ*iZ ,=a[BŞTnFv':/C0){ |G<:$AvNΝ}p斘2sk#wm?< AGxiAE9.] ?ESm7My[G?wń+bMS8`AHVWm sֺ,sh݌k336+s ,#>(83A%ᩡ}LӔf8.JdHˋA q`L]1 ?/ ZLQ 6XHm 852GT~Mc,2=Kb)9& LoRjzQ͓D;!I pt$]]NBMC+CZH(^~#-)J?,6ٷ[͊H' œ@s# 5Icרouv3O"XiLKws:NCF–Rg x}M[vs"'߷TПFq{Omrq蝡IЁlu fgIqk^ YJ?{STD" !*~}pοt]*)D?cqĜ*ʄ8ym0#P͍P )M_@ѺzN&x#,v-(CFE dQm  P1JB䅨}^g/Srq}@^ l?}IW?\xI֔J%% #,5b/dzPs9:MbgSG_~Knm(;a18 QlYN'YΧu5`A116ΉM&k0j=sN~$ O4i'lKs3ƒ@>*<*?Ko5UU\jc9seax  CC{g  q,L")pƗJZ8. JZP N6ƳmMSŇآ%-)iKJ MZRUz dImA%YaLa!o6"N x l̋xۿoxC g_ӈ.ddB@cRXjḠdG%JuC Ѱ|}B{$!jQ( d( %d `# R°(Ib #24HDC!2I BDPu ?YBфH..9a gG6]ag@oFLlPe?/x 'H,sӡց!?e1PI"T$$@XU8И0Cs>^yyCS ȾUY왞yC^痴'3O\NJEE Iqs 2iI@V-@o:Xư"XM?1ؑ+KeuaX= 7"nTQ0--ᇡn$tz l\]-PT ,sA)bwqҏ5y<p<% a6 MQNySc>sjEVA-  fI leARҠ,!N)X&CtWά \/(<qpLJM[RϷPXrCiRJ>@Q(X(0pT80)BZ<5)ZZ* ^-1,Y"1RKHD̗ pb2Gx,$(5GkkS}CP2BFOFwLd׍ Gp9 hEN˼fPyCP(tc=(,(,>axooJQR@I@{>jrܙ{8ڟs9d?$)bR 00 8P*!c!(+ 0dK(Z!I\RUs&F&$mAIxp" &iZb"  ٬ !B 1MY4 Z(RRA03A*h# vNFfQDbPNCHH+@:XL+0ϣTk!YJ}ÇHfðR8rkrD0dhR"-%zH)(PbVd)aoU<;Pv(b&ԮK!(lMxƣ7yrQbJwe39 qGSp&%C{X%+w˯5ˉzN=@!GD+ LD2+ (B@xIHt)I#Go$1 z")UR9"Oa҉G&~i\ATIKDM$v ř6̉tfNE0봂6Lc36f>mhu܇!^X].D1U$qMQ`_}' '?b&C@J1=Pi:p6@vPNu!Ìp sCENq HaQL!Oa|h6q(nhjRp9`u hSHL B8Lc~p(d` ddChmPD]$#_4~By4 F\Ʋ~gCHVC"R4!H]%3/0cPbq$l8^ppMgބ9Oxf%w)X+A#"H 8>@D?<ebLE0Pf5!Ⅵ> (fq7ItJe 4SC U@Rڬd XJ&Rp VWR["L!</i3HyRp %y ;9NVi~8(y4<^1FXca80 Bs( %=a|ZnuN;BP;LfRPLx}?{}.3IVnYfFC|b^#4 I_.HQ2hFg^=.\÷Cw0<ǹGl@8@c bF?&a\4@$(a7oJJr \ppl wvOMAj,lQJZC 傇m :ap2^,PSa3YfueDadPNz> 2;'L``wA$D `TQaE B^y.6 @4iI>h$=AviGA(`YĊiOTaaeWMa23$cVJL)tY7"$HNYn)l1 -h-K-Ȑ"#;'XBcFgptmTQ<߃[ 5d@7Q!DXͻ  %CWް$(%;M$ ‡Q ZNcDNCыŖh xEtrVE;K3-=2JdtT8_Ӧ)-"CބZ154suN fξv5<-ځ$3&HWvbF3F{zwtC~cw_gDU;KD62Aå})Jzd#1)|04y"Cz_1M ?G ]fJC}FX]R_/4oTqSZSV%wWk1[wtݧ>)"E8R;LDǶ]T,`%Xx"f`-FN ܆1?zM=DUBer1'Cp>r D!^8nI6[ K 1M+`bτlgr~oLZjVҸfdEHp~.+IĄ YiIT<&O]mPOL L'v: >2Bn )j$s}^ctxBD$*d9i/5%SKҪ&+y_[8w Oħz"xz?WhS&vs04&qmB陹 gϩ7Pj;#lROLef»!b[uoXB&6=::=]C$QaR \糍 wxGc\-;LY7E.X*t Z}0;t D3062u6hK<̎G o89,Э>~\=+o_X d 0@[ ὃeG֚^ϚUxGI$JxGu01 +GF >?_5tɀMn,&Ǭ 9f=_aT`WD Ɋ46W~Q;<4I0q69+Na盈yYAPM0?u!YAp5M7txY`E֛ Z4y+F ;I 4v(vv Yw/`"Z ZFj6M%z  +W'BU UYPb;yOq3tytB!_o6<:# N!(I7uV~a*S?(@oyʉy;,;v[t jGSP4Eq#ߴ9gВRqT!*o i@ Ad(R(FE5E`UBa銎V6`b88eLI NHRQ].CBhh OE7%5U2Dۣ&(rYH)ߴ+jPLg s \a|m ;B$bHH#=Sqf&k0'BR$tIrFN?%GWh=_WT0d%DI5M'D!vt7>x/ɞOnxuDs,2fcCz R9H&WdfJ 0şv!+):@^V0U%A(!83#Wbf496 XDYZBLA(rb°QI` GH)2 =F',(YgpwNT </ϟD}FH;x)O43yzR0"2  $CxQUP-DETM QвFaӮ oy?>X 9_L`ԭ6yp"3xw- y|lնS3;Cr6X L1t "xi$ ⧩lUqz*.yq C[Q9lP@L##V2] ԝ44,B(Q@BC52RQT1DSTIJMTQAH4 Q%K2)hi 5+B4@yc?AܦA6Aׇgڅ"hTQCMFKAIJHT kk9ySՋL (, IIY-Lv ѧ,&hIA`֪!|_T=)t"b.>74NzM4Z6ܻl1Y5fmn!JUx8Z-l*ʈ <3{&L.p 9UMXP}\0df+˪ A?&hץօ"g}jb0VϚ::L2PBkT~G oBw }p`MA);;4f## i,3!=GN U8¢O͸"1=,(j7Os"J偀v#{(CU("JSp@G#JI`a:4 I"o\\<-zu@ D'r2Dq|251 zA' )L`ezFdOt ;5!6GU5wpzO6A?B;+ERf ӕ'*LG$MdaDD GFg*p"quKć8fR" PB!h! Hb0&6##`Fe! bfU D"'3"p($&$fؓ 8ŴQ*1Q$JjRH,Tk!8*()AA$z0Cuk$B9d*T,%rFٹGZọ1Afa‹!@w1Ch1]&{'xtq+DEE TO~nu O͛St^'Gj/ J-tNFhSL:p4̋o18C_pV& jy`RBdq% SP[y,Yy&2@B@qntNZiN{<"bD&[ho%"nFڡCmM PKY-q YCHo-j6|__~AH'J4"l,T<;1IU@=`-,0((`0Tf}SBka @G 1 Lp"0ypNUJ~0/Zu(_p~_ 1XfÏy!fɑi}&Q;ZAA8RY0OeVæb!z#o =pMlü2pO*D~'t{4vNjE}m{4ÚFN #W;OnsW SVK3 dRY?AV4B&F!FDv4("ihY da&d)qˌ7k6o|$x<ڟlW@k#Q(Bzi J1E)gnI xo,I*kQLnt+a EԶý=Q=tUH fYkOk(r{>y9=F?Yp_F,ͰT o4XB0:49(JdY3">YN#Q~ ?n㐃.O!`Dx` |C?gO[>%itMQOUO"c"(*J") j""! *"f(dW*DI7a 1?T޴|w#wXR,~x}A!"H+ J -)0 PЁJ3 B,IAĴHP!b14RGO:~ ܑ)LO]^ uj6?FI0HGzY1=b?hNM@Iٙh8ݶ~A@l&we($.9ƷO03u{Kņ4RA-@B'mJj]jzIPb qB$ ;J?P IX#}cH Ou&b2T4+ Gօhw}8aή/'D8ಇ.I$n,wX z!;PqɘD|5&HAw 'lY(P@qU %h(($UUUUUUUUU)bb$D3Tel3!3'0s"хE4A(a9&)isX!OL`vhh@ۘlZ׽|Cyym|OQ& A&K@eAFJa( =`f$B_}09?OWn>ZEPd\ S79lϹ7rq<ӓts^S]j^a8D܆,BivLC3 "z(1)˸R}Dx!SÖ!O_y/,;\=Rg夁? j=<&LC>4T9qcnS S~u')@~o!tg:S=IsrcnJOUnK?X)ݛ @@T5~hM,b]sw;|Kg0pcnbJz'h0$%ݖ:Em7 v^~zbx#fdu -cK.Ј·.2XǃkP>%en; e`t2M1&jy.s4[+}3SZgN԰8c@p6!4Lk*S2<$6rDe ^[h":,⣳:xY5<ʤހm6/PC>@bsɻa$w0`N=Xq4KQI{ϒD`=aLLzx t%3eE 0 ;zBUCv&@yl 0m\:HI4՜"9LdL̚B!Pj )T%HZu+wfs5grP:!/HOXkDNYf`@4HA4!LJ! $I/Se0SP B)QSw?)8LPhH gˍM)Ctܱ :YUU#l=g67zc؞Hq )/)&ut3`C Iӷ8XT14STQM4 @P$0ĴQ4M-!KCDDE4R!@D@SAAA$KHD>@R+ $K7Sߡą5媽}|w XqA=9VAEUUX8tx,}!`o1޻I`+X?v7Hu3n/XUUUUU[1ʔ@UUUUUUT((QEQUUTQUMSUUUUUTUUUU5UUE4EUUUUUET+*z\zw]/D[<8E#TT38"?LsqҤLi.ZvĒ8rH&p#<.tKڕRn+ddbx)V{Fp Bdn'wgj [:10V8q9R12C9^<,!3 2Dt`}ʜLq[5N^6ϝ-0ͼSdzk}Ǟ87Rc/ۮ2pf @މijy-H& Ä%)0 SnpW'%;m}oyrvRC146I3u,)r9XXP.)c58"='@o߭`?Zl&asdi01ӈiOPӸ+e 9ϫ 7<f6OgE.Sc]de.}/j`w@óCA.ݬxG'*{MݔtvV78tx2ͤacoFfva9EuȦzur$Teo\B®hV KA 2=}8̫BjfJLŦfF!uPC0k8gm\\'ǂ ^py;;d:k5sm`w1C iIWvh1lx8N3sȱ pijӓp jRbلq!wY;eM ,ᝆ]f;:${۟q5 ϲ76|s7 /Rd׿9ÿ-q۩ۋ8!vl:l> ŢSa bs $`:Ѯ[u =n)vf7,"NsS"wgrG[~FQ$mANO1@Lg2qz81sjSQqoӤ )MC!M yeJ74R@(_O㭱/Vrk:#P8I"큾mpB/$>7Mk,} +xw%19bLAR=TP5VZD[,$'z8&HHlۏSbrpy}xlc),LPA$*Ol"8uz\ mæf= GX\v&kZ#U,jٙ;=xݝ@CATa`]D$$AL:ƄH7HBk@QFg{]qKkUC_dA!%ATD%&mv4hph `ՇP˹ɟ7]b,So i}[K4އٍJLn7˓_:7Z{KEyf3Gw5LOǭaCvGl꘢OQ ƀ  " <'{1q~O IRZ1=];X|Y)qjeLg7>G4tqIA@e,yx&pB96[k|~sǤi}.:?OEIȰzY 2{2+QL՜>8ߍCM"e)!4v*OD7~;̷c&!@Id0:Ѽ ?n]J篱/eu`8^]hwQX0[dž_6q7CcoS6!I {2[Ҙ@)rkr(!E?|;h=4/9JJ($:Cͺφ/<>kzߍ!ֳW/aV)9b=xtS]eл2p9Hg׼_TxU#uoNBwNy2vw>:ZM[$# vC,mW3LR1ϩ#pMV0Q P>xZ-Cj|~va?"U(\!+4hP;F<bdl0L0z9J%|F vlv.B%QRSUu8Mq2IS0 :-ڕζBPU`a `8bw*! RL_\7ژɐ(i F R[ E% M pfT WE5Nh6y'T8H\B6r!z$c^~y˹[w:Gr^z. @~B7m>Dk~;Lq_(&H/wvWX`eH+H0B!<_+U!0Y!@@-#aٔ|6:ݸ () (@bojC'~ғpQHP30霃 @ ܄H>L"Rb4&ڊ.qO @vhh򜧏 ?i$א?q~O[?:P@GAl!5BbJ2A/xE-b6e` xP~g`Jx_M.MYxK3b~( ‹9cL&k42 !d#H/<j=PѹXd薃 #ɞj>#yBJx.ʅR<09Ǐ@.#"1cQX+Yr^Zs*:y&  8lækHa  JR*bȹVhM( bd94 #O OEvcNGCTPBHT=+@D!@`&sQ44 PɦPZ}[ߢ#+=<Ȁ40aM,36ϲO('~{,NTE6E( Nꯝx Èpq{f17g X"tř"n1TנVр>Tz 0#рE-Sm#Da<bx?9 )ϛ;_:QeAw~w늛W]"׼אHg^>ܖuFrn~b%4a319‚ĕX3#lpNK8;qq&qlK[[ 1 EʰDpPx·6C&3$k *ЋP{ITQj<@"e' "a ǃYgA1RJRQpP!9@!F}P 1"$Lګ?}L@ddSrd CTS0% 4((#@RAEnCx~BISe~>ƠUSA"0\RsE!Bx܏=ֳuk3PVR1XSxLj$@lH Y7)%~$_Ô oD `$4OF"`N7BHU$ WOijT{-ov2@gg4o A=K'a`x[?OwxCʒgI齶&['g4~b060`f K AFDCGǸWRs/(a<?ݷeGt=ȧa 0DBT%SHR0P24 P*P4\ `us$5%O֭, H쪭dz n^~*6@~l(x4Hx0|Th5dX7C e/ (b@O)P7"+ ID1p`ہ "ҼX8Š4̐ȇX J)Heb*@MV]`N0:[BP)@ N9Ջ.;T1 a<2? sDL4lCe [ΓAVSӤf'1bLIfiZf jjqQT$TcP%I'@n~]:$'VRuh(fZjUs8'1!thJW9P7[9/ts6\˱c2,GµBhYe%"(%ZcVQ?P9>͠v<&AjۅZ#$z5!Ꞙ/,!6Ҫ)e;–jQ2fj‘e(OGgjPDBi:tN88åD̴019H |r| jkWO5 !c @@I:rGp GL1 O?XC4pU?'$;7KS8GB ћuNc *9W*SMRBQ-U:3y3eZp}#* $A(;$%DI |7pImwz|j·8˕*!}X̚^}Co :Ns3Tx7qƯD}C<=H$RЊk;5Yf8YUH6@ rI#qU91!SH;SVYn D)h k+trpG`` Vb* $TҚ@~2T0R~\n̟mdlL36$4Prkcs[4?{5t$H3Ȃsh~0"Ctk}@9hCC {r>Eʷ>'B~iRVю%7Mp ! #T!hK2uY}|~=|G9VLh 5pKp9K-(o`a4`JSY "2~KVKT%&+̰H.gVuɽ\`YW@9-Z?ԦCL=c*U2SLր6OrA<0ThL򣍹Ζ-D<,h+Vś$[8@5;0;e)NJE*s*utcaTPԂǂ:;؆x#" ܢyaAOQc.2B닓1QB'/790*D pͥa?%ۦ@b, CGW4&D((~ON /fb ^Hx)o:Y﬷ IKH?3d/cYl@$C툤+J ?>;/ daT4̘c8M"/C#yS %*T{X'ln7*;ύsg\!-?|̠r+! 4\2l~BWA&em[k`nj_Nߞ DR0zEx?D:uLZnM-*`f $pG$Ð)O4:K"NY@Gǒ TY+4ޚX`bpKY!^l˼ &/1$~r8UC n-mH=qtoDa#GǎDf5;,@KB.872o=wSk}Pq'dkiJ@Ĉ P>G :r%C$X_? PF`'/츿\a'TORG!%OJdpkcI3 AcLZ5uKwRH33=՞E@Y SX d3&b!ɉ\mG0B3 sY3(ܶȰT J1*` Bj(qHуqw!k݋1,%GCJMA)aLNs}mnQLPqem-Y46ç1SCz0 |l\!htt^DwJ8' %T4LA(}:=!xDq;e1 xI F$5@LizHQ (QJVB1V:hi@``.6JxnQ#YC\ҡ(@j &Rb8qN|٥b2D[~ &Wly-`-D|7o>_h6d2^'PdhXDT ޗ!Xږ§MmдJIMoјVd_mAf};+2Ϊ8*@ H'IC0ѡj ( M 6JQK2@,Ҏ     C )QqGXnM|J]MH1"-Ϸ5qn(:CtI;*An~D6 ?DI0XϤTK=fЮ9lM7]@ѭ(1CBlUyߢ(+ 74 #FO/n-YNq*& I^@jC%DH ֝j'2P5m>z|y }ٰ+Ad">}4i WO{xX!;BOtD5D-ش!T#\uDD}FEL $$=+ö\1ՁP%ۉ0\Z>Vrn ^>)kP<9(_%fLeL"rB93@(4V!wŢ%OoBX@Q/T C4H8HIN@'"7Lq V |$ݸc9XIAL{hVh|?Xi`}ql$)U)cq=G~?$M^ ||~"e?(r\D(MxATAF  xoL&e\ߜ͘B5i5N/'=HGa xhjjerbaZ]QC6EO-*1*7YV"K%ZF /i-JڑJb12VJ+A@X fX,։Bc#jUe(V4(&#Ж;P]$,4DP(DZZhJ2h(XtTQ1Ym)HRnQ(TIHh^ ؔs&PYBQ9ÓEf dXP hfhȲh52uK+oh&!4I@ac. -@* dVA )' Zp)(A&2hcЕK!TC$X49#RHHLE#H=0^>t j` Rox٘5i_;x0(ڌ29.:>z =~÷84av"ṙ7ѱzSǖpv (@0lDKݠh;RtA:RZYQ_b Sp@ݶ8!4/?,ПLYaR'e/vE .͸i]OE<)5Y쓼SHwIT pq&#5#" ˣc(s^6yp665i8H8t9 nn҄'4 1HkjW&w J$={CO``(ŏH ]=%C|0fYqs:t!iMa0b*@S,BAs-??/?>/ 6/wqOw=ƿ!wH&?Gm)ȼC|-A~B¢jyJ@gsyd!AC:#Ae #!綔dŔJQ Y`Kuz?j H6tg:+ZC3_CӃ T  E@ ~MO7]'˵;Iv6چjCy% ! ;:3͓Ʌ\cz?N3[P`ts4as泖A>s Xg4c9KdM_Z (dL"uĚksxGH;yɀeH#8?9~fO8h|,xiV'ӹ#d(v>1X+̂ct S1`T{  j eC/YS7@As. {UF+;bc,HlPA??ێ`4|WSLxwh.}'=a0n-He!?4&({A); B6m9ciW:({8o~q0ҿ͙U[ۈ& N"CFɣ* _ bYH7BzfD 2ݱr u\8$߀~Fd1bXus)&\dh'țW1$̂ I&*D)#HEM!%$D(ēALQ!Y(Jhh*R"X0%ŊhbfiZFJ!Rb4SHI$0A5STDIhh "),VIIDMTD҄UCTQQMA I4LI$S)$RE241HR !JPK%H4p bb JV ( Bf hHb|P>k.9,CǤU#lUr ¦L +cΔ瘂 rtiD;@8%HD#>P6pI$A~Тe#Ev4)@AKX3 &h`bbDQ-!J̰EQP%S,ABB0DE!J@M,KLB@DR)Z "HY h.# *(h H(u2AFϿ D|D9-(?SObH^ruCxőC|űL iJ FVLO4v^M.$S!1Ԙ4/LߏKJ@DCT"ICo&~U=v5CX ghDd"i*!t9Noab*N?wVCd:?wFRf* DSj7Cb't ,YFLtmD4HNN8]Q7F0([AT90`*{wq pXF\n^SOP:s@ F% X" !K%tÒPgK>pX6 4 Op(&G2Ri ɐC%rW=ī@jD( 7 )LH_1fol:BUMӅL`,H gI t&|Oyv!`( &Rd4pnX(-aƅ0u"*HK=sElHl//ݴĸ~s YC)LHL,p0,glT@HD={xp$`9Fdna'RB&jW!Hke̤x,iY,Slsmv 'o5-:I-䂑_ZnZ!Z3PK'*btk8kE#l*u'teg橃(v( edV* ) DSQBI@t`v2g.>Lv?vC'Wzap!:C 02+ЁL頠Xj B]GcSf.Ф=;ܭl\@4 CALE&9)1f!*%@zOxrΨ**DY*%1x]g`M܎@VQ6tB08Zi$#d󓲎蔢$t&qm\;ظc[d0ͧwM1`W U懫ӓdR!%/]Cid>UDܩtlaYEE!?P9Xz'Z(ƥĥ<!Tz:]ct`3혒g |x4뭒!dޝnII |t=5V ,W\ ๑H = d d.CP,\UT. QKJCI .N58lj…^- :蔑+NuzՂ,d8,4QimLHG r35%'-epó>zKLHa.2]uc`+tK"MLyb=(e$bb P0H&; [Ѯ[Q %_XP+$pB@".is\8BAtDSüsC2`yh[%#k9OQBapNG0EB:ܫ! 2^A He%9ڭXD (IF%akɧ5Y) ,JȗBKAKCLV'D)2 $cj 'GSoARsiND$!cԠMdI}$4ٜ~]woˊeP]I"PO'v#z؅?(SR)ԁXF2}޳;Ds!=zSS=$b C2J+CtlHCs?O=FaJ ɂ ԘI0ʪV!GLC`2?"`mdzmH!Pb%!If8A3)Bb- ϾS!JTj*v@TH+↚a@I YdP8`d(I4 e&aM 1"'-$8*D|KuG dE !JB*IdJXYHB( ,!"BJ b32 0Tz`9f(F*!Kp0P $\ H*d' d(Je1 {Cf`1l0 "'yGG0RYq?q7 \'L7-jE<w!dZ_ )@/џv!r[z =\XP_o]M"H3 5O ߵQ1D@;j}$mHpq hYpJ+6a[dqa1h&~<9!݆%¢h-VT.t4Wҡ7u !޵{`f>An JьBiVu E00CgCAfBʤch~x%_") keleƛf ֵeRoÂ`{꘧ٕ0oΙʢ 9Ͼ4n׈&I G9y3`Po^jcy!{YG:@L:>04(JB6E ?P= +< AdL̐ĩ ;7$IZh(.k>O@ MaIwRuGbfj:@31 9wb?i,daH$"M:^D9 %HL3ROhHի"l/TVv64@U_r3a S883{0w⁨tHIAPDXNh9%6$Լz&!3ĽMb!Ut'jFgt5̱$g! `4@Х{)MhLCh)?`yhts`AS2u!*ԑ!P$8aTm+f/<0xo_Z_f".@@*&Fno@Т~4lPDMܪ~bsq)]?5J DaZZ\h?7;٥@~{$; ?keotJ|~5Q@YTI|$2„E 7<e- fx'd.! <0$1ϥ!z*FlMDd8,A~=bAH3{ B Ÿ8(*X.ElceUUelcWScccQj60d*"9Uu3T亪*H*ֶ䧔;⪪˥$g&|̦@c.u$ƒ@op?`F O[z!x^48LhpS%x )'D ù`(hաz'4LO_sc\q\lN8tn$An<cvO-זw)өSQ룆cz|tϗzԮBD2ILA# |$RS9wY|Q{:8#OJ_B{ {{;KvN&6`s.}TU@F@f!h)]ĽU=cQKfofk ȠzɊ P-usQx(͐9=C%<.2hl.~PډWp]ϫ]zzt6( ΙaK(dш{۠v;ぉcĂ{ա]= /e!P™"x2n^v.B٘  Ԣ9)dCtJD[I%.yf9.[H`92 !2 EP*P P%Y L CPU PC4-i1V^խTxo͞Qͷr OAAHAQBLc~z{oP* ,b J0J6E+AɡK )(+dp)@*$A.\}~2NX f"l $Z*aB!! A d}PvFyاz/@MC@uܛo.8,㘞+<gm[eB`89TAIxRа=}/!Cmϯ-[Hy_OW݃È⨖bzg|]&8SeQD 'B>8Pty\Za щɊcpAS72R }'0X6>?{:z^ )+N @lFb |4`OeU!D?:(!2Rmv4(POH'CpqGJ k,PDZdU"b QCn6jLcV_9=z0%]$<]iV:?Cb8"}~ћd"ePMII܁xBd@@+M ޺ Nid;$D8 iI({d*&W$"Y[!*:C֎z^njq SG,9j!E+wSg5L AaMCE'vQ87=z :_@uB jW %җ`$YWUK;U0imy|`M(u2뭷ۑ8)"(d.!`ΜK]#:NoJ3r  F4ezB !F)҃27@ $XuC/Ad03|6XA`1i(po:a-kIp(vF \l8{͏w82ce+Jy CEbadOr0nm[_͡R`&l'6!0m;!ٻvߋW9hMi -z f8C8;qY،UY3"s# -:q JZ6t @x@ך4ӲvyΦ/4v̱f+&˥!^r|zGUҾ4 QzMÐ-dweähq\C=1Vb( yY/KěPσzմC1μk׭ԕDAtt!0U3@۩f20(:~:)oH&!ip-b/8x3B83W=uV<wQ)C 38GNo<hXq0:i՝=׶VfΤBy1N@ɰTJN3!o*/}a$h0£RP Ͱ0V=cL[[pN3=xۃ{wD@e:cY~=&R2kƑ4H&]wvLE ĒG(.mf.+O6՛+`?H!^U?WVN]/sSꕶgtBȉ-9՟Nba9y @(AT/?Aj'CRyM֤:œf9sR:RW36'ښçeCy_'w=<&AT):,0`=?Aƙ p޺zJEf1qMҪCxILDȞxu>;^!)f~UdȪ li[Ѡ #?+(DUe)Щ!qBwqo:y:IJ[3 3{jmЭ+"S"mӜf ڷ')$ $%Ep9ޞέyjyjCt'*e|-8.-yEZav> A[1"hHp01 96 A:gSRXP=9h  ,`cN2k,")R% BbV$#o42P dLG"|C8"x @;J:& y{0EPn/V{DSğF X$r$W"L~3hg}Vb|X>j!{~d5LDvns)&d:PTC6]@n䛜*1@v﬇G~I̫)D;#H\NDI=va;J*^ú ΂%YKqiqL@@(a3O)*ēZs0A i 9N$&l aJfJqKm'{ؘ[7J 4m'IEXVQiA(L[/Z{yyoYIQoC CaN)K1\'[ tv $2 =y=*@KFbQ5&KJ`jY!a20Y 2B` ^B Ï5Q*hQ*ZXCDkI!5([*I D$ ,$05I1Ah#01pk޷}B$HIMAE%0RR&uasM= adBh !d@+r*Ȫ>A E)!5DEU 0ya )4]f f bhq"A0P * }dDB,ABT@#2၆!"JpR")`GCPC=U(8h$S`  )"&uCJ@tL8_,$PxPм7q0ȤuQ(agRAvJ-W`ϲQAPF'ҧ*K MXEwxtt UBF iJb|M!B49A Qh"Q"21I2V 0!""bRSq  rUHbaL% \p`DLH,JDPԩaa.@432!D@R $Ϥ)PBEDZS%)FFfB蒱%@TA\ dIL H1  X dX@ 1ē3!Dp$q bHRPGdQ5 T"A> 7U-&j*i^=6;7h=`ިb`*hN0 )^l8 $a*0cF!-!ՏxNd86N2w%'%4I E.tÿ6;\0c!$ALPBÇ2p("RZM1EBHGP_2 =?ů4h`p=,ֶv}w`hVz}`Ҕv`v/8ý;`}0%EEȴ%QH0B/\\wC i{ a C@230GO9eobOR(aFC|9͟i$8%!)䧱GFSόhpħvZY7Ј*&x8rK, `e`xIYS;@>οipK(VC}dB"aȡ`^7 9+}MofSPdn%G'hs`D|lwS'&vu4E"- % $Hl/[҃'-0" (#p&(I%sEFfxNl'/6uPA@G8qQ  r0q#M };$ ?ئ{p:w[BhHP;GH5԰N/ddljƻt $<h8jjJP&E}oWRH1 ΘC\(=t1NFԘԁ&>fe[g lPQPEQ:gk힭c:kVҜhXc'ZÞ,0&`T>境"ŃPC}ΰqO-ַ}ϭ<5:c((8oGð6$E9aAdyaH Ȓ&59_kLE@/?$軇dC?o @2(.ӟ.p^zTR:gߦ^d sԨJx:Ƶl|t=⹏PiP$v2b(<Qذ2DgGD7xD8157 8Ԅd*PG;W jr 9C0aډWavF&fh0IH{*jP`F)v_F`-MT:a,JYbHDc)5XC/bPCMLT*Huy$γj?bڵāBb|l[,4 XNZD`-NjM2*J br@hJ hݑ(N _-h+P@9R@ۥ^|ʭ"P6 H El 6D6yY%_WW"u='C>1&P2dLR4QwP:`o=D ޗyR*$2T*H!DRi^s_ŭkԁCҚ(uj%)!ghaVRR@)[Vv4b)t~:m}OLG\#F]"P;]x=B[pPI0C]tzbl& ٨1h b0D1 # * : ph[&9Z  IR h*"$^Ugɧm5wV;T G]EP=tH$_Hv[urjH X, (&Pt"dqMfv )9-YIhº 3BO)aI%igd:1A{ MAHh']~NK!ؓJydD)I膰vUVkuAECDvHil";&7,;w+W XP\fJpF_x$|j6"Bs"iՠz>橴.#1dL4amwTp ? H  sp?=()9bxNe#)!!> %Fy0WVE$ u !UdW1=y (yf(<5uƥJg空B3SIYςOY e0X, *J #zq}h6t# a\ JD)@(WM*RЈӘ$:‚)f6b !/zv'74j5̃z?;xMUQ$Ljփ WH!øD"Ly# z4n܁SϠ޿ D Bb$ ({ ? 3*k_& oZj2epSzGTX hm~pYD=3{hHL*K(m|#ӓE.@DtӜär'*>: uMr1vB: rʜ,dp 7hRDJ6v X҅6:_~|8XKNEp8z-4ʕO$^J!O 9QL"/D>J1&ҌAHX9!mNO!E1 C]7?LMq1"5SNNP(2 QɂKBYY50U:yaP;E5uJ9ƽqM H/x_t;RxAetH>zc.hsAXL[<0!9(1^P9Osrq\ıMv:sɃ`IiU:x+]MŹ9Rؚz[BddL04^#V2wZ*nBg!a:22vF|p0Y,)?BI9zo#-3`ٮ>_s}8SC 0&IME艷^(ys^ȝSpE/dBJ241pcpq0OQAHw>so$G|K1y431?5i&|'+[C2d0iw9|+Om[?۟{r/.C| jSE CPא`>#yPsBS$2@`wtJ0eu0_A4T,ƁD ]Kh>$kh:@(&s:`hWzTvavF^a(!DM5Jak 'yEaXHVBY"A$|ߋ?ev5C!l OPAC HS $Q j!UkD\`& B!"Ȱn"!aBu?#[ *u&bbaܒ@jat|q==# "',`l _X1 S=\H=f!uIQLM=N :dNBLEn +q+O XP`=?7Tj{` )j ,I/\㮎ǧb Q~H dRfthéH B &A1&%Nh4IH(arҔ( XHAI! |1.t}:^zU!Fc!֬UUfdaBE_ 1p$ F=04DUOygo#t$M@=3U:Ԡ? >g?P4TNxH,l$AL(HES% vM TeH&bX v51?9?S42\{Dȃɩte9(ȁd UfINHmy`FKNfSr :ؕRMMH: ;(4^Τ$|ݙ Cqϫgc{k$5~3n yfXIVckh"avD|iH,1p7{O!B|"L:8{_i~¾Hx,IH_:-'֒:$NP/Ӏe:@HJ\͋taϋW 6jA$S*c"Sy!,.:UΗoßJu+׻ծSU C٪,LDRg,+1c% )17ģ6n߽j1jX|$m#dGAӂX+ fBHML@H D)s%iDlv4Sm;WSCR8ݩQ2$tD}2:`q I;mFSe@8A^l'ZHcC;YPhP( mZ{5s҃,J8sJ,mⰤC  P;F-ag ,J>uk<\'n9M7+/898 $/O@w;CB)7Nʱ߽}籶VT?8nrFelM,?.Or&wVQQ&: ;@Ӣ=ACV{ nn)%9(#,)F@Z<- !>E: "q8/.g c⦙Y'#2:a/2cg9lgN עOm 8IV&C5 SkH$Ձk%X*TCR,=b"FJ!LQcf1 DӔfE!GƓf-A!j1mҨ ElRC ʦKZ,J^i9ΥSl Eke(*(kRxÇ ""RO:"v},ƊPFQHd Ȭ;a NFمSf]N"8SJĉƅ "&H(8*4 B2SSER$DFf HiPP-j& UL%ؘFj叒a@a!HA_UB"؂XcgewmOpzYRxwK8>(mi65A zbI*H6>G$xA5@4B^us2t'Ljd;ArI_3enkP׃h2ҙ]Q.Ug['gh5ՔyI8WÚa:xL Ig&u{[<:Qg.EY7cϗ.*7<<~48FC[pFYTJC} 1"DHa|>M3XJ=rr;z)$e S8ŷII w$=#p]>lmDb|a~4f~ǏZֵk[O%"F &N}\UiH|[z {4ؤ (* $\#!2u{$Hz#`!<;χ12HXZSt^}^cIj@UgC 04adEBp)PC@7D  CS_ x)4`M2FO/YjC -{tR)OP!C}r=@Pf&OBSCAl6 a bP4dA%4!amM9)A$ek&D@A %N S'Ig4Q ē"jC6iI`1 d BZ3+!!̢ ikPl( f)s"``4t%t)}u';r*N^hVU2 ($dd'fIGKH!FJ6'^Z*#pzQzD3t_WRCH>P$ " &bb &hbUE"N) (& (~ XC ϲϛ 6 U$6yA$M0%pH(lM D D3pDAE|J7-JG >e`-|İ9NXl@v H {ELH0̦E|D-`t0Hq`N(笝b!ĊV4HRK)^]-#CF%hDI @T$ Rh!H @$9P4=#ځiPU8uh@'(]dG?6' AHuҫ22@r/rhٯh!aVD67g"C@H `~WK?qn dD^bC EU{j0UI'҄~H!8YVN y98!+1 )L`Pb|$.Ɍe\>RS:ZqeAP*hJi )(""hdIITJ%T:ҚP^(e$dh B*BPZBd kRIΧҕ.f SR v8p`v$:5gǓ]YZJXvn޵ZQ 1(1Ţ;Z# )Bb_ p̘, !M$C+H(6 am,jQDV*!J KeB H`!2g0#p`bCf 1$IFV[eTїԓxATn\ !Mw|PowCܝWDzkx&8hib*X% /9vLs:mX1![u;(Ni)-F8ľ%Tܺi# 8mR(@ ') ȫiD4IC<s=N%K)I$*3SԶs}vPid:?;I;- ;{c3yB:;qy4; B2yQL"ZydQ<vbuvA;Ku$vvr ;J$70.a AאDC:fчY_>Uz˱Xab6)7 b;f&?:Ĩco6q l˨=YG{jLC EF$}]T38y+^qäyvJ!CeSp Zd/ 6RqPtW7%_J5j)M,"~ wH!7Wh2I HYd5.-ۺ:úcך+3GVK>*ZK .镎p湲 !4QKIzIeJ $S sReE=!XrAN reNLdsώЎ+vl0џo;|N.&IE9| vyPIB5̄Ch43zY!~ E{TR&Uqqw| F{BJ=ǷJ3A"oܣ<.;;nAyI+?`A' wag@ݤ#1%{ݠuj:١ei ϧrpq9tkNm)ZqB>%͇h2(9511np5kS'&28},QhCf ):dxד7ާNAac8Ļ9CSW3J\ziHRY\ePGn/M@)w{`is0:lP&M,"àDsxHIDo<^ nN+_;z)NinJ!^vur_a\̑lzM5Ԝ ڣW`} 퇷H{P{aلyN|3`ވ]K~uIgB=#pMb̷ſpcǟn{%+!Ol]Qf-ewYџ(Uɷ¥CQޝ/a(ɅPp*ݷw;}Q$[Ɠ7(g/UlMN4Ǟr)BMRP5R$ Hb=(Υo·*Q|G7thG+(Ԝע' ۽ln$$3 .Y~6!/ֻmZׄR{nӴgly|<@(HnE/<1Y%."RZH_fԭAbLzP;lILnF';Mp(I-Sm}gHDUS]q":X ,<X)|q/];>q$<&Ŝ}pĐOP!fԹ3Rfd$mu(@e0B8s@ߎ^ Q= q8OG#7,Qv\ T6~ XHX3҈9c;x"]J6BT٣q\U;h#:pS$ZRfHuRs\ %-& >]ɝ.">OgAHuU< gah}uVHkt!B6 xPftP2iaGim`E dב )Q!/[#n2@xv <ױ꾘H,ġEe _8Du" `!ج=iD*: !IABE1k>XrfNSfVPD66)(A&y~;O)D{oΪ|QD >.2gư!pQm1m(@ M!2C@4@'R]LLhHA&j-{y^C,bf\F1ƶDK:ǒzxI+8$r(w,b1.,=Cf rKj N$@pYw6ǥAJ y|y|S  ټxU % nhPMK:0rMJw*fƴ$(|biG?I>Ie (k~B N;,A5ƶls$ #8'Ly~s@5^&q(wty'PǢIo ڏ-m of0}E* :gl9t 9M+ h{^ۏLdP}pI#чC Ҧ4޸ 5 k}PL;9MGHQBA57)Yכ7lz%<E8PwUaP?!@<%?>]=Dz.fP #xokA9tS:!T0xL1B|Z,?I,b>h9;osX'Ju.d3,Dxa4qtm'h96(]f؏o"d$8Y_?JKYS*u]CCu<QPRo7[NaM v>!* ('=ޓ܄D{G)ѥѢWܳM KD)^mnRaǛ6[w@{4hzHK20M S2$/?ԓ@?S5S=4Sݫ'UO`۳KBE@CP))?ogϞdC.hTz+u- M>Ojy%'\R ʱT@TC! %$B(D9a&X)Jfe+ jru_ 5D*i$e 2iK"&Y哅LO,1lb *|>S'U DʼnFH4--4= ISfL;iwW.DLFYR԰f2`klYNnT<6LD (Jp׹/;UDq'G4Fj_H*z5)R%4Dvݡ pR>$6b3DZd)FfDՏ'E6!9(TT̤1HPS:;l!fH%iK/=4u0ĆvrEݙ(RoأZWDz9EID4DB3N;46LS~&@2ϲ O?n u(!~/+z9HЁzeJ>>h‚Ck"%!CJ HUTIAʤL#PBH4H2BX8w#\% $P' X/IJc9@)JY F}>_&>hVk]bjE F`+$@^Ia'H5b)@3* l`Ƞ3) $9!zRRum"fR9hN I!n[;Vz:sƂuLDŎ#h `Y.n4.ye| r0"sɵp,W:Id$.94*x9ВP-V(0yR**I/ԙëڿPOO4{瞡QcE}_` aU66 )a{ AҋJxRu'HLA[RFZc>9C̢؈ܖUHI &*-/o_H bDR!2h^2`qxOL֒ fX#9MOPΈEaHoQw&C@x,$1i>>= #{[hL3|*ӳsͤ翫m0lbC3q`Ƴކ+n6&Irj" ~=ONMk%)%.q LN|m`Dů|p*$; ST5LHȝ3ao?1{E(C2Pd7va+FJ8xTjxxXߤ#ѰmW%{w1@3t^?KD,!2JiA@fUx#SqTMJx\` !EXM:|DpaO\\@'.藱4_|MﵿN"e"YňEjrreG}ޯ ,q! qΠoD<ҏ>S3=V튬fm*E<: j8|t1Շ^ӶBvV'-3.yvo!)0Ӑ2Σ ,9L4WuU﻽f'9J R -1]KGu8xsZHyuM{$֩7gw{tƙ ͝ybm ]Ci XsQ飻 i<`hpd/6Lye- ,!pYt|8,K3+EmQ **en ش>k/mpE-i g4L\hưe2"2I$\G3iXa$!28\.5a2$! 2lǔxljϗ?9yɱ7fg] lB(MCAAZc I Wr- qݰsgȊ+Y5vn0?z1MYq\;YyL vx/!="h_//ڳ~y/_fI)[aT@`B[)a.󹘶g6Ӊy5"xP{m30okĤA: >L y2êmDe38=d(`&[ h Ѕ33R *rةgT3$ҸrbXd)dc9{LFڲV% 8 5͈S&lQ^*AaUl#kDũ)&eM'J!T8i7*a$tQX³(a]ΙnGHtn$ٽͣ]hCS8MCZ9D AZFN\`sz F'=Smwv3!M0wg8cn/ZRtS Jmsf5iB[f!δ :ptB\ K#<58[ e|qYA9a׋yw񜩖M tDd#ZfեO L7\^YM0L2B-,<SgMT{Ɩ0u>4mVi[QmJ[z?7ghc'LCaȲ[P7|M k֛:ڦ8j7\3=NoY甆P<$!2EvA @s̺ṭ*9T'tn=+ħIe fi 2kOQݒ hQmtʼn]LOكNʰ51Iw@OmA'Tt2 @a#瘔:%[q E@ Tb dEO͛9e 2Qc=A4%b^oSsTmSzb@q[3lӒ4?" %iᔉ{a|,2eS%|WcnmvrӞ<'WҕF"ckm[jUVڸZ[UV:94JJTjKV90_oA|5^83T`b +j)$PB6ī6=>9p)u Jp 4 4(ph@ ]Pv.)>^׬1вއLù]ȋJGIENI֧J #\t4I&q;@Yh!9'LcBg0(p˶njD kmKˁ4hp1O *m&Hxܑ :˞5lÆrv.~&)CbZ8WMċ/a| w.F0AxԁCಮ ڱo*IQľ!E/M +Fs2AݳKsL%ۯڻѽ$.Q)ft_µۋv[94OgNQyI`5W"SJuW\jX MrR,ith eA#^ "y^Y=a(wySLCLOUgHeJ(10@z`giHÀ<qڐIby뭭WS6fPJ1cd()8RRd爽tt[rtؖ/gC/n`$3蝜cP$d0[hq]>D  -:N)v&; f$$C\pH–3J$Mbt * EŌ$UڕzTUi#mopjVc1ޫ @$:ѓ*D)JR<2wMSŎF6Fl kKa,c`E)( p*mk L7ڶՂJ[V'P  V҈ RХ`m(ZѶ-D+FaDQIFĉm[J"* )ËTUz}%c0<AYRmKPmjZ[vIC_ڛQ X9&KTo\N xp%ViiJ  rrC$i[)!Biu"v޲Ծ/zi|TI`Q(a1ϖWn‚j lp{Bx!9HH@ Q,;Gbr%r!4sso6OOo8PNz'xzrUB,\9 E @ʼn K CYlB.߳g#L~L=p^ДU$)*R5:X 0")@P`Y_iYjXh<M`{v pM` @<Gm4tPx|#.dT÷"FJ=^jqLF*Z\9XIu)N$)%IJ=RF$ )y%0VϹGt.PR[p 2k0MdTpFID/G+&RR28T:jg3y̞ipQN &\ q:B[S!b- DJt[2rY UL+I7BuQN6AJR@Ѵ>R8ݝe<`&<9IFTS9XE9z^ YC-9Se S0N D@,AמA#)*˟!QUni@%#T"CUv^}I2͗90voh<@QN4{|~Ahb`E0.2bThS?pNCȻM!9}@Tva lPa6.K1>h/}CR' Y3"! 69JDPN+A?K!NZN܎NuhP8-&Z{/%ɏC  rXA$$*Ⱥsq8R^D pX d`H/0_:]` Q@?$jVFFS,iXPF2aO9.Dba$'a`6ˈG{MG'L$49Ff]0D:珫Q$]i@ꃷeU *m%>aG w3".ZMB@8=r)^2!:Ff* !OQv$ȗ"R'7;91UK -c+4;idkCQP >C,wX-BTZN!D V(l34YTj4$TKa:NhGeA*10PK *J 4/Y$Kw\dDahK,+(ZVvA JZD*CBm#3DjjskڬCMYBD$%.W$R*-ejy˸FXTXS/x3S 12Nݕg(sТBֈ#-V%!|x {b!zŗj3"#~;G3ǃg($ĘP G;L =H9$!^5 ;|+rS]+1&;LJ@0`8DR!$ (j(LRWA&FC0,X9Y]"Osy= 7لBHPd|-ZACyOOnld!GXV/-E|ðĎp>S0 XH\+RPCGfB?kM0< QT֠ b.`$7\; I`sYS<ENh'7=h! d-d$mm+JU.w JBd dA£0-$H Xj &h$*,#*C q8/$en"E~oX =Xl$V;1/J&9z;9A)`@(j@;H%+2(!SDJ?E1% PCI_{D75X0C*f]=1ͷZZOND> ;21ceZ $"m|%q1Zg+ LÚzJ'"JZˬKA{^8Oax(.SEҶyjt"jNjӌg!M]w4τux "#"z3zY٬$XPM4bY5Xi 8s&.MTDge %VJ7!H<ӿza!IKSQEU)O?6wa8KI`\h)w y7:<ٮ7S0Nلy")$!EJ$bGqN4)4CrANhCRs$QTpr8*r+'ń+ a{Nc#H#hd8D8¢AD;~IpOL~cx& os@m=<7B0-CpARPOؾUMBҾ,vxDJQPR@+ UQYP ܚȈ +8/v16B@J@d@0`aɣ[ b X)(R,`M Jd=$ʢ !ɸ,kVST0Ia IM4`dALT0DAUW$?{Gh8۽вA'i*K!^9ٰ5S :TJ@)4B63׻N ~U8Y<<s! 1DƖ|Ì?~N'^xadS4[xG#b6bRce58Z4Ak9))hwgKˆ'z/苬ݜ=@e } 11i`ϲm>lPl36([b|v:TNyhR a QQ  Q!k0PĠړ] 0,y< H6re!ЭdUJ0H`lt,w( ! (uhwBR PU QKC1P=wJ#LhQ-**zE,Њl"ZQ(,(Fmp36Ÿ36 `zm'>ȹMzr3#|Ji)5Z/bia+񐡐bd)&  BS`_ U$_)\daRL  B)Q %XJ`3 $B(@*&B(e;@L ?#|?*aB520A B!j`<. a>oɂ A' 4#ʝ{ e"$J"@ b" >mwE*4 Bs}d|oT@7xFFTsSm|^*Au $N9U(g@Rj)ƅS%:hR7X-zqw[H&txդ%-S3Odb!(Q=*v eNW tH  E)iX$@0lI k6]Wv,\)b!^==?:أm1t'EThml|#t_pB}DNͦ= =wy"C MSt%-)hBj$b=!)g1c;ո ߔp 1S2h*%h#dQA4Uu6>>MlBPD+mBSjZ4XQ*BJ"|ED)B*1kꚨpZ !sh&b$G'S=#CZX[ MeH&! ;cc9AX&ݫ͎,r56Cdv hP|8tSM*;@b +DWx}cāi$IH ΰXpѨj ]Ho8/IH S4U  4A?>$((B(|S #W׃%rDڱ F ,0ID`O}Ctv=?hO5Z*KUin):E TbBIweN]J' LG+Ϯ{cLٳQ"$U-IR#LXHȞ4aupa6*& Rap2\6h*XAx~F_Ʉ8B>t`\y7QoW}"H{ŽB4SȧQbb/)dDC|2 ˃:Be ԤΪƵC.r}O'C @/O:Q`Ɣ$}vľ t/lqCߕs^sжbu0 qFA YD:9)EY];l1lq?.ͮH$$<@ zNV$ќ2b:KNzSwwycI9$ zug 1`F 7XH6Ćf|(}gʫbl#UO)4HⓍCfZڡ^SYdvk *NP [ĢI8 <)go]C6e;p#)a'$D߯~QQE51F0هޜ螏k>emFlb.m3dsw{Rz_&;?2wÙCSCNzcQ W.Jpq tԄ#Ʉ$.bXaj&+z`JT!y5`ї:oK!:<{\@yx8gck"hH[ P A J&@@l) XjM*HabダE;S*qډRw:X  HPYM8vq(CR]+B " 8c Qٯ\9[9t4t#?gj46w],HE#;S@Oǐ%:Q )B B*UU@D5 P  RKBDS S1$4)K*$ ’ I1*QIP+E(R3"4@J(( I" J!0*MAIJ$Rҁ(+H@+JPL 4TA/ҞBtʇ#a3rH)&>^Y(n $RDX&)DɅ_i-MTt˾}Gm]cb|uPD>7XJSq Wѹ&s^Z,-Nu< 5=rj3{Ƶ8I1ߌ br"St  &#޳z|{p8 d+ h *%" (b @&I`(eI F%))CJR $"* &b  "%VjhC1) (II% Nj a`. FCPQ4Kb`f)!C86h!@‚Tainm^F4-r ǹUDfr,Np }`wP?ʟ:Dr"'H]DQQu0+7~P"E򂤈%a`s$eJf#kH nL1G`$HH`Ft6ZL?%d;Aպc09 ġ2m׀nnL ُR ٌ&2 $.T }P3?ئV{?펓pD;pN;Lb̕^ֵ&8y}:= ]_NX9i^#6HU@C߫hm[d lR VN:;O ˏvߙw0{Hj!*& n]3_p^^Q7I,z|?^B-?PVILa2G_YGW͟@[fZV!J+[kwj$HRRP g| w|UNu}@. aE@CFQ@{j׏zm$ ނQ@JU D(R RJQ*RRU* U((=I e@UjFB*)JIUBE"BB RT.tՂ@" JRRP)df`{$ hsP @ fiZZcU @(VDHmQQ@()D@A"@@QRI"BJTP( @P6p|l 4J!+AwsRPcgD ֡Bc֛F: azPǐ ( UFZֈPTE%(]Z} @@ozSu%o \&(w;zCs}1@=H}59sו>]pNsfGw[ ;냄}*B=1}%9k{WfZ}kLx<-wwU$HysB7q"֞n;oE{瞳)=۞Dvn{J>s-d(U@>` PPPT>C}Jtpt%fA+-kH K҂ Q@tUxB(ڼz4G6Ǡx r]AW{(iԒnwVARozlJm6NQNWPـHvἩ'xPWHzH)-l˽%F\z稣4kޠjWJ*u [^󽱠뾾yHD%EB_z<A5AJ:8cTv8=*hJpI!,j(s׾b3U#|+wwq{P=}B>4dE@*Mm 6ʒYvV 6+T&0(k 2U}(QCm"N֯,J^@Ba_|$ܾڵwRAJ@Jb{$(@U(@x>I}^(HTOB}nЪI P$^piuS<O)BҁFإJ@h RJ>MDo9"QTmp{ZTfȝeq I|(H D@ ( L*}fgw{:(h" > )*R%]>K[:7M"*@'>Q{^[.9$T"(HV>|4f:xH !Q>E"; ;ww}Q58J H H tyE(PhI@@|%R) IU*L w $@@+ HHAZU(q@ 8=i08 { )N`Yz)ϔ7%SAШr <:٠^ŸЯwwOVƨmPIP$@ P%JRR@JJTT EA@EDA (( R("BE(R(*"J))J$AJ%P(D$m (RRJR $U(V5T"(% B "J*TH RDTkl*EHkRl H)B% R *̂II@TI@R%)HEURlhUHPTQJQ TT*HJ(R TUR(TP ( (lQ*  *T*Q $DKLUDRU E UD%UEH%P( P$Q@P(U)J RZ$ ֙"$$RBB)@U@RJPP(* *$*5JP@()*U QBU U T(@RI%%@ @5( *AJ DR*(hP$ $P*JFdP 4 (JH *d*~ OL`h *!Th 4O)(L)OB" &&&L&ɓ& &ASd 2 4d24dda 4@@@A414 0ɣAS`LI"z ~=4'4i{FLOѓL4d1~i"!4L ѐ0xfe6SОM& F4z&&C`hMS4O' O* B2&L4` 000` )ɀMJ'g{~ٚV[nM6߄k5NES'f1B/TZEEl, F v+ -4;vj3\͍I ؠWL)@z$ю QExq56Z2oPsmU jRK_XPviXTv 2vVhhb<ױ<3]- ħE8@AmSW_k%MkLPy =cNZr@EjG=:N2zj$,g~~{ZSY-j祑&|39qpq^x*@І#)ąqU)YX}w?!CV?*uEE*o҄!*8N矗)f?nX-bfyWTZI%bT8I<B}:}#|: B!dfeH4j?w. u%r?~: v2i;,CsbJbxz9aaWXoeLp!,q1yJF} ֟j:F}y*E|eHK^YShB@[SKڔɫ6{ Eaޝ%L%e1[ ͊8hBYȚ. ;4gӧfhǼ!z:.DǙ "kK9+'Z^ox&>~-a$''A]dxDl ӿ<[&I95{[pÄ?]6泗)y%vSA 9`]:`1>|><1ZC|KJE$olG-׷<\`Nf[ܒKĝʻ\xJ5utCx{7/, ڑ$+j] Jc%_zX>!uD%`zN]0@`7|GC_Tрj1Oy5ړ G{C`{׆|5]g e&~|VfwV3XX ޑ9u89< 8=BD k}b)L^1Oks}5?R.x̥e#C8CKMnF!@0L瑧1 R;8v7¡:;2"YJ[`i& n͉zI |-'l,nc"B„ZsRLWI~0S𗰲#\F{n4|(E[n<^]Յ_N=:v+ ">u圮o%Ȏs+xIOKمy8>/dRz?4Hnlj%18/pm݆V:x76L!V=UU'̱5| Vu=x٢t{iI<?qSX "syy^^2 [hwb:- ϘQа/%=?x'_[+:vȞ4 p6@5gcŹ-h w݅H q)5ǿ-~mX)F?k]j 51 λfpy{צ 0DAb);v Ռ+ m5@i˹c*|wxD:rY1=ŔZZ}2$w6W{ !1?Hhz늠rw>ҏ|U M_yqYgL̎߄@ !Km _BHt{O?m%2R%v0-'k&.Uo=GkHGWJ$=֐,p015@BVbͬ|C ԿS+tugJmC!dC}t%0eV6q,}CUH-ݾ taZ#D.ك1"樯ĝ7ľInAG`bGsl{ bQìvB 7<+[oDIL'ٖ#w({p|~!οDU`wxʤEܐڎH5N\HTco]c=Ģ;%J5&Bjk[&zgrP\n|mĽ"\cN2YLEo,fi{V=,A {iD5%q{٥RhѧؽWja!ZmZ]׈;E $ŖL޺n$lGgMyj$ '`G-z Wc]߸K_Tr- Nv2YY&v|[ZZw)$Ð~K[H7A{DME`u,s PN3ޟ(7rh)ׁLd[Lš8H n my%u ݐF2W]gPA+jܭ3ZsnAAJ#7?50NS,>''![Q{j@?ѷI.kO.P;ף|+7D(loeiWS24d؎5i%]UH=*s+p>34X / VrR=q/,$BU/X73_PiɽļDomWVn. q5']`k*/srES]~;s2{m'ךrdB$bؾ:E)Qw|FHNǁ뻟 <w*Fׇ?Kdb {$RA1SN,=F A5;_ƈ#6ۇq ;_e_\mrZϖӀ^ )}4Ǝ$*jq+kcb.U4;|cÚFS)yչƦ,ךW.Z@Apa'Dd_n?y8U{S CƬIlb\蚙Z^QSxud")*AU ]$M=jN`cԜ?,,{53o1I)M_B#Sw)SV 虿VHg=q9ez:K 64Ckq' )'a>#U}F, Zomh1D)7tz6ބ$4Wb?=$7ecl}͊XE߃>8ӽY} CyH k{X,z2Zm}^UWji{w ܽiP(<ʭgA#yn9JITf[& aUFk#T%^I:,{Q Sгdu{JLz* Jöд%RL2nQ"/&%r@(ɍT2[{;%+h@]\X\[dw/t='I]B+I:M2;@Z^ƻ%ƈ5j }c:*& +{ȏ`A{";$kqVO٘([mq&//N0jJ0jA!~SUqOʬ#5gLgc'ΣY˨9t ,DŦ1n ' #vBzvPՔqEz2>6dݞ}?{ kDS?;J4+m][hzXZv >Utb[]'?MSpO}hpA]u_QwB߂lȉw/߮6B_2 A7Bۛzl䶹%y"x_T?b&H]yZ{|]@STmm_w f*+]CVoIŲы#oA.Ah1 3X%3}D0kiуllÂ:*u,2WPcUW0œ}_#E[(&~:ɉ>GF.iYyQRCWT;r$ͺ{[;"# AZIs P#Bf(0VB̀@ZK7lm.HV,N'׳>c#s٧v'om{,Uv{>+^/V77f10kw'E:=<垑s[FՐp]\ vKrRo+h $:<Gs(d'ͦ0F3|Xf3Ⱥahpu_7¼gI1mrw5=8NTWA bðRiÊ8OśoX0ךŶBڌٻI*z3v\!_|nHs l1lB-odO̲| ҥ@f&Z|gi߰ aܤdyVQ9e~MRw=hTyFSa ɸ1!'-!#m%g>cBUXjCfeI$JN|NHlҪ!A=uWkj" q|"XJ@[0.uÁ5]L&A:''߸؃C#XMŴ _ea54Dz *WApHg,"_] UD%rAHA.AYȣn\Z&Uh`1**8Yvp,CUjцfr Oz3#gNe>-<Yz"+ނcؚ`kKx~jaB@m{R~[n'e(*vOQG ѹ*+)"0#Rgo9;3 RLTc~dH~ ;Hӓͮ 䜝NN9DU6㳋yj\ 5 r~ZQzƹ.xDy[|z#69`OWHKBڱYt~>p~[(gK/zORz[+SrԔc}YU?b(n^eq>G8cfJ:{a:\q".Gɠ-YAVY?eg aʻOL|i)xT.o_]9;UASfeuph<=XAWS@[ߔmLe7x_r(ZG 5FxF&ug rrZ$wɅ0qi?oCT68^oK|epx"]N"W˕L ] J(gRR@&-~f*fU&ٚǧȈ3/k Vos%kg6niT1xϞ-3&,-f}+R\ lJuYpZՠ^O[8(ӏl<Ж@-5,X'cv5h1AϼsUZͰI {[h)3 ?V]X7o͍Cu(2Gd/Wqm~$/RNw!qE,A뵒΄qSǿfVPjB0z&dIOq@13B`dLbm Hřj^|}'V~[!̱9T =l׮}P{= St6puenf1X` /Qe6/K&5&Z7NE\jBx̕dfLpf$茊{[b[ 9c.+ܡj.!Z۰Lݕ;zo- ^- yႊTVDq֯=?ePiE9Q4l0E^-Q4h)dG*lzJK kfF*۬vg#s[=3@E9Ono FS+j8Q,5LLpPᇭ!J^Gt΍argRsd48uPТ]T=`WaFikZe]x|ew˃ħg7D -?K l۱}R0c |:N.22hk)rF8mHI:|EK]&Gь?g]E}OpJ $,1ŷhs ߙxQ#^oזy)oeԦ=*h9gʾů$X mȓ,:sS} 'ց`Fjs>= tߧWza VHT;/4ԭR$}0뿵(r g:}?Etl7YOM^8l& oFDB-F0dL#ǝEZBF*& NDGq@+9'ÎeMv*hi!dM [kxLqc BrPU|4&@/'>)~O݉:xwn"gT-]8k&͂-[W*tDO|U`\! #8raFAO{iہc 2Js+M֐AWC2DY@/W8 \5L}T`- Z {tݠZ/3O~{`PCy^ K0lRcdDH9dBg!Q{}y},ՕwyClqޅ]J5pbXhªAZ9эSڌ r$L͕[<#CZRZ,O+ώ% O*ƻ?ۧ*qT .B%)ܨ= )U.KQ$թ_R o <IAERC{R= kvSfEU.TI\SM@ =)waʑVGO W΋p0rC?#N{"@f#Mn׭d39:;|J|_1(oR#  gPkuH@ogb##-!ˌJu'];ث5 $8ۈx:>}T+ ?u4FŢ~a9S: ʛFB`$[!~ӞE#UNSZx()qKU h$|:IQOœ<@˖pGOJAM7euS{B CmRn{Ԟ}#9b#M'H`N.#t9lgfjJ22.bVU0 ,=1K;&a3saz]b2IrCj(":tHd$ , m<,C l ?}bhs#,$eQy1Gעʓrۃ]#_S7mV#6lQ!l;2"َ_FitKO,JEI6֌[B;iBCWʏ83gaZz-sո7WXQ j i94'hn|2cmPj%-ՁXLC7p|}uȏ}&G0,*>*tXVZńq8xLjkJ#9l(3=vGPY9XGdwjĮ"5LR)~9mv=aWSGԖB߼ԙb?s k, tNI0|P q6%1Og+[t!OﰚǗ1F7sO@/.jI#XDVr^HjsKÌLAGtX׍bFH_,0outWhѥ)GW*Oo smHQK[K |%kiEp\x]:<U|NCJ 9Ҋ#F4])~?BM\7k/0cYewdELT(:0º(D%Dv-^k*sp2QJqH[Ge t(`lAm5t 3k4z- D2&$F m]j9[T咶Gr };f@d()Ո˽T5qe5gSw*pi(IL$ b̓l} p32[Hc q|6 j)O4xVN<ҋ5/v+bdӍ!J/H(og嗃do0r\KޕȨJPN;?\_6 |ٛߝ:K1@H{»y{e [ y/pGd#4Jrk~: X !\4h( tOt՗0͞}SvN(QtOMR߱V2aͫfeaW8AIhn5^0"x!BJi9H 0|jqDR bHzs+lv e1C8a%wqtp_ `i]"*Wâ5W9HtH X^2<>4:q0;ȾTB-_*&/߿4`_cX4oUsh#]j(tKԠ['cM:!L#IiIaQj ?8$'7QDPbD"A0b(`a%z,e̿k=e1n[E^PLݯzM I" "B$ $mIWt~;NЯ*x*}y͙ͯW&'4(1Eg`*\j#=;_ ߿}):&h*óDIkIjIRuVֵ^kjխkZʵֵ Zx;;5:ӵiEeJ3*VkRiV ֳkRiN!Z4ViRs0"VCD1+Gejͭ&2WGg)e)JRJ)ʵ-I$us8͞Bb /YY+*a6zZý ̨ b.l fUvzѨ]IDMe:]%Xh;=]ڋ5­ffB HK>?0WھM߫˪X,R[%xTuDτ`,6 IGE;eєcln65Xx(c$HD A$H?,,R$  "@`A,QH "0R#Ͱ?M019I_evTjBU#"A@TUD1# X  c(@  ID"TbAH"ȱX*~iJ A *0d Ȃ,DE"2@ ")DD A`ER( "DEU,B QA` I_Q k fZO2ĒdF(l 6Pď[pv@09aN ˽˿+J^r_Q p!-ӚK.7>0t0p{i^kT$ I+̯IyG?6;-ggF+(^>*iTr%nei62؈XQX( 0>S(\0Oܚems1 Ic9;'W#E4m$3sY|:@ gj==gS>B4@ؾ9F 3  ɒN=dꑩ!V ""l <ϴ~Oۂʄ(jW~|ڭZ2$AΙo Ƭ$A566Ju9Wknu y 3uw ! ˔wmՔ 1=(X\"/ G9V5,PO-єw:,tY-74sf1NodjPPc`0l/aI[B7!ߡ B I'|OT-쭥w޾? S#SG{Ho9k ?̐%0HM z}&shFNZ/Z1U!t̑}0 i#[L! +tHT\?Ij2Iq _P3M->SM%AsHA0֍ áX6HO:7t2=̊H_-M`H%@5FD>k!n쑩P95uh.ۓ0NMkЕ.fr]u/  t@3hg|.ఋmX$.i4~~ev/pEs58U $GMEme>_˹IH).|4n43l{ϩ=h%Bn>u`a@'zS0">jҫX &Ҥrrs6Dk8Ecf2À#:F>K-qu<2QIJZ<#zC5 Mxmk\nݜk)]n6[qD39g<)CkZ8(\PGXTB<ݟCV|dN1Kb`8L݉&N5m Ս/pM]$xY@\[63%b Հ0=T*qNUc[a.`i|O\󲕹w<_q3]-:^ U.|bwfy=Vxm4&'ֹ6ߊH 6R6!ɾة_oOv_T;;z5FՐ٬?J%@%Ɛ(k@ډB}}j{Ҩ6%bBf6BL-nDRۼTt"P!E1 ԝY3GvZB1iB h,xc3 ?jMGxbxP^ j'ʜ4\WQͲX:ϑm}glAc6 f0#So.54ۢS 6qdJ`*iqȣ.َEe wu`XU")2\d`-[iSP9d1< SRwjq1Y4뗹P>w7| gd=/g<=y]-|loB%1Q˨1-r嵚mmX /aOo̶ejP;f4;S`#Ezؕ*EbVkpkJbJy*G9e*y|wIrK)MљV1_KZ2pO ZrjҒiCT"qkS*F+ `TcbȨ*J+'VND)(]lyHEտ Sdc +S[@mS[L̆CZt  3Zq-t<a28f8jEDQ #)fV%Ǎ]"pͱM1+йMk3IVK%~*FnQATQ@W&ak[EKZ<#eF k ?]<`&n&+DFکnVH]fТ"JdLg_k  e,9{-dÇnޯ:˙Ԧ.LhS#mI}cwkcM!6@ @4*V(aPQAEDX#dYU֊骵gTb"* * EdTUEX"bɖ-`) !UVVbHbVQTUW `(`,RTE\)YUBj[*V"HuidZX5 IY""`)"!QHh((e@ZѭS-B`QTZ6!D4bHb蒨c+LDb*)J*V1QYū]``l`*,Ub#$DcP ԁD*T TdDX-,5"Pb"mYTDP1ʍXb3+ b-B Ȧ1k X8 afZ-@ 29JTUѳW$yWV<}ߣVY+ }骪@#YiN8=kgB`IXIɂ¨?)K!³L,:ƧOY;e,Yf2d0!41J'h4X>/lW uw`6qJWgIDҠR?'1*UڣgHZ~H֒c8\]%χ>}oͺOp%3(yCmlϡ<Т(, h1T`*F-gk:"+x\Rgs߯jzrl;e(晲^Eq|9}܍RUouq5K"߯[t``Ma3ҿ{uq%,,_5UB| ? 6t@4 %$&IF k$$R7Z~? p ERHTpIaՕ,XCIh  ,+$Y ATX(.ɴ!XHAHmiZmm-mlؚoιqNH)Om'b@w[d-Qa(( c*E%@J@$[`26{\ 4XC*"kIRT ,C "E$`S=s1CI1`] Kњ-i~]k";)ZqAp*M6o[[\J (1i$oWH#-fE1.0ˬuyB|olTkb`6 8LF z(~`H\b@͏W RTX[Lp<+^s0cW;Smo;-J-)ey+M[u%M0 7P%>g02.P`WN*NY;?l)*Z.G+;c˿mdb*Ą(Gp!Jcm&8cO5v3n!>@XWSɴC?@hO }v_Uo[+Wn-1\l S)r " ̸(BJ0Yбb0MZtA9Ъi3.*%u~}j.2S4N7ڌ`8`@ςiTR֏!<7hFX+XWrJVRѳ*eS7txK k \keTQq*TY1%| b $UXXnj<9w] YEuXh9)EgFJC qmW~\,2:,yv RNUzP Eh>gnfz|o2&A bV*@}5J¬AC"Qo1a 蠗 &F D2】THVTUyK޵zpP J+7@2}DLnY9cU:<a o=tVUʧE0䣌E2?V!7^eqv "ufP ts9XtαZ9!^0B1%sw7Xm[W^O>2Z2T_3 Wy(O{Y@վ)=-BI(ծrX|_%WK^*ahgtYvrm(]9O_aLOWDBO/.`k[fHdE ~_g;hhG]k8;Ջy;kKY:,'JT+T1: ]9%΀Fp.k`AwKUYeImi\k;XְȟSn[ Kw7KL+&}Lʪ߅-?UfoUqˋ?6>Xɀ}O!=r~[jD8c4K(#Z'@Q#J%RJ>{n0_U *U?*X K 2- H,Yd>ϫv3,}_luo4vE64㡐+ C+ AA~{ RbV(LBcphwzSd<d7n0XbY`rrٍht&[}Gwt|k.s=-vMe,cb- ﬜j7WcQkTKHXZk92s~攘M7ﻰ45ٻpQ4m`Cxa<@M=?XXW?.^xZg,Y8N\Ye%rZd' ڿo:M7ɠFH0K+^=Fqz:YjFVK 7e\o ,ݳ%{|xE:yu5vN? (Q"ev.58)jf8;0gO3G#)6b8xW&+)ysKON!Q9$k4}ljl"۲'|E;?꼡[y%j=s y\$CEATɪ62s?чWBxfy؜H4[ CQcEa8Bj_ ;VK掛vԺy+7\y8]oƒ86R KgOu%E`yws L!ݖjt(r Ho7=%?Dz|avo-8>4jH*y[sEWMQ<1պ˛)ZC2,7<ǤMt>*|4K:<.tcE<3IvPf| J.訲/- DggŦ^\|ngڢK2MW&U5}e2+u5RdD.^.p,0gռ>Z;I0yE^XInHlP]/(#ds\_a@S€~Jˈ6=TE$uzQ:l~|1~;*`b{p.Xh2!OFuqs=d#3AR+Tf;ZV'}0|ou{`w8U$0B ##(zqq Bx(nӥM7-d&IA'wZkx4\;JܙjTQ;g8h#ѹm__)[%e^($3bl/kV)(8a6*fe`ȷOa ?Kq+V7i x#<8K8b&'yy8٦]Yp1F-0؍c:Q1^%䵵+m8(<HS -NE1~١2OKKx eU8;W.|9iL[n B1f*PSP&"Ki(?k^]f*+ZRw?<7(V@>öf}t:Z3vʹ%.B%#RaprhR ilt,>ijsH)Y# ]VyVҖpH!;!lX>Cd#йXtf7b$FڹޣHޏOۋ?G^D_ "&2;U&5e*"P>"&r.SN]G2m0=Y<iO%1+W[TI[;++{0C=v~U _}Jw6{{ޤ`WҏڀDc9.|*5jQV$LY:)w,U šͤI:&v-C^&$nl:?lw44D/x"ߌ 5'ONఏV?&=mLCz(ד朙|Zj?*erIv}k>]֚z7Mr9יO'Щ>ObWfj.nmpHqe zJ.%CkjcaAGgtW.FK:ʹfy[5=HpZqX$4|B"yEZfu}54h(@E-$!u}bUUR%R*˯4VFA>S }T\XsfnN?җz(To DyG, v{ P)E c_̡&2CVH-8uqq/sZҳoQ5lʌ -?<ȫ:daՀi% O)oJg ky -8W"XZш {@h͍0(E9T Rܣr 34DZ~QmcY=tܾd~o;2HvbASJpy(eү&@<t:+",lI߱Ap@;fi`"T+xKh@PЌH&T#jc T9+'T\#7yk7rWV!'L‡@.}yu"faAڤpjtؚ/UMCr5m#„V.'[JV#-`xGNi[;%cw@v _HlZtJ~ ymS_@E}L+L:8{<8c]v}6H vjQdyeI7TW $U269ٕ7AqorCk= :[B`ʴL+\kM+UfdW^}jA&ۥ/ADG9yۘ ߤr\IY˰!Ʊ}IGg6sVRۣTM̍K\:ˠU'\sI8U6Lݤε'|$ذLiK.ix܄CG̲ޜ\$}!,>IpTT8cNELjTqZckһjK*#ߞڑE h1}% :/#C/x;uXz)sm=S”mp|GU.ҺFEL)Z Aѩc ]N ?PQ[Y{jm/,G 4Y;•dgFvCt˃N;av <6-9'wŊo2Sߤ_' y`՝keZ)A_Ɋt7ɂ{ւ7c8ffFR MϦSzoWcLz [X/V~ t{("~~'&+ _P*2mj\FAs1`hb{QMAL_`66zQEr۪zyvZ(9=k5_k1GVSDչgz&G)GiVk2dm >d}VY O86ڄgb%Ib&eWZ`}y54CXr "[e`;:hX+DZJڴ2C/~)/O'[(eQhZ٤Cux=6klh6:9C.@P| iN۳!`k{)M'Ĺ2L|F+I`McyScQT5=JJV',W@p(L'wZ+Aa9Sg`6|GߊtFn!f ; M6⯌9qlg'2P,nutn2iԌag<GD6N-tUDY,O[PybZrf1ܸZ.0|Rje1IOl8lګҶX=HyeMft+߉P+ -PT#^jMp`L{U h4džrsgFw!;&k:HcXW!U2G [2Re~ig~ګKo6A-@.=@|$7`]\x)ԞIen<^ϭ{on)7iHNpʚB6}/ bH.~]V*  $ Y׶nnv G. VtyV#6K f"bv=BAٱ\/tz]/.vSu"${2D7!a`Whf{=S"eF*t$أXZJ.m⵼璞Uw|PpU ўCظ/yy6tݩwbm6DBG/#زCѫjͪ0*NuZ*\1wG]P#.Ł+i$6yq1 BARb;X{%ʔYb{xF<Q#Cذ >jsC@;Rvȫ'iM{XoPp=(~2w62TQ|mQ‚oxWm{mv}dŒeV)\ ,縗ViW0_џz?FWH;F 9W ;,:^6Oe;O*7ErV.d:o%ZJScŸ "FXg)AF@ qS) N`pBrBV4X@>2EŞTZC;%oz@H匞o3`81 :o \~t䲥/ڔfK:vT`pg7LzotRu?64[3_ku'ԷVł Z=? Fej6}EWRn%#h$)M96$ZpʙȟYDkO P(_Fa]8xXk݁nUÙ]My[;Tg>vau)wemK{fh pPr_UO~ҭ(]cK~4lzoRXO^s|33 c܌-gN4/gap 2v@dO2ҴAU$ YߚP*% m?l t |-fuJi/d{WT"t:_"t¥5BZXWjM tJJ 7tBLv^oSA#km?,K*TB+mjZ86h::ҶG-lF7gᨇ:Rs!?3C~+ZβZJG DыUbF>c3*,yH6[~m&-ُ*uoESjhcpAU񞈐bH4*WR,]6n>pƑ?Z3f,!0s,C뒝;y3&DvR+~ۡ%di~gb_>C y):-@J hj13o -#쏗b0,/u_ͬ-H6u̗h&lGρ;xV9%˄^~3h'qI@e19r-` pWٕӮی n0M4Kޔ#>ϖ?zSH I\[m$&iy CVq)2Sw{RW]+qEQ2i p8|#뚟ۊ?<(l7E o1Ir0V-~ 3},jڊLD.lچ>8A*̽ neA>8H=Ļ-.-#rMm!9Wx􄗄W)bw=Y:JszwNQJpx?dV֧fb#蠟Y<|sO(mYʉtHG0MB{6bZM9"o |HX ((DF} 1 :Nv`WgcPGnf#zBhHn y/ ) c~ċ)ZG܏>FpDdLl໨Cz!lc"1oH{KIb3°wC:BHok, G:zG>@]tp/M|AAy^\h9;6?l;G5DwENu Ѐ9iO&r%at2&g'q[$[;y#V]gmα+uzӗ}U&d̏ +O|QkznrO}Yжk:|?wZ=ߦFƆ2\:~T^|DԸ O@bXfe2ɠ>6=_+xL[X|"ahzSr_>0Q\0&/J$H/A-" MȌoԶX]QBscux)iag W0ӖmDfG6Esۂ~muU$U z?]Z *F͙s4֦8~"pߴ~AjD<.9"dBiE3E)XpnQ[Ră!\yy#פJ5J??I<(|5j+*̙ܱCэ[W[MuG,H,t~-yKcjz|RaZ ٳgY:B!՚4f c@6s뿢Űp}\323w{B?kr8!xK]([PǼRK >VDv(ȲYqA CWuS*Gd*;]`/D$vLv7ɲӞj״*NEvB 1"} } &N(Vu$_PRmpDG8EٙvajDBT,Z-^UPiWq̾[ !%6$StϦ%l !sTdEg;8wce~@gp'u+ l rLn#Cz y{ym\CNWswx(zC9u5P 7R_O(F3UuBd ]t:x}5=`iq,QcшSsI)˹S#~:KGƖhȩLT S1g['ty-#T6). $Do͑YƺqgFmr,Bk] ETiЦ: S"U[*ꭌYaD_@44?O'o{FLBlC&J q;'ǩ c|*k&1&J0[ӿ),2Q|Ǝ}<2tWZ^1ϜyUf0ㅼ0-,c3 r:Y."c?S59u+a]OGUձeKQOZ2%"}F6F9j LV+`}?i Lw<@VHV/(fm6@|D:*7qȋW?7 t ]^Q)֧5_̙?Wf{.V2g̵BDgGتȄH6YvMTG/S ,+ꇁs\z* (LeJy[ % ZGB~ hBSnu5o":Z 5j8״Pk#Җs@P NAC-ȫ; KBN٦oۄhsof[EnR@=j:3C_W>4=qr1ʞwBKZ2mjtmW^=ҘvGtiZސƳ#P b`VK(Qߪ\VQ:T ݮL:NW5+)<Ĥ5w<Gqod _0+-q}7IGX{s+(.ilIԎ#3ɟt)V <ʀ9z>vkX#xf=uiQjS̟QC!j P>[ul"kϜѱv1.sQ'qmFIIu9 T'׫#Hf?gz KE\4ܖ a.SDNŸA׬- _C_fYn&k18䟺ݓGJk/ǃ+aRnXp9N@uE8Ly#r$W]60|V'<[S[=`8eHȫ9QҶLX ѐۭ#~՛0i^^3wlڃPpsVOko/TvBJvwMrĘPbp!I *(GQ7j1apD i5Xɫ(< vD@LY}e=)nLk= J>6lP WXc4 ?̱[- 3HLatE n/Iҙfs|H9lŃ RIv׿%- Tue a8TqNtBl8ȅ0y2N!g Jkw2o{VꍭBWpn 0>Ĥ>\"rDG;KO%rIo.QǍ@l]e.8O a4- cKV5L4ثNʻ,!x.HKݟ+1ql3?+r HP1&VJWt@UI%e* ήIR}Ͱj tu%WcjV=$qa5QK'cWG'h;YUJ*QgiJb!16镺ֈOߟodG-}Q2A9+)/VcuXJgO9MJ ,:&wvߘ| Y&b+9^sց;u%JtWY/憂nXU(kiojU'+N#Afbqm2+q̘XWxp+9G+ _VӃOh@q}~h( x|@[3aS& ak,jJ )[۶aLf(Jֆ^޴Nuxe6dX]XrǮ;vSodmbumr늾35fM[nRm_Y a)C]5SY*EGiDz=ɮGt-56$CcrX9H3)+e% %\"3I -qܲJl[6{e_$RYo( v:N+0 {}inbw;vt%ND ARAWw_ͻw/.a 68q?TE ler+Zφ#/4$߸?\z Ѡ [\dE0EcFqI6 2׵+>@$}!W~0bDroѪ_eʁ7k=pGYqPj vz<cs3#`Z^q AĶ=Q1iqnt9/wr'bnm[P>Gi}L(y*6UhmNЗlJwu[WtWϬ*H1蔨P_M0 Ĭ7P&F(s VG:px#r낒픮W`v2u(aC}Xws 媴Jq<L(Ï9n~@u;b"\do2ϡi]hIH`GU@(1A)~V𻳩8Y$@xrM8)nKClȝR;vKbydRYެ.3Z`ԑaZoG}t؛e"~}4݆ݞԙNmp>WI5ҴhDOuQڴQ#-2| $aOXlyr,×kƑI4#Ҡ0;\DZW ٸcš@2$E9~3辳٩Tvx 1B͟mէv:^)VS`m14O3ϯoq%J}$r:Ͷ?tO.UׅAvsPS!zD-:Rn,ƦͧqO3rrD!۫yYk7mn߬ P6e6X\&GU"o;@_T|xL)uJ^TUf40br7oWx[ӿUԧIr29 2ü6}T^>~ݧckTSt Ic tKXݜ-4RqOA^.689q]V/=:6PaLX`*Qb ԟh ,AJqӴ_nB},Pcs+=l 6umSG}~>Aʕu-Sa]?y ne(|]Y%.<O{y!<M1WI^UImII9r&?KEPT8`zK';=\ ij8Ѐ\;3& DB c':`3p83>S)'9`0 L/U)G9%h8%6Ys\&Qh(< lj~v*u6M{bD#ED7P)/7xr- _yS WYV쮌g7g]k)V/vuN&\d%AnBf[OyxEGWPä%2#b^ '!'XeMɀ՗yPIDԖ&UN*Bm@|>^UZV.C'B|&i涻ogwz~h·\4gyħv任$SCRVo*  n mJJ!ڴڄfS 21?Af!@Gh_x嫷>FEE~"ʊhi!auRX2h#eDYjV>R}KB^pp>-ΛHbpf! lܱZY?$u֋,oqBT}h(;nfa $j{5GZ{Tg6b8c?eWpZ#AD qtu\L !bYI9B_aMq3]Vh3ƌ ]A4aKPKY HMW31$Uf ˲\ odC9&zT M J:CV߻47m!(aDܝrV QJq6f`Qкǀ?9+{-צ!5JFI Hs恭V^q4P+Ϫ:]w4N[e;pG-%F`r_ t 7{@e@{4Ǚ6䢅uA1Rf$ѩɅ3{qӶ[eFNhiEnskR _LW+$BGbYSG<9 rtkсK$Uu˯` YyDŽVLcGiLiiŸ+t2 v8{vgEN`R;Z)KSIDh;mIėfɮRئwIQ:MՓ|8ĶUeO$5OTxBT+MbPţNjm εBZS҆z6&zzsjJpH܁I>E `#ORic)]vݢ,n5R b''h-<6_&L;iO O3bØ0$ԑ bM2:r#;~^qhTels$5C4GQ]]OGSl- +z=9l\!0HG3\Cwk;uFnCi!)C֏kS?3G~WS < kotw28>VJEAAVk՚@&.?qUiXq4Miƌ#B;*@O4j PJ̭-L&wȤt$Sȗ#_gq 3rFe=+a-ďF\:-rJ~bWGBakd W %~*}aCr?)*|7'LHySJڥ }' q/rl8lCF@# r\`#=Du&+hQI|'rÉ{;^H ?t3g 5$яN[wc!y1=X3VՄCBAV.m`qa_rs Mž:e}nfNenY{{&4I LXP:KR 91TI1D`h,U`+[@c53|>ƒ:&s8uw%0}6b8_N0ܧ Clվ- ÁY g?g~ ٲDX, |Ʋ}&y;CIȄ"wIϑ{#RAj%þv/A՟ 46ovm@Ir|ٰ NZ`1\~f>,Y?v $ 5sL.=wQCplnUOI0V̌rJy2XoL~(\YSE{sV{'sU#R<+ zNE:Vk da-^\k?.I/ a%i~_+7d]$3#u*0pvaا.b3 -T>ACMec'~G9yҢj[LajTn.1Xg zح| \ *]=q$[:9޳OiSBý$]iQF]M| #С1gTC-7$ @L QWq.@:M^%f ;"6J_0Ɓ/H7IwKi-޲ HzvY[pS畈2c՚9d}CLå1f1'|"㫡w~ʿ )UF  "_aSZiQ/nƝgaT܌OC[0VOslyʷk)D\NRN2]2 ˝*8F>'`ʗ=F-AU'cQ=4өG$+i? 4+y.3?*M(> H3vΆU ]΂[dɖIFo4mHTQKaũQV\lbm3t.=D]x +>{Mꌡp8#pBQYF3v>0. $9{/1_p(+u•Xv]7v5aOB|l# z=|៕Ԏ Sm%)ns挧meN toL4bW\HStVB8R1{H2Ӵg7̏Ӏ`yD&L`i fd./xDf=xr "߂F')aXNZ-JsGω==֬k3&/CA_~춶^$xc!Xtu0ǍJ~&Zk8c40Z{ hmdn  J*-DMy9{ɛٔ1(v|k,[}R:3g o` #dl>,mb O t}5C}E f׊Qc")_ 11,HV̳ӳL9lCr7sJ*ti.Q,_HXc{ l n&Rlj$d3W&`pћv7ͿGלy.DT.ԇ8ߴaY`iP 89z,y{سxhuM!@oԗc"y,>wu#*N+b,l":$=ZU}ܹbҪhF*K}ˌ*׶S%:w$礡wdUk3,C]tPޯZpi/&}TŘ4_ /5n, ڊY'4Cu lgh|ZXc*v8_w;ۍ|1ѾAi߄>%+GF9Wův9 ӹqJ(s{ӏH,msѺ;2_']%9y[Sט5? )xDێ5Q0Ԧs  r?<0mH6W&ռ>_6hntpqZ(*isDqX[7Of}=\"pdI??څ3Z8ď{ a,Sk( fs˙a-YqAHiŦK2'l*5+k0z52\k2z&x,ykO2ϐQrd)RP~^*"`?9FL~^Jp! Rl2*1bT>`DYwg 'XđQ 0}:w,L_cv0^˹dfa>IFgN~"v xAEO@}.JҔ+ yC Tw @^%~j rN.! q^,-K5z0)qA|*~B`#EvOz!X⿻ťA'Z4 XʁK&-Ud#_\6F~*V}5jF7Бj^#ĥxK";Xs鑱>-=%]e(4gV0 wjAc}T<~&z}@sYCvG=Ig+Y`|>פHPMtx-VSüv7{%WMAȜU%ʨK2C#'J ġ=xތ9DmHȮ2Ufȭ@X5E!N|ůFT3Z=^xf5uC\EOڿB. \g;!R% N,+45?{r$aZioKPa0!o3i{ E=NoB}oT>9͖?iAQְ s;8ݵ/ *3reB**zvwشw*k"{G6kfjgp*@Z\B |Vv:"Cѝh`QIhtWnѭ!N!Ɂ7ݱD!C1 1U/|&:x[{ԦE@Sc8r"(#145Z^6rֈ"dN'GB=ě vK1 s ӓR|VjsŇ +&y?URjΛ脕[±2ՎIf+Ǫz7 f>nNqI4^ѡ>ZiTpJrKĶq{6TIxኼH4:%픏9}GI0ՒXE`}Q!/ʥT ՕME 3zMSb!?jeSmW"upY["# i~ #$,KA]Z _vlDEߛbg qt5uHO%'_U"eLjh#G().73dw˧p?9g:g]UNFFP<qqsLT25~YTZgTVJ~b$rf\9.UC5HȃΎ)tdQPch{6%9z^7My+>; 0=^*[~ke0JBY]XزB;<4;Sk §?r5S bRWhpvCH+wiyxPjr{ - 4 W?+f)+ݭ^q Mb*1 "7Ah)-!24mNm[Dfחo9nD;Sv p {s[֘fu8ZaA22o$f_W)$wtwm:}.l/lo+vUg4ֆPsBamM dl9A7M!N'C]|kI'x1$1IqO/1?ˎfHp B˜8HKTSKQM"ZkӲ*. #dMC\CQ,89T6qm2JrkT5^ifH{.0Q bu?RXKн;TUR)- TD M +GyPSL! :elùDV`87ln>h.0>H^ \@0$ZatUMD|0:XD @* 1p͗#6RFwb P ~0|YqWz@k~lTvGTkC'0tYU- 52`VΞ8C&SV@T׈[V!Y@ 2mH1$$5$?`,?I%@d ?QD@%AK 2 G,,Q4`RaPXHQdHl(&I*,X 1X #E Q0QTQEPb@X"AHE#  DI+" (,E$A2 ! n$E  P) ,EDE$$"UbUAFI",B( PDP"a*T@R BB1I!)df3 Fe)c D7e"A $0cEbKa*꒤Xw``b1$@RHU DZ%fi;HBg $±hWO,i%ztDT`I$` ,$B < I*IJ RXc$T 4̄ M0E! )89!w|/%8K[Ld4%7ځi6  i5w@FJG|a wDSԚ X'i+lr6[Eled$EG ZC Gvk d&%b%+3o|~~s+DDM/϶7<䞌 R@ >Xy>NOf&D X=SEE<4kFcWV7pB(@| %h½4;rٵ`B@&m2@ 7-V kqBXOsdab+,^ξ[B;4eAr~{/c_ZuMP3Vj$E0^zzcIB 1 x|*74 ߻n…{?iK<+fWOkG2g'"‡0|~ Hړ1~f\VN=L'qw}㱙}[Q Z ɶ@֒- (m #@0Dž[ QBne\tl'fIJԠBNXV((–I IEhM% Tg*vB>]rXz7fn5dC&v(RT(Ac 50QJ202 1ň<%:gCE`,:`ǡ̃b"1 RȰqh@YCI:w'g%'dt1zgX"zPeC *ZX~|&{]vol$M?%<?=V3 t/!<ɐY 8l5q-QS7E-T2([ ($!'niYyS @]ٟFHy6h$)MMosپlG XV̠q-qEORWJVeEGaQ6"Q'1F8(rE 5 $D*^VFRRE'Q6Q+ů@'Ō\M\xEo""U蚒LgOX!vuU\fF9hvz;z7^8hND*JAU5}&Y(EI)B$+A ԨJd$HPd)HBބ hg0lΎLl"B"EY" @T@A 1Tr|o\!(%hT1Le-;.ҵl6tNu2tMmy2C, Y6@&FvUTRH /PaFLʑ w\3)fN@tN*q5XHQA8˥ 5oؤSԼa-J^ET ܝ7P556p A@PYyag78 NuC"p L[ #-vz]l'=*')X`;CF}.vV/V Pֲ̀7E@Y x$=R@ Ev,ɔ7ҎQIx:p9DOi<#0aB "2(N#ݾa:tT:2L=c!Yư.62U,"L (NP ovį9bQP࠮ $r)8z,#헉{u,|ߧoO=§V0(<P6 t ` )Wa(G]'$lHcNm{HQ=4`0H P ¦IA:Lq!R|Oa RRCe!8BUHۀF 1)XY?ea^`gYޑg=<8w=<'rӔE@V"aM{Bee<+xZ0ɦ 3 ~ג !uKz:{>G 'Rdub&-Sca$DC''s$"B{=i'^➟{^:EhSk!x=ˋ0{j:8N:$@'ឱY֭7/A 6zM'Fԣڎ2ܪ@0 2`]E u_P(nΌ=Z!6 azDtr=X1POBMv춙vOF27!cڣ*F)\ 1@I(Iǵwo͞&NSOkecdUϳPw Frʔ`cZ|"a_9H1f箃9,^Pl`@*UlmYHHCζiajlp_"eޗ-K._anAFmMi2+[V\!{ k*xQ7+BPr֪ BH Н@`[ |'B;"P/; @v4&H fd46ƙZlF)g`QA`4Y$`b@$zB{du4TϚ;@ jg :gȒ,d\B'&0Њڎ"gs0J_xXx 6 Ou}vz/B~F!h![me5$EUUUUUUUUUTUUUVq戇ᤣ"2Xł"*(- $`VF*vS-U#X ME!)څQ1eĩ_}J3X*YlR,PAIݖEXJ:e,{B'n:/)k-IMn_)ڸ-M-kj1j>8a'u?*8q?-Jp'5;gN0՛lx/ݍcp- Wtرl`|=3\_7_G<ߧ|t,BDkKKMM8ɦRF )+1u><)u7}q-y3wz=w|:;3z7y=}|<@q!{fF2ݜ9"4/W!`a3XCW{9C,sŜ"Ih,X(d A@XBhKv dJ\2mfJ*8ج i%VVn^.उ),5 jdiSVa–HT2c8nx/º*bM$iaD>~k4IS2硥G T9 k Mso+vAUȃ5!]߭?qŻ+OORԄ4@ɪ(,4\%*a= gB3lY, L6Cdi:#h#C\G]`~t{̯_#0DDDDDA?+\y7V*k0-k͜p|ύٱJ7N'ynѣ Ru:GligӒ 09ty':Qad(2#wDd17gJ `Ϋm5H)5q§ OP;va6R:#,Mm$8tLZb b1O[[n De[x8Tݢ.*r&z  T̑Y+;Z3Jy=Q)8 5k\n>ϫw9;mu*"{Bq* f(4jDDLe="9VL!Jy".N;$ [IGt񣲡eX_qy*,2K)!A|wѪ6"y|x ^Ҡ9s Ie`I54_Oi6aݗeRWDM{{V1(,) ( AaXP",0H,X,q>҃>m{=[́=)"nd.xBJkvC5K F7|D4B"!>BM2*~I(+%5E,VЩNP_p5׮jWX4uzgOWԥrTBY (6+ V@Y'ݖJ ,+`B m* A-QeHLI,UebAAF 5-h[Ad`+!YFQ.\WԅE!$. yrS0ַ]-赊f=;+l@"(XUX$UQ"EPV(ł E) RbXB1"FXR DY$;xۿ4M/[s1vXg⹇NGY!y'=t|%N7s4cGGOO]qE;s(vxe)P6piX*:+bVH7L\pU[Ƥk@B*H[s]A7:&c_g+6o\81x5g 8e!ߣ, d QEgUQQ̆+gw}ÞNOB UЎ\ $(!R~#ꐟJ0Eyǣ4I1& 3nHł1Ze Ȫ# 0%k*ڤ,\qU7[1Tci[I,&DY0m\׹_l*M3ABJ 8(%D`Pd+.10Fn|oa($1 BD{98Tw_~KӝSz\g(| " 'rPxK&y8CP&jLD4YI]y뼞-u>y_Oc%iҙ $ yi8SfN^|F}<~M=zEw?t)!T[T?;]dp}/>iSg}gr2) `_Qa3 fFf&BXvl9œTaD'H>)^mP6/% 0Liq>} (RϥX0qԓwU_n{LT"D|tOzP(;uMtIE&\D/XHPG :t+6aV:H<=1RaQWmF4fШbI6`ڿ$9M2R1*VCn?sbE "oB"?sT}^[fVm(/>/͇ryijH[֛垀1a2h(U@5/I U7f&kyK.Q RȢp.xq%G`Jxv C(y>:P1D ψc2nBG쇲ق{/7JpAX,ki6p;P9+MX2 cbD*8z/NE«i.`VeʺRL6Ў+ouXV'~5k80ۆRc{r|ː]e7ϐgW (7QtX-t$}21N*Lhmgq4/w;vӻ8yփ2 ՚>2Fۀ7aQZ}՝^J7ep⌹}cUb&3xNE O* ryr}u,gX1#ɅfqUh u4@Z@Ɲ ~1ѭn+ݣmU(HIj 0JM_ gUn-'4ge2 Œ 2]PDV$BRxJ{o1X: jm@o#mbO_|qJ֡i3cMf8@EGX dֲS&Wx!D t섒H(,2Ne, F(Q.jSr@ UD>IeJ-OsR<#*!d̿ ¸s+{,&㾪ya7ޏ>j/=KU1 /?= 3nS?^E/_zkt2#icAdw}73,0|J`1p*!"r^lX#&dZΐEdE~Py'x>} 61TcR ˆbR>n" ?XN72xT"JyXd`2JB(`'ӎp LT_0p Ċ8̔ TWy Z1ѝ*CׯV0';kSJGuE(-3cȁPFMQ*D 1hHbFfx:) BY_?_jA|%,-UUXie3媪KUUx1c}S35E 五Τ)@~[JCRIEp!v 4(_ 巭eakPGc^O4x)ۥ`=$&WF*GGE?[_3!PHHa3+Dmv*eH/(pGiPA$ >{O2e $QY[0\ q!=_'V:rt|3wҫ(x$C閹3$n0jn"D}8O$"'Tc\]:v(vnfurEg4XL _ zfNv9L֩L̩I $XN^XTvl0X9)cO'∵}7 OW:LXppW CGGNxt*􊱇~&آxvsKN落Ow(.E׈*k/}AAFgY|wq QX EXX*0X,PU"(""VE`^yg}?L0?*݋VIЇe-%UUUUUUW_l}JuݪtM0o.\ C }g^ڮ"aD 5)] a+!Hk4 |nJT@2 " ~;NOFA…$o^`~4ɬ0bsd$HRiYBtDKViY@OGJ]K=2u`;UlM Sa,:ks M@0÷tL } %C qJf}O4C;S&I4Xj՚B~h00ΐMjb~|Hҙayy>vYi(DM"s2k{+$XG*~FIKExgZkJ*Ɂ85매Cxpf,l+AQ0(QDWQ gŞѮ: <@ǎ^QMvdמ&j[/).XpSf/k(,epQjʙf CB}<m=|SdSlk Nu2s5**++p̸RL`)d0K+AtX) ]ids?_KNC|ix4vhc pB ;__ ƕ26U UDgՋ|x7f:lBmI?%yWG=5PH(0^޷IGHnh:>_2+G-|;9VE5]% y:wwJdgvWϪ:l>(d+ᐿɳF $ xYeC}QQ9@ԧN/?Oح);asJ7&Ѵ˙\ӎT|iA|jP }~K"sN`瑦ETf]qmmLm-ܶmo]5b{ZŇ'z٢ˢnp"9K:a-Bំ|VOAqc,x9ۚ48$*IVHAGnK2?{UQ!"e 0:k~ 2^;#Ox>\g9t‰kq$QEDEEQb,F%hU*1(ZCNgup=)}^տ Zft֍)4(QXvDPhd,ٓffA +8fXeGَ\~~3mAU@_rufDF1F=&}8 lF`  #Se۬Rֳx??"yh -6q礷*怢|Rk:Z&Xa Y{>{퓋ܘ"іY5*' ]ҝhǣ咷׍d$=?IfMA eܬk4;4,?hhBdnݹ3a֥c*D9Zz2Wx(ym e|egtWt K6 N@.Thj)V!'}X7aFfgvݿ:[ߗG.o:)Za|s po|i:0&,vg]e`~l_XQnLߊ$Bt@CvyTb:y\/sqJlcm{Jn\Vi z߮ܯrmn[l99s@3PMm_(> `41 vϠ nQ7$(]mbH)MA).^\(k4˿L9aW.*T=ThK)+ #egH$PIp}֬~bh8:o60>UFg4ۆ,h5T"_X@3kl2qB2QB Vx޺pH]fChiBur ZxtΨFP1PfZ#XE*'O xgTJ!J piCBUC SP޼\])$@2.X5L ԩys_D5( Jc+xќg.- ņZܪg#bI{>( &wǘ("u Bi)E!o(kI ! ;`TTV* ;Pn|6$/b>D8h$ĪiI6B]f) `CDDAU$"'F}@1 P/vNݰT*lcN WZώwcF1\VsMl&`Ա;Q`cգ"Um 2k`r5xJ:#pXoq!^n""Z01b,{fORpJ (t` \T5-љaf ˂6YZ2T-,1C+ 1T AeV,,0aV"-Qi0 I(2df52"R‚ũP֥r)]++fІV7=BLSVQUI\FkTQTA+%AjV7 a!Tt.6Ei͘*yoGx>ZWn~WZi&aRĊ ro{R $=N}ӥKtʩU)6  =-tD H(#j"ELC 4' $37玝 +j1YOܞ9VOÜ-ˀTz(&R4HeB)ZD)Bdbj @Y84ƿc,Q'eua<ז>gJHJbӣۑ>`eLF§2'}82lX/Mݛp|~y7ǚ:%T(1H:"3Rl0]woȦ)!H][ׂW>:8hoT^ GQA +D ;0 бDl̥]喠r9DX0J)BeM=&0@Db1UDb$H(/ztu/0X*CRlAі"W,,Dm >d^cazYue!/|)cPQpbAU6)FH>_Cn]릸DNBu@1YF2)7D2%+@Ĭ)_e)&xZ$%hC[A4{|e#tI QYSGN௒Sv%Cbl uAUKu-e( Yz1 ORn,((87dI%HAT)c:|3\L-q- [*F |:y#}om6CzB%1o- TRP\T-UUU\0Dp?]݇̔e‰22`f#W»A@)(*B0wU]6M X@P QL( g<} Ct^?'僎z|{{`RaY0;PـL ffD$3Ȥ1<57:N|o~,P4I*en1 [=Ѷ R@1wiȊwd5ˡ-C`#$kd1UC pYbdAѨ1XN:gW=^.{*)ѥ[ZcteӔ̍a:U2|bKŚqZ)mve<>/·Wўފ׏;y|16J~ P" >'}',ֵkZֵkZֵkZֵkZՙiLQs2jU9?LIy׫?gB}>B|\h3#L_z q36f"c [QxkYkwgterۗ=؛= (@ekjY۸7 7p8~Kd3 ˜;(ދĚ'=@_t詢( C$&C29R\II)+p!/GWW{Gnؓ "O̰3eYvݤK` qlH&7ܵ;x1EENd@6\ų|2z$+gU!B;؉^S'0>`1&cdea$ HEI(E ""+!"PSLEAX,$P",YF (I a*,XaT@ AqI?Z'm0 I`M?􎮥ٻfX|XN|?,9MЕ@Ϊ~P!66jW[ 9{/xɛ(jل=|EBRB(/:ʰ *`% s={߰FH)"+DP 9g-W>>y=[E6;K!\; bF泏eAu4j{Yn\Λq4H Q%aQP`$rFEH~ f iN互QBwQL\1PY P 3 PՔ KA,F` lJ X1D+Qb\&1AQQ.qt`M5*I)%GZ,YәT5*DbIZK!I Ak1Z" @L"FHTte((2IKgj@B(Ō#)@.B1Eq뢰f!Й NZ`yA1XUT%%JI$MA$}v*;cn1u_9 >&83՟޸.INE _/aИGeEǽB`0=NP.Ag.V‹+ZFo`YeT f{8*E=NTp>W< ¡D)7ϴ 4y/Jmz1J.RI4N1Q0mMm6֬IVe`γX@f661Z*VTCY!ˉk%Eնڔ9p~K6f !IBh!sv6* ;Vf|K!PX@?ϟ Rw>kBm( ` >0B/-sW|, o229: RY)Uw}lm1/W! \mL8$ݔ>Ȫfڠ.r@zꢨa=$*&@ 1{ϷĐ̞W2zrԋ^1ަ &[Y)MMRgL9P"uC!D9i`sXdZT`8, o?_g 7FSS=v*P ٌӠmGtG /}$)&ŬNm5L]"9gSpԲg\cӓh OYñ' ទ}»CF<[TRBx,l4׼0;V0G.ѩ(pEhog_~-;F6Ȇ|KBŇD[BׇUlQ&WTjN-8|Ys*|'1w^E}DA{+MN(@V}۲dSTIϱ$^TjDq -F]rDL7]ΡVB2 p9 ˆQ%""!dz'Ncj7٠D JY3&rW&=_~rx#ЛR* ez/MY\7b u4"$ 5jȁ uI:'%2snwg3ϧeu$:23B!eW ,d82 S:"`՟w)$O2R4lBwgl޸L5J2Œv8iMuBCkޖ\6d<8盧WcKщ0ѷFy+cϣ@$߯6>Gǩ*`}%: Q f;*%M6Z{,BTEH A &&8nߵu66S`hUT% 8TxU,?e0uNSYKaRa9SVy@FClĒPyV۫Ux{g޺TRL@C[# $|k"pJdhKW)Itms6lt =jQw` &%vlcYysRHL@vB@rV19y0l]r<ܒJʼn$`{P\W9!j7KZĠHb 1D+o-awx 7gᭅR@!vDK QB A kU;W\pm:p7L\1g@nYP7\c!)wW`qq?򼯌gOQb"F{F.g + d %⧥1܇k( _%`AXV2[C+T\ M4 (2=8]Ff={2:$QE!W=Gܝ;Zߘ0Ǡg !%4834=O(^'!  cDPQ@n k)Ha>"*ET@bTdI`IcV@1>B$u#q],f҈63Zέ2|sؽ{C|Pډ"7Q)MGI=M gwDj))aFh$<;яmqkNJ=W߳ާmCs+Y($L*9!I=N޻,}x{lt{ǿuLOrbG4dZJ+˃tVURpu% YxW-5bPQ!)~Ԥ*z§OW7Ί4k9&xLT %v[z ˰dI%m#}"nh6x@hAJt wVR> ˅fUYdY3-2ܟ۝E~jˍ,⫲2ׅtS nB!P0tl񘞊k~& t+V~y7qDZѥlxz͇K\)ȆLgE%N"$bB@` -ғXQ 0ԉ+Pic.< T= LsW{p* GL(vT*BBQS7 7A<*ue?b'ueiٖIqW(޿4f,s$ F{PPZmwYc{JY>05v]1'CY HHn9.4oU 1q$૒ صc{H:#I `̟PyE: S=b# [#p D4_V{wMꙡӦHWEp{0=`Ñ5U+-^s Qհ J/4hqC\\ #TPH7S9JСZ#:1^~{:l]U3@uǷeiܔb?TOjl^|zC;2J )vɚV+ !X˭8”x!$ս4lfCkڴʪ3/9#slP"@-TN{@~ o15u{hu6UJ,`3Zb)ʇM%aK#54QTauiyYGtڴm]l4I̡(H|q\aل T#)^:M]3#S1֙@H!VOyDi wԪAgf09i6e{9,M0D-mHRh @QVc*_1ʓ+ RTIjэokoU톶4Aba+=SM= AȬ,ڜ ? ͷLYҞRBTmBkʺq<2Yb cr2CF%Y .6 AT1+_[ut'jkdːѻD3)@PC*Q}l\\YN/n]o]j eˀn @CfB"Bڥ0]3ivA݆YLZ췣ݪSsa,Vw@< 5uaZ÷T`ڔ`# b\ *Adl1)m3 ql` k*#M " ff (Js! @X@EQ8U"E"FV xbB bA.<;+ Pnv2G18w71?),ٴ c1MB aV J:#ق̶)`yE0nÈ@ qT.n?ᚾ1jxc$0SUY6S(8ti׆^"E&ٰ;X0姄f2(&kᠤ|\w<<8dl[0HdhK} /H5tje2 LPOt"G )ݖ±M0]d1<,;qOzO;݆h<Łp;'"01o~)@F)kl)"d@@RB!m$!$>Cd@ϒk"Db,N$szO!?U&(>5#aE$!$PPӚٖdwnUd=$N|0/6 ι)G5r sZ>-:+m=r\q z(bAotR?J"ErIV{+¾ݼWE~9qÍ<|UΛ2r_hf2HӅu̗TIO$UUUUUVi&78,xĐ%K 80TAA({JiIJLpAJAZV1E9NJdBp= yCRE ,i!Ni  P"hТ[9R؄HצrHRi@5/ VaX&SĖ6E-hd|*i~;0h+=0o9$$$x`':"JsF2v|\ Vdk)=k=6f}.Lʕ* Qy>h\Gtɛ}x={}do kHǐm9` s\N)O bXu. R j*;EP~o9>+dC+ v!Ҁj/il/v)q w(Fg0[*ihj\vX3gͤZI8j#rh\X5 XT42 I8WP}hGh2rLQg(K5]HMV\pO:HEs`8-6tMx BFuPh} Vjթ:H4TAAa"]ĊE/(CZFfUi:7wkI[WTZ~AbAAs$P5VKb0![ q`rt U+V;~V'CT3OkHu<> Kɦg$<>,F,/>{dƢ^Pia܆~a&^ .b0jL؄+Ln ϊc) ;1tI C8!ZGSƭMUͭ7+dU*?$+ |< 4YsQkϩc*4'5ۣI؝}Q-7DoΤ*_ja]^Wե.J@!%౲?" f͇G<ǭ9nF#aOxh=9?Oz+'A.=~ ޟRgtkwxJ3jϛw'(MA]k7*SfKRfxOݾ B? DQsNdJfS0YV|X8Cq:Z7(R}bz LuّZʇ|t{&:K{/`|4F\`~\Dj]M8R!jH=0PBkqq/m៮{l*B K _#/M,LmT|Y;0trZ6UӵSWfFK&~HZfTABigP6s2nYqSOsSRWd9j)ކT*i: J|oi❔WH2vYPw*ֻ;D7RT=U{QF`>D_閽A/[ͯ7X+r#z -l?͗O痯1v̫ ~eNzX K E䈿7njI䣡\QIq䶭}}0G G:T0>WtْźB b&ɮK}We\Y,-Ϝcy4 K XՊn:͸xͣzA|[OdPZk"wpFqrKA"$@ܘR@r_gOgcl#14Uy6#'|sUeT5^Vk>o?7)϶wzxW;V+F}o^ȟ_!\\C~{rV`s?1r>?Q!\_ͧMhX?%Oz/KHc)^Ǖx{"+&vZGK=ViK[_;YHEbK0٩m &ƆEZv׾!fW 0uϘo^c"*AQY"D >4e,>է>)ʋ m*_rY r=^ @T;5q n*7\g߱ CY3ift|߿~vfOh!܀?(Ef|9έ /,=eT ЕI$Cv=%3aj-{Z(~BPRi>?^\}_1z䪮3#ވ\y7/+9P8QV{(I}[Q&IY*T,UK}ӷv1ۿGg{3=\e)C˔qnXo]o{zΚٳg?auaaa>0 0 0aai><|:8OuS9ឞ$I'(QQQQRӘFA=daZc\VUULA\Y2v~ƚdܕ]kٕ4ԓSvƀY \MLf @YFFL, gJ l I TU 0VNdֲ6(p{Cm~׭8i۵͆Ue>'Ƿi%OZ4z5۽O/y꟟Ŧ}vbފUjyU=((Pyɇ Y Ț~^.wr/t~ ~xq7+{j1c>>#` b#(M DaؒeBG{y'"!UvٓODUU+/߱"Gfgl)zj ȹ>mAVt [:,Vi5jgipwJ qfJF[,%;E3ZtqAkZʑtXlXjW_W(M 6b?s\Zm?.;3u6ۋM[R_OLty/oL-|v6@ؒXq0YΊH==_W&,vfs[4ӽL":~_~v?wO[ G?<"9ɾ?NS&j8.?k]7}L;;(GoK3m Ɵ_.buC:_jT~?;rJ`p1ˉ8 j|#2l.d !(h|ޕ(bYYN[bMmaUADczgwmcQ(N-zHι džLvi+?~!ƍތaOn;7 S"po'C+|[oWUV (}&qLCN4PM&fCt(!8!1;Dn F2U3Tʞu=#PKM^77e$%I!r B~#z_/D6 Mi cBi>9_jW2vϚogvi!Ll@HԵOwKS+TIB/CK0יSe<;m/svI|¥+KlREDmC#j%#g4-, {[EY:}`i?}ib_[b xyP1>*ߚ.ERlE8|EQJZ_wTU`b/`-tiwB))耐*:2j}TL:dAǺm KS6  Ub}_nu_Lv]8$lCc)sl/_6VO"#m[{\bm\?,XGѢ`٩mjD=Aa"O":"yGX'G~hU(Na&2gU& Xvh?At+F]~w:++Mj0&Nu<(bإRԥJ/GESy܉ `?c%sZL9̄֫nx+f2+4Wo5?{"pмy*Ѝ`]bH!FU}ݔUa&XoqE&;W͖-MOtPie8dCQ zVd[^' 9uz l,WlD{9mGEh^T'+Z /GsaZ0סD/ (Sy(3[ǎc^5M#( JJ#>A Y[O^2$ OF1|j\Q<ή#kG ^h50nc鏆ƅm03‡y'$pMFT Ypܕ_Ox޴}b42ѸC[Q~ jYVخ'MNtNMيY:r^^ o~pL@:7$$C #[N?t1H~K|O. U,H$?7dB*E[C}ޚ SKܡ_œ5:{_S?&if8b;I@EK#wo"\G(r\g`$3!fI0-И)#=o4ɕ%d +J!|S nxV&< AKng*$YY5dE1S8n9ፈŒ?@I|#;kk'"wyNP6 N˘MLze?02/"vn;PvՎ#|qhЧoA:)ԻKH:}hHIH8Ӏa 6&B/{OW/fYm+^#ثih6 B`?/u8ϣ`8+/O}ڒ##7qS4eaX0rx,n46_{}pH<4WnJ"XKaXkf p~(ANJ!-.skR֨jrx6Ŧ9"oz2_OF-w\S>,ňH qȿy ٶQ@ϔ@z njL=_ٲld/"iG{j~y&*\٦5+|wc3u%|PV+b63v[E7о]sU'pM*Vƶ"ZS`$fai[Cmi} 1k Y6 s_=%JpӈGkf O98,!|e3-ԡvpd8y.[PeطY'^} &G @D~'k@%UE~^%YYnFkO5𷤱wX3ǥC԰M-lՍU3Z=44uW/%P!rr@t9=&d㩫7M-fvNmwc"g!sVmהXR&bϪPPL7 팡@Q΁ >zXechI+n(PF̐_o~Wr.m׭\{;d MgRPU%ܨI< 3Cm~J)U_R[1ϏfL(e2 j{4/0<zT/ 놟SQf[PK ܡ2P$ebFG͏=wѪÞsr?uq+  Xl?MPRCxFs'G VX*L\EUDSՓ3.ۃ9dG%!_|Y4 ɮ}Q,[.VC݊y.m11Xէb3>lբx'Ɍw<q;.iUݥ9 <߻NsT;c54y:ni=P+:Gcn<,x AY:Azc*/R>XkT`n{kS7 J[-&1$}Y;c?Qėa&ޙ;eV"w$!dnb"pYM_PE}I~=Awҩpk؜(i8+ܦAFQ_':GQO54t6 AAmZҴ$اWڈ7O >'8P=٤bLb@BDhvYO' L[1h a5[պU nyWМS+_Ixz>HI͍?D?=ܴG۽un᧏.8dEùqPL[MiԒ uP_v'9S6dcആ~yw)?iRW_ *>S v&4DZqΜ[4LH(G-?x^Dm)hVV[lNx!Ks7mNLS_Q%-uBGH|.˻_R8{p`v:⇡5\)2w}0SL4M~z5Q K$Tv%M}dA+wI88JgHӳ  pMRUKSy^! O׵|^|iOŊ;VB @gl܍JBmut0q-B.F8Z' !Qa2=H?h 鱠 ɇ`WA5jrX_`~!!%|Prf/nQrpV4ueoD w f!EuC^n+${JyGK^O2uKH h&nBY^i+6JܯLQWi4]5vi=#k&p(!EѴge.bD7yR[aNu]S\eNy`"LX8B^5s>axb[H-L&dTl!H?;Js;(',AYCxje/hl_?|l> ^L+ۇCt-^*PXʶl .LUcEj)3L W0Kc V D71mRp)znOA+0OEQ ;w΢e_[x#0(2[迪3[0@&/P;[ voM$h9u蹧ׯʯU~}QfzYjU?ʁbA"$ؠ`,A4CmMmys%;3%Xf#h`ЂP2 TX[[EX,hd4 [AbłQd0eFc FR(B C8[#qWhj=@“k#f[Fz--ċ=*.f?fyiʥ=Î }CQ=bSbZފ,rBX￉)z(pU/ʡ3KbS6.Vʈ[Cΰ*R"h֏яtfW1w\mzS4;# Hf5 %ւ-P"^.24+;Qojy,f~ڟu/'!#A}L6#z lM3ڈl堆 = ?v8hmi/7qXN6jh=noa89Ukf1vӮFFD)11M6m&>L Pi'ws N61|?B(hvB(i+@{ɀ?6?~9TSNseRTxnH O7_G\^3m=Ypxr|vdϖ3XK\v%<2MD,/o),zTr8Bs(Lpi9xBץYXmnMHޝ-\7 ]gF ZoI+0h^F§L!|2)ǍFԆ-9%Ůk`4jxPĹ 5KTQUs/-ٹbTG[W|F*: XniJ&u>dY\8ڂouB2ahF~P;Mw6[Ò%`,v@@ GlM.V;=c)<ΰ'dp3PRffVҵZ&H#r'/Ea"v/;'(RN H }#`а˗aq(1,D(_jo.͜< A H # 0C0Y2yX˻V(6Cxn')zrxo? ӬV]iem>\}V9zvixsT&QJ{AUJ6vRm+y\G{Bu2EP>w|9siOo{7²VjpW;k<͍WY5^anɐ mw[$tV_,M2o(<:{"o? vaM#jxX|,7y}sx()6idM`zE`{t61,귭4d%e7i6{lj"?A4q@[vwgz8F@*\Y2Z."#<=կ}F̉NXJLq䚺,%-2k$+lVbVNOWbs~F&u֕(eVovF@d쌀xĔI*'ENYSuŶ}kD(mזg5FhR$`@7B*T 2CظQBI}}.sZ||֗/?4GvFUӽ>DEkgK5h29G#9AHDx߷QE"!*RH!$,? Bw5/s6K;ٞb0bʪD8P1~*|2{{ަvȚ'@ǔK9URwa.t yq$p3lc_ڦM`|7Mhvf=FTzI1<'s".Yłe%8A鼛55J_IBjl -,lH_Ք־yc n5fe3cϠ[A2*XFeoe+9+ Ë vy_nqlA&52c)ԥQ+a5-|1Vǒ8q/Ú{-F-}+SW2O!X Nb;#n$SS%ѕ{f.j`\HшB8q}Pr?ϊ@ Lb% hJIHPQ+I*0`QAkX(N $FC:\,$HCm.тc="z? 3n[\3F˳@4}l+$m"f)h r:)=~*48rseayԵ#i%hBhc@N& ,O[RgB1 CO$~2{ `C!ﻚ$1$ x0`C4󸙣zsݍZoj߂͡XٹZCzU@ڄ$M DBxac RJS)9 Cb-BVN%1Y6>Z~~Ь*OAdP?3F@M~͐*E-dF*$za+*Ro,RqDtB(, C0#V*+!DQ1?#_O|pZebM &Mhm" AI&lOASɉ6 6KiěM\FN$n. i@gX&MjL})S,ɶt~-̻ n{Daa@J 1 HuP{`(9&b}cOő—e0Woo$E_`_rgno{ל%pڌ%F17?1˔6 5p[guBDMj\Zœ>+M"3_YQ0Y%IȸfWt_B;j\NWӉ2տwo0, eK!E<7]#EW6c| \0w&_|*l!E EDB, )[@@Ci kL?Va}߽?6=M5׻m|x"ѯyW D+  oP;H `LD} F‡JwІ?@ @QE"Ua$ѻ4 Pa_&HU bKJTP{Q<utJ.fZ1oU{~Opt,̑'}d7`ěL`lm+k+޸WcLD3"Lx!]VO+i sAn6T4ԙ^Ӏ^6(i PGV$?$2⾶n (/''TE>SRCj2 Pw XpwW'PM `a S,LTň ,A DbPF "EUDDQúW'l"|`?2#ͣ b21b V )UU>{$PٺQE#U!APdXHbCP>6O5:uz"a;%"{Q#dn"(?(QQBw"i&PI^&d"z=b0|X va'SI!Qv#B< )(:=!ȄX!`i$&fϢi ?3ڲ`P=>Fx$*@ , ui }W<ϥv^l$`+?n` Fz&=@CIz0۹rdbj /2vL*11*EH Qa o_((M>/v&MLت,.̥Cǿg 8 cEPX V+H(Id!bqrQPUHә U|۸БMĆ YUA{ϙt?ZT|H$āPWYB dH;$@exZ5^*^!4b H ?d4aD_K&dMHC } L0- d4&+ۭK `j K`)"yhb Y_IzՓL@ }F@0;$ NOY$ bB|IH ~˫/ϥ羻uw0x!HAȱD=];vjItPW\ALi &d,wyd Q!P%a 3!d;0!2 td$H{d8@7$OXIH(6 dYm0-$R%(YAV =MOAȎF$hʹFRHX,Dh gi54A+RoΦ,a+w0<D`MY6j"X+~:MF,/\Ѝ>fܢ#+V5=6$cz|n(x 1`z#jC ٹ!͖QVyMBsX-CT.< .kdb{8q>5q@*,wފK7 U$[|VCZ)+|? 0Ĥlik7xͧ_]e+|XshD!X%*>{(,r,$^CzL$!y|qʳMIE.KǤxƇ5<;r =`X H'qxtr"3e2U#$ߕ#q~z SH7Ho0:߷?S|J> ƷGT*~C~߲=jÁc$B,a>Zf$JhC}}3T*/gx{RGǭkk}'Cn*)[S.͆H9/<"e|xڠ,2li+ۦPf^]*Ed TSidRy^,D;а@RPbo+(}Swt# B {y SbvHĥbsppUa  rLp7><#:b5 uA#w^OٹAF+>XJ8a%/,F'aWtjX Jc (Y6y^U29:uxوכW|AV Yc?SN5F涕Lg-@ Pn-v,AEank-NNͷ\Dǥu]^xHg6gu6|OdTЉ]sP 2rT%T˵5Xl.BH-!&U)úd3UD "9s*.Z{{鹌wM>f`" Hy>fuM jQT^ID0{aFk~ۥ[} qצB3MZU5OYvn' G'M,W NW#29 !$]^xMcv5$Qj7lzdM88uBP>eKRSe3אE_ƒi7j&t᱓BN17{.ZY;o({61OZ~6Grjj4 - ~ q("<3Z rkBI#_f$=K<rvsofՈi+PHvŠubܥºV1 lfAULJc!Tˡ ڇ`FAb&]9qo#Ga=b6:'iO_>s[(]ù*hǺz t2#~L} ?r 3(*߹w捝ZR  MɎy6 #ƪ ٷuNj>fmdz@DyQ땐Kᘷڋ0B ́(WT6 .R)(6{l5WBiU\Lb̻@WeYh# =1}%0؆ym%~ n-ޠVLӠo1ݧaf-tYE4xLbw&;sy>2:x6NTL Qludzzc8ј"ʬ]G -Yf->= 6\̍ۛ#b:TGJO%qoq9 FԍpAл)_]M⓸.P@U#dA!Ѩ(r f9rR[J Z:28TF,lFآe:=?~S?f`otʏmaNe` NDosI¨]/`3?R|Umw1nUR0dXqbȇ*dTG'A~Ï3VkZʵ)JSo^mfַvv/imf]RaEbKmjwQߜ4 y2ldw0dJeYV粢 i#+(YRn6 $ 8: 0n{xt\d9'π@d+MF#b@ uGΒ}20RZ;HrPyH$,K"^;+r,۱Ӄ>UqĿt> »6;ȸ H[^{;wlڞ.ܛ1OavvLT<,{D-.D#'IO2&wS³.}ʕ)NYFc`o ! ]X萠E8`cT`Y2tޞ2l@b=wJ]v^m 2-ҢP:QEd6cN@fE i|/?1׭]ۧ,$2IĢxghL9 "H]ANJA0!myǹwm)l6p3F!v]FHkd΀LReq鞘.-r:@MDߺ0=4gM1 ?\1 ,7m(S Wzd86̷u8:7 vIQN"J RH9Ԝ xߏv @|^|9#֟ޜx䈣^bGif2R vpTd(R}^nʾ|++~fH-DYC2IR2I!Qa,q +am8@ YR=t (2&'bQXYH]vs\A2M$`V1. -8u{I9`n] F\_^m^LW#D!!FP|Ɇ&ϫ~7ƾP>>$Tʠ{vw|_F0_pqoNdkjoY{z?W}?Cg_vH拏^n؄%}ha |aEU {V\bM&7|d@||qX6k} oտ-u4\an7Ni*Ω(3~;_;|œ[Q@d6wQfQ%^6& ;݂)ДS +Yq^g흍d?-Pdz_ϿKƭ*<~]l1ѱ`#B8mogi4:/ 4:n]N'fR`.tڳ#u8;²q "@0VrAA^kq4R'(Qz;<]9EXX\Wwb'z[cf6.Qb`T9wR4ɪp_,Ogv %,zg1,c+8W>P13y7JS^2q5)ө3˱>J>)J3;|hYۼ,Q=jn[Mo,#:#خO9ou[~U%9TxWՖa4UVzuL{Jl߻}}i0'PS6^{Bmۄ>*[[f {6'aLIh.2lj .7zv `bhb΁+5~uqaA-3de0M^eSev߇ W3Oz+ǗNZֵk*֔)Lw`4:rBȈyi)'YA2 @G :G,0$48ڪ6-uk<%3)ݏ'U`oSsP,]MݸfÙHƈPkFᎋxhsB: ?s҃dJ6ک{ IpwE`a`h,ϻ[I[4 />^Bw~~ZՏmp~ }?)͓㽤{lv3asG iԌiښCjXbn#kC^gr>W ҸfG~qRՔJcmVB)гoRY%^L?Sǘi@xÉK?lX,+KE ɞu&B$Y f8|vk JNZ{dž-\OU]k.MHk}߰vӤrrHxw r6}ڢݫmv2zkBߧa@ v" U2Qɖ<\;.0!ݸ$hQ<,(MZhlDof|> PP˞ Dl&1ubg`ւz>"|ᥕtbTix+M]jhS=.[>U 76|Y )hpRĺWųZVa{ZtDTB~Q&Ƿj=|KݩDƥb~+Mt,cip+dNNMmNɗed4׊ò0g} "j| LgԮYH%ʓ Öls q۲÷Q-b^ٶssEz:bi4ZIuQ^)vLÕn0xںuΜMٜsz!b)Y?N0bJw: 8!*AۏvT/IT<[ɠ#/+y8|c7j$&?/rΰ+}FKt6Qun\Bvٜi|מu]-X-o.07L|uܞ޿O&¿;Gi2ao]B7ťUnΒܻ6Z}3jk!6'½'((^ŤNn|^ 5Ns~7v`8i^˾$9Nxv%zD3lsxk,v]%lD;z/ozGy]B\+ Zvpu jm"W,zϷ+9u5{t}9[/Sm=ˇ˷xBk[;eZ̵Vۼ~ʞO]O6'"֚vqL2r ~n+^MlDUeV[%iJ3o$hPkV}O&Ό>`;<]fohM9-0F-&B6c4.9C&V?{S1FUņs|U/築MJhx( `HQWcu]% wxjA.)ZɃԇէWAfZg7[_FOԄJ_1,X5eZ/)}F DuGYs&>A%oݖEKG^ϸ e'k܅5<,ލܱwE R~~QcH{D²0yK8^F>e!)|_MG:f1s.Y4yvFQPhW%7}Q_H8%EmRf@=ޥx] $$kT*ʋz|SQ8= 7=1zYRV27#ed'g ֿgOw,@^ aLn&OV2s.4Sbr5x8dT.!/!Q^oelIߠۣ=DŽSLk3J/#G4 yo"/UHՂ)o4c?[ TR] [O|䚥K/xJ+w^M ~jĴcS#*!ז} ܋@g<0 i ^Jdk)-]h*oZF6zߌ9,nQYfFsXH3v>>)kng藺E_ df7'3i8伜=n uQH ߗꈺf#I%5󿷹{_d6@MhuXixh*c-o]}\xϿ\ 8>>,)Hlpq(BͶVIYT'"\tJ4Tŕ!R}/LDj'C$DApC2C7A`g3$a! j쥒w''Gm @6$*NVCTV5Ha5( (e)if10XH11؀kd)qJgc&\s|,LmlbhhDxĻz+'7қOI7y8I;>nPG2&\m~Mu>/cr;"؃eצ,k@lRx'hS.elez ح,(G%L#^?H5hĶI#~c: 94ձD1 W)Ê(Vqo ͑lsb[aTEaruzw9 4byMR?kf_iPɦVwɘ@/c,1ow;3OBKh m$I /H[qup.chp_{[ZIkr%bB׃cO޿%@! !6Bɬﺦ4>XIP7BE÷}rDJlӭ0g5:Ó2hBΚL0<;۔m̆PBȀ&P P&NOg[*\'WYVlUPg_mCL'q ẽ(ogeّ'  o֔"&+0Tr-Ֆtx-gn# 2*!IZaM9jB8;KRּN٢.U_|H:֢& C6ByJH6[]kidK,8Te̬'K93as2O.ҖG[ sH, `0ZsW?i֮ N%XWӱ-3 ,|왕0p<kb+5m2h\aRP$U4,'`:2]E?[eQX@rfvGRmE+ !F9_^l>JkNֻagY^ĐYN[9H*ߢ!w?(]Cxh}Pˬńf57Lu/ Ϙp65*m\ja{q5X- ~rlrr'RHl[~b~MSPpw3+٦Z~ 11.mo$\mȻQl Y^4ba?|ec=er ʵ hZ 1bԗR ȱDpm&wg:aF&.E8KMĩfDJ `H*$Vפ:s&/ǒԠ Ap[k*FRxՍ.-"P)=`Sc W{PH[!Pa#L-u`!>׹ az3laۭQ]u绡4 ofdlF(vIt4K~ ]zA#[($G?6v ckom_`Vrr(>Zv/,qYh$SN4u,Y累c(ܽ{sjFX~m 53`V$F?{Dp]BTke]ǡ}wX1;q~-&Fqb3)뻕N3\JI$]6ؚn#7~nF&O)F7jEjF)U3uO' n0}r \~}΋AX[^**3f~*aym՝!B E$LW T   D  jⰟoI L2c1o?ommKD婢o{MiZCBg$XgFQ98Wڏd /Gx6 ՏW9<Æ*5;w\s#lFiƖQ!MK Ä@絨`RAyߣ~k컆<ۼ3'op7p{` NWo˷M"z4]h\FӇko%>ӗ]djAE\ g7j$&t%f5/0^Ip)d(GJxڿ.$M(:rUQKlNZAd-tS3x(#;HQE=IZ$`AԼ)Su &tW~퓊!КSn.@EؕU͎-N-,v Ea%4*Ɍ I `ЙLнvdGuY6(p I$IDܳJ-Ӟ0Npjah؊5}UYO(xf'-!O]c םH 3AW'w>l?sd4dC7Ԅ$Y>>mLpC,HId|d IrJȴKiX4,Jv\&j0[܃)wPIx2{0jfpx@v^-0#yc a`x7vH*oOyέWn6=W0;X|B꫄JÇ=N|?C$ag<0mlIe+\J~;v sNvJn(B#y9=r\ :jf2~Zf%.32Qf(H Z`e4p+=:Bhu: i;ѐ9`/n3,@`VГK `$RdfP8l(#gLU:gK{2Qm4AܫƏRlW<9"ȷj7t<\ tK毸$]i٪e!zu*f( Xf=lQ@q2?τ"wp#Ǻ@ٲC(} ;1&V_}=ޝ7#`.8%7FeL|C.iʵ "6@MvvԄVxמ;f@v:<*ofu)~_%iTF2mT򓳢Q+벶uYqυP4y TB8XtCK]&54+6cE9g`6t0UV@$YI]w0g Yz4wқ%QV2<'[ݻtGSE'p=4tnf*:;tu߉ὶ `.hF]di:p*LTJGâJ L-y8M+= 熝k"U3\>%}sjg&ފ3P.J$;pF@Bf3֋ #alg džA! 1˦L51-q\ xn} FdY7ރr5Lx&zmU6&d. J75ϜUz`EQ0"1p2$(tQ!AՅYUS:DAJ% mƵX(f7fxjyB>bJlT5Ápv43cs'1fJ4꼴7@Y4oG_3Jwh6j. 1 b gy;KiݢMUg );uz*|^G v.P sK2:R=R{DBxvL=.UލL7N˓b-R -LfyQl 7cV } u3U!y/=A82}B7ggfĕǝ"4sh=c(\0a-4 m{'X#^.GU0鞆6s0T)sXvEɲcĻ'v-49Ǒ PW_FJ2dlPs! &g5N[ hck fI(=2@Od~>Pj׬/$ٺb2#d*j9厰Ѵ#z h2Tcp锆/:g-u ։):2='z[KWٍd'Y@ӌ6OW( $'|NfUDn|zUk(o{n\!{Lz$H- O@oc'(N N+hmoTVu6TFտq 3L2;Dk{zLIérz먵nx:#>|N )%cY;m2ӜrΓv-٭BA*i47 IhKX?kF n0D4!77m81m[fsgo=45>5# ڿ7UX!t>ժ Lwطr D&㸚& u=ER[Z&U>Mea_]N;!ӌi鏧ۋ3LĦfEn!"wV5D=2k[nZ/?][yަsl M`sc `${@N '=(4:i]4P% oeri%΅7EUJpcd!;/h_yŸO³5WsOӆo*4\W/J{dfS$Fl\j*L#Rx "QӾhVl%E&i|В BasvKbpN~3"nWIeʺFU}MlEtBvk{w%О~g>2+TZ,OHei~N`ztzq3&Vh`[1XHtkRj{% NZ%Lֻi3}!k5 8EѺqƦ8oIJc  <!׎D&#R NupI|ƉknM^. ڭik0Apcex1fzRLPք;ȵYI uMWue gϚU {Zq=bD5tVƣEo&+*~zMגGt֨kbP،/Il4U\!@Y!6WOEX@< dclSw{.Bx)Tds)Om59h%H )k禒ඕ K}v.ji2b26$0|?ᬓ2F1v4uxjt6$sEJ1=1Պ-7?4'n:3[0OGd-yLE]E| 4pf{(CK~:RKE]c|>|O/F$XB~.\hj~1 *8l>a;~mKlƹSc,u_v9U?eI&jlҍs(XMQEUaye/sn.NJóC?OiShd.5wif>(qYFGkxRAJ[O p{.KTF1  i$қ_GS@pG4U8BMݥboW#g3㧂R㝔041pd"b<1BYJs߯:wy;cӟyb?_9xD1op^Nh'޲2inD֛-gt4Z 8""1'\?OOtD#3k-ȂuW5$4׷(w 9ᓫG)h[Z]UC3hcau4۴ C ?N{ڇ0uX @ڑ6=ܐ.PIpQ1I~ݵcwĢv Nk_p詋Q)-al v "ι#-bhגWBi. {{:-n7.QZݬ-<}7#IH@bC^BuW5՜2Q䘘?)% fhǂ\6 JxP b B>I44Ni@{NY٪x>gTd SF8A]t2 >*<xeg#w|ٿhl,i/?:W|tX6Q:'DWbǑoAf t>EfDr:9 ?sNBEv4"?脼R}hW̎95unql"XvSG8|7n!N2yΊop!~#nQXVS ,?8 1wD8H`BTv-~k\r_g~ꡄhCF IՙLʠqݞVUn0`2yO) /Ve wzzTQCt7(K +/(8gys)XXM{f)I9D##S$~eLn#Z9d)ꑥ d)Njn(?ч= _y}M} , -@=v껌n_\i6&̓b ʚAT[9:sRxpU*2k%Yk0^V\'UתկAƣ@.MH3z~,Xkz4[j=RV)0ްGLH_guE-ci\"I_b?# ĸ}-6) }vZڌ&-]ObK7$rH2XSCδ+~{oy$3ſ9F]KAB,D5cáǫ.NN3&FT Tx*YҔ[{~N#\ c2uFϾV މЍE2Q&w^Va{?M֚b)e_+Z^}̀7a[;{(;zuqc^X? &n>r}XZ>J+)pbR`Xp!2HG E"A0u4P$`XݡwV<+MKηcol֬fW+;5cAk5#.mD:'NzxUyjSrvsƱ:g7حnf qGqЏu$Ĥ9FK)7G򄃕Btr^e0 [H("TU$CwK xR l2a.QN)cR - "'gZ鏁bH,|jd8+&5~eJ\}qs*(]6(oh_7_ORS /Ұ갖 /sFo[jA1ϻP?=$ ذ*@a8FB9a$+,$Hm=H$ ' i?F,` -i'/;x'W_1Tϝ*IIno`fX&"XZv6<d]@:TUud|REټ U eL_>' O LGOD|m iZMݮ8;NR)H2'Z4ca[s>fT*WÐc54'q 9M1#IúG"w2 X"FzC` !G` ֎aEЬ`4݉O3F;F-LΊW_6x.k#RF+vgqQc_RUЏ-M`썼s4|4oMBKw\U` މG| Bɪ5`˃l(-xcƔϧ|zݵ;daXg@2;ѐj|aŧ8,4~qkoq(8fY[õaǤd-3 YJ\nږ~Ezi 2G"iCE+ P;?cquF lzTe>5և{// A !]\oEY98Gr!>)'EZa[] vYDG8[Rs 򵁜>?r|VVq3bV"f ;yVromxVտz|~& }ձapc(s49 ,v f/(V.|+"fv GQ^C桻"mGi '̒1(tLSaQ?@?3G}!nkxx'o8w:0'C[Ex:7;PuK&+v`k` %X. UFDpoWFbbPUAaѕhȢ$PU "- bN`R" *1 ꕂG: /6ׯm?YLb0AC^xѶ$YEAcmEAT:PI"#s/D=rz Eڼt7=T7R٧x5*E5 0+Dgy$9giMq| %sN3\Q϶=DbҩD;hF} ρ$yl~| }?#Ck4~u?G]`a,1`H#~mP Q0$ $b1eKiS0Ѭeh@@UĜzv8L|`:fY %ÁA`լfEؚKx;V,bS ?⋧*vD`w5N[+!0R]FވP/-9y8$-sZ٥P=z>nakXmкFEWRG4Iu/wR=ѿ0H:CF`Ɇm'kiՙXEeYv bZ0΃i6i}ss2tb0,@3ZJ?AGN3Ou#q/r~:697&WK3_yCSȚ "M$dPe{7M{>'m# Sf+x. krcR8uV |mǗpKEӫb'[k0F?PL]KΥ$Z~D}'lf㩸 kkJ`$d?l}^u,_wl"F% b&:3D<~gOz&tlLnQ!~L/5koM3Yl q݊.5oI z@>RwRa\.X(rCAHúvg-|E RgwSbEO~7ol߀uPO͵F?hW&՝Oaej[ڰ*A}5fa'1e8R/D)B=PSw B_1ʡCdJ?ǩi-ťlYX f-qyTEd-D cҟlw9dXHjŝJ1 k.dj(MB$ODQR>t3e0rlyG_u^ XYC W~W5XU){ &IO>o}24& x y7%?߽6z+ edt$!%UvP8Pc|sYZY@{VT!`ye#;p?^NQR݅tcb> p~[ҥCs1¼r\թ? `y 5ce,^66e>ɿg=PxӺS0RX˗(ET9*Ot#4ChYᥒ|'~lH& )c_cŠ-Тw?k#7J)~7aIOEpktRrµ{I”/Av0HoCܾӭN ЏJ'&6&c`vNkW o@'SqoޱO95?H0BVGLW)1++CyLRaˆ?9[{?Oo"XG62&뷵F.f݈~e(*鷆"59BjUH_/̹|DEL P`i)^{ FJ1=Cn6*W_RυavF:QKxCԡB5sעW9P%h-LIf fY<?߬~KzeHLUyD#7ֱv戉[Xd LdQ,<\^g ~QЛ)~%h[wQ1X@ǟ?'8dn1R̓6ߟ~-yV,{X:땊+?^F IDNeq&S(\44-R@'3Ms*QIcSu8\XF6(m&C3}Ƽ79mD!D?x7r~5I@O} 0?sYJ` s&C?8#I#ɪs~AJ?31_2g0#f5)$"Vˀ6 `IM<+i2U%?D];aظ#v_{;mܓ}CsL|S>DNgT|(<ѓ_9~(a@F?D7> TY^[r3PR%-[5[ɀ/Rto`Y[@n\oԿ |}M<('X)dm= BssWɽ.VܬNOĹj)yRm_tLe ~O? yb RsZ/Lthw3|P\ :$];&h뿻ҶȘ {L;Rncu" zRĜޘd?Jq_N&'5-˼ ih~$)d§u9l"ܩVjQ˖5K ]KaDQ-lv8[qԦz óQ] i7B1"0ŭ$W3|Oț6&$|g}~0'(3a Y6_~g ťca4 /o%4ޓXOuolr#}~Gᄐ S i# y LxCax$;TbI Z>+=d @5G]`|UG-'P\ =P1ogZ9Z-R,*_Y6,1C˨ `2d? bw;qi$f&c#æ Ix͕7 ޟ[I6*K"Kٛ{{ݜ7xcL/cw7wAcRou0;{vZ'E褲ÔEdg,>QK}k;V[aTJ_kEVVtQoRrvq'z*oGY%ﵒ:(wV ̼ , ><'f@F$qG`zF k0ZPdU槉."9 #-ɋyPę스yV ΍0{{%%&!R|ryړQD#6 Lq#pnƉE =U>Aסw)./:LuK$2:CUyWE+]9@p*vd w LDȳje7J*oQAeo``T 9@J5S,nX 50_Eo3Y]lL(,̠!(E #ן-Ǭ,u(d3)z\L23QZ BTeŶڡm=E-Tn9n|%j=!Ӯn$)#A[]k"<؄!Q#4ArlCOXU>o 7E r-,w!5'B[y@VTkѽ{i6I:nbAթȧVriU7uFjNʆf6 U1bzs?sMϛztyаG52`na=IyL™%JP-B:ҳVaMU|?aeU~/? &;.ZhMW*:TTFk&_^-luT$ ^3\ľsRXMuO@o ,Q;L*`1zlIkd]Xͨ(6#hݓv0#/yeˍd"w%Rh+Ci\ussg#M&t42^B~ޠ|ɕy]WfTA0BR7^3fROP8 $ϿJr—>kscAz8[kjK$4ȝ=ɂx%m9Tx19"ԲRK}lʼnrx#luL-&KlN3HoH 稿oāDdS>]IJcY4s(z/e!vKlQfme &i^dNQ[q:&iYb+?կ~S׈}G?")kz-VP:cWSmUg()=/ܡu~4Td'̬8{ku~p?"h=Y`xz?*bqɌ kۓY[!QNd kLnU`qV>:t'|IKI"@ ׭ؚDE r_e u?<9ϟE15XCWiinV+VF-vJ(I%|V\_St FU; 6yL_?ż4-+V(phM 4.d%ܹt^fxr3pwt"e}v&o+J7= UxxuN60Ok/u60lyCp%"| =4Z6B#:Kb$;{'x:eS&gp(=\zkeOs['7 C&_<䠈 d ]DD jzW?dui;d`'Q.؏7hAX"tV-__J~}St5ݿuuj]/GԳSիTĶP:pSKv!k)WR$UZ,dRz[S["_F[>QS/i'ZL/yʫ<Έn cr@BҹS*%XGD_v!rRs.#["~7\0 Wy PO&S b rzgTuX2^LY.A=aKa1Q#SVj6%eClX@- Dw<XkԪ#wyPo͒<|KJ3hqVbDE{$ $# 1/wnT(`{{/_ckX/*}wP #{ UBg EP\$6+jR9Lꣂ2L/ `٘wk׏l'ňKwɐSn ,UK5_4}YjNQ=Q3OE8?\wcI4v H^!6a8NOK K0p-9Vk-An Ҽ60eɰ܋gIX n7P1ӀeV= R\(ɗ 3OuqD3F~7 D&"XŎy˹MS{ܛ/KTDo7 _\ThS9Bg6-#W4: 7Fډԍ!6FD B+l"SK|pM$_/6A(ԌXTʠt{(~<P%pM2MU"ʎK8Ħ=Tg$ʢ 7ùb篦=?yk=t4s1Be5-xZ'm\ DFն*(Pty٫K|&_=ү^}2~/u?W~N/Z..juP,(B_I / Ni"#qs嵆͞.7=̣sƋ[c}Xa9>JM6\M6MTa;²Ǧ a ~g.NlƾiחXڄUx_4\9{Ds|6d sg)\wcL%ZYNk`A* pp=ITCppVf??r"q9 j f7--2* ŠobwBdY~S*TEjԪ eO[:ժv#iԧYGeZl;kCٿv~|mSK  <ԫVs ujիfc4 B=}SrlH`H[IW Ovٕ|W:ԛ].շ[kd뇒s>6!.|hWtzqJS4oW- xFiy_!zq;\ YtN⟤F0GӛJɃw8Oj œ".)s"&y?EAgWyt@/=&QtP"vaOt^>5ׂZ2Z!$((FB+|JK3|\Ő;ZUe`M"[k2 Y?vIl{ėE1!DdJNYzoI[`>w=Ձ]O:C(;DʹaUYdGu#@x,PmC~ oUs<߹BX7}7ϻnYCʓn= ,D.߱ -̐ů+ )o^[{K E9nY|}a+[OGu%~w=Sޥh)v XV ubmH8dIj:KIL`?@LbU{xۛI9^qlϽ-3Bs:ڽd>\lĘ ˑ_"|7_o4-|Ãwg*¸TSv4݇P%w>)M ZkNg`|O&ͤMIҖv&6J"Ԙa.^ YjJFsbQtqA;|W*P+ Gi%z=/T*NZXv#)~p_GPP;tON |?"8cN 1S6={&nQ?ZON'/)gN$%; |]HGzs- w9v-D"Q@֖rG?}#^~σ?G^T3+g`21 H.PM|?5MhTk¬LI~{L؅udJ@$[B֦#Z( c7>?R~Ī0 yZ۠+7KY~$8&h~:Qvkؖ{}mlfj +ƻbLk5<  1S#02[f^:UFy3m A~D Ɣ6G"؃U3Z6r{QnZq .U[o-L-ɇ`ny7+>MrLӭ{i9dC $ Nӹ{J "7I2VA(ƀ J;2>_7r|/`H@bX0 cm9!PA,::${b氂Q$Z`*9ppoUo{69AC_ Ojޯxϥ!L}YW=)}?e)NÿhwNJ:fu-CrYvm6uwHqOGUsd!rKAlXBB3u1иssR&<D~,7y6 |V =X .iuG ۵FX0ӈ-ܒyV5SPP1+OlLKuctPjpI1é60 ﵡIw?V\p*nB+ӿKwnPs3l30VN#r=@& g Kh]'s "hJ{I W2.,= TD&ygkZ+#! {NW:Y|eFBO۳AsKֿ-_(LFhȇa7ǒl_lg JN]ۛ5ZdiL)a!GL]n_>UP:6榏~w_l QlpQUyTZ; όUPX_ TDDͻfcjt::hp^r<`.R7( Ȫ[D8qɡa8HyJiPC NNj}]aZA֫ŨcT|0+ISa.g2zk)1"i_m]J7vrY_/%9tҴUj;R 0O8蚁~j 'Gn>E-m]}bmM>xNuf"KbA:7y{*k h5qCވ{U=>K{} Dںi_>ex+35YPK:0'AHU,*9-Ԩ0wm0IB 8<~Q|S9quꨎ}b~ÏV ymoo`X6ݎY/ˆQv`Gk;t2Y&4R7րk=nD@9:maˆͤ)Y/H E}`o|{hׯrZ`AUQЪ0 UX`XevX>RF)yۗ6@49IGQ lOga顧n ӄ5#"QʏP xq0Ə$nJЅ lX_fY`ܷY(Uὓ*o ,afQ 0{{; [aMn(@L57=*Age1s@ybgBI|WLïd-Q7R.dXh$DMU'(xa[(\d 9H9o҅گe$,vmlp2M(S.U r@Kb6¼p[/I|뛠"Q Vr%vg23@IN0&7 2~yz oi'j3/J;6j9դY lA!UɎn;ɤBesD0-AT!h>ֻB(N^86}Lj.Rh@l@6-범/;+ITDpXOq5}0x QR:I Z$1E` 2VTh*iryZSn{k䀃yfٟ[5q IePR'O>¸>]s7Ltcߺ""H$}ɇx#fM 㾏fHx@z )%4](t2ċIaAc¨潁T QXFђ ЎznKY #gK۴Ċnؙ鮒OCw}9|owYc6t:QuSCzC`We(c]EQai94Y>)FT;ڢP15[Ia&BATY}MxS!&s<t|}&E Heyy's+5>M}JI*vlêBMbe 9PPn6lEvEiʾ`0y[rl]i_y=NZw MWjrj\ [UH>8<&冦'zF#HV8Yx6gUiH#UggQ2"r LIe2GUAz]&VʔY.nOsu³4(wi7qƴ*oK61NS>vw9k%˜.3SH$tR24o&ʇ&7.'w"`eNǎ-{Isrvi((X7g+MNSo+ d_'PvaiUh:K'V`kst9/Ӽ;zD))X=xhYk/&߲0õпfD0wM풋yVV̓IhY/rh -+#W6HcHRÒ1Px&uc ) D0Q:F񮘮=|`a9G\dùM5.xiȕ!WS(E|ÍS;>0Ӝb44'IHߔSRm]1eg9nz'SMN_[ !̨>6 N򸗓z t.Z7^%MwYoɄ7}:)\8TVPIAāe$em.=&՞-ӝ4=^A<5-Jr;4FWqcBPX$΅/9{s6"g}r X)4d遟>bh,ҳ.]aXsQ`hhB8މl#*ZޏO>|x[}gEHUQ *ȊF T̘Z"p.gȔ^>Z7KlFR$zt8vA`i&MFx|ҧCx-״-r`цs#{*eA0'po,Ub K5Y/W|3OP)]&) ٹ|8E E3T_QL#^* tK?4 HХ'w'f(#m>Y'_0vx<]#%'KBkMˣL2G=;>Y_` 'LpjѲIuufcw+~J=m = l~}(yݹe&6]zzg6/:h̓v m3Zļ_+yFfa9z>WC=';G3s]= хWRr6]=5Νǎ1SHbH$' (nSEAns[0` SX vP>H-ׁ_ GGgW¾! QAFiRJauj8oS-H`e_>Vr*oo8`= qSuIPE 0e{I/Cr93'yJ@B ؠ yx]nE`MzÿfƂ'm޺LH|њ fěp6Seډָa^/&^|r{t{{iam-=G>[~~Z'qfIf>.9j#,Z/WY\.PԥYC:0V$ ~\ ]]}baKcp}=z}1ˊ"bw|W5a` OO{RM}X{%C`s XSIo^PsN=ڔ9NG JW઒ FqXdɰE5F s}9ky7s2Z)$2C J[ )r%Tze13XMf#WgYV#3L;f;1o^Lpp @vsfE$fCVSZB;F,Dfw<(tnP1,@Ԑ02[VKIT9%{FԣWpinmWk$`[7_#˿CT6>摲nƪj$$X:rBƢx e&>PϪ_}/yJR=FA20kF3L R(ؔ|vV!>aՔR7;B5j7qd~^&oax__bHZڍ! M9s"&m]~.e4F]ӆ#B Dѷ6RPye{CZR~a¹0F]}C]Rr ܙ98U;iD`*ʤS]J=?+Mg.c0݂ B3fHDM{fv."=O`-׋7FC&* .O+)7W~*>O^2@ؙjpjz"z+/46F2gZ3:7r;"l <[K|}E1}cf}Y:Fcr,:}{&fHse@q~=jz|9tc^:ywߌf{tLѡ Ljʢo%jbU^u/$4Xӝ> Y$M$o~I?:N,޲ҜpQ 7U&9Denkl"KSV*$FԐ1tPA% )~=s$uhޖ?;V..V&:KWr+Ō2kӀ0 Ha2MAZX: )y3@'%v=x4<픔l,E+cezw@M!6 kv$^f&XJ#DG|Jَ#΀ )߷+κ1xm̰Wo9H3d,6}t[CؔPKr&U*;XG[x/9=ɛ[5F_7/2_1ȭ${P;ה,gD^lʥM_ &LڗR|>7,.߽u,N?y~cI =T@{&<] @x@^ ~\'y;KtxvHm+]rcNgra wbzvΡw0wW'c0!yW!@#4X :δxBtFM픇krMl3氇XFªI#fP8hM5j2h%z{gD !OmѽPă9R "$9E}r$ aP aU!8Z{a֭ӫ+lgAtky|<1uUNQL=5S D*va֓˞~"Vmg|K*cQQ_>ͯTI*=ίӌx)B9kʸtx` oSl}ds\>Z<gEзĬNR&@wqMH31~9~,2G^X}ڏ7P}lY?"$B8bF &O`2~\šMwM&]_wE(q.\Cw TQ<;~?I:Ic s+ ~ `56DJMIh\5_ A!%@\@TLv4lɣmPbJ:_snHgB34ns:Џ 1D3dX{JưCj5xƭ̋|)h|⟿/sAATZvL;6OaYkBJXNl +9,BC 1-Eا䳪,v '1h!cىu֕vs"_ͫ^ )J!{X'Iq.Likg8;;braDOڔhO"T>#r8VɊ3k3*_G8=Pl3*riRn'yuD>u8񰟪r򳜘vJKȰi%oh'jhI}k:Q!Xa-vXq~T~&/^sQx!_ipb$Mx'L }{Nla=4Fe~JoyyMYf)wKF!EN/xU)v;7_.~~u#Ł#jl(LS=^u5ѣeyչ!SqŹ4c$skj ; ˌ8.m-:E~ۢp.}P+֮F96hKgwe#Z7~s$גؽ}Ѐ3ԲOlDUC*71}}gS̺tjmX]hZ9rQ_HTy;]ԞE-XLLC'e*t2D3p|c88m N &DKwVϬv,o| j߻e=5FճT)E\@.p^yu]Z+3jST b <_X,/b;AFP-Kړ T3k!Gޑns:>( ᖷ]:< XF߸I1Z J LmظOn759ƣ+ p ,;,j >t_Ҙ~?gFt>vpi~#`!iTA^RpBs~O|eׯ򵄳ZBz F%4 av(VH|/~.O:ߘE$>] ͠7F"5zbBgSnO':d+LQ+*gK<>ܶ7I1_8@"m ϓ<Վ01!!3뻸!"~{P%51%l SmYs;: od(HQ #)5OZ~'&_#E=ӪyE /IzrL$vt-])uʘSiYҺs(R?Ꝑ 3`MH7Qa2 7OKvT4<> (A-c2q"؇S?pkj?= [ S/ORh k5YXW:Pn8҂ 8m<`9Yu?_1h= BЭ9\ M06Rq*cA*+uj3R-MJ5'ɞH\^qiont MďW]zJ"a t"e ;D{ IOrn%Eƙs^ y2n]z#& TEj:RIQ[KujR]R%نcUp X-tg0=Xc?ۭӠZq zKS' 쑎Ũ}!l 1>NPq7dB<LV΂Qf*?x.|Wcz]`>>gҬTDX!67*"aʨt?>I mW`:ހ`K#š QksY|6vVq ~&÷Xb'yϴ#VKdclj+H(dUKQ$l@~\Gk`4_kktUV}?G8r3,@6^5Es!~"uS.7iQ۷ՠ{{(^e#@H59+_t*6pѸIA1͚ JnOԭBQ_"J*rӇ0\T(Ar+Ƶ;G^b] zZeXƽ~՗X7\ꈝҴ(xeAۣM]5WvR##p K(Tj)  @RsA* Ui#R"R'yfGNx?n_B-A}WǷryd\չ#B\D5$:D݈/mH3 8Z ~ܭܯ; FjJtCm~I..IRa*[1qtmnJ EybNj&_kAaD-!ÿ&t1oL 4$5-ӮtS~(͈ ۡs $I:mGJiQSy.(gUo4IpOtGKs /#+dk-[FpGb vd>EW V4{iADe:- O@ǹlLpߝOwx-.u/q \}R^{FqB[dASS]"BWA-),˩\`bE12WUZMoLwNE ԨxF%y366Q̃ DDDP4_P!GXODp,o|3'1s} idt! } i D{WOwHԖ*FeJ g؃˼oQdX\j:E#xС}苍q:#W_NK̷/3 _p$:ܤϸQ IY)=\Kv yuxiHf}I8MSkgSymC#[cҿ bi}E0VpI|hV}ӡqk9EBwnWf|:w~۲l&Kn1??מtS1ŬCDtbK n7d;)4%T`7&oߴbFf5rJZFNu@GvЍ}fZ.ZeRcj9L{HZk,"4 C Fkϓ9PZ˨qࣞhjF\XKz~X<%.Oκ+0* _p+P^a'&f2+%eg0-Y3{G`] & 5j.zP@H U)P9 GBhan>0a= _ɘކOq/@}s>{%ƭ_E4$âv,Hp #hGi[ҳeM >Cg*u:AVQf_U=h"<WDlWM\7BD:㙔t>Rޭ믅QhD^PY^= zxJr,6.On-^(]hf&fN?MEL~VxCY~.r.ZgZFϜdoTfr#sC,Q̙K0Ф/Kuσw:˰Y"%n@.i(%P~)ɪgSg+ĩR-40<(m#W=FXlQ[v5ga7 j|4[nYWxӐ#+5AB`)?͗uowv6}+9TJcٯ̘I 97k[-L03RBHX$.h,k'` TW r=$V L }0-Fg@%?@M\BMql-ZVKRӰ%vzji  @)4i!6 p3n"bw8ĩCx=8zkK!WH!$04!d$vS`=r{0$nRxgb+p?!$q]+D\dYa F$I^< *Rװ|:<3!l #|ziqyT I .cqmaVgKR4|viJ~,>X $8p>O 7~z<~6[@12i7 %?gԲSz\7âm7zߡcIdA@Q/-}~>U+@º,/5}KTޅb.W!#}c݇D }ϼ龜;(=Ɨܮx;}8iP-yS3"a՟5&湮j0'wdÊ)Z(H Cd$Y5ЄքdA=`HghN;27VuXx_:>~]t&~J?K^WČ*:fO?SID>qgȅ~ok(Col];Yonaᑼ5:cGps3[5[LE=G7yH(c@s +1s&ozw"ܼ3u!g[Ho3>u v*yCp@o&Y"1{)BGW"럄>P/t /H_@GZE'>2dԖ=N^DAsۡ 6yF;;D Gs8}@kIԺ9'Qn~*CNt d ٟw'Cb s7$?9`WȀ&H2~P0dalP$J?bC7 6)cO9U~CMԧ?csP]i!7~ىlY-ͤwm],*g<ȥW4Xحzx|K),_E=6-[/Ȅʳ)fhψϣZX ,.ڿ=*mo̝JMϥP7G|]a?}\)q,ZXK+;Ldǡltp q9.ڕ:A/yYFϭ^X2 F Y|g_YWy>F =1*(35-)nmv?Ku kh.s&K!%b64?K$uF_I{ )O:16yVNoc*+"/yyi;m| u'#K5w&t!! gRMoEl{~Tt%JO+m u< X]pf042|ԛPvFMNbs" ]|BvP1CL JY6>޺b01h`"2)vR/' Sz@A3k @rvH`r7N\mT@DNC/zKdƒk7ㇶ?\\^W-] HcYQgr!~xY(hϦST <%rJh#cq-qڤ6g$?y'UrskR%DV7.6 |ĺ #ZԂ'Ӗ!P6ь a@z&Ts lg6N11u6uN_l E iзش7?$Z/bpִڙɧz#jj;UkrCEqlexm#\$Ġb EJD>ڵ*KL@?@4Ҭw=/IA0uiIͷ>w& '@H C1nGѾ,k3u {^}=\q_D fGۭ8&:6ծ4uxs(u )N7Ul4m4nۧа%W0tuўSѽ?w\zGo@EݕGzdYzz|9N[ʨۛ/Yla83clKZb2ѳmQ.[<*r@0I` c?LphE%U&N,ř<n:ؿ4b6WQaY i/6ng =C/0!$chi %$Iij`w?8hit-~Am`1}*E;-w_dM@Ts2ZW^Q$B@F` a~`i^){W] 7u"!1)JV M2_;#9cj|d b܋ySIH%1)湬rH)!!alI`CK$e+\_?qn*ht?6j H.Ls#Q b@=h_,+cqc1 YWd]46{ExndJ K-ws;eכtGcI8]auMϿk QljЮs"SvDtXX3H;]:h6`u ҶH[X—ٱ+V"z/&ddri½uJ}AYpՎ(_(eiK8mdx` ,n$,8R|P^ zgkS쿾%cBkK쌒zf{֥SʞVMndy.=ҨОw#Yz_lxf쮆ʆNFq՗0SY6F05&[('DTPx sCx ZO͛3~nm~_K5Qh}@FFI>ir0Qۻt'9%kx·6&oԝicTUisfaBwh@$I/0 ox=sXÓWN`2d[:yZMʣ̎ͼꚚ?Oc;HZ~c-ӣ_֫pzspΦCܤS3{ٵpV%B2f͐]|2Zihtid8/֜E eVF, c`@ B"llMǬus٪#,T/}3PjR@pUNI 2]vǵl=vJVjI0:n ĞTt4u!PH$Q(Wnc/>Ү=O`Ek/_s⨟lKM%: Ţ^c Y&W$663'\e32AJ';%^eS3 H01D>K% Wۏ󺚉iy 2:!<~ bm|d^ xIUP7+!P.E8z{qʵ;vŮJz4pjF3D*jbHd0fD'Bˤ.l؁ Bv׺ 9|=77Kl_kxL^Z[z6R%0%/p|1JMrhIwnkZn|^7UAgfR{gI%1CQS.6щ!As4j׷WugBF)LØ@m[Rف21BixW!.;%̦avW4[Ϻ3}~&tR+ur/4o_$Ƕ6 ;BaTV)0XU\mY}3%2e0Ԗљݹ_ $5C`w^[Y%-$u҅RF?Bd /z Iy`\zԸ9qjE]Z|lی%pLҽ ڊSLOabZIQ^Sv~,kQ<*Jqk=[Sz?$XD]7F.>kҶ曷*iZ]Ijf皩1ٟymݱyPT`[Y]>]<~?8Wr?;/l9ld؜u<xM4C\5X-tJ=u.'|`_Qu3#hN|F^W|p=ɀM #=@d-s țdJ V+?{{^%ANR4!'""%v~ MOp!CBVH6'}90>4^we1h@4$dƓ.Giyf`>|8n9jRޫ%Ě0WT:M+ŇD,̵ {iWSPW߹ D:mP̵L9d ܜ3/ַò95s ȅ}+$BW@7dm!y?^,Jȃj/)!^rx v9w?C` b@oE(׷+*o>ot@.5}8HZs1#ֽJߗK d1hXQ %so7϶I ӶWL3q#kmǂ,q?▰R.p2n(rkOL vحlV2TAOKf@N4@@+R̄iʫ{sC5};k-Z=nH͋S+dƐ(hcp![s y%u=Wӗ쨮bd˪=mK!FN$ K "% b@ 9G(!7/Th9_繛]BgMǩtnJ}6ct^z ,+YMQ Liѕ`Y5"aya#jmZw~mZI,JR3VMEFJдZf=ʅT/ ~W 8N[P=&Ho y _OwD44OG0i%sf>z6FD)Όӊ͎_b6 .-jU֕ԉlut"baDTG}+Z͐;/lbJ2-EPSf|zȣD1d\uK L.0J ߢ WV~F;_evTeܙ{ޣLLs bVe"Ho!*Y#+:Y6iŌ^C'@đV;Q̬Vy]ha8*XA̝MjҦKd->m.3̼BZ7=`R@mcHKtYNp2#\lS9q|IRvޏ>nJ8n_1ڹ]I埓[*?H&r+GZBR{)89FBgDȊOe~¬1n28b)/靡,"o8/i:G$KWv m sT'۔. 2U|鱁fbZŮQN4!8$/ ;E뮐 p]D*xfsRi(՘$l8Z[:$WV% .9#:j2 TmZE!udU}J;w|x# eC7E|DGjdzN۩"F! xoۖM~@<9;.r<:>׉~E&MD-D,0X"ʤw" ./9^=4w[oVjljkm mbcp˔e7MtbL_:Ⲝ|? ,ElNp a#|sfѨ\D/e7`N#pO/::[f6GB8}YL"P1ͪl i"7J΋+'!Q/E.BHH9 t`~MxX-_{@!!?>J-{,.nR7 r|pD7QZf.#r1k <  Եq\J5}?Ý{ܰ·y6/NGh>M) 16B@ȖDDldQWd @q텑#igShg;k5[S5!O{Ha}KVyzo={`Ph)E` iO}T 0}j L8ol۝4܈I2,·,~d*F8jkOg}T=)C{H i{ZИR؅ 8T0"NA}.F>iTf’lg3wX _XƧi |\[Pk ;|We23n[xxH\n˞(m]7yd'šx\@N(IL]U֟JX09ncDHGgya b%NSF9'ET AIs\TNgߓ w-1"8+ԕz:RaM}q]F&rF*1?$ 3$Vmy4[g#yBCX& QeI)Qo*LXvBKCzѺx񽩐Le%?]gZB( *K-=5$bvwO}uxfQY_ZkhS{ ֝5g'\+| (9JA-p> kE^޶a٘~m\Yýob6pc7ry5&{"Km fvHښTwiCn|),mi&ˍn9 6Ȝ01C Zl{;Zf6Tlz-wTԸ\J2(r|M]hpc!*9B?acMRzIܜϨ<|,".G  @  (`Č]!$?kzooڵt&QB>La11!7;o-y0,C&h4(\'kJj{=r,=o͏/oֿ/.aLb6~\wҳiZm[)^TNHiKmrfvL2vdC#{v# O},*Y*7o~]cG<^A\`t$Ia`Ra!$d$ޞ@AHA_ 6Bg?yMS-DZ6})O£7уMr ˆ*DM];Q/N;ȼ)._4x1$#,n^߉{>|r >74t'l2Xy۾ nS ΗXlKAGW|ӣ>[IZ˖?y|mO:_<募CR <^)>:KhNomp\ ij uv&\`#.l PX)(1D+c1S*C[g4|*A"Je4 Ԍje+h˩6ցszӟR5YBc&l}ּ$BOT s޴ 1a#7=~fD-00IoHBk/ [<˜zFkꅕ/ɩ3%vo+$Jz/A mDKX')ޠ=7FzWT^5 $H  $H$H$c_+ U1gƟS2zn^Z+6xb&Og ,~ K5k"KV$Y0zα ^F+D? 7WHLs1bC><s48uS ESy~t|Owk9*#!MzG Smԥ#N yxóÃ}X/B㯶F͞.wVC7˗*I$PM^dg\ G3MV'KFg`0A<!p=:#O6,czΟB ZץϔDeC$PLUQTQV`ZE @R1ci H_מ۸<|]hmmOrHD۲MJ2[M=k7ĉ9޻z, oX$7STTOogsc4ZkB#c9mg}?~+}^r Ƅc D7VDDS\?q]F*-Fu,{1 r׵_rC1XTshPJvW rD²5۝6{ɰd 2.ur`EIӗ"pZ6sS}LdFJ[5n^&Ev7 蘈sߋVȚtР>Pv@U˜}!N FP:~aK؛tDrV3FX <|R:I s.W]b潑'|'KngDrG G4N'~JQ Ct@hz(GZs62}PFFQQ/O '4,@Э:)ޤlJNlaCSdbA6b{쎾$p \WUZ@SD8+ڠw۬Sx$4*QKez;GNwnسysJh: >EJ%/ ʥ0cT9%9y2dBsȬ,կQ;]YqT(J~XZX7rBy珤7lpQ;K1 wD`>fG=Njְm(1z1[x{h)|YqLA@.܎].IZvOsYpnuZ I.(*'CHG&mB~"$KnCf0RBNv;9mEjd[tێVl@@*A@0<(ћk3RJS~E&1~;>3A4Q3@jF۰,eLe]\YwrN,\_2" V>ä񜖱u[_hx$!FqLCHTc }d$&;%54W_z+ MV Mg|g=7˺^Z@(t h!1fmfA'oޗ\kSnjlYъv†!4#Ӿ~#^}5@:!$M,Zͭ>wţڿ >wMe{}`i s $\K"RX .$֌!|܁' HՈCH+-K8k#VxKSVȺW$*JDN]AB)m:IA!0UQ|g<{yK¤1$=gFMBWlH-%xW4#,k' p,xjb) Cx<I,<_;,azi#A ̀| PmEEpcnI"&$dnK~OIŗ3%}3Օ4W& >+΅4 ^HA\S AUk\V s ˀ$JVHJ DkؠeM :*NWre35{$/R!X{l>&SŁ (kO=? LY$DI4R$͐6D`χUkv&:cI!$fY$IwWpNΫЄbYi8Os uP1lmF@Nуv1٤$YU3 "%WPے:JI.[,oqP@BH-i$wGfZYIm[N{x,LgH1q3P!u $4#z^\.$Kх( ykq{1S*ܭ}C`OB۫҉ סFojsX;w2hz,ѓM Au6X)# :Δ >̋ GA_{[ QrWyB}ț4`Wd"c1M ^Ʒ紁'X'F$&E9F648 WzjKa/Pޒ3:sٱ^7ʦwBb9q mrer!w>0rDߏ66-`c*9cZTiwBT̪ 0r_^o7 x-^S!ޔpC }K|;gO?*|Ĺ0&\e~CܠAlC]"iq`:}ua.nD0ˌȽ ٽx&Fg&(1 ͭ]hՈ"ueSpc['.&1 dpS/+ɰ4 +=]dT뇌(Oc[PK 8z2?!>&m҇`Ènʿ[:aI\Z%D8F Ί]` cs!;s5|S޿i0Л0d:}j&?r󆌶wNmzm'ɼ6ivYu=(ts!Zոj.}7I@Ř/[жFD%wc&boYl,ܮL@ >GBlK΃`mwj8RjYS;V>AMiKד/ʸz:l[a@ Nƈ,SOU!zo3~8<26؏ؾK('5;;m0NpdKf{ $7? ;! ABFvf3@`3FHpV0G ?'PɌpJIJ#h+vן%r^BOg?}vow}TB{t!$"r#i9~W^ߩՃ^ &HAk,>`V;:xwmaX$h&E6ZjciЀ5ᦂ@7lP0*)xkKvo E<ν&"84.wak Gwʉ nj8B"2X 1ŐD܃EFs"*Cx2ixHy _Sw}[VC4D0Ӝ (jv-S JKԼ=B}z■uig|٥'k{p$L*6Le0U>N(^F  `?6E`0i;jxwîRb tOtRPN_]ш+"cNi-AY~ m 䙜1P bLV lDTjoD w\KH~ƛ')E9:3$}R9m52&_5/7u )ZXyd r+,\Oc2e(> ]GE?)nQlƲʰ}ihs-hźoHX[[1*&'w7Db aǸ1Kĸ)Rw9I1I|7)RHnb4K]HMg,Q=2H؛nK24`Ӓ#5˫*BA\!?_X;4VeKKCp|2 >2)d/V65aM( ǧjǺK$8?KPW6TT6vtƊfb]jlx9۝w*SG[қ5]y?>0bnl0pR[%\Gk+ՠ5KV#˫1@$-%(F >RI?%}iw&!<:WhQgjt el&A,fJ=ͻ5-im^ˢo1~t,JHW#J$BBZa1;S_0gɱu:֋z݊kgmlc2v0AAj3ule$t꿎sM60]6M5 "M!#`77|T$M66 ֠4s>9k]UJt {gtS#ӫLbE wǤ˃![_5ƾ z`R &a @.- 8|V ʸLBS36ok $؆QSrA_B@D 0*(*+( '֭mmka:[paB.'R+/ǥ=-ZZ&B\bX !F hL4)+[k{oәylɉZ`Q$ iBt$K&96!_#{a) `[]6/˒WI1aU A `R6@CR,T$%4:A*M6$}I  @FQ $ F B" #DV4B}$H4fdڍe0A r;ɜc,! b0oc_鄊>G^10əv+T`l$1 %n >u" 8ۄS(rAփ L;:c 0gz6P!O"ACs H1fƫMwЙ_U=-]v= G]۴;}lYa.a~F;ܼc5wi]oRr QrI6ԥTk 1_U ̢Co t'RzCS:^]@)N@PH<}XHƷt_>=<6Z$=Ya#dڟ^Zϸ?Oݪ+pY=} OwF~GO.-D%#Ӓk&UB5pJ26l_'Z0uq=h% 0 q,@460*T褌(i6 BR  ZJɉH`돶A+ iV\YYSЁ=O_o4inp`F"`Ħ gIXg;R<Skn0ݞgcxj aC6wqS ?j)_'[LIّ.1Y+r"1TBIu?OPk0V0#Ps?9M~ >uB.X}_8bE %q:tF(wÌ o×+QVLG3i.![i0/JK]aW]=yO8Zօ*>8GT&Uv'Q7v0Ɲ~ַN5)4 e/8(*Wuiy 9u2 [6lL_kXp-F?792JnגּVpG1*Y"܈=2gz{D 0[m ˣgBf]GIy-jȮ(B8Lwx'ܾun߆Is&vZRIɢkFnJa3BtރvBˡ *h#*_xwC];GPX60 9/pɊKfj w,2'U-9i3n "V&L Hg;;MJVH="zL.j Tr\ ˫">nR*2_ 5x [yDq*F8x@o>"9>I OvTx8Ѥnogݟ&lY<] ֊(Y{Jưsҹqsט&G}gc"J NpD9ɑȀOka]v~{+ؐIar\ FLPl H E1* D&mF17ڶV7St,N52>HzJ-=7&T L^y^wPSma \B3{fV8d2vt~*TUEQm &K]",PIWn'@QR2I?J!u=pm$^JAy|6ߖnɳoI#:._|0Uk#m?uZT=̈fn![{[pV`ط@9 eD x3߶   M>=iz݆[~OCOsc,.F2cfS vaWU2 X$Kc  A#Y9#_B7fҏGЧ]hEZߟ9M :1 hSkHz,1w 7dk>*h_DŽ|TOÑũ=@|:ӼEZWםyP[s+v=іBlvbm8W*|ddC @Lzfc A!UOi';5wTh;1{H:7S<_")F%NO?er0ПUEDP\6->1oK08-Ӻˏ?Ǩ<*C: ]Abv' ,g'ϣ dK&ԦzB?,Aum#J:]k΋Z-'8 +6Oo_Fիn)l? ƕo fEd`׌4O3!RDQMnJ6 j;+IAɮ;um .^Pc]93{6b_gMp?4 ^=x ANUo8S!5+M(Qv{{͢0EWX][f.D8kͯ2, Zag{d/ؙG};˩F2u+ ^ea nƒ27iPOi2bm{WpRPÃm-evhU?4@Iݐ+<ҚfrW ,mK;]@M3:Hǎ‚* n=?:5oF#2CKp+D^*MŴwдˍS)RDx3`E 1*0J lvC%E["=(07rg_Uve` < $E`NQkϢ'pdLlѮA$_Cy)REvQ?֡q`Wt=@Ibc Uuvm/*WY4M\DJ),uQ#}GK]}qp[*, U3/heGuaF!s#CA&Ҹ3C 85г\6zJ-3LriATduE9-~dz38vI.^G~w_e {M,ڨV)T7XEO ZZ B-1֮% 3`~¯=Zl y%Wb@]`ʶZF^yg+"nr™10,')ȉ+r%=T4 U1dCqɞrCjl04[+<|_cS>zSQY|e绕M*q7)?(/6R.[!QBG-g Zk8M үkT;B>L`X͕f)boQ^y_p4!6A\R2ґ۔0 s}͙}{ݺpUც]&!i\=7QB0H97S<S}T1XG:DAQ=J=ShMmISFn=($~m1sͨ9 JN(VRG%Gg -5ǹ7Տm9OHipCTAH H MؐPLiR6 4lc@62)^}ņh0p3Q $ $fS7U-'lPtkv*g/lPdAMC\q^b(c~ wwēdR WQ8PX?Y-ӯ-lEbi$% lPG9̡9xyȨ|tg֛$y|cnWsXM@:Nk]@˦-x (a Pɦo|{Xw42J=;WHJBʤ#oJtѾ`mRPt"'=]Zǥjܦg1=,b1"&Iȵ/2bZX.L /0iE5RUZBɒ()i(b [Ob~gWWb@MGr)2b I]IilH.&FT ]Å|:UfP@ڙ]!e}8U D"t^~/a8O38pUK 64 1 ˂EAo9RQxĀfsw]+66P:('dC $e+:H޹/j #[7T5=~o; 4f<,^r?b,{:De/vJD5@I "23%Xg}D(Pa ҆9 ( W>>6a+}/)f@|hMB?%4%4B"Jkp[LD(Q{с 7C'`t~qO@ sIP-!X+Y͖(+C=DbqL[RxW*4|JO'k{٫𠞲h W dlC>_ߔ2 QŠI# py ?;W 0%8 eљ%Մ8 Lsch~ @y<_Cȩu4 ~&xq0I$tDfNH @rꂣ IM^~nC;D;.yk;"q.TbpO%Y,Zܳ%a0~RmQzOwL?_:Zy[-8%=Ϳ_Y6/vc9K4ɗ%N Sd&@tk)6ӹ{0'3CBjwT06x"5]--_hvsap'OQ$-yd` kw?/كa\7+-P8M2ź!Yj4? -S@;/-[*-|*.شq8ѵg(XiζS֢M0(DpA(Tp@ r]Sag :njM6^Ď6VƧaZGտROR_~_Hx:mK}X#(!~|N)Y29?55p5J!;^3 驂YV A` X2|e%'EU!P@h2 P4%M1/pma~6P QA]$@bx&潒*]E0L1@99Ĝ 6ÐT }Ӿb$.\ qז]aatb8 iC!Y @Fࠋ~k7<ŏG ߊі6f/@tu +׸% &ߊR6nr@&H4#?z'ф~h0I'>aG5zȍ$0>'~F%QJ2`@:4=@!G]h6o{ `QN֭H{ ~Ɋq ~,CvF $X8A:i /~\&`x|Aw"ncޏL jP.I DJmfb -Xd1*uf,Xb4,XwxiARt'N HPO7N|"QPEEEF ';HBy\v0?}eSWzx+S DE,!E5>fU`cM1ͨ$mD _h?7ǽ\LL3w֞'}l EBT z]F(9ncC4#껏;@Eny~}gp`1Y@JI+ # ]SL:Y9'4d^dz~R() &M)@ӘlPGO6$aߟO5c6x|U\`)@{G:{M:oR'3ȺCIcrbcԍ/v;Suչ®"u6"?޸;ZSY8lhH;CJˏ $n`<x.!)q}=]8A5Ui샮0&FY}aw w!g,DB]<'a؀2:gۚ`DPx~[,c NfR:R%g P-}KNR!FyP 8ܿE<:f#92@x>sfrSEOMU ϭJtg'8Ͻq@nŸ, <.DFȂ&bO]mkڋ"TV^􀏱G\oI@n%MU- E.ucA%n1Pp#-F&ә野3 v5ϩ9~  iI%m6ɊfMVaZ]ǻ2u1°mҽAd(ws"3eȊQ0i׊Dq <-g+7m1˫C5yP{p*k@bfip5"I-@[h<Sa ՗s MKY/\:j_.'w]od=)+5DλFNrw p.RHP˶I8DA qEv,db; Dg]=0?AU놯S=Xz.GSPl߯]þc+ E)Ӵs jW\4?յ+Giܑb_i\H Y~E%!j('>6 )b*^gE)j7L8@` [4˳CA  ɷc#=_2sv9SO| MUc,-` 0C"d/{n0 d=Xp= $"rdOi߷{gkUͨ uL ITmsC~RT@-e$UdRG 菁;H&hqZׁ_6[e贲|Q]̾> I^)#I)ߤ5 9A0zH)-pd?o+`ΛBAmZYnΰp@+ K P%m_Ot] >$07k4nێ,׮VZt]'u$E BPzM)TyOp^nEy]} ψZuIZ#[!B^%BbM>̞-,LO1z۶O5:}GkȮ F\$yvG4>~7(* Dn p2lsN%oNtd瓸Q@ݔQ tu ? j^0LzɧFYlɖPRɹj}{_b?[@VEDIJM44杵4k1!M'^4500NL$ Vc +qq dRAC*CJCdpDR' #Aƌp)f,Y4ڻ?YKYZ׹qXMo-.64o BI"SgE>?t0@A>FD0)1x=~:<~c@Z%S}@ᐩBqObGAx).>Q>7*MܚlDاO*Di7"Q rZ >ĸ %o|Y3xmܹf4 H/N{Y0GM~C2H ǣCѳW'ֿ 3tzێtc߾>jFt52yQF ~a'[_.5Z~ϧzq% i 5 njza~>RMC£ y!~=v3!ss62CD^'|be,3[EesDK* In=P Cr:Pm[s/ qBS+p-F=7 m "2Sr'Dw/5qKxRGWU[%ml{H@s(>ny8K? xF;˻lĿN<;w#=[ u[R!UqQϻPTH|I;|bȕ28` H0Eb#[bس= % 5oO[D%~"4C[*(ضð6˾Z˹{M]4&AB"'=lz ٫UǸlF`|HA<;Cs>mDXednm,c$$j"H %|ZVS0_GcD*"FTpLM @h I((HZ~s.[-򵄑XI|@؍1lfEv.謫 #/ARLm  GY*].:4}qȂOz//x@ H,L۰$KP;uR9~/"{vXDǰ jT2V !YRYnK6}]Ṯ6?fO35*XEDvah{([Hc~M$!@(B 4IbuZ!?kz|ϵ_=ap-hW1ȌޥHgϧ=Z~ L:,DPJ\%+&X3eM=-Xn3ʵ|cAhK螿-0J~nŬsb+?̓TGcS+Nb).,BkpůR} E_UJvvGL13љv |YBXMsaa>VmDhZ_{u6Ҟ>ޫlDaV 䨰 MuJqbڙy>7}еRl}? 2H(j `?ܤ'G.wJw\˱(W{4QeZU].NgsW{n-$1۳uԎj(ixTE,d!l[Xjn5@!`&>tWKcGvM]aRN&ΟٓcHeɜ1f+%`ϽsBT=qoU{Mfʿ?C:IweSng|Fla)Zl _ `jAXE[f}8O&IQ$']~M * 6DU&?s(Uf]4fEKLo}X^lW%hJ+ 2[@|$svZ' u+zCz&uM0H<1YE\\}oq*?s?SOTbc<0WM,vK~ߊGVhlvj|b@(m܋t[uH?Jܱ-m{X~ac\SN(!F1mFE.x%RD 8 6՝Ob&T%|QjN&Ieo%E[s?CwU$ӽǕdF;ܷ-}lӴU&r~'p=cmWJ`xʆl$`Q] E 5JU>Og?/eghEi2-0(z!ԯbSp>!I?tZ 8i3!~WH+2Ή 6- g60N]=iaդ~*1!x3dᑨ ?3X㯢43Lx8ɘ .HmpdU,[̻u 9}\CO1v>W%S>u>#Չ&΂6`qI뀄G!萂veoQP7#-1ts%Uإ78Vf %lH Ł񢐱Iڬ!aOQ'G܉mWM[0Ǿk/+dBS =c{sCtjw/ LԞRW4m֑Q}pHMZh3.ڢ*OJ\sm20 S^ s)cUGcҝ MɶVkt|U 8@$m#H@Oj] Soh>FRK,Z\Ks5_Vv$ q죿p]\PNNIj%D L_I;s@+1FO{Et]cl5wm/;k 4?3%1cX^=bUbB0>t|?~mp7v{qy@9$ p = Lt05Y1.˹FTF$E;3z߂]rq1ԈV`U78ԽD .z'76>kxE/mrs¤!p=ƕ.+]Iwx˯M%m6@կUU7|IKKl rwř6c4KUBI}#ֺp=d m?s۬n&Ӡ]w}+1ߕ6 ny@3@fZGPkT~`M N)bWXp Q,))/p@ Xvvp7J񛅣dW-:3 :X!sRTT_X}d_X_ml{mlhS˿MOH*>䡹 6uKL3vZYX7b,šQo5gDْ'0ega*53쭎TDURU! {ROyS86yEOs"Wp5@ @A_k~AKS~ZJ[_7PY0x!y$Btih[++6_-l-]ZF~{v umvk=wKwޏ~}< $e LC̡Ik#Gkw~~H9n+R@sŷAK8Nv7k>% NTV݂e.i0Kg 'C 9 CZ֋fU򈻠𖐙8ڧr_LDKq8%E UԩbWq|mj~ iZ"BvWiY6>7wJڻҦǎ.Z8~hM0sߧ+ADaקxu1 wm6ee`V+I7gj(|/F2HZZOY"x(Fⴭc tw\G`Dz{wIEq5{.#@8}< 3+^@vJm$A3Cg ]ʲX A)9&w,Y>^8j WbF1YC [pdWٿcx˪9*e=s&4s -t@ǙRdX!ͫ)6{&Vm۠L!s9{qqY{I7gpoS+/n֥[68NβtOx(ծpz E2!?fypެݳZVbc$P/ەHeqk)yEs ɍm( 4!ū TpoCD\Pcf8H;tpS܍xwyepz ] #- AZ ( 3J,d2rRmV]Z<ag th"=azr>F*9y V36ҧڛ23>:frL?v첂3ĽWW<^e}A6MC`+ӈ x@$' %GO jFh4e|-;o F<}w#>]!/Da*}d:{9(VoRL;:| T04 ȲhO)V/ϪR:: ,rJ8X^.2Ge2+(>|M,P9;Z I#fR#?^o3,sO~\Ѐ^Rwg ۲ٺWҐk6Iͅ(O\ Ain0F4 yh&8B dE y=}fĦ݋m [=1 NzR:#t?^u^g+{\r֨4]ijŧgNr9Fh@B2 wD'v[+TΆ5^&TߟJkGwfVnuys$qr~PMG(ôU; qi/PH!.9E;z>XoOwETPE6^]64Eq;1bx `蔘GKJOx 9T0=.#{`&$t~_zw_3lMyw/+ ke[ ٛ$3Z_|O(rtcn=r)?4Ӧ\Ya*DLjdsx=hŴF;8Q|E zu_.w#xsLk3.@Qϖ[ +Xec=TD{fIٵ0s8^WL>et- EYV?M=aG6KML48D}e(S1i PueH2u ֤KxxLi~zl:H $vpx-𧞓c&6pEu6Ln!]u<v9??4@v;<ֵ~W3&QCQo~ئKV(7̖PdCa0F#>q}l\0kf&2ru36kZs:wvoauY .ǨʃQzOt|%oWa΅G]1vU1*:-o>!k43UZ!K1P,|{9[͕ʜkURv߻?Եnj7ZD;C / +ݝJ69ɑwd@6Icc+ ,~,bնлn?3``<:^&&}qB$1LYh#"$Mt,7`+D 1Ǔ M{Td`nOraK=5 R-\`QH hkMɱM~ֵNV~WJZ8U }aAPDP Hx%&v ʮss3s~ZL뉴PY *2x??GFxԥgIl,H03iw4A5 Hg Qs+?*1*rUC?ȣI:WX)wuNv졺{>=Ɠ- 2V2U*7&b)bEZi7elY$9(Q L40(3*Wd(^%9l=>]ӴzҕvqW?147xqѨ<:@+ L$awtP+|F5|G,_ŮF^斀 N)LfeTFJ >rm|*뒆wOgyt Ȅ9o(ȩF1  f S7tiASLuuug O`ѾT00NND oP!X`@@$BHƱ ջ( \pr 'MSvo#V([TaсST#j#oUyu]įA)ۥL29tQ`u Aua6YmgZW`tt}|];jڽ(#[e(¬#c崬0/Iw6YBxQ4JJuڿǍm7z]"Th,9 IGWߧ-VxbR l* .dD~ n}0&Co"x/߶ C>22^oUi|Adӧ ( z~i2;z2ѽҕ\2̀&f`̱P1\ Q챢DXX)|Ҽ$S˫WJOy1;S ɤxAѾhB)~Z|RU,z|bFD}Vb!?"nOvН6sW6^&D h<= @?.n,vn3qe+ǿv ^n p(2 M6\<53:srܪV)5'sE˂:h" VE6reOwkIچ0"1lQ,R2[ 5_M*PInQjHT]*4t֡,i8V@yֈ'vp)Doϣ$ Q,OYa5]8xwdg=N0Yԇadgc_{ B@2tlZߒ>05 [#Rn$T4NO.qN~AC]HWmN+^Lx>fǛbԮ$1{4q]D)@Yz.غ;Q~ĠU9hv,BtQUnz0 x>r{4<ym>0qTEo @X/`qHmn9 P"j =<$ـ Ў Z04֑ XO9j㞹?Ȗi!JJsW}}ݹ3U1#,A]b4\~9:llP JhB"K`YnŒy)DYFҜ9I`*/^N+O_WgW82.R#2ǢVjԥ3F4o6BV_0xn v> ?4XB3-թ(@W9VR@Zq^~z?~z4.o)gBvc~W\=|Ã_op^eۙ˞̑kr`8'!QX^`+cp|=?;6Ob=Z\uR]wԶ~w38=mma` ġ¤~#Ԡ[rBo,YuzY!a+aV=G, ЕKrѻ~*Qql2%\OIˉCĉ9 (XS’4h0ySgJ=er*'hV݊?h>mNwy=֔{K1IBjLĽ {4F;Z^ua9` m $>aHG[ɝ^F+8jd33UJ?̕>6o/UXHLr B-)FA Eġ۽vR  < lJbxDА[EĠJE){ĵlMDTw 4%t|L]݃2MkGJ})nW1pR)#NАb]b󝪽ْ΍{ l!2lywt4Sb'_XL3:.LU8(2w"(}qæCcT(U藭z&Ur ^z|AoOl’(|qT_EdכGt+ɾGkԕ1} (f[>׌RykwL|J^W)DJ8}yf`CN @L8,TR>StCdKnTg+8Qz `= w["=@#RHp2p!ԩ]_NZ1 "ڛr9|WįJ}&'X~3wuYR o9Tݙo @e5gh4i U2]DGTI,B%ֿ͠o=YM 2rء:+LXn \) ̻((:ReDvrŠ[tdR2HoJ3+\Hdl:7LuƕwM2iZ>m (IĚA_Q ' sSVw5]GwjA<\3mY vdeITgK',&|E2i%a"3mL̽X4(uHr>>Hok"Q3}{XnA(0 ``J?Vvx(#)j΍Op6Xt/a\=tbtRh :J>,t}~:[K"$Ra(s)Jy7yiqO ww^ \zyuC2LN>+Fܮ1#t-=h]2c9Ujg?yk80ҼF`L &@Gޖzw(Ղj;P(npAM`3 `:qfq$X9yTU)i5u+i~TOa4L4ha]ZzDZ(\zh"JM 8&\E.t.dfjQe"Pcڪ+3XhqO$w~%" *p_v4j :XiR>^A:<~EK=, 8'3--#ZiBw}kz 9S )EΗDwoyu\puS{Y[7CHv7^mpތh98f`jw56TK#pŪ,ZK͔d~1!o !8;٫Dz+}+ '>B"0ſlѲG">,md/DUzE9QWj ADDgNT!oz g2z&m 3-ZQb4¯C$ΞԤ=.SƊ ޵>Ҹ.f?NAc$H&O/Eg$RK1DCV2{ЙB0`sOJ 8Z2NMT%Rw.1_%5 8))uD#ycbj{O#f6of 輾eLAyҲFWPܝE΄-IΓwXC3Y~'U:g8X,Q]hC`8ɵTxojR-PKEd r Kų#Mpv> ex{ldO9~qo ';9 /wlLYy;|V‹9̧`?'b A ^'Eq KXKl-?%DV4CK+=lP@aƠ;_fyu]a`baDua0ltR"9v/^Bѝ*-^v4=Iη\ovhq 0`׸VʃfB\ 2ia.2 RM)α| {>Z9IkE5Q!j.AE^aH Ε-j1_hJmk^D.i&P~ 8's"zIÞg7#?X= 36ZO`lo?\jS^G5F~BӨ-Mњ2dWqG@1X?+u^lwljil*>;]9F8ïГCCQ\*8lgc|V잁; :hn+()_#"v>QJNtL,3n0"̸."$W?6z0!]E10C+]E>kC< N93H}vB=ovq +e._%;7Njs7P_{[IV#q/JCh*?95:1F`[FGk:5`[֢-g(3+~ž4k6ȬhחQLj汥e"u]%4xvqQ5}>)2U̿R۞lhzl 'H B+!U{i}sѭ7G^ Ωdd8|Ga./{|Kg*_q{{LjD¸<!DJuHg#]ffvddc3)dEx"vBP$A`C* a[bsP[ZJqmoQc9:UCA;/["M+]gHNbZIx-wծ>mL`O^/] D-䱊\zkUj5Y~"nwgL?iP{bp5jIF sz6r puv؏m*$,kθ1?7KA{@.)nXYrt׆/ج9a[!"wWl| ?yOoTִ\ȟ:diE'jmby5f, ! CCE$VczL!f1D)%t) ⪯MFDVHDE S~%`ѿ0 STRÑq"6?U5a0\)B 9~[rX7M/1P̮7gJb H$ v<@ntVn xyM-2 zؐ*C{Q͜t' DD͡kWk h >9=ސ "{6}B}o<k<肩"ڌ& W̐2eU-RqT14.ˑD6B T,-.R.Zi%;`aP]VF<3TI"|6H7[B& 1t!}dR_T A_P UU~@W(1Cm e[WڅJllleAd lZhW \ nVR-!*R n_> #DVH=R%f]t.ЮV0lL&4R'AECFʃ{'dxc t?,+%OͲY% dXAdTR*JV?aGY`dci*LV W-D[%C:x4HV Ri1T BȤ;A7,@,h1l[@`V!hTVR4Y=HRO崢oC^m AL$ 2ђ@ mŭ(1Clb/QFxc1J0PEf )7ŇlL `ztԚi|bkg.9 !H!-C$*R ̊՚])9Å,Ì_0$'ޟWpդ(0@/ΌN Ʌ4@97YKR  W?xC@ʧmz3GrSE[!MYxws IB T)z z_3W ØVYjjgcJ1W'ؙMA^E䁌4ee+*@H@H v$^A:!+ 3 (D~k̠ ]0Z6]Ke=(\.5d3-Jm.%+ͬD`V&Si+s[ k9mD扺}&H^l&ꎶ`2g(m@ -dvVJ0 D0߼ `́|%0d%0N- 0`=e\'Jk $?.:Y4VK-d38On.jąW$eo.eו^I#,!5<(ය{\K7Թcx)4wkh (LDә'"bDndz??βG™,1~ `Y(PJQ#`Jb$qwۤhQG&ҕ +~< O?,HDpmDă#T\'/ngwG,-% : 2+| Dݰˍ@ADBINJ`@Q 1Pk%O ? gWͨ2`Bگ XYG^5Puʙ QQ=: 3D`.|?/V+*` @Y |}1hOP`zI( `u^($PI#G"=,diFT稆vc ø rXW  rAABFCgWU.BIMp7OvnM@CF@!taŵVRp3!:a cSt_#Y2D 'r EE"1\[@CmiC08m4U{\:'yT K.vsw·q =zfNŁAP=C-"b,%(%`Hw" „O紹XWO _y#H``$ H3qVtz(Y;Z VVQJcw ,(pE!%Xq8{B EdjԈ4u!(0پC[LfbVsYl1O9"N TUhPx=8I3a\@ ЙA/3z0Hhjx!D & z dXi,,'b;RHwBSN$Xr枞GCHmֺyz'Iևf‡nE)m)<|s;~}y,nfH$Rh$@Cf, =bClVhT-ZDP}`/AM{\?ux[*I82SW ЙrnR3 11/ZS5Tԛ6j#fc&H1E\}I=0X&{j!O* ӊxSf?U"(y{fJQd GxF(D)I= v}b:a!lzbY2P= M=\\Dεr.NO D8ܐCida pV ą4IP6"ĉ3PJ5˙rӸPL0mc|ybj-Ϋ=2 Ǹ ?Udrd,֨RkRpv|,Ql@a.SLʜr9vW?_6V7Āgc,;Z|5/( {~ȾEdU@8EW7*(Zg=rmxwjOENic 25׊\+N!ʲzZI[$ .GVSIRH]XR10X`pogş"4Kpm gm аu?GB+IƨpcY Dٙ,U< Yؾ:omPQvB^_$D80^St(^ޥn8>Ի5މDŽ,^_QmS iˈNsY˫8@~'DI/ZOz r{HPh Wݯ'&-Mi6غ"I>c/_/\^^,Kn*c!R(m}-Yu%8OH2\e'9oq o5 wCLb{jsdQu$VΛzh D-5++ryQf523\Oٻr%.aR9<@`Tv-suyѿm_[Y *좵C)g<MҚ^cK14y+dpsOGɊYIB%`g:1Kps)gR1VE[ CzH;"3 3}NWdI>DK2릒i:+e@XHX2Ԋi8}֮/wqVLTnn e)BE[A8qYmX3'F/e&Q;@-~g8D;: VMݨxx\:pN1'kc/ O SJ%3ldZV6PyґU`(D{%B(9B/bq P!;F:X|V 'z3oTh =u)+8qIC^_S6%M5#ð5"#A ܓQtb$?ZH7;gL+֧{XAPuT}(A$Pe"?C[y+Ϯ?{c4.Z$ -L,KC4NG"56c_GmeZ4.}</!м)rᗠp3n4`w_1oHTB{ r3_q~ ՙݮ=iڸ偷 +]H"`W & 8O11P]+eBs(Sz_o!"Qyim$oV^pvGnc*$Z<4؀;e_(Q&cX@;8T|R 1al犠 XW(piE;uLr{=#&W`Y*ӕ ]69:RYg)Y3k?Ӗ,w`` cvI~-i:J -U A~J' }Y38) ua$&&ˊ@@0[k=Tw\@7"NJJ>nb]9PAZCd,K (Q,AE,VY%0"aJ(u2Aer9Eh?L6rtĺ8 C&L c10H?kz ʵj!4.~X"EܻAu1aQ0 /.ʂk/a~}7x~{PKPC'<%2 . Xcb@:n"7j?G2 aFqi< DLJ?vg2^^JPGn&˲,Z:*; /݉BrmB1I|L%+GTx>LO̘X,>o'pe(".D Jː2@~bc,]Yy^,!@đpjӞڷ]yeRl>v @2`~ ADTIrs߃Zf%([ NP$&KdLb`cUF!? .يଊ0 (Y"DVRXX Jua&H%K3f3;5Dl[E:1ЦLkpɃiNjwF_9XO"M 2;B*2w(i!%&TЎ-}LH~!`{tOy@fT50fbJ J48ԝ Z-dJqw%KHR5 I!C~Hxa^ Շ*a;}4GO呌@ fa)lC4Ndzq xlӣ;]-ųفb=HH>w:Hô8ߌ&M<Xm:,qm$eM C R(X D|LAc >gS┳H>,} KL|;ju7|:vou%Om2bI嚇2H :xPc fYH@$ AHH# !;C( L7!wNHk𞀌C'AXAA>g`"h$h0yn[c׮3'h}X"0 ,Vʶg҂+YQg4Mހ@b 1eTj62H4, dD`$B l Ĉ$!ēnM3܅eUhA8M78h 'bb<7p |}$$;!Y  %dBBx \Yi$ DL@`g&diZͧv@!"F 12kFQP`nmlc!3;/Cl 4Wpw=߇saPQȑ? *9M!(h!Gwy(y6P (%Y Bْ1/ M/dEJ,! %$I8DBA Y:}/JNv2.a Ұ/vO"G(ZEn_=L|Hc"XY T ւc 3>h bOTP ZY%JIB%6J#!DXx{~aā>6 ).ЁH2`'xi.2XߨpDC_6HY!7޿}R̿]kL˅}"J&u"'REOG9xɑd D("+N&2(, 2a:/Pv*I, \+dܗk0M5iKe&s{z±yLZѓ5^JS&^&5 dy1܇H@=Li;Hwɾix,$7Hj3Ea bb #άM&\B [}^rzGLy2 ,"*yL (0@DcD!$&$A!y(PKiƧ Ml)L9Aj~VAվf+#؝̆CKOt/L=4 >>K>-TPD@hT$@Һ1L4T;vbdaU-F T!"aW孷+i 8@)BHĒ4 |||jY>23_ubRjJ+ƦBӃy~ wܹ]p䖜cqN{!ZStsۉ ѰF7r3*N.9:S8^Fl:~$1Pk1f5sKJKD'f*`^s|B0(74WZN57^upۥѾVƙЎz NY筡)M% ъvC@.apZof.2pkm\]1n؊y2r-[۹MWI( Չg"%&Sle: ۦ|DC:#p,Y2V*G[e91ķ ^$+(P`>%0n>EB#{P2ZL[Qj#i!HHhU0v Qc/ CҸ >Mw.Ah6r2ȵ2chñWǟXJ%lKΌt+/"?oxy #e4_1r C*X{f WSU\ٺXSYe[9- u `}m֔=ys=Y/FDVM<qPC&}߰S: VEKѯnV9*˻/ri:swMowִMp"h*}q=4X ap8BEt m6C%{&ĸ @.&O0eA댚h;P"QK:6rR [*@T|N_԰="qY'P1z@wp^tPz3 :FIXZ!#/5_ UU]:!VSlN&-c+_b"6,Ԓ˓+dZ_̆DSltl[8/SptDE'.jiSi<Ӄs ( v˺fE~ִD$hx&vFñI@劐6q#[ᶽ_ϔV'Q UXiҘ~$]]RIk, _`d84 7㙭qtOIwDW U.O_;F<2IR #j醁]e1?}mq k,R[װ>1 Ci, %ɡ~_gR@ěM&b:n\ۅ[PZOˊ[n|Y)(B(elEjB*65 )a-QD%a$6DN&#pMZ=,\1= gݿ 󽻮Sa{ˣdϡPDŌp_2'\( h~bVg2{ǿ*CRPDXh@P#1UPX e! 6QE *AAH! $XEQ0e2o9FX 0OXexN_7)t\Y}b{sZu6$c6zc ݇,h(x)ӟxx9YppBa%cSr՛2n3'y LRQ*'qnyg!ux,wrsNxk,9:4sa, 3g-f3EӂfaCֹzqGn:qz^,vdhДd9R;@m>$IKӵu(/\s$#+(HB>T6M|[L0&!utd~M$}d⡯L`YACY6ZVp?t |`j*|]o  BtT_~ XFb0I}HX濲vi{: )Fntf|ő;eK_h;W< Qɲ GEo>c;f.߿Ǵbؽ@ ޝֿ)(id $a/>2N;\)wh/^@ U:\T_x1d- *R\Py$ԄC3%BqPИh$GeYR?ogOl? ۟}RS8^;rߡT>wv,]jƛ1*l%dDcM5pJy!"'sκ븓49ΦaZ::kZh3R4CXso=W-j"wR'4N{N}o]ݕE0T{<@5(  b. }Y PH(r)؞~QV_w3T88b.oF# y]g>%=4w1BȞ%Q6@kð>\*/& 20rTr`fafkz4mZ̚{krWqtL:1a sw K͹>/)5H}Ȣ,}::TY{kE.10ojVey_0ل)-fSE>̟!}|wx%-{ޤ5I2u֝Iq8w|̌(z`T$R1HvC0,Ė&yM\1aik,mPYj$`ɷBBr} CP ( 3*ex3 zUnXOP䑑ٻ}^xڸjͮW4i6#hc?h;/L, brd ,0a$` (Ohgwv(xC>:h,:e-j4Cv^ IuÏ9!i?~D 1  "1,VXPcY)&A'-?簒R,D$ID  B׺kxH D* J!XFCԒy OHY"+Q `OGipb([dEwd H PuF0Ep>E1ָs$;>3|^dGQ`=T0 ̱Y)P/|;NDvpr>=* /mǦ>DMH~N) thVnY1gigJdEX!Z `"m oT~50S\{uT,RJ$"boqB,b}7OCFD4I6|VO\ ݏ1<{z,6CdL4yɣAEQTA3 xN&O λOCR&։#>{rSL {rmF?^08XeL U;;$YfhkWdڛ a dm–V5cU8*`&c'uNܰS+"KWoos#{n.x9PϳIń¿iz^`]Ka&,o%չK$0IVx!OH*U qBʛJxοsxN l[εZ:F~ @z!0t$8b*f ~s=O)K8wޝRtM.ljz%9cbUҳδR%gu{DF<_.ÔyT}I(l~UxF/c+ jGdM ;#2n1Ø E+;Ҵ>ҰN ArgoȜ~ Np˳ӝ[X_inN4|BqʁGA"cƢOY&m:?0ΉIK01x,%:a&՛:nȽXa:QOsy lP&R&",扒^:AP&^8YݮfwgCtuמK!Rc &_$?9 Zidӫm+<NTsP]p k}xַd0ְ4 XshGB[#M7% =8âN:S\MIUX;.@ %$!E.٠ZҙCʸ@ ]oY[vl(hg+7lDJ6~&2aZ#$m"/(bc F'T"bVE<b4*(%}\=~N'(Rx QJs[<_y=&Bn{ Gg}}}=7$M0OjgtΟv:T6=KbPVM_Klu^aZ -<ȧ< ff9B#jv>m֩u[ 榇u~+ݺԄMjכ5Z܋#?t J!ejMuUZv]N&︵),5qnBXx%o$يj:X@j$U#R  ;itT+U$)!)H,`jib G74)켐-΀I4hI&Ɂ^B ,7 :2 LLn<D 0Y0RC*A;RA\_ӽ{֜1;'?&/QP1m,iTUUCˇ7-YoA4 O.{=+?ys z?9DM80Xa~)4{>T$vъ&wH +]̀BIm*ZP萇c$E,>$JX|K ~ɼ]"qfs~= #HA"$YȑbdDTF0dR)1,E"b+d n^#׎'!'Q!!$AAd bD  DR("0`Dc F KbOC&"d~78wY `Y=sR wTR1X HQꢮv~iG,(j':u0D,@¥4KxgEx gN} WwK/9CP*>&oIA TE5>jm/z}*f/W0I)rt1f$jTIb2Uw+C$b)ģch`:E-l)[Y 8yJPV:y8$K੢M I+b/_g\oj_ㄱE k^ c #=p A?7hv\Z Z,ZI+F1|=ĄکQˎ&ߒ&g XA }Ia};[u*9Bh ?aYB >X{Y`0@TDSI yU*ê]rFլFw RN6i=O`WVmEiJL#nAihD,U #k:9cp k0d"hkl1Wr($L*2ʒ(E j˲z=?iK8.(Qwв_ Ϣ#X&|Xe ){{xYF; ! t_x#a?yw]ihn*Roce^ $ |Foψ,eVƩ/wL5?Y 7`뉫\9zTwRP:8_c(D= #5bSAi Bw|0_ףn8GBn\cՌ2$dfLO`G7x郷sJcL\㢩 !6 t~Bߘ[H5Q0nVV%~EɌHTZ~MEU 8+^Q ;ǣ; *Iˬ2 ɆY1ImLӂg <:eIL("`8#,Y"\g%jB6h. XNi!,#*^efE\)W9KAdȆkJD 2B h!eQTćni(8LB" i唚Vͨys8;VfY<(!րLtJQK;UńKi %bi^AVD)`'XqdhI 5jgg?w>ZtVnr,0ADN֯mqN NXfxM+Kʖuyu6_ o&[IC%I(P  .iEp gt=j/׺SbW_𲔰L2iW%D!5}sYEJjV@*uj[z͛s13pə7]ֻާ&5D`quMA4w{*bj 5cY,Ai:ik?%=*T'.k k6i՞޸!Ϲ4`1:!L}s-v5$@X WŦ0fGѼ d+BԿxd@ *C$QPx(I*?/?ٸ h|&vSiDYQaG[< `URU!($[z%t, lNx5fy9'`䙹&Bs99I80Tf$X %&:SgFE(p8'NVېY'8+d!b1Fj$:I;l6aSI1*0aawBxa'HrX "d@Ec#"Ŋ P5X“t-!KN'T:@npu$91TWUQ@;`&%'Xub]ŅbPBH" 2IgA u p ĆT$BON1a,=a(txC$ @HA eo ьFCv8{AwMi}N$ĺ\"eIJ4*`$5a#K+q"fP‰k!,oi8dzc4 RI 1]XgjUXlVH;!+q1:447im;oxɰ# m`W:dd!( :h@ 1 CH `T>_$'#~B'@T $1! n-r:HYācc! a`ȑ đ`oXa!' hlud*i!d 0 HT pkm(m.L;2QҴ7- ['GP:s '!XAk@8d1$ЊA@Q` H VBc!YBHDa(n M1Gy "HJ*MR2 d=\!)$6N0RЖlD@@a$ 2>A_ 67d24ac,Ϭ$u"i#xf:y=B$d*n1N H:$-`@L*Oús5WBdf/hhSݸKwuƀ/7Q J.,( )" <' 1c'x(Qh09< l'96UN+4) .'m#t^YزV !ENB;c0MBc-UhR"91_AO~ >b߫I0畒ɫ$Q2{@E"\4T*L"`S, K*&(iWH,ؑ/H`x&YLXa,Λ4u݊+O:YԌ!J9{ީdY'-﫠;;^:$jv:Hx2jkE: AU pyu3(-6^ !FVgBB0)&3p Jg%KocAC᜔x |Rt=EP81* c*<|aaiY:7a!Cä$H ! ) ( `>FᄟDBzV0 ̥-A׶]ҭNFMhC K 9%(c:M"Ä%):ƎJUrfi:tl^s!:!w8APX>)Қf,^)SI CX HrX VA vwC&hiYԅUVB09-I *0QI^]^J!3E(z]CUQ5"""#/YB3sˮ' $ެ,UH;f/H.=`kjRFQ&S$@1%"!U Hc&%8ʒG4UitL&x9SYid$32a )6fD$25m q&d婔 Q - "uXiq \-xab<:g]m 3IvjPe $$d0@$c |4֟CaH $h& !z=5^Z$({Nm-*3$B`{"O)d*$:K 󹯂rnHn_k{!BhHu@F~ycֵVE0` IK@XKjfK~w j%cܹ u-Y SK $9kAbB%(*X kY ĀF 1D6!HFDA0!C"yҰJGgrŐEQQM DP`'p:4b{' W)2s q10=vANN..La~SC0â I!>3Ƃ)0Jq35PAN@bʴ nYmeLEPl4^,*U+V"|6L2uba/5=BN~!Bֱ 8\Ttm)?!5]PQ"N$_$Kd@:=aOIQa AH,QH(fD4hNnXɩs _zIsvJx?K6DcV\JC"}"ش*DG"&ή( } uǑ@zeHUh ^/7)= $5LwTpNe D}k{"d`x RiL7ڦZU(GţRTYŞΑ37y3-@ah~i)_"8%+2FdGMlsG/ >h~y8%t{Ex)PдnY/C_w^ҵꉄ('I -R0 AD=sݱjPlm c$g">a-?C_AI{:XEBB`1\,uiSGxxt_۪J~nH(0 ClU=/:5Gp5Y,Cd5Y+%._JK"T-aN@vp\& Lvlv4Bk:Tz0@^?(ewVR|܇DFD y؎=#YFGT< <@°ZRx8tF ;uiv&F-¿Efoy[/ǺW:3g q&!$Ā<];@Vgq:x=oiynㆴ2h^cdUZ0=.&̷JrȪYI A@1dP?M$X,b)# $Ty '8B(5]SP B!K5CMdه9C\ٶT4l(aN2xDjj@Q8 a!XJ1dTB!i>،>sz?{f+W1v|`|0 J*Tab0\7(Cmx4b9^2{|ƑLbc2Q5Fc,1&5rɢ '' 61f<>o=9t#>ަPM,r[P46Slr6JHbs[;`DQ!m LiV d&=A~^ 2H0uBc$18}yKZŁ'lm6W CsD҆L9;8|-wtb# }wfioږv3@1 4O^;?>&HvZ(\첁1/\*> bߔ8K ye‚6& kNt44Q%(K(6b cP08Ed`@ AM#z_+f6g A#"mT{[ [K=$fZB \F<7drw JiȢ_s{oCۓ_ 6.?ެ9ɥ'[ePz`#7[Mz,(h 9=q#r&4ມQ̇t!<;3 9Ԛunnej*yd:x 6Ixah29 Nhad0P(z 'DZ),I44-UƈA:(dSz~^3:[g&!>ӓb>$R~٠ae5231V.y ћ{̈́\gv*5wTLTD dpeP ;)me*J\R! Z$Ďd?@y:0d0 "ȰT~)PY*"0< nBZ}IS}c  Y2zLL:?Jk[j"?.|^#Փk == q77N0? A7\d1 sLqqF؆N"DV})2}& O# 'wuXE 9Q-O OǞt!Ѭt`l`gc NeÜ뾗iҞd< '힟/ h!,` rϝ61xz+߹T@I6B`"^*'Hd1.^K)E5CHNJ_ v8jBZ+r]t^I}i+DNBLg.iE@-:3V,(K/ @1)] ϳpMOrHѶ{.e4Q׻*N [dJSuS i&ܢMh#Jiڮf".@+coYu`0*>^q I, 4~*"H\ε$5Bɽt V벤`.e%As;U&bmm uO96mȳ6@63*?`A&62tW kK5_ڎ6Vy|Ǜݮ j{EroHcu:/l6mnXEԹU!ΝϽ03tK#w(ڃH{s共PI&Ψ W^EtG6w+: ;Tj[|;qf7( `#CP""1 {D!"Qٿ':18k1i5Zԧ1.v株G&6{eu)\O[0ѭv[Cf)h B?_]SC%k~v6ҴUU`i Mݻ++n['eY!??IDtc?EFA#|c'6"}=ds^ƀTGCQL䉓D {9y;fMxzap61dGlBBN^V`K>'A 492/d2A67 (8af;e|Gպ;L/@en"# a[g oN͵w9 $<&A FA#,*B1-*RCyFF ڣu'- l8F,G%A AĵnMl,O>C A;3%H#VdǓO4C_e'rg;*V* fHrq{^>?:eB׷hrDҞ@^=y}ݬ>U{< \(Rhv&*B,tfb̓*02GƒQ姜Qu+2r*Eƛ{%$97Q"tB2_&2wx u{N%Z kT[3gIBH+@YpA8CJe͘ЪK!M"v/̳%MFN  nV~<6hv S}4ܵ!pຳH?q2Xɀsz głܾՇ_,u<YfS<<^:sqcoIa֜HGvuy)gNq^7q㲒.֧z!DlG>dn;u[IaEFbH́@czb OQQiE+O|!]s֮*m=Cۀsa":Ng1~d(e% ?;״~i|]2kDvQ?vtVOD&?kP{߹lKwиie~bDǞe؟ʬA^|GP`0 k { Գ&g=%Rz0 c ❮%-o)*gfW.B&@c=onrͬy=M] !0=?0MK`5l,q dуljV?n%PmPQk!CykI$iHaXz}I( }AQxlMB>P:&&"Kuzmz>Nft-)YኾMe-gJG/, -=Ǝe*9DcԠCp'!~[Ue@T uo)%_VPXrn4\?bAJ uo|C^H6m'b’pdd):wFi՗)hE{)Zpq2O` *ͺ':X `٣t+uJXQ(),HY*(Tc,ac @,%b$P h` .,x~NѾ/7X#%bS "hd4c0 Ivd $dAHT  X#2I 6= *`t;UN`>eglШ&GD`Q!O9jC<9 YA%IKbҝxLTZ!, 51Rkg|g^g;6a{,$'!ClJD0b$X*2(a*REX(0E ( , `"K4 adDE:#TVA+O M'V~|,b# j@uhҔ5Qu0DlUT CSÉ! g1MoYn jBd в)z=A!0'PIIXJ{B(Ȣ cTHH +cHi EbE m ۟+}{źW7X%yIGt섎do|O쇇35: _L"2nI!OXC2C]I31Et#Gz""~.l:/ ;L}]ťy &=?gt]=3+z. 9sݟ  EriK!cU*zEȖsa ӡi6zh4P_Wφ"@AgBq!s=x7r,ok<}nd%UY8W<9w31FAvz4I_:>ʪֳy=0Jt2+>gCk2',_p) @#Ο4k'O^gvn>vons]w%6bʫh+W¶#] 6?!Q|5AfTS9|rR 90 Vo(EyU@}w5A14g/Wujo>Ӭ9h}ϖ_~&(V ]ATE]MR'ɼV='Wt m,T ਭeP :ue>q-IsMdg9=৒}w,]^ǰj4Z:idp$ݽ]3zNd؅ !54W ~u!Ƈ@[-8~њErHJѕ;g58~s㝠ƙRZNFtLُG3=K}kgyQAeJT"3#Mv^\~lm^y*~klÌ|X %cS J5x;9쳱柚SA &b!mCL:dcG ,%N#v-coWKKkF#qʭ!yhd:rq&'+v9z9:i 5 W7EeT-%p ڞ+DƐLLiu:;\_K0+~1G @9/rQtjjN&e3g~i_:7VoIpM D@h⤀0{b^1,ȯOui=%molny=+•]¨ ~ 4zPgxp+܎h~c.G? &ch}[8lJB\dAg#q0q!•bWW}nVqЄ`&+賝4yLq<翞%B\`ClZF{UI5ܐ&j%I@%d8yaGJ7eկBIϚ҅? /2wC򂉅@L,$U+aN:4"T*A d.,LeEPRE zvZ"8B@)l$f(!66ʴ e+SG(!)]"'`#cI6!&443vk#w x <| #=qQ=z~ւEXILO{߿)Z{ IʡUH -$+mmU [aCenŒ6m*TJZ4` D`Rm"Е%KH!TAK $DD*iTM& R*P+ d+*2""Eb4RrVD@R EIF-*+""VQm T*ذQmJڈ )YZIDыTPYe A`H%҅hTJP  *2 RU$*Qb)Jʶњ)lCq(4 F,bQh(6ie%6LbZն6U6%mAEۼ+*k**4(T@lB,IK!JRRTlKA[le"H% \X#Th0ecJJl!VZ,mia0ZF e%1 "D*]Pr[U*AA dKJ BJ@RF$XMF$EbTb)0kZR5`;1;BQP# TX -G/laAH,HDH YH, G|=(hXb|# `l.R~WW}̍@10Q\A#s@$W$& #=22i bP *ɂI! &bH 5gz9tq?1g2W>wI46_ZdHPwAiɅ$4-bXb@H H10-uH.KP&2R0$!A##$#1X\I)$+d[p@d#Lh 5(cX۬߻`  )*Abnc[,e62a !uB~En0M~]zYn PoZ0 e 4J p@' JM$ }]wem ԼjPޥd$-/ĴtB'@d%gVT iIJ=$/_|";I/H1"TGXR0beIX0Xb B|y)JM;$;gX#{!> H(! c!  D-*0ȱh ƲՓ)VYTVHo+ Y+bő j0 2HN%$ O{-!pXEYdXF@{S)lPHȌϟwݬOuѩ,*pIbLa$ CzZ=8"(}Ya9ôkHh">dtY4R "?^sDfp*ZQD͂0Uyl N%]Z9|9.A(TCiXIySbcXI$  M| vy'O{'z? > *T,ETu%QİX ʍ`z\ _Py0!@j0Ҩ'h#?0<{O|`{\XȮkD`ROa:K>M noHADT"HC(NBR(EX*AE`d" Ț^ w2R CST6ڵHcF00d4(NØ0ʤb2"E &Bd%E&ݰ Vc$M10Bi'n$8͚EcD$HaQ#"0ADAAd$BA iԌQY9H 2:3qDIEQ*d)F09r&AԀJ !!谅0cf I QEvw#?1=~7nDɃQO *(B4R$" X1 (B,""!XH @EdBE QDEXQBAb`І C´J@mM %r-ZJU0c,Z7i_uJx'@4DC1OISJ2F` cNutU0BA(U>ƤFAH,"F,X,BEP`FAA`Q DA 1A,"`"|?R1c|;)~!E]V!4ysoPzfN)lg<â^S덇n_tÁ >v|Az?`EE~yc6Mg|>  F*(*DHXđ "0IDU@AB $I}y$˄Nw܃ {OY7\f+, A S5y'dE(DOwZ咠jw\3Yep@f<2w$:j;g20v @P>Tൂ$~1,(ER Bb|t;0I%ChH,#%8! =KA"dAb=uޫ$2H a\+d4/Z Rj٠Z¦"":j~۲rU^`,y͒&2HP(bB $ޭ.7ed8Z@(7M 'Y .!#3en^5ƫ[]OmX#UA)e6s&WOŀM&o؜v!1#7[c9~0vh3+*1=ô{aN=.t!ܟ6}&:0iy;!>ikմZ;K "eeNb#n^~$s֬)yxh*lg0s\O#lNEq͠/$u# 3%/筲6d%5$7`~yٟ,w~ƯP /UbclJ{nof϶Z-__ٚų~Qd6c)dA?pX2Jz#ܧb :1,V9:З;kqgqa7,ܥ3Ƹ3E^)W`"ΔQ5ɦREFO,S=X㗏଱h,m"S%.Y~wRIJ:wkAPtby!>d*R!;sSb,D*h Xk`_Gڢ VSG T[^ElA[^pc zX / >o_`B@lv0C9seyd\g@;ljп·ݯڷmZ-Mn2@d23 Ƀp@9&& jnGi8_[1Oa`0a[d7}Ʒ堖@3@k3 d|)R =R jLQZdĩn}>U Ƽx©_!FWgNϦs.p=C AhqqxM߫ˁnG.lzMjw6`)p 0BgӦw++y7:vG۶١BT \р~(uozhS5!VlNcNKCk?+T~_rsE qkAbWӳI P9LvVjG:"i:l*.|euAl#Id_H,EUt%wFyHE.MD^aH,;pq0Y5I0@8(ORfy'0=^ PES_7'q4r:IAS.wcMؐYPxxK5EoM5UE^uhV^Uyk:z \ ¼!Yx}Z "6N~8"ϛw3h#ȉ+U5y/Zhg9`uAI dnCk=Mp![dry27kMiY6}Sԇ:urK\[q_ iA5ʁ@eҠ?HDh3 O(0T!ɖhgWY3L@U^, 3>uqG\^Z̺CFnUG!=>rW\D}܀e[9²m~u*>J:E-i@]MSxAWO+"FTWGW@Bz$X\ cA}F _5q9s' )ZMxJHdĶu,\AC0^vg%&?Mepԭ+ߔcJxPM jLBnF*87uˌO亵:6ԧ)c';`bLH~BZ}|М"Ci 2S#,H4i}ƪauKܳ3WSMXȱ9;18_6 .W~t0)@ :< i"[J* 8a&&(.6X ޼~<&r\Rc:ʄ> Fްp@.Ы>Lpp<;| kԙ{BG q?_^nPqI@4Hc!`!p@b|'_}6 Y5J-^LL.\`@'T0ྏHCAY?)jIȝP:C"%OF52R#q)KQA!`}4<P='_ fC+K S0sI$)m93.]gx<vh&,_sƍCAm^?cZkXv D94C";z^[?Fۙ_-{rO\4]5 RؠXcCdшf~t#oB$Q*Z(sש}ۨ-!XM^`m< 0DuP*oTtrDT/QUFj ӷh^LIv{@N8|M<¬ǾDOjhpVCé~hyEgypI0|ur>*2gRtwyoMa.1/;7~Snw&_[5Z xf#2ڎ :^K{k`VZu%,c=_Rg. tDd=Dʂr aO'oceN~zro,{ѬUu=c ӵ , "ccF@h?iNa`%))0 `v$Ԛ!ʠɑ!afCrCOp#[|eHR0c6 9!{A@Ӥ$lI J^| ڠ)@$(!@]?lMS?N g ƍkyqS˷3yE08/0Y'!CM>!Rjܗ/bq!]`]k4>{{`)BeUKwA)UOy "IV HL P$ID,)<\$>?%FLA1$"H"XA`Bڕ!D XGɬQds6!- "2_G 2WR307j4L$1pl *o1h۠҉ ۊ&'ez #r°UANƶ8, $d: C-8a;Y(UD.9+I:8 jʦ &Y2C$( 1w&$Fr Y$Б"L0yO $=&NODE{p=H Ui-j3$R b,>y@,wVΦ}EƇ}5/K`} B÷Sid-`S>%aDP:|\N{!3eT  3 q*fE7+zrdņO|ux;ktN6XW&qʶdHF&fJ2`dOBSwS4oPBr֠$PL(<Qd0Sm!3(#OhNy)Cp@-^B` zO$ a"GANXȈ"dxgGȱ'J<_M,eY@0Gœf]B | O=Pr*=R#[@7:7Ojk:G9p%h4"aG 7$\U\jJ5#K%u؆os[Mf8 iX8)D!P%p4_M| >^B@< Ce(0r,A>i~BI;n!_j+LlQI}Qq4-]uea8JWc65#kaYqHBӕZ)HHҍ!@HNeH3dh%3d@&ȩ DO tw;'`Bp 'j@z IU DH?} MKiTI7\ s*c7>uI ]3*!HlL̘yDسjNÂX mm(KVk 讬* h"ROjM &ԒЩ5ϓ$Xԁ!> #ɛFQ59U,1<4 $C _ɉ4?lN&9)-Jz3ɁiQ2 gs uƛt0r2ς ͐7a_zZv) XtF i]4,K\IA>;t"3b\\G \93Tg1&E}25"6ytӳHІsc2mϔΚlc;+]:?L{B[Nb麮{1rsWx|Oc JwIXZ6Wr} R = | KK fٹ;zfT0=;xTOoB)\7WӿT8qL )&6($v8YYȺ \|a&GAfA 9' oF۴Vz€NLEdߥfնg&HY#H; "Ԧ6_p #ՆO$ |Y6ҟ{[F^ߤ}aѦ!y5ni!3ۙ3$x8l C!:'Ad*[cdgqz 'f/rC_wld :Ù$DS~(Jȓ@M: oY¼5v⮻2ϖom;Iǔ=lz HJB>8RpϪBH`GJDD#N'e9Yd5GfoZT eXݽ csJSJg+VXHǽs/H0jE2?ErAjh{~nT 0 ^|K?k{[*;f~2QkXx #F\jM,&(!)CW߾k~j?swokkؖ֟DL!w~%GK_Z\.AʢLv3n[&;LB g}Ҡ=fU+D qIWāwc㞛+m{m@͋3d1[4&3X.ϮRۢ. j#@hE% N$$92`Q,o5ئ؁PPHBi%$A nrxn= t1Z5$ĵ4힋ro.H\v'N,? وtLdksPuq\| vbNHA=.-QEָABɆ7<׶pY5}2I\d O@H`3 H@?e w%`,OL}0: Pw@߭3cF 5ip0j^D(d2bXd[ H9ŔaQfߝ.1q#pfvhD `<ƙ5RaFCbGdRMv7@3,n `ӯHCA晤.yֳiZ[ +va2qhY 3yZR{=;S\&⻀t'u O*O ACd+ 0CMQZLT4{;2/HR0_>fВ_Fo_I ؋r.R0`ІL6%d h(3=&T~: ,,F $1! d0EE,"`d6@{kϝkMPמSGdNy~P5UC8̰;HV#D;y_,n09&Lc?k_jG7y?|BCHMCBB16f+Om/>l3'V82J|ͧІ$ "hjRa#v~:16]mNZof3}Ʃ 3SkUÒ#:I"E")?-15Sh)??k O;&>V4W`5f3!1 ! i$o ԎK(\}2D<Jo@O}'2z{,AɥCHڰcmDC ovLh >#HFW x:dP[ADG2|H0[BVJH$$h4r2k'IYZqX-P6vChHdeG\iH)4B tK['0,E0ǘce9Z;Ο|rF4i!Q,A * H?T+!z9se`Ls$6гTCmi?Y*5avS1y}Fx]W+Dz#d|Gy#CV7a^,.|dÕ;i ƶJB-6 Qezf>dY.V)5>x"Coni`U@|RJvwaLQY}\hzm!ʚlgp-a8M3+9tfW⃿ޤ*8nluXbےBm^8P%ѹb XHt \mz܎aǰ}N]0*.VA~ 1IMoBh}g^JW mXv^G~;<ɺvbAގٷҘẙd.W d&F T"<":JQA),AF**0J4&z:@"Y'Rݙ0A:Ӎ@,JiWH ! ʷ^Bŕ AFQa:+qD_R<ۡɦbT'`ρ a[׶H@Nw֢'gfj( OOЬMڰ׊c??OD hJdDU.i TG~_]krW - ÜLFg9G]t)E:G^*,"}V,֩#Ezȝ J!ɖCPZ UK2+ Ʈژ4,LhTJ/!Z(C#P̡GhJwcN$wi#wyLUb ĕbUf ЯO*BD2YbؠdI0X" quKp+1W^JPBj!`! hܝ t7P3;͓pd jaϔ$aab?o_^35XBѬ1&ԾbћU!jPEq29Ek@G9Fl{ \B)z\]gLjA#z&Xy(% Qe cRVcQv~y0eH ։]Luwꮒ@@[vz:]Z"c# a&snJK/1~rVWk }pl!!1V A`ph!jd%[HaX~dJ[s ȇRj`v֓r-%FHHL3BCD`e0P(ΒYOu&DA B)4j;ud1凪YXvWRK"HgIpb0_>YxgŮTk3|yn{n[;3riwMiݱy?u_$_͟M5x!l@p(-<Vdh6'16zeMk+)y^+D>'~ͦ&tG0P| >nɞ8p QĪK\`Ԗ7NC-ѲIӜ1 E fp;0D F{$}Pfr'!ψ3j/ܫ"gofC][U-bZ#P`䇲I$@"q'<4E)VZ?d+2"b3yl(h9S*FD1kP o{6oעM4l& P,pH0 5H4RFH,RAH (@Bd w "PiXc fP\,V  Ad#H*BHVI+ A HFHG/  /1ɩ$SzK5 Sr̯jōڏ҉Cd$dH,HNh{hxyVx n)o, [hHS0Q|߉ W7tEPUHbE'q՚,)ӒaCkx1҂iYcft w6?[/b3[|,F"#g_DH F!=YnMB,ElH0bCg= g<%'lz -QFZId# ܱ"Kf]>ikV .n(ksTKN['u]]eq gp5ok~ѰN dŤ@4 i"P_2:3l'/ 躄%!?CF w !^X@UBR TH(O!PV0MYxґDI7ORBfOLSHYTowxվv3,FWa2( (+9>}ɰ05/9ޯCr4bZFæ4$ѥT!).؈+)Zw!Prv~n #?;0g=eswa:Y t"Y ;! BJDd {*P*JnR@ ZIP Pb72L(AA IXAdXAICȢFl @$R1 HI!c CCP`aW $" HC Ai^2`ȘL!SΔߥ0cN?ݲI5`P@0c $eK<-"0 $RZ02EYXm*E&q$ $|ޟ46'06|rA$?Ѐ&4&Q;D5 !D4Im IA`сG.GM3DfN8+,a1]jf%LV|90M `P}v5CW e';g76g:Ny3_k'BےTq[V+d(KBj}dT@XK$Vⲙ-glBz`Oh!@`zkw"@b' iyws"ˍ%\ـ,Bb^Nv9w(yY8wM^h;Y-a&nXDq0Db*(WE:ɤ0bhBWL}"*cE :kʀ] 9dv|YJA 螓iͺu;__O:yl AL?gI<$d`C2-H`>T>8\-wD+/_jp#K=ӬG.Kc'be5Bu|@BBcf͇IuNo"`Q4#}Hb??)V)YJk3r,6MwO4h|yZ!FWݭ;Zf5^K/Q^e@:-K,̂AN+NX+4ŕIg75A: 'Zx:0^񙮆[Cjw;՚סGH D_@QN@oK g6.8R>hl|FT=OqYudҚ1BǔuD|= ͆-#pAnXJ&yyNjiLc{cϨVFN#xJ|ux|0قV3w`"Hr!$>br}n6JH;f/]K Uʒ@wHD@ pR1_?p G5fØō==w1 64ِ|(S{#i B#YuYW As. )O~\,TQR̋F?ExL! @eL9$(L)?XLҡ>)HV ztxN8,!Tji  0Po1; ! C,d^ݻ)<tQ@') igj,tJQ ,o0:(joE_ґy|7DOh5OTd|L#cܼ%6S#(ioԶ!_\pULW;zh]=ͦ.:ד3RsDYq"jO;z+iύCg=-dCE 8CzEs"6D8 MM $5!%2D 2ēP,&j0!ФLcfvY~1 > HB>p  }ȠDnf "BC1I> k%c'bbz2> dВ)3u9  &aJD ">呙%CFJsq?c蔦g}ލ1gֲa$BbX#zDu0- gh&0 ὎x`8֐66lP0dFF}_41L$4er7 5&M 1M*$LeA"HKP#?ݭoI!RXř>HM4 i:[Žm{>I1 خ˭}VԀ s Fqt?`IA;QF*Mm&6 `=[+Cܝn2~ }!-I5qƌabkPL4Q6ݶ( c挴Ybl]rhRA=圉§䑘 e b~|p/ܓ'{!9O zI#AX,B `)"R"$F $@"`# b,XR (( HF0skxNVll> A>҄yy!s40LĚfqF I00KyFMR2$m Z̕LIR'TACLYFm4]65o@sƊjV\aaXbXH%d3cPaH,"lX ;*:hg6XEPP A ʽP#$ 'HA %  Q@ { #,AjخdRbGӨ}?0x5T!Rha!$OnɋkM\ W @ +6 $>t"%$\`|hU2SC%6$$'>+>X~> +M@l L6Բp\ ! U b%;H.x$*`*('_:J&R[b`0@06`Q qF, Q@R`ʓ!+c)qPߚ1٢u&4$*L.d""&<$!?~ t/;V:$nh)$UI TPG1!a!4]ln9D$$꿆{GX{]JO_)TJµ y?B; k3!BiF'A! 4M*\I|?k >Rj$Y Yk^s3eK~;كєm 2h@t:{M )fqMI+ Dh|N!bz:viQXR; 0c Q""Y i4hfp? ZB<*]cZ muGA)#-B!;ǞfGčwy $Z/Ǿ@)8EXՑc &͜f6SȨԏ)=Yx-˛ P^ tvYҦ&nQJ;(٘4-ZI22(,,Ty;o~&]:o :s4(ȘX^}:UA=]`k^ @/&K|ͅl _nΎU !f.Siw?0F.N!q jDÏ%rn*Iԑxa,z^GP"G^vY޵Uj[Ԋtm9@| Pc,L*f(oB!?l|cSɦԨ tΉe !j mWr"̡d1rb9:#>q0o&7 \R]a"`Yy3ړ =>ԺJl}Ll5pI@:_W4U<.M: 0xX{-=mT=1o _0oZ|ф_).oņB+mlT`33 |o/R:w OtpqyY_Xjp\`G\= Emc\%w(dmݰ+sJO\t 8M9M=sll752XUk[am8@!t{H'(kDUaDĊJi )̌ 82d֦h! ! кi7voE,* P,lBt{4 &*YJ-&$Y&az~AͲ\>CQ,?uIc.a~eVJbw M2E ~܀ã=Yc`P%di)@Eh͙v!$ɱW" 5g$R r8s=w"CrNS:X*+o *$]YMU2-O%@HAҐQeP#7ހv^j*@4бPp?D6~|ac%p6 ]Ǫ={ٺO9i9z UFO l(,> s,VqU*ʺ@> S\:}%{<7ͮy QΫOp[tV@zţ]pD7 !kTkOo+=8dޭw5;tYXtص2cAFb)qr "C. L+yJaDG(B8R*וi3Qo|^)1X N3m_?e-)t;{_R]f>['fHca$29Z ``0K ?<Hoz܎dD"*C*&7f ,R5tEj4ϹrgwB$l1 IE iyV`b>$@(>WWIHNjkJNSė4)i%͐%Yݖ?}^~.?<O(TȢ`wPɯ3A-č6|EsRvvxWIns->ܶF5N ^x8xPy521E5bNKsuG]p=#q3b/[뷯G~. (‰!` ?08P'BS#$Q2& @XmN8'L3"H EP:` &5H& g>+\C\yhD*i ` !>*3Pq,Nrz)ğvoo5`6#b[~Y }~_9pz,BIFG<( Izy Ǻ&;u4x.K4)x I}S_й^}Z8RhڶVt&c;_ <4W/>tyn~fVΣ.sD71' %G!H4 B  Ox pMpPY$}0$? 8BDЌI ܚ)PLILC%dIeueBQ2;;IZ[Α=kFXEM4NlKB(E?j?wEA hCP-glIP$Z'?o6{Wjzt(jhA$ R!!Diqo8ЛDD%g2X2A8'D=DBX-9GДJ2 D~N ;K0.qx݇__kyn3 $Dħj1M` H3JEEmg#*%I%tf7vɒE#~9NB)&WҘ+CI :HFOCan >o0 p̹Ƹ2v8B8#DN|B #+RW_w5-9S:nԶa'{^!lг"8hXdc]ܪm xu !l }1W/ ir}Js )!v; vnbr/'f$A>RȦ% dTM!k5z, ,fVTA@pV۝9A|DEKm,шBFD 0H?!ɞ"QR*$$^F 1cgn~[ߓaw#YS4X& CVw÷>v^un qtZ6Púj9LUvJĚQn1c;?" SXbK'nZ( Ҽ } Iɸ&gG)"ve_n!4 Fyt e \~2Y/1Y(4ECO7j~"V3kut4ҝ2':_g4 [~Cy~.#RY/0TNPG8,fL[T?m D-]$89pZO""$(ō>}KV" {76} ز?q hKC7I4Xlѡ7ԏ`Y?t/GzW&'XpJgzLQ7(q=`s ~'BvZe$ vJ`COƛv4,У 3:erzj[\>B[%%3xVֽ v ֺ~v"iNLj9Tj kQ]tZڇ''t3ZZSUe1ZF# f6Ou4m7}D*s fQތ"@*Qb [woj}䇬Ud'wi{ȎrU,*Еh ppH/X]&}T)H\o0ot~T twfURƢ<\^$E1`G`44*?_d DX*ÜAhﰞxStimZ>uպ;r=2C,aiOٸ3HhT!wUTFҽgF'elrƮ7)ƽ{OY橠7oi\I TVϝ!?S`0F"Oe9xm:Rxɡ5e.vx@F[}VsWK@:nȿio zmnJ< OiUUsFUI\,MH? h,.kd ^( h.w~Ƚ\)OW[}eIfe)^y}pf=>}grȶ̃Ee!uE7J"pBnFxh2zu{x.|7esLATޞoq}7PaUKeVĶng0'ɴ 49`TKF 2nCalAyNgCm52dA;H$Yݔrfhm3{ɮg J,ӎaά֊IwawoEn[ GX-ΐi2n2U7Q=0i?O7sM]tΟ/({yƶe6Cﻊt>+tfT5 +}xu 9BMW2RFs ԙcׅYipsAnJR$94db\fV]~f7W!UHApB:Tzc]\(`˱|Z}yWzt\Tdn[^J- B/E -e#`Pq.GU>w23Lv :֮U_8TV7)>r`3N2eo:3c7'AٽSTqWz̺T)AGIlZg81#Cca1_/.9R6V͹H6TzCD c] q=CYmd6z}>lPA'у?qv@$'D#ۤ%H*okYXED>q?.'UbEBQDad "YG4># Cg0SH33`',%*H~ws_2( BD""0FHA`„ $n"~C~|ČlCQD@ bvЀ(bZPH-Bd66'* U$/ THIEj*Ņ%b5bLT[-%$HeaSi"Bڅ]f fGh~b>+=@OyŒӬCBwJʡ$97!mY 3H-,e!'d@*IHDR$DE"Y# L?`ʕ~yM%'j]j4QWjő I\ƒeeEn2ֺ+g:kV\7!"MʀT ȂFFFK j@i@H:2$jbDц[E˙BZkBdk J #RlfIL#\ s4 A $ YQ?f /{%,$= bA4X)HR4Oش$m 5LȐ %OFɃAWXIm褧Kic|V f[Ap3ݴI6 0ua6  !`'Pu|chO7Qr88;Qel⯧/s 9n%xirf_6Zsگu*/ }zl!-KIueI-]tDZ'/[ȁfT H?)wd@VHľ$ |JkÇp;vNJGm1PA2Zjԫ3 tki]w%o ΰ$~=Շ8"K4mJa)u:l܉,k JӚhm(&r6d5kfgКۘa@VjUu ""BW-7@:A0?Ev15K 2HUO"]DJC7,{PX(I Y&@3 &0’B0aVZClZwM&1a:L֠bva;'`UH]kioθBKI\yA!TO5-: CPGA2], ,Dgҁ5U"4Pb.4鐚O㶵a7߂'y`;`vᕆҢu0&8;(+Q{22UB‡{;A)Ddp%\DJ ?dޓeFr 11a)jL9_ ?L*uq@{ 4tebG,y>9A E8f9,v KB3Muk0#^d[].ݘZP!,9n0 * ]HSlYq!#Jٗh`QluXUy16ze99.ʆcBU%A"Dp@DD(esq:z C̠)(MrLv$ 98 8)߿ێgqԤHI P" DC "&\1.t-nHw7';jxC8)f!_?[s;=igMKJk3{tTn*V#c+PF*ՀhKif&nc8  Yj:.\v`)lCJ]S TF(skS5F+y̎X0S}F}5'TR)AڳzU_6 jN+CMM|5ŖA(gG):vCM ވ}  *XCp46fp$" 7=& jK=#$Bp[F{gq}ǽui_i{a5,V.I(W16)ɊPAW4 J +(e#Gjʹ9XɀgU[7~MȯLIB6X,}Z^ŊGl .FU΃y^G9S "wDӐҔ&c@0$ @û?`JUC0Z(Cf@J")\KgO4]޾[NAw_\b5T̈=l9P D34mČǷ}gT1sgE>Pe_aC-l?~Qs\ȩ&İd`d PkvM:XshՆɨc0\LЛ[ؠ4LeAR6J H e]f3"i8ńkz0  F66ˣ| ej2BbUZDbYaXfS3 2CeߝDd\ck}EV#ty~kx4e&@rh[V-Hڔ tn=޻{M9<S4zud &NԊp%XNoT܆qZg.܋MgEKyݵhDMR% j"J Tb{FGoN@ ItR2\ .8T3Y?6@b&SQGD S&r{D;$U'HS5$,=i!PCOdڑ !"dBid$ 4h8ֱݎ]\ŏ2,4@۽]6U$wh]%]AC[.$0e1$A:C-cO$  RPFD E ɄIo1kWѯڋ >uLo-Ŀ.Y،JO75V,RymN#<zH'N9Ӑd@8ԑ73`!$L OIz>r$Ox ¼xجUP1HU.6XsXi#ż%xNl&Y!2tdXEY3H1`?rŨBL'c%!7*}* ^n8-Zֳ6d_> H„DB:!C Hib@O2#= l (PBuZK $AO962SZT;?M+p"RUz5M3g ?ڰeYF #"OWChҌOP%pC/ýBt)>h4R@ /Q #ؓ>*0TX}dYXj,1ѢV ),Db*%(X(XdRQvDvGk>F=Ηx$]+$-w^"` .`HA>n?{|(w > kP=1SU'gi&wXy~KA5aB4a "˃L]ȃrm%M)l<|lc5Zsm;O Fy+WA>`'¹ #hϸX$<q 9mbЩ GoT¨m)4ƞ38LL7ah3z0:LN'1 .(}|gv5&NeZe)agji*l,^>c%hq:VW\HclC% .ν; u@ 'BA᭰}=Aݒxx9xpww:SGPt\ xO nEqot%zwR h5ÁӒ͵5hjP(xɄ疮43ђzn*I 76z)$̶vuƞ7$ V !LS*P2N|C:{`ΎdXPU%K*G)Fy:O| U^EOinF 5ZÄ* DZ I{;ԝœ ,cJMBd4`h* c,< C6|dl,ݓCOixwœ?H1H<@m՚Ku n Bw>v"=wUb $V eS^C?@e ,i[\edMQ3(HԡH2H1)J!hKaP\R7b^xmJ]x'Y[:^z*R(Y al%gY߀Q 6!hY"'X10O/Bu;ЈvZT=|].J=ok Xa60*e8s] E)ePzC$S0l 1EtKxWc$pKïAG`a p\R^c/nPsȄ>oԖF8f%Pp?.BeWTdA24qQCr"~;g,ΊLr0dFʷ$.$Veg)v"5*P9ssx7tt? .aUFKhR>̬۟ZvU33u{T7S֩MACI^ ma#i9u:"Zqa֏VuKtY~}[ v8// טKE_Q K ݐ}?spTmg5Ggkp䶊vklS |Eф 5]O|<6%E)LHjT\4GElݸi`TijQIVM4+e:]:#Y2Q$DKt).M_5ȧYdh / !!]pFueƵNqbz;x3GӄK;N9*:QaMmL|>= :Bt;qaŐ1mN-ǯNE^u`)0$ R ?[ L J(g` %`@ Bw{QuoKW^STt{9 ;^j@3sf[ @Iؠ G@ `rj$]J9csM:$\u:o@t'o'S0KnOBmV3  Rh; ALK޸a^-:=3|5C!C՞:.5(\ T괐I>XJ B"tUT1 %l S%r'$aLtW;z$ވQ"r&Vde c2~1xy!܋"ܠBd1V 4Ă;*F?Z0'o2ysIR !ӎu&n\np |-PCp! LRőt8Najf^+h̬*ȱeU DRp.7o `T6ILY=UXB*U)ZҲ (W>j@!)$}',r.6NEJL*E0Pl{ &t܌dsk`{q.xF-u/a8+޿/ng؉/L} m`æO4^cw2;e9\ X GV YKsvB=/cAVS-^iY:Rǟ1dBaDǍ^$4v,%d6I,G`mdb]%G ̛li%0,*(ɐ9 :P@i*Ь1fIC,sHZe eo W""B";Ҭ)$H43ޜ)7ƺ$f@VZJ@ek'k $>? gߌ<1E+4 oNpDtjh"GP 9NmKJ^:S wN `Yכ`Tf& !"zR=[v| aO |@5g&rJ1UIE..[eڝ$NO.a2@D@Ʃipo+5>[7gK)̤1B tz1Lp  "iu\J*&eKR\~Jpev&*S qtfief7z]m H2hw n,RDt j*C߬'ձoY bphz{GHӮ]]9R'5{$p\6sCi*HY)0m"TQ@j5l"B/A+3'ğFU7TŐ7ŚO  0icXk,U|;S1I<]sZffes*"zvc/>'coo)SGB;Ԕa'p 8$E]"2pwD #Bw" W(asWOxs$c\x!;5l!]'QD2ŻDP=T{(}fj,y%8 ;Γجwp;w_]1{;0ړWAƩ@!)!H&ICݒjHu0"jMHu"Йx @1 a$~ !QBEgtWZ Hf5Q1Y$ݳYtC05@ d'Q 'Q6qQxrbBy:K΄8"@ s `~|sU}D /$09h4t I$0d&%!&prNPpu 'XyX Q aLYCǜ %:F X"a;2wq075&CR'I '@LIݳ$gXL ` `oТETM̜a89H:NCSdL:C:zq@!A|`CR1]Yhr( 0l3[C 9ڌV(9r` 2/ïG^^j0 nPph)?iL4Mz[̋;dG*ݧ2#&6<ѵ;gq?U RFs餄 P}|2S,;GOL䄟t ! 4 d< $$3qsֱAo&`-0 CY&!l,@l$16uIsnNܐ@ {i昈d(faﺨ%ƌ*05ҪYP۸q3yleP{ A%`jCAddhe$X#%nfIH 63i2#{O>ÝoYQE-% :F/sMo e1 I o$(Hx4n,Yo"eDTSCGd;@R+lța6ŲI1Qۭ@^*̲w'@# ˉQ#,xn ? #d3,>:H">]|u'辞JjD) $I!|!Q$ԾL*2h<t1EVbE9R H!oꘌdLT-m Q`vʩZRTQX_64"F[pnutٶS4[sZ{tC$f lu5s!Fb&rroIPD"Ȇ2bHd-<$daO|z`y]BBӀ0?q\,F3ža_2iЇk\$ B$LrW89l6tG};}yj9 SK"sR.&%O#GZx'z!' 06ȷIOQu۾ 9w !@ڽF-1&Y,XQaNza49/pcoLWV9Lu]2.\"*&$m"4mXHlP`nwم=\o \D[ i[qs1?>JR^>`1L:0X&((mȔBu9/gY$\o@[ɈidFPMX %c!a +( ZADDbdK_\:CL&߷=5|'dMX1:m" VKhT1%B01 P0!w) XhУZBHflMx36,Ӊ3:e^BtCD0T KĔ>L%9ex@  syEQaD坟3>`TM'JaV$4E:NWPLe-&`!T eH?m66S(кAC5fs(70?Ɋ,0Pc \-Y X$!Y3(BMP-JX2Q(XXBd6Vc+ QШDvȰ1&\h!cťDk&(Qd q,  ONI&u% ERR"a$㙩>uy )FD` $dbH 1@T;ru@h0a%EdY`Y$PEA"WjdŊvІf7}WN}8W E:ۖu5NSӥi4 4 ]BуM˗g[s }"8V?'Y!p&I7BϘ#nӱ[[k@PcPi $%/~)a$ԉHrU~~!^( 0/0Te_}P#4#]3"xƠIEgӡT ({kH| ~*,k!X (NMϭ5AtpӬD,+:3P"TP{%]]R왣`8/akhUKc2*NO=M}<2(HyZa);HW"[dr7}צlF> x T>L8`~m;ݽRg:| JruVHv/Au IVn3}<%/ 眒6}'d;']Š [/{gֽajfٓ*Pb/C`lz5I#YT%njɾ4_cmᄊ7O՝ ͣJG9GAt`%!_˸K!%r,<$.@Zdc]UVg&DG[ݤ@pjspMG:N"@+7\NDVo${P;#W,*WT bN]bN{NT:f)mC \ ~(89A ]3V>>DcYSt:M\'<%thF³IhV}aңwkkxD(-;Ndg1Žկ]V?dk0i49g2K ]m6U98Fs=7D {c-N%:g5Y=TG)E @`ލAtn ?Y+ܸ+Ɲ4l#G5Fˮ?;+4=o3EjoJzVVԤ982"Jr=ps].>FWK#υO$;1wߞmVmF 1#v:Az )'7lMtnӞӸʦO~ ʾŗwYm=u xg,&,]i6xĉ# bF*@P6\w}vkSA %oa/wHP [wӥ;0*xr2BH U5ZKɒh-0rDȁ$`'|NHIm1Hl@m0i&`BYs*v`,1F Y^p iBU7YݦLLMBȫFIwB=aNy=XM @AE\DXf2H''$$uMezTmpaak Ai :I#$AI@>1A&Bw kiIaS0@Aj k-f~- @ZCAT*`tDf6bU!*J*!*jrR(L,%˜ mJdAjd%MZ֬Whm2Hda@R0ɰC`!ѕf}n=ջ+ _[1 < >bcN|ӧ__#ߠ}h]y2j>lܐHj}Yi̞J< )r:cl/0M,)ZIFwEBB I@PaH##"I@z_5R@& $iċq\G977ƄⰊ Auy}{J(C`-А4&Pv4cRFKNFx zC%bS$y ya e b =HaC\OZ8a%TE01߁%L""A!&BBq|z\u ͗5x^\>NETHt+Nuݤq? eyb/.TsV>s*z~{Pك[d;Y4?<󤈌xx"/ SS] Y4-%w1^d/1SD4F}it $C> KNŁүGN~9ɕG{3)3& ^yWR kJ*UN6 <$/͘at4'ՑTlG1 Ÿ l8EϰfZQ|z]okL=7V0GS!o_<'Y5q{MoOEO'焋Tw) \3-s&Y?%4%|.CW^ wSܗnܻ$I[@m몠mCYM2EM8fe4̂&_:4S(A']OxwjDOCh=Oo1Vf3^oەPcӑo}_ů>օY@!|rIXI+f2bC4$>*6{ ]6?S]XnZ8iwh|sMM(Zo6 [Q|RkF~F!\Ҩd ٰXbU:<`*Gm ~z,gb5x}j5m If1=]c;<葖.qO X1S= shn< =H{Yڸ,OYrؠiQkFX7zg՘^ILuH rUz#T!pC9k<*|acuXWȧduQSaR¹Sg ŞB|J~!˜y6KUe&cOYh>px@jѻYiD*?x4}U랐/)?[, 𸈫RnLz{Vw\dUVw8saW5 a7-uʯפbt *O+R1Şm#JrF,`6SvG"^E Vd1*z[İOUE LD`dƯ|'Ը4:-=* ,e`oZоGhg xGD hM\XI X vs ldBkb"t='vȰfѦلOR6jR9ͪ@k*ɀ6?SC/Y9lmY c <0D dON(,A"M6vu_u; ƘBllHܦ=/B3iQ=sS^}}SCSƄH*!( d#i(dl|DoJy낾l;KLܭd|o^]uA|\#;zSaC' pH7ӽ_:ߙJGnLu9fYTC ٌ$[[ܛ4Eh%XSFr:plw[.2ƒ6cge)15gsЭ7mAjr*?l),xYeUXHaLsH=^J?} 6/~ I[ohI*vCg{DS>Ȇe >CCG奮)>h^N [3qAijsDlc_;>OI~^M0? <ϾҦIHi!B`BHi$@đ4"J_s}N}OmȒd '0^5G\Ah3|f$˃m6z|YTwmx9k!#'&u! 1=~_u_ȭp(qtap+(Cd$aX"F ~A ‚XĊD$F -hE1R%B(*RU"$H(V*T|69ۯٸa_sr<jF˘0yB.5}*)D)TK ]~MmrDZ0|d:-1[P 'P5;5DKQ^:AvNO݃+4vn ǂ=<\CX͏jIyHL7s-IPm0KL3]#S #8ޜ *p;Ԥ /8z;`VIsm Tm@9ߣ-a`c򞀀@sd76"}Ab1BVz{Oay#{t oTiido賰F qwB&u VFY1XP 3&&5JhtiSB~twv*[b\}MIّ#%;9lBx~j\$ zSY`~ĘQwu\G2M1g(^GQiwAņG`֨6劍EJ##ژ vj6'(,)ԜXPҁjfo_ Xˣʗ:2uEռD2cx}n-/W lU+!ՙṡ0r?o "=G|܅>sC=<{_%;<I|鳔inB\vokrx`^nWTXO>hHN(Yژ d;Wބc0o#%B9\Du`20=rޜcKJMFu,MKd?Кuǒ2p<2Pd`/Chu{3%Mˍti9>9ڧ4*f:QWMȄ9HOТ"vvr+Y)lɦVT2)Ml_5zr: zw?3^5NeB[! 'eB̮WVɀ)$ ?v4wݍB=,%€!~uҴJ&c|.}>~/b\P ,@AW-4mÆ(F}^BE-ƆOjśP BDVltHQ;XD,cOnnwv#k-ץ>ZFѳvl 5L,S3GA9 llh~j4wڎ$%.t6~9.^}=5Ä۵G°me`6o`q1dɈnm&ˍdL)1OΈk c12:LJi_x dF8X> [@ :BҠZ~ (Tӧirc ;4o-|'lrRH~t&6+]$֪Oms^oH@CFPm{+! $P ӿx $O ɥ"bN LAgw[7ɱ;?W1j5E/&$dF>,I)Vöwٳw0{< ^%snދ/+/4k[mlTٱ0sȀ#Ojr~24fh5K Lֆۖ&n n>N눠Kؼrޟ&MNѸl^_-1M(9_?y;hiAPV3F3jF1qd)dK{?E\/ $6Z:e.rBQVg(,A 䬵-R"8ʊPԸW)F4]:$7A쪚YMNnaFW3hp5jc DyAyз#(獋h?TqnivQd8,vPĉ)l_=l,5yL5L-5۱We7%քĞƴ57d5c#'m]Cb⿴e5J/<@ O#֪O(L@(orFÜD3c--?m<3|/q&a1LwyRx@eA^pwi~VqH[ Ha^=5]p] >uΆ'HzEef2ȩ-A sqQYD1E%-%"JH|a(m9Uٔ+pk$uNg'8Ҋ"~TWlg#mWg=8[KnXJ{ۂp7nVA@$n" E X̆i3~ I:gp:!^0ϵܴQF,V~yy_["#>k %%.I+bj\ -!Q\"svg "9<4/'F|g\DJXH&|UWBͻg(n=H e# "yS#}-_oq[$d}B d g )676hrJj?!X PRN(",W}Zj}%V 3xrl  Gx$BMHsHDJT-([}mUd}9,:[Jc-0QoN6 w)i$vlI@#0AAY2Ȅd`E! H !6ٻgiڲ1ow^YHd lI ԦD$VhJ gwЄ0tt@LH5(;|E,bФ_Q-9oD!JE-bsX;֌0u>kҥ%롺rփa9ӧB<ʢΞS5O0ٔ*E23Gy+i1Y7q;X [GGn.oiqIGVL%i*Ur*p:`N$<{XO;L:`& Kg݋0Vr`jf&T6.nsoݺW+?4'w-b?Ͼ7cؠX+G%.Q 5W@NxS &g%,&dF:wxG0Q_va6 ĮbߜC6ǼM'hGʬ4YN|( O{F],E);8oahH~N"Ү=9홫k17F,;^Cm!) qۄVΰҨ*<дD`ɏ{αgwRP-%p?G)!GL`[Ěd/-<j ѹg}䍘L^{=lRu'EKK3gf1XlfJX=5!: J5ķe̹5 }mѿ9diy14!d]6.w T;=^5?>si3FAcIp-=0^|>ͮeskepZs2>ެ-QCrxA2*B7R@J`)2ՒH`U<}M0<~̗X-q%pu{5[5\>%ww-tJ"#6ziVHYiINޢ ұ3n{flzb9yC]=Q`HA1j!~,Y$2ߤ* qZGP SP_q':l7Rֲ{b)OkɝB] # BXt@!hxw#{X?kVܲV&rV*I]Zz)?si9=CY\) ވ ŝQ jR}EP{ @~Y8d+}:+D2E֍_w-^ļo#@fY>`쁨k|iD󖄀* %|?w "ƣ>SD砧7!({--2q*6>V|F17V!hMW+JyWy+69I4jsV)siTPKHy %Y̠HD&HH,(`03p5zb*U¾uSS=ĠSН҅ʱ{Eߓ\$[z kטQ_ d[Y:))ޟQ_+c~[ٱ lX@W}V}_wy9[C& Z e ˜@Z'cvG[]ijl>|JC4`MOvlNIX<7VjsTuI(N8)-+)rav"U!oI=VZ gz_iBz}c٥85H7 Yj”Vb.6&2c !QYz|A\4Jsp!N[2oDXH7}-4_ uMY_ Jf ;6@xav;W赪~ٹndA;hkĶ=A*DrBKW` ,2a_ -d+f^Y4$I1~gO2yK4 $` hP "0?",* d!C}?YhzTtw'CԱ%9;8 Cy83I3a D*gtKHݥ#n"܂\C8ƿk8ی<VCgvS:*mUCBSSHFIc-7bE NKUh:Y^4PP _6ᄾZgU_#\TMQgiܸIQzj#ƷW P@mRbU-sد)Ia|%'#8^ϖ:A#k*[ᑢG\?mhJ0&:EJ o:ʹ^t LFtH1󰷋~``gif"+ڷ9˅9g5wVGj~V-\a b?=XDA,md(Z% :`X,F f #&Zɐ@0sDp`DOƇWG~x㤷nV>MQa3|gzb @7g5{kwjƺq<}Ŧz .%HvOpN?%LCNF /ީL׬ t1B#u]Rf=P<_r b0-+ Py[.!"iMI-A ?~~eIU!A0)!U _4+$ׇk7[s|o۸ 3Cڭ%: | Iw.E5M_/EOͰy4KE\ 0xQ})t tb ~e@v\.o>[oYc&Ad~į"ΝɊjLPQ"9ީ&7DCwsDMK_x:0e䅶lG2T֎ax Kc] `ij!zӎʖjOPЩ)nEq $_8"ns +&)slwv5!x_ M=K|FƖHakk5Pmg11|L*~ĸCXcc+uo򚯈ryDY{OP5L> r0D28o.ڿf0-c$O>P2;>UallWOI)L!:HX]!* P`[*2M6k^QkwnRIbUeq[dM1Bns<5`'H`qBwK=reúp[U#ӽ6SN 97F7b$4h!5; p5iJ3hF/1ktNlT^WƹaS:=j\J "J񟮘9=&[`Z',%3YnrZ z8W~ uf}K2PcӘ)gbxy*Л|ZhkNGn?_O(0i rF |/ɖQ3F>eSs$ 9 "3X/*f'Vh 8ԕi 5܅@i^ Uy!.I3,`~*J0qY$(mUf+uLY j<`ea5UGi*mUyZ oŌ^}:"$4 8s)woMkO Z$c.DSfov }8V*DUDPE{ou+ >Q0ݭ&rƽi>¶m$:UbpՉ3 FUuOpM\.{uxLէ9 ߪ,IpIUjˊ -r@vo,:bԣ 1IΎ螼EI W 6H.>& !_|ۖ;”ľI(^l/o ~ZYc pLH@\ Z$;F>*Tx=0̙|cL6xn57j[]`[0Np5&VMT/tĖN)go?[ ՏF6w IDS+:#1 !|:;b N̻k^ZVnWmiJ˥%Xμ˓YsüJk/DBZcǦW. u{p?*l%Kv6qT^B788%u ў Lw6X7X8b)d1ǟ vSzuיִ !unX.f905+Pa_y.ٌ071k#04r7۹EmxF|<;3g@m E ū(+-s=͐_;cr؟ LU;`jo̧WmHhW_nH'QXc:R{!.IVC}!*vo+`=/6Ȑeyl sh_l-~J2R҅2>,AԦ~V7JA6MHj[ T1)2ZU:d\xGniAtNu5IV4~l el#I_62SZ\%o|M4q㼑Hm QRuK2Zj=A&ɿ30BV:OٺBߡbҗFALp׬|4 V5Z1\q{:A̡0g4׻TT ~!{Hi__ :lmSPv/r* fHgtvY%'۶gQjhtg GC.3<ԲővnORپc!'P#ew޽3# t7a^U풥{_8Y% ] $20,f:3BEkĀ9^/0ڬBd5\** ^7 I?luWhKY>4<|֓`ٷ3Y}yTL֒ޟ6\ 1_DМ` Ԏ{94o| W3s w(&C~L!oM#ؚ9x647^9SPBsa8 ul"qI;޺_l#&|3Wp6V^,SS\>&6dc6f#`%+=3L<|z}K!dzW˜ccܵP6b V[~ȃ/'eH|u[4#G![2('.2R$8lwS t8f7nA6ɵedRz&h28_HP lG@?l}6J^2%Ibk>Y+]M0bN *hBhTB'h w~k \;.ú{8qŗ}̫! aMlO }>v:f4?M)BIRle4Cͣ+H |/ U{|B"OZgH aއ䧟ljvz:_< ln+4dFFdD聪zu藣3䯪.LȾc 譞NZa\m |R_AD@iZ9ySh"*lij-|k``tnk )cwbαViV6 7R]#cH!+jqg!9Dr}|36G!<<,_U &bO2Z+a=DL][LCp]剿k6|>RФkV>d6GM Nm)a5zѡRT`Ё;\VUU",k_~ډ(e jB=5S!PnJ ոbr ݚN*@(6RbLpQ#}RK OළүZ I.>,/w;H(ycj`AN߾G&z5u 6ĠPyʹ.^s0|%,3O7T@ y[Oy1lwLϹVSny~퓠4'ܬKO#~a4a N5bPF>0؃ 2s.9ltc֋dMl)8HgfEH=imvxx#@ ΁rJ4V6ሯ6Ije+'dAeU%7dnbQpl. "}QvݣL'i&H0$!<FPm'֎zM6U ! JI>BI*[ӄɮ:U6(*i9)lzp]9eX e)?;ZU^TPx;*\VAmXyB<)OꁸgkFU89+Lt5H*Cm0QքSha@%_+zN|) C^k($M+m{E egNQo.B}Mx~z  8bY6cO|7? 8eCJzH!͛#=m*0~8 B4\(`5 ޒ=E)5G*i{35gUDY|#dA*'%B*oi!Or }G4Bg;K;*CN\+TX_e V[*k3?X8)*.W6 Ԥi{! Nh\JYU1T+,:F!Z>~ӫ&i|ڪho,W5><]#s.i{.vw0 n'fHo /pK*v.$󥌃ޏ;kۤKC!1䵾?qR$O?^(SfˤbŮkᰍ0 5s>  $ J}Fm&T̴@ZW[ ,5PSF[^TP"䆶p?E aAc!T$>/Aj'f'?Id&|I U*~ ~sFrqOW_CXow٦[Vؽyz:aoɞH/`1;xP.= őBJKt l V~w5;ʪ' }$}Հ+Ќh&v?bV& m7PI/2\}!J_@޸BU_mV'Mݻa"6tsȇt9g]9Qv4 &ۆxRTpG{%LfΩ 7+>eUO`ڸ-l T.N2XmPP5.cՆ|/ەz}d B}A ,ѯ[sC|V/RNT&LtW zwZ72"PxIJE$Y*bavJ6#$W&+`+Ĥ1ܴ2:x`t=۟<b;3CeLC[.Ϥ o~@~'h$ gDrLS3䋨zdky<`0*J ޠtNs30pz9^ci{orGrFc9S*ȋ}!]o,u6(A&F_#zklC! J\F d OK>3 KnI@g:PKׅOd:fW`m@aLk!Iх>^N'ݍY5P:8!əIJ8` 9:cJ$bJdH zdQ_?'ڇ?w۱t\g>חU֌I(_[GLc )V,3jj"YV ~vfRt> q cWU:ۯcV\a=#'{!8߳L LӺ ҡ9WD)9?^Dry&DAbլіu ͟Ό{H 8V܍f]LtaLq@1OwS,gi ɊԋIxD?u.Aǰ(VHhOoĆ&{dwb>ʱ >Xj~tjX41{S}L_ΌK!{QI4ZRZF':->NoYQy]e2bv3G/fVA@\KLa)Uc:M"4"G#/P4sX0>|nv#?+d\`"ݿ|\ʛIFݽ/^/}*5ӁD/6xgmK3%_8 îOQ ibV!ZOb}ꢂ,]5yZ]A%-8tmd%i͢S/%C7VZ*H[{߄i Wyu۲yrtA1;&XM>Mm=( ~ ./%)A;0 Pt|& ǯ?d`AG;odHRq+u_VhnOfGN9G@C8ss@(~TO,.(`Ăz E_R]G˗ b.ǽ~}e[,&gTe?=߱_ I,G5ž6Fkџud8\d'Sme*k첡9GfbEp)z5FD@4CjSz * 3!6fN.+RV3RCڧTO?#s<7B?uV 1ZǎaoձqD8K7iGtX#XAt4iyDJ#uW%N,Oh3fo &'Sk(mZ+W;Ers+]1[:f؅ڔu"ƿ,PeA7s`Ӿa'e6դ7ai٬bY1.T~v ?Y )]/ŷM6%8ibITF3!ly86 mFz(||%w $ .pX&4H1?+߫[I {A5#:򘀛2Uin@xs9X'$} ?i"QX+F]ͣu74u&c%VTBV:UiyМ B&-K%?|O|yJ^js7RE.V0/.4T!%W QN@CZfҭf۸;6rŭ|mM705e!->[kj(ʗ#(!|pL$w`]+r0\6ܞ=֕Jg<F( gV.Sf(Dey|Y? αoV34 +knEEԍYSݙ@hL@0ꆻQ:5Z)R@0= ī4 S͌:vZGK4^oUceil+wVXr@}Ц@`$ۆi3)6Y.Y?4dqZ'00/mׇTq`/6%t!Ԁ`ZK?r!j8dҐ~]E !岑&h)5<dž:XWZ0&8;|KƶfShmwyʽȈ{`ȭVBǣǒR&kY1a9t=(u4owVuM29 aEg;@V44Ww~s݀pCr#a~Ca//89)H6%t2koA3_ C@>۾gFoФ8 [⟗JO>jLWD(+٪,eҊ2ިa?V^Sy[6{]aH@3aǛ5WǢOpСs?.Z(IShTo.s^3ُrEvtH4jȚmпGiiPk`^tt %v7Of h:9⼜؉G}luNB?5B wm*F* m\qn bbAhi7]r=!e_~Lx#çy?Wsٽ+,$bU>0P/| {S3g_wiK Ѧ tX5aCP^?䟺 W=;>/ ԅd!H1xcI+J6W %}ۆ?m]d޴1tARhU i- ^G<|`(žQ\hhO}W "$f5F@oP;${^;2Mr-AM|rZ>ToXHw/KN|4gJ^p*]m T#{CqeΡ\4P7!Yah2ZAMV}N-:a 6Rq 1})bll5'm9O$qDuF_˕M5)dShB(JYȋ' gXqx0.47]TF^Ytz߃ɘbʣ.=v`Bu6@VG&(NJʣ B1]]lv21׮ ۿIL{֐"`8&ɘu?H}t2N=3'(hKtGe91>=_-1Bs!1v,AsT <;v/CɁbBZzu͓6#^T,Em+ Oe~ q7`:Tx#dvbX )ɓ٣N`P bY-ODsa>&2e+"ye -X%0xKv,GÕk꿙c𿶎T%B4g3UdȶΐE3}j UXPo蔪1V*wH8XSF."?( vôT&ueЄ$)fn:S /:;֥y.ͿP)ԎuEɏeLqN=[s+ˌp^'f?#NP;Rdxq֘=UӇA!TyIs`Vm(ˊ.(KMx Po.֔UlgY΃Arc<siAcNg҄Ow.%;q UeuaX{g(KF. S+ az :R+J6mIM\u(y A$n!iQм۶uw2 7% ✠87s|S&e(o*l"JjEg>sR݊82ؤ R RVxJ)n8?@BxU=MB[`t"p"A/*ZjW%[ NoI-‰Bt<^߱(΋ fVMn B~9> UYy&Yc=|#ޜ;\^{.29p9sVE;H..;lWUtSMz^j!q&jb *]#jԾź?.;z ,$b[ $2!qke|N(b:L"K[p 鈅K-cn)9խـ0㊕m*1:on*C.J]v'$D^0WJ7YR'ZCQfܓcZ: ُFh.M@UST6VM{G:XJAH5UqCyokO\9IiNEc|jKm[[3QM 6?@ iJ6:Y^_|S^!s*ʞ/;ccsâ64B(-^j4&HZ̀dO=qK&ۮs .zw`xgTOcnCvIW\ݹqs__:[&?nx"&O :Q=ORrA `'yZ!SVHUr׉Y\Ó$^|4[ 8F*`K `k.IŹ3BuiDoR{>σ>3ZQ@ ]a[*5kMY0g]ʦ{4T>:qu8h=N*SPV0=HC{c1\)e\{0ƛ~aIv7)nbc(SO7"x?j1/=4N3chszE \Fk;+vUz ];}Zo$I90r{Zy h-dK /w0&1&paW'en؜_̉ze #7RfrOr['fF$Eq!Homڥڄ>KpكJi[\oU3(CFG6;džPTY\R5}_OMK޽ 0}@=х@j]ASC8r%} sTLm17U><G4ME6Fz!"U|au@עG=Ypewc쮄t-"fg*~\)o׳v}!vV>l ^]. n'4PQæʂ֪ cHaA_\y,v鮕; bys(CKg~ ?vwb,IO(g#!Fƨ?#a](`p|T $ **Q[;H=$"DS1CsG}MAc->}*0nY~XNGIkzTS=r=͟9(8t ,ѣ \tcu_na.}r| /+百HZz.K(httiKW'ঞ24]' \1E d3] Gjm#s-(q3aOX+ 'j+wy@^J20JqUҙSaB_~a:QR}*O|u z~VqN_UClE&}cBc]= p$Bo%Vxo(Ʋ!?yԁmHAp) "+>~X-AٹVb"I{X2>鱊ۢBwxw\5F{fFǰ>b/ JTnA+3h+ɢÔlTCL)8̯^Դ%dN;yJ3Aqy& >ͯK؝U|Kwlʱ$;1>R|F ;՞]9r'@ [J&*BZskf]PpX!j"$G vvĤ>gఇ$z9b2=&$ KlΧƂBTj_^&TW.B"ޚlC#]:M!q4? xq`}bRzI)ދ-xy^]lPrÏѠ}I8!!4EY0h.ϻo 09T3[Ꙃl4l[S|酚v! d_5-M~VI۳/cX!g~% Z o-GKYcHٌ۪n Zu)\2v^_8sR?GSLw,~ ԃ*.uTCIu wKĖI% Dbj˲96Nc H%?OlH',Rxlγxq7eN"?kce9<.w3*6 ;'3Ȥslق,F+z,(}1iivHR]"abzl$?{K~m+ z^+ 6 e.Nź+8pcH+.;" I-ݷ|xiM$$s< 9]ZAe9h6w5YHMr!cphi,Z_iZ-. 朽 %Gp` Awgl57Vc3:xBY#S]+Dj5$FҬRbZ<<@CrD&z6+WQ{m7Ě?*Xr"qݓf`@f -lp!l)"$USq/-ge8ѺX9=i3j_RD }k{'`mp+vXW>]Zq)V(ѻ@#/㓰HiM*ԼZ84 :Ǔd6}v] '~mCM9'L|~NC=3xzxE{M z38lr=3 k=h{Ad7@8Jo{tyyǷs@ۈۺDNiAIVs񟄸d벑L6bc4lŎ_ܒ lDFBmb5@qg1ȇqQ_)G^?P{LolEo43es&UyA.\QB.ާiohrz*'HZHB#c޿񊾍 aA:{g {,$dX![iK`6[6@iMb%VgU\f W"MbK-&()<&.w6lxw{B ʴR.XCxStmpBaZ`5 n}=S-AME`ILzXF+^SVBV{7A12xhAB`Ԓ&*2v}TE.cs4_|R(*"Xѷ2olͱnczZE5/ޡ֚BOo L_^xAfvb,oNaܷ d+=sFQ8Wmɑ(!,+O[Bwdl~d3Oe}MB`n9ri=< "4Mjڴ+t7)dA>v)θms"=,W[o#rÂ>ffx =J_1uX|,S"ul$KL1Ǜس _?zWu dnD Cu#(Q(-[d2"Bg&@TdvaIv ?gٽ"6.>`C+lY8[A #"9!Ht"NxE6%Mܛ>Vx;DJrҨ@"[|Ô͌5W#AY}+nҏ;_.ЪiZK f䑎1$^5+n՚M&p'3QGqOρ1ғcnqaX S R ‡ppA#ܭo}gA{ kz x6-%Gs#m'fw%7Sݐ?thOgn`#uFU/Ju\ S'۰Af8خ=V?$f%+zĴ]pVnf@OCs! Rو{<$oЧ]јgf8 )!)رgy]vΏulcVJOPfʰ2J%M%RuwNK-hKBP_( oo~lrPskDKܚD_ F S;ZnI6(qϯQTPTz<-gEgɒDฉ`M-ZU3zk^oZ\ "q;qݐs^ 8{2H~=-,d1LQ04dD1;Wlp AT0P'F q սw,u\c!͇58Fзh%}v 4,Q.!k6rE2t(d?R<sWu%qm"ɫ}uW\k2σ׿azWEWؓv11&eL+0Ҥn6f[FN޷=],sVJ=!/ 59SR%QXىtwde!`|H|EsF|*MYSST5BLW$NP+ 6 =Bs<}`FBS4[5HAc4cljq(m a(?OVbI|_jBr/JxNIf7)0}pMUgJaQ'kPI.?vRM&<v<3+WK(?Ǒ3:{|~W]緲Շ-$O| vŨLNWSX4/}"2I>OklU@8*oc,EH\lק2aG:&%d2T@JAaЛ&\ْE VjtvBy\(-H xIm򌑮AEʯ};\(Cf(/I&?G '@M=[~bdq" [Vn-"th>P{ T|aaǸdG]Ƴ.;a\r5^i!]"ǥ3|ʝ^=۾Qr[5uΰ{ J-tt452!'MCս/%Yx8ȟO{_ƪa,*wAz+3i6j[Y V9ca%^iȴQ!E0'M1}Gk F600ǒC<""tG{z#)&U8ogaطZ۰PjO&ts0iN(jN3Kw&_ƖEټ{O j%mWdn؜sK=5?WA0ha <~~ fGG}-.$21gErKam֙ڏ'32H$qyA ׆ˏF!ߓ }TPBM62NQb F44v/INi؀JB"zp-];:ӧN;2lOTa52Jcn$}< ͰKGIv:T`:wIeLܟ+ f6;GR&~Ƹ}ԋwki 'u~qŸJ?T,[*mGp5D̯b:VSr*@ok:l[_Ƿ>3,GUD}` Jր[sn+fB\Ifje?J-k1IAm=×;j%]5kByMjU+|)~=m"A<+aT  u;# DuRrHǃ<\O~fa9q4H-;׊xc^}A b{:G`wme8WCj 7"&ЖS,y.>`Of?*f&܋=PmwcQ~Z;\4"dZ]zp3Ca{dڄy| 2Q 1#]jDo3b_{mLlS%cɵ}M S3dx d%G~AXӹ3i9ڬ pR!SigF. 퀶7rߋvJ]dDpHy,#[-amJ<IMpZ1uT?R/E.&NdKqp6&J qvRM^33:Zԧ>1LK.INvBFTO΁}]鵉+hDboʷbBmd4UI@UM=GT^[hEު2:A@%O}$onIO&xsˣєΔp}]6Y9%(y)sQ{#py󏿙OKսkuc鉿c,^ jGC{O/Zz-u&,NG&0E R;|ylVuvMHT)ֵXLE7WeuiVFniz&,0[$h> `!II,LixS DDf"s3\%ɠ2>\IzZ2{ѽfB}8hgO5]ŭhT!J#l{O>eK8dUf!QfANP">l\Z%R*-)E$;<ӵ6Ε^:?v,0ԯ!+\`q7TG㧐Hwge4H~s"懴7!1;T]Gy2p/c8@ooY(nY :'>xQC=g:1;NI~!ܴXƖd#,E"jr\! K rd̏~&6,7u+%WG2W.!r˘/$wDu .^Ox7;/nI[nh j`lO}>9ɯ!Ew+* LY<il1~ijag^аm1T D]L̢M ==AGSj#.RJ|e+oJ7!O=-` = OXjE+Qg;]@Kb66>s7սw=.4܃JJa8gɿh~x,|O pzvsJa@Ie䶝7iҪ<*0gIdLL:1El@ktp~J%ʭsN~UAn_q3A7XD%Hdŭ6DF z6pA !@?cb,p{$_/XF3fQQV(wo%sE %TANJ\yU$r$G뵯*Xc~-AAuhZ0K%AQMsoc[<*tS⯍ȝ;aLXA=k2IIa5dT*5ӝ#2&0[8DQAxϐ47F߆Q)95S̷z!dϕHԺa_Y6pwpFtL&NOs[R=$́7ojkz#?y/` 0yPg̹F~ '[p'$o IstvsXքO& Um0uY_ز;ufUriI 8Hkw.zf&~&6ߺ3xSiהݮH2I&teA$ F"IٌZT+4SF{״m5=4],(-VQ58Hl[o-%B~[C`fsқڿcym& DBH+-0;NtNx)_Wpځ[lqE5$}L=05Qd/2-RZXQ0 2={;I&WЕu^5! :NA)4Ǖ:L^)PIILȝI^;E|tl$^h4kq[Az-NXR*} F'A?RumWaTN&{Eӛ'H8KHVWtƊd|0_9?`YNAY/5Gnq>ށ)fY/nÆWRΎN/LUYnٹq"xS6|A`}-Vx^g>:"suUtF n/Fs-}afF0oplB.׷^If_Ged^:E*{?on"0!f-Xq)>LiMo0dtRǻޢ+oZ NJ^l.jE5+IN !(J qfDf9H3=8@tF[/J3$܉B)KtЧowm)@2lmmq5]pLՑږeQ}[WKeJaX2O ED4RDk-k캒Bs Nlj:t8:쨏_ݞj #rS2¿Wa߈G_s1j~w]q=9V@W1TEV0HLmOEdYL]^qĥb$??ƛrZa._0Җ$:`"7E|܎#isS-3osBj?☣*;PJØaʲKvG?A\U }qxiK"'^\"+|V& BXR{}ǯ.lb)ݨ\sj"]YW!¬G?5*NH ~ܒ=5>U,}o_x7%{N=zR(CEx~ƒq!jz5ЌJDcU7߀&L~}).VI h+nvJ{(ރgvݦFoʊhpEQyG+/Ye1pQ]}(LEs/I Y6SC,n.3OU'֡:@Ť{s ڴJ A<^})I( ,ޮɷ\(;.y}6;촷`öf*zXtO6Vs.e-eVAgf&2A{/ $)s"?ѿ -_~dF*hչ=p̑Fޚ~![$l$}_Y켝ɋ5qAFlB F)wl4KUalԩt" 4qN|n3Āb|qk;e, jS7# dRSE'XO^wq lηUq7Ō ռYHp|,:dVc-RHaųՂD:g US):ׇ-U FI%TQc TNĚ=šT: ̢+w~8Rc}, FT0}֐jD6dKsQ@ /k+UW9{ȉՊz5X1g#w]Ypˢ$<[gL1H9u۪/[Y:C:?O!p6?\ ]#cm1ʢVWD <Z7=j΃]rv[!\\!yAN~{R (x`~oMyIZG!aӄoܷѬAS%W41dؚAqy4{c8?>>IY)_\INVr;-t:*r]T?`aX"2<ܟia).#\MH^u aqIrdtp'(a(ɂ6P3#v./&>T$(P^`T2W .q/hhv.A'1%aq='j Yt+\7FoɩM'A 5_"I |p惁I<`9]ТSs_lڱўǦXSy,aHFXwOTZ[DrԵ0s!4`8r tyV%ܾڛ-BքɉJ< 6>WF0=fUI'{LȚTY2{cSX⷟ W)-e~٪>N:l[ vDǧ?g8$rX# JA> nG^/h`X\ f˘q mSu L-=|Q+PwsQPmƿ@ͱ\7jvšJW&>8Z;`ry$ʦid032f%ױ2R 7HPv*`6ѫ/00\p'$ټLh>1*{7XP=߼t4,yWãSIL5!cdƶRj[hoX^Lˍ+2<)r^OPVApuyP[q8AҀS Mk[rΜhΤѫAGQ͍#p&åޱ!յbbM5 YMq# _ V>S{| )DBƌT޽w My ֦#. (c [F F+iЃ/]3[4{)N٩ &Cvއư]6X_Vb!SN&&Qp½d- QKMqo%aWYhP=K紓! ͐+f b/ᇁOA܌-jH7+wdhnfODZek-y% hbŕ^,ِqU_X= 6:^fk$g)&*&.ۿ70ѳ'&@)uvI}fִC~%:H,کYjDd7=H|@^Qw1%ô^WdY”oqkmNA{|Z/ѤCI(8*ٓ/i-jⰼ{v,lWuӫ٣(1հTOͰ9 &8OB ϶c*VXս~HH$}Zr\tA@||\"X<>IK%Y3¸b[2F,׽KdTR$ƅ-=.Fx4vׁBaDv4bM ҭSCR*:ٜфu^"aqGФ1e3ܗ/g-{\{nEwLf1=EXb[Ig"I$On=uh.U^h$_MiSA}KqC{Ե5fG9|DsGX5jwz주!D2%,U~ɚ]0:2 4{.mF^hCDAuQnBD57&mv^Q놓O#?*'2 s!$uX8IPAw)ɁgŲW5_be 7%A đt o9R0xF3%Q|%,XрxvzI}j[Cl0eL}~U/P %za ޕICY3Юr|ڃϫPށ!ʪrMFQJSksx -%ERW)ӏ񡷋[( [ă2r *bX79J̍f%}PyΒ¦1Av)&U/]n&*^6 [$=sp1yԏPBo1l?^9ly_X*)gδF4.Sق~<۵Zܻ-3]S,t2,!&渽˝:Z1215xî, =w/`܅2X;n=,S>![=̪s?F8sa2S&X ?[ ~>?ĂzI$t5ј~Z:ҹ(釢MAR9QJ:2DwR͸z/(aZb}"=0hC2!3n.'I @ASp͐"~_(_䴲G=WkTWEh5 H naqk'IbH3)n]vS.[;)7Y'X-* .;f4Jts;Pdv`ڻRw8J0$rkyE89cðܳi*Zl%]0^i0_:kn:}-JV5ls+"mFzqKBc.˷~u%Io;n=cPCa"s Q[fdx /EQn͈mPLj6-)".MEM;Ē4Ԋ9 kOS!Isn ?x$q4m0'u20hRXzd@,N][AP^g6w/R'.+xdFU):cV [a.$M<)E[mu#UJR /:0wo83|\3RGUj̭Ub~tVy/]=O?{)",$QX%<@kUzu/hI~~Ji!,i`g$-n9B6G ROtA^a\\}t$1NXi18$!BVE0A JeJMsY~2q/K\ Ic}9%I#O*J%Ciz.8kSci]qόYVaцNrNhhC.i*BIXpQkV,xRq哷C\e5jEX(oM@=8tČ}W~^ɏ֐9'=TYw1t׭<,=[Ҵ)O^0cD<) *&)KiqsizW,{JCwmezG)8Yp hQ] Ox'q4 !uĕd^W+\B#~n,ƱnsQ0.̧x YPK c)1]sM›IoBp,e1:ikLX+;cJ&r7Wr/c] cu7U6tq4) XB[ qK~eٶԋܔNg:-KBk{??ND!1~\qG2Օ4HƢD<Rw'`&J (aUS먬4_y$Ks ե2RkRdzFQž}XzSd~'cx:@>jvPF.v3;SѶ6}c9QS{lߺp=0 YZKH?{neXC [=_*%Lȃ I.9b<ΫeX_]&`I~ ȖR?͏_ŭխMScqCK90xZDўpD'Ij 3tiJP=cHюXd1Ooӿ)TAxLğmQLˤLuhժQhPУᄙiH'Sq&rhyF;*Χ\KmE6 CD|SC+(@6nOS➕$KfC`Y0ts8&6m*l0"b+Q.3 2 +`@rp>4+Ԉ#IwH+)AN[*|̂ &][d>KJ7c ٰ9_~r%]ik^ ã{r-@e wPG52ٻĵPZ#5)4[#%+,pYaUdil&4̭,', o>Hw룝I*ؖ͠*uPU6^}s "b,-'rk&!!,tuqprWK8TYvszH{[!V_W,JxlM*B`근 2hO<(E՛ޭMp[͂5ެGR ,嶱ۮF6}+XݹQƖ ynͻ(8'K$"dҝZ7wx #ec#b;Viכ} /:_<"?8LpCk5&sZ +A0mRZ,yܼФz׿MqcZ}ء -`(1UK+qf#^?3ৎyWD#n,f.ӽv{ThnE=/% ZPN+P YbdIBb\x$ipkBĆ W+J0la$5{hI^ Na64g!ozIbťg*fa׏{Wm`W2l{ KM^FN'osd r1Ot 0TGO$)UX-g[}`gMt,da%-* kUBb5»(~coоKgzyPxNl3M+~>ÂrR*Z+~( QuSt ? ~e/$T8ƴ45ѐ/ݼg娓qr!pgڑאp%nBCRKy`yJasˇ.O'B{;VA221`OvRJWtnmPN: ̼an떎ʧ<{j]b}饇}ZGA"V 8C<Oڟ{ј~l}bcwUG?7,b-sm6ln*]l.ը}W@~Mr1{\c(>TȲ|o@+ 9Ǫ (¸ߥOsUjODŽvũ>h(OȎᘭސᗑCw*O%+M["0uߵk=\a? 5, ,ߘY70%G = "~L̫7 p)܊ŊR;aos}$׫@nwW͆ _VǙuդ>`QŞWԏr\K9̡@pz\xAGY9]&!ŋ-gfn3Am^'tAT>vmKgS8xixmÝEЛHȣ ^los^V@DMs6I{#k_v2t s.Cex qhT藙| CBvM;^فS1j 3^{g|a8\ĝSB#րQǯ?3Sc˳86I;Tܐ!gl,kϵ`l_Χ%HvUT| E,WƧM}t`p55Kkz(X\}}fQYH Z>&T GVPښ痶膘B84+yYV4b#5gٻ-2]T7 q>SAry-IC{Gκ6Ќq!_>4Gf{RxkwhQ9vd'b<#eJ1J@`/5fBO5rG\EHEHݫ뚴*~d)|b 1Qj BO.,F4%Sa!PE]:,8HJ4nEoƥ"UĮ5ežCi@lxRRMo_aTPXh.BOQucVm(d/f|j~(N93>dn}?,"2],<);dZ0L8S|P@lf+h$#_gŕ=E`4R/`-@շ|g(n<wc<@oߙ#.P"ݫfԻYxdmq^4'Bc@{A FT[ow\ o)u~-DEltih؉3żDW Zŏ/MlɿkNZBsvS='~iQÑrO⦛eSxa͓S`O&q!v~J>F7@@YlEg [΋PT֬>Ր$ƳpKR:r[LTs8Idsy0IƛlVS+fOK$] qi0!a~b n%_k׽k)ˠ ~om gog xk%i?y7j^2a.bE^BOЎOO -Jҋp $ B]H}) ݴ L~2׃塸<'lh@MЃ'_D 61o310h2C xnj51hh VȏсZ[C^4bT(R2+AZ*UvciLͦ L̗M:!8u+1g@ i\wވpwy(F4ITWKhs{&;TJ"v1[d(b gˀд*m;%^ŝ/]Qю㔆/($ M-x55ߙW:j|'"fYg'3_dح+C<ۨÃ_5\:H0iA s0% ?ַHq;* GCéB Vo֢H ~gȾPh6jJ7P(sQZ-\9\9*KO -pa&?i΅TU;nZt{,{qp+_ 8x}O Hx^P7fNXc{;͂--싊s#lt;I3ͬ"@l?+m;$.pXFo1jk٨F0&UZ]7\w!Hd^NNbwD ej.(hZ 1*)$*Eǜ+01fVY1@ 6COKZzC;ԿFcdpE`ߎ}|< AHTMNyh3؇o0t y +ӧ6]b y<f/+cum`È.gnۊ} oJ5M=^g9'4$s}If^OiˎFٺ y0fbS ;ixW<:RAGy&ׇ ~q|YcF61l$ 04]IrHQwN=U>V%aL ޅ%]6e^zJҍW]<ת1N$ Ʈ٧T2 " \$XH.wx75)[GҧOzno3.]3[oHU,x&J)"uI%J3 l >[ÛJI]&w=%:ї×.UrY~xBPz%>6*q{`^~?׋'HIdIL/uU 4<5{vgJ_TO5!qu`}ro7!@NSXYޥ[ڳ" ۉmb^+'9edb7s?]]dچ "!0Nx #C a8b40WױG׍}B{dY7%YYpR@bٳp`OkYp|4|]Ċok-sޮQ*d'/ 4+i1vl\qq l;}b2>\+? 1'[37oC8NrqT ۈnƑWEX^[";7k#ab_rAΨW\w\ggOi]YgVF<' 9\aD*?OGyX>.X˭pom'_FKT~'DA"%VѨt Eol΅F5J]%LfM/@^њhs'[4߆S|ŵ=+(ic5,!|LG3F *TӐ;*%ېYtOV%0$;pP97D|ǃ+T9iK͒$s%OL,LMb|qQxsLEq{-1`iV%Y¹ 0hg%ggq!T(3h'SiplJO8l)H 9b!66M*Ҝ"rU=9|Z~qݦ&fG >3hY,SMՊ}EQ [e"?f;,Xie =W ڲ7R/!tO-+4eyb%p+ ,?u_SKN'k]܍Oy եtw3%ۻZΌ84Dg+ME+RG.%W/P]/zP)ٞlRE3KA[FC}0'|1&A=R?t?Gk)ax -t A i]Jb r*>; EEHj')8!*eQٖĽr yDp{TfL`j֦e\B!"Z=j!tG,][1^~\V{1gm Vp%V0_B`Nsim#AJumc.א]&2`EAGHȀ/DTp@Q\yLz[<*Ha-qÙ^wS*R]XTH:0>*5s ڼ׹`asc Eha+D_Sī[;>Žr8 r>Ȁ,[Cۗ4O!y\$ uJ3V~Bv(厁.$O@5MoM3i[26dDOzTNl54SI W4*Լ?mZՖi797#.B(SW@8[?(I^AaR`}ņ@<+L\m?_0O]2_T̼ D¦ ZbIg%-?Ǿ@W[5BfX7cQ55sȲyrRj 9\3l8-0Vg}lN3/,iG!g΅e8Br&A|1 uJ-DuE h詳{dk~#پ.ph7gU8(x><:U"ir{ :¿mU?$fʃ{0VfaWnT:m^ KM!J푠J4qk#-f%FB)xcQM\em0k`$NkK]\ۢ/kѕɸ NО m%= R3NQӲUEB])j"8ȥIVSg[i ܕSE৽V[vd'W`Iw5"F½!HbPIQڠ*i0=N]zFq(H"\ՄaQ{ǻ&-66 ?q=O=R J > P Z|>??@Rr%hr)D?u]oWh$PW|?+]5.%KMjIJZ^FMN|ܨ.=bV2YJ i.& G<u = t3yFVAU EuHH@7PVY^7)^gi@B'w˰ihVIjm>Ge 4g4qCݺږI2Հ|hT3Ɲ Q`t%vb\Eu#G*Y?mEScУ`؝9/ ^v^͗3w?9[|l J,;mz髁Yp{YWwFL=Q\*?=(ͬ4@?;5jYcI:@Vi4OsxNԻ /J5 HJ]شnwхWa^p[h#Q~?m5)1x}J!XXs=npq:=q ޣ$G+6/iRr[p3<ViWv"Oj@rι y3pޜ:mȆ4+M Nl Yסfp^0#DsboEId_;$ɷN] M3g_QBy|N0Lxؕ.=zj$%d*<_Rb ЯN8$>"so=>{6!_WsJ.eSAv"Q^T.hJg|x2<># 6/,LAђ~Ai@QvOyRzչ_UE:jhT߹ `TA5MxC<329#Lh@'$ďaKL}!r5Ҿ$̕U|;ᅟ/9BUhԢAaNwg}:qw>Ҷ䏐IE^5ՒX '(Ouƌ(3*櫠=:kG&h S;IwUğ:$Wْ"c9H;`R d觘P4N+K1+^ E?OSk^1q<b9运$ FFi1f'z{Q<[ d]*FO0|v0HdrOPX|>-nK/&瞿Θy;+ijv=5(VBBʹ7N G_J՝C%$6;@}ƈzmdD=ůqI%`cYiy ran] ja8gSw[Vm"dDٮ[:D? 3~#k &rGLpPPN(x"!#n"ɿfSZ^k6#\pY} a˨JG谠cie^ uaCɨu 5Q2#m!dfKfh++Ry&6U5 =rr~3;3ؠм)~gS*{_Glj:(~aM{OYϮ2-}ǦWkNڢqMG7sVVU@g(NOL(Z?-@Zz|n8nNn Խsz<H6_."=!o8CIN(a  <ͲN^OMin Mɶ|Ʌ4F ,ۆJYr0\*Vu|yJ$G$>x+Ycqc`jLjRF#X9fiގO7*.xR΅0 mXUpe ⣞B(Vh9~|X¨Dc *& XЩq炨6wmC:h*RYRCS!9њx#uf|XzWC!@w0 vdE'v o-p ѰCƸ]/3mP|T0ڔ|Gαx#\IQp|GϛєN2"z~b7Nˀ9xN\MFT.<@x.%fV,S)e[`|k|g1K6;oc ւ'gTe }B f9mc(N?5T K =+Pl|]~S #d̯Hg(.b-.ԩ%;^Xܼm|T#9X4]gPVRvp`NN(f _tw8{o[?<( K)j6eC,)˼ Ew?`ª3 =!> Yl$+_D[@OeI0NLUˁ}^=H 20a=x_3X/fXC{l"XtmuJ̇!?fL7$VcΠMÚQvRv~eM8!T0\zIFeU>6'.~Ts*UɷEAƻZQkԍT; $v?#h7ҺNJY ;pGKl曌 [On6-̲X}gYGk2'KaЪ5 j}by,/uZvّ"OϒKt@Pr{W8^B<3٢xU'Ҋj;yp73*%&kH -+Ỷ4JjLb'(@ o75(/>zZBnC-eo ;h}GֆQc=4}BT&ڭ +TbF Q N oT@0{rk{Er<5$V0c}odO >_4 99>ݲBˢ4|qF<yGo׌|9[/,P6G]X3??N *iXBufOn,߿mVG55cB'Ls$DEg| V~l;w $y*{M?E@:3aƨ.j!"!3!qw #Hޭ>$zZg`ޚ[Lx\_ 6uX:4oӐ~︤5ʭm H8doQ;%^L\Θ:ϭ{b6&xUxltkn|+: ᤕ o;+>+jc|SH٪,5UH(o!'xm򗨈"`:>EN(Ly_WxaxճzQ,_=9;P([|15n:8#7 RDF=|y:<7d1n*$cL0ϵ}vmc,!“ I,.rr~Ca~Ea 4UA:j<!@.yk:~ʬU jcw(? ^IDL{N{`OP2)?penVk!~@81n,U;Q2N#@ϮgB|$9 YU-I.a ];|`<ᶕz#ܱ*sI;bɤJd&"yBpŠ*tɴaB1LRտAkooxH=05qφo@N4mD8;؀AsHI'LTpTOea<y0[׃ꪫOsM.n2>ijR.jF'9FarЍf<4G E`7{z?vr iaX N̰o68CW+r0P{a$7b=*԰^d^# (}`ȜO=a0S[AK7uWQw1Tݭd1)вs\uGY,RF{B~(Mlݙ~x4/WuAb7>1F?klxOTL:kzHkYpbQ׉Pl/MO!MsII@eM-6t>Pe2\؋Gb (~,(IKy*RaRbp֬2ӿ6Hs#*}\^~TT'XGC20xIJݣM<<&"&KWe`EI5Bҽ3>p|_P]ިO}PH.ء*۴Z='`3.n{RPFGࠃr3tӯ/SL!ule?n][ lwmHj!UvwAVG`n*6),)lLdlf-p%3t}xoW6kqhĢmp! 8:?߃b碡 J^HN9+3}T@ڡ!=BʼnZ7xgGTI#Y:(l&PJxf?0T$9^ρEyA|2Q&[z@x2~ł^9W]>D.[ֱ(0GGZ  _%6fBbg*Cn 鬁w12 c,hF#( xӘw0|ekk_"X.m_B 7\4ܜ` H8{W%o!"(ׯf[0(/+W W?~S$a LMCC,~x{Èfup#6 pLE4c3E4_$ϰJ23^z9ڴkt`$z#?0يO>mR/Sp=pBh-ܴjlAy*#/UUCz8k5ӑ0"0bAY"J٠lFO:mj`Mo*Id-Ƚie'R'v8y¡Sm ˍP7cߺBq,jt ߮x}7ؿr$>)pzש|J H$M}b$q=f$xKԀ VfSɇ~ 0{_actOiVT&38t)"uZ#XAݕ3~ vocYE߂GeqY_r]5aC *W&Y9?MѠ͚|eMC͝eCiaΜz#$.o(Ep3MQrJN& I??wE=38O3 t<xrfd6]ޥWjC5A/QM1WC*K6 K)cI~d͆v~18ͮ6ʮOV(>I'ٗ 0PCa1ޘ }!lH_J2zג͙)=ǯI mPW?9鍸'9]z䡺m0$gvu2Ʀ%9SNݾ"ȟ2H<@ "SH:UIV]8}8[웈5TOP 0!_$Rn0ctHJt=[ R#1~aN mjeڔJq,&iȽ"wRsge>"NV-/G/Qpm5HNāW䵦ԑ(\iq P9@Ib ϧfVxeRQ:6yxlh/ɷyL$?T7OHAѐ5fu#2^7n_8H(}FNC!ٓY:B{$3Z*\ g|u6`&}Ͷ|)N]s))VxiHtF灉[;JOiû?4y%&zƇC; w&ANGQo̯A"/hm@Iuk]; }BLo8\ۏevR S+0NUHL4 >q60MƔ1jcQNFD+ԃ3~orN:{Fw$Cr OЮOY<܃4}Z.hR=O>D"TQӜQKNpz0͈.F#ގ]kNr, 4̂ _/yrz3|'*5ldGMINZ$6E4逿Uqx84JFcim}7cy*xr J'ح~)9ޘkMm!L;%δdР^SD;%P^LkzN#䆯_ Xݤׅ_Cjǡ<cL_mc C%2b6 PR, ^Z-r{%K: 1 eІ;sа\Kg+ժjl,r`_M>~c6yɂ?vs(*$KE!OpHGgu<:myu qFZ#ZwBOz`FRLйCO5?$176k{ui0-mƫtb4/Ҍ \Zn`MCFzwaK͹>^r"^b+s<h^`ex,>UM=e쟍Epm g h>~sukq$r#pBۃtan$UFa-9Rc{x|`#\|fDxa'=?PHU{_i0RgkauxlCdoڤq0~sTt>ٹ'Z[!>g'zSeӧK~E|N$KE&!9wx`<˅ ӯuxtٛpg"]|_V5=x)<;M#+sc:Z´zۼHG~d*uvtV(sxذ}ԙ!ѳ2^VôzkV-o6NթAbHl+SI=E( BDz{I7\wM3kb3Եk;&J촓?0ﻢDOZ>^L49F=g4\6\iӲԼ}!weRjFO]n#d4—l\r oy¦\,"=ռRa.W(,s!xFWK.Qx@w"AD-XF&ԏth(V ZSl-⑊NHE2ٓ4+NZRn4\ &7 ,{y5m_u϶8< F}^#,P%ve|MΙ'n„w"<~ݣWWØnc|q|,B&&Ro@f]~߉ +Pӗ~vŹ餼] ֌+"4P۳3./ nGޟ'zD7$#PJaZJFD:qc )cK +2ۈ,b'K lnxA".y$bsُ:jQӽCO:"YM'~Ҭ89Tv.T<ʛ<d+Q֎ RT=yc&wE9M:|بdquu@Wn1H|7I|)Iv}oV@)kd ?3; .EƯB?x皝i<үs !A?d]=|gg#r]J,߲5/;8Z Ծ#J I}3r. bw/q$ƀP_p/q_[F6㏟q[&: iR$sRATNHy]N^ߠfPh|,/gWMxwU"ktĘ(YɣX˷b.yI\k[9m~)Ql=kQsF.'tȸ]KB^Ʒ?y7GMdI]VʢSP `s=Ihb#U[Z#~u=[FhDifaUʴQ(D7i jL+`̇ p*{=A >>uܣ @08I~BS/9"+ߔ<PF6ĵp)e 8R0^-$5Dzͤ[c$a)op p[/tk;j) &&=ur7)DN;lwH3 ɁD$؄ 8?{xE|Twe1ȶﵿN 7z懼cO:|SdkI>!bi'V }$hLSMZa[ 5) ƫ z5Ÿldɷye2+Yqt}Pa i;r#eS_]V d]3I U?k cJz?}91vSG"9 ]tQ #_;~R(RXqwԊw0Gr7y@!Qw6 ]AMaTAEP2099l0 !+BXcW;=•p,&Ey+@(x-+,Ĉ3VnJXxmc)Nkຝ^ 6e{fmo/,ӲJtl}c1}ַN$pR&F'mb5`%05R~h`CoU@ @pa4Ndy"kM2}WY]I?W\iZPXc3^ (sרg1 6*,ȏ]W] F{欄iouj6Vx +&dw^-vzoz$];$CXG<\{)^Z7H }Tpţa}߽-Ty2l(|9 & S]e =Mq5.yw(c9༄WRʋbi*FcxVηXH{-#4Rw̗<>֘6e ,U+D_lD%:TXBYATm }?Y;.EGPQ;QcFjHbHB]W_JY$h晞sЇV늶D )D} \R˵rM)gJ]xEfݖ9:B~7I#fRY~:IeȁG: ]V'hvڂ i1 R]¿O]t*H+35 PR}ߊF}zZ*ΉV3,SWhn$ ]G`Ba="ȽzP:-aM2 M|7Qk;TR*FW/"3jï@c6X0֧L8o?{5.43 XAqpUY M/ԯ/%G*'vF_:X ct3X|U#8_v[LU ZҖj%w߭YdK+bk̠!KKR*\"l&ݓxU:|7Đ _U}7mݔrIyb3m+Xx\Ⱥ8JUK㌠nwӊmrZ/р/³2?T[+×s:I =3'IEj[KWhWf4!kjN$^v<ɰ=JPC9;hqR(h$ lU%Cr 3dɓJfLB?~tX89XrfI^J "|frS_(.[ =Tfr'⬪pwPk/o<cϩ$;t\XS"ӹ+A0=w!=U$uW}sI |!L%O^) i62}c]mv=B0/b(6 k\T`Bn޳-vO+t*.:bc_$-&}r2 TF>e$T%byJ+5ssvTA fk,ui%$fl1;GR ViAe67A(`Q/V[t)'Ur-(9I6dI$Uߎ,&~W”f;Nw|!ADrDpNd!$S}kՎMCxV0@`Jb9@$8s0X4$ ՚.&щW݋#c7Q4tcNUT3T5t"pxe;r2X;|6dt*VFPpm d#f.֏Z;n$HP!M'2K޸I|0t= Ye s",B7oؒO{EiY &Y5yP.9(%lGnUwc~QZGSep1x9Ɖ?ì3җޑ0mK&Z̏ O#OQE {+Mp2nxş` АO"=ibO]$__[ܴʷ³Bz)t BPгS `]2 v[^̒#CZknt!,֑SHlo@IR|cX~uh:'(cޤcDSݩLJiેstn «`Km_K/ҐMFPֽ׺DFp")"=l6D63b L;>m &X2Ƹǭ%|b;Bc6 2.!^)J;. d)^lCs&`'yx7HE*3i< `3|eb ~r9 Sp7Ezv8䛍(\x2xufd#on;|ԓr[$tg&G gq%IE{05c/N8q5;W9Ⳮ!bi[IFAE1#AB<2 6 MKs0gn{/h;IX\e_3cck(e( >| pfCS,W\uݪR6J-k #ҫe.ЄٽHUͺXr)Y*e-3x,/VGc.gc`:W7Ō^X%FչߌJSfFU{ڜCv2%ZLi~ǖhU{wV&J)9{sɤ5?;C&Vyl2U6=jMB\].sb?V:\}BNPG;ͨ<)V lb-ڞ:ޑ/PjN[^*͖-٩nf͡-X1x,zsmEI;'ܟ[ʙD[&Ab4PHঌ] YòM ASUַN}uf񻷇[=Z͋:ZpE*!"%*"X^K9Iu[™GƼ_:~\BnhZ4w26iV7Б^= aKjYDze;nOjs! |K#rXY(D,F|K @pC0GkZQRI>e!`Dr(O_a OU3 n P\m ~x׆j;Jw-/ɜK>ɀEȹF@ɘ;f9A Ɓ7`u' tu1t;CB$qr y/V?I}v nD9{PSXy6q|3K+K >TW%*9ps8M4E5 NbٞKUS|2itsJ# <&Y~ڸ3?qY7TRyq,w? $Wdt0㰪\?(aݩI~;:;cBP!J&m杴W>8Q#vV:M]zj@ 0}ʶ]7@(D'{{i7Um^9GΑ4J @2F  5.#?wbݓu}Y,WNսsڞ'ߧ׉<} R!LVMRCUV.f xΦ۱2Viq~ PQB͵+P-޾3}\E!yF j >];O\IzaӬl%݌ˎxe 7Ik\b*{]y.)!Ts lI @j'S \·EF,dw"pNh%Y&_=^486 \:X:O9W`)D@H'P:ҘzRX7Ͼ؟\ݚAtfk~EÏXxyS&@_J/ }3Q$k {>*~ ʬO[мFV!>X b`ARA2^0j5/>G`:~"e/䦙zNkvi h _-<&xo[p 3nǕ*ap刧;|.. O^f8xpAF8:MS0w I8sE2ٿ&H`s0=;960tL(O0>:Wu &LKk$ Q=V Lϓ SK-p%d$& A@gmϢ6CZ/͗6i/8ǷXj`85Fqs1=/d/J]F"{D,+2K >Ut|x |qS:uT-2(O-3s\tnj2tCAlB'ذ R-TM8mMs<-ya&<)ˊv>h6wIe6e%qs*j,<3DFH6φgH,8=[6=?RG;T}QN!q`@׎kk.NuLnn_#2GYՐf2be_`IJfs!!{Jb9LlK5?Ά\~; ͞l*EafzEJ^:ی8aml);bJ"l;y#{Ol"YgmtD 6عiRTrO˳ ll[BwbE>d* N,hB6DϬ/(s8jN 2퀯Ҍl)f<-̍Ym ynm ܉cVeiHnL~ȴ 2To욬sO4/ C /VsyEQ7ԫQw-k]{XyYL`h7]ލ]W@(.TMn䷔.~,>k2h"@I`z&D#Lb"w$e) g?S:,߿D <F1"2޶ `b)aߣ,8{~J҉t0Nt*&psg[WHq$ R[JS=AW.S c[^h󁣁GW,o1%0iU}P_H=,8bz0e:ƒ"Y\S=6z)Ip9A go95y wo5mu!j-vG2v!{cK?XL=W%eEuvUtNTurx7  %TX_ D,|~x6YI[3AdA)&zeWQ1y-PaDQd&S7c%. C_;Eį>r"ic`xL_ bA:elZ oJJ.J~drK* Wv\(셧c$YV-6Vv)*cWڲ= =J 2e3`K%hm8L&+ &#R2|ݯ]Er5)^T 'VurG[D# H,֒L:<+a:UZùZKP=xRq">T7MPBRxhC4eG+Fzw=&0CQ^9q)(Ds1Wda㜿|=vX%XŀѿܙTi=rsb=ݸÅ} 9& \K RV-Cl -d֘x鰉e*a9.1$[Z&[ |G-n"|p>2rŕ0zA,t͕s̮5BV\{6?erui{- I|7](WJ*:N Z+1_~&ѹFq Ium `. jVZ<ֿEosW\Sw{舿9 ߿p[.f/EL !9Zp"L{ ZECP!5a!TJ?/aQ+ZH+"CILm`dŶtjgJҽ5sG^ZEqwv7LK)#G‘vK`߻/|"PM.8(H113O O-dZpXr4.WbUfjFr˵#?WI円 z"AjDsGmS~5B-Pl'HF%hfL"&P{ٯ$8D[EJ'CϹƏts@ "b&Hr'AZ sN8 jd֡ꏪL: ZfmrXnx`)DdЦ2lqvÕy{!.71A-ǶDOT+E iXC^ho!%8DRf#f&q~ 5&)y$_W;Ŝ"IohU<ޘtɝyѨӲ2\%tEd< OLN cAf? g?}SH4#Q/ao[3/4~ :u 3upzeyRg#Yϸ-i,`I$}pc0Pum~A p'^S,Set?1mW{}0tGޙ$v7[K|E V|  -#cxG^UPz\M"̀ނZf@iOvYB.˛e+<[[usW, ?Ahl'\Ȱ<^ A)_pF[ &1znn֦Cq[(&c6ITaVQRe]P+,IW޿Znbls> EF_S4QE"*ʆubgHI3vR.1:1[kba_g%n̦Di;Z[@|b-Gq;8OGJ_ ;c#TIkFy4s$|p+tcij~tal xZ*Wp7)}PE=_N>X$/@ܳqbKjv}._4T1*YQ,s5Foˆa4 I\]ddadG-M6h3r"uEER<_6=rܬa=\{s gל\m/+>`5g+oI;]?ww_탧$"\ɖ! $R;,&`Mp6\f_ey3rW=n  __ɏtSYڃFPeX(tX̽|,O\ڃIY<.Xk}SM#*M!ѾqכUelVR uG23NVZ\鵳bS%?g-45i5-'mA&/.)9/9x2#:iY!ت-3mӷƻn(\~ꅤ{>5mk7*=iƠ ?]Kٔ!l+q-$3qGn8iUђ%Yu6ې{ڔ3˒_Zq75L?u{mkTx}(u焞?ˋ$ɇLhj\GȀcܼn`R/rVpqxً+% ކ'Ֆ'5 =ZP\2״h 1FCQד\MQ%??堵nIܥ$FGҽ}2ee"Q;umJQյ5|(,MtO'櫥 箩bypkS9LCzZB>OzRH7Rd1!jnhY\LFlҔ*1r1(2 J&'wFwLTd,QmV;U(Y-̜]o˄ e!9:Q;%:]]F'xsrv)3R^ CnfA6-%Ҋ3j=| ud?yAO=퓭I.4NkHr"ʘLrMj0m^FEK"f|+> fNb9BWᴨk`j/I(}mKQ{6VZ-LI6Hȶ3^Ib)*p`[۽uaVc/b;xNL!ugomVfM׮pNrR}hk)nbbu&e;-ASO^S)rԯ݌ _ȴ7pSgAs5a p=ډTp41*d?5@Ja3qlJ:jyi_U)? d_}.okrkƕPt`*MdW|ݲ@%L,%o?G!mGdK0a\}İĞMڼZ꫟PN;wyUfwI!k&O5P=cRcvQq)%w+9l ,cn{cߏ9-F~s_Iɞ=U ?3fA6 ]IBj*>3iFG!Vkq ~ASҝјLng6(.Dna&I㛱A!W*L{=Sڲb݈D(5HVºq'~8gԣ6h2eQPC3=cjkxKN42βecNPvL9{5C 2 ť@9/sYSi4W*6`Br 9h桭YΫLO;d^ejZ,e DY_l+9SE3v/C-^y\ML{((v?w-:Qoym.p psYeuq\M2G)K_hD,Ta?aIhR,"콶!L1"~?TZgd0CI85,гWG5԰=`)}!榷%%wzۮ08οHF8ȶ"_a`:F8InBBp 2JV3NCkёwBT1xUZZ7jzTpĈ(luֽXQDMpe}X>Qb0}/yn= M ܳzZTI7- F 3,!&#- Dm^U"DӀۣ)r&@/rRBUc:vm/Pt `&Z㐧g=`D\mlqz߈rC~d?/4~+jJiԋw=+iq}hOQ.XJu&q+nnaʱ+ee 1☌_(x3E(@8DpzDSPҧQ՛WhFA9^&7_r 2J1ܓx ^sr/oSRCz++:[ PSs)2tl q(>%F&{ۆ<ക;A~}aUe~nJgwM5ΪuU-hLBmd\HZtn}>U_R 6"֡,]BG. YT-w@U$Ag.>..eE*huӼ c3cp(U>-D(T$t{ ^Џc%Ntq* ~*xBOWaa"hi[G1b9ntEA5' Vx$ "\GJO3~Ƭb+u]N<( ƅ {O?¬zrs~%CRd^cf,ɥ$N}<6L옻ۍ še*a. ŤV\ȍ] %b=hXMw83/"ˣR-HK<0ɞ*K4 M|ϸE/;S;sd%'&tDx8ǰjIP_Q5*5dl1FTU$چ9Ɣ3)ˇ4e޿BZj-pkVkUo l {Nu˲o\/LN ._u  HWH49A2|vaf彅pTV_,y突RTV¡.݊:s]/?~Km  @k(=aޠU~p$3MZnӐ1ODZ}XYM'ϟGZ+m'NOL&§~l/C (dh- U1{ݏ$of2648ѡ?&dL 86EѤOp[Cn6!kshQaeHDba'C\M͡ s|#?GIvҁ? a ȒQ5w*&嫕r+ٮ 3$#2qR²JfXa: S=u{_pRB{tn>oD8F 9Ӯ̾wl6(( wGlnjh6Ih\IғiO~8t GpoL+Ob߿[;r"ĊMՆ-M<+PHB.:E糅 ϳOXsWa[цx~}"Igy zQi`o;Fpg 6]UKi9|3;ahLUgo S΅v0CSeBLO=0GT/7{t.EV`V(4Q%Gp*/ Jr,| T 35YOw,2 }2 `;tU1ALQ}c3M5Mlwݑ:P]vh, A>uh+pJXu鴇hvWԽ;ʛ<]_xZ{̫ O%j`{^o۵HrK@S2%m: 9r:D+rNztVybV`(\\snt2^/;Ke]iTLΎ]h/DWK8urrt^m [S3ݪEq2h!9ryol:9^S!&&&S+ cy7pI*Gori듧Bz|E1} 3#B_H$)oBG8!9(U_L>C/3pz 5|as+ڎ10?>^ÕYL{\7"ئ9`2$crC B=Q b@ok\d_^`=yyɞ滝[N␽OYq댫h6;Ewc{:~mq9i#ҭj%ku_U^%dҜ8a#gF;_up]{~"0ft&QQ# l8ou#>#Hm^eq:.>H%jJ #‘NFXIM#>3Ed_3onEsk ^mN 2]KrIKR|;gI|= ZΒA=ܓcK1(uR~Tu >`'SLE;hwQ]+#'ͺ:+6$[Kq\A5|R)|ch=x|-Koe)w!LQ߮U x޿ &gmnO. ᠵ 3a  -skyXR#@m.^ T O7H԰/+kф,8xS묌<9阯} V]RO _2ͦ1F6UzDE(?&/XR.wܣ/~ 9GNpGq֓io$/R K *a:zNK,wDHD俥b,448;HPBL w!VT"0#œ4o^nfeRDGٗ9ǡ8hOfJ06RU|IuM;bCTCC\eߋӮ);E z_K/ioXY)qZqwhZvօ bI<#9cL-fNaՂ՞;Whj}ޓt0{"-+l@#뉎s=xyAwk꾒1}>E;R:i +,P|Vk*]JЪڣc TNBߒK(<%G':iqQXdlك'玞]i7=& oH:V7XHuj^Koy |} Bz;tP1~)=f}`W<D2}+jʟ=ah95APpup TxFF'N_@ɔٌ6QW̞b_NeaE%P~NI!BD0U)הKŷabPv2sHA /z蜉4M-#"G.haWPhC{_ ܳ"3CWn[%m2y ɤȌÉ@ _Oi!AǮxEJmdKmv4އPިo )tD1(=e=Z\5Peڋc?s92seKU^QĖ$E/LO\nNY,'z Å}Cjr@/*~:FcY`E.sq,vX; }:<*?`ԮtN$!rm(wLZf;YTY ~c^Y#(%~Iu9<%[1tLj{PMm.:}IRJ+"N˘h|tteXFu*+vP%g_ ǧ&r.C!JTwy6Iѧ /p9(F]^*lܢy gtgy"G'pͬ{kC+3ݿ ୖ8]ӹⳅKVP>1[gkwtyC>E$i/9,eL]fEE$a0}x[}gU: _Wݪp`it\et/i@CjcW8v:`ΒBS "&(f#]# \Jy\h3AE+8"/'K9cZœ' )3{F?:`"l1&B;}ԩ'hZEEq'9|7q*'3DٻP>$#,n.'QK^ OnfI?dc diImCU5\0$O^rF""}`}u83`^b# }'Q駪6X5`5j ނB!܂ .Zc,M=`?,_ ЕD3 l#hF r?RBw1F z%H\?zʚS֙kA$cHK[B&0.10j'/_#9y NӰak󯺡uLj|lwD6,mZ"BoOES&*jwmR'm mGXMWRZ$ss!((RpȸS+A>ǎNEToOW:V=cs&dM!/#x/Yk81qLnLc=3}`m/8K_','Fw4bUW~:5!F+-5/ELwk7e/1UJ`URZט-Ꚁ3zK>c2 Gdqp_zN'/5 01}KL<"C#oxJƳ3w+g4N"=%V1T ]bJQeȩ }D'r -Ҹ\oI{f)z|3=taE88l^XOQ#*Ws'{6ĮMtrdq;3E8qU`" XjH +l lc*g'ǁBataVp&NtwRUz7|"W+̭Tjfv{9{D&' $U2R E ~s:ካB:ɉ$hV|EDe\ ^ [uC~{^6m>=3Ned0LF ^r * 4;ud8^cv/cӫ$P/7yvJ##70?0leѫ+山!Z&ЃFfy";oQ S%~*oup3$?fXsuO^i9` &0I i8q̲ _EJt%Y!BXE7>opb\D A%'ɤrLAz.;))L-7&ڣ(&"OM,Ak(-Pxӭn闙-h& F*a>SLXb yHH3םiaQAZ:Y~4F!Xкڽ50 V@8IaX}ϑi!d= gf.>3haЍ80:!\wD}2+Y4<M/\S ;#' @CmZn f "N?S ,q\($xJi˒[umv~q߽NN$rAEQYaRD@~˙#(.QP-ȉǻ`Ɲ2?d]fbnԊ=E0G Qc X'tM͸|#7uvk\ʛ.5Tƒr.@Epʂ^ħ]{*S3f/~0BPBu(ݶWYCL<; w&b~փek!.}Wm| 37zQ^h0.PgTF:9g% A+|9'pdy; (lIr-7hV~0'1ѰX ^bN* rSrbӛ\d9d2.t>fZ9с"4|s_Zt1|Se `Mmi:іnNzUU(1)Ǔĝs4΅=5RDIp`+|U)S5,]YӼ%J!Q xlcOƟX&:~hiUz%W.j2Kn"^C{9sph¹N:Eg0U}: H:eу BE*03#:GC-S7fW1(Iyr\bt3%suYVOiǽV!l`Q|[a-!àRrTۨڦLwT[93m{b2TMlUt`ή1(XE9tjp%[T(J7 2?xh.y9QM:p] +3|3#ZOJA=y mhB \}bW <1KSߝG10Z]0( `ba$үfDbpJ[~TŅVdV'̐m8PՕΊa7zjc͕ ب}ݸ"=sD'1\/ك;2jk4!2l9. KzAL.$hKY4)R/{8QVej\FvfO F~[h XRVR̒)dÃSw'ZpdsJS[kQ},7!1NFwe,maOpBƞra[c,d#I%2x#&3/(} (ljt"+Iיg OM9O1JʇnnأYJғƺG'%|e Χ} ưu7JT`䓴[Bx50:gwۙMTm,]H`wgb{=ְ9%h6H9&.)7ā0᧴({:FV=qp>H.vät X=z'B3Ah<޷ˇ39|rV**nBerc҄mPúkfthsCT{u% 0]ԴJiYgCPx'6:55N'+ჹs,Aó+_}a @_;Y7;Hێzh]zuÇQn8 ->\ *< `:\@8 ֌D*g;B;?Pcͳwln=선bܧҖa BWS҂ \MAO:] qZ'eDžT_g1ƔΉ?zQ|4wc" 0"[LF+A_ԓ,:dPWmȀ.e&|ɦzdUѠ\׻(CwY8?h14 -n1w j /5;}$}$t%)>Zm3?F rբ -O-/VY7 6 +HR[` ;wcX .]L^`uli2/XqUɽfJD@#{Bi3K{4թmљWWRYz&A6NZ`p?ĤP.&6~ٳ,h-?^xKXd+ؽ898L!Bz­+^~Y{2|T$Ҏ'=cV;>RTDzJ.ѭK: 2Ό\*mD jd@f<ߒybhZԮzelu7bZ0uD>"'Y+㦬Hu#0#V㳖Se3Ac@j `ʥC#/zcΑ3ׅ 7`ZB5!~ ?4&WڼCԏNʇ7 |Z7 >`H0mY>Oɰ$\Z=S\Fu7i}D x@e;\Ht^c0h I%l hl }[;B%G!?Ey\Tx!Ruߎ=_0tm;3F & ̸8uP)_?x5D2 "2:${rCe/"ɬEytB/fJ)A:fW/x^i8m ytLD'nyZ정ezxwDЪKe:@`mqY~\,O糂 ?*f^y~UG<4;/ 1}xi¥ū9f]ThϤI"_W[K`Z()\Pр?T*wqo% ">'kcTn$\zd 7(L)Xgc4hNn>:?幣_$`-ό-dѼǶ6$7u>#r#irDTB*?o(-w}QZ|dw`Pig{}؆kSWrmONdԌ#vҺ{̷ȋQʟp4ZR0T4W&aEgRlPNB\WuQ(Pl\ LL>ٯ:U:}LsRzf.Ɋ+m0`ר[RM6*e$F܋XXT:e ^t@;}$zGԸ`QU1fΰ(dbѠ'N퀺F@H>GE7Mxl~]ɆġYΤMG_=Npd[v|){2jZxXt3H7Z21n|6ÇM@b!;\f3g|fQ|L^WCX} !\mqs |s>$ծœ>c7o VR] w!(r]$9E4AtwԂյ`"/L-FO"K6ڬc35D` 5EtAȤ[I(xFዯ|8wzYqX D|цHxM5_/~HPwu;.WBuӧw)ai{N{ mӄ21#ŏJU.eL_4Iqc}渡oC?gvurĿWuk ¹Gq2ټwXaΪW;oYz[DH4ϟ={\&xUEVitB8]StsKdnD% ytL As[ υ"E`3'hĂuۊKiaa*|/{0Q ·[~n(m;Rc./5W#Pj,U*qdGѴŽ׸j6PVb_{YCPjd"Ї 3 }ˬ"s/J9=-/Fa};M?-zmOE_FG? )f-7^86ci#"g3&j}~[;02wh|mf6ȱyF?"4rbM*>^H~/X5g˷\ Jl)rTwq3kdUjzBH-,)|/jDc&N.ϮB%3 B=6G?^E&g` 7Z_M y"?LEp2AonEH|T0."?[[lM,5SG퍕hld}'#.E#&s0;& i x>@qʆ4/qǢހҪ!hUCEѠ%lϣְO n7(^[3sNHu$&9c9R $$]FwĭMoa?Kgr:Z< FKѹ;!VSjy% #AXI&Yt.Ih.wZVl5UyFRNQofVtofW^wdۄfΎ{zC3e)h,]Y׬:rHe&UI pǼq,gÕ@ɍw@d5k`bsSv3ЗBGB>]B .;(e}@@I.k*􈏪x)ށ zT?< &p1?I: eh˜}87^GLdv2d:g/rB/J8;k×-uE) 7^0r:cǙ"+6>%XR0"֔?jY[/X#F4CW)[{]D9@uёdKs=c`OKyLbm~J]۰Q9)m1G{<6& 8/|!NPV/6)ڠQZvսےě%*1hȌ rVܜq3 .ӗ:\3 t*+g;d6*\KT|qg)ol~Γdi:oF1ZaHJA_qj,@CK4I%21~vڜ9=AQُi_O"qc#T4;d wSX\oI4+ȧ8\6%H?;gHL+aaF)׺܅W]j{K0`<H,f?`y\/mv2_i=T5]Wyƒ+[w E]-_=!xgt`]qa{OE|K/卙hjycbȢrD!v/+qyiT,oVuw%f\p̯ Ma˖Oj5ɦd"_C,k1)U-1#rXحLZSr1zƓ\aa}j8&FNu K?&?|\]Tkw7=h-Um4lN4(rz^I{X}/I'"Kd?IG< ]vpX6iv9R0ڶoǵl-,Mn g723rc&e "QŦeOv~~) >]Q!W lc2]j[H* e?(ڤHm] EŗnŖt]11΁lhsFhwиy{ A~7f5p;| RG4*+h¼Ů褪0 Z& .XITdBuɝa/ eV J^8(qFJmG=Jy3jϼ>(ԦX)'O:D~{Դ;14hD5]>mk_2rnYOl^Z(ҚcZ'纵$$^}zbYST\=%wb4N^WIef647I90F%!Dk2^amQ k.eHKTB>P ʶ{Yo/F5'V4v_a0OKD&; iv6.\my\'G:lI]Ҫ##QcWqwU#݉:)lQz<BOoE!pV]2O7ښx_>BtPTsXU PЭ'8D%쯤8b5~MoMAWCEM1t1s Ϣ`ሱmk|ZQ֬j2 f3Pc4,GtuNx)!ci@m(r1Fj9 ةG{ jԾlG%F@!A$ C/ØMM U(n0fB$ǍwJ:l8,7&zeS."^_\PsWj\;n5qsrS Fxa|%:PӉ-"&1qç`]I|7S5K9T=P=]זK\~gi݆DU`!0e4ET0!}H| Xy`l4[CKNE!kSB/Ap'f(e/QBA$l偉$%*QV4wQgJg5s=+jq ucf+okW{8)Gnp+qfMOh_C'%yVe:GWey\t +7ȁufK2՝XqwpF%~-;,40J"Bp]%|{cT .vU7'_Wti$c:"W[Kf?D=lGXՉ*ɠG &h!ӎGbk2I]㬅O F9 YLbqzgZlYLhHXRH(z_g[ iѲu /ラ]H0kF-2vwtzM?,\cU )C:}ѥ yt" ~1ȭ^g|aޫ мIN2eQTVU3NXuO@-T@ʀGf&.vF+u(.eMg<[Cc)p-*!ff}[x'WQwnL|%V/b)5;z&[>JT! 9*k=mfGT lx0 f hkNݿsI0h-y eX҇@va(Xǧz0HHؖ6KdO;hqǽag0w^WR2s{Kbvp(l.4ڝINA;bUW::]j]k^gNbX>ݚs_\祰d8{Z~ о0ć?6pa$z ݕM}HނM^IS~x$S*/|7?z)tǫ(LĈDunsKPWV0t9Fn;3*m W]l n=}Em|Z[|;?!9iްW~4,^>-w8\m ]nʱ8-nO#d2E"UfBr0iJ1"gi'7%Vq-60.KM2 wQ76/!Ax9hXywp-Y;YV*2w]ΩABl =\CE{U'oZP*/p 3\L<;n :ugOՈ7AZc=uRw9Q.[t0G1v?T?éxX. f dž4v-+3ҋQQ-fE[ rׅ_hLjm}pP'-ƋWK݁mk)?6gYþKvSk !~+=t\PN O팱|VjBPV[.KP~H{JNdM<G+EwRɾ85z҂z>RZ-ӓb֫d7P#w )ak!ZǧRlj!ay(Ni v'VFar=R/{c"Y kXb"\bfIH #mRx+ T!1XLaC.j)_7s ͽ(r< ]]y'IFn:QE󞅸D'=]nC֡6o*ܧzF,|CԪ]8a?l>πhx9Ahe (X飹 u]𵁤Tt"v` `] XS;.%FBdcvC#z+>FYJvN$idX@3ݦl,yQP8'q%Gi!p9 lOYACP7$iCۢ:/%@B'ļE;Ұ|\H*ZG 3`̞[6DWԱs 5"nҟoΰtM=ϬTvISޏ 3b̬&C];VtL#IR4!03jtKmr3qv'3ΖAw B\\N.H:WFq77d+ /`bj .on[,)ƘC3 wBh`-wy#}P;;xmC,."Π ~^9Yg= U‹an^y~bM~ffq_IxP;4*gx6_|=<;·˝AFљd ʊL,}NzJ|f{hBdME)QQBB% ]%V}y >^TqDu xX{(10(ɥp$=izdVtKMjS^Ba*̋y$V^ߋ˕?@t}Y7yS /Iƺ+:c\Gq/| ƣXDf }. RN遜']Cn܉(~YpmS ~M[ }*rz (m.@+0J|MR3fϬ%! _˃J\ŷ^qvY9!DBDOYrVfԻc)l,eIqJt$2Et.t䷐q<ʴڽRam}h, Gw~*#1pUK{+~C(R潠 V4, cވF?b^f!S@Ґ}BV^ N2M u:`޿uL tb8j]l9zO& 5ӒrA~u~sEN8U2SHt!r噥YP6Q bK^8u%' lfy=/YxP_W-q[u[uW=ՒaTI^y f|r41"Zս `l94Gۤ7Őw~hRE>pm 7=lb&NCA`}ɆCoWJU_18ReTv}E 8(0$W"XM4R4^>DS4Hc@*1UTS,4pgNVf'nep &".(WeKSkMA2[xNG0'$2b#$Xř^QA˜/ZG—BVv 4I\Ey&;HRSKn?c+a ʉ[AiF k,:Mwn %xWGKЛl,xChNn]vn o#.߆8E [:"pefH=ξS/CWN(TbYV`0]ECD͔yjl]2y@*g!RK7wFd s;izQ)9uOaTDt7ˠu( Bj>E玼 e[ibnE<6@/%a`deؤz~ P=ZM\ '7Rmq=4%ֱbEJ4֙Kҍv &hGs~XdOM U_Fo1nz/e@Nؼ#w¶GMᵱG8mpP8{2F+) v`ND$|?+)Wt?M(^*+Vipx&=8[e!n OR!tYds&vw5;zX}F3ԷXpxt},cH7?z,F%XjmzghѰ}/%S&=!I_!O[VWD|s53D$YAԘ IiY-^𒈩o4Rp- :y+^`ЩwZ7å1FyBچ|O o_\zImRp#T#W֡tԥؔTK; ?eig_Jqs>bJ~ (+|#2(x}!=tSߞ]P_ zcͨ34ϗFԥCޢm91k ε$v '~ɖ5c Sm KCʛ37u5@0s`.n8dɞ)6WN8R\pu4 mbh`B+%`?cuLO^Et$BIV8Y_q mjn_r9\TkF"ut YķL;_9e,b5}БSn?P]Cb Z|[1l4Qt7w>ȮS[wO,7>=+ߊ@f+1.{ xH~]8+@R*=eR,&3HbɁLV$FŊ,'Hb\V.h761Yfleωlo#̯g@剫r%9}Bb F}$ fiQ1/MmP,eb7r*Ml%o9a+x2_|Fr'r*wZ0TmA;5 ,Z(P&HU{a=Ê9Y%]GyL ,jj=Q;C/ISeQgy{~ F$ao`,'"EKT Z煂-*7_~gA{k_yPZݍ6Z$H͞BR;ay؎?CD6Xsy=&YV6%i|9q))o ֖4+,f%n+u>]ky$(#ZE)EO <i~AJsTS{v&Y'ƻ\4K$iKP *Ѵf. sr 5j>H(#|6_ﮬElO=tVb4.[pG`s*%Md%njY[%4|nIy qhb_+_GAOCN_|VSKY{$qJ1v<.`r02:,&C0ہXݯt,?ZGLY O-;DH6X Cg?B:ZzH.T@gqw<~Ma#JU{QGa𮃬?8 ax1*ZFcZ a}B-/;@vqÜ bPʣԛYI6(6X׳B:*{i5t'w=zK`6L{8 N~/0QWv)|IPS볆>Y: * ]L\ӌR{;BhwcIQ GP=i Fq@@Fa͆q]!{+¥F YAWⵐMiSOIȃ(5<N.n[X>-xe;QIK A/;iZ-1kͮcQ~'ƯՖCTX[ XSB/EHV ޴ ˫"lAM=470]yC[_Klӊ m S%-"W Pd J^isgog1 x\nߌ[gđA!Tnl!\fW4Ahe.GyyxÆⱯؽ>lR!z{K/IӻydL0Z]u+U59\L3:!is1q/p`_?4)/P$2h-eBE(~ %KH爤GᨦŔuZG~q i}ꔙT.K R-c1Aّ2kv/#20ͤa\+HG1l;}Wp-adOĊ}f"F T"ojx0vR#𷋺)5Gw|*4lk'ZD>7djѨ%3 @=0y.[^iV 66Ls+hF&7}!^ATt]g]~V|<`:*0ɵRٯ懯MJ9{T<7  "4 `69n)[J[ʭ’k7XKY l L9H"yvQ'vԊ/!"ۈqL'?L bZLQIs&']P2gF Xx3V]?eYExPfΉ3qFziDJ G|$T!znj6k+N Wqg3S-<RZQ\`SwB^]_s`׿zV(|<%u|hNI#ڨ/PYo~.YV3Dt:k" NEo)Gq qܥ;ބ>_W r%Hboz#l^].x'.U9&[c6b7CFx}H/"D=]f~x~sFI32Kwy\UktլqVNeqQֿ˸= fHmYJGDwČr0&5H茖R`$><~scC|gIt])S0)CgtaY hnoΡf8Եs Hu*;9[ g}vC/н(_YaWoc&u\LUtN%X{頕S˃ֽHNTv(lJKFb3rTg\jV):DVd-2xc>&c)Y0b.yTC"JϝM\*~.y>uǥ_Fu*V&$Ss஠ 80D[Qp0d$.gaǬw P P0ϘjܴD˅s6jHH?yRձ}JBLJ2cyff;|>Mչ~mJSYأSP'h]/ "x0p0cWϒUBrO]*GWΝ[QXq>p{6b1_Q<#e\G#㩍Jj3_cDӻ6"spk \6Dn*xS ?Mݷe}xЗ-W/'K^ʃ6xVVcQ!F-*E`I+nPv)eXqS.P憅WL0}GcXe7oaVeCY(9Z*l'O#AU^8&pWg, ?,!wh[QS˝0 ۼ[?]% !݊36 ϶4n(lZ=c!:-O꓾ӄ  2,?KJFlBs9RWl%{JpE ytZ7,A{D'puxWnd[!8WyRP.,q><&؇kr vx_m?z EdS>)"t?De+boMWΟ n絬|?% "c#Ja]89;[UҎ$'M;7Mt '>6kԋ+ϾӍb$m|V^H|%Q_Y0cyƫє4BFWn&-aš:4ic4-z>j ~"R.]Xeطe.Ap^];KMp&:ʪGzا6g[zl6f@ˈʿ3+PYr6GX.3@0d?qy-~#xb&#ҿ&oWͦɜSE>IV]!hKhnL4~ 4ಆf$eU]a( :§*WZss}('ZD1۶Lu[>H T}N{rj2^&%WNq`c/JIeAɭ7WScJ[Yҡ#vv S(It]}t|B.m}ߡG>5=$(˿ "k}-@_a{*G%<#-0e ON\| ;8-ܜĤߞ2KOSh# =x|B_:i4 v+UK7 b[⛱9 oIg?Ż~&tS]QLŋ y0؁ŕM\' ]?9X$F X']% |/%jjhC'.&*Tx.&;Iq%q?vdLW Ӡ%{ rI#aڇİ$A<%Or+F C Z$5Sd3jv+T$A ŭQM.;s:^7ڛU{'eG%&U?8Q$Nr=. 4Wwo3s*cM-}IMbѧ^>Va/QpF>35X'*c#2홠Ȯ";.:pfr|O]U ,פ&]iɊ|KI N^DNW3}ȩNj*\C=逞=ngd\Gb6iڍj#IO;!gL6y7dβ,rQ{he?DCn)EeKw1Bcʦ1s!?\e~>g_< lBvDҠƶP,A,ȼcUH3j~lx+k:CS`]zpv:X.}]h~j#Tgfg$Z`zlO !Ո)2&mϊ B=4^Ԛ'Xi_Z>t{tJ1Fj'if Ǎ ŹVS5.i;.ÆV`4_řP Zf~4"]jQI*Ẃ1sL킗F@O8w3Nd6 _.W{PZ7]m,c%s[gI stfђ%Eu{7Cx,Rޒske!*Ӓ"tcu'B3t gӡa382wuvq)G,eI^#mMU?ӪrV+ف8`b ]!H͢l`=:joRKUCjyk_x `(abY/[`G9}<;޳9}bOp[uڸL Z6\ (6MӴmY5o:]bV]q@)OK,HJcǡ6ޏCOAB~tOz& z\8Ξ*CIt˖0X![S7M73 ٩ȃld䞡:?;:8C:{K}Lnp* -?X7^MEf{rr:?om@-u]L-J.̺;OF$8@Zm2F&qV aeBLB[o]Hj)HqrAm'!L˗"f!PutЭL+_3m-eho,drDnRMx)+e&5lRt\sJ[T_K TS^_kޟeCǩZrfygݵ " [0EYX}CG5M' 7F:&ZJ&ڣ_0X#>LW0:PMU9p.uղ'QMkX5QQ ;C.@S*VW"nu=w?竹kk\%d('=w|ջ:vBUDNpj)q&(Ԃ5sב-(P_X{YGBJ/4tQF2n&\G5YU4(P dUv|uzuڞ׮*Sc3Pū«P^&9(8 nM;U QPx%lЖ xڇZnc= ZL/c|OS\5 5~h=IoG7H!vl~; ף3 F :el[S,5Mk"18 ۨj˷uksWXs >~E_&[ $q˯@' ܿCZ_0Kً;w%iѡloeSEA/چ> f) m@8Oy9KjbA)x^ .ƮKl;w~\VM)dK+\w ZB}%7u]Le@4CN9V\$ȀbZ2w/0S 5n=42B.?j_C. ~KP |Jءl•-,и$8[KW&g~+Y)yj`yvܧ 1"ſ/8<lFb*‡Z![lǸ@*2j=Lїy_LZYW$Q(~' k1W,e""ă8CN0Bt7I'e Iɮ܎)T1c#:ގ(J?hNWSeRԧxahPr}I(WR* o4Q)ه:6a%|:ո4,$Nǯ>&:dMƆxixN3 ]52F⌏j AЌ ii hs MCBǔB}zi@WFr#z`Mcxz!qpw"[ڳ bh:lQ@r84oOCS0N !I:Cɉƻ~= 58(-~^29>׌r}hZLi.S$I$ <)K!$8pzӬMw1Gov>l̦8n%y:{A@O|!z+Ҝ;2C+ ,]X8fWgX""4T.m\'m)[A'F?/{0Pq e0۰4rYQ5BjT!*&jgd e x8& 2zq:$Le*oC,s0W!3̱Kї ޸ ZN]V.$fND3bv]h(Ʈ1M01҇,&J jg@t:FAjEs<ƭϗ.0cVs~f> 4Gl}3 㺤ݐ$29 cYl U [|d FD)yhs3IGX" /ٚl5J]eGzl@?|iF:x e۷4z;]-ǁVஞsHLch0m_6|]o!##U%IS`c}LZvZ懿C'.K;Y .?10?EV Npfk <+l!|B-@>F1Wܙa!INQ}O3zW>i}V^vX'C cTH~;Ӌ:;y.a`,Q̻}ⲯ#-y*t1> Wyi|mtDx/ .C]ѻ.];)0L))-;s m@-?+I<ۿNT6W܊T;ɨF &BfW0?o'ޅ=2EZhtnç\W\ h^~rlY({jYsRqA܌ G ֗,Z }h>Ҋx #|>M{&X# h(S瓎S|0tLqYovF_9P(NwY%nb.BsJ\-*1zisԥHI#Le/?M3ctZTז㹷Kl`xs_!biSm3{ט`}qU7% =]Ն#wV @]]O+Du~cBW}ۑïV6p de>֜iu^o.U=Sv;װa S=$ׂ}Bjh#ө _*>.{5b |zB7M6tgkq#4]Ժؘ@,s$Y{(2#oIry9.$ )i,B*a2z"~9% Ӣ:.̠T^$^?_Q;,ŸK-Hv(.__xduU[9M„+x)0ezM^s> ,D0E) ݶD/7<ю IꊐqZ_P1w{:F4&bnJ$Gy<Vʣnɫ苉G ;QGzzo*,lbfv Vk߲p H]*y8>qOH fƷ p2ɩY8mLAa_Þ #@,Ggz2/([MwgHAeQrG fpH$&o.̝[s;0Vaht¿-6.3wdHc3ROBpJ@H!vyܒfc8t~5)5־43<-<BHåCJp!_Zksr S6TQ"CӺT؍XPLj0(d?ƉY~U2Dp@_z }c8"Zu6\䧠#PEld4>D:~tss@ֻI'q%/qZԗF;LRu=%;9rd:_g2iǫ5 bu?TFrC nA eW5Uix6w+%w#6M^yB)AJ2`>Sa١A֡>ש&n)|2kBSn _ 0q$h=Τ9j1I 0Vg0a9mƴyC*FvO00ċ ePLefz=`Ft{sA0NW䈘4)hk'YQ1m,V|t33?_T"G .Wl_&vo?U|>A*k0o;[iU܊(pgb4Fe|;/Fe4+?.~_r@3ܲ_Χ1 ]}wZCC2a/w:je 9 4jƒ4%kHLIB.E~ƤGZˤ0|Q9:!Зfgzڊt{&*d ?[ {C5;pBCac-ذҮ4*.+8Y$h`{үh>pS|0DK |f C1qVklBʅmDPvWtRH}fj= 簪{DmNaoVYE$&LBh/> Ghk6^.u,[faݽ@#N1v_$GT6(F~1*Ibu U0.1֤>M}b 7ұsMΟY"}Qw+=, M_N* Q؜iҍ`$ii )&b|_q]TC\Է 8S}&85p;ȸr_Q ]c H6L>B\FGU3ypQ6, D^OD$K]]|T W~|'0Ԗ*c2-G^^los=ia[!F|~v [P_˼yQc5G` V o\/f]:;sk󑻋vA32йmi\ V |x),^67Wyu\k"b!U A [Uon)7=xťי)4E<<1ܙewZUʗ=ڻ̭y'7qy*5dҶ4c}"bd)@<뱘T f0)$ ',MսWD̟VXǩ;iy֌΁ fZ~.WXC[zL ($q,dt WbȊ2޳z%{[D+DZi) 0L& qy9S^S,Z* n8XIjTG#zx1 $[ޟ0/)'usIOX%q4*ފ><N`[%ݩ,Fv #Pa%E*vc[OcBqt8kc4\-oj?Qt~1V? -1}sBV (`k)>-Ҹe44޶[2tO |VjkYN$ e&vnAR}6Y$۶9q*-i3 a^|)>_AMUc+eܣx͇|Ft MBj/a&kєUYu+0il!~ybdT :N[p/Ч(NxUHCo ;js |njE !tr}Eι&VһxU+t8۠v$i>{Q:;*WRm%xϊr$PfP{o6v.=S_ڦÈ -Lqu\Y(?qţ+73حK)Z?~ ƽׂ©7` 9ɚ, m8=zS$I8ItdS;i+nӰ*Է+=Z9B:UiҬg0 Is;"ڄ|E]ɏZ"(x2}ژDubUF=W~kĨKaja2R"WV.g*wஉ͠MK<ҚYG# P|HFƒeDXY)w?Vv9[Ӈ\ 8|6jQYF"6R-A5-rrzY)xY+1u ֔U86hF~^ڋf7KuF$>s&7HGMyywۥeJ*N=|GEa:΅8ӫd\x#+ eTCbq$%]8!ΰ[շl\'2ɩ;EW%3JN`c$BlA!N4X[Jʸ(4":.Ui[_?Jrɴ%ne5z۵mDy}N3 0y~ۨ~L*x4v]pA/T s JHbARJsR ^]5غ1Ɣ!z5}w$7R:/ߙnB4u rثymzEzAxF`-#4nEW|Q ɣE/baђqaG6#|8-bzo\өt?;M/avNhsFmibSGi(tԒ&W=Ĝ4*jLDؙ g~5CWa^ꀜ@^0þ3@vs{<'xSS'M֗W rMO<>t6 sL[[R'*m4dF[[*g9n47eTԌ:SfX3WR2zWqEym}%l1 a6Ǜ| ".6 "P}=I2yᾖ&{Y!UʩFy}Eзy; `RkHn6'&95?DLF)Re W{(0WQίeN@8$en^z]ntSIZN/@7f-^\Whi7rͶr>( jϯIۄmU-A^u*m?Zܷ<#xCft+^(k9(9X t\CT1zTEPt }!lוx>XaH%bHکQ8=7YKkLu A 7]JZÍy&}Է{أhҶӌ- Y\ufo*$x\vD8`{ KZuoӮk %@QcR~@ݢ^Ύ;cE'MM}kUv6*fhLz 6M(rY|ߺr08tSN YTz)8l^ʘ?S Q9q^I4RB6[ͥN,gx|kA3=k̓; (&{kP>)/oF1k/OJ ^rdr)BQۼh>>轥 nk]|iG!XDc.x^3ݷ{lǀl#҄դxEP)9-p6V>n?30C_ 4uWգ$j4I`' 1>9'2YBm ݵ2J%@ ֜Km 3Kc\H$  \z7`.'ĠO Б;(N› \^;&iD̕SI֔>a"{Ëz7zxΎ#7; K[n7߆IӡB/^Ǽ h :\kҫw癸ZZ<-F ( @peSpBvFTcҳrZj)X +q,$cg,X<sx?W .ϑÕ&D1HmdzBI=FhR?LLBj(\.;=1f l6T45` U {Mb.\?g)D{f`^dr%! `Ӆ~M&c .x~|j|?P JQxzX1o_:W %hOhyc`,#ȴy"il>a'W +.N+kH}_ضty1}/!> kyY]E.MX2ݪ+jfm$ͪn1)4+Qq~ 6ЊbV:(ҥ QkT8n G1c" cYl{w#oE3Y Ƌ5v[p@<SdclH+VZ?Qx:8Zr\!5z/V"}Br}$DF1kxsH3\ӼCMk%4`!|9f\>VJ`YLZhlʼn :'=lRT H7`Ԃ BW)7/GM {w?ˢ<;v{g;G,AGV$w.4?3m%l}@Gz&WBL:  l_Zr nH5ckOwF#>b{L#) NRx[JaelnW^}fl } ʈ mksqa–`bdsm]41'ܟr ,`9-7TH tH7||nڍ2[km "%,|]u@4:a;煚Z%A;2=4L҃xMv{_V]9 mw/wI/p; 16t+C7aI :ˢSx]fēa}6CcTⳔ#`Z I6ђ+Z"6`Ᏼd"|a@ɂGܑFF-fً/ 莺 `УRvƤE{#(Zp*A$ز됬&ks[ sQ=^`HWxF*Qag`&^r?ke sC7G竜VuxlT>~LGp}J=h R?/UmחUdGb QfLu1ۍ7@8)*aO1 {n XW;/<GQ^5`| r*7TȄr#!٥rԁsUl?8Qz'="7`3sEE"VǥRK_U؊Fܺ!`d_':!txT6d[@? 1*tgƊȈE*Qy٢+ܢK[e[.YCD:t[RaxWy'=z,<ΝXg%tEkНJ_8h@Dο7aW_K8ˎt,X5/< . n.'ʴP1]E !ff0]֑;y]1?JDz0A;pVtn3v\Liej4ϵ:΀†sU{ cɃm鄝L"!-eg-髸7́ȦIxUYXK<+\kC[s ےL}4|lhmBUi9$'BzAuyv](d+N'rέ ,\_Xthu˱%n!o4)#Ens X D 0\`.F1B_fL.] KXl;e]G^͸30<`(WhP@C  ,ehF]BPL颱;:d7]?k'ЯXf5u_$&V'h)aD_X͛G-F L|7d?f)1SswU2{hNtlaN[@8KiTdŁ }Q;d͇& z0VxdV64P-' R;Dzom#Iإ*{xՓMn~vSSg;3{채 ;˙~,R&91bBHl+#i i,rB)vtlR!EEܽ-N@2lw/?w2yf[}epңW?} 3-=:6*c=_o7tt`0вGM$bG[j|-Bǯ sqR) ȹ؟rd;ց|T+VOf-\41:_^li6֋25_SKovRerj/Ա_o^STSqbȡs X~7^jrju ; 04DG(+T,-?te..G]䗊J-|`oK0nwD]QN} z ]_ ǻJ) wK:Ddcp){OR`e07wHvN$ y_NotSI _1{n:\5ѢA2~T痫52M6o}.Wz1>\EF8 KDZv;>S\qf#ɘBCFܞ,횝37VFCS)zpE'DW5jBOX+7NP֮ A˫/DxOWAs.RBXUMAR#lүcB~~qE;J=UȶTboaOJ6U%+uMKGk 3y1^ d֯Tdw-c ٪AK&0u57C3a3f,F FBFi}CSDStU"N2tep24e1F\DW _m ,_涺93ЗhSQFbUH:rݒϩ>9MnTX( nKz:} INnw\̙BKhĶ0?!t 1m KHah7U ,H\| S$~+VD? "g>"2C*\ ?qYv%8W3Kk.C(byg58q74  `4BѶ: P%8mlK,~MN 1>+_UpELZiEzPF* #O@1JR,b,O,+\a`c v6gQ/ CFn4 |/;k 㾊/2k?[X/rWY[S7`޻Zx_$YÏ$8&^^WyD+0%\2;-Y{nc2\ZKh\ ]}h$$fE UKn^(VBy{83i i |,d8Q?!8 &{8=;9΄dZWs>N3GDLy,q.c^(fTCAS wC͘p|MnѨ?m(x$f^S;l!8_IdkL>~N?|/og޶b!Y:/@D WC#)$ F9%{L+r"ca@ڞ ęs5O 7wq ' `~F{ʴ$P<=i;sa*n.;|%1uڧJHCJY26G͢.#2X 'rzp_&> Q1bOc-+ ( &n3{p|'h1ö7¢a*]H%ABԾ&KNeAd.DsWx0V4/tgRWO@U?rqK,f8,) w[|vO,V0wl\H+;dph!}d ,f:EHx/#sUD"X,;S|bW6M&N\ЊXMB|9bkׄ*YAGi#vCndbS[mS*g A.tBn>e "IeQ9f5&PqoW뭑e ,QXkM{e8Yz* sܹ]r6'nIG=fj~lYL/aiͼ5 &A.#SL·y*BZ0'i BM?1+*MNP79~$b]>t-QOaBƣ\d$B~ "T]I+*?p}7hgsS~>3GQmC$UPy~ Gx[NnJߧ<`-%jBia(ߦcA TyJ|f**K)i c/jxBт ZJ0x8mi_lf$VMi_G4YɋLYPR*s (h_)z݉3OyLQQ㉘PyZt%W`㟨+HĚ3[\6sN7:& HiR5 j-1],gZWm,$4ashJA>l _QZ #zi 5 oXa _dѷ2썐<"Ѧ~nd*GaVكlU#j>In4>(>^?*n=5Q=!q6d;2Z!8(W8R&  ƣv rx0MZ u4+ Vt vb2 /|&!" TBk[HZP Ņ4ʥ֔W}1'7Xѐ1Np-t!C(ƴ!?[_Г\_2D#}A? /vUaVZ@'^y{@8zB`xeB/6"oG,Ȋ´$}_TT u_.Ŋ q3lYX÷oe3Q͋AE!NrcY܎>17Ӑדm6y3vy6jku$sVECF6Rk2{7FZ u:kd :vn#C+CqѢQ4@?y@WwΒB<0Za9rCBUԸA=`qgubqWE^SVfnAGP5K/B1Z\RmRU~k% *ۿz8Άy!!+4N DF\lS²=ɚ68?}tgR>߹ x `sCU%}_1 4_3 E `j} "ݓK+AZd H55`bzߟHkFñgFKq: D}MK3{6Y@f1ŵȻگ5"TҪ?Nze.t<䢛6I)hnYy:l2dA_gч&1s~ߖ#Vq]' t!]7ү :tS4jk|$1(_mT"?ӑr=q?ZpPm@]$Ֆ@k_JjcKп-vJNpLr*Ŝ0\7wd n |:J8Cv]@aE ӗv$^ISMȴ!2#<4FRS,XvyB`vw%Z.x^hܵ􃭔1Ը !"Anl, 0A_EE<Cv('?v~3ӆeQ`!dIɧ WD#+Z'/<:2*YM`3eDe}bB &˼_EKySlU-L2%ڴ'<l?kf5U2-.{!%ᅩz\VlAJ na;rSzb;:[/m@8ZʉH="(5kvz- .0T#%؞̱ij`^@_)?~nY*R| Ūm1z؏q| h?{gCOA~ W:_ˁ#nM,(#DٍFH>^SY\Ǎ"P=iX1w]'Էp.RZW AQX9SϸK.\:фԠfr$$S܇f_*4j ?i[naq;檤{%'ʊ9qClK0 j*M6֎1}Sp S2Dۈjm+wũk4*J֓cƪgt2TMYc<#xIym/|Rn7QFt0k0GCAw"Meocp<3Sv:$jUf ^m;ۀd;/Q^`e,e},7 =z;Ὣ+)ul:VM/,J:jK1u79c:_S;.j/%Xy Be &> CosɻMA}0`Tg;VɚgIXUyY$yx^[j9km9:ռU,ۗnJj,>|Z#qT/Ygbom}F`0Y8 )zzw,fQ36pD<^puS^2;W28V";Rk1o3Ry+y#_9r̢\4"30!93j\YV'"*? PX 6B̗#aM(]_} ϱu.0ٺmt{e~f SO6Ən)yX0ݶ|A6#r W8p o9 Z 0D=<#^r0 _Po¨CM J݈>^L\MϹk=dmSrH#`& Tek##P܏{\10k{\kA+@aҥ;җiUn"z5B\V1ٞ To9bܾ+<6{s"?vDJ؎7|7Y_^OpI.X^= '5~F3^9ggE3݄I^^v泰oڷK݈\tZwK(iAMW]QznCU48rjYI${$Kc \:t* MRR r"S*Ynvh7Ȝ\ +he. Y@d .ǂj/մi\] bA uKoP^C7V:*`a"_5XAL!eqVJec,y-oTD|A"xT~O5o[{7ȯAaCH\ׄz7l^<*1ǥN6UA$"x龣O#+m>Y`TK]umS߿##QR;i"g/N0PL=8-Kt}h*L/ya wK^a=5.4?5}ei 2C]>WlX)61Dޓ; 0d ȷފVe f =2DU{7~U؎ijGUTy\[sM>kV1ќh8!]"kׅ$1bBV tA-\41f-4j=RA8GUr H/~̡ɚKxBpy7}}ycÇ)5W"ڛalfZw4oʦjWj~!W]]Šk݇kՔL@G@{,nmݍ#r72,'+K?CUI몫ْũOE|俐QԱFjL3k$%7JzMtTߔ\"|/^wҡK|!{:9=6sQ&&{|Α1JtBZa(bWSi$=2@xF22?BPr) TAv ,MRm u~_#>4c1E=012vNOb!0{tVVNzJӝH&E? 9iC!޻$ $'V  ĝMCS?W\[^Y1l28CaR*;쉐rr_;&V/aC^Z7Of;-qmQdB|6̞OA~זl$Zv_ rתL78YG#I2< /9?$6Iu/[W4Ŧ) [u$ZY) ӀNNT RswEj]"*K->@1̣[rCwLMh]ldטto.G噞ԓW]JDm-FhjOXp`+ J?i`@|CnM&vU*-Wڬ$+O f=zZX}motY쾃g6KtPm tAdDOooe*Xm&!eAZ؄[KhװA x5E8%(+0"9q4^j6&* #xه/`w&ļʰ~ atLRHƠ@Ne#^rH1h\&em%ZjFvgϸad<5Ć2xdAk`KMp m aj ԙU7'6NV\/`35";`=qN,uپi;s|CB2G!zHQE12`j*B#E| 9 jy?YLvE67y`%@IsUO=@d&ɄEY)UMbpy]?r /q؛긫Fzy'.Y䘁_S\NhxIf*n]:J +/v@A_ Ifd%QY\umۂV2ɥ`QƎ4?0ʆŵ'NyfԽ!JBra#x3;OKd3䱧v}IEP#@l_߶yyPZH.'-*,6vRW6z\fR꘰YޱG*~Pmry1f{zѬnSϞP_ &]m[-Y*{աXUw..l6'Urbh?|!?_T 2)$tzP58u2tq |B"D)}Xz-ω)b3S:xZ#mzB ߠK.jw^Ħ\!:+^Sw`2+0alښ#`IDVcGP0C5wՇ@D<›uKx 8ge?rT_K-zLfƞF6}#a֢h+|wc;ٞiCsI=.bPs;tBҪ /e"yHxȍ;@ozbK+AK5i9JK?݈Lw\ߜYȅg$G.UԤ,hGd8~(j~tϖ7*~Aty&#Lj*\= ©+_ J殼'_P]0gɴ1t=Q6kl /G;2D`N' ׂ /{{FTߏ 'DJE2y$rwHF` iȢ%QФJbIgLy*\ݗJX&ӶE Z߇PT.o }ԏ|wBifdKn 4f=/ō٣SR W`^IyHX_?ﭢI/K,? ,D% | :;= ԄK҇al6t܄IkG|Hi"}-l\ o`KY<3`+@;1㺁B]'IlC;j&Eh:ބ@=<A mJGJVH [/fٮR>wtk;jˍS]fڒ.i2Aۚ$V߼KFo"'oA/doGple ;]76S[3\ǑsKq<1ImfǛee VPOG$@v_;!lA A rf&3en,vb"NSfa%GM,*TEp3: +~&P6˲L0bz]6f!႐Dá֩]$w!$ a}}H)YP1,Qzk֌pxD5ywC Fǘ# 2p&T1fnx=O>91OeBO[f Tl1]іf_)<ѺՙSeL[YWR%~UM+cL#R{ xϽZ$PR%>ą#G+6=3{DY}Cb1zGyӾr22Cg$zKzWb.k|wU҉] _Ү@F*M.AeB7ڂ,"ޢ766<8=Ի3>ߒN1iO ȘoD 8_eL\.'̙tڅm^jL*9`Ϡ3G=Gf IXI:y'|ؒ{SXG'F<&)J{'eѶz!a]5uRpSOv"B2w{}/Ts1/VFk"P.ܧB$Q1f=Ň &Km/HA 4ߋ[Vs]<,!G^cKS >n=Y6sa+D D/Fs]ŤC_GdzpB9ck`ػyW{o[9?+HD9)(K7et~k'Qr;q;ҟ8ilHd?o5Q`{H򥯯rGKʕjT`uŐR8aFG}} m_Y>ڪV %)!,y`!B*`6sI飓֎0ΰϷTDem, 9&qҨ8DSM*=j*h-6AhuEe{0Fy֖~xkn83,HRJ+ky ze|+uܐlsi-fUqդtw.H \/Si'Fr)mBdZ^/K#B5j G N"!%]r 34'~1H5Iz#}[7-" "~k *a~wac8|̓傏DqОMHU8-%)SxXb9:Y1Pu;voyP`0!:gɺ|Bv]l l J;Fg>jw_/vm꬚A2kH-Aɠs =U^bfJbg^S1wW)k܋O 8kLRpޢjd9YPY#DLIz΅,%e;lQȍGYPiVt %Z)~<̗_I,4tst5<\'-r\+2~-Wnlvו_+*׆ѼgN~"7 ۽ mXFX'AL^N\ϒqq{(;m~..p drC|ZxnqCO iHRUDѺDsrfz)8-v+afM hUk3S6 ڃ m5`G8B晠_ٞaCkkt \qQz$A4F ׎Md:.«% ΔBG 0V-C {C<=,ИȫY' SsQC?m+x}ل-)- pg<PX|Y92Db1;=ǒ; A*겮o1uzB ws/:?*03=Y.H`º8B6W)<3"VlU"0!9lA&3C$x}n'lN$'B< vYAz-L:UOfuE^k}BFLcC{tQ?A&%#\!HHFuUa1dVeA_ڈ4:к\'Y+%PgWih~ -y^bڷJBR:oO>RRA|PFh 3OLtrV;Q495]HR]D%7zwp|d|8ژ4?pU+r#7B6>V[JgEμ9UhhFop{_k[?נxA6{ڑ>Y= S%]6Q^O Gq&*xT\*5)n [f $DYzP  .ك kEXҭs=fO;4ѣeMdngWgh*<DCˮOz߃#~*{.Suf%J,dFmEl#0x+]ʵn' pNAu9 (+c#>/XsS&}wE|ogEdi"mގv}6%yw8ծG' Ne[:'GP.K$}0h\;vWq-jivKEM3O`AP"%,sD?6~FezX&Y b<|AD#q5{(. [/ISC V -~jz4 E\_zW\o0r=j߫7ю1SG,c{/8jz. BO@6T]l pjؖZ[}y\?4]Ѩe?\0z|Wۨ;oj/ؽGmKpl (O)󔄈e+ &kqqtP~_}Z͞:m1SB ^9obՌvq-LhLлn:ZG\C@й>jߣۋ6ࠍ/O|  ǏeM45*(N Cπ TcE ؜:,٭a05U ӴrzQ]D$ސSv$X6>h+b>Xnxwqf>EgLD iik0Z@,L"iGѾk|k[49$ 0aZ ysKAxC;ZD+.zIlgqvՋ`j|M0y9}Z3Ԃ" 3& ̽nYA~q" <t`-*$gڄ>.%|0'ϜUV$PU\kZqf$q@v= wsRM"[)?bRQZdBD =鳭8J3UCÜߨM`+%|}{^kQ+ftBR1T^vv}ݤArE'̺~T2)̟\Wv#iQ-WLף{)KUO0j-ڊ6zи/|bM&y#W[r;[盒u?eP\ӱ,YaDw[J,Ҕjt-0ߥ%: 4]Hy%idAFtZr<Â[BAݐ- gg&Dsў<Kݱ6EpC~s,A-:-VGNu g7&~(p+<$ uD…}_-s7'4xz|آm)E~ß~,+czT'3 뱙 ^SkZzB̹z8yw\.^|WSgn.FG.󢠑eenK)i$Q.aS2/[)L)8ম Յ7+%mژ$LlƚZQ&gޝxb&r ]$c/ܑ=.+wB>GOasj{䇷ȑ{iGR`L2fJ<}ϡ IW{Ţ L#Ge#b w3 8:q_{`FS8ү~ 'oMRz wapЗ5fFVu7䵊N2e>Tɳ 9)虦k X[8<:F́ y$Ɍ% L1B`@(юoM⎀d"5)څ( lڈG'9p;gd#J=H8Ww46=9fo5f9+R^|GYDh\3q;އD}&MI .IF$CQXw}UY!x|&9}Oi}Z('Eο Py9o|\biƍ=Y~ϯ'3k(6Q KǥP{{[z踜O}pߩ4Zg@k(w㫧\ӘKx5Η 5Ps!'NseϘ+q 䉬!Wj=KWF/3uv`GFHNdQb.$Mj86(?掇q$Snz]gvfD( {iߪ1ipr߮qH M7V'uvQeVs8L:݀P| N b6DsY-㥼X:~Ulth '5C Ow= |y;p)!*saVoBKTCgd--P)0,E'a`wAwCY[7i X p/R~uL"0 4do4%a ]a`j(eZn|ow8Sݩ>U_Ki%ᒣ[gpW uv#+D^?m$[;Q;p=mx.c^"%-*gl~dgQ%')mIĦl4뿚_뼉]gqaHhq7WIщGT߻'~)7~4s dWYE\s 1ҍ~WRD`I>3 ǟ+HNYRn1hT 9JӦepC~ ЛK۶Ŏ7n8LD&vRRF͒`:B JV% QS>lT{B wO\HS!btL͢OHa{X b9ݥj^iPZOi3Y.2܁[Iև7oD5dCF!zlL4dE?:Sr5)Ka1Zɛ*(/׿]LÞI&V%$: [2۶_>UN4 Kt;;蔖lZCM>ёJ"fwlĎ27B_N62oN1s<截xIM=b̦ Ȗ 1X,F}$ȍ^ aLntǀh]c>~藳 S™<|*5e_ 6lD~}X:,YOeUVZpocsXMH#%g:RMiRG e%X G;Y6jDnj!{]]lB rꋏ[z{ASC@:I)R%ѫb.0[X*R)E|b8볝5ʧT+ 7аeVor0%+OQ~1*9E8(\jb4`,C],6xb$c?cNC2>mlQ 9ue.+s jYUk1[sVo.ZrFR^pRUk%BSN z8w[%!';IZ(~?Fm$6\ H3i2alaT۰oY ]#YjtgZq'94ҐyOxp c{+>[FSqv:_qFJH~Gӳ@LK1ٟK 1Ӥؐrs tM04s܃g~[ERzp0W[% .95Ib"jgqBPzG7ԍZV( Q.Ni2O:& ڇcO 4u}x ͊CR~Oa ZDΫ0~ zB0^wKꀓ8 ЈRCq+Jѱu:.,49'XZI@f):Ei\4"V#[׸X ǿm|scR8+uGwySd[5Tyvv3"G5m(Ji& 2hV>EL!& nYJ;UIʄỉ9j@d~J7bD^?%Y G&xj8})x |w@[%Z]OixGhh|qr<;~8DXn|h=r΍EՃZ(6T`0IZ!kgl7{81Ց !]laml:ԡL]BV هzOMXK[BG0zD JpMgC˦W5Ӽө!+ TDʝE`ˬ;O4`1⓰Dj~b[;aR)߷%0G9^if*18Kc2e|yQ6u'&%N*ծ .`9qяPPA[jN=C|rq}fDQ`×C p`8z-ZPBDBEpa62+ukom cSgC*MFkI#?vjJ(S M-JK];E y is"Lo67rS}MgОxpzJHj76Hj( \ba;S!߂.K#Jg ^w$܀4Fh{ӉMGLq! דg=ÍhV%,;:&ڙ!b >}\ Lzo sVBypeDZ߷D̿QW qYԞ4t\.bR:xa ΦS;$?kb}P;h}Wu ^PU Ԕ{֋9_ùpYǍ=[]{p@}\N#s6j33o䊸Psl-.+lgTs̲$Q3noPWR텨^>%Eƴ`\6^ށsb.9iѥI>6˷TUihИMS2ˮFO"/EX| ~kaFgf{7mHАn&<19P 3ԧ6L|xE@tߟ . my H7nRy $SPͧ\vF"]o }:NN7M0׼ Es[Jx~lRl[VZbrԝAX-"~BdaK_1-Gߦx,+2 p/QmMC*~2M-Lw*õo#t!*lt (}҉> ?>(*/D"R0ů`~=uIp|hup15¥J0Bd5}0tsD7 Q7cޖ W"}~/j|G~k&eh8_7kVRD%8_G4 0\Ir4So-N9DTOoߡM1,Or, 0)0HL.1=]Qy[}UtS0v\3FQ "A L=.mHy"z&FF)@Y2?ݝ#{^]MI`_{0>΅tr7qocI M_>,. ORf o,(ƳIf xdkRΰn),LR"c2Nøc*ޓЪ6CY2\[H[TȮrܿav8Z1D~XǷe[#s IH(~7;>TpUͣ ŭ.)^حr0jGN|CO{t7Ap0-2#ht5}5w#Ԭ}_&$Fsg*yrv3 4 =kixM7FC@DKZUX8dW 5W#ӷJ{c2M <ǗU_C!aB y|1>s_L]. F6¢>Bʙ39a*,L,\L.&g=44h)q-yJkZ$FfPp/i}wGO7-3xAiv%Y\N}8پOFY+zF7hv֜}I6HsB顑U{տR ."?mk̀yN,{p$S/k:[]C|,{CiMdZ\ bnSv \c?WCkÐNeQdۈ>ߺՠN]]Q2 yqԈqZTes=aJM M&= y(áwdg=EEKxRD!x7hQzqoH0ė|Z+7Im0o,u״A"Q3kݏY‹/f(6QǓ脏qWz,2S{NF[o9>TY~Wq@2~y̋0U1VZ+fQ+Rd?J^B ea0FlZłmdjQ.g> . Ҁ!<rELQ/k{T>9ȜŰ;G cqal\N!6E+1?#8 s},p4 aZ>5]xmՎH>N3(.<&F收 z=jߺ7u Mb*Wr ]0aw=o(+#5Yٲ{3?v^O,RN*fk3B.C 6jE-Qy=yP5!G)ە9pe>>8oDOB/ ^6FEn.18Wy=M*@3X"k`pﮚ CWlˠAF p9ZYg3`ػ K|}:^~d^^U@!jN*3hԃ"^F#Op~9_:+jT1C\3ת*bY^ԏ fNgQ2VsCokE|{;D(l,nNϟʒ :Z,hpۘ[1ȯ}JwVONL^ xh4=١՘wWkL>~ag}n86{'_U#mcddːZM0uKVL+!.vS w(,Y{pI3WopB?D+w"[gx+`>N7azkiH|2jk~{XU?R}=Cr<wm=Qu{O F3?;y$cVz~" NӹQ]W=BxXݎH2 r"= P[6IyWvFuOo[D]EX[ P" / {P\n i+]4!^ȐN+:E,U cʷ5Ӳ&o 29*زoA|wP:Y:|L߰hg,jYL8ST7ӮGlȥHz[UH羺6SB XnQuQAit'ނUۥ&Op h/vkJh M27 2t6 oCBwDB{$5Xs|N]y/:|pZpFƅXGɔ;8oي6:'>,'kU0\C )ȐǷ:!pAGh|2!NnvWn VC#^Kbs yVpM2Nݴ@by:wI`M K@jf Z8R.hΞeWHRqbԟ$1d Wid=1L=/z zG3JP{<`HhpѧStxMHi3l}=GvZFSX版s}umO22 9eZ~MdOَX r׺yH{S&UzbVi~tl΀E =C`I9DŽV=?f{=i `H2taA7w9Mɪ[1kU%Ș˙c-ot5 !9[VC"zD JW's٧?w=-&k+]9?/N/4##mzD+ڭi;;o@7B7`e趃*~,/#9QI}(Edz*7#!KT].ՊLݧ[ ܧFِz(-1M޲d. u:8uwp>+ $type = $column_types[$column[0]];

@@ -2,9 +2,8 @@
/**
*
* @package acp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -619,7 +618,7 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)
*/
function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_sync = true, $call_delete_posts = true)
{
- global $db, $config;
+ global $db, $config, $phpbb_container;
$approved_topics = 0;
$forum_ids = $topic_ids = array();
@@ -645,7 +644,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
'posts' => ($call_delete_posts) ? delete_posts($where_type, $where_ids, false, true, $post_count_sync, false) : 0,
);
- $sql = 'SELECT topic_id, forum_id, topic_approved, topic_moved_id
+ $sql = 'SELECT topic_id, forum_id, topic_visibility, topic_moved_id
FROM ' . TOPICS_TABLE . '
WHERE ' . $where_clause;
$result = $db->sql_query($sql);
@@ -655,7 +654,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
$forum_ids[] = $row['forum_id'];
$topic_ids[] = $row['topic_id'];
- if ($row['topic_approved'] && !$row['topic_moved_id'])
+ if ($row['topic_visibility'] == ITEM_APPROVED && !$row['topic_moved_id'])
{
$approved_topics++;
}
@@ -716,6 +715,14 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
set_config_count('num_topics', $approved_topics * (-1), true);
}
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->delete_notifications(array(
+ 'topic',
+ 'approve_topic',
+ 'topic_in_queue',
+ ), $topic_ids);
+
return $return;
}
@@ -724,7 +731,7 @@ function delete_topics($where_type, $where_ids, $auto_sync = true, $post_count_s
*/
function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = true, $post_count_sync = true, $call_delete_topics = true)
{
- global $db, $config, $phpbb_root_path, $phpEx;
+ global $db, $config, $phpbb_root_path, $phpEx, $auth, $user, $phpbb_container;
if ($where_type === 'range')
{
@@ -768,7 +775,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$approved_posts = 0;
$post_ids = $topic_ids = $forum_ids = $post_counts = $remove_topics = array();
- $sql = 'SELECT post_id, poster_id, post_approved, post_postcount, topic_id, forum_id
+ $sql = 'SELECT post_id, poster_id, post_visibility, post_postcount, topic_id, forum_id
FROM ' . POSTS_TABLE . '
WHERE ' . $where_clause;
$result = $db->sql_query($sql);
@@ -780,12 +787,12 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
$topic_ids[] = (int) $row['topic_id'];
$forum_ids[] = (int) $row['forum_id'];
- if ($row['post_postcount'] && $post_count_sync && $row['post_approved'])
+ if ($row['post_postcount'] && $post_count_sync && $row['post_visibility'] == ITEM_APPROVED)
{
$post_counts[$row['poster_id']] = (!empty($post_counts[$row['poster_id']])) ? $post_counts[$row['poster_id']] + 1 : 1;
}
- if ($row['post_approved'])
+ if ($row['post_visibility'] == ITEM_APPROVED)
{
$approved_posts++;
}
@@ -848,17 +855,15 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
}
// Remove the message from the search index
- $search_type = basename($config['search_type']);
+ $search_type = $config['search_type'];
- if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
+ if (!class_exists($search_type))
{
trigger_error('NO_SUCH_SEARCH_MODULE');
}
- include_once("{$phpbb_root_path}includes/search/$search_type.$phpEx");
-
$error = false;
- $search = new $search_type($error);
+ $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user);
if ($error)
{
@@ -884,7 +889,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
sync('forum', 'forum_id', $forum_ids, true, true);
}
- if ($approved_posts)
+ if ($approved_posts && $post_count_sync)
{
set_config_count('num_posts', $approved_posts * (-1), true);
}
@@ -895,6 +900,16 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =
delete_topics('topic_id', $remove_topics, $auto_sync, $post_count_sync, false);
}
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->delete_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ 'approve_post',
+ 'post_in_queue',
+ ), $post_ids);
+
return sizeof($post_ids);
}
@@ -1277,7 +1292,7 @@ function phpbb_unlink($filename, $mode = 'file', $entry_removed = false)
* - forum Resync complete forum
* - topic Resync topics
* - topic_moved Removes topic shadows that would be in the same forum as the topic they link to
-* - topic_approved Resyncs the topic_approved flag according to the status of the first post
+* - topic_visibility Resyncs the topic_visibility flag according to the status of the first post
* - post_reported Resyncs the post_reported flag, relying on actual reports
* - topic_reported Resyncs the topic_reported flag, relying on post_reported flags
* - post_attachement Same as post_reported, but with attachment flags
@@ -1297,7 +1312,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$where_ids = ($where_ids) ? array((int) $where_ids) : array();
}
- if ($mode == 'forum' || $mode == 'topic' || $mode == 'topic_approved' || $mode == 'topic_reported' || $mode == 'post_reported')
+ if ($mode == 'forum' || $mode == 'topic' || $mode == 'topic_visibility' || $mode == 'topic_reported' || $mode == 'post_reported')
{
if (!$where_type)
{
@@ -1383,43 +1398,55 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_transaction('commit');
break;
- case 'topic_approved':
+ case 'topic_visibility':
$db->sql_transaction('begin');
- switch ($db->sql_layer)
+
+ $sql = 'SELECT t.topic_id, p.post_visibility
+ FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
+ $where_sql_and p.topic_id = t.topic_id
+ AND p.post_visibility = " . ITEM_APPROVED;
+ $result = $db->sql_query($sql);
+
+ $topics_approved = array();
+ while ($row = $db->sql_fetchrow($result))
{
- case 'mysql4':
- case 'mysqli':
- $sql = 'UPDATE ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
- SET t.topic_approved = p.post_approved
- $where_sql_and t.topic_first_post_id = p.post_id";
- $db->sql_query($sql);
- break;
+ $topics_approved[] = (int) $row['topic_id'];
+ }
+ $db->sql_freeresult($result);
- default:
- $sql = 'SELECT t.topic_id, p.post_approved
- FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
- $where_sql_and p.post_id = t.topic_first_post_id
- AND p.post_approved <> t.topic_approved";
- $result = $db->sql_query($sql);
+ $sql = 'SELECT t.topic_id, p.post_visibility
+ FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
+ $where_sql_and " . $db->sql_in_set('t.topic_id', $topics_approved, true, true) . '
+ AND p.topic_id = t.topic_id
+ AND p.post_visibility = ' . ITEM_DELETED;
+ $result = $db->sql_query($sql);
- $topic_ids = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $topic_ids[] = $row['topic_id'];
- }
- $db->sql_freeresult($result);
+ $topics_softdeleted = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $topics_softdeleted[] = (int) $row['topic_id'];
+ }
+ $db->sql_freeresult($result);
- if (!sizeof($topic_ids))
- {
- return;
- }
+ $topics_softdeleted = array_diff($topics_softdeleted, $topics_approved);
+ $topics_not_unapproved = array_merge($topics_softdeleted, $topics_approved);
+ $update_ary = array(
+ ITEM_UNAPPROVED => (!empty($topics_not_unapproved)) ? $where_sql_and . ' ' . $db->sql_in_set('topic_id', $topics_not_unapproved, true) : '',
+ ITEM_APPROVED => (!empty($topics_approved)) ? ' WHERE ' . $db->sql_in_set('topic_id', $topics_approved) : '',
+ ITEM_DELETED => (!empty($topics_softdeleted)) ? ' WHERE ' . $db->sql_in_set('topic_id', $topics_softdeleted) : '',
+ );
+
+ foreach ($topic_visiblities as $visibility => $sql_where)
+ {
+ if ($sql_where)
+ {
$sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_approved = 1 - topic_approved
- WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
+ SET topic_visibility = ' . $visibility . '
+ ' . $sql_where;
$db->sql_query($sql);
- break;
+ }
}
$db->sql_transaction('commit');
@@ -1660,9 +1687,12 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$forum_data[$forum_id] = $row;
if ($sync_extra)
{
- $forum_data[$forum_id]['posts'] = 0;
- $forum_data[$forum_id]['topics'] = 0;
- $forum_data[$forum_id]['topics_real'] = 0;
+ $forum_data[$forum_id]['posts_approved'] = 0;
+ $forum_data[$forum_id]['posts_unapproved'] = 0;
+ $forum_data[$forum_id]['posts_softdeleted'] = 0;
+ $forum_data[$forum_id]['topics_approved'] = 0;
+ $forum_data[$forum_id]['topics_unapproved'] = 0;
+ $forum_data[$forum_id]['topics_softdeleted'] = 0;
}
$forum_data[$forum_id]['last_post_id'] = 0;
$forum_data[$forum_id]['last_post_subject'] = '';
@@ -1683,20 +1713,27 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// 2: Get topic counts for each forum (optional)
if ($sync_extra)
{
- $sql = 'SELECT forum_id, topic_approved, COUNT(topic_id) AS forum_topics
+ $sql = 'SELECT forum_id, topic_visibility, COUNT(topic_id) AS total_topics
FROM ' . TOPICS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_ids) . '
- GROUP BY forum_id, topic_approved';
+ GROUP BY forum_id, topic_visibility';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$forum_id = (int) $row['forum_id'];
- $forum_data[$forum_id]['topics_real'] += $row['forum_topics'];
- if ($row['topic_approved'])
+ if ($row['topic_visibility'] == ITEM_APPROVED)
+ {
+ $forum_data[$forum_id]['topics_approved'] = $row['total_topics'];
+ }
+ else if ($row['topic_visibility'] == ITEM_UNAPPROVED)
{
- $forum_data[$forum_id]['topics'] = $row['forum_topics'];
+ $forum_data[$forum_id]['topics_unapproved'] = $row['total_topics'];
+ }
+ else if ($row['topic_visibility'] == ITEM_DELETED)
+ {
+ $forum_data[$forum_id]['topics_softdeleted'] = $row['total_topics'];
}
}
$db->sql_freeresult($result);
@@ -1707,18 +1744,16 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
{
if (sizeof($forum_ids) == 1)
{
- $sql = 'SELECT SUM(t.topic_replies + 1) AS forum_posts
+ $sql = 'SELECT SUM(t.topic_posts_approved) AS forum_posts_approved, SUM(t.topic_posts_unapproved) AS forum_posts_unapproved, SUM(t.topic_posts_softdeleted) AS forum_posts_softdeleted
FROM ' . TOPICS_TABLE . ' t
WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
- AND t.topic_approved = 1
AND t.topic_status <> ' . ITEM_MOVED;
}
else
{
- $sql = 'SELECT t.forum_id, SUM(t.topic_replies + 1) AS forum_posts
+ $sql = 'SELECT t.forum_id, SUM(t.topic_posts_approved) AS forum_posts_approved, SUM(t.topic_posts_unapproved) AS forum_posts_unapproved, SUM(t.topic_posts_softdeleted) AS forum_posts_softdeleted
FROM ' . TOPICS_TABLE . ' t
WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
- AND t.topic_approved = 1
AND t.topic_status <> ' . ITEM_MOVED . '
GROUP BY t.forum_id';
}
@@ -1729,7 +1764,9 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
{
$forum_id = (sizeof($forum_ids) == 1) ? (int) $forum_ids[0] : (int) $row['forum_id'];
- $forum_data[$forum_id]['posts'] = (int) $row['forum_posts'];
+ $forum_data[$forum_id]['posts_approved'] = (int) $row['forum_posts_approved'];
+ $forum_data[$forum_id]['posts_unapproved'] = (int) $row['forum_posts_unapproved'];
+ $forum_data[$forum_id]['posts_softdeleted'] = (int) $row['forum_posts_softdeleted'];
}
$db->sql_freeresult($result);
}
@@ -1740,14 +1777,14 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$sql = 'SELECT MAX(t.topic_last_post_id) as last_post_id
FROM ' . TOPICS_TABLE . ' t
WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
- AND t.topic_approved = 1';
+ AND t.topic_visibility = ' . ITEM_APPROVED;
}
else
{
$sql = 'SELECT t.forum_id, MAX(t.topic_last_post_id) as last_post_id
FROM ' . TOPICS_TABLE . ' t
WHERE ' . $db->sql_in_set('t.forum_id', $forum_ids) . '
- AND t.topic_approved = 1
+ AND t.topic_visibility = ' . ITEM_APPROVED . '
GROUP BY t.forum_id';
}
@@ -1810,7 +1847,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
if ($sync_extra)
{
- array_push($fieldnames, 'posts', 'topics', 'topics_real');
+ array_push($fieldnames, 'posts_approved', 'posts_unapproved', 'posts_softdeleted', 'topics_approved', 'topics_unapproved', 'topics_softdeleted');
}
foreach ($forum_data as $forum_id => $row)
@@ -1845,11 +1882,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
break;
case 'topic':
- $topic_data = $post_ids = $approved_unapproved_ids = $resync_forums = $delete_topics = $delete_posts = $moved_topics = array();
+ $topic_data = $post_ids = $resync_forums = $delete_topics = $delete_posts = $moved_topics = array();
$db->sql_transaction('begin');
- $sql = 'SELECT t.topic_id, t.forum_id, t.topic_moved_id, t.topic_approved, ' . (($sync_extra) ? 't.topic_attachment, t.topic_reported, ' : '') . 't.topic_poster, t.topic_time, t.topic_replies, t.topic_replies_real, t.topic_first_post_id, t.topic_first_poster_name, t.topic_first_poster_colour, t.topic_last_post_id, t.topic_last_post_subject, t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_poster_colour, t.topic_last_post_time
+ $sql = 'SELECT t.topic_id, t.forum_id, t.topic_moved_id, t.topic_visibility, ' . (($sync_extra) ? 't.topic_attachment, t.topic_reported, ' : '') . 't.topic_poster, t.topic_time, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_first_post_id, t.topic_first_poster_name, t.topic_first_poster_colour, t.topic_last_post_id, t.topic_last_post_subject, t.topic_last_poster_id, t.topic_last_poster_name, t.topic_last_poster_colour, t.topic_last_post_time
FROM ' . TOPICS_TABLE . " t
$where_sql";
$result = $db->sql_query($sql);
@@ -1864,8 +1901,10 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$topic_id = (int) $row['topic_id'];
$topic_data[$topic_id] = $row;
- $topic_data[$topic_id]['replies_real'] = -1;
- $topic_data[$topic_id]['replies'] = 0;
+ $topic_data[$topic_id]['visibility'] = ITEM_UNAPPROVED;
+ $topic_data[$topic_id]['posts_approved'] = 0;
+ $topic_data[$topic_id]['posts_unapproved'] = 0;
+ $topic_data[$topic_id]['posts_softdeleted'] = 0;
$topic_data[$topic_id]['first_post_id'] = 0;
$topic_data[$topic_id]['last_post_id'] = 0;
unset($topic_data[$topic_id]['topic_id']);
@@ -1882,11 +1921,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$db->sql_freeresult($result);
// Use "t" as table alias because of the $where_sql clause
- // NOTE: 't.post_approved' in the GROUP BY is causing a major slowdown.
- $sql = 'SELECT t.topic_id, t.post_approved, COUNT(t.post_id) AS total_posts, MIN(t.post_id) AS first_post_id, MAX(t.post_id) AS last_post_id
+ // NOTE: 't.post_visibility' in the GROUP BY is causing a major slowdown.
+ $sql = 'SELECT t.topic_id, t.post_visibility, COUNT(t.post_id) AS total_posts, MIN(t.post_id) AS first_post_id, MAX(t.post_id) AS last_post_id
FROM ' . POSTS_TABLE . " t
$where_sql
- GROUP BY t.topic_id, t.post_approved";
+ GROUP BY t.topic_id, t.post_visibility";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -1907,14 +1946,38 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
// When we'll be done, only topics with no posts will remain
unset($delete_topics[$topic_id]);
- $topic_data[$topic_id]['replies_real'] += $row['total_posts'];
- $topic_data[$topic_id]['first_post_id'] = (!$topic_data[$topic_id]['first_post_id']) ? $row['first_post_id'] : min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']);
+ if ($row['post_visibility'] == ITEM_APPROVED)
+ {
+ $topic_data[$topic_id]['posts_approved'] = $row['total_posts'];
+ }
+ else if ($row['post_visibility'] == ITEM_UNAPPROVED)
+ {
+ $topic_data[$topic_id]['posts_unapproved'] = $row['total_posts'];
+ }
+ else if ($row['post_visibility'] == ITEM_DELETED)
+ {
+ $topic_data[$topic_id]['posts_softdeleted'] = $row['total_posts'];
+ }
- if ($row['post_approved'] || !$topic_data[$topic_id]['last_post_id'])
+ if ($row['post_visibility'] == ITEM_APPROVED)
{
- $topic_data[$topic_id]['replies'] = $row['total_posts'] - 1;
+ $topic_data[$topic_id]['visibility'] = ITEM_APPROVED;
+ $topic_data[$topic_id]['first_post_id'] = $row['first_post_id'];
$topic_data[$topic_id]['last_post_id'] = $row['last_post_id'];
}
+ else if ($topic_data[$topic_id]['visibility'] != ITEM_APPROVED)
+ {
+ // If there is no approved post, we take the min/max of the other visibilities
+ // for the last and first post info, because it is only visible to moderators anyway
+ $topic_data[$topic_id]['first_post_id'] = (!empty($topic_data[$topic_id]['first_post_id'])) ? min($topic_data[$topic_id]['first_post_id'], $row['first_post_id']) : $row['first_post_id'];
+ $topic_data[$topic_id]['last_post_id'] = max($topic_data[$topic_id]['last_post_id'], $row['last_post_id']);
+
+ if ($topic_data[$topic_id]['visibility'] == ITEM_UNAPPROVED)
+ {
+ // Soft delete status is stronger than unapproved.
+ $topic_data[$topic_id]['visibility'] = $row['post_visibility'];
+ }
+ }
}
}
$db->sql_freeresult($result);
@@ -1955,7 +2018,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
unset($delete_topics, $delete_topic_ids);
}
- $sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
+ $sql = 'SELECT p.post_id, p.topic_id, p.post_visibility, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
AND u.user_id = p.poster_id';
@@ -1968,10 +2031,6 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
if ($row['post_id'] == $topic_data[$topic_id]['first_post_id'])
{
- if ($topic_data[$topic_id]['topic_approved'] != $row['post_approved'])
- {
- $approved_unapproved_ids[] = $topic_id;
- }
$topic_data[$topic_id]['time'] = $row['post_time'];
$topic_data[$topic_id]['poster'] = $row['poster_id'];
$topic_data[$topic_id]['first_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'];
@@ -2032,7 +2091,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
$sync_shadow_topics = array();
if (sizeof($post_ids))
{
- $sql = 'SELECT p.post_id, p.topic_id, p.post_approved, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
+ $sql = 'SELECT p.post_id, p.topic_id, p.post_visibility, p.poster_id, p.post_subject, p.post_username, p.post_time, u.username, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
AND u.user_id = p.poster_id';
@@ -2099,18 +2158,8 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false,
unset($sync_shadow_topics, $shadow_topic_data);
}
- // approved becomes unapproved, and vice-versa
- if (sizeof($approved_unapproved_ids))
- {
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_approved = 1 - topic_approved
- WHERE ' . $db->sql_in_set('topic_id', $approved_unapproved_ids);
- $db->sql_query($sql);
- }
- unset($approved_unapproved_ids);
-
// These are fields that will be synchronised
- $fieldnames = array('time', 'replies', 'replies_real', 'poster', 'first_post_id', 'first_poster_name', 'first_poster_colour', 'last_post_id', 'last_post_subject', 'last_post_time', 'last_poster_id', 'last_poster_name', 'last_poster_colour');
+ $fieldnames = array('time', 'visibility', 'posts_approved', 'posts_unapproved', 'posts_softdeleted', 'poster', 'first_post_id', 'first_poster_name', 'first_poster_colour', 'last_post_id', 'last_post_subject', 'last_post_time', 'last_poster_id', 'last_poster_name', 'last_poster_colour');
if ($sync_extra)
{
@@ -2208,6 +2257,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync
if (!($prune_flags & FORUM_FLAG_PRUNE_ANNOUNCE))
{
$sql_and .= ' AND topic_type <> ' . POST_ANNOUNCE;
+ $sql_and .= ' AND topic_type <> ' . POST_GLOBAL;
}
if (!($prune_flags & FORUM_FLAG_PRUNE_STICKY))
@@ -2294,28 +2344,17 @@ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_fr
}
/**
-* remove_comments will strip the sql comment lines out of an uploaded sql file
-* specifically for mssql and postgres type files in the install....
+* Cache moderators. Called whenever permissions are changed
+* via admin_permissions. Changes of usernames and group names
+* must be carried through for the moderators table.
*
-* @deprecated Use phpbb_remove_comments() instead.
+* @param \phpbb\db\driver\driver $db Database connection
+* @param \phpbb\cache\driver\driver_interface Cache driver
+* @param \phpbb\auth\auth $auth Authentication object
+* @return null
*/
-function remove_comments(&$output)
+function phpbb_cache_moderators($db, $cache, $auth)
{
- // Remove /* */ comments (http://ostermiller.org/findcomment.html)
- $output = preg_replace('#/\*(.|[\r\n])*?\*/#', "\n", $output);
-
- // Return by reference and value.
- return $output;
-}
-
-/**
-* Cache moderators, called whenever permissions are changed via admin_permissions. Changes of username
-* and group names must be carried through for the moderators table
-*/
-function cache_moderators()
-{
- global $db, $cache, $auth, $phpbb_root_path, $phpEx;
-
// Remove cached sql results
$cache->destroy('sql', MODERATOR_CACHE_TABLE);
@@ -2345,7 +2384,7 @@ function cache_moderators()
$ug_id_ary = array_keys($hold_ary);
// Remove users who have group memberships with DENY moderator permissions
- $sql = $db->sql_build_query('SELECT', array(
+ $sql_ary_deny = array(
'SELECT' => 'a.forum_id, ug.user_id, g.group_id',
'FROM' => array(
@@ -2358,8 +2397,8 @@ function cache_moderators()
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
- 'ON' => 'a.auth_role_id = r.role_id'
- )
+ 'ON' => 'a.auth_role_id = r.role_id',
+ ),
),
'WHERE' => '(o.auth_option_id = a.auth_option_id OR o.auth_option_id = r.auth_option_id)
@@ -2371,7 +2410,8 @@ function cache_moderators()
AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . "
AND ug.user_pending = 0
AND o.auth_option " . $db->sql_like_expression('m_' . $db->any_char),
- ));
+ );
+ $sql = $db->sql_build_query('SELECT', $sql_ary_deny);
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -2485,303 +2525,60 @@ function cache_moderators()
}
/**
+* Cache moderators. Called whenever permissions are changed
+* via admin_permissions. Changes of usernames and group names
+* must be carried through for the moderators table.
+*
+* @deprecated 3.1
+* @return null
+*/
+function cache_moderators()
+{
+ global $db, $cache, $auth;
+ return phpbb_cache_moderators($db, $cache, $auth);
+}
+
+/**
* View log
-* If $log_count is set to false, we will skip counting all entries in the database.
+*
+* @param string $mode The mode defines which log_type is used and from which log the entry is retrieved
+* @param array &$log The result array with the logs
+* @param mixed &$log_count If $log_count is set to false, we will skip counting all entries in the database.
+* Otherwise an integer with the number of total matching entries is returned.
+* @param int $limit Limit the number of entries that are returned
+* @param int $offset Offset when fetching the log entries, f.e. when paginating
+* @param mixed $forum_id Restrict the log entries to the given forum_id (can also be an array of forum_ids)
+* @param int $topic_id Restrict the log entries to the given topic_id
+* @param int $user_id Restrict the log entries to the given user_id
+* @param int $log_time Only get log entries newer than the given timestamp
+* @param string $sort_by SQL order option, e.g. 'l.log_time DESC'
+* @param string $keywords Will only return log entries that have the keywords in log_operation or log_data
+*
+* @return int Returns the offset of the last valid page, if the specified offset was invalid (too high)
*/
function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $limit_days = 0, $sort_by = 'l.log_time DESC', $keywords = '')
{
- global $db, $user, $auth, $phpEx, $phpbb_root_path, $phpbb_admin_path;
-
- $topic_id_list = $reportee_id_list = $is_auth = $is_mod = array();
-
- $profile_url = (defined('IN_ADMIN')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&amp;mode=overview') : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile');
-
- switch ($mode)
- {
- case 'admin':
- $log_type = LOG_ADMIN;
- $sql_forum = '';
- break;
-
- case 'mod':
- $log_type = LOG_MOD;
- $sql_forum = '';
-
- if ($topic_id)
- {
- $sql_forum = 'AND l.topic_id = ' . (int) $topic_id;
- }
- else if (is_array($forum_id))
- {
- $sql_forum = 'AND ' . $db->sql_in_set('l.forum_id', array_map('intval', $forum_id));
- }
- else if ($forum_id)
- {
- $sql_forum = 'AND l.forum_id = ' . (int) $forum_id;
- }
- break;
-
- case 'user':
- $log_type = LOG_USERS;
- $sql_forum = 'AND l.reportee_id = ' . (int) $user_id;
- break;
-
- case 'users':
- $log_type = LOG_USERS;
- $sql_forum = '';
- break;
-
- case 'critical':
- $log_type = LOG_CRITICAL;
- $sql_forum = '';
- break;
-
- default:
- return;
- }
-
- // Use no preg_quote for $keywords because this would lead to sole backslashes being added
- // We also use an OR connection here for spaces and the | string. Currently, regex is not supported for searching (but may come later).
- $keywords = preg_split('#[\s|]+#u', utf8_strtolower($keywords), 0, PREG_SPLIT_NO_EMPTY);
- $sql_keywords = '';
-
- if (!empty($keywords))
- {
- $keywords_pattern = array();
-
- // Build pattern and keywords...
- for ($i = 0, $num_keywords = sizeof($keywords); $i < $num_keywords; $i++)
- {
- $keywords_pattern[] = preg_quote($keywords[$i], '#');
- $keywords[$i] = $db->sql_like_expression($db->any_char . $keywords[$i] . $db->any_char);
- }
-
- $keywords_pattern = '#' . implode('|', $keywords_pattern) . '#ui';
-
- $operations = array();
- foreach ($user->lang as $key => $value)
- {
- if (substr($key, 0, 4) == 'LOG_' && preg_match($keywords_pattern, $value))
- {
- $operations[] = $key;
- }
- }
-
- $sql_keywords = 'AND (';
- if (!empty($operations))
- {
- $sql_keywords .= $db->sql_in_set('l.log_operation', $operations) . ' OR ';
- }
- $sql_lower = $db->sql_lower_text('l.log_data');
- $sql_keywords .= "$sql_lower " . implode(" OR $sql_lower ", $keywords) . ')';
- }
-
- if ($log_count !== false)
- {
- $sql = 'SELECT COUNT(l.log_id) AS total_entries
- FROM ' . LOG_TABLE . ' l, ' . USERS_TABLE . " u
- WHERE l.log_type = $log_type
- AND l.user_id = u.user_id
- AND l.log_time >= $limit_days
- $sql_keywords
- $sql_forum";
- $result = $db->sql_query($sql);
- $log_count = (int) $db->sql_fetchfield('total_entries');
- $db->sql_freeresult($result);
- }
-
- // $log_count may be false here if false was passed in for it,
- // because in this case we did not run the COUNT() query above.
- // If we ran the COUNT() query and it returned zero rows, return;
- // otherwise query for logs below.
- if ($log_count === 0)
- {
- // Save the queries, because there are no logs to display
- return 0;
- }
-
- if ($offset >= $log_count)
- {
- $offset = ($offset - $limit < 0) ? 0 : $offset - $limit;
- }
-
- $sql = "SELECT l.*, u.username, u.username_clean, u.user_colour
- FROM " . LOG_TABLE . " l, " . USERS_TABLE . " u
- WHERE l.log_type = $log_type
- AND u.user_id = l.user_id
- " . (($limit_days) ? "AND l.log_time >= $limit_days" : '') . "
- $sql_keywords
- $sql_forum
- ORDER BY $sort_by";
- $result = $db->sql_query_limit($sql, $limit, $offset);
-
- $i = 0;
- $log = array();
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['topic_id'])
- {
- $topic_id_list[] = $row['topic_id'];
- }
-
- if ($row['reportee_id'])
- {
- $reportee_id_list[] = $row['reportee_id'];
- }
-
- $log[$i] = array(
- 'id' => $row['log_id'],
-
- 'reportee_id' => $row['reportee_id'],
- 'reportee_username' => '',
- 'reportee_username_full'=> '',
-
- 'user_id' => $row['user_id'],
- 'username' => $row['username'],
- 'username_full' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, $profile_url),
-
- 'ip' => $row['log_ip'],
- 'time' => $row['log_time'],
- 'forum_id' => $row['forum_id'],
- 'topic_id' => $row['topic_id'],
-
- 'viewforum' => ($row['forum_id'] && $auth->acl_get('f_read', $row['forum_id'])) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : false,
- 'action' => (isset($user->lang[$row['log_operation']])) ? $user->lang[$row['log_operation']] : '{' . ucfirst(str_replace('_', ' ', $row['log_operation'])) . '}',
- );
-
- if (!empty($row['log_data']))
- {
- $log_data_ary = @unserialize($row['log_data']);
- $log_data_ary = ($log_data_ary === false) ? array() : $log_data_ary;
-
- if (isset($user->lang[$row['log_operation']]))
- {
- // Check if there are more occurrences of % than arguments, if there are we fill out the arguments array
- // It doesn't matter if we add more arguments than placeholders
- if ((substr_count($log[$i]['action'], '%') - sizeof($log_data_ary)) > 0)
- {
- $log_data_ary = array_merge($log_data_ary, array_fill(0, substr_count($log[$i]['action'], '%') - sizeof($log_data_ary), ''));
- }
-
- $log[$i]['action'] = vsprintf($log[$i]['action'], $log_data_ary);
-
- // If within the admin panel we do not censor text out
- if (defined('IN_ADMIN'))
- {
- $log[$i]['action'] = bbcode_nl2br($log[$i]['action']);
- }
- else
- {
- $log[$i]['action'] = bbcode_nl2br(censor_text($log[$i]['action']));
- }
- }
- else if (!empty($log_data_ary))
- {
- $log[$i]['action'] .= '<br />' . implode('', $log_data_ary);
- }
+ global $phpbb_log;
- /* Apply make_clickable... has to be seen if it is for good. :/
- // Seems to be not for the moment, reconsider later...
- $log[$i]['action'] = make_clickable($log[$i]['action']);
- */
- }
+ $count_logs = ($log_count !== false);
- $i++;
- }
- $db->sql_freeresult($result);
+ $log = $phpbb_log->get_logs($mode, $count_logs, $limit, $offset, $forum_id, $topic_id, $user_id, $limit_days, $sort_by, $keywords);
+ $log_count = $phpbb_log->get_log_count();
- if (sizeof($topic_id_list))
- {
- $topic_id_list = array_unique($topic_id_list);
-
- // This query is not really needed if move_topics() updates the forum_id field,
- // although it's also used to determine if the topic still exists in the database
- $sql = 'SELECT topic_id, forum_id
- FROM ' . TOPICS_TABLE . '
- WHERE ' . $db->sql_in_set('topic_id', array_map('intval', $topic_id_list));
- $result = $db->sql_query($sql);
-
- $default_forum_id = 0;
-
- while ($row = $db->sql_fetchrow($result))
- {
- if (!$row['forum_id'])
- {
- if ($auth->acl_getf_global('f_read'))
- {
- if (!$default_forum_id)
- {
- $sql = 'SELECT forum_id
- FROM ' . FORUMS_TABLE . '
- WHERE forum_type = ' . FORUM_POST;
- $f_result = $db->sql_query_limit($sql, 1);
- $default_forum_id = (int) $db->sql_fetchfield('forum_id', false, $f_result);
- $db->sql_freeresult($f_result);
- }
-
- $is_auth[$row['topic_id']] = $default_forum_id;
- }
- }
- else
- {
- if ($auth->acl_get('f_read', $row['forum_id']))
- {
- $is_auth[$row['topic_id']] = $row['forum_id'];
- }
- }
-
- if ($auth->acl_gets('a_', 'm_', $row['forum_id']))
- {
- $is_mod[$row['topic_id']] = $row['forum_id'];
- }
- }
- $db->sql_freeresult($result);
-
- foreach ($log as $key => $row)
- {
- $log[$key]['viewtopic'] = (isset($is_auth[$row['topic_id']])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $is_auth[$row['topic_id']] . '&amp;t=' . $row['topic_id']) : false;
- $log[$key]['viewlogs'] = (isset($is_mod[$row['topic_id']])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&amp;mode=topic_logs&amp;t=' . $row['topic_id'], true, $user->session_id) : false;
- }
- }
-
- if (sizeof($reportee_id_list))
- {
- $reportee_id_list = array_unique($reportee_id_list);
- $reportee_names_list = array();
-
- $sql = 'SELECT user_id, username, user_colour
- FROM ' . USERS_TABLE . '
- WHERE ' . $db->sql_in_set('user_id', $reportee_id_list);
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $reportee_names_list[$row['user_id']] = $row;
- }
- $db->sql_freeresult($result);
-
- foreach ($log as $key => $row)
- {
- if (!isset($reportee_names_list[$row['reportee_id']]))
- {
- continue;
- }
-
- $log[$key]['reportee_username'] = $reportee_names_list[$row['reportee_id']]['username'];
- $log[$key]['reportee_username_full'] = get_username_string('full', $row['reportee_id'], $reportee_names_list[$row['reportee_id']]['username'], $reportee_names_list[$row['reportee_id']]['user_colour'], false, $profile_url);
- }
- }
-
- return $offset;
+ return $phpbb_log->get_valid_offset();
}
/**
-* Update foes - remove moderators and administrators from foe lists...
+* Removes moderators and administrators from foe lists.
+*
+* @param \phpbb\db\driver\driver $db Database connection
+* @param \phpbb\auth\auth $auth Authentication object
+* @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
+* @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
+* @return null
*/
-function update_foes($group_id = false, $user_id = false)
+function phpbb_update_foes($db, $auth, $group_id = false, $user_id = false)
{
- global $db, $auth;
-
// update foes for some user
if (is_array($user_id) && sizeof($user_id))
{
@@ -2796,18 +2593,18 @@ function update_foes($group_id = false, $user_id = false)
if (is_array($group_id) && sizeof($group_id))
{
// Grab group settings...
- $sql = $db->sql_build_query('SELECT', array(
+ $sql_ary = array(
'SELECT' => 'a.group_id',
'FROM' => array(
ACL_OPTIONS_TABLE => 'ao',
- ACL_GROUPS_TABLE => 'a'
+ ACL_GROUPS_TABLE => 'a',
),
'LEFT_JOIN' => array(
array(
'FROM' => array(ACL_ROLES_DATA_TABLE => 'r'),
- 'ON' => 'a.auth_role_id = r.role_id'
+ 'ON' => 'a.auth_role_id = r.role_id',
),
),
@@ -2815,8 +2612,9 @@ function update_foes($group_id = false, $user_id = false)
AND ' . $db->sql_in_set('a.group_id', $group_id) . "
AND ao.auth_option IN ('a_', 'm_')",
- 'GROUP_BY' => 'a.group_id'
- ));
+ 'GROUP_BY' => 'a.group_id',
+ );
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql);
$groups = array();
@@ -2890,6 +2688,20 @@ function update_foes($group_id = false, $user_id = false)
}
/**
+* Removes moderators and administrators from foe lists.
+*
+* @deprecated 3.1
+* @param array|bool $group_id If an array, remove all members of this group from foe lists, or false to ignore
+* @param array|bool $user_id If an array, remove this user from foe lists, or false to ignore
+* @return null
+*/
+function update_foes($group_id = false, $user_id = false)
+{
+ global $db, $auth;
+ return phpbb_update_foes($db, $auth, $group_id, $user_id);
+}
+
+/**
* Lists inactive users
*/
function view_inactive_users(&$users, &$user_count, $limit = 0, $offset = 0, $limit_days = 0, $sort_by = 'user_inactive_time DESC')
@@ -3262,38 +3074,29 @@ function tidy_database()
*/
function add_permission_language()
{
- global $user, $phpEx;
+ global $user, $phpEx, $phpbb_extension_manager;
- // First of all, our own file. We need to include it as the first file because it presets all relevant variables.
- $user->add_lang('acp/permissions_phpbb');
+ // add permission language files from extensions
+ $finder = $phpbb_extension_manager->get_finder();
- $files_to_add = array();
+ $lang_files = $finder
+ ->prefix('permissions_')
+ ->suffix(".$phpEx")
+ ->core_path('language/' . $user->lang_name . '/')
+ ->extension_directory('/language/' . $user->lang_name)
+ ->find();
- // Now search in acp and mods folder for permissions_ files.
- foreach (array('acp/', 'mods/') as $path)
+ foreach ($lang_files as $lang_file => $ext_name)
{
- $dh = @opendir($user->lang_path . $user->lang_name . '/' . $path);
-
- if ($dh)
+ if ($ext_name === '/')
{
- while (($file = readdir($dh)) !== false)
- {
- if ($file !== 'permissions_phpbb.' . $phpEx && strpos($file, 'permissions_') === 0 && substr($file, -(strlen($phpEx) + 1)) === '.' . $phpEx)
- {
- $files_to_add[] = $path . substr($file, 0, -(strlen($phpEx) + 1));
- }
- }
- closedir($dh);
+ $user->add_lang($lang_file);
+ }
+ else
+ {
+ $user->add_lang_ext($ext_name, $lang_file);
}
}
-
- if (!sizeof($files_to_add))
- {
- return false;
- }
-
- $user->add_lang($files_to_add);
- return true;
}
/**
@@ -3354,5 +3157,3 @@ function enable_bitfield_column_flag($table_name, $column_name, $flag, $sql_more
' . $sql_more;
$db->sql_query($sql);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_compatibility.php b/phpBB/includes/functions_compatibility.php
new file mode 100644
index 0000000000..2197815087
--- /dev/null
+++ b/phpBB/includes/functions_compatibility.php
@@ -0,0 +1,50 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Get user avatar
+*
+* @deprecated 3.1.0-a1 (To be removed: 3.3.0)
+*
+* @param string $avatar Users assigned avatar name
+* @param int $avatar_type Type of avatar
+* @param string $avatar_width Width of users avatar
+* @param string $avatar_height Height of users avatar
+* @param string $alt Optional language string for alt tag within image, can be a language key or text
+* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
+*
+* @return string Avatar image
+*/
+function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $alt = 'USER_AVATAR', $ignore_config = false)
+{
+ // map arguments to new function phpbb_get_avatar()
+ $row = array(
+ 'avatar' => $avatar,
+ 'avatar_type' => $avatar_type,
+ 'avatar_width' => $avatar_width,
+ 'avatar_height' => $avatar_height,
+ );
+
+ if (!function_exists('phpbb_get_avatar'))
+ {
+ global $phpbb_root_path, $phpEx;
+
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
+
+ return phpbb_get_avatar($row, $alt, $ignore_config);
+}
diff --git a/phpBB/includes/functions_compress.php b/phpBB/includes/functions_compress.php
index 455debd939..c79a31930e 100644
--- a/phpBB/includes/functions_compress.php
+++ b/phpBB/includes/functions_compress.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -25,6 +24,11 @@ class compress
var $fp = 0;
/**
+ * @var array
+ */
+ protected $filelist = array();
+
+ /**
* Add file to archive
*/
function add_file($src, $src_rm_prefix = '', $src_add_prefix = '', $skip_files = '')
@@ -124,9 +128,41 @@ class compress
}
/**
+ * Checks if a file by that name as already been added and, if it has,
+ * returns a new, unique name.
+ *
+ * @param string $name The filename
+ * @return string A unique filename
+ */
+ protected function unique_filename($name)
+ {
+ if (isset($this->filelist[$name]))
+ {
+ $start = $name;
+ $ext = '';
+ $this->filelist[$name]++;
+
+ // Separate the extension off the end of the filename to preserve it
+ $pos = strrpos($name, '.');
+ if ($pos !== false)
+ {
+ $start = substr($name, 0, $pos);
+ $ext = substr($name, $pos);
+ }
+
+ return $start . '_' . $this->filelist[$name] . $ext;
+ }
+
+ $this->filelist[$name] = 0;
+ return $name;
+ }
+
+ /**
* Return available methods
+ *
+ * @return array Array of strings of available compression methods (.tar, .tar.gz, .zip, etc.)
*/
- function methods()
+ static public function methods()
{
$methods = array('.tar');
$available_methods = array('.tar.gz' => 'zlib', '.tar.bz2' => 'bz2', '.zip' => 'zlib');
@@ -362,6 +398,7 @@ class compress_zip extends compress
function data($name, $data, $is_dir = false, $stat)
{
$name = str_replace('\\', '/', $name);
+ $name = $this->unique_filename($name);
$hexdtime = pack('V', $this->unix_to_dos_time($stat[9]));
@@ -634,6 +671,7 @@ class compress_tar extends compress
*/
function data($name, $data, $is_dir = false, $stat)
{
+ $name = $this->unique_filename($name);
$this->wrote = true;
$fzwrite = ($this->isbz && function_exists('bzwrite')) ? 'bzwrite' : (($this->isgz && @extension_loaded('zlib')) ? 'gzwrite' : 'fwrite');
@@ -735,5 +773,3 @@ class compress_tar extends compress
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_container.php b/phpBB/includes/functions_container.php
new file mode 100644
index 0000000000..667d27fd20
--- /dev/null
+++ b/phpBB/includes/functions_container.php
@@ -0,0 +1,287 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+use Symfony\Component\Config\FileLocator;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
+use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Get DB connection from config.php.
+*
+* Used to bootstrap the container.
+*
+* @param string $config_file
+* @return \phpbb\db\driver\driver
+*/
+function phpbb_bootstrap_db_connection($config_file)
+{
+ require($config_file);
+ $dbal_driver_class = phpbb_convert_30_dbms_to_31($dbms);
+
+ $db = new $dbal_driver_class();
+ $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, defined('PHPBB_DB_NEW_LINK'));
+
+ return $db;
+}
+
+/**
+* Get table prefix from config.php.
+*
+* Used to bootstrap the container.
+*
+* @param string $config_file
+* @return string table prefix
+*/
+function phpbb_bootstrap_table_prefix($config_file)
+{
+ require($config_file);
+ return $table_prefix;
+}
+
+/**
+* Get enabled extensions.
+*
+* Used to bootstrap the container.
+*
+* @param string $config_file
+* @param string $phpbb_root_path
+* @return array enabled extensions
+*/
+function phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path)
+{
+ $db = phpbb_bootstrap_db_connection($config_file);
+ $table_prefix = phpbb_bootstrap_table_prefix($config_file);
+ $extension_table = $table_prefix.'ext';
+
+ $sql = 'SELECT *
+ FROM ' . $extension_table . '
+ WHERE ext_active = 1';
+
+ $result = $db->sql_query($sql);
+ $rows = $db->sql_fetchrowset($result);
+ $db->sql_freeresult($result);
+
+ $exts = array();
+ foreach ($rows as $row)
+ {
+ $exts[$row['ext_name']] = $phpbb_root_path . 'ext/' . $row['ext_name'] . '/';
+ }
+
+ return $exts;
+}
+
+/**
+* Create the ContainerBuilder object
+*
+* @param array $extensions Array of Container extension objects
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return ContainerBuilder object
+*/
+function phpbb_create_container(array $extensions, $phpbb_root_path, $php_ext)
+{
+ $container = new ContainerBuilder();
+
+ foreach ($extensions as $extension)
+ {
+ $container->registerExtension($extension);
+ $container->loadFromExtension($extension->getAlias());
+ }
+
+ $container->setParameter('core.root_path', $phpbb_root_path);
+ $container->setParameter('core.php_ext', $php_ext);
+
+ return $container;
+}
+
+/**
+* Create installer container
+*
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return ContainerBuilder object
+*/
+function phpbb_create_install_container($phpbb_root_path, $php_ext)
+{
+ $other_config_path = $phpbb_root_path . 'install/update/new/config/';
+ $config_path = file_exists($other_config_path . 'services.yml') ? $other_config_path : $phpbb_root_path . 'config/';
+
+ $core = new \phpbb\di\extension\core($config_path);
+ $container = phpbb_create_container(array($core), $phpbb_root_path, $php_ext);
+
+ $container->setParameter('core.root_path', $phpbb_root_path);
+ $container->setParameter('core.adm_relative_path', $phpbb_adm_relative_path);
+ $container->setParameter('core.php_ext', $php_ext);
+ $container->setParameter('core.table_prefix', '');
+
+ $container->register('dbal.conn')->setSynthetic(true);
+
+ $container->setAlias('cache.driver', 'cache.driver.install');
+
+ $container->compile();
+
+ return $container;
+}
+
+/**
+* Create updater container
+*
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @param array $config_path Path to config directory
+* @return ContainerBuilder object (compiled)
+*/
+function phpbb_create_update_container($phpbb_root_path, $php_ext, $config_path)
+{
+ $config_file = $phpbb_root_path . 'config.' . $php_ext;
+ return phpbb_create_compiled_container(
+ $config_file,
+ array(
+ new phpbb\di\extension\config($config_file),
+ new phpbb\di\extension\core($config_path),
+ ),
+ array(
+ new phpbb\di\pass\collection_pass(),
+ new phpbb\di\pass\kernel_pass(),
+ ),
+ $phpbb_root_path,
+ $php_ext
+ );
+}
+
+/**
+* Create a compiled ContainerBuilder object
+*
+* @param array $extensions Array of Container extension objects
+* @param array $passes Array of Compiler Pass objects
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return ContainerBuilder object (compiled)
+*/
+function phpbb_create_compiled_container($config_file, array $extensions, array $passes, $phpbb_root_path, $php_ext)
+{
+ // Create the final container to be compiled and cached
+ $container = phpbb_create_container($extensions, $phpbb_root_path, $php_ext);
+
+ // Compile the container
+ foreach ($passes as $pass)
+ {
+ $container->addCompilerPass($pass);
+ }
+ $container->compile();
+
+ return $container;
+}
+
+/**
+* Create a compiled and dumped ContainerBuilder object
+*
+* @param array $extensions Array of Container extension objects
+* @param array $passes Array of Compiler Pass objects
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return ContainerBuilder object (compiled)
+*/
+function phpbb_create_dumped_container($config_file, array $extensions, array $passes, $phpbb_root_path, $php_ext)
+{
+ // Check for our cached container; if it exists, use it
+ $container_filename = phpbb_container_filename($phpbb_root_path, $php_ext);
+ if (file_exists($container_filename))
+ {
+ require($container_filename);
+ return new phpbb_cache_container();
+ }
+
+ $container = phpbb_create_compiled_container($config_file, $extensions, $passes, $phpbb_root_path, $php_ext);
+
+ // Lastly, we create our cached container class
+ $dumper = new PhpDumper($container);
+ $cached_container_dump = $dumper->dump(array(
+ 'class' => 'phpbb_cache_container',
+ 'base_class' => 'Symfony\\Component\\DependencyInjection\\ContainerBuilder',
+ ));
+
+ file_put_contents($container_filename, $cached_container_dump);
+
+ return $container;
+}
+
+/**
+* Create an environment-specific ContainerBuilder object
+*
+* If debug is enabled, the container is re-compiled every time.
+* This ensures that the latest changes will always be reflected
+* during development.
+*
+* Otherwise it will get the existing dumped container and use
+* that one instead.
+*
+* @param array $extensions Array of Container extension objects
+* @param array $passes Array of Compiler Pass objects
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return ContainerBuilder object (compiled)
+*/
+function phpbb_create_dumped_container_unless_debug($config_file, array $extensions, array $passes, $phpbb_root_path, $php_ext)
+{
+ $container_factory = defined('DEBUG') ? 'phpbb_create_compiled_container' : 'phpbb_create_dumped_container';
+ return $container_factory($config_file, $extensions, $passes, $phpbb_root_path, $php_ext);
+}
+
+/**
+* Create a default ContainerBuilder object
+*
+* Contains the default configuration of the phpBB container.
+*
+* @param array $extensions Array of Container extension objects
+* @param array $passes Array of Compiler Pass objects
+* @return ContainerBuilder object (compiled)
+*/
+function phpbb_create_default_container($phpbb_root_path, $php_ext)
+{
+ $config_file = $phpbb_root_path . 'config.' . $php_ext;
+ $installed_exts = phpbb_bootstrap_enabled_exts($config_file, $phpbb_root_path);
+
+ return phpbb_create_dumped_container_unless_debug(
+ $config_file,
+ array(
+ new \phpbb\di\extension\config($config_file),
+ new \phpbb\di\extension\core($phpbb_root_path . 'config'),
+ new \phpbb\di\extension\ext($installed_exts),
+ ),
+ array(
+ new \phpbb\di\pass\collection_pass(),
+ new \phpbb\di\pass\kernel_pass(),
+ ),
+ $phpbb_root_path,
+ $php_ext
+ );
+}
+
+/**
+* Get the filename under which the dumped container will be stored.
+*
+* @param string $phpbb_root_path Root path
+* @param string $php_ext PHP Extension
+* @return Path for dumped container
+*/
+function phpbb_container_filename($phpbb_root_path, $php_ext)
+{
+ $filename = str_replace(array('/', '.'), array('slash', 'dot'), $phpbb_root_path);
+ return $phpbb_root_path . 'cache/container_' . $filename . '.' . $php_ext;
+}
diff --git a/phpBB/includes/functions_content.php b/phpBB/includes/functions_content.php
index 6213d2fd24..863450a4b2 100644
--- a/phpBB/includes/functions_content.php
+++ b/phpBB/includes/functions_content.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -409,16 +408,34 @@ function strip_bbcode(&$text, $uid = '')
* For display of custom parsed text on user-facing pages
* Expects $text to be the value directly from the database (stored value)
*/
-function generate_text_for_display($text, $uid, $bitfield, $flags)
+function generate_text_for_display($text, $uid, $bitfield, $flags, $censor_text = true)
{
static $bbcode;
+ global $phpbb_dispatcher;
if ($text === '')
{
return '';
}
- $text = censor_text($text);
+ /**
+ * Use this event to modify the text before it is parsed
+ *
+ * @event core.modify_text_for_display_before
+ * @var string text The text to parse
+ * @var string uid The BBCode UID
+ * @var string bitfield The BBCode Bitfield
+ * @var int flags The BBCode Flags
+ * @var bool censor_text Whether or not to apply word censors
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'uid', 'bitfield', 'flags', 'censor_text');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_before', compact($vars)));
+
+ if ($censor_text)
+ {
+ $text = censor_text($text);
+ }
// Parse bbcode if bbcode uid stored and bbcode enabled
if ($uid && ($flags & OPTION_FLAG_BBCODE))
@@ -444,6 +461,19 @@ function generate_text_for_display($text, $uid, $bitfield, $flags)
$text = bbcode_nl2br($text);
$text = smiley_text($text, !($flags & OPTION_FLAG_SMILIES));
+ /**
+ * Use this event to modify the text after it is parsed
+ *
+ * @event core.modify_text_for_display_after
+ * @var string text The text to parse
+ * @var string uid The BBCode UID
+ * @var string bitfield The BBCode Bitfield
+ * @var int flags The BBCode Flags
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'uid', 'bitfield', 'flags');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_display_after', compact($vars)));
+
return $text;
}
@@ -454,7 +484,23 @@ function generate_text_for_display($text, $uid, $bitfield, $flags)
*/
function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bbcode = false, $allow_urls = false, $allow_smilies = false)
{
- global $phpbb_root_path, $phpEx;
+ global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
+
+ /**
+ * Use this event to modify the text before it is prepared for storage
+ *
+ * @event core.modify_text_for_storage_before
+ * @var string text The text to parse
+ * @var string uid The BBCode UID
+ * @var string bitfield The BBCode Bitfield
+ * @var int flags The BBCode Flags
+ * @var bool allow_bbcode Whether or not to parse BBCode
+ * @var bool allow_urls Whether or not to parse URLs
+ * @var bool allow_smilies Whether or not to parse Smilies
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'uid', 'bitfield', 'flags', 'allow_bbcode', 'allow_urls', 'allow_smilies');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_before', compact($vars)));
$uid = $bitfield = '';
$flags = (($allow_bbcode) ? OPTION_FLAG_BBCODE : 0) + (($allow_smilies) ? OPTION_FLAG_SMILIES : 0) + (($allow_urls) ? OPTION_FLAG_LINKS : 0);
@@ -483,6 +529,19 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
$bitfield = $message_parser->bbcode_bitfield;
+ /**
+ * Use this event to modify the text after it is prepared for storage
+ *
+ * @event core.modify_text_for_storage_after
+ * @var string text The text to parse
+ * @var string uid The BBCode UID
+ * @var string bitfield The BBCode Bitfield
+ * @var int flags The BBCode Flags
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'uid', 'bitfield', 'flags');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_storage_after', compact($vars)));
+
return;
}
@@ -492,10 +551,33 @@ function generate_text_for_storage(&$text, &$uid, &$bitfield, &$flags, $allow_bb
*/
function generate_text_for_edit($text, $uid, $flags)
{
- global $phpbb_root_path, $phpEx;
+ global $phpbb_root_path, $phpEx, $phpbb_dispatcher;
+
+ /**
+ * Use this event to modify the text before it is decoded for editing
+ *
+ * @event core.modify_text_for_edit_before
+ * @var string text The text to parse
+ * @var string uid The BBCode UID
+ * @var int flags The BBCode Flags
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'uid', 'flags');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_before', compact($vars)));
decode_message($text, $uid);
+ /**
+ * Use this event to modify the text after it is decoded for editing
+ *
+ * @event core.modify_text_for_edit_after
+ * @var string text The text to parse
+ * @var int flags The BBCode Flags
+ * @since 3.1-A1
+ */
+ $vars = array('text', 'flags');
+ extract($phpbb_dispatcher->trigger_event('core.modify_text_for_edit_after', compact($vars)));
+
return array(
'allow_bbcode' => ($flags & OPTION_FLAG_BBCODE) ? 1 : 0,
'allow_smilies' => ($flags & OPTION_FLAG_SMILIES) ? 1 : 0,
@@ -645,37 +727,58 @@ function make_clickable($text, $server_url = false, $class = 'postlink')
$server_url = generate_board_url();
}
- static $magic_url_match;
- static $magic_url_replace;
static $static_class;
+ static $magic_url_match_args;
- if (!is_array($magic_url_match) || $static_class != $class)
+ if (!is_array($magic_url_match_args) || $static_class != $class)
{
$static_class = $class;
$class = ($static_class) ? ' class="' . $static_class . '"' : '';
$local_class = ($static_class) ? ' class="' . $static_class . '-local"' : '';
- $magic_url_match = $magic_url_replace = array();
- // Be sure to not let the matches cross over. ;)
+ $magic_url_match_args = array();
// relative urls for this board
- $magic_url_match[] = '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#ie';
- $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_LOCAL, '\$1', '\$2', '\$3', '$local_class')";
+ $magic_url_match_args[] = array(
+ '#(^|[\n\t (>.])(' . preg_quote($server_url, '#') . ')/(' . get_preg_expression('relative_url_inline') . ')#i',
+ MAGIC_URL_LOCAL,
+ $local_class,
+ );
// matches a xxxx://aaaaa.bbb.cccc. ...
- $magic_url_match[] = '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#ie';
- $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_FULL, '\$1', '\$2', '', '$class')";
+ $magic_url_match_args[] = array(
+ '#(^|[\n\t (>.])(' . get_preg_expression('url_inline') . ')#i',
+ MAGIC_URL_FULL,
+ $class,
+ );
// matches a "www.xxxx.yyyy[/zzzz]" kinda lazy URL thing
- $magic_url_match[] = '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#ie';
- $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_WWW, '\$1', '\$2', '', '$class')";
+ $magic_url_match_args[] = array(
+ '#(^|[\n\t (>])(' . get_preg_expression('www_url_inline') . ')#i',
+ MAGIC_URL_WWW,
+ $class,
+ );
// matches an email@domain type address at the start of a line, or after a space or after what might be a BBCode.
- $magic_url_match[] = '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/ie';
- $magic_url_replace[] = "make_clickable_callback(MAGIC_URL_EMAIL, '\$1', '\$2', '', '')";
+ $magic_url_match_args[] = array(
+ '/(^|[\n\t (>])(' . get_preg_expression('email') . ')/i',
+ MAGIC_URL_EMAIL,
+ '',
+ );
}
- return preg_replace($magic_url_match, $magic_url_replace, $text);
+ foreach ($magic_url_match_args as $magic_args)
+ {
+ if (preg_match($magic_args[0], $text, $matches))
+ {
+ $text = preg_replace_callback($magic_args[0], function($matches) use ($magic_args)
+ {
+ return make_clickable_callback($magic_args[1], $matches[1], $matches[2], $matches[3], $magic_args[2]);
+ }, $text);
+ }
+ }
+
+ return $text;
}
/**
@@ -731,7 +834,7 @@ function bbcode_nl2br($text)
*/
function smiley_text($text, $force_option = false)
{
- global $config, $user, $phpbb_root_path;
+ global $config, $user, $phpbb_path_helper;
if ($force_option || !$config['allow_smilies'] || !$user->optionget('viewsmilies'))
{
@@ -739,8 +842,8 @@ function smiley_text($text, $force_option = false)
}
else
{
- $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path;
- return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->#', '<img src="' . $root_path . $config['smilies_path'] . '/\2 />', $text);
+ $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();
+ return preg_replace('#<!\-\- s(.*?) \-\-><img src="\{SMILIES_PATH\}\/(.*?) \/><!\-\- s\1 \-\->#', '<img class="smilies" src="' . $root_path . $config['smilies_path'] . '/\2 />', $text);
}
}
@@ -938,12 +1041,12 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
}
$download_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']);
+ $l_downloaded_viewed = 'VIEWED_COUNTS';
switch ($display_cat)
{
// Images
case ATTACHMENT_CATEGORY_IMAGE:
- $l_downloaded_viewed = 'VIEWED_COUNT';
$inline_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id']);
$download_link .= '&amp;mode=view';
@@ -957,7 +1060,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
// Images, but display Thumbnail
case ATTACHMENT_CATEGORY_THUMB:
- $l_downloaded_viewed = 'VIEWED_COUNT';
$thumbnail_link = append_sid("{$phpbb_root_path}download/file.$phpEx", 'id=' . $attachment['attach_id'] . '&amp;t=1');
$download_link .= '&amp;mode=view';
@@ -971,7 +1073,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
// Windows Media Streams
case ATTACHMENT_CATEGORY_WM:
- $l_downloaded_viewed = 'VIEWED_COUNT';
// Giving the filename directly because within the wm object all variables are in local context making it impossible
// to validate against a valid session (all params can differ)
@@ -990,7 +1091,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
// Real Media Streams
case ATTACHMENT_CATEGORY_RM:
case ATTACHMENT_CATEGORY_QUICKTIME:
- $l_downloaded_viewed = 'VIEWED_COUNT';
$block_array += array(
'S_RM_FILE' => ($display_cat == ATTACHMENT_CATEGORY_RM) ? true : false,
@@ -1007,8 +1107,6 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
case ATTACHMENT_CATEGORY_FLASH:
list($width, $height) = @getimagesize($filename);
- $l_downloaded_viewed = 'VIEWED_COUNT';
-
$block_array += array(
'S_FLASH_FILE' => true,
'WIDTH' => $width,
@@ -1021,7 +1119,7 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
break;
default:
- $l_downloaded_viewed = 'DOWNLOAD_COUNT';
+ $l_downloaded_viewed = 'DOWNLOAD_COUNTS';
$block_array += array(
'S_FILE' => true,
@@ -1029,11 +1127,14 @@ function parse_attachments($forum_id, &$message, &$attachments, &$update_count,
break;
}
- $l_download_count = (!isset($attachment['download_count']) || $attachment['download_count'] == 0) ? $user->lang[$l_downloaded_viewed . '_NONE'] : (($attachment['download_count'] == 1) ? sprintf($user->lang[$l_downloaded_viewed], $attachment['download_count']) : sprintf($user->lang[$l_downloaded_viewed . 'S'], $attachment['download_count']));
+ if (!isset($attachment['download_count']))
+ {
+ $attachment['download_count'] = 0;
+ }
$block_array += array(
'U_DOWNLOAD_LINK' => $download_link,
- 'L_DOWNLOAD_COUNT' => $l_download_count
+ 'L_DOWNLOAD_COUNT' => $user->lang($l_downloaded_viewed, (int) $attachment['download_count']),
);
}
@@ -1106,8 +1207,8 @@ function extension_allowed($forum_id, $extension, &$extensions)
* @param string $string The text to truncate to the given length. String is specialchared.
* @param int $max_length Maximum length of string (multibyte character count as 1 char / Html entity count as 1 char)
* @param int $max_store_length Maximum character length of string (multibyte character count as 1 char / Html entity count as entity chars).
-* @param bool $allow_reply Allow Re: in front of string
-* NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated.
+* @param bool $allow_reply Allow Re: in front of string
+* NOTE: This parameter can cause undesired behavior (returning strings longer than $max_store_length) and is deprecated.
* @param string $append String to be appended
*/
function truncate_string($string, $max_length = 60, $max_store_length = 255, $allow_reply = false, $append = '')
@@ -1178,6 +1279,7 @@ function truncate_string($string, $max_length = 60, $max_store_length = 255, $al
function get_username_string($mode, $user_id, $username, $username_colour = '', $guest_username = false, $custom_profile_url = false)
{
static $_profile_cache;
+ global $phpbb_dispatcher;
// We cache some common variables we need within this function
if (empty($_profile_cache))
@@ -1255,10 +1357,50 @@ function get_username_string($mode, $user_id, $username, $username_colour = '',
if (($mode == 'full' && !$profile_url) || $mode == 'no_profile')
{
- return str_replace(array('{USERNAME_COLOUR}', '{USERNAME}'), array($username_colour, $username), (!$username_colour) ? $_profile_cache['tpl_noprofile'] : $_profile_cache['tpl_noprofile_colour']);
+ $username_string = str_replace(array('{USERNAME_COLOUR}', '{USERNAME}'), array($username_colour, $username), (!$username_colour) ? $_profile_cache['tpl_noprofile'] : $_profile_cache['tpl_noprofile_colour']);
}
+ else
+ {
+ $username_string = str_replace(array('{PROFILE_URL}', '{USERNAME_COLOUR}', '{USERNAME}'), array($profile_url, $username_colour, $username), (!$username_colour) ? $_profile_cache['tpl_profile'] : $_profile_cache['tpl_profile_colour']);
+ }
+
+ /**
+ * Use this event to change the output of get_username_string()
+ *
+ * @event core.modify_username_string
+ * @var string mode profile|username|colour|full|no_profile
+ * @var int user_id String or array of additional url
+ * parameters
+ * @var string username The user's username
+ * @var string username_colour The user's colour
+ * @var string guest_username Optional parameter to specify the
+ * guest username.
+ * @var string custom_profile_url Optional parameter to specify a
+ * profile url.
+ * @var string username_string The string that has been generated
+ * @var array _profile_cache Array of original return templates
+ * @since 3.1-A1
+ */
+ $vars = array('mode', 'user_id', 'username', 'username_colour', 'guest_username', 'custom_profile_url', 'username_string', '_profile_cache');
+ extract($phpbb_dispatcher->trigger_event('core.modify_username_string', compact($vars)));
- return str_replace(array('{PROFILE_URL}', '{USERNAME_COLOUR}', '{USERNAME}'), array($profile_url, $username_colour, $username), (!$username_colour) ? $_profile_cache['tpl_profile'] : $_profile_cache['tpl_profile_colour']);
+ return $username_string;
+}
+
+/**
+ * Add an option to the quick-mod tools.
+ *
+ * @param string $option The language key for the value of the option.
+ * @param string $lang_string The language string to use.
+ */
+function phpbb_add_quickmod_option($option, $lang_string)
+{
+ global $template, $user;
+ $lang_string = $user->lang($lang_string);
+ $template->assign_block_vars('quickmod', array(
+ 'VALUE' => $option,
+ 'TITLE' => $lang_string,
+ ));
}
/**
@@ -1354,5 +1496,3 @@ class bitfield
$this->data = $this->data | $bitfield->get_blob();
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_convert.php b/phpBB/includes/functions_convert.php
index 3b26f417e9..a34a193f60 100644
--- a/phpBB/includes/functions_convert.php
+++ b/phpBB/includes/functions_convert.php
@@ -2,9 +2,8 @@
/**
*
* @package install
-* @version $Id$
* @copyright (c) 2006 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -1769,7 +1768,7 @@ function sync_post_count($offset, $limit)
$sql = 'SELECT COUNT(post_id) AS num_posts, poster_id
FROM ' . POSTS_TABLE . '
WHERE post_postcount = 1
- AND post_approved = 1
+ AND post_visibility = ' . ITEM_APPROVED . '
GROUP BY poster_id
ORDER BY poster_id';
$result = $db->sql_query_limit($sql, $limit, $offset);
@@ -1885,7 +1884,7 @@ function add_bots()
'user_email' => '',
'user_lang' => $config['default_lang'],
'user_style' => 1,
- 'user_timezone' => 0,
+ 'user_timezone' => 'UTC',
'user_allow_massemail' => 0,
);
@@ -1942,7 +1941,7 @@ function update_dynamic_config()
$sql = 'SELECT COUNT(post_id) AS stat
FROM ' . POSTS_TABLE . '
- WHERE post_approved = 1';
+ WHERE post_visibility = ' . ITEM_APPROVED;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
@@ -1951,7 +1950,7 @@ function update_dynamic_config()
$sql = 'SELECT COUNT(topic_id) AS stat
FROM ' . TOPICS_TABLE . '
- WHERE topic_approved = 1';
+ WHERE topic_visibility = ' . ITEM_APPROVED;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
@@ -2473,7 +2472,3 @@ function fill_dateformat($user_dateformat)
return ((empty($user_dateformat)) ? $config['default_dateformat'] : $user_dateformat);
}
-
-
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_database_helper.php b/phpBB/includes/functions_database_helper.php
index 664c246888..923e542690 100644
--- a/phpBB/includes/functions_database_helper.php
+++ b/phpBB/includes/functions_database_helper.php
@@ -22,14 +22,14 @@ if (!defined('IN_PHPBB'))
*
* The only supported table is bookmarks.
*
-* @param dbal $db Database object
+* @param \phpbb\db\driver\driver $db Database object
* @param string $table Table on which to perform the update
* @param string $column Column whose values to change
* @param array $from_values An array of values that should be changed
* @param int $to_value The new value
* @return null
*/
-function phpbb_update_rows_avoiding_duplicates($db, $table, $column, $from_values, $to_value)
+function phpbb_update_rows_avoiding_duplicates(\phpbb\db\driver\driver $db, $table, $column, $from_values, $to_value)
{
$sql = "SELECT $column, user_id
FROM $table
@@ -107,14 +107,14 @@ function phpbb_update_rows_avoiding_duplicates($db, $table, $column, $from_value
*
* The only supported table is topics_watch.
*
-* @param dbal $db Database object
+* @param \phpbb\db\driver\driver $db Database object
* @param string $table Table on which to perform the update
* @param string $column Column whose values to change
* @param array $from_values An array of values that should be changed
* @param int $to_value The new value
* @return null
*/
-function phpbb_update_rows_avoiding_duplicates_notify_status($db, $table, $column, $from_values, $to_value)
+function phpbb_update_rows_avoiding_duplicates_notify_status(\phpbb\db\driver\driver $db, $table, $column, $from_values, $to_value)
{
$sql = "SELECT $column, user_id, notify_status
FROM $table
diff --git a/phpBB/includes/functions_display.php b/phpBB/includes/functions_display.php
index ee7048638d..c6ab5df90f 100644
--- a/phpBB/includes/functions_display.php
+++ b/phpBB/includes/functions_display.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -23,6 +22,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
{
global $db, $auth, $user, $template;
global $phpbb_root_path, $phpEx, $config;
+ global $request, $phpbb_dispatcher, $phpbb_container;
$forum_rows = $subforums = $forum_ids = $forum_ids_moderator = $forum_moderators = $active_forum_ary = array();
$parent_id = $visible_forums = 0;
@@ -54,12 +54,26 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
// Handle marking everything read
if ($mark_read == 'all')
{
- $redirect = build_url(array('mark', 'hash'));
+ $redirect = build_url(array('mark', 'hash', 'mark_time'));
meta_refresh(3, $redirect);
if (check_link_hash(request_var('hash', ''), 'global'))
{
- markread('all');
+ markread('all', false, false, request_var('mark_time', 0));
+
+ if ($request->is_ajax())
+ {
+ // Tell the ajax script what language vars and URL need to be replaced
+ $data = array(
+ 'NO_UNREAD_POSTS' => $user->lang['NO_UNREAD_POSTS'],
+ 'UNREAD_POSTS' => $user->lang['UNREAD_POSTS'],
+ 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&mark=forums&mark_time=' . time()) : '',
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $user->lang['FORUMS_MARKED']
+ );
+ $json_response = new \phpbb\json_response();
+ $json_response->send($data);
+ }
trigger_error(
$user->lang['FORUMS_MARKED'] . '<br /><br />' .
@@ -90,7 +104,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
}
else if ($config['load_anon_lastread'] || $user->data['is_registered'])
{
- $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
+ $tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
if (!$user->data['is_registered'])
@@ -109,7 +123,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$sql_array['SELECT'] .= ', fa.user_id';
}
- $sql = $db->sql_build_query('SELECT', array(
+ $sql_ary = array(
'SELECT' => $sql_array['SELECT'],
'FROM' => $sql_array['FROM'],
'LEFT_JOIN' => $sql_array['LEFT_JOIN'],
@@ -117,27 +131,41 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'WHERE' => $sql_where,
'ORDER_BY' => 'f.left_id',
- ));
+ );
+ /**
+ * Event to modify the SQL query before the forum data is queried
+ *
+ * @event core.display_forums_modify_sql
+ * @var array sql_ary The SQL array to get the data of the forums
+ * @since 3.1-A1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_sql', compact($vars)));
+
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql);
$forum_tracking_info = array();
$branch_root_id = $root_data['forum_id'];
- // Check for unread global announcements (index page only)
- $ga_unread = false;
- if ($root_data['forum_id'] == 0)
- {
- $unread_ga_list = get_unread_topics($user->data['user_id'], 'AND t.forum_id = 0', '', 1);
-
- if (!empty($unread_ga_list))
- {
- $ga_unread = true;
- }
- }
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
while ($row = $db->sql_fetchrow($result))
{
+ /**
+ * Event to modify the data set of a forum
+ *
+ * This event is triggered once per forum
+ *
+ * @event core.display_forums_modify_row
+ * @var int branch_root_id Last top-level forum
+ * @var array row The data of the forum
+ * @since 3.1-A1
+ */
+ $vars = array('branch_root_id', 'row');
+ extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_row', compact($vars)));
+
$forum_id = $row['forum_id'];
// Mark forums read?
@@ -187,9 +215,11 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_tracking_info[$forum_id] = (isset($tracking_topics['f'][$forum_id])) ? (int) (base_convert($tracking_topics['f'][$forum_id], 36, 10) + $config['board_startdate']) : $user->data['user_lastmark'];
}
- // Count the difference of real to public topics, so we can display an information to moderators
- $row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && ($row['forum_topics_real'] != $row['forum_topics'])) ? $forum_id : 0;
- $row['forum_topics'] = ($auth->acl_get('m_approve', $forum_id)) ? $row['forum_topics_real'] : $row['forum_topics'];
+ // Lets check whether there are unapproved topics/posts, so we can display an information to moderators
+ $row['forum_id_unapproved_topics'] = ($auth->acl_get('m_approve', $forum_id) && $row['forum_topics_unapproved']) ? $forum_id : 0;
+ $row['forum_id_unapproved_posts'] = ($auth->acl_get('m_approve', $forum_id) && $row['forum_posts_unapproved']) ? $forum_id : 0;
+ $row['forum_posts'] = $phpbb_content_visibility->get_count('forum_posts', $row, $forum_id);
+ $row['forum_topics'] = $phpbb_content_visibility->get_count('forum_topics', $row, $forum_id);
// Display active topics from this forum?
if ($show_active && $row['forum_type'] == FORUM_POST && $auth->acl_get('f_read', $forum_id) && ($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS))
@@ -252,6 +282,11 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_rows[$parent_id]['forum_id_unapproved_topics'] = $forum_id;
}
+ if (!$forum_rows[$parent_id]['forum_id_unapproved_posts'] && $row['forum_id_unapproved_posts'])
+ {
+ $forum_rows[$parent_id]['forum_id_unapproved_posts'] = $forum_id;
+ }
+
$forum_rows[$parent_id]['forum_topics'] += $row['forum_topics'];
// Do not list redirects in LINK Forums as Posts.
@@ -271,21 +306,50 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_rows[$parent_id]['forum_id_last_post'] = $forum_id;
}
}
+
+ /**
+ * Event to modify the forum rows data set
+ *
+ * This event is triggered once per forum
+ *
+ * @event core.display_forums_modify_forum_rows
+ * @var array forum_rows Data array of all forums we display
+ * @var array subforums Data array of all subforums we display
+ * @var int branch_root_id Current top-level forum
+ * @var int parent_id Current parent forum
+ * @var array row The data of the forum
+ * @since 3.1-A1
+ */
+ $vars = array('forum_rows', 'subforums', 'branch_root_id', 'parent_id', 'row');
+ extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_forum_rows', compact($vars)));
}
$db->sql_freeresult($result);
// Handle marking posts
if ($mark_read == 'forums')
{
- $redirect = build_url(array('mark', 'hash'));
+ $redirect = build_url(array('mark', 'hash', 'mark_time'));
$token = request_var('hash', '');
if (check_link_hash($token, 'global'))
{
- // Add 0 to forums array to mark global announcements correctly
- $forum_ids[] = 0;
- markread('topics', $forum_ids);
+ markread('topics', $forum_ids, false, request_var('mark_time', 0));
$message = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect . '">', '</a>');
meta_refresh(3, $redirect);
+
+ if ($request->is_ajax())
+ {
+ // Tell the ajax script what language vars and URL need to be replaced
+ $data = array(
+ 'NO_UNREAD_POSTS' => $user->lang['NO_UNREAD_POSTS'],
+ 'UNREAD_POSTS' => $user->lang['UNREAD_POSTS'],
+ 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&f=' . $root_data['forum_id'] . '&mark=forums&mark_time=' . time()) : '',
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $user->lang['FORUMS_MARKED']
+ );
+ $json_response = new \phpbb\json_response();
+ $json_response->send($data);
+ }
+
trigger_error($user->lang['FORUMS_MARKED'] . '<br /><br />' . $message);
}
else
@@ -334,12 +398,6 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
$forum_unread = (isset($forum_tracking_info[$forum_id]) && $row['orig_forum_last_post_time'] > $forum_tracking_info[$forum_id]) ? true : false;
- // Mark the first visible forum on index as unread if there's any unread global announcement
- if ($ga_unread && !empty($forum_ids_moderator) && $forum_id == $forum_ids_moderator[0])
- {
- $forum_unread = true;
- }
-
$folder_image = $folder_alt = $l_subforums = '';
$subforums_list = array();
@@ -415,12 +473,13 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
if ($row['forum_last_post_id'])
{
$last_post_subject = $row['forum_last_post_subject'];
+ $last_post_subject_truncated = truncate_string(censor_text($last_post_subject), 30, 255, false, $user->lang['ELLIPSIS']);
$last_post_time = $user->format_date($row['forum_last_post_time']);
$last_post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id_last_post'] . '&amp;p=' . $row['forum_last_post_id']) . '#p' . $row['forum_last_post_id'];
}
else
{
- $last_post_subject = $last_post_time = $last_post_url = '';
+ $last_post_subject = $last_post_time = $last_post_url = $last_post_subject_truncated = '';
}
// Output moderator listing ... if applicable
@@ -428,7 +487,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
if ($display_moderators && !empty($forum_moderators[$forum_id]))
{
$l_moderator = (sizeof($forum_moderators[$forum_id]) == 1) ? $user->lang['MODERATOR'] : $user->lang['MODERATORS'];
- $moderators_list = implode(', ', $forum_moderators[$forum_id]);
+ $moderators_list = implode($user->lang['COMMA_SEPARATOR'], $forum_moderators[$forum_id]);
}
$l_post_click_count = ($row['forum_type'] == FORUM_LINK) ? 'CLICKS' : 'POSTS';
@@ -439,7 +498,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
{
$s_subforums_list[] = '<a href="' . $subforum['link'] . '" class="subforum ' . (($subforum['unread']) ? 'unread' : 'read') . '" title="' . (($subforum['unread']) ? $user->lang['UNREAD_POSTS'] : $user->lang['NO_UNREAD_POSTS']) . '">' . $subforum['name'] . '</a>';
}
- $s_subforums_list = (string) implode(', ', $s_subforums_list);
+ $s_subforums_list = (string) implode($user->lang['COMMA_SEPARATOR'], $s_subforums_list);
$catless = ($row['parent_id'] == $root_data['forum_id']) ? true : false;
if ($row['forum_type'] != FORUM_LINK)
@@ -460,7 +519,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
}
}
- $template->assign_block_vars('forumrow', array(
+ $forum_row = array(
'S_IS_CAT' => false,
'S_NO_CAT' => $catless && !$last_catless,
'S_IS_LINK' => ($row['forum_type'] == FORUM_LINK) ? true : false,
@@ -469,6 +528,7 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'S_LOCKED_FORUM' => ($row['forum_status'] == ITEM_LOCKED) ? true : false,
'S_LIST_SUBFORUMS' => ($row['display_subforum_list']) ? true : false,
'S_SUBFORUMS' => (sizeof($subforums_list)) ? true : false,
+ 'S_DISPLAY_SUBJECT' => ($last_post_subject && $config['display_last_subject'] && !$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? true : false,
'S_FEED_ENABLED' => ($config['feed_forum'] && !phpbb_optionget(FORUM_OPTION_FEED_EXCLUDE, $row['forum_options']) && $row['forum_type'] == FORUM_POST) ? true : false,
'FORUM_ID' => $row['forum_id'],
@@ -476,12 +536,13 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'FORUM_DESC' => generate_text_for_display($row['forum_desc'], $row['forum_desc_uid'], $row['forum_desc_bitfield'], $row['forum_desc_options']),
'TOPICS' => $row['forum_topics'],
$l_post_click_count => $post_click_count,
+ 'FORUM_IMG_STYLE' => $folder_image,
'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt),
- 'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'),
'FORUM_FOLDER_IMG_ALT' => isset($user->lang[$folder_alt]) ? $user->lang[$folder_alt] : '',
'FORUM_IMAGE' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
- 'LAST_POST_SUBJECT' => censor_text($last_post_subject),
+ 'LAST_POST_SUBJECT' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? censor_text($last_post_subject) : "",
+ 'LAST_POST_SUBJECT_TRUNCATED' => (!$row['forum_password'] && $auth->acl_get('f_read', $row['forum_id'])) ? $last_post_subject_truncated : "",
'LAST_POST_TIME' => $last_post_time,
'LAST_POSTER' => get_username_string('username', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
'LAST_POSTER_COLOUR' => get_username_string('colour', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
@@ -493,11 +554,27 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
'L_MODERATOR_STR' => $l_moderator,
'U_UNAPPROVED_TOPICS' => ($row['forum_id_unapproved_topics']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=unapproved_topics&amp;f=' . $row['forum_id_unapproved_topics']) : '',
+ 'U_UNAPPROVED_POSTS' => ($row['forum_id_unapproved_posts']) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=unapproved_posts&amp;f=' . $row['forum_id_unapproved_posts']) : '',
'U_VIEWFORUM' => $u_viewforum,
'U_LAST_POSTER' => get_username_string('profile', $row['forum_last_poster_id'], $row['forum_last_poster_name'], $row['forum_last_poster_colour']),
- 'U_LAST_POST' => $last_post_url)
+ 'U_LAST_POST' => $last_post_url,
);
+ /**
+ * Modify the template data block of the forum
+ *
+ * This event is triggered once per forum
+ *
+ * @event core.display_forums_modify_template_vars
+ * @var array forum_row Template data of the forum
+ * @var array row The data of the forum
+ * @since 3.1-A1
+ */
+ $vars = array('forum_row', 'row');
+ extract($phpbb_dispatcher->trigger_event('core.display_forums_modify_template_vars', compact($vars)));
+
+ $template->assign_block_vars('forumrow', $forum_row);
+
// Assign subforums loop for style authors
foreach ($subforums_list as $subforum)
{
@@ -512,11 +589,12 @@ function display_forums($root_data = '', $display_moderators = true, $return_mod
}
$template->assign_vars(array(
- 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums') : '',
+ 'U_MARK_FORUMS' => ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;f=' . $root_data['forum_id'] . '&amp;mark=forums&amp;mark_time=' . time()) : '',
'S_HAS_SUBFORUM' => ($visible_forums) ? true : false,
'L_SUBFORUM' => ($visible_forums == 1) ? $user->lang['SUBFORUM'] : $user->lang['SUBFORUMS'],
'LAST_POST_IMG' => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'TOPICS_UNAPPROVED'),
+ 'UNAPPROVED_POST_IMG' => $user->img('icon_topic_unapproved', 'POSTS_UNAPPROVED'),
));
if ($return_moderators)
@@ -655,48 +733,6 @@ function get_forum_parents(&$forum_data)
}
/**
-* Generate topic pagination
-*/
-function topic_generate_pagination($replies, $url)
-{
- global $config, $user;
-
- // Make sure $per_page is a valid value
- $per_page = ($config['posts_per_page'] <= 0) ? 1 : $config['posts_per_page'];
-
- if (($replies + 1) > $per_page)
- {
- $total_pages = ceil(($replies + 1) / $per_page);
- $pagination = '';
-
- $times = 1;
- for ($j = 0; $j < $replies + 1; $j += $per_page)
- {
- $pagination .= '<a href="' . $url . ($j == 0 ? '' : '&amp;start=' . $j) . '">' . $times . '</a>';
- if ($times == 1 && $total_pages > 5)
- {
- $pagination .= '<span class="page-dots"> ... </span>';
-
- // Display the last three pages
- $times = $total_pages - 3;
- $j += ($total_pages - 4) * $per_page;
- }
- else if ($times < $total_pages)
- {
- $pagination .= '<span class="page-sep">' . $user->lang['COMMA_SEPARATOR'] . '</span>';
- }
- $times++;
- }
- }
- else
- {
- $pagination = '';
- }
-
- return $pagination;
-}
-
-/**
* Obtain list of moderators of each forum
*/
function get_moderators(&$forum_moderators, $forum_id = false)
@@ -790,7 +826,7 @@ function gen_forum_auth_level($mode, $forum_id, $forum_status)
($auth->acl_get('f_post', $forum_id) && !$locked) ? $user->lang['RULES_POST_CAN'] : $user->lang['RULES_POST_CANNOT'],
($auth->acl_get('f_reply', $forum_id) && !$locked) ? $user->lang['RULES_REPLY_CAN'] : $user->lang['RULES_REPLY_CANNOT'],
($user->data['is_registered'] && $auth->acl_gets('f_edit', 'm_edit', $forum_id) && !$locked) ? $user->lang['RULES_EDIT_CAN'] : $user->lang['RULES_EDIT_CANNOT'],
- ($user->data['is_registered'] && $auth->acl_gets('f_delete', 'm_delete', $forum_id) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
+ ($user->data['is_registered'] && ($auth->acl_gets('f_delete', 'm_delete', $forum_id) || $auth->acl_gets('f_softdelete', 'm_softdelete', $forum_id)) && !$locked) ? $user->lang['RULES_DELETE_CAN'] : $user->lang['RULES_DELETE_CANNOT'],
);
if ($config['allow_attachments'])
@@ -887,7 +923,7 @@ function topic_status(&$topic_row, $replies, $unread_topic, &$folder_img, &$fold
*/
function display_custom_bbcodes()
{
- global $db, $template, $user;
+ global $db, $template, $user, $phpbb_dispatcher;
// Start counting from 22 for the bbcode ids (every bbcode takes two ids - opening/closing)
$num_predefined_bbcodes = 22;
@@ -907,17 +943,40 @@ function display_custom_bbcodes()
$row['bbcode_helpline'] = $user->lang[strtoupper($row['bbcode_helpline'])];
}
- $template->assign_block_vars('custom_tags', array(
+ $custom_tags = array(
'BBCODE_NAME' => "'[{$row['bbcode_tag']}]', '[/" . str_replace('=', '', $row['bbcode_tag']) . "]'",
'BBCODE_ID' => $num_predefined_bbcodes + ($i * 2),
'BBCODE_TAG' => $row['bbcode_tag'],
'BBCODE_HELPLINE' => $row['bbcode_helpline'],
'A_BBCODE_HELPLINE' => str_replace(array('&amp;', '&quot;', "'", '&lt;', '&gt;'), array('&', '"', "\'", '<', '>'), $row['bbcode_helpline']),
- ));
+ );
+
+ /**
+ * Modify the template data block of a bbcode
+ *
+ * This event is triggered once per bbcode
+ *
+ * @event core.display_custom_bbcodes_modify_row
+ * @var array custom_tags Template data of the bbcode
+ * @var array row The data of the bbcode
+ * @since 3.1-A1
+ */
+ $vars = array('custom_tags', 'row');
+ extract($phpbb_dispatcher->trigger_event('core.display_custom_bbcodes_modify_row', compact($vars)));
+
+ $template->assign_block_vars('custom_tags', $custom_tags);
$i++;
}
$db->sql_freeresult($result);
+
+ /**
+ * Display custom bbcodes
+ *
+ * @event core.display_custom_bbcodes
+ * @since 3.1-A1
+ */
+ $phpbb_dispatcher->dispatch('core.display_custom_bbcodes');
}
/**
@@ -957,7 +1016,7 @@ function display_reasons($reason_id = 0)
function display_user_activity(&$userdata)
{
global $auth, $template, $db, $user;
- global $phpbb_root_path, $phpEx;
+ global $phpbb_root_path, $phpEx, $phpbb_container;
// Do not display user activity for users having more than 5000 posts...
if ($userdata['user_posts'] > 5000)
@@ -967,73 +1026,65 @@ function display_user_activity(&$userdata)
$forum_ary = array();
- // Do not include those forums the user is not having read access to...
- $forum_read_ary = $auth->acl_getf('!f_read');
-
- foreach ($forum_read_ary as $forum_id => $not_allowed)
+ $forum_read_ary = $auth->acl_getf('f_read');
+ foreach ($forum_read_ary as $forum_id => $allowed)
{
- if ($not_allowed['f_read'])
+ if ($allowed['f_read'])
{
$forum_ary[] = (int) $forum_id;
}
}
- $forum_ary = array_unique($forum_ary);
- $forum_sql = (sizeof($forum_ary)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary, true) : '';
-
- $fid_m_approve = $auth->acl_getf('m_approve', true);
- $sql_m_approve = (!empty($fid_m_approve)) ? 'OR ' . $db->sql_in_set('forum_id', array_keys($fid_m_approve)) : '';
-
- // Obtain active forum
- $sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
- FROM ' . POSTS_TABLE . '
- WHERE poster_id = ' . $userdata['user_id'] . "
- AND post_postcount = 1
- AND (post_approved = 1
- $sql_m_approve)
- $forum_sql
- GROUP BY forum_id
- ORDER BY num_posts DESC";
- $result = $db->sql_query_limit($sql, 1);
- $active_f_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ $forum_ary = array_diff($forum_ary, $user->get_passworded_forums());
- if (!empty($active_f_row))
+ $active_f_row = $active_t_row = array();
+ if (!empty($forum_ary))
{
- $sql = 'SELECT forum_name
- FROM ' . FORUMS_TABLE . '
- WHERE forum_id = ' . $active_f_row['forum_id'];
- $result = $db->sql_query($sql, 3600);
- $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+ // Obtain active forum
+ $sql = 'SELECT forum_id, COUNT(post_id) AS num_posts
+ FROM ' . POSTS_TABLE . '
+ WHERE poster_id = ' . $userdata['user_id'] . '
+ AND post_postcount = 1
+ AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
+ GROUP BY forum_id
+ ORDER BY num_posts DESC';
+ $result = $db->sql_query_limit($sql, 1);
+ $active_f_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- }
- // Obtain active topic
- // We need to exclude passworded forums here so we do not leak the topic title
- $forum_ary_topic = array_unique(array_merge($forum_ary, $user->get_passworded_forums()));
- $forum_sql_topic = (!empty($forum_ary_topic)) ? 'AND ' . $db->sql_in_set('forum_id', $forum_ary_topic, true) : '';
-
- $sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
- FROM ' . POSTS_TABLE . '
- WHERE poster_id = ' . $userdata['user_id'] . "
- AND post_postcount = 1
- AND (post_approved = 1
- $sql_m_approve)
- $forum_sql_topic
- GROUP BY topic_id
- ORDER BY num_posts DESC";
- $result = $db->sql_query_limit($sql, 1);
- $active_t_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ if (!empty($active_f_row))
+ {
+ $sql = 'SELECT forum_name
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id = ' . $active_f_row['forum_id'];
+ $result = $db->sql_query($sql, 3600);
+ $active_f_row['forum_name'] = (string) $db->sql_fetchfield('forum_name');
+ $db->sql_freeresult($result);
+ }
- if (!empty($active_t_row))
- {
- $sql = 'SELECT topic_title
- FROM ' . TOPICS_TABLE . '
- WHERE topic_id = ' . $active_t_row['topic_id'];
- $result = $db->sql_query($sql);
- $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
+ // Obtain active topic
+ $sql = 'SELECT topic_id, COUNT(post_id) AS num_posts
+ FROM ' . POSTS_TABLE . '
+ WHERE poster_id = ' . $userdata['user_id'] . '
+ AND post_postcount = 1
+ AND ' . $phpbb_content_visibility->get_forums_visibility_sql('post', $forum_ary) . '
+ GROUP BY topic_id
+ ORDER BY num_posts DESC';
+ $result = $db->sql_query_limit($sql, 1);
+ $active_t_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
+
+ if (!empty($active_t_row))
+ {
+ $sql = 'SELECT topic_title
+ FROM ' . TOPICS_TABLE . '
+ WHERE topic_id = ' . $active_t_row['topic_id'];
+ $result = $db->sql_query($sql);
+ $active_t_row['topic_title'] = (string) $db->sql_fetchfield('topic_title');
+ $db->sql_freeresult($result);
+ }
}
$userdata['active_t_row'] = $active_t_row;
@@ -1061,10 +1112,10 @@ function display_user_activity(&$userdata)
$template->assign_vars(array(
'ACTIVE_FORUM' => $active_f_name,
- 'ACTIVE_FORUM_POSTS' => ($active_f_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_f_count),
+ 'ACTIVE_FORUM_POSTS' => $user->lang('USER_POSTS', (int) $active_f_count),
'ACTIVE_FORUM_PCT' => sprintf($l_active_pct, $active_f_pct),
'ACTIVE_TOPIC' => censor_text($active_t_name),
- 'ACTIVE_TOPIC_POSTS' => ($active_t_count == 1) ? sprintf($user->lang['USER_POST'], 1) : sprintf($user->lang['USER_POSTS'], $active_t_count),
+ 'ACTIVE_TOPIC_POSTS' => $user->lang('USER_POSTS', (int) $active_t_count),
'ACTIVE_TOPIC_PCT' => sprintf($l_active_pct, $active_t_pct),
'U_ACTIVE_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $active_f_id),
'U_ACTIVE_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $active_t_id),
@@ -1078,6 +1129,7 @@ function display_user_activity(&$userdata)
function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id, $notify_status = 'unset', $start = 0, $item_title = '')
{
global $template, $db, $user, $phpEx, $start, $phpbb_root_path;
+ global $request;
$table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
$where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
@@ -1105,7 +1157,6 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
if (!is_null($notify_status) && $notify_status !== '')
{
-
if (isset($_GET['unwatch']))
{
$uid = request_var('uid', 0);
@@ -1113,7 +1164,7 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
{
- if ($uid != $user_id || $_GET['unwatch'] != $mode)
+ if ($uid != $user_id || $request->variable('unwatch', '', false, \phpbb\request\request_interface::GET) != $mode)
{
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
$message = $user->lang['ERR_UNWATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
@@ -1178,7 +1229,7 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
if ($token && check_link_hash($token, "{$mode}_$match_id") || confirm_box(true))
{
- if ($uid != $user_id || $_GET['watch'] != $mode)
+ if ($uid != $user_id || $request->variable('watch', '', false, \phpbb\request\request_interface::GET) != $mode)
{
$redirect_url = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;start=$start");
$message = $user->lang['ERR_WATCHING'] . '<br /><br />' . sprintf($user->lang['RETURN_' . strtoupper($mode)], '<a href="' . $redirect_url . '">', '</a>');
@@ -1221,7 +1272,8 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
}
else
{
- if ((isset($_GET['unwatch']) && $_GET['unwatch'] == $mode) || (isset($_GET['watch']) && $_GET['watch'] == $mode))
+ if ((isset($_GET['unwatch']) && $request->variable('unwatch', '', false, \phpbb\request\request_interface::GET) == $mode) ||
+ (isset($_GET['watch']) && $request->variable('watch', '', false, \phpbb\request\request_interface::GET) == $mode))
{
login_box();
}
@@ -1235,7 +1287,9 @@ function watch_topic_forum($mode, &$s_watching, $user_id, $forum_id, $topic_id,
if ($can_watch)
{
$s_watching['link'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;" . (($is_watching) ? 'unwatch' : 'watch') . "=$mode&amp;start=$start&amp;hash=" . generate_link_hash("{$mode}_$match_id"));
+ $s_watching['link_toggle'] = append_sid("{$phpbb_root_path}view$mode.$phpEx", "$u_url=$match_id&amp;" . ((!$is_watching) ? 'unwatch' : 'watch') . "=$mode&amp;start=$start&amp;hash=" . generate_link_hash("{$mode}_$match_id"));
$s_watching['title'] = $user->lang[(($is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
+ $s_watching['title_toggle'] = $user->lang[((!$is_watching) ? 'STOP' : 'START') . '_WATCHING_' . strtoupper($mode)];
$s_watching['is_watching'] = $is_watching;
}
@@ -1290,54 +1344,121 @@ function get_user_rank($user_rank, $user_posts, &$rank_title, &$rank_img, &$rank
/**
* Get user avatar
*
-* @param string $avatar Users assigned avatar name
-* @param int $avatar_type Type of avatar
-* @param string $avatar_width Width of users avatar
-* @param string $avatar_height Height of users avatar
+* @param array $user_row Row from the users table
* @param string $alt Optional language string for alt tag within image, can be a language key or text
* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
*
-* @return string Avatar image
+* @return string Avatar html
*/
-function get_user_avatar($avatar, $avatar_type, $avatar_width, $avatar_height, $alt = 'USER_AVATAR', $ignore_config = false)
+function phpbb_get_user_avatar($user_row, $alt = 'USER_AVATAR', $ignore_config = false)
{
- global $user, $config, $phpbb_root_path, $phpEx;
+ $row = \phpbb\avatar\manager::clean_row($user_row);
+ return phpbb_get_avatar($row, $alt, $ignore_config);
+}
- if (empty($avatar) || !$avatar_type || (!$config['allow_avatar'] && !$ignore_config))
+/**
+* Get group avatar
+*
+* @param array $group_row Row from the groups table
+* @param string $alt Optional language string for alt tag within image, can be a language key or text
+* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
+*
+* @return string Avatar html
+*/
+function phpbb_get_group_avatar($user_row, $alt = 'GROUP_AVATAR', $ignore_config = false)
+{
+ $row = \phpbb\avatar\manager::clean_row($user_row);
+ return phpbb_get_avatar($row, $alt, $ignore_config);
+}
+
+/**
+* Get avatar
+*
+* @param array $row Row cleaned by \phpbb\avatar\driver\driver::clean_row
+* @param string $alt Optional language string for alt tag within image, can be a language key or text
+* @param bool $ignore_config Ignores the config-setting, to be still able to view the avatar in the UCP
+*
+* @return string Avatar html
+*/
+function phpbb_get_avatar($row, $alt, $ignore_config = false)
+{
+ global $user, $config, $cache, $phpbb_root_path, $phpEx;
+ global $request;
+ global $phpbb_container;
+
+ if (!$config['allow_avatar'] && !$ignore_config)
{
return '';
}
- $avatar_img = '';
+ $avatar_data = array(
+ 'src' => $row['avatar'],
+ 'width' => $row['avatar_width'],
+ 'height' => $row['avatar_height'],
+ );
+
+ $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
+ $driver = $phpbb_avatar_manager->get_driver($row['avatar_type'], $ignore_config);
+ $html = '';
- switch ($avatar_type)
+ if ($driver)
{
- case AVATAR_UPLOAD:
- if (!$config['allow_avatar_upload'] && !$ignore_config)
- {
- return '';
- }
- $avatar_img = $phpbb_root_path . "download/file.$phpEx?avatar=";
- break;
+ $html = $driver->get_custom_html($user, $row, $alt);
+ if (!empty($html))
+ {
+ return $html;
+ }
- case AVATAR_GALLERY:
- if (!$config['allow_avatar_local'] && !$ignore_config)
- {
- return '';
- }
- $avatar_img = $phpbb_root_path . $config['avatar_gallery_path'] . '/';
- break;
+ $avatar_data = $driver->get_data($row, $ignore_config);
+ }
+ else
+ {
+ $avatar_data['src'] = '';
+ }
- case AVATAR_REMOTE:
- if (!$config['allow_avatar_remote'] && !$ignore_config)
- {
- return '';
- }
- break;
+ if (!empty($avatar_data['src']))
+ {
+ $html = '<img src="' . $avatar_data['src'] . '" ' .
+ ($avatar_data['width'] ? ('width="' . $avatar_data['width'] . '" ') : '') .
+ ($avatar_data['height'] ? ('height="' . $avatar_data['height'] . '" ') : '') .
+ 'alt="' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';
}
- $avatar_img .= $avatar;
- return '<img src="' . (str_replace(' ', '%20', $avatar_img)) . '" width="' . $avatar_width . '" height="' . $avatar_height . '" alt="' . ((!empty($user->lang[$alt])) ? $user->lang[$alt] : $alt) . '" />';
+ return $html;
}
-?> \ No newline at end of file
+/**
+* Generate a list of archive types available for compressing attachments
+*
+* @param string $param_key Either topic_id or post_id
+* @param string $param_val The value of the topic or post id
+* @param string $phpbb_root_path The root path of the phpBB installation
+* @param string $phpEx The PHP extension
+*
+* @return array Array containing the link and the type of compression
+*/
+function phpbb_gen_download_links($param_key, $param_val, $phpbb_root_path, $phpEx)
+{
+ if (!class_exists('compress'))
+ {
+ require $phpbb_root_path . 'includes/functions_compress.' . $phpEx;
+ }
+
+ $methods = compress::methods();
+ $links = array();
+
+ foreach ($methods as $method)
+ {
+ $exploded = explode('.', $method);
+ $type = array_pop($exploded);
+ $params = array('archive' => $method);
+ $params[$param_key] = $param_val;
+
+ $links[] = array(
+ 'LINK' => append_sid("{$phpbb_root_path}download/file.$phpEx", $params),
+ 'TYPE' => $type,
+ );
+ }
+
+ return $links;
+}
diff --git a/phpBB/includes/functions_download.php b/phpBB/includes/functions_download.php
new file mode 100644
index 0000000000..e7a1d2bff5
--- /dev/null
+++ b/phpBB/includes/functions_download.php
@@ -0,0 +1,744 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* A simplified function to deliver avatars
+* The argument needs to be checked before calling this function.
+*/
+function send_avatar_to_browser($file, $browser)
+{
+ global $config, $phpbb_root_path;
+
+ $prefix = $config['avatar_salt'] . '_';
+ $image_dir = $config['avatar_path'];
+
+ // Adjust image_dir path (no trailing slash)
+ if (substr($image_dir, -1, 1) == '/' || substr($image_dir, -1, 1) == '\\')
+ {
+ $image_dir = substr($image_dir, 0, -1) . '/';
+ }
+ $image_dir = str_replace(array('../', '..\\', './', '.\\'), '', $image_dir);
+
+ if ($image_dir && ($image_dir[0] == '/' || $image_dir[0] == '\\'))
+ {
+ $image_dir = '';
+ }
+ $file_path = $phpbb_root_path . $image_dir . '/' . $prefix . $file;
+
+ if ((@file_exists($file_path) && @is_readable($file_path)) && !headers_sent())
+ {
+ header('Pragma: public');
+
+ $image_data = @getimagesize($file_path);
+ header('Content-Type: ' . image_type_to_mime_type($image_data[2]));
+
+ if ((strpos(strtolower($user->browser), 'msie') !== false) && !phpbb_is_greater_ie_version($browser, 7))
+ {
+ header('Content-Disposition: attachment; ' . header_filename($file));
+
+ if (strpos(strtolower($browser), 'msie 6.0') !== false)
+ {
+ header('Expires: -1');
+ }
+ else
+ {
+ header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000));
+ }
+ }
+ else
+ {
+ header('Content-Disposition: inline; ' . header_filename($file));
+ header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000));
+ }
+
+ $size = @filesize($file_path);
+ if ($size)
+ {
+ header("Content-Length: $size");
+ }
+
+ if (@readfile($file_path) == false)
+ {
+ $fp = @fopen($file_path, 'rb');
+
+ if ($fp !== false)
+ {
+ while (!feof($fp))
+ {
+ echo fread($fp, 8192);
+ }
+ fclose($fp);
+ }
+ }
+
+ flush();
+ }
+ else
+ {
+ header('HTTP/1.0 404 Not Found');
+ }
+}
+
+/**
+* Wraps an url into a simple html page. Used to display attachments in IE.
+* this is a workaround for now; might be moved to template system later
+* direct any complaints to 1 Microsoft Way, Redmond
+*/
+function wrap_img_in_html($src, $title)
+{
+ echo '<!DOCTYPE html>';
+ echo '<html>';
+ echo '<head>';
+ echo '<meta charset="utf-8">';
+ echo '<title>' . $title . '</title>';
+ echo '</head>';
+ echo '<body>';
+ echo '<div>';
+ echo '<img src="' . $src . '" alt="' . $title . '" />';
+ echo '</div>';
+ echo '</body>';
+ echo '</html>';
+}
+
+/**
+* Send file to browser
+*/
+function send_file_to_browser($attachment, $upload_dir, $category)
+{
+ global $user, $db, $config, $phpbb_root_path;
+
+ $filename = $phpbb_root_path . $upload_dir . '/' . $attachment['physical_filename'];
+
+ if (!@file_exists($filename))
+ {
+ send_status_line(404, 'Not Found');
+ trigger_error('ERROR_NO_ATTACHMENT');
+ }
+
+ // Correct the mime type - we force application/octetstream for all files, except images
+ // Please do not change this, it is a security precaution
+ if ($category != ATTACHMENT_CATEGORY_IMAGE || strpos($attachment['mimetype'], 'image') !== 0)
+ {
+ $attachment['mimetype'] = (strpos(strtolower($user->browser), 'msie') !== false || strpos(strtolower($user->browser), 'opera') !== false) ? 'application/octetstream' : 'application/octet-stream';
+ }
+
+ if (@ob_get_length())
+ {
+ @ob_end_clean();
+ }
+
+ // Now send the File Contents to the Browser
+ $size = @filesize($filename);
+
+ // To correctly display further errors we need to make sure we are using the correct headers for both (unsetting content-length may not work)
+
+ // Check if headers already sent or not able to get the file contents.
+ if (headers_sent() || !@file_exists($filename) || !@is_readable($filename))
+ {
+ // PHP track_errors setting On?
+ if (!empty($php_errormsg))
+ {
+ send_status_line(500, 'Internal Server Error');
+ trigger_error($user->lang['UNABLE_TO_DELIVER_FILE'] . '<br />' . sprintf($user->lang['TRACKED_PHP_ERROR'], $php_errormsg));
+ }
+
+ send_status_line(500, 'Internal Server Error');
+ trigger_error('UNABLE_TO_DELIVER_FILE');
+ }
+
+ // Make sure the database record for the filesize is correct
+ if ($size > 0 && $size != $attachment['filesize'])
+ {
+ // Update database record
+ $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
+ SET filesize = ' . (int) $size . '
+ WHERE attach_id = ' . (int) $attachment['attach_id'];
+ $db->sql_query($sql);
+ }
+
+ // Now the tricky part... let's dance
+ header('Pragma: public');
+
+ // Send out the Headers. Do not set Content-Disposition to inline please, it is a security measure for users using the Internet Explorer.
+ header('Content-Type: ' . $attachment['mimetype']);
+
+ if (phpbb_is_greater_ie_version($user->browser, 7))
+ {
+ header('X-Content-Type-Options: nosniff');
+ }
+
+ if ($category == ATTACHMENT_CATEGORY_FLASH && request_var('view', 0) === 1)
+ {
+ // We use content-disposition: inline for flash files and view=1 to let it correctly play with flash player 10 - any other disposition will fail to play inline
+ header('Content-Disposition: inline');
+ }
+ else
+ {
+ if (empty($user->browser) || ((strpos(strtolower($user->browser), 'msie') !== false) && !phpbb_is_greater_ie_version($user->browser, 7)))
+ {
+ header('Content-Disposition: attachment; ' . header_filename(htmlspecialchars_decode($attachment['real_filename'])));
+ if (empty($user->browser) || (strpos(strtolower($user->browser), 'msie 6.0') !== false))
+ {
+ header('expires: -1');
+ }
+ }
+ else
+ {
+ header('Content-Disposition: ' . ((strpos($attachment['mimetype'], 'image') === 0) ? 'inline' : 'attachment') . '; ' . header_filename(htmlspecialchars_decode($attachment['real_filename'])));
+ if (phpbb_is_greater_ie_version($user->browser, 7) && (strpos($attachment['mimetype'], 'image') !== 0))
+ {
+ header('X-Download-Options: noopen');
+ }
+ }
+ }
+
+ if ($size)
+ {
+ header("Content-Length: $size");
+ }
+
+ // Close the db connection before sending the file etc.
+ file_gc(false);
+
+ if (!set_modified_headers($attachment['filetime'], $user->browser))
+ {
+ // We make sure those have to be enabled manually by defining a constant
+ // because of the potential disclosure of full attachment path
+ // in case support for features is absent in the webserver software.
+ if (defined('PHPBB_ENABLE_X_ACCEL_REDIRECT') && PHPBB_ENABLE_X_ACCEL_REDIRECT)
+ {
+ // X-Accel-Redirect - http://wiki.nginx.org/XSendfile
+ header('X-Accel-Redirect: ' . $user->page['root_script_path'] . $upload_dir . '/' . $attachment['physical_filename']);
+ exit;
+ }
+ else if (defined('PHPBB_ENABLE_X_SENDFILE') && PHPBB_ENABLE_X_SENDFILE && !phpbb_http_byte_range($size))
+ {
+ // X-Sendfile - http://blog.lighttpd.net/articles/2006/07/02/x-sendfile
+ // Lighttpd's X-Sendfile does not support range requests as of 1.4.26
+ // and always requires an absolute path.
+ header('X-Sendfile: ' . dirname(__FILE__) . "/../$upload_dir/{$attachment['physical_filename']}");
+ exit;
+ }
+
+ // Try to deliver in chunks
+ @set_time_limit(0);
+
+ $fp = @fopen($filename, 'rb');
+
+ if ($fp !== false)
+ {
+ // Deliver file partially if requested
+ if ($range = phpbb_http_byte_range($size))
+ {
+ fseek($fp, $range['byte_pos_start']);
+
+ send_status_line(206, 'Partial Content');
+ header('Content-Range: bytes ' . $range['byte_pos_start'] . '-' . $range['byte_pos_end'] . '/' . $range['bytes_total']);
+ header('Content-Length: ' . $range['bytes_requested']);
+ }
+
+ while (!feof($fp))
+ {
+ echo fread($fp, 8192);
+ }
+ fclose($fp);
+ }
+ else
+ {
+ @readfile($filename);
+ }
+
+ flush();
+ }
+
+ exit;
+}
+
+/**
+* Get a browser friendly UTF-8 encoded filename
+*/
+function header_filename($file)
+{
+ global $request;
+
+ $user_agent = $request->header('User-Agent');
+
+ // There be dragons here.
+ // Not many follows the RFC...
+ if (strpos($user_agent, 'MSIE') !== false || strpos($user_agent, 'Safari') !== false || strpos($user_agent, 'Konqueror') !== false)
+ {
+ return "filename=" . rawurlencode($file);
+ }
+
+ // follow the RFC for extended filename for the rest
+ return "filename*=UTF-8''" . rawurlencode($file);
+}
+
+/**
+* Check if downloading item is allowed
+*/
+function download_allowed()
+{
+ global $config, $user, $db, $request;
+
+ if (!$config['secure_downloads'])
+ {
+ return true;
+ }
+
+ $url = htmlspecialchars_decode($request->header('Referer'));
+
+ if (!$url)
+ {
+ return ($config['secure_allow_empty_referer']) ? true : false;
+ }
+
+ // Split URL into domain and script part
+ $url = @parse_url($url);
+
+ if ($url === false)
+ {
+ return ($config['secure_allow_empty_referer']) ? true : false;
+ }
+
+ $hostname = $url['host'];
+ unset($url);
+
+ $allowed = ($config['secure_allow_deny']) ? false : true;
+ $iplist = array();
+
+ if (($ip_ary = @gethostbynamel($hostname)) !== false)
+ {
+ foreach ($ip_ary as $ip)
+ {
+ if ($ip)
+ {
+ $iplist[] = $ip;
+ }
+ }
+ }
+
+ // Check for own server...
+ $server_name = $user->host;
+
+ // Forcing server vars is the only way to specify/override the protocol
+ if ($config['force_server_vars'] || !$server_name)
+ {
+ $server_name = $config['server_name'];
+ }
+
+ if (preg_match('#^.*?' . preg_quote($server_name, '#') . '.*?$#i', $hostname))
+ {
+ $allowed = true;
+ }
+
+ // Get IP's and Hostnames
+ if (!$allowed)
+ {
+ $sql = 'SELECT site_ip, site_hostname, ip_exclude
+ FROM ' . SITELIST_TABLE;
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $site_ip = trim($row['site_ip']);
+ $site_hostname = trim($row['site_hostname']);
+
+ if ($site_ip)
+ {
+ foreach ($iplist as $ip)
+ {
+ if (preg_match('#^' . str_replace('\*', '.*?', preg_quote($site_ip, '#')) . '$#i', $ip))
+ {
+ if ($row['ip_exclude'])
+ {
+ $allowed = ($config['secure_allow_deny']) ? false : true;
+ break 2;
+ }
+ else
+ {
+ $allowed = ($config['secure_allow_deny']) ? true : false;
+ }
+ }
+ }
+ }
+
+ if ($site_hostname)
+ {
+ if (preg_match('#^' . str_replace('\*', '.*?', preg_quote($site_hostname, '#')) . '$#i', $hostname))
+ {
+ if ($row['ip_exclude'])
+ {
+ $allowed = ($config['secure_allow_deny']) ? false : true;
+ break;
+ }
+ else
+ {
+ $allowed = ($config['secure_allow_deny']) ? true : false;
+ }
+ }
+ }
+ }
+ $db->sql_freeresult($result);
+ }
+
+ return $allowed;
+}
+
+/**
+* Check if the browser has the file already and set the appropriate headers-
+* @returns false if a resend is in order.
+*/
+function set_modified_headers($stamp, $browser)
+{
+ global $request;
+
+ // let's see if we have to send the file at all
+ $last_load = $request->header('Modified-Since') ? strtotime(trim($request->header('Modified-Since'))) : false;
+
+ if (strpos(strtolower($browser), 'msie 6.0') === false && !phpbb_is_greater_ie_version($browser, 7))
+ {
+ if ($last_load !== false && $last_load >= $stamp)
+ {
+ send_status_line(304, 'Not Modified');
+ // seems that we need those too ... browsers
+ header('Pragma: public');
+ header('Expires: ' . gmdate('D, d M Y H:i:s \G\M\T', time() + 31536000));
+ return true;
+ }
+ else
+ {
+ header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $stamp) . ' GMT');
+ }
+ }
+ return false;
+}
+
+/**
+* Garbage Collection
+*
+* @param bool $exit Whether to die or not.
+*
+* @return null
+*/
+function file_gc($exit = true)
+{
+ global $cache, $db;
+
+ if (!empty($cache))
+ {
+ $cache->unload();
+ }
+
+ $db->sql_close();
+
+ if ($exit)
+ {
+ exit;
+ }
+}
+
+/**
+* HTTP range support (RFC 2616 Section 14.35)
+*
+* Allows browsers to request partial file content
+* in case a download has been interrupted.
+*
+* @param int $filesize the size of the file in bytes we are about to deliver
+*
+* @return mixed false if the whole file has to be delivered
+* associative array on success
+*/
+function phpbb_http_byte_range($filesize)
+{
+ // Only call find_range_request() once.
+ static $request_array;
+
+ if (!$filesize)
+ {
+ return false;
+ }
+
+ if (!isset($request_array))
+ {
+ $request_array = phpbb_find_range_request();
+ }
+
+ return (empty($request_array)) ? false : phpbb_parse_range_request($request_array, $filesize);
+}
+
+/**
+* Searches for HTTP range request in request headers.
+*
+* @return mixed false if no request found
+* array of strings containing the requested ranges otherwise
+* e.g. array(0 => '0-0', 1 => '123-125')
+*/
+function phpbb_find_range_request()
+{
+ global $request;
+
+ $value = $request->header('Range');
+
+ // Make sure range request starts with "bytes="
+ if (strpos($value, 'bytes=') === 0)
+ {
+ // Strip leading 'bytes='
+ // Multiple ranges can be separated by a comma
+ return explode(',', substr($value, 6));
+ }
+
+ return false;
+}
+
+/**
+* Analyses a range request array.
+*
+* A range request can contain multiple ranges,
+* we however only handle the first request and
+* only support requests from a given byte to the end of the file.
+*
+* @param array $request_array array of strings containing the requested ranges
+* @param int $filesize the full size of the file in bytes that has been requested
+*
+* @return mixed false if the whole file has to be delivered
+* associative array on success
+* byte_pos_start the first byte position, can be passed to fseek()
+* byte_pos_end the last byte position
+* bytes_requested the number of bytes requested
+* bytes_total the full size of the file
+*/
+function phpbb_parse_range_request($request_array, $filesize)
+{
+ // Go through all ranges
+ foreach ($request_array as $range_string)
+ {
+ $range = explode('-', trim($range_string));
+
+ // "-" is invalid, "0-0" however is valid and means the very first byte.
+ if (sizeof($range) != 2 || $range[0] === '' && $range[1] === '')
+ {
+ continue;
+ }
+
+ if ($range[0] === '')
+ {
+ // Return last $range[1] bytes.
+
+ if (!$range[1])
+ {
+ continue;
+ }
+
+ if ($range[1] >= $filesize)
+ {
+ return false;
+ }
+
+ $first_byte_pos = $filesize - (int) $range[1];
+ $last_byte_pos = $filesize - 1;
+ }
+ else
+ {
+ // Return bytes from $range[0] to $range[1]
+
+ $first_byte_pos = (int) $range[0];
+ $last_byte_pos = (int) $range[1];
+
+ if ($last_byte_pos && $last_byte_pos < $first_byte_pos)
+ {
+ // The requested range contains 0 bytes.
+ continue;
+ }
+
+ if ($first_byte_pos >= $filesize)
+ {
+ // Requested range not satisfiable
+ return false;
+ }
+
+ // Adjust last-byte-pos if it is absent or greater than the content.
+ if ($range[1] === '' || $last_byte_pos >= $filesize)
+ {
+ $last_byte_pos = $filesize - 1;
+ }
+ }
+
+ // We currently do not support range requests that end before the end of the file
+ if ($last_byte_pos != $filesize - 1)
+ {
+ continue;
+ }
+
+ return array(
+ 'byte_pos_start' => $first_byte_pos,
+ 'byte_pos_end' => $last_byte_pos,
+ 'bytes_requested' => $last_byte_pos - $first_byte_pos + 1,
+ 'bytes_total' => $filesize,
+ );
+ }
+}
+
+/**
+* Increments the download count of all provided attachments
+*
+* @param \phpbb\db\driver\driver $db The database object
+* @param array|int $ids The attach_id of each attachment
+*
+* @return null
+*/
+function phpbb_increment_downloads($db, $ids)
+{
+ if (!is_array($ids))
+ {
+ $ids = array($ids);
+ }
+
+ $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
+ SET download_count = download_count + 1
+ WHERE ' . $db->sql_in_set('attach_id', $ids);
+ $db->sql_query($sql);
+}
+
+/**
+* Handles authentication when downloading attachments from a post or topic
+*
+* @param \phpbb\db\driver\driver $db The database object
+* @param \phpbb\auth\auth $auth The authentication object
+* @param int $topic_id The id of the topic that we are downloading from
+*
+* @return null
+*/
+function phpbb_download_handle_forum_auth($db, $auth, $topic_id)
+{
+ $sql = 'SELECT t.forum_id, f.forum_name, f.forum_password, f.parent_id
+ FROM ' . TOPICS_TABLE . ' t, ' . FORUMS_TABLE . " f
+ WHERE t.topic_id = " . (int) $topic_id . "
+ AND t.forum_id = f.forum_id";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']))
+ {
+ if ($row && $row['forum_password'])
+ {
+ // Do something else ... ?
+ login_forum_box($row);
+ }
+ }
+ else
+ {
+ send_status_line(403, 'Forbidden');
+ trigger_error('SORRY_AUTH_VIEW_ATTACH');
+ }
+}
+
+/**
+* Handles authentication when downloading attachments from PMs
+*
+* @param \phpbb\db\driver\driver $db The database object
+* @param \phpbb\auth\auth $auth The authentication object
+* @param int $user_id The user id
+* @param int $msg_id The id of the PM that we are downloading from
+*
+* @return null
+*/
+function phpbb_download_handle_pm_auth($db, $auth, $user_id, $msg_id)
+{
+ if (!$auth->acl_get('u_pm_download'))
+ {
+ send_status_line(403, 'Forbidden');
+ trigger_error('SORRY_AUTH_VIEW_ATTACH');
+ }
+
+ $allowed = phpbb_download_check_pm_auth($db, $user_id, $msg_id);
+
+ if (!$allowed)
+ {
+ send_status_line(403, 'Forbidden');
+ trigger_error('ERROR_NO_ATTACHMENT');
+ }
+}
+
+/**
+* Checks whether a user can download from a particular PM
+*
+* @param \phpbb\db\driver\driver $db The database object
+* @param int $user_id The user id
+* @param int $msg_id The id of the PM that we are downloading from
+*
+* @return bool Whether the user is allowed to download from that PM or not
+*/
+function phpbb_download_check_pm_auth($db, $user_id, $msg_id)
+{
+ // Check if the attachment is within the users scope...
+ $sql = 'SELECT msg_id
+ FROM ' . PRIVMSGS_TO_TABLE . '
+ WHERE msg_id = ' . (int) $msg_id . '
+ AND (
+ user_id = ' . (int) $user_id . '
+ OR author_id = ' . (int) $user_id . '
+ )';
+ $result = $db->sql_query_limit($sql, 1);
+ $allowed = (bool) $db->sql_fetchfield('msg_id');
+ $db->sql_freeresult($result);
+
+ return $allowed;
+}
+
+/**
+* Cleans a filename of any characters that could potentially cause a problem on
+* a user's filesystem.
+*
+* @param string $filename The filename to clean
+*
+* @return string The cleaned filename
+*/
+function phpbb_download_clean_filename($filename)
+{
+ $bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|');
+
+ // rawurlencode to convert any potentially 'bad' characters that we missed
+ $filename = rawurlencode(str_replace($bad_chars, '_', $filename));
+
+ // Turn the %xx entities created by rawurlencode to _
+ $filename = preg_replace("/%(\w{2})/", '_', $filename);
+
+ return $filename;
+}
+
+/**
+* Check if the browser is internet explorer version 7+
+*
+* @param string $user_agent User agent HTTP header
+* @param int $version IE version to check against
+*
+* @return bool true if internet explorer version is greater than $version
+*/
+function phpbb_is_greater_ie_version($user_agent, $version)
+{
+ if (preg_match('/msie (\d+)/', strtolower($user_agent), $matches))
+ {
+ $ie_version = (int) $matches[1];
+ return ($ie_version > $version);
+ }
+ else
+ {
+ return false;
+ }
+}
diff --git a/phpBB/includes/functions_install.php b/phpBB/includes/functions_install.php
index 47f4eac627..bfd669fdfa 100644
--- a/phpBB/includes/functions_install.php
+++ b/phpBB/includes/functions_install.php
@@ -2,9 +2,8 @@
/**
*
* @package install
-* @version $Id$
* @copyright (c) 2006 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -17,27 +16,6 @@ if (!defined('IN_PHPBB'))
}
/**
-* Determine if we are able to load a specified PHP module and do so if possible
-*/
-function can_load_dll($dll)
-{
- // SQLite2 is a tricky thing, from 5.0.0 it requires PDO; if PDO is not loaded we must state that SQLite is unavailable
- // as the installer doesn't understand that the extension has a prerequisite.
- //
- // On top of this sometimes the SQLite extension is compiled for a different version of PDO
- // by some Linux distributions which causes phpBB to bomb out with a blank page.
- //
- // Net result we'll disable automatic inclusion of SQLite support
- //
- // See: r9618 and #56105
- if ($dll == 'sqlite')
- {
- return false;
- }
- return ((@ini_get('enable_dl') || strtolower(@ini_get('enable_dl')) == 'on') && (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') && function_exists('dl') && @dl($dll . '.' . PHP_SHLIB_SUFFIX)) ? true : false;
-}
-
-/**
* Returns an array of available DBMS with some data, if a DBMS is specified it will only
* return data for that DBMS and will load its extension if necessary.
*/
@@ -50,8 +28,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'firebird',
'MODULE' => 'interbase',
'DELIM' => ';;',
- 'COMMENTS' => 'remove_remarks',
- 'DRIVER' => 'firebird',
+ 'DRIVER' => 'phpbb\db\driver\firebird',
'AVAILABLE' => true,
'2.0.x' => false,
),
@@ -62,8 +39,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'mysql_41',
'MODULE' => 'mysqli',
'DELIM' => ';',
- 'COMMENTS' => 'remove_remarks',
- 'DRIVER' => 'mysqli',
+ 'DRIVER' => 'phpbb\db\driver\mysqli',
'AVAILABLE' => true,
'2.0.x' => true,
),
@@ -72,8 +48,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'mysql',
'MODULE' => 'mysql',
'DELIM' => ';',
- 'COMMENTS' => 'remove_remarks',
- 'DRIVER' => 'mysql',
+ 'DRIVER' => 'phpbb\db\driver\mysql',
'AVAILABLE' => true,
'2.0.x' => true,
),
@@ -82,8 +57,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'mssql',
'MODULE' => 'mssql',
'DELIM' => 'GO',
- 'COMMENTS' => 'remove_comments',
- 'DRIVER' => 'mssql',
+ 'DRIVER' => 'phpbb\db\driver\mssql',
'AVAILABLE' => true,
'2.0.x' => true,
),
@@ -92,8 +66,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'mssql',
'MODULE' => 'odbc',
'DELIM' => 'GO',
- 'COMMENTS' => 'remove_comments',
- 'DRIVER' => 'mssql_odbc',
+ 'DRIVER' => 'phpbb\db\driver\mssql_odbc',
'AVAILABLE' => true,
'2.0.x' => true,
),
@@ -102,28 +75,25 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'mssql',
'MODULE' => 'sqlsrv',
'DELIM' => 'GO',
- 'COMMENTS' => 'remove_comments',
- 'DRIVER' => 'mssqlnative',
+ 'DRIVER' => 'phpbb\db\driver\mssqlnative',
'AVAILABLE' => true,
'2.0.x' => false,
- ),
+ ),
'oracle' => array(
'LABEL' => 'Oracle',
'SCHEMA' => 'oracle',
'MODULE' => 'oci8',
'DELIM' => '/',
- 'COMMENTS' => 'remove_comments',
- 'DRIVER' => 'oracle',
+ 'DRIVER' => 'phpbb\db\driver\oracle',
'AVAILABLE' => true,
'2.0.x' => false,
),
'postgres' => array(
- 'LABEL' => 'PostgreSQL 7.x/8.x',
+ 'LABEL' => 'PostgreSQL 8.3+',
'SCHEMA' => 'postgres',
'MODULE' => 'pgsql',
'DELIM' => ';',
- 'COMMENTS' => 'remove_comments',
- 'DRIVER' => 'postgres',
+ 'DRIVER' => 'phpbb\db\driver\postgres',
'AVAILABLE' => true,
'2.0.x' => true,
),
@@ -132,8 +102,7 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
'SCHEMA' => 'sqlite',
'MODULE' => 'sqlite',
'DELIM' => ';',
- 'COMMENTS' => 'remove_remarks',
- 'DRIVER' => 'sqlite',
+ 'DRIVER' => 'phpbb\db\driver\sqlite',
'AVAILABLE' => true,
'2.0.x' => false,
),
@@ -171,18 +140,15 @@ function get_available_dbms($dbms = false, $return_unavailable = false, $only_20
if (!@extension_loaded($dll))
{
- if (!can_load_dll($dll))
+ if ($return_unavailable)
{
- if ($return_unavailable)
- {
- $available_dbms[$db_name]['AVAILABLE'] = false;
- }
- else
- {
- unset($available_dbms[$db_name]);
- }
- continue;
+ $available_dbms[$db_name]['AVAILABLE'] = false;
}
+ else
+ {
+ unset($available_dbms[$db_name]);
+ }
+ continue;
}
$any_db_support = true;
}
@@ -218,13 +184,7 @@ function dbms_select($default = '', $only_20x_options = false)
*/
function get_tables(&$db)
{
- if (!class_exists('phpbb_db_tools'))
- {
- global $phpbb_root_path, $phpEx;
- require($phpbb_root_path . 'includes/db/db_tools.' . $phpEx);
- }
-
- $db_tools = new phpbb_db_tools($db);
+ $db_tools = new \phpbb\db\tools($db);
return $db_tools->sql_list_tables();
}
@@ -241,26 +201,19 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
$dbms = $dbms_details['DRIVER'];
- if ($load_dbal)
- {
- // Include the DB layer
- include($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
- }
-
// Instantiate it and set return on error true
- $sql_db = 'dbal_' . $dbms;
- $db = new $sql_db();
+ $db = new $dbms();
$db->sql_return_on_error(true);
// Check that we actually have a database name before going any further.....
- if ($dbms_details['DRIVER'] != 'sqlite' && $dbms_details['DRIVER'] != 'oracle' && $dbname === '')
+ if ($dbms_details['DRIVER'] != 'phpbb\db\driver\sqlite' && $dbms_details['DRIVER'] != 'phpbb\db\driver\oracle' && $dbname === '')
{
$error[] = $lang['INST_ERR_DB_NO_NAME'];
return false;
}
// Make sure we don't have a daft user who thinks having the SQLite database in the forum directory is a good idea
- if ($dbms_details['DRIVER'] == 'sqlite' && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
+ if ($dbms_details['DRIVER'] == 'phpbb\db\driver\sqlite' && stripos(phpbb_realpath($dbhost), phpbb_realpath('../')) === 0)
{
$error[] = $lang['INST_ERR_DB_FORUM_PATH'];
return false;
@@ -269,8 +222,8 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
// Check the prefix length to ensure that index names are not too long and does not contain invalid characters
switch ($dbms_details['DRIVER'])
{
- case 'mysql':
- case 'mysqli':
+ case 'phpbb\db\driver\mysql':
+ case 'phpbb\db\driver\mysqli':
if (strspn($table_prefix, '-./\\') !== 0)
{
$error[] = $lang['INST_ERR_PREFIX_INVALID'];
@@ -279,22 +232,22 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
// no break;
- case 'postgres':
+ case 'phpbb\db\driver\postgres':
$prefix_length = 36;
break;
- case 'mssql':
- case 'mssql_odbc':
- case 'mssqlnative':
+ case 'phpbb\db\driver\mssql':
+ case 'phpbb\db\driver\mssql_odbc':
+ case 'phpbb\db\driver\mssqlnative':
$prefix_length = 90;
break;
- case 'sqlite':
+ case 'phpbb\db\driver\sqlite':
$prefix_length = 200;
break;
- case 'firebird':
- case 'oracle':
+ case 'phpbb\db\driver\firebird':
+ case 'phpbb\db\driver\oracle':
$prefix_length = 6;
break;
}
@@ -332,21 +285,21 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
// Make sure that the user has selected a sensible DBAL for the DBMS actually installed
switch ($dbms_details['DRIVER'])
{
- case 'mysqli':
+ case 'phpbb\db\driver\mysqli':
if (version_compare(mysqli_get_server_info($db->db_connect_id), '4.1.3', '<'))
{
$error[] = $lang['INST_ERR_DB_NO_MYSQLI'];
}
break;
- case 'sqlite':
+ case 'phpbb\db\driver\sqlite':
if (version_compare(sqlite_libversion(), '2.8.2', '<'))
{
$error[] = $lang['INST_ERR_DB_NO_SQLITE'];
}
break;
- case 'firebird':
+ case 'phpbb\db\driver\firebird':
// check the version of FB, use some hackery if we can't get access to the server info
if ($db->service_handle !== false && function_exists('ibase_server_info'))
{
@@ -427,7 +380,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
}
break;
- case 'oracle':
+ case 'phpbb\db\driver\oracle':
if ($unicode_check)
{
$sql = "SELECT *
@@ -449,7 +402,7 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
}
break;
- case 'postgres':
+ case 'phpbb\db\driver\postgres':
if ($unicode_check)
{
$sql = "SHOW server_encoding;";
@@ -475,19 +428,6 @@ function connect_check_db($error_connect, &$error, $dbms_details, $table_prefix,
}
/**
-* Removes comments from schema files
-*
-* @deprecated Use phpbb_remove_comments() instead.
-*/
-function remove_remarks(&$sql)
-{
- // Remove # style comments
- $sql = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $sql));
-
- // Return by reference
-}
-
-/**
* Removes "/* style" as well as "# style" comments from $input.
*
* @param string $input Input string
@@ -496,17 +436,11 @@ function remove_remarks(&$sql)
*/
function phpbb_remove_comments($input)
{
- if (!function_exists('remove_comments'))
- {
- global $phpbb_root_path, $phpEx;
- require($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
- }
-
- // Remove /* */ comments
- remove_comments($input);
+ // Remove /* */ comments (http://ostermiller.org/findcomment.html)
+ $input = preg_replace('#/\*(.|[\r\n])*?\*/#', "\n", $input);
// Remove # style comments
- remove_remarks($input);
+ $input = preg_replace('/\n{2,}/', "\n", preg_replace('/^#.*$/m', "\n", $input));
return $input;
}
@@ -551,19 +485,16 @@ function adjust_language_keys_callback($matches)
*
* @param array $data Array containing the database connection information
* @param string $dbms The name of the DBAL class to use
-* @param array $load_extensions Array of additional extensions that should be loaded
* @param bool $debug If the debug constants should be enabled by default or not
* @param bool $debug_test If the DEBUG_TEST constant should be added
* NOTE: Only for use within the testing framework
*
* @return string The output to write to the file
*/
-function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug = false, $debug_test = false)
+function phpbb_create_config_file_data($data, $dbms, $debug = false, $debug_test = false)
{
- $load_extensions = implode(',', $load_extensions);
-
$config_data = "<?php\n";
- $config_data .= "// phpBB 3.0.x auto-generated configuration file\n// Do not change anything in this file!\n";
+ $config_data .= "// phpBB 3.1.x auto-generated configuration file\n// Do not change anything in this file!\n";
$config_data_array = array(
'dbms' => $dbms,
@@ -573,8 +504,10 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug =
'dbuser' => $data['dbuser'],
'dbpasswd' => htmlspecialchars_decode($data['dbpasswd']),
'table_prefix' => $data['table_prefix'],
- 'acm_type' => 'file',
- 'load_extensions' => $load_extensions,
+
+ 'adm_relative_path' => 'adm/',
+
+ 'acm_type' => 'phpbb\cache\driver\file',
);
foreach ($config_data_array as $key => $value)
@@ -587,12 +520,10 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug =
if ($debug)
{
$config_data .= "@define('DEBUG', true);\n";
- $config_data .= "@define('DEBUG_EXTRA', true);\n";
}
else
{
$config_data .= "// @define('DEBUG', true);\n";
- $config_data .= "// @define('DEBUG_EXTRA', true);\n";
}
if ($debug_test)
@@ -602,5 +533,3 @@ function phpbb_create_config_file_data($data, $dbms, $load_extensions, $debug =
return $config_data;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_jabber.php b/phpBB/includes/functions_jabber.php
index 2054124a4e..b260ffad6e 100644
--- a/phpBB/includes/functions_jabber.php
+++ b/phpBB/includes/functions_jabber.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2007 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -69,7 +68,7 @@ class jabber
}
$this->password = $password;
- $this->use_ssl = ($use_ssl && $this->can_use_ssl()) ? true : false;
+ $this->use_ssl = ($use_ssl && self::can_use_ssl()) ? true : false;
// Change port if we use SSL
if ($this->port == 5222 && $this->use_ssl)
@@ -84,7 +83,7 @@ class jabber
/**
* Able to use the SSL functionality?
*/
- function can_use_ssl()
+ static public function can_use_ssl()
{
// Will not work with PHP >= 5.2.1 or < 5.2.3RC2 until timeout problem with ssl hasn't been fixed (http://bugs.php.net/41236)
return ((version_compare(PHP_VERSION, '5.2.1', '<') || version_compare(PHP_VERSION, '5.2.3RC2', '>=')) && @extension_loaded('openssl')) ? true : false;
@@ -93,7 +92,7 @@ class jabber
/**
* Able to use TLS?
*/
- function can_use_tls()
+ static public function can_use_tls()
{
if (!@extension_loaded('openssl') || !function_exists('stream_socket_enable_crypto') || !function_exists('stream_get_meta_data') || !function_exists('socket_set_blocking') || !function_exists('stream_get_wrappers'))
{
@@ -443,7 +442,7 @@ class jabber
}
// Let's use TLS if SSL is not enabled and we can actually use it
- if (!$this->session['ssl'] && $this->can_use_tls() && $this->can_use_ssl() && isset($xml['stream:features'][0]['#']['starttls']))
+ if (!$this->session['ssl'] && self::can_use_tls() && self::can_use_ssl() && isset($xml['stream:features'][0]['#']['starttls']))
{
$this->add_to_log('Switching to TLS.');
$this->send("<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>\n");
@@ -869,5 +868,3 @@ class jabber
return $children;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_messenger.php b/phpBB/includes/functions_messenger.php
index db2dea33e8..5b343e616e 100644
--- a/phpBB/includes/functions_messenger.php
+++ b/phpBB/includes/functions_messenger.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -22,14 +21,15 @@ if (!defined('IN_PHPBB'))
*/
class messenger
{
- var $vars, $msg, $extra_headers, $replyto, $from, $subject;
+ var $msg, $extra_headers, $replyto, $from, $subject;
var $addresses = array();
var $mail_priority = MAIL_NORMAL_PRIORITY;
var $use_queue = true;
- var $tpl_obj = NULL;
- var $tpl_msg = array();
+ /** @var \phpbb\template\template */
+ protected $template;
+
var $eol = "\n";
/**
@@ -53,11 +53,29 @@ class messenger
function reset()
{
$this->addresses = $this->extra_headers = array();
- $this->vars = $this->msg = $this->replyto = $this->from = '';
+ $this->msg = $this->replyto = $this->from = '';
$this->mail_priority = MAIL_NORMAL_PRIORITY;
}
/**
+ * Set addresses for to/im as available
+ *
+ * @param array $user User row
+ */
+ function set_addresses($user)
+ {
+ if (isset($user['user_email']) && $user['user_email'])
+ {
+ $this->to($user['user_email'], (isset($user['username']) ? $user['username'] : ''));
+ }
+
+ if (isset($user['user_jabber']) && $user['user_jabber'])
+ {
+ $this->im($user['user_jabber'], (isset($user['username']) ? $user['username'] : ''));
+ }
+ }
+
+ /**
* Sets an email address to send to
*/
function to($address, $realname = '')
@@ -191,7 +209,9 @@ class messenger
*/
function template($template_file, $template_lang = '', $template_path = '')
{
- global $config, $phpbb_root_path, $user;
+ global $config, $phpbb_root_path, $phpEx, $user, $phpbb_extension_manager;
+
+ $this->setup_template();
if (!trim($template_file))
{
@@ -202,42 +222,41 @@ class messenger
{
// fall back to board default language if the user's language is
// missing $template_file. If this does not exist either,
- // $tpl->set_custom_template will do a trigger_error
+ // $this->template->set_filenames will do a trigger_error
$template_lang = basename($config['default_lang']);
}
- // tpl_msg now holds a template object we can use to parse the template file
- if (!isset($this->tpl_msg[$template_lang . $template_file]))
+ if ($template_path)
+ {
+ $template_paths = array(
+ $template_path,
+ );
+ }
+ else
{
- $this->tpl_msg[$template_lang . $template_file] = new template();
- $tpl = &$this->tpl_msg[$template_lang . $template_file];
+ $template_path = (!empty($user->lang_path)) ? $user->lang_path : $phpbb_root_path . 'language/';
+ $template_path .= $template_lang . '/email';
- $fallback_template_path = false;
+ $template_paths = array(
+ $template_path,
+ );
- if (!$template_path)
+ // we can only specify default language fallback when the path is not a custom one for which we
+ // do not know the default language alternative
+ if ($template_lang !== basename($config['default_lang']))
{
- $template_path = (!empty($user->lang_path)) ? $user->lang_path : $phpbb_root_path . 'language/';
- $template_path .= $template_lang . '/email';
+ $fallback_template_path = (!empty($user->lang_path)) ? $user->lang_path : $phpbb_root_path . 'language/';
+ $fallback_template_path .= basename($config['default_lang']) . '/email';
- // we can only specify default language fallback when the path is not a custom one for which we
- // do not know the default language alternative
- if ($template_lang !== basename($config['default_lang']))
- {
- $fallback_template_path = (!empty($user->lang_path)) ? $user->lang_path : $phpbb_root_path . 'language/';
- $fallback_template_path .= basename($config['default_lang']) . '/email';
- }
+ $template_paths[] = $fallback_template_path;
}
-
- $tpl->set_custom_template($template_path, $template_lang . '_email', $fallback_template_path);
-
- $tpl->set_filenames(array(
- 'body' => $template_file . '.txt',
- ));
}
- $this->tpl_obj = &$this->tpl_msg[$template_lang . $template_file];
- $this->vars = &$this->tpl_obj->_rootref;
- $this->tpl_msg = '';
+ $this->set_template_paths($template_lang . '_email', $template_paths);
+
+ $this->template->set_filenames(array(
+ 'body' => $template_file . '.txt',
+ ));
return true;
}
@@ -247,22 +266,16 @@ class messenger
*/
function assign_vars($vars)
{
- if (!is_object($this->tpl_obj))
- {
- return;
- }
+ $this->setup_template();
- $this->tpl_obj->assign_vars($vars);
+ $this->template->assign_vars($vars);
}
function assign_block_vars($blockname, $vars)
{
- if (!is_object($this->tpl_obj))
- {
- return;
- }
+ $this->setup_template();
- $this->tpl_obj->assign_block_vars($blockname, $vars);
+ $this->template->assign_block_vars($blockname, $vars);
}
/**
@@ -273,29 +286,14 @@ class messenger
global $config, $user;
// We add some standard variables we always use, no need to specify them always
- if (!isset($this->vars['U_BOARD']))
- {
- $this->assign_vars(array(
- 'U_BOARD' => generate_board_url(),
- ));
- }
-
- if (!isset($this->vars['EMAIL_SIG']))
- {
- $this->assign_vars(array(
- 'EMAIL_SIG' => str_replace('<br />', "\n", "-- \n" . htmlspecialchars_decode($config['board_email_sig'])),
- ));
- }
-
- if (!isset($this->vars['SITENAME']))
- {
- $this->assign_vars(array(
- 'SITENAME' => htmlspecialchars_decode($config['sitename']),
- ));
- }
+ $this->assign_vars(array(
+ 'U_BOARD' => generate_board_url(),
+ 'EMAIL_SIG' => str_replace('<br />', "\n", "-- \n" . htmlspecialchars_decode($config['board_email_sig'])),
+ 'SITENAME' => htmlspecialchars_decode($config['sitename']),
+ ));
// Parse message through template
- $this->msg = trim($this->tpl_obj->assign_display('body'));
+ $this->msg = trim($this->template->assign_display('body'));
// Because we use \n for newlines in the body message we need to fix line encoding errors for those admins who uploaded email template files in the wrong encoding
$this->msg = str_replace("\r\n", "\n", $this->msg);
@@ -349,7 +347,7 @@ class messenger
*/
function error($type, $msg)
{
- global $user, $phpEx, $phpbb_root_path, $config;
+ global $user, $phpEx, $phpbb_root_path, $config, $request;
// Session doesn't exist, create it
if (!isset($user->session_id) || $user->session_id === '')
@@ -357,7 +355,7 @@ class messenger
$user->session_begin();
}
- $calling_page = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : $_ENV['PHP_SELF'];
+ $calling_page = htmlspecialchars_decode($request->server('PHP_SELF'));
$message = '';
switch ($type)
@@ -622,6 +620,31 @@ class messenger
unset($addresses);
return true;
}
+
+ /**
+ * Setup template engine
+ */
+ protected function setup_template()
+ {
+ global $config, $phpbb_path_helper, $user, $phpbb_extension_manager;
+
+ if ($this->template instanceof \phpbb\template\template)
+ {
+ return;
+ }
+
+ $this->template = new \phpbb\template\twig\twig($phpbb_path_helper, $config, $user, new \phpbb\template\context(), $phpbb_extension_manager);
+ }
+
+ /**
+ * Set template paths to load
+ */
+ protected function set_template_paths($path_name, $paths)
+ {
+ $this->setup_template();
+
+ $this->template->set_custom_style($path_name, $paths);
+ }
}
/**
@@ -670,64 +693,6 @@ class queue
}
/**
- * Obtains exclusive lock on queue cache file.
- * Returns resource representing the lock
- */
- function lock()
- {
- // For systems that can't have two processes opening
- // one file for writing simultaneously
- if (file_exists($this->cache_file . '.lock'))
- {
- $mode = 'rb';
- }
- else
- {
- $mode = 'wb';
- }
-
- $lock_fp = @fopen($this->cache_file . '.lock', $mode);
-
- if ($mode == 'wb')
- {
- if (!$lock_fp)
- {
- // Two processes may attempt to create lock file at the same time.
- // Have the losing process try opening the lock file again for reading
- // on the assumption that the winning process created it
- $mode = 'rb';
- $lock_fp = @fopen($this->cache_file . '.lock', $mode);
- }
- else
- {
- // Only need to set mode when the lock file is written
- @chmod($this->cache_file . '.lock', 0666);
- }
- }
-
- if ($lock_fp)
- {
- @flock($lock_fp, LOCK_EX);
- }
-
- return $lock_fp;
- }
-
- /**
- * Releases lock on queue cache file, using resource obtained from lock()
- */
- function unlock($lock_fp)
- {
- // lock() will return null if opening lock file, and thus locking, failed.
- // Accept null values here so that client code does not need to check them
- if ($lock_fp)
- {
- @flock($lock_fp, LOCK_UN);
- fclose($lock_fp);
- }
- }
-
- /**
* Process queue
* Using lock file
*/
@@ -735,7 +700,8 @@ class queue
{
global $db, $config, $phpEx, $phpbb_root_path, $user;
- $lock_fp = $this->lock();
+ $lock = new \phpbb\lock\flock($this->cache_file);
+ $lock->acquire();
// avoid races, check file existence once
$have_cache_file = file_exists($this->cache_file);
@@ -746,7 +712,7 @@ class queue
set_config('last_queue_run', time(), true);
}
- $this->unlock($lock_fp);
+ $lock->release();
return;
}
@@ -815,7 +781,7 @@ class queue
break;
default:
- $this->unlock($lock_fp);
+ $lock->release();
return;
}
@@ -891,7 +857,7 @@ class queue
}
}
- $this->unlock($lock_fp);
+ $lock->release();
}
/**
@@ -904,7 +870,8 @@ class queue
return;
}
- $lock_fp = $this->lock();
+ $lock = new \phpbb\lock\flock($this->cache_file);
+ $lock->acquire();
if (file_exists($this->cache_file))
{
@@ -931,7 +898,7 @@ class queue
phpbb_chmod($this->cache_file, CHMOD_READ | CHMOD_WRITE);
}
- $this->unlock($lock_fp);
+ $lock->release();
}
}
@@ -1020,12 +987,12 @@ function smtpmail($addresses, $subject, $message, &$err_msg, $headers = false)
$smtp->add_backtrace('Connecting to ' . $config['smtp_host'] . ':' . $config['smtp_port']);
// Ok we have error checked as much as we can to this point let's get on it already.
- if (!class_exists('phpbb_error_collector'))
+ if (!class_exists('\phpbb\error_collector'))
{
global $phpbb_root_path, $phpEx;
include($phpbb_root_path . 'includes/error_collector.' . $phpEx);
}
- $collector = new phpbb_error_collector;
+ $collector = new \phpbb\error_collector;
$collector->install();
$smtp->socket = fsockopen($config['smtp_host'], $config['smtp_port'], $errno, $errstr, 20);
$collector->uninstall();
@@ -1164,6 +1131,7 @@ class smtp_class
{
var $server_response = '';
var $socket = 0;
+ protected $socket_tls = false;
var $responses = array();
var $commands = array();
var $numeric_response_code = 0;
@@ -1314,30 +1282,29 @@ class smtp_class
}
}
- // Try EHLO first
- $this->server_send("EHLO {$local_host}");
- if ($err_msg = $this->server_parse('250', __LINE__))
+ $hello_result = $this->hello($local_host);
+ if (!is_null($hello_result))
{
- // a 503 response code means that we're already authenticated
- if ($this->numeric_response_code == 503)
- {
- return false;
- }
-
- // If EHLO fails, we try HELO
- $this->server_send("HELO {$local_host}");
- if ($err_msg = $this->server_parse('250', __LINE__))
- {
- return ($this->numeric_response_code == 503) ? false : $err_msg;
- }
+ return $hello_result;
}
- foreach ($this->responses as $response)
+ // SMTP STARTTLS (RFC 3207)
+ if (!$this->socket_tls)
{
- $response = explode(' ', $response);
- $response_code = $response[0];
- unset($response[0]);
- $this->commands[$response_code] = implode(' ', $response);
+ $this->socket_tls = $this->starttls();
+
+ if ($this->socket_tls)
+ {
+ // Switched to TLS
+ // RFC 3207: "The client MUST discard any knowledge obtained from the server, [...]"
+ // So say hello again
+ $hello_result = $this->hello($local_host);
+
+ if (!is_null($hello_result))
+ {
+ return $hello_result;
+ }
+ }
}
// If we are not authenticated yet, something might be wrong if no username and passwd passed
@@ -1384,6 +1351,79 @@ class smtp_class
}
/**
+ * SMTP EHLO/HELO
+ *
+ * @return mixed Null if the authentication process is supposed to continue
+ * False if already authenticated
+ * Error message (string) otherwise
+ */
+ protected function hello($hostname)
+ {
+ // Try EHLO first
+ $this->server_send("EHLO $hostname");
+ if ($err_msg = $this->server_parse('250', __LINE__))
+ {
+ // a 503 response code means that we're already authenticated
+ if ($this->numeric_response_code == 503)
+ {
+ return false;
+ }
+
+ // If EHLO fails, we try HELO
+ $this->server_send("HELO $hostname");
+ if ($err_msg = $this->server_parse('250', __LINE__))
+ {
+ return ($this->numeric_response_code == 503) ? false : $err_msg;
+ }
+ }
+
+ foreach ($this->responses as $response)
+ {
+ $response = explode(' ', $response);
+ $response_code = $response[0];
+ unset($response[0]);
+ $this->commands[$response_code] = implode(' ', $response);
+ }
+ }
+
+ /**
+ * SMTP STARTTLS (RFC 3207)
+ *
+ * @return bool Returns true if TLS was started
+ * Otherwise false
+ */
+ protected function starttls()
+ {
+ if (!function_exists('stream_socket_enable_crypto'))
+ {
+ return false;
+ }
+
+ if (!isset($this->commands['STARTTLS']))
+ {
+ return false;
+ }
+
+ $this->server_send('STARTTLS');
+
+ if ($err_msg = $this->server_parse('220', __LINE__))
+ {
+ return false;
+ }
+
+ $result = false;
+ $stream_meta = stream_get_meta_data($this->socket);
+
+ if (socket_set_blocking($this->socket, 1));
+ {
+ $result = stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
+ socket_set_blocking($this->socket, (int) $stream_meta['blocked']);
+ }
+
+ return $result;
+ }
+
+ /**
* Pop before smtp authentication
*/
function pop_before_smtp($hostname, $username, $password)
@@ -1666,12 +1706,12 @@ function phpbb_mail($to, $subject, $msg, $headers, $eol, &$err_msg)
// Reference: http://bugs.php.net/bug.php?id=15841
$headers = implode($eol, $headers);
- if (!class_exists('phpbb_error_collector'))
+ if (!class_exists('\phpbb\error_collector'))
{
include($phpbb_root_path . 'includes/error_collector.' . $phpEx);
}
- $collector = new phpbb_error_collector;
+ $collector = new \phpbb\error_collector;
$collector->install();
// On some PHP Versions mail() *may* fail if there are newlines within the subject.
@@ -1684,5 +1724,3 @@ function phpbb_mail($to, $subject, $msg, $headers, $eol, &$err_msg)
return $result;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_module.php b/phpBB/includes/functions_module.php
index d0e7c8cfc8..b33f3d6866 100644
--- a/phpBB/includes/functions_module.php
+++ b/phpBB/includes/functions_module.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -129,7 +128,7 @@ class p_master
foreach ($this->module_cache['modules'] as $key => $row)
{
// Not allowed to view module?
- if (!$this->module_auth($row['module_auth']))
+ if (!$this->module_auth_self($row['module_auth']))
{
unset($this->module_cache['modules'][$key]);
continue;
@@ -221,13 +220,15 @@ class p_master
// We need to prefix the functions to not create a naming conflict
// Function for building 'url_extra'
- $url_func = '_module_' . $row['module_basename'] . '_url';
+ $short_name = $this->get_short_name($row['module_basename']);
+
+ $url_func = '_module_' . $short_name . '_url';
// Function for building the language name
- $lang_func = '_module_' . $row['module_basename'] . '_lang';
+ $lang_func = '_module_' . $short_name . '_lang';
// Custom function for calling parameters on module init (for example assigning template variables)
- $custom_func = '_module_' . $row['module_basename'];
+ $custom_func = '_module_' . $short_name;
$names[$row['module_basename'] . '_' . $row['module_mode']][] = true;
@@ -275,6 +276,11 @@ class p_master
*/
function loaded($module_basename, $module_mode = false)
{
+ if (!$this->is_full_class($module_basename))
+ {
+ $module_basename = $this->p_class . '_' . $module_basename;
+ }
+
if (empty($this->loaded_cache))
{
$this->loaded_cache = array();
@@ -309,11 +315,26 @@ class p_master
}
/**
- * Check module authorisation
+ * Check module authorisation.
+ *
+ * This is a non-static version that uses $this->acl_forum_id
+ * for the forum id.
+ */
+ function module_auth_self($module_auth)
+ {
+ return self::module_auth($module_auth, $this->acl_forum_id);
+ }
+
+ /**
+ * Check module authorisation.
+ *
+ * This is a static version, it must be given $forum_id.
+ * See also module_auth_self.
*/
- function module_auth($module_auth, $forum_id = false)
+ static function module_auth($module_auth, $forum_id)
{
global $auth, $config;
+ global $request;
$module_auth = trim($module_auth);
@@ -355,13 +376,11 @@ class p_master
$module_auth = implode(' ', $tokens);
- // Make sure $id seperation is working fine
+ // Make sure $id separation is working fine
$module_auth = str_replace(' , ', ',', $module_auth);
- $forum_id = ($forum_id === false) ? $this->acl_forum_id : $forum_id;
-
$is_auth = false;
- eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z0-9_]+)(,\$id)?#', '#\$id#', '#aclf_([a-z0-9_]+)#', '#cfg_([a-z0-9_]+)#', '#request_([a-zA-Z0-9_]+)#'), array('(int) $auth->acl_get(\'\\1\'\\2)', '(int) $forum_id', '(int) $auth->acl_getf_global(\'\\1\')', '(int) $config[\'\\1\']', '!empty($_REQUEST[\'\\1\'])'), $module_auth) . ');');
+ eval('$is_auth = (int) (' . preg_replace(array('#acl_([a-z0-9_]+)(,\$id)?#', '#\$id#', '#aclf_([a-z0-9_]+)#', '#cfg_([a-z0-9_]+)#', '#request_([a-zA-Z0-9_]+)#'), array('(int) $auth->acl_get(\'\\1\'\\2)', '(int) $forum_id', '(int) $auth->acl_getf_global(\'\\1\')', '(int) $config[\'\\1\']', '$request->variable(\'\\1\', false)'), $module_auth) . ');');
return $is_auth;
}
@@ -380,6 +399,11 @@ class p_master
$id = request_var('icat', '');
}
+ if ($id && !is_numeric($id) && !$this->is_full_class($id))
+ {
+ $id = $this->p_class . '_' . $id;
+ }
+
$category = false;
foreach ($this->module_ary as $row_id => $item_ary)
{
@@ -388,9 +412,9 @@ class p_master
// If this is a module and no mode selected, select first mode
// If no category or module selected, go active for first module in first category
if (
- (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && (($item_ary['mode'] == $mode && !$item_ary['cat']) || ($icat && $item_ary['cat']))) ||
+ (($item_ary['name'] === $id || $item_ary['name'] === $this->p_class . '_' . $id || $item_ary['id'] === (int) $id) && (($item_ary['mode'] == $mode && !$item_ary['cat']) || ($icat && $item_ary['cat']))) ||
($item_ary['parent'] === $category && !$item_ary['cat'] && !$icat && $item_ary['display']) ||
- (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && !$mode && !$item_ary['cat']) ||
+ (($item_ary['name'] === $id || $item_ary['name'] === $this->p_class . '_' . $id || $item_ary['id'] === (int) $id) && !$mode && !$item_ary['cat']) ||
(!$id && !$mode && !$item_ary['cat'] && $item_ary['display'])
)
{
@@ -426,10 +450,12 @@ class p_master
* Loads currently active module
*
* This method loads a given module, passing it the relevant id and mode.
+ *
+ * @param string $mode mode, as passed through to the module
*/
function load_active($mode = false, $module_url = false, $execute_module = true)
{
- global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user;
+ global $phpbb_root_path, $phpbb_admin_path, $phpEx, $user, $template;
$module_path = $this->include_path . $this->p_class;
$icat = request_var('icat', '');
@@ -439,75 +465,110 @@ class p_master
trigger_error('Module not accessible', E_USER_ERROR);
}
- if (!class_exists("{$this->p_class}_$this->p_name"))
+ // new modules use the full class names, old ones are always called <type>_<name>, e.g. acp_board
+ if (!class_exists($this->p_name))
{
- if (!file_exists("$module_path/{$this->p_class}_$this->p_name.$phpEx"))
+ if (!file_exists("$module_path/{$this->p_name}.$phpEx"))
{
- trigger_error("Cannot find module $module_path/{$this->p_class}_$this->p_name.$phpEx", E_USER_ERROR);
+ trigger_error("Cannot find module $module_path/{$this->p_name}.$phpEx", E_USER_ERROR);
}
- include("$module_path/{$this->p_class}_$this->p_name.$phpEx");
+ include("$module_path/{$this->p_name}.$phpEx");
- if (!class_exists("{$this->p_class}_$this->p_name"))
+ if (!class_exists($this->p_name))
{
- trigger_error("Module file $module_path/{$this->p_class}_$this->p_name.$phpEx does not contain correct class [{$this->p_class}_$this->p_name]", E_USER_ERROR);
+ trigger_error("Module file $module_path/{$this->p_name}.$phpEx does not contain correct class [{$this->p_name}]", E_USER_ERROR);
}
+ }
- if (!empty($mode))
- {
- $this->p_mode = $mode;
- }
+ if (!empty($mode))
+ {
+ $this->p_mode = $mode;
+ }
+
+ // Create a new instance of the desired module ...
+ $class_name = $this->p_name;
- // Create a new instance of the desired module ... if it has a
- // constructor it will of course be executed
- $instance = "{$this->p_class}_$this->p_name";
+ $this->module = new $class_name($this);
- $this->module = new $instance($this);
+ // We pre-define the action parameter we are using all over the place
+ if (defined('IN_ADMIN'))
+ {
+ /*
+ * If this is an extension module, we'll try to automatically set
+ * the style paths for the extension (the ext author can change them
+ * if necessary).
+ */
+ $module_dir = explode('\\', get_class($this->module));
- // We pre-define the action parameter we are using all over the place
- if (defined('IN_ADMIN'))
+ // 0 vendor, 1 extension name, ...
+ if (isset($module_dir[1]))
{
- // Is first module automatically enabled a duplicate and the category not passed yet?
- if (!$icat && $this->module_ary[$this->active_module_row_id]['is_duplicate'])
+ $module_style_dir = $phpbb_root_path . 'ext/' . $module_dir[0] . '/' . $module_dir[1] . '/adm/style';
+
+ if (is_dir($module_style_dir))
{
- $icat = $this->module_ary[$this->active_module_row_id]['parent'];
+ $template->set_custom_style('adm', array($module_style_dir, $phpbb_admin_path . 'style'));
}
+ }
- // Not being able to overwrite ;)
- $this->module->u_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i={$this->p_name}") . (($icat) ? '&amp;icat=' . $icat : '') . "&amp;mode={$this->p_mode}";
+ // Is first module automatically enabled a duplicate and the category not passed yet?
+ if (!$icat && $this->module_ary[$this->active_module_row_id]['is_duplicate'])
+ {
+ $icat = $this->module_ary[$this->active_module_row_id]['parent'];
}
- else
+
+ // Not being able to overwrite ;)
+ $this->module->u_action = append_sid("{$phpbb_admin_path}index.$phpEx", "i={$this->p_name}") . (($icat) ? '&amp;icat=' . $icat : '') . "&amp;mode={$this->p_mode}";
+ }
+ else
+ {
+ /*
+ * If this is an extension module, we'll try to automatically set
+ * the style paths for the extension (the ext author can change them
+ * if necessary).
+ */
+ $module_dir = explode('_', get_class($this->module));
+
+ // 0 phpbb, 1 ext, 2 vendor, 3 extension name, ...
+ if (isset($module_dir[3]) && $module_dir[1] === 'ext')
{
- // If user specified the module url we will use it...
- if ($module_url !== false)
- {
- $this->module->u_action = $module_url;
- }
- else
+ $module_style_dir = 'ext/' . $module_dir[2] . '/' . $module_dir[3] . '/styles';
+
+ if (is_dir($phpbb_root_path . $module_style_dir))
{
- $this->module->u_action = $phpbb_root_path . (($user->page['page_dir']) ? $user->page['page_dir'] . '/' : '') . $user->page['page_name'];
+ $template->set_style(array($module_style_dir, 'styles'));
}
-
- $this->module->u_action = append_sid($this->module->u_action, "i={$this->p_name}") . (($icat) ? '&amp;icat=' . $icat : '') . "&amp;mode={$this->p_mode}";
}
- // Add url_extra parameter to u_action url
- if (!empty($this->module_ary) && $this->active_module !== false && $this->module_ary[$this->active_module_row_id]['url_extra'])
+ // If user specified the module url we will use it...
+ if ($module_url !== false)
{
- $this->module->u_action .= $this->module_ary[$this->active_module_row_id]['url_extra'];
+ $this->module->u_action = $module_url;
}
-
- // Assign the module path for re-usage
- $this->module->module_path = $module_path . '/';
-
- // Execute the main method for the new instance, we send the module id and mode as parameters
- // Users are able to call the main method after this function to be able to assign additional parameters manually
- if ($execute_module)
+ else
{
- $this->module->main($this->p_name, $this->p_mode);
+ $this->module->u_action = $phpbb_root_path . (($user->page['page_dir']) ? $user->page['page_dir'] . '/' : '') . $user->page['page_name'];
}
- return;
+ $this->module->u_action = append_sid($this->module->u_action, "i={$this->p_name}") . (($icat) ? '&amp;icat=' . $icat : '') . "&amp;mode={$this->p_mode}";
+ }
+
+ // Add url_extra parameter to u_action url
+ if (!empty($this->module_ary) && $this->active_module !== false && $this->module_ary[$this->active_module_row_id]['url_extra'])
+ {
+ $this->module->u_action .= $this->module_ary[$this->active_module_row_id]['url_extra'];
+ }
+
+ // Assign the module path for re-usage
+ $this->module->module_path = $module_path . '/';
+
+ // Execute the main method for the new instance, we send the module id and mode as parameters
+ // Users are able to call the main method after this function to be able to assign additional parameters manually
+ if ($execute_module)
+ {
+ $short_name = preg_replace("#^{$this->p_class}_#", '', $this->p_name);
+ $this->module->main($short_name, $this->p_mode);
}
}
@@ -546,7 +607,7 @@ class p_master
// If we find a name by this id and being enabled we have our active one...
foreach ($this->module_ary as $row_id => $item_ary)
{
- if (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && $item_ary['display'])
+ if (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && $item_ary['display'] || $item_ary['name'] === $this->p_class . '_' . $id)
{
if ($mode === false || $mode === $item_ary['mode'])
{
@@ -734,7 +795,26 @@ class p_master
}
}
- $u_title = $module_url . $delim . 'i=' . (($item_ary['cat']) ? $item_ary['id'] : $item_ary['name'] . (($item_ary['is_duplicate']) ? '&amp;icat=' . $current_id : '') . '&amp;mode=' . $item_ary['mode']);
+ $u_title = $module_url . $delim . 'i=';
+ // if the item has a name use it, else use its id
+ if (empty($item_ary['name']))
+ {
+ $u_title .= $item_ary['id'];
+ }
+ else
+ {
+ // if the category has a name, then use it.
+ $u_title .= $item_ary['name'];
+ }
+ // If the item is not a category append the mode
+ if (!$item_ary['cat'])
+ {
+ if ($item_ary['is_duplicate'])
+ {
+ $u_title .= '&amp;icat=' . $current_id;
+ }
+ $u_title .= '&amp;mode=' . $item_ary['mode'];
+ }
// Was not allowed in categories before - /*!$item_ary['cat'] && */
$u_title .= (isset($item_ary['url_extra'])) ? $item_ary['url_extra'] : '';
@@ -790,9 +870,22 @@ class p_master
/**
* Load module as the current active one without the need for registering it
+ *
+ * @param string $class module class (acp/mcp/ucp)
+ * @param string $name module name (class name of the module, or its basename
+ * phpbb_ext_foo_acp_bar_module, ucp_zebra or zebra)
+ * @param string $mode mode, as passed through to the module
+ *
*/
function load($class, $name, $mode = false)
{
+ // new modules use the full class names, old ones are always called <class>_<name>, e.g. acp_board
+ // in the latter case this function may be called as load('acp', 'board')
+ if (!class_exists($name) && substr($name, 0, strlen($class) + 1) !== $class . '_')
+ {
+ $name = $class . '_' . $name;
+ }
+
$this->p_class = $class;
$this->p_name = $name;
@@ -840,7 +933,7 @@ class p_master
{
foreach ($this->module_ary as $row_id => $item_ary)
{
- if (($item_ary['name'] === $id || $item_ary['id'] === (int) $id) && (!$mode || $item_ary['mode'] === $mode))
+ if (($item_ary['name'] === $id || $item_ary['name'] === $this->p_class . '_' . $id || $item_ary['id'] === (int) $id) && (!$mode || $item_ary['mode'] === $mode))
{
$this->module_ary[$row_id]['display'] = (int) $display;
}
@@ -854,30 +947,49 @@ class p_master
{
global $user, $phpEx;
- if (file_exists($user->lang_path . $user->lang_name . '/mods'))
- {
- $add_files = array();
+ global $phpbb_extension_manager;
- $dir = @opendir($user->lang_path . $user->lang_name . '/mods');
+ $finder = $phpbb_extension_manager->get_finder();
- if ($dir)
- {
- while (($entry = readdir($dir)) !== false)
- {
- if (strpos($entry, 'info_' . strtolower($module_class) . '_') === 0 && substr(strrchr($entry, '.'), 1) == $phpEx)
- {
- $add_files[] = 'mods/' . substr(basename($entry), 0, -(strlen($phpEx) + 1));
- }
- }
- closedir($dir);
- }
+ $lang_files = $finder
+ ->prefix('info_' . strtolower($module_class) . '_')
+ ->suffix(".$phpEx")
+ ->extension_directory('/language/' . $user->lang_name)
+ ->core_path('language/' . $user->lang_name . '/mods/')
+ ->find();
- if (sizeof($add_files))
- {
- $user->add_lang($add_files);
- }
+ foreach ($lang_files as $lang_file => $ext_name)
+ {
+ $user->add_lang_ext($ext_name, $lang_file);
}
}
-}
-?> \ No newline at end of file
+ /**
+ * Retrieve shortened module basename for legacy basenames (with xcp_ prefix)
+ *
+ * @param string $basename A module basename
+ * @return string The basename if it starts with phpbb_ or the basename with
+ * the current p_class (e.g. acp_) stripped.
+ */
+ protected function get_short_name($basename)
+ {
+ if (substr($basename, 0, 6) === 'phpbb\\' || strpos($basename, '\\') !== false)
+ {
+ return $basename;
+ }
+
+ // strip xcp_ prefix from old classes
+ return substr($basename, strlen($this->p_class) + 1);
+ }
+
+ /**
+ * Checks whether the given module basename is a correct class name
+ *
+ * @param string $basename A module basename
+ * @return bool True if the basename starts with phpbb_ or (x)cp_, false otherwise
+ */
+ protected function is_full_class($basename)
+ {
+ return (strpos($basename, '\\') !== false || preg_match('/^(ucp|mcp|acp)_/', $basename));
+ }
+}
diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php
index 11a5067ef9..ce1238d8e0 100644
--- a/phpBB/includes/functions_posting.php
+++ b/phpBB/includes/functions_posting.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -21,7 +20,7 @@ if (!defined('IN_PHPBB'))
*/
function generate_smilies($mode, $forum_id)
{
- global $auth, $db, $user, $config, $template;
+ global $db, $user, $config, $template, $phpbb_dispatcher;
global $phpEx, $phpbb_root_path;
$start = request_var('start', 0);
@@ -62,10 +61,7 @@ function generate_smilies($mode, $forum_id)
'body' => 'posting_smilies.html')
);
- $template->assign_var('PAGINATION',
- generate_pagination(append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id),
- $smiley_count, $config['smilies_per_page'], $start, true)
- );
+ generate_pagination(append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&amp;f=' . $forum_id), $smiley_count, $config['smilies_per_page'], $start);
}
$display_link = false;
@@ -127,6 +123,18 @@ function generate_smilies($mode, $forum_id)
}
}
+ /**
+ * This event is called after the smilies are populated
+ *
+ * @event core.generate_smilies_after
+ * @var string mode Mode of the smilies: window|inline
+ * @var int forum_id The forum ID we are currently in
+ * @var bool display_link Shall we display the "more smilies" link?
+ * @since 3.1-A1
+ */
+ $vars = array('mode', 'forum_id', 'display_link');
+ extract($phpbb_dispatcher->trigger_event('core.generate_smilies_after', compact($vars)));
+
if ($mode == 'inline' && $display_link)
{
$template->assign_vars(array(
@@ -168,7 +176,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
if ($type != 'topic')
{
$topic_join = ', ' . TOPICS_TABLE . ' t';
- $topic_condition = 'AND t.topic_id = p.topic_id AND t.topic_approved = 1';
+ $topic_condition = 'AND t.topic_id = p.topic_id AND t.topic_visibility = ' . ITEM_APPROVED;
}
else
{
@@ -182,7 +190,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
FROM ' . POSTS_TABLE . " p $topic_join
WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
$topic_condition
- AND p.post_approved = 1";
+ AND p.post_visibility = " . ITEM_APPROVED;
}
else
{
@@ -190,7 +198,7 @@ function update_post_information($type, $ids, $return_update_sql = false)
FROM ' . POSTS_TABLE . " p $topic_join
WHERE " . $db->sql_in_set('p.' . $type . '_id', $ids) . "
$topic_condition
- AND p.post_approved = 1
+ AND p.post_visibility = " . ITEM_APPROVED . "
GROUP BY p.{$type}_id";
}
$result = $db->sql_query($sql);
@@ -340,7 +348,7 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)
$topic_type_array[] = array(
'VALUE' => $topic_value['const'],
- 'S_CHECKED' => ($cur_topic_type == $topic_value['const'] || ($forum_id == 0 && $topic_value['const'] == POST_GLOBAL)) ? ' checked="checked"' : '',
+ 'S_CHECKED' => ($cur_topic_type == $topic_value['const']) ? ' checked="checked"' : '',
'L_TOPIC_TYPE' => $user->lang[$topic_value['lang']]
);
}
@@ -395,14 +403,7 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage
$upload->set_disallowed_content(explode('|', $config['mime_triggers']));
}
- if (!$local)
- {
- $filedata['post_attach'] = ($upload->is_valid($form_name)) ? true : false;
- }
- else
- {
- $filedata['post_attach'] = true;
- }
+ $filedata['post_attach'] = $local || $upload->is_valid($form_name);
if (!$filedata['post_attach'])
{
@@ -421,20 +422,18 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage
return $filedata;
}
- $cat_id = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] : ATTACHMENT_CATEGORY_NONE;
-
- // Do we have to create a thumbnail?
- $filedata['thumbnail'] = ($cat_id == ATTACHMENT_CATEGORY_IMAGE && $config['img_create_thumbnail']) ? 1 : 0;
-
- // Check Image Size, if it is an image
- if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id) && $cat_id == ATTACHMENT_CATEGORY_IMAGE)
- {
- $file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']);
- }
+ // Whether the uploaded file is in the image category
+ $is_image = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE : false;
- // Admins and mods are allowed to exceed the allowed filesize
if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id))
{
+ // Check Image Size, if it is an image
+ if ($is_image)
+ {
+ $file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']);
+ }
+
+ // Admins and mods are allowed to exceed the allowed filesize
if (!empty($extensions[$file->get('extension')]['max_filesize']))
{
$allowed_filesize = $extensions[$file->get('extension')]['max_filesize'];
@@ -449,10 +448,12 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage
$file->clean_filename('unique', $user->data['user_id'] . '_');
- // Are we uploading an image *and* this image being within the image category? Only then perform additional image checks.
- $no_image = ($cat_id == ATTACHMENT_CATEGORY_IMAGE) ? false : true;
+ // Are we uploading an image *and* this image being within the image category?
+ // Only then perform additional image checks.
+ $file->move_file($config['upload_path'], false, !$is_image);
- $file->move_file($config['upload_path'], false, $no_image);
+ // Do we have to create a thumbnail?
+ $filedata['thumbnail'] = ($is_image && $config['img_create_thumbnail']) ? 1 : 0;
if (sizeof($file->error))
{
@@ -464,7 +465,7 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage
}
// Make sure the image category only holds valid images...
- if ($cat_id == ATTACHMENT_CATEGORY_IMAGE && !$file->is_image())
+ if ($is_image && !$file->is_image())
{
$file->remove();
@@ -569,30 +570,30 @@ function get_supported_image_types($type = false)
if ($type !== false)
{
// Type is one of the IMAGETYPE constants - it is fetched from getimagesize()
- // We do not use the constants here, because some were not available in PHP 4.3.x
switch ($type)
{
// GIF
- case 1:
+ case IMAGETYPE_GIF:
$new_type = ($format & IMG_GIF) ? IMG_GIF : false;
break;
// JPG, JPC, JP2
- case 2:
- case 9:
- case 10:
- case 11:
- case 12:
+ case IMAGETYPE_JPEG:
+ case IMAGETYPE_JPC:
+ case IMAGETYPE_JPEG2000:
+ case IMAGETYPE_JP2:
+ case IMAGETYPE_JPX:
+ case IMAGETYPE_JB2:
$new_type = ($format & IMG_JPG) ? IMG_JPG : false;
break;
// PNG
- case 3:
+ case IMAGETYPE_PNG:
$new_type = ($format & IMG_PNG) ? IMG_PNG : false;
break;
// WBMP
- case 15:
+ case IMAGETYPE_WBMP:
$new_type = ($format & IMG_WBMP) ? IMG_WBMP : false;
break;
}
@@ -812,7 +813,7 @@ function posting_gen_inline_attachments(&$attachment_data)
*/
function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_attach_box = true)
{
- global $template, $config, $phpbb_root_path, $phpEx, $user, $auth;
+ global $template, $config, $phpbb_root_path, $phpEx, $user;
// Some default template variables
$template->assign_vars(array(
@@ -981,13 +982,15 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms
function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true)
{
global $user, $auth, $db, $template, $bbcode, $cache;
- global $config, $phpbb_root_path, $phpEx;
+ global $config, $phpbb_root_path, $phpEx, $phpbb_container;
+
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
// Go ahead and pull all data for this topic
$sql = 'SELECT p.post_id
FROM ' . POSTS_TABLE . ' p' . "
WHERE p.topic_id = $topic_id
- " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . '
+ AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id, 'p.') . '
' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '
' . (($mode == 'post_review_edit') ? " AND p.post_id = $cur_post_id" : '') . '
ORDER BY p.post_time ';
@@ -1014,7 +1017,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
$mode = 'post_review';
}
- $sql = $db->sql_build_query('SELECT', array(
+ $sql_ary = array(
'SELECT' => 'u.username, u.user_id, u.user_colour, p.*, z.friend, z.foe',
'FROM' => array(
@@ -1025,14 +1028,15 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
'LEFT_JOIN' => array(
array(
'FROM' => array(ZEBRA_TABLE => 'z'),
- 'ON' => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id'
- )
+ 'ON' => 'z.user_id = ' . $user->data['user_id'] . ' AND z.zebra_id = p.poster_id',
+ ),
),
'WHERE' => $db->sql_in_set('p.post_id', $post_list) . '
- AND u.user_id = p.poster_id'
- ));
+ AND u.user_id = p.poster_id',
+ );
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query($sql);
$bbcode_bitfield = '';
@@ -1087,29 +1091,24 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
continue;
}
- $row =& $rowset[$post_list[$i]];
+ $row = $rowset[$post_list[$i]];
$poster_id = $row['user_id'];
$post_subject = $row['post_subject'];
- $message = censor_text($row['post_text']);
$decoded_message = false;
if ($show_quote_button && $auth->acl_get('f_reply', $forum_id))
{
- $decoded_message = $message;
+ $decoded_message = censor_text($row['post_text']);
decode_message($decoded_message, $row['bbcode_uid']);
$decoded_message = bbcode_nl2br($decoded_message);
}
- if ($row['bbcode_bitfield'])
- {
- $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message, !$row['enable_smilies']);
+ $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0);
+ $parse_flags |= ($row['enable_smilies'] ? OPTION_FLAG_SMILIES : 0);
+ $message = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, true);
if (!empty($attachments[$row['post_id']]))
{
@@ -1166,238 +1165,6 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id
return true;
}
-/**
-* User Notification
-*/
-function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id, $topic_id, $post_id, $author_name = '')
-{
- global $db, $user, $config, $phpbb_root_path, $phpEx, $auth;
-
- $topic_notification = ($mode == 'reply' || $mode == 'quote') ? true : false;
- $forum_notification = ($mode == 'post') ? true : false;
-
- if (!$topic_notification && !$forum_notification)
- {
- trigger_error('NO_MODE');
- }
-
- if (($topic_notification && !$config['allow_topic_notify']) || ($forum_notification && !$config['allow_forum_notify']))
- {
- return;
- }
-
- $topic_title = ($topic_notification) ? $topic_title : $subject;
- $topic_title = censor_text($topic_title);
-
- // Exclude guests, current user and banned users from notifications
- if (!function_exists('phpbb_get_banned_user_ids'))
- {
- include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
- }
- $sql_ignore_users = phpbb_get_banned_user_ids();
- $sql_ignore_users[ANONYMOUS] = ANONYMOUS;
- $sql_ignore_users[$user->data['user_id']] = $user->data['user_id'];
-
- $notify_rows = array();
-
- // -- get forum_userids || topic_userids
- $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
- FROM ' . (($topic_notification) ? TOPICS_WATCH_TABLE : FORUMS_WATCH_TABLE) . ' w, ' . USERS_TABLE . ' u
- WHERE w.' . (($topic_notification) ? 'topic_id' : 'forum_id') . ' = ' . (($topic_notification) ? $topic_id : $forum_id) . '
- AND ' . $db->sql_in_set('w.user_id', $sql_ignore_users, true) . '
- AND w.notify_status = ' . NOTIFY_YES . '
- AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')
- AND u.user_id = w.user_id';
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $notify_user_id = (int) $row['user_id'];
- $notify_rows[$notify_user_id] = array(
- 'user_id' => $notify_user_id,
- 'username' => $row['username'],
- 'user_email' => $row['user_email'],
- 'user_jabber' => $row['user_jabber'],
- 'user_lang' => $row['user_lang'],
- 'notify_type' => ($topic_notification) ? 'topic' : 'forum',
- 'template' => ($topic_notification) ? 'topic_notify' : 'newtopic_notify',
- 'method' => $row['user_notify_type'],
- 'allowed' => false
- );
-
- // Add users who have been already notified to ignore list
- $sql_ignore_users[$notify_user_id] = $notify_user_id;
- }
- $db->sql_freeresult($result);
-
- // forum notification is sent to those not already receiving topic notifications
- if ($topic_notification)
- {
- $sql = 'SELECT u.user_id, u.username, u.user_email, u.user_lang, u.user_notify_type, u.user_jabber
- FROM ' . FORUMS_WATCH_TABLE . ' fw, ' . USERS_TABLE . " u
- WHERE fw.forum_id = $forum_id
- AND " . $db->sql_in_set('fw.user_id', $sql_ignore_users, true) . '
- AND fw.notify_status = ' . NOTIFY_YES . '
- AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')
- AND u.user_id = fw.user_id';
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $notify_user_id = (int) $row['user_id'];
- $notify_rows[$notify_user_id] = array(
- 'user_id' => $notify_user_id,
- 'username' => $row['username'],
- 'user_email' => $row['user_email'],
- 'user_jabber' => $row['user_jabber'],
- 'user_lang' => $row['user_lang'],
- 'notify_type' => 'forum',
- 'template' => 'forum_notify',
- 'method' => $row['user_notify_type'],
- 'allowed' => false
- );
- }
- $db->sql_freeresult($result);
- }
-
- if (!sizeof($notify_rows))
- {
- return;
- }
-
- // Make sure users are allowed to read the forum
- foreach ($auth->acl_get_list(array_keys($notify_rows), 'f_read', $forum_id) as $forum_id => $forum_ary)
- {
- foreach ($forum_ary as $auth_option => $user_ary)
- {
- foreach ($user_ary as $user_id)
- {
- $notify_rows[$user_id]['allowed'] = true;
- }
- }
- }
-
- // Now, we have to do a little step before really sending, we need to distinguish our users a little bit. ;)
- $msg_users = $delete_ids = $update_notification = array();
- foreach ($notify_rows as $user_id => $row)
- {
- if (!$row['allowed'] || !trim($row['user_email']))
- {
- $delete_ids[$row['notify_type']][] = $row['user_id'];
- }
- else
- {
- $msg_users[] = $row;
- $update_notification[$row['notify_type']][] = $row['user_id'];
-
- /*
- * We also update the forums watch table for this user when we are
- * sending out a topic notification to prevent sending out another
- * notification in case this user is also subscribed to the forum
- * this topic was posted in.
- * Since an UPDATE query is used, this has no effect on users only
- * subscribed to the topic (i.e. no row is created) and should not
- * be a performance issue.
- */
- if ($row['notify_type'] === 'topic')
- {
- $update_notification['forum'][] = $row['user_id'];
- }
- }
- }
- unset($notify_rows);
-
- // Now, we are able to really send out notifications
- if (sizeof($msg_users))
- {
- include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $messenger = new messenger();
-
- $msg_list_ary = array();
- foreach ($msg_users as $row)
- {
- $pos = (!isset($msg_list_ary[$row['template']])) ? 0 : sizeof($msg_list_ary[$row['template']]);
-
- $msg_list_ary[$row['template']][$pos]['method'] = $row['method'];
- $msg_list_ary[$row['template']][$pos]['email'] = $row['user_email'];
- $msg_list_ary[$row['template']][$pos]['jabber'] = $row['user_jabber'];
- $msg_list_ary[$row['template']][$pos]['name'] = $row['username'];
- $msg_list_ary[$row['template']][$pos]['lang'] = $row['user_lang'];
- $msg_list_ary[$row['template']][$pos]['user_id']= $row['user_id'];
- }
- unset($msg_users);
-
- foreach ($msg_list_ary as $email_template => $email_list)
- {
- foreach ($email_list as $addr)
- {
- $messenger->template($email_template, $addr['lang']);
-
- $messenger->to($addr['email'], $addr['name']);
- $messenger->im($addr['jabber'], $addr['name']);
-
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($addr['name']),
- 'TOPIC_TITLE' => htmlspecialchars_decode($topic_title),
- 'FORUM_NAME' => htmlspecialchars_decode($forum_name),
- 'AUTHOR_NAME' => htmlspecialchars_decode($author_name),
-
- 'U_FORUM' => generate_board_url() . "/viewforum.$phpEx?f=$forum_id",
- 'U_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id",
- 'U_NEWEST_POST' => generate_board_url() . "/viewtopic.$phpEx?f=$forum_id&t=$topic_id&p=$post_id&e=$post_id",
- 'U_STOP_WATCHING_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?uid={$addr['user_id']}&f=$forum_id&t=$topic_id&unwatch=topic",
- 'U_STOP_WATCHING_FORUM' => generate_board_url() . "/viewforum.$phpEx?uid={$addr['user_id']}&f=$forum_id&unwatch=forum",
- ));
-
- $messenger->send($addr['method']);
- }
- }
- unset($msg_list_ary);
-
- $messenger->save_queue();
- }
-
- // Handle the DB updates
- $db->sql_transaction('begin');
-
- if (!empty($update_notification['topic']))
- {
- $sql = 'UPDATE ' . TOPICS_WATCH_TABLE . '
- SET notify_status = ' . NOTIFY_NO . "
- WHERE topic_id = $topic_id
- AND " . $db->sql_in_set('user_id', $update_notification['topic']);
- $db->sql_query($sql);
- }
-
- if (!empty($update_notification['forum']))
- {
- $sql = 'UPDATE ' . FORUMS_WATCH_TABLE . '
- SET notify_status = ' . NOTIFY_NO . "
- WHERE forum_id = $forum_id
- AND " . $db->sql_in_set('user_id', $update_notification['forum']);
- $db->sql_query($sql);
- }
-
- // Now delete the user_ids not authorised to receive notifications on this topic/forum
- if (!empty($delete_ids['topic']))
- {
- $sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . "
- WHERE topic_id = $topic_id
- AND " . $db->sql_in_set('user_id', $delete_ids['topic']);
- $db->sql_query($sql);
- }
-
- if (!empty($delete_ids['forum']))
- {
- $sql = 'DELETE FROM ' . FORUMS_WATCH_TABLE . "
- WHERE forum_id = $forum_id
- AND " . $db->sql_in_set('user_id', $delete_ids['forum']);
- $db->sql_query($sql);
- }
-
- $db->sql_transaction('commit');
-}
-
//
// Post handling functions
//
@@ -1405,14 +1172,14 @@ function user_notification($mode, $subject, $topic_title, $forum_name, $forum_id
/**
* Delete Post
*/
-function delete_post($forum_id, $topic_id, $post_id, &$data)
+function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $softdelete_reason = '')
{
- global $db, $user, $auth;
+ global $db, $user, $auth, $phpbb_container;
global $config, $phpEx, $phpbb_root_path;
// Specify our post mode
$post_mode = 'delete';
- if (($data['topic_first_post_id'] === $data['topic_last_post_id']) && $data['topic_replies_real'] == 0)
+ if (($data['topic_first_post_id'] === $data['topic_last_post_id']) && ($data['topic_posts_approved'] + $data['topic_posts_unapproved'] + $data['topic_posts_softdeleted'] == 1))
{
$post_mode = 'delete_topic';
}
@@ -1454,20 +1221,30 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
$db->sql_freeresult($result);
}
- if (!delete_posts('post_id', array($post_id), false, false))
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+ // (Soft) delete the post
+ if ($is_soft && ($post_mode != 'delete_topic'))
{
- // Try to delete topic, we may had an previous error causing inconsistency
- if ($post_mode == 'delete_topic')
+ $phpbb_content_visibility->set_post_visibility(ITEM_DELETED, $post_id, $topic_id, $forum_id, $user->data['user_id'], time(), $softdelete_reason, ($data['topic_first_post_id'] == $post_id), ($data['topic_last_post_id'] == $post_id));
+ }
+ else if (!$is_soft)
+ {
+ if (!delete_posts('post_id', array($post_id), false, false, false))
{
- delete_topics('topic_id', array($topic_id), false);
+ // Try to delete topic, we may had an previous error causing inconsistency
+ if ($post_mode == 'delete_topic')
+ {
+ delete_topics('topic_id', array($topic_id), false);
+ }
+ trigger_error('ALREADY_DELETED');
}
- trigger_error('ALREADY_DELETED');
}
$db->sql_transaction('commit');
// Collect the necessary information for updating the tables
- $sql_data[FORUMS_TABLE] = '';
+ $sql_data[FORUMS_TABLE] = $sql_data[TOPICS_TABLE] = '';
switch ($post_mode)
{
case 'delete_topic':
@@ -1476,24 +1253,43 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
{
// counting is fun! we only have to do sizeof($forum_ids) number of queries,
// even if the topic is moved back to where its shadow lives (we count how many times it is in a forum)
- $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET forum_topics_real = forum_topics_real - ' . $topic_count . ', forum_topics = forum_topics - ' . $topic_count . ' WHERE forum_id = ' . $updated_forum);
+ $sql = 'UPDATE ' . FORUMS_TABLE . '
+ SET forum_topics_approved = forum_topics_approved - ' . $topic_count . '
+ WHERE forum_id = ' . $updated_forum;
+ $db->sql_query($sql);
update_post_information('forum', $updated_forum);
}
- delete_topics('topic_id', array($topic_id), false);
-
- if ($data['topic_type'] != POST_GLOBAL)
+ if ($is_soft)
{
- $sql_data[FORUMS_TABLE] .= 'forum_topics_real = forum_topics_real - 1';
- $sql_data[FORUMS_TABLE] .= ($data['topic_approved']) ? ', forum_posts = forum_posts - 1, forum_topics = forum_topics - 1' : '';
+ $topic_row = array();
+ $phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $forum_id, $user->data['user_id'], time(), $softdelete_reason);
}
-
- $update_sql = update_post_information('forum', $forum_id, true);
- if (sizeof($update_sql))
+ else
{
- $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
- $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
+ delete_topics('topic_id', array($topic_id), false);
+
+ if ($data['topic_visibility'] == ITEM_APPROVED)
+ {
+ $sql_data[FORUMS_TABLE] .= 'forum_posts_approved = forum_posts_approved - 1, forum_topics_approved = forum_topics_approved - 1';
+ }
+ else if ($data['topic_visibility'] == ITEM_UNAPPROVED)
+ {
+ $sql_data[FORUMS_TABLE] .= 'forum_posts_unapproved = forum_posts_unapproved - 1, forum_topics_unapproved = forum_topics_unapproved - 1';
+ }
+ else if ($data['topic_visibility'] == ITEM_DELETED)
+ {
+ $sql_data[FORUMS_TABLE] .= 'forum_posts_softdeleted = forum_posts_softdeleted - 1, forum_topics_softdeleted = forum_topics_softdeleted - 1';
+ }
+
+ $update_sql = update_post_information('forum', $forum_id, true);
+ if (sizeof($update_sql))
+ {
+ $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
+ $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
+ }
}
+
break;
case 'delete_first_post':
@@ -1501,82 +1297,101 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
WHERE p.topic_id = $topic_id
AND p.poster_id = u.user_id
- ORDER BY p.post_time ASC";
+ AND p.post_visibility = " . ITEM_APPROVED . '
+ ORDER BY p.post_time ASC';
$result = $db->sql_query_limit($sql, 1);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- if ($data['topic_type'] != POST_GLOBAL)
+ if (!$row)
{
- $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
+ // No approved post, so the first is a not-approved post (unapproved or soft deleted)
+ $sql = 'SELECT p.post_id, p.poster_id, p.post_time, p.post_username, u.username, u.user_colour
+ FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
+ WHERE p.topic_id = $topic_id
+ AND p.poster_id = u.user_id
+ ORDER BY p.post_time ASC";
+ $result = $db->sql_query_limit($sql, 1);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
}
- $sql_data[TOPICS_TABLE] = 'topic_poster = ' . intval($row['poster_id']) . ', topic_first_post_id = ' . intval($row['post_id']) . ", topic_first_poster_colour = '" . $db->sql_escape($row['user_colour']) . "', topic_first_poster_name = '" . (($row['poster_id'] == ANONYMOUS) ? $db->sql_escape($row['post_username']) : $db->sql_escape($row['username'])) . "', topic_time = " . (int) $row['post_time'];
-
- // Decrementing topic_replies here is fine because this case only happens if there is more than one post within the topic - basically removing one "reply"
- $sql_data[TOPICS_TABLE] .= ', topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
-
$next_post_id = (int) $row['post_id'];
+
+ $sql_data[TOPICS_TABLE] = $db->sql_build_array('UPDATE', array(
+ 'topic_poster' => (int) $row['poster_id'],
+ 'topic_first_post_id' => (int) $row['post_id'],
+ 'topic_first_poster_colour' => $row['user_colour'],
+ 'topic_first_poster_name' => ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username'],
+ 'topic_time' => (int) $row['post_time'],
+ ));
break;
case 'delete_last_post':
- if ($data['topic_type'] != POST_GLOBAL)
- {
- $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
- }
-
- $update_sql = update_post_information('forum', $forum_id, true);
- if (sizeof($update_sql))
+ if (!$is_soft)
{
- $sql_data[FORUMS_TABLE] .= ($sql_data[FORUMS_TABLE]) ? ', ' : '';
- $sql_data[FORUMS_TABLE] .= implode(', ', $update_sql[$forum_id]);
- }
+ // Update last post information when hard deleting. Soft delete already did that by itself.
+ $update_sql = update_post_information('forum', $forum_id, true);
+ if (sizeof($update_sql))
+ {
+ $sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . implode(', ', $update_sql[$forum_id]);
+ }
- $sql_data[TOPICS_TABLE] = 'topic_bumped = 0, topic_bumper = 0, topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
+ $sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_bumped = 0, topic_bumper = 0';
- $update_sql = update_post_information('topic', $topic_id, true);
- if (sizeof($update_sql))
- {
- $sql_data[TOPICS_TABLE] .= ', ' . implode(', ', $update_sql[$topic_id]);
- $next_post_id = (int) str_replace('topic_last_post_id = ', '', $update_sql[$topic_id][0]);
+ $update_sql = update_post_information('topic', $topic_id, true);
+ if (!empty($update_sql))
+ {
+ $sql_data[TOPICS_TABLE] .= ', ' . implode(', ', $update_sql[$topic_id]);
+ $next_post_id = (int) str_replace('topic_last_post_id = ', '', $update_sql[$topic_id][0]);
+ }
}
- else
+
+ if (!$next_post_id)
{
$sql = 'SELECT MAX(post_id) as last_post_id
FROM ' . POSTS_TABLE . "
- WHERE topic_id = $topic_id " .
- ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : '');
+ WHERE topic_id = $topic_id
+ AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id);
$result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
+ $next_post_id = (int) $db->sql_fetchfield('last_post_id');
$db->sql_freeresult($result);
-
- $next_post_id = (int) $row['last_post_id'];
}
break;
case 'delete':
$sql = 'SELECT post_id
FROM ' . POSTS_TABLE . "
- WHERE topic_id = $topic_id " .
- ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND post_approved = 1' : '') . '
+ WHERE topic_id = $topic_id
+ AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id) . '
AND post_time > ' . $data['post_time'] . '
ORDER BY post_time ASC';
$result = $db->sql_query_limit($sql, 1);
- $row = $db->sql_fetchrow($result);
+ $next_post_id = (int) $db->sql_fetchfield('post_id');
$db->sql_freeresult($result);
-
- if ($data['topic_type'] != POST_GLOBAL)
- {
- $sql_data[FORUMS_TABLE] = ($data['post_approved']) ? 'forum_posts = forum_posts - 1' : '';
- }
-
- $sql_data[TOPICS_TABLE] = 'topic_replies_real = topic_replies_real - 1' . (($data['post_approved']) ? ', topic_replies = topic_replies - 1' : '');
- $next_post_id = (int) $row['post_id'];
break;
}
if (($post_mode == 'delete') || ($post_mode == 'delete_last_post') || ($post_mode == 'delete_first_post'))
{
+ if (!$is_soft)
+ {
+ if ($data['post_visibility'] == ITEM_APPROVED)
+ {
+ $phpbb_content_visibility->remove_post_from_statistic($data, $sql_data);
+ }
+ else if ($data['post_visibility'] == ITEM_UNAPPROVED)
+ {
+ $sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_unapproved = forum_posts_unapproved - 1';
+ $sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_unapproved = topic_posts_unapproved - 1';
+ }
+ else if ($data['post_visibility'] == ITEM_DELETED)
+ {
+ $sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_softdeleted = forum_posts_softdeleted - 1';
+ $sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_softdeleted = topic_posts_softdeleted - 1';
+ }
+ }
+
$sql = 'SELECT 1 AS has_attachments
FROM ' . ATTACHMENTS_TABLE . '
WHERE topic_id = ' . $topic_id;
@@ -1586,18 +1401,16 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
if (!$has_attachments)
{
- $sql_data[TOPICS_TABLE] .= ', topic_attachment = 0';
+ $sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_attachment = 0';
}
}
-// $sql_data[USERS_TABLE] = ($data['post_postcount']) ? 'user_posts = user_posts - 1' : '';
-
$db->sql_transaction('begin');
$where_sql = array(
FORUMS_TABLE => "forum_id = $forum_id",
TOPICS_TABLE => "topic_id = $topic_id",
- USERS_TABLE => 'user_id = ' . $data['poster_id']
+ USERS_TABLE => 'user_id = ' . $data['poster_id'],
);
foreach ($sql_data as $table => $update_sql)
@@ -1645,7 +1458,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data)
*/
function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true)
{
- global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path;
+ global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container;
// We do not handle erasing posts here
if ($mode == 'delete')
@@ -1667,22 +1480,22 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
else if ($mode == 'edit')
{
- $post_mode = ($data['topic_replies_real'] == 0) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
+ $post_mode = ($data['topic_posts_approved'] + $data['topic_posts_unapproved'] + $data['topic_posts_softdeleted'] == 1) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit'));
}
// First of all make sure the subject and topic title are having the correct length.
// To achieve this without cutting off between special chars we convert to an array and then count the elements.
- $subject = truncate_string($subject);
- $data['topic_title'] = truncate_string($data['topic_title']);
+ $subject = truncate_string($subject, 120);
+ $data['topic_title'] = truncate_string($data['topic_title'], 120);
// Collect some basic information about which tables and which rows to update/insert
$sql_data = $topic_row = array();
$poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id'];
// Retrieve some additional information if not present
- if ($mode == 'edit' && (!isset($data['post_approved']) || !isset($data['topic_approved']) || $data['post_approved'] === false || $data['topic_approved'] === false))
+ if ($mode == 'edit' && (!isset($data['post_visibility']) || !isset($data['topic_visibility']) || $data['post_visibility'] === false || $data['topic_visibility'] === false))
{
- $sql = 'SELECT p.post_approved, t.topic_type, t.topic_replies, t.topic_replies_real, t.topic_approved
+ $sql = 'SELECT p.post_visibility, t.topic_type, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_visibility
FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
WHERE t.topic_id = p.topic_id
AND p.post_id = ' . $data['post_id'];
@@ -1690,26 +1503,29 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$topic_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- $data['topic_approved'] = $topic_row['topic_approved'];
- $data['post_approved'] = $topic_row['post_approved'];
+ $data['topic_visibility'] = $topic_row['topic_visibility'];
+ $data['post_visibility'] = $topic_row['post_visibility'];
}
- // This variable indicates if the user is able to post or put into the queue - it is used later for all code decisions regarding approval
- // The variable name should be $post_approved, because it indicates if the post is approved or not
- $post_approval = 1;
+ // This variable indicates if the user is able to post or put into the queue
+ $post_visibility = ITEM_APPROVED;
// Check the permissions for post approval.
// Moderators must go through post approval like ordinary users.
if (!$auth->acl_get('f_noapprove', $data['forum_id']))
{
// Post not approved, but in queue
- $post_approval = 0;
+ $post_visibility = ITEM_UNAPPROVED;
}
- // Mods are able to force approved/unapproved posts. True means the post is approved, false the post is unapproved
+ // MODs/Extensions are able to force any visibility on posts
if (isset($data['force_approved_state']))
{
- $post_approval = ($data['force_approved_state']) ? 1 : 0;
+ $post_visibility = (in_array((int) $data['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_approved_state'] : $post_visibility;
+ }
+ if (isset($data['force_visibility']))
+ {
+ $post_visibility = (in_array((int) $data['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_visibility'] : $post_visibility;
}
// Start the transaction here
@@ -1721,12 +1537,12 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
case 'post':
case 'reply':
$sql_data[POSTS_TABLE]['sql'] = array(
- 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
+ 'forum_id' => $data['forum_id'],
'poster_id' => (int) $user->data['user_id'],
'icon_id' => $data['icon_id'],
'poster_ip' => $user->ip,
'post_time' => $current_time,
- 'post_approved' => $post_approval,
+ 'post_visibility' => $post_visibility,
'enable_bbcode' => $data['enable_bbcode'],
'enable_smilies' => $data['enable_smilies'],
'enable_magic_url' => $data['enable_urls'],
@@ -1789,10 +1605,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
- 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
+ 'forum_id' => $data['forum_id'],
'poster_id' => $data['poster_id'],
'icon_id' => $data['icon_id'],
- 'post_approved' => (!$post_approval) ? 0 : $data['post_approved'],
+ // We will change the visibility later
+ //'post_visibility' => $post_visibility,
'enable_bbcode' => $data['enable_bbcode'],
'enable_smilies' => $data['enable_smilies'],
'enable_magic_url' => $data['enable_urls'],
@@ -1813,8 +1630,6 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
break;
}
-
- $post_approved = $sql_data[POSTS_TABLE]['sql']['post_approved'];
$topic_row = array();
// And the topic ladies and gentlemen
@@ -1825,9 +1640,13 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
'topic_poster' => (int) $user->data['user_id'],
'topic_time' => $current_time,
'topic_last_view_time' => $current_time,
- 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
+ 'forum_id' => $data['forum_id'],
'icon_id' => $data['icon_id'],
- 'topic_approved' => $post_approval,
+ 'topic_posts_approved' => ($post_visibility == ITEM_APPROVED) ? 1 : 0,
+ 'topic_posts_softdeleted' => ($post_visibility == ITEM_DELETED) ? 1 : 0,
+ 'topic_posts_unapproved' => ($post_visibility == ITEM_UNAPPROVED) ? 1 : 0,
+ 'topic_visibility' => $post_visibility,
+ 'topic_delete_user' => ($post_visibility != ITEM_APPROVED) ? (int) $user->data['user_id'] : 0,
'topic_title' => $subject,
'topic_first_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
'topic_first_poster_colour' => $user->data['user_colour'],
@@ -1859,31 +1678,47 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
);
}
- $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_approval) ? ', user_posts = user_posts + 1' : '');
+ $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
- if ($topic_type != POST_GLOBAL)
+ if ($post_visibility == ITEM_APPROVED)
{
- if ($post_approval)
- {
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1';
- }
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . (($post_approval) ? ', forum_topics = forum_topics + 1' : '');
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_approved = forum_topics_approved + 1';
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_approved = forum_posts_approved + 1';
+ }
+ else if ($post_visibility == ITEM_UNAPPROVED)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_unapproved = forum_topics_unapproved + 1';
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_unapproved = forum_posts_unapproved + 1';
+ }
+ else if ($post_visibility == ITEM_DELETED)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_softdeleted = forum_topics_softdeleted + 1';
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_softdeleted = forum_posts_softdeleted + 1';
}
break;
case 'reply':
$sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_view_time = ' . $current_time . ',
- topic_replies_real = topic_replies_real + 1,
topic_bumped = 0,
topic_bumper = 0' .
- (($post_approval) ? ', topic_replies = topic_replies + 1' : '') .
+ (($post_visibility == ITEM_APPROVED) ? ', topic_posts_approved = topic_posts_approved + 1' : '') .
+ (($post_visibility == ITEM_UNAPPROVED) ? ', topic_posts_unapproved = topic_posts_unapproved + 1' : '') .
+ (($post_visibility == ITEM_DELETED) ? ', topic_posts_softdeleted = topic_posts_softdeleted + 1' : '') .
((!empty($data['attachment_data']) || (isset($data['topic_attachment']) && $data['topic_attachment'])) ? ', topic_attachment = 1' : '');
- $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_approval) ? ', user_posts = user_posts + 1' : '');
+ $sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');
- if ($post_approval && $topic_type != POST_GLOBAL)
+ if ($post_visibility == ITEM_APPROVED)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_approved = forum_posts_approved + 1';
+ }
+ else if ($post_visibility == ITEM_UNAPPROVED)
{
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + 1';
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_unapproved = forum_posts_unapproved + 1';
+ }
+ else if ($post_visibility == ITEM_DELETED)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts_softdeleted = forum_posts_softdeleted + 1';
}
break;
@@ -1905,9 +1740,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
$sql_data[TOPICS_TABLE]['sql'] = array(
- 'forum_id' => ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id'],
+ 'forum_id' => $data['forum_id'],
'icon_id' => $data['icon_id'],
- 'topic_approved' => (!$post_approval) ? 0 : $data['topic_approved'],
'topic_title' => $subject,
'topic_first_poster_name' => $username,
'topic_type' => $topic_type,
@@ -1922,56 +1756,6 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
'topic_attachment' => (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0),
);
- // Correctly set back the topic replies and forum posts... only if the topic was approved before and now gets disapproved
- if (!$post_approval && $data['topic_approved'])
- {
- // Do we need to grab some topic informations?
- if (!sizeof($topic_row))
- {
- $sql = 'SELECT topic_type, topic_replies, topic_replies_real, topic_approved
- FROM ' . TOPICS_TABLE . '
- WHERE topic_id = ' . $data['topic_id'];
- $result = $db->sql_query($sql);
- $topic_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- }
-
- // If this is the only post remaining we do not need to decrement topic_replies.
- // Also do not decrement if first post - then the topic_replies will not be adjusted if approving the topic again.
-
- // If this is an edited topic or the first post the topic gets completely disapproved later on...
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics = forum_topics - 1';
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - ' . ($topic_row['topic_replies'] + 1);
-
- set_config_count('num_topics', -1, true);
- set_config_count('num_posts', ($topic_row['topic_replies'] + 1) * (-1), true);
-
- // Only decrement this post, since this is the one non-approved now
- if ($auth->acl_get('f_postcount', $data['forum_id']))
- {
- $sql_data[USERS_TABLE]['stat'][] = 'user_posts = user_posts - 1';
- }
- }
-
- break;
-
- case 'edit':
- case 'edit_last_post':
-
- // Correctly set back the topic replies and forum posts... but only if the post was approved before.
- if (!$post_approval && $data['post_approved'])
- {
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_replies = topic_replies - 1, topic_last_view_time = ' . $current_time;
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - 1';
-
- set_config_count('num_posts', -1, true);
-
- if ($auth->acl_get('f_postcount', $data['forum_id']))
- {
- $sql_data[USERS_TABLE]['stat'][] = 'user_posts = user_posts - 1';
- }
- }
-
break;
}
@@ -1996,83 +1780,49 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
if ($post_mode == 'reply')
{
$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array(
- 'topic_id' => $data['topic_id'])
- );
+ 'topic_id' => $data['topic_id'],
+ ));
}
$sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);
$db->sql_query($sql);
$data['post_id'] = $db->sql_nextid();
- if ($post_mode == 'post')
+ if ($post_mode == 'post' || $post_visibility == ITEM_APPROVED)
{
$sql_data[TOPICS_TABLE]['sql'] = array(
- 'topic_first_post_id' => $data['post_id'],
'topic_last_post_id' => $data['post_id'],
'topic_last_post_time' => $current_time,
- 'topic_last_poster_id' => (int) $user->data['user_id'],
- 'topic_last_poster_name' => (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),
+ 'topic_last_poster_id' => $sql_data[POSTS_TABLE]['sql']['poster_id'],
+ 'topic_last_poster_name' => ($user->data['user_id'] == ANONYMOUS) ? $sql_data[POSTS_TABLE]['sql']['post_username'] : $user->data['username'],
'topic_last_poster_colour' => $user->data['user_colour'],
'topic_last_post_subject' => (string) $subject,
);
}
- unset($sql_data[POSTS_TABLE]['sql']);
- }
-
- $make_global = false;
-
- // Are we globalising or unglobalising?
- if ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic')
- {
- if (!sizeof($topic_row))
+ if ($post_mode == 'post')
{
- $sql = 'SELECT topic_type, topic_replies, topic_replies_real, topic_approved, topic_last_post_id
- FROM ' . TOPICS_TABLE . '
- WHERE topic_id = ' . $data['topic_id'];
- $result = $db->sql_query($sql);
- $topic_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ $sql_data[TOPICS_TABLE]['sql']['topic_first_post_id'] = $data['post_id'];
}
- // globalise/unglobalise?
- if (($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL) || ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL))
+ // Update total post count and forum information
+ if ($post_visibility == ITEM_APPROVED)
{
- if (!empty($sql_data[FORUMS_TABLE]['stat']) && implode('', $sql_data[FORUMS_TABLE]['stat']))
+ if ($post_mode == 'post')
{
- $db->sql_query('UPDATE ' . FORUMS_TABLE . ' SET ' . implode(', ', $sql_data[FORUMS_TABLE]['stat']) . ' WHERE forum_id = ' . $data['forum_id']);
+ set_config_count('num_topics', 1, true);
}
+ set_config_count('num_posts', 1, true);
- $make_global = true;
- $sql_data[FORUMS_TABLE]['stat'] = array();
- }
-
- // globalise
- if ($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL)
- {
- // Decrement topic/post count
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts - ' . ($topic_row['topic_replies_real'] + 1);
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real - 1' . (($topic_row['topic_approved']) ? ', forum_topics = forum_topics - 1' : '');
-
- // Update forum_ids for all posts
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET forum_id = 0
- WHERE topic_id = ' . $data['topic_id'];
- $db->sql_query($sql);
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id'];
+ $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . $current_time;
+ $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $user->data['user_id'];
+ $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape((!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '')) . "'";
+ $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($user->data['user_colour']) . "'";
}
- // unglobalise
- else if ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL)
- {
- // Increment topic/post count
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_posts = forum_posts + ' . ($topic_row['topic_replies_real'] + 1);
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_topics_real = forum_topics_real + 1' . (($topic_row['topic_approved']) ? ', forum_topics = forum_topics + 1' : '');
- // Update forum_ids for all posts
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET forum_id = ' . $data['forum_id'] . '
- WHERE topic_id = ' . $data['topic_id'];
- $db->sql_query($sql);
- }
+ unset($sql_data[POSTS_TABLE]['sql']);
}
// Update the topics table
@@ -2082,6 +1832,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . '
WHERE topic_id = ' . $data['topic_id'];
$db->sql_query($sql);
+
+ unset($sql_data[TOPICS_TABLE]['sql']);
}
// Update the posts table
@@ -2091,6 +1843,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . '
WHERE post_id = ' . $data['post_id'];
$db->sql_query($sql);
+
+ unset($sql_data[POSTS_TABLE]['sql']);
}
// Update Poll Tables
@@ -2236,187 +1990,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
}
- // we need to update the last forum information
- // only applicable if the topic is not global and it is approved
- // we also check to make sure we are not dealing with globaling the latest topic (pretty rare but still needs to be checked)
- if ($topic_type != POST_GLOBAL && !$make_global && ($post_approved || !$data['post_approved']))
- {
- // the last post makes us update the forum table. This can happen if...
- // We make a new topic
- // We reply to a topic
- // We edit the last post in a topic and this post is the latest in the forum (maybe)
- // We edit the only post in the topic
- // We edit the first post in the topic and all the other posts are not approved
- if (($post_mode == 'post' || $post_mode == 'reply') && $post_approved)
- {
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . $current_time;
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $user->data['user_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape((!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '')) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($user->data['user_colour']) . "'";
- }
- else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies']))
- {
- // this does not _necessarily_ mean that we must update the info again,
- // it just means that we might have to
- $sql = 'SELECT forum_last_post_id, forum_last_post_subject
- FROM ' . FORUMS_TABLE . '
- WHERE forum_id = ' . (int) $data['forum_id'];
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // this post is the latest post in the forum, better update
- if ($row['forum_last_post_id'] == $data['post_id'])
- {
- // If post approved and subject changed, or poster is anonymous, we need to update the forum_last* rows
- if ($post_approved && ($row['forum_last_post_subject'] !== $subject || $data['poster_id'] == ANONYMOUS))
- {
- // the post's subject changed
- if ($row['forum_last_post_subject'] !== $subject)
- {
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_subject = \'' . $db->sql_escape($subject) . '\'';
- }
-
- // Update the user name if poster is anonymous... just in case an admin changed it
- if ($data['poster_id'] == ANONYMOUS)
- {
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape($username) . "'";
- }
- }
- else if ($data['post_approved'] !== $post_approved)
- {
- // we need a fresh change of socks, everything has become invalidated
- $sql = 'SELECT MAX(topic_last_post_id) as last_post_id
- FROM ' . TOPICS_TABLE . '
- WHERE forum_id = ' . (int) $data['forum_id'] . '
- AND topic_approved = 1';
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // any posts left in this forum?
- if (!empty($row['last_post_id']))
- {
- $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
- FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
- WHERE p.poster_id = u.user_id
- AND p.post_id = ' . (int) $row['last_post_id'];
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // salvation, a post is found! jam it into the forums table
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
- }
- else
- {
- // just our luck, the last topic in the forum has just been turned unapproved...
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = ''";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = ''";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = ''";
- }
- }
- }
- }
- }
- else if ($make_global)
+ $first_post_has_topic_info = ($post_mode == 'edit_first_post' &&
+ (($post_visibility == ITEM_DELETED && $data['topic_posts_softdeleted'] == 1) ||
+ ($post_visibility == ITEM_UNAPPROVED && $data['topic_posts_unapproved'] == 1) ||
+ ($post_visibility == ITEM_APPROVED && $data['topic_posts_approved'] == 1)));
+ // Fix the post's and topic's visibility and first/last post information, when the post is edited
+ if (($post_mode != 'post' && $post_mode != 'reply') && $data['post_visibility'] != $post_visibility)
{
- // somebody decided to be a party pooper, we must recalculate the whole shebang (maybe)
- $sql = 'SELECT forum_last_post_id
- FROM ' . FORUMS_TABLE . '
- WHERE forum_id = ' . (int) $data['forum_id'];
- $result = $db->sql_query($sql);
- $forum_row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // we made a topic global, go get new data
- if ($topic_row['topic_type'] != POST_GLOBAL && $topic_type == POST_GLOBAL && $forum_row['forum_last_post_id'] == $topic_row['topic_last_post_id'])
- {
- // we need a fresh change of socks, everything has become invalidated
- $sql = 'SELECT MAX(topic_last_post_id) as last_post_id
- FROM ' . TOPICS_TABLE . '
- WHERE forum_id = ' . (int) $data['forum_id'] . '
- AND topic_approved = 1';
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
+ // If the post was not approved, it could also be the starter,
+ // so we sync the starter after approving/restoring, to ensure that the stats are correct
+ // Same applies for the last post
+ $is_starter = ($post_mode == 'edit_first_post' || $data['post_visibility'] != ITEM_APPROVED);
+ $is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED);
- // any posts left in this forum?
- if (!empty($row['last_post_id']))
- {
- $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
- FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
- WHERE p.poster_id = u.user_id
- AND p.post_id = ' . (int) $row['last_post_id'];
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // salvation, a post is found! jam it into the forums table
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
- }
- else
- {
- // just our luck, the last topic in the forum has just been globalized...
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = ''";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = 0';
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = ''";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = ''";
- }
- }
- else if ($topic_row['topic_type'] == POST_GLOBAL && $topic_type != POST_GLOBAL && $forum_row['forum_last_post_id'] < $topic_row['topic_last_post_id'])
- {
- // this post has a higher id, it is newer
- $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
- FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
- WHERE p.poster_id = u.user_id
- AND p.post_id = ' . (int) $topic_row['topic_last_post_id'];
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // salvation, a post is found! jam it into the forums table
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . (int) $row['post_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . (int) $row['post_time'];
- $sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $row['poster_id'];
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
- $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
- }
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ $phpbb_content_visibility->set_post_visibility($post_visibility, $data['post_id'], $data['topic_id'], $data['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest);
}
-
- // topic sync time!
- // simply, we update if it is a reply or the last post is edited
- if ($post_approved)
+ else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $first_post_has_topic_info)
{
- // reply requires the whole thing
- if ($post_mode == 'reply')
- {
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_id = ' . (int) $data['post_id'];
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_poster_id = ' . (int) $user->data['user_id'];
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape((!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : '')) . "'";
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_colour = '" . (($user->data['user_id'] != ANONYMOUS) ? $db->sql_escape($user->data['user_colour']) : '') . "'";
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_time = ' . (int) $current_time;
- }
- else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies']))
+ if ($post_visibility == ITEM_APPROVED || $data['topic_visibility'] == $post_visibility)
{
// only the subject can be changed from edit
$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";
@@ -2426,57 +2018,44 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
{
$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape($username) . "'";
}
- }
- }
- else if (!$data['post_approved'] && ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || ($post_mode == 'edit_first_post' && !$data['topic_replies'])))
- {
- // like having the rug pulled from under us
- $sql = 'SELECT MAX(post_id) as last_post_id
- FROM ' . POSTS_TABLE . '
- WHERE topic_id = ' . (int) $data['topic_id'] . '
- AND post_approved = 1';
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // any posts left in this forum?
- if (!empty($row['last_post_id']))
- {
- $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.user_id, u.username, u.user_colour
- FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
- WHERE p.poster_id = u.user_id
- AND p.post_id = ' . (int) $row['last_post_id'];
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- // salvation, a post is found! jam it into the topics table
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_id = ' . (int) $row['post_id'];
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($row['post_subject']) . "'";
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_post_time = ' . (int) $row['post_time'];
- $sql_data[TOPICS_TABLE]['stat'][] = 'topic_last_poster_id = ' . (int) $row['poster_id'];
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape(($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']) . "'";
- $sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_colour = '" . $db->sql_escape($row['user_colour']) . "'";
- }
- }
+ if ($post_visibility == ITEM_APPROVED)
+ {
+ // this does not _necessarily_ mean that we must update the info again,
+ // it just means that we might have to
+ $sql = 'SELECT forum_last_post_id, forum_last_post_subject
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id = ' . (int) $data['forum_id'];
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
- // Update total post count, do not consider moderated posts/topics
- if ($post_approval)
- {
- if ($post_mode == 'post')
- {
- set_config_count('num_topics', 1, true);
- set_config_count('num_posts', 1, true);
- }
+ // this post is the latest post in the forum, better update
+ if ($row['forum_last_post_id'] == $data['post_id'] && ($row['forum_last_post_subject'] !== $subject || $data['poster_id'] == ANONYMOUS))
+ {
+ // the post's subject changed
+ if ($row['forum_last_post_subject'] !== $subject)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";
+ }
- if ($post_mode == 'reply')
- {
- set_config_count('num_posts', 1, true);
+ // Update the user name if poster is anonymous... just in case a moderator changed it
+ if ($data['poster_id'] == ANONYMOUS)
+ {
+ $sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape($username) . "'";
+ }
+ }
+ }
}
}
// Update forum stats
- $where_sql = array(POSTS_TABLE => 'post_id = ' . $data['post_id'], TOPICS_TABLE => 'topic_id = ' . $data['topic_id'], FORUMS_TABLE => 'forum_id = ' . $data['forum_id'], USERS_TABLE => 'user_id = ' . $poster_id);
+ $where_sql = array(
+ POSTS_TABLE => 'post_id = ' . $data['post_id'],
+ TOPICS_TABLE => 'topic_id = ' . $data['topic_id'],
+ FORUMS_TABLE => 'forum_id = ' . $data['forum_id'],
+ USERS_TABLE => 'user_id = ' . $poster_id
+ );
foreach ($sql_data as $table => $update_ary)
{
@@ -2488,7 +2067,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
}
// Delete topic shadows (if any exist). We do not need a shadow topic for an global announcement
- if ($make_global)
+ if ($topic_type == POST_GLOBAL)
{
$sql = 'DELETE FROM ' . TOPICS_TABLE . '
WHERE topic_moved_id = ' . $data['topic_id'];
@@ -2512,27 +2091,22 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
if ($update_search_index && $data['enable_indexing'])
{
// Select the search method and do some additional checks to ensure it can actually be utilised
- $search_type = basename($config['search_type']);
-
- if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
- {
- trigger_error('NO_SUCH_SEARCH_MODULE');
- }
+ $search_type = $config['search_type'];
if (!class_exists($search_type))
{
- include("{$phpbb_root_path}includes/search/$search_type.$phpEx");
+ trigger_error('NO_SUCH_SEARCH_MODULE');
}
$error = false;
- $search = new $search_type($error);
+ $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user);
if ($error)
{
trigger_error($error);
}
- $search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, ($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']);
+ $search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, $data['forum_id']);
}
// Topic Notification, do not change if moderator is changing other users posts...
@@ -2561,7 +2135,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
// Mark this topic as read
// We do not use post_time here, this is intended (post_time can have a date in the past if editing a message)
- markread('topic', (($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']), $data['topic_id'], time());
+ markread('topic', $data['forum_id'], $data['topic_id'], time());
//
if ($config['load_db_lastread'] && $user->data['is_registered'])
@@ -2569,7 +2143,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
$sql = 'SELECT mark_time
FROM ' . FORUMS_TRACK_TABLE . '
WHERE user_id = ' . $user->data['user_id'] . '
- AND forum_id = ' . (($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']);
+ AND forum_id = ' . $data['forum_id'];
$result = $db->sql_query($sql);
$f_mark_time = (int) $db->sql_fetchfield('mark_time');
$db->sql_freeresult($result);
@@ -2582,38 +2156,123 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u
if (($config['load_db_lastread'] && $user->data['is_registered']) || $config['load_anon_lastread'] || $user->data['is_registered'])
{
// Update forum info
- if ($topic_type == POST_GLOBAL)
- {
- $sql = 'SELECT MAX(topic_last_post_time) as forum_last_post_time
- FROM ' . TOPICS_TABLE . '
- WHERE forum_id = 0';
- }
- else
- {
- $sql = 'SELECT forum_last_post_time
- FROM ' . FORUMS_TABLE . '
- WHERE forum_id = ' . $data['forum_id'];
- }
+ $sql = 'SELECT forum_last_post_time
+ FROM ' . FORUMS_TABLE . '
+ WHERE forum_id = ' . $data['forum_id'];
$result = $db->sql_query($sql);
$forum_last_post_time = (int) $db->sql_fetchfield('forum_last_post_time');
$db->sql_freeresult($result);
- update_forum_tracking_info((($topic_type == POST_GLOBAL) ? 0 : $data['forum_id']), $forum_last_post_time, $f_mark_time, false);
+ update_forum_tracking_info($data['forum_id'], $forum_last_post_time, $f_mark_time, false);
}
+ // If a username was supplied or the poster is a guest, we will use the supplied username.
+ // Doing it this way we can use "...post by guest-username..." in notifications when
+ // "guest-username" is supplied or ommit the username if it is not.
+ $username = ($username !== '' || !$user->data['is_registered']) ? $username : $user->data['username'];
+
// Send Notifications
- if (($mode == 'reply' || $mode == 'quote' || $mode == 'post') && $post_approval)
+ $notification_data = array_merge($data, array(
+ 'topic_title' => (isset($data['topic_title'])) ? $data['topic_title'] : $subject,
+ 'post_username' => $username,
+ 'poster_id' => $poster_id,
+ 'post_text' => $data['message'],
+ 'post_time' => $current_time,
+ 'post_subject' => $subject,
+ ));
+
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ if ($post_visibility == ITEM_APPROVED)
{
- // If a username was supplied or the poster is a guest, we will use the supplied username.
- // Doing it this way we can use "...post by guest-username..." in notifications when
- // "guest-username" is supplied or ommit the username if it is not.
- $username = ($username !== '' || !$user->data['is_registered']) ? $username : $user->data['username'];
- user_notification($mode, $subject, $data['topic_title'], $data['forum_name'], $data['forum_id'], $data['topic_id'], $data['post_id'], $username);
+ switch ($mode)
+ {
+ case 'post':
+ $phpbb_notifications->add_notifications(array(
+ 'quote',
+ 'topic',
+ ), $notification_data);
+ break;
+
+ case 'reply':
+ case 'quote':
+ $phpbb_notifications->add_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ ), $notification_data);
+ break;
+
+ case 'edit_topic':
+ case 'edit_first_post':
+ case 'edit':
+ case 'edit_last_post':
+ $phpbb_notifications->update_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'topic',
+ 'post',
+ ), $notification_data);
+ break;
+ }
+ }
+ else if ($post_visibility == ITEM_UNAPPROVED)
+ {
+ switch ($mode)
+ {
+ case 'post':
+ $phpbb_notifications->add_notifications('topic_in_queue', $notification_data);
+ break;
+
+ case 'reply':
+ case 'quote':
+ $phpbb_notifications->add_notifications('post_in_queue', $notification_data);
+ break;
+
+ case 'edit_topic':
+ case 'edit_first_post':
+ case 'edit':
+ case 'edit_last_post':
+ // @todo: Check whether these notification deletions are correct
+ $phpbb_notifications->delete_notifications('topic', $data['topic_id']);
+
+ $phpbb_notifications->delete_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ ), $data['post_id']);
+ break;
+ }
+ }
+ else if ($post_visibility == ITEM_DELETED)
+ {
+ switch ($mode)
+ {
+ case 'post':
+ case 'reply':
+ case 'quote':
+ // Nothing to do here
+ break;
+
+ case 'edit_topic':
+ case 'edit_first_post':
+ case 'edit':
+ case 'edit_last_post':
+ // @todo: Check whether these notification deletions are correct
+ $phpbb_notifications->delete_notifications('topic', $data['topic_id']);
+
+ $phpbb_notifications->delete_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ ), $data['post_id']);
+ break;
+ }
}
$params = $add_anchor = '';
- if ($post_approval)
+ if ($post_visibility == ITEM_APPROVED)
{
$params .= '&amp;t=' . $data['topic_id'];
@@ -2735,5 +2394,3 @@ function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)
return $url;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php
index b08d6e7f5c..a2a79e032f 100644
--- a/phpBB/includes/functions_privmsgs.php
+++ b/phpBB/includes/functions_privmsgs.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -19,7 +18,8 @@ if (!defined('IN_PHPBB'))
Ability to simply add own rules by doing three things:
1) Add an appropriate constant
2) Add a new check array to the global_privmsgs_rules variable and the condition array (if one is required)
- 3) Add a new language variable to ucp.php
+ 3) Implement the rule logic in the check_rule() function
+ 4) Add a new language variable to ucp.php
The user is then able to select the new rule. It will be checked against and handled as specified.
To add new actions (yes, checks can be added here too) to the rule management, the core code has to be modified.
@@ -57,42 +57,42 @@ define('CHECK_TO', 5);
*/
$global_privmsgs_rules = array(
CHECK_SUBJECT => array(
- RULE_IS_LIKE => array('check0' => 'message_subject', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'),
- RULE_IS_NOT_LIKE => array('check0' => 'message_subject', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'),
- RULE_IS => array('check0' => 'message_subject', 'function' => '{CHECK0} == {STRING}'),
- RULE_IS_NOT => array('check0' => 'message_subject', 'function' => '{CHECK0} != {STRING}'),
- RULE_BEGINS_WITH => array('check0' => 'message_subject', 'function' => 'preg_match("/^" . preg_quote({STRING}, "/") . "/i", {CHECK0})'),
- RULE_ENDS_WITH => array('check0' => 'message_subject', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "$/i", {CHECK0})'),
+ RULE_IS_LIKE => array('check0' => 'message_subject'),
+ RULE_IS_NOT_LIKE => array('check0' => 'message_subject'),
+ RULE_IS => array('check0' => 'message_subject'),
+ RULE_IS_NOT => array('check0' => 'message_subject'),
+ RULE_BEGINS_WITH => array('check0' => 'message_subject'),
+ RULE_ENDS_WITH => array('check0' => 'message_subject'),
),
CHECK_SENDER => array(
- RULE_IS_LIKE => array('check0' => 'username', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'),
- RULE_IS_NOT_LIKE => array('check0' => 'username', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'),
- RULE_IS => array('check0' => 'username', 'function' => '{CHECK0} == {STRING}'),
- RULE_IS_NOT => array('check0' => 'username', 'function' => '{CHECK0} != {STRING}'),
- RULE_BEGINS_WITH => array('check0' => 'username', 'function' => 'preg_match("/^" . preg_quote({STRING}, "/") . "/i", {CHECK0})'),
- RULE_ENDS_WITH => array('check0' => 'username', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "$/i", {CHECK0})'),
- RULE_IS_FRIEND => array('check0' => 'friend', 'function' => '{CHECK0} == 1'),
- RULE_IS_FOE => array('check0' => 'foe', 'function' => '{CHECK0} == 1'),
- RULE_IS_USER => array('check0' => 'author_id', 'function' => '{CHECK0} == {USER_ID}'),
- RULE_IS_GROUP => array('check0' => 'author_in_group', 'function' => 'in_array({GROUP_ID}, {CHECK0})'),
+ RULE_IS_LIKE => array('check0' => 'username'),
+ RULE_IS_NOT_LIKE => array('check0' => 'username'),
+ RULE_IS => array('check0' => 'username'),
+ RULE_IS_NOT => array('check0' => 'username'),
+ RULE_BEGINS_WITH => array('check0' => 'username'),
+ RULE_ENDS_WITH => array('check0' => 'username'),
+ RULE_IS_FRIEND => array('check0' => 'friend'),
+ RULE_IS_FOE => array('check0' => 'foe'),
+ RULE_IS_USER => array('check0' => 'author_id'),
+ RULE_IS_GROUP => array('check0' => 'author_in_group'),
),
CHECK_MESSAGE => array(
- RULE_IS_LIKE => array('check0' => 'message_text', 'function' => 'preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0})'),
- RULE_IS_NOT_LIKE => array('check0' => 'message_text', 'function' => '!(preg_match("/" . preg_quote({STRING}, "/") . "/i", {CHECK0}))'),
- RULE_IS => array('check0' => 'message_text', 'function' => '{CHECK0} == {STRING}'),
- RULE_IS_NOT => array('check0' => 'message_text', 'function' => '{CHECK0} != {STRING}'),
+ RULE_IS_LIKE => array('check0' => 'message_text'),
+ RULE_IS_NOT_LIKE => array('check0' => 'message_text'),
+ RULE_IS => array('check0' => 'message_text'),
+ RULE_IS_NOT => array('check0' => 'message_text'),
),
CHECK_STATUS => array(
- RULE_ANSWERED => array('check0' => 'pm_replied', 'function' => '{CHECK0} == 1'),
- RULE_FORWARDED => array('check0' => 'pm_forwarded', 'function' => '{CHECK0} == 1'),
+ RULE_ANSWERED => array('check0' => 'pm_replied'),
+ RULE_FORWARDED => array('check0' => 'pm_forwarded'),
),
CHECK_TO => array(
- RULE_TO_GROUP => array('check0' => 'to', 'check1' => 'bcc', 'check2' => 'user_in_group', 'function' => 'in_array("g_" . {CHECK2}, {CHECK0}) || in_array("g_" . {CHECK2}, {CHECK1})'),
- RULE_TO_ME => array('check0' => 'to', 'check1' => 'bcc', 'function' => 'in_array("u_" . $user_id, {CHECK0}) || in_array("u_" . $user_id, {CHECK1})'),
+ RULE_TO_GROUP => array('check0' => 'to', 'check1' => 'bcc', 'check2' => 'user_in_group'),
+ RULE_TO_ME => array('check0' => 'to', 'check1' => 'bcc'),
)
);
@@ -260,16 +260,60 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
$check_ary = $rules[$rule_row['rule_check']][$rule_row['rule_connection']];
- // Replace Check Literals
- $evaluate = $check_ary['function'];
- $evaluate = preg_replace('/{(CHECK[0-9])}/', '$message_row[$check_ary[strtolower("\1")]]', $evaluate);
+ $result = false;
- // Replace Rule Literals
- $evaluate = preg_replace('/{(STRING|USER_ID|GROUP_ID)}/', '$rule_row["rule_" . strtolower("\1")]', $evaluate);
+ $check0 = $message_row[$check_ary['check0']];
+
+ switch ($rule_row['rule_connection'])
+ {
+ case RULE_IS_LIKE:
+ $result = preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
+ break;
+
+ case RULE_IS_NOT_LIKE:
+ $result = !preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
+ break;
+
+ case RULE_IS:
+ $result = ($check0 == $rule_row['rule_string']);
+ break;
+
+ case RULE_IS_NOT:
+ $result = ($check0 != $rule_row['rule_string']);
+ break;
+
+ case RULE_BEGINS_WITH:
+ $result = preg_match("/^" . preg_quote($rule_row['rule_string'], '/') . '/i', $check0);
+ break;
+
+ case RULE_ENDS_WITH:
+ $result = preg_match("/" . preg_quote($rule_row['rule_string'], '/') . '$/i', $check0);
+ break;
+
+ case RULE_IS_FRIEND:
+ case RULE_IS_FOE:
+ case RULE_ANSWERED:
+ case RULE_FORWARDED:
+ $result = ($check0 == 1);
+ break;
+
+ case RULE_IS_USER:
+ $result = ($check0 == $rule_row['rule_user_id']);
+ break;
+
+ case RULE_IS_GROUP:
+ $result = in_array($rule_row['rule_group_id'], $check0);
+ break;
+
+ case RULE_TO_GROUP:
+ $result = (in_array('g_' . $message_row[$check_ary['check2']], $check0) || in_array('g_' . $message_row[$check_ary['check2']], $message_row[$check_ary['check1']]));
+ break;
+
+ case RULE_TO_ME:
+ $result = (in_array('u_' . $user_id, $check0) || in_array('u_' . $user_id, $message_row[$check_ary['check1']]));
+ break;
+ }
- // Evil Statement
- $result = false;
- eval('$result = (' . $evaluate . ') ? true : false;');
if (!$result)
{
@@ -299,7 +343,7 @@ function check_rule(&$rules, &$rule_row, &$message_row, $user_id)
$userdata = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
- $auth2 = new auth();
+ $auth2 = new \phpbb\auth\auth();
$auth2->acl($userdata);
if (!$auth2->acl_get('a_') && !$auth2->acl_get('m_') && !$auth2->acl_getf_global('m_'))
@@ -832,7 +876,11 @@ function update_unread_status($unread, $msg_id, $user_id, $folder_id)
return;
}
- global $db, $user;
+ global $db, $user, $phpbb_container;
+
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->mark_notifications_read('pm', $msg_id, $user_id);
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . "
SET pm_unread = 0
@@ -937,7 +985,7 @@ function handle_mark_actions($user_id, $mark_action)
*/
function delete_pm($user_id, $msg_ids, $folder_id)
{
- global $db, $user, $phpbb_root_path, $phpEx;
+ global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
$user_id = (int) $user_id;
$folder_id = (int) $folder_id;
@@ -1049,6 +1097,10 @@ function delete_pm($user_id, $msg_ids, $folder_id)
$user->data['user_unread_privmsg'] -= $num_unread;
}
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->delete_notifications('pm', array_keys($delete_rows));
+
// Now we have to check which messages we can delete completely
$sql = 'SELECT msg_id
FROM ' . PRIVMSGS_TO_TABLE . '
@@ -1101,6 +1153,23 @@ function phpbb_delete_user_pms($user_id)
return false;
}
+ return phpbb_delete_users_pms(array($user_id));
+}
+
+/**
+* Delete all PM(s) for given users and delete the ones without references
+*
+* @param array $user_ids IDs of the users whose private messages we want to delete
+*
+* @return boolean False if there were no pms found, true otherwise.
+*/
+function phpbb_delete_users_pms($user_ids)
+{
+ global $db, $user, $phpbb_root_path, $phpEx, $phpbb_container;
+
+ $user_id_sql = $db->sql_in_set('user_id', $user_ids);
+ $author_id_sql = $db->sql_in_set('author_id', $user_ids);
+
// Get PM Information for later deleting
// The two queries where split, so we can use our indexes
$undelivered_msg = $delete_ids = array();
@@ -1108,7 +1177,7 @@ function phpbb_delete_user_pms($user_id)
// Part 1: get PMs the user received
$sql = 'SELECT msg_id
FROM ' . PRIVMSGS_TO_TABLE . '
- WHERE user_id = ' . $user_id;
+ WHERE ' . $user_id_sql;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -1118,12 +1187,12 @@ function phpbb_delete_user_pms($user_id)
}
$db->sql_freeresult($result);
- // Part 2: get PMs the user sent, but have yet to be received
- // We cannot simply delete them. First we have to check,
+ // Part 2: get PMs the users sent, but are yet to be received.
+ // We cannot simply delete them. First we have to check
// whether another user already received and read the message.
$sql = 'SELECT msg_id
FROM ' . PRIVMSGS_TO_TABLE . '
- WHERE author_id = ' . $user_id . '
+ WHERE ' . $author_id_sql . '
AND folder_id = ' . PRIVMSGS_NO_BOX;
$result = $db->sql_query($sql);
@@ -1141,6 +1210,8 @@ function phpbb_delete_user_pms($user_id)
$db->sql_transaction('begin');
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
if (!empty($undelivered_msg))
{
// A pm is delivered, if for any recipient the message was moved
@@ -1149,7 +1220,7 @@ function phpbb_delete_user_pms($user_id)
// received them.
$sql = 'SELECT msg_id
FROM ' . PRIVMSGS_TO_TABLE . '
- WHERE author_id = ' . $user_id . '
+ WHERE ' . $author_id_sql . '
AND folder_id <> ' . PRIVMSGS_NO_BOX . '
AND folder_id <> ' . PRIVMSGS_OUTBOX . '
AND folder_id <> ' . PRIVMSGS_SENTBOX;
@@ -1169,7 +1240,7 @@ function phpbb_delete_user_pms($user_id)
// Count the messages we delete, so we can correct the user pm data
$sql = 'SELECT user_id, COUNT(msg_id) as num_undelivered_privmsgs
FROM ' . PRIVMSGS_TO_TABLE . '
- WHERE author_id = ' . $user_id . '
+ WHERE ' . $author_id_sql . '
AND folder_id = ' . PRIVMSGS_NO_BOX . '
AND ' . $db->sql_in_set('msg_id', array_merge($undelivered_msg, $delivered_msg)) . '
GROUP BY user_id';
@@ -1209,6 +1280,8 @@ function phpbb_delete_user_pms($user_id)
WHERE folder_id = ' . PRIVMSGS_NO_BOX . '
AND ' . $db->sql_in_set('msg_id', $delivered_msg);
$db->sql_query($sql);
+
+ $phpbb_notifications->delete_notifications('pm', $delivered_msg);
}
if (!empty($undelivered_msg))
@@ -1220,6 +1293,8 @@ function phpbb_delete_user_pms($user_id)
$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . '
WHERE ' . $db->sql_in_set('msg_id', $undelivered_msg);
$db->sql_query($sql);
+
+ $phpbb_notifications->delete_notifications('pm', $undelivered_msg);
}
}
@@ -1227,12 +1302,12 @@ function phpbb_delete_user_pms($user_id)
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_new_privmsg = 0,
user_unread_privmsg = 0
- WHERE user_id = ' . $user_id;
+ WHERE ' . $user_id_sql;
$db->sql_query($sql);
// Delete private message data of the user
$sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . '
- WHERE user_id = ' . (int) $user_id;
+ WHERE ' . $user_id_sql;
$db->sql_query($sql);
if (!empty($delete_ids))
@@ -1262,6 +1337,8 @@ function phpbb_delete_user_pms($user_id)
$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . '
WHERE ' . $db->sql_in_set('msg_id', $delete_ids);
$db->sql_query($sql);
+
+ $phpbb_notifications->delete_notifications('pm', $delete_ids);
}
}
@@ -1269,12 +1346,12 @@ function phpbb_delete_user_pms($user_id)
// This way users are still able to read messages from users being removed
$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . '
SET author_id = ' . ANONYMOUS . '
- WHERE author_id = ' . $user_id;
+ WHERE ' . $author_id_sql;
$db->sql_query($sql);
$sql = 'UPDATE ' . PRIVMSGS_TABLE . '
SET author_id = ' . ANONYMOUS . '
- WHERE author_id = ' . $user_id;
+ WHERE ' . $author_id_sql;
$db->sql_query($sql);
$db->sql_transaction('commit');
@@ -1484,7 +1561,7 @@ function get_folder_status($folder_id, $folder)
'percent' => ($user->data['message_limit']) ? (($user->data['message_limit'] > 0) ? round(($folder['num_messages'] / $user->data['message_limit']) * 100) : 100) : 0,
);
- $return['message'] = sprintf($user->lang['FOLDER_STATUS_MSG'], $return['percent'], $return['cur'], $return['max']);
+ $return['message'] = $user->lang('FOLDER_STATUS_MSG', (int) $return['max'], $return['cur'], $return['percent']);
return $return;
}
@@ -1498,7 +1575,7 @@ function get_folder_status($folder_id, $folder)
*/
function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
{
- global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path;
+ global $db, $auth, $config, $phpEx, $template, $user, $phpbb_root_path, $phpbb_container;
// We do not handle erasing pms here
if ($mode == 'delete')
@@ -1798,95 +1875,23 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)
$db->sql_transaction('commit');
// Send Notifications
- if ($mode != 'edit')
- {
- pm_notification($mode, $data['from_username'], $recipients, $subject, $data['message'], $data['msg_id']);
- }
-
- return $data['msg_id'];
-}
-
-/**
-* PM Notification
-*/
-function pm_notification($mode, $author, $recipients, $subject, $message, $msg_id)
-{
- global $db, $user, $config, $phpbb_root_path, $phpEx, $auth;
-
- $subject = censor_text($subject);
-
- // Exclude guests, current user and banned users from notifications
- unset($recipients[ANONYMOUS], $recipients[$user->data['user_id']]);
-
- if (!sizeof($recipients))
- {
- return;
- }
-
- if (!function_exists('phpbb_get_banned_user_ids'))
- {
- include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
- }
- $banned_users = phpbb_get_banned_user_ids(array_keys($recipients));
- $recipients = array_diff(array_keys($recipients), $banned_users);
-
- if (!sizeof($recipients))
- {
- return;
- }
-
- $sql = 'SELECT user_id, username, user_email, user_lang, user_notify_pm, user_notify_type, user_jabber
- FROM ' . USERS_TABLE . '
- WHERE ' . $db->sql_in_set('user_id', $recipients);
- $result = $db->sql_query($sql);
+ $pm_data = array_merge($data, array(
+ 'message_subject' => $subject,
+ 'recipients' => $recipients,
+ ));
- $msg_list_ary = array();
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['user_notify_pm'] == 1 && trim($row['user_email']))
- {
- $msg_list_ary[] = array(
- 'method' => $row['user_notify_type'],
- 'email' => $row['user_email'],
- 'jabber' => $row['user_jabber'],
- 'name' => $row['username'],
- 'lang' => $row['user_lang']
- );
- }
- }
- $db->sql_freeresult($result);
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
- if (!sizeof($msg_list_ary))
+ if ($mode == 'edit')
{
- return;
+ $phpbb_notifications->update_notifications('pm', $pm_data);
}
-
- include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $messenger = new messenger();
-
- foreach ($msg_list_ary as $pos => $addr)
+ else
{
- $messenger->template('privmsg_notify', $addr['lang']);
-
- $messenger->to($addr['email'], $addr['name']);
- $messenger->im($addr['jabber'], $addr['name']);
-
- $messenger->assign_vars(array(
- 'SUBJECT' => htmlspecialchars_decode($subject),
- 'AUTHOR_NAME' => htmlspecialchars_decode($author),
- 'USERNAME' => htmlspecialchars_decode($addr['name']),
-
- 'U_INBOX' => generate_board_url() . "/ucp.$phpEx?i=pm&folder=inbox",
- 'U_VIEW_MESSAGE' => generate_board_url() . "/ucp.$phpEx?i=pm&mode=view&p=$msg_id",
- ));
-
- $messenger->send($addr['method']);
+ $phpbb_notifications->add_notifications('pm', $pm_data);
}
- unset($msg_list_ary);
-
- $messenger->save_queue();
- unset($messenger);
+ return $data['msg_id'];
}
/**
@@ -2013,14 +2018,11 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
$decoded_message = bbcode_nl2br($decoded_message);
}
-
- if ($row['bbcode_bitfield'])
- {
- $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message, !$row['enable_smilies']);
+
+ $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0);
+ $parse_flags |= ($row['enable_smilies'] ? OPTION_FLAG_SMILIES : 0);
+
+ $message = generate_text_for_display($message, $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, false);
$subject = censor_text($subject);
@@ -2040,7 +2042,7 @@ function message_history($msg_id, $user_id, $message_row, $folder, $in_post_mode
'SUBJECT' => $subject,
'SENT_DATE' => $user->format_date($row['message_time']),
'MESSAGE' => $message,
- 'FOLDER' => implode(', ', $row['folder']),
+ 'FOLDER' => implode($user->lang['COMMA_SEPARATOR'], $row['folder']),
'DECODED_MESSAGE' => $decoded_message,
'S_CURRENT_MSG' => ($row['msg_id'] == $msg_id),
@@ -2176,5 +2178,3 @@ function get_recipient_strings($pm_by_id)
return $address_list;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_profile_fields.php b/phpBB/includes/functions_profile_fields.php
index 8573533c2c..7dd0b0e87d 100644
--- a/phpBB/includes/functions_profile_fields.php
+++ b/phpBB/includes/functions_profile_fields.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -315,32 +314,32 @@ class custom_profile
case 'FIELD_INVALID_DATE':
case 'FIELD_INVALID_VALUE':
case 'FIELD_REQUIRED':
- $error = sprintf($user->lang[$cp_result], $row['lang_name']);
+ $error = $user->lang($cp_result, $row['lang_name']);
break;
case 'FIELD_TOO_SHORT':
case 'FIELD_TOO_SMALL':
- $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_minlen']);
+ $error = $user->lang($cp_result, (int) $row['field_minlen'], $row['lang_name']);
break;
case 'FIELD_TOO_LONG':
case 'FIELD_TOO_LARGE':
- $error = sprintf($user->lang[$cp_result], $row['lang_name'], $row['field_maxlen']);
+ $error = $user->lang($cp_result, (int) $row['field_maxlen'], $row['lang_name']);
break;
case 'FIELD_INVALID_CHARS':
switch ($row['field_validation'])
{
case '[0-9]+':
- $error = sprintf($user->lang[$cp_result . '_NUMBERS_ONLY'], $row['lang_name']);
+ $error = $user->lang($cp_result . '_NUMBERS_ONLY', $row['lang_name']);
break;
case '[\w]+':
- $error = sprintf($user->lang[$cp_result . '_ALPHA_ONLY'], $row['lang_name']);
+ $error = $user->lang($cp_result . '_ALPHA_ONLY', $row['lang_name']);
break;
case '[\w_\+\. \-\[\]]+':
- $error = sprintf($user->lang[$cp_result . '_SPACERS_ONLY'], $row['lang_name']);
+ $error = $user->lang($cp_result . '_SPACERS_ONLY', $row['lang_name']);
break;
}
break;
@@ -566,9 +565,12 @@ class custom_profile
else if ($day && $month && $year)
{
global $user;
- // Date should display as the same date for every user regardless of timezone, so remove offset
- // to compensate for the offset added by user::format_date()
- return $user->format_date(gmmktime(0, 0, 0, $month, $day, $year) - ($user->timezone + $user->dst), $user->lang['DATE_FORMAT'], true);
+ // Date should display as the same date for every user regardless of timezone
+
+ return $user->create_datetime()
+ ->setDate($year, $month, $day)
+ ->setTime(0, 0, 0)
+ ->format($user->lang['DATE_FORMAT'], true);
}
return $value;
@@ -645,6 +647,7 @@ class custom_profile
function get_var($field_validation, &$profile_row, $default_value, $preview)
{
global $user;
+ global $request;
$profile_row['field_ident'] = (isset($profile_row['var_name'])) ? $profile_row['var_name'] : 'pf_' . $profile_row['field_ident'];
$user_ident = $profile_row['field_ident'];
@@ -657,7 +660,7 @@ class custom_profile
{
if (isset($_REQUEST[$profile_row['field_ident']]))
{
- $value = ($_REQUEST[$profile_row['field_ident']] === '') ? NULL : request_var($profile_row['field_ident'], $default_value);
+ $value = ($request->variable($profile_row['field_ident'], '') === '') ? NULL : $request->variable($profile_row['field_ident'], $default_value);
}
else
{
@@ -934,6 +937,7 @@ class custom_profile
{
global $phpbb_root_path, $phpEx;
global $config;
+ global $request;
$var_name = 'pf_' . $profile_row['field_ident'];
@@ -978,7 +982,7 @@ class custom_profile
break;
case FIELD_INT:
- if (isset($_REQUEST[$var_name]) && $_REQUEST[$var_name] === '')
+ if (isset($_REQUEST[$var_name]) && $request->variable($var_name, '') === '')
{
$var = NULL;
}
@@ -1036,9 +1040,9 @@ class custom_profile_admin extends custom_profile
global $user;
$options = array(
- 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="text" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
- 1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="text" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
- 2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="text" name="field_maxlen" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
+ 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
+ 1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
+ 2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
3 => array('TITLE' => $user->lang['FIELD_VALIDATION'], 'FIELD' => '<select name="field_validation">' . $this->validate_options() . '</select>')
);
@@ -1053,9 +1057,9 @@ class custom_profile_admin extends custom_profile
global $user;
$options = array(
- 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input name="rows" size="5" value="' . $this->vars['rows'] . '" /> ' . $user->lang['ROWS'] . '</dd><dd><input name="columns" size="5" value="' . $this->vars['columns'] . '" /> ' . $user->lang['COLUMNS'] . ' <input type="hidden" name="field_length" value="' . $this->vars['field_length'] . '" />'),
- 1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="text" name="field_minlen" size="10" value="' . $this->vars['field_minlen'] . '" />'),
- 2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="text" name="field_maxlen" size="10" value="' . $this->vars['field_maxlen'] . '" />'),
+ 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" max="99999" name="rows" size="5" value="' . $this->vars['rows'] . '" /> ' . $user->lang['ROWS'] . '</dd><dd><input type="number" min="0" max="99999" name="columns" size="5" value="' . $this->vars['columns'] . '" /> ' . $user->lang['COLUMNS'] . ' <input type="hidden" name="field_length" value="' . $this->vars['field_length'] . '" />'),
+ 1 => array('TITLE' => $user->lang['MIN_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" max="9999999999" name="field_minlen" size="10" value="' . $this->vars['field_minlen'] . '" />'),
+ 2 => array('TITLE' => $user->lang['MAX_FIELD_CHARS'], 'FIELD' => '<input type="number" min="0" max="9999999999" name="field_maxlen" size="10" value="' . $this->vars['field_maxlen'] . '" />'),
3 => array('TITLE' => $user->lang['FIELD_VALIDATION'], 'FIELD' => '<select name="field_validation">' . $this->validate_options() . '</select>')
);
@@ -1070,9 +1074,9 @@ class custom_profile_admin extends custom_profile
global $user;
$options = array(
- 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="text" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
- 1 => array('TITLE' => $user->lang['MIN_FIELD_NUMBER'], 'FIELD' => '<input type="text" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
- 2 => array('TITLE' => $user->lang['MAX_FIELD_NUMBER'], 'FIELD' => '<input type="text" name="field_maxlen" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
+ 0 => array('TITLE' => $user->lang['FIELD_LENGTH'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_length" size="5" value="' . $this->vars['field_length'] . '" />'),
+ 1 => array('TITLE' => $user->lang['MIN_FIELD_NUMBER'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_minlen" size="5" value="' . $this->vars['field_minlen'] . '" />'),
+ 2 => array('TITLE' => $user->lang['MAX_FIELD_NUMBER'], 'FIELD' => '<input type="number" min="0" max="99999" name="field_maxlen" size="5" value="' . $this->vars['field_maxlen'] . '" />'),
3 => array('TITLE' => $user->lang['DEFAULT_VALUE'], 'FIELD' => '<input type="post" name="field_default_value" value="' . $this->vars['field_default_value'] . '" />')
);
@@ -1181,5 +1185,3 @@ class custom_profile_admin extends custom_profile
return $options;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_template.php b/phpBB/includes/functions_template.php
deleted file mode 100644
index 8636dfe010..0000000000
--- a/phpBB/includes/functions_template.php
+++ /dev/null
@@ -1,814 +0,0 @@
-<?php
-/**
-*
-* @package phpBB3
-* @version $Id$
-* @copyright (c) 2005 phpBB Group, sections (c) 2001 ispi of Lincoln Inc
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* Extension of template class - Functions needed for compiling templates only.
-*
-* psoTFX, phpBB Development Team - Completion of file caching, decompilation
-* routines and implementation of conditionals/keywords and associated changes
-*
-* The interface was inspired by PHPLib templates, and the template file (formats are
-* quite similar)
-*
-* The keyword/conditional implementation is currently based on sections of code from
-* the Smarty templating engine (c) 2001 ispi of Lincoln, Inc. which is released
-* (on its own and in whole) under the LGPL. Section 3 of the LGPL states that any code
-* derived from an LGPL application may be relicenced under the GPL, this applies
-* to this source
-*
-* DEFINE directive inspired by a request by Cyberalien
-*
-* @package phpBB3
-*/
-class template_compile
-{
- var $template;
-
- // Various storage arrays
- var $block_names = array();
- var $block_else_level = array();
-
- /**
- * constuctor
- */
- function template_compile(&$template)
- {
- $this->template = &$template;
- }
-
- /**
- * Load template source from file
- * @access private
- */
- function _tpl_load_file($handle, $store_in_db = false)
- {
- // Try and open template for read
- if (!file_exists($this->template->files[$handle]))
- {
- trigger_error("template->_tpl_load_file(): File {$this->template->files[$handle]} does not exist or is empty", E_USER_ERROR);
- }
-
- $this->template->compiled_code[$handle] = $this->compile(trim(@file_get_contents($this->template->files[$handle])));
-
- // Actually compile the code now.
- $this->compile_write($handle, $this->template->compiled_code[$handle]);
-
- // Store in database if required...
- if ($store_in_db)
- {
- global $db, $user;
-
- $sql_ary = array(
- 'template_id' => $this->template->files_template[$handle],
- 'template_filename' => $this->template->filename[$handle],
- 'template_included' => '',
- 'template_mtime' => time(),
- 'template_data' => trim(@file_get_contents($this->template->files[$handle])),
- );
-
- $sql = 'INSERT INTO ' . STYLES_TEMPLATE_DATA_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
- $db->sql_query($sql);
- }
- }
-
- /**
- * Remove any PHP tags that do not belong, these regular expressions are derived from
- * the ones that exist in zend_language_scanner.l
- * @access private
- */
- function remove_php_tags(&$code)
- {
- // This matches the information gathered from the internal PHP lexer
- $match = array(
- '#<([\?%])=?.*?\1>#s',
- '#<script\s+language\s*=\s*(["\']?)php\1\s*>.*?</script\s*>#s',
- '#<\?php(?:\r\n?|[ \n\t]).*?\?>#s'
- );
-
- $code = preg_replace($match, '', $code);
- }
-
- /**
- * The all seeing all doing compile method. Parts are inspired by or directly from Smarty
- * @access private
- */
- function compile($code, $no_echo = false, $echo_var = '')
- {
- global $config;
-
- if ($echo_var)
- {
- global $$echo_var;
- }
-
- // Remove any "loose" php ... we want to give admins the ability
- // to switch on/off PHP for a given template. Allowing unchecked
- // php is a no-no. There is a potential issue here in that non-php
- // content may be removed ... however designers should use entities
- // if they wish to display < and >
- $this->remove_php_tags($code);
-
- // Pull out all block/statement level elements and separate plain text
- preg_match_all('#<!-- PHP -->(.*?)<!-- ENDPHP -->#s', $code, $matches);
- $php_blocks = $matches[1];
- $code = preg_replace('#<!-- PHP -->.*?<!-- ENDPHP -->#s', '<!-- PHP -->', $code);
-
- preg_match_all('#<!-- INCLUDE (\{\$?[A-Z0-9\-_]+\}|[a-zA-Z0-9\_\-\+\./]+) -->#', $code, $matches);
- $include_blocks = $matches[1];
- $code = preg_replace('#<!-- INCLUDE (?:\{\$?[A-Z0-9\-_]+\}|[a-zA-Z0-9\_\-\+\./]+) -->#', '<!-- INCLUDE -->', $code);
-
- preg_match_all('#<!-- INCLUDEPHP ([a-zA-Z0-9\_\-\+\./]+) -->#', $code, $matches);
- $includephp_blocks = $matches[1];
- $code = preg_replace('#<!-- INCLUDEPHP [a-zA-Z0-9\_\-\+\./]+ -->#', '<!-- INCLUDEPHP -->', $code);
-
- preg_match_all('#<!-- ([^<].*?) (.*?)? ?-->#', $code, $blocks, PREG_SET_ORDER);
-
- $text_blocks = preg_split('#<!-- [^<].*? (?:.*?)? ?-->#', $code);
-
- for ($i = 0, $j = sizeof($text_blocks); $i < $j; $i++)
- {
- $this->compile_var_tags($text_blocks[$i]);
- }
- $compile_blocks = array();
-
- for ($curr_tb = 0, $tb_size = sizeof($blocks); $curr_tb < $tb_size; $curr_tb++)
- {
- $block_val = &$blocks[$curr_tb];
-
- switch ($block_val[1])
- {
- case 'BEGIN':
- $this->block_else_level[] = false;
- $compile_blocks[] = '<?php ' . $this->compile_tag_block($block_val[2]) . ' ?>';
- break;
-
- case 'BEGINELSE':
- $this->block_else_level[sizeof($this->block_else_level) - 1] = true;
- $compile_blocks[] = '<?php }} else { ?>';
- break;
-
- case 'END':
- array_pop($this->block_names);
- $compile_blocks[] = '<?php ' . ((array_pop($this->block_else_level)) ? '}' : '}}') . ' ?>';
- break;
-
- case 'IF':
- $compile_blocks[] = '<?php ' . $this->compile_tag_if($block_val[2], false) . ' ?>';
- break;
-
- case 'ELSE':
- $compile_blocks[] = '<?php } else { ?>';
- break;
-
- case 'ELSEIF':
- $compile_blocks[] = '<?php ' . $this->compile_tag_if($block_val[2], true) . ' ?>';
- break;
-
- case 'ENDIF':
- $compile_blocks[] = '<?php } ?>';
- break;
-
- case 'DEFINE':
- $compile_blocks[] = '<?php ' . $this->compile_tag_define($block_val[2], true) . ' ?>';
- break;
-
- case 'UNDEFINE':
- $compile_blocks[] = '<?php ' . $this->compile_tag_define($block_val[2], false) . ' ?>';
- break;
-
- case 'INCLUDE':
- $temp = array_shift($include_blocks);
-
- // Dynamic includes
- // Cheap match rather than a full blown regexp, we already know
- // the format of the input so just use string manipulation.
- if ($temp[0] == '{')
- {
- $file = false;
-
- if ($temp[1] == '$')
- {
- $var = substr($temp, 2, -1);
- //$file = $this->template->_tpldata['DEFINE']['.'][$var];
- $temp = "\$this->_tpldata['DEFINE']['.']['$var']";
- }
- else
- {
- $var = substr($temp, 1, -1);
- //$file = $this->template->_rootref[$var];
- $temp = "\$this->_rootref['$var']";
- }
- }
- else
- {
- $file = $temp;
- }
-
- $compile_blocks[] = '<?php ' . $this->compile_tag_include($temp) . ' ?>';
-
- // No point in checking variable includes
- if ($file)
- {
- $this->template->_tpl_include($file, false);
- }
- break;
-
- case 'INCLUDEPHP':
- $compile_blocks[] = ($config['tpl_allow_php']) ? '<?php ' . $this->compile_tag_include_php(array_shift($includephp_blocks)) . ' ?>' : '';
- break;
-
- case 'PHP':
- $compile_blocks[] = ($config['tpl_allow_php']) ? '<?php ' . array_shift($php_blocks) . ' ?>' : '';
- break;
-
- default:
- $this->compile_var_tags($block_val[0]);
- $trim_check = trim($block_val[0]);
- $compile_blocks[] = (!$no_echo) ? ((!empty($trim_check)) ? $block_val[0] : '') : ((!empty($trim_check)) ? $block_val[0] : '');
- break;
- }
- }
-
- $template_php = '';
- for ($i = 0, $size = sizeof($text_blocks); $i < $size; $i++)
- {
- $trim_check_text = trim($text_blocks[$i]);
- $template_php .= (!$no_echo) ? (($trim_check_text != '') ? $text_blocks[$i] : '') . ((isset($compile_blocks[$i])) ? $compile_blocks[$i] : '') : (($trim_check_text != '') ? $text_blocks[$i] : '') . ((isset($compile_blocks[$i])) ? $compile_blocks[$i] : '');
- }
-
- // Remove unused opening/closing tags
- $template_php = str_replace(' ?><?php ', ' ', $template_php);
-
- // Now add a newline after each php closing tag which already has a newline
- // PHP itself strips a newline if a closing tag is used (this is documented behaviour) and it is mostly not intended by style authors to remove newlines
- $template_php = preg_replace('#\?\>([\r\n])#', '?>\1\1', $template_php);
-
- // There will be a number of occasions where we switch into and out of
- // PHP mode instantaneously. Rather than "burden" the parser with this
- // we'll strip out such occurences, minimising such switching
- if ($no_echo)
- {
- return "\$$echo_var .= '" . $template_php . "'";
- }
-
- return $template_php;
- }
-
- /**
- * Compile variables
- * @access private
- */
- function compile_var_tags(&$text_blocks)
- {
- // change template varrefs into PHP varrefs
- $varrefs = array();
-
- // This one will handle varrefs WITH namespaces
- preg_match_all('#\{((?:[a-z0-9\-_]+\.)+)(\$)?([A-Z0-9\-_]+)\}#', $text_blocks, $varrefs, PREG_SET_ORDER);
-
- foreach ($varrefs as $var_val)
- {
- $namespace = $var_val[1];
- $varname = $var_val[3];
- $new = $this->generate_block_varref($namespace, $varname, true, $var_val[2]);
-
- $text_blocks = str_replace($var_val[0], $new, $text_blocks);
- }
-
- // This will handle the remaining root-level varrefs
- // transform vars prefixed by L_ into their language variable pendant if nothing is set within the tpldata array
- if (strpos($text_blocks, '{L_') !== false)
- {
- $text_blocks = preg_replace('#\{L_([A-Z0-9\-_]+)\}#', "<?php echo ((isset(\$this->_rootref['L_\\1'])) ? \$this->_rootref['L_\\1'] : ((isset(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '{ \\1 }')); ?>", $text_blocks);
- }
-
- // Handle addslashed language variables prefixed with LA_
- // If a template variable already exist, it will be used in favor of it...
- if (strpos($text_blocks, '{LA_') !== false)
- {
- $text_blocks = preg_replace('#\{LA_([A-Z0-9\-_]+)\}#', "<?php echo ((isset(\$this->_rootref['LA_\\1'])) ? \$this->_rootref['LA_\\1'] : ((isset(\$this->_rootref['L_\\1'])) ? addslashes(\$this->_rootref['L_\\1']) : ((isset(\$user->lang['\\1'])) ? addslashes(\$user->lang['\\1']) : '{ \\1 }'))); ?>", $text_blocks);
- }
-
- // Handle remaining varrefs
- $text_blocks = preg_replace('#\{([A-Z0-9\-_]+)\}#', "<?php echo (isset(\$this->_rootref['\\1'])) ? \$this->_rootref['\\1'] : ''; ?>", $text_blocks);
- $text_blocks = preg_replace('#\{\$([A-Z0-9\-_]+)\}#', "<?php echo (isset(\$this->_tpldata['DEFINE']['.']['\\1'])) ? \$this->_tpldata['DEFINE']['.']['\\1'] : ''; ?>", $text_blocks);
-
- return;
- }
-
- /**
- * Compile blocks
- * @access private
- */
- function compile_tag_block($tag_args)
- {
- $no_nesting = false;
-
- // Is the designer wanting to call another loop in a loop?
- if (strpos($tag_args, '!') === 0)
- {
- // Count the number of ! occurrences (not allowed in vars)
- $no_nesting = substr_count($tag_args, '!');
- $tag_args = substr($tag_args, $no_nesting);
- }
-
- // Allow for control of looping (indexes start from zero):
- // foo(2) : Will start the loop on the 3rd entry
- // foo(-2) : Will start the loop two entries from the end
- // foo(3,4) : Will start the loop on the fourth entry and end it on the fifth
- // foo(3,-4) : Will start the loop on the fourth entry and end it four from last
- if (preg_match('#^([^()]*)\(([\-\d]+)(?:,([\-\d]+))?\)$#', $tag_args, $match))
- {
- $tag_args = $match[1];
-
- if ($match[2] < 0)
- {
- $loop_start = '($_' . $tag_args . '_count ' . $match[2] . ' < 0 ? 0 : $_' . $tag_args . '_count ' . $match[2] . ')';
- }
- else
- {
- $loop_start = '($_' . $tag_args . '_count < ' . $match[2] . ' ? $_' . $tag_args . '_count : ' . $match[2] . ')';
- }
-
- if (strlen($match[3]) < 1 || $match[3] == -1)
- {
- $loop_end = '$_' . $tag_args . '_count';
- }
- else if ($match[3] >= 0)
- {
- $loop_end = '(' . ($match[3] + 1) . ' > $_' . $tag_args . '_count ? $_' . $tag_args . '_count : ' . ($match[3] + 1) . ')';
- }
- else //if ($match[3] < -1)
- {
- $loop_end = '$_' . $tag_args . '_count' . ($match[3] + 1);
- }
- }
- else
- {
- $loop_start = 0;
- $loop_end = '$_' . $tag_args . '_count';
- }
-
- $tag_template_php = '';
- array_push($this->block_names, $tag_args);
-
- if ($no_nesting !== false)
- {
- // We need to implode $no_nesting times from the end...
- $block = array_slice($this->block_names, -$no_nesting);
- }
- else
- {
- $block = $this->block_names;
- }
-
- if (sizeof($block) < 2)
- {
- // Block is not nested.
- $tag_template_php = '$_' . $tag_args . "_count = (isset(\$this->_tpldata['$tag_args'])) ? sizeof(\$this->_tpldata['$tag_args']) : 0;";
- $varref = "\$this->_tpldata['$tag_args']";
- }
- else
- {
- // This block is nested.
- // Generate a namespace string for this block.
- $namespace = implode('.', $block);
-
- // Get a reference to the data array for this block that depends on the
- // current indices of all parent blocks.
- $varref = $this->generate_block_data_ref($namespace, false);
-
- // Create the for loop code to iterate over this block.
- $tag_template_php = '$_' . $tag_args . '_count = (isset(' . $varref . ')) ? sizeof(' . $varref . ') : 0;';
- }
-
- $tag_template_php .= 'if ($_' . $tag_args . '_count) {';
-
- /**
- * The following uses foreach for iteration instead of a for loop, foreach is faster but requires PHP to make a copy of the contents of the array which uses more memory
- * <code>
- * if (!$offset)
- * {
- * $tag_template_php .= 'foreach (' . $varref . ' as $_' . $tag_args . '_i => $_' . $tag_args . '_val){';
- * }
- * </code>
- */
-
- $tag_template_php .= 'for ($_' . $tag_args . '_i = ' . $loop_start . '; $_' . $tag_args . '_i < ' . $loop_end . '; ++$_' . $tag_args . '_i){';
- $tag_template_php .= '$_'. $tag_args . '_val = &' . $varref . '[$_'. $tag_args. '_i];';
-
- return $tag_template_php;
- }
-
- /**
- * Compile IF tags - much of this is from Smarty with
- * some adaptions for our block level methods
- * @access private
- */
- function compile_tag_if($tag_args, $elseif)
- {
- // Tokenize args for 'if' tag.
- preg_match_all('/(?:
- "[^"\\\\]*(?:\\\\.[^"\\\\]*)*" |
- \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' |
- [(),] |
- [^\s(),]+)/x', $tag_args, $match);
-
- $tokens = $match[0];
- $is_arg_stack = array();
-
- for ($i = 0, $size = sizeof($tokens); $i < $size; $i++)
- {
- $token = &$tokens[$i];
-
- switch ($token)
- {
- case '!==':
- case '===':
- case '<<':
- case '>>':
- case '|':
- case '^':
- case '&':
- case '~':
- case ')':
- case ',':
- case '+':
- case '-':
- case '*':
- case '/':
- case '@':
- break;
-
- case '==':
- case 'eq':
- $token = '==';
- break;
-
- case '!=':
- case '<>':
- case 'ne':
- case 'neq':
- $token = '!=';
- break;
-
- case '<':
- case 'lt':
- $token = '<';
- break;
-
- case '<=':
- case 'le':
- case 'lte':
- $token = '<=';
- break;
-
- case '>':
- case 'gt':
- $token = '>';
- break;
-
- case '>=':
- case 'ge':
- case 'gte':
- $token = '>=';
- break;
-
- case '&&':
- case 'and':
- $token = '&&';
- break;
-
- case '||':
- case 'or':
- $token = '||';
- break;
-
- case '!':
- case 'not':
- $token = '!';
- break;
-
- case '%':
- case 'mod':
- $token = '%';
- break;
-
- case '(':
- array_push($is_arg_stack, $i);
- break;
-
- case 'is':
- $is_arg_start = ($tokens[$i-1] == ')') ? array_pop($is_arg_stack) : $i-1;
- $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
-
- $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
-
- array_splice($tokens, $is_arg_start, sizeof($tokens), $new_tokens);
-
- $i = $is_arg_start;
-
- // no break
-
- default:
- if (preg_match('#^((?:[a-z0-9\-_]+\.)+)?(\$)?(?=[A-Z])([A-Z0-9\-_]+)#s', $token, $varrefs))
- {
- $token = (!empty($varrefs[1])) ? $this->generate_block_data_ref(substr($varrefs[1], 0, -1), true, $varrefs[2]) . '[\'' . $varrefs[3] . '\']' : (($varrefs[2]) ? '$this->_tpldata[\'DEFINE\'][\'.\'][\'' . $varrefs[3] . '\']' : '$this->_rootref[\'' . $varrefs[3] . '\']');
- }
- else if (preg_match('#^\.((?:[a-z0-9\-_]+\.?)+)$#s', $token, $varrefs))
- {
- // Allow checking if loops are set with .loopname
- // It is also possible to check the loop count by doing <!-- IF .loopname > 1 --> for example
- $blocks = explode('.', $varrefs[1]);
-
- // If the block is nested, we have a reference that we can grab.
- // If the block is not nested, we just go and grab the block from _tpldata
- if (sizeof($blocks) > 1)
- {
- $block = array_pop($blocks);
- $namespace = implode('.', $blocks);
- $varref = $this->generate_block_data_ref($namespace, true);
-
- // Add the block reference for the last child.
- $varref .= "['" . $block . "']";
- }
- else
- {
- $varref = '$this->_tpldata';
-
- // Add the block reference for the last child.
- $varref .= "['" . $blocks[0] . "']";
- }
- $token = "sizeof($varref)";
- }
- else if (!empty($token))
- {
- $token = '(' . $token . ')';
- }
-
- break;
- }
- }
-
- // If there are no valid tokens left or only control/compare characters left, we do skip this statement
- if (!sizeof($tokens) || str_replace(array(' ', '=', '!', '<', '>', '&', '|', '%', '(', ')'), '', implode('', $tokens)) == '')
- {
- $tokens = array('false');
- }
- return (($elseif) ? '} else if (' : 'if (') . (implode(' ', $tokens) . ') { ');
- }
-
- /**
- * Compile DEFINE tags
- * @access private
- */
- function compile_tag_define($tag_args, $op)
- {
- preg_match('#^((?:[a-z0-9\-_]+\.)+)?\$(?=[A-Z])([A-Z0-9_\-]*)(?: = (\'?)([^\']*)(\'?))?$#', $tag_args, $match);
-
- if (empty($match[2]) || (!isset($match[4]) && $op))
- {
- return '';
- }
-
- if (!$op)
- {
- return 'unset(' . (($match[1]) ? $this->generate_block_data_ref(substr($match[1], 0, -1), true, true) . '[\'' . $match[2] . '\']' : '$this->_tpldata[\'DEFINE\'][\'.\'][\'' . $match[2] . '\']') . ');';
- }
-
- // Are we a string?
- if ($match[3] && $match[5])
- {
- $match[4] = str_replace(array('\\\'', '\\\\', '\''), array('\'', '\\', '\\\''), $match[4]);
-
- // Compile reference, we allow template variables in defines...
- $match[4] = $this->compile($match[4]);
-
- // Now replace the php code
- $match[4] = "'" . str_replace(array('<?php echo ', '; ?>'), array("' . ", " . '"), $match[4]) . "'";
- }
- else
- {
- preg_match('#true|false|\.#i', $match[4], $type);
-
- switch (strtolower($type[0]))
- {
- case 'true':
- case 'false':
- $match[4] = strtoupper($match[4]);
- break;
-
- case '.':
- $match[4] = doubleval($match[4]);
- break;
-
- default:
- $match[4] = intval($match[4]);
- break;
- }
- }
-
- return (($match[1]) ? $this->generate_block_data_ref(substr($match[1], 0, -1), true, true) . '[\'' . $match[2] . '\']' : '$this->_tpldata[\'DEFINE\'][\'.\'][\'' . $match[2] . '\']') . ' = ' . $match[4] . ';';
- }
-
- /**
- * Compile INCLUDE tag
- * @access private
- */
- function compile_tag_include($tag_args)
- {
- // Process dynamic includes
- if ($tag_args[0] == '$')
- {
- return "if (isset($tag_args)) { \$this->_tpl_include($tag_args); }";
- }
-
- return "\$this->_tpl_include('$tag_args');";
- }
-
- /**
- * Compile INCLUDE_PHP tag
- * @access private
- */
- function compile_tag_include_php($tag_args)
- {
- return "\$this->_php_include('$tag_args');";
- }
-
- /**
- * parse expression
- * This is from Smarty
- * @access private
- */
- function _parse_is_expr($is_arg, $tokens)
- {
- $expr_end = 0;
- $negate_expr = false;
-
- if (($first_token = array_shift($tokens)) == 'not')
- {
- $negate_expr = true;
- $expr_type = array_shift($tokens);
- }
- else
- {
- $expr_type = $first_token;
- }
-
- switch ($expr_type)
- {
- case 'even':
- if (@$tokens[$expr_end] == 'by')
- {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "!(($is_arg / $expr_arg) % $expr_arg)";
- }
- else
- {
- $expr = "!($is_arg & 1)";
- }
- break;
-
- case 'odd':
- if (@$tokens[$expr_end] == 'by')
- {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "(($is_arg / $expr_arg) % $expr_arg)";
- }
- else
- {
- $expr = "($is_arg & 1)";
- }
- break;
-
- case 'div':
- if (@$tokens[$expr_end] == 'by')
- {
- $expr_end++;
- $expr_arg = $tokens[$expr_end++];
- $expr = "!($is_arg % $expr_arg)";
- }
- break;
- }
-
- if ($negate_expr)
- {
- $expr = "!($expr)";
- }
-
- array_splice($tokens, 0, $expr_end, $expr);
-
- return $tokens;
- }
-
- /**
- * Generates a reference to the given variable inside the given (possibly nested)
- * block namespace. This is a string of the form:
- * ' . $this->_tpldata['parent'][$_parent_i]['$child1'][$_child1_i]['$child2'][$_child2_i]...['varname'] . '
- * It's ready to be inserted into an "echo" line in one of the templates.
- * NOTE: expects a trailing "." on the namespace.
- * @access private
- */
- function generate_block_varref($namespace, $varname, $echo = true, $defop = false)
- {
- // Strip the trailing period.
- $namespace = substr($namespace, 0, -1);
-
- // Get a reference to the data block for this namespace.
- $varref = $this->generate_block_data_ref($namespace, true, $defop);
- // Prepend the necessary code to stick this in an echo line.
-
- // Append the variable reference.
- $varref .= "['$varname']";
- $varref = ($echo) ? "<?php echo $varref; ?>" : ((isset($varref)) ? $varref : '');
-
- return $varref;
- }
-
- /**
- * Generates a reference to the array of data values for the given
- * (possibly nested) block namespace. This is a string of the form:
- * $this->_tpldata['parent'][$_parent_i]['$child1'][$_child1_i]['$child2'][$_child2_i]...['$childN']
- *
- * If $include_last_iterator is true, then [$_childN_i] will be appended to the form shown above.
- * NOTE: does not expect a trailing "." on the blockname.
- * @access private
- */
- function generate_block_data_ref($blockname, $include_last_iterator, $defop = false)
- {
- // Get an array of the blocks involved.
- $blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
-
- // DEFINE is not an element of any referenced variable, we must use _tpldata to access it
- if ($defop)
- {
- $varref = '$this->_tpldata[\'DEFINE\']';
- // Build up the string with everything but the last child.
- for ($i = 0; $i < $blockcount; $i++)
- {
- $varref .= "['" . $blocks[$i] . "'][\$_" . $blocks[$i] . '_i]';
- }
- // Add the block reference for the last child.
- $varref .= "['" . $blocks[$blockcount] . "']";
- // Add the iterator for the last child if requried.
- if ($include_last_iterator)
- {
- $varref .= '[$_' . $blocks[$blockcount] . '_i]';
- }
- return $varref;
- }
- else if ($include_last_iterator)
- {
- return '$_'. $blocks[$blockcount] . '_val';
- }
- else
- {
- return '$_'. $blocks[$blockcount - 1] . '_val[\''. $blocks[$blockcount]. '\']';
- }
- }
-
- /**
- * Write compiled file to cache directory
- * @access private
- */
- function compile_write($handle, $data)
- {
- global $phpEx;
-
- $filename = $this->template->cachepath . str_replace('/', '.', $this->template->filename[$handle]) . '.' . $phpEx;
-
- $data = "<?php if (!defined('IN_PHPBB')) exit;" . ((strpos($data, '<?php') === 0) ? substr($data, 5) : ' ?>' . $data);
-
- if ($fp = @fopen($filename, 'wb'))
- {
- @flock($fp, LOCK_EX);
- @fwrite ($fp, $data);
- @flock($fp, LOCK_UN);
- @fclose($fp);
-
- phpbb_chmod($filename, CHMOD_READ | CHMOD_WRITE);
- }
-
- return;
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_transfer.php b/phpBB/includes/functions_transfer.php
index 5ab7a87efd..07c9171c60 100644
--- a/phpBB/includes/functions_transfer.php
+++ b/phpBB/includes/functions_transfer.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -902,5 +901,3 @@ class ftp_fsock extends transfer
return ($return) ? $response : true;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php
index 73ac1df2d2..4181896eca 100644
--- a/phpBB/includes/functions_upload.php
+++ b/phpBB/includes/functions_upload.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -71,7 +70,7 @@ class filespec
$this->mimetype = 'application/octetstream';
}
- $this->extension = strtolower($this->get_extension($this->realname));
+ $this->extension = strtolower(self::get_extension($this->realname));
// Try to get real filesize from temporary folder (not always working) ;)
$this->filesize = (@filesize($this->filename)) ? @filesize($this->filename) : $this->filesize;
@@ -152,7 +151,7 @@ class filespec
*/
function is_image()
{
- return (strpos($this->mimetype, 'image/') !== false) ? true : false;
+ return (strpos($this->mimetype, 'image/') === 0);
}
/**
@@ -188,8 +187,11 @@ class filespec
/**
* Get file extension
+ *
+ * @param string Filename that needs to be checked
+ * @return string Extension of the supplied filename
*/
- function get_extension($filename)
+ static public function get_extension($filename)
{
if (strpos($filename, '.') === false)
{
@@ -370,7 +372,7 @@ class filespec
}
// Check image type
- $types = $this->upload->image_types();
+ $types = fileupload::image_types();
if (!isset($types[$this->image_info[2]]) || !in_array($this->extension, $types[$this->image_info[2]]))
{
@@ -427,7 +429,13 @@ class filespec
if (!$this->upload->valid_dimensions($this))
{
- $this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_SIZE'], $this->upload->min_width, $this->upload->min_height, $this->upload->max_width, $this->upload->max_height, $this->width, $this->height);
+ $this->error[] = $user->lang($this->upload->error_prefix . 'WRONG_SIZE',
+ $user->lang('PIXELS', (int) $this->upload->min_width),
+ $user->lang('PIXELS', (int) $this->upload->min_height),
+ $user->lang('PIXELS', (int) $this->upload->max_width),
+ $user->lang('PIXELS', (int) $this->upload->max_height),
+ $user->lang('PIXELS', (int) $this->width),
+ $user->lang('PIXELS', (int) $this->height));
return false;
}
@@ -561,10 +569,11 @@ class fileupload
*/
function form_upload($form_name)
{
- global $user;
+ global $user, $request;
- unset($_FILES[$form_name]['local_mode']);
- $file = new filespec($_FILES[$form_name], $this);
+ $upload = $request->file($form_name);
+ unset($upload['local_mode']);
+ $file = new filespec($upload, $this);
if ($file->init_error)
{
@@ -573,9 +582,9 @@ class fileupload
}
// Error array filled?
- if (isset($_FILES[$form_name]['error']))
+ if (isset($upload['error']))
{
- $error = $this->assign_internal_error($_FILES[$form_name]['error']);
+ $error = $this->assign_internal_error($upload['error']);
if ($error !== false)
{
@@ -585,7 +594,7 @@ class fileupload
}
// Check if empty file got uploaded (not catched by is_uploaded_file)
- if (isset($_FILES[$form_name]['size']) && $_FILES[$form_name]['size'] == 0)
+ if (isset($upload['size']) && $upload['size'] == 0)
{
$file->error[] = $user->lang[$this->error_prefix . 'EMPTY_FILEUPLOAD'];
return $file;
@@ -626,17 +635,17 @@ class fileupload
*/
function local_upload($source_file, $filedata = false)
{
- global $user;
+ global $user, $request;
- $form_name = 'local';
+ $upload = array();
- $_FILES[$form_name]['local_mode'] = true;
- $_FILES[$form_name]['tmp_name'] = $source_file;
+ $upload['local_mode'] = true;
+ $upload['tmp_name'] = $source_file;
if ($filedata === false)
{
- $_FILES[$form_name]['name'] = utf8_basename($source_file);
- $_FILES[$form_name]['size'] = 0;
+ $upload['name'] = utf8_basename($source_file);
+ $upload['size'] = 0;
$mimetype = '';
if (function_exists('mime_content_type'))
@@ -650,16 +659,16 @@ class fileupload
$mimetype = 'application/octetstream';
}
- $_FILES[$form_name]['type'] = $mimetype;
+ $upload['type'] = $mimetype;
}
else
{
- $_FILES[$form_name]['name'] = $filedata['realname'];
- $_FILES[$form_name]['size'] = $filedata['size'];
- $_FILES[$form_name]['type'] = $filedata['type'];
+ $upload['name'] = $filedata['realname'];
+ $upload['size'] = $filedata['size'];
+ $upload['type'] = $filedata['type'];
}
- $file = new filespec($_FILES[$form_name], $this);
+ $file = new filespec($upload, $this);
if ($file->init_error)
{
@@ -667,9 +676,9 @@ class fileupload
return $file;
}
- if (isset($_FILES[$form_name]['error']))
+ if (isset($upload['error']))
{
- $error = $this->assign_internal_error($_FILES[$form_name]['error']);
+ $error = $this->assign_internal_error($upload['error']);
if ($error !== false)
{
@@ -704,6 +713,7 @@ class fileupload
}
$this->common_checks($file);
+ $request->overwrite('local', $upload, \phpbb\request\request_interface::FILES);
return $file;
}
@@ -996,12 +1006,15 @@ class fileupload
*/
function is_valid($form_name)
{
- return (isset($_FILES[$form_name]) && $_FILES[$form_name]['name'] != 'none') ? true : false;
+ global $request;
+ $upload = $request->file($form_name);
+
+ return (!empty($upload) && $upload['name'] !== 'none');
}
/**
- * Check for allowed extension
+ * Check for bad content (IE mime-sniffing)
*/
function valid_content(&$file)
{
@@ -1009,29 +1022,29 @@ class fileupload
}
/**
- * Return image type/extension mapping
+ * Get image type/extension mapping
+ *
+ * @return array Array containing the image types and their extensions
*/
- function image_types()
+ static public function image_types()
{
return array(
- 1 => array('gif'),
- 2 => array('jpg', 'jpeg'),
- 3 => array('png'),
- 4 => array('swf'),
- 5 => array('psd'),
- 6 => array('bmp'),
- 7 => array('tif', 'tiff'),
- 8 => array('tif', 'tiff'),
- 9 => array('jpg', 'jpeg'),
- 10 => array('jpg', 'jpeg'),
- 11 => array('jpg', 'jpeg'),
- 12 => array('jpg', 'jpeg'),
- 13 => array('swc'),
- 14 => array('iff'),
- 15 => array('wbmp'),
- 16 => array('xbm'),
+ IMAGETYPE_GIF => array('gif'),
+ IMAGETYPE_JPEG => array('jpg', 'jpeg'),
+ IMAGETYPE_PNG => array('png'),
+ IMAGETYPE_SWF => array('swf'),
+ IMAGETYPE_PSD => array('psd'),
+ IMAGETYPE_BMP => array('bmp'),
+ IMAGETYPE_TIFF_II => array('tif', 'tiff'),
+ IMAGETYPE_TIFF_MM => array('tif', 'tiff'),
+ IMAGETYPE_JPC => array('jpg', 'jpeg'),
+ IMAGETYPE_JP2 => array('jpg', 'jpeg'),
+ IMAGETYPE_JPX => array('jpg', 'jpeg'),
+ IMAGETYPE_JB2 => array('jpg', 'jpeg'),
+ IMAGETYPE_SWC => array('swc'),
+ IMAGETYPE_IFF => array('iff'),
+ IMAGETYPE_WBMP => array('wbmp'),
+ IMAGETYPE_XBM => array('xbm'),
);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/functions_url_matcher.php b/phpBB/includes/functions_url_matcher.php
new file mode 100644
index 0000000000..fdde302e3b
--- /dev/null
+++ b/phpBB/includes/functions_url_matcher.php
@@ -0,0 +1,106 @@
+<?php
+/**
+*
+* @package phpBB3
+* @copyright (c) 2005 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+use Symfony\Component\Routing\Matcher\Dumper\PhpMatcherDumper;
+use Symfony\Component\Routing\Matcher\UrlMatcher;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* Create a new UrlMatcher class and dump it into the cache file
+*
+* @param \phpbb\extension\finder $finder Extension finder
+* @param RequestContext $context Symfony RequestContext object
+* @param string $root_path Root path
+* @param string $php_ext PHP extension
+* @return null
+*/
+function phpbb_get_url_matcher(\phpbb\extension\finder $finder, RequestContext $context, $root_path, $php_ext)
+{
+ if (defined('DEBUG'))
+ {
+ return phpbb_create_url_matcher($finder, $context);
+ }
+
+ if (!phpbb_url_matcher_dumped($root_path, $php_ext))
+ {
+ phpbb_create_dumped_url_matcher($finder, $root_path, $php_ext);
+ }
+
+ return phpbb_load_url_matcher($context, $root_path, $php_ext);
+}
+
+/**
+* Create a new UrlMatcher class and dump it into the cache file
+*
+* @param \phpbb\extension\finder $finder Extension finder
+* @param string $root_path Root path
+* @param string $php_ext PHP extension
+* @return null
+*/
+function phpbb_create_dumped_url_matcher(\phpbb\extension\finder $finder, $root_path, $php_ext)
+{
+ $provider = new \phpbb\controller\provider();
+ $routes = $provider->import_paths_from_finder($finder)->find();
+ $dumper = new PhpMatcherDumper($routes);
+ $cached_url_matcher_dump = $dumper->dump(array(
+ 'class' => 'phpbb_url_matcher',
+ ));
+
+ file_put_contents($root_path . 'cache/url_matcher.' . $php_ext, $cached_url_matcher_dump);
+}
+
+/**
+* Create a non-cached UrlMatcher
+*
+* @param \phpbb\extension\finder $finder Extension finder
+* @param RequestContext $context Symfony RequestContext object
+* @return UrlMatcher
+*/
+function phpbb_create_url_matcher(\phpbb\extension\finder $finder, RequestContext $context)
+{
+ $provider = new \phpbb\controller\provider();
+ $routes = $provider->import_paths_from_finder($finder)->find();
+ return new UrlMatcher($routes, $context);
+}
+
+/**
+* Load the cached phpbb_url_matcher class
+*
+* @param RequestContext $context Symfony RequestContext object
+* @param string $root_path Root path
+* @param string $php_ext PHP extension
+* @return phpbb_url_matcher
+*/
+function phpbb_load_url_matcher(RequestContext $context, $root_path, $php_ext)
+{
+ require($root_path . 'cache/url_matcher.' . $php_ext);
+ return new phpbb_url_matcher($context);
+}
+
+/**
+* Determine whether we have our dumped URL matcher
+*
+* The class is automatically dumped to the cache directory
+*
+* @param string $root_path Root path
+* @param string $php_ext PHP extension
+* @return bool True if it exists, false if not
+*/
+function phpbb_url_matcher_dumped($root_path, $php_ext)
+{
+ return file_exists($root_path . 'cache/url_matcher.' . $php_ext);
+}
diff --git a/phpBB/includes/functions_user.php b/phpBB/includes/functions_user.php
index ea8b0a4640..0a0656377c 100644
--- a/phpBB/includes/functions_user.php
+++ b/phpBB/includes/functions_user.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -113,7 +112,7 @@ function update_last_username()
*/
function user_update_name($old_name, $new_name)
{
- global $config, $db, $cache;
+ global $config, $db, $cache, $phpbb_dispatcher;
$update_ary = array(
FORUMS_TABLE => array('forum_last_poster_name'),
@@ -138,6 +137,17 @@ function user_update_name($old_name, $new_name)
set_config('newest_username', $new_name, true);
}
+ /**
+ * Update a username when it is changed
+ *
+ * @event core.update_username
+ * @var string old_name The old username that is replaced
+ * @var string new_name The new username
+ * @since 3.1-A1
+ */
+ $vars = array('old_name', 'new_name');
+ extract($phpbb_dispatcher->trigger_event('core.update_username', compact($vars)));
+
// Because some tables/caches use username-specific data we need to purge this here.
$cache->destroy('sql', MODERATOR_CACHE_TABLE);
}
@@ -152,6 +162,7 @@ function user_update_name($old_name, $new_name)
function user_add($user_row, $cp_data = false)
{
global $db, $user, $auth, $config, $phpbb_root_path, $phpEx;
+ global $phpbb_dispatcher;
if (empty($user_row['username']) || !isset($user_row['group_id']) || !isset($user_row['user_email']) || !isset($user_row['user_type']))
{
@@ -198,7 +209,6 @@ function user_add($user_row, $cp_data = false)
'user_lastpost_time' => 0,
'user_lastpage' => '',
'user_posts' => 0,
- 'user_dst' => (int) $config['board_dst'],
'user_colour' => '',
'user_occ' => '',
'user_interests' => '',
@@ -246,6 +256,16 @@ function user_add($user_row, $cp_data = false)
}
}
+ /**
+ * Use this event to modify the values to be inserted when a user is added
+ *
+ * @event core.user_add_modify_data
+ * @var array sql_ary Array of data to be inserted when a user is added
+ * @since 3.1-A1
+ */
+ $vars = array('sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.user_add_modify_data', compact($vars)));
+
$sql = 'INSERT INTO ' . USERS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
$db->sql_query($sql);
@@ -290,8 +310,10 @@ function user_add($user_row, $cp_data = false)
if ($add_group_id)
{
- // Because these actions only fill the log unneccessarily we skip the add_log() entry with a little hack. :/
- $GLOBALS['skip_add_log'] = true;
+ global $phpbb_log;
+
+ // Because these actions only fill the log unneccessarily we skip the add_log() entry.
+ $phpbb_log->disable('admin');
// Add user to "newly registered users" group and set to default group if admin specified so.
if ($config['new_member_group_default'])
@@ -304,7 +326,7 @@ function user_add($user_row, $cp_data = false)
group_user_add($add_group_id, $user_id);
}
- unset($GLOBALS['skip_add_log']);
+ $phpbb_log->enable('admin');
}
}
@@ -330,28 +352,55 @@ function user_add($user_row, $cp_data = false)
/**
* Remove User
+* @param $mode Either 'retain' or 'remove'
*/
-function user_delete($mode, $user_id, $post_username = false)
+function user_delete($mode, $user_ids, $retain_username = true)
{
- global $cache, $config, $db, $user, $auth;
+ global $cache, $config, $db, $user, $auth, $phpbb_dispatcher;
global $phpbb_root_path, $phpEx;
+ $db->sql_transaction('begin');
+
+ $user_rows = array();
+ if (!is_array($user_ids))
+ {
+ $user_ids = array($user_ids);
+ }
+
+ $user_id_sql = $db->sql_in_set('user_id', $user_ids);
+
$sql = 'SELECT *
FROM ' . USERS_TABLE . '
- WHERE user_id = ' . $user_id;
+ WHERE ' . $user_id_sql;
$result = $db->sql_query($sql);
- $user_row = $db->sql_fetchrow($result);
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $user_rows[(int) $row['user_id']] = $row;
+ }
$db->sql_freeresult($result);
- if (!$user_row)
+ if (empty($user_rows))
{
return false;
}
+ /**
+ * Event before a user is deleted
+ *
+ * @event core.delete_user_before
+ * @var string mode Mode of deletion (retain/delete posts)
+ * @var array user_ids IDs of the deleted user
+ * @var mixed retain_username True if username should be retained
+ * or false if not
+ * @since 3.1-A1
+ */
+ $vars = array('mode', 'user_ids', 'retain_username');
+ extract($phpbb_dispatcher->trigger_event('core.delete_user_before', compact($vars)));
+
// Before we begin, we will remove the reports the user issued.
$sql = 'SELECT r.post_id, p.topic_id
FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . ' p
- WHERE r.user_id = ' . $user_id . '
+ WHERE ' . $db->sql_in_set('r.user_id', $user_ids) . '
AND p.post_id = r.post_id';
$result = $db->sql_query($sql);
@@ -405,97 +454,124 @@ function user_delete($mode, $user_id, $post_username = false)
}
// Remove reports
- $db->sql_query('DELETE FROM ' . REPORTS_TABLE . ' WHERE user_id = ' . $user_id);
+ $db->sql_query('DELETE FROM ' . REPORTS_TABLE . ' WHERE ' . $user_id_sql);
- if ($user_row['user_avatar'] && $user_row['user_avatar_type'] == AVATAR_UPLOAD)
- {
- avatar_delete('user', $user_row);
- }
+ $num_users_delta = 0;
- switch ($mode)
+ // Some things need to be done in the loop (if the query changes based
+ // on which user is currently being deleted)
+ $added_guest_posts = 0;
+ foreach ($user_rows as $user_id => $user_row)
{
- case 'retain':
-
- $db->sql_transaction('begin');
-
- if ($post_username === false)
- {
- $post_username = $user->lang['GUEST'];
- }
+ if ($user_row['user_avatar'] && $user_row['user_avatar_type'] == AVATAR_UPLOAD)
+ {
+ avatar_delete('user', $user_row);
+ }
- // If the user is inactive and newly registered we assume no posts from this user being there...
- if ($user_row['user_type'] == USER_INACTIVE && $user_row['user_inactive_reason'] == INACTIVE_REGISTER && !$user_row['user_posts'])
- {
- }
- else
- {
- $sql = 'UPDATE ' . FORUMS_TABLE . '
- SET forum_last_poster_id = ' . ANONYMOUS . ", forum_last_poster_name = '" . $db->sql_escape($post_username) . "', forum_last_poster_colour = ''
- WHERE forum_last_poster_id = $user_id";
- $db->sql_query($sql);
+ // Decrement number of users if this user is active
+ if ($user_row['user_type'] != USER_INACTIVE && $user_row['user_type'] != USER_IGNORE)
+ {
+ --$num_users_delta;
+ }
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET poster_id = ' . ANONYMOUS . ", post_username = '" . $db->sql_escape($post_username) . "'
- WHERE poster_id = $user_id";
- $db->sql_query($sql);
+ switch ($mode)
+ {
+ case 'retain':
+ if ($retain_username === false)
+ {
+ $post_username = $user->lang['GUEST'];
+ }
+ else
+ {
+ $post_username = $user_row['username'];
+ }
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET post_edit_user = ' . ANONYMOUS . "
- WHERE post_edit_user = $user_id";
- $db->sql_query($sql);
+ // If the user is inactive and newly registered
+ // we assume no posts from the user, and save
+ // the queries
+ if ($user_row['user_type'] != USER_INACTIVE || $user_row['user_inactive_reason'] != INACTIVE_REGISTER || $user_row['user_posts'])
+ {
+ // When we delete these users and retain the posts, we must assign all the data to the guest user
+ $sql = 'UPDATE ' . FORUMS_TABLE . '
+ SET forum_last_poster_id = ' . ANONYMOUS . ", forum_last_poster_name = '" . $db->sql_escape($post_username) . "', forum_last_poster_colour = ''
+ WHERE forum_last_poster_id = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''
- WHERE topic_poster = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . POSTS_TABLE . '
+ SET poster_id = ' . ANONYMOUS . ", post_username = '" . $db->sql_escape($post_username) . "'
+ WHERE poster_id = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_last_poster_id = ' . ANONYMOUS . ", topic_last_poster_name = '" . $db->sql_escape($post_username) . "', topic_last_poster_colour = ''
- WHERE topic_last_poster_id = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_poster = ' . ANONYMOUS . ", topic_first_poster_name = '" . $db->sql_escape($post_username) . "', topic_first_poster_colour = ''
+ WHERE topic_poster = $user_id";
+ $db->sql_query($sql);
- $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
- SET poster_id = ' . ANONYMOUS . "
- WHERE poster_id = $user_id";
- $db->sql_query($sql);
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_last_poster_id = ' . ANONYMOUS . ", topic_last_poster_name = '" . $db->sql_escape($post_username) . "', topic_last_poster_colour = ''
+ WHERE topic_last_poster_id = $user_id";
+ $db->sql_query($sql);
- // Since we change every post by this author, we need to count this amount towards the anonymous user
+ // Since we change every post by this author, we need to count this amount towards the anonymous user
- // Update the post count for the anonymous user
- if ($user_row['user_posts'])
- {
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_posts = user_posts + ' . $user_row['user_posts'] . '
- WHERE user_id = ' . ANONYMOUS;
- $db->sql_query($sql);
+ if ($user_row['user_posts'])
+ {
+ $added_guest_posts += $user_row['user_posts'];
+ }
}
- }
-
- $db->sql_transaction('commit');
+ break;
- break;
+ case 'remove':
+ // there is nothing variant specific to deleting posts
+ break;
+ }
+ }
- case 'remove':
+ if ($num_users_delta != 0)
+ {
+ set_config_count('num_users', $num_users_delta, true);
+ }
- if (!function_exists('delete_posts'))
- {
- include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
- }
+ // Now do the invariant tasks
+ // all queries performed in one call of this function are in a single transaction
+ // so this is kosher
+ if ($mode == 'retain')
+ {
+ // Assign more data to the Anonymous user
+ $sql = 'UPDATE ' . ATTACHMENTS_TABLE . '
+ SET poster_id = ' . ANONYMOUS . '
+ WHERE ' . $db->sql_in_set('poster_id', $user_ids);
+ $db->sql_query($sql);
- // Delete posts, attachments, etc.
- delete_posts('poster_id', $user_id);
+ $sql = 'UPDATE ' . POSTS_TABLE . '
+ SET post_edit_user = ' . ANONYMOUS . '
+ WHERE ' . $db->sql_in_set('post_edit_user', $user_ids);
+ $db->sql_query($sql);
- break;
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET user_posts = user_posts + ' . $added_guest_posts . '
+ WHERE user_id = ' . ANONYMOUS;
+ $db->sql_query($sql);
}
+ else if ($mode == 'remove')
+ {
+ if (!function_exists('delete_posts'))
+ {
+ include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
+ }
- $db->sql_transaction('begin');
+ // Delete posts, attachments, etc.
+ // delete_posts can handle any number of IDs in its second argument
+ delete_posts('poster_id', $user_ids);
+ }
$table_ary = array(USERS_TABLE, USER_GROUP_TABLE, TOPICS_WATCH_TABLE, FORUMS_WATCH_TABLE, ACL_USERS_TABLE, TOPICS_TRACK_TABLE, TOPICS_POSTED_TABLE, FORUMS_TRACK_TABLE, PROFILE_FIELDS_DATA_TABLE, MODERATOR_CACHE_TABLE, DRAFTS_TABLE, BOOKMARKS_TABLE, SESSIONS_KEYS_TABLE, PRIVMSGS_FOLDER_TABLE, PRIVMSGS_RULES_TABLE);
+ // Delete the miscellaneous (non-post) data for the user
foreach ($table_ary as $table)
{
$sql = "DELETE FROM $table
- WHERE user_id = $user_id";
+ WHERE " . $user_id_sql;
$db->sql_query($sql);
}
@@ -503,29 +579,29 @@ function user_delete($mode, $user_id, $post_username = false)
// Delete user log entries about this user
$sql = 'DELETE FROM ' . LOG_TABLE . '
- WHERE reportee_id = ' . $user_id;
+ WHERE ' . $db->sql_in_set('reportee_id', $user_ids);
$db->sql_query($sql);
// Change user_id to anonymous for this users triggered events
$sql = 'UPDATE ' . LOG_TABLE . '
SET user_id = ' . ANONYMOUS . '
- WHERE user_id = ' . $user_id;
+ WHERE ' . $user_id_sql;
$db->sql_query($sql);
// Delete the user_id from the zebra table
$sql = 'DELETE FROM ' . ZEBRA_TABLE . '
- WHERE user_id = ' . $user_id . '
- OR zebra_id = ' . $user_id;
+ WHERE ' . $user_id_sql . '
+ OR ' . $db->sql_in_set('zebra_id', $user_ids);
$db->sql_query($sql);
// Delete the user_id from the banlist
$sql = 'DELETE FROM ' . BANLIST_TABLE . '
- WHERE ban_userid = ' . $user_id;
+ WHERE ' . $db->sql_in_set('ban_userid', $user_ids);
$db->sql_query($sql);
// Delete the user_id from the session table
$sql = 'DELETE FROM ' . SESSIONS_TABLE . '
- WHERE session_user_id = ' . $user_id;
+ WHERE ' . $db->sql_in_set('session_user_id', $user_ids);
$db->sql_query($sql);
// Clean the private messages tables from the user
@@ -533,22 +609,29 @@ function user_delete($mode, $user_id, $post_username = false)
{
include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
}
- phpbb_delete_user_pms($user_id);
+ phpbb_delete_users_pms($user_ids);
$db->sql_transaction('commit');
+ /**
+ * Event after a user is deleted
+ *
+ * @event core.delete_user_after
+ * @var string mode Mode of deletion (retain/delete posts)
+ * @var array user_ids IDs of the deleted user
+ * @var mixed retain_username True if username should be retained
+ * or false if not
+ * @since 3.1-A1
+ */
+ $vars = array('mode', 'user_ids', 'retain_username');
+ extract($phpbb_dispatcher->trigger_event('core.delete_user_after', compact($vars)));
+
// Reset newest user info if appropriate
- if ($config['newest_user_id'] == $user_id)
+ if (in_array($config['newest_user_id'], $user_ids))
{
update_last_username();
}
- // Decrement number of users if this user is active
- if ($user_row['user_type'] != USER_INACTIVE && $user_row['user_type'] != USER_IGNORE)
- {
- set_config_count('num_users', -1, true);
- }
-
return false;
}
@@ -678,8 +761,10 @@ function user_ban($mode, $ban, $ban_len, $ban_len_other, $ban_exclude, $ban_reas
if (sizeof($ban_other) == 3 && ((int)$ban_other[0] < 9999) &&
(strlen($ban_other[0]) == 4) && (strlen($ban_other[1]) == 2) && (strlen($ban_other[2]) == 2))
{
- $time_offset = (isset($user->timezone) && isset($user->dst)) ? (int) $user->timezone + (int) $user->dst : 0;
- $ban_end = max($current_time, gmmktime(0, 0, 0, (int)$ban_other[1], (int)$ban_other[2], (int)$ban_other[0]) - $time_offset);
+ $ban_end = max($current_time, $user->create_datetime()
+ ->setDate((int) $ban_other[0], (int) $ban_other[1], (int) $ban_other[2])
+ ->setTime(0, 0, 0)
+ ->getTimestamp() + $user->timezone->getOffset(new DateTime('UTC')));
}
else
{
@@ -1398,6 +1483,22 @@ function validate_language_iso_name($lang_iso)
}
/**
+* Validate Timezone Name
+*
+* Tests whether a timezone name is valid
+*
+* @param string $timezone The timezone string to test
+*
+* @return bool|string Either false if validation succeeded or
+* a string which will be used as the error message
+* (with the variable name appended)
+*/
+function phpbb_validate_timezone($timezone)
+{
+ return (in_array($timezone, phpbb_get_timezone_identifiers($timezone))) ? false : 'TIMEZONE_INVALID';
+}
+
+/**
* Check to see if the username has been taken, or if it is disallowed.
* Also checks if it includes the " character, which we don't allow in usernames.
* Used for registering, changing names, and posting anonymously with a username
@@ -1428,7 +1529,7 @@ function validate_username($username, $allowed_username = false)
$mbstring = $pcre = false;
// generic UTF-8 character types supported?
- if ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false)
+ if (phpbb_pcre_utf8_support())
{
$pcre = true;
}
@@ -1565,7 +1666,7 @@ function validate_password($password)
$pcre = $mbstring = false;
// generic UTF-8 character types supported?
- if ((version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>='))) && @preg_match('/\p{L}/u', 'a') !== false)
+ if (phpbb_pcre_utf8_support())
{
$upp = '\p{Lu}';
$low = '\p{Ll}';
@@ -1710,15 +1811,15 @@ function validate_jabber($jid)
return false;
}
- $seperator_pos = strpos($jid, '@');
+ $separator_pos = strpos($jid, '@');
- if ($seperator_pos === false)
+ if ($separator_pos === false)
{
return 'WRONG_DATA';
}
- $username = substr($jid, 0, $seperator_pos);
- $realm = substr($jid, $seperator_pos + 1);
+ $username = substr($jid, 0, $separator_pos);
+ $realm = substr($jid, $separator_pos + 1);
if (strlen($username) == 0 || strlen($realm) < 3)
{
@@ -1965,6 +2066,7 @@ function avatar_delete($mode, $row, $clean_db = false)
avatar_remove_db($row[$mode . '_avatar']);
}
$filename = get_avatar_filename($row[$mode . '_avatar']);
+
if (file_exists($phpbb_root_path . $config['avatar_path'] . '/' . $filename))
{
@unlink($phpbb_root_path . $config['avatar_path'] . '/' . $filename);
@@ -1975,133 +2077,6 @@ function avatar_delete($mode, $row, $clean_db = false)
}
/**
-* Remote avatar linkage
-*/
-function avatar_remote($data, &$error)
-{
- global $config, $db, $user, $phpbb_root_path, $phpEx;
-
- if (!preg_match('#^(http|https|ftp)://#i', $data['remotelink']))
- {
- $data['remotelink'] = 'http://' . $data['remotelink'];
- }
- if (!preg_match('#^(http|https|ftp)://(?:(.*?\.)*?[a-z0-9\-]+?\.[a-z]{2,4}|(?:\d{1,3}\.){3,5}\d{1,3}):?([0-9]*?).*?\.(gif|jpg|jpeg|png)$#i', $data['remotelink']))
- {
- $error[] = $user->lang['AVATAR_URL_INVALID'];
- return false;
- }
-
- // Make sure getimagesize works...
- if (($image_data = @getimagesize($data['remotelink'])) === false && (empty($data['width']) || empty($data['height'])))
- {
- $error[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
- return false;
- }
-
- if (!empty($image_data) && ($image_data[0] < 2 || $image_data[1] < 2))
- {
- $error[] = $user->lang['AVATAR_NO_SIZE'];
- return false;
- }
-
- $width = ($data['width'] && $data['height']) ? $data['width'] : $image_data[0];
- $height = ($data['width'] && $data['height']) ? $data['height'] : $image_data[1];
-
- if ($width < 2 || $height < 2)
- {
- $error[] = $user->lang['AVATAR_NO_SIZE'];
- return false;
- }
-
- // Check image type
- include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
- $types = fileupload::image_types();
- $extension = strtolower(filespec::get_extension($data['remotelink']));
-
- if (!empty($image_data) && (!isset($types[$image_data[2]]) || !in_array($extension, $types[$image_data[2]])))
- {
- if (!isset($types[$image_data[2]]))
- {
- $error[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
- }
- else
- {
- $error[] = sprintf($user->lang['IMAGE_FILETYPE_MISMATCH'], $types[$image_data[2]][0], $extension);
- }
- return false;
- }
-
- if ($config['avatar_max_width'] || $config['avatar_max_height'])
- {
- if ($width > $config['avatar_max_width'] || $height > $config['avatar_max_height'])
- {
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $width, $height);
- return false;
- }
- }
-
- if ($config['avatar_min_width'] || $config['avatar_min_height'])
- {
- if ($width < $config['avatar_min_width'] || $height < $config['avatar_min_height'])
- {
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $width, $height);
- return false;
- }
- }
-
- return array(AVATAR_REMOTE, $data['remotelink'], $width, $height);
-}
-
-/**
-* Avatar upload using the upload class
-*/
-function avatar_upload($data, &$error)
-{
- global $phpbb_root_path, $config, $db, $user, $phpEx;
-
- // Init upload class
- include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx);
- $upload = new fileupload('AVATAR_', array('jpg', 'jpeg', 'gif', 'png'), $config['avatar_filesize'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], (isset($config['mime_triggers']) ? explode('|', $config['mime_triggers']) : false));
-
- if (!empty($_FILES['uploadfile']['name']))
- {
- $file = $upload->form_upload('uploadfile');
- }
- else
- {
- $file = $upload->remote_upload($data['uploadurl']);
- }
-
- $prefix = $config['avatar_salt'] . '_';
- $file->clean_filename('avatar', $prefix, $data['user_id']);
-
- $destination = $config['avatar_path'];
-
- // Adjust destination path (no trailing slash)
- if (substr($destination, -1, 1) == '/' || substr($destination, -1, 1) == '\\')
- {
- $destination = substr($destination, 0, -1);
- }
-
- $destination = str_replace(array('../', '..\\', './', '.\\'), '', $destination);
- if ($destination && ($destination[0] == '/' || $destination[0] == "\\"))
- {
- $destination = '';
- }
-
- // Move file and overwrite any existing image
- $file->move_file($destination, true);
-
- if (sizeof($file->error))
- {
- $file->remove();
- $error = array_merge($error, $file->error);
- }
-
- return array(AVATAR_UPLOAD, $data['user_id'] . '_' . time() . '.' . $file->get('extension'), $file->get('width'), $file->get('height'));
-}
-
-/**
* Generates avatar filename from the database entry
*/
function get_avatar_filename($avatar_entry)
@@ -2124,358 +2099,111 @@ function get_avatar_filename($avatar_entry)
}
/**
-* Avatar Gallery
+* Returns an explanation string with maximum avatar settings
+*
+* @return string
*/
-function avatar_gallery($category, $avatar_select, $items_per_column, $block_var = 'avatar_row')
+function phpbb_avatar_explanation_string()
{
- global $user, $cache, $template;
- global $config, $phpbb_root_path;
-
- $avatar_list = array();
-
- $path = $phpbb_root_path . $config['avatar_gallery_path'];
-
- if (!file_exists($path) || !is_dir($path))
- {
- $avatar_list = array($user->lang['NO_AVATAR_CATEGORY'] => array());
- }
- else
- {
- // Collect images
- $dp = @opendir($path);
-
- if (!$dp)
- {
- return array($user->lang['NO_AVATAR_CATEGORY'] => array());
- }
+ global $config, $user;
- while (($file = readdir($dp)) !== false)
- {
- if ($file[0] != '.' && preg_match('#^[^&"\'<>]+$#i', $file) && is_dir("$path/$file"))
- {
- $avatar_row_count = $avatar_col_count = 0;
-
- if ($dp2 = @opendir("$path/$file"))
- {
- while (($sub_file = readdir($dp2)) !== false)
- {
- if (preg_match('#^[^&\'"<>]+\.(?:gif|png|jpe?g)$#i', $sub_file))
- {
- $avatar_list[$file][$avatar_row_count][$avatar_col_count] = array(
- 'file' => rawurlencode($file) . '/' . rawurlencode($sub_file),
- 'filename' => rawurlencode($sub_file),
- 'name' => ucfirst(str_replace('_', ' ', preg_replace('#^(.*)\..*$#', '\1', $sub_file))),
- );
- $avatar_col_count++;
- if ($avatar_col_count == $items_per_column)
- {
- $avatar_row_count++;
- $avatar_col_count = 0;
- }
- }
- }
- closedir($dp2);
- }
- }
- }
- closedir($dp);
- }
-
- if (!sizeof($avatar_list))
- {
- $avatar_list = array($user->lang['NO_AVATAR_CATEGORY'] => array());
- }
-
- @ksort($avatar_list);
-
- $category = (!$category) ? key($avatar_list) : $category;
- $avatar_categories = array_keys($avatar_list);
-
- $s_category_options = '';
- foreach ($avatar_categories as $cat)
- {
- $s_category_options .= '<option value="' . $cat . '"' . (($cat == $category) ? ' selected="selected"' : '') . '>' . $cat . '</option>';
- }
-
- $template->assign_vars(array(
- 'S_AVATARS_ENABLED' => true,
- 'S_IN_AVATAR_GALLERY' => true,
- 'S_CAT_OPTIONS' => $s_category_options)
- );
-
- $avatar_list = (isset($avatar_list[$category])) ? $avatar_list[$category] : array();
-
- foreach ($avatar_list as $avatar_row_ary)
- {
- $template->assign_block_vars($block_var, array());
-
- foreach ($avatar_row_ary as $avatar_col_ary)
- {
- $template->assign_block_vars($block_var . '.avatar_column', array(
- 'AVATAR_IMAGE' => $phpbb_root_path . $config['avatar_gallery_path'] . '/' . $avatar_col_ary['file'],
- 'AVATAR_NAME' => $avatar_col_ary['name'],
- 'AVATAR_FILE' => $avatar_col_ary['filename'])
- );
-
- $template->assign_block_vars($block_var . '.avatar_option_column', array(
- 'AVATAR_IMAGE' => $phpbb_root_path . $config['avatar_gallery_path'] . '/' . $avatar_col_ary['file'],
- 'S_OPTIONS_AVATAR' => $avatar_col_ary['filename'])
- );
- }
- }
-
- return $avatar_list;
+ return $user->lang('AVATAR_EXPLAIN',
+ $user->lang('PIXELS', (int) $config['avatar_max_width']),
+ $user->lang('PIXELS', (int) $config['avatar_max_height']),
+ round($config['avatar_filesize'] / 1024));
}
+//
+// Usergroup functions
+//
/**
-* Tries to (re-)establish avatar dimensions
-*/
-function avatar_get_dimensions($avatar, $avatar_type, &$error, $current_x = 0, $current_y = 0)
-{
- global $config, $phpbb_root_path, $user;
-
- switch ($avatar_type)
- {
- case AVATAR_REMOTE :
- break;
-
- case AVATAR_UPLOAD :
- $avatar = $phpbb_root_path . $config['avatar_path'] . '/' . get_avatar_filename($avatar);
- break;
-
- case AVATAR_GALLERY :
- $avatar = $phpbb_root_path . $config['avatar_gallery_path'] . '/' . $avatar ;
- break;
- }
-
- // Make sure getimagesize works...
- if (($image_data = @getimagesize($avatar)) === false)
- {
- $error[] = $user->lang['UNABLE_GET_IMAGE_SIZE'];
- return false;
- }
-
- if ($image_data[0] < 2 || $image_data[1] < 2)
- {
- $error[] = $user->lang['AVATAR_NO_SIZE'];
- return false;
- }
-
- // try to maintain ratio
- if (!(empty($current_x) && empty($current_y)))
- {
- if ($current_x != 0)
- {
- $image_data[1] = (int) floor(($current_x / $image_data[0]) * $image_data[1]);
- $image_data[1] = min($config['avatar_max_height'], $image_data[1]);
- $image_data[1] = max($config['avatar_min_height'], $image_data[1]);
- }
- if ($current_y != 0)
- {
- $image_data[0] = (int) floor(($current_y / $image_data[1]) * $image_data[0]);
- $image_data[0] = min($config['avatar_max_width'], $image_data[1]);
- $image_data[0] = max($config['avatar_min_width'], $image_data[1]);
- }
- }
- return array($image_data[0], $image_data[1]);
-}
-
-/**
-* Uploading/Changing user avatar
+* Add or edit a group. If we're editing a group we only update user
+* parameters such as rank, etc. if they are changed
*/
-function avatar_process_user(&$error, $custom_userdata = false, $can_upload = null)
+function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow_desc_bbcode = false, $allow_desc_urls = false, $allow_desc_smilies = false)
{
- global $config, $phpbb_root_path, $auth, $user, $db;
+ global $phpbb_root_path, $config, $db, $user, $file_upload, $phpbb_container;
- $data = array(
- 'uploadurl' => request_var('uploadurl', ''),
- 'remotelink' => request_var('remotelink', ''),
- 'width' => request_var('width', 0),
- 'height' => request_var('height', 0),
- );
-
- $error = validate_data($data, array(
- 'uploadurl' => array('string', true, 5, 255),
- 'remotelink' => array('string', true, 5, 255),
- 'width' => array('string', true, 1, 3),
- 'height' => array('string', true, 1, 3),
- ));
-
- if (sizeof($error))
- {
- return false;
- }
+ $error = array();
- $sql_ary = array();
+ // Attributes which also affect the users table
+ $user_attribute_ary = array('group_colour', 'group_rank', 'group_avatar', 'group_avatar_type', 'group_avatar_width', 'group_avatar_height');
- if ($custom_userdata === false)
- {
- $userdata = &$user->data;
- }
- else
+ // Check data. Limit group name length.
+ if (!utf8_strlen($name) || utf8_strlen($name) > 60)
{
- $userdata = &$custom_userdata;
+ $error[] = (!utf8_strlen($name)) ? $user->lang['GROUP_ERR_USERNAME'] : $user->lang['GROUP_ERR_USER_LONG'];
}
- $data['user_id'] = $userdata['user_id'];
- $change_avatar = ($custom_userdata === false) ? $auth->acl_get('u_chgavatar') : true;
- $avatar_select = basename(request_var('avatar_select', ''));
-
- // Can we upload?
- if (is_null($can_upload))
+ $err = group_validate_groupname($group_id, $name);
+ if (!empty($err))
{
- $can_upload = ($config['allow_avatar_upload'] && file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $change_avatar && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
+ $error[] = $user->lang[$err];
}
- if ((!empty($_FILES['uploadfile']['name']) || $data['uploadurl']) && $can_upload)
- {
- list($sql_ary['user_avatar_type'], $sql_ary['user_avatar'], $sql_ary['user_avatar_width'], $sql_ary['user_avatar_height']) = avatar_upload($data, $error);
- }
- else if ($data['remotelink'] && $change_avatar && $config['allow_avatar_remote'])
+ if (!in_array($type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN, GROUP_SPECIAL, GROUP_FREE)))
{
- list($sql_ary['user_avatar_type'], $sql_ary['user_avatar'], $sql_ary['user_avatar_width'], $sql_ary['user_avatar_height']) = avatar_remote($data, $error);
+ $error[] = $user->lang['GROUP_ERR_TYPE'];
}
- else if ($avatar_select && $change_avatar && $config['allow_avatar_local'])
- {
- $category = basename(request_var('category', ''));
- $sql_ary['user_avatar_type'] = AVATAR_GALLERY;
- $sql_ary['user_avatar'] = $avatar_select;
+ $group_teampage = !empty($group_attributes['group_teampage']);
+ unset($group_attributes['group_teampage']);
- // check avatar gallery
- if (!is_dir($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category))
- {
- $sql_ary['user_avatar'] = '';
- $sql_ary['user_avatar_type'] = $sql_ary['user_avatar_width'] = $sql_ary['user_avatar_height'] = 0;
- }
- else
- {
- list($sql_ary['user_avatar_width'], $sql_ary['user_avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . urldecode($sql_ary['user_avatar']));
- $sql_ary['user_avatar'] = $category . '/' . $sql_ary['user_avatar'];
- }
- }
- else if (isset($_POST['delete']) && $change_avatar)
- {
- $sql_ary['user_avatar'] = '';
- $sql_ary['user_avatar_type'] = $sql_ary['user_avatar_width'] = $sql_ary['user_avatar_height'] = 0;
- }
- else if (!empty($userdata['user_avatar']))
+ if (!sizeof($error))
{
- // Only update the dimensions
+ $current_legend = \phpbb\groupposition\legend::GROUP_DISABLED;
+ $current_teampage = \phpbb\groupposition\teampage::GROUP_DISABLED;
- if (empty($data['width']) || empty($data['height']))
+ $legend = $phpbb_container->get('groupposition.legend');
+ $teampage = $phpbb_container->get('groupposition.teampage');
+ if ($group_id)
{
- if ($dims = avatar_get_dimensions($userdata['user_avatar'], $userdata['user_avatar_type'], $error, $data['width'], $data['height']))
+ try
{
- list($guessed_x, $guessed_y) = $dims;
- if (empty($data['width']))
- {
- $data['width'] = $guessed_x;
- }
- if (empty($data['height']))
- {
- $data['height'] = $guessed_y;
- }
+ $current_legend = $legend->get_group_value($group_id);
+ $current_teampage = $teampage->get_group_value($group_id);
}
- }
- if (($config['avatar_max_width'] || $config['avatar_max_height']) &&
- (($data['width'] != $userdata['user_avatar_width']) || $data['height'] != $userdata['user_avatar_height']))
- {
- if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height'])
+ catch (\phpbb\groupposition\exception $exception)
{
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
+ trigger_error($user->lang($exception->getMessage()));
}
}
- if (!sizeof($error))
+ if (!empty($group_attributes['group_legend']))
{
- if ($config['avatar_min_width'] || $config['avatar_min_height'])
+ if (($group_id && ($current_legend == \phpbb\groupposition\legend::GROUP_DISABLED)) || !$group_id)
{
- if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height'])
- {
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
- }
+ // Old group currently not in the legend or new group, add at the end.
+ $group_attributes['group_legend'] = 1 + $legend->get_group_count();
+ }
+ else
+ {
+ // Group stayes in the legend
+ $group_attributes['group_legend'] = $current_legend;
}
}
-
- if (!sizeof($error))
+ else if ($group_id && ($current_legend != \phpbb\groupposition\legend::GROUP_DISABLED))
{
- $sql_ary['user_avatar_width'] = $data['width'];
- $sql_ary['user_avatar_height'] = $data['height'];
- }
- }
-
- if (!sizeof($error))
- {
- // Do we actually have any data to update?
- if (sizeof($sql_ary))
- {
- $ext_new = $ext_old = '';
- if (isset($sql_ary['user_avatar']))
+ // Group is removed from the legend
+ try
{
- $userdata = ($custom_userdata === false) ? $user->data : $custom_userdata;
- $ext_new = (empty($sql_ary['user_avatar'])) ? '' : substr(strrchr($sql_ary['user_avatar'], '.'), 1);
- $ext_old = (empty($userdata['user_avatar'])) ? '' : substr(strrchr($userdata['user_avatar'], '.'), 1);
-
- if ($userdata['user_avatar_type'] == AVATAR_UPLOAD)
- {
- // Delete old avatar if present
- if ((!empty($userdata['user_avatar']) && empty($sql_ary['user_avatar']))
- || ( !empty($userdata['user_avatar']) && !empty($sql_ary['user_avatar']) && $ext_new !== $ext_old))
- {
- avatar_delete('user', $userdata);
- }
- }
+ $legend->delete_group($group_id, true);
}
-
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
- WHERE user_id = ' . (($custom_userdata === false) ? $user->data['user_id'] : $custom_userdata['user_id']);
- $db->sql_query($sql);
-
+ catch (\phpbb\groupposition\exception $exception)
+ {
+ trigger_error($user->lang($exception->getMessage()));
+ }
+ $group_attributes['group_legend'] = \phpbb\groupposition\legend::GROUP_DISABLED;
+ }
+ else
+ {
+ $group_attributes['group_legend'] = \phpbb\groupposition\legend::GROUP_DISABLED;
}
- }
-
- return (sizeof($error)) ? false : true;
-}
-
-//
-// Usergroup functions
-//
-
-/**
-* Add or edit a group. If we're editing a group we only update user
-* parameters such as rank, etc. if they are changed
-*/
-function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow_desc_bbcode = false, $allow_desc_urls = false, $allow_desc_smilies = false)
-{
- global $phpbb_root_path, $config, $db, $user, $file_upload;
-
- $error = array();
-
- // Attributes which also affect the users table
- $user_attribute_ary = array('group_colour', 'group_rank', 'group_avatar', 'group_avatar_type', 'group_avatar_width', 'group_avatar_height');
-
- // Check data. Limit group name length.
- if (!utf8_strlen($name) || utf8_strlen($name) > 60)
- {
- $error[] = (!utf8_strlen($name)) ? $user->lang['GROUP_ERR_USERNAME'] : $user->lang['GROUP_ERR_USER_LONG'];
- }
-
- $err = group_validate_groupname($group_id, $name);
- if (!empty($err))
- {
- $error[] = $user->lang[$err];
- }
- if (!in_array($type, array(GROUP_OPEN, GROUP_CLOSED, GROUP_HIDDEN, GROUP_SPECIAL, GROUP_FREE)))
- {
- $error[] = $user->lang['GROUP_ERR_TYPE'];
- }
+ // Unset the objects, we don't need them anymore.
+ unset($legend);
- if (!sizeof($error))
- {
$user_ary = array();
$sql_ary = array(
'group_name' => (string) $name,
@@ -2515,12 +2243,12 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
}
$db->sql_freeresult($result);
- if (isset($sql_ary['group_avatar']) && !$sql_ary['group_avatar'])
+ if (isset($sql_ary['group_avatar']))
{
remove_default_avatar($group_id, $user_ary);
}
- if (isset($sql_ary['group_rank']) && !$sql_ary['group_rank'])
+ if (isset($sql_ary['group_rank']))
{
remove_default_rank($group_id, $user_ary);
}
@@ -2568,6 +2296,20 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
$db->sql_query($sql);
}
+ // Remove the group from the teampage, only if unselected and we are editing a group,
+ // which is currently displayed.
+ if (!$group_teampage && $group_id && $current_teampage != \phpbb\groupposition\teampage::GROUP_DISABLED)
+ {
+ try
+ {
+ $teampage->delete_group($group_id);
+ }
+ catch (\phpbb\groupposition\exception $exception)
+ {
+ trigger_error($user->lang($exception->getMessage()));
+ }
+ }
+
if (!$group_id)
{
$group_id = $db->sql_nextid();
@@ -2578,6 +2320,31 @@ function group_create(&$group_id, $type, $name, $desc, $group_attributes, $allow
}
}
+ try
+ {
+ if ($group_teampage && $current_teampage == \phpbb\groupposition\teampage::GROUP_DISABLED)
+ {
+ $teampage->add_group($group_id);
+ }
+
+ if ($group_teampage)
+ {
+ if ($current_teampage == \phpbb\groupposition\teampage::GROUP_DISABLED)
+ {
+ $teampage->add_group($group_id);
+ }
+ }
+ else if ($group_id && ($current_teampage != \phpbb\groupposition\teampage::GROUP_DISABLED))
+ {
+ $teampage->delete_group($group_id);
+ }
+ }
+ catch (\phpbb\groupposition\exception $exception)
+ {
+ trigger_error($user->lang($exception->getMessage()));
+ }
+ unset($teampage);
+
// Set user attributes
$sql_ary = array();
if (sizeof($group_attributes))
@@ -2659,7 +2426,7 @@ function avatar_remove_db($avatar_name)
*/
function group_delete($group_id, $group_name = false)
{
- global $db, $phpbb_root_path, $phpEx;
+ global $db, $cache, $auth, $user, $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container;
if (!$group_name)
{
@@ -2700,6 +2467,33 @@ function group_delete($group_id, $group_name = false)
}
while ($start);
+ // Delete group from legend and teampage
+ try
+ {
+ $legend = $phpbb_container->get('groupposition.legend');
+ $legend->delete_group($group_id);
+ unset($legend);
+ }
+ catch (\phpbb\groupposition\exception $exception)
+ {
+ // The group we want to delete does not exist.
+ // No reason to worry, we just continue the deleting process.
+ //trigger_error($user->lang($exception->getMessage()));
+ }
+
+ try
+ {
+ $teampage = $phpbb_container->get('groupposition.teampage');
+ $teampage->delete_group($group_id);
+ unset($teampage);
+ }
+ catch (\phpbb\groupposition\exception $exception)
+ {
+ // The group we want to delete does not exist.
+ // No reason to worry, we just continue the deleting process.
+ //trigger_error($user->lang($exception->getMessage()));
+ }
+
// Delete group
$sql = 'DELETE FROM ' . GROUPS_TABLE . "
WHERE group_id = $group_id";
@@ -2710,13 +2504,24 @@ function group_delete($group_id, $group_name = false)
WHERE group_id = $group_id";
$db->sql_query($sql);
+ /**
+ * Event after a group is deleted
+ *
+ * @event core.delete_group_after
+ * @var int group_id ID of the deleted group
+ * @var string group_name Name of the deleted group
+ * @since 3.1-A1
+ */
+ $vars = array('group_id', 'group_name');
+ extract($phpbb_dispatcher->trigger_event('core.delete_group_after', compact($vars)));
+
// Re-cache moderators
- if (!function_exists('cache_moderators'))
+ if (!function_exists('phpbb_cache_moderators'))
{
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
}
- cache_moderators();
+ phpbb_cache_moderators($db, $cache, $auth);
add_log('admin', 'LOG_GROUP_DELETE', $group_name);
@@ -2731,7 +2536,7 @@ function group_delete($group_id, $group_name = false)
*/
function group_user_add($group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $default = false, $leader = 0, $pending = 0, $group_attributes = false)
{
- global $db, $auth;
+ global $db, $auth, $phpbb_container;
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
@@ -2819,6 +2624,20 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
group_update_listings($group_id);
+ if ($pending)
+ {
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ foreach ($add_id_ary as $user_id)
+ {
+ $phpbb_notifications->add_notifications('group_request', array(
+ 'group_id' => $group_id,
+ 'user_id' => $user_id,
+ 'group_name' => $group_name,
+ ));
+ }
+ }
+
// Return false - no error
return false;
}
@@ -2832,7 +2651,7 @@ function group_user_add($group_id, $user_id_ary = false, $username_ary = false,
*/
function group_user_del($group_id, $user_id_ary = false, $username_ary = false, $group_name = false)
{
- global $db, $auth, $config;
+ global $db, $auth, $config, $phpbb_dispatcher, $phpbb_container;
if ($config['coppa_enable'])
{
@@ -2931,6 +2750,19 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
}
unset($special_group_data);
+ /**
+ * Event before users are removed from a group
+ *
+ * @event core.group_delete_user_before
+ * @var int group_id ID of the group from which users are deleted
+ * @var string group_name Name of the group
+ * @var array user_id_ary IDs of the users which are removed
+ * @var array username_ary names of the users which are removed
+ * @since 3.1-A1
+ */
+ $vars = array('group_id', 'group_name', 'user_id_ary', 'username_ary');
+ extract($phpbb_dispatcher->trigger_event('core.group_delete_user_before', compact($vars)));
+
$sql = 'DELETE FROM ' . USER_GROUP_TABLE . "
WHERE group_id = $group_id
AND " . $db->sql_in_set('user_id', $user_id_ary);
@@ -2953,6 +2785,10 @@ function group_user_del($group_id, $user_id_ary = false, $username_ary = false,
group_update_listings($group_id);
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->delete_notifications('group_request', $user_id_ary, $group_id);
+
// Return false - no error
return false;
}
@@ -2993,8 +2829,8 @@ function remove_default_avatar($group_id, $user_ids)
user_avatar_width = 0,
user_avatar_height = 0
WHERE group_id = " . (int) $group_id . "
- AND user_avatar = '" . $db->sql_escape($row['group_avatar']) . "'
- AND " . $db->sql_in_set('user_id', $user_ids);
+ AND user_avatar = '" . $db->sql_escape($row['group_avatar']) . "'
+ AND " . $db->sql_in_set('user_id', $user_ids);
$db->sql_query($sql);
}
@@ -3031,9 +2867,9 @@ function remove_default_rank($group_id, $user_ids)
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_rank = 0
WHERE group_id = ' . (int)$group_id . '
- AND user_rank <> 0
- AND user_rank = ' . (int)$row['group_rank'] . '
- AND ' . $db->sql_in_set('user_id', $user_ids);
+ AND user_rank <> 0
+ AND user_rank = ' . (int)$row['group_rank'] . '
+ AND ' . $db->sql_in_set('user_id', $user_ids);
$db->sql_query($sql);
}
@@ -3042,7 +2878,7 @@ function remove_default_rank($group_id, $user_ids)
*/
function group_user_attributes($action, $group_id, $user_id_ary = false, $username_ary = false, $group_name = false, $group_attributes = false)
{
- global $db, $auth, $phpbb_root_path, $phpEx, $config;
+ global $db, $auth, $phpbb_root_path, $phpEx, $config, $phpbb_container;
// We need both username and user_id info
$result = user_get_id_name($user_id_ary, $username_ary);
@@ -3062,7 +2898,8 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
case 'demote':
case 'promote':
- $sql = 'SELECT user_id FROM ' . USER_GROUP_TABLE . "
+ $sql = 'SELECT user_id
+ FROM ' . USER_GROUP_TABLE . "
WHERE group_id = $group_id
AND user_pending = 1
AND " . $db->sql_in_set('user_id', $user_id_ary);
@@ -3094,11 +2931,10 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
AND ' . $db->sql_in_set('ug.user_id', $user_id_ary);
$result = $db->sql_query($sql);
- $user_id_ary = $email_users = array();
+ $user_id_ary = array();
while ($row = $db->sql_fetchrow($result))
{
$user_id_ary[] = $row['user_id'];
- $email_users[] = $row;
}
$db->sql_freeresult($result);
@@ -3113,27 +2949,14 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
AND " . $db->sql_in_set('user_id', $user_id_ary);
$db->sql_query($sql);
- // Send approved email to users...
- include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $messenger = new messenger();
-
- foreach ($email_users as $row)
- {
- $messenger->template('group_approved', $row['user_lang']);
-
- $messenger->to($row['user_email'], $row['username']);
- $messenger->im($row['user_jabber'], $row['username']);
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($row['username']),
- 'GROUP_NAME' => htmlspecialchars_decode($group_name),
- 'U_GROUP' => generate_board_url() . "/ucp.$phpEx?i=groups&mode=membership")
- );
-
- $messenger->send($row['user_notify_type']);
- }
-
- $messenger->save_queue();
+ $phpbb_notifications->add_notifications('group_request_approved', array(
+ 'user_ids' => $user_id_ary,
+ 'group_id' => $group_id,
+ 'group_name' => $group_name,
+ ));
+ $phpbb_notifications->delete_notifications('group_request', $user_id_ary, $group_id);
$log = 'LOG_USERS_APPROVED';
break;
@@ -3160,7 +2983,8 @@ function group_user_attributes($action, $group_id, $user_id_ary = false, $userna
return 'NO_USERS';
}
- $sql = 'SELECT user_id, group_id FROM ' . USERS_TABLE . '
+ $sql = 'SELECT user_id, group_id
+ FROM ' . USERS_TABLE . '
WHERE ' . $db->sql_in_set('user_id', $user_id_ary, false, true);
$result = $db->sql_query($sql);
@@ -3248,7 +3072,7 @@ function group_validate_groupname($group_id, $group_name)
*/
function group_set_user_default($group_id, $user_id_ary, $group_attributes = false, $update_listing = false)
{
- global $cache, $db;
+ global $phpbb_container, $db, $phpbb_dispatcher;
if (empty($user_id_ary))
{
@@ -3294,45 +3118,69 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
}
}
- // Before we update the user attributes, we will make a list of those having now the group avatar assigned
- if (isset($sql_ary['user_avatar']))
+ $updated_sql_ary = $sql_ary;
+
+ // Before we update the user attributes, we will update the rank for users that don't have a custom rank
+ if (isset($sql_ary['user_rank']))
{
- // Ok, get the original avatar data from users having an uploaded one (we need to remove these from the filesystem)
- $sql = 'SELECT user_id, group_id, user_avatar
- FROM ' . USERS_TABLE . '
- WHERE ' . $db->sql_in_set('user_id', $user_id_ary) . '
- AND user_avatar_type = ' . AVATAR_UPLOAD;
- $result = $db->sql_query($sql);
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', array('user_rank' => $sql_ary['user_rank'])) . '
+ WHERE user_rank = 0
+ AND ' . $db->sql_in_set('user_id', $user_id_ary);
+ $db->sql_query($sql);
+ unset($sql_ary['user_rank']);
+ }
- while ($row = $db->sql_fetchrow($result))
+ // Before we update the user attributes, we will update the avatar for users that don't have a custom avatar
+ $avatar_options = array('user_avatar', 'user_avatar_type', 'user_avatar_height', 'user_avatar_width');
+
+ if (isset($sql_ary['user_avatar']))
+ {
+ $avatar_sql_ary = array();
+ foreach ($avatar_options as $avatar_option)
{
- avatar_delete('user', $row);
- }
- $db->sql_freeresult($result);
+ if (isset($sql_ary[$avatar_option]))
+ {
+ $avatar_sql_ary[$avatar_option] = $sql_ary[$avatar_option];
+ }
+ }
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $avatar_sql_ary) . "
+ WHERE user_avatar = ''
+ AND " . $db->sql_in_set('user_id', $user_id_ary);
+ $db->sql_query($sql);
}
- else
+
+ // Remove the avatar options, as we already updated them
+ foreach ($avatar_options as $avatar_option)
{
- unset($sql_ary['user_avatar_type']);
- unset($sql_ary['user_avatar_height']);
- unset($sql_ary['user_avatar_width']);
+ unset($sql_ary[$avatar_option]);
}
- $sql = 'UPDATE ' . USERS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
- WHERE ' . $db->sql_in_set('user_id', $user_id_ary);
- $db->sql_query($sql);
+ if (!empty($sql_ary))
+ {
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
+ WHERE ' . $db->sql_in_set('user_id', $user_id_ary);
+ $db->sql_query($sql);
+ }
if (isset($sql_ary['user_colour']))
{
// Update any cached colour information for these users
- $sql = 'UPDATE ' . FORUMS_TABLE . " SET forum_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
+ $sql = 'UPDATE ' . FORUMS_TABLE . "
+ SET forum_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
WHERE " . $db->sql_in_set('forum_last_poster_id', $user_id_ary);
$db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_first_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
+ $sql = 'UPDATE ' . TOPICS_TABLE . "
+ SET topic_first_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
WHERE " . $db->sql_in_set('topic_poster', $user_id_ary);
$db->sql_query($sql);
- $sql = 'UPDATE ' . TOPICS_TABLE . " SET topic_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
+ $sql = 'UPDATE ' . TOPICS_TABLE . "
+ SET topic_last_poster_colour = '" . $db->sql_escape($sql_ary['user_colour']) . "'
WHERE " . $db->sql_in_set('topic_last_poster_id', $user_id_ary);
$db->sql_query($sql);
@@ -3344,13 +3192,30 @@ function group_set_user_default($group_id, $user_id_ary, $group_attributes = fal
}
}
+ // Make all values available for the event
+ $sql_ary = $updated_sql_ary;
+
+ /**
+ * Event when the default group is set for an array of users
+ *
+ * @event core.user_set_default_group
+ * @var int group_id ID of the group
+ * @var array user_id_ary IDs of the users
+ * @var array group_attributes Group attributes which were changed
+ * @var array update_listing Update the list of moderators and foes
+ * @var array sql_ary User attributes which were changed
+ * @since 3.1-A1
+ */
+ $vars = array('group_id', 'user_id_ary', 'group_attributes', 'update_listing', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.user_set_default_group', compact($vars)));
+
if ($update_listing)
{
group_update_listings($group_id);
}
// Because some tables/caches use usercolour-specific data we need to purge this here.
- $cache->destroy('sql', MODERATOR_CACHE_TABLE);
+ $phpbb_container->get('cache.driver')->destroy('sql', MODERATOR_CACHE_TABLE);
}
/**
@@ -3449,7 +3314,7 @@ function group_memberships($group_id_ary = false, $user_id_ary = false, $return_
*/
function group_update_listings($group_id)
{
- global $auth;
+ global $db, $cache, $auth;
$hold_ary = $auth->acl_group_raw_data($group_id, array('a_', 'm_'));
@@ -3491,22 +3356,22 @@ function group_update_listings($group_id)
if ($mod_permissions)
{
- if (!function_exists('cache_moderators'))
+ if (!function_exists('phpbb_cache_moderators'))
{
global $phpbb_root_path, $phpEx;
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
}
- cache_moderators();
+ phpbb_cache_moderators($db, $cache, $auth);
}
if ($mod_permissions || $admin_permissions)
{
- if (!function_exists('update_foes'))
+ if (!function_exists('phpbb_update_foes'))
{
global $phpbb_root_path, $phpEx;
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
}
- update_foes(array($group_id));
+ phpbb_update_foes($db, $auth, array($group_id));
}
}
@@ -3615,5 +3480,3 @@ function phpbb_get_banned_user_ids($user_ids = array())
return $banned_ids_list;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/hooks/index.php b/phpBB/includes/hooks/index.php
index aa85e63f32..11478aee1e 100644
--- a/phpBB/includes/hooks/index.php
+++ b/phpBB/includes/hooks/index.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2007 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -246,5 +245,3 @@ class phpbb_hook
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_ban.php b/phpBB/includes/mcp/info/mcp_ban.php
index 383df30498..a3a1e0ef9a 100644
--- a/phpBB/includes/mcp/info/mcp_ban.php
+++ b/phpBB/includes/mcp/info/mcp_ban.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -35,5 +34,3 @@ class mcp_ban_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_logs.php b/phpBB/includes/mcp/info/mcp_logs.php
index fe2f9fa1d7..fc30a600c0 100644
--- a/phpBB/includes/mcp/info/mcp_logs.php
+++ b/phpBB/includes/mcp/info/mcp_logs.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -35,5 +34,3 @@ class mcp_logs_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_main.php b/phpBB/includes/mcp/info/mcp_main.php
index 9755cdfc07..705715cbeb 100644
--- a/phpBB/includes/mcp/info/mcp_main.php
+++ b/phpBB/includes/mcp/info/mcp_main.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -36,5 +35,3 @@ class mcp_main_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_notes.php b/phpBB/includes/mcp/info/mcp_notes.php
index afe232e5b5..a77b461bbd 100644
--- a/phpBB/includes/mcp/info/mcp_notes.php
+++ b/phpBB/includes/mcp/info/mcp_notes.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,5 +33,3 @@ class mcp_notes_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_pm_reports.php b/phpBB/includes/mcp/info/mcp_pm_reports.php
index 103f560597..07dc564b19 100644
--- a/phpBB/includes/mcp/info/mcp_pm_reports.php
+++ b/phpBB/includes/mcp/info/mcp_pm_reports.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -35,5 +34,3 @@ class mcp_pm_reports_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_queue.php b/phpBB/includes/mcp/info/mcp_queue.php
index 7a256642b9..68cac5abd2 100644
--- a/phpBB/includes/mcp/info/mcp_queue.php
+++ b/phpBB/includes/mcp/info/mcp_queue.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -22,6 +21,8 @@ class mcp_queue_info
'modes' => array(
'unapproved_topics' => array('title' => 'MCP_QUEUE_UNAPPROVED_TOPICS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
'unapproved_posts' => array('title' => 'MCP_QUEUE_UNAPPROVED_POSTS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
+ 'deleted_topics' => array('title' => 'MCP_QUEUE_DELETED_TOPICS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
+ 'deleted_posts' => array('title' => 'MCP_QUEUE_DELETED_POSTS', 'auth' => 'aclf_m_approve', 'cat' => array('MCP_QUEUE')),
'approve_details' => array('title' => 'MCP_QUEUE_APPROVE_DETAILS', 'auth' => 'acl_m_approve,$id || (!$id && aclf_m_approve)', 'cat' => array('MCP_QUEUE')),
),
);
@@ -35,5 +36,3 @@ class mcp_queue_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_reports.php b/phpBB/includes/mcp/info/mcp_reports.php
index 3893ba5abb..cb6962a1d5 100644
--- a/phpBB/includes/mcp/info/mcp_reports.php
+++ b/phpBB/includes/mcp/info/mcp_reports.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -35,5 +34,3 @@ class mcp_reports_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/info/mcp_warn.php b/phpBB/includes/mcp/info/mcp_warn.php
index 2b0b09f75a..d5ac1eedbf 100644
--- a/phpBB/includes/mcp/info/mcp_warn.php
+++ b/phpBB/includes/mcp/info/mcp_warn.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -36,5 +35,3 @@ class mcp_warn_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_ban.php b/phpBB/includes/mcp/mcp_ban.php
index d9f5eb8f22..d3bc336293 100644
--- a/phpBB/includes/mcp/mcp_ban.php
+++ b/phpBB/includes/mcp/mcp_ban.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -215,5 +214,3 @@ class mcp_ban
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_forum.php b/phpBB/includes/mcp/mcp_forum.php
index 04e0e70f1d..6df3320a97 100644
--- a/phpBB/includes/mcp/mcp_forum.php
+++ b/phpBB/includes/mcp/mcp_forum.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -23,6 +22,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
{
global $template, $db, $user, $auth, $cache, $module;
global $phpEx, $phpbb_root_path, $config;
+ global $request, $phpbb_dispatcher, $phpbb_container;
$user->add_lang(array('viewtopic', 'viewforum'));
@@ -34,7 +34,10 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
if ($merge_select)
{
// Fixes a "bug" that makes forum_view use the same ordering as topic_view
- unset($_POST['sk'], $_POST['sd'], $_REQUEST['sk'], $_REQUEST['sd']);
+ $request->overwrite('sk', null);
+ $request->overwrite('sd', null);
+ $request->overwrite('sk', null, \phpbb\request\request_interface::POST);
+ $request->overwrite('sd', null, \phpbb\request\request_interface::POST);
}
$forum_id = $forum_info['forum_id'];
@@ -95,9 +98,12 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$sort_by_sql = $sort_order_sql = array();
mcp_sorting('viewforum', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id);
- $forum_topics = ($total == -1) ? $forum_info['forum_topics'] : $total;
+ $forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
+ $base_url = $url . "&amp;i=$id&amp;action=$action&amp;mode=$mode&amp;sd=$sort_dir&amp;sk=$sort_key&amp;st=$sort_days" . (($merge_select) ? $selected_ids : '');
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $forum_topics, $topics_per_page, $start);
+
$template->assign_vars(array(
'ACTION' => $action,
'FORUM_NAME' => $forum_info['forum_name'],
@@ -110,6 +116,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
'S_CAN_REPORT' => $auth->acl_get('m_report', $forum_id),
'S_CAN_DELETE' => $auth->acl_get('m_delete', $forum_id),
+ 'S_CAN_RESTORE' => $auth->acl_get('m_approve', $forum_id),
'S_CAN_MERGE' => $auth->acl_get('m_merge', $forum_id),
'S_CAN_MOVE' => $auth->acl_get('m_move', $forum_id),
'S_CAN_FORK' => $auth->acl_get('m_', $forum_id),
@@ -126,9 +133,8 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
'S_MCP_ACTION' => $url . "&amp;i=$id&amp;forum_action=$action&amp;mode=$mode&amp;start=$start" . (($merge_select) ? $selected_ids : ''),
- 'PAGINATION' => generate_pagination($url . "&amp;i=$id&amp;action=$action&amp;mode=$mode&amp;sd=$sort_dir&amp;sk=$sort_key&amp;st=$sort_days" . (($merge_select) ? $selected_ids : ''), $forum_topics, $topics_per_page, $start),
- 'PAGE_NUMBER' => on_page($forum_topics, $topics_per_page, $start),
- 'TOTAL_TOPICS' => ($forum_topics == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $forum_topics),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $forum_topics, $topics_per_page, $start),
+ 'TOTAL_TOPICS' => $user->lang('VIEW_FORUM_TOPICS', (int) $forum_topics),
));
// Grab icons
@@ -146,10 +152,12 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$read_tracking_join = $read_tracking_select = '';
}
- $sql = "SELECT t.topic_id
- FROM " . TOPICS_TABLE . " t
- WHERE t.forum_id IN($forum_id, 0)
- " . (($auth->acl_get('m_approve', $forum_id)) ? '' : 'AND t.topic_approved = 1') . "
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
+ $sql = 'SELECT t.topic_id
+ FROM ' . TOPICS_TABLE . ' t
+ WHERE t.forum_id = ' . $forum_id . '
+ AND ' . $phpbb_content_visibility->get_visibility_sql('topic', $forum_id, 't.') . "
$limit_time_sql
ORDER BY t.topic_type DESC, $sort_order_sql";
$result = $db->sql_query_limit($sql, $topics_per_page, $start);
@@ -184,11 +192,11 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
{
if ($config['load_db_lastread'])
{
- $topic_tracking_info = get_topic_tracking($forum_id, $topic_list, $topic_rows, array($forum_id => $forum_info['mark_time']), array());
+ $topic_tracking_info = get_topic_tracking($forum_id, $topic_list, $topic_rows, array($forum_id => $forum_info['mark_time']));
}
else
{
- $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_list, array());
+ $topic_tracking_info = get_complete_topic_tracking($forum_id, $topic_list);
}
}
@@ -198,7 +206,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$row = &$topic_rows[$topic_id];
- $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
+ $replies = $phpbb_content_visibility->get_count('topic_posts', $row, $forum_id) - 1;
if ($row['topic_status'] == ITEM_MOVED)
{
@@ -215,18 +223,21 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
$topic_title = censor_text($row['topic_title']);
- $topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
- $posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
+ $topic_unapproved = ($row['topic_visibility'] == ITEM_UNAPPROVED && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
+ $posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $row['forum_id'])) ? true : false;
+ $topic_deleted = $row['topic_visibility'] == ITEM_DELETED;
$u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? $url . '&amp;i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . '&amp;t=' . $row['topic_id'] : '';
+ $u_mcp_queue = (!$u_mcp_queue && $topic_deleted) ? $url . '&amp;i=queue&amp;mode=deleted_topics&amp;t=' . $topic_id : $u_mcp_queue;
$topic_row = array(
'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+ 'TOPIC_IMG_STYLE' => $folder_img,
'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt),
- 'TOPIC_FOLDER_IMG_SRC' => $user->img($folder_img, $folder_alt, false, '', 'src'),
'TOPIC_ICON_IMG' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
'TOPIC_ICON_IMG_WIDTH' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
'TOPIC_ICON_IMG_HEIGHT' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
'UNAPPROVED_IMG' => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
+ 'DELETED_IMG' => ($topic_deleted) ? $user->img('icon_topic_deleted', 'POSTS_DELETED') : '',
'TOPIC_AUTHOR' => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
'TOPIC_AUTHOR_COLOUR' => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
@@ -240,7 +251,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
'TOPIC_TYPE' => $topic_type,
'TOPIC_TITLE' => $topic_title,
- 'REPLIES' => ($auth->acl_get('m_approve', $row['forum_id'])) ? $row['topic_replies_real'] : $row['topic_replies'],
+ 'REPLIES' => $phpbb_content_visibility->get_count('topic_posts', $row, $row['forum_id']) - 1,
'LAST_POST_TIME' => $user->format_date($row['topic_last_post_time']),
'FIRST_POST_TIME' => $user->format_date($row['topic_time']),
'LAST_POST_SUBJECT' => $row['topic_last_post_subject'],
@@ -249,6 +260,7 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
'S_TOPIC_REPORTED' => (!empty($row['topic_reported']) && empty($row['topic_moved_id']) && $auth->acl_get('m_report', $row['forum_id'])) ? true : false,
'S_TOPIC_UNAPPROVED' => $topic_unapproved,
'S_POSTS_UNAPPROVED' => $posts_unapproved,
+ 'S_TOPIC_DELETED' => $topic_deleted,
'S_UNREAD_TOPIC' => $unread_topic,
);
@@ -283,6 +295,17 @@ function mcp_forum_view($id, $mode, $action, $forum_info)
));
}
+ /**
+ * Modify the topic data before it is assigned to the template in MCP
+ *
+ * @event core.mcp_view_forum_modify_topicrow
+ * @var array row Array with topic data
+ * @var array topic_row Template array with topic data
+ * @since 3.1-A1
+ */
+ $vars = array('row', 'topic_row');
+ extract($phpbb_dispatcher->trigger_event('core.mcp_view_forum_modify_topicrow', compact($vars)));
+
$template->assign_block_vars('topicrow', $topic_row);
}
unset($topic_rows);
@@ -433,7 +456,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
confirm_box(false, 'MERGE_TOPICS', $s_hidden_fields);
}
- $redirect = request_var('redirect', "index.$phpEx");
+ $redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
$redirect = reapply_sid($redirect);
if (!$success_msg)
@@ -442,9 +465,7 @@ function merge_topics($forum_id, $topic_ids, $to_topic_id)
}
else
{
- meta_refresh(3, append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$to_forum_id&amp;t=$to_topic_id"));
+ meta_refresh(3, $redirect);
trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_front.php b/phpBB/includes/mcp/mcp_front.php
index af262baa29..44cab5d910 100644
--- a/phpBB/includes/mcp/mcp_front.php
+++ b/phpBB/includes/mcp/mcp_front.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -39,16 +38,14 @@ function mcp_front_view($id, $mode, $action)
{
$sql = 'SELECT COUNT(post_id) AS total
FROM ' . POSTS_TABLE . '
- WHERE forum_id IN (0, ' . implode(', ', $forum_list) . ')
- AND post_approved = 0';
+ WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
+ AND post_visibility = ' . ITEM_UNAPPROVED;
$result = $db->sql_query($sql);
$total = (int) $db->sql_fetchfield('total');
$db->sql_freeresult($result);
if ($total)
{
- $global_id = $forum_list[0];
-
$sql = 'SELECT forum_id, forum_name
FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_list);
@@ -62,8 +59,8 @@ function mcp_front_view($id, $mode, $action)
$sql = 'SELECT post_id
FROM ' . POSTS_TABLE . '
- WHERE forum_id IN (0, ' . implode(', ', $forum_list) . ')
- AND post_approved = 0
+ WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
+ AND post_visibility = ' . ITEM_UNAPPROVED . '
ORDER BY post_time DESC';
$result = $db->sql_query_limit($sql, 5);
@@ -81,7 +78,7 @@ function mcp_front_view($id, $mode, $action)
if ($total)
{
- $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.poster_id, p.post_username, u.username, u.username_clean, u.user_colour, t.topic_id, t.topic_title, t.topic_first_post_id, p.forum_id
+ $sql = 'SELECT p.post_id, p.post_subject, p.post_time, p.post_attachment, p.poster_id, p.post_username, u.username, u.username_clean, u.user_colour, t.topic_id, t.topic_title, t.topic_first_post_id, p.forum_id
FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u
WHERE ' . $db->sql_in_set('p.post_id', $post_list) . '
AND t.topic_id = p.topic_id
@@ -91,17 +88,11 @@ function mcp_front_view($id, $mode, $action)
while ($row = $db->sql_fetchrow($result))
{
- $global_topic = ($row['forum_id']) ? false : true;
- if ($global_topic)
- {
- $row['forum_id'] = $global_id;
- }
-
$template->assign_block_vars('unapproved', array(
'U_POST_DETAILS' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']),
- 'U_MCP_FORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=forum_view&amp;f=' . $row['forum_id']) : '',
+ 'U_MCP_FORUM' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=forum_view&amp;f=' . $row['forum_id']),
'U_MCP_TOPIC' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=topic_view&amp;f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
- 'U_FORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : '',
+ 'U_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'U_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
'AUTHOR_FULL' => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour']),
@@ -109,12 +100,13 @@ function mcp_front_view($id, $mode, $action)
'AUTHOR_COLOUR' => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour']),
'U_AUTHOR' => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour']),
- 'FORUM_NAME' => (!$global_topic) ? $forum_names[$row['forum_id']] : $user->lang['GLOBAL_ANNOUNCEMENT'],
+ 'FORUM_NAME' => $forum_names[$row['forum_id']],
'POST_ID' => $row['post_id'],
'TOPIC_TITLE' => $row['topic_title'],
'SUBJECT' => ($row['post_subject']) ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
- 'POST_TIME' => $user->format_date($row['post_time']))
- );
+ 'POST_TIME' => $user->format_date($row['post_time']),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+ ));
}
$db->sql_freeresult($result);
}
@@ -126,22 +118,9 @@ function mcp_front_view($id, $mode, $action)
$template->assign_vars(array(
'S_HIDDEN_FIELDS' => $s_hidden_fields,
'S_MCP_QUEUE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue"),
+ 'L_UNAPPROVED_TOTAL' => $user->lang('UNAPPROVED_POSTS_TOTAL', (int) $total),
+ 'S_HAS_UNAPPROVED_POSTS'=> ($total != 0),
));
-
- if ($total == 0)
- {
- $template->assign_vars(array(
- 'L_UNAPPROVED_TOTAL' => $user->lang['UNAPPROVED_POSTS_ZERO_TOTAL'],
- 'S_HAS_UNAPPROVED_POSTS' => false)
- );
- }
- else
- {
- $template->assign_vars(array(
- 'L_UNAPPROVED_TOTAL' => ($total == 1) ? $user->lang['UNAPPROVED_POST_TOTAL'] : sprintf($user->lang['UNAPPROVED_POSTS_TOTAL'], $total),
- 'S_HAS_UNAPPROVED_POSTS' => true)
- );
- }
}
}
@@ -159,31 +138,29 @@ function mcp_front_view($id, $mode, $action)
WHERE r.post_id = p.post_id
AND r.pm_id = 0
AND r.report_closed = 0
- AND p.forum_id IN (0, ' . implode(', ', $forum_list) . ')';
+ AND ' . $db->sql_in_set('p.forum_id', $forum_list);
$result = $db->sql_query($sql);
$total = (int) $db->sql_fetchfield('total');
$db->sql_freeresult($result);
if ($total)
{
- $global_id = $forum_list[0];
-
- $sql = $db->sql_build_query('SELECT', array(
- 'SELECT' => 'r.report_time, p.post_id, p.post_subject, p.post_time, u.username, u.username_clean, u.user_colour, u.user_id, u2.username as author_name, u2.username_clean as author_name_clean, u2.user_colour as author_colour, u2.user_id as author_id, t.topic_id, t.topic_title, f.forum_id, f.forum_name',
+ $sql_ary = array(
+ 'SELECT' => 'r.report_time, p.post_id, p.post_subject, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour, u.user_id, u2.username as author_name, u2.username_clean as author_name_clean, u2.user_colour as author_colour, u2.user_id as author_id, t.topic_id, t.topic_title, f.forum_id, f.forum_name',
'FROM' => array(
REPORTS_TABLE => 'r',
REPORTS_REASONS_TABLE => 'rr',
TOPICS_TABLE => 't',
USERS_TABLE => array('u', 'u2'),
- POSTS_TABLE => 'p'
+ POSTS_TABLE => 'p',
),
'LEFT_JOIN' => array(
array(
'FROM' => array(FORUMS_TABLE => 'f'),
- 'ON' => 'f.forum_id = p.forum_id'
- )
+ 'ON' => 'f.forum_id = p.forum_id',
+ ),
),
'WHERE' => 'r.post_id = p.post_id
@@ -193,25 +170,20 @@ function mcp_front_view($id, $mode, $action)
AND p.topic_id = t.topic_id
AND r.user_id = u.user_id
AND p.poster_id = u2.user_id
- AND p.forum_id IN (0, ' . implode(', ', $forum_list) . ')',
+ AND ' . $db->sql_in_set('p.forum_id', $forum_list),
- 'ORDER_BY' => 'p.post_time DESC'
- ));
+ 'ORDER_BY' => 'p.post_time DESC',
+ );
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query_limit($sql, 5);
while ($row = $db->sql_fetchrow($result))
{
- $global_topic = ($row['forum_id']) ? false : true;
- if ($global_topic)
- {
- $row['forum_id'] = $global_id;
- }
-
$template->assign_block_vars('report', array(
'U_POST_DETAILS' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id'] . "&amp;i=reports&amp;mode=report_details"),
- 'U_MCP_FORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'f=' . $row['forum_id'] . "&amp;i=$id&amp;mode=forum_view") : '',
+ 'U_MCP_FORUM' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'f=' . $row['forum_id'] . "&amp;i=$id&amp;mode=forum_view"),
'U_MCP_TOPIC' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id'] . "&amp;i=$id&amp;mode=topic_view"),
- 'U_FORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : '',
+ 'U_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'U_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
'REPORTER_FULL' => get_username_string('full', $row['user_id'], $row['username'], $row['user_colour']),
@@ -224,29 +196,20 @@ function mcp_front_view($id, $mode, $action)
'AUTHOR_COLOUR' => get_username_string('colour', $row['author_id'], $row['author_name'], $row['author_colour']),
'U_AUTHOR' => get_username_string('profile', $row['author_id'], $row['author_name'], $row['author_colour']),
- 'FORUM_NAME' => (!$global_topic) ? $row['forum_name'] : $user->lang['GLOBAL_ANNOUNCEMENT'],
+ 'FORUM_NAME' => $row['forum_name'],
'TOPIC_TITLE' => $row['topic_title'],
'SUBJECT' => ($row['post_subject']) ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
'REPORT_TIME' => $user->format_date($row['report_time']),
'POST_TIME' => $user->format_date($row['post_time']),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
));
}
}
- if ($total == 0)
- {
- $template->assign_vars(array(
- 'L_REPORTS_TOTAL' => $user->lang['REPORTS_ZERO_TOTAL'],
- 'S_HAS_REPORTS' => false)
- );
- }
- else
- {
- $template->assign_vars(array(
- 'L_REPORTS_TOTAL' => ($total == 1) ? $user->lang['REPORT_TOTAL'] : sprintf($user->lang['REPORTS_TOTAL'], $total),
- 'S_HAS_REPORTS' => true)
- );
- }
+ $template->assign_vars(array(
+ 'L_REPORTS_TOTAL' => $user->lang('REPORTS_TOTAL', (int) $total),
+ 'S_HAS_REPORTS' => ($total != 0),
+ ));
}
}
@@ -269,14 +232,14 @@ function mcp_front_view($id, $mode, $action)
{
include($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
- $sql = $db->sql_build_query('SELECT', array(
- 'SELECT' => 'r.report_id, r.report_time, p.msg_id, p.message_subject, p.message_time, p.to_address, p.bcc_address, u.username, u.username_clean, u.user_colour, u.user_id, u2.username as author_name, u2.username_clean as author_name_clean, u2.user_colour as author_colour, u2.user_id as author_id',
+ $sql_ary = array(
+ 'SELECT' => 'r.report_id, r.report_time, p.msg_id, p.message_subject, p.message_time, p.to_address, p.bcc_address, p.message_attachment, u.username, u.username_clean, u.user_colour, u.user_id, u2.username as author_name, u2.username_clean as author_name_clean, u2.user_colour as author_colour, u2.user_id as author_id',
'FROM' => array(
REPORTS_TABLE => 'r',
REPORTS_REASONS_TABLE => 'rr',
USERS_TABLE => array('u', 'u2'),
- PRIVMSGS_TABLE => 'p'
+ PRIVMSGS_TABLE => 'p',
),
'WHERE' => 'r.pm_id = p.msg_id
@@ -286,8 +249,9 @@ function mcp_front_view($id, $mode, $action)
AND r.user_id = u.user_id
AND p.author_id = u2.user_id',
- 'ORDER_BY' => 'p.message_time DESC'
- ));
+ 'ORDER_BY' => 'p.message_time DESC',
+ );
+ $sql = $db->sql_build_query('SELECT', $sql_ary);
$result = $db->sql_query_limit($sql, 5);
$pm_by_id = $pm_list = array();
@@ -320,24 +284,15 @@ function mcp_front_view($id, $mode, $action)
'REPORT_TIME' => $user->format_date($row['report_time']),
'PM_TIME' => $user->format_date($row['message_time']),
'RECIPIENTS' => implode(', ', $address_list[$row['msg_id']]),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $row['message_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
));
}
}
- if ($total == 0)
- {
- $template->assign_vars(array(
- 'L_PM_REPORTS_TOTAL' => $user->lang['PM_REPORTS_ZERO_TOTAL'],
- 'S_HAS_PM_REPORTS' => false)
- );
- }
- else
- {
- $template->assign_vars(array(
- 'L_PM_REPORTS_TOTAL' => ($total == 1) ? $user->lang['PM_REPORT_TOTAL'] : sprintf($user->lang['PM_REPORTS_TOTAL'], $total),
- 'S_HAS_PM_REPORTS' => true)
- );
- }
+ $template->assign_vars(array(
+ 'L_PM_REPORTS_TOTAL' => $user->lang('PM_REPORTS_TOTAL', (int) $total),
+ 'S_HAS_PM_REPORTS' => ($total != 0),
+ ));
}
// Latest 5 logs
@@ -347,9 +302,6 @@ function mcp_front_view($id, $mode, $action)
if (!empty($forum_list))
{
- // Add forum_id 0 for global announcements
- $forum_list[] = 0;
-
$log_count = false;
$log = array();
view_log('mod', $log, $log_count, 5, 0, $forum_list);
@@ -376,5 +328,3 @@ function mcp_front_view($id, $mode, $action)
$template->assign_var('S_MCP_ACTION', append_sid("{$phpbb_root_path}mcp.$phpEx"));
make_jumpbox(append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&amp;mode=forum_view'), 0, false, 'm_', true);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_logs.php b/phpBB/includes/mcp/mcp_logs.php
index 73ff72c177..f706840492 100644
--- a/phpBB/includes/mcp/mcp_logs.php
+++ b/phpBB/includes/mcp/mcp_logs.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -172,10 +171,12 @@ class mcp_logs
$log_count = 0;
$start = view_log('mod', $log_data, $log_count, $config['topics_per_page'], $start, $forum_list, $topic_id, 0, $sql_where, $sql_sort, $keywords);
+ $base_url = $this->u_action . "&amp;$u_sort_param$keywords_param";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $log_count, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
- 'PAGE_NUMBER' => on_page($log_count, $config['topics_per_page'], $start),
- 'TOTAL' => ($log_count == 1) ? $user->lang['TOTAL_LOG'] : sprintf($user->lang['TOTAL_LOGS'], $log_count),
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;$u_sort_param$keywords_param", $log_count, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $log_count, $config['topics_per_page'], $start),
+ 'TOTAL' => $user->lang('TOTAL_LOGS', (int) $log_count),
'L_TITLE' => $user->lang['MCP_LOGS'],
@@ -214,5 +215,3 @@ class mcp_logs
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_main.php b/phpBB/includes/mcp/mcp_main.php
index 0cef8933fc..4f27d32a5a 100644
--- a/phpBB/includes/mcp/mcp_main.php
+++ b/phpBB/includes/mcp/mcp_main.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,7 +33,7 @@ class mcp_main
function main($id, $mode)
{
global $auth, $db, $user, $template, $action;
- global $config, $phpbb_root_path, $phpEx;
+ global $config, $phpbb_root_path, $phpEx, $request;
$quickmod = ($mode == 'quickmod') ? true : false;
@@ -109,27 +108,48 @@ class mcp_main
case 'delete_topic':
$user->add_lang('viewtopic');
- $topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
+ // f parameter is not reliable for permission usage, however we just use it to decide
+ // which permission we will check later on. So if it is manipulated, we will still catch it later on.
+ $forum_id = $request->variable('f', 0);
+ $topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
+ $soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
if (!sizeof($topic_ids))
{
trigger_error('NO_TOPIC_SELECTED');
}
- mcp_delete_topic($topic_ids);
+ mcp_delete_topic($topic_ids, $soft_delete, ($soft_delete) ? $request->variable('delete_reason', '', true) : '');
break;
case 'delete_post':
$user->add_lang('posting');
- $post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0));
+ // f parameter is not reliable for permission usage, however we just use it to decide
+ // which permission we will check later on. So if it is manipulated, we will still catch it later on.
+ $forum_id = $request->variable('f', 0);
+ $post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));
+ $soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
if (!sizeof($post_ids))
{
trigger_error('NO_POST_SELECTED');
}
- mcp_delete_post($post_ids);
+ mcp_delete_post($post_ids, $soft_delete, ($soft_delete) ? $request->variable('delete_reason', '', true) : '');
+ break;
+
+ case 'restore_topic':
+ $user->add_lang('posting');
+
+ $topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
+
+ if (!sizeof($topic_ids))
+ {
+ trigger_error('NO_TOPIC_SELECTED');
+ }
+
+ mcp_restore_topic($topic_ids);
break;
}
@@ -332,131 +352,22 @@ function change_topic_type($action, $topic_ids)
if (confirm_box(true))
{
- if ($new_topic_type != POST_GLOBAL)
+ $sql = 'UPDATE ' . TOPICS_TABLE . "
+ SET topic_type = $new_topic_type
+ WHERE " . $db->sql_in_set('topic_id', $topic_ids);
+ $db->sql_query($sql);
+
+ if (($new_topic_type == POST_GLOBAL) && sizeof($topic_ids))
{
+ // Delete topic shadows for global announcements
+ $sql = 'DELETE FROM ' . TOPICS_TABLE . '
+ WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
+ $db->sql_query($sql);
+
$sql = 'UPDATE ' . TOPICS_TABLE . "
SET topic_type = $new_topic_type
- WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
- AND forum_id <> 0';
+ WHERE " . $db->sql_in_set('topic_id', $topic_ids);
$db->sql_query($sql);
-
- // Reset forum id if a global topic is within the array
- $to_forum_id = request_var('to_forum_id', 0);
-
- if ($to_forum_id)
- {
- $sql = 'UPDATE ' . TOPICS_TABLE . "
- SET topic_type = $new_topic_type, forum_id = $to_forum_id
- WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
- AND forum_id = 0';
- $db->sql_query($sql);
-
- // Update forum_ids for all posts
- $sql = 'UPDATE ' . POSTS_TABLE . "
- SET forum_id = $to_forum_id
- WHERE " . $db->sql_in_set('topic_id', $topic_ids) . '
- AND forum_id = 0';
- $db->sql_query($sql);
-
- // Do a little forum sync stuff
- $sql = 'SELECT SUM(t.topic_replies + t.topic_approved) as topic_posts, COUNT(t.topic_approved) as topics_authed
- FROM ' . TOPICS_TABLE . ' t
- WHERE ' . $db->sql_in_set('t.topic_id', $topic_ids);
- $result = $db->sql_query($sql);
- $row_data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- $sync_sql = array();
-
- if ($row_data['topic_posts'])
- {
- $sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . (int) $row_data['topic_posts'];
- }
-
- if ($row_data['topics_authed'])
- {
- $sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . (int) $row_data['topics_authed'];
- }
-
- $sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . (int) sizeof($topic_ids);
-
- foreach ($sync_sql as $forum_id_key => $array)
- {
- $sql = 'UPDATE ' . FORUMS_TABLE . '
- SET ' . implode(', ', $array) . '
- WHERE forum_id = ' . $forum_id_key;
- $db->sql_query($sql);
- }
-
- sync('forum', 'forum_id', $to_forum_id);
- }
- }
- else
- {
- // Get away with those topics already being a global announcement by re-calculating $topic_ids
- $sql = 'SELECT topic_id
- FROM ' . TOPICS_TABLE . '
- WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
- AND forum_id <> 0';
- $result = $db->sql_query($sql);
-
- $topic_ids = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $topic_ids[] = $row['topic_id'];
- }
- $db->sql_freeresult($result);
-
- if (sizeof($topic_ids))
- {
- // Delete topic shadows for global announcements
- $sql = 'DELETE FROM ' . TOPICS_TABLE . '
- WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
- $db->sql_query($sql);
-
- $sql = 'UPDATE ' . TOPICS_TABLE . "
- SET topic_type = $new_topic_type, forum_id = 0
- WHERE " . $db->sql_in_set('topic_id', $topic_ids);
- $db->sql_query($sql);
-
- // Update forum_ids for all posts
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET forum_id = 0
- WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
- $db->sql_query($sql);
-
- // Do a little forum sync stuff
- $sql = 'SELECT SUM(t.topic_replies + t.topic_approved) as topic_posts, COUNT(t.topic_approved) as topics_authed
- FROM ' . TOPICS_TABLE . ' t
- WHERE ' . $db->sql_in_set('t.topic_id', $topic_ids);
- $result = $db->sql_query($sql);
- $row_data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- $sync_sql = array();
-
- if ($row_data['topic_posts'])
- {
- $sync_sql[$forum_id][] = 'forum_posts = forum_posts - ' . (int) $row_data['topic_posts'];
- }
-
- if ($row_data['topics_authed'])
- {
- $sync_sql[$forum_id][] = 'forum_topics = forum_topics - ' . (int) $row_data['topics_authed'];
- }
-
- $sync_sql[$forum_id][] = 'forum_topics_real = forum_topics_real - ' . (int) sizeof($topic_ids);
-
- foreach ($sync_sql as $forum_id_key => $array)
- {
- $sql = 'UPDATE ' . FORUMS_TABLE . '
- SET ' . implode(', ', $array) . '
- WHERE forum_id = ' . $forum_id_key;
- $db->sql_query($sql);
- }
-
- sync('forum', 'forum_id', $forum_id);
- }
}
$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_TYPE_CHANGED' : 'TOPICS_TYPE_CHANGED';
@@ -473,41 +384,7 @@ function change_topic_type($action, $topic_ids)
}
else
{
- // Global topic involved?
- $global_involved = false;
-
- if ($new_topic_type != POST_GLOBAL)
- {
- $sql = 'SELECT forum_id
- FROM ' . TOPICS_TABLE . '
- WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
- AND forum_id = 0';
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- if ($row)
- {
- $global_involved = true;
- }
- }
-
- if ($global_involved)
- {
- global $template;
-
- $template->assign_vars(array(
- 'S_FORUM_SELECT' => make_forum_select(request_var('f', $forum_id), false, false, true, true),
- 'S_CAN_LEAVE_SHADOW' => false,
- 'ADDITIONAL_MSG' => (sizeof($topic_ids) == 1) ? $user->lang['SELECT_FORUM_GLOBAL_ANNOUNCEMENT'] : $user->lang['SELECT_FORUM_GLOBAL_ANNOUNCEMENTS'])
- );
-
- confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields), 'mcp_move.html');
- }
- else
- {
- confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields));
- }
+ confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields));
}
$redirect = request_var('redirect', "index.$phpEx");
@@ -531,6 +408,7 @@ function mcp_move_topic($topic_ids)
{
global $auth, $user, $db, $template;
global $phpEx, $phpbb_root_path;
+ global $request;
// Here we limit the operation to one forum only
$forum_id = check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_move'), true);
@@ -584,8 +462,8 @@ function mcp_move_topic($topic_ids)
if (!$to_forum_id || $additional_msg)
{
- unset($_POST['confirm']);
- unset($_REQUEST['confirm_key']);
+ $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
+ $request->overwrite('confirm_key', null);
}
if (confirm_box(true))
@@ -598,66 +476,43 @@ function mcp_move_topic($topic_ids)
$forum_sync_data[$forum_id] = current($topic_data);
$forum_sync_data[$to_forum_id] = $forum_data;
- // Real topics added to target forum
- $topics_moved = sizeof($topic_data);
-
- // Approved topics added to target forum
- $topics_authed_moved = 0;
-
- // Posts (topic replies + topic post if approved) added to target forum
- $topic_posts_added = 0;
-
- // Posts (topic replies + topic post if approved and not global announcement) removed from source forum
- $topic_posts_removed = 0;
-
- // Real topics removed from source forum (all topics without global announcements)
- $topics_removed = 0;
-
- // Approved topics removed from source forum (except global announcements)
- $topics_authed_removed = 0;
+ $topics_moved = $topics_moved_unapproved = $topics_moved_softdeleted = 0;
+ $posts_moved = $posts_moved_unapproved = $posts_moved_softdeleted = 0;
foreach ($topic_data as $topic_id => $topic_info)
{
- if ($topic_info['topic_approved'])
+ if ($topic_info['topic_visibility'] == ITEM_APPROVED)
{
- $topics_authed_moved++;
- $topic_posts_added++;
+ $topics_moved++;
}
-
- $topic_posts_added += $topic_info['topic_replies'];
-
- if ($topic_info['topic_type'] != POST_GLOBAL)
+ elseif ($topic_info['topic_visibility'] == ITEM_UNAPPROVED)
{
- $topics_removed++;
- $topic_posts_removed += $topic_info['topic_replies'];
-
- if ($topic_info['topic_approved'])
- {
- $topics_authed_removed++;
- $topic_posts_removed++;
- }
+ $topics_moved_unapproved++;
}
+ elseif ($topic_info['topic_visibility'] == ITEM_DELETED)
+ {
+ $topics_moved_softdeleted++;
+ }
+
+ $posts_moved += $topic_info['topic_posts_approved'];
+ $posts_moved_unapproved += $topic_info['topic_posts_unapproved'];
+ $posts_moved_softdeleted += $topic_info['topic_posts_softdeleted'];
}
$db->sql_transaction('begin');
- $sync_sql = array();
-
- if ($topic_posts_added)
- {
- $sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . $topic_posts_added;
- }
+ // Move topics, but do not resync yet
+ move_topics($topic_ids, $to_forum_id, false);
- if ($topics_authed_moved)
+ if ($request->is_set_post('move_lock_topics') && $auth->acl_get('m_lock', $to_forum_id))
{
- $sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . (int) $topics_authed_moved;
+ $sql = 'UPDATE ' . TOPICS_TABLE . '
+ SET topic_status = ' . ITEM_LOCKED . '
+ WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
+ $db->sql_query($sql);
}
- $sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . (int) $topics_moved;
-
- // Move topics, but do not resync yet
- move_topics($topic_ids, $to_forum_id, false);
-
+ $shadow_topics = 0;
$forum_ids = array($to_forum_id);
foreach ($topic_data as $topic_id => $row)
{
@@ -665,31 +520,23 @@ function mcp_move_topic($topic_ids)
$forum_ids[] = $row['forum_id'];
add_log('mod', $to_forum_id, $topic_id, 'LOG_MOVE', $row['forum_name'], $forum_data['forum_name']);
- // If we have moved a global announcement, we need to correct the topic type
- if ($row['topic_type'] == POST_GLOBAL)
- {
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_type = ' . POST_ANNOUNCE . '
- WHERE topic_id = ' . (int) $row['topic_id'];
- $db->sql_query($sql);
- }
-
// Leave a redirection if required and only if the topic is visible to users
- if ($leave_shadow && $row['topic_approved'] && $row['topic_type'] != POST_GLOBAL)
+ if ($leave_shadow && $row['topic_visibility'] == ITEM_APPROVED && $row['topic_type'] != POST_GLOBAL)
{
$shadow = array(
'forum_id' => (int) $row['forum_id'],
'icon_id' => (int) $row['icon_id'],
'topic_attachment' => (int) $row['topic_attachment'],
- 'topic_approved' => 1, // a shadow topic is always approved
+ 'topic_visibility' => ITEM_APPROVED, // a shadow topic is always approved
'topic_reported' => 0, // a shadow topic is never reported
'topic_title' => (string) $row['topic_title'],
'topic_poster' => (int) $row['topic_poster'],
'topic_time' => (int) $row['topic_time'],
'topic_time_limit' => (int) $row['topic_time_limit'],
'topic_views' => (int) $row['topic_views'],
- 'topic_replies' => (int) $row['topic_replies'],
- 'topic_replies_real' => (int) $row['topic_replies_real'],
+ 'topic_posts_approved' => (int) $row['topic_posts_approved'],
+ 'topic_posts_unapproved'=> (int) $row['topic_posts_unapproved'],
+ 'topic_posts_softdeleted'=> (int) $row['topic_posts_softdeleted'],
'topic_status' => ITEM_MOVED,
'topic_type' => POST_NORMAL,
'topic_first_post_id' => (int) $row['topic_first_post_id'],
@@ -715,25 +562,45 @@ function mcp_move_topic($topic_ids)
$db->sql_query('INSERT INTO ' . TOPICS_TABLE . $db->sql_build_array('INSERT', $shadow));
// Shadow topics only count on new "topics" and not posts... a shadow topic alone has 0 posts
- $topics_removed--;
- $topics_authed_removed--;
+ $shadow_topics++;
}
}
unset($topic_data);
- if ($topic_posts_removed)
+ $sync_sql = array();
+ if ($posts_moved)
{
- $sync_sql[$forum_id][] = 'forum_posts = forum_posts - ' . $topic_posts_removed;
+ $sync_sql[$to_forum_id][] = 'forum_posts_approved = forum_posts_approved + ' . (int) $posts_moved;
+ $sync_sql[$forum_id][] = 'forum_posts_approved = forum_posts_approved - ' . (int) $posts_moved;
}
-
- if ($topics_removed)
+ if ($posts_moved_unapproved)
+ {
+ $sync_sql[$to_forum_id][] = 'forum_posts_unapproved = forum_posts_unapproved + ' . (int) $posts_moved_unapproved;
+ $sync_sql[$forum_id][] = 'forum_posts_unapproved = forum_posts_unapproved - ' . (int) $posts_moved_unapproved;
+ }
+ if ($posts_moved_softdeleted)
{
- $sync_sql[$forum_id][] = 'forum_topics_real = forum_topics_real - ' . (int) $topics_removed;
+ $sync_sql[$to_forum_id][] = 'forum_posts_softdeleted = forum_posts_softdeleted + ' . (int) $posts_moved_softdeleted;
+ $sync_sql[$forum_id][] = 'forum_posts_softdeleted = forum_posts_softdeleted - ' . (int) $posts_moved_softdeleted;
}
- if ($topics_authed_removed)
+ if ($topics_moved)
+ {
+ $sync_sql[$to_forum_id][] = 'forum_topics_approved = forum_topics_approved + ' . (int) $topics_moved;
+ if ($topics_moved - $shadow_topics > 0)
+ {
+ $sync_sql[$forum_id][] = 'forum_topics_approved = forum_topics_approved - ' . (int) ($topics_moved - $shadow_topics);
+ }
+ }
+ if ($topics_moved_unapproved)
+ {
+ $sync_sql[$to_forum_id][] = 'forum_topics_unapproved = forum_topics_unapproved + ' . (int) $topics_moved_unapproved;
+ $sync_sql[$forum_id][] = 'forum_topics_unapproved = forum_topics_unapproved - ' . (int) $topics_moved_unapproved;
+ }
+ if ($topics_moved_softdeleted)
{
- $sync_sql[$forum_id][] = 'forum_topics = forum_topics - ' . (int) $topics_authed_removed;
+ $sync_sql[$to_forum_id][] = 'forum_topics_softdeleted = forum_topics_softdeleted + ' . (int) $topics_moved_softdeleted;
+ $sync_sql[$forum_id][] = 'forum_topics_softdeleted = forum_topics_softdeleted - ' . (int) $topics_moved_softdeleted;
}
$success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_MOVED_SUCCESS' : 'TOPICS_MOVED_SUCCESS';
@@ -755,6 +622,7 @@ function mcp_move_topic($topic_ids)
$template->assign_vars(array(
'S_FORUM_SELECT' => make_forum_select($to_forum_id, $forum_id, false, true, true, true),
'S_CAN_LEAVE_SHADOW' => true,
+ 'S_CAN_LOCK_TOPIC' => ($auth->acl_get('m_lock', $to_forum_id)) ? true : false,
'ADDITIONAL_MSG' => $additional_msg)
);
@@ -782,25 +650,98 @@ function mcp_move_topic($topic_ids)
}
/**
+* Restore Topics
+*/
+function mcp_restore_topic($topic_ids)
+{
+ global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
+
+ if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))
+ {
+ return;
+ }
+
+ $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
+ $forum_id = $request->variable('f', 0);
+
+ $s_hidden_fields = build_hidden_fields(array(
+ 'topic_id_list' => $topic_ids,
+ 'f' => $forum_id,
+ 'action' => 'restore_topic',
+ 'redirect' => $redirect,
+ ));
+ $success_msg = '';
+
+ if (confirm_box(true))
+ {
+ $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_RESTORED_SUCCESS' : 'TOPICS_RESTORED_SUCCESS';
+
+ $data = get_topic_data($topic_ids);
+
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ foreach ($data as $topic_id => $row)
+ {
+ $return = $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), '');
+ if (!empty($return))
+ {
+ add_log('mod', $row['forum_id'], $topic_id, 'LOG_RESTORE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
+ }
+ }
+ }
+ else
+ {
+ confirm_box(false, (sizeof($topic_ids) == 1) ? 'RESTORE_TOPIC' : 'RESTORE_TOPICS', $s_hidden_fields);
+ }
+
+ $topic_id = $request->variable('t', 0);
+ if (!$request->is_set('quickmod', \phpbb\request\request_interface::REQUEST))
+ {
+ $redirect = $request->variable('redirect', "index.$phpEx");
+ $redirect = reapply_sid($redirect);
+ $redirect_message = 'PAGE';
+ }
+ else if ($topic_id)
+ {
+ $redirect = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id);
+ $redirect_message = 'TOPIC';
+ }
+ else
+ {
+ $redirect = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
+ $redirect_message = 'FORUM';
+ }
+
+ if (!$success_msg)
+ {
+ redirect($redirect);
+ }
+ else
+ {
+ meta_refresh(3, $redirect);
+ trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_' . $redirect_message], '<a href="' . $redirect . '">', '</a>'));
+ }
+}
+
+/**
* Delete Topics
*/
-function mcp_delete_topic($topic_ids)
+function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_topic')
{
- global $auth, $user, $db, $phpEx, $phpbb_root_path;
+ global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
if (!check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_delete')))
{
return;
}
- $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
- $forum_id = request_var('f', 0);
+ $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
+ $forum_id = $request->variable('f', 0);
- $s_hidden_fields = build_hidden_fields(array(
+ $s_hidden_fields = array(
'topic_id_list' => $topic_ids,
'f' => $forum_id,
- 'action' => 'delete_topic',
- 'redirect' => $redirect)
+ 'action' => $action,
+ 'redirect' => $redirect,
);
$success_msg = '';
@@ -818,23 +759,81 @@ function mcp_delete_topic($topic_ids)
}
else
{
- add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
+ // Only soft delete non-shadow topics
+ if ($is_soft)
+ {
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ $return = $phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), $soft_delete_reason);
+ if (!empty($return))
+ {
+ add_log('mod', $row['forum_id'], $topic_id, 'LOG_SOFTDELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
+ }
+ }
+ else
+ {
+ add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
+ }
}
}
- $return = delete_topics('topic_id', $topic_ids);
+ if (!$is_soft)
+ {
+ $return = delete_topics('topic_id', $topic_ids);
+ }
}
else
{
- confirm_box(false, (sizeof($topic_ids) == 1) ? 'DELETE_TOPIC' : 'DELETE_TOPICS', $s_hidden_fields);
+ global $template;
+
+ $user->add_lang('posting');
+
+ $only_softdeleted = false;
+ if ($auth->acl_get('m_delete', $forum_id) && $auth->acl_get('m_softdelete', $forum_id))
+ {
+ // If there are only soft deleted topics, we display a message why the option is not available
+ $sql = 'SELECT topic_id
+ FROM ' . TOPICS_TABLE . '
+ WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
+ AND topic_visibility <> ' . ITEM_DELETED;
+ $result = $db->sql_query_limit($sql, 1);
+ $only_softdeleted = !$db->sql_fetchfield('topic_id');
+ $db->sql_freeresult($result);
+ }
+
+ $template->assign_vars(array(
+ 'S_SOFTDELETED' => $only_softdeleted,
+ 'S_TOPIC_MODE' => true,
+ 'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
+ 'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
+ 'S_DELETE_REASON' => $auth->acl_get('m_softdelete', $forum_id),
+ ));
+
+ $l_confirm = (sizeof($topic_ids) == 1) ? 'DELETE_TOPIC' : 'DELETE_TOPICS';
+ if ($only_softdeleted)
+ {
+ $l_confirm .= '_PERMANENTLY';
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+ else if (!$auth->acl_get('m_softdelete', $forum_id))
+ {
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+
+ confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
}
- if (!isset($_REQUEST['quickmod']))
+ $topic_id = $request->variable('t', 0);
+ if (!$request->is_set('quickmod', \phpbb\request\request_interface::REQUEST))
{
- $redirect = request_var('redirect', "index.$phpEx");
+ $redirect = $request->variable('redirect', "index.$phpEx");
$redirect = reapply_sid($redirect);
$redirect_message = 'PAGE';
}
+ else if ($is_soft && $topic_id)
+ {
+ $redirect = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id);
+ $redirect_message = 'TOPIC';
+ }
else
{
$redirect = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
@@ -855,27 +854,93 @@ function mcp_delete_topic($topic_ids)
/**
* Delete Posts
*/
-function mcp_delete_post($post_ids)
+function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_post')
{
- global $auth, $user, $db, $phpEx, $phpbb_root_path;
+ global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
- if (!check_ids($post_ids, POSTS_TABLE, 'post_id', array('m_delete')))
+ if (!check_ids($post_ids, POSTS_TABLE, 'post_id', array('m_softdelete')))
{
return;
}
- $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
- $forum_id = request_var('f', 0);
+ $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
+ $forum_id = $request->variable('f', 0);
- $s_hidden_fields = build_hidden_fields(array(
+ $s_hidden_fields = array(
'post_id_list' => $post_ids,
'f' => $forum_id,
- 'action' => 'delete_post',
- 'redirect' => $redirect)
+ 'action' => $action,
+ 'redirect' => $redirect,
);
$success_msg = '';
- if (confirm_box(true))
+ if (confirm_box(true) && $is_soft)
+ {
+ $post_info = get_post_data($post_ids);
+
+ $topic_info = $approve_log = array();
+
+ // Group the posts by topic_id
+ foreach ($post_info as $post_id => $post_data)
+ {
+ if ($post_data['post_visibility'] != ITEM_APPROVED)
+ {
+ continue;
+ }
+ $topic_id = (int) $post_data['topic_id'];
+
+ $topic_info[$topic_id]['posts'][] = (int) $post_id;
+ $topic_info[$topic_id]['forum_id'] = (int) $post_data['forum_id'];
+
+ if ($post_id == $post_data['topic_first_post_id'])
+ {
+ $topic_info[$topic_id]['first_post'] = true;
+ }
+
+ if ($post_id == $post_data['topic_last_post_id'])
+ {
+ $topic_info[$topic_id]['last_post'] = true;
+ }
+
+ $approve_log[] = array(
+ 'forum_id' => $post_data['forum_id'],
+ 'topic_id' => $post_data['topic_id'],
+ 'post_subject' => $post_data['post_subject'],
+ 'poster_id' => $post_data['poster_id'],
+ 'post_username' => $post_data['post_username'],
+ 'username' => $post_data['username'],
+ );
+ }
+
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ foreach ($topic_info as $topic_id => $topic_data)
+ {
+ $phpbb_content_visibility->set_post_visibility(ITEM_DELETED, $topic_data['posts'], $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), $soft_delete_reason, isset($topic_data['first_post']), isset($topic_data['last_post']));
+ }
+ $affected_topics = sizeof($topic_info);
+ // None of the topics is really deleted, so a redirect won't hurt much.
+ $deleted_topics = 0;
+
+ $success_msg = (sizeof($post_info) == 1) ? 'POST_DELETED_SUCCESS' : 'POSTS_DELETED_SUCCESS';
+
+ foreach ($approve_log as $row)
+ {
+ $post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
+ add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_SOFTDELETE_POST', $row['post_subject'], $post_username);
+ }
+
+ $topic_id = $request->variable('t', 0);
+
+ // Return links
+ $return_link = array();
+ if ($affected_topics == 1 && $topic_id)
+ {
+ $return_link[] = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id") . '">', '</a>');
+ }
+ $return_link[] = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
+
+ }
+ else if (confirm_box(true))
{
if (!function_exists('delete_posts'))
{
@@ -918,7 +983,7 @@ function mcp_delete_post($post_ids)
$deleted_topics = ($row = $db->sql_fetchrow($result)) ? ($affected_topics - $row['topics_left']) : $affected_topics;
$db->sql_freeresult($result);
- $topic_id = request_var('t', 0);
+ $topic_id = $request->variable('t', 0);
// Return links
$return_link = array();
@@ -956,10 +1021,45 @@ function mcp_delete_post($post_ids)
}
else
{
- confirm_box(false, (sizeof($post_ids) == 1) ? 'DELETE_POST' : 'DELETE_POSTS', $s_hidden_fields);
+ global $template;
+
+ $user->add_lang('posting');
+
+ $only_softdeleted = false;
+ if ($auth->acl_get('m_delete', $forum_id) && $auth->acl_get('m_softdelete', $forum_id))
+ {
+ // If there are only soft deleted posts, we display a message why the option is not available
+ $sql = 'SELECT post_id
+ FROM ' . POSTS_TABLE . '
+ WHERE ' . $db->sql_in_set('post_id', $post_ids) . '
+ AND post_visibility <> ' . ITEM_DELETED;
+ $result = $db->sql_query_limit($sql, 1);
+ $only_softdeleted = !$db->sql_fetchfield('post_id');
+ $db->sql_freeresult($result);
+ }
+
+ $template->assign_vars(array(
+ 'S_SOFTDELETED' => $only_softdeleted,
+ 'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
+ 'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
+ 'S_DELETE_REASON' => $auth->acl_get('m_softdelete', $forum_id),
+ ));
+
+ $l_confirm = (sizeof($post_ids) == 1) ? 'DELETE_POST' : 'DELETE_POSTS';
+ if ($only_softdeleted)
+ {
+ $l_confirm .= '_PERMANENTLY';
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+ else if (!$auth->acl_get('m_softdelete', $forum_id))
+ {
+ $s_hidden_fields['delete_permanent'] = '1';
+ }
+
+ confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
}
- $redirect = request_var('redirect', "index.$phpEx");
+ $redirect = $request->variable('redirect', "index.$phpEx");
$redirect = reapply_sid($redirect);
if (!$success_msg)
@@ -1036,37 +1136,32 @@ function mcp_fork_topic($topic_ids)
if ($additional_msg)
{
- unset($_POST['confirm']);
- unset($_REQUEST['confirm_key']);
+ $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
+ $request->overwrite('confirm_key', null);
}
if (confirm_box(true))
{
$topic_data = get_topic_data($topic_ids, 'f_post');
- $total_posts = 0;
+ $total_topics = $total_topics_unapproved = $total_topics_softdeleted = 0;
+ $total_posts = $total_posts_unapproved = $total_posts_softdeleted = 0;
$new_topic_id_list = array();
-
foreach ($topic_data as $topic_id => $topic_row)
{
if (!isset($search_type) && $topic_row['enable_indexing'])
{
// Select the search method and do some additional checks to ensure it can actually be utilised
- $search_type = basename($config['search_type']);
-
- if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
- {
- trigger_error('NO_SUCH_SEARCH_MODULE');
- }
+ $search_type = $config['search_type'];
if (!class_exists($search_type))
{
- include("{$phpbb_root_path}includes/search/$search_type.$phpEx");
+ trigger_error('NO_SUCH_SEARCH_MODULE');
}
$error = false;
- $search = new $search_type($error);
+ $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user);
$search_mode = 'post';
if ($error)
@@ -1083,13 +1178,14 @@ function mcp_fork_topic($topic_ids)
'forum_id' => (int) $to_forum_id,
'icon_id' => (int) $topic_row['icon_id'],
'topic_attachment' => (int) $topic_row['topic_attachment'],
- 'topic_approved' => 1,
+ 'topic_visibility' => (int) $topic_row['topic_visibility'],
'topic_reported' => 0,
'topic_title' => (string) $topic_row['topic_title'],
'topic_poster' => (int) $topic_row['topic_poster'],
'topic_time' => (int) $topic_row['topic_time'],
- 'topic_replies' => (int) $topic_row['topic_replies_real'],
- 'topic_replies_real' => (int) $topic_row['topic_replies_real'],
+ 'topic_posts_approved' => (int) $topic_row['topic_posts_approved'],
+ 'topic_posts_unapproved' => (int) $topic_row['topic_posts_unapproved'],
+ 'topic_posts_softdeleted' => (int) $topic_row['topic_posts_softdeleted'],
'topic_status' => (int) $topic_row['topic_status'],
'topic_type' => (int) $topic_row['topic_type'],
'topic_first_poster_name' => (string) $topic_row['topic_first_poster_name'],
@@ -1110,6 +1206,19 @@ function mcp_fork_topic($topic_ids)
$new_topic_id = $db->sql_nextid();
$new_topic_id_list[$topic_id] = $new_topic_id;
+ switch ($topic_row['topic_visibility'])
+ {
+ case ITEM_APPROVED:
+ $total_topics++;
+ break;
+ case ITEM_UNAPPROVED:
+ $total_topics_unapproved++;
+ break;
+ case ITEM_DELETED:
+ $total_topics_softdeleted++;
+ break;
+ }
+
if ($topic_row['poll_start'])
{
$poll_rows = array();
@@ -1150,7 +1259,6 @@ function mcp_fork_topic($topic_ids)
continue;
}
- $total_posts += sizeof($post_rows);
foreach ($post_rows as $row)
{
$sql_ary = array(
@@ -1160,7 +1268,7 @@ function mcp_fork_topic($topic_ids)
'icon_id' => (int) $row['icon_id'],
'poster_ip' => (string) $row['poster_ip'],
'post_time' => (int) $row['post_time'],
- 'post_approved' => 1,
+ 'post_visibility' => (int) $row['post_visibility'],
'post_reported' => 0,
'enable_bbcode' => (int) $row['enable_bbcode'],
'enable_smilies' => (int) $row['enable_smilies'],
@@ -1184,6 +1292,19 @@ function mcp_fork_topic($topic_ids)
$db->sql_query('INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
$new_post_id = $db->sql_nextid();
+ switch ($row['post_visibility'])
+ {
+ case ITEM_APPROVED:
+ $total_posts++;
+ break;
+ case ITEM_UNAPPROVED:
+ $total_posts_unapproved++;
+ break;
+ case ITEM_DELETED:
+ $total_posts_softdeleted++;
+ break;
+ }
+
// Copy whether the topic is dotted
markread('post', $to_forum_id, $new_topic_id, 0, $row['poster_id']);
@@ -1276,23 +1397,19 @@ function mcp_fork_topic($topic_ids)
}
// Sync new topics, parent forums and board stats
- sync('topic', 'topic_id', $new_topic_id_list);
-
- $sync_sql = array();
-
- $sync_sql[$to_forum_id][] = 'forum_posts = forum_posts + ' . $total_posts;
- $sync_sql[$to_forum_id][] = 'forum_topics = forum_topics + ' . sizeof($new_topic_id_list);
- $sync_sql[$to_forum_id][] = 'forum_topics_real = forum_topics_real + ' . sizeof($new_topic_id_list);
-
- foreach ($sync_sql as $forum_id_key => $array)
- {
- $sql = 'UPDATE ' . FORUMS_TABLE . '
- SET ' . implode(', ', $array) . '
- WHERE forum_id = ' . $forum_id_key;
- $db->sql_query($sql);
- }
+ $sql = 'UPDATE ' . FORUMS_TABLE . '
+ SET forum_posts_approved = forum_posts_approved + ' . $total_posts . ',
+ forum_posts_unapproved = forum_posts_unapproved + ' . $total_posts_unapproved . ',
+ forum_posts_softdeleted = forum_posts_softdeleted + ' . $total_posts_softdeleted . ',
+ forum_topics_approved = forum_topics_approved + ' . $total_topics . ',
+ forum_topics_unapproved = forum_topics_unapproved + ' . $total_topics_unapproved . ',
+ forum_topics_softdeleted = forum_topics_softdeleted + ' . $total_topics_softdeleted . '
+ WHERE forum_id = ' . $to_forum_id;
+ $db->sql_query($sql);
+ sync('topic', 'topic_id', $new_topic_id_list);
sync('forum', 'forum_id', $to_forum_id);
+
set_config_count('num_topics', sizeof($new_topic_id_list), true);
set_config_count('num_posts', $total_posts, true);
@@ -1335,5 +1452,3 @@ function mcp_fork_topic($topic_ids)
trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_notes.php b/phpBB/includes/mcp/mcp_notes.php
index 02a89c0251..12fcbfe91e 100644
--- a/phpBB/includes/mcp/mcp_notes.php
+++ b/phpBB/includes/mcp/mcp_notes.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -174,13 +173,13 @@ class mcp_notes
}
// Generate the appropriate user information for the user we are looking at
- if (!function_exists('get_user_avatar'))
+ if (!function_exists('phpbb_get_user_avatar'))
{
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
}
$rank_title = $rank_img = '';
- $avatar_img = get_user_avatar($userrow['user_avatar'], $userrow['user_avatar_type'], $userrow['user_avatar_width'], $userrow['user_avatar_height']);
+ $avatar_img = phpbb_get_user_avatar($userrow);
$limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
$sort_by_text = array('a' => $user->lang['SORT_USERNAME'], 'b' => $user->lang['SORT_DATE'], 'c' => $user->lang['SORT_IP'], 'd' => $user->lang['SORT_ACTION']);
@@ -216,6 +215,9 @@ class mcp_notes
}
}
+ $base_url = $this->u_action . "&amp;$u_sort_param$keywords_param";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $log_count, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
'U_POST_ACTION' => $this->u_action,
'S_CLEAR_ALLOWED' => ($auth->acl_get('a_clearlogs')) ? true : false,
@@ -226,9 +228,8 @@ class mcp_notes
'L_TITLE' => $user->lang['MCP_NOTES_USER'],
- 'PAGE_NUMBER' => on_page($log_count, $config['topics_per_page'], $start),
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;$u_sort_param$keywords_param", $log_count, $config['topics_per_page'], $start),
- 'TOTAL_REPORTS' => ($log_count == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $log_count),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $log_count, $config['topics_per_page'], $start),
+ 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $log_count),
'RANK_TITLE' => $rank_title,
'JOINED' => $user->format_date($userrow['user_regdate']),
@@ -247,5 +248,3 @@ class mcp_notes
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_pm_reports.php b/phpBB/includes/mcp/mcp_pm_reports.php
index 0a33c80a90..f0452b37a5 100644
--- a/phpBB/includes/mcp/mcp_pm_reports.php
+++ b/phpBB/includes/mcp/mcp_pm_reports.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,7 +33,7 @@ class mcp_pm_reports
function main($id, $mode)
{
global $auth, $db, $user, $template, $cache;
- global $config, $phpbb_root_path, $phpEx, $action;
+ global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
include_once($phpbb_root_path . 'includes/functions_privmsgs.' . $phpEx);
@@ -90,6 +89,10 @@ class mcp_pm_reports
trigger_error('NO_REPORT');
}
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->mark_notifications_read_by_parent('report_pm', $report_id, $user->data['user_id']);
+
$pm_id = $report['pm_id'];
$report_id = $report['report_id'];
@@ -112,17 +115,9 @@ class mcp_pm_reports
}
// Process message, leave it uncensored
- $message = $pm_info['message_text'];
+ $parse_flags = ($pm_info['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $message = generate_text_for_display($pm_info['message_text'], $pm_info['bbcode_uid'], $pm_info['bbcode_bitfield'], $parse_flags, false);
- if ($pm_info['bbcode_bitfield'])
- {
- include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
- $bbcode = new bbcode($pm_info['bbcode_bitfield']);
- $bbcode->bbcode_second_pass($message, $pm_info['bbcode_uid'], $pm_info['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
$report['report_text'] = make_clickable(bbcode_nl2br($report['report_text']));
if ($pm_info['message_attachment'] && $auth->acl_get('u_pm_download'))
@@ -294,12 +289,16 @@ class mcp_pm_reports
'REPORT_ID' => $row['report_id'],
'REPORT_TIME' => $user->format_date($row['report_time']),
- 'RECIPIENTS' => implode(', ', $address_list[$row['msg_id']]),
+ 'RECIPIENTS' => implode($user->lang['COMMA_SEPARATOR'], $address_list[$row['msg_id']]),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $row['message_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
));
}
}
}
+ $base_url = $this->u_action . "&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
+
// Now display the page
$template->assign_vars(array(
'L_EXPLAIN' => ($mode == 'pm_reports') ? $user->lang['MCP_PM_REPORTS_OPEN_EXPLAIN'] : $user->lang['MCP_PM_REPORTS_CLOSED_EXPLAIN'],
@@ -309,10 +308,9 @@ class mcp_pm_reports
'S_MCP_ACTION' => $this->u_action,
'S_CLOSED' => ($mode == 'pm_reports_closed') ? true : false,
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir", $total, $config['topics_per_page'], $start),
- 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $total, $config['topics_per_page'], $start),
'TOTAL' => $total,
- 'TOTAL_REPORTS' => ($total == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $total),
+ 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $total),
)
);
@@ -321,5 +319,3 @@ class mcp_pm_reports
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_post.php b/phpBB/includes/mcp/mcp_post.php
index ba45037a18..06f27655ae 100644
--- a/phpBB/includes/mcp/mcp_post.php
+++ b/phpBB/includes/mcp/mcp_post.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -126,17 +125,8 @@ function mcp_post_details($id, $mode, $action)
$post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
// Process message, leave it uncensored
- $message = $post_info['post_text'];
-
- if ($post_info['bbcode_bitfield'])
- {
- include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
- $bbcode = new bbcode($post_info['bbcode_bitfield']);
- $bbcode->bbcode_second_pass($message, $post_info['bbcode_uid'], $post_info['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
+ $parse_flags = ($post_info['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $message = generate_text_for_display($post_info['post_text'], $post_info['bbcode_uid'], $post_info['bbcode_bitfield'], $parse_flags, false);
if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
{
@@ -175,6 +165,33 @@ function mcp_post_details($id, $mode, $action)
}
}
+ // Deleting information
+ if ($post_info['post_visibility'] == ITEM_DELETED && $post_info['post_delete_user'])
+ {
+ // User having deleted the post also being the post author?
+ if (!$post_info['post_delete_user'] || $post_info['post_delete_user'] == $post_info['poster_id'])
+ {
+ $display_username = get_username_string('full', $post_info['poster_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']);
+ }
+ else
+ {
+ $sql = 'SELECT user_id, username, user_colour
+ FROM ' . USERS_TABLE . '
+ WHERE user_id = ' . (int) $post_info['post_delete_user'];
+ $result = $db->sql_query($sql);
+ $user_delete_row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+ $display_username = get_username_string('full', $post_info['post_delete_user'], $user_delete_row['username'], $user_delete_row['user_colour']);
+ }
+
+ $user->add_lang('viewtopic');
+ $l_deleted_by = $user->lang('DELETED_INFORMATION', $display_username, $user->format_date($post_info['post_delete_time'], false, true));
+ }
+ else
+ {
+ $l_deleted_by = '';
+ }
+
$template->assign_vars(array(
'U_MCP_ACTION' => "$url&amp;i=main&amp;quickmod=1&amp;mode=post_details", // Use this for mode paramaters
'U_POST_ACTION' => "$url&amp;i=$id&amp;mode=post_details", // Use this for action parameters
@@ -186,10 +203,13 @@ function mcp_post_details($id, $mode, $action)
'S_CAN_DELETE_POST' => $auth->acl_get('m_delete', $post_info['forum_id']),
'S_POST_REPORTED' => ($post_info['post_reported']) ? true : false,
- 'S_POST_UNAPPROVED' => (!$post_info['post_approved']) ? true : false,
+ 'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED) ? true : false,
+ 'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED) ? true : false,
'S_POST_LOCKED' => ($post_info['post_edit_locked']) ? true : false,
'S_USER_NOTES' => true,
'S_CLEAR_ALLOWED' => ($auth->acl_get('a_clearlogs')) ? true : false,
+ 'DELETED_MESSAGE' => $l_deleted_by,
+ 'DELETE_REASON' => $post_info['post_delete_reason'],
'U_EDIT' => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f={$post_info['forum_id']}&amp;p={$post_info['post_id']}") : '',
'U_FIND_USERNAME' => append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=searchuser&amp;form=mcp_chgposter&amp;field=username&amp;select_single=true'),
@@ -206,6 +226,7 @@ function mcp_post_details($id, $mode, $action)
'RETURN_FORUM' => sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f={$post_info['forum_id']}&amp;start={$start}") . '">', '</a>'),
'REPORTED_IMG' => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
+ 'DELETED_IMG' => $user->img('icon_topic_deleted', $user->lang['POST_DELETED']),
'EDIT_IMG' => $user->img('icon_post_edit', $user->lang['EDIT_POST']),
'SEARCH_IMG' => $user->img('icon_user_search', $user->lang['SEARCH']),
@@ -394,7 +415,7 @@ function mcp_post_details($id, $mode, $action)
*/
function change_poster(&$post_info, $userdata)
{
- global $auth, $db, $config, $phpbb_root_path, $phpEx;
+ global $auth, $db, $config, $phpbb_root_path, $phpEx, $user;
if (empty($userdata) || $userdata['user_id'] == $post_info['user_id'])
{
@@ -416,7 +437,7 @@ function change_poster(&$post_info, $userdata)
}
// Adjust post counts... only if the post is approved (else, it was not added the users post count anyway)
- if ($post_info['post_postcount'] && $post_info['post_approved'])
+ if ($post_info['post_postcount'] && $post_info['post_visibility'] == ITEM_APPROVED)
{
$sql = 'UPDATE ' . USERS_TABLE . '
SET user_posts = user_posts - 1
@@ -465,15 +486,13 @@ function change_poster(&$post_info, $userdata)
}
// refresh search cache of this post
- $search_type = basename($config['search_type']);
+ $search_type = $config['search_type'];
- if (file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
+ if (class_exists($search_type))
{
- require("{$phpbb_root_path}includes/search/$search_type.$phpEx");
-
// We do some additional checks in the module to ensure it can actually be utilised
$error = false;
- $search = new $search_type($error);
+ $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user);
if (!$error && method_exists($search, 'destroy_cache'))
{
@@ -497,5 +516,3 @@ function change_poster(&$post_info, $userdata)
// Now add log entry
add_log('mod', $post_info['forum_id'], $post_info['topic_id'], 'LOG_MCP_CHANGE_POSTER', $post_info['topic_title'], $from_username, $to_username);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php
index 764461fa53..db461d07fa 100644
--- a/phpBB/includes/mcp/mcp_queue.php
+++ b/phpBB/includes/mcp/mcp_queue.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -26,15 +25,15 @@ class mcp_queue
var $p_master;
var $u_action;
- function mcp_queue(&$p_master)
+ public function mcp_queue(&$p_master)
{
$this->p_master = &$p_master;
}
- function main($id, $mode)
+ public function main($id, $mode)
{
- global $auth, $db, $user, $template, $cache;
- global $config, $phpbb_root_path, $phpEx, $action;
+ global $auth, $db, $user, $template, $cache, $request;
+ global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
@@ -46,25 +45,99 @@ class mcp_queue
switch ($action)
{
case 'approve':
- case 'disapprove':
+ case 'restore':
include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $post_id_list = request_var('post_id_list', array(0));
+ $post_id_list = $request->variable('post_id_list', array(0));
+ $topic_id_list = $request->variable('topic_id_list', array(0));
- if (!sizeof($post_id_list))
+ if (!empty($post_id_list))
+ {
+ self::approve_posts($action, $post_id_list, 'queue', $mode);
+ }
+ else if (!empty($topic_id_list))
+ {
+ self::approve_topics($action, $topic_id_list, 'queue', $mode);
+ }
+ else
{
trigger_error('NO_POST_SELECTED');
}
+ break;
+
+ case 'delete':
+ $post_id_list = $request->variable('post_id_list', array(0));
+ $topic_id_list = $request->variable('topic_id_list', array(0));
- if ($action == 'approve')
+ if (!empty($post_id_list))
+ {
+ if (!function_exists('mcp_delete_post'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
+ }
+ mcp_delete_post($post_id_list, false, '', $action);
+ }
+ else if (!empty($topic_id_list))
{
- approve_post($post_id_list, 'queue', $mode);
+ if (!function_exists('mcp_delete_topic'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
+ }
+ mcp_delete_topic($topic_id_list, false, '', $action);
}
else
{
- disapprove_post($post_id_list, 'queue', $mode);
+ trigger_error('NO_POST_SELECTED');
}
+ break;
+ case 'disapprove':
+ $post_id_list = $request->variable('post_id_list', array(0));
+ $topic_id_list = $request->variable('topic_id_list', array(0));
+
+ if (!empty($topic_id_list) && $mode == 'deleted_topics')
+ {
+ if (!function_exists('mcp_delete_topics'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
+ }
+ mcp_delete_topic($topic_id_list, false, '', 'disapprove');
+ return;
+ }
+
+ if (!class_exists('messenger'))
+ {
+ include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
+ }
+
+ if (!empty($topic_id_list))
+ {
+ $post_visibility = ($mode == 'deleted_topics') ? ITEM_DELETED : ITEM_UNAPPROVED;
+ $sql = 'SELECT post_id
+ FROM ' . POSTS_TABLE . '
+ WHERE post_visibility = ' . $post_visibility . '
+ AND ' . $db->sql_in_set('topic_id', $topic_id_list);
+ $result = $db->sql_query($sql);
+
+ $post_id_list = array();
+ while ($row = $db->sql_fetchrow($result))
+ {
+ $post_id_list[] = (int) $row['post_id'];
+ }
+ $db->sql_freeresult($result);
+ }
+
+ if (!empty($post_id_list))
+ {
+ self::disapprove_posts($post_id_list, 'queue', $mode);
+ }
+ else
+ {
+ trigger_error('NO_POST_SELECTED');
+ }
break;
}
@@ -79,12 +152,16 @@ class mcp_queue
$post_id = request_var('p', 0);
$topic_id = request_var('t', 0);
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
if ($topic_id)
{
$topic_info = get_topic_data(array($topic_id), 'm_approve');
if (isset($topic_info[$topic_id]['topic_first_post_id']))
{
$post_id = (int) $topic_info[$topic_id]['topic_first_post_id'];
+
+ $phpbb_notifications->mark_notifications_read('topic_in_queue', $topic_id, $user->data['user_id']);
}
else
{
@@ -92,6 +169,8 @@ class mcp_queue
}
}
+ $phpbb_notifications->mark_notifications_read('post_in_queue', $post_id, $user->data['user_id']);
+
$post_info = get_post_data(array($post_id), 'm_approve', true);
if (!sizeof($post_info))
@@ -106,8 +185,8 @@ class mcp_queue
$template->assign_vars(array(
'S_TOPIC_REVIEW' => true,
'S_BBCODE_ALLOWED' => $post_info['enable_bbcode'],
- 'TOPIC_TITLE' => $post_info['topic_title'])
- );
+ 'TOPIC_TITLE' => $post_info['topic_title'],
+ ));
}
$extensions = $attachments = $topic_tracking_info = array();
@@ -127,17 +206,8 @@ class mcp_queue
$post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
// Process message, leave it uncensored
- $message = $post_info['post_text'];
-
- if ($post_info['bbcode_bitfield'])
- {
- include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
- $bbcode = new bbcode($post_info['bbcode_bitfield']);
- $bbcode->bbcode_second_pass($message, $post_info['bbcode_uid'], $post_info['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
+ $parse_flags = ($post_info['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $message = generate_text_for_display($post_info['post_text'], $post_info['bbcode_uid'], $post_info['bbcode_bitfield'], $parse_flags, false);
if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
{
@@ -170,12 +240,39 @@ class mcp_queue
foreach ($attachments as $attachment)
{
$template->assign_block_vars('attachment', array(
- 'DISPLAY_ATTACHMENT' => $attachment)
- );
+ 'DISPLAY_ATTACHMENT' => $attachment,
+ ));
}
}
}
+ // Deleting information
+ if ($post_info['post_visibility'] == ITEM_DELETED && $post_info['post_delete_user'])
+ {
+ // User having deleted the post also being the post author?
+ if (!$post_info['post_delete_user'] || $post_info['post_delete_user'] == $post_info['poster_id'])
+ {
+ $display_username = get_username_string('full', $post_info['poster_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']);
+ }
+ else
+ {
+ $sql = 'SELECT u.user_id, u.username, u.user_colour
+ FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
+ WHERE p.post_id = ' . $post_info['post_id'] . '
+ AND p.post_delete_user = u.user_id';
+ $result = $db->sql_query($sql);
+ $post_delete_userinfo = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+ $display_username = get_username_string('full', $post_info['post_delete_user'], $post_delete_userinfo['username'], $post_delete_userinfo['user_colour']);
+ }
+
+ $l_deleted_by = $user->lang('DELETED_INFORMATION', $display_username, $user->format_date($post_info['post_delete_time'], false, true));
+ }
+ else
+ {
+ $l_deleted_by = '';
+ }
+
$post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;p=' . $post_info['post_id'] . '#p' . $post_info['post_id']);
$topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']);
@@ -184,9 +281,12 @@ class mcp_queue
'U_APPROVE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'],
- 'S_POST_UNAPPROVED' => !$post_info['post_approved'],
+ 'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED),
'S_POST_LOCKED' => $post_info['post_edit_locked'],
'S_USER_NOTES' => true,
+ 'S_POST_DELETED' => ($post_info['post_visibility'] == ITEM_DELETED),
+ 'DELETED_MESSAGE' => $l_deleted_by,
+ 'DELETE_REASON' => $post_info['post_delete_reason'],
'U_EDIT' => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f={$post_info['forum_id']}&amp;p={$post_info['post_id']}") : '',
'U_MCP_APPROVE' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
@@ -198,7 +298,8 @@ class mcp_queue
'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
- 'RETURN_QUEUE' => sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . "&amp;start=$start\">", '</a>'),
+
+ 'RETURN_QUEUE' => sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . '&amp;start=' . $start . '">', '</a>'),
'RETURN_POST' => sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>'),
'RETURN_TOPIC_SIMPLE' => sprintf($user->lang['RETURN_TOPIC_SIMPLE'], '<a href="' . $topic_url . '">', '</a>'),
'REPORTED_IMG' => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
@@ -225,9 +326,16 @@ class mcp_queue
case 'unapproved_topics':
case 'unapproved_posts':
+ case 'deleted_topics':
+ case 'deleted_posts':
+ $m_perm = 'm_approve';
+ $is_topics = ($mode == 'unapproved_topics' || $mode == 'deleted_topics') ? true : false;
+ $is_restore = ($mode == 'deleted_posts' || $mode == 'deleted_topics') ? true : false;
+ $visibility_const = (!$is_restore) ? ITEM_UNAPPROVED : ITEM_DELETED;
+
$user->add_lang(array('viewtopic', 'viewforum'));
- $topic_id = request_var('t', 0);
+ $topic_id = $request->variable('t', 0);
$forum_info = array();
if ($topic_id)
@@ -243,7 +351,7 @@ class mcp_queue
$forum_id = $topic_info['forum_id'];
}
- $forum_list_approve = get_forum_list('m_approve', false, true);
+ $forum_list_approve = get_forum_list($m_perm, false, true);
$forum_list_read = array_flip(get_forum_list('f_read', true, true)); // Flipped so we can isset() the forum IDs
// Remove forums we cannot read
@@ -269,20 +377,16 @@ class mcp_queue
trigger_error('NOT_MODERATOR');
}
- $global_id = $forum_list[0];
-
- $forum_list = implode(', ', $forum_list);
-
- $sql = 'SELECT SUM(forum_topics) as sum_forum_topics
- FROM ' . FORUMS_TABLE . "
- WHERE forum_id IN (0, $forum_list)";
+ $sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
+ FROM ' . FORUMS_TABLE . '
+ WHERE ' . $db->sql_in_set('forum_id', $forum_list);
$result = $db->sql_query($sql);
- $forum_info['forum_topics'] = (int) $db->sql_fetchfield('sum_forum_topics');
+ $forum_info['forum_topics_approved'] = (int) $db->sql_fetchfield('sum_forum_topics');
$db->sql_freeresult($result);
}
else
{
- $forum_info = get_forum_data(array($forum_id), 'm_approve');
+ $forum_info = get_forum_data(array($forum_id), $m_perm);
if (!sizeof($forum_info))
{
@@ -291,7 +395,6 @@ class mcp_queue
$forum_info = $forum_info[$forum_id];
$forum_list = $forum_id;
- $global_id = $forum_id;
}
$forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';
@@ -305,21 +408,22 @@ class mcp_queue
$sort_by_sql = $sort_order_sql = array();
mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
- $forum_topics = ($total == -1) ? $forum_info['forum_topics'] : $total;
+ $forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
$forum_names = array();
- if ($mode == 'unapproved_posts')
+ if (!$is_topics)
{
$sql = 'SELECT p.post_id
- FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . "
- WHERE p.forum_id IN (0, $forum_list)
- AND p.post_approved = 0
- " . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
+ FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . '
+ WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . '
+ AND p.post_visibility = ' . $visibility_const . '
+ ' . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . "
AND t.topic_id = p.topic_id
- AND t.topic_first_post_id <> p.post_id
+ AND (t.topic_visibility <> p.post_visibility
+ OR t.topic_delete_user = 0)
$limit_time_sql
ORDER BY $sort_order_sql";
$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
@@ -335,7 +439,7 @@ class mcp_queue
if (sizeof($post_ids))
{
- $sql = 'SELECT t.topic_id, t.topic_title, t.forum_id, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, u.username, u.username_clean, u.user_colour
+ $sql = 'SELECT t.topic_id, t.topic_title, t.forum_id, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour
FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u
WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
AND t.topic_id = p.topic_id
@@ -346,10 +450,7 @@ class mcp_queue
$post_data = $rowset = array();
while ($row = $db->sql_fetchrow($result))
{
- if ($row['forum_id'])
- {
- $forum_names[] = $row['forum_id'];
- }
+ $forum_names[] = $row['forum_id'];
$post_data[$row['post_id']] = $row;
}
$db->sql_freeresult($result);
@@ -367,10 +468,11 @@ class mcp_queue
}
else
{
- $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, t.topic_title AS post_subject, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_first_poster_name AS username, t.topic_first_poster_colour AS user_colour
- FROM ' . TOPICS_TABLE . " t
- WHERE forum_id IN (0, $forum_list)
- AND topic_approved = 0
+ $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, t.topic_title AS post_subject, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_attachment AS post_attachment, t.topic_first_poster_name AS username, t.topic_first_poster_colour AS user_colour
+ FROM ' . TOPICS_TABLE . ' t
+ WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
+ AND topic_visibility = ' . $visibility_const . "
+ AND topic_delete_user <> 0
$limit_time_sql
ORDER BY $sort_order_sql";
$result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
@@ -378,10 +480,7 @@ class mcp_queue
$rowset = array();
while ($row = $db->sql_fetchrow($result))
{
- if ($row['forum_id'])
- {
- $forum_names[] = $row['forum_id'];
- }
+ $forum_names[] = $row['forum_id'];
$rowset[] = $row;
}
$db->sql_freeresult($result);
@@ -405,20 +504,14 @@ class mcp_queue
foreach ($rowset as $row)
{
- $global_topic = ($row['forum_id']) ? false : true;
- if ($global_topic)
- {
- $row['forum_id'] = $global_id;
- }
-
if (empty($row['post_username']))
{
- $row['post_username'] = $user->lang['GUEST'];
+ $row['post_username'] = $row['username'] ?: $user->lang['GUEST'];
}
$template->assign_block_vars('postrow', array(
'U_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
- 'U_VIEWFORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : '',
+ 'U_VIEWFORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'U_VIEWPOST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']) . (($mode == 'unapproved_posts') ? '#p' . $row['post_id'] : ''),
'U_VIEW_DETAILS' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;start=$start&amp;mode=approve_details&amp;f={$row['forum_id']}&amp;p={$row['post_id']}" . (($mode == 'unapproved_topics') ? "&amp;t={$row['topic_id']}" : '')),
@@ -428,572 +521,708 @@ class mcp_queue
'U_POST_AUTHOR' => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
'POST_ID' => $row['post_id'],
- 'FORUM_NAME' => (!$global_topic) ? $forum_names[$row['forum_id']] : $user->lang['GLOBAL_ANNOUNCEMENT'],
+ 'TOPIC_ID' => $row['topic_id'],
+ 'FORUM_NAME' => $forum_names[$row['forum_id']],
'POST_SUBJECT' => ($row['post_subject'] != '') ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
'TOPIC_TITLE' => $row['topic_title'],
- 'POST_TIME' => $user->format_date($row['post_time']))
- );
+ 'POST_TIME' => $user->format_date($row['post_time']),
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+ ));
}
unset($rowset, $forum_names);
+ $base_url = $this->u_action . "&amp;f=$forum_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
+
// Now display the page
$template->assign_vars(array(
- 'L_DISPLAY_ITEMS' => ($mode == 'unapproved_posts') ? $user->lang['DISPLAY_POSTS'] : $user->lang['DISPLAY_TOPICS'],
- 'L_EXPLAIN' => ($mode == 'unapproved_posts') ? $user->lang['MCP_QUEUE_UNAPPROVED_POSTS_EXPLAIN'] : $user->lang['MCP_QUEUE_UNAPPROVED_TOPICS_EXPLAIN'],
- 'L_TITLE' => ($mode == 'unapproved_posts') ? $user->lang['MCP_QUEUE_UNAPPROVED_POSTS'] : $user->lang['MCP_QUEUE_UNAPPROVED_TOPICS'],
+ 'L_DISPLAY_ITEMS' => (!$is_topics) ? $user->lang['DISPLAY_POSTS'] : $user->lang['DISPLAY_TOPICS'],
+ 'L_EXPLAIN' => $user->lang['MCP_QUEUE_' . strtoupper($mode) . '_EXPLAIN'],
+ 'L_TITLE' => $user->lang['MCP_QUEUE_' . strtoupper($mode)],
'L_ONLY_TOPIC' => ($topic_id) ? sprintf($user->lang['ONLY_TOPIC'], $topic_info['topic_title']) : '',
'S_FORUM_OPTIONS' => $forum_options,
'S_MCP_ACTION' => build_url(array('t', 'f', 'sd', 'st', 'sk')),
- 'S_TOPICS' => ($mode == 'unapproved_posts') ? false : true,
+ 'S_TOPICS' => $is_topics,
+ 'S_RESTORE' => $is_restore,
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;f=$forum_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir", $total, $config['topics_per_page'], $start),
- 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $total, $config['topics_per_page'], $start),
'TOPIC_ID' => $topic_id,
- 'TOTAL' => ($total == 1) ? (($mode == 'unapproved_posts') ? $user->lang['VIEW_TOPIC_POST'] : $user->lang['VIEW_FORUM_TOPIC']) : sprintf((($mode == 'unapproved_posts') ? $user->lang['VIEW_TOPIC_POSTS'] : $user->lang['VIEW_FORUM_TOPICS']), $total),
+ 'TOTAL' => $user->lang(((!$is_topics) ? 'VIEW_TOPIC_POSTS' : 'VIEW_FORUM_TOPICS'), (int) $total),
));
$this->tpl_name = 'mcp_queue';
break;
}
}
-}
-/**
-* Approve Post/Topic
-*/
-function approve_post($post_id_list, $id, $mode)
-{
- global $db, $template, $user, $config;
- global $phpEx, $phpbb_root_path;
-
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
+ /**
+ * Approve/Restore posts
+ *
+ * @param $action string Action we perform on the posts ('approve' or 'restore')
+ * @param $post_id_list array IDs of the posts to approve/restore
+ * @param $id mixed Category of the current active module
+ * @param $mode string Active module
+ * @return null
+ */
+ static public function approve_posts($action, $post_id_list, $id, $mode)
{
- trigger_error('NOT_AUTHORISED');
- }
+ global $db, $template, $user, $config, $request, $phpbb_container;
+ global $phpEx, $phpbb_root_path;
- $redirect = request_var('redirect', build_url(array('quickmod')));
- $success_msg = '';
-
- $s_hidden_fields = build_hidden_fields(array(
- 'i' => $id,
- 'mode' => $mode,
- 'post_id_list' => $post_id_list,
- 'action' => 'approve',
- 'redirect' => $redirect)
- );
-
- $post_info = get_post_data($post_id_list, 'm_approve');
+ if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
+ {
+ trigger_error('NOT_AUTHORISED');
+ }
- if (confirm_box(true))
- {
- $notify_poster = (isset($_REQUEST['notify_poster'])) ? true : false;
+ $redirect = $request->variable('redirect', build_url(array('quickmod')));
+ $success_msg = $post_url = '';
+ $approve_log = array();
- // If Topic -> total_topics = total_topics+1, total_posts = total_posts+1, forum_topics = forum_topics+1, forum_posts = forum_posts+1
- // If Post -> total_posts = total_posts+1, forum_posts = forum_posts+1, topic_replies = topic_replies+1
+ $s_hidden_fields = build_hidden_fields(array(
+ 'i' => $id,
+ 'mode' => $mode,
+ 'post_id_list' => $post_id_list,
+ 'action' => $action,
+ 'redirect' => $redirect,
+ ));
- $total_topics = $total_posts = 0;
- $topic_approve_sql = $post_approve_sql = $topic_id_list = $forum_id_list = $approve_log = array();
- $user_posts_sql = $post_approved_list = array();
+ $post_info = get_post_data($post_id_list, 'm_approve');
- foreach ($post_info as $post_id => $post_data)
+ if (confirm_box(true))
{
- if ($post_data['post_approved'])
- {
- $post_approved_list[] = $post_id;
- continue;
- }
+ $notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster']));
- $topic_id_list[$post_data['topic_id']] = 1;
+ $topic_info = array();
- if ($post_data['forum_id'])
+ // Group the posts by topic_id
+ foreach ($post_info as $post_id => $post_data)
{
- $forum_id_list[$post_data['forum_id']] = 1;
- }
+ if ($post_data['post_visibility'] == ITEM_APPROVED)
+ {
+ continue;
+ }
+ $topic_id = (int) $post_data['topic_id'];
- // User post update (we do not care about topic or post, since user posts are strictly connected to posts)
- // But we care about forums where post counts get not increased. ;)
- if ($post_data['post_postcount'])
- {
- $user_posts_sql[$post_data['poster_id']] = (empty($user_posts_sql[$post_data['poster_id']])) ? 1 : $user_posts_sql[$post_data['poster_id']] + 1;
- }
+ $topic_info[$topic_id]['posts'][] = (int) $post_id;
+ $topic_info[$topic_id]['forum_id'] = (int) $post_data['forum_id'];
- // Topic or Post. ;)
- if ($post_data['topic_first_post_id'] == $post_id)
- {
- if ($post_data['forum_id'])
+ // Refresh the first post, if the time or id is older then the current one
+ if ($post_id <= $post_data['topic_first_post_id'] || $post_data['post_time'] <= $post_data['topic_time'])
{
- $total_topics++;
+ $topic_info[$topic_id]['first_post'] = true;
}
- $topic_approve_sql[] = $post_data['topic_id'];
+
+ // Refresh the last post, if the time or id is newer then the current one
+ if ($post_id >= $post_data['topic_last_post_id'] || $post_data['post_time'] >= $post_data['topic_last_post_time'])
+ {
+ $topic_info[$topic_id]['last_post'] = true;
+ }
+
+ $post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$post_data['forum_id']}&amp;t={$post_data['topic_id']}&amp;p={$post_data['post_id']}") . '#p' . $post_data['post_id'];
$approve_log[] = array(
- 'type' => 'topic',
- 'post_subject' => $post_data['post_subject'],
'forum_id' => $post_data['forum_id'],
'topic_id' => $post_data['topic_id'],
+ 'post_subject' => $post_data['post_subject'],
);
}
- else
+
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ foreach ($topic_info as $topic_id => $topic_data)
{
- $approve_log[] = array(
- 'type' => 'post',
- 'post_subject' => $post_data['post_subject'],
- 'forum_id' => $post_data['forum_id'],
- 'topic_id' => $post_data['topic_id'],
- );
+ $phpbb_content_visibility->set_post_visibility(ITEM_APPROVED, $topic_data['posts'], $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), '', isset($topic_data['first_post']), isset($topic_data['last_post']));
}
- if ($post_data['forum_id'])
+ if (sizeof($post_info) >= 1)
{
- $total_posts++;
+ $success_msg = (sizeof($post_info) == 1) ? 'POST_' . strtoupper($action) . 'D_SUCCESS' : 'POSTS_' . strtoupper($action) . 'D_SUCCESS';
+ }
- // Increment by topic_replies if we approve a topic...
- // This works because we do not adjust the topic_replies when re-approving a topic after an edit.
- if ($post_data['topic_first_post_id'] == $post_id && $post_data['topic_replies'])
+ foreach ($approve_log as $log_data)
+ {
+ add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_POST_' . strtoupper($action) . 'D', $log_data['post_subject']);
+ }
+
+ // Only send out the mails, when the posts are being approved
+ if ($action == 'approve')
+ {
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ // Handle notifications
+ foreach ($post_info as $post_id => $post_data)
{
- $total_posts += $post_data['topic_replies'];
+ $phpbb_notifications->delete_notifications('post_in_queue', $post_id);
+
+ $phpbb_notifications->add_notifications(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ ), $post_data);
+
+ $phpbb_notifications->mark_notifications_read(array(
+ 'quote',
+ 'bookmark',
+ 'post',
+ ), $post_data['post_id'], $user->data['user_id']);
+
+ // Notify Poster?
+ if ($notify_poster)
+ {
+ if ($post_data['poster_id'] == ANONYMOUS)
+ {
+ continue;
+ }
+
+ $phpbb_notifications->add_notifications('approve_post', $post_data);
+ }
}
}
-
- $post_approve_sql[] = $post_id;
}
-
- $post_id_list = array_values(array_diff($post_id_list, $post_approved_list));
- for ($i = 0, $size = sizeof($post_approved_list); $i < $size; $i++)
+ else
{
- unset($post_info[$post_approved_list[$i]]);
- }
+ $show_notify = false;
- if (sizeof($topic_approve_sql))
- {
- $sql = 'UPDATE ' . TOPICS_TABLE . '
- SET topic_approved = 1
- WHERE ' . $db->sql_in_set('topic_id', $topic_approve_sql);
- $db->sql_query($sql);
- }
+ if ($action == 'approve')
+ {
+ foreach ($post_info as $post_data)
+ {
+ if ($post_data['poster_id'] == ANONYMOUS)
+ {
+ continue;
+ }
+ else
+ {
+ $show_notify = true;
+ break;
+ }
+ }
+ }
- if (sizeof($post_approve_sql))
- {
- $sql = 'UPDATE ' . POSTS_TABLE . '
- SET post_approved = 1
- WHERE ' . $db->sql_in_set('post_id', $post_approve_sql);
- $db->sql_query($sql);
+ $template->assign_vars(array(
+ 'S_NOTIFY_POSTER' => $show_notify,
+ 'S_' . strtoupper($action) => true,
+ ));
+
+ confirm_box(false, strtoupper($action) . '_POST' . ((sizeof($post_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
}
- unset($topic_approve_sql, $post_approve_sql);
+ $redirect = $request->variable('redirect', "index.$phpEx");
+ $redirect = reapply_sid($redirect);
- foreach ($approve_log as $log_data)
+ if (!$success_msg)
{
- add_log('mod', $log_data['forum_id'], $log_data['topic_id'], ($log_data['type'] == 'topic') ? 'LOG_TOPIC_APPROVED' : 'LOG_POST_APPROVED', $log_data['post_subject']);
+ redirect($redirect);
}
-
- if (sizeof($user_posts_sql))
+ else
{
- // Try to minimize the query count by merging users with the same post count additions
- $user_posts_update = array();
+ meta_refresh(3, $redirect);
- foreach ($user_posts_sql as $user_id => $user_posts)
+ // If approving one post, also give links back to post...
+ $add_message = '';
+ if (sizeof($post_info) == 1 && $post_url)
{
- $user_posts_update[$user_posts][] = $user_id;
+ $add_message = '<br /><br />' . sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>');
}
- foreach ($user_posts_update as $user_posts => $user_id_ary)
+ $message = $user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>') . $add_message;
+
+ if ($request->is_ajax())
{
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_posts = user_posts + ' . $user_posts . '
- WHERE ' . $db->sql_in_set('user_id', $user_id_ary);
- $db->sql_query($sql);
+ $json_response = new \phpbb\json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => null,
+ 'visible' => true,
+ ));
}
- }
- if ($total_topics)
- {
- set_config_count('num_topics', $total_topics, true);
+ trigger_error($message);
}
+ }
- if ($total_posts)
+ /**
+ * Approve/Restore topics
+ *
+ * @param $action string Action we perform on the posts ('approve' or 'restore')
+ * @param $topic_id_list array IDs of the topics to approve/restore
+ * @param $id mixed Category of the current active module
+ * @param $mode string Active module
+ * @return null
+ */
+ static public function approve_topics($action, $topic_id_list, $id, $mode)
+ {
+ global $db, $template, $user, $config;
+ global $phpEx, $phpbb_root_path, $request, $phpbb_container;
+
+ if (!check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve')))
{
- set_config_count('num_posts', $total_posts, true);
+ trigger_error('NOT_AUTHORISED');
}
- sync('topic', 'topic_id', array_keys($topic_id_list), true);
- sync('forum', 'forum_id', array_keys($forum_id_list), true, true);
- unset($topic_id_list, $forum_id_list);
+ $redirect = $request->variable('redirect', build_url(array('quickmod')));
+ $success_msg = $topic_url = '';
+ $approve_log = array();
- $messenger = new messenger();
+ $s_hidden_fields = build_hidden_fields(array(
+ 'i' => $id,
+ 'mode' => $mode,
+ 'topic_id_list' => $topic_id_list,
+ 'action' => $action,
+ 'redirect' => $redirect,
+ ));
- // Notify Poster?
- if ($notify_poster)
- {
- foreach ($post_info as $post_id => $post_data)
- {
- if ($post_data['poster_id'] == ANONYMOUS)
- {
- continue;
- }
+ $topic_info = get_topic_data($topic_id_list, 'm_approve');
- $email_template = ($post_data['post_id'] == $post_data['topic_first_post_id'] && $post_data['post_id'] == $post_data['topic_last_post_id']) ? 'topic_approved' : 'post_approved';
-
- $messenger->template($email_template, $post_data['user_lang']);
+ if (confirm_box(true))
+ {
+ $notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster'])) ? true : false;
- $messenger->to($post_data['user_email'], $post_data['username']);
- $messenger->im($post_data['user_jabber'], $post_data['username']);
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+ foreach ($topic_info as $topic_id => $topic_data)
+ {
+ $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), '');
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($post_data['username']),
- 'POST_SUBJECT' => htmlspecialchars_decode(censor_text($post_data['post_subject'])),
- 'TOPIC_TITLE' => htmlspecialchars_decode(censor_text($post_data['topic_title'])),
+ $topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$topic_data['forum_id']}&amp;t={$topic_id}");
- 'U_VIEW_TOPIC' => generate_board_url() . "/viewtopic.$phpEx?f={$post_data['forum_id']}&t={$post_data['topic_id']}&e=0",
- 'U_VIEW_POST' => generate_board_url() . "/viewtopic.$phpEx?f={$post_data['forum_id']}&t={$post_data['topic_id']}&p=$post_id&e=$post_id")
+ $approve_log[] = array(
+ 'forum_id' => $topic_data['forum_id'],
+ 'topic_id' => $topic_data['topic_id'],
+ 'topic_title' => $topic_data['topic_title'],
);
-
- $messenger->send($post_data['user_notify_type']);
}
- }
-
- $messenger->save_queue();
- // Send out normal user notifications
- $email_sig = str_replace('<br />', "\n", "-- \n" . $config['board_email_sig']);
-
- foreach ($post_info as $post_id => $post_data)
- {
- if ($post_id == $post_data['topic_first_post_id'] && $post_id == $post_data['topic_last_post_id'])
+ if (sizeof($topic_info) >= 1)
{
- // Forum Notifications
- user_notification('post', $post_data['topic_title'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id);
+ $success_msg = (sizeof($topic_info) == 1) ? 'TOPIC_' . strtoupper($action) . 'D_SUCCESS' : 'TOPICS_' . strtoupper($action) . 'D_SUCCESS';
}
- else
+
+ foreach ($approve_log as $log_data)
{
- // Topic Notifications
- user_notification('reply', $post_data['post_subject'], $post_data['topic_title'], $post_data['forum_name'], $post_data['forum_id'], $post_data['topic_id'], $post_id);
+ add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_TOPIC_' . strtoupper($action) . 'D', $log_data['topic_title']);
}
- }
- if (sizeof($post_id_list) == 1)
- {
- $post_data = $post_info[$post_id_list[0]];
- $post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$post_data['forum_id']}&amp;t={$post_data['topic_id']}&amp;p={$post_data['post_id']}") . '#p' . $post_data['post_id'];
- }
- unset($post_info);
+ // Only send out the mails, when the posts are being approved
+ if ($action == 'approve')
+ {
+ // Handle notifications
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
- if ($total_topics)
- {
- $success_msg = ($total_topics == 1) ? 'TOPIC_APPROVED_SUCCESS' : 'TOPICS_APPROVED_SUCCESS';
+ foreach ($topic_info as $topic_id => $topic_data)
+ {
+ $phpbb_notifications->delete_notifications('topic_in_queue', $post_data['topic_id']);
+ $phpbb_notifications->add_notifications(array(
+ 'quote',
+ 'topic',
+ ), $post_data);
+
+ $phpbb_notifications->mark_notifications_read('quote', $post_data['post_id'], $user->data['user_id']);
+ $phpbb_notifications->mark_notifications_read('topic', $post_data['topic_id'], $user->data['user_id']);
+
+ if ($notify_poster)
+ {
+ $phpbb_notifications->add_notifications('approve_topic', $post_data);
+ }
+ }
+ }
}
else
{
- $success_msg = (sizeof($post_id_list) + sizeof($post_approved_list) == 1) ? 'POST_APPROVED_SUCCESS' : 'POSTS_APPROVED_SUCCESS';
- }
- }
- else
- {
- $show_notify = false;
+ $show_notify = false;
- if ($config['email_enable'] || $config['jab_enable'])
- {
- foreach ($post_info as $post_data)
+ if ($action == 'approve')
{
- if ($post_data['poster_id'] == ANONYMOUS)
- {
- continue;
- }
- else
+ foreach ($topic_info as $topic_data)
{
- $show_notify = true;
- break;
+ if ($topic_data['topic_poster'] == ANONYMOUS)
+ {
+ continue;
+ }
+ else
+ {
+ $show_notify = true;
+ break;
+ }
}
}
- }
- $template->assign_vars(array(
- 'S_NOTIFY_POSTER' => $show_notify,
- 'S_APPROVE' => true)
- );
+ $template->assign_vars(array(
+ 'S_NOTIFY_POSTER' => $show_notify,
+ 'S_' . strtoupper($action) => true,
+ ));
- confirm_box(false, 'APPROVE_POST' . ((sizeof($post_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
- }
+ confirm_box(false, strtoupper($action) . '_TOPIC' . ((sizeof($topic_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
+ }
- $redirect = request_var('redirect', "index.$phpEx");
- $redirect = reapply_sid($redirect);
+ $redirect = $request->variable('redirect', "index.$phpEx");
+ $redirect = reapply_sid($redirect);
- if (!$success_msg)
- {
- redirect($redirect);
- }
- else
- {
- meta_refresh(3, $redirect);
-
- // If approving one post, also give links back to post...
- $add_message = '';
- if (sizeof($post_id_list) == 1 && !empty($post_url))
+ if (!$success_msg)
{
- $add_message = '<br /><br />' . sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>');
+ redirect($redirect);
}
+ else
+ {
+ meta_refresh(3, $redirect);
- trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>') . $add_message);
- }
-}
-
-/**
-* Disapprove Post/Topic
-*/
-function disapprove_post($post_id_list, $id, $mode)
-{
- global $db, $template, $user, $config;
- global $phpEx, $phpbb_root_path;
-
- if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
- {
- trigger_error('NOT_AUTHORISED');
- }
+ // If approving one topic, also give links back to topic...
+ $add_message = '';
+ if (sizeof($topic_info) == 1 && $topic_url)
+ {
+ $add_message = '<br /><br />' . sprintf($user->lang['RETURN_TOPIC'], '<a href="' . $topic_url . '">', '</a>');
+ }
- $redirect = request_var('redirect', build_url(array('t', 'mode', 'quickmod')) . "&amp;mode=$mode");
- $reason = utf8_normalize_nfc(request_var('reason', '', true));
- $reason_id = request_var('reason_id', 0);
- $success_msg = $additional_msg = '';
+ $message = $user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>') . $add_message;
- $s_hidden_fields = build_hidden_fields(array(
- 'i' => $id,
- 'mode' => $mode,
- 'post_id_list' => $post_id_list,
- 'action' => 'disapprove',
- 'redirect' => $redirect)
- );
+ if ($request->is_ajax())
+ {
+ $json_response = new \phpbb\json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => null,
+ 'visible' => true,
+ ));
+ }
- $notify_poster = (isset($_REQUEST['notify_poster'])) ? true : false;
- $disapprove_reason = '';
+ trigger_error($message);
+ }
+ }
- if ($reason_id)
+ /**
+ * Disapprove Post
+ *
+ * @param $post_id_list array IDs of the posts to disapprove/delete
+ * @param $id mixed Category of the current active module
+ * @param $mode string Active module
+ * @return null
+ */
+ static public function disapprove_posts($post_id_list, $id, $mode)
{
- $sql = 'SELECT reason_title, reason_description
- FROM ' . REPORTS_REASONS_TABLE . "
- WHERE reason_id = $reason_id";
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- if (!$row || (!$reason && strtolower($row['reason_title']) == 'other'))
+ global $db, $template, $user, $config, $phpbb_container;
+ global $phpEx, $phpbb_root_path, $request;
+
+ if (!check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
{
- $additional_msg = $user->lang['NO_REASON_DISAPPROVAL'];
- unset($_REQUEST['confirm_key']);
- unset($_POST['confirm_key']);
- unset($_POST['confirm']);
+ trigger_error('NOT_AUTHORISED');
}
- else
- {
- // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
- $disapprove_reason = (strtolower($row['reason_title']) != 'other') ? ((isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])])) ? $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])] : $row['reason_description']) : '';
- $disapprove_reason .= ($reason) ? "\n\n" . $reason : '';
- if (isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
+ $redirect = $request->variable('redirect', build_url(array('t', 'mode', 'quickmod')) . "&amp;mode=$mode");
+ $reason = $request->variable('reason', '', true);
+ $reason_id = $request->variable('reason_id', 0);
+ $success_msg = $additional_msg = '';
+
+ $s_hidden_fields = build_hidden_fields(array(
+ 'i' => $id,
+ 'mode' => $mode,
+ 'post_id_list' => $post_id_list,
+ 'action' => 'disapprove',
+ 'redirect' => $redirect,
+ ));
+
+ $notify_poster = $request->is_set('notify_poster');
+ $disapprove_reason = '';
+
+ if ($reason_id)
+ {
+ $sql = 'SELECT reason_title, reason_description
+ FROM ' . REPORTS_REASONS_TABLE . "
+ WHERE reason_id = $reason_id";
+ $result = $db->sql_query($sql);
+ $row = $db->sql_fetchrow($result);
+ $db->sql_freeresult($result);
+
+ if (!$row || (!$reason && strtolower($row['reason_title']) == 'other'))
{
- $disapprove_reason_lang = strtoupper($row['reason_title']);
+ $additional_msg = $user->lang['NO_REASON_DISAPPROVAL'];
+
+ $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
+ $request->overwrite('confirm_key', null, \phpbb\request\request_interface::POST);
+ $request->overwrite('confirm_key', null, \phpbb\request\request_interface::REQUEST);
}
+ else
+ {
+ // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
+ $disapprove_reason = (strtolower($row['reason_title']) != 'other') ? ((isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])])) ? $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])] : $row['reason_description']) : '';
+ $disapprove_reason .= ($reason) ? "\n\n" . $reason : '';
- $email_disapprove_reason = $disapprove_reason;
+ if (isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
+ {
+ $disapprove_reason_lang = strtoupper($row['reason_title']);
+ }
+ }
}
- }
- $post_info = get_post_data($post_id_list, 'm_approve');
+ $post_info = get_post_data($post_id_list, 'm_approve');
- if (confirm_box(true))
- {
- $disapprove_log = $disapprove_log_topics = $disapprove_log_posts = array();
- $topic_replies_real = $post_disapprove_list = array();
-
- // Build a list of posts to be unapproved and get the related topics real replies count
+ $is_disapproving = false;
foreach ($post_info as $post_id => $post_data)
{
- $post_disapprove_list[$post_id] = $post_data['topic_id'];
- if (!isset($topic_replies_real[$post_data['topic_id']]))
+ if ($post_data['post_visibility'] == ITEM_DELETED)
{
- $topic_replies_real[$post_data['topic_id']] = $post_data['topic_replies_real'];
+ continue;
}
+
+ $is_disapproving = true;
}
- // Now we build the log array
- foreach ($post_disapprove_list as $post_id => $topic_id)
+ if (confirm_box(true))
{
- // If the count of disapproved posts for the topic is greater
- // than topic's real replies count, the whole topic is disapproved/deleted
- if (sizeof(array_keys($post_disapprove_list, $topic_id)) > $topic_replies_real[$topic_id])
+ $disapprove_log = $disapprove_log_topics = $disapprove_log_posts = array();
+ $topic_posts_unapproved = $post_disapprove_list = $topic_information = array();
+
+ // Build a list of posts to be disapproved and get the related topics real replies count
+ foreach ($post_info as $post_id => $post_data)
{
- // Don't write the log more than once for every topic
- if (!isset($disapprove_log_topics[$topic_id]))
+ $post_disapprove_list[$post_id] = $post_data['topic_id'];
+ if (!isset($topic_posts_unapproved[$post_data['topic_id']]))
{
- // Build disapproved topics log
- $disapprove_log_topics[$topic_id] = array(
- 'type' => 'topic',
- 'post_subject' => $post_info[$post_id]['topic_title'],
- 'forum_id' => $post_info[$post_id]['forum_id'],
- 'topic_id' => 0, // useless to log a topic id, as it will be deleted
- );
+ $topic_information[$post_data['topic_id']] = $post_data;
+ $topic_posts_unapproved[$post_data['topic_id']] = 0;
}
+ $topic_posts_unapproved[$post_data['topic_id']]++;
}
- else
+
+ // Now we build the log array
+ foreach ($post_disapprove_list as $post_id => $topic_id)
{
- // Build disapproved posts log
- $disapprove_log_posts[] = array(
- 'type' => 'post',
- 'post_subject' => $post_info[$post_id]['post_subject'],
- 'forum_id' => $post_info[$post_id]['forum_id'],
- 'topic_id' => $post_info[$post_id]['topic_id'],
- );
+ // If the count of disapproved posts for the topic is equal
+ // to the number of unapproved posts in the topic, and there are no different
+ // posts, we disapprove the hole topic
+ if ($topic_information[$topic_id]['topic_posts_approved'] == 0 &&
+ $topic_information[$topic_id]['topic_posts_softdeleted'] == 0 &&
+ $topic_information[$topic_id]['topic_posts_unapproved'] == $topic_posts_unapproved[$topic_id])
+ {
+ // Don't write the log more than once for every topic
+ if (!isset($disapprove_log_topics[$topic_id]))
+ {
+ // Build disapproved topics log
+ $disapprove_log_topics[$topic_id] = array(
+ 'type' => 'topic',
+ 'post_subject' => $post_info[$post_id]['topic_title'],
+ 'forum_id' => $post_info[$post_id]['forum_id'],
+ 'topic_id' => 0, // useless to log a topic id, as it will be deleted
+ 'post_username' => ($post_info[$post_id]['poster_id'] == ANONYMOUS && !empty($post_info[$post_id]['post_username'])) ? $post_info[$post_id]['post_username'] : $post_info[$post_id]['username'],
+ );
+ }
+ }
+ else
+ {
+ // Build disapproved posts log
+ $disapprove_log_posts[] = array(
+ 'type' => 'post',
+ 'post_subject' => $post_info[$post_id]['post_subject'],
+ 'forum_id' => $post_info[$post_id]['forum_id'],
+ 'topic_id' => $post_info[$post_id]['topic_id'],
+ 'post_username' => ($post_info[$post_id]['poster_id'] == ANONYMOUS && !empty($post_info[$post_id]['post_username'])) ? $post_info[$post_id]['post_username'] : $post_info[$post_id]['username'],
+ );
+ }
}
- }
- // Get disapproved posts/topics counts separately
- $num_disapproved_topics = sizeof($disapprove_log_topics);
- $num_disapproved_posts = sizeof($disapprove_log_posts);
+ // Get disapproved posts/topics counts separately
+ $num_disapproved_topics = sizeof($disapprove_log_topics);
+ $num_disapproved_posts = sizeof($disapprove_log_posts);
- // Build the whole log
- $disapprove_log = array_merge($disapprove_log_topics, $disapprove_log_posts);
+ // Build the whole log
+ $disapprove_log = array_merge($disapprove_log_topics, $disapprove_log_posts);
- // Unset unneeded arrays
- unset($post_data, $disapprove_log_topics, $disapprove_log_posts);
+ // Unset unneeded arrays
+ unset($post_data, $disapprove_log_topics, $disapprove_log_posts);
- // Let's do the job - delete disapproved posts
- if (sizeof($post_disapprove_list))
- {
- if (!function_exists('delete_posts'))
+ // Let's do the job - delete disapproved posts
+ if (sizeof($post_disapprove_list))
{
- include_once($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
- }
+ if (!function_exists('delete_posts'))
+ {
+ include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
+ }
- // We do not check for permissions here, because the moderator allowed approval/disapproval should be allowed to delete the disapproved posts
- // Note: function delete_posts triggers related forums/topics sync,
- // so we don't need to call update_post_information later and to adjust real topic replies or forum topics count manually
- delete_posts('post_id', array_keys($post_disapprove_list));
+ // We do not check for permissions here, because the moderator allowed approval/disapproval should be allowed to delete the disapproved posts
+ // Note: function delete_posts triggers related forums/topics sync,
+ // so we don't need to call update_post_information later and to adjust real topic replies or forum topics count manually
+ delete_posts('post_id', array_keys($post_disapprove_list));
- foreach ($disapprove_log as $log_data)
- {
- add_log('mod', $log_data['forum_id'], $log_data['topic_id'], ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED', $log_data['post_subject'], $disapprove_reason);
+ foreach ($disapprove_log as $log_data)
+ {
+ if ($is_disapproving)
+ {
+ $l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED';
+ add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason);
+ }
+ else
+ {
+ $l_log_message = ($log_data['type'] == 'topic') ? 'LOG_DELETE_TOPIC' : 'LOG_DELETE_POST';
+ add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $log_data['post_username']);
+ }
+ }
}
- }
- $messenger = new messenger();
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
- // Notify Poster?
- if ($notify_poster)
- {
$lang_reasons = array();
foreach ($post_info as $post_id => $post_data)
{
- if ($post_data['poster_id'] == ANONYMOUS)
+ $disapprove_all_posts_in_topic = $topic_information[$topic_id]['topic_posts_approved'] == 0 &&
+ $topic_information[$topic_id]['topic_posts_softdeleted'] == 0 &&
+ $topic_information[$topic_id]['topic_posts_unapproved'] == $topic_posts_unapproved[$topic_id];
+
+ $phpbb_notifications->delete_notifications('post_in_queue', $post_id);
+
+ // Do we disapprove the whole topic? Remove potential notifications
+ if ($disapprove_all_posts_in_topic)
{
- continue;
+ $phpbb_notifications->delete_notifications('topic_in_queue', $post_data['topic_id']);
}
- if (isset($disapprove_reason_lang))
+ // Notify Poster?
+ if ($notify_poster)
{
- // Okay we need to get the reason from the posters language
- if (!isset($lang_reasons[$post_data['user_lang']]))
+ if ($post_data['poster_id'] == ANONYMOUS)
{
- // Assign the current users translation as the default, this is not ideal but getting the board default adds another layer of complexity.
- $lang_reasons[$post_data['user_lang']] = $user->lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
+ continue;
+ }
- // Only load up the language pack if the language is different to the current one
- if ($post_data['user_lang'] != $user->lang_name && file_exists($phpbb_root_path . '/language/' . $post_data['user_lang'] . '/mcp.' . $phpEx))
+ $post_data['disapprove_reason'] = '';
+ if (isset($disapprove_reason_lang))
+ {
+ // Okay we need to get the reason from the posters language
+ if (!isset($lang_reasons[$post_data['user_lang']]))
{
- // Load up the language pack
- $lang = array();
- @include($phpbb_root_path . '/language/' . basename($post_data['user_lang']) . '/mcp.' . $phpEx);
+ // Assign the current users translation as the default, this is not ideal but getting the board default adds another layer of complexity.
+ $lang_reasons[$post_data['user_lang']] = $user->lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
- // If we find the reason in this language pack use it
- if (isset($lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang]))
+ // Only load up the language pack if the language is different to the current one
+ if ($post_data['user_lang'] != $user->lang_name && file_exists($phpbb_root_path . '/language/' . $post_data['user_lang'] . '/mcp.' . $phpEx))
{
- $lang_reasons[$post_data['user_lang']] = $lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
- }
+ // Load up the language pack
+ $lang = array();
+ @include($phpbb_root_path . '/language/' . basename($post_data['user_lang']) . '/mcp.' . $phpEx);
+
+ // If we find the reason in this language pack use it
+ if (isset($lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang]))
+ {
+ $lang_reasons[$post_data['user_lang']] = $lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
+ }
- unset($lang); // Free memory
+ unset($lang); // Free memory
+ }
}
- }
- $email_disapprove_reason = $lang_reasons[$post_data['user_lang']];
- $email_disapprove_reason .= ($reason) ? "\n\n" . $reason : '';
- }
+ $post_data['disapprove_reason'] = $lang_reasons[$post_data['user_lang']];
+ $post_data['disapprove_reason'] .= ($reason) ? "\n\n" . $reason : '';
+ }
- $email_template = ($post_data['post_id'] == $post_data['topic_first_post_id'] && $post_data['post_id'] == $post_data['topic_last_post_id']) ? 'topic_disapproved' : 'post_disapproved';
- $messenger->template($email_template, $post_data['user_lang']);
+ if ($disapprove_all_posts_in_topic && $topic_information[$topic_id]['topic_posts_unapproved'] == 1)
+ {
+ // If there is only 1 post when disapproving the topic,
+ // we send the user a "disapprove topic" notification...
+ $phpbb_notifications->add_notifications('disapprove_topic', $post_data);
+ }
+ else
+ {
+ // ... otherwise there are multiple unapproved posts and
+ // all of them are disapproved as posts.
+ $phpbb_notifications->add_notifications('disapprove_post', $post_data);
+ }
+ }
+ }
- $messenger->to($post_data['user_email'], $post_data['username']);
- $messenger->im($post_data['user_jabber'], $post_data['username']);
+ unset($lang_reasons, $post_info, $disapprove_reason, $disapprove_reason_lang);
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($post_data['username']),
- 'REASON' => htmlspecialchars_decode($email_disapprove_reason),
- 'POST_SUBJECT' => htmlspecialchars_decode(censor_text($post_data['post_subject'])),
- 'TOPIC_TITLE' => htmlspecialchars_decode(censor_text($post_data['topic_title'])))
- );
- $messenger->send($post_data['user_notify_type']);
+ if ($num_disapproved_topics)
+ {
+ $success_msg = ($num_disapproved_topics == 1) ? 'TOPIC' : 'TOPICS';
+ }
+ else
+ {
+ $success_msg = ($num_disapproved_posts == 1) ? 'POST' : 'POSTS';
}
- unset($lang_reasons);
- }
- unset($post_info, $disapprove_reason, $email_disapprove_reason, $disapprove_reason_lang);
-
- $messenger->save_queue();
-
- if ($num_disapproved_topics)
- {
- $success_msg = ($num_disapproved_topics == 1) ? 'TOPIC_DISAPPROVED_SUCCESS' : 'TOPICS_DISAPPROVED_SUCCESS';
+ if ($is_disapproving)
+ {
+ $success_msg .= '_DISAPPROVED_SUCCESS';
+ }
+ else
+ {
+ $success_msg .= '_DELETED_SUCCESS';
+ }
}
else
{
- $success_msg = ($num_disapproved_posts == 1) ? 'POST_DISAPPROVED_SUCCESS' : 'POSTS_DISAPPROVED_SUCCESS';
- }
- }
- else
- {
- include_once($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ if (!function_exists('display_reasons'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
- display_reasons($reason_id);
+ $show_notify = false;
- $show_notify = false;
+ foreach ($post_info as $post_data)
+ {
+ if ($post_data['poster_id'] == ANONYMOUS)
+ {
+ continue;
+ }
+ else
+ {
+ $show_notify = true;
+ break;
+ }
+ }
- foreach ($post_info as $post_data)
- {
- if ($post_data['poster_id'] == ANONYMOUS)
+ $l_confirm_msg = 'DISAPPROVE_POST';
+ $confirm_template = 'mcp_approve.html';
+ if ($is_disapproving)
{
- continue;
+ display_reasons($reason_id);
}
else
{
- $show_notify = true;
- break;
+ $user->add_lang('posting');
+
+ $l_confirm_msg = 'DELETE_POST_PERMANENTLY';
+ $confirm_template = 'confirm_delete_body.html';
}
+ $l_confirm_msg .= ((sizeof($post_id_list) == 1) ? '' : 'S');
+
+ $template->assign_vars(array(
+ 'S_NOTIFY_POSTER' => $show_notify,
+ 'S_APPROVE' => false,
+ 'REASON' => ($is_disapproving) ? $reason : '',
+ 'ADDITIONAL_MSG' => $additional_msg,
+ ));
+
+ confirm_box(false, $l_confirm_msg, $s_hidden_fields, $confirm_template);
}
- $template->assign_vars(array(
- 'S_NOTIFY_POSTER' => $show_notify,
- 'S_APPROVE' => false,
- 'REASON' => $reason,
- 'ADDITIONAL_MSG' => $additional_msg)
- );
+ $redirect = $request->variable('redirect', "index.$phpEx");
+ $redirect = reapply_sid($redirect);
- confirm_box(false, 'DISAPPROVE_POST' . ((sizeof($post_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
- }
+ if (!$success_msg)
+ {
+ redirect($redirect);
+ }
+ else
+ {
+ $message = $user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
- $redirect = request_var('redirect', "index.$phpEx");
- $redirect = reapply_sid($redirect);
+ if ($request->is_ajax())
+ {
+ $json_response = new \phpbb\json_response;
+ $json_response->send(array(
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => null,
+ 'visible' => false,
+ ));
+ }
- if (!$success_msg)
- {
- redirect($redirect);
- }
- else
- {
- meta_refresh(3, $redirect);
- trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>'));
+ meta_refresh(3, $redirect);
+ trigger_error($message);
+ }
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_reports.php b/phpBB/includes/mcp/mcp_reports.php
index b13c8b20c6..8db5bb9727 100644
--- a/phpBB/includes/mcp/mcp_reports.php
+++ b/phpBB/includes/mcp/mcp_reports.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,7 +33,7 @@ class mcp_reports
function main($id, $mode)
{
global $auth, $db, $user, $template, $cache;
- global $config, $phpbb_root_path, $phpEx, $action;
+ global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
@@ -72,7 +71,7 @@ class mcp_reports
// closed reports are accessed by report id
$report_id = request_var('r', 0);
- $sql = 'SELECT r.post_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour
+ $sql = 'SELECT r.post_id, r.user_id, r.report_id, r.report_closed, report_time, r.report_text, r.reported_post_text, r.reported_post_uid, r.reported_post_bitfield, r.reported_post_enable_magic_url, r.reported_post_enable_smilies, r.reported_post_enable_bbcode, rr.reason_title, rr.reason_description, u.username, u.username_clean, u.user_colour
FROM ' . REPORTS_TABLE . ' r, ' . REPORTS_REASONS_TABLE . ' rr, ' . USERS_TABLE . ' u
WHERE ' . (($report_id) ? 'r.report_id = ' . $report_id : "r.post_id = $post_id") . '
AND rr.reason_id = r.reason_id
@@ -88,6 +87,10 @@ class mcp_reports
trigger_error('NO_REPORT');
}
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ $phpbb_notifications->mark_notifications_read('report_post', $post_id, $user->data['user_id']);
+
if (!$report_id && $report['report_closed'])
{
trigger_error('REPORT_CLOSED');
@@ -95,6 +98,10 @@ class mcp_reports
$post_id = $report['post_id'];
$report_id = $report['report_id'];
+
+ $parse_post_flags = $report['reported_post_enable_bbcode'] ? OPTION_FLAG_BBCODE : 0;
+ $parse_post_flags += $report['reported_post_enable_smilies'] ? OPTION_FLAG_SMILIES : 0;
+ $parse_post_flags += $report['reported_post_enable_magic_url'] ? OPTION_FLAG_LINKS : 0;
$post_info = get_post_data(array($post_id), 'm_report', true);
@@ -117,8 +124,9 @@ class mcp_reports
$template->assign_vars(array(
'S_TOPIC_REVIEW' => true,
'S_BBCODE_ALLOWED' => $post_info['enable_bbcode'],
- 'TOPIC_TITLE' => $post_info['topic_title'])
- );
+ 'TOPIC_TITLE' => $post_info['topic_title'],
+ 'REPORTED_POST_ID' => $post_id,
+ ));
}
$topic_tracking_info = $extensions = $attachments = array();
@@ -136,18 +144,7 @@ class mcp_reports
$post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
- // Process message, leave it uncensored
- $message = $post_info['post_text'];
-
- if ($post_info['bbcode_bitfield'])
- {
- include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
- $bbcode = new bbcode($post_info['bbcode_bitfield']);
- $bbcode->bbcode_second_pass($message, $post_info['bbcode_uid'], $post_info['bbcode_bitfield']);
- }
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
$report['report_text'] = make_clickable(bbcode_nl2br($report['report_text']));
if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
@@ -168,7 +165,7 @@ class mcp_reports
if (sizeof($attachments))
{
$update_count = array();
- parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
+ parse_attachments($post_info['forum_id'], $report['reported_post_text'], $attachments, $update_count);
}
// Display not already displayed Attachments for this post, we already parsed them. ;)
@@ -190,7 +187,7 @@ class mcp_reports
'S_CLOSE_ACTION' => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
'S_CAN_VIEWIP' => $auth->acl_get('m_info', $post_info['forum_id']),
'S_POST_REPORTED' => $post_info['post_reported'],
- 'S_POST_UNAPPROVED' => !$post_info['post_approved'],
+ 'S_POST_UNAPPROVED' => ($post_info['post_visibility'] == ITEM_UNAPPROVED),
'S_POST_LOCKED' => $post_info['post_edit_locked'],
'S_REPORT_CLOSED' => $report['report_closed'],
'S_USER_NOTES' => true,
@@ -228,7 +225,7 @@ class mcp_reports
'REPORTER_NAME' => get_username_string('username', $report['user_id'], $report['username'], $report['user_colour']),
'U_VIEW_REPORTER_PROFILE' => get_username_string('profile', $report['user_id'], $report['username'], $report['user_colour']),
- 'POST_PREVIEW' => $message,
+ 'POST_PREVIEW' => generate_text_for_display($report['reported_post_text'], $report['reported_post_uid'], $report['reported_post_bitfield'], $parse_post_flags, false),
'POST_SUBJECT' => ($post_info['post_subject']) ? $post_info['post_subject'] : $user->lang['NO_SUBJECT'],
'POST_DATE' => $user->format_date($post_info['post_time']),
'POST_IP' => $post_info['poster_ip'],
@@ -296,11 +293,11 @@ class mcp_reports
$global_id = $forum_list[0];
- $sql = 'SELECT SUM(forum_topics) as sum_forum_topics
+ $sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
FROM ' . FORUMS_TABLE . '
WHERE ' . $db->sql_in_set('forum_id', $forum_list);
$result = $db->sql_query($sql);
- $forum_info['forum_topics'] = (int) $db->sql_fetchfield('sum_forum_topics');
+ $forum_info['forum_topics_approved'] = (int) $db->sql_fetchfield('sum_forum_topics');
$db->sql_freeresult($result);
}
else
@@ -314,7 +311,6 @@ class mcp_reports
$forum_info = $forum_info[$forum_id];
$forum_list = array($forum_id);
- $global_id = $forum_id;
}
$forum_list[] = 0;
@@ -333,7 +329,7 @@ class mcp_reports
$sort_by_sql = $sort_order_sql = array();
mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
- $forum_topics = ($total == -1) ? $forum_info['forum_topics'] : $total;
+ $forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
$limit_time_sql = ($sort_days) ? 'AND r.report_time >= ' . (time() - ($sort_days * 86400)) : '';
if ($mode == 'reports')
@@ -370,7 +366,7 @@ class mcp_reports
if (sizeof($report_ids))
{
- $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, u.username, u.username_clean, u.user_colour, r.user_id as reporter_id, ru.username as reporter_name, ru.user_colour as reporter_colour, r.report_time, r.report_id
+ $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour, r.user_id as reporter_id, ru.username as reporter_name, ru.user_colour as reporter_colour, r.report_time, r.report_id
FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u, ' . USERS_TABLE . ' ru
WHERE ' . $db->sql_in_set('r.report_id', $report_ids) . '
AND t.topic_id = p.topic_id
@@ -384,14 +380,8 @@ class mcp_reports
$report_data = $rowset = array();
while ($row = $db->sql_fetchrow($result))
{
- $global_topic = ($row['forum_id']) ? false : true;
- if ($global_topic)
- {
- $row['forum_id'] = $global_id;
- }
-
$template->assign_block_vars('postrow', array(
- 'U_VIEWFORUM' => (!$global_topic) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : '',
+ 'U_VIEWFORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
'U_VIEWPOST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']) . '#p' . $row['post_id'],
'U_VIEW_DETAILS' => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=reports&amp;start=$start&amp;mode=report_details&amp;f={$row['forum_id']}&amp;r={$row['report_id']}"),
@@ -405,19 +395,23 @@ class mcp_reports
'REPORTER' => get_username_string('username', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
'U_REPORTER' => get_username_string('profile', $row['reporter_id'], $row['reporter_name'], $row['reporter_colour']),
- 'FORUM_NAME' => (!$global_topic) ? $forum_data[$row['forum_id']]['forum_name'] : $user->lang['GLOBAL_ANNOUNCEMENT'],
+ 'FORUM_NAME' => $forum_data[$row['forum_id']]['forum_name'],
'POST_ID' => $row['post_id'],
'POST_SUBJECT' => ($row['post_subject']) ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
'POST_TIME' => $user->format_date($row['post_time']),
'REPORT_ID' => $row['report_id'],
'REPORT_TIME' => $user->format_date($row['report_time']),
- 'TOPIC_TITLE' => $row['topic_title'])
- );
+ 'TOPIC_TITLE' => $row['topic_title'],
+ 'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
+ ));
}
$db->sql_freeresult($result);
unset($report_ids, $row);
}
+ $base_url = $this->u_action . "&amp;f=$forum_id&amp;t=$topic_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
+
// Now display the page
$template->assign_vars(array(
'L_EXPLAIN' => ($mode == 'reports') ? $user->lang['MCP_REPORTS_OPEN_EXPLAIN'] : $user->lang['MCP_REPORTS_CLOSED_EXPLAIN'],
@@ -428,11 +422,10 @@ class mcp_reports
'S_FORUM_OPTIONS' => $forum_options,
'S_CLOSED' => ($mode == 'reports_closed') ? true : false,
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;f=$forum_id&amp;t=$topic_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir", $total, $config['topics_per_page'], $start),
- 'PAGE_NUMBER' => on_page($total, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $total, $config['topics_per_page'], $start),
'TOPIC_ID' => $topic_id,
'TOTAL' => $total,
- 'TOTAL_REPORTS' => ($total == 1) ? $user->lang['LIST_REPORT'] : sprintf($user->lang['LIST_REPORTS'], $total),
+ 'TOTAL_REPORTS' => $user->lang('LIST_REPORTS', (int) $total),
)
);
@@ -448,7 +441,7 @@ class mcp_reports
function close_report($report_id_list, $mode, $action, $pm = false)
{
global $db, $template, $user, $config, $auth;
- global $phpEx, $phpbb_root_path;
+ global $phpEx, $phpbb_root_path, $phpbb_container;
$pm_where = ($pm) ? ' AND r.post_id = 0 ' : ' AND r.pm_id = 0 ';
$id_column = ($pm) ? 'pm_id' : 'post_id';
@@ -634,11 +627,11 @@ function close_report($report_id_list, $mode, $action, $pm = false)
}
}
- $messenger = new messenger();
-
// Notify reporters
if (sizeof($notify_reporters))
{
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
foreach ($notify_reporters as $report_id => $reporter)
{
if ($reporter['user_id'] == ANONYMOUS)
@@ -648,30 +641,25 @@ function close_report($report_id_list, $mode, $action, $pm = false)
$post_id = $reporter[$id_column];
- $messenger->template((($pm) ? 'pm_report_' : 'report_') . $action . 'd', $reporter['user_lang']);
-
- $messenger->to($reporter['user_email'], $reporter['username']);
- $messenger->im($reporter['user_jabber'], $reporter['username']);
-
if ($pm)
{
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($reporter['username']),
- 'CLOSER_NAME' => htmlspecialchars_decode($user->data['username']),
- 'PM_SUBJECT' => htmlspecialchars_decode(censor_text($post_info[$post_id]['message_subject'])),
- ));
+ $phpbb_notifications->add_notifications('report_pm_closed', array_merge($post_info[$post_id], array(
+ 'reporter' => $reporter['user_id'],
+ 'closer_id' => $user->data['user_id'],
+ 'from_user_id' => $post_info[$post_id]['author_id'],
+ )));
+
+ $phpbb_notifications->delete_notifications('report_pm', $post_id);
}
else
{
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($reporter['username']),
- 'CLOSER_NAME' => htmlspecialchars_decode($user->data['username']),
- 'POST_SUBJECT' => htmlspecialchars_decode(censor_text($post_info[$post_id]['post_subject'])),
- 'TOPIC_TITLE' => htmlspecialchars_decode(censor_text($post_info[$post_id]['topic_title'])))
- );
- }
+ $phpbb_notifications->add_notifications('report_post_closed', array_merge($post_info[$post_id], array(
+ 'reporter' => $reporter['user_id'],
+ 'closer_id' => $user->data['user_id'],
+ )));
- $messenger->send($reporter['user_notify_type']);
+ $phpbb_notifications->delete_notifications('report_post', $post_id);
+ }
}
}
@@ -686,8 +674,6 @@ function close_report($report_id_list, $mode, $action, $pm = false)
unset($notify_reporters, $post_info, $reports);
- $messenger->save_queue();
-
$success_msg = (sizeof($report_id_list) == 1) ? "{$pm_prefix}REPORT_" . strtoupper($action) . 'D_SUCCESS' : "{$pm_prefix}REPORTS_" . strtoupper($action) . 'D_SUCCESS';
}
else
@@ -725,5 +711,3 @@ function close_report($report_id_list, $mode, $action, $pm = false)
trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_forum . $return_topic . sprintf($user->lang['RETURN_PAGE'], "<a href=\"$redirect\">", '</a>'));
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php
index 8e0e89e3da..9c294b96c8 100644
--- a/phpBB/includes/mcp/mcp_topic.php
+++ b/phpBB/includes/mcp/mcp_topic.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -22,7 +21,7 @@ if (!defined('IN_PHPBB'))
function mcp_topic_view($id, $mode, $action)
{
global $phpEx, $phpbb_root_path, $config;
- global $template, $db, $user, $auth, $cache;
+ global $template, $db, $user, $auth, $cache, $phpbb_container;
$url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . extra_url());
@@ -85,8 +84,8 @@ function mcp_topic_view($id, $mode, $action)
$subject = $topic_info['topic_title'];
}
- // Approve posts?
- if ($action == 'approve' && $auth->acl_get('m_approve', $topic_info['forum_id']))
+ // Restore or pprove posts?
+ if (($action == 'restore' || $action == 'approve') && $auth->acl_get('m_approve', $topic_info['forum_id']))
{
include($phpbb_root_path . 'includes/mcp/mcp_queue.' . $phpEx);
include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
@@ -99,7 +98,7 @@ function mcp_topic_view($id, $mode, $action)
if (!$sort)
{
- approve_post($post_id_list, $id, $mode);
+ mcp_queue::approve_posts($action, $post_id_list, $id, $mode);
}
}
@@ -113,17 +112,11 @@ function mcp_topic_view($id, $mode, $action)
mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql);
$limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
if ($total == -1)
{
- if ($auth->acl_get('m_approve', $topic_info['forum_id']))
- {
- $total = $topic_info['topic_replies_real'] + 1;
- }
- else
- {
- $total = $topic_info['topic_replies'] + 1;
- }
+ $total = $phpbb_content_visibility->get_count('topic_posts', $topic_info, $topic_info['forum_id']);
}
$posts_per_page = max(0, request_var('posts_per_page', intval($config['posts_per_page'])));
@@ -146,8 +139,8 @@ function mcp_topic_view($id, $mode, $action)
$sql = 'SELECT u.username, u.username_clean, u.user_colour, p.*
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
WHERE ' . (($action == 'reports') ? 'p.post_reported = 1 AND ' : '') . '
- p.topic_id = ' . $topic_id . ' ' .
- ((!$auth->acl_get('m_approve', $topic_info['forum_id'])) ? ' AND p.post_approved = 1 ' : '') . '
+ p.topic_id = ' . $topic_id . '
+ AND ' . $phpbb_content_visibility->get_visibility_sql('post', $topic_info['forum_id'], 'p.') . '
AND p.poster_id = u.user_id ' .
$limit_time_sql . '
ORDER BY ' . $sort_order_sql;
@@ -183,7 +176,7 @@ function mcp_topic_view($id, $mode, $action)
$topic_tracking_info = get_complete_topic_tracking($topic_info['forum_id'], $topic_id);
}
- $has_unapproved_posts = false;
+ $has_unapproved_posts = $has_deleted_posts = false;
// Grab extensions
$extensions = $attachments = array();
@@ -214,13 +207,8 @@ function mcp_topic_view($id, $mode, $action)
$message = $row['post_text'];
$post_subject = ($row['post_subject'] != '') ? $row['post_subject'] : $topic_info['topic_title'];
- if ($row['bbcode_bitfield'])
- {
- $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
+ $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $message = generate_text_for_display($message, $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, false);
if (!empty($attachments[$row['post_id']]))
{
@@ -228,11 +216,16 @@ function mcp_topic_view($id, $mode, $action)
parse_attachments($topic_info['forum_id'], $message, $attachments[$row['post_id']], $update_count);
}
- if (!$row['post_approved'])
+ if ($row['post_visibility'] == ITEM_UNAPPROVED)
{
$has_unapproved_posts = true;
}
+ if ($row['post_visibility'] == ITEM_DELETED)
+ {
+ $has_deleted_posts = true;
+ }
+
$post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
$template->assign_block_vars('postrow', array(
@@ -250,7 +243,8 @@ function mcp_topic_view($id, $mode, $action)
'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $topic_info['forum_id'])),
- 'S_POST_UNAPPROVED' => (!$row['post_approved'] && $auth->acl_get('m_approve', $topic_info['forum_id'])),
+ 'S_POST_UNAPPROVED' => ($row['post_visibility'] == ITEM_UNAPPROVED && $auth->acl_get('m_approve', $topic_info['forum_id'])),
+ 'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED && $auth->acl_get('m_approve', $topic_info['forum_id'])),
'S_CHECKED' => (($submitted_id_list && !in_array(intval($row['post_id']), $submitted_id_list)) || in_array(intval($row['post_id']), $checked_ids)) ? true : false,
'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false,
@@ -307,6 +301,12 @@ function mcp_topic_view($id, $mode, $action)
'post_ids' => $post_id_list,
));
+ $base_url = append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;t={$topic_info['topic_id']}&amp;mode=$mode&amp;action=$action&amp;to_topic_id=$to_topic_id&amp;posts_per_page=$posts_per_page&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir");
+ if ($posts_per_page)
+ {
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total, $posts_per_page, $start);
+ }
+
$template->assign_vars(array(
'TOPIC_TITLE' => $topic_info['topic_title'],
'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $topic_info['forum_id'] . '&amp;t=' . $topic_info['topic_id']),
@@ -320,6 +320,7 @@ function mcp_topic_view($id, $mode, $action)
'REPORTED_IMG' => $user->img('icon_topic_reported', 'POST_REPORTED'),
'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'),
+ 'DELETED_IMG' => $user->img('icon_topic_deleted', 'POST_DELETED_RESTORE'),
'INFO_IMG' => $user->img('icon_post_info', 'VIEW_INFO'),
'S_MCP_ACTION' => "$url&amp;i=$id&amp;mode=$mode&amp;action=$action&amp;start=$start",
@@ -328,6 +329,7 @@ function mcp_topic_view($id, $mode, $action)
'S_CAN_MERGE' => ($auth->acl_get('m_merge', $topic_info['forum_id'])) ? true : false,
'S_CAN_DELETE' => ($auth->acl_get('m_delete', $topic_info['forum_id'])) ? true : false,
'S_CAN_APPROVE' => ($has_unapproved_posts && $auth->acl_get('m_approve', $topic_info['forum_id'])) ? true : false,
+ 'S_CAN_RESTORE' => ($has_deleted_posts && $auth->acl_get('m_approve', $topic_info['forum_id'])) ? true : false,
'S_CAN_LOCK' => ($auth->acl_get('m_lock', $topic_info['forum_id'])) ? true : false,
'S_CAN_REPORT' => ($auth->acl_get('m_report', $topic_info['forum_id'])) ? true : false,
'S_CAN_SYNC' => $auth->acl_get('m_', $topic_info['forum_id']),
@@ -345,9 +347,8 @@ function mcp_topic_view($id, $mode, $action)
'RETURN_TOPIC' => sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$topic_info['forum_id']}&amp;t={$topic_info['topic_id']}&amp;start=$start") . '">', '</a>'),
'RETURN_FORUM' => sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f={$topic_info['forum_id']}&amp;start=$start") . '">', '</a>'),
- 'PAGE_NUMBER' => on_page($total, $posts_per_page, $start),
- 'PAGINATION' => (!$posts_per_page) ? '' : generate_pagination(append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&amp;t={$topic_info['topic_id']}&amp;mode=$mode&amp;action=$action&amp;to_topic_id=$to_topic_id&amp;posts_per_page=$posts_per_page&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir"), $total, $posts_per_page, $start),
- 'TOTAL_POSTS' => ($total == 1) ? $user->lang['VIEW_TOPIC_POST'] : sprintf($user->lang['VIEW_TOPIC_POSTS'], $total),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $total, $posts_per_page, $start),
+ 'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total),
));
}
@@ -444,7 +445,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
if ($sort_order_sql[0] == 'u')
{
- $sql = 'SELECT p.post_id, p.forum_id, p.post_approved
+ $sql = 'SELECT p.post_id, p.forum_id, p.post_visibility
FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u
WHERE p.topic_id = $topic_id
AND p.poster_id = u.user_id
@@ -453,7 +454,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
}
else
{
- $sql = 'SELECT p.post_id, p.forum_id, p.post_approved
+ $sql = 'SELECT p.post_id, p.forum_id, p.post_visibility
FROM ' . POSTS_TABLE . " p
WHERE p.topic_id = $topic_id
$limit_time_sql
@@ -466,7 +467,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
while ($row = $db->sql_fetchrow($result))
{
// If split from selected post (split_beyond), we split the unapproved items too.
- if (!$row['post_approved'] && !$auth->acl_get('m_approve', $row['forum_id']))
+ if ($row['post_visibility'] == ITEM_UNAPPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
{
// continue;
}
@@ -493,10 +494,10 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
$icon_id = request_var('icon', 0);
$sql_ary = array(
- 'forum_id' => $to_forum_id,
- 'topic_title' => $subject,
- 'icon_id' => $icon_id,
- 'topic_approved'=> 1
+ 'forum_id' => $to_forum_id,
+ 'topic_title' => $subject,
+ 'icon_id' => $icon_id,
+ 'topic_visibility' => 1
);
$sql = 'INSERT INTO ' . TOPICS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
@@ -573,7 +574,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
confirm_box(false, ($action == 'split_all') ? 'SPLIT_TOPIC_ALL' : 'SPLIT_TOPIC_BEYOND', $s_hidden_fields);
}
- $redirect = request_var('redirect', "index.$phpEx");
+ $redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
$redirect = reapply_sid($redirect);
if (!$success_msg)
@@ -582,7 +583,7 @@ function split_topic($action, $topic_id, $to_forum_id, $subject)
}
else
{
- meta_refresh(3, append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$to_forum_id&amp;t=$to_topic_id"));
+ meta_refresh(3, $redirect);
trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
}
}
@@ -682,7 +683,7 @@ function merge_posts($topic_id, $to_topic_id)
confirm_box(false, 'MERGE_POSTS', $s_hidden_fields);
}
- $redirect = request_var('redirect', "index.$phpEx");
+ $redirect = request_var('redirect', "{$phpbb_root_path}viewtopic.$phpEx?f=$to_forum_id&amp;t=$to_topic_id");
$redirect = reapply_sid($redirect);
if (!$success_msg)
@@ -691,9 +692,7 @@ function merge_posts($topic_id, $to_topic_id)
}
else
{
- meta_refresh(3, append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$to_forum_id&amp;t=$to_topic_id"));
+ meta_refresh(3, $redirect);
trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/mcp/mcp_warn.php b/phpBB/includes/mcp/mcp_warn.php
index 1016204ff8..3ffd75ac78 100644
--- a/phpBB/includes/mcp/mcp_warn.php
+++ b/phpBB/includes/mcp/mcp_warn.php
@@ -2,9 +2,8 @@
/**
*
* @package mcp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -176,6 +175,9 @@ class mcp_warn
));
}
+ $base_url = append_sid("{$phpbb_root_path}mcp.$phpEx", "i=warn&amp;mode=list&amp;st=$st&amp;sk=$sk&amp;sd=$sd");
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $user_count, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
'U_POST_ACTION' => $this->u_action,
'S_CLEAR_ALLOWED' => ($auth->acl_get('a_clearlogs')) ? true : false,
@@ -183,9 +185,8 @@ class mcp_warn
'S_SELECT_SORT_KEY' => $s_sort_key,
'S_SELECT_SORT_DAYS' => $s_limit_days,
- 'PAGE_NUMBER' => on_page($user_count, $config['topics_per_page'], $start),
- 'PAGINATION' => generate_pagination(append_sid("{$phpbb_root_path}mcp.$phpEx", "i=warn&amp;mode=list&amp;st=$st&amp;sk=$sk&amp;sd=$sd"), $user_count, $config['topics_per_page'], $start),
- 'TOTAL_USERS' => ($user_count == 1) ? $user->lang['LIST_USER'] : sprintf($user->lang['LIST_USERS'], $user_count),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $user_count, $config['topics_per_page'], $start),
+ 'TOTAL_USERS' => $user->lang('LIST_USERS', (int) $user_count),
));
}
@@ -252,7 +253,7 @@ class mcp_warn
// Check if can send a notification
if ($config['allow_privmsg'])
{
- $auth2 = new auth();
+ $auth2 = new \phpbb\auth\auth();
$auth2->acl($user_row);
$s_can_notify = ($auth2->acl_get('u_readpm')) ? true : false;
unset($auth2);
@@ -288,28 +289,17 @@ class mcp_warn
// We want to make the message available here as a reminder
// Parse the message and subject
- $message = censor_text($user_row['post_text']);
-
- // Second parse bbcode here
- if ($user_row['bbcode_bitfield'])
- {
- include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
-
- $bbcode = new bbcode($user_row['bbcode_bitfield']);
- $bbcode->bbcode_second_pass($message, $user_row['bbcode_uid'], $user_row['bbcode_bitfield']);
- }
-
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
+ $parse_flags = OPTION_FLAG_SMILIES | ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0);
+ $message = generate_text_for_display($user_row['post_text'], $user_row['bbcode_uid'], $user_row['bbcode_bitfield'], $parse_flags, true);
// Generate the appropriate user information for the user we are looking at
- if (!function_exists('get_user_avatar'))
+ if (!function_exists('phpbb_get_user_avatar'))
{
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
}
get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src);
- $avatar_img = get_user_avatar($user_row['user_avatar'], $user_row['user_avatar_type'], $user_row['user_avatar_width'], $user_row['user_avatar_height']);
+ $avatar_img = phpbb_get_user_avatar($user_row);
$template->assign_vars(array(
'U_POST_ACTION' => $this->u_action,
@@ -375,7 +365,7 @@ class mcp_warn
// Check if can send a notification
if ($config['allow_privmsg'])
{
- $auth2 = new auth();
+ $auth2 = new \phpbb\auth\auth();
$auth2->acl($user_row);
$s_can_notify = ($auth2->acl_get('u_readpm')) ? true : false;
unset($auth2);
@@ -408,13 +398,13 @@ class mcp_warn
}
// Generate the appropriate user information for the user we are looking at
- if (!function_exists('get_user_avatar'))
+ if (!function_exists('phpbb_get_user_avatar'))
{
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
}
get_user_rank($user_row['user_rank'], $user_row['user_posts'], $rank_title, $rank_img, $rank_img_src);
- $avatar_img = get_user_avatar($user_row['user_avatar'], $user_row['user_avatar_type'], $user_row['user_avatar_width'], $user_row['user_avatar_height']);
+ $avatar_img = phpbb_get_user_avatar($user_row);
// OK, they didn't submit a warning so lets build the page for them to do so
$template->assign_vars(array(
@@ -507,5 +497,3 @@ function add_warning($user_row, $warning, $send_pm = true, $post_id = 0)
add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_USER_WARNING', $user_row['username']);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/message_parser.php b/phpBB/includes/message_parser.php
index a134fab5d3..3e348801c7 100644
--- a/phpBB/includes/message_parser.php
+++ b/phpBB/includes/message_parser.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -210,7 +209,7 @@ class bbcode_firstpass extends bbcode
if ($config['max_' . $this->mode . '_font_size'] && $config['max_' . $this->mode . '_font_size'] < $stx)
{
- $this->warn_msg[] = sprintf($user->lang['MAX_FONT_SIZE_EXCEEDED'], $config['max_' . $this->mode . '_font_size']);
+ $this->warn_msg[] = $user->lang('MAX_FONT_SIZE_EXCEEDED', (int) $config['max_' . $this->mode . '_font_size']);
return '[size=' . $stx . ']' . $in . '[/size]';
}
@@ -319,13 +318,13 @@ class bbcode_firstpass extends bbcode
if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $stats[1])
{
$error = true;
- $this->warn_msg[] = sprintf($user->lang['MAX_IMG_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']);
+ $this->warn_msg[] = $user->lang('MAX_IMG_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']);
}
if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $stats[0])
{
$error = true;
- $this->warn_msg[] = sprintf($user->lang['MAX_IMG_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']);
+ $this->warn_msg[] = $user->lang('MAX_IMG_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']);
}
}
}
@@ -374,13 +373,13 @@ class bbcode_firstpass extends bbcode
if ($config['max_' . $this->mode . '_img_height'] && $config['max_' . $this->mode . '_img_height'] < $height)
{
$error = true;
- $this->warn_msg[] = sprintf($user->lang['MAX_FLASH_HEIGHT_EXCEEDED'], $config['max_' . $this->mode . '_img_height']);
+ $this->warn_msg[] = $user->lang('MAX_FLASH_HEIGHT_EXCEEDED', (int) $config['max_' . $this->mode . '_img_height']);
}
if ($config['max_' . $this->mode . '_img_width'] && $config['max_' . $this->mode . '_img_width'] < $width)
{
$error = true;
- $this->warn_msg[] = sprintf($user->lang['MAX_FLASH_WIDTH_EXCEEDED'], $config['max_' . $this->mode . '_img_width']);
+ $this->warn_msg[] = $user->lang('MAX_FLASH_WIDTH_EXCEEDED', (int) $config['max_' . $this->mode . '_img_width']);
}
}
@@ -703,17 +702,6 @@ class bbcode_firstpass extends bbcode
{
global $config, $user;
- /**
- * If you change this code, make sure the cases described within the following reports are still working:
- * #3572 - [quote="[test]test"]test [ test[/quote] - (correct: parsed)
- * #14667 - [quote]test[/quote] test ] and [ test [quote]test[/quote] (correct: parsed)
- * #14770 - [quote="["]test[/quote] (correct: parsed)
- * [quote="[i]test[/i]"]test[/quote] (correct: parsed)
- * [quote="[quote]test[/quote]"]test[/quote] (correct: parsed - Username displayed as [quote]test[/quote])
- * #20735 - [quote]test[/[/b]quote] test [/quote][/quote] test - (correct: quoted: "test[/[/b]quote] test" / non-quoted: "[/quote] test" - also failed if layout distorted)
- * #40565 - [quote="a"]a[/quote][quote="a]a[/quote] (correct: first quote tag parsed, second quote tag unparsed)
- */
-
$in = str_replace("\r\n", "\n", str_replace('\"', '"', trim($in)));
if (!$in)
@@ -772,7 +760,7 @@ class bbcode_firstpass extends bbcode
if ($config['max_quote_depth'] && sizeof($close_tags) >= $config['max_quote_depth'])
{
// there are too many nested quotes
- $error_ary['quote_depth'] = sprintf($user->lang['QUOTE_DEPTH_EXCEEDED'], $config['max_quote_depth']);
+ $error_ary['quote_depth'] = $user->lang('QUOTE_DEPTH_EXCEEDED', (int) $config['max_quote_depth']);
$out .= $buffer . $tok;
$tok = '[]';
@@ -1117,7 +1105,7 @@ class parse_message extends bbcode_firstpass
// Maximum message length check. 0 disables this check completely.
if ((int) $config['max_' . $mode . '_chars'] > 0 && $message_length > (int) $config['max_' . $mode . '_chars'])
{
- $this->warn_msg[] = sprintf($user->lang['TOO_MANY_CHARS_' . strtoupper($mode)], $message_length, (int) $config['max_' . $mode . '_chars']);
+ $this->warn_msg[] = $user->lang('TOO_MANY_CHARS_' . strtoupper($mode), $message_length, (int) $config['max_' . $mode . '_chars']);
return (!$update_this_message) ? $return_message : $this->warn_msg;
}
@@ -1126,7 +1114,7 @@ class parse_message extends bbcode_firstpass
{
if (!$message_length || $message_length < (int) $config['min_post_chars'])
{
- $this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : sprintf($user->lang['TOO_FEW_CHARS_LIMIT'], $message_length, (int) $config['min_post_chars']);
+ $this->warn_msg[] = (!$message_length) ? $user->lang['TOO_FEW_CHARS'] : $user->lang('TOO_FEW_CHARS_LIMIT', $message_length, (int) $config['min_post_chars']);
return (!$update_this_message) ? $return_message : $this->warn_msg;
}
}
@@ -1364,13 +1352,14 @@ class parse_message extends bbcode_firstpass
*/
function parse_attachments($form_name, $mode, $forum_id, $submit, $preview, $refresh, $is_message = false)
{
- global $config, $auth, $user, $phpbb_root_path, $phpEx, $db;
+ global $config, $auth, $user, $phpbb_root_path, $phpEx, $db, $request;
$error = array();
$num_attachments = sizeof($this->attachment_data);
$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true));
- $upload_file = (isset($_FILES[$form_name]) && $_FILES[$form_name]['name'] != 'none' && trim($_FILES[$form_name]['name'])) ? true : false;
+ $upload = $request->file($form_name);
+ $upload_file = (!empty($upload) && $upload['name'] !== 'none' && trim($upload['name']));
$add_file = (isset($_POST['add_file'])) ? true : false;
$delete_file = (isset($_POST['delete_file'])) ? true : false;
@@ -1445,7 +1434,7 @@ class parse_message extends bbcode_firstpass
}
else
{
- $error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']);
+ $error[] = $user->lang('TOO_MANY_ATTACHMENTS', (int) $cfg['max_attachments']);
}
}
@@ -1536,7 +1525,7 @@ class parse_message extends bbcode_firstpass
}
else
{
- $error[] = sprintf($user->lang['TOO_MANY_ATTACHMENTS'], $cfg['max_attachments']);
+ $error[] = $user->lang('TOO_MANY_ATTACHMENTS', (int) $cfg['max_attachments']);
}
}
}
@@ -1553,9 +1542,10 @@ class parse_message extends bbcode_firstpass
function get_submitted_attachment_data($check_user_id = false)
{
global $user, $db, $phpbb_root_path, $phpEx, $config;
+ global $request;
$this->filename_data['filecomment'] = utf8_normalize_nfc(request_var('filecomment', '', true));
- $attachment_data = (isset($_POST['attachment_data'])) ? $_POST['attachment_data'] : array();
+ $attachment_data = $request->variable('attachment_data', array(0 => array('' => '')), true, \phpbb\request\request_interface::POST);
$this->attachment_data = array();
$check_user_id = ($check_user_id === false) ? $user->data['user_id'] : $check_user_id;
@@ -1593,7 +1583,7 @@ class parse_message extends bbcode_firstpass
{
$pos = $not_orphan[$row['attach_id']];
$this->attachment_data[$pos] = $row;
- set_var($this->attachment_data[$pos]['attach_comment'], $_POST['attachment_data'][$pos]['attach_comment'], 'string', true);
+ $this->attachment_data[$pos]['attach_comment'] = $attachment_data[$pos]['attach_comment'];
unset($not_orphan[$row['attach_id']]);
}
@@ -1619,7 +1609,7 @@ class parse_message extends bbcode_firstpass
{
$pos = $orphan[$row['attach_id']];
$this->attachment_data[$pos] = $row;
- set_var($this->attachment_data[$pos]['attach_comment'], $_POST['attachment_data'][$pos]['attach_comment'], 'string', true);
+ $this->attachment_data[$pos]['attach_comment'] = $attachment_data[$pos]['attach_comment'];
unset($orphan[$row['attach_id']]);
}
@@ -1698,5 +1688,3 @@ class parse_message extends bbcode_firstpass
$poll['poll_max_options'] = ($poll['poll_max_options'] < 1) ? 1 : (($poll['poll_max_options'] > $config['max_poll_options']) ? $config['max_poll_options'] : $poll['poll_max_options']);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/questionnaire/questionnaire.php b/phpBB/includes/questionnaire/questionnaire.php
index 3268775cb6..6f2727a38c 100644
--- a/phpBB/includes/questionnaire/questionnaire.php
+++ b/phpBB/includes/questionnaire/questionnaire.php
@@ -2,9 +2,8 @@
/**
*
* @package phpBB3
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -148,23 +147,15 @@ class phpbb_questionnaire_system_data_provider
*/
function get_data()
{
- // Start discovering the IPV4 server address, if available
- $server_address = '0.0.0.0';
+ global $request;
- if (!empty($_SERVER['SERVER_ADDR']))
- {
- $server_address = $_SERVER['SERVER_ADDR'];
- }
-
- // Running on IIS?
- if (!empty($_SERVER['LOCAL_ADDR']))
- {
- $server_address = $_SERVER['LOCAL_ADDR'];
- }
+ // Start discovering the IPV4 server address, if available
+ // Try apache, IIS, fall back to 0.0.0.0
+ $server_address = htmlspecialchars_decode($request->server('SERVER_ADDR', $request->server('LOCAL_ADDR', '0.0.0.0')));
return array(
'os' => PHP_OS,
- 'httpd' => $_SERVER['SERVER_SOFTWARE'],
+ 'httpd' => htmlspecialchars_decode($request->server('SERVER_SOFTWARE')),
// we don't want the real IP address (for privacy policy reasons) but only
// a network address to see whether your installation is running on a private or public network.
'private_ip' => $this->is_private_ip($server_address),
@@ -269,6 +260,8 @@ class phpbb_questionnaire_phpbb_data_provider
include("{$phpbb_root_path}config.$phpEx");
unset($dbhost, $dbport, $dbname, $dbuser, $dbpasswd); // Just a precaution
+ $dbms = phpbb_convert_30_dbms_to_31($dbms);
+
// Only send certain config vars
$config_vars = array(
'active_sessions' => true,
@@ -313,7 +306,6 @@ class phpbb_questionnaire_phpbb_data_provider
'avatar_max_width' => true,
'avatar_min_height' => true,
'avatar_min_width' => true,
- 'board_dst' => true,
'board_email_form' => true,
'board_hide_emails' => true,
'board_timezone' => true,
@@ -482,17 +474,16 @@ class phpbb_questionnaire_phpbb_data_provider
}
}
- global $db;
+ global $db, $request;
$result['dbms'] = $dbms;
$result['acm_type'] = $acm_type;
- $result['load_extensions'] = $load_extensions;
$result['user_agent'] = 'Unknown';
$result['dbms_version'] = $db->sql_server_info(true);
// Try to get user agent vendor and version
$match = array();
- $user_agent = (!empty($_SERVER['HTTP_USER_AGENT'])) ? (string) $_SERVER['HTTP_USER_AGENT'] : '';
+ $user_agent = $request->header('User-Agent');
$agents = array('firefox', 'msie', 'opera', 'chrome', 'safari', 'mozilla', 'seamonkey', 'konqueror', 'netscape', 'gecko', 'navigator', 'mosaic', 'lynx', 'amaya', 'omniweb', 'avant', 'camino', 'flock', 'aol');
// We check here 1 by 1 because some strings occur after others (for example Mozilla [...] Firefox/)
@@ -508,5 +499,3 @@ class phpbb_questionnaire_phpbb_data_provider
return $result;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/search/fulltext_mysql.php b/phpBB/includes/search/fulltext_mysql.php
deleted file mode 100644
index f28b8885e7..0000000000
--- a/phpBB/includes/search/fulltext_mysql.php
+++ /dev/null
@@ -1,943 +0,0 @@
-<?php
-/**
-*
-* @package search
-* @version $Id$
-* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* @ignore
-*/
-include_once($phpbb_root_path . 'includes/search/search.' . $phpEx);
-
-/**
-* fulltext_mysql
-* Fulltext search for MySQL
-* @package search
-*/
-class fulltext_mysql extends search_backend
-{
- var $stats = array();
- var $word_length = array();
- var $split_words = array();
- var $search_query;
- var $common_words = array();
- var $pcre_properties = false;
- var $mbstring_regex = false;
-
- function fulltext_mysql(&$error)
- {
- global $config;
-
- $this->word_length = array('min' => $config['fulltext_mysql_min_word_len'], 'max' => $config['fulltext_mysql_max_word_len']);
-
- if (version_compare(PHP_VERSION, '5.1.0', '>=') || (version_compare(PHP_VERSION, '5.0.0-dev', '<=') && version_compare(PHP_VERSION, '4.4.0', '>=')))
- {
- // While this is the proper range of PHP versions, PHP may not be linked with the bundled PCRE lib and instead with an older version
- if (@preg_match('/\p{L}/u', 'a') !== false)
- {
- $this->pcre_properties = true;
- }
- }
-
- if (function_exists('mb_ereg'))
- {
- $this->mbstring_regex = true;
- mb_regex_encoding('UTF-8');
- }
-
- $error = false;
- }
-
- /**
- * Checks for correct MySQL version and stores min/max word length in the config
- */
- function init()
- {
- global $db, $user;
-
- if ($db->sql_layer != 'mysql4' && $db->sql_layer != 'mysqli')
- {
- return $user->lang['FULLTEXT_MYSQL_INCOMPATIBLE_VERSION'];
- }
-
- $result = $db->sql_query('SHOW TABLE STATUS LIKE \'' . POSTS_TABLE . '\'');
- $info = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- $engine = '';
- if (isset($info['Engine']))
- {
- $engine = $info['Engine'];
- }
- else if (isset($info['Type']))
- {
- $engine = $info['Type'];
- }
-
- $fulltext_supported =
- $engine === 'MyISAM' ||
- // FULLTEXT is supported on InnoDB since MySQL 5.6.4 according to
- // http://dev.mysql.com/doc/refman/5.6/en/innodb-storage-engine.html
- $engine === 'InnoDB' &&
- phpbb_version_compare($db->sql_server_info(true), '5.6.4', '>=');
-
- if (!$fulltext_supported)
- {
- return $user->lang['FULLTEXT_MYSQL_NOT_SUPPORTED'];
- }
-
- $sql = 'SHOW VARIABLES
- LIKE \'ft\_%\'';
- $result = $db->sql_query($sql);
-
- $mysql_info = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $mysql_info[$row['Variable_name']] = $row['Value'];
- }
- $db->sql_freeresult($result);
-
- set_config('fulltext_mysql_max_word_len', $mysql_info['ft_max_word_len']);
- set_config('fulltext_mysql_min_word_len', $mysql_info['ft_min_word_len']);
-
- return false;
- }
-
- /**
- * Splits keywords entered by a user into an array of words stored in $this->split_words
- * Stores the tidied search query in $this->search_query
- *
- * @param string &$keywords Contains the keyword as entered by the user
- * @param string $terms is either 'all' or 'any'
- * @return bool false if no valid keywords were found and otherwise true
- */
- function split_keywords(&$keywords, $terms)
- {
- global $config, $user;
-
- if ($terms == 'all')
- {
- $match = array('#\sand\s#iu', '#\sor\s#iu', '#\snot\s#iu', '#(^|\s)\+#', '#(^|\s)-#', '#(^|\s)\|#');
- $replace = array(' +', ' |', ' -', ' +', ' -', ' |');
-
- $keywords = preg_replace($match, $replace, $keywords);
- }
-
- // Filter out as above
- $split_keywords = preg_replace("#[\n\r\t]+#", ' ', trim(htmlspecialchars_decode($keywords)));
-
- // Split words
- if ($this->pcre_properties)
- {
- $split_keywords = preg_replace('#([^\p{L}\p{N}\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));
- }
- else if ($this->mbstring_regex)
- {
- $split_keywords = mb_ereg_replace('([^\w\'*"()])', '\\1\\1', str_replace('\'\'', '\' \'', trim($split_keywords)));
- }
- else
- {
- $split_keywords = preg_replace('#([^\w\'*"()])#u', '$1$1', str_replace('\'\'', '\' \'', trim($split_keywords)));
- }
-
- if ($this->pcre_properties)
- {
- $matches = array();
- preg_match_all('#(?:[^\p{L}\p{N}*"()]|^)([+\-|]?(?:[\p{L}\p{N}*"()]+\'?)*[\p{L}\p{N}*"()])(?:[^\p{L}\p{N}*"()]|$)#u', $split_keywords, $matches);
- $this->split_words = $matches[1];
- }
- else if ($this->mbstring_regex)
- {
- mb_ereg_search_init($split_keywords, '(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)');
-
- while (($word = mb_ereg_search_regs()))
- {
- $this->split_words[] = $word[1];
- }
- }
- else
- {
- $matches = array();
- preg_match_all('#(?:[^\w*"()]|^)([+\-|]?(?:[\w*"()]+\'?)*[\w*"()])(?:[^\w*"()]|$)#u', $split_keywords, $matches);
- $this->split_words = $matches[1];
- }
-
- // We limit the number of allowed keywords to minimize load on the database
- if ($config['max_num_search_keywords'] && sizeof($this->split_words) > $config['max_num_search_keywords'])
- {
- trigger_error($user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', $config['max_num_search_keywords'], sizeof($this->split_words)));
- }
-
- // to allow phrase search, we need to concatenate quoted words
- $tmp_split_words = array();
- $phrase = '';
- foreach ($this->split_words as $word)
- {
- if ($phrase)
- {
- $phrase .= ' ' . $word;
- if (strpos($word, '"') !== false && substr_count($word, '"') % 2 == 1)
- {
- $tmp_split_words[] = $phrase;
- $phrase = '';
- }
- }
- else if (strpos($word, '"') !== false && substr_count($word, '"') % 2 == 1)
- {
- $phrase = $word;
- }
- else
- {
- $tmp_split_words[] = $word . ' ';
- }
- }
- if ($phrase)
- {
- $tmp_split_words[] = $phrase;
- }
-
- $this->split_words = $tmp_split_words;
-
- unset($tmp_split_words);
- unset($phrase);
-
- foreach ($this->split_words as $i => $word)
- {
- $clean_word = preg_replace('#^[+\-|"]#', '', $word);
-
- // check word length
- $clean_len = utf8_strlen(str_replace('*', '', $clean_word));
- if (($clean_len < $config['fulltext_mysql_min_word_len']) || ($clean_len > $config['fulltext_mysql_max_word_len']))
- {
- $this->common_words[] = $word;
- unset($this->split_words[$i]);
- }
- }
-
- if ($terms == 'any')
- {
- $this->search_query = '';
- foreach ($this->split_words as $word)
- {
- if ((strpos($word, '+') === 0) || (strpos($word, '-') === 0) || (strpos($word, '|') === 0))
- {
- $word = substr($word, 1);
- }
- $this->search_query .= $word . ' ';
- }
- }
- else
- {
- $this->search_query = '';
- foreach ($this->split_words as $word)
- {
- if ((strpos($word, '+') === 0) || (strpos($word, '-') === 0))
- {
- $this->search_query .= $word . ' ';
- }
- else if (strpos($word, '|') === 0)
- {
- $this->search_query .= substr($word, 1) . ' ';
- }
- else
- {
- $this->search_query .= '+' . $word . ' ';
- }
- }
- }
-
- $this->search_query = utf8_htmlspecialchars($this->search_query);
-
- if ($this->search_query)
- {
- $this->split_words = array_values($this->split_words);
- sort($this->split_words);
- return true;
- }
- return false;
- }
-
- /**
- * Turns text into an array of words
- */
- function split_message($text)
- {
- global $config;
-
- // Split words
- if ($this->pcre_properties)
- {
- $text = preg_replace('#([^\p{L}\p{N}\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text)));
- }
- else if ($this->mbstring_regex)
- {
- $text = mb_ereg_replace('([^\w\'*])', '\\1\\1', str_replace('\'\'', '\' \'', trim($text)));
- }
- else
- {
- $text = preg_replace('#([^\w\'*])#u', '$1$1', str_replace('\'\'', '\' \'', trim($text)));
- }
-
- if ($this->pcre_properties)
- {
- $matches = array();
- preg_match_all('#(?:[^\p{L}\p{N}*]|^)([+\-|]?(?:[\p{L}\p{N}*]+\'?)*[\p{L}\p{N}*])(?:[^\p{L}\p{N}*]|$)#u', $text, $matches);
- $text = $matches[1];
- }
- else if ($this->mbstring_regex)
- {
- mb_ereg_search_init($text, '(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)');
-
- $text = array();
- while (($word = mb_ereg_search_regs()))
- {
- $text[] = $word[1];
- }
- }
- else
- {
- $matches = array();
- preg_match_all('#(?:[^\w*]|^)([+\-|]?(?:[\w*]+\'?)*[\w*])(?:[^\w*]|$)#u', $text, $matches);
- $text = $matches[1];
- }
-
- // remove too short or too long words
- $text = array_values($text);
- for ($i = 0, $n = sizeof($text); $i < $n; $i++)
- {
- $text[$i] = trim($text[$i]);
- if (utf8_strlen($text[$i]) < $config['fulltext_mysql_min_word_len'] || utf8_strlen($text[$i]) > $config['fulltext_mysql_max_word_len'])
- {
- unset($text[$i]);
- }
- }
-
- return array_values($text);
- }
-
- /**
- * Performs a search on keywords depending on display specific params. You have to run split_keywords() first.
- *
- * @param string $type contains either posts or topics depending on what should be searched for
- * @param string $fields contains either titleonly (topic titles should be searched), msgonly (only message bodies should be searched), firstpost (only subject and body of the first post should be searched) or all (all post bodies and subjects should be searched)
- * @param string $terms is either 'all' (use query as entered, words without prefix should default to "have to be in field") or 'any' (ignore search query parts and just return all posts that contain any of the specified words)
- * @param array $sort_by_sql contains SQL code for the ORDER BY part of a query
- * @param string $sort_key is the key of $sort_by_sql for the selected sorting
- * @param string $sort_dir is either a or d representing ASC and DESC
- * @param string $sort_days specifies the maximum amount of days a post may be old
- * @param array $ex_fid_ary specifies an array of forum ids which should not be searched
- * @param array $m_approve_fid_ary specifies an array of forum ids in which the searcher is allowed to view unapproved posts
- * @param int $topic_id is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
- * @param array $author_ary an array of author ids if the author should be ignored during the search the array is empty
- * @param string $author_name specifies the author match, when ANONYMOUS is also a search-match
- * @param array &$id_ary passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
- * @param int $start indicates the first index of the page
- * @param int $per_page number of ids each page is supposed to contain
- * @return boolean|int total number of results
- *
- * @access public
- */
- function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
- {
- global $config, $db;
-
- // No keywords? No posts.
- if (!$this->search_query)
- {
- return false;
- }
-
- // generate a search_key from all the options to identify the results
- $search_key = md5(implode('#', array(
- implode(', ', $this->split_words),
- $type,
- $fields,
- $terms,
- $sort_days,
- $sort_key,
- $topic_id,
- implode(',', $ex_fid_ary),
- implode(',', $m_approve_fid_ary),
- implode(',', $author_ary)
- )));
-
- // try reading the results from cache
- $result_count = 0;
- if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
- {
- return $result_count;
- }
-
- $id_ary = array();
-
- $join_topic = ($type == 'posts') ? false : true;
-
- // Build sql strings for sorting
- $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
- $sql_sort_table = $sql_sort_join = '';
-
- switch ($sql_sort[0])
- {
- case 'u':
- $sql_sort_table = USERS_TABLE . ' u, ';
- $sql_sort_join = ($type == 'posts') ? ' AND u.user_id = p.poster_id ' : ' AND u.user_id = t.topic_poster ';
- break;
-
- case 't':
- $join_topic = true;
- break;
-
- case 'f':
- $sql_sort_table = FORUMS_TABLE . ' f, ';
- $sql_sort_join = ' AND f.forum_id = p.forum_id ';
- break;
- }
-
- // Build some display specific sql strings
- switch ($fields)
- {
- case 'titleonly':
- $sql_match = 'p.post_subject';
- $sql_match_where = ' AND p.post_id = t.topic_first_post_id';
- $join_topic = true;
- break;
-
- case 'msgonly':
- $sql_match = 'p.post_text';
- $sql_match_where = '';
- break;
-
- case 'firstpost':
- $sql_match = 'p.post_subject, p.post_text';
- $sql_match_where = ' AND p.post_id = t.topic_first_post_id';
- $join_topic = true;
- break;
-
- default:
- $sql_match = 'p.post_subject, p.post_text';
- $sql_match_where = '';
- break;
- }
-
- if (!sizeof($m_approve_fid_ary))
- {
- $m_approve_fid_sql = ' AND p.post_approved = 1';
- }
- else if ($m_approve_fid_ary === array(-1))
- {
- $m_approve_fid_sql = '';
- }
- else
- {
- $m_approve_fid_sql = ' AND (p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
- }
-
- $sql_select = (!$result_count) ? 'SQL_CALC_FOUND_ROWS ' : '';
- $sql_select = ($type == 'posts') ? $sql_select . 'p.post_id' : 'DISTINCT ' . $sql_select . 't.topic_id';
- $sql_from = ($join_topic) ? TOPICS_TABLE . ' t, ' : '';
- $field = ($type == 'posts') ? 'post_id' : 'topic_id';
- if (sizeof($author_ary) && $author_name)
- {
- // first one matches post of registered users, second one guests and deleted users
- $sql_author = ' AND (' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
- }
- else if (sizeof($author_ary))
- {
- $sql_author = ' AND ' . $db->sql_in_set('p.poster_id', $author_ary);
- }
- else
- {
- $sql_author = '';
- }
-
- $sql_where_options = $sql_sort_join;
- $sql_where_options .= ($topic_id) ? ' AND p.topic_id = ' . $topic_id : '';
- $sql_where_options .= ($join_topic) ? ' AND t.topic_id = p.topic_id' : '';
- $sql_where_options .= (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
- $sql_where_options .= $m_approve_fid_sql;
- $sql_where_options .= $sql_author;
- $sql_where_options .= ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
- $sql_where_options .= $sql_match_where;
-
- $sql = "SELECT $sql_select
- FROM $sql_from$sql_sort_table" . POSTS_TABLE . " p
- WHERE MATCH ($sql_match) AGAINST ('" . $db->sql_escape(htmlspecialchars_decode($this->search_query)) . "' IN BOOLEAN MODE)
- $sql_where_options
- ORDER BY $sql_sort";
- $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $id_ary[] = (int) $row[$field];
- }
- $db->sql_freeresult($result);
-
- $id_ary = array_unique($id_ary);
-
- if (!sizeof($id_ary))
- {
- return false;
- }
-
- // if the total result count is not cached yet, retrieve it from the db
- if (!$result_count)
- {
- $sql = 'SELECT FOUND_ROWS() as result_count';
- $result = $db->sql_query($sql);
- $result_count = (int) $db->sql_fetchfield('result_count');
- $db->sql_freeresult($result);
-
- if (!$result_count)
- {
- return false;
- }
- }
-
- // store the ids, from start on then delete anything that isn't on the current page because we only need ids for one page
- $this->save_ids($search_key, implode(' ', $this->split_words), $author_ary, $result_count, $id_ary, $start, $sort_dir);
- $id_ary = array_slice($id_ary, 0, (int) $per_page);
-
- return $result_count;
- }
-
- /**
- * Performs a search on an author's posts without caring about message contents. Depends on display specific params
- *
- * @param string $type contains either posts or topics depending on what should be searched for
- * @param boolean $firstpost_only if true, only topic starting posts will be considered
- * @param array $sort_by_sql contains SQL code for the ORDER BY part of a query
- * @param string $sort_key is the key of $sort_by_sql for the selected sorting
- * @param string $sort_dir is either a or d representing ASC and DESC
- * @param string $sort_days specifies the maximum amount of days a post may be old
- * @param array $ex_fid_ary specifies an array of forum ids which should not be searched
- * @param array $m_approve_fid_ary specifies an array of forum ids in which the searcher is allowed to view unapproved posts
- * @param int $topic_id is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
- * @param array $author_ary an array of author ids
- * @param string $author_name specifies the author match, when ANONYMOUS is also a search-match
- * @param array &$id_ary passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
- * @param int $start indicates the first index of the page
- * @param int $per_page number of ids each page is supposed to contain
- * @return boolean|int total number of results
- *
- * @access public
- */
- function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
- {
- global $config, $db;
-
- // No author? No posts.
- if (!sizeof($author_ary))
- {
- return 0;
- }
-
- // generate a search_key from all the options to identify the results
- $search_key = md5(implode('#', array(
- '',
- $type,
- ($firstpost_only) ? 'firstpost' : '',
- '',
- '',
- $sort_days,
- $sort_key,
- $topic_id,
- implode(',', $ex_fid_ary),
- implode(',', $m_approve_fid_ary),
- implode(',', $author_ary),
- $author_name,
- )));
-
- // try reading the results from cache
- $result_count = 0;
- if ($this->obtain_ids($search_key, $result_count, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
- {
- return $result_count;
- }
-
- $id_ary = array();
-
- // Create some display specific sql strings
- if ($author_name)
- {
- // first one matches post of registered users, second one guests and deleted users
- $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
- }
- else
- {
- $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
- }
- $sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
- $sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
- $sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
- $sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
-
- // Build sql strings for sorting
- $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
- $sql_sort_table = $sql_sort_join = '';
- switch ($sql_sort[0])
- {
- case 'u':
- $sql_sort_table = USERS_TABLE . ' u, ';
- $sql_sort_join = ($type == 'posts') ? ' AND u.user_id = p.poster_id ' : ' AND u.user_id = t.topic_poster ';
- break;
-
- case 't':
- $sql_sort_table = ($type == 'posts' && !$firstpost_only) ? TOPICS_TABLE . ' t, ' : '';
- $sql_sort_join = ($type == 'posts' && !$firstpost_only) ? ' AND t.topic_id = p.topic_id ' : '';
- break;
-
- case 'f':
- $sql_sort_table = FORUMS_TABLE . ' f, ';
- $sql_sort_join = ' AND f.forum_id = p.forum_id ';
- break;
- }
-
- if (!sizeof($m_approve_fid_ary))
- {
- $m_approve_fid_sql = ' AND p.post_approved = 1';
- }
- else if ($m_approve_fid_ary == array(-1))
- {
- $m_approve_fid_sql = '';
- }
- else
- {
- $m_approve_fid_sql = ' AND (p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
- }
-
- // If the cache was completely empty count the results
- $calc_results = ($result_count) ? '' : 'SQL_CALC_FOUND_ROWS ';
-
- // Build the query for really selecting the post_ids
- if ($type == 'posts')
- {
- $sql = "SELECT {$calc_results}p.post_id
- FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- $sql_sort_join
- $sql_time
- ORDER BY $sql_sort";
- $field = 'post_id';
- }
- else
- {
- $sql = "SELECT {$calc_results}t.topic_id
- FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- AND t.topic_id = p.topic_id
- $sql_sort_join
- $sql_time
- GROUP BY t.topic_id
- ORDER BY $sql_sort";
- $field = 'topic_id';
- }
-
- // Only read one block of posts from the db and then cache it
- $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $id_ary[] = (int) $row[$field];
- }
- $db->sql_freeresult($result);
-
- // retrieve the total result count if needed
- if (!$result_count)
- {
- $sql = 'SELECT FOUND_ROWS() as result_count';
- $result = $db->sql_query($sql);
- $result_count = (int) $db->sql_fetchfield('result_count');
- $db->sql_freeresult($result);
-
- if (!$result_count)
- {
- return false;
- }
- }
-
- if (sizeof($id_ary))
- {
- $this->save_ids($search_key, '', $author_ary, $result_count, $id_ary, $start, $sort_dir);
- $id_ary = array_slice($id_ary, 0, $per_page);
-
- return $result_count;
- }
- return false;
- }
-
- /**
- * Destroys cached search results, that contained one of the new words in a post so the results won't be outdated.
- *
- * @param string $mode contains the post mode: edit, post, reply, quote ...
- */
- function index($mode, $post_id, &$message, &$subject, $poster_id, $forum_id)
- {
- global $db;
-
- // Split old and new post/subject to obtain array of words
- $split_text = $this->split_message($message);
- $split_title = ($subject) ? $this->split_message($subject) : array();
-
- $words = array_unique(array_merge($split_text, $split_title));
-
- unset($split_text);
- unset($split_title);
-
- // destroy cached search results containing any of the words removed or added
- $this->destroy_cache($words, array($poster_id));
-
- unset($words);
- }
-
- /**
- * Destroy cached results, that might be outdated after deleting a post
- */
- function index_remove($post_ids, $author_ids, $forum_ids)
- {
- $this->destroy_cache(array(), array_unique($author_ids));
- }
-
- /**
- * Destroy old cache entries
- */
- function tidy()
- {
- global $db, $config;
-
- // destroy too old cached search results
- $this->destroy_cache(array());
-
- set_config('search_last_gc', time(), true);
- }
-
- /**
- * Create fulltext index
- */
- function create_index($acp_module, $u_action)
- {
- global $db;
-
- // Make sure we can actually use MySQL with fulltext indexes
- if ($error = $this->init())
- {
- return $error;
- }
-
- if (empty($this->stats))
- {
- $this->get_stats();
- }
-
- $alter = array();
-
- if (!isset($this->stats['post_subject']))
- {
- if ($db->sql_layer == 'mysqli' || version_compare($db->sql_server_info(true), '4.1.3', '>='))
- {
- $alter[] = 'MODIFY post_subject varchar(255) COLLATE utf8_unicode_ci DEFAULT \'\' NOT NULL';
- }
- else
- {
- $alter[] = 'MODIFY post_subject text NOT NULL';
- }
- $alter[] = 'ADD FULLTEXT (post_subject)';
- }
-
- if (!isset($this->stats['post_text']))
- {
- if ($db->sql_layer == 'mysqli' || version_compare($db->sql_server_info(true), '4.1.3', '>='))
- {
- $alter[] = 'MODIFY post_text mediumtext COLLATE utf8_unicode_ci NOT NULL';
- }
- else
- {
- $alter[] = 'MODIFY post_text mediumtext NOT NULL';
- }
- $alter[] = 'ADD FULLTEXT (post_text)';
- }
-
- if (!isset($this->stats['post_content']))
- {
- $alter[] = 'ADD FULLTEXT post_content (post_subject, post_text)';
- }
-
- if (sizeof($alter))
- {
- $db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
- }
-
- $db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
-
- return false;
- }
-
- /**
- * Drop fulltext index
- */
- function delete_index($acp_module, $u_action)
- {
- global $db;
-
- // Make sure we can actually use MySQL with fulltext indexes
- if ($error = $this->init())
- {
- return $error;
- }
-
- if (empty($this->stats))
- {
- $this->get_stats();
- }
-
- $alter = array();
-
- if (isset($this->stats['post_subject']))
- {
- $alter[] = 'DROP INDEX post_subject';
- }
-
- if (isset($this->stats['post_text']))
- {
- $alter[] = 'DROP INDEX post_text';
- }
-
- if (isset($this->stats['post_content']))
- {
- $alter[] = 'DROP INDEX post_content';
- }
-
- if (sizeof($alter))
- {
- $db->sql_query('ALTER TABLE ' . POSTS_TABLE . ' ' . implode(', ', $alter));
- }
-
- $db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
-
- return false;
- }
-
- /**
- * Returns true if both FULLTEXT indexes exist
- */
- function index_created()
- {
- if (empty($this->stats))
- {
- $this->get_stats();
- }
-
- return (isset($this->stats['post_text']) && isset($this->stats['post_subject']) && isset($this->stats['post_content'])) ? true : false;
- }
-
- /**
- * Returns an associative array containing information about the indexes
- */
- function index_stats()
- {
- global $user;
-
- if (empty($this->stats))
- {
- $this->get_stats();
- }
-
- return array(
- $user->lang['FULLTEXT_MYSQL_TOTAL_POSTS'] => ($this->index_created()) ? $this->stats['total_posts'] : 0,
- );
- }
-
- function get_stats()
- {
- global $db;
-
- if (strpos($db->sql_layer, 'mysql') === false)
- {
- $this->stats = array();
- return;
- }
-
- $sql = 'SHOW INDEX
- FROM ' . POSTS_TABLE;
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- // deal with older MySQL versions which didn't use Index_type
- $index_type = (isset($row['Index_type'])) ? $row['Index_type'] : $row['Comment'];
-
- if ($index_type == 'FULLTEXT')
- {
- if ($row['Key_name'] == 'post_text')
- {
- $this->stats['post_text'] = $row;
- }
- else if ($row['Key_name'] == 'post_subject')
- {
- $this->stats['post_subject'] = $row;
- }
- else if ($row['Key_name'] == 'post_content')
- {
- $this->stats['post_content'] = $row;
- }
- }
- }
- $db->sql_freeresult($result);
-
- $this->stats['total_posts'] = empty($this->stats) ? 0 : $db->get_estimated_row_count(POSTS_TABLE);
- }
-
- /**
- * Display a note, that UTF-8 support is not available with certain versions of PHP
- */
- function acp()
- {
- global $user, $config;
-
- $tpl = '
- <dl>
- <dt><label>' . $user->lang['FULLTEXT_MYSQL_PCRE'] . '</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_PCRE_EXPLAIN'] . '</span></dt>
- <dd>' . (($this->pcre_properties) ? $user->lang['YES'] : $user->lang['NO']) . ' (PHP ' . PHP_VERSION . ')</dd>
- </dl>
- <dl>
- <dt><label>' . $user->lang['FULLTEXT_MYSQL_MBSTRING'] . '</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MBSTRING_EXPLAIN'] . '</span></dt>
- <dd>' . (($this->mbstring_regex) ? $user->lang['YES'] : $user->lang['NO']). '</dd>
- </dl>
- <dl>
- <dt><label>' . $user->lang['MIN_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
- <dd>' . $config['fulltext_mysql_min_word_len'] . '</dd>
- </dl>
- <dl>
- <dt><label>' . $user->lang['MAX_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['FULLTEXT_MYSQL_MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
- <dd>' . $config['fulltext_mysql_max_word_len'] . '</dd>
- </dl>
- ';
-
- // These are fields required in the config table
- return array(
- 'tpl' => $tpl,
- 'config' => array()
- );
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/search/fulltext_native.php b/phpBB/includes/search/fulltext_native.php
deleted file mode 100644
index dc961f3c8a..0000000000
--- a/phpBB/includes/search/fulltext_native.php
+++ /dev/null
@@ -1,1749 +0,0 @@
-<?php
-/**
-*
-* @package search
-* @version $Id$
-* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* @ignore
-*/
-include_once($phpbb_root_path . 'includes/search/search.' . $phpEx);
-
-/**
-* fulltext_native
-* phpBB's own db driven fulltext search, version 2
-* @package search
-*/
-class fulltext_native extends search_backend
-{
- var $stats = array();
- var $word_length = array();
- var $search_query;
- var $common_words = array();
-
- var $must_contain_ids = array();
- var $must_not_contain_ids = array();
- var $must_exclude_one_ids = array();
-
- /**
- * Initialises the fulltext_native search backend with min/max word length and makes sure the UTF-8 normalizer is loaded.
- *
- * @param boolean|string &$error is passed by reference and should either be set to false on success or an error message on failure.
- *
- * @access public
- */
- function fulltext_native(&$error)
- {
- global $phpbb_root_path, $phpEx, $config;
-
- $this->word_length = array('min' => $config['fulltext_native_min_chars'], 'max' => $config['fulltext_native_max_chars']);
-
- /**
- * Load the UTF tools
- */
- if (!class_exists('utf_normalizer'))
- {
- include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
- }
-
-
- $error = false;
- }
-
- /**
- * This function fills $this->search_query with the cleaned user search query.
- *
- * If $terms is 'any' then the words will be extracted from the search query
- * and combined with | inside brackets. They will afterwards be treated like
- * an standard search query.
- *
- * Then it analyses the query and fills the internal arrays $must_not_contain_ids,
- * $must_contain_ids and $must_exclude_one_ids which are later used by keyword_search().
- *
- * @param string $keywords contains the search query string as entered by the user
- * @param string $terms is either 'all' (use search query as entered, default words to 'must be contained in post')
- * or 'any' (find all posts containing at least one of the given words)
- * @return boolean false if no valid keywords were found and otherwise true
- *
- * @access public
- */
- function split_keywords($keywords, $terms)
- {
- global $db, $user, $config;
-
- $tokens = '+-|()*';
-
- $keywords = trim($this->cleanup($keywords, $tokens));
-
- // allow word|word|word without brackets
- if ((strpos($keywords, ' ') === false) && (strpos($keywords, '|') !== false) && (strpos($keywords, '(') === false))
- {
- $keywords = '(' . $keywords . ')';
- }
-
- $open_bracket = $space = false;
- for ($i = 0, $n = strlen($keywords); $i < $n; $i++)
- {
- if ($open_bracket !== false)
- {
- switch ($keywords[$i])
- {
- case ')':
- if ($open_bracket + 1 == $i)
- {
- $keywords[$i - 1] = '|';
- $keywords[$i] = '|';
- }
- $open_bracket = false;
- break;
- case '(':
- $keywords[$i] = '|';
- break;
- case '+':
- case '-':
- case ' ':
- $keywords[$i] = '|';
- break;
- case '*':
- if ($i === 0 || ($keywords[$i - 1] !== '*' && strcspn($keywords[$i - 1], $tokens) === 0))
- {
- if ($i === $n - 1 || ($keywords[$i + 1] !== '*' && strcspn($keywords[$i + 1], $tokens) === 0))
- {
- $keywords = substr($keywords, 0, $i) . substr($keywords, $i + 1);
- }
- }
- break;
- }
- }
- else
- {
- switch ($keywords[$i])
- {
- case ')':
- $keywords[$i] = ' ';
- break;
- case '(':
- $open_bracket = $i;
- $space = false;
- break;
- case '|':
- $keywords[$i] = ' ';
- break;
- case '-':
- case '+':
- $space = $keywords[$i];
- break;
- case ' ':
- if ($space !== false)
- {
- $keywords[$i] = $space;
- }
- break;
- default:
- $space = false;
- }
- }
- }
-
- if ($open_bracket)
- {
- $keywords .= ')';
- }
-
- $match = array(
- '# +#',
- '#\|\|+#',
- '#(\+|\-)(?:\+|\-)+#',
- '#\(\|#',
- '#\|\)#',
- );
- $replace = array(
- ' ',
- '|',
- '$1',
- '(',
- ')',
- );
-
- $keywords = preg_replace($match, $replace, $keywords);
- $num_keywords = sizeof(explode(' ', $keywords));
-
- // We limit the number of allowed keywords to minimize load on the database
- if ($config['max_num_search_keywords'] && $num_keywords > $config['max_num_search_keywords'])
- {
- trigger_error($user->lang('MAX_NUM_SEARCH_KEYWORDS_REFINE', $config['max_num_search_keywords'], $num_keywords));
- }
-
- // $keywords input format: each word separated by a space, words in a bracket are not separated
-
- // the user wants to search for any word, convert the search query
- if ($terms == 'any')
- {
- $words = array();
-
- preg_match_all('#([^\\s+\\-|()]+)(?:$|[\\s+\\-|()])#u', $keywords, $words);
- if (sizeof($words[1]))
- {
- $keywords = '(' . implode('|', $words[1]) . ')';
- }
- }
-
- // set the search_query which is shown to the user
- $this->search_query = $keywords;
-
- $exact_words = array();
- preg_match_all('#([^\\s+\\-|*()]+)(?:$|[\\s+\\-|()])#u', $keywords, $exact_words);
- $exact_words = $exact_words[1];
-
- $common_ids = $words = array();
-
- if (sizeof($exact_words))
- {
- $sql = 'SELECT word_id, word_text, word_common
- FROM ' . SEARCH_WORDLIST_TABLE . '
- WHERE ' . $db->sql_in_set('word_text', $exact_words) . '
- ORDER BY word_count ASC';
- $result = $db->sql_query($sql);
-
- // store an array of words and ids, remove common words
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['word_common'])
- {
- $this->common_words[] = $row['word_text'];
- $common_ids[$row['word_text']] = (int) $row['word_id'];
- continue;
- }
-
- $words[$row['word_text']] = (int) $row['word_id'];
- }
- $db->sql_freeresult($result);
- }
- unset($exact_words);
-
- // now analyse the search query, first split it using the spaces
- $query = explode(' ', $keywords);
-
- $this->must_contain_ids = array();
- $this->must_not_contain_ids = array();
- $this->must_exclude_one_ids = array();
-
- $mode = '';
- $ignore_no_id = true;
-
- foreach ($query as $word)
- {
- if (empty($word))
- {
- continue;
- }
-
- // words which should not be included
- if ($word[0] == '-')
- {
- $word = substr($word, 1);
-
- // a group of which at least one may not be in the resulting posts
- if ($word[0] == '(')
- {
- $word = array_unique(explode('|', substr($word, 1, -1)));
- $mode = 'must_exclude_one';
- }
- // one word which should not be in the resulting posts
- else
- {
- $mode = 'must_not_contain';
- }
- $ignore_no_id = true;
- }
- // words which have to be included
- else
- {
- // no prefix is the same as a +prefix
- if ($word[0] == '+')
- {
- $word = substr($word, 1);
- }
-
- // a group of words of which at least one word should be in every resulting post
- if ($word[0] == '(')
- {
- $word = array_unique(explode('|', substr($word, 1, -1)));
- }
- $ignore_no_id = false;
- $mode = 'must_contain';
- }
-
- if (empty($word))
- {
- continue;
- }
-
- // if this is an array of words then retrieve an id for each
- if (is_array($word))
- {
- $non_common_words = array();
- $id_words = array();
- foreach ($word as $i => $word_part)
- {
- if (strpos($word_part, '*') !== false)
- {
- $id_words[] = '\'' . $db->sql_escape(str_replace('*', '%', $word_part)) . '\'';
- $non_common_words[] = $word_part;
- }
- else if (isset($words[$word_part]))
- {
- $id_words[] = $words[$word_part];
- $non_common_words[] = $word_part;
- }
- else
- {
- $len = utf8_strlen($word_part);
- if ($len < $this->word_length['min'] || $len > $this->word_length['max'])
- {
- $this->common_words[] = $word_part;
- }
- }
- }
- if (sizeof($id_words))
- {
- sort($id_words);
- if (sizeof($id_words) > 1)
- {
- $this->{$mode . '_ids'}[] = $id_words;
- }
- else
- {
- $mode = ($mode == 'must_exclude_one') ? 'must_not_contain' : $mode;
- $this->{$mode . '_ids'}[] = $id_words[0];
- }
- }
- // throw an error if we shall not ignore unexistant words
- else if (!$ignore_no_id && sizeof($non_common_words))
- {
- trigger_error(sprintf($user->lang['WORDS_IN_NO_POST'], implode(', ', $non_common_words)));
- }
- unset($non_common_words);
- }
- // else we only need one id
- else if (($wildcard = strpos($word, '*') !== false) || isset($words[$word]))
- {
- if ($wildcard)
- {
- $len = utf8_strlen(str_replace('*', '', $word));
- if ($len >= $this->word_length['min'] && $len <= $this->word_length['max'])
- {
- $this->{$mode . '_ids'}[] = '\'' . $db->sql_escape(str_replace('*', '%', $word)) . '\'';
- }
- else
- {
- $this->common_words[] = $word;
- }
- }
- else
- {
- $this->{$mode . '_ids'}[] = $words[$word];
- }
- }
- // throw an error if we shall not ignore unexistant words
- else if (!$ignore_no_id)
- {
- if (!isset($common_ids[$word]))
- {
- $len = utf8_strlen($word);
- if ($len >= $this->word_length['min'] && $len <= $this->word_length['max'])
- {
- trigger_error(sprintf($user->lang['WORD_IN_NO_POST'], $word));
- }
- else
- {
- $this->common_words[] = $word;
- }
- }
- }
- else
- {
- $len = utf8_strlen($word);
- if ($len < $this->word_length['min'] || $len > $this->word_length['max'])
- {
- $this->common_words[] = $word;
- }
- }
- }
-
- // we can't search for negatives only
- if (!sizeof($this->must_contain_ids))
- {
- return false;
- }
-
- if (!empty($this->search_query))
- {
- return true;
- }
- return false;
- }
-
- /**
- * Performs a search on keywords depending on display specific params. You have to run split_keywords() first.
- *
- * @param string $type contains either posts or topics depending on what should be searched for
- * @param string $fields contains either titleonly (topic titles should be searched), msgonly (only message bodies should be searched), firstpost (only subject and body of the first post should be searched) or all (all post bodies and subjects should be searched)
- * @param string $terms is either 'all' (use query as entered, words without prefix should default to "have to be in field") or 'any' (ignore search query parts and just return all posts that contain any of the specified words)
- * @param array $sort_by_sql contains SQL code for the ORDER BY part of a query
- * @param string $sort_key is the key of $sort_by_sql for the selected sorting
- * @param string $sort_dir is either a or d representing ASC and DESC
- * @param string $sort_days specifies the maximum amount of days a post may be old
- * @param array $ex_fid_ary specifies an array of forum ids which should not be searched
- * @param array $m_approve_fid_ary specifies an array of forum ids in which the searcher is allowed to view unapproved posts
- * @param int $topic_id is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
- * @param array $author_ary an array of author ids if the author should be ignored during the search the array is empty
- * @param string $author_name specifies the author match, when ANONYMOUS is also a search-match
- * @param array &$id_ary passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
- * @param int $start indicates the first index of the page
- * @param int $per_page number of ids each page is supposed to contain
- * @return boolean|int total number of results
- *
- * @access public
- */
- function keyword_search($type, $fields, $terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
- {
- global $config, $db;
-
- // No keywords? No posts.
- if (empty($this->search_query))
- {
- return false;
- }
-
- $must_contain_ids = $this->must_contain_ids;
- $must_not_contain_ids = $this->must_not_contain_ids;
- $must_exclude_one_ids = $this->must_exclude_one_ids;
-
- sort($must_contain_ids);
- sort($must_not_contain_ids);
- sort($must_exclude_one_ids);
-
- // generate a search_key from all the options to identify the results
- $search_key = md5(implode('#', array(
- serialize($must_contain_ids),
- serialize($must_not_contain_ids),
- serialize($must_exclude_one_ids),
- $type,
- $fields,
- $terms,
- $sort_days,
- $sort_key,
- $topic_id,
- implode(',', $ex_fid_ary),
- implode(',', $m_approve_fid_ary),
- implode(',', $author_ary),
- $author_name,
- )));
-
- // try reading the results from cache
- $total_results = 0;
- if ($this->obtain_ids($search_key, $total_results, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
- {
- return $total_results;
- }
-
- $id_ary = array();
-
- $sql_where = array();
- $group_by = false;
- $m_num = 0;
- $w_num = 0;
-
- $sql_array = array(
- 'SELECT' => ($type == 'posts') ? 'p.post_id' : 'p.topic_id',
- 'FROM' => array(
- SEARCH_WORDMATCH_TABLE => array(),
- SEARCH_WORDLIST_TABLE => array(),
- ),
- 'LEFT_JOIN' => array(array(
- 'FROM' => array(POSTS_TABLE => 'p'),
- 'ON' => 'm0.post_id = p.post_id',
- )),
- );
-
- $title_match = '';
- $left_join_topics = false;
- $group_by = true;
- // Build some display specific sql strings
- switch ($fields)
- {
- case 'titleonly':
- $title_match = 'title_match = 1';
- $group_by = false;
- // no break
- case 'firstpost':
- $left_join_topics = true;
- $sql_where[] = 'p.post_id = t.topic_first_post_id';
- break;
-
- case 'msgonly':
- $title_match = 'title_match = 0';
- $group_by = false;
- break;
- }
-
- if ($type == 'topics')
- {
- $left_join_topics = true;
- $group_by = true;
- }
-
- /**
- * @todo Add a query optimizer (handle stuff like "+(4|3) +4")
- */
-
- foreach ($this->must_contain_ids as $subquery)
- {
- if (is_array($subquery))
- {
- $group_by = true;
-
- $word_id_sql = array();
- $word_ids = array();
- foreach ($subquery as $id)
- {
- if (is_string($id))
- {
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(SEARCH_WORDLIST_TABLE => 'w' . $w_num),
- 'ON' => "w$w_num.word_text LIKE $id"
- );
- $word_ids[] = "w$w_num.word_id";
-
- $w_num++;
- }
- else
- {
- $word_ids[] = $id;
- }
- }
-
- $sql_where[] = $db->sql_in_set("m$m_num.word_id", $word_ids);
-
- unset($word_id_sql);
- unset($word_ids);
- }
- else if (is_string($subquery))
- {
- $sql_array['FROM'][SEARCH_WORDLIST_TABLE][] = 'w' . $w_num;
-
- $sql_where[] = "w$w_num.word_text LIKE $subquery";
- $sql_where[] = "m$m_num.word_id = w$w_num.word_id";
-
- $group_by = true;
- $w_num++;
- }
- else
- {
- $sql_where[] = "m$m_num.word_id = $subquery";
- }
-
- $sql_array['FROM'][SEARCH_WORDMATCH_TABLE][] = 'm' . $m_num;
-
- if ($title_match)
- {
- $sql_where[] = "m$m_num.$title_match";
- }
-
- if ($m_num != 0)
- {
- $sql_where[] = "m$m_num.post_id = m0.post_id";
- }
- $m_num++;
- }
-
- foreach ($this->must_not_contain_ids as $key => $subquery)
- {
- if (is_string($subquery))
- {
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(SEARCH_WORDLIST_TABLE => 'w' . $w_num),
- 'ON' => "w$w_num.word_text LIKE $subquery"
- );
-
- $this->must_not_contain_ids[$key] = "w$w_num.word_id";
-
- $group_by = true;
- $w_num++;
- }
- }
-
- if (sizeof($this->must_not_contain_ids))
- {
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(SEARCH_WORDMATCH_TABLE => 'm' . $m_num),
- 'ON' => $db->sql_in_set("m$m_num.word_id", $this->must_not_contain_ids) . (($title_match) ? " AND m$m_num.$title_match" : '') . " AND m$m_num.post_id = m0.post_id"
- );
-
- $sql_where[] = "m$m_num.word_id IS NULL";
- $m_num++;
- }
-
- foreach ($this->must_exclude_one_ids as $ids)
- {
- $is_null_joins = array();
- foreach ($ids as $id)
- {
- if (is_string($id))
- {
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(SEARCH_WORDLIST_TABLE => 'w' . $w_num),
- 'ON' => "w$w_num.word_text LIKE $id"
- );
- $id = "w$w_num.word_id";
-
- $group_by = true;
- $w_num++;
- }
-
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(SEARCH_WORDMATCH_TABLE => 'm' . $m_num),
- 'ON' => "m$m_num.word_id = $id AND m$m_num.post_id = m0.post_id" . (($title_match) ? " AND m$m_num.$title_match" : '')
- );
- $is_null_joins[] = "m$m_num.word_id IS NULL";
-
- $m_num++;
- }
- $sql_where[] = '(' . implode(' OR ', $is_null_joins) . ')';
- }
-
- if (!sizeof($m_approve_fid_ary))
- {
- $sql_where[] = 'p.post_approved = 1';
- }
- else if ($m_approve_fid_ary !== array(-1))
- {
- $sql_where[] = '(p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
- }
-
- if ($topic_id)
- {
- $sql_where[] = 'p.topic_id = ' . $topic_id;
- }
-
- if (sizeof($author_ary))
- {
- if ($author_name)
- {
- // first one matches post of registered users, second one guests and deleted users
- $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
- }
- else
- {
- $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
- }
- $sql_where[] = $sql_author;
- }
-
- if (sizeof($ex_fid_ary))
- {
- $sql_where[] = $db->sql_in_set('p.forum_id', $ex_fid_ary, true);
- }
-
- if ($sort_days)
- {
- $sql_where[] = 'p.post_time >= ' . (time() - ($sort_days * 86400));
- }
-
- $sql_array['WHERE'] = implode(' AND ', $sql_where);
-
- $is_mysql = false;
- // if the total result count is not cached yet, retrieve it from the db
- if (!$total_results)
- {
- $sql = '';
- $sql_array_count = $sql_array;
-
- if ($left_join_topics)
- {
- $sql_array_count['LEFT_JOIN'][] = array(
- 'FROM' => array(TOPICS_TABLE => 't'),
- 'ON' => 'p.topic_id = t.topic_id'
- );
- }
-
- switch ($db->sql_layer)
- {
- case 'mysql4':
- case 'mysqli':
-
- // 3.x does not support SQL_CALC_FOUND_ROWS
- // $sql_array['SELECT'] = 'SQL_CALC_FOUND_ROWS ' . $sql_array['SELECT'];
- $is_mysql = true;
-
- break;
-
- case 'sqlite':
- $sql_array_count['SELECT'] = ($type == 'posts') ? 'DISTINCT p.post_id' : 'DISTINCT p.topic_id';
- $sql = 'SELECT COUNT(' . (($type == 'posts') ? 'post_id' : 'topic_id') . ') as total_results
- FROM (' . $db->sql_build_query('SELECT', $sql_array_count) . ')';
-
- // no break
-
- default:
- $sql_array_count['SELECT'] = ($type == 'posts') ? 'COUNT(DISTINCT p.post_id) AS total_results' : 'COUNT(DISTINCT p.topic_id) AS total_results';
- $sql = (!$sql) ? $db->sql_build_query('SELECT', $sql_array_count) : $sql;
-
- $result = $db->sql_query($sql);
- $total_results = (int) $db->sql_fetchfield('total_results');
- $db->sql_freeresult($result);
-
- if (!$total_results)
- {
- return false;
- }
- break;
- }
-
- unset($sql_array_count, $sql);
- }
-
- // Build sql strings for sorting
- $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
-
- switch ($sql_sort[0])
- {
- case 'u':
- $sql_array['FROM'][USERS_TABLE] = 'u';
- $sql_where[] = 'u.user_id = p.poster_id ';
- break;
-
- case 't':
- $left_join_topics = true;
- break;
-
- case 'f':
- $sql_array['FROM'][FORUMS_TABLE] = 'f';
- $sql_where[] = 'f.forum_id = p.forum_id';
- break;
- }
-
- if ($left_join_topics)
- {
- $sql_array['LEFT_JOIN'][] = array(
- 'FROM' => array(TOPICS_TABLE => 't'),
- 'ON' => 'p.topic_id = t.topic_id'
- );
- }
-
- $sql_array['WHERE'] = implode(' AND ', $sql_where);
- $sql_array['GROUP_BY'] = ($group_by) ? (($type == 'posts') ? 'p.post_id' : 'p.topic_id') . ', ' . $sort_by_sql[$sort_key] : '';
- $sql_array['ORDER_BY'] = $sql_sort;
-
- unset($sql_where, $sql_sort, $group_by);
-
- $sql = $db->sql_build_query('SELECT', $sql_array);
- $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $id_ary[] = (int) $row[(($type == 'posts') ? 'post_id' : 'topic_id')];
- }
- $db->sql_freeresult($result);
-
- if (!sizeof($id_ary))
- {
- return false;
- }
-
- // if we use mysql and the total result count is not cached yet, retrieve it from the db
- if (!$total_results && $is_mysql)
- {
- // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
- $sql_array_copy = $sql_array;
- $sql_array_copy['SELECT'] = 'SQL_CALC_FOUND_ROWS p.post_id ';
-
- $sql = $db->sql_build_query('SELECT', $sql_array_copy);
- unset($sql_array_copy);
-
- $db->sql_query($sql);
- $db->sql_freeresult($result);
-
- $sql = 'SELECT FOUND_ROWS() as total_results';
- $result = $db->sql_query($sql);
- $total_results = (int) $db->sql_fetchfield('total_results');
- $db->sql_freeresult($result);
-
- if (!$total_results)
- {
- return false;
- }
- }
-
- // store the ids, from start on then delete anything that isn't on the current page because we only need ids for one page
- $this->save_ids($search_key, $this->search_query, $author_ary, $total_results, $id_ary, $start, $sort_dir);
- $id_ary = array_slice($id_ary, 0, (int) $per_page);
-
- return $total_results;
- }
-
- /**
- * Performs a search on an author's posts without caring about message contents. Depends on display specific params
- *
- * @param string $type contains either posts or topics depending on what should be searched for
- * @param boolean $firstpost_only if true, only topic starting posts will be considered
- * @param array $sort_by_sql contains SQL code for the ORDER BY part of a query
- * @param string $sort_key is the key of $sort_by_sql for the selected sorting
- * @param string $sort_dir is either a or d representing ASC and DESC
- * @param string $sort_days specifies the maximum amount of days a post may be old
- * @param array $ex_fid_ary specifies an array of forum ids which should not be searched
- * @param array $m_approve_fid_ary specifies an array of forum ids in which the searcher is allowed to view unapproved posts
- * @param int $topic_id is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
- * @param array $author_ary an array of author ids
- * @param string $author_name specifies the author match, when ANONYMOUS is also a search-match
- * @param array &$id_ary passed by reference, to be filled with ids for the page specified by $start and $per_page, should be ordered
- * @param int $start indicates the first index of the page
- * @param int $per_page number of ids each page is supposed to contain
- * @return boolean|int total number of results
- *
- * @access public
- */
- function author_search($type, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_ary, $author_name, &$id_ary, $start, $per_page)
- {
- global $config, $db;
-
- // No author? No posts.
- if (!sizeof($author_ary))
- {
- return 0;
- }
-
- // generate a search_key from all the options to identify the results
- $search_key = md5(implode('#', array(
- '',
- $type,
- ($firstpost_only) ? 'firstpost' : '',
- '',
- '',
- $sort_days,
- $sort_key,
- $topic_id,
- implode(',', $ex_fid_ary),
- implode(',', $m_approve_fid_ary),
- implode(',', $author_ary),
- $author_name,
- )));
-
- // try reading the results from cache
- $total_results = 0;
- if ($this->obtain_ids($search_key, $total_results, $id_ary, $start, $per_page, $sort_dir) == SEARCH_RESULT_IN_CACHE)
- {
- return $total_results;
- }
-
- $id_ary = array();
-
- // Create some display specific sql strings
- if ($author_name)
- {
- // first one matches post of registered users, second one guests and deleted users
- $sql_author = '(' . $db->sql_in_set('p.poster_id', array_diff($author_ary, array(ANONYMOUS)), false, true) . ' OR p.post_username ' . $author_name . ')';
- }
- else
- {
- $sql_author = $db->sql_in_set('p.poster_id', $author_ary);
- }
- $sql_fora = (sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '';
- $sql_time = ($sort_days) ? ' AND p.post_time >= ' . (time() - ($sort_days * 86400)) : '';
- $sql_topic_id = ($topic_id) ? ' AND p.topic_id = ' . (int) $topic_id : '';
- $sql_firstpost = ($firstpost_only) ? ' AND p.post_id = t.topic_first_post_id' : '';
-
- // Build sql strings for sorting
- $sql_sort = $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
- $sql_sort_table = $sql_sort_join = '';
- switch ($sql_sort[0])
- {
- case 'u':
- $sql_sort_table = USERS_TABLE . ' u, ';
- $sql_sort_join = ' AND u.user_id = p.poster_id ';
- break;
-
- case 't':
- $sql_sort_table = ($type == 'posts' && !$firstpost_only) ? TOPICS_TABLE . ' t, ' : '';
- $sql_sort_join = ($type == 'posts' && !$firstpost_only) ? ' AND t.topic_id = p.topic_id ' : '';
- break;
-
- case 'f':
- $sql_sort_table = FORUMS_TABLE . ' f, ';
- $sql_sort_join = ' AND f.forum_id = p.forum_id ';
- break;
- }
-
- if (!sizeof($m_approve_fid_ary))
- {
- $m_approve_fid_sql = ' AND p.post_approved = 1';
- }
- else if ($m_approve_fid_ary == array(-1))
- {
- $m_approve_fid_sql = '';
- }
- else
- {
- $m_approve_fid_sql = ' AND (p.post_approved = 1 OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) . ')';
- }
-
- $select = ($type == 'posts') ? 'p.post_id' : 't.topic_id';
- $is_mysql = false;
-
- // If the cache was completely empty count the results
- if (!$total_results)
- {
- switch ($db->sql_layer)
- {
- case 'mysql4':
- case 'mysqli':
-// $select = 'SQL_CALC_FOUND_ROWS ' . $select;
- $is_mysql = true;
- break;
-
- default:
- if ($type == 'posts')
- {
- $sql = 'SELECT COUNT(p.post_id) as total_results
- FROM ' . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t ' : ' ') . "
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- $sql_time";
- }
- else
- {
- if ($db->sql_layer == 'sqlite')
- {
- $sql = 'SELECT COUNT(topic_id) as total_results
- FROM (SELECT DISTINCT t.topic_id';
- }
- else
- {
- $sql = 'SELECT COUNT(DISTINCT t.topic_id) as total_results';
- }
-
- $sql .= ' FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- AND t.topic_id = p.topic_id
- $sql_time" . (($db->sql_layer == 'sqlite') ? ')' : '');
- }
- $result = $db->sql_query($sql);
-
- $total_results = (int) $db->sql_fetchfield('total_results');
- $db->sql_freeresult($result);
-
- if (!$total_results)
- {
- return false;
- }
- break;
- }
- }
-
- // Build the query for really selecting the post_ids
- if ($type == 'posts')
- {
- $sql = "SELECT $select
- FROM " . $sql_sort_table . POSTS_TABLE . ' p' . (($firstpost_only) ? ', ' . TOPICS_TABLE . ' t' : '') . "
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- $sql_sort_join
- $sql_time
- ORDER BY $sql_sort";
- $field = 'post_id';
- }
- else
- {
- $sql = "SELECT $select
- FROM " . $sql_sort_table . TOPICS_TABLE . ' t, ' . POSTS_TABLE . " p
- WHERE $sql_author
- $sql_topic_id
- $sql_firstpost
- $m_approve_fid_sql
- $sql_fora
- AND t.topic_id = p.topic_id
- $sql_sort_join
- $sql_time
- GROUP BY t.topic_id, " . $sort_by_sql[$sort_key] . '
- ORDER BY ' . $sql_sort;
- $field = 'topic_id';
- }
-
- // Only read one block of posts from the db and then cache it
- $result = $db->sql_query_limit($sql, $config['search_block_size'], $start);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $id_ary[] = (int) $row[$field];
- }
- $db->sql_freeresult($result);
-
- if (!$total_results && $is_mysql)
- {
- // Count rows for the executed queries. Replace $select within $sql with SQL_CALC_FOUND_ROWS, and run it.
- $sql = str_replace('SELECT ' . $select, 'SELECT DISTINCT SQL_CALC_FOUND_ROWS p.post_id', $sql);
-
- $db->sql_query($sql);
- $db->sql_freeresult($result);
-
- $sql = 'SELECT FOUND_ROWS() as total_results';
- $result = $db->sql_query($sql);
- $total_results = (int) $db->sql_fetchfield('total_results');
- $db->sql_freeresult($result);
-
- if (!$total_results)
- {
- return false;
- }
- }
-
- if (sizeof($id_ary))
- {
- $this->save_ids($search_key, '', $author_ary, $total_results, $id_ary, $start, $sort_dir);
- $id_ary = array_slice($id_ary, 0, $per_page);
-
- return $total_results;
- }
- return false;
- }
-
- /**
- * Split a text into words of a given length
- *
- * The text is converted to UTF-8, cleaned up, and split. Then, words that
- * conform to the defined length range are returned in an array.
- *
- * NOTE: duplicates are NOT removed from the return array
- *
- * @param string $text Text to split, encoded in UTF-8
- * @return array Array of UTF-8 words
- *
- * @access private
- */
- function split_message($text)
- {
- global $phpbb_root_path, $phpEx, $user;
-
- $match = $words = array();
-
- /**
- * Taken from the original code
- */
- // Do not index code
- $match[] = '#\[code(?:=.*?)?(\:?[0-9a-z]{5,})\].*?\[\/code(\:?[0-9a-z]{5,})\]#is';
- // BBcode
- $match[] = '#\[\/?[a-z0-9\*\+\-]+(?:=.*?)?(?::[a-z])?(\:?[0-9a-z]{5,})\]#';
-
- $min = $this->word_length['min'];
- $max = $this->word_length['max'];
-
- $isset_min = $min - 1;
-
- /**
- * Clean up the string, remove HTML tags, remove BBCodes
- */
- $word = strtok($this->cleanup(preg_replace($match, ' ', strip_tags($text)), -1), ' ');
-
- while (strlen($word))
- {
- if (strlen($word) > 255 || strlen($word) <= $isset_min)
- {
- /**
- * Words longer than 255 bytes are ignored. This will have to be
- * changed whenever we change the length of search_wordlist.word_text
- *
- * Words shorter than $isset_min bytes are ignored, too
- */
- $word = strtok(' ');
- continue;
- }
-
- $len = utf8_strlen($word);
-
- /**
- * Test whether the word is too short to be indexed.
- *
- * Note that this limit does NOT apply to CJK and Hangul
- */
- if ($len < $min)
- {
- /**
- * Note: this could be optimized. If the codepoint is lower than Hangul's range
- * we know that it will also be lower than CJK ranges
- */
- if ((strncmp($word, UTF8_HANGUL_FIRST, 3) < 0 || strncmp($word, UTF8_HANGUL_LAST, 3) > 0)
- && (strncmp($word, UTF8_CJK_FIRST, 3) < 0 || strncmp($word, UTF8_CJK_LAST, 3) > 0)
- && (strncmp($word, UTF8_CJK_B_FIRST, 4) < 0 || strncmp($word, UTF8_CJK_B_LAST, 4) > 0))
- {
- $word = strtok(' ');
- continue;
- }
- }
-
- $words[] = $word;
- $word = strtok(' ');
- }
-
- return $words;
- }
-
- /**
- * Updates wordlist and wordmatch tables when a message is posted or changed
- *
- * @param string $mode Contains the post mode: edit, post, reply, quote
- * @param int $post_id The id of the post which is modified/created
- * @param string &$message New or updated post content
- * @param string &$subject New or updated post subject
- * @param int $poster_id Post author's user id
- * @param int $forum_id The id of the forum in which the post is located
- *
- * @access public
- */
- function index($mode, $post_id, &$message, &$subject, $poster_id, $forum_id)
- {
- global $config, $db, $user;
-
- if (!$config['fulltext_native_load_upd'])
- {
- /**
- * The search indexer is disabled, return
- */
- return;
- }
-
- // Split old and new post/subject to obtain array of 'words'
- $split_text = $this->split_message($message);
- $split_title = $this->split_message($subject);
-
- $cur_words = array('post' => array(), 'title' => array());
-
- $words = array();
- if ($mode == 'edit')
- {
- $words['add']['post'] = array();
- $words['add']['title'] = array();
- $words['del']['post'] = array();
- $words['del']['title'] = array();
-
- $sql = 'SELECT w.word_id, w.word_text, m.title_match
- FROM ' . SEARCH_WORDLIST_TABLE . ' w, ' . SEARCH_WORDMATCH_TABLE . " m
- WHERE m.post_id = $post_id
- AND w.word_id = m.word_id";
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $which = ($row['title_match']) ? 'title' : 'post';
- $cur_words[$which][$row['word_text']] = $row['word_id'];
- }
- $db->sql_freeresult($result);
-
- $words['add']['post'] = array_diff($split_text, array_keys($cur_words['post']));
- $words['add']['title'] = array_diff($split_title, array_keys($cur_words['title']));
- $words['del']['post'] = array_diff(array_keys($cur_words['post']), $split_text);
- $words['del']['title'] = array_diff(array_keys($cur_words['title']), $split_title);
- }
- else
- {
- $words['add']['post'] = $split_text;
- $words['add']['title'] = $split_title;
- $words['del']['post'] = array();
- $words['del']['title'] = array();
- }
- unset($split_text);
- unset($split_title);
-
- // Get unique words from the above arrays
- $unique_add_words = array_unique(array_merge($words['add']['post'], $words['add']['title']));
-
- // We now have unique arrays of all words to be added and removed and
- // individual arrays of added and removed words for text and title. What
- // we need to do now is add the new words (if they don't already exist)
- // and then add (or remove) matches between the words and this post
- if (sizeof($unique_add_words))
- {
- $sql = 'SELECT word_id, word_text
- FROM ' . SEARCH_WORDLIST_TABLE . '
- WHERE ' . $db->sql_in_set('word_text', $unique_add_words);
- $result = $db->sql_query($sql);
-
- $word_ids = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $word_ids[$row['word_text']] = $row['word_id'];
- }
- $db->sql_freeresult($result);
- $new_words = array_diff($unique_add_words, array_keys($word_ids));
-
- $db->sql_transaction('begin');
- if (sizeof($new_words))
- {
- $sql_ary = array();
-
- foreach ($new_words as $word)
- {
- $sql_ary[] = array('word_text' => (string) $word, 'word_count' => 0);
- }
- $db->sql_return_on_error(true);
- $db->sql_multi_insert(SEARCH_WORDLIST_TABLE, $sql_ary);
- $db->sql_return_on_error(false);
- }
- unset($new_words, $sql_ary);
- }
- else
- {
- $db->sql_transaction('begin');
- }
-
- // now update the search match table, remove links to removed words and add links to new words
- foreach ($words['del'] as $word_in => $word_ary)
- {
- $title_match = ($word_in == 'title') ? 1 : 0;
-
- if (sizeof($word_ary))
- {
- $sql_in = array();
- foreach ($word_ary as $word)
- {
- $sql_in[] = $cur_words[$word_in][$word];
- }
-
- $sql = 'DELETE FROM ' . SEARCH_WORDMATCH_TABLE . '
- WHERE ' . $db->sql_in_set('word_id', $sql_in) . '
- AND post_id = ' . intval($post_id) . "
- AND title_match = $title_match";
- $db->sql_query($sql);
-
- $sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
- SET word_count = word_count - 1
- WHERE ' . $db->sql_in_set('word_id', $sql_in) . '
- AND word_count > 0';
- $db->sql_query($sql);
-
- unset($sql_in);
- }
- }
-
- $db->sql_return_on_error(true);
- foreach ($words['add'] as $word_in => $word_ary)
- {
- $title_match = ($word_in == 'title') ? 1 : 0;
-
- if (sizeof($word_ary))
- {
- $sql = 'INSERT INTO ' . SEARCH_WORDMATCH_TABLE . ' (post_id, word_id, title_match)
- SELECT ' . (int) $post_id . ', word_id, ' . (int) $title_match . '
- FROM ' . SEARCH_WORDLIST_TABLE . '
- WHERE ' . $db->sql_in_set('word_text', $word_ary);
- $db->sql_query($sql);
-
- $sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
- SET word_count = word_count + 1
- WHERE ' . $db->sql_in_set('word_text', $word_ary);
- $db->sql_query($sql);
- }
- }
- $db->sql_return_on_error(false);
-
- $db->sql_transaction('commit');
-
- // destroy cached search results containing any of the words removed or added
- $this->destroy_cache(array_unique(array_merge($words['add']['post'], $words['add']['title'], $words['del']['post'], $words['del']['title'])), array($poster_id));
-
- unset($unique_add_words);
- unset($words);
- unset($cur_words);
- }
-
- /**
- * Removes entries from the wordmatch table for the specified post_ids
- */
- function index_remove($post_ids, $author_ids, $forum_ids)
- {
- global $db;
-
- if (sizeof($post_ids))
- {
- $sql = 'SELECT w.word_id, w.word_text, m.title_match
- FROM ' . SEARCH_WORDMATCH_TABLE . ' m, ' . SEARCH_WORDLIST_TABLE . ' w
- WHERE ' . $db->sql_in_set('m.post_id', $post_ids) . '
- AND w.word_id = m.word_id';
- $result = $db->sql_query($sql);
-
- $message_word_ids = $title_word_ids = $word_texts = array();
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['title_match'])
- {
- $title_word_ids[] = $row['word_id'];
- }
- else
- {
- $message_word_ids[] = $row['word_id'];
- }
- $word_texts[] = $row['word_text'];
- }
- $db->sql_freeresult($result);
-
- if (sizeof($title_word_ids))
- {
- $sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
- SET word_count = word_count - 1
- WHERE ' . $db->sql_in_set('word_id', $title_word_ids) . '
- AND word_count > 0';
- $db->sql_query($sql);
- }
-
- if (sizeof($message_word_ids))
- {
- $sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
- SET word_count = word_count - 1
- WHERE ' . $db->sql_in_set('word_id', $message_word_ids) . '
- AND word_count > 0';
- $db->sql_query($sql);
- }
-
- unset($title_word_ids);
- unset($message_word_ids);
-
- $sql = 'DELETE FROM ' . SEARCH_WORDMATCH_TABLE . '
- WHERE ' . $db->sql_in_set('post_id', $post_ids);
- $db->sql_query($sql);
- }
-
- $this->destroy_cache(array_unique($word_texts), array_unique($author_ids));
- }
-
- /**
- * Tidy up indexes: Tag 'common words' and remove
- * words no longer referenced in the match table
- */
- function tidy()
- {
- global $db, $config;
-
- // Is the fulltext indexer disabled? If yes then we need not
- // carry on ... it's okay ... I know when I'm not wanted boo hoo
- if (!$config['fulltext_native_load_upd'])
- {
- set_config('search_last_gc', time(), true);
- return;
- }
-
- $destroy_cache_words = array();
-
- // Remove common words
- if ($config['num_posts'] >= 100 && $config['fulltext_native_common_thres'])
- {
- $common_threshold = ((double) $config['fulltext_native_common_thres']) / 100.0;
- // First, get the IDs of common words
- $sql = 'SELECT word_id, word_text
- FROM ' . SEARCH_WORDLIST_TABLE . '
- WHERE word_count > ' . floor($config['num_posts'] * $common_threshold) . '
- OR word_common = 1';
- $result = $db->sql_query($sql);
-
- $sql_in = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $sql_in[] = $row['word_id'];
- $destroy_cache_words[] = $row['word_text'];
- }
- $db->sql_freeresult($result);
-
- if (sizeof($sql_in))
- {
- // Flag the words
- $sql = 'UPDATE ' . SEARCH_WORDLIST_TABLE . '
- SET word_common = 1
- WHERE ' . $db->sql_in_set('word_id', $sql_in);
- $db->sql_query($sql);
-
- // by setting search_last_gc to the new time here we make sure that if a user reloads because the
- // following query takes too long, he won't run into it again
- set_config('search_last_gc', time(), true);
-
- // Delete the matches
- $sql = 'DELETE FROM ' . SEARCH_WORDMATCH_TABLE . '
- WHERE ' . $db->sql_in_set('word_id', $sql_in);
- $db->sql_query($sql);
- }
- unset($sql_in);
- }
-
- if (sizeof($destroy_cache_words))
- {
- // destroy cached search results containing any of the words that are now common or were removed
- $this->destroy_cache(array_unique($destroy_cache_words));
- }
-
- set_config('search_last_gc', time(), true);
- }
-
- /**
- * Deletes all words from the index
- */
- function delete_index($acp_module, $u_action)
- {
- global $db;
-
- switch ($db->sql_layer)
- {
- case 'sqlite':
- case 'firebird':
- $db->sql_query('DELETE FROM ' . SEARCH_WORDLIST_TABLE);
- $db->sql_query('DELETE FROM ' . SEARCH_WORDMATCH_TABLE);
- $db->sql_query('DELETE FROM ' . SEARCH_RESULTS_TABLE);
- break;
-
- default:
- $db->sql_query('TRUNCATE TABLE ' . SEARCH_WORDLIST_TABLE);
- $db->sql_query('TRUNCATE TABLE ' . SEARCH_WORDMATCH_TABLE);
- $db->sql_query('TRUNCATE TABLE ' . SEARCH_RESULTS_TABLE);
- break;
- }
- }
-
- /**
- * Returns true if both FULLTEXT indexes exist
- */
- function index_created()
- {
- if (!sizeof($this->stats))
- {
- $this->get_stats();
- }
-
- return ($this->stats['total_words'] && $this->stats['total_matches']) ? true : false;
- }
-
- /**
- * Returns an associative array containing information about the indexes
- */
- function index_stats()
- {
- global $user;
-
- if (!sizeof($this->stats))
- {
- $this->get_stats();
- }
-
- return array(
- $user->lang['TOTAL_WORDS'] => $this->stats['total_words'],
- $user->lang['TOTAL_MATCHES'] => $this->stats['total_matches']);
- }
-
- function get_stats()
- {
- global $db;
-
- $this->stats['total_words'] = $db->get_estimated_row_count(SEARCH_WORDLIST_TABLE);
- $this->stats['total_matches'] = $db->get_estimated_row_count(SEARCH_WORDMATCH_TABLE);
- }
-
- /**
- * Clean up a text to remove non-alphanumeric characters
- *
- * This method receives a UTF-8 string, normalizes and validates it, replaces all
- * non-alphanumeric characters with strings then returns the result.
- *
- * Any number of "allowed chars" can be passed as a UTF-8 string in NFC.
- *
- * @param string $text Text to split, in UTF-8 (not normalized or sanitized)
- * @param string $allowed_chars String of special chars to allow
- * @param string $encoding Text encoding
- * @return string Cleaned up text, only alphanumeric chars are left
- *
- * @todo normalizer::cleanup being able to be used?
- */
- function cleanup($text, $allowed_chars = null, $encoding = 'utf-8')
- {
- global $phpbb_root_path, $phpEx;
- static $conv = array(), $conv_loaded = array();
- $words = $allow = array();
-
- // Convert the text to UTF-8
- $encoding = strtolower($encoding);
- if ($encoding != 'utf-8')
- {
- $text = utf8_recode($text, $encoding);
- }
-
- $utf_len_mask = array(
- "\xC0" => 2,
- "\xD0" => 2,
- "\xE0" => 3,
- "\xF0" => 4
- );
-
- /**
- * Replace HTML entities and NCRs
- */
- $text = htmlspecialchars_decode(utf8_decode_ncr($text), ENT_QUOTES);
-
- /**
- * Load the UTF-8 normalizer
- *
- * If we use it more widely, an instance of that class should be held in a
- * a global variable instead
- */
- utf_normalizer::nfc($text);
-
- /**
- * The first thing we do is:
- *
- * - convert ASCII-7 letters to lowercase
- * - remove the ASCII-7 non-alpha characters
- * - remove the bytes that should not appear in a valid UTF-8 string: 0xC0,
- * 0xC1 and 0xF5-0xFF
- *
- * @todo in theory, the third one is already taken care of during normalization and those chars should have been replaced by Unicode replacement chars
- */
- $sb_match = "ISTCPAMELRDOJBNHFGVWUQKYXZ\r\n\t!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\x00\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\xC0\xC1\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF";
- $sb_replace = 'istcpamelrdojbnhfgvwuqkyxz ';
-
- /**
- * This is the list of legal ASCII chars, it is automatically extended
- * with ASCII chars from $allowed_chars
- */
- $legal_ascii = ' eaisntroludcpmghbfvq10xy2j9kw354867z';
-
- /**
- * Prepare an array containing the extra chars to allow
- */
- if (isset($allowed_chars[0]))
- {
- $pos = 0;
- $len = strlen($allowed_chars);
- do
- {
- $c = $allowed_chars[$pos];
-
- if ($c < "\x80")
- {
- /**
- * ASCII char
- */
- $sb_pos = strpos($sb_match, $c);
- if (is_int($sb_pos))
- {
- /**
- * Remove the char from $sb_match and its corresponding
- * replacement in $sb_replace
- */
- $sb_match = substr($sb_match, 0, $sb_pos) . substr($sb_match, $sb_pos + 1);
- $sb_replace = substr($sb_replace, 0, $sb_pos) . substr($sb_replace, $sb_pos + 1);
- $legal_ascii .= $c;
- }
-
- ++$pos;
- }
- else
- {
- /**
- * UTF-8 char
- */
- $utf_len = $utf_len_mask[$c & "\xF0"];
- $allow[substr($allowed_chars, $pos, $utf_len)] = 1;
- $pos += $utf_len;
- }
- }
- while ($pos < $len);
- }
-
- $text = strtr($text, $sb_match, $sb_replace);
- $ret = '';
-
- $pos = 0;
- $len = strlen($text);
-
- do
- {
- /**
- * Do all consecutive ASCII chars at once
- */
- if ($spn = strspn($text, $legal_ascii, $pos))
- {
- $ret .= substr($text, $pos, $spn);
- $pos += $spn;
- }
-
- if ($pos >= $len)
- {
- return $ret;
- }
-
- /**
- * Capture the UTF char
- */
- $utf_len = $utf_len_mask[$text[$pos] & "\xF0"];
- $utf_char = substr($text, $pos, $utf_len);
- $pos += $utf_len;
-
- if (($utf_char >= UTF8_HANGUL_FIRST && $utf_char <= UTF8_HANGUL_LAST)
- || ($utf_char >= UTF8_CJK_FIRST && $utf_char <= UTF8_CJK_LAST)
- || ($utf_char >= UTF8_CJK_B_FIRST && $utf_char <= UTF8_CJK_B_LAST))
- {
- /**
- * All characters within these ranges are valid
- *
- * We separate them with a space in order to index each character
- * individually
- */
- $ret .= ' ' . $utf_char . ' ';
- continue;
- }
-
- if (isset($allow[$utf_char]))
- {
- /**
- * The char is explicitly allowed
- */
- $ret .= $utf_char;
- continue;
- }
-
- if (isset($conv[$utf_char]))
- {
- /**
- * The char is mapped to something, maybe to itself actually
- */
- $ret .= $conv[$utf_char];
- continue;
- }
-
- /**
- * The char isn't mapped, but did we load its conversion table?
- *
- * The search indexer table is split into blocks. The block number of
- * each char is equal to its codepoint right-shifted for 11 bits. It
- * means that out of the 11, 16 or 21 meaningful bits of a 2-, 3- or
- * 4- byte sequence we only keep the leftmost 0, 5 or 10 bits. Thus,
- * all UTF chars encoded in 2 bytes are in the same first block.
- */
- if (isset($utf_char[2]))
- {
- if (isset($utf_char[3]))
- {
- /**
- * 1111 0nnn 10nn nnnn 10nx xxxx 10xx xxxx
- * 0000 0111 0011 1111 0010 0000
- */
- $idx = ((ord($utf_char[0]) & 0x07) << 7) | ((ord($utf_char[1]) & 0x3F) << 1) | ((ord($utf_char[2]) & 0x20) >> 5);
- }
- else
- {
- /**
- * 1110 nnnn 10nx xxxx 10xx xxxx
- * 0000 0111 0010 0000
- */
- $idx = ((ord($utf_char[0]) & 0x07) << 1) | ((ord($utf_char[1]) & 0x20) >> 5);
- }
- }
- else
- {
- /**
- * 110x xxxx 10xx xxxx
- * 0000 0000 0000 0000
- */
- $idx = 0;
- }
-
- /**
- * Check if the required conv table has been loaded already
- */
- if (!isset($conv_loaded[$idx]))
- {
- $conv_loaded[$idx] = 1;
- $file = $phpbb_root_path . 'includes/utf/data/search_indexer_' . $idx . '.' . $phpEx;
-
- if (file_exists($file))
- {
- $conv += include($file);
- }
- }
-
- if (isset($conv[$utf_char]))
- {
- $ret .= $conv[$utf_char];
- }
- else
- {
- /**
- * We add an entry to the conversion table so that we
- * don't have to convert to codepoint and perform the checks
- * that are above this block
- */
- $conv[$utf_char] = ' ';
- $ret .= ' ';
- }
- }
- while (1);
-
- return $ret;
- }
-
- /**
- * Returns a list of options for the ACP to display
- */
- function acp()
- {
- global $user, $config;
-
-
- /**
- * if we need any options, copied from fulltext_native for now, will have to be adjusted or removed
- */
-
- $tpl = '
- <dl>
- <dt><label for="fulltext_native_load_upd">' . $user->lang['YES_SEARCH_UPDATE'] . ':</label><br /><span>' . $user->lang['YES_SEARCH_UPDATE_EXPLAIN'] . '</span></dt>
- <dd><label><input type="radio" id="fulltext_native_load_upd" name="config[fulltext_native_load_upd]" value="1"' . (($config['fulltext_native_load_upd']) ? ' checked="checked"' : '') . ' class="radio" /> ' . $user->lang['YES'] . '</label><label><input type="radio" name="config[fulltext_native_load_upd]" value="0"' . ((!$config['fulltext_native_load_upd']) ? ' checked="checked"' : '') . ' class="radio" /> ' . $user->lang['NO'] . '</label></dd>
- </dl>
- <dl>
- <dt><label for="fulltext_native_min_chars">' . $user->lang['MIN_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['MIN_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
- <dd><input id="fulltext_native_min_chars" type="text" size="3" maxlength="3" name="config[fulltext_native_min_chars]" value="' . (int) $config['fulltext_native_min_chars'] . '" /></dd>
- </dl>
- <dl>
- <dt><label for="fulltext_native_max_chars">' . $user->lang['MAX_SEARCH_CHARS'] . ':</label><br /><span>' . $user->lang['MAX_SEARCH_CHARS_EXPLAIN'] . '</span></dt>
- <dd><input id="fulltext_native_max_chars" type="text" size="3" maxlength="3" name="config[fulltext_native_max_chars]" value="' . (int) $config['fulltext_native_max_chars'] . '" /></dd>
- </dl>
- <dl>
- <dt><label for="fulltext_native_common_thres">' . $user->lang['COMMON_WORD_THRESHOLD'] . ':</label><br /><span>' . $user->lang['COMMON_WORD_THRESHOLD_EXPLAIN'] . '</span></dt>
- <dd><input id="fulltext_native_common_thres" type="text" size="3" maxlength="3" name="config[fulltext_native_common_thres]" value="' . (double) $config['fulltext_native_common_thres'] . '" /> %</dd>
- </dl>
- ';
-
- // These are fields required in the config table
- return array(
- 'tpl' => $tpl,
- 'config' => array('fulltext_native_load_upd' => 'bool', 'fulltext_native_min_chars' => 'integer:0:255', 'fulltext_native_max_chars' => 'integer:0:255', 'fulltext_native_common_thres' => 'double:0:100')
- );
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/search/index.htm b/phpBB/includes/search/index.htm
deleted file mode 100644
index ee1f723a7d..0000000000
--- a/phpBB/includes/search/index.htm
+++ /dev/null
@@ -1,10 +0,0 @@
-<html>
-<head>
-<title></title>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</head>
-
-<body bgcolor="#FFFFFF" text="#000000">
-
-</body>
-</html>
diff --git a/phpBB/includes/search/search.php b/phpBB/includes/search/search.php
deleted file mode 100644
index df7c8a0892..0000000000
--- a/phpBB/includes/search/search.php
+++ /dev/null
@@ -1,320 +0,0 @@
-<?php
-/**
-*
-* @package search
-* @version $Id$
-* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* @ignore
-*/
-define('SEARCH_RESULT_NOT_IN_CACHE', 0);
-define('SEARCH_RESULT_IN_CACHE', 1);
-define('SEARCH_RESULT_INCOMPLETE', 2);
-
-/**
-* search_backend
-* optional base class for search plugins providing simple caching based on ACM
-* and functions to retrieve ignore_words and synonyms
-* @package search
-*/
-class search_backend
-{
- var $ignore_words = array();
- var $match_synonym = array();
- var $replace_synonym = array();
-
- function search_backend(&$error)
- {
- // This class cannot be used as a search plugin
- $error = true;
- }
-
- /**
- * Retrieves a language dependend list of words that should be ignored by the search
- */
- function get_ignore_words()
- {
- if (!sizeof($this->ignore_words))
- {
- global $user, $phpEx;
-
- $words = array();
-
- if (file_exists("{$user->lang_path}{$user->lang_name}/search_ignore_words.$phpEx"))
- {
- // include the file containing ignore words
- include("{$user->lang_path}{$user->lang_name}/search_ignore_words.$phpEx");
- }
-
- $this->ignore_words = $words;
- unset($words);
- }
- }
-
- /**
- * Stores a list of synonyms that should be replaced in $this->match_synonym and $this->replace_synonym and caches them
- */
- function get_synonyms()
- {
- if (!sizeof($this->match_synonym))
- {
- global $user, $phpEx;
-
- $synonyms = array();
-
- if (file_exists("{$user->lang_path}{$user->lang_name}/search_synonyms.$phpEx"))
- {
- // include the file containing synonyms
- include("{$user->lang_path}{$user->lang_name}/search_synonyms.$phpEx");
- }
-
- $this->match_synonym = array_keys($synonyms);
- $this->replace_synonym = array_values($synonyms);
-
- unset($synonyms);
- }
- }
-
- /**
- * Retrieves cached search results
- *
- * @param int &$result_count will contain the number of all results for the search (not only for the current page)
- * @param array &$id_ary is filled with the ids belonging to the requested page that are stored in the cache
- *
- * @return int SEARCH_RESULT_NOT_IN_CACHE or SEARCH_RESULT_IN_CACHE or SEARCH_RESULT_INCOMPLETE
- */
- function obtain_ids($search_key, &$result_count, &$id_ary, $start, $per_page, $sort_dir)
- {
- global $cache;
-
- if (!($stored_ids = $cache->get('_search_results_' . $search_key)))
- {
- // no search results cached for this search_key
- return SEARCH_RESULT_NOT_IN_CACHE;
- }
- else
- {
- $result_count = $stored_ids[-1];
- $reverse_ids = ($stored_ids[-2] != $sort_dir) ? true : false;
- $complete = true;
-
- // change the start to the actual end of the current request if the sort direction differs
- // from the dirction in the cache and reverse the ids later
- if ($reverse_ids)
- {
- $start = $result_count - $start - $per_page;
-
- // the user requested a page past the last index
- if ($start < 0)
- {
- return SEARCH_RESULT_NOT_IN_CACHE;
- }
- }
-
- for ($i = $start, $n = $start + $per_page; ($i < $n) && ($i < $result_count); $i++)
- {
- if (!isset($stored_ids[$i]))
- {
- $complete = false;
- }
- else
- {
- $id_ary[] = $stored_ids[$i];
- }
- }
- unset($stored_ids);
-
- if ($reverse_ids)
- {
- $id_ary = array_reverse($id_ary);
- }
-
- if (!$complete)
- {
- return SEARCH_RESULT_INCOMPLETE;
- }
- return SEARCH_RESULT_IN_CACHE;
- }
- }
-
- /**
- * Caches post/topic ids
- *
- * @param array &$id_ary contains a list of post or topic ids that shall be cached, the first element
- * must have the absolute index $start in the result set.
- */
- function save_ids($search_key, $keywords, $author_ary, $result_count, &$id_ary, $start, $sort_dir)
- {
- global $cache, $config, $db, $user;
-
- $length = min(sizeof($id_ary), $config['search_block_size']);
-
- // nothing to cache so exit
- if (!$length)
- {
- return;
- }
-
- $store_ids = array_slice($id_ary, 0, $length);
-
- // create a new resultset if there is none for this search_key yet
- // or add the ids to the existing resultset
- if (!($store = $cache->get('_search_results_' . $search_key)))
- {
- // add the current keywords to the recent searches in the cache which are listed on the search page
- if (!empty($keywords) || sizeof($author_ary))
- {
- $sql = 'SELECT search_time
- FROM ' . SEARCH_RESULTS_TABLE . '
- WHERE search_key = \'' . $db->sql_escape($search_key) . '\'';
- $result = $db->sql_query($sql);
-
- if (!$db->sql_fetchrow($result))
- {
- $sql_ary = array(
- 'search_key' => $search_key,
- 'search_time' => time(),
- 'search_keywords' => $keywords,
- 'search_authors' => ' ' . implode(' ', $author_ary) . ' '
- );
-
- $sql = 'INSERT INTO ' . SEARCH_RESULTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
- $db->sql_query($sql);
- }
- $db->sql_freeresult($result);
- }
-
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_last_search = ' . time() . '
- WHERE user_id = ' . $user->data['user_id'];
- $db->sql_query($sql);
-
- $store = array(-1 => $result_count, -2 => $sort_dir);
- $id_range = range($start, $start + $length - 1);
- }
- else
- {
- // we use one set of results for both sort directions so we have to calculate the indizes
- // for the reversed array and we also have to reverse the ids themselves
- if ($store[-2] != $sort_dir)
- {
- $store_ids = array_reverse($store_ids);
- $id_range = range($store[-1] - $start - $length, $store[-1] - $start - 1);
- }
- else
- {
- $id_range = range($start, $start + $length - 1);
- }
- }
-
- $store_ids = array_combine($id_range, $store_ids);
-
- // append the ids
- if (is_array($store_ids))
- {
- $store += $store_ids;
-
- // if the cache is too big
- if (sizeof($store) - 2 > 20 * $config['search_block_size'])
- {
- // remove everything in front of two blocks in front of the current start index
- for ($i = 0, $n = $id_range[0] - 2 * $config['search_block_size']; $i < $n; $i++)
- {
- if (isset($store[$i]))
- {
- unset($store[$i]);
- }
- }
-
- // remove everything after two blocks after the current stop index
- end($id_range);
- for ($i = $store[-1] - 1, $n = current($id_range) + 2 * $config['search_block_size']; $i > $n; $i--)
- {
- if (isset($store[$i]))
- {
- unset($store[$i]);
- }
- }
- }
- $cache->put('_search_results_' . $search_key, $store, $config['search_store_results']);
-
- $sql = 'UPDATE ' . SEARCH_RESULTS_TABLE . '
- SET search_time = ' . time() . '
- WHERE search_key = \'' . $db->sql_escape($search_key) . '\'';
- $db->sql_query($sql);
- }
-
- unset($store);
- unset($store_ids);
- unset($id_range);
- }
-
- /**
- * Removes old entries from the search results table and removes searches with keywords that contain a word in $words.
- */
- function destroy_cache($words, $authors = false)
- {
- global $db, $cache, $config;
-
- // clear all searches that searched for the specified words
- if (sizeof($words))
- {
- $sql_where = '';
- foreach ($words as $word)
- {
- $sql_where .= " OR search_keywords " . $db->sql_like_expression($db->any_char . $word . $db->any_char);
- }
-
- $sql = 'SELECT search_key
- FROM ' . SEARCH_RESULTS_TABLE . "
- WHERE search_keywords LIKE '%*%' $sql_where";
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $cache->destroy('_search_results_' . $row['search_key']);
- }
- $db->sql_freeresult($result);
- }
-
- // clear all searches that searched for the specified authors
- if (is_array($authors) && sizeof($authors))
- {
- $sql_where = '';
- foreach ($authors as $author)
- {
- $sql_where .= (($sql_where) ? ' OR ' : '') . 'search_authors ' . $db->sql_like_expression($db->any_char . ' ' . (int) $author . ' ' . $db->any_char);
- }
-
- $sql = 'SELECT search_key
- FROM ' . SEARCH_RESULTS_TABLE . "
- WHERE $sql_where";
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $cache->destroy('_search_results_' . $row['search_key']);
- }
- $db->sql_freeresult($result);
- }
-
- $sql = 'DELETE
- FROM ' . SEARCH_RESULTS_TABLE . '
- WHERE search_time < ' . (time() - $config['search_store_results']);
- $db->sql_query($sql);
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/session.php b/phpBB/includes/session.php
deleted file mode 100644
index fe5357f32e..0000000000
--- a/phpBB/includes/session.php
+++ /dev/null
@@ -1,2459 +0,0 @@
-<?php
-/**
-*
-* @package phpBB3
-* @version $Id$
-* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* Session class
-* @package phpBB3
-*/
-class session
-{
- var $cookie_data = array();
- var $page = array();
- var $data = array();
- var $browser = '';
- var $forwarded_for = '';
- var $host = '';
- var $session_id = '';
- var $ip = '';
- var $load = 0;
- var $time_now = 0;
- var $update_session_page = true;
-
- /**
- * Extract current session page
- *
- * @param string $root_path current root path (phpbb_root_path)
- */
- function extract_current_page($root_path)
- {
- $page_array = array();
-
- // First of all, get the request uri...
- $script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
- $args = (!empty($_SERVER['QUERY_STRING'])) ? explode('&', $_SERVER['QUERY_STRING']) : explode('&', getenv('QUERY_STRING'));
-
- // If we are unable to get the script name we use REQUEST_URI as a failover and note it within the page array for easier support...
- if (!$script_name)
- {
- $script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
- $script_name = (($pos = strpos($script_name, '?')) !== false) ? substr($script_name, 0, $pos) : $script_name;
- $page_array['failover'] = 1;
- }
-
- // Replace backslashes and doubled slashes (could happen on some proxy setups)
- $script_name = str_replace(array('\\', '//'), '/', $script_name);
-
- // Now, remove the sid and let us get a clean query string...
- $use_args = array();
-
- // Since some browser do not encode correctly we need to do this with some "special" characters...
- // " -> %22, ' => %27, < -> %3C, > -> %3E
- $find = array('"', "'", '<', '>');
- $replace = array('%22', '%27', '%3C', '%3E');
-
- foreach ($args as $key => $argument)
- {
- if (strpos($argument, 'sid=') === 0)
- {
- continue;
- }
-
- $use_args[] = str_replace($find, $replace, $argument);
- }
- unset($args);
-
- // The following examples given are for an request uri of {path to the phpbb directory}/adm/index.php?i=10&b=2
-
- // The current query string
- $query_string = trim(implode('&', $use_args));
-
- // basenamed page name (for example: index.php)
- $page_name = (substr($script_name, -1, 1) == '/') ? '' : basename($script_name);
- $page_name = urlencode(htmlspecialchars($page_name));
-
- // current directory within the phpBB root (for example: adm)
- $root_dirs = explode('/', str_replace('\\', '/', phpbb_realpath($root_path)));
- $page_dirs = explode('/', str_replace('\\', '/', phpbb_realpath('./')));
- $intersection = array_intersect_assoc($root_dirs, $page_dirs);
-
- $root_dirs = array_diff_assoc($root_dirs, $intersection);
- $page_dirs = array_diff_assoc($page_dirs, $intersection);
-
- $page_dir = str_repeat('../', sizeof($root_dirs)) . implode('/', $page_dirs);
-
- if ($page_dir && substr($page_dir, -1, 1) == '/')
- {
- $page_dir = substr($page_dir, 0, -1);
- }
-
- // Current page from phpBB root (for example: adm/index.php?i=10&b=2)
- $page = (($page_dir) ? $page_dir . '/' : '') . $page_name . (($query_string) ? "?$query_string" : '');
-
- // The script path from the webroot to the current directory (for example: /phpBB3/adm/) : always prefixed with / and ends in /
- $script_path = trim(str_replace('\\', '/', dirname($script_name)));
-
- // The script path from the webroot to the phpBB root (for example: /phpBB3/)
- $script_dirs = explode('/', $script_path);
- array_splice($script_dirs, -sizeof($page_dirs));
- $root_script_path = implode('/', $script_dirs) . (sizeof($root_dirs) ? '/' . implode('/', $root_dirs) : '');
-
- // We are on the base level (phpBB root == webroot), lets adjust the variables a bit...
- if (!$root_script_path)
- {
- $root_script_path = ($page_dir) ? str_replace($page_dir, '', $script_path) : $script_path;
- }
-
- $script_path .= (substr($script_path, -1, 1) == '/') ? '' : '/';
- $root_script_path .= (substr($root_script_path, -1, 1) == '/') ? '' : '/';
-
- $page_array += array(
- 'page_name' => $page_name,
- 'page_dir' => $page_dir,
-
- 'query_string' => $query_string,
- 'script_path' => str_replace(' ', '%20', htmlspecialchars($script_path)),
- 'root_script_path' => str_replace(' ', '%20', htmlspecialchars($root_script_path)),
-
- 'page' => $page,
- 'forum' => (isset($_REQUEST['f']) && $_REQUEST['f'] > 0) ? (int) $_REQUEST['f'] : 0,
- );
-
- return $page_array;
- }
-
- /**
- * Get valid hostname/port. HTTP_HOST is used, SERVER_NAME if HTTP_HOST not present.
- */
- function extract_current_hostname()
- {
- global $config;
-
- // Get hostname
- $host = (!empty($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : ((!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME'));
-
- // Should be a string and lowered
- $host = (string) strtolower($host);
-
- // If host is equal the cookie domain or the server name (if config is set), then we assume it is valid
- if ((isset($config['cookie_domain']) && $host === $config['cookie_domain']) || (isset($config['server_name']) && $host === $config['server_name']))
- {
- return $host;
- }
-
- // Is the host actually a IP? If so, we use the IP... (IPv4)
- if (long2ip(ip2long($host)) === $host)
- {
- return $host;
- }
-
- // Now return the hostname (this also removes any port definition). The http:// is prepended to construct a valid URL, hosts never have a scheme assigned
- $host = @parse_url('http://' . $host);
- $host = (!empty($host['host'])) ? $host['host'] : '';
-
- // Remove any portions not removed by parse_url (#)
- $host = str_replace('#', '', $host);
-
- // If, by any means, the host is now empty, we will use a "best approach" way to guess one
- if (empty($host))
- {
- if (!empty($config['server_name']))
- {
- $host = $config['server_name'];
- }
- else if (!empty($config['cookie_domain']))
- {
- $host = (strpos($config['cookie_domain'], '.') === 0) ? substr($config['cookie_domain'], 1) : $config['cookie_domain'];
- }
- else
- {
- // Set to OS hostname or localhost
- $host = (function_exists('php_uname')) ? php_uname('n') : 'localhost';
- }
- }
-
- // It may be still no valid host, but for sure only a hostname (we may further expand on the cookie domain... if set)
- return $host;
- }
-
- /**
- * Start session management
- *
- * This is where all session activity begins. We gather various pieces of
- * information from the client and server. We test to see if a session already
- * exists. If it does, fine and dandy. If it doesn't we'll go on to create a
- * new one ... pretty logical heh? We also examine the system load (if we're
- * running on a system which makes such information readily available) and
- * halt if it's above an admin definable limit.
- *
- * @param bool $update_session_page if true the session page gets updated.
- * This can be set to circumvent certain scripts to update the users last visited page.
- */
- function session_begin($update_session_page = true)
- {
- global $phpEx, $SID, $_SID, $_EXTRA_URL, $db, $config, $phpbb_root_path;
-
- // Give us some basic information
- $this->time_now = time();
- $this->cookie_data = array('u' => 0, 'k' => '');
- $this->update_session_page = $update_session_page;
- $this->browser = (!empty($_SERVER['HTTP_USER_AGENT'])) ? htmlspecialchars((string) $_SERVER['HTTP_USER_AGENT']) : '';
- $this->referer = (!empty($_SERVER['HTTP_REFERER'])) ? htmlspecialchars((string) $_SERVER['HTTP_REFERER']) : '';
- $this->forwarded_for = (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) ? htmlspecialchars((string) $_SERVER['HTTP_X_FORWARDED_FOR']) : '';
-
- $this->host = $this->extract_current_hostname();
- $this->page = $this->extract_current_page($phpbb_root_path);
-
- // if the forwarded for header shall be checked we have to validate its contents
- if ($config['forwarded_for_check'])
- {
- $this->forwarded_for = preg_replace('# {2,}#', ' ', str_replace(',', ' ', $this->forwarded_for));
-
- // split the list of IPs
- $ips = explode(' ', $this->forwarded_for);
- foreach ($ips as $ip)
- {
- // check IPv4 first, the IPv6 is hopefully only going to be used very seldomly
- if (!empty($ip) && !preg_match(get_preg_expression('ipv4'), $ip) && !preg_match(get_preg_expression('ipv6'), $ip))
- {
- // contains invalid data, don't use the forwarded for header
- $this->forwarded_for = '';
- break;
- }
- }
- }
- else
- {
- $this->forwarded_for = '';
- }
-
- if (isset($_COOKIE[$config['cookie_name'] . '_sid']) || isset($_COOKIE[$config['cookie_name'] . '_u']))
- {
- $this->cookie_data['u'] = request_var($config['cookie_name'] . '_u', 0, false, true);
- $this->cookie_data['k'] = request_var($config['cookie_name'] . '_k', '', false, true);
- $this->session_id = request_var($config['cookie_name'] . '_sid', '', false, true);
-
- $SID = (defined('NEED_SID')) ? '?sid=' . $this->session_id : '?sid=';
- $_SID = (defined('NEED_SID')) ? $this->session_id : '';
-
- if (empty($this->session_id))
- {
- $this->session_id = $_SID = request_var('sid', '');
- $SID = '?sid=' . $this->session_id;
- $this->cookie_data = array('u' => 0, 'k' => '');
- }
- }
- else
- {
- $this->session_id = $_SID = request_var('sid', '');
- $SID = '?sid=' . $this->session_id;
- }
-
- $_EXTRA_URL = array();
-
- // Why no forwarded_for et al? Well, too easily spoofed. With the results of my recent requests
- // it's pretty clear that in the majority of cases you'll at least be left with a proxy/cache ip.
- $this->ip = (!empty($_SERVER['REMOTE_ADDR'])) ? (string) $_SERVER['REMOTE_ADDR'] : '';
- $this->ip = preg_replace('# {2,}#', ' ', str_replace(',', ' ', $this->ip));
-
- // split the list of IPs
- $ips = explode(' ', trim($this->ip));
-
- // Default IP if REMOTE_ADDR is invalid
- $this->ip = '127.0.0.1';
-
- foreach ($ips as $ip)
- {
- if (preg_match(get_preg_expression('ipv4'), $ip))
- {
- $this->ip = $ip;
- }
- else if (preg_match(get_preg_expression('ipv6'), $ip))
- {
- // Quick check for IPv4-mapped address in IPv6
- if (stripos($ip, '::ffff:') === 0)
- {
- $ipv4 = substr($ip, 7);
-
- if (preg_match(get_preg_expression('ipv4'), $ipv4))
- {
- $ip = $ipv4;
- }
- }
-
- $this->ip = $ip;
- }
- else
- {
- // We want to use the last valid address in the chain
- // Leave foreach loop when address is invalid
- break;
- }
- }
-
- $this->load = false;
-
- // Load limit check (if applicable)
- if ($config['limit_load'] || $config['limit_search_load'])
- {
- if ((function_exists('sys_getloadavg') && $load = sys_getloadavg()) || ($load = explode(' ', @file_get_contents('/proc/loadavg'))))
- {
- $this->load = array_slice($load, 0, 1);
- $this->load = floatval($this->load[0]);
- }
- else
- {
- set_config('limit_load', '0');
- set_config('limit_search_load', '0');
- }
- }
-
- // if no session id is set, redirect to index.php
- if (defined('NEED_SID') && (!isset($_GET['sid']) || $this->session_id !== $_GET['sid']))
- {
- send_status_line(401, 'Unauthorized');
- redirect(append_sid("{$phpbb_root_path}index.$phpEx"));
- }
-
- // if session id is set
- if (!empty($this->session_id))
- {
- $sql = 'SELECT u.*, s.*
- FROM ' . SESSIONS_TABLE . ' s, ' . USERS_TABLE . " u
- WHERE s.session_id = '" . $db->sql_escape($this->session_id) . "'
- AND u.user_id = s.session_user_id";
- $result = $db->sql_query($sql);
- $this->data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // Did the session exist in the DB?
- if (isset($this->data['user_id']))
- {
- // Validate IP length according to admin ... enforces an IP
- // check on bots if admin requires this
-// $quadcheck = ($config['ip_check_bot'] && $this->data['user_type'] & USER_BOT) ? 4 : $config['ip_check'];
-
- if (strpos($this->ip, ':') !== false && strpos($this->data['session_ip'], ':') !== false)
- {
- $s_ip = short_ipv6($this->data['session_ip'], $config['ip_check']);
- $u_ip = short_ipv6($this->ip, $config['ip_check']);
- }
- else
- {
- $s_ip = implode('.', array_slice(explode('.', $this->data['session_ip']), 0, $config['ip_check']));
- $u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check']));
- }
-
- $s_browser = ($config['browser_check']) ? trim(strtolower(substr($this->data['session_browser'], 0, 149))) : '';
- $u_browser = ($config['browser_check']) ? trim(strtolower(substr($this->browser, 0, 149))) : '';
-
- $s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : '';
- $u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : '';
-
- // referer checks
- // The @ before $config['referer_validation'] suppresses notices present while running the updater
- $check_referer_path = (@$config['referer_validation'] == REFERER_VALIDATE_PATH);
- $referer_valid = true;
-
- // we assume HEAD and TRACE to be foul play and thus only whitelist GET
- if (@$config['referer_validation'] && isset($_SERVER['REQUEST_METHOD']) && strtolower($_SERVER['REQUEST_METHOD']) !== 'get')
- {
- $referer_valid = $this->validate_referer($check_referer_path);
- }
-
- if ($u_ip === $s_ip && $s_browser === $u_browser && $s_forwarded_for === $u_forwarded_for && $referer_valid)
- {
- $session_expired = false;
-
- // Check whether the session is still valid if we have one
- $method = basename(trim($config['auth_method']));
- include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx);
-
- $method = 'validate_session_' . $method;
- if (function_exists($method))
- {
- if (!$method($this->data))
- {
- $session_expired = true;
- }
- }
-
- if (!$session_expired)
- {
- // Check the session length timeframe if autologin is not enabled.
- // Else check the autologin length... and also removing those having autologin enabled but no longer allowed board-wide.
- if (!$this->data['session_autologin'])
- {
- if ($this->data['session_time'] < $this->time_now - ($config['session_length'] + 60))
- {
- $session_expired = true;
- }
- }
- else if (!$config['allow_autologin'] || ($config['max_autologin_time'] && $this->data['session_time'] < $this->time_now - (86400 * (int) $config['max_autologin_time']) + 60))
- {
- $session_expired = true;
- }
- }
-
- if (!$session_expired)
- {
- // Only update session DB a minute or so after last update or if page changes
- if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
- {
- $sql_ary = array('session_time' => $this->time_now);
-
- if ($this->update_session_page)
- {
- $sql_ary['session_page'] = substr($this->page['page'], 0, 199);
- $sql_ary['session_forum_id'] = $this->page['forum'];
- }
-
- $db->sql_return_on_error(true);
-
- $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
- WHERE session_id = '" . $db->sql_escape($this->session_id) . "'";
- $result = $db->sql_query($sql);
-
- $db->sql_return_on_error(false);
-
- // If the database is not yet updated, there will be an error due to the session_forum_id
- // @todo REMOVE for 3.0.2
- if ($result === false)
- {
- unset($sql_ary['session_forum_id']);
-
- $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
- WHERE session_id = '" . $db->sql_escape($this->session_id) . "'";
- $db->sql_query($sql);
- }
-
- if ($this->data['user_id'] != ANONYMOUS && !empty($config['new_member_post_limit']) && $this->data['user_new'] && $config['new_member_post_limit'] <= $this->data['user_posts'])
- {
- $this->leave_newly_registered();
- }
- }
-
- $this->data['is_registered'] = ($this->data['user_id'] != ANONYMOUS && ($this->data['user_type'] == USER_NORMAL || $this->data['user_type'] == USER_FOUNDER)) ? true : false;
- $this->data['is_bot'] = (!$this->data['is_registered'] && $this->data['user_id'] != ANONYMOUS) ? true : false;
- $this->data['user_lang'] = basename($this->data['user_lang']);
-
- return true;
- }
- }
- else
- {
- // Added logging temporarly to help debug bugs...
- if (defined('DEBUG_EXTRA') && $this->data['user_id'] != ANONYMOUS)
- {
- if ($referer_valid)
- {
- add_log('critical', 'LOG_IP_BROWSER_FORWARDED_CHECK', $u_ip, $s_ip, $u_browser, $s_browser, htmlspecialchars($u_forwarded_for), htmlspecialchars($s_forwarded_for));
- }
- else
- {
- add_log('critical', 'LOG_REFERER_INVALID', $this->referer);
- }
- }
- }
- }
- }
-
- // If we reach here then no (valid) session exists. So we'll create a new one
- return $this->session_create();
- }
-
- /**
- * Create a new session
- *
- * If upon trying to start a session we discover there is nothing existing we
- * jump here. Additionally this method is called directly during login to regenerate
- * the session for the specific user. In this method we carry out a number of tasks;
- * garbage collection, (search)bot checking, banned user comparison. Basically
- * though this method will result in a new session for a specific user.
- */
- function session_create($user_id = false, $set_admin = false, $persist_login = false, $viewonline = true)
- {
- global $SID, $_SID, $db, $config, $cache, $phpbb_root_path, $phpEx;
-
- $this->data = array();
-
- /* Garbage collection ... remove old sessions updating user information
- // if necessary. It means (potentially) 11 queries but only infrequently
- if ($this->time_now > $config['session_last_gc'] + $config['session_gc'])
- {
- $this->session_gc();
- }*/
-
- // Do we allow autologin on this board? No? Then override anything
- // that may be requested here
- if (!$config['allow_autologin'])
- {
- $this->cookie_data['k'] = $persist_login = false;
- }
-
- /**
- * Here we do a bot check, oh er saucy! No, not that kind of bot
- * check. We loop through the list of bots defined by the admin and
- * see if we have any useragent and/or IP matches. If we do, this is a
- * bot, act accordingly
- */
- $bot = false;
- $active_bots = $cache->obtain_bots();
-
- foreach ($active_bots as $row)
- {
- if ($row['bot_agent'] && preg_match('#' . str_replace('\*', '.*?', preg_quote($row['bot_agent'], '#')) . '#i', $this->browser))
- {
- $bot = $row['user_id'];
- }
-
- // If ip is supplied, we will make sure the ip is matching too...
- if ($row['bot_ip'] && ($bot || !$row['bot_agent']))
- {
- // Set bot to false, then we only have to set it to true if it is matching
- $bot = false;
-
- foreach (explode(',', $row['bot_ip']) as $bot_ip)
- {
- $bot_ip = trim($bot_ip);
-
- if (!$bot_ip)
- {
- continue;
- }
-
- if (strpos($this->ip, $bot_ip) === 0)
- {
- $bot = (int) $row['user_id'];
- break;
- }
- }
- }
-
- if ($bot)
- {
- break;
- }
- }
-
- $method = basename(trim($config['auth_method']));
- include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx);
-
- $method = 'autologin_' . $method;
- if (function_exists($method))
- {
- $this->data = $method();
-
- if (sizeof($this->data))
- {
- $this->cookie_data['k'] = '';
- $this->cookie_data['u'] = $this->data['user_id'];
- }
- }
-
- // If we're presented with an autologin key we'll join against it.
- // Else if we've been passed a user_id we'll grab data based on that
- if (isset($this->cookie_data['k']) && $this->cookie_data['k'] && $this->cookie_data['u'] && !sizeof($this->data))
- {
- $sql = 'SELECT u.*
- FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k
- WHERE u.user_id = ' . (int) $this->cookie_data['u'] . '
- AND u.user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ")
- AND k.user_id = u.user_id
- AND k.key_id = '" . $db->sql_escape(md5($this->cookie_data['k'])) . "'";
- $result = $db->sql_query($sql);
- $this->data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- $bot = false;
- }
- else if ($user_id !== false && !sizeof($this->data))
- {
- $this->cookie_data['k'] = '';
- $this->cookie_data['u'] = $user_id;
-
- $sql = 'SELECT *
- FROM ' . USERS_TABLE . '
- WHERE user_id = ' . (int) $this->cookie_data['u'] . '
- AND user_type IN (' . USER_NORMAL . ', ' . USER_FOUNDER . ')';
- $result = $db->sql_query($sql);
- $this->data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- $bot = false;
- }
-
- // Bot user, if they have a SID in the Request URI we need to get rid of it
- // otherwise they'll index this page with the SID, duplicate content oh my!
- if ($bot && isset($_GET['sid']))
- {
- send_status_line(301, 'Moved Permanently');
- redirect(build_url(array('sid')));
- }
-
- // If no data was returned one or more of the following occurred:
- // Key didn't match one in the DB
- // User does not exist
- // User is inactive
- // User is bot
- if (!sizeof($this->data) || !is_array($this->data))
- {
- $this->cookie_data['k'] = '';
- $this->cookie_data['u'] = ($bot) ? $bot : ANONYMOUS;
-
- if (!$bot)
- {
- $sql = 'SELECT *
- FROM ' . USERS_TABLE . '
- WHERE user_id = ' . (int) $this->cookie_data['u'];
- }
- else
- {
- // We give bots always the same session if it is not yet expired.
- $sql = 'SELECT u.*, s.*
- FROM ' . USERS_TABLE . ' u
- LEFT JOIN ' . SESSIONS_TABLE . ' s ON (s.session_user_id = u.user_id)
- WHERE u.user_id = ' . (int) $bot;
- }
-
- $result = $db->sql_query($sql);
- $this->data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- }
-
- if ($this->data['user_id'] != ANONYMOUS && !$bot)
- {
- $this->data['session_last_visit'] = (isset($this->data['session_time']) && $this->data['session_time']) ? $this->data['session_time'] : (($this->data['user_lastvisit']) ? $this->data['user_lastvisit'] : time());
- }
- else
- {
- $this->data['session_last_visit'] = $this->time_now;
- }
-
- // Force user id to be integer...
- $this->data['user_id'] = (int) $this->data['user_id'];
-
- // At this stage we should have a filled data array, defined cookie u and k data.
- // data array should contain recent session info if we're a real user and a recent
- // session exists in which case session_id will also be set
-
- // Is user banned? Are they excluded? Won't return on ban, exists within method
- if ($this->data['user_type'] != USER_FOUNDER)
- {
- if (!$config['forwarded_for_check'])
- {
- $this->check_ban($this->data['user_id'], $this->ip);
- }
- else
- {
- $ips = explode(' ', $this->forwarded_for);
- $ips[] = $this->ip;
- $this->check_ban($this->data['user_id'], $ips);
- }
- }
-
- $this->data['is_registered'] = (!$bot && $this->data['user_id'] != ANONYMOUS && ($this->data['user_type'] == USER_NORMAL || $this->data['user_type'] == USER_FOUNDER)) ? true : false;
- $this->data['is_bot'] = ($bot) ? true : false;
-
- // If our friend is a bot, we re-assign a previously assigned session
- if ($this->data['is_bot'] && $bot == $this->data['user_id'] && $this->data['session_id'])
- {
- // Only assign the current session if the ip, browser and forwarded_for match...
- if (strpos($this->ip, ':') !== false && strpos($this->data['session_ip'], ':') !== false)
- {
- $s_ip = short_ipv6($this->data['session_ip'], $config['ip_check']);
- $u_ip = short_ipv6($this->ip, $config['ip_check']);
- }
- else
- {
- $s_ip = implode('.', array_slice(explode('.', $this->data['session_ip']), 0, $config['ip_check']));
- $u_ip = implode('.', array_slice(explode('.', $this->ip), 0, $config['ip_check']));
- }
-
- $s_browser = ($config['browser_check']) ? trim(strtolower(substr($this->data['session_browser'], 0, 149))) : '';
- $u_browser = ($config['browser_check']) ? trim(strtolower(substr($this->browser, 0, 149))) : '';
-
- $s_forwarded_for = ($config['forwarded_for_check']) ? substr($this->data['session_forwarded_for'], 0, 254) : '';
- $u_forwarded_for = ($config['forwarded_for_check']) ? substr($this->forwarded_for, 0, 254) : '';
-
- if ($u_ip === $s_ip && $s_browser === $u_browser && $s_forwarded_for === $u_forwarded_for)
- {
- $this->session_id = $this->data['session_id'];
-
- // Only update session DB a minute or so after last update or if page changes
- if ($this->time_now - $this->data['session_time'] > 60 || ($this->update_session_page && $this->data['session_page'] != $this->page['page']))
- {
- $this->data['session_time'] = $this->data['session_last_visit'] = $this->time_now;
-
- $sql_ary = array('session_time' => $this->time_now, 'session_last_visit' => $this->time_now, 'session_admin' => 0);
-
- if ($this->update_session_page)
- {
- $sql_ary['session_page'] = substr($this->page['page'], 0, 199);
- $sql_ary['session_forum_id'] = $this->page['forum'];
- }
-
- $sql = 'UPDATE ' . SESSIONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
- WHERE session_id = '" . $db->sql_escape($this->session_id) . "'";
- $db->sql_query($sql);
-
- // Update the last visit time
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_lastvisit = ' . (int) $this->data['session_time'] . '
- WHERE user_id = ' . (int) $this->data['user_id'];
- $db->sql_query($sql);
- }
-
- $SID = '?sid=';
- $_SID = '';
- return true;
- }
- else
- {
- // If the ip and browser does not match make sure we only have one bot assigned to one session
- $db->sql_query('DELETE FROM ' . SESSIONS_TABLE . ' WHERE session_user_id = ' . $this->data['user_id']);
- }
- }
-
- $session_autologin = (($this->cookie_data['k'] || $persist_login) && $this->data['is_registered']) ? true : false;
- $set_admin = ($set_admin && $this->data['is_registered']) ? true : false;
-
- // Create or update the session
- $sql_ary = array(
- 'session_user_id' => (int) $this->data['user_id'],
- 'session_start' => (int) $this->time_now,
- 'session_last_visit' => (int) $this->data['session_last_visit'],
- 'session_time' => (int) $this->time_now,
- 'session_browser' => (string) trim(substr($this->browser, 0, 149)),
- 'session_forwarded_for' => (string) $this->forwarded_for,
- 'session_ip' => (string) $this->ip,
- 'session_autologin' => ($session_autologin) ? 1 : 0,
- 'session_admin' => ($set_admin) ? 1 : 0,
- 'session_viewonline' => ($viewonline) ? 1 : 0,
- );
-
- if ($this->update_session_page)
- {
- $sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199);
- $sql_ary['session_forum_id'] = $this->page['forum'];
- }
-
- $db->sql_return_on_error(true);
-
- $sql = 'DELETE
- FROM ' . SESSIONS_TABLE . '
- WHERE session_id = \'' . $db->sql_escape($this->session_id) . '\'
- AND session_user_id = ' . ANONYMOUS;
-
- if (!defined('IN_ERROR_HANDLER') && (!$this->session_id || !$db->sql_query($sql) || !$db->sql_affectedrows()))
- {
- // Limit new sessions in 1 minute period (if required)
- if (empty($this->data['session_time']) && $config['active_sessions'])
- {
-// $db->sql_return_on_error(false);
-
- $sql = 'SELECT COUNT(session_id) AS sessions
- FROM ' . SESSIONS_TABLE . '
- WHERE session_time >= ' . ($this->time_now - 60);
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- if ((int) $row['sessions'] > (int) $config['active_sessions'])
- {
- send_status_line(503, 'Service Unavailable');
- trigger_error('BOARD_UNAVAILABLE');
- }
- }
- }
-
- // Since we re-create the session id here, the inserted row must be unique. Therefore, we display potential errors.
- // Commented out because it will not allow forums to update correctly
-// $db->sql_return_on_error(false);
-
- // Something quite important: session_page always holds the *last* page visited, except for the *first* visit.
- // We are not able to simply have an empty session_page btw, therefore we need to tell phpBB how to detect this special case.
- // If the session id is empty, we have a completely new one and will set an "identifier" here. This identifier is able to be checked later.
- if (empty($this->data['session_id']))
- {
- // This is a temporary variable, only set for the very first visit
- $this->data['session_created'] = true;
- }
-
- $this->session_id = $this->data['session_id'] = md5(unique_id());
-
- $sql_ary['session_id'] = (string) $this->session_id;
- $sql_ary['session_page'] = (string) substr($this->page['page'], 0, 199);
- $sql_ary['session_forum_id'] = $this->page['forum'];
-
- $sql = 'INSERT INTO ' . SESSIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
- $db->sql_query($sql);
-
- $db->sql_return_on_error(false);
-
- // Regenerate autologin/persistent login key
- if ($session_autologin)
- {
- $this->set_login_key();
- }
-
- // refresh data
- $SID = '?sid=' . $this->session_id;
- $_SID = $this->session_id;
- $this->data = array_merge($this->data, $sql_ary);
-
- if (!$bot)
- {
- $cookie_expire = $this->time_now + (($config['max_autologin_time']) ? 86400 * (int) $config['max_autologin_time'] : 31536000);
-
- $this->set_cookie('u', $this->cookie_data['u'], $cookie_expire);
- $this->set_cookie('k', $this->cookie_data['k'], $cookie_expire);
- $this->set_cookie('sid', $this->session_id, $cookie_expire);
-
- unset($cookie_expire);
-
- $sql = 'SELECT COUNT(session_id) AS sessions
- FROM ' . SESSIONS_TABLE . '
- WHERE session_user_id = ' . (int) $this->data['user_id'] . '
- AND session_time >= ' . (int) ($this->time_now - (max($config['session_length'], $config['form_token_lifetime'])));
- $result = $db->sql_query($sql);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- if ((int) $row['sessions'] <= 1 || empty($this->data['user_form_salt']))
- {
- $this->data['user_form_salt'] = unique_id();
- // Update the form key
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_form_salt = \'' . $db->sql_escape($this->data['user_form_salt']) . '\'
- WHERE user_id = ' . (int) $this->data['user_id'];
- $db->sql_query($sql);
- }
- }
- else
- {
- $this->data['session_time'] = $this->data['session_last_visit'] = $this->time_now;
-
- // Update the last visit time
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_lastvisit = ' . (int) $this->data['session_time'] . '
- WHERE user_id = ' . (int) $this->data['user_id'];
- $db->sql_query($sql);
-
- $SID = '?sid=';
- $_SID = '';
- }
-
- return true;
- }
-
- /**
- * Kills a session
- *
- * This method does what it says on the tin. It will delete a pre-existing session.
- * It resets cookie information (destroying any autologin key within that cookie data)
- * and update the users information from the relevant session data. It will then
- * grab guest user information.
- */
- function session_kill($new_session = true)
- {
- global $SID, $_SID, $db, $config, $phpbb_root_path, $phpEx;
-
- $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
- WHERE session_id = '" . $db->sql_escape($this->session_id) . "'
- AND session_user_id = " . (int) $this->data['user_id'];
- $db->sql_query($sql);
-
- // Allow connecting logout with external auth method logout
- $method = basename(trim($config['auth_method']));
- include_once($phpbb_root_path . 'includes/auth/auth_' . $method . '.' . $phpEx);
-
- $method = 'logout_' . $method;
- if (function_exists($method))
- {
- $method($this->data, $new_session);
- }
-
- if ($this->data['user_id'] != ANONYMOUS)
- {
- // Delete existing session, update last visit info first!
- if (!isset($this->data['session_time']))
- {
- $this->data['session_time'] = time();
- }
-
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_lastvisit = ' . (int) $this->data['session_time'] . '
- WHERE user_id = ' . (int) $this->data['user_id'];
- $db->sql_query($sql);
-
- if ($this->cookie_data['k'])
- {
- $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
- WHERE user_id = ' . (int) $this->data['user_id'] . "
- AND key_id = '" . $db->sql_escape(md5($this->cookie_data['k'])) . "'";
- $db->sql_query($sql);
- }
-
- // Reset the data array
- $this->data = array();
-
- $sql = 'SELECT *
- FROM ' . USERS_TABLE . '
- WHERE user_id = ' . ANONYMOUS;
- $result = $db->sql_query($sql);
- $this->data = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- }
-
- $cookie_expire = $this->time_now - 31536000;
- $this->set_cookie('u', '', $cookie_expire);
- $this->set_cookie('k', '', $cookie_expire);
- $this->set_cookie('sid', '', $cookie_expire);
- unset($cookie_expire);
-
- $SID = '?sid=';
- $this->session_id = $_SID = '';
-
- // To make sure a valid session is created we create one for the anonymous user
- if ($new_session)
- {
- $this->session_create(ANONYMOUS);
- }
-
- return true;
- }
-
- /**
- * Session garbage collection
- *
- * This looks a lot more complex than it really is. Effectively we are
- * deleting any sessions older than an admin definable limit. Due to the
- * way in which we maintain session data we have to ensure we update user
- * data before those sessions are destroyed. In addition this method
- * removes autologin key information that is older than an admin defined
- * limit.
- */
- function session_gc()
- {
- global $db, $config, $phpbb_root_path, $phpEx;
-
- $batch_size = 10;
-
- if (!$this->time_now)
- {
- $this->time_now = time();
- }
-
- // Firstly, delete guest sessions
- $sql = 'DELETE FROM ' . SESSIONS_TABLE . '
- WHERE session_user_id = ' . ANONYMOUS . '
- AND session_time < ' . (int) ($this->time_now - $config['session_length']);
- $db->sql_query($sql);
-
- // Get expired sessions, only most recent for each user
- $sql = 'SELECT session_user_id, session_page, MAX(session_time) AS recent_time
- FROM ' . SESSIONS_TABLE . '
- WHERE session_time < ' . ($this->time_now - $config['session_length']) . '
- GROUP BY session_user_id, session_page';
- $result = $db->sql_query_limit($sql, $batch_size);
-
- $del_user_id = array();
- $del_sessions = 0;
-
- while ($row = $db->sql_fetchrow($result))
- {
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_lastvisit = ' . (int) $row['recent_time'] . ", user_lastpage = '" . $db->sql_escape($row['session_page']) . "'
- WHERE user_id = " . (int) $row['session_user_id'];
- $db->sql_query($sql);
-
- $del_user_id[] = (int) $row['session_user_id'];
- $del_sessions++;
- }
- $db->sql_freeresult($result);
-
- if (sizeof($del_user_id))
- {
- // Delete expired sessions
- $sql = 'DELETE FROM ' . SESSIONS_TABLE . '
- WHERE ' . $db->sql_in_set('session_user_id', $del_user_id) . '
- AND session_time < ' . ($this->time_now - $config['session_length']);
- $db->sql_query($sql);
- }
-
- if ($del_sessions < $batch_size)
- {
- // Less than 10 users, update gc timer ... else we want gc
- // called again to delete other sessions
- set_config('session_last_gc', $this->time_now, true);
-
- if ($config['max_autologin_time'])
- {
- $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
- WHERE last_login < ' . (time() - (86400 * (int) $config['max_autologin_time']));
- $db->sql_query($sql);
- }
-
- // only called from CRON; should be a safe workaround until the infrastructure gets going
- if (!class_exists('phpbb_captcha_factory'))
- {
- include($phpbb_root_path . "includes/captcha/captcha_factory." . $phpEx);
- }
- phpbb_captcha_factory::garbage_collect($config['captcha_plugin']);
-
- $sql = 'DELETE FROM ' . LOGIN_ATTEMPT_TABLE . '
- WHERE attempt_time < ' . (time() - (int) $config['ip_login_limit_time']);
- $db->sql_query($sql);
- }
-
- return;
- }
-
- /**
- * Sets a cookie
- *
- * Sets a cookie of the given name with the specified data for the given length of time. If no time is specified, a session cookie will be set.
- *
- * @param string $name Name of the cookie, will be automatically prefixed with the phpBB cookie name. track becomes [cookie_name]_track then.
- * @param string $cookiedata The data to hold within the cookie
- * @param int $cookietime The expiration time as UNIX timestamp. If 0 is provided, a session cookie is set.
- */
- function set_cookie($name, $cookiedata, $cookietime)
- {
- global $config;
-
- $name_data = rawurlencode($config['cookie_name'] . '_' . $name) . '=' . rawurlencode($cookiedata);
- $expire = gmdate('D, d-M-Y H:i:s \\G\\M\\T', $cookietime);
- $domain = (!$config['cookie_domain'] || $config['cookie_domain'] == 'localhost' || $config['cookie_domain'] == '127.0.0.1') ? '' : '; domain=' . $config['cookie_domain'];
-
- header('Set-Cookie: ' . $name_data . (($cookietime) ? '; expires=' . $expire : '') . '; path=' . $config['cookie_path'] . $domain . ((!$config['cookie_secure']) ? '' : '; secure') . '; HttpOnly', false);
- }
-
- /**
- * Check for banned user
- *
- * Checks whether the supplied user is banned by id, ip or email. If no parameters
- * are passed to the method pre-existing session data is used. If $return is false
- * this routine does not return on finding a banned user, it outputs a relevant
- * message and stops execution.
- *
- * @param string|array $user_ips Can contain a string with one IP or an array of multiple IPs
- */
- function check_ban($user_id = false, $user_ips = false, $user_email = false, $return = false)
- {
- global $config, $db;
-
- if (defined('IN_CHECK_BAN'))
- {
- return;
- }
-
- $banned = false;
- $cache_ttl = 3600;
- $where_sql = array();
-
- $sql = 'SELECT ban_ip, ban_userid, ban_email, ban_exclude, ban_give_reason, ban_end
- FROM ' . BANLIST_TABLE . '
- WHERE ';
-
- // Determine which entries to check, only return those
- if ($user_email === false)
- {
- $where_sql[] = "ban_email = ''";
- }
-
- if ($user_ips === false)
- {
- $where_sql[] = "(ban_ip = '' OR ban_exclude = 1)";
- }
-
- if ($user_id === false)
- {
- $where_sql[] = '(ban_userid = 0 OR ban_exclude = 1)';
- }
- else
- {
- $cache_ttl = ($user_id == ANONYMOUS) ? 3600 : 0;
- $_sql = '(ban_userid = ' . $user_id;
-
- if ($user_email !== false)
- {
- $_sql .= " OR ban_email <> ''";
- }
-
- if ($user_ips !== false)
- {
- $_sql .= " OR ban_ip <> ''";
- }
-
- $_sql .= ')';
-
- $where_sql[] = $_sql;
- }
-
- $sql .= (sizeof($where_sql)) ? implode(' AND ', $where_sql) : '';
- $result = $db->sql_query($sql, $cache_ttl);
-
- $ban_triggered_by = 'user';
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['ban_end'] && $row['ban_end'] < time())
- {
- continue;
- }
-
- $ip_banned = false;
- if (!empty($row['ban_ip']))
- {
- if (!is_array($user_ips))
- {
- $ip_banned = preg_match('#^' . str_replace('\*', '.*?', preg_quote($row['ban_ip'], '#')) . '$#i', $user_ips);
- }
- else
- {
- foreach ($user_ips as $user_ip)
- {
- if (preg_match('#^' . str_replace('\*', '.*?', preg_quote($row['ban_ip'], '#')) . '$#i', $user_ip))
- {
- $ip_banned = true;
- break;
- }
- }
- }
- }
-
- if ((!empty($row['ban_userid']) && intval($row['ban_userid']) == $user_id) ||
- $ip_banned ||
- (!empty($row['ban_email']) && preg_match('#^' . str_replace('\*', '.*?', preg_quote($row['ban_email'], '#')) . '$#i', $user_email)))
- {
- if (!empty($row['ban_exclude']))
- {
- $banned = false;
- break;
- }
- else
- {
- $banned = true;
- $ban_row = $row;
-
- if (!empty($row['ban_userid']) && intval($row['ban_userid']) == $user_id)
- {
- $ban_triggered_by = 'user';
- }
- else if ($ip_banned)
- {
- $ban_triggered_by = 'ip';
- }
- else
- {
- $ban_triggered_by = 'email';
- }
-
- // Don't break. Check if there is an exclude rule for this user
- }
- }
- }
- $db->sql_freeresult($result);
-
- if ($banned && !$return)
- {
- global $template;
-
- // If the session is empty we need to create a valid one...
- if (empty($this->session_id))
- {
- // This seems to be no longer needed? - #14971
-// $this->session_create(ANONYMOUS);
- }
-
- // Initiate environment ... since it won't be set at this stage
- $this->setup();
-
- // Logout the user, banned users are unable to use the normal 'logout' link
- if ($this->data['user_id'] != ANONYMOUS)
- {
- $this->session_kill();
- }
-
- // We show a login box here to allow founders accessing the board if banned by IP
- if (defined('IN_LOGIN') && $this->data['user_id'] == ANONYMOUS)
- {
- global $phpEx;
-
- $this->setup('ucp');
- $this->data['is_registered'] = $this->data['is_bot'] = false;
-
- // Set as a precaution to allow login_box() handling this case correctly as well as this function not being executed again.
- define('IN_CHECK_BAN', 1);
-
- login_box("index.$phpEx");
-
- // The false here is needed, else the user is able to circumvent the ban.
- $this->session_kill(false);
- }
-
- // Ok, we catch the case of an empty session id for the anonymous user...
- // This can happen if the user is logging in, banned by username and the login_box() being called "again".
- if (empty($this->session_id) && defined('IN_CHECK_BAN'))
- {
- $this->session_create(ANONYMOUS);
- }
-
-
- // Determine which message to output
- $till_date = ($ban_row['ban_end']) ? $this->format_date($ban_row['ban_end']) : '';
- $message = ($ban_row['ban_end']) ? 'BOARD_BAN_TIME' : 'BOARD_BAN_PERM';
-
- $message = sprintf($this->lang[$message], $till_date, '<a href="mailto:' . $config['board_contact'] . '">', '</a>');
- $message .= ($ban_row['ban_give_reason']) ? '<br /><br />' . sprintf($this->lang['BOARD_BAN_REASON'], $ban_row['ban_give_reason']) : '';
- $message .= '<br /><br /><em>' . $this->lang['BAN_TRIGGERED_BY_' . strtoupper($ban_triggered_by)] . '</em>';
-
- // To circumvent session_begin returning a valid value and the check_ban() not called on second page view, we kill the session again
- $this->session_kill(false);
-
- // A very special case... we are within the cron script which is not supposed to print out the ban message... show blank page
- if (defined('IN_CRON'))
- {
- garbage_collection();
- exit_handler();
- exit;
- }
-
- trigger_error($message);
- }
-
- return ($banned && $ban_row['ban_give_reason']) ? $ban_row['ban_give_reason'] : $banned;
- }
-
- /**
- * Check if ip is blacklisted
- * This should be called only where absolutly necessary
- *
- * Only IPv4 (rbldns does not support AAAA records/IPv6 lookups)
- *
- * @author satmd (from the php manual)
- * @param string $mode register/post - spamcop for example is ommitted for posting
- * @return false if ip is not blacklisted, else an array([checked server], [lookup])
- */
- function check_dnsbl($mode, $ip = false)
- {
- if ($ip === false)
- {
- $ip = $this->ip;
- }
-
- // Neither Spamhaus nor Spamcop supports IPv6 addresses.
- if (strpos($ip, ':') !== false)
- {
- return false;
- }
-
- $dnsbl_check = array(
- 'sbl.spamhaus.org' => 'http://www.spamhaus.org/query/bl?ip=',
- );
-
- if ($mode == 'register')
- {
- $dnsbl_check['bl.spamcop.net'] = 'http://spamcop.net/bl.shtml?';
- }
-
- if ($ip)
- {
- $quads = explode('.', $ip);
- $reverse_ip = $quads[3] . '.' . $quads[2] . '.' . $quads[1] . '.' . $quads[0];
-
- // Need to be listed on all servers...
- $listed = true;
- $info = array();
-
- foreach ($dnsbl_check as $dnsbl => $lookup)
- {
- if (phpbb_checkdnsrr($reverse_ip . '.' . $dnsbl . '.', 'A') === true)
- {
- $info = array($dnsbl, $lookup . $ip);
- }
- else
- {
- $listed = false;
- }
- }
-
- if ($listed)
- {
- return $info;
- }
- }
-
- return false;
- }
-
- /**
- * Check if URI is blacklisted
- * This should be called only where absolutly necessary, for example on the submitted website field
- * This function is not in use at the moment and is only included for testing purposes, it may not work at all!
- * This means it is untested at the moment and therefore commented out
- *
- * @param string $uri URI to check
- * @return true if uri is on blacklist, else false. Only blacklist is checked (~zero FP), no grey lists
- function check_uribl($uri)
- {
- // Normally parse_url() is not intended to parse uris
- // We need to get the top-level domain name anyway... change.
- $uri = parse_url($uri);
-
- if ($uri === false || empty($uri['host']))
- {
- return false;
- }
-
- $uri = trim($uri['host']);
-
- if ($uri)
- {
- // One problem here... the return parameter for the "windows" method is different from what
- // we expect... this may render this check useless...
- if (phpbb_checkdnsrr($uri . '.multi.uribl.com.', 'A') === true)
- {
- return true;
- }
- }
-
- return false;
- }
- */
-
- /**
- * Set/Update a persistent login key
- *
- * This method creates or updates a persistent session key. When a user makes
- * use of persistent (formerly auto-) logins a key is generated and stored in the
- * DB. When they revisit with the same key it's automatically updated in both the
- * DB and cookie. Multiple keys may exist for each user representing different
- * browsers or locations. As with _any_ non-secure-socket no passphrase login this
- * remains vulnerable to exploit.
- */
- function set_login_key($user_id = false, $key = false, $user_ip = false)
- {
- global $config, $db;
-
- $user_id = ($user_id === false) ? $this->data['user_id'] : $user_id;
- $user_ip = ($user_ip === false) ? $this->ip : $user_ip;
- $key = ($key === false) ? (($this->cookie_data['k']) ? $this->cookie_data['k'] : false) : $key;
-
- $key_id = unique_id(hexdec(substr($this->session_id, 0, 8)));
-
- $sql_ary = array(
- 'key_id' => (string) md5($key_id),
- 'last_ip' => (string) $this->ip,
- 'last_login' => (int) time()
- );
-
- if (!$key)
- {
- $sql_ary += array(
- 'user_id' => (int) $user_id
- );
- }
-
- if ($key)
- {
- $sql = 'UPDATE ' . SESSIONS_KEYS_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
- WHERE user_id = ' . (int) $user_id . "
- AND key_id = '" . $db->sql_escape(md5($key)) . "'";
- }
- else
- {
- $sql = 'INSERT INTO ' . SESSIONS_KEYS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
- }
- $db->sql_query($sql);
-
- $this->cookie_data['k'] = $key_id;
-
- return false;
- }
-
- /**
- * Reset all login keys for the specified user
- *
- * This method removes all current login keys for a specified (or the current)
- * user. It will be called on password change to render old keys unusable
- */
- function reset_login_keys($user_id = false)
- {
- global $config, $db;
-
- $user_id = ($user_id === false) ? (int) $this->data['user_id'] : (int) $user_id;
-
- $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
- WHERE user_id = ' . (int) $user_id;
- $db->sql_query($sql);
-
- // If the user is logged in, update last visit info first before deleting sessions
- $sql = 'SELECT session_time, session_page
- FROM ' . SESSIONS_TABLE . '
- WHERE session_user_id = ' . (int) $user_id . '
- ORDER BY session_time DESC';
- $result = $db->sql_query_limit($sql, 1);
- $row = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- if ($row)
- {
- $sql = 'UPDATE ' . USERS_TABLE . '
- SET user_lastvisit = ' . (int) $row['session_time'] . ", user_lastpage = '" . $db->sql_escape($row['session_page']) . "'
- WHERE user_id = " . (int) $user_id;
- $db->sql_query($sql);
- }
-
- // Let's also clear any current sessions for the specified user_id
- // If it's the current user then we'll leave this session intact
- $sql_where = 'session_user_id = ' . (int) $user_id;
- $sql_where .= ($user_id === (int) $this->data['user_id']) ? " AND session_id <> '" . $db->sql_escape($this->session_id) . "'" : '';
-
- $sql = 'DELETE FROM ' . SESSIONS_TABLE . "
- WHERE $sql_where";
- $db->sql_query($sql);
-
- // We're changing the password of the current user and they have a key
- // Lets regenerate it to be safe
- if ($user_id === (int) $this->data['user_id'] && $this->cookie_data['k'])
- {
- $this->set_login_key($user_id);
- }
- }
-
-
- /**
- * Check if the request originated from the same page.
- * @param bool $check_script_path If true, the path will be checked as well
- */
- function validate_referer($check_script_path = false)
- {
- global $config;
-
- // no referer - nothing to validate, user's fault for turning it off (we only check on POST; so meta can't be the reason)
- if (empty($this->referer) || empty($this->host))
- {
- return true;
- }
-
- $host = htmlspecialchars($this->host);
- $ref = substr($this->referer, strpos($this->referer, '://') + 3);
-
- if (!(stripos($ref, $host) === 0) && (!$config['force_server_vars'] || !(stripos($ref, $config['server_name']) === 0)))
- {
- return false;
- }
- else if ($check_script_path && rtrim($this->page['root_script_path'], '/') !== '')
- {
- $ref = substr($ref, strlen($host));
- $server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
-
- if ($server_port !== 80 && $server_port !== 443 && stripos($ref, ":$server_port") === 0)
- {
- $ref = substr($ref, strlen(":$server_port"));
- }
-
- if (!(stripos(rtrim($ref, '/'), rtrim($this->page['root_script_path'], '/')) === 0))
- {
- return false;
- }
- }
-
- return true;
- }
-
-
- function unset_admin()
- {
- global $db;
- $sql = 'UPDATE ' . SESSIONS_TABLE . '
- SET session_admin = 0
- WHERE session_id = \'' . $db->sql_escape($this->session_id) . '\'';
- $db->sql_query($sql);
- }
-}
-
-
-/**
-* Base user class
-*
-* This is the overarching class which contains (through session extend)
-* all methods utilised for user functionality during a session.
-*
-* @package phpBB3
-*/
-class user extends session
-{
- var $lang = array();
- var $help = array();
- var $theme = array();
- var $date_format;
- var $timezone;
- var $dst;
-
- var $lang_name = false;
- var $lang_id = false;
- var $lang_path;
- var $img_lang;
- var $img_array = array();
-
- // Able to add new options (up to id 31)
- var $keyoptions = array('viewimg' => 0, 'viewflash' => 1, 'viewsmilies' => 2, 'viewsigs' => 3, 'viewavatars' => 4, 'viewcensors' => 5, 'attachsig' => 6, 'bbcode' => 8, 'smilies' => 9, 'popuppm' => 10, 'sig_bbcode' => 15, 'sig_smilies' => 16, 'sig_links' => 17);
-
- /**
- * Constructor to set the lang path
- */
- function user()
- {
- global $phpbb_root_path;
-
- $this->lang_path = $phpbb_root_path . 'language/';
- }
-
- /**
- * Function to set custom language path (able to use directory outside of phpBB)
- *
- * @param string $lang_path New language path used.
- * @access public
- */
- function set_custom_lang_path($lang_path)
- {
- $this->lang_path = $lang_path;
-
- if (substr($this->lang_path, -1) != '/')
- {
- $this->lang_path .= '/';
- }
- }
-
- /**
- * Setup basic user-specific items (style, language, ...)
- */
- function setup($lang_set = false, $style = false)
- {
- global $db, $template, $config, $auth, $phpEx, $phpbb_root_path, $cache;
-
- if ($this->data['user_id'] != ANONYMOUS)
- {
- $this->lang_name = (file_exists($this->lang_path . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : basename($config['default_lang']);
-
- $this->date_format = $this->data['user_dateformat'];
- $this->timezone = $this->data['user_timezone'] * 3600;
- $this->dst = $this->data['user_dst'] * 3600;
- }
- else
- {
- $this->lang_name = basename($config['default_lang']);
- $this->date_format = $config['default_dateformat'];
- $this->timezone = $config['board_timezone'] * 3600;
- $this->dst = $config['board_dst'] * 3600;
-
- /**
- * If a guest user is surfing, we try to guess his/her language first by obtaining the browser language
- * If re-enabled we need to make sure only those languages installed are checked
- * Commented out so we do not loose the code.
-
- if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']))
- {
- $accept_lang_ary = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
-
- foreach ($accept_lang_ary as $accept_lang)
- {
- // Set correct format ... guess full xx_YY form
- $accept_lang = substr($accept_lang, 0, 2) . '_' . strtoupper(substr($accept_lang, 3, 2));
- $accept_lang = basename($accept_lang);
-
- if (file_exists($this->lang_path . $accept_lang . "/common.$phpEx"))
- {
- $this->lang_name = $config['default_lang'] = $accept_lang;
- break;
- }
- else
- {
- // No match on xx_YY so try xx
- $accept_lang = substr($accept_lang, 0, 2);
- $accept_lang = basename($accept_lang);
-
- if (file_exists($this->lang_path . $accept_lang . "/common.$phpEx"))
- {
- $this->lang_name = $config['default_lang'] = $accept_lang;
- break;
- }
- }
- }
- }
- */
- }
-
- // We include common language file here to not load it every time a custom language file is included
- $lang = &$this->lang;
-
- // Do not suppress error if in DEBUG_EXTRA mode
- $include_result = (defined('DEBUG_EXTRA')) ? (include $this->lang_path . $this->lang_name . "/common.$phpEx") : (@include $this->lang_path . $this->lang_name . "/common.$phpEx");
-
- if ($include_result === false)
- {
- die('Language file ' . $this->lang_path . $this->lang_name . "/common.$phpEx" . " couldn't be opened.");
- }
-
- $this->add_lang($lang_set);
- unset($lang_set);
-
- if (!empty($_GET['style']) && $auth->acl_get('a_styles') && !defined('ADMIN_START'))
- {
- global $SID, $_EXTRA_URL;
-
- $style = request_var('style', 0);
- $SID .= '&amp;style=' . $style;
- $_EXTRA_URL = array('style=' . $style);
- }
- else
- {
- // Set up style
- $style = ($style) ? $style : ((!$config['override_user_style']) ? $this->data['user_style'] : $config['default_style']);
- }
-
- $sql = 'SELECT s.style_id, t.template_storedb, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_name, c.theme_storedb, c.theme_id, i.imageset_path, i.imageset_id, i.imageset_name
- FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i
- WHERE s.style_id = $style
- AND t.template_id = s.template_id
- AND c.theme_id = s.theme_id
- AND i.imageset_id = s.imageset_id";
- $result = $db->sql_query($sql, 3600);
- $this->theme = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
-
- // User has wrong style
- if (!$this->theme && $style == $this->data['user_style'])
- {
- $style = $this->data['user_style'] = $config['default_style'];
-
- $sql = 'UPDATE ' . USERS_TABLE . "
- SET user_style = $style
- WHERE user_id = {$this->data['user_id']}";
- $db->sql_query($sql);
-
- $sql = 'SELECT s.style_id, t.template_storedb, t.template_path, t.template_id, t.bbcode_bitfield, c.theme_path, c.theme_name, c.theme_storedb, c.theme_id, i.imageset_path, i.imageset_id, i.imageset_name
- FROM ' . STYLES_TABLE . ' s, ' . STYLES_TEMPLATE_TABLE . ' t, ' . STYLES_THEME_TABLE . ' c, ' . STYLES_IMAGESET_TABLE . " i
- WHERE s.style_id = $style
- AND t.template_id = s.template_id
- AND c.theme_id = s.theme_id
- AND i.imageset_id = s.imageset_id";
- $result = $db->sql_query($sql, 3600);
- $this->theme = $db->sql_fetchrow($result);
- $db->sql_freeresult($result);
- }
-
- if (!$this->theme)
- {
- trigger_error('NO_STYLE_DATA', E_USER_ERROR);
- }
-
- // Now parse the cfg file and cache it
- $parsed_items = $cache->obtain_cfg_items($this->theme);
-
- // We are only interested in the theme configuration for now
- $parsed_items = $parsed_items['theme'];
-
- $check_for = array(
- 'parse_css_file' => (int) 0,
- 'pagination_sep' => (string) ', '
- );
-
- foreach ($check_for as $key => $default_value)
- {
- $this->theme[$key] = (isset($parsed_items[$key])) ? $parsed_items[$key] : $default_value;
- settype($this->theme[$key], gettype($default_value));
-
- if (is_string($default_value))
- {
- $this->theme[$key] = htmlspecialchars($this->theme[$key]);
- }
- }
-
- // If the style author specified the theme needs to be cached
- // (because of the used paths and variables) than make sure it is the case.
- // For example, if the theme uses language-specific images it needs to be stored in db.
- if (!$this->theme['theme_storedb'] && $this->theme['parse_css_file'])
- {
- $this->theme['theme_storedb'] = 1;
-
- $stylesheet = file_get_contents("{$phpbb_root_path}styles/{$this->theme['theme_path']}/theme/stylesheet.css");
- // Match CSS imports
- $matches = array();
- preg_match_all('/@import url\(["\'](.*)["\']\);/i', $stylesheet, $matches);
-
- if (sizeof($matches))
- {
- $content = '';
- foreach ($matches[0] as $idx => $match)
- {
- if ($content = @file_get_contents("{$phpbb_root_path}styles/{$this->theme['theme_path']}/theme/" . $matches[1][$idx]))
- {
- $content = trim($content);
- }
- else
- {
- $content = '';
- }
- $stylesheet = str_replace($match, $content, $stylesheet);
- }
- unset($content);
- }
-
- $stylesheet = str_replace('./', 'styles/' . $this->theme['theme_path'] . '/theme/', $stylesheet);
-
- $sql_ary = array(
- 'theme_data' => $stylesheet,
- 'theme_mtime' => time(),
- 'theme_storedb' => 1
- );
-
- $sql = 'UPDATE ' . STYLES_THEME_TABLE . '
- SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
- WHERE theme_id = ' . $this->theme['theme_id'];
- $db->sql_query($sql);
-
- unset($sql_ary);
- }
-
- $template->set_template();
-
- $this->img_lang = (file_exists($phpbb_root_path . 'styles/' . $this->theme['imageset_path'] . '/imageset/' . $this->lang_name)) ? $this->lang_name : $config['default_lang'];
-
- // Same query in style.php
- $sql = 'SELECT *
- FROM ' . STYLES_IMAGESET_DATA_TABLE . '
- WHERE imageset_id = ' . $this->theme['imageset_id'] . "
- AND image_filename <> ''
- AND image_lang IN ('" . $db->sql_escape($this->img_lang) . "', '')";
- $result = $db->sql_query($sql, 3600);
-
- $localised_images = false;
- while ($row = $db->sql_fetchrow($result))
- {
- if ($row['image_lang'])
- {
- $localised_images = true;
- }
-
- $row['image_filename'] = rawurlencode($row['image_filename']);
- $this->img_array[$row['image_name']] = $row;
- }
- $db->sql_freeresult($result);
-
- // there were no localised images, try to refresh the localised imageset for the user's language
- if (!$localised_images)
- {
- // Attention: this code ignores the image definition list from acp_styles and just takes everything
- // that the config file contains
- $sql_ary = array();
-
- $db->sql_transaction('begin');
-
- $sql = 'DELETE FROM ' . STYLES_IMAGESET_DATA_TABLE . '
- WHERE imageset_id = ' . $this->theme['imageset_id'] . '
- AND image_lang = \'' . $db->sql_escape($this->img_lang) . '\'';
- $result = $db->sql_query($sql);
-
- if (@file_exists("{$phpbb_root_path}styles/{$this->theme['imageset_path']}/imageset/{$this->img_lang}/imageset.cfg"))
- {
- $cfg_data_imageset_data = parse_cfg_file("{$phpbb_root_path}styles/{$this->theme['imageset_path']}/imageset/{$this->img_lang}/imageset.cfg");
- foreach ($cfg_data_imageset_data as $image_name => $value)
- {
- if (strpos($value, '*') !== false)
- {
- if (substr($value, -1, 1) === '*')
- {
- list($image_filename, $image_height) = explode('*', $value);
- $image_width = 0;
- }
- else
- {
- list($image_filename, $image_height, $image_width) = explode('*', $value);
- }
- }
- else
- {
- $image_filename = $value;
- $image_height = $image_width = 0;
- }
-
- if (strpos($image_name, 'img_') === 0 && $image_filename)
- {
- $image_name = substr($image_name, 4);
- $sql_ary[] = array(
- 'image_name' => (string) $image_name,
- 'image_filename' => (string) $image_filename,
- 'image_height' => (int) $image_height,
- 'image_width' => (int) $image_width,
- 'imageset_id' => (int) $this->theme['imageset_id'],
- 'image_lang' => (string) $this->img_lang,
- );
- }
- }
- }
-
- if (sizeof($sql_ary))
- {
- $db->sql_multi_insert(STYLES_IMAGESET_DATA_TABLE, $sql_ary);
- $db->sql_transaction('commit');
- $cache->destroy('sql', STYLES_IMAGESET_DATA_TABLE);
-
- add_log('admin', 'LOG_IMAGESET_LANG_REFRESHED', $this->theme['imageset_name'], $this->img_lang);
- }
- else
- {
- $db->sql_transaction('commit');
- add_log('admin', 'LOG_IMAGESET_LANG_MISSING', $this->theme['imageset_name'], $this->img_lang);
- }
- }
-
- // Call phpbb_user_session_handler() in case external application want to "bend" some variables or replace classes...
- // After calling it we continue script execution...
- phpbb_user_session_handler();
-
- // If this function got called from the error handler we are finished here.
- if (defined('IN_ERROR_HANDLER'))
- {
- return;
- }
-
- // Disable board if the install/ directory is still present
- // For the brave development army we do not care about this, else we need to comment out this everytime we develop locally
- if (!defined('DEBUG_EXTRA') && !defined('ADMIN_START') && !defined('IN_INSTALL') && !defined('IN_LOGIN') && file_exists($phpbb_root_path . 'install') && !is_file($phpbb_root_path . 'install'))
- {
- // Adjust the message slightly according to the permissions
- if ($auth->acl_gets('a_', 'm_') || $auth->acl_getf_global('m_'))
- {
- $message = 'REMOVE_INSTALL';
- }
- else
- {
- $message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE';
- }
- trigger_error($message);
- }
-
- // Is board disabled and user not an admin or moderator?
- if ($config['board_disable'] && !defined('IN_LOGIN') && !$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
- {
- if ($this->data['is_bot'])
- {
- send_status_line(503, 'Service Unavailable');
- }
-
- $message = (!empty($config['board_disable_msg'])) ? $config['board_disable_msg'] : 'BOARD_DISABLE';
- trigger_error($message);
- }
-
- // Is load exceeded?
- if ($config['limit_load'] && $this->load !== false)
- {
- if ($this->load > floatval($config['limit_load']) && !defined('IN_LOGIN') && !defined('IN_ADMIN'))
- {
- // Set board disabled to true to let the admins/mods get the proper notification
- $config['board_disable'] = '1';
-
- if (!$auth->acl_gets('a_', 'm_') && !$auth->acl_getf_global('m_'))
- {
- if ($this->data['is_bot'])
- {
- send_status_line(503, 'Service Unavailable');
- }
- trigger_error('BOARD_UNAVAILABLE');
- }
- }
- }
-
- if (isset($this->data['session_viewonline']))
- {
- // Make sure the user is able to hide his session
- if (!$this->data['session_viewonline'])
- {
- // Reset online status if not allowed to hide the session...
- if (!$auth->acl_get('u_hideonline'))
- {
- $sql = 'UPDATE ' . SESSIONS_TABLE . '
- SET session_viewonline = 1
- WHERE session_user_id = ' . $this->data['user_id'];
- $db->sql_query($sql);
- $this->data['session_viewonline'] = 1;
- }
- }
- else if (!$this->data['user_allow_viewonline'])
- {
- // the user wants to hide and is allowed to -> cloaking device on.
- if ($auth->acl_get('u_hideonline'))
- {
- $sql = 'UPDATE ' . SESSIONS_TABLE . '
- SET session_viewonline = 0
- WHERE session_user_id = ' . $this->data['user_id'];
- $db->sql_query($sql);
- $this->data['session_viewonline'] = 0;
- }
- }
- }
-
-
- // Does the user need to change their password? If so, redirect to the
- // ucp profile reg_details page ... of course do not redirect if we're already in the ucp
- if (!defined('IN_ADMIN') && !defined('ADMIN_START') && $config['chg_passforce'] && !empty($this->data['is_registered']) && $auth->acl_get('u_chgpasswd') && $this->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400))
- {
- if (strpos($this->page['query_string'], 'mode=reg_details') === false && $this->page['page_name'] != "ucp.$phpEx")
- {
- redirect(append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=profile&amp;mode=reg_details'));
- }
- }
-
- return;
- }
-
- /**
- * More advanced language substitution
- * Function to mimic sprintf() with the possibility of using phpBB's language system to substitute nullar/singular/plural forms.
- * Params are the language key and the parameters to be substituted.
- * This function/functionality is inspired by SHS` and Ashe.
- *
- * Example call: <samp>$user->lang('NUM_POSTS_IN_QUEUE', 1);</samp>
- */
- function lang()
- {
- $args = func_get_args();
- $key = $args[0];
-
- if (is_array($key))
- {
- $lang = &$this->lang[array_shift($key)];
-
- foreach ($key as $_key)
- {
- $lang = &$lang[$_key];
- }
- }
- else
- {
- $lang = &$this->lang[$key];
- }
-
- // Return if language string does not exist
- if (!isset($lang) || (!is_string($lang) && !is_array($lang)))
- {
- return $key;
- }
-
- // If the language entry is a string, we simply mimic sprintf() behaviour
- if (is_string($lang))
- {
- if (sizeof($args) == 1)
- {
- return $lang;
- }
-
- // Replace key with language entry and simply pass along...
- $args[0] = $lang;
- return call_user_func_array('sprintf', $args);
- }
-
- // It is an array... now handle different nullar/singular/plural forms
- $key_found = false;
-
- // We now get the first number passed and will select the key based upon this number
- for ($i = 1, $num_args = sizeof($args); $i < $num_args; $i++)
- {
- if (is_int($args[$i]))
- {
- $numbers = array_keys($lang);
-
- foreach ($numbers as $num)
- {
- if ($num > $args[$i])
- {
- break;
- }
-
- $key_found = $num;
- }
- break;
- }
- }
-
- // Ok, let's check if the key was found, else use the last entry (because it is mostly the plural form)
- if ($key_found === false)
- {
- $numbers = array_keys($lang);
- $key_found = end($numbers);
- }
-
- // Use the language string we determined and pass it to sprintf()
- $args[0] = $lang[$key_found];
- return call_user_func_array('sprintf', $args);
- }
-
- /**
- * Add Language Items - use_db and use_help are assigned where needed (only use them to force inclusion)
- *
- * @param mixed $lang_set specifies the language entries to include
- * @param bool $use_db internal variable for recursion, do not use
- * @param bool $use_help internal variable for recursion, do not use
- *
- * Examples:
- * <code>
- * $lang_set = array('posting', 'help' => 'faq');
- * $lang_set = array('posting', 'viewtopic', 'help' => array('bbcode', 'faq'))
- * $lang_set = array(array('posting', 'viewtopic'), 'help' => array('bbcode', 'faq'))
- * $lang_set = 'posting'
- * $lang_set = array('help' => 'faq', 'db' => array('help:faq', 'posting'))
- * </code>
- */
- function add_lang($lang_set, $use_db = false, $use_help = false)
- {
- global $phpEx;
-
- if (is_array($lang_set))
- {
- foreach ($lang_set as $key => $lang_file)
- {
- // Please do not delete this line.
- // We have to force the type here, else [array] language inclusion will not work
- $key = (string) $key;
-
- if ($key == 'db')
- {
- $this->add_lang($lang_file, true, $use_help);
- }
- else if ($key == 'help')
- {
- $this->add_lang($lang_file, $use_db, true);
- }
- else if (!is_array($lang_file))
- {
- $this->set_lang($this->lang, $this->help, $lang_file, $use_db, $use_help);
- }
- else
- {
- $this->add_lang($lang_file, $use_db, $use_help);
- }
- }
- unset($lang_set);
- }
- else if ($lang_set)
- {
- $this->set_lang($this->lang, $this->help, $lang_set, $use_db, $use_help);
- }
- }
-
- /**
- * Set language entry (called by add_lang)
- * @access private
- */
- function set_lang(&$lang, &$help, $lang_file, $use_db = false, $use_help = false)
- {
- global $phpEx;
-
- // Make sure the language name is set (if the user setup did not happen it is not set)
- if (!$this->lang_name)
- {
- global $config;
- $this->lang_name = basename($config['default_lang']);
- }
-
- // $lang == $this->lang
- // $help == $this->help
- // - add appropriate variables here, name them as they are used within the language file...
- if (!$use_db)
- {
- if ($use_help && strpos($lang_file, '/') !== false)
- {
- $language_filename = $this->lang_path . $this->lang_name . '/' . substr($lang_file, 0, stripos($lang_file, '/') + 1) . 'help_' . substr($lang_file, stripos($lang_file, '/') + 1) . '.' . $phpEx;
- }
- else
- {
- $language_filename = $this->lang_path . $this->lang_name . '/' . (($use_help) ? 'help_' : '') . $lang_file . '.' . $phpEx;
- }
-
- if (!file_exists($language_filename))
- {
- global $config;
-
- if ($this->lang_name == 'en')
- {
- // The user's selected language is missing the file, the board default's language is missing the file, and the file doesn't exist in /en.
- $language_filename = str_replace($this->lang_path . 'en', $this->lang_path . $this->data['user_lang'], $language_filename);
- trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR);
- }
- else if ($this->lang_name == basename($config['default_lang']))
- {
- // Fall back to the English Language
- $this->lang_name = 'en';
- $this->set_lang($lang, $help, $lang_file, $use_db, $use_help);
- }
- else if ($this->lang_name == $this->data['user_lang'])
- {
- // Fall back to the board default language
- $this->lang_name = basename($config['default_lang']);
- $this->set_lang($lang, $help, $lang_file, $use_db, $use_help);
- }
-
- // Reset the lang name
- $this->lang_name = (file_exists($this->lang_path . $this->data['user_lang'] . "/common.$phpEx")) ? $this->data['user_lang'] : basename($config['default_lang']);
- return;
- }
-
- // Do not suppress error if in DEBUG_EXTRA mode
- $include_result = (defined('DEBUG_EXTRA')) ? (include $language_filename) : (@include $language_filename);
-
- if ($include_result === false)
- {
- trigger_error('Language file ' . $language_filename . ' couldn\'t be opened.', E_USER_ERROR);
- }
- }
- else if ($use_db)
- {
- // Get Database Language Strings
- // Put them into $lang if nothing is prefixed, put them into $help if help: is prefixed
- // For example: help:faq, posting
- }
- }
-
- /**
- * Format user date
- *
- * @param int $gmepoch unix timestamp
- * @param string $format date format in date() notation. | used to indicate relative dates, for example |d m Y|, h:i is translated to Today, h:i.
- * @param bool $forcedate force non-relative date format.
- *
- * @return mixed translated date
- */
- function format_date($gmepoch, $format = false, $forcedate = false)
- {
- static $midnight;
- static $date_cache;
-
- $format = (!$format) ? $this->date_format : $format;
- $now = time();
- $delta = $now - $gmepoch;
-
- if (!isset($date_cache[$format]))
- {
- // Is the user requesting a friendly date format (i.e. 'Today 12:42')?
- $date_cache[$format] = array(
- 'is_short' => strpos($format, '|'),
- 'format_short' => substr($format, 0, strpos($format, '|')) . '||' . substr(strrchr($format, '|'), 1),
- 'format_long' => str_replace('|', '', $format),
- // Filter out values that are not strings (e.g. arrays) for strtr().
- 'lang' => array_filter($this->lang['datetime'], 'is_string'),
- );
-
- // Short representation of month in format? Some languages use different terms for the long and short format of May
- if ((strpos($format, '\M') === false && strpos($format, 'M') !== false) || (strpos($format, '\r') === false && strpos($format, 'r') !== false))
- {
- $date_cache[$format]['lang']['May'] = $this->lang['datetime']['May_short'];
- }
- }
-
- // Zone offset
- $zone_offset = $this->timezone + $this->dst;
-
- // Show date <= 1 hour ago as 'xx min ago' but not greater than 60 seconds in the future
- // A small tolerence is given for times in the future but in the same minute are displayed as '< than a minute ago'
- if ($delta <= 3600 && $delta > -60 && ($delta >= -5 || (($now / 60) % 60) == (($gmepoch / 60) % 60)) && $date_cache[$format]['is_short'] !== false && !$forcedate && isset($this->lang['datetime']['AGO']))
- {
- return $this->lang(array('datetime', 'AGO'), max(0, (int) floor($delta / 60)));
- }
-
- if (!$midnight)
- {
- list($d, $m, $y) = explode(' ', gmdate('j n Y', time() + $zone_offset));
- $midnight = gmmktime(0, 0, 0, $m, $d, $y) - $zone_offset;
- }
-
- if ($date_cache[$format]['is_short'] !== false && !$forcedate && !($gmepoch < $midnight - 86400 || $gmepoch > $midnight + 172800))
- {
- $day = false;
-
- if ($gmepoch > $midnight + 86400)
- {
- $day = 'TOMORROW';
- }
- else if ($gmepoch > $midnight)
- {
- $day = 'TODAY';
- }
- else if ($gmepoch > $midnight - 86400)
- {
- $day = 'YESTERDAY';
- }
-
- if ($day !== false)
- {
- return str_replace('||', $this->lang['datetime'][$day], strtr(@gmdate($date_cache[$format]['format_short'], $gmepoch + $zone_offset), $date_cache[$format]['lang']));
- }
- }
-
- return strtr(@gmdate($date_cache[$format]['format_long'], $gmepoch + $zone_offset), $date_cache[$format]['lang']);
- }
-
- /**
- * Get language id currently used by the user
- */
- function get_iso_lang_id()
- {
- global $config, $db;
-
- if (!empty($this->lang_id))
- {
- return $this->lang_id;
- }
-
- if (!$this->lang_name)
- {
- $this->lang_name = $config['default_lang'];
- }
-
- $sql = 'SELECT lang_id
- FROM ' . LANG_TABLE . "
- WHERE lang_iso = '" . $db->sql_escape($this->lang_name) . "'";
- $result = $db->sql_query($sql);
- $this->lang_id = (int) $db->sql_fetchfield('lang_id');
- $db->sql_freeresult($result);
-
- return $this->lang_id;
- }
-
- /**
- * Get users profile fields
- */
- function get_profile_fields($user_id)
- {
- global $db;
-
- if (isset($this->profile_fields))
- {
- return;
- }
-
- $sql = 'SELECT *
- FROM ' . PROFILE_FIELDS_DATA_TABLE . "
- WHERE user_id = $user_id";
- $result = $db->sql_query_limit($sql, 1);
- $this->profile_fields = (!($row = $db->sql_fetchrow($result))) ? array() : $row;
- $db->sql_freeresult($result);
- }
-
- /**
- * Specify/Get image
- * $suffix is no longer used - we know it. ;) It is there for backward compatibility.
- */
- function img($img, $alt = '', $width = false, $suffix = '', $type = 'full_tag')
- {
- static $imgs;
- global $phpbb_root_path;
-
- $img_data = &$imgs[$img];
-
- if (empty($img_data))
- {
- if (!isset($this->img_array[$img]))
- {
- // Do not fill the image to let designers decide what to do if the image is empty
- $img_data = '';
- return $img_data;
- }
-
- // Use URL if told so
- $root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path;
-
- $path = 'styles/' . rawurlencode($this->theme['imageset_path']) . '/imageset/' . ($this->img_array[$img]['image_lang'] ? $this->img_array[$img]['image_lang'] .'/' : '') . $this->img_array[$img]['image_filename'];
-
- $img_data['src'] = $root_path . $path;
- $img_data['width'] = $this->img_array[$img]['image_width'];
- $img_data['height'] = $this->img_array[$img]['image_height'];
-
- // We overwrite the width and height to the phpbb logo's width
- // and height here if the contents of the site_logo file are
- // really equal to the phpbb_logo
- // This allows us to change the dimensions of the phpbb_logo without
- // modifying the imageset.cfg and causing a conflict for everyone
- // who modified it for their custom logo on updating
- if ($img == 'site_logo' && file_exists($phpbb_root_path . $path))
- {
- global $cache;
-
- $img_file_hashes = $cache->get('imageset_site_logo_md5');
-
- if ($img_file_hashes === false)
- {
- $img_file_hashes = array();
- }
-
- $key = $this->theme['imageset_path'] . '::' . $this->img_array[$img]['image_lang'];
- if (!isset($img_file_hashes[$key]))
- {
- $img_file_hashes[$key] = md5(file_get_contents($phpbb_root_path . $path));
- $cache->put('imageset_site_logo_md5', $img_file_hashes);
- }
-
- $phpbb_logo_hash = '0c461a32cd3621643105f0d02a772c10';
-
- if ($phpbb_logo_hash == $img_file_hashes[$key])
- {
- $img_data['width'] = '149';
- $img_data['height'] = '52';
- }
- }
- }
-
- $alt = (!empty($this->lang[$alt])) ? $this->lang[$alt] : $alt;
-
- switch ($type)
- {
- case 'src':
- return $img_data['src'];
- break;
-
- case 'width':
- return ($width === false) ? $img_data['width'] : $width;
- break;
-
- case 'height':
- return $img_data['height'];
- break;
-
- default:
- $use_width = ($width === false) ? $img_data['width'] : $width;
-
- return '<img src="' . $img_data['src'] . '"' . (($use_width) ? ' width="' . $use_width . '"' : '') . (($img_data['height']) ? ' height="' . $img_data['height'] . '"' : '') . ' alt="' . $alt . '" title="' . $alt . '" />';
- break;
- }
- }
-
- /**
- * Get option bit field from user options.
- *
- * @param int $key option key, as defined in $keyoptions property.
- * @param int $data bit field value to use, or false to use $this->data['user_options']
- * @return bool true if the option is set in the bit field, false otherwise
- */
- function optionget($key, $data = false)
- {
- $var = ($data !== false) ? $data : $this->data['user_options'];
- return phpbb_optionget($this->keyoptions[$key], $var);
- }
-
- /**
- * Set option bit field for user options.
- *
- * @param int $key Option key, as defined in $keyoptions property.
- * @param bool $value True to set the option, false to clear the option.
- * @param int $data Current bit field value, or false to use $this->data['user_options']
- * @return int|bool If $data is false, the bit field is modified and
- * written back to $this->data['user_options'], and
- * return value is true if the bit field changed and
- * false otherwise. If $data is not false, the new
- * bitfield value is returned.
- */
- function optionset($key, $value, $data = false)
- {
- $var = ($data !== false) ? $data : $this->data['user_options'];
-
- $new_var = phpbb_optionset($this->keyoptions[$key], $value, $var);
-
- if ($data === false)
- {
- if ($new_var != $var)
- {
- $this->data['user_options'] = $new_var;
- return true;
- }
- else
- {
- return false;
- }
- }
- else
- {
- return $new_var;
- }
- }
-
- /**
- * Funtion to make the user leave the NEWLY_REGISTERED system group.
- * @access public
- */
- function leave_newly_registered()
- {
- global $db;
-
- if (empty($this->data['user_new']))
- {
- return false;
- }
-
- if (!function_exists('remove_newly_registered'))
- {
- global $phpbb_root_path, $phpEx;
-
- include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
- }
- if ($group = remove_newly_registered($this->data['user_id'], $this->data))
- {
- $this->data['group_id'] = $group;
-
- }
- $this->data['user_permissions'] = '';
- $this->data['user_new'] = 0;
-
- return true;
- }
-
- /**
- * Returns all password protected forum ids the user is currently NOT authenticated for.
- *
- * @return array Array of forum ids
- * @access public
- */
- function get_passworded_forums()
- {
- global $db;
-
- $sql = 'SELECT f.forum_id, fa.user_id
- FROM ' . FORUMS_TABLE . ' f
- LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa
- ON (fa.forum_id = f.forum_id
- AND fa.session_id = '" . $db->sql_escape($this->session_id) . "')
- WHERE f.forum_password <> ''";
- $result = $db->sql_query($sql);
-
- $forum_ids = array();
- while ($row = $db->sql_fetchrow($result))
- {
- $forum_id = (int) $row['forum_id'];
-
- if ($row['user_id'] != $this->data['user_id'])
- {
- $forum_ids[$forum_id] = $forum_id;
- }
- }
- $db->sql_freeresult($result);
-
- return $forum_ids;
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/sphinxapi.php b/phpBB/includes/sphinxapi.php
new file mode 100644
index 0000000000..6c3b66710c
--- /dev/null
+++ b/phpBB/includes/sphinxapi.php
@@ -0,0 +1,1712 @@
+<?php
+
+//
+// $Id: sphinxapi.php 3087 2012-01-30 23:07:35Z shodan $
+//
+
+//
+// Copyright (c) 2001-2012, Andrew Aksyonoff
+// Copyright (c) 2008-2012, Sphinx Technologies Inc
+// All rights reserved
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License. You should have
+// received a copy of the GPL license along with this program; if you
+// did not, you can find it at http://www.gnu.org/
+//
+
+/////////////////////////////////////////////////////////////////////////////
+// PHP version of Sphinx searchd client (PHP API)
+/////////////////////////////////////////////////////////////////////////////
+
+/// known searchd commands
+define ( "SEARCHD_COMMAND_SEARCH", 0 );
+define ( "SEARCHD_COMMAND_EXCERPT", 1 );
+define ( "SEARCHD_COMMAND_UPDATE", 2 );
+define ( "SEARCHD_COMMAND_KEYWORDS", 3 );
+define ( "SEARCHD_COMMAND_PERSIST", 4 );
+define ( "SEARCHD_COMMAND_STATUS", 5 );
+define ( "SEARCHD_COMMAND_FLUSHATTRS", 7 );
+
+/// current client-side command implementation versions
+define ( "VER_COMMAND_SEARCH", 0x119 );
+define ( "VER_COMMAND_EXCERPT", 0x104 );
+define ( "VER_COMMAND_UPDATE", 0x102 );
+define ( "VER_COMMAND_KEYWORDS", 0x100 );
+define ( "VER_COMMAND_STATUS", 0x100 );
+define ( "VER_COMMAND_QUERY", 0x100 );
+define ( "VER_COMMAND_FLUSHATTRS", 0x100 );
+
+/// known searchd status codes
+define ( "SEARCHD_OK", 0 );
+define ( "SEARCHD_ERROR", 1 );
+define ( "SEARCHD_RETRY", 2 );
+define ( "SEARCHD_WARNING", 3 );
+
+/// known match modes
+define ( "SPH_MATCH_ALL", 0 );
+define ( "SPH_MATCH_ANY", 1 );
+define ( "SPH_MATCH_PHRASE", 2 );
+define ( "SPH_MATCH_BOOLEAN", 3 );
+define ( "SPH_MATCH_EXTENDED", 4 );
+define ( "SPH_MATCH_FULLSCAN", 5 );
+define ( "SPH_MATCH_EXTENDED2", 6 ); // extended engine V2 (TEMPORARY, WILL BE REMOVED)
+
+/// known ranking modes (ext2 only)
+define ( "SPH_RANK_PROXIMITY_BM25", 0 ); ///< default mode, phrase proximity major factor and BM25 minor one
+define ( "SPH_RANK_BM25", 1 ); ///< statistical mode, BM25 ranking only (faster but worse quality)
+define ( "SPH_RANK_NONE", 2 ); ///< no ranking, all matches get a weight of 1
+define ( "SPH_RANK_WORDCOUNT", 3 ); ///< simple word-count weighting, rank is a weighted sum of per-field keyword occurence counts
+define ( "SPH_RANK_PROXIMITY", 4 );
+define ( "SPH_RANK_MATCHANY", 5 );
+define ( "SPH_RANK_FIELDMASK", 6 );
+define ( "SPH_RANK_SPH04", 7 );
+define ( "SPH_RANK_EXPR", 8 );
+define ( "SPH_RANK_TOTAL", 9 );
+
+/// known sort modes
+define ( "SPH_SORT_RELEVANCE", 0 );
+define ( "SPH_SORT_ATTR_DESC", 1 );
+define ( "SPH_SORT_ATTR_ASC", 2 );
+define ( "SPH_SORT_TIME_SEGMENTS", 3 );
+define ( "SPH_SORT_EXTENDED", 4 );
+define ( "SPH_SORT_EXPR", 5 );
+
+/// known filter types
+define ( "SPH_FILTER_VALUES", 0 );
+define ( "SPH_FILTER_RANGE", 1 );
+define ( "SPH_FILTER_FLOATRANGE", 2 );
+
+/// known attribute types
+define ( "SPH_ATTR_INTEGER", 1 );
+define ( "SPH_ATTR_TIMESTAMP", 2 );
+define ( "SPH_ATTR_ORDINAL", 3 );
+define ( "SPH_ATTR_BOOL", 4 );
+define ( "SPH_ATTR_FLOAT", 5 );
+define ( "SPH_ATTR_BIGINT", 6 );
+define ( "SPH_ATTR_STRING", 7 );
+define ( "SPH_ATTR_MULTI", 0x40000001 );
+define ( "SPH_ATTR_MULTI64", 0x40000002 );
+
+/// known grouping functions
+define ( "SPH_GROUPBY_DAY", 0 );
+define ( "SPH_GROUPBY_WEEK", 1 );
+define ( "SPH_GROUPBY_MONTH", 2 );
+define ( "SPH_GROUPBY_YEAR", 3 );
+define ( "SPH_GROUPBY_ATTR", 4 );
+define ( "SPH_GROUPBY_ATTRPAIR", 5 );
+
+// important properties of PHP's integers:
+// - always signed (one bit short of PHP_INT_SIZE)
+// - conversion from string to int is saturated
+// - float is double
+// - div converts arguments to floats
+// - mod converts arguments to ints
+
+// the packing code below works as follows:
+// - when we got an int, just pack it
+// if performance is a problem, this is the branch users should aim for
+//
+// - otherwise, we got a number in string form
+// this might be due to different reasons, but we assume that this is
+// because it didn't fit into PHP int
+//
+// - factor the string into high and low ints for packing
+// - if we have bcmath, then it is used
+// - if we don't, we have to do it manually (this is the fun part)
+//
+// - x64 branch does factoring using ints
+// - x32 (ab)uses floats, since we can't fit unsigned 32-bit number into an int
+//
+// unpacking routines are pretty much the same.
+// - return ints if we can
+// - otherwise format number into a string
+
+/// pack 64-bit signed
+function sphPackI64 ( $v )
+{
+ assert ( is_numeric($v) );
+
+ // x64
+ if ( PHP_INT_SIZE>=8 )
+ {
+ $v = (int)$v;
+ return pack ( "NN", $v>>32, $v&0xFFFFFFFF );
+ }
+
+ // x32, int
+ if ( is_int($v) )
+ return pack ( "NN", $v < 0 ? -1 : 0, $v );
+
+ // x32, bcmath
+ if ( function_exists("bcmul") )
+ {
+ if ( bccomp ( $v, 0 ) == -1 )
+ $v = bcadd ( "18446744073709551616", $v );
+ $h = bcdiv ( $v, "4294967296", 0 );
+ $l = bcmod ( $v, "4294967296" );
+ return pack ( "NN", (float)$h, (float)$l ); // conversion to float is intentional; int would lose 31st bit
+ }
+
+ // x32, no-bcmath
+ $p = max(0, strlen($v) - 13);
+ $lo = abs((float)substr($v, $p));
+ $hi = abs((float)substr($v, 0, $p));
+
+ $m = $lo + $hi*1316134912.0; // (10 ^ 13) % (1 << 32) = 1316134912
+ $q = floor($m/4294967296.0);
+ $l = $m - ($q*4294967296.0);
+ $h = $hi*2328.0 + $q; // (10 ^ 13) / (1 << 32) = 2328
+
+ if ( $v<0 )
+ {
+ if ( $l==0 )
+ $h = 4294967296.0 - $h;
+ else
+ {
+ $h = 4294967295.0 - $h;
+ $l = 4294967296.0 - $l;
+ }
+ }
+ return pack ( "NN", $h, $l );
+}
+
+/// pack 64-bit unsigned
+function sphPackU64 ( $v )
+{
+ assert ( is_numeric($v) );
+
+ // x64
+ if ( PHP_INT_SIZE>=8 )
+ {
+ assert ( $v>=0 );
+
+ // x64, int
+ if ( is_int($v) )
+ return pack ( "NN", $v>>32, $v&0xFFFFFFFF );
+
+ // x64, bcmath
+ if ( function_exists("bcmul") )
+ {
+ $h = bcdiv ( $v, 4294967296, 0 );
+ $l = bcmod ( $v, 4294967296 );
+ return pack ( "NN", $h, $l );
+ }
+
+ // x64, no-bcmath
+ $p = max ( 0, strlen($v) - 13 );
+ $lo = (int)substr ( $v, $p );
+ $hi = (int)substr ( $v, 0, $p );
+
+ $m = $lo + $hi*1316134912;
+ $l = $m % 4294967296;
+ $h = $hi*2328 + (int)($m/4294967296);
+
+ return pack ( "NN", $h, $l );
+ }
+
+ // x32, int
+ if ( is_int($v) )
+ return pack ( "NN", 0, $v );
+
+ // x32, bcmath
+ if ( function_exists("bcmul") )
+ {
+ $h = bcdiv ( $v, "4294967296", 0 );
+ $l = bcmod ( $v, "4294967296" );
+ return pack ( "NN", (float)$h, (float)$l ); // conversion to float is intentional; int would lose 31st bit
+ }
+
+ // x32, no-bcmath
+ $p = max(0, strlen($v) - 13);
+ $lo = (float)substr($v, $p);
+ $hi = (float)substr($v, 0, $p);
+
+ $m = $lo + $hi*1316134912.0;
+ $q = floor($m / 4294967296.0);
+ $l = $m - ($q * 4294967296.0);
+ $h = $hi*2328.0 + $q;
+
+ return pack ( "NN", $h, $l );
+}
+
+// unpack 64-bit unsigned
+function sphUnpackU64 ( $v )
+{
+ list ( $hi, $lo ) = array_values ( unpack ( "N*N*", $v ) );
+
+ if ( PHP_INT_SIZE>=8 )
+ {
+ if ( $hi<0 ) $hi += (1<<32); // because php 5.2.2 to 5.2.5 is totally fucked up again
+ if ( $lo<0 ) $lo += (1<<32);
+
+ // x64, int
+ if ( $hi<=2147483647 )
+ return ($hi<<32) + $lo;
+
+ // x64, bcmath
+ if ( function_exists("bcmul") )
+ return bcadd ( $lo, bcmul ( $hi, "4294967296" ) );
+
+ // x64, no-bcmath
+ $C = 100000;
+ $h = ((int)($hi / $C) << 32) + (int)($lo / $C);
+ $l = (($hi % $C) << 32) + ($lo % $C);
+ if ( $l>$C )
+ {
+ $h += (int)($l / $C);
+ $l = $l % $C;
+ }
+
+ if ( $h==0 )
+ return $l;
+ return sprintf ( "%d%05d", $h, $l );
+ }
+
+ // x32, int
+ if ( $hi==0 )
+ {
+ if ( $lo>0 )
+ return $lo;
+ return sprintf ( "%u", $lo );
+ }
+
+ $hi = sprintf ( "%u", $hi );
+ $lo = sprintf ( "%u", $lo );
+
+ // x32, bcmath
+ if ( function_exists("bcmul") )
+ return bcadd ( $lo, bcmul ( $hi, "4294967296" ) );
+
+ // x32, no-bcmath
+ $hi = (float)$hi;
+ $lo = (float)$lo;
+
+ $q = floor($hi/10000000.0);
+ $r = $hi - $q*10000000.0;
+ $m = $lo + $r*4967296.0;
+ $mq = floor($m/10000000.0);
+ $l = $m - $mq*10000000.0;
+ $h = $q*4294967296.0 + $r*429.0 + $mq;
+
+ $h = sprintf ( "%.0f", $h );
+ $l = sprintf ( "%07.0f", $l );
+ if ( $h=="0" )
+ return sprintf( "%.0f", (float)$l );
+ return $h . $l;
+}
+
+// unpack 64-bit signed
+function sphUnpackI64 ( $v )
+{
+ list ( $hi, $lo ) = array_values ( unpack ( "N*N*", $v ) );
+
+ // x64
+ if ( PHP_INT_SIZE>=8 )
+ {
+ if ( $hi<0 ) $hi += (1<<32); // because php 5.2.2 to 5.2.5 is totally fucked up again
+ if ( $lo<0 ) $lo += (1<<32);
+
+ return ($hi<<32) + $lo;
+ }
+
+ // x32, int
+ if ( $hi==0 )
+ {
+ if ( $lo>0 )
+ return $lo;
+ return sprintf ( "%u", $lo );
+ }
+ // x32, int
+ elseif ( $hi==-1 )
+ {
+ if ( $lo<0 )
+ return $lo;
+ return sprintf ( "%.0f", $lo - 4294967296.0 );
+ }
+
+ $neg = "";
+ $c = 0;
+ if ( $hi<0 )
+ {
+ $hi = ~$hi;
+ $lo = ~$lo;
+ $c = 1;
+ $neg = "-";
+ }
+
+ $hi = sprintf ( "%u", $hi );
+ $lo = sprintf ( "%u", $lo );
+
+ // x32, bcmath
+ if ( function_exists("bcmul") )
+ return $neg . bcadd ( bcadd ( $lo, bcmul ( $hi, "4294967296" ) ), $c );
+
+ // x32, no-bcmath
+ $hi = (float)$hi;
+ $lo = (float)$lo;
+
+ $q = floor($hi/10000000.0);
+ $r = $hi - $q*10000000.0;
+ $m = $lo + $r*4967296.0;
+ $mq = floor($m/10000000.0);
+ $l = $m - $mq*10000000.0 + $c;
+ $h = $q*4294967296.0 + $r*429.0 + $mq;
+ if ( $l==10000000 )
+ {
+ $l = 0;
+ $h += 1;
+ }
+
+ $h = sprintf ( "%.0f", $h );
+ $l = sprintf ( "%07.0f", $l );
+ if ( $h=="0" )
+ return $neg . sprintf( "%.0f", (float)$l );
+ return $neg . $h . $l;
+}
+
+
+function sphFixUint ( $value )
+{
+ if ( PHP_INT_SIZE>=8 )
+ {
+ // x64 route, workaround broken unpack() in 5.2.2+
+ if ( $value<0 ) $value += (1<<32);
+ return $value;
+ }
+ else
+ {
+ // x32 route, workaround php signed/unsigned braindamage
+ return sprintf ( "%u", $value );
+ }
+}
+
+
+/// sphinx searchd client class
+class SphinxClient
+{
+ var $_host; ///< searchd host (default is "localhost")
+ var $_port; ///< searchd port (default is 9312)
+ var $_offset; ///< how many records to seek from result-set start (default is 0)
+ var $_limit; ///< how many records to return from result-set starting at offset (default is 20)
+ var $_mode; ///< query matching mode (default is SPH_MATCH_ALL)
+ var $_weights; ///< per-field weights (default is 1 for all fields)
+ var $_sort; ///< match sorting mode (default is SPH_SORT_RELEVANCE)
+ var $_sortby; ///< attribute to sort by (defualt is "")
+ var $_min_id; ///< min ID to match (default is 0, which means no limit)
+ var $_max_id; ///< max ID to match (default is 0, which means no limit)
+ var $_filters; ///< search filters
+ var $_groupby; ///< group-by attribute name
+ var $_groupfunc; ///< group-by function (to pre-process group-by attribute value with)
+ var $_groupsort; ///< group-by sorting clause (to sort groups in result set with)
+ var $_groupdistinct;///< group-by count-distinct attribute
+ var $_maxmatches; ///< max matches to retrieve
+ var $_cutoff; ///< cutoff to stop searching at (default is 0)
+ var $_retrycount; ///< distributed retries count
+ var $_retrydelay; ///< distributed retries delay
+ var $_anchor; ///< geographical anchor point
+ var $_indexweights; ///< per-index weights
+ var $_ranker; ///< ranking mode (default is SPH_RANK_PROXIMITY_BM25)
+ var $_rankexpr; ///< ranking mode expression (for SPH_RANK_EXPR)
+ var $_maxquerytime; ///< max query time, milliseconds (default is 0, do not limit)
+ var $_fieldweights; ///< per-field-name weights
+ var $_overrides; ///< per-query attribute values overrides
+ var $_select; ///< select-list (attributes or expressions, with optional aliases)
+
+ var $_error; ///< last error message
+ var $_warning; ///< last warning message
+ var $_connerror; ///< connection error vs remote error flag
+
+ var $_reqs; ///< requests array for multi-query
+ var $_mbenc; ///< stored mbstring encoding
+ var $_arrayresult; ///< whether $result["matches"] should be a hash or an array
+ var $_timeout; ///< connect timeout
+
+ /////////////////////////////////////////////////////////////////////////////
+ // common stuff
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// create a new client object and fill defaults
+ function SphinxClient ()
+ {
+ // per-client-object settings
+ $this->_host = "localhost";
+ $this->_port = 9312;
+ $this->_path = false;
+ $this->_socket = false;
+
+ // per-query settings
+ $this->_offset = 0;
+ $this->_limit = 20;
+ $this->_mode = SPH_MATCH_ALL;
+ $this->_weights = array ();
+ $this->_sort = SPH_SORT_RELEVANCE;
+ $this->_sortby = "";
+ $this->_min_id = 0;
+ $this->_max_id = 0;
+ $this->_filters = array ();
+ $this->_groupby = "";
+ $this->_groupfunc = SPH_GROUPBY_DAY;
+ $this->_groupsort = "@group desc";
+ $this->_groupdistinct= "";
+ $this->_maxmatches = 1000;
+ $this->_cutoff = 0;
+ $this->_retrycount = 0;
+ $this->_retrydelay = 0;
+ $this->_anchor = array ();
+ $this->_indexweights= array ();
+ $this->_ranker = SPH_RANK_PROXIMITY_BM25;
+ $this->_rankexpr = "";
+ $this->_maxquerytime= 0;
+ $this->_fieldweights= array();
+ $this->_overrides = array();
+ $this->_select = "*";
+
+ $this->_error = ""; // per-reply fields (for single-query case)
+ $this->_warning = "";
+ $this->_connerror = false;
+
+ $this->_reqs = array (); // requests storage (for multi-query case)
+ $this->_mbenc = "";
+ $this->_arrayresult = false;
+ $this->_timeout = 0;
+ }
+
+ function __destruct()
+ {
+ if ( $this->_socket !== false )
+ fclose ( $this->_socket );
+ }
+
+ /// get last error message (string)
+ function GetLastError ()
+ {
+ return $this->_error;
+ }
+
+ /// get last warning message (string)
+ function GetLastWarning ()
+ {
+ return $this->_warning;
+ }
+
+ /// get last error flag (to tell network connection errors from searchd errors or broken responses)
+ function IsConnectError()
+ {
+ return $this->_connerror;
+ }
+
+ /// set searchd host name (string) and port (integer)
+ function SetServer ( $host, $port = 0 )
+ {
+ assert ( is_string($host) );
+ if ( $host[0] == '/')
+ {
+ $this->_path = 'unix://' . $host;
+ return;
+ }
+ if ( substr ( $host, 0, 7 )=="unix://" )
+ {
+ $this->_path = $host;
+ return;
+ }
+
+ assert ( is_int($port) );
+ $this->_host = $host;
+ $this->_port = $port;
+ $this->_path = '';
+
+ }
+
+ /// set server connection timeout (0 to remove)
+ function SetConnectTimeout ( $timeout )
+ {
+ assert ( is_numeric($timeout) );
+ $this->_timeout = $timeout;
+ }
+
+
+ function _Send ( $handle, $data, $length )
+ {
+ if ( feof($handle) || fwrite ( $handle, $data, $length ) !== $length )
+ {
+ $this->_error = 'connection unexpectedly closed (timed out?)';
+ $this->_connerror = true;
+ return false;
+ }
+ return true;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// enter mbstring workaround mode
+ function _MBPush ()
+ {
+ $this->_mbenc = "";
+ if ( ini_get ( "mbstring.func_overload" ) & 2 )
+ {
+ $this->_mbenc = mb_internal_encoding();
+ mb_internal_encoding ( "latin1" );
+ }
+ }
+
+ /// leave mbstring workaround mode
+ function _MBPop ()
+ {
+ if ( $this->_mbenc )
+ mb_internal_encoding ( $this->_mbenc );
+ }
+
+ /// connect to searchd server
+ function _Connect ()
+ {
+ if ( $this->_socket!==false )
+ {
+ // we are in persistent connection mode, so we have a socket
+ // however, need to check whether it's still alive
+ if ( !@feof ( $this->_socket ) )
+ return $this->_socket;
+
+ // force reopen
+ $this->_socket = false;
+ }
+
+ $errno = 0;
+ $errstr = "";
+ $this->_connerror = false;
+
+ if ( $this->_path )
+ {
+ $host = $this->_path;
+ $port = 0;
+ }
+ else
+ {
+ $host = $this->_host;
+ $port = $this->_port;
+ }
+
+ if ( $this->_timeout<=0 )
+ $fp = @fsockopen ( $host, $port, $errno, $errstr );
+ else
+ $fp = @fsockopen ( $host, $port, $errno, $errstr, $this->_timeout );
+
+ if ( !$fp )
+ {
+ if ( $this->_path )
+ $location = $this->_path;
+ else
+ $location = "{$this->_host}:{$this->_port}";
+
+ $errstr = trim ( $errstr );
+ $this->_error = "connection to $location failed (errno=$errno, msg=$errstr)";
+ $this->_connerror = true;
+ return false;
+ }
+
+ // send my version
+ // this is a subtle part. we must do it before (!) reading back from searchd.
+ // because otherwise under some conditions (reported on FreeBSD for instance)
+ // TCP stack could throttle write-write-read pattern because of Nagle.
+ if ( !$this->_Send ( $fp, pack ( "N", 1 ), 4 ) )
+ {
+ fclose ( $fp );
+ $this->_error = "failed to send client protocol version";
+ return false;
+ }
+
+ // check version
+ list(,$v) = unpack ( "N*", fread ( $fp, 4 ) );
+ $v = (int)$v;
+ if ( $v<1 )
+ {
+ fclose ( $fp );
+ $this->_error = "expected searchd protocol version 1+, got version '$v'";
+ return false;
+ }
+
+ return $fp;
+ }
+
+ /// get and check response packet from searchd server
+ function _GetResponse ( $fp, $client_ver )
+ {
+ $response = "";
+ $len = 0;
+
+ $header = fread ( $fp, 8 );
+ if ( strlen($header)==8 )
+ {
+ list ( $status, $ver, $len ) = array_values ( unpack ( "n2a/Nb", $header ) );
+ $left = $len;
+ while ( $left>0 && !feof($fp) )
+ {
+ $chunk = fread ( $fp, min ( 8192, $left ) );
+ if ( $chunk )
+ {
+ $response .= $chunk;
+ $left -= strlen($chunk);
+ }
+ }
+ }
+ if ( $this->_socket === false )
+ fclose ( $fp );
+
+ // check response
+ $read = strlen ( $response );
+ if ( !$response || $read!=$len )
+ {
+ $this->_error = $len
+ ? "failed to read searchd response (status=$status, ver=$ver, len=$len, read=$read)"
+ : "received zero-sized searchd response";
+ return false;
+ }
+
+ // check status
+ if ( $status==SEARCHD_WARNING )
+ {
+ list(,$wlen) = unpack ( "N*", substr ( $response, 0, 4 ) );
+ $this->_warning = substr ( $response, 4, $wlen );
+ return substr ( $response, 4+$wlen );
+ }
+ if ( $status==SEARCHD_ERROR )
+ {
+ $this->_error = "searchd error: " . substr ( $response, 4 );
+ return false;
+ }
+ if ( $status==SEARCHD_RETRY )
+ {
+ $this->_error = "temporary searchd error: " . substr ( $response, 4 );
+ return false;
+ }
+ if ( $status!=SEARCHD_OK )
+ {
+ $this->_error = "unknown status code '$status'";
+ return false;
+ }
+
+ // check version
+ if ( $ver<$client_ver )
+ {
+ $this->_warning = sprintf ( "searchd command v.%d.%d older than client's v.%d.%d, some options might not work",
+ $ver>>8, $ver&0xff, $client_ver>>8, $client_ver&0xff );
+ }
+
+ return $response;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+ // searching
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// set offset and count into result set,
+ /// and optionally set max-matches and cutoff limits
+ function SetLimits ( $offset, $limit, $max=0, $cutoff=0 )
+ {
+ assert ( is_int($offset) );
+ assert ( is_int($limit) );
+ assert ( $offset>=0 );
+ assert ( $limit>0 );
+ assert ( $max>=0 );
+ $this->_offset = $offset;
+ $this->_limit = $limit;
+ if ( $max>0 )
+ $this->_maxmatches = $max;
+ if ( $cutoff>0 )
+ $this->_cutoff = $cutoff;
+ }
+
+ /// set maximum query time, in milliseconds, per-index
+ /// integer, 0 means "do not limit"
+ function SetMaxQueryTime ( $max )
+ {
+ assert ( is_int($max) );
+ assert ( $max>=0 );
+ $this->_maxquerytime = $max;
+ }
+
+ /// set matching mode
+ function SetMatchMode ( $mode )
+ {
+ assert ( $mode==SPH_MATCH_ALL
+ || $mode==SPH_MATCH_ANY
+ || $mode==SPH_MATCH_PHRASE
+ || $mode==SPH_MATCH_BOOLEAN
+ || $mode==SPH_MATCH_EXTENDED
+ || $mode==SPH_MATCH_FULLSCAN
+ || $mode==SPH_MATCH_EXTENDED2 );
+ $this->_mode = $mode;
+ }
+
+ /// set ranking mode
+ function SetRankingMode ( $ranker, $rankexpr="" )
+ {
+ assert ( $ranker>=0 && $ranker<SPH_RANK_TOTAL );
+ assert ( is_string($rankexpr) );
+ $this->_ranker = $ranker;
+ $this->_rankexpr = $rankexpr;
+ }
+
+ /// set matches sorting mode
+ function SetSortMode ( $mode, $sortby="" )
+ {
+ assert (
+ $mode==SPH_SORT_RELEVANCE ||
+ $mode==SPH_SORT_ATTR_DESC ||
+ $mode==SPH_SORT_ATTR_ASC ||
+ $mode==SPH_SORT_TIME_SEGMENTS ||
+ $mode==SPH_SORT_EXTENDED ||
+ $mode==SPH_SORT_EXPR );
+ assert ( is_string($sortby) );
+ assert ( $mode==SPH_SORT_RELEVANCE || strlen($sortby)>0 );
+
+ $this->_sort = $mode;
+ $this->_sortby = $sortby;
+ }
+
+ /// bind per-field weights by order
+ /// DEPRECATED; use SetFieldWeights() instead
+ function SetWeights ( $weights )
+ {
+ assert ( is_array($weights) );
+ foreach ( $weights as $weight )
+ assert ( is_int($weight) );
+
+ $this->_weights = $weights;
+ }
+
+ /// bind per-field weights by name
+ function SetFieldWeights ( $weights )
+ {
+ assert ( is_array($weights) );
+ foreach ( $weights as $name=>$weight )
+ {
+ assert ( is_string($name) );
+ assert ( is_int($weight) );
+ }
+ $this->_fieldweights = $weights;
+ }
+
+ /// bind per-index weights by name
+ function SetIndexWeights ( $weights )
+ {
+ assert ( is_array($weights) );
+ foreach ( $weights as $index=>$weight )
+ {
+ assert ( is_string($index) );
+ assert ( is_int($weight) );
+ }
+ $this->_indexweights = $weights;
+ }
+
+ /// set IDs range to match
+ /// only match records if document ID is beetwen $min and $max (inclusive)
+ function SetIDRange ( $min, $max )
+ {
+ assert ( is_numeric($min) );
+ assert ( is_numeric($max) );
+ assert ( $min<=$max );
+ $this->_min_id = $min;
+ $this->_max_id = $max;
+ }
+
+ /// set values set filter
+ /// only match records where $attribute value is in given set
+ function SetFilter ( $attribute, $values, $exclude=false )
+ {
+ assert ( is_string($attribute) );
+ assert ( is_array($values) );
+ assert ( count($values) );
+
+ if ( is_array($values) && count($values) )
+ {
+ foreach ( $values as $value )
+ assert ( is_numeric($value) );
+
+ $this->_filters[] = array ( "type"=>SPH_FILTER_VALUES, "attr"=>$attribute, "exclude"=>$exclude, "values"=>$values );
+ }
+ }
+
+ /// set range filter
+ /// only match records if $attribute value is beetwen $min and $max (inclusive)
+ function SetFilterRange ( $attribute, $min, $max, $exclude=false )
+ {
+ assert ( is_string($attribute) );
+ assert ( is_numeric($min) );
+ assert ( is_numeric($max) );
+ assert ( $min<=$max );
+
+ $this->_filters[] = array ( "type"=>SPH_FILTER_RANGE, "attr"=>$attribute, "exclude"=>$exclude, "min"=>$min, "max"=>$max );
+ }
+
+ /// set float range filter
+ /// only match records if $attribute value is beetwen $min and $max (inclusive)
+ function SetFilterFloatRange ( $attribute, $min, $max, $exclude=false )
+ {
+ assert ( is_string($attribute) );
+ assert ( is_float($min) );
+ assert ( is_float($max) );
+ assert ( $min<=$max );
+
+ $this->_filters[] = array ( "type"=>SPH_FILTER_FLOATRANGE, "attr"=>$attribute, "exclude"=>$exclude, "min"=>$min, "max"=>$max );
+ }
+
+ /// setup anchor point for geosphere distance calculations
+ /// required to use @geodist in filters and sorting
+ /// latitude and longitude must be in radians
+ function SetGeoAnchor ( $attrlat, $attrlong, $lat, $long )
+ {
+ assert ( is_string($attrlat) );
+ assert ( is_string($attrlong) );
+ assert ( is_float($lat) );
+ assert ( is_float($long) );
+
+ $this->_anchor = array ( "attrlat"=>$attrlat, "attrlong"=>$attrlong, "lat"=>$lat, "long"=>$long );
+ }
+
+ /// set grouping attribute and function
+ function SetGroupBy ( $attribute, $func, $groupsort="@group desc" )
+ {
+ assert ( is_string($attribute) );
+ assert ( is_string($groupsort) );
+ assert ( $func==SPH_GROUPBY_DAY
+ || $func==SPH_GROUPBY_WEEK
+ || $func==SPH_GROUPBY_MONTH
+ || $func==SPH_GROUPBY_YEAR
+ || $func==SPH_GROUPBY_ATTR
+ || $func==SPH_GROUPBY_ATTRPAIR );
+
+ $this->_groupby = $attribute;
+ $this->_groupfunc = $func;
+ $this->_groupsort = $groupsort;
+ }
+
+ /// set count-distinct attribute for group-by queries
+ function SetGroupDistinct ( $attribute )
+ {
+ assert ( is_string($attribute) );
+ $this->_groupdistinct = $attribute;
+ }
+
+ /// set distributed retries count and delay
+ function SetRetries ( $count, $delay=0 )
+ {
+ assert ( is_int($count) && $count>=0 );
+ assert ( is_int($delay) && $delay>=0 );
+ $this->_retrycount = $count;
+ $this->_retrydelay = $delay;
+ }
+
+ /// set result set format (hash or array; hash by default)
+ /// PHP specific; needed for group-by-MVA result sets that may contain duplicate IDs
+ function SetArrayResult ( $arrayresult )
+ {
+ assert ( is_bool($arrayresult) );
+ $this->_arrayresult = $arrayresult;
+ }
+
+ /// set attribute values override
+ /// there can be only one override per attribute
+ /// $values must be a hash that maps document IDs to attribute values
+ function SetOverride ( $attrname, $attrtype, $values )
+ {
+ assert ( is_string ( $attrname ) );
+ assert ( in_array ( $attrtype, array ( SPH_ATTR_INTEGER, SPH_ATTR_TIMESTAMP, SPH_ATTR_BOOL, SPH_ATTR_FLOAT, SPH_ATTR_BIGINT ) ) );
+ assert ( is_array ( $values ) );
+
+ $this->_overrides[$attrname] = array ( "attr"=>$attrname, "type"=>$attrtype, "values"=>$values );
+ }
+
+ /// set select-list (attributes or expressions), SQL-like syntax
+ function SetSelect ( $select )
+ {
+ assert ( is_string ( $select ) );
+ $this->_select = $select;
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+
+ /// clear all filters (for multi-queries)
+ function ResetFilters ()
+ {
+ $this->_filters = array();
+ $this->_anchor = array();
+ }
+
+ /// clear groupby settings (for multi-queries)
+ function ResetGroupBy ()
+ {
+ $this->_groupby = "";
+ $this->_groupfunc = SPH_GROUPBY_DAY;
+ $this->_groupsort = "@group desc";
+ $this->_groupdistinct= "";
+ }
+
+ /// clear all attribute value overrides (for multi-queries)
+ function ResetOverrides ()
+ {
+ $this->_overrides = array ();
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+
+ /// connect to searchd server, run given search query through given indexes,
+ /// and return the search results
+ function Query ( $query, $index="*", $comment="" )
+ {
+ assert ( empty($this->_reqs) );
+
+ $this->AddQuery ( $query, $index, $comment );
+ $results = $this->RunQueries ();
+ $this->_reqs = array (); // just in case it failed too early
+
+ if ( !is_array($results) )
+ return false; // probably network error; error message should be already filled
+
+ $this->_error = $results[0]["error"];
+ $this->_warning = $results[0]["warning"];
+ if ( $results[0]["status"]==SEARCHD_ERROR )
+ return false;
+ else
+ return $results[0];
+ }
+
+ /// helper to pack floats in network byte order
+ function _PackFloat ( $f )
+ {
+ $t1 = pack ( "f", $f ); // machine order
+ list(,$t2) = unpack ( "L*", $t1 ); // int in machine order
+ return pack ( "N", $t2 );
+ }
+
+ /// add query to multi-query batch
+ /// returns index into results array from RunQueries() call
+ function AddQuery ( $query, $index="*", $comment="" )
+ {
+ // mbstring workaround
+ $this->_MBPush ();
+
+ // build request
+ $req = pack ( "NNNN", $this->_offset, $this->_limit, $this->_mode, $this->_ranker );
+ if ( $this->_ranker==SPH_RANK_EXPR )
+ $req .= pack ( "N", strlen($this->_rankexpr) ) . $this->_rankexpr;
+ $req .= pack ( "N", $this->_sort ); // (deprecated) sort mode
+ $req .= pack ( "N", strlen($this->_sortby) ) . $this->_sortby;
+ $req .= pack ( "N", strlen($query) ) . $query; // query itself
+ $req .= pack ( "N", count($this->_weights) ); // weights
+ foreach ( $this->_weights as $weight )
+ $req .= pack ( "N", (int)$weight );
+ $req .= pack ( "N", strlen($index) ) . $index; // indexes
+ $req .= pack ( "N", 1 ); // id64 range marker
+ $req .= sphPackU64 ( $this->_min_id ) . sphPackU64 ( $this->_max_id ); // id64 range
+
+ // filters
+ $req .= pack ( "N", count($this->_filters) );
+ foreach ( $this->_filters as $filter )
+ {
+ $req .= pack ( "N", strlen($filter["attr"]) ) . $filter["attr"];
+ $req .= pack ( "N", $filter["type"] );
+ switch ( $filter["type"] )
+ {
+ case SPH_FILTER_VALUES:
+ $req .= pack ( "N", count($filter["values"]) );
+ foreach ( $filter["values"] as $value )
+ $req .= sphPackI64 ( $value );
+ break;
+
+ case SPH_FILTER_RANGE:
+ $req .= sphPackI64 ( $filter["min"] ) . sphPackI64 ( $filter["max"] );
+ break;
+
+ case SPH_FILTER_FLOATRANGE:
+ $req .= $this->_PackFloat ( $filter["min"] ) . $this->_PackFloat ( $filter["max"] );
+ break;
+
+ default:
+ assert ( 0 && "internal error: unhandled filter type" );
+ }
+ $req .= pack ( "N", $filter["exclude"] );
+ }
+
+ // group-by clause, max-matches count, group-sort clause, cutoff count
+ $req .= pack ( "NN", $this->_groupfunc, strlen($this->_groupby) ) . $this->_groupby;
+ $req .= pack ( "N", $this->_maxmatches );
+ $req .= pack ( "N", strlen($this->_groupsort) ) . $this->_groupsort;
+ $req .= pack ( "NNN", $this->_cutoff, $this->_retrycount, $this->_retrydelay );
+ $req .= pack ( "N", strlen($this->_groupdistinct) ) . $this->_groupdistinct;
+
+ // anchor point
+ if ( empty($this->_anchor) )
+ {
+ $req .= pack ( "N", 0 );
+ } else
+ {
+ $a =& $this->_anchor;
+ $req .= pack ( "N", 1 );
+ $req .= pack ( "N", strlen($a["attrlat"]) ) . $a["attrlat"];
+ $req .= pack ( "N", strlen($a["attrlong"]) ) . $a["attrlong"];
+ $req .= $this->_PackFloat ( $a["lat"] ) . $this->_PackFloat ( $a["long"] );
+ }
+
+ // per-index weights
+ $req .= pack ( "N", count($this->_indexweights) );
+ foreach ( $this->_indexweights as $idx=>$weight )
+ $req .= pack ( "N", strlen($idx) ) . $idx . pack ( "N", $weight );
+
+ // max query time
+ $req .= pack ( "N", $this->_maxquerytime );
+
+ // per-field weights
+ $req .= pack ( "N", count($this->_fieldweights) );
+ foreach ( $this->_fieldweights as $field=>$weight )
+ $req .= pack ( "N", strlen($field) ) . $field . pack ( "N", $weight );
+
+ // comment
+ $req .= pack ( "N", strlen($comment) ) . $comment;
+
+ // attribute overrides
+ $req .= pack ( "N", count($this->_overrides) );
+ foreach ( $this->_overrides as $key => $entry )
+ {
+ $req .= pack ( "N", strlen($entry["attr"]) ) . $entry["attr"];
+ $req .= pack ( "NN", $entry["type"], count($entry["values"]) );
+ foreach ( $entry["values"] as $id=>$val )
+ {
+ assert ( is_numeric($id) );
+ assert ( is_numeric($val) );
+
+ $req .= sphPackU64 ( $id );
+ switch ( $entry["type"] )
+ {
+ case SPH_ATTR_FLOAT: $req .= $this->_PackFloat ( $val ); break;
+ case SPH_ATTR_BIGINT: $req .= sphPackI64 ( $val ); break;
+ default: $req .= pack ( "N", $val ); break;
+ }
+ }
+ }
+
+ // select-list
+ $req .= pack ( "N", strlen($this->_select) ) . $this->_select;
+
+ // mbstring workaround
+ $this->_MBPop ();
+
+ // store request to requests array
+ $this->_reqs[] = $req;
+ return count($this->_reqs)-1;
+ }
+
+ /// connect to searchd, run queries batch, and return an array of result sets
+ function RunQueries ()
+ {
+ if ( empty($this->_reqs) )
+ {
+ $this->_error = "no queries defined, issue AddQuery() first";
+ return false;
+ }
+
+ // mbstring workaround
+ $this->_MBPush ();
+
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop ();
+ return false;
+ }
+
+ // send query, get response
+ $nreqs = count($this->_reqs);
+ $req = join ( "", $this->_reqs );
+ $len = 8+strlen($req);
+ $req = pack ( "nnNNN", SEARCHD_COMMAND_SEARCH, VER_COMMAND_SEARCH, $len, 0, $nreqs ) . $req; // add header
+
+ if ( !( $this->_Send ( $fp, $req, $len+8 ) ) ||
+ !( $response = $this->_GetResponse ( $fp, VER_COMMAND_SEARCH ) ) )
+ {
+ $this->_MBPop ();
+ return false;
+ }
+
+ // query sent ok; we can reset reqs now
+ $this->_reqs = array ();
+
+ // parse and return response
+ return $this->_ParseSearchResponse ( $response, $nreqs );
+ }
+
+ /// parse and return search query (or queries) response
+ function _ParseSearchResponse ( $response, $nreqs )
+ {
+ $p = 0; // current position
+ $max = strlen($response); // max position for checks, to protect against broken responses
+
+ $results = array ();
+ for ( $ires=0; $ires<$nreqs && $p<$max; $ires++ )
+ {
+ $results[] = array();
+ $result =& $results[$ires];
+
+ $result["error"] = "";
+ $result["warning"] = "";
+
+ // extract status
+ list(,$status) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $result["status"] = $status;
+ if ( $status!=SEARCHD_OK )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $message = substr ( $response, $p, $len ); $p += $len;
+
+ if ( $status==SEARCHD_WARNING )
+ {
+ $result["warning"] = $message;
+ } else
+ {
+ $result["error"] = $message;
+ continue;
+ }
+ }
+
+ // read schema
+ $fields = array ();
+ $attrs = array ();
+
+ list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ while ( $nfields-->0 && $p<$max )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $fields[] = substr ( $response, $p, $len ); $p += $len;
+ }
+ $result["fields"] = $fields;
+
+ list(,$nattrs) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ while ( $nattrs-->0 && $p<$max )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $attr = substr ( $response, $p, $len ); $p += $len;
+ list(,$type) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $attrs[$attr] = $type;
+ }
+ $result["attrs"] = $attrs;
+
+ // read match count
+ list(,$count) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ list(,$id64) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+
+ // read matches
+ $idx = -1;
+ while ( $count-->0 && $p<$max )
+ {
+ // index into result array
+ $idx++;
+
+ // parse document id and weight
+ if ( $id64 )
+ {
+ $doc = sphUnpackU64 ( substr ( $response, $p, 8 ) ); $p += 8;
+ list(,$weight) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ }
+ else
+ {
+ list ( $doc, $weight ) = array_values ( unpack ( "N*N*",
+ substr ( $response, $p, 8 ) ) );
+ $p += 8;
+ $doc = sphFixUint($doc);
+ }
+ $weight = sprintf ( "%u", $weight );
+
+ // create match entry
+ if ( $this->_arrayresult )
+ $result["matches"][$idx] = array ( "id"=>$doc, "weight"=>$weight );
+ else
+ $result["matches"][$doc]["weight"] = $weight;
+
+ // parse and create attributes
+ $attrvals = array ();
+ foreach ( $attrs as $attr=>$type )
+ {
+ // handle 64bit ints
+ if ( $type==SPH_ATTR_BIGINT )
+ {
+ $attrvals[$attr] = sphUnpackI64 ( substr ( $response, $p, 8 ) ); $p += 8;
+ continue;
+ }
+
+ // handle floats
+ if ( $type==SPH_ATTR_FLOAT )
+ {
+ list(,$uval) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ list(,$fval) = unpack ( "f*", pack ( "L", $uval ) );
+ $attrvals[$attr] = $fval;
+ continue;
+ }
+
+ // handle everything else as unsigned ints
+ list(,$val) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ if ( $type==SPH_ATTR_MULTI )
+ {
+ $attrvals[$attr] = array ();
+ $nvalues = $val;
+ while ( $nvalues-->0 && $p<$max )
+ {
+ list(,$val) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $attrvals[$attr][] = sphFixUint($val);
+ }
+ } else if ( $type==SPH_ATTR_MULTI64 )
+ {
+ $attrvals[$attr] = array ();
+ $nvalues = $val;
+ while ( $nvalues>0 && $p<$max )
+ {
+ $attrvals[$attr][] = sphUnpackU64 ( substr ( $response, $p, 8 ) ); $p += 8;
+ $nvalues -= 2;
+ }
+ } else if ( $type==SPH_ATTR_STRING )
+ {
+ $attrvals[$attr] = substr ( $response, $p, $val );
+ $p += $val;
+ } else
+ {
+ $attrvals[$attr] = sphFixUint($val);
+ }
+ }
+
+ if ( $this->_arrayresult )
+ $result["matches"][$idx]["attrs"] = $attrvals;
+ else
+ $result["matches"][$doc]["attrs"] = $attrvals;
+ }
+
+ list ( $total, $total_found, $msecs, $words ) =
+ array_values ( unpack ( "N*N*N*N*", substr ( $response, $p, 16 ) ) );
+ $result["total"] = sprintf ( "%u", $total );
+ $result["total_found"] = sprintf ( "%u", $total_found );
+ $result["time"] = sprintf ( "%.3f", $msecs/1000 );
+ $p += 16;
+
+ while ( $words-->0 && $p<$max )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $word = substr ( $response, $p, $len ); $p += $len;
+ list ( $docs, $hits ) = array_values ( unpack ( "N*N*", substr ( $response, $p, 8 ) ) ); $p += 8;
+ $result["words"][$word] = array (
+ "docs"=>sprintf ( "%u", $docs ),
+ "hits"=>sprintf ( "%u", $hits ) );
+ }
+ }
+
+ $this->_MBPop ();
+ return $results;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+ // excerpts generation
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// connect to searchd server, and generate exceprts (snippets)
+ /// of given documents for given query. returns false on failure,
+ /// an array of snippets on success
+ function BuildExcerpts ( $docs, $index, $words, $opts=array() )
+ {
+ assert ( is_array($docs) );
+ assert ( is_string($index) );
+ assert ( is_string($words) );
+ assert ( is_array($opts) );
+
+ $this->_MBPush ();
+
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop();
+ return false;
+ }
+
+ /////////////////
+ // fixup options
+ /////////////////
+
+ if ( !isset($opts["before_match"]) ) $opts["before_match"] = "<b>";
+ if ( !isset($opts["after_match"]) ) $opts["after_match"] = "</b>";
+ if ( !isset($opts["chunk_separator"]) ) $opts["chunk_separator"] = " ... ";
+ if ( !isset($opts["limit"]) ) $opts["limit"] = 256;
+ if ( !isset($opts["limit_passages"]) ) $opts["limit_passages"] = 0;
+ if ( !isset($opts["limit_words"]) ) $opts["limit_words"] = 0;
+ if ( !isset($opts["around"]) ) $opts["around"] = 5;
+ if ( !isset($opts["exact_phrase"]) ) $opts["exact_phrase"] = false;
+ if ( !isset($opts["single_passage"]) ) $opts["single_passage"] = false;
+ if ( !isset($opts["use_boundaries"]) ) $opts["use_boundaries"] = false;
+ if ( !isset($opts["weight_order"]) ) $opts["weight_order"] = false;
+ if ( !isset($opts["query_mode"]) ) $opts["query_mode"] = false;
+ if ( !isset($opts["force_all_words"]) ) $opts["force_all_words"] = false;
+ if ( !isset($opts["start_passage_id"]) ) $opts["start_passage_id"] = 1;
+ if ( !isset($opts["load_files"]) ) $opts["load_files"] = false;
+ if ( !isset($opts["html_strip_mode"]) ) $opts["html_strip_mode"] = "index";
+ if ( !isset($opts["allow_empty"]) ) $opts["allow_empty"] = false;
+ if ( !isset($opts["passage_boundary"]) ) $opts["passage_boundary"] = "none";
+ if ( !isset($opts["emit_zones"]) ) $opts["emit_zones"] = false;
+ if ( !isset($opts["load_files_scattered"]) ) $opts["load_files_scattered"] = false;
+
+
+ /////////////////
+ // build request
+ /////////////////
+
+ // v.1.2 req
+ $flags = 1; // remove spaces
+ if ( $opts["exact_phrase"] ) $flags |= 2;
+ if ( $opts["single_passage"] ) $flags |= 4;
+ if ( $opts["use_boundaries"] ) $flags |= 8;
+ if ( $opts["weight_order"] ) $flags |= 16;
+ if ( $opts["query_mode"] ) $flags |= 32;
+ if ( $opts["force_all_words"] ) $flags |= 64;
+ if ( $opts["load_files"] ) $flags |= 128;
+ if ( $opts["allow_empty"] ) $flags |= 256;
+ if ( $opts["emit_zones"] ) $flags |= 512;
+ if ( $opts["load_files_scattered"] ) $flags |= 1024;
+ $req = pack ( "NN", 0, $flags ); // mode=0, flags=$flags
+ $req .= pack ( "N", strlen($index) ) . $index; // req index
+ $req .= pack ( "N", strlen($words) ) . $words; // req words
+
+ // options
+ $req .= pack ( "N", strlen($opts["before_match"]) ) . $opts["before_match"];
+ $req .= pack ( "N", strlen($opts["after_match"]) ) . $opts["after_match"];
+ $req .= pack ( "N", strlen($opts["chunk_separator"]) ) . $opts["chunk_separator"];
+ $req .= pack ( "NN", (int)$opts["limit"], (int)$opts["around"] );
+ $req .= pack ( "NNN", (int)$opts["limit_passages"], (int)$opts["limit_words"], (int)$opts["start_passage_id"] ); // v.1.2
+ $req .= pack ( "N", strlen($opts["html_strip_mode"]) ) . $opts["html_strip_mode"];
+ $req .= pack ( "N", strlen($opts["passage_boundary"]) ) . $opts["passage_boundary"];
+
+ // documents
+ $req .= pack ( "N", count($docs) );
+ foreach ( $docs as $doc )
+ {
+ assert ( is_string($doc) );
+ $req .= pack ( "N", strlen($doc) ) . $doc;
+ }
+
+ ////////////////////////////
+ // send query, get response
+ ////////////////////////////
+
+ $len = strlen($req);
+ $req = pack ( "nnN", SEARCHD_COMMAND_EXCERPT, VER_COMMAND_EXCERPT, $len ) . $req; // add header
+ if ( !( $this->_Send ( $fp, $req, $len+8 ) ) ||
+ !( $response = $this->_GetResponse ( $fp, VER_COMMAND_EXCERPT ) ) )
+ {
+ $this->_MBPop ();
+ return false;
+ }
+
+ //////////////////
+ // parse response
+ //////////////////
+
+ $pos = 0;
+ $res = array ();
+ $rlen = strlen($response);
+ for ( $i=0; $i<count($docs); $i++ )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) );
+ $pos += 4;
+
+ if ( $pos+$len > $rlen )
+ {
+ $this->_error = "incomplete reply";
+ $this->_MBPop ();
+ return false;
+ }
+ $res[] = $len ? substr ( $response, $pos, $len ) : "";
+ $pos += $len;
+ }
+
+ $this->_MBPop ();
+ return $res;
+ }
+
+
+ /////////////////////////////////////////////////////////////////////////////
+ // keyword generation
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// connect to searchd server, and generate keyword list for a given query
+ /// returns false on failure,
+ /// an array of words on success
+ function BuildKeywords ( $query, $index, $hits )
+ {
+ assert ( is_string($query) );
+ assert ( is_string($index) );
+ assert ( is_bool($hits) );
+
+ $this->_MBPush ();
+
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop();
+ return false;
+ }
+
+ /////////////////
+ // build request
+ /////////////////
+
+ // v.1.0 req
+ $req = pack ( "N", strlen($query) ) . $query; // req query
+ $req .= pack ( "N", strlen($index) ) . $index; // req index
+ $req .= pack ( "N", (int)$hits );
+
+ ////////////////////////////
+ // send query, get response
+ ////////////////////////////
+
+ $len = strlen($req);
+ $req = pack ( "nnN", SEARCHD_COMMAND_KEYWORDS, VER_COMMAND_KEYWORDS, $len ) . $req; // add header
+ if ( !( $this->_Send ( $fp, $req, $len+8 ) ) ||
+ !( $response = $this->_GetResponse ( $fp, VER_COMMAND_KEYWORDS ) ) )
+ {
+ $this->_MBPop ();
+ return false;
+ }
+
+ //////////////////
+ // parse response
+ //////////////////
+
+ $pos = 0;
+ $res = array ();
+ $rlen = strlen($response);
+ list(,$nwords) = unpack ( "N*", substr ( $response, $pos, 4 ) );
+ $pos += 4;
+ for ( $i=0; $i<$nwords; $i++ )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) ); $pos += 4;
+ $tokenized = $len ? substr ( $response, $pos, $len ) : "";
+ $pos += $len;
+
+ list(,$len) = unpack ( "N*", substr ( $response, $pos, 4 ) ); $pos += 4;
+ $normalized = $len ? substr ( $response, $pos, $len ) : "";
+ $pos += $len;
+
+ $res[] = array ( "tokenized"=>$tokenized, "normalized"=>$normalized );
+
+ if ( $hits )
+ {
+ list($ndocs,$nhits) = array_values ( unpack ( "N*N*", substr ( $response, $pos, 8 ) ) );
+ $pos += 8;
+ $res [$i]["docs"] = $ndocs;
+ $res [$i]["hits"] = $nhits;
+ }
+
+ if ( $pos > $rlen )
+ {
+ $this->_error = "incomplete reply";
+ $this->_MBPop ();
+ return false;
+ }
+ }
+
+ $this->_MBPop ();
+ return $res;
+ }
+
+ function EscapeString ( $string )
+ {
+ $from = array ( '\\', '(',')','|','-','!','@','~','"','&', '/', '^', '$', '=' );
+ $to = array ( '\\\\', '\(','\)','\|','\-','\!','\@','\~','\"', '\&', '\/', '\^', '\$', '\=' );
+
+ return str_replace ( $from, $to, $string );
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+ // attribute updates
+ /////////////////////////////////////////////////////////////////////////////
+
+ /// batch update given attributes in given rows in given indexes
+ /// returns amount of updated documents (0 or more) on success, or -1 on failure
+ function UpdateAttributes ( $index, $attrs, $values, $mva=false )
+ {
+ // verify everything
+ assert ( is_string($index) );
+ assert ( is_bool($mva) );
+
+ assert ( is_array($attrs) );
+ foreach ( $attrs as $attr )
+ assert ( is_string($attr) );
+
+ assert ( is_array($values) );
+ foreach ( $values as $id=>$entry )
+ {
+ assert ( is_numeric($id) );
+ assert ( is_array($entry) );
+ assert ( count($entry)==count($attrs) );
+ foreach ( $entry as $v )
+ {
+ if ( $mva )
+ {
+ assert ( is_array($v) );
+ foreach ( $v as $vv )
+ assert ( is_int($vv) );
+ } else
+ assert ( is_int($v) );
+ }
+ }
+
+ // build request
+ $this->_MBPush ();
+ $req = pack ( "N", strlen($index) ) . $index;
+
+ $req .= pack ( "N", count($attrs) );
+ foreach ( $attrs as $attr )
+ {
+ $req .= pack ( "N", strlen($attr) ) . $attr;
+ $req .= pack ( "N", $mva ? 1 : 0 );
+ }
+
+ $req .= pack ( "N", count($values) );
+ foreach ( $values as $id=>$entry )
+ {
+ $req .= sphPackU64 ( $id );
+ foreach ( $entry as $v )
+ {
+ $req .= pack ( "N", $mva ? count($v) : $v );
+ if ( $mva )
+ foreach ( $v as $vv )
+ $req .= pack ( "N", $vv );
+ }
+ }
+
+ // connect, send query, get response
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop ();
+ return -1;
+ }
+
+ $len = strlen($req);
+ $req = pack ( "nnN", SEARCHD_COMMAND_UPDATE, VER_COMMAND_UPDATE, $len ) . $req; // add header
+ if ( !$this->_Send ( $fp, $req, $len+8 ) )
+ {
+ $this->_MBPop ();
+ return -1;
+ }
+
+ if (!( $response = $this->_GetResponse ( $fp, VER_COMMAND_UPDATE ) ))
+ {
+ $this->_MBPop ();
+ return -1;
+ }
+
+ // parse response
+ list(,$updated) = unpack ( "N*", substr ( $response, 0, 4 ) );
+ $this->_MBPop ();
+ return $updated;
+ }
+
+ /////////////////////////////////////////////////////////////////////////////
+ // persistent connections
+ /////////////////////////////////////////////////////////////////////////////
+
+ function Open()
+ {
+ if ( $this->_socket !== false )
+ {
+ $this->_error = 'already connected';
+ return false;
+ }
+ if ( !$fp = $this->_Connect() )
+ return false;
+
+ // command, command version = 0, body length = 4, body = 1
+ $req = pack ( "nnNN", SEARCHD_COMMAND_PERSIST, 0, 4, 1 );
+ if ( !$this->_Send ( $fp, $req, 12 ) )
+ return false;
+
+ $this->_socket = $fp;
+ return true;
+ }
+
+ function Close()
+ {
+ if ( $this->_socket === false )
+ {
+ $this->_error = 'not connected';
+ return false;
+ }
+
+ fclose ( $this->_socket );
+ $this->_socket = false;
+
+ return true;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // status
+ //////////////////////////////////////////////////////////////////////////
+
+ function Status ()
+ {
+ $this->_MBPush ();
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop();
+ return false;
+ }
+
+ $req = pack ( "nnNN", SEARCHD_COMMAND_STATUS, VER_COMMAND_STATUS, 4, 1 ); // len=4, body=1
+ if ( !( $this->_Send ( $fp, $req, 12 ) ) ||
+ !( $response = $this->_GetResponse ( $fp, VER_COMMAND_STATUS ) ) )
+ {
+ $this->_MBPop ();
+ return false;
+ }
+
+ $res = substr ( $response, 4 ); // just ignore length, error handling, etc
+ $p = 0;
+ list ( $rows, $cols ) = array_values ( unpack ( "N*N*", substr ( $response, $p, 8 ) ) ); $p += 8;
+
+ $res = array();
+ for ( $i=0; $i<$rows; $i++ )
+ for ( $j=0; $j<$cols; $j++ )
+ {
+ list(,$len) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
+ $res[$i][] = substr ( $response, $p, $len ); $p += $len;
+ }
+
+ $this->_MBPop ();
+ return $res;
+ }
+
+ //////////////////////////////////////////////////////////////////////////
+ // flush
+ //////////////////////////////////////////////////////////////////////////
+
+ function FlushAttributes ()
+ {
+ $this->_MBPush ();
+ if (!( $fp = $this->_Connect() ))
+ {
+ $this->_MBPop();
+ return -1;
+ }
+
+ $req = pack ( "nnN", SEARCHD_COMMAND_FLUSHATTRS, VER_COMMAND_FLUSHATTRS, 0 ); // len=0
+ if ( !( $this->_Send ( $fp, $req, 8 ) ) ||
+ !( $response = $this->_GetResponse ( $fp, VER_COMMAND_FLUSHATTRS ) ) )
+ {
+ $this->_MBPop ();
+ return -1;
+ }
+
+ $tag = -1;
+ if ( strlen($response)==4 )
+ list(,$tag) = unpack ( "N*", $response );
+ else
+ $this->_error = "unexpected response length";
+
+ $this->_MBPop ();
+ return $tag;
+ }
+}
+
+//
+// $Id: sphinxapi.php 3087 2012-01-30 23:07:35Z shodan $
+//
diff --git a/phpBB/includes/startup.php b/phpBB/includes/startup.php
index cf216a65db..441eaec6b1 100644
--- a/phpBB/includes/startup.php
+++ b/phpBB/includes/startup.php
@@ -3,7 +3,7 @@
*
* @package phpBB3
* @copyright (c) 2011 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -20,21 +20,6 @@ if (!defined('E_DEPRECATED'))
define('E_DEPRECATED', 8192);
}
$level = E_ALL & ~E_NOTICE & ~E_DEPRECATED;
-if (version_compare(PHP_VERSION, '5.4.0-dev', '>='))
-{
- // PHP 5.4 adds E_STRICT to E_ALL.
- // Our utf8 normalizer triggers E_STRICT output on PHP 5.4.
- // Unfortunately it cannot be made E_STRICT-clean while
- // continuing to work on PHP 4.
- // Therefore, in phpBB 3.0.x we disable E_STRICT on PHP 5.4+,
- // while phpBB 3.1 will fix utf8 normalizer.
- // E_STRICT is defined starting with PHP 5
- if (!defined('E_STRICT'))
- {
- define('E_STRICT', 2048);
- }
- $level &= ~E_STRICT;
-}
error_reporting($level);
/*
@@ -162,5 +147,36 @@ if (function_exists('date_default_timezone_set') && function_exists('date_defaul
date_default_timezone_set(@date_default_timezone_get());
}
+// Autoloading of dependencies.
+// Three options are supported:
+// 1. If dependencies are installed with Composer, Composer will create a
+// vendor/autoload.php. If this file exists it will be
+// automatically used by phpBB. This is the default mode that phpBB
+// will use when shipped.
+// 2. To disable composer autoloading, PHPBB_NO_COMPOSER_AUTOLOAD can be specified.
+// Additionally specify PHPBB_AUTOLOAD=/path/to/autoload.php in the
+// environment. This is useful for running CLI scripts and tests.
+// /path/to/autoload.php should define and register class loaders
+// for all of phpBB's dependencies.
+// 3. You can also set PHPBB_NO_COMPOSER_AUTOLOAD without setting PHPBB_AUTOLOAD.
+// In this case autoloading needs to be defined before running any phpBB
+// script. This might be useful in cases when phpBB is integrated into a
+// larger program.
+if (getenv('PHPBB_NO_COMPOSER_AUTOLOAD'))
+{
+ if (getenv('PHPBB_AUTOLOAD'))
+ {
+ require(getenv('PHPBB_AUTOLOAD'));
+ }
+}
+else
+{
+ if (!file_exists($phpbb_root_path . 'vendor/autoload.php'))
+ {
+ trigger_error('You have not set up composer dependencies. See http://getcomposer.org/.', E_USER_ERROR);
+ }
+ require($phpbb_root_path . 'vendor/autoload.php');
+}
+
$starttime = explode(' ', microtime());
$starttime = $starttime[1] + $starttime[0];
diff --git a/phpBB/includes/template.php b/phpBB/includes/template.php
deleted file mode 100644
index 9ac395344f..0000000000
--- a/phpBB/includes/template.php
+++ /dev/null
@@ -1,692 +0,0 @@
-<?php
-/**
-*
-* @package phpBB3
-* @version $Id$
-* @copyright (c) 2005 phpBB Group, sections (c) 2001 ispi of Lincoln Inc
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
-*
-*/
-
-/**
-* @ignore
-*/
-if (!defined('IN_PHPBB'))
-{
- exit;
-}
-
-/**
-* Base Template class.
-* @package phpBB3
-*/
-class template
-{
- /** variable that holds all the data we'll be substituting into
- * the compiled templates. Takes form:
- * --> $this->_tpldata[block][iteration#][child][iteration#][child2][iteration#][variablename] == value
- * if it's a root-level variable, it'll be like this:
- * --> $this->_tpldata[.][0][varname] == value
- */
- var $_tpldata = array('.' => array(0 => array()));
- var $_rootref;
-
- // Root dir and hash of filenames for each template handle.
- var $root = '';
- var $cachepath = '';
- var $files = array();
- var $filename = array();
- var $files_inherit = array();
- var $files_template = array();
- var $inherit_root = '';
- var $orig_tpl_storedb;
- var $orig_tpl_inherits_id;
-
- // this will hash handle names to the compiled/uncompiled code for that handle.
- var $compiled_code = array();
-
- /**
- * Set template location
- * @access public
- */
- function set_template()
- {
- global $phpbb_root_path, $user;
-
- if (file_exists($phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template'))
- {
- $this->root = $phpbb_root_path . 'styles/' . $user->theme['template_path'] . '/template';
- $this->cachepath = $phpbb_root_path . 'cache/tpl_' . str_replace('_', '-', $user->theme['template_path']) . '_';
-
- if ($this->orig_tpl_storedb === null)
- {
- $this->orig_tpl_storedb = $user->theme['template_storedb'];
- }
-
- if ($this->orig_tpl_inherits_id === null)
- {
- $this->orig_tpl_inherits_id = $user->theme['template_inherits_id'];
- }
-
- $user->theme['template_storedb'] = $this->orig_tpl_storedb;
- $user->theme['template_inherits_id'] = $this->orig_tpl_inherits_id;
-
- if ($user->theme['template_inherits_id'])
- {
- $this->inherit_root = $phpbb_root_path . 'styles/' . $user->theme['template_inherit_path'] . '/template';
- }
- }
- else
- {
- trigger_error('Template path could not be found: styles/' . $user->theme['template_path'] . '/template', E_USER_ERROR);
- }
-
- $this->_rootref = &$this->_tpldata['.'][0];
-
- return true;
- }
-
- /**
- * Set custom template location (able to use directory outside of phpBB)
- * @access public
- */
- function set_custom_template($template_path, $template_name, $fallback_template_path = false)
- {
- global $phpbb_root_path, $user;
-
- // Make sure $template_path has no ending slash
- if (substr($template_path, -1) == '/')
- {
- $template_path = substr($template_path, 0, -1);
- }
-
- $this->root = $template_path;
- $this->cachepath = $phpbb_root_path . 'cache/ctpl_' . str_replace('_', '-', $template_name) . '_';
-
- if ($fallback_template_path !== false)
- {
- if (substr($fallback_template_path, -1) == '/')
- {
- $fallback_template_path = substr($fallback_template_path, 0, -1);
- }
-
- $this->inherit_root = $fallback_template_path;
- $this->orig_tpl_inherits_id = true;
- }
- else
- {
- $this->orig_tpl_inherits_id = false;
- }
-
- // the database does not store the path or name of a custom template
- // so there is no way we can properly store custom templates there
- $this->orig_tpl_storedb = false;
-
- $this->_rootref = &$this->_tpldata['.'][0];
-
- return true;
- }
-
- /**
- * Sets the template filenames for handles. $filename_array
- * should be a hash of handle => filename pairs.
- * @access public
- */
- function set_filenames($filename_array)
- {
- if (!is_array($filename_array))
- {
- return false;
- }
- foreach ($filename_array as $handle => $filename)
- {
- if (empty($filename))
- {
- trigger_error("template->set_filenames: Empty filename specified for $handle", E_USER_ERROR);
- }
-
- $this->filename[$handle] = $filename;
- $this->files[$handle] = $this->root . '/' . $filename;
-
- if ($this->inherit_root)
- {
- $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
- }
- }
-
- return true;
- }
-
- /**
- * Destroy template data set
- * @access public
- */
- function destroy()
- {
- $this->_tpldata = array('.' => array(0 => array()));
- $this->_rootref = &$this->_tpldata['.'][0];
- }
-
- /**
- * Reset/empty complete block
- * @access public
- */
- function destroy_block_vars($blockname)
- {
- if (strpos($blockname, '.') !== false)
- {
- // Nested block.
- $blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
-
- $str = &$this->_tpldata;
- for ($i = 0; $i < $blockcount; $i++)
- {
- $str = &$str[$blocks[$i]];
- $str = &$str[sizeof($str) - 1];
- }
-
- unset($str[$blocks[$blockcount]]);
- }
- else
- {
- // Top-level block.
- unset($this->_tpldata[$blockname]);
- }
-
- return true;
- }
-
- /**
- * Display handle
- * @access public
- */
- function display($handle, $include_once = true)
- {
- global $user, $phpbb_hook;
-
- if (!empty($phpbb_hook) && $phpbb_hook->call_hook(array(__CLASS__, __FUNCTION__), $handle, $include_once, $this))
- {
- if ($phpbb_hook->hook_return(array(__CLASS__, __FUNCTION__)))
- {
- return $phpbb_hook->hook_return_result(array(__CLASS__, __FUNCTION__));
- }
- }
-
- if (defined('IN_ERROR_HANDLER'))
- {
- if ((E_NOTICE & error_reporting()) == E_NOTICE)
- {
- error_reporting(error_reporting() ^ E_NOTICE);
- }
- }
-
- if ($filename = $this->_tpl_load($handle))
- {
- ($include_once) ? include_once($filename) : include($filename);
- }
- else
- {
- eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
- }
-
- return true;
- }
-
- /**
- * Display the handle and assign the output to a template variable or return the compiled result.
- * @access public
- */
- function assign_display($handle, $template_var = '', $return_content = true, $include_once = false)
- {
- ob_start();
- $this->display($handle, $include_once);
- $contents = ob_get_clean();
-
- if ($return_content)
- {
- return $contents;
- }
-
- $this->assign_var($template_var, $contents);
-
- return true;
- }
-
- /**
- * Load a compiled template if possible, if not, recompile it
- * @access private
- */
- function _tpl_load(&$handle)
- {
- global $user, $phpEx, $config;
-
- if (!isset($this->filename[$handle]))
- {
- trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
- }
-
- // reload these settings to have the values they had when this object was initialised
- // using set_template or set_custom_template, they might otherwise have been overwritten
- // by other template class instances in between.
- $user->theme['template_storedb'] = $this->orig_tpl_storedb;
- $user->theme['template_inherits_id'] = $this->orig_tpl_inherits_id;
-
- $filename = $this->cachepath . str_replace('/', '.', $this->filename[$handle]) . '.' . $phpEx;
- $this->files_template[$handle] = (isset($user->theme['template_id'])) ? $user->theme['template_id'] : 0;
-
- $recompile = false;
- if (!file_exists($filename) || @filesize($filename) === 0 || defined('DEBUG_EXTRA'))
- {
- $recompile = true;
- }
- else if ($config['load_tplcompile'])
- {
- // No way around it: we need to check inheritance here
- if ($user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
- {
- $this->files[$handle] = $this->files_inherit[$handle];
- $this->files_template[$handle] = $user->theme['template_inherits_id'];
- }
- $recompile = (@filemtime($filename) < filemtime($this->files[$handle])) ? true : false;
- }
-
- // Recompile page if the original template is newer, otherwise load the compiled version
- if (!$recompile)
- {
- return $filename;
- }
-
- global $db, $phpbb_root_path;
-
- if (!class_exists('template_compile'))
- {
- include($phpbb_root_path . 'includes/functions_template.' . $phpEx);
- }
-
- // Inheritance - we point to another template file for this one. Equality is also used for store_db
- if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($this->files[$handle]))
- {
- $this->files[$handle] = $this->files_inherit[$handle];
- $this->files_template[$handle] = $user->theme['template_inherits_id'];
- }
-
- $compile = new template_compile($this);
-
- // If we don't have a file assigned to this handle, die.
- if (!isset($this->files[$handle]))
- {
- trigger_error("template->_tpl_load(): No file specified for handle $handle", E_USER_ERROR);
- }
-
- // Just compile if no user object is present (happens within the installer)
- if (!$user)
- {
- $compile->_tpl_load_file($handle);
- return false;
- }
-
- if (isset($user->theme['template_storedb']) && $user->theme['template_storedb'])
- {
- $rows = array();
- $ids = array();
- // Inheritance
- if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'])
- {
- $ids[] = $user->theme['template_inherits_id'];
- }
- $ids[] = $user->theme['template_id'];
-
- foreach ($ids as $id)
- {
- $sql = 'SELECT *
- FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
- WHERE template_id = ' . $id . "
- AND (template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
- OR template_included " . $db->sql_like_expression($db->any_char . $this->filename[$handle] . ':' . $db->any_char) . ')';
-
- $result = $db->sql_query($sql);
- while ($row = $db->sql_fetchrow($result))
- {
- $rows[$row['template_filename']] = $row;
- }
- $db->sql_freeresult($result);
- }
-
- if (sizeof($rows))
- {
- foreach ($rows as $row)
- {
- $file = $this->root . '/' . $row['template_filename'];
- $force_reload = false;
- if ($row['template_id'] != $user->theme['template_id'])
- {
- // make sure that we are not overlooking a file not in the db yet
- if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($file))
- {
- $file = $this->inherit_root . '/' . $row['template_filename'];
- $this->files[$row['template_filename']] = $file;
- $this->files_inherit[$row['template_filename']] = $file;
- $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
- }
- else if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'])
- {
- // Ok, we have a situation. There is a file in the subtemplate, but nothing in the DB. We have to fix that.
- $force_reload = true;
- $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
- }
- }
- else
- {
- $this->files_template[$row['template_filename']] = $user->theme['template_id'];
- }
-
- if ($force_reload || $row['template_mtime'] < filemtime($file))
- {
- if ($row['template_filename'] == $this->filename[$handle])
- {
- $compile->_tpl_load_file($handle, true);
- }
- else
- {
- $this->files[$row['template_filename']] = $file;
- $this->filename[$row['template_filename']] = $row['template_filename'];
- $compile->_tpl_load_file($row['template_filename'], true);
- unset($this->compiled_code[$row['template_filename']]);
- unset($this->files[$row['template_filename']]);
- unset($this->filename[$row['template_filename']]);
- }
- }
-
- if ($row['template_filename'] == $this->filename[$handle])
- {
- $this->compiled_code[$handle] = $compile->compile(trim($row['template_data']));
- $compile->compile_write($handle, $this->compiled_code[$handle]);
- }
- else
- {
- // Only bother compiling if it doesn't already exist
- if (!file_exists($this->cachepath . str_replace('/', '.', $row['template_filename']) . '.' . $phpEx))
- {
- $this->filename[$row['template_filename']] = $row['template_filename'];
- $compile->compile_write($row['template_filename'], $compile->compile(trim($row['template_data'])));
- unset($this->filename[$row['template_filename']]);
- }
- }
- }
- }
- else
- {
- $file = $this->root . '/' . $row['template_filename'];
-
- if (isset($user->theme['template_inherits_id']) && $user->theme['template_inherits_id'] && !file_exists($file))
- {
- $file = $this->inherit_root . '/' . $row['template_filename'];
- $this->files[$row['template_filename']] = $file;
- $this->files_inherit[$row['template_filename']] = $file;
- $this->files_template[$row['template_filename']] = $user->theme['template_inherits_id'];
- }
- // Try to load from filesystem and instruct to insert into the styles table...
- $compile->_tpl_load_file($handle, true);
- return false;
- }
-
- return false;
- }
-
- $compile->_tpl_load_file($handle);
- return false;
- }
-
- /**
- * Assign key variable pairs from an array
- * @access public
- */
- function assign_vars($vararray)
- {
- foreach ($vararray as $key => $val)
- {
- $this->_rootref[$key] = $val;
- }
-
- return true;
- }
-
- /**
- * Assign a single variable to a single key
- * @access public
- */
- function assign_var($varname, $varval)
- {
- $this->_rootref[$varname] = $varval;
-
- return true;
- }
-
- /**
- * Assign key variable pairs from an array to a specified block
- * @access public
- */
- function assign_block_vars($blockname, $vararray)
- {
- if (strpos($blockname, '.') !== false)
- {
- // Nested block.
- $blocks = explode('.', $blockname);
- $blockcount = sizeof($blocks) - 1;
-
- $str = &$this->_tpldata;
- for ($i = 0; $i < $blockcount; $i++)
- {
- $str = &$str[$blocks[$i]];
- $str = &$str[sizeof($str) - 1];
- }
-
- $s_row_count = isset($str[$blocks[$blockcount]]) ? sizeof($str[$blocks[$blockcount]]) : 0;
- $vararray['S_ROW_COUNT'] = $s_row_count;
-
- // Assign S_FIRST_ROW
- if (!$s_row_count)
- {
- $vararray['S_FIRST_ROW'] = true;
- }
-
- // Now the tricky part, we always assign S_LAST_ROW and remove the entry before
- // This is much more clever than going through the complete template data on display (phew)
- $vararray['S_LAST_ROW'] = true;
- if ($s_row_count > 0)
- {
- unset($str[$blocks[$blockcount]][($s_row_count - 1)]['S_LAST_ROW']);
- }
-
- // Now we add the block that we're actually assigning to.
- // We're adding a new iteration to this block with the given
- // variable assignments.
- $str[$blocks[$blockcount]][] = $vararray;
- }
- else
- {
- // Top-level block.
- $s_row_count = (isset($this->_tpldata[$blockname])) ? sizeof($this->_tpldata[$blockname]) : 0;
- $vararray['S_ROW_COUNT'] = $s_row_count;
-
- // Assign S_FIRST_ROW
- if (!$s_row_count)
- {
- $vararray['S_FIRST_ROW'] = true;
- }
-
- // We always assign S_LAST_ROW and remove the entry before
- $vararray['S_LAST_ROW'] = true;
- if ($s_row_count > 0)
- {
- unset($this->_tpldata[$blockname][($s_row_count - 1)]['S_LAST_ROW']);
- }
-
- // Add a new iteration to this block with the variable assignments we were given.
- $this->_tpldata[$blockname][] = $vararray;
- }
-
- return true;
- }
-
- /**
- * Change already assigned key variable pair (one-dimensional - single loop entry)
- *
- * An example of how to use this function:
- * {@example alter_block_array.php}
- *
- * @param string $blockname the blockname, for example 'loop'
- * @param array $vararray the var array to insert/add or merge
- * @param mixed $key Key to search for
- *
- * array: KEY => VALUE [the key/value pair to search for within the loop to determine the correct position]
- *
- * int: Position [the position to change or insert at directly given]
- *
- * If key is false the position is set to 0
- * If key is true the position is set to the last entry
- *
- * @param string $mode Mode to execute (valid modes are 'insert' and 'change')
- *
- * If insert, the vararray is inserted at the given position (position counting from zero).
- * If change, the current block gets merged with the vararray (resulting in new key/value pairs be added and existing keys be replaced by the new value).
- *
- * Since counting begins by zero, inserting at the last position will result in this array: array(vararray, last positioned array)
- * and inserting at position 1 will result in this array: array(first positioned array, vararray, following vars)
- *
- * @return bool false on error, true on success
- * @access public
- */
- function alter_block_array($blockname, $vararray, $key = false, $mode = 'insert')
- {
- if (strpos($blockname, '.') !== false)
- {
- // Nested blocks are not supported
- return false;
- }
-
- // Change key to zero (change first position) if false and to last position if true
- if ($key === false || $key === true)
- {
- $key = ($key === false) ? 0 : sizeof($this->_tpldata[$blockname]);
- }
-
- // Get correct position if array given
- if (is_array($key))
- {
- // Search array to get correct position
- list($search_key, $search_value) = @each($key);
-
- $key = NULL;
- foreach ($this->_tpldata[$blockname] as $i => $val_ary)
- {
- if ($val_ary[$search_key] === $search_value)
- {
- $key = $i;
- break;
- }
- }
-
- // key/value pair not found
- if ($key === NULL)
- {
- return false;
- }
- }
-
- // Insert Block
- if ($mode == 'insert')
- {
- // Make sure we are not exceeding the last iteration
- if ($key >= sizeof($this->_tpldata[$blockname]))
- {
- $key = sizeof($this->_tpldata[$blockname]);
- unset($this->_tpldata[$blockname][($key - 1)]['S_LAST_ROW']);
- $vararray['S_LAST_ROW'] = true;
- }
- else if ($key === 0)
- {
- unset($this->_tpldata[$blockname][0]['S_FIRST_ROW']);
- $vararray['S_FIRST_ROW'] = true;
- }
-
- // Re-position template blocks
- for ($i = sizeof($this->_tpldata[$blockname]); $i > $key; $i--)
- {
- $this->_tpldata[$blockname][$i] = $this->_tpldata[$blockname][$i-1];
- $this->_tpldata[$blockname][$i]['S_ROW_COUNT'] = $i;
- }
-
- // Insert vararray at given position
- $vararray['S_ROW_COUNT'] = $key;
- $this->_tpldata[$blockname][$key] = $vararray;
-
- return true;
- }
-
- // Which block to change?
- if ($mode == 'change')
- {
- if ($key == sizeof($this->_tpldata[$blockname]))
- {
- $key--;
- }
-
- $this->_tpldata[$blockname][$key] = array_merge($this->_tpldata[$blockname][$key], $vararray);
- return true;
- }
-
- return false;
- }
-
- /**
- * Include a separate template
- * @access private
- */
- function _tpl_include($filename, $include = true)
- {
- $handle = $filename;
- $this->filename[$handle] = $filename;
- $this->files[$handle] = $this->root . '/' . $filename;
- if ($this->inherit_root)
- {
- $this->files_inherit[$handle] = $this->inherit_root . '/' . $filename;
- }
-
- $filename = $this->_tpl_load($handle);
-
- if ($include)
- {
- global $user;
-
- if ($filename)
- {
- include($filename);
- return;
- }
- eval(' ?>' . $this->compiled_code[$handle] . '<?php ');
- }
- }
-
- /**
- * Include a php-file
- * @access private
- */
- function _php_include($filename)
- {
- global $phpbb_root_path;
-
- $file = $phpbb_root_path . $filename;
-
- if (!file_exists($file))
- {
- // trigger_error cannot be used here, as the output already started
- echo 'template->_php_include(): File ' . htmlspecialchars($file) . ' does not exist or is empty';
- return;
- }
- include($file);
- }
-}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_attachments.php b/phpBB/includes/ucp/info/ucp_attachments.php
index 84edce446c..adc7b92920 100644
--- a/phpBB/includes/ucp/info/ucp_attachments.php
+++ b/phpBB/includes/ucp/info/ucp_attachments.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -33,5 +32,3 @@ class ucp_attachments_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_auth_link.php b/phpBB/includes/ucp/info/ucp_auth_link.php
new file mode 100644
index 0000000000..ee88b15ea8
--- /dev/null
+++ b/phpBB/includes/ucp/info/ucp_auth_link.php
@@ -0,0 +1,34 @@
+<?php
+/**
+*
+* @package ucp
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @package module_install
+*/
+class ucp_auth_link_info
+{
+ function module()
+ {
+ return array(
+ 'filename' => 'ucp_auth_link',
+ 'title' => 'UCP_AUTH_LINK',
+ 'version' => '1.0.0',
+ 'modes' => array(
+ 'auth_link' => array('title' => 'UCP_AUTH_LINK_MANAGE', 'auth' => '', 'cat' => array('UCP_PROFILE')),
+ ),
+ );
+ }
+
+ function install()
+ {
+ }
+
+ function uninstall()
+ {
+ }
+}
diff --git a/phpBB/includes/ucp/info/ucp_groups.php b/phpBB/includes/ucp/info/ucp_groups.php
index 2002123c50..b7ffcd0971 100644
--- a/phpBB/includes/ucp/info/ucp_groups.php
+++ b/phpBB/includes/ucp/info/ucp_groups.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,5 +33,3 @@ class ucp_groups_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_main.php b/phpBB/includes/ucp/info/ucp_main.php
index 722b7865e6..e40a0cc1c5 100644
--- a/phpBB/includes/ucp/info/ucp_main.php
+++ b/phpBB/includes/ucp/info/ucp_main.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -36,5 +35,3 @@ class ucp_main_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_notifications.php b/phpBB/includes/ucp/info/ucp_notifications.php
new file mode 100644
index 0000000000..98d8b9db61
--- /dev/null
+++ b/phpBB/includes/ucp/info/ucp_notifications.php
@@ -0,0 +1,35 @@
+<?php
+/**
+*
+* @package notifications
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @package module_install
+*/
+class ucp_notifications_info
+{
+ function module()
+ {
+ return array(
+ 'filename' => 'ucp_notifications',
+ 'title' => 'UCP_NOTIFICATION_OPTIONS',
+ 'version' => '1.0.0',
+ 'modes' => array(
+ 'notification_options' => array('title' => 'UCP_NOTIFICATION_OPTIONS', 'auth' => '', 'cat' => array('UCP_PREFS')),
+ 'notification_list' => array('title' => 'UCP_NOTIFICATION_LIST', 'auth' => '', 'cat' => array('UCP_MAIN')),
+ ),
+ );
+ }
+
+ function install()
+ {
+ }
+
+ function uninstall()
+ {
+ }
+}
diff --git a/phpBB/includes/ucp/info/ucp_pm.php b/phpBB/includes/ucp/info/ucp_pm.php
index ade12005c0..02931e9d31 100644
--- a/phpBB/includes/ucp/info/ucp_pm.php
+++ b/phpBB/includes/ucp/info/ucp_pm.php
@@ -1,9 +1,8 @@
<?php
/**
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -36,5 +35,3 @@ class ucp_pm_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_prefs.php b/phpBB/includes/ucp/info/ucp_prefs.php
index 58359e8a19..91fbd7a14c 100644
--- a/phpBB/includes/ucp/info/ucp_prefs.php
+++ b/phpBB/includes/ucp/info/ucp_prefs.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -35,5 +34,3 @@ class ucp_prefs_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_profile.php b/phpBB/includes/ucp/info/ucp_profile.php
index 4591776768..e974cea713 100644
--- a/phpBB/includes/ucp/info/ucp_profile.php
+++ b/phpBB/includes/ucp/info/ucp_profile.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -20,10 +19,11 @@ class ucp_profile_info
'title' => 'UCP_PROFILE',
'version' => '1.0.0',
'modes' => array(
- 'profile_info' => array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => '', 'cat' => array('UCP_PROFILE')),
+ 'profile_info' => array('title' => 'UCP_PROFILE_PROFILE_INFO', 'auth' => 'acl_u_chgprofileinfo', 'cat' => array('UCP_PROFILE')),
'signature' => array('title' => 'UCP_PROFILE_SIGNATURE', 'auth' => 'acl_u_sig', 'cat' => array('UCP_PROFILE')),
- 'avatar' => array('title' => 'UCP_PROFILE_AVATAR', 'auth' => 'cfg_allow_avatar && (cfg_allow_avatar_local || cfg_allow_avatar_remote || cfg_allow_avatar_upload || cfg_allow_avatar_remote_upload)', 'cat' => array('UCP_PROFILE')),
+ 'avatar' => array('title' => 'UCP_PROFILE_AVATAR', 'auth' => 'cfg_allow_avatar', 'cat' => array('UCP_PROFILE')),
'reg_details' => array('title' => 'UCP_PROFILE_REG_DETAILS', 'auth' => '', 'cat' => array('UCP_PROFILE')),
+ 'autologin_keys'=> array('title' => 'UCP_PROFILE_AUTOLOGIN_KEYS', 'auth' => '', 'cat' => array('UCP_PROFILE')),
),
);
}
@@ -36,5 +36,3 @@ class ucp_profile_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/info/ucp_zebra.php b/phpBB/includes/ucp/info/ucp_zebra.php
index 5fc1f8bee7..db57102aae 100644
--- a/phpBB/includes/ucp/info/ucp_zebra.php
+++ b/phpBB/includes/ucp/info/ucp_zebra.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,5 +33,3 @@ class ucp_zebra_info
{
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_activate.php b/phpBB/includes/ucp/ucp_activate.php
index b262dc5c1c..898dacd831 100644
--- a/phpBB/includes/ucp/ucp_activate.php
+++ b/phpBB/includes/ucp/ucp_activate.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -115,7 +114,7 @@ class ucp_activate
$messenger->template('admin_welcome_activated', $user_row['user_lang']);
- $messenger->to($user_row['user_email'], $user_row['username']);
+ $messenger->set_addresses($user_row);
$messenger->anti_abuse_headers($config, $user);
@@ -143,5 +142,3 @@ class ucp_activate
trigger_error($user->lang[$message]);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_attachments.php b/phpBB/includes/ucp/ucp_attachments.php
index b011b4f75d..dc095e7b73 100644
--- a/phpBB/includes/ucp/ucp_attachments.php
+++ b/phpBB/includes/ucp/ucp_attachments.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -171,9 +170,11 @@ class ucp_attachments
}
$db->sql_freeresult($result);
+ $base_url = $this->u_action . "&amp;sk=$sort_key&amp;sd=$sort_dir";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $num_attachments, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
- 'PAGE_NUMBER' => on_page($num_attachments, $config['topics_per_page'], $start),
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;sk=$sort_key&amp;sd=$sort_dir", $num_attachments, $config['topics_per_page'], $start),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $num_attachments, $config['topics_per_page'], $start),
'TOTAL_ATTACHMENTS' => $num_attachments,
'L_TITLE' => $user->lang['UCP_ATTACHMENTS'],
@@ -197,5 +198,3 @@ class ucp_attachments
$this->page_title = 'UCP_ATTACHMENTS';
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_auth_link.php b/phpBB/includes/ucp/ucp_auth_link.php
new file mode 100644
index 0000000000..b86c4c8d52
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_auth_link.php
@@ -0,0 +1,142 @@
+<?php
+/**
+*
+* @package ucp
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+class ucp_auth_link
+{
+ /**
+ * @var string
+ */
+ public $u_action;
+
+ /**
+ * Generates the ucp_auth_link page and handles the auth link process
+ *
+ * @param int $id
+ * @param string $mode
+ */
+ public function main($id, $mode)
+ {
+ global $config, $request, $template, $phpbb_container, $user;
+
+ $error = array();
+
+ $auth_provider = $phpbb_container->get('auth.provider.' . $config['auth_method']);
+
+ // confirm that the auth provider supports this page
+ $provider_data = $auth_provider->get_auth_link_data();
+ if ($provider_data === null)
+ {
+ $error[] = 'UCP_AUTH_LINK_NOT_SUPPORTED';
+ }
+
+ $s_hidden_fields = array();
+ add_form_key('ucp_auth_link');
+
+ $submit = $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
+
+ // This path is only for primary actions
+ if (!sizeof($error) && $submit)
+ {
+ if (!check_form_key('ucp_auth_link'))
+ {
+ $error[] = 'FORM_INVALID';
+ }
+
+ if (!sizeof($error))
+ {
+ // Any post data could be necessary for auth (un)linking
+ $link_data = $request->get_super_global(\phpbb\request\request_interface::POST);
+
+ // The current user_id is also necessary
+ $link_data['user_id'] = $user->data['user_id'];
+
+ // Tell the provider that the method is auth_link not login_link
+ $link_data['link_method'] = 'auth_link';
+
+ if ($request->variable('link', 0, false, \phpbb\request\request_interface::POST))
+ {
+ $error[] = $auth_provider->link_account($link_data);
+ }
+ else
+ {
+ $error[] = $auth_provider->unlink_account($link_data);
+ }
+
+ // Template data may have changed, get new data
+ $provider_data = $auth_provider->get_auth_link_data();
+ }
+ }
+
+ // In some cases, a request to an external server may be required. In
+ // these cases, the GET parameter 'link' should exist and should be true
+ if ($request->variable('link', false))
+ {
+ // In this case the link data should only be populated with the
+ // link_method as the provider dictates how data is returned to it.
+ $link_data = array('link_method' => 'auth_link');
+
+ $error[] = $auth_provider->link_account($link_data);
+
+ // Template data may have changed, get new data
+ $provider_data = $auth_provider->get_auth_link_data();
+ }
+
+ if (isset($provider_data['VARS']))
+ {
+ // Handle hidden fields separately
+ if (isset($provider_data['VARS']['HIDDEN_FIELDS']))
+ {
+ $s_hidden_fields = array_merge($s_hidden_fields, $provider_data['VARS']['HIDDEN_FIELDS']);
+ unset($provider_data['VARS']['HIDDEN_FIELDS']);
+ }
+
+ $template->assign_vars($provider_data['VARS']);
+ }
+
+ if (isset($provider_data['BLOCK_VAR_NAME']))
+ {
+ foreach ($provider_data['BLOCK_VARS'] as $block_vars)
+ {
+ // See if there are additional hidden fields. This should be an associative array
+ if (isset($block_vars['HIDDEN_FIELDS']))
+ {
+ $block_vars['HIDDEN_FIELDS'] = build_hidden_fields($block_vars['HIDDEN_FIELDS']);
+ }
+
+ $template->assign_block_vars($provider_data['BLOCK_VAR_NAME'], $block_vars);
+ }
+ }
+
+ $s_hidden_fields = build_hidden_fields($s_hidden_fields);
+
+ // Replace "error" strings with their real, localised form
+ $error = array_map(array($user, 'lang'), $error);
+ $error = implode('<br />', $error);
+
+ $template->assign_vars(array(
+ 'ERROR' => $error,
+
+ 'PROVIDER_TEMPLATE_FILE' => $provider_data['TEMPLATE_FILE'],
+
+ 'S_HIDDEN_FIELDS' => $s_hidden_fields,
+ 'S_UCP_ACTION' => $this->u_action,
+ ));
+
+ $this->tpl_name = 'ucp_auth_link';
+ $this->page_title = 'UCP_AUTH_LINK';
+ }
+}
diff --git a/phpBB/includes/ucp/ucp_confirm.php b/phpBB/includes/ucp/ucp_confirm.php
index 445f7c7d2a..aafb92d8e4 100644
--- a/phpBB/includes/ucp/ucp_confirm.php
+++ b/phpBB/includes/ucp/ucp_confirm.php
@@ -2,9 +2,8 @@
/**
*
* @package VC
-* @version $Id$
* @copyright (c) 2005 2008 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -46,5 +45,3 @@ class ucp_confirm
exit_handler();
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_groups.php b/phpBB/includes/ucp/ucp_groups.php
index 663b5bc931..a75d2e9bfc 100644
--- a/phpBB/includes/ucp/ucp_groups.php
+++ b/phpBB/includes/ucp/ucp_groups.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -26,16 +25,17 @@ class ucp_groups
function main($id, $mode)
{
- global $config, $phpbb_root_path, $phpEx;
+ global $config, $phpbb_root_path, $phpEx, $phpbb_admin_path;
global $db, $user, $auth, $cache, $template;
+ global $request, $phpbb_container;
$user->add_lang('groups');
$return_page = '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '">', '</a>');
$mark_ary = request_var('mark', array(0));
- $submit = (!empty($_POST['submit'])) ? true : false;
- $delete = (!empty($_POST['delete'])) ? true : false;
+ $submit = $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
+ $delete = $request->variable('delete', false, false, \phpbb\request\request_interface::POST);
$error = $data = array();
switch ($mode)
@@ -197,38 +197,6 @@ class ucp_groups
else
{
group_user_add($group_id, $user->data['user_id'], false, false, false, 0, 1);
-
- include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
- $messenger = new messenger();
-
- $sql = 'SELECT u.username, u.username_clean, u.user_email, u.user_notify_type, u.user_jabber, u.user_lang
- FROM ' . USER_GROUP_TABLE . ' ug, ' . USERS_TABLE . " u
- WHERE ug.user_id = u.user_id
- AND ug.group_leader = 1
- AND ug.group_id = $group_id";
- $result = $db->sql_query($sql);
-
- while ($row = $db->sql_fetchrow($result))
- {
- $messenger->template('group_request', $row['user_lang']);
-
- $messenger->to($row['user_email'], $row['username']);
- $messenger->im($row['user_jabber'], $row['username']);
-
- $messenger->assign_vars(array(
- 'USERNAME' => htmlspecialchars_decode($row['username']),
- 'GROUP_NAME' => htmlspecialchars_decode($group_row[$group_id]['group_name']),
- 'REQUEST_USERNAME' => $user->data['username'],
-
- 'U_PENDING' => generate_board_url() . "/ucp.$phpEx?i=groups&mode=manage&action=list&g=$group_id",
- 'U_GROUP' => generate_board_url() . "/memberlist.$phpEx?mode=group&g=$group_id")
- );
-
- $messenger->send($row['user_notify_type']);
- }
- $db->sql_freeresult($result);
-
- $messenger->save_queue();
}
add_log('user', $user->data['user_id'], 'LOG_USER_GROUP_JOIN' . (($group_row[$group_id]['group_type'] == GROUP_FREE) ? '' : '_PENDING'), $group_row[$group_id]['group_name']);
@@ -417,9 +385,11 @@ class ucp_groups
if ($group_id)
{
- $sql = 'SELECT *
- FROM ' . GROUPS_TABLE . "
- WHERE group_id = $group_id";
+ $sql = 'SELECT g.*, t.teampage_position AS group_teampage
+ FROM ' . GROUPS_TABLE . ' g
+ LEFT JOIN ' . TEAMPAGE_TABLE . ' t
+ ON (t.group_id = g.group_id)
+ WHERE g.group_id = ' . $group_id;
$result = $db->sql_query($sql);
$group_row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
@@ -438,7 +408,7 @@ class ucp_groups
$group_name = $group_row['group_name'];
$group_type = $group_row['group_type'];
- $avatar_img = (!empty($group_row['group_avatar'])) ? get_user_avatar($group_row['group_avatar'], $group_row['group_avatar_type'], $group_row['group_avatar_width'], $group_row['group_avatar_height'], 'GROUP_AVATAR') : '<img src="' . $phpbb_root_path . 'adm/images/no_avatar.gif" alt="" />';
+ $avatar = phpbb_get_group_avatar($group_row, 'GROUP_AVATAR', true);
$template->assign_vars(array(
'GROUP_NAME' => ($group_type == GROUP_SPECIAL) ? $user->lang['G_' . $group_name] : $group_name,
@@ -447,8 +417,8 @@ class ucp_groups
'GROUP_DESC_DISP' => generate_text_for_display($group_row['group_desc'], $group_row['group_desc_uid'], $group_row['group_desc_bitfield'], $group_row['group_desc_options']),
'GROUP_TYPE' => $group_row['group_type'],
- 'AVATAR' => $avatar_img,
- 'AVATAR_IMAGE' => $avatar_img,
+ 'AVATAR' => (empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar),
+ 'AVATAR_IMAGE' => (empty($avatar) ? '<img src="' . $phpbb_admin_path . 'images/no_avatar.gif" alt="" />' : $avatar),
'AVATAR_WIDTH' => (isset($group_row['group_avatar_width'])) ? $group_row['group_avatar_width'] : '',
'AVATAR_HEIGHT' => (isset($group_row['group_avatar_height'])) ? $group_row['group_avatar_height'] : '',
));
@@ -483,10 +453,20 @@ class ucp_groups
$error = array();
- $avatar_select = basename(request_var('avatar_select', ''));
- $category = basename(request_var('category', ''));
+ // Setup avatar data for later
+ $avatars_enabled = false;
+ $avatar_drivers = null;
+ $avatar_data = null;
+ $avatar_error = array();
+
+ if ($config['allow_avatar'])
+ {
+ $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
+ $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
- $can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $file_uploads) ? true : false;
+ // This is normalised data, without the group_ prefix
+ $avatar_data = \phpbb\avatar\manager::clean_row($group_row);
+ }
// Did we submit?
if ($update)
@@ -505,89 +485,44 @@ class ucp_groups
'receive_pm' => isset($_REQUEST['group_receive_pm']) ? 1 : 0,
'message_limit' => request_var('group_message_limit', 0),
'max_recipients'=> request_var('group_max_recipients', 0),
+ 'legend' => $group_row['group_legend'],
+ 'teampage' => $group_row['group_teampage'],
);
- $data['uploadurl'] = request_var('uploadurl', '');
- $data['remotelink'] = request_var('remotelink', '');
- $data['width'] = request_var('width', '');
- $data['height'] = request_var('height', '');
- $delete = request_var('delete', '');
-
- if (!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl'] || $data['remotelink'])
+ if ($config['allow_avatar'])
{
- // Avatar stuff
- $var_ary = array(
- 'uploadurl' => array('string', true, 5, 255),
- 'remotelink' => array('string', true, 5, 255),
- 'width' => array('string', true, 1, 3),
- 'height' => array('string', true, 1, 3),
- );
+ // Handle avatar
+ $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
+ $config_name = preg_replace('#^avatar\.driver.#', '', $driver_name);
- if (!($error = validate_data($data, $var_ary)))
+ if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
{
- $data['user_id'] = "g$group_id";
+ $driver = $phpbb_avatar_manager->get_driver($driver_name);
+ $result = $driver->process_form($request, $template, $user, $avatar_data, $avatar_error);
- if ((!empty($_FILES['uploadfile']['tmp_name']) || $data['uploadurl']) && $can_upload)
+ if ($result && empty($avatar_error))
{
- list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_upload($data, $error);
- }
- else if ($data['remotelink'])
- {
- list($submit_ary['avatar_type'], $submit_ary['avatar'], $submit_ary['avatar_width'], $submit_ary['avatar_height']) = avatar_remote($data, $error);
- }
- }
- }
- else if ($avatar_select && $config['allow_avatar_local'])
- {
- // check avatar gallery
- if (is_dir($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category))
- {
- $submit_ary['avatar_type'] = AVATAR_GALLERY;
+ $result['avatar_type'] = $driver_name;
- list($submit_ary['avatar_width'], $submit_ary['avatar_height']) = getimagesize($phpbb_root_path . $config['avatar_gallery_path'] . '/' . $category . '/' . $avatar_select);
- $submit_ary['avatar'] = $category . '/' . $avatar_select;
- }
- }
- else if ($delete)
- {
- $submit_ary['avatar'] = '';
- $submit_ary['avatar_type'] = $submit_ary['avatar_width'] = $submit_ary['avatar_height'] = 0;
- }
- else if ($data['width'] && $data['height'])
- {
- // Only update the dimensions?
- if ($config['avatar_max_width'] || $config['avatar_max_height'])
- {
- if ($data['width'] > $config['avatar_max_width'] || $data['height'] > $config['avatar_max_height'])
- {
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
+ $submit_ary = array_merge($submit_ary, $result);
}
}
-
- if (!sizeof($error))
+ else
{
- if ($config['avatar_min_width'] || $config['avatar_min_height'])
+ if ($driver = $phpbb_avatar_manager->get_driver($user->data['user_avatar_type']))
{
- if ($data['width'] < $config['avatar_min_width'] || $data['height'] < $config['avatar_min_height'])
- {
- $error[] = sprintf($user->lang['AVATAR_WRONG_SIZE'], $config['avatar_min_width'], $config['avatar_min_height'], $config['avatar_max_width'], $config['avatar_max_height'], $data['width'], $data['height']);
- }
+ $driver->delete($avatar_data);
}
- }
- if (!sizeof($error))
- {
- $submit_ary['avatar_width'] = $data['width'];
- $submit_ary['avatar_height'] = $data['height'];
+ // Removing the avatar
+ $submit_ary['avatar_type'] = '';
+ $submit_ary['avatar'] = '';
+ $submit_ary['avatar_width'] = 0;
+ $submit_ary['avatar_height'] = 0;
}
- }
- if ((isset($submit_ary['avatar']) && $submit_ary['avatar'] && (!isset($group_row['group_avatar']))) || $delete)
- {
- if (isset($group_row['group_avatar']) && $group_row['group_avatar'])
- {
- avatar_delete('group', $group_row, true);
- }
+ // Merge any avatars errors into the primary error array
+ $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
}
if (!check_form_key('ucp_groups'))
@@ -607,24 +542,28 @@ class ucp_groups
// Only set the rank, colour, etc. if it's changed or if we're adding a new
// group. This prevents existing group members being updated if no changes
// were made.
+ // However there are some attributes that need to be set everytime,
+ // otherwise the group gets removed from the feature.
+ $set_attributes = array('legend', 'teampage');
$group_attributes = array();
$test_variables = array(
'rank' => 'int',
'colour' => 'string',
'avatar' => 'string',
- 'avatar_type' => 'int',
+ 'avatar_type' => 'string',
'avatar_width' => 'int',
'avatar_height' => 'int',
'receive_pm' => 'int',
'legend' => 'int',
+ 'teampage' => 'int',
'message_limit' => 'int',
'max_recipients'=> 'int',
);
foreach ($test_variables as $test => $type)
{
- if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test]))
+ if (isset($submit_ary[$test]) && ($action == 'add' || $group_row['group_' . $test] != $submit_ary[$test] || isset($group_attributes['group_avatar']) && strpos($test, 'avatar') === 0 || in_array($test, $set_attributes)))
{
settype($submit_ary[$test], $type);
$group_attributes['group_' . $test] = $group_row['group_' . $test] = $submit_ary[$test];
@@ -634,6 +573,7 @@ class ucp_groups
if (!($error = group_create($group_id, $group_type, $group_name, $group_desc, $group_attributes, $allow_desc_bbcode, $allow_desc_urls, $allow_desc_smilies)))
{
$cache->destroy('sql', GROUPS_TABLE);
+ $cache->destroy('sql', TEAMPAGE_TABLE);
$message = ($action == 'edit') ? 'GROUP_UPDATED' : 'GROUP_CREATED';
trigger_error($user->lang[$message] . $return_page);
@@ -690,28 +630,51 @@ class ucp_groups
$type_closed = ($group_type == GROUP_CLOSED) ? ' checked="checked"' : '';
$type_hidden = ($group_type == GROUP_HIDDEN) ? ' checked="checked"' : '';
- $display_gallery = (isset($_POST['display_gallery'])) ? true : false;
-
- if ($config['allow_avatar'] && $config['allow_avatar_local'] && $display_gallery)
+ // Load up stuff for avatars
+ if ($config['allow_avatar'])
{
- avatar_gallery($category, $avatar_select, 4);
+ $avatars_enabled = false;
+ $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $avatar_data['avatar_type']));
+
+ foreach ($avatar_drivers as $current_driver)
+ {
+ $driver = $phpbb_avatar_manager->get_driver($current_driver);
+
+ $avatars_enabled = true;
+ $template->set_filenames(array(
+ 'avatar' => $driver->get_template_name(),
+ ));
+
+ if ($driver->prepare_form($request, $template, $user, $avatar_data, $avatar_error))
+ {
+ $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver);
+ $driver_upper = strtoupper($driver_name);
+ $template->assign_block_vars('avatar_drivers', array(
+ 'L_TITLE' => $user->lang($driver_upper . '_TITLE'),
+ 'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'),
+
+ 'DRIVER' => $driver_name,
+ 'SELECTED' => $current_driver == $selected_driver,
+ 'OUTPUT' => $template->assign_display('avatar'),
+ ));
+ }
+ }
}
- $avatars_enabled = ($config['allow_avatar'] && (($can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) || ($config['allow_avatar_local'] || $config['allow_avatar_remote']))) ? true : false;
+ if (isset($phpbb_avatar_manager) && !$update)
+ {
+ // Merge any avatars errors into the primary error array
+ $error = array_merge($error, $phpbb_avatar_manager->localize_errors($user, $avatar_error));
+ }
$template->assign_vars(array(
'S_EDIT' => true,
'S_INCLUDE_SWATCH' => true,
- 'S_FORM_ENCTYPE' => ($config['allow_avatar'] && $can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) ? ' enctype="multipart/form-data"' : '',
+ 'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
'S_ERROR' => (sizeof($error)) ? true : false,
'S_SPECIAL_GROUP' => ($group_type == GROUP_SPECIAL) ? true : false,
- 'S_AVATARS_ENABLED' => $avatars_enabled,
- 'S_DISPLAY_GALLERY' => ($config['allow_avatar'] && $config['allow_avatar_local'] && !$display_gallery) ? true : false,
- 'S_IN_GALLERY' => ($config['allow_avatar_local'] && $display_gallery) ? true : false,
-
- 'S_UPLOAD_AVATAR_FILE' => ($config['allow_avatar'] && $config['allow_avatar_upload'] && $can_upload) ? true : false,
- 'S_UPLOAD_AVATAR_URL' => ($config['allow_avatar'] && $config['allow_avatar_remote_upload'] && $can_upload) ? true : false,
- 'S_LINK_AVATAR' => ($config['allow_avatar'] && $config['allow_avatar_remote']) ? true : false,
+ 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
+ 'S_GROUP_MANAGE' => true,
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
'GROUP_RECEIVE_PM' => (isset($group_row['group_receive_pm']) && $group_row['group_receive_pm']) ? ' checked="checked"' : '',
@@ -724,7 +687,6 @@ class ucp_groups
'S_DESC_SMILIES_CHECKED'=> $group_desc_data['allow_smilies'],
'S_RANK_OPTIONS' => $rank_options,
- 'AVATAR_MAX_FILESIZE' => $config['avatar_filesize'],
'GROUP_TYPE_FREE' => GROUP_FREE,
'GROUP_TYPE_OPEN' => GROUP_OPEN,
@@ -737,9 +699,9 @@ class ucp_groups
'GROUP_CLOSED' => $type_closed,
'GROUP_HIDDEN' => $type_hidden,
- 'U_SWATCH' => append_sid("{$phpbb_root_path}adm/swatch.$phpEx", 'form=ucp&amp;name=group_colour'),
+ 'U_SWATCH' => append_sid("{$phpbb_admin_path}swatch.$phpEx", 'form=ucp&amp;name=group_colour'),
'S_UCP_ACTION' => $this->u_action . "&amp;action=$action&amp;g=$group_id",
- 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
+ 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(),
));
break;
@@ -852,11 +814,13 @@ class ucp_groups
$s_action_options .= '<option value="' . $option . '">' . $user->lang['GROUP_' . $lang] . '</option>';
}
+ $base_url = $this->u_action . "&amp;action=$action&amp;g=$group_id";
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $total_members, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
'S_LIST' => true,
'S_ACTION_OPTIONS' => $s_action_options,
- 'S_ON_PAGE' => on_page($total_members, $config['topics_per_page'], $start),
- 'PAGINATION' => generate_pagination($this->u_action . "&amp;action=$action&amp;g=$group_id", $total_members, $config['topics_per_page'], $start),
+ 'S_ON_PAGE' => phpbb_on_page($template, $user, $base_url, $total_members, $config['topics_per_page'], $start),
'U_ACTION' => $this->u_action . "&amp;g=$group_id",
'S_UCP_ACTION' => $this->u_action . "&amp;g=$group_id",
@@ -1075,7 +1039,8 @@ class ucp_groups
'mode' => $mode,
'action' => $action
);
- confirm_box(false, sprintf($user->lang['GROUP_CONFIRM_ADD_USER' . ((sizeof($name_ary) == 1) ? '' : 'S')], implode(', ', $name_ary)), build_hidden_fields($s_hidden_fields));
+
+ confirm_box(false, $user->lang('GROUP_CONFIRM_ADD_USERS', sizeof($name_ary), implode($user->lang['COMMA_SEPARATOR'], $name_ary)), build_hidden_fields($s_hidden_fields));
}
trigger_error($user->lang['NO_USERS_ADDED'] . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $this->u_action . '&amp;action=list&amp;g=' . $group_id . '">', '</a>'));
@@ -1117,5 +1082,3 @@ class ucp_groups
$this->tpl_name = 'ucp_groups_' . $mode;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_login_link.php b/phpBB/includes/ucp/ucp_login_link.php
new file mode 100644
index 0000000000..80a553953d
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_login_link.php
@@ -0,0 +1,243 @@
+<?php
+/**
+*
+* @package ucp
+* @copyright (c) 2013 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+/**
+* ucp_login_link
+* Allows users of external accounts link those accounts to their phpBB accounts
+* during an attempted login.
+* @package ucp
+*/
+class ucp_login_link
+{
+ /**
+ * @var string
+ */
+ public $u_action;
+
+ /**
+ * Generates the ucp_login_link page and handles login link process
+ *
+ * @param int $id
+ * @param string $mode
+ */
+ function main($id, $mode)
+ {
+ global $config, $phpbb_container, $request, $template, $user;
+ global $phpbb_root_path, $phpEx;
+
+ // Initialize necessary variables
+ $login_error = null;
+ $login_link_error = null;
+ $login_username = null;
+
+ // Build the data array
+ $data = $this->get_login_link_data_array();
+
+ // Ensure the person was sent here with login_link data
+ if (empty($data))
+ {
+ $login_link_error = $user->lang['LOGIN_LINK_NO_DATA_PROVIDED'];
+ }
+
+ // Use the auth_provider requested even if different from configured
+ $auth_provider = 'auth.provider.' . $request->variable('auth_provider', $config['auth_method']);
+ $auth_provider = $phpbb_container->get($auth_provider);
+
+ // Set the link_method to login_link
+ $data['link_method'] = 'login_link';
+
+ // Have the authentication provider check that all necessary data is available
+ $result = $auth_provider->login_link_has_necessary_data($data);
+ if ($result !== null)
+ {
+ $login_link_error = $user->lang[$result];
+ }
+
+ // Perform link action if there is no error
+ if (!$login_link_error)
+ {
+ if ($request->is_set_post('login'))
+ {
+ $login_username = $request->variable('login_username', '', false, \phpbb\request\request_interface::POST);
+ $login_password = $request->untrimmed_variable('login_password', '', true, \phpbb\request\request_interface::POST);
+
+ $login_result = $auth_provider->login($login_username, $login_password);
+
+ // We only care if there is or is not an error
+ $login_error = $this->process_login_result($login_result);
+
+ if (!$login_error)
+ {
+ // Give the user_id to the data
+ $data['user_id'] = $login_result['user_row']['user_id'];
+
+ // The user is now logged in, attempt to link the user to the external account
+ $result = $auth_provider->link_account($data);
+
+ if ($result)
+ {
+ $login_link_error = $user->lang[$result];
+ }
+ else
+ {
+ // Finish login
+ $result = $user->session_create($login_result['user_row']['user_id'], false, false, true);
+
+ // Perform a redirect as the account has been linked
+ $this->perform_redirect();
+ }
+ }
+ }
+ }
+
+ $template->assign_vars(array(
+ // Common template elements
+ 'LOGIN_LINK_ERROR' => $login_link_error,
+ 'PASSWORD_CREDENTIAL' => 'login_password',
+ 'USERNAME_CREDENTIAL' => 'login_username',
+ 'S_HIDDEN_FIELDS' => $this->get_hidden_fields($data),
+
+ // Registration elements
+ 'REGISTER_ACTION' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=register'),
+
+ // Login elements
+ 'LOGIN_ERROR' => $login_error,
+ 'LOGIN_USERNAME' => $login_username,
+ ));
+
+ $this->tpl_name = 'ucp_login_link';
+ $this->page_title = 'UCP_LOGIN_LINK';
+ }
+
+ /**
+ * Builds the hidden fields string from the data array.
+ *
+ * @param array $data This function only includes data in the array
+ * that has a key that begins with 'login_link_'
+ * @return string A string of hidden fields that can be included in the
+ * template
+ */
+ protected function get_hidden_fields($data)
+ {
+ $fields = array();
+
+ foreach ($data as $key => $value)
+ {
+ $fields['login_link_' . $key] = $value;
+ }
+
+ return build_hidden_fields($fields);
+ }
+
+ /**
+ * Builds the login_link data array
+ *
+ * @return array All login_link data. This is all GET data whose names
+ * begin with 'login_link_'
+ */
+ protected function get_login_link_data_array()
+ {
+ global $request;
+
+ $var_names = $request->variable_names(\phpbb\request\request_interface::GET);
+ $login_link_data = array();
+ $string_start_length = strlen('login_link_');
+
+ foreach ($var_names as $var_name)
+ {
+ if (strpos($var_name, 'login_link_') === 0)
+ {
+ $key_name = substr($var_name, $string_start_length);
+ $login_link_data[$key_name] = $request->variable($var_name, '', false, \phpbb\request\request_interface::GET);
+ }
+ }
+
+ return $login_link_data;
+ }
+
+ /**
+ * Processes the result array from the login process
+ * @param array $result The login result array
+ * @return string|null If there was an error in the process, a string is
+ * returned. If the login was successful, then null is
+ * returned.
+ */
+ protected function process_login_result($result)
+ {
+ global $config, $request, $template, $user;
+
+ $login_error = null;
+
+ if ($result['status'] != LOGIN_SUCCESS)
+ {
+ // Handle all errors first
+ if ($result['status'] == LOGIN_BREAK)
+ {
+ trigger_error($result['error_msg']);
+ }
+
+ switch ($result['status'])
+ {
+ case LOGIN_ERROR_ATTEMPTS:
+
+ $captcha = phpbb_captcha_factory::get_instance($config['captcha_plugin']);
+ $captcha->init(CONFIRM_LOGIN);
+
+ $template->assign_vars(array(
+ 'CAPTCHA_TEMPLATE' => $captcha->get_template(),
+ ));
+
+ $login_error = $user->lang[$result['error_msg']];
+ break;
+
+ case LOGIN_ERROR_PASSWORD_CONVERT:
+ $login_error = sprintf(
+ $user->lang[$result['error_msg']],
+ ($config['email_enable']) ? '<a href="' . append_sid("{$phpbb_root_path}ucp.$phpEx", 'mode=sendpassword') . '">' : '',
+ ($config['email_enable']) ? '</a>' : '',
+ ($config['board_contact']) ? '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">' : '',
+ ($config['board_contact']) ? '</a>' : ''
+ );
+ break;
+
+ // Username, password, etc...
+ default:
+ $login_error = $user->lang[$result['error_msg']];
+
+ // Assign admin contact to some error messages
+ if ($result['error_msg'] == 'LOGIN_ERROR_USERNAME' || $result['error_msg'] == 'LOGIN_ERROR_PASSWORD')
+ {
+ $login_error = (!$config['board_contact']) ? sprintf($user->lang[$result['error_msg']], '', '') : sprintf($user->lang[$result['error_msg']], '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>');
+ }
+
+ break;
+ }
+ }
+
+ return $login_error;
+ }
+
+ /**
+ * Performs a post login redirect
+ */
+ protected function perform_redirect()
+ {
+ global $phpbb_root_path, $phpEx;
+ $url = append_sid($phpbb_root_path . 'index.' . $phpEx);
+ redirect($url);
+ }
+}
diff --git a/phpBB/includes/ucp/ucp_main.php b/phpBB/includes/ucp/ucp_main.php
index a6f71669ce..b859413d92 100644
--- a/phpBB/includes/ucp/ucp_main.php
+++ b/phpBB/includes/ucp/ucp_main.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -34,6 +33,7 @@ class ucp_main
function main($id, $mode)
{
global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $request;
switch ($mode)
{
@@ -56,39 +56,29 @@ class ucp_main
$sql_from .= ' LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.topic_id = t.topic_id
AND tt.user_id = ' . $user->data['user_id'] . ')';
$sql_select .= ', tt.mark_time';
+
+ $sql_from .= ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.forum_id = t.forum_id
+ AND ft.user_id = ' . $user->data['user_id'] . ')';
+ $sql_select .= ', ft.mark_time AS forum_mark_time';
}
$topic_type = $user->lang['VIEW_TOPIC_GLOBAL'];
$folder = 'global_read';
$folder_new = 'global_unread';
- // Get cleaned up list... return only those forums not having the f_read permission
- $forum_ary = $auth->acl_getf('!f_read', true);
+ // Get cleaned up list... return only those forums having the f_read permission
+ $forum_ary = $auth->acl_getf('f_read', true);
$forum_ary = array_unique(array_keys($forum_ary));
-
- // Determine first forum the user is able to read into - for global announcement link
- $sql = 'SELECT forum_id
- FROM ' . FORUMS_TABLE . '
- WHERE forum_type = ' . FORUM_POST;
-
- if (sizeof($forum_ary))
- {
- $sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true);
- }
- $result = $db->sql_query_limit($sql, 1);
- $g_forum_id = (int) $db->sql_fetchfield('forum_id');
- $db->sql_freeresult($result);
-
- $sql = "SELECT t.* $sql_select
- FROM $sql_from
- WHERE t.forum_id = 0
- AND t.topic_type = " . POST_GLOBAL . '
- ORDER BY t.topic_last_post_time DESC';
-
$topic_list = $rowset = array();
+
// If the user can't see any forums, he can't read any posts because fid of 0 is invalid
- if ($g_forum_id)
+ if (!empty($forum_ary))
{
+ $sql = "SELECT t.* $sql_select
+ FROM $sql_from
+ WHERE t.topic_type = " . POST_GLOBAL . '
+ AND ' . $db->sql_in_set('t.forum_id', $forum_ary) . '
+ ORDER BY t.topic_last_post_time DESC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
@@ -99,15 +89,34 @@ class ucp_main
$db->sql_freeresult($result);
}
- $topic_tracking_info = array();
+ $topic_forum_list = array();
+ foreach ($rowset as $t_id => $row)
+ {
+ if (isset($forum_tracking_info[$row['forum_id']]))
+ {
+ $row['forum_mark_time'] = $forum_tracking_info[$row['forum_id']];
+ }
+
+ $topic_forum_list[$row['forum_id']]['forum_mark_time'] = ($config['load_db_lastread'] && $user->data['is_registered'] && isset($row['forum_mark_time'])) ? $row['forum_mark_time'] : 0;
+ $topic_forum_list[$row['forum_id']]['topics'][] = (int) $t_id;
+ }
+
+ $topic_tracking_info = $tracking_topics = array();
if ($config['load_db_lastread'])
{
- $topic_tracking_info = get_topic_tracking(0, $topic_list, $rowset, false, $topic_list);
+ foreach ($topic_forum_list as $f_id => $topic_row)
+ {
+ $topic_tracking_info += get_topic_tracking($f_id, $topic_row['topics'], $rowset, array($f_id => $topic_row['forum_mark_time']));
+ }
}
else
{
- $topic_tracking_info = get_complete_topic_tracking(0, $topic_list, $topic_list);
+ foreach ($topic_forum_list as $f_id => $topic_row)
+ {
+ $topic_tracking_info += get_complete_topic_tracking($f_id, $topic_row['topics']);
+ }
}
+ unset($topic_forum_list);
foreach ($topic_list as $topic_id)
{
@@ -148,18 +157,18 @@ class ucp_main
'TOPIC_TITLE' => censor_text($row['topic_title']),
'TOPIC_TYPE' => $topic_type,
+ 'TOPIC_IMG_STYLE' => $folder_img,
'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt),
- 'TOPIC_FOLDER_IMG_SRC' => $user->img($folder_img, $folder_alt, false, '', 'src'),
'ATTACH_ICON_IMG' => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', '') : '',
'S_USER_POSTED' => (!empty($row['topic_posted']) && $row['topic_posted']) ? true : false,
'S_UNREAD' => $unread_topic,
'U_TOPIC_AUTHOR' => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
- 'U_LAST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$g_forum_id&amp;t=$topic_id&amp;p=" . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
+ 'U_LAST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;p=" . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
- 'U_NEWEST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$g_forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
- 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$g_forum_id&amp;t=$topic_id"))
+ 'U_NEWEST_POST' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id&amp;view=unread") . '#unread',
+ 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=$topic_id"))
);
}
@@ -183,8 +192,8 @@ class ucp_main
'VISITED' => (empty($last_visit)) ? ' - ' : $user->format_date($last_visit),
'WARNINGS' => ($user->data['user_warnings']) ? $user->data['user_warnings'] : 0,
'POSTS' => ($user->data['user_posts']) ? $user->data['user_posts'] : 0,
- 'POSTS_DAY' => sprintf($user->lang['POST_DAY'], $posts_per_day),
- 'POSTS_PCT' => sprintf($user->lang['POST_PCT'], $percentage),
+ 'POSTS_DAY' => $user->lang('POST_DAY', $posts_per_day),
+ 'POSTS_PCT' => $user->lang('POST_PCT', $percentage),
'OCCUPATION' => (!empty($row['user_occ'])) ? $row['user_occ'] : '',
'INTERESTS' => (!empty($row['user_interests'])) ? $row['user_interests'] : '',
@@ -287,7 +296,7 @@ class ucp_main
}
else
{
- $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
+ $tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
$tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
}
@@ -334,8 +343,8 @@ class ucp_main
$template->assign_block_vars('forumrow', array(
'FORUM_ID' => $forum_id,
+ 'FORUM_IMG_STYLE' => $folder_image,
'FORUM_FOLDER_IMG' => $user->img($folder_image, $folder_alt),
- 'FORUM_FOLDER_IMG_SRC' => $user->img($folder_image, $folder_alt, false, '', 'src'),
'FORUM_IMAGE' => ($row['forum_image']) ? '<img src="' . $phpbb_root_path . $row['forum_image'] . '" alt="' . $user->lang[$folder_alt] . '" />' : '',
'FORUM_IMAGE_SRC' => ($row['forum_image']) ? $phpbb_root_path . $row['forum_image'] : '',
'FORUM_NAME' => $row['forum_name'],
@@ -435,7 +444,7 @@ class ucp_main
$edit = (isset($_REQUEST['edit'])) ? true : false;
$submit = (isset($_POST['submit'])) ? true : false;
- $draft_id = ($edit) ? intval($_REQUEST['edit']) : 0;
+ $draft_id = $request->variable('edit', 0);
$delete = (isset($_POST['delete'])) ? true : false;
$s_hidden_fields = ($edit) ? '<input type="hidden" name="edit" value="' . $draft_id . '" />' : '';
@@ -633,7 +642,7 @@ class ucp_main
*/
function assign_topiclist($mode = 'subscribed', $forbidden_forum_ary = array())
{
- global $user, $db, $template, $config, $cache, $auth, $phpbb_root_path, $phpEx;
+ global $user, $db, $template, $config, $cache, $auth, $phpbb_root_path, $phpEx, $phpbb_container;
$table = ($mode == 'subscribed') ? TOPICS_WATCH_TABLE : BOOKMARKS_TABLE;
$start = request_var('start', 0);
@@ -660,11 +669,12 @@ class ucp_main
if ($topics_count)
{
+ phpbb_generate_template_pagination($template, $this->u_action, 'pagination', 'start', $topics_count, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
- 'PAGINATION' => generate_pagination($this->u_action, $topics_count, $config['topics_per_page'], $start),
- 'PAGE_NUMBER' => on_page($topics_count, $config['topics_per_page'], $start),
- 'TOTAL_TOPICS' => ($topics_count == 1) ? $user->lang['VIEW_FORUM_TOPIC'] : sprintf($user->lang['VIEW_FORUM_TOPICS'], $topics_count))
- );
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $this->u_action, $topics_count, $config['topics_per_page'], $start),
+ 'TOTAL_TOPICS' => $user->lang('VIEW_FORUM_TOPICS', (int) $topics_count),
+ ));
}
if ($mode == 'subscribed')
@@ -747,17 +757,19 @@ class ucp_main
{
foreach ($topic_forum_list as $f_id => $topic_row)
{
- $topic_tracking_info += get_topic_tracking($f_id, $topic_row['topics'], $rowset, array($f_id => $topic_row['forum_mark_time']), ($f_id == 0) ? $global_announce_list : false);
+ $topic_tracking_info += get_topic_tracking($f_id, $topic_row['topics'], $rowset, array($f_id => $topic_row['forum_mark_time']));
}
}
else
{
foreach ($topic_forum_list as $f_id => $topic_row)
{
- $topic_tracking_info += get_complete_topic_tracking($f_id, $topic_row['topics'], $global_announce_list);
+ $topic_tracking_info += get_complete_topic_tracking($f_id, $topic_row['topics']);
}
}
+ $phpbb_content_visibility = $phpbb_container->get('content.visibility');
+
foreach ($topic_list as $topic_id)
{
$row = &$rowset[$topic_id];
@@ -768,7 +780,7 @@ class ucp_main
$unread_topic = (isset($topic_tracking_info[$topic_id]) && $row['topic_last_post_time'] > $topic_tracking_info[$topic_id]) ? true : false;
// Replies
- $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
+ $replies = $phpbb_content_visibility->get_count('topic_posts', $row, $forum_id) - 1;
if ($row['topic_status'] == ITEM_MOVED && !empty($row['topic_moved_id']))
{
@@ -802,17 +814,15 @@ class ucp_main
'U_LAST_POST_AUTHOR' => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
'S_DELETED_TOPIC' => (!$row['topic_id']) ? true : false,
- 'S_GLOBAL_TOPIC' => (!$forum_id) ? true : false,
- 'PAGINATION' => topic_generate_pagination($replies, append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . (($row['forum_id']) ? $row['forum_id'] : $forum_id) . "&amp;t=$topic_id")),
'REPLIES' => $replies,
'VIEWS' => $row['topic_views'],
'TOPIC_TITLE' => censor_text($row['topic_title']),
'TOPIC_TYPE' => $topic_type,
'FORUM_NAME' => $row['forum_name'],
+ 'TOPIC_IMG_STYLE' => $folder_img,
'TOPIC_FOLDER_IMG' => $user->img($folder_img, $folder_alt),
- 'TOPIC_FOLDER_IMG_SRC' => $user->img($folder_img, $folder_alt, false, '', 'src'),
'TOPIC_FOLDER_IMG_ALT' => $user->lang[$folder_alt],
'TOPIC_ICON_IMG' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
'TOPIC_ICON_IMG_WIDTH' => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
@@ -828,8 +838,8 @@ class ucp_main
'U_VIEW_TOPIC' => $view_topic_url,
'U_VIEW_FORUM' => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
));
+
+ phpbb_generate_template_pagination($template, append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . "&amp;t=$topic_id"), 'topicrow.pagination', 'start', $replies + 1, $config['posts_per_page'], 1, true, true);
}
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_notifications.php b/phpBB/includes/ucp/ucp_notifications.php
new file mode 100644
index 0000000000..2f22f6cf9c
--- /dev/null
+++ b/phpBB/includes/ucp/ucp_notifications.php
@@ -0,0 +1,230 @@
+<?php
+/**
+*
+* @package notifications
+* @copyright (c) 2012 phpBB Group
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
+*
+*/
+
+/**
+* @ignore
+*/
+if (!defined('IN_PHPBB'))
+{
+ exit;
+}
+
+class ucp_notifications
+{
+ public $u_action;
+
+ public function main($id, $mode)
+ {
+ global $config, $template, $user, $request, $phpbb_container;
+ global $phpbb_root_path, $phpEx;
+
+ add_form_key('ucp_notification');
+
+ $start = $request->variable('start', 0);
+ $form_time = min($request->variable('form_time', 0), time());
+
+ $phpbb_notifications = $phpbb_container->get('notification_manager');
+
+ switch ($mode)
+ {
+ case 'notification_options':
+ $subscriptions = $phpbb_notifications->get_global_subscriptions(false);
+
+ // Add/remove subscriptions
+ if ($request->is_set_post('submit'))
+ {
+ if (!check_form_key('ucp_notification'))
+ {
+ trigger_error('FORM_INVALID');
+ }
+
+ $notification_methods = $phpbb_notifications->get_subscription_methods();
+
+ foreach($phpbb_notifications->get_subscription_types() as $group => $subscription_types)
+ {
+ foreach($subscription_types as $type => $data)
+ {
+ foreach($notification_methods as $method => $method_data)
+ {
+ if ($request->is_set_post($type . '_' . $method_data['id']) && (!isset($subscriptions[$type]) || !in_array($method_data['id'], $subscriptions[$type])))
+ {
+ $phpbb_notifications->add_subscription($type, 0, $method_data['id']);
+ }
+ else if (!$request->is_set_post($type . '_' . $method_data['id']) && isset($subscriptions[$type]) && in_array($method_data['id'], $subscriptions[$type]))
+ {
+ $phpbb_notifications->delete_subscription($type, 0, $method_data['id']);
+ }
+ }
+
+ if ($request->is_set_post($type . '_notification') && !isset($subscriptions[$type]))
+ {
+ $phpbb_notifications->add_subscription($type);
+ }
+ else if (!$request->is_set_post($type . '_notification') && isset($subscriptions[$type]))
+ {
+ $phpbb_notifications->delete_subscription($type);
+ }
+ }
+ }
+
+ meta_refresh(3, $this->u_action);
+ $message = $user->lang['PREFERENCES_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ trigger_error($message);
+ }
+
+ $this->output_notification_methods('notification_methods', $phpbb_notifications, $template, $user);
+
+ $this->output_notification_types($subscriptions, 'notification_types', $phpbb_notifications, $template, $user);
+
+ $this->tpl_name = 'ucp_notifications';
+ $this->page_title = 'UCP_NOTIFICATION_OPTIONS';
+ break;
+
+ case 'notification_list':
+ default:
+ // Mark all items read
+ if ($request->variable('mark', '') == 'all' && (confirm_box(true) || check_link_hash($request->variable('token', ''), 'mark_all_notifications_read')))
+ {
+ if (confirm_box(true))
+ {
+ $phpbb_notifications->mark_notifications_read(false, false, $user->data['user_id'], $form_time);
+
+ meta_refresh(3, $this->u_action);
+ $message = $user->lang['NOTIFICATIONS_MARK_ALL_READ_SUCCESS'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ trigger_error($message);
+ }
+ else
+ {
+ confirm_box(false, 'NOTIFICATIONS_MARK_ALL_READ', build_hidden_fields(array(
+ 'mark' => 'all',
+ 'form_time' => $form_time,
+ )));
+ }
+ }
+
+ // Mark specific notifications read
+ if ($request->is_set_post('submit'))
+ {
+ if (!check_form_key('ucp_notification'))
+ {
+ trigger_error('FORM_INVALID');
+ }
+
+ $mark_read = $request->variable('mark', array(0));
+
+ if (!empty($mark_read))
+ {
+ $phpbb_notifications->mark_notifications_read_by_id($mark_read, $form_time);
+ }
+ }
+
+ $notifications = $phpbb_notifications->load_notifications(array(
+ 'start' => $start,
+ 'limit' => $config['topics_per_page'],
+ 'count_total' => true,
+ ));
+
+ foreach ($notifications['notifications'] as $notification)
+ {
+ $template->assign_block_vars('notification_list', $notification->prepare_for_display());
+ }
+
+ $base_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=ucp_notifications&amp;mode=notification_list");
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $notifications['total_count'], $config['topics_per_page'], $start);
+
+ $template->assign_vars(array(
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $notifications['total_count'], $config['topics_per_page'], $start),
+ 'TOTAL_COUNT' => $user->lang('NOTIFICATIONS_COUNT', $notifications['total_count']),
+ 'U_MARK_ALL' => $base_url . '&amp;mark=all&amp;token=' . generate_link_hash('mark_all_notifications_read'),
+ ));
+
+ $this->tpl_name = 'ucp_notifications';
+ $this->page_title = 'UCP_NOTIFICATION_LIST';
+ break;
+ }
+
+ $template->assign_vars(array(
+ 'TITLE' => $user->lang($this->page_title),
+ 'TITLE_EXPLAIN' => $user->lang($this->page_title . '_EXPLAIN'),
+
+ 'MODE' => $mode,
+
+ 'FORM_TIME' => time(),
+ ));
+ }
+
+ /**
+ * Output all the notification types to the template
+ *
+ * @param string $block
+ * @param \phpbb\notification\manager $phpbb_notifications
+ * @param \phpbb\template\template $template
+ * @param \phpbb\user $user
+ */
+ public function output_notification_types($subscriptions, $block = 'notification_types', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user)
+ {
+ $notification_methods = $phpbb_notifications->get_subscription_methods();
+
+ foreach($phpbb_notifications->get_subscription_types() as $group => $subscription_types)
+ {
+ $template->assign_block_vars($block, array(
+ 'GROUP_NAME' => $user->lang($group),
+ ));
+
+ foreach($subscription_types as $type => $data)
+ {
+ $template->assign_block_vars($block, array(
+ 'TYPE' => $type,
+
+ 'NAME' => $user->lang($data['lang']),
+ 'EXPLAIN' => (isset($user->lang[$data['lang'] . '_EXPLAIN'])) ? $user->lang($data['lang'] . '_EXPLAIN') : '',
+
+ 'SUBSCRIBED' => (isset($subscriptions[$type])) ? true : false,
+ ));
+
+ foreach($notification_methods as $method => $method_data)
+ {
+ $template->assign_block_vars($block . '.notification_methods', array(
+ 'METHOD' => $method_data['id'],
+
+ 'NAME' => $user->lang($method_data['lang']),
+
+ 'SUBSCRIBED' => (isset($subscriptions[$type]) && in_array($method_data['id'], $subscriptions[$type])) ? true : false,
+ ));
+ }
+ }
+ }
+
+ $template->assign_vars(array(
+ strtoupper($block) . '_COLS' => sizeof($notification_methods) + 2,
+ ));
+ }
+
+ /**
+ * Output all the notification methods to the template
+ *
+ * @param string $block
+ * @param \phpbb\notification\manager $phpbb_notifications
+ * @param \phpbb\template\template $template
+ * @param \phpbb\user $user
+ */
+ public function output_notification_methods($block = 'notification_methods', \phpbb\notification\manager $phpbb_notifications, \phpbb\template\template $template, \phpbb\user $user)
+ {
+ $notification_methods = $phpbb_notifications->get_subscription_methods();
+
+ foreach($notification_methods as $method => $method_data)
+ {
+ $template->assign_block_vars($block, array(
+ 'METHOD' => $method_data['id'],
+
+ 'NAME' => $user->lang($method_data['lang']),
+ ));
+ }
+ }
+}
diff --git a/phpBB/includes/ucp/ucp_pm.php b/phpBB/includes/ucp/ucp_pm.php
index 447b6ebe87..d4ce8e41ee 100644
--- a/phpBB/includes/ucp/ucp_pm.php
+++ b/phpBB/includes/ucp/ucp_pm.php
@@ -1,9 +1,8 @@
<?php
/**
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -345,8 +344,8 @@ class ucp_pm
'NUM_NOT_MOVED' => $num_not_moved,
'NUM_REMOVED' => $num_removed,
'RELEASE_MESSAGE_INFO' => sprintf($user->lang['RELEASE_MESSAGES'], '<a href="' . $this->u_action . '&amp;folder=' . $folder_id . '&amp;release=1">', '</a>'),
- 'NOT_MOVED_MESSAGES' => ($num_not_moved == 1) ? $user->lang['NOT_MOVED_MESSAGE'] : sprintf($user->lang['NOT_MOVED_MESSAGES'], $num_not_moved),
- 'RULE_REMOVED_MESSAGES' => ($num_removed == 1) ? $user->lang['RULE_REMOVED_MESSAGE'] : sprintf($user->lang['RULE_REMOVED_MESSAGES'], $num_removed),
+ 'NOT_MOVED_MESSAGES' => $user->lang('NOT_MOVED_MESSAGES', (int) $num_not_moved),
+ 'RULE_REMOVED_MESSAGES' => $user->lang('RULE_REMOVED_MESSAGES', (int) $num_removed),
'S_FOLDER_OPTIONS' => $s_folder_options,
'S_TO_FOLDER_OPTIONS' => $s_to_folder_options,
@@ -412,5 +411,3 @@ class ucp_pm
$this->page_title = 'UCP_PM_' . strtoupper($mode);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_pm_compose.php b/phpBB/includes/ucp/ucp_pm_compose.php
index d7509a1072..e0e7a46494 100644
--- a/phpBB/includes/ucp/ucp_pm_compose.php
+++ b/phpBB/includes/ucp/ucp_pm_compose.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -24,6 +23,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
{
global $template, $db, $auth, $user;
global $phpbb_root_path, $phpEx, $config;
+ global $request;
// Damn php and globals - i know, this is horrible
// Needed for handle_message_list_actions()
@@ -49,13 +49,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
// Reply to all triggered (quote/reply)
$reply_to_all = request_var('reply_to_all', 0);
- // Do NOT use request_var or specialchars here
- $address_list = isset($_REQUEST['address_list']) ? $_REQUEST['address_list'] : array();
-
- if (!is_array($address_list))
- {
- $address_list = array();
- }
+ $address_list = $request->variable('address_list', array('' => array(0 => '')));
$submit = (isset($_POST['post'])) ? true : false;
$preview = (isset($_POST['preview'])) ? true : false;
@@ -841,11 +835,11 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$post_id = request_var('p', 0);
if ($config['allow_post_links'])
{
- $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}: {$message_subject}[/url]\n\n";
+ $message_link = "[url=" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id}]{$user->lang['SUBJECT']}{$user->lang['COLON']} {$message_subject}[/url]\n\n";
}
else
{
- $message_link = $user->lang['SUBJECT'] . ': ' . $message_subject . " (" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id})\n\n";
+ $message_link = $user->lang['SUBJECT'] . $user->lang['COLON'] . ' ' . $message_subject . " (" . generate_board_url() . "/viewtopic.$phpEx?p={$post_id}#p{$post_id})\n\n";
}
}
else
@@ -878,7 +872,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$forward_text[] = sprintf($user->lang['FWD_SUBJECT'], censor_text($message_subject));
$forward_text[] = sprintf($user->lang['FWD_DATE'], $user->format_date($message_time, false, true));
$forward_text[] = sprintf($user->lang['FWD_FROM'], $quote_username_text);
- $forward_text[] = sprintf($user->lang['FWD_TO'], implode(', ', $fwd_to_field['to']));
+ $forward_text[] = sprintf($user->lang['FWD_TO'], implode($user->lang['COMMA_SEPARATOR'], $fwd_to_field['to']));
$message_parser->message = implode("\n", $forward_text) . "\n\n[quote=&quot;{$quote_username}&quot;]\n" . censor_text(trim($message_parser->message)) . "\n[/quote]";
$message_subject = ((!preg_match('/^Fwd:/', $message_subject)) ? 'Fwd: ' : '') . censor_text($message_subject);
@@ -1048,7 +1042,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$s_hidden_fields = '<input type="hidden" name="lastclick" value="' . $current_time . '" />';
$s_hidden_fields .= (isset($check_value)) ? '<input type="hidden" name="status_switch" value="' . $check_value . '" />' : '';
- $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . ((isset($_REQUEST['draft_loaded'])) ? intval($_REQUEST['draft_loaded']) : $draft_id) . '" />' : '';
+ $s_hidden_fields .= ($draft_id || isset($_REQUEST['draft_loaded'])) ? '<input type="hidden" name="draft_loaded" value="' . ((isset($_REQUEST['draft_loaded'])) ? $request->variable('draft_loaded', 0) : $draft_id) . '" />' : '';
$form_enctype = (@ini_get('file_uploads') == '0' || strtolower(@ini_get('file_uploads')) == 'off' || !$config['allow_pm_attach'] || !$auth->acl_get('u_pm_attach')) ? '' : ' enctype="multipart/form-data"';
@@ -1056,7 +1050,7 @@ function compose_pm($id, $mode, $action, $user_folders = array())
$template->assign_vars(array(
'L_POST_A' => $page_title,
'L_ICON' => $user->lang['PM_ICON'],
- 'L_MESSAGE_BODY_EXPLAIN' => (intval($config['max_post_chars'])) ? sprintf($user->lang['MESSAGE_BODY_EXPLAIN'], intval($config['max_post_chars'])) : '',
+ 'L_MESSAGE_BODY_EXPLAIN' => $user->lang('MESSAGE_BODY_EXPLAIN', (int) $config['max_post_chars']),
'SUBJECT' => (isset($message_subject)) ? $message_subject : '',
'MESSAGE' => $message_text,
@@ -1124,11 +1118,12 @@ function compose_pm($id, $mode, $action, $user_folders = array())
function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove_g, $add_to, $add_bcc)
{
global $auth, $db, $user;
+ global $request;
// Delete User [TO/BCC]
- if ($remove_u && !empty($_REQUEST['remove_u']) && is_array($_REQUEST['remove_u']))
+ if ($remove_u && $request->variable('remove_u', array(0 => '')))
{
- $remove_user_id = array_keys($_REQUEST['remove_u']);
+ $remove_user_id = array_keys($request->variable('remove_u', array(0 => '')));
if (isset($remove_user_id[0]))
{
@@ -1137,9 +1132,9 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
}
// Delete Group [TO/BCC]
- if ($remove_g && !empty($_REQUEST['remove_g']) && is_array($_REQUEST['remove_g']))
+ if ($remove_g && $request->variable('remove_g', array(0 => '')))
{
- $remove_group_id = array_keys($_REQUEST['remove_g']);
+ $remove_group_id = array_keys($request->variable('remove_g', array(0 => '')));
if (isset($remove_group_id[0]))
{
@@ -1207,7 +1202,7 @@ function handle_message_list_actions(&$address_list, &$error, $remove_u, $remove
}
// Add Friends if specified
- $friend_list = (isset($_REQUEST['add_' . $type]) && is_array($_REQUEST['add_' . $type])) ? array_map('intval', array_keys($_REQUEST['add_' . $type])) : array();
+ $friend_list = array_keys($request->variable('add_' . $type, array(0)));
$user_id_ary = array_merge($user_id_ary, $friend_list);
foreach ($user_id_ary as $user_id)
@@ -1305,5 +1300,3 @@ function get_recipients($address_list, $num_recipients = 1)
return $recipient;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_pm_options.php b/phpBB/includes/ucp/ucp_pm_options.php
index efa390ed87..bf7334b307 100644
--- a/phpBB/includes/ucp/ucp_pm_options.php
+++ b/phpBB/includes/ucp/ucp_pm_options.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -231,7 +230,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
// Something went wrong, only partially moved?
if ($num_moved != $folder_row['pm_count'])
{
- trigger_error(sprintf($user->lang['MOVE_PM_ERROR'], $num_moved, $folder_row['pm_count']));
+ trigger_error($user->lang('MOVE_PM_ERROR', (int) $folder_row['pm_count'], $num_moved));
}
break;
@@ -422,7 +421,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
$folder[PRIVMSGS_INBOX] = array(
'folder_name' => $user->lang['PM_INBOX'],
- 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $num_messages, $user->data['message_limit'])
+ 'message_status' => $user->lang('FOLDER_MESSAGE_STATUS', (int) $user->data['message_limit'], $num_messages),
);
$sql = 'SELECT folder_id, folder_name, pm_count
@@ -436,7 +435,7 @@ function message_options($id, $mode, $global_privmsgs_rules, $global_rule_condit
$num_user_folder++;
$folder[$row['folder_id']] = array(
'folder_name' => $row['folder_name'],
- 'message_status' => sprintf($user->lang['FOLDER_MESSAGE_STATUS'], $row['pm_count'], $user->data['message_limit'])
+ 'message_status' => $user->lang('FOLDER_MESSAGE_STATUS', (int) $user->data['message_limit'], $row['pm_count']),
);
}
$db->sql_freeresult($result);
@@ -862,5 +861,3 @@ function show_defined_rules($user_id, $check_lang, $rule_lang, $action_lang, $fo
}
$db->sql_freeresult($result);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_pm_viewfolder.php b/phpBB/includes/ucp/ucp_pm_viewfolder.php
index bd7bf89854..625da23736 100644
--- a/phpBB/includes/ucp/ucp_pm_viewfolder.php
+++ b/phpBB/includes/ucp/ucp_pm_viewfolder.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -165,7 +164,7 @@ function view_folder($id, $mode, $folder_id, $folder)
'PM_ICON_IMG' => (!empty($icons[$row['icon_id']])) ? '<img src="' . $config['icons_path'] . '/' . $icons[$row['icon_id']]['img'] . '" width="' . $icons[$row['icon_id']]['width'] . '" height="' . $icons[$row['icon_id']]['height'] . '" alt="" title="" />' : '',
'PM_ICON_URL' => (!empty($icons[$row['icon_id']])) ? $config['icons_path'] . '/' . $icons[$row['icon_id']]['img'] : '',
'FOLDER_IMG' => $user->img($folder_img, $folder_alt),
- 'FOLDER_IMG_SRC' => $user->img($folder_img, $folder_alt, false, '', 'src'),
+ 'FOLDER_IMG_STYLE' => $folder_img,
'PM_IMG' => ($row_indicator) ? $user->img('pm_' . $row_indicator, '') : '',
'ATTACH_ICON_IMG' => ($auth->acl_get('u_pm_download') && $row['message_attachment'] && $config['allow_pm_attach']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
@@ -177,7 +176,7 @@ function view_folder($id, $mode, $folder_id, $folder)
'U_VIEW_PM' => ($row['pm_deleted']) ? '' : $view_message_url,
'U_REMOVE_PM' => ($row['pm_deleted']) ? $remove_message_url : '',
'U_MCP_REPORT' => (isset($row['report_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=pm_reports&amp;mode=pm_report_details&amp;r=' . $row['report_id']) : '',
- 'RECIPIENTS' => ($folder_id == PRIVMSGS_OUTBOX || $folder_id == PRIVMSGS_SENTBOX) ? implode(', ', $address_list[$message_id]) : '')
+ 'RECIPIENTS' => ($folder_id == PRIVMSGS_OUTBOX || $folder_id == PRIVMSGS_SENTBOX) ? implode($user->lang['COMMA_SEPARATOR'], $address_list[$message_id]) : '')
);
}
unset($folder_info['rowset']);
@@ -267,9 +266,9 @@ function view_folder($id, $mode, $folder_id, $folder)
}
}
- // There is the chance that all recipients of the message got deleted. To avoid creating
+ // There is the chance that all recipients of the message got deleted. To avoid creating
// exports without recipients, we add a bogus "undisclosed recipient".
- if (!(isset($address[$message_id]['g']) && sizeof($address[$message_id]['g'])) &&
+ if (!(isset($address[$message_id]['g']) && sizeof($address[$message_id]['g'])) &&
!(isset($address[$message_id]['u']) && sizeof($address[$message_id]['u'])))
{
$address[$message_id]['u'] = array();
@@ -278,12 +277,12 @@ function view_folder($id, $mode, $folder_id, $folder)
}
decode_message($message_row['message_text'], $message_row['bbcode_uid']);
-
+
$data[] = array(
'subject' => censor_text($row['message_subject']),
'sender' => $row['username'],
// ISO 8601 date. For PHP4 we are able to hardcode the timezone because $user->format_date() does not set it.
- 'date' => $user->format_date($row['message_time'], (PHP_VERSION >= 5) ? 'c' : "Y-m-d\TH:i:s+00:00", true),
+ 'date' => $user->format_date($row['message_time'], 'c', true),
'to' => ($folder_id == PRIVMSGS_OUTBOX || $folder_id == PRIVMSGS_SENTBOX) ? $address[$message_id] : '',
'message' => $message_row['message_text']
);
@@ -452,10 +451,12 @@ function get_pm_from($folder_id, $folder, $user_id)
$sql_limit_time = '';
}
+ $base_url = append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=view&amp;action=view_folder&amp;f=$folder_id&amp;$u_sort_param");
+ phpbb_generate_template_pagination($template, $base_url, 'pagination', 'start', $pm_count, $config['topics_per_page'], $start);
+
$template->assign_vars(array(
- 'PAGINATION' => generate_pagination(append_sid("{$phpbb_root_path}ucp.$phpEx", "i=pm&amp;mode=view&amp;action=view_folder&amp;f=$folder_id&amp;$u_sort_param"), $pm_count, $config['topics_per_page'], $start),
- 'PAGE_NUMBER' => on_page($pm_count, $config['topics_per_page'], $start),
- 'TOTAL_MESSAGES' => (($pm_count == 1) ? $user->lang['VIEW_PM_MESSAGE'] : sprintf($user->lang['VIEW_PM_MESSAGES'], $pm_count)),
+ 'PAGE_NUMBER' => phpbb_on_page($template, $user, $base_url, $pm_count, $config['topics_per_page'], $start),
+ 'TOTAL_MESSAGES' => $user->lang('VIEW_PM_MESSAGES', (int) $pm_count),
'POST_IMG' => (!$auth->acl_get('u_sendpm')) ? $user->img('button_topic_locked', 'POST_PM_LOCKED') : $user->img('button_pm_new', 'POST_NEW_PM'),
@@ -552,5 +553,3 @@ function get_pm_from($folder_id, $folder, $user_id)
'rowset' => $rowset
);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php
index 82a095dd9c..c7b4489daf 100644
--- a/phpBB/includes/ucp/ucp_pm_viewmessage.php
+++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -22,7 +21,7 @@ if (!defined('IN_PHPBB'))
function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
{
global $user, $template, $auth, $db, $cache;
- global $phpbb_root_path, $phpEx, $config;
+ global $phpbb_root_path, $request, $phpEx, $config, $phpbb_dispatcher;
$user->add_lang(array('viewtopic', 'memberlist'));
@@ -59,23 +58,26 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
$bbcode = new bbcode($message_row['bbcode_bitfield']);
}
+ // Load the custom profile fields
+ if ($config['load_cpf_pm'])
+ {
+ if (!class_exists('custom_profile'))
+ {
+ include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
+ }
+ $cp = new custom_profile();
+
+ $profile_fields = $cp->generate_profile_fields_template('grab', $author_id);
+ }
+
// Assign TO/BCC Addresses to template
write_pm_addresses(array('to' => $message_row['to_address'], 'bcc' => $message_row['bcc_address']), $author_id);
$user_info = get_user_information($author_id, $message_row);
// Parse the message and subject
- $message = censor_text($message_row['message_text']);
-
- // Second parse bbcode here
- if ($message_row['bbcode_bitfield'])
- {
- $bbcode->bbcode_second_pass($message, $message_row['bbcode_uid'], $message_row['bbcode_bitfield']);
- }
-
- // Always process smilies after parsing bbcodes
- $message = bbcode_nl2br($message);
- $message = smiley_text($message);
+ $parse_flags = ($message_row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $message = generate_text_for_display($message_row['message_text'], $message_row['bbcode_uid'], $message_row['bbcode_bitfield'], $parse_flags, true);
// Replace naughty words such as farty pants
$message_row['message_subject'] = censor_text($message_row['message_subject']);
@@ -83,8 +85,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
// Editing information
if ($message_row['message_edit_count'] && $config['display_last_edited'])
{
- $l_edit_time_total = ($message_row['message_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL'];
- $l_edited_by = '<br /><br />' . sprintf($l_edit_time_total, (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time'], false, true), $message_row['message_edit_count']);
+ $l_edited_by = '<br /><br />' . $user->lang('EDITED_TIMES_TOTAL', (int) $message_row['message_edit_count'], (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time'], false, true));
}
else
{
@@ -150,21 +151,8 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
// End signature parsing, only if needed
if ($signature)
{
- $signature = censor_text($signature);
-
- if ($user_info['user_sig_bbcode_bitfield'])
- {
- if ($bbcode === false)
- {
- include($phpbb_root_path . 'includes/bbcode.' . $phpEx);
- $bbcode = new bbcode($user_info['user_sig_bbcode_bitfield']);
- }
-
- $bbcode->bbcode_second_pass($signature, $user_info['user_sig_bbcode_uid'], $user_info['user_sig_bbcode_bitfield']);
- }
-
- $signature = bbcode_nl2br($signature);
- $signature = smiley_text($signature);
+ $parse_flags = ($user_info['user_sig_bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
+ $signature = generate_text_for_display($signature, $user_info['user_sig_bbcode_uid'], $user_info['user_sig_bbcode_bitfield'], $parse_flags, true);
}
$url = append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=pm');
@@ -174,7 +162,26 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
$bbcode_status = ($config['allow_bbcode'] && $config['auth_bbcode_pm'] && $auth->acl_get('u_pm_bbcode')) ? true : false;
- $template->assign_vars(array(
+ // Get the profile fields template data
+ $cp_row = array();
+ if ($config['load_cpf_pm'] && isset($profile_fields[$author_id]))
+ {
+ // Filter the fields we don't want to show
+ foreach ($profile_fields[$author_id] as $used_ident => $profile_field)
+ {
+ if (!$profile_field['data']['field_show_on_pm'])
+ {
+ unset($profile_fields[$author_id][$used_ident]);
+ }
+ }
+
+ if (isset($profile_fields[$author_id]))
+ {
+ $cp_row = $cp->generate_profile_fields_template('show', false, $profile_fields[$author_id]);
+ }
+ }
+
+ $msg_data = array(
'MESSAGE_AUTHOR_FULL' => get_username_string('full', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']),
'MESSAGE_AUTHOR_COLOUR' => get_username_string('colour', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']),
'MESSAGE_AUTHOR' => get_username_string('username', $author_id, $user_info['username'], $user_info['user_colour'], $user_info['username']),
@@ -227,19 +234,57 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
'U_PM_ACTION' => $url . '&amp;mode=compose&amp;f=' . $folder_id . '&amp;p=' . $message_row['msg_id'],
'S_HAS_ATTACHMENTS' => (sizeof($attachments)) ? true : false,
+ 'S_HAS_MULTIPLE_ATTACHMENTS' => (sizeof($attachments) > 1),
'S_DISPLAY_NOTICE' => $display_notice && $message_row['message_attachment'],
'S_AUTHOR_DELETED' => ($author_id == ANONYMOUS) ? true : false,
'S_SPECIAL_FOLDER' => in_array($folder_id, array(PRIVMSGS_NO_BOX, PRIVMSGS_OUTBOX)),
'S_PM_RECIPIENTS' => $num_recipients,
'S_BBCODE_ALLOWED' => ($bbcode_status) ? 1 : 0,
+ 'S_CUSTOM_FIELDS' => (!empty($cp_row['row'])) ? true : false,
'U_PRINT_PM' => ($config['print_pm'] && $auth->acl_get('u_pm_printpm')) ? "$url&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] . "&amp;view=print" : '',
- 'U_FORWARD_PM' => ($config['forward_pm'] && $auth->acl_get('u_sendpm') && $auth->acl_get('u_pm_forward')) ? "$url&amp;mode=compose&amp;action=forward&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '')
+ 'U_FORWARD_PM' => ($config['forward_pm'] && $auth->acl_get('u_sendpm') && $auth->acl_get('u_pm_forward')) ? "$url&amp;mode=compose&amp;action=forward&amp;f=$folder_id&amp;p=" . $message_row['msg_id'] : '',
);
+ /**
+ * Modify pm and sender data before it is assigned to the template
+ *
+ * @event core.ucp_pm_view_messsage
+ * @var mixed id Active module category (can be int or string)
+ * @var string mode Active module
+ * @var int folder_id ID of the folder the message is in
+ * @var int msg_id ID of the private message
+ * var array folder Array with data of user's message folders
+ * @var array message_row Array with message data
+ * @var array cp_row Array with senders custom profile field data
+ * @var array msg_data Template array with message data
+ * @since 3.1-A1
+ */
+ $vars = array('id', 'mode', 'folder_id', 'msg_id', 'folder', 'message_row', 'cp_row', 'msg_data');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_pm_view_messsage', compact($vars)));
+
+ $template->assign_vars($msg_data);
+
+ // Display the custom profile fields
+ if (!empty($cp_row['row']))
+ {
+ $template->assign_vars($cp_row['row']);
+
+ foreach ($cp_row['blockrow'] as $cp_block_row)
+ {
+ $template->assign_block_vars('custom_fields', $cp_block_row);
+ }
+ }
+
// Display not already displayed Attachments for this post, we already parsed them. ;)
if (isset($attachments) && sizeof($attachments))
{
+ $methods = phpbb_gen_download_links('post_msg_id', $msg_id, $phpbb_root_path, $phpEx);
+ foreach ($methods as $method)
+ {
+ $template->assign_block_vars('dl_method', $method);
+ }
+
foreach ($attachments as $attachment)
{
$template->assign_block_vars('attachment', array(
@@ -248,7 +293,7 @@ function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row)
}
}
- if (!isset($_REQUEST['view']) || $_REQUEST['view'] != 'print')
+ if (!isset($_REQUEST['view']) || $request->variable('view', '') != 'print')
{
// Message History
if (message_history($msg_id, $user->data['user_id'], $message_row, $folder))
@@ -303,12 +348,12 @@ function get_user_information($user_id, $user_row)
}
}
- if (!function_exists('get_user_avatar'))
+ if (!function_exists('phpbb_get_user_avatar'))
{
include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
}
- $user_row['avatar'] = ($user->optionget('viewavatars')) ? get_user_avatar($user_row['user_avatar'], $user_row['user_avatar_type'], $user_row['user_avatar_width'], $user_row['user_avatar_height']) : '';
+ $user_row['avatar'] = ($user->optionget('viewavatars')) ? phpbb_get_user_avatar($user_row) : '';
get_user_rank($user_row['user_rank'], $user_row['user_posts'], $user_row['rank_title'], $user_row['rank_image'], $user_row['rank_image_src']);
@@ -319,5 +364,3 @@ function get_user_information($user_id, $user_row)
return $user_row;
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_prefs.php b/phpBB/includes/ucp/ucp_prefs.php
index c6e43b831c..e80cc2dce3 100644
--- a/phpBB/includes/ucp/ucp_prefs.php
+++ b/phpBB/includes/ucp/ucp_prefs.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -27,7 +26,7 @@ class ucp_prefs
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $config, $db, $user, $auth, $template, $phpbb_dispatcher, $phpbb_root_path, $phpEx;
$submit = (isset($_POST['submit'])) ? true : false;
$error = $data = array();
@@ -42,14 +41,11 @@ class ucp_prefs
'dateformat' => request_var('dateformat', $user->data['user_dateformat'], true),
'lang' => basename(request_var('lang', $user->data['user_lang'])),
'style' => request_var('style', (int) $user->data['user_style']),
- 'tz' => request_var('tz', (float) $user->data['user_timezone']),
+ 'tz' => request_var('tz', $user->data['user_timezone']),
- 'dst' => request_var('dst', (bool) $user->data['user_dst']),
'viewemail' => request_var('viewemail', (bool) $user->data['user_allow_viewemail']),
'massemail' => request_var('massemail', (bool) $user->data['user_allow_massemail']),
'hideonline' => request_var('hideonline', (bool) !$user->data['user_allow_viewonline']),
- 'notifypm' => request_var('notifypm', (bool) $user->data['user_notify_pm']),
- 'popuppm' => request_var('popuppm', (bool) $user->optionget('popuppm')),
'allowpm' => request_var('allowpm', (bool) $user->data['user_allow_pm']),
);
@@ -59,6 +55,20 @@ class ucp_prefs
$data['notifymethod'] = NOTIFY_BOTH;
}
+ /**
+ * Add UCP edit global settings data before they are assigned to the template or submitted
+ *
+ * To assign data to the template, use $template->assign_vars()
+ *
+ * @event core.ucp_prefs_personal_data
+ * @var bool submit Do we display the form only
+ * or did the user press submit
+ * @var array data Array with current ucp options data
+ * @since 3.1-A1
+ */
+ $vars = array('submit', 'data');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_data', compact($vars)));
+
if ($submit)
{
if ($config['override_user_style'])
@@ -73,7 +83,7 @@ class ucp_prefs
$error = validate_data($data, array(
'dateformat' => array('string', false, 1, 30),
'lang' => array('language_iso_name'),
- 'tz' => array('num', false, -14, 14),
+ 'tz' => array('timezone'),
));
if (!check_form_key('ucp_prefs_personal'))
@@ -83,24 +93,31 @@ class ucp_prefs
if (!sizeof($error))
{
- $user->optionset('popuppm', $data['popuppm']);
-
$sql_ary = array(
'user_allow_pm' => $data['allowpm'],
'user_allow_viewemail' => $data['viewemail'],
'user_allow_massemail' => $data['massemail'],
'user_allow_viewonline' => ($auth->acl_get('u_hideonline')) ? !$data['hideonline'] : $user->data['user_allow_viewonline'],
'user_notify_type' => $data['notifymethod'],
- 'user_notify_pm' => $data['notifypm'],
'user_options' => $user->data['user_options'],
- 'user_dst' => $data['dst'],
'user_dateformat' => $data['dateformat'],
'user_lang' => $data['lang'],
'user_timezone' => $data['tz'],
'user_style' => $data['style'],
);
+ /**
+ * Update UCP edit global settings data on form submit
+ *
+ * @event core.ucp_prefs_personal_update_data
+ * @var array data Submitted display options data
+ * @var array sql_ary Display options data we udpate
+ * @since 3.1-A1
+ */
+ $vars = array('data', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_personal_update_data', compact($vars)));
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@@ -112,7 +129,7 @@ class ucp_prefs
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
}
$dateformat_options = '';
@@ -134,6 +151,8 @@ class ucp_prefs
}
$dateformat_options .= '>' . $user->lang['CUSTOM_DATEFORMAT'] . '</option>';
+ $timezone_selects = phpbb_timezone_select($user, $data['tz'], true);
+
// check if there are any user-selectable languages
$sql = 'SELECT COUNT(lang_id) as languages_count
FROM ' . LANG_TABLE;
@@ -173,9 +192,6 @@ class ucp_prefs
'S_MASS_EMAIL' => $data['massemail'],
'S_ALLOW_PM' => $data['allowpm'],
'S_HIDE_ONLINE' => $data['hideonline'],
- 'S_NOTIFY_PM' => $data['notifypm'],
- 'S_POPUP_PM' => $data['popuppm'],
- 'S_DST' => $data['dst'],
'DATE_FORMAT' => $data['dateformat'],
'A_DATE_FORMAT' => addslashes($data['dateformat']),
@@ -189,7 +205,8 @@ class ucp_prefs
'S_LANG_OPTIONS' => language_select($data['lang']),
'S_STYLE_OPTIONS' => ($config['override_user_style']) ? '' : style_select($data['style']),
- 'S_TZ_OPTIONS' => tz_select($data['tz'], true),
+ 'S_TZ_OPTIONS' => $timezone_selects['tz_select'],
+ 'S_TZ_DATE_OPTIONS' => $timezone_selects['tz_dates'],
'S_CAN_HIDE_ONLINE' => ($auth->acl_get('u_hideonline')) ? true : false,
'S_SELECT_NOTIFY' => ($config['jab_enable'] && $user->data['user_jabber'] && @extension_loaded('xml')) ? true : false)
);
@@ -217,6 +234,20 @@ class ucp_prefs
'wordcensor' => request_var('wordcensor', (bool) $user->optionget('viewcensors')),
);
+ /**
+ * Add UCP edit display options data before they are assigned to the template or submitted
+ *
+ * To assign data to the template, use $template->assign_vars()
+ *
+ * @event core.ucp_prefs_view_data
+ * @var bool submit Do we display the form only
+ * or did the user press submit
+ * @var array data Array with current ucp options data
+ * @since 3.1-A1
+ */
+ $vars = array('submit', 'data');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_data', compact($vars)));
+
if ($submit)
{
$error = validate_data($data, array(
@@ -255,6 +286,17 @@ class ucp_prefs
'user_post_show_days' => $data['post_st'],
);
+ /**
+ * Update UCP edit display options data on form submit
+ *
+ * @event core.ucp_prefs_view_update_data
+ * @var array data Submitted display options data
+ * @var array sql_ary Display options data we udpate
+ * @since 3.1-A1
+ */
+ $vars = array('data', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_view_update_data', compact($vars)));
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@@ -266,7 +308,7 @@ class ucp_prefs
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
}
$sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
@@ -275,7 +317,7 @@ class ucp_prefs
$limit_topic_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
$sort_by_topic_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
- $sort_by_topic_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => 't.topic_replies', 's' => 't.topic_title', 'v' => 't.topic_views');
+ $sort_by_topic_sql = array('a' => 't.topic_first_poster_name', 't' => 't.topic_last_post_time', 'r' => 't.topic_posts_approved', 's' => 't.topic_title', 'v' => 't.topic_views');
// Post ordering options
$limit_post_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
@@ -343,6 +385,20 @@ class ucp_prefs
);
add_form_key('ucp_prefs_post');
+ /**
+ * Add UCP edit posting defaults data before they are assigned to the template or submitted
+ *
+ * To assign data to the template, use $template->assign_vars()
+ *
+ * @event core.ucp_prefs_post_data
+ * @var bool submit Do we display the form only
+ * or did the user press submit
+ * @var array data Array with current ucp options data
+ * @since 3.1-A1
+ */
+ $vars = array('submit', 'data');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_data', compact($vars)));
+
if ($submit)
{
if (check_form_key('ucp_prefs_post'))
@@ -356,6 +412,17 @@ class ucp_prefs
'user_notify' => $data['notify'],
);
+ /**
+ * Update UCP edit posting defaults data on form submit
+ *
+ * @event core.ucp_prefs_post_update_data
+ * @var array data Submitted display options data
+ * @var array sql_ary Display options data we udpate
+ * @since 3.1-A1
+ */
+ $vars = array('data', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_prefs_post_update_data', compact($vars)));
+
$sql = 'UPDATE ' . USERS_TABLE . '
SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
WHERE user_id = ' . $user->data['user_id'];
@@ -392,5 +459,3 @@ class ucp_prefs
$this->page_title = 'UCP_PREFS_' . strtoupper($mode);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_profile.php b/phpBB/includes/ucp/ucp_profile.php
index 847311058b..8ae7acaa11 100644
--- a/phpBB/includes/ucp/ucp_profile.php
+++ b/phpBB/includes/ucp/ucp_profile.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -29,13 +28,15 @@ class ucp_profile
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $cache, $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $request;
+ global $phpbb_container;
$user->add_lang('posting');
- $preview = (!empty($_POST['preview'])) ? true : false;
- $submit = (!empty($_POST['submit'])) ? true : false;
- $delete = (!empty($_POST['delete'])) ? true : false;
+ $preview = $request->variable('preview', false, false, \phpbb\request\request_interface::POST);
+ $submit = $request->variable('submit', false, false, \phpbb\request\request_interface::POST);
+ $delete = $request->variable('delete', false, false, \phpbb\request\request_interface::POST);
$error = $data = array();
$s_hidden_fields = '';
@@ -46,10 +47,9 @@ class ucp_profile
$data = array(
'username' => utf8_normalize_nfc(request_var('username', $user->data['username'], true)),
'email' => strtolower(request_var('email', $user->data['user_email'])),
- 'email_confirm' => strtolower(request_var('email_confirm', '')),
- 'new_password' => request_var('new_password', '', true),
- 'cur_password' => request_var('cur_password', '', true),
- 'password_confirm' => request_var('password_confirm', '', true),
+ 'new_password' => $request->variable('new_password', '', true),
+ 'cur_password' => $request->variable('cur_password', '', true),
+ 'password_confirm' => $request->variable('password_confirm', '', true),
);
add_form_key('ucp_reg_details');
@@ -65,7 +65,6 @@ class ucp_profile
'email' => array(
array('string', false, 6, 60),
array('email')),
- 'email_confirm' => array('string', true, 6, 60),
);
if ($auth->acl_get('u_chgname') && $config['allow_namechange'])
@@ -78,11 +77,6 @@ class ucp_profile
$error = validate_data($data, $check_ary);
- if ($auth->acl_get('u_chgemail') && $data['email'] != $user->data['user_email'] && $data['email_confirm'] != $data['email'])
- {
- $error[] = ($data['email_confirm']) ? 'NEW_EMAIL_ERROR' : 'NEW_EMAIL_CONFIRM_EMPTY';
- }
-
if ($auth->acl_get('u_chgpasswd') && $data['new_password'] && $data['password_confirm'] != $data['new_password'])
{
$error[] = ($data['password_confirm']) ? 'NEW_PASSWORD_ERROR' : 'NEW_PASSWORD_CONFIRM_EMPTY';
@@ -181,8 +175,7 @@ class ucp_profile
while ($row = $db->sql_fetchrow($result))
{
$messenger->template('admin_activate', $row['user_lang']);
- $messenger->to($row['user_email'], $row['username']);
- $messenger->im($row['user_jabber'], $row['username']);
+ $messenger->set_addresses($row);
$messenger->assign_vars(array(
'USERNAME' => htmlspecialchars_decode($data['username']),
@@ -235,7 +228,7 @@ class ucp_profile
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
}
$template->assign_vars(array(
@@ -247,8 +240,8 @@ class ucp_profile
'NEW_PASSWORD' => $data['new_password'],
'CUR_PASSWORD' => '',
- 'L_USERNAME_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']),
- 'L_CHANGE_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']),
+ 'L_USERNAME_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])),
+ 'L_CHANGE_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])),
'S_FORCE_PASSWORD' => ($auth->acl_get('u_chgpasswd') && $config['chg_passforce'] && $user->data['user_passchg'] < time() - ($config['chg_passforce'] * 86400)) ? true : false,
'S_CHANGE_USERNAME' => ($config['allow_namechange'] && $auth->acl_get('u_chgname')) ? true : false,
@@ -258,6 +251,11 @@ class ucp_profile
break;
case 'profile_info':
+ // Do not display profile information panel if not authed to do so
+ if (!$auth->acl_get('u_chgprofileinfo'))
+ {
+ trigger_error('NO_AUTH_PROFILEINFO');
+ }
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
@@ -382,7 +380,7 @@ class ucp_profile
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
}
if ($config['allow_birthdays'])
@@ -507,7 +505,7 @@ class ucp_profile
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
}
$signature_preview = '';
@@ -536,7 +534,7 @@ class ucp_profile
'URL_STATUS' => ($config['allow_sig_links']) ? $user->lang['URL_IS_ON'] : $user->lang['URL_IS_OFF'],
'MAX_FONT_SIZE' => (int) $config['max_sig_font_size'],
- 'L_SIGNATURE_EXPLAIN' => sprintf($user->lang['SIGNATURE_EXPLAIN'], $config['max_sig_chars']),
+ 'L_SIGNATURE_EXPLAIN' => $user->lang('SIGNATURE_EXPLAIN', (int) $config['max_sig_chars']),
'S_BBCODE_ALLOWED' => $config['allow_sig_bbcode'],
'S_SMILIES_ALLOWED' => $config['allow_sig_smilies'],
@@ -554,79 +552,184 @@ class ucp_profile
break;
case 'avatar':
+ if (!function_exists('phpbb_get_user_avatar'))
+ {
+ include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ }
- include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
+ add_form_key('ucp_avatar');
- $display_gallery = request_var('display_gallery', '0');
- $avatar_select = basename(request_var('avatar_select', ''));
- $category = basename(request_var('category', ''));
+ $avatars_enabled = false;
- $can_upload = (file_exists($phpbb_root_path . $config['avatar_path']) && phpbb_is_writable($phpbb_root_path . $config['avatar_path']) && $auth->acl_get('u_chgavatar') && (@ini_get('file_uploads') || strtolower(@ini_get('file_uploads')) == 'on')) ? true : false;
+ if ($config['allow_avatar'] && $auth->acl_get('u_chgavatar'))
+ {
+ $phpbb_avatar_manager = $phpbb_container->get('avatar.manager');
+ $avatar_drivers = $phpbb_avatar_manager->get_enabled_drivers();
- add_form_key('ucp_avatar');
+ // This is normalised data, without the user_ prefix
+ $avatar_data = \phpbb\avatar\manager::clean_row($user->data);
- if ($submit)
- {
- if (check_form_key('ucp_avatar'))
+ if ($submit)
{
- if (avatar_process_user($error, false, $can_upload))
+ if (check_form_key('ucp_avatar'))
{
- meta_refresh(3, $this->u_action);
- $message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
- trigger_error($message);
+ $driver_name = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', ''));
+
+ if (in_array($driver_name, $avatar_drivers) && !$request->is_set_post('avatar_delete'))
+ {
+ $driver = $phpbb_avatar_manager->get_driver($driver_name);
+ $result = $driver->process_form($request, $template, $user, $avatar_data, $error);
+
+ if ($result && empty($error))
+ {
+ // Success! Lets save the result in the database
+ $result = array(
+ 'user_avatar_type' => $driver_name,
+ 'user_avatar' => $result['avatar'],
+ 'user_avatar_width' => $result['avatar_width'],
+ 'user_avatar_height' => $result['avatar_height'],
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $result) . '
+ WHERE user_id = ' . (int) $user->data['user_id'];
+
+ $db->sql_query($sql);
+
+ meta_refresh(3, $this->u_action);
+ $message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ trigger_error($message);
+ }
+ }
+ else
+ {
+ if ($driver = $phpbb_avatar_manager->get_driver($user->data['user_avatar_type']))
+ {
+ $driver->delete($avatar_data);
+ }
+
+ $result = array(
+ 'user_avatar' => '',
+ 'user_avatar_type' => '',
+ 'user_avatar_width' => 0,
+ 'user_avatar_height' => 0,
+ );
+
+ $sql = 'UPDATE ' . USERS_TABLE . '
+ SET ' . $db->sql_build_array('UPDATE', $result) . '
+ WHERE user_id = ' . (int) $user->data['user_id'];
+
+ $db->sql_query($sql);
+
+ meta_refresh(3, $this->u_action);
+ $message = $user->lang['PROFILE_UPDATED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ trigger_error($message);
+ }
+ }
+ else
+ {
+ $error[] = 'FORM_INVALID';
}
}
- else
+
+ $selected_driver = $phpbb_avatar_manager->clean_driver_name($request->variable('avatar_driver', $user->data['user_avatar_type']));
+
+ foreach ($avatar_drivers as $current_driver)
{
- $error[] = 'FORM_INVALID';
+ $driver = $phpbb_avatar_manager->get_driver($current_driver);
+
+ $avatars_enabled = true;
+ $template->set_filenames(array(
+ 'avatar' => $driver->get_template_name(),
+ ));
+
+ if ($driver->prepare_form($request, $template, $user, $avatar_data, $error))
+ {
+ $driver_name = $phpbb_avatar_manager->prepare_driver_name($current_driver);
+ $driver_upper = strtoupper($driver_name);
+
+ $template->assign_block_vars('avatar_drivers', array(
+ 'L_TITLE' => $user->lang($driver_upper . '_TITLE'),
+ 'L_EXPLAIN' => $user->lang($driver_upper . '_EXPLAIN'),
+
+ 'DRIVER' => $driver_name,
+ 'SELECTED' => $current_driver == $selected_driver,
+ 'OUTPUT' => $template->assign_display('avatar'),
+ ));
+ }
}
- // Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
}
- if (!$config['allow_avatar'] && $user->data['user_avatar_type'])
- {
- $error[] = $user->lang['AVATAR_NOT_ALLOWED'];
- }
- else if ((($user->data['user_avatar_type'] == AVATAR_UPLOAD) && !$config['allow_avatar_upload']) ||
- (($user->data['user_avatar_type'] == AVATAR_REMOTE) && !$config['allow_avatar_remote']) ||
- (($user->data['user_avatar_type'] == AVATAR_GALLERY) && !$config['allow_avatar_local']))
- {
- $error[] = $user->lang['AVATAR_TYPE_NOT_ALLOWED'];
- }
+ // Replace "error" strings with their real, localised form
+ $error = $phpbb_avatar_manager->localize_errors($user, $error);
+
+ $avatar = phpbb_get_user_avatar($user->data, 'USER_AVATAR', true);
$template->assign_vars(array(
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
- 'AVATAR' => get_user_avatar($user->data['user_avatar'], $user->data['user_avatar_type'], $user->data['user_avatar_width'], $user->data['user_avatar_height'], 'USER_AVATAR', true),
- 'AVATAR_SIZE' => $config['avatar_filesize'],
+ 'AVATAR' => $avatar,
- 'U_GALLERY' => append_sid("{$phpbb_root_path}ucp.$phpEx", 'i=profile&amp;mode=avatar&amp;display_gallery=1'),
+ 'S_FORM_ENCTYPE' => ' enctype="multipart/form-data"',
- 'S_FORM_ENCTYPE' => ($can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) ? ' enctype="multipart/form-data"' : '',
+ 'L_AVATAR_EXPLAIN' => phpbb_avatar_explanation_string(),
- 'L_AVATAR_EXPLAIN' => sprintf($user->lang['AVATAR_EXPLAIN'], $config['avatar_max_width'], $config['avatar_max_height'], $config['avatar_filesize'] / 1024),
+ 'S_AVATARS_ENABLED' => ($config['allow_avatar'] && $avatars_enabled),
));
- if ($config['allow_avatar'] && $display_gallery && $auth->acl_get('u_chgavatar') && $config['allow_avatar_local'])
+ break;
+
+ case 'autologin_keys':
+
+ add_form_key('ucp_autologin_keys');
+
+ if ($submit)
{
- avatar_gallery($category, $avatar_select, 4);
+ $keys = request_var('keys', array(''));
+
+ if (!check_form_key('ucp_autologin_keys'))
+ {
+ $error[] = 'FORM_INVALID';
+ }
+
+ if (!sizeof($error))
+ {
+ if (!empty($keys))
+ {
+ $sql = 'DELETE FROM ' . SESSIONS_KEYS_TABLE . '
+ WHERE user_id = ' . (int) $user->data['user_id'] . '
+ AND ' . $db->sql_in_set('key_id', $keys) ;
+
+ $db->sql_query($sql);
+
+ meta_refresh(3, $this->u_action);
+ $message = $user->lang['AUTOLOGIN_SESSION_KEYS_DELETED'] . '<br /><br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
+ trigger_error($message);
+ }
+ }
+
+ // Replace "error" strings with their real, localised form
+ $error = array_map(array($user, 'lang'), $error);
}
- else if ($config['allow_avatar'])
+
+ $sql = 'SELECT key_id, last_ip, last_login
+ FROM ' . SESSIONS_KEYS_TABLE . '
+ WHERE user_id = ' . (int) $user->data['user_id'];
+
+ $result = $db->sql_query($sql);
+
+ while ($row = $db->sql_fetchrow($result))
{
- $avatars_enabled = (($can_upload && ($config['allow_avatar_upload'] || $config['allow_avatar_remote_upload'])) || ($auth->acl_get('u_chgavatar') && ($config['allow_avatar_local'] || $config['allow_avatar_remote']))) ? true : false;
+ $template->assign_block_vars('sessions', array(
+ 'errors' => $error,
- $template->assign_vars(array(
- 'AVATAR_WIDTH' => request_var('width', $user->data['user_avatar_width']),
- 'AVATAR_HEIGHT' => request_var('height', $user->data['user_avatar_height']),
-
- 'S_AVATARS_ENABLED' => $avatars_enabled,
- 'S_UPLOAD_AVATAR_FILE' => ($can_upload && $config['allow_avatar_upload']) ? true : false,
- 'S_UPLOAD_AVATAR_URL' => ($can_upload && $config['allow_avatar_remote_upload']) ? true : false,
- 'S_LINK_AVATAR' => ($auth->acl_get('u_chgavatar') && $config['allow_avatar_remote']) ? true : false,
- 'S_DISPLAY_GALLERY' => ($auth->acl_get('u_chgavatar') && $config['allow_avatar_local']) ? true : false)
- );
+ 'KEY' => $row['key_id'],
+ 'IP' => $row['last_ip'],
+ 'LOGIN_TIME' => $user->format_date($row['last_login']),
+ ));
}
+ $db->sql_freeresult($result);
+
break;
}
@@ -642,5 +745,3 @@ class ucp_profile
$this->page_title = 'UCP_PROFILE_' . strtoupper($mode);
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_register.php b/phpBB/includes/ucp/ucp_register.php
index 6ad3a55589..1f9ab23326 100644
--- a/phpBB/includes/ucp/ucp_register.php
+++ b/phpBB/includes/ucp/ucp_register.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -28,6 +27,7 @@ class ucp_register
function main($id, $mode)
{
global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $request, $phpbb_container;
//
if ($config['require_activation'] == USER_ACTIVATION_DISABLE)
@@ -37,9 +37,9 @@ class ucp_register
include($phpbb_root_path . 'includes/functions_profile_fields.' . $phpEx);
- $coppa = (isset($_REQUEST['coppa'])) ? ((!empty($_REQUEST['coppa'])) ? 1 : 0) : false;
- $agreed = (!empty($_POST['agreed'])) ? 1 : 0;
- $submit = (isset($_POST['submit'])) ? true : false;
+ $coppa = $request->is_set('coppa') ? (int) $request->variable('coppa', false) : false;
+ $agreed = $request->variable('agreed', false);
+ $submit = $request->is_set_post('submit');
$change_lang = request_var('change_lang', '');
$user_lang = request_var('lang', $user->lang_name);
@@ -63,7 +63,7 @@ class ucp_register
$submit = false;
// Setting back agreed to let the user view the agreement in his/her language
- $agreed = (empty($_GET['change_lang'])) ? 0 : $agreed;
+ $agreed = false;
}
$user->lang_name = $user_lang = $use_lang;
@@ -78,19 +78,37 @@ class ucp_register
}
}
-
$cp = new custom_profile();
$error = $cp_data = $cp_error = array();
+ $s_hidden_fields = array();
+
+ // Handle login_link data added to $_hidden_fields
+ $login_link_data = $this->get_login_link_data_array();
+
+ if (!empty($login_link_data))
+ {
+ // Confirm that we have all necessary data
+ $auth_provider = 'auth.provider.' . $request->variable('auth_provider', $config['auth_method']);
+ $auth_provider = $phpbb_container->get($auth_provider);
+
+ $result = $auth_provider->login_link_has_necessary_data($login_link_data);
+ if ($result !== null)
+ {
+ $error[] = $user->lang[$result];
+ }
+
+ $s_hidden_fields = array_merge($s_hidden_fields, $this->get_login_link_data_for_hidden_fields($login_link_data));
+ }
if (!$agreed || ($coppa === false && $config['coppa_enable']) || ($coppa && !$config['coppa_enable']))
{
$add_lang = ($change_lang) ? '&amp;change_lang=' . urlencode($change_lang) : '';
$add_coppa = ($coppa !== false) ? '&amp;coppa=' . $coppa : '';
- $s_hidden_fields = array(
- 'change_lang' => $change_lang,
- );
+ $s_hidden_fields = array_merge($s_hidden_fields, array(
+ 'change_lang' => '',
+ ));
// If we change the language, we want to pass on some more possible parameter.
if ($change_lang)
@@ -99,9 +117,8 @@ class ucp_register
$s_hidden_fields = array_merge($s_hidden_fields, array(
'username' => utf8_normalize_nfc(request_var('username', '', true)),
'email' => strtolower(request_var('email', '')),
- 'email_confirm' => strtolower(request_var('email_confirm', '')),
'lang' => $user->lang_name,
- 'tz' => request_var('tz', (float) $config['board_timezone']),
+ 'tz' => request_var('tz', $config['board_timezone']),
));
}
@@ -121,7 +138,10 @@ class ucp_register
if ($coppa === false && $config['coppa_enable'])
{
$now = getdate();
- $coppa_birthday = $user->format_date(mktime($now['hours'] + $user->data['user_dst'], $now['minutes'], $now['seconds'], $now['mon'], $now['mday'] - 1, $now['year'] - 13), $user->lang['DATE_FORMAT']);
+ $coppa_birthday = $user->create_datetime()
+ ->setDate($now['year'] - 13, $now['mon'], $now['mday'] - 1)
+ ->setTime(0, 0, 0)
+ ->format($user->lang['DATE_FORMAT'], true);
unset($now);
$template->assign_vars(array(
@@ -156,26 +176,23 @@ class ucp_register
return;
}
-
- // The CAPTCHA kicks in here. We can't help that the information gets lost on language change.
+ // The CAPTCHA kicks in here. We can't help that the information gets lost on language change.
if ($config['enable_confirm'])
{
include($phpbb_root_path . 'includes/captcha/captcha_factory.' . $phpEx);
- $captcha =& phpbb_captcha_factory::get_instance($config['captcha_plugin']);
+ $captcha = phpbb_captcha_factory::get_instance($config['captcha_plugin']);
$captcha->init(CONFIRM_REG);
}
- $is_dst = $config['board_dst'];
$timezone = $config['board_timezone'];
$data = array(
'username' => utf8_normalize_nfc(request_var('username', '', true)),
- 'new_password' => request_var('new_password', '', true),
- 'password_confirm' => request_var('password_confirm', '', true),
+ 'new_password' => $request->variable('new_password', '', true),
+ 'password_confirm' => $request->variable('password_confirm', '', true),
'email' => strtolower(request_var('email', '')),
- 'email_confirm' => strtolower(request_var('email_confirm', '')),
'lang' => basename(request_var('lang', $user->lang_name)),
- 'tz' => request_var('tz', (float) $timezone),
+ 'tz' => request_var('tz', $timezone),
);
// Check and initialize some variables if needed
@@ -192,8 +209,7 @@ class ucp_register
'email' => array(
array('string', false, 6, 60),
array('email')),
- 'email_confirm' => array('string', false, 6, 60),
- 'tz' => array('num', false, -14, 14),
+ 'tz' => array('timezone'),
'lang' => array('language_iso_name'),
));
@@ -203,7 +219,7 @@ class ucp_register
}
// Replace "error" strings with their real, localised form
- $error = preg_replace('#^([A-Z_]+)$#e', "(!empty(\$user->lang['\\1'])) ? \$user->lang['\\1'] : '\\1'", $error);
+ $error = array_map(array($user, 'lang'), $error);
if ($config['enable_confirm'])
{
@@ -237,11 +253,6 @@ class ucp_register
{
$error[] = $user->lang['NEW_PASSWORD_ERROR'];
}
-
- if ($data['email'] != $data['email_confirm'])
- {
- $error[] = $user->lang['NEW_EMAIL_ERROR'];
- }
}
if (!sizeof($error))
@@ -288,8 +299,7 @@ class ucp_register
'user_password' => phpbb_hash($data['new_password']),
'user_email' => $data['email'],
'group_id' => (int) $group_id,
- 'user_timezone' => (float) $data['tz'],
- 'user_dst' => $is_dst,
+ 'user_timezone' => $data['tz'],
'user_lang' => $data['lang'],
'user_type' => $user_type,
'user_actkey' => $user_actkey,
@@ -392,8 +402,7 @@ class ucp_register
while ($row = $db->sql_fetchrow($result))
{
$messenger->template('admin_activate', $row['user_lang']);
- $messenger->to($row['user_email'], $row['username']);
- $messenger->im($row['user_jabber'], $row['username']);
+ $messenger->set_addresses($row);
$messenger->assign_vars(array(
'USERNAME' => htmlspecialchars_decode($data['username']),
@@ -407,15 +416,28 @@ class ucp_register
}
}
+ // Perform account linking if necessary
+ if (!empty($login_link_data))
+ {
+ $login_link_data['user_id'] = $user_id;
+
+ $result = $auth_provider->link_account($login_link_data);
+
+ if ($result)
+ {
+ $message = $message . '<br /><br />' . $user->lang[$result];
+ }
+ }
+
$message = $message . '<br /><br />' . sprintf($user->lang['RETURN_INDEX'], '<a href="' . append_sid("{$phpbb_root_path}index.$phpEx") . '">', '</a>');
trigger_error($message);
}
}
- $s_hidden_fields = array(
+ $s_hidden_fields = array_merge($s_hidden_fields, array(
'agreed' => 'true',
'change_lang' => 0,
- );
+ ));
if ($config['coppa_enable'])
{
@@ -450,20 +472,22 @@ class ucp_register
break;
}
+ $timezone_selects = phpbb_timezone_select($user, $data['tz'], true);
$template->assign_vars(array(
'ERROR' => (sizeof($error)) ? implode('<br />', $error) : '',
'USERNAME' => $data['username'],
'PASSWORD' => $data['new_password'],
'PASSWORD_CONFIRM' => $data['password_confirm'],
'EMAIL' => $data['email'],
- 'EMAIL_CONFIRM' => $data['email_confirm'],
'L_REG_COND' => $l_reg_cond,
- 'L_USERNAME_EXPLAIN' => sprintf($user->lang[$config['allow_name_chars'] . '_EXPLAIN'], $config['min_name_chars'], $config['max_name_chars']),
- 'L_PASSWORD_EXPLAIN' => sprintf($user->lang[$config['pass_complex'] . '_EXPLAIN'], $config['min_pass_chars'], $config['max_pass_chars']),
+ 'L_USERNAME_EXPLAIN' => $user->lang($config['allow_name_chars'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_name_chars']), $user->lang('CHARACTERS', (int) $config['max_name_chars'])),
+ 'L_PASSWORD_EXPLAIN' => $user->lang($config['pass_complex'] . '_EXPLAIN', $user->lang('CHARACTERS', (int) $config['min_pass_chars']), $user->lang('CHARACTERS', (int) $config['max_pass_chars'])),
'S_LANG_OPTIONS' => language_select($data['lang']),
- 'S_TZ_OPTIONS' => tz_select($data['tz']),
+ 'S_TZ_OPTIONS' => $timezone_selects['tz_select'],
+ 'S_TZ_DATE_OPTIONS' => $timezone_selects['tz_dates'],
+ 'S_TZ_PRESELECT' => !$submit,
'S_CONFIRM_REFRESH' => ($config['enable_confirm'] && $config['confirm_refresh']) ? true : false,
'S_REGISTRATION' => true,
'S_COPPA' => $coppa,
@@ -481,6 +505,49 @@ class ucp_register
$this->tpl_name = 'ucp_register';
$this->page_title = 'UCP_REGISTRATION';
}
-}
-?> \ No newline at end of file
+ /**
+ * Creates the login_link data array
+ *
+ * @return array Returns an array of all POST paramaters whose names
+ * begin with 'login_link_'
+ */
+ protected function get_login_link_data_array()
+ {
+ global $request;
+
+ $var_names = $request->variable_names(\phpbb\request\request_interface::POST);
+ $login_link_data = array();
+ $string_start_length = strlen('login_link_');
+
+ foreach ($var_names as $var_name)
+ {
+ if (strpos($var_name, 'login_link_') === 0)
+ {
+ $key_name = substr($var_name, $string_start_length);
+ $login_link_data[$key_name] = $request->variable($var_name, '', false, \phpbb\request\request_interface::POST);
+ }
+ }
+
+ return $login_link_data;
+ }
+
+ /**
+ * Prepends they key names of an associative array with 'login_link_' for
+ * inclusion on the page as hidden fields.
+ *
+ * @param array $data The array to be modified
+ * @return array The modified array
+ */
+ protected function get_login_link_data_for_hidden_fields($data)
+ {
+ $new_data = array();
+
+ foreach ($data as $key => $value)
+ {
+ $new_data['login_link_' . $key] = $value;
+ }
+
+ return $new_data;
+ }
+}
diff --git a/phpBB/includes/ucp/ucp_remind.php b/phpBB/includes/ucp/ucp_remind.php
index bcb21cbedc..b3def63896 100644
--- a/phpBB/includes/ucp/ucp_remind.php
+++ b/phpBB/includes/ucp/ucp_remind.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -30,6 +29,11 @@ class ucp_remind
global $config, $phpbb_root_path, $phpEx;
global $db, $user, $auth, $template;
+ if (!$config['allow_password_reset'])
+ {
+ trigger_error($user->lang('UCP_PASSWORD_RESET_DISABLED', '<a href="mailto:' . htmlspecialchars($config['board_contact']) . '">', '</a>'));
+ }
+
$username = request_var('username', '', true);
$email = strtolower(request_var('email', ''));
$submit = (isset($_POST['submit'])) ? true : false;
@@ -67,7 +71,7 @@ class ucp_remind
}
// Check users permissions
- $auth2 = new auth();
+ $auth2 = new \phpbb\auth\auth();
$auth2->acl($user_row);
if (!$auth2->acl_get('u_chgpasswd'))
@@ -95,8 +99,7 @@ class ucp_remind
$messenger->template('user_activate_passwd', $user_row['user_lang']);
- $messenger->to($user_row['user_email'], $user_row['username']);
- $messenger->im($user_row['user_jabber'], $user_row['username']);
+ $messenger->set_addresses($user_row);
$messenger->anti_abuse_headers($config, $user);
@@ -124,5 +127,3 @@ class ucp_remind
$this->page_title = 'UCP_REMIND';
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_resend.php b/phpBB/includes/ucp/ucp_resend.php
index 4d181dba49..ab396cdec9 100644
--- a/phpBB/includes/ucp/ucp_resend.php
+++ b/phpBB/includes/ucp/ucp_resend.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -92,7 +91,7 @@ class ucp_resend
if ($config['require_activation'] == USER_ACTIVATION_SELF || $coppa)
{
$messenger->template(($coppa) ? 'coppa_resend_inactive' : 'user_resend_inactive', $user_row['user_lang']);
- $messenger->to($user_row['user_email'], $user_row['username']);
+ $messenger->set_addresses($user_row);
$messenger->anti_abuse_headers($config, $user);
@@ -127,8 +126,7 @@ class ucp_resend
while ($row = $db->sql_fetchrow($result))
{
$messenger->template('admin_activate', $row['user_lang']);
- $messenger->to($row['user_email'], $row['username']);
- $messenger->im($row['user_jabber'], $row['username']);
+ $messenger->set_addresses($row);
$messenger->anti_abuse_headers($config, $user);
@@ -160,5 +158,3 @@ class ucp_resend
$this->page_title = 'UCP_RESEND';
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/ucp/ucp_zebra.php b/phpBB/includes/ucp/ucp_zebra.php
index 5ed4db7520..6bb3cdc145 100644
--- a/phpBB/includes/ucp/ucp_zebra.php
+++ b/phpBB/includes/ucp/ucp_zebra.php
@@ -2,9 +2,8 @@
/**
*
* @package ucp
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -26,7 +25,7 @@ class ucp_zebra
function main($id, $mode)
{
- global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx;
+ global $config, $db, $user, $auth, $template, $phpbb_root_path, $phpEx, $request, $phpbb_dispatcher;
$submit = (isset($_POST['submit']) || isset($_GET['add']) || isset($_GET['remove'])) ? true : false;
$s_hidden_fields = '';
@@ -55,9 +54,22 @@ class ucp_zebra
// Remove users
if (!empty($data['usernames']))
{
+ $user_ids = $data['usernames'];
+
+ /**
+ * Remove users from friends/foes
+ *
+ * @event core.ucp_remove_zebra
+ * @var string mode Zebra type: friends|foes
+ * @var array user_ids User ids we remove
+ * @since 3.1-A1
+ */
+ $vars = array('user_ids');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_remove_zebra', compact($vars)));
+
$sql = 'DELETE FROM ' . ZEBRA_TABLE . '
WHERE user_id = ' . $user->data['user_id'] . '
- AND ' . $db->sql_in_set('zebra_id', $data['usernames']);
+ AND ' . $db->sql_in_set('zebra_id', $user_ids);
$db->sql_query($sql);
$updated = true;
@@ -187,6 +199,19 @@ class ucp_zebra
);
}
+ /**
+ * Add users to friends/foes
+ *
+ * @event core.ucp_add_zebra
+ * @var string mode Zebra type:
+ * friends|foes
+ * @var array sql_ary Array of
+ * entries we add
+ * @since 3.1-A1
+ */
+ $vars = array('mode', 'sql_ary');
+ extract($phpbb_dispatcher->trigger_event('core.ucp_add_zebra', compact($vars)));
+
$db->sql_multi_insert(ZEBRA_TABLE, $sql_ary);
$updated = true;
@@ -199,8 +224,24 @@ class ucp_zebra
}
}
}
-
- if ($updated)
+
+ if ($request->is_ajax())
+ {
+ $message = ($updated) ? $user->lang[$l_mode . '_UPDATED'] : implode('<br />', $error);
+
+ $json_response = new \phpbb\json_response;
+ $json_response->send(array(
+ 'success' => $updated,
+
+ 'MESSAGE_TITLE' => $user->lang['INFORMATION'],
+ 'MESSAGE_TEXT' => $message,
+ 'REFRESH_DATA' => array(
+ 'time' => 3,
+ 'url' => $this->u_action
+ )
+ ));
+ }
+ else if ($updated)
{
meta_refresh(3, $this->u_action);
$message = $user->lang[$l_mode . '_UPDATED'] . '<br />' . implode('<br />', $error) . ((sizeof($error)) ? '<br />' : '') . '<br />' . sprintf($user->lang['RETURN_UCP'], '<a href="' . $this->u_action . '">', '</a>');
@@ -253,5 +294,3 @@ class ucp_zebra
$this->page_title = 'UCP_ZEBRA_' . $l_mode;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/utf/data/case_fold_c.php b/phpBB/includes/utf/data/case_fold_c.php
index 00de1ba349..a5e3fc7990 100644
--- a/phpBB/includes/utf/data/case_fold_c.php
+++ b/phpBB/includes/utf/data/case_fold_c.php
@@ -1 +1 @@
-<?php return array('A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','µ'=>'μ','À'=>'à','Á'=>'á','Â'=>'â','Ã'=>'ã','Ä'=>'ä','Å'=>'å','Æ'=>'æ','Ç'=>'ç','È'=>'è','É'=>'é','Ê'=>'ê','Ë'=>'ë','Ì'=>'ì','Í'=>'í','Î'=>'î','Ï'=>'ï','Ð'=>'ð','Ñ'=>'ñ','Ò'=>'ò','Ó'=>'ó','Ô'=>'ô','Õ'=>'õ','Ö'=>'ö','Ø'=>'ø','Ù'=>'ù','Ú'=>'ú','Û'=>'û','Ü'=>'ü','Ý'=>'ý','Þ'=>'þ','Ā'=>'ā','Ă'=>'ă','Ą'=>'ą','Ć'=>'ć','Ĉ'=>'ĉ','Ċ'=>'ċ','Č'=>'č','Ď'=>'ď','Đ'=>'đ','Ē'=>'ē','Ĕ'=>'ĕ','Ė'=>'ė','Ę'=>'ę','Ě'=>'ě','Ĝ'=>'ĝ','Ğ'=>'ğ','Ġ'=>'ġ','Ģ'=>'ģ','Ĥ'=>'ĥ','Ħ'=>'ħ','Ĩ'=>'ĩ','Ī'=>'ī','Ĭ'=>'ĭ','Į'=>'į','IJ'=>'ij','Ĵ'=>'ĵ','Ķ'=>'ķ','Ĺ'=>'ĺ','Ļ'=>'ļ','Ľ'=>'ľ','Ŀ'=>'ŀ','Ł'=>'ł','Ń'=>'ń','Ņ'=>'ņ','Ň'=>'ň','Ŋ'=>'ŋ','Ō'=>'ō','Ŏ'=>'ŏ','Ő'=>'ő','Œ'=>'œ','Ŕ'=>'ŕ','Ŗ'=>'ŗ','Ř'=>'ř','Ś'=>'ś','Ŝ'=>'ŝ','Ş'=>'ş','Š'=>'š','Ţ'=>'ţ','Ť'=>'ť','Ŧ'=>'ŧ','Ũ'=>'ũ','Ū'=>'ū','Ŭ'=>'ŭ','Ů'=>'ů','Ű'=>'ű','Ų'=>'ų','Ŵ'=>'ŵ','Ŷ'=>'ŷ','Ÿ'=>'ÿ','Ź'=>'ź','Ż'=>'ż','Ž'=>'ž','ſ'=>'s','Ɓ'=>'ɓ','Ƃ'=>'ƃ','Ƅ'=>'ƅ','Ɔ'=>'ɔ','Ƈ'=>'ƈ','Ɖ'=>'ɖ','Ɗ'=>'ɗ','Ƌ'=>'ƌ','Ǝ'=>'ǝ','Ə'=>'ə','Ɛ'=>'ɛ','Ƒ'=>'ƒ','Ɠ'=>'ɠ','Ɣ'=>'ɣ','Ɩ'=>'ɩ','Ɨ'=>'ɨ','Ƙ'=>'ƙ','Ɯ'=>'ɯ','Ɲ'=>'ɲ','Ɵ'=>'ɵ','Ơ'=>'ơ','Ƣ'=>'ƣ','Ƥ'=>'ƥ','Ʀ'=>'ʀ','Ƨ'=>'ƨ','Ʃ'=>'ʃ','Ƭ'=>'ƭ','Ʈ'=>'ʈ','Ư'=>'ư','Ʊ'=>'ʊ','Ʋ'=>'ʋ','Ƴ'=>'ƴ','Ƶ'=>'ƶ','Ʒ'=>'ʒ','Ƹ'=>'ƹ','Ƽ'=>'ƽ','DŽ'=>'dž','Dž'=>'dž','LJ'=>'lj','Lj'=>'lj','NJ'=>'nj','Nj'=>'nj','Ǎ'=>'ǎ','Ǐ'=>'ǐ','Ǒ'=>'ǒ','Ǔ'=>'ǔ','Ǖ'=>'ǖ','Ǘ'=>'ǘ','Ǚ'=>'ǚ','Ǜ'=>'ǜ','Ǟ'=>'ǟ','Ǡ'=>'ǡ','Ǣ'=>'ǣ','Ǥ'=>'ǥ','Ǧ'=>'ǧ','Ǩ'=>'ǩ','Ǫ'=>'ǫ','Ǭ'=>'ǭ','Ǯ'=>'ǯ','DZ'=>'dz','Dz'=>'dz','Ǵ'=>'ǵ','Ƕ'=>'ƕ','Ƿ'=>'ƿ','Ǹ'=>'ǹ','Ǻ'=>'ǻ','Ǽ'=>'ǽ','Ǿ'=>'ǿ','Ȁ'=>'ȁ','Ȃ'=>'ȃ','Ȅ'=>'ȅ','Ȇ'=>'ȇ','Ȉ'=>'ȉ','Ȋ'=>'ȋ','Ȍ'=>'ȍ','Ȏ'=>'ȏ','Ȑ'=>'ȑ','Ȓ'=>'ȓ','Ȕ'=>'ȕ','Ȗ'=>'ȗ','Ș'=>'ș','Ț'=>'ț','Ȝ'=>'ȝ','Ȟ'=>'ȟ','Ƞ'=>'ƞ','Ȣ'=>'ȣ','Ȥ'=>'ȥ','Ȧ'=>'ȧ','Ȩ'=>'ȩ','Ȫ'=>'ȫ','Ȭ'=>'ȭ','Ȯ'=>'ȯ','Ȱ'=>'ȱ','Ȳ'=>'ȳ','Ⱥ'=>'ⱥ','Ȼ'=>'ȼ','Ƚ'=>'ƚ','Ⱦ'=>'ⱦ','Ɂ'=>'ɂ','Ƀ'=>'ƀ','Ʉ'=>'ʉ','Ʌ'=>'ʌ','Ɇ'=>'ɇ','Ɉ'=>'ɉ','Ɋ'=>'ɋ','Ɍ'=>'ɍ','Ɏ'=>'ɏ','ͅ'=>'ι','Ά'=>'ά','Έ'=>'έ','Ή'=>'ή','Ί'=>'ί','Ό'=>'ό','Ύ'=>'ύ','Ώ'=>'ώ','Α'=>'α','Β'=>'β','Γ'=>'γ','Δ'=>'δ','Ε'=>'ε','Ζ'=>'ζ','Η'=>'η','Θ'=>'θ','Ι'=>'ι','Κ'=>'κ','Λ'=>'λ','Μ'=>'μ','Ν'=>'ν','Ξ'=>'ξ','Ο'=>'ο','Π'=>'π','Ρ'=>'ρ','Σ'=>'σ','Τ'=>'τ','Υ'=>'υ','Φ'=>'φ','Χ'=>'χ','Ψ'=>'ψ','Ω'=>'ω','Ϊ'=>'ϊ','Ϋ'=>'ϋ','ς'=>'σ','ϐ'=>'β','ϑ'=>'θ','ϕ'=>'φ','ϖ'=>'π','Ϙ'=>'ϙ','Ϛ'=>'ϛ','Ϝ'=>'ϝ','Ϟ'=>'ϟ','Ϡ'=>'ϡ','Ϣ'=>'ϣ','Ϥ'=>'ϥ','Ϧ'=>'ϧ','Ϩ'=>'ϩ','Ϫ'=>'ϫ','Ϭ'=>'ϭ','Ϯ'=>'ϯ','ϰ'=>'κ','ϱ'=>'ρ','ϴ'=>'θ','ϵ'=>'ε','Ϸ'=>'ϸ','Ϲ'=>'ϲ','Ϻ'=>'ϻ','Ͻ'=>'ͻ','Ͼ'=>'ͼ','Ͽ'=>'ͽ','Ѐ'=>'ѐ','Ё'=>'ё','Ђ'=>'ђ','Ѓ'=>'ѓ','Є'=>'є','Ѕ'=>'ѕ','І'=>'і','Ї'=>'ї','Ј'=>'ј','Љ'=>'љ','Њ'=>'њ','Ћ'=>'ћ','Ќ'=>'ќ','Ѝ'=>'ѝ','Ў'=>'ў','Џ'=>'џ','А'=>'а','Б'=>'б','В'=>'в','Г'=>'г','Д'=>'д','Е'=>'е','Ж'=>'ж','З'=>'з','И'=>'и','Й'=>'й','К'=>'к','Л'=>'л','М'=>'м','Н'=>'н','О'=>'о','П'=>'п','Р'=>'р','С'=>'с','Т'=>'т','У'=>'у','Ф'=>'ф','Х'=>'х','Ц'=>'ц','Ч'=>'ч','Ш'=>'ш','Щ'=>'щ','Ъ'=>'ъ','Ы'=>'ы','Ь'=>'ь','Э'=>'э','Ю'=>'ю','Я'=>'я','Ѡ'=>'ѡ','Ѣ'=>'ѣ','Ѥ'=>'ѥ','Ѧ'=>'ѧ','Ѩ'=>'ѩ','Ѫ'=>'ѫ','Ѭ'=>'ѭ','Ѯ'=>'ѯ','Ѱ'=>'ѱ','Ѳ'=>'ѳ','Ѵ'=>'ѵ','Ѷ'=>'ѷ','Ѹ'=>'ѹ','Ѻ'=>'ѻ','Ѽ'=>'ѽ','Ѿ'=>'ѿ','Ҁ'=>'ҁ','Ҋ'=>'ҋ','Ҍ'=>'ҍ','Ҏ'=>'ҏ','Ґ'=>'ґ','Ғ'=>'ғ','Ҕ'=>'ҕ','Җ'=>'җ','Ҙ'=>'ҙ','Қ'=>'қ','Ҝ'=>'ҝ','Ҟ'=>'ҟ','Ҡ'=>'ҡ','Ң'=>'ң','Ҥ'=>'ҥ','Ҧ'=>'ҧ','Ҩ'=>'ҩ','Ҫ'=>'ҫ','Ҭ'=>'ҭ','Ү'=>'ү','Ұ'=>'ұ','Ҳ'=>'ҳ','Ҵ'=>'ҵ','Ҷ'=>'ҷ','Ҹ'=>'ҹ','Һ'=>'һ','Ҽ'=>'ҽ','Ҿ'=>'ҿ','Ӏ'=>'ӏ','Ӂ'=>'ӂ','Ӄ'=>'ӄ','Ӆ'=>'ӆ','Ӈ'=>'ӈ','Ӊ'=>'ӊ','Ӌ'=>'ӌ','Ӎ'=>'ӎ','Ӑ'=>'ӑ','Ӓ'=>'ӓ','Ӕ'=>'ӕ','Ӗ'=>'ӗ','Ә'=>'ә','Ӛ'=>'ӛ','Ӝ'=>'ӝ','Ӟ'=>'ӟ','Ӡ'=>'ӡ','Ӣ'=>'ӣ','Ӥ'=>'ӥ','Ӧ'=>'ӧ','Ө'=>'ө','Ӫ'=>'ӫ','Ӭ'=>'ӭ','Ӯ'=>'ӯ','Ӱ'=>'ӱ','Ӳ'=>'ӳ','Ӵ'=>'ӵ','Ӷ'=>'ӷ','Ӹ'=>'ӹ','Ӻ'=>'ӻ','Ӽ'=>'ӽ','Ӿ'=>'ӿ','Ԁ'=>'ԁ','Ԃ'=>'ԃ','Ԅ'=>'ԅ','Ԇ'=>'ԇ','Ԉ'=>'ԉ','Ԋ'=>'ԋ','Ԍ'=>'ԍ','Ԏ'=>'ԏ','Ԑ'=>'ԑ','Ԓ'=>'ԓ','Ա'=>'ա','Բ'=>'բ','Գ'=>'գ','Դ'=>'դ','Ե'=>'ե','Զ'=>'զ','Է'=>'է','Ը'=>'ը','Թ'=>'թ','Ժ'=>'ժ','Ի'=>'ի','Լ'=>'լ','Խ'=>'խ','Ծ'=>'ծ','Կ'=>'կ','Հ'=>'հ','Ձ'=>'ձ','Ղ'=>'ղ','Ճ'=>'ճ','Մ'=>'մ','Յ'=>'յ','Ն'=>'ն','Շ'=>'շ','Ո'=>'ո','Չ'=>'չ','Պ'=>'պ','Ջ'=>'ջ','Ռ'=>'ռ','Ս'=>'ս','Վ'=>'վ','Տ'=>'տ','Ր'=>'ր','Ց'=>'ց','Ւ'=>'ւ','Փ'=>'փ','Ք'=>'ք','Օ'=>'օ','Ֆ'=>'ֆ','Ⴀ'=>'ⴀ','Ⴁ'=>'ⴁ','Ⴂ'=>'ⴂ','Ⴃ'=>'ⴃ','Ⴄ'=>'ⴄ','Ⴅ'=>'ⴅ','Ⴆ'=>'ⴆ','Ⴇ'=>'ⴇ','Ⴈ'=>'ⴈ','Ⴉ'=>'ⴉ','Ⴊ'=>'ⴊ','Ⴋ'=>'ⴋ','Ⴌ'=>'ⴌ','Ⴍ'=>'ⴍ','Ⴎ'=>'ⴎ','Ⴏ'=>'ⴏ','Ⴐ'=>'ⴐ','Ⴑ'=>'ⴑ','Ⴒ'=>'ⴒ','Ⴓ'=>'ⴓ','Ⴔ'=>'ⴔ','Ⴕ'=>'ⴕ','Ⴖ'=>'ⴖ','Ⴗ'=>'ⴗ','Ⴘ'=>'ⴘ','Ⴙ'=>'ⴙ','Ⴚ'=>'ⴚ','Ⴛ'=>'ⴛ','Ⴜ'=>'ⴜ','Ⴝ'=>'ⴝ','Ⴞ'=>'ⴞ','Ⴟ'=>'ⴟ','Ⴠ'=>'ⴠ','Ⴡ'=>'ⴡ','Ⴢ'=>'ⴢ','Ⴣ'=>'ⴣ','Ⴤ'=>'ⴤ','Ⴥ'=>'ⴥ','Ḁ'=>'ḁ','Ḃ'=>'ḃ','Ḅ'=>'ḅ','Ḇ'=>'ḇ','Ḉ'=>'ḉ','Ḋ'=>'ḋ','Ḍ'=>'ḍ','Ḏ'=>'ḏ','Ḑ'=>'ḑ','Ḓ'=>'ḓ','Ḕ'=>'ḕ','Ḗ'=>'ḗ','Ḙ'=>'ḙ','Ḛ'=>'ḛ','Ḝ'=>'ḝ','Ḟ'=>'ḟ','Ḡ'=>'ḡ','Ḣ'=>'ḣ','Ḥ'=>'ḥ','Ḧ'=>'ḧ','Ḩ'=>'ḩ','Ḫ'=>'ḫ','Ḭ'=>'ḭ','Ḯ'=>'ḯ','Ḱ'=>'ḱ','Ḳ'=>'ḳ','Ḵ'=>'ḵ','Ḷ'=>'ḷ','Ḹ'=>'ḹ','Ḻ'=>'ḻ','Ḽ'=>'ḽ','Ḿ'=>'ḿ','Ṁ'=>'ṁ','Ṃ'=>'ṃ','Ṅ'=>'ṅ','Ṇ'=>'ṇ','Ṉ'=>'ṉ','Ṋ'=>'ṋ','Ṍ'=>'ṍ','Ṏ'=>'ṏ','Ṑ'=>'ṑ','Ṓ'=>'ṓ','Ṕ'=>'ṕ','Ṗ'=>'ṗ','Ṙ'=>'ṙ','Ṛ'=>'ṛ','Ṝ'=>'ṝ','Ṟ'=>'ṟ','Ṡ'=>'ṡ','Ṣ'=>'ṣ','Ṥ'=>'ṥ','Ṧ'=>'ṧ','Ṩ'=>'ṩ','Ṫ'=>'ṫ','Ṭ'=>'ṭ','Ṯ'=>'ṯ','Ṱ'=>'ṱ','Ṳ'=>'ṳ','Ṵ'=>'ṵ','Ṷ'=>'ṷ','Ṹ'=>'ṹ','Ṻ'=>'ṻ','Ṽ'=>'ṽ','Ṿ'=>'ṿ','Ẁ'=>'ẁ','Ẃ'=>'ẃ','Ẅ'=>'ẅ','Ẇ'=>'ẇ','Ẉ'=>'ẉ','Ẋ'=>'ẋ','Ẍ'=>'ẍ','Ẏ'=>'ẏ','Ẑ'=>'ẑ','Ẓ'=>'ẓ','Ẕ'=>'ẕ','ẛ'=>'ṡ','Ạ'=>'ạ','Ả'=>'ả','Ấ'=>'ấ','Ầ'=>'ầ','Ẩ'=>'ẩ','Ẫ'=>'ẫ','Ậ'=>'ậ','Ắ'=>'ắ','Ằ'=>'ằ','Ẳ'=>'ẳ','Ẵ'=>'ẵ','Ặ'=>'ặ','Ẹ'=>'ẹ','Ẻ'=>'ẻ','Ẽ'=>'ẽ','Ế'=>'ế','Ề'=>'ề','Ể'=>'ể','Ễ'=>'ễ','Ệ'=>'ệ','Ỉ'=>'ỉ','Ị'=>'ị','Ọ'=>'ọ','Ỏ'=>'ỏ','Ố'=>'ố','Ồ'=>'ồ','Ổ'=>'ổ','Ỗ'=>'ỗ','Ộ'=>'ộ','Ớ'=>'ớ','Ờ'=>'ờ','Ở'=>'ở','Ỡ'=>'ỡ','Ợ'=>'ợ','Ụ'=>'ụ','Ủ'=>'ủ','Ứ'=>'ứ','Ừ'=>'ừ','Ử'=>'ử','Ữ'=>'ữ','Ự'=>'ự','Ỳ'=>'ỳ','Ỵ'=>'ỵ','Ỷ'=>'ỷ','Ỹ'=>'ỹ','Ἀ'=>'ἀ','Ἁ'=>'ἁ','Ἂ'=>'ἂ','Ἃ'=>'ἃ','Ἄ'=>'ἄ','Ἅ'=>'ἅ','Ἆ'=>'ἆ','Ἇ'=>'ἇ','Ἐ'=>'ἐ','Ἑ'=>'ἑ','Ἒ'=>'ἒ','Ἓ'=>'ἓ','Ἔ'=>'ἔ','Ἕ'=>'ἕ','Ἠ'=>'ἠ','Ἡ'=>'ἡ','Ἢ'=>'ἢ','Ἣ'=>'ἣ','Ἤ'=>'ἤ','Ἥ'=>'ἥ','Ἦ'=>'ἦ','Ἧ'=>'ἧ','Ἰ'=>'ἰ','Ἱ'=>'ἱ','Ἲ'=>'ἲ','Ἳ'=>'ἳ','Ἴ'=>'ἴ','Ἵ'=>'ἵ','Ἶ'=>'ἶ','Ἷ'=>'ἷ','Ὀ'=>'ὀ','Ὁ'=>'ὁ','Ὂ'=>'ὂ','Ὃ'=>'ὃ','Ὄ'=>'ὄ','Ὅ'=>'ὅ','Ὑ'=>'ὑ','Ὓ'=>'ὓ','Ὕ'=>'ὕ','Ὗ'=>'ὗ','Ὠ'=>'ὠ','Ὡ'=>'ὡ','Ὢ'=>'ὢ','Ὣ'=>'ὣ','Ὤ'=>'ὤ','Ὥ'=>'ὥ','Ὦ'=>'ὦ','Ὧ'=>'ὧ','Ᾰ'=>'ᾰ','Ᾱ'=>'ᾱ','Ὰ'=>'ὰ','Ά'=>'ά','ι'=>'ι','Ὲ'=>'ὲ','Έ'=>'έ','Ὴ'=>'ὴ','Ή'=>'ή','Ῐ'=>'ῐ','Ῑ'=>'ῑ','Ὶ'=>'ὶ','Ί'=>'ί','Ῠ'=>'ῠ','Ῡ'=>'ῡ','Ὺ'=>'ὺ','Ύ'=>'ύ','Ῥ'=>'ῥ','Ὸ'=>'ὸ','Ό'=>'ό','Ὼ'=>'ὼ','Ώ'=>'ώ','Ω'=>'ω','K'=>'k','Å'=>'å','Ⅎ'=>'ⅎ','Ⅰ'=>'ⅰ','Ⅱ'=>'ⅱ','Ⅲ'=>'ⅲ','Ⅳ'=>'ⅳ','Ⅴ'=>'ⅴ','Ⅵ'=>'ⅵ','Ⅶ'=>'ⅶ','Ⅷ'=>'ⅷ','Ⅸ'=>'ⅸ','Ⅹ'=>'ⅹ','Ⅺ'=>'ⅺ','Ⅻ'=>'ⅻ','Ⅼ'=>'ⅼ','Ⅽ'=>'ⅽ','Ⅾ'=>'ⅾ','Ⅿ'=>'ⅿ','Ↄ'=>'ↄ','Ⓐ'=>'ⓐ','Ⓑ'=>'ⓑ','Ⓒ'=>'ⓒ','Ⓓ'=>'ⓓ','Ⓔ'=>'ⓔ','Ⓕ'=>'ⓕ','Ⓖ'=>'ⓖ','Ⓗ'=>'ⓗ','Ⓘ'=>'ⓘ','Ⓙ'=>'ⓙ','Ⓚ'=>'ⓚ','Ⓛ'=>'ⓛ','Ⓜ'=>'ⓜ','Ⓝ'=>'ⓝ','Ⓞ'=>'ⓞ','Ⓟ'=>'ⓟ','Ⓠ'=>'ⓠ','Ⓡ'=>'ⓡ','Ⓢ'=>'ⓢ','Ⓣ'=>'ⓣ','Ⓤ'=>'ⓤ','Ⓥ'=>'ⓥ','Ⓦ'=>'ⓦ','Ⓧ'=>'ⓧ','Ⓨ'=>'ⓨ','Ⓩ'=>'ⓩ','Ⰰ'=>'ⰰ','Ⰱ'=>'ⰱ','Ⰲ'=>'ⰲ','Ⰳ'=>'ⰳ','Ⰴ'=>'ⰴ','Ⰵ'=>'ⰵ','Ⰶ'=>'ⰶ','Ⰷ'=>'ⰷ','Ⰸ'=>'ⰸ','Ⰹ'=>'ⰹ','Ⰺ'=>'ⰺ','Ⰻ'=>'ⰻ','Ⰼ'=>'ⰼ','Ⰽ'=>'ⰽ','Ⰾ'=>'ⰾ','Ⰿ'=>'ⰿ','Ⱀ'=>'ⱀ','Ⱁ'=>'ⱁ','Ⱂ'=>'ⱂ','Ⱃ'=>'ⱃ','Ⱄ'=>'ⱄ','Ⱅ'=>'ⱅ','Ⱆ'=>'ⱆ','Ⱇ'=>'ⱇ','Ⱈ'=>'ⱈ','Ⱉ'=>'ⱉ','Ⱊ'=>'ⱊ','Ⱋ'=>'ⱋ','Ⱌ'=>'ⱌ','Ⱍ'=>'ⱍ','Ⱎ'=>'ⱎ','Ⱏ'=>'ⱏ','Ⱐ'=>'ⱐ','Ⱑ'=>'ⱑ','Ⱒ'=>'ⱒ','Ⱓ'=>'ⱓ','Ⱔ'=>'ⱔ','Ⱕ'=>'ⱕ','Ⱖ'=>'ⱖ','Ⱗ'=>'ⱗ','Ⱘ'=>'ⱘ','Ⱙ'=>'ⱙ','Ⱚ'=>'ⱚ','Ⱛ'=>'ⱛ','Ⱜ'=>'ⱜ','Ⱝ'=>'ⱝ','Ⱞ'=>'ⱞ','Ⱡ'=>'ⱡ','Ɫ'=>'ɫ','Ᵽ'=>'ᵽ','Ɽ'=>'ɽ','Ⱨ'=>'ⱨ','Ⱪ'=>'ⱪ','Ⱬ'=>'ⱬ','Ⱶ'=>'ⱶ','Ⲁ'=>'ⲁ','Ⲃ'=>'ⲃ','Ⲅ'=>'ⲅ','Ⲇ'=>'ⲇ','Ⲉ'=>'ⲉ','Ⲋ'=>'ⲋ','Ⲍ'=>'ⲍ','Ⲏ'=>'ⲏ','Ⲑ'=>'ⲑ','Ⲓ'=>'ⲓ','Ⲕ'=>'ⲕ','Ⲗ'=>'ⲗ','Ⲙ'=>'ⲙ','Ⲛ'=>'ⲛ','Ⲝ'=>'ⲝ','Ⲟ'=>'ⲟ','Ⲡ'=>'ⲡ','Ⲣ'=>'ⲣ','Ⲥ'=>'ⲥ','Ⲧ'=>'ⲧ','Ⲩ'=>'ⲩ','Ⲫ'=>'ⲫ','Ⲭ'=>'ⲭ','Ⲯ'=>'ⲯ','Ⲱ'=>'ⲱ','Ⲳ'=>'ⲳ','Ⲵ'=>'ⲵ','Ⲷ'=>'ⲷ','Ⲹ'=>'ⲹ','Ⲻ'=>'ⲻ','Ⲽ'=>'ⲽ','Ⲿ'=>'ⲿ','Ⳁ'=>'ⳁ','Ⳃ'=>'ⳃ','Ⳅ'=>'ⳅ','Ⳇ'=>'ⳇ','Ⳉ'=>'ⳉ','Ⳋ'=>'ⳋ','Ⳍ'=>'ⳍ','Ⳏ'=>'ⳏ','Ⳑ'=>'ⳑ','Ⳓ'=>'ⳓ','Ⳕ'=>'ⳕ','Ⳗ'=>'ⳗ','Ⳙ'=>'ⳙ','Ⳛ'=>'ⳛ','Ⳝ'=>'ⳝ','Ⳟ'=>'ⳟ','Ⳡ'=>'ⳡ','Ⳣ'=>'ⳣ','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','𐐀'=>'𐐨','𐐁'=>'𐐩','𐐂'=>'𐐪','𐐃'=>'𐐫','𐐄'=>'𐐬','𐐅'=>'𐐭','𐐆'=>'𐐮','𐐇'=>'𐐯','𐐈'=>'𐐰','𐐉'=>'𐐱','𐐊'=>'𐐲','𐐋'=>'𐐳','𐐌'=>'𐐴','𐐍'=>'𐐵','𐐎'=>'𐐶','𐐏'=>'𐐷','𐐐'=>'𐐸','𐐑'=>'𐐹','𐐒'=>'𐐺','𐐓'=>'𐐻','𐐔'=>'𐐼','𐐕'=>'𐐽','𐐖'=>'𐐾','𐐗'=>'𐐿','𐐘'=>'𐑀','𐐙'=>'𐑁','𐐚'=>'𐑂','𐐛'=>'𐑃','𐐜'=>'𐑄','𐐝'=>'𐑅','𐐞'=>'𐑆','𐐟'=>'𐑇','𐐠'=>'𐑈','𐐡'=>'𐑉','𐐢'=>'𐑊','𐐣'=>'𐑋','𐐤'=>'𐑌','𐐥'=>'𐑍','𐐦'=>'𐑎','𐐧'=>'𐑏'); \ No newline at end of file
+<?php return array('A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','µ'=>'μ','À'=>'à','Á'=>'á','Â'=>'â','Ã'=>'ã','Ä'=>'ä','Å'=>'å','Æ'=>'æ','Ç'=>'ç','È'=>'è','É'=>'é','Ê'=>'ê','Ë'=>'ë','Ì'=>'ì','Í'=>'í','Î'=>'î','Ï'=>'ï','Ð'=>'ð','Ñ'=>'ñ','Ò'=>'ò','Ó'=>'ó','Ô'=>'ô','Õ'=>'õ','Ö'=>'ö','Ø'=>'ø','Ù'=>'ù','Ú'=>'ú','Û'=>'û','Ü'=>'ü','Ý'=>'ý','Þ'=>'þ','Ā'=>'ā','Ă'=>'ă','Ą'=>'ą','Ć'=>'ć','Ĉ'=>'ĉ','Ċ'=>'ċ','Č'=>'č','Ď'=>'ď','Đ'=>'đ','Ē'=>'ē','Ĕ'=>'ĕ','Ė'=>'ė','Ę'=>'ę','Ě'=>'ě','Ĝ'=>'ĝ','Ğ'=>'ğ','Ġ'=>'ġ','Ģ'=>'ģ','Ĥ'=>'ĥ','Ħ'=>'ħ','Ĩ'=>'ĩ','Ī'=>'ī','Ĭ'=>'ĭ','Į'=>'į','IJ'=>'ij','Ĵ'=>'ĵ','Ķ'=>'ķ','Ĺ'=>'ĺ','Ļ'=>'ļ','Ľ'=>'ľ','Ŀ'=>'ŀ','Ł'=>'ł','Ń'=>'ń','Ņ'=>'ņ','Ň'=>'ň','Ŋ'=>'ŋ','Ō'=>'ō','Ŏ'=>'ŏ','Ő'=>'ő','Œ'=>'œ','Ŕ'=>'ŕ','Ŗ'=>'ŗ','Ř'=>'ř','Ś'=>'ś','Ŝ'=>'ŝ','Ş'=>'ş','Š'=>'š','Ţ'=>'ţ','Ť'=>'ť','Ŧ'=>'ŧ','Ũ'=>'ũ','Ū'=>'ū','Ŭ'=>'ŭ','Ů'=>'ů','Ű'=>'ű','Ų'=>'ų','Ŵ'=>'ŵ','Ŷ'=>'ŷ','Ÿ'=>'ÿ','Ź'=>'ź','Ż'=>'ż','Ž'=>'ž','ſ'=>'s','Ɓ'=>'ɓ','Ƃ'=>'ƃ','Ƅ'=>'ƅ','Ɔ'=>'ɔ','Ƈ'=>'ƈ','Ɖ'=>'ɖ','Ɗ'=>'ɗ','Ƌ'=>'ƌ','Ǝ'=>'ǝ','Ə'=>'ə','Ɛ'=>'ɛ','Ƒ'=>'ƒ','Ɠ'=>'ɠ','Ɣ'=>'ɣ','Ɩ'=>'ɩ','Ɨ'=>'ɨ','Ƙ'=>'ƙ','Ɯ'=>'ɯ','Ɲ'=>'ɲ','Ɵ'=>'ɵ','Ơ'=>'ơ','Ƣ'=>'ƣ','Ƥ'=>'ƥ','Ʀ'=>'ʀ','Ƨ'=>'ƨ','Ʃ'=>'ʃ','Ƭ'=>'ƭ','Ʈ'=>'ʈ','Ư'=>'ư','Ʊ'=>'ʊ','Ʋ'=>'ʋ','Ƴ'=>'ƴ','Ƶ'=>'ƶ','Ʒ'=>'ʒ','Ƹ'=>'ƹ','Ƽ'=>'ƽ','DŽ'=>'dž','Dž'=>'dž','LJ'=>'lj','Lj'=>'lj','NJ'=>'nj','Nj'=>'nj','Ǎ'=>'ǎ','Ǐ'=>'ǐ','Ǒ'=>'ǒ','Ǔ'=>'ǔ','Ǖ'=>'ǖ','Ǘ'=>'ǘ','Ǚ'=>'ǚ','Ǜ'=>'ǜ','Ǟ'=>'ǟ','Ǡ'=>'ǡ','Ǣ'=>'ǣ','Ǥ'=>'ǥ','Ǧ'=>'ǧ','Ǩ'=>'ǩ','Ǫ'=>'ǫ','Ǭ'=>'ǭ','Ǯ'=>'ǯ','DZ'=>'dz','Dz'=>'dz','Ǵ'=>'ǵ','Ƕ'=>'ƕ','Ƿ'=>'ƿ','Ǹ'=>'ǹ','Ǻ'=>'ǻ','Ǽ'=>'ǽ','Ǿ'=>'ǿ','Ȁ'=>'ȁ','Ȃ'=>'ȃ','Ȅ'=>'ȅ','Ȇ'=>'ȇ','Ȉ'=>'ȉ','Ȋ'=>'ȋ','Ȍ'=>'ȍ','Ȏ'=>'ȏ','Ȑ'=>'ȑ','Ȓ'=>'ȓ','Ȕ'=>'ȕ','Ȗ'=>'ȗ','Ș'=>'ș','Ț'=>'ț','Ȝ'=>'ȝ','Ȟ'=>'ȟ','Ƞ'=>'ƞ','Ȣ'=>'ȣ','Ȥ'=>'ȥ','Ȧ'=>'ȧ','Ȩ'=>'ȩ','Ȫ'=>'ȫ','Ȭ'=>'ȭ','Ȯ'=>'ȯ','Ȱ'=>'ȱ','Ȳ'=>'ȳ','Ⱥ'=>'ⱥ','Ȼ'=>'ȼ','Ƚ'=>'ƚ','Ⱦ'=>'ⱦ','Ɂ'=>'ɂ','Ƀ'=>'ƀ','Ʉ'=>'ʉ','Ʌ'=>'ʌ','Ɇ'=>'ɇ','Ɉ'=>'ɉ','Ɋ'=>'ɋ','Ɍ'=>'ɍ','Ɏ'=>'ɏ','ͅ'=>'ι','Ά'=>'ά','Έ'=>'έ','Ή'=>'ή','Ί'=>'ί','Ό'=>'ό','Ύ'=>'ύ','Ώ'=>'ώ','Α'=>'α','Β'=>'β','Γ'=>'γ','Δ'=>'δ','Ε'=>'ε','Ζ'=>'ζ','Η'=>'η','Θ'=>'θ','Ι'=>'ι','Κ'=>'κ','Λ'=>'λ','Μ'=>'μ','Ν'=>'ν','Ξ'=>'ξ','Ο'=>'ο','Π'=>'π','Ρ'=>'ρ','Σ'=>'σ','Τ'=>'τ','Υ'=>'υ','Φ'=>'φ','Χ'=>'χ','Ψ'=>'ψ','Ω'=>'ω','Ϊ'=>'ϊ','Ϋ'=>'ϋ','ς'=>'σ','ϐ'=>'β','ϑ'=>'θ','ϕ'=>'φ','ϖ'=>'π','Ϙ'=>'ϙ','Ϛ'=>'ϛ','Ϝ'=>'ϝ','Ϟ'=>'ϟ','Ϡ'=>'ϡ','Ϣ'=>'ϣ','Ϥ'=>'ϥ','Ϧ'=>'ϧ','Ϩ'=>'ϩ','Ϫ'=>'ϫ','Ϭ'=>'ϭ','Ϯ'=>'ϯ','ϰ'=>'κ','ϱ'=>'ρ','ϴ'=>'θ','ϵ'=>'ε','Ϸ'=>'ϸ','Ϲ'=>'ϲ','Ϻ'=>'ϻ','Ͻ'=>'ͻ','Ͼ'=>'ͼ','Ͽ'=>'ͽ','Ѐ'=>'ѐ','Ё'=>'ё','Ђ'=>'ђ','Ѓ'=>'ѓ','Є'=>'є','Ѕ'=>'ѕ','І'=>'і','Ї'=>'ї','Ј'=>'ј','Љ'=>'љ','Њ'=>'њ','Ћ'=>'ћ','Ќ'=>'ќ','Ѝ'=>'ѝ','Ў'=>'ў','Џ'=>'џ','А'=>'а','Б'=>'б','В'=>'в','Г'=>'г','Д'=>'д','Е'=>'е','Ж'=>'ж','З'=>'з','И'=>'и','Й'=>'й','К'=>'к','Л'=>'л','М'=>'м','Н'=>'н','О'=>'о','П'=>'п','Р'=>'р','С'=>'с','Т'=>'т','У'=>'у','Ф'=>'ф','Х'=>'х','Ц'=>'ц','Ч'=>'ч','Ш'=>'ш','Щ'=>'щ','Ъ'=>'ъ','Ы'=>'ы','Ь'=>'ь','Э'=>'э','Ю'=>'ю','Я'=>'я','Ѡ'=>'ѡ','Ѣ'=>'ѣ','Ѥ'=>'ѥ','Ѧ'=>'ѧ','Ѩ'=>'ѩ','Ѫ'=>'ѫ','Ѭ'=>'ѭ','Ѯ'=>'ѯ','Ѱ'=>'ѱ','Ѳ'=>'ѳ','Ѵ'=>'ѵ','Ѷ'=>'ѷ','Ѹ'=>'ѹ','Ѻ'=>'ѻ','Ѽ'=>'ѽ','Ѿ'=>'ѿ','Ҁ'=>'ҁ','Ҋ'=>'ҋ','Ҍ'=>'ҍ','Ҏ'=>'ҏ','Ґ'=>'ґ','Ғ'=>'ғ','Ҕ'=>'ҕ','Җ'=>'җ','Ҙ'=>'ҙ','Қ'=>'қ','Ҝ'=>'ҝ','Ҟ'=>'ҟ','Ҡ'=>'ҡ','Ң'=>'ң','Ҥ'=>'ҥ','Ҧ'=>'ҧ','Ҩ'=>'ҩ','Ҫ'=>'ҫ','Ҭ'=>'ҭ','Ү'=>'ү','Ұ'=>'ұ','Ҳ'=>'ҳ','Ҵ'=>'ҵ','Ҷ'=>'ҷ','Ҹ'=>'ҹ','Һ'=>'һ','Ҽ'=>'ҽ','Ҿ'=>'ҿ','Ӏ'=>'ӏ','Ӂ'=>'ӂ','Ӄ'=>'ӄ','Ӆ'=>'ӆ','Ӈ'=>'ӈ','Ӊ'=>'ӊ','Ӌ'=>'ӌ','Ӎ'=>'ӎ','Ӑ'=>'ӑ','Ӓ'=>'ӓ','Ӕ'=>'ӕ','Ӗ'=>'ӗ','Ә'=>'ә','Ӛ'=>'ӛ','Ӝ'=>'ӝ','Ӟ'=>'ӟ','Ӡ'=>'ӡ','Ӣ'=>'ӣ','Ӥ'=>'ӥ','Ӧ'=>'ӧ','Ө'=>'ө','Ӫ'=>'ӫ','Ӭ'=>'ӭ','Ӯ'=>'ӯ','Ӱ'=>'ӱ','Ӳ'=>'ӳ','Ӵ'=>'ӵ','Ӷ'=>'ӷ','Ӹ'=>'ӹ','Ӻ'=>'ӻ','Ӽ'=>'ӽ','Ӿ'=>'ӿ','Ԁ'=>'ԁ','Ԃ'=>'ԃ','Ԅ'=>'ԅ','Ԇ'=>'ԇ','Ԉ'=>'ԉ','Ԋ'=>'ԋ','Ԍ'=>'ԍ','Ԏ'=>'ԏ','Ԑ'=>'ԑ','Ԓ'=>'ԓ','Ա'=>'ա','Բ'=>'բ','Գ'=>'գ','Դ'=>'դ','Ե'=>'ե','Զ'=>'զ','Է'=>'է','Ը'=>'ը','Թ'=>'թ','Ժ'=>'ժ','Ի'=>'ի','Լ'=>'լ','Խ'=>'խ','Ծ'=>'ծ','Կ'=>'կ','Հ'=>'հ','Ձ'=>'ձ','Ղ'=>'ղ','Ճ'=>'ճ','Մ'=>'մ','Յ'=>'յ','Ն'=>'ն','Շ'=>'շ','Ո'=>'ո','Չ'=>'չ','Պ'=>'պ','Ջ'=>'ջ','Ռ'=>'ռ','Ս'=>'ս','Վ'=>'վ','Տ'=>'տ','Ր'=>'ր','Ց'=>'ց','Ւ'=>'ւ','Փ'=>'փ','Ք'=>'ք','Օ'=>'օ','Ֆ'=>'ֆ','Ⴀ'=>'ⴀ','Ⴁ'=>'ⴁ','Ⴂ'=>'ⴂ','Ⴃ'=>'ⴃ','Ⴄ'=>'ⴄ','Ⴅ'=>'ⴅ','Ⴆ'=>'ⴆ','Ⴇ'=>'ⴇ','Ⴈ'=>'ⴈ','Ⴉ'=>'ⴉ','Ⴊ'=>'ⴊ','Ⴋ'=>'ⴋ','Ⴌ'=>'ⴌ','Ⴍ'=>'ⴍ','Ⴎ'=>'ⴎ','Ⴏ'=>'ⴏ','Ⴐ'=>'ⴐ','Ⴑ'=>'ⴑ','Ⴒ'=>'ⴒ','Ⴓ'=>'ⴓ','Ⴔ'=>'ⴔ','Ⴕ'=>'ⴕ','Ⴖ'=>'ⴖ','Ⴗ'=>'ⴗ','Ⴘ'=>'ⴘ','Ⴙ'=>'ⴙ','Ⴚ'=>'ⴚ','Ⴛ'=>'ⴛ','Ⴜ'=>'ⴜ','Ⴝ'=>'ⴝ','Ⴞ'=>'ⴞ','Ⴟ'=>'ⴟ','Ⴠ'=>'ⴠ','Ⴡ'=>'ⴡ','Ⴢ'=>'ⴢ','Ⴣ'=>'ⴣ','Ⴤ'=>'ⴤ','Ⴥ'=>'ⴥ','Ḁ'=>'ḁ','Ḃ'=>'ḃ','Ḅ'=>'ḅ','Ḇ'=>'ḇ','Ḉ'=>'ḉ','Ḋ'=>'ḋ','Ḍ'=>'ḍ','Ḏ'=>'ḏ','Ḑ'=>'ḑ','Ḓ'=>'ḓ','Ḕ'=>'ḕ','Ḗ'=>'ḗ','Ḙ'=>'ḙ','Ḛ'=>'ḛ','Ḝ'=>'ḝ','Ḟ'=>'ḟ','Ḡ'=>'ḡ','Ḣ'=>'ḣ','Ḥ'=>'ḥ','Ḧ'=>'ḧ','Ḩ'=>'ḩ','Ḫ'=>'ḫ','Ḭ'=>'ḭ','Ḯ'=>'ḯ','Ḱ'=>'ḱ','Ḳ'=>'ḳ','Ḵ'=>'ḵ','Ḷ'=>'ḷ','Ḹ'=>'ḹ','Ḻ'=>'ḻ','Ḽ'=>'ḽ','Ḿ'=>'ḿ','Ṁ'=>'ṁ','Ṃ'=>'ṃ','Ṅ'=>'ṅ','Ṇ'=>'ṇ','Ṉ'=>'ṉ','Ṋ'=>'ṋ','Ṍ'=>'ṍ','Ṏ'=>'ṏ','Ṑ'=>'ṑ','Ṓ'=>'ṓ','Ṕ'=>'ṕ','Ṗ'=>'ṗ','Ṙ'=>'ṙ','Ṛ'=>'ṛ','Ṝ'=>'ṝ','Ṟ'=>'ṟ','Ṡ'=>'ṡ','Ṣ'=>'ṣ','Ṥ'=>'ṥ','Ṧ'=>'ṧ','Ṩ'=>'ṩ','Ṫ'=>'ṫ','Ṭ'=>'ṭ','Ṯ'=>'ṯ','Ṱ'=>'ṱ','Ṳ'=>'ṳ','Ṵ'=>'ṵ','Ṷ'=>'ṷ','Ṹ'=>'ṹ','Ṻ'=>'ṻ','Ṽ'=>'ṽ','Ṿ'=>'ṿ','Ẁ'=>'ẁ','Ẃ'=>'ẃ','Ẅ'=>'ẅ','Ẇ'=>'ẇ','Ẉ'=>'ẉ','Ẋ'=>'ẋ','Ẍ'=>'ẍ','Ẏ'=>'ẏ','Ẑ'=>'ẑ','Ẓ'=>'ẓ','Ẕ'=>'ẕ','ẛ'=>'ṡ','Ạ'=>'ạ','Ả'=>'ả','Ấ'=>'ấ','Ầ'=>'ầ','Ẩ'=>'ẩ','Ẫ'=>'ẫ','Ậ'=>'ậ','Ắ'=>'ắ','Ằ'=>'ằ','Ẳ'=>'ẳ','Ẵ'=>'ẵ','Ặ'=>'ặ','Ẹ'=>'ẹ','Ẻ'=>'ẻ','Ẽ'=>'ẽ','Ế'=>'ế','Ề'=>'ề','Ể'=>'ể','Ễ'=>'ễ','Ệ'=>'ệ','Ỉ'=>'ỉ','Ị'=>'ị','Ọ'=>'ọ','Ỏ'=>'ỏ','Ố'=>'ố','Ồ'=>'ồ','Ổ'=>'ổ','Ỗ'=>'ỗ','Ộ'=>'ộ','Ớ'=>'ớ','Ờ'=>'ờ','Ở'=>'ở','Ỡ'=>'ỡ','Ợ'=>'ợ','Ụ'=>'ụ','Ủ'=>'ủ','Ứ'=>'ứ','Ừ'=>'ừ','Ử'=>'ử','Ữ'=>'ữ','Ự'=>'ự','Ỳ'=>'ỳ','Ỵ'=>'ỵ','Ỷ'=>'ỷ','Ỹ'=>'ỹ','Ἀ'=>'ἀ','Ἁ'=>'ἁ','Ἂ'=>'ἂ','Ἃ'=>'ἃ','Ἄ'=>'ἄ','Ἅ'=>'ἅ','Ἆ'=>'ἆ','Ἇ'=>'ἇ','Ἐ'=>'ἐ','Ἑ'=>'ἑ','Ἒ'=>'ἒ','Ἓ'=>'ἓ','Ἔ'=>'ἔ','Ἕ'=>'ἕ','Ἠ'=>'ἠ','Ἡ'=>'ἡ','Ἢ'=>'ἢ','Ἣ'=>'ἣ','Ἤ'=>'ἤ','Ἥ'=>'ἥ','Ἦ'=>'ἦ','Ἧ'=>'ἧ','Ἰ'=>'ἰ','Ἱ'=>'ἱ','Ἲ'=>'ἲ','Ἳ'=>'ἳ','Ἴ'=>'ἴ','Ἵ'=>'ἵ','Ἶ'=>'ἶ','Ἷ'=>'ἷ','Ὀ'=>'ὀ','Ὁ'=>'ὁ','Ὂ'=>'ὂ','Ὃ'=>'ὃ','Ὄ'=>'ὄ','Ὅ'=>'ὅ','Ὑ'=>'ὑ','Ὓ'=>'ὓ','Ὕ'=>'ὕ','Ὗ'=>'ὗ','Ὠ'=>'ὠ','Ὡ'=>'ὡ','Ὢ'=>'ὢ','Ὣ'=>'ὣ','Ὤ'=>'ὤ','Ὥ'=>'ὥ','Ὦ'=>'ὦ','Ὧ'=>'ὧ','Ᾰ'=>'ᾰ','Ᾱ'=>'ᾱ','Ὰ'=>'ὰ','Ά'=>'ά','ι'=>'ι','Ὲ'=>'ὲ','Έ'=>'έ','Ὴ'=>'ὴ','Ή'=>'ή','Ῐ'=>'ῐ','Ῑ'=>'ῑ','Ὶ'=>'ὶ','Ί'=>'ί','Ῠ'=>'ῠ','Ῡ'=>'ῡ','Ὺ'=>'ὺ','Ύ'=>'ύ','Ῥ'=>'ῥ','Ὸ'=>'ὸ','Ό'=>'ό','Ὼ'=>'ὼ','Ώ'=>'ώ','Ω'=>'ω','K'=>'k','Å'=>'å','Ⅎ'=>'ⅎ','Ⅰ'=>'ⅰ','Ⅱ'=>'ⅱ','Ⅲ'=>'ⅲ','Ⅳ'=>'ⅳ','Ⅴ'=>'ⅴ','Ⅵ'=>'ⅵ','Ⅶ'=>'ⅶ','Ⅷ'=>'ⅷ','Ⅸ'=>'ⅸ','Ⅹ'=>'ⅹ','Ⅺ'=>'ⅺ','Ⅻ'=>'ⅻ','Ⅼ'=>'ⅼ','Ⅽ'=>'ⅽ','Ⅾ'=>'ⅾ','Ⅿ'=>'ⅿ','Ↄ'=>'ↄ','Ⓐ'=>'ⓐ','Ⓑ'=>'ⓑ','Ⓒ'=>'ⓒ','Ⓓ'=>'ⓓ','Ⓔ'=>'ⓔ','Ⓕ'=>'ⓕ','Ⓖ'=>'ⓖ','Ⓗ'=>'ⓗ','Ⓘ'=>'ⓘ','Ⓙ'=>'ⓙ','Ⓚ'=>'ⓚ','Ⓛ'=>'ⓛ','Ⓜ'=>'ⓜ','Ⓝ'=>'ⓝ','Ⓞ'=>'ⓞ','Ⓟ'=>'ⓟ','Ⓠ'=>'ⓠ','Ⓡ'=>'ⓡ','Ⓢ'=>'ⓢ','Ⓣ'=>'ⓣ','Ⓤ'=>'ⓤ','Ⓥ'=>'ⓥ','Ⓦ'=>'ⓦ','Ⓧ'=>'ⓧ','Ⓨ'=>'ⓨ','Ⓩ'=>'ⓩ','Ⰰ'=>'ⰰ','Ⰱ'=>'ⰱ','Ⰲ'=>'ⰲ','Ⰳ'=>'ⰳ','Ⰴ'=>'ⰴ','Ⰵ'=>'ⰵ','Ⰶ'=>'ⰶ','Ⰷ'=>'ⰷ','Ⰸ'=>'ⰸ','Ⰹ'=>'ⰹ','Ⰺ'=>'ⰺ','Ⰻ'=>'ⰻ','Ⰼ'=>'ⰼ','Ⰽ'=>'ⰽ','Ⰾ'=>'ⰾ','Ⰿ'=>'ⰿ','Ⱀ'=>'ⱀ','Ⱁ'=>'ⱁ','Ⱂ'=>'ⱂ','Ⱃ'=>'ⱃ','Ⱄ'=>'ⱄ','Ⱅ'=>'ⱅ','Ⱆ'=>'ⱆ','Ⱇ'=>'ⱇ','Ⱈ'=>'ⱈ','Ⱉ'=>'ⱉ','Ⱊ'=>'ⱊ','Ⱋ'=>'ⱋ','Ⱌ'=>'ⱌ','Ⱍ'=>'ⱍ','Ⱎ'=>'ⱎ','Ⱏ'=>'ⱏ','Ⱐ'=>'ⱐ','Ⱑ'=>'ⱑ','Ⱒ'=>'ⱒ','Ⱓ'=>'ⱓ','Ⱔ'=>'ⱔ','Ⱕ'=>'ⱕ','Ⱖ'=>'ⱖ','Ⱗ'=>'ⱗ','Ⱘ'=>'ⱘ','Ⱙ'=>'ⱙ','Ⱚ'=>'ⱚ','Ⱛ'=>'ⱛ','Ⱜ'=>'ⱜ','Ⱝ'=>'ⱝ','Ⱞ'=>'ⱞ','Ⱡ'=>'ⱡ','Ɫ'=>'ɫ','Ᵽ'=>'ᵽ','Ɽ'=>'ɽ','Ⱨ'=>'ⱨ','Ⱪ'=>'ⱪ','Ⱬ'=>'ⱬ','Ⱶ'=>'ⱶ','Ⲁ'=>'ⲁ','Ⲃ'=>'ⲃ','Ⲅ'=>'ⲅ','Ⲇ'=>'ⲇ','Ⲉ'=>'ⲉ','Ⲋ'=>'ⲋ','Ⲍ'=>'ⲍ','Ⲏ'=>'ⲏ','Ⲑ'=>'ⲑ','Ⲓ'=>'ⲓ','Ⲕ'=>'ⲕ','Ⲗ'=>'ⲗ','Ⲙ'=>'ⲙ','Ⲛ'=>'ⲛ','Ⲝ'=>'ⲝ','Ⲟ'=>'ⲟ','Ⲡ'=>'ⲡ','Ⲣ'=>'ⲣ','Ⲥ'=>'ⲥ','Ⲧ'=>'ⲧ','Ⲩ'=>'ⲩ','Ⲫ'=>'ⲫ','Ⲭ'=>'ⲭ','Ⲯ'=>'ⲯ','Ⲱ'=>'ⲱ','Ⲳ'=>'ⲳ','Ⲵ'=>'ⲵ','Ⲷ'=>'ⲷ','Ⲹ'=>'ⲹ','Ⲻ'=>'ⲻ','Ⲽ'=>'ⲽ','Ⲿ'=>'ⲿ','Ⳁ'=>'ⳁ','Ⳃ'=>'ⳃ','Ⳅ'=>'ⳅ','Ⳇ'=>'ⳇ','Ⳉ'=>'ⳉ','Ⳋ'=>'ⳋ','Ⳍ'=>'ⳍ','Ⳏ'=>'ⳏ','Ⳑ'=>'ⳑ','Ⳓ'=>'ⳓ','Ⳕ'=>'ⳕ','Ⳗ'=>'ⳗ','Ⳙ'=>'ⳙ','Ⳛ'=>'ⳛ','Ⳝ'=>'ⳝ','Ⳟ'=>'ⳟ','Ⳡ'=>'ⳡ','Ⳣ'=>'ⳣ','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','𐐀'=>'𐐨','𐐁'=>'𐐩','𐐂'=>'𐐪','𐐃'=>'𐐫','𐐄'=>'𐐬','𐐅'=>'𐐭','𐐆'=>'𐐮','𐐇'=>'𐐯','𐐈'=>'𐐰','𐐉'=>'𐐱','𐐊'=>'𐐲','𐐋'=>'𐐳','𐐌'=>'𐐴','𐐍'=>'𐐵','𐐎'=>'𐐶','𐐏'=>'𐐷','𐐐'=>'𐐸','𐐑'=>'𐐹','𐐒'=>'𐐺','𐐓'=>'𐐻','𐐔'=>'𐐼','𐐕'=>'𐐽','𐐖'=>'𐐾','𐐗'=>'𐐿','𐐘'=>'𐑀','𐐙'=>'𐑁','𐐚'=>'𐑂','𐐛'=>'𐑃','𐐜'=>'𐑄','𐐝'=>'𐑅','𐐞'=>'𐑆','𐐟'=>'𐑇','𐐠'=>'𐑈','𐐡'=>'𐑉','𐐢'=>'𐑊','𐐣'=>'𐑋','𐐤'=>'𐑌','𐐥'=>'𐑍','𐐦'=>'𐑎','𐐧'=>'𐑏');
diff --git a/phpBB/includes/utf/data/case_fold_f.php b/phpBB/includes/utf/data/case_fold_f.php
index 7e2ffb25ec..5f2d88ec92 100644
--- a/phpBB/includes/utf/data/case_fold_f.php
+++ b/phpBB/includes/utf/data/case_fold_f.php
@@ -1 +1 @@
-<?php return array('ß'=>'ss','İ'=>'i̇','ʼn'=>'ʼn','ǰ'=>'ǰ','ΐ'=>'ΐ','ΰ'=>'ΰ','և'=>'եւ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'aʾ','ὐ'=>'ὐ','ὒ'=>'ὒ','ὔ'=>'ὔ','ὖ'=>'ὖ','ᾀ'=>'ἀι','ᾁ'=>'ἁι','ᾂ'=>'ἂι','ᾃ'=>'ἃι','ᾄ'=>'ἄι','ᾅ'=>'ἅι','ᾆ'=>'ἆι','ᾇ'=>'ἇι','ᾈ'=>'ἀι','ᾉ'=>'ἁι','ᾊ'=>'ἂι','ᾋ'=>'ἃι','ᾌ'=>'ἄι','ᾍ'=>'ἅι','ᾎ'=>'ἆι','ᾏ'=>'ἇι','ᾐ'=>'ἠι','ᾑ'=>'ἡι','ᾒ'=>'ἢι','ᾓ'=>'ἣι','ᾔ'=>'ἤι','ᾕ'=>'ἥι','ᾖ'=>'ἦι','ᾗ'=>'ἧι','ᾘ'=>'ἠι','ᾙ'=>'ἡι','ᾚ'=>'ἢι','ᾛ'=>'ἣι','ᾜ'=>'ἤι','ᾝ'=>'ἥι','ᾞ'=>'ἦι','ᾟ'=>'ἧι','ᾠ'=>'ὠι','ᾡ'=>'ὡι','ᾢ'=>'ὢι','ᾣ'=>'ὣι','ᾤ'=>'ὤι','ᾥ'=>'ὥι','ᾦ'=>'ὦι','ᾧ'=>'ὧι','ᾨ'=>'ὠι','ᾩ'=>'ὡι','ᾪ'=>'ὢι','ᾫ'=>'ὣι','ᾬ'=>'ὤι','ᾭ'=>'ὥι','ᾮ'=>'ὦι','ᾯ'=>'ὧι','ᾲ'=>'ὰι','ᾳ'=>'αι','ᾴ'=>'άι','ᾶ'=>'ᾶ','ᾷ'=>'ᾶι','ᾼ'=>'αι','ῂ'=>'ὴι','ῃ'=>'ηι','ῄ'=>'ήι','ῆ'=>'ῆ','ῇ'=>'ῆι','ῌ'=>'ηι','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῦ'=>'ῦ','ῧ'=>'ῧ','ῲ'=>'ὼι','ῳ'=>'ωι','ῴ'=>'ώι','ῶ'=>'ῶ','ῷ'=>'ῶι','ῼ'=>'ωι','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'st','st'=>'st','ﬓ'=>'մն','ﬔ'=>'մե','ﬕ'=>'մի','ﬖ'=>'վն','ﬗ'=>'մխ'); \ No newline at end of file
+<?php return array('ß'=>'ss','İ'=>'i̇','ʼn'=>'ʼn','ǰ'=>'ǰ','ΐ'=>'ΐ','ΰ'=>'ΰ','և'=>'եւ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'aʾ','ὐ'=>'ὐ','ὒ'=>'ὒ','ὔ'=>'ὔ','ὖ'=>'ὖ','ᾀ'=>'ἀι','ᾁ'=>'ἁι','ᾂ'=>'ἂι','ᾃ'=>'ἃι','ᾄ'=>'ἄι','ᾅ'=>'ἅι','ᾆ'=>'ἆι','ᾇ'=>'ἇι','ᾈ'=>'ἀι','ᾉ'=>'ἁι','ᾊ'=>'ἂι','ᾋ'=>'ἃι','ᾌ'=>'ἄι','ᾍ'=>'ἅι','ᾎ'=>'ἆι','ᾏ'=>'ἇι','ᾐ'=>'ἠι','ᾑ'=>'ἡι','ᾒ'=>'ἢι','ᾓ'=>'ἣι','ᾔ'=>'ἤι','ᾕ'=>'ἥι','ᾖ'=>'ἦι','ᾗ'=>'ἧι','ᾘ'=>'ἠι','ᾙ'=>'ἡι','ᾚ'=>'ἢι','ᾛ'=>'ἣι','ᾜ'=>'ἤι','ᾝ'=>'ἥι','ᾞ'=>'ἦι','ᾟ'=>'ἧι','ᾠ'=>'ὠι','ᾡ'=>'ὡι','ᾢ'=>'ὢι','ᾣ'=>'ὣι','ᾤ'=>'ὤι','ᾥ'=>'ὥι','ᾦ'=>'ὦι','ᾧ'=>'ὧι','ᾨ'=>'ὠι','ᾩ'=>'ὡι','ᾪ'=>'ὢι','ᾫ'=>'ὣι','ᾬ'=>'ὤι','ᾭ'=>'ὥι','ᾮ'=>'ὦι','ᾯ'=>'ὧι','ᾲ'=>'ὰι','ᾳ'=>'αι','ᾴ'=>'άι','ᾶ'=>'ᾶ','ᾷ'=>'ᾶι','ᾼ'=>'αι','ῂ'=>'ὴι','ῃ'=>'ηι','ῄ'=>'ήι','ῆ'=>'ῆ','ῇ'=>'ῆι','ῌ'=>'ηι','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῦ'=>'ῦ','ῧ'=>'ῧ','ῲ'=>'ὼι','ῳ'=>'ωι','ῴ'=>'ώι','ῶ'=>'ῶ','ῷ'=>'ῶι','ῼ'=>'ωι','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'st','st'=>'st','ﬓ'=>'մն','ﬔ'=>'մե','ﬕ'=>'մի','ﬖ'=>'վն','ﬗ'=>'մխ');
diff --git a/phpBB/includes/utf/data/case_fold_s.php b/phpBB/includes/utf/data/case_fold_s.php
index 5f09ffa1dd..4ee5d8dc69 100644
--- a/phpBB/includes/utf/data/case_fold_s.php
+++ b/phpBB/includes/utf/data/case_fold_s.php
@@ -1 +1 @@
-<?php return array('ᾈ'=>'ᾀ','ᾉ'=>'ᾁ','ᾊ'=>'ᾂ','ᾋ'=>'ᾃ','ᾌ'=>'ᾄ','ᾍ'=>'ᾅ','ᾎ'=>'ᾆ','ᾏ'=>'ᾇ','ᾘ'=>'ᾐ','ᾙ'=>'ᾑ','ᾚ'=>'ᾒ','ᾛ'=>'ᾓ','ᾜ'=>'ᾔ','ᾝ'=>'ᾕ','ᾞ'=>'ᾖ','ᾟ'=>'ᾗ','ᾨ'=>'ᾠ','ᾩ'=>'ᾡ','ᾪ'=>'ᾢ','ᾫ'=>'ᾣ','ᾬ'=>'ᾤ','ᾭ'=>'ᾥ','ᾮ'=>'ᾦ','ᾯ'=>'ᾧ','ᾼ'=>'ᾳ','ῌ'=>'ῃ','ῼ'=>'ῳ'); \ No newline at end of file
+<?php return array('ᾈ'=>'ᾀ','ᾉ'=>'ᾁ','ᾊ'=>'ᾂ','ᾋ'=>'ᾃ','ᾌ'=>'ᾄ','ᾍ'=>'ᾅ','ᾎ'=>'ᾆ','ᾏ'=>'ᾇ','ᾘ'=>'ᾐ','ᾙ'=>'ᾑ','ᾚ'=>'ᾒ','ᾛ'=>'ᾓ','ᾜ'=>'ᾔ','ᾝ'=>'ᾕ','ᾞ'=>'ᾖ','ᾟ'=>'ᾗ','ᾨ'=>'ᾠ','ᾩ'=>'ᾡ','ᾪ'=>'ᾢ','ᾫ'=>'ᾣ','ᾬ'=>'ᾤ','ᾭ'=>'ᾥ','ᾮ'=>'ᾦ','ᾯ'=>'ᾧ','ᾼ'=>'ᾳ','ῌ'=>'ῃ','ῼ'=>'ῳ');
diff --git a/phpBB/includes/utf/data/confusables.php b/phpBB/includes/utf/data/confusables.php
index 7564978a26..767d242948 100644
--- a/phpBB/includes/utf/data/confusables.php
+++ b/phpBB/includes/utf/data/confusables.php
@@ -1 +1 @@
-<?php return array('¡'=>'i','ǃ'=>'!','α'=>'a',' '=>' ','­'=>'','۝'=>'','܏'=>'','᠆'=>'','᠎'=>'','​'=>'','‌'=>'','‍'=>'','
'=>'','
'=>'','⁠'=>'','⁡'=>'','⁢'=>'','⁣'=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'','𝅳'=>'','𝅴'=>'','𝅵'=>'','𝅶'=>'','𝅷'=>'','𝅸'=>'','𝅹'=>'','𝅺'=>'','۬'=>'۟','̓'=>'̓','ُ'=>'̓','֜'=>'́','́'=>'́','݇'=>'́','॔'=>'́','̀'=>'̀','॓'=>'̀','̌'=>'̆','̑'=>'̂','֯'=>'̊','ஂ'=>'̊','ํ'=>'̊','ໍ'=>'̊','ံ'=>'̊','ំ'=>'̊','៓'=>'̊','゚'=>'̊','゚'=>'̊','ͦ'=>'̊','͂'=>'̃','ׄ'=>'̇','ֹ'=>'̇','ׂ'=>'̇','ׁ'=>'̇','݁'=>'̇','ं'=>'̇','ਂ'=>'̇','ં'=>'̇','்'=>'̇','̅'=>'̄','〬'=>'̉','̱'=>'̠','॒'=>'̠','̧'=>'̡','̦'=>'̡','̨'=>'̢','़'=>'̣','়'=>'̣','਼'=>'̣','઼'=>'̣','଼'=>'̣','͇'=>'̳','̶'=>'̵','ﱞ'=>'ﹲّ','ﱟ'=>'ﹴّ','ﳲ'=>'ﹷّ','ﱠ'=>'ﹶّ','ﳳ'=>'ﹹّ','ﱡ'=>'ﹸّ','ﳴ'=>'ﹻّ','ﱢ'=>'ﹺّ','ﱣ'=>'ﹼٰ','ٴ'=>'ٔ','݂'=>'ܼ','౦'=>'o','೦'=>'o','゙'=>'゙',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','`'=>'`','`'=>'`','῀'=>'˜','^'=>'^','︿'=>'^','_'=>'_','﹍'=>'_','﹎'=>'_','﹏'=>'_','⌇'=>'︴','-'=>'-','‐'=>'-','‑'=>'-','‒'=>'-','–'=>'-','﹘'=>'-','∼'=>'⁓','・'=>'・','•'=>'・',','=>',','‚'=>',','٬'=>'،','、'=>'、',';'=>';',';'=>';',':'=>':','։'=>':','︰'=>':','׃'=>':','⩴'=>'::=','.'=>'.','․'=>'.','܂'=>'.','‥'=>'..','…'=>'...','。'=>'。','·'=>'·','‧'=>'·','∙'=>'·','⋅'=>'·','ᐧ'=>'·','ᔯ'=>'·4','ᐌ'=>'·ᐁ','ᐎ'=>'·ᐃ','ᐐ'=>'·ᐄ','ᐒ'=>'·ᐅ','ᐔ'=>'·ᐆ','ᐗ'=>'·ᐊ','ᐙ'=>'·ᐋ','ᐷ'=>'·ᐳ','ᑀ'=>'·ᐳ','ᑂ'=>'·ᐴ','ᑄ'=>'·ᐸ','ᑆ'=>'·ᐹ','ᑗ'=>'·ᑌ','ᑙ'=>'·ᑎ','ᑛ'=>'·ᑏ','ᑔ'=>'·ᑐ','ᑝ'=>'·ᑐ','ᑟ'=>'·ᑑ','ᑡ'=>'·ᑕ','ᑣ'=>'·ᑖ','ᑴ'=>'·ᑫ','ᑸ'=>'·ᑮ','ᑼ'=>'·ᑰ','ᑾ'=>'·ᑲ','ᒀ'=>'·ᑳ','ᒒ'=>'·ᒉ','ᒔ'=>'·ᒋ','ᒖ'=>'·ᒌ','ᒚ'=>'·ᒎ','ᒜ'=>'·ᒐ','ᒞ'=>'·ᒑ','ᒬ'=>'·ᒣ','ᒮ'=>'·ᒥ','ᒰ'=>'·ᒦ','ᒲ'=>'·ᒧ','ᒴ'=>'·ᒨ','ᒶ'=>'·L','ᒸ'=>'·ᒫ','ᓉ'=>'·ᓀ','ᓋ'=>'·ᓇ','ᓍ'=>'·ᓈ','ᓜ'=>'·ᓓ','ᓞ'=>'·ᓕ','ᓠ'=>'·ᓖ','ᓢ'=>'·ᓗ','ᓤ'=>'·ᓘ','ᓦ'=>'·ᓚ','ᓨ'=>'·ᓛ','ᓶ'=>'·ᓭ','ᓸ'=>'·ᓯ','ᓺ'=>'·ᓰ','ᓼ'=>'·ᓱ','ᓾ'=>'·ᓲ','ᔀ'=>'·ᓴ','ᔂ'=>'·ᓵ','ᔗ'=>'·ᔐ','ᔙ'=>'·ᔑ','ᔛ'=>'·ᔒ','ᔝ'=>'·ᔓ','ᔟ'=>'·ᔔ','ᔡ'=>'·ᔕ','ᔣ'=>'·ᔖ','ᔱ'=>'·ᔨ','ᔳ'=>'·ᔩ','ᔵ'=>'·ᔪ','ᔷ'=>'·ᔫ','ᔹ'=>'·ᔭ','ᔻ'=>'·ᔮ','ᕎ'=>'·ᕌ','ᕛ'=>'·ᕚ','ᕨ'=>'·ᕧ','('=>'(','⑴'=>'(1)','⒧'=>'(l)','⑽'=>'(10)','⑾'=>'(11)','⑿'=>'(12)','⒀'=>'(13)','⒁'=>'(14)','⒂'=>'(15)','⒃'=>'(16)','⒄'=>'(17)','⒅'=>'(18)','⒆'=>'(19)','⑵'=>'(2)','⒇'=>'(20)','⑶'=>'(3)','⑷'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','⑻'=>'(8)','⑼'=>'(9)','⒜'=>'(a)','⒝'=>'(b)','⒞'=>'(c)','⒟'=>'(d)','⒠'=>'(e)','⒡'=>'(f)','⒢'=>'(g)','⒣'=>'(h)','⒤'=>'(i)','⒥'=>'(j)','⒦'=>'(k)','⒨'=>'(m)','⒩'=>'(n)','⒪'=>'(o)','⒫'=>'(p)','⒬'=>'(q)','⒭'=>'(r)','⒮'=>'(s)','⒯'=>'(t)','⒰'=>'(u)','⒱'=>'(v)','⒲'=>'(w)','⒳'=>'(x)','⒴'=>'(y)','⒵'=>'(z)','㈀'=>'(ᄀ)','㈎'=>'(가)','㈁'=>'(ᄂ)','㈏'=>'(나)','㈂'=>'(ᄃ)','㈐'=>'(다)','㈃'=>'(ᄅ)','㈑'=>'(라)','㈄'=>'(ᄆ)','㈒'=>'(마)','㈅'=>'(ᄇ)','㈓'=>'(바)','㈆'=>'(ᄉ)','㈔'=>'(사)','㈇'=>'(ᄋ)','㈕'=>'(아)','㈝'=>'(오전)','㈞'=>'(오후)','㈈'=>'(ᄌ)','㈖'=>'(자)','㈜'=>'(주)','㈉'=>'(ᄎ)','㈗'=>'(차)','㈊'=>'(ᄏ)','㈘'=>'(카)','㈋'=>'(ᄐ)','㈙'=>'(타)','㈌'=>'(ᄑ)','㈚'=>'(파)','㈍'=>'(ᄒ)','㈛'=>'(하)','㈠'=>'(一)','㈦'=>'(七)','㈢'=>'(三)','㈨'=>'(九)','㈡'=>'(二)','㈤'=>'(五)','㈹'=>'(代)','㈽'=>'(企)','㉁'=>'(休)','㈧'=>'(八)','㈥'=>'(六)','㈸'=>'(労)','㈩'=>'(十)','㈿'=>'(協)','㈴'=>'(名)','㈺'=>'(呼)','㈣'=>'(四)','㈯'=>'(土)','㈻'=>'(学)','㈰'=>'(日)','㈪'=>'(月)','㈲'=>'(有)','㈭'=>'(木)','㈱'=>'(株)','㈬'=>'(水)','㈫'=>'(火)','㈵'=>'(特)','㈼'=>'(監)','㈳'=>'(社)','㈷'=>'(祝)','㉀'=>'(祭)','㉂'=>'(自)','㉃'=>'(至)','㈶'=>'(財)','㈾'=>'(資)','㈮'=>'(金)',')'=>')','['=>'[','〔'=>'[',']'=>']','〕'=>']','{'=>'{','}'=>'}','⦅'=>'⦅','⦆'=>'⦆','「'=>'「','」'=>'」','@'=>'@','*'=>'*','/'=>'/','⁄'=>'/','∕'=>'/','\'=>'\\','&'=>'&','#'=>'#','%'=>'%','‶'=>'‵‵','‷'=>'‵‵‵','༌'=>'་','´'=>'ʹ','΄'=>'ʹ','´'=>'ʹ','\''=>'ʹ','''=>'ʹ','′'=>'ʹ','׳'=>'ʹ','ʹ'=>'ʹ','ˊ'=>'ʹ','"'=>'ʹʹ','"'=>'ʹʹ','″'=>'ʹʹ','〃'=>'ʹʹ','״'=>'ʹʹ','ʺ'=>'ʹʹ','‴'=>'ʹʹʹ','⁗'=>'ʹʹʹʹ','¯'=>'ˉ',' ̄'=>'ˉ','‾'=>'ˉ','﹉'=>'ˉ','﹊'=>'ˉ','﹋'=>'ˉ','﹌'=>'ˉ','˚'=>'°','௵'=>'௳','←'=>'←','→'=>'→','↑'=>'↑','↓'=>'↓','↵'=>'↲','⨡'=>'↾','𝛛'=>'∂','𝜕'=>'∂','𝝏'=>'∂','𝞉'=>'∂','𝟃'=>'∂','𝛁'=>'∇','𝛻'=>'∇','𝜵'=>'∇','𝝯'=>'∇','𝞩'=>'∇','+'=>'+','﬩'=>'+','‹'=>'<','<'=>'<','='=>'=','⩵'=>'==','⩶'=>'===','›'=>'>','>'=>'>','¬'=>'¬','¦'=>'¦','〜'=>'~','~'=>'~','﹨'=>'∖','⋀'=>'∧','⋁'=>'∨','⋂'=>'∩','⋃'=>'∪','∯'=>'∮∮','∰'=>'∮∮∮','≣'=>'≡','♁'=>'⊕','☉'=>'⊙','⟂'=>'⊥','▷'=>'⊲','⨝'=>'⋈','⨽'=>'⌙','☸'=>'⎈','⎮'=>'⎥','│'=>'│','▐'=>'▌','■'=>'■','☐'=>'□','○'=>'○','⦾'=>'◎','〛'=>'⟧','〈'=>'⟨','〈'=>'⟨','〉'=>'⟩','〉'=>'⟩','⧙'=>'⦚','〶'=>'〒','ー'=>'ー','¢'=>'¢','$'=>'$','£'=>'£','¥'=>'Y̵','₩'=>'W̵','0'=>'0','𝟎'=>'0','𝟘'=>'0','𝟢'=>'0','𝟬'=>'0','𝟶'=>'0','০'=>'0','୦'=>'0','௦'=>'0','᠐'=>'0','〇'=>'0','𝐎'=>'0','𝑂'=>'0','𝑶'=>'0','𝒪'=>'0','𝓞'=>'0','𝔒'=>'0','𝕆'=>'0','𝕺'=>'0','𝖮'=>'0','𝗢'=>'0','𝘖'=>'0','𝙊'=>'0','𝙾'=>'0','𝚶'=>'0','𝛰'=>'0','𝜪'=>'0','𝝤'=>'0','𝞞'=>'0','ⵔ'=>'0','ഠ'=>'0','⊖'=>'0̵','𝚯'=>'0̵','𝚹'=>'0̵','𝛩'=>'0̵','𝛳'=>'0̵','𝜣'=>'0̵','𝜭'=>'0̵','𝝝'=>'0̵','𝝧'=>'0̵','𝞗'=>'0̵','𝞡'=>'0̵','ⴱ'=>'0̵','Ꮎ'=>'0̵','۰'=>'٠','᭜'=>'᭐','㍘'=>'0点','1'=>'1','𝟏'=>'1','𝟙'=>'1','𝟣'=>'1','𝟭'=>'1','𝟷'=>'1','ℐ'=>'1','ℑ'=>'1','𝐈'=>'1','𝐼'=>'1','𝑰'=>'1','𝓘'=>'1','𝕀'=>'1','𝕴'=>'1','𝖨'=>'1','𝗜'=>'1','𝘐'=>'1','𝙄'=>'1','𝙸'=>'1','l'=>'l','l'=>'l','ⅼ'=>'1','ℓ'=>'l','𝐥'=>'l','𝑙'=>'l','𝒍'=>'l','𝓁'=>'l','𝓵'=>'l','𝔩'=>'l','𝕝'=>'l','𝖑'=>'l','𝗅'=>'l','𝗹'=>'l','𝘭'=>'l','𝙡'=>'l','𝚕'=>'l','𝚰'=>'l','𝛪'=>'l','𝜤'=>'l','𝝞'=>'l','𝞘'=>'l','①'=>'➀','ɭ'=>'l̢','ɫ'=>'l̴','ƚ'=>'l̵','ł'=>'l̷','۱'=>'١','⒈'=>'1.','ŀ'=>'l·','ᒷ'=>'1·','⑩'=>'➉','⒑'=>'10.','㏩'=>'10日','㋉'=>'10月','㍢'=>'10点','⒒'=>'11.','㏪'=>'11日','㋊'=>'11月','㍣'=>'11点','⒓'=>'12.','㏫'=>'12日','㋋'=>'12月','㍤'=>'12点','⒔'=>'13.','㏬'=>'13日','㍥'=>'13点','⒕'=>'14.','㏭'=>'14日','㍦'=>'14点','⒖'=>'15.','㏮'=>'15日','㍧'=>'15点','⒗'=>'16.','㏯'=>'16日','㍨'=>'16点','⒘'=>'17.','㏰'=>'17日','㍩'=>'17点','⒙'=>'18.','㏱'=>'18日','㍪'=>'18点','⒚'=>'19.','㏲'=>'19日','㍫'=>'19点','lj'=>'lj','㏠'=>'1日','㋀'=>'1月','㍙'=>'1点','2'=>'2','𝟐'=>'2','𝟚'=>'2','𝟤'=>'2','𝟮'=>'2','𝟸'=>'2','ᒿ'=>'2','②'=>'➁','۲'=>'٢','⒉'=>'2.','⒛'=>'20.','㏳'=>'20日','㍬'=>'20点','㏴'=>'21日','㍭'=>'21点','㏵'=>'22日','㍮'=>'22点','㏶'=>'23日','㍯'=>'23点','㏷'=>'24日','㍰'=>'24点','㏸'=>'25日','㏹'=>'26日','㏺'=>'27日','㏻'=>'28日','㏼'=>'29日','㏡'=>'2日','㋁'=>'2月','㍚'=>'2点','3'=>'3','𝟑'=>'3','𝟛'=>'3','𝟥'=>'3','𝟯'=>'3','𝟹'=>'3','③'=>'➂','۳'=>'٣','⒊'=>'3.','㏽'=>'30日','㏾'=>'31日','㏢'=>'3日','㋂'=>'3月','㍛'=>'3点','4'=>'4','𝟒'=>'4','𝟜'=>'4','𝟦'=>'4','𝟰'=>'4','𝟺'=>'4','Ꮞ'=>'4','④'=>'➃','⒋'=>'4.','ᔰ'=>'4·','㏣'=>'4日','㋃'=>'4月','㍜'=>'4点','5'=>'5','𝟓'=>'5','𝟝'=>'5','𝟧'=>'5','𝟱'=>'5','𝟻'=>'5','⑤'=>'➄','⒌'=>'5.','㏤'=>'5日','㋄'=>'5月','㍝'=>'5点','6'=>'6','𝟔'=>'6','𝟞'=>'6','𝟨'=>'6','𝟲'=>'6','𝟼'=>'6','б'=>'6','⑥'=>'➅','⒍'=>'6.','㏥'=>'6日','㋅'=>'6月','㍞'=>'6点','7'=>'7','𝟕'=>'7','𝟟'=>'7','𝟩'=>'7','𝟳'=>'7','𝟽'=>'7','⑦'=>'➆','۷'=>'٧','⒎'=>'7.','㏦'=>'7日','㋆'=>'7月','㍟'=>'7点','ଃ'=>'8','৪'=>'8','੪'=>'8','8'=>'8','𝟖'=>'8','𝟠'=>'8','𝟪'=>'8','𝟴'=>'8','𝟾'=>'8','ȣ'=>'8','⑧'=>'➇','۸'=>'٨','⒏'=>'8.','㏧'=>'8日','㋇'=>'8月','㍠'=>'8点','੧'=>'9','୨'=>'9','৭'=>'9','9'=>'9','𝟗'=>'9','𝟡'=>'9','𝟫'=>'9','𝟵'=>'9','𝟿'=>'9','⑨'=>'➈','۹'=>'٩','⒐'=>'9.','㏨'=>'9日','㋈'=>'9月','㍡'=>'9点','a'=>'a','𝐚'=>'a','𝑎'=>'a','𝒂'=>'a','𝒶'=>'a','𝓪'=>'a','𝔞'=>'a','𝕒'=>'a','𝖆'=>'a','𝖺'=>'a','𝗮'=>'a','𝘢'=>'a','𝙖'=>'a','𝚊'=>'a','℀'=>'a/c','℁'=>'a/s','æ'=>'ae','b'=>'b','𝐛'=>'b','𝑏'=>'b','𝒃'=>'b','𝒷'=>'b','𝓫'=>'b','𝔟'=>'b','𝕓'=>'b','𝖇'=>'b','𝖻'=>'b','𝗯'=>'b','𝘣'=>'b','𝙗'=>'b','𝚋'=>'b','ɓ'=>'b̔','ƃ'=>'b̄','ƀ'=>'b̵','c'=>'c','ⅽ'=>'c','𝐜'=>'c','𝑐'=>'c','𝒄'=>'c','𝒸'=>'c','𝓬'=>'c','𝔠'=>'c','𝕔'=>'c','𝖈'=>'c','𝖼'=>'c','𝗰'=>'c','𝘤'=>'c','𝙘'=>'c','𝚌'=>'c','𝛓'=>'c','𝜍'=>'c','𝝇'=>'c','𝞁'=>'c','𝞻'=>'c','℅'=>'c/o','℆'=>'c/u','d'=>'d','ⅾ'=>'d','ⅆ'=>'d','𝐝'=>'d','𝑑'=>'d','𝒅'=>'d','𝒹'=>'d','𝓭'=>'d','𝔡'=>'d','𝕕'=>'d','𝖉'=>'d','𝖽'=>'d','𝗱'=>'d','𝘥'=>'d','𝙙'=>'d','𝚍'=>'d','ɗ'=>'d̔','ƌ'=>'d̄','ɖ'=>'d̢','đ'=>'d̵','dz'=>'dz','dž'=>'dž','e'=>'e','ℯ'=>'e','ⅇ'=>'e','𝐞'=>'e','𝑒'=>'e','𝒆'=>'e','𝓮'=>'e','𝔢'=>'e','𝕖'=>'e','𝖊'=>'e','𝖾'=>'e','𝗲'=>'e','𝘦'=>'e','𝙚'=>'e','𝚎'=>'e','ⴹ'=>'E','ə'=>'ǝ','ɚ'=>'ǝ˞','⋴'=>'ɛ','𝛆'=>'ɛ','𝛜'=>'ɛ','𝜀'=>'ɛ','𝜖'=>'ɛ','𝜺'=>'ɛ','𝝐'=>'ɛ','𝝴'=>'ɛ','𝞊'=>'ɛ','𝞮'=>'ɛ','𝟄'=>'ɛ','f'=>'f','𝐟'=>'f','𝑓'=>'f','𝒇'=>'f','𝒻'=>'f','𝓯'=>'f','𝔣'=>'f','𝕗'=>'f','𝖋'=>'f','𝖿'=>'f','𝗳'=>'f','𝘧'=>'f','𝙛'=>'f','𝚏'=>'f','ƒ'=>'f̡','g'=>'g','ℊ'=>'g','𝐠'=>'g','𝑔'=>'g','𝒈'=>'g','𝓰'=>'g','𝔤'=>'g','𝕘'=>'g','𝖌'=>'g','𝗀'=>'g','𝗴'=>'g','𝘨'=>'g','𝙜'=>'g','𝚐'=>'g','ɡ'=>'g','ɠ'=>'g̔','ǥ'=>'g̵','h'=>'h','ℎ'=>'h','𝐡'=>'h','𝒉'=>'h','𝒽'=>'h','𝓱'=>'h','𝔥'=>'h','𝕙'=>'h','𝖍'=>'h','𝗁'=>'h','𝗵'=>'h','𝘩'=>'h','𝙝'=>'h','𝚑'=>'h','ɦ'=>'h̔','ħ'=>'h̵','ℏ'=>'h̵','῾'=>'ʻ','‘'=>'ʻ','‛'=>'ʻ','ʽ'=>'ʻ','⍳'=>'i','i'=>'i','ⅰ'=>'i','ℹ'=>'i','ⅈ'=>'i','𝐢'=>'i','𝑖'=>'i','𝒊'=>'i','𝒾'=>'i','𝓲'=>'i','𝔦'=>'i','𝕚'=>'i','𝖎'=>'i','𝗂'=>'i','𝗶'=>'i','𝘪'=>'i','𝙞'=>'i','𝚒'=>'i','ı'=>'i','𝚤'=>'i','ɪ'=>'i','ɩ'=>'i','𝛊'=>'i','𝜄'=>'i','𝜾'=>'i','𝝸'=>'i','𝞲'=>'i','ɨ'=>'i̵','ⅱ'=>'ii','ⅲ'=>'iii','ij'=>'ij','ⅳ'=>'iv','ⅸ'=>'ix','j'=>'j','ⅉ'=>'j','𝐣'=>'j','𝑗'=>'j','𝒋'=>'j','𝒿'=>'j','𝓳'=>'j','𝔧'=>'j','𝕛'=>'j','𝖏'=>'j','𝗃'=>'j','𝗷'=>'j','𝘫'=>'j','𝙟'=>'j','𝚓'=>'j','ϳ'=>'j','𝚥'=>'ȷ','k'=>'k','𝐤'=>'k','𝑘'=>'k','𝒌'=>'k','𝓀'=>'k','𝓴'=>'k','𝔨'=>'k','𝕜'=>'k','𝖐'=>'k','𝗄'=>'k','𝗸'=>'k','𝘬'=>'k','𝙠'=>'k','𝚔'=>'k','ƙ'=>'k̔','m'=>'m','ⅿ'=>'m','𝐦'=>'m','𝑚'=>'m','𝒎'=>'m','𝓂'=>'m','𝓶'=>'m','𝔪'=>'m','𝕞'=>'m','𝖒'=>'m','𝗆'=>'m','𝗺'=>'m','𝘮'=>'m','𝙢'=>'m','𝚖'=>'m','ɱ'=>'m̡','n'=>'n','𝐧'=>'n','𝑛'=>'n','𝒏'=>'n','𝓃'=>'n','𝓷'=>'n','𝔫'=>'n','𝕟'=>'n','𝖓'=>'n','𝗇'=>'n','𝗻'=>'n','𝘯'=>'n','𝙣'=>'n','𝚗'=>'n','𝐍'=>'N','𝑁'=>'N','𝑵'=>'N','𝒩'=>'N','𝓝'=>'N','𝔑'=>'N','𝕹'=>'N','𝖭'=>'N','𝗡'=>'N','𝘕'=>'N','𝙉'=>'N','𝙽'=>'N','𝚴'=>'N','𝛮'=>'N','𝜨'=>'N','𝝢'=>'N','𝞜'=>'N','ɲ'=>'ņ','ɳ'=>'n̢','ƞ'=>'n̩','𝛈'=>'n̩','𝜂'=>'n̩','𝜼'=>'n̩','𝝶'=>'n̩','𝞰'=>'n̩','nj'=>'nj','o'=>'o','ℴ'=>'o','𝐨'=>'o','𝑜'=>'o','𝒐'=>'o','𝓸'=>'o','𝔬'=>'o','𝕠'=>'o','𝖔'=>'o','𝗈'=>'o','𝗼'=>'o','𝘰'=>'o','𝙤'=>'o','𝚘'=>'o','ᴏ'=>'o','𝛐'=>'o','𝜊'=>'o','𝝄'=>'o','𝝾'=>'o','𝞸'=>'o','ɵ'=>'o̵','ǿ'=>'ó̵','ø'=>'o̷','œ'=>'oe','ơ'=>'oʼ','⍴'=>'p','p'=>'p','𝐩'=>'p','𝑝'=>'p','𝒑'=>'p','𝓅'=>'p','𝓹'=>'p','𝔭'=>'p','𝕡'=>'p','𝖕'=>'p','𝗉'=>'p','𝗽'=>'p','𝘱'=>'p','𝙥'=>'p','𝚙'=>'p','𝛒'=>'p','𝛠'=>'p','𝜌'=>'p','𝜚'=>'p','𝝆'=>'p','𝝔'=>'p','𝞀'=>'p','𝞎'=>'p','𝞺'=>'p','𝟈'=>'p','ƥ'=>'p̔','q'=>'q','𝐪'=>'q','𝑞'=>'q','𝒒'=>'q','𝓆'=>'q','𝓺'=>'q','𝔮'=>'q','𝕢'=>'q','𝖖'=>'q','𝗊'=>'q','𝗾'=>'q','𝘲'=>'q','𝙦'=>'q','𝚚'=>'q','𝐐'=>'Q','𝑄'=>'Q','𝑸'=>'Q','𝒬'=>'Q','𝓠'=>'Q','𝔔'=>'Q','𝕼'=>'Q','𝖰'=>'Q','𝗤'=>'Q','𝘘'=>'Q','𝙌'=>'Q','𝚀'=>'Q','ʠ'=>'q̔','𝛋'=>'ĸ','𝛞'=>'ĸ','𝜅'=>'ĸ','𝜘'=>'ĸ','𝜿'=>'ĸ','𝝒'=>'ĸ','𝝹'=>'ĸ','𝞌'=>'ĸ','𝞳'=>'ĸ','𝟆'=>'ĸ','r'=>'r','𝐫'=>'r','𝑟'=>'r','𝒓'=>'r','𝓇'=>'r','𝓻'=>'r','𝔯'=>'r','𝕣'=>'r','𝖗'=>'r','𝗋'=>'r','𝗿'=>'r','𝘳'=>'r','𝙧'=>'r','𝚛'=>'r','ɽ'=>'r̢','ɼ'=>'r̩','s'=>'s','𝐬'=>'s','𝑠'=>'s','𝒔'=>'s','𝓈'=>'s','𝓼'=>'s','𝔰'=>'s','𝕤'=>'s','𝖘'=>'s','𝗌'=>'s','𝘀'=>'s','𝘴'=>'s','𝙨'=>'s','𝚜'=>'s','ƽ'=>'s','ʂ'=>'s̢','∫'=>'ʃ','∬'=>'ʃʃ','∭'=>'ʃʃʃ','⨌'=>'ʃʃʃʃ','t'=>'t','𝐭'=>'t','𝑡'=>'t','𝒕'=>'t','𝓉'=>'t','𝓽'=>'t','𝔱'=>'t','𝕥'=>'t','𝖙'=>'t','𝗍'=>'t','𝘁'=>'t','𝘵'=>'t','𝙩'=>'t','𝚝'=>'t','𝑇'=>'T','𝑻'=>'T','𝒯'=>'T','𝓣'=>'T','𝔗'=>'T','𝕋'=>'T','𝕿'=>'T','𝖳'=>'T','𝗧'=>'T','𝘛'=>'T','𝙏'=>'T','𝚃'=>'T','𝚻'=>'T','𝛵'=>'T','𝜯'=>'T','𝝩'=>'T','𝞣'=>'T','ƭ'=>'t̔','ț'=>'ţ','ƫ'=>'ţ','ŧ'=>'t̵','u'=>'u','𝐮'=>'u','𝑢'=>'u','𝒖'=>'u','𝓊'=>'u','𝓾'=>'u','𝔲'=>'u','𝕦'=>'u','𝖚'=>'u','𝗎'=>'u','𝘂'=>'u','𝘶'=>'u','𝙪'=>'u','𝚞'=>'u','ʊ'=>'u','ʋ'=>'u','𝛖'=>'u','𝜐'=>'u','𝝊'=>'u','𝞄'=>'u','𝞾'=>'u','𝑈'=>'U','𝑼'=>'U','𝒰'=>'U','𝓤'=>'U','𝔘'=>'U','𝕌'=>'U','𝖀'=>'U','𝖴'=>'U','𝗨'=>'U','𝘜'=>'U','𝙐'=>'U','𝚄'=>'U','v'=>'v','ⅴ'=>'v','𝐯'=>'v','𝑣'=>'v','𝒗'=>'v','𝓋'=>'v','𝓿'=>'v','𝔳'=>'v','𝕧'=>'v','𝖛'=>'v','𝗏'=>'v','𝘃'=>'v','𝘷'=>'v','𝙫'=>'v','𝚟'=>'v','𝛎'=>'v','𝜈'=>'v','𝝂'=>'v','𝝼'=>'v','𝞶'=>'v','ⅵ'=>'vi','ⅶ'=>'vii','ⅷ'=>'viii','ɯ'=>'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','×'=>'x','x'=>'x','ⅹ'=>'x','𝐱'=>'x','𝑥'=>'x','𝒙'=>'x','𝓍'=>'x','𝔁'=>'x','𝔵'=>'x','𝕩'=>'x','𝖝'=>'x','𝗑'=>'x','𝘅'=>'x','𝘹'=>'x','𝙭'=>'x','𝚡'=>'x','᙭'=>'X','𝑋'=>'X','𝑿'=>'X','𝒳'=>'X','𝓧'=>'X','𝔛'=>'X','𝕏'=>'X','𝖃'=>'X','𝖷'=>'X','𝗫'=>'X','𝘟'=>'X','𝙓'=>'X','𝚇'=>'X','𝚾'=>'X','𝛸'=>'X','𝜲'=>'X','𝝬'=>'X','𝞦'=>'X','ⅺ'=>'xi','ⅻ'=>'xii','y'=>'y','𝐲'=>'y','𝑦'=>'y','𝒚'=>'y','𝓎'=>'y','𝔂'=>'y','𝔶'=>'y','𝕪'=>'y','𝖞'=>'y','𝗒'=>'y','𝘆'=>'y','𝘺'=>'y','𝙮'=>'y','𝚢'=>'y','ƴ'=>'y̔','z'=>'z','𝐳'=>'z','𝑧'=>'z','𝒛'=>'z','𝓏'=>'z','𝔃'=>'z','𝔷'=>'z','𝕫'=>'z','𝖟'=>'z','𝗓'=>'z','𝘇'=>'z','𝘻'=>'z','𝙯'=>'z','𝚣'=>'z','ȥ'=>'z̡','ʐ'=>'z̢','ƶ'=>'z̵','ȝ'=>'ʒ','?'=>'ʔ','?'=>'ʔ','⁇'=>'ʔʔ','⁈'=>'ʔǃ','᾽'=>'ʼ','᾿'=>'ʼ','’'=>'ʼ','ʾ'=>'ʼ','!'=>'ǃ','!'=>'ǃ','⁉'=>'ǃʔ','‼'=>'ǃǃ','⍺'=>'α','𝛂'=>'α','𝛼'=>'α','𝜶'=>'α','𝝰'=>'α','𝞪'=>'α','𝛃'=>'β','𝛽'=>'β','𝜷'=>'β','𝝱'=>'β','𝞫'=>'β','ℽ'=>'γ','𝛄'=>'γ','𝛾'=>'γ','𝜸'=>'γ','𝝲'=>'γ','𝞬'=>'γ','𝛅'=>'δ','𝛿'=>'δ','𝜹'=>'δ','𝝳'=>'δ','𝞭'=>'δ','𝟋'=>'ϝ','𝛇'=>'ζ','𝜁'=>'ζ','𝜻'=>'ζ','𝝵'=>'ζ','𝞯'=>'ζ','⍬'=>'θ','𝛉'=>'θ','𝛝'=>'θ','𝜃'=>'θ','𝜗'=>'θ','𝜽'=>'θ','𝝑'=>'θ','𝝷'=>'θ','𝞋'=>'θ','𝞱'=>'θ','𝟅'=>'θ','𝛌'=>'λ','𝜆'=>'λ','𝝀'=>'λ','𝝺'=>'λ','𝞴'=>'λ','𝛬'=>'Λ','𝜦'=>'Λ','𝝠'=>'Λ','𝞚'=>'Λ','𝛍'=>'μ','𝜇'=>'μ','𝝁'=>'μ','𝝻'=>'μ','𝞵'=>'μ','𝛏'=>'ξ','𝜉'=>'ξ','𝝃'=>'ξ','𝝽'=>'ξ','𝞷'=>'ξ','𝛯'=>'Ξ','𝜩'=>'Ξ','𝝣'=>'Ξ','𝞝'=>'Ξ','ℼ'=>'π','𝛑'=>'π','𝛡'=>'π','𝜋'=>'π','𝜛'=>'π','𝝅'=>'π','𝝕'=>'π','𝝿'=>'π','𝞏'=>'π','𝞹'=>'π','𝟉'=>'π','ᴨ'=>'π','∏'=>'Π','𝚷'=>'Π','𝛱'=>'Π','𝜫'=>'Π','𝝥'=>'Π','𝞟'=>'Π','𝛔'=>'σ','𝜎'=>'σ','𝝈'=>'σ','𝞂'=>'σ','𝞼'=>'σ','𝛕'=>'τ','𝜏'=>'τ','𝝉'=>'τ','𝞃'=>'τ','𝞽'=>'τ','𝐘'=>'Y','𝑌'=>'Y','𝒀'=>'Y','𝒴'=>'Y','𝓨'=>'Y','𝔜'=>'Y','𝕐'=>'Y','𝖄'=>'Y','𝖸'=>'Y','𝗬'=>'Y','𝘠'=>'Y','𝙔'=>'Y','𝚈'=>'Y','𝚼'=>'Y','𝛶'=>'Y','𝜰'=>'Y','𝝪'=>'Y','𝞤'=>'Y','𝛗'=>'φ','𝛟'=>'φ','𝜑'=>'φ','𝜙'=>'φ','𝝋'=>'φ','𝝓'=>'φ','𝞅'=>'φ','𝞍'=>'φ','𝞿'=>'φ','𝟇'=>'φ','𝛷'=>'Φ','𝜱'=>'Φ','𝝫'=>'Φ','𝞥'=>'Φ','𝛘'=>'χ','𝜒'=>'χ','𝝌'=>'χ','𝞆'=>'χ','𝟀'=>'χ','𝛙'=>'ψ','𝜓'=>'ψ','𝝍'=>'ψ','𝞇'=>'ψ','𝟁'=>'ψ','𝛹'=>'Ψ','𝜳'=>'Ψ','𝝭'=>'Ψ','𝞧'=>'Ψ','⍵'=>'ω','𝛚'=>'ω','𝜔'=>'ω','𝝎'=>'ω','𝞈'=>'ω','𝟂'=>'ω','ӕ'=>'ae','ғ'=>'r̵','ґ'=>'rᑊ','җ'=>'ж̩','ҙ'=>'з̡','ӏ'=>'i','ҋ'=>'й̡','қ'=>'ĸ̩','ҟ'=>'ĸ̵','ᴫ'=>'л','ӆ'=>'л̡','ӎ'=>'м̡','ӊ'=>'н̡','ӈ'=>'н̡','ң'=>'н̩','ө'=>'o̵','ѳ'=>'o̵','ҫ'=>'c̡','ҭ'=>'т̩','ү'=>'y','ұ'=>'y̵','ћ'=>'h̵','ѽ'=>'ѡ҃','ӌ'=>'ҷ','ҿ'=>'ҽ̢','ҍ'=>'Ь̵','զ'=>'q','ռ'=>'n','ℵ'=>'א','ﬡ'=>'א','אָ'=>'אַ','אּ'=>'אַ','ﭏ'=>'אל','ℶ'=>'ב','ℷ'=>'ג','ℸ'=>'ד','ﬢ'=>'ד','ﬣ'=>'ה','ﬤ'=>'כ','ﬥ'=>'ל','ﬦ'=>'ם','ﬠ'=>'ע','ﬧ'=>'ר','ﬨ'=>'ת','ﺀ'=>'ء','ﺂ'=>'آ','ﺁ'=>'آ','ﺄ'=>'أ','ﺃ'=>'أ','ٵ'=>'أ','ﭑ'=>'ٱ','ﭐ'=>'ٱ','ﺆ'=>'ؤ','ﺅ'=>'ؤ','ٶ'=>'ؤ','ﺈ'=>'إ','ﺇ'=>'إ','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺊ'=>'ئ','ﺉ'=>'ئ','ﯫ'=>'ئا','ﯪ'=>'ئا','ﯸ'=>'ئٻ','ﯷ'=>'ئٻ','ﯶ'=>'ئٻ','ﲗ'=>'ئج','ﰀ'=>'ئج','ﲘ'=>'ئح','ﰁ'=>'ئح','ﲙ'=>'ئخ','ﱤ'=>'ئر','ﱥ'=>'ئز','ﲚ'=>'ئم','ﳟ'=>'ئم','ﱦ'=>'ئم','ﰂ'=>'ئم','ﱧ'=>'ئن','ﲛ'=>'ئه','ﳠ'=>'ئه','ﯭ'=>'ئه','ﯬ'=>'ئه','ﯯ'=>'ئو','ﯮ'=>'ئو','ﯳ'=>'ئۆ','ﯲ'=>'ئۆ','ﯱ'=>'ئۇ','ﯰ'=>'ئۇ','ﯵ'=>'ئۈ','ﯴ'=>'ئۈ','ﯻ'=>'ئى','ﯺ'=>'ئى','ﱨ'=>'ئى','ﯹ'=>'ئى','ﰃ'=>'ئى','ﱩ'=>'ئى','ﰄ'=>'ئى','ﺎ'=>'ا','ﺍ'=>'ا','ﴼ'=>'اً','ﴽ'=>'اً','ﷳ'=>'اكبر','ﷲ'=>'الله','ﺑ'=>'ب','ﺒ'=>'ب','ﺐ'=>'ب','ﺏ'=>'ب','ﲜ'=>'بج','ﰅ'=>'بج','ﲝ'=>'بح','ﰆ'=>'بح','ﷂ'=>'بحى','ﲞ'=>'بخ','ﰇ'=>'بخ','ﶞ'=>'بخى','ﱪ'=>'بر','ﱫ'=>'بز','ﲟ'=>'بم','ﳡ'=>'بم','ﱬ'=>'بم','ﰈ'=>'بم','ﱭ'=>'بن','ﲠ'=>'به','ﳢ'=>'به','ﱮ'=>'بى','ﰉ'=>'بى','ﱯ'=>'بى','ﰊ'=>'بى','ﭔ'=>'ٻ','ﭕ'=>'ٻ','ﭓ'=>'ٻ','ﭒ'=>'ٻ','ې'=>'ٻ','ﯦ'=>'ٻ','ﯧ'=>'ٻ','ﯥ'=>'ٻ','ﯤ'=>'ٻ','ﭘ'=>'پ','ﭙ'=>'پ','ﭗ'=>'پ','ﭖ'=>'پ','ﭜ'=>'ڀ','ﭝ'=>'ڀ','ﭛ'=>'ڀ','ﭚ'=>'ڀ','ﺔ'=>'ة','ﺓ'=>'ة','ﺗ'=>'ت','ﺘ'=>'ت','ﺖ'=>'ت','ﺕ'=>'ت','ﲡ'=>'تج','ﰋ'=>'تج','ﵐ'=>'تجم','ﶠ'=>'تجى','ﶟ'=>'تجى','ﲢ'=>'تح','ﰌ'=>'تح','ﵒ'=>'تحج','ﵑ'=>'تحج','ﵓ'=>'تحم','ﲣ'=>'تخ','ﰍ'=>'تخ','ﵔ'=>'تخم','ﶢ'=>'تخى','ﶡ'=>'تخى','ﱰ'=>'تر','ﱱ'=>'تز','ﲤ'=>'تم','ﳣ'=>'تم','ﱲ'=>'تم','ﰎ'=>'تم','ﵕ'=>'تمج','ﵖ'=>'تمح','ﵗ'=>'تمخ','ﶤ'=>'تمى','ﶣ'=>'تمى','ﱳ'=>'تن','ﲥ'=>'ته','ﳤ'=>'ته','ﱴ'=>'تى','ﰏ'=>'تى','ﱵ'=>'تى','ﰐ'=>'تى','ﺛ'=>'ث','ﺜ'=>'ث','ﺚ'=>'ث','ﺙ'=>'ث','ﰑ'=>'ثج','ﱶ'=>'ثر','ﱷ'=>'ثز','ﲦ'=>'ثم','ﳥ'=>'ثم','ﱸ'=>'ثم','ﰒ'=>'ثم','ﱹ'=>'ثن','ﳦ'=>'ثه','ﱺ'=>'ثى','ﰓ'=>'ثى','ﱻ'=>'ثى','ﰔ'=>'ثى','ﭨ'=>'ٹ','ﭩ'=>'ٹ','ﭧ'=>'ٹ','ﭦ'=>'ٹ','ڻ'=>'ٹ','ﮢ'=>'ٹ','ﮣ'=>'ٹ','ﮡ'=>'ٹ','ﮠ'=>'ٹ','ﭠ'=>'ٺ','ﭡ'=>'ٺ','ﭟ'=>'ٺ','ﭞ'=>'ٺ','ﭤ'=>'ٿ','ﭥ'=>'ٿ','ﭣ'=>'ٿ','ﭢ'=>'ٿ','ﺟ'=>'ج','ﺠ'=>'ج','ﺞ'=>'ج','ﺝ'=>'ج','ﲧ'=>'جح','ﰕ'=>'جح','ﶦ'=>'جحى','ﶾ'=>'جحى','ﷻ'=>'جل جلاله','ﲨ'=>'جم','ﰖ'=>'جم','ﵙ'=>'جمح','ﵘ'=>'جمح','ﶧ'=>'جمى','ﶥ'=>'جمى','ﴝ'=>'جى','ﴁ'=>'جى','ﴞ'=>'جى','ﴂ'=>'جى','ﭸ'=>'ڃ','ﭹ'=>'ڃ','ﭷ'=>'ڃ','ﭶ'=>'ڃ','ﭴ'=>'ڄ','ﭵ'=>'ڄ','ﭳ'=>'ڄ','ﭲ'=>'ڄ','ﭼ'=>'چ','ﭽ'=>'چ','ﭻ'=>'چ','ﭺ'=>'چ','ﮀ'=>'ڇ','ﮁ'=>'ڇ','ﭿ'=>'ڇ','ﭾ'=>'ڇ','ﺣ'=>'ح','ﺤ'=>'ح','ﺢ'=>'ح','ﺡ'=>'ح','ﲩ'=>'حج','ﰗ'=>'حج','ﶿ'=>'حجى','ﲪ'=>'حم','ﰘ'=>'حم','ﵛ'=>'حمى','ﵚ'=>'حمى','ﴛ'=>'حى','ﳿ'=>'حى','ﴜ'=>'حى','ﴀ'=>'حى','ﺧ'=>'خ','ﺨ'=>'خ','ﺦ'=>'خ','ﺥ'=>'خ','ﲫ'=>'خج','ﰙ'=>'خج','ﰚ'=>'خح','ﲬ'=>'خم','ﰛ'=>'خم','ﴟ'=>'خى','ﴃ'=>'خى','ﴠ'=>'خى','ﴄ'=>'خى','ﺪ'=>'د','ﺩ'=>'د','ﺬ'=>'ذ','ﺫ'=>'ذ','ﱛ'=>'ذٰ','ﮉ'=>'ڈ','ﮈ'=>'ڈ','ﮅ'=>'ڌ','ﮄ'=>'ڌ','ﮃ'=>'ڍ','ﮂ'=>'ڍ','ﮇ'=>'ڎ','ﮆ'=>'ڎ','ﺮ'=>'ر','ﺭ'=>'ر','ﱜ'=>'رٰ','ﷶ'=>'رسول','﷼'=>'رىال','ﺰ'=>'ز','ﺯ'=>'ز','ﮍ'=>'ڑ','ﮌ'=>'ڑ','ﮋ'=>'ژ','ﮊ'=>'ژ','ﺳ'=>'س','ﺴ'=>'س','ﺲ'=>'س','ﺱ'=>'س','ﲭ'=>'سج','ﴴ'=>'سج','ﰜ'=>'سج','ﵝ'=>'سجح','ﵞ'=>'سجى','ﲮ'=>'سح','ﴵ'=>'سح','ﰝ'=>'سح','ﵜ'=>'سحج','ﲯ'=>'سخ','ﴶ'=>'سخ','ﰞ'=>'سخ','ﶨ'=>'سخى','ﷆ'=>'سخى','ﴪ'=>'سر','ﴎ'=>'سر','ﲰ'=>'سم','ﳧ'=>'سم','ﰟ'=>'سم','ﵡ'=>'سمج','ﵠ'=>'سمح','ﵟ'=>'سمح','ﵣ'=>'سمم','ﵢ'=>'سمم','ﴱ'=>'سه','ﳨ'=>'سه','ﴗ'=>'سى','ﳻ'=>'سى','ﴘ'=>'سى','ﳼ'=>'سى','ﺷ'=>'ش','ﺸ'=>'ش','ﺶ'=>'ش','ﺵ'=>'ش','ﴭ'=>'شج','ﴷ'=>'شج','ﴥ'=>'شج','ﴉ'=>'شج','ﵩ'=>'شجى','ﴮ'=>'شح','ﴸ'=>'شح','ﴦ'=>'شح','ﴊ'=>'شح','ﵨ'=>'شحم','ﵧ'=>'شحم','ﶪ'=>'شحى','ﴯ'=>'شخ','ﴹ'=>'شخ','ﴧ'=>'شخ','ﴋ'=>'شخ','ﴩ'=>'شر','ﴍ'=>'شر','ﴰ'=>'شم','ﳩ'=>'شم','ﴨ'=>'شم','ﴌ'=>'شم','ﵫ'=>'شمخ','ﵪ'=>'شمخ','ﵭ'=>'شمم','ﵬ'=>'شمم','ﴲ'=>'شه','ﳪ'=>'شه','ﴙ'=>'شى','ﳽ'=>'شى','ﴚ'=>'شى','ﳾ'=>'شى','ﺻ'=>'ص','ﺼ'=>'ص','ﺺ'=>'ص','ﺹ'=>'ص','ﲱ'=>'صح','ﰠ'=>'صح','ﵥ'=>'صحح','ﵤ'=>'صحح','ﶩ'=>'صحى','ﲲ'=>'صخ','ﴫ'=>'صر','ﴏ'=>'صر','ﷵ'=>'صلعم','ﷹ'=>'صلى','ﷺ'=>'صلى الله علىه وسلم','ﷰ'=>'صلے','ﲳ'=>'صم','ﰡ'=>'صم','ﷅ'=>'صمم','ﵦ'=>'صمم','ﴡ'=>'صى','ﴅ'=>'صى','ﴢ'=>'صى','ﴆ'=>'صى','ﺿ'=>'ض','ﻀ'=>'ض','ﺾ'=>'ض','ﺽ'=>'ض','ﲴ'=>'ضج','ﰢ'=>'ضج','ﲵ'=>'ضح','ﰣ'=>'ضح','ﵮ'=>'ضحى','ﶫ'=>'ضحى','ﲶ'=>'ضخ','ﰤ'=>'ضخ','ﵰ'=>'ضخم','ﵯ'=>'ضخم','ﴬ'=>'ضر','ﴐ'=>'ضر','ﲷ'=>'ضم','ﰥ'=>'ضم','ﴣ'=>'ضى','ﴇ'=>'ضى','ﴤ'=>'ضى','ﴈ'=>'ضى','ﻃ'=>'ط','ﻄ'=>'ط','ﻂ'=>'ط','ﻁ'=>'ط','ﲸ'=>'طح','ﰦ'=>'طح','ﴳ'=>'طم','ﴺ'=>'طم','ﰧ'=>'طم','ﵲ'=>'طمح','ﵱ'=>'طمح','ﵳ'=>'طمم','ﵴ'=>'طمى','ﴑ'=>'طى','ﳵ'=>'طى','ﴒ'=>'طى','ﳶ'=>'طى','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻆ'=>'ظ','ﻅ'=>'ظ','ﲹ'=>'ظم','ﴻ'=>'ظم','ﰨ'=>'ظم','ﻋ'=>'ع','ﻌ'=>'ع','ﻊ'=>'ع','ﻉ'=>'ع','ﲺ'=>'عج','ﰩ'=>'عج','ﷄ'=>'عجم','ﵵ'=>'عجم','ﷷ'=>'علىه','ﲻ'=>'عم','ﰪ'=>'عم','ﵷ'=>'عمم','ﵶ'=>'عمم','ﵸ'=>'عمى','ﶶ'=>'عمى','ﴓ'=>'عى','ﳷ'=>'عى','ﴔ'=>'عى','ﳸ'=>'عى','ﻏ'=>'غ','ﻐ'=>'غ','ﻎ'=>'غ','ﻍ'=>'غ','ﲼ'=>'غج','ﰫ'=>'غج','ﲽ'=>'غم','ﰬ'=>'غم','ﵹ'=>'غمم','ﵻ'=>'غمى','ﵺ'=>'غمى','ﴕ'=>'غى','ﳹ'=>'غى','ﴖ'=>'غى','ﳺ'=>'غى','ﻓ'=>'ف','ﻔ'=>'ف','ﻒ'=>'ف','ﻑ'=>'ف','ﲾ'=>'فج','ﰭ'=>'فج','ﲿ'=>'فح','ﰮ'=>'فح','ﳀ'=>'فخ','ﰯ'=>'فخ','ﵽ'=>'فخم','ﵼ'=>'فخم','ﳁ'=>'فم','ﰰ'=>'فم','ﷁ'=>'فمى','ﱼ'=>'فى','ﰱ'=>'فى','ﱽ'=>'فى','ﰲ'=>'فى','ﭬ'=>'ڤ','ﭭ'=>'ڤ','ﭫ'=>'ڤ','ﭪ'=>'ڤ','ﭰ'=>'ڦ','ﭱ'=>'ڦ','ﭯ'=>'ڦ','ﭮ'=>'ڦ','ﻗ'=>'ق','ﻘ'=>'ق','ﻖ'=>'ق','ﻕ'=>'ق','ﳂ'=>'قح','ﰳ'=>'قح','ﷱ'=>'قلے','ﳃ'=>'قم','ﰴ'=>'قم','ﶴ'=>'قمح','ﵾ'=>'قمح','ﵿ'=>'قمم','ﶲ'=>'قمى','ﱾ'=>'قى','ﰵ'=>'قى','ﱿ'=>'قى','ﰶ'=>'قى','ﻛ'=>'ك','ﻜ'=>'ك','ﻚ'=>'ك','ﻙ'=>'ك','ک'=>'ك','ﮐ'=>'ك','ﮑ'=>'ك','ﮏ'=>'ك','ﮎ'=>'ك','ﲀ'=>'كا','ﰷ'=>'كا','ﳄ'=>'كج','ﰸ'=>'كج','ﳅ'=>'كح','ﰹ'=>'كح','ﳆ'=>'كخ','ﰺ'=>'كخ','ﳇ'=>'كل','ﳫ'=>'كل','ﲁ'=>'كل','ﰻ'=>'كل','ﳈ'=>'كم','ﳬ'=>'كم','ﲂ'=>'كم','ﰼ'=>'كم','ﷃ'=>'كمم','ﶻ'=>'كمم','ﶷ'=>'كمى','ﲃ'=>'كى','ﰽ'=>'كى','ﲄ'=>'كى','ﰾ'=>'كى','ﯕ'=>'ڭ','ﯖ'=>'ڭ','ﯔ'=>'ڭ','ﯓ'=>'ڭ','ﮔ'=>'گ','ﮕ'=>'گ','ﮓ'=>'گ','ﮒ'=>'گ','ﮜ'=>'ڱ','ﮝ'=>'ڱ','ﮛ'=>'ڱ','ﮚ'=>'ڱ','ﮘ'=>'ڳ','ﮙ'=>'ڳ','ﮗ'=>'ڳ','ﮖ'=>'ڳ','ﻟ'=>'ل','ﻠ'=>'ل','ﻞ'=>'ل','ﻝ'=>'ل','ﻶ'=>'لآ','ﻵ'=>'لآ','ﻸ'=>'لأ','ﻷ'=>'لأ','ﻺ'=>'لإ','ﻹ'=>'لإ','ﻼ'=>'لا','ﻻ'=>'لا','ﳉ'=>'لج','ﰿ'=>'لج','ﶃ'=>'لجج','ﶄ'=>'لجج','ﶺ'=>'لجم','ﶼ'=>'لجم','ﶬ'=>'لجى','ﳊ'=>'لح','ﱀ'=>'لح','ﶵ'=>'لحم','ﶀ'=>'لحم','ﶂ'=>'لحى','ﶁ'=>'لحى','ﳋ'=>'لخ','ﱁ'=>'لخ','ﶆ'=>'لخم','ﶅ'=>'لخم','ﳌ'=>'لم','ﳭ'=>'لم','ﲅ'=>'لم','ﱂ'=>'لم','ﶈ'=>'لمح','ﶇ'=>'لمح','ﶭ'=>'لمى','ﳍ'=>'له','ﲆ'=>'لى','ﱃ'=>'لى','ﲇ'=>'لى','ﱄ'=>'لى','ﻣ'=>'م','ﻤ'=>'م','ﻢ'=>'م','ﻡ'=>'م','ﲈ'=>'ما','ﳎ'=>'مج','ﱅ'=>'مج','ﶌ'=>'مجح','ﶒ'=>'مجخ','ﶍ'=>'مجم','ﷀ'=>'مجى','ﳏ'=>'مح','ﱆ'=>'مح','ﶉ'=>'محج','ﶊ'=>'محم','ﷴ'=>'محمد','ﶋ'=>'محى','ﳐ'=>'مخ','ﱇ'=>'مخ','ﶎ'=>'مخج','ﶏ'=>'مخم','ﶹ'=>'مخى','ﳑ'=>'مم','ﲉ'=>'مم','ﱈ'=>'مم','ﶱ'=>'ممى','ﱉ'=>'مى','ﱊ'=>'مى','ﻧ'=>'ن','ﻨ'=>'ن','ﻦ'=>'ن','ﻥ'=>'ن','ﳒ'=>'نج','ﱋ'=>'نج','ﶸ'=>'نجح','ﶽ'=>'نجح','ﶘ'=>'نجم','ﶗ'=>'نجم','ﶙ'=>'نجى','ﷇ'=>'نجى','ﳓ'=>'نح','ﱌ'=>'نح','ﶕ'=>'نحم','ﶖ'=>'نحى','ﶳ'=>'نحى','ﳔ'=>'نخ','ﱍ'=>'نخ','ﲊ'=>'نر','ﲋ'=>'نز','ﳕ'=>'نم','ﳮ'=>'نم','ﲌ'=>'نم','ﱎ'=>'نم','ﶛ'=>'نمى','ﶚ'=>'نمى','ﲍ'=>'نن','ﳖ'=>'نه','ﳯ'=>'نه','ﲎ'=>'نى','ﱏ'=>'نى','ﲏ'=>'نى','ﱐ'=>'نى','ﮟ'=>'ں','ﮞ'=>'ں','ﻫ'=>'ه','ﻬ'=>'ه','ﻪ'=>'ه','ﻩ'=>'ه','ھ'=>'ه','ﮬ'=>'ه','ﮭ'=>'ه','ﮫ'=>'ه','ﮪ'=>'ه','ہ'=>'ه','ﮨ'=>'ه','ﮩ'=>'ه','ﮧ'=>'ه','ﮦ'=>'ه','ە'=>'ه','ﳙ'=>'هٰ','ﳗ'=>'هج','ﱑ'=>'هج','ﳘ'=>'هم','ﱒ'=>'هم','ﶓ'=>'همج','ﶔ'=>'همم','ﱓ'=>'هى','ﱔ'=>'هى','ﮥ'=>'ۀ','ﮤ'=>'ۀ','ﻮ'=>'و','ﻭ'=>'و','ﷸ'=>'وسلم','ﯡ'=>'ۅ','ﯠ'=>'ۅ','ﯚ'=>'ۆ','ﯙ'=>'ۆ','ﯘ'=>'ۇ','ﯗ'=>'ۇ','ٷ'=>'ۇٔ','ﯝ'=>'ۇٔ','ﯜ'=>'ۈ','ﯛ'=>'ۈ','ﯣ'=>'ۉ','ﯢ'=>'ۉ','ﯟ'=>'ۋ','ﯞ'=>'ۋ','ﯨ'=>'ى','ﯩ'=>'ى','ﻰ'=>'ى','ﻯ'=>'ى','ي'=>'ى','ﻳ'=>'ى','ﻴ'=>'ى','ﻲ'=>'ى','ﻱ'=>'ى','ی'=>'ى','ﯾ'=>'ى','ﯿ'=>'ى','ﯽ'=>'ى','ﯼ'=>'ى','ٸ'=>'ىٔ','ﲐ'=>'ىٰ','ﱝ'=>'ىٰ','ﳚ'=>'ىج','ﱕ'=>'ىج','ﶯ'=>'ىجى','ﳛ'=>'ىح','ﱖ'=>'ىح','ﶮ'=>'ىحى','ﳜ'=>'ىخ','ﱗ'=>'ىخ','ﲑ'=>'ىر','ﲒ'=>'ىز','ﳝ'=>'ىم','ﳰ'=>'ىم','ﲓ'=>'ىم','ﱘ'=>'ىم','ﶝ'=>'ىمم','ﶜ'=>'ىمم','ﶰ'=>'ىمى','ﲔ'=>'ىن','ﳞ'=>'ىه','ﳱ'=>'ىه','ﲕ'=>'ىى','ﱙ'=>'ىى','ﲖ'=>'ىى','ﱚ'=>'ىى','ۧ'=>'ۦ','ﮯ'=>'ے','ﮮ'=>'ے','ﮱ'=>'ۓ','ﮰ'=>'ۓ','∃'=>'ⴺ','आ'=>'अा','ऒ'=>'अाॆ','ओ'=>'अाे','औ'=>'अाै','ऄ'=>'अॆ','ऑ'=>'अॉ','ऍ'=>'एॅ','ऎ'=>'एॆ','ऐ'=>'एे','ई'=>'र्इ','আ'=>'অা','ৠ'=>'ঋৃ','ৡ'=>'ঌৢ','ਉ'=>'ੳੁ','ਊ'=>'ੳੂ','ਆ'=>'ਅਾ','ਐ'=>'ਅੈ','ਔ'=>'ਅੌ','ਇ'=>'ੲਿ','ਈ'=>'ੲੀ','ਏ'=>'ੲੇ','આ'=>'અા','ઑ'=>'અાૅ','ઓ'=>'અાે','ઔ'=>'અાૈ','ઍ'=>'અૅ','એ'=>'અે','ઐ'=>'અૈ','ଆ'=>'ଅା','௮'=>'அ','ர'=>'ஈ','ா'=>'ஈ','௫'=>'ஈு','௨'=>'உ','ஊ'=>'உள','௭'=>'எ','௷'=>'எவ','ஜ'=>'ஐ','௧'=>'க','௪'=>'ச','௬'=>'சு','௲'=>'சூ','௺'=>'நீ','ை'=>'ன','௴'=>'மீ','௰'=>'ய','ௗ'=>'ள','௸'=>'ஷ','ொ'=>'ெஈ','ௌ'=>'ெள','ோ'=>'ேஈ','ౠ'=>'ఋా','ౡ'=>'ఌా','ఔ'=>'ఒౌ','ఓ'=>'ఒౕ','ఢ'=>'డ̣','భ'=>'బ̣','ష'=>'వ̣','హ'=>'వా','మ'=>'వు','ూ'=>'ుా','ౄ'=>'ృా','ೡ'=>'ಌಾ','ಔ'=>'ఒౌ','ഈ'=>'ഇൗ','ഊ'=>'உൗ','ഐ'=>'എെ','ഓ'=>'ഒാ','ഔ'=>'ഒൗ','ൡ'=>'ഞ','൫'=>'ദ്ര','ഌ'=>'നூ','ങ'=>'നூ','൯'=>'ന്','റ'=>'ര','൪'=>'ര്','൮'=>'വ്','ീ'=>'ி','ൂ'=>'ூ','ൃ'=>'ூ','ൈ'=>'െെ','ฃ'=>'ข','ด'=>'ค','ต'=>'ค','ม'=>'ฆ','ซ'=>'ช','ฏ'=>'ฎ','ท'=>'ฑ','ๅ'=>'า','ำ'=>'̊า','แ'=>'เเ','ໜ'=>'ຫນ','ໝ'=>'ຫມ','ຳ'=>'̊າ','ཷ'=>'ྲཱྀ','ཹ'=>'ླཱྀ','၀'=>'o','ឣ'=>'អ','᧐'=>'ᦞ','᭒'=>'ᬍ','᭓'=>'ᬑ','᭘'=>'ᬨ','ᢖ'=>'ᡜ','ᡕ'=>'ᠵ','Ꮢ'=>'Ꭱ','Ꮍ'=>'y','𝐀'=>'A','𝐴'=>'A','𝑨'=>'A','𝒜'=>'A','𝓐'=>'A','𝔄'=>'A','𝔸'=>'A','𝕬'=>'A','𝖠'=>'A','𝗔'=>'A','𝘈'=>'A','𝘼'=>'A','𝙰'=>'A','𝚨'=>'A','𝛢'=>'A','𝜜'=>'A','𝝖'=>'A','𝞐'=>'A','𝐉'=>'J','𝐽'=>'J','𝑱'=>'J','𝒥'=>'J','𝓙'=>'J','𝔍'=>'J','𝕁'=>'J','𝕵'=>'J','𝖩'=>'J','𝗝'=>'J','𝘑'=>'J','𝙅'=>'J','𝙹'=>'J','Ꮷ'=>'J','⋿'=>'E','ℰ'=>'E','𝐄'=>'E','𝐸'=>'E','𝑬'=>'E','𝓔'=>'E','𝔈'=>'E','𝔼'=>'E','𝕰'=>'E','𝖤'=>'E','𝗘'=>'E','𝘌'=>'E','𝙀'=>'E','𝙴'=>'E','𝚬'=>'E','𝛦'=>'E','𝜠'=>'E','𝝚'=>'E','𝞔'=>'E','ℾ'=>'Ꮁ','𝚪'=>'Ꮁ','𝛤'=>'Ꮁ','𝜞'=>'Ꮁ','𝝘'=>'Ꮁ','𝞒'=>'Ꮁ','Ꮤ'=>'w','ℳ'=>'M','𝐌'=>'M','𝑀'=>'M','𝑴'=>'M','𝓜'=>'M','𝔐'=>'M','𝕄'=>'M','𝕸'=>'M','𝖬'=>'M','𝗠'=>'M','𝘔'=>'M','𝙈'=>'M','𝙼'=>'M','𝚳'=>'M','𝛭'=>'M','𝜧'=>'M','𝝡'=>'M','𝞛'=>'M','ℋ'=>'H','ℌ'=>'H','ℍ'=>'H','𝐇'=>'H','𝐻'=>'H','𝑯'=>'H','𝓗'=>'H','𝕳'=>'H','𝖧'=>'H','𝗛'=>'H','𝘏'=>'H','𝙃'=>'H','𝙷'=>'H','𝚮'=>'H','𝛨'=>'H','𝜢'=>'H','𝝜'=>'H','𝞖'=>'H','𝐆'=>'G','𝐺'=>'G','𝑮'=>'G','𝒢'=>'G','𝓖'=>'G','𝔊'=>'G','𝔾'=>'G','𝕲'=>'G','𝖦'=>'G','𝗚'=>'G','𝘎'=>'G','𝙂'=>'G','𝙶'=>'G','Ᏻ'=>'G','ℤ'=>'Z','ℨ'=>'Z','𝐙'=>'Z','𝑍'=>'Z','𝒁'=>'Z','𝒵'=>'Z','𝓩'=>'Z','𝖅'=>'Z','𝖹'=>'Z','𝗭'=>'Z','𝘡'=>'Z','𝙕'=>'Z','𝚉'=>'Z','𝚭'=>'Z','𝛧'=>'Z','𝜡'=>'Z','𝝛'=>'Z','𝞕'=>'Z','𝐒'=>'S','𝑆'=>'S','𝑺'=>'S','𝒮'=>'S','𝓢'=>'S','𝔖'=>'S','𝕊'=>'S','𝕾'=>'S','𝖲'=>'S','𝗦'=>'S','𝘚'=>'S','𝙎'=>'S','𝚂'=>'S','Ꮪ'=>'S','𝐕'=>'V','𝑉'=>'V','𝑽'=>'V','𝒱'=>'V','𝓥'=>'V','𝔙'=>'V','𝕍'=>'V','𝖁'=>'V','𝖵'=>'V','𝗩'=>'V','𝘝'=>'V','𝙑'=>'V','𝚅'=>'V','ℒ'=>'L','𝐋'=>'L','𝐿'=>'L','𝑳'=>'L','𝓛'=>'L','𝔏'=>'L','𝕃'=>'L','𝕷'=>'L','𝖫'=>'L','𝗟'=>'L','𝘓'=>'L','𝙇'=>'L','𝙻'=>'L','∑'=>'C','⅀'=>'C','ℂ'=>'C','ℭ'=>'C','𝐂'=>'C','𝐶'=>'C','𝑪'=>'C','𝒞'=>'C','𝓒'=>'C','𝕮'=>'C','𝖢'=>'C','𝗖'=>'C','𝘊'=>'C','𝘾'=>'C','𝙲'=>'C','𝚺'=>'C','𝛴'=>'C','𝜮'=>'C','𝝨'=>'C','𝞢'=>'C','ℙ'=>'P','𝐏'=>'P','𝑃'=>'P','𝑷'=>'P','𝒫'=>'P','𝓟'=>'P','𝔓'=>'P','𝕻'=>'P','𝖯'=>'P','𝗣'=>'P','𝘗'=>'P','𝙋'=>'P','𝙿'=>'P','𝚸'=>'P','𝛲'=>'P','𝜬'=>'P','𝝦'=>'P','𝞠'=>'P','𝐊'=>'K','𝐾'=>'K','𝑲'=>'K','𝒦'=>'K','𝓚'=>'K','𝔎'=>'K','𝕂'=>'K','𝕶'=>'K','𝖪'=>'K','𝗞'=>'K','𝘒'=>'K','𝙆'=>'K','𝙺'=>'K','𝚱'=>'K','𝛫'=>'K','𝜥'=>'K','𝝟'=>'K','𝞙'=>'K','ℬ'=>'B','𝐁'=>'B','𝐵'=>'B','𝑩'=>'B','𝓑'=>'B','𝔅'=>'B','𝔹'=>'B','𝕭'=>'B','𝖡'=>'B','𝗕'=>'B','𝘉'=>'B','𝘽'=>'B','𝙱'=>'B','𝚩'=>'B','𝛣'=>'B','𝜝'=>'B','𝝗'=>'B','𝞑'=>'B','ᐍ'=>'ᐁ·','∆'=>'ᐃ','𝚫'=>'ᐃ','𝛥'=>'ᐃ','𝜟'=>'ᐃ','𝝙'=>'ᐃ','𝞓'=>'ᐃ','ᐏ'=>'ᐃ·','ᐑ'=>'ᐄ·','ᐓ'=>'ᐅ·','ᐕ'=>'ᐆ·','ᐘ'=>'ᐊ·','ᐚ'=>'ᐋ·','ᓑ'=>'ᐡ','ᑶ'=>'·P','ᑺ'=>'·d','ᒘ'=>'·J','ᑁ'=>'ᐳ·','ᑃ'=>'ᐴ·','ᑅ'=>'ᐸ·','ᑇ'=>'ᐹ·','ˈ'=>'ᑊ','ᑘ'=>'ᑌ·','ᑧ'=>'ᑌᑊ','ᑚ'=>'ᑎ·','ᑨ'=>'ᑎᑊ','ᑜ'=>'ᑏ·','ᑞ'=>'ᑐ·','ᑩ'=>'ᑐᑊ','ᑠ'=>'ᑑ·','ᑢ'=>'ᑕ·','ᑪ'=>'ᑕᑊ','ᑤ'=>'ᑖ·','ᑵ'=>'ᑫ·','ᒅ'=>'ᑫᑊ','ᑷ'=>'P·','ᒆ'=>'Pᑊ','ᑹ'=>'ᑮ·','ᑻ'=>'d·','ᒇ'=>'dᑊ','ᑽ'=>'ᑰ·','ᑿ'=>'ᑲ·','ᒈ'=>'ᑲᑊ','ᒁ'=>'ᑳ·','ᘃ'=>'ᒉ','ᒓ'=>'ᒉ·','ᒕ'=>'ᒋ·','ᒗ'=>'ᒌ·','ᒙ'=>'J·','ᒛ'=>'ᒎ·','ᘂ'=>'ᒐ','ᒝ'=>'ᒐ·','ᒟ'=>'ᒑ·','ᒭ'=>'ᒣ·','ᒯ'=>'ᒥ·','ᒱ'=>'ᒦ·','ᒳ'=>'ᒧ·','ᒵ'=>'ᒨ·','ᒹ'=>'ᒫ·','ᓊ'=>'ᓀ·','ᓌ'=>'ᓇ·','ᓎ'=>'ᓈᒫ','ᘄ'=>'ᓓ','ᓝ'=>'ᓓ·','ᓟ'=>'ᓕ·','ᓡ'=>'ᓖ·','ᓣ'=>'ᓗ·','ᓥ'=>'ᓘ·','ᘇ'=>'ᓚ','ᓧ'=>'ᓚ·','ᓩ'=>'ᓛ·','ᓷ'=>'ᓭ·','ᓹ'=>'ᓯ·','ᓻ'=>'ᓰ·','ᓽ'=>'ᓱ·','ᓿ'=>'ᓲ·','ᔁ'=>'ᓴ·','ᔃ'=>'ᓵ·','ᔌ'=>'ᔋᐸ','ᔍ'=>'ᔋᑕ','ᔎ'=>'ᔋᑲ','ᔏ'=>'ᔋᒐ','ᔘ'=>'ᔐ·','ᔚ'=>'ᔑ·','ᔜ'=>'ᔒ·','ᔞ'=>'ᔓ·','ᔠ'=>'ᔔ·','ᔢ'=>'ᔕ·','ᔤ'=>'ᔖ·','ᔲ'=>'ᔨ·','ᔴ'=>'ᔩ·','ᔶ'=>'ᔪ·','ᔸ'=>'ᔫ·','ᔺ'=>'ᔭ·','ᔼ'=>'ᔮ·','᙮'=>'x','ᕽ'=>'x','ᘢ'=>'ᕃ','ᘣ'=>'ᕆ','ᘤ'=>'ᕊ','ᕏ'=>'ᕌ·','ᙯ'=>'ᕐᑫ','ᕾ'=>'ᕐᑬ','ᕿ'=>'ᕐP','ᖀ'=>'ᕐᑮ','ᖁ'=>'ᕐd','ᖂ'=>'ᕐᑰ','ᖃ'=>'ᕐᑲ','ᖄ'=>'ᕐᑳ','ᖅ'=>'ᕐᒃ','ᕜ'=>'ᕚ·','ᕩ'=>'ᕧ·','ℛ'=>'R','ℜ'=>'R','ℝ'=>'R','𝐑'=>'R','𝑅'=>'R','𝑹'=>'R','𝓡'=>'R','𝕽'=>'R','𝖱'=>'R','𝗥'=>'R','𝘙'=>'R','𝙍'=>'R','𝚁'=>'R','ᙰ'=>'ᖕᒉ','ᖎ'=>'ᖕᒊ','ᖏ'=>'ᖕᒋ','ᖐ'=>'ᖕᒌ','ᖑ'=>'ᖕJ','ᖒ'=>'ᖕᒎ','ᖓ'=>'ᖕᒐ','ᖔ'=>'ᖕᒑ','ᙱ'=>'ᖖᒋ','ᙲ'=>'ᖖᒌ','ᙳ'=>'ᖖJ','ᙴ'=>'ᖖᒎ','ᙵ'=>'ᖖᒐ','ᙶ'=>'ᖖᒑ','ℱ'=>'F','𝐅'=>'F','𝐹'=>'F','𝑭'=>'F','𝓕'=>'F','𝔉'=>'F','𝔽'=>'F','𝕱'=>'F','𝖥'=>'F','𝗙'=>'F','𝘍'=>'F','𝙁'=>'F','𝙵'=>'F','𝟊'=>'F','ⅅ'=>'D','𝐃'=>'D','𝐷'=>'D','𝑫'=>'D','𝒟'=>'D','𝓓'=>'D','𝔇'=>'D','𝔻'=>'D','𝕯'=>'D','𝖣'=>'D','𝗗'=>'D','𝘋'=>'D','𝘿'=>'D','𝙳'=>'D','ᗪ'=>'D','℧'=>'ᘮ','ᘴ'=>'ᘮ','𝛀'=>'ᘯ','𝛺'=>'ᘯ','𝜴'=>'ᘯ','𝝮'=>'ᘯ','𝞨'=>'ᘯ','ᘵ'=>'ᘯ','ㄱ'=>'ᄀ','ᄀ'=>'ᄀ','ᆨ'=>'ᄀ','ㄲ'=>'ᄁ','ᄁ'=>'ᄁ','ᆩ'=>'ᄁ','ㄴ'=>'ᄂ','ᄂ'=>'ᄂ','ᆫ'=>'ᄂ','ㄷ'=>'ᄃ','ᄃ'=>'ᄃ','ᆮ'=>'ᄃ','ㄸ'=>'ᄄ','ᄄ'=>'ᄄ','ㄹ'=>'ᄅ','ᄅ'=>'ᄅ','ᆯ'=>'ᄅ','ㅁ'=>'ᄆ','ᄆ'=>'ᄆ','ᆷ'=>'ᄆ','ㅂ'=>'ᄇ','ᄇ'=>'ᄇ','ᆸ'=>'ᄇ','ㅃ'=>'ᄈ','ᄈ'=>'ᄈ','ㅅ'=>'ᄉ','ᄉ'=>'ᄉ','ᆺ'=>'ᄉ','ㅆ'=>'ᄊ','ᄊ'=>'ᄊ','ᆻ'=>'ᄊ','ㅇ'=>'ᄋ','ᄋ'=>'ᄋ','ᆼ'=>'ᄋ','ㅈ'=>'ᄌ','ᄌ'=>'ᄌ','ᆽ'=>'ᄌ','ㅉ'=>'ᄍ','ᄍ'=>'ᄍ','ㅊ'=>'ᄎ','ᄎ'=>'ᄎ','ᆾ'=>'ᄎ','ㅋ'=>'ᄏ','ᄏ'=>'ᄏ','ᆿ'=>'ᄏ','ㅌ'=>'ᄐ','ᄐ'=>'ᄐ','ᇀ'=>'ᄐ','ㅍ'=>'ᄑ','ᄑ'=>'ᄑ','ᇁ'=>'ᄑ','ㅎ'=>'ᄒ','ᄒ'=>'ᄒ','ᇂ'=>'ᄒ','ᇅ'=>'ᄓ','ㅥ'=>'ᄔ','ㅦ'=>'ᄕ','ᇆ'=>'ᄕ','ᇊ'=>'ᄗ','ᇍ'=>'ᄘ','ᇐ'=>'ᄙ','ㅀ'=>'ᄚ','ᄚ'=>'ᄚ','ᄻ'=>'ᄚ','ᆶ'=>'ᄚ','ㅮ'=>'ᄜ','ᇜ'=>'ᄜ','ㅱ'=>'ᄝ','ᇢ'=>'ᄝ','ㅲ'=>'ᄞ','ㅳ'=>'ᄠ','ㅄ'=>'ᄡ','ᄡ'=>'ᄡ','ᆹ'=>'ᄡ','ㅴ'=>'ᄢ','ㅵ'=>'ᄣ','ㅶ'=>'ᄧ','ㅷ'=>'ᄩ','ㅸ'=>'ᄫ','ᇦ'=>'ᄫ','ㅹ'=>'ᄬ','ㅺ'=>'ᄭ','ᇧ'=>'ᄭ','ㅻ'=>'ᄮ','ㅼ'=>'ᄯ','ᇨ'=>'ᄯ','ᇩ'=>'ᄰ','ㅽ'=>'ᄲ','ᇪ'=>'ᄲ','ㅾ'=>'ᄶ','ㅿ'=>'ᅀ','ᇫ'=>'ᅀ','ᇬ'=>'ᅁ','ᇱ'=>'ᅅ','ㆂ'=>'ᅅ','ᇲ'=>'ᅆ','ㆃ'=>'ᅆ','ㆀ'=>'ᅇ','ᇮ'=>'ᅇ','ㆁ'=>'ᅌ','ᇰ'=>'ᅌ','ᇳ'=>'ᅖ','ㆄ'=>'ᅗ','ᇴ'=>'ᅗ','ㆅ'=>'ᅘ','ㆆ'=>'ᅙ','ᇹ'=>'ᅙ','ㅤ'=>'ᅠ','ᅠ'=>'ᅠ','ㅏ'=>'ᅡ','ᅡ'=>'ᅡ','ㅐ'=>'ᅢ','ᅢ'=>'ᅢ','ㅑ'=>'ᅣ','ᅣ'=>'ᅣ','ㅒ'=>'ᅤ','ᅤ'=>'ᅤ','ㅓ'=>'ᅥ','ᅥ'=>'ᅥ','ㅔ'=>'ᅦ','ᅦ'=>'ᅦ','ㅕ'=>'ᅧ','ᅧ'=>'ᅧ','ㅖ'=>'ᅨ','ᅨ'=>'ᅨ','ㅗ'=>'ᅩ','ᅩ'=>'ᅩ','ㅘ'=>'ᅪ','ᅪ'=>'ᅪ','ㅙ'=>'ᅫ','ᅫ'=>'ᅫ','ㅚ'=>'ᅬ','ᅬ'=>'ᅬ','ㅛ'=>'ᅭ','ᅭ'=>'ᅭ','ㅜ'=>'ᅮ','ᅮ'=>'ᅮ','ㅝ'=>'ᅯ','ᅯ'=>'ᅯ','ㅞ'=>'ᅰ','ᅰ'=>'ᅰ','ㅟ'=>'ᅱ','ᅱ'=>'ᅱ','ㅠ'=>'ᅲ','ᅲ'=>'ᅲ','ㅡ'=>'一','ᅳ'=>'一','ㅢ'=>'ᅴ','ᅴ'=>'ᅴ','ㅣ'=>'丨','ᅵ'=>'丨','ㆇ'=>'ᆄ','ᆆ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ㆍ'=>'ᆞ','ㆎ'=>'ᆡ','ㄳ'=>'ᆪ','ᆪ'=>'ᆪ','ㄵ'=>'ᆬ','ᆬ'=>'ᆬ','ㄶ'=>'ᆭ','ᆭ'=>'ᆭ','ㄺ'=>'ᆰ','ᆰ'=>'ᆰ','ㄻ'=>'ᆱ','ᆱ'=>'ᆱ','ㄼ'=>'ᆲ','ᆲ'=>'ᆲ','ㄽ'=>'ᆳ','ᆳ'=>'ᆳ','ㄾ'=>'ᆴ','ᆴ'=>'ᆴ','ㄿ'=>'ᆵ','ᆵ'=>'ᆵ','ㅧ'=>'ᇇ','ㅨ'=>'ᇈ','ㅩ'=>'ᇌ','ㅪ'=>'ᇎ','ㅫ'=>'ᇓ','ㅬ'=>'ᇗ','ㅭ'=>'ᇙ','ㅯ'=>'ᇝ','ㅰ'=>'ᇟ','ァ'=>'ァ','ア'=>'ア','ィ'=>'ィ','イ'=>'イ','ゥ'=>'ゥ','ウ'=>'ウ','ェ'=>'ェ','エ'=>'エ','ォ'=>'ォ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ッ'=>'ッ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'へ','ホ'=>'ホ','マ'=>'マ','⧄'=>'〼','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ャ'=>'ャ','ヤ'=>'ヤ','ュ'=>'ュ','ユ'=>'ユ','ョ'=>'ョ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ヲ'=>'ヲ','ン'=>'ン','꒞'=>'ꁊ','꒬'=>'ꁐ','꒜'=>'ꃀ','꒿'=>'ꉙ','꒾'=>'ꊱ','꓀'=>'ꎫ','꓂'=>'ꎵ','꒺'=>'ꎿ','꒰'=>'ꏂ','𐒠'=>'𐒆','—'=>'一','―'=>'一','−'=>'一','─'=>'一','⼀'=>'一','不'=>'不','並'=>'並','|'=>'丨','|'=>'丨','∣'=>'丨','⼁'=>'丨','‖'=>'丨丨','∥'=>'丨丨','串'=>'串','⼂'=>'丶','丸'=>'丸','丹'=>'丹','丽'=>'丽','⼃'=>'丿','乁'=>'乁','⼄'=>'乙','亂'=>'亂','⼅'=>'亅','了'=>'了','⼆'=>'二','⼇'=>'亠','亮'=>'亮','⼈'=>'人','什'=>'什','仌'=>'仌','令'=>'令','你'=>'你','倂'=>'併','倂'=>'併','侀'=>'侀','來'=>'來','例'=>'例','侮'=>'侮','侮'=>'侮','侻'=>'侻','便'=>'便','值'=>'値','倫'=>'倫','偺'=>'偺','備'=>'備','像'=>'像','僚'=>'僚','僧'=>'僧','僧'=>'僧','⼉'=>'儿','兀'=>'兀','充'=>'充','免'=>'免','免'=>'免','兔'=>'兔','兤'=>'兤','⼊'=>'入','內'=>'內','全'=>'全','兩'=>'兩','⼋'=>'八','六'=>'六','具'=>'具','冀'=>'冀','⼌'=>'冂','再'=>'再','冒'=>'冒','冕'=>'冕','⼍'=>'冖','冗'=>'冗','冤'=>'冤','⼎'=>'冫','冬'=>'冬','况'=>'况','况'=>'况','冷'=>'冷','凉'=>'凉','凌'=>'凌','凜'=>'凜','凞'=>'凞','⼏'=>'几','凵'=>'凵','⼐'=>'凵','⼑'=>'刀','刃'=>'刃','切'=>'切','切'=>'切','列'=>'列','利'=>'利','刺'=>'刺','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','劉'=>'劉','力'=>'力','⼒'=>'力','劣'=>'劣','劳'=>'劳','勇'=>'勇','勇'=>'勇','勉'=>'勉','勉'=>'勉','勒'=>'勒','勞'=>'勞','勤'=>'勤','勤'=>'勤','勵'=>'勵','⼓'=>'勹','勺'=>'勺','勺'=>'勺','包'=>'包','匆'=>'匆','⼔'=>'匕','北'=>'北','北'=>'北','⼕'=>'匚','⼖'=>'匸','匿'=>'匿','⼗'=>'十','〸'=>'十','〹'=>'卄','〺'=>'卅','卉'=>'卉','卑'=>'卑','卑'=>'卑','博'=>'博','⼘'=>'卜','⼙'=>'卩','即'=>'即','卵'=>'卵','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','⼚'=>'厂','⼛'=>'厶','參'=>'參','⼜'=>'又','及'=>'及','叟'=>'叟','⼝'=>'口','句'=>'句','叫'=>'叫','叱'=>'叱','吆'=>'吆','吏'=>'吏','吝'=>'吝','吸'=>'吸','呂'=>'呂','呈'=>'呈','周'=>'周','咞'=>'咞','咢'=>'咢','咽'=>'咽','哶'=>'哶','唐'=>'唐','啓'=>'啓','啟'=>'啓','啕'=>'啕','啣'=>'啣','善'=>'善','善'=>'善','喇'=>'喇','喙'=>'喙','喙'=>'喙','喝'=>'喝','喝'=>'喝','喫'=>'喫','喳'=>'喳','嗀'=>'嗀','嗂'=>'嗂','嗢'=>'嗢','嘆'=>'嘆','嘆'=>'嘆','噑'=>'噑','器'=>'器','噴'=>'噴','⼞'=>'囗','囹'=>'囹','圖'=>'圖','圗'=>'圗','⼟'=>'土','型'=>'型','城'=>'城','埴'=>'埴','堍'=>'堍','報'=>'報','堲'=>'堲','塀'=>'塀','塚'=>'塚','塚'=>'塚','塞'=>'塞','填'=>'塡','墨'=>'墨','壿'=>'墫','墬'=>'墬','墳'=>'墳','壘'=>'壘','壟'=>'壟','⼠'=>'士','壮'=>'壮','売'=>'売','壷'=>'壷','⼡'=>'夂','夆'=>'夆','⼢'=>'夊','⼣'=>'夕','多'=>'多','夢'=>'夢','⼤'=>'大','奄'=>'奄','奈'=>'奈','契'=>'契','奔'=>'奔','奢'=>'奢','女'=>'女','⼥'=>'女','姘'=>'姘','姬'=>'姬','娛'=>'娛','娧'=>'娧','婢'=>'婢','婦'=>'婦','嬀'=>'媯','媵'=>'媵','嬈'=>'嬈','嬨'=>'嬨','嬾'=>'嬾','嬾'=>'嬾','⼦'=>'子','⼧'=>'宀','宅'=>'宅','寃'=>'寃','寘'=>'寘','寧'=>'寧','寧'=>'寧','寧'=>'寧','寮'=>'寮','寳'=>'寳','⼨'=>'寸','寿'=>'寿','将'=>'将','⼩'=>'小','尢'=>'尢','⼪'=>'尢','⼫'=>'尸','尿'=>'尿','屠'=>'屠','屢'=>'屢','層'=>'層','履'=>'履','屮'=>'屮','屮'=>'屮','⼬'=>'屮','⼭'=>'山','岍'=>'岍','峀'=>'峀','崙'=>'崙','嵃'=>'嵃','嵐'=>'嵐','嵫'=>'嵫','嵮'=>'嵮','嵼'=>'嵼','嶲'=>'嶲','嶺'=>'嶺','⼮'=>'巛','巡'=>'巡','巢'=>'巢','⼯'=>'工','⼰'=>'己','巽'=>'巽','⼱'=>'巾','帲'=>'帡','帨'=>'帨','帽'=>'帽','幩'=>'幩','⼲'=>'干','年'=>'年','⼳'=>'幺','⼴'=>'广','度'=>'度','庰'=>'庰','庳'=>'庳','庶'=>'庶','廉'=>'廉','廊'=>'廊','廊'=>'廊','廒'=>'廒','廓'=>'廓','廙'=>'廙','廬'=>'廬','⼵'=>'廴','廾'=>'廾','⼶'=>'廾','弄'=>'弄','⼷'=>'弋','⼸'=>'弓','弢'=>'弢','弢'=>'弢','⼹'=>'彐','当'=>'当','⼺'=>'彡','形'=>'形','彩'=>'彩','彫'=>'彫','⼻'=>'彳','律'=>'律','徚'=>'徚','復'=>'復','徭'=>'徭','⼼'=>'心','忍'=>'忍','志'=>'志','念'=>'念','忹'=>'忹','怒'=>'怒','怜'=>'怜','悁'=>'悁','悔'=>'悔','悔'=>'悔','惇'=>'惇','惘'=>'惘','惡'=>'惡','愈'=>'愈','慄'=>'慄','慈'=>'慈','慌'=>'慌','慌'=>'慌','慎'=>'慎','慎'=>'慎','慠'=>'慠','慨'=>'慨','慺'=>'慺','憎'=>'憎','憎'=>'憎','憎'=>'憎','憐'=>'憐','憤'=>'憤','憯'=>'憯','憲'=>'憲','懞'=>'懞','懲'=>'懲','懲'=>'懲','懲'=>'懲','懶'=>'懶','懶'=>'懶','戀'=>'戀','⼽'=>'戈','成'=>'成','戛'=>'戛','戮'=>'戮','戴'=>'戴','⼾'=>'戶','⼿'=>'手','扝'=>'扝','抱'=>'抱','拉'=>'拉','拏'=>'拏','拓'=>'拓','拔'=>'拔','拼'=>'拼','拾'=>'拾','挽'=>'挽','捐'=>'捐','捨'=>'捨','捻'=>'捻','掃'=>'掃','掠'=>'掠','掩'=>'掩','揄'=>'揄','揅'=>'揅','揤'=>'揤','㩁'=>'搉','搜'=>'搜','搢'=>'搢','摒'=>'摒','摩'=>'摩','摷'=>'摷','摾'=>'摾','撚'=>'撚','撝'=>'撝','擄'=>'擄','⽀'=>'支','⽁'=>'攴','敏'=>'敏','敏'=>'敏','敖'=>'敖','敬'=>'敬','數'=>'數','⽂'=>'文','⽃'=>'斗','料'=>'料','⽄'=>'斤','⽅'=>'方','旅'=>'旅','⽆'=>'无','既'=>'既','旣'=>'旣','⽇'=>'日','易'=>'易','晉'=>'晉','晩'=>'晚','䀿'=>'晣','晴'=>'晴','晴'=>'晴','暈'=>'暈','暑'=>'暑','暑'=>'暑','暜'=>'暜','暴'=>'暴','曆'=>'曆','⽈'=>'曰','更'=>'更','㫚'=>'曶','書'=>'書','最'=>'最','⽉'=>'月','肦'=>'朌','胐'=>'朏','胊'=>'朐','脁'=>'朓','朗'=>'朗','朗'=>'朗','朗'=>'朗','脧'=>'朘','望'=>'望','望'=>'望','朡'=>'朡','膧'=>'朣','⽊'=>'木','李'=>'李','杓'=>'杓','杖'=>'杖','杞'=>'杞','柿'=>'杮','杻'=>'杻','枅'=>'枅','林'=>'林','柳'=>'柳','柺'=>'柺','栗'=>'栗','栟'=>'栟','桒'=>'桒','梁'=>'梁','梅'=>'梅','梅'=>'梅','梎'=>'梎','梨'=>'梨','椔'=>'椔','楂'=>'楂','樧'=>'榝','榣'=>'榣','槪'=>'槪','樂'=>'樂','樂'=>'樂','樂'=>'樂','樓'=>'樓','檨'=>'檨','櫓'=>'櫓','櫛'=>'櫛','欄'=>'欄','⽋'=>'欠','次'=>'次','歔'=>'歔','⽌'=>'止','歲'=>'歲','歷'=>'歷','歹'=>'歹','⽍'=>'歹','殟'=>'殟','殮'=>'殮','⽎'=>'殳','殺'=>'殺','殺'=>'殺','殺'=>'殺','殻'=>'殻','⽏'=>'毋','⺟'=>'母','⽐'=>'比','⽑'=>'毛','⽒'=>'氏','⽓'=>'气','⽔'=>'水','汎'=>'汎','汧'=>'汧','沈'=>'沈','沿'=>'沿','泌'=>'泌','泍'=>'泍','泥'=>'泥','洖'=>'洖','洛'=>'洛','洞'=>'洞','洴'=>'洴','派'=>'派','流'=>'流','流'=>'流','流'=>'流','浩'=>'浩','浪'=>'浪','海'=>'海','海'=>'海','浸'=>'浸','涅'=>'涅','淋'=>'淋','淚'=>'淚','淪'=>'淪','淹'=>'淹','渚'=>'渚','港'=>'港','湮'=>'湮','潙'=>'溈','溜'=>'溜','溺'=>'溺','滇'=>'滇','滋'=>'滋','滋'=>'滋','滑'=>'滑','滛'=>'滛','漏'=>'漏','漢'=>'漢','漢'=>'漢','漣'=>'漣','潮'=>'潮','濆'=>'濆','濫'=>'濫','濾'=>'濾','瀛'=>'瀛','瀞'=>'瀞','瀞'=>'瀞','瀹'=>'瀹','灊'=>'灊','⽕'=>'火','灰'=>'灰','灷'=>'灷','災'=>'災','炙'=>'炙','炭'=>'炭','烈'=>'烈','烙'=>'烙','煅'=>'煅','煉'=>'煉','煮'=>'煮','煮'=>'煮','熜'=>'熜','燎'=>'燎','燐'=>'燐','爐'=>'爐','爛'=>'爛','爨'=>'爨','⽖'=>'爪','爫'=>'爫','⺤'=>'爫','爵'=>'爵','爵'=>'爵','⽗'=>'父','⽘'=>'爻','⽙'=>'爿','⽚'=>'片','牐'=>'牐','⽛'=>'牙','⽜'=>'牛','牢'=>'牢','犀'=>'犀','犕'=>'犕','⽝'=>'犬','犯'=>'犯','狀'=>'狀','狼'=>'狼','猪'=>'猪','猪'=>'猪','獵'=>'獵','獺'=>'獺','⽞'=>'玄','率'=>'率','率'=>'率','⽟'=>'玉','王'=>'王','玥'=>'玥','玲'=>'玲','珞'=>'珞','理'=>'理','琉'=>'琉','琢'=>'琢','瑇'=>'瑇','瑜'=>'瑜','瑩'=>'瑩','瑱'=>'瑱','瑱'=>'瑱','璅'=>'璅','璉'=>'璉','璘'=>'璘','瓊'=>'瓊','⽠'=>'瓜','⽡'=>'瓦','甆'=>'甆','⽢'=>'甘','⽣'=>'生','甤'=>'甤','⽤'=>'用','⽥'=>'田','画'=>'画','甾'=>'甾','留'=>'留','略'=>'略','異'=>'異','異'=>'異','⽦'=>'疋','⽧'=>'疒','痢'=>'痢','瘐'=>'瘐','瘝'=>'瘝','瘟'=>'瘟','療'=>'療','癩'=>'癩','⽨'=>'癶','⽩'=>'白','⽪'=>'皮','⽫'=>'皿','益'=>'益','益'=>'益','盛'=>'盛','盧'=>'盧','⽬'=>'目','直'=>'直','直'=>'直','省'=>'省','眞'=>'眞','真'=>'真','真'=>'真','着'=>'着','睊'=>'睊','睊'=>'睊','瞋'=>'瞋','瞧'=>'瞧','⽭'=>'矛','⽮'=>'矢','⽯'=>'石','硏'=>'研','硎'=>'硎','硫'=>'硫','碌'=>'碌','碌'=>'碌','碑'=>'碑','磊'=>'磊','磌'=>'磌','磌'=>'磌','磻'=>'磻','礪'=>'礪','⽰'=>'示','礼'=>'礼','社'=>'社','祈'=>'祈','祉'=>'祉','祐'=>'祐','祖'=>'祖','祖'=>'祖','祝'=>'祝','神'=>'神','祥'=>'祥','祿'=>'祿','禍'=>'禍','禎'=>'禎','福'=>'福','福'=>'福','禮'=>'禮','⽱'=>'禸','⽲'=>'禾','秊'=>'秊','秫'=>'秫','稜'=>'稜','穀'=>'穀','穀'=>'穀','穊'=>'穊','穏'=>'穏','⽳'=>'穴','突'=>'突','窱'=>'窱','立'=>'立','⽴'=>'立','竮'=>'竮','⽵'=>'竹','笠'=>'笠','節'=>'節','節'=>'節','篆'=>'篆','築'=>'築','簾'=>'簾','籠'=>'籠','⽶'=>'米','类'=>'类','粒'=>'粒','精'=>'精','糒'=>'糒','糖'=>'糖','糣'=>'糣','糧'=>'糧','糨'=>'糨','⽷'=>'糸','紀'=>'紀','紐'=>'紐','索'=>'索','累'=>'累','絶'=>'絕','絛'=>'絛','絣'=>'絣','綠'=>'綠','綾'=>'綾','緇'=>'緇','練'=>'練','練'=>'練','練'=>'練','縂'=>'縂','縉'=>'縉','縷'=>'縷','繁'=>'繁','繅'=>'繅','⽸'=>'缶','缾'=>'缾','⽹'=>'网','⺫'=>'罒','署'=>'署','罹'=>'罹','罺'=>'罺','羅'=>'羅','⽺'=>'羊','羕'=>'羕','羚'=>'羚','羽'=>'羽','⽻'=>'羽','翺'=>'翺','老'=>'老','⽼'=>'老','者'=>'者','者'=>'者','者'=>'者','⽽'=>'而','⽾'=>'耒','⽿'=>'耳','聆'=>'聆','聠'=>'聠','聯'=>'聯','聰'=>'聰','聾'=>'聾','⾀'=>'聿','⾁'=>'肉','肋'=>'肋','肭'=>'肭','育'=>'育','㬵'=>'胶','腁'=>'胼','脃'=>'脃','脾'=>'脾','臘'=>'臘','⾂'=>'臣','臨'=>'臨','⾃'=>'自','臭'=>'臭','⾄'=>'至','⾅'=>'臼','舁'=>'舁','舁'=>'舁','舄'=>'舄','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','良'=>'良','⾊'=>'色','⾋'=>'艸','艹'=>'艹','艹'=>'艹','芋'=>'芋','芑'=>'芑','芝'=>'芝','花'=>'花','芳'=>'芳','芽'=>'芽','若'=>'若','若'=>'若','苦'=>'苦','茝'=>'茝','茣'=>'茣','茶'=>'茶','荒'=>'荒','荓'=>'荓','荣'=>'荣','莭'=>'莭','莽'=>'莽','菉'=>'菉','菊'=>'菊','菌'=>'菌','菜'=>'菜','菧'=>'菧','華'=>'華','菱'=>'菱','落'=>'落','葉'=>'葉','著'=>'著','著'=>'著','蔿'=>'蒍','蓮'=>'蓮','蓱'=>'蓱','蓳'=>'蓳','蓼'=>'蓼','蔖'=>'蔖','蕤'=>'蕤','藍'=>'藍','藺'=>'藺','蘆'=>'蘆','蘒'=>'蘒','蘭'=>'蘭','虁'=>'蘷','蘿'=>'蘿','⾌'=>'虍','虐'=>'虐','虜'=>'虜','虜'=>'虜','虧'=>'虧','虩'=>'虩','⾍'=>'虫','蚈'=>'蚈','蚩'=>'蚩','蛢'=>'蛢','蜎'=>'蜎','蜨'=>'蜨','蝫'=>'蝫','蝹'=>'蝹','蝹'=>'蝹','螆'=>'螆','螺'=>'螺','蟡'=>'蟡','蠁'=>'蠁','蠟'=>'蠟','⾎'=>'血','行'=>'行','⾏'=>'行','衠'=>'衠','衣'=>'衣','⾐'=>'衣','裂'=>'裂','裏'=>'裏','裗'=>'裗','裞'=>'裞','裡'=>'裡','裸'=>'裸','裺'=>'裺','褐'=>'褐','襁'=>'襁','襤'=>'襤','⾑'=>'襾','覆'=>'覆','見'=>'見','⾒'=>'見','視'=>'視','視'=>'視','⾓'=>'角','⾔'=>'言','䚶'=>'訞','詽'=>'訮','誠'=>'誠','說'=>'說','說'=>'說','調'=>'調','請'=>'請','諒'=>'諒','論'=>'論','諭'=>'諭','諭'=>'諭','諸'=>'諸','諸'=>'諸','諾'=>'諾','諾'=>'諾','謁'=>'謁','謁'=>'謁','謹'=>'謹','謹'=>'謹','識'=>'識','讀'=>'讀','讏'=>'讆','變'=>'變','變'=>'變','⾕'=>'谷','⾖'=>'豆','豈'=>'豈','豕'=>'豕','⾗'=>'豕','⾘'=>'豸','⾙'=>'貝','貫'=>'貫','賁'=>'賁','賂'=>'賂','賈'=>'賈','賓'=>'賓','贈'=>'贈','贈'=>'贈','贛'=>'贛','⾚'=>'赤','⾛'=>'走','起'=>'起','趆'=>'赿','⾜'=>'足','趼'=>'趼','跋'=>'跋','跺'=>'跥','路'=>'路','跰'=>'跰','躛'=>'躗','⾝'=>'身','車'=>'車','⾞'=>'車','軔'=>'軔','輧'=>'軿','輦'=>'輦','輪'=>'輪','輸'=>'輸','輸'=>'輸','輻'=>'輻','轢'=>'轢','⾟'=>'辛','辞'=>'辞','辰'=>'辰','⾠'=>'辰','⾡'=>'辵','辶'=>'辶','⻌'=>'辶','連'=>'連','逸'=>'逸','逸'=>'逸','遲'=>'遲','遼'=>'遼','邏'=>'邏','⾢'=>'邑','邔'=>'邔','郎'=>'郎','郱'=>'郱','都'=>'都','鄑'=>'鄑','鄛'=>'鄛','⾣'=>'酉','酪'=>'酪','醙'=>'醙','醴'=>'醴','⾤'=>'釆','里'=>'里','⾥'=>'里','量'=>'量','金'=>'金','⾦'=>'金','鈴'=>'鈴','鈸'=>'鈸','鉶'=>'鉶','鉼'=>'鉼','鋗'=>'鋗','鋘'=>'鋘','錄'=>'錄','鍊'=>'鍊','鎮'=>'鎭','鏹'=>'鏹','鐕'=>'鐕','⾧'=>'長','⾨'=>'門','開'=>'開','閭'=>'閭','閷'=>'閷','⾩'=>'阜','阮'=>'阮','陋'=>'陋','降'=>'降','陵'=>'陵','陸'=>'陸','陼'=>'陼','隆'=>'隆','隣'=>'隣','⾪'=>'隶','隸'=>'隸','⾫'=>'隹','雃'=>'雃','離'=>'離','難'=>'難','難'=>'難','⾬'=>'雨','零'=>'零','雷'=>'雷','霣'=>'霣','露'=>'露','靈'=>'靈','⾭'=>'靑','靖'=>'靖','靖'=>'靖','⾮'=>'非','⾯'=>'面','⾰'=>'革','⾱'=>'韋','韛'=>'韛','韠'=>'韠','⾲'=>'韭','⾳'=>'音','響'=>'響','響'=>'響','⾴'=>'頁','頋'=>'頋','頋'=>'頋','頋'=>'頋','領'=>'領','頩'=>'頩','頻'=>'頻','頻'=>'頻','類'=>'類','⾵'=>'風','⾶'=>'飛','⻝'=>'食','⾷'=>'食','飢'=>'飢','飯'=>'飯','飼'=>'飼','館'=>'館','餩'=>'餩','⾸'=>'首','⾹'=>'香','馧'=>'馧','⾺'=>'馬','駂'=>'駂','駱'=>'駱','駾'=>'駾','驪'=>'驪','⾻'=>'骨','⾼'=>'高','⾽'=>'髟','鬒'=>'鬒','鬒'=>'鬒','⾾'=>'鬥','⾿'=>'鬯','⿀'=>'鬲','⿁'=>'鬼','⿂'=>'魚','魯'=>'魯','鱀'=>'鱀','鱗'=>'鱗','⿃'=>'鳥','鳽'=>'鳽','鵧'=>'鵧','鶴'=>'鶴','鷺'=>'鷺','鸞'=>'鸞','鹃'=>'鹂','⿄'=>'鹵','鹿'=>'鹿','⿅'=>'鹿','麗'=>'麗','麟'=>'麟','⿆'=>'麥','麻'=>'麻','⿇'=>'麻','⿈'=>'黃','⿉'=>'黍','黎'=>'黎','⿊'=>'黑','黹'=>'黹','⿋'=>'黹','⿌'=>'黽','黾'=>'黾','鼅'=>'鼅','⿍'=>'鼎','鼏'=>'鼏','⿎'=>'鼓','鼖'=>'鼖','⿏'=>'鼠','鼻'=>'鼻','⿐'=>'鼻','齃'=>'齃','⿑'=>'齊','⿒'=>'齒','龍'=>'龍','⿓'=>'龍','龎'=>'龎','龜'=>'龜','龜'=>'龜','龜'=>'龜','⿔'=>'龜','⻳'=>'龟','⿕'=>'龠','㒞'=>'㒞','㒹'=>'㒹','㒻'=>'㒻','㓟'=>'㓟','㔕'=>'㔕','䎛'=>'㖈','㛮'=>'㛮','㛼'=>'㛼','㞁'=>'㞁','㠯'=>'㠯','㡢'=>'㡢','㡼'=>'㡼','㣇'=>'㣇','㣣'=>'㣣','㤜'=>'㤜','㤺'=>'㤺','㨮'=>'㨮','㩬'=>'㩬','㫤'=>'㫤','㬈'=>'㬈','㬙'=>'㬙','䐠'=>'㬻','㭉'=>'㭉','㮝'=>'㮝','㮝'=>'㮝','㰘'=>'㰘','㱎'=>'㱎','㴳'=>'㴳','㶖'=>'㶖','㺬'=>'㺬','㺸'=>'㺸','㺸'=>'㺸','㼛'=>'㼛','㿼'=>'㿼','䀈'=>'䀈','䀘'=>'䀘','䀹'=>'䀹','䀹'=>'䀹','䁆'=>'䁆','䂖'=>'䂖','䃣'=>'䃣','䄯'=>'䄯','䈂'=>'䈂','䈧'=>'䈧','䊠'=>'䊠','䌁'=>'䌁','䌴'=>'䌴','䍙'=>'䍙','䏕'=>'䏕','䏙'=>'䏙','䐋'=>'䐋','䑫'=>'䑫','䔫'=>'䔫','䕝'=>'䕝','䕡'=>'䕡','䕫'=>'䕫','䗗'=>'䗗','䗹'=>'䗹','䘵'=>'䘵','䚾'=>'䚾','䛇'=>'䛇','䦕'=>'䦕','䧦'=>'䧦','䩮'=>'䩮','䩶'=>'䩶','䪲'=>'䪲','䬳'=>'䬳','䯎'=>'䯎','䳎'=>'䳎','䳭'=>'䳭','䳸'=>'䳸','䵖'=>'䵖','𠄢'=>'𠄢','𠔜'=>'𠔜','𠔥'=>'𠔥','𠕋'=>'𠕋','𠘺'=>'𠘺','𠠄'=>'𠠄','𠣞'=>'𠣞','𠨬'=>'𠨬','𠭣'=>'𠭣','𡓤'=>'𡓤','𡚨'=>'𡚨','𡛪'=>'𡛪','𡧈'=>'𡧈','𡬘'=>'𡬘','𡴋'=>'𡴋','𡷤'=>'𡷤','𡷦'=>'𡷦','𢆃'=>'𢆃','𢆟'=>'𢆟','𢌱'=>'𢌱','𢌱'=>'𢌱','𢛔'=>'𢛔','𢡄'=>'𢡄','𢡊'=>'𢡊','𢬌'=>'𢬌','𢯱'=>'𢯱','𣀊'=>'𣀊','𣊸'=>'𣊸','𣍟'=>'𣍟','𣎓'=>'𣎓','𣎜'=>'𣎜','𣏃'=>'𣏃','𣏕'=>'𣏕','𣑭'=>'𣑭','𣚣'=>'𣚣','𣢧'=>'𣢧','𣪍'=>'𣪍','𣫺'=>'𣫺','𣲼'=>'𣲼','𣴞'=>'𣴞','𣻑'=>'𣻑','𣽞'=>'𣽞','𣾎'=>'𣾎','𤉣'=>'𤉣','𤎫'=>'𤎫','𤘈'=>'𤘈','𤜵'=>'𤜵','𤠔'=>'𤠔','𤰶'=>'𤰶','𤲒'=>'𤲒','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','𥃲'=>'𥃲','𥃳'=>'𥃳','𥄙'=>'𥄙','𥄳'=>'𥄳','𥉉'=>'𥉉','𥐝'=>'𥐝','𥘦'=>'𥘦','𥚚'=>'𥚚','𥛅'=>'𥛅','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','𥮫'=>'𥮫','𥲀'=>'𥲀','𥳐'=>'𥳐','𥾆'=>'𥾆','𦇚'=>'𦇚','𦈨'=>'𦈨','𦉇'=>'𦉇','𦋙'=>'𦋙','𦌾'=>'𦌾','𦓚'=>'𦓚','𦔣'=>'𦔣','𦖨'=>'𦖨','𦞧'=>'𦞧','𦞵'=>'𦞵','𦬼'=>'𦬼','𦰶'=>'𦰶','𦳕'=>'𦳕','𦵫'=>'𦵫','𦼬'=>'𦼬','𦾱'=>'𦾱','𧃒'=>'𧃒','𧏊'=>'𧏊','𧙧'=>'𧙧','𧢮'=>'𧢮','𧥦'=>'𧥦','𧲨'=>'𧲨','𧻓'=>'𧻓','𧼯'=>'𧼯','𨗒'=>'𨗒','𨗭'=>'𨗭','𨜮'=>'𨜮','𨯺'=>'𨯺','𨵷'=>'𨵷','𩅅'=>'𩅅','𩇟'=>'𩇟','𩈚'=>'𩈚','𩐊'=>'𩐊','𩒖'=>'𩒖','𩖶'=>'𩖶','𩬰'=>'𩬰','𪃎'=>'𪃎','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','𪎒'=>'𪎒','𪘀'=>'𪘀','℃'=>'°C','℉'=>'°F','ℇ'=>'Ɛ','℻'=>'FAX','ℕ'=>'N','№'=>'No','ℚ'=>'Q','₨'=>'Rs','𝐓'=>'T','℡'=>'TEL','𝐔'=>'U','𝐖'=>'W','₩'=>'W̵','𝐗'=>'X','¥'=>'Y̵','𝚲'=>'Λ','𝚵'=>'Ξ','ℿ'=>'Π','ϲ'=>'c','ϒ'=>'Y','𝚽'=>'Φ','𝚿'=>'Ψ','ѣ'=>'Ь̵','ਃ'=>'ঃ','ಃ'=>'ః','່'=>'่','់'=>'่','້'=>'้','໊'=>'๊','໋'=>'๋','៕'=>'๚','៚'=>'๛','ъ'=>'ˉb','៙'=>'๏','೧'=>'౧','૨'=>'२','೨'=>'౨','૩'=>'३','૪'=>'४','૮'=>'८','೯'=>'౯','а'=>'a','Ꮟ'=>'b','ᖯ'=>'b','с'=>'c','ԁ'=>'d','ᑯ'=>'d','е'=>'e','ә'=>'ǝ','ε'=>'ɛ','є'=>'ɛ','ք'=>'f','ց'=>'g','һ'=>'h','հ'=>'h','Ꮒ'=>'h','Ᏺ'=>'h̔','ι'=>'i','і'=>'i','Ꭵ'=>'i','ј'=>'j','յ'=>'j','ᗰ'=>'m','ո'=>'n','η'=>'n̩','ం'=>'o','ಂ'=>'o','ം'=>'o','०'=>'o','੦'=>'o','૦'=>'o','๐'=>'o','໐'=>'o','ο'=>'o','о'=>'o','օ'=>'o','ဝ'=>'o','ρ'=>'p','р'=>'p','ᴩ'=>'ᴘ','գ'=>'q','κ'=>'ĸ','к'=>'ĸ','ᴦ'=>'r','г'=>'r','ѕ'=>'s','υ'=>'u','ս'=>'u','ν'=>'v','ѵ'=>'v','Ꮃ'=>'w','ᗯ'=>'w','х'=>'x','ᕁ'=>'x','у'=>'y','Ꭹ'=>'y','ӡ'=>'ʒ','ჳ'=>'ʒ','ϩ'=>'ƨ','ь'=>'ƅ','ы'=>'ƅi','ɑ'=>'α','ծ'=>'δ','ᕷ'=>'δ','п'=>'π','ɸ'=>'φ','ф'=>'φ','ʙ'=>'в','ɜ'=>'з','ᴍ'=>'м','ʜ'=>'н','ɢ'=>'ԍ','ᴛ'=>'т','ᴙ'=>'я','ઽ'=>'ऽ','ુ'=>'ु','ૂ'=>'ू','ੋ'=>'ॆ','੍'=>'्','્'=>'्','ഉ'=>'உ','ജ'=>'ஐ','ണ'=>'ண','ഴ'=>'ழ','ി'=>'ி','ു'=>'ூ','ಅ'=>'అ','ಆ'=>'ఆ','ಇ'=>'ఇ','ಒ'=>'ఒ','ಓ'=>'ఒౕ','ಜ'=>'జ','ಞ'=>'ఞ','ಣ'=>'ణ','థ'=>'ధּ','ಯ'=>'య','ఠ'=>'రּ','ಱ'=>'ఱ','ಲ'=>'ల','ඌ'=>'ന്ന','ஶ'=>'ശ','ຈ'=>'จ','ບ'=>'บ','ປ'=>'ป','ຝ'=>'ฝ','ພ'=>'พ','ຟ'=>'ฟ','ຍ'=>'ย','។'=>'ฯ','ិ'=>'ิ','ី'=>'ี','ឹ'=>'ึ','ឺ'=>'ื','ຸ'=>'ุ','ູ'=>'ู','ᗅ'=>'A','ᒍ'=>'J','ᕼ'=>'H','ᐯ'=>'V','ᑭ'=>'P','ᗷ'=>'B','ヘ'=>'へ','𐏑'=>'𐎂','𐏓'=>'𐎓','𒀸'=>'𐎚','ᅳ'=>'一','ǀ'=>'丨','ᅵ'=>'丨','Ꭺ'=>'A','Ᏼ'=>'B','Ꮯ'=>'C','ᗞ'=>'D','Ꭼ'=>'E','ᖴ'=>'F','Ꮐ'=>'G','Ꮋ'=>'H','Ꭻ'=>'J','Ꮶ'=>'K','Ꮮ'=>'L','Ꮇ'=>'M','Ꮲ'=>'P','ᖇ'=>'R','Ꮥ'=>'S','Ꮩ'=>'V','Ꮓ'=>'Z'); \ No newline at end of file
+<?php return array('¡'=>'i','ǃ'=>'!','α'=>'a',' '=>' ','­'=>'','۝'=>'','܏'=>'','᠆'=>'','᠎'=>'','​'=>'','‌'=>'','‍'=>'','
'=>'','
'=>'','⁠'=>'','⁡'=>'','⁢'=>'','⁣'=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'',''=>'','𝅳'=>'','𝅴'=>'','𝅵'=>'','𝅶'=>'','𝅷'=>'','𝅸'=>'','𝅹'=>'','𝅺'=>'','۬'=>'۟','̓'=>'̓','ُ'=>'̓','֜'=>'́','́'=>'́','݇'=>'́','॔'=>'́','̀'=>'̀','॓'=>'̀','̌'=>'̆','̑'=>'̂','֯'=>'̊','ஂ'=>'̊','ํ'=>'̊','ໍ'=>'̊','ံ'=>'̊','ំ'=>'̊','៓'=>'̊','゚'=>'̊','゚'=>'̊','ͦ'=>'̊','͂'=>'̃','ׄ'=>'̇','ֹ'=>'̇','ׂ'=>'̇','ׁ'=>'̇','݁'=>'̇','ं'=>'̇','ਂ'=>'̇','ં'=>'̇','்'=>'̇','̅'=>'̄','〬'=>'̉','̱'=>'̠','॒'=>'̠','̧'=>'̡','̦'=>'̡','̨'=>'̢','़'=>'̣','়'=>'̣','਼'=>'̣','઼'=>'̣','଼'=>'̣','͇'=>'̳','̶'=>'̵','ﱞ'=>'ﹲّ','ﱟ'=>'ﹴّ','ﳲ'=>'ﹷّ','ﱠ'=>'ﹶّ','ﳳ'=>'ﹹّ','ﱡ'=>'ﹸّ','ﳴ'=>'ﹻّ','ﱢ'=>'ﹺّ','ﱣ'=>'ﹼٰ','ٴ'=>'ٔ','݂'=>'ܼ','౦'=>'o','೦'=>'o','゙'=>'゙',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','`'=>'`','`'=>'`','῀'=>'˜','^'=>'^','︿'=>'^','_'=>'_','﹍'=>'_','﹎'=>'_','﹏'=>'_','⌇'=>'︴','-'=>'-','‐'=>'-','‑'=>'-','‒'=>'-','–'=>'-','﹘'=>'-','∼'=>'⁓','・'=>'・','•'=>'・',','=>',','‚'=>',','٬'=>'،','、'=>'、',';'=>';',';'=>';',':'=>':','։'=>':','︰'=>':','׃'=>':','⩴'=>'::=','.'=>'.','․'=>'.','܂'=>'.','‥'=>'..','…'=>'...','。'=>'。','·'=>'·','‧'=>'·','∙'=>'·','⋅'=>'·','ᐧ'=>'·','ᔯ'=>'·4','ᐌ'=>'·ᐁ','ᐎ'=>'·ᐃ','ᐐ'=>'·ᐄ','ᐒ'=>'·ᐅ','ᐔ'=>'·ᐆ','ᐗ'=>'·ᐊ','ᐙ'=>'·ᐋ','ᐷ'=>'·ᐳ','ᑀ'=>'·ᐳ','ᑂ'=>'·ᐴ','ᑄ'=>'·ᐸ','ᑆ'=>'·ᐹ','ᑗ'=>'·ᑌ','ᑙ'=>'·ᑎ','ᑛ'=>'·ᑏ','ᑔ'=>'·ᑐ','ᑝ'=>'·ᑐ','ᑟ'=>'·ᑑ','ᑡ'=>'·ᑕ','ᑣ'=>'·ᑖ','ᑴ'=>'·ᑫ','ᑸ'=>'·ᑮ','ᑼ'=>'·ᑰ','ᑾ'=>'·ᑲ','ᒀ'=>'·ᑳ','ᒒ'=>'·ᒉ','ᒔ'=>'·ᒋ','ᒖ'=>'·ᒌ','ᒚ'=>'·ᒎ','ᒜ'=>'·ᒐ','ᒞ'=>'·ᒑ','ᒬ'=>'·ᒣ','ᒮ'=>'·ᒥ','ᒰ'=>'·ᒦ','ᒲ'=>'·ᒧ','ᒴ'=>'·ᒨ','ᒶ'=>'·L','ᒸ'=>'·ᒫ','ᓉ'=>'·ᓀ','ᓋ'=>'·ᓇ','ᓍ'=>'·ᓈ','ᓜ'=>'·ᓓ','ᓞ'=>'·ᓕ','ᓠ'=>'·ᓖ','ᓢ'=>'·ᓗ','ᓤ'=>'·ᓘ','ᓦ'=>'·ᓚ','ᓨ'=>'·ᓛ','ᓶ'=>'·ᓭ','ᓸ'=>'·ᓯ','ᓺ'=>'·ᓰ','ᓼ'=>'·ᓱ','ᓾ'=>'·ᓲ','ᔀ'=>'·ᓴ','ᔂ'=>'·ᓵ','ᔗ'=>'·ᔐ','ᔙ'=>'·ᔑ','ᔛ'=>'·ᔒ','ᔝ'=>'·ᔓ','ᔟ'=>'·ᔔ','ᔡ'=>'·ᔕ','ᔣ'=>'·ᔖ','ᔱ'=>'·ᔨ','ᔳ'=>'·ᔩ','ᔵ'=>'·ᔪ','ᔷ'=>'·ᔫ','ᔹ'=>'·ᔭ','ᔻ'=>'·ᔮ','ᕎ'=>'·ᕌ','ᕛ'=>'·ᕚ','ᕨ'=>'·ᕧ','('=>'(','⑴'=>'(1)','⒧'=>'(l)','⑽'=>'(10)','⑾'=>'(11)','⑿'=>'(12)','⒀'=>'(13)','⒁'=>'(14)','⒂'=>'(15)','⒃'=>'(16)','⒄'=>'(17)','⒅'=>'(18)','⒆'=>'(19)','⑵'=>'(2)','⒇'=>'(20)','⑶'=>'(3)','⑷'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','⑻'=>'(8)','⑼'=>'(9)','⒜'=>'(a)','⒝'=>'(b)','⒞'=>'(c)','⒟'=>'(d)','⒠'=>'(e)','⒡'=>'(f)','⒢'=>'(g)','⒣'=>'(h)','⒤'=>'(i)','⒥'=>'(j)','⒦'=>'(k)','⒨'=>'(m)','⒩'=>'(n)','⒪'=>'(o)','⒫'=>'(p)','⒬'=>'(q)','⒭'=>'(r)','⒮'=>'(s)','⒯'=>'(t)','⒰'=>'(u)','⒱'=>'(v)','⒲'=>'(w)','⒳'=>'(x)','⒴'=>'(y)','⒵'=>'(z)','㈀'=>'(ᄀ)','㈎'=>'(가)','㈁'=>'(ᄂ)','㈏'=>'(나)','㈂'=>'(ᄃ)','㈐'=>'(다)','㈃'=>'(ᄅ)','㈑'=>'(라)','㈄'=>'(ᄆ)','㈒'=>'(마)','㈅'=>'(ᄇ)','㈓'=>'(바)','㈆'=>'(ᄉ)','㈔'=>'(사)','㈇'=>'(ᄋ)','㈕'=>'(아)','㈝'=>'(오전)','㈞'=>'(오후)','㈈'=>'(ᄌ)','㈖'=>'(자)','㈜'=>'(주)','㈉'=>'(ᄎ)','㈗'=>'(차)','㈊'=>'(ᄏ)','㈘'=>'(카)','㈋'=>'(ᄐ)','㈙'=>'(타)','㈌'=>'(ᄑ)','㈚'=>'(파)','㈍'=>'(ᄒ)','㈛'=>'(하)','㈠'=>'(一)','㈦'=>'(七)','㈢'=>'(三)','㈨'=>'(九)','㈡'=>'(二)','㈤'=>'(五)','㈹'=>'(代)','㈽'=>'(企)','㉁'=>'(休)','㈧'=>'(八)','㈥'=>'(六)','㈸'=>'(労)','㈩'=>'(十)','㈿'=>'(協)','㈴'=>'(名)','㈺'=>'(呼)','㈣'=>'(四)','㈯'=>'(土)','㈻'=>'(学)','㈰'=>'(日)','㈪'=>'(月)','㈲'=>'(有)','㈭'=>'(木)','㈱'=>'(株)','㈬'=>'(水)','㈫'=>'(火)','㈵'=>'(特)','㈼'=>'(監)','㈳'=>'(社)','㈷'=>'(祝)','㉀'=>'(祭)','㉂'=>'(自)','㉃'=>'(至)','㈶'=>'(財)','㈾'=>'(資)','㈮'=>'(金)',')'=>')','['=>'[','〔'=>'[',']'=>']','〕'=>']','{'=>'{','}'=>'}','⦅'=>'⦅','⦆'=>'⦆','「'=>'「','」'=>'」','@'=>'@','*'=>'*','/'=>'/','⁄'=>'/','∕'=>'/','\'=>'\\','&'=>'&','#'=>'#','%'=>'%','‶'=>'‵‵','‷'=>'‵‵‵','༌'=>'་','´'=>'ʹ','΄'=>'ʹ','´'=>'ʹ','\''=>'ʹ','''=>'ʹ','′'=>'ʹ','׳'=>'ʹ','ʹ'=>'ʹ','ˊ'=>'ʹ','"'=>'ʹʹ','"'=>'ʹʹ','″'=>'ʹʹ','〃'=>'ʹʹ','״'=>'ʹʹ','ʺ'=>'ʹʹ','‴'=>'ʹʹʹ','⁗'=>'ʹʹʹʹ','¯'=>'ˉ',' ̄'=>'ˉ','‾'=>'ˉ','﹉'=>'ˉ','﹊'=>'ˉ','﹋'=>'ˉ','﹌'=>'ˉ','˚'=>'°','௵'=>'௳','←'=>'←','→'=>'→','↑'=>'↑','↓'=>'↓','↵'=>'↲','⨡'=>'↾','𝛛'=>'∂','𝜕'=>'∂','𝝏'=>'∂','𝞉'=>'∂','𝟃'=>'∂','𝛁'=>'∇','𝛻'=>'∇','𝜵'=>'∇','𝝯'=>'∇','𝞩'=>'∇','+'=>'+','﬩'=>'+','‹'=>'<','<'=>'<','='=>'=','⩵'=>'==','⩶'=>'===','›'=>'>','>'=>'>','¬'=>'¬','¦'=>'¦','〜'=>'~','~'=>'~','﹨'=>'∖','⋀'=>'∧','⋁'=>'∨','⋂'=>'∩','⋃'=>'∪','∯'=>'∮∮','∰'=>'∮∮∮','≣'=>'≡','♁'=>'⊕','☉'=>'⊙','⟂'=>'⊥','▷'=>'⊲','⨝'=>'⋈','⨽'=>'⌙','☸'=>'⎈','⎮'=>'⎥','│'=>'│','▐'=>'▌','■'=>'■','☐'=>'□','○'=>'○','⦾'=>'◎','〛'=>'⟧','〈'=>'⟨','〈'=>'⟨','〉'=>'⟩','〉'=>'⟩','⧙'=>'⦚','〶'=>'〒','ー'=>'ー','¢'=>'¢','$'=>'$','£'=>'£','¥'=>'Y̵','₩'=>'W̵','0'=>'0','𝟎'=>'0','𝟘'=>'0','𝟢'=>'0','𝟬'=>'0','𝟶'=>'0','০'=>'0','୦'=>'0','௦'=>'0','᠐'=>'0','〇'=>'0','𝐎'=>'0','𝑂'=>'0','𝑶'=>'0','𝒪'=>'0','𝓞'=>'0','𝔒'=>'0','𝕆'=>'0','𝕺'=>'0','𝖮'=>'0','𝗢'=>'0','𝘖'=>'0','𝙊'=>'0','𝙾'=>'0','𝚶'=>'0','𝛰'=>'0','𝜪'=>'0','𝝤'=>'0','𝞞'=>'0','ⵔ'=>'0','ഠ'=>'0','⊖'=>'0̵','𝚯'=>'0̵','𝚹'=>'0̵','𝛩'=>'0̵','𝛳'=>'0̵','𝜣'=>'0̵','𝜭'=>'0̵','𝝝'=>'0̵','𝝧'=>'0̵','𝞗'=>'0̵','𝞡'=>'0̵','ⴱ'=>'0̵','Ꮎ'=>'0̵','۰'=>'٠','᭜'=>'᭐','㍘'=>'0点','1'=>'1','𝟏'=>'1','𝟙'=>'1','𝟣'=>'1','𝟭'=>'1','𝟷'=>'1','ℐ'=>'1','ℑ'=>'1','𝐈'=>'1','𝐼'=>'1','𝑰'=>'1','𝓘'=>'1','𝕀'=>'1','𝕴'=>'1','𝖨'=>'1','𝗜'=>'1','𝘐'=>'1','𝙄'=>'1','𝙸'=>'1','l'=>'l','l'=>'l','ⅼ'=>'1','ℓ'=>'l','𝐥'=>'l','𝑙'=>'l','𝒍'=>'l','𝓁'=>'l','𝓵'=>'l','𝔩'=>'l','𝕝'=>'l','𝖑'=>'l','𝗅'=>'l','𝗹'=>'l','𝘭'=>'l','𝙡'=>'l','𝚕'=>'l','𝚰'=>'l','𝛪'=>'l','𝜤'=>'l','𝝞'=>'l','𝞘'=>'l','①'=>'➀','ɭ'=>'l̢','ɫ'=>'l̴','ƚ'=>'l̵','ł'=>'l̷','۱'=>'١','⒈'=>'1.','ŀ'=>'l·','ᒷ'=>'1·','⑩'=>'➉','⒑'=>'10.','㏩'=>'10日','㋉'=>'10月','㍢'=>'10点','⒒'=>'11.','㏪'=>'11日','㋊'=>'11月','㍣'=>'11点','⒓'=>'12.','㏫'=>'12日','㋋'=>'12月','㍤'=>'12点','⒔'=>'13.','㏬'=>'13日','㍥'=>'13点','⒕'=>'14.','㏭'=>'14日','㍦'=>'14点','⒖'=>'15.','㏮'=>'15日','㍧'=>'15点','⒗'=>'16.','㏯'=>'16日','㍨'=>'16点','⒘'=>'17.','㏰'=>'17日','㍩'=>'17点','⒙'=>'18.','㏱'=>'18日','㍪'=>'18点','⒚'=>'19.','㏲'=>'19日','㍫'=>'19点','lj'=>'lj','㏠'=>'1日','㋀'=>'1月','㍙'=>'1点','2'=>'2','𝟐'=>'2','𝟚'=>'2','𝟤'=>'2','𝟮'=>'2','𝟸'=>'2','ᒿ'=>'2','②'=>'➁','۲'=>'٢','⒉'=>'2.','⒛'=>'20.','㏳'=>'20日','㍬'=>'20点','㏴'=>'21日','㍭'=>'21点','㏵'=>'22日','㍮'=>'22点','㏶'=>'23日','㍯'=>'23点','㏷'=>'24日','㍰'=>'24点','㏸'=>'25日','㏹'=>'26日','㏺'=>'27日','㏻'=>'28日','㏼'=>'29日','㏡'=>'2日','㋁'=>'2月','㍚'=>'2点','3'=>'3','𝟑'=>'3','𝟛'=>'3','𝟥'=>'3','𝟯'=>'3','𝟹'=>'3','③'=>'➂','۳'=>'٣','⒊'=>'3.','㏽'=>'30日','㏾'=>'31日','㏢'=>'3日','㋂'=>'3月','㍛'=>'3点','4'=>'4','𝟒'=>'4','𝟜'=>'4','𝟦'=>'4','𝟰'=>'4','𝟺'=>'4','Ꮞ'=>'4','④'=>'➃','⒋'=>'4.','ᔰ'=>'4·','㏣'=>'4日','㋃'=>'4月','㍜'=>'4点','5'=>'5','𝟓'=>'5','𝟝'=>'5','𝟧'=>'5','𝟱'=>'5','𝟻'=>'5','⑤'=>'➄','⒌'=>'5.','㏤'=>'5日','㋄'=>'5月','㍝'=>'5点','6'=>'6','𝟔'=>'6','𝟞'=>'6','𝟨'=>'6','𝟲'=>'6','𝟼'=>'6','б'=>'6','⑥'=>'➅','⒍'=>'6.','㏥'=>'6日','㋅'=>'6月','㍞'=>'6点','7'=>'7','𝟕'=>'7','𝟟'=>'7','𝟩'=>'7','𝟳'=>'7','𝟽'=>'7','⑦'=>'➆','۷'=>'٧','⒎'=>'7.','㏦'=>'7日','㋆'=>'7月','㍟'=>'7点','ଃ'=>'8','৪'=>'8','੪'=>'8','8'=>'8','𝟖'=>'8','𝟠'=>'8','𝟪'=>'8','𝟴'=>'8','𝟾'=>'8','ȣ'=>'8','⑧'=>'➇','۸'=>'٨','⒏'=>'8.','㏧'=>'8日','㋇'=>'8月','㍠'=>'8点','੧'=>'9','୨'=>'9','৭'=>'9','9'=>'9','𝟗'=>'9','𝟡'=>'9','𝟫'=>'9','𝟵'=>'9','𝟿'=>'9','⑨'=>'➈','۹'=>'٩','⒐'=>'9.','㏨'=>'9日','㋈'=>'9月','㍡'=>'9点','a'=>'a','𝐚'=>'a','𝑎'=>'a','𝒂'=>'a','𝒶'=>'a','𝓪'=>'a','𝔞'=>'a','𝕒'=>'a','𝖆'=>'a','𝖺'=>'a','𝗮'=>'a','𝘢'=>'a','𝙖'=>'a','𝚊'=>'a','℀'=>'a/c','℁'=>'a/s','æ'=>'ae','b'=>'b','𝐛'=>'b','𝑏'=>'b','𝒃'=>'b','𝒷'=>'b','𝓫'=>'b','𝔟'=>'b','𝕓'=>'b','𝖇'=>'b','𝖻'=>'b','𝗯'=>'b','𝘣'=>'b','𝙗'=>'b','𝚋'=>'b','ɓ'=>'b̔','ƃ'=>'b̄','ƀ'=>'b̵','c'=>'c','ⅽ'=>'c','𝐜'=>'c','𝑐'=>'c','𝒄'=>'c','𝒸'=>'c','𝓬'=>'c','𝔠'=>'c','𝕔'=>'c','𝖈'=>'c','𝖼'=>'c','𝗰'=>'c','𝘤'=>'c','𝙘'=>'c','𝚌'=>'c','𝛓'=>'c','𝜍'=>'c','𝝇'=>'c','𝞁'=>'c','𝞻'=>'c','℅'=>'c/o','℆'=>'c/u','d'=>'d','ⅾ'=>'d','ⅆ'=>'d','𝐝'=>'d','𝑑'=>'d','𝒅'=>'d','𝒹'=>'d','𝓭'=>'d','𝔡'=>'d','𝕕'=>'d','𝖉'=>'d','𝖽'=>'d','𝗱'=>'d','𝘥'=>'d','𝙙'=>'d','𝚍'=>'d','ɗ'=>'d̔','ƌ'=>'d̄','ɖ'=>'d̢','đ'=>'d̵','dz'=>'dz','dž'=>'dž','e'=>'e','ℯ'=>'e','ⅇ'=>'e','𝐞'=>'e','𝑒'=>'e','𝒆'=>'e','𝓮'=>'e','𝔢'=>'e','𝕖'=>'e','𝖊'=>'e','𝖾'=>'e','𝗲'=>'e','𝘦'=>'e','𝙚'=>'e','𝚎'=>'e','ⴹ'=>'E','ə'=>'ǝ','ɚ'=>'ǝ˞','⋴'=>'ɛ','𝛆'=>'ɛ','𝛜'=>'ɛ','𝜀'=>'ɛ','𝜖'=>'ɛ','𝜺'=>'ɛ','𝝐'=>'ɛ','𝝴'=>'ɛ','𝞊'=>'ɛ','𝞮'=>'ɛ','𝟄'=>'ɛ','f'=>'f','𝐟'=>'f','𝑓'=>'f','𝒇'=>'f','𝒻'=>'f','𝓯'=>'f','𝔣'=>'f','𝕗'=>'f','𝖋'=>'f','𝖿'=>'f','𝗳'=>'f','𝘧'=>'f','𝙛'=>'f','𝚏'=>'f','ƒ'=>'f̡','g'=>'g','ℊ'=>'g','𝐠'=>'g','𝑔'=>'g','𝒈'=>'g','𝓰'=>'g','𝔤'=>'g','𝕘'=>'g','𝖌'=>'g','𝗀'=>'g','𝗴'=>'g','𝘨'=>'g','𝙜'=>'g','𝚐'=>'g','ɡ'=>'g','ɠ'=>'g̔','ǥ'=>'g̵','h'=>'h','ℎ'=>'h','𝐡'=>'h','𝒉'=>'h','𝒽'=>'h','𝓱'=>'h','𝔥'=>'h','𝕙'=>'h','𝖍'=>'h','𝗁'=>'h','𝗵'=>'h','𝘩'=>'h','𝙝'=>'h','𝚑'=>'h','ɦ'=>'h̔','ħ'=>'h̵','ℏ'=>'h̵','῾'=>'ʻ','‘'=>'ʻ','‛'=>'ʻ','ʽ'=>'ʻ','⍳'=>'i','i'=>'i','ⅰ'=>'i','ℹ'=>'i','ⅈ'=>'i','𝐢'=>'i','𝑖'=>'i','𝒊'=>'i','𝒾'=>'i','𝓲'=>'i','𝔦'=>'i','𝕚'=>'i','𝖎'=>'i','𝗂'=>'i','𝗶'=>'i','𝘪'=>'i','𝙞'=>'i','𝚒'=>'i','ı'=>'i','𝚤'=>'i','ɪ'=>'i','ɩ'=>'i','𝛊'=>'i','𝜄'=>'i','𝜾'=>'i','𝝸'=>'i','𝞲'=>'i','ɨ'=>'i̵','ⅱ'=>'ii','ⅲ'=>'iii','ij'=>'ij','ⅳ'=>'iv','ⅸ'=>'ix','j'=>'j','ⅉ'=>'j','𝐣'=>'j','𝑗'=>'j','𝒋'=>'j','𝒿'=>'j','𝓳'=>'j','𝔧'=>'j','𝕛'=>'j','𝖏'=>'j','𝗃'=>'j','𝗷'=>'j','𝘫'=>'j','𝙟'=>'j','𝚓'=>'j','ϳ'=>'j','𝚥'=>'ȷ','k'=>'k','𝐤'=>'k','𝑘'=>'k','𝒌'=>'k','𝓀'=>'k','𝓴'=>'k','𝔨'=>'k','𝕜'=>'k','𝖐'=>'k','𝗄'=>'k','𝗸'=>'k','𝘬'=>'k','𝙠'=>'k','𝚔'=>'k','ƙ'=>'k̔','m'=>'m','ⅿ'=>'m','𝐦'=>'m','𝑚'=>'m','𝒎'=>'m','𝓂'=>'m','𝓶'=>'m','𝔪'=>'m','𝕞'=>'m','𝖒'=>'m','𝗆'=>'m','𝗺'=>'m','𝘮'=>'m','𝙢'=>'m','𝚖'=>'m','ɱ'=>'m̡','n'=>'n','𝐧'=>'n','𝑛'=>'n','𝒏'=>'n','𝓃'=>'n','𝓷'=>'n','𝔫'=>'n','𝕟'=>'n','𝖓'=>'n','𝗇'=>'n','𝗻'=>'n','𝘯'=>'n','𝙣'=>'n','𝚗'=>'n','𝐍'=>'N','𝑁'=>'N','𝑵'=>'N','𝒩'=>'N','𝓝'=>'N','𝔑'=>'N','𝕹'=>'N','𝖭'=>'N','𝗡'=>'N','𝘕'=>'N','𝙉'=>'N','𝙽'=>'N','𝚴'=>'N','𝛮'=>'N','𝜨'=>'N','𝝢'=>'N','𝞜'=>'N','ɲ'=>'ņ','ɳ'=>'n̢','ƞ'=>'n̩','𝛈'=>'n̩','𝜂'=>'n̩','𝜼'=>'n̩','𝝶'=>'n̩','𝞰'=>'n̩','nj'=>'nj','o'=>'o','ℴ'=>'o','𝐨'=>'o','𝑜'=>'o','𝒐'=>'o','𝓸'=>'o','𝔬'=>'o','𝕠'=>'o','𝖔'=>'o','𝗈'=>'o','𝗼'=>'o','𝘰'=>'o','𝙤'=>'o','𝚘'=>'o','ᴏ'=>'o','𝛐'=>'o','𝜊'=>'o','𝝄'=>'o','𝝾'=>'o','𝞸'=>'o','ɵ'=>'o̵','ǿ'=>'ó̵','ø'=>'o̷','œ'=>'oe','ơ'=>'oʼ','⍴'=>'p','p'=>'p','𝐩'=>'p','𝑝'=>'p','𝒑'=>'p','𝓅'=>'p','𝓹'=>'p','𝔭'=>'p','𝕡'=>'p','𝖕'=>'p','𝗉'=>'p','𝗽'=>'p','𝘱'=>'p','𝙥'=>'p','𝚙'=>'p','𝛒'=>'p','𝛠'=>'p','𝜌'=>'p','𝜚'=>'p','𝝆'=>'p','𝝔'=>'p','𝞀'=>'p','𝞎'=>'p','𝞺'=>'p','𝟈'=>'p','ƥ'=>'p̔','q'=>'q','𝐪'=>'q','𝑞'=>'q','𝒒'=>'q','𝓆'=>'q','𝓺'=>'q','𝔮'=>'q','𝕢'=>'q','𝖖'=>'q','𝗊'=>'q','𝗾'=>'q','𝘲'=>'q','𝙦'=>'q','𝚚'=>'q','𝐐'=>'Q','𝑄'=>'Q','𝑸'=>'Q','𝒬'=>'Q','𝓠'=>'Q','𝔔'=>'Q','𝕼'=>'Q','𝖰'=>'Q','𝗤'=>'Q','𝘘'=>'Q','𝙌'=>'Q','𝚀'=>'Q','ʠ'=>'q̔','𝛋'=>'ĸ','𝛞'=>'ĸ','𝜅'=>'ĸ','𝜘'=>'ĸ','𝜿'=>'ĸ','𝝒'=>'ĸ','𝝹'=>'ĸ','𝞌'=>'ĸ','𝞳'=>'ĸ','𝟆'=>'ĸ','r'=>'r','𝐫'=>'r','𝑟'=>'r','𝒓'=>'r','𝓇'=>'r','𝓻'=>'r','𝔯'=>'r','𝕣'=>'r','𝖗'=>'r','𝗋'=>'r','𝗿'=>'r','𝘳'=>'r','𝙧'=>'r','𝚛'=>'r','ɽ'=>'r̢','ɼ'=>'r̩','s'=>'s','𝐬'=>'s','𝑠'=>'s','𝒔'=>'s','𝓈'=>'s','𝓼'=>'s','𝔰'=>'s','𝕤'=>'s','𝖘'=>'s','𝗌'=>'s','𝘀'=>'s','𝘴'=>'s','𝙨'=>'s','𝚜'=>'s','ƽ'=>'s','ʂ'=>'s̢','∫'=>'ʃ','∬'=>'ʃʃ','∭'=>'ʃʃʃ','⨌'=>'ʃʃʃʃ','t'=>'t','𝐭'=>'t','𝑡'=>'t','𝒕'=>'t','𝓉'=>'t','𝓽'=>'t','𝔱'=>'t','𝕥'=>'t','𝖙'=>'t','𝗍'=>'t','𝘁'=>'t','𝘵'=>'t','𝙩'=>'t','𝚝'=>'t','𝑇'=>'T','𝑻'=>'T','𝒯'=>'T','𝓣'=>'T','𝔗'=>'T','𝕋'=>'T','𝕿'=>'T','𝖳'=>'T','𝗧'=>'T','𝘛'=>'T','𝙏'=>'T','𝚃'=>'T','𝚻'=>'T','𝛵'=>'T','𝜯'=>'T','𝝩'=>'T','𝞣'=>'T','ƭ'=>'t̔','ț'=>'ţ','ƫ'=>'ţ','ŧ'=>'t̵','u'=>'u','𝐮'=>'u','𝑢'=>'u','𝒖'=>'u','𝓊'=>'u','𝓾'=>'u','𝔲'=>'u','𝕦'=>'u','𝖚'=>'u','𝗎'=>'u','𝘂'=>'u','𝘶'=>'u','𝙪'=>'u','𝚞'=>'u','ʊ'=>'u','ʋ'=>'u','𝛖'=>'u','𝜐'=>'u','𝝊'=>'u','𝞄'=>'u','𝞾'=>'u','𝑈'=>'U','𝑼'=>'U','𝒰'=>'U','𝓤'=>'U','𝔘'=>'U','𝕌'=>'U','𝖀'=>'U','𝖴'=>'U','𝗨'=>'U','𝘜'=>'U','𝙐'=>'U','𝚄'=>'U','v'=>'v','ⅴ'=>'v','𝐯'=>'v','𝑣'=>'v','𝒗'=>'v','𝓋'=>'v','𝓿'=>'v','𝔳'=>'v','𝕧'=>'v','𝖛'=>'v','𝗏'=>'v','𝘃'=>'v','𝘷'=>'v','𝙫'=>'v','𝚟'=>'v','𝛎'=>'v','𝜈'=>'v','𝝂'=>'v','𝝼'=>'v','𝞶'=>'v','ⅵ'=>'vi','ⅶ'=>'vii','ⅷ'=>'viii','ɯ'=>'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','×'=>'x','x'=>'x','ⅹ'=>'x','𝐱'=>'x','𝑥'=>'x','𝒙'=>'x','𝓍'=>'x','𝔁'=>'x','𝔵'=>'x','𝕩'=>'x','𝖝'=>'x','𝗑'=>'x','𝘅'=>'x','𝘹'=>'x','𝙭'=>'x','𝚡'=>'x','᙭'=>'X','𝑋'=>'X','𝑿'=>'X','𝒳'=>'X','𝓧'=>'X','𝔛'=>'X','𝕏'=>'X','𝖃'=>'X','𝖷'=>'X','𝗫'=>'X','𝘟'=>'X','𝙓'=>'X','𝚇'=>'X','𝚾'=>'X','𝛸'=>'X','𝜲'=>'X','𝝬'=>'X','𝞦'=>'X','ⅺ'=>'xi','ⅻ'=>'xii','y'=>'y','𝐲'=>'y','𝑦'=>'y','𝒚'=>'y','𝓎'=>'y','𝔂'=>'y','𝔶'=>'y','𝕪'=>'y','𝖞'=>'y','𝗒'=>'y','𝘆'=>'y','𝘺'=>'y','𝙮'=>'y','𝚢'=>'y','ƴ'=>'y̔','z'=>'z','𝐳'=>'z','𝑧'=>'z','𝒛'=>'z','𝓏'=>'z','𝔃'=>'z','𝔷'=>'z','𝕫'=>'z','𝖟'=>'z','𝗓'=>'z','𝘇'=>'z','𝘻'=>'z','𝙯'=>'z','𝚣'=>'z','ȥ'=>'z̡','ʐ'=>'z̢','ƶ'=>'z̵','ȝ'=>'ʒ','?'=>'ʔ','?'=>'ʔ','⁇'=>'ʔʔ','⁈'=>'ʔǃ','᾽'=>'ʼ','᾿'=>'ʼ','’'=>'ʼ','ʾ'=>'ʼ','!'=>'ǃ','!'=>'ǃ','⁉'=>'ǃʔ','‼'=>'ǃǃ','⍺'=>'α','𝛂'=>'α','𝛼'=>'α','𝜶'=>'α','𝝰'=>'α','𝞪'=>'α','𝛃'=>'β','𝛽'=>'β','𝜷'=>'β','𝝱'=>'β','𝞫'=>'β','ℽ'=>'γ','𝛄'=>'γ','𝛾'=>'γ','𝜸'=>'γ','𝝲'=>'γ','𝞬'=>'γ','𝛅'=>'δ','𝛿'=>'δ','𝜹'=>'δ','𝝳'=>'δ','𝞭'=>'δ','𝟋'=>'ϝ','𝛇'=>'ζ','𝜁'=>'ζ','𝜻'=>'ζ','𝝵'=>'ζ','𝞯'=>'ζ','⍬'=>'θ','𝛉'=>'θ','𝛝'=>'θ','𝜃'=>'θ','𝜗'=>'θ','𝜽'=>'θ','𝝑'=>'θ','𝝷'=>'θ','𝞋'=>'θ','𝞱'=>'θ','𝟅'=>'θ','𝛌'=>'λ','𝜆'=>'λ','𝝀'=>'λ','𝝺'=>'λ','𝞴'=>'λ','𝛬'=>'Λ','𝜦'=>'Λ','𝝠'=>'Λ','𝞚'=>'Λ','𝛍'=>'μ','𝜇'=>'μ','𝝁'=>'μ','𝝻'=>'μ','𝞵'=>'μ','𝛏'=>'ξ','𝜉'=>'ξ','𝝃'=>'ξ','𝝽'=>'ξ','𝞷'=>'ξ','𝛯'=>'Ξ','𝜩'=>'Ξ','𝝣'=>'Ξ','𝞝'=>'Ξ','ℼ'=>'π','𝛑'=>'π','𝛡'=>'π','𝜋'=>'π','𝜛'=>'π','𝝅'=>'π','𝝕'=>'π','𝝿'=>'π','𝞏'=>'π','𝞹'=>'π','𝟉'=>'π','ᴨ'=>'π','∏'=>'Π','𝚷'=>'Π','𝛱'=>'Π','𝜫'=>'Π','𝝥'=>'Π','𝞟'=>'Π','𝛔'=>'σ','𝜎'=>'σ','𝝈'=>'σ','𝞂'=>'σ','𝞼'=>'σ','𝛕'=>'τ','𝜏'=>'τ','𝝉'=>'τ','𝞃'=>'τ','𝞽'=>'τ','𝐘'=>'Y','𝑌'=>'Y','𝒀'=>'Y','𝒴'=>'Y','𝓨'=>'Y','𝔜'=>'Y','𝕐'=>'Y','𝖄'=>'Y','𝖸'=>'Y','𝗬'=>'Y','𝘠'=>'Y','𝙔'=>'Y','𝚈'=>'Y','𝚼'=>'Y','𝛶'=>'Y','𝜰'=>'Y','𝝪'=>'Y','𝞤'=>'Y','𝛗'=>'φ','𝛟'=>'φ','𝜑'=>'φ','𝜙'=>'φ','𝝋'=>'φ','𝝓'=>'φ','𝞅'=>'φ','𝞍'=>'φ','𝞿'=>'φ','𝟇'=>'φ','𝛷'=>'Φ','𝜱'=>'Φ','𝝫'=>'Φ','𝞥'=>'Φ','𝛘'=>'χ','𝜒'=>'χ','𝝌'=>'χ','𝞆'=>'χ','𝟀'=>'χ','𝛙'=>'ψ','𝜓'=>'ψ','𝝍'=>'ψ','𝞇'=>'ψ','𝟁'=>'ψ','𝛹'=>'Ψ','𝜳'=>'Ψ','𝝭'=>'Ψ','𝞧'=>'Ψ','⍵'=>'ω','𝛚'=>'ω','𝜔'=>'ω','𝝎'=>'ω','𝞈'=>'ω','𝟂'=>'ω','ӕ'=>'ae','ғ'=>'r̵','ґ'=>'rᑊ','җ'=>'ж̩','ҙ'=>'з̡','ӏ'=>'i','ҋ'=>'й̡','қ'=>'ĸ̩','ҟ'=>'ĸ̵','ᴫ'=>'л','ӆ'=>'л̡','ӎ'=>'м̡','ӊ'=>'н̡','ӈ'=>'н̡','ң'=>'н̩','ө'=>'o̵','ѳ'=>'o̵','ҫ'=>'c̡','ҭ'=>'т̩','ү'=>'y','ұ'=>'y̵','ћ'=>'h̵','ѽ'=>'ѡ҃','ӌ'=>'ҷ','ҿ'=>'ҽ̢','ҍ'=>'Ь̵','զ'=>'q','ռ'=>'n','ℵ'=>'א','ﬡ'=>'א','אָ'=>'אַ','אּ'=>'אַ','ﭏ'=>'אל','ℶ'=>'ב','ℷ'=>'ג','ℸ'=>'ד','ﬢ'=>'ד','ﬣ'=>'ה','ﬤ'=>'כ','ﬥ'=>'ל','ﬦ'=>'ם','ﬠ'=>'ע','ﬧ'=>'ר','ﬨ'=>'ת','ﺀ'=>'ء','ﺂ'=>'آ','ﺁ'=>'آ','ﺄ'=>'أ','ﺃ'=>'أ','ٵ'=>'أ','ﭑ'=>'ٱ','ﭐ'=>'ٱ','ﺆ'=>'ؤ','ﺅ'=>'ؤ','ٶ'=>'ؤ','ﺈ'=>'إ','ﺇ'=>'إ','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺊ'=>'ئ','ﺉ'=>'ئ','ﯫ'=>'ئا','ﯪ'=>'ئا','ﯸ'=>'ئٻ','ﯷ'=>'ئٻ','ﯶ'=>'ئٻ','ﲗ'=>'ئج','ﰀ'=>'ئج','ﲘ'=>'ئح','ﰁ'=>'ئح','ﲙ'=>'ئخ','ﱤ'=>'ئر','ﱥ'=>'ئز','ﲚ'=>'ئم','ﳟ'=>'ئم','ﱦ'=>'ئم','ﰂ'=>'ئم','ﱧ'=>'ئن','ﲛ'=>'ئه','ﳠ'=>'ئه','ﯭ'=>'ئه','ﯬ'=>'ئه','ﯯ'=>'ئو','ﯮ'=>'ئو','ﯳ'=>'ئۆ','ﯲ'=>'ئۆ','ﯱ'=>'ئۇ','ﯰ'=>'ئۇ','ﯵ'=>'ئۈ','ﯴ'=>'ئۈ','ﯻ'=>'ئى','ﯺ'=>'ئى','ﱨ'=>'ئى','ﯹ'=>'ئى','ﰃ'=>'ئى','ﱩ'=>'ئى','ﰄ'=>'ئى','ﺎ'=>'ا','ﺍ'=>'ا','ﴼ'=>'اً','ﴽ'=>'اً','ﷳ'=>'اكبر','ﷲ'=>'الله','ﺑ'=>'ب','ﺒ'=>'ب','ﺐ'=>'ب','ﺏ'=>'ب','ﲜ'=>'بج','ﰅ'=>'بج','ﲝ'=>'بح','ﰆ'=>'بح','ﷂ'=>'بحى','ﲞ'=>'بخ','ﰇ'=>'بخ','ﶞ'=>'بخى','ﱪ'=>'بر','ﱫ'=>'بز','ﲟ'=>'بم','ﳡ'=>'بم','ﱬ'=>'بم','ﰈ'=>'بم','ﱭ'=>'بن','ﲠ'=>'به','ﳢ'=>'به','ﱮ'=>'بى','ﰉ'=>'بى','ﱯ'=>'بى','ﰊ'=>'بى','ﭔ'=>'ٻ','ﭕ'=>'ٻ','ﭓ'=>'ٻ','ﭒ'=>'ٻ','ې'=>'ٻ','ﯦ'=>'ٻ','ﯧ'=>'ٻ','ﯥ'=>'ٻ','ﯤ'=>'ٻ','ﭘ'=>'پ','ﭙ'=>'پ','ﭗ'=>'پ','ﭖ'=>'پ','ﭜ'=>'ڀ','ﭝ'=>'ڀ','ﭛ'=>'ڀ','ﭚ'=>'ڀ','ﺔ'=>'ة','ﺓ'=>'ة','ﺗ'=>'ت','ﺘ'=>'ت','ﺖ'=>'ت','ﺕ'=>'ت','ﲡ'=>'تج','ﰋ'=>'تج','ﵐ'=>'تجم','ﶠ'=>'تجى','ﶟ'=>'تجى','ﲢ'=>'تح','ﰌ'=>'تح','ﵒ'=>'تحج','ﵑ'=>'تحج','ﵓ'=>'تحم','ﲣ'=>'تخ','ﰍ'=>'تخ','ﵔ'=>'تخم','ﶢ'=>'تخى','ﶡ'=>'تخى','ﱰ'=>'تر','ﱱ'=>'تز','ﲤ'=>'تم','ﳣ'=>'تم','ﱲ'=>'تم','ﰎ'=>'تم','ﵕ'=>'تمج','ﵖ'=>'تمح','ﵗ'=>'تمخ','ﶤ'=>'تمى','ﶣ'=>'تمى','ﱳ'=>'تن','ﲥ'=>'ته','ﳤ'=>'ته','ﱴ'=>'تى','ﰏ'=>'تى','ﱵ'=>'تى','ﰐ'=>'تى','ﺛ'=>'ث','ﺜ'=>'ث','ﺚ'=>'ث','ﺙ'=>'ث','ﰑ'=>'ثج','ﱶ'=>'ثر','ﱷ'=>'ثز','ﲦ'=>'ثم','ﳥ'=>'ثم','ﱸ'=>'ثم','ﰒ'=>'ثم','ﱹ'=>'ثن','ﳦ'=>'ثه','ﱺ'=>'ثى','ﰓ'=>'ثى','ﱻ'=>'ثى','ﰔ'=>'ثى','ﭨ'=>'ٹ','ﭩ'=>'ٹ','ﭧ'=>'ٹ','ﭦ'=>'ٹ','ڻ'=>'ٹ','ﮢ'=>'ٹ','ﮣ'=>'ٹ','ﮡ'=>'ٹ','ﮠ'=>'ٹ','ﭠ'=>'ٺ','ﭡ'=>'ٺ','ﭟ'=>'ٺ','ﭞ'=>'ٺ','ﭤ'=>'ٿ','ﭥ'=>'ٿ','ﭣ'=>'ٿ','ﭢ'=>'ٿ','ﺟ'=>'ج','ﺠ'=>'ج','ﺞ'=>'ج','ﺝ'=>'ج','ﲧ'=>'جح','ﰕ'=>'جح','ﶦ'=>'جحى','ﶾ'=>'جحى','ﷻ'=>'جل جلاله','ﲨ'=>'جم','ﰖ'=>'جم','ﵙ'=>'جمح','ﵘ'=>'جمح','ﶧ'=>'جمى','ﶥ'=>'جمى','ﴝ'=>'جى','ﴁ'=>'جى','ﴞ'=>'جى','ﴂ'=>'جى','ﭸ'=>'ڃ','ﭹ'=>'ڃ','ﭷ'=>'ڃ','ﭶ'=>'ڃ','ﭴ'=>'ڄ','ﭵ'=>'ڄ','ﭳ'=>'ڄ','ﭲ'=>'ڄ','ﭼ'=>'چ','ﭽ'=>'چ','ﭻ'=>'چ','ﭺ'=>'چ','ﮀ'=>'ڇ','ﮁ'=>'ڇ','ﭿ'=>'ڇ','ﭾ'=>'ڇ','ﺣ'=>'ح','ﺤ'=>'ح','ﺢ'=>'ح','ﺡ'=>'ح','ﲩ'=>'حج','ﰗ'=>'حج','ﶿ'=>'حجى','ﲪ'=>'حم','ﰘ'=>'حم','ﵛ'=>'حمى','ﵚ'=>'حمى','ﴛ'=>'حى','ﳿ'=>'حى','ﴜ'=>'حى','ﴀ'=>'حى','ﺧ'=>'خ','ﺨ'=>'خ','ﺦ'=>'خ','ﺥ'=>'خ','ﲫ'=>'خج','ﰙ'=>'خج','ﰚ'=>'خح','ﲬ'=>'خم','ﰛ'=>'خم','ﴟ'=>'خى','ﴃ'=>'خى','ﴠ'=>'خى','ﴄ'=>'خى','ﺪ'=>'د','ﺩ'=>'د','ﺬ'=>'ذ','ﺫ'=>'ذ','ﱛ'=>'ذٰ','ﮉ'=>'ڈ','ﮈ'=>'ڈ','ﮅ'=>'ڌ','ﮄ'=>'ڌ','ﮃ'=>'ڍ','ﮂ'=>'ڍ','ﮇ'=>'ڎ','ﮆ'=>'ڎ','ﺮ'=>'ر','ﺭ'=>'ر','ﱜ'=>'رٰ','ﷶ'=>'رسول','﷼'=>'رىال','ﺰ'=>'ز','ﺯ'=>'ز','ﮍ'=>'ڑ','ﮌ'=>'ڑ','ﮋ'=>'ژ','ﮊ'=>'ژ','ﺳ'=>'س','ﺴ'=>'س','ﺲ'=>'س','ﺱ'=>'س','ﲭ'=>'سج','ﴴ'=>'سج','ﰜ'=>'سج','ﵝ'=>'سجح','ﵞ'=>'سجى','ﲮ'=>'سح','ﴵ'=>'سح','ﰝ'=>'سح','ﵜ'=>'سحج','ﲯ'=>'سخ','ﴶ'=>'سخ','ﰞ'=>'سخ','ﶨ'=>'سخى','ﷆ'=>'سخى','ﴪ'=>'سر','ﴎ'=>'سر','ﲰ'=>'سم','ﳧ'=>'سم','ﰟ'=>'سم','ﵡ'=>'سمج','ﵠ'=>'سمح','ﵟ'=>'سمح','ﵣ'=>'سمم','ﵢ'=>'سمم','ﴱ'=>'سه','ﳨ'=>'سه','ﴗ'=>'سى','ﳻ'=>'سى','ﴘ'=>'سى','ﳼ'=>'سى','ﺷ'=>'ش','ﺸ'=>'ش','ﺶ'=>'ش','ﺵ'=>'ش','ﴭ'=>'شج','ﴷ'=>'شج','ﴥ'=>'شج','ﴉ'=>'شج','ﵩ'=>'شجى','ﴮ'=>'شح','ﴸ'=>'شح','ﴦ'=>'شح','ﴊ'=>'شح','ﵨ'=>'شحم','ﵧ'=>'شحم','ﶪ'=>'شحى','ﴯ'=>'شخ','ﴹ'=>'شخ','ﴧ'=>'شخ','ﴋ'=>'شخ','ﴩ'=>'شر','ﴍ'=>'شر','ﴰ'=>'شم','ﳩ'=>'شم','ﴨ'=>'شم','ﴌ'=>'شم','ﵫ'=>'شمخ','ﵪ'=>'شمخ','ﵭ'=>'شمم','ﵬ'=>'شمم','ﴲ'=>'شه','ﳪ'=>'شه','ﴙ'=>'شى','ﳽ'=>'شى','ﴚ'=>'شى','ﳾ'=>'شى','ﺻ'=>'ص','ﺼ'=>'ص','ﺺ'=>'ص','ﺹ'=>'ص','ﲱ'=>'صح','ﰠ'=>'صح','ﵥ'=>'صحح','ﵤ'=>'صحح','ﶩ'=>'صحى','ﲲ'=>'صخ','ﴫ'=>'صر','ﴏ'=>'صر','ﷵ'=>'صلعم','ﷹ'=>'صلى','ﷺ'=>'صلى الله علىه وسلم','ﷰ'=>'صلے','ﲳ'=>'صم','ﰡ'=>'صم','ﷅ'=>'صمم','ﵦ'=>'صمم','ﴡ'=>'صى','ﴅ'=>'صى','ﴢ'=>'صى','ﴆ'=>'صى','ﺿ'=>'ض','ﻀ'=>'ض','ﺾ'=>'ض','ﺽ'=>'ض','ﲴ'=>'ضج','ﰢ'=>'ضج','ﲵ'=>'ضح','ﰣ'=>'ضح','ﵮ'=>'ضحى','ﶫ'=>'ضحى','ﲶ'=>'ضخ','ﰤ'=>'ضخ','ﵰ'=>'ضخم','ﵯ'=>'ضخم','ﴬ'=>'ضر','ﴐ'=>'ضر','ﲷ'=>'ضم','ﰥ'=>'ضم','ﴣ'=>'ضى','ﴇ'=>'ضى','ﴤ'=>'ضى','ﴈ'=>'ضى','ﻃ'=>'ط','ﻄ'=>'ط','ﻂ'=>'ط','ﻁ'=>'ط','ﲸ'=>'طح','ﰦ'=>'طح','ﴳ'=>'طم','ﴺ'=>'طم','ﰧ'=>'طم','ﵲ'=>'طمح','ﵱ'=>'طمح','ﵳ'=>'طمم','ﵴ'=>'طمى','ﴑ'=>'طى','ﳵ'=>'طى','ﴒ'=>'طى','ﳶ'=>'طى','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻆ'=>'ظ','ﻅ'=>'ظ','ﲹ'=>'ظم','ﴻ'=>'ظم','ﰨ'=>'ظم','ﻋ'=>'ع','ﻌ'=>'ع','ﻊ'=>'ع','ﻉ'=>'ع','ﲺ'=>'عج','ﰩ'=>'عج','ﷄ'=>'عجم','ﵵ'=>'عجم','ﷷ'=>'علىه','ﲻ'=>'عم','ﰪ'=>'عم','ﵷ'=>'عمم','ﵶ'=>'عمم','ﵸ'=>'عمى','ﶶ'=>'عمى','ﴓ'=>'عى','ﳷ'=>'عى','ﴔ'=>'عى','ﳸ'=>'عى','ﻏ'=>'غ','ﻐ'=>'غ','ﻎ'=>'غ','ﻍ'=>'غ','ﲼ'=>'غج','ﰫ'=>'غج','ﲽ'=>'غم','ﰬ'=>'غم','ﵹ'=>'غمم','ﵻ'=>'غمى','ﵺ'=>'غمى','ﴕ'=>'غى','ﳹ'=>'غى','ﴖ'=>'غى','ﳺ'=>'غى','ﻓ'=>'ف','ﻔ'=>'ف','ﻒ'=>'ف','ﻑ'=>'ف','ﲾ'=>'فج','ﰭ'=>'فج','ﲿ'=>'فح','ﰮ'=>'فح','ﳀ'=>'فخ','ﰯ'=>'فخ','ﵽ'=>'فخم','ﵼ'=>'فخم','ﳁ'=>'فم','ﰰ'=>'فم','ﷁ'=>'فمى','ﱼ'=>'فى','ﰱ'=>'فى','ﱽ'=>'فى','ﰲ'=>'فى','ﭬ'=>'ڤ','ﭭ'=>'ڤ','ﭫ'=>'ڤ','ﭪ'=>'ڤ','ﭰ'=>'ڦ','ﭱ'=>'ڦ','ﭯ'=>'ڦ','ﭮ'=>'ڦ','ﻗ'=>'ق','ﻘ'=>'ق','ﻖ'=>'ق','ﻕ'=>'ق','ﳂ'=>'قح','ﰳ'=>'قح','ﷱ'=>'قلے','ﳃ'=>'قم','ﰴ'=>'قم','ﶴ'=>'قمح','ﵾ'=>'قمح','ﵿ'=>'قمم','ﶲ'=>'قمى','ﱾ'=>'قى','ﰵ'=>'قى','ﱿ'=>'قى','ﰶ'=>'قى','ﻛ'=>'ك','ﻜ'=>'ك','ﻚ'=>'ك','ﻙ'=>'ك','ک'=>'ك','ﮐ'=>'ك','ﮑ'=>'ك','ﮏ'=>'ك','ﮎ'=>'ك','ﲀ'=>'كا','ﰷ'=>'كا','ﳄ'=>'كج','ﰸ'=>'كج','ﳅ'=>'كح','ﰹ'=>'كح','ﳆ'=>'كخ','ﰺ'=>'كخ','ﳇ'=>'كل','ﳫ'=>'كل','ﲁ'=>'كل','ﰻ'=>'كل','ﳈ'=>'كم','ﳬ'=>'كم','ﲂ'=>'كم','ﰼ'=>'كم','ﷃ'=>'كمم','ﶻ'=>'كمم','ﶷ'=>'كمى','ﲃ'=>'كى','ﰽ'=>'كى','ﲄ'=>'كى','ﰾ'=>'كى','ﯕ'=>'ڭ','ﯖ'=>'ڭ','ﯔ'=>'ڭ','ﯓ'=>'ڭ','ﮔ'=>'گ','ﮕ'=>'گ','ﮓ'=>'گ','ﮒ'=>'گ','ﮜ'=>'ڱ','ﮝ'=>'ڱ','ﮛ'=>'ڱ','ﮚ'=>'ڱ','ﮘ'=>'ڳ','ﮙ'=>'ڳ','ﮗ'=>'ڳ','ﮖ'=>'ڳ','ﻟ'=>'ل','ﻠ'=>'ل','ﻞ'=>'ل','ﻝ'=>'ل','ﻶ'=>'لآ','ﻵ'=>'لآ','ﻸ'=>'لأ','ﻷ'=>'لأ','ﻺ'=>'لإ','ﻹ'=>'لإ','ﻼ'=>'لا','ﻻ'=>'لا','ﳉ'=>'لج','ﰿ'=>'لج','ﶃ'=>'لجج','ﶄ'=>'لجج','ﶺ'=>'لجم','ﶼ'=>'لجم','ﶬ'=>'لجى','ﳊ'=>'لح','ﱀ'=>'لح','ﶵ'=>'لحم','ﶀ'=>'لحم','ﶂ'=>'لحى','ﶁ'=>'لحى','ﳋ'=>'لخ','ﱁ'=>'لخ','ﶆ'=>'لخم','ﶅ'=>'لخم','ﳌ'=>'لم','ﳭ'=>'لم','ﲅ'=>'لم','ﱂ'=>'لم','ﶈ'=>'لمح','ﶇ'=>'لمح','ﶭ'=>'لمى','ﳍ'=>'له','ﲆ'=>'لى','ﱃ'=>'لى','ﲇ'=>'لى','ﱄ'=>'لى','ﻣ'=>'م','ﻤ'=>'م','ﻢ'=>'م','ﻡ'=>'م','ﲈ'=>'ما','ﳎ'=>'مج','ﱅ'=>'مج','ﶌ'=>'مجح','ﶒ'=>'مجخ','ﶍ'=>'مجم','ﷀ'=>'مجى','ﳏ'=>'مح','ﱆ'=>'مح','ﶉ'=>'محج','ﶊ'=>'محم','ﷴ'=>'محمد','ﶋ'=>'محى','ﳐ'=>'مخ','ﱇ'=>'مخ','ﶎ'=>'مخج','ﶏ'=>'مخم','ﶹ'=>'مخى','ﳑ'=>'مم','ﲉ'=>'مم','ﱈ'=>'مم','ﶱ'=>'ممى','ﱉ'=>'مى','ﱊ'=>'مى','ﻧ'=>'ن','ﻨ'=>'ن','ﻦ'=>'ن','ﻥ'=>'ن','ﳒ'=>'نج','ﱋ'=>'نج','ﶸ'=>'نجح','ﶽ'=>'نجح','ﶘ'=>'نجم','ﶗ'=>'نجم','ﶙ'=>'نجى','ﷇ'=>'نجى','ﳓ'=>'نح','ﱌ'=>'نح','ﶕ'=>'نحم','ﶖ'=>'نحى','ﶳ'=>'نحى','ﳔ'=>'نخ','ﱍ'=>'نخ','ﲊ'=>'نر','ﲋ'=>'نز','ﳕ'=>'نم','ﳮ'=>'نم','ﲌ'=>'نم','ﱎ'=>'نم','ﶛ'=>'نمى','ﶚ'=>'نمى','ﲍ'=>'نن','ﳖ'=>'نه','ﳯ'=>'نه','ﲎ'=>'نى','ﱏ'=>'نى','ﲏ'=>'نى','ﱐ'=>'نى','ﮟ'=>'ں','ﮞ'=>'ں','ﻫ'=>'ه','ﻬ'=>'ه','ﻪ'=>'ه','ﻩ'=>'ه','ھ'=>'ه','ﮬ'=>'ه','ﮭ'=>'ه','ﮫ'=>'ه','ﮪ'=>'ه','ہ'=>'ه','ﮨ'=>'ه','ﮩ'=>'ه','ﮧ'=>'ه','ﮦ'=>'ه','ە'=>'ه','ﳙ'=>'هٰ','ﳗ'=>'هج','ﱑ'=>'هج','ﳘ'=>'هم','ﱒ'=>'هم','ﶓ'=>'همج','ﶔ'=>'همم','ﱓ'=>'هى','ﱔ'=>'هى','ﮥ'=>'ۀ','ﮤ'=>'ۀ','ﻮ'=>'و','ﻭ'=>'و','ﷸ'=>'وسلم','ﯡ'=>'ۅ','ﯠ'=>'ۅ','ﯚ'=>'ۆ','ﯙ'=>'ۆ','ﯘ'=>'ۇ','ﯗ'=>'ۇ','ٷ'=>'ۇٔ','ﯝ'=>'ۇٔ','ﯜ'=>'ۈ','ﯛ'=>'ۈ','ﯣ'=>'ۉ','ﯢ'=>'ۉ','ﯟ'=>'ۋ','ﯞ'=>'ۋ','ﯨ'=>'ى','ﯩ'=>'ى','ﻰ'=>'ى','ﻯ'=>'ى','ي'=>'ى','ﻳ'=>'ى','ﻴ'=>'ى','ﻲ'=>'ى','ﻱ'=>'ى','ی'=>'ى','ﯾ'=>'ى','ﯿ'=>'ى','ﯽ'=>'ى','ﯼ'=>'ى','ٸ'=>'ىٔ','ﲐ'=>'ىٰ','ﱝ'=>'ىٰ','ﳚ'=>'ىج','ﱕ'=>'ىج','ﶯ'=>'ىجى','ﳛ'=>'ىح','ﱖ'=>'ىح','ﶮ'=>'ىحى','ﳜ'=>'ىخ','ﱗ'=>'ىخ','ﲑ'=>'ىر','ﲒ'=>'ىز','ﳝ'=>'ىم','ﳰ'=>'ىم','ﲓ'=>'ىم','ﱘ'=>'ىم','ﶝ'=>'ىمم','ﶜ'=>'ىمم','ﶰ'=>'ىمى','ﲔ'=>'ىن','ﳞ'=>'ىه','ﳱ'=>'ىه','ﲕ'=>'ىى','ﱙ'=>'ىى','ﲖ'=>'ىى','ﱚ'=>'ىى','ۧ'=>'ۦ','ﮯ'=>'ے','ﮮ'=>'ے','ﮱ'=>'ۓ','ﮰ'=>'ۓ','∃'=>'ⴺ','आ'=>'अा','ऒ'=>'अाॆ','ओ'=>'अाे','औ'=>'अाै','ऄ'=>'अॆ','ऑ'=>'अॉ','ऍ'=>'एॅ','ऎ'=>'एॆ','ऐ'=>'एे','ई'=>'र्इ','আ'=>'অা','ৠ'=>'ঋৃ','ৡ'=>'ঌৢ','ਉ'=>'ੳੁ','ਊ'=>'ੳੂ','ਆ'=>'ਅਾ','ਐ'=>'ਅੈ','ਔ'=>'ਅੌ','ਇ'=>'ੲਿ','ਈ'=>'ੲੀ','ਏ'=>'ੲੇ','આ'=>'અા','ઑ'=>'અાૅ','ઓ'=>'અાે','ઔ'=>'અાૈ','ઍ'=>'અૅ','એ'=>'અે','ઐ'=>'અૈ','ଆ'=>'ଅା','௮'=>'அ','ர'=>'ஈ','ா'=>'ஈ','௫'=>'ஈு','௨'=>'உ','ஊ'=>'உள','௭'=>'எ','௷'=>'எவ','ஜ'=>'ஐ','௧'=>'க','௪'=>'ச','௬'=>'சு','௲'=>'சூ','௺'=>'நீ','ை'=>'ன','௴'=>'மீ','௰'=>'ய','ௗ'=>'ள','௸'=>'ஷ','ொ'=>'ெஈ','ௌ'=>'ெள','ோ'=>'ேஈ','ౠ'=>'ఋా','ౡ'=>'ఌా','ఔ'=>'ఒౌ','ఓ'=>'ఒౕ','ఢ'=>'డ̣','భ'=>'బ̣','ష'=>'వ̣','హ'=>'వా','మ'=>'వు','ూ'=>'ుా','ౄ'=>'ృా','ೡ'=>'ಌಾ','ಔ'=>'ఒౌ','ഈ'=>'ഇൗ','ഊ'=>'உൗ','ഐ'=>'എെ','ഓ'=>'ഒാ','ഔ'=>'ഒൗ','ൡ'=>'ഞ','൫'=>'ദ്ര','ഌ'=>'നூ','ങ'=>'നூ','൯'=>'ന്','റ'=>'ര','൪'=>'ര്','൮'=>'വ്','ീ'=>'ி','ൂ'=>'ூ','ൃ'=>'ூ','ൈ'=>'െെ','ฃ'=>'ข','ด'=>'ค','ต'=>'ค','ม'=>'ฆ','ซ'=>'ช','ฏ'=>'ฎ','ท'=>'ฑ','ๅ'=>'า','ำ'=>'̊า','แ'=>'เเ','ໜ'=>'ຫນ','ໝ'=>'ຫມ','ຳ'=>'̊າ','ཷ'=>'ྲཱྀ','ཹ'=>'ླཱྀ','၀'=>'o','ឣ'=>'អ','᧐'=>'ᦞ','᭒'=>'ᬍ','᭓'=>'ᬑ','᭘'=>'ᬨ','ᢖ'=>'ᡜ','ᡕ'=>'ᠵ','Ꮢ'=>'Ꭱ','Ꮍ'=>'y','𝐀'=>'A','𝐴'=>'A','𝑨'=>'A','𝒜'=>'A','𝓐'=>'A','𝔄'=>'A','𝔸'=>'A','𝕬'=>'A','𝖠'=>'A','𝗔'=>'A','𝘈'=>'A','𝘼'=>'A','𝙰'=>'A','𝚨'=>'A','𝛢'=>'A','𝜜'=>'A','𝝖'=>'A','𝞐'=>'A','𝐉'=>'J','𝐽'=>'J','𝑱'=>'J','𝒥'=>'J','𝓙'=>'J','𝔍'=>'J','𝕁'=>'J','𝕵'=>'J','𝖩'=>'J','𝗝'=>'J','𝘑'=>'J','𝙅'=>'J','𝙹'=>'J','Ꮷ'=>'J','⋿'=>'E','ℰ'=>'E','𝐄'=>'E','𝐸'=>'E','𝑬'=>'E','𝓔'=>'E','𝔈'=>'E','𝔼'=>'E','𝕰'=>'E','𝖤'=>'E','𝗘'=>'E','𝘌'=>'E','𝙀'=>'E','𝙴'=>'E','𝚬'=>'E','𝛦'=>'E','𝜠'=>'E','𝝚'=>'E','𝞔'=>'E','ℾ'=>'Ꮁ','𝚪'=>'Ꮁ','𝛤'=>'Ꮁ','𝜞'=>'Ꮁ','𝝘'=>'Ꮁ','𝞒'=>'Ꮁ','Ꮤ'=>'w','ℳ'=>'M','𝐌'=>'M','𝑀'=>'M','𝑴'=>'M','𝓜'=>'M','𝔐'=>'M','𝕄'=>'M','𝕸'=>'M','𝖬'=>'M','𝗠'=>'M','𝘔'=>'M','𝙈'=>'M','𝙼'=>'M','𝚳'=>'M','𝛭'=>'M','𝜧'=>'M','𝝡'=>'M','𝞛'=>'M','ℋ'=>'H','ℌ'=>'H','ℍ'=>'H','𝐇'=>'H','𝐻'=>'H','𝑯'=>'H','𝓗'=>'H','𝕳'=>'H','𝖧'=>'H','𝗛'=>'H','𝘏'=>'H','𝙃'=>'H','𝙷'=>'H','𝚮'=>'H','𝛨'=>'H','𝜢'=>'H','𝝜'=>'H','𝞖'=>'H','𝐆'=>'G','𝐺'=>'G','𝑮'=>'G','𝒢'=>'G','𝓖'=>'G','𝔊'=>'G','𝔾'=>'G','𝕲'=>'G','𝖦'=>'G','𝗚'=>'G','𝘎'=>'G','𝙂'=>'G','𝙶'=>'G','Ᏻ'=>'G','ℤ'=>'Z','ℨ'=>'Z','𝐙'=>'Z','𝑍'=>'Z','𝒁'=>'Z','𝒵'=>'Z','𝓩'=>'Z','𝖅'=>'Z','𝖹'=>'Z','𝗭'=>'Z','𝘡'=>'Z','𝙕'=>'Z','𝚉'=>'Z','𝚭'=>'Z','𝛧'=>'Z','𝜡'=>'Z','𝝛'=>'Z','𝞕'=>'Z','𝐒'=>'S','𝑆'=>'S','𝑺'=>'S','𝒮'=>'S','𝓢'=>'S','𝔖'=>'S','𝕊'=>'S','𝕾'=>'S','𝖲'=>'S','𝗦'=>'S','𝘚'=>'S','𝙎'=>'S','𝚂'=>'S','Ꮪ'=>'S','𝐕'=>'V','𝑉'=>'V','𝑽'=>'V','𝒱'=>'V','𝓥'=>'V','𝔙'=>'V','𝕍'=>'V','𝖁'=>'V','𝖵'=>'V','𝗩'=>'V','𝘝'=>'V','𝙑'=>'V','𝚅'=>'V','ℒ'=>'L','𝐋'=>'L','𝐿'=>'L','𝑳'=>'L','𝓛'=>'L','𝔏'=>'L','𝕃'=>'L','𝕷'=>'L','𝖫'=>'L','𝗟'=>'L','𝘓'=>'L','𝙇'=>'L','𝙻'=>'L','∑'=>'C','⅀'=>'C','ℂ'=>'C','ℭ'=>'C','𝐂'=>'C','𝐶'=>'C','𝑪'=>'C','𝒞'=>'C','𝓒'=>'C','𝕮'=>'C','𝖢'=>'C','𝗖'=>'C','𝘊'=>'C','𝘾'=>'C','𝙲'=>'C','𝚺'=>'C','𝛴'=>'C','𝜮'=>'C','𝝨'=>'C','𝞢'=>'C','ℙ'=>'P','𝐏'=>'P','𝑃'=>'P','𝑷'=>'P','𝒫'=>'P','𝓟'=>'P','𝔓'=>'P','𝕻'=>'P','𝖯'=>'P','𝗣'=>'P','𝘗'=>'P','𝙋'=>'P','𝙿'=>'P','𝚸'=>'P','𝛲'=>'P','𝜬'=>'P','𝝦'=>'P','𝞠'=>'P','𝐊'=>'K','𝐾'=>'K','𝑲'=>'K','𝒦'=>'K','𝓚'=>'K','𝔎'=>'K','𝕂'=>'K','𝕶'=>'K','𝖪'=>'K','𝗞'=>'K','𝘒'=>'K','𝙆'=>'K','𝙺'=>'K','𝚱'=>'K','𝛫'=>'K','𝜥'=>'K','𝝟'=>'K','𝞙'=>'K','ℬ'=>'B','𝐁'=>'B','𝐵'=>'B','𝑩'=>'B','𝓑'=>'B','𝔅'=>'B','𝔹'=>'B','𝕭'=>'B','𝖡'=>'B','𝗕'=>'B','𝘉'=>'B','𝘽'=>'B','𝙱'=>'B','𝚩'=>'B','𝛣'=>'B','𝜝'=>'B','𝝗'=>'B','𝞑'=>'B','ᐍ'=>'ᐁ·','∆'=>'ᐃ','𝚫'=>'ᐃ','𝛥'=>'ᐃ','𝜟'=>'ᐃ','𝝙'=>'ᐃ','𝞓'=>'ᐃ','ᐏ'=>'ᐃ·','ᐑ'=>'ᐄ·','ᐓ'=>'ᐅ·','ᐕ'=>'ᐆ·','ᐘ'=>'ᐊ·','ᐚ'=>'ᐋ·','ᓑ'=>'ᐡ','ᑶ'=>'·P','ᑺ'=>'·d','ᒘ'=>'·J','ᑁ'=>'ᐳ·','ᑃ'=>'ᐴ·','ᑅ'=>'ᐸ·','ᑇ'=>'ᐹ·','ˈ'=>'ᑊ','ᑘ'=>'ᑌ·','ᑧ'=>'ᑌᑊ','ᑚ'=>'ᑎ·','ᑨ'=>'ᑎᑊ','ᑜ'=>'ᑏ·','ᑞ'=>'ᑐ·','ᑩ'=>'ᑐᑊ','ᑠ'=>'ᑑ·','ᑢ'=>'ᑕ·','ᑪ'=>'ᑕᑊ','ᑤ'=>'ᑖ·','ᑵ'=>'ᑫ·','ᒅ'=>'ᑫᑊ','ᑷ'=>'P·','ᒆ'=>'Pᑊ','ᑹ'=>'ᑮ·','ᑻ'=>'d·','ᒇ'=>'dᑊ','ᑽ'=>'ᑰ·','ᑿ'=>'ᑲ·','ᒈ'=>'ᑲᑊ','ᒁ'=>'ᑳ·','ᘃ'=>'ᒉ','ᒓ'=>'ᒉ·','ᒕ'=>'ᒋ·','ᒗ'=>'ᒌ·','ᒙ'=>'J·','ᒛ'=>'ᒎ·','ᘂ'=>'ᒐ','ᒝ'=>'ᒐ·','ᒟ'=>'ᒑ·','ᒭ'=>'ᒣ·','ᒯ'=>'ᒥ·','ᒱ'=>'ᒦ·','ᒳ'=>'ᒧ·','ᒵ'=>'ᒨ·','ᒹ'=>'ᒫ·','ᓊ'=>'ᓀ·','ᓌ'=>'ᓇ·','ᓎ'=>'ᓈᒫ','ᘄ'=>'ᓓ','ᓝ'=>'ᓓ·','ᓟ'=>'ᓕ·','ᓡ'=>'ᓖ·','ᓣ'=>'ᓗ·','ᓥ'=>'ᓘ·','ᘇ'=>'ᓚ','ᓧ'=>'ᓚ·','ᓩ'=>'ᓛ·','ᓷ'=>'ᓭ·','ᓹ'=>'ᓯ·','ᓻ'=>'ᓰ·','ᓽ'=>'ᓱ·','ᓿ'=>'ᓲ·','ᔁ'=>'ᓴ·','ᔃ'=>'ᓵ·','ᔌ'=>'ᔋᐸ','ᔍ'=>'ᔋᑕ','ᔎ'=>'ᔋᑲ','ᔏ'=>'ᔋᒐ','ᔘ'=>'ᔐ·','ᔚ'=>'ᔑ·','ᔜ'=>'ᔒ·','ᔞ'=>'ᔓ·','ᔠ'=>'ᔔ·','ᔢ'=>'ᔕ·','ᔤ'=>'ᔖ·','ᔲ'=>'ᔨ·','ᔴ'=>'ᔩ·','ᔶ'=>'ᔪ·','ᔸ'=>'ᔫ·','ᔺ'=>'ᔭ·','ᔼ'=>'ᔮ·','᙮'=>'x','ᕽ'=>'x','ᘢ'=>'ᕃ','ᘣ'=>'ᕆ','ᘤ'=>'ᕊ','ᕏ'=>'ᕌ·','ᙯ'=>'ᕐᑫ','ᕾ'=>'ᕐᑬ','ᕿ'=>'ᕐP','ᖀ'=>'ᕐᑮ','ᖁ'=>'ᕐd','ᖂ'=>'ᕐᑰ','ᖃ'=>'ᕐᑲ','ᖄ'=>'ᕐᑳ','ᖅ'=>'ᕐᒃ','ᕜ'=>'ᕚ·','ᕩ'=>'ᕧ·','ℛ'=>'R','ℜ'=>'R','ℝ'=>'R','𝐑'=>'R','𝑅'=>'R','𝑹'=>'R','𝓡'=>'R','𝕽'=>'R','𝖱'=>'R','𝗥'=>'R','𝘙'=>'R','𝙍'=>'R','𝚁'=>'R','ᙰ'=>'ᖕᒉ','ᖎ'=>'ᖕᒊ','ᖏ'=>'ᖕᒋ','ᖐ'=>'ᖕᒌ','ᖑ'=>'ᖕJ','ᖒ'=>'ᖕᒎ','ᖓ'=>'ᖕᒐ','ᖔ'=>'ᖕᒑ','ᙱ'=>'ᖖᒋ','ᙲ'=>'ᖖᒌ','ᙳ'=>'ᖖJ','ᙴ'=>'ᖖᒎ','ᙵ'=>'ᖖᒐ','ᙶ'=>'ᖖᒑ','ℱ'=>'F','𝐅'=>'F','𝐹'=>'F','𝑭'=>'F','𝓕'=>'F','𝔉'=>'F','𝔽'=>'F','𝕱'=>'F','𝖥'=>'F','𝗙'=>'F','𝘍'=>'F','𝙁'=>'F','𝙵'=>'F','𝟊'=>'F','ⅅ'=>'D','𝐃'=>'D','𝐷'=>'D','𝑫'=>'D','𝒟'=>'D','𝓓'=>'D','𝔇'=>'D','𝔻'=>'D','𝕯'=>'D','𝖣'=>'D','𝗗'=>'D','𝘋'=>'D','𝘿'=>'D','𝙳'=>'D','ᗪ'=>'D','℧'=>'ᘮ','ᘴ'=>'ᘮ','𝛀'=>'ᘯ','𝛺'=>'ᘯ','𝜴'=>'ᘯ','𝝮'=>'ᘯ','𝞨'=>'ᘯ','ᘵ'=>'ᘯ','ㄱ'=>'ᄀ','ᄀ'=>'ᄀ','ᆨ'=>'ᄀ','ㄲ'=>'ᄁ','ᄁ'=>'ᄁ','ᆩ'=>'ᄁ','ㄴ'=>'ᄂ','ᄂ'=>'ᄂ','ᆫ'=>'ᄂ','ㄷ'=>'ᄃ','ᄃ'=>'ᄃ','ᆮ'=>'ᄃ','ㄸ'=>'ᄄ','ᄄ'=>'ᄄ','ㄹ'=>'ᄅ','ᄅ'=>'ᄅ','ᆯ'=>'ᄅ','ㅁ'=>'ᄆ','ᄆ'=>'ᄆ','ᆷ'=>'ᄆ','ㅂ'=>'ᄇ','ᄇ'=>'ᄇ','ᆸ'=>'ᄇ','ㅃ'=>'ᄈ','ᄈ'=>'ᄈ','ㅅ'=>'ᄉ','ᄉ'=>'ᄉ','ᆺ'=>'ᄉ','ㅆ'=>'ᄊ','ᄊ'=>'ᄊ','ᆻ'=>'ᄊ','ㅇ'=>'ᄋ','ᄋ'=>'ᄋ','ᆼ'=>'ᄋ','ㅈ'=>'ᄌ','ᄌ'=>'ᄌ','ᆽ'=>'ᄌ','ㅉ'=>'ᄍ','ᄍ'=>'ᄍ','ㅊ'=>'ᄎ','ᄎ'=>'ᄎ','ᆾ'=>'ᄎ','ㅋ'=>'ᄏ','ᄏ'=>'ᄏ','ᆿ'=>'ᄏ','ㅌ'=>'ᄐ','ᄐ'=>'ᄐ','ᇀ'=>'ᄐ','ㅍ'=>'ᄑ','ᄑ'=>'ᄑ','ᇁ'=>'ᄑ','ㅎ'=>'ᄒ','ᄒ'=>'ᄒ','ᇂ'=>'ᄒ','ᇅ'=>'ᄓ','ㅥ'=>'ᄔ','ㅦ'=>'ᄕ','ᇆ'=>'ᄕ','ᇊ'=>'ᄗ','ᇍ'=>'ᄘ','ᇐ'=>'ᄙ','ㅀ'=>'ᄚ','ᄚ'=>'ᄚ','ᄻ'=>'ᄚ','ᆶ'=>'ᄚ','ㅮ'=>'ᄜ','ᇜ'=>'ᄜ','ㅱ'=>'ᄝ','ᇢ'=>'ᄝ','ㅲ'=>'ᄞ','ㅳ'=>'ᄠ','ㅄ'=>'ᄡ','ᄡ'=>'ᄡ','ᆹ'=>'ᄡ','ㅴ'=>'ᄢ','ㅵ'=>'ᄣ','ㅶ'=>'ᄧ','ㅷ'=>'ᄩ','ㅸ'=>'ᄫ','ᇦ'=>'ᄫ','ㅹ'=>'ᄬ','ㅺ'=>'ᄭ','ᇧ'=>'ᄭ','ㅻ'=>'ᄮ','ㅼ'=>'ᄯ','ᇨ'=>'ᄯ','ᇩ'=>'ᄰ','ㅽ'=>'ᄲ','ᇪ'=>'ᄲ','ㅾ'=>'ᄶ','ㅿ'=>'ᅀ','ᇫ'=>'ᅀ','ᇬ'=>'ᅁ','ᇱ'=>'ᅅ','ㆂ'=>'ᅅ','ᇲ'=>'ᅆ','ㆃ'=>'ᅆ','ㆀ'=>'ᅇ','ᇮ'=>'ᅇ','ㆁ'=>'ᅌ','ᇰ'=>'ᅌ','ᇳ'=>'ᅖ','ㆄ'=>'ᅗ','ᇴ'=>'ᅗ','ㆅ'=>'ᅘ','ㆆ'=>'ᅙ','ᇹ'=>'ᅙ','ㅤ'=>'ᅠ','ᅠ'=>'ᅠ','ㅏ'=>'ᅡ','ᅡ'=>'ᅡ','ㅐ'=>'ᅢ','ᅢ'=>'ᅢ','ㅑ'=>'ᅣ','ᅣ'=>'ᅣ','ㅒ'=>'ᅤ','ᅤ'=>'ᅤ','ㅓ'=>'ᅥ','ᅥ'=>'ᅥ','ㅔ'=>'ᅦ','ᅦ'=>'ᅦ','ㅕ'=>'ᅧ','ᅧ'=>'ᅧ','ㅖ'=>'ᅨ','ᅨ'=>'ᅨ','ㅗ'=>'ᅩ','ᅩ'=>'ᅩ','ㅘ'=>'ᅪ','ᅪ'=>'ᅪ','ㅙ'=>'ᅫ','ᅫ'=>'ᅫ','ㅚ'=>'ᅬ','ᅬ'=>'ᅬ','ㅛ'=>'ᅭ','ᅭ'=>'ᅭ','ㅜ'=>'ᅮ','ᅮ'=>'ᅮ','ㅝ'=>'ᅯ','ᅯ'=>'ᅯ','ㅞ'=>'ᅰ','ᅰ'=>'ᅰ','ㅟ'=>'ᅱ','ᅱ'=>'ᅱ','ㅠ'=>'ᅲ','ᅲ'=>'ᅲ','ㅡ'=>'一','ᅳ'=>'一','ㅢ'=>'ᅴ','ᅴ'=>'ᅴ','ㅣ'=>'丨','ᅵ'=>'丨','ㆇ'=>'ᆄ','ᆆ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ㆍ'=>'ᆞ','ㆎ'=>'ᆡ','ㄳ'=>'ᆪ','ᆪ'=>'ᆪ','ㄵ'=>'ᆬ','ᆬ'=>'ᆬ','ㄶ'=>'ᆭ','ᆭ'=>'ᆭ','ㄺ'=>'ᆰ','ᆰ'=>'ᆰ','ㄻ'=>'ᆱ','ᆱ'=>'ᆱ','ㄼ'=>'ᆲ','ᆲ'=>'ᆲ','ㄽ'=>'ᆳ','ᆳ'=>'ᆳ','ㄾ'=>'ᆴ','ᆴ'=>'ᆴ','ㄿ'=>'ᆵ','ᆵ'=>'ᆵ','ㅧ'=>'ᇇ','ㅨ'=>'ᇈ','ㅩ'=>'ᇌ','ㅪ'=>'ᇎ','ㅫ'=>'ᇓ','ㅬ'=>'ᇗ','ㅭ'=>'ᇙ','ㅯ'=>'ᇝ','ㅰ'=>'ᇟ','ァ'=>'ァ','ア'=>'ア','ィ'=>'ィ','イ'=>'イ','ゥ'=>'ゥ','ウ'=>'ウ','ェ'=>'ェ','エ'=>'エ','ォ'=>'ォ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ッ'=>'ッ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'へ','ホ'=>'ホ','マ'=>'マ','⧄'=>'〼','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ャ'=>'ャ','ヤ'=>'ヤ','ュ'=>'ュ','ユ'=>'ユ','ョ'=>'ョ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ヲ'=>'ヲ','ン'=>'ン','꒞'=>'ꁊ','꒬'=>'ꁐ','꒜'=>'ꃀ','꒿'=>'ꉙ','꒾'=>'ꊱ','꓀'=>'ꎫ','꓂'=>'ꎵ','꒺'=>'ꎿ','꒰'=>'ꏂ','𐒠'=>'𐒆','—'=>'一','―'=>'一','−'=>'一','─'=>'一','⼀'=>'一','不'=>'不','並'=>'並','|'=>'丨','|'=>'丨','∣'=>'丨','⼁'=>'丨','‖'=>'丨丨','∥'=>'丨丨','串'=>'串','⼂'=>'丶','丸'=>'丸','丹'=>'丹','丽'=>'丽','⼃'=>'丿','乁'=>'乁','⼄'=>'乙','亂'=>'亂','⼅'=>'亅','了'=>'了','⼆'=>'二','⼇'=>'亠','亮'=>'亮','⼈'=>'人','什'=>'什','仌'=>'仌','令'=>'令','你'=>'你','倂'=>'併','倂'=>'併','侀'=>'侀','來'=>'來','例'=>'例','侮'=>'侮','侮'=>'侮','侻'=>'侻','便'=>'便','值'=>'値','倫'=>'倫','偺'=>'偺','備'=>'備','像'=>'像','僚'=>'僚','僧'=>'僧','僧'=>'僧','⼉'=>'儿','兀'=>'兀','充'=>'充','免'=>'免','免'=>'免','兔'=>'兔','兤'=>'兤','⼊'=>'入','內'=>'內','全'=>'全','兩'=>'兩','⼋'=>'八','六'=>'六','具'=>'具','冀'=>'冀','⼌'=>'冂','再'=>'再','冒'=>'冒','冕'=>'冕','⼍'=>'冖','冗'=>'冗','冤'=>'冤','⼎'=>'冫','冬'=>'冬','况'=>'况','况'=>'况','冷'=>'冷','凉'=>'凉','凌'=>'凌','凜'=>'凜','凞'=>'凞','⼏'=>'几','凵'=>'凵','⼐'=>'凵','⼑'=>'刀','刃'=>'刃','切'=>'切','切'=>'切','列'=>'列','利'=>'利','刺'=>'刺','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','劉'=>'劉','力'=>'力','⼒'=>'力','劣'=>'劣','劳'=>'劳','勇'=>'勇','勇'=>'勇','勉'=>'勉','勉'=>'勉','勒'=>'勒','勞'=>'勞','勤'=>'勤','勤'=>'勤','勵'=>'勵','⼓'=>'勹','勺'=>'勺','勺'=>'勺','包'=>'包','匆'=>'匆','⼔'=>'匕','北'=>'北','北'=>'北','⼕'=>'匚','⼖'=>'匸','匿'=>'匿','⼗'=>'十','〸'=>'十','〹'=>'卄','〺'=>'卅','卉'=>'卉','卑'=>'卑','卑'=>'卑','博'=>'博','⼘'=>'卜','⼙'=>'卩','即'=>'即','卵'=>'卵','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','⼚'=>'厂','⼛'=>'厶','參'=>'參','⼜'=>'又','及'=>'及','叟'=>'叟','⼝'=>'口','句'=>'句','叫'=>'叫','叱'=>'叱','吆'=>'吆','吏'=>'吏','吝'=>'吝','吸'=>'吸','呂'=>'呂','呈'=>'呈','周'=>'周','咞'=>'咞','咢'=>'咢','咽'=>'咽','哶'=>'哶','唐'=>'唐','啓'=>'啓','啟'=>'啓','啕'=>'啕','啣'=>'啣','善'=>'善','善'=>'善','喇'=>'喇','喙'=>'喙','喙'=>'喙','喝'=>'喝','喝'=>'喝','喫'=>'喫','喳'=>'喳','嗀'=>'嗀','嗂'=>'嗂','嗢'=>'嗢','嘆'=>'嘆','嘆'=>'嘆','噑'=>'噑','器'=>'器','噴'=>'噴','⼞'=>'囗','囹'=>'囹','圖'=>'圖','圗'=>'圗','⼟'=>'土','型'=>'型','城'=>'城','埴'=>'埴','堍'=>'堍','報'=>'報','堲'=>'堲','塀'=>'塀','塚'=>'塚','塚'=>'塚','塞'=>'塞','填'=>'塡','墨'=>'墨','壿'=>'墫','墬'=>'墬','墳'=>'墳','壘'=>'壘','壟'=>'壟','⼠'=>'士','壮'=>'壮','売'=>'売','壷'=>'壷','⼡'=>'夂','夆'=>'夆','⼢'=>'夊','⼣'=>'夕','多'=>'多','夢'=>'夢','⼤'=>'大','奄'=>'奄','奈'=>'奈','契'=>'契','奔'=>'奔','奢'=>'奢','女'=>'女','⼥'=>'女','姘'=>'姘','姬'=>'姬','娛'=>'娛','娧'=>'娧','婢'=>'婢','婦'=>'婦','嬀'=>'媯','媵'=>'媵','嬈'=>'嬈','嬨'=>'嬨','嬾'=>'嬾','嬾'=>'嬾','⼦'=>'子','⼧'=>'宀','宅'=>'宅','寃'=>'寃','寘'=>'寘','寧'=>'寧','寧'=>'寧','寧'=>'寧','寮'=>'寮','寳'=>'寳','⼨'=>'寸','寿'=>'寿','将'=>'将','⼩'=>'小','尢'=>'尢','⼪'=>'尢','⼫'=>'尸','尿'=>'尿','屠'=>'屠','屢'=>'屢','層'=>'層','履'=>'履','屮'=>'屮','屮'=>'屮','⼬'=>'屮','⼭'=>'山','岍'=>'岍','峀'=>'峀','崙'=>'崙','嵃'=>'嵃','嵐'=>'嵐','嵫'=>'嵫','嵮'=>'嵮','嵼'=>'嵼','嶲'=>'嶲','嶺'=>'嶺','⼮'=>'巛','巡'=>'巡','巢'=>'巢','⼯'=>'工','⼰'=>'己','巽'=>'巽','⼱'=>'巾','帲'=>'帡','帨'=>'帨','帽'=>'帽','幩'=>'幩','⼲'=>'干','年'=>'年','⼳'=>'幺','⼴'=>'广','度'=>'度','庰'=>'庰','庳'=>'庳','庶'=>'庶','廉'=>'廉','廊'=>'廊','廊'=>'廊','廒'=>'廒','廓'=>'廓','廙'=>'廙','廬'=>'廬','⼵'=>'廴','廾'=>'廾','⼶'=>'廾','弄'=>'弄','⼷'=>'弋','⼸'=>'弓','弢'=>'弢','弢'=>'弢','⼹'=>'彐','当'=>'当','⼺'=>'彡','形'=>'形','彩'=>'彩','彫'=>'彫','⼻'=>'彳','律'=>'律','徚'=>'徚','復'=>'復','徭'=>'徭','⼼'=>'心','忍'=>'忍','志'=>'志','念'=>'念','忹'=>'忹','怒'=>'怒','怜'=>'怜','悁'=>'悁','悔'=>'悔','悔'=>'悔','惇'=>'惇','惘'=>'惘','惡'=>'惡','愈'=>'愈','慄'=>'慄','慈'=>'慈','慌'=>'慌','慌'=>'慌','慎'=>'慎','慎'=>'慎','慠'=>'慠','慨'=>'慨','慺'=>'慺','憎'=>'憎','憎'=>'憎','憎'=>'憎','憐'=>'憐','憤'=>'憤','憯'=>'憯','憲'=>'憲','懞'=>'懞','懲'=>'懲','懲'=>'懲','懲'=>'懲','懶'=>'懶','懶'=>'懶','戀'=>'戀','⼽'=>'戈','成'=>'成','戛'=>'戛','戮'=>'戮','戴'=>'戴','⼾'=>'戶','⼿'=>'手','扝'=>'扝','抱'=>'抱','拉'=>'拉','拏'=>'拏','拓'=>'拓','拔'=>'拔','拼'=>'拼','拾'=>'拾','挽'=>'挽','捐'=>'捐','捨'=>'捨','捻'=>'捻','掃'=>'掃','掠'=>'掠','掩'=>'掩','揄'=>'揄','揅'=>'揅','揤'=>'揤','㩁'=>'搉','搜'=>'搜','搢'=>'搢','摒'=>'摒','摩'=>'摩','摷'=>'摷','摾'=>'摾','撚'=>'撚','撝'=>'撝','擄'=>'擄','⽀'=>'支','⽁'=>'攴','敏'=>'敏','敏'=>'敏','敖'=>'敖','敬'=>'敬','數'=>'數','⽂'=>'文','⽃'=>'斗','料'=>'料','⽄'=>'斤','⽅'=>'方','旅'=>'旅','⽆'=>'无','既'=>'既','旣'=>'旣','⽇'=>'日','易'=>'易','晉'=>'晉','晩'=>'晚','䀿'=>'晣','晴'=>'晴','晴'=>'晴','暈'=>'暈','暑'=>'暑','暑'=>'暑','暜'=>'暜','暴'=>'暴','曆'=>'曆','⽈'=>'曰','更'=>'更','㫚'=>'曶','書'=>'書','最'=>'最','⽉'=>'月','肦'=>'朌','胐'=>'朏','胊'=>'朐','脁'=>'朓','朗'=>'朗','朗'=>'朗','朗'=>'朗','脧'=>'朘','望'=>'望','望'=>'望','朡'=>'朡','膧'=>'朣','⽊'=>'木','李'=>'李','杓'=>'杓','杖'=>'杖','杞'=>'杞','柿'=>'杮','杻'=>'杻','枅'=>'枅','林'=>'林','柳'=>'柳','柺'=>'柺','栗'=>'栗','栟'=>'栟','桒'=>'桒','梁'=>'梁','梅'=>'梅','梅'=>'梅','梎'=>'梎','梨'=>'梨','椔'=>'椔','楂'=>'楂','樧'=>'榝','榣'=>'榣','槪'=>'槪','樂'=>'樂','樂'=>'樂','樂'=>'樂','樓'=>'樓','檨'=>'檨','櫓'=>'櫓','櫛'=>'櫛','欄'=>'欄','⽋'=>'欠','次'=>'次','歔'=>'歔','⽌'=>'止','歲'=>'歲','歷'=>'歷','歹'=>'歹','⽍'=>'歹','殟'=>'殟','殮'=>'殮','⽎'=>'殳','殺'=>'殺','殺'=>'殺','殺'=>'殺','殻'=>'殻','⽏'=>'毋','⺟'=>'母','⽐'=>'比','⽑'=>'毛','⽒'=>'氏','⽓'=>'气','⽔'=>'水','汎'=>'汎','汧'=>'汧','沈'=>'沈','沿'=>'沿','泌'=>'泌','泍'=>'泍','泥'=>'泥','洖'=>'洖','洛'=>'洛','洞'=>'洞','洴'=>'洴','派'=>'派','流'=>'流','流'=>'流','流'=>'流','浩'=>'浩','浪'=>'浪','海'=>'海','海'=>'海','浸'=>'浸','涅'=>'涅','淋'=>'淋','淚'=>'淚','淪'=>'淪','淹'=>'淹','渚'=>'渚','港'=>'港','湮'=>'湮','潙'=>'溈','溜'=>'溜','溺'=>'溺','滇'=>'滇','滋'=>'滋','滋'=>'滋','滑'=>'滑','滛'=>'滛','漏'=>'漏','漢'=>'漢','漢'=>'漢','漣'=>'漣','潮'=>'潮','濆'=>'濆','濫'=>'濫','濾'=>'濾','瀛'=>'瀛','瀞'=>'瀞','瀞'=>'瀞','瀹'=>'瀹','灊'=>'灊','⽕'=>'火','灰'=>'灰','灷'=>'灷','災'=>'災','炙'=>'炙','炭'=>'炭','烈'=>'烈','烙'=>'烙','煅'=>'煅','煉'=>'煉','煮'=>'煮','煮'=>'煮','熜'=>'熜','燎'=>'燎','燐'=>'燐','爐'=>'爐','爛'=>'爛','爨'=>'爨','⽖'=>'爪','爫'=>'爫','⺤'=>'爫','爵'=>'爵','爵'=>'爵','⽗'=>'父','⽘'=>'爻','⽙'=>'爿','⽚'=>'片','牐'=>'牐','⽛'=>'牙','⽜'=>'牛','牢'=>'牢','犀'=>'犀','犕'=>'犕','⽝'=>'犬','犯'=>'犯','狀'=>'狀','狼'=>'狼','猪'=>'猪','猪'=>'猪','獵'=>'獵','獺'=>'獺','⽞'=>'玄','率'=>'率','率'=>'率','⽟'=>'玉','王'=>'王','玥'=>'玥','玲'=>'玲','珞'=>'珞','理'=>'理','琉'=>'琉','琢'=>'琢','瑇'=>'瑇','瑜'=>'瑜','瑩'=>'瑩','瑱'=>'瑱','瑱'=>'瑱','璅'=>'璅','璉'=>'璉','璘'=>'璘','瓊'=>'瓊','⽠'=>'瓜','⽡'=>'瓦','甆'=>'甆','⽢'=>'甘','⽣'=>'生','甤'=>'甤','⽤'=>'用','⽥'=>'田','画'=>'画','甾'=>'甾','留'=>'留','略'=>'略','異'=>'異','異'=>'異','⽦'=>'疋','⽧'=>'疒','痢'=>'痢','瘐'=>'瘐','瘝'=>'瘝','瘟'=>'瘟','療'=>'療','癩'=>'癩','⽨'=>'癶','⽩'=>'白','⽪'=>'皮','⽫'=>'皿','益'=>'益','益'=>'益','盛'=>'盛','盧'=>'盧','⽬'=>'目','直'=>'直','直'=>'直','省'=>'省','眞'=>'眞','真'=>'真','真'=>'真','着'=>'着','睊'=>'睊','睊'=>'睊','瞋'=>'瞋','瞧'=>'瞧','⽭'=>'矛','⽮'=>'矢','⽯'=>'石','硏'=>'研','硎'=>'硎','硫'=>'硫','碌'=>'碌','碌'=>'碌','碑'=>'碑','磊'=>'磊','磌'=>'磌','磌'=>'磌','磻'=>'磻','礪'=>'礪','⽰'=>'示','礼'=>'礼','社'=>'社','祈'=>'祈','祉'=>'祉','祐'=>'祐','祖'=>'祖','祖'=>'祖','祝'=>'祝','神'=>'神','祥'=>'祥','祿'=>'祿','禍'=>'禍','禎'=>'禎','福'=>'福','福'=>'福','禮'=>'禮','⽱'=>'禸','⽲'=>'禾','秊'=>'秊','秫'=>'秫','稜'=>'稜','穀'=>'穀','穀'=>'穀','穊'=>'穊','穏'=>'穏','⽳'=>'穴','突'=>'突','窱'=>'窱','立'=>'立','⽴'=>'立','竮'=>'竮','⽵'=>'竹','笠'=>'笠','節'=>'節','節'=>'節','篆'=>'篆','築'=>'築','簾'=>'簾','籠'=>'籠','⽶'=>'米','类'=>'类','粒'=>'粒','精'=>'精','糒'=>'糒','糖'=>'糖','糣'=>'糣','糧'=>'糧','糨'=>'糨','⽷'=>'糸','紀'=>'紀','紐'=>'紐','索'=>'索','累'=>'累','絶'=>'絕','絛'=>'絛','絣'=>'絣','綠'=>'綠','綾'=>'綾','緇'=>'緇','練'=>'練','練'=>'練','練'=>'練','縂'=>'縂','縉'=>'縉','縷'=>'縷','繁'=>'繁','繅'=>'繅','⽸'=>'缶','缾'=>'缾','⽹'=>'网','⺫'=>'罒','署'=>'署','罹'=>'罹','罺'=>'罺','羅'=>'羅','⽺'=>'羊','羕'=>'羕','羚'=>'羚','羽'=>'羽','⽻'=>'羽','翺'=>'翺','老'=>'老','⽼'=>'老','者'=>'者','者'=>'者','者'=>'者','⽽'=>'而','⽾'=>'耒','⽿'=>'耳','聆'=>'聆','聠'=>'聠','聯'=>'聯','聰'=>'聰','聾'=>'聾','⾀'=>'聿','⾁'=>'肉','肋'=>'肋','肭'=>'肭','育'=>'育','㬵'=>'胶','腁'=>'胼','脃'=>'脃','脾'=>'脾','臘'=>'臘','⾂'=>'臣','臨'=>'臨','⾃'=>'自','臭'=>'臭','⾄'=>'至','⾅'=>'臼','舁'=>'舁','舁'=>'舁','舄'=>'舄','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','良'=>'良','⾊'=>'色','⾋'=>'艸','艹'=>'艹','艹'=>'艹','芋'=>'芋','芑'=>'芑','芝'=>'芝','花'=>'花','芳'=>'芳','芽'=>'芽','若'=>'若','若'=>'若','苦'=>'苦','茝'=>'茝','茣'=>'茣','茶'=>'茶','荒'=>'荒','荓'=>'荓','荣'=>'荣','莭'=>'莭','莽'=>'莽','菉'=>'菉','菊'=>'菊','菌'=>'菌','菜'=>'菜','菧'=>'菧','華'=>'華','菱'=>'菱','落'=>'落','葉'=>'葉','著'=>'著','著'=>'著','蔿'=>'蒍','蓮'=>'蓮','蓱'=>'蓱','蓳'=>'蓳','蓼'=>'蓼','蔖'=>'蔖','蕤'=>'蕤','藍'=>'藍','藺'=>'藺','蘆'=>'蘆','蘒'=>'蘒','蘭'=>'蘭','虁'=>'蘷','蘿'=>'蘿','⾌'=>'虍','虐'=>'虐','虜'=>'虜','虜'=>'虜','虧'=>'虧','虩'=>'虩','⾍'=>'虫','蚈'=>'蚈','蚩'=>'蚩','蛢'=>'蛢','蜎'=>'蜎','蜨'=>'蜨','蝫'=>'蝫','蝹'=>'蝹','蝹'=>'蝹','螆'=>'螆','螺'=>'螺','蟡'=>'蟡','蠁'=>'蠁','蠟'=>'蠟','⾎'=>'血','行'=>'行','⾏'=>'行','衠'=>'衠','衣'=>'衣','⾐'=>'衣','裂'=>'裂','裏'=>'裏','裗'=>'裗','裞'=>'裞','裡'=>'裡','裸'=>'裸','裺'=>'裺','褐'=>'褐','襁'=>'襁','襤'=>'襤','⾑'=>'襾','覆'=>'覆','見'=>'見','⾒'=>'見','視'=>'視','視'=>'視','⾓'=>'角','⾔'=>'言','䚶'=>'訞','詽'=>'訮','誠'=>'誠','說'=>'說','說'=>'說','調'=>'調','請'=>'請','諒'=>'諒','論'=>'論','諭'=>'諭','諭'=>'諭','諸'=>'諸','諸'=>'諸','諾'=>'諾','諾'=>'諾','謁'=>'謁','謁'=>'謁','謹'=>'謹','謹'=>'謹','識'=>'識','讀'=>'讀','讏'=>'讆','變'=>'變','變'=>'變','⾕'=>'谷','⾖'=>'豆','豈'=>'豈','豕'=>'豕','⾗'=>'豕','⾘'=>'豸','⾙'=>'貝','貫'=>'貫','賁'=>'賁','賂'=>'賂','賈'=>'賈','賓'=>'賓','贈'=>'贈','贈'=>'贈','贛'=>'贛','⾚'=>'赤','⾛'=>'走','起'=>'起','趆'=>'赿','⾜'=>'足','趼'=>'趼','跋'=>'跋','跺'=>'跥','路'=>'路','跰'=>'跰','躛'=>'躗','⾝'=>'身','車'=>'車','⾞'=>'車','軔'=>'軔','輧'=>'軿','輦'=>'輦','輪'=>'輪','輸'=>'輸','輸'=>'輸','輻'=>'輻','轢'=>'轢','⾟'=>'辛','辞'=>'辞','辰'=>'辰','⾠'=>'辰','⾡'=>'辵','辶'=>'辶','⻌'=>'辶','連'=>'連','逸'=>'逸','逸'=>'逸','遲'=>'遲','遼'=>'遼','邏'=>'邏','⾢'=>'邑','邔'=>'邔','郎'=>'郎','郱'=>'郱','都'=>'都','鄑'=>'鄑','鄛'=>'鄛','⾣'=>'酉','酪'=>'酪','醙'=>'醙','醴'=>'醴','⾤'=>'釆','里'=>'里','⾥'=>'里','量'=>'量','金'=>'金','⾦'=>'金','鈴'=>'鈴','鈸'=>'鈸','鉶'=>'鉶','鉼'=>'鉼','鋗'=>'鋗','鋘'=>'鋘','錄'=>'錄','鍊'=>'鍊','鎮'=>'鎭','鏹'=>'鏹','鐕'=>'鐕','⾧'=>'長','⾨'=>'門','開'=>'開','閭'=>'閭','閷'=>'閷','⾩'=>'阜','阮'=>'阮','陋'=>'陋','降'=>'降','陵'=>'陵','陸'=>'陸','陼'=>'陼','隆'=>'隆','隣'=>'隣','⾪'=>'隶','隸'=>'隸','⾫'=>'隹','雃'=>'雃','離'=>'離','難'=>'難','難'=>'難','⾬'=>'雨','零'=>'零','雷'=>'雷','霣'=>'霣','露'=>'露','靈'=>'靈','⾭'=>'靑','靖'=>'靖','靖'=>'靖','⾮'=>'非','⾯'=>'面','⾰'=>'革','⾱'=>'韋','韛'=>'韛','韠'=>'韠','⾲'=>'韭','⾳'=>'音','響'=>'響','響'=>'響','⾴'=>'頁','頋'=>'頋','頋'=>'頋','頋'=>'頋','領'=>'領','頩'=>'頩','頻'=>'頻','頻'=>'頻','類'=>'類','⾵'=>'風','⾶'=>'飛','⻝'=>'食','⾷'=>'食','飢'=>'飢','飯'=>'飯','飼'=>'飼','館'=>'館','餩'=>'餩','⾸'=>'首','⾹'=>'香','馧'=>'馧','⾺'=>'馬','駂'=>'駂','駱'=>'駱','駾'=>'駾','驪'=>'驪','⾻'=>'骨','⾼'=>'高','⾽'=>'髟','鬒'=>'鬒','鬒'=>'鬒','⾾'=>'鬥','⾿'=>'鬯','⿀'=>'鬲','⿁'=>'鬼','⿂'=>'魚','魯'=>'魯','鱀'=>'鱀','鱗'=>'鱗','⿃'=>'鳥','鳽'=>'鳽','鵧'=>'鵧','鶴'=>'鶴','鷺'=>'鷺','鸞'=>'鸞','鹃'=>'鹂','⿄'=>'鹵','鹿'=>'鹿','⿅'=>'鹿','麗'=>'麗','麟'=>'麟','⿆'=>'麥','麻'=>'麻','⿇'=>'麻','⿈'=>'黃','⿉'=>'黍','黎'=>'黎','⿊'=>'黑','黹'=>'黹','⿋'=>'黹','⿌'=>'黽','黾'=>'黾','鼅'=>'鼅','⿍'=>'鼎','鼏'=>'鼏','⿎'=>'鼓','鼖'=>'鼖','⿏'=>'鼠','鼻'=>'鼻','⿐'=>'鼻','齃'=>'齃','⿑'=>'齊','⿒'=>'齒','龍'=>'龍','⿓'=>'龍','龎'=>'龎','龜'=>'龜','龜'=>'龜','龜'=>'龜','⿔'=>'龜','⻳'=>'龟','⿕'=>'龠','㒞'=>'㒞','㒹'=>'㒹','㒻'=>'㒻','㓟'=>'㓟','㔕'=>'㔕','䎛'=>'㖈','㛮'=>'㛮','㛼'=>'㛼','㞁'=>'㞁','㠯'=>'㠯','㡢'=>'㡢','㡼'=>'㡼','㣇'=>'㣇','㣣'=>'㣣','㤜'=>'㤜','㤺'=>'㤺','㨮'=>'㨮','㩬'=>'㩬','㫤'=>'㫤','㬈'=>'㬈','㬙'=>'㬙','䐠'=>'㬻','㭉'=>'㭉','㮝'=>'㮝','㮝'=>'㮝','㰘'=>'㰘','㱎'=>'㱎','㴳'=>'㴳','㶖'=>'㶖','㺬'=>'㺬','㺸'=>'㺸','㺸'=>'㺸','㼛'=>'㼛','㿼'=>'㿼','䀈'=>'䀈','䀘'=>'䀘','䀹'=>'䀹','䀹'=>'䀹','䁆'=>'䁆','䂖'=>'䂖','䃣'=>'䃣','䄯'=>'䄯','䈂'=>'䈂','䈧'=>'䈧','䊠'=>'䊠','䌁'=>'䌁','䌴'=>'䌴','䍙'=>'䍙','䏕'=>'䏕','䏙'=>'䏙','䐋'=>'䐋','䑫'=>'䑫','䔫'=>'䔫','䕝'=>'䕝','䕡'=>'䕡','䕫'=>'䕫','䗗'=>'䗗','䗹'=>'䗹','䘵'=>'䘵','䚾'=>'䚾','䛇'=>'䛇','䦕'=>'䦕','䧦'=>'䧦','䩮'=>'䩮','䩶'=>'䩶','䪲'=>'䪲','䬳'=>'䬳','䯎'=>'䯎','䳎'=>'䳎','䳭'=>'䳭','䳸'=>'䳸','䵖'=>'䵖','𠄢'=>'𠄢','𠔜'=>'𠔜','𠔥'=>'𠔥','𠕋'=>'𠕋','𠘺'=>'𠘺','𠠄'=>'𠠄','𠣞'=>'𠣞','𠨬'=>'𠨬','𠭣'=>'𠭣','𡓤'=>'𡓤','𡚨'=>'𡚨','𡛪'=>'𡛪','𡧈'=>'𡧈','𡬘'=>'𡬘','𡴋'=>'𡴋','𡷤'=>'𡷤','𡷦'=>'𡷦','𢆃'=>'𢆃','𢆟'=>'𢆟','𢌱'=>'𢌱','𢌱'=>'𢌱','𢛔'=>'𢛔','𢡄'=>'𢡄','𢡊'=>'𢡊','𢬌'=>'𢬌','𢯱'=>'𢯱','𣀊'=>'𣀊','𣊸'=>'𣊸','𣍟'=>'𣍟','𣎓'=>'𣎓','𣎜'=>'𣎜','𣏃'=>'𣏃','𣏕'=>'𣏕','𣑭'=>'𣑭','𣚣'=>'𣚣','𣢧'=>'𣢧','𣪍'=>'𣪍','𣫺'=>'𣫺','𣲼'=>'𣲼','𣴞'=>'𣴞','𣻑'=>'𣻑','𣽞'=>'𣽞','𣾎'=>'𣾎','𤉣'=>'𤉣','𤎫'=>'𤎫','𤘈'=>'𤘈','𤜵'=>'𤜵','𤠔'=>'𤠔','𤰶'=>'𤰶','𤲒'=>'𤲒','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','𥃲'=>'𥃲','𥃳'=>'𥃳','𥄙'=>'𥄙','𥄳'=>'𥄳','𥉉'=>'𥉉','𥐝'=>'𥐝','𥘦'=>'𥘦','𥚚'=>'𥚚','𥛅'=>'𥛅','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','𥮫'=>'𥮫','𥲀'=>'𥲀','𥳐'=>'𥳐','𥾆'=>'𥾆','𦇚'=>'𦇚','𦈨'=>'𦈨','𦉇'=>'𦉇','𦋙'=>'𦋙','𦌾'=>'𦌾','𦓚'=>'𦓚','𦔣'=>'𦔣','𦖨'=>'𦖨','𦞧'=>'𦞧','𦞵'=>'𦞵','𦬼'=>'𦬼','𦰶'=>'𦰶','𦳕'=>'𦳕','𦵫'=>'𦵫','𦼬'=>'𦼬','𦾱'=>'𦾱','𧃒'=>'𧃒','𧏊'=>'𧏊','𧙧'=>'𧙧','𧢮'=>'𧢮','𧥦'=>'𧥦','𧲨'=>'𧲨','𧻓'=>'𧻓','𧼯'=>'𧼯','𨗒'=>'𨗒','𨗭'=>'𨗭','𨜮'=>'𨜮','𨯺'=>'𨯺','𨵷'=>'𨵷','𩅅'=>'𩅅','𩇟'=>'𩇟','𩈚'=>'𩈚','𩐊'=>'𩐊','𩒖'=>'𩒖','𩖶'=>'𩖶','𩬰'=>'𩬰','𪃎'=>'𪃎','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','𪎒'=>'𪎒','𪘀'=>'𪘀','℃'=>'°C','℉'=>'°F','ℇ'=>'Ɛ','℻'=>'FAX','ℕ'=>'N','№'=>'No','ℚ'=>'Q','₨'=>'Rs','𝐓'=>'T','℡'=>'TEL','𝐔'=>'U','𝐖'=>'W','₩'=>'W̵','𝐗'=>'X','¥'=>'Y̵','𝚲'=>'Λ','𝚵'=>'Ξ','ℿ'=>'Π','ϲ'=>'c','ϒ'=>'Y','𝚽'=>'Φ','𝚿'=>'Ψ','ѣ'=>'Ь̵','ਃ'=>'ঃ','ಃ'=>'ః','່'=>'่','់'=>'่','້'=>'้','໊'=>'๊','໋'=>'๋','៕'=>'๚','៚'=>'๛','ъ'=>'ˉb','៙'=>'๏','೧'=>'౧','૨'=>'२','೨'=>'౨','૩'=>'३','૪'=>'४','૮'=>'८','೯'=>'౯','а'=>'a','Ꮟ'=>'b','ᖯ'=>'b','с'=>'c','ԁ'=>'d','ᑯ'=>'d','е'=>'e','ә'=>'ǝ','ε'=>'ɛ','є'=>'ɛ','ք'=>'f','ց'=>'g','һ'=>'h','հ'=>'h','Ꮒ'=>'h','Ᏺ'=>'h̔','ι'=>'i','і'=>'i','Ꭵ'=>'i','ј'=>'j','յ'=>'j','ᗰ'=>'m','ո'=>'n','η'=>'n̩','ం'=>'o','ಂ'=>'o','ം'=>'o','०'=>'o','੦'=>'o','૦'=>'o','๐'=>'o','໐'=>'o','ο'=>'o','о'=>'o','օ'=>'o','ဝ'=>'o','ρ'=>'p','р'=>'p','ᴩ'=>'ᴘ','գ'=>'q','κ'=>'ĸ','к'=>'ĸ','ᴦ'=>'r','г'=>'r','ѕ'=>'s','υ'=>'u','ս'=>'u','ν'=>'v','ѵ'=>'v','Ꮃ'=>'w','ᗯ'=>'w','х'=>'x','ᕁ'=>'x','у'=>'y','Ꭹ'=>'y','ӡ'=>'ʒ','ჳ'=>'ʒ','ϩ'=>'ƨ','ь'=>'ƅ','ы'=>'ƅi','ɑ'=>'α','ծ'=>'δ','ᕷ'=>'δ','п'=>'π','ɸ'=>'φ','ф'=>'φ','ʙ'=>'в','ɜ'=>'з','ᴍ'=>'м','ʜ'=>'н','ɢ'=>'ԍ','ᴛ'=>'т','ᴙ'=>'я','ઽ'=>'ऽ','ુ'=>'ु','ૂ'=>'ू','ੋ'=>'ॆ','੍'=>'्','્'=>'्','ഉ'=>'உ','ജ'=>'ஐ','ണ'=>'ண','ഴ'=>'ழ','ി'=>'ி','ു'=>'ூ','ಅ'=>'అ','ಆ'=>'ఆ','ಇ'=>'ఇ','ಒ'=>'ఒ','ಓ'=>'ఒౕ','ಜ'=>'జ','ಞ'=>'ఞ','ಣ'=>'ణ','థ'=>'ధּ','ಯ'=>'య','ఠ'=>'రּ','ಱ'=>'ఱ','ಲ'=>'ల','ඌ'=>'ന്ന','ஶ'=>'ശ','ຈ'=>'จ','ບ'=>'บ','ປ'=>'ป','ຝ'=>'ฝ','ພ'=>'พ','ຟ'=>'ฟ','ຍ'=>'ย','។'=>'ฯ','ិ'=>'ิ','ី'=>'ี','ឹ'=>'ึ','ឺ'=>'ื','ຸ'=>'ุ','ູ'=>'ู','ᗅ'=>'A','ᒍ'=>'J','ᕼ'=>'H','ᐯ'=>'V','ᑭ'=>'P','ᗷ'=>'B','ヘ'=>'へ','𐏑'=>'𐎂','𐏓'=>'𐎓','𒀸'=>'𐎚','ᅳ'=>'一','ǀ'=>'丨','ᅵ'=>'丨','Ꭺ'=>'A','Ᏼ'=>'B','Ꮯ'=>'C','ᗞ'=>'D','Ꭼ'=>'E','ᖴ'=>'F','Ꮐ'=>'G','Ꮋ'=>'H','Ꭻ'=>'J','Ꮶ'=>'K','Ꮮ'=>'L','Ꮇ'=>'M','Ꮲ'=>'P','ᖇ'=>'R','Ꮥ'=>'S','Ꮩ'=>'V','Ꮓ'=>'Z');
diff --git a/phpBB/includes/utf/data/recode_basic.php b/phpBB/includes/utf/data/recode_basic.php
index 02e44d3e0d..8a9dc544e6 100644
--- a/phpBB/includes/utf/data/recode_basic.php
+++ b/phpBB/includes/utf/data/recode_basic.php
@@ -1539,5 +1539,3 @@ function utf8_to_cp1252($string)
);
return strtr($string, $transform);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/utf/data/recode_cjk.php b/phpBB/includes/utf/data/recode_cjk.php
index f3f9a256d7..8c65274af0 100644
--- a/phpBB/includes/utf/data/recode_cjk.php
+++ b/phpBB/includes/utf/data/recode_cjk.php
@@ -45175,5 +45175,3 @@ function big5($string)
);
return strtr($string, $transform);
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/utf/data/search_indexer_0.php b/phpBB/includes/utf/data/search_indexer_0.php
index 3304b18cdd..e8a087c0bc 100644
--- a/phpBB/includes/utf/data/search_indexer_0.php
+++ b/phpBB/includes/utf/data/search_indexer_0.php
@@ -1 +1 @@
-<?php return array(0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','ª'=>'ª','²'=>'2','³'=>'3','µ'=>'µ','¹'=>'1','º'=>'º','¼'=>'1/4','½'=>'1/2','¾'=>'3/4','À'=>'à','Á'=>'á','Â'=>'â','Ã'=>'ã','Ä'=>'ae','Å'=>'å','Æ'=>'ae','Ç'=>'ç','È'=>'è','É'=>'é','Ê'=>'ê','Ë'=>'ë','Ì'=>'ì','Í'=>'í','Î'=>'î','Ï'=>'ï','Ð'=>'ð','Ñ'=>'ñ','Ò'=>'ò','Ó'=>'ó','Ô'=>'ô','Õ'=>'õ','Ö'=>'oe','Ø'=>'ø','Ù'=>'ù','Ú'=>'ú','Û'=>'û','Ü'=>'ü','Ý'=>'ý','Þ'=>'þ','ß'=>'ss','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ae','å'=>'å','æ'=>'ae','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ð'=>'ð','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'oe','ø'=>'ø','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ue','ý'=>'ý','þ'=>'þ','ÿ'=>'ÿ','Ā'=>'ā','ā'=>'ā','Ă'=>'ă','ă'=>'ă','Ą'=>'ą','ą'=>'ą','Ć'=>'ć','ć'=>'ć','Ĉ'=>'ĉ','ĉ'=>'ĉ','Ċ'=>'ċ','ċ'=>'ċ','Č'=>'č','č'=>'č','Ď'=>'ď','ď'=>'ď','Đ'=>'đ','đ'=>'đ','Ē'=>'ē','ē'=>'ē','Ĕ'=>'ĕ','ĕ'=>'ĕ','Ė'=>'ė','ė'=>'ė','Ę'=>'ę','ę'=>'ę','Ě'=>'ě','ě'=>'ě','Ĝ'=>'ĝ','ĝ'=>'ĝ','Ğ'=>'ğ','ğ'=>'ğ','Ġ'=>'ġ','ġ'=>'ġ','Ģ'=>'ģ','ģ'=>'ģ','Ĥ'=>'ĥ','ĥ'=>'ĥ','Ħ'=>'ħ','ħ'=>'ħ','Ĩ'=>'ĩ','ĩ'=>'ĩ','Ī'=>'ī','ī'=>'ī','Ĭ'=>'ĭ','ĭ'=>'ĭ','Į'=>'į','į'=>'į','İ'=>'i','ı'=>'ı','IJ'=>'ij','ij'=>'ij','Ĵ'=>'ĵ','ĵ'=>'ĵ','Ķ'=>'ķ','ķ'=>'ķ','ĸ'=>'ĸ','Ĺ'=>'ĺ','ĺ'=>'ĺ','Ļ'=>'ļ','ļ'=>'ļ','Ľ'=>'ľ','ľ'=>'ľ','Ŀ'=>'ŀ','ŀ'=>'ŀ','Ł'=>'ł','ł'=>'ł','Ń'=>'ń','ń'=>'ń','Ņ'=>'ņ','ņ'=>'ņ','Ň'=>'ň','ň'=>'ň','ʼn'=>'ʼn','Ŋ'=>'ŋ','ŋ'=>'ŋ','Ō'=>'ō','ō'=>'ō','Ŏ'=>'ŏ','ŏ'=>'ŏ','Ő'=>'ő','ő'=>'ő','Œ'=>'oe','œ'=>'oe','Ŕ'=>'ŕ','ŕ'=>'ŕ','Ŗ'=>'ŗ','ŗ'=>'ŗ','Ř'=>'ř','ř'=>'ř','Ś'=>'ś','ś'=>'ś','Ŝ'=>'ŝ','ŝ'=>'ŝ','Ş'=>'ş','ş'=>'ş','Š'=>'š','š'=>'š','Ţ'=>'ţ','ţ'=>'ţ','Ť'=>'ť','ť'=>'ť','Ŧ'=>'ŧ','ŧ'=>'ŧ','Ũ'=>'ũ','ũ'=>'ũ','Ū'=>'ū','ū'=>'ū','Ŭ'=>'ŭ','ŭ'=>'ŭ','Ů'=>'ů','ů'=>'ů','Ű'=>'ű','ű'=>'ű','Ų'=>'ų','ų'=>'ų','Ŵ'=>'ŵ','ŵ'=>'ŵ','Ŷ'=>'ŷ','ŷ'=>'ŷ','Ÿ'=>'ÿ','Ź'=>'ź','ź'=>'ź','Ż'=>'ż','ż'=>'ż','Ž'=>'ž','ž'=>'ž','ſ'=>'ſ','ƀ'=>'ƀ','Ɓ'=>'ɓ','Ƃ'=>'ƃ','ƃ'=>'ƃ','Ƅ'=>'ƅ','ƅ'=>'ƅ','Ɔ'=>'ɔ','Ƈ'=>'ƈ','ƈ'=>'ƈ','Ɖ'=>'ɖ','Ɗ'=>'ɗ','Ƌ'=>'ƌ','ƌ'=>'ƌ','ƍ'=>'ƍ','Ǝ'=>'ǝ','Ə'=>'ə','Ɛ'=>'ɛ','Ƒ'=>'ƒ','ƒ'=>'ƒ','Ɠ'=>'ɠ','Ɣ'=>'ɣ','ƕ'=>'hv','Ɩ'=>'ɩ','Ɨ'=>'ɨ','Ƙ'=>'ƙ','ƙ'=>'ƙ','ƚ'=>'ƚ','ƛ'=>'ƛ','Ɯ'=>'ɯ','Ɲ'=>'ɲ','ƞ'=>'ƞ','Ɵ'=>'ɵ','Ơ'=>'ơ','ơ'=>'ơ','Ƣ'=>'oi','ƣ'=>'oi','Ƥ'=>'ƥ','ƥ'=>'ƥ','Ʀ'=>'yr','Ƨ'=>'ƨ','ƨ'=>'ƨ','Ʃ'=>'ʃ','ƪ'=>'ƪ','ƫ'=>'ƫ','Ƭ'=>'ƭ','ƭ'=>'ƭ','Ʈ'=>'ʈ','Ư'=>'ư','ư'=>'ư','Ʊ'=>'ʊ','Ʋ'=>'ʋ','Ƴ'=>'ƴ','ƴ'=>'ƴ','Ƶ'=>'ƶ','ƶ'=>'ƶ','Ʒ'=>'ʒ','Ƹ'=>'ƹ','ƹ'=>'ƹ','ƺ'=>'ƺ','ƻ'=>'ƻ','Ƽ'=>'ƽ','ƽ'=>'ƽ','ƾ'=>'ƾ','ƿ'=>'ƿ','ǀ'=>'ǀ','ǁ'=>'ǁ','ǂ'=>'ǂ','ǃ'=>'ǃ','DŽ'=>'dž','Dž'=>'dž','dž'=>'dž','LJ'=>'lj','Lj'=>'lj','lj'=>'lj','NJ'=>'nj','Nj'=>'nj','nj'=>'nj','Ǎ'=>'ǎ','ǎ'=>'ǎ','Ǐ'=>'ǐ','ǐ'=>'ǐ','Ǒ'=>'ǒ','ǒ'=>'ǒ','Ǔ'=>'ǔ','ǔ'=>'ǔ','Ǖ'=>'ǖ','ǖ'=>'ǖ','Ǘ'=>'ǘ','ǘ'=>'ǘ','Ǚ'=>'ǚ','ǚ'=>'ǚ','Ǜ'=>'ǜ','ǜ'=>'ǜ','ǝ'=>'ǝ','Ǟ'=>'ǟ','ǟ'=>'ǟ','Ǡ'=>'ǡ','ǡ'=>'ǡ','Ǣ'=>'ǣ','ǣ'=>'ǣ','Ǥ'=>'ǥ','ǥ'=>'ǥ','Ǧ'=>'ǧ','ǧ'=>'ǧ','Ǩ'=>'ǩ','ǩ'=>'ǩ','Ǫ'=>'ǫ','ǫ'=>'ǫ','Ǭ'=>'ǭ','ǭ'=>'ǭ','Ǯ'=>'ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','DZ'=>'dz','Dz'=>'dz','dz'=>'dz','Ǵ'=>'ǵ','ǵ'=>'ǵ','Ƕ'=>'ƕ','Ƿ'=>'ƿ','Ǹ'=>'ǹ','ǹ'=>'ǹ','Ǻ'=>'ǻ','ǻ'=>'ǻ','Ǽ'=>'ǽ','ǽ'=>'ǽ','Ǿ'=>'ǿ','ǿ'=>'ǿ','Ȁ'=>'ȁ','ȁ'=>'ȁ','Ȃ'=>'ȃ','ȃ'=>'ȃ','Ȅ'=>'ȅ','ȅ'=>'ȅ','Ȇ'=>'ȇ','ȇ'=>'ȇ','Ȉ'=>'ȉ','ȉ'=>'ȉ','Ȋ'=>'ȋ','ȋ'=>'ȋ','Ȍ'=>'ȍ','ȍ'=>'ȍ','Ȏ'=>'ȏ','ȏ'=>'ȏ','Ȑ'=>'ȑ','ȑ'=>'ȑ','Ȓ'=>'ȓ','ȓ'=>'ȓ','Ȕ'=>'ȕ','ȕ'=>'ȕ','Ȗ'=>'ȗ','ȗ'=>'ȗ','Ș'=>'ș','ș'=>'ș','Ț'=>'ț','ț'=>'ț','Ȝ'=>'ȝ','ȝ'=>'ȝ','Ȟ'=>'ȟ','ȟ'=>'ȟ','Ƞ'=>'ƞ','ȡ'=>'ȡ','Ȣ'=>'ou','ȣ'=>'ou','Ȥ'=>'ȥ','ȥ'=>'ȥ','Ȧ'=>'ȧ','ȧ'=>'ȧ','Ȩ'=>'ȩ','ȩ'=>'ȩ','Ȫ'=>'ȫ','ȫ'=>'ȫ','Ȭ'=>'ȭ','ȭ'=>'ȭ','Ȯ'=>'ȯ','ȯ'=>'ȯ','Ȱ'=>'ȱ','ȱ'=>'ȱ','Ȳ'=>'ȳ','ȳ'=>'ȳ','ȴ'=>'ȴ','ȵ'=>'ȵ','ȶ'=>'ȶ','ȷ'=>'ȷ','ȸ'=>'ȸ','ȹ'=>'ȹ','Ⱥ'=>'ⱥ','Ȼ'=>'ȼ','ȼ'=>'ȼ','Ƚ'=>'ƚ','Ⱦ'=>'ⱦ','ȿ'=>'ȿ','ɀ'=>'ɀ','Ɂ'=>'ɂ','ɂ'=>'ɂ','Ƀ'=>'ƀ','Ʉ'=>'ʉ','Ʌ'=>'ʌ','Ɇ'=>'ɇ','ɇ'=>'ɇ','Ɉ'=>'ɉ','ɉ'=>'ɉ','Ɋ'=>'ɋ','ɋ'=>'ɋ','Ɍ'=>'ɍ','ɍ'=>'ɍ','Ɏ'=>'ɏ','ɏ'=>'ɏ','ɐ'=>'ɐ','ɑ'=>'ɑ','ɒ'=>'ɒ','ɓ'=>'ɓ','ɔ'=>'ɔ','ɕ'=>'ɕ','ɖ'=>'ɖ','ɗ'=>'ɗ','ɘ'=>'ɘ','ə'=>'ə','ɚ'=>'ɚ','ɛ'=>'ɛ','ɜ'=>'ɜ','ɝ'=>'ɝ','ɞ'=>'ɞ','ɟ'=>'ɟ','ɠ'=>'ɠ','ɡ'=>'ɡ','ɢ'=>'ɢ','ɣ'=>'ɣ','ɤ'=>'ɤ','ɥ'=>'ɥ','ɦ'=>'ɦ','ɧ'=>'ɧ','ɨ'=>'ɨ','ɩ'=>'ɩ','ɪ'=>'ɪ','ɫ'=>'ɫ','ɬ'=>'ɬ','ɭ'=>'ɭ','ɮ'=>'ɮ','ɯ'=>'ɯ','ɰ'=>'ɰ','ɱ'=>'ɱ','ɲ'=>'ɲ','ɳ'=>'ɳ','ɴ'=>'ɴ','ɵ'=>'ɵ','ɶ'=>'ɶ','ɷ'=>'ɷ','ɸ'=>'ɸ','ɹ'=>'ɹ','ɺ'=>'ɺ','ɻ'=>'ɻ','ɼ'=>'ɼ','ɽ'=>'ɽ','ɾ'=>'ɾ','ɿ'=>'ɿ','ʀ'=>'ʀ','ʁ'=>'ʁ','ʂ'=>'ʂ','ʃ'=>'ʃ','ʄ'=>'ʄ','ʅ'=>'ʅ','ʆ'=>'ʆ','ʇ'=>'ʇ','ʈ'=>'ʈ','ʉ'=>'ʉ','ʊ'=>'ʊ','ʋ'=>'ʋ','ʌ'=>'ʌ','ʍ'=>'ʍ','ʎ'=>'ʎ','ʏ'=>'ʏ','ʐ'=>'ʐ','ʑ'=>'ʑ','ʒ'=>'ʒ','ʓ'=>'ʓ','ʔ'=>'ʔ','ʕ'=>'ʕ','ʖ'=>'ʖ','ʗ'=>'ʗ','ʘ'=>'ʘ','ʙ'=>'ʙ','ʚ'=>'ʚ','ʛ'=>'ʛ','ʜ'=>'ʜ','ʝ'=>'ʝ','ʞ'=>'ʞ','ʟ'=>'ʟ','ʠ'=>'ʠ','ʡ'=>'ʡ','ʢ'=>'ʢ','ʣ'=>'ʣ','ʤ'=>'ʤ','ʥ'=>'ʥ','ʦ'=>'ʦ','ʧ'=>'ʧ','ʨ'=>'ʨ','ʩ'=>'ʩ','ʪ'=>'ʪ','ʫ'=>'ʫ','ʬ'=>'ʬ','ʭ'=>'ʭ','ʮ'=>'ʮ','ʯ'=>'ʯ','ʰ'=>'ʰ','ʱ'=>'ʱ','ʲ'=>'ʲ','ʳ'=>'ʳ','ʴ'=>'ʴ','ʵ'=>'ʵ','ʶ'=>'ʶ','ʷ'=>'ʷ','ʸ'=>'ʸ','ʹ'=>'ʹ','ʺ'=>'ʺ','ʻ'=>'ʻ','ʼ'=>'ʼ','ʽ'=>'ʽ','ʾ'=>'ʾ','ʿ'=>'ʿ','ˀ'=>'ˀ','ˁ'=>'ˁ','ˆ'=>'ˆ','ˇ'=>'ˇ','ˈ'=>'ˈ','ˉ'=>'ˉ','ˊ'=>'ˊ','ˋ'=>'ˋ','ˌ'=>'ˌ','ˍ'=>'ˍ','ˎ'=>'ˎ','ˏ'=>'ˏ','ː'=>'ː','ˑ'=>'ˑ','ˠ'=>'ˠ','ˡ'=>'ˡ','ˢ'=>'ˢ','ˣ'=>'ˣ','ˤ'=>'ˤ','ˮ'=>'ˮ','̀'=>'̀','́'=>'́','̂'=>'̂','̃'=>'̃','̄'=>'̄','̅'=>'̅','̆'=>'̆','̇'=>'̇','̈'=>'̈','̉'=>'̉','̊'=>'̊','̋'=>'̋','̌'=>'̌','̍'=>'̍','̎'=>'̎','̏'=>'̏','̐'=>'̐','̑'=>'̑','̒'=>'̒','̓'=>'̓','̔'=>'̔','̕'=>'̕','̖'=>'̖','̗'=>'̗','̘'=>'̘','̙'=>'̙','̚'=>'̚','̛'=>'̛','̜'=>'̜','̝'=>'̝','̞'=>'̞','̟'=>'̟','̠'=>'̠','̡'=>'̡','̢'=>'̢','̣'=>'̣','̤'=>'̤','̥'=>'̥','̦'=>'̦','̧'=>'̧','̨'=>'̨','̩'=>'̩','̪'=>'̪','̫'=>'̫','̬'=>'̬','̭'=>'̭','̮'=>'̮','̯'=>'̯','̰'=>'̰','̱'=>'̱','̲'=>'̲','̳'=>'̳','̴'=>'̴','̵'=>'̵','̶'=>'̶','̷'=>'̷','̸'=>'̸','̹'=>'̹','̺'=>'̺','̻'=>'̻','̼'=>'̼','̽'=>'̽','̾'=>'̾','̿'=>'̿','̀'=>'̀','́'=>'́','͂'=>'͂','̓'=>'̓','̈́'=>'̈́','ͅ'=>'ͅ','͆'=>'͆','͇'=>'͇','͈'=>'͈','͉'=>'͉','͊'=>'͊','͋'=>'͋','͌'=>'͌','͍'=>'͍','͎'=>'͎','͏'=>'͏','͐'=>'͐','͑'=>'͑','͒'=>'͒','͓'=>'͓','͔'=>'͔','͕'=>'͕','͖'=>'͖','͗'=>'͗','͘'=>'͘','͙'=>'͙','͚'=>'͚','͛'=>'͛','͜'=>'͜','͝'=>'͝','͞'=>'͞','͟'=>'͟','͠'=>'͠','͡'=>'͡','͢'=>'͢','ͣ'=>'ͣ','ͤ'=>'ͤ','ͥ'=>'ͥ','ͦ'=>'ͦ','ͧ'=>'ͧ','ͨ'=>'ͨ','ͩ'=>'ͩ','ͪ'=>'ͪ','ͫ'=>'ͫ','ͬ'=>'ͬ','ͭ'=>'ͭ','ͮ'=>'ͮ','ͯ'=>'ͯ','ͺ'=>'ͺ','ͻ'=>'ͻ','ͼ'=>'ͼ','ͽ'=>'ͽ','Ά'=>'ά','Έ'=>'έ','Ή'=>'ή','Ί'=>'ί','Ό'=>'ό','Ύ'=>'ύ','Ώ'=>'ώ','ΐ'=>'ΐ','Α'=>'α','Β'=>'β','Γ'=>'γ','Δ'=>'δ','Ε'=>'ε','Ζ'=>'ζ','Η'=>'η','Θ'=>'θ','Ι'=>'ι','Κ'=>'κ','Λ'=>'λ','Μ'=>'μ','Ν'=>'ν','Ξ'=>'ξ','Ο'=>'ο','Π'=>'π','Ρ'=>'ρ','Σ'=>'σ','Τ'=>'τ','Υ'=>'υ','Φ'=>'φ','Χ'=>'χ','Ψ'=>'ψ','Ω'=>'ω','Ϊ'=>'ϊ','Ϋ'=>'ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','α'=>'α','β'=>'β','γ'=>'γ','δ'=>'δ','ε'=>'ε','ζ'=>'ζ','η'=>'η','θ'=>'θ','ι'=>'ι','κ'=>'κ','λ'=>'λ','μ'=>'μ','ν'=>'ν','ξ'=>'ξ','ο'=>'ο','π'=>'π','ρ'=>'ρ','ς'=>'ς','σ'=>'σ','τ'=>'τ','υ'=>'υ','φ'=>'φ','χ'=>'χ','ψ'=>'ψ','ω'=>'ω','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϐ'=>'ϐ','ϑ'=>'ϑ','ϒ'=>'ϒ','ϓ'=>'ϓ','ϔ'=>'ϔ','ϕ'=>'ϕ','ϖ'=>'ϖ','ϗ'=>'ϗ','Ϙ'=>'ϙ','ϙ'=>'ϙ','Ϛ'=>'ϛ','ϛ'=>'ϛ','Ϝ'=>'ϝ','ϝ'=>'ϝ','Ϟ'=>'ϟ','ϟ'=>'ϟ','Ϡ'=>'ϡ','ϡ'=>'ϡ','Ϣ'=>'ϣ','ϣ'=>'ϣ','Ϥ'=>'ϥ','ϥ'=>'ϥ','Ϧ'=>'ϧ','ϧ'=>'ϧ','Ϩ'=>'ϩ','ϩ'=>'ϩ','Ϫ'=>'ϫ','ϫ'=>'ϫ','Ϭ'=>'ϭ','ϭ'=>'ϭ','Ϯ'=>'ϯ','ϯ'=>'ϯ','ϰ'=>'ϰ','ϱ'=>'ϱ','ϲ'=>'ϲ','ϳ'=>'ϳ','ϴ'=>'θ','ϵ'=>'ϵ','Ϸ'=>'ϸ','ϸ'=>'ϸ','Ϲ'=>'ϲ','Ϻ'=>'ϻ','ϻ'=>'ϻ','ϼ'=>'ϼ','Ͻ'=>'ͻ','Ͼ'=>'ͼ','Ͽ'=>'ͽ','Ѐ'=>'ѐ','Ё'=>'ё','Ђ'=>'ђ','Ѓ'=>'ѓ','Є'=>'є','Ѕ'=>'ѕ','І'=>'і','Ї'=>'ї','Ј'=>'ј','Љ'=>'љ','Њ'=>'њ','Ћ'=>'ћ','Ќ'=>'ќ','Ѝ'=>'ѝ','Ў'=>'ў','Џ'=>'џ','А'=>'а','Б'=>'б','В'=>'в','Г'=>'г','Д'=>'д','Е'=>'е','Ж'=>'ж','З'=>'з','И'=>'и','Й'=>'й','К'=>'к','Л'=>'л','М'=>'м','Н'=>'н','О'=>'о','П'=>'п','Р'=>'р','С'=>'с','Т'=>'т','У'=>'у','Ф'=>'ф','Х'=>'х','Ц'=>'ц','Ч'=>'ч','Ш'=>'ш','Щ'=>'щ','Ъ'=>'ъ','Ы'=>'ы','Ь'=>'ь','Э'=>'э','Ю'=>'ю','Я'=>'я','а'=>'а','б'=>'б','в'=>'в','г'=>'г','д'=>'д','е'=>'е','ж'=>'ж','з'=>'з','и'=>'и','й'=>'й','к'=>'к','л'=>'л','м'=>'м','н'=>'н','о'=>'о','п'=>'п','р'=>'р','с'=>'с','т'=>'т','у'=>'у','ф'=>'ф','х'=>'х','ц'=>'ц','ч'=>'ч','ш'=>'ш','щ'=>'щ','ъ'=>'ъ','ы'=>'ы','ь'=>'ь','э'=>'э','ю'=>'ю','я'=>'я','ѐ'=>'ѐ','ё'=>'ё','ђ'=>'ђ','ѓ'=>'ѓ','є'=>'є','ѕ'=>'ѕ','і'=>'і','ї'=>'ї','ј'=>'ј','љ'=>'љ','њ'=>'њ','ћ'=>'ћ','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','џ'=>'џ','Ѡ'=>'ѡ','ѡ'=>'ѡ','Ѣ'=>'ѣ','ѣ'=>'ѣ','Ѥ'=>'ѥ','ѥ'=>'ѥ','Ѧ'=>'ѧ','ѧ'=>'ѧ','Ѩ'=>'ѩ','ѩ'=>'ѩ','Ѫ'=>'ѫ','ѫ'=>'ѫ','Ѭ'=>'ѭ','ѭ'=>'ѭ','Ѯ'=>'ѯ','ѯ'=>'ѯ','Ѱ'=>'ѱ','ѱ'=>'ѱ','Ѳ'=>'ѳ','ѳ'=>'ѳ','Ѵ'=>'ѵ','ѵ'=>'ѵ','Ѷ'=>'ѷ','ѷ'=>'ѷ','Ѹ'=>'ѹ','ѹ'=>'ѹ','Ѻ'=>'ѻ','ѻ'=>'ѻ','Ѽ'=>'ѽ','ѽ'=>'ѽ','Ѿ'=>'ѿ','ѿ'=>'ѿ','Ҁ'=>'ҁ','ҁ'=>'ҁ','҃'=>'҃','҄'=>'҄','҅'=>'҅','҆'=>'҆','҈'=>'҈','҉'=>'҉','Ҋ'=>'ҋ','ҋ'=>'ҋ','Ҍ'=>'ҍ','ҍ'=>'ҍ','Ҏ'=>'ҏ','ҏ'=>'ҏ','Ґ'=>'ґ','ґ'=>'ґ','Ғ'=>'ғ','ғ'=>'ғ','Ҕ'=>'ҕ','ҕ'=>'ҕ','Җ'=>'җ','җ'=>'җ','Ҙ'=>'ҙ','ҙ'=>'ҙ','Қ'=>'қ','қ'=>'қ','Ҝ'=>'ҝ','ҝ'=>'ҝ','Ҟ'=>'ҟ','ҟ'=>'ҟ','Ҡ'=>'ҡ','ҡ'=>'ҡ','Ң'=>'ң','ң'=>'ң','Ҥ'=>'ҥ','ҥ'=>'ҥ','Ҧ'=>'ҧ','ҧ'=>'ҧ','Ҩ'=>'ҩ','ҩ'=>'ҩ','Ҫ'=>'ҫ','ҫ'=>'ҫ','Ҭ'=>'ҭ','ҭ'=>'ҭ','Ү'=>'ү','ү'=>'ү','Ұ'=>'ұ','ұ'=>'ұ','Ҳ'=>'ҳ','ҳ'=>'ҳ','Ҵ'=>'ҵ','ҵ'=>'ҵ','Ҷ'=>'ҷ','ҷ'=>'ҷ','Ҹ'=>'ҹ','ҹ'=>'ҹ','Һ'=>'һ','һ'=>'һ','Ҽ'=>'ҽ','ҽ'=>'ҽ','Ҿ'=>'ҿ','ҿ'=>'ҿ','Ӏ'=>'ӏ','Ӂ'=>'ӂ','ӂ'=>'ӂ','Ӄ'=>'ӄ','ӄ'=>'ӄ','Ӆ'=>'ӆ','ӆ'=>'ӆ','Ӈ'=>'ӈ','ӈ'=>'ӈ','Ӊ'=>'ӊ','ӊ'=>'ӊ','Ӌ'=>'ӌ','ӌ'=>'ӌ','Ӎ'=>'ӎ','ӎ'=>'ӎ','ӏ'=>'ӏ','Ӑ'=>'ӑ','ӑ'=>'ӑ','Ӓ'=>'ӓ','ӓ'=>'ӓ','Ӕ'=>'ӕ','ӕ'=>'ӕ','Ӗ'=>'ӗ','ӗ'=>'ӗ','Ә'=>'ә','ә'=>'ә','Ӛ'=>'ӛ','ӛ'=>'ӛ','Ӝ'=>'ӝ','ӝ'=>'ӝ','Ӟ'=>'ӟ','ӟ'=>'ӟ','Ӡ'=>'ӡ','ӡ'=>'ӡ','Ӣ'=>'ӣ','ӣ'=>'ӣ','Ӥ'=>'ӥ','ӥ'=>'ӥ','Ӧ'=>'ӧ','ӧ'=>'ӧ','Ө'=>'ө','ө'=>'ө','Ӫ'=>'ӫ','ӫ'=>'ӫ','Ӭ'=>'ӭ','ӭ'=>'ӭ','Ӯ'=>'ӯ','ӯ'=>'ӯ','Ӱ'=>'ӱ','ӱ'=>'ӱ','Ӳ'=>'ӳ','ӳ'=>'ӳ','Ӵ'=>'ӵ','ӵ'=>'ӵ','Ӷ'=>'ӷ','ӷ'=>'ӷ','Ӹ'=>'ӹ','ӹ'=>'ӹ','Ӻ'=>'ӻ','ӻ'=>'ӻ','Ӽ'=>'ӽ','ӽ'=>'ӽ','Ӿ'=>'ӿ','ӿ'=>'ӿ','Ԁ'=>'ԁ','ԁ'=>'ԁ','Ԃ'=>'ԃ','ԃ'=>'ԃ','Ԅ'=>'ԅ','ԅ'=>'ԅ','Ԇ'=>'ԇ','ԇ'=>'ԇ','Ԉ'=>'ԉ','ԉ'=>'ԉ','Ԋ'=>'ԋ','ԋ'=>'ԋ','Ԍ'=>'ԍ','ԍ'=>'ԍ','Ԏ'=>'ԏ','ԏ'=>'ԏ','Ԑ'=>'ԑ','ԑ'=>'ԑ','Ԓ'=>'ԓ','ԓ'=>'ԓ','Ա'=>'ա','Բ'=>'բ','Գ'=>'գ','Դ'=>'դ','Ե'=>'ե','Զ'=>'զ','Է'=>'է','Ը'=>'ը','Թ'=>'թ','Ժ'=>'ժ','Ի'=>'ի','Լ'=>'լ','Խ'=>'խ','Ծ'=>'ծ','Կ'=>'կ','Հ'=>'հ','Ձ'=>'ձ','Ղ'=>'ղ','Ճ'=>'ճ','Մ'=>'մ','Յ'=>'յ','Ն'=>'ն','Շ'=>'շ','Ո'=>'ո','Չ'=>'չ','Պ'=>'պ','Ջ'=>'ջ','Ռ'=>'ռ','Ս'=>'ս','Վ'=>'վ','Տ'=>'տ','Ր'=>'ր','Ց'=>'ց','Ւ'=>'ւ','Փ'=>'փ','Ք'=>'ք','Օ'=>'օ','Ֆ'=>'ֆ','ՙ'=>'ՙ','ա'=>'ա','բ'=>'բ','գ'=>'գ','դ'=>'դ','ե'=>'ե','զ'=>'զ','է'=>'է','ը'=>'ը','թ'=>'թ','ժ'=>'ժ','ի'=>'ի','լ'=>'լ','խ'=>'խ','ծ'=>'ծ','կ'=>'կ','հ'=>'հ','ձ'=>'ձ','ղ'=>'ղ','ճ'=>'ճ','մ'=>'մ','յ'=>'յ','ն'=>'ն','շ'=>'շ','ո'=>'ո','չ'=>'չ','պ'=>'պ','ջ'=>'ջ','ռ'=>'ռ','ս'=>'ս','վ'=>'վ','տ'=>'տ','ր'=>'ր','ց'=>'ց','ւ'=>'ւ','փ'=>'փ','ք'=>'ք','օ'=>'օ','ֆ'=>'ֆ','և'=>'և','֑'=>'֑','֒'=>'֒','֓'=>'֓','֔'=>'֔','֕'=>'֕','֖'=>'֖','֗'=>'֗','֘'=>'֘','֙'=>'֙','֚'=>'֚','֛'=>'֛','֜'=>'֜','֝'=>'֝','֞'=>'֞','֟'=>'֟','֠'=>'֠','֡'=>'֡','֢'=>'֢','֣'=>'֣','֤'=>'֤','֥'=>'֥','֦'=>'֦','֧'=>'֧','֨'=>'֨','֩'=>'֩','֪'=>'֪','֫'=>'֫','֬'=>'֬','֭'=>'֭','֮'=>'֮','֯'=>'֯','ְ'=>'ְ','ֱ'=>'ֱ','ֲ'=>'ֲ','ֳ'=>'ֳ','ִ'=>'ִ','ֵ'=>'ֵ','ֶ'=>'ֶ','ַ'=>'ַ','ָ'=>'ָ','ֹ'=>'ֹ','ֺ'=>'ֺ','ֻ'=>'ֻ','ּ'=>'ּ','ֽ'=>'ֽ','ֿ'=>'ֿ','ׁ'=>'ׁ','ׂ'=>'ׂ','ׄ'=>'ׄ','ׅ'=>'ׅ','ׇ'=>'ׇ','א'=>'א','ב'=>'ב','ג'=>'ג','ד'=>'ד','ה'=>'ה','ו'=>'ו','ז'=>'ז','ח'=>'ח','ט'=>'ט','י'=>'י','ך'=>'ך','כ'=>'כ','ל'=>'ל','ם'=>'ם','מ'=>'מ','ן'=>'ן','נ'=>'נ','ס'=>'ס','ע'=>'ע','ף'=>'ף','פ'=>'פ','ץ'=>'ץ','צ'=>'צ','ק'=>'ק','ר'=>'ר','ש'=>'ש','ת'=>'ת','װ'=>'װ','ױ'=>'ױ','ײ'=>'ײ','ؐ'=>'ؐ','ؑ'=>'ؑ','ؒ'=>'ؒ','ؓ'=>'ؓ','ؔ'=>'ؔ','ؕ'=>'ؕ','ء'=>'ء','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ا'=>'ا','ب'=>'ب','ة'=>'ة','ت'=>'ت','ث'=>'ث','ج'=>'ج','ح'=>'ح','خ'=>'خ','د'=>'د','ذ'=>'ذ','ر'=>'ر','ز'=>'ز','س'=>'س','ش'=>'ش','ص'=>'ص','ض'=>'ض','ط'=>'ط','ظ'=>'ظ','ع'=>'ع','غ'=>'غ','ـ'=>'ـ','ف'=>'ف','ق'=>'ق','ك'=>'ك','ل'=>'ل','م'=>'م','ن'=>'ن','ه'=>'ه','و'=>'و','ى'=>'ى','ي'=>'ي','ً'=>'ً','ٌ'=>'ٌ','ٍ'=>'ٍ','َ'=>'َ','ُ'=>'ُ','ِ'=>'ِ','ّ'=>'ّ','ْ'=>'ْ','ٓ'=>'ٓ','ٔ'=>'ٔ','ٕ'=>'ٕ','ٖ'=>'ٖ','ٗ'=>'ٗ','٘'=>'٘','ٙ'=>'ٙ','ٚ'=>'ٚ','ٛ'=>'ٛ','ٜ'=>'ٜ','ٝ'=>'ٝ','ٞ'=>'ٞ','٠'=>'0','١'=>'1','٢'=>'2','٣'=>'3','٤'=>'4','٥'=>'5','٦'=>'6','٧'=>'7','٨'=>'8','٩'=>'9','ٮ'=>'ٮ','ٯ'=>'ٯ','ٰ'=>'ٰ','ٱ'=>'ٱ','ٲ'=>'ٲ','ٳ'=>'ٳ','ٴ'=>'ٴ','ٵ'=>'ٵ','ٶ'=>'ٶ','ٷ'=>'ٷ','ٸ'=>'ٸ','ٹ'=>'ٹ','ٺ'=>'ٺ','ٻ'=>'ٻ','ټ'=>'ټ','ٽ'=>'ٽ','پ'=>'پ','ٿ'=>'ٿ','ڀ'=>'ڀ','ځ'=>'ځ','ڂ'=>'ڂ','ڃ'=>'ڃ','ڄ'=>'ڄ','څ'=>'څ','چ'=>'چ','ڇ'=>'ڇ','ڈ'=>'ڈ','ډ'=>'ډ','ڊ'=>'ڊ','ڋ'=>'ڋ','ڌ'=>'ڌ','ڍ'=>'ڍ','ڎ'=>'ڎ','ڏ'=>'ڏ','ڐ'=>'ڐ','ڑ'=>'ڑ','ڒ'=>'ڒ','ړ'=>'ړ','ڔ'=>'ڔ','ڕ'=>'ڕ','ږ'=>'ږ','ڗ'=>'ڗ','ژ'=>'ژ','ڙ'=>'ڙ','ښ'=>'ښ','ڛ'=>'ڛ','ڜ'=>'ڜ','ڝ'=>'ڝ','ڞ'=>'ڞ','ڟ'=>'ڟ','ڠ'=>'ڠ','ڡ'=>'ڡ','ڢ'=>'ڢ','ڣ'=>'ڣ','ڤ'=>'ڤ','ڥ'=>'ڥ','ڦ'=>'ڦ','ڧ'=>'ڧ','ڨ'=>'ڨ','ک'=>'ک','ڪ'=>'ڪ','ګ'=>'ګ','ڬ'=>'ڬ','ڭ'=>'ڭ','ڮ'=>'ڮ','گ'=>'گ','ڰ'=>'ڰ','ڱ'=>'ڱ','ڲ'=>'ڲ','ڳ'=>'ڳ','ڴ'=>'ڴ','ڵ'=>'ڵ','ڶ'=>'ڶ','ڷ'=>'ڷ','ڸ'=>'ڸ','ڹ'=>'ڹ','ں'=>'ں','ڻ'=>'ڻ','ڼ'=>'ڼ','ڽ'=>'ڽ','ھ'=>'ھ','ڿ'=>'ڿ','ۀ'=>'ۀ','ہ'=>'ہ','ۂ'=>'ۂ','ۃ'=>'ۃ','ۄ'=>'ۄ','ۅ'=>'ۅ','ۆ'=>'ۆ','ۇ'=>'ۇ','ۈ'=>'ۈ','ۉ'=>'ۉ','ۊ'=>'ۊ','ۋ'=>'ۋ','ی'=>'ی','ۍ'=>'ۍ','ێ'=>'ێ','ۏ'=>'ۏ','ې'=>'ې','ۑ'=>'ۑ','ے'=>'ے','ۓ'=>'ۓ','ە'=>'ە','ۖ'=>'ۖ','ۗ'=>'ۗ','ۘ'=>'ۘ','ۙ'=>'ۙ','ۚ'=>'ۚ','ۛ'=>'ۛ','ۜ'=>'ۜ','۞'=>'۞','۟'=>'۟','۠'=>'۠','ۡ'=>'ۡ','ۢ'=>'ۢ','ۣ'=>'ۣ','ۤ'=>'ۤ','ۥ'=>'ۥ','ۦ'=>'ۦ','ۧ'=>'ۧ','ۨ'=>'ۨ','۪'=>'۪','۫'=>'۫','۬'=>'۬','ۭ'=>'ۭ','ۮ'=>'ۮ','ۯ'=>'ۯ','۰'=>'0','۱'=>'1','۲'=>'2','۳'=>'3','۴'=>'4','۵'=>'5','۶'=>'6','۷'=>'7','۸'=>'8','۹'=>'9','ۺ'=>'ۺ','ۻ'=>'ۻ','ۼ'=>'ۼ','ۿ'=>'ۿ','ܐ'=>'ܐ','ܑ'=>'ܑ','ܒ'=>'ܒ','ܓ'=>'ܓ','ܔ'=>'ܔ','ܕ'=>'ܕ','ܖ'=>'ܖ','ܗ'=>'ܗ','ܘ'=>'ܘ','ܙ'=>'ܙ','ܚ'=>'ܚ','ܛ'=>'ܛ','ܜ'=>'ܜ','ܝ'=>'ܝ','ܞ'=>'ܞ','ܟ'=>'ܟ','ܠ'=>'ܠ','ܡ'=>'ܡ','ܢ'=>'ܢ','ܣ'=>'ܣ','ܤ'=>'ܤ','ܥ'=>'ܥ','ܦ'=>'ܦ','ܧ'=>'ܧ','ܨ'=>'ܨ','ܩ'=>'ܩ','ܪ'=>'ܪ','ܫ'=>'ܫ','ܬ'=>'ܬ','ܭ'=>'ܭ','ܮ'=>'ܮ','ܯ'=>'ܯ','ܰ'=>'ܰ','ܱ'=>'ܱ','ܲ'=>'ܲ','ܳ'=>'ܳ','ܴ'=>'ܴ','ܵ'=>'ܵ','ܶ'=>'ܶ','ܷ'=>'ܷ','ܸ'=>'ܸ','ܹ'=>'ܹ','ܺ'=>'ܺ','ܻ'=>'ܻ','ܼ'=>'ܼ','ܽ'=>'ܽ','ܾ'=>'ܾ','ܿ'=>'ܿ','݀'=>'݀','݁'=>'݁','݂'=>'݂','݃'=>'݃','݄'=>'݄','݅'=>'݅','݆'=>'݆','݇'=>'݇','݈'=>'݈','݉'=>'݉','݊'=>'݊','ݍ'=>'ݍ','ݎ'=>'ݎ','ݏ'=>'ݏ','ݐ'=>'ݐ','ݑ'=>'ݑ','ݒ'=>'ݒ','ݓ'=>'ݓ','ݔ'=>'ݔ','ݕ'=>'ݕ','ݖ'=>'ݖ','ݗ'=>'ݗ','ݘ'=>'ݘ','ݙ'=>'ݙ','ݚ'=>'ݚ','ݛ'=>'ݛ','ݜ'=>'ݜ','ݝ'=>'ݝ','ݞ'=>'ݞ','ݟ'=>'ݟ','ݠ'=>'ݠ','ݡ'=>'ݡ','ݢ'=>'ݢ','ݣ'=>'ݣ','ݤ'=>'ݤ','ݥ'=>'ݥ','ݦ'=>'ݦ','ݧ'=>'ݧ','ݨ'=>'ݨ','ݩ'=>'ݩ','ݪ'=>'ݪ','ݫ'=>'ݫ','ݬ'=>'ݬ','ݭ'=>'ݭ','ހ'=>'ހ','ށ'=>'ށ','ނ'=>'ނ','ރ'=>'ރ','ބ'=>'ބ','ޅ'=>'ޅ','ކ'=>'ކ','އ'=>'އ','ވ'=>'ވ','މ'=>'މ','ފ'=>'ފ','ދ'=>'ދ','ތ'=>'ތ','ލ'=>'ލ','ގ'=>'ގ','ޏ'=>'ޏ','ސ'=>'ސ','ޑ'=>'ޑ','ޒ'=>'ޒ','ޓ'=>'ޓ','ޔ'=>'ޔ','ޕ'=>'ޕ','ޖ'=>'ޖ','ޗ'=>'ޗ','ޘ'=>'ޘ','ޙ'=>'ޙ','ޚ'=>'ޚ','ޛ'=>'ޛ','ޜ'=>'ޜ','ޝ'=>'ޝ','ޞ'=>'ޞ','ޟ'=>'ޟ','ޠ'=>'ޠ','ޡ'=>'ޡ','ޢ'=>'ޢ','ޣ'=>'ޣ','ޤ'=>'ޤ','ޥ'=>'ޥ','ަ'=>'ަ','ާ'=>'ާ','ި'=>'ި','ީ'=>'ީ','ު'=>'ު','ޫ'=>'ޫ','ެ'=>'ެ','ޭ'=>'ޭ','ޮ'=>'ޮ','ޯ'=>'ޯ','ް'=>'ް','ޱ'=>'ޱ','߀'=>'0','߁'=>'1','߂'=>'2','߃'=>'3','߄'=>'4','߅'=>'5','߆'=>'6','߇'=>'7','߈'=>'8','߉'=>'9','ߊ'=>'ߊ','ߋ'=>'ߋ','ߌ'=>'ߌ','ߍ'=>'ߍ','ߎ'=>'ߎ','ߏ'=>'ߏ','ߐ'=>'ߐ','ߑ'=>'ߑ','ߒ'=>'ߒ','ߓ'=>'ߓ','ߔ'=>'ߔ','ߕ'=>'ߕ','ߖ'=>'ߖ','ߗ'=>'ߗ','ߘ'=>'ߘ','ߙ'=>'ߙ','ߚ'=>'ߚ','ߛ'=>'ߛ','ߜ'=>'ߜ','ߝ'=>'ߝ','ߞ'=>'ߞ','ߟ'=>'ߟ','ߠ'=>'ߠ','ߡ'=>'ߡ','ߢ'=>'ߢ','ߣ'=>'ߣ','ߤ'=>'ߤ','ߥ'=>'ߥ','ߦ'=>'ߦ','ߧ'=>'ߧ','ߨ'=>'ߨ','ߩ'=>'ߩ','ߪ'=>'ߪ','߫'=>'߫','߬'=>'߬','߭'=>'߭','߮'=>'߮','߯'=>'߯','߰'=>'߰','߱'=>'߱','߲'=>'߲','߳'=>'߳','ߴ'=>'ߴ','ߵ'=>'ߵ','ߺ'=>'ߺ'); \ No newline at end of file
+<?php return array(0=>'0',1=>'1',2=>'2',3=>'3',4=>'4',5=>'5',6=>'6',7=>'7',8=>'8',9=>'9','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','ª'=>'ª','²'=>'2','³'=>'3','µ'=>'µ','¹'=>'1','º'=>'º','¼'=>'1/4','½'=>'1/2','¾'=>'3/4','À'=>'à','Á'=>'á','Â'=>'â','Ã'=>'ã','Ä'=>'ae','Å'=>'å','Æ'=>'ae','Ç'=>'ç','È'=>'è','É'=>'é','Ê'=>'ê','Ë'=>'ë','Ì'=>'ì','Í'=>'í','Î'=>'î','Ï'=>'ï','Ð'=>'ð','Ñ'=>'ñ','Ò'=>'ò','Ó'=>'ó','Ô'=>'ô','Õ'=>'õ','Ö'=>'oe','Ø'=>'ø','Ù'=>'ù','Ú'=>'ú','Û'=>'û','Ü'=>'ü','Ý'=>'ý','Þ'=>'þ','ß'=>'ss','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ae','å'=>'å','æ'=>'ae','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ð'=>'ð','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'oe','ø'=>'ø','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ue','ý'=>'ý','þ'=>'þ','ÿ'=>'ÿ','Ā'=>'ā','ā'=>'ā','Ă'=>'ă','ă'=>'ă','Ą'=>'ą','ą'=>'ą','Ć'=>'ć','ć'=>'ć','Ĉ'=>'ĉ','ĉ'=>'ĉ','Ċ'=>'ċ','ċ'=>'ċ','Č'=>'č','č'=>'č','Ď'=>'ď','ď'=>'ď','Đ'=>'đ','đ'=>'đ','Ē'=>'ē','ē'=>'ē','Ĕ'=>'ĕ','ĕ'=>'ĕ','Ė'=>'ė','ė'=>'ė','Ę'=>'ę','ę'=>'ę','Ě'=>'ě','ě'=>'ě','Ĝ'=>'ĝ','ĝ'=>'ĝ','Ğ'=>'ğ','ğ'=>'ğ','Ġ'=>'ġ','ġ'=>'ġ','Ģ'=>'ģ','ģ'=>'ģ','Ĥ'=>'ĥ','ĥ'=>'ĥ','Ħ'=>'ħ','ħ'=>'ħ','Ĩ'=>'ĩ','ĩ'=>'ĩ','Ī'=>'ī','ī'=>'ī','Ĭ'=>'ĭ','ĭ'=>'ĭ','Į'=>'į','į'=>'į','İ'=>'i','ı'=>'ı','IJ'=>'ij','ij'=>'ij','Ĵ'=>'ĵ','ĵ'=>'ĵ','Ķ'=>'ķ','ķ'=>'ķ','ĸ'=>'ĸ','Ĺ'=>'ĺ','ĺ'=>'ĺ','Ļ'=>'ļ','ļ'=>'ļ','Ľ'=>'ľ','ľ'=>'ľ','Ŀ'=>'ŀ','ŀ'=>'ŀ','Ł'=>'ł','ł'=>'ł','Ń'=>'ń','ń'=>'ń','Ņ'=>'ņ','ņ'=>'ņ','Ň'=>'ň','ň'=>'ň','ʼn'=>'ʼn','Ŋ'=>'ŋ','ŋ'=>'ŋ','Ō'=>'ō','ō'=>'ō','Ŏ'=>'ŏ','ŏ'=>'ŏ','Ő'=>'ő','ő'=>'ő','Œ'=>'oe','œ'=>'oe','Ŕ'=>'ŕ','ŕ'=>'ŕ','Ŗ'=>'ŗ','ŗ'=>'ŗ','Ř'=>'ř','ř'=>'ř','Ś'=>'ś','ś'=>'ś','Ŝ'=>'ŝ','ŝ'=>'ŝ','Ş'=>'ş','ş'=>'ş','Š'=>'š','š'=>'š','Ţ'=>'ţ','ţ'=>'ţ','Ť'=>'ť','ť'=>'ť','Ŧ'=>'ŧ','ŧ'=>'ŧ','Ũ'=>'ũ','ũ'=>'ũ','Ū'=>'ū','ū'=>'ū','Ŭ'=>'ŭ','ŭ'=>'ŭ','Ů'=>'ů','ů'=>'ů','Ű'=>'ű','ű'=>'ű','Ų'=>'ų','ų'=>'ų','Ŵ'=>'ŵ','ŵ'=>'ŵ','Ŷ'=>'ŷ','ŷ'=>'ŷ','Ÿ'=>'ÿ','Ź'=>'ź','ź'=>'ź','Ż'=>'ż','ż'=>'ż','Ž'=>'ž','ž'=>'ž','ſ'=>'ſ','ƀ'=>'ƀ','Ɓ'=>'ɓ','Ƃ'=>'ƃ','ƃ'=>'ƃ','Ƅ'=>'ƅ','ƅ'=>'ƅ','Ɔ'=>'ɔ','Ƈ'=>'ƈ','ƈ'=>'ƈ','Ɖ'=>'ɖ','Ɗ'=>'ɗ','Ƌ'=>'ƌ','ƌ'=>'ƌ','ƍ'=>'ƍ','Ǝ'=>'ǝ','Ə'=>'ə','Ɛ'=>'ɛ','Ƒ'=>'ƒ','ƒ'=>'ƒ','Ɠ'=>'ɠ','Ɣ'=>'ɣ','ƕ'=>'hv','Ɩ'=>'ɩ','Ɨ'=>'ɨ','Ƙ'=>'ƙ','ƙ'=>'ƙ','ƚ'=>'ƚ','ƛ'=>'ƛ','Ɯ'=>'ɯ','Ɲ'=>'ɲ','ƞ'=>'ƞ','Ɵ'=>'ɵ','Ơ'=>'ơ','ơ'=>'ơ','Ƣ'=>'oi','ƣ'=>'oi','Ƥ'=>'ƥ','ƥ'=>'ƥ','Ʀ'=>'yr','Ƨ'=>'ƨ','ƨ'=>'ƨ','Ʃ'=>'ʃ','ƪ'=>'ƪ','ƫ'=>'ƫ','Ƭ'=>'ƭ','ƭ'=>'ƭ','Ʈ'=>'ʈ','Ư'=>'ư','ư'=>'ư','Ʊ'=>'ʊ','Ʋ'=>'ʋ','Ƴ'=>'ƴ','ƴ'=>'ƴ','Ƶ'=>'ƶ','ƶ'=>'ƶ','Ʒ'=>'ʒ','Ƹ'=>'ƹ','ƹ'=>'ƹ','ƺ'=>'ƺ','ƻ'=>'ƻ','Ƽ'=>'ƽ','ƽ'=>'ƽ','ƾ'=>'ƾ','ƿ'=>'ƿ','ǀ'=>'ǀ','ǁ'=>'ǁ','ǂ'=>'ǂ','ǃ'=>'ǃ','DŽ'=>'dž','Dž'=>'dž','dž'=>'dž','LJ'=>'lj','Lj'=>'lj','lj'=>'lj','NJ'=>'nj','Nj'=>'nj','nj'=>'nj','Ǎ'=>'ǎ','ǎ'=>'ǎ','Ǐ'=>'ǐ','ǐ'=>'ǐ','Ǒ'=>'ǒ','ǒ'=>'ǒ','Ǔ'=>'ǔ','ǔ'=>'ǔ','Ǖ'=>'ǖ','ǖ'=>'ǖ','Ǘ'=>'ǘ','ǘ'=>'ǘ','Ǚ'=>'ǚ','ǚ'=>'ǚ','Ǜ'=>'ǜ','ǜ'=>'ǜ','ǝ'=>'ǝ','Ǟ'=>'ǟ','ǟ'=>'ǟ','Ǡ'=>'ǡ','ǡ'=>'ǡ','Ǣ'=>'ǣ','ǣ'=>'ǣ','Ǥ'=>'ǥ','ǥ'=>'ǥ','Ǧ'=>'ǧ','ǧ'=>'ǧ','Ǩ'=>'ǩ','ǩ'=>'ǩ','Ǫ'=>'ǫ','ǫ'=>'ǫ','Ǭ'=>'ǭ','ǭ'=>'ǭ','Ǯ'=>'ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','DZ'=>'dz','Dz'=>'dz','dz'=>'dz','Ǵ'=>'ǵ','ǵ'=>'ǵ','Ƕ'=>'ƕ','Ƿ'=>'ƿ','Ǹ'=>'ǹ','ǹ'=>'ǹ','Ǻ'=>'ǻ','ǻ'=>'ǻ','Ǽ'=>'ǽ','ǽ'=>'ǽ','Ǿ'=>'ǿ','ǿ'=>'ǿ','Ȁ'=>'ȁ','ȁ'=>'ȁ','Ȃ'=>'ȃ','ȃ'=>'ȃ','Ȅ'=>'ȅ','ȅ'=>'ȅ','Ȇ'=>'ȇ','ȇ'=>'ȇ','Ȉ'=>'ȉ','ȉ'=>'ȉ','Ȋ'=>'ȋ','ȋ'=>'ȋ','Ȍ'=>'ȍ','ȍ'=>'ȍ','Ȏ'=>'ȏ','ȏ'=>'ȏ','Ȑ'=>'ȑ','ȑ'=>'ȑ','Ȓ'=>'ȓ','ȓ'=>'ȓ','Ȕ'=>'ȕ','ȕ'=>'ȕ','Ȗ'=>'ȗ','ȗ'=>'ȗ','Ș'=>'ș','ș'=>'ș','Ț'=>'ț','ț'=>'ț','Ȝ'=>'ȝ','ȝ'=>'ȝ','Ȟ'=>'ȟ','ȟ'=>'ȟ','Ƞ'=>'ƞ','ȡ'=>'ȡ','Ȣ'=>'ou','ȣ'=>'ou','Ȥ'=>'ȥ','ȥ'=>'ȥ','Ȧ'=>'ȧ','ȧ'=>'ȧ','Ȩ'=>'ȩ','ȩ'=>'ȩ','Ȫ'=>'ȫ','ȫ'=>'ȫ','Ȭ'=>'ȭ','ȭ'=>'ȭ','Ȯ'=>'ȯ','ȯ'=>'ȯ','Ȱ'=>'ȱ','ȱ'=>'ȱ','Ȳ'=>'ȳ','ȳ'=>'ȳ','ȴ'=>'ȴ','ȵ'=>'ȵ','ȶ'=>'ȶ','ȷ'=>'ȷ','ȸ'=>'ȸ','ȹ'=>'ȹ','Ⱥ'=>'ⱥ','Ȼ'=>'ȼ','ȼ'=>'ȼ','Ƚ'=>'ƚ','Ⱦ'=>'ⱦ','ȿ'=>'ȿ','ɀ'=>'ɀ','Ɂ'=>'ɂ','ɂ'=>'ɂ','Ƀ'=>'ƀ','Ʉ'=>'ʉ','Ʌ'=>'ʌ','Ɇ'=>'ɇ','ɇ'=>'ɇ','Ɉ'=>'ɉ','ɉ'=>'ɉ','Ɋ'=>'ɋ','ɋ'=>'ɋ','Ɍ'=>'ɍ','ɍ'=>'ɍ','Ɏ'=>'ɏ','ɏ'=>'ɏ','ɐ'=>'ɐ','ɑ'=>'ɑ','ɒ'=>'ɒ','ɓ'=>'ɓ','ɔ'=>'ɔ','ɕ'=>'ɕ','ɖ'=>'ɖ','ɗ'=>'ɗ','ɘ'=>'ɘ','ə'=>'ə','ɚ'=>'ɚ','ɛ'=>'ɛ','ɜ'=>'ɜ','ɝ'=>'ɝ','ɞ'=>'ɞ','ɟ'=>'ɟ','ɠ'=>'ɠ','ɡ'=>'ɡ','ɢ'=>'ɢ','ɣ'=>'ɣ','ɤ'=>'ɤ','ɥ'=>'ɥ','ɦ'=>'ɦ','ɧ'=>'ɧ','ɨ'=>'ɨ','ɩ'=>'ɩ','ɪ'=>'ɪ','ɫ'=>'ɫ','ɬ'=>'ɬ','ɭ'=>'ɭ','ɮ'=>'ɮ','ɯ'=>'ɯ','ɰ'=>'ɰ','ɱ'=>'ɱ','ɲ'=>'ɲ','ɳ'=>'ɳ','ɴ'=>'ɴ','ɵ'=>'ɵ','ɶ'=>'ɶ','ɷ'=>'ɷ','ɸ'=>'ɸ','ɹ'=>'ɹ','ɺ'=>'ɺ','ɻ'=>'ɻ','ɼ'=>'ɼ','ɽ'=>'ɽ','ɾ'=>'ɾ','ɿ'=>'ɿ','ʀ'=>'ʀ','ʁ'=>'ʁ','ʂ'=>'ʂ','ʃ'=>'ʃ','ʄ'=>'ʄ','ʅ'=>'ʅ','ʆ'=>'ʆ','ʇ'=>'ʇ','ʈ'=>'ʈ','ʉ'=>'ʉ','ʊ'=>'ʊ','ʋ'=>'ʋ','ʌ'=>'ʌ','ʍ'=>'ʍ','ʎ'=>'ʎ','ʏ'=>'ʏ','ʐ'=>'ʐ','ʑ'=>'ʑ','ʒ'=>'ʒ','ʓ'=>'ʓ','ʔ'=>'ʔ','ʕ'=>'ʕ','ʖ'=>'ʖ','ʗ'=>'ʗ','ʘ'=>'ʘ','ʙ'=>'ʙ','ʚ'=>'ʚ','ʛ'=>'ʛ','ʜ'=>'ʜ','ʝ'=>'ʝ','ʞ'=>'ʞ','ʟ'=>'ʟ','ʠ'=>'ʠ','ʡ'=>'ʡ','ʢ'=>'ʢ','ʣ'=>'ʣ','ʤ'=>'ʤ','ʥ'=>'ʥ','ʦ'=>'ʦ','ʧ'=>'ʧ','ʨ'=>'ʨ','ʩ'=>'ʩ','ʪ'=>'ʪ','ʫ'=>'ʫ','ʬ'=>'ʬ','ʭ'=>'ʭ','ʮ'=>'ʮ','ʯ'=>'ʯ','ʰ'=>'ʰ','ʱ'=>'ʱ','ʲ'=>'ʲ','ʳ'=>'ʳ','ʴ'=>'ʴ','ʵ'=>'ʵ','ʶ'=>'ʶ','ʷ'=>'ʷ','ʸ'=>'ʸ','ʹ'=>'ʹ','ʺ'=>'ʺ','ʻ'=>'ʻ','ʼ'=>'ʼ','ʽ'=>'ʽ','ʾ'=>'ʾ','ʿ'=>'ʿ','ˀ'=>'ˀ','ˁ'=>'ˁ','ˆ'=>'ˆ','ˇ'=>'ˇ','ˈ'=>'ˈ','ˉ'=>'ˉ','ˊ'=>'ˊ','ˋ'=>'ˋ','ˌ'=>'ˌ','ˍ'=>'ˍ','ˎ'=>'ˎ','ˏ'=>'ˏ','ː'=>'ː','ˑ'=>'ˑ','ˠ'=>'ˠ','ˡ'=>'ˡ','ˢ'=>'ˢ','ˣ'=>'ˣ','ˤ'=>'ˤ','ˮ'=>'ˮ','̀'=>'̀','́'=>'́','̂'=>'̂','̃'=>'̃','̄'=>'̄','̅'=>'̅','̆'=>'̆','̇'=>'̇','̈'=>'̈','̉'=>'̉','̊'=>'̊','̋'=>'̋','̌'=>'̌','̍'=>'̍','̎'=>'̎','̏'=>'̏','̐'=>'̐','̑'=>'̑','̒'=>'̒','̓'=>'̓','̔'=>'̔','̕'=>'̕','̖'=>'̖','̗'=>'̗','̘'=>'̘','̙'=>'̙','̚'=>'̚','̛'=>'̛','̜'=>'̜','̝'=>'̝','̞'=>'̞','̟'=>'̟','̠'=>'̠','̡'=>'̡','̢'=>'̢','̣'=>'̣','̤'=>'̤','̥'=>'̥','̦'=>'̦','̧'=>'̧','̨'=>'̨','̩'=>'̩','̪'=>'̪','̫'=>'̫','̬'=>'̬','̭'=>'̭','̮'=>'̮','̯'=>'̯','̰'=>'̰','̱'=>'̱','̲'=>'̲','̳'=>'̳','̴'=>'̴','̵'=>'̵','̶'=>'̶','̷'=>'̷','̸'=>'̸','̹'=>'̹','̺'=>'̺','̻'=>'̻','̼'=>'̼','̽'=>'̽','̾'=>'̾','̿'=>'̿','̀'=>'̀','́'=>'́','͂'=>'͂','̓'=>'̓','̈́'=>'̈́','ͅ'=>'ͅ','͆'=>'͆','͇'=>'͇','͈'=>'͈','͉'=>'͉','͊'=>'͊','͋'=>'͋','͌'=>'͌','͍'=>'͍','͎'=>'͎','͏'=>'͏','͐'=>'͐','͑'=>'͑','͒'=>'͒','͓'=>'͓','͔'=>'͔','͕'=>'͕','͖'=>'͖','͗'=>'͗','͘'=>'͘','͙'=>'͙','͚'=>'͚','͛'=>'͛','͜'=>'͜','͝'=>'͝','͞'=>'͞','͟'=>'͟','͠'=>'͠','͡'=>'͡','͢'=>'͢','ͣ'=>'ͣ','ͤ'=>'ͤ','ͥ'=>'ͥ','ͦ'=>'ͦ','ͧ'=>'ͧ','ͨ'=>'ͨ','ͩ'=>'ͩ','ͪ'=>'ͪ','ͫ'=>'ͫ','ͬ'=>'ͬ','ͭ'=>'ͭ','ͮ'=>'ͮ','ͯ'=>'ͯ','ͺ'=>'ͺ','ͻ'=>'ͻ','ͼ'=>'ͼ','ͽ'=>'ͽ','Ά'=>'ά','Έ'=>'έ','Ή'=>'ή','Ί'=>'ί','Ό'=>'ό','Ύ'=>'ύ','Ώ'=>'ώ','ΐ'=>'ΐ','Α'=>'α','Β'=>'β','Γ'=>'γ','Δ'=>'δ','Ε'=>'ε','Ζ'=>'ζ','Η'=>'η','Θ'=>'θ','Ι'=>'ι','Κ'=>'κ','Λ'=>'λ','Μ'=>'μ','Ν'=>'ν','Ξ'=>'ξ','Ο'=>'ο','Π'=>'π','Ρ'=>'ρ','Σ'=>'σ','Τ'=>'τ','Υ'=>'υ','Φ'=>'φ','Χ'=>'χ','Ψ'=>'ψ','Ω'=>'ω','Ϊ'=>'ϊ','Ϋ'=>'ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','α'=>'α','β'=>'β','γ'=>'γ','δ'=>'δ','ε'=>'ε','ζ'=>'ζ','η'=>'η','θ'=>'θ','ι'=>'ι','κ'=>'κ','λ'=>'λ','μ'=>'μ','ν'=>'ν','ξ'=>'ξ','ο'=>'ο','π'=>'π','ρ'=>'ρ','ς'=>'ς','σ'=>'σ','τ'=>'τ','υ'=>'υ','φ'=>'φ','χ'=>'χ','ψ'=>'ψ','ω'=>'ω','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϐ'=>'ϐ','ϑ'=>'ϑ','ϒ'=>'ϒ','ϓ'=>'ϓ','ϔ'=>'ϔ','ϕ'=>'ϕ','ϖ'=>'ϖ','ϗ'=>'ϗ','Ϙ'=>'ϙ','ϙ'=>'ϙ','Ϛ'=>'ϛ','ϛ'=>'ϛ','Ϝ'=>'ϝ','ϝ'=>'ϝ','Ϟ'=>'ϟ','ϟ'=>'ϟ','Ϡ'=>'ϡ','ϡ'=>'ϡ','Ϣ'=>'ϣ','ϣ'=>'ϣ','Ϥ'=>'ϥ','ϥ'=>'ϥ','Ϧ'=>'ϧ','ϧ'=>'ϧ','Ϩ'=>'ϩ','ϩ'=>'ϩ','Ϫ'=>'ϫ','ϫ'=>'ϫ','Ϭ'=>'ϭ','ϭ'=>'ϭ','Ϯ'=>'ϯ','ϯ'=>'ϯ','ϰ'=>'ϰ','ϱ'=>'ϱ','ϲ'=>'ϲ','ϳ'=>'ϳ','ϴ'=>'θ','ϵ'=>'ϵ','Ϸ'=>'ϸ','ϸ'=>'ϸ','Ϲ'=>'ϲ','Ϻ'=>'ϻ','ϻ'=>'ϻ','ϼ'=>'ϼ','Ͻ'=>'ͻ','Ͼ'=>'ͼ','Ͽ'=>'ͽ','Ѐ'=>'ѐ','Ё'=>'ё','Ђ'=>'ђ','Ѓ'=>'ѓ','Є'=>'є','Ѕ'=>'ѕ','І'=>'і','Ї'=>'ї','Ј'=>'ј','Љ'=>'љ','Њ'=>'њ','Ћ'=>'ћ','Ќ'=>'ќ','Ѝ'=>'ѝ','Ў'=>'ў','Џ'=>'џ','А'=>'а','Б'=>'б','В'=>'в','Г'=>'г','Д'=>'д','Е'=>'е','Ж'=>'ж','З'=>'з','И'=>'и','Й'=>'й','К'=>'к','Л'=>'л','М'=>'м','Н'=>'н','О'=>'о','П'=>'п','Р'=>'р','С'=>'с','Т'=>'т','У'=>'у','Ф'=>'ф','Х'=>'х','Ц'=>'ц','Ч'=>'ч','Ш'=>'ш','Щ'=>'щ','Ъ'=>'ъ','Ы'=>'ы','Ь'=>'ь','Э'=>'э','Ю'=>'ю','Я'=>'я','а'=>'а','б'=>'б','в'=>'в','г'=>'г','д'=>'д','е'=>'е','ж'=>'ж','з'=>'з','и'=>'и','й'=>'й','к'=>'к','л'=>'л','м'=>'м','н'=>'н','о'=>'о','п'=>'п','р'=>'р','с'=>'с','т'=>'т','у'=>'у','ф'=>'ф','х'=>'х','ц'=>'ц','ч'=>'ч','ш'=>'ш','щ'=>'щ','ъ'=>'ъ','ы'=>'ы','ь'=>'ь','э'=>'э','ю'=>'ю','я'=>'я','ѐ'=>'ѐ','ё'=>'ё','ђ'=>'ђ','ѓ'=>'ѓ','є'=>'є','ѕ'=>'ѕ','і'=>'і','ї'=>'ї','ј'=>'ј','љ'=>'љ','њ'=>'њ','ћ'=>'ћ','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','џ'=>'џ','Ѡ'=>'ѡ','ѡ'=>'ѡ','Ѣ'=>'ѣ','ѣ'=>'ѣ','Ѥ'=>'ѥ','ѥ'=>'ѥ','Ѧ'=>'ѧ','ѧ'=>'ѧ','Ѩ'=>'ѩ','ѩ'=>'ѩ','Ѫ'=>'ѫ','ѫ'=>'ѫ','Ѭ'=>'ѭ','ѭ'=>'ѭ','Ѯ'=>'ѯ','ѯ'=>'ѯ','Ѱ'=>'ѱ','ѱ'=>'ѱ','Ѳ'=>'ѳ','ѳ'=>'ѳ','Ѵ'=>'ѵ','ѵ'=>'ѵ','Ѷ'=>'ѷ','ѷ'=>'ѷ','Ѹ'=>'ѹ','ѹ'=>'ѹ','Ѻ'=>'ѻ','ѻ'=>'ѻ','Ѽ'=>'ѽ','ѽ'=>'ѽ','Ѿ'=>'ѿ','ѿ'=>'ѿ','Ҁ'=>'ҁ','ҁ'=>'ҁ','҃'=>'҃','҄'=>'҄','҅'=>'҅','҆'=>'҆','҈'=>'҈','҉'=>'҉','Ҋ'=>'ҋ','ҋ'=>'ҋ','Ҍ'=>'ҍ','ҍ'=>'ҍ','Ҏ'=>'ҏ','ҏ'=>'ҏ','Ґ'=>'ґ','ґ'=>'ґ','Ғ'=>'ғ','ғ'=>'ғ','Ҕ'=>'ҕ','ҕ'=>'ҕ','Җ'=>'җ','җ'=>'җ','Ҙ'=>'ҙ','ҙ'=>'ҙ','Қ'=>'қ','қ'=>'қ','Ҝ'=>'ҝ','ҝ'=>'ҝ','Ҟ'=>'ҟ','ҟ'=>'ҟ','Ҡ'=>'ҡ','ҡ'=>'ҡ','Ң'=>'ң','ң'=>'ң','Ҥ'=>'ҥ','ҥ'=>'ҥ','Ҧ'=>'ҧ','ҧ'=>'ҧ','Ҩ'=>'ҩ','ҩ'=>'ҩ','Ҫ'=>'ҫ','ҫ'=>'ҫ','Ҭ'=>'ҭ','ҭ'=>'ҭ','Ү'=>'ү','ү'=>'ү','Ұ'=>'ұ','ұ'=>'ұ','Ҳ'=>'ҳ','ҳ'=>'ҳ','Ҵ'=>'ҵ','ҵ'=>'ҵ','Ҷ'=>'ҷ','ҷ'=>'ҷ','Ҹ'=>'ҹ','ҹ'=>'ҹ','Һ'=>'һ','һ'=>'һ','Ҽ'=>'ҽ','ҽ'=>'ҽ','Ҿ'=>'ҿ','ҿ'=>'ҿ','Ӏ'=>'ӏ','Ӂ'=>'ӂ','ӂ'=>'ӂ','Ӄ'=>'ӄ','ӄ'=>'ӄ','Ӆ'=>'ӆ','ӆ'=>'ӆ','Ӈ'=>'ӈ','ӈ'=>'ӈ','Ӊ'=>'ӊ','ӊ'=>'ӊ','Ӌ'=>'ӌ','ӌ'=>'ӌ','Ӎ'=>'ӎ','ӎ'=>'ӎ','ӏ'=>'ӏ','Ӑ'=>'ӑ','ӑ'=>'ӑ','Ӓ'=>'ӓ','ӓ'=>'ӓ','Ӕ'=>'ӕ','ӕ'=>'ӕ','Ӗ'=>'ӗ','ӗ'=>'ӗ','Ә'=>'ә','ә'=>'ә','Ӛ'=>'ӛ','ӛ'=>'ӛ','Ӝ'=>'ӝ','ӝ'=>'ӝ','Ӟ'=>'ӟ','ӟ'=>'ӟ','Ӡ'=>'ӡ','ӡ'=>'ӡ','Ӣ'=>'ӣ','ӣ'=>'ӣ','Ӥ'=>'ӥ','ӥ'=>'ӥ','Ӧ'=>'ӧ','ӧ'=>'ӧ','Ө'=>'ө','ө'=>'ө','Ӫ'=>'ӫ','ӫ'=>'ӫ','Ӭ'=>'ӭ','ӭ'=>'ӭ','Ӯ'=>'ӯ','ӯ'=>'ӯ','Ӱ'=>'ӱ','ӱ'=>'ӱ','Ӳ'=>'ӳ','ӳ'=>'ӳ','Ӵ'=>'ӵ','ӵ'=>'ӵ','Ӷ'=>'ӷ','ӷ'=>'ӷ','Ӹ'=>'ӹ','ӹ'=>'ӹ','Ӻ'=>'ӻ','ӻ'=>'ӻ','Ӽ'=>'ӽ','ӽ'=>'ӽ','Ӿ'=>'ӿ','ӿ'=>'ӿ','Ԁ'=>'ԁ','ԁ'=>'ԁ','Ԃ'=>'ԃ','ԃ'=>'ԃ','Ԅ'=>'ԅ','ԅ'=>'ԅ','Ԇ'=>'ԇ','ԇ'=>'ԇ','Ԉ'=>'ԉ','ԉ'=>'ԉ','Ԋ'=>'ԋ','ԋ'=>'ԋ','Ԍ'=>'ԍ','ԍ'=>'ԍ','Ԏ'=>'ԏ','ԏ'=>'ԏ','Ԑ'=>'ԑ','ԑ'=>'ԑ','Ԓ'=>'ԓ','ԓ'=>'ԓ','Ա'=>'ա','Բ'=>'բ','Գ'=>'գ','Դ'=>'դ','Ե'=>'ե','Զ'=>'զ','Է'=>'է','Ը'=>'ը','Թ'=>'թ','Ժ'=>'ժ','Ի'=>'ի','Լ'=>'լ','Խ'=>'խ','Ծ'=>'ծ','Կ'=>'կ','Հ'=>'հ','Ձ'=>'ձ','Ղ'=>'ղ','Ճ'=>'ճ','Մ'=>'մ','Յ'=>'յ','Ն'=>'ն','Շ'=>'շ','Ո'=>'ո','Չ'=>'չ','Պ'=>'պ','Ջ'=>'ջ','Ռ'=>'ռ','Ս'=>'ս','Վ'=>'վ','Տ'=>'տ','Ր'=>'ր','Ց'=>'ց','Ւ'=>'ւ','Փ'=>'փ','Ք'=>'ք','Օ'=>'օ','Ֆ'=>'ֆ','ՙ'=>'ՙ','ա'=>'ա','բ'=>'բ','գ'=>'գ','դ'=>'դ','ե'=>'ե','զ'=>'զ','է'=>'է','ը'=>'ը','թ'=>'թ','ժ'=>'ժ','ի'=>'ի','լ'=>'լ','խ'=>'խ','ծ'=>'ծ','կ'=>'կ','հ'=>'հ','ձ'=>'ձ','ղ'=>'ղ','ճ'=>'ճ','մ'=>'մ','յ'=>'յ','ն'=>'ն','շ'=>'շ','ո'=>'ո','չ'=>'չ','պ'=>'պ','ջ'=>'ջ','ռ'=>'ռ','ս'=>'ս','վ'=>'վ','տ'=>'տ','ր'=>'ր','ց'=>'ց','ւ'=>'ւ','փ'=>'փ','ք'=>'ք','օ'=>'օ','ֆ'=>'ֆ','և'=>'և','֑'=>'֑','֒'=>'֒','֓'=>'֓','֔'=>'֔','֕'=>'֕','֖'=>'֖','֗'=>'֗','֘'=>'֘','֙'=>'֙','֚'=>'֚','֛'=>'֛','֜'=>'֜','֝'=>'֝','֞'=>'֞','֟'=>'֟','֠'=>'֠','֡'=>'֡','֢'=>'֢','֣'=>'֣','֤'=>'֤','֥'=>'֥','֦'=>'֦','֧'=>'֧','֨'=>'֨','֩'=>'֩','֪'=>'֪','֫'=>'֫','֬'=>'֬','֭'=>'֭','֮'=>'֮','֯'=>'֯','ְ'=>'ְ','ֱ'=>'ֱ','ֲ'=>'ֲ','ֳ'=>'ֳ','ִ'=>'ִ','ֵ'=>'ֵ','ֶ'=>'ֶ','ַ'=>'ַ','ָ'=>'ָ','ֹ'=>'ֹ','ֺ'=>'ֺ','ֻ'=>'ֻ','ּ'=>'ּ','ֽ'=>'ֽ','ֿ'=>'ֿ','ׁ'=>'ׁ','ׂ'=>'ׂ','ׄ'=>'ׄ','ׅ'=>'ׅ','ׇ'=>'ׇ','א'=>'א','ב'=>'ב','ג'=>'ג','ד'=>'ד','ה'=>'ה','ו'=>'ו','ז'=>'ז','ח'=>'ח','ט'=>'ט','י'=>'י','ך'=>'ך','כ'=>'כ','ל'=>'ל','ם'=>'ם','מ'=>'מ','ן'=>'ן','נ'=>'נ','ס'=>'ס','ע'=>'ע','ף'=>'ף','פ'=>'פ','ץ'=>'ץ','צ'=>'צ','ק'=>'ק','ר'=>'ר','ש'=>'ש','ת'=>'ת','װ'=>'װ','ױ'=>'ױ','ײ'=>'ײ','ؐ'=>'ؐ','ؑ'=>'ؑ','ؒ'=>'ؒ','ؓ'=>'ؓ','ؔ'=>'ؔ','ؕ'=>'ؕ','ء'=>'ء','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ا'=>'ا','ب'=>'ب','ة'=>'ة','ت'=>'ت','ث'=>'ث','ج'=>'ج','ح'=>'ح','خ'=>'خ','د'=>'د','ذ'=>'ذ','ر'=>'ر','ز'=>'ز','س'=>'س','ش'=>'ش','ص'=>'ص','ض'=>'ض','ط'=>'ط','ظ'=>'ظ','ع'=>'ع','غ'=>'غ','ـ'=>'ـ','ف'=>'ف','ق'=>'ق','ك'=>'ك','ل'=>'ل','م'=>'م','ن'=>'ن','ه'=>'ه','و'=>'و','ى'=>'ى','ي'=>'ي','ً'=>'ً','ٌ'=>'ٌ','ٍ'=>'ٍ','َ'=>'َ','ُ'=>'ُ','ِ'=>'ِ','ّ'=>'ّ','ْ'=>'ْ','ٓ'=>'ٓ','ٔ'=>'ٔ','ٕ'=>'ٕ','ٖ'=>'ٖ','ٗ'=>'ٗ','٘'=>'٘','ٙ'=>'ٙ','ٚ'=>'ٚ','ٛ'=>'ٛ','ٜ'=>'ٜ','ٝ'=>'ٝ','ٞ'=>'ٞ','٠'=>'0','١'=>'1','٢'=>'2','٣'=>'3','٤'=>'4','٥'=>'5','٦'=>'6','٧'=>'7','٨'=>'8','٩'=>'9','ٮ'=>'ٮ','ٯ'=>'ٯ','ٰ'=>'ٰ','ٱ'=>'ٱ','ٲ'=>'ٲ','ٳ'=>'ٳ','ٴ'=>'ٴ','ٵ'=>'ٵ','ٶ'=>'ٶ','ٷ'=>'ٷ','ٸ'=>'ٸ','ٹ'=>'ٹ','ٺ'=>'ٺ','ٻ'=>'ٻ','ټ'=>'ټ','ٽ'=>'ٽ','پ'=>'پ','ٿ'=>'ٿ','ڀ'=>'ڀ','ځ'=>'ځ','ڂ'=>'ڂ','ڃ'=>'ڃ','ڄ'=>'ڄ','څ'=>'څ','چ'=>'چ','ڇ'=>'ڇ','ڈ'=>'ڈ','ډ'=>'ډ','ڊ'=>'ڊ','ڋ'=>'ڋ','ڌ'=>'ڌ','ڍ'=>'ڍ','ڎ'=>'ڎ','ڏ'=>'ڏ','ڐ'=>'ڐ','ڑ'=>'ڑ','ڒ'=>'ڒ','ړ'=>'ړ','ڔ'=>'ڔ','ڕ'=>'ڕ','ږ'=>'ږ','ڗ'=>'ڗ','ژ'=>'ژ','ڙ'=>'ڙ','ښ'=>'ښ','ڛ'=>'ڛ','ڜ'=>'ڜ','ڝ'=>'ڝ','ڞ'=>'ڞ','ڟ'=>'ڟ','ڠ'=>'ڠ','ڡ'=>'ڡ','ڢ'=>'ڢ','ڣ'=>'ڣ','ڤ'=>'ڤ','ڥ'=>'ڥ','ڦ'=>'ڦ','ڧ'=>'ڧ','ڨ'=>'ڨ','ک'=>'ک','ڪ'=>'ڪ','ګ'=>'ګ','ڬ'=>'ڬ','ڭ'=>'ڭ','ڮ'=>'ڮ','گ'=>'گ','ڰ'=>'ڰ','ڱ'=>'ڱ','ڲ'=>'ڲ','ڳ'=>'ڳ','ڴ'=>'ڴ','ڵ'=>'ڵ','ڶ'=>'ڶ','ڷ'=>'ڷ','ڸ'=>'ڸ','ڹ'=>'ڹ','ں'=>'ں','ڻ'=>'ڻ','ڼ'=>'ڼ','ڽ'=>'ڽ','ھ'=>'ھ','ڿ'=>'ڿ','ۀ'=>'ۀ','ہ'=>'ہ','ۂ'=>'ۂ','ۃ'=>'ۃ','ۄ'=>'ۄ','ۅ'=>'ۅ','ۆ'=>'ۆ','ۇ'=>'ۇ','ۈ'=>'ۈ','ۉ'=>'ۉ','ۊ'=>'ۊ','ۋ'=>'ۋ','ی'=>'ی','ۍ'=>'ۍ','ێ'=>'ێ','ۏ'=>'ۏ','ې'=>'ې','ۑ'=>'ۑ','ے'=>'ے','ۓ'=>'ۓ','ە'=>'ە','ۖ'=>'ۖ','ۗ'=>'ۗ','ۘ'=>'ۘ','ۙ'=>'ۙ','ۚ'=>'ۚ','ۛ'=>'ۛ','ۜ'=>'ۜ','۞'=>'۞','۟'=>'۟','۠'=>'۠','ۡ'=>'ۡ','ۢ'=>'ۢ','ۣ'=>'ۣ','ۤ'=>'ۤ','ۥ'=>'ۥ','ۦ'=>'ۦ','ۧ'=>'ۧ','ۨ'=>'ۨ','۪'=>'۪','۫'=>'۫','۬'=>'۬','ۭ'=>'ۭ','ۮ'=>'ۮ','ۯ'=>'ۯ','۰'=>'0','۱'=>'1','۲'=>'2','۳'=>'3','۴'=>'4','۵'=>'5','۶'=>'6','۷'=>'7','۸'=>'8','۹'=>'9','ۺ'=>'ۺ','ۻ'=>'ۻ','ۼ'=>'ۼ','ۿ'=>'ۿ','ܐ'=>'ܐ','ܑ'=>'ܑ','ܒ'=>'ܒ','ܓ'=>'ܓ','ܔ'=>'ܔ','ܕ'=>'ܕ','ܖ'=>'ܖ','ܗ'=>'ܗ','ܘ'=>'ܘ','ܙ'=>'ܙ','ܚ'=>'ܚ','ܛ'=>'ܛ','ܜ'=>'ܜ','ܝ'=>'ܝ','ܞ'=>'ܞ','ܟ'=>'ܟ','ܠ'=>'ܠ','ܡ'=>'ܡ','ܢ'=>'ܢ','ܣ'=>'ܣ','ܤ'=>'ܤ','ܥ'=>'ܥ','ܦ'=>'ܦ','ܧ'=>'ܧ','ܨ'=>'ܨ','ܩ'=>'ܩ','ܪ'=>'ܪ','ܫ'=>'ܫ','ܬ'=>'ܬ','ܭ'=>'ܭ','ܮ'=>'ܮ','ܯ'=>'ܯ','ܰ'=>'ܰ','ܱ'=>'ܱ','ܲ'=>'ܲ','ܳ'=>'ܳ','ܴ'=>'ܴ','ܵ'=>'ܵ','ܶ'=>'ܶ','ܷ'=>'ܷ','ܸ'=>'ܸ','ܹ'=>'ܹ','ܺ'=>'ܺ','ܻ'=>'ܻ','ܼ'=>'ܼ','ܽ'=>'ܽ','ܾ'=>'ܾ','ܿ'=>'ܿ','݀'=>'݀','݁'=>'݁','݂'=>'݂','݃'=>'݃','݄'=>'݄','݅'=>'݅','݆'=>'݆','݇'=>'݇','݈'=>'݈','݉'=>'݉','݊'=>'݊','ݍ'=>'ݍ','ݎ'=>'ݎ','ݏ'=>'ݏ','ݐ'=>'ݐ','ݑ'=>'ݑ','ݒ'=>'ݒ','ݓ'=>'ݓ','ݔ'=>'ݔ','ݕ'=>'ݕ','ݖ'=>'ݖ','ݗ'=>'ݗ','ݘ'=>'ݘ','ݙ'=>'ݙ','ݚ'=>'ݚ','ݛ'=>'ݛ','ݜ'=>'ݜ','ݝ'=>'ݝ','ݞ'=>'ݞ','ݟ'=>'ݟ','ݠ'=>'ݠ','ݡ'=>'ݡ','ݢ'=>'ݢ','ݣ'=>'ݣ','ݤ'=>'ݤ','ݥ'=>'ݥ','ݦ'=>'ݦ','ݧ'=>'ݧ','ݨ'=>'ݨ','ݩ'=>'ݩ','ݪ'=>'ݪ','ݫ'=>'ݫ','ݬ'=>'ݬ','ݭ'=>'ݭ','ހ'=>'ހ','ށ'=>'ށ','ނ'=>'ނ','ރ'=>'ރ','ބ'=>'ބ','ޅ'=>'ޅ','ކ'=>'ކ','އ'=>'އ','ވ'=>'ވ','މ'=>'މ','ފ'=>'ފ','ދ'=>'ދ','ތ'=>'ތ','ލ'=>'ލ','ގ'=>'ގ','ޏ'=>'ޏ','ސ'=>'ސ','ޑ'=>'ޑ','ޒ'=>'ޒ','ޓ'=>'ޓ','ޔ'=>'ޔ','ޕ'=>'ޕ','ޖ'=>'ޖ','ޗ'=>'ޗ','ޘ'=>'ޘ','ޙ'=>'ޙ','ޚ'=>'ޚ','ޛ'=>'ޛ','ޜ'=>'ޜ','ޝ'=>'ޝ','ޞ'=>'ޞ','ޟ'=>'ޟ','ޠ'=>'ޠ','ޡ'=>'ޡ','ޢ'=>'ޢ','ޣ'=>'ޣ','ޤ'=>'ޤ','ޥ'=>'ޥ','ަ'=>'ަ','ާ'=>'ާ','ި'=>'ި','ީ'=>'ީ','ު'=>'ު','ޫ'=>'ޫ','ެ'=>'ެ','ޭ'=>'ޭ','ޮ'=>'ޮ','ޯ'=>'ޯ','ް'=>'ް','ޱ'=>'ޱ','߀'=>'0','߁'=>'1','߂'=>'2','߃'=>'3','߄'=>'4','߅'=>'5','߆'=>'6','߇'=>'7','߈'=>'8','߉'=>'9','ߊ'=>'ߊ','ߋ'=>'ߋ','ߌ'=>'ߌ','ߍ'=>'ߍ','ߎ'=>'ߎ','ߏ'=>'ߏ','ߐ'=>'ߐ','ߑ'=>'ߑ','ߒ'=>'ߒ','ߓ'=>'ߓ','ߔ'=>'ߔ','ߕ'=>'ߕ','ߖ'=>'ߖ','ߗ'=>'ߗ','ߘ'=>'ߘ','ߙ'=>'ߙ','ߚ'=>'ߚ','ߛ'=>'ߛ','ߜ'=>'ߜ','ߝ'=>'ߝ','ߞ'=>'ߞ','ߟ'=>'ߟ','ߠ'=>'ߠ','ߡ'=>'ߡ','ߢ'=>'ߢ','ߣ'=>'ߣ','ߤ'=>'ߤ','ߥ'=>'ߥ','ߦ'=>'ߦ','ߧ'=>'ߧ','ߨ'=>'ߨ','ߩ'=>'ߩ','ߪ'=>'ߪ','߫'=>'߫','߬'=>'߬','߭'=>'߭','߮'=>'߮','߯'=>'߯','߰'=>'߰','߱'=>'߱','߲'=>'߲','߳'=>'߳','ߴ'=>'ߴ','ߵ'=>'ߵ','ߺ'=>'ߺ');
diff --git a/phpBB/includes/utf/data/search_indexer_1.php b/phpBB/includes/utf/data/search_indexer_1.php
index 6173117ffc..4dd142bb43 100644
--- a/phpBB/includes/utf/data/search_indexer_1.php
+++ b/phpBB/includes/utf/data/search_indexer_1.php
@@ -1 +1 @@
-<?php return array('ँ'=>'ँ','ं'=>'ं','ः'=>'ः','ऄ'=>'ऄ','अ'=>'अ','आ'=>'आ','इ'=>'इ','ई'=>'ई','उ'=>'उ','ऊ'=>'ऊ','ऋ'=>'ऋ','ऌ'=>'ऌ','ऍ'=>'ऍ','ऎ'=>'ऎ','ए'=>'ए','ऐ'=>'ऐ','ऑ'=>'ऑ','ऒ'=>'ऒ','ओ'=>'ओ','औ'=>'औ','क'=>'क','ख'=>'ख','ग'=>'ग','घ'=>'घ','ङ'=>'ङ','च'=>'च','छ'=>'छ','ज'=>'ज','झ'=>'झ','ञ'=>'ञ','ट'=>'ट','ठ'=>'ठ','ड'=>'ड','ढ'=>'ढ','ण'=>'ण','त'=>'त','थ'=>'थ','द'=>'द','ध'=>'ध','न'=>'न','ऩ'=>'ऩ','प'=>'प','फ'=>'फ','ब'=>'ब','भ'=>'भ','म'=>'म','य'=>'य','र'=>'र','ऱ'=>'ऱ','ल'=>'ल','ळ'=>'ळ','ऴ'=>'ऴ','व'=>'व','श'=>'श','ष'=>'ष','स'=>'स','ह'=>'ह','़'=>'़','ऽ'=>'ऽ','ा'=>'ा','ि'=>'ि','ी'=>'ी','ु'=>'ु','ू'=>'ू','ृ'=>'ृ','ॄ'=>'ॄ','ॅ'=>'ॅ','ॆ'=>'ॆ','े'=>'े','ै'=>'ै','ॉ'=>'ॉ','ॊ'=>'ॊ','ो'=>'ो','ौ'=>'ौ','्'=>'्','ॐ'=>'ॐ','॑'=>'॑','॒'=>'॒','॓'=>'॓','॔'=>'॔','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ॠ'=>'ॠ','ॡ'=>'ॡ','ॢ'=>'ॢ','ॣ'=>'ॣ','०'=>'0','१'=>'1','२'=>'2','३'=>'3','४'=>'4','५'=>'5','६'=>'6','७'=>'7','८'=>'8','९'=>'9','ॻ'=>'ॻ','ॼ'=>'ॼ','ॽ'=>'ॽ','ॾ'=>'ॾ','ॿ'=>'ॿ','ঁ'=>'ঁ','ং'=>'ং','ঃ'=>'ঃ','অ'=>'অ','আ'=>'আ','ই'=>'ই','ঈ'=>'ঈ','উ'=>'উ','ঊ'=>'ঊ','ঋ'=>'ঋ','ঌ'=>'ঌ','এ'=>'এ','ঐ'=>'ঐ','ও'=>'ও','ঔ'=>'ঔ','ক'=>'ক','খ'=>'খ','গ'=>'গ','ঘ'=>'ঘ','ঙ'=>'ঙ','চ'=>'চ','ছ'=>'ছ','জ'=>'জ','ঝ'=>'ঝ','ঞ'=>'ঞ','ট'=>'ট','ঠ'=>'ঠ','ড'=>'ড','ঢ'=>'ঢ','ণ'=>'ণ','ত'=>'ত','থ'=>'থ','দ'=>'দ','ধ'=>'ধ','ন'=>'ন','প'=>'প','ফ'=>'ফ','ব'=>'ব','ভ'=>'ভ','ম'=>'ম','য'=>'য','র'=>'র','ল'=>'ল','শ'=>'শ','ষ'=>'ষ','স'=>'স','হ'=>'হ','়'=>'়','ঽ'=>'ঽ','া'=>'া','ি'=>'ি','ী'=>'ী','ু'=>'ু','ূ'=>'ূ','ৃ'=>'ৃ','ৄ'=>'ৄ','ে'=>'ে','ৈ'=>'ৈ','ো'=>'ো','ৌ'=>'ৌ','্'=>'্','ৎ'=>'ৎ','ৗ'=>'ৗ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ৠ'=>'ৠ','ৡ'=>'ৡ','ৢ'=>'ৢ','ৣ'=>'ৣ','০'=>'0','১'=>'1','২'=>'2','৩'=>'3','৪'=>'4','৫'=>'5','৬'=>'6','৭'=>'7','৮'=>'8','৯'=>'9','ৰ'=>'ৰ','ৱ'=>'ৱ','৴'=>'1','৵'=>'2','৶'=>'3','৷'=>'4','৸'=>'৸','৹'=>'16','ਁ'=>'ਁ','ਂ'=>'ਂ','ਃ'=>'ਃ','ਅ'=>'ਅ','ਆ'=>'ਆ','ਇ'=>'ਇ','ਈ'=>'ਈ','ਉ'=>'ਉ','ਊ'=>'ਊ','ਏ'=>'ਏ','ਐ'=>'ਐ','ਓ'=>'ਓ','ਔ'=>'ਔ','ਕ'=>'ਕ','ਖ'=>'ਖ','ਗ'=>'ਗ','ਘ'=>'ਘ','ਙ'=>'ਙ','ਚ'=>'ਚ','ਛ'=>'ਛ','ਜ'=>'ਜ','ਝ'=>'ਝ','ਞ'=>'ਞ','ਟ'=>'ਟ','ਠ'=>'ਠ','ਡ'=>'ਡ','ਢ'=>'ਢ','ਣ'=>'ਣ','ਤ'=>'ਤ','ਥ'=>'ਥ','ਦ'=>'ਦ','ਧ'=>'ਧ','ਨ'=>'ਨ','ਪ'=>'ਪ','ਫ'=>'ਫ','ਬ'=>'ਬ','ਭ'=>'ਭ','ਮ'=>'ਮ','ਯ'=>'ਯ','ਰ'=>'ਰ','ਲ'=>'ਲ','ਲ਼'=>'ਲ਼','ਵ'=>'ਵ','ਸ਼'=>'ਸ਼','ਸ'=>'ਸ','ਹ'=>'ਹ','਼'=>'਼','ਾ'=>'ਾ','ਿ'=>'ਿ','ੀ'=>'ੀ','ੁ'=>'ੁ','ੂ'=>'ੂ','ੇ'=>'ੇ','ੈ'=>'ੈ','ੋ'=>'ੋ','ੌ'=>'ੌ','੍'=>'੍','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ੜ'=>'ੜ','ਫ਼'=>'ਫ਼','੦'=>'0','੧'=>'1','੨'=>'2','੩'=>'3','੪'=>'4','੫'=>'5','੬'=>'6','੭'=>'7','੮'=>'8','੯'=>'9','ੰ'=>'ੰ','ੱ'=>'ੱ','ੲ'=>'ੲ','ੳ'=>'ੳ','ੴ'=>'ੴ','ઁ'=>'ઁ','ં'=>'ં','ઃ'=>'ઃ','અ'=>'અ','આ'=>'આ','ઇ'=>'ઇ','ઈ'=>'ઈ','ઉ'=>'ઉ','ઊ'=>'ઊ','ઋ'=>'ઋ','ઌ'=>'ઌ','ઍ'=>'ઍ','એ'=>'એ','ઐ'=>'ઐ','ઑ'=>'ઑ','ઓ'=>'ઓ','ઔ'=>'ઔ','ક'=>'ક','ખ'=>'ખ','ગ'=>'ગ','ઘ'=>'ઘ','ઙ'=>'ઙ','ચ'=>'ચ','છ'=>'છ','જ'=>'જ','ઝ'=>'ઝ','ઞ'=>'ઞ','ટ'=>'ટ','ઠ'=>'ઠ','ડ'=>'ડ','ઢ'=>'ઢ','ણ'=>'ણ','ત'=>'ત','થ'=>'થ','દ'=>'દ','ધ'=>'ધ','ન'=>'ન','પ'=>'પ','ફ'=>'ફ','બ'=>'બ','ભ'=>'ભ','મ'=>'મ','ય'=>'ય','ર'=>'ર','લ'=>'લ','ળ'=>'ળ','વ'=>'વ','શ'=>'શ','ષ'=>'ષ','સ'=>'સ','હ'=>'હ','઼'=>'઼','ઽ'=>'ઽ','ા'=>'ા','િ'=>'િ','ી'=>'ી','ુ'=>'ુ','ૂ'=>'ૂ','ૃ'=>'ૃ','ૄ'=>'ૄ','ૅ'=>'ૅ','ે'=>'ે','ૈ'=>'ૈ','ૉ'=>'ૉ','ો'=>'ો','ૌ'=>'ૌ','્'=>'્','ૐ'=>'ૐ','ૠ'=>'ૠ','ૡ'=>'ૡ','ૢ'=>'ૢ','ૣ'=>'ૣ','૦'=>'0','૧'=>'1','૨'=>'2','૩'=>'3','૪'=>'4','૫'=>'5','૬'=>'6','૭'=>'7','૮'=>'8','૯'=>'9','ଁ'=>'ଁ','ଂ'=>'ଂ','ଃ'=>'ଃ','ଅ'=>'ଅ','ଆ'=>'ଆ','ଇ'=>'ଇ','ଈ'=>'ଈ','ଉ'=>'ଉ','ଊ'=>'ଊ','ଋ'=>'ଋ','ଌ'=>'ଌ','ଏ'=>'ଏ','ଐ'=>'ଐ','ଓ'=>'ଓ','ଔ'=>'ଔ','କ'=>'କ','ଖ'=>'ଖ','ଗ'=>'ଗ','ଘ'=>'ଘ','ଙ'=>'ଙ','ଚ'=>'ଚ','ଛ'=>'ଛ','ଜ'=>'ଜ','ଝ'=>'ଝ','ଞ'=>'ଞ','ଟ'=>'ଟ','ଠ'=>'ଠ','ଡ'=>'ଡ','ଢ'=>'ଢ','ଣ'=>'ଣ','ତ'=>'ତ','ଥ'=>'ଥ','ଦ'=>'ଦ','ଧ'=>'ଧ','ନ'=>'ନ','ପ'=>'ପ','ଫ'=>'ଫ','ବ'=>'ବ','ଭ'=>'ଭ','ମ'=>'ମ','ଯ'=>'ଯ','ର'=>'ର','ଲ'=>'ଲ','ଳ'=>'ଳ','ଵ'=>'ଵ','ଶ'=>'ଶ','ଷ'=>'ଷ','ସ'=>'ସ','ହ'=>'ହ','଼'=>'଼','ଽ'=>'ଽ','ା'=>'ା','ି'=>'ି','ୀ'=>'ୀ','ୁ'=>'ୁ','ୂ'=>'ୂ','ୃ'=>'ୃ','େ'=>'େ','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','୍'=>'୍','ୖ'=>'ୖ','ୗ'=>'ୗ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ୟ'=>'ୟ','ୠ'=>'ୠ','ୡ'=>'ୡ','୦'=>'0','୧'=>'1','୨'=>'2','୩'=>'3','୪'=>'4','୫'=>'5','୬'=>'6','୭'=>'7','୮'=>'8','୯'=>'9','ୱ'=>'ୱ','ஂ'=>'ஂ','ஃ'=>'ஃ','அ'=>'அ','ஆ'=>'ஆ','இ'=>'இ','ஈ'=>'ஈ','உ'=>'உ','ஊ'=>'ஊ','எ'=>'எ','ஏ'=>'ஏ','ஐ'=>'ஐ','ஒ'=>'ஒ','ஓ'=>'ஓ','ஔ'=>'ஔ','க'=>'க','ங'=>'ங','ச'=>'ச','ஜ'=>'ஜ','ஞ'=>'ஞ','ட'=>'ட','ண'=>'ண','த'=>'த','ந'=>'ந','ன'=>'ன','ப'=>'ப','ம'=>'ம','ய'=>'ய','ர'=>'ர','ற'=>'ற','ல'=>'ல','ள'=>'ள','ழ'=>'ழ','வ'=>'வ','ஶ'=>'ஶ','ஷ'=>'ஷ','ஸ'=>'ஸ','ஹ'=>'ஹ','ா'=>'ா','ி'=>'ி','ீ'=>'ீ','ு'=>'ு','ூ'=>'ூ','ெ'=>'ெ','ே'=>'ே','ை'=>'ை','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','்'=>'்','ௗ'=>'ௗ','௦'=>'0','௧'=>'1','௨'=>'2','௩'=>'3','௪'=>'4','௫'=>'5','௬'=>'6','௭'=>'7','௮'=>'8','௯'=>'9','௰'=>'10','௱'=>'100','௲'=>'1000','ఁ'=>'ఁ','ం'=>'ం','ః'=>'ః','అ'=>'అ','ఆ'=>'ఆ','ఇ'=>'ఇ','ఈ'=>'ఈ','ఉ'=>'ఉ','ఊ'=>'ఊ','ఋ'=>'ఋ','ఌ'=>'ఌ','ఎ'=>'ఎ','ఏ'=>'ఏ','ఐ'=>'ఐ','ఒ'=>'ఒ','ఓ'=>'ఓ','ఔ'=>'ఔ','క'=>'క','ఖ'=>'ఖ','గ'=>'గ','ఘ'=>'ఘ','ఙ'=>'ఙ','చ'=>'చ','ఛ'=>'ఛ','జ'=>'జ','ఝ'=>'ఝ','ఞ'=>'ఞ','ట'=>'ట','ఠ'=>'ఠ','డ'=>'డ','ఢ'=>'ఢ','ణ'=>'ణ','త'=>'త','థ'=>'థ','ద'=>'ద','ధ'=>'ధ','న'=>'న','ప'=>'ప','ఫ'=>'ఫ','బ'=>'బ','భ'=>'భ','మ'=>'మ','య'=>'య','ర'=>'ర','ఱ'=>'ఱ','ల'=>'ల','ళ'=>'ళ','వ'=>'వ','శ'=>'శ','ష'=>'ష','స'=>'స','హ'=>'హ','ా'=>'ా','ి'=>'ి','ీ'=>'ీ','ు'=>'ు','ూ'=>'ూ','ృ'=>'ృ','ౄ'=>'ౄ','ె'=>'ె','ే'=>'ే','ై'=>'ై','ొ'=>'ొ','ో'=>'ో','ౌ'=>'ౌ','్'=>'్','ౕ'=>'ౕ','ౖ'=>'ౖ','ౠ'=>'ౠ','ౡ'=>'ౡ','౦'=>'0','౧'=>'1','౨'=>'2','౩'=>'3','౪'=>'4','౫'=>'5','౬'=>'6','౭'=>'7','౮'=>'8','౯'=>'9','ಂ'=>'ಂ','ಃ'=>'ಃ','ಅ'=>'ಅ','ಆ'=>'ಆ','ಇ'=>'ಇ','ಈ'=>'ಈ','ಉ'=>'ಉ','ಊ'=>'ಊ','ಋ'=>'ಋ','ಌ'=>'ಌ','ಎ'=>'ಎ','ಏ'=>'ಏ','ಐ'=>'ಐ','ಒ'=>'ಒ','ಓ'=>'ಓ','ಔ'=>'ಔ','ಕ'=>'ಕ','ಖ'=>'ಖ','ಗ'=>'ಗ','ಘ'=>'ಘ','ಙ'=>'ಙ','ಚ'=>'ಚ','ಛ'=>'ಛ','ಜ'=>'ಜ','ಝ'=>'ಝ','ಞ'=>'ಞ','ಟ'=>'ಟ','ಠ'=>'ಠ','ಡ'=>'ಡ','ಢ'=>'ಢ','ಣ'=>'ಣ','ತ'=>'ತ','ಥ'=>'ಥ','ದ'=>'ದ','ಧ'=>'ಧ','ನ'=>'ನ','ಪ'=>'ಪ','ಫ'=>'ಫ','ಬ'=>'ಬ','ಭ'=>'ಭ','ಮ'=>'ಮ','ಯ'=>'ಯ','ರ'=>'ರ','ಱ'=>'ಱ','ಲ'=>'ಲ','ಳ'=>'ಳ','ವ'=>'ವ','ಶ'=>'ಶ','ಷ'=>'ಷ','ಸ'=>'ಸ','ಹ'=>'ಹ','಼'=>'಼','ಽ'=>'ಽ','ಾ'=>'ಾ','ಿ'=>'ಿ','ೀ'=>'ೀ','ು'=>'ು','ೂ'=>'ೂ','ೃ'=>'ೃ','ೄ'=>'ೄ','ೆ'=>'ೆ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ೌ'=>'ೌ','್'=>'್','ೕ'=>'ೕ','ೖ'=>'ೖ','ೞ'=>'ೞ','ೠ'=>'ೠ','ೡ'=>'ೡ','ೢ'=>'ೢ','ೣ'=>'ೣ','೦'=>'0','೧'=>'1','೨'=>'2','೩'=>'3','೪'=>'4','೫'=>'5','೬'=>'6','೭'=>'7','೮'=>'8','೯'=>'9','ം'=>'ം','ഃ'=>'ഃ','അ'=>'അ','ആ'=>'ആ','ഇ'=>'ഇ','ഈ'=>'ഈ','ഉ'=>'ഉ','ഊ'=>'ഊ','ഋ'=>'ഋ','ഌ'=>'ഌ','എ'=>'എ','ഏ'=>'ഏ','ഐ'=>'ഐ','ഒ'=>'ഒ','ഓ'=>'ഓ','ഔ'=>'ഔ','ക'=>'ക','ഖ'=>'ഖ','ഗ'=>'ഗ','ഘ'=>'ഘ','ങ'=>'ങ','ച'=>'ച','ഛ'=>'ഛ','ജ'=>'ജ','ഝ'=>'ഝ','ഞ'=>'ഞ','ട'=>'ട','ഠ'=>'ഠ','ഡ'=>'ഡ','ഢ'=>'ഢ','ണ'=>'ണ','ത'=>'ത','ഥ'=>'ഥ','ദ'=>'ദ','ധ'=>'ധ','ന'=>'ന','പ'=>'പ','ഫ'=>'ഫ','ബ'=>'ബ','ഭ'=>'ഭ','മ'=>'മ','യ'=>'യ','ര'=>'ര','റ'=>'റ','ല'=>'ല','ള'=>'ള','ഴ'=>'ഴ','വ'=>'വ','ശ'=>'ശ','ഷ'=>'ഷ','സ'=>'സ','ഹ'=>'ഹ','ാ'=>'ാ','ി'=>'ി','ീ'=>'ീ','ു'=>'ു','ൂ'=>'ൂ','ൃ'=>'ൃ','െ'=>'െ','േ'=>'േ','ൈ'=>'ൈ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','്'=>'്','ൗ'=>'ൗ','ൠ'=>'ൠ','ൡ'=>'ൡ','൦'=>'0','൧'=>'1','൨'=>'2','൩'=>'3','൪'=>'4','൫'=>'5','൬'=>'6','൭'=>'7','൮'=>'8','൯'=>'9','ං'=>'ං','ඃ'=>'ඃ','අ'=>'අ','ආ'=>'ආ','ඇ'=>'ඇ','ඈ'=>'ඈ','ඉ'=>'ඉ','ඊ'=>'ඊ','උ'=>'උ','ඌ'=>'ඌ','ඍ'=>'ඍ','ඎ'=>'ඎ','ඏ'=>'ඏ','ඐ'=>'ඐ','එ'=>'එ','ඒ'=>'ඒ','ඓ'=>'ඓ','ඔ'=>'ඔ','ඕ'=>'ඕ','ඖ'=>'ඖ','ක'=>'ක','ඛ'=>'ඛ','ග'=>'ග','ඝ'=>'ඝ','ඞ'=>'ඞ','ඟ'=>'ඟ','ච'=>'ච','ඡ'=>'ඡ','ජ'=>'ජ','ඣ'=>'ඣ','ඤ'=>'ඤ','ඥ'=>'ඥ','ඦ'=>'ඦ','ට'=>'ට','ඨ'=>'ඨ','ඩ'=>'ඩ','ඪ'=>'ඪ','ණ'=>'ණ','ඬ'=>'ඬ','ත'=>'ත','ථ'=>'ථ','ද'=>'ද','ධ'=>'ධ','න'=>'න','ඳ'=>'ඳ','ප'=>'ප','ඵ'=>'ඵ','බ'=>'බ','භ'=>'භ','ම'=>'ම','ඹ'=>'ඹ','ය'=>'ය','ර'=>'ර','ල'=>'ල','ව'=>'ව','ශ'=>'ශ','ෂ'=>'ෂ','ස'=>'ස','හ'=>'හ','ළ'=>'ළ','ෆ'=>'ෆ','්'=>'්','ා'=>'ා','ැ'=>'ැ','ෑ'=>'ෑ','ි'=>'ි','ී'=>'ී','ු'=>'ු','ූ'=>'ූ','ෘ'=>'ෘ','ෙ'=>'ෙ','ේ'=>'ේ','ෛ'=>'ෛ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ෟ'=>'ෟ','ෲ'=>'ෲ','ෳ'=>'ෳ','ก'=>'ก','ข'=>'ข','ฃ'=>'ฃ','ค'=>'ค','ฅ'=>'ฅ','ฆ'=>'ฆ','ง'=>'ง','จ'=>'จ','ฉ'=>'ฉ','ช'=>'ช','ซ'=>'ซ','ฌ'=>'ฌ','ญ'=>'ญ','ฎ'=>'ฎ','ฏ'=>'ฏ','ฐ'=>'ฐ','ฑ'=>'ฑ','ฒ'=>'ฒ','ณ'=>'ณ','ด'=>'ด','ต'=>'ต','ถ'=>'ถ','ท'=>'ท','ธ'=>'ธ','น'=>'น','บ'=>'บ','ป'=>'ป','ผ'=>'ผ','ฝ'=>'ฝ','พ'=>'พ','ฟ'=>'ฟ','ภ'=>'ภ','ม'=>'ม','ย'=>'ย','ร'=>'ร','ฤ'=>'ฤ','ล'=>'ล','ฦ'=>'ฦ','ว'=>'ว','ศ'=>'ศ','ษ'=>'ษ','ส'=>'ส','ห'=>'ห','ฬ'=>'ฬ','อ'=>'อ','ฮ'=>'ฮ','ฯ'=>'ฯ','ะ'=>'ะ','ั'=>'ั','า'=>'า','ำ'=>'ำ','ิ'=>'ิ','ี'=>'ี','ึ'=>'ึ','ื'=>'ื','ุ'=>'ุ','ู'=>'ู','ฺ'=>'ฺ','เ'=>'เ','แ'=>'แ','โ'=>'โ','ใ'=>'ใ','ไ'=>'ไ','ๅ'=>'ๅ','ๆ'=>'ๆ','็'=>'็','่'=>'่','้'=>'้','๊'=>'๊','๋'=>'๋','์'=>'์','ํ'=>'ํ','๎'=>'๎','๐'=>'0','๑'=>'1','๒'=>'2','๓'=>'3','๔'=>'4','๕'=>'5','๖'=>'6','๗'=>'7','๘'=>'8','๙'=>'9','ກ'=>'ກ','ຂ'=>'ຂ','ຄ'=>'ຄ','ງ'=>'ງ','ຈ'=>'ຈ','ຊ'=>'ຊ','ຍ'=>'ຍ','ດ'=>'ດ','ຕ'=>'ຕ','ຖ'=>'ຖ','ທ'=>'ທ','ນ'=>'ນ','ບ'=>'ບ','ປ'=>'ປ','ຜ'=>'ຜ','ຝ'=>'ຝ','ພ'=>'ພ','ຟ'=>'ຟ','ມ'=>'ມ','ຢ'=>'ຢ','ຣ'=>'ຣ','ລ'=>'ລ','ວ'=>'ວ','ສ'=>'ສ','ຫ'=>'ຫ','ອ'=>'ອ','ຮ'=>'ຮ','ຯ'=>'ຯ','ະ'=>'ະ','ັ'=>'ັ','າ'=>'າ','ຳ'=>'ຳ','ິ'=>'ິ','ີ'=>'ີ','ຶ'=>'ຶ','ື'=>'ື','ຸ'=>'ຸ','ູ'=>'ູ','ົ'=>'ົ','ຼ'=>'ຼ','ຽ'=>'ຽ','ເ'=>'ເ','ແ'=>'ແ','ໂ'=>'ໂ','ໃ'=>'ໃ','ໄ'=>'ໄ','ໆ'=>'ໆ','່'=>'່','້'=>'້','໊'=>'໊','໋'=>'໋','໌'=>'໌','ໍ'=>'ໍ','໐'=>'0','໑'=>'1','໒'=>'2','໓'=>'3','໔'=>'4','໕'=>'5','໖'=>'6','໗'=>'7','໘'=>'8','໙'=>'9','ໜ'=>'ໜ','ໝ'=>'ໝ','ༀ'=>'ༀ','༘'=>'༘','༙'=>'༙','༠'=>'0','༡'=>'1','༢'=>'2','༣'=>'3','༤'=>'4','༥'=>'5','༦'=>'6','༧'=>'7','༨'=>'8','༩'=>'9','༪'=>'1/2','༫'=>'3/2','༬'=>'5/2','༭'=>'7/2','༮'=>'9/2','༯'=>'11/2','༰'=>'13/2','༱'=>'15/2','༲'=>'17/2','༳'=>'-1/2','༵'=>'༵','༷'=>'༷','༹'=>'༹','༾'=>'༾','༿'=>'༿','ཀ'=>'ཀ','ཁ'=>'ཁ','ག'=>'ག','གྷ'=>'གྷ','ང'=>'ང','ཅ'=>'ཅ','ཆ'=>'ཆ','ཇ'=>'ཇ','ཉ'=>'ཉ','ཊ'=>'ཊ','ཋ'=>'ཋ','ཌ'=>'ཌ','ཌྷ'=>'ཌྷ','ཎ'=>'ཎ','ཏ'=>'ཏ','ཐ'=>'ཐ','ད'=>'ད','དྷ'=>'དྷ','ན'=>'ན','པ'=>'པ','ཕ'=>'ཕ','བ'=>'བ','བྷ'=>'བྷ','མ'=>'མ','ཙ'=>'ཙ','ཚ'=>'ཚ','ཛ'=>'ཛ','ཛྷ'=>'ཛྷ','ཝ'=>'ཝ','ཞ'=>'ཞ','ཟ'=>'ཟ','འ'=>'འ','ཡ'=>'ཡ','ར'=>'ར','ལ'=>'ལ','ཤ'=>'ཤ','ཥ'=>'ཥ','ས'=>'ས','ཧ'=>'ཧ','ཨ'=>'ཨ','ཀྵ'=>'ཀྵ','ཪ'=>'ཪ','ཱ'=>'ཱ','ི'=>'ི','ཱི'=>'ཱི','ུ'=>'ུ','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ཷ'=>'ཷ','ླྀ'=>'ླྀ','ཹ'=>'ཹ','ེ'=>'ེ','ཻ'=>'ཻ','ོ'=>'ོ','ཽ'=>'ཽ','ཾ'=>'ཾ','ཿ'=>'ཿ','ྀ'=>'ྀ','ཱྀ'=>'ཱྀ','ྂ'=>'ྂ','ྃ'=>'ྃ','྄'=>'྄','྆'=>'྆','྇'=>'྇','ྈ'=>'ྈ','ྉ'=>'ྉ','ྊ'=>'ྊ','ྋ'=>'ྋ','ྐ'=>'ྐ','ྑ'=>'ྑ','ྒ'=>'ྒ','ྒྷ'=>'ྒྷ','ྔ'=>'ྔ','ྕ'=>'ྕ','ྖ'=>'ྖ','ྗ'=>'ྗ','ྙ'=>'ྙ','ྚ'=>'ྚ','ྛ'=>'ྛ','ྜ'=>'ྜ','ྜྷ'=>'ྜྷ','ྞ'=>'ྞ','ྟ'=>'ྟ','ྠ'=>'ྠ','ྡ'=>'ྡ','ྡྷ'=>'ྡྷ','ྣ'=>'ྣ','ྤ'=>'ྤ','ྥ'=>'ྥ','ྦ'=>'ྦ','ྦྷ'=>'ྦྷ','ྨ'=>'ྨ','ྩ'=>'ྩ','ྪ'=>'ྪ','ྫ'=>'ྫ','ྫྷ'=>'ྫྷ','ྭ'=>'ྭ','ྮ'=>'ྮ','ྯ'=>'ྯ','ྰ'=>'ྰ','ྱ'=>'ྱ','ྲ'=>'ྲ','ླ'=>'ླ','ྴ'=>'ྴ','ྵ'=>'ྵ','ྶ'=>'ྶ','ྷ'=>'ྷ','ྸ'=>'ྸ','ྐྵ'=>'ྐྵ','ྺ'=>'ྺ','ྻ'=>'ྻ','ྼ'=>'ྼ','࿆'=>'࿆'); \ No newline at end of file
+<?php return array('ँ'=>'ँ','ं'=>'ं','ः'=>'ः','ऄ'=>'ऄ','अ'=>'अ','आ'=>'आ','इ'=>'इ','ई'=>'ई','उ'=>'उ','ऊ'=>'ऊ','ऋ'=>'ऋ','ऌ'=>'ऌ','ऍ'=>'ऍ','ऎ'=>'ऎ','ए'=>'ए','ऐ'=>'ऐ','ऑ'=>'ऑ','ऒ'=>'ऒ','ओ'=>'ओ','औ'=>'औ','क'=>'क','ख'=>'ख','ग'=>'ग','घ'=>'घ','ङ'=>'ङ','च'=>'च','छ'=>'छ','ज'=>'ज','झ'=>'झ','ञ'=>'ञ','ट'=>'ट','ठ'=>'ठ','ड'=>'ड','ढ'=>'ढ','ण'=>'ण','त'=>'त','थ'=>'थ','द'=>'द','ध'=>'ध','न'=>'न','ऩ'=>'ऩ','प'=>'प','फ'=>'फ','ब'=>'ब','भ'=>'भ','म'=>'म','य'=>'य','र'=>'र','ऱ'=>'ऱ','ल'=>'ल','ळ'=>'ळ','ऴ'=>'ऴ','व'=>'व','श'=>'श','ष'=>'ष','स'=>'स','ह'=>'ह','़'=>'़','ऽ'=>'ऽ','ा'=>'ा','ि'=>'ि','ी'=>'ी','ु'=>'ु','ू'=>'ू','ृ'=>'ृ','ॄ'=>'ॄ','ॅ'=>'ॅ','ॆ'=>'ॆ','े'=>'े','ै'=>'ै','ॉ'=>'ॉ','ॊ'=>'ॊ','ो'=>'ो','ौ'=>'ौ','्'=>'्','ॐ'=>'ॐ','॑'=>'॑','॒'=>'॒','॓'=>'॓','॔'=>'॔','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ॠ'=>'ॠ','ॡ'=>'ॡ','ॢ'=>'ॢ','ॣ'=>'ॣ','०'=>'0','१'=>'1','२'=>'2','३'=>'3','४'=>'4','५'=>'5','६'=>'6','७'=>'7','८'=>'8','९'=>'9','ॻ'=>'ॻ','ॼ'=>'ॼ','ॽ'=>'ॽ','ॾ'=>'ॾ','ॿ'=>'ॿ','ঁ'=>'ঁ','ং'=>'ং','ঃ'=>'ঃ','অ'=>'অ','আ'=>'আ','ই'=>'ই','ঈ'=>'ঈ','উ'=>'উ','ঊ'=>'ঊ','ঋ'=>'ঋ','ঌ'=>'ঌ','এ'=>'এ','ঐ'=>'ঐ','ও'=>'ও','ঔ'=>'ঔ','ক'=>'ক','খ'=>'খ','গ'=>'গ','ঘ'=>'ঘ','ঙ'=>'ঙ','চ'=>'চ','ছ'=>'ছ','জ'=>'জ','ঝ'=>'ঝ','ঞ'=>'ঞ','ট'=>'ট','ঠ'=>'ঠ','ড'=>'ড','ঢ'=>'ঢ','ণ'=>'ণ','ত'=>'ত','থ'=>'থ','দ'=>'দ','ধ'=>'ধ','ন'=>'ন','প'=>'প','ফ'=>'ফ','ব'=>'ব','ভ'=>'ভ','ম'=>'ম','য'=>'য','র'=>'র','ল'=>'ল','শ'=>'শ','ষ'=>'ষ','স'=>'স','হ'=>'হ','়'=>'়','ঽ'=>'ঽ','া'=>'া','ি'=>'ি','ী'=>'ী','ু'=>'ু','ূ'=>'ূ','ৃ'=>'ৃ','ৄ'=>'ৄ','ে'=>'ে','ৈ'=>'ৈ','ো'=>'ো','ৌ'=>'ৌ','্'=>'্','ৎ'=>'ৎ','ৗ'=>'ৗ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ৠ'=>'ৠ','ৡ'=>'ৡ','ৢ'=>'ৢ','ৣ'=>'ৣ','০'=>'0','১'=>'1','২'=>'2','৩'=>'3','৪'=>'4','৫'=>'5','৬'=>'6','৭'=>'7','৮'=>'8','৯'=>'9','ৰ'=>'ৰ','ৱ'=>'ৱ','৴'=>'1','৵'=>'2','৶'=>'3','৷'=>'4','৸'=>'৸','৹'=>'16','ਁ'=>'ਁ','ਂ'=>'ਂ','ਃ'=>'ਃ','ਅ'=>'ਅ','ਆ'=>'ਆ','ਇ'=>'ਇ','ਈ'=>'ਈ','ਉ'=>'ਉ','ਊ'=>'ਊ','ਏ'=>'ਏ','ਐ'=>'ਐ','ਓ'=>'ਓ','ਔ'=>'ਔ','ਕ'=>'ਕ','ਖ'=>'ਖ','ਗ'=>'ਗ','ਘ'=>'ਘ','ਙ'=>'ਙ','ਚ'=>'ਚ','ਛ'=>'ਛ','ਜ'=>'ਜ','ਝ'=>'ਝ','ਞ'=>'ਞ','ਟ'=>'ਟ','ਠ'=>'ਠ','ਡ'=>'ਡ','ਢ'=>'ਢ','ਣ'=>'ਣ','ਤ'=>'ਤ','ਥ'=>'ਥ','ਦ'=>'ਦ','ਧ'=>'ਧ','ਨ'=>'ਨ','ਪ'=>'ਪ','ਫ'=>'ਫ','ਬ'=>'ਬ','ਭ'=>'ਭ','ਮ'=>'ਮ','ਯ'=>'ਯ','ਰ'=>'ਰ','ਲ'=>'ਲ','ਲ਼'=>'ਲ਼','ਵ'=>'ਵ','ਸ਼'=>'ਸ਼','ਸ'=>'ਸ','ਹ'=>'ਹ','਼'=>'਼','ਾ'=>'ਾ','ਿ'=>'ਿ','ੀ'=>'ੀ','ੁ'=>'ੁ','ੂ'=>'ੂ','ੇ'=>'ੇ','ੈ'=>'ੈ','ੋ'=>'ੋ','ੌ'=>'ੌ','੍'=>'੍','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ੜ'=>'ੜ','ਫ਼'=>'ਫ਼','੦'=>'0','੧'=>'1','੨'=>'2','੩'=>'3','੪'=>'4','੫'=>'5','੬'=>'6','੭'=>'7','੮'=>'8','੯'=>'9','ੰ'=>'ੰ','ੱ'=>'ੱ','ੲ'=>'ੲ','ੳ'=>'ੳ','ੴ'=>'ੴ','ઁ'=>'ઁ','ં'=>'ં','ઃ'=>'ઃ','અ'=>'અ','આ'=>'આ','ઇ'=>'ઇ','ઈ'=>'ઈ','ઉ'=>'ઉ','ઊ'=>'ઊ','ઋ'=>'ઋ','ઌ'=>'ઌ','ઍ'=>'ઍ','એ'=>'એ','ઐ'=>'ઐ','ઑ'=>'ઑ','ઓ'=>'ઓ','ઔ'=>'ઔ','ક'=>'ક','ખ'=>'ખ','ગ'=>'ગ','ઘ'=>'ઘ','ઙ'=>'ઙ','ચ'=>'ચ','છ'=>'છ','જ'=>'જ','ઝ'=>'ઝ','ઞ'=>'ઞ','ટ'=>'ટ','ઠ'=>'ઠ','ડ'=>'ડ','ઢ'=>'ઢ','ણ'=>'ણ','ત'=>'ત','થ'=>'થ','દ'=>'દ','ધ'=>'ધ','ન'=>'ન','પ'=>'પ','ફ'=>'ફ','બ'=>'બ','ભ'=>'ભ','મ'=>'મ','ય'=>'ય','ર'=>'ર','લ'=>'લ','ળ'=>'ળ','વ'=>'વ','શ'=>'શ','ષ'=>'ષ','સ'=>'સ','હ'=>'હ','઼'=>'઼','ઽ'=>'ઽ','ા'=>'ા','િ'=>'િ','ી'=>'ી','ુ'=>'ુ','ૂ'=>'ૂ','ૃ'=>'ૃ','ૄ'=>'ૄ','ૅ'=>'ૅ','ે'=>'ે','ૈ'=>'ૈ','ૉ'=>'ૉ','ો'=>'ો','ૌ'=>'ૌ','્'=>'્','ૐ'=>'ૐ','ૠ'=>'ૠ','ૡ'=>'ૡ','ૢ'=>'ૢ','ૣ'=>'ૣ','૦'=>'0','૧'=>'1','૨'=>'2','૩'=>'3','૪'=>'4','૫'=>'5','૬'=>'6','૭'=>'7','૮'=>'8','૯'=>'9','ଁ'=>'ଁ','ଂ'=>'ଂ','ଃ'=>'ଃ','ଅ'=>'ଅ','ଆ'=>'ଆ','ଇ'=>'ଇ','ଈ'=>'ଈ','ଉ'=>'ଉ','ଊ'=>'ଊ','ଋ'=>'ଋ','ଌ'=>'ଌ','ଏ'=>'ଏ','ଐ'=>'ଐ','ଓ'=>'ଓ','ଔ'=>'ଔ','କ'=>'କ','ଖ'=>'ଖ','ଗ'=>'ଗ','ଘ'=>'ଘ','ଙ'=>'ଙ','ଚ'=>'ଚ','ଛ'=>'ଛ','ଜ'=>'ଜ','ଝ'=>'ଝ','ଞ'=>'ଞ','ଟ'=>'ଟ','ଠ'=>'ଠ','ଡ'=>'ଡ','ଢ'=>'ଢ','ଣ'=>'ଣ','ତ'=>'ତ','ଥ'=>'ଥ','ଦ'=>'ଦ','ଧ'=>'ଧ','ନ'=>'ନ','ପ'=>'ପ','ଫ'=>'ଫ','ବ'=>'ବ','ଭ'=>'ଭ','ମ'=>'ମ','ଯ'=>'ଯ','ର'=>'ର','ଲ'=>'ଲ','ଳ'=>'ଳ','ଵ'=>'ଵ','ଶ'=>'ଶ','ଷ'=>'ଷ','ସ'=>'ସ','ହ'=>'ହ','଼'=>'଼','ଽ'=>'ଽ','ା'=>'ା','ି'=>'ି','ୀ'=>'ୀ','ୁ'=>'ୁ','ୂ'=>'ୂ','ୃ'=>'ୃ','େ'=>'େ','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','୍'=>'୍','ୖ'=>'ୖ','ୗ'=>'ୗ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ୟ'=>'ୟ','ୠ'=>'ୠ','ୡ'=>'ୡ','୦'=>'0','୧'=>'1','୨'=>'2','୩'=>'3','୪'=>'4','୫'=>'5','୬'=>'6','୭'=>'7','୮'=>'8','୯'=>'9','ୱ'=>'ୱ','ஂ'=>'ஂ','ஃ'=>'ஃ','அ'=>'அ','ஆ'=>'ஆ','இ'=>'இ','ஈ'=>'ஈ','உ'=>'உ','ஊ'=>'ஊ','எ'=>'எ','ஏ'=>'ஏ','ஐ'=>'ஐ','ஒ'=>'ஒ','ஓ'=>'ஓ','ஔ'=>'ஔ','க'=>'க','ங'=>'ங','ச'=>'ச','ஜ'=>'ஜ','ஞ'=>'ஞ','ட'=>'ட','ண'=>'ண','த'=>'த','ந'=>'ந','ன'=>'ன','ப'=>'ப','ம'=>'ம','ய'=>'ய','ர'=>'ர','ற'=>'ற','ல'=>'ல','ள'=>'ள','ழ'=>'ழ','வ'=>'வ','ஶ'=>'ஶ','ஷ'=>'ஷ','ஸ'=>'ஸ','ஹ'=>'ஹ','ா'=>'ா','ி'=>'ி','ீ'=>'ீ','ு'=>'ு','ூ'=>'ூ','ெ'=>'ெ','ே'=>'ே','ை'=>'ை','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','்'=>'்','ௗ'=>'ௗ','௦'=>'0','௧'=>'1','௨'=>'2','௩'=>'3','௪'=>'4','௫'=>'5','௬'=>'6','௭'=>'7','௮'=>'8','௯'=>'9','௰'=>'10','௱'=>'100','௲'=>'1000','ఁ'=>'ఁ','ం'=>'ం','ః'=>'ః','అ'=>'అ','ఆ'=>'ఆ','ఇ'=>'ఇ','ఈ'=>'ఈ','ఉ'=>'ఉ','ఊ'=>'ఊ','ఋ'=>'ఋ','ఌ'=>'ఌ','ఎ'=>'ఎ','ఏ'=>'ఏ','ఐ'=>'ఐ','ఒ'=>'ఒ','ఓ'=>'ఓ','ఔ'=>'ఔ','క'=>'క','ఖ'=>'ఖ','గ'=>'గ','ఘ'=>'ఘ','ఙ'=>'ఙ','చ'=>'చ','ఛ'=>'ఛ','జ'=>'జ','ఝ'=>'ఝ','ఞ'=>'ఞ','ట'=>'ట','ఠ'=>'ఠ','డ'=>'డ','ఢ'=>'ఢ','ణ'=>'ణ','త'=>'త','థ'=>'థ','ద'=>'ద','ధ'=>'ధ','న'=>'న','ప'=>'ప','ఫ'=>'ఫ','బ'=>'బ','భ'=>'భ','మ'=>'మ','య'=>'య','ర'=>'ర','ఱ'=>'ఱ','ల'=>'ల','ళ'=>'ళ','వ'=>'వ','శ'=>'శ','ష'=>'ష','స'=>'స','హ'=>'హ','ా'=>'ా','ి'=>'ి','ీ'=>'ీ','ు'=>'ు','ూ'=>'ూ','ృ'=>'ృ','ౄ'=>'ౄ','ె'=>'ె','ే'=>'ే','ై'=>'ై','ొ'=>'ొ','ో'=>'ో','ౌ'=>'ౌ','్'=>'్','ౕ'=>'ౕ','ౖ'=>'ౖ','ౠ'=>'ౠ','ౡ'=>'ౡ','౦'=>'0','౧'=>'1','౨'=>'2','౩'=>'3','౪'=>'4','౫'=>'5','౬'=>'6','౭'=>'7','౮'=>'8','౯'=>'9','ಂ'=>'ಂ','ಃ'=>'ಃ','ಅ'=>'ಅ','ಆ'=>'ಆ','ಇ'=>'ಇ','ಈ'=>'ಈ','ಉ'=>'ಉ','ಊ'=>'ಊ','ಋ'=>'ಋ','ಌ'=>'ಌ','ಎ'=>'ಎ','ಏ'=>'ಏ','ಐ'=>'ಐ','ಒ'=>'ಒ','ಓ'=>'ಓ','ಔ'=>'ಔ','ಕ'=>'ಕ','ಖ'=>'ಖ','ಗ'=>'ಗ','ಘ'=>'ಘ','ಙ'=>'ಙ','ಚ'=>'ಚ','ಛ'=>'ಛ','ಜ'=>'ಜ','ಝ'=>'ಝ','ಞ'=>'ಞ','ಟ'=>'ಟ','ಠ'=>'ಠ','ಡ'=>'ಡ','ಢ'=>'ಢ','ಣ'=>'ಣ','ತ'=>'ತ','ಥ'=>'ಥ','ದ'=>'ದ','ಧ'=>'ಧ','ನ'=>'ನ','ಪ'=>'ಪ','ಫ'=>'ಫ','ಬ'=>'ಬ','ಭ'=>'ಭ','ಮ'=>'ಮ','ಯ'=>'ಯ','ರ'=>'ರ','ಱ'=>'ಱ','ಲ'=>'ಲ','ಳ'=>'ಳ','ವ'=>'ವ','ಶ'=>'ಶ','ಷ'=>'ಷ','ಸ'=>'ಸ','ಹ'=>'ಹ','಼'=>'಼','ಽ'=>'ಽ','ಾ'=>'ಾ','ಿ'=>'ಿ','ೀ'=>'ೀ','ು'=>'ು','ೂ'=>'ೂ','ೃ'=>'ೃ','ೄ'=>'ೄ','ೆ'=>'ೆ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ೌ'=>'ೌ','್'=>'್','ೕ'=>'ೕ','ೖ'=>'ೖ','ೞ'=>'ೞ','ೠ'=>'ೠ','ೡ'=>'ೡ','ೢ'=>'ೢ','ೣ'=>'ೣ','೦'=>'0','೧'=>'1','೨'=>'2','೩'=>'3','೪'=>'4','೫'=>'5','೬'=>'6','೭'=>'7','೮'=>'8','೯'=>'9','ം'=>'ം','ഃ'=>'ഃ','അ'=>'അ','ആ'=>'ആ','ഇ'=>'ഇ','ഈ'=>'ഈ','ഉ'=>'ഉ','ഊ'=>'ഊ','ഋ'=>'ഋ','ഌ'=>'ഌ','എ'=>'എ','ഏ'=>'ഏ','ഐ'=>'ഐ','ഒ'=>'ഒ','ഓ'=>'ഓ','ഔ'=>'ഔ','ക'=>'ക','ഖ'=>'ഖ','ഗ'=>'ഗ','ഘ'=>'ഘ','ങ'=>'ങ','ച'=>'ച','ഛ'=>'ഛ','ജ'=>'ജ','ഝ'=>'ഝ','ഞ'=>'ഞ','ട'=>'ട','ഠ'=>'ഠ','ഡ'=>'ഡ','ഢ'=>'ഢ','ണ'=>'ണ','ത'=>'ത','ഥ'=>'ഥ','ദ'=>'ദ','ധ'=>'ധ','ന'=>'ന','പ'=>'പ','ഫ'=>'ഫ','ബ'=>'ബ','ഭ'=>'ഭ','മ'=>'മ','യ'=>'യ','ര'=>'ര','റ'=>'റ','ല'=>'ല','ള'=>'ള','ഴ'=>'ഴ','വ'=>'വ','ശ'=>'ശ','ഷ'=>'ഷ','സ'=>'സ','ഹ'=>'ഹ','ാ'=>'ാ','ി'=>'ി','ീ'=>'ീ','ു'=>'ു','ൂ'=>'ൂ','ൃ'=>'ൃ','െ'=>'െ','േ'=>'േ','ൈ'=>'ൈ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','്'=>'്','ൗ'=>'ൗ','ൠ'=>'ൠ','ൡ'=>'ൡ','൦'=>'0','൧'=>'1','൨'=>'2','൩'=>'3','൪'=>'4','൫'=>'5','൬'=>'6','൭'=>'7','൮'=>'8','൯'=>'9','ං'=>'ං','ඃ'=>'ඃ','අ'=>'අ','ආ'=>'ආ','ඇ'=>'ඇ','ඈ'=>'ඈ','ඉ'=>'ඉ','ඊ'=>'ඊ','උ'=>'උ','ඌ'=>'ඌ','ඍ'=>'ඍ','ඎ'=>'ඎ','ඏ'=>'ඏ','ඐ'=>'ඐ','එ'=>'එ','ඒ'=>'ඒ','ඓ'=>'ඓ','ඔ'=>'ඔ','ඕ'=>'ඕ','ඖ'=>'ඖ','ක'=>'ක','ඛ'=>'ඛ','ග'=>'ග','ඝ'=>'ඝ','ඞ'=>'ඞ','ඟ'=>'ඟ','ච'=>'ච','ඡ'=>'ඡ','ජ'=>'ජ','ඣ'=>'ඣ','ඤ'=>'ඤ','ඥ'=>'ඥ','ඦ'=>'ඦ','ට'=>'ට','ඨ'=>'ඨ','ඩ'=>'ඩ','ඪ'=>'ඪ','ණ'=>'ණ','ඬ'=>'ඬ','ත'=>'ත','ථ'=>'ථ','ද'=>'ද','ධ'=>'ධ','න'=>'න','ඳ'=>'ඳ','ප'=>'ප','ඵ'=>'ඵ','බ'=>'බ','භ'=>'භ','ම'=>'ම','ඹ'=>'ඹ','ය'=>'ය','ර'=>'ර','ල'=>'ල','ව'=>'ව','ශ'=>'ශ','ෂ'=>'ෂ','ස'=>'ස','හ'=>'හ','ළ'=>'ළ','ෆ'=>'ෆ','්'=>'්','ා'=>'ා','ැ'=>'ැ','ෑ'=>'ෑ','ි'=>'ි','ී'=>'ී','ු'=>'ු','ූ'=>'ූ','ෘ'=>'ෘ','ෙ'=>'ෙ','ේ'=>'ේ','ෛ'=>'ෛ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ෟ'=>'ෟ','ෲ'=>'ෲ','ෳ'=>'ෳ','ก'=>'ก','ข'=>'ข','ฃ'=>'ฃ','ค'=>'ค','ฅ'=>'ฅ','ฆ'=>'ฆ','ง'=>'ง','จ'=>'จ','ฉ'=>'ฉ','ช'=>'ช','ซ'=>'ซ','ฌ'=>'ฌ','ญ'=>'ญ','ฎ'=>'ฎ','ฏ'=>'ฏ','ฐ'=>'ฐ','ฑ'=>'ฑ','ฒ'=>'ฒ','ณ'=>'ณ','ด'=>'ด','ต'=>'ต','ถ'=>'ถ','ท'=>'ท','ธ'=>'ธ','น'=>'น','บ'=>'บ','ป'=>'ป','ผ'=>'ผ','ฝ'=>'ฝ','พ'=>'พ','ฟ'=>'ฟ','ภ'=>'ภ','ม'=>'ม','ย'=>'ย','ร'=>'ร','ฤ'=>'ฤ','ล'=>'ล','ฦ'=>'ฦ','ว'=>'ว','ศ'=>'ศ','ษ'=>'ษ','ส'=>'ส','ห'=>'ห','ฬ'=>'ฬ','อ'=>'อ','ฮ'=>'ฮ','ฯ'=>'ฯ','ะ'=>'ะ','ั'=>'ั','า'=>'า','ำ'=>'ำ','ิ'=>'ิ','ี'=>'ี','ึ'=>'ึ','ื'=>'ื','ุ'=>'ุ','ู'=>'ู','ฺ'=>'ฺ','เ'=>'เ','แ'=>'แ','โ'=>'โ','ใ'=>'ใ','ไ'=>'ไ','ๅ'=>'ๅ','ๆ'=>'ๆ','็'=>'็','่'=>'่','้'=>'้','๊'=>'๊','๋'=>'๋','์'=>'์','ํ'=>'ํ','๎'=>'๎','๐'=>'0','๑'=>'1','๒'=>'2','๓'=>'3','๔'=>'4','๕'=>'5','๖'=>'6','๗'=>'7','๘'=>'8','๙'=>'9','ກ'=>'ກ','ຂ'=>'ຂ','ຄ'=>'ຄ','ງ'=>'ງ','ຈ'=>'ຈ','ຊ'=>'ຊ','ຍ'=>'ຍ','ດ'=>'ດ','ຕ'=>'ຕ','ຖ'=>'ຖ','ທ'=>'ທ','ນ'=>'ນ','ບ'=>'ບ','ປ'=>'ປ','ຜ'=>'ຜ','ຝ'=>'ຝ','ພ'=>'ພ','ຟ'=>'ຟ','ມ'=>'ມ','ຢ'=>'ຢ','ຣ'=>'ຣ','ລ'=>'ລ','ວ'=>'ວ','ສ'=>'ສ','ຫ'=>'ຫ','ອ'=>'ອ','ຮ'=>'ຮ','ຯ'=>'ຯ','ະ'=>'ະ','ັ'=>'ັ','າ'=>'າ','ຳ'=>'ຳ','ິ'=>'ິ','ີ'=>'ີ','ຶ'=>'ຶ','ື'=>'ື','ຸ'=>'ຸ','ູ'=>'ູ','ົ'=>'ົ','ຼ'=>'ຼ','ຽ'=>'ຽ','ເ'=>'ເ','ແ'=>'ແ','ໂ'=>'ໂ','ໃ'=>'ໃ','ໄ'=>'ໄ','ໆ'=>'ໆ','່'=>'່','້'=>'້','໊'=>'໊','໋'=>'໋','໌'=>'໌','ໍ'=>'ໍ','໐'=>'0','໑'=>'1','໒'=>'2','໓'=>'3','໔'=>'4','໕'=>'5','໖'=>'6','໗'=>'7','໘'=>'8','໙'=>'9','ໜ'=>'ໜ','ໝ'=>'ໝ','ༀ'=>'ༀ','༘'=>'༘','༙'=>'༙','༠'=>'0','༡'=>'1','༢'=>'2','༣'=>'3','༤'=>'4','༥'=>'5','༦'=>'6','༧'=>'7','༨'=>'8','༩'=>'9','༪'=>'1/2','༫'=>'3/2','༬'=>'5/2','༭'=>'7/2','༮'=>'9/2','༯'=>'11/2','༰'=>'13/2','༱'=>'15/2','༲'=>'17/2','༳'=>'-1/2','༵'=>'༵','༷'=>'༷','༹'=>'༹','༾'=>'༾','༿'=>'༿','ཀ'=>'ཀ','ཁ'=>'ཁ','ག'=>'ག','གྷ'=>'གྷ','ང'=>'ང','ཅ'=>'ཅ','ཆ'=>'ཆ','ཇ'=>'ཇ','ཉ'=>'ཉ','ཊ'=>'ཊ','ཋ'=>'ཋ','ཌ'=>'ཌ','ཌྷ'=>'ཌྷ','ཎ'=>'ཎ','ཏ'=>'ཏ','ཐ'=>'ཐ','ད'=>'ད','དྷ'=>'དྷ','ན'=>'ན','པ'=>'པ','ཕ'=>'ཕ','བ'=>'བ','བྷ'=>'བྷ','མ'=>'མ','ཙ'=>'ཙ','ཚ'=>'ཚ','ཛ'=>'ཛ','ཛྷ'=>'ཛྷ','ཝ'=>'ཝ','ཞ'=>'ཞ','ཟ'=>'ཟ','འ'=>'འ','ཡ'=>'ཡ','ར'=>'ར','ལ'=>'ལ','ཤ'=>'ཤ','ཥ'=>'ཥ','ས'=>'ས','ཧ'=>'ཧ','ཨ'=>'ཨ','ཀྵ'=>'ཀྵ','ཪ'=>'ཪ','ཱ'=>'ཱ','ི'=>'ི','ཱི'=>'ཱི','ུ'=>'ུ','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ཷ'=>'ཷ','ླྀ'=>'ླྀ','ཹ'=>'ཹ','ེ'=>'ེ','ཻ'=>'ཻ','ོ'=>'ོ','ཽ'=>'ཽ','ཾ'=>'ཾ','ཿ'=>'ཿ','ྀ'=>'ྀ','ཱྀ'=>'ཱྀ','ྂ'=>'ྂ','ྃ'=>'ྃ','྄'=>'྄','྆'=>'྆','྇'=>'྇','ྈ'=>'ྈ','ྉ'=>'ྉ','ྊ'=>'ྊ','ྋ'=>'ྋ','ྐ'=>'ྐ','ྑ'=>'ྑ','ྒ'=>'ྒ','ྒྷ'=>'ྒྷ','ྔ'=>'ྔ','ྕ'=>'ྕ','ྖ'=>'ྖ','ྗ'=>'ྗ','ྙ'=>'ྙ','ྚ'=>'ྚ','ྛ'=>'ྛ','ྜ'=>'ྜ','ྜྷ'=>'ྜྷ','ྞ'=>'ྞ','ྟ'=>'ྟ','ྠ'=>'ྠ','ྡ'=>'ྡ','ྡྷ'=>'ྡྷ','ྣ'=>'ྣ','ྤ'=>'ྤ','ྥ'=>'ྥ','ྦ'=>'ྦ','ྦྷ'=>'ྦྷ','ྨ'=>'ྨ','ྩ'=>'ྩ','ྪ'=>'ྪ','ྫ'=>'ྫ','ྫྷ'=>'ྫྷ','ྭ'=>'ྭ','ྮ'=>'ྮ','ྯ'=>'ྯ','ྰ'=>'ྰ','ྱ'=>'ྱ','ྲ'=>'ྲ','ླ'=>'ླ','ྴ'=>'ྴ','ྵ'=>'ྵ','ྶ'=>'ྶ','ྷ'=>'ྷ','ྸ'=>'ྸ','ྐྵ'=>'ྐྵ','ྺ'=>'ྺ','ྻ'=>'ྻ','ྼ'=>'ྼ','࿆'=>'࿆');
diff --git a/phpBB/includes/utf/data/search_indexer_19.php b/phpBB/includes/utf/data/search_indexer_19.php
index e26f7d81a0..d10d09f061 100644
--- a/phpBB/includes/utf/data/search_indexer_19.php
+++ b/phpBB/includes/utf/data/search_indexer_19.php
@@ -1 +1 @@
-<?php return array('龻'=>'龻'); \ No newline at end of file
+<?php return array('龻'=>'龻');
diff --git a/phpBB/includes/utf/data/search_indexer_2.php b/phpBB/includes/utf/data/search_indexer_2.php
index 751226ed22..5b5f03448f 100644
--- a/phpBB/includes/utf/data/search_indexer_2.php
+++ b/phpBB/includes/utf/data/search_indexer_2.php
@@ -1 +1 @@
-<?php return array('က'=>'က','ခ'=>'ခ','ဂ'=>'ဂ','ဃ'=>'ဃ','င'=>'င','စ'=>'စ','ဆ'=>'ဆ','ဇ'=>'ဇ','ဈ'=>'ဈ','ဉ'=>'ဉ','ည'=>'ည','ဋ'=>'ဋ','ဌ'=>'ဌ','ဍ'=>'ဍ','ဎ'=>'ဎ','ဏ'=>'ဏ','တ'=>'တ','ထ'=>'ထ','ဒ'=>'ဒ','ဓ'=>'ဓ','န'=>'န','ပ'=>'ပ','ဖ'=>'ဖ','ဗ'=>'ဗ','ဘ'=>'ဘ','မ'=>'မ','ယ'=>'ယ','ရ'=>'ရ','လ'=>'လ','ဝ'=>'ဝ','သ'=>'သ','ဟ'=>'ဟ','ဠ'=>'ဠ','အ'=>'အ','ဣ'=>'ဣ','ဤ'=>'ဤ','ဥ'=>'ဥ','ဦ'=>'ဦ','ဧ'=>'ဧ','ဩ'=>'ဩ','ဪ'=>'ဪ','ာ'=>'ာ','ိ'=>'ိ','ီ'=>'ီ','ု'=>'ု','ူ'=>'ူ','ေ'=>'ေ','ဲ'=>'ဲ','ံ'=>'ံ','့'=>'့','း'=>'း','္'=>'္','၀'=>'0','၁'=>'1','၂'=>'2','၃'=>'3','၄'=>'4','၅'=>'5','၆'=>'6','၇'=>'7','၈'=>'8','၉'=>'9','ၐ'=>'ၐ','ၑ'=>'ၑ','ၒ'=>'ၒ','ၓ'=>'ၓ','ၔ'=>'ၔ','ၕ'=>'ၕ','ၖ'=>'ၖ','ၗ'=>'ၗ','ၘ'=>'ၘ','ၙ'=>'ၙ','Ⴀ'=>'ⴀ','Ⴁ'=>'ⴁ','Ⴂ'=>'ⴂ','Ⴃ'=>'ⴃ','Ⴄ'=>'ⴄ','Ⴅ'=>'ⴅ','Ⴆ'=>'ⴆ','Ⴇ'=>'ⴇ','Ⴈ'=>'ⴈ','Ⴉ'=>'ⴉ','Ⴊ'=>'ⴊ','Ⴋ'=>'ⴋ','Ⴌ'=>'ⴌ','Ⴍ'=>'ⴍ','Ⴎ'=>'ⴎ','Ⴏ'=>'ⴏ','Ⴐ'=>'ⴐ','Ⴑ'=>'ⴑ','Ⴒ'=>'ⴒ','Ⴓ'=>'ⴓ','Ⴔ'=>'ⴔ','Ⴕ'=>'ⴕ','Ⴖ'=>'ⴖ','Ⴗ'=>'ⴗ','Ⴘ'=>'ⴘ','Ⴙ'=>'ⴙ','Ⴚ'=>'ⴚ','Ⴛ'=>'ⴛ','Ⴜ'=>'ⴜ','Ⴝ'=>'ⴝ','Ⴞ'=>'ⴞ','Ⴟ'=>'ⴟ','Ⴠ'=>'ⴠ','Ⴡ'=>'ⴡ','Ⴢ'=>'ⴢ','Ⴣ'=>'ⴣ','Ⴤ'=>'ⴤ','Ⴥ'=>'ⴥ','ა'=>'ა','ბ'=>'ბ','გ'=>'გ','დ'=>'დ','ე'=>'ე','ვ'=>'ვ','ზ'=>'ზ','თ'=>'თ','ი'=>'ი','კ'=>'კ','ლ'=>'ლ','მ'=>'მ','ნ'=>'ნ','ო'=>'ო','პ'=>'პ','ჟ'=>'ჟ','რ'=>'რ','ს'=>'ს','ტ'=>'ტ','უ'=>'უ','ფ'=>'ფ','ქ'=>'ქ','ღ'=>'ღ','ყ'=>'ყ','შ'=>'შ','ჩ'=>'ჩ','ც'=>'ც','ძ'=>'ძ','წ'=>'წ','ჭ'=>'ჭ','ხ'=>'ხ','ჯ'=>'ჯ','ჰ'=>'ჰ','ჱ'=>'ჱ','ჲ'=>'ჲ','ჳ'=>'ჳ','ჴ'=>'ჴ','ჵ'=>'ჵ','ჶ'=>'ჶ','ჷ'=>'ჷ','ჸ'=>'ჸ','ჹ'=>'ჹ','ჺ'=>'ჺ','ჼ'=>'ჼ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᄂ'=>'ᄂ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᄓ'=>'ᄓ','ᄔ'=>'ᄔ','ᄕ'=>'ᄕ','ᄖ'=>'ᄖ','ᄗ'=>'ᄗ','ᄘ'=>'ᄘ','ᄙ'=>'ᄙ','ᄚ'=>'ᄚ','ᄛ'=>'ᄛ','ᄜ'=>'ᄜ','ᄝ'=>'ᄝ','ᄞ'=>'ᄞ','ᄟ'=>'ᄟ','ᄠ'=>'ᄠ','ᄡ'=>'ᄡ','ᄢ'=>'ᄢ','ᄣ'=>'ᄣ','ᄤ'=>'ᄤ','ᄥ'=>'ᄥ','ᄦ'=>'ᄦ','ᄧ'=>'ᄧ','ᄨ'=>'ᄨ','ᄩ'=>'ᄩ','ᄪ'=>'ᄪ','ᄫ'=>'ᄫ','ᄬ'=>'ᄬ','ᄭ'=>'ᄭ','ᄮ'=>'ᄮ','ᄯ'=>'ᄯ','ᄰ'=>'ᄰ','ᄱ'=>'ᄱ','ᄲ'=>'ᄲ','ᄳ'=>'ᄳ','ᄴ'=>'ᄴ','ᄵ'=>'ᄵ','ᄶ'=>'ᄶ','ᄷ'=>'ᄷ','ᄸ'=>'ᄸ','ᄹ'=>'ᄹ','ᄺ'=>'ᄺ','ᄻ'=>'ᄻ','ᄼ'=>'ᄼ','ᄽ'=>'ᄽ','ᄾ'=>'ᄾ','ᄿ'=>'ᄿ','ᅀ'=>'ᅀ','ᅁ'=>'ᅁ','ᅂ'=>'ᅂ','ᅃ'=>'ᅃ','ᅄ'=>'ᅄ','ᅅ'=>'ᅅ','ᅆ'=>'ᅆ','ᅇ'=>'ᅇ','ᅈ'=>'ᅈ','ᅉ'=>'ᅉ','ᅊ'=>'ᅊ','ᅋ'=>'ᅋ','ᅌ'=>'ᅌ','ᅍ'=>'ᅍ','ᅎ'=>'ᅎ','ᅏ'=>'ᅏ','ᅐ'=>'ᅐ','ᅑ'=>'ᅑ','ᅒ'=>'ᅒ','ᅓ'=>'ᅓ','ᅔ'=>'ᅔ','ᅕ'=>'ᅕ','ᅖ'=>'ᅖ','ᅗ'=>'ᅗ','ᅘ'=>'ᅘ','ᅙ'=>'ᅙ','ᅟ'=>'ᅟ','ᅠ'=>'ᅠ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ','ᅶ'=>'ᅶ','ᅷ'=>'ᅷ','ᅸ'=>'ᅸ','ᅹ'=>'ᅹ','ᅺ'=>'ᅺ','ᅻ'=>'ᅻ','ᅼ'=>'ᅼ','ᅽ'=>'ᅽ','ᅾ'=>'ᅾ','ᅿ'=>'ᅿ','ᆀ'=>'ᆀ','ᆁ'=>'ᆁ','ᆂ'=>'ᆂ','ᆃ'=>'ᆃ','ᆄ'=>'ᆄ','ᆅ'=>'ᆅ','ᆆ'=>'ᆆ','ᆇ'=>'ᆇ','ᆈ'=>'ᆈ','ᆉ'=>'ᆉ','ᆊ'=>'ᆊ','ᆋ'=>'ᆋ','ᆌ'=>'ᆌ','ᆍ'=>'ᆍ','ᆎ'=>'ᆎ','ᆏ'=>'ᆏ','ᆐ'=>'ᆐ','ᆑ'=>'ᆑ','ᆒ'=>'ᆒ','ᆓ'=>'ᆓ','ᆔ'=>'ᆔ','ᆕ'=>'ᆕ','ᆖ'=>'ᆖ','ᆗ'=>'ᆗ','ᆘ'=>'ᆘ','ᆙ'=>'ᆙ','ᆚ'=>'ᆚ','ᆛ'=>'ᆛ','ᆜ'=>'ᆜ','ᆝ'=>'ᆝ','ᆞ'=>'ᆞ','ᆟ'=>'ᆟ','ᆠ'=>'ᆠ','ᆡ'=>'ᆡ','ᆢ'=>'ᆢ','ᆨ'=>'ᆨ','ᆩ'=>'ᆩ','ᆪ'=>'ᆪ','ᆫ'=>'ᆫ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᆮ'=>'ᆮ','ᆯ'=>'ᆯ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᆶ'=>'ᆶ','ᆷ'=>'ᆷ','ᆸ'=>'ᆸ','ᆹ'=>'ᆹ','ᆺ'=>'ᆺ','ᆻ'=>'ᆻ','ᆼ'=>'ᆼ','ᆽ'=>'ᆽ','ᆾ'=>'ᆾ','ᆿ'=>'ᆿ','ᇀ'=>'ᇀ','ᇁ'=>'ᇁ','ᇂ'=>'ᇂ','ᇃ'=>'ᇃ','ᇄ'=>'ᇄ','ᇅ'=>'ᇅ','ᇆ'=>'ᇆ','ᇇ'=>'ᇇ','ᇈ'=>'ᇈ','ᇉ'=>'ᇉ','ᇊ'=>'ᇊ','ᇋ'=>'ᇋ','ᇌ'=>'ᇌ','ᇍ'=>'ᇍ','ᇎ'=>'ᇎ','ᇏ'=>'ᇏ','ᇐ'=>'ᇐ','ᇑ'=>'ᇑ','ᇒ'=>'ᇒ','ᇓ'=>'ᇓ','ᇔ'=>'ᇔ','ᇕ'=>'ᇕ','ᇖ'=>'ᇖ','ᇗ'=>'ᇗ','ᇘ'=>'ᇘ','ᇙ'=>'ᇙ','ᇚ'=>'ᇚ','ᇛ'=>'ᇛ','ᇜ'=>'ᇜ','ᇝ'=>'ᇝ','ᇞ'=>'ᇞ','ᇟ'=>'ᇟ','ᇠ'=>'ᇠ','ᇡ'=>'ᇡ','ᇢ'=>'ᇢ','ᇣ'=>'ᇣ','ᇤ'=>'ᇤ','ᇥ'=>'ᇥ','ᇦ'=>'ᇦ','ᇧ'=>'ᇧ','ᇨ'=>'ᇨ','ᇩ'=>'ᇩ','ᇪ'=>'ᇪ','ᇫ'=>'ᇫ','ᇬ'=>'ᇬ','ᇭ'=>'ᇭ','ᇮ'=>'ᇮ','ᇯ'=>'ᇯ','ᇰ'=>'ᇰ','ᇱ'=>'ᇱ','ᇲ'=>'ᇲ','ᇳ'=>'ᇳ','ᇴ'=>'ᇴ','ᇵ'=>'ᇵ','ᇶ'=>'ᇶ','ᇷ'=>'ᇷ','ᇸ'=>'ᇸ','ᇹ'=>'ᇹ','ሀ'=>'ሀ','ሁ'=>'ሁ','ሂ'=>'ሂ','ሃ'=>'ሃ','ሄ'=>'ሄ','ህ'=>'ህ','ሆ'=>'ሆ','ሇ'=>'ሇ','ለ'=>'ለ','ሉ'=>'ሉ','ሊ'=>'ሊ','ላ'=>'ላ','ሌ'=>'ሌ','ል'=>'ል','ሎ'=>'ሎ','ሏ'=>'ሏ','ሐ'=>'ሐ','ሑ'=>'ሑ','ሒ'=>'ሒ','ሓ'=>'ሓ','ሔ'=>'ሔ','ሕ'=>'ሕ','ሖ'=>'ሖ','ሗ'=>'ሗ','መ'=>'መ','ሙ'=>'ሙ','ሚ'=>'ሚ','ማ'=>'ማ','ሜ'=>'ሜ','ም'=>'ም','ሞ'=>'ሞ','ሟ'=>'ሟ','ሠ'=>'ሠ','ሡ'=>'ሡ','ሢ'=>'ሢ','ሣ'=>'ሣ','ሤ'=>'ሤ','ሥ'=>'ሥ','ሦ'=>'ሦ','ሧ'=>'ሧ','ረ'=>'ረ','ሩ'=>'ሩ','ሪ'=>'ሪ','ራ'=>'ራ','ሬ'=>'ሬ','ር'=>'ር','ሮ'=>'ሮ','ሯ'=>'ሯ','ሰ'=>'ሰ','ሱ'=>'ሱ','ሲ'=>'ሲ','ሳ'=>'ሳ','ሴ'=>'ሴ','ስ'=>'ስ','ሶ'=>'ሶ','ሷ'=>'ሷ','ሸ'=>'ሸ','ሹ'=>'ሹ','ሺ'=>'ሺ','ሻ'=>'ሻ','ሼ'=>'ሼ','ሽ'=>'ሽ','ሾ'=>'ሾ','ሿ'=>'ሿ','ቀ'=>'ቀ','ቁ'=>'ቁ','ቂ'=>'ቂ','ቃ'=>'ቃ','ቄ'=>'ቄ','ቅ'=>'ቅ','ቆ'=>'ቆ','ቇ'=>'ቇ','ቈ'=>'ቈ','ቊ'=>'ቊ','ቋ'=>'ቋ','ቌ'=>'ቌ','ቍ'=>'ቍ','ቐ'=>'ቐ','ቑ'=>'ቑ','ቒ'=>'ቒ','ቓ'=>'ቓ','ቔ'=>'ቔ','ቕ'=>'ቕ','ቖ'=>'ቖ','ቘ'=>'ቘ','ቚ'=>'ቚ','ቛ'=>'ቛ','ቜ'=>'ቜ','ቝ'=>'ቝ','በ'=>'በ','ቡ'=>'ቡ','ቢ'=>'ቢ','ባ'=>'ባ','ቤ'=>'ቤ','ብ'=>'ብ','ቦ'=>'ቦ','ቧ'=>'ቧ','ቨ'=>'ቨ','ቩ'=>'ቩ','ቪ'=>'ቪ','ቫ'=>'ቫ','ቬ'=>'ቬ','ቭ'=>'ቭ','ቮ'=>'ቮ','ቯ'=>'ቯ','ተ'=>'ተ','ቱ'=>'ቱ','ቲ'=>'ቲ','ታ'=>'ታ','ቴ'=>'ቴ','ት'=>'ት','ቶ'=>'ቶ','ቷ'=>'ቷ','ቸ'=>'ቸ','ቹ'=>'ቹ','ቺ'=>'ቺ','ቻ'=>'ቻ','ቼ'=>'ቼ','ች'=>'ች','ቾ'=>'ቾ','ቿ'=>'ቿ','ኀ'=>'ኀ','ኁ'=>'ኁ','ኂ'=>'ኂ','ኃ'=>'ኃ','ኄ'=>'ኄ','ኅ'=>'ኅ','ኆ'=>'ኆ','ኇ'=>'ኇ','ኈ'=>'ኈ','ኊ'=>'ኊ','ኋ'=>'ኋ','ኌ'=>'ኌ','ኍ'=>'ኍ','ነ'=>'ነ','ኑ'=>'ኑ','ኒ'=>'ኒ','ና'=>'ና','ኔ'=>'ኔ','ን'=>'ን','ኖ'=>'ኖ','ኗ'=>'ኗ','ኘ'=>'ኘ','ኙ'=>'ኙ','ኚ'=>'ኚ','ኛ'=>'ኛ','ኜ'=>'ኜ','ኝ'=>'ኝ','ኞ'=>'ኞ','ኟ'=>'ኟ','አ'=>'አ','ኡ'=>'ኡ','ኢ'=>'ኢ','ኣ'=>'ኣ','ኤ'=>'ኤ','እ'=>'እ','ኦ'=>'ኦ','ኧ'=>'ኧ','ከ'=>'ከ','ኩ'=>'ኩ','ኪ'=>'ኪ','ካ'=>'ካ','ኬ'=>'ኬ','ክ'=>'ክ','ኮ'=>'ኮ','ኯ'=>'ኯ','ኰ'=>'ኰ','ኲ'=>'ኲ','ኳ'=>'ኳ','ኴ'=>'ኴ','ኵ'=>'ኵ','ኸ'=>'ኸ','ኹ'=>'ኹ','ኺ'=>'ኺ','ኻ'=>'ኻ','ኼ'=>'ኼ','ኽ'=>'ኽ','ኾ'=>'ኾ','ዀ'=>'ዀ','ዂ'=>'ዂ','ዃ'=>'ዃ','ዄ'=>'ዄ','ዅ'=>'ዅ','ወ'=>'ወ','ዉ'=>'ዉ','ዊ'=>'ዊ','ዋ'=>'ዋ','ዌ'=>'ዌ','ው'=>'ው','ዎ'=>'ዎ','ዏ'=>'ዏ','ዐ'=>'ዐ','ዑ'=>'ዑ','ዒ'=>'ዒ','ዓ'=>'ዓ','ዔ'=>'ዔ','ዕ'=>'ዕ','ዖ'=>'ዖ','ዘ'=>'ዘ','ዙ'=>'ዙ','ዚ'=>'ዚ','ዛ'=>'ዛ','ዜ'=>'ዜ','ዝ'=>'ዝ','ዞ'=>'ዞ','ዟ'=>'ዟ','ዠ'=>'ዠ','ዡ'=>'ዡ','ዢ'=>'ዢ','ዣ'=>'ዣ','ዤ'=>'ዤ','ዥ'=>'ዥ','ዦ'=>'ዦ','ዧ'=>'ዧ','የ'=>'የ','ዩ'=>'ዩ','ዪ'=>'ዪ','ያ'=>'ያ','ዬ'=>'ዬ','ይ'=>'ይ','ዮ'=>'ዮ','ዯ'=>'ዯ','ደ'=>'ደ','ዱ'=>'ዱ','ዲ'=>'ዲ','ዳ'=>'ዳ','ዴ'=>'ዴ','ድ'=>'ድ','ዶ'=>'ዶ','ዷ'=>'ዷ','ዸ'=>'ዸ','ዹ'=>'ዹ','ዺ'=>'ዺ','ዻ'=>'ዻ','ዼ'=>'ዼ','ዽ'=>'ዽ','ዾ'=>'ዾ','ዿ'=>'ዿ','ጀ'=>'ጀ','ጁ'=>'ጁ','ጂ'=>'ጂ','ጃ'=>'ጃ','ጄ'=>'ጄ','ጅ'=>'ጅ','ጆ'=>'ጆ','ጇ'=>'ጇ','ገ'=>'ገ','ጉ'=>'ጉ','ጊ'=>'ጊ','ጋ'=>'ጋ','ጌ'=>'ጌ','ግ'=>'ግ','ጎ'=>'ጎ','ጏ'=>'ጏ','ጐ'=>'ጐ','ጒ'=>'ጒ','ጓ'=>'ጓ','ጔ'=>'ጔ','ጕ'=>'ጕ','ጘ'=>'ጘ','ጙ'=>'ጙ','ጚ'=>'ጚ','ጛ'=>'ጛ','ጜ'=>'ጜ','ጝ'=>'ጝ','ጞ'=>'ጞ','ጟ'=>'ጟ','ጠ'=>'ጠ','ጡ'=>'ጡ','ጢ'=>'ጢ','ጣ'=>'ጣ','ጤ'=>'ጤ','ጥ'=>'ጥ','ጦ'=>'ጦ','ጧ'=>'ጧ','ጨ'=>'ጨ','ጩ'=>'ጩ','ጪ'=>'ጪ','ጫ'=>'ጫ','ጬ'=>'ጬ','ጭ'=>'ጭ','ጮ'=>'ጮ','ጯ'=>'ጯ','ጰ'=>'ጰ','ጱ'=>'ጱ','ጲ'=>'ጲ','ጳ'=>'ጳ','ጴ'=>'ጴ','ጵ'=>'ጵ','ጶ'=>'ጶ','ጷ'=>'ጷ','ጸ'=>'ጸ','ጹ'=>'ጹ','ጺ'=>'ጺ','ጻ'=>'ጻ','ጼ'=>'ጼ','ጽ'=>'ጽ','ጾ'=>'ጾ','ጿ'=>'ጿ','ፀ'=>'ፀ','ፁ'=>'ፁ','ፂ'=>'ፂ','ፃ'=>'ፃ','ፄ'=>'ፄ','ፅ'=>'ፅ','ፆ'=>'ፆ','ፇ'=>'ፇ','ፈ'=>'ፈ','ፉ'=>'ፉ','ፊ'=>'ፊ','ፋ'=>'ፋ','ፌ'=>'ፌ','ፍ'=>'ፍ','ፎ'=>'ፎ','ፏ'=>'ፏ','ፐ'=>'ፐ','ፑ'=>'ፑ','ፒ'=>'ፒ','ፓ'=>'ፓ','ፔ'=>'ፔ','ፕ'=>'ፕ','ፖ'=>'ፖ','ፗ'=>'ፗ','ፘ'=>'ፘ','ፙ'=>'ፙ','ፚ'=>'ፚ','፟'=>'፟','፩'=>'1','፪'=>'2','፫'=>'3','፬'=>'4','፭'=>'5','፮'=>'6','፯'=>'7','፰'=>'8','፱'=>'9','፲'=>'10','፳'=>'20','፴'=>'30','፵'=>'40','፶'=>'50','፷'=>'60','፸'=>'70','፹'=>'80','፺'=>'90','፻'=>'100','፼'=>'10000','ᎀ'=>'ᎀ','ᎁ'=>'ᎁ','ᎂ'=>'ᎂ','ᎃ'=>'ᎃ','ᎄ'=>'ᎄ','ᎅ'=>'ᎅ','ᎆ'=>'ᎆ','ᎇ'=>'ᎇ','ᎈ'=>'ᎈ','ᎉ'=>'ᎉ','ᎊ'=>'ᎊ','ᎋ'=>'ᎋ','ᎌ'=>'ᎌ','ᎍ'=>'ᎍ','ᎎ'=>'ᎎ','ᎏ'=>'ᎏ','Ꭰ'=>'Ꭰ','Ꭱ'=>'Ꭱ','Ꭲ'=>'Ꭲ','Ꭳ'=>'Ꭳ','Ꭴ'=>'Ꭴ','Ꭵ'=>'Ꭵ','Ꭶ'=>'Ꭶ','Ꭷ'=>'Ꭷ','Ꭸ'=>'Ꭸ','Ꭹ'=>'Ꭹ','Ꭺ'=>'Ꭺ','Ꭻ'=>'Ꭻ','Ꭼ'=>'Ꭼ','Ꭽ'=>'Ꭽ','Ꭾ'=>'Ꭾ','Ꭿ'=>'Ꭿ','Ꮀ'=>'Ꮀ','Ꮁ'=>'Ꮁ','Ꮂ'=>'Ꮂ','Ꮃ'=>'Ꮃ','Ꮄ'=>'Ꮄ','Ꮅ'=>'Ꮅ','Ꮆ'=>'Ꮆ','Ꮇ'=>'Ꮇ','Ꮈ'=>'Ꮈ','Ꮉ'=>'Ꮉ','Ꮊ'=>'Ꮊ','Ꮋ'=>'Ꮋ','Ꮌ'=>'Ꮌ','Ꮍ'=>'Ꮍ','Ꮎ'=>'Ꮎ','Ꮏ'=>'Ꮏ','Ꮐ'=>'Ꮐ','Ꮑ'=>'Ꮑ','Ꮒ'=>'Ꮒ','Ꮓ'=>'Ꮓ','Ꮔ'=>'Ꮔ','Ꮕ'=>'Ꮕ','Ꮖ'=>'Ꮖ','Ꮗ'=>'Ꮗ','Ꮘ'=>'Ꮘ','Ꮙ'=>'Ꮙ','Ꮚ'=>'Ꮚ','Ꮛ'=>'Ꮛ','Ꮜ'=>'Ꮜ','Ꮝ'=>'Ꮝ','Ꮞ'=>'Ꮞ','Ꮟ'=>'Ꮟ','Ꮠ'=>'Ꮠ','Ꮡ'=>'Ꮡ','Ꮢ'=>'Ꮢ','Ꮣ'=>'Ꮣ','Ꮤ'=>'Ꮤ','Ꮥ'=>'Ꮥ','Ꮦ'=>'Ꮦ','Ꮧ'=>'Ꮧ','Ꮨ'=>'Ꮨ','Ꮩ'=>'Ꮩ','Ꮪ'=>'Ꮪ','Ꮫ'=>'Ꮫ','Ꮬ'=>'Ꮬ','Ꮭ'=>'Ꮭ','Ꮮ'=>'Ꮮ','Ꮯ'=>'Ꮯ','Ꮰ'=>'Ꮰ','Ꮱ'=>'Ꮱ','Ꮲ'=>'Ꮲ','Ꮳ'=>'Ꮳ','Ꮴ'=>'Ꮴ','Ꮵ'=>'Ꮵ','Ꮶ'=>'Ꮶ','Ꮷ'=>'Ꮷ','Ꮸ'=>'Ꮸ','Ꮹ'=>'Ꮹ','Ꮺ'=>'Ꮺ','Ꮻ'=>'Ꮻ','Ꮼ'=>'Ꮼ','Ꮽ'=>'Ꮽ','Ꮾ'=>'Ꮾ','Ꮿ'=>'Ꮿ','Ᏸ'=>'Ᏸ','Ᏹ'=>'Ᏹ','Ᏺ'=>'Ᏺ','Ᏻ'=>'Ᏻ','Ᏼ'=>'Ᏼ','ᐁ'=>'ᐁ','ᐂ'=>'ᐂ','ᐃ'=>'ᐃ','ᐄ'=>'ᐄ','ᐅ'=>'ᐅ','ᐆ'=>'ᐆ','ᐇ'=>'ᐇ','ᐈ'=>'ᐈ','ᐉ'=>'ᐉ','ᐊ'=>'ᐊ','ᐋ'=>'ᐋ','ᐌ'=>'ᐌ','ᐍ'=>'ᐍ','ᐎ'=>'ᐎ','ᐏ'=>'ᐏ','ᐐ'=>'ᐐ','ᐑ'=>'ᐑ','ᐒ'=>'ᐒ','ᐓ'=>'ᐓ','ᐔ'=>'ᐔ','ᐕ'=>'ᐕ','ᐖ'=>'ᐖ','ᐗ'=>'ᐗ','ᐘ'=>'ᐘ','ᐙ'=>'ᐙ','ᐚ'=>'ᐚ','ᐛ'=>'ᐛ','ᐜ'=>'ᐜ','ᐝ'=>'ᐝ','ᐞ'=>'ᐞ','ᐟ'=>'ᐟ','ᐠ'=>'ᐠ','ᐡ'=>'ᐡ','ᐢ'=>'ᐢ','ᐣ'=>'ᐣ','ᐤ'=>'ᐤ','ᐥ'=>'ᐥ','ᐦ'=>'ᐦ','ᐧ'=>'ᐧ','ᐨ'=>'ᐨ','ᐩ'=>'ᐩ','ᐪ'=>'ᐪ','ᐫ'=>'ᐫ','ᐬ'=>'ᐬ','ᐭ'=>'ᐭ','ᐮ'=>'ᐮ','ᐯ'=>'ᐯ','ᐰ'=>'ᐰ','ᐱ'=>'ᐱ','ᐲ'=>'ᐲ','ᐳ'=>'ᐳ','ᐴ'=>'ᐴ','ᐵ'=>'ᐵ','ᐶ'=>'ᐶ','ᐷ'=>'ᐷ','ᐸ'=>'ᐸ','ᐹ'=>'ᐹ','ᐺ'=>'ᐺ','ᐻ'=>'ᐻ','ᐼ'=>'ᐼ','ᐽ'=>'ᐽ','ᐾ'=>'ᐾ','ᐿ'=>'ᐿ','ᑀ'=>'ᑀ','ᑁ'=>'ᑁ','ᑂ'=>'ᑂ','ᑃ'=>'ᑃ','ᑄ'=>'ᑄ','ᑅ'=>'ᑅ','ᑆ'=>'ᑆ','ᑇ'=>'ᑇ','ᑈ'=>'ᑈ','ᑉ'=>'ᑉ','ᑊ'=>'ᑊ','ᑋ'=>'ᑋ','ᑌ'=>'ᑌ','ᑍ'=>'ᑍ','ᑎ'=>'ᑎ','ᑏ'=>'ᑏ','ᑐ'=>'ᑐ','ᑑ'=>'ᑑ','ᑒ'=>'ᑒ','ᑓ'=>'ᑓ','ᑔ'=>'ᑔ','ᑕ'=>'ᑕ','ᑖ'=>'ᑖ','ᑗ'=>'ᑗ','ᑘ'=>'ᑘ','ᑙ'=>'ᑙ','ᑚ'=>'ᑚ','ᑛ'=>'ᑛ','ᑜ'=>'ᑜ','ᑝ'=>'ᑝ','ᑞ'=>'ᑞ','ᑟ'=>'ᑟ','ᑠ'=>'ᑠ','ᑡ'=>'ᑡ','ᑢ'=>'ᑢ','ᑣ'=>'ᑣ','ᑤ'=>'ᑤ','ᑥ'=>'ᑥ','ᑦ'=>'ᑦ','ᑧ'=>'ᑧ','ᑨ'=>'ᑨ','ᑩ'=>'ᑩ','ᑪ'=>'ᑪ','ᑫ'=>'ᑫ','ᑬ'=>'ᑬ','ᑭ'=>'ᑭ','ᑮ'=>'ᑮ','ᑯ'=>'ᑯ','ᑰ'=>'ᑰ','ᑱ'=>'ᑱ','ᑲ'=>'ᑲ','ᑳ'=>'ᑳ','ᑴ'=>'ᑴ','ᑵ'=>'ᑵ','ᑶ'=>'ᑶ','ᑷ'=>'ᑷ','ᑸ'=>'ᑸ','ᑹ'=>'ᑹ','ᑺ'=>'ᑺ','ᑻ'=>'ᑻ','ᑼ'=>'ᑼ','ᑽ'=>'ᑽ','ᑾ'=>'ᑾ','ᑿ'=>'ᑿ','ᒀ'=>'ᒀ','ᒁ'=>'ᒁ','ᒂ'=>'ᒂ','ᒃ'=>'ᒃ','ᒄ'=>'ᒄ','ᒅ'=>'ᒅ','ᒆ'=>'ᒆ','ᒇ'=>'ᒇ','ᒈ'=>'ᒈ','ᒉ'=>'ᒉ','ᒊ'=>'ᒊ','ᒋ'=>'ᒋ','ᒌ'=>'ᒌ','ᒍ'=>'ᒍ','ᒎ'=>'ᒎ','ᒏ'=>'ᒏ','ᒐ'=>'ᒐ','ᒑ'=>'ᒑ','ᒒ'=>'ᒒ','ᒓ'=>'ᒓ','ᒔ'=>'ᒔ','ᒕ'=>'ᒕ','ᒖ'=>'ᒖ','ᒗ'=>'ᒗ','ᒘ'=>'ᒘ','ᒙ'=>'ᒙ','ᒚ'=>'ᒚ','ᒛ'=>'ᒛ','ᒜ'=>'ᒜ','ᒝ'=>'ᒝ','ᒞ'=>'ᒞ','ᒟ'=>'ᒟ','ᒠ'=>'ᒠ','ᒡ'=>'ᒡ','ᒢ'=>'ᒢ','ᒣ'=>'ᒣ','ᒤ'=>'ᒤ','ᒥ'=>'ᒥ','ᒦ'=>'ᒦ','ᒧ'=>'ᒧ','ᒨ'=>'ᒨ','ᒩ'=>'ᒩ','ᒪ'=>'ᒪ','ᒫ'=>'ᒫ','ᒬ'=>'ᒬ','ᒭ'=>'ᒭ','ᒮ'=>'ᒮ','ᒯ'=>'ᒯ','ᒰ'=>'ᒰ','ᒱ'=>'ᒱ','ᒲ'=>'ᒲ','ᒳ'=>'ᒳ','ᒴ'=>'ᒴ','ᒵ'=>'ᒵ','ᒶ'=>'ᒶ','ᒷ'=>'ᒷ','ᒸ'=>'ᒸ','ᒹ'=>'ᒹ','ᒺ'=>'ᒺ','ᒻ'=>'ᒻ','ᒼ'=>'ᒼ','ᒽ'=>'ᒽ','ᒾ'=>'ᒾ','ᒿ'=>'ᒿ','ᓀ'=>'ᓀ','ᓁ'=>'ᓁ','ᓂ'=>'ᓂ','ᓃ'=>'ᓃ','ᓄ'=>'ᓄ','ᓅ'=>'ᓅ','ᓆ'=>'ᓆ','ᓇ'=>'ᓇ','ᓈ'=>'ᓈ','ᓉ'=>'ᓉ','ᓊ'=>'ᓊ','ᓋ'=>'ᓋ','ᓌ'=>'ᓌ','ᓍ'=>'ᓍ','ᓎ'=>'ᓎ','ᓏ'=>'ᓏ','ᓐ'=>'ᓐ','ᓑ'=>'ᓑ','ᓒ'=>'ᓒ','ᓓ'=>'ᓓ','ᓔ'=>'ᓔ','ᓕ'=>'ᓕ','ᓖ'=>'ᓖ','ᓗ'=>'ᓗ','ᓘ'=>'ᓘ','ᓙ'=>'ᓙ','ᓚ'=>'ᓚ','ᓛ'=>'ᓛ','ᓜ'=>'ᓜ','ᓝ'=>'ᓝ','ᓞ'=>'ᓞ','ᓟ'=>'ᓟ','ᓠ'=>'ᓠ','ᓡ'=>'ᓡ','ᓢ'=>'ᓢ','ᓣ'=>'ᓣ','ᓤ'=>'ᓤ','ᓥ'=>'ᓥ','ᓦ'=>'ᓦ','ᓧ'=>'ᓧ','ᓨ'=>'ᓨ','ᓩ'=>'ᓩ','ᓪ'=>'ᓪ','ᓫ'=>'ᓫ','ᓬ'=>'ᓬ','ᓭ'=>'ᓭ','ᓮ'=>'ᓮ','ᓯ'=>'ᓯ','ᓰ'=>'ᓰ','ᓱ'=>'ᓱ','ᓲ'=>'ᓲ','ᓳ'=>'ᓳ','ᓴ'=>'ᓴ','ᓵ'=>'ᓵ','ᓶ'=>'ᓶ','ᓷ'=>'ᓷ','ᓸ'=>'ᓸ','ᓹ'=>'ᓹ','ᓺ'=>'ᓺ','ᓻ'=>'ᓻ','ᓼ'=>'ᓼ','ᓽ'=>'ᓽ','ᓾ'=>'ᓾ','ᓿ'=>'ᓿ','ᔀ'=>'ᔀ','ᔁ'=>'ᔁ','ᔂ'=>'ᔂ','ᔃ'=>'ᔃ','ᔄ'=>'ᔄ','ᔅ'=>'ᔅ','ᔆ'=>'ᔆ','ᔇ'=>'ᔇ','ᔈ'=>'ᔈ','ᔉ'=>'ᔉ','ᔊ'=>'ᔊ','ᔋ'=>'ᔋ','ᔌ'=>'ᔌ','ᔍ'=>'ᔍ','ᔎ'=>'ᔎ','ᔏ'=>'ᔏ','ᔐ'=>'ᔐ','ᔑ'=>'ᔑ','ᔒ'=>'ᔒ','ᔓ'=>'ᔓ','ᔔ'=>'ᔔ','ᔕ'=>'ᔕ','ᔖ'=>'ᔖ','ᔗ'=>'ᔗ','ᔘ'=>'ᔘ','ᔙ'=>'ᔙ','ᔚ'=>'ᔚ','ᔛ'=>'ᔛ','ᔜ'=>'ᔜ','ᔝ'=>'ᔝ','ᔞ'=>'ᔞ','ᔟ'=>'ᔟ','ᔠ'=>'ᔠ','ᔡ'=>'ᔡ','ᔢ'=>'ᔢ','ᔣ'=>'ᔣ','ᔤ'=>'ᔤ','ᔥ'=>'ᔥ','ᔦ'=>'ᔦ','ᔧ'=>'ᔧ','ᔨ'=>'ᔨ','ᔩ'=>'ᔩ','ᔪ'=>'ᔪ','ᔫ'=>'ᔫ','ᔬ'=>'ᔬ','ᔭ'=>'ᔭ','ᔮ'=>'ᔮ','ᔯ'=>'ᔯ','ᔰ'=>'ᔰ','ᔱ'=>'ᔱ','ᔲ'=>'ᔲ','ᔳ'=>'ᔳ','ᔴ'=>'ᔴ','ᔵ'=>'ᔵ','ᔶ'=>'ᔶ','ᔷ'=>'ᔷ','ᔸ'=>'ᔸ','ᔹ'=>'ᔹ','ᔺ'=>'ᔺ','ᔻ'=>'ᔻ','ᔼ'=>'ᔼ','ᔽ'=>'ᔽ','ᔾ'=>'ᔾ','ᔿ'=>'ᔿ','ᕀ'=>'ᕀ','ᕁ'=>'ᕁ','ᕂ'=>'ᕂ','ᕃ'=>'ᕃ','ᕄ'=>'ᕄ','ᕅ'=>'ᕅ','ᕆ'=>'ᕆ','ᕇ'=>'ᕇ','ᕈ'=>'ᕈ','ᕉ'=>'ᕉ','ᕊ'=>'ᕊ','ᕋ'=>'ᕋ','ᕌ'=>'ᕌ','ᕍ'=>'ᕍ','ᕎ'=>'ᕎ','ᕏ'=>'ᕏ','ᕐ'=>'ᕐ','ᕑ'=>'ᕑ','ᕒ'=>'ᕒ','ᕓ'=>'ᕓ','ᕔ'=>'ᕔ','ᕕ'=>'ᕕ','ᕖ'=>'ᕖ','ᕗ'=>'ᕗ','ᕘ'=>'ᕘ','ᕙ'=>'ᕙ','ᕚ'=>'ᕚ','ᕛ'=>'ᕛ','ᕜ'=>'ᕜ','ᕝ'=>'ᕝ','ᕞ'=>'ᕞ','ᕟ'=>'ᕟ','ᕠ'=>'ᕠ','ᕡ'=>'ᕡ','ᕢ'=>'ᕢ','ᕣ'=>'ᕣ','ᕤ'=>'ᕤ','ᕥ'=>'ᕥ','ᕦ'=>'ᕦ','ᕧ'=>'ᕧ','ᕨ'=>'ᕨ','ᕩ'=>'ᕩ','ᕪ'=>'ᕪ','ᕫ'=>'ᕫ','ᕬ'=>'ᕬ','ᕭ'=>'ᕭ','ᕮ'=>'ᕮ','ᕯ'=>'ᕯ','ᕰ'=>'ᕰ','ᕱ'=>'ᕱ','ᕲ'=>'ᕲ','ᕳ'=>'ᕳ','ᕴ'=>'ᕴ','ᕵ'=>'ᕵ','ᕶ'=>'ᕶ','ᕷ'=>'ᕷ','ᕸ'=>'ᕸ','ᕹ'=>'ᕹ','ᕺ'=>'ᕺ','ᕻ'=>'ᕻ','ᕼ'=>'ᕼ','ᕽ'=>'ᕽ','ᕾ'=>'ᕾ','ᕿ'=>'ᕿ','ᖀ'=>'ᖀ','ᖁ'=>'ᖁ','ᖂ'=>'ᖂ','ᖃ'=>'ᖃ','ᖄ'=>'ᖄ','ᖅ'=>'ᖅ','ᖆ'=>'ᖆ','ᖇ'=>'ᖇ','ᖈ'=>'ᖈ','ᖉ'=>'ᖉ','ᖊ'=>'ᖊ','ᖋ'=>'ᖋ','ᖌ'=>'ᖌ','ᖍ'=>'ᖍ','ᖎ'=>'ᖎ','ᖏ'=>'ᖏ','ᖐ'=>'ᖐ','ᖑ'=>'ᖑ','ᖒ'=>'ᖒ','ᖓ'=>'ᖓ','ᖔ'=>'ᖔ','ᖕ'=>'ᖕ','ᖖ'=>'ᖖ','ᖗ'=>'ᖗ','ᖘ'=>'ᖘ','ᖙ'=>'ᖙ','ᖚ'=>'ᖚ','ᖛ'=>'ᖛ','ᖜ'=>'ᖜ','ᖝ'=>'ᖝ','ᖞ'=>'ᖞ','ᖟ'=>'ᖟ','ᖠ'=>'ᖠ','ᖡ'=>'ᖡ','ᖢ'=>'ᖢ','ᖣ'=>'ᖣ','ᖤ'=>'ᖤ','ᖥ'=>'ᖥ','ᖦ'=>'ᖦ','ᖧ'=>'ᖧ','ᖨ'=>'ᖨ','ᖩ'=>'ᖩ','ᖪ'=>'ᖪ','ᖫ'=>'ᖫ','ᖬ'=>'ᖬ','ᖭ'=>'ᖭ','ᖮ'=>'ᖮ','ᖯ'=>'ᖯ','ᖰ'=>'ᖰ','ᖱ'=>'ᖱ','ᖲ'=>'ᖲ','ᖳ'=>'ᖳ','ᖴ'=>'ᖴ','ᖵ'=>'ᖵ','ᖶ'=>'ᖶ','ᖷ'=>'ᖷ','ᖸ'=>'ᖸ','ᖹ'=>'ᖹ','ᖺ'=>'ᖺ','ᖻ'=>'ᖻ','ᖼ'=>'ᖼ','ᖽ'=>'ᖽ','ᖾ'=>'ᖾ','ᖿ'=>'ᖿ','ᗀ'=>'ᗀ','ᗁ'=>'ᗁ','ᗂ'=>'ᗂ','ᗃ'=>'ᗃ','ᗄ'=>'ᗄ','ᗅ'=>'ᗅ','ᗆ'=>'ᗆ','ᗇ'=>'ᗇ','ᗈ'=>'ᗈ','ᗉ'=>'ᗉ','ᗊ'=>'ᗊ','ᗋ'=>'ᗋ','ᗌ'=>'ᗌ','ᗍ'=>'ᗍ','ᗎ'=>'ᗎ','ᗏ'=>'ᗏ','ᗐ'=>'ᗐ','ᗑ'=>'ᗑ','ᗒ'=>'ᗒ','ᗓ'=>'ᗓ','ᗔ'=>'ᗔ','ᗕ'=>'ᗕ','ᗖ'=>'ᗖ','ᗗ'=>'ᗗ','ᗘ'=>'ᗘ','ᗙ'=>'ᗙ','ᗚ'=>'ᗚ','ᗛ'=>'ᗛ','ᗜ'=>'ᗜ','ᗝ'=>'ᗝ','ᗞ'=>'ᗞ','ᗟ'=>'ᗟ','ᗠ'=>'ᗠ','ᗡ'=>'ᗡ','ᗢ'=>'ᗢ','ᗣ'=>'ᗣ','ᗤ'=>'ᗤ','ᗥ'=>'ᗥ','ᗦ'=>'ᗦ','ᗧ'=>'ᗧ','ᗨ'=>'ᗨ','ᗩ'=>'ᗩ','ᗪ'=>'ᗪ','ᗫ'=>'ᗫ','ᗬ'=>'ᗬ','ᗭ'=>'ᗭ','ᗮ'=>'ᗮ','ᗯ'=>'ᗯ','ᗰ'=>'ᗰ','ᗱ'=>'ᗱ','ᗲ'=>'ᗲ','ᗳ'=>'ᗳ','ᗴ'=>'ᗴ','ᗵ'=>'ᗵ','ᗶ'=>'ᗶ','ᗷ'=>'ᗷ','ᗸ'=>'ᗸ','ᗹ'=>'ᗹ','ᗺ'=>'ᗺ','ᗻ'=>'ᗻ','ᗼ'=>'ᗼ','ᗽ'=>'ᗽ','ᗾ'=>'ᗾ','ᗿ'=>'ᗿ','ᘀ'=>'ᘀ','ᘁ'=>'ᘁ','ᘂ'=>'ᘂ','ᘃ'=>'ᘃ','ᘄ'=>'ᘄ','ᘅ'=>'ᘅ','ᘆ'=>'ᘆ','ᘇ'=>'ᘇ','ᘈ'=>'ᘈ','ᘉ'=>'ᘉ','ᘊ'=>'ᘊ','ᘋ'=>'ᘋ','ᘌ'=>'ᘌ','ᘍ'=>'ᘍ','ᘎ'=>'ᘎ','ᘏ'=>'ᘏ','ᘐ'=>'ᘐ','ᘑ'=>'ᘑ','ᘒ'=>'ᘒ','ᘓ'=>'ᘓ','ᘔ'=>'ᘔ','ᘕ'=>'ᘕ','ᘖ'=>'ᘖ','ᘗ'=>'ᘗ','ᘘ'=>'ᘘ','ᘙ'=>'ᘙ','ᘚ'=>'ᘚ','ᘛ'=>'ᘛ','ᘜ'=>'ᘜ','ᘝ'=>'ᘝ','ᘞ'=>'ᘞ','ᘟ'=>'ᘟ','ᘠ'=>'ᘠ','ᘡ'=>'ᘡ','ᘢ'=>'ᘢ','ᘣ'=>'ᘣ','ᘤ'=>'ᘤ','ᘥ'=>'ᘥ','ᘦ'=>'ᘦ','ᘧ'=>'ᘧ','ᘨ'=>'ᘨ','ᘩ'=>'ᘩ','ᘪ'=>'ᘪ','ᘫ'=>'ᘫ','ᘬ'=>'ᘬ','ᘭ'=>'ᘭ','ᘮ'=>'ᘮ','ᘯ'=>'ᘯ','ᘰ'=>'ᘰ','ᘱ'=>'ᘱ','ᘲ'=>'ᘲ','ᘳ'=>'ᘳ','ᘴ'=>'ᘴ','ᘵ'=>'ᘵ','ᘶ'=>'ᘶ','ᘷ'=>'ᘷ','ᘸ'=>'ᘸ','ᘹ'=>'ᘹ','ᘺ'=>'ᘺ','ᘻ'=>'ᘻ','ᘼ'=>'ᘼ','ᘽ'=>'ᘽ','ᘾ'=>'ᘾ','ᘿ'=>'ᘿ','ᙀ'=>'ᙀ','ᙁ'=>'ᙁ','ᙂ'=>'ᙂ','ᙃ'=>'ᙃ','ᙄ'=>'ᙄ','ᙅ'=>'ᙅ','ᙆ'=>'ᙆ','ᙇ'=>'ᙇ','ᙈ'=>'ᙈ','ᙉ'=>'ᙉ','ᙊ'=>'ᙊ','ᙋ'=>'ᙋ','ᙌ'=>'ᙌ','ᙍ'=>'ᙍ','ᙎ'=>'ᙎ','ᙏ'=>'ᙏ','ᙐ'=>'ᙐ','ᙑ'=>'ᙑ','ᙒ'=>'ᙒ','ᙓ'=>'ᙓ','ᙔ'=>'ᙔ','ᙕ'=>'ᙕ','ᙖ'=>'ᙖ','ᙗ'=>'ᙗ','ᙘ'=>'ᙘ','ᙙ'=>'ᙙ','ᙚ'=>'ᙚ','ᙛ'=>'ᙛ','ᙜ'=>'ᙜ','ᙝ'=>'ᙝ','ᙞ'=>'ᙞ','ᙟ'=>'ᙟ','ᙠ'=>'ᙠ','ᙡ'=>'ᙡ','ᙢ'=>'ᙢ','ᙣ'=>'ᙣ','ᙤ'=>'ᙤ','ᙥ'=>'ᙥ','ᙦ'=>'ᙦ','ᙧ'=>'ᙧ','ᙨ'=>'ᙨ','ᙩ'=>'ᙩ','ᙪ'=>'ᙪ','ᙫ'=>'ᙫ','ᙬ'=>'ᙬ','ᙯ'=>'ᙯ','ᙰ'=>'ᙰ','ᙱ'=>'ᙱ','ᙲ'=>'ᙲ','ᙳ'=>'ᙳ','ᙴ'=>'ᙴ','ᙵ'=>'ᙵ','ᙶ'=>'ᙶ','ᚁ'=>'ᚁ','ᚂ'=>'ᚂ','ᚃ'=>'ᚃ','ᚄ'=>'ᚄ','ᚅ'=>'ᚅ','ᚆ'=>'ᚆ','ᚇ'=>'ᚇ','ᚈ'=>'ᚈ','ᚉ'=>'ᚉ','ᚊ'=>'ᚊ','ᚋ'=>'ᚋ','ᚌ'=>'ᚌ','ᚍ'=>'ᚍ','ᚎ'=>'ᚎ','ᚏ'=>'ᚏ','ᚐ'=>'ᚐ','ᚑ'=>'ᚑ','ᚒ'=>'ᚒ','ᚓ'=>'ᚓ','ᚔ'=>'ᚔ','ᚕ'=>'ᚕ','ᚖ'=>'ᚖ','ᚗ'=>'ᚗ','ᚘ'=>'ᚘ','ᚙ'=>'ᚙ','ᚚ'=>'ᚚ','ᚠ'=>'ᚠ','ᚡ'=>'ᚡ','ᚢ'=>'ᚢ','ᚣ'=>'ᚣ','ᚤ'=>'ᚤ','ᚥ'=>'ᚥ','ᚦ'=>'ᚦ','ᚧ'=>'ᚧ','ᚨ'=>'ᚨ','ᚩ'=>'ᚩ','ᚪ'=>'ᚪ','ᚫ'=>'ᚫ','ᚬ'=>'ᚬ','ᚭ'=>'ᚭ','ᚮ'=>'ᚮ','ᚯ'=>'ᚯ','ᚰ'=>'ᚰ','ᚱ'=>'ᚱ','ᚲ'=>'ᚲ','ᚳ'=>'ᚳ','ᚴ'=>'ᚴ','ᚵ'=>'ᚵ','ᚶ'=>'ᚶ','ᚷ'=>'ᚷ','ᚸ'=>'ᚸ','ᚹ'=>'ᚹ','ᚺ'=>'ᚺ','ᚻ'=>'ᚻ','ᚼ'=>'ᚼ','ᚽ'=>'ᚽ','ᚾ'=>'ᚾ','ᚿ'=>'ᚿ','ᛀ'=>'ᛀ','ᛁ'=>'ᛁ','ᛂ'=>'ᛂ','ᛃ'=>'ᛃ','ᛄ'=>'ᛄ','ᛅ'=>'ᛅ','ᛆ'=>'ᛆ','ᛇ'=>'ᛇ','ᛈ'=>'ᛈ','ᛉ'=>'ᛉ','ᛊ'=>'ᛊ','ᛋ'=>'ᛋ','ᛌ'=>'ᛌ','ᛍ'=>'ᛍ','ᛎ'=>'ᛎ','ᛏ'=>'ᛏ','ᛐ'=>'ᛐ','ᛑ'=>'ᛑ','ᛒ'=>'ᛒ','ᛓ'=>'ᛓ','ᛔ'=>'ᛔ','ᛕ'=>'ᛕ','ᛖ'=>'ᛖ','ᛗ'=>'ᛗ','ᛘ'=>'ᛘ','ᛙ'=>'ᛙ','ᛚ'=>'ᛚ','ᛛ'=>'ᛛ','ᛜ'=>'ᛜ','ᛝ'=>'ᛝ','ᛞ'=>'ᛞ','ᛟ'=>'ᛟ','ᛠ'=>'ᛠ','ᛡ'=>'ᛡ','ᛢ'=>'ᛢ','ᛣ'=>'ᛣ','ᛤ'=>'ᛤ','ᛥ'=>'ᛥ','ᛦ'=>'ᛦ','ᛧ'=>'ᛧ','ᛨ'=>'ᛨ','ᛩ'=>'ᛩ','ᛪ'=>'ᛪ','ᛮ'=>'17','ᛯ'=>'18','ᛰ'=>'19','ᜀ'=>'ᜀ','ᜁ'=>'ᜁ','ᜂ'=>'ᜂ','ᜃ'=>'ᜃ','ᜄ'=>'ᜄ','ᜅ'=>'ᜅ','ᜆ'=>'ᜆ','ᜇ'=>'ᜇ','ᜈ'=>'ᜈ','ᜉ'=>'ᜉ','ᜊ'=>'ᜊ','ᜋ'=>'ᜋ','ᜌ'=>'ᜌ','ᜎ'=>'ᜎ','ᜏ'=>'ᜏ','ᜐ'=>'ᜐ','ᜑ'=>'ᜑ','ᜒ'=>'ᜒ','ᜓ'=>'ᜓ','᜔'=>'᜔','ᜠ'=>'ᜠ','ᜡ'=>'ᜡ','ᜢ'=>'ᜢ','ᜣ'=>'ᜣ','ᜤ'=>'ᜤ','ᜥ'=>'ᜥ','ᜦ'=>'ᜦ','ᜧ'=>'ᜧ','ᜨ'=>'ᜨ','ᜩ'=>'ᜩ','ᜪ'=>'ᜪ','ᜫ'=>'ᜫ','ᜬ'=>'ᜬ','ᜭ'=>'ᜭ','ᜮ'=>'ᜮ','ᜯ'=>'ᜯ','ᜰ'=>'ᜰ','ᜱ'=>'ᜱ','ᜲ'=>'ᜲ','ᜳ'=>'ᜳ','᜴'=>'᜴','ᝀ'=>'ᝀ','ᝁ'=>'ᝁ','ᝂ'=>'ᝂ','ᝃ'=>'ᝃ','ᝄ'=>'ᝄ','ᝅ'=>'ᝅ','ᝆ'=>'ᝆ','ᝇ'=>'ᝇ','ᝈ'=>'ᝈ','ᝉ'=>'ᝉ','ᝊ'=>'ᝊ','ᝋ'=>'ᝋ','ᝌ'=>'ᝌ','ᝍ'=>'ᝍ','ᝎ'=>'ᝎ','ᝏ'=>'ᝏ','ᝐ'=>'ᝐ','ᝑ'=>'ᝑ','ᝒ'=>'ᝒ','ᝓ'=>'ᝓ','ᝠ'=>'ᝠ','ᝡ'=>'ᝡ','ᝢ'=>'ᝢ','ᝣ'=>'ᝣ','ᝤ'=>'ᝤ','ᝥ'=>'ᝥ','ᝦ'=>'ᝦ','ᝧ'=>'ᝧ','ᝨ'=>'ᝨ','ᝩ'=>'ᝩ','ᝪ'=>'ᝪ','ᝫ'=>'ᝫ','ᝬ'=>'ᝬ','ᝮ'=>'ᝮ','ᝯ'=>'ᝯ','ᝰ'=>'ᝰ','ᝲ'=>'ᝲ','ᝳ'=>'ᝳ','ក'=>'ក','ខ'=>'ខ','គ'=>'គ','ឃ'=>'ឃ','ង'=>'ង','ច'=>'ច','ឆ'=>'ឆ','ជ'=>'ជ','ឈ'=>'ឈ','ញ'=>'ញ','ដ'=>'ដ','ឋ'=>'ឋ','ឌ'=>'ឌ','ឍ'=>'ឍ','ណ'=>'ណ','ត'=>'ត','ថ'=>'ថ','ទ'=>'ទ','ធ'=>'ធ','ន'=>'ន','ប'=>'ប','ផ'=>'ផ','ព'=>'ព','ភ'=>'ភ','ម'=>'ម','យ'=>'យ','រ'=>'រ','ល'=>'ល','វ'=>'វ','ឝ'=>'ឝ','ឞ'=>'ឞ','ស'=>'ស','ហ'=>'ហ','ឡ'=>'ឡ','អ'=>'អ','ឣ'=>'ឣ','ឤ'=>'ឤ','ឥ'=>'ឥ','ឦ'=>'ឦ','ឧ'=>'ឧ','ឨ'=>'ឨ','ឩ'=>'ឩ','ឪ'=>'ឪ','ឫ'=>'ឫ','ឬ'=>'ឬ','ឭ'=>'ឭ','ឮ'=>'ឮ','ឯ'=>'ឯ','ឰ'=>'ឰ','ឱ'=>'ឱ','ឲ'=>'ឲ','ឳ'=>'ឳ','ា'=>'ា','ិ'=>'ិ','ី'=>'ី','ឹ'=>'ឹ','ឺ'=>'ឺ','ុ'=>'ុ','ូ'=>'ូ','ួ'=>'ួ','ើ'=>'ើ','ឿ'=>'ឿ','ៀ'=>'ៀ','េ'=>'េ','ែ'=>'ែ','ៃ'=>'ៃ','ោ'=>'ោ','ៅ'=>'ៅ','ំ'=>'ំ','ះ'=>'ះ','ៈ'=>'ៈ','៉'=>'៉','៊'=>'៊','់'=>'់','៌'=>'៌','៍'=>'៍','៎'=>'៎','៏'=>'៏','័'=>'័','៑'=>'៑','្'=>'្','៓'=>'៓','ៗ'=>'ៗ','ៜ'=>'ៜ','៝'=>'៝','០'=>'0','១'=>'1','២'=>'2','៣'=>'3','៤'=>'4','៥'=>'5','៦'=>'6','៧'=>'7','៨'=>'8','៩'=>'9','៰'=>'0','៱'=>'1','៲'=>'2','៳'=>'3','៴'=>'4','៵'=>'5','៶'=>'6','៷'=>'7','៸'=>'8','៹'=>'9'); \ No newline at end of file
+<?php return array('က'=>'က','ခ'=>'ခ','ဂ'=>'ဂ','ဃ'=>'ဃ','င'=>'င','စ'=>'စ','ဆ'=>'ဆ','ဇ'=>'ဇ','ဈ'=>'ဈ','ဉ'=>'ဉ','ည'=>'ည','ဋ'=>'ဋ','ဌ'=>'ဌ','ဍ'=>'ဍ','ဎ'=>'ဎ','ဏ'=>'ဏ','တ'=>'တ','ထ'=>'ထ','ဒ'=>'ဒ','ဓ'=>'ဓ','န'=>'န','ပ'=>'ပ','ဖ'=>'ဖ','ဗ'=>'ဗ','ဘ'=>'ဘ','မ'=>'မ','ယ'=>'ယ','ရ'=>'ရ','လ'=>'လ','ဝ'=>'ဝ','သ'=>'သ','ဟ'=>'ဟ','ဠ'=>'ဠ','အ'=>'အ','ဣ'=>'ဣ','ဤ'=>'ဤ','ဥ'=>'ဥ','ဦ'=>'ဦ','ဧ'=>'ဧ','ဩ'=>'ဩ','ဪ'=>'ဪ','ာ'=>'ာ','ိ'=>'ိ','ီ'=>'ီ','ု'=>'ု','ူ'=>'ူ','ေ'=>'ေ','ဲ'=>'ဲ','ံ'=>'ံ','့'=>'့','း'=>'း','္'=>'္','၀'=>'0','၁'=>'1','၂'=>'2','၃'=>'3','၄'=>'4','၅'=>'5','၆'=>'6','၇'=>'7','၈'=>'8','၉'=>'9','ၐ'=>'ၐ','ၑ'=>'ၑ','ၒ'=>'ၒ','ၓ'=>'ၓ','ၔ'=>'ၔ','ၕ'=>'ၕ','ၖ'=>'ၖ','ၗ'=>'ၗ','ၘ'=>'ၘ','ၙ'=>'ၙ','Ⴀ'=>'ⴀ','Ⴁ'=>'ⴁ','Ⴂ'=>'ⴂ','Ⴃ'=>'ⴃ','Ⴄ'=>'ⴄ','Ⴅ'=>'ⴅ','Ⴆ'=>'ⴆ','Ⴇ'=>'ⴇ','Ⴈ'=>'ⴈ','Ⴉ'=>'ⴉ','Ⴊ'=>'ⴊ','Ⴋ'=>'ⴋ','Ⴌ'=>'ⴌ','Ⴍ'=>'ⴍ','Ⴎ'=>'ⴎ','Ⴏ'=>'ⴏ','Ⴐ'=>'ⴐ','Ⴑ'=>'ⴑ','Ⴒ'=>'ⴒ','Ⴓ'=>'ⴓ','Ⴔ'=>'ⴔ','Ⴕ'=>'ⴕ','Ⴖ'=>'ⴖ','Ⴗ'=>'ⴗ','Ⴘ'=>'ⴘ','Ⴙ'=>'ⴙ','Ⴚ'=>'ⴚ','Ⴛ'=>'ⴛ','Ⴜ'=>'ⴜ','Ⴝ'=>'ⴝ','Ⴞ'=>'ⴞ','Ⴟ'=>'ⴟ','Ⴠ'=>'ⴠ','Ⴡ'=>'ⴡ','Ⴢ'=>'ⴢ','Ⴣ'=>'ⴣ','Ⴤ'=>'ⴤ','Ⴥ'=>'ⴥ','ა'=>'ა','ბ'=>'ბ','გ'=>'გ','დ'=>'დ','ე'=>'ე','ვ'=>'ვ','ზ'=>'ზ','თ'=>'თ','ი'=>'ი','კ'=>'კ','ლ'=>'ლ','მ'=>'მ','ნ'=>'ნ','ო'=>'ო','პ'=>'პ','ჟ'=>'ჟ','რ'=>'რ','ს'=>'ს','ტ'=>'ტ','უ'=>'უ','ფ'=>'ფ','ქ'=>'ქ','ღ'=>'ღ','ყ'=>'ყ','შ'=>'შ','ჩ'=>'ჩ','ც'=>'ც','ძ'=>'ძ','წ'=>'წ','ჭ'=>'ჭ','ხ'=>'ხ','ჯ'=>'ჯ','ჰ'=>'ჰ','ჱ'=>'ჱ','ჲ'=>'ჲ','ჳ'=>'ჳ','ჴ'=>'ჴ','ჵ'=>'ჵ','ჶ'=>'ჶ','ჷ'=>'ჷ','ჸ'=>'ჸ','ჹ'=>'ჹ','ჺ'=>'ჺ','ჼ'=>'ჼ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᄂ'=>'ᄂ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᄓ'=>'ᄓ','ᄔ'=>'ᄔ','ᄕ'=>'ᄕ','ᄖ'=>'ᄖ','ᄗ'=>'ᄗ','ᄘ'=>'ᄘ','ᄙ'=>'ᄙ','ᄚ'=>'ᄚ','ᄛ'=>'ᄛ','ᄜ'=>'ᄜ','ᄝ'=>'ᄝ','ᄞ'=>'ᄞ','ᄟ'=>'ᄟ','ᄠ'=>'ᄠ','ᄡ'=>'ᄡ','ᄢ'=>'ᄢ','ᄣ'=>'ᄣ','ᄤ'=>'ᄤ','ᄥ'=>'ᄥ','ᄦ'=>'ᄦ','ᄧ'=>'ᄧ','ᄨ'=>'ᄨ','ᄩ'=>'ᄩ','ᄪ'=>'ᄪ','ᄫ'=>'ᄫ','ᄬ'=>'ᄬ','ᄭ'=>'ᄭ','ᄮ'=>'ᄮ','ᄯ'=>'ᄯ','ᄰ'=>'ᄰ','ᄱ'=>'ᄱ','ᄲ'=>'ᄲ','ᄳ'=>'ᄳ','ᄴ'=>'ᄴ','ᄵ'=>'ᄵ','ᄶ'=>'ᄶ','ᄷ'=>'ᄷ','ᄸ'=>'ᄸ','ᄹ'=>'ᄹ','ᄺ'=>'ᄺ','ᄻ'=>'ᄻ','ᄼ'=>'ᄼ','ᄽ'=>'ᄽ','ᄾ'=>'ᄾ','ᄿ'=>'ᄿ','ᅀ'=>'ᅀ','ᅁ'=>'ᅁ','ᅂ'=>'ᅂ','ᅃ'=>'ᅃ','ᅄ'=>'ᅄ','ᅅ'=>'ᅅ','ᅆ'=>'ᅆ','ᅇ'=>'ᅇ','ᅈ'=>'ᅈ','ᅉ'=>'ᅉ','ᅊ'=>'ᅊ','ᅋ'=>'ᅋ','ᅌ'=>'ᅌ','ᅍ'=>'ᅍ','ᅎ'=>'ᅎ','ᅏ'=>'ᅏ','ᅐ'=>'ᅐ','ᅑ'=>'ᅑ','ᅒ'=>'ᅒ','ᅓ'=>'ᅓ','ᅔ'=>'ᅔ','ᅕ'=>'ᅕ','ᅖ'=>'ᅖ','ᅗ'=>'ᅗ','ᅘ'=>'ᅘ','ᅙ'=>'ᅙ','ᅟ'=>'ᅟ','ᅠ'=>'ᅠ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ','ᅶ'=>'ᅶ','ᅷ'=>'ᅷ','ᅸ'=>'ᅸ','ᅹ'=>'ᅹ','ᅺ'=>'ᅺ','ᅻ'=>'ᅻ','ᅼ'=>'ᅼ','ᅽ'=>'ᅽ','ᅾ'=>'ᅾ','ᅿ'=>'ᅿ','ᆀ'=>'ᆀ','ᆁ'=>'ᆁ','ᆂ'=>'ᆂ','ᆃ'=>'ᆃ','ᆄ'=>'ᆄ','ᆅ'=>'ᆅ','ᆆ'=>'ᆆ','ᆇ'=>'ᆇ','ᆈ'=>'ᆈ','ᆉ'=>'ᆉ','ᆊ'=>'ᆊ','ᆋ'=>'ᆋ','ᆌ'=>'ᆌ','ᆍ'=>'ᆍ','ᆎ'=>'ᆎ','ᆏ'=>'ᆏ','ᆐ'=>'ᆐ','ᆑ'=>'ᆑ','ᆒ'=>'ᆒ','ᆓ'=>'ᆓ','ᆔ'=>'ᆔ','ᆕ'=>'ᆕ','ᆖ'=>'ᆖ','ᆗ'=>'ᆗ','ᆘ'=>'ᆘ','ᆙ'=>'ᆙ','ᆚ'=>'ᆚ','ᆛ'=>'ᆛ','ᆜ'=>'ᆜ','ᆝ'=>'ᆝ','ᆞ'=>'ᆞ','ᆟ'=>'ᆟ','ᆠ'=>'ᆠ','ᆡ'=>'ᆡ','ᆢ'=>'ᆢ','ᆨ'=>'ᆨ','ᆩ'=>'ᆩ','ᆪ'=>'ᆪ','ᆫ'=>'ᆫ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᆮ'=>'ᆮ','ᆯ'=>'ᆯ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᆶ'=>'ᆶ','ᆷ'=>'ᆷ','ᆸ'=>'ᆸ','ᆹ'=>'ᆹ','ᆺ'=>'ᆺ','ᆻ'=>'ᆻ','ᆼ'=>'ᆼ','ᆽ'=>'ᆽ','ᆾ'=>'ᆾ','ᆿ'=>'ᆿ','ᇀ'=>'ᇀ','ᇁ'=>'ᇁ','ᇂ'=>'ᇂ','ᇃ'=>'ᇃ','ᇄ'=>'ᇄ','ᇅ'=>'ᇅ','ᇆ'=>'ᇆ','ᇇ'=>'ᇇ','ᇈ'=>'ᇈ','ᇉ'=>'ᇉ','ᇊ'=>'ᇊ','ᇋ'=>'ᇋ','ᇌ'=>'ᇌ','ᇍ'=>'ᇍ','ᇎ'=>'ᇎ','ᇏ'=>'ᇏ','ᇐ'=>'ᇐ','ᇑ'=>'ᇑ','ᇒ'=>'ᇒ','ᇓ'=>'ᇓ','ᇔ'=>'ᇔ','ᇕ'=>'ᇕ','ᇖ'=>'ᇖ','ᇗ'=>'ᇗ','ᇘ'=>'ᇘ','ᇙ'=>'ᇙ','ᇚ'=>'ᇚ','ᇛ'=>'ᇛ','ᇜ'=>'ᇜ','ᇝ'=>'ᇝ','ᇞ'=>'ᇞ','ᇟ'=>'ᇟ','ᇠ'=>'ᇠ','ᇡ'=>'ᇡ','ᇢ'=>'ᇢ','ᇣ'=>'ᇣ','ᇤ'=>'ᇤ','ᇥ'=>'ᇥ','ᇦ'=>'ᇦ','ᇧ'=>'ᇧ','ᇨ'=>'ᇨ','ᇩ'=>'ᇩ','ᇪ'=>'ᇪ','ᇫ'=>'ᇫ','ᇬ'=>'ᇬ','ᇭ'=>'ᇭ','ᇮ'=>'ᇮ','ᇯ'=>'ᇯ','ᇰ'=>'ᇰ','ᇱ'=>'ᇱ','ᇲ'=>'ᇲ','ᇳ'=>'ᇳ','ᇴ'=>'ᇴ','ᇵ'=>'ᇵ','ᇶ'=>'ᇶ','ᇷ'=>'ᇷ','ᇸ'=>'ᇸ','ᇹ'=>'ᇹ','ሀ'=>'ሀ','ሁ'=>'ሁ','ሂ'=>'ሂ','ሃ'=>'ሃ','ሄ'=>'ሄ','ህ'=>'ህ','ሆ'=>'ሆ','ሇ'=>'ሇ','ለ'=>'ለ','ሉ'=>'ሉ','ሊ'=>'ሊ','ላ'=>'ላ','ሌ'=>'ሌ','ል'=>'ል','ሎ'=>'ሎ','ሏ'=>'ሏ','ሐ'=>'ሐ','ሑ'=>'ሑ','ሒ'=>'ሒ','ሓ'=>'ሓ','ሔ'=>'ሔ','ሕ'=>'ሕ','ሖ'=>'ሖ','ሗ'=>'ሗ','መ'=>'መ','ሙ'=>'ሙ','ሚ'=>'ሚ','ማ'=>'ማ','ሜ'=>'ሜ','ም'=>'ም','ሞ'=>'ሞ','ሟ'=>'ሟ','ሠ'=>'ሠ','ሡ'=>'ሡ','ሢ'=>'ሢ','ሣ'=>'ሣ','ሤ'=>'ሤ','ሥ'=>'ሥ','ሦ'=>'ሦ','ሧ'=>'ሧ','ረ'=>'ረ','ሩ'=>'ሩ','ሪ'=>'ሪ','ራ'=>'ራ','ሬ'=>'ሬ','ር'=>'ር','ሮ'=>'ሮ','ሯ'=>'ሯ','ሰ'=>'ሰ','ሱ'=>'ሱ','ሲ'=>'ሲ','ሳ'=>'ሳ','ሴ'=>'ሴ','ስ'=>'ስ','ሶ'=>'ሶ','ሷ'=>'ሷ','ሸ'=>'ሸ','ሹ'=>'ሹ','ሺ'=>'ሺ','ሻ'=>'ሻ','ሼ'=>'ሼ','ሽ'=>'ሽ','ሾ'=>'ሾ','ሿ'=>'ሿ','ቀ'=>'ቀ','ቁ'=>'ቁ','ቂ'=>'ቂ','ቃ'=>'ቃ','ቄ'=>'ቄ','ቅ'=>'ቅ','ቆ'=>'ቆ','ቇ'=>'ቇ','ቈ'=>'ቈ','ቊ'=>'ቊ','ቋ'=>'ቋ','ቌ'=>'ቌ','ቍ'=>'ቍ','ቐ'=>'ቐ','ቑ'=>'ቑ','ቒ'=>'ቒ','ቓ'=>'ቓ','ቔ'=>'ቔ','ቕ'=>'ቕ','ቖ'=>'ቖ','ቘ'=>'ቘ','ቚ'=>'ቚ','ቛ'=>'ቛ','ቜ'=>'ቜ','ቝ'=>'ቝ','በ'=>'በ','ቡ'=>'ቡ','ቢ'=>'ቢ','ባ'=>'ባ','ቤ'=>'ቤ','ብ'=>'ብ','ቦ'=>'ቦ','ቧ'=>'ቧ','ቨ'=>'ቨ','ቩ'=>'ቩ','ቪ'=>'ቪ','ቫ'=>'ቫ','ቬ'=>'ቬ','ቭ'=>'ቭ','ቮ'=>'ቮ','ቯ'=>'ቯ','ተ'=>'ተ','ቱ'=>'ቱ','ቲ'=>'ቲ','ታ'=>'ታ','ቴ'=>'ቴ','ት'=>'ት','ቶ'=>'ቶ','ቷ'=>'ቷ','ቸ'=>'ቸ','ቹ'=>'ቹ','ቺ'=>'ቺ','ቻ'=>'ቻ','ቼ'=>'ቼ','ች'=>'ች','ቾ'=>'ቾ','ቿ'=>'ቿ','ኀ'=>'ኀ','ኁ'=>'ኁ','ኂ'=>'ኂ','ኃ'=>'ኃ','ኄ'=>'ኄ','ኅ'=>'ኅ','ኆ'=>'ኆ','ኇ'=>'ኇ','ኈ'=>'ኈ','ኊ'=>'ኊ','ኋ'=>'ኋ','ኌ'=>'ኌ','ኍ'=>'ኍ','ነ'=>'ነ','ኑ'=>'ኑ','ኒ'=>'ኒ','ና'=>'ና','ኔ'=>'ኔ','ን'=>'ን','ኖ'=>'ኖ','ኗ'=>'ኗ','ኘ'=>'ኘ','ኙ'=>'ኙ','ኚ'=>'ኚ','ኛ'=>'ኛ','ኜ'=>'ኜ','ኝ'=>'ኝ','ኞ'=>'ኞ','ኟ'=>'ኟ','አ'=>'አ','ኡ'=>'ኡ','ኢ'=>'ኢ','ኣ'=>'ኣ','ኤ'=>'ኤ','እ'=>'እ','ኦ'=>'ኦ','ኧ'=>'ኧ','ከ'=>'ከ','ኩ'=>'ኩ','ኪ'=>'ኪ','ካ'=>'ካ','ኬ'=>'ኬ','ክ'=>'ክ','ኮ'=>'ኮ','ኯ'=>'ኯ','ኰ'=>'ኰ','ኲ'=>'ኲ','ኳ'=>'ኳ','ኴ'=>'ኴ','ኵ'=>'ኵ','ኸ'=>'ኸ','ኹ'=>'ኹ','ኺ'=>'ኺ','ኻ'=>'ኻ','ኼ'=>'ኼ','ኽ'=>'ኽ','ኾ'=>'ኾ','ዀ'=>'ዀ','ዂ'=>'ዂ','ዃ'=>'ዃ','ዄ'=>'ዄ','ዅ'=>'ዅ','ወ'=>'ወ','ዉ'=>'ዉ','ዊ'=>'ዊ','ዋ'=>'ዋ','ዌ'=>'ዌ','ው'=>'ው','ዎ'=>'ዎ','ዏ'=>'ዏ','ዐ'=>'ዐ','ዑ'=>'ዑ','ዒ'=>'ዒ','ዓ'=>'ዓ','ዔ'=>'ዔ','ዕ'=>'ዕ','ዖ'=>'ዖ','ዘ'=>'ዘ','ዙ'=>'ዙ','ዚ'=>'ዚ','ዛ'=>'ዛ','ዜ'=>'ዜ','ዝ'=>'ዝ','ዞ'=>'ዞ','ዟ'=>'ዟ','ዠ'=>'ዠ','ዡ'=>'ዡ','ዢ'=>'ዢ','ዣ'=>'ዣ','ዤ'=>'ዤ','ዥ'=>'ዥ','ዦ'=>'ዦ','ዧ'=>'ዧ','የ'=>'የ','ዩ'=>'ዩ','ዪ'=>'ዪ','ያ'=>'ያ','ዬ'=>'ዬ','ይ'=>'ይ','ዮ'=>'ዮ','ዯ'=>'ዯ','ደ'=>'ደ','ዱ'=>'ዱ','ዲ'=>'ዲ','ዳ'=>'ዳ','ዴ'=>'ዴ','ድ'=>'ድ','ዶ'=>'ዶ','ዷ'=>'ዷ','ዸ'=>'ዸ','ዹ'=>'ዹ','ዺ'=>'ዺ','ዻ'=>'ዻ','ዼ'=>'ዼ','ዽ'=>'ዽ','ዾ'=>'ዾ','ዿ'=>'ዿ','ጀ'=>'ጀ','ጁ'=>'ጁ','ጂ'=>'ጂ','ጃ'=>'ጃ','ጄ'=>'ጄ','ጅ'=>'ጅ','ጆ'=>'ጆ','ጇ'=>'ጇ','ገ'=>'ገ','ጉ'=>'ጉ','ጊ'=>'ጊ','ጋ'=>'ጋ','ጌ'=>'ጌ','ግ'=>'ግ','ጎ'=>'ጎ','ጏ'=>'ጏ','ጐ'=>'ጐ','ጒ'=>'ጒ','ጓ'=>'ጓ','ጔ'=>'ጔ','ጕ'=>'ጕ','ጘ'=>'ጘ','ጙ'=>'ጙ','ጚ'=>'ጚ','ጛ'=>'ጛ','ጜ'=>'ጜ','ጝ'=>'ጝ','ጞ'=>'ጞ','ጟ'=>'ጟ','ጠ'=>'ጠ','ጡ'=>'ጡ','ጢ'=>'ጢ','ጣ'=>'ጣ','ጤ'=>'ጤ','ጥ'=>'ጥ','ጦ'=>'ጦ','ጧ'=>'ጧ','ጨ'=>'ጨ','ጩ'=>'ጩ','ጪ'=>'ጪ','ጫ'=>'ጫ','ጬ'=>'ጬ','ጭ'=>'ጭ','ጮ'=>'ጮ','ጯ'=>'ጯ','ጰ'=>'ጰ','ጱ'=>'ጱ','ጲ'=>'ጲ','ጳ'=>'ጳ','ጴ'=>'ጴ','ጵ'=>'ጵ','ጶ'=>'ጶ','ጷ'=>'ጷ','ጸ'=>'ጸ','ጹ'=>'ጹ','ጺ'=>'ጺ','ጻ'=>'ጻ','ጼ'=>'ጼ','ጽ'=>'ጽ','ጾ'=>'ጾ','ጿ'=>'ጿ','ፀ'=>'ፀ','ፁ'=>'ፁ','ፂ'=>'ፂ','ፃ'=>'ፃ','ፄ'=>'ፄ','ፅ'=>'ፅ','ፆ'=>'ፆ','ፇ'=>'ፇ','ፈ'=>'ፈ','ፉ'=>'ፉ','ፊ'=>'ፊ','ፋ'=>'ፋ','ፌ'=>'ፌ','ፍ'=>'ፍ','ፎ'=>'ፎ','ፏ'=>'ፏ','ፐ'=>'ፐ','ፑ'=>'ፑ','ፒ'=>'ፒ','ፓ'=>'ፓ','ፔ'=>'ፔ','ፕ'=>'ፕ','ፖ'=>'ፖ','ፗ'=>'ፗ','ፘ'=>'ፘ','ፙ'=>'ፙ','ፚ'=>'ፚ','፟'=>'፟','፩'=>'1','፪'=>'2','፫'=>'3','፬'=>'4','፭'=>'5','፮'=>'6','፯'=>'7','፰'=>'8','፱'=>'9','፲'=>'10','፳'=>'20','፴'=>'30','፵'=>'40','፶'=>'50','፷'=>'60','፸'=>'70','፹'=>'80','፺'=>'90','፻'=>'100','፼'=>'10000','ᎀ'=>'ᎀ','ᎁ'=>'ᎁ','ᎂ'=>'ᎂ','ᎃ'=>'ᎃ','ᎄ'=>'ᎄ','ᎅ'=>'ᎅ','ᎆ'=>'ᎆ','ᎇ'=>'ᎇ','ᎈ'=>'ᎈ','ᎉ'=>'ᎉ','ᎊ'=>'ᎊ','ᎋ'=>'ᎋ','ᎌ'=>'ᎌ','ᎍ'=>'ᎍ','ᎎ'=>'ᎎ','ᎏ'=>'ᎏ','Ꭰ'=>'Ꭰ','Ꭱ'=>'Ꭱ','Ꭲ'=>'Ꭲ','Ꭳ'=>'Ꭳ','Ꭴ'=>'Ꭴ','Ꭵ'=>'Ꭵ','Ꭶ'=>'Ꭶ','Ꭷ'=>'Ꭷ','Ꭸ'=>'Ꭸ','Ꭹ'=>'Ꭹ','Ꭺ'=>'Ꭺ','Ꭻ'=>'Ꭻ','Ꭼ'=>'Ꭼ','Ꭽ'=>'Ꭽ','Ꭾ'=>'Ꭾ','Ꭿ'=>'Ꭿ','Ꮀ'=>'Ꮀ','Ꮁ'=>'Ꮁ','Ꮂ'=>'Ꮂ','Ꮃ'=>'Ꮃ','Ꮄ'=>'Ꮄ','Ꮅ'=>'Ꮅ','Ꮆ'=>'Ꮆ','Ꮇ'=>'Ꮇ','Ꮈ'=>'Ꮈ','Ꮉ'=>'Ꮉ','Ꮊ'=>'Ꮊ','Ꮋ'=>'Ꮋ','Ꮌ'=>'Ꮌ','Ꮍ'=>'Ꮍ','Ꮎ'=>'Ꮎ','Ꮏ'=>'Ꮏ','Ꮐ'=>'Ꮐ','Ꮑ'=>'Ꮑ','Ꮒ'=>'Ꮒ','Ꮓ'=>'Ꮓ','Ꮔ'=>'Ꮔ','Ꮕ'=>'Ꮕ','Ꮖ'=>'Ꮖ','Ꮗ'=>'Ꮗ','Ꮘ'=>'Ꮘ','Ꮙ'=>'Ꮙ','Ꮚ'=>'Ꮚ','Ꮛ'=>'Ꮛ','Ꮜ'=>'Ꮜ','Ꮝ'=>'Ꮝ','Ꮞ'=>'Ꮞ','Ꮟ'=>'Ꮟ','Ꮠ'=>'Ꮠ','Ꮡ'=>'Ꮡ','Ꮢ'=>'Ꮢ','Ꮣ'=>'Ꮣ','Ꮤ'=>'Ꮤ','Ꮥ'=>'Ꮥ','Ꮦ'=>'Ꮦ','Ꮧ'=>'Ꮧ','Ꮨ'=>'Ꮨ','Ꮩ'=>'Ꮩ','Ꮪ'=>'Ꮪ','Ꮫ'=>'Ꮫ','Ꮬ'=>'Ꮬ','Ꮭ'=>'Ꮭ','Ꮮ'=>'Ꮮ','Ꮯ'=>'Ꮯ','Ꮰ'=>'Ꮰ','Ꮱ'=>'Ꮱ','Ꮲ'=>'Ꮲ','Ꮳ'=>'Ꮳ','Ꮴ'=>'Ꮴ','Ꮵ'=>'Ꮵ','Ꮶ'=>'Ꮶ','Ꮷ'=>'Ꮷ','Ꮸ'=>'Ꮸ','Ꮹ'=>'Ꮹ','Ꮺ'=>'Ꮺ','Ꮻ'=>'Ꮻ','Ꮼ'=>'Ꮼ','Ꮽ'=>'Ꮽ','Ꮾ'=>'Ꮾ','Ꮿ'=>'Ꮿ','Ᏸ'=>'Ᏸ','Ᏹ'=>'Ᏹ','Ᏺ'=>'Ᏺ','Ᏻ'=>'Ᏻ','Ᏼ'=>'Ᏼ','ᐁ'=>'ᐁ','ᐂ'=>'ᐂ','ᐃ'=>'ᐃ','ᐄ'=>'ᐄ','ᐅ'=>'ᐅ','ᐆ'=>'ᐆ','ᐇ'=>'ᐇ','ᐈ'=>'ᐈ','ᐉ'=>'ᐉ','ᐊ'=>'ᐊ','ᐋ'=>'ᐋ','ᐌ'=>'ᐌ','ᐍ'=>'ᐍ','ᐎ'=>'ᐎ','ᐏ'=>'ᐏ','ᐐ'=>'ᐐ','ᐑ'=>'ᐑ','ᐒ'=>'ᐒ','ᐓ'=>'ᐓ','ᐔ'=>'ᐔ','ᐕ'=>'ᐕ','ᐖ'=>'ᐖ','ᐗ'=>'ᐗ','ᐘ'=>'ᐘ','ᐙ'=>'ᐙ','ᐚ'=>'ᐚ','ᐛ'=>'ᐛ','ᐜ'=>'ᐜ','ᐝ'=>'ᐝ','ᐞ'=>'ᐞ','ᐟ'=>'ᐟ','ᐠ'=>'ᐠ','ᐡ'=>'ᐡ','ᐢ'=>'ᐢ','ᐣ'=>'ᐣ','ᐤ'=>'ᐤ','ᐥ'=>'ᐥ','ᐦ'=>'ᐦ','ᐧ'=>'ᐧ','ᐨ'=>'ᐨ','ᐩ'=>'ᐩ','ᐪ'=>'ᐪ','ᐫ'=>'ᐫ','ᐬ'=>'ᐬ','ᐭ'=>'ᐭ','ᐮ'=>'ᐮ','ᐯ'=>'ᐯ','ᐰ'=>'ᐰ','ᐱ'=>'ᐱ','ᐲ'=>'ᐲ','ᐳ'=>'ᐳ','ᐴ'=>'ᐴ','ᐵ'=>'ᐵ','ᐶ'=>'ᐶ','ᐷ'=>'ᐷ','ᐸ'=>'ᐸ','ᐹ'=>'ᐹ','ᐺ'=>'ᐺ','ᐻ'=>'ᐻ','ᐼ'=>'ᐼ','ᐽ'=>'ᐽ','ᐾ'=>'ᐾ','ᐿ'=>'ᐿ','ᑀ'=>'ᑀ','ᑁ'=>'ᑁ','ᑂ'=>'ᑂ','ᑃ'=>'ᑃ','ᑄ'=>'ᑄ','ᑅ'=>'ᑅ','ᑆ'=>'ᑆ','ᑇ'=>'ᑇ','ᑈ'=>'ᑈ','ᑉ'=>'ᑉ','ᑊ'=>'ᑊ','ᑋ'=>'ᑋ','ᑌ'=>'ᑌ','ᑍ'=>'ᑍ','ᑎ'=>'ᑎ','ᑏ'=>'ᑏ','ᑐ'=>'ᑐ','ᑑ'=>'ᑑ','ᑒ'=>'ᑒ','ᑓ'=>'ᑓ','ᑔ'=>'ᑔ','ᑕ'=>'ᑕ','ᑖ'=>'ᑖ','ᑗ'=>'ᑗ','ᑘ'=>'ᑘ','ᑙ'=>'ᑙ','ᑚ'=>'ᑚ','ᑛ'=>'ᑛ','ᑜ'=>'ᑜ','ᑝ'=>'ᑝ','ᑞ'=>'ᑞ','ᑟ'=>'ᑟ','ᑠ'=>'ᑠ','ᑡ'=>'ᑡ','ᑢ'=>'ᑢ','ᑣ'=>'ᑣ','ᑤ'=>'ᑤ','ᑥ'=>'ᑥ','ᑦ'=>'ᑦ','ᑧ'=>'ᑧ','ᑨ'=>'ᑨ','ᑩ'=>'ᑩ','ᑪ'=>'ᑪ','ᑫ'=>'ᑫ','ᑬ'=>'ᑬ','ᑭ'=>'ᑭ','ᑮ'=>'ᑮ','ᑯ'=>'ᑯ','ᑰ'=>'ᑰ','ᑱ'=>'ᑱ','ᑲ'=>'ᑲ','ᑳ'=>'ᑳ','ᑴ'=>'ᑴ','ᑵ'=>'ᑵ','ᑶ'=>'ᑶ','ᑷ'=>'ᑷ','ᑸ'=>'ᑸ','ᑹ'=>'ᑹ','ᑺ'=>'ᑺ','ᑻ'=>'ᑻ','ᑼ'=>'ᑼ','ᑽ'=>'ᑽ','ᑾ'=>'ᑾ','ᑿ'=>'ᑿ','ᒀ'=>'ᒀ','ᒁ'=>'ᒁ','ᒂ'=>'ᒂ','ᒃ'=>'ᒃ','ᒄ'=>'ᒄ','ᒅ'=>'ᒅ','ᒆ'=>'ᒆ','ᒇ'=>'ᒇ','ᒈ'=>'ᒈ','ᒉ'=>'ᒉ','ᒊ'=>'ᒊ','ᒋ'=>'ᒋ','ᒌ'=>'ᒌ','ᒍ'=>'ᒍ','ᒎ'=>'ᒎ','ᒏ'=>'ᒏ','ᒐ'=>'ᒐ','ᒑ'=>'ᒑ','ᒒ'=>'ᒒ','ᒓ'=>'ᒓ','ᒔ'=>'ᒔ','ᒕ'=>'ᒕ','ᒖ'=>'ᒖ','ᒗ'=>'ᒗ','ᒘ'=>'ᒘ','ᒙ'=>'ᒙ','ᒚ'=>'ᒚ','ᒛ'=>'ᒛ','ᒜ'=>'ᒜ','ᒝ'=>'ᒝ','ᒞ'=>'ᒞ','ᒟ'=>'ᒟ','ᒠ'=>'ᒠ','ᒡ'=>'ᒡ','ᒢ'=>'ᒢ','ᒣ'=>'ᒣ','ᒤ'=>'ᒤ','ᒥ'=>'ᒥ','ᒦ'=>'ᒦ','ᒧ'=>'ᒧ','ᒨ'=>'ᒨ','ᒩ'=>'ᒩ','ᒪ'=>'ᒪ','ᒫ'=>'ᒫ','ᒬ'=>'ᒬ','ᒭ'=>'ᒭ','ᒮ'=>'ᒮ','ᒯ'=>'ᒯ','ᒰ'=>'ᒰ','ᒱ'=>'ᒱ','ᒲ'=>'ᒲ','ᒳ'=>'ᒳ','ᒴ'=>'ᒴ','ᒵ'=>'ᒵ','ᒶ'=>'ᒶ','ᒷ'=>'ᒷ','ᒸ'=>'ᒸ','ᒹ'=>'ᒹ','ᒺ'=>'ᒺ','ᒻ'=>'ᒻ','ᒼ'=>'ᒼ','ᒽ'=>'ᒽ','ᒾ'=>'ᒾ','ᒿ'=>'ᒿ','ᓀ'=>'ᓀ','ᓁ'=>'ᓁ','ᓂ'=>'ᓂ','ᓃ'=>'ᓃ','ᓄ'=>'ᓄ','ᓅ'=>'ᓅ','ᓆ'=>'ᓆ','ᓇ'=>'ᓇ','ᓈ'=>'ᓈ','ᓉ'=>'ᓉ','ᓊ'=>'ᓊ','ᓋ'=>'ᓋ','ᓌ'=>'ᓌ','ᓍ'=>'ᓍ','ᓎ'=>'ᓎ','ᓏ'=>'ᓏ','ᓐ'=>'ᓐ','ᓑ'=>'ᓑ','ᓒ'=>'ᓒ','ᓓ'=>'ᓓ','ᓔ'=>'ᓔ','ᓕ'=>'ᓕ','ᓖ'=>'ᓖ','ᓗ'=>'ᓗ','ᓘ'=>'ᓘ','ᓙ'=>'ᓙ','ᓚ'=>'ᓚ','ᓛ'=>'ᓛ','ᓜ'=>'ᓜ','ᓝ'=>'ᓝ','ᓞ'=>'ᓞ','ᓟ'=>'ᓟ','ᓠ'=>'ᓠ','ᓡ'=>'ᓡ','ᓢ'=>'ᓢ','ᓣ'=>'ᓣ','ᓤ'=>'ᓤ','ᓥ'=>'ᓥ','ᓦ'=>'ᓦ','ᓧ'=>'ᓧ','ᓨ'=>'ᓨ','ᓩ'=>'ᓩ','ᓪ'=>'ᓪ','ᓫ'=>'ᓫ','ᓬ'=>'ᓬ','ᓭ'=>'ᓭ','ᓮ'=>'ᓮ','ᓯ'=>'ᓯ','ᓰ'=>'ᓰ','ᓱ'=>'ᓱ','ᓲ'=>'ᓲ','ᓳ'=>'ᓳ','ᓴ'=>'ᓴ','ᓵ'=>'ᓵ','ᓶ'=>'ᓶ','ᓷ'=>'ᓷ','ᓸ'=>'ᓸ','ᓹ'=>'ᓹ','ᓺ'=>'ᓺ','ᓻ'=>'ᓻ','ᓼ'=>'ᓼ','ᓽ'=>'ᓽ','ᓾ'=>'ᓾ','ᓿ'=>'ᓿ','ᔀ'=>'ᔀ','ᔁ'=>'ᔁ','ᔂ'=>'ᔂ','ᔃ'=>'ᔃ','ᔄ'=>'ᔄ','ᔅ'=>'ᔅ','ᔆ'=>'ᔆ','ᔇ'=>'ᔇ','ᔈ'=>'ᔈ','ᔉ'=>'ᔉ','ᔊ'=>'ᔊ','ᔋ'=>'ᔋ','ᔌ'=>'ᔌ','ᔍ'=>'ᔍ','ᔎ'=>'ᔎ','ᔏ'=>'ᔏ','ᔐ'=>'ᔐ','ᔑ'=>'ᔑ','ᔒ'=>'ᔒ','ᔓ'=>'ᔓ','ᔔ'=>'ᔔ','ᔕ'=>'ᔕ','ᔖ'=>'ᔖ','ᔗ'=>'ᔗ','ᔘ'=>'ᔘ','ᔙ'=>'ᔙ','ᔚ'=>'ᔚ','ᔛ'=>'ᔛ','ᔜ'=>'ᔜ','ᔝ'=>'ᔝ','ᔞ'=>'ᔞ','ᔟ'=>'ᔟ','ᔠ'=>'ᔠ','ᔡ'=>'ᔡ','ᔢ'=>'ᔢ','ᔣ'=>'ᔣ','ᔤ'=>'ᔤ','ᔥ'=>'ᔥ','ᔦ'=>'ᔦ','ᔧ'=>'ᔧ','ᔨ'=>'ᔨ','ᔩ'=>'ᔩ','ᔪ'=>'ᔪ','ᔫ'=>'ᔫ','ᔬ'=>'ᔬ','ᔭ'=>'ᔭ','ᔮ'=>'ᔮ','ᔯ'=>'ᔯ','ᔰ'=>'ᔰ','ᔱ'=>'ᔱ','ᔲ'=>'ᔲ','ᔳ'=>'ᔳ','ᔴ'=>'ᔴ','ᔵ'=>'ᔵ','ᔶ'=>'ᔶ','ᔷ'=>'ᔷ','ᔸ'=>'ᔸ','ᔹ'=>'ᔹ','ᔺ'=>'ᔺ','ᔻ'=>'ᔻ','ᔼ'=>'ᔼ','ᔽ'=>'ᔽ','ᔾ'=>'ᔾ','ᔿ'=>'ᔿ','ᕀ'=>'ᕀ','ᕁ'=>'ᕁ','ᕂ'=>'ᕂ','ᕃ'=>'ᕃ','ᕄ'=>'ᕄ','ᕅ'=>'ᕅ','ᕆ'=>'ᕆ','ᕇ'=>'ᕇ','ᕈ'=>'ᕈ','ᕉ'=>'ᕉ','ᕊ'=>'ᕊ','ᕋ'=>'ᕋ','ᕌ'=>'ᕌ','ᕍ'=>'ᕍ','ᕎ'=>'ᕎ','ᕏ'=>'ᕏ','ᕐ'=>'ᕐ','ᕑ'=>'ᕑ','ᕒ'=>'ᕒ','ᕓ'=>'ᕓ','ᕔ'=>'ᕔ','ᕕ'=>'ᕕ','ᕖ'=>'ᕖ','ᕗ'=>'ᕗ','ᕘ'=>'ᕘ','ᕙ'=>'ᕙ','ᕚ'=>'ᕚ','ᕛ'=>'ᕛ','ᕜ'=>'ᕜ','ᕝ'=>'ᕝ','ᕞ'=>'ᕞ','ᕟ'=>'ᕟ','ᕠ'=>'ᕠ','ᕡ'=>'ᕡ','ᕢ'=>'ᕢ','ᕣ'=>'ᕣ','ᕤ'=>'ᕤ','ᕥ'=>'ᕥ','ᕦ'=>'ᕦ','ᕧ'=>'ᕧ','ᕨ'=>'ᕨ','ᕩ'=>'ᕩ','ᕪ'=>'ᕪ','ᕫ'=>'ᕫ','ᕬ'=>'ᕬ','ᕭ'=>'ᕭ','ᕮ'=>'ᕮ','ᕯ'=>'ᕯ','ᕰ'=>'ᕰ','ᕱ'=>'ᕱ','ᕲ'=>'ᕲ','ᕳ'=>'ᕳ','ᕴ'=>'ᕴ','ᕵ'=>'ᕵ','ᕶ'=>'ᕶ','ᕷ'=>'ᕷ','ᕸ'=>'ᕸ','ᕹ'=>'ᕹ','ᕺ'=>'ᕺ','ᕻ'=>'ᕻ','ᕼ'=>'ᕼ','ᕽ'=>'ᕽ','ᕾ'=>'ᕾ','ᕿ'=>'ᕿ','ᖀ'=>'ᖀ','ᖁ'=>'ᖁ','ᖂ'=>'ᖂ','ᖃ'=>'ᖃ','ᖄ'=>'ᖄ','ᖅ'=>'ᖅ','ᖆ'=>'ᖆ','ᖇ'=>'ᖇ','ᖈ'=>'ᖈ','ᖉ'=>'ᖉ','ᖊ'=>'ᖊ','ᖋ'=>'ᖋ','ᖌ'=>'ᖌ','ᖍ'=>'ᖍ','ᖎ'=>'ᖎ','ᖏ'=>'ᖏ','ᖐ'=>'ᖐ','ᖑ'=>'ᖑ','ᖒ'=>'ᖒ','ᖓ'=>'ᖓ','ᖔ'=>'ᖔ','ᖕ'=>'ᖕ','ᖖ'=>'ᖖ','ᖗ'=>'ᖗ','ᖘ'=>'ᖘ','ᖙ'=>'ᖙ','ᖚ'=>'ᖚ','ᖛ'=>'ᖛ','ᖜ'=>'ᖜ','ᖝ'=>'ᖝ','ᖞ'=>'ᖞ','ᖟ'=>'ᖟ','ᖠ'=>'ᖠ','ᖡ'=>'ᖡ','ᖢ'=>'ᖢ','ᖣ'=>'ᖣ','ᖤ'=>'ᖤ','ᖥ'=>'ᖥ','ᖦ'=>'ᖦ','ᖧ'=>'ᖧ','ᖨ'=>'ᖨ','ᖩ'=>'ᖩ','ᖪ'=>'ᖪ','ᖫ'=>'ᖫ','ᖬ'=>'ᖬ','ᖭ'=>'ᖭ','ᖮ'=>'ᖮ','ᖯ'=>'ᖯ','ᖰ'=>'ᖰ','ᖱ'=>'ᖱ','ᖲ'=>'ᖲ','ᖳ'=>'ᖳ','ᖴ'=>'ᖴ','ᖵ'=>'ᖵ','ᖶ'=>'ᖶ','ᖷ'=>'ᖷ','ᖸ'=>'ᖸ','ᖹ'=>'ᖹ','ᖺ'=>'ᖺ','ᖻ'=>'ᖻ','ᖼ'=>'ᖼ','ᖽ'=>'ᖽ','ᖾ'=>'ᖾ','ᖿ'=>'ᖿ','ᗀ'=>'ᗀ','ᗁ'=>'ᗁ','ᗂ'=>'ᗂ','ᗃ'=>'ᗃ','ᗄ'=>'ᗄ','ᗅ'=>'ᗅ','ᗆ'=>'ᗆ','ᗇ'=>'ᗇ','ᗈ'=>'ᗈ','ᗉ'=>'ᗉ','ᗊ'=>'ᗊ','ᗋ'=>'ᗋ','ᗌ'=>'ᗌ','ᗍ'=>'ᗍ','ᗎ'=>'ᗎ','ᗏ'=>'ᗏ','ᗐ'=>'ᗐ','ᗑ'=>'ᗑ','ᗒ'=>'ᗒ','ᗓ'=>'ᗓ','ᗔ'=>'ᗔ','ᗕ'=>'ᗕ','ᗖ'=>'ᗖ','ᗗ'=>'ᗗ','ᗘ'=>'ᗘ','ᗙ'=>'ᗙ','ᗚ'=>'ᗚ','ᗛ'=>'ᗛ','ᗜ'=>'ᗜ','ᗝ'=>'ᗝ','ᗞ'=>'ᗞ','ᗟ'=>'ᗟ','ᗠ'=>'ᗠ','ᗡ'=>'ᗡ','ᗢ'=>'ᗢ','ᗣ'=>'ᗣ','ᗤ'=>'ᗤ','ᗥ'=>'ᗥ','ᗦ'=>'ᗦ','ᗧ'=>'ᗧ','ᗨ'=>'ᗨ','ᗩ'=>'ᗩ','ᗪ'=>'ᗪ','ᗫ'=>'ᗫ','ᗬ'=>'ᗬ','ᗭ'=>'ᗭ','ᗮ'=>'ᗮ','ᗯ'=>'ᗯ','ᗰ'=>'ᗰ','ᗱ'=>'ᗱ','ᗲ'=>'ᗲ','ᗳ'=>'ᗳ','ᗴ'=>'ᗴ','ᗵ'=>'ᗵ','ᗶ'=>'ᗶ','ᗷ'=>'ᗷ','ᗸ'=>'ᗸ','ᗹ'=>'ᗹ','ᗺ'=>'ᗺ','ᗻ'=>'ᗻ','ᗼ'=>'ᗼ','ᗽ'=>'ᗽ','ᗾ'=>'ᗾ','ᗿ'=>'ᗿ','ᘀ'=>'ᘀ','ᘁ'=>'ᘁ','ᘂ'=>'ᘂ','ᘃ'=>'ᘃ','ᘄ'=>'ᘄ','ᘅ'=>'ᘅ','ᘆ'=>'ᘆ','ᘇ'=>'ᘇ','ᘈ'=>'ᘈ','ᘉ'=>'ᘉ','ᘊ'=>'ᘊ','ᘋ'=>'ᘋ','ᘌ'=>'ᘌ','ᘍ'=>'ᘍ','ᘎ'=>'ᘎ','ᘏ'=>'ᘏ','ᘐ'=>'ᘐ','ᘑ'=>'ᘑ','ᘒ'=>'ᘒ','ᘓ'=>'ᘓ','ᘔ'=>'ᘔ','ᘕ'=>'ᘕ','ᘖ'=>'ᘖ','ᘗ'=>'ᘗ','ᘘ'=>'ᘘ','ᘙ'=>'ᘙ','ᘚ'=>'ᘚ','ᘛ'=>'ᘛ','ᘜ'=>'ᘜ','ᘝ'=>'ᘝ','ᘞ'=>'ᘞ','ᘟ'=>'ᘟ','ᘠ'=>'ᘠ','ᘡ'=>'ᘡ','ᘢ'=>'ᘢ','ᘣ'=>'ᘣ','ᘤ'=>'ᘤ','ᘥ'=>'ᘥ','ᘦ'=>'ᘦ','ᘧ'=>'ᘧ','ᘨ'=>'ᘨ','ᘩ'=>'ᘩ','ᘪ'=>'ᘪ','ᘫ'=>'ᘫ','ᘬ'=>'ᘬ','ᘭ'=>'ᘭ','ᘮ'=>'ᘮ','ᘯ'=>'ᘯ','ᘰ'=>'ᘰ','ᘱ'=>'ᘱ','ᘲ'=>'ᘲ','ᘳ'=>'ᘳ','ᘴ'=>'ᘴ','ᘵ'=>'ᘵ','ᘶ'=>'ᘶ','ᘷ'=>'ᘷ','ᘸ'=>'ᘸ','ᘹ'=>'ᘹ','ᘺ'=>'ᘺ','ᘻ'=>'ᘻ','ᘼ'=>'ᘼ','ᘽ'=>'ᘽ','ᘾ'=>'ᘾ','ᘿ'=>'ᘿ','ᙀ'=>'ᙀ','ᙁ'=>'ᙁ','ᙂ'=>'ᙂ','ᙃ'=>'ᙃ','ᙄ'=>'ᙄ','ᙅ'=>'ᙅ','ᙆ'=>'ᙆ','ᙇ'=>'ᙇ','ᙈ'=>'ᙈ','ᙉ'=>'ᙉ','ᙊ'=>'ᙊ','ᙋ'=>'ᙋ','ᙌ'=>'ᙌ','ᙍ'=>'ᙍ','ᙎ'=>'ᙎ','ᙏ'=>'ᙏ','ᙐ'=>'ᙐ','ᙑ'=>'ᙑ','ᙒ'=>'ᙒ','ᙓ'=>'ᙓ','ᙔ'=>'ᙔ','ᙕ'=>'ᙕ','ᙖ'=>'ᙖ','ᙗ'=>'ᙗ','ᙘ'=>'ᙘ','ᙙ'=>'ᙙ','ᙚ'=>'ᙚ','ᙛ'=>'ᙛ','ᙜ'=>'ᙜ','ᙝ'=>'ᙝ','ᙞ'=>'ᙞ','ᙟ'=>'ᙟ','ᙠ'=>'ᙠ','ᙡ'=>'ᙡ','ᙢ'=>'ᙢ','ᙣ'=>'ᙣ','ᙤ'=>'ᙤ','ᙥ'=>'ᙥ','ᙦ'=>'ᙦ','ᙧ'=>'ᙧ','ᙨ'=>'ᙨ','ᙩ'=>'ᙩ','ᙪ'=>'ᙪ','ᙫ'=>'ᙫ','ᙬ'=>'ᙬ','ᙯ'=>'ᙯ','ᙰ'=>'ᙰ','ᙱ'=>'ᙱ','ᙲ'=>'ᙲ','ᙳ'=>'ᙳ','ᙴ'=>'ᙴ','ᙵ'=>'ᙵ','ᙶ'=>'ᙶ','ᚁ'=>'ᚁ','ᚂ'=>'ᚂ','ᚃ'=>'ᚃ','ᚄ'=>'ᚄ','ᚅ'=>'ᚅ','ᚆ'=>'ᚆ','ᚇ'=>'ᚇ','ᚈ'=>'ᚈ','ᚉ'=>'ᚉ','ᚊ'=>'ᚊ','ᚋ'=>'ᚋ','ᚌ'=>'ᚌ','ᚍ'=>'ᚍ','ᚎ'=>'ᚎ','ᚏ'=>'ᚏ','ᚐ'=>'ᚐ','ᚑ'=>'ᚑ','ᚒ'=>'ᚒ','ᚓ'=>'ᚓ','ᚔ'=>'ᚔ','ᚕ'=>'ᚕ','ᚖ'=>'ᚖ','ᚗ'=>'ᚗ','ᚘ'=>'ᚘ','ᚙ'=>'ᚙ','ᚚ'=>'ᚚ','ᚠ'=>'ᚠ','ᚡ'=>'ᚡ','ᚢ'=>'ᚢ','ᚣ'=>'ᚣ','ᚤ'=>'ᚤ','ᚥ'=>'ᚥ','ᚦ'=>'ᚦ','ᚧ'=>'ᚧ','ᚨ'=>'ᚨ','ᚩ'=>'ᚩ','ᚪ'=>'ᚪ','ᚫ'=>'ᚫ','ᚬ'=>'ᚬ','ᚭ'=>'ᚭ','ᚮ'=>'ᚮ','ᚯ'=>'ᚯ','ᚰ'=>'ᚰ','ᚱ'=>'ᚱ','ᚲ'=>'ᚲ','ᚳ'=>'ᚳ','ᚴ'=>'ᚴ','ᚵ'=>'ᚵ','ᚶ'=>'ᚶ','ᚷ'=>'ᚷ','ᚸ'=>'ᚸ','ᚹ'=>'ᚹ','ᚺ'=>'ᚺ','ᚻ'=>'ᚻ','ᚼ'=>'ᚼ','ᚽ'=>'ᚽ','ᚾ'=>'ᚾ','ᚿ'=>'ᚿ','ᛀ'=>'ᛀ','ᛁ'=>'ᛁ','ᛂ'=>'ᛂ','ᛃ'=>'ᛃ','ᛄ'=>'ᛄ','ᛅ'=>'ᛅ','ᛆ'=>'ᛆ','ᛇ'=>'ᛇ','ᛈ'=>'ᛈ','ᛉ'=>'ᛉ','ᛊ'=>'ᛊ','ᛋ'=>'ᛋ','ᛌ'=>'ᛌ','ᛍ'=>'ᛍ','ᛎ'=>'ᛎ','ᛏ'=>'ᛏ','ᛐ'=>'ᛐ','ᛑ'=>'ᛑ','ᛒ'=>'ᛒ','ᛓ'=>'ᛓ','ᛔ'=>'ᛔ','ᛕ'=>'ᛕ','ᛖ'=>'ᛖ','ᛗ'=>'ᛗ','ᛘ'=>'ᛘ','ᛙ'=>'ᛙ','ᛚ'=>'ᛚ','ᛛ'=>'ᛛ','ᛜ'=>'ᛜ','ᛝ'=>'ᛝ','ᛞ'=>'ᛞ','ᛟ'=>'ᛟ','ᛠ'=>'ᛠ','ᛡ'=>'ᛡ','ᛢ'=>'ᛢ','ᛣ'=>'ᛣ','ᛤ'=>'ᛤ','ᛥ'=>'ᛥ','ᛦ'=>'ᛦ','ᛧ'=>'ᛧ','ᛨ'=>'ᛨ','ᛩ'=>'ᛩ','ᛪ'=>'ᛪ','ᛮ'=>'17','ᛯ'=>'18','ᛰ'=>'19','ᜀ'=>'ᜀ','ᜁ'=>'ᜁ','ᜂ'=>'ᜂ','ᜃ'=>'ᜃ','ᜄ'=>'ᜄ','ᜅ'=>'ᜅ','ᜆ'=>'ᜆ','ᜇ'=>'ᜇ','ᜈ'=>'ᜈ','ᜉ'=>'ᜉ','ᜊ'=>'ᜊ','ᜋ'=>'ᜋ','ᜌ'=>'ᜌ','ᜎ'=>'ᜎ','ᜏ'=>'ᜏ','ᜐ'=>'ᜐ','ᜑ'=>'ᜑ','ᜒ'=>'ᜒ','ᜓ'=>'ᜓ','᜔'=>'᜔','ᜠ'=>'ᜠ','ᜡ'=>'ᜡ','ᜢ'=>'ᜢ','ᜣ'=>'ᜣ','ᜤ'=>'ᜤ','ᜥ'=>'ᜥ','ᜦ'=>'ᜦ','ᜧ'=>'ᜧ','ᜨ'=>'ᜨ','ᜩ'=>'ᜩ','ᜪ'=>'ᜪ','ᜫ'=>'ᜫ','ᜬ'=>'ᜬ','ᜭ'=>'ᜭ','ᜮ'=>'ᜮ','ᜯ'=>'ᜯ','ᜰ'=>'ᜰ','ᜱ'=>'ᜱ','ᜲ'=>'ᜲ','ᜳ'=>'ᜳ','᜴'=>'᜴','ᝀ'=>'ᝀ','ᝁ'=>'ᝁ','ᝂ'=>'ᝂ','ᝃ'=>'ᝃ','ᝄ'=>'ᝄ','ᝅ'=>'ᝅ','ᝆ'=>'ᝆ','ᝇ'=>'ᝇ','ᝈ'=>'ᝈ','ᝉ'=>'ᝉ','ᝊ'=>'ᝊ','ᝋ'=>'ᝋ','ᝌ'=>'ᝌ','ᝍ'=>'ᝍ','ᝎ'=>'ᝎ','ᝏ'=>'ᝏ','ᝐ'=>'ᝐ','ᝑ'=>'ᝑ','ᝒ'=>'ᝒ','ᝓ'=>'ᝓ','ᝠ'=>'ᝠ','ᝡ'=>'ᝡ','ᝢ'=>'ᝢ','ᝣ'=>'ᝣ','ᝤ'=>'ᝤ','ᝥ'=>'ᝥ','ᝦ'=>'ᝦ','ᝧ'=>'ᝧ','ᝨ'=>'ᝨ','ᝩ'=>'ᝩ','ᝪ'=>'ᝪ','ᝫ'=>'ᝫ','ᝬ'=>'ᝬ','ᝮ'=>'ᝮ','ᝯ'=>'ᝯ','ᝰ'=>'ᝰ','ᝲ'=>'ᝲ','ᝳ'=>'ᝳ','ក'=>'ក','ខ'=>'ខ','គ'=>'គ','ឃ'=>'ឃ','ង'=>'ង','ច'=>'ច','ឆ'=>'ឆ','ជ'=>'ជ','ឈ'=>'ឈ','ញ'=>'ញ','ដ'=>'ដ','ឋ'=>'ឋ','ឌ'=>'ឌ','ឍ'=>'ឍ','ណ'=>'ណ','ត'=>'ត','ថ'=>'ថ','ទ'=>'ទ','ធ'=>'ធ','ន'=>'ន','ប'=>'ប','ផ'=>'ផ','ព'=>'ព','ភ'=>'ភ','ម'=>'ម','យ'=>'យ','រ'=>'រ','ល'=>'ល','វ'=>'វ','ឝ'=>'ឝ','ឞ'=>'ឞ','ស'=>'ស','ហ'=>'ហ','ឡ'=>'ឡ','អ'=>'អ','ឣ'=>'ឣ','ឤ'=>'ឤ','ឥ'=>'ឥ','ឦ'=>'ឦ','ឧ'=>'ឧ','ឨ'=>'ឨ','ឩ'=>'ឩ','ឪ'=>'ឪ','ឫ'=>'ឫ','ឬ'=>'ឬ','ឭ'=>'ឭ','ឮ'=>'ឮ','ឯ'=>'ឯ','ឰ'=>'ឰ','ឱ'=>'ឱ','ឲ'=>'ឲ','ឳ'=>'ឳ','ា'=>'ា','ិ'=>'ិ','ី'=>'ី','ឹ'=>'ឹ','ឺ'=>'ឺ','ុ'=>'ុ','ូ'=>'ូ','ួ'=>'ួ','ើ'=>'ើ','ឿ'=>'ឿ','ៀ'=>'ៀ','េ'=>'េ','ែ'=>'ែ','ៃ'=>'ៃ','ោ'=>'ោ','ៅ'=>'ៅ','ំ'=>'ំ','ះ'=>'ះ','ៈ'=>'ៈ','៉'=>'៉','៊'=>'៊','់'=>'់','៌'=>'៌','៍'=>'៍','៎'=>'៎','៏'=>'៏','័'=>'័','៑'=>'៑','្'=>'្','៓'=>'៓','ៗ'=>'ៗ','ៜ'=>'ៜ','៝'=>'៝','០'=>'0','១'=>'1','២'=>'2','៣'=>'3','៤'=>'4','៥'=>'5','៦'=>'6','៧'=>'7','៨'=>'8','៩'=>'9','៰'=>'0','៱'=>'1','៲'=>'2','៳'=>'3','៴'=>'4','៵'=>'5','៶'=>'6','៷'=>'7','៸'=>'8','៹'=>'9');
diff --git a/phpBB/includes/utf/data/search_indexer_20.php b/phpBB/includes/utf/data/search_indexer_20.php
index caab3c540b..0d2dfa6340 100644
--- a/phpBB/includes/utf/data/search_indexer_20.php
+++ b/phpBB/includes/utf/data/search_indexer_20.php
@@ -1 +1 @@
-<?php return array('ꀀ'=>'ꀀ','ꀁ'=>'ꀁ','ꀂ'=>'ꀂ','ꀃ'=>'ꀃ','ꀄ'=>'ꀄ','ꀅ'=>'ꀅ','ꀆ'=>'ꀆ','ꀇ'=>'ꀇ','ꀈ'=>'ꀈ','ꀉ'=>'ꀉ','ꀊ'=>'ꀊ','ꀋ'=>'ꀋ','ꀌ'=>'ꀌ','ꀍ'=>'ꀍ','ꀎ'=>'ꀎ','ꀏ'=>'ꀏ','ꀐ'=>'ꀐ','ꀑ'=>'ꀑ','ꀒ'=>'ꀒ','ꀓ'=>'ꀓ','ꀔ'=>'ꀔ','ꀕ'=>'ꀕ','ꀖ'=>'ꀖ','ꀗ'=>'ꀗ','ꀘ'=>'ꀘ','ꀙ'=>'ꀙ','ꀚ'=>'ꀚ','ꀛ'=>'ꀛ','ꀜ'=>'ꀜ','ꀝ'=>'ꀝ','ꀞ'=>'ꀞ','ꀟ'=>'ꀟ','ꀠ'=>'ꀠ','ꀡ'=>'ꀡ','ꀢ'=>'ꀢ','ꀣ'=>'ꀣ','ꀤ'=>'ꀤ','ꀥ'=>'ꀥ','ꀦ'=>'ꀦ','ꀧ'=>'ꀧ','ꀨ'=>'ꀨ','ꀩ'=>'ꀩ','ꀪ'=>'ꀪ','ꀫ'=>'ꀫ','ꀬ'=>'ꀬ','ꀭ'=>'ꀭ','ꀮ'=>'ꀮ','ꀯ'=>'ꀯ','ꀰ'=>'ꀰ','ꀱ'=>'ꀱ','ꀲ'=>'ꀲ','ꀳ'=>'ꀳ','ꀴ'=>'ꀴ','ꀵ'=>'ꀵ','ꀶ'=>'ꀶ','ꀷ'=>'ꀷ','ꀸ'=>'ꀸ','ꀹ'=>'ꀹ','ꀺ'=>'ꀺ','ꀻ'=>'ꀻ','ꀼ'=>'ꀼ','ꀽ'=>'ꀽ','ꀾ'=>'ꀾ','ꀿ'=>'ꀿ','ꁀ'=>'ꁀ','ꁁ'=>'ꁁ','ꁂ'=>'ꁂ','ꁃ'=>'ꁃ','ꁄ'=>'ꁄ','ꁅ'=>'ꁅ','ꁆ'=>'ꁆ','ꁇ'=>'ꁇ','ꁈ'=>'ꁈ','ꁉ'=>'ꁉ','ꁊ'=>'ꁊ','ꁋ'=>'ꁋ','ꁌ'=>'ꁌ','ꁍ'=>'ꁍ','ꁎ'=>'ꁎ','ꁏ'=>'ꁏ','ꁐ'=>'ꁐ','ꁑ'=>'ꁑ','ꁒ'=>'ꁒ','ꁓ'=>'ꁓ','ꁔ'=>'ꁔ','ꁕ'=>'ꁕ','ꁖ'=>'ꁖ','ꁗ'=>'ꁗ','ꁘ'=>'ꁘ','ꁙ'=>'ꁙ','ꁚ'=>'ꁚ','ꁛ'=>'ꁛ','ꁜ'=>'ꁜ','ꁝ'=>'ꁝ','ꁞ'=>'ꁞ','ꁟ'=>'ꁟ','ꁠ'=>'ꁠ','ꁡ'=>'ꁡ','ꁢ'=>'ꁢ','ꁣ'=>'ꁣ','ꁤ'=>'ꁤ','ꁥ'=>'ꁥ','ꁦ'=>'ꁦ','ꁧ'=>'ꁧ','ꁨ'=>'ꁨ','ꁩ'=>'ꁩ','ꁪ'=>'ꁪ','ꁫ'=>'ꁫ','ꁬ'=>'ꁬ','ꁭ'=>'ꁭ','ꁮ'=>'ꁮ','ꁯ'=>'ꁯ','ꁰ'=>'ꁰ','ꁱ'=>'ꁱ','ꁲ'=>'ꁲ','ꁳ'=>'ꁳ','ꁴ'=>'ꁴ','ꁵ'=>'ꁵ','ꁶ'=>'ꁶ','ꁷ'=>'ꁷ','ꁸ'=>'ꁸ','ꁹ'=>'ꁹ','ꁺ'=>'ꁺ','ꁻ'=>'ꁻ','ꁼ'=>'ꁼ','ꁽ'=>'ꁽ','ꁾ'=>'ꁾ','ꁿ'=>'ꁿ','ꂀ'=>'ꂀ','ꂁ'=>'ꂁ','ꂂ'=>'ꂂ','ꂃ'=>'ꂃ','ꂄ'=>'ꂄ','ꂅ'=>'ꂅ','ꂆ'=>'ꂆ','ꂇ'=>'ꂇ','ꂈ'=>'ꂈ','ꂉ'=>'ꂉ','ꂊ'=>'ꂊ','ꂋ'=>'ꂋ','ꂌ'=>'ꂌ','ꂍ'=>'ꂍ','ꂎ'=>'ꂎ','ꂏ'=>'ꂏ','ꂐ'=>'ꂐ','ꂑ'=>'ꂑ','ꂒ'=>'ꂒ','ꂓ'=>'ꂓ','ꂔ'=>'ꂔ','ꂕ'=>'ꂕ','ꂖ'=>'ꂖ','ꂗ'=>'ꂗ','ꂘ'=>'ꂘ','ꂙ'=>'ꂙ','ꂚ'=>'ꂚ','ꂛ'=>'ꂛ','ꂜ'=>'ꂜ','ꂝ'=>'ꂝ','ꂞ'=>'ꂞ','ꂟ'=>'ꂟ','ꂠ'=>'ꂠ','ꂡ'=>'ꂡ','ꂢ'=>'ꂢ','ꂣ'=>'ꂣ','ꂤ'=>'ꂤ','ꂥ'=>'ꂥ','ꂦ'=>'ꂦ','ꂧ'=>'ꂧ','ꂨ'=>'ꂨ','ꂩ'=>'ꂩ','ꂪ'=>'ꂪ','ꂫ'=>'ꂫ','ꂬ'=>'ꂬ','ꂭ'=>'ꂭ','ꂮ'=>'ꂮ','ꂯ'=>'ꂯ','ꂰ'=>'ꂰ','ꂱ'=>'ꂱ','ꂲ'=>'ꂲ','ꂳ'=>'ꂳ','ꂴ'=>'ꂴ','ꂵ'=>'ꂵ','ꂶ'=>'ꂶ','ꂷ'=>'ꂷ','ꂸ'=>'ꂸ','ꂹ'=>'ꂹ','ꂺ'=>'ꂺ','ꂻ'=>'ꂻ','ꂼ'=>'ꂼ','ꂽ'=>'ꂽ','ꂾ'=>'ꂾ','ꂿ'=>'ꂿ','ꃀ'=>'ꃀ','ꃁ'=>'ꃁ','ꃂ'=>'ꃂ','ꃃ'=>'ꃃ','ꃄ'=>'ꃄ','ꃅ'=>'ꃅ','ꃆ'=>'ꃆ','ꃇ'=>'ꃇ','ꃈ'=>'ꃈ','ꃉ'=>'ꃉ','ꃊ'=>'ꃊ','ꃋ'=>'ꃋ','ꃌ'=>'ꃌ','ꃍ'=>'ꃍ','ꃎ'=>'ꃎ','ꃏ'=>'ꃏ','ꃐ'=>'ꃐ','ꃑ'=>'ꃑ','ꃒ'=>'ꃒ','ꃓ'=>'ꃓ','ꃔ'=>'ꃔ','ꃕ'=>'ꃕ','ꃖ'=>'ꃖ','ꃗ'=>'ꃗ','ꃘ'=>'ꃘ','ꃙ'=>'ꃙ','ꃚ'=>'ꃚ','ꃛ'=>'ꃛ','ꃜ'=>'ꃜ','ꃝ'=>'ꃝ','ꃞ'=>'ꃞ','ꃟ'=>'ꃟ','ꃠ'=>'ꃠ','ꃡ'=>'ꃡ','ꃢ'=>'ꃢ','ꃣ'=>'ꃣ','ꃤ'=>'ꃤ','ꃥ'=>'ꃥ','ꃦ'=>'ꃦ','ꃧ'=>'ꃧ','ꃨ'=>'ꃨ','ꃩ'=>'ꃩ','ꃪ'=>'ꃪ','ꃫ'=>'ꃫ','ꃬ'=>'ꃬ','ꃭ'=>'ꃭ','ꃮ'=>'ꃮ','ꃯ'=>'ꃯ','ꃰ'=>'ꃰ','ꃱ'=>'ꃱ','ꃲ'=>'ꃲ','ꃳ'=>'ꃳ','ꃴ'=>'ꃴ','ꃵ'=>'ꃵ','ꃶ'=>'ꃶ','ꃷ'=>'ꃷ','ꃸ'=>'ꃸ','ꃹ'=>'ꃹ','ꃺ'=>'ꃺ','ꃻ'=>'ꃻ','ꃼ'=>'ꃼ','ꃽ'=>'ꃽ','ꃾ'=>'ꃾ','ꃿ'=>'ꃿ','ꄀ'=>'ꄀ','ꄁ'=>'ꄁ','ꄂ'=>'ꄂ','ꄃ'=>'ꄃ','ꄄ'=>'ꄄ','ꄅ'=>'ꄅ','ꄆ'=>'ꄆ','ꄇ'=>'ꄇ','ꄈ'=>'ꄈ','ꄉ'=>'ꄉ','ꄊ'=>'ꄊ','ꄋ'=>'ꄋ','ꄌ'=>'ꄌ','ꄍ'=>'ꄍ','ꄎ'=>'ꄎ','ꄏ'=>'ꄏ','ꄐ'=>'ꄐ','ꄑ'=>'ꄑ','ꄒ'=>'ꄒ','ꄓ'=>'ꄓ','ꄔ'=>'ꄔ','ꄕ'=>'ꄕ','ꄖ'=>'ꄖ','ꄗ'=>'ꄗ','ꄘ'=>'ꄘ','ꄙ'=>'ꄙ','ꄚ'=>'ꄚ','ꄛ'=>'ꄛ','ꄜ'=>'ꄜ','ꄝ'=>'ꄝ','ꄞ'=>'ꄞ','ꄟ'=>'ꄟ','ꄠ'=>'ꄠ','ꄡ'=>'ꄡ','ꄢ'=>'ꄢ','ꄣ'=>'ꄣ','ꄤ'=>'ꄤ','ꄥ'=>'ꄥ','ꄦ'=>'ꄦ','ꄧ'=>'ꄧ','ꄨ'=>'ꄨ','ꄩ'=>'ꄩ','ꄪ'=>'ꄪ','ꄫ'=>'ꄫ','ꄬ'=>'ꄬ','ꄭ'=>'ꄭ','ꄮ'=>'ꄮ','ꄯ'=>'ꄯ','ꄰ'=>'ꄰ','ꄱ'=>'ꄱ','ꄲ'=>'ꄲ','ꄳ'=>'ꄳ','ꄴ'=>'ꄴ','ꄵ'=>'ꄵ','ꄶ'=>'ꄶ','ꄷ'=>'ꄷ','ꄸ'=>'ꄸ','ꄹ'=>'ꄹ','ꄺ'=>'ꄺ','ꄻ'=>'ꄻ','ꄼ'=>'ꄼ','ꄽ'=>'ꄽ','ꄾ'=>'ꄾ','ꄿ'=>'ꄿ','ꅀ'=>'ꅀ','ꅁ'=>'ꅁ','ꅂ'=>'ꅂ','ꅃ'=>'ꅃ','ꅄ'=>'ꅄ','ꅅ'=>'ꅅ','ꅆ'=>'ꅆ','ꅇ'=>'ꅇ','ꅈ'=>'ꅈ','ꅉ'=>'ꅉ','ꅊ'=>'ꅊ','ꅋ'=>'ꅋ','ꅌ'=>'ꅌ','ꅍ'=>'ꅍ','ꅎ'=>'ꅎ','ꅏ'=>'ꅏ','ꅐ'=>'ꅐ','ꅑ'=>'ꅑ','ꅒ'=>'ꅒ','ꅓ'=>'ꅓ','ꅔ'=>'ꅔ','ꅕ'=>'ꅕ','ꅖ'=>'ꅖ','ꅗ'=>'ꅗ','ꅘ'=>'ꅘ','ꅙ'=>'ꅙ','ꅚ'=>'ꅚ','ꅛ'=>'ꅛ','ꅜ'=>'ꅜ','ꅝ'=>'ꅝ','ꅞ'=>'ꅞ','ꅟ'=>'ꅟ','ꅠ'=>'ꅠ','ꅡ'=>'ꅡ','ꅢ'=>'ꅢ','ꅣ'=>'ꅣ','ꅤ'=>'ꅤ','ꅥ'=>'ꅥ','ꅦ'=>'ꅦ','ꅧ'=>'ꅧ','ꅨ'=>'ꅨ','ꅩ'=>'ꅩ','ꅪ'=>'ꅪ','ꅫ'=>'ꅫ','ꅬ'=>'ꅬ','ꅭ'=>'ꅭ','ꅮ'=>'ꅮ','ꅯ'=>'ꅯ','ꅰ'=>'ꅰ','ꅱ'=>'ꅱ','ꅲ'=>'ꅲ','ꅳ'=>'ꅳ','ꅴ'=>'ꅴ','ꅵ'=>'ꅵ','ꅶ'=>'ꅶ','ꅷ'=>'ꅷ','ꅸ'=>'ꅸ','ꅹ'=>'ꅹ','ꅺ'=>'ꅺ','ꅻ'=>'ꅻ','ꅼ'=>'ꅼ','ꅽ'=>'ꅽ','ꅾ'=>'ꅾ','ꅿ'=>'ꅿ','ꆀ'=>'ꆀ','ꆁ'=>'ꆁ','ꆂ'=>'ꆂ','ꆃ'=>'ꆃ','ꆄ'=>'ꆄ','ꆅ'=>'ꆅ','ꆆ'=>'ꆆ','ꆇ'=>'ꆇ','ꆈ'=>'ꆈ','ꆉ'=>'ꆉ','ꆊ'=>'ꆊ','ꆋ'=>'ꆋ','ꆌ'=>'ꆌ','ꆍ'=>'ꆍ','ꆎ'=>'ꆎ','ꆏ'=>'ꆏ','ꆐ'=>'ꆐ','ꆑ'=>'ꆑ','ꆒ'=>'ꆒ','ꆓ'=>'ꆓ','ꆔ'=>'ꆔ','ꆕ'=>'ꆕ','ꆖ'=>'ꆖ','ꆗ'=>'ꆗ','ꆘ'=>'ꆘ','ꆙ'=>'ꆙ','ꆚ'=>'ꆚ','ꆛ'=>'ꆛ','ꆜ'=>'ꆜ','ꆝ'=>'ꆝ','ꆞ'=>'ꆞ','ꆟ'=>'ꆟ','ꆠ'=>'ꆠ','ꆡ'=>'ꆡ','ꆢ'=>'ꆢ','ꆣ'=>'ꆣ','ꆤ'=>'ꆤ','ꆥ'=>'ꆥ','ꆦ'=>'ꆦ','ꆧ'=>'ꆧ','ꆨ'=>'ꆨ','ꆩ'=>'ꆩ','ꆪ'=>'ꆪ','ꆫ'=>'ꆫ','ꆬ'=>'ꆬ','ꆭ'=>'ꆭ','ꆮ'=>'ꆮ','ꆯ'=>'ꆯ','ꆰ'=>'ꆰ','ꆱ'=>'ꆱ','ꆲ'=>'ꆲ','ꆳ'=>'ꆳ','ꆴ'=>'ꆴ','ꆵ'=>'ꆵ','ꆶ'=>'ꆶ','ꆷ'=>'ꆷ','ꆸ'=>'ꆸ','ꆹ'=>'ꆹ','ꆺ'=>'ꆺ','ꆻ'=>'ꆻ','ꆼ'=>'ꆼ','ꆽ'=>'ꆽ','ꆾ'=>'ꆾ','ꆿ'=>'ꆿ','ꇀ'=>'ꇀ','ꇁ'=>'ꇁ','ꇂ'=>'ꇂ','ꇃ'=>'ꇃ','ꇄ'=>'ꇄ','ꇅ'=>'ꇅ','ꇆ'=>'ꇆ','ꇇ'=>'ꇇ','ꇈ'=>'ꇈ','ꇉ'=>'ꇉ','ꇊ'=>'ꇊ','ꇋ'=>'ꇋ','ꇌ'=>'ꇌ','ꇍ'=>'ꇍ','ꇎ'=>'ꇎ','ꇏ'=>'ꇏ','ꇐ'=>'ꇐ','ꇑ'=>'ꇑ','ꇒ'=>'ꇒ','ꇓ'=>'ꇓ','ꇔ'=>'ꇔ','ꇕ'=>'ꇕ','ꇖ'=>'ꇖ','ꇗ'=>'ꇗ','ꇘ'=>'ꇘ','ꇙ'=>'ꇙ','ꇚ'=>'ꇚ','ꇛ'=>'ꇛ','ꇜ'=>'ꇜ','ꇝ'=>'ꇝ','ꇞ'=>'ꇞ','ꇟ'=>'ꇟ','ꇠ'=>'ꇠ','ꇡ'=>'ꇡ','ꇢ'=>'ꇢ','ꇣ'=>'ꇣ','ꇤ'=>'ꇤ','ꇥ'=>'ꇥ','ꇦ'=>'ꇦ','ꇧ'=>'ꇧ','ꇨ'=>'ꇨ','ꇩ'=>'ꇩ','ꇪ'=>'ꇪ','ꇫ'=>'ꇫ','ꇬ'=>'ꇬ','ꇭ'=>'ꇭ','ꇮ'=>'ꇮ','ꇯ'=>'ꇯ','ꇰ'=>'ꇰ','ꇱ'=>'ꇱ','ꇲ'=>'ꇲ','ꇳ'=>'ꇳ','ꇴ'=>'ꇴ','ꇵ'=>'ꇵ','ꇶ'=>'ꇶ','ꇷ'=>'ꇷ','ꇸ'=>'ꇸ','ꇹ'=>'ꇹ','ꇺ'=>'ꇺ','ꇻ'=>'ꇻ','ꇼ'=>'ꇼ','ꇽ'=>'ꇽ','ꇾ'=>'ꇾ','ꇿ'=>'ꇿ','ꈀ'=>'ꈀ','ꈁ'=>'ꈁ','ꈂ'=>'ꈂ','ꈃ'=>'ꈃ','ꈄ'=>'ꈄ','ꈅ'=>'ꈅ','ꈆ'=>'ꈆ','ꈇ'=>'ꈇ','ꈈ'=>'ꈈ','ꈉ'=>'ꈉ','ꈊ'=>'ꈊ','ꈋ'=>'ꈋ','ꈌ'=>'ꈌ','ꈍ'=>'ꈍ','ꈎ'=>'ꈎ','ꈏ'=>'ꈏ','ꈐ'=>'ꈐ','ꈑ'=>'ꈑ','ꈒ'=>'ꈒ','ꈓ'=>'ꈓ','ꈔ'=>'ꈔ','ꈕ'=>'ꈕ','ꈖ'=>'ꈖ','ꈗ'=>'ꈗ','ꈘ'=>'ꈘ','ꈙ'=>'ꈙ','ꈚ'=>'ꈚ','ꈛ'=>'ꈛ','ꈜ'=>'ꈜ','ꈝ'=>'ꈝ','ꈞ'=>'ꈞ','ꈟ'=>'ꈟ','ꈠ'=>'ꈠ','ꈡ'=>'ꈡ','ꈢ'=>'ꈢ','ꈣ'=>'ꈣ','ꈤ'=>'ꈤ','ꈥ'=>'ꈥ','ꈦ'=>'ꈦ','ꈧ'=>'ꈧ','ꈨ'=>'ꈨ','ꈩ'=>'ꈩ','ꈪ'=>'ꈪ','ꈫ'=>'ꈫ','ꈬ'=>'ꈬ','ꈭ'=>'ꈭ','ꈮ'=>'ꈮ','ꈯ'=>'ꈯ','ꈰ'=>'ꈰ','ꈱ'=>'ꈱ','ꈲ'=>'ꈲ','ꈳ'=>'ꈳ','ꈴ'=>'ꈴ','ꈵ'=>'ꈵ','ꈶ'=>'ꈶ','ꈷ'=>'ꈷ','ꈸ'=>'ꈸ','ꈹ'=>'ꈹ','ꈺ'=>'ꈺ','ꈻ'=>'ꈻ','ꈼ'=>'ꈼ','ꈽ'=>'ꈽ','ꈾ'=>'ꈾ','ꈿ'=>'ꈿ','ꉀ'=>'ꉀ','ꉁ'=>'ꉁ','ꉂ'=>'ꉂ','ꉃ'=>'ꉃ','ꉄ'=>'ꉄ','ꉅ'=>'ꉅ','ꉆ'=>'ꉆ','ꉇ'=>'ꉇ','ꉈ'=>'ꉈ','ꉉ'=>'ꉉ','ꉊ'=>'ꉊ','ꉋ'=>'ꉋ','ꉌ'=>'ꉌ','ꉍ'=>'ꉍ','ꉎ'=>'ꉎ','ꉏ'=>'ꉏ','ꉐ'=>'ꉐ','ꉑ'=>'ꉑ','ꉒ'=>'ꉒ','ꉓ'=>'ꉓ','ꉔ'=>'ꉔ','ꉕ'=>'ꉕ','ꉖ'=>'ꉖ','ꉗ'=>'ꉗ','ꉘ'=>'ꉘ','ꉙ'=>'ꉙ','ꉚ'=>'ꉚ','ꉛ'=>'ꉛ','ꉜ'=>'ꉜ','ꉝ'=>'ꉝ','ꉞ'=>'ꉞ','ꉟ'=>'ꉟ','ꉠ'=>'ꉠ','ꉡ'=>'ꉡ','ꉢ'=>'ꉢ','ꉣ'=>'ꉣ','ꉤ'=>'ꉤ','ꉥ'=>'ꉥ','ꉦ'=>'ꉦ','ꉧ'=>'ꉧ','ꉨ'=>'ꉨ','ꉩ'=>'ꉩ','ꉪ'=>'ꉪ','ꉫ'=>'ꉫ','ꉬ'=>'ꉬ','ꉭ'=>'ꉭ','ꉮ'=>'ꉮ','ꉯ'=>'ꉯ','ꉰ'=>'ꉰ','ꉱ'=>'ꉱ','ꉲ'=>'ꉲ','ꉳ'=>'ꉳ','ꉴ'=>'ꉴ','ꉵ'=>'ꉵ','ꉶ'=>'ꉶ','ꉷ'=>'ꉷ','ꉸ'=>'ꉸ','ꉹ'=>'ꉹ','ꉺ'=>'ꉺ','ꉻ'=>'ꉻ','ꉼ'=>'ꉼ','ꉽ'=>'ꉽ','ꉾ'=>'ꉾ','ꉿ'=>'ꉿ','ꊀ'=>'ꊀ','ꊁ'=>'ꊁ','ꊂ'=>'ꊂ','ꊃ'=>'ꊃ','ꊄ'=>'ꊄ','ꊅ'=>'ꊅ','ꊆ'=>'ꊆ','ꊇ'=>'ꊇ','ꊈ'=>'ꊈ','ꊉ'=>'ꊉ','ꊊ'=>'ꊊ','ꊋ'=>'ꊋ','ꊌ'=>'ꊌ','ꊍ'=>'ꊍ','ꊎ'=>'ꊎ','ꊏ'=>'ꊏ','ꊐ'=>'ꊐ','ꊑ'=>'ꊑ','ꊒ'=>'ꊒ','ꊓ'=>'ꊓ','ꊔ'=>'ꊔ','ꊕ'=>'ꊕ','ꊖ'=>'ꊖ','ꊗ'=>'ꊗ','ꊘ'=>'ꊘ','ꊙ'=>'ꊙ','ꊚ'=>'ꊚ','ꊛ'=>'ꊛ','ꊜ'=>'ꊜ','ꊝ'=>'ꊝ','ꊞ'=>'ꊞ','ꊟ'=>'ꊟ','ꊠ'=>'ꊠ','ꊡ'=>'ꊡ','ꊢ'=>'ꊢ','ꊣ'=>'ꊣ','ꊤ'=>'ꊤ','ꊥ'=>'ꊥ','ꊦ'=>'ꊦ','ꊧ'=>'ꊧ','ꊨ'=>'ꊨ','ꊩ'=>'ꊩ','ꊪ'=>'ꊪ','ꊫ'=>'ꊫ','ꊬ'=>'ꊬ','ꊭ'=>'ꊭ','ꊮ'=>'ꊮ','ꊯ'=>'ꊯ','ꊰ'=>'ꊰ','ꊱ'=>'ꊱ','ꊲ'=>'ꊲ','ꊳ'=>'ꊳ','ꊴ'=>'ꊴ','ꊵ'=>'ꊵ','ꊶ'=>'ꊶ','ꊷ'=>'ꊷ','ꊸ'=>'ꊸ','ꊹ'=>'ꊹ','ꊺ'=>'ꊺ','ꊻ'=>'ꊻ','ꊼ'=>'ꊼ','ꊽ'=>'ꊽ','ꊾ'=>'ꊾ','ꊿ'=>'ꊿ','ꋀ'=>'ꋀ','ꋁ'=>'ꋁ','ꋂ'=>'ꋂ','ꋃ'=>'ꋃ','ꋄ'=>'ꋄ','ꋅ'=>'ꋅ','ꋆ'=>'ꋆ','ꋇ'=>'ꋇ','ꋈ'=>'ꋈ','ꋉ'=>'ꋉ','ꋊ'=>'ꋊ','ꋋ'=>'ꋋ','ꋌ'=>'ꋌ','ꋍ'=>'ꋍ','ꋎ'=>'ꋎ','ꋏ'=>'ꋏ','ꋐ'=>'ꋐ','ꋑ'=>'ꋑ','ꋒ'=>'ꋒ','ꋓ'=>'ꋓ','ꋔ'=>'ꋔ','ꋕ'=>'ꋕ','ꋖ'=>'ꋖ','ꋗ'=>'ꋗ','ꋘ'=>'ꋘ','ꋙ'=>'ꋙ','ꋚ'=>'ꋚ','ꋛ'=>'ꋛ','ꋜ'=>'ꋜ','ꋝ'=>'ꋝ','ꋞ'=>'ꋞ','ꋟ'=>'ꋟ','ꋠ'=>'ꋠ','ꋡ'=>'ꋡ','ꋢ'=>'ꋢ','ꋣ'=>'ꋣ','ꋤ'=>'ꋤ','ꋥ'=>'ꋥ','ꋦ'=>'ꋦ','ꋧ'=>'ꋧ','ꋨ'=>'ꋨ','ꋩ'=>'ꋩ','ꋪ'=>'ꋪ','ꋫ'=>'ꋫ','ꋬ'=>'ꋬ','ꋭ'=>'ꋭ','ꋮ'=>'ꋮ','ꋯ'=>'ꋯ','ꋰ'=>'ꋰ','ꋱ'=>'ꋱ','ꋲ'=>'ꋲ','ꋳ'=>'ꋳ','ꋴ'=>'ꋴ','ꋵ'=>'ꋵ','ꋶ'=>'ꋶ','ꋷ'=>'ꋷ','ꋸ'=>'ꋸ','ꋹ'=>'ꋹ','ꋺ'=>'ꋺ','ꋻ'=>'ꋻ','ꋼ'=>'ꋼ','ꋽ'=>'ꋽ','ꋾ'=>'ꋾ','ꋿ'=>'ꋿ','ꌀ'=>'ꌀ','ꌁ'=>'ꌁ','ꌂ'=>'ꌂ','ꌃ'=>'ꌃ','ꌄ'=>'ꌄ','ꌅ'=>'ꌅ','ꌆ'=>'ꌆ','ꌇ'=>'ꌇ','ꌈ'=>'ꌈ','ꌉ'=>'ꌉ','ꌊ'=>'ꌊ','ꌋ'=>'ꌋ','ꌌ'=>'ꌌ','ꌍ'=>'ꌍ','ꌎ'=>'ꌎ','ꌏ'=>'ꌏ','ꌐ'=>'ꌐ','ꌑ'=>'ꌑ','ꌒ'=>'ꌒ','ꌓ'=>'ꌓ','ꌔ'=>'ꌔ','ꌕ'=>'ꌕ','ꌖ'=>'ꌖ','ꌗ'=>'ꌗ','ꌘ'=>'ꌘ','ꌙ'=>'ꌙ','ꌚ'=>'ꌚ','ꌛ'=>'ꌛ','ꌜ'=>'ꌜ','ꌝ'=>'ꌝ','ꌞ'=>'ꌞ','ꌟ'=>'ꌟ','ꌠ'=>'ꌠ','ꌡ'=>'ꌡ','ꌢ'=>'ꌢ','ꌣ'=>'ꌣ','ꌤ'=>'ꌤ','ꌥ'=>'ꌥ','ꌦ'=>'ꌦ','ꌧ'=>'ꌧ','ꌨ'=>'ꌨ','ꌩ'=>'ꌩ','ꌪ'=>'ꌪ','ꌫ'=>'ꌫ','ꌬ'=>'ꌬ','ꌭ'=>'ꌭ','ꌮ'=>'ꌮ','ꌯ'=>'ꌯ','ꌰ'=>'ꌰ','ꌱ'=>'ꌱ','ꌲ'=>'ꌲ','ꌳ'=>'ꌳ','ꌴ'=>'ꌴ','ꌵ'=>'ꌵ','ꌶ'=>'ꌶ','ꌷ'=>'ꌷ','ꌸ'=>'ꌸ','ꌹ'=>'ꌹ','ꌺ'=>'ꌺ','ꌻ'=>'ꌻ','ꌼ'=>'ꌼ','ꌽ'=>'ꌽ','ꌾ'=>'ꌾ','ꌿ'=>'ꌿ','ꍀ'=>'ꍀ','ꍁ'=>'ꍁ','ꍂ'=>'ꍂ','ꍃ'=>'ꍃ','ꍄ'=>'ꍄ','ꍅ'=>'ꍅ','ꍆ'=>'ꍆ','ꍇ'=>'ꍇ','ꍈ'=>'ꍈ','ꍉ'=>'ꍉ','ꍊ'=>'ꍊ','ꍋ'=>'ꍋ','ꍌ'=>'ꍌ','ꍍ'=>'ꍍ','ꍎ'=>'ꍎ','ꍏ'=>'ꍏ','ꍐ'=>'ꍐ','ꍑ'=>'ꍑ','ꍒ'=>'ꍒ','ꍓ'=>'ꍓ','ꍔ'=>'ꍔ','ꍕ'=>'ꍕ','ꍖ'=>'ꍖ','ꍗ'=>'ꍗ','ꍘ'=>'ꍘ','ꍙ'=>'ꍙ','ꍚ'=>'ꍚ','ꍛ'=>'ꍛ','ꍜ'=>'ꍜ','ꍝ'=>'ꍝ','ꍞ'=>'ꍞ','ꍟ'=>'ꍟ','ꍠ'=>'ꍠ','ꍡ'=>'ꍡ','ꍢ'=>'ꍢ','ꍣ'=>'ꍣ','ꍤ'=>'ꍤ','ꍥ'=>'ꍥ','ꍦ'=>'ꍦ','ꍧ'=>'ꍧ','ꍨ'=>'ꍨ','ꍩ'=>'ꍩ','ꍪ'=>'ꍪ','ꍫ'=>'ꍫ','ꍬ'=>'ꍬ','ꍭ'=>'ꍭ','ꍮ'=>'ꍮ','ꍯ'=>'ꍯ','ꍰ'=>'ꍰ','ꍱ'=>'ꍱ','ꍲ'=>'ꍲ','ꍳ'=>'ꍳ','ꍴ'=>'ꍴ','ꍵ'=>'ꍵ','ꍶ'=>'ꍶ','ꍷ'=>'ꍷ','ꍸ'=>'ꍸ','ꍹ'=>'ꍹ','ꍺ'=>'ꍺ','ꍻ'=>'ꍻ','ꍼ'=>'ꍼ','ꍽ'=>'ꍽ','ꍾ'=>'ꍾ','ꍿ'=>'ꍿ','ꎀ'=>'ꎀ','ꎁ'=>'ꎁ','ꎂ'=>'ꎂ','ꎃ'=>'ꎃ','ꎄ'=>'ꎄ','ꎅ'=>'ꎅ','ꎆ'=>'ꎆ','ꎇ'=>'ꎇ','ꎈ'=>'ꎈ','ꎉ'=>'ꎉ','ꎊ'=>'ꎊ','ꎋ'=>'ꎋ','ꎌ'=>'ꎌ','ꎍ'=>'ꎍ','ꎎ'=>'ꎎ','ꎏ'=>'ꎏ','ꎐ'=>'ꎐ','ꎑ'=>'ꎑ','ꎒ'=>'ꎒ','ꎓ'=>'ꎓ','ꎔ'=>'ꎔ','ꎕ'=>'ꎕ','ꎖ'=>'ꎖ','ꎗ'=>'ꎗ','ꎘ'=>'ꎘ','ꎙ'=>'ꎙ','ꎚ'=>'ꎚ','ꎛ'=>'ꎛ','ꎜ'=>'ꎜ','ꎝ'=>'ꎝ','ꎞ'=>'ꎞ','ꎟ'=>'ꎟ','ꎠ'=>'ꎠ','ꎡ'=>'ꎡ','ꎢ'=>'ꎢ','ꎣ'=>'ꎣ','ꎤ'=>'ꎤ','ꎥ'=>'ꎥ','ꎦ'=>'ꎦ','ꎧ'=>'ꎧ','ꎨ'=>'ꎨ','ꎩ'=>'ꎩ','ꎪ'=>'ꎪ','ꎫ'=>'ꎫ','ꎬ'=>'ꎬ','ꎭ'=>'ꎭ','ꎮ'=>'ꎮ','ꎯ'=>'ꎯ','ꎰ'=>'ꎰ','ꎱ'=>'ꎱ','ꎲ'=>'ꎲ','ꎳ'=>'ꎳ','ꎴ'=>'ꎴ','ꎵ'=>'ꎵ','ꎶ'=>'ꎶ','ꎷ'=>'ꎷ','ꎸ'=>'ꎸ','ꎹ'=>'ꎹ','ꎺ'=>'ꎺ','ꎻ'=>'ꎻ','ꎼ'=>'ꎼ','ꎽ'=>'ꎽ','ꎾ'=>'ꎾ','ꎿ'=>'ꎿ','ꏀ'=>'ꏀ','ꏁ'=>'ꏁ','ꏂ'=>'ꏂ','ꏃ'=>'ꏃ','ꏄ'=>'ꏄ','ꏅ'=>'ꏅ','ꏆ'=>'ꏆ','ꏇ'=>'ꏇ','ꏈ'=>'ꏈ','ꏉ'=>'ꏉ','ꏊ'=>'ꏊ','ꏋ'=>'ꏋ','ꏌ'=>'ꏌ','ꏍ'=>'ꏍ','ꏎ'=>'ꏎ','ꏏ'=>'ꏏ','ꏐ'=>'ꏐ','ꏑ'=>'ꏑ','ꏒ'=>'ꏒ','ꏓ'=>'ꏓ','ꏔ'=>'ꏔ','ꏕ'=>'ꏕ','ꏖ'=>'ꏖ','ꏗ'=>'ꏗ','ꏘ'=>'ꏘ','ꏙ'=>'ꏙ','ꏚ'=>'ꏚ','ꏛ'=>'ꏛ','ꏜ'=>'ꏜ','ꏝ'=>'ꏝ','ꏞ'=>'ꏞ','ꏟ'=>'ꏟ','ꏠ'=>'ꏠ','ꏡ'=>'ꏡ','ꏢ'=>'ꏢ','ꏣ'=>'ꏣ','ꏤ'=>'ꏤ','ꏥ'=>'ꏥ','ꏦ'=>'ꏦ','ꏧ'=>'ꏧ','ꏨ'=>'ꏨ','ꏩ'=>'ꏩ','ꏪ'=>'ꏪ','ꏫ'=>'ꏫ','ꏬ'=>'ꏬ','ꏭ'=>'ꏭ','ꏮ'=>'ꏮ','ꏯ'=>'ꏯ','ꏰ'=>'ꏰ','ꏱ'=>'ꏱ','ꏲ'=>'ꏲ','ꏳ'=>'ꏳ','ꏴ'=>'ꏴ','ꏵ'=>'ꏵ','ꏶ'=>'ꏶ','ꏷ'=>'ꏷ','ꏸ'=>'ꏸ','ꏹ'=>'ꏹ','ꏺ'=>'ꏺ','ꏻ'=>'ꏻ','ꏼ'=>'ꏼ','ꏽ'=>'ꏽ','ꏾ'=>'ꏾ','ꏿ'=>'ꏿ','ꐀ'=>'ꐀ','ꐁ'=>'ꐁ','ꐂ'=>'ꐂ','ꐃ'=>'ꐃ','ꐄ'=>'ꐄ','ꐅ'=>'ꐅ','ꐆ'=>'ꐆ','ꐇ'=>'ꐇ','ꐈ'=>'ꐈ','ꐉ'=>'ꐉ','ꐊ'=>'ꐊ','ꐋ'=>'ꐋ','ꐌ'=>'ꐌ','ꐍ'=>'ꐍ','ꐎ'=>'ꐎ','ꐏ'=>'ꐏ','ꐐ'=>'ꐐ','ꐑ'=>'ꐑ','ꐒ'=>'ꐒ','ꐓ'=>'ꐓ','ꐔ'=>'ꐔ','ꐕ'=>'ꐕ','ꐖ'=>'ꐖ','ꐗ'=>'ꐗ','ꐘ'=>'ꐘ','ꐙ'=>'ꐙ','ꐚ'=>'ꐚ','ꐛ'=>'ꐛ','ꐜ'=>'ꐜ','ꐝ'=>'ꐝ','ꐞ'=>'ꐞ','ꐟ'=>'ꐟ','ꐠ'=>'ꐠ','ꐡ'=>'ꐡ','ꐢ'=>'ꐢ','ꐣ'=>'ꐣ','ꐤ'=>'ꐤ','ꐥ'=>'ꐥ','ꐦ'=>'ꐦ','ꐧ'=>'ꐧ','ꐨ'=>'ꐨ','ꐩ'=>'ꐩ','ꐪ'=>'ꐪ','ꐫ'=>'ꐫ','ꐬ'=>'ꐬ','ꐭ'=>'ꐭ','ꐮ'=>'ꐮ','ꐯ'=>'ꐯ','ꐰ'=>'ꐰ','ꐱ'=>'ꐱ','ꐲ'=>'ꐲ','ꐳ'=>'ꐳ','ꐴ'=>'ꐴ','ꐵ'=>'ꐵ','ꐶ'=>'ꐶ','ꐷ'=>'ꐷ','ꐸ'=>'ꐸ','ꐹ'=>'ꐹ','ꐺ'=>'ꐺ','ꐻ'=>'ꐻ','ꐼ'=>'ꐼ','ꐽ'=>'ꐽ','ꐾ'=>'ꐾ','ꐿ'=>'ꐿ','ꑀ'=>'ꑀ','ꑁ'=>'ꑁ','ꑂ'=>'ꑂ','ꑃ'=>'ꑃ','ꑄ'=>'ꑄ','ꑅ'=>'ꑅ','ꑆ'=>'ꑆ','ꑇ'=>'ꑇ','ꑈ'=>'ꑈ','ꑉ'=>'ꑉ','ꑊ'=>'ꑊ','ꑋ'=>'ꑋ','ꑌ'=>'ꑌ','ꑍ'=>'ꑍ','ꑎ'=>'ꑎ','ꑏ'=>'ꑏ','ꑐ'=>'ꑐ','ꑑ'=>'ꑑ','ꑒ'=>'ꑒ','ꑓ'=>'ꑓ','ꑔ'=>'ꑔ','ꑕ'=>'ꑕ','ꑖ'=>'ꑖ','ꑗ'=>'ꑗ','ꑘ'=>'ꑘ','ꑙ'=>'ꑙ','ꑚ'=>'ꑚ','ꑛ'=>'ꑛ','ꑜ'=>'ꑜ','ꑝ'=>'ꑝ','ꑞ'=>'ꑞ','ꑟ'=>'ꑟ','ꑠ'=>'ꑠ','ꑡ'=>'ꑡ','ꑢ'=>'ꑢ','ꑣ'=>'ꑣ','ꑤ'=>'ꑤ','ꑥ'=>'ꑥ','ꑦ'=>'ꑦ','ꑧ'=>'ꑧ','ꑨ'=>'ꑨ','ꑩ'=>'ꑩ','ꑪ'=>'ꑪ','ꑫ'=>'ꑫ','ꑬ'=>'ꑬ','ꑭ'=>'ꑭ','ꑮ'=>'ꑮ','ꑯ'=>'ꑯ','ꑰ'=>'ꑰ','ꑱ'=>'ꑱ','ꑲ'=>'ꑲ','ꑳ'=>'ꑳ','ꑴ'=>'ꑴ','ꑵ'=>'ꑵ','ꑶ'=>'ꑶ','ꑷ'=>'ꑷ','ꑸ'=>'ꑸ','ꑹ'=>'ꑹ','ꑺ'=>'ꑺ','ꑻ'=>'ꑻ','ꑼ'=>'ꑼ','ꑽ'=>'ꑽ','ꑾ'=>'ꑾ','ꑿ'=>'ꑿ','ꒀ'=>'ꒀ','ꒁ'=>'ꒁ','ꒂ'=>'ꒂ','ꒃ'=>'ꒃ','ꒄ'=>'ꒄ','ꒅ'=>'ꒅ','ꒆ'=>'ꒆ','ꒇ'=>'ꒇ','ꒈ'=>'ꒈ','ꒉ'=>'ꒉ','ꒊ'=>'ꒊ','ꒋ'=>'ꒋ','ꒌ'=>'ꒌ','ꜗ'=>'ꜗ','ꜘ'=>'ꜘ','ꜙ'=>'ꜙ','ꜚ'=>'ꜚ'); \ No newline at end of file
+<?php return array('ꀀ'=>'ꀀ','ꀁ'=>'ꀁ','ꀂ'=>'ꀂ','ꀃ'=>'ꀃ','ꀄ'=>'ꀄ','ꀅ'=>'ꀅ','ꀆ'=>'ꀆ','ꀇ'=>'ꀇ','ꀈ'=>'ꀈ','ꀉ'=>'ꀉ','ꀊ'=>'ꀊ','ꀋ'=>'ꀋ','ꀌ'=>'ꀌ','ꀍ'=>'ꀍ','ꀎ'=>'ꀎ','ꀏ'=>'ꀏ','ꀐ'=>'ꀐ','ꀑ'=>'ꀑ','ꀒ'=>'ꀒ','ꀓ'=>'ꀓ','ꀔ'=>'ꀔ','ꀕ'=>'ꀕ','ꀖ'=>'ꀖ','ꀗ'=>'ꀗ','ꀘ'=>'ꀘ','ꀙ'=>'ꀙ','ꀚ'=>'ꀚ','ꀛ'=>'ꀛ','ꀜ'=>'ꀜ','ꀝ'=>'ꀝ','ꀞ'=>'ꀞ','ꀟ'=>'ꀟ','ꀠ'=>'ꀠ','ꀡ'=>'ꀡ','ꀢ'=>'ꀢ','ꀣ'=>'ꀣ','ꀤ'=>'ꀤ','ꀥ'=>'ꀥ','ꀦ'=>'ꀦ','ꀧ'=>'ꀧ','ꀨ'=>'ꀨ','ꀩ'=>'ꀩ','ꀪ'=>'ꀪ','ꀫ'=>'ꀫ','ꀬ'=>'ꀬ','ꀭ'=>'ꀭ','ꀮ'=>'ꀮ','ꀯ'=>'ꀯ','ꀰ'=>'ꀰ','ꀱ'=>'ꀱ','ꀲ'=>'ꀲ','ꀳ'=>'ꀳ','ꀴ'=>'ꀴ','ꀵ'=>'ꀵ','ꀶ'=>'ꀶ','ꀷ'=>'ꀷ','ꀸ'=>'ꀸ','ꀹ'=>'ꀹ','ꀺ'=>'ꀺ','ꀻ'=>'ꀻ','ꀼ'=>'ꀼ','ꀽ'=>'ꀽ','ꀾ'=>'ꀾ','ꀿ'=>'ꀿ','ꁀ'=>'ꁀ','ꁁ'=>'ꁁ','ꁂ'=>'ꁂ','ꁃ'=>'ꁃ','ꁄ'=>'ꁄ','ꁅ'=>'ꁅ','ꁆ'=>'ꁆ','ꁇ'=>'ꁇ','ꁈ'=>'ꁈ','ꁉ'=>'ꁉ','ꁊ'=>'ꁊ','ꁋ'=>'ꁋ','ꁌ'=>'ꁌ','ꁍ'=>'ꁍ','ꁎ'=>'ꁎ','ꁏ'=>'ꁏ','ꁐ'=>'ꁐ','ꁑ'=>'ꁑ','ꁒ'=>'ꁒ','ꁓ'=>'ꁓ','ꁔ'=>'ꁔ','ꁕ'=>'ꁕ','ꁖ'=>'ꁖ','ꁗ'=>'ꁗ','ꁘ'=>'ꁘ','ꁙ'=>'ꁙ','ꁚ'=>'ꁚ','ꁛ'=>'ꁛ','ꁜ'=>'ꁜ','ꁝ'=>'ꁝ','ꁞ'=>'ꁞ','ꁟ'=>'ꁟ','ꁠ'=>'ꁠ','ꁡ'=>'ꁡ','ꁢ'=>'ꁢ','ꁣ'=>'ꁣ','ꁤ'=>'ꁤ','ꁥ'=>'ꁥ','ꁦ'=>'ꁦ','ꁧ'=>'ꁧ','ꁨ'=>'ꁨ','ꁩ'=>'ꁩ','ꁪ'=>'ꁪ','ꁫ'=>'ꁫ','ꁬ'=>'ꁬ','ꁭ'=>'ꁭ','ꁮ'=>'ꁮ','ꁯ'=>'ꁯ','ꁰ'=>'ꁰ','ꁱ'=>'ꁱ','ꁲ'=>'ꁲ','ꁳ'=>'ꁳ','ꁴ'=>'ꁴ','ꁵ'=>'ꁵ','ꁶ'=>'ꁶ','ꁷ'=>'ꁷ','ꁸ'=>'ꁸ','ꁹ'=>'ꁹ','ꁺ'=>'ꁺ','ꁻ'=>'ꁻ','ꁼ'=>'ꁼ','ꁽ'=>'ꁽ','ꁾ'=>'ꁾ','ꁿ'=>'ꁿ','ꂀ'=>'ꂀ','ꂁ'=>'ꂁ','ꂂ'=>'ꂂ','ꂃ'=>'ꂃ','ꂄ'=>'ꂄ','ꂅ'=>'ꂅ','ꂆ'=>'ꂆ','ꂇ'=>'ꂇ','ꂈ'=>'ꂈ','ꂉ'=>'ꂉ','ꂊ'=>'ꂊ','ꂋ'=>'ꂋ','ꂌ'=>'ꂌ','ꂍ'=>'ꂍ','ꂎ'=>'ꂎ','ꂏ'=>'ꂏ','ꂐ'=>'ꂐ','ꂑ'=>'ꂑ','ꂒ'=>'ꂒ','ꂓ'=>'ꂓ','ꂔ'=>'ꂔ','ꂕ'=>'ꂕ','ꂖ'=>'ꂖ','ꂗ'=>'ꂗ','ꂘ'=>'ꂘ','ꂙ'=>'ꂙ','ꂚ'=>'ꂚ','ꂛ'=>'ꂛ','ꂜ'=>'ꂜ','ꂝ'=>'ꂝ','ꂞ'=>'ꂞ','ꂟ'=>'ꂟ','ꂠ'=>'ꂠ','ꂡ'=>'ꂡ','ꂢ'=>'ꂢ','ꂣ'=>'ꂣ','ꂤ'=>'ꂤ','ꂥ'=>'ꂥ','ꂦ'=>'ꂦ','ꂧ'=>'ꂧ','ꂨ'=>'ꂨ','ꂩ'=>'ꂩ','ꂪ'=>'ꂪ','ꂫ'=>'ꂫ','ꂬ'=>'ꂬ','ꂭ'=>'ꂭ','ꂮ'=>'ꂮ','ꂯ'=>'ꂯ','ꂰ'=>'ꂰ','ꂱ'=>'ꂱ','ꂲ'=>'ꂲ','ꂳ'=>'ꂳ','ꂴ'=>'ꂴ','ꂵ'=>'ꂵ','ꂶ'=>'ꂶ','ꂷ'=>'ꂷ','ꂸ'=>'ꂸ','ꂹ'=>'ꂹ','ꂺ'=>'ꂺ','ꂻ'=>'ꂻ','ꂼ'=>'ꂼ','ꂽ'=>'ꂽ','ꂾ'=>'ꂾ','ꂿ'=>'ꂿ','ꃀ'=>'ꃀ','ꃁ'=>'ꃁ','ꃂ'=>'ꃂ','ꃃ'=>'ꃃ','ꃄ'=>'ꃄ','ꃅ'=>'ꃅ','ꃆ'=>'ꃆ','ꃇ'=>'ꃇ','ꃈ'=>'ꃈ','ꃉ'=>'ꃉ','ꃊ'=>'ꃊ','ꃋ'=>'ꃋ','ꃌ'=>'ꃌ','ꃍ'=>'ꃍ','ꃎ'=>'ꃎ','ꃏ'=>'ꃏ','ꃐ'=>'ꃐ','ꃑ'=>'ꃑ','ꃒ'=>'ꃒ','ꃓ'=>'ꃓ','ꃔ'=>'ꃔ','ꃕ'=>'ꃕ','ꃖ'=>'ꃖ','ꃗ'=>'ꃗ','ꃘ'=>'ꃘ','ꃙ'=>'ꃙ','ꃚ'=>'ꃚ','ꃛ'=>'ꃛ','ꃜ'=>'ꃜ','ꃝ'=>'ꃝ','ꃞ'=>'ꃞ','ꃟ'=>'ꃟ','ꃠ'=>'ꃠ','ꃡ'=>'ꃡ','ꃢ'=>'ꃢ','ꃣ'=>'ꃣ','ꃤ'=>'ꃤ','ꃥ'=>'ꃥ','ꃦ'=>'ꃦ','ꃧ'=>'ꃧ','ꃨ'=>'ꃨ','ꃩ'=>'ꃩ','ꃪ'=>'ꃪ','ꃫ'=>'ꃫ','ꃬ'=>'ꃬ','ꃭ'=>'ꃭ','ꃮ'=>'ꃮ','ꃯ'=>'ꃯ','ꃰ'=>'ꃰ','ꃱ'=>'ꃱ','ꃲ'=>'ꃲ','ꃳ'=>'ꃳ','ꃴ'=>'ꃴ','ꃵ'=>'ꃵ','ꃶ'=>'ꃶ','ꃷ'=>'ꃷ','ꃸ'=>'ꃸ','ꃹ'=>'ꃹ','ꃺ'=>'ꃺ','ꃻ'=>'ꃻ','ꃼ'=>'ꃼ','ꃽ'=>'ꃽ','ꃾ'=>'ꃾ','ꃿ'=>'ꃿ','ꄀ'=>'ꄀ','ꄁ'=>'ꄁ','ꄂ'=>'ꄂ','ꄃ'=>'ꄃ','ꄄ'=>'ꄄ','ꄅ'=>'ꄅ','ꄆ'=>'ꄆ','ꄇ'=>'ꄇ','ꄈ'=>'ꄈ','ꄉ'=>'ꄉ','ꄊ'=>'ꄊ','ꄋ'=>'ꄋ','ꄌ'=>'ꄌ','ꄍ'=>'ꄍ','ꄎ'=>'ꄎ','ꄏ'=>'ꄏ','ꄐ'=>'ꄐ','ꄑ'=>'ꄑ','ꄒ'=>'ꄒ','ꄓ'=>'ꄓ','ꄔ'=>'ꄔ','ꄕ'=>'ꄕ','ꄖ'=>'ꄖ','ꄗ'=>'ꄗ','ꄘ'=>'ꄘ','ꄙ'=>'ꄙ','ꄚ'=>'ꄚ','ꄛ'=>'ꄛ','ꄜ'=>'ꄜ','ꄝ'=>'ꄝ','ꄞ'=>'ꄞ','ꄟ'=>'ꄟ','ꄠ'=>'ꄠ','ꄡ'=>'ꄡ','ꄢ'=>'ꄢ','ꄣ'=>'ꄣ','ꄤ'=>'ꄤ','ꄥ'=>'ꄥ','ꄦ'=>'ꄦ','ꄧ'=>'ꄧ','ꄨ'=>'ꄨ','ꄩ'=>'ꄩ','ꄪ'=>'ꄪ','ꄫ'=>'ꄫ','ꄬ'=>'ꄬ','ꄭ'=>'ꄭ','ꄮ'=>'ꄮ','ꄯ'=>'ꄯ','ꄰ'=>'ꄰ','ꄱ'=>'ꄱ','ꄲ'=>'ꄲ','ꄳ'=>'ꄳ','ꄴ'=>'ꄴ','ꄵ'=>'ꄵ','ꄶ'=>'ꄶ','ꄷ'=>'ꄷ','ꄸ'=>'ꄸ','ꄹ'=>'ꄹ','ꄺ'=>'ꄺ','ꄻ'=>'ꄻ','ꄼ'=>'ꄼ','ꄽ'=>'ꄽ','ꄾ'=>'ꄾ','ꄿ'=>'ꄿ','ꅀ'=>'ꅀ','ꅁ'=>'ꅁ','ꅂ'=>'ꅂ','ꅃ'=>'ꅃ','ꅄ'=>'ꅄ','ꅅ'=>'ꅅ','ꅆ'=>'ꅆ','ꅇ'=>'ꅇ','ꅈ'=>'ꅈ','ꅉ'=>'ꅉ','ꅊ'=>'ꅊ','ꅋ'=>'ꅋ','ꅌ'=>'ꅌ','ꅍ'=>'ꅍ','ꅎ'=>'ꅎ','ꅏ'=>'ꅏ','ꅐ'=>'ꅐ','ꅑ'=>'ꅑ','ꅒ'=>'ꅒ','ꅓ'=>'ꅓ','ꅔ'=>'ꅔ','ꅕ'=>'ꅕ','ꅖ'=>'ꅖ','ꅗ'=>'ꅗ','ꅘ'=>'ꅘ','ꅙ'=>'ꅙ','ꅚ'=>'ꅚ','ꅛ'=>'ꅛ','ꅜ'=>'ꅜ','ꅝ'=>'ꅝ','ꅞ'=>'ꅞ','ꅟ'=>'ꅟ','ꅠ'=>'ꅠ','ꅡ'=>'ꅡ','ꅢ'=>'ꅢ','ꅣ'=>'ꅣ','ꅤ'=>'ꅤ','ꅥ'=>'ꅥ','ꅦ'=>'ꅦ','ꅧ'=>'ꅧ','ꅨ'=>'ꅨ','ꅩ'=>'ꅩ','ꅪ'=>'ꅪ','ꅫ'=>'ꅫ','ꅬ'=>'ꅬ','ꅭ'=>'ꅭ','ꅮ'=>'ꅮ','ꅯ'=>'ꅯ','ꅰ'=>'ꅰ','ꅱ'=>'ꅱ','ꅲ'=>'ꅲ','ꅳ'=>'ꅳ','ꅴ'=>'ꅴ','ꅵ'=>'ꅵ','ꅶ'=>'ꅶ','ꅷ'=>'ꅷ','ꅸ'=>'ꅸ','ꅹ'=>'ꅹ','ꅺ'=>'ꅺ','ꅻ'=>'ꅻ','ꅼ'=>'ꅼ','ꅽ'=>'ꅽ','ꅾ'=>'ꅾ','ꅿ'=>'ꅿ','ꆀ'=>'ꆀ','ꆁ'=>'ꆁ','ꆂ'=>'ꆂ','ꆃ'=>'ꆃ','ꆄ'=>'ꆄ','ꆅ'=>'ꆅ','ꆆ'=>'ꆆ','ꆇ'=>'ꆇ','ꆈ'=>'ꆈ','ꆉ'=>'ꆉ','ꆊ'=>'ꆊ','ꆋ'=>'ꆋ','ꆌ'=>'ꆌ','ꆍ'=>'ꆍ','ꆎ'=>'ꆎ','ꆏ'=>'ꆏ','ꆐ'=>'ꆐ','ꆑ'=>'ꆑ','ꆒ'=>'ꆒ','ꆓ'=>'ꆓ','ꆔ'=>'ꆔ','ꆕ'=>'ꆕ','ꆖ'=>'ꆖ','ꆗ'=>'ꆗ','ꆘ'=>'ꆘ','ꆙ'=>'ꆙ','ꆚ'=>'ꆚ','ꆛ'=>'ꆛ','ꆜ'=>'ꆜ','ꆝ'=>'ꆝ','ꆞ'=>'ꆞ','ꆟ'=>'ꆟ','ꆠ'=>'ꆠ','ꆡ'=>'ꆡ','ꆢ'=>'ꆢ','ꆣ'=>'ꆣ','ꆤ'=>'ꆤ','ꆥ'=>'ꆥ','ꆦ'=>'ꆦ','ꆧ'=>'ꆧ','ꆨ'=>'ꆨ','ꆩ'=>'ꆩ','ꆪ'=>'ꆪ','ꆫ'=>'ꆫ','ꆬ'=>'ꆬ','ꆭ'=>'ꆭ','ꆮ'=>'ꆮ','ꆯ'=>'ꆯ','ꆰ'=>'ꆰ','ꆱ'=>'ꆱ','ꆲ'=>'ꆲ','ꆳ'=>'ꆳ','ꆴ'=>'ꆴ','ꆵ'=>'ꆵ','ꆶ'=>'ꆶ','ꆷ'=>'ꆷ','ꆸ'=>'ꆸ','ꆹ'=>'ꆹ','ꆺ'=>'ꆺ','ꆻ'=>'ꆻ','ꆼ'=>'ꆼ','ꆽ'=>'ꆽ','ꆾ'=>'ꆾ','ꆿ'=>'ꆿ','ꇀ'=>'ꇀ','ꇁ'=>'ꇁ','ꇂ'=>'ꇂ','ꇃ'=>'ꇃ','ꇄ'=>'ꇄ','ꇅ'=>'ꇅ','ꇆ'=>'ꇆ','ꇇ'=>'ꇇ','ꇈ'=>'ꇈ','ꇉ'=>'ꇉ','ꇊ'=>'ꇊ','ꇋ'=>'ꇋ','ꇌ'=>'ꇌ','ꇍ'=>'ꇍ','ꇎ'=>'ꇎ','ꇏ'=>'ꇏ','ꇐ'=>'ꇐ','ꇑ'=>'ꇑ','ꇒ'=>'ꇒ','ꇓ'=>'ꇓ','ꇔ'=>'ꇔ','ꇕ'=>'ꇕ','ꇖ'=>'ꇖ','ꇗ'=>'ꇗ','ꇘ'=>'ꇘ','ꇙ'=>'ꇙ','ꇚ'=>'ꇚ','ꇛ'=>'ꇛ','ꇜ'=>'ꇜ','ꇝ'=>'ꇝ','ꇞ'=>'ꇞ','ꇟ'=>'ꇟ','ꇠ'=>'ꇠ','ꇡ'=>'ꇡ','ꇢ'=>'ꇢ','ꇣ'=>'ꇣ','ꇤ'=>'ꇤ','ꇥ'=>'ꇥ','ꇦ'=>'ꇦ','ꇧ'=>'ꇧ','ꇨ'=>'ꇨ','ꇩ'=>'ꇩ','ꇪ'=>'ꇪ','ꇫ'=>'ꇫ','ꇬ'=>'ꇬ','ꇭ'=>'ꇭ','ꇮ'=>'ꇮ','ꇯ'=>'ꇯ','ꇰ'=>'ꇰ','ꇱ'=>'ꇱ','ꇲ'=>'ꇲ','ꇳ'=>'ꇳ','ꇴ'=>'ꇴ','ꇵ'=>'ꇵ','ꇶ'=>'ꇶ','ꇷ'=>'ꇷ','ꇸ'=>'ꇸ','ꇹ'=>'ꇹ','ꇺ'=>'ꇺ','ꇻ'=>'ꇻ','ꇼ'=>'ꇼ','ꇽ'=>'ꇽ','ꇾ'=>'ꇾ','ꇿ'=>'ꇿ','ꈀ'=>'ꈀ','ꈁ'=>'ꈁ','ꈂ'=>'ꈂ','ꈃ'=>'ꈃ','ꈄ'=>'ꈄ','ꈅ'=>'ꈅ','ꈆ'=>'ꈆ','ꈇ'=>'ꈇ','ꈈ'=>'ꈈ','ꈉ'=>'ꈉ','ꈊ'=>'ꈊ','ꈋ'=>'ꈋ','ꈌ'=>'ꈌ','ꈍ'=>'ꈍ','ꈎ'=>'ꈎ','ꈏ'=>'ꈏ','ꈐ'=>'ꈐ','ꈑ'=>'ꈑ','ꈒ'=>'ꈒ','ꈓ'=>'ꈓ','ꈔ'=>'ꈔ','ꈕ'=>'ꈕ','ꈖ'=>'ꈖ','ꈗ'=>'ꈗ','ꈘ'=>'ꈘ','ꈙ'=>'ꈙ','ꈚ'=>'ꈚ','ꈛ'=>'ꈛ','ꈜ'=>'ꈜ','ꈝ'=>'ꈝ','ꈞ'=>'ꈞ','ꈟ'=>'ꈟ','ꈠ'=>'ꈠ','ꈡ'=>'ꈡ','ꈢ'=>'ꈢ','ꈣ'=>'ꈣ','ꈤ'=>'ꈤ','ꈥ'=>'ꈥ','ꈦ'=>'ꈦ','ꈧ'=>'ꈧ','ꈨ'=>'ꈨ','ꈩ'=>'ꈩ','ꈪ'=>'ꈪ','ꈫ'=>'ꈫ','ꈬ'=>'ꈬ','ꈭ'=>'ꈭ','ꈮ'=>'ꈮ','ꈯ'=>'ꈯ','ꈰ'=>'ꈰ','ꈱ'=>'ꈱ','ꈲ'=>'ꈲ','ꈳ'=>'ꈳ','ꈴ'=>'ꈴ','ꈵ'=>'ꈵ','ꈶ'=>'ꈶ','ꈷ'=>'ꈷ','ꈸ'=>'ꈸ','ꈹ'=>'ꈹ','ꈺ'=>'ꈺ','ꈻ'=>'ꈻ','ꈼ'=>'ꈼ','ꈽ'=>'ꈽ','ꈾ'=>'ꈾ','ꈿ'=>'ꈿ','ꉀ'=>'ꉀ','ꉁ'=>'ꉁ','ꉂ'=>'ꉂ','ꉃ'=>'ꉃ','ꉄ'=>'ꉄ','ꉅ'=>'ꉅ','ꉆ'=>'ꉆ','ꉇ'=>'ꉇ','ꉈ'=>'ꉈ','ꉉ'=>'ꉉ','ꉊ'=>'ꉊ','ꉋ'=>'ꉋ','ꉌ'=>'ꉌ','ꉍ'=>'ꉍ','ꉎ'=>'ꉎ','ꉏ'=>'ꉏ','ꉐ'=>'ꉐ','ꉑ'=>'ꉑ','ꉒ'=>'ꉒ','ꉓ'=>'ꉓ','ꉔ'=>'ꉔ','ꉕ'=>'ꉕ','ꉖ'=>'ꉖ','ꉗ'=>'ꉗ','ꉘ'=>'ꉘ','ꉙ'=>'ꉙ','ꉚ'=>'ꉚ','ꉛ'=>'ꉛ','ꉜ'=>'ꉜ','ꉝ'=>'ꉝ','ꉞ'=>'ꉞ','ꉟ'=>'ꉟ','ꉠ'=>'ꉠ','ꉡ'=>'ꉡ','ꉢ'=>'ꉢ','ꉣ'=>'ꉣ','ꉤ'=>'ꉤ','ꉥ'=>'ꉥ','ꉦ'=>'ꉦ','ꉧ'=>'ꉧ','ꉨ'=>'ꉨ','ꉩ'=>'ꉩ','ꉪ'=>'ꉪ','ꉫ'=>'ꉫ','ꉬ'=>'ꉬ','ꉭ'=>'ꉭ','ꉮ'=>'ꉮ','ꉯ'=>'ꉯ','ꉰ'=>'ꉰ','ꉱ'=>'ꉱ','ꉲ'=>'ꉲ','ꉳ'=>'ꉳ','ꉴ'=>'ꉴ','ꉵ'=>'ꉵ','ꉶ'=>'ꉶ','ꉷ'=>'ꉷ','ꉸ'=>'ꉸ','ꉹ'=>'ꉹ','ꉺ'=>'ꉺ','ꉻ'=>'ꉻ','ꉼ'=>'ꉼ','ꉽ'=>'ꉽ','ꉾ'=>'ꉾ','ꉿ'=>'ꉿ','ꊀ'=>'ꊀ','ꊁ'=>'ꊁ','ꊂ'=>'ꊂ','ꊃ'=>'ꊃ','ꊄ'=>'ꊄ','ꊅ'=>'ꊅ','ꊆ'=>'ꊆ','ꊇ'=>'ꊇ','ꊈ'=>'ꊈ','ꊉ'=>'ꊉ','ꊊ'=>'ꊊ','ꊋ'=>'ꊋ','ꊌ'=>'ꊌ','ꊍ'=>'ꊍ','ꊎ'=>'ꊎ','ꊏ'=>'ꊏ','ꊐ'=>'ꊐ','ꊑ'=>'ꊑ','ꊒ'=>'ꊒ','ꊓ'=>'ꊓ','ꊔ'=>'ꊔ','ꊕ'=>'ꊕ','ꊖ'=>'ꊖ','ꊗ'=>'ꊗ','ꊘ'=>'ꊘ','ꊙ'=>'ꊙ','ꊚ'=>'ꊚ','ꊛ'=>'ꊛ','ꊜ'=>'ꊜ','ꊝ'=>'ꊝ','ꊞ'=>'ꊞ','ꊟ'=>'ꊟ','ꊠ'=>'ꊠ','ꊡ'=>'ꊡ','ꊢ'=>'ꊢ','ꊣ'=>'ꊣ','ꊤ'=>'ꊤ','ꊥ'=>'ꊥ','ꊦ'=>'ꊦ','ꊧ'=>'ꊧ','ꊨ'=>'ꊨ','ꊩ'=>'ꊩ','ꊪ'=>'ꊪ','ꊫ'=>'ꊫ','ꊬ'=>'ꊬ','ꊭ'=>'ꊭ','ꊮ'=>'ꊮ','ꊯ'=>'ꊯ','ꊰ'=>'ꊰ','ꊱ'=>'ꊱ','ꊲ'=>'ꊲ','ꊳ'=>'ꊳ','ꊴ'=>'ꊴ','ꊵ'=>'ꊵ','ꊶ'=>'ꊶ','ꊷ'=>'ꊷ','ꊸ'=>'ꊸ','ꊹ'=>'ꊹ','ꊺ'=>'ꊺ','ꊻ'=>'ꊻ','ꊼ'=>'ꊼ','ꊽ'=>'ꊽ','ꊾ'=>'ꊾ','ꊿ'=>'ꊿ','ꋀ'=>'ꋀ','ꋁ'=>'ꋁ','ꋂ'=>'ꋂ','ꋃ'=>'ꋃ','ꋄ'=>'ꋄ','ꋅ'=>'ꋅ','ꋆ'=>'ꋆ','ꋇ'=>'ꋇ','ꋈ'=>'ꋈ','ꋉ'=>'ꋉ','ꋊ'=>'ꋊ','ꋋ'=>'ꋋ','ꋌ'=>'ꋌ','ꋍ'=>'ꋍ','ꋎ'=>'ꋎ','ꋏ'=>'ꋏ','ꋐ'=>'ꋐ','ꋑ'=>'ꋑ','ꋒ'=>'ꋒ','ꋓ'=>'ꋓ','ꋔ'=>'ꋔ','ꋕ'=>'ꋕ','ꋖ'=>'ꋖ','ꋗ'=>'ꋗ','ꋘ'=>'ꋘ','ꋙ'=>'ꋙ','ꋚ'=>'ꋚ','ꋛ'=>'ꋛ','ꋜ'=>'ꋜ','ꋝ'=>'ꋝ','ꋞ'=>'ꋞ','ꋟ'=>'ꋟ','ꋠ'=>'ꋠ','ꋡ'=>'ꋡ','ꋢ'=>'ꋢ','ꋣ'=>'ꋣ','ꋤ'=>'ꋤ','ꋥ'=>'ꋥ','ꋦ'=>'ꋦ','ꋧ'=>'ꋧ','ꋨ'=>'ꋨ','ꋩ'=>'ꋩ','ꋪ'=>'ꋪ','ꋫ'=>'ꋫ','ꋬ'=>'ꋬ','ꋭ'=>'ꋭ','ꋮ'=>'ꋮ','ꋯ'=>'ꋯ','ꋰ'=>'ꋰ','ꋱ'=>'ꋱ','ꋲ'=>'ꋲ','ꋳ'=>'ꋳ','ꋴ'=>'ꋴ','ꋵ'=>'ꋵ','ꋶ'=>'ꋶ','ꋷ'=>'ꋷ','ꋸ'=>'ꋸ','ꋹ'=>'ꋹ','ꋺ'=>'ꋺ','ꋻ'=>'ꋻ','ꋼ'=>'ꋼ','ꋽ'=>'ꋽ','ꋾ'=>'ꋾ','ꋿ'=>'ꋿ','ꌀ'=>'ꌀ','ꌁ'=>'ꌁ','ꌂ'=>'ꌂ','ꌃ'=>'ꌃ','ꌄ'=>'ꌄ','ꌅ'=>'ꌅ','ꌆ'=>'ꌆ','ꌇ'=>'ꌇ','ꌈ'=>'ꌈ','ꌉ'=>'ꌉ','ꌊ'=>'ꌊ','ꌋ'=>'ꌋ','ꌌ'=>'ꌌ','ꌍ'=>'ꌍ','ꌎ'=>'ꌎ','ꌏ'=>'ꌏ','ꌐ'=>'ꌐ','ꌑ'=>'ꌑ','ꌒ'=>'ꌒ','ꌓ'=>'ꌓ','ꌔ'=>'ꌔ','ꌕ'=>'ꌕ','ꌖ'=>'ꌖ','ꌗ'=>'ꌗ','ꌘ'=>'ꌘ','ꌙ'=>'ꌙ','ꌚ'=>'ꌚ','ꌛ'=>'ꌛ','ꌜ'=>'ꌜ','ꌝ'=>'ꌝ','ꌞ'=>'ꌞ','ꌟ'=>'ꌟ','ꌠ'=>'ꌠ','ꌡ'=>'ꌡ','ꌢ'=>'ꌢ','ꌣ'=>'ꌣ','ꌤ'=>'ꌤ','ꌥ'=>'ꌥ','ꌦ'=>'ꌦ','ꌧ'=>'ꌧ','ꌨ'=>'ꌨ','ꌩ'=>'ꌩ','ꌪ'=>'ꌪ','ꌫ'=>'ꌫ','ꌬ'=>'ꌬ','ꌭ'=>'ꌭ','ꌮ'=>'ꌮ','ꌯ'=>'ꌯ','ꌰ'=>'ꌰ','ꌱ'=>'ꌱ','ꌲ'=>'ꌲ','ꌳ'=>'ꌳ','ꌴ'=>'ꌴ','ꌵ'=>'ꌵ','ꌶ'=>'ꌶ','ꌷ'=>'ꌷ','ꌸ'=>'ꌸ','ꌹ'=>'ꌹ','ꌺ'=>'ꌺ','ꌻ'=>'ꌻ','ꌼ'=>'ꌼ','ꌽ'=>'ꌽ','ꌾ'=>'ꌾ','ꌿ'=>'ꌿ','ꍀ'=>'ꍀ','ꍁ'=>'ꍁ','ꍂ'=>'ꍂ','ꍃ'=>'ꍃ','ꍄ'=>'ꍄ','ꍅ'=>'ꍅ','ꍆ'=>'ꍆ','ꍇ'=>'ꍇ','ꍈ'=>'ꍈ','ꍉ'=>'ꍉ','ꍊ'=>'ꍊ','ꍋ'=>'ꍋ','ꍌ'=>'ꍌ','ꍍ'=>'ꍍ','ꍎ'=>'ꍎ','ꍏ'=>'ꍏ','ꍐ'=>'ꍐ','ꍑ'=>'ꍑ','ꍒ'=>'ꍒ','ꍓ'=>'ꍓ','ꍔ'=>'ꍔ','ꍕ'=>'ꍕ','ꍖ'=>'ꍖ','ꍗ'=>'ꍗ','ꍘ'=>'ꍘ','ꍙ'=>'ꍙ','ꍚ'=>'ꍚ','ꍛ'=>'ꍛ','ꍜ'=>'ꍜ','ꍝ'=>'ꍝ','ꍞ'=>'ꍞ','ꍟ'=>'ꍟ','ꍠ'=>'ꍠ','ꍡ'=>'ꍡ','ꍢ'=>'ꍢ','ꍣ'=>'ꍣ','ꍤ'=>'ꍤ','ꍥ'=>'ꍥ','ꍦ'=>'ꍦ','ꍧ'=>'ꍧ','ꍨ'=>'ꍨ','ꍩ'=>'ꍩ','ꍪ'=>'ꍪ','ꍫ'=>'ꍫ','ꍬ'=>'ꍬ','ꍭ'=>'ꍭ','ꍮ'=>'ꍮ','ꍯ'=>'ꍯ','ꍰ'=>'ꍰ','ꍱ'=>'ꍱ','ꍲ'=>'ꍲ','ꍳ'=>'ꍳ','ꍴ'=>'ꍴ','ꍵ'=>'ꍵ','ꍶ'=>'ꍶ','ꍷ'=>'ꍷ','ꍸ'=>'ꍸ','ꍹ'=>'ꍹ','ꍺ'=>'ꍺ','ꍻ'=>'ꍻ','ꍼ'=>'ꍼ','ꍽ'=>'ꍽ','ꍾ'=>'ꍾ','ꍿ'=>'ꍿ','ꎀ'=>'ꎀ','ꎁ'=>'ꎁ','ꎂ'=>'ꎂ','ꎃ'=>'ꎃ','ꎄ'=>'ꎄ','ꎅ'=>'ꎅ','ꎆ'=>'ꎆ','ꎇ'=>'ꎇ','ꎈ'=>'ꎈ','ꎉ'=>'ꎉ','ꎊ'=>'ꎊ','ꎋ'=>'ꎋ','ꎌ'=>'ꎌ','ꎍ'=>'ꎍ','ꎎ'=>'ꎎ','ꎏ'=>'ꎏ','ꎐ'=>'ꎐ','ꎑ'=>'ꎑ','ꎒ'=>'ꎒ','ꎓ'=>'ꎓ','ꎔ'=>'ꎔ','ꎕ'=>'ꎕ','ꎖ'=>'ꎖ','ꎗ'=>'ꎗ','ꎘ'=>'ꎘ','ꎙ'=>'ꎙ','ꎚ'=>'ꎚ','ꎛ'=>'ꎛ','ꎜ'=>'ꎜ','ꎝ'=>'ꎝ','ꎞ'=>'ꎞ','ꎟ'=>'ꎟ','ꎠ'=>'ꎠ','ꎡ'=>'ꎡ','ꎢ'=>'ꎢ','ꎣ'=>'ꎣ','ꎤ'=>'ꎤ','ꎥ'=>'ꎥ','ꎦ'=>'ꎦ','ꎧ'=>'ꎧ','ꎨ'=>'ꎨ','ꎩ'=>'ꎩ','ꎪ'=>'ꎪ','ꎫ'=>'ꎫ','ꎬ'=>'ꎬ','ꎭ'=>'ꎭ','ꎮ'=>'ꎮ','ꎯ'=>'ꎯ','ꎰ'=>'ꎰ','ꎱ'=>'ꎱ','ꎲ'=>'ꎲ','ꎳ'=>'ꎳ','ꎴ'=>'ꎴ','ꎵ'=>'ꎵ','ꎶ'=>'ꎶ','ꎷ'=>'ꎷ','ꎸ'=>'ꎸ','ꎹ'=>'ꎹ','ꎺ'=>'ꎺ','ꎻ'=>'ꎻ','ꎼ'=>'ꎼ','ꎽ'=>'ꎽ','ꎾ'=>'ꎾ','ꎿ'=>'ꎿ','ꏀ'=>'ꏀ','ꏁ'=>'ꏁ','ꏂ'=>'ꏂ','ꏃ'=>'ꏃ','ꏄ'=>'ꏄ','ꏅ'=>'ꏅ','ꏆ'=>'ꏆ','ꏇ'=>'ꏇ','ꏈ'=>'ꏈ','ꏉ'=>'ꏉ','ꏊ'=>'ꏊ','ꏋ'=>'ꏋ','ꏌ'=>'ꏌ','ꏍ'=>'ꏍ','ꏎ'=>'ꏎ','ꏏ'=>'ꏏ','ꏐ'=>'ꏐ','ꏑ'=>'ꏑ','ꏒ'=>'ꏒ','ꏓ'=>'ꏓ','ꏔ'=>'ꏔ','ꏕ'=>'ꏕ','ꏖ'=>'ꏖ','ꏗ'=>'ꏗ','ꏘ'=>'ꏘ','ꏙ'=>'ꏙ','ꏚ'=>'ꏚ','ꏛ'=>'ꏛ','ꏜ'=>'ꏜ','ꏝ'=>'ꏝ','ꏞ'=>'ꏞ','ꏟ'=>'ꏟ','ꏠ'=>'ꏠ','ꏡ'=>'ꏡ','ꏢ'=>'ꏢ','ꏣ'=>'ꏣ','ꏤ'=>'ꏤ','ꏥ'=>'ꏥ','ꏦ'=>'ꏦ','ꏧ'=>'ꏧ','ꏨ'=>'ꏨ','ꏩ'=>'ꏩ','ꏪ'=>'ꏪ','ꏫ'=>'ꏫ','ꏬ'=>'ꏬ','ꏭ'=>'ꏭ','ꏮ'=>'ꏮ','ꏯ'=>'ꏯ','ꏰ'=>'ꏰ','ꏱ'=>'ꏱ','ꏲ'=>'ꏲ','ꏳ'=>'ꏳ','ꏴ'=>'ꏴ','ꏵ'=>'ꏵ','ꏶ'=>'ꏶ','ꏷ'=>'ꏷ','ꏸ'=>'ꏸ','ꏹ'=>'ꏹ','ꏺ'=>'ꏺ','ꏻ'=>'ꏻ','ꏼ'=>'ꏼ','ꏽ'=>'ꏽ','ꏾ'=>'ꏾ','ꏿ'=>'ꏿ','ꐀ'=>'ꐀ','ꐁ'=>'ꐁ','ꐂ'=>'ꐂ','ꐃ'=>'ꐃ','ꐄ'=>'ꐄ','ꐅ'=>'ꐅ','ꐆ'=>'ꐆ','ꐇ'=>'ꐇ','ꐈ'=>'ꐈ','ꐉ'=>'ꐉ','ꐊ'=>'ꐊ','ꐋ'=>'ꐋ','ꐌ'=>'ꐌ','ꐍ'=>'ꐍ','ꐎ'=>'ꐎ','ꐏ'=>'ꐏ','ꐐ'=>'ꐐ','ꐑ'=>'ꐑ','ꐒ'=>'ꐒ','ꐓ'=>'ꐓ','ꐔ'=>'ꐔ','ꐕ'=>'ꐕ','ꐖ'=>'ꐖ','ꐗ'=>'ꐗ','ꐘ'=>'ꐘ','ꐙ'=>'ꐙ','ꐚ'=>'ꐚ','ꐛ'=>'ꐛ','ꐜ'=>'ꐜ','ꐝ'=>'ꐝ','ꐞ'=>'ꐞ','ꐟ'=>'ꐟ','ꐠ'=>'ꐠ','ꐡ'=>'ꐡ','ꐢ'=>'ꐢ','ꐣ'=>'ꐣ','ꐤ'=>'ꐤ','ꐥ'=>'ꐥ','ꐦ'=>'ꐦ','ꐧ'=>'ꐧ','ꐨ'=>'ꐨ','ꐩ'=>'ꐩ','ꐪ'=>'ꐪ','ꐫ'=>'ꐫ','ꐬ'=>'ꐬ','ꐭ'=>'ꐭ','ꐮ'=>'ꐮ','ꐯ'=>'ꐯ','ꐰ'=>'ꐰ','ꐱ'=>'ꐱ','ꐲ'=>'ꐲ','ꐳ'=>'ꐳ','ꐴ'=>'ꐴ','ꐵ'=>'ꐵ','ꐶ'=>'ꐶ','ꐷ'=>'ꐷ','ꐸ'=>'ꐸ','ꐹ'=>'ꐹ','ꐺ'=>'ꐺ','ꐻ'=>'ꐻ','ꐼ'=>'ꐼ','ꐽ'=>'ꐽ','ꐾ'=>'ꐾ','ꐿ'=>'ꐿ','ꑀ'=>'ꑀ','ꑁ'=>'ꑁ','ꑂ'=>'ꑂ','ꑃ'=>'ꑃ','ꑄ'=>'ꑄ','ꑅ'=>'ꑅ','ꑆ'=>'ꑆ','ꑇ'=>'ꑇ','ꑈ'=>'ꑈ','ꑉ'=>'ꑉ','ꑊ'=>'ꑊ','ꑋ'=>'ꑋ','ꑌ'=>'ꑌ','ꑍ'=>'ꑍ','ꑎ'=>'ꑎ','ꑏ'=>'ꑏ','ꑐ'=>'ꑐ','ꑑ'=>'ꑑ','ꑒ'=>'ꑒ','ꑓ'=>'ꑓ','ꑔ'=>'ꑔ','ꑕ'=>'ꑕ','ꑖ'=>'ꑖ','ꑗ'=>'ꑗ','ꑘ'=>'ꑘ','ꑙ'=>'ꑙ','ꑚ'=>'ꑚ','ꑛ'=>'ꑛ','ꑜ'=>'ꑜ','ꑝ'=>'ꑝ','ꑞ'=>'ꑞ','ꑟ'=>'ꑟ','ꑠ'=>'ꑠ','ꑡ'=>'ꑡ','ꑢ'=>'ꑢ','ꑣ'=>'ꑣ','ꑤ'=>'ꑤ','ꑥ'=>'ꑥ','ꑦ'=>'ꑦ','ꑧ'=>'ꑧ','ꑨ'=>'ꑨ','ꑩ'=>'ꑩ','ꑪ'=>'ꑪ','ꑫ'=>'ꑫ','ꑬ'=>'ꑬ','ꑭ'=>'ꑭ','ꑮ'=>'ꑮ','ꑯ'=>'ꑯ','ꑰ'=>'ꑰ','ꑱ'=>'ꑱ','ꑲ'=>'ꑲ','ꑳ'=>'ꑳ','ꑴ'=>'ꑴ','ꑵ'=>'ꑵ','ꑶ'=>'ꑶ','ꑷ'=>'ꑷ','ꑸ'=>'ꑸ','ꑹ'=>'ꑹ','ꑺ'=>'ꑺ','ꑻ'=>'ꑻ','ꑼ'=>'ꑼ','ꑽ'=>'ꑽ','ꑾ'=>'ꑾ','ꑿ'=>'ꑿ','ꒀ'=>'ꒀ','ꒁ'=>'ꒁ','ꒂ'=>'ꒂ','ꒃ'=>'ꒃ','ꒄ'=>'ꒄ','ꒅ'=>'ꒅ','ꒆ'=>'ꒆ','ꒇ'=>'ꒇ','ꒈ'=>'ꒈ','ꒉ'=>'ꒉ','ꒊ'=>'ꒊ','ꒋ'=>'ꒋ','ꒌ'=>'ꒌ','ꜗ'=>'ꜗ','ꜘ'=>'ꜘ','ꜙ'=>'ꜙ','ꜚ'=>'ꜚ');
diff --git a/phpBB/includes/utf/data/search_indexer_21.php b/phpBB/includes/utf/data/search_indexer_21.php
index 7fc3e4dc09..34994b47d7 100644
--- a/phpBB/includes/utf/data/search_indexer_21.php
+++ b/phpBB/includes/utf/data/search_indexer_21.php
@@ -1 +1 @@
-<?php return array('ꠀ'=>'ꠀ','ꠁ'=>'ꠁ','ꠂ'=>'ꠂ','ꠃ'=>'ꠃ','ꠄ'=>'ꠄ','ꠅ'=>'ꠅ','꠆'=>'꠆','ꠇ'=>'ꠇ','ꠈ'=>'ꠈ','ꠉ'=>'ꠉ','ꠊ'=>'ꠊ','ꠋ'=>'ꠋ','ꠌ'=>'ꠌ','ꠍ'=>'ꠍ','ꠎ'=>'ꠎ','ꠏ'=>'ꠏ','ꠐ'=>'ꠐ','ꠑ'=>'ꠑ','ꠒ'=>'ꠒ','ꠓ'=>'ꠓ','ꠔ'=>'ꠔ','ꠕ'=>'ꠕ','ꠖ'=>'ꠖ','ꠗ'=>'ꠗ','ꠘ'=>'ꠘ','ꠙ'=>'ꠙ','ꠚ'=>'ꠚ','ꠛ'=>'ꠛ','ꠜ'=>'ꠜ','ꠝ'=>'ꠝ','ꠞ'=>'ꠞ','ꠟ'=>'ꠟ','ꠠ'=>'ꠠ','ꠡ'=>'ꠡ','ꠢ'=>'ꠢ','ꠣ'=>'ꠣ','ꠤ'=>'ꠤ','ꠥ'=>'ꠥ','ꠦ'=>'ꠦ','ꠧ'=>'ꠧ','ꡀ'=>'ꡀ','ꡁ'=>'ꡁ','ꡂ'=>'ꡂ','ꡃ'=>'ꡃ','ꡄ'=>'ꡄ','ꡅ'=>'ꡅ','ꡆ'=>'ꡆ','ꡇ'=>'ꡇ','ꡈ'=>'ꡈ','ꡉ'=>'ꡉ','ꡊ'=>'ꡊ','ꡋ'=>'ꡋ','ꡌ'=>'ꡌ','ꡍ'=>'ꡍ','ꡎ'=>'ꡎ','ꡏ'=>'ꡏ','ꡐ'=>'ꡐ','ꡑ'=>'ꡑ','ꡒ'=>'ꡒ','ꡓ'=>'ꡓ','ꡔ'=>'ꡔ','ꡕ'=>'ꡕ','ꡖ'=>'ꡖ','ꡗ'=>'ꡗ','ꡘ'=>'ꡘ','ꡙ'=>'ꡙ','ꡚ'=>'ꡚ','ꡛ'=>'ꡛ','ꡜ'=>'ꡜ','ꡝ'=>'ꡝ','ꡞ'=>'ꡞ','ꡟ'=>'ꡟ','ꡠ'=>'ꡠ','ꡡ'=>'ꡡ','ꡢ'=>'ꡢ','ꡣ'=>'ꡣ','ꡤ'=>'ꡤ','ꡥ'=>'ꡥ','ꡦ'=>'ꡦ','ꡧ'=>'ꡧ','ꡨ'=>'ꡨ','ꡩ'=>'ꡩ','ꡪ'=>'ꡪ','ꡫ'=>'ꡫ','ꡬ'=>'ꡬ','ꡭ'=>'ꡭ','ꡮ'=>'ꡮ','ꡯ'=>'ꡯ','ꡰ'=>'ꡰ','ꡱ'=>'ꡱ','ꡲ'=>'ꡲ','ꡳ'=>'ꡳ','가'=>'가'); \ No newline at end of file
+<?php return array('ꠀ'=>'ꠀ','ꠁ'=>'ꠁ','ꠂ'=>'ꠂ','ꠃ'=>'ꠃ','ꠄ'=>'ꠄ','ꠅ'=>'ꠅ','꠆'=>'꠆','ꠇ'=>'ꠇ','ꠈ'=>'ꠈ','ꠉ'=>'ꠉ','ꠊ'=>'ꠊ','ꠋ'=>'ꠋ','ꠌ'=>'ꠌ','ꠍ'=>'ꠍ','ꠎ'=>'ꠎ','ꠏ'=>'ꠏ','ꠐ'=>'ꠐ','ꠑ'=>'ꠑ','ꠒ'=>'ꠒ','ꠓ'=>'ꠓ','ꠔ'=>'ꠔ','ꠕ'=>'ꠕ','ꠖ'=>'ꠖ','ꠗ'=>'ꠗ','ꠘ'=>'ꠘ','ꠙ'=>'ꠙ','ꠚ'=>'ꠚ','ꠛ'=>'ꠛ','ꠜ'=>'ꠜ','ꠝ'=>'ꠝ','ꠞ'=>'ꠞ','ꠟ'=>'ꠟ','ꠠ'=>'ꠠ','ꠡ'=>'ꠡ','ꠢ'=>'ꠢ','ꠣ'=>'ꠣ','ꠤ'=>'ꠤ','ꠥ'=>'ꠥ','ꠦ'=>'ꠦ','ꠧ'=>'ꠧ','ꡀ'=>'ꡀ','ꡁ'=>'ꡁ','ꡂ'=>'ꡂ','ꡃ'=>'ꡃ','ꡄ'=>'ꡄ','ꡅ'=>'ꡅ','ꡆ'=>'ꡆ','ꡇ'=>'ꡇ','ꡈ'=>'ꡈ','ꡉ'=>'ꡉ','ꡊ'=>'ꡊ','ꡋ'=>'ꡋ','ꡌ'=>'ꡌ','ꡍ'=>'ꡍ','ꡎ'=>'ꡎ','ꡏ'=>'ꡏ','ꡐ'=>'ꡐ','ꡑ'=>'ꡑ','ꡒ'=>'ꡒ','ꡓ'=>'ꡓ','ꡔ'=>'ꡔ','ꡕ'=>'ꡕ','ꡖ'=>'ꡖ','ꡗ'=>'ꡗ','ꡘ'=>'ꡘ','ꡙ'=>'ꡙ','ꡚ'=>'ꡚ','ꡛ'=>'ꡛ','ꡜ'=>'ꡜ','ꡝ'=>'ꡝ','ꡞ'=>'ꡞ','ꡟ'=>'ꡟ','ꡠ'=>'ꡠ','ꡡ'=>'ꡡ','ꡢ'=>'ꡢ','ꡣ'=>'ꡣ','ꡤ'=>'ꡤ','ꡥ'=>'ꡥ','ꡦ'=>'ꡦ','ꡧ'=>'ꡧ','ꡨ'=>'ꡨ','ꡩ'=>'ꡩ','ꡪ'=>'ꡪ','ꡫ'=>'ꡫ','ꡬ'=>'ꡬ','ꡭ'=>'ꡭ','ꡮ'=>'ꡮ','ꡯ'=>'ꡯ','ꡰ'=>'ꡰ','ꡱ'=>'ꡱ','ꡲ'=>'ꡲ','ꡳ'=>'ꡳ','가'=>'가');
diff --git a/phpBB/includes/utf/data/search_indexer_26.php b/phpBB/includes/utf/data/search_indexer_26.php
index b8718bd608..444ab96ba8 100644
--- a/phpBB/includes/utf/data/search_indexer_26.php
+++ b/phpBB/includes/utf/data/search_indexer_26.php
@@ -1 +1 @@
-<?php return array('힣'=>'힣'); \ No newline at end of file
+<?php return array('힣'=>'힣');
diff --git a/phpBB/includes/utf/data/search_indexer_3.php b/phpBB/includes/utf/data/search_indexer_3.php
index 41798c9e86..ceab762ca9 100644
--- a/phpBB/includes/utf/data/search_indexer_3.php
+++ b/phpBB/includes/utf/data/search_indexer_3.php
@@ -1 +1 @@
-<?php return array('᠋'=>'᠋','᠌'=>'᠌','᠍'=>'᠍','᠐'=>'0','᠑'=>'1','᠒'=>'2','᠓'=>'3','᠔'=>'4','᠕'=>'5','᠖'=>'6','᠗'=>'7','᠘'=>'8','᠙'=>'9','ᠠ'=>'ᠠ','ᠡ'=>'ᠡ','ᠢ'=>'ᠢ','ᠣ'=>'ᠣ','ᠤ'=>'ᠤ','ᠥ'=>'ᠥ','ᠦ'=>'ᠦ','ᠧ'=>'ᠧ','ᠨ'=>'ᠨ','ᠩ'=>'ᠩ','ᠪ'=>'ᠪ','ᠫ'=>'ᠫ','ᠬ'=>'ᠬ','ᠭ'=>'ᠭ','ᠮ'=>'ᠮ','ᠯ'=>'ᠯ','ᠰ'=>'ᠰ','ᠱ'=>'ᠱ','ᠲ'=>'ᠲ','ᠳ'=>'ᠳ','ᠴ'=>'ᠴ','ᠵ'=>'ᠵ','ᠶ'=>'ᠶ','ᠷ'=>'ᠷ','ᠸ'=>'ᠸ','ᠹ'=>'ᠹ','ᠺ'=>'ᠺ','ᠻ'=>'ᠻ','ᠼ'=>'ᠼ','ᠽ'=>'ᠽ','ᠾ'=>'ᠾ','ᠿ'=>'ᠿ','ᡀ'=>'ᡀ','ᡁ'=>'ᡁ','ᡂ'=>'ᡂ','ᡃ'=>'ᡃ','ᡄ'=>'ᡄ','ᡅ'=>'ᡅ','ᡆ'=>'ᡆ','ᡇ'=>'ᡇ','ᡈ'=>'ᡈ','ᡉ'=>'ᡉ','ᡊ'=>'ᡊ','ᡋ'=>'ᡋ','ᡌ'=>'ᡌ','ᡍ'=>'ᡍ','ᡎ'=>'ᡎ','ᡏ'=>'ᡏ','ᡐ'=>'ᡐ','ᡑ'=>'ᡑ','ᡒ'=>'ᡒ','ᡓ'=>'ᡓ','ᡔ'=>'ᡔ','ᡕ'=>'ᡕ','ᡖ'=>'ᡖ','ᡗ'=>'ᡗ','ᡘ'=>'ᡘ','ᡙ'=>'ᡙ','ᡚ'=>'ᡚ','ᡛ'=>'ᡛ','ᡜ'=>'ᡜ','ᡝ'=>'ᡝ','ᡞ'=>'ᡞ','ᡟ'=>'ᡟ','ᡠ'=>'ᡠ','ᡡ'=>'ᡡ','ᡢ'=>'ᡢ','ᡣ'=>'ᡣ','ᡤ'=>'ᡤ','ᡥ'=>'ᡥ','ᡦ'=>'ᡦ','ᡧ'=>'ᡧ','ᡨ'=>'ᡨ','ᡩ'=>'ᡩ','ᡪ'=>'ᡪ','ᡫ'=>'ᡫ','ᡬ'=>'ᡬ','ᡭ'=>'ᡭ','ᡮ'=>'ᡮ','ᡯ'=>'ᡯ','ᡰ'=>'ᡰ','ᡱ'=>'ᡱ','ᡲ'=>'ᡲ','ᡳ'=>'ᡳ','ᡴ'=>'ᡴ','ᡵ'=>'ᡵ','ᡶ'=>'ᡶ','ᡷ'=>'ᡷ','ᢀ'=>'ᢀ','ᢁ'=>'ᢁ','ᢂ'=>'ᢂ','ᢃ'=>'ᢃ','ᢄ'=>'ᢄ','ᢅ'=>'ᢅ','ᢆ'=>'ᢆ','ᢇ'=>'ᢇ','ᢈ'=>'ᢈ','ᢉ'=>'ᢉ','ᢊ'=>'ᢊ','ᢋ'=>'ᢋ','ᢌ'=>'ᢌ','ᢍ'=>'ᢍ','ᢎ'=>'ᢎ','ᢏ'=>'ᢏ','ᢐ'=>'ᢐ','ᢑ'=>'ᢑ','ᢒ'=>'ᢒ','ᢓ'=>'ᢓ','ᢔ'=>'ᢔ','ᢕ'=>'ᢕ','ᢖ'=>'ᢖ','ᢗ'=>'ᢗ','ᢘ'=>'ᢘ','ᢙ'=>'ᢙ','ᢚ'=>'ᢚ','ᢛ'=>'ᢛ','ᢜ'=>'ᢜ','ᢝ'=>'ᢝ','ᢞ'=>'ᢞ','ᢟ'=>'ᢟ','ᢠ'=>'ᢠ','ᢡ'=>'ᢡ','ᢢ'=>'ᢢ','ᢣ'=>'ᢣ','ᢤ'=>'ᢤ','ᢥ'=>'ᢥ','ᢦ'=>'ᢦ','ᢧ'=>'ᢧ','ᢨ'=>'ᢨ','ᢩ'=>'ᢩ','ᤀ'=>'ᤀ','ᤁ'=>'ᤁ','ᤂ'=>'ᤂ','ᤃ'=>'ᤃ','ᤄ'=>'ᤄ','ᤅ'=>'ᤅ','ᤆ'=>'ᤆ','ᤇ'=>'ᤇ','ᤈ'=>'ᤈ','ᤉ'=>'ᤉ','ᤊ'=>'ᤊ','ᤋ'=>'ᤋ','ᤌ'=>'ᤌ','ᤍ'=>'ᤍ','ᤎ'=>'ᤎ','ᤏ'=>'ᤏ','ᤐ'=>'ᤐ','ᤑ'=>'ᤑ','ᤒ'=>'ᤒ','ᤓ'=>'ᤓ','ᤔ'=>'ᤔ','ᤕ'=>'ᤕ','ᤖ'=>'ᤖ','ᤗ'=>'ᤗ','ᤘ'=>'ᤘ','ᤙ'=>'ᤙ','ᤚ'=>'ᤚ','ᤛ'=>'ᤛ','ᤜ'=>'ᤜ','ᤠ'=>'ᤠ','ᤡ'=>'ᤡ','ᤢ'=>'ᤢ','ᤣ'=>'ᤣ','ᤤ'=>'ᤤ','ᤥ'=>'ᤥ','ᤦ'=>'ᤦ','ᤧ'=>'ᤧ','ᤨ'=>'ᤨ','ᤩ'=>'ᤩ','ᤪ'=>'ᤪ','ᤫ'=>'ᤫ','ᤰ'=>'ᤰ','ᤱ'=>'ᤱ','ᤲ'=>'ᤲ','ᤳ'=>'ᤳ','ᤴ'=>'ᤴ','ᤵ'=>'ᤵ','ᤶ'=>'ᤶ','ᤷ'=>'ᤷ','ᤸ'=>'ᤸ','᤹'=>'᤹','᤺'=>'᤺','᤻'=>'᤻','᥆'=>'0','᥇'=>'1','᥈'=>'2','᥉'=>'3','᥊'=>'4','᥋'=>'5','᥌'=>'6','᥍'=>'7','᥎'=>'8','᥏'=>'9','ᥐ'=>'ᥐ','ᥑ'=>'ᥑ','ᥒ'=>'ᥒ','ᥓ'=>'ᥓ','ᥔ'=>'ᥔ','ᥕ'=>'ᥕ','ᥖ'=>'ᥖ','ᥗ'=>'ᥗ','ᥘ'=>'ᥘ','ᥙ'=>'ᥙ','ᥚ'=>'ᥚ','ᥛ'=>'ᥛ','ᥜ'=>'ᥜ','ᥝ'=>'ᥝ','ᥞ'=>'ᥞ','ᥟ'=>'ᥟ','ᥠ'=>'ᥠ','ᥡ'=>'ᥡ','ᥢ'=>'ᥢ','ᥣ'=>'ᥣ','ᥤ'=>'ᥤ','ᥥ'=>'ᥥ','ᥦ'=>'ᥦ','ᥧ'=>'ᥧ','ᥨ'=>'ᥨ','ᥩ'=>'ᥩ','ᥪ'=>'ᥪ','ᥫ'=>'ᥫ','ᥬ'=>'ᥬ','ᥭ'=>'ᥭ','ᥰ'=>'ᥰ','ᥱ'=>'ᥱ','ᥲ'=>'ᥲ','ᥳ'=>'ᥳ','ᥴ'=>'ᥴ','ᦀ'=>'ᦀ','ᦁ'=>'ᦁ','ᦂ'=>'ᦂ','ᦃ'=>'ᦃ','ᦄ'=>'ᦄ','ᦅ'=>'ᦅ','ᦆ'=>'ᦆ','ᦇ'=>'ᦇ','ᦈ'=>'ᦈ','ᦉ'=>'ᦉ','ᦊ'=>'ᦊ','ᦋ'=>'ᦋ','ᦌ'=>'ᦌ','ᦍ'=>'ᦍ','ᦎ'=>'ᦎ','ᦏ'=>'ᦏ','ᦐ'=>'ᦐ','ᦑ'=>'ᦑ','ᦒ'=>'ᦒ','ᦓ'=>'ᦓ','ᦔ'=>'ᦔ','ᦕ'=>'ᦕ','ᦖ'=>'ᦖ','ᦗ'=>'ᦗ','ᦘ'=>'ᦘ','ᦙ'=>'ᦙ','ᦚ'=>'ᦚ','ᦛ'=>'ᦛ','ᦜ'=>'ᦜ','ᦝ'=>'ᦝ','ᦞ'=>'ᦞ','ᦟ'=>'ᦟ','ᦠ'=>'ᦠ','ᦡ'=>'ᦡ','ᦢ'=>'ᦢ','ᦣ'=>'ᦣ','ᦤ'=>'ᦤ','ᦥ'=>'ᦥ','ᦦ'=>'ᦦ','ᦧ'=>'ᦧ','ᦨ'=>'ᦨ','ᦩ'=>'ᦩ','ᦰ'=>'ᦰ','ᦱ'=>'ᦱ','ᦲ'=>'ᦲ','ᦳ'=>'ᦳ','ᦴ'=>'ᦴ','ᦵ'=>'ᦵ','ᦶ'=>'ᦶ','ᦷ'=>'ᦷ','ᦸ'=>'ᦸ','ᦹ'=>'ᦹ','ᦺ'=>'ᦺ','ᦻ'=>'ᦻ','ᦼ'=>'ᦼ','ᦽ'=>'ᦽ','ᦾ'=>'ᦾ','ᦿ'=>'ᦿ','ᧀ'=>'ᧀ','ᧁ'=>'ᧁ','ᧂ'=>'ᧂ','ᧃ'=>'ᧃ','ᧄ'=>'ᧄ','ᧅ'=>'ᧅ','ᧆ'=>'ᧆ','ᧇ'=>'ᧇ','ᧈ'=>'ᧈ','ᧉ'=>'ᧉ','᧐'=>'0','᧑'=>'1','᧒'=>'2','᧓'=>'3','᧔'=>'4','᧕'=>'5','᧖'=>'6','᧗'=>'7','᧘'=>'8','᧙'=>'9','ᨀ'=>'ᨀ','ᨁ'=>'ᨁ','ᨂ'=>'ᨂ','ᨃ'=>'ᨃ','ᨄ'=>'ᨄ','ᨅ'=>'ᨅ','ᨆ'=>'ᨆ','ᨇ'=>'ᨇ','ᨈ'=>'ᨈ','ᨉ'=>'ᨉ','ᨊ'=>'ᨊ','ᨋ'=>'ᨋ','ᨌ'=>'ᨌ','ᨍ'=>'ᨍ','ᨎ'=>'ᨎ','ᨏ'=>'ᨏ','ᨐ'=>'ᨐ','ᨑ'=>'ᨑ','ᨒ'=>'ᨒ','ᨓ'=>'ᨓ','ᨔ'=>'ᨔ','ᨕ'=>'ᨕ','ᨖ'=>'ᨖ','ᨗ'=>'ᨗ','ᨘ'=>'ᨘ','ᨙ'=>'ᨙ','ᨚ'=>'ᨚ','ᨛ'=>'ᨛ','ᬀ'=>'ᬀ','ᬁ'=>'ᬁ','ᬂ'=>'ᬂ','ᬃ'=>'ᬃ','ᬄ'=>'ᬄ','ᬅ'=>'ᬅ','ᬆ'=>'ᬆ','ᬇ'=>'ᬇ','ᬈ'=>'ᬈ','ᬉ'=>'ᬉ','ᬊ'=>'ᬊ','ᬋ'=>'ᬋ','ᬌ'=>'ᬌ','ᬍ'=>'ᬍ','ᬎ'=>'ᬎ','ᬏ'=>'ᬏ','ᬐ'=>'ᬐ','ᬑ'=>'ᬑ','ᬒ'=>'ᬒ','ᬓ'=>'ᬓ','ᬔ'=>'ᬔ','ᬕ'=>'ᬕ','ᬖ'=>'ᬖ','ᬗ'=>'ᬗ','ᬘ'=>'ᬘ','ᬙ'=>'ᬙ','ᬚ'=>'ᬚ','ᬛ'=>'ᬛ','ᬜ'=>'ᬜ','ᬝ'=>'ᬝ','ᬞ'=>'ᬞ','ᬟ'=>'ᬟ','ᬠ'=>'ᬠ','ᬡ'=>'ᬡ','ᬢ'=>'ᬢ','ᬣ'=>'ᬣ','ᬤ'=>'ᬤ','ᬥ'=>'ᬥ','ᬦ'=>'ᬦ','ᬧ'=>'ᬧ','ᬨ'=>'ᬨ','ᬩ'=>'ᬩ','ᬪ'=>'ᬪ','ᬫ'=>'ᬫ','ᬬ'=>'ᬬ','ᬭ'=>'ᬭ','ᬮ'=>'ᬮ','ᬯ'=>'ᬯ','ᬰ'=>'ᬰ','ᬱ'=>'ᬱ','ᬲ'=>'ᬲ','ᬳ'=>'ᬳ','᬴'=>'᬴','ᬵ'=>'ᬵ','ᬶ'=>'ᬶ','ᬷ'=>'ᬷ','ᬸ'=>'ᬸ','ᬹ'=>'ᬹ','ᬺ'=>'ᬺ','ᬻ'=>'ᬻ','ᬼ'=>'ᬼ','ᬽ'=>'ᬽ','ᬾ'=>'ᬾ','ᬿ'=>'ᬿ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭂ'=>'ᭂ','ᭃ'=>'ᭃ','᭄'=>'᭄','ᭅ'=>'ᭅ','ᭆ'=>'ᭆ','ᭇ'=>'ᭇ','ᭈ'=>'ᭈ','ᭉ'=>'ᭉ','ᭊ'=>'ᭊ','ᭋ'=>'ᭋ','᭐'=>'0','᭑'=>'1','᭒'=>'2','᭓'=>'3','᭔'=>'4','᭕'=>'5','᭖'=>'6','᭗'=>'7','᭘'=>'8','᭙'=>'9','᭫'=>'᭫','᭬'=>'᭬','᭭'=>'᭭','᭮'=>'᭮','᭯'=>'᭯','᭰'=>'᭰','᭱'=>'᭱','᭲'=>'᭲','᭳'=>'᭳','ᴀ'=>'ᴀ','ᴁ'=>'ᴁ','ᴂ'=>'ᴂ','ᴃ'=>'ᴃ','ᴄ'=>'ᴄ','ᴅ'=>'ᴅ','ᴆ'=>'ᴆ','ᴇ'=>'ᴇ','ᴈ'=>'ᴈ','ᴉ'=>'ᴉ','ᴊ'=>'ᴊ','ᴋ'=>'ᴋ','ᴌ'=>'ᴌ','ᴍ'=>'ᴍ','ᴎ'=>'ᴎ','ᴏ'=>'ᴏ','ᴐ'=>'ᴐ','ᴑ'=>'ᴑ','ᴒ'=>'ᴒ','ᴓ'=>'ᴓ','ᴔ'=>'ᴔ','ᴕ'=>'ᴕ','ᴖ'=>'ᴖ','ᴗ'=>'ᴗ','ᴘ'=>'ᴘ','ᴙ'=>'ᴙ','ᴚ'=>'ᴚ','ᴛ'=>'ᴛ','ᴜ'=>'ᴜ','ᴝ'=>'ᴝ','ᴞ'=>'ᴞ','ᴟ'=>'ᴟ','ᴠ'=>'ᴠ','ᴡ'=>'ᴡ','ᴢ'=>'ᴢ','ᴣ'=>'ᴣ','ᴤ'=>'ᴤ','ᴥ'=>'ᴥ','ᴦ'=>'ᴦ','ᴧ'=>'ᴧ','ᴨ'=>'ᴨ','ᴩ'=>'ᴩ','ᴪ'=>'ᴪ','ᴫ'=>'ᴫ','ᴬ'=>'ᴬ','ᴭ'=>'ᴭ','ᴮ'=>'ᴮ','ᴯ'=>'ᴯ','ᴰ'=>'ᴰ','ᴱ'=>'ᴱ','ᴲ'=>'ᴲ','ᴳ'=>'ᴳ','ᴴ'=>'ᴴ','ᴵ'=>'ᴵ','ᴶ'=>'ᴶ','ᴷ'=>'ᴷ','ᴸ'=>'ᴸ','ᴹ'=>'ᴹ','ᴺ'=>'ᴺ','ᴻ'=>'ᴻ','ᴼ'=>'ᴼ','ᴽ'=>'ᴽ','ᴾ'=>'ᴾ','ᴿ'=>'ᴿ','ᵀ'=>'ᵀ','ᵁ'=>'ᵁ','ᵂ'=>'ᵂ','ᵃ'=>'ᵃ','ᵄ'=>'ᵄ','ᵅ'=>'ᵅ','ᵆ'=>'ᵆ','ᵇ'=>'ᵇ','ᵈ'=>'ᵈ','ᵉ'=>'ᵉ','ᵊ'=>'ᵊ','ᵋ'=>'ᵋ','ᵌ'=>'ᵌ','ᵍ'=>'ᵍ','ᵎ'=>'ᵎ','ᵏ'=>'ᵏ','ᵐ'=>'ᵐ','ᵑ'=>'ᵑ','ᵒ'=>'ᵒ','ᵓ'=>'ᵓ','ᵔ'=>'ᵔ','ᵕ'=>'ᵕ','ᵖ'=>'ᵖ','ᵗ'=>'ᵗ','ᵘ'=>'ᵘ','ᵙ'=>'ᵙ','ᵚ'=>'ᵚ','ᵛ'=>'ᵛ','ᵜ'=>'ᵜ','ᵝ'=>'ᵝ','ᵞ'=>'ᵞ','ᵟ'=>'ᵟ','ᵠ'=>'ᵠ','ᵡ'=>'ᵡ','ᵢ'=>'ᵢ','ᵣ'=>'ᵣ','ᵤ'=>'ᵤ','ᵥ'=>'ᵥ','ᵦ'=>'ᵦ','ᵧ'=>'ᵧ','ᵨ'=>'ᵨ','ᵩ'=>'ᵩ','ᵪ'=>'ᵪ','ᵫ'=>'ue','ᵬ'=>'ᵬ','ᵭ'=>'ᵭ','ᵮ'=>'ᵮ','ᵯ'=>'ᵯ','ᵰ'=>'ᵰ','ᵱ'=>'ᵱ','ᵲ'=>'ᵲ','ᵳ'=>'ᵳ','ᵴ'=>'ᵴ','ᵵ'=>'ᵵ','ᵶ'=>'ᵶ','ᵷ'=>'ᵷ','ᵸ'=>'ᵸ','ᵹ'=>'ᵹ','ᵺ'=>'ᵺ','ᵻ'=>'ᵻ','ᵼ'=>'ᵼ','ᵽ'=>'ᵽ','ᵾ'=>'ᵾ','ᵿ'=>'ᵿ','ᶀ'=>'ᶀ','ᶁ'=>'ᶁ','ᶂ'=>'ᶂ','ᶃ'=>'ᶃ','ᶄ'=>'ᶄ','ᶅ'=>'ᶅ','ᶆ'=>'ᶆ','ᶇ'=>'ᶇ','ᶈ'=>'ᶈ','ᶉ'=>'ᶉ','ᶊ'=>'ᶊ','ᶋ'=>'ᶋ','ᶌ'=>'ᶌ','ᶍ'=>'ᶍ','ᶎ'=>'ᶎ','ᶏ'=>'ᶏ','ᶐ'=>'ᶐ','ᶑ'=>'ᶑ','ᶒ'=>'ᶒ','ᶓ'=>'ᶓ','ᶔ'=>'ᶔ','ᶕ'=>'ᶕ','ᶖ'=>'ᶖ','ᶗ'=>'ᶗ','ᶘ'=>'ᶘ','ᶙ'=>'ᶙ','ᶚ'=>'ᶚ','ᶛ'=>'ᶛ','ᶜ'=>'ᶜ','ᶝ'=>'ᶝ','ᶞ'=>'ᶞ','ᶟ'=>'ᶟ','ᶠ'=>'ᶠ','ᶡ'=>'ᶡ','ᶢ'=>'ᶢ','ᶣ'=>'ᶣ','ᶤ'=>'ᶤ','ᶥ'=>'ᶥ','ᶦ'=>'ᶦ','ᶧ'=>'ᶧ','ᶨ'=>'ᶨ','ᶩ'=>'ᶩ','ᶪ'=>'ᶪ','ᶫ'=>'ᶫ','ᶬ'=>'ᶬ','ᶭ'=>'ᶭ','ᶮ'=>'ᶮ','ᶯ'=>'ᶯ','ᶰ'=>'ᶰ','ᶱ'=>'ᶱ','ᶲ'=>'ᶲ','ᶳ'=>'ᶳ','ᶴ'=>'ᶴ','ᶵ'=>'ᶵ','ᶶ'=>'ᶶ','ᶷ'=>'ᶷ','ᶸ'=>'ᶸ','ᶹ'=>'ᶹ','ᶺ'=>'ᶺ','ᶻ'=>'ᶻ','ᶼ'=>'ᶼ','ᶽ'=>'ᶽ','ᶾ'=>'ᶾ','ᶿ'=>'ᶿ','᷀'=>'᷀','᷁'=>'᷁','᷂'=>'᷂','᷃'=>'᷃','᷄'=>'᷄','᷅'=>'᷅','᷆'=>'᷆','᷇'=>'᷇','᷈'=>'᷈','᷉'=>'᷉','᷊'=>'᷊','᷾'=>'᷾','᷿'=>'᷿','Ḁ'=>'ḁ','ḁ'=>'ḁ','Ḃ'=>'ḃ','ḃ'=>'ḃ','Ḅ'=>'ḅ','ḅ'=>'ḅ','Ḇ'=>'ḇ','ḇ'=>'ḇ','Ḉ'=>'ḉ','ḉ'=>'ḉ','Ḋ'=>'ḋ','ḋ'=>'ḋ','Ḍ'=>'ḍ','ḍ'=>'ḍ','Ḏ'=>'ḏ','ḏ'=>'ḏ','Ḑ'=>'ḑ','ḑ'=>'ḑ','Ḓ'=>'ḓ','ḓ'=>'ḓ','Ḕ'=>'ḕ','ḕ'=>'ḕ','Ḗ'=>'ḗ','ḗ'=>'ḗ','Ḙ'=>'ḙ','ḙ'=>'ḙ','Ḛ'=>'ḛ','ḛ'=>'ḛ','Ḝ'=>'ḝ','ḝ'=>'ḝ','Ḟ'=>'ḟ','ḟ'=>'ḟ','Ḡ'=>'ḡ','ḡ'=>'ḡ','Ḣ'=>'ḣ','ḣ'=>'ḣ','Ḥ'=>'ḥ','ḥ'=>'ḥ','Ḧ'=>'ḧ','ḧ'=>'ḧ','Ḩ'=>'ḩ','ḩ'=>'ḩ','Ḫ'=>'ḫ','ḫ'=>'ḫ','Ḭ'=>'ḭ','ḭ'=>'ḭ','Ḯ'=>'ḯ','ḯ'=>'ḯ','Ḱ'=>'ḱ','ḱ'=>'ḱ','Ḳ'=>'ḳ','ḳ'=>'ḳ','Ḵ'=>'ḵ','ḵ'=>'ḵ','Ḷ'=>'ḷ','ḷ'=>'ḷ','Ḹ'=>'ḹ','ḹ'=>'ḹ','Ḻ'=>'ḻ','ḻ'=>'ḻ','Ḽ'=>'ḽ','ḽ'=>'ḽ','Ḿ'=>'ḿ','ḿ'=>'ḿ','Ṁ'=>'ṁ','ṁ'=>'ṁ','Ṃ'=>'ṃ','ṃ'=>'ṃ','Ṅ'=>'ṅ','ṅ'=>'ṅ','Ṇ'=>'ṇ','ṇ'=>'ṇ','Ṉ'=>'ṉ','ṉ'=>'ṉ','Ṋ'=>'ṋ','ṋ'=>'ṋ','Ṍ'=>'ṍ','ṍ'=>'ṍ','Ṏ'=>'ṏ','ṏ'=>'ṏ','Ṑ'=>'ṑ','ṑ'=>'ṑ','Ṓ'=>'ṓ','ṓ'=>'ṓ','Ṕ'=>'ṕ','ṕ'=>'ṕ','Ṗ'=>'ṗ','ṗ'=>'ṗ','Ṙ'=>'ṙ','ṙ'=>'ṙ','Ṛ'=>'ṛ','ṛ'=>'ṛ','Ṝ'=>'ṝ','ṝ'=>'ṝ','Ṟ'=>'ṟ','ṟ'=>'ṟ','Ṡ'=>'ṡ','ṡ'=>'ṡ','Ṣ'=>'ṣ','ṣ'=>'ṣ','Ṥ'=>'ṥ','ṥ'=>'ṥ','Ṧ'=>'ṧ','ṧ'=>'ṧ','Ṩ'=>'ṩ','ṩ'=>'ṩ','Ṫ'=>'ṫ','ṫ'=>'ṫ','Ṭ'=>'ṭ','ṭ'=>'ṭ','Ṯ'=>'ṯ','ṯ'=>'ṯ','Ṱ'=>'ṱ','ṱ'=>'ṱ','Ṳ'=>'ṳ','ṳ'=>'ṳ','Ṵ'=>'ṵ','ṵ'=>'ṵ','Ṷ'=>'ṷ','ṷ'=>'ṷ','Ṹ'=>'ṹ','ṹ'=>'ṹ','Ṻ'=>'ṻ','ṻ'=>'ṻ','Ṽ'=>'ṽ','ṽ'=>'ṽ','Ṿ'=>'ṿ','ṿ'=>'ṿ','Ẁ'=>'ẁ','ẁ'=>'ẁ','Ẃ'=>'ẃ','ẃ'=>'ẃ','Ẅ'=>'ẅ','ẅ'=>'ẅ','Ẇ'=>'ẇ','ẇ'=>'ẇ','Ẉ'=>'ẉ','ẉ'=>'ẉ','Ẋ'=>'ẋ','ẋ'=>'ẋ','Ẍ'=>'ẍ','ẍ'=>'ẍ','Ẏ'=>'ẏ','ẏ'=>'ẏ','Ẑ'=>'ẑ','ẑ'=>'ẑ','Ẓ'=>'ẓ','ẓ'=>'ẓ','Ẕ'=>'ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'ẚ','ẛ'=>'ẛ','Ạ'=>'ạ','ạ'=>'ạ','Ả'=>'ả','ả'=>'ả','Ấ'=>'ấ','ấ'=>'ấ','Ầ'=>'ầ','ầ'=>'ầ','Ẩ'=>'ẩ','ẩ'=>'ẩ','Ẫ'=>'ẫ','ẫ'=>'ẫ','Ậ'=>'ậ','ậ'=>'ậ','Ắ'=>'ắ','ắ'=>'ắ','Ằ'=>'ằ','ằ'=>'ằ','Ẳ'=>'ẳ','ẳ'=>'ẳ','Ẵ'=>'ẵ','ẵ'=>'ẵ','Ặ'=>'ặ','ặ'=>'ặ','Ẹ'=>'ẹ','ẹ'=>'ẹ','Ẻ'=>'ẻ','ẻ'=>'ẻ','Ẽ'=>'ẽ','ẽ'=>'ẽ','Ế'=>'ế','ế'=>'ế','Ề'=>'ề','ề'=>'ề','Ể'=>'ể','ể'=>'ể','Ễ'=>'ễ','ễ'=>'ễ','Ệ'=>'ệ','ệ'=>'ệ','Ỉ'=>'ỉ','ỉ'=>'ỉ','Ị'=>'ị','ị'=>'ị','Ọ'=>'ọ','ọ'=>'ọ','Ỏ'=>'ỏ','ỏ'=>'ỏ','Ố'=>'ố','ố'=>'ố','Ồ'=>'ồ','ồ'=>'ồ','Ổ'=>'ổ','ổ'=>'ổ','Ỗ'=>'ỗ','ỗ'=>'ỗ','Ộ'=>'ộ','ộ'=>'ộ','Ớ'=>'ớ','ớ'=>'ớ','Ờ'=>'ờ','ờ'=>'ờ','Ở'=>'ở','ở'=>'ở','Ỡ'=>'ỡ','ỡ'=>'ỡ','Ợ'=>'ợ','ợ'=>'ợ','Ụ'=>'ụ','ụ'=>'ụ','Ủ'=>'ủ','ủ'=>'ủ','Ứ'=>'ứ','ứ'=>'ứ','Ừ'=>'ừ','ừ'=>'ừ','Ử'=>'ử','ử'=>'ử','Ữ'=>'ữ','ữ'=>'ữ','Ự'=>'ự','ự'=>'ự','Ỳ'=>'ỳ','ỳ'=>'ỳ','Ỵ'=>'ỵ','ỵ'=>'ỵ','Ỷ'=>'ỷ','ỷ'=>'ỷ','Ỹ'=>'ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'ἀ','Ἁ'=>'ἁ','Ἂ'=>'ἂ','Ἃ'=>'ἃ','Ἄ'=>'ἄ','Ἅ'=>'ἅ','Ἆ'=>'ἆ','Ἇ'=>'ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'ἐ','Ἑ'=>'ἑ','Ἒ'=>'ἒ','Ἓ'=>'ἓ','Ἔ'=>'ἔ','Ἕ'=>'ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'ἠ','Ἡ'=>'ἡ','Ἢ'=>'ἢ','Ἣ'=>'ἣ','Ἤ'=>'ἤ','Ἥ'=>'ἥ','Ἦ'=>'ἦ','Ἧ'=>'ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'ἰ','Ἱ'=>'ἱ','Ἲ'=>'ἲ','Ἳ'=>'ἳ','Ἴ'=>'ἴ','Ἵ'=>'ἵ','Ἶ'=>'ἶ','Ἷ'=>'ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'ὀ','Ὁ'=>'ὁ','Ὂ'=>'ὂ','Ὃ'=>'ὃ','Ὄ'=>'ὄ','Ὅ'=>'ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'ὑ','Ὓ'=>'ὓ','Ὕ'=>'ὕ','Ὗ'=>'ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'ὠ','Ὡ'=>'ὡ','Ὢ'=>'ὢ','Ὣ'=>'ὣ','Ὤ'=>'ὤ','Ὥ'=>'ὥ','Ὦ'=>'ὦ','Ὧ'=>'ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾀ','ᾉ'=>'ᾁ','ᾊ'=>'ᾂ','ᾋ'=>'ᾃ','ᾌ'=>'ᾄ','ᾍ'=>'ᾅ','ᾎ'=>'ᾆ','ᾏ'=>'ᾇ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾐ','ᾙ'=>'ᾑ','ᾚ'=>'ᾒ','ᾛ'=>'ᾓ','ᾜ'=>'ᾔ','ᾝ'=>'ᾕ','ᾞ'=>'ᾖ','ᾟ'=>'ᾗ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾠ','ᾩ'=>'ᾡ','ᾪ'=>'ᾢ','ᾫ'=>'ᾣ','ᾬ'=>'ᾤ','ᾭ'=>'ᾥ','ᾮ'=>'ᾦ','ᾯ'=>'ᾧ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'ᾰ','Ᾱ'=>'ᾱ','Ὰ'=>'ὰ','Ά'=>'ά','ᾼ'=>'ᾳ','ι'=>'ι','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'ὲ','Έ'=>'έ','Ὴ'=>'ὴ','Ή'=>'ή','ῌ'=>'ῃ','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'ῐ','Ῑ'=>'ῑ','Ὶ'=>'ὶ','Ί'=>'ί','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'ῠ','Ῡ'=>'ῡ','Ὺ'=>'ὺ','Ύ'=>'ύ','Ῥ'=>'ῥ','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'ὸ','Ό'=>'ό','Ὼ'=>'ὼ','Ώ'=>'ώ','ῼ'=>'ῳ'); \ No newline at end of file
+<?php return array('᠋'=>'᠋','᠌'=>'᠌','᠍'=>'᠍','᠐'=>'0','᠑'=>'1','᠒'=>'2','᠓'=>'3','᠔'=>'4','᠕'=>'5','᠖'=>'6','᠗'=>'7','᠘'=>'8','᠙'=>'9','ᠠ'=>'ᠠ','ᠡ'=>'ᠡ','ᠢ'=>'ᠢ','ᠣ'=>'ᠣ','ᠤ'=>'ᠤ','ᠥ'=>'ᠥ','ᠦ'=>'ᠦ','ᠧ'=>'ᠧ','ᠨ'=>'ᠨ','ᠩ'=>'ᠩ','ᠪ'=>'ᠪ','ᠫ'=>'ᠫ','ᠬ'=>'ᠬ','ᠭ'=>'ᠭ','ᠮ'=>'ᠮ','ᠯ'=>'ᠯ','ᠰ'=>'ᠰ','ᠱ'=>'ᠱ','ᠲ'=>'ᠲ','ᠳ'=>'ᠳ','ᠴ'=>'ᠴ','ᠵ'=>'ᠵ','ᠶ'=>'ᠶ','ᠷ'=>'ᠷ','ᠸ'=>'ᠸ','ᠹ'=>'ᠹ','ᠺ'=>'ᠺ','ᠻ'=>'ᠻ','ᠼ'=>'ᠼ','ᠽ'=>'ᠽ','ᠾ'=>'ᠾ','ᠿ'=>'ᠿ','ᡀ'=>'ᡀ','ᡁ'=>'ᡁ','ᡂ'=>'ᡂ','ᡃ'=>'ᡃ','ᡄ'=>'ᡄ','ᡅ'=>'ᡅ','ᡆ'=>'ᡆ','ᡇ'=>'ᡇ','ᡈ'=>'ᡈ','ᡉ'=>'ᡉ','ᡊ'=>'ᡊ','ᡋ'=>'ᡋ','ᡌ'=>'ᡌ','ᡍ'=>'ᡍ','ᡎ'=>'ᡎ','ᡏ'=>'ᡏ','ᡐ'=>'ᡐ','ᡑ'=>'ᡑ','ᡒ'=>'ᡒ','ᡓ'=>'ᡓ','ᡔ'=>'ᡔ','ᡕ'=>'ᡕ','ᡖ'=>'ᡖ','ᡗ'=>'ᡗ','ᡘ'=>'ᡘ','ᡙ'=>'ᡙ','ᡚ'=>'ᡚ','ᡛ'=>'ᡛ','ᡜ'=>'ᡜ','ᡝ'=>'ᡝ','ᡞ'=>'ᡞ','ᡟ'=>'ᡟ','ᡠ'=>'ᡠ','ᡡ'=>'ᡡ','ᡢ'=>'ᡢ','ᡣ'=>'ᡣ','ᡤ'=>'ᡤ','ᡥ'=>'ᡥ','ᡦ'=>'ᡦ','ᡧ'=>'ᡧ','ᡨ'=>'ᡨ','ᡩ'=>'ᡩ','ᡪ'=>'ᡪ','ᡫ'=>'ᡫ','ᡬ'=>'ᡬ','ᡭ'=>'ᡭ','ᡮ'=>'ᡮ','ᡯ'=>'ᡯ','ᡰ'=>'ᡰ','ᡱ'=>'ᡱ','ᡲ'=>'ᡲ','ᡳ'=>'ᡳ','ᡴ'=>'ᡴ','ᡵ'=>'ᡵ','ᡶ'=>'ᡶ','ᡷ'=>'ᡷ','ᢀ'=>'ᢀ','ᢁ'=>'ᢁ','ᢂ'=>'ᢂ','ᢃ'=>'ᢃ','ᢄ'=>'ᢄ','ᢅ'=>'ᢅ','ᢆ'=>'ᢆ','ᢇ'=>'ᢇ','ᢈ'=>'ᢈ','ᢉ'=>'ᢉ','ᢊ'=>'ᢊ','ᢋ'=>'ᢋ','ᢌ'=>'ᢌ','ᢍ'=>'ᢍ','ᢎ'=>'ᢎ','ᢏ'=>'ᢏ','ᢐ'=>'ᢐ','ᢑ'=>'ᢑ','ᢒ'=>'ᢒ','ᢓ'=>'ᢓ','ᢔ'=>'ᢔ','ᢕ'=>'ᢕ','ᢖ'=>'ᢖ','ᢗ'=>'ᢗ','ᢘ'=>'ᢘ','ᢙ'=>'ᢙ','ᢚ'=>'ᢚ','ᢛ'=>'ᢛ','ᢜ'=>'ᢜ','ᢝ'=>'ᢝ','ᢞ'=>'ᢞ','ᢟ'=>'ᢟ','ᢠ'=>'ᢠ','ᢡ'=>'ᢡ','ᢢ'=>'ᢢ','ᢣ'=>'ᢣ','ᢤ'=>'ᢤ','ᢥ'=>'ᢥ','ᢦ'=>'ᢦ','ᢧ'=>'ᢧ','ᢨ'=>'ᢨ','ᢩ'=>'ᢩ','ᤀ'=>'ᤀ','ᤁ'=>'ᤁ','ᤂ'=>'ᤂ','ᤃ'=>'ᤃ','ᤄ'=>'ᤄ','ᤅ'=>'ᤅ','ᤆ'=>'ᤆ','ᤇ'=>'ᤇ','ᤈ'=>'ᤈ','ᤉ'=>'ᤉ','ᤊ'=>'ᤊ','ᤋ'=>'ᤋ','ᤌ'=>'ᤌ','ᤍ'=>'ᤍ','ᤎ'=>'ᤎ','ᤏ'=>'ᤏ','ᤐ'=>'ᤐ','ᤑ'=>'ᤑ','ᤒ'=>'ᤒ','ᤓ'=>'ᤓ','ᤔ'=>'ᤔ','ᤕ'=>'ᤕ','ᤖ'=>'ᤖ','ᤗ'=>'ᤗ','ᤘ'=>'ᤘ','ᤙ'=>'ᤙ','ᤚ'=>'ᤚ','ᤛ'=>'ᤛ','ᤜ'=>'ᤜ','ᤠ'=>'ᤠ','ᤡ'=>'ᤡ','ᤢ'=>'ᤢ','ᤣ'=>'ᤣ','ᤤ'=>'ᤤ','ᤥ'=>'ᤥ','ᤦ'=>'ᤦ','ᤧ'=>'ᤧ','ᤨ'=>'ᤨ','ᤩ'=>'ᤩ','ᤪ'=>'ᤪ','ᤫ'=>'ᤫ','ᤰ'=>'ᤰ','ᤱ'=>'ᤱ','ᤲ'=>'ᤲ','ᤳ'=>'ᤳ','ᤴ'=>'ᤴ','ᤵ'=>'ᤵ','ᤶ'=>'ᤶ','ᤷ'=>'ᤷ','ᤸ'=>'ᤸ','᤹'=>'᤹','᤺'=>'᤺','᤻'=>'᤻','᥆'=>'0','᥇'=>'1','᥈'=>'2','᥉'=>'3','᥊'=>'4','᥋'=>'5','᥌'=>'6','᥍'=>'7','᥎'=>'8','᥏'=>'9','ᥐ'=>'ᥐ','ᥑ'=>'ᥑ','ᥒ'=>'ᥒ','ᥓ'=>'ᥓ','ᥔ'=>'ᥔ','ᥕ'=>'ᥕ','ᥖ'=>'ᥖ','ᥗ'=>'ᥗ','ᥘ'=>'ᥘ','ᥙ'=>'ᥙ','ᥚ'=>'ᥚ','ᥛ'=>'ᥛ','ᥜ'=>'ᥜ','ᥝ'=>'ᥝ','ᥞ'=>'ᥞ','ᥟ'=>'ᥟ','ᥠ'=>'ᥠ','ᥡ'=>'ᥡ','ᥢ'=>'ᥢ','ᥣ'=>'ᥣ','ᥤ'=>'ᥤ','ᥥ'=>'ᥥ','ᥦ'=>'ᥦ','ᥧ'=>'ᥧ','ᥨ'=>'ᥨ','ᥩ'=>'ᥩ','ᥪ'=>'ᥪ','ᥫ'=>'ᥫ','ᥬ'=>'ᥬ','ᥭ'=>'ᥭ','ᥰ'=>'ᥰ','ᥱ'=>'ᥱ','ᥲ'=>'ᥲ','ᥳ'=>'ᥳ','ᥴ'=>'ᥴ','ᦀ'=>'ᦀ','ᦁ'=>'ᦁ','ᦂ'=>'ᦂ','ᦃ'=>'ᦃ','ᦄ'=>'ᦄ','ᦅ'=>'ᦅ','ᦆ'=>'ᦆ','ᦇ'=>'ᦇ','ᦈ'=>'ᦈ','ᦉ'=>'ᦉ','ᦊ'=>'ᦊ','ᦋ'=>'ᦋ','ᦌ'=>'ᦌ','ᦍ'=>'ᦍ','ᦎ'=>'ᦎ','ᦏ'=>'ᦏ','ᦐ'=>'ᦐ','ᦑ'=>'ᦑ','ᦒ'=>'ᦒ','ᦓ'=>'ᦓ','ᦔ'=>'ᦔ','ᦕ'=>'ᦕ','ᦖ'=>'ᦖ','ᦗ'=>'ᦗ','ᦘ'=>'ᦘ','ᦙ'=>'ᦙ','ᦚ'=>'ᦚ','ᦛ'=>'ᦛ','ᦜ'=>'ᦜ','ᦝ'=>'ᦝ','ᦞ'=>'ᦞ','ᦟ'=>'ᦟ','ᦠ'=>'ᦠ','ᦡ'=>'ᦡ','ᦢ'=>'ᦢ','ᦣ'=>'ᦣ','ᦤ'=>'ᦤ','ᦥ'=>'ᦥ','ᦦ'=>'ᦦ','ᦧ'=>'ᦧ','ᦨ'=>'ᦨ','ᦩ'=>'ᦩ','ᦰ'=>'ᦰ','ᦱ'=>'ᦱ','ᦲ'=>'ᦲ','ᦳ'=>'ᦳ','ᦴ'=>'ᦴ','ᦵ'=>'ᦵ','ᦶ'=>'ᦶ','ᦷ'=>'ᦷ','ᦸ'=>'ᦸ','ᦹ'=>'ᦹ','ᦺ'=>'ᦺ','ᦻ'=>'ᦻ','ᦼ'=>'ᦼ','ᦽ'=>'ᦽ','ᦾ'=>'ᦾ','ᦿ'=>'ᦿ','ᧀ'=>'ᧀ','ᧁ'=>'ᧁ','ᧂ'=>'ᧂ','ᧃ'=>'ᧃ','ᧄ'=>'ᧄ','ᧅ'=>'ᧅ','ᧆ'=>'ᧆ','ᧇ'=>'ᧇ','ᧈ'=>'ᧈ','ᧉ'=>'ᧉ','᧐'=>'0','᧑'=>'1','᧒'=>'2','᧓'=>'3','᧔'=>'4','᧕'=>'5','᧖'=>'6','᧗'=>'7','᧘'=>'8','᧙'=>'9','ᨀ'=>'ᨀ','ᨁ'=>'ᨁ','ᨂ'=>'ᨂ','ᨃ'=>'ᨃ','ᨄ'=>'ᨄ','ᨅ'=>'ᨅ','ᨆ'=>'ᨆ','ᨇ'=>'ᨇ','ᨈ'=>'ᨈ','ᨉ'=>'ᨉ','ᨊ'=>'ᨊ','ᨋ'=>'ᨋ','ᨌ'=>'ᨌ','ᨍ'=>'ᨍ','ᨎ'=>'ᨎ','ᨏ'=>'ᨏ','ᨐ'=>'ᨐ','ᨑ'=>'ᨑ','ᨒ'=>'ᨒ','ᨓ'=>'ᨓ','ᨔ'=>'ᨔ','ᨕ'=>'ᨕ','ᨖ'=>'ᨖ','ᨗ'=>'ᨗ','ᨘ'=>'ᨘ','ᨙ'=>'ᨙ','ᨚ'=>'ᨚ','ᨛ'=>'ᨛ','ᬀ'=>'ᬀ','ᬁ'=>'ᬁ','ᬂ'=>'ᬂ','ᬃ'=>'ᬃ','ᬄ'=>'ᬄ','ᬅ'=>'ᬅ','ᬆ'=>'ᬆ','ᬇ'=>'ᬇ','ᬈ'=>'ᬈ','ᬉ'=>'ᬉ','ᬊ'=>'ᬊ','ᬋ'=>'ᬋ','ᬌ'=>'ᬌ','ᬍ'=>'ᬍ','ᬎ'=>'ᬎ','ᬏ'=>'ᬏ','ᬐ'=>'ᬐ','ᬑ'=>'ᬑ','ᬒ'=>'ᬒ','ᬓ'=>'ᬓ','ᬔ'=>'ᬔ','ᬕ'=>'ᬕ','ᬖ'=>'ᬖ','ᬗ'=>'ᬗ','ᬘ'=>'ᬘ','ᬙ'=>'ᬙ','ᬚ'=>'ᬚ','ᬛ'=>'ᬛ','ᬜ'=>'ᬜ','ᬝ'=>'ᬝ','ᬞ'=>'ᬞ','ᬟ'=>'ᬟ','ᬠ'=>'ᬠ','ᬡ'=>'ᬡ','ᬢ'=>'ᬢ','ᬣ'=>'ᬣ','ᬤ'=>'ᬤ','ᬥ'=>'ᬥ','ᬦ'=>'ᬦ','ᬧ'=>'ᬧ','ᬨ'=>'ᬨ','ᬩ'=>'ᬩ','ᬪ'=>'ᬪ','ᬫ'=>'ᬫ','ᬬ'=>'ᬬ','ᬭ'=>'ᬭ','ᬮ'=>'ᬮ','ᬯ'=>'ᬯ','ᬰ'=>'ᬰ','ᬱ'=>'ᬱ','ᬲ'=>'ᬲ','ᬳ'=>'ᬳ','᬴'=>'᬴','ᬵ'=>'ᬵ','ᬶ'=>'ᬶ','ᬷ'=>'ᬷ','ᬸ'=>'ᬸ','ᬹ'=>'ᬹ','ᬺ'=>'ᬺ','ᬻ'=>'ᬻ','ᬼ'=>'ᬼ','ᬽ'=>'ᬽ','ᬾ'=>'ᬾ','ᬿ'=>'ᬿ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭂ'=>'ᭂ','ᭃ'=>'ᭃ','᭄'=>'᭄','ᭅ'=>'ᭅ','ᭆ'=>'ᭆ','ᭇ'=>'ᭇ','ᭈ'=>'ᭈ','ᭉ'=>'ᭉ','ᭊ'=>'ᭊ','ᭋ'=>'ᭋ','᭐'=>'0','᭑'=>'1','᭒'=>'2','᭓'=>'3','᭔'=>'4','᭕'=>'5','᭖'=>'6','᭗'=>'7','᭘'=>'8','᭙'=>'9','᭫'=>'᭫','᭬'=>'᭬','᭭'=>'᭭','᭮'=>'᭮','᭯'=>'᭯','᭰'=>'᭰','᭱'=>'᭱','᭲'=>'᭲','᭳'=>'᭳','ᴀ'=>'ᴀ','ᴁ'=>'ᴁ','ᴂ'=>'ᴂ','ᴃ'=>'ᴃ','ᴄ'=>'ᴄ','ᴅ'=>'ᴅ','ᴆ'=>'ᴆ','ᴇ'=>'ᴇ','ᴈ'=>'ᴈ','ᴉ'=>'ᴉ','ᴊ'=>'ᴊ','ᴋ'=>'ᴋ','ᴌ'=>'ᴌ','ᴍ'=>'ᴍ','ᴎ'=>'ᴎ','ᴏ'=>'ᴏ','ᴐ'=>'ᴐ','ᴑ'=>'ᴑ','ᴒ'=>'ᴒ','ᴓ'=>'ᴓ','ᴔ'=>'ᴔ','ᴕ'=>'ᴕ','ᴖ'=>'ᴖ','ᴗ'=>'ᴗ','ᴘ'=>'ᴘ','ᴙ'=>'ᴙ','ᴚ'=>'ᴚ','ᴛ'=>'ᴛ','ᴜ'=>'ᴜ','ᴝ'=>'ᴝ','ᴞ'=>'ᴞ','ᴟ'=>'ᴟ','ᴠ'=>'ᴠ','ᴡ'=>'ᴡ','ᴢ'=>'ᴢ','ᴣ'=>'ᴣ','ᴤ'=>'ᴤ','ᴥ'=>'ᴥ','ᴦ'=>'ᴦ','ᴧ'=>'ᴧ','ᴨ'=>'ᴨ','ᴩ'=>'ᴩ','ᴪ'=>'ᴪ','ᴫ'=>'ᴫ','ᴬ'=>'ᴬ','ᴭ'=>'ᴭ','ᴮ'=>'ᴮ','ᴯ'=>'ᴯ','ᴰ'=>'ᴰ','ᴱ'=>'ᴱ','ᴲ'=>'ᴲ','ᴳ'=>'ᴳ','ᴴ'=>'ᴴ','ᴵ'=>'ᴵ','ᴶ'=>'ᴶ','ᴷ'=>'ᴷ','ᴸ'=>'ᴸ','ᴹ'=>'ᴹ','ᴺ'=>'ᴺ','ᴻ'=>'ᴻ','ᴼ'=>'ᴼ','ᴽ'=>'ᴽ','ᴾ'=>'ᴾ','ᴿ'=>'ᴿ','ᵀ'=>'ᵀ','ᵁ'=>'ᵁ','ᵂ'=>'ᵂ','ᵃ'=>'ᵃ','ᵄ'=>'ᵄ','ᵅ'=>'ᵅ','ᵆ'=>'ᵆ','ᵇ'=>'ᵇ','ᵈ'=>'ᵈ','ᵉ'=>'ᵉ','ᵊ'=>'ᵊ','ᵋ'=>'ᵋ','ᵌ'=>'ᵌ','ᵍ'=>'ᵍ','ᵎ'=>'ᵎ','ᵏ'=>'ᵏ','ᵐ'=>'ᵐ','ᵑ'=>'ᵑ','ᵒ'=>'ᵒ','ᵓ'=>'ᵓ','ᵔ'=>'ᵔ','ᵕ'=>'ᵕ','ᵖ'=>'ᵖ','ᵗ'=>'ᵗ','ᵘ'=>'ᵘ','ᵙ'=>'ᵙ','ᵚ'=>'ᵚ','ᵛ'=>'ᵛ','ᵜ'=>'ᵜ','ᵝ'=>'ᵝ','ᵞ'=>'ᵞ','ᵟ'=>'ᵟ','ᵠ'=>'ᵠ','ᵡ'=>'ᵡ','ᵢ'=>'ᵢ','ᵣ'=>'ᵣ','ᵤ'=>'ᵤ','ᵥ'=>'ᵥ','ᵦ'=>'ᵦ','ᵧ'=>'ᵧ','ᵨ'=>'ᵨ','ᵩ'=>'ᵩ','ᵪ'=>'ᵪ','ᵫ'=>'ue','ᵬ'=>'ᵬ','ᵭ'=>'ᵭ','ᵮ'=>'ᵮ','ᵯ'=>'ᵯ','ᵰ'=>'ᵰ','ᵱ'=>'ᵱ','ᵲ'=>'ᵲ','ᵳ'=>'ᵳ','ᵴ'=>'ᵴ','ᵵ'=>'ᵵ','ᵶ'=>'ᵶ','ᵷ'=>'ᵷ','ᵸ'=>'ᵸ','ᵹ'=>'ᵹ','ᵺ'=>'ᵺ','ᵻ'=>'ᵻ','ᵼ'=>'ᵼ','ᵽ'=>'ᵽ','ᵾ'=>'ᵾ','ᵿ'=>'ᵿ','ᶀ'=>'ᶀ','ᶁ'=>'ᶁ','ᶂ'=>'ᶂ','ᶃ'=>'ᶃ','ᶄ'=>'ᶄ','ᶅ'=>'ᶅ','ᶆ'=>'ᶆ','ᶇ'=>'ᶇ','ᶈ'=>'ᶈ','ᶉ'=>'ᶉ','ᶊ'=>'ᶊ','ᶋ'=>'ᶋ','ᶌ'=>'ᶌ','ᶍ'=>'ᶍ','ᶎ'=>'ᶎ','ᶏ'=>'ᶏ','ᶐ'=>'ᶐ','ᶑ'=>'ᶑ','ᶒ'=>'ᶒ','ᶓ'=>'ᶓ','ᶔ'=>'ᶔ','ᶕ'=>'ᶕ','ᶖ'=>'ᶖ','ᶗ'=>'ᶗ','ᶘ'=>'ᶘ','ᶙ'=>'ᶙ','ᶚ'=>'ᶚ','ᶛ'=>'ᶛ','ᶜ'=>'ᶜ','ᶝ'=>'ᶝ','ᶞ'=>'ᶞ','ᶟ'=>'ᶟ','ᶠ'=>'ᶠ','ᶡ'=>'ᶡ','ᶢ'=>'ᶢ','ᶣ'=>'ᶣ','ᶤ'=>'ᶤ','ᶥ'=>'ᶥ','ᶦ'=>'ᶦ','ᶧ'=>'ᶧ','ᶨ'=>'ᶨ','ᶩ'=>'ᶩ','ᶪ'=>'ᶪ','ᶫ'=>'ᶫ','ᶬ'=>'ᶬ','ᶭ'=>'ᶭ','ᶮ'=>'ᶮ','ᶯ'=>'ᶯ','ᶰ'=>'ᶰ','ᶱ'=>'ᶱ','ᶲ'=>'ᶲ','ᶳ'=>'ᶳ','ᶴ'=>'ᶴ','ᶵ'=>'ᶵ','ᶶ'=>'ᶶ','ᶷ'=>'ᶷ','ᶸ'=>'ᶸ','ᶹ'=>'ᶹ','ᶺ'=>'ᶺ','ᶻ'=>'ᶻ','ᶼ'=>'ᶼ','ᶽ'=>'ᶽ','ᶾ'=>'ᶾ','ᶿ'=>'ᶿ','᷀'=>'᷀','᷁'=>'᷁','᷂'=>'᷂','᷃'=>'᷃','᷄'=>'᷄','᷅'=>'᷅','᷆'=>'᷆','᷇'=>'᷇','᷈'=>'᷈','᷉'=>'᷉','᷊'=>'᷊','᷾'=>'᷾','᷿'=>'᷿','Ḁ'=>'ḁ','ḁ'=>'ḁ','Ḃ'=>'ḃ','ḃ'=>'ḃ','Ḅ'=>'ḅ','ḅ'=>'ḅ','Ḇ'=>'ḇ','ḇ'=>'ḇ','Ḉ'=>'ḉ','ḉ'=>'ḉ','Ḋ'=>'ḋ','ḋ'=>'ḋ','Ḍ'=>'ḍ','ḍ'=>'ḍ','Ḏ'=>'ḏ','ḏ'=>'ḏ','Ḑ'=>'ḑ','ḑ'=>'ḑ','Ḓ'=>'ḓ','ḓ'=>'ḓ','Ḕ'=>'ḕ','ḕ'=>'ḕ','Ḗ'=>'ḗ','ḗ'=>'ḗ','Ḙ'=>'ḙ','ḙ'=>'ḙ','Ḛ'=>'ḛ','ḛ'=>'ḛ','Ḝ'=>'ḝ','ḝ'=>'ḝ','Ḟ'=>'ḟ','ḟ'=>'ḟ','Ḡ'=>'ḡ','ḡ'=>'ḡ','Ḣ'=>'ḣ','ḣ'=>'ḣ','Ḥ'=>'ḥ','ḥ'=>'ḥ','Ḧ'=>'ḧ','ḧ'=>'ḧ','Ḩ'=>'ḩ','ḩ'=>'ḩ','Ḫ'=>'ḫ','ḫ'=>'ḫ','Ḭ'=>'ḭ','ḭ'=>'ḭ','Ḯ'=>'ḯ','ḯ'=>'ḯ','Ḱ'=>'ḱ','ḱ'=>'ḱ','Ḳ'=>'ḳ','ḳ'=>'ḳ','Ḵ'=>'ḵ','ḵ'=>'ḵ','Ḷ'=>'ḷ','ḷ'=>'ḷ','Ḹ'=>'ḹ','ḹ'=>'ḹ','Ḻ'=>'ḻ','ḻ'=>'ḻ','Ḽ'=>'ḽ','ḽ'=>'ḽ','Ḿ'=>'ḿ','ḿ'=>'ḿ','Ṁ'=>'ṁ','ṁ'=>'ṁ','Ṃ'=>'ṃ','ṃ'=>'ṃ','Ṅ'=>'ṅ','ṅ'=>'ṅ','Ṇ'=>'ṇ','ṇ'=>'ṇ','Ṉ'=>'ṉ','ṉ'=>'ṉ','Ṋ'=>'ṋ','ṋ'=>'ṋ','Ṍ'=>'ṍ','ṍ'=>'ṍ','Ṏ'=>'ṏ','ṏ'=>'ṏ','Ṑ'=>'ṑ','ṑ'=>'ṑ','Ṓ'=>'ṓ','ṓ'=>'ṓ','Ṕ'=>'ṕ','ṕ'=>'ṕ','Ṗ'=>'ṗ','ṗ'=>'ṗ','Ṙ'=>'ṙ','ṙ'=>'ṙ','Ṛ'=>'ṛ','ṛ'=>'ṛ','Ṝ'=>'ṝ','ṝ'=>'ṝ','Ṟ'=>'ṟ','ṟ'=>'ṟ','Ṡ'=>'ṡ','ṡ'=>'ṡ','Ṣ'=>'ṣ','ṣ'=>'ṣ','Ṥ'=>'ṥ','ṥ'=>'ṥ','Ṧ'=>'ṧ','ṧ'=>'ṧ','Ṩ'=>'ṩ','ṩ'=>'ṩ','Ṫ'=>'ṫ','ṫ'=>'ṫ','Ṭ'=>'ṭ','ṭ'=>'ṭ','Ṯ'=>'ṯ','ṯ'=>'ṯ','Ṱ'=>'ṱ','ṱ'=>'ṱ','Ṳ'=>'ṳ','ṳ'=>'ṳ','Ṵ'=>'ṵ','ṵ'=>'ṵ','Ṷ'=>'ṷ','ṷ'=>'ṷ','Ṹ'=>'ṹ','ṹ'=>'ṹ','Ṻ'=>'ṻ','ṻ'=>'ṻ','Ṽ'=>'ṽ','ṽ'=>'ṽ','Ṿ'=>'ṿ','ṿ'=>'ṿ','Ẁ'=>'ẁ','ẁ'=>'ẁ','Ẃ'=>'ẃ','ẃ'=>'ẃ','Ẅ'=>'ẅ','ẅ'=>'ẅ','Ẇ'=>'ẇ','ẇ'=>'ẇ','Ẉ'=>'ẉ','ẉ'=>'ẉ','Ẋ'=>'ẋ','ẋ'=>'ẋ','Ẍ'=>'ẍ','ẍ'=>'ẍ','Ẏ'=>'ẏ','ẏ'=>'ẏ','Ẑ'=>'ẑ','ẑ'=>'ẑ','Ẓ'=>'ẓ','ẓ'=>'ẓ','Ẕ'=>'ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'ẚ','ẛ'=>'ẛ','Ạ'=>'ạ','ạ'=>'ạ','Ả'=>'ả','ả'=>'ả','Ấ'=>'ấ','ấ'=>'ấ','Ầ'=>'ầ','ầ'=>'ầ','Ẩ'=>'ẩ','ẩ'=>'ẩ','Ẫ'=>'ẫ','ẫ'=>'ẫ','Ậ'=>'ậ','ậ'=>'ậ','Ắ'=>'ắ','ắ'=>'ắ','Ằ'=>'ằ','ằ'=>'ằ','Ẳ'=>'ẳ','ẳ'=>'ẳ','Ẵ'=>'ẵ','ẵ'=>'ẵ','Ặ'=>'ặ','ặ'=>'ặ','Ẹ'=>'ẹ','ẹ'=>'ẹ','Ẻ'=>'ẻ','ẻ'=>'ẻ','Ẽ'=>'ẽ','ẽ'=>'ẽ','Ế'=>'ế','ế'=>'ế','Ề'=>'ề','ề'=>'ề','Ể'=>'ể','ể'=>'ể','Ễ'=>'ễ','ễ'=>'ễ','Ệ'=>'ệ','ệ'=>'ệ','Ỉ'=>'ỉ','ỉ'=>'ỉ','Ị'=>'ị','ị'=>'ị','Ọ'=>'ọ','ọ'=>'ọ','Ỏ'=>'ỏ','ỏ'=>'ỏ','Ố'=>'ố','ố'=>'ố','Ồ'=>'ồ','ồ'=>'ồ','Ổ'=>'ổ','ổ'=>'ổ','Ỗ'=>'ỗ','ỗ'=>'ỗ','Ộ'=>'ộ','ộ'=>'ộ','Ớ'=>'ớ','ớ'=>'ớ','Ờ'=>'ờ','ờ'=>'ờ','Ở'=>'ở','ở'=>'ở','Ỡ'=>'ỡ','ỡ'=>'ỡ','Ợ'=>'ợ','ợ'=>'ợ','Ụ'=>'ụ','ụ'=>'ụ','Ủ'=>'ủ','ủ'=>'ủ','Ứ'=>'ứ','ứ'=>'ứ','Ừ'=>'ừ','ừ'=>'ừ','Ử'=>'ử','ử'=>'ử','Ữ'=>'ữ','ữ'=>'ữ','Ự'=>'ự','ự'=>'ự','Ỳ'=>'ỳ','ỳ'=>'ỳ','Ỵ'=>'ỵ','ỵ'=>'ỵ','Ỷ'=>'ỷ','ỷ'=>'ỷ','Ỹ'=>'ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'ἀ','Ἁ'=>'ἁ','Ἂ'=>'ἂ','Ἃ'=>'ἃ','Ἄ'=>'ἄ','Ἅ'=>'ἅ','Ἆ'=>'ἆ','Ἇ'=>'ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'ἐ','Ἑ'=>'ἑ','Ἒ'=>'ἒ','Ἓ'=>'ἓ','Ἔ'=>'ἔ','Ἕ'=>'ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'ἠ','Ἡ'=>'ἡ','Ἢ'=>'ἢ','Ἣ'=>'ἣ','Ἤ'=>'ἤ','Ἥ'=>'ἥ','Ἦ'=>'ἦ','Ἧ'=>'ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'ἰ','Ἱ'=>'ἱ','Ἲ'=>'ἲ','Ἳ'=>'ἳ','Ἴ'=>'ἴ','Ἵ'=>'ἵ','Ἶ'=>'ἶ','Ἷ'=>'ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'ὀ','Ὁ'=>'ὁ','Ὂ'=>'ὂ','Ὃ'=>'ὃ','Ὄ'=>'ὄ','Ὅ'=>'ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'ὑ','Ὓ'=>'ὓ','Ὕ'=>'ὕ','Ὗ'=>'ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'ὠ','Ὡ'=>'ὡ','Ὢ'=>'ὢ','Ὣ'=>'ὣ','Ὤ'=>'ὤ','Ὥ'=>'ὥ','Ὦ'=>'ὦ','Ὧ'=>'ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾀ','ᾉ'=>'ᾁ','ᾊ'=>'ᾂ','ᾋ'=>'ᾃ','ᾌ'=>'ᾄ','ᾍ'=>'ᾅ','ᾎ'=>'ᾆ','ᾏ'=>'ᾇ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾐ','ᾙ'=>'ᾑ','ᾚ'=>'ᾒ','ᾛ'=>'ᾓ','ᾜ'=>'ᾔ','ᾝ'=>'ᾕ','ᾞ'=>'ᾖ','ᾟ'=>'ᾗ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾠ','ᾩ'=>'ᾡ','ᾪ'=>'ᾢ','ᾫ'=>'ᾣ','ᾬ'=>'ᾤ','ᾭ'=>'ᾥ','ᾮ'=>'ᾦ','ᾯ'=>'ᾧ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'ᾰ','Ᾱ'=>'ᾱ','Ὰ'=>'ὰ','Ά'=>'ά','ᾼ'=>'ᾳ','ι'=>'ι','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'ὲ','Έ'=>'έ','Ὴ'=>'ὴ','Ή'=>'ή','ῌ'=>'ῃ','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'ῐ','Ῑ'=>'ῑ','Ὶ'=>'ὶ','Ί'=>'ί','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'ῠ','Ῡ'=>'ῡ','Ὺ'=>'ὺ','Ύ'=>'ύ','Ῥ'=>'ῥ','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'ὸ','Ό'=>'ό','Ὼ'=>'ὼ','Ώ'=>'ώ','ῼ'=>'ῳ');
diff --git a/phpBB/includes/utf/data/search_indexer_31.php b/phpBB/includes/utf/data/search_indexer_31.php
index 191365a313..85961d36fc 100644
--- a/phpBB/includes/utf/data/search_indexer_31.php
+++ b/phpBB/includes/utf/data/search_indexer_31.php
@@ -1 +1 @@
-<?php return array('豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','﨎'=>'﨎','﨏'=>'﨏','塚'=>'塚','﨑'=>'﨑','晴'=>'晴','﨓'=>'﨓','﨔'=>'﨔','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','﨟'=>'﨟','蘒'=>'蘒','﨡'=>'﨡','諸'=>'諸','﨣'=>'﨣','﨤'=>'﨤','逸'=>'逸','都'=>'都','﨧'=>'﨧','﨨'=>'﨨','﨩'=>'﨩','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'ſt','st'=>'st','ﬓ'=>'ﬓ','ﬔ'=>'ﬔ','ﬕ'=>'ﬕ','ﬖ'=>'ﬖ','ﬗ'=>'ﬗ','יִ'=>'יִ','ﬞ'=>'ﬞ','ײַ'=>'ײַ','ﬠ'=>'ﬠ','ﬡ'=>'ﬡ','ﬢ'=>'ﬢ','ﬣ'=>'ﬣ','ﬤ'=>'ﬤ','ﬥ'=>'ﬥ','ﬦ'=>'ﬦ','ﬧ'=>'ﬧ','ﬨ'=>'ﬨ','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','ﭏ'=>'ﭏ','ﭐ'=>'ﭐ','ﭑ'=>'ﭑ','ﭒ'=>'ﭒ','ﭓ'=>'ﭓ','ﭔ'=>'ﭔ','ﭕ'=>'ﭕ','ﭖ'=>'ﭖ','ﭗ'=>'ﭗ','ﭘ'=>'ﭘ','ﭙ'=>'ﭙ','ﭚ'=>'ﭚ','ﭛ'=>'ﭛ','ﭜ'=>'ﭜ','ﭝ'=>'ﭝ','ﭞ'=>'ﭞ','ﭟ'=>'ﭟ','ﭠ'=>'ﭠ','ﭡ'=>'ﭡ','ﭢ'=>'ﭢ','ﭣ'=>'ﭣ','ﭤ'=>'ﭤ','ﭥ'=>'ﭥ','ﭦ'=>'ﭦ','ﭧ'=>'ﭧ','ﭨ'=>'ﭨ','ﭩ'=>'ﭩ','ﭪ'=>'ﭪ','ﭫ'=>'ﭫ','ﭬ'=>'ﭬ','ﭭ'=>'ﭭ','ﭮ'=>'ﭮ','ﭯ'=>'ﭯ','ﭰ'=>'ﭰ','ﭱ'=>'ﭱ','ﭲ'=>'ﭲ','ﭳ'=>'ﭳ','ﭴ'=>'ﭴ','ﭵ'=>'ﭵ','ﭶ'=>'ﭶ','ﭷ'=>'ﭷ','ﭸ'=>'ﭸ','ﭹ'=>'ﭹ','ﭺ'=>'ﭺ','ﭻ'=>'ﭻ','ﭼ'=>'ﭼ','ﭽ'=>'ﭽ','ﭾ'=>'ﭾ','ﭿ'=>'ﭿ','ﮀ'=>'ﮀ','ﮁ'=>'ﮁ','ﮂ'=>'ﮂ','ﮃ'=>'ﮃ','ﮄ'=>'ﮄ','ﮅ'=>'ﮅ','ﮆ'=>'ﮆ','ﮇ'=>'ﮇ','ﮈ'=>'ﮈ','ﮉ'=>'ﮉ','ﮊ'=>'ﮊ','ﮋ'=>'ﮋ','ﮌ'=>'ﮌ','ﮍ'=>'ﮍ','ﮎ'=>'ﮎ','ﮏ'=>'ﮏ','ﮐ'=>'ﮐ','ﮑ'=>'ﮑ','ﮒ'=>'ﮒ','ﮓ'=>'ﮓ','ﮔ'=>'ﮔ','ﮕ'=>'ﮕ','ﮖ'=>'ﮖ','ﮗ'=>'ﮗ','ﮘ'=>'ﮘ','ﮙ'=>'ﮙ','ﮚ'=>'ﮚ','ﮛ'=>'ﮛ','ﮜ'=>'ﮜ','ﮝ'=>'ﮝ','ﮞ'=>'ﮞ','ﮟ'=>'ﮟ','ﮠ'=>'ﮠ','ﮡ'=>'ﮡ','ﮢ'=>'ﮢ','ﮣ'=>'ﮣ','ﮤ'=>'ﮤ','ﮥ'=>'ﮥ','ﮦ'=>'ﮦ','ﮧ'=>'ﮧ','ﮨ'=>'ﮨ','ﮩ'=>'ﮩ','ﮪ'=>'ﮪ','ﮫ'=>'ﮫ','ﮬ'=>'ﮬ','ﮭ'=>'ﮭ','ﮮ'=>'ﮮ','ﮯ'=>'ﮯ','ﮰ'=>'ﮰ','ﮱ'=>'ﮱ','ﯓ'=>'ﯓ','ﯔ'=>'ﯔ','ﯕ'=>'ﯕ','ﯖ'=>'ﯖ','ﯗ'=>'ﯗ','ﯘ'=>'ﯘ','ﯙ'=>'ﯙ','ﯚ'=>'ﯚ','ﯛ'=>'ﯛ','ﯜ'=>'ﯜ','ﯝ'=>'ﯝ','ﯞ'=>'ﯞ','ﯟ'=>'ﯟ','ﯠ'=>'ﯠ','ﯡ'=>'ﯡ','ﯢ'=>'ﯢ','ﯣ'=>'ﯣ','ﯤ'=>'ﯤ','ﯥ'=>'ﯥ','ﯦ'=>'ﯦ','ﯧ'=>'ﯧ','ﯨ'=>'ﯨ','ﯩ'=>'ﯩ','ﯪ'=>'ﯪ','ﯫ'=>'ﯫ','ﯬ'=>'ﯬ','ﯭ'=>'ﯭ','ﯮ'=>'ﯮ','ﯯ'=>'ﯯ','ﯰ'=>'ﯰ','ﯱ'=>'ﯱ','ﯲ'=>'ﯲ','ﯳ'=>'ﯳ','ﯴ'=>'ﯴ','ﯵ'=>'ﯵ','ﯶ'=>'ﯶ','ﯷ'=>'ﯷ','ﯸ'=>'ﯸ','ﯹ'=>'ﯹ','ﯺ'=>'ﯺ','ﯻ'=>'ﯻ','ﯼ'=>'ﯼ','ﯽ'=>'ﯽ','ﯾ'=>'ﯾ','ﯿ'=>'ﯿ','ﰀ'=>'ﰀ','ﰁ'=>'ﰁ','ﰂ'=>'ﰂ','ﰃ'=>'ﰃ','ﰄ'=>'ﰄ','ﰅ'=>'ﰅ','ﰆ'=>'ﰆ','ﰇ'=>'ﰇ','ﰈ'=>'ﰈ','ﰉ'=>'ﰉ','ﰊ'=>'ﰊ','ﰋ'=>'ﰋ','ﰌ'=>'ﰌ','ﰍ'=>'ﰍ','ﰎ'=>'ﰎ','ﰏ'=>'ﰏ','ﰐ'=>'ﰐ','ﰑ'=>'ﰑ','ﰒ'=>'ﰒ','ﰓ'=>'ﰓ','ﰔ'=>'ﰔ','ﰕ'=>'ﰕ','ﰖ'=>'ﰖ','ﰗ'=>'ﰗ','ﰘ'=>'ﰘ','ﰙ'=>'ﰙ','ﰚ'=>'ﰚ','ﰛ'=>'ﰛ','ﰜ'=>'ﰜ','ﰝ'=>'ﰝ','ﰞ'=>'ﰞ','ﰟ'=>'ﰟ','ﰠ'=>'ﰠ','ﰡ'=>'ﰡ','ﰢ'=>'ﰢ','ﰣ'=>'ﰣ','ﰤ'=>'ﰤ','ﰥ'=>'ﰥ','ﰦ'=>'ﰦ','ﰧ'=>'ﰧ','ﰨ'=>'ﰨ','ﰩ'=>'ﰩ','ﰪ'=>'ﰪ','ﰫ'=>'ﰫ','ﰬ'=>'ﰬ','ﰭ'=>'ﰭ','ﰮ'=>'ﰮ','ﰯ'=>'ﰯ','ﰰ'=>'ﰰ','ﰱ'=>'ﰱ','ﰲ'=>'ﰲ','ﰳ'=>'ﰳ','ﰴ'=>'ﰴ','ﰵ'=>'ﰵ','ﰶ'=>'ﰶ','ﰷ'=>'ﰷ','ﰸ'=>'ﰸ','ﰹ'=>'ﰹ','ﰺ'=>'ﰺ','ﰻ'=>'ﰻ','ﰼ'=>'ﰼ','ﰽ'=>'ﰽ','ﰾ'=>'ﰾ','ﰿ'=>'ﰿ','ﱀ'=>'ﱀ','ﱁ'=>'ﱁ','ﱂ'=>'ﱂ','ﱃ'=>'ﱃ','ﱄ'=>'ﱄ','ﱅ'=>'ﱅ','ﱆ'=>'ﱆ','ﱇ'=>'ﱇ','ﱈ'=>'ﱈ','ﱉ'=>'ﱉ','ﱊ'=>'ﱊ','ﱋ'=>'ﱋ','ﱌ'=>'ﱌ','ﱍ'=>'ﱍ','ﱎ'=>'ﱎ','ﱏ'=>'ﱏ','ﱐ'=>'ﱐ','ﱑ'=>'ﱑ','ﱒ'=>'ﱒ','ﱓ'=>'ﱓ','ﱔ'=>'ﱔ','ﱕ'=>'ﱕ','ﱖ'=>'ﱖ','ﱗ'=>'ﱗ','ﱘ'=>'ﱘ','ﱙ'=>'ﱙ','ﱚ'=>'ﱚ','ﱛ'=>'ﱛ','ﱜ'=>'ﱜ','ﱝ'=>'ﱝ','ﱞ'=>'ﱞ','ﱟ'=>'ﱟ','ﱠ'=>'ﱠ','ﱡ'=>'ﱡ','ﱢ'=>'ﱢ','ﱣ'=>'ﱣ','ﱤ'=>'ﱤ','ﱥ'=>'ﱥ','ﱦ'=>'ﱦ','ﱧ'=>'ﱧ','ﱨ'=>'ﱨ','ﱩ'=>'ﱩ','ﱪ'=>'ﱪ','ﱫ'=>'ﱫ','ﱬ'=>'ﱬ','ﱭ'=>'ﱭ','ﱮ'=>'ﱮ','ﱯ'=>'ﱯ','ﱰ'=>'ﱰ','ﱱ'=>'ﱱ','ﱲ'=>'ﱲ','ﱳ'=>'ﱳ','ﱴ'=>'ﱴ','ﱵ'=>'ﱵ','ﱶ'=>'ﱶ','ﱷ'=>'ﱷ','ﱸ'=>'ﱸ','ﱹ'=>'ﱹ','ﱺ'=>'ﱺ','ﱻ'=>'ﱻ','ﱼ'=>'ﱼ','ﱽ'=>'ﱽ','ﱾ'=>'ﱾ','ﱿ'=>'ﱿ','ﲀ'=>'ﲀ','ﲁ'=>'ﲁ','ﲂ'=>'ﲂ','ﲃ'=>'ﲃ','ﲄ'=>'ﲄ','ﲅ'=>'ﲅ','ﲆ'=>'ﲆ','ﲇ'=>'ﲇ','ﲈ'=>'ﲈ','ﲉ'=>'ﲉ','ﲊ'=>'ﲊ','ﲋ'=>'ﲋ','ﲌ'=>'ﲌ','ﲍ'=>'ﲍ','ﲎ'=>'ﲎ','ﲏ'=>'ﲏ','ﲐ'=>'ﲐ','ﲑ'=>'ﲑ','ﲒ'=>'ﲒ','ﲓ'=>'ﲓ','ﲔ'=>'ﲔ','ﲕ'=>'ﲕ','ﲖ'=>'ﲖ','ﲗ'=>'ﲗ','ﲘ'=>'ﲘ','ﲙ'=>'ﲙ','ﲚ'=>'ﲚ','ﲛ'=>'ﲛ','ﲜ'=>'ﲜ','ﲝ'=>'ﲝ','ﲞ'=>'ﲞ','ﲟ'=>'ﲟ','ﲠ'=>'ﲠ','ﲡ'=>'ﲡ','ﲢ'=>'ﲢ','ﲣ'=>'ﲣ','ﲤ'=>'ﲤ','ﲥ'=>'ﲥ','ﲦ'=>'ﲦ','ﲧ'=>'ﲧ','ﲨ'=>'ﲨ','ﲩ'=>'ﲩ','ﲪ'=>'ﲪ','ﲫ'=>'ﲫ','ﲬ'=>'ﲬ','ﲭ'=>'ﲭ','ﲮ'=>'ﲮ','ﲯ'=>'ﲯ','ﲰ'=>'ﲰ','ﲱ'=>'ﲱ','ﲲ'=>'ﲲ','ﲳ'=>'ﲳ','ﲴ'=>'ﲴ','ﲵ'=>'ﲵ','ﲶ'=>'ﲶ','ﲷ'=>'ﲷ','ﲸ'=>'ﲸ','ﲹ'=>'ﲹ','ﲺ'=>'ﲺ','ﲻ'=>'ﲻ','ﲼ'=>'ﲼ','ﲽ'=>'ﲽ','ﲾ'=>'ﲾ','ﲿ'=>'ﲿ','ﳀ'=>'ﳀ','ﳁ'=>'ﳁ','ﳂ'=>'ﳂ','ﳃ'=>'ﳃ','ﳄ'=>'ﳄ','ﳅ'=>'ﳅ','ﳆ'=>'ﳆ','ﳇ'=>'ﳇ','ﳈ'=>'ﳈ','ﳉ'=>'ﳉ','ﳊ'=>'ﳊ','ﳋ'=>'ﳋ','ﳌ'=>'ﳌ','ﳍ'=>'ﳍ','ﳎ'=>'ﳎ','ﳏ'=>'ﳏ','ﳐ'=>'ﳐ','ﳑ'=>'ﳑ','ﳒ'=>'ﳒ','ﳓ'=>'ﳓ','ﳔ'=>'ﳔ','ﳕ'=>'ﳕ','ﳖ'=>'ﳖ','ﳗ'=>'ﳗ','ﳘ'=>'ﳘ','ﳙ'=>'ﳙ','ﳚ'=>'ﳚ','ﳛ'=>'ﳛ','ﳜ'=>'ﳜ','ﳝ'=>'ﳝ','ﳞ'=>'ﳞ','ﳟ'=>'ﳟ','ﳠ'=>'ﳠ','ﳡ'=>'ﳡ','ﳢ'=>'ﳢ','ﳣ'=>'ﳣ','ﳤ'=>'ﳤ','ﳥ'=>'ﳥ','ﳦ'=>'ﳦ','ﳧ'=>'ﳧ','ﳨ'=>'ﳨ','ﳩ'=>'ﳩ','ﳪ'=>'ﳪ','ﳫ'=>'ﳫ','ﳬ'=>'ﳬ','ﳭ'=>'ﳭ','ﳮ'=>'ﳮ','ﳯ'=>'ﳯ','ﳰ'=>'ﳰ','ﳱ'=>'ﳱ','ﳲ'=>'ﳲ','ﳳ'=>'ﳳ','ﳴ'=>'ﳴ','ﳵ'=>'ﳵ','ﳶ'=>'ﳶ','ﳷ'=>'ﳷ','ﳸ'=>'ﳸ','ﳹ'=>'ﳹ','ﳺ'=>'ﳺ','ﳻ'=>'ﳻ','ﳼ'=>'ﳼ','ﳽ'=>'ﳽ','ﳾ'=>'ﳾ','ﳿ'=>'ﳿ','ﴀ'=>'ﴀ','ﴁ'=>'ﴁ','ﴂ'=>'ﴂ','ﴃ'=>'ﴃ','ﴄ'=>'ﴄ','ﴅ'=>'ﴅ','ﴆ'=>'ﴆ','ﴇ'=>'ﴇ','ﴈ'=>'ﴈ','ﴉ'=>'ﴉ','ﴊ'=>'ﴊ','ﴋ'=>'ﴋ','ﴌ'=>'ﴌ','ﴍ'=>'ﴍ','ﴎ'=>'ﴎ','ﴏ'=>'ﴏ','ﴐ'=>'ﴐ','ﴑ'=>'ﴑ','ﴒ'=>'ﴒ','ﴓ'=>'ﴓ','ﴔ'=>'ﴔ','ﴕ'=>'ﴕ','ﴖ'=>'ﴖ','ﴗ'=>'ﴗ','ﴘ'=>'ﴘ','ﴙ'=>'ﴙ','ﴚ'=>'ﴚ','ﴛ'=>'ﴛ','ﴜ'=>'ﴜ','ﴝ'=>'ﴝ','ﴞ'=>'ﴞ','ﴟ'=>'ﴟ','ﴠ'=>'ﴠ','ﴡ'=>'ﴡ','ﴢ'=>'ﴢ','ﴣ'=>'ﴣ','ﴤ'=>'ﴤ','ﴥ'=>'ﴥ','ﴦ'=>'ﴦ','ﴧ'=>'ﴧ','ﴨ'=>'ﴨ','ﴩ'=>'ﴩ','ﴪ'=>'ﴪ','ﴫ'=>'ﴫ','ﴬ'=>'ﴬ','ﴭ'=>'ﴭ','ﴮ'=>'ﴮ','ﴯ'=>'ﴯ','ﴰ'=>'ﴰ','ﴱ'=>'ﴱ','ﴲ'=>'ﴲ','ﴳ'=>'ﴳ','ﴴ'=>'ﴴ','ﴵ'=>'ﴵ','ﴶ'=>'ﴶ','ﴷ'=>'ﴷ','ﴸ'=>'ﴸ','ﴹ'=>'ﴹ','ﴺ'=>'ﴺ','ﴻ'=>'ﴻ','ﴼ'=>'ﴼ','ﴽ'=>'ﴽ','ﵐ'=>'ﵐ','ﵑ'=>'ﵑ','ﵒ'=>'ﵒ','ﵓ'=>'ﵓ','ﵔ'=>'ﵔ','ﵕ'=>'ﵕ','ﵖ'=>'ﵖ','ﵗ'=>'ﵗ','ﵘ'=>'ﵘ','ﵙ'=>'ﵙ','ﵚ'=>'ﵚ','ﵛ'=>'ﵛ','ﵜ'=>'ﵜ','ﵝ'=>'ﵝ','ﵞ'=>'ﵞ','ﵟ'=>'ﵟ','ﵠ'=>'ﵠ','ﵡ'=>'ﵡ','ﵢ'=>'ﵢ','ﵣ'=>'ﵣ','ﵤ'=>'ﵤ','ﵥ'=>'ﵥ','ﵦ'=>'ﵦ','ﵧ'=>'ﵧ','ﵨ'=>'ﵨ','ﵩ'=>'ﵩ','ﵪ'=>'ﵪ','ﵫ'=>'ﵫ','ﵬ'=>'ﵬ','ﵭ'=>'ﵭ','ﵮ'=>'ﵮ','ﵯ'=>'ﵯ','ﵰ'=>'ﵰ','ﵱ'=>'ﵱ','ﵲ'=>'ﵲ','ﵳ'=>'ﵳ','ﵴ'=>'ﵴ','ﵵ'=>'ﵵ','ﵶ'=>'ﵶ','ﵷ'=>'ﵷ','ﵸ'=>'ﵸ','ﵹ'=>'ﵹ','ﵺ'=>'ﵺ','ﵻ'=>'ﵻ','ﵼ'=>'ﵼ','ﵽ'=>'ﵽ','ﵾ'=>'ﵾ','ﵿ'=>'ﵿ','ﶀ'=>'ﶀ','ﶁ'=>'ﶁ','ﶂ'=>'ﶂ','ﶃ'=>'ﶃ','ﶄ'=>'ﶄ','ﶅ'=>'ﶅ','ﶆ'=>'ﶆ','ﶇ'=>'ﶇ','ﶈ'=>'ﶈ','ﶉ'=>'ﶉ','ﶊ'=>'ﶊ','ﶋ'=>'ﶋ','ﶌ'=>'ﶌ','ﶍ'=>'ﶍ','ﶎ'=>'ﶎ','ﶏ'=>'ﶏ','ﶒ'=>'ﶒ','ﶓ'=>'ﶓ','ﶔ'=>'ﶔ','ﶕ'=>'ﶕ','ﶖ'=>'ﶖ','ﶗ'=>'ﶗ','ﶘ'=>'ﶘ','ﶙ'=>'ﶙ','ﶚ'=>'ﶚ','ﶛ'=>'ﶛ','ﶜ'=>'ﶜ','ﶝ'=>'ﶝ','ﶞ'=>'ﶞ','ﶟ'=>'ﶟ','ﶠ'=>'ﶠ','ﶡ'=>'ﶡ','ﶢ'=>'ﶢ','ﶣ'=>'ﶣ','ﶤ'=>'ﶤ','ﶥ'=>'ﶥ','ﶦ'=>'ﶦ','ﶧ'=>'ﶧ','ﶨ'=>'ﶨ','ﶩ'=>'ﶩ','ﶪ'=>'ﶪ','ﶫ'=>'ﶫ','ﶬ'=>'ﶬ','ﶭ'=>'ﶭ','ﶮ'=>'ﶮ','ﶯ'=>'ﶯ','ﶰ'=>'ﶰ','ﶱ'=>'ﶱ','ﶲ'=>'ﶲ','ﶳ'=>'ﶳ','ﶴ'=>'ﶴ','ﶵ'=>'ﶵ','ﶶ'=>'ﶶ','ﶷ'=>'ﶷ','ﶸ'=>'ﶸ','ﶹ'=>'ﶹ','ﶺ'=>'ﶺ','ﶻ'=>'ﶻ','ﶼ'=>'ﶼ','ﶽ'=>'ﶽ','ﶾ'=>'ﶾ','ﶿ'=>'ﶿ','ﷀ'=>'ﷀ','ﷁ'=>'ﷁ','ﷂ'=>'ﷂ','ﷃ'=>'ﷃ','ﷄ'=>'ﷄ','ﷅ'=>'ﷅ','ﷆ'=>'ﷆ','ﷇ'=>'ﷇ','ﷰ'=>'ﷰ','ﷱ'=>'ﷱ','ﷲ'=>'ﷲ','ﷳ'=>'ﷳ','ﷴ'=>'ﷴ','ﷵ'=>'ﷵ','ﷶ'=>'ﷶ','ﷷ'=>'ﷷ','ﷸ'=>'ﷸ','ﷹ'=>'ﷹ','ﷺ'=>'ﷺ','ﷻ'=>'ﷻ','︀'=>'︀','︁'=>'︁','︂'=>'︂','︃'=>'︃','︄'=>'︄','︅'=>'︅','︆'=>'︆','︇'=>'︇','︈'=>'︈','︉'=>'︉','︊'=>'︊','︋'=>'︋','︌'=>'︌','︍'=>'︍','︎'=>'︎','️'=>'️','︠'=>'︠','︡'=>'︡','︢'=>'︢','︣'=>'︣','ﹰ'=>'ﹰ','ﹱ'=>'ﹱ','ﹲ'=>'ﹲ','ﹳ'=>'ﹳ','ﹴ'=>'ﹴ','ﹶ'=>'ﹶ','ﹷ'=>'ﹷ','ﹸ'=>'ﹸ','ﹹ'=>'ﹹ','ﹺ'=>'ﹺ','ﹻ'=>'ﹻ','ﹼ'=>'ﹼ','ﹽ'=>'ﹽ','ﹾ'=>'ﹾ','ﹿ'=>'ﹿ','ﺀ'=>'ﺀ','ﺁ'=>'ﺁ','ﺂ'=>'ﺂ','ﺃ'=>'ﺃ','ﺄ'=>'ﺄ','ﺅ'=>'ﺅ','ﺆ'=>'ﺆ','ﺇ'=>'ﺇ','ﺈ'=>'ﺈ','ﺉ'=>'ﺉ','ﺊ'=>'ﺊ','ﺋ'=>'ﺋ','ﺌ'=>'ﺌ','ﺍ'=>'ﺍ','ﺎ'=>'ﺎ','ﺏ'=>'ﺏ','ﺐ'=>'ﺐ','ﺑ'=>'ﺑ','ﺒ'=>'ﺒ','ﺓ'=>'ﺓ','ﺔ'=>'ﺔ','ﺕ'=>'ﺕ','ﺖ'=>'ﺖ','ﺗ'=>'ﺗ','ﺘ'=>'ﺘ','ﺙ'=>'ﺙ','ﺚ'=>'ﺚ','ﺛ'=>'ﺛ','ﺜ'=>'ﺜ','ﺝ'=>'ﺝ','ﺞ'=>'ﺞ','ﺟ'=>'ﺟ','ﺠ'=>'ﺠ','ﺡ'=>'ﺡ','ﺢ'=>'ﺢ','ﺣ'=>'ﺣ','ﺤ'=>'ﺤ','ﺥ'=>'ﺥ','ﺦ'=>'ﺦ','ﺧ'=>'ﺧ','ﺨ'=>'ﺨ','ﺩ'=>'ﺩ','ﺪ'=>'ﺪ','ﺫ'=>'ﺫ','ﺬ'=>'ﺬ','ﺭ'=>'ﺭ','ﺮ'=>'ﺮ','ﺯ'=>'ﺯ','ﺰ'=>'ﺰ','ﺱ'=>'ﺱ','ﺲ'=>'ﺲ','ﺳ'=>'ﺳ','ﺴ'=>'ﺴ','ﺵ'=>'ﺵ','ﺶ'=>'ﺶ','ﺷ'=>'ﺷ','ﺸ'=>'ﺸ','ﺹ'=>'ﺹ','ﺺ'=>'ﺺ','ﺻ'=>'ﺻ','ﺼ'=>'ﺼ','ﺽ'=>'ﺽ','ﺾ'=>'ﺾ','ﺿ'=>'ﺿ','ﻀ'=>'ﻀ','ﻁ'=>'ﻁ','ﻂ'=>'ﻂ','ﻃ'=>'ﻃ','ﻄ'=>'ﻄ','ﻅ'=>'ﻅ','ﻆ'=>'ﻆ','ﻇ'=>'ﻇ','ﻈ'=>'ﻈ','ﻉ'=>'ﻉ','ﻊ'=>'ﻊ','ﻋ'=>'ﻋ','ﻌ'=>'ﻌ','ﻍ'=>'ﻍ','ﻎ'=>'ﻎ','ﻏ'=>'ﻏ','ﻐ'=>'ﻐ','ﻑ'=>'ﻑ','ﻒ'=>'ﻒ','ﻓ'=>'ﻓ','ﻔ'=>'ﻔ','ﻕ'=>'ﻕ','ﻖ'=>'ﻖ','ﻗ'=>'ﻗ','ﻘ'=>'ﻘ','ﻙ'=>'ﻙ','ﻚ'=>'ﻚ','ﻛ'=>'ﻛ','ﻜ'=>'ﻜ','ﻝ'=>'ﻝ','ﻞ'=>'ﻞ','ﻟ'=>'ﻟ','ﻠ'=>'ﻠ','ﻡ'=>'ﻡ','ﻢ'=>'ﻢ','ﻣ'=>'ﻣ','ﻤ'=>'ﻤ','ﻥ'=>'ﻥ','ﻦ'=>'ﻦ','ﻧ'=>'ﻧ','ﻨ'=>'ﻨ','ﻩ'=>'ﻩ','ﻪ'=>'ﻪ','ﻫ'=>'ﻫ','ﻬ'=>'ﻬ','ﻭ'=>'ﻭ','ﻮ'=>'ﻮ','ﻯ'=>'ﻯ','ﻰ'=>'ﻰ','ﻱ'=>'ﻱ','ﻲ'=>'ﻲ','ﻳ'=>'ﻳ','ﻴ'=>'ﻴ','ﻵ'=>'ﻵ','ﻶ'=>'ﻶ','ﻷ'=>'ﻷ','ﻸ'=>'ﻸ','ﻹ'=>'ﻹ','ﻺ'=>'ﻺ','ﻻ'=>'ﻻ','ﻼ'=>'ﻼ','0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','ヲ'=>'ヲ','ァ'=>'ァ','ィ'=>'ィ','ゥ'=>'ゥ','ェ'=>'ェ','ォ'=>'ォ','ャ'=>'ャ','ュ'=>'ュ','ョ'=>'ョ','ッ'=>'ッ','ー'=>'ー','ア'=>'ア','イ'=>'イ','ウ'=>'ウ','エ'=>'エ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'ヘ','ホ'=>'ホ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ヤ'=>'ヤ','ユ'=>'ユ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ン'=>'ン','゙'=>'゙','゚'=>'゚','ᅠ'=>'ᅠ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᆪ'=>'ᆪ','ᄂ'=>'ᄂ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᄚ'=>'ᄚ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄡ'=>'ᄡ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ'); \ No newline at end of file
+<?php return array('豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','﨎'=>'﨎','﨏'=>'﨏','塚'=>'塚','﨑'=>'﨑','晴'=>'晴','﨓'=>'﨓','﨔'=>'﨔','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','﨟'=>'﨟','蘒'=>'蘒','﨡'=>'﨡','諸'=>'諸','﨣'=>'﨣','﨤'=>'﨤','逸'=>'逸','都'=>'都','﨧'=>'﨧','﨨'=>'﨨','﨩'=>'﨩','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'ſt','st'=>'st','ﬓ'=>'ﬓ','ﬔ'=>'ﬔ','ﬕ'=>'ﬕ','ﬖ'=>'ﬖ','ﬗ'=>'ﬗ','יִ'=>'יִ','ﬞ'=>'ﬞ','ײַ'=>'ײַ','ﬠ'=>'ﬠ','ﬡ'=>'ﬡ','ﬢ'=>'ﬢ','ﬣ'=>'ﬣ','ﬤ'=>'ﬤ','ﬥ'=>'ﬥ','ﬦ'=>'ﬦ','ﬧ'=>'ﬧ','ﬨ'=>'ﬨ','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','ﭏ'=>'ﭏ','ﭐ'=>'ﭐ','ﭑ'=>'ﭑ','ﭒ'=>'ﭒ','ﭓ'=>'ﭓ','ﭔ'=>'ﭔ','ﭕ'=>'ﭕ','ﭖ'=>'ﭖ','ﭗ'=>'ﭗ','ﭘ'=>'ﭘ','ﭙ'=>'ﭙ','ﭚ'=>'ﭚ','ﭛ'=>'ﭛ','ﭜ'=>'ﭜ','ﭝ'=>'ﭝ','ﭞ'=>'ﭞ','ﭟ'=>'ﭟ','ﭠ'=>'ﭠ','ﭡ'=>'ﭡ','ﭢ'=>'ﭢ','ﭣ'=>'ﭣ','ﭤ'=>'ﭤ','ﭥ'=>'ﭥ','ﭦ'=>'ﭦ','ﭧ'=>'ﭧ','ﭨ'=>'ﭨ','ﭩ'=>'ﭩ','ﭪ'=>'ﭪ','ﭫ'=>'ﭫ','ﭬ'=>'ﭬ','ﭭ'=>'ﭭ','ﭮ'=>'ﭮ','ﭯ'=>'ﭯ','ﭰ'=>'ﭰ','ﭱ'=>'ﭱ','ﭲ'=>'ﭲ','ﭳ'=>'ﭳ','ﭴ'=>'ﭴ','ﭵ'=>'ﭵ','ﭶ'=>'ﭶ','ﭷ'=>'ﭷ','ﭸ'=>'ﭸ','ﭹ'=>'ﭹ','ﭺ'=>'ﭺ','ﭻ'=>'ﭻ','ﭼ'=>'ﭼ','ﭽ'=>'ﭽ','ﭾ'=>'ﭾ','ﭿ'=>'ﭿ','ﮀ'=>'ﮀ','ﮁ'=>'ﮁ','ﮂ'=>'ﮂ','ﮃ'=>'ﮃ','ﮄ'=>'ﮄ','ﮅ'=>'ﮅ','ﮆ'=>'ﮆ','ﮇ'=>'ﮇ','ﮈ'=>'ﮈ','ﮉ'=>'ﮉ','ﮊ'=>'ﮊ','ﮋ'=>'ﮋ','ﮌ'=>'ﮌ','ﮍ'=>'ﮍ','ﮎ'=>'ﮎ','ﮏ'=>'ﮏ','ﮐ'=>'ﮐ','ﮑ'=>'ﮑ','ﮒ'=>'ﮒ','ﮓ'=>'ﮓ','ﮔ'=>'ﮔ','ﮕ'=>'ﮕ','ﮖ'=>'ﮖ','ﮗ'=>'ﮗ','ﮘ'=>'ﮘ','ﮙ'=>'ﮙ','ﮚ'=>'ﮚ','ﮛ'=>'ﮛ','ﮜ'=>'ﮜ','ﮝ'=>'ﮝ','ﮞ'=>'ﮞ','ﮟ'=>'ﮟ','ﮠ'=>'ﮠ','ﮡ'=>'ﮡ','ﮢ'=>'ﮢ','ﮣ'=>'ﮣ','ﮤ'=>'ﮤ','ﮥ'=>'ﮥ','ﮦ'=>'ﮦ','ﮧ'=>'ﮧ','ﮨ'=>'ﮨ','ﮩ'=>'ﮩ','ﮪ'=>'ﮪ','ﮫ'=>'ﮫ','ﮬ'=>'ﮬ','ﮭ'=>'ﮭ','ﮮ'=>'ﮮ','ﮯ'=>'ﮯ','ﮰ'=>'ﮰ','ﮱ'=>'ﮱ','ﯓ'=>'ﯓ','ﯔ'=>'ﯔ','ﯕ'=>'ﯕ','ﯖ'=>'ﯖ','ﯗ'=>'ﯗ','ﯘ'=>'ﯘ','ﯙ'=>'ﯙ','ﯚ'=>'ﯚ','ﯛ'=>'ﯛ','ﯜ'=>'ﯜ','ﯝ'=>'ﯝ','ﯞ'=>'ﯞ','ﯟ'=>'ﯟ','ﯠ'=>'ﯠ','ﯡ'=>'ﯡ','ﯢ'=>'ﯢ','ﯣ'=>'ﯣ','ﯤ'=>'ﯤ','ﯥ'=>'ﯥ','ﯦ'=>'ﯦ','ﯧ'=>'ﯧ','ﯨ'=>'ﯨ','ﯩ'=>'ﯩ','ﯪ'=>'ﯪ','ﯫ'=>'ﯫ','ﯬ'=>'ﯬ','ﯭ'=>'ﯭ','ﯮ'=>'ﯮ','ﯯ'=>'ﯯ','ﯰ'=>'ﯰ','ﯱ'=>'ﯱ','ﯲ'=>'ﯲ','ﯳ'=>'ﯳ','ﯴ'=>'ﯴ','ﯵ'=>'ﯵ','ﯶ'=>'ﯶ','ﯷ'=>'ﯷ','ﯸ'=>'ﯸ','ﯹ'=>'ﯹ','ﯺ'=>'ﯺ','ﯻ'=>'ﯻ','ﯼ'=>'ﯼ','ﯽ'=>'ﯽ','ﯾ'=>'ﯾ','ﯿ'=>'ﯿ','ﰀ'=>'ﰀ','ﰁ'=>'ﰁ','ﰂ'=>'ﰂ','ﰃ'=>'ﰃ','ﰄ'=>'ﰄ','ﰅ'=>'ﰅ','ﰆ'=>'ﰆ','ﰇ'=>'ﰇ','ﰈ'=>'ﰈ','ﰉ'=>'ﰉ','ﰊ'=>'ﰊ','ﰋ'=>'ﰋ','ﰌ'=>'ﰌ','ﰍ'=>'ﰍ','ﰎ'=>'ﰎ','ﰏ'=>'ﰏ','ﰐ'=>'ﰐ','ﰑ'=>'ﰑ','ﰒ'=>'ﰒ','ﰓ'=>'ﰓ','ﰔ'=>'ﰔ','ﰕ'=>'ﰕ','ﰖ'=>'ﰖ','ﰗ'=>'ﰗ','ﰘ'=>'ﰘ','ﰙ'=>'ﰙ','ﰚ'=>'ﰚ','ﰛ'=>'ﰛ','ﰜ'=>'ﰜ','ﰝ'=>'ﰝ','ﰞ'=>'ﰞ','ﰟ'=>'ﰟ','ﰠ'=>'ﰠ','ﰡ'=>'ﰡ','ﰢ'=>'ﰢ','ﰣ'=>'ﰣ','ﰤ'=>'ﰤ','ﰥ'=>'ﰥ','ﰦ'=>'ﰦ','ﰧ'=>'ﰧ','ﰨ'=>'ﰨ','ﰩ'=>'ﰩ','ﰪ'=>'ﰪ','ﰫ'=>'ﰫ','ﰬ'=>'ﰬ','ﰭ'=>'ﰭ','ﰮ'=>'ﰮ','ﰯ'=>'ﰯ','ﰰ'=>'ﰰ','ﰱ'=>'ﰱ','ﰲ'=>'ﰲ','ﰳ'=>'ﰳ','ﰴ'=>'ﰴ','ﰵ'=>'ﰵ','ﰶ'=>'ﰶ','ﰷ'=>'ﰷ','ﰸ'=>'ﰸ','ﰹ'=>'ﰹ','ﰺ'=>'ﰺ','ﰻ'=>'ﰻ','ﰼ'=>'ﰼ','ﰽ'=>'ﰽ','ﰾ'=>'ﰾ','ﰿ'=>'ﰿ','ﱀ'=>'ﱀ','ﱁ'=>'ﱁ','ﱂ'=>'ﱂ','ﱃ'=>'ﱃ','ﱄ'=>'ﱄ','ﱅ'=>'ﱅ','ﱆ'=>'ﱆ','ﱇ'=>'ﱇ','ﱈ'=>'ﱈ','ﱉ'=>'ﱉ','ﱊ'=>'ﱊ','ﱋ'=>'ﱋ','ﱌ'=>'ﱌ','ﱍ'=>'ﱍ','ﱎ'=>'ﱎ','ﱏ'=>'ﱏ','ﱐ'=>'ﱐ','ﱑ'=>'ﱑ','ﱒ'=>'ﱒ','ﱓ'=>'ﱓ','ﱔ'=>'ﱔ','ﱕ'=>'ﱕ','ﱖ'=>'ﱖ','ﱗ'=>'ﱗ','ﱘ'=>'ﱘ','ﱙ'=>'ﱙ','ﱚ'=>'ﱚ','ﱛ'=>'ﱛ','ﱜ'=>'ﱜ','ﱝ'=>'ﱝ','ﱞ'=>'ﱞ','ﱟ'=>'ﱟ','ﱠ'=>'ﱠ','ﱡ'=>'ﱡ','ﱢ'=>'ﱢ','ﱣ'=>'ﱣ','ﱤ'=>'ﱤ','ﱥ'=>'ﱥ','ﱦ'=>'ﱦ','ﱧ'=>'ﱧ','ﱨ'=>'ﱨ','ﱩ'=>'ﱩ','ﱪ'=>'ﱪ','ﱫ'=>'ﱫ','ﱬ'=>'ﱬ','ﱭ'=>'ﱭ','ﱮ'=>'ﱮ','ﱯ'=>'ﱯ','ﱰ'=>'ﱰ','ﱱ'=>'ﱱ','ﱲ'=>'ﱲ','ﱳ'=>'ﱳ','ﱴ'=>'ﱴ','ﱵ'=>'ﱵ','ﱶ'=>'ﱶ','ﱷ'=>'ﱷ','ﱸ'=>'ﱸ','ﱹ'=>'ﱹ','ﱺ'=>'ﱺ','ﱻ'=>'ﱻ','ﱼ'=>'ﱼ','ﱽ'=>'ﱽ','ﱾ'=>'ﱾ','ﱿ'=>'ﱿ','ﲀ'=>'ﲀ','ﲁ'=>'ﲁ','ﲂ'=>'ﲂ','ﲃ'=>'ﲃ','ﲄ'=>'ﲄ','ﲅ'=>'ﲅ','ﲆ'=>'ﲆ','ﲇ'=>'ﲇ','ﲈ'=>'ﲈ','ﲉ'=>'ﲉ','ﲊ'=>'ﲊ','ﲋ'=>'ﲋ','ﲌ'=>'ﲌ','ﲍ'=>'ﲍ','ﲎ'=>'ﲎ','ﲏ'=>'ﲏ','ﲐ'=>'ﲐ','ﲑ'=>'ﲑ','ﲒ'=>'ﲒ','ﲓ'=>'ﲓ','ﲔ'=>'ﲔ','ﲕ'=>'ﲕ','ﲖ'=>'ﲖ','ﲗ'=>'ﲗ','ﲘ'=>'ﲘ','ﲙ'=>'ﲙ','ﲚ'=>'ﲚ','ﲛ'=>'ﲛ','ﲜ'=>'ﲜ','ﲝ'=>'ﲝ','ﲞ'=>'ﲞ','ﲟ'=>'ﲟ','ﲠ'=>'ﲠ','ﲡ'=>'ﲡ','ﲢ'=>'ﲢ','ﲣ'=>'ﲣ','ﲤ'=>'ﲤ','ﲥ'=>'ﲥ','ﲦ'=>'ﲦ','ﲧ'=>'ﲧ','ﲨ'=>'ﲨ','ﲩ'=>'ﲩ','ﲪ'=>'ﲪ','ﲫ'=>'ﲫ','ﲬ'=>'ﲬ','ﲭ'=>'ﲭ','ﲮ'=>'ﲮ','ﲯ'=>'ﲯ','ﲰ'=>'ﲰ','ﲱ'=>'ﲱ','ﲲ'=>'ﲲ','ﲳ'=>'ﲳ','ﲴ'=>'ﲴ','ﲵ'=>'ﲵ','ﲶ'=>'ﲶ','ﲷ'=>'ﲷ','ﲸ'=>'ﲸ','ﲹ'=>'ﲹ','ﲺ'=>'ﲺ','ﲻ'=>'ﲻ','ﲼ'=>'ﲼ','ﲽ'=>'ﲽ','ﲾ'=>'ﲾ','ﲿ'=>'ﲿ','ﳀ'=>'ﳀ','ﳁ'=>'ﳁ','ﳂ'=>'ﳂ','ﳃ'=>'ﳃ','ﳄ'=>'ﳄ','ﳅ'=>'ﳅ','ﳆ'=>'ﳆ','ﳇ'=>'ﳇ','ﳈ'=>'ﳈ','ﳉ'=>'ﳉ','ﳊ'=>'ﳊ','ﳋ'=>'ﳋ','ﳌ'=>'ﳌ','ﳍ'=>'ﳍ','ﳎ'=>'ﳎ','ﳏ'=>'ﳏ','ﳐ'=>'ﳐ','ﳑ'=>'ﳑ','ﳒ'=>'ﳒ','ﳓ'=>'ﳓ','ﳔ'=>'ﳔ','ﳕ'=>'ﳕ','ﳖ'=>'ﳖ','ﳗ'=>'ﳗ','ﳘ'=>'ﳘ','ﳙ'=>'ﳙ','ﳚ'=>'ﳚ','ﳛ'=>'ﳛ','ﳜ'=>'ﳜ','ﳝ'=>'ﳝ','ﳞ'=>'ﳞ','ﳟ'=>'ﳟ','ﳠ'=>'ﳠ','ﳡ'=>'ﳡ','ﳢ'=>'ﳢ','ﳣ'=>'ﳣ','ﳤ'=>'ﳤ','ﳥ'=>'ﳥ','ﳦ'=>'ﳦ','ﳧ'=>'ﳧ','ﳨ'=>'ﳨ','ﳩ'=>'ﳩ','ﳪ'=>'ﳪ','ﳫ'=>'ﳫ','ﳬ'=>'ﳬ','ﳭ'=>'ﳭ','ﳮ'=>'ﳮ','ﳯ'=>'ﳯ','ﳰ'=>'ﳰ','ﳱ'=>'ﳱ','ﳲ'=>'ﳲ','ﳳ'=>'ﳳ','ﳴ'=>'ﳴ','ﳵ'=>'ﳵ','ﳶ'=>'ﳶ','ﳷ'=>'ﳷ','ﳸ'=>'ﳸ','ﳹ'=>'ﳹ','ﳺ'=>'ﳺ','ﳻ'=>'ﳻ','ﳼ'=>'ﳼ','ﳽ'=>'ﳽ','ﳾ'=>'ﳾ','ﳿ'=>'ﳿ','ﴀ'=>'ﴀ','ﴁ'=>'ﴁ','ﴂ'=>'ﴂ','ﴃ'=>'ﴃ','ﴄ'=>'ﴄ','ﴅ'=>'ﴅ','ﴆ'=>'ﴆ','ﴇ'=>'ﴇ','ﴈ'=>'ﴈ','ﴉ'=>'ﴉ','ﴊ'=>'ﴊ','ﴋ'=>'ﴋ','ﴌ'=>'ﴌ','ﴍ'=>'ﴍ','ﴎ'=>'ﴎ','ﴏ'=>'ﴏ','ﴐ'=>'ﴐ','ﴑ'=>'ﴑ','ﴒ'=>'ﴒ','ﴓ'=>'ﴓ','ﴔ'=>'ﴔ','ﴕ'=>'ﴕ','ﴖ'=>'ﴖ','ﴗ'=>'ﴗ','ﴘ'=>'ﴘ','ﴙ'=>'ﴙ','ﴚ'=>'ﴚ','ﴛ'=>'ﴛ','ﴜ'=>'ﴜ','ﴝ'=>'ﴝ','ﴞ'=>'ﴞ','ﴟ'=>'ﴟ','ﴠ'=>'ﴠ','ﴡ'=>'ﴡ','ﴢ'=>'ﴢ','ﴣ'=>'ﴣ','ﴤ'=>'ﴤ','ﴥ'=>'ﴥ','ﴦ'=>'ﴦ','ﴧ'=>'ﴧ','ﴨ'=>'ﴨ','ﴩ'=>'ﴩ','ﴪ'=>'ﴪ','ﴫ'=>'ﴫ','ﴬ'=>'ﴬ','ﴭ'=>'ﴭ','ﴮ'=>'ﴮ','ﴯ'=>'ﴯ','ﴰ'=>'ﴰ','ﴱ'=>'ﴱ','ﴲ'=>'ﴲ','ﴳ'=>'ﴳ','ﴴ'=>'ﴴ','ﴵ'=>'ﴵ','ﴶ'=>'ﴶ','ﴷ'=>'ﴷ','ﴸ'=>'ﴸ','ﴹ'=>'ﴹ','ﴺ'=>'ﴺ','ﴻ'=>'ﴻ','ﴼ'=>'ﴼ','ﴽ'=>'ﴽ','ﵐ'=>'ﵐ','ﵑ'=>'ﵑ','ﵒ'=>'ﵒ','ﵓ'=>'ﵓ','ﵔ'=>'ﵔ','ﵕ'=>'ﵕ','ﵖ'=>'ﵖ','ﵗ'=>'ﵗ','ﵘ'=>'ﵘ','ﵙ'=>'ﵙ','ﵚ'=>'ﵚ','ﵛ'=>'ﵛ','ﵜ'=>'ﵜ','ﵝ'=>'ﵝ','ﵞ'=>'ﵞ','ﵟ'=>'ﵟ','ﵠ'=>'ﵠ','ﵡ'=>'ﵡ','ﵢ'=>'ﵢ','ﵣ'=>'ﵣ','ﵤ'=>'ﵤ','ﵥ'=>'ﵥ','ﵦ'=>'ﵦ','ﵧ'=>'ﵧ','ﵨ'=>'ﵨ','ﵩ'=>'ﵩ','ﵪ'=>'ﵪ','ﵫ'=>'ﵫ','ﵬ'=>'ﵬ','ﵭ'=>'ﵭ','ﵮ'=>'ﵮ','ﵯ'=>'ﵯ','ﵰ'=>'ﵰ','ﵱ'=>'ﵱ','ﵲ'=>'ﵲ','ﵳ'=>'ﵳ','ﵴ'=>'ﵴ','ﵵ'=>'ﵵ','ﵶ'=>'ﵶ','ﵷ'=>'ﵷ','ﵸ'=>'ﵸ','ﵹ'=>'ﵹ','ﵺ'=>'ﵺ','ﵻ'=>'ﵻ','ﵼ'=>'ﵼ','ﵽ'=>'ﵽ','ﵾ'=>'ﵾ','ﵿ'=>'ﵿ','ﶀ'=>'ﶀ','ﶁ'=>'ﶁ','ﶂ'=>'ﶂ','ﶃ'=>'ﶃ','ﶄ'=>'ﶄ','ﶅ'=>'ﶅ','ﶆ'=>'ﶆ','ﶇ'=>'ﶇ','ﶈ'=>'ﶈ','ﶉ'=>'ﶉ','ﶊ'=>'ﶊ','ﶋ'=>'ﶋ','ﶌ'=>'ﶌ','ﶍ'=>'ﶍ','ﶎ'=>'ﶎ','ﶏ'=>'ﶏ','ﶒ'=>'ﶒ','ﶓ'=>'ﶓ','ﶔ'=>'ﶔ','ﶕ'=>'ﶕ','ﶖ'=>'ﶖ','ﶗ'=>'ﶗ','ﶘ'=>'ﶘ','ﶙ'=>'ﶙ','ﶚ'=>'ﶚ','ﶛ'=>'ﶛ','ﶜ'=>'ﶜ','ﶝ'=>'ﶝ','ﶞ'=>'ﶞ','ﶟ'=>'ﶟ','ﶠ'=>'ﶠ','ﶡ'=>'ﶡ','ﶢ'=>'ﶢ','ﶣ'=>'ﶣ','ﶤ'=>'ﶤ','ﶥ'=>'ﶥ','ﶦ'=>'ﶦ','ﶧ'=>'ﶧ','ﶨ'=>'ﶨ','ﶩ'=>'ﶩ','ﶪ'=>'ﶪ','ﶫ'=>'ﶫ','ﶬ'=>'ﶬ','ﶭ'=>'ﶭ','ﶮ'=>'ﶮ','ﶯ'=>'ﶯ','ﶰ'=>'ﶰ','ﶱ'=>'ﶱ','ﶲ'=>'ﶲ','ﶳ'=>'ﶳ','ﶴ'=>'ﶴ','ﶵ'=>'ﶵ','ﶶ'=>'ﶶ','ﶷ'=>'ﶷ','ﶸ'=>'ﶸ','ﶹ'=>'ﶹ','ﶺ'=>'ﶺ','ﶻ'=>'ﶻ','ﶼ'=>'ﶼ','ﶽ'=>'ﶽ','ﶾ'=>'ﶾ','ﶿ'=>'ﶿ','ﷀ'=>'ﷀ','ﷁ'=>'ﷁ','ﷂ'=>'ﷂ','ﷃ'=>'ﷃ','ﷄ'=>'ﷄ','ﷅ'=>'ﷅ','ﷆ'=>'ﷆ','ﷇ'=>'ﷇ','ﷰ'=>'ﷰ','ﷱ'=>'ﷱ','ﷲ'=>'ﷲ','ﷳ'=>'ﷳ','ﷴ'=>'ﷴ','ﷵ'=>'ﷵ','ﷶ'=>'ﷶ','ﷷ'=>'ﷷ','ﷸ'=>'ﷸ','ﷹ'=>'ﷹ','ﷺ'=>'ﷺ','ﷻ'=>'ﷻ','︀'=>'︀','︁'=>'︁','︂'=>'︂','︃'=>'︃','︄'=>'︄','︅'=>'︅','︆'=>'︆','︇'=>'︇','︈'=>'︈','︉'=>'︉','︊'=>'︊','︋'=>'︋','︌'=>'︌','︍'=>'︍','︎'=>'︎','️'=>'️','︠'=>'︠','︡'=>'︡','︢'=>'︢','︣'=>'︣','ﹰ'=>'ﹰ','ﹱ'=>'ﹱ','ﹲ'=>'ﹲ','ﹳ'=>'ﹳ','ﹴ'=>'ﹴ','ﹶ'=>'ﹶ','ﹷ'=>'ﹷ','ﹸ'=>'ﹸ','ﹹ'=>'ﹹ','ﹺ'=>'ﹺ','ﹻ'=>'ﹻ','ﹼ'=>'ﹼ','ﹽ'=>'ﹽ','ﹾ'=>'ﹾ','ﹿ'=>'ﹿ','ﺀ'=>'ﺀ','ﺁ'=>'ﺁ','ﺂ'=>'ﺂ','ﺃ'=>'ﺃ','ﺄ'=>'ﺄ','ﺅ'=>'ﺅ','ﺆ'=>'ﺆ','ﺇ'=>'ﺇ','ﺈ'=>'ﺈ','ﺉ'=>'ﺉ','ﺊ'=>'ﺊ','ﺋ'=>'ﺋ','ﺌ'=>'ﺌ','ﺍ'=>'ﺍ','ﺎ'=>'ﺎ','ﺏ'=>'ﺏ','ﺐ'=>'ﺐ','ﺑ'=>'ﺑ','ﺒ'=>'ﺒ','ﺓ'=>'ﺓ','ﺔ'=>'ﺔ','ﺕ'=>'ﺕ','ﺖ'=>'ﺖ','ﺗ'=>'ﺗ','ﺘ'=>'ﺘ','ﺙ'=>'ﺙ','ﺚ'=>'ﺚ','ﺛ'=>'ﺛ','ﺜ'=>'ﺜ','ﺝ'=>'ﺝ','ﺞ'=>'ﺞ','ﺟ'=>'ﺟ','ﺠ'=>'ﺠ','ﺡ'=>'ﺡ','ﺢ'=>'ﺢ','ﺣ'=>'ﺣ','ﺤ'=>'ﺤ','ﺥ'=>'ﺥ','ﺦ'=>'ﺦ','ﺧ'=>'ﺧ','ﺨ'=>'ﺨ','ﺩ'=>'ﺩ','ﺪ'=>'ﺪ','ﺫ'=>'ﺫ','ﺬ'=>'ﺬ','ﺭ'=>'ﺭ','ﺮ'=>'ﺮ','ﺯ'=>'ﺯ','ﺰ'=>'ﺰ','ﺱ'=>'ﺱ','ﺲ'=>'ﺲ','ﺳ'=>'ﺳ','ﺴ'=>'ﺴ','ﺵ'=>'ﺵ','ﺶ'=>'ﺶ','ﺷ'=>'ﺷ','ﺸ'=>'ﺸ','ﺹ'=>'ﺹ','ﺺ'=>'ﺺ','ﺻ'=>'ﺻ','ﺼ'=>'ﺼ','ﺽ'=>'ﺽ','ﺾ'=>'ﺾ','ﺿ'=>'ﺿ','ﻀ'=>'ﻀ','ﻁ'=>'ﻁ','ﻂ'=>'ﻂ','ﻃ'=>'ﻃ','ﻄ'=>'ﻄ','ﻅ'=>'ﻅ','ﻆ'=>'ﻆ','ﻇ'=>'ﻇ','ﻈ'=>'ﻈ','ﻉ'=>'ﻉ','ﻊ'=>'ﻊ','ﻋ'=>'ﻋ','ﻌ'=>'ﻌ','ﻍ'=>'ﻍ','ﻎ'=>'ﻎ','ﻏ'=>'ﻏ','ﻐ'=>'ﻐ','ﻑ'=>'ﻑ','ﻒ'=>'ﻒ','ﻓ'=>'ﻓ','ﻔ'=>'ﻔ','ﻕ'=>'ﻕ','ﻖ'=>'ﻖ','ﻗ'=>'ﻗ','ﻘ'=>'ﻘ','ﻙ'=>'ﻙ','ﻚ'=>'ﻚ','ﻛ'=>'ﻛ','ﻜ'=>'ﻜ','ﻝ'=>'ﻝ','ﻞ'=>'ﻞ','ﻟ'=>'ﻟ','ﻠ'=>'ﻠ','ﻡ'=>'ﻡ','ﻢ'=>'ﻢ','ﻣ'=>'ﻣ','ﻤ'=>'ﻤ','ﻥ'=>'ﻥ','ﻦ'=>'ﻦ','ﻧ'=>'ﻧ','ﻨ'=>'ﻨ','ﻩ'=>'ﻩ','ﻪ'=>'ﻪ','ﻫ'=>'ﻫ','ﻬ'=>'ﻬ','ﻭ'=>'ﻭ','ﻮ'=>'ﻮ','ﻯ'=>'ﻯ','ﻰ'=>'ﻰ','ﻱ'=>'ﻱ','ﻲ'=>'ﻲ','ﻳ'=>'ﻳ','ﻴ'=>'ﻴ','ﻵ'=>'ﻵ','ﻶ'=>'ﻶ','ﻷ'=>'ﻷ','ﻸ'=>'ﻸ','ﻹ'=>'ﻹ','ﻺ'=>'ﻺ','ﻻ'=>'ﻻ','ﻼ'=>'ﻼ','0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','A'=>'a','B'=>'b','C'=>'c','D'=>'d','E'=>'e','F'=>'f','G'=>'g','H'=>'h','I'=>'i','J'=>'j','K'=>'k','L'=>'l','M'=>'m','N'=>'n','O'=>'o','P'=>'p','Q'=>'q','R'=>'r','S'=>'s','T'=>'t','U'=>'u','V'=>'v','W'=>'w','X'=>'x','Y'=>'y','Z'=>'z','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','ヲ'=>'ヲ','ァ'=>'ァ','ィ'=>'ィ','ゥ'=>'ゥ','ェ'=>'ェ','ォ'=>'ォ','ャ'=>'ャ','ュ'=>'ュ','ョ'=>'ョ','ッ'=>'ッ','ー'=>'ー','ア'=>'ア','イ'=>'イ','ウ'=>'ウ','エ'=>'エ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'ヘ','ホ'=>'ホ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ヤ'=>'ヤ','ユ'=>'ユ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ン'=>'ン','゙'=>'゙','゚'=>'゚','ᅠ'=>'ᅠ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᆪ'=>'ᆪ','ᄂ'=>'ᄂ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᄚ'=>'ᄚ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄡ'=>'ᄡ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ');
diff --git a/phpBB/includes/utf/data/search_indexer_32.php b/phpBB/includes/utf/data/search_indexer_32.php
index 73ed2924ab..cea5ebad6a 100644
--- a/phpBB/includes/utf/data/search_indexer_32.php
+++ b/phpBB/includes/utf/data/search_indexer_32.php
@@ -1 +1 @@
-<?php return array('𐀀'=>'𐀀','𐀁'=>'𐀁','𐀂'=>'𐀂','𐀃'=>'𐀃','𐀄'=>'𐀄','𐀅'=>'𐀅','𐀆'=>'𐀆','𐀇'=>'𐀇','𐀈'=>'𐀈','𐀉'=>'𐀉','𐀊'=>'𐀊','𐀋'=>'𐀋','𐀍'=>'𐀍','𐀎'=>'𐀎','𐀏'=>'𐀏','𐀐'=>'𐀐','𐀑'=>'𐀑','𐀒'=>'𐀒','𐀓'=>'𐀓','𐀔'=>'𐀔','𐀕'=>'𐀕','𐀖'=>'𐀖','𐀗'=>'𐀗','𐀘'=>'𐀘','𐀙'=>'𐀙','𐀚'=>'𐀚','𐀛'=>'𐀛','𐀜'=>'𐀜','𐀝'=>'𐀝','𐀞'=>'𐀞','𐀟'=>'𐀟','𐀠'=>'𐀠','𐀡'=>'𐀡','𐀢'=>'𐀢','𐀣'=>'𐀣','𐀤'=>'𐀤','𐀥'=>'𐀥','𐀦'=>'𐀦','𐀨'=>'𐀨','𐀩'=>'𐀩','𐀪'=>'𐀪','𐀫'=>'𐀫','𐀬'=>'𐀬','𐀭'=>'𐀭','𐀮'=>'𐀮','𐀯'=>'𐀯','𐀰'=>'𐀰','𐀱'=>'𐀱','𐀲'=>'𐀲','𐀳'=>'𐀳','𐀴'=>'𐀴','𐀵'=>'𐀵','𐀶'=>'𐀶','𐀷'=>'𐀷','𐀸'=>'𐀸','𐀹'=>'𐀹','𐀺'=>'𐀺','𐀼'=>'𐀼','𐀽'=>'𐀽','𐀿'=>'𐀿','𐁀'=>'𐁀','𐁁'=>'𐁁','𐁂'=>'𐁂','𐁃'=>'𐁃','𐁄'=>'𐁄','𐁅'=>'𐁅','𐁆'=>'𐁆','𐁇'=>'𐁇','𐁈'=>'𐁈','𐁉'=>'𐁉','𐁊'=>'𐁊','𐁋'=>'𐁋','𐁌'=>'𐁌','𐁍'=>'𐁍','𐁐'=>'𐁐','𐁑'=>'𐁑','𐁒'=>'𐁒','𐁓'=>'𐁓','𐁔'=>'𐁔','𐁕'=>'𐁕','𐁖'=>'𐁖','𐁗'=>'𐁗','𐁘'=>'𐁘','𐁙'=>'𐁙','𐁚'=>'𐁚','𐁛'=>'𐁛','𐁜'=>'𐁜','𐁝'=>'𐁝','𐂀'=>'𐂀','𐂁'=>'𐂁','𐂂'=>'𐂂','𐂃'=>'𐂃','𐂄'=>'𐂄','𐂅'=>'𐂅','𐂆'=>'𐂆','𐂇'=>'𐂇','𐂈'=>'𐂈','𐂉'=>'𐂉','𐂊'=>'𐂊','𐂋'=>'𐂋','𐂌'=>'𐂌','𐂍'=>'𐂍','𐂎'=>'𐂎','𐂏'=>'𐂏','𐂐'=>'𐂐','𐂑'=>'𐂑','𐂒'=>'𐂒','𐂓'=>'𐂓','𐂔'=>'𐂔','𐂕'=>'𐂕','𐂖'=>'𐂖','𐂗'=>'𐂗','𐂘'=>'𐂘','𐂙'=>'𐂙','𐂚'=>'𐂚','𐂛'=>'𐂛','𐂜'=>'𐂜','𐂝'=>'𐂝','𐂞'=>'𐂞','𐂟'=>'𐂟','𐂠'=>'𐂠','𐂡'=>'𐂡','𐂢'=>'𐂢','𐂣'=>'𐂣','𐂤'=>'𐂤','𐂥'=>'𐂥','𐂦'=>'𐂦','𐂧'=>'𐂧','𐂨'=>'𐂨','𐂩'=>'𐂩','𐂪'=>'𐂪','𐂫'=>'𐂫','𐂬'=>'𐂬','𐂭'=>'𐂭','𐂮'=>'𐂮','𐂯'=>'𐂯','𐂰'=>'𐂰','𐂱'=>'𐂱','𐂲'=>'𐂲','𐂳'=>'𐂳','𐂴'=>'𐂴','𐂵'=>'𐂵','𐂶'=>'𐂶','𐂷'=>'𐂷','𐂸'=>'𐂸','𐂹'=>'𐂹','𐂺'=>'𐂺','𐂻'=>'𐂻','𐂼'=>'𐂼','𐂽'=>'𐂽','𐂾'=>'𐂾','𐂿'=>'𐂿','𐃀'=>'𐃀','𐃁'=>'𐃁','𐃂'=>'𐃂','𐃃'=>'𐃃','𐃄'=>'𐃄','𐃅'=>'𐃅','𐃆'=>'𐃆','𐃇'=>'𐃇','𐃈'=>'𐃈','𐃉'=>'𐃉','𐃊'=>'𐃊','𐃋'=>'𐃋','𐃌'=>'𐃌','𐃍'=>'𐃍','𐃎'=>'𐃎','𐃏'=>'𐃏','𐃐'=>'𐃐','𐃑'=>'𐃑','𐃒'=>'𐃒','𐃓'=>'𐃓','𐃔'=>'𐃔','𐃕'=>'𐃕','𐃖'=>'𐃖','𐃗'=>'𐃗','𐃘'=>'𐃘','𐃙'=>'𐃙','𐃚'=>'𐃚','𐃛'=>'𐃛','𐃜'=>'𐃜','𐃝'=>'𐃝','𐃞'=>'𐃞','𐃟'=>'𐃟','𐃠'=>'𐃠','𐃡'=>'𐃡','𐃢'=>'𐃢','𐃣'=>'𐃣','𐃤'=>'𐃤','𐃥'=>'𐃥','𐃦'=>'𐃦','𐃧'=>'𐃧','𐃨'=>'𐃨','𐃩'=>'𐃩','𐃪'=>'𐃪','𐃫'=>'𐃫','𐃬'=>'𐃬','𐃭'=>'𐃭','𐃮'=>'𐃮','𐃯'=>'𐃯','𐃰'=>'𐃰','𐃱'=>'𐃱','𐃲'=>'𐃲','𐃳'=>'𐃳','𐃴'=>'𐃴','𐃵'=>'𐃵','𐃶'=>'𐃶','𐃷'=>'𐃷','𐃸'=>'𐃸','𐃹'=>'𐃹','𐃺'=>'𐃺','𐄇'=>'1','𐄈'=>'2','𐄉'=>'3','𐄊'=>'4','𐄋'=>'5','𐄌'=>'6','𐄍'=>'7','𐄎'=>'8','𐄏'=>'9','𐄐'=>'10','𐄑'=>'20','𐄒'=>'30','𐄓'=>'40','𐄔'=>'50','𐄕'=>'60','𐄖'=>'70','𐄗'=>'80','𐄘'=>'90','𐄙'=>'100','𐄚'=>'200','𐄛'=>'300','𐄜'=>'400','𐄝'=>'500','𐄞'=>'600','𐄟'=>'700','𐄠'=>'800','𐄡'=>'900','𐄢'=>'1000','𐄣'=>'2000','𐄤'=>'3000','𐄥'=>'4000','𐄦'=>'5000','𐄧'=>'6000','𐄨'=>'7000','𐄩'=>'8000','𐄪'=>'9000','𐄫'=>'10000','𐄬'=>'20000','𐄭'=>'30000','𐄮'=>'40000','𐄯'=>'50000','𐄰'=>'60000','𐄱'=>'70000','𐄲'=>'80000','𐄳'=>'90000','𐅀'=>'1/4','𐅁'=>'1/2','𐅂'=>'1','𐅃'=>'5','𐅄'=>'50','𐅅'=>'500','𐅆'=>'5000','𐅇'=>'50000','𐅈'=>'5','𐅉'=>'10','𐅊'=>'50','𐅋'=>'100','𐅌'=>'500','𐅍'=>'1000','𐅎'=>'5000','𐅏'=>'5','𐅐'=>'10','𐅑'=>'50','𐅒'=>'100','𐅓'=>'500','𐅔'=>'1000','𐅕'=>'10000','𐅖'=>'50000','𐅗'=>'10','𐅘'=>'1','𐅙'=>'1','𐅚'=>'1','𐅛'=>'2','𐅜'=>'2','𐅝'=>'2','𐅞'=>'2','𐅟'=>'5','𐅠'=>'10','𐅡'=>'10','𐅢'=>'10','𐅣'=>'10','𐅤'=>'10','𐅥'=>'30','𐅦'=>'50','𐅧'=>'50','𐅨'=>'50','𐅩'=>'50','𐅪'=>'100','𐅫'=>'300','𐅬'=>'500','𐅭'=>'500','𐅮'=>'500','𐅯'=>'500','𐅰'=>'500','𐅱'=>'1000','𐅲'=>'5000','𐅳'=>'5','𐅴'=>'50','𐅵'=>'1/2','𐅶'=>'1/2','𐅷'=>'2/3','𐅸'=>'3/4','𐆊'=>'0','𐌀'=>'𐌀','𐌁'=>'𐌁','𐌂'=>'𐌂','𐌃'=>'𐌃','𐌄'=>'𐌄','𐌅'=>'𐌅','𐌆'=>'𐌆','𐌇'=>'𐌇','𐌈'=>'𐌈','𐌉'=>'𐌉','𐌊'=>'𐌊','𐌋'=>'𐌋','𐌌'=>'𐌌','𐌍'=>'𐌍','𐌎'=>'𐌎','𐌏'=>'𐌏','𐌐'=>'𐌐','𐌑'=>'𐌑','𐌒'=>'𐌒','𐌓'=>'𐌓','𐌔'=>'𐌔','𐌕'=>'𐌕','𐌖'=>'𐌖','𐌗'=>'𐌗','𐌘'=>'𐌘','𐌙'=>'𐌙','𐌚'=>'𐌚','𐌛'=>'𐌛','𐌜'=>'𐌜','𐌝'=>'𐌝','𐌞'=>'𐌞','𐌠'=>'1','𐌡'=>'5','𐌢'=>'10','𐌣'=>'50','𐌰'=>'𐌰','𐌱'=>'𐌱','𐌲'=>'𐌲','𐌳'=>'𐌳','𐌴'=>'𐌴','𐌵'=>'𐌵','𐌶'=>'𐌶','𐌷'=>'𐌷','𐌸'=>'𐌸','𐌹'=>'𐌹','𐌺'=>'𐌺','𐌻'=>'𐌻','𐌼'=>'𐌼','𐌽'=>'𐌽','𐌾'=>'𐌾','𐌿'=>'𐌿','𐍀'=>'𐍀','𐍁'=>'90','𐍂'=>'𐍂','𐍃'=>'𐍃','𐍄'=>'𐍄','𐍅'=>'𐍅','𐍆'=>'𐍆','𐍇'=>'𐍇','𐍈'=>'𐍈','𐍉'=>'𐍉','𐍊'=>'900','𐎀'=>'𐎀','𐎁'=>'𐎁','𐎂'=>'𐎂','𐎃'=>'𐎃','𐎄'=>'𐎄','𐎅'=>'𐎅','𐎆'=>'𐎆','𐎇'=>'𐎇','𐎈'=>'𐎈','𐎉'=>'𐎉','𐎊'=>'𐎊','𐎋'=>'𐎋','𐎌'=>'𐎌','𐎍'=>'𐎍','𐎎'=>'𐎎','𐎏'=>'𐎏','𐎐'=>'𐎐','𐎑'=>'𐎑','𐎒'=>'𐎒','𐎓'=>'𐎓','𐎔'=>'𐎔','𐎕'=>'𐎕','𐎖'=>'𐎖','𐎗'=>'𐎗','𐎘'=>'𐎘','𐎙'=>'𐎙','𐎚'=>'𐎚','𐎛'=>'𐎛','𐎜'=>'𐎜','𐎝'=>'𐎝','𐎠'=>'𐎠','𐎡'=>'𐎡','𐎢'=>'𐎢','𐎣'=>'𐎣','𐎤'=>'𐎤','𐎥'=>'𐎥','𐎦'=>'𐎦','𐎧'=>'𐎧','𐎨'=>'𐎨','𐎩'=>'𐎩','𐎪'=>'𐎪','𐎫'=>'𐎫','𐎬'=>'𐎬','𐎭'=>'𐎭','𐎮'=>'𐎮','𐎯'=>'𐎯','𐎰'=>'𐎰','𐎱'=>'𐎱','𐎲'=>'𐎲','𐎳'=>'𐎳','𐎴'=>'𐎴','𐎵'=>'𐎵','𐎶'=>'𐎶','𐎷'=>'𐎷','𐎸'=>'𐎸','𐎹'=>'𐎹','𐎺'=>'𐎺','𐎻'=>'𐎻','𐎼'=>'𐎼','𐎽'=>'𐎽','𐎾'=>'𐎾','𐎿'=>'𐎿','𐏀'=>'𐏀','𐏁'=>'𐏁','𐏂'=>'𐏂','𐏃'=>'𐏃','𐏈'=>'𐏈','𐏉'=>'𐏉','𐏊'=>'𐏊','𐏋'=>'𐏋','𐏌'=>'𐏌','𐏍'=>'𐏍','𐏎'=>'𐏎','𐏏'=>'𐏏','𐏑'=>'1','𐏒'=>'2','𐏓'=>'10','𐏔'=>'20','𐏕'=>'100','𐐀'=>'𐐨','𐐁'=>'𐐩','𐐂'=>'𐐪','𐐃'=>'𐐫','𐐄'=>'𐐬','𐐅'=>'𐐭','𐐆'=>'𐐮','𐐇'=>'𐐯','𐐈'=>'𐐰','𐐉'=>'𐐱','𐐊'=>'𐐲','𐐋'=>'𐐳','𐐌'=>'𐐴','𐐍'=>'𐐵','𐐎'=>'𐐶','𐐏'=>'𐐷','𐐐'=>'𐐸','𐐑'=>'𐐹','𐐒'=>'𐐺','𐐓'=>'𐐻','𐐔'=>'𐐼','𐐕'=>'𐐽','𐐖'=>'𐐾','𐐗'=>'𐐿','𐐘'=>'𐑀','𐐙'=>'𐑁','𐐚'=>'𐑂','𐐛'=>'𐑃','𐐜'=>'𐑄','𐐝'=>'𐑅','𐐞'=>'𐑆','𐐟'=>'𐑇','𐐠'=>'𐑈','𐐡'=>'𐑉','𐐢'=>'𐑊','𐐣'=>'𐑋','𐐤'=>'𐑌','𐐥'=>'𐑍','𐐦'=>'𐑎','𐐧'=>'𐑏','𐐨'=>'𐐨','𐐩'=>'𐐩','𐐪'=>'𐐪','𐐫'=>'𐐫','𐐬'=>'𐐬','𐐭'=>'𐐭','𐐮'=>'𐐮','𐐯'=>'𐐯','𐐰'=>'𐐰','𐐱'=>'𐐱','𐐲'=>'𐐲','𐐳'=>'𐐳','𐐴'=>'𐐴','𐐵'=>'𐐵','𐐶'=>'𐐶','𐐷'=>'𐐷','𐐸'=>'𐐸','𐐹'=>'𐐹','𐐺'=>'𐐺','𐐻'=>'𐐻','𐐼'=>'𐐼','𐐽'=>'𐐽','𐐾'=>'𐐾','𐐿'=>'𐐿','𐑀'=>'𐑀','𐑁'=>'𐑁','𐑂'=>'𐑂','𐑃'=>'𐑃','𐑄'=>'𐑄','𐑅'=>'𐑅','𐑆'=>'𐑆','𐑇'=>'𐑇','𐑈'=>'𐑈','𐑉'=>'𐑉','𐑊'=>'𐑊','𐑋'=>'𐑋','𐑌'=>'𐑌','𐑍'=>'𐑍','𐑎'=>'𐑎','𐑏'=>'𐑏','𐑐'=>'𐑐','𐑑'=>'𐑑','𐑒'=>'𐑒','𐑓'=>'𐑓','𐑔'=>'𐑔','𐑕'=>'𐑕','𐑖'=>'𐑖','𐑗'=>'𐑗','𐑘'=>'𐑘','𐑙'=>'𐑙','𐑚'=>'𐑚','𐑛'=>'𐑛','𐑜'=>'𐑜','𐑝'=>'𐑝','𐑞'=>'𐑞','𐑟'=>'𐑟','𐑠'=>'𐑠','𐑡'=>'𐑡','𐑢'=>'𐑢','𐑣'=>'𐑣','𐑤'=>'𐑤','𐑥'=>'𐑥','𐑦'=>'𐑦','𐑧'=>'𐑧','𐑨'=>'𐑨','𐑩'=>'𐑩','𐑪'=>'𐑪','𐑫'=>'𐑫','𐑬'=>'𐑬','𐑭'=>'𐑭','𐑮'=>'𐑮','𐑯'=>'𐑯','𐑰'=>'𐑰','𐑱'=>'𐑱','𐑲'=>'𐑲','𐑳'=>'𐑳','𐑴'=>'𐑴','𐑵'=>'𐑵','𐑶'=>'𐑶','𐑷'=>'𐑷','𐑸'=>'𐑸','𐑹'=>'𐑹','𐑺'=>'𐑺','𐑻'=>'𐑻','𐑼'=>'𐑼','𐑽'=>'𐑽','𐑾'=>'𐑾','𐑿'=>'𐑿','𐒀'=>'𐒀','𐒁'=>'𐒁','𐒂'=>'𐒂','𐒃'=>'𐒃','𐒄'=>'𐒄','𐒅'=>'𐒅','𐒆'=>'𐒆','𐒇'=>'𐒇','𐒈'=>'𐒈','𐒉'=>'𐒉','𐒊'=>'𐒊','𐒋'=>'𐒋','𐒌'=>'𐒌','𐒍'=>'𐒍','𐒎'=>'𐒎','𐒏'=>'𐒏','𐒐'=>'𐒐','𐒑'=>'𐒑','𐒒'=>'𐒒','𐒓'=>'𐒓','𐒔'=>'𐒔','𐒕'=>'𐒕','𐒖'=>'𐒖','𐒗'=>'𐒗','𐒘'=>'𐒘','𐒙'=>'𐒙','𐒚'=>'𐒚','𐒛'=>'𐒛','𐒜'=>'𐒜','𐒝'=>'𐒝','𐒠'=>'0','𐒡'=>'1','𐒢'=>'2','𐒣'=>'3','𐒤'=>'4','𐒥'=>'5','𐒦'=>'6','𐒧'=>'7','𐒨'=>'8','𐒩'=>'9'); \ No newline at end of file
+<?php return array('𐀀'=>'𐀀','𐀁'=>'𐀁','𐀂'=>'𐀂','𐀃'=>'𐀃','𐀄'=>'𐀄','𐀅'=>'𐀅','𐀆'=>'𐀆','𐀇'=>'𐀇','𐀈'=>'𐀈','𐀉'=>'𐀉','𐀊'=>'𐀊','𐀋'=>'𐀋','𐀍'=>'𐀍','𐀎'=>'𐀎','𐀏'=>'𐀏','𐀐'=>'𐀐','𐀑'=>'𐀑','𐀒'=>'𐀒','𐀓'=>'𐀓','𐀔'=>'𐀔','𐀕'=>'𐀕','𐀖'=>'𐀖','𐀗'=>'𐀗','𐀘'=>'𐀘','𐀙'=>'𐀙','𐀚'=>'𐀚','𐀛'=>'𐀛','𐀜'=>'𐀜','𐀝'=>'𐀝','𐀞'=>'𐀞','𐀟'=>'𐀟','𐀠'=>'𐀠','𐀡'=>'𐀡','𐀢'=>'𐀢','𐀣'=>'𐀣','𐀤'=>'𐀤','𐀥'=>'𐀥','𐀦'=>'𐀦','𐀨'=>'𐀨','𐀩'=>'𐀩','𐀪'=>'𐀪','𐀫'=>'𐀫','𐀬'=>'𐀬','𐀭'=>'𐀭','𐀮'=>'𐀮','𐀯'=>'𐀯','𐀰'=>'𐀰','𐀱'=>'𐀱','𐀲'=>'𐀲','𐀳'=>'𐀳','𐀴'=>'𐀴','𐀵'=>'𐀵','𐀶'=>'𐀶','𐀷'=>'𐀷','𐀸'=>'𐀸','𐀹'=>'𐀹','𐀺'=>'𐀺','𐀼'=>'𐀼','𐀽'=>'𐀽','𐀿'=>'𐀿','𐁀'=>'𐁀','𐁁'=>'𐁁','𐁂'=>'𐁂','𐁃'=>'𐁃','𐁄'=>'𐁄','𐁅'=>'𐁅','𐁆'=>'𐁆','𐁇'=>'𐁇','𐁈'=>'𐁈','𐁉'=>'𐁉','𐁊'=>'𐁊','𐁋'=>'𐁋','𐁌'=>'𐁌','𐁍'=>'𐁍','𐁐'=>'𐁐','𐁑'=>'𐁑','𐁒'=>'𐁒','𐁓'=>'𐁓','𐁔'=>'𐁔','𐁕'=>'𐁕','𐁖'=>'𐁖','𐁗'=>'𐁗','𐁘'=>'𐁘','𐁙'=>'𐁙','𐁚'=>'𐁚','𐁛'=>'𐁛','𐁜'=>'𐁜','𐁝'=>'𐁝','𐂀'=>'𐂀','𐂁'=>'𐂁','𐂂'=>'𐂂','𐂃'=>'𐂃','𐂄'=>'𐂄','𐂅'=>'𐂅','𐂆'=>'𐂆','𐂇'=>'𐂇','𐂈'=>'𐂈','𐂉'=>'𐂉','𐂊'=>'𐂊','𐂋'=>'𐂋','𐂌'=>'𐂌','𐂍'=>'𐂍','𐂎'=>'𐂎','𐂏'=>'𐂏','𐂐'=>'𐂐','𐂑'=>'𐂑','𐂒'=>'𐂒','𐂓'=>'𐂓','𐂔'=>'𐂔','𐂕'=>'𐂕','𐂖'=>'𐂖','𐂗'=>'𐂗','𐂘'=>'𐂘','𐂙'=>'𐂙','𐂚'=>'𐂚','𐂛'=>'𐂛','𐂜'=>'𐂜','𐂝'=>'𐂝','𐂞'=>'𐂞','𐂟'=>'𐂟','𐂠'=>'𐂠','𐂡'=>'𐂡','𐂢'=>'𐂢','𐂣'=>'𐂣','𐂤'=>'𐂤','𐂥'=>'𐂥','𐂦'=>'𐂦','𐂧'=>'𐂧','𐂨'=>'𐂨','𐂩'=>'𐂩','𐂪'=>'𐂪','𐂫'=>'𐂫','𐂬'=>'𐂬','𐂭'=>'𐂭','𐂮'=>'𐂮','𐂯'=>'𐂯','𐂰'=>'𐂰','𐂱'=>'𐂱','𐂲'=>'𐂲','𐂳'=>'𐂳','𐂴'=>'𐂴','𐂵'=>'𐂵','𐂶'=>'𐂶','𐂷'=>'𐂷','𐂸'=>'𐂸','𐂹'=>'𐂹','𐂺'=>'𐂺','𐂻'=>'𐂻','𐂼'=>'𐂼','𐂽'=>'𐂽','𐂾'=>'𐂾','𐂿'=>'𐂿','𐃀'=>'𐃀','𐃁'=>'𐃁','𐃂'=>'𐃂','𐃃'=>'𐃃','𐃄'=>'𐃄','𐃅'=>'𐃅','𐃆'=>'𐃆','𐃇'=>'𐃇','𐃈'=>'𐃈','𐃉'=>'𐃉','𐃊'=>'𐃊','𐃋'=>'𐃋','𐃌'=>'𐃌','𐃍'=>'𐃍','𐃎'=>'𐃎','𐃏'=>'𐃏','𐃐'=>'𐃐','𐃑'=>'𐃑','𐃒'=>'𐃒','𐃓'=>'𐃓','𐃔'=>'𐃔','𐃕'=>'𐃕','𐃖'=>'𐃖','𐃗'=>'𐃗','𐃘'=>'𐃘','𐃙'=>'𐃙','𐃚'=>'𐃚','𐃛'=>'𐃛','𐃜'=>'𐃜','𐃝'=>'𐃝','𐃞'=>'𐃞','𐃟'=>'𐃟','𐃠'=>'𐃠','𐃡'=>'𐃡','𐃢'=>'𐃢','𐃣'=>'𐃣','𐃤'=>'𐃤','𐃥'=>'𐃥','𐃦'=>'𐃦','𐃧'=>'𐃧','𐃨'=>'𐃨','𐃩'=>'𐃩','𐃪'=>'𐃪','𐃫'=>'𐃫','𐃬'=>'𐃬','𐃭'=>'𐃭','𐃮'=>'𐃮','𐃯'=>'𐃯','𐃰'=>'𐃰','𐃱'=>'𐃱','𐃲'=>'𐃲','𐃳'=>'𐃳','𐃴'=>'𐃴','𐃵'=>'𐃵','𐃶'=>'𐃶','𐃷'=>'𐃷','𐃸'=>'𐃸','𐃹'=>'𐃹','𐃺'=>'𐃺','𐄇'=>'1','𐄈'=>'2','𐄉'=>'3','𐄊'=>'4','𐄋'=>'5','𐄌'=>'6','𐄍'=>'7','𐄎'=>'8','𐄏'=>'9','𐄐'=>'10','𐄑'=>'20','𐄒'=>'30','𐄓'=>'40','𐄔'=>'50','𐄕'=>'60','𐄖'=>'70','𐄗'=>'80','𐄘'=>'90','𐄙'=>'100','𐄚'=>'200','𐄛'=>'300','𐄜'=>'400','𐄝'=>'500','𐄞'=>'600','𐄟'=>'700','𐄠'=>'800','𐄡'=>'900','𐄢'=>'1000','𐄣'=>'2000','𐄤'=>'3000','𐄥'=>'4000','𐄦'=>'5000','𐄧'=>'6000','𐄨'=>'7000','𐄩'=>'8000','𐄪'=>'9000','𐄫'=>'10000','𐄬'=>'20000','𐄭'=>'30000','𐄮'=>'40000','𐄯'=>'50000','𐄰'=>'60000','𐄱'=>'70000','𐄲'=>'80000','𐄳'=>'90000','𐅀'=>'1/4','𐅁'=>'1/2','𐅂'=>'1','𐅃'=>'5','𐅄'=>'50','𐅅'=>'500','𐅆'=>'5000','𐅇'=>'50000','𐅈'=>'5','𐅉'=>'10','𐅊'=>'50','𐅋'=>'100','𐅌'=>'500','𐅍'=>'1000','𐅎'=>'5000','𐅏'=>'5','𐅐'=>'10','𐅑'=>'50','𐅒'=>'100','𐅓'=>'500','𐅔'=>'1000','𐅕'=>'10000','𐅖'=>'50000','𐅗'=>'10','𐅘'=>'1','𐅙'=>'1','𐅚'=>'1','𐅛'=>'2','𐅜'=>'2','𐅝'=>'2','𐅞'=>'2','𐅟'=>'5','𐅠'=>'10','𐅡'=>'10','𐅢'=>'10','𐅣'=>'10','𐅤'=>'10','𐅥'=>'30','𐅦'=>'50','𐅧'=>'50','𐅨'=>'50','𐅩'=>'50','𐅪'=>'100','𐅫'=>'300','𐅬'=>'500','𐅭'=>'500','𐅮'=>'500','𐅯'=>'500','𐅰'=>'500','𐅱'=>'1000','𐅲'=>'5000','𐅳'=>'5','𐅴'=>'50','𐅵'=>'1/2','𐅶'=>'1/2','𐅷'=>'2/3','𐅸'=>'3/4','𐆊'=>'0','𐌀'=>'𐌀','𐌁'=>'𐌁','𐌂'=>'𐌂','𐌃'=>'𐌃','𐌄'=>'𐌄','𐌅'=>'𐌅','𐌆'=>'𐌆','𐌇'=>'𐌇','𐌈'=>'𐌈','𐌉'=>'𐌉','𐌊'=>'𐌊','𐌋'=>'𐌋','𐌌'=>'𐌌','𐌍'=>'𐌍','𐌎'=>'𐌎','𐌏'=>'𐌏','𐌐'=>'𐌐','𐌑'=>'𐌑','𐌒'=>'𐌒','𐌓'=>'𐌓','𐌔'=>'𐌔','𐌕'=>'𐌕','𐌖'=>'𐌖','𐌗'=>'𐌗','𐌘'=>'𐌘','𐌙'=>'𐌙','𐌚'=>'𐌚','𐌛'=>'𐌛','𐌜'=>'𐌜','𐌝'=>'𐌝','𐌞'=>'𐌞','𐌠'=>'1','𐌡'=>'5','𐌢'=>'10','𐌣'=>'50','𐌰'=>'𐌰','𐌱'=>'𐌱','𐌲'=>'𐌲','𐌳'=>'𐌳','𐌴'=>'𐌴','𐌵'=>'𐌵','𐌶'=>'𐌶','𐌷'=>'𐌷','𐌸'=>'𐌸','𐌹'=>'𐌹','𐌺'=>'𐌺','𐌻'=>'𐌻','𐌼'=>'𐌼','𐌽'=>'𐌽','𐌾'=>'𐌾','𐌿'=>'𐌿','𐍀'=>'𐍀','𐍁'=>'90','𐍂'=>'𐍂','𐍃'=>'𐍃','𐍄'=>'𐍄','𐍅'=>'𐍅','𐍆'=>'𐍆','𐍇'=>'𐍇','𐍈'=>'𐍈','𐍉'=>'𐍉','𐍊'=>'900','𐎀'=>'𐎀','𐎁'=>'𐎁','𐎂'=>'𐎂','𐎃'=>'𐎃','𐎄'=>'𐎄','𐎅'=>'𐎅','𐎆'=>'𐎆','𐎇'=>'𐎇','𐎈'=>'𐎈','𐎉'=>'𐎉','𐎊'=>'𐎊','𐎋'=>'𐎋','𐎌'=>'𐎌','𐎍'=>'𐎍','𐎎'=>'𐎎','𐎏'=>'𐎏','𐎐'=>'𐎐','𐎑'=>'𐎑','𐎒'=>'𐎒','𐎓'=>'𐎓','𐎔'=>'𐎔','𐎕'=>'𐎕','𐎖'=>'𐎖','𐎗'=>'𐎗','𐎘'=>'𐎘','𐎙'=>'𐎙','𐎚'=>'𐎚','𐎛'=>'𐎛','𐎜'=>'𐎜','𐎝'=>'𐎝','𐎠'=>'𐎠','𐎡'=>'𐎡','𐎢'=>'𐎢','𐎣'=>'𐎣','𐎤'=>'𐎤','𐎥'=>'𐎥','𐎦'=>'𐎦','𐎧'=>'𐎧','𐎨'=>'𐎨','𐎩'=>'𐎩','𐎪'=>'𐎪','𐎫'=>'𐎫','𐎬'=>'𐎬','𐎭'=>'𐎭','𐎮'=>'𐎮','𐎯'=>'𐎯','𐎰'=>'𐎰','𐎱'=>'𐎱','𐎲'=>'𐎲','𐎳'=>'𐎳','𐎴'=>'𐎴','𐎵'=>'𐎵','𐎶'=>'𐎶','𐎷'=>'𐎷','𐎸'=>'𐎸','𐎹'=>'𐎹','𐎺'=>'𐎺','𐎻'=>'𐎻','𐎼'=>'𐎼','𐎽'=>'𐎽','𐎾'=>'𐎾','𐎿'=>'𐎿','𐏀'=>'𐏀','𐏁'=>'𐏁','𐏂'=>'𐏂','𐏃'=>'𐏃','𐏈'=>'𐏈','𐏉'=>'𐏉','𐏊'=>'𐏊','𐏋'=>'𐏋','𐏌'=>'𐏌','𐏍'=>'𐏍','𐏎'=>'𐏎','𐏏'=>'𐏏','𐏑'=>'1','𐏒'=>'2','𐏓'=>'10','𐏔'=>'20','𐏕'=>'100','𐐀'=>'𐐨','𐐁'=>'𐐩','𐐂'=>'𐐪','𐐃'=>'𐐫','𐐄'=>'𐐬','𐐅'=>'𐐭','𐐆'=>'𐐮','𐐇'=>'𐐯','𐐈'=>'𐐰','𐐉'=>'𐐱','𐐊'=>'𐐲','𐐋'=>'𐐳','𐐌'=>'𐐴','𐐍'=>'𐐵','𐐎'=>'𐐶','𐐏'=>'𐐷','𐐐'=>'𐐸','𐐑'=>'𐐹','𐐒'=>'𐐺','𐐓'=>'𐐻','𐐔'=>'𐐼','𐐕'=>'𐐽','𐐖'=>'𐐾','𐐗'=>'𐐿','𐐘'=>'𐑀','𐐙'=>'𐑁','𐐚'=>'𐑂','𐐛'=>'𐑃','𐐜'=>'𐑄','𐐝'=>'𐑅','𐐞'=>'𐑆','𐐟'=>'𐑇','𐐠'=>'𐑈','𐐡'=>'𐑉','𐐢'=>'𐑊','𐐣'=>'𐑋','𐐤'=>'𐑌','𐐥'=>'𐑍','𐐦'=>'𐑎','𐐧'=>'𐑏','𐐨'=>'𐐨','𐐩'=>'𐐩','𐐪'=>'𐐪','𐐫'=>'𐐫','𐐬'=>'𐐬','𐐭'=>'𐐭','𐐮'=>'𐐮','𐐯'=>'𐐯','𐐰'=>'𐐰','𐐱'=>'𐐱','𐐲'=>'𐐲','𐐳'=>'𐐳','𐐴'=>'𐐴','𐐵'=>'𐐵','𐐶'=>'𐐶','𐐷'=>'𐐷','𐐸'=>'𐐸','𐐹'=>'𐐹','𐐺'=>'𐐺','𐐻'=>'𐐻','𐐼'=>'𐐼','𐐽'=>'𐐽','𐐾'=>'𐐾','𐐿'=>'𐐿','𐑀'=>'𐑀','𐑁'=>'𐑁','𐑂'=>'𐑂','𐑃'=>'𐑃','𐑄'=>'𐑄','𐑅'=>'𐑅','𐑆'=>'𐑆','𐑇'=>'𐑇','𐑈'=>'𐑈','𐑉'=>'𐑉','𐑊'=>'𐑊','𐑋'=>'𐑋','𐑌'=>'𐑌','𐑍'=>'𐑍','𐑎'=>'𐑎','𐑏'=>'𐑏','𐑐'=>'𐑐','𐑑'=>'𐑑','𐑒'=>'𐑒','𐑓'=>'𐑓','𐑔'=>'𐑔','𐑕'=>'𐑕','𐑖'=>'𐑖','𐑗'=>'𐑗','𐑘'=>'𐑘','𐑙'=>'𐑙','𐑚'=>'𐑚','𐑛'=>'𐑛','𐑜'=>'𐑜','𐑝'=>'𐑝','𐑞'=>'𐑞','𐑟'=>'𐑟','𐑠'=>'𐑠','𐑡'=>'𐑡','𐑢'=>'𐑢','𐑣'=>'𐑣','𐑤'=>'𐑤','𐑥'=>'𐑥','𐑦'=>'𐑦','𐑧'=>'𐑧','𐑨'=>'𐑨','𐑩'=>'𐑩','𐑪'=>'𐑪','𐑫'=>'𐑫','𐑬'=>'𐑬','𐑭'=>'𐑭','𐑮'=>'𐑮','𐑯'=>'𐑯','𐑰'=>'𐑰','𐑱'=>'𐑱','𐑲'=>'𐑲','𐑳'=>'𐑳','𐑴'=>'𐑴','𐑵'=>'𐑵','𐑶'=>'𐑶','𐑷'=>'𐑷','𐑸'=>'𐑸','𐑹'=>'𐑹','𐑺'=>'𐑺','𐑻'=>'𐑻','𐑼'=>'𐑼','𐑽'=>'𐑽','𐑾'=>'𐑾','𐑿'=>'𐑿','𐒀'=>'𐒀','𐒁'=>'𐒁','𐒂'=>'𐒂','𐒃'=>'𐒃','𐒄'=>'𐒄','𐒅'=>'𐒅','𐒆'=>'𐒆','𐒇'=>'𐒇','𐒈'=>'𐒈','𐒉'=>'𐒉','𐒊'=>'𐒊','𐒋'=>'𐒋','𐒌'=>'𐒌','𐒍'=>'𐒍','𐒎'=>'𐒎','𐒏'=>'𐒏','𐒐'=>'𐒐','𐒑'=>'𐒑','𐒒'=>'𐒒','𐒓'=>'𐒓','𐒔'=>'𐒔','𐒕'=>'𐒕','𐒖'=>'𐒖','𐒗'=>'𐒗','𐒘'=>'𐒘','𐒙'=>'𐒙','𐒚'=>'𐒚','𐒛'=>'𐒛','𐒜'=>'𐒜','𐒝'=>'𐒝','𐒠'=>'0','𐒡'=>'1','𐒢'=>'2','𐒣'=>'3','𐒤'=>'4','𐒥'=>'5','𐒦'=>'6','𐒧'=>'7','𐒨'=>'8','𐒩'=>'9');
diff --git a/phpBB/includes/utf/data/search_indexer_33.php b/phpBB/includes/utf/data/search_indexer_33.php
index 4e8762a646..3b77ca26f7 100644
--- a/phpBB/includes/utf/data/search_indexer_33.php
+++ b/phpBB/includes/utf/data/search_indexer_33.php
@@ -1 +1 @@
-<?php return array('𐠀'=>'𐠀','𐠁'=>'𐠁','𐠂'=>'𐠂','𐠃'=>'𐠃','𐠄'=>'𐠄','𐠅'=>'𐠅','𐠈'=>'𐠈','𐠊'=>'𐠊','𐠋'=>'𐠋','𐠌'=>'𐠌','𐠍'=>'𐠍','𐠎'=>'𐠎','𐠏'=>'𐠏','𐠐'=>'𐠐','𐠑'=>'𐠑','𐠒'=>'𐠒','𐠓'=>'𐠓','𐠔'=>'𐠔','𐠕'=>'𐠕','𐠖'=>'𐠖','𐠗'=>'𐠗','𐠘'=>'𐠘','𐠙'=>'𐠙','𐠚'=>'𐠚','𐠛'=>'𐠛','𐠜'=>'𐠜','𐠝'=>'𐠝','𐠞'=>'𐠞','𐠟'=>'𐠟','𐠠'=>'𐠠','𐠡'=>'𐠡','𐠢'=>'𐠢','𐠣'=>'𐠣','𐠤'=>'𐠤','𐠥'=>'𐠥','𐠦'=>'𐠦','𐠧'=>'𐠧','𐠨'=>'𐠨','𐠩'=>'𐠩','𐠪'=>'𐠪','𐠫'=>'𐠫','𐠬'=>'𐠬','𐠭'=>'𐠭','𐠮'=>'𐠮','𐠯'=>'𐠯','𐠰'=>'𐠰','𐠱'=>'𐠱','𐠲'=>'𐠲','𐠳'=>'𐠳','𐠴'=>'𐠴','𐠵'=>'𐠵','𐠷'=>'𐠷','𐠸'=>'𐠸','𐠼'=>'𐠼','𐠿'=>'𐠿','𐤀'=>'𐤀','𐤁'=>'𐤁','𐤂'=>'𐤂','𐤃'=>'𐤃','𐤄'=>'𐤄','𐤅'=>'𐤅','𐤆'=>'𐤆','𐤇'=>'𐤇','𐤈'=>'𐤈','𐤉'=>'𐤉','𐤊'=>'𐤊','𐤋'=>'𐤋','𐤌'=>'𐤌','𐤍'=>'𐤍','𐤎'=>'𐤎','𐤏'=>'𐤏','𐤐'=>'𐤐','𐤑'=>'𐤑','𐤒'=>'𐤒','𐤓'=>'𐤓','𐤔'=>'𐤔','𐤕'=>'𐤕','𐤖'=>'1','𐤗'=>'10','𐤘'=>'20','𐤙'=>'100','𐨀'=>'𐨀','𐨁'=>'𐨁','𐨂'=>'𐨂','𐨃'=>'𐨃','𐨅'=>'𐨅','𐨆'=>'𐨆','𐨌'=>'𐨌','𐨍'=>'𐨍','𐨎'=>'𐨎','𐨏'=>'𐨏','𐨐'=>'𐨐','𐨑'=>'𐨑','𐨒'=>'𐨒','𐨓'=>'𐨓','𐨕'=>'𐨕','𐨖'=>'𐨖','𐨗'=>'𐨗','𐨙'=>'𐨙','𐨚'=>'𐨚','𐨛'=>'𐨛','𐨜'=>'𐨜','𐨝'=>'𐨝','𐨞'=>'𐨞','𐨟'=>'𐨟','𐨠'=>'𐨠','𐨡'=>'𐨡','𐨢'=>'𐨢','𐨣'=>'𐨣','𐨤'=>'𐨤','𐨥'=>'𐨥','𐨦'=>'𐨦','𐨧'=>'𐨧','𐨨'=>'𐨨','𐨩'=>'𐨩','𐨪'=>'𐨪','𐨫'=>'𐨫','𐨬'=>'𐨬','𐨭'=>'𐨭','𐨮'=>'𐨮','𐨯'=>'𐨯','𐨰'=>'𐨰','𐨱'=>'𐨱','𐨲'=>'𐨲','𐨳'=>'𐨳','𐨸'=>'𐨸','𐨹'=>'𐨹','𐨺'=>'𐨺','𐨿'=>'𐨿','𐩀'=>'1','𐩁'=>'2','𐩂'=>'3','𐩃'=>'4','𐩄'=>'10','𐩅'=>'20','𐩆'=>'100','𐩇'=>'1000'); \ No newline at end of file
+<?php return array('𐠀'=>'𐠀','𐠁'=>'𐠁','𐠂'=>'𐠂','𐠃'=>'𐠃','𐠄'=>'𐠄','𐠅'=>'𐠅','𐠈'=>'𐠈','𐠊'=>'𐠊','𐠋'=>'𐠋','𐠌'=>'𐠌','𐠍'=>'𐠍','𐠎'=>'𐠎','𐠏'=>'𐠏','𐠐'=>'𐠐','𐠑'=>'𐠑','𐠒'=>'𐠒','𐠓'=>'𐠓','𐠔'=>'𐠔','𐠕'=>'𐠕','𐠖'=>'𐠖','𐠗'=>'𐠗','𐠘'=>'𐠘','𐠙'=>'𐠙','𐠚'=>'𐠚','𐠛'=>'𐠛','𐠜'=>'𐠜','𐠝'=>'𐠝','𐠞'=>'𐠞','𐠟'=>'𐠟','𐠠'=>'𐠠','𐠡'=>'𐠡','𐠢'=>'𐠢','𐠣'=>'𐠣','𐠤'=>'𐠤','𐠥'=>'𐠥','𐠦'=>'𐠦','𐠧'=>'𐠧','𐠨'=>'𐠨','𐠩'=>'𐠩','𐠪'=>'𐠪','𐠫'=>'𐠫','𐠬'=>'𐠬','𐠭'=>'𐠭','𐠮'=>'𐠮','𐠯'=>'𐠯','𐠰'=>'𐠰','𐠱'=>'𐠱','𐠲'=>'𐠲','𐠳'=>'𐠳','𐠴'=>'𐠴','𐠵'=>'𐠵','𐠷'=>'𐠷','𐠸'=>'𐠸','𐠼'=>'𐠼','𐠿'=>'𐠿','𐤀'=>'𐤀','𐤁'=>'𐤁','𐤂'=>'𐤂','𐤃'=>'𐤃','𐤄'=>'𐤄','𐤅'=>'𐤅','𐤆'=>'𐤆','𐤇'=>'𐤇','𐤈'=>'𐤈','𐤉'=>'𐤉','𐤊'=>'𐤊','𐤋'=>'𐤋','𐤌'=>'𐤌','𐤍'=>'𐤍','𐤎'=>'𐤎','𐤏'=>'𐤏','𐤐'=>'𐤐','𐤑'=>'𐤑','𐤒'=>'𐤒','𐤓'=>'𐤓','𐤔'=>'𐤔','𐤕'=>'𐤕','𐤖'=>'1','𐤗'=>'10','𐤘'=>'20','𐤙'=>'100','𐨀'=>'𐨀','𐨁'=>'𐨁','𐨂'=>'𐨂','𐨃'=>'𐨃','𐨅'=>'𐨅','𐨆'=>'𐨆','𐨌'=>'𐨌','𐨍'=>'𐨍','𐨎'=>'𐨎','𐨏'=>'𐨏','𐨐'=>'𐨐','𐨑'=>'𐨑','𐨒'=>'𐨒','𐨓'=>'𐨓','𐨕'=>'𐨕','𐨖'=>'𐨖','𐨗'=>'𐨗','𐨙'=>'𐨙','𐨚'=>'𐨚','𐨛'=>'𐨛','𐨜'=>'𐨜','𐨝'=>'𐨝','𐨞'=>'𐨞','𐨟'=>'𐨟','𐨠'=>'𐨠','𐨡'=>'𐨡','𐨢'=>'𐨢','𐨣'=>'𐨣','𐨤'=>'𐨤','𐨥'=>'𐨥','𐨦'=>'𐨦','𐨧'=>'𐨧','𐨨'=>'𐨨','𐨩'=>'𐨩','𐨪'=>'𐨪','𐨫'=>'𐨫','𐨬'=>'𐨬','𐨭'=>'𐨭','𐨮'=>'𐨮','𐨯'=>'𐨯','𐨰'=>'𐨰','𐨱'=>'𐨱','𐨲'=>'𐨲','𐨳'=>'𐨳','𐨸'=>'𐨸','𐨹'=>'𐨹','𐨺'=>'𐨺','𐨿'=>'𐨿','𐩀'=>'1','𐩁'=>'2','𐩂'=>'3','𐩃'=>'4','𐩄'=>'10','𐩅'=>'20','𐩆'=>'100','𐩇'=>'1000');
diff --git a/phpBB/includes/utf/data/search_indexer_36.php b/phpBB/includes/utf/data/search_indexer_36.php
index 8bf908e514..a970fa295b 100644
--- a/phpBB/includes/utf/data/search_indexer_36.php
+++ b/phpBB/includes/utf/data/search_indexer_36.php
@@ -1 +1 @@
-<?php return array('𒀀'=>'𒀀','𒀁'=>'𒀁','𒀂'=>'𒀂','𒀃'=>'𒀃','𒀄'=>'𒀄','𒀅'=>'𒀅','𒀆'=>'𒀆','𒀇'=>'𒀇','𒀈'=>'𒀈','𒀉'=>'𒀉','𒀊'=>'𒀊','𒀋'=>'𒀋','𒀌'=>'𒀌','𒀍'=>'𒀍','𒀎'=>'𒀎','𒀏'=>'𒀏','𒀐'=>'𒀐','𒀑'=>'𒀑','𒀒'=>'𒀒','𒀓'=>'𒀓','𒀔'=>'𒀔','𒀕'=>'𒀕','𒀖'=>'𒀖','𒀗'=>'𒀗','𒀘'=>'𒀘','𒀙'=>'𒀙','𒀚'=>'𒀚','𒀛'=>'𒀛','𒀜'=>'𒀜','𒀝'=>'𒀝','𒀞'=>'𒀞','𒀟'=>'𒀟','𒀠'=>'𒀠','𒀡'=>'𒀡','𒀢'=>'𒀢','𒀣'=>'𒀣','𒀤'=>'𒀤','𒀥'=>'𒀥','𒀦'=>'𒀦','𒀧'=>'𒀧','𒀨'=>'𒀨','𒀩'=>'𒀩','𒀪'=>'𒀪','𒀫'=>'𒀫','𒀬'=>'𒀬','𒀭'=>'𒀭','𒀮'=>'𒀮','𒀯'=>'𒀯','𒀰'=>'𒀰','𒀱'=>'𒀱','𒀲'=>'𒀲','𒀳'=>'𒀳','𒀴'=>'𒀴','𒀵'=>'𒀵','𒀶'=>'𒀶','𒀷'=>'𒀷','𒀸'=>'𒀸','𒀹'=>'𒀹','𒀺'=>'𒀺','𒀻'=>'𒀻','𒀼'=>'𒀼','𒀽'=>'𒀽','𒀾'=>'𒀾','𒀿'=>'𒀿','𒁀'=>'𒁀','𒁁'=>'𒁁','𒁂'=>'𒁂','𒁃'=>'𒁃','𒁄'=>'𒁄','𒁅'=>'𒁅','𒁆'=>'𒁆','𒁇'=>'𒁇','𒁈'=>'𒁈','𒁉'=>'𒁉','𒁊'=>'𒁊','𒁋'=>'𒁋','𒁌'=>'𒁌','𒁍'=>'𒁍','𒁎'=>'𒁎','𒁏'=>'𒁏','𒁐'=>'𒁐','𒁑'=>'𒁑','𒁒'=>'𒁒','𒁓'=>'𒁓','𒁔'=>'𒁔','𒁕'=>'𒁕','𒁖'=>'𒁖','𒁗'=>'𒁗','𒁘'=>'𒁘','𒁙'=>'𒁙','𒁚'=>'𒁚','𒁛'=>'𒁛','𒁜'=>'𒁜','𒁝'=>'𒁝','𒁞'=>'𒁞','𒁟'=>'𒁟','𒁠'=>'𒁠','𒁡'=>'𒁡','𒁢'=>'𒁢','𒁣'=>'𒁣','𒁤'=>'𒁤','𒁥'=>'𒁥','𒁦'=>'𒁦','𒁧'=>'𒁧','𒁨'=>'𒁨','𒁩'=>'𒁩','𒁪'=>'𒁪','𒁫'=>'𒁫','𒁬'=>'𒁬','𒁭'=>'𒁭','𒁮'=>'𒁮','𒁯'=>'𒁯','𒁰'=>'𒁰','𒁱'=>'𒁱','𒁲'=>'𒁲','𒁳'=>'𒁳','𒁴'=>'𒁴','𒁵'=>'𒁵','𒁶'=>'𒁶','𒁷'=>'𒁷','𒁸'=>'𒁸','𒁹'=>'𒁹','𒁺'=>'𒁺','𒁻'=>'𒁻','𒁼'=>'𒁼','𒁽'=>'𒁽','𒁾'=>'𒁾','𒁿'=>'𒁿','𒂀'=>'𒂀','𒂁'=>'𒂁','𒂂'=>'𒂂','𒂃'=>'𒂃','𒂄'=>'𒂄','𒂅'=>'𒂅','𒂆'=>'𒂆','𒂇'=>'𒂇','𒂈'=>'𒂈','𒂉'=>'𒂉','𒂊'=>'𒂊','𒂋'=>'𒂋','𒂌'=>'𒂌','𒂍'=>'𒂍','𒂎'=>'𒂎','𒂏'=>'𒂏','𒂐'=>'𒂐','𒂑'=>'𒂑','𒂒'=>'𒂒','𒂓'=>'𒂓','𒂔'=>'𒂔','𒂕'=>'𒂕','𒂖'=>'𒂖','𒂗'=>'𒂗','𒂘'=>'𒂘','𒂙'=>'𒂙','𒂚'=>'𒂚','𒂛'=>'𒂛','𒂜'=>'𒂜','𒂝'=>'𒂝','𒂞'=>'𒂞','𒂟'=>'𒂟','𒂠'=>'𒂠','𒂡'=>'𒂡','𒂢'=>'𒂢','𒂣'=>'𒂣','𒂤'=>'𒂤','𒂥'=>'𒂥','𒂦'=>'𒂦','𒂧'=>'𒂧','𒂨'=>'𒂨','𒂩'=>'𒂩','𒂪'=>'𒂪','𒂫'=>'𒂫','𒂬'=>'𒂬','𒂭'=>'𒂭','𒂮'=>'𒂮','𒂯'=>'𒂯','𒂰'=>'𒂰','𒂱'=>'𒂱','𒂲'=>'𒂲','𒂳'=>'𒂳','𒂴'=>'𒂴','𒂵'=>'𒂵','𒂶'=>'𒂶','𒂷'=>'𒂷','𒂸'=>'𒂸','𒂹'=>'𒂹','𒂺'=>'𒂺','𒂻'=>'𒂻','𒂼'=>'𒂼','𒂽'=>'𒂽','𒂾'=>'𒂾','𒂿'=>'𒂿','𒃀'=>'𒃀','𒃁'=>'𒃁','𒃂'=>'𒃂','𒃃'=>'𒃃','𒃄'=>'𒃄','𒃅'=>'𒃅','𒃆'=>'𒃆','𒃇'=>'𒃇','𒃈'=>'𒃈','𒃉'=>'𒃉','𒃊'=>'𒃊','𒃋'=>'𒃋','𒃌'=>'𒃌','𒃍'=>'𒃍','𒃎'=>'𒃎','𒃏'=>'𒃏','𒃐'=>'𒃐','𒃑'=>'𒃑','𒃒'=>'𒃒','𒃓'=>'𒃓','𒃔'=>'𒃔','𒃕'=>'𒃕','𒃖'=>'𒃖','𒃗'=>'𒃗','𒃘'=>'𒃘','𒃙'=>'𒃙','𒃚'=>'𒃚','𒃛'=>'𒃛','𒃜'=>'𒃜','𒃝'=>'𒃝','𒃞'=>'𒃞','𒃟'=>'𒃟','𒃠'=>'𒃠','𒃡'=>'𒃡','𒃢'=>'𒃢','𒃣'=>'𒃣','𒃤'=>'𒃤','𒃥'=>'𒃥','𒃦'=>'𒃦','𒃧'=>'𒃧','𒃨'=>'𒃨','𒃩'=>'𒃩','𒃪'=>'𒃪','𒃫'=>'𒃫','𒃬'=>'𒃬','𒃭'=>'𒃭','𒃮'=>'𒃮','𒃯'=>'𒃯','𒃰'=>'𒃰','𒃱'=>'𒃱','𒃲'=>'𒃲','𒃳'=>'𒃳','𒃴'=>'𒃴','𒃵'=>'𒃵','𒃶'=>'𒃶','𒃷'=>'𒃷','𒃸'=>'𒃸','𒃹'=>'𒃹','𒃺'=>'𒃺','𒃻'=>'𒃻','𒃼'=>'𒃼','𒃽'=>'𒃽','𒃾'=>'𒃾','𒃿'=>'𒃿','𒄀'=>'𒄀','𒄁'=>'𒄁','𒄂'=>'𒄂','𒄃'=>'𒄃','𒄄'=>'𒄄','𒄅'=>'𒄅','𒄆'=>'𒄆','𒄇'=>'𒄇','𒄈'=>'𒄈','𒄉'=>'𒄉','𒄊'=>'𒄊','𒄋'=>'𒄋','𒄌'=>'𒄌','𒄍'=>'𒄍','𒄎'=>'𒄎','𒄏'=>'𒄏','𒄐'=>'𒄐','𒄑'=>'𒄑','𒄒'=>'𒄒','𒄓'=>'𒄓','𒄔'=>'𒄔','𒄕'=>'𒄕','𒄖'=>'𒄖','𒄗'=>'𒄗','𒄘'=>'𒄘','𒄙'=>'𒄙','𒄚'=>'𒄚','𒄛'=>'𒄛','𒄜'=>'𒄜','𒄝'=>'𒄝','𒄞'=>'𒄞','𒄟'=>'𒄟','𒄠'=>'𒄠','𒄡'=>'𒄡','𒄢'=>'𒄢','𒄣'=>'𒄣','𒄤'=>'𒄤','𒄥'=>'𒄥','𒄦'=>'𒄦','𒄧'=>'𒄧','𒄨'=>'𒄨','𒄩'=>'𒄩','𒄪'=>'𒄪','𒄫'=>'𒄫','𒄬'=>'𒄬','𒄭'=>'𒄭','𒄮'=>'𒄮','𒄯'=>'𒄯','𒄰'=>'𒄰','𒄱'=>'𒄱','𒄲'=>'𒄲','𒄳'=>'𒄳','𒄴'=>'𒄴','𒄵'=>'𒄵','𒄶'=>'𒄶','𒄷'=>'𒄷','𒄸'=>'𒄸','𒄹'=>'𒄹','𒄺'=>'𒄺','𒄻'=>'𒄻','𒄼'=>'𒄼','𒄽'=>'𒄽','𒄾'=>'𒄾','𒄿'=>'𒄿','𒅀'=>'𒅀','𒅁'=>'𒅁','𒅂'=>'𒅂','𒅃'=>'𒅃','𒅄'=>'𒅄','𒅅'=>'𒅅','𒅆'=>'𒅆','𒅇'=>'𒅇','𒅈'=>'𒅈','𒅉'=>'𒅉','𒅊'=>'𒅊','𒅋'=>'𒅋','𒅌'=>'𒅌','𒅍'=>'𒅍','𒅎'=>'𒅎','𒅏'=>'𒅏','𒅐'=>'𒅐','𒅑'=>'𒅑','𒅒'=>'𒅒','𒅓'=>'𒅓','𒅔'=>'𒅔','𒅕'=>'𒅕','𒅖'=>'𒅖','𒅗'=>'𒅗','𒅘'=>'𒅘','𒅙'=>'𒅙','𒅚'=>'𒅚','𒅛'=>'𒅛','𒅜'=>'𒅜','𒅝'=>'𒅝','𒅞'=>'𒅞','𒅟'=>'𒅟','𒅠'=>'𒅠','𒅡'=>'𒅡','𒅢'=>'𒅢','𒅣'=>'𒅣','𒅤'=>'𒅤','𒅥'=>'𒅥','𒅦'=>'𒅦','𒅧'=>'𒅧','𒅨'=>'𒅨','𒅩'=>'𒅩','𒅪'=>'𒅪','𒅫'=>'𒅫','𒅬'=>'𒅬','𒅭'=>'𒅭','𒅮'=>'𒅮','𒅯'=>'𒅯','𒅰'=>'𒅰','𒅱'=>'𒅱','𒅲'=>'𒅲','𒅳'=>'𒅳','𒅴'=>'𒅴','𒅵'=>'𒅵','𒅶'=>'𒅶','𒅷'=>'𒅷','𒅸'=>'𒅸','𒅹'=>'𒅹','𒅺'=>'𒅺','𒅻'=>'𒅻','𒅼'=>'𒅼','𒅽'=>'𒅽','𒅾'=>'𒅾','𒅿'=>'𒅿','𒆀'=>'𒆀','𒆁'=>'𒆁','𒆂'=>'𒆂','𒆃'=>'𒆃','𒆄'=>'𒆄','𒆅'=>'𒆅','𒆆'=>'𒆆','𒆇'=>'𒆇','𒆈'=>'𒆈','𒆉'=>'𒆉','𒆊'=>'𒆊','𒆋'=>'𒆋','𒆌'=>'𒆌','𒆍'=>'𒆍','𒆎'=>'𒆎','𒆏'=>'𒆏','𒆐'=>'𒆐','𒆑'=>'𒆑','𒆒'=>'𒆒','𒆓'=>'𒆓','𒆔'=>'𒆔','𒆕'=>'𒆕','𒆖'=>'𒆖','𒆗'=>'𒆗','𒆘'=>'𒆘','𒆙'=>'𒆙','𒆚'=>'𒆚','𒆛'=>'𒆛','𒆜'=>'𒆜','𒆝'=>'𒆝','𒆞'=>'𒆞','𒆟'=>'𒆟','𒆠'=>'𒆠','𒆡'=>'𒆡','𒆢'=>'𒆢','𒆣'=>'𒆣','𒆤'=>'𒆤','𒆥'=>'𒆥','𒆦'=>'𒆦','𒆧'=>'𒆧','𒆨'=>'𒆨','𒆩'=>'𒆩','𒆪'=>'𒆪','𒆫'=>'𒆫','𒆬'=>'𒆬','𒆭'=>'𒆭','𒆮'=>'𒆮','𒆯'=>'𒆯','𒆰'=>'𒆰','𒆱'=>'𒆱','𒆲'=>'𒆲','𒆳'=>'𒆳','𒆴'=>'𒆴','𒆵'=>'𒆵','𒆶'=>'𒆶','𒆷'=>'𒆷','𒆸'=>'𒆸','𒆹'=>'𒆹','𒆺'=>'𒆺','𒆻'=>'𒆻','𒆼'=>'𒆼','𒆽'=>'𒆽','𒆾'=>'𒆾','𒆿'=>'𒆿','𒇀'=>'𒇀','𒇁'=>'𒇁','𒇂'=>'𒇂','𒇃'=>'𒇃','𒇄'=>'𒇄','𒇅'=>'𒇅','𒇆'=>'𒇆','𒇇'=>'𒇇','𒇈'=>'𒇈','𒇉'=>'𒇉','𒇊'=>'𒇊','𒇋'=>'𒇋','𒇌'=>'𒇌','𒇍'=>'𒇍','𒇎'=>'𒇎','𒇏'=>'𒇏','𒇐'=>'𒇐','𒇑'=>'𒇑','𒇒'=>'𒇒','𒇓'=>'𒇓','𒇔'=>'𒇔','𒇕'=>'𒇕','𒇖'=>'𒇖','𒇗'=>'𒇗','𒇘'=>'𒇘','𒇙'=>'𒇙','𒇚'=>'𒇚','𒇛'=>'𒇛','𒇜'=>'𒇜','𒇝'=>'𒇝','𒇞'=>'𒇞','𒇟'=>'𒇟','𒇠'=>'𒇠','𒇡'=>'𒇡','𒇢'=>'𒇢','𒇣'=>'𒇣','𒇤'=>'𒇤','𒇥'=>'𒇥','𒇦'=>'𒇦','𒇧'=>'𒇧','𒇨'=>'𒇨','𒇩'=>'𒇩','𒇪'=>'𒇪','𒇫'=>'𒇫','𒇬'=>'𒇬','𒇭'=>'𒇭','𒇮'=>'𒇮','𒇯'=>'𒇯','𒇰'=>'𒇰','𒇱'=>'𒇱','𒇲'=>'𒇲','𒇳'=>'𒇳','𒇴'=>'𒇴','𒇵'=>'𒇵','𒇶'=>'𒇶','𒇷'=>'𒇷','𒇸'=>'𒇸','𒇹'=>'𒇹','𒇺'=>'𒇺','𒇻'=>'𒇻','𒇼'=>'𒇼','𒇽'=>'𒇽','𒇾'=>'𒇾','𒇿'=>'𒇿','𒈀'=>'𒈀','𒈁'=>'𒈁','𒈂'=>'𒈂','𒈃'=>'𒈃','𒈄'=>'𒈄','𒈅'=>'𒈅','𒈆'=>'𒈆','𒈇'=>'𒈇','𒈈'=>'𒈈','𒈉'=>'𒈉','𒈊'=>'𒈊','𒈋'=>'𒈋','𒈌'=>'𒈌','𒈍'=>'𒈍','𒈎'=>'𒈎','𒈏'=>'𒈏','𒈐'=>'𒈐','𒈑'=>'𒈑','𒈒'=>'𒈒','𒈓'=>'𒈓','𒈔'=>'𒈔','𒈕'=>'𒈕','𒈖'=>'𒈖','𒈗'=>'𒈗','𒈘'=>'𒈘','𒈙'=>'𒈙','𒈚'=>'𒈚','𒈛'=>'𒈛','𒈜'=>'𒈜','𒈝'=>'𒈝','𒈞'=>'𒈞','𒈟'=>'𒈟','𒈠'=>'𒈠','𒈡'=>'𒈡','𒈢'=>'𒈢','𒈣'=>'𒈣','𒈤'=>'𒈤','𒈥'=>'𒈥','𒈦'=>'𒈦','𒈧'=>'𒈧','𒈨'=>'𒈨','𒈩'=>'𒈩','𒈪'=>'𒈪','𒈫'=>'𒈫','𒈬'=>'𒈬','𒈭'=>'𒈭','𒈮'=>'𒈮','𒈯'=>'𒈯','𒈰'=>'𒈰','𒈱'=>'𒈱','𒈲'=>'𒈲','𒈳'=>'𒈳','𒈴'=>'𒈴','𒈵'=>'𒈵','𒈶'=>'𒈶','𒈷'=>'𒈷','𒈸'=>'𒈸','𒈹'=>'𒈹','𒈺'=>'𒈺','𒈻'=>'𒈻','𒈼'=>'𒈼','𒈽'=>'𒈽','𒈾'=>'𒈾','𒈿'=>'𒈿','𒉀'=>'𒉀','𒉁'=>'𒉁','𒉂'=>'𒉂','𒉃'=>'𒉃','𒉄'=>'𒉄','𒉅'=>'𒉅','𒉆'=>'𒉆','𒉇'=>'𒉇','𒉈'=>'𒉈','𒉉'=>'𒉉','𒉊'=>'𒉊','𒉋'=>'𒉋','𒉌'=>'𒉌','𒉍'=>'𒉍','𒉎'=>'𒉎','𒉏'=>'𒉏','𒉐'=>'𒉐','𒉑'=>'𒉑','𒉒'=>'𒉒','𒉓'=>'𒉓','𒉔'=>'𒉔','𒉕'=>'𒉕','𒉖'=>'𒉖','𒉗'=>'𒉗','𒉘'=>'𒉘','𒉙'=>'𒉙','𒉚'=>'𒉚','𒉛'=>'𒉛','𒉜'=>'𒉜','𒉝'=>'𒉝','𒉞'=>'𒉞','𒉟'=>'𒉟','𒉠'=>'𒉠','𒉡'=>'𒉡','𒉢'=>'𒉢','𒉣'=>'𒉣','𒉤'=>'𒉤','𒉥'=>'𒉥','𒉦'=>'𒉦','𒉧'=>'𒉧','𒉨'=>'𒉨','𒉩'=>'𒉩','𒉪'=>'𒉪','𒉫'=>'𒉫','𒉬'=>'𒉬','𒉭'=>'𒉭','𒉮'=>'𒉮','𒉯'=>'𒉯','𒉰'=>'𒉰','𒉱'=>'𒉱','𒉲'=>'𒉲','𒉳'=>'𒉳','𒉴'=>'𒉴','𒉵'=>'𒉵','𒉶'=>'𒉶','𒉷'=>'𒉷','𒉸'=>'𒉸','𒉹'=>'𒉹','𒉺'=>'𒉺','𒉻'=>'𒉻','𒉼'=>'𒉼','𒉽'=>'𒉽','𒉾'=>'𒉾','𒉿'=>'𒉿','𒊀'=>'𒊀','𒊁'=>'𒊁','𒊂'=>'𒊂','𒊃'=>'𒊃','𒊄'=>'𒊄','𒊅'=>'𒊅','𒊆'=>'𒊆','𒊇'=>'𒊇','𒊈'=>'𒊈','𒊉'=>'𒊉','𒊊'=>'𒊊','𒊋'=>'𒊋','𒊌'=>'𒊌','𒊍'=>'𒊍','𒊎'=>'𒊎','𒊏'=>'𒊏','𒊐'=>'𒊐','𒊑'=>'𒊑','𒊒'=>'𒊒','𒊓'=>'𒊓','𒊔'=>'𒊔','𒊕'=>'𒊕','𒊖'=>'𒊖','𒊗'=>'𒊗','𒊘'=>'𒊘','𒊙'=>'𒊙','𒊚'=>'𒊚','𒊛'=>'𒊛','𒊜'=>'𒊜','𒊝'=>'𒊝','𒊞'=>'𒊞','𒊟'=>'𒊟','𒊠'=>'𒊠','𒊡'=>'𒊡','𒊢'=>'𒊢','𒊣'=>'𒊣','𒊤'=>'𒊤','𒊥'=>'𒊥','𒊦'=>'𒊦','𒊧'=>'𒊧','𒊨'=>'𒊨','𒊩'=>'𒊩','𒊪'=>'𒊪','𒊫'=>'𒊫','𒊬'=>'𒊬','𒊭'=>'𒊭','𒊮'=>'𒊮','𒊯'=>'𒊯','𒊰'=>'𒊰','𒊱'=>'𒊱','𒊲'=>'𒊲','𒊳'=>'𒊳','𒊴'=>'𒊴','𒊵'=>'𒊵','𒊶'=>'𒊶','𒊷'=>'𒊷','𒊸'=>'𒊸','𒊹'=>'𒊹','𒊺'=>'𒊺','𒊻'=>'𒊻','𒊼'=>'𒊼','𒊽'=>'𒊽','𒊾'=>'𒊾','𒊿'=>'𒊿','𒋀'=>'𒋀','𒋁'=>'𒋁','𒋂'=>'𒋂','𒋃'=>'𒋃','𒋄'=>'𒋄','𒋅'=>'𒋅','𒋆'=>'𒋆','𒋇'=>'𒋇','𒋈'=>'𒋈','𒋉'=>'𒋉','𒋊'=>'𒋊','𒋋'=>'𒋋','𒋌'=>'𒋌','𒋍'=>'𒋍','𒋎'=>'𒋎','𒋏'=>'𒋏','𒋐'=>'𒋐','𒋑'=>'𒋑','𒋒'=>'𒋒','𒋓'=>'𒋓','𒋔'=>'𒋔','𒋕'=>'𒋕','𒋖'=>'𒋖','𒋗'=>'𒋗','𒋘'=>'𒋘','𒋙'=>'𒋙','𒋚'=>'𒋚','𒋛'=>'𒋛','𒋜'=>'𒋜','𒋝'=>'𒋝','𒋞'=>'𒋞','𒋟'=>'𒋟','𒋠'=>'𒋠','𒋡'=>'𒋡','𒋢'=>'𒋢','𒋣'=>'𒋣','𒋤'=>'𒋤','𒋥'=>'𒋥','𒋦'=>'𒋦','𒋧'=>'𒋧','𒋨'=>'𒋨','𒋩'=>'𒋩','𒋪'=>'𒋪','𒋫'=>'𒋫','𒋬'=>'𒋬','𒋭'=>'𒋭','𒋮'=>'𒋮','𒋯'=>'𒋯','𒋰'=>'𒋰','𒋱'=>'𒋱','𒋲'=>'𒋲','𒋳'=>'𒋳','𒋴'=>'𒋴','𒋵'=>'𒋵','𒋶'=>'𒋶','𒋷'=>'𒋷','𒋸'=>'𒋸','𒋹'=>'𒋹','𒋺'=>'𒋺','𒋻'=>'𒋻','𒋼'=>'𒋼','𒋽'=>'𒋽','𒋾'=>'𒋾','𒋿'=>'𒋿','𒌀'=>'𒌀','𒌁'=>'𒌁','𒌂'=>'𒌂','𒌃'=>'𒌃','𒌄'=>'𒌄','𒌅'=>'𒌅','𒌆'=>'𒌆','𒌇'=>'𒌇','𒌈'=>'𒌈','𒌉'=>'𒌉','𒌊'=>'𒌊','𒌋'=>'𒌋','𒌌'=>'𒌌','𒌍'=>'𒌍','𒌎'=>'𒌎','𒌏'=>'𒌏','𒌐'=>'𒌐','𒌑'=>'𒌑','𒌒'=>'𒌒','𒌓'=>'𒌓','𒌔'=>'𒌔','𒌕'=>'𒌕','𒌖'=>'𒌖','𒌗'=>'𒌗','𒌘'=>'𒌘','𒌙'=>'𒌙','𒌚'=>'𒌚','𒌛'=>'𒌛','𒌜'=>'𒌜','𒌝'=>'𒌝','𒌞'=>'𒌞','𒌟'=>'𒌟','𒌠'=>'𒌠','𒌡'=>'𒌡','𒌢'=>'𒌢','𒌣'=>'𒌣','𒌤'=>'𒌤','𒌥'=>'𒌥','𒌦'=>'𒌦','𒌧'=>'𒌧','𒌨'=>'𒌨','𒌩'=>'𒌩','𒌪'=>'𒌪','𒌫'=>'𒌫','𒌬'=>'𒌬','𒌭'=>'𒌭','𒌮'=>'𒌮','𒌯'=>'𒌯','𒌰'=>'𒌰','𒌱'=>'𒌱','𒌲'=>'𒌲','𒌳'=>'𒌳','𒌴'=>'𒌴','𒌵'=>'𒌵','𒌶'=>'𒌶','𒌷'=>'𒌷','𒌸'=>'𒌸','𒌹'=>'𒌹','𒌺'=>'𒌺','𒌻'=>'𒌻','𒌼'=>'𒌼','𒌽'=>'𒌽','𒌾'=>'𒌾','𒌿'=>'𒌿','𒍀'=>'𒍀','𒍁'=>'𒍁','𒍂'=>'𒍂','𒍃'=>'𒍃','𒍄'=>'𒍄','𒍅'=>'𒍅','𒍆'=>'𒍆','𒍇'=>'𒍇','𒍈'=>'𒍈','𒍉'=>'𒍉','𒍊'=>'𒍊','𒍋'=>'𒍋','𒍌'=>'𒍌','𒍍'=>'𒍍','𒍎'=>'𒍎','𒍏'=>'𒍏','𒍐'=>'𒍐','𒍑'=>'𒍑','𒍒'=>'𒍒','𒍓'=>'𒍓','𒍔'=>'𒍔','𒍕'=>'𒍕','𒍖'=>'𒍖','𒍗'=>'𒍗','𒍘'=>'𒍘','𒍙'=>'𒍙','𒍚'=>'𒍚','𒍛'=>'𒍛','𒍜'=>'𒍜','𒍝'=>'𒍝','𒍞'=>'𒍞','𒍟'=>'𒍟','𒍠'=>'𒍠','𒍡'=>'𒍡','𒍢'=>'𒍢','𒍣'=>'𒍣','𒍤'=>'𒍤','𒍥'=>'𒍥','𒍦'=>'𒍦','𒍧'=>'𒍧','𒍨'=>'𒍨','𒍩'=>'𒍩','𒍪'=>'𒍪','𒍫'=>'𒍫','𒍬'=>'𒍬','𒍭'=>'𒍭','𒍮'=>'𒍮','𒐀'=>'2','𒐁'=>'3','𒐂'=>'4','𒐃'=>'5','𒐄'=>'6','𒐅'=>'7','𒐆'=>'8','𒐇'=>'9','𒐈'=>'3','𒐉'=>'4','𒐊'=>'5','𒐋'=>'6','𒐌'=>'7','𒐍'=>'8','𒐎'=>'9','𒐏'=>'4','𒐐'=>'5','𒐑'=>'6','𒐒'=>'7','𒐓'=>'8','𒐔'=>'9','𒐕'=>'1','𒐖'=>'2','𒐗'=>'3','𒐘'=>'4','𒐙'=>'5','𒐚'=>'6','𒐛'=>'7','𒐜'=>'8','𒐝'=>'9','𒐞'=>'1','𒐟'=>'2','𒐠'=>'3','𒐡'=>'4','𒐢'=>'5','𒐣'=>'2','𒐤'=>'3','𒐥'=>'3','𒐦'=>'4','𒐧'=>'5','𒐨'=>'6','𒐩'=>'7','𒐪'=>'8','𒐫'=>'9','𒐬'=>'1','𒐭'=>'2','𒐮'=>'3','𒐯'=>'3','𒐰'=>'4','𒐱'=>'5','𒐲'=>'𒐲','𒐳'=>'𒐳','𒐴'=>'1','𒐵'=>'2','𒐶'=>'3','𒐷'=>'3','𒐸'=>'4','𒐹'=>'5','𒐺'=>'3','𒐻'=>'3','𒐼'=>'4','𒐽'=>'4','𒐾'=>'4','𒐿'=>'4','𒑀'=>'6','𒑁'=>'7','𒑂'=>'7','𒑃'=>'7','𒑄'=>'8','𒑅'=>'8','𒑆'=>'9','𒑇'=>'9','𒑈'=>'9','𒑉'=>'9','𒑊'=>'2','𒑋'=>'3','𒑌'=>'4','𒑍'=>'5','𒑎'=>'6','𒑏'=>'1','𒑐'=>'2','𒑑'=>'3','𒑒'=>'4','𒑓'=>'4','𒑔'=>'5','𒑕'=>'5','𒑖'=>'𒑖','𒑗'=>'𒑗','𒑘'=>'1','𒑙'=>'2','𒑚'=>'1/3','𒑛'=>'2/3','𒑜'=>'5/6','𒑝'=>'1/3','𒑞'=>'2/3','𒑟'=>'1/8','𒑠'=>'1/4','𒑡'=>'1/6','𒑢'=>'1/4'); \ No newline at end of file
+<?php return array('𒀀'=>'𒀀','𒀁'=>'𒀁','𒀂'=>'𒀂','𒀃'=>'𒀃','𒀄'=>'𒀄','𒀅'=>'𒀅','𒀆'=>'𒀆','𒀇'=>'𒀇','𒀈'=>'𒀈','𒀉'=>'𒀉','𒀊'=>'𒀊','𒀋'=>'𒀋','𒀌'=>'𒀌','𒀍'=>'𒀍','𒀎'=>'𒀎','𒀏'=>'𒀏','𒀐'=>'𒀐','𒀑'=>'𒀑','𒀒'=>'𒀒','𒀓'=>'𒀓','𒀔'=>'𒀔','𒀕'=>'𒀕','𒀖'=>'𒀖','𒀗'=>'𒀗','𒀘'=>'𒀘','𒀙'=>'𒀙','𒀚'=>'𒀚','𒀛'=>'𒀛','𒀜'=>'𒀜','𒀝'=>'𒀝','𒀞'=>'𒀞','𒀟'=>'𒀟','𒀠'=>'𒀠','𒀡'=>'𒀡','𒀢'=>'𒀢','𒀣'=>'𒀣','𒀤'=>'𒀤','𒀥'=>'𒀥','𒀦'=>'𒀦','𒀧'=>'𒀧','𒀨'=>'𒀨','𒀩'=>'𒀩','𒀪'=>'𒀪','𒀫'=>'𒀫','𒀬'=>'𒀬','𒀭'=>'𒀭','𒀮'=>'𒀮','𒀯'=>'𒀯','𒀰'=>'𒀰','𒀱'=>'𒀱','𒀲'=>'𒀲','𒀳'=>'𒀳','𒀴'=>'𒀴','𒀵'=>'𒀵','𒀶'=>'𒀶','𒀷'=>'𒀷','𒀸'=>'𒀸','𒀹'=>'𒀹','𒀺'=>'𒀺','𒀻'=>'𒀻','𒀼'=>'𒀼','𒀽'=>'𒀽','𒀾'=>'𒀾','𒀿'=>'𒀿','𒁀'=>'𒁀','𒁁'=>'𒁁','𒁂'=>'𒁂','𒁃'=>'𒁃','𒁄'=>'𒁄','𒁅'=>'𒁅','𒁆'=>'𒁆','𒁇'=>'𒁇','𒁈'=>'𒁈','𒁉'=>'𒁉','𒁊'=>'𒁊','𒁋'=>'𒁋','𒁌'=>'𒁌','𒁍'=>'𒁍','𒁎'=>'𒁎','𒁏'=>'𒁏','𒁐'=>'𒁐','𒁑'=>'𒁑','𒁒'=>'𒁒','𒁓'=>'𒁓','𒁔'=>'𒁔','𒁕'=>'𒁕','𒁖'=>'𒁖','𒁗'=>'𒁗','𒁘'=>'𒁘','𒁙'=>'𒁙','𒁚'=>'𒁚','𒁛'=>'𒁛','𒁜'=>'𒁜','𒁝'=>'𒁝','𒁞'=>'𒁞','𒁟'=>'𒁟','𒁠'=>'𒁠','𒁡'=>'𒁡','𒁢'=>'𒁢','𒁣'=>'𒁣','𒁤'=>'𒁤','𒁥'=>'𒁥','𒁦'=>'𒁦','𒁧'=>'𒁧','𒁨'=>'𒁨','𒁩'=>'𒁩','𒁪'=>'𒁪','𒁫'=>'𒁫','𒁬'=>'𒁬','𒁭'=>'𒁭','𒁮'=>'𒁮','𒁯'=>'𒁯','𒁰'=>'𒁰','𒁱'=>'𒁱','𒁲'=>'𒁲','𒁳'=>'𒁳','𒁴'=>'𒁴','𒁵'=>'𒁵','𒁶'=>'𒁶','𒁷'=>'𒁷','𒁸'=>'𒁸','𒁹'=>'𒁹','𒁺'=>'𒁺','𒁻'=>'𒁻','𒁼'=>'𒁼','𒁽'=>'𒁽','𒁾'=>'𒁾','𒁿'=>'𒁿','𒂀'=>'𒂀','𒂁'=>'𒂁','𒂂'=>'𒂂','𒂃'=>'𒂃','𒂄'=>'𒂄','𒂅'=>'𒂅','𒂆'=>'𒂆','𒂇'=>'𒂇','𒂈'=>'𒂈','𒂉'=>'𒂉','𒂊'=>'𒂊','𒂋'=>'𒂋','𒂌'=>'𒂌','𒂍'=>'𒂍','𒂎'=>'𒂎','𒂏'=>'𒂏','𒂐'=>'𒂐','𒂑'=>'𒂑','𒂒'=>'𒂒','𒂓'=>'𒂓','𒂔'=>'𒂔','𒂕'=>'𒂕','𒂖'=>'𒂖','𒂗'=>'𒂗','𒂘'=>'𒂘','𒂙'=>'𒂙','𒂚'=>'𒂚','𒂛'=>'𒂛','𒂜'=>'𒂜','𒂝'=>'𒂝','𒂞'=>'𒂞','𒂟'=>'𒂟','𒂠'=>'𒂠','𒂡'=>'𒂡','𒂢'=>'𒂢','𒂣'=>'𒂣','𒂤'=>'𒂤','𒂥'=>'𒂥','𒂦'=>'𒂦','𒂧'=>'𒂧','𒂨'=>'𒂨','𒂩'=>'𒂩','𒂪'=>'𒂪','𒂫'=>'𒂫','𒂬'=>'𒂬','𒂭'=>'𒂭','𒂮'=>'𒂮','𒂯'=>'𒂯','𒂰'=>'𒂰','𒂱'=>'𒂱','𒂲'=>'𒂲','𒂳'=>'𒂳','𒂴'=>'𒂴','𒂵'=>'𒂵','𒂶'=>'𒂶','𒂷'=>'𒂷','𒂸'=>'𒂸','𒂹'=>'𒂹','𒂺'=>'𒂺','𒂻'=>'𒂻','𒂼'=>'𒂼','𒂽'=>'𒂽','𒂾'=>'𒂾','𒂿'=>'𒂿','𒃀'=>'𒃀','𒃁'=>'𒃁','𒃂'=>'𒃂','𒃃'=>'𒃃','𒃄'=>'𒃄','𒃅'=>'𒃅','𒃆'=>'𒃆','𒃇'=>'𒃇','𒃈'=>'𒃈','𒃉'=>'𒃉','𒃊'=>'𒃊','𒃋'=>'𒃋','𒃌'=>'𒃌','𒃍'=>'𒃍','𒃎'=>'𒃎','𒃏'=>'𒃏','𒃐'=>'𒃐','𒃑'=>'𒃑','𒃒'=>'𒃒','𒃓'=>'𒃓','𒃔'=>'𒃔','𒃕'=>'𒃕','𒃖'=>'𒃖','𒃗'=>'𒃗','𒃘'=>'𒃘','𒃙'=>'𒃙','𒃚'=>'𒃚','𒃛'=>'𒃛','𒃜'=>'𒃜','𒃝'=>'𒃝','𒃞'=>'𒃞','𒃟'=>'𒃟','𒃠'=>'𒃠','𒃡'=>'𒃡','𒃢'=>'𒃢','𒃣'=>'𒃣','𒃤'=>'𒃤','𒃥'=>'𒃥','𒃦'=>'𒃦','𒃧'=>'𒃧','𒃨'=>'𒃨','𒃩'=>'𒃩','𒃪'=>'𒃪','𒃫'=>'𒃫','𒃬'=>'𒃬','𒃭'=>'𒃭','𒃮'=>'𒃮','𒃯'=>'𒃯','𒃰'=>'𒃰','𒃱'=>'𒃱','𒃲'=>'𒃲','𒃳'=>'𒃳','𒃴'=>'𒃴','𒃵'=>'𒃵','𒃶'=>'𒃶','𒃷'=>'𒃷','𒃸'=>'𒃸','𒃹'=>'𒃹','𒃺'=>'𒃺','𒃻'=>'𒃻','𒃼'=>'𒃼','𒃽'=>'𒃽','𒃾'=>'𒃾','𒃿'=>'𒃿','𒄀'=>'𒄀','𒄁'=>'𒄁','𒄂'=>'𒄂','𒄃'=>'𒄃','𒄄'=>'𒄄','𒄅'=>'𒄅','𒄆'=>'𒄆','𒄇'=>'𒄇','𒄈'=>'𒄈','𒄉'=>'𒄉','𒄊'=>'𒄊','𒄋'=>'𒄋','𒄌'=>'𒄌','𒄍'=>'𒄍','𒄎'=>'𒄎','𒄏'=>'𒄏','𒄐'=>'𒄐','𒄑'=>'𒄑','𒄒'=>'𒄒','𒄓'=>'𒄓','𒄔'=>'𒄔','𒄕'=>'𒄕','𒄖'=>'𒄖','𒄗'=>'𒄗','𒄘'=>'𒄘','𒄙'=>'𒄙','𒄚'=>'𒄚','𒄛'=>'𒄛','𒄜'=>'𒄜','𒄝'=>'𒄝','𒄞'=>'𒄞','𒄟'=>'𒄟','𒄠'=>'𒄠','𒄡'=>'𒄡','𒄢'=>'𒄢','𒄣'=>'𒄣','𒄤'=>'𒄤','𒄥'=>'𒄥','𒄦'=>'𒄦','𒄧'=>'𒄧','𒄨'=>'𒄨','𒄩'=>'𒄩','𒄪'=>'𒄪','𒄫'=>'𒄫','𒄬'=>'𒄬','𒄭'=>'𒄭','𒄮'=>'𒄮','𒄯'=>'𒄯','𒄰'=>'𒄰','𒄱'=>'𒄱','𒄲'=>'𒄲','𒄳'=>'𒄳','𒄴'=>'𒄴','𒄵'=>'𒄵','𒄶'=>'𒄶','𒄷'=>'𒄷','𒄸'=>'𒄸','𒄹'=>'𒄹','𒄺'=>'𒄺','𒄻'=>'𒄻','𒄼'=>'𒄼','𒄽'=>'𒄽','𒄾'=>'𒄾','𒄿'=>'𒄿','𒅀'=>'𒅀','𒅁'=>'𒅁','𒅂'=>'𒅂','𒅃'=>'𒅃','𒅄'=>'𒅄','𒅅'=>'𒅅','𒅆'=>'𒅆','𒅇'=>'𒅇','𒅈'=>'𒅈','𒅉'=>'𒅉','𒅊'=>'𒅊','𒅋'=>'𒅋','𒅌'=>'𒅌','𒅍'=>'𒅍','𒅎'=>'𒅎','𒅏'=>'𒅏','𒅐'=>'𒅐','𒅑'=>'𒅑','𒅒'=>'𒅒','𒅓'=>'𒅓','𒅔'=>'𒅔','𒅕'=>'𒅕','𒅖'=>'𒅖','𒅗'=>'𒅗','𒅘'=>'𒅘','𒅙'=>'𒅙','𒅚'=>'𒅚','𒅛'=>'𒅛','𒅜'=>'𒅜','𒅝'=>'𒅝','𒅞'=>'𒅞','𒅟'=>'𒅟','𒅠'=>'𒅠','𒅡'=>'𒅡','𒅢'=>'𒅢','𒅣'=>'𒅣','𒅤'=>'𒅤','𒅥'=>'𒅥','𒅦'=>'𒅦','𒅧'=>'𒅧','𒅨'=>'𒅨','𒅩'=>'𒅩','𒅪'=>'𒅪','𒅫'=>'𒅫','𒅬'=>'𒅬','𒅭'=>'𒅭','𒅮'=>'𒅮','𒅯'=>'𒅯','𒅰'=>'𒅰','𒅱'=>'𒅱','𒅲'=>'𒅲','𒅳'=>'𒅳','𒅴'=>'𒅴','𒅵'=>'𒅵','𒅶'=>'𒅶','𒅷'=>'𒅷','𒅸'=>'𒅸','𒅹'=>'𒅹','𒅺'=>'𒅺','𒅻'=>'𒅻','𒅼'=>'𒅼','𒅽'=>'𒅽','𒅾'=>'𒅾','𒅿'=>'𒅿','𒆀'=>'𒆀','𒆁'=>'𒆁','𒆂'=>'𒆂','𒆃'=>'𒆃','𒆄'=>'𒆄','𒆅'=>'𒆅','𒆆'=>'𒆆','𒆇'=>'𒆇','𒆈'=>'𒆈','𒆉'=>'𒆉','𒆊'=>'𒆊','𒆋'=>'𒆋','𒆌'=>'𒆌','𒆍'=>'𒆍','𒆎'=>'𒆎','𒆏'=>'𒆏','𒆐'=>'𒆐','𒆑'=>'𒆑','𒆒'=>'𒆒','𒆓'=>'𒆓','𒆔'=>'𒆔','𒆕'=>'𒆕','𒆖'=>'𒆖','𒆗'=>'𒆗','𒆘'=>'𒆘','𒆙'=>'𒆙','𒆚'=>'𒆚','𒆛'=>'𒆛','𒆜'=>'𒆜','𒆝'=>'𒆝','𒆞'=>'𒆞','𒆟'=>'𒆟','𒆠'=>'𒆠','𒆡'=>'𒆡','𒆢'=>'𒆢','𒆣'=>'𒆣','𒆤'=>'𒆤','𒆥'=>'𒆥','𒆦'=>'𒆦','𒆧'=>'𒆧','𒆨'=>'𒆨','𒆩'=>'𒆩','𒆪'=>'𒆪','𒆫'=>'𒆫','𒆬'=>'𒆬','𒆭'=>'𒆭','𒆮'=>'𒆮','𒆯'=>'𒆯','𒆰'=>'𒆰','𒆱'=>'𒆱','𒆲'=>'𒆲','𒆳'=>'𒆳','𒆴'=>'𒆴','𒆵'=>'𒆵','𒆶'=>'𒆶','𒆷'=>'𒆷','𒆸'=>'𒆸','𒆹'=>'𒆹','𒆺'=>'𒆺','𒆻'=>'𒆻','𒆼'=>'𒆼','𒆽'=>'𒆽','𒆾'=>'𒆾','𒆿'=>'𒆿','𒇀'=>'𒇀','𒇁'=>'𒇁','𒇂'=>'𒇂','𒇃'=>'𒇃','𒇄'=>'𒇄','𒇅'=>'𒇅','𒇆'=>'𒇆','𒇇'=>'𒇇','𒇈'=>'𒇈','𒇉'=>'𒇉','𒇊'=>'𒇊','𒇋'=>'𒇋','𒇌'=>'𒇌','𒇍'=>'𒇍','𒇎'=>'𒇎','𒇏'=>'𒇏','𒇐'=>'𒇐','𒇑'=>'𒇑','𒇒'=>'𒇒','𒇓'=>'𒇓','𒇔'=>'𒇔','𒇕'=>'𒇕','𒇖'=>'𒇖','𒇗'=>'𒇗','𒇘'=>'𒇘','𒇙'=>'𒇙','𒇚'=>'𒇚','𒇛'=>'𒇛','𒇜'=>'𒇜','𒇝'=>'𒇝','𒇞'=>'𒇞','𒇟'=>'𒇟','𒇠'=>'𒇠','𒇡'=>'𒇡','𒇢'=>'𒇢','𒇣'=>'𒇣','𒇤'=>'𒇤','𒇥'=>'𒇥','𒇦'=>'𒇦','𒇧'=>'𒇧','𒇨'=>'𒇨','𒇩'=>'𒇩','𒇪'=>'𒇪','𒇫'=>'𒇫','𒇬'=>'𒇬','𒇭'=>'𒇭','𒇮'=>'𒇮','𒇯'=>'𒇯','𒇰'=>'𒇰','𒇱'=>'𒇱','𒇲'=>'𒇲','𒇳'=>'𒇳','𒇴'=>'𒇴','𒇵'=>'𒇵','𒇶'=>'𒇶','𒇷'=>'𒇷','𒇸'=>'𒇸','𒇹'=>'𒇹','𒇺'=>'𒇺','𒇻'=>'𒇻','𒇼'=>'𒇼','𒇽'=>'𒇽','𒇾'=>'𒇾','𒇿'=>'𒇿','𒈀'=>'𒈀','𒈁'=>'𒈁','𒈂'=>'𒈂','𒈃'=>'𒈃','𒈄'=>'𒈄','𒈅'=>'𒈅','𒈆'=>'𒈆','𒈇'=>'𒈇','𒈈'=>'𒈈','𒈉'=>'𒈉','𒈊'=>'𒈊','𒈋'=>'𒈋','𒈌'=>'𒈌','𒈍'=>'𒈍','𒈎'=>'𒈎','𒈏'=>'𒈏','𒈐'=>'𒈐','𒈑'=>'𒈑','𒈒'=>'𒈒','𒈓'=>'𒈓','𒈔'=>'𒈔','𒈕'=>'𒈕','𒈖'=>'𒈖','𒈗'=>'𒈗','𒈘'=>'𒈘','𒈙'=>'𒈙','𒈚'=>'𒈚','𒈛'=>'𒈛','𒈜'=>'𒈜','𒈝'=>'𒈝','𒈞'=>'𒈞','𒈟'=>'𒈟','𒈠'=>'𒈠','𒈡'=>'𒈡','𒈢'=>'𒈢','𒈣'=>'𒈣','𒈤'=>'𒈤','𒈥'=>'𒈥','𒈦'=>'𒈦','𒈧'=>'𒈧','𒈨'=>'𒈨','𒈩'=>'𒈩','𒈪'=>'𒈪','𒈫'=>'𒈫','𒈬'=>'𒈬','𒈭'=>'𒈭','𒈮'=>'𒈮','𒈯'=>'𒈯','𒈰'=>'𒈰','𒈱'=>'𒈱','𒈲'=>'𒈲','𒈳'=>'𒈳','𒈴'=>'𒈴','𒈵'=>'𒈵','𒈶'=>'𒈶','𒈷'=>'𒈷','𒈸'=>'𒈸','𒈹'=>'𒈹','𒈺'=>'𒈺','𒈻'=>'𒈻','𒈼'=>'𒈼','𒈽'=>'𒈽','𒈾'=>'𒈾','𒈿'=>'𒈿','𒉀'=>'𒉀','𒉁'=>'𒉁','𒉂'=>'𒉂','𒉃'=>'𒉃','𒉄'=>'𒉄','𒉅'=>'𒉅','𒉆'=>'𒉆','𒉇'=>'𒉇','𒉈'=>'𒉈','𒉉'=>'𒉉','𒉊'=>'𒉊','𒉋'=>'𒉋','𒉌'=>'𒉌','𒉍'=>'𒉍','𒉎'=>'𒉎','𒉏'=>'𒉏','𒉐'=>'𒉐','𒉑'=>'𒉑','𒉒'=>'𒉒','𒉓'=>'𒉓','𒉔'=>'𒉔','𒉕'=>'𒉕','𒉖'=>'𒉖','𒉗'=>'𒉗','𒉘'=>'𒉘','𒉙'=>'𒉙','𒉚'=>'𒉚','𒉛'=>'𒉛','𒉜'=>'𒉜','𒉝'=>'𒉝','𒉞'=>'𒉞','𒉟'=>'𒉟','𒉠'=>'𒉠','𒉡'=>'𒉡','𒉢'=>'𒉢','𒉣'=>'𒉣','𒉤'=>'𒉤','𒉥'=>'𒉥','𒉦'=>'𒉦','𒉧'=>'𒉧','𒉨'=>'𒉨','𒉩'=>'𒉩','𒉪'=>'𒉪','𒉫'=>'𒉫','𒉬'=>'𒉬','𒉭'=>'𒉭','𒉮'=>'𒉮','𒉯'=>'𒉯','𒉰'=>'𒉰','𒉱'=>'𒉱','𒉲'=>'𒉲','𒉳'=>'𒉳','𒉴'=>'𒉴','𒉵'=>'𒉵','𒉶'=>'𒉶','𒉷'=>'𒉷','𒉸'=>'𒉸','𒉹'=>'𒉹','𒉺'=>'𒉺','𒉻'=>'𒉻','𒉼'=>'𒉼','𒉽'=>'𒉽','𒉾'=>'𒉾','𒉿'=>'𒉿','𒊀'=>'𒊀','𒊁'=>'𒊁','𒊂'=>'𒊂','𒊃'=>'𒊃','𒊄'=>'𒊄','𒊅'=>'𒊅','𒊆'=>'𒊆','𒊇'=>'𒊇','𒊈'=>'𒊈','𒊉'=>'𒊉','𒊊'=>'𒊊','𒊋'=>'𒊋','𒊌'=>'𒊌','𒊍'=>'𒊍','𒊎'=>'𒊎','𒊏'=>'𒊏','𒊐'=>'𒊐','𒊑'=>'𒊑','𒊒'=>'𒊒','𒊓'=>'𒊓','𒊔'=>'𒊔','𒊕'=>'𒊕','𒊖'=>'𒊖','𒊗'=>'𒊗','𒊘'=>'𒊘','𒊙'=>'𒊙','𒊚'=>'𒊚','𒊛'=>'𒊛','𒊜'=>'𒊜','𒊝'=>'𒊝','𒊞'=>'𒊞','𒊟'=>'𒊟','𒊠'=>'𒊠','𒊡'=>'𒊡','𒊢'=>'𒊢','𒊣'=>'𒊣','𒊤'=>'𒊤','𒊥'=>'𒊥','𒊦'=>'𒊦','𒊧'=>'𒊧','𒊨'=>'𒊨','𒊩'=>'𒊩','𒊪'=>'𒊪','𒊫'=>'𒊫','𒊬'=>'𒊬','𒊭'=>'𒊭','𒊮'=>'𒊮','𒊯'=>'𒊯','𒊰'=>'𒊰','𒊱'=>'𒊱','𒊲'=>'𒊲','𒊳'=>'𒊳','𒊴'=>'𒊴','𒊵'=>'𒊵','𒊶'=>'𒊶','𒊷'=>'𒊷','𒊸'=>'𒊸','𒊹'=>'𒊹','𒊺'=>'𒊺','𒊻'=>'𒊻','𒊼'=>'𒊼','𒊽'=>'𒊽','𒊾'=>'𒊾','𒊿'=>'𒊿','𒋀'=>'𒋀','𒋁'=>'𒋁','𒋂'=>'𒋂','𒋃'=>'𒋃','𒋄'=>'𒋄','𒋅'=>'𒋅','𒋆'=>'𒋆','𒋇'=>'𒋇','𒋈'=>'𒋈','𒋉'=>'𒋉','𒋊'=>'𒋊','𒋋'=>'𒋋','𒋌'=>'𒋌','𒋍'=>'𒋍','𒋎'=>'𒋎','𒋏'=>'𒋏','𒋐'=>'𒋐','𒋑'=>'𒋑','𒋒'=>'𒋒','𒋓'=>'𒋓','𒋔'=>'𒋔','𒋕'=>'𒋕','𒋖'=>'𒋖','𒋗'=>'𒋗','𒋘'=>'𒋘','𒋙'=>'𒋙','𒋚'=>'𒋚','𒋛'=>'𒋛','𒋜'=>'𒋜','𒋝'=>'𒋝','𒋞'=>'𒋞','𒋟'=>'𒋟','𒋠'=>'𒋠','𒋡'=>'𒋡','𒋢'=>'𒋢','𒋣'=>'𒋣','𒋤'=>'𒋤','𒋥'=>'𒋥','𒋦'=>'𒋦','𒋧'=>'𒋧','𒋨'=>'𒋨','𒋩'=>'𒋩','𒋪'=>'𒋪','𒋫'=>'𒋫','𒋬'=>'𒋬','𒋭'=>'𒋭','𒋮'=>'𒋮','𒋯'=>'𒋯','𒋰'=>'𒋰','𒋱'=>'𒋱','𒋲'=>'𒋲','𒋳'=>'𒋳','𒋴'=>'𒋴','𒋵'=>'𒋵','𒋶'=>'𒋶','𒋷'=>'𒋷','𒋸'=>'𒋸','𒋹'=>'𒋹','𒋺'=>'𒋺','𒋻'=>'𒋻','𒋼'=>'𒋼','𒋽'=>'𒋽','𒋾'=>'𒋾','𒋿'=>'𒋿','𒌀'=>'𒌀','𒌁'=>'𒌁','𒌂'=>'𒌂','𒌃'=>'𒌃','𒌄'=>'𒌄','𒌅'=>'𒌅','𒌆'=>'𒌆','𒌇'=>'𒌇','𒌈'=>'𒌈','𒌉'=>'𒌉','𒌊'=>'𒌊','𒌋'=>'𒌋','𒌌'=>'𒌌','𒌍'=>'𒌍','𒌎'=>'𒌎','𒌏'=>'𒌏','𒌐'=>'𒌐','𒌑'=>'𒌑','𒌒'=>'𒌒','𒌓'=>'𒌓','𒌔'=>'𒌔','𒌕'=>'𒌕','𒌖'=>'𒌖','𒌗'=>'𒌗','𒌘'=>'𒌘','𒌙'=>'𒌙','𒌚'=>'𒌚','𒌛'=>'𒌛','𒌜'=>'𒌜','𒌝'=>'𒌝','𒌞'=>'𒌞','𒌟'=>'𒌟','𒌠'=>'𒌠','𒌡'=>'𒌡','𒌢'=>'𒌢','𒌣'=>'𒌣','𒌤'=>'𒌤','𒌥'=>'𒌥','𒌦'=>'𒌦','𒌧'=>'𒌧','𒌨'=>'𒌨','𒌩'=>'𒌩','𒌪'=>'𒌪','𒌫'=>'𒌫','𒌬'=>'𒌬','𒌭'=>'𒌭','𒌮'=>'𒌮','𒌯'=>'𒌯','𒌰'=>'𒌰','𒌱'=>'𒌱','𒌲'=>'𒌲','𒌳'=>'𒌳','𒌴'=>'𒌴','𒌵'=>'𒌵','𒌶'=>'𒌶','𒌷'=>'𒌷','𒌸'=>'𒌸','𒌹'=>'𒌹','𒌺'=>'𒌺','𒌻'=>'𒌻','𒌼'=>'𒌼','𒌽'=>'𒌽','𒌾'=>'𒌾','𒌿'=>'𒌿','𒍀'=>'𒍀','𒍁'=>'𒍁','𒍂'=>'𒍂','𒍃'=>'𒍃','𒍄'=>'𒍄','𒍅'=>'𒍅','𒍆'=>'𒍆','𒍇'=>'𒍇','𒍈'=>'𒍈','𒍉'=>'𒍉','𒍊'=>'𒍊','𒍋'=>'𒍋','𒍌'=>'𒍌','𒍍'=>'𒍍','𒍎'=>'𒍎','𒍏'=>'𒍏','𒍐'=>'𒍐','𒍑'=>'𒍑','𒍒'=>'𒍒','𒍓'=>'𒍓','𒍔'=>'𒍔','𒍕'=>'𒍕','𒍖'=>'𒍖','𒍗'=>'𒍗','𒍘'=>'𒍘','𒍙'=>'𒍙','𒍚'=>'𒍚','𒍛'=>'𒍛','𒍜'=>'𒍜','𒍝'=>'𒍝','𒍞'=>'𒍞','𒍟'=>'𒍟','𒍠'=>'𒍠','𒍡'=>'𒍡','𒍢'=>'𒍢','𒍣'=>'𒍣','𒍤'=>'𒍤','𒍥'=>'𒍥','𒍦'=>'𒍦','𒍧'=>'𒍧','𒍨'=>'𒍨','𒍩'=>'𒍩','𒍪'=>'𒍪','𒍫'=>'𒍫','𒍬'=>'𒍬','𒍭'=>'𒍭','𒍮'=>'𒍮','𒐀'=>'2','𒐁'=>'3','𒐂'=>'4','𒐃'=>'5','𒐄'=>'6','𒐅'=>'7','𒐆'=>'8','𒐇'=>'9','𒐈'=>'3','𒐉'=>'4','𒐊'=>'5','𒐋'=>'6','𒐌'=>'7','𒐍'=>'8','𒐎'=>'9','𒐏'=>'4','𒐐'=>'5','𒐑'=>'6','𒐒'=>'7','𒐓'=>'8','𒐔'=>'9','𒐕'=>'1','𒐖'=>'2','𒐗'=>'3','𒐘'=>'4','𒐙'=>'5','𒐚'=>'6','𒐛'=>'7','𒐜'=>'8','𒐝'=>'9','𒐞'=>'1','𒐟'=>'2','𒐠'=>'3','𒐡'=>'4','𒐢'=>'5','𒐣'=>'2','𒐤'=>'3','𒐥'=>'3','𒐦'=>'4','𒐧'=>'5','𒐨'=>'6','𒐩'=>'7','𒐪'=>'8','𒐫'=>'9','𒐬'=>'1','𒐭'=>'2','𒐮'=>'3','𒐯'=>'3','𒐰'=>'4','𒐱'=>'5','𒐲'=>'𒐲','𒐳'=>'𒐳','𒐴'=>'1','𒐵'=>'2','𒐶'=>'3','𒐷'=>'3','𒐸'=>'4','𒐹'=>'5','𒐺'=>'3','𒐻'=>'3','𒐼'=>'4','𒐽'=>'4','𒐾'=>'4','𒐿'=>'4','𒑀'=>'6','𒑁'=>'7','𒑂'=>'7','𒑃'=>'7','𒑄'=>'8','𒑅'=>'8','𒑆'=>'9','𒑇'=>'9','𒑈'=>'9','𒑉'=>'9','𒑊'=>'2','𒑋'=>'3','𒑌'=>'4','𒑍'=>'5','𒑎'=>'6','𒑏'=>'1','𒑐'=>'2','𒑑'=>'3','𒑒'=>'4','𒑓'=>'4','𒑔'=>'5','𒑕'=>'5','𒑖'=>'𒑖','𒑗'=>'𒑗','𒑘'=>'1','𒑙'=>'2','𒑚'=>'1/3','𒑛'=>'2/3','𒑜'=>'5/6','𒑝'=>'1/3','𒑞'=>'2/3','𒑟'=>'1/8','𒑠'=>'1/4','𒑡'=>'1/6','𒑢'=>'1/4');
diff --git a/phpBB/includes/utf/data/search_indexer_4.php b/phpBB/includes/utf/data/search_indexer_4.php
index 51acbff1c2..6697501a89 100644
--- a/phpBB/includes/utf/data/search_indexer_4.php
+++ b/phpBB/includes/utf/data/search_indexer_4.php
@@ -1 +1 @@
-<?php return array('⁰'=>'0','ⁱ'=>'ⁱ','⁴'=>'4','⁵'=>'5','⁶'=>'6','⁷'=>'7','⁸'=>'8','⁹'=>'9','ⁿ'=>'ⁿ','₀'=>'0','₁'=>'1','₂'=>'2','₃'=>'3','₄'=>'4','₅'=>'5','₆'=>'6','₇'=>'7','₈'=>'8','₉'=>'9','ₐ'=>'ₐ','ₑ'=>'ₑ','ₒ'=>'ₒ','ₓ'=>'ₓ','ₔ'=>'ₔ','⃐'=>'⃐','⃑'=>'⃑','⃒'=>'⃒','⃓'=>'⃓','⃔'=>'⃔','⃕'=>'⃕','⃖'=>'⃖','⃗'=>'⃗','⃘'=>'⃘','⃙'=>'⃙','⃚'=>'⃚','⃛'=>'⃛','⃜'=>'⃜','⃝'=>'⃝','⃞'=>'⃞','⃟'=>'⃟','⃠'=>'⃠','⃡'=>'⃡','⃢'=>'⃢','⃣'=>'⃣','⃤'=>'⃤','⃥'=>'⃥','⃦'=>'⃦','⃧'=>'⃧','⃨'=>'⃨','⃩'=>'⃩','⃪'=>'⃪','⃫'=>'⃫','⃬'=>'⃬','⃭'=>'⃭','⃮'=>'⃮','⃯'=>'⃯','ℂ'=>'ℂ','ℇ'=>'ℇ','ℊ'=>'ℊ','ℋ'=>'ℋ','ℌ'=>'ℌ','ℍ'=>'ℍ','ℎ'=>'ℎ','ℏ'=>'ℏ','ℐ'=>'ℐ','ℑ'=>'ℑ','ℒ'=>'ℒ','ℓ'=>'ℓ','ℕ'=>'ℕ','ℙ'=>'ℙ','ℚ'=>'ℚ','ℛ'=>'ℛ','ℜ'=>'ℜ','ℝ'=>'ℝ','ℤ'=>'ℤ','Ω'=>'ω','ℨ'=>'ℨ','K'=>'k','Å'=>'å','ℬ'=>'ℬ','ℭ'=>'ℭ','ℯ'=>'ℯ','ℰ'=>'ℰ','ℱ'=>'ℱ','Ⅎ'=>'ⅎ','ℳ'=>'ℳ','ℴ'=>'ℴ','ℵ'=>'ℵ','ℶ'=>'ℶ','ℷ'=>'ℷ','ℸ'=>'ℸ','ℹ'=>'ℹ','ℼ'=>'ℼ','ℽ'=>'ℽ','ℾ'=>'ℾ','ℿ'=>'ℿ','ⅅ'=>'ⅅ','ⅆ'=>'ⅆ','ⅇ'=>'ⅇ','ⅈ'=>'ⅈ','ⅉ'=>'ⅉ','ⅎ'=>'ⅎ','⅓'=>'1/3','⅔'=>'2/3','⅕'=>'1/5','⅖'=>'2/5','⅗'=>'3/5','⅘'=>'4/5','⅙'=>'1/6','⅚'=>'5/6','⅛'=>'1/8','⅜'=>'3/8','⅝'=>'5/8','⅞'=>'7/8','⅟'=>'1','Ⅰ'=>'1','Ⅱ'=>'2','Ⅲ'=>'3','Ⅳ'=>'4','Ⅴ'=>'5','Ⅵ'=>'6','Ⅶ'=>'7','Ⅷ'=>'8','Ⅸ'=>'9','Ⅹ'=>'10','Ⅺ'=>'11','Ⅻ'=>'12','Ⅼ'=>'50','Ⅽ'=>'100','Ⅾ'=>'500','Ⅿ'=>'1000','ⅰ'=>'1','ⅱ'=>'2','ⅲ'=>'3','ⅳ'=>'4','ⅴ'=>'5','ⅵ'=>'6','ⅶ'=>'7','ⅷ'=>'8','ⅸ'=>'9','ⅹ'=>'10','ⅺ'=>'11','ⅻ'=>'12','ⅼ'=>'50','ⅽ'=>'100','ⅾ'=>'500','ⅿ'=>'1000','ↀ'=>'1000','ↁ'=>'5000','ↂ'=>'10000','Ↄ'=>'ↄ','ↄ'=>'ↄ','①'=>'1','②'=>'2','③'=>'3','④'=>'4','⑤'=>'5','⑥'=>'6','⑦'=>'7','⑧'=>'8','⑨'=>'9','⑩'=>'10','⑪'=>'11','⑫'=>'12','⑬'=>'13','⑭'=>'14','⑮'=>'15','⑯'=>'16','⑰'=>'17','⑱'=>'18','⑲'=>'19','⑳'=>'20','⑴'=>'1','⑵'=>'2','⑶'=>'3','⑷'=>'4','⑸'=>'5','⑹'=>'6','⑺'=>'7','⑻'=>'8','⑼'=>'9','⑽'=>'10','⑾'=>'11','⑿'=>'12','⒀'=>'13','⒁'=>'14','⒂'=>'15','⒃'=>'16','⒄'=>'17','⒅'=>'18','⒆'=>'19','⒇'=>'20','⒈'=>'1','⒉'=>'2','⒊'=>'3','⒋'=>'4','⒌'=>'5','⒍'=>'6','⒎'=>'7','⒏'=>'8','⒐'=>'9','⒑'=>'10','⒒'=>'11','⒓'=>'12','⒔'=>'13','⒕'=>'14','⒖'=>'15','⒗'=>'16','⒘'=>'17','⒙'=>'18','⒚'=>'19','⒛'=>'20','⓪'=>'0','⓫'=>'11','⓬'=>'12','⓭'=>'13','⓮'=>'14','⓯'=>'15','⓰'=>'16','⓱'=>'17','⓲'=>'18','⓳'=>'19','⓴'=>'20','⓵'=>'1','⓶'=>'2','⓷'=>'3','⓸'=>'4','⓹'=>'5','⓺'=>'6','⓻'=>'7','⓼'=>'8','⓽'=>'9','⓾'=>'10','⓿'=>'0','❶'=>'1','❷'=>'2','❸'=>'3','❹'=>'4','❺'=>'5','❻'=>'6','❼'=>'7','❽'=>'8','❾'=>'9','❿'=>'10','➀'=>'1','➁'=>'2','➂'=>'3','➃'=>'4','➄'=>'5','➅'=>'6','➆'=>'7','➇'=>'8','➈'=>'9','➉'=>'10','➊'=>'1','➋'=>'2','➌'=>'3','➍'=>'4','➎'=>'5','➏'=>'6','➐'=>'7','➑'=>'8','➒'=>'9','➓'=>'10'); \ No newline at end of file
+<?php return array('⁰'=>'0','ⁱ'=>'ⁱ','⁴'=>'4','⁵'=>'5','⁶'=>'6','⁷'=>'7','⁸'=>'8','⁹'=>'9','ⁿ'=>'ⁿ','₀'=>'0','₁'=>'1','₂'=>'2','₃'=>'3','₄'=>'4','₅'=>'5','₆'=>'6','₇'=>'7','₈'=>'8','₉'=>'9','ₐ'=>'ₐ','ₑ'=>'ₑ','ₒ'=>'ₒ','ₓ'=>'ₓ','ₔ'=>'ₔ','⃐'=>'⃐','⃑'=>'⃑','⃒'=>'⃒','⃓'=>'⃓','⃔'=>'⃔','⃕'=>'⃕','⃖'=>'⃖','⃗'=>'⃗','⃘'=>'⃘','⃙'=>'⃙','⃚'=>'⃚','⃛'=>'⃛','⃜'=>'⃜','⃝'=>'⃝','⃞'=>'⃞','⃟'=>'⃟','⃠'=>'⃠','⃡'=>'⃡','⃢'=>'⃢','⃣'=>'⃣','⃤'=>'⃤','⃥'=>'⃥','⃦'=>'⃦','⃧'=>'⃧','⃨'=>'⃨','⃩'=>'⃩','⃪'=>'⃪','⃫'=>'⃫','⃬'=>'⃬','⃭'=>'⃭','⃮'=>'⃮','⃯'=>'⃯','ℂ'=>'ℂ','ℇ'=>'ℇ','ℊ'=>'ℊ','ℋ'=>'ℋ','ℌ'=>'ℌ','ℍ'=>'ℍ','ℎ'=>'ℎ','ℏ'=>'ℏ','ℐ'=>'ℐ','ℑ'=>'ℑ','ℒ'=>'ℒ','ℓ'=>'ℓ','ℕ'=>'ℕ','ℙ'=>'ℙ','ℚ'=>'ℚ','ℛ'=>'ℛ','ℜ'=>'ℜ','ℝ'=>'ℝ','ℤ'=>'ℤ','Ω'=>'ω','ℨ'=>'ℨ','K'=>'k','Å'=>'å','ℬ'=>'ℬ','ℭ'=>'ℭ','ℯ'=>'ℯ','ℰ'=>'ℰ','ℱ'=>'ℱ','Ⅎ'=>'ⅎ','ℳ'=>'ℳ','ℴ'=>'ℴ','ℵ'=>'ℵ','ℶ'=>'ℶ','ℷ'=>'ℷ','ℸ'=>'ℸ','ℹ'=>'ℹ','ℼ'=>'ℼ','ℽ'=>'ℽ','ℾ'=>'ℾ','ℿ'=>'ℿ','ⅅ'=>'ⅅ','ⅆ'=>'ⅆ','ⅇ'=>'ⅇ','ⅈ'=>'ⅈ','ⅉ'=>'ⅉ','ⅎ'=>'ⅎ','⅓'=>'1/3','⅔'=>'2/3','⅕'=>'1/5','⅖'=>'2/5','⅗'=>'3/5','⅘'=>'4/5','⅙'=>'1/6','⅚'=>'5/6','⅛'=>'1/8','⅜'=>'3/8','⅝'=>'5/8','⅞'=>'7/8','⅟'=>'1','Ⅰ'=>'1','Ⅱ'=>'2','Ⅲ'=>'3','Ⅳ'=>'4','Ⅴ'=>'5','Ⅵ'=>'6','Ⅶ'=>'7','Ⅷ'=>'8','Ⅸ'=>'9','Ⅹ'=>'10','Ⅺ'=>'11','Ⅻ'=>'12','Ⅼ'=>'50','Ⅽ'=>'100','Ⅾ'=>'500','Ⅿ'=>'1000','ⅰ'=>'1','ⅱ'=>'2','ⅲ'=>'3','ⅳ'=>'4','ⅴ'=>'5','ⅵ'=>'6','ⅶ'=>'7','ⅷ'=>'8','ⅸ'=>'9','ⅹ'=>'10','ⅺ'=>'11','ⅻ'=>'12','ⅼ'=>'50','ⅽ'=>'100','ⅾ'=>'500','ⅿ'=>'1000','ↀ'=>'1000','ↁ'=>'5000','ↂ'=>'10000','Ↄ'=>'ↄ','ↄ'=>'ↄ','①'=>'1','②'=>'2','③'=>'3','④'=>'4','⑤'=>'5','⑥'=>'6','⑦'=>'7','⑧'=>'8','⑨'=>'9','⑩'=>'10','⑪'=>'11','⑫'=>'12','⑬'=>'13','⑭'=>'14','⑮'=>'15','⑯'=>'16','⑰'=>'17','⑱'=>'18','⑲'=>'19','⑳'=>'20','⑴'=>'1','⑵'=>'2','⑶'=>'3','⑷'=>'4','⑸'=>'5','⑹'=>'6','⑺'=>'7','⑻'=>'8','⑼'=>'9','⑽'=>'10','⑾'=>'11','⑿'=>'12','⒀'=>'13','⒁'=>'14','⒂'=>'15','⒃'=>'16','⒄'=>'17','⒅'=>'18','⒆'=>'19','⒇'=>'20','⒈'=>'1','⒉'=>'2','⒊'=>'3','⒋'=>'4','⒌'=>'5','⒍'=>'6','⒎'=>'7','⒏'=>'8','⒐'=>'9','⒑'=>'10','⒒'=>'11','⒓'=>'12','⒔'=>'13','⒕'=>'14','⒖'=>'15','⒗'=>'16','⒘'=>'17','⒙'=>'18','⒚'=>'19','⒛'=>'20','⓪'=>'0','⓫'=>'11','⓬'=>'12','⓭'=>'13','⓮'=>'14','⓯'=>'15','⓰'=>'16','⓱'=>'17','⓲'=>'18','⓳'=>'19','⓴'=>'20','⓵'=>'1','⓶'=>'2','⓷'=>'3','⓸'=>'4','⓹'=>'5','⓺'=>'6','⓻'=>'7','⓼'=>'8','⓽'=>'9','⓾'=>'10','⓿'=>'0','❶'=>'1','❷'=>'2','❸'=>'3','❹'=>'4','❺'=>'5','❻'=>'6','❼'=>'7','❽'=>'8','❾'=>'9','❿'=>'10','➀'=>'1','➁'=>'2','➂'=>'3','➃'=>'4','➄'=>'5','➅'=>'6','➆'=>'7','➇'=>'8','➈'=>'9','➉'=>'10','➊'=>'1','➋'=>'2','➌'=>'3','➍'=>'4','➎'=>'5','➏'=>'6','➐'=>'7','➑'=>'8','➒'=>'9','➓'=>'10');
diff --git a/phpBB/includes/utf/data/search_indexer_448.php b/phpBB/includes/utf/data/search_indexer_448.php
index 32ac28a549..6cbf6643e1 100644
--- a/phpBB/includes/utf/data/search_indexer_448.php
+++ b/phpBB/includes/utf/data/search_indexer_448.php
@@ -1 +1 @@
-<?php return array('󠄀'=>'󠄀','󠄁'=>'󠄁','󠄂'=>'󠄂','󠄃'=>'󠄃','󠄄'=>'󠄄','󠄅'=>'󠄅','󠄆'=>'󠄆','󠄇'=>'󠄇','󠄈'=>'󠄈','󠄉'=>'󠄉','󠄊'=>'󠄊','󠄋'=>'󠄋','󠄌'=>'󠄌','󠄍'=>'󠄍','󠄎'=>'󠄎','󠄏'=>'󠄏','󠄐'=>'󠄐','󠄑'=>'󠄑','󠄒'=>'󠄒','󠄓'=>'󠄓','󠄔'=>'󠄔','󠄕'=>'󠄕','󠄖'=>'󠄖','󠄗'=>'󠄗','󠄘'=>'󠄘','󠄙'=>'󠄙','󠄚'=>'󠄚','󠄛'=>'󠄛','󠄜'=>'󠄜','󠄝'=>'󠄝','󠄞'=>'󠄞','󠄟'=>'󠄟','󠄠'=>'󠄠','󠄡'=>'󠄡','󠄢'=>'󠄢','󠄣'=>'󠄣','󠄤'=>'󠄤','󠄥'=>'󠄥','󠄦'=>'󠄦','󠄧'=>'󠄧','󠄨'=>'󠄨','󠄩'=>'󠄩','󠄪'=>'󠄪','󠄫'=>'󠄫','󠄬'=>'󠄬','󠄭'=>'󠄭','󠄮'=>'󠄮','󠄯'=>'󠄯','󠄰'=>'󠄰','󠄱'=>'󠄱','󠄲'=>'󠄲','󠄳'=>'󠄳','󠄴'=>'󠄴','󠄵'=>'󠄵','󠄶'=>'󠄶','󠄷'=>'󠄷','󠄸'=>'󠄸','󠄹'=>'󠄹','󠄺'=>'󠄺','󠄻'=>'󠄻','󠄼'=>'󠄼','󠄽'=>'󠄽','󠄾'=>'󠄾','󠄿'=>'󠄿','󠅀'=>'󠅀','󠅁'=>'󠅁','󠅂'=>'󠅂','󠅃'=>'󠅃','󠅄'=>'󠅄','󠅅'=>'󠅅','󠅆'=>'󠅆','󠅇'=>'󠅇','󠅈'=>'󠅈','󠅉'=>'󠅉','󠅊'=>'󠅊','󠅋'=>'󠅋','󠅌'=>'󠅌','󠅍'=>'󠅍','󠅎'=>'󠅎','󠅏'=>'󠅏','󠅐'=>'󠅐','󠅑'=>'󠅑','󠅒'=>'󠅒','󠅓'=>'󠅓','󠅔'=>'󠅔','󠅕'=>'󠅕','󠅖'=>'󠅖','󠅗'=>'󠅗','󠅘'=>'󠅘','󠅙'=>'󠅙','󠅚'=>'󠅚','󠅛'=>'󠅛','󠅜'=>'󠅜','󠅝'=>'󠅝','󠅞'=>'󠅞','󠅟'=>'󠅟','󠅠'=>'󠅠','󠅡'=>'󠅡','󠅢'=>'󠅢','󠅣'=>'󠅣','󠅤'=>'󠅤','󠅥'=>'󠅥','󠅦'=>'󠅦','󠅧'=>'󠅧','󠅨'=>'󠅨','󠅩'=>'󠅩','󠅪'=>'󠅪','󠅫'=>'󠅫','󠅬'=>'󠅬','󠅭'=>'󠅭','󠅮'=>'󠅮','󠅯'=>'󠅯','󠅰'=>'󠅰','󠅱'=>'󠅱','󠅲'=>'󠅲','󠅳'=>'󠅳','󠅴'=>'󠅴','󠅵'=>'󠅵','󠅶'=>'󠅶','󠅷'=>'󠅷','󠅸'=>'󠅸','󠅹'=>'󠅹','󠅺'=>'󠅺','󠅻'=>'󠅻','󠅼'=>'󠅼','󠅽'=>'󠅽','󠅾'=>'󠅾','󠅿'=>'󠅿','󠆀'=>'󠆀','󠆁'=>'󠆁','󠆂'=>'󠆂','󠆃'=>'󠆃','󠆄'=>'󠆄','󠆅'=>'󠆅','󠆆'=>'󠆆','󠆇'=>'󠆇','󠆈'=>'󠆈','󠆉'=>'󠆉','󠆊'=>'󠆊','󠆋'=>'󠆋','󠆌'=>'󠆌','󠆍'=>'󠆍','󠆎'=>'󠆎','󠆏'=>'󠆏','󠆐'=>'󠆐','󠆑'=>'󠆑','󠆒'=>'󠆒','󠆓'=>'󠆓','󠆔'=>'󠆔','󠆕'=>'󠆕','󠆖'=>'󠆖','󠆗'=>'󠆗','󠆘'=>'󠆘','󠆙'=>'󠆙','󠆚'=>'󠆚','󠆛'=>'󠆛','󠆜'=>'󠆜','󠆝'=>'󠆝','󠆞'=>'󠆞','󠆟'=>'󠆟','󠆠'=>'󠆠','󠆡'=>'󠆡','󠆢'=>'󠆢','󠆣'=>'󠆣','󠆤'=>'󠆤','󠆥'=>'󠆥','󠆦'=>'󠆦','󠆧'=>'󠆧','󠆨'=>'󠆨','󠆩'=>'󠆩','󠆪'=>'󠆪','󠆫'=>'󠆫','󠆬'=>'󠆬','󠆭'=>'󠆭','󠆮'=>'󠆮','󠆯'=>'󠆯','󠆰'=>'󠆰','󠆱'=>'󠆱','󠆲'=>'󠆲','󠆳'=>'󠆳','󠆴'=>'󠆴','󠆵'=>'󠆵','󠆶'=>'󠆶','󠆷'=>'󠆷','󠆸'=>'󠆸','󠆹'=>'󠆹','󠆺'=>'󠆺','󠆻'=>'󠆻','󠆼'=>'󠆼','󠆽'=>'󠆽','󠆾'=>'󠆾','󠆿'=>'󠆿','󠇀'=>'󠇀','󠇁'=>'󠇁','󠇂'=>'󠇂','󠇃'=>'󠇃','󠇄'=>'󠇄','󠇅'=>'󠇅','󠇆'=>'󠇆','󠇇'=>'󠇇','󠇈'=>'󠇈','󠇉'=>'󠇉','󠇊'=>'󠇊','󠇋'=>'󠇋','󠇌'=>'󠇌','󠇍'=>'󠇍','󠇎'=>'󠇎','󠇏'=>'󠇏','󠇐'=>'󠇐','󠇑'=>'󠇑','󠇒'=>'󠇒','󠇓'=>'󠇓','󠇔'=>'󠇔','󠇕'=>'󠇕','󠇖'=>'󠇖','󠇗'=>'󠇗','󠇘'=>'󠇘','󠇙'=>'󠇙','󠇚'=>'󠇚','󠇛'=>'󠇛','󠇜'=>'󠇜','󠇝'=>'󠇝','󠇞'=>'󠇞','󠇟'=>'󠇟','󠇠'=>'󠇠','󠇡'=>'󠇡','󠇢'=>'󠇢','󠇣'=>'󠇣','󠇤'=>'󠇤','󠇥'=>'󠇥','󠇦'=>'󠇦','󠇧'=>'󠇧','󠇨'=>'󠇨','󠇩'=>'󠇩','󠇪'=>'󠇪','󠇫'=>'󠇫','󠇬'=>'󠇬','󠇭'=>'󠇭','󠇮'=>'󠇮','󠇯'=>'󠇯'); \ No newline at end of file
+<?php return array('󠄀'=>'󠄀','󠄁'=>'󠄁','󠄂'=>'󠄂','󠄃'=>'󠄃','󠄄'=>'󠄄','󠄅'=>'󠄅','󠄆'=>'󠄆','󠄇'=>'󠄇','󠄈'=>'󠄈','󠄉'=>'󠄉','󠄊'=>'󠄊','󠄋'=>'󠄋','󠄌'=>'󠄌','󠄍'=>'󠄍','󠄎'=>'󠄎','󠄏'=>'󠄏','󠄐'=>'󠄐','󠄑'=>'󠄑','󠄒'=>'󠄒','󠄓'=>'󠄓','󠄔'=>'󠄔','󠄕'=>'󠄕','󠄖'=>'󠄖','󠄗'=>'󠄗','󠄘'=>'󠄘','󠄙'=>'󠄙','󠄚'=>'󠄚','󠄛'=>'󠄛','󠄜'=>'󠄜','󠄝'=>'󠄝','󠄞'=>'󠄞','󠄟'=>'󠄟','󠄠'=>'󠄠','󠄡'=>'󠄡','󠄢'=>'󠄢','󠄣'=>'󠄣','󠄤'=>'󠄤','󠄥'=>'󠄥','󠄦'=>'󠄦','󠄧'=>'󠄧','󠄨'=>'󠄨','󠄩'=>'󠄩','󠄪'=>'󠄪','󠄫'=>'󠄫','󠄬'=>'󠄬','󠄭'=>'󠄭','󠄮'=>'󠄮','󠄯'=>'󠄯','󠄰'=>'󠄰','󠄱'=>'󠄱','󠄲'=>'󠄲','󠄳'=>'󠄳','󠄴'=>'󠄴','󠄵'=>'󠄵','󠄶'=>'󠄶','󠄷'=>'󠄷','󠄸'=>'󠄸','󠄹'=>'󠄹','󠄺'=>'󠄺','󠄻'=>'󠄻','󠄼'=>'󠄼','󠄽'=>'󠄽','󠄾'=>'󠄾','󠄿'=>'󠄿','󠅀'=>'󠅀','󠅁'=>'󠅁','󠅂'=>'󠅂','󠅃'=>'󠅃','󠅄'=>'󠅄','󠅅'=>'󠅅','󠅆'=>'󠅆','󠅇'=>'󠅇','󠅈'=>'󠅈','󠅉'=>'󠅉','󠅊'=>'󠅊','󠅋'=>'󠅋','󠅌'=>'󠅌','󠅍'=>'󠅍','󠅎'=>'󠅎','󠅏'=>'󠅏','󠅐'=>'󠅐','󠅑'=>'󠅑','󠅒'=>'󠅒','󠅓'=>'󠅓','󠅔'=>'󠅔','󠅕'=>'󠅕','󠅖'=>'󠅖','󠅗'=>'󠅗','󠅘'=>'󠅘','󠅙'=>'󠅙','󠅚'=>'󠅚','󠅛'=>'󠅛','󠅜'=>'󠅜','󠅝'=>'󠅝','󠅞'=>'󠅞','󠅟'=>'󠅟','󠅠'=>'󠅠','󠅡'=>'󠅡','󠅢'=>'󠅢','󠅣'=>'󠅣','󠅤'=>'󠅤','󠅥'=>'󠅥','󠅦'=>'󠅦','󠅧'=>'󠅧','󠅨'=>'󠅨','󠅩'=>'󠅩','󠅪'=>'󠅪','󠅫'=>'󠅫','󠅬'=>'󠅬','󠅭'=>'󠅭','󠅮'=>'󠅮','󠅯'=>'󠅯','󠅰'=>'󠅰','󠅱'=>'󠅱','󠅲'=>'󠅲','󠅳'=>'󠅳','󠅴'=>'󠅴','󠅵'=>'󠅵','󠅶'=>'󠅶','󠅷'=>'󠅷','󠅸'=>'󠅸','󠅹'=>'󠅹','󠅺'=>'󠅺','󠅻'=>'󠅻','󠅼'=>'󠅼','󠅽'=>'󠅽','󠅾'=>'󠅾','󠅿'=>'󠅿','󠆀'=>'󠆀','󠆁'=>'󠆁','󠆂'=>'󠆂','󠆃'=>'󠆃','󠆄'=>'󠆄','󠆅'=>'󠆅','󠆆'=>'󠆆','󠆇'=>'󠆇','󠆈'=>'󠆈','󠆉'=>'󠆉','󠆊'=>'󠆊','󠆋'=>'󠆋','󠆌'=>'󠆌','󠆍'=>'󠆍','󠆎'=>'󠆎','󠆏'=>'󠆏','󠆐'=>'󠆐','󠆑'=>'󠆑','󠆒'=>'󠆒','󠆓'=>'󠆓','󠆔'=>'󠆔','󠆕'=>'󠆕','󠆖'=>'󠆖','󠆗'=>'󠆗','󠆘'=>'󠆘','󠆙'=>'󠆙','󠆚'=>'󠆚','󠆛'=>'󠆛','󠆜'=>'󠆜','󠆝'=>'󠆝','󠆞'=>'󠆞','󠆟'=>'󠆟','󠆠'=>'󠆠','󠆡'=>'󠆡','󠆢'=>'󠆢','󠆣'=>'󠆣','󠆤'=>'󠆤','󠆥'=>'󠆥','󠆦'=>'󠆦','󠆧'=>'󠆧','󠆨'=>'󠆨','󠆩'=>'󠆩','󠆪'=>'󠆪','󠆫'=>'󠆫','󠆬'=>'󠆬','󠆭'=>'󠆭','󠆮'=>'󠆮','󠆯'=>'󠆯','󠆰'=>'󠆰','󠆱'=>'󠆱','󠆲'=>'󠆲','󠆳'=>'󠆳','󠆴'=>'󠆴','󠆵'=>'󠆵','󠆶'=>'󠆶','󠆷'=>'󠆷','󠆸'=>'󠆸','󠆹'=>'󠆹','󠆺'=>'󠆺','󠆻'=>'󠆻','󠆼'=>'󠆼','󠆽'=>'󠆽','󠆾'=>'󠆾','󠆿'=>'󠆿','󠇀'=>'󠇀','󠇁'=>'󠇁','󠇂'=>'󠇂','󠇃'=>'󠇃','󠇄'=>'󠇄','󠇅'=>'󠇅','󠇆'=>'󠇆','󠇇'=>'󠇇','󠇈'=>'󠇈','󠇉'=>'󠇉','󠇊'=>'󠇊','󠇋'=>'󠇋','󠇌'=>'󠇌','󠇍'=>'󠇍','󠇎'=>'󠇎','󠇏'=>'󠇏','󠇐'=>'󠇐','󠇑'=>'󠇑','󠇒'=>'󠇒','󠇓'=>'󠇓','󠇔'=>'󠇔','󠇕'=>'󠇕','󠇖'=>'󠇖','󠇗'=>'󠇗','󠇘'=>'󠇘','󠇙'=>'󠇙','󠇚'=>'󠇚','󠇛'=>'󠇛','󠇜'=>'󠇜','󠇝'=>'󠇝','󠇞'=>'󠇞','󠇟'=>'󠇟','󠇠'=>'󠇠','󠇡'=>'󠇡','󠇢'=>'󠇢','󠇣'=>'󠇣','󠇤'=>'󠇤','󠇥'=>'󠇥','󠇦'=>'󠇦','󠇧'=>'󠇧','󠇨'=>'󠇨','󠇩'=>'󠇩','󠇪'=>'󠇪','󠇫'=>'󠇫','󠇬'=>'󠇬','󠇭'=>'󠇭','󠇮'=>'󠇮','󠇯'=>'󠇯');
diff --git a/phpBB/includes/utf/data/search_indexer_5.php b/phpBB/includes/utf/data/search_indexer_5.php
index 0f1228a394..cef8fe91fc 100644
--- a/phpBB/includes/utf/data/search_indexer_5.php
+++ b/phpBB/includes/utf/data/search_indexer_5.php
@@ -1 +1 @@
-<?php return array('Ⰰ'=>'ⰰ','Ⰱ'=>'ⰱ','Ⰲ'=>'ⰲ','Ⰳ'=>'ⰳ','Ⰴ'=>'ⰴ','Ⰵ'=>'ⰵ','Ⰶ'=>'ⰶ','Ⰷ'=>'ⰷ','Ⰸ'=>'ⰸ','Ⰹ'=>'ⰹ','Ⰺ'=>'ⰺ','Ⰻ'=>'ⰻ','Ⰼ'=>'ⰼ','Ⰽ'=>'ⰽ','Ⰾ'=>'ⰾ','Ⰿ'=>'ⰿ','Ⱀ'=>'ⱀ','Ⱁ'=>'ⱁ','Ⱂ'=>'ⱂ','Ⱃ'=>'ⱃ','Ⱄ'=>'ⱄ','Ⱅ'=>'ⱅ','Ⱆ'=>'ⱆ','Ⱇ'=>'ⱇ','Ⱈ'=>'ⱈ','Ⱉ'=>'ⱉ','Ⱊ'=>'ⱊ','Ⱋ'=>'ⱋ','Ⱌ'=>'ⱌ','Ⱍ'=>'ⱍ','Ⱎ'=>'ⱎ','Ⱏ'=>'ⱏ','Ⱐ'=>'ⱐ','Ⱑ'=>'ⱑ','Ⱒ'=>'ⱒ','Ⱓ'=>'ⱓ','Ⱔ'=>'ⱔ','Ⱕ'=>'ⱕ','Ⱖ'=>'ⱖ','Ⱗ'=>'ⱗ','Ⱘ'=>'ⱘ','Ⱙ'=>'ⱙ','Ⱚ'=>'ⱚ','Ⱛ'=>'ⱛ','Ⱜ'=>'ⱜ','Ⱝ'=>'ⱝ','Ⱞ'=>'ⱞ','ⰰ'=>'ⰰ','ⰱ'=>'ⰱ','ⰲ'=>'ⰲ','ⰳ'=>'ⰳ','ⰴ'=>'ⰴ','ⰵ'=>'ⰵ','ⰶ'=>'ⰶ','ⰷ'=>'ⰷ','ⰸ'=>'ⰸ','ⰹ'=>'ⰹ','ⰺ'=>'ⰺ','ⰻ'=>'ⰻ','ⰼ'=>'ⰼ','ⰽ'=>'ⰽ','ⰾ'=>'ⰾ','ⰿ'=>'ⰿ','ⱀ'=>'ⱀ','ⱁ'=>'ⱁ','ⱂ'=>'ⱂ','ⱃ'=>'ⱃ','ⱄ'=>'ⱄ','ⱅ'=>'ⱅ','ⱆ'=>'ⱆ','ⱇ'=>'ⱇ','ⱈ'=>'ⱈ','ⱉ'=>'ⱉ','ⱊ'=>'ⱊ','ⱋ'=>'ⱋ','ⱌ'=>'ⱌ','ⱍ'=>'ⱍ','ⱎ'=>'ⱎ','ⱏ'=>'ⱏ','ⱐ'=>'ⱐ','ⱑ'=>'ⱑ','ⱒ'=>'ⱒ','ⱓ'=>'ⱓ','ⱔ'=>'ⱔ','ⱕ'=>'ⱕ','ⱖ'=>'ⱖ','ⱗ'=>'ⱗ','ⱘ'=>'ⱘ','ⱙ'=>'ⱙ','ⱚ'=>'ⱚ','ⱛ'=>'ⱛ','ⱜ'=>'ⱜ','ⱝ'=>'ⱝ','ⱞ'=>'ⱞ','Ⱡ'=>'ⱡ','ⱡ'=>'ⱡ','Ɫ'=>'ɫ','Ᵽ'=>'ᵽ','Ɽ'=>'ɽ','ⱥ'=>'ⱥ','ⱦ'=>'ⱦ','Ⱨ'=>'ⱨ','ⱨ'=>'ⱨ','Ⱪ'=>'ⱪ','ⱪ'=>'ⱪ','Ⱬ'=>'ⱬ','ⱬ'=>'ⱬ','ⱴ'=>'ⱴ','Ⱶ'=>'ⱶ','ⱶ'=>'ⱶ','ⱷ'=>'ⱷ','Ⲁ'=>'ⲁ','ⲁ'=>'ⲁ','Ⲃ'=>'ⲃ','ⲃ'=>'ⲃ','Ⲅ'=>'ⲅ','ⲅ'=>'ⲅ','Ⲇ'=>'ⲇ','ⲇ'=>'ⲇ','Ⲉ'=>'ⲉ','ⲉ'=>'ⲉ','Ⲋ'=>'ⲋ','ⲋ'=>'ⲋ','Ⲍ'=>'ⲍ','ⲍ'=>'ⲍ','Ⲏ'=>'ⲏ','ⲏ'=>'ⲏ','Ⲑ'=>'ⲑ','ⲑ'=>'ⲑ','Ⲓ'=>'ⲓ','ⲓ'=>'ⲓ','Ⲕ'=>'ⲕ','ⲕ'=>'ⲕ','Ⲗ'=>'ⲗ','ⲗ'=>'ⲗ','Ⲙ'=>'ⲙ','ⲙ'=>'ⲙ','Ⲛ'=>'ⲛ','ⲛ'=>'ⲛ','Ⲝ'=>'ⲝ','ⲝ'=>'ⲝ','Ⲟ'=>'ⲟ','ⲟ'=>'ⲟ','Ⲡ'=>'ⲡ','ⲡ'=>'ⲡ','Ⲣ'=>'ⲣ','ⲣ'=>'ⲣ','Ⲥ'=>'ⲥ','ⲥ'=>'ⲥ','Ⲧ'=>'ⲧ','ⲧ'=>'ⲧ','Ⲩ'=>'ⲩ','ⲩ'=>'ⲩ','Ⲫ'=>'ⲫ','ⲫ'=>'ⲫ','Ⲭ'=>'ⲭ','ⲭ'=>'ⲭ','Ⲯ'=>'ⲯ','ⲯ'=>'ⲯ','Ⲱ'=>'ⲱ','ⲱ'=>'ⲱ','Ⲳ'=>'ⲳ','ⲳ'=>'ⲳ','Ⲵ'=>'ⲵ','ⲵ'=>'ⲵ','Ⲷ'=>'ⲷ','ⲷ'=>'ⲷ','Ⲹ'=>'ⲹ','ⲹ'=>'ⲹ','Ⲻ'=>'ⲻ','ⲻ'=>'ⲻ','Ⲽ'=>'ⲽ','ⲽ'=>'ⲽ','Ⲿ'=>'ⲿ','ⲿ'=>'ⲿ','Ⳁ'=>'ⳁ','ⳁ'=>'ⳁ','Ⳃ'=>'ⳃ','ⳃ'=>'ⳃ','Ⳅ'=>'ⳅ','ⳅ'=>'ⳅ','Ⳇ'=>'ⳇ','ⳇ'=>'ⳇ','Ⳉ'=>'ⳉ','ⳉ'=>'ⳉ','Ⳋ'=>'ⳋ','ⳋ'=>'ⳋ','Ⳍ'=>'ⳍ','ⳍ'=>'ⳍ','Ⳏ'=>'ⳏ','ⳏ'=>'ⳏ','Ⳑ'=>'ⳑ','ⳑ'=>'ⳑ','Ⳓ'=>'ⳓ','ⳓ'=>'ⳓ','Ⳕ'=>'ⳕ','ⳕ'=>'ⳕ','Ⳗ'=>'ⳗ','ⳗ'=>'ⳗ','Ⳙ'=>'ⳙ','ⳙ'=>'ⳙ','Ⳛ'=>'ⳛ','ⳛ'=>'ⳛ','Ⳝ'=>'ⳝ','ⳝ'=>'ⳝ','Ⳟ'=>'ⳟ','ⳟ'=>'ⳟ','Ⳡ'=>'ⳡ','ⳡ'=>'ⳡ','Ⳣ'=>'ⳣ','ⳣ'=>'ⳣ','ⳤ'=>'ⳤ','⳽'=>'1/2','ⴀ'=>'ⴀ','ⴁ'=>'ⴁ','ⴂ'=>'ⴂ','ⴃ'=>'ⴃ','ⴄ'=>'ⴄ','ⴅ'=>'ⴅ','ⴆ'=>'ⴆ','ⴇ'=>'ⴇ','ⴈ'=>'ⴈ','ⴉ'=>'ⴉ','ⴊ'=>'ⴊ','ⴋ'=>'ⴋ','ⴌ'=>'ⴌ','ⴍ'=>'ⴍ','ⴎ'=>'ⴎ','ⴏ'=>'ⴏ','ⴐ'=>'ⴐ','ⴑ'=>'ⴑ','ⴒ'=>'ⴒ','ⴓ'=>'ⴓ','ⴔ'=>'ⴔ','ⴕ'=>'ⴕ','ⴖ'=>'ⴖ','ⴗ'=>'ⴗ','ⴘ'=>'ⴘ','ⴙ'=>'ⴙ','ⴚ'=>'ⴚ','ⴛ'=>'ⴛ','ⴜ'=>'ⴜ','ⴝ'=>'ⴝ','ⴞ'=>'ⴞ','ⴟ'=>'ⴟ','ⴠ'=>'ⴠ','ⴡ'=>'ⴡ','ⴢ'=>'ⴢ','ⴣ'=>'ⴣ','ⴤ'=>'ⴤ','ⴥ'=>'ⴥ','ⴰ'=>'ⴰ','ⴱ'=>'ⴱ','ⴲ'=>'ⴲ','ⴳ'=>'ⴳ','ⴴ'=>'ⴴ','ⴵ'=>'ⴵ','ⴶ'=>'ⴶ','ⴷ'=>'ⴷ','ⴸ'=>'ⴸ','ⴹ'=>'ⴹ','ⴺ'=>'ⴺ','ⴻ'=>'ⴻ','ⴼ'=>'ⴼ','ⴽ'=>'ⴽ','ⴾ'=>'ⴾ','ⴿ'=>'ⴿ','ⵀ'=>'ⵀ','ⵁ'=>'ⵁ','ⵂ'=>'ⵂ','ⵃ'=>'ⵃ','ⵄ'=>'ⵄ','ⵅ'=>'ⵅ','ⵆ'=>'ⵆ','ⵇ'=>'ⵇ','ⵈ'=>'ⵈ','ⵉ'=>'ⵉ','ⵊ'=>'ⵊ','ⵋ'=>'ⵋ','ⵌ'=>'ⵌ','ⵍ'=>'ⵍ','ⵎ'=>'ⵎ','ⵏ'=>'ⵏ','ⵐ'=>'ⵐ','ⵑ'=>'ⵑ','ⵒ'=>'ⵒ','ⵓ'=>'ⵓ','ⵔ'=>'ⵔ','ⵕ'=>'ⵕ','ⵖ'=>'ⵖ','ⵗ'=>'ⵗ','ⵘ'=>'ⵘ','ⵙ'=>'ⵙ','ⵚ'=>'ⵚ','ⵛ'=>'ⵛ','ⵜ'=>'ⵜ','ⵝ'=>'ⵝ','ⵞ'=>'ⵞ','ⵟ'=>'ⵟ','ⵠ'=>'ⵠ','ⵡ'=>'ⵡ','ⵢ'=>'ⵢ','ⵣ'=>'ⵣ','ⵤ'=>'ⵤ','ⵥ'=>'ⵥ','ⵯ'=>'ⵯ','ⶀ'=>'ⶀ','ⶁ'=>'ⶁ','ⶂ'=>'ⶂ','ⶃ'=>'ⶃ','ⶄ'=>'ⶄ','ⶅ'=>'ⶅ','ⶆ'=>'ⶆ','ⶇ'=>'ⶇ','ⶈ'=>'ⶈ','ⶉ'=>'ⶉ','ⶊ'=>'ⶊ','ⶋ'=>'ⶋ','ⶌ'=>'ⶌ','ⶍ'=>'ⶍ','ⶎ'=>'ⶎ','ⶏ'=>'ⶏ','ⶐ'=>'ⶐ','ⶑ'=>'ⶑ','ⶒ'=>'ⶒ','ⶓ'=>'ⶓ','ⶔ'=>'ⶔ','ⶕ'=>'ⶕ','ⶖ'=>'ⶖ','ⶠ'=>'ⶠ','ⶡ'=>'ⶡ','ⶢ'=>'ⶢ','ⶣ'=>'ⶣ','ⶤ'=>'ⶤ','ⶥ'=>'ⶥ','ⶦ'=>'ⶦ','ⶨ'=>'ⶨ','ⶩ'=>'ⶩ','ⶪ'=>'ⶪ','ⶫ'=>'ⶫ','ⶬ'=>'ⶬ','ⶭ'=>'ⶭ','ⶮ'=>'ⶮ','ⶰ'=>'ⶰ','ⶱ'=>'ⶱ','ⶲ'=>'ⶲ','ⶳ'=>'ⶳ','ⶴ'=>'ⶴ','ⶵ'=>'ⶵ','ⶶ'=>'ⶶ','ⶸ'=>'ⶸ','ⶹ'=>'ⶹ','ⶺ'=>'ⶺ','ⶻ'=>'ⶻ','ⶼ'=>'ⶼ','ⶽ'=>'ⶽ','ⶾ'=>'ⶾ','ⷀ'=>'ⷀ','ⷁ'=>'ⷁ','ⷂ'=>'ⷂ','ⷃ'=>'ⷃ','ⷄ'=>'ⷄ','ⷅ'=>'ⷅ','ⷆ'=>'ⷆ','ⷈ'=>'ⷈ','ⷉ'=>'ⷉ','ⷊ'=>'ⷊ','ⷋ'=>'ⷋ','ⷌ'=>'ⷌ','ⷍ'=>'ⷍ','ⷎ'=>'ⷎ','ⷐ'=>'ⷐ','ⷑ'=>'ⷑ','ⷒ'=>'ⷒ','ⷓ'=>'ⷓ','ⷔ'=>'ⷔ','ⷕ'=>'ⷕ','ⷖ'=>'ⷖ','ⷘ'=>'ⷘ','ⷙ'=>'ⷙ','ⷚ'=>'ⷚ','ⷛ'=>'ⷛ','ⷜ'=>'ⷜ','ⷝ'=>'ⷝ','ⷞ'=>'ⷞ'); \ No newline at end of file
+<?php return array('Ⰰ'=>'ⰰ','Ⰱ'=>'ⰱ','Ⰲ'=>'ⰲ','Ⰳ'=>'ⰳ','Ⰴ'=>'ⰴ','Ⰵ'=>'ⰵ','Ⰶ'=>'ⰶ','Ⰷ'=>'ⰷ','Ⰸ'=>'ⰸ','Ⰹ'=>'ⰹ','Ⰺ'=>'ⰺ','Ⰻ'=>'ⰻ','Ⰼ'=>'ⰼ','Ⰽ'=>'ⰽ','Ⰾ'=>'ⰾ','Ⰿ'=>'ⰿ','Ⱀ'=>'ⱀ','Ⱁ'=>'ⱁ','Ⱂ'=>'ⱂ','Ⱃ'=>'ⱃ','Ⱄ'=>'ⱄ','Ⱅ'=>'ⱅ','Ⱆ'=>'ⱆ','Ⱇ'=>'ⱇ','Ⱈ'=>'ⱈ','Ⱉ'=>'ⱉ','Ⱊ'=>'ⱊ','Ⱋ'=>'ⱋ','Ⱌ'=>'ⱌ','Ⱍ'=>'ⱍ','Ⱎ'=>'ⱎ','Ⱏ'=>'ⱏ','Ⱐ'=>'ⱐ','Ⱑ'=>'ⱑ','Ⱒ'=>'ⱒ','Ⱓ'=>'ⱓ','Ⱔ'=>'ⱔ','Ⱕ'=>'ⱕ','Ⱖ'=>'ⱖ','Ⱗ'=>'ⱗ','Ⱘ'=>'ⱘ','Ⱙ'=>'ⱙ','Ⱚ'=>'ⱚ','Ⱛ'=>'ⱛ','Ⱜ'=>'ⱜ','Ⱝ'=>'ⱝ','Ⱞ'=>'ⱞ','ⰰ'=>'ⰰ','ⰱ'=>'ⰱ','ⰲ'=>'ⰲ','ⰳ'=>'ⰳ','ⰴ'=>'ⰴ','ⰵ'=>'ⰵ','ⰶ'=>'ⰶ','ⰷ'=>'ⰷ','ⰸ'=>'ⰸ','ⰹ'=>'ⰹ','ⰺ'=>'ⰺ','ⰻ'=>'ⰻ','ⰼ'=>'ⰼ','ⰽ'=>'ⰽ','ⰾ'=>'ⰾ','ⰿ'=>'ⰿ','ⱀ'=>'ⱀ','ⱁ'=>'ⱁ','ⱂ'=>'ⱂ','ⱃ'=>'ⱃ','ⱄ'=>'ⱄ','ⱅ'=>'ⱅ','ⱆ'=>'ⱆ','ⱇ'=>'ⱇ','ⱈ'=>'ⱈ','ⱉ'=>'ⱉ','ⱊ'=>'ⱊ','ⱋ'=>'ⱋ','ⱌ'=>'ⱌ','ⱍ'=>'ⱍ','ⱎ'=>'ⱎ','ⱏ'=>'ⱏ','ⱐ'=>'ⱐ','ⱑ'=>'ⱑ','ⱒ'=>'ⱒ','ⱓ'=>'ⱓ','ⱔ'=>'ⱔ','ⱕ'=>'ⱕ','ⱖ'=>'ⱖ','ⱗ'=>'ⱗ','ⱘ'=>'ⱘ','ⱙ'=>'ⱙ','ⱚ'=>'ⱚ','ⱛ'=>'ⱛ','ⱜ'=>'ⱜ','ⱝ'=>'ⱝ','ⱞ'=>'ⱞ','Ⱡ'=>'ⱡ','ⱡ'=>'ⱡ','Ɫ'=>'ɫ','Ᵽ'=>'ᵽ','Ɽ'=>'ɽ','ⱥ'=>'ⱥ','ⱦ'=>'ⱦ','Ⱨ'=>'ⱨ','ⱨ'=>'ⱨ','Ⱪ'=>'ⱪ','ⱪ'=>'ⱪ','Ⱬ'=>'ⱬ','ⱬ'=>'ⱬ','ⱴ'=>'ⱴ','Ⱶ'=>'ⱶ','ⱶ'=>'ⱶ','ⱷ'=>'ⱷ','Ⲁ'=>'ⲁ','ⲁ'=>'ⲁ','Ⲃ'=>'ⲃ','ⲃ'=>'ⲃ','Ⲅ'=>'ⲅ','ⲅ'=>'ⲅ','Ⲇ'=>'ⲇ','ⲇ'=>'ⲇ','Ⲉ'=>'ⲉ','ⲉ'=>'ⲉ','Ⲋ'=>'ⲋ','ⲋ'=>'ⲋ','Ⲍ'=>'ⲍ','ⲍ'=>'ⲍ','Ⲏ'=>'ⲏ','ⲏ'=>'ⲏ','Ⲑ'=>'ⲑ','ⲑ'=>'ⲑ','Ⲓ'=>'ⲓ','ⲓ'=>'ⲓ','Ⲕ'=>'ⲕ','ⲕ'=>'ⲕ','Ⲗ'=>'ⲗ','ⲗ'=>'ⲗ','Ⲙ'=>'ⲙ','ⲙ'=>'ⲙ','Ⲛ'=>'ⲛ','ⲛ'=>'ⲛ','Ⲝ'=>'ⲝ','ⲝ'=>'ⲝ','Ⲟ'=>'ⲟ','ⲟ'=>'ⲟ','Ⲡ'=>'ⲡ','ⲡ'=>'ⲡ','Ⲣ'=>'ⲣ','ⲣ'=>'ⲣ','Ⲥ'=>'ⲥ','ⲥ'=>'ⲥ','Ⲧ'=>'ⲧ','ⲧ'=>'ⲧ','Ⲩ'=>'ⲩ','ⲩ'=>'ⲩ','Ⲫ'=>'ⲫ','ⲫ'=>'ⲫ','Ⲭ'=>'ⲭ','ⲭ'=>'ⲭ','Ⲯ'=>'ⲯ','ⲯ'=>'ⲯ','Ⲱ'=>'ⲱ','ⲱ'=>'ⲱ','Ⲳ'=>'ⲳ','ⲳ'=>'ⲳ','Ⲵ'=>'ⲵ','ⲵ'=>'ⲵ','Ⲷ'=>'ⲷ','ⲷ'=>'ⲷ','Ⲹ'=>'ⲹ','ⲹ'=>'ⲹ','Ⲻ'=>'ⲻ','ⲻ'=>'ⲻ','Ⲽ'=>'ⲽ','ⲽ'=>'ⲽ','Ⲿ'=>'ⲿ','ⲿ'=>'ⲿ','Ⳁ'=>'ⳁ','ⳁ'=>'ⳁ','Ⳃ'=>'ⳃ','ⳃ'=>'ⳃ','Ⳅ'=>'ⳅ','ⳅ'=>'ⳅ','Ⳇ'=>'ⳇ','ⳇ'=>'ⳇ','Ⳉ'=>'ⳉ','ⳉ'=>'ⳉ','Ⳋ'=>'ⳋ','ⳋ'=>'ⳋ','Ⳍ'=>'ⳍ','ⳍ'=>'ⳍ','Ⳏ'=>'ⳏ','ⳏ'=>'ⳏ','Ⳑ'=>'ⳑ','ⳑ'=>'ⳑ','Ⳓ'=>'ⳓ','ⳓ'=>'ⳓ','Ⳕ'=>'ⳕ','ⳕ'=>'ⳕ','Ⳗ'=>'ⳗ','ⳗ'=>'ⳗ','Ⳙ'=>'ⳙ','ⳙ'=>'ⳙ','Ⳛ'=>'ⳛ','ⳛ'=>'ⳛ','Ⳝ'=>'ⳝ','ⳝ'=>'ⳝ','Ⳟ'=>'ⳟ','ⳟ'=>'ⳟ','Ⳡ'=>'ⳡ','ⳡ'=>'ⳡ','Ⳣ'=>'ⳣ','ⳣ'=>'ⳣ','ⳤ'=>'ⳤ','⳽'=>'1/2','ⴀ'=>'ⴀ','ⴁ'=>'ⴁ','ⴂ'=>'ⴂ','ⴃ'=>'ⴃ','ⴄ'=>'ⴄ','ⴅ'=>'ⴅ','ⴆ'=>'ⴆ','ⴇ'=>'ⴇ','ⴈ'=>'ⴈ','ⴉ'=>'ⴉ','ⴊ'=>'ⴊ','ⴋ'=>'ⴋ','ⴌ'=>'ⴌ','ⴍ'=>'ⴍ','ⴎ'=>'ⴎ','ⴏ'=>'ⴏ','ⴐ'=>'ⴐ','ⴑ'=>'ⴑ','ⴒ'=>'ⴒ','ⴓ'=>'ⴓ','ⴔ'=>'ⴔ','ⴕ'=>'ⴕ','ⴖ'=>'ⴖ','ⴗ'=>'ⴗ','ⴘ'=>'ⴘ','ⴙ'=>'ⴙ','ⴚ'=>'ⴚ','ⴛ'=>'ⴛ','ⴜ'=>'ⴜ','ⴝ'=>'ⴝ','ⴞ'=>'ⴞ','ⴟ'=>'ⴟ','ⴠ'=>'ⴠ','ⴡ'=>'ⴡ','ⴢ'=>'ⴢ','ⴣ'=>'ⴣ','ⴤ'=>'ⴤ','ⴥ'=>'ⴥ','ⴰ'=>'ⴰ','ⴱ'=>'ⴱ','ⴲ'=>'ⴲ','ⴳ'=>'ⴳ','ⴴ'=>'ⴴ','ⴵ'=>'ⴵ','ⴶ'=>'ⴶ','ⴷ'=>'ⴷ','ⴸ'=>'ⴸ','ⴹ'=>'ⴹ','ⴺ'=>'ⴺ','ⴻ'=>'ⴻ','ⴼ'=>'ⴼ','ⴽ'=>'ⴽ','ⴾ'=>'ⴾ','ⴿ'=>'ⴿ','ⵀ'=>'ⵀ','ⵁ'=>'ⵁ','ⵂ'=>'ⵂ','ⵃ'=>'ⵃ','ⵄ'=>'ⵄ','ⵅ'=>'ⵅ','ⵆ'=>'ⵆ','ⵇ'=>'ⵇ','ⵈ'=>'ⵈ','ⵉ'=>'ⵉ','ⵊ'=>'ⵊ','ⵋ'=>'ⵋ','ⵌ'=>'ⵌ','ⵍ'=>'ⵍ','ⵎ'=>'ⵎ','ⵏ'=>'ⵏ','ⵐ'=>'ⵐ','ⵑ'=>'ⵑ','ⵒ'=>'ⵒ','ⵓ'=>'ⵓ','ⵔ'=>'ⵔ','ⵕ'=>'ⵕ','ⵖ'=>'ⵖ','ⵗ'=>'ⵗ','ⵘ'=>'ⵘ','ⵙ'=>'ⵙ','ⵚ'=>'ⵚ','ⵛ'=>'ⵛ','ⵜ'=>'ⵜ','ⵝ'=>'ⵝ','ⵞ'=>'ⵞ','ⵟ'=>'ⵟ','ⵠ'=>'ⵠ','ⵡ'=>'ⵡ','ⵢ'=>'ⵢ','ⵣ'=>'ⵣ','ⵤ'=>'ⵤ','ⵥ'=>'ⵥ','ⵯ'=>'ⵯ','ⶀ'=>'ⶀ','ⶁ'=>'ⶁ','ⶂ'=>'ⶂ','ⶃ'=>'ⶃ','ⶄ'=>'ⶄ','ⶅ'=>'ⶅ','ⶆ'=>'ⶆ','ⶇ'=>'ⶇ','ⶈ'=>'ⶈ','ⶉ'=>'ⶉ','ⶊ'=>'ⶊ','ⶋ'=>'ⶋ','ⶌ'=>'ⶌ','ⶍ'=>'ⶍ','ⶎ'=>'ⶎ','ⶏ'=>'ⶏ','ⶐ'=>'ⶐ','ⶑ'=>'ⶑ','ⶒ'=>'ⶒ','ⶓ'=>'ⶓ','ⶔ'=>'ⶔ','ⶕ'=>'ⶕ','ⶖ'=>'ⶖ','ⶠ'=>'ⶠ','ⶡ'=>'ⶡ','ⶢ'=>'ⶢ','ⶣ'=>'ⶣ','ⶤ'=>'ⶤ','ⶥ'=>'ⶥ','ⶦ'=>'ⶦ','ⶨ'=>'ⶨ','ⶩ'=>'ⶩ','ⶪ'=>'ⶪ','ⶫ'=>'ⶫ','ⶬ'=>'ⶬ','ⶭ'=>'ⶭ','ⶮ'=>'ⶮ','ⶰ'=>'ⶰ','ⶱ'=>'ⶱ','ⶲ'=>'ⶲ','ⶳ'=>'ⶳ','ⶴ'=>'ⶴ','ⶵ'=>'ⶵ','ⶶ'=>'ⶶ','ⶸ'=>'ⶸ','ⶹ'=>'ⶹ','ⶺ'=>'ⶺ','ⶻ'=>'ⶻ','ⶼ'=>'ⶼ','ⶽ'=>'ⶽ','ⶾ'=>'ⶾ','ⷀ'=>'ⷀ','ⷁ'=>'ⷁ','ⷂ'=>'ⷂ','ⷃ'=>'ⷃ','ⷄ'=>'ⷄ','ⷅ'=>'ⷅ','ⷆ'=>'ⷆ','ⷈ'=>'ⷈ','ⷉ'=>'ⷉ','ⷊ'=>'ⷊ','ⷋ'=>'ⷋ','ⷌ'=>'ⷌ','ⷍ'=>'ⷍ','ⷎ'=>'ⷎ','ⷐ'=>'ⷐ','ⷑ'=>'ⷑ','ⷒ'=>'ⷒ','ⷓ'=>'ⷓ','ⷔ'=>'ⷔ','ⷕ'=>'ⷕ','ⷖ'=>'ⷖ','ⷘ'=>'ⷘ','ⷙ'=>'ⷙ','ⷚ'=>'ⷚ','ⷛ'=>'ⷛ','ⷜ'=>'ⷜ','ⷝ'=>'ⷝ','ⷞ'=>'ⷞ');
diff --git a/phpBB/includes/utf/data/search_indexer_58.php b/phpBB/includes/utf/data/search_indexer_58.php
index 8902bc7995..ec86a4bd62 100644
--- a/phpBB/includes/utf/data/search_indexer_58.php
+++ b/phpBB/includes/utf/data/search_indexer_58.php
@@ -1 +1 @@
-<?php return array('𝅥'=>'𝅥','𝅦'=>'𝅦','𝅧'=>'𝅧','𝅨'=>'𝅨','𝅩'=>'𝅩','𝅭'=>'𝅭','𝅮'=>'𝅮','𝅯'=>'𝅯','𝅰'=>'𝅰','𝅱'=>'𝅱','𝅲'=>'𝅲','𝅻'=>'𝅻','𝅼'=>'𝅼','𝅽'=>'𝅽','𝅾'=>'𝅾','𝅿'=>'𝅿','𝆀'=>'𝆀','𝆁'=>'𝆁','𝆂'=>'𝆂','𝆅'=>'𝆅','𝆆'=>'𝆆','𝆇'=>'𝆇','𝆈'=>'𝆈','𝆉'=>'𝆉','𝆊'=>'𝆊','𝆋'=>'𝆋','𝆪'=>'𝆪','𝆫'=>'𝆫','𝆬'=>'𝆬','𝆭'=>'𝆭','𝉂'=>'𝉂','𝉃'=>'𝉃','𝉄'=>'𝉄','𝍠'=>'1','𝍡'=>'2','𝍢'=>'3','𝍣'=>'4','𝍤'=>'5','𝍥'=>'6','𝍦'=>'7','𝍧'=>'8','𝍨'=>'9','𝍩'=>'10','𝍪'=>'20','𝍫'=>'30','𝍬'=>'40','𝍭'=>'50','𝍮'=>'60','𝍯'=>'70','𝍰'=>'80','𝍱'=>'90','𝐀'=>'𝐀','𝐁'=>'𝐁','𝐂'=>'𝐂','𝐃'=>'𝐃','𝐄'=>'𝐄','𝐅'=>'𝐅','𝐆'=>'𝐆','𝐇'=>'𝐇','𝐈'=>'𝐈','𝐉'=>'𝐉','𝐊'=>'𝐊','𝐋'=>'𝐋','𝐌'=>'𝐌','𝐍'=>'𝐍','𝐎'=>'𝐎','𝐏'=>'𝐏','𝐐'=>'𝐐','𝐑'=>'𝐑','𝐒'=>'𝐒','𝐓'=>'𝐓','𝐔'=>'𝐔','𝐕'=>'𝐕','𝐖'=>'𝐖','𝐗'=>'𝐗','𝐘'=>'𝐘','𝐙'=>'𝐙','𝐚'=>'𝐚','𝐛'=>'𝐛','𝐜'=>'𝐜','𝐝'=>'𝐝','𝐞'=>'𝐞','𝐟'=>'𝐟','𝐠'=>'𝐠','𝐡'=>'𝐡','𝐢'=>'𝐢','𝐣'=>'𝐣','𝐤'=>'𝐤','𝐥'=>'𝐥','𝐦'=>'𝐦','𝐧'=>'𝐧','𝐨'=>'𝐨','𝐩'=>'𝐩','𝐪'=>'𝐪','𝐫'=>'𝐫','𝐬'=>'𝐬','𝐭'=>'𝐭','𝐮'=>'𝐮','𝐯'=>'𝐯','𝐰'=>'𝐰','𝐱'=>'𝐱','𝐲'=>'𝐲','𝐳'=>'𝐳','𝐴'=>'𝐴','𝐵'=>'𝐵','𝐶'=>'𝐶','𝐷'=>'𝐷','𝐸'=>'𝐸','𝐹'=>'𝐹','𝐺'=>'𝐺','𝐻'=>'𝐻','𝐼'=>'𝐼','𝐽'=>'𝐽','𝐾'=>'𝐾','𝐿'=>'𝐿','𝑀'=>'𝑀','𝑁'=>'𝑁','𝑂'=>'𝑂','𝑃'=>'𝑃','𝑄'=>'𝑄','𝑅'=>'𝑅','𝑆'=>'𝑆','𝑇'=>'𝑇','𝑈'=>'𝑈','𝑉'=>'𝑉','𝑊'=>'𝑊','𝑋'=>'𝑋','𝑌'=>'𝑌','𝑍'=>'𝑍','𝑎'=>'𝑎','𝑏'=>'𝑏','𝑐'=>'𝑐','𝑑'=>'𝑑','𝑒'=>'𝑒','𝑓'=>'𝑓','𝑔'=>'𝑔','𝑖'=>'𝑖','𝑗'=>'𝑗','𝑘'=>'𝑘','𝑙'=>'𝑙','𝑚'=>'𝑚','𝑛'=>'𝑛','𝑜'=>'𝑜','𝑝'=>'𝑝','𝑞'=>'𝑞','𝑟'=>'𝑟','𝑠'=>'𝑠','𝑡'=>'𝑡','𝑢'=>'𝑢','𝑣'=>'𝑣','𝑤'=>'𝑤','𝑥'=>'𝑥','𝑦'=>'𝑦','𝑧'=>'𝑧','𝑨'=>'𝑨','𝑩'=>'𝑩','𝑪'=>'𝑪','𝑫'=>'𝑫','𝑬'=>'𝑬','𝑭'=>'𝑭','𝑮'=>'𝑮','𝑯'=>'𝑯','𝑰'=>'𝑰','𝑱'=>'𝑱','𝑲'=>'𝑲','𝑳'=>'𝑳','𝑴'=>'𝑴','𝑵'=>'𝑵','𝑶'=>'𝑶','𝑷'=>'𝑷','𝑸'=>'𝑸','𝑹'=>'𝑹','𝑺'=>'𝑺','𝑻'=>'𝑻','𝑼'=>'𝑼','𝑽'=>'𝑽','𝑾'=>'𝑾','𝑿'=>'𝑿','𝒀'=>'𝒀','𝒁'=>'𝒁','𝒂'=>'𝒂','𝒃'=>'𝒃','𝒄'=>'𝒄','𝒅'=>'𝒅','𝒆'=>'𝒆','𝒇'=>'𝒇','𝒈'=>'𝒈','𝒉'=>'𝒉','𝒊'=>'𝒊','𝒋'=>'𝒋','𝒌'=>'𝒌','𝒍'=>'𝒍','𝒎'=>'𝒎','𝒏'=>'𝒏','𝒐'=>'𝒐','𝒑'=>'𝒑','𝒒'=>'𝒒','𝒓'=>'𝒓','𝒔'=>'𝒔','𝒕'=>'𝒕','𝒖'=>'𝒖','𝒗'=>'𝒗','𝒘'=>'𝒘','𝒙'=>'𝒙','𝒚'=>'𝒚','𝒛'=>'𝒛','𝒜'=>'𝒜','𝒞'=>'𝒞','𝒟'=>'𝒟','𝒢'=>'𝒢','𝒥'=>'𝒥','𝒦'=>'𝒦','𝒩'=>'𝒩','𝒪'=>'𝒪','𝒫'=>'𝒫','𝒬'=>'𝒬','𝒮'=>'𝒮','𝒯'=>'𝒯','𝒰'=>'𝒰','𝒱'=>'𝒱','𝒲'=>'𝒲','𝒳'=>'𝒳','𝒴'=>'𝒴','𝒵'=>'𝒵','𝒶'=>'𝒶','𝒷'=>'𝒷','𝒸'=>'𝒸','𝒹'=>'𝒹','𝒻'=>'𝒻','𝒽'=>'𝒽','𝒾'=>'𝒾','𝒿'=>'𝒿','𝓀'=>'𝓀','𝓁'=>'𝓁','𝓂'=>'𝓂','𝓃'=>'𝓃','𝓅'=>'𝓅','𝓆'=>'𝓆','𝓇'=>'𝓇','𝓈'=>'𝓈','𝓉'=>'𝓉','𝓊'=>'𝓊','𝓋'=>'𝓋','𝓌'=>'𝓌','𝓍'=>'𝓍','𝓎'=>'𝓎','𝓏'=>'𝓏','𝓐'=>'𝓐','𝓑'=>'𝓑','𝓒'=>'𝓒','𝓓'=>'𝓓','𝓔'=>'𝓔','𝓕'=>'𝓕','𝓖'=>'𝓖','𝓗'=>'𝓗','𝓘'=>'𝓘','𝓙'=>'𝓙','𝓚'=>'𝓚','𝓛'=>'𝓛','𝓜'=>'𝓜','𝓝'=>'𝓝','𝓞'=>'𝓞','𝓟'=>'𝓟','𝓠'=>'𝓠','𝓡'=>'𝓡','𝓢'=>'𝓢','𝓣'=>'𝓣','𝓤'=>'𝓤','𝓥'=>'𝓥','𝓦'=>'𝓦','𝓧'=>'𝓧','𝓨'=>'𝓨','𝓩'=>'𝓩','𝓪'=>'𝓪','𝓫'=>'𝓫','𝓬'=>'𝓬','𝓭'=>'𝓭','𝓮'=>'𝓮','𝓯'=>'𝓯','𝓰'=>'𝓰','𝓱'=>'𝓱','𝓲'=>'𝓲','𝓳'=>'𝓳','𝓴'=>'𝓴','𝓵'=>'𝓵','𝓶'=>'𝓶','𝓷'=>'𝓷','𝓸'=>'𝓸','𝓹'=>'𝓹','𝓺'=>'𝓺','𝓻'=>'𝓻','𝓼'=>'𝓼','𝓽'=>'𝓽','𝓾'=>'𝓾','𝓿'=>'𝓿','𝔀'=>'𝔀','𝔁'=>'𝔁','𝔂'=>'𝔂','𝔃'=>'𝔃','𝔄'=>'𝔄','𝔅'=>'𝔅','𝔇'=>'𝔇','𝔈'=>'𝔈','𝔉'=>'𝔉','𝔊'=>'𝔊','𝔍'=>'𝔍','𝔎'=>'𝔎','𝔏'=>'𝔏','𝔐'=>'𝔐','𝔑'=>'𝔑','𝔒'=>'𝔒','𝔓'=>'𝔓','𝔔'=>'𝔔','𝔖'=>'𝔖','𝔗'=>'𝔗','𝔘'=>'𝔘','𝔙'=>'𝔙','𝔚'=>'𝔚','𝔛'=>'𝔛','𝔜'=>'𝔜','𝔞'=>'𝔞','𝔟'=>'𝔟','𝔠'=>'𝔠','𝔡'=>'𝔡','𝔢'=>'𝔢','𝔣'=>'𝔣','𝔤'=>'𝔤','𝔥'=>'𝔥','𝔦'=>'𝔦','𝔧'=>'𝔧','𝔨'=>'𝔨','𝔩'=>'𝔩','𝔪'=>'𝔪','𝔫'=>'𝔫','𝔬'=>'𝔬','𝔭'=>'𝔭','𝔮'=>'𝔮','𝔯'=>'𝔯','𝔰'=>'𝔰','𝔱'=>'𝔱','𝔲'=>'𝔲','𝔳'=>'𝔳','𝔴'=>'𝔴','𝔵'=>'𝔵','𝔶'=>'𝔶','𝔷'=>'𝔷','𝔸'=>'𝔸','𝔹'=>'𝔹','𝔻'=>'𝔻','𝔼'=>'𝔼','𝔽'=>'𝔽','𝔾'=>'𝔾','𝕀'=>'𝕀','𝕁'=>'𝕁','𝕂'=>'𝕂','𝕃'=>'𝕃','𝕄'=>'𝕄','𝕆'=>'𝕆','𝕊'=>'𝕊','𝕋'=>'𝕋','𝕌'=>'𝕌','𝕍'=>'𝕍','𝕎'=>'𝕎','𝕏'=>'𝕏','𝕐'=>'𝕐','𝕒'=>'𝕒','𝕓'=>'𝕓','𝕔'=>'𝕔','𝕕'=>'𝕕','𝕖'=>'𝕖','𝕗'=>'𝕗','𝕘'=>'𝕘','𝕙'=>'𝕙','𝕚'=>'𝕚','𝕛'=>'𝕛','𝕜'=>'𝕜','𝕝'=>'𝕝','𝕞'=>'𝕞','𝕟'=>'𝕟','𝕠'=>'𝕠','𝕡'=>'𝕡','𝕢'=>'𝕢','𝕣'=>'𝕣','𝕤'=>'𝕤','𝕥'=>'𝕥','𝕦'=>'𝕦','𝕧'=>'𝕧','𝕨'=>'𝕨','𝕩'=>'𝕩','𝕪'=>'𝕪','𝕫'=>'𝕫','𝕬'=>'𝕬','𝕭'=>'𝕭','𝕮'=>'𝕮','𝕯'=>'𝕯','𝕰'=>'𝕰','𝕱'=>'𝕱','𝕲'=>'𝕲','𝕳'=>'𝕳','𝕴'=>'𝕴','𝕵'=>'𝕵','𝕶'=>'𝕶','𝕷'=>'𝕷','𝕸'=>'𝕸','𝕹'=>'𝕹','𝕺'=>'𝕺','𝕻'=>'𝕻','𝕼'=>'𝕼','𝕽'=>'𝕽','𝕾'=>'𝕾','𝕿'=>'𝕿','𝖀'=>'𝖀','𝖁'=>'𝖁','𝖂'=>'𝖂','𝖃'=>'𝖃','𝖄'=>'𝖄','𝖅'=>'𝖅','𝖆'=>'𝖆','𝖇'=>'𝖇','𝖈'=>'𝖈','𝖉'=>'𝖉','𝖊'=>'𝖊','𝖋'=>'𝖋','𝖌'=>'𝖌','𝖍'=>'𝖍','𝖎'=>'𝖎','𝖏'=>'𝖏','𝖐'=>'𝖐','𝖑'=>'𝖑','𝖒'=>'𝖒','𝖓'=>'𝖓','𝖔'=>'𝖔','𝖕'=>'𝖕','𝖖'=>'𝖖','𝖗'=>'𝖗','𝖘'=>'𝖘','𝖙'=>'𝖙','𝖚'=>'𝖚','𝖛'=>'𝖛','𝖜'=>'𝖜','𝖝'=>'𝖝','𝖞'=>'𝖞','𝖟'=>'𝖟','𝖠'=>'𝖠','𝖡'=>'𝖡','𝖢'=>'𝖢','𝖣'=>'𝖣','𝖤'=>'𝖤','𝖥'=>'𝖥','𝖦'=>'𝖦','𝖧'=>'𝖧','𝖨'=>'𝖨','𝖩'=>'𝖩','𝖪'=>'𝖪','𝖫'=>'𝖫','𝖬'=>'𝖬','𝖭'=>'𝖭','𝖮'=>'𝖮','𝖯'=>'𝖯','𝖰'=>'𝖰','𝖱'=>'𝖱','𝖲'=>'𝖲','𝖳'=>'𝖳','𝖴'=>'𝖴','𝖵'=>'𝖵','𝖶'=>'𝖶','𝖷'=>'𝖷','𝖸'=>'𝖸','𝖹'=>'𝖹','𝖺'=>'𝖺','𝖻'=>'𝖻','𝖼'=>'𝖼','𝖽'=>'𝖽','𝖾'=>'𝖾','𝖿'=>'𝖿','𝗀'=>'𝗀','𝗁'=>'𝗁','𝗂'=>'𝗂','𝗃'=>'𝗃','𝗄'=>'𝗄','𝗅'=>'𝗅','𝗆'=>'𝗆','𝗇'=>'𝗇','𝗈'=>'𝗈','𝗉'=>'𝗉','𝗊'=>'𝗊','𝗋'=>'𝗋','𝗌'=>'𝗌','𝗍'=>'𝗍','𝗎'=>'𝗎','𝗏'=>'𝗏','𝗐'=>'𝗐','𝗑'=>'𝗑','𝗒'=>'𝗒','𝗓'=>'𝗓','𝗔'=>'𝗔','𝗕'=>'𝗕','𝗖'=>'𝗖','𝗗'=>'𝗗','𝗘'=>'𝗘','𝗙'=>'𝗙','𝗚'=>'𝗚','𝗛'=>'𝗛','𝗜'=>'𝗜','𝗝'=>'𝗝','𝗞'=>'𝗞','𝗟'=>'𝗟','𝗠'=>'𝗠','𝗡'=>'𝗡','𝗢'=>'𝗢','𝗣'=>'𝗣','𝗤'=>'𝗤','𝗥'=>'𝗥','𝗦'=>'𝗦','𝗧'=>'𝗧','𝗨'=>'𝗨','𝗩'=>'𝗩','𝗪'=>'𝗪','𝗫'=>'𝗫','𝗬'=>'𝗬','𝗭'=>'𝗭','𝗮'=>'𝗮','𝗯'=>'𝗯','𝗰'=>'𝗰','𝗱'=>'𝗱','𝗲'=>'𝗲','𝗳'=>'𝗳','𝗴'=>'𝗴','𝗵'=>'𝗵','𝗶'=>'𝗶','𝗷'=>'𝗷','𝗸'=>'𝗸','𝗹'=>'𝗹','𝗺'=>'𝗺','𝗻'=>'𝗻','𝗼'=>'𝗼','𝗽'=>'𝗽','𝗾'=>'𝗾','𝗿'=>'𝗿','𝘀'=>'𝘀','𝘁'=>'𝘁','𝘂'=>'𝘂','𝘃'=>'𝘃','𝘄'=>'𝘄','𝘅'=>'𝘅','𝘆'=>'𝘆','𝘇'=>'𝘇','𝘈'=>'𝘈','𝘉'=>'𝘉','𝘊'=>'𝘊','𝘋'=>'𝘋','𝘌'=>'𝘌','𝘍'=>'𝘍','𝘎'=>'𝘎','𝘏'=>'𝘏','𝘐'=>'𝘐','𝘑'=>'𝘑','𝘒'=>'𝘒','𝘓'=>'𝘓','𝘔'=>'𝘔','𝘕'=>'𝘕','𝘖'=>'𝘖','𝘗'=>'𝘗','𝘘'=>'𝘘','𝘙'=>'𝘙','𝘚'=>'𝘚','𝘛'=>'𝘛','𝘜'=>'𝘜','𝘝'=>'𝘝','𝘞'=>'𝘞','𝘟'=>'𝘟','𝘠'=>'𝘠','𝘡'=>'𝘡','𝘢'=>'𝘢','𝘣'=>'𝘣','𝘤'=>'𝘤','𝘥'=>'𝘥','𝘦'=>'𝘦','𝘧'=>'𝘧','𝘨'=>'𝘨','𝘩'=>'𝘩','𝘪'=>'𝘪','𝘫'=>'𝘫','𝘬'=>'𝘬','𝘭'=>'𝘭','𝘮'=>'𝘮','𝘯'=>'𝘯','𝘰'=>'𝘰','𝘱'=>'𝘱','𝘲'=>'𝘲','𝘳'=>'𝘳','𝘴'=>'𝘴','𝘵'=>'𝘵','𝘶'=>'𝘶','𝘷'=>'𝘷','𝘸'=>'𝘸','𝘹'=>'𝘹','𝘺'=>'𝘺','𝘻'=>'𝘻','𝘼'=>'𝘼','𝘽'=>'𝘽','𝘾'=>'𝘾','𝘿'=>'𝘿','𝙀'=>'𝙀','𝙁'=>'𝙁','𝙂'=>'𝙂','𝙃'=>'𝙃','𝙄'=>'𝙄','𝙅'=>'𝙅','𝙆'=>'𝙆','𝙇'=>'𝙇','𝙈'=>'𝙈','𝙉'=>'𝙉','𝙊'=>'𝙊','𝙋'=>'𝙋','𝙌'=>'𝙌','𝙍'=>'𝙍','𝙎'=>'𝙎','𝙏'=>'𝙏','𝙐'=>'𝙐','𝙑'=>'𝙑','𝙒'=>'𝙒','𝙓'=>'𝙓','𝙔'=>'𝙔','𝙕'=>'𝙕','𝙖'=>'𝙖','𝙗'=>'𝙗','𝙘'=>'𝙘','𝙙'=>'𝙙','𝙚'=>'𝙚','𝙛'=>'𝙛','𝙜'=>'𝙜','𝙝'=>'𝙝','𝙞'=>'𝙞','𝙟'=>'𝙟','𝙠'=>'𝙠','𝙡'=>'𝙡','𝙢'=>'𝙢','𝙣'=>'𝙣','𝙤'=>'𝙤','𝙥'=>'𝙥','𝙦'=>'𝙦','𝙧'=>'𝙧','𝙨'=>'𝙨','𝙩'=>'𝙩','𝙪'=>'𝙪','𝙫'=>'𝙫','𝙬'=>'𝙬','𝙭'=>'𝙭','𝙮'=>'𝙮','𝙯'=>'𝙯','𝙰'=>'𝙰','𝙱'=>'𝙱','𝙲'=>'𝙲','𝙳'=>'𝙳','𝙴'=>'𝙴','𝙵'=>'𝙵','𝙶'=>'𝙶','𝙷'=>'𝙷','𝙸'=>'𝙸','𝙹'=>'𝙹','𝙺'=>'𝙺','𝙻'=>'𝙻','𝙼'=>'𝙼','𝙽'=>'𝙽','𝙾'=>'𝙾','𝙿'=>'𝙿','𝚀'=>'𝚀','𝚁'=>'𝚁','𝚂'=>'𝚂','𝚃'=>'𝚃','𝚄'=>'𝚄','𝚅'=>'𝚅','𝚆'=>'𝚆','𝚇'=>'𝚇','𝚈'=>'𝚈','𝚉'=>'𝚉','𝚊'=>'𝚊','𝚋'=>'𝚋','𝚌'=>'𝚌','𝚍'=>'𝚍','𝚎'=>'𝚎','𝚏'=>'𝚏','𝚐'=>'𝚐','𝚑'=>'𝚑','𝚒'=>'𝚒','𝚓'=>'𝚓','𝚔'=>'𝚔','𝚕'=>'𝚕','𝚖'=>'𝚖','𝚗'=>'𝚗','𝚘'=>'𝚘','𝚙'=>'𝚙','𝚚'=>'𝚚','𝚛'=>'𝚛','𝚜'=>'𝚜','𝚝'=>'𝚝','𝚞'=>'𝚞','𝚟'=>'𝚟','𝚠'=>'𝚠','𝚡'=>'𝚡','𝚢'=>'𝚢','𝚣'=>'𝚣','𝚤'=>'𝚤','𝚥'=>'𝚥','𝚨'=>'𝚨','𝚩'=>'𝚩','𝚪'=>'𝚪','𝚫'=>'𝚫','𝚬'=>'𝚬','𝚭'=>'𝚭','𝚮'=>'𝚮','𝚯'=>'𝚯','𝚰'=>'𝚰','𝚱'=>'𝚱','𝚲'=>'𝚲','𝚳'=>'𝚳','𝚴'=>'𝚴','𝚵'=>'𝚵','𝚶'=>'𝚶','𝚷'=>'𝚷','𝚸'=>'𝚸','𝚹'=>'𝚹','𝚺'=>'𝚺','𝚻'=>'𝚻','𝚼'=>'𝚼','𝚽'=>'𝚽','𝚾'=>'𝚾','𝚿'=>'𝚿','𝛀'=>'𝛀','𝛂'=>'𝛂','𝛃'=>'𝛃','𝛄'=>'𝛄','𝛅'=>'𝛅','𝛆'=>'𝛆','𝛇'=>'𝛇','𝛈'=>'𝛈','𝛉'=>'𝛉','𝛊'=>'𝛊','𝛋'=>'𝛋','𝛌'=>'𝛌','𝛍'=>'𝛍','𝛎'=>'𝛎','𝛏'=>'𝛏','𝛐'=>'𝛐','𝛑'=>'𝛑','𝛒'=>'𝛒','𝛓'=>'𝛓','𝛔'=>'𝛔','𝛕'=>'𝛕','𝛖'=>'𝛖','𝛗'=>'𝛗','𝛘'=>'𝛘','𝛙'=>'𝛙','𝛚'=>'𝛚','𝛜'=>'𝛜','𝛝'=>'𝛝','𝛞'=>'𝛞','𝛟'=>'𝛟','𝛠'=>'𝛠','𝛡'=>'𝛡','𝛢'=>'𝛢','𝛣'=>'𝛣','𝛤'=>'𝛤','𝛥'=>'𝛥','𝛦'=>'𝛦','𝛧'=>'𝛧','𝛨'=>'𝛨','𝛩'=>'𝛩','𝛪'=>'𝛪','𝛫'=>'𝛫','𝛬'=>'𝛬','𝛭'=>'𝛭','𝛮'=>'𝛮','𝛯'=>'𝛯','𝛰'=>'𝛰','𝛱'=>'𝛱','𝛲'=>'𝛲','𝛳'=>'𝛳','𝛴'=>'𝛴','𝛵'=>'𝛵','𝛶'=>'𝛶','𝛷'=>'𝛷','𝛸'=>'𝛸','𝛹'=>'𝛹','𝛺'=>'𝛺','𝛼'=>'𝛼','𝛽'=>'𝛽','𝛾'=>'𝛾','𝛿'=>'𝛿','𝜀'=>'𝜀','𝜁'=>'𝜁','𝜂'=>'𝜂','𝜃'=>'𝜃','𝜄'=>'𝜄','𝜅'=>'𝜅','𝜆'=>'𝜆','𝜇'=>'𝜇','𝜈'=>'𝜈','𝜉'=>'𝜉','𝜊'=>'𝜊','𝜋'=>'𝜋','𝜌'=>'𝜌','𝜍'=>'𝜍','𝜎'=>'𝜎','𝜏'=>'𝜏','𝜐'=>'𝜐','𝜑'=>'𝜑','𝜒'=>'𝜒','𝜓'=>'𝜓','𝜔'=>'𝜔','𝜖'=>'𝜖','𝜗'=>'𝜗','𝜘'=>'𝜘','𝜙'=>'𝜙','𝜚'=>'𝜚','𝜛'=>'𝜛','𝜜'=>'𝜜','𝜝'=>'𝜝','𝜞'=>'𝜞','𝜟'=>'𝜟','𝜠'=>'𝜠','𝜡'=>'𝜡','𝜢'=>'𝜢','𝜣'=>'𝜣','𝜤'=>'𝜤','𝜥'=>'𝜥','𝜦'=>'𝜦','𝜧'=>'𝜧','𝜨'=>'𝜨','𝜩'=>'𝜩','𝜪'=>'𝜪','𝜫'=>'𝜫','𝜬'=>'𝜬','𝜭'=>'𝜭','𝜮'=>'𝜮','𝜯'=>'𝜯','𝜰'=>'𝜰','𝜱'=>'𝜱','𝜲'=>'𝜲','𝜳'=>'𝜳','𝜴'=>'𝜴','𝜶'=>'𝜶','𝜷'=>'𝜷','𝜸'=>'𝜸','𝜹'=>'𝜹','𝜺'=>'𝜺','𝜻'=>'𝜻','𝜼'=>'𝜼','𝜽'=>'𝜽','𝜾'=>'𝜾','𝜿'=>'𝜿','𝝀'=>'𝝀','𝝁'=>'𝝁','𝝂'=>'𝝂','𝝃'=>'𝝃','𝝄'=>'𝝄','𝝅'=>'𝝅','𝝆'=>'𝝆','𝝇'=>'𝝇','𝝈'=>'𝝈','𝝉'=>'𝝉','𝝊'=>'𝝊','𝝋'=>'𝝋','𝝌'=>'𝝌','𝝍'=>'𝝍','𝝎'=>'𝝎','𝝐'=>'𝝐','𝝑'=>'𝝑','𝝒'=>'𝝒','𝝓'=>'𝝓','𝝔'=>'𝝔','𝝕'=>'𝝕','𝝖'=>'𝝖','𝝗'=>'𝝗','𝝘'=>'𝝘','𝝙'=>'𝝙','𝝚'=>'𝝚','𝝛'=>'𝝛','𝝜'=>'𝝜','𝝝'=>'𝝝','𝝞'=>'𝝞','𝝟'=>'𝝟','𝝠'=>'𝝠','𝝡'=>'𝝡','𝝢'=>'𝝢','𝝣'=>'𝝣','𝝤'=>'𝝤','𝝥'=>'𝝥','𝝦'=>'𝝦','𝝧'=>'𝝧','𝝨'=>'𝝨','𝝩'=>'𝝩','𝝪'=>'𝝪','𝝫'=>'𝝫','𝝬'=>'𝝬','𝝭'=>'𝝭','𝝮'=>'𝝮','𝝰'=>'𝝰','𝝱'=>'𝝱','𝝲'=>'𝝲','𝝳'=>'𝝳','𝝴'=>'𝝴','𝝵'=>'𝝵','𝝶'=>'𝝶','𝝷'=>'𝝷','𝝸'=>'𝝸','𝝹'=>'𝝹','𝝺'=>'𝝺','𝝻'=>'𝝻','𝝼'=>'𝝼','𝝽'=>'𝝽','𝝾'=>'𝝾','𝝿'=>'𝝿','𝞀'=>'𝞀','𝞁'=>'𝞁','𝞂'=>'𝞂','𝞃'=>'𝞃','𝞄'=>'𝞄','𝞅'=>'𝞅','𝞆'=>'𝞆','𝞇'=>'𝞇','𝞈'=>'𝞈','𝞊'=>'𝞊','𝞋'=>'𝞋','𝞌'=>'𝞌','𝞍'=>'𝞍','𝞎'=>'𝞎','𝞏'=>'𝞏','𝞐'=>'𝞐','𝞑'=>'𝞑','𝞒'=>'𝞒','𝞓'=>'𝞓','𝞔'=>'𝞔','𝞕'=>'𝞕','𝞖'=>'𝞖','𝞗'=>'𝞗','𝞘'=>'𝞘','𝞙'=>'𝞙','𝞚'=>'𝞚','𝞛'=>'𝞛','𝞜'=>'𝞜','𝞝'=>'𝞝','𝞞'=>'𝞞','𝞟'=>'𝞟','𝞠'=>'𝞠','𝞡'=>'𝞡','𝞢'=>'𝞢','𝞣'=>'𝞣','𝞤'=>'𝞤','𝞥'=>'𝞥','𝞦'=>'𝞦','𝞧'=>'𝞧','𝞨'=>'𝞨','𝞪'=>'𝞪','𝞫'=>'𝞫','𝞬'=>'𝞬','𝞭'=>'𝞭','𝞮'=>'𝞮','𝞯'=>'𝞯','𝞰'=>'𝞰','𝞱'=>'𝞱','𝞲'=>'𝞲','𝞳'=>'𝞳','𝞴'=>'𝞴','𝞵'=>'𝞵','𝞶'=>'𝞶','𝞷'=>'𝞷','𝞸'=>'𝞸','𝞹'=>'𝞹','𝞺'=>'𝞺','𝞻'=>'𝞻','𝞼'=>'𝞼','𝞽'=>'𝞽','𝞾'=>'𝞾','𝞿'=>'𝞿','𝟀'=>'𝟀','𝟁'=>'𝟁','𝟂'=>'𝟂','𝟄'=>'𝟄','𝟅'=>'𝟅','𝟆'=>'𝟆','𝟇'=>'𝟇','𝟈'=>'𝟈','𝟉'=>'𝟉','𝟊'=>'𝟊','𝟋'=>'𝟋','𝟎'=>'0','𝟏'=>'1','𝟐'=>'2','𝟑'=>'3','𝟒'=>'4','𝟓'=>'5','𝟔'=>'6','𝟕'=>'7','𝟖'=>'8','𝟗'=>'9','𝟘'=>'0','𝟙'=>'1','𝟚'=>'2','𝟛'=>'3','𝟜'=>'4','𝟝'=>'5','𝟞'=>'6','𝟟'=>'7','𝟠'=>'8','𝟡'=>'9','𝟢'=>'0','𝟣'=>'1','𝟤'=>'2','𝟥'=>'3','𝟦'=>'4','𝟧'=>'5','𝟨'=>'6','𝟩'=>'7','𝟪'=>'8','𝟫'=>'9','𝟬'=>'0','𝟭'=>'1','𝟮'=>'2','𝟯'=>'3','𝟰'=>'4','𝟱'=>'5','𝟲'=>'6','𝟳'=>'7','𝟴'=>'8','𝟵'=>'9','𝟶'=>'0','𝟷'=>'1','𝟸'=>'2','𝟹'=>'3','𝟺'=>'4','𝟻'=>'5','𝟼'=>'6','𝟽'=>'7','𝟾'=>'8','𝟿'=>'9'); \ No newline at end of file
+<?php return array('𝅥'=>'𝅥','𝅦'=>'𝅦','𝅧'=>'𝅧','𝅨'=>'𝅨','𝅩'=>'𝅩','𝅭'=>'𝅭','𝅮'=>'𝅮','𝅯'=>'𝅯','𝅰'=>'𝅰','𝅱'=>'𝅱','𝅲'=>'𝅲','𝅻'=>'𝅻','𝅼'=>'𝅼','𝅽'=>'𝅽','𝅾'=>'𝅾','𝅿'=>'𝅿','𝆀'=>'𝆀','𝆁'=>'𝆁','𝆂'=>'𝆂','𝆅'=>'𝆅','𝆆'=>'𝆆','𝆇'=>'𝆇','𝆈'=>'𝆈','𝆉'=>'𝆉','𝆊'=>'𝆊','𝆋'=>'𝆋','𝆪'=>'𝆪','𝆫'=>'𝆫','𝆬'=>'𝆬','𝆭'=>'𝆭','𝉂'=>'𝉂','𝉃'=>'𝉃','𝉄'=>'𝉄','𝍠'=>'1','𝍡'=>'2','𝍢'=>'3','𝍣'=>'4','𝍤'=>'5','𝍥'=>'6','𝍦'=>'7','𝍧'=>'8','𝍨'=>'9','𝍩'=>'10','𝍪'=>'20','𝍫'=>'30','𝍬'=>'40','𝍭'=>'50','𝍮'=>'60','𝍯'=>'70','𝍰'=>'80','𝍱'=>'90','𝐀'=>'𝐀','𝐁'=>'𝐁','𝐂'=>'𝐂','𝐃'=>'𝐃','𝐄'=>'𝐄','𝐅'=>'𝐅','𝐆'=>'𝐆','𝐇'=>'𝐇','𝐈'=>'𝐈','𝐉'=>'𝐉','𝐊'=>'𝐊','𝐋'=>'𝐋','𝐌'=>'𝐌','𝐍'=>'𝐍','𝐎'=>'𝐎','𝐏'=>'𝐏','𝐐'=>'𝐐','𝐑'=>'𝐑','𝐒'=>'𝐒','𝐓'=>'𝐓','𝐔'=>'𝐔','𝐕'=>'𝐕','𝐖'=>'𝐖','𝐗'=>'𝐗','𝐘'=>'𝐘','𝐙'=>'𝐙','𝐚'=>'𝐚','𝐛'=>'𝐛','𝐜'=>'𝐜','𝐝'=>'𝐝','𝐞'=>'𝐞','𝐟'=>'𝐟','𝐠'=>'𝐠','𝐡'=>'𝐡','𝐢'=>'𝐢','𝐣'=>'𝐣','𝐤'=>'𝐤','𝐥'=>'𝐥','𝐦'=>'𝐦','𝐧'=>'𝐧','𝐨'=>'𝐨','𝐩'=>'𝐩','𝐪'=>'𝐪','𝐫'=>'𝐫','𝐬'=>'𝐬','𝐭'=>'𝐭','𝐮'=>'𝐮','𝐯'=>'𝐯','𝐰'=>'𝐰','𝐱'=>'𝐱','𝐲'=>'𝐲','𝐳'=>'𝐳','𝐴'=>'𝐴','𝐵'=>'𝐵','𝐶'=>'𝐶','𝐷'=>'𝐷','𝐸'=>'𝐸','𝐹'=>'𝐹','𝐺'=>'𝐺','𝐻'=>'𝐻','𝐼'=>'𝐼','𝐽'=>'𝐽','𝐾'=>'𝐾','𝐿'=>'𝐿','𝑀'=>'𝑀','𝑁'=>'𝑁','𝑂'=>'𝑂','𝑃'=>'𝑃','𝑄'=>'𝑄','𝑅'=>'𝑅','𝑆'=>'𝑆','𝑇'=>'𝑇','𝑈'=>'𝑈','𝑉'=>'𝑉','𝑊'=>'𝑊','𝑋'=>'𝑋','𝑌'=>'𝑌','𝑍'=>'𝑍','𝑎'=>'𝑎','𝑏'=>'𝑏','𝑐'=>'𝑐','𝑑'=>'𝑑','𝑒'=>'𝑒','𝑓'=>'𝑓','𝑔'=>'𝑔','𝑖'=>'𝑖','𝑗'=>'𝑗','𝑘'=>'𝑘','𝑙'=>'𝑙','𝑚'=>'𝑚','𝑛'=>'𝑛','𝑜'=>'𝑜','𝑝'=>'𝑝','𝑞'=>'𝑞','𝑟'=>'𝑟','𝑠'=>'𝑠','𝑡'=>'𝑡','𝑢'=>'𝑢','𝑣'=>'𝑣','𝑤'=>'𝑤','𝑥'=>'𝑥','𝑦'=>'𝑦','𝑧'=>'𝑧','𝑨'=>'𝑨','𝑩'=>'𝑩','𝑪'=>'𝑪','𝑫'=>'𝑫','𝑬'=>'𝑬','𝑭'=>'𝑭','𝑮'=>'𝑮','𝑯'=>'𝑯','𝑰'=>'𝑰','𝑱'=>'𝑱','𝑲'=>'𝑲','𝑳'=>'𝑳','𝑴'=>'𝑴','𝑵'=>'𝑵','𝑶'=>'𝑶','𝑷'=>'𝑷','𝑸'=>'𝑸','𝑹'=>'𝑹','𝑺'=>'𝑺','𝑻'=>'𝑻','𝑼'=>'𝑼','𝑽'=>'𝑽','𝑾'=>'𝑾','𝑿'=>'𝑿','𝒀'=>'𝒀','𝒁'=>'𝒁','𝒂'=>'𝒂','𝒃'=>'𝒃','𝒄'=>'𝒄','𝒅'=>'𝒅','𝒆'=>'𝒆','𝒇'=>'𝒇','𝒈'=>'𝒈','𝒉'=>'𝒉','𝒊'=>'𝒊','𝒋'=>'𝒋','𝒌'=>'𝒌','𝒍'=>'𝒍','𝒎'=>'𝒎','𝒏'=>'𝒏','𝒐'=>'𝒐','𝒑'=>'𝒑','𝒒'=>'𝒒','𝒓'=>'𝒓','𝒔'=>'𝒔','𝒕'=>'𝒕','𝒖'=>'𝒖','𝒗'=>'𝒗','𝒘'=>'𝒘','𝒙'=>'𝒙','𝒚'=>'𝒚','𝒛'=>'𝒛','𝒜'=>'𝒜','𝒞'=>'𝒞','𝒟'=>'𝒟','𝒢'=>'𝒢','𝒥'=>'𝒥','𝒦'=>'𝒦','𝒩'=>'𝒩','𝒪'=>'𝒪','𝒫'=>'𝒫','𝒬'=>'𝒬','𝒮'=>'𝒮','𝒯'=>'𝒯','𝒰'=>'𝒰','𝒱'=>'𝒱','𝒲'=>'𝒲','𝒳'=>'𝒳','𝒴'=>'𝒴','𝒵'=>'𝒵','𝒶'=>'𝒶','𝒷'=>'𝒷','𝒸'=>'𝒸','𝒹'=>'𝒹','𝒻'=>'𝒻','𝒽'=>'𝒽','𝒾'=>'𝒾','𝒿'=>'𝒿','𝓀'=>'𝓀','𝓁'=>'𝓁','𝓂'=>'𝓂','𝓃'=>'𝓃','𝓅'=>'𝓅','𝓆'=>'𝓆','𝓇'=>'𝓇','𝓈'=>'𝓈','𝓉'=>'𝓉','𝓊'=>'𝓊','𝓋'=>'𝓋','𝓌'=>'𝓌','𝓍'=>'𝓍','𝓎'=>'𝓎','𝓏'=>'𝓏','𝓐'=>'𝓐','𝓑'=>'𝓑','𝓒'=>'𝓒','𝓓'=>'𝓓','𝓔'=>'𝓔','𝓕'=>'𝓕','𝓖'=>'𝓖','𝓗'=>'𝓗','𝓘'=>'𝓘','𝓙'=>'𝓙','𝓚'=>'𝓚','𝓛'=>'𝓛','𝓜'=>'𝓜','𝓝'=>'𝓝','𝓞'=>'𝓞','𝓟'=>'𝓟','𝓠'=>'𝓠','𝓡'=>'𝓡','𝓢'=>'𝓢','𝓣'=>'𝓣','𝓤'=>'𝓤','𝓥'=>'𝓥','𝓦'=>'𝓦','𝓧'=>'𝓧','𝓨'=>'𝓨','𝓩'=>'𝓩','𝓪'=>'𝓪','𝓫'=>'𝓫','𝓬'=>'𝓬','𝓭'=>'𝓭','𝓮'=>'𝓮','𝓯'=>'𝓯','𝓰'=>'𝓰','𝓱'=>'𝓱','𝓲'=>'𝓲','𝓳'=>'𝓳','𝓴'=>'𝓴','𝓵'=>'𝓵','𝓶'=>'𝓶','𝓷'=>'𝓷','𝓸'=>'𝓸','𝓹'=>'𝓹','𝓺'=>'𝓺','𝓻'=>'𝓻','𝓼'=>'𝓼','𝓽'=>'𝓽','𝓾'=>'𝓾','𝓿'=>'𝓿','𝔀'=>'𝔀','𝔁'=>'𝔁','𝔂'=>'𝔂','𝔃'=>'𝔃','𝔄'=>'𝔄','𝔅'=>'𝔅','𝔇'=>'𝔇','𝔈'=>'𝔈','𝔉'=>'𝔉','𝔊'=>'𝔊','𝔍'=>'𝔍','𝔎'=>'𝔎','𝔏'=>'𝔏','𝔐'=>'𝔐','𝔑'=>'𝔑','𝔒'=>'𝔒','𝔓'=>'𝔓','𝔔'=>'𝔔','𝔖'=>'𝔖','𝔗'=>'𝔗','𝔘'=>'𝔘','𝔙'=>'𝔙','𝔚'=>'𝔚','𝔛'=>'𝔛','𝔜'=>'𝔜','𝔞'=>'𝔞','𝔟'=>'𝔟','𝔠'=>'𝔠','𝔡'=>'𝔡','𝔢'=>'𝔢','𝔣'=>'𝔣','𝔤'=>'𝔤','𝔥'=>'𝔥','𝔦'=>'𝔦','𝔧'=>'𝔧','𝔨'=>'𝔨','𝔩'=>'𝔩','𝔪'=>'𝔪','𝔫'=>'𝔫','𝔬'=>'𝔬','𝔭'=>'𝔭','𝔮'=>'𝔮','𝔯'=>'𝔯','𝔰'=>'𝔰','𝔱'=>'𝔱','𝔲'=>'𝔲','𝔳'=>'𝔳','𝔴'=>'𝔴','𝔵'=>'𝔵','𝔶'=>'𝔶','𝔷'=>'𝔷','𝔸'=>'𝔸','𝔹'=>'𝔹','𝔻'=>'𝔻','𝔼'=>'𝔼','𝔽'=>'𝔽','𝔾'=>'𝔾','𝕀'=>'𝕀','𝕁'=>'𝕁','𝕂'=>'𝕂','𝕃'=>'𝕃','𝕄'=>'𝕄','𝕆'=>'𝕆','𝕊'=>'𝕊','𝕋'=>'𝕋','𝕌'=>'𝕌','𝕍'=>'𝕍','𝕎'=>'𝕎','𝕏'=>'𝕏','𝕐'=>'𝕐','𝕒'=>'𝕒','𝕓'=>'𝕓','𝕔'=>'𝕔','𝕕'=>'𝕕','𝕖'=>'𝕖','𝕗'=>'𝕗','𝕘'=>'𝕘','𝕙'=>'𝕙','𝕚'=>'𝕚','𝕛'=>'𝕛','𝕜'=>'𝕜','𝕝'=>'𝕝','𝕞'=>'𝕞','𝕟'=>'𝕟','𝕠'=>'𝕠','𝕡'=>'𝕡','𝕢'=>'𝕢','𝕣'=>'𝕣','𝕤'=>'𝕤','𝕥'=>'𝕥','𝕦'=>'𝕦','𝕧'=>'𝕧','𝕨'=>'𝕨','𝕩'=>'𝕩','𝕪'=>'𝕪','𝕫'=>'𝕫','𝕬'=>'𝕬','𝕭'=>'𝕭','𝕮'=>'𝕮','𝕯'=>'𝕯','𝕰'=>'𝕰','𝕱'=>'𝕱','𝕲'=>'𝕲','𝕳'=>'𝕳','𝕴'=>'𝕴','𝕵'=>'𝕵','𝕶'=>'𝕶','𝕷'=>'𝕷','𝕸'=>'𝕸','𝕹'=>'𝕹','𝕺'=>'𝕺','𝕻'=>'𝕻','𝕼'=>'𝕼','𝕽'=>'𝕽','𝕾'=>'𝕾','𝕿'=>'𝕿','𝖀'=>'𝖀','𝖁'=>'𝖁','𝖂'=>'𝖂','𝖃'=>'𝖃','𝖄'=>'𝖄','𝖅'=>'𝖅','𝖆'=>'𝖆','𝖇'=>'𝖇','𝖈'=>'𝖈','𝖉'=>'𝖉','𝖊'=>'𝖊','𝖋'=>'𝖋','𝖌'=>'𝖌','𝖍'=>'𝖍','𝖎'=>'𝖎','𝖏'=>'𝖏','𝖐'=>'𝖐','𝖑'=>'𝖑','𝖒'=>'𝖒','𝖓'=>'𝖓','𝖔'=>'𝖔','𝖕'=>'𝖕','𝖖'=>'𝖖','𝖗'=>'𝖗','𝖘'=>'𝖘','𝖙'=>'𝖙','𝖚'=>'𝖚','𝖛'=>'𝖛','𝖜'=>'𝖜','𝖝'=>'𝖝','𝖞'=>'𝖞','𝖟'=>'𝖟','𝖠'=>'𝖠','𝖡'=>'𝖡','𝖢'=>'𝖢','𝖣'=>'𝖣','𝖤'=>'𝖤','𝖥'=>'𝖥','𝖦'=>'𝖦','𝖧'=>'𝖧','𝖨'=>'𝖨','𝖩'=>'𝖩','𝖪'=>'𝖪','𝖫'=>'𝖫','𝖬'=>'𝖬','𝖭'=>'𝖭','𝖮'=>'𝖮','𝖯'=>'𝖯','𝖰'=>'𝖰','𝖱'=>'𝖱','𝖲'=>'𝖲','𝖳'=>'𝖳','𝖴'=>'𝖴','𝖵'=>'𝖵','𝖶'=>'𝖶','𝖷'=>'𝖷','𝖸'=>'𝖸','𝖹'=>'𝖹','𝖺'=>'𝖺','𝖻'=>'𝖻','𝖼'=>'𝖼','𝖽'=>'𝖽','𝖾'=>'𝖾','𝖿'=>'𝖿','𝗀'=>'𝗀','𝗁'=>'𝗁','𝗂'=>'𝗂','𝗃'=>'𝗃','𝗄'=>'𝗄','𝗅'=>'𝗅','𝗆'=>'𝗆','𝗇'=>'𝗇','𝗈'=>'𝗈','𝗉'=>'𝗉','𝗊'=>'𝗊','𝗋'=>'𝗋','𝗌'=>'𝗌','𝗍'=>'𝗍','𝗎'=>'𝗎','𝗏'=>'𝗏','𝗐'=>'𝗐','𝗑'=>'𝗑','𝗒'=>'𝗒','𝗓'=>'𝗓','𝗔'=>'𝗔','𝗕'=>'𝗕','𝗖'=>'𝗖','𝗗'=>'𝗗','𝗘'=>'𝗘','𝗙'=>'𝗙','𝗚'=>'𝗚','𝗛'=>'𝗛','𝗜'=>'𝗜','𝗝'=>'𝗝','𝗞'=>'𝗞','𝗟'=>'𝗟','𝗠'=>'𝗠','𝗡'=>'𝗡','𝗢'=>'𝗢','𝗣'=>'𝗣','𝗤'=>'𝗤','𝗥'=>'𝗥','𝗦'=>'𝗦','𝗧'=>'𝗧','𝗨'=>'𝗨','𝗩'=>'𝗩','𝗪'=>'𝗪','𝗫'=>'𝗫','𝗬'=>'𝗬','𝗭'=>'𝗭','𝗮'=>'𝗮','𝗯'=>'𝗯','𝗰'=>'𝗰','𝗱'=>'𝗱','𝗲'=>'𝗲','𝗳'=>'𝗳','𝗴'=>'𝗴','𝗵'=>'𝗵','𝗶'=>'𝗶','𝗷'=>'𝗷','𝗸'=>'𝗸','𝗹'=>'𝗹','𝗺'=>'𝗺','𝗻'=>'𝗻','𝗼'=>'𝗼','𝗽'=>'𝗽','𝗾'=>'𝗾','𝗿'=>'𝗿','𝘀'=>'𝘀','𝘁'=>'𝘁','𝘂'=>'𝘂','𝘃'=>'𝘃','𝘄'=>'𝘄','𝘅'=>'𝘅','𝘆'=>'𝘆','𝘇'=>'𝘇','𝘈'=>'𝘈','𝘉'=>'𝘉','𝘊'=>'𝘊','𝘋'=>'𝘋','𝘌'=>'𝘌','𝘍'=>'𝘍','𝘎'=>'𝘎','𝘏'=>'𝘏','𝘐'=>'𝘐','𝘑'=>'𝘑','𝘒'=>'𝘒','𝘓'=>'𝘓','𝘔'=>'𝘔','𝘕'=>'𝘕','𝘖'=>'𝘖','𝘗'=>'𝘗','𝘘'=>'𝘘','𝘙'=>'𝘙','𝘚'=>'𝘚','𝘛'=>'𝘛','𝘜'=>'𝘜','𝘝'=>'𝘝','𝘞'=>'𝘞','𝘟'=>'𝘟','𝘠'=>'𝘠','𝘡'=>'𝘡','𝘢'=>'𝘢','𝘣'=>'𝘣','𝘤'=>'𝘤','𝘥'=>'𝘥','𝘦'=>'𝘦','𝘧'=>'𝘧','𝘨'=>'𝘨','𝘩'=>'𝘩','𝘪'=>'𝘪','𝘫'=>'𝘫','𝘬'=>'𝘬','𝘭'=>'𝘭','𝘮'=>'𝘮','𝘯'=>'𝘯','𝘰'=>'𝘰','𝘱'=>'𝘱','𝘲'=>'𝘲','𝘳'=>'𝘳','𝘴'=>'𝘴','𝘵'=>'𝘵','𝘶'=>'𝘶','𝘷'=>'𝘷','𝘸'=>'𝘸','𝘹'=>'𝘹','𝘺'=>'𝘺','𝘻'=>'𝘻','𝘼'=>'𝘼','𝘽'=>'𝘽','𝘾'=>'𝘾','𝘿'=>'𝘿','𝙀'=>'𝙀','𝙁'=>'𝙁','𝙂'=>'𝙂','𝙃'=>'𝙃','𝙄'=>'𝙄','𝙅'=>'𝙅','𝙆'=>'𝙆','𝙇'=>'𝙇','𝙈'=>'𝙈','𝙉'=>'𝙉','𝙊'=>'𝙊','𝙋'=>'𝙋','𝙌'=>'𝙌','𝙍'=>'𝙍','𝙎'=>'𝙎','𝙏'=>'𝙏','𝙐'=>'𝙐','𝙑'=>'𝙑','𝙒'=>'𝙒','𝙓'=>'𝙓','𝙔'=>'𝙔','𝙕'=>'𝙕','𝙖'=>'𝙖','𝙗'=>'𝙗','𝙘'=>'𝙘','𝙙'=>'𝙙','𝙚'=>'𝙚','𝙛'=>'𝙛','𝙜'=>'𝙜','𝙝'=>'𝙝','𝙞'=>'𝙞','𝙟'=>'𝙟','𝙠'=>'𝙠','𝙡'=>'𝙡','𝙢'=>'𝙢','𝙣'=>'𝙣','𝙤'=>'𝙤','𝙥'=>'𝙥','𝙦'=>'𝙦','𝙧'=>'𝙧','𝙨'=>'𝙨','𝙩'=>'𝙩','𝙪'=>'𝙪','𝙫'=>'𝙫','𝙬'=>'𝙬','𝙭'=>'𝙭','𝙮'=>'𝙮','𝙯'=>'𝙯','𝙰'=>'𝙰','𝙱'=>'𝙱','𝙲'=>'𝙲','𝙳'=>'𝙳','𝙴'=>'𝙴','𝙵'=>'𝙵','𝙶'=>'𝙶','𝙷'=>'𝙷','𝙸'=>'𝙸','𝙹'=>'𝙹','𝙺'=>'𝙺','𝙻'=>'𝙻','𝙼'=>'𝙼','𝙽'=>'𝙽','𝙾'=>'𝙾','𝙿'=>'𝙿','𝚀'=>'𝚀','𝚁'=>'𝚁','𝚂'=>'𝚂','𝚃'=>'𝚃','𝚄'=>'𝚄','𝚅'=>'𝚅','𝚆'=>'𝚆','𝚇'=>'𝚇','𝚈'=>'𝚈','𝚉'=>'𝚉','𝚊'=>'𝚊','𝚋'=>'𝚋','𝚌'=>'𝚌','𝚍'=>'𝚍','𝚎'=>'𝚎','𝚏'=>'𝚏','𝚐'=>'𝚐','𝚑'=>'𝚑','𝚒'=>'𝚒','𝚓'=>'𝚓','𝚔'=>'𝚔','𝚕'=>'𝚕','𝚖'=>'𝚖','𝚗'=>'𝚗','𝚘'=>'𝚘','𝚙'=>'𝚙','𝚚'=>'𝚚','𝚛'=>'𝚛','𝚜'=>'𝚜','𝚝'=>'𝚝','𝚞'=>'𝚞','𝚟'=>'𝚟','𝚠'=>'𝚠','𝚡'=>'𝚡','𝚢'=>'𝚢','𝚣'=>'𝚣','𝚤'=>'𝚤','𝚥'=>'𝚥','𝚨'=>'𝚨','𝚩'=>'𝚩','𝚪'=>'𝚪','𝚫'=>'𝚫','𝚬'=>'𝚬','𝚭'=>'𝚭','𝚮'=>'𝚮','𝚯'=>'𝚯','𝚰'=>'𝚰','𝚱'=>'𝚱','𝚲'=>'𝚲','𝚳'=>'𝚳','𝚴'=>'𝚴','𝚵'=>'𝚵','𝚶'=>'𝚶','𝚷'=>'𝚷','𝚸'=>'𝚸','𝚹'=>'𝚹','𝚺'=>'𝚺','𝚻'=>'𝚻','𝚼'=>'𝚼','𝚽'=>'𝚽','𝚾'=>'𝚾','𝚿'=>'𝚿','𝛀'=>'𝛀','𝛂'=>'𝛂','𝛃'=>'𝛃','𝛄'=>'𝛄','𝛅'=>'𝛅','𝛆'=>'𝛆','𝛇'=>'𝛇','𝛈'=>'𝛈','𝛉'=>'𝛉','𝛊'=>'𝛊','𝛋'=>'𝛋','𝛌'=>'𝛌','𝛍'=>'𝛍','𝛎'=>'𝛎','𝛏'=>'𝛏','𝛐'=>'𝛐','𝛑'=>'𝛑','𝛒'=>'𝛒','𝛓'=>'𝛓','𝛔'=>'𝛔','𝛕'=>'𝛕','𝛖'=>'𝛖','𝛗'=>'𝛗','𝛘'=>'𝛘','𝛙'=>'𝛙','𝛚'=>'𝛚','𝛜'=>'𝛜','𝛝'=>'𝛝','𝛞'=>'𝛞','𝛟'=>'𝛟','𝛠'=>'𝛠','𝛡'=>'𝛡','𝛢'=>'𝛢','𝛣'=>'𝛣','𝛤'=>'𝛤','𝛥'=>'𝛥','𝛦'=>'𝛦','𝛧'=>'𝛧','𝛨'=>'𝛨','𝛩'=>'𝛩','𝛪'=>'𝛪','𝛫'=>'𝛫','𝛬'=>'𝛬','𝛭'=>'𝛭','𝛮'=>'𝛮','𝛯'=>'𝛯','𝛰'=>'𝛰','𝛱'=>'𝛱','𝛲'=>'𝛲','𝛳'=>'𝛳','𝛴'=>'𝛴','𝛵'=>'𝛵','𝛶'=>'𝛶','𝛷'=>'𝛷','𝛸'=>'𝛸','𝛹'=>'𝛹','𝛺'=>'𝛺','𝛼'=>'𝛼','𝛽'=>'𝛽','𝛾'=>'𝛾','𝛿'=>'𝛿','𝜀'=>'𝜀','𝜁'=>'𝜁','𝜂'=>'𝜂','𝜃'=>'𝜃','𝜄'=>'𝜄','𝜅'=>'𝜅','𝜆'=>'𝜆','𝜇'=>'𝜇','𝜈'=>'𝜈','𝜉'=>'𝜉','𝜊'=>'𝜊','𝜋'=>'𝜋','𝜌'=>'𝜌','𝜍'=>'𝜍','𝜎'=>'𝜎','𝜏'=>'𝜏','𝜐'=>'𝜐','𝜑'=>'𝜑','𝜒'=>'𝜒','𝜓'=>'𝜓','𝜔'=>'𝜔','𝜖'=>'𝜖','𝜗'=>'𝜗','𝜘'=>'𝜘','𝜙'=>'𝜙','𝜚'=>'𝜚','𝜛'=>'𝜛','𝜜'=>'𝜜','𝜝'=>'𝜝','𝜞'=>'𝜞','𝜟'=>'𝜟','𝜠'=>'𝜠','𝜡'=>'𝜡','𝜢'=>'𝜢','𝜣'=>'𝜣','𝜤'=>'𝜤','𝜥'=>'𝜥','𝜦'=>'𝜦','𝜧'=>'𝜧','𝜨'=>'𝜨','𝜩'=>'𝜩','𝜪'=>'𝜪','𝜫'=>'𝜫','𝜬'=>'𝜬','𝜭'=>'𝜭','𝜮'=>'𝜮','𝜯'=>'𝜯','𝜰'=>'𝜰','𝜱'=>'𝜱','𝜲'=>'𝜲','𝜳'=>'𝜳','𝜴'=>'𝜴','𝜶'=>'𝜶','𝜷'=>'𝜷','𝜸'=>'𝜸','𝜹'=>'𝜹','𝜺'=>'𝜺','𝜻'=>'𝜻','𝜼'=>'𝜼','𝜽'=>'𝜽','𝜾'=>'𝜾','𝜿'=>'𝜿','𝝀'=>'𝝀','𝝁'=>'𝝁','𝝂'=>'𝝂','𝝃'=>'𝝃','𝝄'=>'𝝄','𝝅'=>'𝝅','𝝆'=>'𝝆','𝝇'=>'𝝇','𝝈'=>'𝝈','𝝉'=>'𝝉','𝝊'=>'𝝊','𝝋'=>'𝝋','𝝌'=>'𝝌','𝝍'=>'𝝍','𝝎'=>'𝝎','𝝐'=>'𝝐','𝝑'=>'𝝑','𝝒'=>'𝝒','𝝓'=>'𝝓','𝝔'=>'𝝔','𝝕'=>'𝝕','𝝖'=>'𝝖','𝝗'=>'𝝗','𝝘'=>'𝝘','𝝙'=>'𝝙','𝝚'=>'𝝚','𝝛'=>'𝝛','𝝜'=>'𝝜','𝝝'=>'𝝝','𝝞'=>'𝝞','𝝟'=>'𝝟','𝝠'=>'𝝠','𝝡'=>'𝝡','𝝢'=>'𝝢','𝝣'=>'𝝣','𝝤'=>'𝝤','𝝥'=>'𝝥','𝝦'=>'𝝦','𝝧'=>'𝝧','𝝨'=>'𝝨','𝝩'=>'𝝩','𝝪'=>'𝝪','𝝫'=>'𝝫','𝝬'=>'𝝬','𝝭'=>'𝝭','𝝮'=>'𝝮','𝝰'=>'𝝰','𝝱'=>'𝝱','𝝲'=>'𝝲','𝝳'=>'𝝳','𝝴'=>'𝝴','𝝵'=>'𝝵','𝝶'=>'𝝶','𝝷'=>'𝝷','𝝸'=>'𝝸','𝝹'=>'𝝹','𝝺'=>'𝝺','𝝻'=>'𝝻','𝝼'=>'𝝼','𝝽'=>'𝝽','𝝾'=>'𝝾','𝝿'=>'𝝿','𝞀'=>'𝞀','𝞁'=>'𝞁','𝞂'=>'𝞂','𝞃'=>'𝞃','𝞄'=>'𝞄','𝞅'=>'𝞅','𝞆'=>'𝞆','𝞇'=>'𝞇','𝞈'=>'𝞈','𝞊'=>'𝞊','𝞋'=>'𝞋','𝞌'=>'𝞌','𝞍'=>'𝞍','𝞎'=>'𝞎','𝞏'=>'𝞏','𝞐'=>'𝞐','𝞑'=>'𝞑','𝞒'=>'𝞒','𝞓'=>'𝞓','𝞔'=>'𝞔','𝞕'=>'𝞕','𝞖'=>'𝞖','𝞗'=>'𝞗','𝞘'=>'𝞘','𝞙'=>'𝞙','𝞚'=>'𝞚','𝞛'=>'𝞛','𝞜'=>'𝞜','𝞝'=>'𝞝','𝞞'=>'𝞞','𝞟'=>'𝞟','𝞠'=>'𝞠','𝞡'=>'𝞡','𝞢'=>'𝞢','𝞣'=>'𝞣','𝞤'=>'𝞤','𝞥'=>'𝞥','𝞦'=>'𝞦','𝞧'=>'𝞧','𝞨'=>'𝞨','𝞪'=>'𝞪','𝞫'=>'𝞫','𝞬'=>'𝞬','𝞭'=>'𝞭','𝞮'=>'𝞮','𝞯'=>'𝞯','𝞰'=>'𝞰','𝞱'=>'𝞱','𝞲'=>'𝞲','𝞳'=>'𝞳','𝞴'=>'𝞴','𝞵'=>'𝞵','𝞶'=>'𝞶','𝞷'=>'𝞷','𝞸'=>'𝞸','𝞹'=>'𝞹','𝞺'=>'𝞺','𝞻'=>'𝞻','𝞼'=>'𝞼','𝞽'=>'𝞽','𝞾'=>'𝞾','𝞿'=>'𝞿','𝟀'=>'𝟀','𝟁'=>'𝟁','𝟂'=>'𝟂','𝟄'=>'𝟄','𝟅'=>'𝟅','𝟆'=>'𝟆','𝟇'=>'𝟇','𝟈'=>'𝟈','𝟉'=>'𝟉','𝟊'=>'𝟊','𝟋'=>'𝟋','𝟎'=>'0','𝟏'=>'1','𝟐'=>'2','𝟑'=>'3','𝟒'=>'4','𝟓'=>'5','𝟔'=>'6','𝟕'=>'7','𝟖'=>'8','𝟗'=>'9','𝟘'=>'0','𝟙'=>'1','𝟚'=>'2','𝟛'=>'3','𝟜'=>'4','𝟝'=>'5','𝟞'=>'6','𝟟'=>'7','𝟠'=>'8','𝟡'=>'9','𝟢'=>'0','𝟣'=>'1','𝟤'=>'2','𝟥'=>'3','𝟦'=>'4','𝟧'=>'5','𝟨'=>'6','𝟩'=>'7','𝟪'=>'8','𝟫'=>'9','𝟬'=>'0','𝟭'=>'1','𝟮'=>'2','𝟯'=>'3','𝟰'=>'4','𝟱'=>'5','𝟲'=>'6','𝟳'=>'7','𝟴'=>'8','𝟵'=>'9','𝟶'=>'0','𝟷'=>'1','𝟸'=>'2','𝟹'=>'3','𝟺'=>'4','𝟻'=>'5','𝟼'=>'6','𝟽'=>'7','𝟾'=>'8','𝟿'=>'9');
diff --git a/phpBB/includes/utf/data/search_indexer_6.php b/phpBB/includes/utf/data/search_indexer_6.php
index f6d2ac0665..1ccce03a51 100644
--- a/phpBB/includes/utf/data/search_indexer_6.php
+++ b/phpBB/includes/utf/data/search_indexer_6.php
@@ -1 +1 @@
-<?php return array('々'=>'々','〆'=>'〆','〇'=>'0','〡'=>'1','〢'=>'2','〣'=>'3','〤'=>'4','〥'=>'5','〦'=>'6','〧'=>'7','〨'=>'8','〩'=>'9','〪'=>'〪','〫'=>'〫','〬'=>'〬','〭'=>'〭','〮'=>'〮','〯'=>'〯','〱'=>'〱','〲'=>'〲','〳'=>'〳','〴'=>'〴','〵'=>'〵','〸'=>'10','〹'=>'20','〺'=>'30','〻'=>'〻','〼'=>'〼','ぁ'=>'ぁ','あ'=>'あ','ぃ'=>'ぃ','い'=>'い','ぅ'=>'ぅ','う'=>'う','ぇ'=>'ぇ','え'=>'え','ぉ'=>'ぉ','お'=>'お','か'=>'か','が'=>'が','き'=>'き','ぎ'=>'ぎ','く'=>'く','ぐ'=>'ぐ','け'=>'け','げ'=>'げ','こ'=>'こ','ご'=>'ご','さ'=>'さ','ざ'=>'ざ','し'=>'し','じ'=>'じ','す'=>'す','ず'=>'ず','せ'=>'せ','ぜ'=>'ぜ','そ'=>'そ','ぞ'=>'ぞ','た'=>'た','だ'=>'だ','ち'=>'ち','ぢ'=>'ぢ','っ'=>'っ','つ'=>'つ','づ'=>'づ','て'=>'て','で'=>'で','と'=>'と','ど'=>'ど','な'=>'な','に'=>'に','ぬ'=>'ぬ','ね'=>'ね','の'=>'の','は'=>'は','ば'=>'ば','ぱ'=>'ぱ','ひ'=>'ひ','び'=>'び','ぴ'=>'ぴ','ふ'=>'ふ','ぶ'=>'ぶ','ぷ'=>'ぷ','へ'=>'へ','べ'=>'べ','ぺ'=>'ぺ','ほ'=>'ほ','ぼ'=>'ぼ','ぽ'=>'ぽ','ま'=>'ま','み'=>'み','む'=>'む','め'=>'め','も'=>'も','ゃ'=>'ゃ','や'=>'や','ゅ'=>'ゅ','ゆ'=>'ゆ','ょ'=>'ょ','よ'=>'よ','ら'=>'ら','り'=>'り','る'=>'る','れ'=>'れ','ろ'=>'ろ','ゎ'=>'ゎ','わ'=>'わ','ゐ'=>'ゐ','ゑ'=>'ゑ','を'=>'を','ん'=>'ん','ゔ'=>'ゔ','ゕ'=>'ゕ','ゖ'=>'ゖ','゙'=>'゙','゚'=>'゚','ゝ'=>'ゝ','ゞ'=>'ゞ','ゟ'=>'ゟ','ァ'=>'ァ','ア'=>'ア','ィ'=>'ィ','イ'=>'イ','ゥ'=>'ゥ','ウ'=>'ウ','ェ'=>'ェ','エ'=>'エ','ォ'=>'ォ','オ'=>'オ','カ'=>'カ','ガ'=>'ガ','キ'=>'キ','ギ'=>'ギ','ク'=>'ク','グ'=>'グ','ケ'=>'ケ','ゲ'=>'ゲ','コ'=>'コ','ゴ'=>'ゴ','サ'=>'サ','ザ'=>'ザ','シ'=>'シ','ジ'=>'ジ','ス'=>'ス','ズ'=>'ズ','セ'=>'セ','ゼ'=>'ゼ','ソ'=>'ソ','ゾ'=>'ゾ','タ'=>'タ','ダ'=>'ダ','チ'=>'チ','ヂ'=>'ヂ','ッ'=>'ッ','ツ'=>'ツ','ヅ'=>'ヅ','テ'=>'テ','デ'=>'デ','ト'=>'ト','ド'=>'ド','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','バ'=>'バ','パ'=>'パ','ヒ'=>'ヒ','ビ'=>'ビ','ピ'=>'ピ','フ'=>'フ','ブ'=>'ブ','プ'=>'プ','ヘ'=>'ヘ','ベ'=>'ベ','ペ'=>'ペ','ホ'=>'ホ','ボ'=>'ボ','ポ'=>'ポ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ャ'=>'ャ','ヤ'=>'ヤ','ュ'=>'ュ','ユ'=>'ユ','ョ'=>'ョ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ヮ'=>'ヮ','ワ'=>'ワ','ヰ'=>'ヰ','ヱ'=>'ヱ','ヲ'=>'ヲ','ン'=>'ン','ヴ'=>'ヴ','ヵ'=>'ヵ','ヶ'=>'ヶ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ー'=>'ー','ヽ'=>'ヽ','ヾ'=>'ヾ','ヿ'=>'ヿ','ㄅ'=>'ㄅ','ㄆ'=>'ㄆ','ㄇ'=>'ㄇ','ㄈ'=>'ㄈ','ㄉ'=>'ㄉ','ㄊ'=>'ㄊ','ㄋ'=>'ㄋ','ㄌ'=>'ㄌ','ㄍ'=>'ㄍ','ㄎ'=>'ㄎ','ㄏ'=>'ㄏ','ㄐ'=>'ㄐ','ㄑ'=>'ㄑ','ㄒ'=>'ㄒ','ㄓ'=>'ㄓ','ㄔ'=>'ㄔ','ㄕ'=>'ㄕ','ㄖ'=>'ㄖ','ㄗ'=>'ㄗ','ㄘ'=>'ㄘ','ㄙ'=>'ㄙ','ㄚ'=>'ㄚ','ㄛ'=>'ㄛ','ㄜ'=>'ㄜ','ㄝ'=>'ㄝ','ㄞ'=>'ㄞ','ㄟ'=>'ㄟ','ㄠ'=>'ㄠ','ㄡ'=>'ㄡ','ㄢ'=>'ㄢ','ㄣ'=>'ㄣ','ㄤ'=>'ㄤ','ㄥ'=>'ㄥ','ㄦ'=>'ㄦ','ㄧ'=>'ㄧ','ㄨ'=>'ㄨ','ㄩ'=>'ㄩ','ㄪ'=>'ㄪ','ㄫ'=>'ㄫ','ㄬ'=>'ㄬ','ㄱ'=>'ㄱ','ㄲ'=>'ㄲ','ㄳ'=>'ㄳ','ㄴ'=>'ㄴ','ㄵ'=>'ㄵ','ㄶ'=>'ㄶ','ㄷ'=>'ㄷ','ㄸ'=>'ㄸ','ㄹ'=>'ㄹ','ㄺ'=>'ㄺ','ㄻ'=>'ㄻ','ㄼ'=>'ㄼ','ㄽ'=>'ㄽ','ㄾ'=>'ㄾ','ㄿ'=>'ㄿ','ㅀ'=>'ㅀ','ㅁ'=>'ㅁ','ㅂ'=>'ㅂ','ㅃ'=>'ㅃ','ㅄ'=>'ㅄ','ㅅ'=>'ㅅ','ㅆ'=>'ㅆ','ㅇ'=>'ㅇ','ㅈ'=>'ㅈ','ㅉ'=>'ㅉ','ㅊ'=>'ㅊ','ㅋ'=>'ㅋ','ㅌ'=>'ㅌ','ㅍ'=>'ㅍ','ㅎ'=>'ㅎ','ㅏ'=>'ㅏ','ㅐ'=>'ㅐ','ㅑ'=>'ㅑ','ㅒ'=>'ㅒ','ㅓ'=>'ㅓ','ㅔ'=>'ㅔ','ㅕ'=>'ㅕ','ㅖ'=>'ㅖ','ㅗ'=>'ㅗ','ㅘ'=>'ㅘ','ㅙ'=>'ㅙ','ㅚ'=>'ㅚ','ㅛ'=>'ㅛ','ㅜ'=>'ㅜ','ㅝ'=>'ㅝ','ㅞ'=>'ㅞ','ㅟ'=>'ㅟ','ㅠ'=>'ㅠ','ㅡ'=>'ㅡ','ㅢ'=>'ㅢ','ㅣ'=>'ㅣ','ㅤ'=>'ㅤ','ㅥ'=>'ㅥ','ㅦ'=>'ㅦ','ㅧ'=>'ㅧ','ㅨ'=>'ㅨ','ㅩ'=>'ㅩ','ㅪ'=>'ㅪ','ㅫ'=>'ㅫ','ㅬ'=>'ㅬ','ㅭ'=>'ㅭ','ㅮ'=>'ㅮ','ㅯ'=>'ㅯ','ㅰ'=>'ㅰ','ㅱ'=>'ㅱ','ㅲ'=>'ㅲ','ㅳ'=>'ㅳ','ㅴ'=>'ㅴ','ㅵ'=>'ㅵ','ㅶ'=>'ㅶ','ㅷ'=>'ㅷ','ㅸ'=>'ㅸ','ㅹ'=>'ㅹ','ㅺ'=>'ㅺ','ㅻ'=>'ㅻ','ㅼ'=>'ㅼ','ㅽ'=>'ㅽ','ㅾ'=>'ㅾ','ㅿ'=>'ㅿ','ㆀ'=>'ㆀ','ㆁ'=>'ㆁ','ㆂ'=>'ㆂ','ㆃ'=>'ㆃ','ㆄ'=>'ㆄ','ㆅ'=>'ㆅ','ㆆ'=>'ㆆ','ㆇ'=>'ㆇ','ㆈ'=>'ㆈ','ㆉ'=>'ㆉ','ㆊ'=>'ㆊ','ㆋ'=>'ㆋ','ㆌ'=>'ㆌ','ㆍ'=>'ㆍ','ㆎ'=>'ㆎ','㆒'=>'1','㆓'=>'2','㆔'=>'3','㆕'=>'4','ㆠ'=>'ㆠ','ㆡ'=>'ㆡ','ㆢ'=>'ㆢ','ㆣ'=>'ㆣ','ㆤ'=>'ㆤ','ㆥ'=>'ㆥ','ㆦ'=>'ㆦ','ㆧ'=>'ㆧ','ㆨ'=>'ㆨ','ㆩ'=>'ㆩ','ㆪ'=>'ㆪ','ㆫ'=>'ㆫ','ㆬ'=>'ㆬ','ㆭ'=>'ㆭ','ㆮ'=>'ㆮ','ㆯ'=>'ㆯ','ㆰ'=>'ㆰ','ㆱ'=>'ㆱ','ㆲ'=>'ㆲ','ㆳ'=>'ㆳ','ㆴ'=>'ㆴ','ㆵ'=>'ㆵ','ㆶ'=>'ㆶ','ㆷ'=>'ㆷ','ㇰ'=>'ㇰ','ㇱ'=>'ㇱ','ㇲ'=>'ㇲ','ㇳ'=>'ㇳ','ㇴ'=>'ㇴ','ㇵ'=>'ㇵ','ㇶ'=>'ㇶ','ㇷ'=>'ㇷ','ㇸ'=>'ㇸ','ㇹ'=>'ㇹ','ㇺ'=>'ㇺ','ㇻ'=>'ㇻ','ㇼ'=>'ㇼ','ㇽ'=>'ㇽ','ㇾ'=>'ㇾ','ㇿ'=>'ㇿ','㈠'=>'1','㈡'=>'2','㈢'=>'3','㈣'=>'4','㈤'=>'5','㈥'=>'6','㈦'=>'7','㈧'=>'8','㈨'=>'9','㈩'=>'10','㉑'=>'21','㉒'=>'22','㉓'=>'23','㉔'=>'24','㉕'=>'25','㉖'=>'26','㉗'=>'27','㉘'=>'28','㉙'=>'29','㉚'=>'30','㉛'=>'31','㉜'=>'32','㉝'=>'33','㉞'=>'34','㉟'=>'35','㊀'=>'1','㊁'=>'2','㊂'=>'3','㊃'=>'4','㊄'=>'5','㊅'=>'6','㊆'=>'7','㊇'=>'8','㊈'=>'9','㊉'=>'10','㊱'=>'36','㊲'=>'37','㊳'=>'38','㊴'=>'39','㊵'=>'40','㊶'=>'41','㊷'=>'42','㊸'=>'43','㊹'=>'44','㊺'=>'45','㊻'=>'46','㊼'=>'47','㊽'=>'48','㊾'=>'49','㊿'=>'50','㐀'=>'㐀'); \ No newline at end of file
+<?php return array('々'=>'々','〆'=>'〆','〇'=>'0','〡'=>'1','〢'=>'2','〣'=>'3','〤'=>'4','〥'=>'5','〦'=>'6','〧'=>'7','〨'=>'8','〩'=>'9','〪'=>'〪','〫'=>'〫','〬'=>'〬','〭'=>'〭','〮'=>'〮','〯'=>'〯','〱'=>'〱','〲'=>'〲','〳'=>'〳','〴'=>'〴','〵'=>'〵','〸'=>'10','〹'=>'20','〺'=>'30','〻'=>'〻','〼'=>'〼','ぁ'=>'ぁ','あ'=>'あ','ぃ'=>'ぃ','い'=>'い','ぅ'=>'ぅ','う'=>'う','ぇ'=>'ぇ','え'=>'え','ぉ'=>'ぉ','お'=>'お','か'=>'か','が'=>'が','き'=>'き','ぎ'=>'ぎ','く'=>'く','ぐ'=>'ぐ','け'=>'け','げ'=>'げ','こ'=>'こ','ご'=>'ご','さ'=>'さ','ざ'=>'ざ','し'=>'し','じ'=>'じ','す'=>'す','ず'=>'ず','せ'=>'せ','ぜ'=>'ぜ','そ'=>'そ','ぞ'=>'ぞ','た'=>'た','だ'=>'だ','ち'=>'ち','ぢ'=>'ぢ','っ'=>'っ','つ'=>'つ','づ'=>'づ','て'=>'て','で'=>'で','と'=>'と','ど'=>'ど','な'=>'な','に'=>'に','ぬ'=>'ぬ','ね'=>'ね','の'=>'の','は'=>'は','ば'=>'ば','ぱ'=>'ぱ','ひ'=>'ひ','び'=>'び','ぴ'=>'ぴ','ふ'=>'ふ','ぶ'=>'ぶ','ぷ'=>'ぷ','へ'=>'へ','べ'=>'べ','ぺ'=>'ぺ','ほ'=>'ほ','ぼ'=>'ぼ','ぽ'=>'ぽ','ま'=>'ま','み'=>'み','む'=>'む','め'=>'め','も'=>'も','ゃ'=>'ゃ','や'=>'や','ゅ'=>'ゅ','ゆ'=>'ゆ','ょ'=>'ょ','よ'=>'よ','ら'=>'ら','り'=>'り','る'=>'る','れ'=>'れ','ろ'=>'ろ','ゎ'=>'ゎ','わ'=>'わ','ゐ'=>'ゐ','ゑ'=>'ゑ','を'=>'を','ん'=>'ん','ゔ'=>'ゔ','ゕ'=>'ゕ','ゖ'=>'ゖ','゙'=>'゙','゚'=>'゚','ゝ'=>'ゝ','ゞ'=>'ゞ','ゟ'=>'ゟ','ァ'=>'ァ','ア'=>'ア','ィ'=>'ィ','イ'=>'イ','ゥ'=>'ゥ','ウ'=>'ウ','ェ'=>'ェ','エ'=>'エ','ォ'=>'ォ','オ'=>'オ','カ'=>'カ','ガ'=>'ガ','キ'=>'キ','ギ'=>'ギ','ク'=>'ク','グ'=>'グ','ケ'=>'ケ','ゲ'=>'ゲ','コ'=>'コ','ゴ'=>'ゴ','サ'=>'サ','ザ'=>'ザ','シ'=>'シ','ジ'=>'ジ','ス'=>'ス','ズ'=>'ズ','セ'=>'セ','ゼ'=>'ゼ','ソ'=>'ソ','ゾ'=>'ゾ','タ'=>'タ','ダ'=>'ダ','チ'=>'チ','ヂ'=>'ヂ','ッ'=>'ッ','ツ'=>'ツ','ヅ'=>'ヅ','テ'=>'テ','デ'=>'デ','ト'=>'ト','ド'=>'ド','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','バ'=>'バ','パ'=>'パ','ヒ'=>'ヒ','ビ'=>'ビ','ピ'=>'ピ','フ'=>'フ','ブ'=>'ブ','プ'=>'プ','ヘ'=>'ヘ','ベ'=>'ベ','ペ'=>'ペ','ホ'=>'ホ','ボ'=>'ボ','ポ'=>'ポ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ャ'=>'ャ','ヤ'=>'ヤ','ュ'=>'ュ','ユ'=>'ユ','ョ'=>'ョ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ヮ'=>'ヮ','ワ'=>'ワ','ヰ'=>'ヰ','ヱ'=>'ヱ','ヲ'=>'ヲ','ン'=>'ン','ヴ'=>'ヴ','ヵ'=>'ヵ','ヶ'=>'ヶ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ー'=>'ー','ヽ'=>'ヽ','ヾ'=>'ヾ','ヿ'=>'ヿ','ㄅ'=>'ㄅ','ㄆ'=>'ㄆ','ㄇ'=>'ㄇ','ㄈ'=>'ㄈ','ㄉ'=>'ㄉ','ㄊ'=>'ㄊ','ㄋ'=>'ㄋ','ㄌ'=>'ㄌ','ㄍ'=>'ㄍ','ㄎ'=>'ㄎ','ㄏ'=>'ㄏ','ㄐ'=>'ㄐ','ㄑ'=>'ㄑ','ㄒ'=>'ㄒ','ㄓ'=>'ㄓ','ㄔ'=>'ㄔ','ㄕ'=>'ㄕ','ㄖ'=>'ㄖ','ㄗ'=>'ㄗ','ㄘ'=>'ㄘ','ㄙ'=>'ㄙ','ㄚ'=>'ㄚ','ㄛ'=>'ㄛ','ㄜ'=>'ㄜ','ㄝ'=>'ㄝ','ㄞ'=>'ㄞ','ㄟ'=>'ㄟ','ㄠ'=>'ㄠ','ㄡ'=>'ㄡ','ㄢ'=>'ㄢ','ㄣ'=>'ㄣ','ㄤ'=>'ㄤ','ㄥ'=>'ㄥ','ㄦ'=>'ㄦ','ㄧ'=>'ㄧ','ㄨ'=>'ㄨ','ㄩ'=>'ㄩ','ㄪ'=>'ㄪ','ㄫ'=>'ㄫ','ㄬ'=>'ㄬ','ㄱ'=>'ㄱ','ㄲ'=>'ㄲ','ㄳ'=>'ㄳ','ㄴ'=>'ㄴ','ㄵ'=>'ㄵ','ㄶ'=>'ㄶ','ㄷ'=>'ㄷ','ㄸ'=>'ㄸ','ㄹ'=>'ㄹ','ㄺ'=>'ㄺ','ㄻ'=>'ㄻ','ㄼ'=>'ㄼ','ㄽ'=>'ㄽ','ㄾ'=>'ㄾ','ㄿ'=>'ㄿ','ㅀ'=>'ㅀ','ㅁ'=>'ㅁ','ㅂ'=>'ㅂ','ㅃ'=>'ㅃ','ㅄ'=>'ㅄ','ㅅ'=>'ㅅ','ㅆ'=>'ㅆ','ㅇ'=>'ㅇ','ㅈ'=>'ㅈ','ㅉ'=>'ㅉ','ㅊ'=>'ㅊ','ㅋ'=>'ㅋ','ㅌ'=>'ㅌ','ㅍ'=>'ㅍ','ㅎ'=>'ㅎ','ㅏ'=>'ㅏ','ㅐ'=>'ㅐ','ㅑ'=>'ㅑ','ㅒ'=>'ㅒ','ㅓ'=>'ㅓ','ㅔ'=>'ㅔ','ㅕ'=>'ㅕ','ㅖ'=>'ㅖ','ㅗ'=>'ㅗ','ㅘ'=>'ㅘ','ㅙ'=>'ㅙ','ㅚ'=>'ㅚ','ㅛ'=>'ㅛ','ㅜ'=>'ㅜ','ㅝ'=>'ㅝ','ㅞ'=>'ㅞ','ㅟ'=>'ㅟ','ㅠ'=>'ㅠ','ㅡ'=>'ㅡ','ㅢ'=>'ㅢ','ㅣ'=>'ㅣ','ㅤ'=>'ㅤ','ㅥ'=>'ㅥ','ㅦ'=>'ㅦ','ㅧ'=>'ㅧ','ㅨ'=>'ㅨ','ㅩ'=>'ㅩ','ㅪ'=>'ㅪ','ㅫ'=>'ㅫ','ㅬ'=>'ㅬ','ㅭ'=>'ㅭ','ㅮ'=>'ㅮ','ㅯ'=>'ㅯ','ㅰ'=>'ㅰ','ㅱ'=>'ㅱ','ㅲ'=>'ㅲ','ㅳ'=>'ㅳ','ㅴ'=>'ㅴ','ㅵ'=>'ㅵ','ㅶ'=>'ㅶ','ㅷ'=>'ㅷ','ㅸ'=>'ㅸ','ㅹ'=>'ㅹ','ㅺ'=>'ㅺ','ㅻ'=>'ㅻ','ㅼ'=>'ㅼ','ㅽ'=>'ㅽ','ㅾ'=>'ㅾ','ㅿ'=>'ㅿ','ㆀ'=>'ㆀ','ㆁ'=>'ㆁ','ㆂ'=>'ㆂ','ㆃ'=>'ㆃ','ㆄ'=>'ㆄ','ㆅ'=>'ㆅ','ㆆ'=>'ㆆ','ㆇ'=>'ㆇ','ㆈ'=>'ㆈ','ㆉ'=>'ㆉ','ㆊ'=>'ㆊ','ㆋ'=>'ㆋ','ㆌ'=>'ㆌ','ㆍ'=>'ㆍ','ㆎ'=>'ㆎ','㆒'=>'1','㆓'=>'2','㆔'=>'3','㆕'=>'4','ㆠ'=>'ㆠ','ㆡ'=>'ㆡ','ㆢ'=>'ㆢ','ㆣ'=>'ㆣ','ㆤ'=>'ㆤ','ㆥ'=>'ㆥ','ㆦ'=>'ㆦ','ㆧ'=>'ㆧ','ㆨ'=>'ㆨ','ㆩ'=>'ㆩ','ㆪ'=>'ㆪ','ㆫ'=>'ㆫ','ㆬ'=>'ㆬ','ㆭ'=>'ㆭ','ㆮ'=>'ㆮ','ㆯ'=>'ㆯ','ㆰ'=>'ㆰ','ㆱ'=>'ㆱ','ㆲ'=>'ㆲ','ㆳ'=>'ㆳ','ㆴ'=>'ㆴ','ㆵ'=>'ㆵ','ㆶ'=>'ㆶ','ㆷ'=>'ㆷ','ㇰ'=>'ㇰ','ㇱ'=>'ㇱ','ㇲ'=>'ㇲ','ㇳ'=>'ㇳ','ㇴ'=>'ㇴ','ㇵ'=>'ㇵ','ㇶ'=>'ㇶ','ㇷ'=>'ㇷ','ㇸ'=>'ㇸ','ㇹ'=>'ㇹ','ㇺ'=>'ㇺ','ㇻ'=>'ㇻ','ㇼ'=>'ㇼ','ㇽ'=>'ㇽ','ㇾ'=>'ㇾ','ㇿ'=>'ㇿ','㈠'=>'1','㈡'=>'2','㈢'=>'3','㈣'=>'4','㈤'=>'5','㈥'=>'6','㈦'=>'7','㈧'=>'8','㈨'=>'9','㈩'=>'10','㉑'=>'21','㉒'=>'22','㉓'=>'23','㉔'=>'24','㉕'=>'25','㉖'=>'26','㉗'=>'27','㉘'=>'28','㉙'=>'29','㉚'=>'30','㉛'=>'31','㉜'=>'32','㉝'=>'33','㉞'=>'34','㉟'=>'35','㊀'=>'1','㊁'=>'2','㊂'=>'3','㊃'=>'4','㊄'=>'5','㊅'=>'6','㊆'=>'7','㊇'=>'8','㊈'=>'9','㊉'=>'10','㊱'=>'36','㊲'=>'37','㊳'=>'38','㊴'=>'39','㊵'=>'40','㊶'=>'41','㊷'=>'42','㊸'=>'43','㊹'=>'44','㊺'=>'45','㊻'=>'46','㊼'=>'47','㊽'=>'48','㊾'=>'49','㊿'=>'50','㐀'=>'㐀');
diff --git a/phpBB/includes/utf/data/search_indexer_64.php b/phpBB/includes/utf/data/search_indexer_64.php
index 44d0beb624..b5002d4c42 100644
--- a/phpBB/includes/utf/data/search_indexer_64.php
+++ b/phpBB/includes/utf/data/search_indexer_64.php
@@ -1 +1 @@
-<?php return array('𠀀'=>'𠀀'); \ No newline at end of file
+<?php return array('𠀀'=>'𠀀');
diff --git a/phpBB/includes/utf/data/search_indexer_84.php b/phpBB/includes/utf/data/search_indexer_84.php
index 5c3f1d54b8..c038215e58 100644
--- a/phpBB/includes/utf/data/search_indexer_84.php
+++ b/phpBB/includes/utf/data/search_indexer_84.php
@@ -1 +1 @@
-<?php return array('𪛖'=>'𪛖'); \ No newline at end of file
+<?php return array('𪛖'=>'𪛖');
diff --git a/phpBB/includes/utf/data/search_indexer_9.php b/phpBB/includes/utf/data/search_indexer_9.php
index bdf188291f..a358f784b9 100644
--- a/phpBB/includes/utf/data/search_indexer_9.php
+++ b/phpBB/includes/utf/data/search_indexer_9.php
@@ -1 +1 @@
-<?php return array('䶵'=>'䶵','一'=>'一'); \ No newline at end of file
+<?php return array('䶵'=>'䶵','一'=>'一');
diff --git a/phpBB/includes/utf/data/search_indexer_95.php b/phpBB/includes/utf/data/search_indexer_95.php
index b0f8eed3aa..63d27fbcd6 100644
--- a/phpBB/includes/utf/data/search_indexer_95.php
+++ b/phpBB/includes/utf/data/search_indexer_95.php
@@ -1 +1 @@
-<?php return array('丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀'); \ No newline at end of file
+<?php return array('丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀');
diff --git a/phpBB/includes/utf/data/utf_canonical_comp.php b/phpBB/includes/utf/data/utf_canonical_comp.php
index a3ed3ee602..2de3149ee8 100644
--- a/phpBB/includes/utf/data/utf_canonical_comp.php
+++ b/phpBB/includes/utf/data/utf_canonical_comp.php
@@ -1,2 +1,2 @@
<?php
-$GLOBALS['utf_canonical_comp']=array('À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','̈́'=>'̈́','΅'=>'΅','Ά'=>'Ά','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϓ'=>'ϓ','ϔ'=>'ϔ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','ো'=>'ো','ৌ'=>'ৌ','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ཱྀ'=>'ཱྀ','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẛ'=>'ẛ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ὲ'=>'ὲ','ὴ'=>'ὴ','ὶ'=>'ὶ','ὸ'=>'ὸ','ὺ'=>'ὺ','ὼ'=>'ὼ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','ᾼ'=>'ᾼ','῁'=>'῁','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Ὴ'=>'Ὴ','ῌ'=>'ῌ','῍'=>'῍','῎'=>'῎','῏'=>'῏','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','῝'=>'῝','῞'=>'῞','῟'=>'῟','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ῥ'=>'Ῥ','῭'=>'῭','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ὼ'=>'Ὼ','ῼ'=>'ῼ','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','ゞ'=>'ゞ','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ'); \ No newline at end of file
+$GLOBALS['utf_canonical_comp']=array('À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','̈́'=>'̈́','΅'=>'΅','Ά'=>'Ά','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϓ'=>'ϓ','ϔ'=>'ϔ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','ো'=>'ো','ৌ'=>'ৌ','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ཱྀ'=>'ཱྀ','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẛ'=>'ẛ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ὲ'=>'ὲ','ὴ'=>'ὴ','ὶ'=>'ὶ','ὸ'=>'ὸ','ὺ'=>'ὺ','ὼ'=>'ὼ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','ᾼ'=>'ᾼ','῁'=>'῁','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Ὴ'=>'Ὴ','ῌ'=>'ῌ','῍'=>'῍','῎'=>'῎','῏'=>'῏','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','῝'=>'῝','῞'=>'῞','῟'=>'῟','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ῥ'=>'Ῥ','῭'=>'῭','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ὼ'=>'Ὼ','ῼ'=>'ῼ','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','ゞ'=>'ゞ','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ');
diff --git a/phpBB/includes/utf/data/utf_canonical_decomp.php b/phpBB/includes/utf/data/utf_canonical_decomp.php
index 460a0cf323..9fb90803e2 100644
--- a/phpBB/includes/utf/data/utf_canonical_decomp.php
+++ b/phpBB/includes/utf/data/utf_canonical_decomp.php
@@ -1,2 +1,2 @@
<?php
-$GLOBALS['utf_canonical_decomp']=array('À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','̀'=>'̀','́'=>'́','̓'=>'̓','̈́'=>'̈́','ʹ'=>'ʹ',';'=>';','΅'=>'΅','Ά'=>'Ά','·'=>'·','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϓ'=>'ϓ','ϔ'=>'ϔ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ো'=>'ো','ৌ'=>'ৌ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ਫ਼'=>'ਫ਼','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','གྷ'=>'གྷ','ཌྷ'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ླྀ'=>'ླྀ','ཱྀ'=>'ཱྀ','ྒྷ'=>'ྒྷ','ྜྷ'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'ྐྵ','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẛ'=>'ẛ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','Ά'=>'Ά','ᾼ'=>'ᾼ','ι'=>'ι','῁'=>'῁','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'Έ','Ὴ'=>'Ὴ','Ή'=>'Ή','ῌ'=>'ῌ','῍'=>'῍','῎'=>'῎','῏'=>'῏','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','Ί'=>'Ί','῝'=>'῝','῞'=>'῞','῟'=>'῟','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ύ'=>'Ύ','Ῥ'=>'Ῥ','῭'=>'῭','΅'=>'΅','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'Ό','Ὼ'=>'Ὼ','Ώ'=>'Ώ','ῼ'=>'ῼ','´'=>'´',' '=>' ',' '=>' ','Ω'=>'Ω','K'=>'K','Å'=>'Å','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','〈'=>'〈','〉'=>'〉','⫝̸'=>'⫝̸','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','ゞ'=>'ゞ','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','塚'=>'塚','晴'=>'晴','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','יִ'=>'יִ','ײַ'=>'ײַ','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','𝅗𝅥'=>'𝅗𝅥','𝅘𝅥'=>'𝅘𝅥','𝅘𝅥𝅮'=>'𝅘𝅥𝅮','𝅘𝅥𝅯'=>'𝅘𝅥𝅯','𝅘𝅥𝅰'=>'𝅘𝅥𝅰','𝅘𝅥𝅱'=>'𝅘𝅥𝅱','𝅘𝅥𝅲'=>'𝅘𝅥𝅲','𝆹𝅥'=>'𝆹𝅥','𝆺𝅥'=>'𝆺𝅥','𝆹𝅥𝅮'=>'𝆹𝅥𝅮','𝆺𝅥𝅮'=>'𝆺𝅥𝅮','𝆹𝅥𝅯'=>'𝆹𝅥𝅯','𝆺𝅥𝅯'=>'𝆺𝅥𝅯','丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀'); \ No newline at end of file
+$GLOBALS['utf_canonical_decomp']=array('À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','̀'=>'̀','́'=>'́','̓'=>'̓','̈́'=>'̈́','ʹ'=>'ʹ',';'=>';','΅'=>'΅','Ά'=>'Ά','·'=>'·','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϓ'=>'ϓ','ϔ'=>'ϔ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ো'=>'ো','ৌ'=>'ৌ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ਫ਼'=>'ਫ਼','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','གྷ'=>'གྷ','ཌྷ'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ླྀ'=>'ླྀ','ཱྀ'=>'ཱྀ','ྒྷ'=>'ྒྷ','ྜྷ'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'ྐྵ','ဦ'=>'ဦ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẛ'=>'ẛ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','Ά'=>'Ά','ᾼ'=>'ᾼ','ι'=>'ι','῁'=>'῁','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'Έ','Ὴ'=>'Ὴ','Ή'=>'Ή','ῌ'=>'ῌ','῍'=>'῍','῎'=>'῎','῏'=>'῏','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','Ί'=>'Ί','῝'=>'῝','῞'=>'῞','῟'=>'῟','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ύ'=>'Ύ','Ῥ'=>'Ῥ','῭'=>'῭','΅'=>'΅','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'Ό','Ὼ'=>'Ὼ','Ώ'=>'Ώ','ῼ'=>'ῼ','´'=>'´',' '=>' ',' '=>' ','Ω'=>'Ω','K'=>'K','Å'=>'Å','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','〈'=>'〈','〉'=>'〉','⫝̸'=>'⫝̸','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','ゞ'=>'ゞ','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','塚'=>'塚','晴'=>'晴','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','יִ'=>'יִ','ײַ'=>'ײַ','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','𝅗𝅥'=>'𝅗𝅥','𝅘𝅥'=>'𝅘𝅥','𝅘𝅥𝅮'=>'𝅘𝅥𝅮','𝅘𝅥𝅯'=>'𝅘𝅥𝅯','𝅘𝅥𝅰'=>'𝅘𝅥𝅰','𝅘𝅥𝅱'=>'𝅘𝅥𝅱','𝅘𝅥𝅲'=>'𝅘𝅥𝅲','𝆹𝅥'=>'𝆹𝅥','𝆺𝅥'=>'𝆺𝅥','𝆹𝅥𝅮'=>'𝆹𝅥𝅮','𝆺𝅥𝅮'=>'𝆺𝅥𝅮','𝆹𝅥𝅯'=>'𝆹𝅥𝅯','𝆺𝅥𝅯'=>'𝆺𝅥𝅯','丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀');
diff --git a/phpBB/includes/utf/data/utf_compatibility_decomp.php b/phpBB/includes/utf/data/utf_compatibility_decomp.php
index 08a7a047a4..c62948e81a 100644
--- a/phpBB/includes/utf/data/utf_compatibility_decomp.php
+++ b/phpBB/includes/utf/data/utf_compatibility_decomp.php
@@ -1,2 +1,2 @@
<?php
-$GLOBALS['utf_compatibility_decomp']=array(' '=>' ','¨'=>' ̈','ª'=>'a','¯'=>' ̄','²'=>'2','³'=>'3','´'=>' ́','µ'=>'μ','¸'=>' ̧','¹'=>'1','º'=>'o','¼'=>'1⁄4','½'=>'1⁄2','¾'=>'3⁄4','À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','IJ'=>'IJ','ij'=>'ij','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ŀ'=>'L·','ŀ'=>'l·','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','ʼn'=>'ʼn','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','ſ'=>'s','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','DŽ'=>'DŽ','Dž'=>'Dž','dž'=>'dž','LJ'=>'LJ','Lj'=>'Lj','lj'=>'lj','NJ'=>'NJ','Nj'=>'Nj','nj'=>'nj','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','DZ'=>'DZ','Dz'=>'Dz','dz'=>'dz','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','ʰ'=>'h','ʱ'=>'ɦ','ʲ'=>'j','ʳ'=>'r','ʴ'=>'ɹ','ʵ'=>'ɻ','ʶ'=>'ʁ','ʷ'=>'w','ʸ'=>'y','˘'=>' ̆','˙'=>' ̇','˚'=>' ̊','˛'=>' ̨','˜'=>' ̃','˝'=>' ̋','ˠ'=>'ɣ','ˡ'=>'l','ˢ'=>'s','ˣ'=>'x','ˤ'=>'ʕ','̀'=>'̀','́'=>'́','̓'=>'̓','̈́'=>'̈́','ʹ'=>'ʹ','ͺ'=>' ͅ',';'=>';','΄'=>' ́','΅'=>' ̈́','Ά'=>'Ά','·'=>'·','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϐ'=>'β','ϑ'=>'θ','ϒ'=>'Υ','ϓ'=>'Ύ','ϔ'=>'Ϋ','ϕ'=>'φ','ϖ'=>'π','ϰ'=>'κ','ϱ'=>'ρ','ϲ'=>'ς','ϴ'=>'Θ','ϵ'=>'ε','Ϲ'=>'Σ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','և'=>'եւ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ٵ'=>'اٴ','ٶ'=>'وٴ','ٷ'=>'ۇٴ','ٸ'=>'يٴ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ো'=>'ো','ৌ'=>'ৌ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ਫ਼'=>'ਫ਼','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ำ'=>'ํา','ຳ'=>'ໍາ','ໜ'=>'ຫນ','ໝ'=>'ຫມ','༌'=>'་','གྷ'=>'གྷ','ཌྷ'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ཷ'=>'ྲཱྀ','ླྀ'=>'ླྀ','ཹ'=>'ླཱྀ','ཱྀ'=>'ཱྀ','ྒྷ'=>'ྒྷ','ྜྷ'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'ྐྵ','ဦ'=>'ဦ','ჼ'=>'ნ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','ᴬ'=>'A','ᴭ'=>'Æ','ᴮ'=>'B','ᴰ'=>'D','ᴱ'=>'E','ᴲ'=>'Ǝ','ᴳ'=>'G','ᴴ'=>'H','ᴵ'=>'I','ᴶ'=>'J','ᴷ'=>'K','ᴸ'=>'L','ᴹ'=>'M','ᴺ'=>'N','ᴼ'=>'O','ᴽ'=>'Ȣ','ᴾ'=>'P','ᴿ'=>'R','ᵀ'=>'T','ᵁ'=>'U','ᵂ'=>'W','ᵃ'=>'a','ᵄ'=>'ɐ','ᵅ'=>'ɑ','ᵆ'=>'ᴂ','ᵇ'=>'b','ᵈ'=>'d','ᵉ'=>'e','ᵊ'=>'ə','ᵋ'=>'ɛ','ᵌ'=>'ɜ','ᵍ'=>'g','ᵏ'=>'k','ᵐ'=>'m','ᵑ'=>'ŋ','ᵒ'=>'o','ᵓ'=>'ɔ','ᵔ'=>'ᴖ','ᵕ'=>'ᴗ','ᵖ'=>'p','ᵗ'=>'t','ᵘ'=>'u','ᵙ'=>'ᴝ','ᵚ'=>'ɯ','ᵛ'=>'v','ᵜ'=>'ᴥ','ᵝ'=>'β','ᵞ'=>'γ','ᵟ'=>'δ','ᵠ'=>'φ','ᵡ'=>'χ','ᵢ'=>'i','ᵣ'=>'r','ᵤ'=>'u','ᵥ'=>'v','ᵦ'=>'β','ᵧ'=>'γ','ᵨ'=>'ρ','ᵩ'=>'φ','ᵪ'=>'χ','ᵸ'=>'н','ᶛ'=>'ɒ','ᶜ'=>'c','ᶝ'=>'ɕ','ᶞ'=>'ð','ᶟ'=>'ɜ','ᶠ'=>'f','ᶡ'=>'ɟ','ᶢ'=>'ɡ','ᶣ'=>'ɥ','ᶤ'=>'ɨ','ᶥ'=>'ɩ','ᶦ'=>'ɪ','ᶧ'=>'ᵻ','ᶨ'=>'ʝ','ᶩ'=>'ɭ','ᶪ'=>'ᶅ','ᶫ'=>'ʟ','ᶬ'=>'ɱ','ᶭ'=>'ɰ','ᶮ'=>'ɲ','ᶯ'=>'ɳ','ᶰ'=>'ɴ','ᶱ'=>'ɵ','ᶲ'=>'ɸ','ᶳ'=>'ʂ','ᶴ'=>'ʃ','ᶵ'=>'ƫ','ᶶ'=>'ʉ','ᶷ'=>'ʊ','ᶸ'=>'ᴜ','ᶹ'=>'ʋ','ᶺ'=>'ʌ','ᶻ'=>'z','ᶼ'=>'ʐ','ᶽ'=>'ʑ','ᶾ'=>'ʒ','ᶿ'=>'θ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'aʾ','ẛ'=>'ṡ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','Ά'=>'Ά','ᾼ'=>'ᾼ','᾽'=>' ̓','ι'=>'ι','᾿'=>' ̓','῀'=>' ͂','῁'=>' ̈͂','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'Έ','Ὴ'=>'Ὴ','Ή'=>'Ή','ῌ'=>'ῌ','῍'=>' ̓̀','῎'=>' ̓́','῏'=>' ̓͂','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','Ί'=>'Ί','῝'=>' ̔̀','῞'=>' ̔́','῟'=>' ̔͂','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ύ'=>'Ύ','Ῥ'=>'Ῥ','῭'=>' ̈̀','΅'=>' ̈́','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'Ό','Ὼ'=>'Ὼ','Ώ'=>'Ώ','ῼ'=>'ῼ','´'=>' ́','῾'=>' ̔',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','‑'=>'‐','‗'=>' ̳','․'=>'.','‥'=>'..','…'=>'...',' '=>' ','″'=>'′′','‴'=>'′′′','‶'=>'‵‵','‷'=>'‵‵‵','‼'=>'!!','‾'=>' ̅','⁇'=>'??','⁈'=>'?!','⁉'=>'!?','⁗'=>'′′′′',' '=>' ','⁰'=>'0','ⁱ'=>'i','⁴'=>'4','⁵'=>'5','⁶'=>'6','⁷'=>'7','⁸'=>'8','⁹'=>'9','⁺'=>'+','⁻'=>'−','⁼'=>'=','⁽'=>'(','⁾'=>')','ⁿ'=>'n','₀'=>'0','₁'=>'1','₂'=>'2','₃'=>'3','₄'=>'4','₅'=>'5','₆'=>'6','₇'=>'7','₈'=>'8','₉'=>'9','₊'=>'+','₋'=>'−','₌'=>'=','₍'=>'(','₎'=>')','ₐ'=>'a','ₑ'=>'e','ₒ'=>'o','ₓ'=>'x','ₔ'=>'ə','₨'=>'Rs','℀'=>'a/c','℁'=>'a/s','ℂ'=>'C','℃'=>'°C','℅'=>'c/o','℆'=>'c/u','ℇ'=>'Ɛ','℉'=>'°F','ℊ'=>'g','ℋ'=>'H','ℌ'=>'H','ℍ'=>'H','ℎ'=>'h','ℏ'=>'ħ','ℐ'=>'I','ℑ'=>'I','ℒ'=>'L','ℓ'=>'l','ℕ'=>'N','№'=>'No','ℙ'=>'P','ℚ'=>'Q','ℛ'=>'R','ℜ'=>'R','ℝ'=>'R','℠'=>'SM','℡'=>'TEL','™'=>'TM','ℤ'=>'Z','Ω'=>'Ω','ℨ'=>'Z','K'=>'K','Å'=>'Å','ℬ'=>'B','ℭ'=>'C','ℯ'=>'e','ℰ'=>'E','ℱ'=>'F','ℳ'=>'M','ℴ'=>'o','ℵ'=>'א','ℶ'=>'ב','ℷ'=>'ג','ℸ'=>'ד','ℹ'=>'i','℻'=>'FAX','ℼ'=>'π','ℽ'=>'γ','ℾ'=>'Γ','ℿ'=>'Π','⅀'=>'∑','ⅅ'=>'D','ⅆ'=>'d','ⅇ'=>'e','ⅈ'=>'i','ⅉ'=>'j','⅓'=>'1⁄3','⅔'=>'2⁄3','⅕'=>'1⁄5','⅖'=>'2⁄5','⅗'=>'3⁄5','⅘'=>'4⁄5','⅙'=>'1⁄6','⅚'=>'5⁄6','⅛'=>'1⁄8','⅜'=>'3⁄8','⅝'=>'5⁄8','⅞'=>'7⁄8','⅟'=>'1⁄','Ⅰ'=>'I','Ⅱ'=>'II','Ⅲ'=>'III','Ⅳ'=>'IV','Ⅴ'=>'V','Ⅵ'=>'VI','Ⅶ'=>'VII','Ⅷ'=>'VIII','Ⅸ'=>'IX','Ⅹ'=>'X','Ⅺ'=>'XI','Ⅻ'=>'XII','Ⅼ'=>'L','Ⅽ'=>'C','Ⅾ'=>'D','Ⅿ'=>'M','ⅰ'=>'i','ⅱ'=>'ii','ⅲ'=>'iii','ⅳ'=>'iv','ⅴ'=>'v','ⅵ'=>'vi','ⅶ'=>'vii','ⅷ'=>'viii','ⅸ'=>'ix','ⅹ'=>'x','ⅺ'=>'xi','ⅻ'=>'xii','ⅼ'=>'l','ⅽ'=>'c','ⅾ'=>'d','ⅿ'=>'m','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','∬'=>'∫∫','∭'=>'∫∫∫','∯'=>'∮∮','∰'=>'∮∮∮','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','〈'=>'〈','〉'=>'〉','①'=>'1','②'=>'2','③'=>'3','④'=>'4','⑤'=>'5','⑥'=>'6','⑦'=>'7','⑧'=>'8','⑨'=>'9','⑩'=>'10','⑪'=>'11','⑫'=>'12','⑬'=>'13','⑭'=>'14','⑮'=>'15','⑯'=>'16','⑰'=>'17','⑱'=>'18','⑲'=>'19','⑳'=>'20','⑴'=>'(1)','⑵'=>'(2)','⑶'=>'(3)','⑷'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','⑻'=>'(8)','⑼'=>'(9)','⑽'=>'(10)','⑾'=>'(11)','⑿'=>'(12)','⒀'=>'(13)','⒁'=>'(14)','⒂'=>'(15)','⒃'=>'(16)','⒄'=>'(17)','⒅'=>'(18)','⒆'=>'(19)','⒇'=>'(20)','⒈'=>'1.','⒉'=>'2.','⒊'=>'3.','⒋'=>'4.','⒌'=>'5.','⒍'=>'6.','⒎'=>'7.','⒏'=>'8.','⒐'=>'9.','⒑'=>'10.','⒒'=>'11.','⒓'=>'12.','⒔'=>'13.','⒕'=>'14.','⒖'=>'15.','⒗'=>'16.','⒘'=>'17.','⒙'=>'18.','⒚'=>'19.','⒛'=>'20.','⒜'=>'(a)','⒝'=>'(b)','⒞'=>'(c)','⒟'=>'(d)','⒠'=>'(e)','⒡'=>'(f)','⒢'=>'(g)','⒣'=>'(h)','⒤'=>'(i)','⒥'=>'(j)','⒦'=>'(k)','⒧'=>'(l)','⒨'=>'(m)','⒩'=>'(n)','⒪'=>'(o)','⒫'=>'(p)','⒬'=>'(q)','⒭'=>'(r)','⒮'=>'(s)','⒯'=>'(t)','⒰'=>'(u)','⒱'=>'(v)','⒲'=>'(w)','⒳'=>'(x)','⒴'=>'(y)','⒵'=>'(z)','Ⓐ'=>'A','Ⓑ'=>'B','Ⓒ'=>'C','Ⓓ'=>'D','Ⓔ'=>'E','Ⓕ'=>'F','Ⓖ'=>'G','Ⓗ'=>'H','Ⓘ'=>'I','Ⓙ'=>'J','Ⓚ'=>'K','Ⓛ'=>'L','Ⓜ'=>'M','Ⓝ'=>'N','Ⓞ'=>'O','Ⓟ'=>'P','Ⓠ'=>'Q','Ⓡ'=>'R','Ⓢ'=>'S','Ⓣ'=>'T','Ⓤ'=>'U','Ⓥ'=>'V','Ⓦ'=>'W','Ⓧ'=>'X','Ⓨ'=>'Y','Ⓩ'=>'Z','ⓐ'=>'a','ⓑ'=>'b','ⓒ'=>'c','ⓓ'=>'d','ⓔ'=>'e','ⓕ'=>'f','ⓖ'=>'g','ⓗ'=>'h','ⓘ'=>'i','ⓙ'=>'j','ⓚ'=>'k','ⓛ'=>'l','ⓜ'=>'m','ⓝ'=>'n','ⓞ'=>'o','ⓟ'=>'p','ⓠ'=>'q','ⓡ'=>'r','ⓢ'=>'s','ⓣ'=>'t','ⓤ'=>'u','ⓥ'=>'v','ⓦ'=>'w','ⓧ'=>'x','ⓨ'=>'y','ⓩ'=>'z','⓪'=>'0','⨌'=>'∫∫∫∫','⩴'=>'::=','⩵'=>'==','⩶'=>'===','⫝̸'=>'⫝̸','ⵯ'=>'ⵡ','⺟'=>'母','⻳'=>'龟','⼀'=>'一','⼁'=>'丨','⼂'=>'丶','⼃'=>'丿','⼄'=>'乙','⼅'=>'亅','⼆'=>'二','⼇'=>'亠','⼈'=>'人','⼉'=>'儿','⼊'=>'入','⼋'=>'八','⼌'=>'冂','⼍'=>'冖','⼎'=>'冫','⼏'=>'几','⼐'=>'凵','⼑'=>'刀','⼒'=>'力','⼓'=>'勹','⼔'=>'匕','⼕'=>'匚','⼖'=>'匸','⼗'=>'十','⼘'=>'卜','⼙'=>'卩','⼚'=>'厂','⼛'=>'厶','⼜'=>'又','⼝'=>'口','⼞'=>'囗','⼟'=>'土','⼠'=>'士','⼡'=>'夂','⼢'=>'夊','⼣'=>'夕','⼤'=>'大','⼥'=>'女','⼦'=>'子','⼧'=>'宀','⼨'=>'寸','⼩'=>'小','⼪'=>'尢','⼫'=>'尸','⼬'=>'屮','⼭'=>'山','⼮'=>'巛','⼯'=>'工','⼰'=>'己','⼱'=>'巾','⼲'=>'干','⼳'=>'幺','⼴'=>'广','⼵'=>'廴','⼶'=>'廾','⼷'=>'弋','⼸'=>'弓','⼹'=>'彐','⼺'=>'彡','⼻'=>'彳','⼼'=>'心','⼽'=>'戈','⼾'=>'戶','⼿'=>'手','⽀'=>'支','⽁'=>'攴','⽂'=>'文','⽃'=>'斗','⽄'=>'斤','⽅'=>'方','⽆'=>'无','⽇'=>'日','⽈'=>'曰','⽉'=>'月','⽊'=>'木','⽋'=>'欠','⽌'=>'止','⽍'=>'歹','⽎'=>'殳','⽏'=>'毋','⽐'=>'比','⽑'=>'毛','⽒'=>'氏','⽓'=>'气','⽔'=>'水','⽕'=>'火','⽖'=>'爪','⽗'=>'父','⽘'=>'爻','⽙'=>'爿','⽚'=>'片','⽛'=>'牙','⽜'=>'牛','⽝'=>'犬','⽞'=>'玄','⽟'=>'玉','⽠'=>'瓜','⽡'=>'瓦','⽢'=>'甘','⽣'=>'生','⽤'=>'用','⽥'=>'田','⽦'=>'疋','⽧'=>'疒','⽨'=>'癶','⽩'=>'白','⽪'=>'皮','⽫'=>'皿','⽬'=>'目','⽭'=>'矛','⽮'=>'矢','⽯'=>'石','⽰'=>'示','⽱'=>'禸','⽲'=>'禾','⽳'=>'穴','⽴'=>'立','⽵'=>'竹','⽶'=>'米','⽷'=>'糸','⽸'=>'缶','⽹'=>'网','⽺'=>'羊','⽻'=>'羽','⽼'=>'老','⽽'=>'而','⽾'=>'耒','⽿'=>'耳','⾀'=>'聿','⾁'=>'肉','⾂'=>'臣','⾃'=>'自','⾄'=>'至','⾅'=>'臼','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','⾊'=>'色','⾋'=>'艸','⾌'=>'虍','⾍'=>'虫','⾎'=>'血','⾏'=>'行','⾐'=>'衣','⾑'=>'襾','⾒'=>'見','⾓'=>'角','⾔'=>'言','⾕'=>'谷','⾖'=>'豆','⾗'=>'豕','⾘'=>'豸','⾙'=>'貝','⾚'=>'赤','⾛'=>'走','⾜'=>'足','⾝'=>'身','⾞'=>'車','⾟'=>'辛','⾠'=>'辰','⾡'=>'辵','⾢'=>'邑','⾣'=>'酉','⾤'=>'釆','⾥'=>'里','⾦'=>'金','⾧'=>'長','⾨'=>'門','⾩'=>'阜','⾪'=>'隶','⾫'=>'隹','⾬'=>'雨','⾭'=>'靑','⾮'=>'非','⾯'=>'面','⾰'=>'革','⾱'=>'韋','⾲'=>'韭','⾳'=>'音','⾴'=>'頁','⾵'=>'風','⾶'=>'飛','⾷'=>'食','⾸'=>'首','⾹'=>'香','⾺'=>'馬','⾻'=>'骨','⾼'=>'高','⾽'=>'髟','⾾'=>'鬥','⾿'=>'鬯','⿀'=>'鬲','⿁'=>'鬼','⿂'=>'魚','⿃'=>'鳥','⿄'=>'鹵','⿅'=>'鹿','⿆'=>'麥','⿇'=>'麻','⿈'=>'黃','⿉'=>'黍','⿊'=>'黑','⿋'=>'黹','⿌'=>'黽','⿍'=>'鼎','⿎'=>'鼓','⿏'=>'鼠','⿐'=>'鼻','⿑'=>'齊','⿒'=>'齒','⿓'=>'龍','⿔'=>'龜','⿕'=>'龠',' '=>' ','〶'=>'〒','〸'=>'十','〹'=>'卄','〺'=>'卅','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','゛'=>' ゙','゜'=>' ゚','ゞ'=>'ゞ','ゟ'=>'より','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','ヿ'=>'コト','ㄱ'=>'ᄀ','ㄲ'=>'ᄁ','ㄳ'=>'ᆪ','ㄴ'=>'ᄂ','ㄵ'=>'ᆬ','ㄶ'=>'ᆭ','ㄷ'=>'ᄃ','ㄸ'=>'ᄄ','ㄹ'=>'ᄅ','ㄺ'=>'ᆰ','ㄻ'=>'ᆱ','ㄼ'=>'ᆲ','ㄽ'=>'ᆳ','ㄾ'=>'ᆴ','ㄿ'=>'ᆵ','ㅀ'=>'ᄚ','ㅁ'=>'ᄆ','ㅂ'=>'ᄇ','ㅃ'=>'ᄈ','ㅄ'=>'ᄡ','ㅅ'=>'ᄉ','ㅆ'=>'ᄊ','ㅇ'=>'ᄋ','ㅈ'=>'ᄌ','ㅉ'=>'ᄍ','ㅊ'=>'ᄎ','ㅋ'=>'ᄏ','ㅌ'=>'ᄐ','ㅍ'=>'ᄑ','ㅎ'=>'ᄒ','ㅏ'=>'ᅡ','ㅐ'=>'ᅢ','ㅑ'=>'ᅣ','ㅒ'=>'ᅤ','ㅓ'=>'ᅥ','ㅔ'=>'ᅦ','ㅕ'=>'ᅧ','ㅖ'=>'ᅨ','ㅗ'=>'ᅩ','ㅘ'=>'ᅪ','ㅙ'=>'ᅫ','ㅚ'=>'ᅬ','ㅛ'=>'ᅭ','ㅜ'=>'ᅮ','ㅝ'=>'ᅯ','ㅞ'=>'ᅰ','ㅟ'=>'ᅱ','ㅠ'=>'ᅲ','ㅡ'=>'ᅳ','ㅢ'=>'ᅴ','ㅣ'=>'ᅵ','ㅤ'=>'ᅠ','ㅥ'=>'ᄔ','ㅦ'=>'ᄕ','ㅧ'=>'ᇇ','ㅨ'=>'ᇈ','ㅩ'=>'ᇌ','ㅪ'=>'ᇎ','ㅫ'=>'ᇓ','ㅬ'=>'ᇗ','ㅭ'=>'ᇙ','ㅮ'=>'ᄜ','ㅯ'=>'ᇝ','ㅰ'=>'ᇟ','ㅱ'=>'ᄝ','ㅲ'=>'ᄞ','ㅳ'=>'ᄠ','ㅴ'=>'ᄢ','ㅵ'=>'ᄣ','ㅶ'=>'ᄧ','ㅷ'=>'ᄩ','ㅸ'=>'ᄫ','ㅹ'=>'ᄬ','ㅺ'=>'ᄭ','ㅻ'=>'ᄮ','ㅼ'=>'ᄯ','ㅽ'=>'ᄲ','ㅾ'=>'ᄶ','ㅿ'=>'ᅀ','ㆀ'=>'ᅇ','ㆁ'=>'ᅌ','ㆂ'=>'ᇱ','ㆃ'=>'ᇲ','ㆄ'=>'ᅗ','ㆅ'=>'ᅘ','ㆆ'=>'ᅙ','ㆇ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ㆍ'=>'ᆞ','ㆎ'=>'ᆡ','㆒'=>'一','㆓'=>'二','㆔'=>'三','㆕'=>'四','㆖'=>'上','㆗'=>'中','㆘'=>'下','㆙'=>'甲','㆚'=>'乙','㆛'=>'丙','㆜'=>'丁','㆝'=>'天','㆞'=>'地','㆟'=>'人','㈀'=>'(ᄀ)','㈁'=>'(ᄂ)','㈂'=>'(ᄃ)','㈃'=>'(ᄅ)','㈄'=>'(ᄆ)','㈅'=>'(ᄇ)','㈆'=>'(ᄉ)','㈇'=>'(ᄋ)','㈈'=>'(ᄌ)','㈉'=>'(ᄎ)','㈊'=>'(ᄏ)','㈋'=>'(ᄐ)','㈌'=>'(ᄑ)','㈍'=>'(ᄒ)','㈎'=>'(가)','㈏'=>'(나)','㈐'=>'(다)','㈑'=>'(라)','㈒'=>'(마)','㈓'=>'(바)','㈔'=>'(사)','㈕'=>'(아)','㈖'=>'(자)','㈗'=>'(차)','㈘'=>'(카)','㈙'=>'(타)','㈚'=>'(파)','㈛'=>'(하)','㈜'=>'(주)','㈝'=>'(오전)','㈞'=>'(오후)','㈠'=>'(一)','㈡'=>'(二)','㈢'=>'(三)','㈣'=>'(四)','㈤'=>'(五)','㈥'=>'(六)','㈦'=>'(七)','㈧'=>'(八)','㈨'=>'(九)','㈩'=>'(十)','㈪'=>'(月)','㈫'=>'(火)','㈬'=>'(水)','㈭'=>'(木)','㈮'=>'(金)','㈯'=>'(土)','㈰'=>'(日)','㈱'=>'(株)','㈲'=>'(有)','㈳'=>'(社)','㈴'=>'(名)','㈵'=>'(特)','㈶'=>'(財)','㈷'=>'(祝)','㈸'=>'(労)','㈹'=>'(代)','㈺'=>'(呼)','㈻'=>'(学)','㈼'=>'(監)','㈽'=>'(企)','㈾'=>'(資)','㈿'=>'(協)','㉀'=>'(祭)','㉁'=>'(休)','㉂'=>'(自)','㉃'=>'(至)','㉐'=>'PTE','㉑'=>'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','㋀'=>'1月','㋁'=>'2月','㋂'=>'3月','㋃'=>'4月','㋄'=>'5月','㋅'=>'6月','㋆'=>'7月','㋇'=>'8月','㋈'=>'9月','㋉'=>'10月','㋊'=>'11月','㋋'=>'12月','㋌'=>'Hg','㋍'=>'erg','㋎'=>'eV','㋏'=>'LTD','㋐'=>'ア','㋑'=>'イ','㋒'=>'ウ','㋓'=>'エ','㋔'=>'オ','㋕'=>'カ','㋖'=>'キ','㋗'=>'ク','㋘'=>'ケ','㋙'=>'コ','㋚'=>'サ','㋛'=>'シ','㋜'=>'ス','㋝'=>'セ','㋞'=>'ソ','㋟'=>'タ','㋠'=>'チ','㋡'=>'ツ','㋢'=>'テ','㋣'=>'ト','㋤'=>'ナ','㋥'=>'ニ','㋦'=>'ヌ','㋧'=>'ネ','㋨'=>'ノ','㋩'=>'ハ','㋪'=>'ヒ','㋫'=>'フ','㋬'=>'ヘ','㋭'=>'ホ','㋮'=>'マ','㋯'=>'ミ','㋰'=>'ム','㋱'=>'メ','㋲'=>'モ','㋳'=>'ヤ','㋴'=>'ユ','㋵'=>'ヨ','㋶'=>'ラ','㋷'=>'リ','㋸'=>'ル','㋹'=>'レ','㋺'=>'ロ','㋻'=>'ワ','㋼'=>'ヰ','㋽'=>'ヱ','㋾'=>'ヲ','㌀'=>'アパート','㌁'=>'アルファ','㌂'=>'アンペア','㌃'=>'アール','㌄'=>'イニング','㌅'=>'インチ','㌆'=>'ウォン','㌇'=>'エスクード','㌈'=>'エーカー','㌉'=>'オンス','㌊'=>'オーム','㌋'=>'カイリ','㌌'=>'カラット','㌍'=>'カロリー','㌎'=>'ガロン','㌏'=>'ガンマ','㌐'=>'ギガ','㌑'=>'ギニー','㌒'=>'キュリー','㌓'=>'ギルダー','㌔'=>'キロ','㌕'=>'キログラム','㌖'=>'キロメートル','㌗'=>'キロワット','㌘'=>'グラム','㌙'=>'グラムトン','㌚'=>'クルゼイロ','㌛'=>'クローネ','㌜'=>'ケース','㌝'=>'コルナ','㌞'=>'コーポ','㌟'=>'サイクル','㌠'=>'サンチーム','㌡'=>'シリング','㌢'=>'センチ','㌣'=>'セント','㌤'=>'ダース','㌥'=>'デシ','㌦'=>'ドル','㌧'=>'トン','㌨'=>'ナノ','㌩'=>'ノット','㌪'=>'ハイツ','㌫'=>'パーセント','㌬'=>'パーツ','㌭'=>'バーレル','㌮'=>'ピアストル','㌯'=>'ピクル','㌰'=>'ピコ','㌱'=>'ビル','㌲'=>'ファラッド','㌳'=>'フィート','㌴'=>'ブッシェル','㌵'=>'フラン','㌶'=>'ヘクタール','㌷'=>'ペソ','㌸'=>'ペニヒ','㌹'=>'ヘルツ','㌺'=>'ペンス','㌻'=>'ページ','㌼'=>'ベータ','㌽'=>'ポイント','㌾'=>'ボルト','㌿'=>'ホン','㍀'=>'ポンド','㍁'=>'ホール','㍂'=>'ホーン','㍃'=>'マイクロ','㍄'=>'マイル','㍅'=>'マッハ','㍆'=>'マルク','㍇'=>'マンション','㍈'=>'ミクロン','㍉'=>'ミリ','㍊'=>'ミリバール','㍋'=>'メガ','㍌'=>'メガトン','㍍'=>'メートル','㍎'=>'ヤード','㍏'=>'ヤール','㍐'=>'ユアン','㍑'=>'リットル','㍒'=>'リラ','㍓'=>'ルピー','㍔'=>'ルーブル','㍕'=>'レム','㍖'=>'レントゲン','㍗'=>'ワット','㍘'=>'0点','㍙'=>'1点','㍚'=>'2点','㍛'=>'3点','㍜'=>'4点','㍝'=>'5点','㍞'=>'6点','㍟'=>'7点','㍠'=>'8点','㍡'=>'9点','㍢'=>'10点','㍣'=>'11点','㍤'=>'12点','㍥'=>'13点','㍦'=>'14点','㍧'=>'15点','㍨'=>'16点','㍩'=>'17点','㍪'=>'18点','㍫'=>'19点','㍬'=>'20点','㍭'=>'21点','㍮'=>'22点','㍯'=>'23点','㍰'=>'24点','㍱'=>'hPa','㍲'=>'da','㍳'=>'AU','㍴'=>'bar','㍵'=>'oV','㍶'=>'pc','㍷'=>'dm','㍸'=>'dm2','㍹'=>'dm3','㍺'=>'IU','㍻'=>'平成','㍼'=>'昭和','㍽'=>'大正','㍾'=>'明治','㍿'=>'株式会社','㎀'=>'pA','㎁'=>'nA','㎂'=>'μA','㎃'=>'mA','㎄'=>'kA','㎅'=>'KB','㎆'=>'MB','㎇'=>'GB','㎈'=>'cal','㎉'=>'kcal','㎊'=>'pF','㎋'=>'nF','㎌'=>'μF','㎍'=>'μg','㎎'=>'mg','㎏'=>'kg','㎐'=>'Hz','㎑'=>'kHz','㎒'=>'MHz','㎓'=>'GHz','㎔'=>'THz','㎕'=>'μl','㎖'=>'ml','㎗'=>'dl','㎘'=>'kl','㎙'=>'fm','㎚'=>'nm','㎛'=>'μm','㎜'=>'mm','㎝'=>'cm','㎞'=>'km','㎟'=>'mm2','㎠'=>'cm2','㎡'=>'m2','㎢'=>'km2','㎣'=>'mm3','㎤'=>'cm3','㎥'=>'m3','㎦'=>'km3','㎧'=>'m∕s','㎨'=>'m∕s2','㎩'=>'Pa','㎪'=>'kPa','㎫'=>'MPa','㎬'=>'GPa','㎭'=>'rad','㎮'=>'rad∕s','㎯'=>'rad∕s2','㎰'=>'ps','㎱'=>'ns','㎲'=>'μs','㎳'=>'ms','㎴'=>'pV','㎵'=>'nV','㎶'=>'μV','㎷'=>'mV','㎸'=>'kV','㎹'=>'MV','㎺'=>'pW','㎻'=>'nW','㎼'=>'μW','㎽'=>'mW','㎾'=>'kW','㎿'=>'MW','㏀'=>'kΩ','㏁'=>'MΩ','㏂'=>'a.m.','㏃'=>'Bq','㏄'=>'cc','㏅'=>'cd','㏆'=>'C∕kg','㏇'=>'Co.','㏈'=>'dB','㏉'=>'Gy','㏊'=>'ha','㏋'=>'HP','㏌'=>'in','㏍'=>'KK','㏎'=>'KM','㏏'=>'kt','㏐'=>'lm','㏑'=>'ln','㏒'=>'log','㏓'=>'lx','㏔'=>'mb','㏕'=>'mil','㏖'=>'mol','㏗'=>'PH','㏘'=>'p.m.','㏙'=>'PPM','㏚'=>'PR','㏛'=>'sr','㏜'=>'Sv','㏝'=>'Wb','㏞'=>'V∕m','㏟'=>'A∕m','㏠'=>'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日','㏿'=>'gal','豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','塚'=>'塚','晴'=>'晴','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'st','st'=>'st','ﬓ'=>'մն','ﬔ'=>'մե','ﬕ'=>'մի','ﬖ'=>'վն','ﬗ'=>'մխ','יִ'=>'יִ','ײַ'=>'ײַ','ﬠ'=>'ע','ﬡ'=>'א','ﬢ'=>'ד','ﬣ'=>'ה','ﬤ'=>'כ','ﬥ'=>'ל','ﬦ'=>'ם','ﬧ'=>'ר','ﬨ'=>'ת','﬩'=>'+','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','ﭏ'=>'אל','ﭐ'=>'ٱ','ﭑ'=>'ٱ','ﭒ'=>'ٻ','ﭓ'=>'ٻ','ﭔ'=>'ٻ','ﭕ'=>'ٻ','ﭖ'=>'پ','ﭗ'=>'پ','ﭘ'=>'پ','ﭙ'=>'پ','ﭚ'=>'ڀ','ﭛ'=>'ڀ','ﭜ'=>'ڀ','ﭝ'=>'ڀ','ﭞ'=>'ٺ','ﭟ'=>'ٺ','ﭠ'=>'ٺ','ﭡ'=>'ٺ','ﭢ'=>'ٿ','ﭣ'=>'ٿ','ﭤ'=>'ٿ','ﭥ'=>'ٿ','ﭦ'=>'ٹ','ﭧ'=>'ٹ','ﭨ'=>'ٹ','ﭩ'=>'ٹ','ﭪ'=>'ڤ','ﭫ'=>'ڤ','ﭬ'=>'ڤ','ﭭ'=>'ڤ','ﭮ'=>'ڦ','ﭯ'=>'ڦ','ﭰ'=>'ڦ','ﭱ'=>'ڦ','ﭲ'=>'ڄ','ﭳ'=>'ڄ','ﭴ'=>'ڄ','ﭵ'=>'ڄ','ﭶ'=>'ڃ','ﭷ'=>'ڃ','ﭸ'=>'ڃ','ﭹ'=>'ڃ','ﭺ'=>'چ','ﭻ'=>'چ','ﭼ'=>'چ','ﭽ'=>'چ','ﭾ'=>'ڇ','ﭿ'=>'ڇ','ﮀ'=>'ڇ','ﮁ'=>'ڇ','ﮂ'=>'ڍ','ﮃ'=>'ڍ','ﮄ'=>'ڌ','ﮅ'=>'ڌ','ﮆ'=>'ڎ','ﮇ'=>'ڎ','ﮈ'=>'ڈ','ﮉ'=>'ڈ','ﮊ'=>'ژ','ﮋ'=>'ژ','ﮌ'=>'ڑ','ﮍ'=>'ڑ','ﮎ'=>'ک','ﮏ'=>'ک','ﮐ'=>'ک','ﮑ'=>'ک','ﮒ'=>'گ','ﮓ'=>'گ','ﮔ'=>'گ','ﮕ'=>'گ','ﮖ'=>'ڳ','ﮗ'=>'ڳ','ﮘ'=>'ڳ','ﮙ'=>'ڳ','ﮚ'=>'ڱ','ﮛ'=>'ڱ','ﮜ'=>'ڱ','ﮝ'=>'ڱ','ﮞ'=>'ں','ﮟ'=>'ں','ﮠ'=>'ڻ','ﮡ'=>'ڻ','ﮢ'=>'ڻ','ﮣ'=>'ڻ','ﮤ'=>'ۀ','ﮥ'=>'ۀ','ﮦ'=>'ہ','ﮧ'=>'ہ','ﮨ'=>'ہ','ﮩ'=>'ہ','ﮪ'=>'ھ','ﮫ'=>'ھ','ﮬ'=>'ھ','ﮭ'=>'ھ','ﮮ'=>'ے','ﮯ'=>'ے','ﮰ'=>'ۓ','ﮱ'=>'ۓ','ﯓ'=>'ڭ','ﯔ'=>'ڭ','ﯕ'=>'ڭ','ﯖ'=>'ڭ','ﯗ'=>'ۇ','ﯘ'=>'ۇ','ﯙ'=>'ۆ','ﯚ'=>'ۆ','ﯛ'=>'ۈ','ﯜ'=>'ۈ','ﯝ'=>'ۇٴ','ﯞ'=>'ۋ','ﯟ'=>'ۋ','ﯠ'=>'ۅ','ﯡ'=>'ۅ','ﯢ'=>'ۉ','ﯣ'=>'ۉ','ﯤ'=>'ې','ﯥ'=>'ې','ﯦ'=>'ې','ﯧ'=>'ې','ﯨ'=>'ى','ﯩ'=>'ى','ﯪ'=>'ئا','ﯫ'=>'ئا','ﯬ'=>'ئە','ﯭ'=>'ئە','ﯮ'=>'ئو','ﯯ'=>'ئو','ﯰ'=>'ئۇ','ﯱ'=>'ئۇ','ﯲ'=>'ئۆ','ﯳ'=>'ئۆ','ﯴ'=>'ئۈ','ﯵ'=>'ئۈ','ﯶ'=>'ئې','ﯷ'=>'ئې','ﯸ'=>'ئې','ﯹ'=>'ئى','ﯺ'=>'ئى','ﯻ'=>'ئى','ﯼ'=>'ی','ﯽ'=>'ی','ﯾ'=>'ی','ﯿ'=>'ی','ﰀ'=>'ئج','ﰁ'=>'ئح','ﰂ'=>'ئم','ﰃ'=>'ئى','ﰄ'=>'ئي','ﰅ'=>'بج','ﰆ'=>'بح','ﰇ'=>'بخ','ﰈ'=>'بم','ﰉ'=>'بى','ﰊ'=>'بي','ﰋ'=>'تج','ﰌ'=>'تح','ﰍ'=>'تخ','ﰎ'=>'تم','ﰏ'=>'تى','ﰐ'=>'تي','ﰑ'=>'ثج','ﰒ'=>'ثم','ﰓ'=>'ثى','ﰔ'=>'ثي','ﰕ'=>'جح','ﰖ'=>'جم','ﰗ'=>'حج','ﰘ'=>'حم','ﰙ'=>'خج','ﰚ'=>'خح','ﰛ'=>'خم','ﰜ'=>'سج','ﰝ'=>'سح','ﰞ'=>'سخ','ﰟ'=>'سم','ﰠ'=>'صح','ﰡ'=>'صم','ﰢ'=>'ضج','ﰣ'=>'ضح','ﰤ'=>'ضخ','ﰥ'=>'ضم','ﰦ'=>'طح','ﰧ'=>'طم','ﰨ'=>'ظم','ﰩ'=>'عج','ﰪ'=>'عم','ﰫ'=>'غج','ﰬ'=>'غم','ﰭ'=>'فج','ﰮ'=>'فح','ﰯ'=>'فخ','ﰰ'=>'فم','ﰱ'=>'فى','ﰲ'=>'في','ﰳ'=>'قح','ﰴ'=>'قم','ﰵ'=>'قى','ﰶ'=>'قي','ﰷ'=>'كا','ﰸ'=>'كج','ﰹ'=>'كح','ﰺ'=>'كخ','ﰻ'=>'كل','ﰼ'=>'كم','ﰽ'=>'كى','ﰾ'=>'كي','ﰿ'=>'لج','ﱀ'=>'لح','ﱁ'=>'لخ','ﱂ'=>'لم','ﱃ'=>'لى','ﱄ'=>'لي','ﱅ'=>'مج','ﱆ'=>'مح','ﱇ'=>'مخ','ﱈ'=>'مم','ﱉ'=>'مى','ﱊ'=>'مي','ﱋ'=>'نج','ﱌ'=>'نح','ﱍ'=>'نخ','ﱎ'=>'نم','ﱏ'=>'نى','ﱐ'=>'ني','ﱑ'=>'هج','ﱒ'=>'هم','ﱓ'=>'هى','ﱔ'=>'هي','ﱕ'=>'يج','ﱖ'=>'يح','ﱗ'=>'يخ','ﱘ'=>'يم','ﱙ'=>'يى','ﱚ'=>'يي','ﱛ'=>'ذٰ','ﱜ'=>'رٰ','ﱝ'=>'ىٰ','ﱞ'=>' ٌّ','ﱟ'=>' ٍّ','ﱠ'=>' َّ','ﱡ'=>' ُّ','ﱢ'=>' ِّ','ﱣ'=>' ّٰ','ﱤ'=>'ئر','ﱥ'=>'ئز','ﱦ'=>'ئم','ﱧ'=>'ئن','ﱨ'=>'ئى','ﱩ'=>'ئي','ﱪ'=>'بر','ﱫ'=>'بز','ﱬ'=>'بم','ﱭ'=>'بن','ﱮ'=>'بى','ﱯ'=>'بي','ﱰ'=>'تر','ﱱ'=>'تز','ﱲ'=>'تم','ﱳ'=>'تن','ﱴ'=>'تى','ﱵ'=>'تي','ﱶ'=>'ثر','ﱷ'=>'ثز','ﱸ'=>'ثم','ﱹ'=>'ثن','ﱺ'=>'ثى','ﱻ'=>'ثي','ﱼ'=>'فى','ﱽ'=>'في','ﱾ'=>'قى','ﱿ'=>'قي','ﲀ'=>'كا','ﲁ'=>'كل','ﲂ'=>'كم','ﲃ'=>'كى','ﲄ'=>'كي','ﲅ'=>'لم','ﲆ'=>'لى','ﲇ'=>'لي','ﲈ'=>'ما','ﲉ'=>'مم','ﲊ'=>'نر','ﲋ'=>'نز','ﲌ'=>'نم','ﲍ'=>'نن','ﲎ'=>'نى','ﲏ'=>'ني','ﲐ'=>'ىٰ','ﲑ'=>'ير','ﲒ'=>'يز','ﲓ'=>'يم','ﲔ'=>'ين','ﲕ'=>'يى','ﲖ'=>'يي','ﲗ'=>'ئج','ﲘ'=>'ئح','ﲙ'=>'ئخ','ﲚ'=>'ئم','ﲛ'=>'ئه','ﲜ'=>'بج','ﲝ'=>'بح','ﲞ'=>'بخ','ﲟ'=>'بم','ﲠ'=>'به','ﲡ'=>'تج','ﲢ'=>'تح','ﲣ'=>'تخ','ﲤ'=>'تم','ﲥ'=>'ته','ﲦ'=>'ثم','ﲧ'=>'جح','ﲨ'=>'جم','ﲩ'=>'حج','ﲪ'=>'حم','ﲫ'=>'خج','ﲬ'=>'خم','ﲭ'=>'سج','ﲮ'=>'سح','ﲯ'=>'سخ','ﲰ'=>'سم','ﲱ'=>'صح','ﲲ'=>'صخ','ﲳ'=>'صم','ﲴ'=>'ضج','ﲵ'=>'ضح','ﲶ'=>'ضخ','ﲷ'=>'ضم','ﲸ'=>'طح','ﲹ'=>'ظم','ﲺ'=>'عج','ﲻ'=>'عم','ﲼ'=>'غج','ﲽ'=>'غم','ﲾ'=>'فج','ﲿ'=>'فح','ﳀ'=>'فخ','ﳁ'=>'فم','ﳂ'=>'قح','ﳃ'=>'قم','ﳄ'=>'كج','ﳅ'=>'كح','ﳆ'=>'كخ','ﳇ'=>'كل','ﳈ'=>'كم','ﳉ'=>'لج','ﳊ'=>'لح','ﳋ'=>'لخ','ﳌ'=>'لم','ﳍ'=>'له','ﳎ'=>'مج','ﳏ'=>'مح','ﳐ'=>'مخ','ﳑ'=>'مم','ﳒ'=>'نج','ﳓ'=>'نح','ﳔ'=>'نخ','ﳕ'=>'نم','ﳖ'=>'نه','ﳗ'=>'هج','ﳘ'=>'هم','ﳙ'=>'هٰ','ﳚ'=>'يج','ﳛ'=>'يح','ﳜ'=>'يخ','ﳝ'=>'يم','ﳞ'=>'يه','ﳟ'=>'ئم','ﳠ'=>'ئه','ﳡ'=>'بم','ﳢ'=>'به','ﳣ'=>'تم','ﳤ'=>'ته','ﳥ'=>'ثم','ﳦ'=>'ثه','ﳧ'=>'سم','ﳨ'=>'سه','ﳩ'=>'شم','ﳪ'=>'شه','ﳫ'=>'كل','ﳬ'=>'كم','ﳭ'=>'لم','ﳮ'=>'نم','ﳯ'=>'نه','ﳰ'=>'يم','ﳱ'=>'يه','ﳲ'=>'ـَّ','ﳳ'=>'ـُّ','ﳴ'=>'ـِّ','ﳵ'=>'طى','ﳶ'=>'طي','ﳷ'=>'عى','ﳸ'=>'عي','ﳹ'=>'غى','ﳺ'=>'غي','ﳻ'=>'سى','ﳼ'=>'سي','ﳽ'=>'شى','ﳾ'=>'شي','ﳿ'=>'حى','ﴀ'=>'حي','ﴁ'=>'جى','ﴂ'=>'جي','ﴃ'=>'خى','ﴄ'=>'خي','ﴅ'=>'صى','ﴆ'=>'صي','ﴇ'=>'ضى','ﴈ'=>'ضي','ﴉ'=>'شج','ﴊ'=>'شح','ﴋ'=>'شخ','ﴌ'=>'شم','ﴍ'=>'شر','ﴎ'=>'سر','ﴏ'=>'صر','ﴐ'=>'ضر','ﴑ'=>'طى','ﴒ'=>'طي','ﴓ'=>'عى','ﴔ'=>'عي','ﴕ'=>'غى','ﴖ'=>'غي','ﴗ'=>'سى','ﴘ'=>'سي','ﴙ'=>'شى','ﴚ'=>'شي','ﴛ'=>'حى','ﴜ'=>'حي','ﴝ'=>'جى','ﴞ'=>'جي','ﴟ'=>'خى','ﴠ'=>'خي','ﴡ'=>'صى','ﴢ'=>'صي','ﴣ'=>'ضى','ﴤ'=>'ضي','ﴥ'=>'شج','ﴦ'=>'شح','ﴧ'=>'شخ','ﴨ'=>'شم','ﴩ'=>'شر','ﴪ'=>'سر','ﴫ'=>'صر','ﴬ'=>'ضر','ﴭ'=>'شج','ﴮ'=>'شح','ﴯ'=>'شخ','ﴰ'=>'شم','ﴱ'=>'سه','ﴲ'=>'شه','ﴳ'=>'طم','ﴴ'=>'سج','ﴵ'=>'سح','ﴶ'=>'سخ','ﴷ'=>'شج','ﴸ'=>'شح','ﴹ'=>'شخ','ﴺ'=>'طم','ﴻ'=>'ظم','ﴼ'=>'اً','ﴽ'=>'اً','ﵐ'=>'تجم','ﵑ'=>'تحج','ﵒ'=>'تحج','ﵓ'=>'تحم','ﵔ'=>'تخم','ﵕ'=>'تمج','ﵖ'=>'تمح','ﵗ'=>'تمخ','ﵘ'=>'جمح','ﵙ'=>'جمح','ﵚ'=>'حمي','ﵛ'=>'حمى','ﵜ'=>'سحج','ﵝ'=>'سجح','ﵞ'=>'سجى','ﵟ'=>'سمح','ﵠ'=>'سمح','ﵡ'=>'سمج','ﵢ'=>'سمم','ﵣ'=>'سمم','ﵤ'=>'صحح','ﵥ'=>'صحح','ﵦ'=>'صمم','ﵧ'=>'شحم','ﵨ'=>'شحم','ﵩ'=>'شجي','ﵪ'=>'شمخ','ﵫ'=>'شمخ','ﵬ'=>'شمم','ﵭ'=>'شمم','ﵮ'=>'ضحى','ﵯ'=>'ضخم','ﵰ'=>'ضخم','ﵱ'=>'طمح','ﵲ'=>'طمح','ﵳ'=>'طمم','ﵴ'=>'طمي','ﵵ'=>'عجم','ﵶ'=>'عمم','ﵷ'=>'عمم','ﵸ'=>'عمى','ﵹ'=>'غمم','ﵺ'=>'غمي','ﵻ'=>'غمى','ﵼ'=>'فخم','ﵽ'=>'فخم','ﵾ'=>'قمح','ﵿ'=>'قمم','ﶀ'=>'لحم','ﶁ'=>'لحي','ﶂ'=>'لحى','ﶃ'=>'لجج','ﶄ'=>'لجج','ﶅ'=>'لخم','ﶆ'=>'لخم','ﶇ'=>'لمح','ﶈ'=>'لمح','ﶉ'=>'محج','ﶊ'=>'محم','ﶋ'=>'محي','ﶌ'=>'مجح','ﶍ'=>'مجم','ﶎ'=>'مخج','ﶏ'=>'مخم','ﶒ'=>'مجخ','ﶓ'=>'همج','ﶔ'=>'همم','ﶕ'=>'نحم','ﶖ'=>'نحى','ﶗ'=>'نجم','ﶘ'=>'نجم','ﶙ'=>'نجى','ﶚ'=>'نمي','ﶛ'=>'نمى','ﶜ'=>'يمم','ﶝ'=>'يمم','ﶞ'=>'بخي','ﶟ'=>'تجي','ﶠ'=>'تجى','ﶡ'=>'تخي','ﶢ'=>'تخى','ﶣ'=>'تمي','ﶤ'=>'تمى','ﶥ'=>'جمي','ﶦ'=>'جحى','ﶧ'=>'جمى','ﶨ'=>'سخى','ﶩ'=>'صحي','ﶪ'=>'شحي','ﶫ'=>'ضحي','ﶬ'=>'لجي','ﶭ'=>'لمي','ﶮ'=>'يحي','ﶯ'=>'يجي','ﶰ'=>'يمي','ﶱ'=>'ممي','ﶲ'=>'قمي','ﶳ'=>'نحي','ﶴ'=>'قمح','ﶵ'=>'لحم','ﶶ'=>'عمي','ﶷ'=>'كمي','ﶸ'=>'نجح','ﶹ'=>'مخي','ﶺ'=>'لجم','ﶻ'=>'كمم','ﶼ'=>'لجم','ﶽ'=>'نجح','ﶾ'=>'جحي','ﶿ'=>'حجي','ﷀ'=>'مجي','ﷁ'=>'فمي','ﷂ'=>'بحي','ﷃ'=>'كمم','ﷄ'=>'عجم','ﷅ'=>'صمم','ﷆ'=>'سخي','ﷇ'=>'نجي','ﷰ'=>'صلے','ﷱ'=>'قلے','ﷲ'=>'الله','ﷳ'=>'اكبر','ﷴ'=>'محمد','ﷵ'=>'صلعم','ﷶ'=>'رسول','ﷷ'=>'عليه','ﷸ'=>'وسلم','ﷹ'=>'صلى','ﷺ'=>'صلى الله عليه وسلم','ﷻ'=>'جل جلاله','﷼'=>'ریال','︐'=>',','︑'=>'、','︒'=>'。','︓'=>':','︔'=>';','︕'=>'!','︖'=>'?','︗'=>'〖','︘'=>'〗','︙'=>'...','︰'=>'..','︱'=>'—','︲'=>'–','︳'=>'_','︴'=>'_','︵'=>'(','︶'=>')','︷'=>'{','︸'=>'}','︹'=>'〔','︺'=>'〕','︻'=>'【','︼'=>'】','︽'=>'《','︾'=>'》','︿'=>'〈','﹀'=>'〉','﹁'=>'「','﹂'=>'」','﹃'=>'『','﹄'=>'』','﹇'=>'[','﹈'=>']','﹉'=>' ̅','﹊'=>' ̅','﹋'=>' ̅','﹌'=>' ̅','﹍'=>'_','﹎'=>'_','﹏'=>'_','﹐'=>',','﹑'=>'、','﹒'=>'.','﹔'=>';','﹕'=>':','﹖'=>'?','﹗'=>'!','﹘'=>'—','﹙'=>'(','﹚'=>')','﹛'=>'{','﹜'=>'}','﹝'=>'〔','﹞'=>'〕','﹟'=>'#','﹠'=>'&','﹡'=>'*','﹢'=>'+','﹣'=>'-','﹤'=>'<','﹥'=>'>','﹦'=>'=','﹨'=>'\\','﹩'=>'$','﹪'=>'%','﹫'=>'@','ﹰ'=>' ً','ﹱ'=>'ـً','ﹲ'=>' ٌ','ﹴ'=>' ٍ','ﹶ'=>' َ','ﹷ'=>'ـَ','ﹸ'=>' ُ','ﹹ'=>'ـُ','ﹺ'=>' ِ','ﹻ'=>'ـِ','ﹼ'=>' ّ','ﹽ'=>'ـّ','ﹾ'=>' ْ','ﹿ'=>'ـْ','ﺀ'=>'ء','ﺁ'=>'آ','ﺂ'=>'آ','ﺃ'=>'أ','ﺄ'=>'أ','ﺅ'=>'ؤ','ﺆ'=>'ؤ','ﺇ'=>'إ','ﺈ'=>'إ','ﺉ'=>'ئ','ﺊ'=>'ئ','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺍ'=>'ا','ﺎ'=>'ا','ﺏ'=>'ب','ﺐ'=>'ب','ﺑ'=>'ب','ﺒ'=>'ب','ﺓ'=>'ة','ﺔ'=>'ة','ﺕ'=>'ت','ﺖ'=>'ت','ﺗ'=>'ت','ﺘ'=>'ت','ﺙ'=>'ث','ﺚ'=>'ث','ﺛ'=>'ث','ﺜ'=>'ث','ﺝ'=>'ج','ﺞ'=>'ج','ﺟ'=>'ج','ﺠ'=>'ج','ﺡ'=>'ح','ﺢ'=>'ح','ﺣ'=>'ح','ﺤ'=>'ح','ﺥ'=>'خ','ﺦ'=>'خ','ﺧ'=>'خ','ﺨ'=>'خ','ﺩ'=>'د','ﺪ'=>'د','ﺫ'=>'ذ','ﺬ'=>'ذ','ﺭ'=>'ر','ﺮ'=>'ر','ﺯ'=>'ز','ﺰ'=>'ز','ﺱ'=>'س','ﺲ'=>'س','ﺳ'=>'س','ﺴ'=>'س','ﺵ'=>'ش','ﺶ'=>'ش','ﺷ'=>'ش','ﺸ'=>'ش','ﺹ'=>'ص','ﺺ'=>'ص','ﺻ'=>'ص','ﺼ'=>'ص','ﺽ'=>'ض','ﺾ'=>'ض','ﺿ'=>'ض','ﻀ'=>'ض','ﻁ'=>'ط','ﻂ'=>'ط','ﻃ'=>'ط','ﻄ'=>'ط','ﻅ'=>'ظ','ﻆ'=>'ظ','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻉ'=>'ع','ﻊ'=>'ع','ﻋ'=>'ع','ﻌ'=>'ع','ﻍ'=>'غ','ﻎ'=>'غ','ﻏ'=>'غ','ﻐ'=>'غ','ﻑ'=>'ف','ﻒ'=>'ف','ﻓ'=>'ف','ﻔ'=>'ف','ﻕ'=>'ق','ﻖ'=>'ق','ﻗ'=>'ق','ﻘ'=>'ق','ﻙ'=>'ك','ﻚ'=>'ك','ﻛ'=>'ك','ﻜ'=>'ك','ﻝ'=>'ل','ﻞ'=>'ل','ﻟ'=>'ل','ﻠ'=>'ل','ﻡ'=>'م','ﻢ'=>'م','ﻣ'=>'م','ﻤ'=>'م','ﻥ'=>'ن','ﻦ'=>'ن','ﻧ'=>'ن','ﻨ'=>'ن','ﻩ'=>'ه','ﻪ'=>'ه','ﻫ'=>'ه','ﻬ'=>'ه','ﻭ'=>'و','ﻮ'=>'و','ﻯ'=>'ى','ﻰ'=>'ى','ﻱ'=>'ي','ﻲ'=>'ي','ﻳ'=>'ي','ﻴ'=>'ي','ﻵ'=>'لآ','ﻶ'=>'لآ','ﻷ'=>'لأ','ﻸ'=>'لأ','ﻹ'=>'لإ','ﻺ'=>'لإ','ﻻ'=>'لا','ﻼ'=>'لا','!'=>'!','"'=>'"','#'=>'#','$'=>'$','%'=>'%','&'=>'&','''=>'\'','('=>'(',')'=>')','*'=>'*','+'=>'+',','=>',','-'=>'-','.'=>'.','/'=>'/','0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9',':'=>':',';'=>';','<'=>'<','='=>'=','>'=>'>','?'=>'?','@'=>'@','A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E','F'=>'F','G'=>'G','H'=>'H','I'=>'I','J'=>'J','K'=>'K','L'=>'L','M'=>'M','N'=>'N','O'=>'O','P'=>'P','Q'=>'Q','R'=>'R','S'=>'S','T'=>'T','U'=>'U','V'=>'V','W'=>'W','X'=>'X','Y'=>'Y','Z'=>'Z','['=>'[','\'=>'\\',']'=>']','^'=>'^','_'=>'_','`'=>'`','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','{'=>'{','|'=>'|','}'=>'}','~'=>'~','⦅'=>'⦅','⦆'=>'⦆','。'=>'。','「'=>'「','」'=>'」','、'=>'、','・'=>'・','ヲ'=>'ヲ','ァ'=>'ァ','ィ'=>'ィ','ゥ'=>'ゥ','ェ'=>'ェ','ォ'=>'ォ','ャ'=>'ャ','ュ'=>'ュ','ョ'=>'ョ','ッ'=>'ッ','ー'=>'ー','ア'=>'ア','イ'=>'イ','ウ'=>'ウ','エ'=>'エ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'ヘ','ホ'=>'ホ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ヤ'=>'ヤ','ユ'=>'ユ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ン'=>'ン','゙'=>'゙','゚'=>'゚','ᅠ'=>'ᅠ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᆪ'=>'ᆪ','ᄂ'=>'ᄂ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᄚ'=>'ᄚ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄡ'=>'ᄡ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ','¢'=>'¢','£'=>'£','¬'=>'¬',' ̄'=>' ̄','¦'=>'¦','¥'=>'¥','₩'=>'₩','│'=>'│','←'=>'←','↑'=>'↑','→'=>'→','↓'=>'↓','■'=>'■','○'=>'○','𝅗𝅥'=>'𝅗𝅥','𝅘𝅥'=>'𝅘𝅥','𝅘𝅥𝅮'=>'𝅘𝅥𝅮','𝅘𝅥𝅯'=>'𝅘𝅥𝅯','𝅘𝅥𝅰'=>'𝅘𝅥𝅰','𝅘𝅥𝅱'=>'𝅘𝅥𝅱','𝅘𝅥𝅲'=>'𝅘𝅥𝅲','𝆹𝅥'=>'𝆹𝅥','𝆺𝅥'=>'𝆺𝅥','𝆹𝅥𝅮'=>'𝆹𝅥𝅮','𝆺𝅥𝅮'=>'𝆺𝅥𝅮','𝆹𝅥𝅯'=>'𝆹𝅥𝅯','𝆺𝅥𝅯'=>'𝆺𝅥𝅯','𝐀'=>'A','𝐁'=>'B','𝐂'=>'C','𝐃'=>'D','𝐄'=>'E','𝐅'=>'F','𝐆'=>'G','𝐇'=>'H','𝐈'=>'I','𝐉'=>'J','𝐊'=>'K','𝐋'=>'L','𝐌'=>'M','𝐍'=>'N','𝐎'=>'O','𝐏'=>'P','𝐐'=>'Q','𝐑'=>'R','𝐒'=>'S','𝐓'=>'T','𝐔'=>'U','𝐕'=>'V','𝐖'=>'W','𝐗'=>'X','𝐘'=>'Y','𝐙'=>'Z','𝐚'=>'a','𝐛'=>'b','𝐜'=>'c','𝐝'=>'d','𝐞'=>'e','𝐟'=>'f','𝐠'=>'g','𝐡'=>'h','𝐢'=>'i','𝐣'=>'j','𝐤'=>'k','𝐥'=>'l','𝐦'=>'m','𝐧'=>'n','𝐨'=>'o','𝐩'=>'p','𝐪'=>'q','𝐫'=>'r','𝐬'=>'s','𝐭'=>'t','𝐮'=>'u','𝐯'=>'v','𝐰'=>'w','𝐱'=>'x','𝐲'=>'y','𝐳'=>'z','𝐴'=>'A','𝐵'=>'B','𝐶'=>'C','𝐷'=>'D','𝐸'=>'E','𝐹'=>'F','𝐺'=>'G','𝐻'=>'H','𝐼'=>'I','𝐽'=>'J','𝐾'=>'K','𝐿'=>'L','𝑀'=>'M','𝑁'=>'N','𝑂'=>'O','𝑃'=>'P','𝑄'=>'Q','𝑅'=>'R','𝑆'=>'S','𝑇'=>'T','𝑈'=>'U','𝑉'=>'V','𝑊'=>'W','𝑋'=>'X','𝑌'=>'Y','𝑍'=>'Z','𝑎'=>'a','𝑏'=>'b','𝑐'=>'c','𝑑'=>'d','𝑒'=>'e','𝑓'=>'f','𝑔'=>'g','𝑖'=>'i','𝑗'=>'j','𝑘'=>'k','𝑙'=>'l','𝑚'=>'m','𝑛'=>'n','𝑜'=>'o','𝑝'=>'p','𝑞'=>'q','𝑟'=>'r','𝑠'=>'s','𝑡'=>'t','𝑢'=>'u','𝑣'=>'v','𝑤'=>'w','𝑥'=>'x','𝑦'=>'y','𝑧'=>'z','𝑨'=>'A','𝑩'=>'B','𝑪'=>'C','𝑫'=>'D','𝑬'=>'E','𝑭'=>'F','𝑮'=>'G','𝑯'=>'H','𝑰'=>'I','𝑱'=>'J','𝑲'=>'K','𝑳'=>'L','𝑴'=>'M','𝑵'=>'N','𝑶'=>'O','𝑷'=>'P','𝑸'=>'Q','𝑹'=>'R','𝑺'=>'S','𝑻'=>'T','𝑼'=>'U','𝑽'=>'V','𝑾'=>'W','𝑿'=>'X','𝒀'=>'Y','𝒁'=>'Z','𝒂'=>'a','𝒃'=>'b','𝒄'=>'c','𝒅'=>'d','𝒆'=>'e','𝒇'=>'f','𝒈'=>'g','𝒉'=>'h','𝒊'=>'i','𝒋'=>'j','𝒌'=>'k','𝒍'=>'l','𝒎'=>'m','𝒏'=>'n','𝒐'=>'o','𝒑'=>'p','𝒒'=>'q','𝒓'=>'r','𝒔'=>'s','𝒕'=>'t','𝒖'=>'u','𝒗'=>'v','𝒘'=>'w','𝒙'=>'x','𝒚'=>'y','𝒛'=>'z','𝒜'=>'A','𝒞'=>'C','𝒟'=>'D','𝒢'=>'G','𝒥'=>'J','𝒦'=>'K','𝒩'=>'N','𝒪'=>'O','𝒫'=>'P','𝒬'=>'Q','𝒮'=>'S','𝒯'=>'T','𝒰'=>'U','𝒱'=>'V','𝒲'=>'W','𝒳'=>'X','𝒴'=>'Y','𝒵'=>'Z','𝒶'=>'a','𝒷'=>'b','𝒸'=>'c','𝒹'=>'d','𝒻'=>'f','𝒽'=>'h','𝒾'=>'i','𝒿'=>'j','𝓀'=>'k','𝓁'=>'l','𝓂'=>'m','𝓃'=>'n','𝓅'=>'p','𝓆'=>'q','𝓇'=>'r','𝓈'=>'s','𝓉'=>'t','𝓊'=>'u','𝓋'=>'v','𝓌'=>'w','𝓍'=>'x','𝓎'=>'y','𝓏'=>'z','𝓐'=>'A','𝓑'=>'B','𝓒'=>'C','𝓓'=>'D','𝓔'=>'E','𝓕'=>'F','𝓖'=>'G','𝓗'=>'H','𝓘'=>'I','𝓙'=>'J','𝓚'=>'K','𝓛'=>'L','𝓜'=>'M','𝓝'=>'N','𝓞'=>'O','𝓟'=>'P','𝓠'=>'Q','𝓡'=>'R','𝓢'=>'S','𝓣'=>'T','𝓤'=>'U','𝓥'=>'V','𝓦'=>'W','𝓧'=>'X','𝓨'=>'Y','𝓩'=>'Z','𝓪'=>'a','𝓫'=>'b','𝓬'=>'c','𝓭'=>'d','𝓮'=>'e','𝓯'=>'f','𝓰'=>'g','𝓱'=>'h','𝓲'=>'i','𝓳'=>'j','𝓴'=>'k','𝓵'=>'l','𝓶'=>'m','𝓷'=>'n','𝓸'=>'o','𝓹'=>'p','𝓺'=>'q','𝓻'=>'r','𝓼'=>'s','𝓽'=>'t','𝓾'=>'u','𝓿'=>'v','𝔀'=>'w','𝔁'=>'x','𝔂'=>'y','𝔃'=>'z','𝔄'=>'A','𝔅'=>'B','𝔇'=>'D','𝔈'=>'E','𝔉'=>'F','𝔊'=>'G','𝔍'=>'J','𝔎'=>'K','𝔏'=>'L','𝔐'=>'M','𝔑'=>'N','𝔒'=>'O','𝔓'=>'P','𝔔'=>'Q','𝔖'=>'S','𝔗'=>'T','𝔘'=>'U','𝔙'=>'V','𝔚'=>'W','𝔛'=>'X','𝔜'=>'Y','𝔞'=>'a','𝔟'=>'b','𝔠'=>'c','𝔡'=>'d','𝔢'=>'e','𝔣'=>'f','𝔤'=>'g','𝔥'=>'h','𝔦'=>'i','𝔧'=>'j','𝔨'=>'k','𝔩'=>'l','𝔪'=>'m','𝔫'=>'n','𝔬'=>'o','𝔭'=>'p','𝔮'=>'q','𝔯'=>'r','𝔰'=>'s','𝔱'=>'t','𝔲'=>'u','𝔳'=>'v','𝔴'=>'w','𝔵'=>'x','𝔶'=>'y','𝔷'=>'z','𝔸'=>'A','𝔹'=>'B','𝔻'=>'D','𝔼'=>'E','𝔽'=>'F','𝔾'=>'G','𝕀'=>'I','𝕁'=>'J','𝕂'=>'K','𝕃'=>'L','𝕄'=>'M','𝕆'=>'O','𝕊'=>'S','𝕋'=>'T','𝕌'=>'U','𝕍'=>'V','𝕎'=>'W','𝕏'=>'X','𝕐'=>'Y','𝕒'=>'a','𝕓'=>'b','𝕔'=>'c','𝕕'=>'d','𝕖'=>'e','𝕗'=>'f','𝕘'=>'g','𝕙'=>'h','𝕚'=>'i','𝕛'=>'j','𝕜'=>'k','𝕝'=>'l','𝕞'=>'m','𝕟'=>'n','𝕠'=>'o','𝕡'=>'p','𝕢'=>'q','𝕣'=>'r','𝕤'=>'s','𝕥'=>'t','𝕦'=>'u','𝕧'=>'v','𝕨'=>'w','𝕩'=>'x','𝕪'=>'y','𝕫'=>'z','𝕬'=>'A','𝕭'=>'B','𝕮'=>'C','𝕯'=>'D','𝕰'=>'E','𝕱'=>'F','𝕲'=>'G','𝕳'=>'H','𝕴'=>'I','𝕵'=>'J','𝕶'=>'K','𝕷'=>'L','𝕸'=>'M','𝕹'=>'N','𝕺'=>'O','𝕻'=>'P','𝕼'=>'Q','𝕽'=>'R','𝕾'=>'S','𝕿'=>'T','𝖀'=>'U','𝖁'=>'V','𝖂'=>'W','𝖃'=>'X','𝖄'=>'Y','𝖅'=>'Z','𝖆'=>'a','𝖇'=>'b','𝖈'=>'c','𝖉'=>'d','𝖊'=>'e','𝖋'=>'f','𝖌'=>'g','𝖍'=>'h','𝖎'=>'i','𝖏'=>'j','𝖐'=>'k','𝖑'=>'l','𝖒'=>'m','𝖓'=>'n','𝖔'=>'o','𝖕'=>'p','𝖖'=>'q','𝖗'=>'r','𝖘'=>'s','𝖙'=>'t','𝖚'=>'u','𝖛'=>'v','𝖜'=>'w','𝖝'=>'x','𝖞'=>'y','𝖟'=>'z','𝖠'=>'A','𝖡'=>'B','𝖢'=>'C','𝖣'=>'D','𝖤'=>'E','𝖥'=>'F','𝖦'=>'G','𝖧'=>'H','𝖨'=>'I','𝖩'=>'J','𝖪'=>'K','𝖫'=>'L','𝖬'=>'M','𝖭'=>'N','𝖮'=>'O','𝖯'=>'P','𝖰'=>'Q','𝖱'=>'R','𝖲'=>'S','𝖳'=>'T','𝖴'=>'U','𝖵'=>'V','𝖶'=>'W','𝖷'=>'X','𝖸'=>'Y','𝖹'=>'Z','𝖺'=>'a','𝖻'=>'b','𝖼'=>'c','𝖽'=>'d','𝖾'=>'e','𝖿'=>'f','𝗀'=>'g','𝗁'=>'h','𝗂'=>'i','𝗃'=>'j','𝗄'=>'k','𝗅'=>'l','𝗆'=>'m','𝗇'=>'n','𝗈'=>'o','𝗉'=>'p','𝗊'=>'q','𝗋'=>'r','𝗌'=>'s','𝗍'=>'t','𝗎'=>'u','𝗏'=>'v','𝗐'=>'w','𝗑'=>'x','𝗒'=>'y','𝗓'=>'z','𝗔'=>'A','𝗕'=>'B','𝗖'=>'C','𝗗'=>'D','𝗘'=>'E','𝗙'=>'F','𝗚'=>'G','𝗛'=>'H','𝗜'=>'I','𝗝'=>'J','𝗞'=>'K','𝗟'=>'L','𝗠'=>'M','𝗡'=>'N','𝗢'=>'O','𝗣'=>'P','𝗤'=>'Q','𝗥'=>'R','𝗦'=>'S','𝗧'=>'T','𝗨'=>'U','𝗩'=>'V','𝗪'=>'W','𝗫'=>'X','𝗬'=>'Y','𝗭'=>'Z','𝗮'=>'a','𝗯'=>'b','𝗰'=>'c','𝗱'=>'d','𝗲'=>'e','𝗳'=>'f','𝗴'=>'g','𝗵'=>'h','𝗶'=>'i','𝗷'=>'j','𝗸'=>'k','𝗹'=>'l','𝗺'=>'m','𝗻'=>'n','𝗼'=>'o','𝗽'=>'p','𝗾'=>'q','𝗿'=>'r','𝘀'=>'s','𝘁'=>'t','𝘂'=>'u','𝘃'=>'v','𝘄'=>'w','𝘅'=>'x','𝘆'=>'y','𝘇'=>'z','𝘈'=>'A','𝘉'=>'B','𝘊'=>'C','𝘋'=>'D','𝘌'=>'E','𝘍'=>'F','𝘎'=>'G','𝘏'=>'H','𝘐'=>'I','𝘑'=>'J','𝘒'=>'K','𝘓'=>'L','𝘔'=>'M','𝘕'=>'N','𝘖'=>'O','𝘗'=>'P','𝘘'=>'Q','𝘙'=>'R','𝘚'=>'S','𝘛'=>'T','𝘜'=>'U','𝘝'=>'V','𝘞'=>'W','𝘟'=>'X','𝘠'=>'Y','𝘡'=>'Z','𝘢'=>'a','𝘣'=>'b','𝘤'=>'c','𝘥'=>'d','𝘦'=>'e','𝘧'=>'f','𝘨'=>'g','𝘩'=>'h','𝘪'=>'i','𝘫'=>'j','𝘬'=>'k','𝘭'=>'l','𝘮'=>'m','𝘯'=>'n','𝘰'=>'o','𝘱'=>'p','𝘲'=>'q','𝘳'=>'r','𝘴'=>'s','𝘵'=>'t','𝘶'=>'u','𝘷'=>'v','𝘸'=>'w','𝘹'=>'x','𝘺'=>'y','𝘻'=>'z','𝘼'=>'A','𝘽'=>'B','𝘾'=>'C','𝘿'=>'D','𝙀'=>'E','𝙁'=>'F','𝙂'=>'G','𝙃'=>'H','𝙄'=>'I','𝙅'=>'J','𝙆'=>'K','𝙇'=>'L','𝙈'=>'M','𝙉'=>'N','𝙊'=>'O','𝙋'=>'P','𝙌'=>'Q','𝙍'=>'R','𝙎'=>'S','𝙏'=>'T','𝙐'=>'U','𝙑'=>'V','𝙒'=>'W','𝙓'=>'X','𝙔'=>'Y','𝙕'=>'Z','𝙖'=>'a','𝙗'=>'b','𝙘'=>'c','𝙙'=>'d','𝙚'=>'e','𝙛'=>'f','𝙜'=>'g','𝙝'=>'h','𝙞'=>'i','𝙟'=>'j','𝙠'=>'k','𝙡'=>'l','𝙢'=>'m','𝙣'=>'n','𝙤'=>'o','𝙥'=>'p','𝙦'=>'q','𝙧'=>'r','𝙨'=>'s','𝙩'=>'t','𝙪'=>'u','𝙫'=>'v','𝙬'=>'w','𝙭'=>'x','𝙮'=>'y','𝙯'=>'z','𝙰'=>'A','𝙱'=>'B','𝙲'=>'C','𝙳'=>'D','𝙴'=>'E','𝙵'=>'F','𝙶'=>'G','𝙷'=>'H','𝙸'=>'I','𝙹'=>'J','𝙺'=>'K','𝙻'=>'L','𝙼'=>'M','𝙽'=>'N','𝙾'=>'O','𝙿'=>'P','𝚀'=>'Q','𝚁'=>'R','𝚂'=>'S','𝚃'=>'T','𝚄'=>'U','𝚅'=>'V','𝚆'=>'W','𝚇'=>'X','𝚈'=>'Y','𝚉'=>'Z','𝚊'=>'a','𝚋'=>'b','𝚌'=>'c','𝚍'=>'d','𝚎'=>'e','𝚏'=>'f','𝚐'=>'g','𝚑'=>'h','𝚒'=>'i','𝚓'=>'j','𝚔'=>'k','𝚕'=>'l','𝚖'=>'m','𝚗'=>'n','𝚘'=>'o','𝚙'=>'p','𝚚'=>'q','𝚛'=>'r','𝚜'=>'s','𝚝'=>'t','𝚞'=>'u','𝚟'=>'v','𝚠'=>'w','𝚡'=>'x','𝚢'=>'y','𝚣'=>'z','𝚤'=>'ı','𝚥'=>'ȷ','𝚨'=>'Α','𝚩'=>'Β','𝚪'=>'Γ','𝚫'=>'Δ','𝚬'=>'Ε','𝚭'=>'Ζ','𝚮'=>'Η','𝚯'=>'Θ','𝚰'=>'Ι','𝚱'=>'Κ','𝚲'=>'Λ','𝚳'=>'Μ','𝚴'=>'Ν','𝚵'=>'Ξ','𝚶'=>'Ο','𝚷'=>'Π','𝚸'=>'Ρ','𝚹'=>'Θ','𝚺'=>'Σ','𝚻'=>'Τ','𝚼'=>'Υ','𝚽'=>'Φ','𝚾'=>'Χ','𝚿'=>'Ψ','𝛀'=>'Ω','𝛁'=>'∇','𝛂'=>'α','𝛃'=>'β','𝛄'=>'γ','𝛅'=>'δ','𝛆'=>'ε','𝛇'=>'ζ','𝛈'=>'η','𝛉'=>'θ','𝛊'=>'ι','𝛋'=>'κ','𝛌'=>'λ','𝛍'=>'μ','𝛎'=>'ν','𝛏'=>'ξ','𝛐'=>'ο','𝛑'=>'π','𝛒'=>'ρ','𝛓'=>'ς','𝛔'=>'σ','𝛕'=>'τ','𝛖'=>'υ','𝛗'=>'φ','𝛘'=>'χ','𝛙'=>'ψ','𝛚'=>'ω','𝛛'=>'∂','𝛜'=>'ε','𝛝'=>'θ','𝛞'=>'κ','𝛟'=>'φ','𝛠'=>'ρ','𝛡'=>'π','𝛢'=>'Α','𝛣'=>'Β','𝛤'=>'Γ','𝛥'=>'Δ','𝛦'=>'Ε','𝛧'=>'Ζ','𝛨'=>'Η','𝛩'=>'Θ','𝛪'=>'Ι','𝛫'=>'Κ','𝛬'=>'Λ','𝛭'=>'Μ','𝛮'=>'Ν','𝛯'=>'Ξ','𝛰'=>'Ο','𝛱'=>'Π','𝛲'=>'Ρ','𝛳'=>'Θ','𝛴'=>'Σ','𝛵'=>'Τ','𝛶'=>'Υ','𝛷'=>'Φ','𝛸'=>'Χ','𝛹'=>'Ψ','𝛺'=>'Ω','𝛻'=>'∇','𝛼'=>'α','𝛽'=>'β','𝛾'=>'γ','𝛿'=>'δ','𝜀'=>'ε','𝜁'=>'ζ','𝜂'=>'η','𝜃'=>'θ','𝜄'=>'ι','𝜅'=>'κ','𝜆'=>'λ','𝜇'=>'μ','𝜈'=>'ν','𝜉'=>'ξ','𝜊'=>'ο','𝜋'=>'π','𝜌'=>'ρ','𝜍'=>'ς','𝜎'=>'σ','𝜏'=>'τ','𝜐'=>'υ','𝜑'=>'φ','𝜒'=>'χ','𝜓'=>'ψ','𝜔'=>'ω','𝜕'=>'∂','𝜖'=>'ε','𝜗'=>'θ','𝜘'=>'κ','𝜙'=>'φ','𝜚'=>'ρ','𝜛'=>'π','𝜜'=>'Α','𝜝'=>'Β','𝜞'=>'Γ','𝜟'=>'Δ','𝜠'=>'Ε','𝜡'=>'Ζ','𝜢'=>'Η','𝜣'=>'Θ','𝜤'=>'Ι','𝜥'=>'Κ','𝜦'=>'Λ','𝜧'=>'Μ','𝜨'=>'Ν','𝜩'=>'Ξ','𝜪'=>'Ο','𝜫'=>'Π','𝜬'=>'Ρ','𝜭'=>'Θ','𝜮'=>'Σ','𝜯'=>'Τ','𝜰'=>'Υ','𝜱'=>'Φ','𝜲'=>'Χ','𝜳'=>'Ψ','𝜴'=>'Ω','𝜵'=>'∇','𝜶'=>'α','𝜷'=>'β','𝜸'=>'γ','𝜹'=>'δ','𝜺'=>'ε','𝜻'=>'ζ','𝜼'=>'η','𝜽'=>'θ','𝜾'=>'ι','𝜿'=>'κ','𝝀'=>'λ','𝝁'=>'μ','𝝂'=>'ν','𝝃'=>'ξ','𝝄'=>'ο','𝝅'=>'π','𝝆'=>'ρ','𝝇'=>'ς','𝝈'=>'σ','𝝉'=>'τ','𝝊'=>'υ','𝝋'=>'φ','𝝌'=>'χ','𝝍'=>'ψ','𝝎'=>'ω','𝝏'=>'∂','𝝐'=>'ε','𝝑'=>'θ','𝝒'=>'κ','𝝓'=>'φ','𝝔'=>'ρ','𝝕'=>'π','𝝖'=>'Α','𝝗'=>'Β','𝝘'=>'Γ','𝝙'=>'Δ','𝝚'=>'Ε','𝝛'=>'Ζ','𝝜'=>'Η','𝝝'=>'Θ','𝝞'=>'Ι','𝝟'=>'Κ','𝝠'=>'Λ','𝝡'=>'Μ','𝝢'=>'Ν','𝝣'=>'Ξ','𝝤'=>'Ο','𝝥'=>'Π','𝝦'=>'Ρ','𝝧'=>'Θ','𝝨'=>'Σ','𝝩'=>'Τ','𝝪'=>'Υ','𝝫'=>'Φ','𝝬'=>'Χ','𝝭'=>'Ψ','𝝮'=>'Ω','𝝯'=>'∇','𝝰'=>'α','𝝱'=>'β','𝝲'=>'γ','𝝳'=>'δ','𝝴'=>'ε','𝝵'=>'ζ','𝝶'=>'η','𝝷'=>'θ','𝝸'=>'ι','𝝹'=>'κ','𝝺'=>'λ','𝝻'=>'μ','𝝼'=>'ν','𝝽'=>'ξ','𝝾'=>'ο','𝝿'=>'π','𝞀'=>'ρ','𝞁'=>'ς','𝞂'=>'σ','𝞃'=>'τ','𝞄'=>'υ','𝞅'=>'φ','𝞆'=>'χ','𝞇'=>'ψ','𝞈'=>'ω','𝞉'=>'∂','𝞊'=>'ε','𝞋'=>'θ','𝞌'=>'κ','𝞍'=>'φ','𝞎'=>'ρ','𝞏'=>'π','𝞐'=>'Α','𝞑'=>'Β','𝞒'=>'Γ','𝞓'=>'Δ','𝞔'=>'Ε','𝞕'=>'Ζ','𝞖'=>'Η','𝞗'=>'Θ','𝞘'=>'Ι','𝞙'=>'Κ','𝞚'=>'Λ','𝞛'=>'Μ','𝞜'=>'Ν','𝞝'=>'Ξ','𝞞'=>'Ο','𝞟'=>'Π','𝞠'=>'Ρ','𝞡'=>'Θ','𝞢'=>'Σ','𝞣'=>'Τ','𝞤'=>'Υ','𝞥'=>'Φ','𝞦'=>'Χ','𝞧'=>'Ψ','𝞨'=>'Ω','𝞩'=>'∇','𝞪'=>'α','𝞫'=>'β','𝞬'=>'γ','𝞭'=>'δ','𝞮'=>'ε','𝞯'=>'ζ','𝞰'=>'η','𝞱'=>'θ','𝞲'=>'ι','𝞳'=>'κ','𝞴'=>'λ','𝞵'=>'μ','𝞶'=>'ν','𝞷'=>'ξ','𝞸'=>'ο','𝞹'=>'π','𝞺'=>'ρ','𝞻'=>'ς','𝞼'=>'σ','𝞽'=>'τ','𝞾'=>'υ','𝞿'=>'φ','𝟀'=>'χ','𝟁'=>'ψ','𝟂'=>'ω','𝟃'=>'∂','𝟄'=>'ε','𝟅'=>'θ','𝟆'=>'κ','𝟇'=>'φ','𝟈'=>'ρ','𝟉'=>'π','𝟊'=>'Ϝ','𝟋'=>'ϝ','𝟎'=>'0','𝟏'=>'1','𝟐'=>'2','𝟑'=>'3','𝟒'=>'4','𝟓'=>'5','𝟔'=>'6','𝟕'=>'7','𝟖'=>'8','𝟗'=>'9','𝟘'=>'0','𝟙'=>'1','𝟚'=>'2','𝟛'=>'3','𝟜'=>'4','𝟝'=>'5','𝟞'=>'6','𝟟'=>'7','𝟠'=>'8','𝟡'=>'9','𝟢'=>'0','𝟣'=>'1','𝟤'=>'2','𝟥'=>'3','𝟦'=>'4','𝟧'=>'5','𝟨'=>'6','𝟩'=>'7','𝟪'=>'8','𝟫'=>'9','𝟬'=>'0','𝟭'=>'1','𝟮'=>'2','𝟯'=>'3','𝟰'=>'4','𝟱'=>'5','𝟲'=>'6','𝟳'=>'7','𝟴'=>'8','𝟵'=>'9','𝟶'=>'0','𝟷'=>'1','𝟸'=>'2','𝟹'=>'3','𝟺'=>'4','𝟻'=>'5','𝟼'=>'6','𝟽'=>'7','𝟾'=>'8','𝟿'=>'9','丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀'); \ No newline at end of file
+$GLOBALS['utf_compatibility_decomp']=array(' '=>' ','¨'=>' ̈','ª'=>'a','¯'=>' ̄','²'=>'2','³'=>'3','´'=>' ́','µ'=>'μ','¸'=>' ̧','¹'=>'1','º'=>'o','¼'=>'1⁄4','½'=>'1⁄2','¾'=>'3⁄4','À'=>'À','Á'=>'Á','Â'=>'Â','Ã'=>'Ã','Ä'=>'Ä','Å'=>'Å','Ç'=>'Ç','È'=>'È','É'=>'É','Ê'=>'Ê','Ë'=>'Ë','Ì'=>'Ì','Í'=>'Í','Î'=>'Î','Ï'=>'Ï','Ñ'=>'Ñ','Ò'=>'Ò','Ó'=>'Ó','Ô'=>'Ô','Õ'=>'Õ','Ö'=>'Ö','Ù'=>'Ù','Ú'=>'Ú','Û'=>'Û','Ü'=>'Ü','Ý'=>'Ý','à'=>'à','á'=>'á','â'=>'â','ã'=>'ã','ä'=>'ä','å'=>'å','ç'=>'ç','è'=>'è','é'=>'é','ê'=>'ê','ë'=>'ë','ì'=>'ì','í'=>'í','î'=>'î','ï'=>'ï','ñ'=>'ñ','ò'=>'ò','ó'=>'ó','ô'=>'ô','õ'=>'õ','ö'=>'ö','ù'=>'ù','ú'=>'ú','û'=>'û','ü'=>'ü','ý'=>'ý','ÿ'=>'ÿ','Ā'=>'Ā','ā'=>'ā','Ă'=>'Ă','ă'=>'ă','Ą'=>'Ą','ą'=>'ą','Ć'=>'Ć','ć'=>'ć','Ĉ'=>'Ĉ','ĉ'=>'ĉ','Ċ'=>'Ċ','ċ'=>'ċ','Č'=>'Č','č'=>'č','Ď'=>'Ď','ď'=>'ď','Ē'=>'Ē','ē'=>'ē','Ĕ'=>'Ĕ','ĕ'=>'ĕ','Ė'=>'Ė','ė'=>'ė','Ę'=>'Ę','ę'=>'ę','Ě'=>'Ě','ě'=>'ě','Ĝ'=>'Ĝ','ĝ'=>'ĝ','Ğ'=>'Ğ','ğ'=>'ğ','Ġ'=>'Ġ','ġ'=>'ġ','Ģ'=>'Ģ','ģ'=>'ģ','Ĥ'=>'Ĥ','ĥ'=>'ĥ','Ĩ'=>'Ĩ','ĩ'=>'ĩ','Ī'=>'Ī','ī'=>'ī','Ĭ'=>'Ĭ','ĭ'=>'ĭ','Į'=>'Į','į'=>'į','İ'=>'İ','IJ'=>'IJ','ij'=>'ij','Ĵ'=>'Ĵ','ĵ'=>'ĵ','Ķ'=>'Ķ','ķ'=>'ķ','Ĺ'=>'Ĺ','ĺ'=>'ĺ','Ļ'=>'Ļ','ļ'=>'ļ','Ľ'=>'Ľ','ľ'=>'ľ','Ŀ'=>'L·','ŀ'=>'l·','Ń'=>'Ń','ń'=>'ń','Ņ'=>'Ņ','ņ'=>'ņ','Ň'=>'Ň','ň'=>'ň','ʼn'=>'ʼn','Ō'=>'Ō','ō'=>'ō','Ŏ'=>'Ŏ','ŏ'=>'ŏ','Ő'=>'Ő','ő'=>'ő','Ŕ'=>'Ŕ','ŕ'=>'ŕ','Ŗ'=>'Ŗ','ŗ'=>'ŗ','Ř'=>'Ř','ř'=>'ř','Ś'=>'Ś','ś'=>'ś','Ŝ'=>'Ŝ','ŝ'=>'ŝ','Ş'=>'Ş','ş'=>'ş','Š'=>'Š','š'=>'š','Ţ'=>'Ţ','ţ'=>'ţ','Ť'=>'Ť','ť'=>'ť','Ũ'=>'Ũ','ũ'=>'ũ','Ū'=>'Ū','ū'=>'ū','Ŭ'=>'Ŭ','ŭ'=>'ŭ','Ů'=>'Ů','ů'=>'ů','Ű'=>'Ű','ű'=>'ű','Ų'=>'Ų','ų'=>'ų','Ŵ'=>'Ŵ','ŵ'=>'ŵ','Ŷ'=>'Ŷ','ŷ'=>'ŷ','Ÿ'=>'Ÿ','Ź'=>'Ź','ź'=>'ź','Ż'=>'Ż','ż'=>'ż','Ž'=>'Ž','ž'=>'ž','ſ'=>'s','Ơ'=>'Ơ','ơ'=>'ơ','Ư'=>'Ư','ư'=>'ư','DŽ'=>'DŽ','Dž'=>'Dž','dž'=>'dž','LJ'=>'LJ','Lj'=>'Lj','lj'=>'lj','NJ'=>'NJ','Nj'=>'Nj','nj'=>'nj','Ǎ'=>'Ǎ','ǎ'=>'ǎ','Ǐ'=>'Ǐ','ǐ'=>'ǐ','Ǒ'=>'Ǒ','ǒ'=>'ǒ','Ǔ'=>'Ǔ','ǔ'=>'ǔ','Ǖ'=>'Ǖ','ǖ'=>'ǖ','Ǘ'=>'Ǘ','ǘ'=>'ǘ','Ǚ'=>'Ǚ','ǚ'=>'ǚ','Ǜ'=>'Ǜ','ǜ'=>'ǜ','Ǟ'=>'Ǟ','ǟ'=>'ǟ','Ǡ'=>'Ǡ','ǡ'=>'ǡ','Ǣ'=>'Ǣ','ǣ'=>'ǣ','Ǧ'=>'Ǧ','ǧ'=>'ǧ','Ǩ'=>'Ǩ','ǩ'=>'ǩ','Ǫ'=>'Ǫ','ǫ'=>'ǫ','Ǭ'=>'Ǭ','ǭ'=>'ǭ','Ǯ'=>'Ǯ','ǯ'=>'ǯ','ǰ'=>'ǰ','DZ'=>'DZ','Dz'=>'Dz','dz'=>'dz','Ǵ'=>'Ǵ','ǵ'=>'ǵ','Ǹ'=>'Ǹ','ǹ'=>'ǹ','Ǻ'=>'Ǻ','ǻ'=>'ǻ','Ǽ'=>'Ǽ','ǽ'=>'ǽ','Ǿ'=>'Ǿ','ǿ'=>'ǿ','Ȁ'=>'Ȁ','ȁ'=>'ȁ','Ȃ'=>'Ȃ','ȃ'=>'ȃ','Ȅ'=>'Ȅ','ȅ'=>'ȅ','Ȇ'=>'Ȇ','ȇ'=>'ȇ','Ȉ'=>'Ȉ','ȉ'=>'ȉ','Ȋ'=>'Ȋ','ȋ'=>'ȋ','Ȍ'=>'Ȍ','ȍ'=>'ȍ','Ȏ'=>'Ȏ','ȏ'=>'ȏ','Ȑ'=>'Ȑ','ȑ'=>'ȑ','Ȓ'=>'Ȓ','ȓ'=>'ȓ','Ȕ'=>'Ȕ','ȕ'=>'ȕ','Ȗ'=>'Ȗ','ȗ'=>'ȗ','Ș'=>'Ș','ș'=>'ș','Ț'=>'Ț','ț'=>'ț','Ȟ'=>'Ȟ','ȟ'=>'ȟ','Ȧ'=>'Ȧ','ȧ'=>'ȧ','Ȩ'=>'Ȩ','ȩ'=>'ȩ','Ȫ'=>'Ȫ','ȫ'=>'ȫ','Ȭ'=>'Ȭ','ȭ'=>'ȭ','Ȯ'=>'Ȯ','ȯ'=>'ȯ','Ȱ'=>'Ȱ','ȱ'=>'ȱ','Ȳ'=>'Ȳ','ȳ'=>'ȳ','ʰ'=>'h','ʱ'=>'ɦ','ʲ'=>'j','ʳ'=>'r','ʴ'=>'ɹ','ʵ'=>'ɻ','ʶ'=>'ʁ','ʷ'=>'w','ʸ'=>'y','˘'=>' ̆','˙'=>' ̇','˚'=>' ̊','˛'=>' ̨','˜'=>' ̃','˝'=>' ̋','ˠ'=>'ɣ','ˡ'=>'l','ˢ'=>'s','ˣ'=>'x','ˤ'=>'ʕ','̀'=>'̀','́'=>'́','̓'=>'̓','̈́'=>'̈́','ʹ'=>'ʹ','ͺ'=>' ͅ',';'=>';','΄'=>' ́','΅'=>' ̈́','Ά'=>'Ά','·'=>'·','Έ'=>'Έ','Ή'=>'Ή','Ί'=>'Ί','Ό'=>'Ό','Ύ'=>'Ύ','Ώ'=>'Ώ','ΐ'=>'ΐ','Ϊ'=>'Ϊ','Ϋ'=>'Ϋ','ά'=>'ά','έ'=>'έ','ή'=>'ή','ί'=>'ί','ΰ'=>'ΰ','ϊ'=>'ϊ','ϋ'=>'ϋ','ό'=>'ό','ύ'=>'ύ','ώ'=>'ώ','ϐ'=>'β','ϑ'=>'θ','ϒ'=>'Υ','ϓ'=>'Ύ','ϔ'=>'Ϋ','ϕ'=>'φ','ϖ'=>'π','ϰ'=>'κ','ϱ'=>'ρ','ϲ'=>'ς','ϴ'=>'Θ','ϵ'=>'ε','Ϲ'=>'Σ','Ѐ'=>'Ѐ','Ё'=>'Ё','Ѓ'=>'Ѓ','Ї'=>'Ї','Ќ'=>'Ќ','Ѝ'=>'Ѝ','Ў'=>'Ў','Й'=>'Й','й'=>'й','ѐ'=>'ѐ','ё'=>'ё','ѓ'=>'ѓ','ї'=>'ї','ќ'=>'ќ','ѝ'=>'ѝ','ў'=>'ў','Ѷ'=>'Ѷ','ѷ'=>'ѷ','Ӂ'=>'Ӂ','ӂ'=>'ӂ','Ӑ'=>'Ӑ','ӑ'=>'ӑ','Ӓ'=>'Ӓ','ӓ'=>'ӓ','Ӗ'=>'Ӗ','ӗ'=>'ӗ','Ӛ'=>'Ӛ','ӛ'=>'ӛ','Ӝ'=>'Ӝ','ӝ'=>'ӝ','Ӟ'=>'Ӟ','ӟ'=>'ӟ','Ӣ'=>'Ӣ','ӣ'=>'ӣ','Ӥ'=>'Ӥ','ӥ'=>'ӥ','Ӧ'=>'Ӧ','ӧ'=>'ӧ','Ӫ'=>'Ӫ','ӫ'=>'ӫ','Ӭ'=>'Ӭ','ӭ'=>'ӭ','Ӯ'=>'Ӯ','ӯ'=>'ӯ','Ӱ'=>'Ӱ','ӱ'=>'ӱ','Ӳ'=>'Ӳ','ӳ'=>'ӳ','Ӵ'=>'Ӵ','ӵ'=>'ӵ','Ӹ'=>'Ӹ','ӹ'=>'ӹ','և'=>'եւ','آ'=>'آ','أ'=>'أ','ؤ'=>'ؤ','إ'=>'إ','ئ'=>'ئ','ٵ'=>'اٴ','ٶ'=>'وٴ','ٷ'=>'ۇٴ','ٸ'=>'يٴ','ۀ'=>'ۀ','ۂ'=>'ۂ','ۓ'=>'ۓ','ऩ'=>'ऩ','ऱ'=>'ऱ','ऴ'=>'ऴ','क़'=>'क़','ख़'=>'ख़','ग़'=>'ग़','ज़'=>'ज़','ड़'=>'ड़','ढ़'=>'ढ़','फ़'=>'फ़','य़'=>'य़','ো'=>'ো','ৌ'=>'ৌ','ড়'=>'ড়','ঢ়'=>'ঢ়','য়'=>'য়','ਲ਼'=>'ਲ਼','ਸ਼'=>'ਸ਼','ਖ਼'=>'ਖ਼','ਗ਼'=>'ਗ਼','ਜ਼'=>'ਜ਼','ਫ਼'=>'ਫ਼','ୈ'=>'ୈ','ୋ'=>'ୋ','ୌ'=>'ୌ','ଡ଼'=>'ଡ଼','ଢ଼'=>'ଢ଼','ஔ'=>'ஔ','ொ'=>'ொ','ோ'=>'ோ','ௌ'=>'ௌ','ై'=>'ై','ೀ'=>'ೀ','ೇ'=>'ೇ','ೈ'=>'ೈ','ೊ'=>'ೊ','ೋ'=>'ೋ','ൊ'=>'ൊ','ോ'=>'ോ','ൌ'=>'ൌ','ේ'=>'ේ','ො'=>'ො','ෝ'=>'ෝ','ෞ'=>'ෞ','ำ'=>'ํา','ຳ'=>'ໍາ','ໜ'=>'ຫນ','ໝ'=>'ຫມ','༌'=>'་','གྷ'=>'གྷ','ཌྷ'=>'ཌྷ','དྷ'=>'དྷ','བྷ'=>'བྷ','ཛྷ'=>'ཛྷ','ཀྵ'=>'ཀྵ','ཱི'=>'ཱི','ཱུ'=>'ཱུ','ྲྀ'=>'ྲྀ','ཷ'=>'ྲཱྀ','ླྀ'=>'ླྀ','ཹ'=>'ླཱྀ','ཱྀ'=>'ཱྀ','ྒྷ'=>'ྒྷ','ྜྷ'=>'ྜྷ','ྡྷ'=>'ྡྷ','ྦྷ'=>'ྦྷ','ྫྷ'=>'ྫྷ','ྐྵ'=>'ྐྵ','ဦ'=>'ဦ','ჼ'=>'ნ','ᬆ'=>'ᬆ','ᬈ'=>'ᬈ','ᬊ'=>'ᬊ','ᬌ'=>'ᬌ','ᬎ'=>'ᬎ','ᬒ'=>'ᬒ','ᬻ'=>'ᬻ','ᬽ'=>'ᬽ','ᭀ'=>'ᭀ','ᭁ'=>'ᭁ','ᭃ'=>'ᭃ','ᴬ'=>'A','ᴭ'=>'Æ','ᴮ'=>'B','ᴰ'=>'D','ᴱ'=>'E','ᴲ'=>'Ǝ','ᴳ'=>'G','ᴴ'=>'H','ᴵ'=>'I','ᴶ'=>'J','ᴷ'=>'K','ᴸ'=>'L','ᴹ'=>'M','ᴺ'=>'N','ᴼ'=>'O','ᴽ'=>'Ȣ','ᴾ'=>'P','ᴿ'=>'R','ᵀ'=>'T','ᵁ'=>'U','ᵂ'=>'W','ᵃ'=>'a','ᵄ'=>'ɐ','ᵅ'=>'ɑ','ᵆ'=>'ᴂ','ᵇ'=>'b','ᵈ'=>'d','ᵉ'=>'e','ᵊ'=>'ə','ᵋ'=>'ɛ','ᵌ'=>'ɜ','ᵍ'=>'g','ᵏ'=>'k','ᵐ'=>'m','ᵑ'=>'ŋ','ᵒ'=>'o','ᵓ'=>'ɔ','ᵔ'=>'ᴖ','ᵕ'=>'ᴗ','ᵖ'=>'p','ᵗ'=>'t','ᵘ'=>'u','ᵙ'=>'ᴝ','ᵚ'=>'ɯ','ᵛ'=>'v','ᵜ'=>'ᴥ','ᵝ'=>'β','ᵞ'=>'γ','ᵟ'=>'δ','ᵠ'=>'φ','ᵡ'=>'χ','ᵢ'=>'i','ᵣ'=>'r','ᵤ'=>'u','ᵥ'=>'v','ᵦ'=>'β','ᵧ'=>'γ','ᵨ'=>'ρ','ᵩ'=>'φ','ᵪ'=>'χ','ᵸ'=>'н','ᶛ'=>'ɒ','ᶜ'=>'c','ᶝ'=>'ɕ','ᶞ'=>'ð','ᶟ'=>'ɜ','ᶠ'=>'f','ᶡ'=>'ɟ','ᶢ'=>'ɡ','ᶣ'=>'ɥ','ᶤ'=>'ɨ','ᶥ'=>'ɩ','ᶦ'=>'ɪ','ᶧ'=>'ᵻ','ᶨ'=>'ʝ','ᶩ'=>'ɭ','ᶪ'=>'ᶅ','ᶫ'=>'ʟ','ᶬ'=>'ɱ','ᶭ'=>'ɰ','ᶮ'=>'ɲ','ᶯ'=>'ɳ','ᶰ'=>'ɴ','ᶱ'=>'ɵ','ᶲ'=>'ɸ','ᶳ'=>'ʂ','ᶴ'=>'ʃ','ᶵ'=>'ƫ','ᶶ'=>'ʉ','ᶷ'=>'ʊ','ᶸ'=>'ᴜ','ᶹ'=>'ʋ','ᶺ'=>'ʌ','ᶻ'=>'z','ᶼ'=>'ʐ','ᶽ'=>'ʑ','ᶾ'=>'ʒ','ᶿ'=>'θ','Ḁ'=>'Ḁ','ḁ'=>'ḁ','Ḃ'=>'Ḃ','ḃ'=>'ḃ','Ḅ'=>'Ḅ','ḅ'=>'ḅ','Ḇ'=>'Ḇ','ḇ'=>'ḇ','Ḉ'=>'Ḉ','ḉ'=>'ḉ','Ḋ'=>'Ḋ','ḋ'=>'ḋ','Ḍ'=>'Ḍ','ḍ'=>'ḍ','Ḏ'=>'Ḏ','ḏ'=>'ḏ','Ḑ'=>'Ḑ','ḑ'=>'ḑ','Ḓ'=>'Ḓ','ḓ'=>'ḓ','Ḕ'=>'Ḕ','ḕ'=>'ḕ','Ḗ'=>'Ḗ','ḗ'=>'ḗ','Ḙ'=>'Ḙ','ḙ'=>'ḙ','Ḛ'=>'Ḛ','ḛ'=>'ḛ','Ḝ'=>'Ḝ','ḝ'=>'ḝ','Ḟ'=>'Ḟ','ḟ'=>'ḟ','Ḡ'=>'Ḡ','ḡ'=>'ḡ','Ḣ'=>'Ḣ','ḣ'=>'ḣ','Ḥ'=>'Ḥ','ḥ'=>'ḥ','Ḧ'=>'Ḧ','ḧ'=>'ḧ','Ḩ'=>'Ḩ','ḩ'=>'ḩ','Ḫ'=>'Ḫ','ḫ'=>'ḫ','Ḭ'=>'Ḭ','ḭ'=>'ḭ','Ḯ'=>'Ḯ','ḯ'=>'ḯ','Ḱ'=>'Ḱ','ḱ'=>'ḱ','Ḳ'=>'Ḳ','ḳ'=>'ḳ','Ḵ'=>'Ḵ','ḵ'=>'ḵ','Ḷ'=>'Ḷ','ḷ'=>'ḷ','Ḹ'=>'Ḹ','ḹ'=>'ḹ','Ḻ'=>'Ḻ','ḻ'=>'ḻ','Ḽ'=>'Ḽ','ḽ'=>'ḽ','Ḿ'=>'Ḿ','ḿ'=>'ḿ','Ṁ'=>'Ṁ','ṁ'=>'ṁ','Ṃ'=>'Ṃ','ṃ'=>'ṃ','Ṅ'=>'Ṅ','ṅ'=>'ṅ','Ṇ'=>'Ṇ','ṇ'=>'ṇ','Ṉ'=>'Ṉ','ṉ'=>'ṉ','Ṋ'=>'Ṋ','ṋ'=>'ṋ','Ṍ'=>'Ṍ','ṍ'=>'ṍ','Ṏ'=>'Ṏ','ṏ'=>'ṏ','Ṑ'=>'Ṑ','ṑ'=>'ṑ','Ṓ'=>'Ṓ','ṓ'=>'ṓ','Ṕ'=>'Ṕ','ṕ'=>'ṕ','Ṗ'=>'Ṗ','ṗ'=>'ṗ','Ṙ'=>'Ṙ','ṙ'=>'ṙ','Ṛ'=>'Ṛ','ṛ'=>'ṛ','Ṝ'=>'Ṝ','ṝ'=>'ṝ','Ṟ'=>'Ṟ','ṟ'=>'ṟ','Ṡ'=>'Ṡ','ṡ'=>'ṡ','Ṣ'=>'Ṣ','ṣ'=>'ṣ','Ṥ'=>'Ṥ','ṥ'=>'ṥ','Ṧ'=>'Ṧ','ṧ'=>'ṧ','Ṩ'=>'Ṩ','ṩ'=>'ṩ','Ṫ'=>'Ṫ','ṫ'=>'ṫ','Ṭ'=>'Ṭ','ṭ'=>'ṭ','Ṯ'=>'Ṯ','ṯ'=>'ṯ','Ṱ'=>'Ṱ','ṱ'=>'ṱ','Ṳ'=>'Ṳ','ṳ'=>'ṳ','Ṵ'=>'Ṵ','ṵ'=>'ṵ','Ṷ'=>'Ṷ','ṷ'=>'ṷ','Ṹ'=>'Ṹ','ṹ'=>'ṹ','Ṻ'=>'Ṻ','ṻ'=>'ṻ','Ṽ'=>'Ṽ','ṽ'=>'ṽ','Ṿ'=>'Ṿ','ṿ'=>'ṿ','Ẁ'=>'Ẁ','ẁ'=>'ẁ','Ẃ'=>'Ẃ','ẃ'=>'ẃ','Ẅ'=>'Ẅ','ẅ'=>'ẅ','Ẇ'=>'Ẇ','ẇ'=>'ẇ','Ẉ'=>'Ẉ','ẉ'=>'ẉ','Ẋ'=>'Ẋ','ẋ'=>'ẋ','Ẍ'=>'Ẍ','ẍ'=>'ẍ','Ẏ'=>'Ẏ','ẏ'=>'ẏ','Ẑ'=>'Ẑ','ẑ'=>'ẑ','Ẓ'=>'Ẓ','ẓ'=>'ẓ','Ẕ'=>'Ẕ','ẕ'=>'ẕ','ẖ'=>'ẖ','ẗ'=>'ẗ','ẘ'=>'ẘ','ẙ'=>'ẙ','ẚ'=>'aʾ','ẛ'=>'ṡ','Ạ'=>'Ạ','ạ'=>'ạ','Ả'=>'Ả','ả'=>'ả','Ấ'=>'Ấ','ấ'=>'ấ','Ầ'=>'Ầ','ầ'=>'ầ','Ẩ'=>'Ẩ','ẩ'=>'ẩ','Ẫ'=>'Ẫ','ẫ'=>'ẫ','Ậ'=>'Ậ','ậ'=>'ậ','Ắ'=>'Ắ','ắ'=>'ắ','Ằ'=>'Ằ','ằ'=>'ằ','Ẳ'=>'Ẳ','ẳ'=>'ẳ','Ẵ'=>'Ẵ','ẵ'=>'ẵ','Ặ'=>'Ặ','ặ'=>'ặ','Ẹ'=>'Ẹ','ẹ'=>'ẹ','Ẻ'=>'Ẻ','ẻ'=>'ẻ','Ẽ'=>'Ẽ','ẽ'=>'ẽ','Ế'=>'Ế','ế'=>'ế','Ề'=>'Ề','ề'=>'ề','Ể'=>'Ể','ể'=>'ể','Ễ'=>'Ễ','ễ'=>'ễ','Ệ'=>'Ệ','ệ'=>'ệ','Ỉ'=>'Ỉ','ỉ'=>'ỉ','Ị'=>'Ị','ị'=>'ị','Ọ'=>'Ọ','ọ'=>'ọ','Ỏ'=>'Ỏ','ỏ'=>'ỏ','Ố'=>'Ố','ố'=>'ố','Ồ'=>'Ồ','ồ'=>'ồ','Ổ'=>'Ổ','ổ'=>'ổ','Ỗ'=>'Ỗ','ỗ'=>'ỗ','Ộ'=>'Ộ','ộ'=>'ộ','Ớ'=>'Ớ','ớ'=>'ớ','Ờ'=>'Ờ','ờ'=>'ờ','Ở'=>'Ở','ở'=>'ở','Ỡ'=>'Ỡ','ỡ'=>'ỡ','Ợ'=>'Ợ','ợ'=>'ợ','Ụ'=>'Ụ','ụ'=>'ụ','Ủ'=>'Ủ','ủ'=>'ủ','Ứ'=>'Ứ','ứ'=>'ứ','Ừ'=>'Ừ','ừ'=>'ừ','Ử'=>'Ử','ử'=>'ử','Ữ'=>'Ữ','ữ'=>'ữ','Ự'=>'Ự','ự'=>'ự','Ỳ'=>'Ỳ','ỳ'=>'ỳ','Ỵ'=>'Ỵ','ỵ'=>'ỵ','Ỷ'=>'Ỷ','ỷ'=>'ỷ','Ỹ'=>'Ỹ','ỹ'=>'ỹ','ἀ'=>'ἀ','ἁ'=>'ἁ','ἂ'=>'ἂ','ἃ'=>'ἃ','ἄ'=>'ἄ','ἅ'=>'ἅ','ἆ'=>'ἆ','ἇ'=>'ἇ','Ἀ'=>'Ἀ','Ἁ'=>'Ἁ','Ἂ'=>'Ἂ','Ἃ'=>'Ἃ','Ἄ'=>'Ἄ','Ἅ'=>'Ἅ','Ἆ'=>'Ἆ','Ἇ'=>'Ἇ','ἐ'=>'ἐ','ἑ'=>'ἑ','ἒ'=>'ἒ','ἓ'=>'ἓ','ἔ'=>'ἔ','ἕ'=>'ἕ','Ἐ'=>'Ἐ','Ἑ'=>'Ἑ','Ἒ'=>'Ἒ','Ἓ'=>'Ἓ','Ἔ'=>'Ἔ','Ἕ'=>'Ἕ','ἠ'=>'ἠ','ἡ'=>'ἡ','ἢ'=>'ἢ','ἣ'=>'ἣ','ἤ'=>'ἤ','ἥ'=>'ἥ','ἦ'=>'ἦ','ἧ'=>'ἧ','Ἠ'=>'Ἠ','Ἡ'=>'Ἡ','Ἢ'=>'Ἢ','Ἣ'=>'Ἣ','Ἤ'=>'Ἤ','Ἥ'=>'Ἥ','Ἦ'=>'Ἦ','Ἧ'=>'Ἧ','ἰ'=>'ἰ','ἱ'=>'ἱ','ἲ'=>'ἲ','ἳ'=>'ἳ','ἴ'=>'ἴ','ἵ'=>'ἵ','ἶ'=>'ἶ','ἷ'=>'ἷ','Ἰ'=>'Ἰ','Ἱ'=>'Ἱ','Ἲ'=>'Ἲ','Ἳ'=>'Ἳ','Ἴ'=>'Ἴ','Ἵ'=>'Ἵ','Ἶ'=>'Ἶ','Ἷ'=>'Ἷ','ὀ'=>'ὀ','ὁ'=>'ὁ','ὂ'=>'ὂ','ὃ'=>'ὃ','ὄ'=>'ὄ','ὅ'=>'ὅ','Ὀ'=>'Ὀ','Ὁ'=>'Ὁ','Ὂ'=>'Ὂ','Ὃ'=>'Ὃ','Ὄ'=>'Ὄ','Ὅ'=>'Ὅ','ὐ'=>'ὐ','ὑ'=>'ὑ','ὒ'=>'ὒ','ὓ'=>'ὓ','ὔ'=>'ὔ','ὕ'=>'ὕ','ὖ'=>'ὖ','ὗ'=>'ὗ','Ὑ'=>'Ὑ','Ὓ'=>'Ὓ','Ὕ'=>'Ὕ','Ὗ'=>'Ὗ','ὠ'=>'ὠ','ὡ'=>'ὡ','ὢ'=>'ὢ','ὣ'=>'ὣ','ὤ'=>'ὤ','ὥ'=>'ὥ','ὦ'=>'ὦ','ὧ'=>'ὧ','Ὠ'=>'Ὠ','Ὡ'=>'Ὡ','Ὢ'=>'Ὢ','Ὣ'=>'Ὣ','Ὤ'=>'Ὤ','Ὥ'=>'Ὥ','Ὦ'=>'Ὦ','Ὧ'=>'Ὧ','ὰ'=>'ὰ','ά'=>'ά','ὲ'=>'ὲ','έ'=>'έ','ὴ'=>'ὴ','ή'=>'ή','ὶ'=>'ὶ','ί'=>'ί','ὸ'=>'ὸ','ό'=>'ό','ὺ'=>'ὺ','ύ'=>'ύ','ὼ'=>'ὼ','ώ'=>'ώ','ᾀ'=>'ᾀ','ᾁ'=>'ᾁ','ᾂ'=>'ᾂ','ᾃ'=>'ᾃ','ᾄ'=>'ᾄ','ᾅ'=>'ᾅ','ᾆ'=>'ᾆ','ᾇ'=>'ᾇ','ᾈ'=>'ᾈ','ᾉ'=>'ᾉ','ᾊ'=>'ᾊ','ᾋ'=>'ᾋ','ᾌ'=>'ᾌ','ᾍ'=>'ᾍ','ᾎ'=>'ᾎ','ᾏ'=>'ᾏ','ᾐ'=>'ᾐ','ᾑ'=>'ᾑ','ᾒ'=>'ᾒ','ᾓ'=>'ᾓ','ᾔ'=>'ᾔ','ᾕ'=>'ᾕ','ᾖ'=>'ᾖ','ᾗ'=>'ᾗ','ᾘ'=>'ᾘ','ᾙ'=>'ᾙ','ᾚ'=>'ᾚ','ᾛ'=>'ᾛ','ᾜ'=>'ᾜ','ᾝ'=>'ᾝ','ᾞ'=>'ᾞ','ᾟ'=>'ᾟ','ᾠ'=>'ᾠ','ᾡ'=>'ᾡ','ᾢ'=>'ᾢ','ᾣ'=>'ᾣ','ᾤ'=>'ᾤ','ᾥ'=>'ᾥ','ᾦ'=>'ᾦ','ᾧ'=>'ᾧ','ᾨ'=>'ᾨ','ᾩ'=>'ᾩ','ᾪ'=>'ᾪ','ᾫ'=>'ᾫ','ᾬ'=>'ᾬ','ᾭ'=>'ᾭ','ᾮ'=>'ᾮ','ᾯ'=>'ᾯ','ᾰ'=>'ᾰ','ᾱ'=>'ᾱ','ᾲ'=>'ᾲ','ᾳ'=>'ᾳ','ᾴ'=>'ᾴ','ᾶ'=>'ᾶ','ᾷ'=>'ᾷ','Ᾰ'=>'Ᾰ','Ᾱ'=>'Ᾱ','Ὰ'=>'Ὰ','Ά'=>'Ά','ᾼ'=>'ᾼ','᾽'=>' ̓','ι'=>'ι','᾿'=>' ̓','῀'=>' ͂','῁'=>' ̈͂','ῂ'=>'ῂ','ῃ'=>'ῃ','ῄ'=>'ῄ','ῆ'=>'ῆ','ῇ'=>'ῇ','Ὲ'=>'Ὲ','Έ'=>'Έ','Ὴ'=>'Ὴ','Ή'=>'Ή','ῌ'=>'ῌ','῍'=>' ̓̀','῎'=>' ̓́','῏'=>' ̓͂','ῐ'=>'ῐ','ῑ'=>'ῑ','ῒ'=>'ῒ','ΐ'=>'ΐ','ῖ'=>'ῖ','ῗ'=>'ῗ','Ῐ'=>'Ῐ','Ῑ'=>'Ῑ','Ὶ'=>'Ὶ','Ί'=>'Ί','῝'=>' ̔̀','῞'=>' ̔́','῟'=>' ̔͂','ῠ'=>'ῠ','ῡ'=>'ῡ','ῢ'=>'ῢ','ΰ'=>'ΰ','ῤ'=>'ῤ','ῥ'=>'ῥ','ῦ'=>'ῦ','ῧ'=>'ῧ','Ῠ'=>'Ῠ','Ῡ'=>'Ῡ','Ὺ'=>'Ὺ','Ύ'=>'Ύ','Ῥ'=>'Ῥ','῭'=>' ̈̀','΅'=>' ̈́','`'=>'`','ῲ'=>'ῲ','ῳ'=>'ῳ','ῴ'=>'ῴ','ῶ'=>'ῶ','ῷ'=>'ῷ','Ὸ'=>'Ὸ','Ό'=>'Ό','Ὼ'=>'Ὼ','Ώ'=>'Ώ','ῼ'=>'ῼ','´'=>' ́','῾'=>' ̔',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ',' '=>' ','‑'=>'‐','‗'=>' ̳','․'=>'.','‥'=>'..','…'=>'...',' '=>' ','″'=>'′′','‴'=>'′′′','‶'=>'‵‵','‷'=>'‵‵‵','‼'=>'!!','‾'=>' ̅','⁇'=>'??','⁈'=>'?!','⁉'=>'!?','⁗'=>'′′′′',' '=>' ','⁰'=>'0','ⁱ'=>'i','⁴'=>'4','⁵'=>'5','⁶'=>'6','⁷'=>'7','⁸'=>'8','⁹'=>'9','⁺'=>'+','⁻'=>'−','⁼'=>'=','⁽'=>'(','⁾'=>')','ⁿ'=>'n','₀'=>'0','₁'=>'1','₂'=>'2','₃'=>'3','₄'=>'4','₅'=>'5','₆'=>'6','₇'=>'7','₈'=>'8','₉'=>'9','₊'=>'+','₋'=>'−','₌'=>'=','₍'=>'(','₎'=>')','ₐ'=>'a','ₑ'=>'e','ₒ'=>'o','ₓ'=>'x','ₔ'=>'ə','₨'=>'Rs','℀'=>'a/c','℁'=>'a/s','ℂ'=>'C','℃'=>'°C','℅'=>'c/o','℆'=>'c/u','ℇ'=>'Ɛ','℉'=>'°F','ℊ'=>'g','ℋ'=>'H','ℌ'=>'H','ℍ'=>'H','ℎ'=>'h','ℏ'=>'ħ','ℐ'=>'I','ℑ'=>'I','ℒ'=>'L','ℓ'=>'l','ℕ'=>'N','№'=>'No','ℙ'=>'P','ℚ'=>'Q','ℛ'=>'R','ℜ'=>'R','ℝ'=>'R','℠'=>'SM','℡'=>'TEL','™'=>'TM','ℤ'=>'Z','Ω'=>'Ω','ℨ'=>'Z','K'=>'K','Å'=>'Å','ℬ'=>'B','ℭ'=>'C','ℯ'=>'e','ℰ'=>'E','ℱ'=>'F','ℳ'=>'M','ℴ'=>'o','ℵ'=>'א','ℶ'=>'ב','ℷ'=>'ג','ℸ'=>'ד','ℹ'=>'i','℻'=>'FAX','ℼ'=>'π','ℽ'=>'γ','ℾ'=>'Γ','ℿ'=>'Π','⅀'=>'∑','ⅅ'=>'D','ⅆ'=>'d','ⅇ'=>'e','ⅈ'=>'i','ⅉ'=>'j','⅓'=>'1⁄3','⅔'=>'2⁄3','⅕'=>'1⁄5','⅖'=>'2⁄5','⅗'=>'3⁄5','⅘'=>'4⁄5','⅙'=>'1⁄6','⅚'=>'5⁄6','⅛'=>'1⁄8','⅜'=>'3⁄8','⅝'=>'5⁄8','⅞'=>'7⁄8','⅟'=>'1⁄','Ⅰ'=>'I','Ⅱ'=>'II','Ⅲ'=>'III','Ⅳ'=>'IV','Ⅴ'=>'V','Ⅵ'=>'VI','Ⅶ'=>'VII','Ⅷ'=>'VIII','Ⅸ'=>'IX','Ⅹ'=>'X','Ⅺ'=>'XI','Ⅻ'=>'XII','Ⅼ'=>'L','Ⅽ'=>'C','Ⅾ'=>'D','Ⅿ'=>'M','ⅰ'=>'i','ⅱ'=>'ii','ⅲ'=>'iii','ⅳ'=>'iv','ⅴ'=>'v','ⅵ'=>'vi','ⅶ'=>'vii','ⅷ'=>'viii','ⅸ'=>'ix','ⅹ'=>'x','ⅺ'=>'xi','ⅻ'=>'xii','ⅼ'=>'l','ⅽ'=>'c','ⅾ'=>'d','ⅿ'=>'m','↚'=>'↚','↛'=>'↛','↮'=>'↮','⇍'=>'⇍','⇎'=>'⇎','⇏'=>'⇏','∄'=>'∄','∉'=>'∉','∌'=>'∌','∤'=>'∤','∦'=>'∦','∬'=>'∫∫','∭'=>'∫∫∫','∯'=>'∮∮','∰'=>'∮∮∮','≁'=>'≁','≄'=>'≄','≇'=>'≇','≉'=>'≉','≠'=>'≠','≢'=>'≢','≭'=>'≭','≮'=>'≮','≯'=>'≯','≰'=>'≰','≱'=>'≱','≴'=>'≴','≵'=>'≵','≸'=>'≸','≹'=>'≹','⊀'=>'⊀','⊁'=>'⊁','⊄'=>'⊄','⊅'=>'⊅','⊈'=>'⊈','⊉'=>'⊉','⊬'=>'⊬','⊭'=>'⊭','⊮'=>'⊮','⊯'=>'⊯','⋠'=>'⋠','⋡'=>'⋡','⋢'=>'⋢','⋣'=>'⋣','⋪'=>'⋪','⋫'=>'⋫','⋬'=>'⋬','⋭'=>'⋭','〈'=>'〈','〉'=>'〉','①'=>'1','②'=>'2','③'=>'3','④'=>'4','⑤'=>'5','⑥'=>'6','⑦'=>'7','⑧'=>'8','⑨'=>'9','⑩'=>'10','⑪'=>'11','⑫'=>'12','⑬'=>'13','⑭'=>'14','⑮'=>'15','⑯'=>'16','⑰'=>'17','⑱'=>'18','⑲'=>'19','⑳'=>'20','⑴'=>'(1)','⑵'=>'(2)','⑶'=>'(3)','⑷'=>'(4)','⑸'=>'(5)','⑹'=>'(6)','⑺'=>'(7)','⑻'=>'(8)','⑼'=>'(9)','⑽'=>'(10)','⑾'=>'(11)','⑿'=>'(12)','⒀'=>'(13)','⒁'=>'(14)','⒂'=>'(15)','⒃'=>'(16)','⒄'=>'(17)','⒅'=>'(18)','⒆'=>'(19)','⒇'=>'(20)','⒈'=>'1.','⒉'=>'2.','⒊'=>'3.','⒋'=>'4.','⒌'=>'5.','⒍'=>'6.','⒎'=>'7.','⒏'=>'8.','⒐'=>'9.','⒑'=>'10.','⒒'=>'11.','⒓'=>'12.','⒔'=>'13.','⒕'=>'14.','⒖'=>'15.','⒗'=>'16.','⒘'=>'17.','⒙'=>'18.','⒚'=>'19.','⒛'=>'20.','⒜'=>'(a)','⒝'=>'(b)','⒞'=>'(c)','⒟'=>'(d)','⒠'=>'(e)','⒡'=>'(f)','⒢'=>'(g)','⒣'=>'(h)','⒤'=>'(i)','⒥'=>'(j)','⒦'=>'(k)','⒧'=>'(l)','⒨'=>'(m)','⒩'=>'(n)','⒪'=>'(o)','⒫'=>'(p)','⒬'=>'(q)','⒭'=>'(r)','⒮'=>'(s)','⒯'=>'(t)','⒰'=>'(u)','⒱'=>'(v)','⒲'=>'(w)','⒳'=>'(x)','⒴'=>'(y)','⒵'=>'(z)','Ⓐ'=>'A','Ⓑ'=>'B','Ⓒ'=>'C','Ⓓ'=>'D','Ⓔ'=>'E','Ⓕ'=>'F','Ⓖ'=>'G','Ⓗ'=>'H','Ⓘ'=>'I','Ⓙ'=>'J','Ⓚ'=>'K','Ⓛ'=>'L','Ⓜ'=>'M','Ⓝ'=>'N','Ⓞ'=>'O','Ⓟ'=>'P','Ⓠ'=>'Q','Ⓡ'=>'R','Ⓢ'=>'S','Ⓣ'=>'T','Ⓤ'=>'U','Ⓥ'=>'V','Ⓦ'=>'W','Ⓧ'=>'X','Ⓨ'=>'Y','Ⓩ'=>'Z','ⓐ'=>'a','ⓑ'=>'b','ⓒ'=>'c','ⓓ'=>'d','ⓔ'=>'e','ⓕ'=>'f','ⓖ'=>'g','ⓗ'=>'h','ⓘ'=>'i','ⓙ'=>'j','ⓚ'=>'k','ⓛ'=>'l','ⓜ'=>'m','ⓝ'=>'n','ⓞ'=>'o','ⓟ'=>'p','ⓠ'=>'q','ⓡ'=>'r','ⓢ'=>'s','ⓣ'=>'t','ⓤ'=>'u','ⓥ'=>'v','ⓦ'=>'w','ⓧ'=>'x','ⓨ'=>'y','ⓩ'=>'z','⓪'=>'0','⨌'=>'∫∫∫∫','⩴'=>'::=','⩵'=>'==','⩶'=>'===','⫝̸'=>'⫝̸','ⵯ'=>'ⵡ','⺟'=>'母','⻳'=>'龟','⼀'=>'一','⼁'=>'丨','⼂'=>'丶','⼃'=>'丿','⼄'=>'乙','⼅'=>'亅','⼆'=>'二','⼇'=>'亠','⼈'=>'人','⼉'=>'儿','⼊'=>'入','⼋'=>'八','⼌'=>'冂','⼍'=>'冖','⼎'=>'冫','⼏'=>'几','⼐'=>'凵','⼑'=>'刀','⼒'=>'力','⼓'=>'勹','⼔'=>'匕','⼕'=>'匚','⼖'=>'匸','⼗'=>'十','⼘'=>'卜','⼙'=>'卩','⼚'=>'厂','⼛'=>'厶','⼜'=>'又','⼝'=>'口','⼞'=>'囗','⼟'=>'土','⼠'=>'士','⼡'=>'夂','⼢'=>'夊','⼣'=>'夕','⼤'=>'大','⼥'=>'女','⼦'=>'子','⼧'=>'宀','⼨'=>'寸','⼩'=>'小','⼪'=>'尢','⼫'=>'尸','⼬'=>'屮','⼭'=>'山','⼮'=>'巛','⼯'=>'工','⼰'=>'己','⼱'=>'巾','⼲'=>'干','⼳'=>'幺','⼴'=>'广','⼵'=>'廴','⼶'=>'廾','⼷'=>'弋','⼸'=>'弓','⼹'=>'彐','⼺'=>'彡','⼻'=>'彳','⼼'=>'心','⼽'=>'戈','⼾'=>'戶','⼿'=>'手','⽀'=>'支','⽁'=>'攴','⽂'=>'文','⽃'=>'斗','⽄'=>'斤','⽅'=>'方','⽆'=>'无','⽇'=>'日','⽈'=>'曰','⽉'=>'月','⽊'=>'木','⽋'=>'欠','⽌'=>'止','⽍'=>'歹','⽎'=>'殳','⽏'=>'毋','⽐'=>'比','⽑'=>'毛','⽒'=>'氏','⽓'=>'气','⽔'=>'水','⽕'=>'火','⽖'=>'爪','⽗'=>'父','⽘'=>'爻','⽙'=>'爿','⽚'=>'片','⽛'=>'牙','⽜'=>'牛','⽝'=>'犬','⽞'=>'玄','⽟'=>'玉','⽠'=>'瓜','⽡'=>'瓦','⽢'=>'甘','⽣'=>'生','⽤'=>'用','⽥'=>'田','⽦'=>'疋','⽧'=>'疒','⽨'=>'癶','⽩'=>'白','⽪'=>'皮','⽫'=>'皿','⽬'=>'目','⽭'=>'矛','⽮'=>'矢','⽯'=>'石','⽰'=>'示','⽱'=>'禸','⽲'=>'禾','⽳'=>'穴','⽴'=>'立','⽵'=>'竹','⽶'=>'米','⽷'=>'糸','⽸'=>'缶','⽹'=>'网','⽺'=>'羊','⽻'=>'羽','⽼'=>'老','⽽'=>'而','⽾'=>'耒','⽿'=>'耳','⾀'=>'聿','⾁'=>'肉','⾂'=>'臣','⾃'=>'自','⾄'=>'至','⾅'=>'臼','⾆'=>'舌','⾇'=>'舛','⾈'=>'舟','⾉'=>'艮','⾊'=>'色','⾋'=>'艸','⾌'=>'虍','⾍'=>'虫','⾎'=>'血','⾏'=>'行','⾐'=>'衣','⾑'=>'襾','⾒'=>'見','⾓'=>'角','⾔'=>'言','⾕'=>'谷','⾖'=>'豆','⾗'=>'豕','⾘'=>'豸','⾙'=>'貝','⾚'=>'赤','⾛'=>'走','⾜'=>'足','⾝'=>'身','⾞'=>'車','⾟'=>'辛','⾠'=>'辰','⾡'=>'辵','⾢'=>'邑','⾣'=>'酉','⾤'=>'釆','⾥'=>'里','⾦'=>'金','⾧'=>'長','⾨'=>'門','⾩'=>'阜','⾪'=>'隶','⾫'=>'隹','⾬'=>'雨','⾭'=>'靑','⾮'=>'非','⾯'=>'面','⾰'=>'革','⾱'=>'韋','⾲'=>'韭','⾳'=>'音','⾴'=>'頁','⾵'=>'風','⾶'=>'飛','⾷'=>'食','⾸'=>'首','⾹'=>'香','⾺'=>'馬','⾻'=>'骨','⾼'=>'高','⾽'=>'髟','⾾'=>'鬥','⾿'=>'鬯','⿀'=>'鬲','⿁'=>'鬼','⿂'=>'魚','⿃'=>'鳥','⿄'=>'鹵','⿅'=>'鹿','⿆'=>'麥','⿇'=>'麻','⿈'=>'黃','⿉'=>'黍','⿊'=>'黑','⿋'=>'黹','⿌'=>'黽','⿍'=>'鼎','⿎'=>'鼓','⿏'=>'鼠','⿐'=>'鼻','⿑'=>'齊','⿒'=>'齒','⿓'=>'龍','⿔'=>'龜','⿕'=>'龠',' '=>' ','〶'=>'〒','〸'=>'十','〹'=>'卄','〺'=>'卅','が'=>'が','ぎ'=>'ぎ','ぐ'=>'ぐ','げ'=>'げ','ご'=>'ご','ざ'=>'ざ','じ'=>'じ','ず'=>'ず','ぜ'=>'ぜ','ぞ'=>'ぞ','だ'=>'だ','ぢ'=>'ぢ','づ'=>'づ','で'=>'で','ど'=>'ど','ば'=>'ば','ぱ'=>'ぱ','び'=>'び','ぴ'=>'ぴ','ぶ'=>'ぶ','ぷ'=>'ぷ','べ'=>'べ','ぺ'=>'ぺ','ぼ'=>'ぼ','ぽ'=>'ぽ','ゔ'=>'ゔ','゛'=>' ゙','゜'=>' ゚','ゞ'=>'ゞ','ゟ'=>'より','ガ'=>'ガ','ギ'=>'ギ','グ'=>'グ','ゲ'=>'ゲ','ゴ'=>'ゴ','ザ'=>'ザ','ジ'=>'ジ','ズ'=>'ズ','ゼ'=>'ゼ','ゾ'=>'ゾ','ダ'=>'ダ','ヂ'=>'ヂ','ヅ'=>'ヅ','デ'=>'デ','ド'=>'ド','バ'=>'バ','パ'=>'パ','ビ'=>'ビ','ピ'=>'ピ','ブ'=>'ブ','プ'=>'プ','ベ'=>'ベ','ペ'=>'ペ','ボ'=>'ボ','ポ'=>'ポ','ヴ'=>'ヴ','ヷ'=>'ヷ','ヸ'=>'ヸ','ヹ'=>'ヹ','ヺ'=>'ヺ','ヾ'=>'ヾ','ヿ'=>'コト','ㄱ'=>'ᄀ','ㄲ'=>'ᄁ','ㄳ'=>'ᆪ','ㄴ'=>'ᄂ','ㄵ'=>'ᆬ','ㄶ'=>'ᆭ','ㄷ'=>'ᄃ','ㄸ'=>'ᄄ','ㄹ'=>'ᄅ','ㄺ'=>'ᆰ','ㄻ'=>'ᆱ','ㄼ'=>'ᆲ','ㄽ'=>'ᆳ','ㄾ'=>'ᆴ','ㄿ'=>'ᆵ','ㅀ'=>'ᄚ','ㅁ'=>'ᄆ','ㅂ'=>'ᄇ','ㅃ'=>'ᄈ','ㅄ'=>'ᄡ','ㅅ'=>'ᄉ','ㅆ'=>'ᄊ','ㅇ'=>'ᄋ','ㅈ'=>'ᄌ','ㅉ'=>'ᄍ','ㅊ'=>'ᄎ','ㅋ'=>'ᄏ','ㅌ'=>'ᄐ','ㅍ'=>'ᄑ','ㅎ'=>'ᄒ','ㅏ'=>'ᅡ','ㅐ'=>'ᅢ','ㅑ'=>'ᅣ','ㅒ'=>'ᅤ','ㅓ'=>'ᅥ','ㅔ'=>'ᅦ','ㅕ'=>'ᅧ','ㅖ'=>'ᅨ','ㅗ'=>'ᅩ','ㅘ'=>'ᅪ','ㅙ'=>'ᅫ','ㅚ'=>'ᅬ','ㅛ'=>'ᅭ','ㅜ'=>'ᅮ','ㅝ'=>'ᅯ','ㅞ'=>'ᅰ','ㅟ'=>'ᅱ','ㅠ'=>'ᅲ','ㅡ'=>'ᅳ','ㅢ'=>'ᅴ','ㅣ'=>'ᅵ','ㅤ'=>'ᅠ','ㅥ'=>'ᄔ','ㅦ'=>'ᄕ','ㅧ'=>'ᇇ','ㅨ'=>'ᇈ','ㅩ'=>'ᇌ','ㅪ'=>'ᇎ','ㅫ'=>'ᇓ','ㅬ'=>'ᇗ','ㅭ'=>'ᇙ','ㅮ'=>'ᄜ','ㅯ'=>'ᇝ','ㅰ'=>'ᇟ','ㅱ'=>'ᄝ','ㅲ'=>'ᄞ','ㅳ'=>'ᄠ','ㅴ'=>'ᄢ','ㅵ'=>'ᄣ','ㅶ'=>'ᄧ','ㅷ'=>'ᄩ','ㅸ'=>'ᄫ','ㅹ'=>'ᄬ','ㅺ'=>'ᄭ','ㅻ'=>'ᄮ','ㅼ'=>'ᄯ','ㅽ'=>'ᄲ','ㅾ'=>'ᄶ','ㅿ'=>'ᅀ','ㆀ'=>'ᅇ','ㆁ'=>'ᅌ','ㆂ'=>'ᇱ','ㆃ'=>'ᇲ','ㆄ'=>'ᅗ','ㆅ'=>'ᅘ','ㆆ'=>'ᅙ','ㆇ'=>'ᆄ','ㆈ'=>'ᆅ','ㆉ'=>'ᆈ','ㆊ'=>'ᆑ','ㆋ'=>'ᆒ','ㆌ'=>'ᆔ','ㆍ'=>'ᆞ','ㆎ'=>'ᆡ','㆒'=>'一','㆓'=>'二','㆔'=>'三','㆕'=>'四','㆖'=>'上','㆗'=>'中','㆘'=>'下','㆙'=>'甲','㆚'=>'乙','㆛'=>'丙','㆜'=>'丁','㆝'=>'天','㆞'=>'地','㆟'=>'人','㈀'=>'(ᄀ)','㈁'=>'(ᄂ)','㈂'=>'(ᄃ)','㈃'=>'(ᄅ)','㈄'=>'(ᄆ)','㈅'=>'(ᄇ)','㈆'=>'(ᄉ)','㈇'=>'(ᄋ)','㈈'=>'(ᄌ)','㈉'=>'(ᄎ)','㈊'=>'(ᄏ)','㈋'=>'(ᄐ)','㈌'=>'(ᄑ)','㈍'=>'(ᄒ)','㈎'=>'(가)','㈏'=>'(나)','㈐'=>'(다)','㈑'=>'(라)','㈒'=>'(마)','㈓'=>'(바)','㈔'=>'(사)','㈕'=>'(아)','㈖'=>'(자)','㈗'=>'(차)','㈘'=>'(카)','㈙'=>'(타)','㈚'=>'(파)','㈛'=>'(하)','㈜'=>'(주)','㈝'=>'(오전)','㈞'=>'(오후)','㈠'=>'(一)','㈡'=>'(二)','㈢'=>'(三)','㈣'=>'(四)','㈤'=>'(五)','㈥'=>'(六)','㈦'=>'(七)','㈧'=>'(八)','㈨'=>'(九)','㈩'=>'(十)','㈪'=>'(月)','㈫'=>'(火)','㈬'=>'(水)','㈭'=>'(木)','㈮'=>'(金)','㈯'=>'(土)','㈰'=>'(日)','㈱'=>'(株)','㈲'=>'(有)','㈳'=>'(社)','㈴'=>'(名)','㈵'=>'(特)','㈶'=>'(財)','㈷'=>'(祝)','㈸'=>'(労)','㈹'=>'(代)','㈺'=>'(呼)','㈻'=>'(学)','㈼'=>'(監)','㈽'=>'(企)','㈾'=>'(資)','㈿'=>'(協)','㉀'=>'(祭)','㉁'=>'(休)','㉂'=>'(自)','㉃'=>'(至)','㉐'=>'PTE','㉑'=>'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','㋀'=>'1月','㋁'=>'2月','㋂'=>'3月','㋃'=>'4月','㋄'=>'5月','㋅'=>'6月','㋆'=>'7月','㋇'=>'8月','㋈'=>'9月','㋉'=>'10月','㋊'=>'11月','㋋'=>'12月','㋌'=>'Hg','㋍'=>'erg','㋎'=>'eV','㋏'=>'LTD','㋐'=>'ア','㋑'=>'イ','㋒'=>'ウ','㋓'=>'エ','㋔'=>'オ','㋕'=>'カ','㋖'=>'キ','㋗'=>'ク','㋘'=>'ケ','㋙'=>'コ','㋚'=>'サ','㋛'=>'シ','㋜'=>'ス','㋝'=>'セ','㋞'=>'ソ','㋟'=>'タ','㋠'=>'チ','㋡'=>'ツ','㋢'=>'テ','㋣'=>'ト','㋤'=>'ナ','㋥'=>'ニ','㋦'=>'ヌ','㋧'=>'ネ','㋨'=>'ノ','㋩'=>'ハ','㋪'=>'ヒ','㋫'=>'フ','㋬'=>'ヘ','㋭'=>'ホ','㋮'=>'マ','㋯'=>'ミ','㋰'=>'ム','㋱'=>'メ','㋲'=>'モ','㋳'=>'ヤ','㋴'=>'ユ','㋵'=>'ヨ','㋶'=>'ラ','㋷'=>'リ','㋸'=>'ル','㋹'=>'レ','㋺'=>'ロ','㋻'=>'ワ','㋼'=>'ヰ','㋽'=>'ヱ','㋾'=>'ヲ','㌀'=>'アパート','㌁'=>'アルファ','㌂'=>'アンペア','㌃'=>'アール','㌄'=>'イニング','㌅'=>'インチ','㌆'=>'ウォン','㌇'=>'エスクード','㌈'=>'エーカー','㌉'=>'オンス','㌊'=>'オーム','㌋'=>'カイリ','㌌'=>'カラット','㌍'=>'カロリー','㌎'=>'ガロン','㌏'=>'ガンマ','㌐'=>'ギガ','㌑'=>'ギニー','㌒'=>'キュリー','㌓'=>'ギルダー','㌔'=>'キロ','㌕'=>'キログラム','㌖'=>'キロメートル','㌗'=>'キロワット','㌘'=>'グラム','㌙'=>'グラムトン','㌚'=>'クルゼイロ','㌛'=>'クローネ','㌜'=>'ケース','㌝'=>'コルナ','㌞'=>'コーポ','㌟'=>'サイクル','㌠'=>'サンチーム','㌡'=>'シリング','㌢'=>'センチ','㌣'=>'セント','㌤'=>'ダース','㌥'=>'デシ','㌦'=>'ドル','㌧'=>'トン','㌨'=>'ナノ','㌩'=>'ノット','㌪'=>'ハイツ','㌫'=>'パーセント','㌬'=>'パーツ','㌭'=>'バーレル','㌮'=>'ピアストル','㌯'=>'ピクル','㌰'=>'ピコ','㌱'=>'ビル','㌲'=>'ファラッド','㌳'=>'フィート','㌴'=>'ブッシェル','㌵'=>'フラン','㌶'=>'ヘクタール','㌷'=>'ペソ','㌸'=>'ペニヒ','㌹'=>'ヘルツ','㌺'=>'ペンス','㌻'=>'ページ','㌼'=>'ベータ','㌽'=>'ポイント','㌾'=>'ボルト','㌿'=>'ホン','㍀'=>'ポンド','㍁'=>'ホール','㍂'=>'ホーン','㍃'=>'マイクロ','㍄'=>'マイル','㍅'=>'マッハ','㍆'=>'マルク','㍇'=>'マンション','㍈'=>'ミクロン','㍉'=>'ミリ','㍊'=>'ミリバール','㍋'=>'メガ','㍌'=>'メガトン','㍍'=>'メートル','㍎'=>'ヤード','㍏'=>'ヤール','㍐'=>'ユアン','㍑'=>'リットル','㍒'=>'リラ','㍓'=>'ルピー','㍔'=>'ルーブル','㍕'=>'レム','㍖'=>'レントゲン','㍗'=>'ワット','㍘'=>'0点','㍙'=>'1点','㍚'=>'2点','㍛'=>'3点','㍜'=>'4点','㍝'=>'5点','㍞'=>'6点','㍟'=>'7点','㍠'=>'8点','㍡'=>'9点','㍢'=>'10点','㍣'=>'11点','㍤'=>'12点','㍥'=>'13点','㍦'=>'14点','㍧'=>'15点','㍨'=>'16点','㍩'=>'17点','㍪'=>'18点','㍫'=>'19点','㍬'=>'20点','㍭'=>'21点','㍮'=>'22点','㍯'=>'23点','㍰'=>'24点','㍱'=>'hPa','㍲'=>'da','㍳'=>'AU','㍴'=>'bar','㍵'=>'oV','㍶'=>'pc','㍷'=>'dm','㍸'=>'dm2','㍹'=>'dm3','㍺'=>'IU','㍻'=>'平成','㍼'=>'昭和','㍽'=>'大正','㍾'=>'明治','㍿'=>'株式会社','㎀'=>'pA','㎁'=>'nA','㎂'=>'μA','㎃'=>'mA','㎄'=>'kA','㎅'=>'KB','㎆'=>'MB','㎇'=>'GB','㎈'=>'cal','㎉'=>'kcal','㎊'=>'pF','㎋'=>'nF','㎌'=>'μF','㎍'=>'μg','㎎'=>'mg','㎏'=>'kg','㎐'=>'Hz','㎑'=>'kHz','㎒'=>'MHz','㎓'=>'GHz','㎔'=>'THz','㎕'=>'μl','㎖'=>'ml','㎗'=>'dl','㎘'=>'kl','㎙'=>'fm','㎚'=>'nm','㎛'=>'μm','㎜'=>'mm','㎝'=>'cm','㎞'=>'km','㎟'=>'mm2','㎠'=>'cm2','㎡'=>'m2','㎢'=>'km2','㎣'=>'mm3','㎤'=>'cm3','㎥'=>'m3','㎦'=>'km3','㎧'=>'m∕s','㎨'=>'m∕s2','㎩'=>'Pa','㎪'=>'kPa','㎫'=>'MPa','㎬'=>'GPa','㎭'=>'rad','㎮'=>'rad∕s','㎯'=>'rad∕s2','㎰'=>'ps','㎱'=>'ns','㎲'=>'μs','㎳'=>'ms','㎴'=>'pV','㎵'=>'nV','㎶'=>'μV','㎷'=>'mV','㎸'=>'kV','㎹'=>'MV','㎺'=>'pW','㎻'=>'nW','㎼'=>'μW','㎽'=>'mW','㎾'=>'kW','㎿'=>'MW','㏀'=>'kΩ','㏁'=>'MΩ','㏂'=>'a.m.','㏃'=>'Bq','㏄'=>'cc','㏅'=>'cd','㏆'=>'C∕kg','㏇'=>'Co.','㏈'=>'dB','㏉'=>'Gy','㏊'=>'ha','㏋'=>'HP','㏌'=>'in','㏍'=>'KK','㏎'=>'KM','㏏'=>'kt','㏐'=>'lm','㏑'=>'ln','㏒'=>'log','㏓'=>'lx','㏔'=>'mb','㏕'=>'mil','㏖'=>'mol','㏗'=>'PH','㏘'=>'p.m.','㏙'=>'PPM','㏚'=>'PR','㏛'=>'sr','㏜'=>'Sv','㏝'=>'Wb','㏞'=>'V∕m','㏟'=>'A∕m','㏠'=>'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日','㏿'=>'gal','豈'=>'豈','更'=>'更','車'=>'車','賈'=>'賈','滑'=>'滑','串'=>'串','句'=>'句','龜'=>'龜','龜'=>'龜','契'=>'契','金'=>'金','喇'=>'喇','奈'=>'奈','懶'=>'懶','癩'=>'癩','羅'=>'羅','蘿'=>'蘿','螺'=>'螺','裸'=>'裸','邏'=>'邏','樂'=>'樂','洛'=>'洛','烙'=>'烙','珞'=>'珞','落'=>'落','酪'=>'酪','駱'=>'駱','亂'=>'亂','卵'=>'卵','欄'=>'欄','爛'=>'爛','蘭'=>'蘭','鸞'=>'鸞','嵐'=>'嵐','濫'=>'濫','藍'=>'藍','襤'=>'襤','拉'=>'拉','臘'=>'臘','蠟'=>'蠟','廊'=>'廊','朗'=>'朗','浪'=>'浪','狼'=>'狼','郎'=>'郎','來'=>'來','冷'=>'冷','勞'=>'勞','擄'=>'擄','櫓'=>'櫓','爐'=>'爐','盧'=>'盧','老'=>'老','蘆'=>'蘆','虜'=>'虜','路'=>'路','露'=>'露','魯'=>'魯','鷺'=>'鷺','碌'=>'碌','祿'=>'祿','綠'=>'綠','菉'=>'菉','錄'=>'錄','鹿'=>'鹿','論'=>'論','壟'=>'壟','弄'=>'弄','籠'=>'籠','聾'=>'聾','牢'=>'牢','磊'=>'磊','賂'=>'賂','雷'=>'雷','壘'=>'壘','屢'=>'屢','樓'=>'樓','淚'=>'淚','漏'=>'漏','累'=>'累','縷'=>'縷','陋'=>'陋','勒'=>'勒','肋'=>'肋','凜'=>'凜','凌'=>'凌','稜'=>'稜','綾'=>'綾','菱'=>'菱','陵'=>'陵','讀'=>'讀','拏'=>'拏','樂'=>'樂','諾'=>'諾','丹'=>'丹','寧'=>'寧','怒'=>'怒','率'=>'率','異'=>'異','北'=>'北','磻'=>'磻','便'=>'便','復'=>'復','不'=>'不','泌'=>'泌','數'=>'數','索'=>'索','參'=>'參','塞'=>'塞','省'=>'省','葉'=>'葉','說'=>'說','殺'=>'殺','辰'=>'辰','沈'=>'沈','拾'=>'拾','若'=>'若','掠'=>'掠','略'=>'略','亮'=>'亮','兩'=>'兩','凉'=>'凉','梁'=>'梁','糧'=>'糧','良'=>'良','諒'=>'諒','量'=>'量','勵'=>'勵','呂'=>'呂','女'=>'女','廬'=>'廬','旅'=>'旅','濾'=>'濾','礪'=>'礪','閭'=>'閭','驪'=>'驪','麗'=>'麗','黎'=>'黎','力'=>'力','曆'=>'曆','歷'=>'歷','轢'=>'轢','年'=>'年','憐'=>'憐','戀'=>'戀','撚'=>'撚','漣'=>'漣','煉'=>'煉','璉'=>'璉','秊'=>'秊','練'=>'練','聯'=>'聯','輦'=>'輦','蓮'=>'蓮','連'=>'連','鍊'=>'鍊','列'=>'列','劣'=>'劣','咽'=>'咽','烈'=>'烈','裂'=>'裂','說'=>'說','廉'=>'廉','念'=>'念','捻'=>'捻','殮'=>'殮','簾'=>'簾','獵'=>'獵','令'=>'令','囹'=>'囹','寧'=>'寧','嶺'=>'嶺','怜'=>'怜','玲'=>'玲','瑩'=>'瑩','羚'=>'羚','聆'=>'聆','鈴'=>'鈴','零'=>'零','靈'=>'靈','領'=>'領','例'=>'例','禮'=>'禮','醴'=>'醴','隸'=>'隸','惡'=>'惡','了'=>'了','僚'=>'僚','寮'=>'寮','尿'=>'尿','料'=>'料','樂'=>'樂','燎'=>'燎','療'=>'療','蓼'=>'蓼','遼'=>'遼','龍'=>'龍','暈'=>'暈','阮'=>'阮','劉'=>'劉','杻'=>'杻','柳'=>'柳','流'=>'流','溜'=>'溜','琉'=>'琉','留'=>'留','硫'=>'硫','紐'=>'紐','類'=>'類','六'=>'六','戮'=>'戮','陸'=>'陸','倫'=>'倫','崙'=>'崙','淪'=>'淪','輪'=>'輪','律'=>'律','慄'=>'慄','栗'=>'栗','率'=>'率','隆'=>'隆','利'=>'利','吏'=>'吏','履'=>'履','易'=>'易','李'=>'李','梨'=>'梨','泥'=>'泥','理'=>'理','痢'=>'痢','罹'=>'罹','裏'=>'裏','裡'=>'裡','里'=>'里','離'=>'離','匿'=>'匿','溺'=>'溺','吝'=>'吝','燐'=>'燐','璘'=>'璘','藺'=>'藺','隣'=>'隣','鱗'=>'鱗','麟'=>'麟','林'=>'林','淋'=>'淋','臨'=>'臨','立'=>'立','笠'=>'笠','粒'=>'粒','狀'=>'狀','炙'=>'炙','識'=>'識','什'=>'什','茶'=>'茶','刺'=>'刺','切'=>'切','度'=>'度','拓'=>'拓','糖'=>'糖','宅'=>'宅','洞'=>'洞','暴'=>'暴','輻'=>'輻','行'=>'行','降'=>'降','見'=>'見','廓'=>'廓','兀'=>'兀','嗀'=>'嗀','塚'=>'塚','晴'=>'晴','凞'=>'凞','猪'=>'猪','益'=>'益','礼'=>'礼','神'=>'神','祥'=>'祥','福'=>'福','靖'=>'靖','精'=>'精','羽'=>'羽','蘒'=>'蘒','諸'=>'諸','逸'=>'逸','都'=>'都','飯'=>'飯','飼'=>'飼','館'=>'館','鶴'=>'鶴','侮'=>'侮','僧'=>'僧','免'=>'免','勉'=>'勉','勤'=>'勤','卑'=>'卑','喝'=>'喝','嘆'=>'嘆','器'=>'器','塀'=>'塀','墨'=>'墨','層'=>'層','屮'=>'屮','悔'=>'悔','慨'=>'慨','憎'=>'憎','懲'=>'懲','敏'=>'敏','既'=>'既','暑'=>'暑','梅'=>'梅','海'=>'海','渚'=>'渚','漢'=>'漢','煮'=>'煮','爫'=>'爫','琢'=>'琢','碑'=>'碑','社'=>'社','祉'=>'祉','祈'=>'祈','祐'=>'祐','祖'=>'祖','祝'=>'祝','禍'=>'禍','禎'=>'禎','穀'=>'穀','突'=>'突','節'=>'節','練'=>'練','縉'=>'縉','繁'=>'繁','署'=>'署','者'=>'者','臭'=>'臭','艹'=>'艹','艹'=>'艹','著'=>'著','褐'=>'褐','視'=>'視','謁'=>'謁','謹'=>'謹','賓'=>'賓','贈'=>'贈','辶'=>'辶','逸'=>'逸','難'=>'難','響'=>'響','頻'=>'頻','並'=>'並','况'=>'况','全'=>'全','侀'=>'侀','充'=>'充','冀'=>'冀','勇'=>'勇','勺'=>'勺','喝'=>'喝','啕'=>'啕','喙'=>'喙','嗢'=>'嗢','塚'=>'塚','墳'=>'墳','奄'=>'奄','奔'=>'奔','婢'=>'婢','嬨'=>'嬨','廒'=>'廒','廙'=>'廙','彩'=>'彩','徭'=>'徭','惘'=>'惘','慎'=>'慎','愈'=>'愈','憎'=>'憎','慠'=>'慠','懲'=>'懲','戴'=>'戴','揄'=>'揄','搜'=>'搜','摒'=>'摒','敖'=>'敖','晴'=>'晴','朗'=>'朗','望'=>'望','杖'=>'杖','歹'=>'歹','殺'=>'殺','流'=>'流','滛'=>'滛','滋'=>'滋','漢'=>'漢','瀞'=>'瀞','煮'=>'煮','瞧'=>'瞧','爵'=>'爵','犯'=>'犯','猪'=>'猪','瑱'=>'瑱','甆'=>'甆','画'=>'画','瘝'=>'瘝','瘟'=>'瘟','益'=>'益','盛'=>'盛','直'=>'直','睊'=>'睊','着'=>'着','磌'=>'磌','窱'=>'窱','節'=>'節','类'=>'类','絛'=>'絛','練'=>'練','缾'=>'缾','者'=>'者','荒'=>'荒','華'=>'華','蝹'=>'蝹','襁'=>'襁','覆'=>'覆','視'=>'視','調'=>'調','諸'=>'諸','請'=>'請','謁'=>'謁','諾'=>'諾','諭'=>'諭','謹'=>'謹','變'=>'變','贈'=>'贈','輸'=>'輸','遲'=>'遲','醙'=>'醙','鉶'=>'鉶','陼'=>'陼','難'=>'難','靖'=>'靖','韛'=>'韛','響'=>'響','頋'=>'頋','頻'=>'頻','鬒'=>'鬒','龜'=>'龜','𢡊'=>'𢡊','𢡄'=>'𢡄','𣏕'=>'𣏕','㮝'=>'㮝','䀘'=>'䀘','䀹'=>'䀹','𥉉'=>'𥉉','𥳐'=>'𥳐','𧻓'=>'𧻓','齃'=>'齃','龎'=>'龎','ff'=>'ff','fi'=>'fi','fl'=>'fl','ffi'=>'ffi','ffl'=>'ffl','ſt'=>'st','st'=>'st','ﬓ'=>'մն','ﬔ'=>'մե','ﬕ'=>'մի','ﬖ'=>'վն','ﬗ'=>'մխ','יִ'=>'יִ','ײַ'=>'ײַ','ﬠ'=>'ע','ﬡ'=>'א','ﬢ'=>'ד','ﬣ'=>'ה','ﬤ'=>'כ','ﬥ'=>'ל','ﬦ'=>'ם','ﬧ'=>'ר','ﬨ'=>'ת','﬩'=>'+','שׁ'=>'שׁ','שׂ'=>'שׂ','שּׁ'=>'שּׁ','שּׂ'=>'שּׂ','אַ'=>'אַ','אָ'=>'אָ','אּ'=>'אּ','בּ'=>'בּ','גּ'=>'גּ','דּ'=>'דּ','הּ'=>'הּ','וּ'=>'וּ','זּ'=>'זּ','טּ'=>'טּ','יּ'=>'יּ','ךּ'=>'ךּ','כּ'=>'כּ','לּ'=>'לּ','מּ'=>'מּ','נּ'=>'נּ','סּ'=>'סּ','ףּ'=>'ףּ','פּ'=>'פּ','צּ'=>'צּ','קּ'=>'קּ','רּ'=>'רּ','שּ'=>'שּ','תּ'=>'תּ','וֹ'=>'וֹ','בֿ'=>'בֿ','כֿ'=>'כֿ','פֿ'=>'פֿ','ﭏ'=>'אל','ﭐ'=>'ٱ','ﭑ'=>'ٱ','ﭒ'=>'ٻ','ﭓ'=>'ٻ','ﭔ'=>'ٻ','ﭕ'=>'ٻ','ﭖ'=>'پ','ﭗ'=>'پ','ﭘ'=>'پ','ﭙ'=>'پ','ﭚ'=>'ڀ','ﭛ'=>'ڀ','ﭜ'=>'ڀ','ﭝ'=>'ڀ','ﭞ'=>'ٺ','ﭟ'=>'ٺ','ﭠ'=>'ٺ','ﭡ'=>'ٺ','ﭢ'=>'ٿ','ﭣ'=>'ٿ','ﭤ'=>'ٿ','ﭥ'=>'ٿ','ﭦ'=>'ٹ','ﭧ'=>'ٹ','ﭨ'=>'ٹ','ﭩ'=>'ٹ','ﭪ'=>'ڤ','ﭫ'=>'ڤ','ﭬ'=>'ڤ','ﭭ'=>'ڤ','ﭮ'=>'ڦ','ﭯ'=>'ڦ','ﭰ'=>'ڦ','ﭱ'=>'ڦ','ﭲ'=>'ڄ','ﭳ'=>'ڄ','ﭴ'=>'ڄ','ﭵ'=>'ڄ','ﭶ'=>'ڃ','ﭷ'=>'ڃ','ﭸ'=>'ڃ','ﭹ'=>'ڃ','ﭺ'=>'چ','ﭻ'=>'چ','ﭼ'=>'چ','ﭽ'=>'چ','ﭾ'=>'ڇ','ﭿ'=>'ڇ','ﮀ'=>'ڇ','ﮁ'=>'ڇ','ﮂ'=>'ڍ','ﮃ'=>'ڍ','ﮄ'=>'ڌ','ﮅ'=>'ڌ','ﮆ'=>'ڎ','ﮇ'=>'ڎ','ﮈ'=>'ڈ','ﮉ'=>'ڈ','ﮊ'=>'ژ','ﮋ'=>'ژ','ﮌ'=>'ڑ','ﮍ'=>'ڑ','ﮎ'=>'ک','ﮏ'=>'ک','ﮐ'=>'ک','ﮑ'=>'ک','ﮒ'=>'گ','ﮓ'=>'گ','ﮔ'=>'گ','ﮕ'=>'گ','ﮖ'=>'ڳ','ﮗ'=>'ڳ','ﮘ'=>'ڳ','ﮙ'=>'ڳ','ﮚ'=>'ڱ','ﮛ'=>'ڱ','ﮜ'=>'ڱ','ﮝ'=>'ڱ','ﮞ'=>'ں','ﮟ'=>'ں','ﮠ'=>'ڻ','ﮡ'=>'ڻ','ﮢ'=>'ڻ','ﮣ'=>'ڻ','ﮤ'=>'ۀ','ﮥ'=>'ۀ','ﮦ'=>'ہ','ﮧ'=>'ہ','ﮨ'=>'ہ','ﮩ'=>'ہ','ﮪ'=>'ھ','ﮫ'=>'ھ','ﮬ'=>'ھ','ﮭ'=>'ھ','ﮮ'=>'ے','ﮯ'=>'ے','ﮰ'=>'ۓ','ﮱ'=>'ۓ','ﯓ'=>'ڭ','ﯔ'=>'ڭ','ﯕ'=>'ڭ','ﯖ'=>'ڭ','ﯗ'=>'ۇ','ﯘ'=>'ۇ','ﯙ'=>'ۆ','ﯚ'=>'ۆ','ﯛ'=>'ۈ','ﯜ'=>'ۈ','ﯝ'=>'ۇٴ','ﯞ'=>'ۋ','ﯟ'=>'ۋ','ﯠ'=>'ۅ','ﯡ'=>'ۅ','ﯢ'=>'ۉ','ﯣ'=>'ۉ','ﯤ'=>'ې','ﯥ'=>'ې','ﯦ'=>'ې','ﯧ'=>'ې','ﯨ'=>'ى','ﯩ'=>'ى','ﯪ'=>'ئا','ﯫ'=>'ئا','ﯬ'=>'ئە','ﯭ'=>'ئە','ﯮ'=>'ئو','ﯯ'=>'ئو','ﯰ'=>'ئۇ','ﯱ'=>'ئۇ','ﯲ'=>'ئۆ','ﯳ'=>'ئۆ','ﯴ'=>'ئۈ','ﯵ'=>'ئۈ','ﯶ'=>'ئې','ﯷ'=>'ئې','ﯸ'=>'ئې','ﯹ'=>'ئى','ﯺ'=>'ئى','ﯻ'=>'ئى','ﯼ'=>'ی','ﯽ'=>'ی','ﯾ'=>'ی','ﯿ'=>'ی','ﰀ'=>'ئج','ﰁ'=>'ئح','ﰂ'=>'ئم','ﰃ'=>'ئى','ﰄ'=>'ئي','ﰅ'=>'بج','ﰆ'=>'بح','ﰇ'=>'بخ','ﰈ'=>'بم','ﰉ'=>'بى','ﰊ'=>'بي','ﰋ'=>'تج','ﰌ'=>'تح','ﰍ'=>'تخ','ﰎ'=>'تم','ﰏ'=>'تى','ﰐ'=>'تي','ﰑ'=>'ثج','ﰒ'=>'ثم','ﰓ'=>'ثى','ﰔ'=>'ثي','ﰕ'=>'جح','ﰖ'=>'جم','ﰗ'=>'حج','ﰘ'=>'حم','ﰙ'=>'خج','ﰚ'=>'خح','ﰛ'=>'خم','ﰜ'=>'سج','ﰝ'=>'سح','ﰞ'=>'سخ','ﰟ'=>'سم','ﰠ'=>'صح','ﰡ'=>'صم','ﰢ'=>'ضج','ﰣ'=>'ضح','ﰤ'=>'ضخ','ﰥ'=>'ضم','ﰦ'=>'طح','ﰧ'=>'طم','ﰨ'=>'ظم','ﰩ'=>'عج','ﰪ'=>'عم','ﰫ'=>'غج','ﰬ'=>'غم','ﰭ'=>'فج','ﰮ'=>'فح','ﰯ'=>'فخ','ﰰ'=>'فم','ﰱ'=>'فى','ﰲ'=>'في','ﰳ'=>'قح','ﰴ'=>'قم','ﰵ'=>'قى','ﰶ'=>'قي','ﰷ'=>'كا','ﰸ'=>'كج','ﰹ'=>'كح','ﰺ'=>'كخ','ﰻ'=>'كل','ﰼ'=>'كم','ﰽ'=>'كى','ﰾ'=>'كي','ﰿ'=>'لج','ﱀ'=>'لح','ﱁ'=>'لخ','ﱂ'=>'لم','ﱃ'=>'لى','ﱄ'=>'لي','ﱅ'=>'مج','ﱆ'=>'مح','ﱇ'=>'مخ','ﱈ'=>'مم','ﱉ'=>'مى','ﱊ'=>'مي','ﱋ'=>'نج','ﱌ'=>'نح','ﱍ'=>'نخ','ﱎ'=>'نم','ﱏ'=>'نى','ﱐ'=>'ني','ﱑ'=>'هج','ﱒ'=>'هم','ﱓ'=>'هى','ﱔ'=>'هي','ﱕ'=>'يج','ﱖ'=>'يح','ﱗ'=>'يخ','ﱘ'=>'يم','ﱙ'=>'يى','ﱚ'=>'يي','ﱛ'=>'ذٰ','ﱜ'=>'رٰ','ﱝ'=>'ىٰ','ﱞ'=>' ٌّ','ﱟ'=>' ٍّ','ﱠ'=>' َّ','ﱡ'=>' ُّ','ﱢ'=>' ِّ','ﱣ'=>' ّٰ','ﱤ'=>'ئر','ﱥ'=>'ئز','ﱦ'=>'ئم','ﱧ'=>'ئن','ﱨ'=>'ئى','ﱩ'=>'ئي','ﱪ'=>'بر','ﱫ'=>'بز','ﱬ'=>'بم','ﱭ'=>'بن','ﱮ'=>'بى','ﱯ'=>'بي','ﱰ'=>'تر','ﱱ'=>'تز','ﱲ'=>'تم','ﱳ'=>'تن','ﱴ'=>'تى','ﱵ'=>'تي','ﱶ'=>'ثر','ﱷ'=>'ثز','ﱸ'=>'ثم','ﱹ'=>'ثن','ﱺ'=>'ثى','ﱻ'=>'ثي','ﱼ'=>'فى','ﱽ'=>'في','ﱾ'=>'قى','ﱿ'=>'قي','ﲀ'=>'كا','ﲁ'=>'كل','ﲂ'=>'كم','ﲃ'=>'كى','ﲄ'=>'كي','ﲅ'=>'لم','ﲆ'=>'لى','ﲇ'=>'لي','ﲈ'=>'ما','ﲉ'=>'مم','ﲊ'=>'نر','ﲋ'=>'نز','ﲌ'=>'نم','ﲍ'=>'نن','ﲎ'=>'نى','ﲏ'=>'ني','ﲐ'=>'ىٰ','ﲑ'=>'ير','ﲒ'=>'يز','ﲓ'=>'يم','ﲔ'=>'ين','ﲕ'=>'يى','ﲖ'=>'يي','ﲗ'=>'ئج','ﲘ'=>'ئح','ﲙ'=>'ئخ','ﲚ'=>'ئم','ﲛ'=>'ئه','ﲜ'=>'بج','ﲝ'=>'بح','ﲞ'=>'بخ','ﲟ'=>'بم','ﲠ'=>'به','ﲡ'=>'تج','ﲢ'=>'تح','ﲣ'=>'تخ','ﲤ'=>'تم','ﲥ'=>'ته','ﲦ'=>'ثم','ﲧ'=>'جح','ﲨ'=>'جم','ﲩ'=>'حج','ﲪ'=>'حم','ﲫ'=>'خج','ﲬ'=>'خم','ﲭ'=>'سج','ﲮ'=>'سح','ﲯ'=>'سخ','ﲰ'=>'سم','ﲱ'=>'صح','ﲲ'=>'صخ','ﲳ'=>'صم','ﲴ'=>'ضج','ﲵ'=>'ضح','ﲶ'=>'ضخ','ﲷ'=>'ضم','ﲸ'=>'طح','ﲹ'=>'ظم','ﲺ'=>'عج','ﲻ'=>'عم','ﲼ'=>'غج','ﲽ'=>'غم','ﲾ'=>'فج','ﲿ'=>'فح','ﳀ'=>'فخ','ﳁ'=>'فم','ﳂ'=>'قح','ﳃ'=>'قم','ﳄ'=>'كج','ﳅ'=>'كح','ﳆ'=>'كخ','ﳇ'=>'كل','ﳈ'=>'كم','ﳉ'=>'لج','ﳊ'=>'لح','ﳋ'=>'لخ','ﳌ'=>'لم','ﳍ'=>'له','ﳎ'=>'مج','ﳏ'=>'مح','ﳐ'=>'مخ','ﳑ'=>'مم','ﳒ'=>'نج','ﳓ'=>'نح','ﳔ'=>'نخ','ﳕ'=>'نم','ﳖ'=>'نه','ﳗ'=>'هج','ﳘ'=>'هم','ﳙ'=>'هٰ','ﳚ'=>'يج','ﳛ'=>'يح','ﳜ'=>'يخ','ﳝ'=>'يم','ﳞ'=>'يه','ﳟ'=>'ئم','ﳠ'=>'ئه','ﳡ'=>'بم','ﳢ'=>'به','ﳣ'=>'تم','ﳤ'=>'ته','ﳥ'=>'ثم','ﳦ'=>'ثه','ﳧ'=>'سم','ﳨ'=>'سه','ﳩ'=>'شم','ﳪ'=>'شه','ﳫ'=>'كل','ﳬ'=>'كم','ﳭ'=>'لم','ﳮ'=>'نم','ﳯ'=>'نه','ﳰ'=>'يم','ﳱ'=>'يه','ﳲ'=>'ـَّ','ﳳ'=>'ـُّ','ﳴ'=>'ـِّ','ﳵ'=>'طى','ﳶ'=>'طي','ﳷ'=>'عى','ﳸ'=>'عي','ﳹ'=>'غى','ﳺ'=>'غي','ﳻ'=>'سى','ﳼ'=>'سي','ﳽ'=>'شى','ﳾ'=>'شي','ﳿ'=>'حى','ﴀ'=>'حي','ﴁ'=>'جى','ﴂ'=>'جي','ﴃ'=>'خى','ﴄ'=>'خي','ﴅ'=>'صى','ﴆ'=>'صي','ﴇ'=>'ضى','ﴈ'=>'ضي','ﴉ'=>'شج','ﴊ'=>'شح','ﴋ'=>'شخ','ﴌ'=>'شم','ﴍ'=>'شر','ﴎ'=>'سر','ﴏ'=>'صر','ﴐ'=>'ضر','ﴑ'=>'طى','ﴒ'=>'طي','ﴓ'=>'عى','ﴔ'=>'عي','ﴕ'=>'غى','ﴖ'=>'غي','ﴗ'=>'سى','ﴘ'=>'سي','ﴙ'=>'شى','ﴚ'=>'شي','ﴛ'=>'حى','ﴜ'=>'حي','ﴝ'=>'جى','ﴞ'=>'جي','ﴟ'=>'خى','ﴠ'=>'خي','ﴡ'=>'صى','ﴢ'=>'صي','ﴣ'=>'ضى','ﴤ'=>'ضي','ﴥ'=>'شج','ﴦ'=>'شح','ﴧ'=>'شخ','ﴨ'=>'شم','ﴩ'=>'شر','ﴪ'=>'سر','ﴫ'=>'صر','ﴬ'=>'ضر','ﴭ'=>'شج','ﴮ'=>'شح','ﴯ'=>'شخ','ﴰ'=>'شم','ﴱ'=>'سه','ﴲ'=>'شه','ﴳ'=>'طم','ﴴ'=>'سج','ﴵ'=>'سح','ﴶ'=>'سخ','ﴷ'=>'شج','ﴸ'=>'شح','ﴹ'=>'شخ','ﴺ'=>'طم','ﴻ'=>'ظم','ﴼ'=>'اً','ﴽ'=>'اً','ﵐ'=>'تجم','ﵑ'=>'تحج','ﵒ'=>'تحج','ﵓ'=>'تحم','ﵔ'=>'تخم','ﵕ'=>'تمج','ﵖ'=>'تمح','ﵗ'=>'تمخ','ﵘ'=>'جمح','ﵙ'=>'جمح','ﵚ'=>'حمي','ﵛ'=>'حمى','ﵜ'=>'سحج','ﵝ'=>'سجح','ﵞ'=>'سجى','ﵟ'=>'سمح','ﵠ'=>'سمح','ﵡ'=>'سمج','ﵢ'=>'سمم','ﵣ'=>'سمم','ﵤ'=>'صحح','ﵥ'=>'صحح','ﵦ'=>'صمم','ﵧ'=>'شحم','ﵨ'=>'شحم','ﵩ'=>'شجي','ﵪ'=>'شمخ','ﵫ'=>'شمخ','ﵬ'=>'شمم','ﵭ'=>'شمم','ﵮ'=>'ضحى','ﵯ'=>'ضخم','ﵰ'=>'ضخم','ﵱ'=>'طمح','ﵲ'=>'طمح','ﵳ'=>'طمم','ﵴ'=>'طمي','ﵵ'=>'عجم','ﵶ'=>'عمم','ﵷ'=>'عمم','ﵸ'=>'عمى','ﵹ'=>'غمم','ﵺ'=>'غمي','ﵻ'=>'غمى','ﵼ'=>'فخم','ﵽ'=>'فخم','ﵾ'=>'قمح','ﵿ'=>'قمم','ﶀ'=>'لحم','ﶁ'=>'لحي','ﶂ'=>'لحى','ﶃ'=>'لجج','ﶄ'=>'لجج','ﶅ'=>'لخم','ﶆ'=>'لخم','ﶇ'=>'لمح','ﶈ'=>'لمح','ﶉ'=>'محج','ﶊ'=>'محم','ﶋ'=>'محي','ﶌ'=>'مجح','ﶍ'=>'مجم','ﶎ'=>'مخج','ﶏ'=>'مخم','ﶒ'=>'مجخ','ﶓ'=>'همج','ﶔ'=>'همم','ﶕ'=>'نحم','ﶖ'=>'نحى','ﶗ'=>'نجم','ﶘ'=>'نجم','ﶙ'=>'نجى','ﶚ'=>'نمي','ﶛ'=>'نمى','ﶜ'=>'يمم','ﶝ'=>'يمم','ﶞ'=>'بخي','ﶟ'=>'تجي','ﶠ'=>'تجى','ﶡ'=>'تخي','ﶢ'=>'تخى','ﶣ'=>'تمي','ﶤ'=>'تمى','ﶥ'=>'جمي','ﶦ'=>'جحى','ﶧ'=>'جمى','ﶨ'=>'سخى','ﶩ'=>'صحي','ﶪ'=>'شحي','ﶫ'=>'ضحي','ﶬ'=>'لجي','ﶭ'=>'لمي','ﶮ'=>'يحي','ﶯ'=>'يجي','ﶰ'=>'يمي','ﶱ'=>'ممي','ﶲ'=>'قمي','ﶳ'=>'نحي','ﶴ'=>'قمح','ﶵ'=>'لحم','ﶶ'=>'عمي','ﶷ'=>'كمي','ﶸ'=>'نجح','ﶹ'=>'مخي','ﶺ'=>'لجم','ﶻ'=>'كمم','ﶼ'=>'لجم','ﶽ'=>'نجح','ﶾ'=>'جحي','ﶿ'=>'حجي','ﷀ'=>'مجي','ﷁ'=>'فمي','ﷂ'=>'بحي','ﷃ'=>'كمم','ﷄ'=>'عجم','ﷅ'=>'صمم','ﷆ'=>'سخي','ﷇ'=>'نجي','ﷰ'=>'صلے','ﷱ'=>'قلے','ﷲ'=>'الله','ﷳ'=>'اكبر','ﷴ'=>'محمد','ﷵ'=>'صلعم','ﷶ'=>'رسول','ﷷ'=>'عليه','ﷸ'=>'وسلم','ﷹ'=>'صلى','ﷺ'=>'صلى الله عليه وسلم','ﷻ'=>'جل جلاله','﷼'=>'ریال','︐'=>',','︑'=>'、','︒'=>'。','︓'=>':','︔'=>';','︕'=>'!','︖'=>'?','︗'=>'〖','︘'=>'〗','︙'=>'...','︰'=>'..','︱'=>'—','︲'=>'–','︳'=>'_','︴'=>'_','︵'=>'(','︶'=>')','︷'=>'{','︸'=>'}','︹'=>'〔','︺'=>'〕','︻'=>'【','︼'=>'】','︽'=>'《','︾'=>'》','︿'=>'〈','﹀'=>'〉','﹁'=>'「','﹂'=>'」','﹃'=>'『','﹄'=>'』','﹇'=>'[','﹈'=>']','﹉'=>' ̅','﹊'=>' ̅','﹋'=>' ̅','﹌'=>' ̅','﹍'=>'_','﹎'=>'_','﹏'=>'_','﹐'=>',','﹑'=>'、','﹒'=>'.','﹔'=>';','﹕'=>':','﹖'=>'?','﹗'=>'!','﹘'=>'—','﹙'=>'(','﹚'=>')','﹛'=>'{','﹜'=>'}','﹝'=>'〔','﹞'=>'〕','﹟'=>'#','﹠'=>'&','﹡'=>'*','﹢'=>'+','﹣'=>'-','﹤'=>'<','﹥'=>'>','﹦'=>'=','﹨'=>'\\','﹩'=>'$','﹪'=>'%','﹫'=>'@','ﹰ'=>' ً','ﹱ'=>'ـً','ﹲ'=>' ٌ','ﹴ'=>' ٍ','ﹶ'=>' َ','ﹷ'=>'ـَ','ﹸ'=>' ُ','ﹹ'=>'ـُ','ﹺ'=>' ِ','ﹻ'=>'ـِ','ﹼ'=>' ّ','ﹽ'=>'ـّ','ﹾ'=>' ْ','ﹿ'=>'ـْ','ﺀ'=>'ء','ﺁ'=>'آ','ﺂ'=>'آ','ﺃ'=>'أ','ﺄ'=>'أ','ﺅ'=>'ؤ','ﺆ'=>'ؤ','ﺇ'=>'إ','ﺈ'=>'إ','ﺉ'=>'ئ','ﺊ'=>'ئ','ﺋ'=>'ئ','ﺌ'=>'ئ','ﺍ'=>'ا','ﺎ'=>'ا','ﺏ'=>'ب','ﺐ'=>'ب','ﺑ'=>'ب','ﺒ'=>'ب','ﺓ'=>'ة','ﺔ'=>'ة','ﺕ'=>'ت','ﺖ'=>'ت','ﺗ'=>'ت','ﺘ'=>'ت','ﺙ'=>'ث','ﺚ'=>'ث','ﺛ'=>'ث','ﺜ'=>'ث','ﺝ'=>'ج','ﺞ'=>'ج','ﺟ'=>'ج','ﺠ'=>'ج','ﺡ'=>'ح','ﺢ'=>'ح','ﺣ'=>'ح','ﺤ'=>'ح','ﺥ'=>'خ','ﺦ'=>'خ','ﺧ'=>'خ','ﺨ'=>'خ','ﺩ'=>'د','ﺪ'=>'د','ﺫ'=>'ذ','ﺬ'=>'ذ','ﺭ'=>'ر','ﺮ'=>'ر','ﺯ'=>'ز','ﺰ'=>'ز','ﺱ'=>'س','ﺲ'=>'س','ﺳ'=>'س','ﺴ'=>'س','ﺵ'=>'ش','ﺶ'=>'ش','ﺷ'=>'ش','ﺸ'=>'ش','ﺹ'=>'ص','ﺺ'=>'ص','ﺻ'=>'ص','ﺼ'=>'ص','ﺽ'=>'ض','ﺾ'=>'ض','ﺿ'=>'ض','ﻀ'=>'ض','ﻁ'=>'ط','ﻂ'=>'ط','ﻃ'=>'ط','ﻄ'=>'ط','ﻅ'=>'ظ','ﻆ'=>'ظ','ﻇ'=>'ظ','ﻈ'=>'ظ','ﻉ'=>'ع','ﻊ'=>'ع','ﻋ'=>'ع','ﻌ'=>'ع','ﻍ'=>'غ','ﻎ'=>'غ','ﻏ'=>'غ','ﻐ'=>'غ','ﻑ'=>'ف','ﻒ'=>'ف','ﻓ'=>'ف','ﻔ'=>'ف','ﻕ'=>'ق','ﻖ'=>'ق','ﻗ'=>'ق','ﻘ'=>'ق','ﻙ'=>'ك','ﻚ'=>'ك','ﻛ'=>'ك','ﻜ'=>'ك','ﻝ'=>'ل','ﻞ'=>'ل','ﻟ'=>'ل','ﻠ'=>'ل','ﻡ'=>'م','ﻢ'=>'م','ﻣ'=>'م','ﻤ'=>'م','ﻥ'=>'ن','ﻦ'=>'ن','ﻧ'=>'ن','ﻨ'=>'ن','ﻩ'=>'ه','ﻪ'=>'ه','ﻫ'=>'ه','ﻬ'=>'ه','ﻭ'=>'و','ﻮ'=>'و','ﻯ'=>'ى','ﻰ'=>'ى','ﻱ'=>'ي','ﻲ'=>'ي','ﻳ'=>'ي','ﻴ'=>'ي','ﻵ'=>'لآ','ﻶ'=>'لآ','ﻷ'=>'لأ','ﻸ'=>'لأ','ﻹ'=>'لإ','ﻺ'=>'لإ','ﻻ'=>'لا','ﻼ'=>'لا','!'=>'!','"'=>'"','#'=>'#','$'=>'$','%'=>'%','&'=>'&','''=>'\'','('=>'(',')'=>')','*'=>'*','+'=>'+',','=>',','-'=>'-','.'=>'.','/'=>'/','0'=>'0','1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9',':'=>':',';'=>';','<'=>'<','='=>'=','>'=>'>','?'=>'?','@'=>'@','A'=>'A','B'=>'B','C'=>'C','D'=>'D','E'=>'E','F'=>'F','G'=>'G','H'=>'H','I'=>'I','J'=>'J','K'=>'K','L'=>'L','M'=>'M','N'=>'N','O'=>'O','P'=>'P','Q'=>'Q','R'=>'R','S'=>'S','T'=>'T','U'=>'U','V'=>'V','W'=>'W','X'=>'X','Y'=>'Y','Z'=>'Z','['=>'[','\'=>'\\',']'=>']','^'=>'^','_'=>'_','`'=>'`','a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e','f'=>'f','g'=>'g','h'=>'h','i'=>'i','j'=>'j','k'=>'k','l'=>'l','m'=>'m','n'=>'n','o'=>'o','p'=>'p','q'=>'q','r'=>'r','s'=>'s','t'=>'t','u'=>'u','v'=>'v','w'=>'w','x'=>'x','y'=>'y','z'=>'z','{'=>'{','|'=>'|','}'=>'}','~'=>'~','⦅'=>'⦅','⦆'=>'⦆','。'=>'。','「'=>'「','」'=>'」','、'=>'、','・'=>'・','ヲ'=>'ヲ','ァ'=>'ァ','ィ'=>'ィ','ゥ'=>'ゥ','ェ'=>'ェ','ォ'=>'ォ','ャ'=>'ャ','ュ'=>'ュ','ョ'=>'ョ','ッ'=>'ッ','ー'=>'ー','ア'=>'ア','イ'=>'イ','ウ'=>'ウ','エ'=>'エ','オ'=>'オ','カ'=>'カ','キ'=>'キ','ク'=>'ク','ケ'=>'ケ','コ'=>'コ','サ'=>'サ','シ'=>'シ','ス'=>'ス','セ'=>'セ','ソ'=>'ソ','タ'=>'タ','チ'=>'チ','ツ'=>'ツ','テ'=>'テ','ト'=>'ト','ナ'=>'ナ','ニ'=>'ニ','ヌ'=>'ヌ','ネ'=>'ネ','ノ'=>'ノ','ハ'=>'ハ','ヒ'=>'ヒ','フ'=>'フ','ヘ'=>'ヘ','ホ'=>'ホ','マ'=>'マ','ミ'=>'ミ','ム'=>'ム','メ'=>'メ','モ'=>'モ','ヤ'=>'ヤ','ユ'=>'ユ','ヨ'=>'ヨ','ラ'=>'ラ','リ'=>'リ','ル'=>'ル','レ'=>'レ','ロ'=>'ロ','ワ'=>'ワ','ン'=>'ン','゙'=>'゙','゚'=>'゚','ᅠ'=>'ᅠ','ᄀ'=>'ᄀ','ᄁ'=>'ᄁ','ᆪ'=>'ᆪ','ᄂ'=>'ᄂ','ᆬ'=>'ᆬ','ᆭ'=>'ᆭ','ᄃ'=>'ᄃ','ᄄ'=>'ᄄ','ᄅ'=>'ᄅ','ᆰ'=>'ᆰ','ᆱ'=>'ᆱ','ᆲ'=>'ᆲ','ᆳ'=>'ᆳ','ᆴ'=>'ᆴ','ᆵ'=>'ᆵ','ᄚ'=>'ᄚ','ᄆ'=>'ᄆ','ᄇ'=>'ᄇ','ᄈ'=>'ᄈ','ᄡ'=>'ᄡ','ᄉ'=>'ᄉ','ᄊ'=>'ᄊ','ᄋ'=>'ᄋ','ᄌ'=>'ᄌ','ᄍ'=>'ᄍ','ᄎ'=>'ᄎ','ᄏ'=>'ᄏ','ᄐ'=>'ᄐ','ᄑ'=>'ᄑ','ᄒ'=>'ᄒ','ᅡ'=>'ᅡ','ᅢ'=>'ᅢ','ᅣ'=>'ᅣ','ᅤ'=>'ᅤ','ᅥ'=>'ᅥ','ᅦ'=>'ᅦ','ᅧ'=>'ᅧ','ᅨ'=>'ᅨ','ᅩ'=>'ᅩ','ᅪ'=>'ᅪ','ᅫ'=>'ᅫ','ᅬ'=>'ᅬ','ᅭ'=>'ᅭ','ᅮ'=>'ᅮ','ᅯ'=>'ᅯ','ᅰ'=>'ᅰ','ᅱ'=>'ᅱ','ᅲ'=>'ᅲ','ᅳ'=>'ᅳ','ᅴ'=>'ᅴ','ᅵ'=>'ᅵ','¢'=>'¢','£'=>'£','¬'=>'¬',' ̄'=>' ̄','¦'=>'¦','¥'=>'¥','₩'=>'₩','│'=>'│','←'=>'←','↑'=>'↑','→'=>'→','↓'=>'↓','■'=>'■','○'=>'○','𝅗𝅥'=>'𝅗𝅥','𝅘𝅥'=>'𝅘𝅥','𝅘𝅥𝅮'=>'𝅘𝅥𝅮','𝅘𝅥𝅯'=>'𝅘𝅥𝅯','𝅘𝅥𝅰'=>'𝅘𝅥𝅰','𝅘𝅥𝅱'=>'𝅘𝅥𝅱','𝅘𝅥𝅲'=>'𝅘𝅥𝅲','𝆹𝅥'=>'𝆹𝅥','𝆺𝅥'=>'𝆺𝅥','𝆹𝅥𝅮'=>'𝆹𝅥𝅮','𝆺𝅥𝅮'=>'𝆺𝅥𝅮','𝆹𝅥𝅯'=>'𝆹𝅥𝅯','𝆺𝅥𝅯'=>'𝆺𝅥𝅯','𝐀'=>'A','𝐁'=>'B','𝐂'=>'C','𝐃'=>'D','𝐄'=>'E','𝐅'=>'F','𝐆'=>'G','𝐇'=>'H','𝐈'=>'I','𝐉'=>'J','𝐊'=>'K','𝐋'=>'L','𝐌'=>'M','𝐍'=>'N','𝐎'=>'O','𝐏'=>'P','𝐐'=>'Q','𝐑'=>'R','𝐒'=>'S','𝐓'=>'T','𝐔'=>'U','𝐕'=>'V','𝐖'=>'W','𝐗'=>'X','𝐘'=>'Y','𝐙'=>'Z','𝐚'=>'a','𝐛'=>'b','𝐜'=>'c','𝐝'=>'d','𝐞'=>'e','𝐟'=>'f','𝐠'=>'g','𝐡'=>'h','𝐢'=>'i','𝐣'=>'j','𝐤'=>'k','𝐥'=>'l','𝐦'=>'m','𝐧'=>'n','𝐨'=>'o','𝐩'=>'p','𝐪'=>'q','𝐫'=>'r','𝐬'=>'s','𝐭'=>'t','𝐮'=>'u','𝐯'=>'v','𝐰'=>'w','𝐱'=>'x','𝐲'=>'y','𝐳'=>'z','𝐴'=>'A','𝐵'=>'B','𝐶'=>'C','𝐷'=>'D','𝐸'=>'E','𝐹'=>'F','𝐺'=>'G','𝐻'=>'H','𝐼'=>'I','𝐽'=>'J','𝐾'=>'K','𝐿'=>'L','𝑀'=>'M','𝑁'=>'N','𝑂'=>'O','𝑃'=>'P','𝑄'=>'Q','𝑅'=>'R','𝑆'=>'S','𝑇'=>'T','𝑈'=>'U','𝑉'=>'V','𝑊'=>'W','𝑋'=>'X','𝑌'=>'Y','𝑍'=>'Z','𝑎'=>'a','𝑏'=>'b','𝑐'=>'c','𝑑'=>'d','𝑒'=>'e','𝑓'=>'f','𝑔'=>'g','𝑖'=>'i','𝑗'=>'j','𝑘'=>'k','𝑙'=>'l','𝑚'=>'m','𝑛'=>'n','𝑜'=>'o','𝑝'=>'p','𝑞'=>'q','𝑟'=>'r','𝑠'=>'s','𝑡'=>'t','𝑢'=>'u','𝑣'=>'v','𝑤'=>'w','𝑥'=>'x','𝑦'=>'y','𝑧'=>'z','𝑨'=>'A','𝑩'=>'B','𝑪'=>'C','𝑫'=>'D','𝑬'=>'E','𝑭'=>'F','𝑮'=>'G','𝑯'=>'H','𝑰'=>'I','𝑱'=>'J','𝑲'=>'K','𝑳'=>'L','𝑴'=>'M','𝑵'=>'N','𝑶'=>'O','𝑷'=>'P','𝑸'=>'Q','𝑹'=>'R','𝑺'=>'S','𝑻'=>'T','𝑼'=>'U','𝑽'=>'V','𝑾'=>'W','𝑿'=>'X','𝒀'=>'Y','𝒁'=>'Z','𝒂'=>'a','𝒃'=>'b','𝒄'=>'c','𝒅'=>'d','𝒆'=>'e','𝒇'=>'f','𝒈'=>'g','𝒉'=>'h','𝒊'=>'i','𝒋'=>'j','𝒌'=>'k','𝒍'=>'l','𝒎'=>'m','𝒏'=>'n','𝒐'=>'o','𝒑'=>'p','𝒒'=>'q','𝒓'=>'r','𝒔'=>'s','𝒕'=>'t','𝒖'=>'u','𝒗'=>'v','𝒘'=>'w','𝒙'=>'x','𝒚'=>'y','𝒛'=>'z','𝒜'=>'A','𝒞'=>'C','𝒟'=>'D','𝒢'=>'G','𝒥'=>'J','𝒦'=>'K','𝒩'=>'N','𝒪'=>'O','𝒫'=>'P','𝒬'=>'Q','𝒮'=>'S','𝒯'=>'T','𝒰'=>'U','𝒱'=>'V','𝒲'=>'W','𝒳'=>'X','𝒴'=>'Y','𝒵'=>'Z','𝒶'=>'a','𝒷'=>'b','𝒸'=>'c','𝒹'=>'d','𝒻'=>'f','𝒽'=>'h','𝒾'=>'i','𝒿'=>'j','𝓀'=>'k','𝓁'=>'l','𝓂'=>'m','𝓃'=>'n','𝓅'=>'p','𝓆'=>'q','𝓇'=>'r','𝓈'=>'s','𝓉'=>'t','𝓊'=>'u','𝓋'=>'v','𝓌'=>'w','𝓍'=>'x','𝓎'=>'y','𝓏'=>'z','𝓐'=>'A','𝓑'=>'B','𝓒'=>'C','𝓓'=>'D','𝓔'=>'E','𝓕'=>'F','𝓖'=>'G','𝓗'=>'H','𝓘'=>'I','𝓙'=>'J','𝓚'=>'K','𝓛'=>'L','𝓜'=>'M','𝓝'=>'N','𝓞'=>'O','𝓟'=>'P','𝓠'=>'Q','𝓡'=>'R','𝓢'=>'S','𝓣'=>'T','𝓤'=>'U','𝓥'=>'V','𝓦'=>'W','𝓧'=>'X','𝓨'=>'Y','𝓩'=>'Z','𝓪'=>'a','𝓫'=>'b','𝓬'=>'c','𝓭'=>'d','𝓮'=>'e','𝓯'=>'f','𝓰'=>'g','𝓱'=>'h','𝓲'=>'i','𝓳'=>'j','𝓴'=>'k','𝓵'=>'l','𝓶'=>'m','𝓷'=>'n','𝓸'=>'o','𝓹'=>'p','𝓺'=>'q','𝓻'=>'r','𝓼'=>'s','𝓽'=>'t','𝓾'=>'u','𝓿'=>'v','𝔀'=>'w','𝔁'=>'x','𝔂'=>'y','𝔃'=>'z','𝔄'=>'A','𝔅'=>'B','𝔇'=>'D','𝔈'=>'E','𝔉'=>'F','𝔊'=>'G','𝔍'=>'J','𝔎'=>'K','𝔏'=>'L','𝔐'=>'M','𝔑'=>'N','𝔒'=>'O','𝔓'=>'P','𝔔'=>'Q','𝔖'=>'S','𝔗'=>'T','𝔘'=>'U','𝔙'=>'V','𝔚'=>'W','𝔛'=>'X','𝔜'=>'Y','𝔞'=>'a','𝔟'=>'b','𝔠'=>'c','𝔡'=>'d','𝔢'=>'e','𝔣'=>'f','𝔤'=>'g','𝔥'=>'h','𝔦'=>'i','𝔧'=>'j','𝔨'=>'k','𝔩'=>'l','𝔪'=>'m','𝔫'=>'n','𝔬'=>'o','𝔭'=>'p','𝔮'=>'q','𝔯'=>'r','𝔰'=>'s','𝔱'=>'t','𝔲'=>'u','𝔳'=>'v','𝔴'=>'w','𝔵'=>'x','𝔶'=>'y','𝔷'=>'z','𝔸'=>'A','𝔹'=>'B','𝔻'=>'D','𝔼'=>'E','𝔽'=>'F','𝔾'=>'G','𝕀'=>'I','𝕁'=>'J','𝕂'=>'K','𝕃'=>'L','𝕄'=>'M','𝕆'=>'O','𝕊'=>'S','𝕋'=>'T','𝕌'=>'U','𝕍'=>'V','𝕎'=>'W','𝕏'=>'X','𝕐'=>'Y','𝕒'=>'a','𝕓'=>'b','𝕔'=>'c','𝕕'=>'d','𝕖'=>'e','𝕗'=>'f','𝕘'=>'g','𝕙'=>'h','𝕚'=>'i','𝕛'=>'j','𝕜'=>'k','𝕝'=>'l','𝕞'=>'m','𝕟'=>'n','𝕠'=>'o','𝕡'=>'p','𝕢'=>'q','𝕣'=>'r','𝕤'=>'s','𝕥'=>'t','𝕦'=>'u','𝕧'=>'v','𝕨'=>'w','𝕩'=>'x','𝕪'=>'y','𝕫'=>'z','𝕬'=>'A','𝕭'=>'B','𝕮'=>'C','𝕯'=>'D','𝕰'=>'E','𝕱'=>'F','𝕲'=>'G','𝕳'=>'H','𝕴'=>'I','𝕵'=>'J','𝕶'=>'K','𝕷'=>'L','𝕸'=>'M','𝕹'=>'N','𝕺'=>'O','𝕻'=>'P','𝕼'=>'Q','𝕽'=>'R','𝕾'=>'S','𝕿'=>'T','𝖀'=>'U','𝖁'=>'V','𝖂'=>'W','𝖃'=>'X','𝖄'=>'Y','𝖅'=>'Z','𝖆'=>'a','𝖇'=>'b','𝖈'=>'c','𝖉'=>'d','𝖊'=>'e','𝖋'=>'f','𝖌'=>'g','𝖍'=>'h','𝖎'=>'i','𝖏'=>'j','𝖐'=>'k','𝖑'=>'l','𝖒'=>'m','𝖓'=>'n','𝖔'=>'o','𝖕'=>'p','𝖖'=>'q','𝖗'=>'r','𝖘'=>'s','𝖙'=>'t','𝖚'=>'u','𝖛'=>'v','𝖜'=>'w','𝖝'=>'x','𝖞'=>'y','𝖟'=>'z','𝖠'=>'A','𝖡'=>'B','𝖢'=>'C','𝖣'=>'D','𝖤'=>'E','𝖥'=>'F','𝖦'=>'G','𝖧'=>'H','𝖨'=>'I','𝖩'=>'J','𝖪'=>'K','𝖫'=>'L','𝖬'=>'M','𝖭'=>'N','𝖮'=>'O','𝖯'=>'P','𝖰'=>'Q','𝖱'=>'R','𝖲'=>'S','𝖳'=>'T','𝖴'=>'U','𝖵'=>'V','𝖶'=>'W','𝖷'=>'X','𝖸'=>'Y','𝖹'=>'Z','𝖺'=>'a','𝖻'=>'b','𝖼'=>'c','𝖽'=>'d','𝖾'=>'e','𝖿'=>'f','𝗀'=>'g','𝗁'=>'h','𝗂'=>'i','𝗃'=>'j','𝗄'=>'k','𝗅'=>'l','𝗆'=>'m','𝗇'=>'n','𝗈'=>'o','𝗉'=>'p','𝗊'=>'q','𝗋'=>'r','𝗌'=>'s','𝗍'=>'t','𝗎'=>'u','𝗏'=>'v','𝗐'=>'w','𝗑'=>'x','𝗒'=>'y','𝗓'=>'z','𝗔'=>'A','𝗕'=>'B','𝗖'=>'C','𝗗'=>'D','𝗘'=>'E','𝗙'=>'F','𝗚'=>'G','𝗛'=>'H','𝗜'=>'I','𝗝'=>'J','𝗞'=>'K','𝗟'=>'L','𝗠'=>'M','𝗡'=>'N','𝗢'=>'O','𝗣'=>'P','𝗤'=>'Q','𝗥'=>'R','𝗦'=>'S','𝗧'=>'T','𝗨'=>'U','𝗩'=>'V','𝗪'=>'W','𝗫'=>'X','𝗬'=>'Y','𝗭'=>'Z','𝗮'=>'a','𝗯'=>'b','𝗰'=>'c','𝗱'=>'d','𝗲'=>'e','𝗳'=>'f','𝗴'=>'g','𝗵'=>'h','𝗶'=>'i','𝗷'=>'j','𝗸'=>'k','𝗹'=>'l','𝗺'=>'m','𝗻'=>'n','𝗼'=>'o','𝗽'=>'p','𝗾'=>'q','𝗿'=>'r','𝘀'=>'s','𝘁'=>'t','𝘂'=>'u','𝘃'=>'v','𝘄'=>'w','𝘅'=>'x','𝘆'=>'y','𝘇'=>'z','𝘈'=>'A','𝘉'=>'B','𝘊'=>'C','𝘋'=>'D','𝘌'=>'E','𝘍'=>'F','𝘎'=>'G','𝘏'=>'H','𝘐'=>'I','𝘑'=>'J','𝘒'=>'K','𝘓'=>'L','𝘔'=>'M','𝘕'=>'N','𝘖'=>'O','𝘗'=>'P','𝘘'=>'Q','𝘙'=>'R','𝘚'=>'S','𝘛'=>'T','𝘜'=>'U','𝘝'=>'V','𝘞'=>'W','𝘟'=>'X','𝘠'=>'Y','𝘡'=>'Z','𝘢'=>'a','𝘣'=>'b','𝘤'=>'c','𝘥'=>'d','𝘦'=>'e','𝘧'=>'f','𝘨'=>'g','𝘩'=>'h','𝘪'=>'i','𝘫'=>'j','𝘬'=>'k','𝘭'=>'l','𝘮'=>'m','𝘯'=>'n','𝘰'=>'o','𝘱'=>'p','𝘲'=>'q','𝘳'=>'r','𝘴'=>'s','𝘵'=>'t','𝘶'=>'u','𝘷'=>'v','𝘸'=>'w','𝘹'=>'x','𝘺'=>'y','𝘻'=>'z','𝘼'=>'A','𝘽'=>'B','𝘾'=>'C','𝘿'=>'D','𝙀'=>'E','𝙁'=>'F','𝙂'=>'G','𝙃'=>'H','𝙄'=>'I','𝙅'=>'J','𝙆'=>'K','𝙇'=>'L','𝙈'=>'M','𝙉'=>'N','𝙊'=>'O','𝙋'=>'P','𝙌'=>'Q','𝙍'=>'R','𝙎'=>'S','𝙏'=>'T','𝙐'=>'U','𝙑'=>'V','𝙒'=>'W','𝙓'=>'X','𝙔'=>'Y','𝙕'=>'Z','𝙖'=>'a','𝙗'=>'b','𝙘'=>'c','𝙙'=>'d','𝙚'=>'e','𝙛'=>'f','𝙜'=>'g','𝙝'=>'h','𝙞'=>'i','𝙟'=>'j','𝙠'=>'k','𝙡'=>'l','𝙢'=>'m','𝙣'=>'n','𝙤'=>'o','𝙥'=>'p','𝙦'=>'q','𝙧'=>'r','𝙨'=>'s','𝙩'=>'t','𝙪'=>'u','𝙫'=>'v','𝙬'=>'w','𝙭'=>'x','𝙮'=>'y','𝙯'=>'z','𝙰'=>'A','𝙱'=>'B','𝙲'=>'C','𝙳'=>'D','𝙴'=>'E','𝙵'=>'F','𝙶'=>'G','𝙷'=>'H','𝙸'=>'I','𝙹'=>'J','𝙺'=>'K','𝙻'=>'L','𝙼'=>'M','𝙽'=>'N','𝙾'=>'O','𝙿'=>'P','𝚀'=>'Q','𝚁'=>'R','𝚂'=>'S','𝚃'=>'T','𝚄'=>'U','𝚅'=>'V','𝚆'=>'W','𝚇'=>'X','𝚈'=>'Y','𝚉'=>'Z','𝚊'=>'a','𝚋'=>'b','𝚌'=>'c','𝚍'=>'d','𝚎'=>'e','𝚏'=>'f','𝚐'=>'g','𝚑'=>'h','𝚒'=>'i','𝚓'=>'j','𝚔'=>'k','𝚕'=>'l','𝚖'=>'m','𝚗'=>'n','𝚘'=>'o','𝚙'=>'p','𝚚'=>'q','𝚛'=>'r','𝚜'=>'s','𝚝'=>'t','𝚞'=>'u','𝚟'=>'v','𝚠'=>'w','𝚡'=>'x','𝚢'=>'y','𝚣'=>'z','𝚤'=>'ı','𝚥'=>'ȷ','𝚨'=>'Α','𝚩'=>'Β','𝚪'=>'Γ','𝚫'=>'Δ','𝚬'=>'Ε','𝚭'=>'Ζ','𝚮'=>'Η','𝚯'=>'Θ','𝚰'=>'Ι','𝚱'=>'Κ','𝚲'=>'Λ','𝚳'=>'Μ','𝚴'=>'Ν','𝚵'=>'Ξ','𝚶'=>'Ο','𝚷'=>'Π','𝚸'=>'Ρ','𝚹'=>'Θ','𝚺'=>'Σ','𝚻'=>'Τ','𝚼'=>'Υ','𝚽'=>'Φ','𝚾'=>'Χ','𝚿'=>'Ψ','𝛀'=>'Ω','𝛁'=>'∇','𝛂'=>'α','𝛃'=>'β','𝛄'=>'γ','𝛅'=>'δ','𝛆'=>'ε','𝛇'=>'ζ','𝛈'=>'η','𝛉'=>'θ','𝛊'=>'ι','𝛋'=>'κ','𝛌'=>'λ','𝛍'=>'μ','𝛎'=>'ν','𝛏'=>'ξ','𝛐'=>'ο','𝛑'=>'π','𝛒'=>'ρ','𝛓'=>'ς','𝛔'=>'σ','𝛕'=>'τ','𝛖'=>'υ','𝛗'=>'φ','𝛘'=>'χ','𝛙'=>'ψ','𝛚'=>'ω','𝛛'=>'∂','𝛜'=>'ε','𝛝'=>'θ','𝛞'=>'κ','𝛟'=>'φ','𝛠'=>'ρ','𝛡'=>'π','𝛢'=>'Α','𝛣'=>'Β','𝛤'=>'Γ','𝛥'=>'Δ','𝛦'=>'Ε','𝛧'=>'Ζ','𝛨'=>'Η','𝛩'=>'Θ','𝛪'=>'Ι','𝛫'=>'Κ','𝛬'=>'Λ','𝛭'=>'Μ','𝛮'=>'Ν','𝛯'=>'Ξ','𝛰'=>'Ο','𝛱'=>'Π','𝛲'=>'Ρ','𝛳'=>'Θ','𝛴'=>'Σ','𝛵'=>'Τ','𝛶'=>'Υ','𝛷'=>'Φ','𝛸'=>'Χ','𝛹'=>'Ψ','𝛺'=>'Ω','𝛻'=>'∇','𝛼'=>'α','𝛽'=>'β','𝛾'=>'γ','𝛿'=>'δ','𝜀'=>'ε','𝜁'=>'ζ','𝜂'=>'η','𝜃'=>'θ','𝜄'=>'ι','𝜅'=>'κ','𝜆'=>'λ','𝜇'=>'μ','𝜈'=>'ν','𝜉'=>'ξ','𝜊'=>'ο','𝜋'=>'π','𝜌'=>'ρ','𝜍'=>'ς','𝜎'=>'σ','𝜏'=>'τ','𝜐'=>'υ','𝜑'=>'φ','𝜒'=>'χ','𝜓'=>'ψ','𝜔'=>'ω','𝜕'=>'∂','𝜖'=>'ε','𝜗'=>'θ','𝜘'=>'κ','𝜙'=>'φ','𝜚'=>'ρ','𝜛'=>'π','𝜜'=>'Α','𝜝'=>'Β','𝜞'=>'Γ','𝜟'=>'Δ','𝜠'=>'Ε','𝜡'=>'Ζ','𝜢'=>'Η','𝜣'=>'Θ','𝜤'=>'Ι','𝜥'=>'Κ','𝜦'=>'Λ','𝜧'=>'Μ','𝜨'=>'Ν','𝜩'=>'Ξ','𝜪'=>'Ο','𝜫'=>'Π','𝜬'=>'Ρ','𝜭'=>'Θ','𝜮'=>'Σ','𝜯'=>'Τ','𝜰'=>'Υ','𝜱'=>'Φ','𝜲'=>'Χ','𝜳'=>'Ψ','𝜴'=>'Ω','𝜵'=>'∇','𝜶'=>'α','𝜷'=>'β','𝜸'=>'γ','𝜹'=>'δ','𝜺'=>'ε','𝜻'=>'ζ','𝜼'=>'η','𝜽'=>'θ','𝜾'=>'ι','𝜿'=>'κ','𝝀'=>'λ','𝝁'=>'μ','𝝂'=>'ν','𝝃'=>'ξ','𝝄'=>'ο','𝝅'=>'π','𝝆'=>'ρ','𝝇'=>'ς','𝝈'=>'σ','𝝉'=>'τ','𝝊'=>'υ','𝝋'=>'φ','𝝌'=>'χ','𝝍'=>'ψ','𝝎'=>'ω','𝝏'=>'∂','𝝐'=>'ε','𝝑'=>'θ','𝝒'=>'κ','𝝓'=>'φ','𝝔'=>'ρ','𝝕'=>'π','𝝖'=>'Α','𝝗'=>'Β','𝝘'=>'Γ','𝝙'=>'Δ','𝝚'=>'Ε','𝝛'=>'Ζ','𝝜'=>'Η','𝝝'=>'Θ','𝝞'=>'Ι','𝝟'=>'Κ','𝝠'=>'Λ','𝝡'=>'Μ','𝝢'=>'Ν','𝝣'=>'Ξ','𝝤'=>'Ο','𝝥'=>'Π','𝝦'=>'Ρ','𝝧'=>'Θ','𝝨'=>'Σ','𝝩'=>'Τ','𝝪'=>'Υ','𝝫'=>'Φ','𝝬'=>'Χ','𝝭'=>'Ψ','𝝮'=>'Ω','𝝯'=>'∇','𝝰'=>'α','𝝱'=>'β','𝝲'=>'γ','𝝳'=>'δ','𝝴'=>'ε','𝝵'=>'ζ','𝝶'=>'η','𝝷'=>'θ','𝝸'=>'ι','𝝹'=>'κ','𝝺'=>'λ','𝝻'=>'μ','𝝼'=>'ν','𝝽'=>'ξ','𝝾'=>'ο','𝝿'=>'π','𝞀'=>'ρ','𝞁'=>'ς','𝞂'=>'σ','𝞃'=>'τ','𝞄'=>'υ','𝞅'=>'φ','𝞆'=>'χ','𝞇'=>'ψ','𝞈'=>'ω','𝞉'=>'∂','𝞊'=>'ε','𝞋'=>'θ','𝞌'=>'κ','𝞍'=>'φ','𝞎'=>'ρ','𝞏'=>'π','𝞐'=>'Α','𝞑'=>'Β','𝞒'=>'Γ','𝞓'=>'Δ','𝞔'=>'Ε','𝞕'=>'Ζ','𝞖'=>'Η','𝞗'=>'Θ','𝞘'=>'Ι','𝞙'=>'Κ','𝞚'=>'Λ','𝞛'=>'Μ','𝞜'=>'Ν','𝞝'=>'Ξ','𝞞'=>'Ο','𝞟'=>'Π','𝞠'=>'Ρ','𝞡'=>'Θ','𝞢'=>'Σ','𝞣'=>'Τ','𝞤'=>'Υ','𝞥'=>'Φ','𝞦'=>'Χ','𝞧'=>'Ψ','𝞨'=>'Ω','𝞩'=>'∇','𝞪'=>'α','𝞫'=>'β','𝞬'=>'γ','𝞭'=>'δ','𝞮'=>'ε','𝞯'=>'ζ','𝞰'=>'η','𝞱'=>'θ','𝞲'=>'ι','𝞳'=>'κ','𝞴'=>'λ','𝞵'=>'μ','𝞶'=>'ν','𝞷'=>'ξ','𝞸'=>'ο','𝞹'=>'π','𝞺'=>'ρ','𝞻'=>'ς','𝞼'=>'σ','𝞽'=>'τ','𝞾'=>'υ','𝞿'=>'φ','𝟀'=>'χ','𝟁'=>'ψ','𝟂'=>'ω','𝟃'=>'∂','𝟄'=>'ε','𝟅'=>'θ','𝟆'=>'κ','𝟇'=>'φ','𝟈'=>'ρ','𝟉'=>'π','𝟊'=>'Ϝ','𝟋'=>'ϝ','𝟎'=>'0','𝟏'=>'1','𝟐'=>'2','𝟑'=>'3','𝟒'=>'4','𝟓'=>'5','𝟔'=>'6','𝟕'=>'7','𝟖'=>'8','𝟗'=>'9','𝟘'=>'0','𝟙'=>'1','𝟚'=>'2','𝟛'=>'3','𝟜'=>'4','𝟝'=>'5','𝟞'=>'6','𝟟'=>'7','𝟠'=>'8','𝟡'=>'9','𝟢'=>'0','𝟣'=>'1','𝟤'=>'2','𝟥'=>'3','𝟦'=>'4','𝟧'=>'5','𝟨'=>'6','𝟩'=>'7','𝟪'=>'8','𝟫'=>'9','𝟬'=>'0','𝟭'=>'1','𝟮'=>'2','𝟯'=>'3','𝟰'=>'4','𝟱'=>'5','𝟲'=>'6','𝟳'=>'7','𝟴'=>'8','𝟵'=>'9','𝟶'=>'0','𝟷'=>'1','𝟸'=>'2','𝟹'=>'3','𝟺'=>'4','𝟻'=>'5','𝟼'=>'6','𝟽'=>'7','𝟾'=>'8','𝟿'=>'9','丽'=>'丽','丸'=>'丸','乁'=>'乁','𠄢'=>'𠄢','你'=>'你','侮'=>'侮','侻'=>'侻','倂'=>'倂','偺'=>'偺','備'=>'備','僧'=>'僧','像'=>'像','㒞'=>'㒞','𠘺'=>'𠘺','免'=>'免','兔'=>'兔','兤'=>'兤','具'=>'具','𠔜'=>'𠔜','㒹'=>'㒹','內'=>'內','再'=>'再','𠕋'=>'𠕋','冗'=>'冗','冤'=>'冤','仌'=>'仌','冬'=>'冬','况'=>'况','𩇟'=>'𩇟','凵'=>'凵','刃'=>'刃','㓟'=>'㓟','刻'=>'刻','剆'=>'剆','割'=>'割','剷'=>'剷','㔕'=>'㔕','勇'=>'勇','勉'=>'勉','勤'=>'勤','勺'=>'勺','包'=>'包','匆'=>'匆','北'=>'北','卉'=>'卉','卑'=>'卑','博'=>'博','即'=>'即','卽'=>'卽','卿'=>'卿','卿'=>'卿','卿'=>'卿','𠨬'=>'𠨬','灰'=>'灰','及'=>'及','叟'=>'叟','𠭣'=>'𠭣','叫'=>'叫','叱'=>'叱','吆'=>'吆','咞'=>'咞','吸'=>'吸','呈'=>'呈','周'=>'周','咢'=>'咢','哶'=>'哶','唐'=>'唐','啓'=>'啓','啣'=>'啣','善'=>'善','善'=>'善','喙'=>'喙','喫'=>'喫','喳'=>'喳','嗂'=>'嗂','圖'=>'圖','嘆'=>'嘆','圗'=>'圗','噑'=>'噑','噴'=>'噴','切'=>'切','壮'=>'壮','城'=>'城','埴'=>'埴','堍'=>'堍','型'=>'型','堲'=>'堲','報'=>'報','墬'=>'墬','𡓤'=>'𡓤','売'=>'売','壷'=>'壷','夆'=>'夆','多'=>'多','夢'=>'夢','奢'=>'奢','𡚨'=>'𡚨','𡛪'=>'𡛪','姬'=>'姬','娛'=>'娛','娧'=>'娧','姘'=>'姘','婦'=>'婦','㛮'=>'㛮','㛼'=>'㛼','嬈'=>'嬈','嬾'=>'嬾','嬾'=>'嬾','𡧈'=>'𡧈','寃'=>'寃','寘'=>'寘','寧'=>'寧','寳'=>'寳','𡬘'=>'𡬘','寿'=>'寿','将'=>'将','当'=>'当','尢'=>'尢','㞁'=>'㞁','屠'=>'屠','屮'=>'屮','峀'=>'峀','岍'=>'岍','𡷤'=>'𡷤','嵃'=>'嵃','𡷦'=>'𡷦','嵮'=>'嵮','嵫'=>'嵫','嵼'=>'嵼','巡'=>'巡','巢'=>'巢','㠯'=>'㠯','巽'=>'巽','帨'=>'帨','帽'=>'帽','幩'=>'幩','㡢'=>'㡢','𢆃'=>'𢆃','㡼'=>'㡼','庰'=>'庰','庳'=>'庳','庶'=>'庶','廊'=>'廊','𪎒'=>'𪎒','廾'=>'廾','𢌱'=>'𢌱','𢌱'=>'𢌱','舁'=>'舁','弢'=>'弢','弢'=>'弢','㣇'=>'㣇','𣊸'=>'𣊸','𦇚'=>'𦇚','形'=>'形','彫'=>'彫','㣣'=>'㣣','徚'=>'徚','忍'=>'忍','志'=>'志','忹'=>'忹','悁'=>'悁','㤺'=>'㤺','㤜'=>'㤜','悔'=>'悔','𢛔'=>'𢛔','惇'=>'惇','慈'=>'慈','慌'=>'慌','慎'=>'慎','慌'=>'慌','慺'=>'慺','憎'=>'憎','憲'=>'憲','憤'=>'憤','憯'=>'憯','懞'=>'懞','懲'=>'懲','懶'=>'懶','成'=>'成','戛'=>'戛','扝'=>'扝','抱'=>'抱','拔'=>'拔','捐'=>'捐','𢬌'=>'𢬌','挽'=>'挽','拼'=>'拼','捨'=>'捨','掃'=>'掃','揤'=>'揤','𢯱'=>'𢯱','搢'=>'搢','揅'=>'揅','掩'=>'掩','㨮'=>'㨮','摩'=>'摩','摾'=>'摾','撝'=>'撝','摷'=>'摷','㩬'=>'㩬','敏'=>'敏','敬'=>'敬','𣀊'=>'𣀊','旣'=>'旣','書'=>'書','晉'=>'晉','㬙'=>'㬙','暑'=>'暑','㬈'=>'㬈','㫤'=>'㫤','冒'=>'冒','冕'=>'冕','最'=>'最','暜'=>'暜','肭'=>'肭','䏙'=>'䏙','朗'=>'朗','望'=>'望','朡'=>'朡','杞'=>'杞','杓'=>'杓','𣏃'=>'𣏃','㭉'=>'㭉','柺'=>'柺','枅'=>'枅','桒'=>'桒','梅'=>'梅','𣑭'=>'𣑭','梎'=>'梎','栟'=>'栟','椔'=>'椔','㮝'=>'㮝','楂'=>'楂','榣'=>'榣','槪'=>'槪','檨'=>'檨','𣚣'=>'𣚣','櫛'=>'櫛','㰘'=>'㰘','次'=>'次','𣢧'=>'𣢧','歔'=>'歔','㱎'=>'㱎','歲'=>'歲','殟'=>'殟','殺'=>'殺','殻'=>'殻','𣪍'=>'𣪍','𡴋'=>'𡴋','𣫺'=>'𣫺','汎'=>'汎','𣲼'=>'𣲼','沿'=>'沿','泍'=>'泍','汧'=>'汧','洖'=>'洖','派'=>'派','海'=>'海','流'=>'流','浩'=>'浩','浸'=>'浸','涅'=>'涅','𣴞'=>'𣴞','洴'=>'洴','港'=>'港','湮'=>'湮','㴳'=>'㴳','滋'=>'滋','滇'=>'滇','𣻑'=>'𣻑','淹'=>'淹','潮'=>'潮','𣽞'=>'𣽞','𣾎'=>'𣾎','濆'=>'濆','瀹'=>'瀹','瀞'=>'瀞','瀛'=>'瀛','㶖'=>'㶖','灊'=>'灊','災'=>'災','灷'=>'灷','炭'=>'炭','𠔥'=>'𠔥','煅'=>'煅','𤉣'=>'𤉣','熜'=>'熜','𤎫'=>'𤎫','爨'=>'爨','爵'=>'爵','牐'=>'牐','𤘈'=>'𤘈','犀'=>'犀','犕'=>'犕','𤜵'=>'𤜵','𤠔'=>'𤠔','獺'=>'獺','王'=>'王','㺬'=>'㺬','玥'=>'玥','㺸'=>'㺸','㺸'=>'㺸','瑇'=>'瑇','瑜'=>'瑜','瑱'=>'瑱','璅'=>'璅','瓊'=>'瓊','㼛'=>'㼛','甤'=>'甤','𤰶'=>'𤰶','甾'=>'甾','𤲒'=>'𤲒','異'=>'異','𢆟'=>'𢆟','瘐'=>'瘐','𤾡'=>'𤾡','𤾸'=>'𤾸','𥁄'=>'𥁄','㿼'=>'㿼','䀈'=>'䀈','直'=>'直','𥃳'=>'𥃳','𥃲'=>'𥃲','𥄙'=>'𥄙','𥄳'=>'𥄳','眞'=>'眞','真'=>'真','真'=>'真','睊'=>'睊','䀹'=>'䀹','瞋'=>'瞋','䁆'=>'䁆','䂖'=>'䂖','𥐝'=>'𥐝','硎'=>'硎','碌'=>'碌','磌'=>'磌','䃣'=>'䃣','𥘦'=>'𥘦','祖'=>'祖','𥚚'=>'𥚚','𥛅'=>'𥛅','福'=>'福','秫'=>'秫','䄯'=>'䄯','穀'=>'穀','穊'=>'穊','穏'=>'穏','𥥼'=>'𥥼','𥪧'=>'𥪧','𥪧'=>'𥪧','竮'=>'竮','䈂'=>'䈂','𥮫'=>'𥮫','篆'=>'篆','築'=>'築','䈧'=>'䈧','𥲀'=>'𥲀','糒'=>'糒','䊠'=>'䊠','糨'=>'糨','糣'=>'糣','紀'=>'紀','𥾆'=>'𥾆','絣'=>'絣','䌁'=>'䌁','緇'=>'緇','縂'=>'縂','繅'=>'繅','䌴'=>'䌴','𦈨'=>'𦈨','𦉇'=>'𦉇','䍙'=>'䍙','𦋙'=>'𦋙','罺'=>'罺','𦌾'=>'𦌾','羕'=>'羕','翺'=>'翺','者'=>'者','𦓚'=>'𦓚','𦔣'=>'𦔣','聠'=>'聠','𦖨'=>'𦖨','聰'=>'聰','𣍟'=>'𣍟','䏕'=>'䏕','育'=>'育','脃'=>'脃','䐋'=>'䐋','脾'=>'脾','媵'=>'媵','𦞧'=>'𦞧','𦞵'=>'𦞵','𣎓'=>'𣎓','𣎜'=>'𣎜','舁'=>'舁','舄'=>'舄','辞'=>'辞','䑫'=>'䑫','芑'=>'芑','芋'=>'芋','芝'=>'芝','劳'=>'劳','花'=>'花','芳'=>'芳','芽'=>'芽','苦'=>'苦','𦬼'=>'𦬼','若'=>'若','茝'=>'茝','荣'=>'荣','莭'=>'莭','茣'=>'茣','莽'=>'莽','菧'=>'菧','著'=>'著','荓'=>'荓','菊'=>'菊','菌'=>'菌','菜'=>'菜','𦰶'=>'𦰶','𦵫'=>'𦵫','𦳕'=>'𦳕','䔫'=>'䔫','蓱'=>'蓱','蓳'=>'蓳','蔖'=>'蔖','𧏊'=>'𧏊','蕤'=>'蕤','𦼬'=>'𦼬','䕝'=>'䕝','䕡'=>'䕡','𦾱'=>'𦾱','𧃒'=>'𧃒','䕫'=>'䕫','虐'=>'虐','虜'=>'虜','虧'=>'虧','虩'=>'虩','蚩'=>'蚩','蚈'=>'蚈','蜎'=>'蜎','蛢'=>'蛢','蝹'=>'蝹','蜨'=>'蜨','蝫'=>'蝫','螆'=>'螆','䗗'=>'䗗','蟡'=>'蟡','蠁'=>'蠁','䗹'=>'䗹','衠'=>'衠','衣'=>'衣','𧙧'=>'𧙧','裗'=>'裗','裞'=>'裞','䘵'=>'䘵','裺'=>'裺','㒻'=>'㒻','𧢮'=>'𧢮','𧥦'=>'𧥦','䚾'=>'䚾','䛇'=>'䛇','誠'=>'誠','諭'=>'諭','變'=>'變','豕'=>'豕','𧲨'=>'𧲨','貫'=>'貫','賁'=>'賁','贛'=>'贛','起'=>'起','𧼯'=>'𧼯','𠠄'=>'𠠄','跋'=>'跋','趼'=>'趼','跰'=>'跰','𠣞'=>'𠣞','軔'=>'軔','輸'=>'輸','𨗒'=>'𨗒','𨗭'=>'𨗭','邔'=>'邔','郱'=>'郱','鄑'=>'鄑','𨜮'=>'𨜮','鄛'=>'鄛','鈸'=>'鈸','鋗'=>'鋗','鋘'=>'鋘','鉼'=>'鉼','鏹'=>'鏹','鐕'=>'鐕','𨯺'=>'𨯺','開'=>'開','䦕'=>'䦕','閷'=>'閷','𨵷'=>'𨵷','䧦'=>'䧦','雃'=>'雃','嶲'=>'嶲','霣'=>'霣','𩅅'=>'𩅅','𩈚'=>'𩈚','䩮'=>'䩮','䩶'=>'䩶','韠'=>'韠','𩐊'=>'𩐊','䪲'=>'䪲','𩒖'=>'𩒖','頋'=>'頋','頋'=>'頋','頩'=>'頩','𩖶'=>'𩖶','飢'=>'飢','䬳'=>'䬳','餩'=>'餩','馧'=>'馧','駂'=>'駂','駾'=>'駾','䯎'=>'䯎','𩬰'=>'𩬰','鬒'=>'鬒','鱀'=>'鱀','鳽'=>'鳽','䳎'=>'䳎','䳭'=>'䳭','鵧'=>'鵧','𪃎'=>'𪃎','䳸'=>'䳸','𪄅'=>'𪄅','𪈎'=>'𪈎','𪊑'=>'𪊑','麻'=>'麻','䵖'=>'䵖','黹'=>'黹','黾'=>'黾','鼅'=>'鼅','鼏'=>'鼏','鼖'=>'鼖','鼻'=>'鼻','𪘀'=>'𪘀');
diff --git a/phpBB/includes/utf/data/utf_nfc_qc.php b/phpBB/includes/utf/data/utf_nfc_qc.php
index 03031f8b6d..ff56357ea6 100644
--- a/phpBB/includes/utf/data/utf_nfc_qc.php
+++ b/phpBB/includes/utf/data/utf_nfc_qc.php
@@ -1,2 +1,2 @@
<?php
-$GLOBALS['utf_nfc_qc']=array('̀'=>1,'́'=>1,'̓'=>1,'̈́'=>1,'ʹ'=>1,';'=>1,'·'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'ढ़'=>1,'फ़'=>1,'य़'=>1,'ড়'=>1,'ঢ়'=>1,'য়'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'ਖ਼'=>1,'ਗ਼'=>1,'ਜ਼'=>1,'ਫ਼'=>1,'ଡ଼'=>1,'ଢ଼'=>1,'གྷ'=>1,'ཌྷ'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ླྀ'=>1,'ཱྀ'=>1,'ྒྷ'=>1,'ྜྷ'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'ά'=>1,'έ'=>1,'ή'=>1,'ί'=>1,'ό'=>1,'ύ'=>1,'ώ'=>1,'Ά'=>1,'ι'=>1,'Έ'=>1,'Ή'=>1,'ΐ'=>1,'Ί'=>1,'ΰ'=>1,'Ύ'=>1,'΅'=>1,'`'=>1,'Ό'=>1,'Ώ'=>1,'´'=>1,' '=>1,' '=>1,'Ω'=>1,'K'=>1,'Å'=>1,'〈'=>1,'〉'=>1,'⫝̸'=>1,'豈'=>1,'更'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'懶'=>1,'癩'=>1,'羅'=>1,'蘿'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'欄'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'來'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'論'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'淚'=>1,'漏'=>1,'累'=>1,'縷'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'諾'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'省'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'女'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'轢'=>1,'年'=>1,'憐'=>1,'戀'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'劣'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'玲'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'燎'=>1,'療'=>1,'蓼'=>1,'遼'=>1,'龍'=>1,'暈'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'流'=>1,'溜'=>1,'琉'=>1,'留'=>1,'硫'=>1,'紐'=>1,'類'=>1,'六'=>1,'戮'=>1,'陸'=>1,'倫'=>1,'崙'=>1,'淪'=>1,'輪'=>1,'律'=>1,'慄'=>1,'栗'=>1,'率'=>1,'隆'=>1,'利'=>1,'吏'=>1,'履'=>1,'易'=>1,'李'=>1,'梨'=>1,'泥'=>1,'理'=>1,'痢'=>1,'罹'=>1,'裏'=>1,'裡'=>1,'里'=>1,'離'=>1,'匿'=>1,'溺'=>1,'吝'=>1,'燐'=>1,'璘'=>1,'藺'=>1,'隣'=>1,'鱗'=>1,'麟'=>1,'林'=>1,'淋'=>1,'臨'=>1,'立'=>1,'笠'=>1,'粒'=>1,'狀'=>1,'炙'=>1,'識'=>1,'什'=>1,'茶'=>1,'刺'=>1,'切'=>1,'度'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'嗀'=>1,'塚'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'精'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'鶴'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'懲'=>1,'敏'=>1,'既'=>1,'暑'=>1,'梅'=>1,'海'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'碑'=>1,'社'=>1,'祉'=>1,'祈'=>1,'祐'=>1,'祖'=>1,'祝'=>1,'禍'=>1,'禎'=>1,'穀'=>1,'突'=>1,'節'=>1,'練'=>1,'縉'=>1,'繁'=>1,'署'=>1,'者'=>1,'臭'=>1,'艹'=>1,'艹'=>1,'著'=>1,'褐'=>1,'視'=>1,'謁'=>1,'謹'=>1,'賓'=>1,'贈'=>1,'辶'=>1,'逸'=>1,'難'=>1,'響'=>1,'頻'=>1,'並'=>1,'况'=>1,'全'=>1,'侀'=>1,'充'=>1,'冀'=>1,'勇'=>1,'勺'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'嗢'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'奔'=>1,'婢'=>1,'嬨'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'揄'=>1,'搜'=>1,'摒'=>1,'敖'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'瞧'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'節'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'變'=>1,'贈'=>1,'輸'=>1,'遲'=>1,'醙'=>1,'鉶'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'頋'=>1,'頻'=>1,'鬒'=>1,'龜'=>1,'𢡊'=>1,'𢡄'=>1,'𣏕'=>1,'㮝'=>1,'䀘'=>1,'䀹'=>1,'𥉉'=>1,'𥳐'=>1,'𧻓'=>1,'齃'=>1,'龎'=>1,'יִ'=>1,'ײַ'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'שּׂ'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'נּ'=>1,'סּ'=>1,'ףּ'=>1,'פּ'=>1,'צּ'=>1,'קּ'=>1,'רּ'=>1,'שּ'=>1,'תּ'=>1,'וֹ'=>1,'בֿ'=>1,'כֿ'=>1,'פֿ'=>1,'𝅗𝅥'=>1,'𝅘𝅥'=>1,'𝅘𝅥𝅮'=>1,'𝅘𝅥𝅯'=>1,'𝅘𝅥𝅰'=>1,'𝅘𝅥𝅱'=>1,'𝅘𝅥𝅲'=>1,'𝆹𝅥'=>1,'𝆺𝅥'=>1,'𝆹𝅥𝅮'=>1,'𝆺𝅥𝅮'=>1,'𝆹𝅥𝅯'=>1,'𝆺𝅥𝅯'=>1,'丽'=>1,'丸'=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'𠘺'=>1,'免'=>1,'兔'=>1,'兤'=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'凵'=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'卑'=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'哶'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'圗'=>1,'噑'=>1,'噴'=>1,'切'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'多'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'寃'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'巡'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'庶'=>1,'廊'=>1,'𪎒'=>1,'廾'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'忍'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'憤'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'掩'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'晉'=>1,'㬙'=>1,'暑'=>1,'㬈'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'𣏃'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'櫛'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'海'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'𣻑'=>1,'淹'=>1,'潮'=>1,'𣽞'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'𤉣'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'㺸'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'𥃳'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'𥐝'=>1,'硎'=>1,'碌'=>1,'磌'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'𥪧'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'䌁'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'䏕'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'辞'=>1,'䑫'=>1,'芑'=>1,'芋'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'莽'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'𦼬'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'蠁'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'䚾'=>1,'䛇'=>1,'誠'=>1,'諭'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'𠣞'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'𨯺'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'𩖶'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'䳎'=>1,'䳭'=>1,'鵧'=>1,'𪃎'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'𪘀'=>1,'̀'=>0,'́'=>0,'̂'=>0,'̃'=>0,'̄'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'̊'=>0,'̋'=>0,'̌'=>0,'̏'=>0,'̑'=>0,'̓'=>0,'̔'=>0,'̛'=>0,'̣'=>0,'̤'=>0,'̥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'̭'=>0,'̮'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'͂'=>0,'ͅ'=>0,'ٓ'=>0,'ٔ'=>0,'ٕ'=>0,'़'=>0,'া'=>0,'ৗ'=>0,'ା'=>0,'ୖ'=>0,'ୗ'=>0,'ா'=>0,'ௗ'=>0,'ౖ'=>0,'ೂ'=>0,'ೕ'=>0,'ೖ'=>0,'ാ'=>0,'ൗ'=>0,'්'=>0,'ා'=>0,'ෟ'=>0,'ီ'=>0,'ᅡ'=>0,'ᅢ'=>0,'ᅣ'=>0,'ᅤ'=>0,'ᅥ'=>0,'ᅦ'=>0,'ᅧ'=>0,'ᅨ'=>0,'ᅩ'=>0,'ᅪ'=>0,'ᅫ'=>0,'ᅬ'=>0,'ᅭ'=>0,'ᅮ'=>0,'ᅯ'=>0,'ᅰ'=>0,'ᅱ'=>0,'ᅲ'=>0,'ᅳ'=>0,'ᅴ'=>0,'ᅵ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'ᆭ'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'ᇁ'=>0,'ᇂ'=>0,'ᬵ'=>0,'゙'=>0,'゚'=>0); \ No newline at end of file
+$GLOBALS['utf_nfc_qc']=array('̀'=>1,'́'=>1,'̓'=>1,'̈́'=>1,'ʹ'=>1,';'=>1,'·'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'ढ़'=>1,'फ़'=>1,'य़'=>1,'ড়'=>1,'ঢ়'=>1,'য়'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'ਖ਼'=>1,'ਗ਼'=>1,'ਜ਼'=>1,'ਫ਼'=>1,'ଡ଼'=>1,'ଢ଼'=>1,'གྷ'=>1,'ཌྷ'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ླྀ'=>1,'ཱྀ'=>1,'ྒྷ'=>1,'ྜྷ'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'ά'=>1,'έ'=>1,'ή'=>1,'ί'=>1,'ό'=>1,'ύ'=>1,'ώ'=>1,'Ά'=>1,'ι'=>1,'Έ'=>1,'Ή'=>1,'ΐ'=>1,'Ί'=>1,'ΰ'=>1,'Ύ'=>1,'΅'=>1,'`'=>1,'Ό'=>1,'Ώ'=>1,'´'=>1,' '=>1,' '=>1,'Ω'=>1,'K'=>1,'Å'=>1,'〈'=>1,'〉'=>1,'⫝̸'=>1,'豈'=>1,'更'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'懶'=>1,'癩'=>1,'羅'=>1,'蘿'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'欄'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'來'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'論'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'淚'=>1,'漏'=>1,'累'=>1,'縷'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'諾'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'省'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'女'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'轢'=>1,'年'=>1,'憐'=>1,'戀'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'劣'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'玲'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'燎'=>1,'療'=>1,'蓼'=>1,'遼'=>1,'龍'=>1,'暈'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'流'=>1,'溜'=>1,'琉'=>1,'留'=>1,'硫'=>1,'紐'=>1,'類'=>1,'六'=>1,'戮'=>1,'陸'=>1,'倫'=>1,'崙'=>1,'淪'=>1,'輪'=>1,'律'=>1,'慄'=>1,'栗'=>1,'率'=>1,'隆'=>1,'利'=>1,'吏'=>1,'履'=>1,'易'=>1,'李'=>1,'梨'=>1,'泥'=>1,'理'=>1,'痢'=>1,'罹'=>1,'裏'=>1,'裡'=>1,'里'=>1,'離'=>1,'匿'=>1,'溺'=>1,'吝'=>1,'燐'=>1,'璘'=>1,'藺'=>1,'隣'=>1,'鱗'=>1,'麟'=>1,'林'=>1,'淋'=>1,'臨'=>1,'立'=>1,'笠'=>1,'粒'=>1,'狀'=>1,'炙'=>1,'識'=>1,'什'=>1,'茶'=>1,'刺'=>1,'切'=>1,'度'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'嗀'=>1,'塚'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'精'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'鶴'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'懲'=>1,'敏'=>1,'既'=>1,'暑'=>1,'梅'=>1,'海'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'碑'=>1,'社'=>1,'祉'=>1,'祈'=>1,'祐'=>1,'祖'=>1,'祝'=>1,'禍'=>1,'禎'=>1,'穀'=>1,'突'=>1,'節'=>1,'練'=>1,'縉'=>1,'繁'=>1,'署'=>1,'者'=>1,'臭'=>1,'艹'=>1,'艹'=>1,'著'=>1,'褐'=>1,'視'=>1,'謁'=>1,'謹'=>1,'賓'=>1,'贈'=>1,'辶'=>1,'逸'=>1,'難'=>1,'響'=>1,'頻'=>1,'並'=>1,'况'=>1,'全'=>1,'侀'=>1,'充'=>1,'冀'=>1,'勇'=>1,'勺'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'嗢'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'奔'=>1,'婢'=>1,'嬨'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'揄'=>1,'搜'=>1,'摒'=>1,'敖'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'瞧'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'節'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'變'=>1,'贈'=>1,'輸'=>1,'遲'=>1,'醙'=>1,'鉶'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'頋'=>1,'頻'=>1,'鬒'=>1,'龜'=>1,'𢡊'=>1,'𢡄'=>1,'𣏕'=>1,'㮝'=>1,'䀘'=>1,'䀹'=>1,'𥉉'=>1,'𥳐'=>1,'𧻓'=>1,'齃'=>1,'龎'=>1,'יִ'=>1,'ײַ'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'שּׂ'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'נּ'=>1,'סּ'=>1,'ףּ'=>1,'פּ'=>1,'צּ'=>1,'קּ'=>1,'רּ'=>1,'שּ'=>1,'תּ'=>1,'וֹ'=>1,'בֿ'=>1,'כֿ'=>1,'פֿ'=>1,'𝅗𝅥'=>1,'𝅘𝅥'=>1,'𝅘𝅥𝅮'=>1,'𝅘𝅥𝅯'=>1,'𝅘𝅥𝅰'=>1,'𝅘𝅥𝅱'=>1,'𝅘𝅥𝅲'=>1,'𝆹𝅥'=>1,'𝆺𝅥'=>1,'𝆹𝅥𝅮'=>1,'𝆺𝅥𝅮'=>1,'𝆹𝅥𝅯'=>1,'𝆺𝅥𝅯'=>1,'丽'=>1,'丸'=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'𠘺'=>1,'免'=>1,'兔'=>1,'兤'=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'凵'=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'卑'=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'哶'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'圗'=>1,'噑'=>1,'噴'=>1,'切'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'多'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'寃'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'巡'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'庶'=>1,'廊'=>1,'𪎒'=>1,'廾'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'忍'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'憤'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'掩'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'晉'=>1,'㬙'=>1,'暑'=>1,'㬈'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'𣏃'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'櫛'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'海'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'𣻑'=>1,'淹'=>1,'潮'=>1,'𣽞'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'𤉣'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'㺸'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'𥃳'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'𥐝'=>1,'硎'=>1,'碌'=>1,'磌'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'𥪧'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'䌁'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'䏕'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'辞'=>1,'䑫'=>1,'芑'=>1,'芋'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'莽'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'𦼬'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'蠁'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'䚾'=>1,'䛇'=>1,'誠'=>1,'諭'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'𠣞'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'𨯺'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'𩖶'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'䳎'=>1,'䳭'=>1,'鵧'=>1,'𪃎'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'𪘀'=>1,'̀'=>0,'́'=>0,'̂'=>0,'̃'=>0,'̄'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'̊'=>0,'̋'=>0,'̌'=>0,'̏'=>0,'̑'=>0,'̓'=>0,'̔'=>0,'̛'=>0,'̣'=>0,'̤'=>0,'̥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'̭'=>0,'̮'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'͂'=>0,'ͅ'=>0,'ٓ'=>0,'ٔ'=>0,'ٕ'=>0,'़'=>0,'া'=>0,'ৗ'=>0,'ା'=>0,'ୖ'=>0,'ୗ'=>0,'ா'=>0,'ௗ'=>0,'ౖ'=>0,'ೂ'=>0,'ೕ'=>0,'ೖ'=>0,'ാ'=>0,'ൗ'=>0,'්'=>0,'ා'=>0,'ෟ'=>0,'ီ'=>0,'ᅡ'=>0,'ᅢ'=>0,'ᅣ'=>0,'ᅤ'=>0,'ᅥ'=>0,'ᅦ'=>0,'ᅧ'=>0,'ᅨ'=>0,'ᅩ'=>0,'ᅪ'=>0,'ᅫ'=>0,'ᅬ'=>0,'ᅭ'=>0,'ᅮ'=>0,'ᅯ'=>0,'ᅰ'=>0,'ᅱ'=>0,'ᅲ'=>0,'ᅳ'=>0,'ᅴ'=>0,'ᅵ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'ᆭ'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'ᇁ'=>0,'ᇂ'=>0,'ᬵ'=>0,'゙'=>0,'゚'=>0);
diff --git a/phpBB/includes/utf/data/utf_nfkc_qc.php b/phpBB/includes/utf/data/utf_nfkc_qc.php
index da9a8a0e89..181a07b351 100644
--- a/phpBB/includes/utf/data/utf_nfkc_qc.php
+++ b/phpBB/includes/utf/data/utf_nfkc_qc.php
@@ -1,2 +1,2 @@
<?php
-$GLOBALS['utf_nfkc_qc']=array(' '=>1,'¨'=>1,'ª'=>1,'¯'=>1,'²'=>1,'³'=>1,'´'=>1,'µ'=>1,'¸'=>1,'¹'=>1,'º'=>1,'¼'=>1,'½'=>1,'¾'=>1,'IJ'=>1,'ij'=>1,'Ŀ'=>1,'ŀ'=>1,'ʼn'=>1,'ſ'=>1,'DŽ'=>1,'Dž'=>1,'dž'=>1,'LJ'=>1,'Lj'=>1,'lj'=>1,'NJ'=>1,'Nj'=>1,'nj'=>1,'DZ'=>1,'Dz'=>1,'dz'=>1,'ʰ'=>1,'ʱ'=>1,'ʲ'=>1,'ʳ'=>1,'ʴ'=>1,'ʵ'=>1,'ʶ'=>1,'ʷ'=>1,'ʸ'=>1,'˘'=>1,'˙'=>1,'˚'=>1,'˛'=>1,'˜'=>1,'˝'=>1,'ˠ'=>1,'ˡ'=>1,'ˢ'=>1,'ˣ'=>1,'ˤ'=>1,'̀'=>1,'́'=>1,'̓'=>1,'̈́'=>1,'ʹ'=>1,'ͺ'=>1,';'=>1,'΄'=>1,'΅'=>1,'·'=>1,'ϐ'=>1,'ϑ'=>1,'ϒ'=>1,'ϓ'=>1,'ϔ'=>1,'ϕ'=>1,'ϖ'=>1,'ϰ'=>1,'ϱ'=>1,'ϲ'=>1,'ϴ'=>1,'ϵ'=>1,'Ϲ'=>1,'և'=>1,'ٵ'=>1,'ٶ'=>1,'ٷ'=>1,'ٸ'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'ढ़'=>1,'फ़'=>1,'य़'=>1,'ড়'=>1,'ঢ়'=>1,'য়'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'ਖ਼'=>1,'ਗ਼'=>1,'ਜ਼'=>1,'ਫ਼'=>1,'ଡ଼'=>1,'ଢ଼'=>1,'ำ'=>1,'ຳ'=>1,'ໜ'=>1,'ໝ'=>1,'༌'=>1,'གྷ'=>1,'ཌྷ'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ཷ'=>1,'ླྀ'=>1,'ཹ'=>1,'ཱྀ'=>1,'ྒྷ'=>1,'ྜྷ'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'ჼ'=>1,'ᴬ'=>1,'ᴭ'=>1,'ᴮ'=>1,'ᴰ'=>1,'ᴱ'=>1,'ᴲ'=>1,'ᴳ'=>1,'ᴴ'=>1,'ᴵ'=>1,'ᴶ'=>1,'ᴷ'=>1,'ᴸ'=>1,'ᴹ'=>1,'ᴺ'=>1,'ᴼ'=>1,'ᴽ'=>1,'ᴾ'=>1,'ᴿ'=>1,'ᵀ'=>1,'ᵁ'=>1,'ᵂ'=>1,'ᵃ'=>1,'ᵄ'=>1,'ᵅ'=>1,'ᵆ'=>1,'ᵇ'=>1,'ᵈ'=>1,'ᵉ'=>1,'ᵊ'=>1,'ᵋ'=>1,'ᵌ'=>1,'ᵍ'=>1,'ᵏ'=>1,'ᵐ'=>1,'ᵑ'=>1,'ᵒ'=>1,'ᵓ'=>1,'ᵔ'=>1,'ᵕ'=>1,'ᵖ'=>1,'ᵗ'=>1,'ᵘ'=>1,'ᵙ'=>1,'ᵚ'=>1,'ᵛ'=>1,'ᵜ'=>1,'ᵝ'=>1,'ᵞ'=>1,'ᵟ'=>1,'ᵠ'=>1,'ᵡ'=>1,'ᵢ'=>1,'ᵣ'=>1,'ᵤ'=>1,'ᵥ'=>1,'ᵦ'=>1,'ᵧ'=>1,'ᵨ'=>1,'ᵩ'=>1,'ᵪ'=>1,'ᵸ'=>1,'ᶛ'=>1,'ᶜ'=>1,'ᶝ'=>1,'ᶞ'=>1,'ᶟ'=>1,'ᶠ'=>1,'ᶡ'=>1,'ᶢ'=>1,'ᶣ'=>1,'ᶤ'=>1,'ᶥ'=>1,'ᶦ'=>1,'ᶧ'=>1,'ᶨ'=>1,'ᶩ'=>1,'ᶪ'=>1,'ᶫ'=>1,'ᶬ'=>1,'ᶭ'=>1,'ᶮ'=>1,'ᶯ'=>1,'ᶰ'=>1,'ᶱ'=>1,'ᶲ'=>1,'ᶳ'=>1,'ᶴ'=>1,'ᶵ'=>1,'ᶶ'=>1,'ᶷ'=>1,'ᶸ'=>1,'ᶹ'=>1,'ᶺ'=>1,'ᶻ'=>1,'ᶼ'=>1,'ᶽ'=>1,'ᶾ'=>1,'ᶿ'=>1,'ẚ'=>1,'ẛ'=>1,'ά'=>1,'έ'=>1,'ή'=>1,'ί'=>1,'ό'=>1,'ύ'=>1,'ώ'=>1,'Ά'=>1,'᾽'=>1,'ι'=>1,'᾿'=>1,'῀'=>1,'῁'=>1,'Έ'=>1,'Ή'=>1,'῍'=>1,'῎'=>1,'῏'=>1,'ΐ'=>1,'Ί'=>1,'῝'=>1,'῞'=>1,'῟'=>1,'ΰ'=>1,'Ύ'=>1,'῭'=>1,'΅'=>1,'`'=>1,'Ό'=>1,'Ώ'=>1,'´'=>1,'῾'=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,'‑'=>1,'‗'=>1,'․'=>1,'‥'=>1,'…'=>1,' '=>1,'″'=>1,'‴'=>1,'‶'=>1,'‷'=>1,'‼'=>1,'‾'=>1,'⁇'=>1,'⁈'=>1,'⁉'=>1,'⁗'=>1,' '=>1,'⁰'=>1,'ⁱ'=>1,'⁴'=>1,'⁵'=>1,'⁶'=>1,'⁷'=>1,'⁸'=>1,'⁹'=>1,'⁺'=>1,'⁻'=>1,'⁼'=>1,'⁽'=>1,'⁾'=>1,'ⁿ'=>1,'₀'=>1,'₁'=>1,'₂'=>1,'₃'=>1,'₄'=>1,'₅'=>1,'₆'=>1,'₇'=>1,'₈'=>1,'₉'=>1,'₊'=>1,'₋'=>1,'₌'=>1,'₍'=>1,'₎'=>1,'ₐ'=>1,'ₑ'=>1,'ₒ'=>1,'ₓ'=>1,'ₔ'=>1,'₨'=>1,'℀'=>1,'℁'=>1,'ℂ'=>1,'℃'=>1,'℅'=>1,'℆'=>1,'ℇ'=>1,'℉'=>1,'ℊ'=>1,'ℋ'=>1,'ℌ'=>1,'ℍ'=>1,'ℎ'=>1,'ℏ'=>1,'ℐ'=>1,'ℑ'=>1,'ℒ'=>1,'ℓ'=>1,'ℕ'=>1,'№'=>1,'ℙ'=>1,'ℚ'=>1,'ℛ'=>1,'ℜ'=>1,'ℝ'=>1,'℠'=>1,'℡'=>1,'™'=>1,'ℤ'=>1,'Ω'=>1,'ℨ'=>1,'K'=>1,'Å'=>1,'ℬ'=>1,'ℭ'=>1,'ℯ'=>1,'ℰ'=>1,'ℱ'=>1,'ℳ'=>1,'ℴ'=>1,'ℵ'=>1,'ℶ'=>1,'ℷ'=>1,'ℸ'=>1,'ℹ'=>1,'℻'=>1,'ℼ'=>1,'ℽ'=>1,'ℾ'=>1,'ℿ'=>1,'⅀'=>1,'ⅅ'=>1,'ⅆ'=>1,'ⅇ'=>1,'ⅈ'=>1,'ⅉ'=>1,'⅓'=>1,'⅔'=>1,'⅕'=>1,'⅖'=>1,'⅗'=>1,'⅘'=>1,'⅙'=>1,'⅚'=>1,'⅛'=>1,'⅜'=>1,'⅝'=>1,'⅞'=>1,'⅟'=>1,'Ⅰ'=>1,'Ⅱ'=>1,'Ⅲ'=>1,'Ⅳ'=>1,'Ⅴ'=>1,'Ⅵ'=>1,'Ⅶ'=>1,'Ⅷ'=>1,'Ⅸ'=>1,'Ⅹ'=>1,'Ⅺ'=>1,'Ⅻ'=>1,'Ⅼ'=>1,'Ⅽ'=>1,'Ⅾ'=>1,'Ⅿ'=>1,'ⅰ'=>1,'ⅱ'=>1,'ⅲ'=>1,'ⅳ'=>1,'ⅴ'=>1,'ⅵ'=>1,'ⅶ'=>1,'ⅷ'=>1,'ⅸ'=>1,'ⅹ'=>1,'ⅺ'=>1,'ⅻ'=>1,'ⅼ'=>1,'ⅽ'=>1,'ⅾ'=>1,'ⅿ'=>1,'∬'=>1,'∭'=>1,'∯'=>1,'∰'=>1,'〈'=>1,'〉'=>1,'①'=>1,'②'=>1,'③'=>1,'④'=>1,'⑤'=>1,'⑥'=>1,'⑦'=>1,'⑧'=>1,'⑨'=>1,'⑩'=>1,'⑪'=>1,'⑫'=>1,'⑬'=>1,'⑭'=>1,'⑮'=>1,'⑯'=>1,'⑰'=>1,'⑱'=>1,'⑲'=>1,'⑳'=>1,'⑴'=>1,'⑵'=>1,'⑶'=>1,'⑷'=>1,'⑸'=>1,'⑹'=>1,'⑺'=>1,'⑻'=>1,'⑼'=>1,'⑽'=>1,'⑾'=>1,'⑿'=>1,'⒀'=>1,'⒁'=>1,'⒂'=>1,'⒃'=>1,'⒄'=>1,'⒅'=>1,'⒆'=>1,'⒇'=>1,'⒈'=>1,'⒉'=>1,'⒊'=>1,'⒋'=>1,'⒌'=>1,'⒍'=>1,'⒎'=>1,'⒏'=>1,'⒐'=>1,'⒑'=>1,'⒒'=>1,'⒓'=>1,'⒔'=>1,'⒕'=>1,'⒖'=>1,'⒗'=>1,'⒘'=>1,'⒙'=>1,'⒚'=>1,'⒛'=>1,'⒜'=>1,'⒝'=>1,'⒞'=>1,'⒟'=>1,'⒠'=>1,'⒡'=>1,'⒢'=>1,'⒣'=>1,'⒤'=>1,'⒥'=>1,'⒦'=>1,'⒧'=>1,'⒨'=>1,'⒩'=>1,'⒪'=>1,'⒫'=>1,'⒬'=>1,'⒭'=>1,'⒮'=>1,'⒯'=>1,'⒰'=>1,'⒱'=>1,'⒲'=>1,'⒳'=>1,'⒴'=>1,'⒵'=>1,'Ⓐ'=>1,'Ⓑ'=>1,'Ⓒ'=>1,'Ⓓ'=>1,'Ⓔ'=>1,'Ⓕ'=>1,'Ⓖ'=>1,'Ⓗ'=>1,'Ⓘ'=>1,'Ⓙ'=>1,'Ⓚ'=>1,'Ⓛ'=>1,'Ⓜ'=>1,'Ⓝ'=>1,'Ⓞ'=>1,'Ⓟ'=>1,'Ⓠ'=>1,'Ⓡ'=>1,'Ⓢ'=>1,'Ⓣ'=>1,'Ⓤ'=>1,'Ⓥ'=>1,'Ⓦ'=>1,'Ⓧ'=>1,'Ⓨ'=>1,'Ⓩ'=>1,'ⓐ'=>1,'ⓑ'=>1,'ⓒ'=>1,'ⓓ'=>1,'ⓔ'=>1,'ⓕ'=>1,'ⓖ'=>1,'ⓗ'=>1,'ⓘ'=>1,'ⓙ'=>1,'ⓚ'=>1,'ⓛ'=>1,'ⓜ'=>1,'ⓝ'=>1,'ⓞ'=>1,'ⓟ'=>1,'ⓠ'=>1,'ⓡ'=>1,'ⓢ'=>1,'ⓣ'=>1,'ⓤ'=>1,'ⓥ'=>1,'ⓦ'=>1,'ⓧ'=>1,'ⓨ'=>1,'ⓩ'=>1,'⓪'=>1,'⨌'=>1,'⩴'=>1,'⩵'=>1,'⩶'=>1,'⫝̸'=>1,'ⵯ'=>1,'⺟'=>1,'⻳'=>1,'⼀'=>1,'⼁'=>1,'⼂'=>1,'⼃'=>1,'⼄'=>1,'⼅'=>1,'⼆'=>1,'⼇'=>1,'⼈'=>1,'⼉'=>1,'⼊'=>1,'⼋'=>1,'⼌'=>1,'⼍'=>1,'⼎'=>1,'⼏'=>1,'⼐'=>1,'⼑'=>1,'⼒'=>1,'⼓'=>1,'⼔'=>1,'⼕'=>1,'⼖'=>1,'⼗'=>1,'⼘'=>1,'⼙'=>1,'⼚'=>1,'⼛'=>1,'⼜'=>1,'⼝'=>1,'⼞'=>1,'⼟'=>1,'⼠'=>1,'⼡'=>1,'⼢'=>1,'⼣'=>1,'⼤'=>1,'⼥'=>1,'⼦'=>1,'⼧'=>1,'⼨'=>1,'⼩'=>1,'⼪'=>1,'⼫'=>1,'⼬'=>1,'⼭'=>1,'⼮'=>1,'⼯'=>1,'⼰'=>1,'⼱'=>1,'⼲'=>1,'⼳'=>1,'⼴'=>1,'⼵'=>1,'⼶'=>1,'⼷'=>1,'⼸'=>1,'⼹'=>1,'⼺'=>1,'⼻'=>1,'⼼'=>1,'⼽'=>1,'⼾'=>1,'⼿'=>1,'⽀'=>1,'⽁'=>1,'⽂'=>1,'⽃'=>1,'⽄'=>1,'⽅'=>1,'⽆'=>1,'⽇'=>1,'⽈'=>1,'⽉'=>1,'⽊'=>1,'⽋'=>1,'⽌'=>1,'⽍'=>1,'⽎'=>1,'⽏'=>1,'⽐'=>1,'⽑'=>1,'⽒'=>1,'⽓'=>1,'⽔'=>1,'⽕'=>1,'⽖'=>1,'⽗'=>1,'⽘'=>1,'⽙'=>1,'⽚'=>1,'⽛'=>1,'⽜'=>1,'⽝'=>1,'⽞'=>1,'⽟'=>1,'⽠'=>1,'⽡'=>1,'⽢'=>1,'⽣'=>1,'⽤'=>1,'⽥'=>1,'⽦'=>1,'⽧'=>1,'⽨'=>1,'⽩'=>1,'⽪'=>1,'⽫'=>1,'⽬'=>1,'⽭'=>1,'⽮'=>1,'⽯'=>1,'⽰'=>1,'⽱'=>1,'⽲'=>1,'⽳'=>1,'⽴'=>1,'⽵'=>1,'⽶'=>1,'⽷'=>1,'⽸'=>1,'⽹'=>1,'⽺'=>1,'⽻'=>1,'⽼'=>1,'⽽'=>1,'⽾'=>1,'⽿'=>1,'⾀'=>1,'⾁'=>1,'⾂'=>1,'⾃'=>1,'⾄'=>1,'⾅'=>1,'⾆'=>1,'⾇'=>1,'⾈'=>1,'⾉'=>1,'⾊'=>1,'⾋'=>1,'⾌'=>1,'⾍'=>1,'⾎'=>1,'⾏'=>1,'⾐'=>1,'⾑'=>1,'⾒'=>1,'⾓'=>1,'⾔'=>1,'⾕'=>1,'⾖'=>1,'⾗'=>1,'⾘'=>1,'⾙'=>1,'⾚'=>1,'⾛'=>1,'⾜'=>1,'⾝'=>1,'⾞'=>1,'⾟'=>1,'⾠'=>1,'⾡'=>1,'⾢'=>1,'⾣'=>1,'⾤'=>1,'⾥'=>1,'⾦'=>1,'⾧'=>1,'⾨'=>1,'⾩'=>1,'⾪'=>1,'⾫'=>1,'⾬'=>1,'⾭'=>1,'⾮'=>1,'⾯'=>1,'⾰'=>1,'⾱'=>1,'⾲'=>1,'⾳'=>1,'⾴'=>1,'⾵'=>1,'⾶'=>1,'⾷'=>1,'⾸'=>1,'⾹'=>1,'⾺'=>1,'⾻'=>1,'⾼'=>1,'⾽'=>1,'⾾'=>1,'⾿'=>1,'⿀'=>1,'⿁'=>1,'⿂'=>1,'⿃'=>1,'⿄'=>1,'⿅'=>1,'⿆'=>1,'⿇'=>1,'⿈'=>1,'⿉'=>1,'⿊'=>1,'⿋'=>1,'⿌'=>1,'⿍'=>1,'⿎'=>1,'⿏'=>1,'⿐'=>1,'⿑'=>1,'⿒'=>1,'⿓'=>1,'⿔'=>1,'⿕'=>1,' '=>1,'〶'=>1,'〸'=>1,'〹'=>1,'〺'=>1,'゛'=>1,'゜'=>1,'ゟ'=>1,'ヿ'=>1,'ㄱ'=>1,'ㄲ'=>1,'ㄳ'=>1,'ㄴ'=>1,'ㄵ'=>1,'ㄶ'=>1,'ㄷ'=>1,'ㄸ'=>1,'ㄹ'=>1,'ㄺ'=>1,'ㄻ'=>1,'ㄼ'=>1,'ㄽ'=>1,'ㄾ'=>1,'ㄿ'=>1,'ㅀ'=>1,'ㅁ'=>1,'ㅂ'=>1,'ㅃ'=>1,'ㅄ'=>1,'ㅅ'=>1,'ㅆ'=>1,'ㅇ'=>1,'ㅈ'=>1,'ㅉ'=>1,'ㅊ'=>1,'ㅋ'=>1,'ㅌ'=>1,'ㅍ'=>1,'ㅎ'=>1,'ㅏ'=>1,'ㅐ'=>1,'ㅑ'=>1,'ㅒ'=>1,'ㅓ'=>1,'ㅔ'=>1,'ㅕ'=>1,'ㅖ'=>1,'ㅗ'=>1,'ㅘ'=>1,'ㅙ'=>1,'ㅚ'=>1,'ㅛ'=>1,'ㅜ'=>1,'ㅝ'=>1,'ㅞ'=>1,'ㅟ'=>1,'ㅠ'=>1,'ㅡ'=>1,'ㅢ'=>1,'ㅣ'=>1,'ㅤ'=>1,'ㅥ'=>1,'ㅦ'=>1,'ㅧ'=>1,'ㅨ'=>1,'ㅩ'=>1,'ㅪ'=>1,'ㅫ'=>1,'ㅬ'=>1,'ㅭ'=>1,'ㅮ'=>1,'ㅯ'=>1,'ㅰ'=>1,'ㅱ'=>1,'ㅲ'=>1,'ㅳ'=>1,'ㅴ'=>1,'ㅵ'=>1,'ㅶ'=>1,'ㅷ'=>1,'ㅸ'=>1,'ㅹ'=>1,'ㅺ'=>1,'ㅻ'=>1,'ㅼ'=>1,'ㅽ'=>1,'ㅾ'=>1,'ㅿ'=>1,'ㆀ'=>1,'ㆁ'=>1,'ㆂ'=>1,'ㆃ'=>1,'ㆄ'=>1,'ㆅ'=>1,'ㆆ'=>1,'ㆇ'=>1,'ㆈ'=>1,'ㆉ'=>1,'ㆊ'=>1,'ㆋ'=>1,'ㆌ'=>1,'ㆍ'=>1,'ㆎ'=>1,'㆒'=>1,'㆓'=>1,'㆔'=>1,'㆕'=>1,'㆖'=>1,'㆗'=>1,'㆘'=>1,'㆙'=>1,'㆚'=>1,'㆛'=>1,'㆜'=>1,'㆝'=>1,'㆞'=>1,'㆟'=>1,'㈀'=>1,'㈁'=>1,'㈂'=>1,'㈃'=>1,'㈄'=>1,'㈅'=>1,'㈆'=>1,'㈇'=>1,'㈈'=>1,'㈉'=>1,'㈊'=>1,'㈋'=>1,'㈌'=>1,'㈍'=>1,'㈎'=>1,'㈏'=>1,'㈐'=>1,'㈑'=>1,'㈒'=>1,'㈓'=>1,'㈔'=>1,'㈕'=>1,'㈖'=>1,'㈗'=>1,'㈘'=>1,'㈙'=>1,'㈚'=>1,'㈛'=>1,'㈜'=>1,'㈝'=>1,'㈞'=>1,'㈠'=>1,'㈡'=>1,'㈢'=>1,'㈣'=>1,'㈤'=>1,'㈥'=>1,'㈦'=>1,'㈧'=>1,'㈨'=>1,'㈩'=>1,'㈪'=>1,'㈫'=>1,'㈬'=>1,'㈭'=>1,'㈮'=>1,'㈯'=>1,'㈰'=>1,'㈱'=>1,'㈲'=>1,'㈳'=>1,'㈴'=>1,'㈵'=>1,'㈶'=>1,'㈷'=>1,'㈸'=>1,'㈹'=>1,'㈺'=>1,'㈻'=>1,'㈼'=>1,'㈽'=>1,'㈾'=>1,'㈿'=>1,'㉀'=>1,'㉁'=>1,'㉂'=>1,'㉃'=>1,'㉐'=>1,'㉑'=>1,'㉒'=>1,'㉓'=>1,'㉔'=>1,'㉕'=>1,'㉖'=>1,'㉗'=>1,'㉘'=>1,'㉙'=>1,'㉚'=>1,'㉛'=>1,'㉜'=>1,'㉝'=>1,'㉞'=>1,'㉟'=>1,'㉠'=>1,'㉡'=>1,'㉢'=>1,'㉣'=>1,'㉤'=>1,'㉥'=>1,'㉦'=>1,'㉧'=>1,'㉨'=>1,'㉩'=>1,'㉪'=>1,'㉫'=>1,'㉬'=>1,'㉭'=>1,'㉮'=>1,'㉯'=>1,'㉰'=>1,'㉱'=>1,'㉲'=>1,'㉳'=>1,'㉴'=>1,'㉵'=>1,'㉶'=>1,'㉷'=>1,'㉸'=>1,'㉹'=>1,'㉺'=>1,'㉻'=>1,'㉼'=>1,'㉽'=>1,'㉾'=>1,'㊀'=>1,'㊁'=>1,'㊂'=>1,'㊃'=>1,'㊄'=>1,'㊅'=>1,'㊆'=>1,'㊇'=>1,'㊈'=>1,'㊉'=>1,'㊊'=>1,'㊋'=>1,'㊌'=>1,'㊍'=>1,'㊎'=>1,'㊏'=>1,'㊐'=>1,'㊑'=>1,'㊒'=>1,'㊓'=>1,'㊔'=>1,'㊕'=>1,'㊖'=>1,'㊗'=>1,'㊘'=>1,'㊙'=>1,'㊚'=>1,'㊛'=>1,'㊜'=>1,'㊝'=>1,'㊞'=>1,'㊟'=>1,'㊠'=>1,'㊡'=>1,'㊢'=>1,'㊣'=>1,'㊤'=>1,'㊥'=>1,'㊦'=>1,'㊧'=>1,'㊨'=>1,'㊩'=>1,'㊪'=>1,'㊫'=>1,'㊬'=>1,'㊭'=>1,'㊮'=>1,'㊯'=>1,'㊰'=>1,'㊱'=>1,'㊲'=>1,'㊳'=>1,'㊴'=>1,'㊵'=>1,'㊶'=>1,'㊷'=>1,'㊸'=>1,'㊹'=>1,'㊺'=>1,'㊻'=>1,'㊼'=>1,'㊽'=>1,'㊾'=>1,'㊿'=>1,'㋀'=>1,'㋁'=>1,'㋂'=>1,'㋃'=>1,'㋄'=>1,'㋅'=>1,'㋆'=>1,'㋇'=>1,'㋈'=>1,'㋉'=>1,'㋊'=>1,'㋋'=>1,'㋌'=>1,'㋍'=>1,'㋎'=>1,'㋏'=>1,'㋐'=>1,'㋑'=>1,'㋒'=>1,'㋓'=>1,'㋔'=>1,'㋕'=>1,'㋖'=>1,'㋗'=>1,'㋘'=>1,'㋙'=>1,'㋚'=>1,'㋛'=>1,'㋜'=>1,'㋝'=>1,'㋞'=>1,'㋟'=>1,'㋠'=>1,'㋡'=>1,'㋢'=>1,'㋣'=>1,'㋤'=>1,'㋥'=>1,'㋦'=>1,'㋧'=>1,'㋨'=>1,'㋩'=>1,'㋪'=>1,'㋫'=>1,'㋬'=>1,'㋭'=>1,'㋮'=>1,'㋯'=>1,'㋰'=>1,'㋱'=>1,'㋲'=>1,'㋳'=>1,'㋴'=>1,'㋵'=>1,'㋶'=>1,'㋷'=>1,'㋸'=>1,'㋹'=>1,'㋺'=>1,'㋻'=>1,'㋼'=>1,'㋽'=>1,'㋾'=>1,'㌀'=>1,'㌁'=>1,'㌂'=>1,'㌃'=>1,'㌄'=>1,'㌅'=>1,'㌆'=>1,'㌇'=>1,'㌈'=>1,'㌉'=>1,'㌊'=>1,'㌋'=>1,'㌌'=>1,'㌍'=>1,'㌎'=>1,'㌏'=>1,'㌐'=>1,'㌑'=>1,'㌒'=>1,'㌓'=>1,'㌔'=>1,'㌕'=>1,'㌖'=>1,'㌗'=>1,'㌘'=>1,'㌙'=>1,'㌚'=>1,'㌛'=>1,'㌜'=>1,'㌝'=>1,'㌞'=>1,'㌟'=>1,'㌠'=>1,'㌡'=>1,'㌢'=>1,'㌣'=>1,'㌤'=>1,'㌥'=>1,'㌦'=>1,'㌧'=>1,'㌨'=>1,'㌩'=>1,'㌪'=>1,'㌫'=>1,'㌬'=>1,'㌭'=>1,'㌮'=>1,'㌯'=>1,'㌰'=>1,'㌱'=>1,'㌲'=>1,'㌳'=>1,'㌴'=>1,'㌵'=>1,'㌶'=>1,'㌷'=>1,'㌸'=>1,'㌹'=>1,'㌺'=>1,'㌻'=>1,'㌼'=>1,'㌽'=>1,'㌾'=>1,'㌿'=>1,'㍀'=>1,'㍁'=>1,'㍂'=>1,'㍃'=>1,'㍄'=>1,'㍅'=>1,'㍆'=>1,'㍇'=>1,'㍈'=>1,'㍉'=>1,'㍊'=>1,'㍋'=>1,'㍌'=>1,'㍍'=>1,'㍎'=>1,'㍏'=>1,'㍐'=>1,'㍑'=>1,'㍒'=>1,'㍓'=>1,'㍔'=>1,'㍕'=>1,'㍖'=>1,'㍗'=>1,'㍘'=>1,'㍙'=>1,'㍚'=>1,'㍛'=>1,'㍜'=>1,'㍝'=>1,'㍞'=>1,'㍟'=>1,'㍠'=>1,'㍡'=>1,'㍢'=>1,'㍣'=>1,'㍤'=>1,'㍥'=>1,'㍦'=>1,'㍧'=>1,'㍨'=>1,'㍩'=>1,'㍪'=>1,'㍫'=>1,'㍬'=>1,'㍭'=>1,'㍮'=>1,'㍯'=>1,'㍰'=>1,'㍱'=>1,'㍲'=>1,'㍳'=>1,'㍴'=>1,'㍵'=>1,'㍶'=>1,'㍷'=>1,'㍸'=>1,'㍹'=>1,'㍺'=>1,'㍻'=>1,'㍼'=>1,'㍽'=>1,'㍾'=>1,'㍿'=>1,'㎀'=>1,'㎁'=>1,'㎂'=>1,'㎃'=>1,'㎄'=>1,'㎅'=>1,'㎆'=>1,'㎇'=>1,'㎈'=>1,'㎉'=>1,'㎊'=>1,'㎋'=>1,'㎌'=>1,'㎍'=>1,'㎎'=>1,'㎏'=>1,'㎐'=>1,'㎑'=>1,'㎒'=>1,'㎓'=>1,'㎔'=>1,'㎕'=>1,'㎖'=>1,'㎗'=>1,'㎘'=>1,'㎙'=>1,'㎚'=>1,'㎛'=>1,'㎜'=>1,'㎝'=>1,'㎞'=>1,'㎟'=>1,'㎠'=>1,'㎡'=>1,'㎢'=>1,'㎣'=>1,'㎤'=>1,'㎥'=>1,'㎦'=>1,'㎧'=>1,'㎨'=>1,'㎩'=>1,'㎪'=>1,'㎫'=>1,'㎬'=>1,'㎭'=>1,'㎮'=>1,'㎯'=>1,'㎰'=>1,'㎱'=>1,'㎲'=>1,'㎳'=>1,'㎴'=>1,'㎵'=>1,'㎶'=>1,'㎷'=>1,'㎸'=>1,'㎹'=>1,'㎺'=>1,'㎻'=>1,'㎼'=>1,'㎽'=>1,'㎾'=>1,'㎿'=>1,'㏀'=>1,'㏁'=>1,'㏂'=>1,'㏃'=>1,'㏄'=>1,'㏅'=>1,'㏆'=>1,'㏇'=>1,'㏈'=>1,'㏉'=>1,'㏊'=>1,'㏋'=>1,'㏌'=>1,'㏍'=>1,'㏎'=>1,'㏏'=>1,'㏐'=>1,'㏑'=>1,'㏒'=>1,'㏓'=>1,'㏔'=>1,'㏕'=>1,'㏖'=>1,'㏗'=>1,'㏘'=>1,'㏙'=>1,'㏚'=>1,'㏛'=>1,'㏜'=>1,'㏝'=>1,'㏞'=>1,'㏟'=>1,'㏠'=>1,'㏡'=>1,'㏢'=>1,'㏣'=>1,'㏤'=>1,'㏥'=>1,'㏦'=>1,'㏧'=>1,'㏨'=>1,'㏩'=>1,'㏪'=>1,'㏫'=>1,'㏬'=>1,'㏭'=>1,'㏮'=>1,'㏯'=>1,'㏰'=>1,'㏱'=>1,'㏲'=>1,'㏳'=>1,'㏴'=>1,'㏵'=>1,'㏶'=>1,'㏷'=>1,'㏸'=>1,'㏹'=>1,'㏺'=>1,'㏻'=>1,'㏼'=>1,'㏽'=>1,'㏾'=>1,'㏿'=>1,'豈'=>1,'更'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'懶'=>1,'癩'=>1,'羅'=>1,'蘿'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'欄'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'來'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'論'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'淚'=>1,'漏'=>1,'累'=>1,'縷'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'諾'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'省'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'女'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'轢'=>1,'年'=>1,'憐'=>1,'戀'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'劣'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'玲'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'燎'=>1,'療'=>1,'蓼'=>1,'遼'=>1,'龍'=>1,'暈'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'流'=>1,'溜'=>1,'琉'=>1,'留'=>1,'硫'=>1,'紐'=>1,'類'=>1,'六'=>1,'戮'=>1,'陸'=>1,'倫'=>1,'崙'=>1,'淪'=>1,'輪'=>1,'律'=>1,'慄'=>1,'栗'=>1,'率'=>1,'隆'=>1,'利'=>1,'吏'=>1,'履'=>1,'易'=>1,'李'=>1,'梨'=>1,'泥'=>1,'理'=>1,'痢'=>1,'罹'=>1,'裏'=>1,'裡'=>1,'里'=>1,'離'=>1,'匿'=>1,'溺'=>1,'吝'=>1,'燐'=>1,'璘'=>1,'藺'=>1,'隣'=>1,'鱗'=>1,'麟'=>1,'林'=>1,'淋'=>1,'臨'=>1,'立'=>1,'笠'=>1,'粒'=>1,'狀'=>1,'炙'=>1,'識'=>1,'什'=>1,'茶'=>1,'刺'=>1,'切'=>1,'度'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'嗀'=>1,'塚'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'精'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'鶴'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'懲'=>1,'敏'=>1,'既'=>1,'暑'=>1,'梅'=>1,'海'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'碑'=>1,'社'=>1,'祉'=>1,'祈'=>1,'祐'=>1,'祖'=>1,'祝'=>1,'禍'=>1,'禎'=>1,'穀'=>1,'突'=>1,'節'=>1,'練'=>1,'縉'=>1,'繁'=>1,'署'=>1,'者'=>1,'臭'=>1,'艹'=>1,'艹'=>1,'著'=>1,'褐'=>1,'視'=>1,'謁'=>1,'謹'=>1,'賓'=>1,'贈'=>1,'辶'=>1,'逸'=>1,'難'=>1,'響'=>1,'頻'=>1,'並'=>1,'况'=>1,'全'=>1,'侀'=>1,'充'=>1,'冀'=>1,'勇'=>1,'勺'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'嗢'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'奔'=>1,'婢'=>1,'嬨'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'揄'=>1,'搜'=>1,'摒'=>1,'敖'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'瞧'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'節'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'變'=>1,'贈'=>1,'輸'=>1,'遲'=>1,'醙'=>1,'鉶'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'頋'=>1,'頻'=>1,'鬒'=>1,'龜'=>1,'𢡊'=>1,'𢡄'=>1,'𣏕'=>1,'㮝'=>1,'䀘'=>1,'䀹'=>1,'𥉉'=>1,'𥳐'=>1,'𧻓'=>1,'齃'=>1,'龎'=>1,'ff'=>1,'fi'=>1,'fl'=>1,'ffi'=>1,'ffl'=>1,'ſt'=>1,'st'=>1,'ﬓ'=>1,'ﬔ'=>1,'ﬕ'=>1,'ﬖ'=>1,'ﬗ'=>1,'יִ'=>1,'ײַ'=>1,'ﬠ'=>1,'ﬡ'=>1,'ﬢ'=>1,'ﬣ'=>1,'ﬤ'=>1,'ﬥ'=>1,'ﬦ'=>1,'ﬧ'=>1,'ﬨ'=>1,'﬩'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'שּׂ'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'נּ'=>1,'סּ'=>1,'ףּ'=>1,'פּ'=>1,'צּ'=>1,'קּ'=>1,'רּ'=>1,'שּ'=>1,'תּ'=>1,'וֹ'=>1,'בֿ'=>1,'כֿ'=>1,'פֿ'=>1,'ﭏ'=>1,'ﭐ'=>1,'ﭑ'=>1,'ﭒ'=>1,'ﭓ'=>1,'ﭔ'=>1,'ﭕ'=>1,'ﭖ'=>1,'ﭗ'=>1,'ﭘ'=>1,'ﭙ'=>1,'ﭚ'=>1,'ﭛ'=>1,'ﭜ'=>1,'ﭝ'=>1,'ﭞ'=>1,'ﭟ'=>1,'ﭠ'=>1,'ﭡ'=>1,'ﭢ'=>1,'ﭣ'=>1,'ﭤ'=>1,'ﭥ'=>1,'ﭦ'=>1,'ﭧ'=>1,'ﭨ'=>1,'ﭩ'=>1,'ﭪ'=>1,'ﭫ'=>1,'ﭬ'=>1,'ﭭ'=>1,'ﭮ'=>1,'ﭯ'=>1,'ﭰ'=>1,'ﭱ'=>1,'ﭲ'=>1,'ﭳ'=>1,'ﭴ'=>1,'ﭵ'=>1,'ﭶ'=>1,'ﭷ'=>1,'ﭸ'=>1,'ﭹ'=>1,'ﭺ'=>1,'ﭻ'=>1,'ﭼ'=>1,'ﭽ'=>1,'ﭾ'=>1,'ﭿ'=>1,'ﮀ'=>1,'ﮁ'=>1,'ﮂ'=>1,'ﮃ'=>1,'ﮄ'=>1,'ﮅ'=>1,'ﮆ'=>1,'ﮇ'=>1,'ﮈ'=>1,'ﮉ'=>1,'ﮊ'=>1,'ﮋ'=>1,'ﮌ'=>1,'ﮍ'=>1,'ﮎ'=>1,'ﮏ'=>1,'ﮐ'=>1,'ﮑ'=>1,'ﮒ'=>1,'ﮓ'=>1,'ﮔ'=>1,'ﮕ'=>1,'ﮖ'=>1,'ﮗ'=>1,'ﮘ'=>1,'ﮙ'=>1,'ﮚ'=>1,'ﮛ'=>1,'ﮜ'=>1,'ﮝ'=>1,'ﮞ'=>1,'ﮟ'=>1,'ﮠ'=>1,'ﮡ'=>1,'ﮢ'=>1,'ﮣ'=>1,'ﮤ'=>1,'ﮥ'=>1,'ﮦ'=>1,'ﮧ'=>1,'ﮨ'=>1,'ﮩ'=>1,'ﮪ'=>1,'ﮫ'=>1,'ﮬ'=>1,'ﮭ'=>1,'ﮮ'=>1,'ﮯ'=>1,'ﮰ'=>1,'ﮱ'=>1,'ﯓ'=>1,'ﯔ'=>1,'ﯕ'=>1,'ﯖ'=>1,'ﯗ'=>1,'ﯘ'=>1,'ﯙ'=>1,'ﯚ'=>1,'ﯛ'=>1,'ﯜ'=>1,'ﯝ'=>1,'ﯞ'=>1,'ﯟ'=>1,'ﯠ'=>1,'ﯡ'=>1,'ﯢ'=>1,'ﯣ'=>1,'ﯤ'=>1,'ﯥ'=>1,'ﯦ'=>1,'ﯧ'=>1,'ﯨ'=>1,'ﯩ'=>1,'ﯪ'=>1,'ﯫ'=>1,'ﯬ'=>1,'ﯭ'=>1,'ﯮ'=>1,'ﯯ'=>1,'ﯰ'=>1,'ﯱ'=>1,'ﯲ'=>1,'ﯳ'=>1,'ﯴ'=>1,'ﯵ'=>1,'ﯶ'=>1,'ﯷ'=>1,'ﯸ'=>1,'ﯹ'=>1,'ﯺ'=>1,'ﯻ'=>1,'ﯼ'=>1,'ﯽ'=>1,'ﯾ'=>1,'ﯿ'=>1,'ﰀ'=>1,'ﰁ'=>1,'ﰂ'=>1,'ﰃ'=>1,'ﰄ'=>1,'ﰅ'=>1,'ﰆ'=>1,'ﰇ'=>1,'ﰈ'=>1,'ﰉ'=>1,'ﰊ'=>1,'ﰋ'=>1,'ﰌ'=>1,'ﰍ'=>1,'ﰎ'=>1,'ﰏ'=>1,'ﰐ'=>1,'ﰑ'=>1,'ﰒ'=>1,'ﰓ'=>1,'ﰔ'=>1,'ﰕ'=>1,'ﰖ'=>1,'ﰗ'=>1,'ﰘ'=>1,'ﰙ'=>1,'ﰚ'=>1,'ﰛ'=>1,'ﰜ'=>1,'ﰝ'=>1,'ﰞ'=>1,'ﰟ'=>1,'ﰠ'=>1,'ﰡ'=>1,'ﰢ'=>1,'ﰣ'=>1,'ﰤ'=>1,'ﰥ'=>1,'ﰦ'=>1,'ﰧ'=>1,'ﰨ'=>1,'ﰩ'=>1,'ﰪ'=>1,'ﰫ'=>1,'ﰬ'=>1,'ﰭ'=>1,'ﰮ'=>1,'ﰯ'=>1,'ﰰ'=>1,'ﰱ'=>1,'ﰲ'=>1,'ﰳ'=>1,'ﰴ'=>1,'ﰵ'=>1,'ﰶ'=>1,'ﰷ'=>1,'ﰸ'=>1,'ﰹ'=>1,'ﰺ'=>1,'ﰻ'=>1,'ﰼ'=>1,'ﰽ'=>1,'ﰾ'=>1,'ﰿ'=>1,'ﱀ'=>1,'ﱁ'=>1,'ﱂ'=>1,'ﱃ'=>1,'ﱄ'=>1,'ﱅ'=>1,'ﱆ'=>1,'ﱇ'=>1,'ﱈ'=>1,'ﱉ'=>1,'ﱊ'=>1,'ﱋ'=>1,'ﱌ'=>1,'ﱍ'=>1,'ﱎ'=>1,'ﱏ'=>1,'ﱐ'=>1,'ﱑ'=>1,'ﱒ'=>1,'ﱓ'=>1,'ﱔ'=>1,'ﱕ'=>1,'ﱖ'=>1,'ﱗ'=>1,'ﱘ'=>1,'ﱙ'=>1,'ﱚ'=>1,'ﱛ'=>1,'ﱜ'=>1,'ﱝ'=>1,'ﱞ'=>1,'ﱟ'=>1,'ﱠ'=>1,'ﱡ'=>1,'ﱢ'=>1,'ﱣ'=>1,'ﱤ'=>1,'ﱥ'=>1,'ﱦ'=>1,'ﱧ'=>1,'ﱨ'=>1,'ﱩ'=>1,'ﱪ'=>1,'ﱫ'=>1,'ﱬ'=>1,'ﱭ'=>1,'ﱮ'=>1,'ﱯ'=>1,'ﱰ'=>1,'ﱱ'=>1,'ﱲ'=>1,'ﱳ'=>1,'ﱴ'=>1,'ﱵ'=>1,'ﱶ'=>1,'ﱷ'=>1,'ﱸ'=>1,'ﱹ'=>1,'ﱺ'=>1,'ﱻ'=>1,'ﱼ'=>1,'ﱽ'=>1,'ﱾ'=>1,'ﱿ'=>1,'ﲀ'=>1,'ﲁ'=>1,'ﲂ'=>1,'ﲃ'=>1,'ﲄ'=>1,'ﲅ'=>1,'ﲆ'=>1,'ﲇ'=>1,'ﲈ'=>1,'ﲉ'=>1,'ﲊ'=>1,'ﲋ'=>1,'ﲌ'=>1,'ﲍ'=>1,'ﲎ'=>1,'ﲏ'=>1,'ﲐ'=>1,'ﲑ'=>1,'ﲒ'=>1,'ﲓ'=>1,'ﲔ'=>1,'ﲕ'=>1,'ﲖ'=>1,'ﲗ'=>1,'ﲘ'=>1,'ﲙ'=>1,'ﲚ'=>1,'ﲛ'=>1,'ﲜ'=>1,'ﲝ'=>1,'ﲞ'=>1,'ﲟ'=>1,'ﲠ'=>1,'ﲡ'=>1,'ﲢ'=>1,'ﲣ'=>1,'ﲤ'=>1,'ﲥ'=>1,'ﲦ'=>1,'ﲧ'=>1,'ﲨ'=>1,'ﲩ'=>1,'ﲪ'=>1,'ﲫ'=>1,'ﲬ'=>1,'ﲭ'=>1,'ﲮ'=>1,'ﲯ'=>1,'ﲰ'=>1,'ﲱ'=>1,'ﲲ'=>1,'ﲳ'=>1,'ﲴ'=>1,'ﲵ'=>1,'ﲶ'=>1,'ﲷ'=>1,'ﲸ'=>1,'ﲹ'=>1,'ﲺ'=>1,'ﲻ'=>1,'ﲼ'=>1,'ﲽ'=>1,'ﲾ'=>1,'ﲿ'=>1,'ﳀ'=>1,'ﳁ'=>1,'ﳂ'=>1,'ﳃ'=>1,'ﳄ'=>1,'ﳅ'=>1,'ﳆ'=>1,'ﳇ'=>1,'ﳈ'=>1,'ﳉ'=>1,'ﳊ'=>1,'ﳋ'=>1,'ﳌ'=>1,'ﳍ'=>1,'ﳎ'=>1,'ﳏ'=>1,'ﳐ'=>1,'ﳑ'=>1,'ﳒ'=>1,'ﳓ'=>1,'ﳔ'=>1,'ﳕ'=>1,'ﳖ'=>1,'ﳗ'=>1,'ﳘ'=>1,'ﳙ'=>1,'ﳚ'=>1,'ﳛ'=>1,'ﳜ'=>1,'ﳝ'=>1,'ﳞ'=>1,'ﳟ'=>1,'ﳠ'=>1,'ﳡ'=>1,'ﳢ'=>1,'ﳣ'=>1,'ﳤ'=>1,'ﳥ'=>1,'ﳦ'=>1,'ﳧ'=>1,'ﳨ'=>1,'ﳩ'=>1,'ﳪ'=>1,'ﳫ'=>1,'ﳬ'=>1,'ﳭ'=>1,'ﳮ'=>1,'ﳯ'=>1,'ﳰ'=>1,'ﳱ'=>1,'ﳲ'=>1,'ﳳ'=>1,'ﳴ'=>1,'ﳵ'=>1,'ﳶ'=>1,'ﳷ'=>1,'ﳸ'=>1,'ﳹ'=>1,'ﳺ'=>1,'ﳻ'=>1,'ﳼ'=>1,'ﳽ'=>1,'ﳾ'=>1,'ﳿ'=>1,'ﴀ'=>1,'ﴁ'=>1,'ﴂ'=>1,'ﴃ'=>1,'ﴄ'=>1,'ﴅ'=>1,'ﴆ'=>1,'ﴇ'=>1,'ﴈ'=>1,'ﴉ'=>1,'ﴊ'=>1,'ﴋ'=>1,'ﴌ'=>1,'ﴍ'=>1,'ﴎ'=>1,'ﴏ'=>1,'ﴐ'=>1,'ﴑ'=>1,'ﴒ'=>1,'ﴓ'=>1,'ﴔ'=>1,'ﴕ'=>1,'ﴖ'=>1,'ﴗ'=>1,'ﴘ'=>1,'ﴙ'=>1,'ﴚ'=>1,'ﴛ'=>1,'ﴜ'=>1,'ﴝ'=>1,'ﴞ'=>1,'ﴟ'=>1,'ﴠ'=>1,'ﴡ'=>1,'ﴢ'=>1,'ﴣ'=>1,'ﴤ'=>1,'ﴥ'=>1,'ﴦ'=>1,'ﴧ'=>1,'ﴨ'=>1,'ﴩ'=>1,'ﴪ'=>1,'ﴫ'=>1,'ﴬ'=>1,'ﴭ'=>1,'ﴮ'=>1,'ﴯ'=>1,'ﴰ'=>1,'ﴱ'=>1,'ﴲ'=>1,'ﴳ'=>1,'ﴴ'=>1,'ﴵ'=>1,'ﴶ'=>1,'ﴷ'=>1,'ﴸ'=>1,'ﴹ'=>1,'ﴺ'=>1,'ﴻ'=>1,'ﴼ'=>1,'ﴽ'=>1,'ﵐ'=>1,'ﵑ'=>1,'ﵒ'=>1,'ﵓ'=>1,'ﵔ'=>1,'ﵕ'=>1,'ﵖ'=>1,'ﵗ'=>1,'ﵘ'=>1,'ﵙ'=>1,'ﵚ'=>1,'ﵛ'=>1,'ﵜ'=>1,'ﵝ'=>1,'ﵞ'=>1,'ﵟ'=>1,'ﵠ'=>1,'ﵡ'=>1,'ﵢ'=>1,'ﵣ'=>1,'ﵤ'=>1,'ﵥ'=>1,'ﵦ'=>1,'ﵧ'=>1,'ﵨ'=>1,'ﵩ'=>1,'ﵪ'=>1,'ﵫ'=>1,'ﵬ'=>1,'ﵭ'=>1,'ﵮ'=>1,'ﵯ'=>1,'ﵰ'=>1,'ﵱ'=>1,'ﵲ'=>1,'ﵳ'=>1,'ﵴ'=>1,'ﵵ'=>1,'ﵶ'=>1,'ﵷ'=>1,'ﵸ'=>1,'ﵹ'=>1,'ﵺ'=>1,'ﵻ'=>1,'ﵼ'=>1,'ﵽ'=>1,'ﵾ'=>1,'ﵿ'=>1,'ﶀ'=>1,'ﶁ'=>1,'ﶂ'=>1,'ﶃ'=>1,'ﶄ'=>1,'ﶅ'=>1,'ﶆ'=>1,'ﶇ'=>1,'ﶈ'=>1,'ﶉ'=>1,'ﶊ'=>1,'ﶋ'=>1,'ﶌ'=>1,'ﶍ'=>1,'ﶎ'=>1,'ﶏ'=>1,'ﶒ'=>1,'ﶓ'=>1,'ﶔ'=>1,'ﶕ'=>1,'ﶖ'=>1,'ﶗ'=>1,'ﶘ'=>1,'ﶙ'=>1,'ﶚ'=>1,'ﶛ'=>1,'ﶜ'=>1,'ﶝ'=>1,'ﶞ'=>1,'ﶟ'=>1,'ﶠ'=>1,'ﶡ'=>1,'ﶢ'=>1,'ﶣ'=>1,'ﶤ'=>1,'ﶥ'=>1,'ﶦ'=>1,'ﶧ'=>1,'ﶨ'=>1,'ﶩ'=>1,'ﶪ'=>1,'ﶫ'=>1,'ﶬ'=>1,'ﶭ'=>1,'ﶮ'=>1,'ﶯ'=>1,'ﶰ'=>1,'ﶱ'=>1,'ﶲ'=>1,'ﶳ'=>1,'ﶴ'=>1,'ﶵ'=>1,'ﶶ'=>1,'ﶷ'=>1,'ﶸ'=>1,'ﶹ'=>1,'ﶺ'=>1,'ﶻ'=>1,'ﶼ'=>1,'ﶽ'=>1,'ﶾ'=>1,'ﶿ'=>1,'ﷀ'=>1,'ﷁ'=>1,'ﷂ'=>1,'ﷃ'=>1,'ﷄ'=>1,'ﷅ'=>1,'ﷆ'=>1,'ﷇ'=>1,'ﷰ'=>1,'ﷱ'=>1,'ﷲ'=>1,'ﷳ'=>1,'ﷴ'=>1,'ﷵ'=>1,'ﷶ'=>1,'ﷷ'=>1,'ﷸ'=>1,'ﷹ'=>1,'ﷺ'=>1,'ﷻ'=>1,'﷼'=>1,'︐'=>1,'︑'=>1,'︒'=>1,'︓'=>1,'︔'=>1,'︕'=>1,'︖'=>1,'︗'=>1,'︘'=>1,'︙'=>1,'︰'=>1,'︱'=>1,'︲'=>1,'︳'=>1,'︴'=>1,'︵'=>1,'︶'=>1,'︷'=>1,'︸'=>1,'︹'=>1,'︺'=>1,'︻'=>1,'︼'=>1,'︽'=>1,'︾'=>1,'︿'=>1,'﹀'=>1,'﹁'=>1,'﹂'=>1,'﹃'=>1,'﹄'=>1,'﹇'=>1,'﹈'=>1,'﹉'=>1,'﹊'=>1,'﹋'=>1,'﹌'=>1,'﹍'=>1,'﹎'=>1,'﹏'=>1,'﹐'=>1,'﹑'=>1,'﹒'=>1,'﹔'=>1,'﹕'=>1,'﹖'=>1,'﹗'=>1,'﹘'=>1,'﹙'=>1,'﹚'=>1,'﹛'=>1,'﹜'=>1,'﹝'=>1,'﹞'=>1,'﹟'=>1,'﹠'=>1,'﹡'=>1,'﹢'=>1,'﹣'=>1,'﹤'=>1,'﹥'=>1,'﹦'=>1,'﹨'=>1,'﹩'=>1,'﹪'=>1,'﹫'=>1,'ﹰ'=>1,'ﹱ'=>1,'ﹲ'=>1,'ﹴ'=>1,'ﹶ'=>1,'ﹷ'=>1,'ﹸ'=>1,'ﹹ'=>1,'ﹺ'=>1,'ﹻ'=>1,'ﹼ'=>1,'ﹽ'=>1,'ﹾ'=>1,'ﹿ'=>1,'ﺀ'=>1,'ﺁ'=>1,'ﺂ'=>1,'ﺃ'=>1,'ﺄ'=>1,'ﺅ'=>1,'ﺆ'=>1,'ﺇ'=>1,'ﺈ'=>1,'ﺉ'=>1,'ﺊ'=>1,'ﺋ'=>1,'ﺌ'=>1,'ﺍ'=>1,'ﺎ'=>1,'ﺏ'=>1,'ﺐ'=>1,'ﺑ'=>1,'ﺒ'=>1,'ﺓ'=>1,'ﺔ'=>1,'ﺕ'=>1,'ﺖ'=>1,'ﺗ'=>1,'ﺘ'=>1,'ﺙ'=>1,'ﺚ'=>1,'ﺛ'=>1,'ﺜ'=>1,'ﺝ'=>1,'ﺞ'=>1,'ﺟ'=>1,'ﺠ'=>1,'ﺡ'=>1,'ﺢ'=>1,'ﺣ'=>1,'ﺤ'=>1,'ﺥ'=>1,'ﺦ'=>1,'ﺧ'=>1,'ﺨ'=>1,'ﺩ'=>1,'ﺪ'=>1,'ﺫ'=>1,'ﺬ'=>1,'ﺭ'=>1,'ﺮ'=>1,'ﺯ'=>1,'ﺰ'=>1,'ﺱ'=>1,'ﺲ'=>1,'ﺳ'=>1,'ﺴ'=>1,'ﺵ'=>1,'ﺶ'=>1,'ﺷ'=>1,'ﺸ'=>1,'ﺹ'=>1,'ﺺ'=>1,'ﺻ'=>1,'ﺼ'=>1,'ﺽ'=>1,'ﺾ'=>1,'ﺿ'=>1,'ﻀ'=>1,'ﻁ'=>1,'ﻂ'=>1,'ﻃ'=>1,'ﻄ'=>1,'ﻅ'=>1,'ﻆ'=>1,'ﻇ'=>1,'ﻈ'=>1,'ﻉ'=>1,'ﻊ'=>1,'ﻋ'=>1,'ﻌ'=>1,'ﻍ'=>1,'ﻎ'=>1,'ﻏ'=>1,'ﻐ'=>1,'ﻑ'=>1,'ﻒ'=>1,'ﻓ'=>1,'ﻔ'=>1,'ﻕ'=>1,'ﻖ'=>1,'ﻗ'=>1,'ﻘ'=>1,'ﻙ'=>1,'ﻚ'=>1,'ﻛ'=>1,'ﻜ'=>1,'ﻝ'=>1,'ﻞ'=>1,'ﻟ'=>1,'ﻠ'=>1,'ﻡ'=>1,'ﻢ'=>1,'ﻣ'=>1,'ﻤ'=>1,'ﻥ'=>1,'ﻦ'=>1,'ﻧ'=>1,'ﻨ'=>1,'ﻩ'=>1,'ﻪ'=>1,'ﻫ'=>1,'ﻬ'=>1,'ﻭ'=>1,'ﻮ'=>1,'ﻯ'=>1,'ﻰ'=>1,'ﻱ'=>1,'ﻲ'=>1,'ﻳ'=>1,'ﻴ'=>1,'ﻵ'=>1,'ﻶ'=>1,'ﻷ'=>1,'ﻸ'=>1,'ﻹ'=>1,'ﻺ'=>1,'ﻻ'=>1,'ﻼ'=>1,'!'=>1,'"'=>1,'#'=>1,'$'=>1,'%'=>1,'&'=>1,'''=>1,'('=>1,')'=>1,'*'=>1,'+'=>1,','=>1,'-'=>1,'.'=>1,'/'=>1,'0'=>1,'1'=>1,'2'=>1,'3'=>1,'4'=>1,'5'=>1,'6'=>1,'7'=>1,'8'=>1,'9'=>1,':'=>1,';'=>1,'<'=>1,'='=>1,'>'=>1,'?'=>1,'@'=>1,'A'=>1,'B'=>1,'C'=>1,'D'=>1,'E'=>1,'F'=>1,'G'=>1,'H'=>1,'I'=>1,'J'=>1,'K'=>1,'L'=>1,'M'=>1,'N'=>1,'O'=>1,'P'=>1,'Q'=>1,'R'=>1,'S'=>1,'T'=>1,'U'=>1,'V'=>1,'W'=>1,'X'=>1,'Y'=>1,'Z'=>1,'['=>1,'\'=>1,']'=>1,'^'=>1,'_'=>1,'`'=>1,'a'=>1,'b'=>1,'c'=>1,'d'=>1,'e'=>1,'f'=>1,'g'=>1,'h'=>1,'i'=>1,'j'=>1,'k'=>1,'l'=>1,'m'=>1,'n'=>1,'o'=>1,'p'=>1,'q'=>1,'r'=>1,'s'=>1,'t'=>1,'u'=>1,'v'=>1,'w'=>1,'x'=>1,'y'=>1,'z'=>1,'{'=>1,'|'=>1,'}'=>1,'~'=>1,'⦅'=>1,'⦆'=>1,'。'=>1,'「'=>1,'」'=>1,'、'=>1,'・'=>1,'ヲ'=>1,'ァ'=>1,'ィ'=>1,'ゥ'=>1,'ェ'=>1,'ォ'=>1,'ャ'=>1,'ュ'=>1,'ョ'=>1,'ッ'=>1,'ー'=>1,'ア'=>1,'イ'=>1,'ウ'=>1,'エ'=>1,'オ'=>1,'カ'=>1,'キ'=>1,'ク'=>1,'ケ'=>1,'コ'=>1,'サ'=>1,'シ'=>1,'ス'=>1,'セ'=>1,'ソ'=>1,'タ'=>1,'チ'=>1,'ツ'=>1,'テ'=>1,'ト'=>1,'ナ'=>1,'ニ'=>1,'ヌ'=>1,'ネ'=>1,'ノ'=>1,'ハ'=>1,'ヒ'=>1,'フ'=>1,'ヘ'=>1,'ホ'=>1,'マ'=>1,'ミ'=>1,'ム'=>1,'メ'=>1,'モ'=>1,'ヤ'=>1,'ユ'=>1,'ヨ'=>1,'ラ'=>1,'リ'=>1,'ル'=>1,'レ'=>1,'ロ'=>1,'ワ'=>1,'ン'=>1,'゙'=>1,'゚'=>1,'ᅠ'=>1,'ᄀ'=>1,'ᄁ'=>1,'ᆪ'=>1,'ᄂ'=>1,'ᆬ'=>1,'ᆭ'=>1,'ᄃ'=>1,'ᄄ'=>1,'ᄅ'=>1,'ᆰ'=>1,'ᆱ'=>1,'ᆲ'=>1,'ᆳ'=>1,'ᆴ'=>1,'ᆵ'=>1,'ᄚ'=>1,'ᄆ'=>1,'ᄇ'=>1,'ᄈ'=>1,'ᄡ'=>1,'ᄉ'=>1,'ᄊ'=>1,'ᄋ'=>1,'ᄌ'=>1,'ᄍ'=>1,'ᄎ'=>1,'ᄏ'=>1,'ᄐ'=>1,'ᄑ'=>1,'ᄒ'=>1,'ᅡ'=>1,'ᅢ'=>1,'ᅣ'=>1,'ᅤ'=>1,'ᅥ'=>1,'ᅦ'=>1,'ᅧ'=>1,'ᅨ'=>1,'ᅩ'=>1,'ᅪ'=>1,'ᅫ'=>1,'ᅬ'=>1,'ᅭ'=>1,'ᅮ'=>1,'ᅯ'=>1,'ᅰ'=>1,'ᅱ'=>1,'ᅲ'=>1,'ᅳ'=>1,'ᅴ'=>1,'ᅵ'=>1,'¢'=>1,'£'=>1,'¬'=>1,' ̄'=>1,'¦'=>1,'¥'=>1,'₩'=>1,'│'=>1,'←'=>1,'↑'=>1,'→'=>1,'↓'=>1,'■'=>1,'○'=>1,'𝅗𝅥'=>1,'𝅘𝅥'=>1,'𝅘𝅥𝅮'=>1,'𝅘𝅥𝅯'=>1,'𝅘𝅥𝅰'=>1,'𝅘𝅥𝅱'=>1,'𝅘𝅥𝅲'=>1,'𝆹𝅥'=>1,'𝆺𝅥'=>1,'𝆹𝅥𝅮'=>1,'𝆺𝅥𝅮'=>1,'𝆹𝅥𝅯'=>1,'𝆺𝅥𝅯'=>1,'𝐀'=>1,'𝐁'=>1,'𝐂'=>1,'𝐃'=>1,'𝐄'=>1,'𝐅'=>1,'𝐆'=>1,'𝐇'=>1,'𝐈'=>1,'𝐉'=>1,'𝐊'=>1,'𝐋'=>1,'𝐌'=>1,'𝐍'=>1,'𝐎'=>1,'𝐏'=>1,'𝐐'=>1,'𝐑'=>1,'𝐒'=>1,'𝐓'=>1,'𝐔'=>1,'𝐕'=>1,'𝐖'=>1,'𝐗'=>1,'𝐘'=>1,'𝐙'=>1,'𝐚'=>1,'𝐛'=>1,'𝐜'=>1,'𝐝'=>1,'𝐞'=>1,'𝐟'=>1,'𝐠'=>1,'𝐡'=>1,'𝐢'=>1,'𝐣'=>1,'𝐤'=>1,'𝐥'=>1,'𝐦'=>1,'𝐧'=>1,'𝐨'=>1,'𝐩'=>1,'𝐪'=>1,'𝐫'=>1,'𝐬'=>1,'𝐭'=>1,'𝐮'=>1,'𝐯'=>1,'𝐰'=>1,'𝐱'=>1,'𝐲'=>1,'𝐳'=>1,'𝐴'=>1,'𝐵'=>1,'𝐶'=>1,'𝐷'=>1,'𝐸'=>1,'𝐹'=>1,'𝐺'=>1,'𝐻'=>1,'𝐼'=>1,'𝐽'=>1,'𝐾'=>1,'𝐿'=>1,'𝑀'=>1,'𝑁'=>1,'𝑂'=>1,'𝑃'=>1,'𝑄'=>1,'𝑅'=>1,'𝑆'=>1,'𝑇'=>1,'𝑈'=>1,'𝑉'=>1,'𝑊'=>1,'𝑋'=>1,'𝑌'=>1,'𝑍'=>1,'𝑎'=>1,'𝑏'=>1,'𝑐'=>1,'𝑑'=>1,'𝑒'=>1,'𝑓'=>1,'𝑔'=>1,'𝑖'=>1,'𝑗'=>1,'𝑘'=>1,'𝑙'=>1,'𝑚'=>1,'𝑛'=>1,'𝑜'=>1,'𝑝'=>1,'𝑞'=>1,'𝑟'=>1,'𝑠'=>1,'𝑡'=>1,'𝑢'=>1,'𝑣'=>1,'𝑤'=>1,'𝑥'=>1,'𝑦'=>1,'𝑧'=>1,'𝑨'=>1,'𝑩'=>1,'𝑪'=>1,'𝑫'=>1,'𝑬'=>1,'𝑭'=>1,'𝑮'=>1,'𝑯'=>1,'𝑰'=>1,'𝑱'=>1,'𝑲'=>1,'𝑳'=>1,'𝑴'=>1,'𝑵'=>1,'𝑶'=>1,'𝑷'=>1,'𝑸'=>1,'𝑹'=>1,'𝑺'=>1,'𝑻'=>1,'𝑼'=>1,'𝑽'=>1,'𝑾'=>1,'𝑿'=>1,'𝒀'=>1,'𝒁'=>1,'𝒂'=>1,'𝒃'=>1,'𝒄'=>1,'𝒅'=>1,'𝒆'=>1,'𝒇'=>1,'𝒈'=>1,'𝒉'=>1,'𝒊'=>1,'𝒋'=>1,'𝒌'=>1,'𝒍'=>1,'𝒎'=>1,'𝒏'=>1,'𝒐'=>1,'𝒑'=>1,'𝒒'=>1,'𝒓'=>1,'𝒔'=>1,'𝒕'=>1,'𝒖'=>1,'𝒗'=>1,'𝒘'=>1,'𝒙'=>1,'𝒚'=>1,'𝒛'=>1,'𝒜'=>1,'𝒞'=>1,'𝒟'=>1,'𝒢'=>1,'𝒥'=>1,'𝒦'=>1,'𝒩'=>1,'𝒪'=>1,'𝒫'=>1,'𝒬'=>1,'𝒮'=>1,'𝒯'=>1,'𝒰'=>1,'𝒱'=>1,'𝒲'=>1,'𝒳'=>1,'𝒴'=>1,'𝒵'=>1,'𝒶'=>1,'𝒷'=>1,'𝒸'=>1,'𝒹'=>1,'𝒻'=>1,'𝒽'=>1,'𝒾'=>1,'𝒿'=>1,'𝓀'=>1,'𝓁'=>1,'𝓂'=>1,'𝓃'=>1,'𝓅'=>1,'𝓆'=>1,'𝓇'=>1,'𝓈'=>1,'𝓉'=>1,'𝓊'=>1,'𝓋'=>1,'𝓌'=>1,'𝓍'=>1,'𝓎'=>1,'𝓏'=>1,'𝓐'=>1,'𝓑'=>1,'𝓒'=>1,'𝓓'=>1,'𝓔'=>1,'𝓕'=>1,'𝓖'=>1,'𝓗'=>1,'𝓘'=>1,'𝓙'=>1,'𝓚'=>1,'𝓛'=>1,'𝓜'=>1,'𝓝'=>1,'𝓞'=>1,'𝓟'=>1,'𝓠'=>1,'𝓡'=>1,'𝓢'=>1,'𝓣'=>1,'𝓤'=>1,'𝓥'=>1,'𝓦'=>1,'𝓧'=>1,'𝓨'=>1,'𝓩'=>1,'𝓪'=>1,'𝓫'=>1,'𝓬'=>1,'𝓭'=>1,'𝓮'=>1,'𝓯'=>1,'𝓰'=>1,'𝓱'=>1,'𝓲'=>1,'𝓳'=>1,'𝓴'=>1,'𝓵'=>1,'𝓶'=>1,'𝓷'=>1,'𝓸'=>1,'𝓹'=>1,'𝓺'=>1,'𝓻'=>1,'𝓼'=>1,'𝓽'=>1,'𝓾'=>1,'𝓿'=>1,'𝔀'=>1,'𝔁'=>1,'𝔂'=>1,'𝔃'=>1,'𝔄'=>1,'𝔅'=>1,'𝔇'=>1,'𝔈'=>1,'𝔉'=>1,'𝔊'=>1,'𝔍'=>1,'𝔎'=>1,'𝔏'=>1,'𝔐'=>1,'𝔑'=>1,'𝔒'=>1,'𝔓'=>1,'𝔔'=>1,'𝔖'=>1,'𝔗'=>1,'𝔘'=>1,'𝔙'=>1,'𝔚'=>1,'𝔛'=>1,'𝔜'=>1,'𝔞'=>1,'𝔟'=>1,'𝔠'=>1,'𝔡'=>1,'𝔢'=>1,'𝔣'=>1,'𝔤'=>1,'𝔥'=>1,'𝔦'=>1,'𝔧'=>1,'𝔨'=>1,'𝔩'=>1,'𝔪'=>1,'𝔫'=>1,'𝔬'=>1,'𝔭'=>1,'𝔮'=>1,'𝔯'=>1,'𝔰'=>1,'𝔱'=>1,'𝔲'=>1,'𝔳'=>1,'𝔴'=>1,'𝔵'=>1,'𝔶'=>1,'𝔷'=>1,'𝔸'=>1,'𝔹'=>1,'𝔻'=>1,'𝔼'=>1,'𝔽'=>1,'𝔾'=>1,'𝕀'=>1,'𝕁'=>1,'𝕂'=>1,'𝕃'=>1,'𝕄'=>1,'𝕆'=>1,'𝕊'=>1,'𝕋'=>1,'𝕌'=>1,'𝕍'=>1,'𝕎'=>1,'𝕏'=>1,'𝕐'=>1,'𝕒'=>1,'𝕓'=>1,'𝕔'=>1,'𝕕'=>1,'𝕖'=>1,'𝕗'=>1,'𝕘'=>1,'𝕙'=>1,'𝕚'=>1,'𝕛'=>1,'𝕜'=>1,'𝕝'=>1,'𝕞'=>1,'𝕟'=>1,'𝕠'=>1,'𝕡'=>1,'𝕢'=>1,'𝕣'=>1,'𝕤'=>1,'𝕥'=>1,'𝕦'=>1,'𝕧'=>1,'𝕨'=>1,'𝕩'=>1,'𝕪'=>1,'𝕫'=>1,'𝕬'=>1,'𝕭'=>1,'𝕮'=>1,'𝕯'=>1,'𝕰'=>1,'𝕱'=>1,'𝕲'=>1,'𝕳'=>1,'𝕴'=>1,'𝕵'=>1,'𝕶'=>1,'𝕷'=>1,'𝕸'=>1,'𝕹'=>1,'𝕺'=>1,'𝕻'=>1,'𝕼'=>1,'𝕽'=>1,'𝕾'=>1,'𝕿'=>1,'𝖀'=>1,'𝖁'=>1,'𝖂'=>1,'𝖃'=>1,'𝖄'=>1,'𝖅'=>1,'𝖆'=>1,'𝖇'=>1,'𝖈'=>1,'𝖉'=>1,'𝖊'=>1,'𝖋'=>1,'𝖌'=>1,'𝖍'=>1,'𝖎'=>1,'𝖏'=>1,'𝖐'=>1,'𝖑'=>1,'𝖒'=>1,'𝖓'=>1,'𝖔'=>1,'𝖕'=>1,'𝖖'=>1,'𝖗'=>1,'𝖘'=>1,'𝖙'=>1,'𝖚'=>1,'𝖛'=>1,'𝖜'=>1,'𝖝'=>1,'𝖞'=>1,'𝖟'=>1,'𝖠'=>1,'𝖡'=>1,'𝖢'=>1,'𝖣'=>1,'𝖤'=>1,'𝖥'=>1,'𝖦'=>1,'𝖧'=>1,'𝖨'=>1,'𝖩'=>1,'𝖪'=>1,'𝖫'=>1,'𝖬'=>1,'𝖭'=>1,'𝖮'=>1,'𝖯'=>1,'𝖰'=>1,'𝖱'=>1,'𝖲'=>1,'𝖳'=>1,'𝖴'=>1,'𝖵'=>1,'𝖶'=>1,'𝖷'=>1,'𝖸'=>1,'𝖹'=>1,'𝖺'=>1,'𝖻'=>1,'𝖼'=>1,'𝖽'=>1,'𝖾'=>1,'𝖿'=>1,'𝗀'=>1,'𝗁'=>1,'𝗂'=>1,'𝗃'=>1,'𝗄'=>1,'𝗅'=>1,'𝗆'=>1,'𝗇'=>1,'𝗈'=>1,'𝗉'=>1,'𝗊'=>1,'𝗋'=>1,'𝗌'=>1,'𝗍'=>1,'𝗎'=>1,'𝗏'=>1,'𝗐'=>1,'𝗑'=>1,'𝗒'=>1,'𝗓'=>1,'𝗔'=>1,'𝗕'=>1,'𝗖'=>1,'𝗗'=>1,'𝗘'=>1,'𝗙'=>1,'𝗚'=>1,'𝗛'=>1,'𝗜'=>1,'𝗝'=>1,'𝗞'=>1,'𝗟'=>1,'𝗠'=>1,'𝗡'=>1,'𝗢'=>1,'𝗣'=>1,'𝗤'=>1,'𝗥'=>1,'𝗦'=>1,'𝗧'=>1,'𝗨'=>1,'𝗩'=>1,'𝗪'=>1,'𝗫'=>1,'𝗬'=>1,'𝗭'=>1,'𝗮'=>1,'𝗯'=>1,'𝗰'=>1,'𝗱'=>1,'𝗲'=>1,'𝗳'=>1,'𝗴'=>1,'𝗵'=>1,'𝗶'=>1,'𝗷'=>1,'𝗸'=>1,'𝗹'=>1,'𝗺'=>1,'𝗻'=>1,'𝗼'=>1,'𝗽'=>1,'𝗾'=>1,'𝗿'=>1,'𝘀'=>1,'𝘁'=>1,'𝘂'=>1,'𝘃'=>1,'𝘄'=>1,'𝘅'=>1,'𝘆'=>1,'𝘇'=>1,'𝘈'=>1,'𝘉'=>1,'𝘊'=>1,'𝘋'=>1,'𝘌'=>1,'𝘍'=>1,'𝘎'=>1,'𝘏'=>1,'𝘐'=>1,'𝘑'=>1,'𝘒'=>1,'𝘓'=>1,'𝘔'=>1,'𝘕'=>1,'𝘖'=>1,'𝘗'=>1,'𝘘'=>1,'𝘙'=>1,'𝘚'=>1,'𝘛'=>1,'𝘜'=>1,'𝘝'=>1,'𝘞'=>1,'𝘟'=>1,'𝘠'=>1,'𝘡'=>1,'𝘢'=>1,'𝘣'=>1,'𝘤'=>1,'𝘥'=>1,'𝘦'=>1,'𝘧'=>1,'𝘨'=>1,'𝘩'=>1,'𝘪'=>1,'𝘫'=>1,'𝘬'=>1,'𝘭'=>1,'𝘮'=>1,'𝘯'=>1,'𝘰'=>1,'𝘱'=>1,'𝘲'=>1,'𝘳'=>1,'𝘴'=>1,'𝘵'=>1,'𝘶'=>1,'𝘷'=>1,'𝘸'=>1,'𝘹'=>1,'𝘺'=>1,'𝘻'=>1,'𝘼'=>1,'𝘽'=>1,'𝘾'=>1,'𝘿'=>1,'𝙀'=>1,'𝙁'=>1,'𝙂'=>1,'𝙃'=>1,'𝙄'=>1,'𝙅'=>1,'𝙆'=>1,'𝙇'=>1,'𝙈'=>1,'𝙉'=>1,'𝙊'=>1,'𝙋'=>1,'𝙌'=>1,'𝙍'=>1,'𝙎'=>1,'𝙏'=>1,'𝙐'=>1,'𝙑'=>1,'𝙒'=>1,'𝙓'=>1,'𝙔'=>1,'𝙕'=>1,'𝙖'=>1,'𝙗'=>1,'𝙘'=>1,'𝙙'=>1,'𝙚'=>1,'𝙛'=>1,'𝙜'=>1,'𝙝'=>1,'𝙞'=>1,'𝙟'=>1,'𝙠'=>1,'𝙡'=>1,'𝙢'=>1,'𝙣'=>1,'𝙤'=>1,'𝙥'=>1,'𝙦'=>1,'𝙧'=>1,'𝙨'=>1,'𝙩'=>1,'𝙪'=>1,'𝙫'=>1,'𝙬'=>1,'𝙭'=>1,'𝙮'=>1,'𝙯'=>1,'𝙰'=>1,'𝙱'=>1,'𝙲'=>1,'𝙳'=>1,'𝙴'=>1,'𝙵'=>1,'𝙶'=>1,'𝙷'=>1,'𝙸'=>1,'𝙹'=>1,'𝙺'=>1,'𝙻'=>1,'𝙼'=>1,'𝙽'=>1,'𝙾'=>1,'𝙿'=>1,'𝚀'=>1,'𝚁'=>1,'𝚂'=>1,'𝚃'=>1,'𝚄'=>1,'𝚅'=>1,'𝚆'=>1,'𝚇'=>1,'𝚈'=>1,'𝚉'=>1,'𝚊'=>1,'𝚋'=>1,'𝚌'=>1,'𝚍'=>1,'𝚎'=>1,'𝚏'=>1,'𝚐'=>1,'𝚑'=>1,'𝚒'=>1,'𝚓'=>1,'𝚔'=>1,'𝚕'=>1,'𝚖'=>1,'𝚗'=>1,'𝚘'=>1,'𝚙'=>1,'𝚚'=>1,'𝚛'=>1,'𝚜'=>1,'𝚝'=>1,'𝚞'=>1,'𝚟'=>1,'𝚠'=>1,'𝚡'=>1,'𝚢'=>1,'𝚣'=>1,'𝚤'=>1,'𝚥'=>1,'𝚨'=>1,'𝚩'=>1,'𝚪'=>1,'𝚫'=>1,'𝚬'=>1,'𝚭'=>1,'𝚮'=>1,'𝚯'=>1,'𝚰'=>1,'𝚱'=>1,'𝚲'=>1,'𝚳'=>1,'𝚴'=>1,'𝚵'=>1,'𝚶'=>1,'𝚷'=>1,'𝚸'=>1,'𝚹'=>1,'𝚺'=>1,'𝚻'=>1,'𝚼'=>1,'𝚽'=>1,'𝚾'=>1,'𝚿'=>1,'𝛀'=>1,'𝛁'=>1,'𝛂'=>1,'𝛃'=>1,'𝛄'=>1,'𝛅'=>1,'𝛆'=>1,'𝛇'=>1,'𝛈'=>1,'𝛉'=>1,'𝛊'=>1,'𝛋'=>1,'𝛌'=>1,'𝛍'=>1,'𝛎'=>1,'𝛏'=>1,'𝛐'=>1,'𝛑'=>1,'𝛒'=>1,'𝛓'=>1,'𝛔'=>1,'𝛕'=>1,'𝛖'=>1,'𝛗'=>1,'𝛘'=>1,'𝛙'=>1,'𝛚'=>1,'𝛛'=>1,'𝛜'=>1,'𝛝'=>1,'𝛞'=>1,'𝛟'=>1,'𝛠'=>1,'𝛡'=>1,'𝛢'=>1,'𝛣'=>1,'𝛤'=>1,'𝛥'=>1,'𝛦'=>1,'𝛧'=>1,'𝛨'=>1,'𝛩'=>1,'𝛪'=>1,'𝛫'=>1,'𝛬'=>1,'𝛭'=>1,'𝛮'=>1,'𝛯'=>1,'𝛰'=>1,'𝛱'=>1,'𝛲'=>1,'𝛳'=>1,'𝛴'=>1,'𝛵'=>1,'𝛶'=>1,'𝛷'=>1,'𝛸'=>1,'𝛹'=>1,'𝛺'=>1,'𝛻'=>1,'𝛼'=>1,'𝛽'=>1,'𝛾'=>1,'𝛿'=>1,'𝜀'=>1,'𝜁'=>1,'𝜂'=>1,'𝜃'=>1,'𝜄'=>1,'𝜅'=>1,'𝜆'=>1,'𝜇'=>1,'𝜈'=>1,'𝜉'=>1,'𝜊'=>1,'𝜋'=>1,'𝜌'=>1,'𝜍'=>1,'𝜎'=>1,'𝜏'=>1,'𝜐'=>1,'𝜑'=>1,'𝜒'=>1,'𝜓'=>1,'𝜔'=>1,'𝜕'=>1,'𝜖'=>1,'𝜗'=>1,'𝜘'=>1,'𝜙'=>1,'𝜚'=>1,'𝜛'=>1,'𝜜'=>1,'𝜝'=>1,'𝜞'=>1,'𝜟'=>1,'𝜠'=>1,'𝜡'=>1,'𝜢'=>1,'𝜣'=>1,'𝜤'=>1,'𝜥'=>1,'𝜦'=>1,'𝜧'=>1,'𝜨'=>1,'𝜩'=>1,'𝜪'=>1,'𝜫'=>1,'𝜬'=>1,'𝜭'=>1,'𝜮'=>1,'𝜯'=>1,'𝜰'=>1,'𝜱'=>1,'𝜲'=>1,'𝜳'=>1,'𝜴'=>1,'𝜵'=>1,'𝜶'=>1,'𝜷'=>1,'𝜸'=>1,'𝜹'=>1,'𝜺'=>1,'𝜻'=>1,'𝜼'=>1,'𝜽'=>1,'𝜾'=>1,'𝜿'=>1,'𝝀'=>1,'𝝁'=>1,'𝝂'=>1,'𝝃'=>1,'𝝄'=>1,'𝝅'=>1,'𝝆'=>1,'𝝇'=>1,'𝝈'=>1,'𝝉'=>1,'𝝊'=>1,'𝝋'=>1,'𝝌'=>1,'𝝍'=>1,'𝝎'=>1,'𝝏'=>1,'𝝐'=>1,'𝝑'=>1,'𝝒'=>1,'𝝓'=>1,'𝝔'=>1,'𝝕'=>1,'𝝖'=>1,'𝝗'=>1,'𝝘'=>1,'𝝙'=>1,'𝝚'=>1,'𝝛'=>1,'𝝜'=>1,'𝝝'=>1,'𝝞'=>1,'𝝟'=>1,'𝝠'=>1,'𝝡'=>1,'𝝢'=>1,'𝝣'=>1,'𝝤'=>1,'𝝥'=>1,'𝝦'=>1,'𝝧'=>1,'𝝨'=>1,'𝝩'=>1,'𝝪'=>1,'𝝫'=>1,'𝝬'=>1,'𝝭'=>1,'𝝮'=>1,'𝝯'=>1,'𝝰'=>1,'𝝱'=>1,'𝝲'=>1,'𝝳'=>1,'𝝴'=>1,'𝝵'=>1,'𝝶'=>1,'𝝷'=>1,'𝝸'=>1,'𝝹'=>1,'𝝺'=>1,'𝝻'=>1,'𝝼'=>1,'𝝽'=>1,'𝝾'=>1,'𝝿'=>1,'𝞀'=>1,'𝞁'=>1,'𝞂'=>1,'𝞃'=>1,'𝞄'=>1,'𝞅'=>1,'𝞆'=>1,'𝞇'=>1,'𝞈'=>1,'𝞉'=>1,'𝞊'=>1,'𝞋'=>1,'𝞌'=>1,'𝞍'=>1,'𝞎'=>1,'𝞏'=>1,'𝞐'=>1,'𝞑'=>1,'𝞒'=>1,'𝞓'=>1,'𝞔'=>1,'𝞕'=>1,'𝞖'=>1,'𝞗'=>1,'𝞘'=>1,'𝞙'=>1,'𝞚'=>1,'𝞛'=>1,'𝞜'=>1,'𝞝'=>1,'𝞞'=>1,'𝞟'=>1,'𝞠'=>1,'𝞡'=>1,'𝞢'=>1,'𝞣'=>1,'𝞤'=>1,'𝞥'=>1,'𝞦'=>1,'𝞧'=>1,'𝞨'=>1,'𝞩'=>1,'𝞪'=>1,'𝞫'=>1,'𝞬'=>1,'𝞭'=>1,'𝞮'=>1,'𝞯'=>1,'𝞰'=>1,'𝞱'=>1,'𝞲'=>1,'𝞳'=>1,'𝞴'=>1,'𝞵'=>1,'𝞶'=>1,'𝞷'=>1,'𝞸'=>1,'𝞹'=>1,'𝞺'=>1,'𝞻'=>1,'𝞼'=>1,'𝞽'=>1,'𝞾'=>1,'𝞿'=>1,'𝟀'=>1,'𝟁'=>1,'𝟂'=>1,'𝟃'=>1,'𝟄'=>1,'𝟅'=>1,'𝟆'=>1,'𝟇'=>1,'𝟈'=>1,'𝟉'=>1,'𝟊'=>1,'𝟋'=>1,'𝟎'=>1,'𝟏'=>1,'𝟐'=>1,'𝟑'=>1,'𝟒'=>1,'𝟓'=>1,'𝟔'=>1,'𝟕'=>1,'𝟖'=>1,'𝟗'=>1,'𝟘'=>1,'𝟙'=>1,'𝟚'=>1,'𝟛'=>1,'𝟜'=>1,'𝟝'=>1,'𝟞'=>1,'𝟟'=>1,'𝟠'=>1,'𝟡'=>1,'𝟢'=>1,'𝟣'=>1,'𝟤'=>1,'𝟥'=>1,'𝟦'=>1,'𝟧'=>1,'𝟨'=>1,'𝟩'=>1,'𝟪'=>1,'𝟫'=>1,'𝟬'=>1,'𝟭'=>1,'𝟮'=>1,'𝟯'=>1,'𝟰'=>1,'𝟱'=>1,'𝟲'=>1,'𝟳'=>1,'𝟴'=>1,'𝟵'=>1,'𝟶'=>1,'𝟷'=>1,'𝟸'=>1,'𝟹'=>1,'𝟺'=>1,'𝟻'=>1,'𝟼'=>1,'𝟽'=>1,'𝟾'=>1,'𝟿'=>1,'丽'=>1,'丸'=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'𠘺'=>1,'免'=>1,'兔'=>1,'兤'=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'凵'=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'卑'=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'哶'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'圗'=>1,'噑'=>1,'噴'=>1,'切'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'多'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'寃'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'巡'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'庶'=>1,'廊'=>1,'𪎒'=>1,'廾'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'忍'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'憤'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'掩'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'晉'=>1,'㬙'=>1,'暑'=>1,'㬈'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'𣏃'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'櫛'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'海'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'𣻑'=>1,'淹'=>1,'潮'=>1,'𣽞'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'𤉣'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'㺸'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'𥃳'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'𥐝'=>1,'硎'=>1,'碌'=>1,'磌'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'𥪧'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'䌁'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'䏕'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'辞'=>1,'䑫'=>1,'芑'=>1,'芋'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'莽'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'𦼬'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'蠁'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'䚾'=>1,'䛇'=>1,'誠'=>1,'諭'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'𠣞'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'𨯺'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'𩖶'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'䳎'=>1,'䳭'=>1,'鵧'=>1,'𪃎'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'𪘀'=>1,'̀'=>0,'́'=>0,'̂'=>0,'̃'=>0,'̄'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'̊'=>0,'̋'=>0,'̌'=>0,'̏'=>0,'̑'=>0,'̓'=>0,'̔'=>0,'̛'=>0,'̣'=>0,'̤'=>0,'̥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'̭'=>0,'̮'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'͂'=>0,'ͅ'=>0,'ٓ'=>0,'ٔ'=>0,'ٕ'=>0,'़'=>0,'া'=>0,'ৗ'=>0,'ା'=>0,'ୖ'=>0,'ୗ'=>0,'ா'=>0,'ௗ'=>0,'ౖ'=>0,'ೂ'=>0,'ೕ'=>0,'ೖ'=>0,'ാ'=>0,'ൗ'=>0,'්'=>0,'ා'=>0,'ෟ'=>0,'ီ'=>0,'ᅡ'=>0,'ᅢ'=>0,'ᅣ'=>0,'ᅤ'=>0,'ᅥ'=>0,'ᅦ'=>0,'ᅧ'=>0,'ᅨ'=>0,'ᅩ'=>0,'ᅪ'=>0,'ᅫ'=>0,'ᅬ'=>0,'ᅭ'=>0,'ᅮ'=>0,'ᅯ'=>0,'ᅰ'=>0,'ᅱ'=>0,'ᅲ'=>0,'ᅳ'=>0,'ᅴ'=>0,'ᅵ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'ᆭ'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'ᇁ'=>0,'ᇂ'=>0,'ᬵ'=>0,'゙'=>0,'゚'=>0); \ No newline at end of file
+$GLOBALS['utf_nfkc_qc']=array(' '=>1,'¨'=>1,'ª'=>1,'¯'=>1,'²'=>1,'³'=>1,'´'=>1,'µ'=>1,'¸'=>1,'¹'=>1,'º'=>1,'¼'=>1,'½'=>1,'¾'=>1,'IJ'=>1,'ij'=>1,'Ŀ'=>1,'ŀ'=>1,'ʼn'=>1,'ſ'=>1,'DŽ'=>1,'Dž'=>1,'dž'=>1,'LJ'=>1,'Lj'=>1,'lj'=>1,'NJ'=>1,'Nj'=>1,'nj'=>1,'DZ'=>1,'Dz'=>1,'dz'=>1,'ʰ'=>1,'ʱ'=>1,'ʲ'=>1,'ʳ'=>1,'ʴ'=>1,'ʵ'=>1,'ʶ'=>1,'ʷ'=>1,'ʸ'=>1,'˘'=>1,'˙'=>1,'˚'=>1,'˛'=>1,'˜'=>1,'˝'=>1,'ˠ'=>1,'ˡ'=>1,'ˢ'=>1,'ˣ'=>1,'ˤ'=>1,'̀'=>1,'́'=>1,'̓'=>1,'̈́'=>1,'ʹ'=>1,'ͺ'=>1,';'=>1,'΄'=>1,'΅'=>1,'·'=>1,'ϐ'=>1,'ϑ'=>1,'ϒ'=>1,'ϓ'=>1,'ϔ'=>1,'ϕ'=>1,'ϖ'=>1,'ϰ'=>1,'ϱ'=>1,'ϲ'=>1,'ϴ'=>1,'ϵ'=>1,'Ϲ'=>1,'և'=>1,'ٵ'=>1,'ٶ'=>1,'ٷ'=>1,'ٸ'=>1,'क़'=>1,'ख़'=>1,'ग़'=>1,'ज़'=>1,'ड़'=>1,'ढ़'=>1,'फ़'=>1,'य़'=>1,'ড়'=>1,'ঢ়'=>1,'য়'=>1,'ਲ਼'=>1,'ਸ਼'=>1,'ਖ਼'=>1,'ਗ਼'=>1,'ਜ਼'=>1,'ਫ਼'=>1,'ଡ଼'=>1,'ଢ଼'=>1,'ำ'=>1,'ຳ'=>1,'ໜ'=>1,'ໝ'=>1,'༌'=>1,'གྷ'=>1,'ཌྷ'=>1,'དྷ'=>1,'བྷ'=>1,'ཛྷ'=>1,'ཀྵ'=>1,'ཱི'=>1,'ཱུ'=>1,'ྲྀ'=>1,'ཷ'=>1,'ླྀ'=>1,'ཹ'=>1,'ཱྀ'=>1,'ྒྷ'=>1,'ྜྷ'=>1,'ྡྷ'=>1,'ྦྷ'=>1,'ྫྷ'=>1,'ྐྵ'=>1,'ჼ'=>1,'ᴬ'=>1,'ᴭ'=>1,'ᴮ'=>1,'ᴰ'=>1,'ᴱ'=>1,'ᴲ'=>1,'ᴳ'=>1,'ᴴ'=>1,'ᴵ'=>1,'ᴶ'=>1,'ᴷ'=>1,'ᴸ'=>1,'ᴹ'=>1,'ᴺ'=>1,'ᴼ'=>1,'ᴽ'=>1,'ᴾ'=>1,'ᴿ'=>1,'ᵀ'=>1,'ᵁ'=>1,'ᵂ'=>1,'ᵃ'=>1,'ᵄ'=>1,'ᵅ'=>1,'ᵆ'=>1,'ᵇ'=>1,'ᵈ'=>1,'ᵉ'=>1,'ᵊ'=>1,'ᵋ'=>1,'ᵌ'=>1,'ᵍ'=>1,'ᵏ'=>1,'ᵐ'=>1,'ᵑ'=>1,'ᵒ'=>1,'ᵓ'=>1,'ᵔ'=>1,'ᵕ'=>1,'ᵖ'=>1,'ᵗ'=>1,'ᵘ'=>1,'ᵙ'=>1,'ᵚ'=>1,'ᵛ'=>1,'ᵜ'=>1,'ᵝ'=>1,'ᵞ'=>1,'ᵟ'=>1,'ᵠ'=>1,'ᵡ'=>1,'ᵢ'=>1,'ᵣ'=>1,'ᵤ'=>1,'ᵥ'=>1,'ᵦ'=>1,'ᵧ'=>1,'ᵨ'=>1,'ᵩ'=>1,'ᵪ'=>1,'ᵸ'=>1,'ᶛ'=>1,'ᶜ'=>1,'ᶝ'=>1,'ᶞ'=>1,'ᶟ'=>1,'ᶠ'=>1,'ᶡ'=>1,'ᶢ'=>1,'ᶣ'=>1,'ᶤ'=>1,'ᶥ'=>1,'ᶦ'=>1,'ᶧ'=>1,'ᶨ'=>1,'ᶩ'=>1,'ᶪ'=>1,'ᶫ'=>1,'ᶬ'=>1,'ᶭ'=>1,'ᶮ'=>1,'ᶯ'=>1,'ᶰ'=>1,'ᶱ'=>1,'ᶲ'=>1,'ᶳ'=>1,'ᶴ'=>1,'ᶵ'=>1,'ᶶ'=>1,'ᶷ'=>1,'ᶸ'=>1,'ᶹ'=>1,'ᶺ'=>1,'ᶻ'=>1,'ᶼ'=>1,'ᶽ'=>1,'ᶾ'=>1,'ᶿ'=>1,'ẚ'=>1,'ẛ'=>1,'ά'=>1,'έ'=>1,'ή'=>1,'ί'=>1,'ό'=>1,'ύ'=>1,'ώ'=>1,'Ά'=>1,'᾽'=>1,'ι'=>1,'᾿'=>1,'῀'=>1,'῁'=>1,'Έ'=>1,'Ή'=>1,'῍'=>1,'῎'=>1,'῏'=>1,'ΐ'=>1,'Ί'=>1,'῝'=>1,'῞'=>1,'῟'=>1,'ΰ'=>1,'Ύ'=>1,'῭'=>1,'΅'=>1,'`'=>1,'Ό'=>1,'Ώ'=>1,'´'=>1,'῾'=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,' '=>1,'‑'=>1,'‗'=>1,'․'=>1,'‥'=>1,'…'=>1,' '=>1,'″'=>1,'‴'=>1,'‶'=>1,'‷'=>1,'‼'=>1,'‾'=>1,'⁇'=>1,'⁈'=>1,'⁉'=>1,'⁗'=>1,' '=>1,'⁰'=>1,'ⁱ'=>1,'⁴'=>1,'⁵'=>1,'⁶'=>1,'⁷'=>1,'⁸'=>1,'⁹'=>1,'⁺'=>1,'⁻'=>1,'⁼'=>1,'⁽'=>1,'⁾'=>1,'ⁿ'=>1,'₀'=>1,'₁'=>1,'₂'=>1,'₃'=>1,'₄'=>1,'₅'=>1,'₆'=>1,'₇'=>1,'₈'=>1,'₉'=>1,'₊'=>1,'₋'=>1,'₌'=>1,'₍'=>1,'₎'=>1,'ₐ'=>1,'ₑ'=>1,'ₒ'=>1,'ₓ'=>1,'ₔ'=>1,'₨'=>1,'℀'=>1,'℁'=>1,'ℂ'=>1,'℃'=>1,'℅'=>1,'℆'=>1,'ℇ'=>1,'℉'=>1,'ℊ'=>1,'ℋ'=>1,'ℌ'=>1,'ℍ'=>1,'ℎ'=>1,'ℏ'=>1,'ℐ'=>1,'ℑ'=>1,'ℒ'=>1,'ℓ'=>1,'ℕ'=>1,'№'=>1,'ℙ'=>1,'ℚ'=>1,'ℛ'=>1,'ℜ'=>1,'ℝ'=>1,'℠'=>1,'℡'=>1,'™'=>1,'ℤ'=>1,'Ω'=>1,'ℨ'=>1,'K'=>1,'Å'=>1,'ℬ'=>1,'ℭ'=>1,'ℯ'=>1,'ℰ'=>1,'ℱ'=>1,'ℳ'=>1,'ℴ'=>1,'ℵ'=>1,'ℶ'=>1,'ℷ'=>1,'ℸ'=>1,'ℹ'=>1,'℻'=>1,'ℼ'=>1,'ℽ'=>1,'ℾ'=>1,'ℿ'=>1,'⅀'=>1,'ⅅ'=>1,'ⅆ'=>1,'ⅇ'=>1,'ⅈ'=>1,'ⅉ'=>1,'⅓'=>1,'⅔'=>1,'⅕'=>1,'⅖'=>1,'⅗'=>1,'⅘'=>1,'⅙'=>1,'⅚'=>1,'⅛'=>1,'⅜'=>1,'⅝'=>1,'⅞'=>1,'⅟'=>1,'Ⅰ'=>1,'Ⅱ'=>1,'Ⅲ'=>1,'Ⅳ'=>1,'Ⅴ'=>1,'Ⅵ'=>1,'Ⅶ'=>1,'Ⅷ'=>1,'Ⅸ'=>1,'Ⅹ'=>1,'Ⅺ'=>1,'Ⅻ'=>1,'Ⅼ'=>1,'Ⅽ'=>1,'Ⅾ'=>1,'Ⅿ'=>1,'ⅰ'=>1,'ⅱ'=>1,'ⅲ'=>1,'ⅳ'=>1,'ⅴ'=>1,'ⅵ'=>1,'ⅶ'=>1,'ⅷ'=>1,'ⅸ'=>1,'ⅹ'=>1,'ⅺ'=>1,'ⅻ'=>1,'ⅼ'=>1,'ⅽ'=>1,'ⅾ'=>1,'ⅿ'=>1,'∬'=>1,'∭'=>1,'∯'=>1,'∰'=>1,'〈'=>1,'〉'=>1,'①'=>1,'②'=>1,'③'=>1,'④'=>1,'⑤'=>1,'⑥'=>1,'⑦'=>1,'⑧'=>1,'⑨'=>1,'⑩'=>1,'⑪'=>1,'⑫'=>1,'⑬'=>1,'⑭'=>1,'⑮'=>1,'⑯'=>1,'⑰'=>1,'⑱'=>1,'⑲'=>1,'⑳'=>1,'⑴'=>1,'⑵'=>1,'⑶'=>1,'⑷'=>1,'⑸'=>1,'⑹'=>1,'⑺'=>1,'⑻'=>1,'⑼'=>1,'⑽'=>1,'⑾'=>1,'⑿'=>1,'⒀'=>1,'⒁'=>1,'⒂'=>1,'⒃'=>1,'⒄'=>1,'⒅'=>1,'⒆'=>1,'⒇'=>1,'⒈'=>1,'⒉'=>1,'⒊'=>1,'⒋'=>1,'⒌'=>1,'⒍'=>1,'⒎'=>1,'⒏'=>1,'⒐'=>1,'⒑'=>1,'⒒'=>1,'⒓'=>1,'⒔'=>1,'⒕'=>1,'⒖'=>1,'⒗'=>1,'⒘'=>1,'⒙'=>1,'⒚'=>1,'⒛'=>1,'⒜'=>1,'⒝'=>1,'⒞'=>1,'⒟'=>1,'⒠'=>1,'⒡'=>1,'⒢'=>1,'⒣'=>1,'⒤'=>1,'⒥'=>1,'⒦'=>1,'⒧'=>1,'⒨'=>1,'⒩'=>1,'⒪'=>1,'⒫'=>1,'⒬'=>1,'⒭'=>1,'⒮'=>1,'⒯'=>1,'⒰'=>1,'⒱'=>1,'⒲'=>1,'⒳'=>1,'⒴'=>1,'⒵'=>1,'Ⓐ'=>1,'Ⓑ'=>1,'Ⓒ'=>1,'Ⓓ'=>1,'Ⓔ'=>1,'Ⓕ'=>1,'Ⓖ'=>1,'Ⓗ'=>1,'Ⓘ'=>1,'Ⓙ'=>1,'Ⓚ'=>1,'Ⓛ'=>1,'Ⓜ'=>1,'Ⓝ'=>1,'Ⓞ'=>1,'Ⓟ'=>1,'Ⓠ'=>1,'Ⓡ'=>1,'Ⓢ'=>1,'Ⓣ'=>1,'Ⓤ'=>1,'Ⓥ'=>1,'Ⓦ'=>1,'Ⓧ'=>1,'Ⓨ'=>1,'Ⓩ'=>1,'ⓐ'=>1,'ⓑ'=>1,'ⓒ'=>1,'ⓓ'=>1,'ⓔ'=>1,'ⓕ'=>1,'ⓖ'=>1,'ⓗ'=>1,'ⓘ'=>1,'ⓙ'=>1,'ⓚ'=>1,'ⓛ'=>1,'ⓜ'=>1,'ⓝ'=>1,'ⓞ'=>1,'ⓟ'=>1,'ⓠ'=>1,'ⓡ'=>1,'ⓢ'=>1,'ⓣ'=>1,'ⓤ'=>1,'ⓥ'=>1,'ⓦ'=>1,'ⓧ'=>1,'ⓨ'=>1,'ⓩ'=>1,'⓪'=>1,'⨌'=>1,'⩴'=>1,'⩵'=>1,'⩶'=>1,'⫝̸'=>1,'ⵯ'=>1,'⺟'=>1,'⻳'=>1,'⼀'=>1,'⼁'=>1,'⼂'=>1,'⼃'=>1,'⼄'=>1,'⼅'=>1,'⼆'=>1,'⼇'=>1,'⼈'=>1,'⼉'=>1,'⼊'=>1,'⼋'=>1,'⼌'=>1,'⼍'=>1,'⼎'=>1,'⼏'=>1,'⼐'=>1,'⼑'=>1,'⼒'=>1,'⼓'=>1,'⼔'=>1,'⼕'=>1,'⼖'=>1,'⼗'=>1,'⼘'=>1,'⼙'=>1,'⼚'=>1,'⼛'=>1,'⼜'=>1,'⼝'=>1,'⼞'=>1,'⼟'=>1,'⼠'=>1,'⼡'=>1,'⼢'=>1,'⼣'=>1,'⼤'=>1,'⼥'=>1,'⼦'=>1,'⼧'=>1,'⼨'=>1,'⼩'=>1,'⼪'=>1,'⼫'=>1,'⼬'=>1,'⼭'=>1,'⼮'=>1,'⼯'=>1,'⼰'=>1,'⼱'=>1,'⼲'=>1,'⼳'=>1,'⼴'=>1,'⼵'=>1,'⼶'=>1,'⼷'=>1,'⼸'=>1,'⼹'=>1,'⼺'=>1,'⼻'=>1,'⼼'=>1,'⼽'=>1,'⼾'=>1,'⼿'=>1,'⽀'=>1,'⽁'=>1,'⽂'=>1,'⽃'=>1,'⽄'=>1,'⽅'=>1,'⽆'=>1,'⽇'=>1,'⽈'=>1,'⽉'=>1,'⽊'=>1,'⽋'=>1,'⽌'=>1,'⽍'=>1,'⽎'=>1,'⽏'=>1,'⽐'=>1,'⽑'=>1,'⽒'=>1,'⽓'=>1,'⽔'=>1,'⽕'=>1,'⽖'=>1,'⽗'=>1,'⽘'=>1,'⽙'=>1,'⽚'=>1,'⽛'=>1,'⽜'=>1,'⽝'=>1,'⽞'=>1,'⽟'=>1,'⽠'=>1,'⽡'=>1,'⽢'=>1,'⽣'=>1,'⽤'=>1,'⽥'=>1,'⽦'=>1,'⽧'=>1,'⽨'=>1,'⽩'=>1,'⽪'=>1,'⽫'=>1,'⽬'=>1,'⽭'=>1,'⽮'=>1,'⽯'=>1,'⽰'=>1,'⽱'=>1,'⽲'=>1,'⽳'=>1,'⽴'=>1,'⽵'=>1,'⽶'=>1,'⽷'=>1,'⽸'=>1,'⽹'=>1,'⽺'=>1,'⽻'=>1,'⽼'=>1,'⽽'=>1,'⽾'=>1,'⽿'=>1,'⾀'=>1,'⾁'=>1,'⾂'=>1,'⾃'=>1,'⾄'=>1,'⾅'=>1,'⾆'=>1,'⾇'=>1,'⾈'=>1,'⾉'=>1,'⾊'=>1,'⾋'=>1,'⾌'=>1,'⾍'=>1,'⾎'=>1,'⾏'=>1,'⾐'=>1,'⾑'=>1,'⾒'=>1,'⾓'=>1,'⾔'=>1,'⾕'=>1,'⾖'=>1,'⾗'=>1,'⾘'=>1,'⾙'=>1,'⾚'=>1,'⾛'=>1,'⾜'=>1,'⾝'=>1,'⾞'=>1,'⾟'=>1,'⾠'=>1,'⾡'=>1,'⾢'=>1,'⾣'=>1,'⾤'=>1,'⾥'=>1,'⾦'=>1,'⾧'=>1,'⾨'=>1,'⾩'=>1,'⾪'=>1,'⾫'=>1,'⾬'=>1,'⾭'=>1,'⾮'=>1,'⾯'=>1,'⾰'=>1,'⾱'=>1,'⾲'=>1,'⾳'=>1,'⾴'=>1,'⾵'=>1,'⾶'=>1,'⾷'=>1,'⾸'=>1,'⾹'=>1,'⾺'=>1,'⾻'=>1,'⾼'=>1,'⾽'=>1,'⾾'=>1,'⾿'=>1,'⿀'=>1,'⿁'=>1,'⿂'=>1,'⿃'=>1,'⿄'=>1,'⿅'=>1,'⿆'=>1,'⿇'=>1,'⿈'=>1,'⿉'=>1,'⿊'=>1,'⿋'=>1,'⿌'=>1,'⿍'=>1,'⿎'=>1,'⿏'=>1,'⿐'=>1,'⿑'=>1,'⿒'=>1,'⿓'=>1,'⿔'=>1,'⿕'=>1,' '=>1,'〶'=>1,'〸'=>1,'〹'=>1,'〺'=>1,'゛'=>1,'゜'=>1,'ゟ'=>1,'ヿ'=>1,'ㄱ'=>1,'ㄲ'=>1,'ㄳ'=>1,'ㄴ'=>1,'ㄵ'=>1,'ㄶ'=>1,'ㄷ'=>1,'ㄸ'=>1,'ㄹ'=>1,'ㄺ'=>1,'ㄻ'=>1,'ㄼ'=>1,'ㄽ'=>1,'ㄾ'=>1,'ㄿ'=>1,'ㅀ'=>1,'ㅁ'=>1,'ㅂ'=>1,'ㅃ'=>1,'ㅄ'=>1,'ㅅ'=>1,'ㅆ'=>1,'ㅇ'=>1,'ㅈ'=>1,'ㅉ'=>1,'ㅊ'=>1,'ㅋ'=>1,'ㅌ'=>1,'ㅍ'=>1,'ㅎ'=>1,'ㅏ'=>1,'ㅐ'=>1,'ㅑ'=>1,'ㅒ'=>1,'ㅓ'=>1,'ㅔ'=>1,'ㅕ'=>1,'ㅖ'=>1,'ㅗ'=>1,'ㅘ'=>1,'ㅙ'=>1,'ㅚ'=>1,'ㅛ'=>1,'ㅜ'=>1,'ㅝ'=>1,'ㅞ'=>1,'ㅟ'=>1,'ㅠ'=>1,'ㅡ'=>1,'ㅢ'=>1,'ㅣ'=>1,'ㅤ'=>1,'ㅥ'=>1,'ㅦ'=>1,'ㅧ'=>1,'ㅨ'=>1,'ㅩ'=>1,'ㅪ'=>1,'ㅫ'=>1,'ㅬ'=>1,'ㅭ'=>1,'ㅮ'=>1,'ㅯ'=>1,'ㅰ'=>1,'ㅱ'=>1,'ㅲ'=>1,'ㅳ'=>1,'ㅴ'=>1,'ㅵ'=>1,'ㅶ'=>1,'ㅷ'=>1,'ㅸ'=>1,'ㅹ'=>1,'ㅺ'=>1,'ㅻ'=>1,'ㅼ'=>1,'ㅽ'=>1,'ㅾ'=>1,'ㅿ'=>1,'ㆀ'=>1,'ㆁ'=>1,'ㆂ'=>1,'ㆃ'=>1,'ㆄ'=>1,'ㆅ'=>1,'ㆆ'=>1,'ㆇ'=>1,'ㆈ'=>1,'ㆉ'=>1,'ㆊ'=>1,'ㆋ'=>1,'ㆌ'=>1,'ㆍ'=>1,'ㆎ'=>1,'㆒'=>1,'㆓'=>1,'㆔'=>1,'㆕'=>1,'㆖'=>1,'㆗'=>1,'㆘'=>1,'㆙'=>1,'㆚'=>1,'㆛'=>1,'㆜'=>1,'㆝'=>1,'㆞'=>1,'㆟'=>1,'㈀'=>1,'㈁'=>1,'㈂'=>1,'㈃'=>1,'㈄'=>1,'㈅'=>1,'㈆'=>1,'㈇'=>1,'㈈'=>1,'㈉'=>1,'㈊'=>1,'㈋'=>1,'㈌'=>1,'㈍'=>1,'㈎'=>1,'㈏'=>1,'㈐'=>1,'㈑'=>1,'㈒'=>1,'㈓'=>1,'㈔'=>1,'㈕'=>1,'㈖'=>1,'㈗'=>1,'㈘'=>1,'㈙'=>1,'㈚'=>1,'㈛'=>1,'㈜'=>1,'㈝'=>1,'㈞'=>1,'㈠'=>1,'㈡'=>1,'㈢'=>1,'㈣'=>1,'㈤'=>1,'㈥'=>1,'㈦'=>1,'㈧'=>1,'㈨'=>1,'㈩'=>1,'㈪'=>1,'㈫'=>1,'㈬'=>1,'㈭'=>1,'㈮'=>1,'㈯'=>1,'㈰'=>1,'㈱'=>1,'㈲'=>1,'㈳'=>1,'㈴'=>1,'㈵'=>1,'㈶'=>1,'㈷'=>1,'㈸'=>1,'㈹'=>1,'㈺'=>1,'㈻'=>1,'㈼'=>1,'㈽'=>1,'㈾'=>1,'㈿'=>1,'㉀'=>1,'㉁'=>1,'㉂'=>1,'㉃'=>1,'㉐'=>1,'㉑'=>1,'㉒'=>1,'㉓'=>1,'㉔'=>1,'㉕'=>1,'㉖'=>1,'㉗'=>1,'㉘'=>1,'㉙'=>1,'㉚'=>1,'㉛'=>1,'㉜'=>1,'㉝'=>1,'㉞'=>1,'㉟'=>1,'㉠'=>1,'㉡'=>1,'㉢'=>1,'㉣'=>1,'㉤'=>1,'㉥'=>1,'㉦'=>1,'㉧'=>1,'㉨'=>1,'㉩'=>1,'㉪'=>1,'㉫'=>1,'㉬'=>1,'㉭'=>1,'㉮'=>1,'㉯'=>1,'㉰'=>1,'㉱'=>1,'㉲'=>1,'㉳'=>1,'㉴'=>1,'㉵'=>1,'㉶'=>1,'㉷'=>1,'㉸'=>1,'㉹'=>1,'㉺'=>1,'㉻'=>1,'㉼'=>1,'㉽'=>1,'㉾'=>1,'㊀'=>1,'㊁'=>1,'㊂'=>1,'㊃'=>1,'㊄'=>1,'㊅'=>1,'㊆'=>1,'㊇'=>1,'㊈'=>1,'㊉'=>1,'㊊'=>1,'㊋'=>1,'㊌'=>1,'㊍'=>1,'㊎'=>1,'㊏'=>1,'㊐'=>1,'㊑'=>1,'㊒'=>1,'㊓'=>1,'㊔'=>1,'㊕'=>1,'㊖'=>1,'㊗'=>1,'㊘'=>1,'㊙'=>1,'㊚'=>1,'㊛'=>1,'㊜'=>1,'㊝'=>1,'㊞'=>1,'㊟'=>1,'㊠'=>1,'㊡'=>1,'㊢'=>1,'㊣'=>1,'㊤'=>1,'㊥'=>1,'㊦'=>1,'㊧'=>1,'㊨'=>1,'㊩'=>1,'㊪'=>1,'㊫'=>1,'㊬'=>1,'㊭'=>1,'㊮'=>1,'㊯'=>1,'㊰'=>1,'㊱'=>1,'㊲'=>1,'㊳'=>1,'㊴'=>1,'㊵'=>1,'㊶'=>1,'㊷'=>1,'㊸'=>1,'㊹'=>1,'㊺'=>1,'㊻'=>1,'㊼'=>1,'㊽'=>1,'㊾'=>1,'㊿'=>1,'㋀'=>1,'㋁'=>1,'㋂'=>1,'㋃'=>1,'㋄'=>1,'㋅'=>1,'㋆'=>1,'㋇'=>1,'㋈'=>1,'㋉'=>1,'㋊'=>1,'㋋'=>1,'㋌'=>1,'㋍'=>1,'㋎'=>1,'㋏'=>1,'㋐'=>1,'㋑'=>1,'㋒'=>1,'㋓'=>1,'㋔'=>1,'㋕'=>1,'㋖'=>1,'㋗'=>1,'㋘'=>1,'㋙'=>1,'㋚'=>1,'㋛'=>1,'㋜'=>1,'㋝'=>1,'㋞'=>1,'㋟'=>1,'㋠'=>1,'㋡'=>1,'㋢'=>1,'㋣'=>1,'㋤'=>1,'㋥'=>1,'㋦'=>1,'㋧'=>1,'㋨'=>1,'㋩'=>1,'㋪'=>1,'㋫'=>1,'㋬'=>1,'㋭'=>1,'㋮'=>1,'㋯'=>1,'㋰'=>1,'㋱'=>1,'㋲'=>1,'㋳'=>1,'㋴'=>1,'㋵'=>1,'㋶'=>1,'㋷'=>1,'㋸'=>1,'㋹'=>1,'㋺'=>1,'㋻'=>1,'㋼'=>1,'㋽'=>1,'㋾'=>1,'㌀'=>1,'㌁'=>1,'㌂'=>1,'㌃'=>1,'㌄'=>1,'㌅'=>1,'㌆'=>1,'㌇'=>1,'㌈'=>1,'㌉'=>1,'㌊'=>1,'㌋'=>1,'㌌'=>1,'㌍'=>1,'㌎'=>1,'㌏'=>1,'㌐'=>1,'㌑'=>1,'㌒'=>1,'㌓'=>1,'㌔'=>1,'㌕'=>1,'㌖'=>1,'㌗'=>1,'㌘'=>1,'㌙'=>1,'㌚'=>1,'㌛'=>1,'㌜'=>1,'㌝'=>1,'㌞'=>1,'㌟'=>1,'㌠'=>1,'㌡'=>1,'㌢'=>1,'㌣'=>1,'㌤'=>1,'㌥'=>1,'㌦'=>1,'㌧'=>1,'㌨'=>1,'㌩'=>1,'㌪'=>1,'㌫'=>1,'㌬'=>1,'㌭'=>1,'㌮'=>1,'㌯'=>1,'㌰'=>1,'㌱'=>1,'㌲'=>1,'㌳'=>1,'㌴'=>1,'㌵'=>1,'㌶'=>1,'㌷'=>1,'㌸'=>1,'㌹'=>1,'㌺'=>1,'㌻'=>1,'㌼'=>1,'㌽'=>1,'㌾'=>1,'㌿'=>1,'㍀'=>1,'㍁'=>1,'㍂'=>1,'㍃'=>1,'㍄'=>1,'㍅'=>1,'㍆'=>1,'㍇'=>1,'㍈'=>1,'㍉'=>1,'㍊'=>1,'㍋'=>1,'㍌'=>1,'㍍'=>1,'㍎'=>1,'㍏'=>1,'㍐'=>1,'㍑'=>1,'㍒'=>1,'㍓'=>1,'㍔'=>1,'㍕'=>1,'㍖'=>1,'㍗'=>1,'㍘'=>1,'㍙'=>1,'㍚'=>1,'㍛'=>1,'㍜'=>1,'㍝'=>1,'㍞'=>1,'㍟'=>1,'㍠'=>1,'㍡'=>1,'㍢'=>1,'㍣'=>1,'㍤'=>1,'㍥'=>1,'㍦'=>1,'㍧'=>1,'㍨'=>1,'㍩'=>1,'㍪'=>1,'㍫'=>1,'㍬'=>1,'㍭'=>1,'㍮'=>1,'㍯'=>1,'㍰'=>1,'㍱'=>1,'㍲'=>1,'㍳'=>1,'㍴'=>1,'㍵'=>1,'㍶'=>1,'㍷'=>1,'㍸'=>1,'㍹'=>1,'㍺'=>1,'㍻'=>1,'㍼'=>1,'㍽'=>1,'㍾'=>1,'㍿'=>1,'㎀'=>1,'㎁'=>1,'㎂'=>1,'㎃'=>1,'㎄'=>1,'㎅'=>1,'㎆'=>1,'㎇'=>1,'㎈'=>1,'㎉'=>1,'㎊'=>1,'㎋'=>1,'㎌'=>1,'㎍'=>1,'㎎'=>1,'㎏'=>1,'㎐'=>1,'㎑'=>1,'㎒'=>1,'㎓'=>1,'㎔'=>1,'㎕'=>1,'㎖'=>1,'㎗'=>1,'㎘'=>1,'㎙'=>1,'㎚'=>1,'㎛'=>1,'㎜'=>1,'㎝'=>1,'㎞'=>1,'㎟'=>1,'㎠'=>1,'㎡'=>1,'㎢'=>1,'㎣'=>1,'㎤'=>1,'㎥'=>1,'㎦'=>1,'㎧'=>1,'㎨'=>1,'㎩'=>1,'㎪'=>1,'㎫'=>1,'㎬'=>1,'㎭'=>1,'㎮'=>1,'㎯'=>1,'㎰'=>1,'㎱'=>1,'㎲'=>1,'㎳'=>1,'㎴'=>1,'㎵'=>1,'㎶'=>1,'㎷'=>1,'㎸'=>1,'㎹'=>1,'㎺'=>1,'㎻'=>1,'㎼'=>1,'㎽'=>1,'㎾'=>1,'㎿'=>1,'㏀'=>1,'㏁'=>1,'㏂'=>1,'㏃'=>1,'㏄'=>1,'㏅'=>1,'㏆'=>1,'㏇'=>1,'㏈'=>1,'㏉'=>1,'㏊'=>1,'㏋'=>1,'㏌'=>1,'㏍'=>1,'㏎'=>1,'㏏'=>1,'㏐'=>1,'㏑'=>1,'㏒'=>1,'㏓'=>1,'㏔'=>1,'㏕'=>1,'㏖'=>1,'㏗'=>1,'㏘'=>1,'㏙'=>1,'㏚'=>1,'㏛'=>1,'㏜'=>1,'㏝'=>1,'㏞'=>1,'㏟'=>1,'㏠'=>1,'㏡'=>1,'㏢'=>1,'㏣'=>1,'㏤'=>1,'㏥'=>1,'㏦'=>1,'㏧'=>1,'㏨'=>1,'㏩'=>1,'㏪'=>1,'㏫'=>1,'㏬'=>1,'㏭'=>1,'㏮'=>1,'㏯'=>1,'㏰'=>1,'㏱'=>1,'㏲'=>1,'㏳'=>1,'㏴'=>1,'㏵'=>1,'㏶'=>1,'㏷'=>1,'㏸'=>1,'㏹'=>1,'㏺'=>1,'㏻'=>1,'㏼'=>1,'㏽'=>1,'㏾'=>1,'㏿'=>1,'豈'=>1,'更'=>1,'車'=>1,'賈'=>1,'滑'=>1,'串'=>1,'句'=>1,'龜'=>1,'龜'=>1,'契'=>1,'金'=>1,'喇'=>1,'奈'=>1,'懶'=>1,'癩'=>1,'羅'=>1,'蘿'=>1,'螺'=>1,'裸'=>1,'邏'=>1,'樂'=>1,'洛'=>1,'烙'=>1,'珞'=>1,'落'=>1,'酪'=>1,'駱'=>1,'亂'=>1,'卵'=>1,'欄'=>1,'爛'=>1,'蘭'=>1,'鸞'=>1,'嵐'=>1,'濫'=>1,'藍'=>1,'襤'=>1,'拉'=>1,'臘'=>1,'蠟'=>1,'廊'=>1,'朗'=>1,'浪'=>1,'狼'=>1,'郎'=>1,'來'=>1,'冷'=>1,'勞'=>1,'擄'=>1,'櫓'=>1,'爐'=>1,'盧'=>1,'老'=>1,'蘆'=>1,'虜'=>1,'路'=>1,'露'=>1,'魯'=>1,'鷺'=>1,'碌'=>1,'祿'=>1,'綠'=>1,'菉'=>1,'錄'=>1,'鹿'=>1,'論'=>1,'壟'=>1,'弄'=>1,'籠'=>1,'聾'=>1,'牢'=>1,'磊'=>1,'賂'=>1,'雷'=>1,'壘'=>1,'屢'=>1,'樓'=>1,'淚'=>1,'漏'=>1,'累'=>1,'縷'=>1,'陋'=>1,'勒'=>1,'肋'=>1,'凜'=>1,'凌'=>1,'稜'=>1,'綾'=>1,'菱'=>1,'陵'=>1,'讀'=>1,'拏'=>1,'樂'=>1,'諾'=>1,'丹'=>1,'寧'=>1,'怒'=>1,'率'=>1,'異'=>1,'北'=>1,'磻'=>1,'便'=>1,'復'=>1,'不'=>1,'泌'=>1,'數'=>1,'索'=>1,'參'=>1,'塞'=>1,'省'=>1,'葉'=>1,'說'=>1,'殺'=>1,'辰'=>1,'沈'=>1,'拾'=>1,'若'=>1,'掠'=>1,'略'=>1,'亮'=>1,'兩'=>1,'凉'=>1,'梁'=>1,'糧'=>1,'良'=>1,'諒'=>1,'量'=>1,'勵'=>1,'呂'=>1,'女'=>1,'廬'=>1,'旅'=>1,'濾'=>1,'礪'=>1,'閭'=>1,'驪'=>1,'麗'=>1,'黎'=>1,'力'=>1,'曆'=>1,'歷'=>1,'轢'=>1,'年'=>1,'憐'=>1,'戀'=>1,'撚'=>1,'漣'=>1,'煉'=>1,'璉'=>1,'秊'=>1,'練'=>1,'聯'=>1,'輦'=>1,'蓮'=>1,'連'=>1,'鍊'=>1,'列'=>1,'劣'=>1,'咽'=>1,'烈'=>1,'裂'=>1,'說'=>1,'廉'=>1,'念'=>1,'捻'=>1,'殮'=>1,'簾'=>1,'獵'=>1,'令'=>1,'囹'=>1,'寧'=>1,'嶺'=>1,'怜'=>1,'玲'=>1,'瑩'=>1,'羚'=>1,'聆'=>1,'鈴'=>1,'零'=>1,'靈'=>1,'領'=>1,'例'=>1,'禮'=>1,'醴'=>1,'隸'=>1,'惡'=>1,'了'=>1,'僚'=>1,'寮'=>1,'尿'=>1,'料'=>1,'樂'=>1,'燎'=>1,'療'=>1,'蓼'=>1,'遼'=>1,'龍'=>1,'暈'=>1,'阮'=>1,'劉'=>1,'杻'=>1,'柳'=>1,'流'=>1,'溜'=>1,'琉'=>1,'留'=>1,'硫'=>1,'紐'=>1,'類'=>1,'六'=>1,'戮'=>1,'陸'=>1,'倫'=>1,'崙'=>1,'淪'=>1,'輪'=>1,'律'=>1,'慄'=>1,'栗'=>1,'率'=>1,'隆'=>1,'利'=>1,'吏'=>1,'履'=>1,'易'=>1,'李'=>1,'梨'=>1,'泥'=>1,'理'=>1,'痢'=>1,'罹'=>1,'裏'=>1,'裡'=>1,'里'=>1,'離'=>1,'匿'=>1,'溺'=>1,'吝'=>1,'燐'=>1,'璘'=>1,'藺'=>1,'隣'=>1,'鱗'=>1,'麟'=>1,'林'=>1,'淋'=>1,'臨'=>1,'立'=>1,'笠'=>1,'粒'=>1,'狀'=>1,'炙'=>1,'識'=>1,'什'=>1,'茶'=>1,'刺'=>1,'切'=>1,'度'=>1,'拓'=>1,'糖'=>1,'宅'=>1,'洞'=>1,'暴'=>1,'輻'=>1,'行'=>1,'降'=>1,'見'=>1,'廓'=>1,'兀'=>1,'嗀'=>1,'塚'=>1,'晴'=>1,'凞'=>1,'猪'=>1,'益'=>1,'礼'=>1,'神'=>1,'祥'=>1,'福'=>1,'靖'=>1,'精'=>1,'羽'=>1,'蘒'=>1,'諸'=>1,'逸'=>1,'都'=>1,'飯'=>1,'飼'=>1,'館'=>1,'鶴'=>1,'侮'=>1,'僧'=>1,'免'=>1,'勉'=>1,'勤'=>1,'卑'=>1,'喝'=>1,'嘆'=>1,'器'=>1,'塀'=>1,'墨'=>1,'層'=>1,'屮'=>1,'悔'=>1,'慨'=>1,'憎'=>1,'懲'=>1,'敏'=>1,'既'=>1,'暑'=>1,'梅'=>1,'海'=>1,'渚'=>1,'漢'=>1,'煮'=>1,'爫'=>1,'琢'=>1,'碑'=>1,'社'=>1,'祉'=>1,'祈'=>1,'祐'=>1,'祖'=>1,'祝'=>1,'禍'=>1,'禎'=>1,'穀'=>1,'突'=>1,'節'=>1,'練'=>1,'縉'=>1,'繁'=>1,'署'=>1,'者'=>1,'臭'=>1,'艹'=>1,'艹'=>1,'著'=>1,'褐'=>1,'視'=>1,'謁'=>1,'謹'=>1,'賓'=>1,'贈'=>1,'辶'=>1,'逸'=>1,'難'=>1,'響'=>1,'頻'=>1,'並'=>1,'况'=>1,'全'=>1,'侀'=>1,'充'=>1,'冀'=>1,'勇'=>1,'勺'=>1,'喝'=>1,'啕'=>1,'喙'=>1,'嗢'=>1,'塚'=>1,'墳'=>1,'奄'=>1,'奔'=>1,'婢'=>1,'嬨'=>1,'廒'=>1,'廙'=>1,'彩'=>1,'徭'=>1,'惘'=>1,'慎'=>1,'愈'=>1,'憎'=>1,'慠'=>1,'懲'=>1,'戴'=>1,'揄'=>1,'搜'=>1,'摒'=>1,'敖'=>1,'晴'=>1,'朗'=>1,'望'=>1,'杖'=>1,'歹'=>1,'殺'=>1,'流'=>1,'滛'=>1,'滋'=>1,'漢'=>1,'瀞'=>1,'煮'=>1,'瞧'=>1,'爵'=>1,'犯'=>1,'猪'=>1,'瑱'=>1,'甆'=>1,'画'=>1,'瘝'=>1,'瘟'=>1,'益'=>1,'盛'=>1,'直'=>1,'睊'=>1,'着'=>1,'磌'=>1,'窱'=>1,'節'=>1,'类'=>1,'絛'=>1,'練'=>1,'缾'=>1,'者'=>1,'荒'=>1,'華'=>1,'蝹'=>1,'襁'=>1,'覆'=>1,'視'=>1,'調'=>1,'諸'=>1,'請'=>1,'謁'=>1,'諾'=>1,'諭'=>1,'謹'=>1,'變'=>1,'贈'=>1,'輸'=>1,'遲'=>1,'醙'=>1,'鉶'=>1,'陼'=>1,'難'=>1,'靖'=>1,'韛'=>1,'響'=>1,'頋'=>1,'頻'=>1,'鬒'=>1,'龜'=>1,'𢡊'=>1,'𢡄'=>1,'𣏕'=>1,'㮝'=>1,'䀘'=>1,'䀹'=>1,'𥉉'=>1,'𥳐'=>1,'𧻓'=>1,'齃'=>1,'龎'=>1,'ff'=>1,'fi'=>1,'fl'=>1,'ffi'=>1,'ffl'=>1,'ſt'=>1,'st'=>1,'ﬓ'=>1,'ﬔ'=>1,'ﬕ'=>1,'ﬖ'=>1,'ﬗ'=>1,'יִ'=>1,'ײַ'=>1,'ﬠ'=>1,'ﬡ'=>1,'ﬢ'=>1,'ﬣ'=>1,'ﬤ'=>1,'ﬥ'=>1,'ﬦ'=>1,'ﬧ'=>1,'ﬨ'=>1,'﬩'=>1,'שׁ'=>1,'שׂ'=>1,'שּׁ'=>1,'שּׂ'=>1,'אַ'=>1,'אָ'=>1,'אּ'=>1,'בּ'=>1,'גּ'=>1,'דּ'=>1,'הּ'=>1,'וּ'=>1,'זּ'=>1,'טּ'=>1,'יּ'=>1,'ךּ'=>1,'כּ'=>1,'לּ'=>1,'מּ'=>1,'נּ'=>1,'סּ'=>1,'ףּ'=>1,'פּ'=>1,'צּ'=>1,'קּ'=>1,'רּ'=>1,'שּ'=>1,'תּ'=>1,'וֹ'=>1,'בֿ'=>1,'כֿ'=>1,'פֿ'=>1,'ﭏ'=>1,'ﭐ'=>1,'ﭑ'=>1,'ﭒ'=>1,'ﭓ'=>1,'ﭔ'=>1,'ﭕ'=>1,'ﭖ'=>1,'ﭗ'=>1,'ﭘ'=>1,'ﭙ'=>1,'ﭚ'=>1,'ﭛ'=>1,'ﭜ'=>1,'ﭝ'=>1,'ﭞ'=>1,'ﭟ'=>1,'ﭠ'=>1,'ﭡ'=>1,'ﭢ'=>1,'ﭣ'=>1,'ﭤ'=>1,'ﭥ'=>1,'ﭦ'=>1,'ﭧ'=>1,'ﭨ'=>1,'ﭩ'=>1,'ﭪ'=>1,'ﭫ'=>1,'ﭬ'=>1,'ﭭ'=>1,'ﭮ'=>1,'ﭯ'=>1,'ﭰ'=>1,'ﭱ'=>1,'ﭲ'=>1,'ﭳ'=>1,'ﭴ'=>1,'ﭵ'=>1,'ﭶ'=>1,'ﭷ'=>1,'ﭸ'=>1,'ﭹ'=>1,'ﭺ'=>1,'ﭻ'=>1,'ﭼ'=>1,'ﭽ'=>1,'ﭾ'=>1,'ﭿ'=>1,'ﮀ'=>1,'ﮁ'=>1,'ﮂ'=>1,'ﮃ'=>1,'ﮄ'=>1,'ﮅ'=>1,'ﮆ'=>1,'ﮇ'=>1,'ﮈ'=>1,'ﮉ'=>1,'ﮊ'=>1,'ﮋ'=>1,'ﮌ'=>1,'ﮍ'=>1,'ﮎ'=>1,'ﮏ'=>1,'ﮐ'=>1,'ﮑ'=>1,'ﮒ'=>1,'ﮓ'=>1,'ﮔ'=>1,'ﮕ'=>1,'ﮖ'=>1,'ﮗ'=>1,'ﮘ'=>1,'ﮙ'=>1,'ﮚ'=>1,'ﮛ'=>1,'ﮜ'=>1,'ﮝ'=>1,'ﮞ'=>1,'ﮟ'=>1,'ﮠ'=>1,'ﮡ'=>1,'ﮢ'=>1,'ﮣ'=>1,'ﮤ'=>1,'ﮥ'=>1,'ﮦ'=>1,'ﮧ'=>1,'ﮨ'=>1,'ﮩ'=>1,'ﮪ'=>1,'ﮫ'=>1,'ﮬ'=>1,'ﮭ'=>1,'ﮮ'=>1,'ﮯ'=>1,'ﮰ'=>1,'ﮱ'=>1,'ﯓ'=>1,'ﯔ'=>1,'ﯕ'=>1,'ﯖ'=>1,'ﯗ'=>1,'ﯘ'=>1,'ﯙ'=>1,'ﯚ'=>1,'ﯛ'=>1,'ﯜ'=>1,'ﯝ'=>1,'ﯞ'=>1,'ﯟ'=>1,'ﯠ'=>1,'ﯡ'=>1,'ﯢ'=>1,'ﯣ'=>1,'ﯤ'=>1,'ﯥ'=>1,'ﯦ'=>1,'ﯧ'=>1,'ﯨ'=>1,'ﯩ'=>1,'ﯪ'=>1,'ﯫ'=>1,'ﯬ'=>1,'ﯭ'=>1,'ﯮ'=>1,'ﯯ'=>1,'ﯰ'=>1,'ﯱ'=>1,'ﯲ'=>1,'ﯳ'=>1,'ﯴ'=>1,'ﯵ'=>1,'ﯶ'=>1,'ﯷ'=>1,'ﯸ'=>1,'ﯹ'=>1,'ﯺ'=>1,'ﯻ'=>1,'ﯼ'=>1,'ﯽ'=>1,'ﯾ'=>1,'ﯿ'=>1,'ﰀ'=>1,'ﰁ'=>1,'ﰂ'=>1,'ﰃ'=>1,'ﰄ'=>1,'ﰅ'=>1,'ﰆ'=>1,'ﰇ'=>1,'ﰈ'=>1,'ﰉ'=>1,'ﰊ'=>1,'ﰋ'=>1,'ﰌ'=>1,'ﰍ'=>1,'ﰎ'=>1,'ﰏ'=>1,'ﰐ'=>1,'ﰑ'=>1,'ﰒ'=>1,'ﰓ'=>1,'ﰔ'=>1,'ﰕ'=>1,'ﰖ'=>1,'ﰗ'=>1,'ﰘ'=>1,'ﰙ'=>1,'ﰚ'=>1,'ﰛ'=>1,'ﰜ'=>1,'ﰝ'=>1,'ﰞ'=>1,'ﰟ'=>1,'ﰠ'=>1,'ﰡ'=>1,'ﰢ'=>1,'ﰣ'=>1,'ﰤ'=>1,'ﰥ'=>1,'ﰦ'=>1,'ﰧ'=>1,'ﰨ'=>1,'ﰩ'=>1,'ﰪ'=>1,'ﰫ'=>1,'ﰬ'=>1,'ﰭ'=>1,'ﰮ'=>1,'ﰯ'=>1,'ﰰ'=>1,'ﰱ'=>1,'ﰲ'=>1,'ﰳ'=>1,'ﰴ'=>1,'ﰵ'=>1,'ﰶ'=>1,'ﰷ'=>1,'ﰸ'=>1,'ﰹ'=>1,'ﰺ'=>1,'ﰻ'=>1,'ﰼ'=>1,'ﰽ'=>1,'ﰾ'=>1,'ﰿ'=>1,'ﱀ'=>1,'ﱁ'=>1,'ﱂ'=>1,'ﱃ'=>1,'ﱄ'=>1,'ﱅ'=>1,'ﱆ'=>1,'ﱇ'=>1,'ﱈ'=>1,'ﱉ'=>1,'ﱊ'=>1,'ﱋ'=>1,'ﱌ'=>1,'ﱍ'=>1,'ﱎ'=>1,'ﱏ'=>1,'ﱐ'=>1,'ﱑ'=>1,'ﱒ'=>1,'ﱓ'=>1,'ﱔ'=>1,'ﱕ'=>1,'ﱖ'=>1,'ﱗ'=>1,'ﱘ'=>1,'ﱙ'=>1,'ﱚ'=>1,'ﱛ'=>1,'ﱜ'=>1,'ﱝ'=>1,'ﱞ'=>1,'ﱟ'=>1,'ﱠ'=>1,'ﱡ'=>1,'ﱢ'=>1,'ﱣ'=>1,'ﱤ'=>1,'ﱥ'=>1,'ﱦ'=>1,'ﱧ'=>1,'ﱨ'=>1,'ﱩ'=>1,'ﱪ'=>1,'ﱫ'=>1,'ﱬ'=>1,'ﱭ'=>1,'ﱮ'=>1,'ﱯ'=>1,'ﱰ'=>1,'ﱱ'=>1,'ﱲ'=>1,'ﱳ'=>1,'ﱴ'=>1,'ﱵ'=>1,'ﱶ'=>1,'ﱷ'=>1,'ﱸ'=>1,'ﱹ'=>1,'ﱺ'=>1,'ﱻ'=>1,'ﱼ'=>1,'ﱽ'=>1,'ﱾ'=>1,'ﱿ'=>1,'ﲀ'=>1,'ﲁ'=>1,'ﲂ'=>1,'ﲃ'=>1,'ﲄ'=>1,'ﲅ'=>1,'ﲆ'=>1,'ﲇ'=>1,'ﲈ'=>1,'ﲉ'=>1,'ﲊ'=>1,'ﲋ'=>1,'ﲌ'=>1,'ﲍ'=>1,'ﲎ'=>1,'ﲏ'=>1,'ﲐ'=>1,'ﲑ'=>1,'ﲒ'=>1,'ﲓ'=>1,'ﲔ'=>1,'ﲕ'=>1,'ﲖ'=>1,'ﲗ'=>1,'ﲘ'=>1,'ﲙ'=>1,'ﲚ'=>1,'ﲛ'=>1,'ﲜ'=>1,'ﲝ'=>1,'ﲞ'=>1,'ﲟ'=>1,'ﲠ'=>1,'ﲡ'=>1,'ﲢ'=>1,'ﲣ'=>1,'ﲤ'=>1,'ﲥ'=>1,'ﲦ'=>1,'ﲧ'=>1,'ﲨ'=>1,'ﲩ'=>1,'ﲪ'=>1,'ﲫ'=>1,'ﲬ'=>1,'ﲭ'=>1,'ﲮ'=>1,'ﲯ'=>1,'ﲰ'=>1,'ﲱ'=>1,'ﲲ'=>1,'ﲳ'=>1,'ﲴ'=>1,'ﲵ'=>1,'ﲶ'=>1,'ﲷ'=>1,'ﲸ'=>1,'ﲹ'=>1,'ﲺ'=>1,'ﲻ'=>1,'ﲼ'=>1,'ﲽ'=>1,'ﲾ'=>1,'ﲿ'=>1,'ﳀ'=>1,'ﳁ'=>1,'ﳂ'=>1,'ﳃ'=>1,'ﳄ'=>1,'ﳅ'=>1,'ﳆ'=>1,'ﳇ'=>1,'ﳈ'=>1,'ﳉ'=>1,'ﳊ'=>1,'ﳋ'=>1,'ﳌ'=>1,'ﳍ'=>1,'ﳎ'=>1,'ﳏ'=>1,'ﳐ'=>1,'ﳑ'=>1,'ﳒ'=>1,'ﳓ'=>1,'ﳔ'=>1,'ﳕ'=>1,'ﳖ'=>1,'ﳗ'=>1,'ﳘ'=>1,'ﳙ'=>1,'ﳚ'=>1,'ﳛ'=>1,'ﳜ'=>1,'ﳝ'=>1,'ﳞ'=>1,'ﳟ'=>1,'ﳠ'=>1,'ﳡ'=>1,'ﳢ'=>1,'ﳣ'=>1,'ﳤ'=>1,'ﳥ'=>1,'ﳦ'=>1,'ﳧ'=>1,'ﳨ'=>1,'ﳩ'=>1,'ﳪ'=>1,'ﳫ'=>1,'ﳬ'=>1,'ﳭ'=>1,'ﳮ'=>1,'ﳯ'=>1,'ﳰ'=>1,'ﳱ'=>1,'ﳲ'=>1,'ﳳ'=>1,'ﳴ'=>1,'ﳵ'=>1,'ﳶ'=>1,'ﳷ'=>1,'ﳸ'=>1,'ﳹ'=>1,'ﳺ'=>1,'ﳻ'=>1,'ﳼ'=>1,'ﳽ'=>1,'ﳾ'=>1,'ﳿ'=>1,'ﴀ'=>1,'ﴁ'=>1,'ﴂ'=>1,'ﴃ'=>1,'ﴄ'=>1,'ﴅ'=>1,'ﴆ'=>1,'ﴇ'=>1,'ﴈ'=>1,'ﴉ'=>1,'ﴊ'=>1,'ﴋ'=>1,'ﴌ'=>1,'ﴍ'=>1,'ﴎ'=>1,'ﴏ'=>1,'ﴐ'=>1,'ﴑ'=>1,'ﴒ'=>1,'ﴓ'=>1,'ﴔ'=>1,'ﴕ'=>1,'ﴖ'=>1,'ﴗ'=>1,'ﴘ'=>1,'ﴙ'=>1,'ﴚ'=>1,'ﴛ'=>1,'ﴜ'=>1,'ﴝ'=>1,'ﴞ'=>1,'ﴟ'=>1,'ﴠ'=>1,'ﴡ'=>1,'ﴢ'=>1,'ﴣ'=>1,'ﴤ'=>1,'ﴥ'=>1,'ﴦ'=>1,'ﴧ'=>1,'ﴨ'=>1,'ﴩ'=>1,'ﴪ'=>1,'ﴫ'=>1,'ﴬ'=>1,'ﴭ'=>1,'ﴮ'=>1,'ﴯ'=>1,'ﴰ'=>1,'ﴱ'=>1,'ﴲ'=>1,'ﴳ'=>1,'ﴴ'=>1,'ﴵ'=>1,'ﴶ'=>1,'ﴷ'=>1,'ﴸ'=>1,'ﴹ'=>1,'ﴺ'=>1,'ﴻ'=>1,'ﴼ'=>1,'ﴽ'=>1,'ﵐ'=>1,'ﵑ'=>1,'ﵒ'=>1,'ﵓ'=>1,'ﵔ'=>1,'ﵕ'=>1,'ﵖ'=>1,'ﵗ'=>1,'ﵘ'=>1,'ﵙ'=>1,'ﵚ'=>1,'ﵛ'=>1,'ﵜ'=>1,'ﵝ'=>1,'ﵞ'=>1,'ﵟ'=>1,'ﵠ'=>1,'ﵡ'=>1,'ﵢ'=>1,'ﵣ'=>1,'ﵤ'=>1,'ﵥ'=>1,'ﵦ'=>1,'ﵧ'=>1,'ﵨ'=>1,'ﵩ'=>1,'ﵪ'=>1,'ﵫ'=>1,'ﵬ'=>1,'ﵭ'=>1,'ﵮ'=>1,'ﵯ'=>1,'ﵰ'=>1,'ﵱ'=>1,'ﵲ'=>1,'ﵳ'=>1,'ﵴ'=>1,'ﵵ'=>1,'ﵶ'=>1,'ﵷ'=>1,'ﵸ'=>1,'ﵹ'=>1,'ﵺ'=>1,'ﵻ'=>1,'ﵼ'=>1,'ﵽ'=>1,'ﵾ'=>1,'ﵿ'=>1,'ﶀ'=>1,'ﶁ'=>1,'ﶂ'=>1,'ﶃ'=>1,'ﶄ'=>1,'ﶅ'=>1,'ﶆ'=>1,'ﶇ'=>1,'ﶈ'=>1,'ﶉ'=>1,'ﶊ'=>1,'ﶋ'=>1,'ﶌ'=>1,'ﶍ'=>1,'ﶎ'=>1,'ﶏ'=>1,'ﶒ'=>1,'ﶓ'=>1,'ﶔ'=>1,'ﶕ'=>1,'ﶖ'=>1,'ﶗ'=>1,'ﶘ'=>1,'ﶙ'=>1,'ﶚ'=>1,'ﶛ'=>1,'ﶜ'=>1,'ﶝ'=>1,'ﶞ'=>1,'ﶟ'=>1,'ﶠ'=>1,'ﶡ'=>1,'ﶢ'=>1,'ﶣ'=>1,'ﶤ'=>1,'ﶥ'=>1,'ﶦ'=>1,'ﶧ'=>1,'ﶨ'=>1,'ﶩ'=>1,'ﶪ'=>1,'ﶫ'=>1,'ﶬ'=>1,'ﶭ'=>1,'ﶮ'=>1,'ﶯ'=>1,'ﶰ'=>1,'ﶱ'=>1,'ﶲ'=>1,'ﶳ'=>1,'ﶴ'=>1,'ﶵ'=>1,'ﶶ'=>1,'ﶷ'=>1,'ﶸ'=>1,'ﶹ'=>1,'ﶺ'=>1,'ﶻ'=>1,'ﶼ'=>1,'ﶽ'=>1,'ﶾ'=>1,'ﶿ'=>1,'ﷀ'=>1,'ﷁ'=>1,'ﷂ'=>1,'ﷃ'=>1,'ﷄ'=>1,'ﷅ'=>1,'ﷆ'=>1,'ﷇ'=>1,'ﷰ'=>1,'ﷱ'=>1,'ﷲ'=>1,'ﷳ'=>1,'ﷴ'=>1,'ﷵ'=>1,'ﷶ'=>1,'ﷷ'=>1,'ﷸ'=>1,'ﷹ'=>1,'ﷺ'=>1,'ﷻ'=>1,'﷼'=>1,'︐'=>1,'︑'=>1,'︒'=>1,'︓'=>1,'︔'=>1,'︕'=>1,'︖'=>1,'︗'=>1,'︘'=>1,'︙'=>1,'︰'=>1,'︱'=>1,'︲'=>1,'︳'=>1,'︴'=>1,'︵'=>1,'︶'=>1,'︷'=>1,'︸'=>1,'︹'=>1,'︺'=>1,'︻'=>1,'︼'=>1,'︽'=>1,'︾'=>1,'︿'=>1,'﹀'=>1,'﹁'=>1,'﹂'=>1,'﹃'=>1,'﹄'=>1,'﹇'=>1,'﹈'=>1,'﹉'=>1,'﹊'=>1,'﹋'=>1,'﹌'=>1,'﹍'=>1,'﹎'=>1,'﹏'=>1,'﹐'=>1,'﹑'=>1,'﹒'=>1,'﹔'=>1,'﹕'=>1,'﹖'=>1,'﹗'=>1,'﹘'=>1,'﹙'=>1,'﹚'=>1,'﹛'=>1,'﹜'=>1,'﹝'=>1,'﹞'=>1,'﹟'=>1,'﹠'=>1,'﹡'=>1,'﹢'=>1,'﹣'=>1,'﹤'=>1,'﹥'=>1,'﹦'=>1,'﹨'=>1,'﹩'=>1,'﹪'=>1,'﹫'=>1,'ﹰ'=>1,'ﹱ'=>1,'ﹲ'=>1,'ﹴ'=>1,'ﹶ'=>1,'ﹷ'=>1,'ﹸ'=>1,'ﹹ'=>1,'ﹺ'=>1,'ﹻ'=>1,'ﹼ'=>1,'ﹽ'=>1,'ﹾ'=>1,'ﹿ'=>1,'ﺀ'=>1,'ﺁ'=>1,'ﺂ'=>1,'ﺃ'=>1,'ﺄ'=>1,'ﺅ'=>1,'ﺆ'=>1,'ﺇ'=>1,'ﺈ'=>1,'ﺉ'=>1,'ﺊ'=>1,'ﺋ'=>1,'ﺌ'=>1,'ﺍ'=>1,'ﺎ'=>1,'ﺏ'=>1,'ﺐ'=>1,'ﺑ'=>1,'ﺒ'=>1,'ﺓ'=>1,'ﺔ'=>1,'ﺕ'=>1,'ﺖ'=>1,'ﺗ'=>1,'ﺘ'=>1,'ﺙ'=>1,'ﺚ'=>1,'ﺛ'=>1,'ﺜ'=>1,'ﺝ'=>1,'ﺞ'=>1,'ﺟ'=>1,'ﺠ'=>1,'ﺡ'=>1,'ﺢ'=>1,'ﺣ'=>1,'ﺤ'=>1,'ﺥ'=>1,'ﺦ'=>1,'ﺧ'=>1,'ﺨ'=>1,'ﺩ'=>1,'ﺪ'=>1,'ﺫ'=>1,'ﺬ'=>1,'ﺭ'=>1,'ﺮ'=>1,'ﺯ'=>1,'ﺰ'=>1,'ﺱ'=>1,'ﺲ'=>1,'ﺳ'=>1,'ﺴ'=>1,'ﺵ'=>1,'ﺶ'=>1,'ﺷ'=>1,'ﺸ'=>1,'ﺹ'=>1,'ﺺ'=>1,'ﺻ'=>1,'ﺼ'=>1,'ﺽ'=>1,'ﺾ'=>1,'ﺿ'=>1,'ﻀ'=>1,'ﻁ'=>1,'ﻂ'=>1,'ﻃ'=>1,'ﻄ'=>1,'ﻅ'=>1,'ﻆ'=>1,'ﻇ'=>1,'ﻈ'=>1,'ﻉ'=>1,'ﻊ'=>1,'ﻋ'=>1,'ﻌ'=>1,'ﻍ'=>1,'ﻎ'=>1,'ﻏ'=>1,'ﻐ'=>1,'ﻑ'=>1,'ﻒ'=>1,'ﻓ'=>1,'ﻔ'=>1,'ﻕ'=>1,'ﻖ'=>1,'ﻗ'=>1,'ﻘ'=>1,'ﻙ'=>1,'ﻚ'=>1,'ﻛ'=>1,'ﻜ'=>1,'ﻝ'=>1,'ﻞ'=>1,'ﻟ'=>1,'ﻠ'=>1,'ﻡ'=>1,'ﻢ'=>1,'ﻣ'=>1,'ﻤ'=>1,'ﻥ'=>1,'ﻦ'=>1,'ﻧ'=>1,'ﻨ'=>1,'ﻩ'=>1,'ﻪ'=>1,'ﻫ'=>1,'ﻬ'=>1,'ﻭ'=>1,'ﻮ'=>1,'ﻯ'=>1,'ﻰ'=>1,'ﻱ'=>1,'ﻲ'=>1,'ﻳ'=>1,'ﻴ'=>1,'ﻵ'=>1,'ﻶ'=>1,'ﻷ'=>1,'ﻸ'=>1,'ﻹ'=>1,'ﻺ'=>1,'ﻻ'=>1,'ﻼ'=>1,'!'=>1,'"'=>1,'#'=>1,'$'=>1,'%'=>1,'&'=>1,'''=>1,'('=>1,')'=>1,'*'=>1,'+'=>1,','=>1,'-'=>1,'.'=>1,'/'=>1,'0'=>1,'1'=>1,'2'=>1,'3'=>1,'4'=>1,'5'=>1,'6'=>1,'7'=>1,'8'=>1,'9'=>1,':'=>1,';'=>1,'<'=>1,'='=>1,'>'=>1,'?'=>1,'@'=>1,'A'=>1,'B'=>1,'C'=>1,'D'=>1,'E'=>1,'F'=>1,'G'=>1,'H'=>1,'I'=>1,'J'=>1,'K'=>1,'L'=>1,'M'=>1,'N'=>1,'O'=>1,'P'=>1,'Q'=>1,'R'=>1,'S'=>1,'T'=>1,'U'=>1,'V'=>1,'W'=>1,'X'=>1,'Y'=>1,'Z'=>1,'['=>1,'\'=>1,']'=>1,'^'=>1,'_'=>1,'`'=>1,'a'=>1,'b'=>1,'c'=>1,'d'=>1,'e'=>1,'f'=>1,'g'=>1,'h'=>1,'i'=>1,'j'=>1,'k'=>1,'l'=>1,'m'=>1,'n'=>1,'o'=>1,'p'=>1,'q'=>1,'r'=>1,'s'=>1,'t'=>1,'u'=>1,'v'=>1,'w'=>1,'x'=>1,'y'=>1,'z'=>1,'{'=>1,'|'=>1,'}'=>1,'~'=>1,'⦅'=>1,'⦆'=>1,'。'=>1,'「'=>1,'」'=>1,'、'=>1,'・'=>1,'ヲ'=>1,'ァ'=>1,'ィ'=>1,'ゥ'=>1,'ェ'=>1,'ォ'=>1,'ャ'=>1,'ュ'=>1,'ョ'=>1,'ッ'=>1,'ー'=>1,'ア'=>1,'イ'=>1,'ウ'=>1,'エ'=>1,'オ'=>1,'カ'=>1,'キ'=>1,'ク'=>1,'ケ'=>1,'コ'=>1,'サ'=>1,'シ'=>1,'ス'=>1,'セ'=>1,'ソ'=>1,'タ'=>1,'チ'=>1,'ツ'=>1,'テ'=>1,'ト'=>1,'ナ'=>1,'ニ'=>1,'ヌ'=>1,'ネ'=>1,'ノ'=>1,'ハ'=>1,'ヒ'=>1,'フ'=>1,'ヘ'=>1,'ホ'=>1,'マ'=>1,'ミ'=>1,'ム'=>1,'メ'=>1,'モ'=>1,'ヤ'=>1,'ユ'=>1,'ヨ'=>1,'ラ'=>1,'リ'=>1,'ル'=>1,'レ'=>1,'ロ'=>1,'ワ'=>1,'ン'=>1,'゙'=>1,'゚'=>1,'ᅠ'=>1,'ᄀ'=>1,'ᄁ'=>1,'ᆪ'=>1,'ᄂ'=>1,'ᆬ'=>1,'ᆭ'=>1,'ᄃ'=>1,'ᄄ'=>1,'ᄅ'=>1,'ᆰ'=>1,'ᆱ'=>1,'ᆲ'=>1,'ᆳ'=>1,'ᆴ'=>1,'ᆵ'=>1,'ᄚ'=>1,'ᄆ'=>1,'ᄇ'=>1,'ᄈ'=>1,'ᄡ'=>1,'ᄉ'=>1,'ᄊ'=>1,'ᄋ'=>1,'ᄌ'=>1,'ᄍ'=>1,'ᄎ'=>1,'ᄏ'=>1,'ᄐ'=>1,'ᄑ'=>1,'ᄒ'=>1,'ᅡ'=>1,'ᅢ'=>1,'ᅣ'=>1,'ᅤ'=>1,'ᅥ'=>1,'ᅦ'=>1,'ᅧ'=>1,'ᅨ'=>1,'ᅩ'=>1,'ᅪ'=>1,'ᅫ'=>1,'ᅬ'=>1,'ᅭ'=>1,'ᅮ'=>1,'ᅯ'=>1,'ᅰ'=>1,'ᅱ'=>1,'ᅲ'=>1,'ᅳ'=>1,'ᅴ'=>1,'ᅵ'=>1,'¢'=>1,'£'=>1,'¬'=>1,' ̄'=>1,'¦'=>1,'¥'=>1,'₩'=>1,'│'=>1,'←'=>1,'↑'=>1,'→'=>1,'↓'=>1,'■'=>1,'○'=>1,'𝅗𝅥'=>1,'𝅘𝅥'=>1,'𝅘𝅥𝅮'=>1,'𝅘𝅥𝅯'=>1,'𝅘𝅥𝅰'=>1,'𝅘𝅥𝅱'=>1,'𝅘𝅥𝅲'=>1,'𝆹𝅥'=>1,'𝆺𝅥'=>1,'𝆹𝅥𝅮'=>1,'𝆺𝅥𝅮'=>1,'𝆹𝅥𝅯'=>1,'𝆺𝅥𝅯'=>1,'𝐀'=>1,'𝐁'=>1,'𝐂'=>1,'𝐃'=>1,'𝐄'=>1,'𝐅'=>1,'𝐆'=>1,'𝐇'=>1,'𝐈'=>1,'𝐉'=>1,'𝐊'=>1,'𝐋'=>1,'𝐌'=>1,'𝐍'=>1,'𝐎'=>1,'𝐏'=>1,'𝐐'=>1,'𝐑'=>1,'𝐒'=>1,'𝐓'=>1,'𝐔'=>1,'𝐕'=>1,'𝐖'=>1,'𝐗'=>1,'𝐘'=>1,'𝐙'=>1,'𝐚'=>1,'𝐛'=>1,'𝐜'=>1,'𝐝'=>1,'𝐞'=>1,'𝐟'=>1,'𝐠'=>1,'𝐡'=>1,'𝐢'=>1,'𝐣'=>1,'𝐤'=>1,'𝐥'=>1,'𝐦'=>1,'𝐧'=>1,'𝐨'=>1,'𝐩'=>1,'𝐪'=>1,'𝐫'=>1,'𝐬'=>1,'𝐭'=>1,'𝐮'=>1,'𝐯'=>1,'𝐰'=>1,'𝐱'=>1,'𝐲'=>1,'𝐳'=>1,'𝐴'=>1,'𝐵'=>1,'𝐶'=>1,'𝐷'=>1,'𝐸'=>1,'𝐹'=>1,'𝐺'=>1,'𝐻'=>1,'𝐼'=>1,'𝐽'=>1,'𝐾'=>1,'𝐿'=>1,'𝑀'=>1,'𝑁'=>1,'𝑂'=>1,'𝑃'=>1,'𝑄'=>1,'𝑅'=>1,'𝑆'=>1,'𝑇'=>1,'𝑈'=>1,'𝑉'=>1,'𝑊'=>1,'𝑋'=>1,'𝑌'=>1,'𝑍'=>1,'𝑎'=>1,'𝑏'=>1,'𝑐'=>1,'𝑑'=>1,'𝑒'=>1,'𝑓'=>1,'𝑔'=>1,'𝑖'=>1,'𝑗'=>1,'𝑘'=>1,'𝑙'=>1,'𝑚'=>1,'𝑛'=>1,'𝑜'=>1,'𝑝'=>1,'𝑞'=>1,'𝑟'=>1,'𝑠'=>1,'𝑡'=>1,'𝑢'=>1,'𝑣'=>1,'𝑤'=>1,'𝑥'=>1,'𝑦'=>1,'𝑧'=>1,'𝑨'=>1,'𝑩'=>1,'𝑪'=>1,'𝑫'=>1,'𝑬'=>1,'𝑭'=>1,'𝑮'=>1,'𝑯'=>1,'𝑰'=>1,'𝑱'=>1,'𝑲'=>1,'𝑳'=>1,'𝑴'=>1,'𝑵'=>1,'𝑶'=>1,'𝑷'=>1,'𝑸'=>1,'𝑹'=>1,'𝑺'=>1,'𝑻'=>1,'𝑼'=>1,'𝑽'=>1,'𝑾'=>1,'𝑿'=>1,'𝒀'=>1,'𝒁'=>1,'𝒂'=>1,'𝒃'=>1,'𝒄'=>1,'𝒅'=>1,'𝒆'=>1,'𝒇'=>1,'𝒈'=>1,'𝒉'=>1,'𝒊'=>1,'𝒋'=>1,'𝒌'=>1,'𝒍'=>1,'𝒎'=>1,'𝒏'=>1,'𝒐'=>1,'𝒑'=>1,'𝒒'=>1,'𝒓'=>1,'𝒔'=>1,'𝒕'=>1,'𝒖'=>1,'𝒗'=>1,'𝒘'=>1,'𝒙'=>1,'𝒚'=>1,'𝒛'=>1,'𝒜'=>1,'𝒞'=>1,'𝒟'=>1,'𝒢'=>1,'𝒥'=>1,'𝒦'=>1,'𝒩'=>1,'𝒪'=>1,'𝒫'=>1,'𝒬'=>1,'𝒮'=>1,'𝒯'=>1,'𝒰'=>1,'𝒱'=>1,'𝒲'=>1,'𝒳'=>1,'𝒴'=>1,'𝒵'=>1,'𝒶'=>1,'𝒷'=>1,'𝒸'=>1,'𝒹'=>1,'𝒻'=>1,'𝒽'=>1,'𝒾'=>1,'𝒿'=>1,'𝓀'=>1,'𝓁'=>1,'𝓂'=>1,'𝓃'=>1,'𝓅'=>1,'𝓆'=>1,'𝓇'=>1,'𝓈'=>1,'𝓉'=>1,'𝓊'=>1,'𝓋'=>1,'𝓌'=>1,'𝓍'=>1,'𝓎'=>1,'𝓏'=>1,'𝓐'=>1,'𝓑'=>1,'𝓒'=>1,'𝓓'=>1,'𝓔'=>1,'𝓕'=>1,'𝓖'=>1,'𝓗'=>1,'𝓘'=>1,'𝓙'=>1,'𝓚'=>1,'𝓛'=>1,'𝓜'=>1,'𝓝'=>1,'𝓞'=>1,'𝓟'=>1,'𝓠'=>1,'𝓡'=>1,'𝓢'=>1,'𝓣'=>1,'𝓤'=>1,'𝓥'=>1,'𝓦'=>1,'𝓧'=>1,'𝓨'=>1,'𝓩'=>1,'𝓪'=>1,'𝓫'=>1,'𝓬'=>1,'𝓭'=>1,'𝓮'=>1,'𝓯'=>1,'𝓰'=>1,'𝓱'=>1,'𝓲'=>1,'𝓳'=>1,'𝓴'=>1,'𝓵'=>1,'𝓶'=>1,'𝓷'=>1,'𝓸'=>1,'𝓹'=>1,'𝓺'=>1,'𝓻'=>1,'𝓼'=>1,'𝓽'=>1,'𝓾'=>1,'𝓿'=>1,'𝔀'=>1,'𝔁'=>1,'𝔂'=>1,'𝔃'=>1,'𝔄'=>1,'𝔅'=>1,'𝔇'=>1,'𝔈'=>1,'𝔉'=>1,'𝔊'=>1,'𝔍'=>1,'𝔎'=>1,'𝔏'=>1,'𝔐'=>1,'𝔑'=>1,'𝔒'=>1,'𝔓'=>1,'𝔔'=>1,'𝔖'=>1,'𝔗'=>1,'𝔘'=>1,'𝔙'=>1,'𝔚'=>1,'𝔛'=>1,'𝔜'=>1,'𝔞'=>1,'𝔟'=>1,'𝔠'=>1,'𝔡'=>1,'𝔢'=>1,'𝔣'=>1,'𝔤'=>1,'𝔥'=>1,'𝔦'=>1,'𝔧'=>1,'𝔨'=>1,'𝔩'=>1,'𝔪'=>1,'𝔫'=>1,'𝔬'=>1,'𝔭'=>1,'𝔮'=>1,'𝔯'=>1,'𝔰'=>1,'𝔱'=>1,'𝔲'=>1,'𝔳'=>1,'𝔴'=>1,'𝔵'=>1,'𝔶'=>1,'𝔷'=>1,'𝔸'=>1,'𝔹'=>1,'𝔻'=>1,'𝔼'=>1,'𝔽'=>1,'𝔾'=>1,'𝕀'=>1,'𝕁'=>1,'𝕂'=>1,'𝕃'=>1,'𝕄'=>1,'𝕆'=>1,'𝕊'=>1,'𝕋'=>1,'𝕌'=>1,'𝕍'=>1,'𝕎'=>1,'𝕏'=>1,'𝕐'=>1,'𝕒'=>1,'𝕓'=>1,'𝕔'=>1,'𝕕'=>1,'𝕖'=>1,'𝕗'=>1,'𝕘'=>1,'𝕙'=>1,'𝕚'=>1,'𝕛'=>1,'𝕜'=>1,'𝕝'=>1,'𝕞'=>1,'𝕟'=>1,'𝕠'=>1,'𝕡'=>1,'𝕢'=>1,'𝕣'=>1,'𝕤'=>1,'𝕥'=>1,'𝕦'=>1,'𝕧'=>1,'𝕨'=>1,'𝕩'=>1,'𝕪'=>1,'𝕫'=>1,'𝕬'=>1,'𝕭'=>1,'𝕮'=>1,'𝕯'=>1,'𝕰'=>1,'𝕱'=>1,'𝕲'=>1,'𝕳'=>1,'𝕴'=>1,'𝕵'=>1,'𝕶'=>1,'𝕷'=>1,'𝕸'=>1,'𝕹'=>1,'𝕺'=>1,'𝕻'=>1,'𝕼'=>1,'𝕽'=>1,'𝕾'=>1,'𝕿'=>1,'𝖀'=>1,'𝖁'=>1,'𝖂'=>1,'𝖃'=>1,'𝖄'=>1,'𝖅'=>1,'𝖆'=>1,'𝖇'=>1,'𝖈'=>1,'𝖉'=>1,'𝖊'=>1,'𝖋'=>1,'𝖌'=>1,'𝖍'=>1,'𝖎'=>1,'𝖏'=>1,'𝖐'=>1,'𝖑'=>1,'𝖒'=>1,'𝖓'=>1,'𝖔'=>1,'𝖕'=>1,'𝖖'=>1,'𝖗'=>1,'𝖘'=>1,'𝖙'=>1,'𝖚'=>1,'𝖛'=>1,'𝖜'=>1,'𝖝'=>1,'𝖞'=>1,'𝖟'=>1,'𝖠'=>1,'𝖡'=>1,'𝖢'=>1,'𝖣'=>1,'𝖤'=>1,'𝖥'=>1,'𝖦'=>1,'𝖧'=>1,'𝖨'=>1,'𝖩'=>1,'𝖪'=>1,'𝖫'=>1,'𝖬'=>1,'𝖭'=>1,'𝖮'=>1,'𝖯'=>1,'𝖰'=>1,'𝖱'=>1,'𝖲'=>1,'𝖳'=>1,'𝖴'=>1,'𝖵'=>1,'𝖶'=>1,'𝖷'=>1,'𝖸'=>1,'𝖹'=>1,'𝖺'=>1,'𝖻'=>1,'𝖼'=>1,'𝖽'=>1,'𝖾'=>1,'𝖿'=>1,'𝗀'=>1,'𝗁'=>1,'𝗂'=>1,'𝗃'=>1,'𝗄'=>1,'𝗅'=>1,'𝗆'=>1,'𝗇'=>1,'𝗈'=>1,'𝗉'=>1,'𝗊'=>1,'𝗋'=>1,'𝗌'=>1,'𝗍'=>1,'𝗎'=>1,'𝗏'=>1,'𝗐'=>1,'𝗑'=>1,'𝗒'=>1,'𝗓'=>1,'𝗔'=>1,'𝗕'=>1,'𝗖'=>1,'𝗗'=>1,'𝗘'=>1,'𝗙'=>1,'𝗚'=>1,'𝗛'=>1,'𝗜'=>1,'𝗝'=>1,'𝗞'=>1,'𝗟'=>1,'𝗠'=>1,'𝗡'=>1,'𝗢'=>1,'𝗣'=>1,'𝗤'=>1,'𝗥'=>1,'𝗦'=>1,'𝗧'=>1,'𝗨'=>1,'𝗩'=>1,'𝗪'=>1,'𝗫'=>1,'𝗬'=>1,'𝗭'=>1,'𝗮'=>1,'𝗯'=>1,'𝗰'=>1,'𝗱'=>1,'𝗲'=>1,'𝗳'=>1,'𝗴'=>1,'𝗵'=>1,'𝗶'=>1,'𝗷'=>1,'𝗸'=>1,'𝗹'=>1,'𝗺'=>1,'𝗻'=>1,'𝗼'=>1,'𝗽'=>1,'𝗾'=>1,'𝗿'=>1,'𝘀'=>1,'𝘁'=>1,'𝘂'=>1,'𝘃'=>1,'𝘄'=>1,'𝘅'=>1,'𝘆'=>1,'𝘇'=>1,'𝘈'=>1,'𝘉'=>1,'𝘊'=>1,'𝘋'=>1,'𝘌'=>1,'𝘍'=>1,'𝘎'=>1,'𝘏'=>1,'𝘐'=>1,'𝘑'=>1,'𝘒'=>1,'𝘓'=>1,'𝘔'=>1,'𝘕'=>1,'𝘖'=>1,'𝘗'=>1,'𝘘'=>1,'𝘙'=>1,'𝘚'=>1,'𝘛'=>1,'𝘜'=>1,'𝘝'=>1,'𝘞'=>1,'𝘟'=>1,'𝘠'=>1,'𝘡'=>1,'𝘢'=>1,'𝘣'=>1,'𝘤'=>1,'𝘥'=>1,'𝘦'=>1,'𝘧'=>1,'𝘨'=>1,'𝘩'=>1,'𝘪'=>1,'𝘫'=>1,'𝘬'=>1,'𝘭'=>1,'𝘮'=>1,'𝘯'=>1,'𝘰'=>1,'𝘱'=>1,'𝘲'=>1,'𝘳'=>1,'𝘴'=>1,'𝘵'=>1,'𝘶'=>1,'𝘷'=>1,'𝘸'=>1,'𝘹'=>1,'𝘺'=>1,'𝘻'=>1,'𝘼'=>1,'𝘽'=>1,'𝘾'=>1,'𝘿'=>1,'𝙀'=>1,'𝙁'=>1,'𝙂'=>1,'𝙃'=>1,'𝙄'=>1,'𝙅'=>1,'𝙆'=>1,'𝙇'=>1,'𝙈'=>1,'𝙉'=>1,'𝙊'=>1,'𝙋'=>1,'𝙌'=>1,'𝙍'=>1,'𝙎'=>1,'𝙏'=>1,'𝙐'=>1,'𝙑'=>1,'𝙒'=>1,'𝙓'=>1,'𝙔'=>1,'𝙕'=>1,'𝙖'=>1,'𝙗'=>1,'𝙘'=>1,'𝙙'=>1,'𝙚'=>1,'𝙛'=>1,'𝙜'=>1,'𝙝'=>1,'𝙞'=>1,'𝙟'=>1,'𝙠'=>1,'𝙡'=>1,'𝙢'=>1,'𝙣'=>1,'𝙤'=>1,'𝙥'=>1,'𝙦'=>1,'𝙧'=>1,'𝙨'=>1,'𝙩'=>1,'𝙪'=>1,'𝙫'=>1,'𝙬'=>1,'𝙭'=>1,'𝙮'=>1,'𝙯'=>1,'𝙰'=>1,'𝙱'=>1,'𝙲'=>1,'𝙳'=>1,'𝙴'=>1,'𝙵'=>1,'𝙶'=>1,'𝙷'=>1,'𝙸'=>1,'𝙹'=>1,'𝙺'=>1,'𝙻'=>1,'𝙼'=>1,'𝙽'=>1,'𝙾'=>1,'𝙿'=>1,'𝚀'=>1,'𝚁'=>1,'𝚂'=>1,'𝚃'=>1,'𝚄'=>1,'𝚅'=>1,'𝚆'=>1,'𝚇'=>1,'𝚈'=>1,'𝚉'=>1,'𝚊'=>1,'𝚋'=>1,'𝚌'=>1,'𝚍'=>1,'𝚎'=>1,'𝚏'=>1,'𝚐'=>1,'𝚑'=>1,'𝚒'=>1,'𝚓'=>1,'𝚔'=>1,'𝚕'=>1,'𝚖'=>1,'𝚗'=>1,'𝚘'=>1,'𝚙'=>1,'𝚚'=>1,'𝚛'=>1,'𝚜'=>1,'𝚝'=>1,'𝚞'=>1,'𝚟'=>1,'𝚠'=>1,'𝚡'=>1,'𝚢'=>1,'𝚣'=>1,'𝚤'=>1,'𝚥'=>1,'𝚨'=>1,'𝚩'=>1,'𝚪'=>1,'𝚫'=>1,'𝚬'=>1,'𝚭'=>1,'𝚮'=>1,'𝚯'=>1,'𝚰'=>1,'𝚱'=>1,'𝚲'=>1,'𝚳'=>1,'𝚴'=>1,'𝚵'=>1,'𝚶'=>1,'𝚷'=>1,'𝚸'=>1,'𝚹'=>1,'𝚺'=>1,'𝚻'=>1,'𝚼'=>1,'𝚽'=>1,'𝚾'=>1,'𝚿'=>1,'𝛀'=>1,'𝛁'=>1,'𝛂'=>1,'𝛃'=>1,'𝛄'=>1,'𝛅'=>1,'𝛆'=>1,'𝛇'=>1,'𝛈'=>1,'𝛉'=>1,'𝛊'=>1,'𝛋'=>1,'𝛌'=>1,'𝛍'=>1,'𝛎'=>1,'𝛏'=>1,'𝛐'=>1,'𝛑'=>1,'𝛒'=>1,'𝛓'=>1,'𝛔'=>1,'𝛕'=>1,'𝛖'=>1,'𝛗'=>1,'𝛘'=>1,'𝛙'=>1,'𝛚'=>1,'𝛛'=>1,'𝛜'=>1,'𝛝'=>1,'𝛞'=>1,'𝛟'=>1,'𝛠'=>1,'𝛡'=>1,'𝛢'=>1,'𝛣'=>1,'𝛤'=>1,'𝛥'=>1,'𝛦'=>1,'𝛧'=>1,'𝛨'=>1,'𝛩'=>1,'𝛪'=>1,'𝛫'=>1,'𝛬'=>1,'𝛭'=>1,'𝛮'=>1,'𝛯'=>1,'𝛰'=>1,'𝛱'=>1,'𝛲'=>1,'𝛳'=>1,'𝛴'=>1,'𝛵'=>1,'𝛶'=>1,'𝛷'=>1,'𝛸'=>1,'𝛹'=>1,'𝛺'=>1,'𝛻'=>1,'𝛼'=>1,'𝛽'=>1,'𝛾'=>1,'𝛿'=>1,'𝜀'=>1,'𝜁'=>1,'𝜂'=>1,'𝜃'=>1,'𝜄'=>1,'𝜅'=>1,'𝜆'=>1,'𝜇'=>1,'𝜈'=>1,'𝜉'=>1,'𝜊'=>1,'𝜋'=>1,'𝜌'=>1,'𝜍'=>1,'𝜎'=>1,'𝜏'=>1,'𝜐'=>1,'𝜑'=>1,'𝜒'=>1,'𝜓'=>1,'𝜔'=>1,'𝜕'=>1,'𝜖'=>1,'𝜗'=>1,'𝜘'=>1,'𝜙'=>1,'𝜚'=>1,'𝜛'=>1,'𝜜'=>1,'𝜝'=>1,'𝜞'=>1,'𝜟'=>1,'𝜠'=>1,'𝜡'=>1,'𝜢'=>1,'𝜣'=>1,'𝜤'=>1,'𝜥'=>1,'𝜦'=>1,'𝜧'=>1,'𝜨'=>1,'𝜩'=>1,'𝜪'=>1,'𝜫'=>1,'𝜬'=>1,'𝜭'=>1,'𝜮'=>1,'𝜯'=>1,'𝜰'=>1,'𝜱'=>1,'𝜲'=>1,'𝜳'=>1,'𝜴'=>1,'𝜵'=>1,'𝜶'=>1,'𝜷'=>1,'𝜸'=>1,'𝜹'=>1,'𝜺'=>1,'𝜻'=>1,'𝜼'=>1,'𝜽'=>1,'𝜾'=>1,'𝜿'=>1,'𝝀'=>1,'𝝁'=>1,'𝝂'=>1,'𝝃'=>1,'𝝄'=>1,'𝝅'=>1,'𝝆'=>1,'𝝇'=>1,'𝝈'=>1,'𝝉'=>1,'𝝊'=>1,'𝝋'=>1,'𝝌'=>1,'𝝍'=>1,'𝝎'=>1,'𝝏'=>1,'𝝐'=>1,'𝝑'=>1,'𝝒'=>1,'𝝓'=>1,'𝝔'=>1,'𝝕'=>1,'𝝖'=>1,'𝝗'=>1,'𝝘'=>1,'𝝙'=>1,'𝝚'=>1,'𝝛'=>1,'𝝜'=>1,'𝝝'=>1,'𝝞'=>1,'𝝟'=>1,'𝝠'=>1,'𝝡'=>1,'𝝢'=>1,'𝝣'=>1,'𝝤'=>1,'𝝥'=>1,'𝝦'=>1,'𝝧'=>1,'𝝨'=>1,'𝝩'=>1,'𝝪'=>1,'𝝫'=>1,'𝝬'=>1,'𝝭'=>1,'𝝮'=>1,'𝝯'=>1,'𝝰'=>1,'𝝱'=>1,'𝝲'=>1,'𝝳'=>1,'𝝴'=>1,'𝝵'=>1,'𝝶'=>1,'𝝷'=>1,'𝝸'=>1,'𝝹'=>1,'𝝺'=>1,'𝝻'=>1,'𝝼'=>1,'𝝽'=>1,'𝝾'=>1,'𝝿'=>1,'𝞀'=>1,'𝞁'=>1,'𝞂'=>1,'𝞃'=>1,'𝞄'=>1,'𝞅'=>1,'𝞆'=>1,'𝞇'=>1,'𝞈'=>1,'𝞉'=>1,'𝞊'=>1,'𝞋'=>1,'𝞌'=>1,'𝞍'=>1,'𝞎'=>1,'𝞏'=>1,'𝞐'=>1,'𝞑'=>1,'𝞒'=>1,'𝞓'=>1,'𝞔'=>1,'𝞕'=>1,'𝞖'=>1,'𝞗'=>1,'𝞘'=>1,'𝞙'=>1,'𝞚'=>1,'𝞛'=>1,'𝞜'=>1,'𝞝'=>1,'𝞞'=>1,'𝞟'=>1,'𝞠'=>1,'𝞡'=>1,'𝞢'=>1,'𝞣'=>1,'𝞤'=>1,'𝞥'=>1,'𝞦'=>1,'𝞧'=>1,'𝞨'=>1,'𝞩'=>1,'𝞪'=>1,'𝞫'=>1,'𝞬'=>1,'𝞭'=>1,'𝞮'=>1,'𝞯'=>1,'𝞰'=>1,'𝞱'=>1,'𝞲'=>1,'𝞳'=>1,'𝞴'=>1,'𝞵'=>1,'𝞶'=>1,'𝞷'=>1,'𝞸'=>1,'𝞹'=>1,'𝞺'=>1,'𝞻'=>1,'𝞼'=>1,'𝞽'=>1,'𝞾'=>1,'𝞿'=>1,'𝟀'=>1,'𝟁'=>1,'𝟂'=>1,'𝟃'=>1,'𝟄'=>1,'𝟅'=>1,'𝟆'=>1,'𝟇'=>1,'𝟈'=>1,'𝟉'=>1,'𝟊'=>1,'𝟋'=>1,'𝟎'=>1,'𝟏'=>1,'𝟐'=>1,'𝟑'=>1,'𝟒'=>1,'𝟓'=>1,'𝟔'=>1,'𝟕'=>1,'𝟖'=>1,'𝟗'=>1,'𝟘'=>1,'𝟙'=>1,'𝟚'=>1,'𝟛'=>1,'𝟜'=>1,'𝟝'=>1,'𝟞'=>1,'𝟟'=>1,'𝟠'=>1,'𝟡'=>1,'𝟢'=>1,'𝟣'=>1,'𝟤'=>1,'𝟥'=>1,'𝟦'=>1,'𝟧'=>1,'𝟨'=>1,'𝟩'=>1,'𝟪'=>1,'𝟫'=>1,'𝟬'=>1,'𝟭'=>1,'𝟮'=>1,'𝟯'=>1,'𝟰'=>1,'𝟱'=>1,'𝟲'=>1,'𝟳'=>1,'𝟴'=>1,'𝟵'=>1,'𝟶'=>1,'𝟷'=>1,'𝟸'=>1,'𝟹'=>1,'𝟺'=>1,'𝟻'=>1,'𝟼'=>1,'𝟽'=>1,'𝟾'=>1,'𝟿'=>1,'丽'=>1,'丸'=>1,'乁'=>1,'𠄢'=>1,'你'=>1,'侮'=>1,'侻'=>1,'倂'=>1,'偺'=>1,'備'=>1,'僧'=>1,'像'=>1,'㒞'=>1,'𠘺'=>1,'免'=>1,'兔'=>1,'兤'=>1,'具'=>1,'𠔜'=>1,'㒹'=>1,'內'=>1,'再'=>1,'𠕋'=>1,'冗'=>1,'冤'=>1,'仌'=>1,'冬'=>1,'况'=>1,'𩇟'=>1,'凵'=>1,'刃'=>1,'㓟'=>1,'刻'=>1,'剆'=>1,'割'=>1,'剷'=>1,'㔕'=>1,'勇'=>1,'勉'=>1,'勤'=>1,'勺'=>1,'包'=>1,'匆'=>1,'北'=>1,'卉'=>1,'卑'=>1,'博'=>1,'即'=>1,'卽'=>1,'卿'=>1,'卿'=>1,'卿'=>1,'𠨬'=>1,'灰'=>1,'及'=>1,'叟'=>1,'𠭣'=>1,'叫'=>1,'叱'=>1,'吆'=>1,'咞'=>1,'吸'=>1,'呈'=>1,'周'=>1,'咢'=>1,'哶'=>1,'唐'=>1,'啓'=>1,'啣'=>1,'善'=>1,'善'=>1,'喙'=>1,'喫'=>1,'喳'=>1,'嗂'=>1,'圖'=>1,'嘆'=>1,'圗'=>1,'噑'=>1,'噴'=>1,'切'=>1,'壮'=>1,'城'=>1,'埴'=>1,'堍'=>1,'型'=>1,'堲'=>1,'報'=>1,'墬'=>1,'𡓤'=>1,'売'=>1,'壷'=>1,'夆'=>1,'多'=>1,'夢'=>1,'奢'=>1,'𡚨'=>1,'𡛪'=>1,'姬'=>1,'娛'=>1,'娧'=>1,'姘'=>1,'婦'=>1,'㛮'=>1,'㛼'=>1,'嬈'=>1,'嬾'=>1,'嬾'=>1,'𡧈'=>1,'寃'=>1,'寘'=>1,'寧'=>1,'寳'=>1,'𡬘'=>1,'寿'=>1,'将'=>1,'当'=>1,'尢'=>1,'㞁'=>1,'屠'=>1,'屮'=>1,'峀'=>1,'岍'=>1,'𡷤'=>1,'嵃'=>1,'𡷦'=>1,'嵮'=>1,'嵫'=>1,'嵼'=>1,'巡'=>1,'巢'=>1,'㠯'=>1,'巽'=>1,'帨'=>1,'帽'=>1,'幩'=>1,'㡢'=>1,'𢆃'=>1,'㡼'=>1,'庰'=>1,'庳'=>1,'庶'=>1,'廊'=>1,'𪎒'=>1,'廾'=>1,'𢌱'=>1,'𢌱'=>1,'舁'=>1,'弢'=>1,'弢'=>1,'㣇'=>1,'𣊸'=>1,'𦇚'=>1,'形'=>1,'彫'=>1,'㣣'=>1,'徚'=>1,'忍'=>1,'志'=>1,'忹'=>1,'悁'=>1,'㤺'=>1,'㤜'=>1,'悔'=>1,'𢛔'=>1,'惇'=>1,'慈'=>1,'慌'=>1,'慎'=>1,'慌'=>1,'慺'=>1,'憎'=>1,'憲'=>1,'憤'=>1,'憯'=>1,'懞'=>1,'懲'=>1,'懶'=>1,'成'=>1,'戛'=>1,'扝'=>1,'抱'=>1,'拔'=>1,'捐'=>1,'𢬌'=>1,'挽'=>1,'拼'=>1,'捨'=>1,'掃'=>1,'揤'=>1,'𢯱'=>1,'搢'=>1,'揅'=>1,'掩'=>1,'㨮'=>1,'摩'=>1,'摾'=>1,'撝'=>1,'摷'=>1,'㩬'=>1,'敏'=>1,'敬'=>1,'𣀊'=>1,'旣'=>1,'書'=>1,'晉'=>1,'㬙'=>1,'暑'=>1,'㬈'=>1,'㫤'=>1,'冒'=>1,'冕'=>1,'最'=>1,'暜'=>1,'肭'=>1,'䏙'=>1,'朗'=>1,'望'=>1,'朡'=>1,'杞'=>1,'杓'=>1,'𣏃'=>1,'㭉'=>1,'柺'=>1,'枅'=>1,'桒'=>1,'梅'=>1,'𣑭'=>1,'梎'=>1,'栟'=>1,'椔'=>1,'㮝'=>1,'楂'=>1,'榣'=>1,'槪'=>1,'檨'=>1,'𣚣'=>1,'櫛'=>1,'㰘'=>1,'次'=>1,'𣢧'=>1,'歔'=>1,'㱎'=>1,'歲'=>1,'殟'=>1,'殺'=>1,'殻'=>1,'𣪍'=>1,'𡴋'=>1,'𣫺'=>1,'汎'=>1,'𣲼'=>1,'沿'=>1,'泍'=>1,'汧'=>1,'洖'=>1,'派'=>1,'海'=>1,'流'=>1,'浩'=>1,'浸'=>1,'涅'=>1,'𣴞'=>1,'洴'=>1,'港'=>1,'湮'=>1,'㴳'=>1,'滋'=>1,'滇'=>1,'𣻑'=>1,'淹'=>1,'潮'=>1,'𣽞'=>1,'𣾎'=>1,'濆'=>1,'瀹'=>1,'瀞'=>1,'瀛'=>1,'㶖'=>1,'灊'=>1,'災'=>1,'灷'=>1,'炭'=>1,'𠔥'=>1,'煅'=>1,'𤉣'=>1,'熜'=>1,'𤎫'=>1,'爨'=>1,'爵'=>1,'牐'=>1,'𤘈'=>1,'犀'=>1,'犕'=>1,'𤜵'=>1,'𤠔'=>1,'獺'=>1,'王'=>1,'㺬'=>1,'玥'=>1,'㺸'=>1,'㺸'=>1,'瑇'=>1,'瑜'=>1,'瑱'=>1,'璅'=>1,'瓊'=>1,'㼛'=>1,'甤'=>1,'𤰶'=>1,'甾'=>1,'𤲒'=>1,'異'=>1,'𢆟'=>1,'瘐'=>1,'𤾡'=>1,'𤾸'=>1,'𥁄'=>1,'㿼'=>1,'䀈'=>1,'直'=>1,'𥃳'=>1,'𥃲'=>1,'𥄙'=>1,'𥄳'=>1,'眞'=>1,'真'=>1,'真'=>1,'睊'=>1,'䀹'=>1,'瞋'=>1,'䁆'=>1,'䂖'=>1,'𥐝'=>1,'硎'=>1,'碌'=>1,'磌'=>1,'䃣'=>1,'𥘦'=>1,'祖'=>1,'𥚚'=>1,'𥛅'=>1,'福'=>1,'秫'=>1,'䄯'=>1,'穀'=>1,'穊'=>1,'穏'=>1,'𥥼'=>1,'𥪧'=>1,'𥪧'=>1,'竮'=>1,'䈂'=>1,'𥮫'=>1,'篆'=>1,'築'=>1,'䈧'=>1,'𥲀'=>1,'糒'=>1,'䊠'=>1,'糨'=>1,'糣'=>1,'紀'=>1,'𥾆'=>1,'絣'=>1,'䌁'=>1,'緇'=>1,'縂'=>1,'繅'=>1,'䌴'=>1,'𦈨'=>1,'𦉇'=>1,'䍙'=>1,'𦋙'=>1,'罺'=>1,'𦌾'=>1,'羕'=>1,'翺'=>1,'者'=>1,'𦓚'=>1,'𦔣'=>1,'聠'=>1,'𦖨'=>1,'聰'=>1,'𣍟'=>1,'䏕'=>1,'育'=>1,'脃'=>1,'䐋'=>1,'脾'=>1,'媵'=>1,'𦞧'=>1,'𦞵'=>1,'𣎓'=>1,'𣎜'=>1,'舁'=>1,'舄'=>1,'辞'=>1,'䑫'=>1,'芑'=>1,'芋'=>1,'芝'=>1,'劳'=>1,'花'=>1,'芳'=>1,'芽'=>1,'苦'=>1,'𦬼'=>1,'若'=>1,'茝'=>1,'荣'=>1,'莭'=>1,'茣'=>1,'莽'=>1,'菧'=>1,'著'=>1,'荓'=>1,'菊'=>1,'菌'=>1,'菜'=>1,'𦰶'=>1,'𦵫'=>1,'𦳕'=>1,'䔫'=>1,'蓱'=>1,'蓳'=>1,'蔖'=>1,'𧏊'=>1,'蕤'=>1,'𦼬'=>1,'䕝'=>1,'䕡'=>1,'𦾱'=>1,'𧃒'=>1,'䕫'=>1,'虐'=>1,'虜'=>1,'虧'=>1,'虩'=>1,'蚩'=>1,'蚈'=>1,'蜎'=>1,'蛢'=>1,'蝹'=>1,'蜨'=>1,'蝫'=>1,'螆'=>1,'䗗'=>1,'蟡'=>1,'蠁'=>1,'䗹'=>1,'衠'=>1,'衣'=>1,'𧙧'=>1,'裗'=>1,'裞'=>1,'䘵'=>1,'裺'=>1,'㒻'=>1,'𧢮'=>1,'𧥦'=>1,'䚾'=>1,'䛇'=>1,'誠'=>1,'諭'=>1,'變'=>1,'豕'=>1,'𧲨'=>1,'貫'=>1,'賁'=>1,'贛'=>1,'起'=>1,'𧼯'=>1,'𠠄'=>1,'跋'=>1,'趼'=>1,'跰'=>1,'𠣞'=>1,'軔'=>1,'輸'=>1,'𨗒'=>1,'𨗭'=>1,'邔'=>1,'郱'=>1,'鄑'=>1,'𨜮'=>1,'鄛'=>1,'鈸'=>1,'鋗'=>1,'鋘'=>1,'鉼'=>1,'鏹'=>1,'鐕'=>1,'𨯺'=>1,'開'=>1,'䦕'=>1,'閷'=>1,'𨵷'=>1,'䧦'=>1,'雃'=>1,'嶲'=>1,'霣'=>1,'𩅅'=>1,'𩈚'=>1,'䩮'=>1,'䩶'=>1,'韠'=>1,'𩐊'=>1,'䪲'=>1,'𩒖'=>1,'頋'=>1,'頋'=>1,'頩'=>1,'𩖶'=>1,'飢'=>1,'䬳'=>1,'餩'=>1,'馧'=>1,'駂'=>1,'駾'=>1,'䯎'=>1,'𩬰'=>1,'鬒'=>1,'鱀'=>1,'鳽'=>1,'䳎'=>1,'䳭'=>1,'鵧'=>1,'𪃎'=>1,'䳸'=>1,'𪄅'=>1,'𪈎'=>1,'𪊑'=>1,'麻'=>1,'䵖'=>1,'黹'=>1,'黾'=>1,'鼅'=>1,'鼏'=>1,'鼖'=>1,'鼻'=>1,'𪘀'=>1,'̀'=>0,'́'=>0,'̂'=>0,'̃'=>0,'̄'=>0,'̆'=>0,'̇'=>0,'̈'=>0,'̉'=>0,'̊'=>0,'̋'=>0,'̌'=>0,'̏'=>0,'̑'=>0,'̓'=>0,'̔'=>0,'̛'=>0,'̣'=>0,'̤'=>0,'̥'=>0,'̦'=>0,'̧'=>0,'̨'=>0,'̭'=>0,'̮'=>0,'̰'=>0,'̱'=>0,'̸'=>0,'͂'=>0,'ͅ'=>0,'ٓ'=>0,'ٔ'=>0,'ٕ'=>0,'़'=>0,'া'=>0,'ৗ'=>0,'ା'=>0,'ୖ'=>0,'ୗ'=>0,'ா'=>0,'ௗ'=>0,'ౖ'=>0,'ೂ'=>0,'ೕ'=>0,'ೖ'=>0,'ാ'=>0,'ൗ'=>0,'්'=>0,'ා'=>0,'ෟ'=>0,'ီ'=>0,'ᅡ'=>0,'ᅢ'=>0,'ᅣ'=>0,'ᅤ'=>0,'ᅥ'=>0,'ᅦ'=>0,'ᅧ'=>0,'ᅨ'=>0,'ᅩ'=>0,'ᅪ'=>0,'ᅫ'=>0,'ᅬ'=>0,'ᅭ'=>0,'ᅮ'=>0,'ᅯ'=>0,'ᅰ'=>0,'ᅱ'=>0,'ᅲ'=>0,'ᅳ'=>0,'ᅴ'=>0,'ᅵ'=>0,'ᆨ'=>0,'ᆩ'=>0,'ᆪ'=>0,'ᆫ'=>0,'ᆬ'=>0,'ᆭ'=>0,'ᆮ'=>0,'ᆯ'=>0,'ᆰ'=>0,'ᆱ'=>0,'ᆲ'=>0,'ᆳ'=>0,'ᆴ'=>0,'ᆵ'=>0,'ᆶ'=>0,'ᆷ'=>0,'ᆸ'=>0,'ᆹ'=>0,'ᆺ'=>0,'ᆻ'=>0,'ᆼ'=>0,'ᆽ'=>0,'ᆾ'=>0,'ᆿ'=>0,'ᇀ'=>0,'ᇁ'=>0,'ᇂ'=>0,'ᬵ'=>0,'゙'=>0,'゚'=>0);
diff --git a/phpBB/includes/utf/data/utf_normalizer_common.php b/phpBB/includes/utf/data/utf_normalizer_common.php
index befc17d410..2eb7feac69 100644
--- a/phpBB/includes/utf/data/utf_normalizer_common.php
+++ b/phpBB/includes/utf/data/utf_normalizer_common.php
@@ -1,4 +1,4 @@
<?php
$GLOBALS['utf_jamo_index']=array('ᄀ'=>44032,'ᄁ'=>44620,'ᄂ'=>45208,'ᄃ'=>45796,'ᄄ'=>46384,'ᄅ'=>46972,'ᄆ'=>47560,'ᄇ'=>48148,'ᄈ'=>48736,'ᄉ'=>49324,'ᄊ'=>49912,'ᄋ'=>50500,'ᄌ'=>51088,'ᄍ'=>51676,'ᄎ'=>52264,'ᄏ'=>52852,'ᄐ'=>53440,'ᄑ'=>54028,'ᄒ'=>54616,'ᅡ'=>0,'ᅢ'=>28,'ᅣ'=>56,'ᅤ'=>84,'ᅥ'=>112,'ᅦ'=>140,'ᅧ'=>168,'ᅨ'=>196,'ᅩ'=>224,'ᅪ'=>252,'ᅫ'=>280,'ᅬ'=>308,'ᅭ'=>336,'ᅮ'=>364,'ᅯ'=>392,'ᅰ'=>420,'ᅱ'=>448,'ᅲ'=>476,'ᅳ'=>504,'ᅴ'=>532,'ᅵ'=>560,'ᆧ'=>0,'ᆨ'=>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);
$GLOBALS['utf_jamo_type']=array('ᄀ'=>0,'ᄁ'=>0,'ᄂ'=>0,'ᄃ'=>0,'ᄄ'=>0,'ᄅ'=>0,'ᄆ'=>0,'ᄇ'=>0,'ᄈ'=>0,'ᄉ'=>0,'ᄊ'=>0,'ᄋ'=>0,'ᄌ'=>0,'ᄍ'=>0,'ᄎ'=>0,'ᄏ'=>0,'ᄐ'=>0,'ᄑ'=>0,'ᄒ'=>0,'ᅡ'=>1,'ᅢ'=>1,'ᅣ'=>1,'ᅤ'=>1,'ᅥ'=>1,'ᅦ'=>1,'ᅧ'=>1,'ᅨ'=>1,'ᅩ'=>1,'ᅪ'=>1,'ᅫ'=>1,'ᅬ'=>1,'ᅭ'=>1,'ᅮ'=>1,'ᅯ'=>1,'ᅰ'=>1,'ᅱ'=>1,'ᅲ'=>1,'ᅳ'=>1,'ᅴ'=>1,'ᅵ'=>1,'ᆧ'=>2,'ᆨ'=>2,'ᆩ'=>2,'ᆪ'=>2,'ᆫ'=>2,'ᆬ'=>2,'ᆭ'=>2,'ᆮ'=>2,'ᆯ'=>2,'ᆰ'=>2,'ᆱ'=>2,'ᆲ'=>2,'ᆳ'=>2,'ᆴ'=>2,'ᆵ'=>2,'ᆶ'=>2,'ᆷ'=>2,'ᆸ'=>2,'ᆹ'=>2,'ᆺ'=>2,'ᆻ'=>2,'ᆼ'=>2,'ᆽ'=>2,'ᆾ'=>2,'ᆿ'=>2,'ᇀ'=>2,'ᇁ'=>2,'ᇂ'=>2);
-$GLOBALS['utf_combining_class']=array('̀'=>230,'́'=>230,'̂'=>230,'̃'=>230,'̄'=>230,'̅'=>230,'̆'=>230,'̇'=>230,'̈'=>230,'̉'=>230,'̊'=>230,'̋'=>230,'̌'=>230,'̍'=>230,'̎'=>230,'̏'=>230,'̐'=>230,'̑'=>230,'̒'=>230,'̓'=>230,'̔'=>230,'̕'=>232,'̖'=>220,'̗'=>220,'̘'=>220,'̙'=>220,'̚'=>232,'̛'=>216,'̜'=>220,'̝'=>220,'̞'=>220,'̟'=>220,'̠'=>220,'̡'=>202,'̢'=>202,'̣'=>220,'̤'=>220,'̥'=>220,'̦'=>220,'̧'=>202,'̨'=>202,'̩'=>220,'̪'=>220,'̫'=>220,'̬'=>220,'̭'=>220,'̮'=>220,'̯'=>220,'̰'=>220,'̱'=>220,'̲'=>220,'̳'=>220,'̴'=>1,'̵'=>1,'̶'=>1,'̷'=>1,'̸'=>1,'̹'=>220,'̺'=>220,'̻'=>220,'̼'=>220,'̽'=>230,'̾'=>230,'̿'=>230,'̀'=>230,'́'=>230,'͂'=>230,'̓'=>230,'̈́'=>230,'ͅ'=>240,'͆'=>230,'͇'=>220,'͈'=>220,'͉'=>220,'͊'=>230,'͋'=>230,'͌'=>230,'͍'=>220,'͎'=>220,'͐'=>230,'͑'=>230,'͒'=>230,'͓'=>220,'͔'=>220,'͕'=>220,'͖'=>220,'͗'=>230,'͘'=>232,'͙'=>220,'͚'=>220,'͛'=>230,'͜'=>233,'͝'=>234,'͞'=>234,'͟'=>233,'͠'=>234,'͡'=>234,'͢'=>233,'ͣ'=>230,'ͤ'=>230,'ͥ'=>230,'ͦ'=>230,'ͧ'=>230,'ͨ'=>230,'ͩ'=>230,'ͪ'=>230,'ͫ'=>230,'ͬ'=>230,'ͭ'=>230,'ͮ'=>230,'ͯ'=>230,'҃'=>230,'҄'=>230,'҅'=>230,'҆'=>230,'֑'=>220,'֒'=>230,'֓'=>230,'֔'=>230,'֕'=>230,'֖'=>220,'֗'=>230,'֘'=>230,'֙'=>230,'֚'=>222,'֛'=>220,'֜'=>230,'֝'=>230,'֞'=>230,'֟'=>230,'֠'=>230,'֡'=>230,'֢'=>220,'֣'=>220,'֤'=>220,'֥'=>220,'֦'=>220,'֧'=>220,'֨'=>230,'֩'=>230,'֪'=>220,'֫'=>230,'֬'=>230,'֭'=>222,'֮'=>228,'֯'=>230,'ְ'=>10,'ֱ'=>11,'ֲ'=>12,'ֳ'=>13,'ִ'=>14,'ֵ'=>15,'ֶ'=>16,'ַ'=>17,'ָ'=>18,'ֹ'=>19,'ֺ'=>19,'ֻ'=>20,'ּ'=>21,'ֽ'=>22,'ֿ'=>23,'ׁ'=>24,'ׂ'=>25,'ׄ'=>230,'ׅ'=>220,'ׇ'=>18,'ؐ'=>230,'ؑ'=>230,'ؒ'=>230,'ؓ'=>230,'ؔ'=>230,'ؕ'=>230,'ً'=>27,'ٌ'=>28,'ٍ'=>29,'َ'=>30,'ُ'=>31,'ِ'=>32,'ّ'=>33,'ْ'=>34,'ٓ'=>230,'ٔ'=>230,'ٕ'=>220,'ٖ'=>220,'ٗ'=>230,'٘'=>230,'ٙ'=>230,'ٚ'=>230,'ٛ'=>230,'ٜ'=>220,'ٝ'=>230,'ٞ'=>230,'ٰ'=>35,'ۖ'=>230,'ۗ'=>230,'ۘ'=>230,'ۙ'=>230,'ۚ'=>230,'ۛ'=>230,'ۜ'=>230,'۟'=>230,'۠'=>230,'ۡ'=>230,'ۢ'=>230,'ۣ'=>220,'ۤ'=>230,'ۧ'=>230,'ۨ'=>230,'۪'=>220,'۫'=>230,'۬'=>230,'ۭ'=>220,'ܑ'=>36,'ܰ'=>230,'ܱ'=>220,'ܲ'=>230,'ܳ'=>230,'ܴ'=>220,'ܵ'=>230,'ܶ'=>230,'ܷ'=>220,'ܸ'=>220,'ܹ'=>220,'ܺ'=>230,'ܻ'=>220,'ܼ'=>220,'ܽ'=>230,'ܾ'=>220,'ܿ'=>230,'݀'=>230,'݁'=>230,'݂'=>220,'݃'=>230,'݄'=>220,'݅'=>230,'݆'=>220,'݇'=>230,'݈'=>220,'݉'=>230,'݊'=>230,'߫'=>230,'߬'=>230,'߭'=>230,'߮'=>230,'߯'=>230,'߰'=>230,'߱'=>230,'߲'=>220,'߳'=>230,'़'=>7,'्'=>9,'॑'=>230,'॒'=>220,'॓'=>230,'॔'=>230,'়'=>7,'্'=>9,'਼'=>7,'੍'=>9,'઼'=>7,'્'=>9,'଼'=>7,'୍'=>9,'்'=>9,'్'=>9,'ౕ'=>84,'ౖ'=>91,'಼'=>7,'್'=>9,'്'=>9,'්'=>9,'ุ'=>103,'ู'=>103,'ฺ'=>9,'่'=>107,'้'=>107,'๊'=>107,'๋'=>107,'ຸ'=>118,'ູ'=>118,'່'=>122,'້'=>122,'໊'=>122,'໋'=>122,'༘'=>220,'༙'=>220,'༵'=>220,'༷'=>220,'༹'=>216,'ཱ'=>129,'ི'=>130,'ུ'=>132,'ེ'=>130,'ཻ'=>130,'ོ'=>130,'ཽ'=>130,'ྀ'=>130,'ྂ'=>230,'ྃ'=>230,'྄'=>9,'྆'=>230,'྇'=>230,'࿆'=>220,'့'=>7,'္'=>9,'፟'=>230,'᜔'=>9,'᜴'=>9,'្'=>9,'៝'=>230,'ᢩ'=>228,'᤹'=>222,'᤺'=>230,'᤻'=>220,'ᨗ'=>230,'ᨘ'=>220,'᬴'=>7,'᭄'=>9,'᭫'=>230,'᭬'=>220,'᭭'=>230,'᭮'=>230,'᭯'=>230,'᭰'=>230,'᭱'=>230,'᭲'=>230,'᭳'=>230,'᷀'=>230,'᷁'=>230,'᷂'=>220,'᷃'=>230,'᷄'=>230,'᷅'=>230,'᷆'=>230,'᷇'=>230,'᷈'=>230,'᷉'=>230,'᷊'=>220,'᷾'=>230,'᷿'=>220,'⃐'=>230,'⃑'=>230,'⃒'=>1,'⃓'=>1,'⃔'=>230,'⃕'=>230,'⃖'=>230,'⃗'=>230,'⃘'=>1,'⃙'=>1,'⃚'=>1,'⃛'=>230,'⃜'=>230,'⃡'=>230,'⃥'=>1,'⃦'=>1,'⃧'=>230,'⃨'=>220,'⃩'=>230,'⃪'=>1,'⃫'=>1,'⃬'=>220,'⃭'=>220,'⃮'=>220,'⃯'=>220,'〪'=>218,'〫'=>228,'〬'=>232,'〭'=>222,'〮'=>224,'〯'=>224,'゙'=>8,'゚'=>8,'꠆'=>9,'ﬞ'=>26,'︠'=>230,'︡'=>230,'︢'=>230,'︣'=>230,'𐨍'=>220,'𐨏'=>230,'𐨸'=>230,'𐨹'=>1,'𐨺'=>220,'𐨿'=>9,'𝅥'=>216,'𝅦'=>216,'𝅧'=>1,'𝅨'=>1,'𝅩'=>1,'𝅭'=>226,'𝅮'=>216,'𝅯'=>216,'𝅰'=>216,'𝅱'=>216,'𝅲'=>216,'𝅻'=>220,'𝅼'=>220,'𝅽'=>220,'𝅾'=>220,'𝅿'=>220,'𝆀'=>220,'𝆁'=>220,'𝆂'=>220,'𝆅'=>230,'𝆆'=>230,'𝆇'=>230,'𝆈'=>230,'𝆉'=>230,'𝆊'=>220,'𝆋'=>220,'𝆪'=>230,'𝆫'=>230,'𝆬'=>230,'𝆭'=>230,'𝉂'=>230,'𝉃'=>230,'𝉄'=>230); \ No newline at end of file
+$GLOBALS['utf_combining_class']=array('̀'=>230,'́'=>230,'̂'=>230,'̃'=>230,'̄'=>230,'̅'=>230,'̆'=>230,'̇'=>230,'̈'=>230,'̉'=>230,'̊'=>230,'̋'=>230,'̌'=>230,'̍'=>230,'̎'=>230,'̏'=>230,'̐'=>230,'̑'=>230,'̒'=>230,'̓'=>230,'̔'=>230,'̕'=>232,'̖'=>220,'̗'=>220,'̘'=>220,'̙'=>220,'̚'=>232,'̛'=>216,'̜'=>220,'̝'=>220,'̞'=>220,'̟'=>220,'̠'=>220,'̡'=>202,'̢'=>202,'̣'=>220,'̤'=>220,'̥'=>220,'̦'=>220,'̧'=>202,'̨'=>202,'̩'=>220,'̪'=>220,'̫'=>220,'̬'=>220,'̭'=>220,'̮'=>220,'̯'=>220,'̰'=>220,'̱'=>220,'̲'=>220,'̳'=>220,'̴'=>1,'̵'=>1,'̶'=>1,'̷'=>1,'̸'=>1,'̹'=>220,'̺'=>220,'̻'=>220,'̼'=>220,'̽'=>230,'̾'=>230,'̿'=>230,'̀'=>230,'́'=>230,'͂'=>230,'̓'=>230,'̈́'=>230,'ͅ'=>240,'͆'=>230,'͇'=>220,'͈'=>220,'͉'=>220,'͊'=>230,'͋'=>230,'͌'=>230,'͍'=>220,'͎'=>220,'͐'=>230,'͑'=>230,'͒'=>230,'͓'=>220,'͔'=>220,'͕'=>220,'͖'=>220,'͗'=>230,'͘'=>232,'͙'=>220,'͚'=>220,'͛'=>230,'͜'=>233,'͝'=>234,'͞'=>234,'͟'=>233,'͠'=>234,'͡'=>234,'͢'=>233,'ͣ'=>230,'ͤ'=>230,'ͥ'=>230,'ͦ'=>230,'ͧ'=>230,'ͨ'=>230,'ͩ'=>230,'ͪ'=>230,'ͫ'=>230,'ͬ'=>230,'ͭ'=>230,'ͮ'=>230,'ͯ'=>230,'҃'=>230,'҄'=>230,'҅'=>230,'҆'=>230,'֑'=>220,'֒'=>230,'֓'=>230,'֔'=>230,'֕'=>230,'֖'=>220,'֗'=>230,'֘'=>230,'֙'=>230,'֚'=>222,'֛'=>220,'֜'=>230,'֝'=>230,'֞'=>230,'֟'=>230,'֠'=>230,'֡'=>230,'֢'=>220,'֣'=>220,'֤'=>220,'֥'=>220,'֦'=>220,'֧'=>220,'֨'=>230,'֩'=>230,'֪'=>220,'֫'=>230,'֬'=>230,'֭'=>222,'֮'=>228,'֯'=>230,'ְ'=>10,'ֱ'=>11,'ֲ'=>12,'ֳ'=>13,'ִ'=>14,'ֵ'=>15,'ֶ'=>16,'ַ'=>17,'ָ'=>18,'ֹ'=>19,'ֺ'=>19,'ֻ'=>20,'ּ'=>21,'ֽ'=>22,'ֿ'=>23,'ׁ'=>24,'ׂ'=>25,'ׄ'=>230,'ׅ'=>220,'ׇ'=>18,'ؐ'=>230,'ؑ'=>230,'ؒ'=>230,'ؓ'=>230,'ؔ'=>230,'ؕ'=>230,'ً'=>27,'ٌ'=>28,'ٍ'=>29,'َ'=>30,'ُ'=>31,'ِ'=>32,'ّ'=>33,'ْ'=>34,'ٓ'=>230,'ٔ'=>230,'ٕ'=>220,'ٖ'=>220,'ٗ'=>230,'٘'=>230,'ٙ'=>230,'ٚ'=>230,'ٛ'=>230,'ٜ'=>220,'ٝ'=>230,'ٞ'=>230,'ٰ'=>35,'ۖ'=>230,'ۗ'=>230,'ۘ'=>230,'ۙ'=>230,'ۚ'=>230,'ۛ'=>230,'ۜ'=>230,'۟'=>230,'۠'=>230,'ۡ'=>230,'ۢ'=>230,'ۣ'=>220,'ۤ'=>230,'ۧ'=>230,'ۨ'=>230,'۪'=>220,'۫'=>230,'۬'=>230,'ۭ'=>220,'ܑ'=>36,'ܰ'=>230,'ܱ'=>220,'ܲ'=>230,'ܳ'=>230,'ܴ'=>220,'ܵ'=>230,'ܶ'=>230,'ܷ'=>220,'ܸ'=>220,'ܹ'=>220,'ܺ'=>230,'ܻ'=>220,'ܼ'=>220,'ܽ'=>230,'ܾ'=>220,'ܿ'=>230,'݀'=>230,'݁'=>230,'݂'=>220,'݃'=>230,'݄'=>220,'݅'=>230,'݆'=>220,'݇'=>230,'݈'=>220,'݉'=>230,'݊'=>230,'߫'=>230,'߬'=>230,'߭'=>230,'߮'=>230,'߯'=>230,'߰'=>230,'߱'=>230,'߲'=>220,'߳'=>230,'़'=>7,'्'=>9,'॑'=>230,'॒'=>220,'॓'=>230,'॔'=>230,'়'=>7,'্'=>9,'਼'=>7,'੍'=>9,'઼'=>7,'્'=>9,'଼'=>7,'୍'=>9,'்'=>9,'్'=>9,'ౕ'=>84,'ౖ'=>91,'಼'=>7,'್'=>9,'്'=>9,'්'=>9,'ุ'=>103,'ู'=>103,'ฺ'=>9,'่'=>107,'้'=>107,'๊'=>107,'๋'=>107,'ຸ'=>118,'ູ'=>118,'່'=>122,'້'=>122,'໊'=>122,'໋'=>122,'༘'=>220,'༙'=>220,'༵'=>220,'༷'=>220,'༹'=>216,'ཱ'=>129,'ི'=>130,'ུ'=>132,'ེ'=>130,'ཻ'=>130,'ོ'=>130,'ཽ'=>130,'ྀ'=>130,'ྂ'=>230,'ྃ'=>230,'྄'=>9,'྆'=>230,'྇'=>230,'࿆'=>220,'့'=>7,'္'=>9,'፟'=>230,'᜔'=>9,'᜴'=>9,'្'=>9,'៝'=>230,'ᢩ'=>228,'᤹'=>222,'᤺'=>230,'᤻'=>220,'ᨗ'=>230,'ᨘ'=>220,'᬴'=>7,'᭄'=>9,'᭫'=>230,'᭬'=>220,'᭭'=>230,'᭮'=>230,'᭯'=>230,'᭰'=>230,'᭱'=>230,'᭲'=>230,'᭳'=>230,'᷀'=>230,'᷁'=>230,'᷂'=>220,'᷃'=>230,'᷄'=>230,'᷅'=>230,'᷆'=>230,'᷇'=>230,'᷈'=>230,'᷉'=>230,'᷊'=>220,'᷾'=>230,'᷿'=>220,'⃐'=>230,'⃑'=>230,'⃒'=>1,'⃓'=>1,'⃔'=>230,'⃕'=>230,'⃖'=>230,'⃗'=>230,'⃘'=>1,'⃙'=>1,'⃚'=>1,'⃛'=>230,'⃜'=>230,'⃡'=>230,'⃥'=>1,'⃦'=>1,'⃧'=>230,'⃨'=>220,'⃩'=>230,'⃪'=>1,'⃫'=>1,'⃬'=>220,'⃭'=>220,'⃮'=>220,'⃯'=>220,'〪'=>218,'〫'=>228,'〬'=>232,'〭'=>222,'〮'=>224,'〯'=>224,'゙'=>8,'゚'=>8,'꠆'=>9,'ﬞ'=>26,'︠'=>230,'︡'=>230,'︢'=>230,'︣'=>230,'𐨍'=>220,'𐨏'=>230,'𐨸'=>230,'𐨹'=>1,'𐨺'=>220,'𐨿'=>9,'𝅥'=>216,'𝅦'=>216,'𝅧'=>1,'𝅨'=>1,'𝅩'=>1,'𝅭'=>226,'𝅮'=>216,'𝅯'=>216,'𝅰'=>216,'𝅱'=>216,'𝅲'=>216,'𝅻'=>220,'𝅼'=>220,'𝅽'=>220,'𝅾'=>220,'𝅿'=>220,'𝆀'=>220,'𝆁'=>220,'𝆂'=>220,'𝆅'=>230,'𝆆'=>230,'𝆇'=>230,'𝆈'=>230,'𝆉'=>230,'𝆊'=>220,'𝆋'=>220,'𝆪'=>230,'𝆫'=>230,'𝆬'=>230,'𝆭'=>230,'𝉂'=>230,'𝉃'=>230,'𝉄'=>230);
diff --git a/phpBB/includes/utf/utf_normalizer.php b/phpBB/includes/utf/utf_normalizer.php
index a77952499a..a208552d53 100644
--- a/phpBB/includes/utf/utf_normalizer.php
+++ b/phpBB/includes/utf/utf_normalizer.php
@@ -2,9 +2,8 @@
/**
*
* @package utf
-* @version $Id$
* @copyright (c) 2005 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -77,7 +76,7 @@ class utf_normalizer
* @param string &$str The dirty string
* @return string The same string, all shiny and cleaned-up
*/
- function cleanup(&$str)
+ static function cleanup(&$str)
{
// The string below is the list of all autorized characters, sorted by frequency in latin text
$pos = strspn($str, "\x20\x65\x69\x61\x73\x6E\x74\x72\x6F\x6C\x75\x64\x5D\x5B\x63\x6D\x70\x27\x0A\x67\x7C\x68\x76\x2E\x66\x62\x2C\x3A\x3D\x2D\x71\x31\x30\x43\x32\x2A\x79\x78\x29\x28\x4C\x39\x41\x53\x2F\x50\x22\x45\x6A\x4D\x49\x6B\x33\x3E\x35\x54\x3C\x44\x34\x7D\x42\x7B\x38\x46\x77\x52\x36\x37\x55\x47\x4E\x3B\x4A\x7A\x56\x23\x48\x4F\x57\x5F\x26\x21\x4B\x3F\x58\x51\x25\x59\x5C\x09\x5A\x2B\x7E\x5E\x24\x40\x60\x7F\x0D");
@@ -119,7 +118,7 @@ class utf_normalizer
* @param string &$str Unchecked UTF string
* @return string The string, validated and in normal form
*/
- function nfc(&$str)
+ static function nfc(&$str)
{
$pos = strspn($str, UTF8_ASCII_RANGE);
$len = strlen($str);
@@ -151,7 +150,7 @@ class utf_normalizer
* @param string &$str Unchecked UTF string
* @return string The string, validated and in normal form
*/
- function nfkc(&$str)
+ static function nfkc(&$str)
{
$pos = strspn($str, UTF8_ASCII_RANGE);
$len = strlen($str);
@@ -183,7 +182,7 @@ class utf_normalizer
* @param string &$str Unchecked UTF string
* @return string The string, validated and in normal form
*/
- function nfd(&$str)
+ static function nfd(&$str)
{
$pos = strspn($str, UTF8_ASCII_RANGE);
$len = strlen($str);
@@ -209,7 +208,7 @@ class utf_normalizer
* @param string &$str Unchecked UTF string
* @return string The string, validated and in normal form
*/
- function nfkd(&$str)
+ static function nfkd(&$str)
{
$pos = strspn($str, UTF8_ASCII_RANGE);
$len = strlen($str);
@@ -242,7 +241,7 @@ class utf_normalizer
*
* @access private
*/
- function recompose($str, $pos, $len, &$qc, &$decomp_map)
+ static function recompose($str, $pos, $len, &$qc, &$decomp_map)
{
global $utf_combining_class, $utf_canonical_comp, $utf_jamo_type, $utf_jamo_index;
@@ -944,7 +943,7 @@ class utf_normalizer
*
* @access private
*/
- function decompose($str, $pos, $len, &$decomp_map)
+ static function decompose($str, $pos, $len, &$decomp_map)
{
global $utf_combining_class;
@@ -1512,5 +1511,3 @@ class utf_normalizer
return $str;
}
}
-
-?> \ No newline at end of file
diff --git a/phpBB/includes/utf/utf_tools.php b/phpBB/includes/utf/utf_tools.php
index 6f3ac93305..c402e15032 100644
--- a/phpBB/includes/utf/utf_tools.php
+++ b/phpBB/includes/utf/utf_tools.php
@@ -2,9 +2,8 @@
/**
*
* @package utf
-* @version $Id$
* @copyright (c) 2006 phpBB Group
-* @license http://opensource.org/licenses/gpl-license.php GNU Public License
+* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
@@ -109,70 +108,26 @@ if (extension_loaded('mbstring'))
/**
* UTF-8 aware alternative to strrpos
* Find position of last occurrence of a char in a string
- *
- * Notes:
- * - offset for mb_strrpos was added in 5.2.0, we emulate if it is lower
*/
- if (version_compare(PHP_VERSION, '5.2.0', '>='))
+ /**
+ * UTF-8 aware alternative to strrpos
+ * @ignore
+ */
+ function utf8_strrpos($str, $needle, $offset = null)
{
- /**
- * UTF-8 aware alternative to strrpos
- * @ignore
- */
- function utf8_strrpos($str, $needle, $offset = null)
+ // Emulate behaviour of strrpos rather than raising warning
+ if (empty($str))
{
- // Emulate behaviour of strrpos rather than raising warning
- if (empty($str))
- {
- return false;
- }
+ return false;
+ }
- if (is_null($offset))
- {
- return mb_strrpos($str, $needle);
- }
- else
- {
- return mb_strrpos($str, $needle, $offset);
- }
+ if (is_null($offset))
+ {
+ return mb_strrpos($str, $needle);
}
- }
- else
- {
- /**
- * UTF-8 aware alternative to strrpos
- * @ignore
- */
- function utf8_strrpos($str, $needle, $offset = null)
+ else
{
- // offset for mb_strrpos was added in 5.2.0
- if (is_null($offset))
- {
- // Emulate behaviour of strrpos rather than raising warning
- if (empty($str))
- {
- return false;
- }
-
- return mb_strrpos($str, $needle);
- }
- else
- {
- if (!is_int($offset))
- {
- trigger_error('utf8_strrpos expects parameter 3 to be long', E_USER_ERROR);
- return false;
- }
-
- $str = mb_substr($str, $offset);
-
- if (false !== ($pos = mb_strrpos($str, $needle)))
- {
- return $pos + $offset;
- }
-
- return false;
- }
+ return mb_strrpos($str, $needle, $offset);
}
}
@@ -1756,49 +1711,106 @@ function utf8_case_fold_nfc($text, $option = 'full')
return $text;
}
-/**
-* A wrapper function for the normalizer which takes care of including the class if required and modifies the passed strings
-* to be in NFC (Normalization Form Composition).
-*
-* @param mixed $strings a string or an array of strings to normalize
-* @return mixed the normalized content, preserving array keys if array given.
-*/
-function utf8_normalize_nfc($strings)
+if (extension_loaded('intl'))
{
- if (empty($strings))
+ /**
+ * wrapper around PHP's native normalizer from intl
+ * previously a PECL extension, included in the core since PHP 5.3.0
+ * http://php.net/manual/en/normalizer.normalize.php
+ *
+ * @param mixed $strings a string or an array of strings to normalize
+ * @return mixed the normalized content, preserving array keys if array given.
+ */
+ function utf8_normalize_nfc($strings)
{
- return $strings;
- }
+ if (empty($strings))
+ {
+ return $strings;
+ }
- if (!class_exists('utf_normalizer'))
- {
- global $phpbb_root_path, $phpEx;
- include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
- }
+ if (!is_array($strings))
+ {
+ if (Normalizer::isNormalized($strings))
+ {
+ return $strings;
+ }
+ return (string) Normalizer::normalize($strings);
+ }
+ else
+ {
+ foreach ($strings as $key => $string)
+ {
+ if (is_array($string))
+ {
+ foreach ($string as $_key => $_string)
+ {
+ if (Normalizer::isNormalized($strings[$key][$_key]))
+ {
+ continue;
+ }
+ $strings[$key][$_key] = (string) Normalizer::normalize($strings[$key][$_key]);
+ }
+ }
+ else
+ {
+ if (Normalizer::isNormalized($strings[$key]))
+ {
+ continue;
+ }
+ $strings[$key] = (string) Normalizer::normalize($strings[$key]);
+ }
+ }
+ }
- if (!is_array($strings))
- {
- utf_normalizer::nfc($strings);
+ return $strings;
}
- else if (is_array($strings))
+}
+else
+{
+ /**
+ * A wrapper function for the normalizer which takes care of including the class if
+ * required and modifies the passed strings to be in NFC (Normalization Form Composition).
+ *
+ * @param mixed $strings a string or an array of strings to normalize
+ * @return mixed the normalized content, preserving array keys if array given.
+ */
+ function utf8_normalize_nfc($strings)
{
- foreach ($strings as $key => $string)
+ if (empty($strings))
+ {
+ return $strings;
+ }
+
+ if (!class_exists('utf_normalizer'))
+ {
+ global $phpbb_root_path, $phpEx;
+ include($phpbb_root_path . 'includes/utf/utf_normalizer.' . $phpEx);
+ }
+
+ if (!is_array($strings))
+ {
+ utf_normalizer::nfc($strings);
+ }
+ else if (is_array($strings))
{
- if (is_array($string))
+ foreach ($strings as $key => $string)
{
- foreach ($string as $_key => $_string)
+ if (is_array($string))
{
- utf_normalizer::nfc($strings[$key][$_key]);
+ foreach ($string as $_key => $_string)
+ {
+ utf_normalizer::nfc($strings[$key][$_key]);
+ }
+ }
+ else
+ {
+ utf_normalizer::nfc($strings[$key]);
}
- }
- else
- {
- utf_normalizer::nfc($strings[$key]);
}
}
- }
- return $strings;
+ return $strings;
+ }
}
/**
@@ -1921,7 +1933,7 @@ function utf8_wordwrap($string, $width = 75, $break = "\n", $cut = false)
* UTF8-safe basename() function
*
* basename() has some limitations and is dependent on the locale setting
-* according to the PHP manual. Therefore we provide our own locale independant
+* according to the PHP manual. Therefore we provide our own locale independent
* basename function.
*
* @param string $filename The filename basename() should be applied to
@@ -1991,5 +2003,3 @@ function utf8_str_replace($search, $replace, $subject)
return $subject;
}
-
-?> \ No newline at end of file